@agentproto/runtime 2.10.1 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -73,7 +73,7 @@ interface ExportedSession {
73
73
  * unit-testable so a future LLM-backed chaptering/summarizing pass can
74
74
  * replace the internals behind the same `buildStory(messages) => Story`
75
75
  * interface (mirrors the summarize_session heuristic → LLM swap path
76
- * described in agents-overview-app.ts).
76
+ * described in summarize-session-tool.ts).
77
77
  *
78
78
  * Folding rule (mirrors transcript-export.ts's own batching): an assistant
79
79
  * message plus every immediately-following `role: "tool"` message collapse
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tool-presenter.ts","../src/session-story.ts"],"names":["truncate"],"mappings":"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","file":"session-story.mjs","sourcesContent":["/**\n * Turns a raw tool-call name + args (and its eventual result) into a short,\n * human-readable line for ring-buffer / CLI / transcript rendering. Without\n * this, every tool call renders as a bare `[tool] view` with no args and no\n * outcome — this module is the one place that knows how to summarize both.\n */\n\nconst SALIENT_ARG_KEYS = [\n \"file_path\",\n \"path\",\n \"filePath\",\n \"file\",\n \"command\",\n \"pattern\",\n \"query\",\n \"q\",\n \"url\",\n \"todos\",\n \"description\",\n \"prompt\",\n] as const\n\nconst MAX_CALL_LENGTH = 120\nconst MAX_RESULT_LENGTH = 160\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction truncate(value: string, max: number): string {\n const oneLine = value.replace(/\\s+/g, \" \").trim()\n return oneLine.length > max ? `${oneLine.slice(0, max - 1)}…` : oneLine\n}\n\nfunction formatArgValue(value: unknown): string {\n if (typeof value === \"string\") return value\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? \"\" : \"s\"}`\n if (isRecord(value)) return JSON.stringify(value)\n return String(value)\n}\n\nfunction pickSalientArg(args: Record<string, unknown>): string | null {\n for (const key of SALIENT_ARG_KEYS) {\n const value = args[key]\n if (value !== undefined && value !== null && value !== \"\") {\n return formatArgValue(value)\n }\n }\n return null\n}\n\ntype BespokeFormatter = (args: Record<string, unknown>) => string\n\nfunction subagentSummary(args: Record<string, unknown>): string {\n const description =\n typeof args.description === \"string\"\n ? args.description\n : typeof args.prompt === \"string\"\n ? args.prompt\n : \"subagent\"\n return `↳ subagent: ${truncate(description, MAX_CALL_LENGTH)}`\n}\n\n// Bespoke one-liners for control tools where the generic arg-sniffing\n// below would either miss the point (ScheduleWakeup's payload isn't a\n// file/command/pattern) or just repeat the tool name pointlessly\n// (TodoWrite, ExitPlanMode carry no salient single-value arg).\nconst BESPOKE_TOOLS: Record<string, BespokeFormatter> = {\n schedulewakeup: (args) => {\n const delay = args.delaySeconds ?? args.delay ?? \"?\"\n const reason = typeof args.reason === \"string\" ? args.reason : \"\"\n return reason ? `⏰ wake in ${delay}s — ${reason}` : `⏰ wake in ${delay}s`\n },\n task: subagentSummary,\n agent: subagentSummary,\n todowrite: (args) => {\n const todos = Array.isArray(args.todos) ? args.todos : []\n return `☑ todos (${todos.length})`\n },\n exitplanmode: () => \"📋 plan ready\",\n}\n\n/** A one-line human summary of a tool call, e.g. `read src/foo.ts` or `⏰ wake in 30s — checking CI`. */\nexport function formatToolCall(toolName: string, args: unknown): string {\n const name = toolName || \"tool\"\n const argsRecord = isRecord(args) ? args : {}\n\n const bespoke = BESPOKE_TOOLS[name.toLowerCase()]\n if (bespoke) return bespoke(argsRecord)\n\n const salient = pickSalientArg(argsRecord)\n if (salient !== null) {\n // Some ACP agents (e.g. claude-agent-acp) already bake the salient\n // value into a curated title — \"Read src/foo.ts\" alongside\n // arguments.path === \"src/foo.ts\". Appending it again would render\n // \"Read src/foo.ts src/foo.ts\". Only append when it adds new info.\n if (name.toLowerCase().includes(salient.toLowerCase())) {\n return truncate(name, MAX_CALL_LENGTH)\n }\n return truncate(`${name} ${salient}`, MAX_CALL_LENGTH)\n }\n\n if (Object.keys(argsRecord).length === 0) return name\n\n return truncate(`${name} ${JSON.stringify(args)}`, MAX_CALL_LENGTH)\n}\n\nfunction extractText(value: unknown): string | null {\n if (value == null) return null\n if (typeof value === \"string\") return value\n if (Array.isArray(value)) {\n const parts = value.map(extractText).filter((v): v is string => v != null)\n return parts.length ? parts.join(\"\\n\") : null\n }\n if (isRecord(value)) {\n if (typeof value.text === \"string\") return value.text\n if (typeof value.message === \"string\") return value.message\n if (Array.isArray(value.content)) return extractText(value.content)\n if (typeof value.error === \"string\") return value.error\n if (isRecord(value.error) && typeof value.error.message === \"string\") {\n return value.error.message\n }\n return null\n }\n return null\n}\n\n/**\n * A short outcome line for a completed tool call, or `null` when there's\n * nothing useful to show (e.g. an empty/void result). `toolName` is\n * accepted for parity with `formatToolCall` and future bespoke result\n * formatting, but generic text extraction covers today's cases.\n */\nexport function formatToolResult(\n toolName: string | undefined,\n result: unknown,\n isError: boolean,\n): string | null {\n void toolName\n const text = extractText(result)\n\n if (isError) {\n const message = text ?? (result != null ? JSON.stringify(result) : \"failed\")\n const firstLine = message.split(/\\r?\\n/)[0] ?? message\n return truncate(firstLine, MAX_RESULT_LENGTH)\n }\n\n if (text == null) return null\n const trimmed = text.trim()\n if (!trimmed) return null\n\n const lines = trimmed.split(/\\r?\\n/)\n if (lines.length > 1) {\n const bytes = Buffer.byteLength(trimmed, \"utf8\")\n return `${lines.length} lines, ${bytes}B`\n }\n return truncate(lines[0]!, MAX_RESULT_LENGTH)\n}\n\n/** The stdout sentinel the CI artifact-ledger delivery helper prints when it\n * creates a PR / review / comment — MUST byte-match `ARTIFACT_MARKER` in\n * `scripts/lib/artifact-ledger.mjs` (the runner-side harvester). */\nexport const ARTIFACT_MARKER = \"::agentproto-artifact::\"\n\n/** Ring lines per tool result the marker passthrough will re-emit at most —\n * a delivery tool call creates one artifact, so >1 is already unusual; the\n * cap only bounds a pathological result that echoes markers in a loop. */\nconst MAX_ARTIFACT_MARKER_LINES = 8\n\n/**\n * The `::agentproto-artifact::` marker lines buried in a tool result, if any.\n *\n * The one-line summary {@link formatToolResult} produces is deliberately\n * lossy (\"N lines, XB\") — correct for humans, fatal for the CI artifact\n * ledger: the agentflow delivery helper (`deliver-artifact.mjs`) prints its\n * marker to a tool's stdout precisely so the `agentproto-run` driver can\n * harvest created PR/review/comment ids back out of `agent_output`. This\n * extracts those lines so the ring can carry them verbatim alongside the\n * summary. Returned WITHOUT ANSI styling on purpose: the harvester\n * (`parseArtifactMarkers`) does `indexOf(marker)` then `JSON.parse` of the\n * line's remainder, so a trailing reset code would corrupt the JSON.\n */\nexport function artifactMarkerLines(result: unknown): string[] {\n const text = extractText(result)\n if (text == null || !text.includes(ARTIFACT_MARKER)) return []\n return text\n .split(/\\r?\\n/)\n .filter(line => line.includes(ARTIFACT_MARKER))\n .slice(0, MAX_ARTIFACT_MARKER_LINES)\n .map(line => line.trim())\n}\n","/**\n * Pure heuristic module that folds an exported session's messages into a\n * \"story\": chapters (inferred sub-tasks) + steps (one per fixed-height feed\n * row). Backs the `agentproto_session_story` MCP app panel.\n *\n * v1 = pure heuristics, NO LLM. Everything here is deterministic and\n * unit-testable so a future LLM-backed chaptering/summarizing pass can\n * replace the internals behind the same `buildStory(messages) => Story`\n * interface (mirrors the summarize_session heuristic → LLM swap path\n * described in agents-overview-app.ts).\n *\n * Folding rule (mirrors transcript-export.ts's own batching): an assistant\n * message plus every immediately-following `role: \"tool\"` message collapse\n * into ONE step. A user message is always its own step, and is also a\n * candidate chapter boundary.\n */\n\nimport { formatToolCall, formatToolResult } from \"./tool-presenter.js\"\nimport type { ExportedMessage } from \"./transcript-export.js\"\n\n// Re-exported so consumers of buildStory (e.g. the CLI's `sessions story`\n// command) can type the `/sessions/:id/export?format=json` payload they\n// feed into it without a second import from transcript-export.js.\nexport type { ExportedMessage, ExportedSession, ExportedSessionMeta } from \"./transcript-export.js\"\n\nexport type StoryStepKind = \"text\" | \"edit\" | \"bash\" | \"read\" | \"user\"\nexport type ChapterStatus = \"done\" | \"cur\"\nexport type RouteVerdict = \"cont\" | \"newt\"\n\nexport interface StoryChapter {\n id: string\n title: string\n status: ChapterStatus\n}\n\nexport type StoryItem = { text: string } | { h: string; r: string }\n\nexport interface StoryStep {\n chap: string\n kind: StoryStepKind\n /** HH:MM:SS (UTC) when the source message carried a `ts`, else \"\". */\n ts: string\n sum: string\n raw1: string\n count: number\n facts: string[]\n items: StoryItem[]\n route?: RouteVerdict\n}\n\nexport interface Story {\n chapters: StoryChapter[]\n steps: StoryStep[]\n}\n\n// ── formatting helpers ───────────────────────────────────────────────────\n\nfunction formatTs(ts?: number): string {\n if (ts === undefined || Number.isNaN(ts)) return \"\"\n return new Date(ts).toISOString().slice(11, 19)\n}\n\nfunction firstMeaningfulLine(text?: string): string | undefined {\n if (!text) return undefined\n const line = text\n .split(\"\\n\")\n .map(l => l.trim())\n .find(l => l.length > 0)\n return line\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n\nfunction parseArgs(argsJson: string): unknown {\n try {\n return JSON.parse(argsJson)\n } catch {\n return {}\n }\n}\n\nfunction lineCount(text: string): number {\n return text.split(\"\\n\").filter(l => l.trim().length > 0).length || 1\n}\n\n// ── kind classification ──────────────────────────────────────────────────\n\n/** Dominant kind for a group of tool calls: edit/write → edit, bash/terminal/\n * command → bash, read/grep/glob → read, else text (pure assistant text). */\nexport function classifyKind(toolCalls?: readonly { name: string }[]): StoryStepKind {\n if (!toolCalls || toolCalls.length === 0) return \"text\"\n const names = toolCalls.map(t => t.name.toLowerCase())\n if (names.some(n => /edit|write/.test(n))) return \"edit\"\n if (names.some(n => /bash|terminal|command/.test(n))) return \"bash\"\n if (names.some(n => /read|grep|glob/.test(n))) return \"read\"\n return \"text\"\n}\n\n// ── chapter routing (mockup's `classify()`, ported verbatim) ────────────\n\nconst NEW_CHAPTER_RE =\n /\\b(aussi|autre|ensuite|nouveau|nouvelle|plut[oô]t|maintenant|apr[eè]s ça|il faudrait|peux[- ]tu|on pourrait|ajoute|g[eè]re)\\b/iu\n\nexport function classifyRoute(text: string): { route: RouteVerdict; title?: string } {\n const newt = NEW_CHAPTER_RE.test(text)\n if (!newt) return { route: \"cont\" }\n const title = text.replace(/[.?!].*$/, \"\").slice(0, 42)\n return { route: \"newt\", title }\n}\n\n// ── folding: raw messages → steps (chapter unassigned) ───────────────────\n\ninterface FoldedStep {\n kind: StoryStepKind\n ts: string\n sum: string\n raw1: string\n count: number\n facts: string[]\n items: StoryItem[]\n /** Present only for user steps — drives chapter routing. */\n userText?: string\n}\n\nfunction foldToolStep(assistant: ExportedMessage, toolResults: ExportedMessage[]): FoldedStep {\n const toolCalls = assistant.toolCalls ?? []\n const kind = classifyKind(toolCalls)\n const count = toolCalls.length || 1\n\n const items: StoryItem[] = []\n const facts: string[] = []\n if (assistant.text?.trim()) items.push({ text: assistant.text.trim() })\n toolCalls.forEach((tc, i) => {\n const args = parseArgs(tc.args)\n const h = formatToolCall(tc.name, args)\n const resultMsg = toolResults[i]\n const resultText = resultMsg?.text ?? \"\"\n const isError = resultText.startsWith(\"[error]\")\n const r = isError ? resultText.slice(\"[error]\".length).trim() : resultText\n items.push({ h, r })\n const fact = formatToolResult(tc.name, r, isError)\n if (fact) facts.push(fact)\n })\n\n const firstLine = firstMeaningfulLine(assistant.text)\n const firstToolCall = toolCalls[0]\n const sum =\n firstLine ??\n (firstToolCall ? formatToolCall(firstToolCall.name, parseArgs(firstToolCall.args)) : \"…\")\n\n let raw1: string\n if (toolCalls.length === 0) {\n raw1 = `assistant · ${lineCount(assistant.text ?? \"\")} ligne(s)`\n } else if (toolCalls.length === 1 && firstToolCall) {\n raw1 = formatToolCall(firstToolCall.name, parseArgs(firstToolCall.args))\n } else {\n raw1 = `${firstToolCall?.name ?? \"tool\"} ×${toolCalls.length}`\n }\n\n return {\n kind,\n ts: formatTs(assistant.ts),\n sum,\n raw1,\n count,\n facts,\n items,\n }\n}\n\nfunction foldUserStep(msg: ExportedMessage): FoldedStep {\n const text = msg.text ?? \"\"\n const sum = `« ${truncate(text, 80)} »`\n return {\n kind: \"user\",\n ts: formatTs(msg.ts),\n sum,\n raw1: `user · ${lineCount(text)} ligne(s)`,\n count: 1,\n facts: [],\n items: [{ text }],\n userText: text,\n }\n}\n\nfunction foldOrphanToolStep(msg: ExportedMessage): FoldedStep {\n const text = msg.text ?? \"\"\n const isError = text.startsWith(\"[error]\")\n const r = isError ? text.slice(\"[error]\".length).trim() : text\n const name = msg.toolName ?? \"tool\"\n const fact = formatToolResult(name, r, isError)\n return {\n kind: classifyKind([{ name }]),\n ts: formatTs(msg.ts),\n sum: msg.toolName ? `${msg.toolName} · résultat` : \"Résultat d'outil\",\n raw1: msg.toolName ?? \"tool\",\n count: 1,\n facts: fact ? [fact] : [],\n items: [{ h: name, r }],\n }\n}\n\nfunction foldSystemStep(msg: ExportedMessage): FoldedStep {\n const text = msg.text ?? \"\"\n return {\n kind: \"text\",\n ts: formatTs(msg.ts),\n sum: firstMeaningfulLine(text) ?? text,\n raw1: \"system\",\n count: 1,\n facts: [],\n items: text ? [{ text }] : [],\n }\n}\n\nfunction foldMessages(messages: readonly ExportedMessage[]): FoldedStep[] {\n const steps: FoldedStep[] = []\n let i = 0\n while (i < messages.length) {\n const msg = messages[i]!\n if (msg.role === \"user\") {\n steps.push(foldUserStep(msg))\n i += 1\n continue\n }\n if (msg.role === \"assistant\") {\n let j = i + 1\n const toolResults: ExportedMessage[] = []\n while (j < messages.length && messages[j]!.role === \"tool\") {\n toolResults.push(messages[j]!)\n j += 1\n }\n steps.push(foldToolStep(msg, toolResults))\n i = j\n continue\n }\n if (msg.role === \"tool\") {\n // Orphan tool result with no preceding assistant message — rare, but\n // render it as its own read-only step rather than dropping data.\n steps.push(foldOrphanToolStep(msg))\n i += 1\n continue\n }\n // system\n steps.push(foldSystemStep(msg))\n i += 1\n }\n return steps\n}\n\n// ── chaptering: assign each folded step to a chapter ─────────────────────\n\nexport function buildStory(messages: readonly ExportedMessage[]): Story {\n const folded = foldMessages(messages)\n const chapters: StoryChapter[] = []\n const steps: StoryStep[] = []\n\n let currentChapterId: string | undefined\n let sawFirstUser = false\n\n const closeCurrent = (): void => {\n const cur = chapters.find(c => c.id === currentChapterId)\n if (cur) cur.status = \"done\"\n }\n const openChapter = (title: string): string => {\n const id = `c${chapters.length + 1}`\n chapters.push({ id, title, status: \"cur\" })\n return id\n }\n\n for (const step of folded) {\n let route: RouteVerdict | undefined\n if (step.kind === \"user\" && step.userText !== undefined) {\n if (!sawFirstUser) {\n sawFirstUser = true\n currentChapterId = openChapter(\"Cadrage\")\n } else {\n const verdict = classifyRoute(step.userText)\n route = verdict.route\n if (verdict.route === \"newt\") {\n closeCurrent()\n currentChapterId = openChapter(verdict.title || \"Nouvelle sous-tâche\")\n }\n }\n } else if (currentChapterId === undefined) {\n // Transcript opens with assistant/system output before any user\n // message (unusual, but keep every step chaptered).\n currentChapterId = openChapter(\"Cadrage\")\n }\n\n steps.push({\n chap: currentChapterId!,\n kind: step.kind,\n ts: step.ts,\n sum: step.sum,\n raw1: step.raw1,\n count: step.count,\n facts: step.facts,\n items: step.items,\n ...(route ? { route } : {}),\n })\n }\n\n return { chapters, steps }\n}\n"]}
1
+ {"version":3,"sources":["../src/tool-presenter.ts","../src/session-story.ts"],"names":["truncate"],"mappings":"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","file":"session-story.mjs","sourcesContent":["/**\n * Turns a raw tool-call name + args (and its eventual result) into a short,\n * human-readable line for ring-buffer / CLI / transcript rendering. Without\n * this, every tool call renders as a bare `[tool] view` with no args and no\n * outcome — this module is the one place that knows how to summarize both.\n */\n\nconst SALIENT_ARG_KEYS = [\n \"file_path\",\n \"path\",\n \"filePath\",\n \"file\",\n \"command\",\n \"pattern\",\n \"query\",\n \"q\",\n \"url\",\n \"todos\",\n \"description\",\n \"prompt\",\n] as const\n\nconst MAX_CALL_LENGTH = 120\nconst MAX_RESULT_LENGTH = 160\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction truncate(value: string, max: number): string {\n const oneLine = value.replace(/\\s+/g, \" \").trim()\n return oneLine.length > max ? `${oneLine.slice(0, max - 1)}…` : oneLine\n}\n\nfunction formatArgValue(value: unknown): string {\n if (typeof value === \"string\") return value\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? \"\" : \"s\"}`\n if (isRecord(value)) return JSON.stringify(value)\n return String(value)\n}\n\nfunction pickSalientArg(args: Record<string, unknown>): string | null {\n for (const key of SALIENT_ARG_KEYS) {\n const value = args[key]\n if (value !== undefined && value !== null && value !== \"\") {\n return formatArgValue(value)\n }\n }\n return null\n}\n\ntype BespokeFormatter = (args: Record<string, unknown>) => string\n\nfunction subagentSummary(args: Record<string, unknown>): string {\n const description =\n typeof args.description === \"string\"\n ? args.description\n : typeof args.prompt === \"string\"\n ? args.prompt\n : \"subagent\"\n return `↳ subagent: ${truncate(description, MAX_CALL_LENGTH)}`\n}\n\n// Bespoke one-liners for control tools where the generic arg-sniffing\n// below would either miss the point (ScheduleWakeup's payload isn't a\n// file/command/pattern) or just repeat the tool name pointlessly\n// (TodoWrite, ExitPlanMode carry no salient single-value arg).\nconst BESPOKE_TOOLS: Record<string, BespokeFormatter> = {\n schedulewakeup: (args) => {\n const delay = args.delaySeconds ?? args.delay ?? \"?\"\n const reason = typeof args.reason === \"string\" ? args.reason : \"\"\n return reason ? `⏰ wake in ${delay}s — ${reason}` : `⏰ wake in ${delay}s`\n },\n task: subagentSummary,\n agent: subagentSummary,\n todowrite: (args) => {\n const todos = Array.isArray(args.todos) ? args.todos : []\n return `☑ todos (${todos.length})`\n },\n exitplanmode: () => \"📋 plan ready\",\n}\n\n/** A one-line human summary of a tool call, e.g. `read src/foo.ts` or `⏰ wake in 30s — checking CI`. */\nexport function formatToolCall(toolName: string, args: unknown): string {\n const name = toolName || \"tool\"\n const argsRecord = isRecord(args) ? args : {}\n\n const bespoke = BESPOKE_TOOLS[name.toLowerCase()]\n if (bespoke) return bespoke(argsRecord)\n\n const salient = pickSalientArg(argsRecord)\n if (salient !== null) {\n // Some ACP agents (e.g. claude-agent-acp) already bake the salient\n // value into a curated title — \"Read src/foo.ts\" alongside\n // arguments.path === \"src/foo.ts\". Appending it again would render\n // \"Read src/foo.ts src/foo.ts\". Only append when it adds new info.\n if (name.toLowerCase().includes(salient.toLowerCase())) {\n return truncate(name, MAX_CALL_LENGTH)\n }\n return truncate(`${name} ${salient}`, MAX_CALL_LENGTH)\n }\n\n if (Object.keys(argsRecord).length === 0) return name\n\n return truncate(`${name} ${JSON.stringify(args)}`, MAX_CALL_LENGTH)\n}\n\nfunction extractText(value: unknown): string | null {\n if (value == null) return null\n if (typeof value === \"string\") return value\n if (Array.isArray(value)) {\n const parts = value.map(extractText).filter((v): v is string => v != null)\n return parts.length ? parts.join(\"\\n\") : null\n }\n if (isRecord(value)) {\n if (typeof value.text === \"string\") return value.text\n if (typeof value.message === \"string\") return value.message\n if (Array.isArray(value.content)) return extractText(value.content)\n if (typeof value.error === \"string\") return value.error\n if (isRecord(value.error) && typeof value.error.message === \"string\") {\n return value.error.message\n }\n return null\n }\n return null\n}\n\n/**\n * A short outcome line for a completed tool call, or `null` when there's\n * nothing useful to show (e.g. an empty/void result). `toolName` is\n * accepted for parity with `formatToolCall` and future bespoke result\n * formatting, but generic text extraction covers today's cases.\n */\nexport function formatToolResult(\n toolName: string | undefined,\n result: unknown,\n isError: boolean,\n): string | null {\n void toolName\n const text = extractText(result)\n\n if (isError) {\n const message = text ?? (result != null ? JSON.stringify(result) : \"failed\")\n const firstLine = message.split(/\\r?\\n/)[0] ?? message\n return truncate(firstLine, MAX_RESULT_LENGTH)\n }\n\n if (text == null) return null\n const trimmed = text.trim()\n if (!trimmed) return null\n\n const lines = trimmed.split(/\\r?\\n/)\n if (lines.length > 1) {\n const bytes = Buffer.byteLength(trimmed, \"utf8\")\n return `${lines.length} lines, ${bytes}B`\n }\n return truncate(lines[0]!, MAX_RESULT_LENGTH)\n}\n\n/** The stdout sentinel the CI artifact-ledger delivery helper prints when it\n * creates a PR / review / comment — MUST byte-match `ARTIFACT_MARKER` in\n * `scripts/lib/artifact-ledger.mjs` (the runner-side harvester). */\nexport const ARTIFACT_MARKER = \"::agentproto-artifact::\"\n\n/** Ring lines per tool result the marker passthrough will re-emit at most —\n * a delivery tool call creates one artifact, so >1 is already unusual; the\n * cap only bounds a pathological result that echoes markers in a loop. */\nconst MAX_ARTIFACT_MARKER_LINES = 8\n\n/**\n * The `::agentproto-artifact::` marker lines buried in a tool result, if any.\n *\n * The one-line summary {@link formatToolResult} produces is deliberately\n * lossy (\"N lines, XB\") — correct for humans, fatal for the CI artifact\n * ledger: the agentflow delivery helper (`deliver-artifact.mjs`) prints its\n * marker to a tool's stdout precisely so the `agentproto-run` driver can\n * harvest created PR/review/comment ids back out of `agent_output`. This\n * extracts those lines so the ring can carry them verbatim alongside the\n * summary. Returned WITHOUT ANSI styling on purpose: the harvester\n * (`parseArtifactMarkers`) does `indexOf(marker)` then `JSON.parse` of the\n * line's remainder, so a trailing reset code would corrupt the JSON.\n */\nexport function artifactMarkerLines(result: unknown): string[] {\n const text = extractText(result)\n if (text == null || !text.includes(ARTIFACT_MARKER)) return []\n return text\n .split(/\\r?\\n/)\n .filter(line => line.includes(ARTIFACT_MARKER))\n .slice(0, MAX_ARTIFACT_MARKER_LINES)\n .map(line => line.trim())\n}\n","/**\n * Pure heuristic module that folds an exported session's messages into a\n * \"story\": chapters (inferred sub-tasks) + steps (one per fixed-height feed\n * row). Backs the `agentproto_session_story` MCP app panel.\n *\n * v1 = pure heuristics, NO LLM. Everything here is deterministic and\n * unit-testable so a future LLM-backed chaptering/summarizing pass can\n * replace the internals behind the same `buildStory(messages) => Story`\n * interface (mirrors the summarize_session heuristic → LLM swap path\n * described in summarize-session-tool.ts).\n *\n * Folding rule (mirrors transcript-export.ts's own batching): an assistant\n * message plus every immediately-following `role: \"tool\"` message collapse\n * into ONE step. A user message is always its own step, and is also a\n * candidate chapter boundary.\n */\n\nimport { formatToolCall, formatToolResult } from \"./tool-presenter.js\"\nimport type { ExportedMessage } from \"./transcript-export.js\"\n\n// Re-exported so consumers of buildStory (e.g. the CLI's `sessions story`\n// command) can type the `/sessions/:id/export?format=json` payload they\n// feed into it without a second import from transcript-export.js.\nexport type { ExportedMessage, ExportedSession, ExportedSessionMeta } from \"./transcript-export.js\"\n\nexport type StoryStepKind = \"text\" | \"edit\" | \"bash\" | \"read\" | \"user\"\nexport type ChapterStatus = \"done\" | \"cur\"\nexport type RouteVerdict = \"cont\" | \"newt\"\n\nexport interface StoryChapter {\n id: string\n title: string\n status: ChapterStatus\n}\n\nexport type StoryItem = { text: string } | { h: string; r: string }\n\nexport interface StoryStep {\n chap: string\n kind: StoryStepKind\n /** HH:MM:SS (UTC) when the source message carried a `ts`, else \"\". */\n ts: string\n sum: string\n raw1: string\n count: number\n facts: string[]\n items: StoryItem[]\n route?: RouteVerdict\n}\n\nexport interface Story {\n chapters: StoryChapter[]\n steps: StoryStep[]\n}\n\n// ── formatting helpers ───────────────────────────────────────────────────\n\nfunction formatTs(ts?: number): string {\n if (ts === undefined || Number.isNaN(ts)) return \"\"\n return new Date(ts).toISOString().slice(11, 19)\n}\n\nfunction firstMeaningfulLine(text?: string): string | undefined {\n if (!text) return undefined\n const line = text\n .split(\"\\n\")\n .map(l => l.trim())\n .find(l => l.length > 0)\n return line\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text\n}\n\nfunction parseArgs(argsJson: string): unknown {\n try {\n return JSON.parse(argsJson)\n } catch {\n return {}\n }\n}\n\nfunction lineCount(text: string): number {\n return text.split(\"\\n\").filter(l => l.trim().length > 0).length || 1\n}\n\n// ── kind classification ──────────────────────────────────────────────────\n\n/** Dominant kind for a group of tool calls: edit/write → edit, bash/terminal/\n * command → bash, read/grep/glob → read, else text (pure assistant text). */\nexport function classifyKind(toolCalls?: readonly { name: string }[]): StoryStepKind {\n if (!toolCalls || toolCalls.length === 0) return \"text\"\n const names = toolCalls.map(t => t.name.toLowerCase())\n if (names.some(n => /edit|write/.test(n))) return \"edit\"\n if (names.some(n => /bash|terminal|command/.test(n))) return \"bash\"\n if (names.some(n => /read|grep|glob/.test(n))) return \"read\"\n return \"text\"\n}\n\n// ── chapter routing (mockup's `classify()`, ported verbatim) ────────────\n\nconst NEW_CHAPTER_RE =\n /\\b(aussi|autre|ensuite|nouveau|nouvelle|plut[oô]t|maintenant|apr[eè]s ça|il faudrait|peux[- ]tu|on pourrait|ajoute|g[eè]re)\\b/iu\n\nexport function classifyRoute(text: string): { route: RouteVerdict; title?: string } {\n const newt = NEW_CHAPTER_RE.test(text)\n if (!newt) return { route: \"cont\" }\n const title = text.replace(/[.?!].*$/, \"\").slice(0, 42)\n return { route: \"newt\", title }\n}\n\n// ── folding: raw messages → steps (chapter unassigned) ───────────────────\n\ninterface FoldedStep {\n kind: StoryStepKind\n ts: string\n sum: string\n raw1: string\n count: number\n facts: string[]\n items: StoryItem[]\n /** Present only for user steps — drives chapter routing. */\n userText?: string\n}\n\nfunction foldToolStep(assistant: ExportedMessage, toolResults: ExportedMessage[]): FoldedStep {\n const toolCalls = assistant.toolCalls ?? []\n const kind = classifyKind(toolCalls)\n const count = toolCalls.length || 1\n\n const items: StoryItem[] = []\n const facts: string[] = []\n if (assistant.text?.trim()) items.push({ text: assistant.text.trim() })\n toolCalls.forEach((tc, i) => {\n const args = parseArgs(tc.args)\n const h = formatToolCall(tc.name, args)\n const resultMsg = toolResults[i]\n const resultText = resultMsg?.text ?? \"\"\n const isError = resultText.startsWith(\"[error]\")\n const r = isError ? resultText.slice(\"[error]\".length).trim() : resultText\n items.push({ h, r })\n const fact = formatToolResult(tc.name, r, isError)\n if (fact) facts.push(fact)\n })\n\n const firstLine = firstMeaningfulLine(assistant.text)\n const firstToolCall = toolCalls[0]\n const sum =\n firstLine ??\n (firstToolCall ? formatToolCall(firstToolCall.name, parseArgs(firstToolCall.args)) : \"…\")\n\n let raw1: string\n if (toolCalls.length === 0) {\n raw1 = `assistant · ${lineCount(assistant.text ?? \"\")} ligne(s)`\n } else if (toolCalls.length === 1 && firstToolCall) {\n raw1 = formatToolCall(firstToolCall.name, parseArgs(firstToolCall.args))\n } else {\n raw1 = `${firstToolCall?.name ?? \"tool\"} ×${toolCalls.length}`\n }\n\n return {\n kind,\n ts: formatTs(assistant.ts),\n sum,\n raw1,\n count,\n facts,\n items,\n }\n}\n\nfunction foldUserStep(msg: ExportedMessage): FoldedStep {\n const text = msg.text ?? \"\"\n const sum = `« ${truncate(text, 80)} »`\n return {\n kind: \"user\",\n ts: formatTs(msg.ts),\n sum,\n raw1: `user · ${lineCount(text)} ligne(s)`,\n count: 1,\n facts: [],\n items: [{ text }],\n userText: text,\n }\n}\n\nfunction foldOrphanToolStep(msg: ExportedMessage): FoldedStep {\n const text = msg.text ?? \"\"\n const isError = text.startsWith(\"[error]\")\n const r = isError ? text.slice(\"[error]\".length).trim() : text\n const name = msg.toolName ?? \"tool\"\n const fact = formatToolResult(name, r, isError)\n return {\n kind: classifyKind([{ name }]),\n ts: formatTs(msg.ts),\n sum: msg.toolName ? `${msg.toolName} · résultat` : \"Résultat d'outil\",\n raw1: msg.toolName ?? \"tool\",\n count: 1,\n facts: fact ? [fact] : [],\n items: [{ h: name, r }],\n }\n}\n\nfunction foldSystemStep(msg: ExportedMessage): FoldedStep {\n const text = msg.text ?? \"\"\n return {\n kind: \"text\",\n ts: formatTs(msg.ts),\n sum: firstMeaningfulLine(text) ?? text,\n raw1: \"system\",\n count: 1,\n facts: [],\n items: text ? [{ text }] : [],\n }\n}\n\nfunction foldMessages(messages: readonly ExportedMessage[]): FoldedStep[] {\n const steps: FoldedStep[] = []\n let i = 0\n while (i < messages.length) {\n const msg = messages[i]!\n if (msg.role === \"user\") {\n steps.push(foldUserStep(msg))\n i += 1\n continue\n }\n if (msg.role === \"assistant\") {\n let j = i + 1\n const toolResults: ExportedMessage[] = []\n while (j < messages.length && messages[j]!.role === \"tool\") {\n toolResults.push(messages[j]!)\n j += 1\n }\n steps.push(foldToolStep(msg, toolResults))\n i = j\n continue\n }\n if (msg.role === \"tool\") {\n // Orphan tool result with no preceding assistant message — rare, but\n // render it as its own read-only step rather than dropping data.\n steps.push(foldOrphanToolStep(msg))\n i += 1\n continue\n }\n // system\n steps.push(foldSystemStep(msg))\n i += 1\n }\n return steps\n}\n\n// ── chaptering: assign each folded step to a chapter ─────────────────────\n\nexport function buildStory(messages: readonly ExportedMessage[]): Story {\n const folded = foldMessages(messages)\n const chapters: StoryChapter[] = []\n const steps: StoryStep[] = []\n\n let currentChapterId: string | undefined\n let sawFirstUser = false\n\n const closeCurrent = (): void => {\n const cur = chapters.find(c => c.id === currentChapterId)\n if (cur) cur.status = \"done\"\n }\n const openChapter = (title: string): string => {\n const id = `c${chapters.length + 1}`\n chapters.push({ id, title, status: \"cur\" })\n return id\n }\n\n for (const step of folded) {\n let route: RouteVerdict | undefined\n if (step.kind === \"user\" && step.userText !== undefined) {\n if (!sawFirstUser) {\n sawFirstUser = true\n currentChapterId = openChapter(\"Cadrage\")\n } else {\n const verdict = classifyRoute(step.userText)\n route = verdict.route\n if (verdict.route === \"newt\") {\n closeCurrent()\n currentChapterId = openChapter(verdict.title || \"Nouvelle sous-tâche\")\n }\n }\n } else if (currentChapterId === undefined) {\n // Transcript opens with assistant/system output before any user\n // message (unusual, but keep every step chaptered).\n currentChapterId = openChapter(\"Cadrage\")\n }\n\n steps.push({\n chap: currentChapterId!,\n kind: step.kind,\n ts: step.ts,\n sum: step.sum,\n raw1: step.raw1,\n count: step.count,\n facts: step.facts,\n items: step.items,\n ...(route ? { route } : {}),\n })\n }\n\n return { chapters, steps }\n}\n"]}
@@ -136,6 +136,14 @@ interface ResolvedSpawnAuthMaterial {
136
136
  * key" (fail-fast) from "set nothing" (ambient) — both give no credential.
137
137
  * DECISION 5. */
138
138
  explicit: boolean;
139
+ /** True when the `auth` block came from CONFIG (`defaults.adapters.<slug>.auth`)
140
+ * rather than the per-spawn `agent_start.auth` request. A sandboxed spawn
141
+ * bills on the BOX daemon, which has neither the host's config nor its
142
+ * keychain — the host uses this to know it must resolve the configured
143
+ * wallet credential itself and forward it (see `session-spawn.ts`'s
144
+ * `resolveHostAuth`). A per-spawn `auth` keeps its own raw-forward path
145
+ * and never forces host adapter resolution. */
146
+ explicitConfig: boolean;
139
147
  /** Subscription bearer token (per-spawn > config), if configured. STATIC
140
148
  * material only — the self-refreshing {@link subscriptionSource} is resolved
141
149
  * separately (and impurely) by the caller. */
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+
3
+ /** Shared pagination params, spread into every list tool's input schema. */
4
+ interface PageParams {
5
+ limit?: number;
6
+ cursor?: string;
7
+ since?: number;
8
+ compact?: boolean;
9
+ full?: boolean;
10
+ fields?: string[];
11
+ }
12
+ interface Page<T> {
13
+ items: T[];
14
+ nextCursor?: string;
15
+ total?: number;
16
+ truncated?: boolean;
17
+ }
18
+ /** Opaque cursor: base64(JSON `{ k: keysetValue, i: index }`). */
19
+ interface CursorPayload {
20
+ k: string | number | null;
21
+ i: number;
22
+ }
23
+ declare function encodeCursor(payload: CursorPayload): string;
24
+ /** No `unknown`/`as`: the JSON boundary is typed by zod's safeParse/parse. */
25
+ declare function decodeCursor(token: string): CursorPayload | null;
26
+ interface PaginateOpts<T> {
27
+ maxLimit: number;
28
+ keyOf?: (item: T) => string | number | null;
29
+ }
30
+ declare function paginate<T>(items: readonly T[], params: PageParams, opts: PaginateOpts<T>): Page<T>;
31
+ /** Compact serializer — replaces every `JSON.stringify(x, null, 2)` in list handlers. */
32
+ declare function toolText<T>(page: Page<T>): string;
33
+ /** Zod fragment to spread into each list tool's input schema. */
34
+ declare const pageParamsShape: {
35
+ readonly limit: z.ZodOptional<z.ZodNumber>;
36
+ readonly cursor: z.ZodOptional<z.ZodString>;
37
+ readonly compact: z.ZodOptional<z.ZodBoolean>;
38
+ readonly full: z.ZodOptional<z.ZodBoolean>;
39
+ readonly fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ };
41
+
42
+ export { type CursorPayload, type Page, type PageParams, type PaginateOpts, decodeCursor, encodeCursor, pageParamsShape, paginate, toolText };
@@ -0,0 +1,60 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * @agentproto/runtime v0.1.0-alpha
5
+ * Long-running gateway: MCP server + HTTP transport + HEARTBEAT autonomy + conversation persistence over a workspace dir.
6
+ */
7
+
8
+ function encodeCursor(payload) {
9
+ return Buffer.from(JSON.stringify(payload), "utf8").toString("base64url");
10
+ }
11
+ var cursorPayloadSchema = z.object({
12
+ k: z.union([z.string(), z.number(), z.null()]),
13
+ i: z.number().int().min(0)
14
+ });
15
+ function decodeCursor(token) {
16
+ let text;
17
+ try {
18
+ text = Buffer.from(token, "base64url").toString("utf8");
19
+ } catch {
20
+ return null;
21
+ }
22
+ try {
23
+ return cursorPayloadSchema.parse(JSON.parse(text));
24
+ } catch {
25
+ return null;
26
+ }
27
+ }
28
+ function paginate(items, params, opts) {
29
+ const limit = Math.min(Math.max(params.limit ?? 50, 1), opts.maxLimit);
30
+ let start = 0;
31
+ if (params.cursor) {
32
+ const decoded = decodeCursor(params.cursor);
33
+ if (decoded && decoded.i >= 0 && decoded.i <= items.length) start = decoded.i;
34
+ }
35
+ const end = start + limit;
36
+ const slice = items.slice(start, end);
37
+ const keyAt = (idx) => {
38
+ const item = items[idx];
39
+ return opts.keyOf && item !== void 0 ? opts.keyOf(item) : null;
40
+ };
41
+ return {
42
+ items: slice,
43
+ ...end < items.length ? { nextCursor: encodeCursor({ k: keyAt(end), i: end }) } : {},
44
+ total: items.length
45
+ };
46
+ }
47
+ function toolText(page) {
48
+ return JSON.stringify(page);
49
+ }
50
+ var pageParamsShape = {
51
+ limit: z.number().int().min(1).max(200).optional().describe("Max items per page. Default 50."),
52
+ cursor: z.string().optional().describe("Opaque token from a prior call's `nextCursor`."),
53
+ compact: z.boolean().optional().describe("Compact projection (fewer fields per item). Default false."),
54
+ full: z.boolean().optional().describe("Legacy full-record payload (opts out of compact). Default false."),
55
+ fields: z.array(z.string()).optional().describe("Keep only these fields per item.")
56
+ };
57
+
58
+ export { decodeCursor, encodeCursor, pageParamsShape, paginate, toolText };
59
+ //# sourceMappingURL=tool-envelope.mjs.map
60
+ //# sourceMappingURL=tool-envelope.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-envelope.ts"],"names":[],"mappings":"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","file":"tool-envelope.mjs","sourcesContent":["import { z } from \"zod\"\n\n/** Shared pagination params, spread into every list tool's input schema. */\nexport interface PageParams {\n limit?: number\n cursor?: string\n since?: number\n compact?: boolean\n full?: boolean\n fields?: string[]\n}\n\nexport interface Page<T> {\n items: T[]\n nextCursor?: string\n total?: number\n truncated?: boolean\n}\n\n/** Opaque cursor: base64(JSON `{ k: keysetValue, i: index }`). */\nexport interface CursorPayload {\n k: string | number | null\n i: number\n}\n\nexport function encodeCursor(payload: CursorPayload): string {\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\")\n}\n\nconst cursorPayloadSchema = z.object({\n k: z.union([z.string(), z.number(), z.null()]),\n i: z.number().int().min(0),\n})\n\n/** No `unknown`/`as`: the JSON boundary is typed by zod's safeParse/parse. */\nexport function decodeCursor(token: string): CursorPayload | null {\n let text: string\n try {\n text = Buffer.from(token, \"base64url\").toString(\"utf8\")\n } catch {\n return null\n }\n try {\n return cursorPayloadSchema.parse(JSON.parse(text))\n } catch {\n return null\n }\n}\n\nexport interface PaginateOpts<T> {\n maxLimit: number\n keyOf?: (item: T) => string | number | null\n}\n\nexport function paginate<T>(items: readonly T[], params: PageParams, opts: PaginateOpts<T>): Page<T> {\n const limit = Math.min(Math.max(params.limit ?? 50, 1), opts.maxLimit)\n let start = 0\n if (params.cursor) {\n const decoded = decodeCursor(params.cursor)\n if (decoded && decoded.i >= 0 && decoded.i <= items.length) start = decoded.i\n }\n const end = start + limit\n const slice = items.slice(start, end)\n const keyAt = (idx: number): string | number | null => {\n const item = items[idx]\n return opts.keyOf && item !== undefined ? opts.keyOf(item) : null\n }\n return {\n items: slice,\n ...(end < items.length ? { nextCursor: encodeCursor({ k: keyAt(end), i: end }) } : {}),\n total: items.length,\n }\n}\n\n/** Compact serializer — replaces every `JSON.stringify(x, null, 2)` in list handlers. */\nexport function toolText<T>(page: Page<T>): string {\n return JSON.stringify(page)\n}\n\n/** Zod fragment to spread into each list tool's input schema. */\nexport const pageParamsShape = {\n limit: z.number().int().min(1).max(200).optional().describe(\"Max items per page. Default 50.\"),\n cursor: z.string().optional().describe(\"Opaque token from a prior call's `nextCursor`.\"),\n compact: z.boolean().optional().describe(\"Compact projection (fewer fields per item). Default false.\"),\n full: z.boolean().optional().describe(\"Legacy full-record payload (opts out of compact). Default false.\"),\n fields: z.array(z.string()).optional().describe(\"Keep only these fields per item.\"),\n} as const\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentproto/runtime",
3
- "version": "2.10.1",
3
+ "version": "2.12.0",
4
4
  "description": "@agentproto/runtime — long-running gateway that turns an agentproto workspace into a live runtime. Composes @agentproto/mcp-server (CRUD verbs) with HTTP transport, HEARTBEAT.md autonomy loop, and append-only conversation persistence. Drop a workspace dir, point your MCP client at it, and the agent ticks on its own.",
5
5
  "keywords": [
6
6
  "agentproto",
@@ -101,15 +101,15 @@
101
101
  "import": "./dist/session-story.mjs",
102
102
  "default": "./dist/session-story.mjs"
103
103
  },
104
- "./session-story-panel": {
105
- "types": "./dist/session-story-panel.d.ts",
106
- "import": "./dist/session-story-panel.mjs",
107
- "default": "./dist/session-story-panel.mjs"
108
- },
109
104
  "./user-presets": {
110
105
  "types": "./dist/user-presets.d.ts",
111
106
  "import": "./dist/user-presets.mjs",
112
107
  "default": "./dist/user-presets.mjs"
108
+ },
109
+ "./tool-envelope": {
110
+ "types": "./dist/tool-envelope.d.ts",
111
+ "import": "./dist/tool-envelope.mjs",
112
+ "default": "./dist/tool-envelope.mjs"
113
113
  }
114
114
  },
