From ca61b78cd5b849c397dea35877085733c230f03a Mon Sep 17 00:00:00 2001 From: Sawyer Date: Thu, 17 Sep 2026 16:46:52 -0700 Subject: [PATCH 1/2] chore(packages): drop ticket references from comments --- packages/agent-directory/README.md | 2 +- .../src/agent-definition-draft-routes.ts | 4 +- .../src/agent-definition-drafting.test.ts | 4 +- .../src/agent-definition-drafting.ts | 4 +- .../src/agent-workflow.test.ts | 8 +- .../agent-directory/src/agent-workflow.ts | 8 +- packages/agent-directory/src/asset-write.ts | 2 +- .../agent-directory/src/capability-add.ts | 4 +- .../src/capability-inventory.ts | 2 +- packages/agent-directory/src/client.ts | 4 +- .../agent-directory/src/display-name.test.ts | 2 +- packages/agent-directory/src/display-name.ts | 4 +- packages/agent-directory/src/id-leak-guard.ts | 10 +-- packages/agent-directory/src/inventory.ts | 2 +- .../src/native-deploy-cutover.test.ts | 2 +- .../agent-directory/src/one-shot-prompt.ts | 3 +- packages/agent-directory/src/routes.ts | 4 +- .../src/stale-task-agent-naming.ts | 2 +- .../src/tool-package-version.test.ts | 2 +- .../src/tool-package-version.ts | 4 +- .../src/visible-definitions.ts | 4 +- .../src/workflow-capability-routes.ts | 10 +-- .../src/workflow-create-routes.ts | 4 +- .../agent-definition-draft-routes.test.ts | 2 +- .../test/routes.integration.test.ts | 15 ++-- packages/agent-directory/test/routes.test.ts | 8 +- .../test/tool-package-version.drizzle.test.ts | 2 +- .../test/visible-definitions.drizzle.test.ts | 4 +- .../test/workflow-capability-routes.test.ts | 3 +- .../test/workflow-create-routes.test.ts | 2 +- .../test/workflow-skill-pin-routes.test.ts | 3 +- packages/agent-events/src/agent-events.ts | 2 +- packages/approvals/src/allowance.ts | 2 +- packages/approvals/src/headline.ts | 4 +- packages/artifact-ui/README.md | 2 +- .../artifact-ui/src/artifact-renderer.tsx | 4 +- .../artifact-ui/src/artifact-text-editor.tsx | 9 +-- packages/artifact-ui/src/kind-filter.ts | 7 +- packages/artifact-ui/src/save-state.ts | 3 +- packages/bench-ui/src/styles.css | 2 +- packages/chat-ui/src/agent-display-names.ts | 2 +- packages/chat-ui/src/agent-part-adapter.ts | 2 +- packages/chat-ui/src/api.ts | 32 +++----- packages/chat-ui/src/artifact-chip.tsx | 4 +- packages/chat-ui/src/avatar.tsx | 2 +- .../src/blocks/connect-service-actions.ts | 4 +- .../src/blocks/connect-service-block.tsx | 2 +- packages/chat-ui/src/chat-workspace.test.ts | 4 +- packages/chat-ui/src/chat-workspace.tsx | 47 ++++++----- packages/chat-ui/src/clock.ts | 2 +- packages/chat-ui/src/composer.test.tsx | 2 +- packages/chat-ui/src/composer.tsx | 14 ++-- .../chat-ui/src/default-agent-workbench.ts | 2 +- packages/chat-ui/src/direct-workbench.ts | 2 +- packages/chat-ui/src/inference-failure.ts | 2 +- packages/chat-ui/src/loading-state.tsx | 6 +- packages/chat-ui/src/mailbox-timeline.ts | 6 +- packages/chat-ui/src/markdown.test.tsx | 2 +- packages/chat-ui/src/mentions.ts | 2 +- .../chat-ui/src/no-usable-model-banner.tsx | 2 +- packages/chat-ui/src/pr-thread-view.tsx | 5 +- packages/chat-ui/src/resume-failed-banner.tsx | 2 +- packages/chat-ui/src/shared-workbenches.ts | 2 +- packages/chat-ui/src/streaming-reply.test.ts | 16 ++-- packages/chat-ui/src/streaming-reply.ts | 20 ++--- packages/chat-ui/src/strings.ts | 12 +-- packages/chat-ui/src/styles.css | 80 +++++++++---------- packages/chat-ui/src/thread-feed.test.ts | 4 +- packages/chat-ui/src/thread-feed.ts | 2 +- packages/chat-ui/src/timeline.test.ts | 6 +- packages/chat-ui/src/timeline.tsx | 48 +++++------ packages/chat-ui/src/turn-activity.test.ts | 2 +- packages/chat-ui/src/typing-indicator.tsx | 2 +- packages/chat-ui/src/use-optimistic-sends.ts | 14 ++-- packages/chat-ui/src/use-thread-navigation.ts | 2 +- packages/chat-ui/src/use-workbench-feed.ts | 10 +-- packages/chat-ui/src/use-workbench-stream.ts | 2 +- packages/chat-ui/src/wire/agent-address.ts | 7 +- packages/chat-ui/src/wire/blocks.ts | 9 +-- .../src/wire/consumer-inference-text.ts | 11 +-- packages/chat-ui/src/wire/display-name.ts | 9 +-- packages/chat-ui/src/wire/id-leak-guard.ts | 17 ++-- packages/chat-ui/src/wire/mentions.ts | 7 +- packages/chat-ui/src/wire/participants.ts | 7 +- packages/chat-ui/src/wire/parts.ts | 13 ++- packages/chat-ui/src/wire/stream-events.ts | 7 +- .../chat-ui/src/wire/tools-unsupported.ts | 7 +- packages/chat-ui/src/workbench-presence.ts | 2 +- .../workbench-settings/agents-section.test.ts | 2 +- .../src/workbench-settings/agents-section.tsx | 8 +- .../workbench-settings/members-section.tsx | 2 +- .../chat-ui/src/workbench-settings/model.ts | 2 +- .../src/workbench-settings/surface.tsx | 4 +- packages/chat-ui/test/agents-section.test.tsx | 6 +- packages/chat-ui/test/artifact-chip.test.tsx | 2 +- .../chat-ui/test/chat-bubble-flat.test.ts | 2 +- packages/chat-ui/test/chat-workspace.test.tsx | 2 +- packages/chat-ui/test/components.test.tsx | 12 ++- .../composer-synchronous-double-send.test.tsx | 4 +- packages/chat-ui/test/composer.test.tsx | 16 ++-- .../test/connect-service-block.test.tsx | 2 +- .../test/connect-service-flow.test.tsx | 2 +- .../chat-ui/test/failed-turn-strip.test.tsx | 5 +- packages/chat-ui/test/fake-clock.ts | 2 +- .../test/inference-preamble-drift.test.ts | 2 +- packages/chat-ui/test/loading-state.test.tsx | 4 +- .../chat-ui/test/members-section.test.tsx | 2 +- packages/chat-ui/test/mentions.test.ts | 2 +- ...essage-grouping-and-failed-polish.test.tsx | 17 ++-- .../test/no-usable-model-banner.test.tsx | 2 +- .../test/own-message-alignment.test.tsx | 4 +- .../test/pending-send-lifecycle.test.tsx | 4 +- packages/chat-ui/test/pr-thread-view.test.tsx | 3 +- packages/chat-ui/test/presence-stack.test.tsx | 6 +- .../chat-ui/test/refresh-and-send.test.ts | 18 ++--- .../test/resume-failed-banner.test.tsx | 4 +- ...ingle-message-list-reconciliation.test.tsx | 2 +- packages/chat-ui/test/stream-apply.test.ts | 10 +-- .../chat-ui/test/system-join-edge.test.tsx | 6 +- .../chat-ui/test/system-row-chrome.test.tsx | 6 +- .../chat-ui/test/team-avatar-stack.test.tsx | 6 +- .../test/timeline-jump-to-latest.test.tsx | 4 +- .../chat-ui/test/timeline-scroll-pin.test.tsx | 4 +- .../chat-ui/test/use-streaming-reply.test.tsx | 14 ++-- .../chat-ui/test/use-turn-activity.test.tsx | 2 +- ...se-workbench-feed-refresh-scoping.test.tsx | 8 +- .../test/use-workbench-stream.test.tsx | 6 +- .../test/workbench-loading-tip.test.tsx | 2 +- .../chat-ui/test/workbench-presence.test.ts | 2 +- .../test/workbench-settings-retry.test.tsx | 2 +- packages/client-log/src/index.ts | 4 +- packages/code-review/src/review-run.ts | 2 +- packages/code-review/src/reviewers.ts | 2 +- packages/collections/README.md | 8 +- packages/collections/src/expiring-map.ts | 2 +- packages/connections/README.md | 2 +- packages/connections/src/catalog-seed-data.ts | 2 +- .../connect-github-credential-link.test.ts | 8 +- .../connections/src/connect-github-routes.ts | 8 +- .../src/connect-github-setup.race.test.ts | 12 +-- .../src/connect-github-setup.test.ts | 2 +- .../connections/src/connect-github-setup.ts | 16 ++-- packages/connections/src/connected-hook.ts | 2 +- .../src/connections-shrink.test.ts | 4 +- packages/connections/src/credential-error.ts | 2 +- packages/connections/src/credential-test.ts | 8 +- packages/connections/src/descriptor.ts | 8 +- .../connections/src/github-connect.test.ts | 2 +- .../connections/src/gmail-connect.test.ts | 2 +- .../src/huggingface-connect.test.ts | 2 +- .../connections/src/huggingface-connect.ts | 2 +- .../connections/src/mcp-oauth-routes.test.ts | 12 +-- packages/connections/src/mcp-oauth-routes.ts | 8 +- packages/connections/src/mcp-oauth.ts | 4 +- packages/connections/src/mcp-presets.ts | 6 +- packages/connections/src/mcp-probe.ts | 2 +- .../connections/src/mcp-server-routes.test.ts | 2 +- packages/connections/src/mcp-server-routes.ts | 10 +-- packages/connections/src/mcp-server-store.ts | 4 +- .../connections/src/model-capability.test.ts | 14 ++-- packages/connections/src/model-capability.ts | 19 +++-- .../src/oauth-loopback-routes.test.ts | 2 +- .../connections/src/oauth-loopback-routes.ts | 9 +-- packages/connections/src/oauth-routes.ts | 19 ++--- .../src/oauth-tenant-connect.test.ts | 2 +- .../connections/src/oauth-tenant-connect.ts | 6 +- .../src/openrouter-connect.test.ts | 2 +- .../src/persist-credential.test.ts | 4 +- .../connections/src/persist-credential.ts | 14 ++-- packages/connections/src/pkce.ts | 2 +- packages/connections/src/plugins.test.ts | 2 +- packages/connections/src/plugins.ts | 4 +- packages/connections/src/probes.test.ts | 4 +- .../connections/src/provider-health.test.ts | 2 +- packages/connections/src/provider-health.ts | 4 +- packages/connections/src/registry.test.ts | 4 +- packages/connections/src/registry.ts | 15 ++-- packages/connections/src/routes.test.ts | 10 +-- packages/connections/src/routes.ts | 18 ++--- packages/connections/src/seed-catalog.test.ts | 2 +- packages/connections/src/template-settings.ts | 2 +- packages/connections/src/token-session.ts | 7 +- .../src/workflow-connection-routes.ts | 5 +- .../connections/src/workflow-push.test.ts | 6 +- packages/connections/src/workflow-push.ts | 2 +- .../connections/test/credential-test.test.ts | 10 +-- .../test/github-oauth-connect.test.ts | 4 +- .../test/mcp-server-store.drizzle.test.ts | 2 +- packages/credential-providers/README.md | 2 +- packages/error-sink/README.md | 2 +- packages/error-sink/src/context.ts | 2 +- packages/error-sink/src/error-envelope.ts | 2 +- packages/error-sink/src/index.ts | 2 +- packages/error-sink/src/redact.ts | 2 +- packages/error-sink/src/ref-id.ts | 2 +- packages/evals/README.md | 45 ++++------- packages/evals/src/cases/ai-daily-research.ts | 2 +- .../evals/src/cases/docs-on-sdk-change.ts | 2 +- packages/evals/src/cases/exa-topic-digest.ts | 2 +- packages/evals/src/fakes/github-rest-fake.ts | 2 +- packages/evals/src/fakes/mcp-fake-server.ts | 2 +- packages/evals/src/fakes/recording.ts | 2 +- packages/evals/src/scorers/scorers.ts | 27 +++---- packages/evals/src/scorers/tool-names.test.ts | 2 +- packages/evals/src/scorers/tool-names.ts | 4 +- .../evals/src/targets/git-workflow-push.ts | 4 +- packages/evals/src/types.ts | 2 +- .../src/effective-list.test.ts | 14 ++-- .../inference-settings/src/effective-list.ts | 8 +- .../inference-settings/src/usable-model.ts | 2 +- packages/ollama-adapter/src/adapter.ts | 2 +- .../src/inline-tool-json.test.ts | 2 +- .../ollama-adapter/src/inline-tool-json.ts | 2 +- packages/ollama-adapter/src/think-tags.ts | 2 +- packages/plugins-ui/README.md | 2 +- packages/plugins-ui/src/mcp-preset-cards.tsx | 2 +- packages/plugins-ui/src/mcp-servers-api.ts | 2 +- .../plugins-ui/src/mcp-servers-section.tsx | 2 +- packages/plugins-ui/src/plugin-card.tsx | 2 +- .../plugins-ui/src/plugin-connect-panel.tsx | 12 +-- packages/plugins-ui/src/plugins-gallery.tsx | 4 +- packages/plugins-ui/src/skill-card.tsx | 13 ++- .../plugins-ui/test/mcp-preset-cards.test.tsx | 8 +- .../test/mcp-servers-section.test.tsx | 4 +- .../test/plugin-connect-panel.test.tsx | 8 +- .../plugins-ui/test/plugins-gallery.test.tsx | 2 +- packages/settings-ui/src/access.ts | 4 +- packages/settings-ui/src/connections-api.ts | 6 +- .../settings-ui/src/connections-pinned-by.ts | 4 +- .../settings-ui/src/connections-section.tsx | 22 +++-- .../settings-ui/src/granola-webhook-card.tsx | 2 +- packages/settings-ui/src/identity.ts | 2 +- packages/settings-ui/src/index.ts | 2 +- .../settings-ui/src/notifications-section.tsx | 2 +- packages/settings-ui/src/roles-section.tsx | 2 +- packages/settings-ui/src/section-registry.tsx | 34 ++++---- packages/settings-ui/src/styles.css | 2 +- .../settings-ui/src/webhook-secret-panel.tsx | 2 +- packages/settings-ui/test/access.test.ts | 2 +- .../settings-ui/test/account-section.test.tsx | 4 +- .../settings-ui/test/connections-api.test.ts | 4 +- .../connections-default-model-pick.test.tsx | 4 +- .../test/connections-disconnect-flow.test.tsx | 6 +- ...connections-refresh-on-visibility.test.tsx | 2 +- .../test/connector-credential-dialog.test.tsx | 4 +- .../settings-ui/test/grants-section.test.tsx | 2 +- packages/settings-ui/test/identity.test.ts | 4 +- .../settings-ui/test/oauth-start-href.test.ts | 2 +- .../settings-ui/test/people-section.test.tsx | 6 +- .../settings-ui/test/query-retry.test.tsx | 2 +- .../test/resource-vocabulary.test.ts | 2 +- .../settings-ui/test/roles-section.test.tsx | 4 +- .../test/section-registry.test.tsx | 2 +- packages/tool-registry-publish/README.md | 2 +- .../src/freshness-check.test.ts | 2 +- .../tool-registry-publish/src/pack.test.ts | 2 +- packages/tool-registry-publish/src/publish.ts | 2 +- .../tool-registry-publish/src/registry.ts | 4 +- packages/webhook-triggers/src/launch.ts | 4 +- .../webhook-triggers/src/repo-review-lease.ts | 6 +- packages/webhook-triggers/src/schema.ts | 8 +- packages/webhook-triggers/src/store.ts | 2 +- packages/webhook-triggers/test/launch.test.ts | 4 +- .../test/repo-review-lease.drizzle.test.ts | 2 +- .../test/store.drizzle.test.ts | 2 +- packages/workflows/src/authoring/registry.ts | 6 +- .../src/authoring/workflow-routes.ts | 4 +- packages/workflows/src/catalog.test.ts | 2 +- packages/workflows/src/catalog.ts | 2 +- .../workflows/src/definition-projection.ts | 16 ++-- .../workflows/src/deliver-when-routable.ts | 4 +- .../workflows/src/detail/definition-detail.ts | 16 ++-- packages/workflows/src/detail/index.ts | 2 +- packages/workflows/src/index.ts | 6 +- .../workflows/src/launch/agent-session.ts | 51 +++++------- .../src/schedule/run-outcome.test.ts | 4 +- .../workflows/src/schedule/run-outcome.ts | 8 +- packages/workflows/test/agent-session.test.ts | 2 +- 278 files changed, 784 insertions(+), 910 deletions(-) diff --git a/packages/agent-directory/README.md b/packages/agent-directory/README.md index aa5b383b33..eb0f69e045 100644 --- a/packages/agent-directory/README.md +++ b/packages/agent-directory/README.md @@ -30,7 +30,7 @@ listing, not five. This matters because a `*` (or any non-exact) pin would let a later tarball landing in the registry silently change what an already-deployed specialist -runs, with no record of the change (CL-7389). Resolving a version only +runs, with no record of the change. Resolving a version only happens when a pin is newly added or a definition is newly created with named pins: diff --git a/packages/agent-directory/src/agent-definition-draft-routes.ts b/packages/agent-directory/src/agent-definition-draft-routes.ts index 4aca8767cb..ff5230dce0 100644 --- a/packages/agent-directory/src/agent-definition-draft-routes.ts +++ b/packages/agent-directory/src/agent-definition-draft-routes.ts @@ -1,5 +1,5 @@ // The HTTP surface for Myra-backed agent-definition drafting -// (CL-6074): tenant-scoped, `requireGrant`-gated, personal to the +//: tenant-scoped, `requireGrant`-gated, personal to the // requesting principal, request parsing via arktype at the boundary, // route registration only. Error copy at this boundary is plain // language for the person who typed the description; the technical @@ -38,7 +38,7 @@ const CreateAgentDefinitionDraftBody = type({ export type CreateAgentDefinitionDraftRoutesDeps = { requireGrant: RequireGrant; /** - * The agent-definition drafting port (CL-6074) — omitted entirely on + * The agent-definition drafting port — omitted entirely on * a host that hasn't wired Myra drafting up yet, in which case this * route 404s rather than pretending to draft and always failing. * The route never touches `./agent-definition-drafting.ts`'s diff --git a/packages/agent-directory/src/agent-definition-drafting.test.ts b/packages/agent-directory/src/agent-definition-drafting.test.ts index 462a55fa40..f23b82e2a9 100644 --- a/packages/agent-directory/src/agent-definition-drafting.test.ts +++ b/packages/agent-directory/src/agent-definition-drafting.test.ts @@ -332,7 +332,7 @@ describe("createMyraAgentDefinitionDrafting", () => { expect(sentPrompt).not.toContain("request_capability"); }); - // CL-5879: a specialist agent delegated to via @mention deep-dives in + // A specialist agent delegated to via @mention deep-dives in // a thread; the drafting brief must tell the drafted agent to close // that thread out with a summary back to whoever delegated it and to // the main conversation, so a handoff never dead-ends in the thread. @@ -358,7 +358,7 @@ describe("createMyraAgentDefinitionDrafting", () => { expect(sentPrompt).toContain("whoever delegated it and to the main"); }); - // CL-6350: every drafted agent's systemPrompt must carry an explicit + // Every drafted agent's systemPrompt must carry an explicit // output contract and name its own tools, matching the prompt // discipline Myra's own system prompt already follows. test("the drafting brief requires an explicit output contract and named tools in the drafted systemPrompt", async () => { diff --git a/packages/agent-directory/src/agent-definition-drafting.ts b/packages/agent-directory/src/agent-definition-drafting.ts index 0944940f11..cc8952d099 100644 --- a/packages/agent-directory/src/agent-definition-drafting.ts +++ b/packages/agent-directory/src/agent-definition-drafting.ts @@ -1,4 +1,4 @@ -// Myra-backed agent-definition drafting (CL-6074): turns a name and a +// Myra-backed agent-definition drafting: turns a name and a // plain-language "what should this agent do?" description into a // machine-checked draft via one one-shot Myra call — the third consumer // of the inventory-assembly + strict-reply-schema + @@ -32,7 +32,7 @@ const MAX_REPLY_EXCERPT = 400; const MAX_SYSTEM_PROMPT_LENGTH = 8000; const MAX_DESCRIPTION_LENGTH = 500; -/** `@corbits/capability-tools`' package name (CL-6084/CL-6086) — the +/** `@corbits/capability-tools`' package name — the * `request_capability` bundle every drafted agent gets pinned by * default (see `validateAgentDefinitionDraftReplyAgainstInventory`'s * default-pin step below), the same way a definition that pins skills diff --git a/packages/agent-directory/src/agent-workflow.test.ts b/packages/agent-directory/src/agent-workflow.test.ts index d1fd4f2e96..8b1e6d73b4 100644 --- a/packages/agent-directory/src/agent-workflow.test.ts +++ b/packages/agent-directory/src/agent-workflow.test.ts @@ -1,4 +1,4 @@ -// Regression for CL-6334: `SKILLS_TOOL_PACKAGE_PIN` named +// `SKILLS_TOOL_PACKAGE_PIN` named // `@corbits/tools-skills`, but `tool-registry-publish`'s // `CORBITS_TOOL_PACKAGE_DIRS` never listed that package's directory, so // a definition pinning skills carried a pin the corbits-tools registry @@ -32,7 +32,7 @@ describe("SKILLS_TOOL_PACKAGE_PIN", () => { }); }); -// CL-7389: a runtime tool-package pin must resolve to a concrete, +// A runtime tool-package pin must resolve to a concrete, // published version — never the npm "any version" range `*` — so a // later tarball landing in the registry never silently changes what an // already-deployed specialist runs. @@ -85,7 +85,7 @@ describe("withAgentToolPackagePin", () => { }); }); -// CL-7592: pinned skill names read back out of the definition's own +// Pinned skill names read back out of the definition's own // serialized `workflow.json` (the `` stanza // `reindexPinnedSkills` writes) — the asset is the source of truth for // pins now that the Workbench-owned `definition_skills` store is gone. @@ -121,7 +121,7 @@ describe("readPinnedSkillNames", () => { }); }); -// CL-7389: a `create_agent`/`POST /agent-definitions` call pinning several +// A `create_agent`/`POST /agent-definitions` call pinning several // tool packages by name shares one registry resolver across all of them // (`createPinnedVersionResolver`), so it costs one ancestor walk and one // tarball listing, never one per pin. diff --git a/packages/agent-directory/src/agent-workflow.ts b/packages/agent-directory/src/agent-workflow.ts index 143b9aeda2..2ce5a59a2a 100644 --- a/packages/agent-directory/src/agent-workflow.ts +++ b/packages/agent-directory/src/agent-workflow.ts @@ -235,7 +235,7 @@ export function readAgentCapabilities(workflowJson: string): AgentDefinitionCapa * an operator hand-authoring a workflow source file is free to write * one; but every RUNTIME site this package writes a pin from * (`create_agent`'s tool-package pins, guided capability-add) must name - * a version the resolver actually offers today (CL-7389) — a `*` pin + * a version the resolver actually offers today — a `*` pin * means a later tarball landing in the registry silently changes what * an already-deployed specialist runs, with no record of the change. * `./tool-package-version.ts`'s `resolvePinnedVersion` is how a caller @@ -248,7 +248,7 @@ export const NonWildcardToolPackagePin = type({ semver.valid(pin.version) !== null ? true : ctx.mustBe( - 'a concrete published version, never "*", "latest", or a range/tag like "^1", "~1.2", ">=1.0.0", "1.x" — anything but an exact version would let a later tarball silently change what this pin resolves to (CL-7389)', + 'a concrete published version, never "*", "latest", or a range/tag like "^1", "~1.2", ">=1.0.0", "1.x" — anything but an exact version would let a later tarball silently change what this pin resolves to', ), ); export type NonWildcardToolPackagePin = typeof NonWildcardToolPackagePin.infer; @@ -354,7 +354,7 @@ export interface AgentDefinitionWorkflowInput { * Credential bindings the deployed definition carries at the workflow * level — the same `CredentialBinding[]` shape and the same * `defineWorkflow({ credentialBindings, ... })` field - * `workflows/granola-call` pins through (CL-6028's pattern). Additive: + * `workflows/granola-call` pins through (pattern). Additive: * undeclared or empty behaves exactly like a definition built before * this field existed. Required for a `toolPackagePins` entry whose * tool needs a live credential to do anything at runtime — a pin with @@ -548,7 +548,7 @@ export async function createAgentDefinitionCore( // One resolver shared across every named pin: it loads the tenant's // registry asset and tarball listing at most once, so a five-pin // create still costs one ancestor walk and one listing, not five - // (CL-7389). + //. const resolvePin = createPinnedVersionResolver( { db: deps.db, assetService: deps.assetService }, input.tenantId, diff --git a/packages/agent-directory/src/asset-write.ts b/packages/agent-directory/src/asset-write.ts index d2fafdea85..c273545cd8 100644 --- a/packages/agent-directory/src/asset-write.ts +++ b/packages/agent-directory/src/asset-write.ts @@ -1,6 +1,6 @@ // Same-asset definition edits are read-modify-write: two concurrent // routes that snapshot the same workflow.json and then each write their -// own field would last-write-wins clobber the other (CL-7216). This +// own field would last-write-wins clobber the other. This // module serializes those writers and retries the loser against the // latest snapshot. // diff --git a/packages/agent-directory/src/capability-add.ts b/packages/agent-directory/src/capability-add.ts index 5e55083f2b..e56ddebd3a 100644 --- a/packages/agent-directory/src/capability-add.ts +++ b/packages/agent-directory/src/capability-add.ts @@ -1,7 +1,7 @@ // Capability-add is a read-modify-write of the definition's asset: two // concurrent POSTs that both snapshot the same workflow.json and then // each write their own pin would last-write-wins clobber the other -// (CL-7216). This module owns that mutation so both the tenant-session +//. This module owns that mutation so both the tenant-session // route and the workflow-run route retry the loser against the latest // snapshot instead of silently dropping an add. The lock itself lives // in `./asset-write.ts` so sibling RMW routes share it. @@ -108,7 +108,7 @@ async function prepareCapabilityAdd( // a no-op on the version, never a silent bump to whatever the // registry's newest tarball happens to be today. Only a name with // no existing pin resolves fresh against the registry. An explicit - // bump is a distinct, explicit input this does not add (CL-7389). + // bump is a distinct, explicit input this does not add. const packageName = args.body.name; const existingPin = readAgentCapabilities(workflowJson).toolPackagePins.find( (pin) => pin.name === packageName, diff --git a/packages/agent-directory/src/capability-inventory.ts b/packages/agent-directory/src/capability-inventory.ts index f627376b07..a154c49ce5 100644 --- a/packages/agent-directory/src/capability-inventory.ts +++ b/packages/agent-directory/src/capability-inventory.ts @@ -21,7 +21,7 @@ export type CapabilityModelEntry = { readonly canonicalName: string }; * The pins every created specialist carries unless the caller names its * own: search (via the workbench's MCP connections), firm memory, and * the ask_user interaction card. A specialist without these is a name - * with a prompt — a "research agent" that cannot search (CL-6206). + * with a prompt — a "research agent" that cannot search. */ export const BASELINE_AGENT_TOOL_PINS = [ "@corbits/mcp-tools", diff --git a/packages/agent-directory/src/client.ts b/packages/agent-directory/src/client.ts index f61e4e64f2..9c07a4e4be 100644 --- a/packages/agent-directory/src/client.ts +++ b/packages/agent-directory/src/client.ts @@ -16,11 +16,11 @@ import { } from "./display-name"; import { isConversationalWorkflowName } from "@corbits/workflows/catalog"; -// `deriveDisplayName`/`humanizeSlug` (CL-6413) live in `@corbits/chat` +// `deriveDisplayName`/`humanizeSlug` live in `@corbits/chat` // itself, not here: this package already depends on `@corbits/chat` (for // `isWorkbenchHostDefinitionName` below), so a copy defined here could // never be imported back by `@corbits/chat`'s own call sites without a -// circular dependency — exactly the gap CL-6471 traces the "Run +// circular dependency — exactly the gap that traces the "Run // 737a058d…" leak to (the chat participant invite/greeting path never // migrated onto this derivation because it couldn't). Re-exported here so // every existing caller of `@corbits/agent-directory/client`'s diff --git a/packages/agent-directory/src/display-name.test.ts b/packages/agent-directory/src/display-name.test.ts index f2d9c725a0..fa1c71657e 100644 --- a/packages/agent-directory/src/display-name.test.ts +++ b/packages/agent-directory/src/display-name.test.ts @@ -32,7 +32,7 @@ describe("deriveDisplayName", () => { ); }); - test("throws rather than humanizing an internal run id into a fake name (CL-6471)", () => { + test("throws rather than humanizing an internal run id into a fake name", () => { expect(() => deriveDisplayName({ name: "run_737a058d48006e2bde12559576f422e0" })).toThrow( /internal identifier/, ); diff --git a/packages/agent-directory/src/display-name.ts b/packages/agent-directory/src/display-name.ts index 59a9c158ed..99cc035b73 100644 --- a/packages/agent-directory/src/display-name.ts +++ b/packages/agent-directory/src/display-name.ts @@ -4,7 +4,7 @@ // (or worse, a raw address/run id) reimplemented per call site. // // Lives in `@corbits/chat` rather than `@corbits/agent-directory` (which -// originated this logic, CL-6413) because `@corbits/agent-directory` +// originated this logic) because `@corbits/agent-directory` // itself depends on `@corbits/chat` (`workbench-host-naming`); a reverse // dependency would be circular. `@corbits/agent-directory/client.ts` // re-exports `deriveDisplayName`/`humanizeSlug` from here for its existing @@ -45,7 +45,7 @@ export function humanizeSlug(slug: string): string { * `wfd_…`, …, see `./id-leak-guard`) — the product rule is that a person * never sees an internal identifier, so a caller that reaches this * function with a run id where a definition's slug belongs gets a loud - * failure instead of a Title-Cased leak like "Run 737a058d…" (CL-6471). + * failure instead of a Title-Cased leak like "Run 737a058d…". */ export function deriveDisplayName(definition: { readonly name: string; diff --git a/packages/agent-directory/src/id-leak-guard.ts b/packages/agent-directory/src/id-leak-guard.ts index 554cf37af7..6c1d65d0bc 100644 --- a/packages/agent-directory/src/id-leak-guard.ts +++ b/packages/agent-directory/src/id-leak-guard.ts @@ -1,20 +1,20 @@ -// The systemic guard CL-6471 calls for: a person never sees an internal +// The systemic guard this module enforces: a person never sees an internal // identifier — not as a participant's name, not in a join/system line, // not in a greeting, not in a chat title. This has recurred repeatedly // (a raw definitionId/runId in insights, a `writing_systems` id in a -// Myra reply, and CL-6471's own "Run 737a058d…" / "I'm run_737a…") each +// Myra reply, and its own "Run 737a058d…" / "I'm run_737a…") each // time as a one-off display-time patch; this module is the one place // every id-generating prefix is named, so a new leak is a missed test // run rather than a missed grep. // // Prefix words mirror `@intx/hub-common`'s `generateId` (vendored; // upstream source: `packages/hub-common/src/ids.ts`'s `PREFIXES`) for -// the six kinds CL-6471 names explicitly — a workflow run, a workflow +// the six kinds this guard names explicitly — a workflow run, a workflow // definition, a tenant, a principal, an asset, and a git token — each // normally followed by `_` and 32 lowercase hex characters (`run_737a…`). // // Matched with either `_`, a space, or `-` as the separator, not just -// `_`: `humanizeSlug`'s Title Case reading of a leaked id (CL-6471's own +// `_`: `humanizeSlug`'s Title Case reading of a leaked id (its own // "Run 737a058d48006e2bde12559576f422e0") replaces the underscore with a // space, so the raw and the humanized-leak forms both need to trip this. const ID_PREFIX_WORDS = ["run", "wfd", "tnt", "prn", "ast", "gtk"] as const; @@ -38,7 +38,7 @@ export function assertNoLeakedInternalId(value: string, context: string): void { throw new Error( `${context} carries an internal identifier ("${value}"); a person ` + "must never see one — resolve the real name at the source instead " + - "of rendering the id (CL-6471)", + "of rendering the id", ); } } diff --git a/packages/agent-directory/src/inventory.ts b/packages/agent-directory/src/inventory.ts index 75754e63d9..d58b4c1dfb 100644 --- a/packages/agent-directory/src/inventory.ts +++ b/packages/agent-directory/src/inventory.ts @@ -37,7 +37,7 @@ export type InventoryToolPackage = { /** The credential a `{create}` definition pinning this tool package * must be granted for the pin to work at runtime — the same * `CredentialBinding` shape `workflows/granola-call`'s - * `GRANOLA_CALL_CREDENTIAL_BINDINGS` uses (CL-6028). `null` for a + * `GRANOLA_CALL_CREDENTIAL_BINDINGS` uses. `null` for a * tool package that needs no per-tenant credential (e.g. the memory * tool package). */ readonly credentialBinding: CredentialBinding | null; diff --git a/packages/agent-directory/src/native-deploy-cutover.test.ts b/packages/agent-directory/src/native-deploy-cutover.test.ts index bb2b7f8626..b8e91802df 100644 --- a/packages/agent-directory/src/native-deploy-cutover.test.ts +++ b/packages/agent-directory/src/native-deploy-cutover.test.ts @@ -1,4 +1,4 @@ -// Regression for CL-7363: Agent Builder definitions used to self-freeze +// Agent Builder definitions used to self-freeze // through `@corbits/workflow-freeze`'s `DefinitionFreezer`, a hub-local // path that bypasses the native sidecar probe. This package now deploys // every definition write through the injected `WorkflowDeployer` — the diff --git a/packages/agent-directory/src/one-shot-prompt.ts b/packages/agent-directory/src/one-shot-prompt.ts index 52baaa86fe..ac91c2c684 100644 --- a/packages/agent-directory/src/one-shot-prompt.ts +++ b/packages/agent-directory/src/one-shot-prompt.ts @@ -366,8 +366,7 @@ export async function runOneShotPrompt( // A run's session and event collector are ensured lazily now, at // the hub seams that actually see the run become mail-routable // (`apps/hub/src/mailbox-persist.ts`, the wrapped - // `eventCollectors` dispatch in `apps/hub/src/index.ts`) — - // CL-7480. Nothing here needs to record it. + // `eventCollectors` dispatch in `apps/hub/src/index.ts`). } catch (cause) { // The reply timer may have settled the run mid-wait; a late // failure is then a phantom for an already-torn-down run. diff --git a/packages/agent-directory/src/routes.ts b/packages/agent-directory/src/routes.ts index 0636d66e61..54d84c9bd3 100644 --- a/packages/agent-directory/src/routes.ts +++ b/packages/agent-directory/src/routes.ts @@ -306,7 +306,7 @@ export function createAgentDefinitionRoutes({ }); // Every agent this tenant can open a direct chat with — its own agent - // definitions plus every ancestor's (CL-6253): the sidebar's unified + // definitions plus every ancestor's: the sidebar's unified // recency-sorted stream reads this list, keyed by `tenantId` per row // so a click can mint the DM in the agent's actual owning tenant, not // the caller's. @@ -317,7 +317,7 @@ export function createAgentDefinitionRoutes({ }); // A definition's kebab `name` is its immutable, URL-facing slug - // (CL-6413), so a slug-addressed detail screen resolves through this + //, so a slug-addressed detail screen resolves through this // route rather than scanning a page of the definitions listing — an // agent past the listing's pagination ceiling still answers on its own // URL. Grant-checked tenant-wide because there is no definition id to diff --git a/packages/agent-directory/src/stale-task-agent-naming.ts b/packages/agent-directory/src/stale-task-agent-naming.ts index 6cfb01b7ea..6c001ea724 100644 --- a/packages/agent-directory/src/stale-task-agent-naming.ts +++ b/packages/agent-directory/src/stale-task-agent-naming.ts @@ -1,5 +1,5 @@ // Recognizes an agent definition minted by the now-deleted tasks -// primitive's planner `{create}` branch (CL-6051), each of which +// primitive's planner `{create}` branch, each of which // existed for exactly one task. The minting side (what used to be // `@corbits/task-planner`'s `plannerCreatedDefinitionHandle`) is gone // along with that primitive — nothing creates a definition with this diff --git a/packages/agent-directory/src/tool-package-version.test.ts b/packages/agent-directory/src/tool-package-version.test.ts index cb4cbb43ce..56d3db24ad 100644 --- a/packages/agent-directory/src/tool-package-version.test.ts +++ b/packages/agent-directory/src/tool-package-version.test.ts @@ -1,4 +1,4 @@ -// CL-7389: `resolvePinnedVersion` must resolve to a concrete, reproducible +// `resolvePinnedVersion` must resolve to a concrete, reproducible // version — semver-sorted (never string-sorted), matched to the exact // package name (never a prefix/suffix neighbor), and preferring the // highest STABLE version over a higher-sorting prerelease. These are diff --git a/packages/agent-directory/src/tool-package-version.ts b/packages/agent-directory/src/tool-package-version.ts index 3e047e4e1c..0da3d7d177 100644 --- a/packages/agent-directory/src/tool-package-version.ts +++ b/packages/agent-directory/src/tool-package-version.ts @@ -1,4 +1,4 @@ -// CL-7389: a runtime tool-package pin must resolve to a concrete, +// A runtime tool-package pin must resolve to a concrete, // published version — never the npm "any version" range `*` — so a new // tarball landing in the tenant's registry never silently changes what // an already-deployed specialist runs. `withAgentToolPackagePin` (see @@ -96,7 +96,7 @@ function resolveFromFilenames( * one-name convenience wrapper; a caller resolving several names in one * request (e.g. `create_agent`'s own `toolPackagePins`) should build one * resolver and call it once per name instead, so a five-pin create still - * costs one ancestor walk and one listing, not five (CL-7389). + * costs one ancestor walk and one listing, not five. */ export function createPinnedVersionResolver( deps: ResolvePinnedVersionDeps, diff --git a/packages/agent-directory/src/visible-definitions.ts b/packages/agent-directory/src/visible-definitions.ts index ce3b33f38f..9b050379ec 100644 --- a/packages/agent-directory/src/visible-definitions.ts +++ b/packages/agent-directory/src/visible-definitions.ts @@ -3,7 +3,7 @@ // same way `@intx/db`'s own `resolveProviderByName`/`listAssetsForTenant` // do and `packages/connections/src/mcp-server-store.ts`'s // `listMcpServerConnections` already does for MCP server connections -// (CL-6191) — a child tenant can reach anything a parent tenant made +// — a child tenant can reach anything a parent tenant made // available, and a same-name definition made at the child shadows the // ancestor's. Reads inherit up the chain; creating/editing a definition // stays own-tenant only (`./routes.ts`). @@ -17,7 +17,7 @@ export type VisibleAgentDefinition = { readonly id: string; /** The definition's display name — its own description when one was * set at creation, otherwise a humanized reading of its immutable slug - * (`deriveDisplayName`, CL-6413). Never the raw slug itself. */ + * (`deriveDisplayName`). Never the raw slug itself. */ readonly name: string; /** The tenant that actually owns this definition — where its DM workbench * must be minted, not necessarily the caller's own tenant. */ diff --git a/packages/agent-directory/src/workflow-capability-routes.ts b/packages/agent-directory/src/workflow-capability-routes.ts index 6220d9bfa9..acec7e52ca 100644 --- a/packages/agent-directory/src/workflow-capability-routes.ts +++ b/packages/agent-directory/src/workflow-capability-routes.ts @@ -1,6 +1,6 @@ // The sanctioned path for a workflow-process child to add itself a -// capability (`@corbits/capability-tools`'s `request_capability`, -// CL-6084) — the execution half of `POST /:definitionId/capabilities` +// capability (`@corbits/capability-tools`'s `request_capability`) +// — the execution half of `POST /:definitionId/capabilities` // / `GET /capabilities/inventory` in `./routes.ts`, mirroring // `@corbits/skills`' `createWorkflowSkillRoutes` and // `@corbits/artifacts-hub`'s workflow-artifacts routes: a workflow child @@ -13,7 +13,7 @@ // or path beyond the definitionId itself: the tenant and principal // every write is scoped to come from the authenticated run alone. // -// Authorization decision (deliberate, see CL-6085 for the durable fix): +// Authorization decision (deliberate): // the vendored grant-materialization path never seeds a `kind: // "workflow"` run's own principal a `workflow-definition: /update` grant — `requireGrant` would 403 every self-update call a @@ -34,8 +34,8 @@ // never touch another definition through this surface), and (3) the // addition must fail closed against the tenant's live capability // inventory (`assertCapabilityInInventory`, unchanged from the -// tenant-session route). CL-6085 tracks seeding the real self-update -// grant in vendor grant materialization, at which point this route can +// tenant-session route). Once the real self-update grant is seeded in +// vendor grant materialization, this route can // route through `requireGrant` like every other definition-mutating // surface instead of carrying this interim rule. import { type } from "arktype"; diff --git a/packages/agent-directory/src/workflow-create-routes.ts b/packages/agent-directory/src/workflow-create-routes.ts index b5982e3def..1d4b811082 100644 --- a/packages/agent-directory/src/workflow-create-routes.ts +++ b/packages/agent-directory/src/workflow-create-routes.ts @@ -194,7 +194,7 @@ export function createWorkflowAgentCreateRoutes( // tenant's own catalog doesn't offer can never resolve at launch, // so it is never baked in verbatim: fall back to the tenant's // catalog default and say so, rather than creating a dead agent - // (CL-6477). A name the catalog does offer is used exactly as + //. A name the catalog does offer is used exactly as // asked, no fallback consulted. let modelNote: string | null = null; if (body.model !== undefined) { @@ -216,7 +216,7 @@ export function createWorkflowAgentCreateRoutes( } else { // No pins named: the specialist still gets the baseline set this // tenant can resolve, so a created "research agent" can actually - // search, remember, and ask (CL-6206). + // search, remember, and ask. const baseline = baselineAgentToolPins(inventory); if (baseline.length > 0) coreInput.toolPackagePins = baseline; } diff --git a/packages/agent-directory/test/agent-definition-draft-routes.test.ts b/packages/agent-directory/test/agent-definition-draft-routes.test.ts index 5ec204b458..077aea811d 100644 --- a/packages/agent-directory/test/agent-definition-draft-routes.test.ts +++ b/packages/agent-directory/test/agent-definition-draft-routes.test.ts @@ -1,4 +1,4 @@ -// Draft-route envelope (CL-6749): a fail-closed Myra draft answers the +// Draft-route envelope: a fail-closed Myra draft answers the // canonical `{ code, userMessage, refId }` envelope, reports through // `reportError` so the person can quote the same id, and never puts a // legacy `{ code, message }` body — or a stack — on the wire. diff --git a/packages/agent-directory/test/routes.integration.test.ts b/packages/agent-directory/test/routes.integration.test.ts index 038be30322..65851a704a 100644 --- a/packages/agent-directory/test/routes.integration.test.ts +++ b/packages/agent-directory/test/routes.integration.test.ts @@ -1,15 +1,12 @@ // Real-stack coverage for the create → skills round-trip. The bug this -// guards against (CL-6135) only shows up through the real +// guards against only shows up through the real // `AssetService`'s `populateAsset`, which runs // vendor/intx/hub-sessions' `workflow-kind.ts` tree validator against // an actual git commit — `routes.test.ts`'s hand-rolled fake // `AssetService` never exercises that validator, so it could not have -// caught this. A definition created WITH skills used to write -// `skills.json` into the asset tree beside its definition, which that -// validator rejected. Pinned skills now live in the definition's own -// entry-module stanza (read back out of the asset, never a side table — -// CL-7592 cut the Workbench-owned `definition_skills` store), so the -// asset tree only ever carries the source codebase +// caught this. Pinned skills live in the definition's own +// entry-module stanza (read back out of the asset, never a side table), +// so the asset tree only ever carries the source codebase // `agentDefinitionSourceTree` renders — the one shape the validator now // accepts, the retired `workflow.json` envelope having been refused at // the push boundary. @@ -239,7 +236,7 @@ describeIfDb("agent-directory routes against a real assetService", () => { expect(gotAfterBody.skills).toEqual([]); }); - test("a created definition deploys its commit through the native source pipeline (CL-7363)", async () => { + test("a created definition deploys its commit through the native source pipeline", async () => { // `deployer.deploys` is shared across this describe block's tests, so // scope to what THIS test appends rather than the array's raw length — // earlier tests deploy their own definitions too. @@ -257,7 +254,7 @@ describeIfDb("agent-directory routes against a real assetService", () => { // Create deploys exactly once, with the commit the asset write just // produced — the same sequence a launch depends on being launchable - // (CL-6447), now driven through the native install/probe/gate/freeze + //, now driven through the native install/probe/gate/freeze // pipeline instead of a bare freeze. expect(deploysSoFar()).toHaveLength(1); const [firstDeploy] = deploysSoFar(); diff --git a/packages/agent-directory/test/routes.test.ts b/packages/agent-directory/test/routes.test.ts index 1ac8ba163d..b99a75724d 100644 --- a/packages/agent-directory/test/routes.test.ts +++ b/packages/agent-directory/test/routes.test.ts @@ -551,10 +551,6 @@ test("a create request with skills writes the definition source tree to the asse expect(response.status).toBe(201); expect(writtenFiles).toBeDefined(); expect(Object.keys(writtenFiles ?? {})).toEqual(SOURCE_TREE_PATHS); - // The definition is deployed through the native source pipeline with - // the exact commit the asset write produced — this is what makes the - // created definition launchable (CL-6447, cut over to native deploy - // by CL-7363). expect(deployer.deploys).toHaveLength(1); expect(deployer.deploys[0]?.assetId).toBe("ast_1"); expect(deployer.deploys[0]?.commitSha).toBe("deadbeef"); @@ -1033,7 +1029,7 @@ test("PUT /:definitionId writes the new system prompt in a single source-tree co // Saving instructions redeploys the definition through the native // source pipeline with the commit the edit produced, so the next // launch answers with the edit — the native install/probe/gate/freeze - // replaces the old bare-freeze call (CL-7363). + // replaces the old bare-freeze call. expect(deployer.deploys).toHaveLength(1); expect(deployer.deploys[0]?.assetId).toBe("ast_1"); expect(deployer.deploys[0]?.commitSha).toBe("deadbeef"); @@ -1051,7 +1047,7 @@ test("PUT /:definitionId writes the new system prompt in a single source-tree co }); }); -// CL-7389: PUT /:definitionId only rewrites the name and system prompt — +// PUT /:definitionId only rewrites the name and system prompt — // it must never re-touch tool-package pins, so a tarball that lands in // the registry after this definition deployed never silently moves an // already-deployed specialist's stored pin. diff --git a/packages/agent-directory/test/tool-package-version.drizzle.test.ts b/packages/agent-directory/test/tool-package-version.drizzle.test.ts index 05e1af7814..2411264257 100644 --- a/packages/agent-directory/test/tool-package-version.drizzle.test.ts +++ b/packages/agent-directory/test/tool-package-version.drizzle.test.ts @@ -5,7 +5,7 @@ // listing itself is a hand-rolled fake `AssetService` (`routes.test.ts`'s // convention), never a real git substrate. // -// Proves CL-7389: a runtime tool-package pin resolves to the HIGHEST +// a runtime tool-package pin resolves to the HIGHEST // published version among the tenant's (possibly inherited) // `corbits-tools` registry tarballs, never `*` — and fails closed with // the same `CapabilityOutOfInventoryError` the guided-capability-add diff --git a/packages/agent-directory/test/visible-definitions.drizzle.test.ts b/packages/agent-directory/test/visible-definitions.drizzle.test.ts index 0fb6f2a2d6..910a6c3252 100644 --- a/packages/agent-directory/test/visible-definitions.drizzle.test.ts +++ b/packages/agent-directory/test/visible-definitions.drizzle.test.ts @@ -4,8 +4,8 @@ // against its own Postgres schema, never the developer's or the // walking-skeleton suite's. // -// Proves CL-6253: `listVisibleAgentDefinitions` walks the tenant -// ancestor chain the same way `listMcpServerConnections` does (CL-6191) — +// `listVisibleAgentDefinitions` walks the tenant +// ancestor chain the same way `listMcpServerConnections` does — // a child tenant sees an ancestor's agent definitions, and a same-name // definition made at the child shadows the ancestor's. import { afterAll, beforeAll, expect, test } from "bun:test"; diff --git a/packages/agent-directory/test/workflow-capability-routes.test.ts b/packages/agent-directory/test/workflow-capability-routes.test.ts index e3a002efca..04c5eeb3a7 100644 --- a/packages/agent-directory/test/workflow-capability-routes.test.ts +++ b/packages/agent-directory/test/workflow-capability-routes.test.ts @@ -269,8 +269,7 @@ test("a run may add a capability to its own definition without any grant check", }); expect(response.status).toBe(200); // The rewrite redeploys the definition through the native source - // pipeline so the next launch carries the added capability (CL-6447, - // cut over to native deploy by CL-7363). + // pipeline so the next launch carries the added capability. expect(deployer.deploys).toHaveLength(1); expect(deployer.deploys[0]?.commitSha).toBe("deadbeef"); expect(Object.keys(writtenFiles ?? {})).toEqual(SOURCE_TREE_PATHS); diff --git a/packages/agent-directory/test/workflow-create-routes.test.ts b/packages/agent-directory/test/workflow-create-routes.test.ts index aca10c6606..cabb98993d 100644 --- a/packages/agent-directory/test/workflow-create-routes.test.ts +++ b/packages/agent-directory/test/workflow-create-routes.test.ts @@ -298,7 +298,7 @@ test("a toolPackagePins entry the tenant's inventory offers is pinned onto the c expect(written).toContain("@corbits/memory"); }); -test("a create naming no pins gets the baseline set the inventory offers — a specialist is never toolless (CL-6206)", async () => { +test("a create naming no pins gets the baseline set the inventory offers — a specialist is never toolless", async () => { let writtenFiles: Record | undefined; const app = buildApp({ assetService: fakeAssetService({ diff --git a/packages/agent-directory/test/workflow-skill-pin-routes.test.ts b/packages/agent-directory/test/workflow-skill-pin-routes.test.ts index 3601353e62..92c9306d3b 100644 --- a/packages/agent-directory/test/workflow-skill-pin-routes.test.ts +++ b/packages/agent-directory/test/workflow-skill-pin-routes.test.ts @@ -260,8 +260,7 @@ test("pins a skill onto another definition in the same tenant and re-indexes its }); expect(response.status).toBe(200); // The pin's rewrite redeploys through the native source pipeline so - // the next launch advertises the pinned skill (CL-6447, cut over to - // native deploy by CL-7363). + // the next launch advertises the pinned skill. expect(deployer.deploys).toHaveLength(1); expect(deployer.deploys[0]?.commitSha).toBe("deadbeef"); expect(Object.keys(writtenFiles ?? {})).toEqual(SOURCE_TREE_PATHS); diff --git a/packages/agent-events/src/agent-events.ts b/packages/agent-events/src/agent-events.ts index 4bb3a713b7..87d645eca7 100644 --- a/packages/agent-events/src/agent-events.ts +++ b/packages/agent-events/src/agent-events.ts @@ -24,7 +24,7 @@ export function connectorReplyContent(event: unknown): string | undefined { } /** One block of a `connector.reply`-producing turn, narrowed to the two - * kinds a reply's chat representation must tell apart (CL-6378): visible + * kinds a reply's chat representation must tell apart: visible * text, and a tool the model invoked. Every other `ContentBlock` variant * (thinking, citations, safety ratings, ...) carries no chat-part * equivalent yet and is left out rather than guessed at. */ diff --git a/packages/approvals/src/allowance.ts b/packages/approvals/src/allowance.ts index 877c013c2c..eade7dabec 100644 --- a/packages/approvals/src/allowance.ts +++ b/packages/approvals/src/allowance.ts @@ -1,4 +1,4 @@ -// CL-6345: read-only tool calls ride the grant allowance instead of +// Read-only tool calls ride the grant allowance instead of // per-call approval. An `approval: "ask"` tool call parks as a pending // approval row the moment the sidecar registers its suspension // (`registerSignalCorrelation`); this module is the allowance gate that diff --git a/packages/approvals/src/headline.ts b/packages/approvals/src/headline.ts index f41f47751c..1536504c9e 100644 --- a/packages/approvals/src/headline.ts +++ b/packages/approvals/src/headline.ts @@ -28,7 +28,7 @@ function toolPackagePinsField( } /** - * CL-7362: `workflow_deploy` (`@corbits/workflow-authoring-tools`) parks an + * `workflow_deploy` (`@corbits/workflow-authoring-tools`) parks an * approval whose arguments carry the packageName/toolPackagePins a prior * `wf_deploy_preview` call (a static read of the committed source) * reported, passed through. This renders that directly rather than @@ -36,7 +36,7 @@ function toolPackagePinsField( * names the real package and tools instead of a bare asset id. It does * NOT show grants/capabilities: those are stamped by the native * install+probe+gate `workflow_deploy` itself runs, which has no - * no-freeze preview yet (CL-7362). + * no-freeze preview yet. */ function workflowDeployHeadline(toolArguments: object): string | undefined { const commitSha = stringField(toolArguments, "commitSha"); diff --git a/packages/artifact-ui/README.md b/packages/artifact-ui/README.md index fb208b9cf0..71b1fb2e07 100644 --- a/packages/artifact-ui/README.md +++ b/packages/artifact-ui/README.md @@ -10,7 +10,7 @@ Presentational primitives come from `@corbits/react-ui` package holds the workbench-specific composition and domain rules on top of them. -Rendering is currently read-only (CL-5938); the multiplayer-editing half +Rendering is currently read-only; the multiplayer-editing half is separate follow-up work built on top of this package's substrate. ## Key modules diff --git a/packages/artifact-ui/src/artifact-renderer.tsx b/packages/artifact-ui/src/artifact-renderer.tsx index 256dd3c4e2..96ad936d6a 100644 --- a/packages/artifact-ui/src/artifact-renderer.tsx +++ b/packages/artifact-ui/src/artifact-renderer.tsx @@ -4,8 +4,8 @@ // opened chat blob) renders through this one component so a kind's shape // only has one implementation. // -// Read-only phase (CL-5938): no editing affordances here at all — the -// multiplayer-editing half is CL-5958's substrate to build on top of this. +// Read-only phase: no editing affordances here at all — the +// multiplayer-editing half is substrate to build on top of this. import { CsvTable } from "@corbits/react-ui"; import { FileDashed } from "@corbits/icons"; diff --git a/packages/artifact-ui/src/artifact-text-editor.tsx b/packages/artifact-ui/src/artifact-text-editor.tsx index 89b8527e40..4c4a774ffb 100644 --- a/packages/artifact-ui/src/artifact-text-editor.tsx +++ b/packages/artifact-ui/src/artifact-text-editor.tsx @@ -5,12 +5,9 @@ // ever mounts for a "doc"-kind artifact once the host has already decided // the viewer can edit — it never makes that call itself. // -// CL-8189: co-edit presence (`@corbits/presence`, Y.Doc) is gone — this is -// a plain controlled textarea, debounced-saved through `onSave` (the host -// wires that to the artifacts HTTP route's PUT). Single-user editing only; -// no live co-viewer cursors, no shared doc, no awareness. That capability -// returns, if it does, on top of the preserved `@corbits/presence` -// library, not this component. +// This is a plain controlled textarea, debounced-saved through `onSave` +// (the host wires that to the artifacts HTTP route's PUT). Single-user +// editing only; no live co-viewer cursors, no shared doc, no awareness. import { useEffect, useRef, useState } from "react"; import { formatSaveStateLine, type ArtifactSaveState } from "./save-state"; diff --git a/packages/artifact-ui/src/kind-filter.ts b/packages/artifact-ui/src/kind-filter.ts index 1730c369fa..696e189223 100644 --- a/packages/artifact-ui/src/kind-filter.ts +++ b/packages/artifact-ui/src/kind-filter.ts @@ -1,9 +1,8 @@ // Pure helpers for the Files kind nav (`/files`, `/files/document`, …) — // this package's own names keep the "library" vocabulary (it's the // internal name for the artifact store), but `LIBRARY_PATH` tracks the -// app's real mount point, renamed off `/library` to `/files` (CL-6353; -// user-facing copy dropped "Library" entirely, the app's `/library` prefix -// stays routable only as a redirect — see `legacy-settings-redirects.tsx`). +// app's real mount point: `/library` stays routable only as a redirect +// to `/files` — see `legacy-settings-redirects.tsx`. // Framework-free so both the web app (rendering the nav + filtering the // visible list) and the hub (computing honest per-kind counts server-side) // share one mapping instead of two copies drifting apart. @@ -34,7 +33,7 @@ export function libraryKindSegmentFromPath(path: string): string { const LIBRARY_ARTIFACT_SEGMENT = "a"; /** Deep link to one artifact selected in Files — the seam a chat - * artifact chip's "Open in Files" affordance navigates to (CL-6015). */ + * artifact chip's "Open in Files" affordance navigates to. */ export function libraryArtifactPath(artifactId: string): string { return `${LIBRARY_PATH}/${LIBRARY_ARTIFACT_SEGMENT}/${encodeURIComponent(artifactId)}`; } diff --git a/packages/artifact-ui/src/save-state.ts b/packages/artifact-ui/src/save-state.ts index 127ea3785f..972fb1b34c 100644 --- a/packages/artifact-ui/src/save-state.ts +++ b/packages/artifact-ui/src/save-state.ts @@ -1,7 +1,6 @@ // The canvas artifact pane's save-state line — never a fake autosave claim. // "Saved · v12" is only ever rendered once the artifact's PUT route has -// actually answered with that version (CL-8189: single-user editing, no -// co-edit presence); until then the host renders "Saving…" or "Unsaved +// actually answered with that version; until then the host renders "Saving…" or "Unsaved // changes" honestly instead of guessing that a debounced write already // landed. diff --git a/packages/bench-ui/src/styles.css b/packages/bench-ui/src/styles.css index d976891662..e8bf9ecf1e 100644 --- a/packages/bench-ui/src/styles.css +++ b/packages/bench-ui/src/styles.css @@ -1,3 +1,3 @@ /* Reserved stylesheet entry for `@corbits/bench-ui/styles.css`. The switcher / create / members layout glue that lived here was deleted with - those unused components (CL-6844); apps/web still imports this path. */ + those unused components; apps/web still imports this path. */ diff --git a/packages/chat-ui/src/agent-display-names.ts b/packages/chat-ui/src/agent-display-names.ts index 1dd8582077..66185409ce 100644 --- a/packages/chat-ui/src/agent-display-names.ts +++ b/packages/chat-ui/src/agent-display-names.ts @@ -1,5 +1,5 @@ // Person-facing display names for a workbench's agent participants -// (CL-6424) — resolved once per workbench off +// — resolved once per workbench off // `GET /workbenches/:id/agents`' `displayName`, keyed by participant // address. Every surface that names an agent (timeline headers, mention // picker, typing pulse, presence stack, empty states, join lines) reads diff --git a/packages/chat-ui/src/agent-part-adapter.ts b/packages/chat-ui/src/agent-part-adapter.ts index 9c781d94b8..d29757eab0 100644 --- a/packages/chat-ui/src/agent-part-adapter.ts +++ b/packages/chat-ui/src/agent-part-adapter.ts @@ -1,5 +1,5 @@ // Adapting the chat wire's parts (`./wire/parts`) to the shapes `@corbits/react-ui` -// renders (CL-6318). +// renders. // // Only reasoning crosses this boundary now. Tool calls used to as well, // but the conversation renders them through `tool-activity.tsx` instead: diff --git a/packages/chat-ui/src/api.ts b/packages/chat-ui/src/api.ts index 342985851e..905a05c6a5 100644 --- a/packages/chat-ui/src/api.ts +++ b/packages/chat-ui/src/api.ts @@ -62,7 +62,7 @@ const WorkbenchWire = type({ "preview?": "string", // `GET /workbenches` sets this server-side (see // `packages/chat/src/routes.ts`) only for a workbench projected into - // this tenant via CL-5882's shared-workbench machinery: "shared via + // this tenant via shared-workbench machinery: "shared via // parent · " for true siblings, "shared · " otherwise. Absent for every ordinary, non-projected workbench. "sharedLabel?": "string", @@ -125,20 +125,20 @@ const MessageItem = type({ // `false`, mirroring how `unreadCount` on `Workbench` works. "reactions?": ReactionSummaryWire.array(), "pinned?": "boolean", - // The client-generated send identity (CL-6251) this message's own + // The client-generated send identity this message's own // sender's composer submitted it with, echoed back once the server // records it — see `sendMessage`'s `clientId` option and // `packages/chat/src/client-ids.ts`. Absent for every message not // sent with one (anything from before this feature, or from a peer // whose own client never set it) — never a fabricated id. "clientId?": "string", - // The thread this message belongs to (CL-6313), resolved server-side + // The thread this message belongs to, resolved server-side // against the same "root feed by default" contract the per-thread // feed filters on. Carrying it here is what lets one query serve the // root feed and every open thread — see `./thread-feed.ts`. Absent // on a host that mounts no thread store, matching `rootThreadId: ""`. "threadId?": "string", - // The RFC 5322 `Message-ID` this row's mail carries (CL-8175) — absent + // The RFC 5322 `Message-ID` this row's mail carries — absent // for a row with no mail original. This is what a reply's own // `inReplyTo` threads onto, never this item's `id`, which for a // mail-derived row is the mailbox's own local uid (see @@ -319,7 +319,7 @@ export function listAllWorkbenches(tenantId: string): Promise; /** One-click connect: starts the hosted OAuth hand-off (navigating diff --git a/packages/chat-ui/src/blocks/connect-service-block.tsx b/packages/chat-ui/src/blocks/connect-service-block.tsx index d32d84fbe6..6223bda40e 100644 --- a/packages/chat-ui/src/blocks/connect-service-block.tsx +++ b/packages/chat-ui/src/blocks/connect-service-block.tsx @@ -1,4 +1,4 @@ -// The generic service connect card (CL-6393) — `connect-github`'s +// The generic service connect card — `connect-github`'s // first-run card generalized to every connector and MCP preset, in the // same `BlockCard` frame. Pure and props-driven like // `ConnectGithubBlockView`: the disconnected arm renders one of three diff --git a/packages/chat-ui/src/chat-workspace.test.ts b/packages/chat-ui/src/chat-workspace.test.ts index e5b03389f9..082eeecd74 100644 --- a/packages/chat-ui/src/chat-workspace.test.ts +++ b/packages/chat-ui/src/chat-workspace.test.ts @@ -30,7 +30,7 @@ describe("buildMemberAvatarStack", () => { expect(stack.every((entry) => entry.tone === "agent")).toBe(true); }); - test("includes the signed-in human from the roster even with empty presence (CL-6779)", () => { + test("includes the signed-in human from the roster even with empty presence", () => { // Onboarding/template rooms list the human as a participant before any // presence snapshot arrives — the stack must not be agent-only. const participants: readonly ParticipantRecord[] = [ @@ -62,7 +62,7 @@ describe("buildMemberAvatarStack", () => { expect(stack.map((entry) => entry.initials)).toEqual(["A"]); }); - test("prefers resolved agent display names over handle slugs (CL-6424)", () => { + test("prefers resolved agent display names over handle slugs", () => { const participants: readonly ParticipantRecord[] = [ { address: "run_myra@dana.localhost", handle: "myra" }, ]; diff --git a/packages/chat-ui/src/chat-workspace.tsx b/packages/chat-ui/src/chat-workspace.tsx index a807eccf97..febdc74ed9 100644 --- a/packages/chat-ui/src/chat-workspace.tsx +++ b/packages/chat-ui/src/chat-workspace.tsx @@ -107,7 +107,7 @@ export type TenantResolution = | { readonly kind: "ready"; readonly tenantId: string }; /** - * One live presence entry for the workbench's who's-here stack (CL-6328) — + * One live presence entry for the workbench's who's-here stack — * derived from this workbench's own `/stream` connection * (`useWorkbenchPresenceRoster`), never a second connection or an HTTP * heartbeat poll. The roster carries only ids, so display names and avatar @@ -158,7 +158,7 @@ const WORKBENCHES_LIST_CHROME: ChatHeaderChrome = { * The workbench's static member stack: every agent participant plus every * human on the roster. Agents first (they have no presence concept of * their own); humans follow. Roster humans are included even when live - * presence is empty (CL-6779) — onboarding/template rooms often list the + * presence is empty — onboarding/template rooms often list the * signed-in human as a participant before any `chat.presence.snapshot` * arrives. Live who's-here is a separate round stack, not mixed in here. * @@ -211,7 +211,7 @@ type WorkbenchesState = }; /** - * Recovery controls for a gone / non-workbench id (CL-6796). Prefer the + * Recovery controls for a gone / non-workbench id. Prefer the * Mission Control + New workbench pair; fall back to the legacy single * "Back to workbenches" action when a host has not wired the new props. */ @@ -344,9 +344,8 @@ const REPLY_TIMED_OUT_ITEM_ID = "reply_timed_out_notice"; * the same class of failure `postUndeliveredNotice` (the hub's chat routes) * already gives an honest, actionable backstop to when the dispatch fails * loud enough for the server to see it — a cold-waking agent that never - * streams a token back fails silently instead, so before CL-6677 this - * synthetic notice rendered as a bare quiet event line with no ref id and - * no Retry. It now carries a `turnFailed` text part exactly like the + * streams a token back fails silently instead, so this synthetic notice + * carries a `turnFailed` text part exactly like the * server's own notice (`replyTimedOutRefId` is minted by `reportError` at * the moment `useStreamingReply`'s timer fires), so it renders through * `FailedTurnStrip` — same ref-quotable copy, same Retry action — instead @@ -515,7 +514,7 @@ function ChatWorkspaceInner({ * `onOpenArtifactInLibrary`. */ readonly onOpenArtifactInLibrary?: (part: Part & { kind: "file" }) => void; /** The classified-inference-failure text bubble's "Fix this connection" - * action — see `WorkbenchTimeline`'s `onFixConnection` (CL-6092). */ + * action — see `WorkbenchTimeline`'s `onFixConnection`. */ readonly onFixConnection?: () => void; /** The approve block's live round-trip — see `WorkbenchTimeline`'s * `approvalActions`. */ @@ -543,11 +542,11 @@ function ChatWorkspaceInner({ * never touches localStorage), so it's told rather than reaching out. */ readonly onWorkbenchNotFound?: (workbenchId: string) => void; /** Legacy single recovery for a gone workbench — prefer - * `onGoToMissionControl` / `onNewWorkbench` (CL-6796). */ + * `onGoToMissionControl` / `onNewWorkbench`. */ readonly onBackToWorkbenchList?: () => void; - /** Not-found empty state's Mission Control recovery (CL-6796). */ + /** Not-found empty state's Mission Control recovery. */ readonly onGoToMissionControl?: () => void; - /** Not-found empty state's New workbench recovery (CL-6796). */ + /** Not-found empty state's New workbench recovery. */ readonly onNewWorkbench?: () => void; /** The 401 messages-error state's way out — sign back in instead of a * retry that can only ever hit the same 401. Omitted, that state falls @@ -556,7 +555,7 @@ function ChatWorkspaceInner({ /** Whether this tenant can actually run inference right now — the * host's read of `hasUsableModel` (`@corbits/inference-settings`) * against its resolved catalog, never mere `model_provider` row - * presence (CL-6568). `undefined` while that read is still in flight: + * presence. `undefined` while that read is still in flight: * the banner stays hidden rather than flashing "no model" before the * real answer lands. */ readonly hasUsableModel?: boolean; @@ -579,7 +578,7 @@ function ChatWorkspaceInner({ setSelectedWorkbenchId(id); onWorkbenchChange?.(id); }; - // CL-6833: catch-up `fetchRunningTurn` failure must surface a banner with + // Catch-up `fetchRunningTurn` failure must surface a banner with // Retry — never look idle. `resumeAttempt` re-arms the effect on Retry. const [resumeFailedRefId, setResumeFailedRefId] = useState(null); const [resumeAttempt, setResumeAttempt] = useState(0); @@ -639,7 +638,7 @@ function ChatWorkspaceInner({ if (first !== undefined) setActiveWorkbenchId(first.id); }, [workbenchesState, activeWorkbenchId]); - // CL-7201: this rethrows after + // This rethrows after // toasting — the composer's own `onStop` awaits the returned promise // and re-enables its Stop button on rejection, so a genuinely failed // request (network, a denied grant) never leaves the button stuck @@ -719,7 +718,7 @@ function ChatWorkspaceInner({ ); // Every event applies straight into the query cache it describes rather - // than triggering a refetch (CL-6328, §6/1.2): each payload already + // than triggering a refetch: each payload already // carries what a subscriber needs, so there is no "invalidate, then // fetch" fallback left beside this. `chat.agent` needs no cache // application of its own — it's fully owned by @@ -736,7 +735,7 @@ function ChatWorkspaceInner({ switch (eventType) { case "chat.message": { // The feed now reads from the mailbox, not this stream's own - // `chat.message` payload (CL-8174 slice 2b) — the mailbox's own + // `chat.message` payload — the mailbox's own // `/me/inbox/events` subscription (see `useWorkbenchFeed`) is // what refreshes the timeline once the fan-out lands. A parse // failure here still means something arrived this connection @@ -830,7 +829,7 @@ function ChatWorkspaceInner({ isAgentAddress(participant.address), )?.address; - // CL-6380: a turn runs entirely server-side — this component mounting or + // A turn runs entirely server-side — this component mounting or // unmounting never starts or stops it (see `useWorkbenchStream`'s own // header: unmount only closes the `EventSource`, nothing server-side). // So a fresh mount (first visit, or a return after navigating away while @@ -839,7 +838,7 @@ function ChatWorkspaceInner({ // rather than showing nothing until the next live token arrives. Any // live event that beats this fetch back always wins — see // `resumeFromTurn`'s own guard. - // CL-6833: a failed catch-up must not swallow into idle — report a ref + // A failed catch-up must not swallow into idle — report a ref // and keep `ResumeFailedBanner` visible until Retry succeeds (or the // workbench changes). useEffect(() => { @@ -873,7 +872,7 @@ function ChatWorkspaceInner({ setResumeAttempt((attempt) => attempt + 1); }, []); - // Every other participant's address (CL-8175) — the signed-in sender's + // Every other participant's address — the signed-in sender's // own entry (matched by local-part against `principalId`, the same // convention `typingLabel` above reads) never belongs in its own `to`. const recipientAddresses = (activeWorkbench?.participants ?? []) @@ -918,9 +917,9 @@ function ChatWorkspaceInner({ : Promise.resolve([]), enabled: activeWorkbenchId !== null, }); - // Person-facing display names for this workbench's agents (CL-6424), + // Person-facing display names for this workbench's agents, // keyed by participant address. Memoized so `MessageParts`'s memo guard - // (CL-6625) keeps working: a fresh Map every render would read as new + // keeps working: a fresh Map every render would read as new // props on every row and re-render the whole timeline per token. const agentDisplayNames: AgentDisplayNames = useMemo( () => agentDisplayNamesFromAgents(workbenchAgentsQuery.data ?? []), @@ -979,7 +978,7 @@ function ChatWorkspaceInner({ onSettingsOpenChange, ]); - // CL-6796: a routed id missing from the ready workbench list is NOT proof + // A routed id missing from the ready workbench list is NOT proof // the room is gone — create→navigate races the React Query list cache, so // a freshly created id is absent until refetch. Only an authoritative // messages/workbench fetch 404 marks the room gone. While the list miss @@ -995,7 +994,7 @@ function ChatWorkspaceInner({ // Who's live in this workbench right now, beyond the static participants // list — derived from this workbench's own `chat.presence`/ - // `chat.presence.snapshot` stream events (CL-6328), never a second + // `chat.presence.snapshot` stream events, never a second // connection or an HTTP heartbeat poll. Display name and color are // resolved client-side (the roster itself carries only ids) the same way // `typingLabel` resolves a typing ping's principal. @@ -1258,7 +1257,7 @@ function ChatWorkspaceInner({ description={CHAT_STRINGS.noChatSelectedDescription} /> ) : workbenchGone ? ( - // CL-6796: fail closed — never mount Invite / composer / room + // Fail closed — never mount Invite / composer / room // header over a missing or 404'd workbench. Recovery is the // whole stage. Authoritative evidence only (messages 404), never // a stale ready-list miss alone. @@ -1520,7 +1519,7 @@ export function ChatWorkspace({ * `onOpenArtifactInLibrary`. */ readonly onOpenArtifactInLibrary?: (part: Part & { kind: "file" }) => void; /** The classified-inference-failure text bubble's "Fix this connection" - * action — see `WorkbenchTimeline`'s `onFixConnection` (CL-6092). */ + * action — see `WorkbenchTimeline`'s `onFixConnection`. */ readonly onFixConnection?: () => void; /** The approve block's live round-trip — see `WorkbenchTimeline`'s * `approvalActions`. */ diff --git a/packages/chat-ui/src/clock.ts b/packages/chat-ui/src/clock.ts index 9b2da06c2b..13b879a12f 100644 --- a/packages/chat-ui/src/clock.ts +++ b/packages/chat-ui/src/clock.ts @@ -2,7 +2,7 @@ // time and arm backstop timers through, so a test can swap in a fake that // advances synchronously instead of sleeping on the real clock — real-timer // waits on these hooks' 30ms/60ms backstops are exactly what made them flake -// under CI's sharded, CPU-contended `bun run test` (CL-7488). +// under CI's sharded, CPU-contended `bun run test`. export type Clock = { readonly now: () => number; readonly setTimeout: (callback: () => void, ms: number) => unknown; diff --git a/packages/chat-ui/src/composer.test.tsx b/packages/chat-ui/src/composer.test.tsx index 44aeec1ccc..488b3735a5 100644 --- a/packages/chat-ui/src/composer.test.tsx +++ b/packages/chat-ui/src/composer.test.tsx @@ -94,7 +94,7 @@ describe("speechRecognitionConstructor", () => { }); }); -// CL-7201: the composer's stop affordance is a stand-in for "is there a +// The composer's stop affordance is a stand-in for "is there a // turn to cancel" — offered whenever the host says a turn is running, // independent of the composer's own `sending`/`preparing` state (queuing // a follow-up message while a turn runs is still allowed, so the stop diff --git a/packages/chat-ui/src/composer.tsx b/packages/chat-ui/src/composer.tsx index a5bd13a014..f228c04d75 100644 --- a/packages/chat-ui/src/composer.tsx +++ b/packages/chat-ui/src/composer.tsx @@ -39,7 +39,7 @@ export type ComposerSendPayload = { }; /** Imperative seam a host can grab a ref to, so content from outside the - * composer's own tree — the profile card's Mention action (CL-5914) or + * composer's own tree — the profile card's Mention action or * hover-edit of a previous prompt — can land in the active draft. */ export type ComposerHandle = { readonly insertText: (text: string) => void; @@ -308,7 +308,7 @@ export function canSendComposerAction( } /** - * Whether the composer offers a Stop affordance (CL-7201) — a stand-in + * Whether the composer offers a Stop affordance — a stand-in * for "is there a turn to cancel," reported by the host from its own * `isAwaitingReply` signal (the whole in-flight phase, including after * tokens have started streaming — not the tokenless `isPendingReply` @@ -380,7 +380,7 @@ export const Composer = forwardRef< readonly onSend: (payload: ComposerSendPayload) => Promise; /** Defaults to the generic workbench copy — a chat passes one naming its counterpart. */ readonly placeholder?: string; - /** Whether a turn is currently running for this workbench (CL-7201) — + /** Whether a turn is currently running for this workbench — * typically the host's own `isAwaitingReply(streamingReply)`. Absent * or `false` renders no Stop affordance at all. */ readonly running?: boolean; @@ -407,11 +407,11 @@ export const Composer = forwardRef< const [preparing, setPreparing] = useState(false); const [errorMessage, setErrorMessage] = useState(null); const [focused, setFocused] = useState(false); - // CL-7201: guards Stop against a double-click firing two cancel + // Guards Stop against a double-click firing two cancel // requests. A second cancel is harmless server-side (compare-and-set), // but there is no reason to send it. Resets once the host reports the // turn is no longer running -- not on a timer, since a slow cancel - // (CL-7230's ceiling) must stay disabled rather than re-arm early. + // (ceiling) must stay disabled rather than re-arm early. const [stopping, setStopping] = useState(false); const textareaRef = useRef(null); const fileInputRef = useRef(null); @@ -421,7 +421,7 @@ export const Composer = forwardRef< // (an Enter keydown and a click both firing before a render lands) would // both read `sending === false` and both post. This ref is set the // instant a send starts, synchronously ahead of any render, so a second - // call in the same tick is turned away (CL-7198). + // call in the same tick is turned away. const sendInFlightRef = useRef(false); const recognitionRef = useRef(null); const dictatePrefixRef = useRef(""); @@ -727,7 +727,7 @@ export const Composer = forwardRef< function handleStop() { if (stopping || onStop === undefined) return; setStopping(true); - // CL-7201 (Critique finding): a rejected stop request is a FAILED + // (Critique finding): a rejected stop request is a FAILED // cancel, not a slow one -- the `useEffect` above only re-enables // once the host reports `running` has gone false, which never // happens for a request that never reached the server. Without diff --git a/packages/chat-ui/src/default-agent-workbench.ts b/packages/chat-ui/src/default-agent-workbench.ts index 92dee63c0b..de53a2af06 100644 --- a/packages/chat-ui/src/default-agent-workbench.ts +++ b/packages/chat-ui/src/default-agent-workbench.ts @@ -1,6 +1,6 @@ // Find-or-create a bench's 1:1 with a given deployed agent, generalizing // `apps/web/src/myra-workbench.ts`'s original Myra-specific resolution: this -// is the one deliberate find-or-create path in the product (CL-6089), the +// is the one deliberate find-or-create path in the product, the // account's home-workbench land-hop (Myra), where landing twice must mean // the same conversation, never two. Every other agent-chat creation — "+ New // Workbench" picking an agent as a template, a freshly drafted agent's own diff --git a/packages/chat-ui/src/direct-workbench.ts b/packages/chat-ui/src/direct-workbench.ts index bed45d30ac..65753da385 100644 --- a/packages/chat-ui/src/direct-workbench.ts +++ b/packages/chat-ui/src/direct-workbench.ts @@ -1,6 +1,6 @@ // Finding an existing 1:1 by participant address — the read half of the // "open-or-create" pattern the profile card's Message action needs -// (CL-5914), matching by participant address since a profile subject is +//, matching by participant address since a profile subject is // identified by address, not by a fixed workbench title. import type { Workbench } from "./api"; diff --git a/packages/chat-ui/src/inference-failure.ts b/packages/chat-ui/src/inference-failure.ts index f4f7202b5d..eed223d1bd 100644 --- a/packages/chat-ui/src/inference-failure.ts +++ b/packages/chat-ui/src/inference-failure.ts @@ -1,4 +1,4 @@ -// Recognizes a classified inference failure's reply prose (CL-6092) — the +// Recognizes a classified inference failure's reply prose — the // one place `chat-ui` matches against the exact preambles // `@intx/inference/src/default-director.ts`'s `formatInferenceError` // writes for `"credential_failure"` and `"quota_exhausted"` diff --git a/packages/chat-ui/src/loading-state.tsx b/packages/chat-ui/src/loading-state.tsx index 89f8a6959f..4210edbcf8 100644 --- a/packages/chat-ui/src/loading-state.tsx +++ b/packages/chat-ui/src/loading-state.tsx @@ -1,5 +1,5 @@ -// The one warm loader every page/room-level wait in this app renders -// (CL-6370, following CL-6307's setup loader) — a bare skeleton/spinner/grey +// The one warm loader every page/room-level wait in this app renders — +// a bare skeleton/spinner/grey // slab is never the right answer for "we don't know how long this takes": // one honest headline plus a small rotating tip reads as useful rather than // stalled, and it's the same shape everywhere so a reader learns it once. @@ -66,7 +66,7 @@ export function WorkbenchLoadingState({ // (immediate) — reconciles onto this same element rather than // remounting it, so dropping to 0 has to show the loader outright. // Returning early here instead left the loader hidden for good and - // rendered the wait as a blank page (CL-6462). + // rendered the wait as a blank page. if (delayMs <= 0) { setVisible(true); return; diff --git a/packages/chat-ui/src/mailbox-timeline.ts b/packages/chat-ui/src/mailbox-timeline.ts index 22025010c8..6b184f47cd 100644 --- a/packages/chat-ui/src/mailbox-timeline.ts +++ b/packages/chat-ui/src/mailbox-timeline.ts @@ -1,5 +1,5 @@ // Pure adapter from a mailbox thread read onto the timeline item shape -// `use-workbench-feed.ts` already produces (CL-8174 slice 2a/2b). No new wire +// `use-workbench-feed.ts` already produces. No new wire // shape: a mail message becomes exactly the `MessageItem` the rest of // chat-ui already knows how to render, so the timeline never has to branch // on where a message came from. @@ -15,7 +15,7 @@ // through this one file, so swapping to Interchange's native mailbox // thread shape later is a one-file change. // -// A workbench is a plain Interchange tenant now (CL-8083): there is one +// A workbench is a plain Interchange tenant now: there is one // chat room per tenant, so the tenant's own `/me/inbox` mailbox already IS // that room's mail — there is no per-room `refs` filter to apply any more // (the native 1.0 mount dropped `refs` entirely). `roomId` is kept on every @@ -189,7 +189,7 @@ async function listThreads(tenantId: string): Promise { /** * Every message across the tenant's mailbox threads, flattened into one - * timeline (CL-8174 slice 2b) — a root message's own `threadId` stays + * timeline — a root message's own `threadId` stays * absent (see `threadTreeToTimeline`), so it resolves to * `ROOM_FEED_ROOT_THREAD_ID` in `./thread-feed.ts`'s root-feed filter; a * reply's `threadId` is its parent's own uid, matching the diff --git a/packages/chat-ui/src/markdown.test.tsx b/packages/chat-ui/src/markdown.test.tsx index d99a49b215..b4d93dd3b5 100644 --- a/packages/chat-ui/src/markdown.test.tsx +++ b/packages/chat-ui/src/markdown.test.tsx @@ -1,4 +1,4 @@ -// DOM assertions for the CL-5879 markdown subset: bold, lists, and code +// DOM assertions for the safe markdown subset: bold, lists, and code // render as real elements rather than literal `**`/`1.`/backtick text. import { describe, expect, test } from "bun:test"; import { act } from "react"; diff --git a/packages/chat-ui/src/mentions.ts b/packages/chat-ui/src/mentions.ts index a694800e91..76fcb91153 100644 --- a/packages/chat-ui/src/mentions.ts +++ b/packages/chat-ui/src/mentions.ts @@ -40,7 +40,7 @@ function readableLabel(handle: string): string { * participants (the same set `mentionedParticipants` fans a copy to on the * server), each keyed by its own settings-held handle so a picked candidate * always inserts text the server will actually match — while the row shows - * the agent's resolved display name (CL-6424), never the raw slug. Kept + * the agent's resolved display name, never the raw slug. Kept * agent-only so the composer's `/summarize` path (which needs an agent * address) stays honest when it reads from the same helper via the * `agents` prop. diff --git a/packages/chat-ui/src/no-usable-model-banner.tsx b/packages/chat-ui/src/no-usable-model-banner.tsx index 6873ed861f..de4dd4e485 100644 --- a/packages/chat-ui/src/no-usable-model-banner.tsx +++ b/packages/chat-ui/src/no-usable-model-banner.tsx @@ -1,4 +1,4 @@ -// CL-6568: the pre-send half of the fix. A tenant whose one seeded +// The pre-send half of the fix. A tenant whose one seeded // `model_provider` row carries no credential (the shape seeding always // leaves behind) can't run inference — the composer stays live (a person // may still want to leave a note), but this banner says so before they diff --git a/packages/chat-ui/src/pr-thread-view.tsx b/packages/chat-ui/src/pr-thread-view.tsx index 740998550b..afcb392efe 100644 --- a/packages/chat-ui/src/pr-thread-view.tsx +++ b/packages/chat-ui/src/pr-thread-view.tsx @@ -1,5 +1,4 @@ -// The Reviews-room PR thread (CL-6342 screen 3, plus screen 4's turn -// states). Per the mock's own spec note, a thread is a bordered container +// The Reviews-room PR thread. Per the mock's own spec note, a thread is a bordered container // inside the one timeline -- never a separate page or a master-detail // split -- and a reviewer reply uses the same flat avatar-plus-body row as // any other message, so a pull-request thread and a plain conversation @@ -76,7 +75,7 @@ export type PrThreadFailedTurn = { /** Overrides the PR-review copy (`prThreadFailedTitle`/`-Sub`, both * scoped to "review"/"repo" language) for a non-PR consumer of this * same strip — the general chat timeline's own failed-turn notice - * (CL-6332), which has neither. `repo` stays required so every + *, which has neither. `repo` stays required so every * existing PR-thread caller is untouched; these two just take * priority over it when present. */ readonly titleText?: string; diff --git a/packages/chat-ui/src/resume-failed-banner.tsx b/packages/chat-ui/src/resume-failed-banner.tsx index f028a9c9e8..6c024d9236 100644 --- a/packages/chat-ui/src/resume-failed-banner.tsx +++ b/packages/chat-ui/src/resume-failed-banner.tsx @@ -1,4 +1,4 @@ -// CL-6833: mid-turn reopen whose catch-up fetch (`fetchRunningTurn`) fails +// Mid-turn reopen whose catch-up fetch (`fetchRunningTurn`) fails // must not leave the room looking idle. This soft banner names the gap, // quotes a `reportError` ref id, and offers Retry — never a silent // `.catch(() => undefined)`. diff --git a/packages/chat-ui/src/shared-workbenches.ts b/packages/chat-ui/src/shared-workbenches.ts index e06b7bdaeb..04c6358cd2 100644 --- a/packages/chat-ui/src/shared-workbenches.ts +++ b/packages/chat-ui/src/shared-workbenches.ts @@ -1,4 +1,4 @@ -// Which workbenches a profile's shared-workbenches list shows (CL-5919): every +// Which workbenches a profile's shared-workbenches list shows: every // workbench where both the signed-in viewer and the profile's subject are // participants. Mirrors the mock's `openProfile` filter // (`workbenchOrder.filter(members.some(subject))`, capped at 4) over the real diff --git a/packages/chat-ui/src/streaming-reply.test.ts b/packages/chat-ui/src/streaming-reply.test.ts index a1f28d680a..467cc8dbd7 100644 --- a/packages/chat-ui/src/streaming-reply.test.ts +++ b/packages/chat-ui/src/streaming-reply.test.ts @@ -33,7 +33,7 @@ function awaiting(text: string) { return { phase: "awaiting", text } as const; } -describe("nextStreamingReplyState (CL-6115: token deltas fold into a growing reply)", () => { +describe("nextStreamingReplyState (token deltas fold into a growing reply)", () => { test("a non chat.agent event never opens or changes the reply", () => { expect(nextStreamingReplyState(null, { eventType: "chat.typing", data: {} })).toBeNull(); const current = awaiting("hi"); @@ -174,7 +174,7 @@ describe("nextStreamingReplyState (CL-6115: token deltas fold into a growing rep }); }); -describe("nextStreamingReplyState (CL-6376: the typing pulse clears on a dispatch failure too)", () => { +describe("nextStreamingReplyState (the typing pulse clears on a dispatch failure too)", () => { test("a chat.message carrying a turnFailed part clears a pending reply", () => { const state = awaiting(""); expect( @@ -208,10 +208,10 @@ describe("nextStreamingReplyState (CL-6376: the typing pulse clears on a dispatc }); }); -// CL-7201: a user-cancelled turn clears the same pulse a failed one does +// A user-cancelled turn clears the same pulse a failed one does // — `postCancelledNotice` carries `turnCancelled`, not `turnFailed`, so // this is its own case rather than reusing the failure fixture above. -describe("nextStreamingReplyState (CL-7201: the typing pulse clears on a user cancellation too)", () => { +describe("nextStreamingReplyState (the typing pulse clears on a user cancellation too)", () => { test("a chat.message carrying a turnCancelled part settles the turn as replied", () => { const state = awaiting(""); expect( @@ -312,7 +312,7 @@ describe("nextStreamingReplyState (CL-7201: the typing pulse clears on a user ca }); }); -describe("isAwaitingReply (CL-7201: Stop stays up while tokens stream)", () => { +describe("isAwaitingReply (Stop stays up while tokens stream)", () => { test("is true for the whole awaiting phase, including streamed text", () => { expect(isAwaitingReply(awaiting(""))).toBe(true); expect(isAwaitingReply(awaiting("Hello"))).toBe(true); @@ -387,7 +387,7 @@ describe("nextStreamingReplyState (CL-false-no-reply: rendered content, not a li }); }); -describe("nextStreamingReplyState (CL-6432 reopened: a folded run parks after the reply — post-reply tool rounds never re-open the pulse)", () => { +describe("nextStreamingReplyState (a folded run parks after the reply — post-reply tool rounds never re-open the pulse)", () => { test("connector.reply moves the turn to the replied phase — the persisted message takes over the timeline", () => { expect( nextStreamingReplyState( @@ -579,7 +579,7 @@ describe("typingAgentNames", () => { expect(typingAgentNames(awaiting(""), [HUMAN])).toEqual([]); }); - test("a resolved display name wins over the slug-derived one (CL-6424)", () => { + test("a resolved display name wins over the slug-derived one", () => { expect( typingAgentNames( awaiting(""), @@ -669,7 +669,7 @@ describe("lastHumanMessageParts", () => { }); }); -describe("hydrateStreamingReplyFromTurn (CL-6380: reattach snapshot)", () => { +describe("hydrateStreamingReplyFromTurn (reattach snapshot)", () => { test("no running turn resumes to nothing", () => { expect(hydrateStreamingReplyFromTurn(null)).toBeNull(); }); diff --git a/packages/chat-ui/src/streaming-reply.ts b/packages/chat-ui/src/streaming-reply.ts index e99d4e8d83..babd79e16f 100644 --- a/packages/chat-ui/src/streaming-reply.ts +++ b/packages/chat-ui/src/streaming-reply.ts @@ -21,7 +21,7 @@ import { displayNameForAddress, type AgentDisplayNames } from "./agent-display-n import { displayNameFromHandle } from "./timeline"; /** - * The current turn's reply state, phase-tagged (CL-6432 reopened): + * The current turn's reply state, phase-tagged: * * - `"awaiting"` — a turn is in flight and its visible reply hasn't posted * yet: an empty `text` renders the typing pulse, streamed tokens render @@ -113,8 +113,8 @@ function hasTurnFailedPart(data: unknown): boolean { } /** Whether a `chat.message` payload carries `postCancelledNotice`'s - * `turnCancelled` part (see `packages/chat/src/workbench-service.ts`, - * CL-7201) — the cancellation counterpart to `hasTurnFailedPart` above, + * `turnCancelled` part (see `packages/chat/src/workbench-service.ts`) + * — the cancellation counterpart to `hasTurnFailedPart` above, * kept as its own flag rather than reusing `turnFailed` because a user * stopping a turn is not a failure. Same reasoning applies here: a * cancelled turn's dispatch can close with no `chat.agent` events of its @@ -165,8 +165,8 @@ function isRenderedAgentReply(data: unknown): boolean { } /** - * The streaming reply's whole state machine, pure and turn-phase aware - * (CL-6432 reopened). `message.run.started` — the harness's per-dequeued- + * The streaming reply's whole state machine, pure and turn-phase aware. + * `message.run.started` — the harness's per-dequeued- * message turn begin, the same event the chat orchestrator keys new turns * off (see `chat-orchestrator.ts`'s use of `messageRunStarted`) — opens a * fresh awaiting turn. While awaiting, `inference.start`/`reactor.start` @@ -191,7 +191,7 @@ function isRenderedAgentReply(data: unknown): boolean { * `chat.agent` events of their own) — return to idle from any phase. * A `turnCancelled` notice is the exception: it settles `"replied"` so a * late `inference.start` / `reactor.start` / text delta from the still- - * running occurrence (CL-7230's ceiling) cannot reopen the pulse. + * running occurrence (ceiling) cannot reopen the pulse. * Every other event type (tool calls, thinking, usage) leaves the * current state untouched. */ @@ -262,7 +262,7 @@ export function openPendingReply(current: StreamingReplyState): StreamingReplySt /** * The catch-up snapshot a client reattaching mid-turn (a fresh mount after - * navigating away and back, CL-6380) hydrates its streaming reply with, + * navigating away and back) hydrates its streaming reply with, * before the live SSE tail resumes: a running turn with committed text * opens the reply already carrying it; a running turn with none yet (still * in its first inference call) opens the same empty pending state @@ -281,7 +281,7 @@ export function hydrateStreamingReplyFromTurn( * dead — the backstop for both a turn whose stream events never arrive at * all (agent down, SSE dropped mid-reconnect) and one that starts streaming * and then stalls (model OOM, dropped Ollama connection, sidecar crash: all - * routine with local models, CL-6486). This measures the gap *since the + * routine with local models). This measures the gap *since the * last token*, not total turn duration — a healthy local model can * legitimately run 200s+ end to end (round 1 measured ~216s on * `qwen3.8:27b`), so a total-elapsed timeout would fire on working replies. @@ -303,7 +303,7 @@ export function useStreamingReply( ): { readonly streamingReply: StreamingReplyState; /** Set once the backstop above has fired for the turn just cleared — a - * `reportError` refId (CL-6677) the host's honest notice quotes, the + * `reportError` refId the host's honest notice quotes, the * same "ref id + Retry" treatment `postUndeliveredNotice` * (the hub's chat routes) gives a dispatch failure that surfaces server-side. * This is the same class of failure with no server signal at all (a @@ -335,7 +335,7 @@ export function useStreamingReply( useEffect(() => { // Arm for the whole "awaiting" phase, not just its tokenless prefix - // (CL-6486): a token still growing the reply is not evidence the turn + //: a token still growing the reply is not evidence the turn // is alive forever, only that it was alive as of that token. Every // token produces a new `streamingReply` object (see `awaiting`), so // this effect's own dependency below tears down the previous timer and diff --git a/packages/chat-ui/src/strings.ts b/packages/chat-ui/src/strings.ts index f826e665a9..ac2460c889 100644 --- a/packages/chat-ui/src/strings.ts +++ b/packages/chat-ui/src/strings.ts @@ -4,7 +4,7 @@ // "workbench" is the product word for a conversation with an agent (each // one its own tenancy). Nothing in the chat/* components inlines its own // copy; it imports from here. There is no in-package new-workbench dialog -// any more (CL-6138): the one creation verb mints and navigates directly — +// any more: the one creation verb mints and navigates directly — // see `apps/web/src/instant-agent-create.ts`. function joinWithAnd(names: readonly string[]): string { @@ -12,7 +12,7 @@ function joinWithAnd(names: readonly string[]): string { return `${names.slice(0, -1).join(", ")} and ${names[names.length - 1]}`; } -/** Canonical create-workbench CTA and untitled-mint label (CL-6767). */ +/** Canonical create-workbench CTA and untitled-mint label. */ const NEW_WORKBENCH_LABEL = "New workbench"; export const CHAT_STRINGS = { @@ -26,11 +26,11 @@ export const CHAT_STRINGS = { couldNotLoadMessages: "messages", workbenchNotFoundTitle: "This workbench isn't here anymore", workbenchNotFoundDescription: "It may have been deleted, or the link is out of date.", - /** @deprecated Prefer Mission Control / New workbench recovery (CL-6796). */ + /** @deprecated Prefer Mission Control / New workbench recovery. */ workbenchNotFoundAction: "Back to workbenches", workbenchNotFoundMissionControlAction: "Mission Control", workbenchNotFoundNewWorkbenchAction: NEW_WORKBENCH_LABEL, - /** Create-workbench CTA on every mint surface (CL-6767). */ + /** Create-workbench CTA on every mint surface. */ newWorkbenchAction: NEW_WORKBENCH_LABEL, composerPlaceholder: "Send a message… use @ to mention an agent", composerPlaceholderChat: (name: string) => `Message ${name}…`, @@ -95,7 +95,7 @@ export const CHAT_STRINGS = { eventWorkbenchRenamedTo: (to: string): string => `Renamed to "${to}"`, eventBlockResponsePoll: "A vote was recorded", eventBlockResponseForm: "A form was submitted", - /** Plain-text form of the settle notice (CL-6741). EventLine renders + /** Plain-text form of the settle notice. EventLine renders * the same copy with "Plugins" as a `/plugins` link. */ eventConnectionConnected: (displayName: string): string => `${displayName} connected successfully. Manage in Plugins`, @@ -349,7 +349,7 @@ export const CHAT_STRINGS = { workbenchSettingsAgentDetailLoadError: "Couldn't load this agent's instructions", workbenchSettingsAgentDetailSaveError: "Couldn't save these changes — try again.", workbenchSettingsAgentDetailSavedToast: "Instructions saved", - // Scoped rather than a bare "Save" (CL-6215 EMIL #4) — the top-bar Save + // Scoped rather than a bare "Save" — the top-bar Save // right above it in the same view saves the conversation's own General // fields, a different scope entirely; this one only ever writes this // agent's instructions. diff --git a/packages/chat-ui/src/styles.css b/packages/chat-ui/src/styles.css index b074eb93f2..f758f6e7cb 100644 --- a/packages/chat-ui/src/styles.css +++ b/packages/chat-ui/src/styles.css @@ -18,7 +18,7 @@ --chat-ease: var(--ease-out, cubic-bezier(0.23, 1, 0.32, 1)); /* Avatar identity pastels: the single definition of the deterministic - principal palette (CL-7478). Numbered like react-ui's --chart-1..5 + principal palette. Numbered like react-ui's --chart-1..5 series — slot order is the resolution order, not a ranking. These four names are the proposed upstream contract: when @corbits/react-ui's theme ships them natively, delete this block and consume them there. */ @@ -47,7 +47,7 @@ justify-content: center; /* Without this, a short viewport lets the centered loader overflow past this frame's own box and render on top of the page header above it - (CL-6624) — `overflow` makes the frame clip/scroll its own content + — `overflow` makes the frame clip/scroll its own content instead of bleeding into chrome it doesn't own. */ overflow: auto; } @@ -170,14 +170,14 @@ white-space: nowrap; } -/* One primary-action language for the whole surface (CL-6215 EMIL #4): the +/* One primary-action language for the whole surface: the top-bar Save is now a react-ui primary Button, the same visual language as the agent-detail Save below rather than a bespoke black pill. */ .workbench-settings-topbar [data-slot="button"]:disabled, .chat-settings-field-actions [data-slot="button"]:disabled { /* A disabled primary action reads as neutral-gray, never a dimmed orange — dimmed orange still reads as "another orange" on a page - where orange means "act here" (CL-6215 EMIL #3). Scoped to this + where orange means "act here". Scoped to this surface's own buttons rather than react-ui's shared disabled state. */ opacity: 1; border-color: transparent; @@ -315,11 +315,11 @@ gap: 0.5rem; } -/* Sidebar-row pattern (CL-6215 DRAPER): a row's "you can act here" signal +/* Sidebar-row pattern: a row's "you can act here" signal is the 2px inset accent edge, never a background wash — the same rule the shell's own workbench list follows (`apps/web/src/app.css`'s `.shell-ch-row` / sidebar-item-row overrides). A persistent trailing - chevron marks the row as a drill-in, not a toggle (CL-6215 EMIL #1). */ + chevron marks the row as a drill-in, not a toggle. */ .chat-settings-agent-picker-row { display: flex; width: 100%; @@ -470,7 +470,7 @@ /* A static fact ("this agent has @corbits/github-tools") is not a button and should not wear button chrome — no border, a muted tint fill only, never the bordered-and-transparent look `Button variant="outline"` and - `Badge tone="neutral"` share (CL-6215 EMIL #2). */ + `Badge tone="neutral"` share. */ .chat-settings-capability-chip { display: inline-flex; align-items: center; @@ -484,10 +484,9 @@ font-weight: 600; } -/* Invite agent (CL-6215 EMIL #5): a quiet, small, self-start control — the - giant bordered pill it used to render was a flex-stretch accident - (`.chat-settings-field`'s column has no `align-self`, and flex's default - `align-items: stretch` filled the whole row). */ +/* Invite agent: a quiet, small, self-start control — without an explicit + `align-self`, flex's default `align-items: stretch` would fill the + whole row. */ .chat-settings-invite-agent-action { display: inline-flex; align-self: flex-start; @@ -529,7 +528,7 @@ min-width: 8rem; } -/* History (CL-6215 EMIL #8/#9): the current version reads through a +/* History: the current version reads through a hairline inset accent on the row, the same signal every selected/active row in this surface uses — never a colored Badge. */ .chat-settings-history-row-current { @@ -550,7 +549,7 @@ color: var(--muted-foreground); } -/* Plugins directory (CL-6215 DRAPER): a marketplace-style list, not a grid +/* Plugins directory: a marketplace-style list, not a grid of grey cards — one row per connector, search on top, Active before Available. */ .plugins-directory-toolbar { @@ -731,7 +730,7 @@ keeps every group at full width so its own left gutter (2.9rem) reads consistently. `flex-shrink: 0` on the group (below) is what stops a flex column from collapsing two groups onto the same line when content - overflows — the layout crash CL-6784. */ + overflows into the sibling group. */ .chat-timeline { display: flex; flex: 1; @@ -818,7 +817,7 @@ brand's zero-radius language) pulsing while the launches finish. `flex: 1` claims the rest of `.chat-main`'s column instead of sitting flush under `.chat-workbench-header` with no gap — without it the dots - render right on top of the header's bottom rule (CL-6624). Centering + render right on top of the header's bottom rule. Centering in that claimed space, plus its own padding, keeps a real gap from the header at any viewport height; `overflow: auto` is the same containment `.chat-workspace-frame` needs for the pre-workbench @@ -954,7 +953,7 @@ } /* Wraps a message sender's avatar with room for the shared-workbench - tenant-monogram badge (CL-5882), positioned bottom-right — only + tenant-monogram badge, positioned bottom-right — only rendered when the server annotates the sender with a `tenantMonogram` (see `resolveMessageSenderTenant` in `packages/chat/src/routes.ts`). */ @@ -1059,7 +1058,7 @@ align-self: baseline; } -/* CL-5879: the safe markdown subset a message bubble renders. */ +/* The safe markdown subset a message bubble renders. */ .chat-md-paragraph, .chat-md-heading { display: block; @@ -1094,7 +1093,7 @@ color: var(--primary, inherit); } -/* Grouped continuation (CL-6106): the run's second-and-later messages from +/* Grouped continuation: the run's second-and-later messages from the same author drop the avatar/name header entirely — indented to sit under the name above, with the timestamp tucked into the avatar gutter and only revealed on hover/focus rather than shown on every line. */ @@ -1124,7 +1123,7 @@ opacity: 1; } -/* CL-6092: a classified inference failure's reply already says what went +/* A classified inference failure's reply already says what went wrong; this is a low-key next step, not a second alert — a small outline button rather than a bare underlined link, matching the pending-bubble's failed-state buttons. */ @@ -1137,9 +1136,9 @@ align-self: flex-end; } -/* CL-6558: the owner asked for own messages back on the right, evaluated +/* The owner asked for own messages back on the right, evaluated per viewer (`isOwn` in timeline.tsx already keys off `currentUser`, never - a fixed account) — reversing CL-6488's flat, no-alignment timeline. Still + a fixed account) — reversing flat, no-alignment timeline. Still no bubble, no border, no background fill: only the row mirrors, so the avatar sits on the right and the header/text shrink to their own content width against that same edge instead of stretching the full row. `.chat- @@ -1183,7 +1182,7 @@ margin-left: auto; } -/* Optimistic sends (CL-5879): a message the reader just sent renders +/* Optimistic sends: a message the reader just sent renders exactly like a normal message immediately — full opacity, no restyling — with only the small clock glyph next to its header while in flight, and an inline "Not sent — retry" row appended below it (never replacing or @@ -1252,7 +1251,7 @@ align-items: center; justify-content: flex-start; gap: 0.5rem; - /* CL-6772: same left gutter as failed-turn / gen-ui blocks — system + /* Same left gutter as failed-turn / gen-ui blocks — system notices sit under the message column, never centered and never on the signed-in user's right edge. */ margin: 0.15rem 0 0.15rem 2.9rem; @@ -1870,7 +1869,7 @@ color: var(--foreground); } -/* GitHub connect card (CL-6342 screen 2). The row's checkbox control is +/* GitHub connect card. The row's checkbox control is `@corbits/react-ui`'s own `Checkbox`; only the row layout around it (name left, open-PR count right) is workbench-specific. */ .chat-block-connect-steps { @@ -1993,7 +1992,7 @@ box-sizing: border-box; } -/* CL-6568's pre-send banner — a tenant with no usable model sees this +/* pre-send banner — a tenant with no usable model sees this above the composer, before typing a single character, rather than discovering it only after a reply never arrives. Never disables the composer beneath it. */ @@ -2019,7 +2018,7 @@ flex: 1; } -/* CL-6833: catch-up fetch for a still-running turn failed — soft alert +/* Catch-up fetch for a still-running turn failed — soft alert above the activity strip so a mid-turn reopen never looks idle. Same visual weight as the no-model banner; role=alert is set in markup. */ .chat-resume-failed-banner { @@ -2214,7 +2213,7 @@ color: var(--muted-foreground); } -/* Tool-use chips (CL-6466, conforming to mock-spec §12.3): inline chips +/* Tool-use chips (conforming to mock-spec §12.3): inline chips stacked under the agent's prose, one per call — never collapsibles. `.chat-tool-activity` is the stack; each `.chat-tool-activity-row` wraps one chip plus optional detail. The chip hugs its content so a wall of @@ -2649,8 +2648,7 @@ /* Growth is measured in JS (scrollHeight, capped at max-height above) and applied as an inline `height`; this transition is what turns that per-keystroke instant write into a contained ~120ms glide instead of an - instant reflow of the composer's flex siblings (CL-6250 — "the whole - thing moves"). Shrink-on-delete rides the same transition. */ + instant reflow of the composer's flex siblings. Shrink-on-delete rides the same transition. */ @media (prefers-reduced-motion: no-preference) { .chat-composer-input { /* Grows/shrinks in place, not an entrance — DESIGN.md calls for @@ -2700,7 +2698,7 @@ /* Extends the attach/send hit area to >=40px without visually bloating the 36px icon button: a borderless ::after grows the clickable box, since - it's still inside the button's own hit-test region (CL-6250). */ + it's still inside the button's own hit-test region. */ .chat-composer-icon-button { position: relative; display: inline-flex; @@ -2738,7 +2736,7 @@ } } -/* CL-6124: the first-run prompt box for a zero-workbench bench — one big +/* The first-run prompt box for a zero-workbench bench — one big ChatGPT-style box with corner affordances instead of the conversation composer's slim inline row, since there is no workbench here to carry mentions, slash commands, or a pending-bubble hand-off. */ @@ -2824,7 +2822,7 @@ /* Entrance for the mention/slash/help popovers: all three anchor `bottom: 100%` (they open above the caret line), so a single caret-side-aware direction — rising up from the input — covers every - case (CL-6250). */ + case. */ @keyframes chat-popover-enter { from { opacity: 0; @@ -3074,7 +3072,7 @@ color: var(--muted-foreground); } -/* The fork's visible back-reference to its origin message (CL-5948) — +/* The fork's visible back-reference to its origin message — shown atop a sub-thread's timeline, distinct from the breadcrumb's "walk back out" affordance directly above it. */ .chat-thread-origin-banner { @@ -3174,10 +3172,10 @@ /* Message body column: bubble/parts + reaction/pin row share one flex column so chips sit under the bubble instead of as a loose sibling of - the whole header+bubble cluster (CL-6661). Each direct child is a + the whole header+bubble cluster. Each direct child is a block that must keep its own height — no shrinking that would let the tool-activity stack or a failed-turn strip collapse onto the row - below (CL-6784). */ + below. */ .chat-message-body { display: flex; flex-direction: column; @@ -3304,7 +3302,7 @@ prompt — fading in on hover/focus-within like `.chat-pin-toggle` above, plus `data-open` so it stays put while its own picker or menu is open even if focus moves into a portaled menu. - Positioned relative to `.chat-message-row` (CL-6376) — the wrapper + Positioned relative to `.chat-message-row` — the wrapper around this one message's own content, siblings-with but excluding its optional `.chat-day-divider` — rather than `.chat-message-group` as a whole: anchoring to the outer group let the toolbar float up into the @@ -3715,7 +3713,7 @@ white-space: nowrap; } -/* PR thread (CL-6342 screen 3, screen 4 turn states). A thread is a +/* PR thread. A thread is a bordered container inside the one timeline; a reply row matches the mock's `.msg` layout — avatar-plus-body, same shape as any other message. */ @@ -4018,14 +4016,14 @@ color: var(--foreground); } -/* The general chat timeline's own failed-turn row (CL-6376) — a quiet +/* The general chat timeline's own failed-turn row — a quiet inline system line under the same left gutter every message sits under, not a bordered banner: muted danger-tinted text, a small ghost Retry, and "What happened" as an inline disclosure. Reads as part of the conversation rather than an alert dropped into it. Collapsed it is a single flex line (consumer sentence + recovery); the detail disclosure, when open, is the only thing that wraps to a second line - (CL-6784 — not stacked chrome). Width is `calc`'d against the 2.9rem + (not stacked chrome). Width is `calc`'d against the 2.9rem gutter so `max-width:100%` plus that margin never overflows the message column and collapses the next row's height. */ .chat-turn-failed { @@ -4104,12 +4102,12 @@ color: var(--muted-foreground); } -/* CL-7201's cancelled-turn row: the same quiet inline layout as +/* cancelled-turn row: the same quiet inline layout as .chat-turn-failed, but neutral rather than danger-tinted — the user asked for this outcome, so it reads as a plain fact, not a warning, and carries no Retry (the person can just send again). Same width fix as `.chat-turn-failed` — `calc` against the gutter so the row - never overflows and collapses the next message (CL-6784). */ + never overflows and collapses the next message. */ .chat-turn-cancelled { display: flex; align-items: center; diff --git a/packages/chat-ui/src/thread-feed.test.ts b/packages/chat-ui/src/thread-feed.test.ts index 05c0b8b65f..a94fc384e0 100644 --- a/packages/chat-ui/src/thread-feed.test.ts +++ b/packages/chat-ui/src/thread-feed.test.ts @@ -19,7 +19,7 @@ function message( const ROOT = "thr_root"; -describe("selectThreadFeed (CL-6313: one query, filtered by membership)", () => { +describe("selectThreadFeed (one query, filtered by membership)", () => { test("root feed is root-thread membership only", () => { const items = [message("1", ROOT), message("2", "thr_reply"), message("3", ROOT)]; const feed = selectThreadFeed(items, { @@ -107,7 +107,7 @@ describe("selectThreadFeed (CL-6313: one query, filtered by membership)", () => }); }); -describe("threadAffordanceMeta (CL-6313: counts without a request per thread)", () => { +describe("threadAffordanceMeta (counts without a request per thread)", () => { const rows: readonly ThreadActivityRow[] = [ { id: "thr_reply", diff --git a/packages/chat-ui/src/thread-feed.ts b/packages/chat-ui/src/thread-feed.ts index 56c84d7007..c5cca25cf0 100644 --- a/packages/chat-ui/src/thread-feed.ts +++ b/packages/chat-ui/src/thread-feed.ts @@ -1,4 +1,4 @@ -// Deriving what the timeline shows from one loaded mailbox (CL-6313). +// Deriving what the timeline shows from one loaded mailbox. // // Every message carries the thread it belongs to (`GET /messages` stamps // it — see `resolveThreadMembership` in `packages/chat/src/routes.ts`), so diff --git a/packages/chat-ui/src/timeline.test.ts b/packages/chat-ui/src/timeline.test.ts index 2820e722cc..1c20b8dff3 100644 --- a/packages/chat-ui/src/timeline.test.ts +++ b/packages/chat-ui/src/timeline.test.ts @@ -12,7 +12,7 @@ function agentJoinedPart(address: string): Part & { kind: "event" } { }; } -describe("friendlyEventText — workbench.agent-joined (CL-6594)", () => { +describe("friendlyEventText — workbench.agent-joined", () => { test("names the agent by its participant handle", () => { const participants: readonly ParticipantRecord[] = [ { address: "run_scout@dana.localhost", handle: "scout" }, @@ -40,7 +40,7 @@ describe("friendlyEventText — workbench.agent-joined (CL-6594)", () => { expect(friendlyEventText(part, [])).toBe("An agent joined"); }); - test("prefers the resolved display name over the handle slug (CL-6424)", () => { + test("prefers the resolved display name over the handle slug", () => { const participants: readonly ParticipantRecord[] = [ { address: "run_myra@dana.localhost", handle: "myra" }, ]; @@ -54,7 +54,7 @@ describe("friendlyEventText — workbench.agent-joined (CL-6594)", () => { }); }); -describe("friendlyEventText — connection.connected (CL-6741)", () => { +describe("friendlyEventText — connection.connected", () => { test("names the connected service and points at Plugins", () => { const part: Part & { kind: "event" } = { kind: "event", diff --git a/packages/chat-ui/src/timeline.tsx b/packages/chat-ui/src/timeline.tsx index 0cb761adf0..ff5669cbb3 100644 --- a/packages/chat-ui/src/timeline.tsx +++ b/packages/chat-ui/src/timeline.tsx @@ -58,7 +58,7 @@ import type { FailedTurnModelChoice } from "./failed-turn-models"; * Which affordance a message's thread row offers: * - `"reply"` (root feed) — open/create the depth-1 thread for this message * - `"fork"` (inside an open thread) — spawn a sub-thread rooted at this - * message, the first-class fork affordance from CL-5948 ("something + * message, the first-class fork affordance ("something * Slack doesn't have"). The two-level cap is enforced server-side; this * UI never needs to reason about depth itself. * @@ -266,7 +266,7 @@ function senderDisplay( const isAgent = isAgentAddress(matched.address); const senderName = sender.name; const wireName = senderName !== null && senderName.trim().length > 0 ? senderName : undefined; - // An agent renders its resolved display name (CL-6424) — the wire + // An agent renders its resolved display name — the wire // name when the server sent one, else the `/agents` snapshot's — and // only then falls back to a human reading of its handle ("myra" -> // "Myra"). The raw @handle is a wire identifier, kept to the tooltip @@ -378,7 +378,7 @@ function TextBubble({ sender: MessageSender | undefined; participants: readonly ParticipantRecord[]; currentUser: CurrentUser | undefined; - /** Resolved agent display names (CL-6424) — the message header shows + /** Resolved agent display names — the message header shows * these, never the raw handle slug. */ readonly agentDisplayNames?: AgentDisplayNames; onOpenProfile?: (subject: ProfileSubject) => void; @@ -390,7 +390,7 @@ function TextBubble({ * modern chat UIs use rather than repeating the header on every line. */ showHeader?: boolean; /** Set while this reader's own send is still in flight or has failed - * (CL-6251/CL-5879) — the bubble renders exactly like any confirmed + * — the bubble renders exactly like any confirmed * message; `"sending"` only adds `PendingGlyph` next to the timestamp, * `"failed"` appends `PendingFailedRow` inside this same bubble, never * a different layout. */ @@ -647,8 +647,8 @@ export type FailedTurnRecovery = { }; /** - * The general chat timeline's failed-turn treatment (CL-6332, redesigned - * CL-6376 to match the timeline's own idiom rather than borrow + * The general chat timeline's failed-turn treatment, matching the + * timeline's own idiom rather than borrowing * `PrFailedTurnStrip`'s bordered banner — that component stays as-is for * the PR-review surface it was built for, but reusing it here read as a * floating alert dropped mid-conversation). A text part @@ -677,7 +677,7 @@ function FailedTurnStrip({ agentDisplayNames, }: { readonly item: TimelineMessageItem; - /** Resolved agent display names (CL-6424) — the strip names the agent + /** Resolved agent display names — the strip names the agent * whose turn failed, never its raw handle slug. */ readonly agentDisplayNames?: AgentDisplayNames; /** The undelivered-turn notice's own text (`postUndeliveredNotice`, @@ -810,7 +810,7 @@ function FailedTurnStrip({ } /** - * The cancelled-turn counterpart to `FailedTurnStrip` (CL-7201) — same + * The cancelled-turn counterpart to `FailedTurnStrip` — same * quiet inline placement, deliberately simpler: no Retry (the user * chose to stop this; resending is just typing again, not recovering * from an error) and no disclosure, since `postCancelledNotice`'s own @@ -927,7 +927,7 @@ export function messageText(item: MessageItem): string { } /** - * Whether a timeline row should expose message social chrome (CL-6739) — + * Whether a timeline row should expose message social chrome — * add-reaction, reply-in-thread, overflow/ellipsis, reaction chips, and the * thread-summary affordance. System event lines, failed-turn strips, * connect cards, and classified inference-failure bubbles are not @@ -958,7 +958,7 @@ export function offersMessageSocialChrome(item: MessageItem): boolean { /** * System notices (event-only rows) are never "own" for any viewer — - * DESIGN.md Message Alignment and CL-6772. Join / rename / membership + * see DESIGN.md's Message Alignment section. Join / rename / membership * lines often carry the acting principal as `sender`, but they still * align left; treating them as own put them on the signed-in user's * right edge. @@ -1039,7 +1039,7 @@ export function collapseAgentJoinRuns( } /** - * A failed send's inline recovery row (CL-6251/CL-5879): appended below + * A failed send's inline recovery row: appended below * the bubble text of the exact same message group a confirmed message * would render as — never a status line elsewhere on the page, * disconnected from the message it describes. @@ -1272,7 +1272,7 @@ function MessageHoverToolbar({ } /** - * `MessageParts`'s own memo guard (CL-6625): a streamed token, a typing + * `MessageParts`'s own memo guard: a streamed token, a typing * ping, or a presence update re-renders `WorkbenchTimeline`'s parent with a * freshly-built `items` array (`mergeStreamingReply`/`mergePendingSends` in * `chat-workspace.tsx`), but every *unchanged* message keeps its own @@ -1354,7 +1354,7 @@ function MessagePartsInner({ readonly onOpenArtifact?: (part: Part & { kind: "file" }) => void; readonly onOpenArtifactInLibrary?: (part: Part & { kind: "file" }) => void; /** The classified-inference-failure text bubble's quiet "Fix this - * connection" action (CL-6092) — undefined renders no affordance at + * connection" action — undefined renders no affordance at * all, the same "no port, no feature" contract every other optional * action here follows. No chat-ui component owns routing: the host * decides where "fix" goes (Plugins' connect panel today). */ @@ -1368,7 +1368,7 @@ function MessagePartsInner({ * pending item (`item.pendingStatus === "failed"`) with no actions * wired, the failed row simply doesn't render. */ readonly pendingActions?: PendingActions; - /** The failed-turn strip's Retry/what-happened actions (CL-6332) — + /** The failed-turn strip's Retry/what-happened actions — * see `WorkbenchTimeline`'s own doc of the same two props. Undefined * renders the strip with inert buttons, never hiding the strip * itself: a failed turn stays visible even on a host that wires no @@ -1379,7 +1379,7 @@ function MessagePartsInner({ ) => void | Promise; readonly onWhatHappenedFailedTurn?: (item: TimelineMessageItem) => void; readonly failedTurnRecovery?: FailedTurnRecovery; - /** Resolved agent display names (CL-6424) — headers, strips, and event + /** Resolved agent display names — headers, strips, and event * lines show these, never raw handle slugs. */ readonly agentDisplayNames?: AgentDisplayNames; }) { @@ -1388,12 +1388,12 @@ function MessagePartsInner({ // none of the round-trips below — thread, context menu — since every // one of them targets a server-issued message id that doesn't exist // yet for this item. System / error / connect rows - // (CL-6739) likewise offer none of the social chrome — see + // likewise offer none of the social chrome — see // `offersMessageSocialChrome`. const isPending = item.pendingStatus !== undefined; const offersSocialChrome = !isPending && offersMessageSocialChrome(item); // System notices (join / rename / membership) never read as own even when - // this viewer triggered them — see `isSystemNoticeItem` (CL-6772). + // this viewer triggered them — see `isSystemNoticeItem`. const isOwn = currentUser !== undefined && item.sender !== undefined && @@ -1589,7 +1589,7 @@ const MessageParts = memo(MessagePartsInner, messagePartsPropsEqual); * itself a plain text bubble (an event line or a fallback block always * gets its own header on the next real bubble). A pending (optimistic) * send groups exactly like any confirmed message from the same author — - * CL-5879 renders it through this same path, not a separate tier. + * Renders it through this same path, not a separate tier. */ function isGroupedWithPrevious( item: TimelineMessageItem, @@ -1747,7 +1747,7 @@ export function WorkbenchTimeline({ * `artifactId` (see `ArtifactChip`). */ readonly onOpenArtifactInLibrary?: (part: Part & { kind: "file" }) => void; /** The classified-inference-failure text bubble's quiet "Fix this - * connection" action (CL-6092) — see `MessageParts`' own doc. */ + * connection" action — see `MessageParts`' own doc. */ readonly onFixConnection?: () => void; /** The approve block's live round-trip — the host's read/approve/reject * on the platform approval a card references. Undefined renders every @@ -1760,7 +1760,7 @@ export function WorkbenchTimeline({ * `PendingActions`. Undefined renders a failed pending item with no * recovery affordance at all (still shown as failed). */ readonly pendingActions?: PendingActions; - /** Retry action offered on a failed-turn strip (CL-6332) — the + /** Retry action offered on a failed-turn strip — the * server's undelivered-turn notice (`agent_turns` closed `failed`, * see `postUndeliveredNotice`), rendered via `FailedTurnStrip` above. * Undefined still renders the strip, just with a Retry button that @@ -1788,7 +1788,7 @@ export function WorkbenchTimeline({ /** Incoming-slot pulse (typing / pending-reply) rendered after the last * message so it sits where the next agent reply will land. */ readonly footer?: ReactNode; - /** Resolved agent display names (CL-6424) — headers, join lines, and + /** Resolved agent display names — headers, join lines, and * empty states show these, never raw handle slugs. Undefined keeps the * slug-derived fallback, so a host that never resolves names renders * exactly what it always did. */ @@ -1930,11 +1930,11 @@ export function WorkbenchTimeline({ !isSameCalendarDay(new Date(previous.createdAt), new Date(item.createdAt)); // Keyed by `clientId` (falling back to `id`) when present: a // pending send and the confirmed message that later reconciles - // it (CL-6251's wire `clientId`) share this key, so React + // it (wire `clientId`) share this key, so React // updates the same DOM node in place — avatar, header and all — // rather than unmounting a "sending" bubble and mounting an - // unrelated "confirmed" one, which is what used to read as an - // unsent→sent swap (CL-6251, reopened). + // unrelated "confirmed" one, which would read as an + // unsent→sent swap. const key = item.clientId ?? item.id; if (item.streaming === true) { return ( diff --git a/packages/chat-ui/src/turn-activity.test.ts b/packages/chat-ui/src/turn-activity.test.ts index c377d316b7..52e3bd59e9 100644 --- a/packages/chat-ui/src/turn-activity.test.ts +++ b/packages/chat-ui/src/turn-activity.test.ts @@ -6,7 +6,7 @@ function agentEvent(inner: unknown) { return { eventType: "chat.agent", data: inner }; } -describe("nextTurnActivityState (CL-6196: live tool-call and thinking states)", () => { +describe("nextTurnActivityState (live tool-call and thinking states)", () => { test("a non chat.agent event never opens or changes the activity", () => { expect(nextTurnActivityState(null, { eventType: "chat.typing", data: {} }, 0)).toBeNull(); }); diff --git a/packages/chat-ui/src/typing-indicator.tsx b/packages/chat-ui/src/typing-indicator.tsx index 570c1a45aa..660e156f47 100644 --- a/packages/chat-ui/src/typing-indicator.tsx +++ b/packages/chat-ui/src/typing-indicator.tsx @@ -65,7 +65,7 @@ export function isTypingStateExpired(state: TypingState, now: number): boolean { } /** A typing/presence principal's friendly label — prefers the signed-in - * reader's own `currentUser.name` when the principal is self (CL-6655), + * reader's own `currentUser.name` when the principal is self, * else the participant handle, else the same deterministic "Member" * fallback the timeline uses. Never a raw address. */ export function typingLabel( diff --git a/packages/chat-ui/src/use-optimistic-sends.ts b/packages/chat-ui/src/use-optimistic-sends.ts index f40653db04..2d6e275bfd 100644 --- a/packages/chat-ui/src/use-optimistic-sends.ts +++ b/packages/chat-ui/src/use-optimistic-sends.ts @@ -46,7 +46,7 @@ export function resetPendingSendNonceForTests(): void { } /** Random per-page-load prefix: a pending nonce doubles as the message's - * wire `clientId` (CL-6251), which the server persists — a bare counter + * wire `clientId`, which the server persists — a bare counter * would repeat `pending_1` on every reload, colliding with a prior * session's stored clientId in the same workbench (wrong-message matches * in `mergePendingSends`, duplicate React keys in `WorkbenchTimeline`). */ @@ -133,7 +133,7 @@ export function useOptimisticSends(args: { readonly pendingParentMessageId: string | null; readonly openThreadById: (threadId: string) => void; /** Every other participant's mailbox address this send goes `to` - * (CL-8175) — the room's own `Workbench.participants`, minus the + * — the room's own `Workbench.participants`, minus the * signed-in sender. */ readonly recipientAddresses: readonly string[]; /** The loaded feed's own messages, used only to resolve the RFC @@ -176,7 +176,7 @@ export function useOptimisticSends(args: { // called with, which stays fixed for the life of that async call. This // ref tracks the live value so a continuation resolving after the reader // has switched benches can tell its own send is no longer for the - // workbench currently on screen (CL-7198). + // workbench currently on screen. const activeWorkbenchIdRef = useRef(activeWorkbenchId); useEffect(() => { activeWorkbenchIdRef.current = activeWorkbenchId; @@ -185,7 +185,7 @@ export function useOptimisticSends(args: { async function sendPending(nonce: string, text: string): Promise { if (activeWorkbenchId === null) return; // The mailbox send wire (`{ to, body, inReplyTo? }`) has no room for - // an attachment — dropped rather than shimmed (CL-8175); `parts` below + // an attachment — dropped rather than shimmed; `parts` below // is still text-only, which is exactly what `partsForSend` already // produces for an empty attachments array. const trimmedBody = text.trim(); @@ -266,7 +266,7 @@ export function useOptimisticSends(args: { }, ); // Seed / bump the threads cache before navigation opens the just- - // created id (CL-6660). Without the row, `useThreadNavigation`'s + // created id. Without the row, `useThreadNavigation`'s // stale-id effect would drop `openThreadId` the moment it was set. if (confirmed.threadId !== undefined) { const threadId = confirmed.threadId; @@ -286,7 +286,7 @@ export function useOptimisticSends(args: { // A continuation that started before the reader switched to a // different workbench must not drag them back into this one's // thread — `useThreadNavigation` already reset the open thread on - // that switch; re-opening it here would undo that reset (CL-7198). + // that switch; re-opening it here would undo that reset. if (pendingParentMessageId !== null && activeWorkbenchIdRef.current === activeWorkbenchId) { openThreadById(threadId); } @@ -296,7 +296,7 @@ export function useOptimisticSends(args: { // is owed, so show the typing indicator now rather than sitting // silent until the turn's first stream event arrives. if (hasAgentParticipant) noteAwaitingReply(); - // No follow-up GET (CL-6328): the confirmed row is already written + // No follow-up GET: the confirmed row is already written // above, and this workbench's own `chat.message` echo (dedup'd by // `clientId`/`id` in `applyStreamMessage`) is what every *other* // connection learns the send from. Sending is real activity, so it diff --git a/packages/chat-ui/src/use-thread-navigation.ts b/packages/chat-ui/src/use-thread-navigation.ts index bcc0bcbdd0..14516a824c 100644 --- a/packages/chat-ui/src/use-thread-navigation.ts +++ b/packages/chat-ui/src/use-thread-navigation.ts @@ -54,7 +54,7 @@ export function useThreadNavigation(args: { args; const [openThreadId, setOpenThreadId] = useState(null); const [pendingParentMessageId, setPendingParentMessageId] = useState(null); - // A thread id `openThreadById` just set (first reply create, CL-6660) + // A thread id `openThreadById` just set (first reply create) // can land one render before the seeded `GET /threads` row is visible // to this hook. Hold it so the stale-id effect below does not drop a // brand-new open back to the root feed; clear once the row appears or diff --git a/packages/chat-ui/src/use-workbench-feed.ts b/packages/chat-ui/src/use-workbench-feed.ts index 36533bb333..4ef87e2455 100644 --- a/packages/chat-ui/src/use-workbench-feed.ts +++ b/packages/chat-ui/src/use-workbench-feed.ts @@ -1,10 +1,10 @@ // One workbench's feed: the mailbox reads that make it up, every view the // timeline can derive from them, and the single refresh that keeps them -// current (CL-6313; CL-8174 slice 2b). +// current. // // The feed reads through `@corbits/mailbox`'s own thread routes rather than // `@corbits/chat`'s message/thread routes now: a workbench is a plain -// tenant (CL-8083), and every message posted to it already lands in the +// tenant, and every message posted to it already lands in the // mailbox via the same fan-out the Inbox reads (see // `packages/chat-ui/src/mailbox-timeline.ts`). Thread membership is a // property of a message, not a function of which endpoint was called, so @@ -73,7 +73,7 @@ export function chatThreadsQueryKey(tenantId: string, workbenchId: string | null /** * The `GET /threads` cache shape — shared by the optimistic-send path that * seeds a just-created reply thread before `openThreadById` runs - * (CL-6660). + *. */ export type ThreadsQueryData = { readonly rootThreadId: string; @@ -85,7 +85,7 @@ export type ThreadsQueryData = { * its activity. A first in-reply-to send uses this to seed the row with * `parentMessageId` before navigation opens the thread; a stream echo * uses it when the row is still missing so "N replies" and open-by-id - * have something to hang onto without a refetch (CL-6660). + * have something to hang onto without a refetch. * * When the row already exists, `parentMessageId` fills in only if the * cached row still has `null` (a stream-seeded stub catching up to the @@ -171,7 +171,7 @@ export function useWorkbenchFeed(args: { // not a bare timer handle — so a pending refresh for one workbench can // never make another workbench's `refreshFeed()` call early-return, and // never fires an invalidation against a query key that is no longer the - // active one (CL-7198). + // active one. const refreshTimerRef = useRef< | { readonly tenantId: string; diff --git a/packages/chat-ui/src/use-workbench-stream.ts b/packages/chat-ui/src/use-workbench-stream.ts index 6d4c3d235f..663a6f4cdb 100644 --- a/packages/chat-ui/src/use-workbench-stream.ts +++ b/packages/chat-ui/src/use-workbench-stream.ts @@ -150,7 +150,7 @@ export function useWorkbenchStream( // "chat.message" is every message posted into the room; // "chat.agent" carries the agent-run events (inference progress, // turn lifecycle) that sit between them. "chat.presence"/ - // "chat.presence.snapshot" are the who's-here roster (CL-6328), piggybacked + // "chat.presence.snapshot" are the who's-here roster, piggybacked // on this same connection rather than a second stream. // "chat.workbenches-mutated" tells the host sidebar the tenant's // workbench list changed (a specialist minted while this stream is diff --git a/packages/chat-ui/src/wire/agent-address.ts b/packages/chat-ui/src/wire/agent-address.ts index 17398d0b6c..0778c03ef3 100644 --- a/packages/chat-ui/src/wire/agent-address.ts +++ b/packages/chat-ui/src/wire/agent-address.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. // Agent-address helpers shared by this package's own fan-out // (`routes.ts`) and by `@corbits/chat-ui`'s composer: splitting an diff --git a/packages/chat-ui/src/wire/blocks.ts b/packages/chat-ui/src/wire/blocks.ts index d13584d907..7df16ec2c0 100644 --- a/packages/chat-ui/src/wire/blocks.ts +++ b/packages/chat-ui/src/wire/blocks.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. import { type } from "arktype"; @@ -65,7 +62,7 @@ export const StreamBlockData = type({ }).onDeepUndeclaredKey("delete"); export type StreamBlockData = typeof StreamBlockData.infer; -// An agent-authored "connect this service" card (CL-6393), the +// An agent-authored "connect this service" card, the // generalization of `connect-github` to every connector and MCP preset: // `request_connection` posts one of these instead of a prose deep link. // It carries only the framing the agent decided — which service, and the diff --git a/packages/chat-ui/src/wire/consumer-inference-text.ts b/packages/chat-ui/src/wire/consumer-inference-text.ts index fc6612eb9d..82bcf961e4 100644 --- a/packages/chat-ui/src/wire/consumer-inference-text.ts +++ b/packages/chat-ui/src/wire/consumer-inference-text.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. /** * Person-facing inference copy. HTTP status, raw provider dumps, and @@ -24,7 +21,7 @@ export const CONSUMER_INFERENCE_FAILURE_NOTICE = /** * Byte-for-byte copies of the two preambles `@intx/inference`'s * `formatInferenceError` writes for `credential_failure` and - * `quota_exhausted`. Kept here so the bench-list preview path (CL-6735) + * `quota_exhausted`. Kept here so the bench-list preview path * can refuse them without depending on `@corbits/chat-ui`. The chat-ui * drift guard still owns matching these against the published director. */ @@ -68,7 +65,7 @@ export function isClassifiedInferenceFailureText(text: string): boolean { } /** - * Bench-list / sidebar preview copy (CL-6735): never the full failure + * Bench-list / sidebar preview copy: never the full failure * paragraph, never HTTP/raw provider dumps — a short consumer sentence * when the text is a classified failure. */ diff --git a/packages/chat-ui/src/wire/display-name.ts b/packages/chat-ui/src/wire/display-name.ts index ccc91881c3..a70205f549 100644 --- a/packages/chat-ui/src/wire/display-name.ts +++ b/packages/chat-ui/src/wire/display-name.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. // A workflow definition's person-facing display name, derived once here // so every caller that decides "what does this agent look like to a @@ -50,7 +47,7 @@ export function humanizeSlug(slug: string): string { * `wfd_…`, …, see `./id-leak-guard`) — the product rule is that a person * never sees an internal identifier, so a caller that reaches this * function with a run id where a definition's slug belongs gets a loud - * failure instead of a Title-Cased leak like "Run 737a058d…" (CL-6471). + * failure instead of a Title-Cased leak like "Run 737a058d…". */ export function deriveDisplayName(definition: { readonly name: string; diff --git a/packages/chat-ui/src/wire/id-leak-guard.ts b/packages/chat-ui/src/wire/id-leak-guard.ts index 547d040b54..3049da6aac 100644 --- a/packages/chat-ui/src/wire/id-leak-guard.ts +++ b/packages/chat-ui/src/wire/id-leak-guard.ts @@ -1,26 +1,23 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. -// The systemic guard CL-6471 calls for: a person never sees an internal +// The systemic guard this module enforces: a person never sees an internal // identifier — not as a participant's name, not in a join/system line, // not in a greeting, not in a chat title. This has recurred repeatedly // (a raw definitionId/runId in insights, a `writing_systems` id in a -// Myra reply, and CL-6471's own "Run 737a058d…" / "I'm run_737a…") each +// Myra reply, and its own "Run 737a058d…" / "I'm run_737a…") each // time as a one-off display-time patch; this module is the one place // every id-generating prefix is named, so a new leak is a missed test // run rather than a missed grep. // // Prefix words mirror `@intx/hub-common`'s `generateId` (vendored; // upstream source: `packages/hub-common/src/ids.ts`'s `PREFIXES`) for -// the six kinds CL-6471 names explicitly — a workflow run, a workflow +// the six kinds this guard names explicitly — a workflow run, a workflow // definition, a tenant, a principal, an asset, and a git token — each // normally followed by `_` and 32 lowercase hex characters (`run_737a…`). // // Matched with either `_`, a space, or `-` as the separator, not just -// `_`: `humanizeSlug`'s Title Case reading of a leaked id (CL-6471's own +// `_`: `humanizeSlug`'s Title Case reading of a leaked id (own // "Run 737a058d48006e2bde12559576f422e0") replaces the underscore with a // space, so the raw and the humanized-leak forms both need to trip this. const ID_PREFIX_WORDS = ["run", "wfd", "tnt", "prn", "ast", "gtk"] as const; @@ -44,7 +41,7 @@ export function assertNoLeakedInternalId(value: string, context: string): void { throw new Error( `${context} carries an internal identifier ("${value}"); a person ` + "must never see one — resolve the real name at the source instead " + - "of rendering the id (CL-6471)", + "of rendering the id", ); } } diff --git a/packages/chat-ui/src/wire/mentions.ts b/packages/chat-ui/src/wire/mentions.ts index f5b1b7e7db..61789f04d6 100644 --- a/packages/chat-ui/src/wire/mentions.ts +++ b/packages/chat-ui/src/wire/mentions.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. // The "@ + handle" mention rule: the single wire-level contract between // the composer (`@corbits/chat-ui`'s `mentions.ts`, which derives diff --git a/packages/chat-ui/src/wire/participants.ts b/packages/chat-ui/src/wire/participants.ts index 2d3632c0e5..3884fb41ec 100644 --- a/packages/chat-ui/src/wire/participants.ts +++ b/packages/chat-ui/src/wire/participants.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. // Workbench participant records: the settings-backed source of mention // handles. `chat/participants` (see `routes.ts`'s `ChatNamespaceSchemas`) diff --git a/packages/chat-ui/src/wire/parts.ts b/packages/chat-ui/src/wire/parts.ts index 1e0bab1f9a..18dba35f55 100644 --- a/packages/chat-ui/src/wire/parts.ts +++ b/packages/chat-ui/src/wire/parts.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. import { type } from "arktype"; @@ -14,7 +11,7 @@ export const TextPart = type({ kind: "'text'", text: "string", /** Set only on the undelivered-turn notice `postUndeliveredNotice` - * posts in an unreachable agent's own voice (CL-6332) — the client's + * posts in an unreachable agent's own voice — the client's * one signal that this particular text bubble is a failed turn's * notice, not an ordinary reply, so it renders the failed-turn strip * (`PrFailedTurnStrip`) instead of a plain bubble. Absent on every @@ -27,7 +24,7 @@ export const TextPart = type({ "turnFailedReason?": "'model_unavailable' | 'tools_unsupported'", /** Set only on the cancelled-turn notice `postCancelledNotice` * (`./workbench-service.ts`) posts in the cancelled agent's own voice - * (CL-7201) — distinct from `turnFailed`: a user cancelling a turn is + * — distinct from `turnFailed`: a user cancelling a turn is * not a failure, and the frontend renders it with its own honest copy * rather than `FailedTurnStrip`'s "didn't reply" framing. Absent on * every other text part. */ @@ -64,7 +61,7 @@ export type BlockPart = typeof BlockPart.infer; // content the codec is encoding fresh). Exactly one of those two must be // present. `artifactId` is an orthogonal, optional link back to a Library // artifact (see `@corbits/artifacts`) — set when this file is also a -// persisted Library row (e.g. a workflow finalize tool's output, CL-6000), +// persisted Library row (e.g. a workflow finalize tool's output), // independent of whether the bytes themselves also live in chat's own blob // store. export const FilePart = type({ diff --git a/packages/chat-ui/src/wire/stream-events.ts b/packages/chat-ui/src/wire/stream-events.ts index ebfab24773..d643ba0ff5 100644 --- a/packages/chat-ui/src/wire/stream-events.ts +++ b/packages/chat-ui/src/wire/stream-events.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. // The wire contract for every event a workbench's `/stream` SSE // connection carries — arktype schemas so a payload is validated at the diff --git a/packages/chat-ui/src/wire/tools-unsupported.ts b/packages/chat-ui/src/wire/tools-unsupported.ts index 52aea11122..998135aa3d 100644 --- a/packages/chat-ui/src/wire/tools-unsupported.ts +++ b/packages/chat-ui/src/wire/tools-unsupported.ts @@ -1,8 +1,5 @@ -// Mirrored from packages/chat/src (CL-8148 T5b): apps/web and @corbits/chat-ui -// must not import @corbits/chat, a server-only package. This is the browser- -// facing half of the same wire contract the hub's chat routes still speak; -// once the hub moves onto native mail threads (T5a/T5c) this file becomes -// the one source of truth and packages/chat's copy goes away. +// Mirrored from packages/chat/src: apps/web and @corbits/chat-ui must not +// import @corbits/chat, a server-only package. /** * Named consumer copy for an inference failure whose real cause is that diff --git a/packages/chat-ui/src/workbench-presence.ts b/packages/chat-ui/src/workbench-presence.ts index cb7a7bff22..714fe4473a 100644 --- a/packages/chat-ui/src/workbench-presence.ts +++ b/packages/chat-ui/src/workbench-presence.ts @@ -1,5 +1,5 @@ // A workbench's live "who's here" roster, driven off the same `/stream` -// connection as every other live update (CL-6328) — never a second +// connection as every other live update — never a second // connection or an HTTP heartbeat poll. `chat.presence.snapshot` seeds the // roster the moment the stream opens; `chat.presence` deltas // (`packages/chat/src/workbench-presence.ts`) keep it current from there. diff --git a/packages/chat-ui/src/workbench-settings/agents-section.test.ts b/packages/chat-ui/src/workbench-settings/agents-section.test.ts index a29524c75f..b312c05c1f 100644 --- a/packages/chat-ui/src/workbench-settings/agents-section.test.ts +++ b/packages/chat-ui/src/workbench-settings/agents-section.test.ts @@ -1,4 +1,4 @@ -// CL-6215 EMIL #8: the History table's raw backend commit message names +// EMIL #8: the History table's raw backend commit message names // the agent in full-sentence form and repeats verbatim across seed rows — // these are the pure pieces that turn it into a short per-row change // summary and soften repeated runs, independent of the DOM-mounted diff --git a/packages/chat-ui/src/workbench-settings/agents-section.tsx b/packages/chat-ui/src/workbench-settings/agents-section.tsx index 0bd70e9640..a2efc89fc3 100644 --- a/packages/chat-ui/src/workbench-settings/agents-section.tsx +++ b/packages/chat-ui/src/workbench-settings/agents-section.tsx @@ -1,5 +1,5 @@ // Agents: master-detail over every agent participant this workbench has -// (CL-6215). The list (every invited agent, Invite agent, the autonomy +//. The list (every invited agent, Invite agent, the autonomy // callout) is the whole surface until one is picked; clicking a row opens // that agent's detail — the editor the old, separate "Myra" tab rendered, // generalized to any agent: name/instructions (`getAgentInstructions`/ @@ -407,7 +407,7 @@ type CatalogState = * tenant — an entry with none has no provider connected anywhere up the * ancestor chain, so it is left off the picker rather than offered to fail * at launch. Embedding / Hugging Face / GGUF path names are also omitted - * (CL-6744) via `chatCapableModels`. Labeled by its top (highest-priority) + * via `chatCapableModels`. Labeled by its top (highest-priority) * offering's provider — the same one `getResolvedCatalog`'s resolution * would pick. */ function connectedModelOptions( @@ -429,7 +429,7 @@ function connectedModelOptions( } /** - * The obvious, top-of-detail way to change an agent's model (CL-6272.3) — + * The obvious, top-of-detail way to change an agent's model — * the "Add a capability" flow below stays for tools/skills/models added * one at a time, but a model is a property every agent already has one * of, not an optional add-on, so it gets its own labeled control that @@ -739,7 +739,7 @@ function CapabilitiesBlock({ * skill-pin route files), but it's written as a full sentence naming the * agent — redundant on a page that's already scoped to this one agent, and * repetitive across rows. This turns it into the short change summary the - * history table actually shows (CL-6215 EMIL #8), falling back to the raw + * history table actually shows, falling back to the raw * message for anything this doesn't recognize rather than hiding it. */ export function summarizeHistoryMessage(message: string): string { if (/^Update agent instructions for /.test(message)) { diff --git a/packages/chat-ui/src/workbench-settings/members-section.tsx b/packages/chat-ui/src/workbench-settings/members-section.tsx index 59b22f6106..77fa3c5c72 100644 --- a/packages/chat-ui/src/workbench-settings/members-section.tsx +++ b/packages/chat-ui/src/workbench-settings/members-section.tsx @@ -1,5 +1,5 @@ // Members section: the human participants split out from agents (see -// AgentsSection). Each row carries a Remove affordance (CL-6122): a +// AgentsSection). Each row carries a Remove affordance: a // second-click `ConfirmButton` that drops the member's participant // record server-side (`removeWorkbenchParticipant`), disabled for the // signed-in viewer's own row — there is no "leave" flow yet, so removing diff --git a/packages/chat-ui/src/workbench-settings/model.ts b/packages/chat-ui/src/workbench-settings/model.ts index 0217a3f199..8c65802820 100644 --- a/packages/chat-ui/src/workbench-settings/model.ts +++ b/packages/chat-ui/src/workbench-settings/model.ts @@ -2,7 +2,7 @@ // settings are a full stage surface (mock § Workbench settings), grouped // Shared / Personal / Danger zone, never a dialog with tabs. // -// CL-6215: Agents is now the one place an agent participant's persona, +// Agents is now the one place an agent participant's persona, // capabilities, and history are edited — a click-through master-detail, // not a separate "Myra" nav item duplicating the same editor for one // hardcoded agent. Keys & plugins and Inference are gone as distinct diff --git a/packages/chat-ui/src/workbench-settings/surface.tsx b/packages/chat-ui/src/workbench-settings/surface.tsx index 67b769c12e..217a00fc4e 100644 --- a/packages/chat-ui/src/workbench-settings/surface.tsx +++ b/packages/chat-ui/src/workbench-settings/surface.tsx @@ -202,8 +202,8 @@ export function WorkbenchSettingsSurface({