@athenaintel/react 0.38.1 → 0.40.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.
Files changed (137) hide show
  1. package/README.md +23 -3
  2. package/dist/agent-runtime/src/errors.cjs +8 -0
  3. package/dist/agent-runtime/src/errors.cjs.map +1 -1
  4. package/dist/agent-runtime/src/errors.js +8 -0
  5. package/dist/agent-runtime/src/errors.js.map +1 -1
  6. package/dist/agent-runtime/src/messages.cjs +76 -16
  7. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  8. package/dist/agent-runtime/src/messages.js +76 -16
  9. package/dist/agent-runtime/src/messages.js.map +1 -1
  10. package/dist/agent-runtime/src/tool-metadata.cjs +15 -0
  11. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  12. package/dist/agent-runtime/src/tool-metadata.js +15 -0
  13. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  14. package/dist/assets/use-asset-content.cjs +127 -0
  15. package/dist/assets/use-asset-content.cjs.map +1 -0
  16. package/dist/assets/use-asset-content.d.ts +60 -0
  17. package/dist/assets/use-asset-content.js +127 -0
  18. package/dist/assets/use-asset-content.js.map +1 -0
  19. package/dist/chat/super-grouping/CollapsibleGroup.cjs +16 -8
  20. package/dist/chat/super-grouping/CollapsibleGroup.cjs.map +1 -1
  21. package/dist/chat/super-grouping/CollapsibleGroup.d.ts +26 -1
  22. package/dist/chat/super-grouping/CollapsibleGroup.js +16 -8
  23. package/dist/chat/super-grouping/CollapsibleGroup.js.map +1 -1
  24. package/dist/chat/super-grouping/GroupedMessageParts.cjs +59 -0
  25. package/dist/chat/super-grouping/GroupedMessageParts.cjs.map +1 -0
  26. package/dist/chat/super-grouping/GroupedMessageParts.d.ts +25 -0
  27. package/dist/chat/super-grouping/GroupedMessageParts.js +59 -0
  28. package/dist/chat/super-grouping/GroupedMessageParts.js.map +1 -0
  29. package/dist/chat/super-grouping/SuperGroupingCard.cjs +9 -5
  30. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  31. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +2 -1
  32. package/dist/chat/super-grouping/SuperGroupingCard.js +13 -9
  33. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  34. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +10 -6
  35. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  36. package/dist/chat/super-grouping/SuperGroupingTranscript.js +14 -10
  37. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  38. package/dist/chat/super-grouping/grouped-part-keys.cjs +104 -0
  39. package/dist/chat/super-grouping/grouped-part-keys.cjs.map +1 -0
  40. package/dist/chat/super-grouping/grouped-part-keys.d.ts +37 -0
  41. package/dist/chat/super-grouping/grouped-part-keys.js +104 -0
  42. package/dist/chat/super-grouping/grouped-part-keys.js.map +1 -0
  43. package/dist/chat/super-grouping/index.cjs +2 -0
  44. package/dist/chat/super-grouping/index.cjs.map +1 -1
  45. package/dist/chat/super-grouping/index.d.ts +3 -1
  46. package/dist/chat/super-grouping/index.js +2 -0
  47. package/dist/chat/super-grouping/index.js.map +1 -1
  48. package/dist/chat-ui/composer/tiptap-composer.cjs +25 -19
  49. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  50. package/dist/chat-ui/composer/tiptap-composer.d.ts +5 -0
  51. package/dist/chat-ui/composer/tiptap-composer.js +26 -20
  52. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  53. package/dist/chat-ui/thread/statewire-history-edge.cjs +13 -0
  54. package/dist/chat-ui/thread/statewire-history-edge.cjs.map +1 -1
  55. package/dist/chat-ui/thread/statewire-history-edge.js +13 -0
  56. package/dist/chat-ui/thread/statewire-history-edge.js.map +1 -1
  57. package/dist/composer/clipboard.cjs +16 -0
  58. package/dist/composer/clipboard.cjs.map +1 -1
  59. package/dist/composer/clipboard.d.ts +9 -0
  60. package/dist/composer/clipboard.js +17 -1
  61. package/dist/composer/clipboard.js.map +1 -1
  62. package/dist/diagnostics/errors.cjs +11 -0
  63. package/dist/diagnostics/errors.cjs.map +1 -1
  64. package/dist/diagnostics/errors.d.ts +11 -0
  65. package/dist/diagnostics/errors.js +11 -0
  66. package/dist/diagnostics/errors.js.map +1 -1
  67. package/dist/index.cjs +37 -0
  68. package/dist/index.cjs.map +1 -1
  69. package/dist/index.d.ts +14 -1
  70. package/dist/index.js +37 -0
  71. package/dist/index.js.map +1 -1
  72. package/dist/provider/AthenaProvider.cjs +5 -2
  73. package/dist/provider/AthenaProvider.cjs.map +1 -1
  74. package/dist/provider/AthenaProvider.js +5 -2
  75. package/dist/provider/AthenaProvider.js.map +1 -1
  76. package/dist/provider/statewire-history-context.cjs +48 -0
  77. package/dist/provider/statewire-history-context.cjs.map +1 -0
  78. package/dist/provider/statewire-history-context.d.ts +36 -0
  79. package/dist/provider/statewire-history-context.js +48 -0
  80. package/dist/provider/statewire-history-context.js.map +1 -0
  81. package/dist/react/package.json.cjs +1 -1
  82. package/dist/react/package.json.js +1 -1
  83. package/dist/runtime/statewire-lifecycle.cjs +8 -0
  84. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  85. package/dist/runtime/statewire-lifecycle.js +9 -1
  86. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  87. package/dist/styles.css +1 -1
  88. package/dist/tools/index.cjs +7 -0
  89. package/dist/tools/index.cjs.map +1 -1
  90. package/dist/tools/index.d.ts +2 -0
  91. package/dist/tools/index.js +7 -0
  92. package/dist/tools/index.js.map +1 -1
  93. package/dist/tools/inline-tools.cjs +10 -0
  94. package/dist/tools/inline-tools.cjs.map +1 -0
  95. package/dist/tools/inline-tools.d.ts +2 -0
  96. package/dist/tools/inline-tools.js +10 -0
  97. package/dist/tools/inline-tools.js.map +1 -0
  98. package/dist/tools/test-recording-report.cjs +175 -0
  99. package/dist/tools/test-recording-report.cjs.map +1 -0
  100. package/dist/tools/test-recording-report.d.ts +82 -0
  101. package/dist/tools/test-recording-report.js +175 -0
  102. package/dist/tools/test-recording-report.js.map +1 -0
  103. package/dist/tools/test-recording-tool-uis.cjs +498 -0
  104. package/dist/tools/test-recording-tool-uis.cjs.map +1 -0
  105. package/dist/tools/test-recording-tool-uis.d.ts +32 -0
  106. package/dist/tools/test-recording-tool-uis.js +498 -0
  107. package/dist/tools/test-recording-tool-uis.js.map +1 -0
  108. package/dist/tools/tool-summary.cjs +49 -1
  109. package/dist/tools/tool-summary.cjs.map +1 -1
  110. package/dist/tools/tool-summary.js +49 -1
  111. package/dist/tools/tool-summary.js.map +1 -1
  112. package/dist/tools/tool-uis.cjs +6 -1
  113. package/dist/tools/tool-uis.cjs.map +1 -1
  114. package/dist/tools/tool-uis.js +6 -1
  115. package/dist/tools/tool-uis.js.map +1 -1
  116. package/dist/workbench/ComputerLiveDesktop.cjs +287 -0
  117. package/dist/workbench/ComputerLiveDesktop.cjs.map +1 -0
  118. package/dist/workbench/ComputerLiveDesktop.d.ts +27 -0
  119. package/dist/workbench/ComputerLiveDesktop.js +287 -0
  120. package/dist/workbench/ComputerLiveDesktop.js.map +1 -0
  121. package/dist/workbench/SessionWorkbench.cjs +2 -2
  122. package/dist/workbench/SessionWorkbench.cjs.map +1 -1
  123. package/dist/workbench/SessionWorkbench.js +2 -2
  124. package/dist/workbench/SessionWorkbench.js.map +1 -1
  125. package/dist/workbench/live-desktop-api.cjs +139 -0
  126. package/dist/workbench/live-desktop-api.cjs.map +1 -0
  127. package/dist/workbench/live-desktop-api.d.ts +69 -0
  128. package/dist/workbench/live-desktop-api.js +139 -0
  129. package/dist/workbench/live-desktop-api.js.map +1 -0
  130. package/dist/workbench/session-workbench-context.cjs.map +1 -1
  131. package/dist/workbench/session-workbench-context.d.ts +7 -0
  132. package/dist/workbench/session-workbench-context.js.map +1 -1
  133. package/dist/workbench/session-workbench-panes.cjs +38 -2
  134. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  135. package/dist/workbench/session-workbench-panes.js +38 -2
  136. package/dist/workbench/session-workbench-panes.js.map +1 -1
  137. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tool-summary.cjs","sources":["../../src/tools/tool-summary.ts"],"sourcesContent":["/**\n * One line per tool call, in the words a person would use: \"Ran git diff\n * --stat\", \"Read live_audio.py\", \"Edited upstream.py\" with \"+4 −1\", \"Found 3\n * assets for \"workstation\"\", \"jevin-box is running\". The single summary the\n * SDK's activity timeline, its grouped transcript and its tool cards read, so\n * a step cannot be the literal command on one surface and \"Ran a command\" on\n * another.\n *\n * Tools without a rule here read the shared display registry\n * (`getToolDisplayMeta`); a tool neither knows falls back to the host's\n * catalog name, else a sentence-cased name — never the Title Cased wire id\n * (\"Computer Asset Ensure Sandbox\").\n *\n * Wording follows the Olympus deep-agent cards where they exist\n * (`olympus/src/components/athena-deep-agent/sandbox-tool-cards.tsx`: \"Read\",\n * \"Wrote\", \"Edited\", the command's first line, \"+N -M\" line counts) and the\n * computer toolkit cards (\"Sandbox is running\"). Pure and React-free.\n */\nimport {\n describeToolArgs,\n getToolDisplayMeta,\n hasToolDisplayMeta,\n type ToolStatusLabelState,\n toolCompletedLabel,\n toolStatusLabel,\n} from \"@athenaintel/agent-runtime\";\n\n/** The states a summarized call can be in; the activity timeline's step states. */\nexport type ToolSummaryState = ToolStatusLabelState;\n\nexport interface ToolCallSummary {\n /** The whole line, complete on its own: \"Ran git diff --stat\", \"Read live_audio.py\". Plain text. */\n label: string;\n /** The longer form for a tooltip: the full path, the whole first command line, the repository. */\n detail?: string;\n /** A short chip after the label: \"+4 −1\", \"on jevin-box\", \"exit 1\". */\n meta?: string;\n /** The part of `label` that is literal code (a command, a file name, a pattern), for monospace. */\n code?: string;\n}\n\nexport interface SummarizeToolCallInput {\n toolName: string;\n /** The call's arguments; partial while they stream, `undefined` before any arrive. */\n args?: Record<string, unknown> | undefined;\n /** The tool's result; `undefined` while it runs (the streaming placeholder counts as none). */\n result?: unknown;\n status: ToolSummaryState;\n /** Titles for asset ids the turn already holds (see {@link collectAssetTitles}). */\n assetTitles?: ReadonlyMap<string, string>;\n /** A host catalog name for a tool neither this module nor the registry knows. */\n displayName?: string;\n}\n\n// ─── Text helpers ───────────────────────────────────────────────────────\n\nconst TARGET_MAX = 72;\nconst DETAIL_MAX = 300;\nconst EMPTY_TITLES: ReadonlyMap<string, string> = new Map();\n\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : undefined;\n}\n\nfunction int(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return Math.trunc(value);\n if (typeof value === \"string\" && /^\\d+$/.test(value.trim())) return Number(value.trim());\n return undefined;\n}\n\n/** One line, capped at `max` characters with an ellipsis. */\nexport function clipLine(text: string, max = TARGET_MAX): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? `${oneLine.slice(0, max - 1).trimEnd()}…` : oneLine;\n}\n\nfunction capitalize(text: string): string {\n return text.length > 0 ? `${text[0]!.toUpperCase()}${text.slice(1)}` : text;\n}\n\nfunction lowerFirst(text: string): string {\n return text.length > 0 ? `${text[0]!.toLowerCase()}${text.slice(1)}` : text;\n}\n\nfunction quoted(text: string): string {\n return `\"${clipLine(text, 60)}\"`;\n}\n\nfunction plural(count: number, one: string, many = `${one}s`): string {\n return `${count} ${count === 1 ? one : many}`;\n}\n\n/** Line count of `text`; an empty string is zero lines, a trailing newline adds none. */\nexport function countLines(text: string): number {\n if (!text) return 0;\n let lines = 1;\n for (let index = text.indexOf(\"\\n\"); index !== -1; index = text.indexOf(\"\\n\", index + 1)) {\n if (index < text.length - 1) lines += 1;\n }\n return lines;\n}\n\n/**\n * The tool name in sentence case, for a tool nothing else names:\n * `frobnicate_widgets` → \"Frobnicate widgets\", `mcp__linear__create_issue` →\n * \"Linear create issue\", `CreateWorkbook` → \"Create workbook\".\n */\nexport function humanizeToolName(toolName: string): string {\n const words = toolName\n .replace(/^mcp__/i, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[\\s_\\-.:/]+/)\n .filter(Boolean)\n .map((word) => (/^[A-Z0-9]{2,}$/.test(word) ? word : word.toLowerCase()));\n return words.length > 0 ? capitalize(words.join(\" \")) : toolName;\n}\n\n// ─── Paths ──────────────────────────────────────────────────────────────\n\n/** Human label for an agent-workspace path (never surface scratch-file garble). */\nexport function friendlyWorkspacePath(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n const path = value.trim();\n if (path.includes(\"large_tool_results\")) {\n return \"detailed results from an earlier step\";\n }\n if (path.includes(\"/memory/\")) return \"session memory\";\n if (path.includes(\"/skills/\")) return \"a skill reference\";\n const base = path.split(\"/\").filter(Boolean).pop();\n return base ?? path;\n}\n\n/** A file target: its name in code when it is a real path, plain words for scratch space. */\nfunction fileTarget(path: string | undefined): { text: string; code?: string } | undefined {\n const friendly = friendlyWorkspacePath(path);\n if (!friendly || !path) return undefined;\n const isScratch = friendly !== path.split(\"/\").filter(Boolean).pop();\n const text = clipLine(friendly, 60);\n return isScratch ? { text } : { text, code: text };\n}\n\n/** The last `segments` parts of a directory path (\"…/tests/unit\"), or the path itself. */\nexport function shortPath(path: string, segments = 2): string {\n const parts = path.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean);\n if (parts.length === 0) return \"/\";\n if (parts.length <= segments) return path.startsWith(\"/\") ? `/${parts.join(\"/\")}` : parts.join(\"/\");\n return `…/${parts.slice(-segments).join(\"/\")}`;\n}\n\n// ─── Execute ────────────────────────────────────────────────────────────\n\n/** A shell command's first non-empty line and how many lines follow it. */\nexport function firstCommandLine(command: string): { firstLine: string; extraLines: number } {\n const lines = command.split(\"\\n\");\n const firstIndex = lines.findIndex((line) => line.trim().length > 0);\n if (firstIndex < 0) return { firstLine: \"\", extraLines: 0 };\n return {\n firstLine: lines[firstIndex]!.trim(),\n extraLines: Math.max(0, countLines(command) - firstIndex - 1),\n };\n}\n\nconst EXIT_CODE_NOTE = /^\\[Command (?:succeeded|failed) with exit code (-?\\d+)\\]$/;\n\nfunction textOf(result: unknown): string | undefined {\n if (typeof result === \"string\") return result;\n if (Array.isArray(result)) {\n const texts = result.flatMap((item) => {\n if (typeof item === \"string\") return [item];\n if (item && typeof item === \"object\" && typeof (item as { text?: unknown }).text === \"string\") {\n return [(item as { text: string }).text];\n }\n return [];\n });\n return texts.length > 0 ? texts.join(\"\\n\") : undefined;\n }\n return undefined;\n}\n\n/**\n * The exit code the deepagents sandbox appends to an `execute` result\n * (`[Command failed with exit code 1]`), or `null` when it reported none.\n */\nexport function executeExitCode(result: unknown): number | null {\n const text = textOf(result);\n if (!text) return null;\n const lines = text.trimEnd().split(\"\\n\");\n for (let index = lines.length - 1; index >= 0 && index >= lines.length - 4; index -= 1) {\n const match = EXIT_CODE_NOTE.exec(lines[index]!.trim());\n if (match) return Number.parseInt(match[1]!, 10);\n }\n return null;\n}\n\n// ─── Line counts ────────────────────────────────────────────────────────\n\nconst lineStatsCache = new WeakMap<object, { added: number; removed: number }>();\n\nfunction lineMultiset(text: string): Map<string, number> {\n const counts = new Map<string, number>();\n if (!text) return counts;\n const lines = text.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n if (lines.at(-1) === \"\") lines.pop();\n for (const line of lines) counts.set(line, (counts.get(line) ?? 0) + 1);\n return counts;\n}\n\n/**\n * Lines an `edit_file` replacement adds and removes: lines of `new_string`\n * missing from `old_string` and the reverse, counted with multiplicity. Equal\n * to a line diff's counts unless the edit moves lines around. Cached per\n * arguments object, so a settled call is counted once however often the\n * transcript re-renders.\n */\nexport function editLineStats(args: Record<string, unknown>): { added: number; removed: number } {\n const cached = lineStatsCache.get(args);\n if (cached) return cached;\n const before = lineMultiset(typeof args.old_string === \"string\" ? args.old_string : \"\");\n const after = lineMultiset(typeof args.new_string === \"string\" ? args.new_string : \"\");\n let added = 0;\n let removed = 0;\n for (const [line, count] of after) added += Math.max(0, count - (before.get(line) ?? 0));\n for (const [line, count] of before) removed += Math.max(0, count - (after.get(line) ?? 0));\n const stats = { added, removed };\n lineStatsCache.set(args, stats);\n return stats;\n}\n\n// ─── Results ────────────────────────────────────────────────────────────\n\nconst MAX_PARSE_LENGTH = 256 * 1024;\n\n/** A JSON result as an object, or `null` (plain text, too large, or not JSON). */\nfunction parseResult(result: unknown): Record<string, unknown> | unknown[] | null {\n if (result && typeof result === \"object\") return result as Record<string, unknown>;\n if (typeof result !== \"string\" || result.length > MAX_PARSE_LENGTH) return null;\n const trimmed = result.trimStart();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return null;\n try {\n const parsed: unknown = JSON.parse(trimmed);\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\nfunction resultRecord(result: unknown): Record<string, unknown> | null {\n const parsed = parseResult(result);\n return parsed && !Array.isArray(parsed) ? parsed : null;\n}\n\n/** A pull request or issue number off a result (`number`, else the `/pull/N` of its URL). */\nfunction resultNumber(result: unknown): number | undefined {\n const record = resultRecord(result);\n if (!record) return undefined;\n const direct = int(record.number) ?? int(record.pull_number) ?? int(record.issue_number);\n if (direct !== undefined) return direct;\n const url = str(record.html_url) ?? str(record.url);\n const match = url ? /\\/(?:pull|issues)\\/(\\d+)/.exec(url) : null;\n return match ? Number(match[1]) : undefined;\n}\n\n// ─── Asset titles ───────────────────────────────────────────────────────\n\nconst ASSET_ID = /^asset_[A-Za-z0-9-]{6,}$/;\nconst MAX_WALK_NODES = 2000;\ntype TitleEntries = readonly (readonly [string, string])[];\n/** Titles found in an object result, keyed by the result itself. */\nconst titlesByResultObject = new WeakMap<object, TitleEntries>();\n/** Titles found in a string result, keyed by the part that holds it and checked against the string. */\nconst titlesByStringPart = new WeakMap<object, { result: string; entries: TitleEntries }>();\n\nfunction titlesIn(value: unknown): (readonly [string, string])[] {\n const found: (readonly [string, string])[] = [];\n const stack: { node: unknown; depth: number }[] = [{ node: value, depth: 0 }];\n let visited = 0;\n while (stack.length > 0 && visited < MAX_WALK_NODES) {\n const { node, depth } = stack.pop()!;\n visited += 1;\n if (!node || typeof node !== \"object\" || depth > 4) continue;\n if (Array.isArray(node)) {\n for (const child of node) stack.push({ node: child, depth: depth + 1 });\n continue;\n }\n const record = node as Record<string, unknown>;\n const id = str(record.asset_id) ?? str(record.id) ?? str(record.assetId);\n const title = str(record.title) ?? str(record.name);\n if (id && title && ASSET_ID.test(id)) found.push([id, title] as const);\n for (const child of Object.values(record)) {\n if (child && typeof child === \"object\") stack.push({ node: child, depth: depth + 1 });\n }\n }\n return found;\n}\n\n/** The part shape {@link collectAssetTitles} reads; assistant-ui's tool-call parts satisfy it. */\nexport type AssetTitleSourcePart = {\n readonly type: string;\n readonly toolCallId?: string;\n readonly result?: unknown;\n};\n\n/**\n * The titles one result names, parsed once per result: an object result is\n * cached by its own identity, a string result by the part holding it and only\n * while that part still holds the same string, so a replaced result (however\n * long) is always read afresh. Weakly held: nothing outlives the transcript.\n */\nfunction resultTitles(part: AssetTitleSourcePart): TitleEntries {\n const result = part.result;\n if (result !== null && typeof result === \"object\") {\n let entries = titlesByResultObject.get(result);\n if (!entries) {\n entries = titlesIn(result);\n titlesByResultObject.set(result, entries);\n }\n return entries;\n }\n if (typeof result !== \"string\") return [];\n const cached = titlesByStringPart.get(part);\n if (cached && cached.result === result) return cached.entries;\n const entries = titlesIn(parseResult(result));\n titlesByStringPart.set(part, { result, entries });\n return entries;\n}\n\n/**\n * Asset id → title for every asset an earlier result in the turn named\n * (`search_assets` hits, a created asset, a status read), so a later call that\n * targets one by id can say which machine or document it acted on. Only data\n * the turn already holds; nothing is fetched.\n */\nexport function collectAssetTitles(parts: readonly AssetTitleSourcePart[]): Map<string, string> {\n const titles = new Map<string, string>();\n for (const part of parts) {\n if (part.type !== \"tool-call\" || part.result === undefined) continue;\n for (const [id, title] of resultTitles(part)) titles.set(id, title);\n }\n return titles;\n}\n\nfunction assetIdOf(value: unknown): string | undefined {\n const raw = str(value);\n if (!raw) return undefined;\n const bare = raw.split(/[?#]/, 1)[0]!;\n return bare.startsWith(\"asset_\") ? bare : undefined;\n}\n\n// ─── Phrases ────────────────────────────────────────────────────────────\n\n/**\n * How one call reads in every state: the verb in three forms (\"Running\" /\n * \"Ran\" / \"run\") and its object. `active` / `done` replace the composed\n * running / completed sentence when a tool words its outcome differently\n * (\"Found 3 assets for …\", \"jevin-box is running\").\n */\ninterface Phrase {\n verb: readonly [active: string, done: string, base: string];\n /** The object of the verb (\"git status\", \"live_audio.py\", \"a command\"). */\n object: string;\n code?: string;\n detail?: string;\n meta?: readonly (string | false | null | undefined)[];\n active?: string;\n done?: string;\n}\n\nconst RUN = [\"Running\", \"Ran\", \"run\"] as const;\nconst READ = [\"Reading\", \"Read\", \"read\"] as const;\n\nfunction summaryFromPhrase(phrase: Phrase, status: ToolSummaryState): ToolCallSummary {\n const [active, done, base] = phrase.verb;\n const imperative = `${capitalize(base)} ${phrase.object}`;\n let label: string;\n switch (status) {\n case \"running\":\n label = phrase.active ?? `${active} ${phrase.object}`;\n break;\n case \"complete\":\n label = phrase.done ?? `${done} ${phrase.object}`;\n break;\n case \"error\":\n label = `Couldn't ${base} ${phrase.object}`;\n break;\n case \"rejected\":\n label = `${imperative} — rejected`;\n break;\n case \"cancelled\":\n label = `${imperative} — cancelled`;\n break;\n case \"paused\":\n label = `${imperative} — paused`;\n break;\n case \"waiting\":\n label = \"Waiting for your input\";\n break;\n }\n const meta = (phrase.meta ?? []).filter((value): value is string => Boolean(value)).join(\" · \");\n const detail = status === \"waiting\" ? imperative : phrase.detail;\n return {\n label,\n ...(phrase.code && label.includes(phrase.code) ? { code: phrase.code } : {}),\n ...(detail ? { detail: clipLine(detail, DETAIL_MAX) } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\ntype Rule = (input: Required<Pick<SummarizeToolCallInput, \"status\">> & {\n args: Record<string, unknown>;\n result: unknown;\n titles: ReadonlyMap<string, string>;\n}) => Phrase;\n\nfunction machineName(titles: ReadonlyMap<string, string>, value: unknown): string | undefined {\n const id = assetIdOf(value);\n return id ? titles.get(id) : undefined;\n}\n\n/** \"on <machine>\" when a sandbox tool targeted another asset whose title the turn holds. */\nfunction onMachine(titles: ReadonlyMap<string, string>, args: Record<string, unknown>): string | undefined {\n const machine = machineName(titles, args.sandbox_asset_id);\n return machine ? `on ${machine}` : undefined;\n}\n\nconst COMPUTER_STATES: Record<string, string> = {\n started: \"running\",\n running: \"running\",\n stopped: \"stopped\",\n starting: \"starting\",\n stopping: \"stopping\",\n paused: \"paused\",\n error: \"in an error state\",\n};\n\nfunction computerStateWord(state: string): string {\n return COMPUTER_STATES[state.toLowerCase()] ?? humanizeToolName(state).toLowerCase();\n}\n\nconst executeRule: Rule = ({ args, result, titles }) => {\n const command = typeof args.command === \"string\" ? args.command : \"\";\n const { firstLine, extraLines } = firstCommandLine(command);\n const target = firstLine ? clipLine(firstLine) : undefined;\n const exitCode = executeExitCode(result);\n return {\n verb: RUN,\n object: target ?? \"a command\",\n code: target,\n detail: firstLine\n ? extraLines > 0\n ? `${firstLine} (+${plural(extraLines, \"more line\")})`\n : firstLine\n : undefined,\n meta: [onMachine(titles, args), exitCode !== null && exitCode !== 0 && `exit ${exitCode}`],\n };\n};\n\nfunction filePathOf(args: Record<string, unknown>): string | undefined {\n return str(args.file_path) ?? str(args.path);\n}\n\nconst readFileRule: Rule = ({ args, titles }) => {\n const path = filePathOf(args);\n const target = fileTarget(path);\n const offset = int(args.offset) ?? 0;\n const limit = int(args.limit);\n return {\n verb: READ,\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: path,\n meta: [\n offset > 0 && (limit ? `lines ${offset + 1}–${offset + limit}` : `from line ${offset + 1}`),\n onMachine(titles, args),\n ],\n };\n};\n\nconst listRule: Rule = ({ args, titles }) => {\n const path = str(args.path) ?? str(args.file_path);\n const target = path ? shortPath(path) : undefined;\n return {\n verb: [\"Listing\", \"Listed\", \"list\"],\n object: target ?? \"the workspace\",\n code: target,\n detail: path,\n meta: [onMachine(titles, args)],\n };\n};\n\nconst globRule: Rule = ({ args, result, titles }) => {\n const pattern = str(args.pattern) ?? str(args.query);\n const path = str(args.path);\n const object = pattern ? `files matching ${clipLine(pattern, 60)}` : \"files\";\n const none = typeof result === \"string\" && /^no files found/i.test(result.trim());\n return {\n verb: [\"Finding\", \"Found\", \"find\"],\n object,\n code: pattern ? clipLine(pattern, 60) : undefined,\n done: none && pattern ? `No files match ${clipLine(pattern, 60)}` : undefined,\n detail: path ? `${pattern ?? \"\"} in ${path}`.trim() : pattern,\n meta: [path && `in ${shortPath(path)}`, onMachine(titles, args)],\n };\n};\n\nconst grepRule: Rule = ({ args, result, titles }) => {\n const pattern = str(args.pattern) ?? str(args.query);\n const path = str(args.path);\n const code = pattern ? clipLine(pattern, 60) : undefined;\n const where = path ? `${shortPath(path)} ` : \"\";\n const object = code ? `${where}for ${code}` : path ? shortPath(path) : \"files\";\n const none =\n typeof result === \"string\" && (result.trim() === \"\" || /^no matches/i.test(result.trim()));\n return {\n verb: [\"Searching\", \"Searched\", \"search\"],\n object,\n code,\n done: none && code ? `No matches for ${code}${path ? ` in ${shortPath(path)}` : \"\"}` : undefined,\n detail: path ? `${pattern ?? \"\"} in ${path}`.trim() : pattern,\n meta: [str(args.glob), onMachine(titles, args)],\n };\n};\n\nconst writeFileRule: Rule = ({ args, titles }) => {\n const path = filePathOf(args);\n const target = fileTarget(path);\n const content = typeof args.content === \"string\" ? args.content : \"\";\n const lines = countLines(content);\n return {\n verb: [\"Writing\", \"Wrote\", \"write\"],\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: path,\n meta: [lines > 0 && `+${lines}`, onMachine(titles, args)],\n };\n};\n\nconst editFileRule: Rule = ({ args, titles }) => {\n const path = filePathOf(args);\n const target = fileTarget(path);\n const hasReplacement = typeof args.old_string === \"string\" || typeof args.new_string === \"string\";\n const { added, removed } = hasReplacement ? editLineStats(args) : { added: 0, removed: 0 };\n return {\n verb: [\"Editing\", \"Edited\", \"edit\"],\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: path,\n meta: [\n added + removed > 0 && `+${added} −${removed}`,\n args.replace_all === true && \"all occurrences\",\n onMachine(titles, args),\n ],\n };\n};\n\nconst searchAssetsRule: Rule = ({ args, result }) => {\n const query =\n str(args.title_contains_keyword) ??\n str(args.query) ??\n str(args.search_query) ??\n str(args.keyword);\n const types = Array.isArray(args.types)\n ? args.types.map(str).filter((type): type is string => type !== undefined)\n : [];\n const record = resultRecord(result);\n const assets = Array.isArray(record?.assets) ? record.assets : undefined;\n const count = int(record?.total_count) ?? int(record?.returned_count) ?? assets?.length;\n const forQuery = query ? ` for ${quoted(query)}` : \"\";\n const done =\n count === undefined\n ? undefined\n : count === 0\n ? `No assets found${forQuery}`\n : `Found ${plural(count, \"asset\")}${forQuery}`;\n return {\n verb: [\"Searching\", \"Searched\", \"search\"],\n object: query ? `for ${quoted(query)}` : \"assets\",\n done,\n meta: [types.length > 0 && types.map((type) => humanizeToolName(type).toLowerCase()).join(\", \")],\n };\n};\n\nconst ensureSandboxRule: Rule = ({ args, result, titles }) => {\n const machine = machineName(titles, args.computer_asset_id ?? args.asset_id);\n const record = resultRecord(result);\n const state = str(record?.state);\n return {\n verb: [\"Starting\", \"Started\", \"start\"],\n object: machine ?? \"the computer\",\n done: state ? `${machine ?? \"The computer\"} is ${computerStateWord(state)}` : undefined,\n detail: str(record?.detail),\n };\n};\n\nconst computerStatusRule: Rule = ({ args, result, titles }) => {\n const machine = machineName(titles, args.computer_asset_id ?? args.asset_id);\n const state = str(resultRecord(result)?.state);\n return {\n verb: [\"Checking\", \"Checked\", \"check\"],\n object: machine ?? \"the computer\",\n done: state ? `${machine ?? \"The computer\"} is ${computerStateWord(state)}` : undefined,\n };\n};\n\nconst computerDeployRule: Rule = ({ args, result, titles }) => {\n const machine = machineName(titles, args.computer_asset_id ?? args.asset_id);\n const port = int(args.port);\n const url = str(resultRecord(result)?.url);\n return {\n verb: [\"Deploying\", \"Deployed\", \"deploy\"],\n object: port !== undefined ? `port ${port}` : (machine ?? \"the computer\"),\n detail: url,\n meta: [port !== undefined && machine && `on ${machine}`],\n };\n};\n\nconst computerCreateRule: Rule = ({ args }) => {\n const name = str(args.name) ?? str(args.title);\n return {\n verb: [\"Creating\", \"Created\", \"create\"],\n object: name ? `computer ${quoted(name)}` : \"a computer\",\n };\n};\n\nfunction repoOf(args: Record<string, unknown>): string | undefined {\n const owner = str(args.owner);\n const repo = str(args.repo);\n if (owner && repo) return `${owner}/${repo}`;\n return repo ?? str(args.repository);\n}\n\nconst githubPullRule: Rule = ({ args }) => {\n const number = int(args.pull_number) ?? int(args.number);\n const repo = repoOf(args);\n return {\n verb: [\"Viewing\", \"Viewed\", \"view\"],\n object: number !== undefined ? `pull request #${number}` : \"a pull request\",\n detail: repo && number !== undefined ? `${repo}#${number}` : repo,\n meta: [repo],\n };\n};\n\nconst githubListPullsRule: Rule = ({ args }) => {\n const repo = repoOf(args);\n const state = str(args.state);\n return {\n verb: [\"Listing\", \"Listed\", \"list\"],\n object: state && state !== \"open\" ? `${state} pull requests` : \"pull requests\",\n meta: [repo, str(args.head) && `head ${str(args.head)}`],\n };\n};\n\nconst githubOpenPullRule: Rule = ({ args, result }) => {\n const title = str(args.title);\n const number = resultNumber(result);\n const head = str(args.head);\n const base = str(args.base);\n return {\n verb: [\"Opening\", \"Opened\", \"open\"],\n object: title ? `pull request ${quoted(title)}` : \"a pull request\",\n done: number !== undefined ? `Opened pull request #${number}` : undefined,\n detail: title,\n meta: [head && base && `${head} → ${base}`, args.draft === true && \"draft\", repoOf(args)],\n };\n};\n\nconst githubCommentRule: Rule = ({ args }) => {\n const number = int(args.issue_number) ?? int(args.pull_number);\n return {\n verb: [\"Commenting on\", \"Commented on\", \"comment on\"],\n object: number !== undefined ? `#${number}` : \"an issue\",\n meta: [repoOf(args)],\n };\n};\n\nconst githubIssueRule: Rule = ({ args, result }) => {\n const title = str(args.title);\n const number = resultNumber(result);\n return {\n verb: [\"Creating\", \"Created\", \"create\"],\n object: title ? `issue ${quoted(title)}` : \"an issue\",\n done: number !== undefined ? `Created issue #${number}` : undefined,\n detail: title,\n meta: [repoOf(args)],\n };\n};\n\nconst githubFileRule: Rule = ({ args }) => {\n const path = str(args.path);\n const target = fileTarget(path);\n const repo = repoOf(args);\n return {\n verb: READ,\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: repo && path ? `${repo}/${path}` : path,\n meta: [repo, str(args.ref)],\n };\n};\n\nconst githubDirectoryRule: Rule = ({ args }) => {\n const path = str(args.path);\n return {\n verb: [\"Listing\", \"Listed\", \"list\"],\n object: path ? shortPath(path) : \"the repository root\",\n code: path ? shortPath(path) : undefined,\n meta: [repoOf(args)],\n };\n};\n\nconst webSearchRule: Rule = ({ args }) => {\n const query = str(args.query) ?? str(args.search_query) ?? str(args.term);\n return {\n verb: [\"Searching\", \"Searched\", \"search\"],\n object: query ? `the web for ${quoted(query)}` : \"the web\",\n };\n};\n\n/** Host and path of a URL, never its credentials, query string or fragment. */\nfunction pageLabel(value: unknown): string | undefined {\n const raw = str(value);\n if (!raw) return undefined;\n try {\n const url = new URL(raw);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n const path = url.pathname === \"/\" ? \"\" : url.pathname;\n return clipLine(`${url.hostname.replace(/^www\\./, \"\")}${path}`, 60);\n } catch {\n return undefined;\n }\n}\n\nconst browseRule: Rule = ({ args }) => {\n const page = pageLabel(args.url) ?? pageLabel(args.link);\n return { verb: READ, object: page ?? \"a web page\" };\n};\n\nconst readAssetRule: Rule = ({ args, titles }) => {\n const rawIds = Array.isArray(args.asset_ids) ? args.asset_ids : [args.asset_id ?? args.asset_ids];\n const ids = rawIds.map(assetIdOf).filter((id): id is string => id !== undefined);\n const named = ids.map((id) => titles.get(id)).filter((title): title is string => Boolean(title));\n const object =\n ids.length > 1\n ? plural(ids.length, \"asset\")\n : named[0]\n ? clipLine(named[0], 60)\n : \"an asset\";\n return {\n verb: READ,\n object,\n detail: ids.length > 1 && named.length > 0 ? named.join(\", \") : undefined,\n };\n};\n\ntype Todo = { status?: unknown; content?: unknown };\n\nconst writeTodosRule: Rule = ({ args }) => {\n const todos = Array.isArray(args.todos) ? (args.todos as Todo[]) : [];\n const done = todos.filter((todo) => todo?.status === \"completed\").length;\n const current = todos.find((todo) => todo?.status === \"in_progress\");\n return {\n verb: [\"Updating\", \"Updated\", \"update\"],\n object: \"plan\",\n done:\n todos.length === 0 ? \"Cleared the plan\" : `Updated plan (${done}/${todos.length} done)`,\n detail: str(current?.content) ? `Now: ${str(current?.content)}` : undefined,\n };\n};\n\nfunction subagentName(value: unknown): string {\n const name = str(value);\n if (!name || name === \"general-purpose\") return \"a subagent\";\n return humanizeToolName(name).toLowerCase();\n}\n\nconst taskRule: Rule = ({ args }) => {\n const description = str(args.description);\n const who = subagentName(args.subagent_type);\n return {\n verb: [\"Delegating to\", \"Delegated to\", \"delegate to\"],\n object: description ? `${who}: ${clipLine(description, 64)}` : who,\n detail: description,\n };\n};\n\nconst startAsyncTaskRule: Rule = ({ args }) => {\n const description = str(args.description);\n return {\n verb: [\"Starting\", \"Started\", \"start\"],\n object: description ? `background task: ${clipLine(description, 56)}` : \"a background task\",\n detail: description,\n };\n};\n\nconst RULES: Record<string, Rule> = {\n execute: executeRule,\n read_file: readFileRule,\n ls: listRule,\n glob: globRule,\n grep: grepRule,\n write_file: writeFileRule,\n edit_file: editFileRule,\n search_assets: searchAssetsRule,\n computer_asset_ensure_sandbox: ensureSandboxRule,\n computer_asset_get_status: computerStatusRule,\n computer_asset_deploy: computerDeployRule,\n computer_asset_create: computerCreateRule,\n github_get_pull_request: githubPullRule,\n github_list_pull_requests: githubListPullsRule,\n github_open_pull_request: githubOpenPullRule,\n github_comment: githubCommentRule,\n github_create_issue: githubIssueRule,\n github_fetch_file: githubFileRule,\n github_list_directory: githubDirectoryRule,\n search: webSearchRule,\n web_search: webSearchRule,\n search_web: webSearchRule,\n exa_search: webSearchRule,\n perplexity_search: webSearchRule,\n firecrawl_search: webSearchRule,\n browse: browseRule,\n web_fetch: browseRule,\n fetch_url: browseRule,\n web_scrape: browseRule,\n scrape_web: browseRule,\n firecrawl_scrape: browseRule,\n read_asset: readAssetRule,\n write_todos: writeTodosRule,\n task: taskRule,\n start_async_task: startAsyncTaskRule,\n};\n\n/** Tool names with a dedicated summary rule (the rest read the shared registry). */\nexport function hasToolSummaryRule(toolName: string): boolean {\n return Object.hasOwn(RULES, toolName);\n}\n\n/**\n * The summary for a tool the shared registry describes: its curated running /\n * completed copy with the call's own one-line description as the chip, and\n * the registry's wording for every other state.\n */\nfunction registrySummary(toolName: string, args: Record<string, unknown> | undefined, status: ToolSummaryState): ToolCallSummary {\n const meta = getToolDisplayMeta(toolName);\n const described = describeToolArgs({ toolName, args });\n const label =\n status === \"running\"\n ? meta.activeLabel\n : status === \"complete\"\n ? (meta.completedLabel ?? toolCompletedLabel(meta.activeLabel))\n : toolStatusLabel(toolName, status);\n return {\n label,\n ...(described && status !== \"waiting\" ? { meta: clipLine(described, 60) } : {}),\n };\n}\n\n/**\n * A tool nothing describes: the host's catalog name (\"Running Frobnicate\",\n * then \"Frobnicate\"), else the sentence-cased tool name (\"Running frobnicate\n * widgets\", then \"Ran frobnicate widgets\").\n */\nfunction unknownToolSummary(toolName: string, status: ToolSummaryState, displayName: string | undefined): ToolCallSummary {\n const name = displayName ?? humanizeToolName(toolName);\n const inSentence = displayName ?? lowerFirst(name);\n switch (status) {\n case \"running\":\n return { label: `Running ${inSentence}` };\n case \"complete\":\n return { label: displayName ?? `Ran ${inSentence}` };\n case \"error\":\n return { label: `${name} failed` };\n case \"rejected\":\n return { label: `${name} — rejected` };\n case \"cancelled\":\n return { label: `${name} — cancelled` };\n case \"paused\":\n return { label: `${name} — paused` };\n case \"waiting\":\n return { label: \"Waiting for your input\", detail: name };\n }\n}\n\n/**\n * The one-line summary of a tool call in its current state. Never throws:\n * missing or partial arguments (a call still streaming) fall back to the\n * verb with a generic object (\"Running a command\").\n */\nexport function summarizeToolCall({\n toolName,\n args,\n result,\n status,\n assetTitles,\n displayName,\n}: SummarizeToolCallInput): ToolCallSummary {\n const rule = RULES[toolName];\n if (rule) {\n return summaryFromPhrase(\n rule({ args: args ?? {}, result, status, titles: assetTitles ?? EMPTY_TITLES }),\n status,\n );\n }\n if (hasToolDisplayMeta(toolName)) return registrySummary(toolName, args, status);\n return unknownToolSummary(toolName, status, displayName);\n}\n"],"names":["entries","getToolDisplayMeta","describeToolArgs","toolCompletedLabel","toolStatusLabel","hasToolDisplayMeta"],"mappings":"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"}