115
115
  "files": [
@@ -127,33 +127,35 @@
127
127
  "gray-matter": "^4.0.3",
128
128
  "ws": "^8.21.3",
129
129
  "zod": "^4.5.4",
130
+ "@agentproto/acp": "0.8.0",
130
131
  "@agentproto/agent": "0.2.2",
131
- "@agentproto/app-kit": "0.7.1",
132
- "@agentproto/acp": "0.7.3",
132
+ "@agentproto/app-client": "0.3.0",
133
+ "@agentproto/app-kit": "1.0.0",
134
+ "@agentproto/apps": "0.9.1",
133
135
  "@agentproto/auth": "1.0.1",
134
136
  "@agentproto/command-sandbox": "0.2.0",
135
137
  "@agentproto/driver": "0.2.1",
136
- "@agentproto/driver-agent-cli": "2.4.0",
137
- "@agentproto/eval-reporters": "0.2.8",
138
+ "@agentproto/driver-agent-cli": "2.4.1",
139
+ "@agentproto/eval-reporters": "0.2.10",
138
140
  "@agentproto/manifest": "0.2.1",
139
- "@agentproto/model-catalog": "0.9.1",
140
- "@agentproto/mcp-server": "0.2.6",
141
+ "@agentproto/model-catalog": "0.9.2",
142
+ "@agentproto/mcp-server": "0.2.7",
143
+ "@agentproto/provider-kit": "0.4.2",
141
144
  "@agentproto/provider-presets": "0.6.1",
142
- "@agentproto/providers-store": "0.3.10",
145
+ "@agentproto/providers-store": "0.3.11",
143
146
  "@agentproto/redaction": "0.2.1",
144
147
  "@agentproto/routine": "0.2.1",
145
- "@agentproto/sandbox": "0.2.5",
148
+ "@agentproto/sandbox": "0.3.0",
146
149
  "@agentproto/secrets": "0.2.4",
147
- "@agentproto/telemetry-langfuse": "0.2.6",
150
+ "@agentproto/telemetry-langfuse": "0.2.8",
151
+ "@agentproto/workflow-loader": "0.2.0",
148
152
  "@agentproto/tool": "0.2.2",
149
- "@agentproto/workflow": "0.3.1",
150
- "@agentproto/workflow-loader": "0.1.5",
151
- "@agentproto/workflow-runtime": "0.8.1",
152
- "@agentproto/workspace-brain": "0.4.1",
153
- "@agentproto/provider-kit": "0.4.2"
153
+ "@agentproto/workflow": "0.4.0",
154
+ "@agentproto/workflow-runtime": "0.10.0",
155
+ "@agentproto/workspace-brain": "0.4.3"
154
156
  },
