Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions agents/assistant/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
// platform's deploy machinery; the execution host materializes it at
// runtime from the deploy alone.
//
// Tool-package pins (CL-5999, CL-5852): `@intx/agent`'s `defineAgent`
// Tool-package pins: `@intx/agent`'s `defineAgent`
// still does not accept a `toolPackagePins` field on its authoring-time
// config — it is vendored, read-only source for this change — so the
// agent below is built directly against `AgentDefinition`'s own type,
// which already carries the field, matching
// `workflows/collateral-generation`'s precedent. `@corbits/memory`
// (CL-8186) is pinned so this deployment can search, add, and list the
// is pinned so this deployment can search, add, and list the
// tenant's firm memory (`memory_search`/`memory_add`/`memory_list`) — a
// published dependency, not a workbench-built tool package, resolved
// through its own `interchange.tools` surface the same way any other
Expand Down
14 changes: 7 additions & 7 deletions agents/assistant/src/system-prompt.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Myra's pure prompt/pin data — no runtime import of `@intx/workflow` or
// `@intx/agent` (only a type-only import below), so this module is safe
// to bundle into a browser build (CL-8154's `apps/web` needs exactly
// this: the content, not `buildAssistantWorkflow`'s `defineWorkflow`
// to bundle into a browser build (`apps/web` needs exactly this: the
// content, not `buildAssistantWorkflow`'s `defineWorkflow`
// call, which pulls in `@intx/agent`'s Node-bound runtime — file
// locking, in particular — that a browser bundle cannot resolve).
// `index.ts`'s `buildAssistantWorkflow` imports these same constants;
Expand All @@ -18,7 +18,7 @@ export const ASSISTANT_STEP_ID = "assistant";
* these: `@corbits/memory` is a normal published dependency, not a
* workspace tool package the pin/registry resolver can name, so its
* tool factories are attached directly on `toolFactories` in
* `./index.ts` instead (CL-8186). `@corbits/capability-tools` lets Myra
* `./index.ts` instead. `@corbits/capability-tools` lets Myra
* self-service a missing tool, skill, or model; the manager-tools
* bundles give Myra real workbench-management capability — a specialist
* agent she can create (each gets their own chat), connection
Expand Down Expand Up @@ -63,7 +63,7 @@ const ASSISTANT_WELCOME_CLAUSE =
"allowed to.";

