@agentproto/runtime 2.10.1 → 2.11.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":";;;;;;AAOA,IAAM,gBAAA,GAAmB;AAAA,EACvB,WAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,iBAAA,GAAoB,GAAA;AAE1B,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,QAAA,CAAS,OAAe,GAAA,EAAqB;AACpD,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAChD,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,OAAA;AAClE;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,KAAA,EAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AACrF,EAAA,IAAI,SAAS,KAAK,CAAA,EAAG,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAChD,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,eAAe,IAAA,EAA8C;AACpE,EAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,MAAA,OAAO,eAAe,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,gBAAgB,IAAA,EAAuC;AAC9D,EAAA,MAAM,WAAA,GACJ,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,GACxB,IAAA,CAAK,WAAA,GACL,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GACrB,IAAA,CAAK,MAAA,GACL,UAAA;AACR,EAAA,OAAO,CAAA,iBAAA,EAAe,QAAA,CAAS,WAAA,EAAa,eAAe,CAAC,CAAA,CAAA;AAC9D;AAMA,IAAM,aAAA,GAAkD;AAAA,EACtD,cAAA,EAAgB,CAAC,IAAA,KAAS;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,KAAA,IAAS,GAAA;AACjD,IAAA,MAAM,SAAS,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,KAAK,MAAA,GAAS,EAAA;AAC/D,IAAA,OAAO,SAAS,CAAA,eAAA,EAAa,KAAK,YAAO,MAAM,CAAA,CAAA,GAAK,kBAAa,KAAK,CAAA,CAAA,CAAA;AAAA,EACxE,CAAA;AAAA,EACA,IAAA,EAAM,eAAA;AAAA,EACN,KAAA,EAAO,eAAA;AAAA,EACP,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAC;AACxD,IAAA,OAAO,CAAA,cAAA,EAAY,MAAM,MAAM,CAAA,CAAA,CAAA;AAAA,EACjC,CAAA;AAAA,EACA,cAAc,MAAM;AACtB,CAAA;AAGO,SAAS,cAAA,CAAe,UAAkB,IAAA,EAAuB;AACtE,EAAA,MAAM,OAAO,QAAA,IAAY,MAAA;AACzB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAI,CAAA,GAAI,OAAO,EAAC;AAE5C,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,WAAA,EAAa,CAAA;AAChD,EAAA,IAAI,OAAA,EAAS,OAAO,OAAA,CAAQ,UAAU,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,eAAe,UAAU,CAAA;AACzC,EAAA,IAAI,YAAY,IAAA,EAAM;AAKpB,IAAA,IAAI,KAAK,WAAA,EAAY,CAAE,SAAS,OAAA,CAAQ,WAAA,EAAa,CAAA,EAAG;AACtD,MAAA,OAAO,QAAA,CAAS,MAAM,eAAe,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,SAAS,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,eAAe,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,IAAA;AAEjD,EAAA,OAAO,QAAA,CAAS,GAAG,IAAI,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,EAAI,eAAe,CAAA;AACpE;AAEA,SAAS,YAAY,KAAA,EAA+B;AAClD,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,WAAW,EAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,IAAK,IAAI,CAAA;AACzE,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,EAC3C;AACA,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,SAAiB,KAAA,CAAM,IAAA;AACjD,IAAA,IAAI,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,SAAiB,KAAA,CAAM,OAAA;AACpD,IAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,CAAM,OAAO,GAAG,OAAO,WAAA,CAAY,MAAM,OAAO,CAAA;AAClE,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,SAAiB,KAAA,CAAM,KAAA;AAClD,IAAA,IAAI,QAAA,CAAS,MAAM,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,KAAA,CAAM,YAAY,QAAA,EAAU;AACpE,MAAA,OAAO,MAAM,KAAA,CAAM,OAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,gBAAA,CACd,QAAA,EACA,MAAA,EACA,OAAA,EACe;AAEf,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM,CAAA;AAE/B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,UAAU,IAAA,KAAS,MAAA,IAAU,OAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,QAAA,CAAA;AACnE,IAAA,MAAM,YAAY,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,WAAW,iBAAiB,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,IAAA,IAAQ,MAAM,OAAO,IAAA;AACzB,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AAC/C,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAI,iBAAiB,CAAA;AAC9C;;;ACpGA,SAAS,SAAS,EAAA,EAAqB;AACrC,EAAA,IAAI,OAAO,MAAA,IAAa,MAAA,CAAO,KAAA,CAAM,EAAE,GAAG,OAAO,EAAA;AACjD,EAAA,OAAO,IAAI,KAAK,EAAE,CAAA,CAAE,aAAY,CAAE,KAAA,CAAM,IAAI,EAAE,CAAA;AAChD;AAEA,SAAS,oBAAoB,IAAA,EAAmC;AAC9D,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CACV,KAAA,CAAM,IAAI,EACV,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CACjB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AACzB,EAAA,OAAO,IAAA;AACT;AAEA,SAASA,SAAAA,CAAS,MAAc,GAAA,EAAqB;AACnD,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AAC5D;AAEA,SAAS,UAAU,QAAA,EAA2B;AAC5C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA;AACrE;AAMO,SAAS,aAAa,SAAA,EAAwD;AACnF,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,MAAA;AACjD,EAAA,MAAM,QAAQ,SAAA,CAAU,GAAA,CAAI,OAAK,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,YAAA,CAAa,KAAK,CAAC,CAAC,GAAG,OAAO,MAAA;AAClD,EAAA,IAAI,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,uBAAA,CAAwB,KAAK,CAAC,CAAC,GAAG,OAAO,MAAA;AAC7D,EAAA,IAAI,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,gBAAA,CAAiB,KAAK,CAAC,CAAC,GAAG,OAAO,MAAA;AACtD,EAAA,OAAO,MAAA;AACT;AAIA,IAAM,cAAA,GACJ,iIAAA;AAEK,SAAS,cAAc,IAAA,EAAuD;AACnF,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,OAAO,MAAA,EAAO;AAClC,EAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACtD,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAM;AAChC;AAgBA,SAAS,YAAA,CAAa,WAA4B,WAAA,EAA4C;AAC5F,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,SAAA,IAAa,EAAC;AAC1C,EAAA,MAAM,IAAA,GAAO,aAAa,SAAS,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,UAAU,MAAA,IAAU,CAAA;AAElC,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,SAAA,CAAU,IAAA,EAAM,IAAA,EAAK,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,IAAA,EAAK,EAAG,CAAA;AACtE,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AAC3B,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,EAAA,CAAG,IAAI,CAAA;AAC9B,IAAA,MAAM,CAAA,GAAI,cAAA,CAAe,EAAA,CAAG,IAAA,EAAM,IAAI,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,YAAY,CAAC,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,WAAW,IAAA,IAAQ,EAAA;AACtC,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,MAAM,CAAA,GAAI,UAAU,UAAA,CAAW,KAAA,CAAM,UAAU,MAAM,CAAA,CAAE,MAAK,GAAI,UAAA;AAChE,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,EAAA,CAAG,IAAA,EAAM,GAAG,OAAO,CAAA;AACjD,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,SAAA,CAAU,IAAI,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgB,UAAU,CAAC,CAAA;AACjC,EAAA,MAAM,GAAA,GACJ,SAAA,KACC,aAAA,GAAgB,cAAA,CAAe,aAAA,CAAc,MAAM,SAAA,CAAU,aAAA,CAAc,IAAI,CAAC,CAAA,GAAI,QAAA,CAAA;AAEvF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAA,GAAO,CAAA,eAAA,EAAe,SAAA,CAAU,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAC,CAAA,SAAA,CAAA;AAAA,EACvD,CAAA,MAAA,IAAW,SAAA,CAAU,MAAA,KAAW,CAAA,IAAK,aAAA,EAAe;AAClD,IAAA,IAAA,GAAO,eAAe,aAAA,CAAc,IAAA,EAAM,SAAA,CAAU,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,EACzE,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,GAAG,aAAA,EAAe,IAAA,IAAQ,MAAM,CAAA,KAAA,EAAK,UAAU,MAAM,CAAA,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,EAAA,EAAI,QAAA,CAAS,SAAA,CAAU,EAAE,CAAA;AAAA,IACzB,GAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,aAAa,GAAA,EAAkC;AACtD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,EAAA;AACzB,EAAA,MAAM,GAAA,GAAM,CAAA,KAAA,EAAKA,SAAAA,CAAS,IAAA,EAAM,EAAE,CAAC,CAAA,KAAA,CAAA;AACnC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,IACnB,GAAA;AAAA,IACA,IAAA,EAAM,CAAA,UAAA,EAAU,SAAA,CAAU,IAAI,CAAC,CAAA,SAAA,CAAA;AAAA,IAC/B,KAAA,EAAO,CAAA;AAAA,IACP,OAAO,EAAC;AAAA,IACR,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,CAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,mBAAmB,GAAA,EAAkC;AAC5D,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,EAAA;AACzB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AACzC,EAAA,MAAM,CAAA,GAAI,UAAU,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM,CAAA,CAAE,MAAK,GAAI,IAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,IAAY,MAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,MAAM,YAAA,CAAa,CAAC,EAAE,IAAA,EAAM,CAAC,CAAA;AAAA,IAC7B,EAAA,EAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,IACnB,KAAK,GAAA,CAAI,QAAA,GAAW,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,iBAAA,CAAA,GAAgB,qBAAA;AAAA,IACnD,IAAA,EAAM,IAAI,QAAA,IAAY,MAAA;AAAA,IACtB,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO,IAAA,GAAO,CAAC,IAAI,IAAI,EAAC;AAAA,IACxB,OAAO,CAAC,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG;AAAA,GACxB;AACF;AAEA,SAAS,eAAe,GAAA,EAAkC;AACxD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,EAAA;AACzB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,IACnB,GAAA,EAAK,mBAAA,CAAoB,IAAI,CAAA,IAAK,IAAA;AAAA,IAClC,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,OAAO,EAAC;AAAA,IACR,OAAO,IAAA,GAAO,CAAC,EAAE,IAAA,EAAM,IAAI;AAAC,GAC9B;AACF;AAEA,SAAS,aAAa,QAAA,EAAoD;AACxE,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAC5B,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,MAAM,cAAiC,EAAC;AACxC,MAAA,OAAO,IAAI,QAAA,CAAS,MAAA,IAAU,SAAS,CAAC,CAAA,CAAG,SAAS,MAAA,EAAQ;AAC1D,QAAA,WAAA,CAAY,IAAA,CAAK,QAAA,CAAS,CAAC,CAAE,CAAA;AAC7B,QAAA,CAAA,IAAK,CAAA;AAAA,MACP;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,WAAW,CAAC,CAAA;AACzC,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AAGvB,MAAA,KAAA,CAAM,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAClC,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,GAAG,CAAC,CAAA;AAC9B,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,OAAO,KAAA;AACT;AAIO,SAAS,WAAW,QAAA,EAA6C;AACtE,EAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AACpC,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,MAAM,QAAqB,EAAC;AAE5B,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,eAAe,MAAY;AAC/B,IAAA,MAAM,MAAM,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AACxD,IAAA,IAAI,GAAA,MAAS,MAAA,GAAS,MAAA;AAAA,EACxB,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA0B;AAC7C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAA,EAAI,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,CAAA;AAClC,IAAA,QAAA,CAAS,KAAK,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAC1C,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,aAAa,MAAA,EAAW;AACvD,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,gBAAA,GAAmB,YAAY,SAAS,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA;AAC3C,QAAA,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAChB,QAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAQ;AAC5B,UAAA,YAAA,EAAa;AACb,UAAA,gBAAA,GAAmB,WAAA,CAAY,OAAA,CAAQ,KAAA,IAAS,wBAAqB,CAAA;AAAA,QACvE;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,qBAAqB,MAAA,EAAW;AAGzC,MAAA,gBAAA,GAAmB,YAAY,SAAS,CAAA;AAAA,IAC1C;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,gBAAA;AAAA,MACN,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,KAC1B,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAC3B","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentproto/runtime",
3
- "version": "2.10.1",
3
+ "version": "2.11.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,11 +101,6 @@
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",
@@ -127,33 +122,34 @@
127
122
  "gray-matter": "^4.0.3",