155
157
  "optionalDependencies": {
156
- "@agentproto/sandbox-e2b": "0.3.6"
158
+ "@agentproto/sandbox-e2b": "0.4.0"
157
159
  },
158
160
  "devDependencies": {
159
161
  "@types/node": "^25.6.2",
@@ -163,7 +165,7 @@
163
165
  "vite-node": "^3.2.4",
164
166
  "vitest": "^3.2.4",
165
167
  "@agentproto/rendezvous": "0.2.2",
166
- "@agentproto/tooling": "0.1.0-alpha.0",
168
+ "@agentproto/tooling": "0.1.0",
167
169
  "@agentproto/transcript-fixtures": "0.2.0"
168
170
  },
169
171
  "scripts": {
@@ -1,26 +0,0 @@
1
- /**
2
- * MCP App resource: agentproto session story panel.
3
- *
4
- * Ported 1:1 from the validated mockup at docs/session-story-mockup.html —
5
- * same CSS, same DOM structure/classes, same interaction model (anchored
6
- * side panel, sticky collapsible chapter headers, Simple/Tech toggle,
7
- * composer with local chapter-routing classification). Fake data is
8
- * replaced with live data pulled through the MCP Apps postMessage bridge.
9
- *
10
- * The HTML must stay fully self-contained (CSP: inline CSS/JS only, no
11
- * CDN, no external fonts) — see mcp-apps-adapter.ts and the other panels
12
- * in this file family (sessions-panel.ts, agents-overview-app.ts) for the
13
- * same constraint. Because of that, this file cannot `import` the pure
14
- * `buildStory` module from session-story.ts — the folding/chaptering
15
- * heuristics are ported to vanilla JS below (`buildStoryJs`), mirroring
16
- * session-story.ts function-for-function so the two stay easy to diff.
17
- *
18
- * Protocol: MCP Apps ext spec 2026-01-26
19
- * – Bridge: JSON-RPC 2.0 over window.parent.postMessage
20
- * – Handshake: ui/initialize → host result → ui/notifications/initialized
21
- * – Data: tools/call → session_list (status/picker) + agent_export
22
- * (timeline, re-fetched on turn boundaries) + agent_prompt (composer)
23
- */
24
- declare const SESSION_STORY_PANEL_HTML: string;
25
-
26
- export { SESSION_STORY_PANEL_HTML };