/**
* TRIAGE (CL-6350): how Myra decides, on every message, whether to
* TRIAGE: how Myra decides, on every message, whether to
* answer directly or delegate — what to do when a job needs a
* connection this workbench doesn't have yet, and the reverse case: she
* answers by default and only steps back when a message @-mentions a
Expand Down Expand Up @@ -95,14 +95,14 @@ const ASSISTANT_TRIAGE_CLAUSE =
"unless you are @-mentioned too or the sender asks you directly.";

/**
* TEAMMATE (CL-7469 folds in COORDINATOR): how Myra offers help without
* TEAMMATE (folds in COORDINATOR): how Myra offers help without
* pushing it — folds in the skills-capture nudge rather than a separate
* always-on clause. Myra is the coordinator of this bench's agents, not
* just its resident assistant: she never builds a teammate by
* hand-editing files or answering in its place, and never stands up a
* second instance of an agent that already exists.
*
* The build-arc sentence (CL-5879) is the load-bearing one: it never
* The build-arc sentence is the load-bearing one: it never
* waits for someone to name the mechanism ("make an agent", "set up a
* routine"). An *outcome* — a sales motion, a content pipeline, a repo
* to keep up — is enough on its own for Myra to work out the
Expand Down Expand Up @@ -145,7 +145,7 @@ const ASSISTANT_TEAMMATE_CLAUSE =
"built and what it can now do once it's live.";

/**
* DISCOVERY (CL-6179): the specific interview-then-propose procedure a
* DISCOVERY: the specific interview-then-propose procedure a
* stated outcome triggers, on top of the general "work out the team
* yourself" doctrine in `ASSISTANT_TRIAGE_CLAUSE` above — short and
* concrete rather than open-ended, so discovery never turns into a
Expand Down
13 changes: 6 additions & 7 deletions agents/assistant/test/manager-tools-scenario.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// A scripted playback of the owner's canonical GTM scenario (CL-5879
// manager-tools follow-up), exercised directly against the manager-tools
// A scripted playback of the owner's canonical GTM scenario, exercised directly against the manager-tools
// bundles' `run()` with a single fake `fetch` standing in for every
// workflow-run-authenticated route those bundles call. This proves the
// CONTRACT across packages — a tool call's request shape matches what
Expand Down Expand Up @@ -132,9 +131,9 @@ function createFakeHub() {
}

if (url.pathname === "/api/workflow-chat/participants/messages" && method === "POST" && body) {
// The connect-service card post `request_connection` (CL-6393)
// makes into the caller's own room. Recorded so the scenario can
// assert the card itself, not just the tool's advice text.
// The connect-service card post `request_connection` makes into
// the caller's own room. Recorded so the scenario can assert the
// card itself, not just the tool's advice text.
const parts = body["parts"] as {
kind: string;
block: { type: string; data: Record<string, unknown> };
Expand Down Expand Up @@ -244,7 +243,7 @@ async function runScenario(hub: ReturnType<typeof createFakeHub>): Promise<void>
// A connector name that is neither a fixed `CONNECTOR_REGISTRY`
// entry, a curated MCP preset, nor a connected MCP server makes
// `request_connection` tell the agent to keep helping with what it
// can do (CL-6393) — never "go add a server and report back".
// can do — never "go add a server and report back".
const unknown = await connectionsBundle.run(
call("req_unknown", REQUEST_CONNECTION_TOOL, { connector: "acmecrm" }),
new AbortController().signal,
Expand All @@ -255,7 +254,7 @@ async function runScenario(hub: ReturnType<typeof createFakeHub>): Promise<void>
expect(hub.postedCards).toHaveLength(0);

// She puts a connect card in the room for each of the three (real)
// services (CL-6393) — the card is what the human clicks; the tool
// services — the card is what the human clicks; the tool
// result only tells Myra to keep helping in the meantime.
for (const connector of ["exa", "granola", "linear"]) {
const result = await connectionsBundle.run(
Expand Down
2 changes: 1 addition & 1 deletion apps/web/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ Running routines in the contextual column are sourced today from
| `/c` | Workbench deep-link surface. On wide layouts the conversation opens in the right canvas; on compact layouts it fills the main pane. Legacy `/chat` links still resolve here. |
| `/workflows` | Workflow runs executing across your benches. |
| `/library` | The artifact gallery. See "Library" below. |
| `/settings` | Account, bench membership, and (CL-5990) Agents/Skills. See "Agents" and "Skills" below. |
| `/settings` | Account, bench membership, and Agents/Skills. See "Agents" and "Skills" below. |

Agents and Skills are Settings sections, not rail destinations — old
`/agents[/:id]` and `/skills[/:id]` links still resolve, redirecting to
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/agent-chat-launch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
// fresh chat with it" — the same `POST /workbenches` call this app's every
// create path uses. `CreateAgentPanel`'s Settings → Agents entry point
// calls this on success so an explicitly-defined new agent never ends
// nowhere, and `instant-agent-create.ts` — THE one creation verb
// (CL-6138) — calls it against the account's default setup template.
// Always creates (CL-6089) — never the `reuseExisting` land-hop path,
// nowhere, and `instant-agent-create.ts` — THE one creation verb —
// calls it against the account's default setup template.
// Always creates — never the `reuseExisting` land-hop path,
// which is `default-agent-workbench.ts`'s own call, not this one.

import { createWorkbench } from "@corbits/chat-ui";
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/agent-dm-launch.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// The one path from an agent definition's id to "the person is in their
// direct chat with it" (CL-6253) — the sidebar's agent rows are the one
// direct chat with it" — the sidebar's agent rows are the one
// caller. Mirrors `agent-chat-launch.ts`'s shape exactly, but through
// `openAgentDm` (`kind: "chat"`, `reuseExisting: true`) rather than
// `createWorkbench` directly: the first click mints the DM, every later
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/agents-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ export function listAgentInstances(tenantId: string): Promise<readonly AgentInst
* native `GET /workflows/runs` listing's own predicate (`address IS NOT
* NULL AND anchorRunId = id`), the same one `isTopLevelRun` uses. Used
* wherever a page needs "real deployments only" — the Agent Directory.
* Single-tenant (CL-8087 accepted loss): the deleted route expanded the
* Single-tenant (accepted loss): the deleted route expanded the
* requested tenant to its whole descendant subtree via
* `getDescendantTenants`; the native listing filters one tenant, so a
* workspace parent sees only its own runs, not its child workbenches'.
Expand All @@ -135,7 +135,7 @@ export function listTopLevelRuns(tenantId: string): Promise<readonly AgentInstan
* bare-array discovery route at `/models` (`ModelInfo[]`) — those are
* different wire shapes. Disabled rows are filtered out here because the
* catalog may retain them. Embedding-named models, Hugging Face Hub paths,
* and bare `.gguf` names are also omitted (CL-6744) — this endpoint carries
* and bare `.gguf` names are also omitted — this endpoint carries
* no offering capability lists, so the name-only
* {@link isChatPickerModelName} gate is the available signal. */
export function listCatalogModels(tenantId: string): Promise<readonly CatalogModel[]> {
Expand All @@ -160,7 +160,7 @@ export type AgentDefinitionDraft = typeof AgentDefinitionDraftResponse.infer.dra
* Asks Myra to draft a starting system prompt (and optionally a
* refined description, a model pick, and skills) from a name and a
* plain-language purpose — the create-agent panel's "Create & chat"
* flow (CL-6074). Hits `@corbits/agent-directory`'s
* flow. Hits `@corbits/agent-directory`'s
* `POST .../planner/agent-definitions/draft`; never deploys anything
* itself. A caller that gets a rejected promise here (Myra unavailable,
* the draft timing out, an unparseable or out-of-inventory reply, or a
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/agents-directory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {

import type { AgentDefinition, AgentInstance } from "./agents-api";

/** An `AgentDefinition` with its display name derived (CL-6413) — its own
/** An `AgentDefinition` with its display name derived — its own
* description when the definition was created with one, otherwise a
* humanized reading of its immutable `name` slug. `name` itself stays the
* slug throughout; nothing here mutates it. */
Expand All @@ -41,7 +41,7 @@ export function purposeAgentDefinitions(
* (see `./agents-api.ts`), which excludes every non-top-level run
* (workbench host, invited agent, task) server-side — the native
* `GET /workflows/runs` listing's own predicate. That listing is
* single-tenant (CL-8087 accepted loss: no descendant-subtree rollup),
* single-tenant (accepted loss: no descendant-subtree rollup),
* so this still applies the shared name-based workbench-host filter as
* defense in depth.
*/
Expand Down
4 changes: 1 addition & 3 deletions apps/web/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ export const ArtifactRowSchema = ArtifactListItemSchema.merge(
content: "string",
}),
);
// GET /api/tenants/:id/artifacts/:artifactId wraps the row in an `artifact`
// envelope key (`@corbits/artifacts`' `mountArtifacts`, CL-8188).
export const ArtifactDetailSchema = type({
artifact: ArtifactRowSchema,
});
Expand Down Expand Up @@ -179,7 +177,7 @@ export function rejectApproval(
}

/**
* Sandboxed HTML preview URL for a Library artifact (CL-5879) — the same
* Sandboxed HTML preview URL for a Library artifact — the same
* path an `<iframe sandbox>` in the canvas or Library detail pane loads,
* and the "Open in new tab" affordance's `href`. Server-side (`GET
* .../artifacts/:id/preview` in `@corbits/artifacts-hub`) answers 415 for
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app-error-boundary.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// The last line of defence (CL-6381): a render error anywhere in the tree
// The last line of defence: a render error anywhere in the tree
// used to leave the reader staring at a blank white page. React only offers
// this as a class component (no hook equivalent exists), so it's the one
// class in an otherwise function-component codebase.
Expand Down
36 changes: 18 additions & 18 deletions apps/web/src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ select:disabled,
height: 100dvh;
}

/* A quoteable reference id under the error boundary's failure message
(CL-6632) — small and muted, same treatment as `.onboarding-error-refid`. */
/* A quoteable reference id under the error boundary's failure message —
small and muted, same treatment as `.onboarding-error-refid`. */
.app-boot-frame-refid {
font-size: 0.75rem;
color: var(--muted-foreground);
Expand Down Expand Up @@ -304,10 +304,10 @@ select:disabled,
flex-direction: column;
}

/* CL-6092: the guided-fix banner, above the stage's own top bar — quiet
/* the guided-fix banner, above the stage's own top bar — quiet
until there is something to act on, then a clear (not alarming) nudge
toward the fix. */
/* Mount/unmount collapse (CL-6092): a grid-rows 0fr/1fr toggle so the
/* Mount/unmount collapse: a grid-rows 0fr/1fr toggle so the
banner's entrance/exit eases the stage's height rather than snapping it
open or shut. `theme.css` (react-ui) already collapses every
transition duration under `prefers-reduced-motion`, so this needs no
Expand Down Expand Up @@ -357,9 +357,9 @@ select:disabled,
color: var(--card-foreground);
}

/* The Plugins gallery's own "couldn't find that connection" notice
(CL-6092): a deep link from the shell banner that names a provider the
gallery has no card for. */
/* The Plugins gallery's own "couldn't find that connection" notice: a deep
link from the shell banner that names a provider the gallery has no
card for. */
.plugins-connect-notice {
display: flex;
align-items: center;
Expand Down Expand Up @@ -1153,7 +1153,7 @@ select:disabled,
overflow: auto;
}

/* Co-viewer cursors (CL-5958): positioned in the pane's own fractional
/* Co-viewer cursors: positioned in the pane's own fractional
coordinate space (see `PresenceCursor` in canvas-column.tsx), never
intercepting pointer events — they are a read-only presence signal, not
an interactive layer. */
Expand Down Expand Up @@ -1200,7 +1200,7 @@ select:disabled,
that like any other. */

/* Sidebar header: the brand mark, small and quiet — the mark is the brand
moment now (CL-6089 dropped the orange-rail era), not the switcher this
moment now (dropped the orange-rail era), not the switcher this
dock replaced. */
.shell-sidebar-brand-mark {
display: flex;
Expand Down Expand Up @@ -1613,7 +1613,7 @@ select:disabled,
white-space: nowrap;
}

/* Persistent pin glyph on pinned sidebar rows (CL-6657) — pinning must be
/* Persistent pin glyph on pinned sidebar rows — pinning must be
visible in the list itself, not only as a toast / settings bit. */
.shell-ch-pin {
flex-shrink: 0;
Expand Down Expand Up @@ -2269,8 +2269,8 @@ select:disabled,
color: var(--muted-foreground);
}

/* A quoteable reference id under a consumer-language failure message
(CL-6360) — small and muted, never the focal point of the card. */
/* A quoteable reference id under a consumer-language failure message —
small and muted, never the focal point of the card. */
.onboarding-error-refid {
font-size: 0.75rem;
color: var(--muted-foreground);
Expand Down Expand Up @@ -2366,7 +2366,7 @@ select:disabled,
min-height: 0;
}

/* Route-level Suspense fallback (CL-6370): centers the shared warm loader
/* Route-level Suspense fallback: centers the shared warm loader
instead of leaving a bare, un-laid-out box while a route chunk loads. */
.shell-route-loading {
display: flex;
Expand Down Expand Up @@ -3077,7 +3077,7 @@ tr.insights-row-clickable:hover {
gap: 1rem;
}

/* CL-6124: the in-shell first-workbench screen — a chat, not a form. One
/* the in-shell first-workbench screen — a chat, not a form. One
prompt box, centered both ways in the stage; the stage owns the full
width, no decorative panel. */
.describe-first-workbench {
Expand Down Expand Up @@ -3124,7 +3124,7 @@ tr.insights-row-clickable:hover {
color: var(--muted-foreground);
}

/* CL-6224: per-workbench Timeline — one wall-clock spine (chat messages,
/* per-workbench Timeline — one wall-clock spine (chat messages,
thread forks, routine runs, tasks, approvals), day dividers, and a right
rail of per-day KPI counts. Matches the Insights stage's own visual
language (hairline dividers, uppercase section labels, --shell-accent
Expand Down Expand Up @@ -3348,7 +3348,7 @@ tr.insights-row-clickable:hover {
font-weight: 550;
}

/* ---------------- new-workbench picker (CL-6342) ---------------- */
/* ---------------- new-workbench picker ---------------- */
/* Screen 1 of the approved mock: one row list, no card grid. The
selection rail (`box-shadow: inset 2px 0 0 0 var(--shell-accent)`)
matches the sidebar's own active-row treatment exactly. */
Expand Down Expand Up @@ -3384,7 +3384,7 @@ tr.insights-row-clickable:hover {
margin: 0;
}

/* The prompt box (CL-6628): the primary act on this screen, so it gets
/* The prompt box: the primary act on this screen, so it gets
the heaviest visual weight — a bordered, focus-ringed field with the
send button inline, sized to read as "type here first". */
.new-workbench-prompt {
Expand Down Expand Up @@ -3723,7 +3723,7 @@ tr.insights-row-clickable:hover {
}
}

/* Mission Control (CL-6488/CL-6489) — stat strip, then a main column
/* Mission Control — stat strip, then a main column
(Needs you / In flight) beside a 320px rail (Jump back in / This week),
the same "stack under 1100px" rule DESIGN.md gives every right rail. */
.mission-control-layout {
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/auto-workbench-title.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
titleFromFirstMessage,
} from "./auto-workbench-title";

describe("titleFromFirstMessage (CL-6656)", () => {
describe("titleFromFirstMessage", () => {
test("trims and collapses whitespace into a single-line title", () => {
expect(titleFromFirstMessage(" Help me\nplan Q3 ")).toBe("Help me plan Q3");
});
Expand All @@ -33,7 +33,7 @@ describe("titleFromFirstMessage (CL-6656)", () => {
});
});

describe("autoNameFromFirstMessage (CL-6656)", () => {
describe("autoNameFromFirstMessage", () => {
test("names an ad-hoc New Workbench from the first message", () => {
expect(autoNameFromFirstMessage(NEW_WORKBENCH_TITLE, "Plan the Q3 launch")).toBe(
"Plan the Q3 launch",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/auto-workbench-title.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// CL-6656: ad-hoc ("Just start talking") benches mint as "New Workbench" and
// ad-hoc ("Just start talking") benches mint as "New Workbench" and
// used to stay that way in the sidebar. Prefab templates already name the
// room after the template title; this helper turns the person's first message
// into a short sidebar title so blank benches get the same treatment once
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/chat-artifact-open.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export function artifactContentFromDetail(
title: detail.title,
rendererKind,
content: detail.content,
// Text-kind Library artifacts are co-editable (CL-5958 phase 2); the
// Text-kind Library artifacts are co-editable (phase 2); the
// presence `/update` route's own write-grant check is the real gate
// — this only decides which pane a capable viewer sees.
canEdit: rendererKind === "doc",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/client-bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ function primaryTenantSlug(account: ClientBootstrapAccount): string {
return base !== undefined && base.length > 0 ? base : `home-${account.id}`;
}

/** First-signup installer step (CL-8131): mints the account's primary
/** First-signup installer step: mints the account's primary
* tenant over the stock `POST /api/tenants` route (no `parentId`, so the
* caller becomes its owner) when it does not already own one. This is
* the "0→1" ruling's execution — never hub boot, never a CLI — and it
Expand Down
Loading
Loading