1
+ {"version":3,"file":"tool-summary.cjs","sources":["../../src/tools/tool-summary.ts"],"sourcesContent":["/**\n * One line per tool call, in the words a person would use: \"Ran git diff\n * --stat\", \"Read live_audio.py\", \"Edited upstream.py\" with \"+4 −1\", \"Found 3\n * assets for \"workstation\"\", \"jevin-box is running\". The single summary the\n * SDK's activity timeline, its grouped transcript and its tool cards read, so\n * a step cannot be the literal command on one surface and \"Ran a command\" on\n * another.\n *\n * Tools without a rule here read the shared display registry\n * (`getToolDisplayMeta`); a tool neither knows falls back to the host's\n * catalog name, else a sentence-cased name — never the Title Cased wire id\n * (\"Computer Asset Ensure Sandbox\").\n *\n * Wording follows the Olympus deep-agent cards where they exist\n * (`olympus/src/components/athena-deep-agent/sandbox-tool-cards.tsx`: \"Read\",\n * \"Wrote\", \"Edited\", the command's first line, \"+N -M\" line counts) and the\n * computer toolkit cards (\"Sandbox is running\"). Pure and React-free.\n */\nimport {\n describeToolArgs,\n getToolDisplayMeta,\n hasToolDisplayMeta,\n type ToolStatusLabelState,\n toolCompletedLabel,\n toolStatusLabel,\n} from \"@athenaintel/agent-runtime\";\nimport {\n describeTestRecordingMark,\n formatRecordingClock,\n formatTestRecordingCounts,\n parseTestRecordingStopResult,\n} from \"./test-recording-report\";\n\n/** The states a summarized call can be in; the activity timeline's step states. */\nexport type ToolSummaryState = ToolStatusLabelState;\n\nexport interface ToolCallSummary {\n /** The whole line, complete on its own: \"Ran git diff --stat\", \"Read live_audio.py\". Plain text. */\n label: string;\n /** The longer form for a tooltip: the full path, the whole first command line, the repository. */\n detail?: string;\n /** A short chip after the label: \"+4 −1\", \"on jevin-box\", \"exit 1\". */\n meta?: string;\n /** The part of `label` that is literal code (a command, a file name, a pattern), for monospace. */\n code?: string;\n}\n\nexport interface SummarizeToolCallInput {\n toolName: string;\n /** The call's arguments; partial while they stream, `undefined` before any arrive. */\n args?: Record<string, unknown> | undefined;\n /** The tool's result; `undefined` while it runs (the streaming placeholder counts as none). */\n result?: unknown;\n status: ToolSummaryState;\n /** Titles for asset ids the turn already holds (see {@link collectAssetTitles}). */\n assetTitles?: ReadonlyMap<string, string>;\n /** A host catalog name for a tool neither this module nor the registry knows. */\n displayName?: string;\n}\n\n// ─── Text helpers ───────────────────────────────────────────────────────\n\nconst TARGET_MAX = 72;\nconst DETAIL_MAX = 300;\nconst EMPTY_TITLES: ReadonlyMap<string, string> = new Map();\n\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : undefined;\n}\n\nfunction int(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return Math.trunc(value);\n if (typeof value === \"string\" && /^\\d+$/.test(value.trim())) return Number(value.trim());\n return undefined;\n}\n\n/** One line, capped at `max` characters with an ellipsis. */\nexport function clipLine(text: string, max = TARGET_MAX): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? `${oneLine.slice(0, max - 1).trimEnd()}…` : oneLine;\n}\n\nfunction capitalize(text: string): string {\n return text.length > 0 ? `${text[0]!.toUpperCase()}${text.slice(1)}` : text;\n}\n\nfunction lowerFirst(text: string): string {\n return text.length > 0 ? `${text[0]!.toLowerCase()}${text.slice(1)}` : text;\n}\n\nfunction quoted(text: string): string {\n return `\"${clipLine(text, 60)}\"`;\n}\n\nfunction plural(count: number, one: string, many = `${one}s`): string {\n return `${count} ${count === 1 ? one : many}`;\n}\n\n/** Line count of `text`; an empty string is zero lines, a trailing newline adds none. */\nexport function countLines(text: string): number {\n if (!text) return 0;\n let lines = 1;\n for (let index = text.indexOf(\"\\n\"); index !== -1; index = text.indexOf(\"\\n\", index + 1)) {\n if (index < text.length - 1) lines += 1;\n }\n return lines;\n}\n\n/**\n * The tool name in sentence case, for a tool nothing else names:\n * `frobnicate_widgets` → \"Frobnicate widgets\", `mcp__linear__create_issue` →\n * \"Linear create issue\", `CreateWorkbook` → \"Create workbook\".\n */\nexport function humanizeToolName(toolName: string): string {\n const words = toolName\n .replace(/^mcp__/i, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[\\s_\\-.:/]+/)\n .filter(Boolean)\n .map((word) => (/^[A-Z0-9]{2,}$/.test(word) ? word : word.toLowerCase()));\n return words.length > 0 ? capitalize(words.join(\" \")) : toolName;\n}\n\n// ─── Paths ──────────────────────────────────────────────────────────────\n\n/** Human label for an agent-workspace path (never surface scratch-file garble). */\nexport function friendlyWorkspacePath(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n const path = value.trim();\n if (path.includes(\"large_tool_results\")) {\n return \"detailed results from an earlier step\";\n }\n if (path.includes(\"/memory/\")) return \"session memory\";\n if (path.includes(\"/skills/\")) return \"a skill reference\";\n const base = path.split(\"/\").filter(Boolean).pop();\n return base ?? path;\n}\n\n/** A file target: its name in code when it is a real path, plain words for scratch space. */\nfunction fileTarget(path: string | undefined): { text: string; code?: string } | undefined {\n const friendly = friendlyWorkspacePath(path);\n if (!friendly || !path) return undefined;\n const isScratch = friendly !== path.split(\"/\").filter(Boolean).pop();\n const text = clipLine(friendly, 60);\n return isScratch ? { text } : { text, code: text };\n}\n\n/** The last `segments` parts of a directory path (\"…/tests/unit\"), or the path itself. */\nexport function shortPath(path: string, segments = 2): string {\n const parts = path.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean);\n if (parts.length === 0) return \"/\";\n if (parts.length <= segments) return path.startsWith(\"/\") ? `/${parts.join(\"/\")}` : parts.join(\"/\");\n return `…/${parts.slice(-segments).join(\"/\")}`;\n}\n\n// ─── Execute ────────────────────────────────────────────────────────────\n\n/** A shell command's first non-empty line and how many lines follow it. */\nexport function firstCommandLine(command: string): { firstLine: string; extraLines: number } {\n const lines = command.split(\"\\n\");\n const firstIndex = lines.findIndex((line) => line.trim().length > 0);\n if (firstIndex < 0) return { firstLine: \"\", extraLines: 0 };\n return {\n firstLine: lines[firstIndex]!.trim(),\n extraLines: Math.max(0, countLines(command) - firstIndex - 1),\n };\n}\n\nconst EXIT_CODE_NOTE = /^\\[Command (?:succeeded|failed) with exit code (-?\\d+)\\]$/;\n\nfunction textOf(result: unknown): string | undefined {\n if (typeof result === \"string\") return result;\n if (Array.isArray(result)) {\n const texts = result.flatMap((item) => {\n if (typeof item === \"string\") return [item];\n if (item && typeof item === \"object\" && typeof (item as { text?: unknown }).text === \"string\") {\n return [(item as { text: string }).text];\n }\n return [];\n });\n return texts.length > 0 ? texts.join(\"\\n\") : undefined;\n }\n return undefined;\n}\n\n/**\n * The exit code the deepagents sandbox appends to an `execute` result\n * (`[Command failed with exit code 1]`), or `null` when it reported none.\n */\nexport function executeExitCode(result: unknown): number | null {\n const text = textOf(result);\n if (!text) return null;\n const lines = text.trimEnd().split(\"\\n\");\n for (let index = lines.length - 1; index >= 0 && index >= lines.length - 4; index -= 1) {\n const match = EXIT_CODE_NOTE.exec(lines[index]!.trim());\n if (match) return Number.parseInt(match[1]!, 10);\n }\n return null;\n}\n\n// ─── Line counts ────────────────────────────────────────────────────────\n\nconst lineStatsCache = new WeakMap<object, { added: number; removed: number }>();\n\nfunction lineMultiset(text: string): Map<string, number> {\n const counts = new Map<string, number>();\n if (!text) return counts;\n const lines = text.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n if (lines.at(-1) === \"\") lines.pop();\n for (const line of lines) counts.set(line, (counts.get(line) ?? 0) + 1);\n return counts;\n}\n\n/**\n * Lines an `edit_file` replacement adds and removes: lines of `new_string`\n * missing from `old_string` and the reverse, counted with multiplicity. Equal\n * to a line diff's counts unless the edit moves lines around. Cached per\n * arguments object, so a settled call is counted once however often the\n * transcript re-renders.\n */\nexport function editLineStats(args: Record<string, unknown>): { added: number; removed: number } {\n const cached = lineStatsCache.get(args);\n if (cached) return cached;\n const before = lineMultiset(typeof args.old_string === \"string\" ? args.old_string : \"\");\n const after = lineMultiset(typeof args.new_string === \"string\" ? args.new_string : \"\");\n let added = 0;\n let removed = 0;\n for (const [line, count] of after) added += Math.max(0, count - (before.get(line) ?? 0));\n for (const [line, count] of before) removed += Math.max(0, count - (after.get(line) ?? 0));\n const stats = { added, removed };\n lineStatsCache.set(args, stats);\n return stats;\n}\n\n// ─── Results ────────────────────────────────────────────────────────────\n\nconst MAX_PARSE_LENGTH = 256 * 1024;\n\n/** A JSON result as an object, or `null` (plain text, too large, or not JSON). */\nfunction parseResult(result: unknown): Record<string, unknown> | unknown[] | null {\n if (result && typeof result === \"object\") return result as Record<string, unknown>;\n if (typeof result !== \"string\" || result.length > MAX_PARSE_LENGTH) return null;\n const trimmed = result.trimStart();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return null;\n try {\n const parsed: unknown = JSON.parse(trimmed);\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\nfunction resultRecord(result: unknown): Record<string, unknown> | null {\n const parsed = parseResult(result);\n return parsed && !Array.isArray(parsed) ? parsed : null;\n}\n\n/** A pull request or issue number off a result (`number`, else the `/pull/N` of its URL). */\nfunction resultNumber(result: unknown): number | undefined {\n const record = resultRecord(result);\n if (!record) return undefined;\n const direct = int(record.number) ?? int(record.pull_number) ?? int(record.issue_number);\n if (direct !== undefined) return direct;\n const url = str(record.html_url) ?? str(record.url);\n const match = url ? /\\/(?:pull|issues)\\/(\\d+)/.exec(url) : null;\n return match ? Number(match[1]) : undefined;\n}\n\n// ─── Asset titles ───────────────────────────────────────────────────────\n\nconst ASSET_ID = /^asset_[A-Za-z0-9-]{6,}$/;\nconst MAX_WALK_NODES = 2000;\ntype TitleEntries = readonly (readonly [string, string])[];\n/** Titles found in an object result, keyed by the result itself. */\nconst titlesByResultObject = new WeakMap<object, TitleEntries>();\n/** Titles found in a string result, keyed by the part that holds it and checked against the string. */\nconst titlesByStringPart = new WeakMap<object, { result: string; entries: TitleEntries }>();\n\nfunction titlesIn(value: unknown): (readonly [string, string])[] {\n const found: (readonly [string, string])[] = [];\n const stack: { node: unknown; depth: number }[] = [{ node: value, depth: 0 }];\n let visited = 0;\n while (stack.length > 0 && visited < MAX_WALK_NODES) {\n const { node, depth } = stack.pop()!;\n visited += 1;\n if (!node || typeof node !== \"object\" || depth > 4) continue;\n if (Array.isArray(node)) {\n for (const child of node) stack.push({ node: child, depth: depth + 1 });\n continue;\n }\n const record = node as Record<string, unknown>;\n const id = str(record.asset_id) ?? str(record.id) ?? str(record.assetId);\n const title = str(record.title) ?? str(record.name);\n if (id && title && ASSET_ID.test(id)) found.push([id, title] as const);\n for (const child of Object.values(record)) {\n if (child && typeof child === \"object\") stack.push({ node: child, depth: depth + 1 });\n }\n }\n return found;\n}\n\n/** The part shape {@link collectAssetTitles} reads; assistant-ui's tool-call parts satisfy it. */\nexport type AssetTitleSourcePart = {\n readonly type: string;\n readonly toolCallId?: string;\n readonly result?: unknown;\n};\n\n/**\n * The titles one result names, parsed once per result: an object result is\n * cached by its own identity, a string result by the part holding it and only\n * while that part still holds the same string, so a replaced result (however\n * long) is always read afresh. Weakly held: nothing outlives the transcript.\n */\nfunction resultTitles(part: AssetTitleSourcePart): TitleEntries {\n const result = part.result;\n if (result !== null && typeof result === \"object\") {\n let entries = titlesByResultObject.get(result);\n if (!entries) {\n entries = titlesIn(result);\n titlesByResultObject.set(result, entries);\n }\n return entries;\n }\n if (typeof result !== \"string\") return [];\n const cached = titlesByStringPart.get(part);\n if (cached && cached.result === result) return cached.entries;\n const entries = titlesIn(parseResult(result));\n titlesByStringPart.set(part, { result, entries });\n return entries;\n}\n\n/**\n * Asset id → title for every asset an earlier result in the turn named\n * (`search_assets` hits, a created asset, a status read), so a later call that\n * targets one by id can say which machine or document it acted on. Only data\n * the turn already holds; nothing is fetched.\n */\nexport function collectAssetTitles(parts: readonly AssetTitleSourcePart[]): Map<string, string> {\n const titles = new Map<string, string>();\n for (const part of parts) {\n if (part.type !== \"tool-call\" || part.result === undefined) continue;\n for (const [id, title] of resultTitles(part)) titles.set(id, title);\n }\n return titles;\n}\n\nfunction assetIdOf(value: unknown): string | undefined {\n const raw = str(value);\n if (!raw) return undefined;\n const bare = raw.split(/[?#]/, 1)[0]!;\n return bare.startsWith(\"asset_\") ? bare : undefined;\n}\n\n// ─── Phrases ────────────────────────────────────────────────────────────\n\n/**\n * How one call reads in every state: the verb in three forms (\"Running\" /\n * \"Ran\" / \"run\") and its object. `active` / `done` replace the composed\n * running / completed sentence when a tool words its outcome differently\n * (\"Found 3 assets for …\", \"jevin-box is running\").\n */\ninterface Phrase {\n verb: readonly [active: string, done: string, base: string];\n /** The object of the verb (\"git status\", \"live_audio.py\", \"a command\"). */\n object: string;\n code?: string;\n detail?: string;\n meta?: readonly (string | false | null | undefined)[];\n active?: string;\n done?: string;\n}\n\nconst RUN = [\"Running\", \"Ran\", \"run\"] as const;\nconst READ = [\"Reading\", \"Read\", \"read\"] as const;\n\nfunction summaryFromPhrase(phrase: Phrase, status: ToolSummaryState): ToolCallSummary {\n const [active, done, base] = phrase.verb;\n const imperative = `${capitalize(base)} ${phrase.object}`;\n let label: string;\n switch (status) {\n case \"running\":\n label = phrase.active ?? `${active} ${phrase.object}`;\n break;\n case \"complete\":\n label = phrase.done ?? `${done} ${phrase.object}`;\n break;\n case \"error\":\n label = `Couldn't ${base} ${phrase.object}`;\n break;\n case \"rejected\":\n label = `${imperative} — rejected`;\n break;\n case \"cancelled\":\n label = `${imperative} — cancelled`;\n break;\n case \"paused\":\n label = `${imperative} — paused`;\n break;\n case \"waiting\":\n label = \"Waiting for your input\";\n break;\n }\n const meta = (phrase.meta ?? []).filter((value): value is string => Boolean(value)).join(\" · \");\n const detail = status === \"waiting\" ? imperative : phrase.detail;\n return {\n label,\n ...(phrase.code && label.includes(phrase.code) ? { code: phrase.code } : {}),\n ...(detail ? { detail: clipLine(detail, DETAIL_MAX) } : {}),\n ...(meta ? { meta } : {}),\n };\n}\n\ntype Rule = (input: Required<Pick<SummarizeToolCallInput, \"status\">> & {\n args: Record<string, unknown>;\n result: unknown;\n titles: ReadonlyMap<string, string>;\n}) => Phrase;\n\nfunction machineName(titles: ReadonlyMap<string, string>, value: unknown): string | undefined {\n const id = assetIdOf(value);\n return id ? titles.get(id) : undefined;\n}\n\n/** \"on <machine>\" when a sandbox tool targeted another asset whose title the turn holds. */\nfunction onMachine(titles: ReadonlyMap<string, string>, args: Record<string, unknown>): string | undefined {\n const machine = machineName(titles, args.sandbox_asset_id);\n return machine ? `on ${machine}` : undefined;\n}\n\nconst COMPUTER_STATES: Record<string, string> = {\n started: \"running\",\n running: \"running\",\n stopped: \"stopped\",\n starting: \"starting\",\n stopping: \"stopping\",\n paused: \"paused\",\n error: \"in an error state\",\n};\n\nfunction computerStateWord(state: string): string {\n return COMPUTER_STATES[state.toLowerCase()] ?? humanizeToolName(state).toLowerCase();\n}\n\nconst executeRule: Rule = ({ args, result, titles }) => {\n const command = typeof args.command === \"string\" ? args.command : \"\";\n const { firstLine, extraLines } = firstCommandLine(command);\n const target = firstLine ? clipLine(firstLine) : undefined;\n const exitCode = executeExitCode(result);\n return {\n verb: RUN,\n object: target ?? \"a command\",\n code: target,\n detail: firstLine\n ? extraLines > 0\n ? `${firstLine} (+${plural(extraLines, \"more line\")})`\n : firstLine\n : undefined,\n meta: [onMachine(titles, args), exitCode !== null && exitCode !== 0 && `exit ${exitCode}`],\n };\n};\n\nfunction filePathOf(args: Record<string, unknown>): string | undefined {\n return str(args.file_path) ?? str(args.path);\n}\n\nconst readFileRule: Rule = ({ args, titles }) => {\n const path = filePathOf(args);\n const target = fileTarget(path);\n const offset = int(args.offset) ?? 0;\n const limit = int(args.limit);\n return {\n verb: READ,\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: path,\n meta: [\n offset > 0 && (limit ? `lines ${offset + 1}–${offset + limit}` : `from line ${offset + 1}`),\n onMachine(titles, args),\n ],\n };\n};\n\nconst listRule: Rule = ({ args, titles }) => {\n const path = str(args.path) ?? str(args.file_path);\n const target = path ? shortPath(path) : undefined;\n return {\n verb: [\"Listing\", \"Listed\", \"list\"],\n object: target ?? \"the workspace\",\n code: target,\n detail: path,\n meta: [onMachine(titles, args)],\n };\n};\n\nconst globRule: Rule = ({ args, result, titles }) => {\n const pattern = str(args.pattern) ?? str(args.query);\n const path = str(args.path);\n const object = pattern ? `files matching ${clipLine(pattern, 60)}` : \"files\";\n const none = typeof result === \"string\" && /^no files found/i.test(result.trim());\n return {\n verb: [\"Finding\", \"Found\", \"find\"],\n object,\n code: pattern ? clipLine(pattern, 60) : undefined,\n done: none && pattern ? `No files match ${clipLine(pattern, 60)}` : undefined,\n detail: path ? `${pattern ?? \"\"} in ${path}`.trim() : pattern,\n meta: [path && `in ${shortPath(path)}`, onMachine(titles, args)],\n };\n};\n\nconst grepRule: Rule = ({ args, result, titles }) => {\n const pattern = str(args.pattern) ?? str(args.query);\n const path = str(args.path);\n const code = pattern ? clipLine(pattern, 60) : undefined;\n const where = path ? `${shortPath(path)} ` : \"\";\n const object = code ? `${where}for ${code}` : path ? shortPath(path) : \"files\";\n const none =\n typeof result === \"string\" && (result.trim() === \"\" || /^no matches/i.test(result.trim()));\n return {\n verb: [\"Searching\", \"Searched\", \"search\"],\n object,\n code,\n done: none && code ? `No matches for ${code}${path ? ` in ${shortPath(path)}` : \"\"}` : undefined,\n detail: path ? `${pattern ?? \"\"} in ${path}`.trim() : pattern,\n meta: [str(args.glob), onMachine(titles, args)],\n };\n};\n\nconst writeFileRule: Rule = ({ args, titles }) => {\n const path = filePathOf(args);\n const target = fileTarget(path);\n const content = typeof args.content === \"string\" ? args.content : \"\";\n const lines = countLines(content);\n return {\n verb: [\"Writing\", \"Wrote\", \"write\"],\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: path,\n meta: [lines > 0 && `+${lines}`, onMachine(titles, args)],\n };\n};\n\nconst editFileRule: Rule = ({ args, titles }) => {\n const path = filePathOf(args);\n const target = fileTarget(path);\n const hasReplacement = typeof args.old_string === \"string\" || typeof args.new_string === \"string\";\n const { added, removed } = hasReplacement ? editLineStats(args) : { added: 0, removed: 0 };\n return {\n verb: [\"Editing\", \"Edited\", \"edit\"],\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: path,\n meta: [\n added + removed > 0 && `+${added} −${removed}`,\n args.replace_all === true && \"all occurrences\",\n onMachine(titles, args),\n ],\n };\n};\n\nconst searchAssetsRule: Rule = ({ args, result }) => {\n const query =\n str(args.title_contains_keyword) ??\n str(args.query) ??\n str(args.search_query) ??\n str(args.keyword);\n const types = Array.isArray(args.types)\n ? args.types.map(str).filter((type): type is string => type !== undefined)\n : [];\n const record = resultRecord(result);\n const assets = Array.isArray(record?.assets) ? record.assets : undefined;\n const count = int(record?.total_count) ?? int(record?.returned_count) ?? assets?.length;\n const forQuery = query ? ` for ${quoted(query)}` : \"\";\n const done =\n count === undefined\n ? undefined\n : count === 0\n ? `No assets found${forQuery}`\n : `Found ${plural(count, \"asset\")}${forQuery}`;\n return {\n verb: [\"Searching\", \"Searched\", \"search\"],\n object: query ? `for ${quoted(query)}` : \"assets\",\n done,\n meta: [types.length > 0 && types.map((type) => humanizeToolName(type).toLowerCase()).join(\", \")],\n };\n};\n\nconst ensureSandboxRule: Rule = ({ args, result, titles }) => {\n const machine = machineName(titles, args.computer_asset_id ?? args.asset_id);\n const record = resultRecord(result);\n const state = str(record?.state);\n return {\n verb: [\"Starting\", \"Started\", \"start\"],\n object: machine ?? \"the computer\",\n done: state ? `${machine ?? \"The computer\"} is ${computerStateWord(state)}` : undefined,\n detail: str(record?.detail),\n };\n};\n\nconst computerStatusRule: Rule = ({ args, result, titles }) => {\n const machine = machineName(titles, args.computer_asset_id ?? args.asset_id);\n const state = str(resultRecord(result)?.state);\n return {\n verb: [\"Checking\", \"Checked\", \"check\"],\n object: machine ?? \"the computer\",\n done: state ? `${machine ?? \"The computer\"} is ${computerStateWord(state)}` : undefined,\n };\n};\n\nconst computerDeployRule: Rule = ({ args, result, titles }) => {\n const machine = machineName(titles, args.computer_asset_id ?? args.asset_id);\n const port = int(args.port);\n const url = str(resultRecord(result)?.url);\n return {\n verb: [\"Deploying\", \"Deployed\", \"deploy\"],\n object: port !== undefined ? `port ${port}` : (machine ?? \"the computer\"),\n detail: url,\n meta: [port !== undefined && machine && `on ${machine}`],\n };\n};\n\nconst computerCreateRule: Rule = ({ args }) => {\n const name = str(args.name) ?? str(args.title);\n return {\n verb: [\"Creating\", \"Created\", \"create\"],\n object: name ? `computer ${quoted(name)}` : \"a computer\",\n };\n};\n\nfunction repoOf(args: Record<string, unknown>): string | undefined {\n const owner = str(args.owner);\n const repo = str(args.repo);\n if (owner && repo) return `${owner}/${repo}`;\n return repo ?? str(args.repository);\n}\n\nconst githubPullRule: Rule = ({ args }) => {\n const number = int(args.pull_number) ?? int(args.number);\n const repo = repoOf(args);\n return {\n verb: [\"Viewing\", \"Viewed\", \"view\"],\n object: number !== undefined ? `pull request #${number}` : \"a pull request\",\n detail: repo && number !== undefined ? `${repo}#${number}` : repo,\n meta: [repo],\n };\n};\n\nconst githubListPullsRule: Rule = ({ args }) => {\n const repo = repoOf(args);\n const state = str(args.state);\n return {\n verb: [\"Listing\", \"Listed\", \"list\"],\n object: state && state !== \"open\" ? `${state} pull requests` : \"pull requests\",\n meta: [repo, str(args.head) && `head ${str(args.head)}`],\n };\n};\n\nconst githubOpenPullRule: Rule = ({ args, result }) => {\n const title = str(args.title);\n const number = resultNumber(result);\n const head = str(args.head);\n const base = str(args.base);\n return {\n verb: [\"Opening\", \"Opened\", \"open\"],\n object: title ? `pull request ${quoted(title)}` : \"a pull request\",\n done: number !== undefined ? `Opened pull request #${number}` : undefined,\n detail: title,\n meta: [head && base && `${head} → ${base}`, args.draft === true && \"draft\", repoOf(args)],\n };\n};\n\nconst githubCommentRule: Rule = ({ args }) => {\n const number = int(args.issue_number) ?? int(args.pull_number);\n return {\n verb: [\"Commenting on\", \"Commented on\", \"comment on\"],\n object: number !== undefined ? `#${number}` : \"an issue\",\n meta: [repoOf(args)],\n };\n};\n\nconst githubIssueRule: Rule = ({ args, result }) => {\n const title = str(args.title);\n const number = resultNumber(result);\n return {\n verb: [\"Creating\", \"Created\", \"create\"],\n object: title ? `issue ${quoted(title)}` : \"an issue\",\n done: number !== undefined ? `Created issue #${number}` : undefined,\n detail: title,\n meta: [repoOf(args)],\n };\n};\n\nconst githubFileRule: Rule = ({ args }) => {\n const path = str(args.path);\n const target = fileTarget(path);\n const repo = repoOf(args);\n return {\n verb: READ,\n object: target?.text ?? \"a file\",\n code: target?.code,\n detail: repo && path ? `${repo}/${path}` : path,\n meta: [repo, str(args.ref)],\n };\n};\n\nconst githubDirectoryRule: Rule = ({ args }) => {\n const path = str(args.path);\n return {\n verb: [\"Listing\", \"Listed\", \"list\"],\n object: path ? shortPath(path) : \"the repository root\",\n code: path ? shortPath(path) : undefined,\n meta: [repoOf(args)],\n };\n};\n\nconst webSearchRule: Rule = ({ args }) => {\n const query = str(args.query) ?? str(args.search_query) ?? str(args.term);\n return {\n verb: [\"Searching\", \"Searched\", \"search\"],\n object: query ? `the web for ${quoted(query)}` : \"the web\",\n };\n};\n\n/** Host and path of a URL, never its credentials, query string or fragment. */\nfunction pageLabel(value: unknown): string | undefined {\n const raw = str(value);\n if (!raw) return undefined;\n try {\n const url = new URL(raw);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n const path = url.pathname === \"/\" ? \"\" : url.pathname;\n return clipLine(`${url.hostname.replace(/^www\\./, \"\")}${path}`, 60);\n } catch {\n return undefined;\n }\n}\n\nconst browseRule: Rule = ({ args }) => {\n const page = pageLabel(args.url) ?? pageLabel(args.link);\n return { verb: READ, object: page ?? \"a web page\" };\n};\n\nconst readAssetRule: Rule = ({ args, titles }) => {\n const rawIds = Array.isArray(args.asset_ids) ? args.asset_ids : [args.asset_id ?? args.asset_ids];\n const ids = rawIds.map(assetIdOf).filter((id): id is string => id !== undefined);\n const named = ids.map((id) => titles.get(id)).filter((title): title is string => Boolean(title));\n const object =\n ids.length > 1\n ? plural(ids.length, \"asset\")\n : named[0]\n ? clipLine(named[0], 60)\n : \"an asset\";\n return {\n verb: READ,\n object,\n detail: ids.length > 1 && named.length > 0 ? named.join(\", \") : undefined,\n };\n};\n\ntype Todo = { status?: unknown; content?: unknown };\n\nconst writeTodosRule: Rule = ({ args }) => {\n const todos = Array.isArray(args.todos) ? (args.todos as Todo[]) : [];\n const done = todos.filter((todo) => todo?.status === \"completed\").length;\n const current = todos.find((todo) => todo?.status === \"in_progress\");\n return {\n verb: [\"Updating\", \"Updated\", \"update\"],\n object: \"plan\",\n done:\n todos.length === 0 ? \"Cleared the plan\" : `Updated plan (${done}/${todos.length} done)`,\n detail: str(current?.content) ? `Now: ${str(current?.content)}` : undefined,\n };\n};\n\nfunction subagentName(value: unknown): string {\n const name = str(value);\n if (!name || name === \"general-purpose\") return \"a subagent\";\n return humanizeToolName(name).toLowerCase();\n}\n\nconst taskRule: Rule = ({ args }) => {\n const description = str(args.description);\n const who = subagentName(args.subagent_type);\n return {\n verb: [\"Delegating to\", \"Delegated to\", \"delegate to\"],\n object: description ? `${who}: ${clipLine(description, 64)}` : who,\n detail: description,\n };\n};\n\nconst startAsyncTaskRule: Rule = ({ args }) => {\n const description = str(args.description);\n return {\n verb: [\"Starting\", \"Started\", \"start\"],\n object: description ? `background task: ${clipLine(description, 56)}` : \"a background task\",\n detail: description,\n };\n};\n\n// ─── UI Testing toolkit ─────────────────────────────────────────────────\n\nconst testRecordingStartRule: Rule = ({ args }) => {\n const title = str(args.title);\n return {\n verb: [\"Starting\", \"Started\", \"start\"],\n object: title ? `recording ${quoted(title)}` : \"a test recording\",\n };\n};\n\n/** \"Started test: It should …\", \"Passed: …\", \"Failed: …\", \"Noted …\", with where in the recording. */\nconst testRecordingMarkRule: Rule = ({ args, result }) => {\n const mark = describeTestRecordingMark({ args, result });\n const text = mark.text ? clipLine(mark.text, 64) : undefined;\n const at = mark.elapsedS !== null ? `at ${formatRecordingClock(mark.elapsedS)}` : undefined;\n const common = { detail: mark.text || undefined, meta: [at] };\n switch (mark.kind) {\n case \"test\":\n return { ...common, verb: [\"Starting\", \"Started\", \"start\"], object: text ? `test: ${text}` : \"a test\" };\n case \"pass\":\n return {\n ...common,\n verb: [\"Marking\", \"Marked\", \"mark\"],\n object: text ? `pass: ${text}` : \"a pass\",\n done: text ? `Passed: ${text}` : \"Marked a pass\",\n };\n case \"fail\":\n return {\n ...common,\n verb: [\"Marking\", \"Marked\", \"mark\"],\n object: text ? `failure: ${text}` : \"a failure\",\n done: text ? `Failed: ${text}` : \"Marked a failure\",\n };\n case \"note\":\n return { ...common, verb: [\"Noting\", \"Noted\", \"note\"], object: text ?? \"a note\" };\n default:\n return { ...common, verb: [\"Marking\", \"Marked\", \"mark\"], object: \"the recording\" };\n }\n};\n\nconst testRecordingStopRule: Rule = ({ args, result }) => {\n const parsed = parseTestRecordingStopResult(result, { fallbackTitle: str(args.title) });\n const title = parsed.kind === \"saved\" ? parsed.report.title : str(args.title);\n return {\n verb: [\"Saving\", \"Saved\", \"save\"],\n object: title ? `test recording ${quoted(title)}` : \"the test recording\",\n meta: [parsed.kind === \"saved\" ? formatTestRecordingCounts(parsed.report) : undefined],\n };\n};\n\nconst RULES: Record<string, Rule> = {\n execute: executeRule,\n read_file: readFileRule,\n ls: listRule,\n glob: globRule,\n grep: grepRule,\n write_file: writeFileRule,\n edit_file: editFileRule,\n search_assets: searchAssetsRule,\n computer_asset_ensure_sandbox: ensureSandboxRule,\n computer_asset_get_status: computerStatusRule,\n computer_asset_deploy: computerDeployRule,\n computer_asset_create: computerCreateRule,\n github_get_pull_request: githubPullRule,\n github_list_pull_requests: githubListPullsRule,\n github_open_pull_request: githubOpenPullRule,\n github_comment: githubCommentRule,\n github_create_issue: githubIssueRule,\n github_fetch_file: githubFileRule,\n github_list_directory: githubDirectoryRule,\n search: webSearchRule,\n web_search: webSearchRule,\n search_web: webSearchRule,\n exa_search: webSearchRule,\n perplexity_search: webSearchRule,\n firecrawl_search: webSearchRule,\n browse: browseRule,\n web_fetch: browseRule,\n fetch_url: browseRule,\n web_scrape: browseRule,\n scrape_web: browseRule,\n firecrawl_scrape: browseRule,\n read_asset: readAssetRule,\n write_todos: writeTodosRule,\n task: taskRule,\n start_async_task: startAsyncTaskRule,\n test_recording_start: testRecordingStartRule,\n test_recording_mark: testRecordingMarkRule,\n test_recording_stop: testRecordingStopRule,\n};\n\n/** Tool names with a dedicated summary rule (the rest read the shared registry). */\nexport function hasToolSummaryRule(toolName: string): boolean {\n return Object.hasOwn(RULES, toolName);\n}\n\n/**\n * The summary for a tool the shared registry describes: its curated running /\n * completed copy with the call's own one-line description as the chip, and\n * the registry's wording for every other state.\n */\nfunction registrySummary(toolName: string, args: Record<string, unknown> | undefined, status: ToolSummaryState): ToolCallSummary {\n const meta = getToolDisplayMeta(toolName);\n const described = describeToolArgs({ toolName, args });\n const label =\n status === \"running\"\n ? meta.activeLabel\n : status === \"complete\"\n ? (meta.completedLabel ?? toolCompletedLabel(meta.activeLabel))\n : toolStatusLabel(toolName, status);\n return {\n label,\n ...(described && status !== \"waiting\" ? { meta: clipLine(described, 60) } : {}),\n };\n}\n\n/**\n * A tool nothing describes: the host's catalog name (\"Running Frobnicate\",\n * then \"Frobnicate\"), else the sentence-cased tool name (\"Running frobnicate\n * widgets\", then \"Ran frobnicate widgets\").\n */\nfunction unknownToolSummary(toolName: string, status: ToolSummaryState, displayName: string | undefined): ToolCallSummary {\n const name = displayName ?? humanizeToolName(toolName);\n const inSentence = displayName ?? lowerFirst(name);\n switch (status) {\n case \"running\":\n return { label: `Running ${inSentence}` };\n case \"complete\":\n return { label: displayName ?? `Ran ${inSentence}` };\n case \"error\":\n return { label: `${name} failed` };\n case \"rejected\":\n return { label: `${name} — rejected` };\n case \"cancelled\":\n return { label: `${name} — cancelled` };\n case \"paused\":\n return { label: `${name} — paused` };\n case \"waiting\":\n return { label: \"Waiting for your input\", detail: name };\n }\n}\n\n/**\n * The one-line summary of a tool call in its current state. Never throws:\n * missing or partial arguments (a call still streaming) fall back to the\n * verb with a generic object (\"Running a command\").\n */\nexport function summarizeToolCall({\n toolName,\n args,\n result,\n status,\n assetTitles,\n displayName,\n}: SummarizeToolCallInput): ToolCallSummary {\n const rule = RULES[toolName];\n if (rule) {\n return summaryFromPhrase(\n rule({ args: args ?? {}, result, status, titles: assetTitles ?? EMPTY_TITLES }),\n status,\n );\n }\n if (hasToolDisplayMeta(toolName)) return registrySummary(toolName, args, status);\n return unknownToolSummary(toolName, status, displayName);\n}\n"],"names":["entries","describeTestRecordingMark","formatRecordingClock","parseTestRecordingStopResult","formatTestRecordingCounts","getToolDisplayMeta","describeToolArgs","toolCompletedLabel","toolStatusLabel","hasToolDisplayMeta"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { parseTestRecordingStopResult, formatTestRecordingCounts, describeTestRecordingMark, formatRecordingClock } from "./test-recording-report.js";
1
2
  import { hasToolDisplayMeta, getToolDisplayMeta, describeToolArgs, toolCompletedLabel, toolStatusLabel } from "../agent-runtime/src/tool-metadata.js";
2
3
  const TARGET_MAX = 72;
3
4
  const DETAIL_MAX = 300;
@@ -562,6 +563,50 @@ const startAsyncTaskRule = ({ args }) => {
562
563
  detail: description
563
564
  };
564
565
  };
566
+ const testRecordingStartRule = ({ args }) => {
567
+ const title = str(args.title);
568
+ return {
569
+ verb: ["Starting", "Started", "start"],
570
+ object: title ? `recording ${quoted(title)}` : "a test recording"
571
+ };
572
+ };
573
+ const testRecordingMarkRule = ({ args, result }) => {
574
+ const mark = describeTestRecordingMark({ args, result });
575
+ const text = mark.text ? clipLine(mark.text, 64) : void 0;
576
+ const at = mark.elapsedS !== null ? `at ${formatRecordingClock(mark.elapsedS)}` : void 0;
577
+ const common = { detail: mark.text || void 0, meta: [at] };
578
+ switch (mark.kind) {
579
+ case "test":
580
+ return { ...common, verb: ["Starting", "Started", "start"], object: text ? `test: ${text}` : "a test" };
581
+ case "pass":
582
+ return {
583
+ ...common,
584
+ verb: ["Marking", "Marked", "mark"],
585
+ object: text ? `pass: ${text}` : "a pass",
586
+ done: text ? `Passed: ${text}` : "Marked a pass"
587
+ };
588
+ case "fail":
589
+ return {
590
+ ...common,
591
+ verb: ["Marking", "Marked", "mark"],
592
+ object: text ? `failure: ${text}` : "a failure",
593
+ done: text ? `Failed: ${text}` : "Marked a failure"
594
+ };
595
+ case "note":
596
+ return { ...common, verb: ["Noting", "Noted", "note"], object: text ?? "a note" };
597
+ default:
598
+ return { ...common, verb: ["Marking", "Marked", "mark"], object: "the recording" };
599
+ }
600
+ };
601
+ const testRecordingStopRule = ({ args, result }) => {
602
+ const parsed = parseTestRecordingStopResult(result, { fallbackTitle: str(args.title) });
603
+ const title = parsed.kind === "saved" ? parsed.report.title : str(args.title);
604
+ return {
605
+ verb: ["Saving", "Saved", "save"],
606
+ object: title ? `test recording ${quoted(title)}` : "the test recording",
607
+ meta: [parsed.kind === "saved" ? formatTestRecordingCounts(parsed.report) : void 0]
608
+ };
609
+ };
565
610
  const RULES = {
566
611
  execute: executeRule,
567
612
  read_file: readFileRule,
@@ -597,7 +642,10 @@ const RULES = {
597
642
  read_asset: readAssetRule,
598
643
  write_todos: writeTodosRule,
599
644
  task: taskRule,
600
- start_async_task: startAsyncTaskRule
645
+ start_async_task: startAsyncTaskRule,
646
+ test_recording_start: testRecordingStartRule,
647
+ test_recording_mark: testRecordingMarkRule,
648
+ test_recording_stop: testRecordingStopRule
601
649
  };
602
650
  function registrySummary(toolName, args, status) {
603
651
  const meta = getToolDisplayMeta(toolName);