128
123
  "ws": "^8.21.3",
129
124
  "zod": "^4.5.4",
130
- "@agentproto/agent": "0.2.2",
131
- "@agentproto/app-kit": "0.7.1",
132
125
  "@agentproto/acp": "0.7.3",
126
+ "@agentproto/agent": "0.2.2",
127
+ "@agentproto/app-kit": "0.8.0",
128
+ "@agentproto/apps": "0.9.0",
133
129
  "@agentproto/auth": "1.0.1",
134
130
  "@agentproto/command-sandbox": "0.2.0",
135
131
  "@agentproto/driver": "0.2.1",
136
132
  "@agentproto/driver-agent-cli": "2.4.0",
137
- "@agentproto/eval-reporters": "0.2.8",
133
+ "@agentproto/eval-reporters": "0.2.9",
138
134
  "@agentproto/manifest": "0.2.1",
139
- "@agentproto/model-catalog": "0.9.1",
140
135
  "@agentproto/mcp-server": "0.2.6",
136
+ "@agentproto/model-catalog": "0.9.1",
137
+ "@agentproto/provider-kit": "0.4.2",
141
138
  "@agentproto/provider-presets": "0.6.1",
142
139
  "@agentproto/providers-store": "0.3.10",
143
140
  "@agentproto/redaction": "0.2.1",
144
141
  "@agentproto/routine": "0.2.1",
145
- "@agentproto/sandbox": "0.2.5",
142
+ "@agentproto/sandbox": "0.2.6",
146
143
  "@agentproto/secrets": "0.2.4",
147
- "@agentproto/telemetry-langfuse": "0.2.6",
144
+ "@agentproto/telemetry-langfuse": "0.2.7",
148
145
  "@agentproto/tool": "0.2.2",
149
146
  "@agentproto/workflow": "0.3.1",
150
147
  "@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"
148
+ "@agentproto/workflow-runtime": "0.9.0",
149
+ "@agentproto/workspace-brain": "0.4.2"
154
150
  },
155
151
  "optionalDependencies": {
156
- "@agentproto/sandbox-e2b": "0.3.6"
152
+ "@agentproto/sandbox-e2b": "0.3.7"
157
153
  },
158
154
  "devDependencies": {
159
155
  "@types/node": "^25.6.2",
@@ -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 };