@opengeni/react 1.4.2 → 1.4.5-canary.37458084490001
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.
- package/README.md +17 -6
- package/dist/artifacts.d.ts +1 -0
- package/dist/artifacts.js +22 -15
- package/dist/artifacts.js.map +1 -1
- package/dist/{browser-viewer-WGJ43YGI.js → browser-viewer-CV23VIHB.js} +8 -6
- package/dist/chunk-3ZC6QPOM.js +174 -0
- package/dist/chunk-3ZC6QPOM.js.map +1 -0
- package/dist/{chunk-YVFRBXST.js → chunk-4BCVCJSU.js} +2 -2
- package/dist/{chunk-JHTIMBOL.js → chunk-5JSUNNQN.js} +26 -4
- package/dist/{chunk-JHTIMBOL.js.map → chunk-5JSUNNQN.js.map} +1 -1
- package/dist/{chunk-MDIXFKA3.js → chunk-6FOTSVWU.js} +303 -109
- package/dist/chunk-6FOTSVWU.js.map +1 -0
- package/dist/{chunk-IUHHPMAX.js → chunk-7RRBX5EM.js} +14 -85
- package/dist/chunk-7RRBX5EM.js.map +1 -0
- package/dist/{chunk-L2J3PU7A.js → chunk-7ZB7I3KP.js} +24 -98
- package/dist/chunk-7ZB7I3KP.js.map +1 -0
- package/dist/{chunk-LVS3MH5T.js → chunk-ATIRUHBZ.js} +128 -10
- package/dist/chunk-ATIRUHBZ.js.map +1 -0
- package/dist/chunk-BOFEQC6K.js +162 -0
- package/dist/chunk-BOFEQC6K.js.map +1 -0
- package/dist/{chunk-VCSERYXH.js → chunk-CESBPQP5.js} +309 -162
- package/dist/chunk-CESBPQP5.js.map +1 -0
- package/dist/{chunk-IYQCWGU5.js → chunk-GHJU7XG7.js} +35 -62
- package/dist/chunk-GHJU7XG7.js.map +1 -0
- package/dist/{chunk-G6YRCIYJ.js → chunk-HNVWMDNN.js} +55 -60
- package/dist/chunk-HNVWMDNN.js.map +1 -0
- package/dist/{chunk-PHBFJCEU.js → chunk-I5EGRXXG.js} +110 -7
- package/dist/chunk-I5EGRXXG.js.map +1 -0
- package/dist/{chunk-PBCZL4JP.js → chunk-INIZSNXT.js} +2 -2
- package/dist/{chunk-XS67YG5R.js → chunk-IX3K4THH.js} +24 -3
- package/dist/chunk-IX3K4THH.js.map +1 -0
- package/dist/chunk-IZV5FTJC.js +55 -0
- package/dist/chunk-IZV5FTJC.js.map +1 -0
- package/dist/chunk-JDJJMBB3.js +1883 -0
- package/dist/chunk-JDJJMBB3.js.map +1 -0
- package/dist/{chunk-C5BF4L26.js → chunk-KHF2VRXF.js} +7 -7
- package/dist/{chunk-QMMCJGFI.js → chunk-L5OKM2VX.js} +2 -2
- package/dist/chunk-LHF6BVM4.js +83 -0
- package/dist/chunk-LHF6BVM4.js.map +1 -0
- package/dist/chunk-N7S72EXK.js +25 -0
- package/dist/chunk-N7S72EXK.js.map +1 -0
- package/dist/{chunk-CVYCLFMH.js → chunk-PEHTX3V7.js} +19 -1
- package/dist/chunk-PEHTX3V7.js.map +1 -0
- package/dist/chunk-R5R5RQQD.js +51 -0
- package/dist/chunk-R5R5RQQD.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/{chunk-JH7V627O.js → chunk-SHLZMAJN.js} +2 -11
- package/dist/chunk-SHLZMAJN.js.map +1 -0
- package/dist/{chunk-CREMJMVN.js → chunk-TZQSHCZN.js} +692 -1996
- package/dist/chunk-TZQSHCZN.js.map +1 -0
- package/dist/chunk-ZIB4H5LN.js +101 -0
- package/dist/chunk-ZIB4H5LN.js.map +1 -0
- package/dist/client.d.ts +9 -3
- package/dist/clipboard.js +1 -1
- package/dist/components/browser-viewer.d.ts +6 -0
- package/dist/components/composer.d.ts +3 -69
- package/dist/components/human-input-form.d.ts +3 -32
- package/dist/components/markdown.d.ts +8 -0
- package/dist/components/model-policy-picker.d.ts +4 -37
- package/dist/components/opper-mark.d.ts +7 -0
- package/dist/components/provider-recovery-notice.d.ts +15 -0
- package/dist/components/remark-soft-line-breaks.d.ts +38 -0
- package/dist/components/sandbox-workspace.d.ts +13 -0
- package/dist/components/session-chrome.d.ts +5 -3
- package/dist/components/session-conversation.d.ts +15 -3
- package/dist/composer-messages.d.ts +74 -0
- package/dist/composer-messages.js +9 -0
- package/dist/composer.js +15 -10
- package/dist/{computer-viewer-46UIN7F3.js → computer-viewer-K4CKYRX6.js} +4 -4
- package/dist/connect-setup.d.ts +2 -0
- package/dist/connect.d.ts +1 -1
- package/dist/connect.js +21 -6
- package/dist/connect.js.map +1 -1
- package/dist/{embedded-voice-NIL4RDX3.js → embedded-voice-3ZFWWJ6O.js} +6 -4
- package/dist/{embedded-voice-NIL4RDX3.js.map → embedded-voice-3ZFWWJ6O.js.map} +1 -1
- package/dist/hooks/shared-machines-list.d.ts +4 -0
- package/dist/hooks/use-client-config-flags.d.ts +6 -0
- package/dist/hooks/use-computer-session.d.ts +2 -0
- package/dist/hooks/use-goal.d.ts +2 -1
- package/dist/human-input-model.d.ts +40 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +116 -73
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +5 -5
- package/dist/{latest-question-2POFPYNB.js → latest-question-SWC6QEVN.js} +3 -3
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/provider-recovery.d.ts +49 -0
- package/dist/machines.js +2 -2
- package/dist/model-mark-paths.d.ts +34 -0
- package/dist/model-mark-paths.js +16 -0
- package/dist/model-picker-model.d.ts +111 -0
- package/dist/model-picker-model.js +25 -0
- package/dist/model-picker-model.js.map +1 -0
- package/dist/{model-policy-picker-menu-WRNSRFQC.js → model-policy-picker-menu-NM4RPTY6.js} +6 -4
- package/dist/model-policy-picker-menu-NM4RPTY6.js.map +1 -0
- package/dist/model-policy.d.ts +10 -0
- package/dist/model-policy.js +5 -1
- package/dist/organization-model.d.ts +32 -0
- package/dist/organization-model.js +65 -0
- package/dist/organization-model.js.map +1 -0
- package/dist/{platform-activity-row-PJJVATTZ.js → platform-activity-row-NJ47YBXW.js} +7 -84
- package/dist/platform-activity-row-NJ47YBXW.js.map +1 -0
- package/dist/queue-presentation-model.d.ts +72 -0
- package/dist/queue-presentation-model.js +38 -0
- package/dist/queue-presentation-model.js.map +1 -0
- package/dist/{queue-surface-implementation-67FS7FUI.js → queue-surface-implementation-YPJFQ3O6.js} +24 -252
- package/dist/queue-surface-implementation-YPJFQ3O6.js.map +1 -0
- package/dist/realtime.js +5 -3
- package/dist/{sandbox-files-34CJJNOY.js → sandbox-files-RCVCMXG7.js} +5 -5
- package/dist/sandbox-files-RCVCMXG7.js.map +1 -0
- package/dist/sandbox-label-model.d.ts +23 -0
- package/dist/sandbox-label-model.js +28 -0
- package/dist/sandbox-label-model.js.map +1 -0
- package/dist/session-attention-model.d.ts +8 -0
- package/dist/session-attention-model.js +46 -0
- package/dist/session-attention-model.js.map +1 -0
- package/dist/session-feedback-model.d.ts +20 -0
- package/dist/session-feedback-model.js +56 -0
- package/dist/session-feedback-model.js.map +1 -0
- package/dist/session-list-model.d.ts +96 -0
- package/dist/session-list-model.js +219 -0
- package/dist/session-list-model.js.map +1 -0
- package/dist/session-status-model.d.ts +19 -0
- package/dist/session-ui.js +26 -17
- package/dist/session-ui.js.map +1 -1
- package/dist/session.js +8 -6
- package/dist/testing/session-scenarios.d.ts +10 -0
- package/dist/testing/session-scenarios.js +303 -0
- package/dist/testing/session-scenarios.js.map +1 -0
- package/dist/timeline/genie-copy.d.ts +3 -0
- package/dist/timeline/genie-loading.d.ts +11 -0
- package/dist/timeline/index.d.ts +1 -1
- package/dist/timeline/notice-presentation.d.ts +7 -0
- package/dist/timeline/patch-apply-command.d.ts +18 -0
- package/dist/timeline/platform-activity-presentation.d.ts +7 -0
- package/dist/timeline/presented-image.d.ts +6 -1
- package/dist/timeline/question-nav-model.d.ts +23 -0
- package/dist/timeline/registry.d.ts +10 -1
- package/dist/timeline/retained-loaders.d.ts +1 -1
- package/dist/timeline/tool-presentation.d.ts +172 -0
- package/dist/timeline/turn-summary-model.d.ts +90 -0
- package/dist/timeline/turn-summary.d.ts +4 -74
- package/dist/timeline/work-presentation.d.ts +42 -0
- package/dist/timeline-model.d.ts +24 -0
- package/dist/timeline-model.js +152 -0
- package/dist/timeline-model.js.map +1 -0
- package/package.json +47 -3
- package/src/artifacts.ts +1 -0
- package/src/client.ts +9 -3
- package/src/components/browser-viewer.tsx +23 -2
- package/src/components/claude-mark.tsx +2 -1
- package/src/components/composer.tsx +4 -144
- package/src/components/computer-viewer.tsx +139 -30
- package/src/components/grok-mark.tsx +2 -1
- package/src/components/human-input-form.tsx +13 -124
- package/src/components/markdown.tsx +19 -1
- package/src/components/message-timeline.tsx +45 -99
- package/src/components/model-mark.tsx +2 -1
- package/src/components/model-policy-picker-menu.tsx +30 -85
- package/src/components/model-policy-picker.tsx +15 -148
- package/src/components/opper-mark.tsx +18 -0
- package/src/components/provider-recovery-notice.tsx +41 -0
- package/src/components/queue-surface-implementation.tsx +20 -349
- package/src/components/remark-soft-line-breaks.ts +166 -0
- package/src/components/sandbox-workspace.tsx +17 -1
- package/src/components/session-chrome.tsx +114 -99
- package/src/components/session-conversation.tsx +55 -6
- package/src/components/session-list.tsx +1 -1
- package/src/components/session-status.tsx +17 -16
- package/src/composer-messages.ts +150 -0
- package/src/connect-setup.tsx +45 -11
- package/src/connect.ts +1 -1
- package/src/hooks/shared-machines-list.ts +34 -1
- package/src/hooks/use-browser-session.ts +445 -168
- package/src/hooks/use-client-config-flags.ts +8 -0
- package/src/hooks/use-computer-session.ts +334 -98
- package/src/hooks/use-goal.ts +66 -10
- package/src/human-input-model.ts +147 -0
- package/src/index.ts +16 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/format.ts +7 -0
- package/src/lib/provider-recovery.ts +202 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +43 -2
- package/src/organization-model.ts +118 -0
- package/src/queue-presentation-model.ts +464 -0
- package/src/sandbox-label-model.ts +41 -0
- package/src/session-attention-model.ts +59 -0
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +327 -0
- package/src/session-status-model.ts +62 -0
- package/src/testing/session-scenarios.ts +326 -0
- package/src/timeline/activity-rail.tsx +5 -17
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +13 -18
- package/src/timeline/index.ts +1 -0
- package/src/timeline/notice-presentation.ts +22 -0
- package/src/timeline/patch-apply-command.tsx +135 -0
- package/src/timeline/platform-activity-presentation.ts +122 -0
- package/src/timeline/platform-activity-row.tsx +6 -96
- package/src/timeline/presented-image.ts +16 -2
- package/src/timeline/question-nav-model.ts +28 -0
- package/src/timeline/registry.ts +11 -1
- package/src/timeline/retained-loaders.ts +9 -4
- package/src/timeline/rolling-activity.tsx +7 -19
- package/src/timeline/tool-presentation.ts +1316 -0
- package/src/timeline/tool-renderers.tsx +226 -1025
- package/src/timeline/turn-summary-model.ts +338 -0
- package/src/timeline/turn-summary.tsx +21 -326
- package/src/timeline/work-presentation.ts +139 -0
- package/src/timeline-model.ts +108 -0
- package/styles/compiled.css +8 -0
- package/styles/connect.css +4 -0
- package/dist/chunk-CREMJMVN.js.map +0 -1
- package/dist/chunk-CVYCLFMH.js.map +0 -1
- package/dist/chunk-G6YRCIYJ.js.map +0 -1
- package/dist/chunk-HXYOSSQO.js +0 -117
- package/dist/chunk-HXYOSSQO.js.map +0 -1
- package/dist/chunk-IUHHPMAX.js.map +0 -1
- package/dist/chunk-IYQCWGU5.js.map +0 -1
- package/dist/chunk-JH7V627O.js.map +0 -1
- package/dist/chunk-L2J3PU7A.js.map +0 -1
- package/dist/chunk-LVS3MH5T.js.map +0 -1
- package/dist/chunk-MDIXFKA3.js.map +0 -1
- package/dist/chunk-PHBFJCEU.js.map +0 -1
- package/dist/chunk-VCSERYXH.js.map +0 -1
- package/dist/chunk-XS67YG5R.js.map +0 -1
- package/dist/platform-activity-row-PJJVATTZ.js.map +0 -1
- package/dist/queue-surface-implementation-67FS7FUI.js.map +0 -1
- /package/dist/{browser-viewer-WGJ43YGI.js.map → browser-viewer-CV23VIHB.js.map} +0 -0
- /package/dist/{chunk-YVFRBXST.js.map → chunk-4BCVCJSU.js.map} +0 -0
- /package/dist/{chunk-PBCZL4JP.js.map → chunk-INIZSNXT.js.map} +0 -0
- /package/dist/{chunk-C5BF4L26.js.map → chunk-KHF2VRXF.js.map} +0 -0
- /package/dist/{chunk-QMMCJGFI.js.map → chunk-L5OKM2VX.js.map} +0 -0
- /package/dist/{computer-viewer-46UIN7F3.js.map → composer-messages.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-WRNSRFQC.js.map → computer-viewer-K4CKYRX6.js.map} +0 -0
- /package/dist/{latest-question-2POFPYNB.js.map → latest-question-SWC6QEVN.js.map} +0 -0
- /package/dist/{sandbox-files-34CJJNOY.js.map → model-mark-paths.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/timeline/parsers.ts","../src/timeline/registry.ts","../src/timeline/turn-summary-model.ts","../src/timeline/work-presentation.ts","../src/timeline/tool-presentation.ts","../src/timeline/genie-copy.ts","../src/human-input-model.ts","../src/session-status-model.ts","../src/timeline/notice-presentation.ts","../src/timeline/question-nav-model.ts"],"sourcesContent":["import {\n normalizeMcpOutput,\n parseGeneratedImageReceipt,\n type GeneratedImageReceipt,\n type GitFileDiff,\n type RetainedArtifactMetadata,\n} from \"@opengeni/sdk\";\nimport { tryParseJson } from \"../lib/format\";\n\nexport type { GeneratedImageReceipt };\n\n/* ----------------------------------------------------------------------------\n Pure parsers for the provider-native tool shapes that the timeline renders.\n\n These are intentionally browser-safe, dependency-free mirrors of the\n server-side helpers in `@opengeni/runtime` (`sandboxCommandExitCode`,\n `parseExecBannerSessionId`, `stripExecBanner`) plus the V4A diff parser the\n apply-patch renderer needs. The SDK does not depend on `@opengeni/runtime` by\n design (runtime is a heavy server package); these few regexes are cheap to\n own here and keep the React surface free of a server dependency.\n\n Every function is pure -- same input, same output -- so it can be\n unit-tested and memoized.\n -------------------------------------------------------------------------- */\n\n/** Recover the exit code from a sandbox exec banner (`Process exited with code N`). */\nexport function sandboxCommandExitCode(out: unknown): number | null {\n const match = String(out ?? \"\").match(/Process exited with code (-?\\d+)/);\n return match ? Number(match[1]) : null;\n}\n\n/**\n * Recover the numeric exec-session id the sandbox embeds for a STILL-RUNNING\n * (backgrounded) process (`Process running with session ID N`). A finished\n * command emits `Process exited with code N` instead, which yields `null`.\n */\nexport function parseExecBannerSessionId(out: unknown): number | null {\n const text = String(out ?? \"\");\n const outputIdx = text.indexOf(\"\\nOutput:\\n\");\n const banner =\n outputIdx >= 0 ? text.slice(0, outputIdx) : text.startsWith(\"Output:\\n\") ? \"\" : text;\n const match = banner.match(/Process running with session ID (\\d+)/);\n if (!match) {\n return null;\n }\n const n = Number.parseInt(match[1]!, 10);\n return Number.isFinite(n) ? n : null;\n}\n\n/** Strip the exec banner (`Chunk ID ...\\n...\\nOutput:\\n`) down to the command's stdout. */\nexport function stripExecBanner(out: unknown): string {\n const text = String(out ?? \"\");\n const marker = text.indexOf(\"\\nOutput:\\n\");\n if (marker >= 0) {\n return text.slice(marker + \"\\nOutput:\\n\".length);\n }\n if (text.startsWith(\"Output:\\n\")) {\n return text.slice(\"Output:\\n\".length);\n }\n return text;\n}\n\n/** The sandbox clamped the output (token/line truncation markers in the banner). */\nexport function execTruncated(out: unknown): boolean {\n return /Total output lines:|\\.{3}\\d+ tokens truncated\\.{3}|\\[\\.{3}\\d+ characters truncated/.test(\n String(out ?? \"\"),\n );\n}\n\n/** A `write_stdin` whose target PTY vanished (`write_stdin failed: session not found: N`). */\nexport function isExecSessionLostBanner(out: unknown): boolean {\n return /write_stdin failed: session not found: \\d+/.test(String(out ?? \"\"));\n}\n\n/** True when the exec stdout looks binary/garbled (a NUL byte or ELF magic). */\nexport function looksBinary(text: string): boolean {\n return text.includes(\"\\u0000\") || text.startsWith(\"\\u007fELF\");\n}\n\n/**\n * Render unprintable control characters as caret notation (0x03 -> `^C`) so a\n * `write_stdin` keystroke payload reads cleanly in the row title.\n */\nexport function controlCaret(printable: string): string {\n return String(printable).replace(\n /[\\u0000-\\u001f]/g,\n (c) => `^${String.fromCharCode(c.charCodeAt(0) + 64)}`,\n );\n}\n\n/* --- V4A apply_patch diff -> GitFileDiff ------------------------------------ */\n\n/** One operation inside an `apply_patch_call` (a V4A file edit). */\nexport type ApplyPatchOperation = {\n /**\n * The V4A op kind. The three canonical values are `create_file`,\n * `update_file`, and `delete_file`; the open `string` tail tolerates a\n * forward-compatible/unknown op kind from the provider without a type error\n * (it falls through to the \"Edited\" treatment).\n */\n type: \"create_file\" | \"update_file\" | \"delete_file\" | (string & {});\n path: string;\n /** Rename target -- when present the op is a move/rename. */\n moveTo?: string | null | undefined;\n /** The V4A hunk string (`@@ ...` lines with `+`/`-`/context prefixes). */\n diff?: string | undefined;\n};\n\n/**\n * Parse a single V4A `apply_patch` operation into the SDK's `GitFileDiff` shape\n * so it can flow into the SAME `DiffView` / `PierreDiff` the Files tab uses.\n * Throws on a hunk string it cannot structure (no `@@` anchor on an update); the\n * renderer catches and falls back to a raw-patch view.\n */\nexport function v4aToGitFileDiff(op: ApplyPatchOperation): GitFileDiff {\n const status: GitFileDiff[\"status\"] =\n op.type === \"create_file\"\n ? \"added\"\n : op.type === \"delete_file\"\n ? \"deleted\"\n : op.moveTo\n ? \"renamed\"\n : \"modified\";\n const oldPath = op.moveTo ? op.path : null;\n const path = op.moveTo || op.path;\n\n const hunks: GitFileDiff[\"hunks\"] = [];\n let additions = 0;\n let deletions = 0;\n let sawHunkAnchor = false;\n\n if (op.type !== \"delete_file\") {\n const lines = (op.diff ?? \"\").split(\"\\n\");\n let cur: GitFileDiff[\"hunks\"][number] | null = null;\n let oldNo = 1;\n let newNo = 1;\n for (const raw of lines) {\n if (raw.startsWith(\"@@\")) {\n sawHunkAnchor = true;\n const match = raw.match(/-(\\d+)(?:,\\d+)?\\s+\\+(\\d+)/);\n oldNo = match ? Number(match[1]) : 1;\n newNo = match ? Number(match[2]) : 1;\n cur = {\n oldStart: oldNo,\n oldLines: 0,\n newStart: newNo,\n newLines: 0,\n header: raw,\n lines: [{ type: \"meta\", oldNo: null, newNo: null, text: raw }],\n };\n hunks.push(cur);\n } else if (cur || op.type === \"create_file\") {\n if (!cur) {\n // No `@@` anchor on a create_file body: synthesize an add-only hunk.\n // Leave `header` empty so `gitFileDiffToPatch` regenerates a valid\n // `@@ -0,0 +1,N @@` from the range fields once newLines is counted — a\n // pre-baked partial header (e.g. `@@ +1 @@`) renders zero lines in a\n // generic unified-diff parser.\n cur = {\n oldStart: 0,\n oldLines: 0,\n newStart: 1,\n newLines: 0,\n header: \"\",\n lines: [],\n };\n hunks.push(cur);\n oldNo = 0;\n newNo = 1;\n }\n if (raw.startsWith(\"+\")) {\n cur.lines.push({\n type: \"add\",\n oldNo: null,\n newNo: newNo++,\n text: raw.slice(1),\n });\n cur.newLines += 1;\n additions += 1;\n } else if (raw.startsWith(\"-\")) {\n cur.lines.push({\n type: \"del\",\n oldNo: oldNo++,\n newNo: null,\n text: raw.slice(1),\n });\n cur.oldLines += 1;\n deletions += 1;\n } else {\n cur.lines.push({\n type: \"context\",\n oldNo: oldNo++,\n newNo: newNo++,\n text: raw.replace(/^ /, \"\"),\n });\n cur.oldLines += 1;\n cur.newLines += 1;\n }\n }\n }\n // An update with content but no recognizable hunk anchor is malformed V4A;\n // the caller falls back to the raw-patch view instead of a structured diff.\n if (op.type === \"update_file\" && !sawHunkAnchor && lines.some((l) => l.trim().length > 0)) {\n throw new Error(\"malformed V4A: no @@ hunk anchor\");\n }\n }\n\n return {\n path,\n oldPath,\n status,\n isBinary: false,\n isImage: false,\n additions,\n deletions,\n hunks,\n truncated: false,\n };\n}\n\nconst BEGIN_PATCH = \"*** Begin Patch\";\nconst END_PATCH = \"*** End Patch\";\nconst ADD_FILE = \"*** Add File: \";\nconst DELETE_FILE = \"*** Delete File: \";\nconst UPDATE_FILE = \"*** Update File: \";\nconst MOVE_TO = \"*** Move to: \";\n\nconst APPLY_PATCH_OP_TYPES = new Set([\"create_file\", \"update_file\", \"delete_file\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/** Freeform / `{ patch }` / command payloads — tolerate leading whitespace. */\nfunction freeformApplyPatchOps(rawPatch: string): ApplyPatchOperation[] {\n return parseFreeformApplyPatch(rawPatch.trimStart());\n}\n\nfunction asApplyPatchOperation(value: unknown): ApplyPatchOperation | null {\n if (!isRecord(value)) return null;\n if (typeof value.type !== \"string\" || !APPLY_PATCH_OP_TYPES.has(value.type)) {\n return null;\n }\n if (typeof value.path !== \"string\" || !value.path) {\n return null;\n }\n const op: ApplyPatchOperation = {\n type: value.type as ApplyPatchOperation[\"type\"],\n path: value.path,\n };\n if (typeof value.diff === \"string\") op.diff = value.diff;\n if (typeof value.moveTo === \"string\" && value.moveTo.length > 0) op.moveTo = value.moveTo;\n return op;\n}\n\nfunction parseStructuredOperations(payloads: unknown[]): ApplyPatchOperation[] {\n if (payloads.length === 0) return [];\n const operations: ApplyPatchOperation[] = [];\n for (const payload of payloads) {\n const op = asApplyPatchOperation(payload);\n if (!op) return [];\n operations.push(op);\n }\n return operations;\n}\n\n/**\n * Mirror of `@openai/agents-core` freeform `*** Begin Patch` → ops. Kept here so\n * the timeline can render Codex function-tool apply_patch without importing the\n * server SDK package.\n */\nexport function parseFreeformApplyPatch(rawPatch: string): ApplyPatchOperation[] {\n const lines = rawPatch.split(/\\r?\\n/);\n if (lines.at(-1) === \"\") lines.pop();\n if (lines[0] !== BEGIN_PATCH) return [];\n if (lines.length < 2 || lines.at(-1) !== END_PATCH) return [];\n\n const operations: ApplyPatchOperation[] = [];\n let index = 1;\n while (index < lines.length - 1) {\n const line = lines[index]!;\n let parsed: { operation: ApplyPatchOperation; nextIndex: number } | { error: true } | null =\n null;\n if (line.startsWith(ADD_FILE)) parsed = parseAddFilePatch(lines, index);\n else if (line.startsWith(DELETE_FILE)) parsed = parseDeleteFilePatch(lines, index);\n else if (line.startsWith(UPDATE_FILE)) parsed = parseUpdateFilePatch(lines, index);\n else return [];\n if (!parsed || \"error\" in parsed) return [];\n operations.push(parsed.operation);\n index = parsed.nextIndex;\n }\n // Match the SDK: Begin/End with no file ops is not a valid patch.\n return operations.length > 0 ? operations : [];\n}\n\nfunction parsePatchHeader(line: string, prefix: string): string | null {\n const path = line.slice(prefix.length).trim();\n return path || null;\n}\n\nfunction isFileOperationHeader(line: string): boolean {\n return line.startsWith(ADD_FILE) || line.startsWith(DELETE_FILE) || line.startsWith(UPDATE_FILE);\n}\n\nfunction joinDiff(lines: string[]): string {\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction parseAddFilePatch(\n lines: string[],\n index: number,\n): { operation: ApplyPatchOperation; nextIndex: number } | { error: true } {\n const path = parsePatchHeader(lines[index]!, ADD_FILE);\n if (!path) return { error: true };\n index += 1;\n const diffLines: string[] = [];\n while (index < lines.length - 1 && !isFileOperationHeader(lines[index]!)) {\n const line = lines[index]!;\n if (!line.startsWith(\"+\")) return { error: true };\n diffLines.push(line);\n index += 1;\n }\n if (diffLines.length === 0) return { error: true };\n return {\n operation: { type: \"create_file\", path, diff: joinDiff(diffLines) },\n nextIndex: index,\n };\n}\n\nfunction parseDeleteFilePatch(\n lines: string[],\n index: number,\n): { operation: ApplyPatchOperation; nextIndex: number } | { error: true } {\n const path = parsePatchHeader(lines[index]!, DELETE_FILE);\n if (!path) return { error: true };\n index += 1;\n if (index < lines.length - 1 && !isFileOperationHeader(lines[index]!)) {\n return { error: true };\n }\n return { operation: { type: \"delete_file\", path }, nextIndex: index };\n}\n\nfunction parseUpdateFilePatch(\n lines: string[],\n index: number,\n): { operation: ApplyPatchOperation; nextIndex: number } | { error: true } {\n const path = parsePatchHeader(lines[index]!, UPDATE_FILE);\n if (!path) return { error: true };\n index += 1;\n let moveTo: string | undefined;\n if (index < lines.length - 1 && lines[index]!.startsWith(MOVE_TO)) {\n const parsedMoveTo = parsePatchHeader(lines[index]!, MOVE_TO);\n if (!parsedMoveTo) return { error: true };\n moveTo = parsedMoveTo;\n index += 1;\n }\n const diffLines: string[] = [];\n while (index < lines.length - 1 && !isFileOperationHeader(lines[index]!)) {\n diffLines.push(lines[index]!);\n index += 1;\n }\n if (diffLines.length === 0 && !moveTo) return { error: true };\n return {\n operation: {\n type: \"update_file\",\n path,\n diff: diffLines.length > 0 ? joinDiff(diffLines) : \"\",\n ...(moveTo ? { moveTo } : {}),\n },\n nextIndex: index,\n };\n}\n\n/**\n * Normalize every apply_patch payload the Agents SDK accepts into structured\n * ops — hosted `{ operation }` / `{ operations }`, function-tool `{ patch }`,\n * `command` tuple, flat op, freeform string, or op array.\n */\nexport function applyPatchOps(raw: unknown): ApplyPatchOperation[] {\n if (raw == null) return [];\n if (typeof raw === \"string\") {\n const trimmed = raw.trimStart();\n if (trimmed.startsWith(BEGIN_PATCH)) return freeformApplyPatchOps(trimmed);\n const parsed = tryParseJson(trimmed);\n return parsed === undefined ? [] : applyPatchOps(parsed);\n }\n if (Array.isArray(raw)) return parseStructuredOperations(raw);\n if (!isRecord(raw)) return [];\n\n if (typeof raw.patch === \"string\") return freeformApplyPatchOps(raw.patch);\n if (Array.isArray(raw.command)) {\n const [commandName, patch] = raw.command;\n if (commandName === \"apply_patch\" && typeof patch === \"string\") {\n return freeformApplyPatchOps(patch);\n }\n }\n // Empty `operations: []` is not authoritative — fall through to operation/flat.\n if (Array.isArray(raw.operations) && raw.operations.length > 0) {\n return parseStructuredOperations(raw.operations);\n }\n if (raw.operation !== undefined) {\n const op = asApplyPatchOperation(raw.operation);\n return op ? [op] : [];\n }\n // Flat single op: `{ type, path, diff?, moveTo? }`.\n const flat = asApplyPatchOperation(raw);\n return flat ? [flat] : [];\n}\n\n/** Ops from provider `raw` and/or function-tool arguments (Codex path). */\nexport function applyPatchOpsFromToolItem(item: {\n raw: unknown;\n arguments: unknown;\n}): ApplyPatchOperation[] {\n const fromRaw = applyPatchOps(item.raw);\n if (fromRaw.length > 0) return fromRaw;\n\n // function_call envelopes sometimes keep the payload only under raw.arguments.\n if (isRecord(item.raw)) {\n const nested = item.raw.arguments ?? item.raw.input;\n if (nested !== undefined && nested !== item.arguments) {\n const fromNested = applyPatchOps(nested);\n if (fromNested.length > 0) return fromNested;\n }\n }\n\n if (item.arguments !== undefined && item.arguments !== null) {\n return applyPatchOps(item.arguments);\n }\n return [];\n}\n\n/**\n * True when a tool item is apply_patch — hosted `raw.type === \"apply_patch_call\"`,\n * function-tool `name` `apply_patch` / `apply_patch_call`, or an MCP-prefixed\n * `…__apply_patch` leaf. Centralizes the rawType-or-name check.\n */\nexport function isApplyPatch(item: { name: string; raw: unknown }): boolean {\n const type =\n item.raw && typeof item.raw === \"object\" ? (item.raw as { type?: unknown }).type : undefined;\n if (type === \"apply_patch_call\") {\n return true;\n }\n const name = item.name;\n return name === \"apply_patch_call\" || name === \"apply_patch\" || name.endsWith(\"__apply_patch\");\n}\n\n/** Parse tool arguments that may arrive as a JSON string or an object. */\nexport function parseToolArgs(args: unknown): Record<string, unknown> {\n if (args == null) {\n return {};\n }\n if (typeof args === \"string\") {\n const parsed = tryParseJson(args);\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : {};\n }\n return typeof args === \"object\" ? (args as Record<string, unknown>) : {};\n}\n\n/** The last non-empty line of a string -- the compact \"what happened\" peek. */\nexport function tailPeek(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return \"\";\n }\n const lines = trimmed.split(\"\\n\");\n return lines[lines.length - 1] ?? \"\";\n}\n\n/**\n * Unwrap an MCP tool result (`{ content: [{ type: \"text\", text }], isError? }`)\n * into a flat `{ text, isError }`. Non-MCP outputs pass through as their string\n * form.\n */\nexport function unwrapMcpOutput(output: unknown): {\n text: string;\n isError: boolean;\n} {\n const normalized = normalizeMcpOutput(output);\n return { text: normalized.text, isError: normalized.isError };\n}\n\n/* --- computer-use screenshot extraction ------------------------------------- */\n\n/**\n * Extract a renderable `data:` URL from a computer-use screenshot output,\n * whatever transport produced it. The hosted `computer_call` and the\n * function-text mode persist a plain `data:image/...` string; the\n * function-image mode (codex-backed sessions) persists the STRUCTURED image\n * output — `{type:\"image\", image:{data, mediaType}}` with `data` arriving as a\n * number array / index map / Buffer-JSON / base64 string after event\n * serialization — or the agents-core normalized `input_image` content item.\n * Returns null when the output carries no image (so callers fall back to their\n * text/empty presentation).\n */\nexport function screenshotDataUrl(out: unknown): string | null {\n if (typeof out === \"string\") {\n if (out.startsWith(\"data:image\")) {\n return out;\n }\n // A JSON-encoded structured output (some transports stringify tool results).\n if (out.startsWith(\"{\") || out.startsWith(\"[\")) {\n const parsed = tryParseJson(out);\n if (parsed !== undefined && parsed !== out) {\n return screenshotDataUrl(parsed);\n }\n }\n return null;\n }\n if (Array.isArray(out)) {\n for (const entry of out) {\n const url = screenshotDataUrl(entry);\n if (url) {\n return url;\n }\n }\n return null;\n }\n if (out === null || typeof out !== \"object\") {\n return null;\n }\n const record = out as Record<string, unknown>;\n // agents-core normalized content item: {type:\"input_image\", image_url: \"data:…\" | {url}}\n const imageUrl = record.image_url ?? record.imageUrl;\n if (typeof imageUrl === \"string\" && imageUrl.startsWith(\"data:image\")) {\n return imageUrl;\n }\n if (imageUrl && typeof imageUrl === \"object\") {\n const url = (imageUrl as Record<string, unknown>).url;\n if (typeof url === \"string\" && url.startsWith(\"data:image\")) {\n return url;\n }\n }\n // Structured tool output: {type:\"image\", image:{data, mediaType}}\n const image = record.image as Record<string, unknown> | undefined;\n if (image && typeof image === \"object\") {\n const mediaType = typeof image.mediaType === \"string\" ? image.mediaType : \"image/png\";\n const base64 = bytesToBase64(image.data);\n if (base64) {\n return `data:${mediaType};base64,${base64}`;\n }\n if (typeof image.data === \"string\" && image.data.length > 0) {\n // Already base64 text.\n return `data:${mediaType};base64,${image.data}`;\n }\n }\n return null;\n}\n\n/** Parse the closed retained-screenshot receipt carried by new tool events. */\nexport function retainedScreenshotMetadata(out: unknown): RetainedArtifactMetadata | null {\n if (typeof out === \"string\" && (out.startsWith(\"{\") || out.startsWith(\"[\"))) {\n const parsed = tryParseJson(out);\n if (parsed !== undefined && parsed !== out) return retainedScreenshotMetadata(parsed);\n }\n if (Array.isArray(out)) {\n for (const entry of out) {\n const metadata = retainedScreenshotMetadata(entry);\n if (metadata) return metadata;\n }\n return null;\n }\n if (!out || typeof out !== \"object\") return null;\n const value = out as Record<string, unknown>;\n if (typeof value.artifactId !== \"string\" || typeof value.available !== \"boolean\") return null;\n if (!value.available) {\n return typeof value.reason === \"string\" ? (value as unknown as RetainedArtifactMetadata) : null;\n }\n return (value.kind === \"computer_screenshot\" || value.kind === \"browser_screenshot\") &&\n [\"image/png\", \"image/jpeg\", \"image/webp\"].includes(String(value.contentType)) &&\n typeof value.originalBytes === \"number\" &&\n typeof value.sha256 === \"string\" &&\n value.dimensions !== null &&\n typeof value.dimensions === \"object\" &&\n value.retention !== null &&\n typeof value.retention === \"object\" &&\n (value.retention as Record<string, unknown>).policy === \"session_screenshot\"\n ? (value as unknown as RetainedArtifactMetadata)\n : null;\n}\n\n/** Parse the closed permanent generated-image receipt from native/function tools. */\nexport function generatedImageReceipt(out: unknown): GeneratedImageReceipt | null {\n return parseGeneratedImageReceipt(out);\n}\n\nexport type TimelineMediaPreview = {\n type: \"media_preview\";\n mediaType: string;\n inlineBytes: number | null;\n fullOutputAvailable: false;\n preview: string;\n};\n\n/** Find the explicit non-retained inline-media fact in a tool output. */\nexport function mediaPreviewFact(out: unknown): TimelineMediaPreview | null {\n if (typeof out === \"string\" && (out.startsWith(\"{\") || out.startsWith(\"[\"))) {\n const parsed = tryParseJson(out);\n if (parsed !== undefined && parsed !== out) return mediaPreviewFact(parsed);\n }\n if (Array.isArray(out)) {\n for (const entry of out) {\n const preview = mediaPreviewFact(entry);\n if (preview) return preview;\n }\n return null;\n }\n if (!out || typeof out !== \"object\") return null;\n const record = out as Record<string, unknown>;\n if (\n record.type !== \"media_preview\" ||\n typeof record.mediaType !== \"string\" ||\n record.fullOutputAvailable !== false ||\n typeof record.preview !== \"string\" ||\n (record.inlineBytes !== null && typeof record.inlineBytes !== \"number\")\n ) {\n return null;\n }\n return record as TimelineMediaPreview;\n}\n\n/** Serialize whatever a Uint8Array became in JSON (number[], {\"0\":n,…} index\n * map, or Buffer-JSON {type:\"Buffer\",data:[…]}) back into base64. */\nfunction bytesToBase64(data: unknown): string | null {\n const isByte = (n: unknown): n is number =>\n typeof n === \"number\" && Number.isInteger(n) && n >= 0 && n <= 255;\n let bytes: number[] | null = null;\n if (Array.isArray(data) && data.every(isByte)) {\n bytes = data;\n } else if (data && typeof data === \"object\") {\n const record = data as Record<string, unknown>;\n if (record.type === \"Buffer\" && Array.isArray(record.data) && record.data.every(isByte)) {\n bytes = record.data;\n } else {\n const keys = Object.keys(record);\n if (keys.length > 0 && keys.every((key) => /^\\d+$/.test(key))) {\n const values = keys.sort((a, b) => Number(a) - Number(b)).map((key) => record[key]);\n if (values.every(isByte)) {\n bytes = values;\n }\n }\n }\n }\n if (!bytes || bytes.length === 0) {\n return null;\n }\n try {\n let binary = \"\";\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n binary += String.fromCharCode(...bytes.slice(i, i + CHUNK));\n }\n return typeof btoa === \"function\"\n ? btoa(binary)\n : Buffer.from(binary, \"binary\").toString(\"base64\");\n } catch {\n // A hostile/absurd payload must degrade to \"no image\", never crash a render.\n return null;\n }\n}\n","import type { RetainedArtifactReference, VideoArtifactPlaybackSource } from \"@opengeni/sdk\";\nimport type { ComponentType } from \"react\";\nimport { mcpToolLeaf } from \"./tool-display-name\";\nimport type { ToolCallItem } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Tool renderer registry\n\n The extension point. A `ToolRenderer` is a React component fed one projected\n `ToolCallItem`; the registry resolves which renderer handles a given call,\n keyed on the tool `name` and (secondarily) its provider-native `raw.type`.\n\n Resolution order (most → least specific):\n 1. exact match on `raw.type` (e.g. \"apply_patch_call\", \"computer_call\")\n 2. exact match on the tool `name` (e.g. \"exec_command\", \"web_search_call\")\n 3. allowed leaf match after MCP `__` prefix (e.g. opengeni__environment_set_variable)\n 4. the registry's generic fallback\n\n A consumer extends the defaults without forking by passing overrides to\n `createToolRegistry` — e.g. a custom renderer for their own MCP tool, or a\n replacement for a built-in one. The registry is immutable and fully typed.\n -------------------------------------------------------------------------- */\n\nexport type ToolRendererProps = {\n item: ToolCallItem;\n loadRetainedScreenshot?: RetainedScreenshotLoader | undefined;\n loadRetainedArtifact?: RetainedArtifactLoader | undefined;\n};\n\nexport type RetainedScreenshotLoader = (\n artifact: RetainedArtifactReference,\n signal: AbortSignal,\n) => Promise<Uint8Array | null>;\n\nexport type RetainedArtifactLoader = (\n artifact: RetainedArtifactReference,\n signal: AbortSignal,\n options?: RetainedArtifactLoadOptions,\n) => Promise<Uint8Array | { url: string; expiresAt?: string | undefined } | null>;\n\nexport type RetainedArtifactLoadOptions = {\n /**\n * Ask for a short-lived download URL instead of bytes, for example to build a\n * copyable `curl … | git apply` command. A loader that cannot mint one may\n * still return bytes; callers must handle that.\n */\n prefer?: \"url\" | undefined;\n};\n\n/** Mint an expiring source for native browser playback without loading video bytes in JS. */\nexport type VideoArtifactPlaybackLoader = (\n artifactId: string,\n signal: AbortSignal,\n) => Promise<VideoArtifactPlaybackSource>;\n\nexport type ToolRenderer = ComponentType<ToolRendererProps>;\n\n/** A registry entry: which key it matches and the component that renders it. */\nexport type ToolRegistryEntry =\n | { match: \"rawType\"; type: string; render: ToolRenderer }\n | {\n match: \"name\";\n name: string;\n render: ToolRenderer;\n /** Disable untrusted `<server>__${name}` leaf matching for identity-sensitive renderers. */\n matchPrefixedLeaf?: boolean | undefined;\n };\n\nexport type ToolRegistry = {\n /** Resolve the renderer for a call (never null — falls back to generic). */\n resolve: (item: ToolCallItem) => ToolRenderer;\n /** The generic fallback renderer. */\n fallback: ToolRenderer;\n};\n\nexport type CreateToolRegistryOptions = {\n /**\n * Entries that take precedence over the built-ins. Earlier entries win, so a\n * consumer can shadow a default renderer for the same key.\n */\n entries?: ToolRegistryEntry[] | undefined;\n /** Replace the generic fallback used for unmatched tools. */\n fallback?: ToolRenderer | undefined;\n};\n\n/** The `raw.type` of a projected tool call, when the provider item carries one. */\nexport function rawTypeOf(item: ToolCallItem): string | null {\n const raw = item.raw;\n if (raw && typeof raw === \"object\" && typeof (raw as { type?: unknown }).type === \"string\") {\n return (raw as { type: string }).type;\n }\n return null;\n}\n\n/**\n * Build a tool registry from a set of entries and a fallback. The returned\n * registry resolves in priority order: `raw.type` entries first, then `name`\n * entries, then the fallback. Consumer `entries` are consulted before the\n * built-in `baseEntries`, so they shadow defaults cleanly.\n */\nexport function createToolRegistry(\n baseEntries: ToolRegistryEntry[],\n baseFallback: ToolRenderer,\n options: CreateToolRegistryOptions = {},\n): ToolRegistry {\n const entries = [...(options.entries ?? []), ...baseEntries];\n const fallback = options.fallback ?? baseFallback;\n\n const byRawType = new Map<string, ToolRenderer>();\n const byName = new Map<string, ToolRenderer>();\n const byPrefixedLeaf = new Map<string, ToolRenderer>();\n for (const entry of entries) {\n if (entry.match === \"rawType\") {\n if (!byRawType.has(entry.type)) {\n byRawType.set(entry.type, entry.render);\n }\n } else if (!byName.has(entry.name)) {\n byName.set(entry.name, entry.render);\n }\n if (entry.match === \"name\" && entry.matchPrefixedLeaf !== false) {\n if (!byPrefixedLeaf.has(entry.name)) {\n byPrefixedLeaf.set(entry.name, entry.render);\n }\n }\n }\n\n const resolve = (item: ToolCallItem): ToolRenderer => {\n const rawType = rawTypeOf(item);\n if (rawType) {\n const byType = byRawType.get(rawType);\n if (byType) {\n return byType;\n }\n }\n const exact = byName.get(item.name);\n if (exact) {\n return exact;\n }\n const leaf = mcpToolLeaf(item.name);\n if (leaf !== item.name) {\n const byLeaf = byPrefixedLeaf.get(leaf);\n if (byLeaf) {\n return byLeaf;\n }\n }\n return fallback;\n };\n\n return { resolve, fallback };\n}\n","// Pure turn-summary model shared by the web and native renderers: facet definitions,\n// the summary context, status types and duration formatting. No DOM, no styling.\nimport type { ReactNode } from \"react\";\nimport {\n applyPatchOpsFromToolItem,\n isApplyPatch,\n mediaPreviewFact,\n retainedScreenshotMetadata,\n screenshotDataUrl,\n} from \"./parsers\";\nimport { rawTypeOf } from \"./registry\";\nimport { mcpToolLeaf } from \"./tool-display-name\";\nimport type { ActivityItem, ToolCallItem, TurnOutcome } from \"./types\";\n\nexport const BUILT_IN_TURN_SUMMARY_FACET_IDS = [\n \"steps\",\n \"files\",\n \"commands\",\n \"screenshots\",\n \"memories\",\n \"compacted\",\n \"duration\",\n] as const;\n\nexport type BuiltInTurnSummaryFacetId = (typeof BUILT_IN_TURN_SUMMARY_FACET_IDS)[number];\n\nexport type TurnSummaryContext = Readonly<{\n /** Every normalized activity item folded into this summary. */\n items: readonly ActivityItem[];\n /** Tool calls from `items`, retained in timeline order for convenient aggregation. */\n toolCalls: readonly ToolCallItem[];\n /** The settled turn verdict, or absent for a neutral/incomplete cluster. */\n outcome: TurnOutcome | undefined;\n /** The bounded failure reason rendered by the enclosing summary, when present. */\n failureText: string | undefined;\n /** Total turn duration when the enclosing group has both valid timestamps. */\n durationMs: number | undefined;\n /** False when any projected activity is still running or streaming. */\n settled: boolean;\n /**\n * Adjacent compaction landmarks next to this fold. Landmark remains the\n * primary UI; this is a secondary chip signal only.\n */\n contextCompactionCount: number;\n}>;\n\nexport type TurnSummaryFacetResult = Readonly<{\n icon?: ReactNode;\n content: ReactNode;\n ariaLabel?: string;\n title?: string;\n}>;\n\nexport type TurnSummaryFacet = Readonly<{\n /** Stable identity used for removal and deterministic de-duplication. */\n id: string;\n /** Return null when this facet has nothing useful to show. */\n summarize(context: TurnSummaryContext): TurnSummaryFacetResult | null;\n}>;\n\ntype ModifyTurnSummaryFacets = Readonly<{\n /** Appended after the remaining built-ins, in supplied order. */\n add?: readonly TurnSummaryFacet[];\n /** Built-ins to omit before custom facets are appended. */\n remove?: readonly BuiltInTurnSummaryFacetId[];\n replace?: never;\n}>;\n\ntype ReplaceTurnSummaryFacets = Readonly<{\n /** The complete ordered facet list. Mutually exclusive with add/remove. */\n replace: readonly TurnSummaryFacet[];\n add?: never;\n remove?: never;\n}>;\n\nexport type TurnSummaryFacetConfiguration = ModifyTurnSummaryFacets | ReplaceTurnSummaryFacets;\n\nexport type TurnSummaryOptions = Readonly<{\n /**\n * Readable per-turn presentation. Assistant progress stays fully formatted;\n * each turn has its own Working / Worked row and rolling latest step.\n * Ordinary tip-follow and manual scrolling are unchanged.\n */\n rolling?: boolean;\n facets?: TurnSummaryFacetConfiguration;\n}>;\n\n/**\n * Exchange status shown in place of the plain facet line. `working` and\n * `waiting` run a live clock from `since`; `worked` shows the settled span.\n */\nexport type TurnSummaryStatus = Readonly<{\n kind: \"working\" | \"waiting\" | \"worked\";\n /** Replaces the default \"Working\" / \"Waiting\" wording. */\n label?: string | undefined;\n /** Live clock start for `working` and `waiting`. */\n since?: string | undefined;\n /** Settled span for `worked`. */\n durationMs?: number | undefined;\n /** Live step preview under the row while it is collapsed. */\n preview?: ReactNode;\n}>;\n\n/** Elapsed wall time with seconds below an hour: \"14s\", \"2m 14s\", \"1h 05m\". */\nexport function formatElapsed(durationMs: number): string {\n const totalSeconds = Math.max(0, Math.floor(durationMs / 1000));\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const totalMinutes = Math.floor(totalSeconds / 60);\n if (totalMinutes < 60) {\n const seconds = totalSeconds % 60;\n return seconds ? `${totalMinutes}m ${seconds}s` : `${totalMinutes}m`;\n }\n const hours = Math.floor(totalMinutes / 60);\n return `${hours}h ${String(totalMinutes % 60).padStart(2, \"0\")}m`;\n}\n\nexport function createTurnSummaryContext(\n items: ActivityItem[],\n outcome: TurnOutcome | undefined,\n failureText: string | undefined,\n durationMs: number | undefined,\n contextCompactionCount: number,\n): TurnSummaryContext {\n const itemSnapshot = Object.freeze([...items]);\n const toolCalls = Object.freeze(\n itemSnapshot.filter((item): item is ToolCallItem => item.kind === \"tool-call\"),\n );\n const settled = itemSnapshot.every((item) => {\n if (item.kind === \"reasoning\" || item.kind === \"agent-message\") {\n return !item.streaming;\n }\n if (\n item.kind === \"tool-call\" ||\n item.kind === \"worker\" ||\n item.kind === \"sandbox\" ||\n item.kind === \"startup-phase\"\n ) {\n return item.status !== \"running\";\n }\n return true;\n });\n return Object.freeze({\n items: itemSnapshot,\n toolCalls,\n outcome,\n failureText,\n durationMs,\n settled,\n contextCompactionCount: Math.max(0, Math.floor(contextCompactionCount)),\n });\n}\n\nexport const BUILT_IN_TURN_SUMMARY_FACETS: readonly TurnSummaryFacet[] = Object.freeze([\n {\n id: \"steps\",\n summarize: ({ items }) => {\n // Progress notes narrate steps; they are not steps themselves.\n const count = items.filter(\n (item) => item.kind !== \"startup-phase\" && item.kind !== \"agent-message\",\n ).length;\n return count\n ? { content: `${count} ${count === 1 ? \"step\" : \"steps\"}` }\n : items.some((item) => item.kind === \"startup-phase\")\n ? { content: \"Preparation\" }\n : null;\n },\n },\n {\n id: \"files\",\n summarize: ({ toolCalls }) => {\n let files = 0;\n for (const item of toolCalls) {\n if (isApplyPatch(item)) {\n files += applyPatchOpsFromToolItem(item).length;\n }\n }\n return files ? { content: `${files} ${files === 1 ? \"file\" : \"files\"} edited` } : null;\n },\n },\n {\n id: \"commands\",\n summarize: ({ toolCalls }) => {\n const commands = toolCalls.filter((item) => item.name === \"exec_command\").length;\n return commands\n ? { content: `${commands} ${commands === 1 ? \"command\" : \"commands\"}` }\n : null;\n },\n },\n {\n id: \"screenshots\",\n summarize: ({ toolCalls }) => {\n let screenshots = 0;\n for (const item of toolCalls) {\n const leaf = mcpToolLeaf(item.name);\n if (\n (rawTypeOf(item) === \"computer_call\" ||\n item.name === \"computer_call\" ||\n item.name === \"computer_screenshot\" ||\n leaf === \"browser_screenshot\" ||\n leaf === \"browser_observe\" ||\n leaf === \"browser_act\") &&\n (retainedScreenshotMetadata(item.output) !== null ||\n screenshotDataUrl(item.output) !== null ||\n mediaPreviewFact(item.output) !== null)\n ) {\n screenshots += 1;\n }\n }\n return screenshots\n ? {\n content: `${screenshots} ${screenshots === 1 ? \"screenshot\" : \"screenshots\"}`,\n }\n : null;\n },\n },\n {\n id: \"memories\",\n summarize: ({ items }) => {\n let saved = 0;\n let updated = 0;\n for (const item of items) {\n if (item.kind !== \"memory\") {\n continue;\n }\n if (item.variant === \"corrected\") {\n updated += 1;\n } else {\n saved += 1;\n }\n }\n const parts: string[] = [];\n if (saved) {\n parts.push(`${saved} ${saved === 1 ? \"memory\" : \"memories\"} saved`);\n }\n if (updated) {\n parts.push(`${updated} ${updated === 1 ? \"memory\" : \"memories\"} updated`);\n }\n return parts.length > 0 ? { content: parts.join(\" · \") } : null;\n },\n },\n {\n id: \"compacted\",\n summarize: ({ contextCompactionCount }) =>\n contextCompactionCount > 0\n ? {\n content:\n contextCompactionCount === 1 ? \"compacted\" : `${contextCompactionCount} compacts`,\n ariaLabel:\n contextCompactionCount === 1\n ? \"Conversation history compacted\"\n : `${contextCompactionCount} conversation history compactions`,\n }\n : null,\n },\n {\n id: \"duration\",\n summarize: ({ durationMs }) => {\n const duration = formatDurationFacet(durationMs);\n return duration ? { content: duration } : null;\n },\n },\n]);\n\nexport function resolveTurnSummaryFacets(\n configuration: TurnSummaryFacetConfiguration | undefined,\n): readonly TurnSummaryFacet[] {\n const requested: readonly TurnSummaryFacet[] = configuration?.replace ?? [\n ...BUILT_IN_TURN_SUMMARY_FACETS.filter(\n (facet) => !configuration?.remove?.includes(facet.id as BuiltInTurnSummaryFacetId),\n ),\n ...(configuration?.add ?? []),\n ];\n const seen = new Set<string>();\n return requested.filter((facet) => {\n if (!facet.id || seen.has(facet.id)) {\n return false;\n }\n seen.add(facet.id);\n return true;\n });\n}\n\nexport function formatDurationFacet(durationMs: number | undefined): string | null {\n if (durationMs === undefined || !Number.isFinite(durationMs) || durationMs < 1000) {\n return null;\n }\n const totalSeconds = Math.floor(durationMs / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const totalMinutes = Math.floor(totalSeconds / 60);\n if (totalMinutes < 60) {\n return `${totalMinutes}m`;\n }\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n return `${hours}h ${String(minutes).padStart(2, \"0\")}m`;\n}\n\nfunction hasFacetContent(content: ReactNode): boolean {\n return content !== null && content !== undefined && content !== false && content !== \"\";\n}\n\n/**\n * The facets a turn header shows. With a readable status line, duration lives in\n * the status, preparation-only turns drop the step count, and a live or waiting\n * status keeps only the step count among the built-ins. A failing custom facet is\n * skipped rather than breaking the header.\n */\nexport function selectTurnSummaryFacets(\n definitions: readonly TurnSummaryFacet[],\n context: TurnSummaryContext,\n statusKind: TurnSummaryStatus[\"kind\"] | undefined,\n): Array<{ facet: TurnSummaryFacet; result: TurnSummaryFacetResult }> {\n return definitions.flatMap((facet) => {\n if (\n statusKind &&\n (facet.id === \"duration\" ||\n (facet === BUILT_IN_TURN_SUMMARY_FACETS[0] &&\n context.items.every(\n (item) => item.kind === \"startup-phase\" || item.kind === \"agent-message\",\n )) ||\n (statusKind !== \"worked\" &&\n facet.id !== \"steps\" &&\n BUILT_IN_TURN_SUMMARY_FACET_IDS.includes(facet.id as BuiltInTurnSummaryFacetId)))\n ) {\n return [];\n }\n try {\n const result = facet.summarize(context);\n return result && hasFacetContent(result.content) ? [{ facet, result }] : [];\n } catch {\n return [];\n }\n });\n}\n","// Pure presentation decisions for a timeline turn's work, shared by the web and native\n// timelines. Every function here is extracted verbatim from the web MessageTimeline so both\n// renderers decide identically what a turn shows (preparing, working, waiting, worked).\nimport { timelineGroupContainsPresentedImage } from \"./presented-image\";\nimport type { TurnSummaryStatus } from \"./turn-summary-model\";\nimport type { ActivityItem, TimelineGroup, ToolCallItem } from \"./types\";\n\nexport type ActivityGroup = Extract<TimelineGroup, { kind: \"activity\" }>;\nexport type TurnGroup = Extract<TimelineGroup, { kind: \"turn\" }>;\n\nexport function durationBetween(startedAt: string, endedAt: string): number | undefined {\n const started = Date.parse(startedAt);\n const ended = Date.parse(endedAt);\n if (!Number.isFinite(started) || !Number.isFinite(ended) || ended < started) {\n return undefined;\n }\n return ended - started;\n}\n\n/** Compaction landmarks among a fold's groups (secondary summary facet). */\nexport function compactedLandmarkCount(groups: readonly TimelineGroup[]): number {\n return groups.filter(\n (group) =>\n group.kind === \"item\" &&\n group.item.kind === \"context-compaction\" &&\n group.item.phase === \"compacted\",\n ).length;\n}\n\nexport function clusterIsSettled(group: ActivityGroup): boolean {\n return group.items.every((item) => {\n if (item.kind === \"reasoning\" || item.kind === \"agent-message\") {\n return !item.streaming;\n }\n // Memory writes and fleet observations are discrete, already-settled events.\n if (item.kind === \"memory\" || item.kind === \"fleet-decision\") {\n return true;\n }\n return item.status !== \"running\";\n });\n}\n\nexport function flattenActivityItems(groups: readonly TimelineGroup[]): ActivityItem[] {\n const items: ActivityItem[] = [];\n for (const group of groups) {\n if (group.kind === \"activity\") {\n items.push(...flattenActivityItems(group.work?.details ?? []), ...group.items);\n } else if (group.kind === \"turn\") {\n items.push(...flattenActivityItems(group.groups));\n }\n }\n return items;\n}\n\nexport type ReadableWorkOptions = {\n /** Host shows startup phases as ordinary details (web: startup-details context). */\n startupDetails: boolean;\n /** Startup chrome was dismissed by the reader. */\n startupDismissed: boolean;\n};\n\n/**\n * A readable turn whose only work so far is environment preparation renders as one quiet\n * preparation surface instead of a \"Working\" fold.\n */\nexport function isPreparingWork(group: ActivityGroup, options: ReadableWorkOptions): boolean {\n if (!group.work) return false;\n const phases = group.items.filter((item) => item.kind === \"startup-phase\");\n return (\n !options.startupDetails &&\n !options.startupDismissed &&\n !group.work.endedAt &&\n !group.work.waiting &&\n phases.length > 0 &&\n group.items.every(\n (item) => item.kind === \"startup-phase\" || (item.kind === \"reasoning\" && !item.text.trim()),\n ) &&\n !phases.some((item) => item.status === \"failed\" || item.status === \"cancelled\")\n );\n}\n\n/** Status of a readable turn's work row, minus the host-rendered live preview. */\nexport function readableWorkStatus(\n group: ActivityGroup & { work: NonNullable<ActivityGroup[\"work\"]> },\n): Omit<TurnSummaryStatus, \"preview\"> {\n const end = group.work.endedAt;\n return end\n ? { kind: \"worked\", durationMs: durationBetween(group.work.startedAt, end) }\n : group.work.waiting\n ? { kind: \"waiting\", ...group.work.waiting }\n : { kind: \"working\", since: group.work.startedAt };\n}\n\n/** Whether a readable turn's work fold starts expanded. */\nexport function readableWorkDefaultOpen(group: ActivityGroup): true | undefined {\n const phases = group.items.filter((item) => item.kind === \"startup-phase\");\n return timelineGroupContainsPresentedImage(group) ||\n group.outcome === \"failed\" ||\n phases.some((item) => item.status === \"failed\" || item.status === \"cancelled\")\n ? true\n : undefined;\n}\n\n/** Whether the live preview should show (images stay primary output instead). */\nexport function readableWorkShowsPreview(group: ActivityGroup): boolean {\n return !timelineGroupContainsPresentedImage(group);\n}\n\n/**\n * The step a rolling preview shows: steps advance with event order (progress notes and\n * startup phases have their own surfaces). Mirrors the web RollingActivity selection.\n */\nexport function rollingActivityItem(\n items: readonly ActivityItem[],\n previousItem?: ActivityItem,\n mounted = true,\n): { item: ActivityItem; running: boolean; earlierCount: number } | null {\n const work = items.filter(\n (item) => item.kind !== \"startup-phase\" && item.kind !== \"agent-message\",\n );\n const active = work.filter((item) =>\n item.kind === \"reasoning\" ? item.streaming : \"status\" in item && item.status === \"running\",\n );\n const item =\n !mounted && previousItem && previousItem.kind !== \"agent-message\" ? previousItem : work.at(-1);\n if (!item) return null;\n return {\n item,\n running: active.some((entry) => entry.id === item.id),\n earlierCount: Math.max(\n 0,\n work.findIndex((entry) => entry.id === item.id),\n ),\n };\n}\n\nexport function isToolCall(item: ActivityItem): item is ToolCallItem {\n return item.kind === \"tool-call\";\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\nimport { stringifyPayload, tryParseJson } from \"../lib/format\";\nimport {\n applyPatchOpsFromToolItem,\n controlCaret,\n execTruncated,\n isExecSessionLostBanner,\n looksBinary,\n parseExecBannerSessionId,\n parseToolArgs,\n sandboxCommandExitCode,\n stripExecBanner,\n tailPeek,\n unwrapMcpOutput,\n v4aToGitFileDiff,\n type ApplyPatchOperation,\n} from \"./parsers\";\nimport { rawTypeOf } from \"./registry\";\nimport { mcpToolLeaf, toolDisplayName } from \"./tool-display-name\";\nimport type { ToolCallItem } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Tool row presentation model (renderer-neutral)\n\n The collapsed-row decisions every tool renderer makes — icon, tint, title,\n preview, settle chip and what the expanded body holds — expressed as plain\n data so DOM and non-DOM renderers draw the same row from one source of truth.\n Web renderers consume these functions; a change here changes every surface.\n -------------------------------------------------------------------------- */\n\nexport type ToolIconKind =\n | \"terminal\"\n | \"keyboard\"\n | \"file-diff\"\n | \"search\"\n | \"question\"\n | \"target\"\n | \"brain\"\n | \"sessions\"\n | \"server\"\n | \"server-cog\"\n | \"calendar\"\n | \"panels\"\n | \"share\"\n | \"message\"\n | \"git\"\n | \"box\"\n | \"key\"\n | \"file-search\"\n | \"package-search\"\n | \"plug\"\n | \"wrench\";\n\nexport type ToolIconTone = \"accent\" | \"failed\" | \"running\" | \"muted\";\n\nexport type ToolChip = {\n tone: \"ok\" | \"bad\" | \"muted\" | \"interrupted\";\n text: string;\n};\n\n/** The collapsed-row secondary line. `running` previews carry the pulse locus. */\nexport type ToolPreview =\n | { kind: \"text\"; text: string; running?: boolean | undefined }\n | {\n kind: \"path\";\n path: string;\n add?: number | undefined;\n del?: number | undefined;\n }\n | { kind: \"files\"; count: number; add: number; del: number }\n | { kind: \"malformed\"; name: string };\n\nexport type ToolPatchFile = {\n key: string;\n path: string;\n file: GitFileDiff | null;\n diff: string;\n};\n\nexport type WebSearchResult = {\n title: string;\n domain: string;\n snippet: string;\n};\n\n/** What the expanded body holds; renderers draw these with their own primitives. */\nexport type ToolBody =\n | {\n kind: \"term\";\n command: string | null;\n workdir: string | null;\n output: string;\n live?: boolean | undefined;\n failed?: boolean | undefined;\n note?: string | undefined;\n }\n | { kind: \"note\"; text: string; tone?: \"error\" | undefined }\n | {\n kind: \"payloads\";\n /** A short explanation above the payloads. */\n note?: string | undefined;\n blocks: Array<{ label: string; value: unknown; failed?: boolean }>;\n }\n | {\n kind: \"patch\";\n files: ToolPatchFile[];\n /** A single malformed op renders its raw patch without the path caption. */\n bare?: boolean | undefined;\n }\n | { kind: \"web-results\"; results: WebSearchResult[] | null }\n | {\n /** A short labelled listing (disclosed tools, search hits) above payloads. */\n kind: \"listing\";\n note?: string | undefined;\n entries: ToolListingEntry[];\n /** Entries beyond the visible list (\"+N more\"). */\n more?: number | undefined;\n /** Shown instead of the list when it is known to be empty. */\n empty?: string | undefined;\n blocks: Array<{ label: string; value: unknown; failed?: boolean }>;\n };\n\nexport type ToolListingEntry = {\n key: string;\n title: string;\n /** Quiet leading label (the tool's server). */\n eyebrow?: string | null | undefined;\n mono?: boolean | undefined;\n /** Secondary text under the title (a search snippet). */\n snippet?: string | undefined;\n};\n\nexport type PresentedToolKind =\n | \"exec\"\n | \"write_stdin\"\n | \"apply_patch\"\n | \"web_search\"\n | \"ask\"\n | \"run_on\"\n | \"tool_search\"\n | \"docs_search\"\n | \"session_title\"\n | \"generic\";\n\nexport type ToolRowPresentation = {\n tool: PresentedToolKind;\n icon: ToolIconKind;\n iconTone: ToolIconTone;\n title: string;\n titleMono?: boolean | undefined;\n running?: boolean | undefined;\n preview?: ToolPreview | undefined;\n chip?: ToolChip | undefined;\n failed?: boolean | undefined;\n cancelled?: boolean | undefined;\n body: ToolBody;\n};\n\nexport type ToolPresentationContext = {\n /** Host-supplied active compute label (\"on <label> · …\" preview prefix). */\n computeLabel?: string | null | undefined;\n};\n\n/** Prefix a collapsed preview with the host-supplied active compute label. */\nexport function withComputePreview(label: string | null | undefined, preview: string): string {\n if (!label) {\n return preview;\n }\n return `on ${label} · ${preview}`;\n}\n\nexport function truncatePreview(text: string, max: number): string {\n const cleaned = text.replace(/\\s+/g, \" \").trim();\n if (!cleaned) {\n return \"\";\n }\n return cleaned.length > max ? `${cleaned.slice(0, max - 1)}…` : cleaned;\n}\n\nfunction textPreview(text: string, running?: boolean): ToolPreview {\n return running ? { kind: \"text\", text, running: true } : { kind: \"text\", text };\n}\n\n/* ---- exec_command ---------------------------------------------------------- */\n\nexport function execPresentation(\n item: ToolCallItem,\n context: ToolPresentationContext = {},\n): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const cmd = typeof args.cmd === \"string\" ? args.cmd : \"\";\n const workdir = typeof args.workdir === \"string\" ? args.workdir : null;\n const out = item.output;\n const title = `$ ${cmd}`;\n const computeLabel = context.computeLabel ?? null;\n const base = {\n tool: \"exec\" as const,\n icon: \"terminal\" as const,\n title,\n titleMono: true,\n };\n\n // No output event ever arrived: the turn failed before the output insert —\n // most likely a NUL byte in the command output prevented storage.\n if (item.status === \"failed\" && out === undefined) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: \"failed\" },\n preview: textPreview(\n withComputePreview(computeLabel, \"output lost — NUL byte could not be stored\"),\n ),\n body: {\n kind: \"note\",\n tone: \"error\",\n text: \"output contained a NUL byte and could not be stored; the turn failed on this tool's output insert — no output event ever arrived.\",\n },\n };\n }\n\n if (item.status === \"failed\" && (out == null || out === \"\")) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: \"failed\" },\n preview: textPreview(withComputePreview(computeLabel, \"tool call failed\")),\n body: {\n kind: \"note\",\n tone: \"error\",\n text: \"the tool call failed with no output.\",\n },\n };\n }\n\n if (item.status === \"running\") {\n const streamed = typeof out === \"string\" ? stripExecBanner(out) : \"\";\n const runningPreview = streamed ? `${streamed.split(\"\\n\").length} lines` : \"running…\";\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(withComputePreview(computeLabel, runningPreview), true),\n body: {\n kind: \"term\",\n command: null,\n workdir,\n output: streamed,\n live: true,\n },\n };\n }\n\n const text = typeof out === \"string\" ? out : stringifyPayload(out);\n const stripped = stripExecBanner(text);\n const bgSession = parseExecBannerSessionId(text);\n const exitCode = sandboxCommandExitCode(text);\n const binary = looksBinary(stripped);\n\n // Color is spent on the exception only: a clean exit earns no chip.\n let chip: ToolChip | undefined;\n let iconTone: ToolIconTone = \"muted\";\n if (bgSession != null) {\n chip = { tone: \"muted\", text: `session ${bgSession}` };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n iconTone = \"failed\";\n }\n\n const peek = binary ? \"binary output\" : tailPeek(stripped) || \"(no output)\";\n const truncated = execTruncated(text);\n const preview = withComputePreview(computeLabel, truncated ? `⋯ truncated · ${peek}` : peek);\n return {\n ...base,\n iconTone,\n ...(chip ? { chip } : {}),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: textPreview(preview),\n body: {\n kind: \"term\",\n command: null,\n workdir,\n output: binary ? \"(binary output suppressed)\" : stripped,\n failed: item.status === \"failed\" || (exitCode != null && exitCode !== 0),\n ...(bgSession != null\n ? {\n note: `↳ session ${bgSession} — a later write_stdin can target this PTY.`,\n }\n : {}),\n },\n };\n}\n\n/* ---- write_stdin ----------------------------------------------------------- */\n\nexport function writeStdinPresentation(item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const sessionId =\n typeof args.session_id === \"string\" || typeof args.session_id === \"number\"\n ? args.session_id\n : undefined;\n const text = typeof item.output === \"string\" ? item.output : stringifyPayload(item.output);\n const lost = isExecSessionLostBanner(text);\n const keys = controlCaret(typeof args.chars === \"string\" ? args.chars : \"\");\n const exitCode = sandboxCommandExitCode(text);\n const stripped = stripExecBanner(text);\n const title = `session ${sessionId} ← ${keys || \"∅\"}`;\n const base = {\n tool: \"write_stdin\" as const,\n icon: \"keyboard\" as const,\n title,\n titleMono: true,\n };\n\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(\"sending…\", true),\n body: { kind: \"note\", text: `sending input to session ${sessionId}…` },\n };\n }\n\n let chip: ToolChip | undefined;\n if (lost) {\n chip = { tone: \"bad\", text: \"lost\" };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n }\n\n return {\n ...base,\n iconTone: lost ? \"failed\" : \"muted\",\n ...(chip ? { chip } : {}),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: textPreview(lost ? `session ${sessionId} PTY vanished` : tailPeek(stripped) || \"sent\"),\n body: lost\n ? { kind: \"note\", tone: \"error\", text: stripped || text }\n : {\n kind: \"term\",\n command: `write_stdin → session ${sessionId}`,\n workdir: null,\n output: stripped,\n },\n };\n}\n\n/* ---- apply_patch ----------------------------------------------------------- */\n\nexport function patchVerb(op: ApplyPatchOperation | undefined): string {\n if (!op) {\n return \"Edited\";\n }\n return op.type === \"create_file\"\n ? \"Created\"\n : op.type === \"delete_file\"\n ? \"Deleted\"\n : op.moveTo\n ? \"Renamed\"\n : \"Edited\";\n}\n\nexport function pathBasename(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n return parts.length ? parts[parts.length - 1]! : path;\n}\n\nexport function pathDirname(path: string): string {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(0, idx + 1) : \"\";\n}\n\nexport function safeParsePatchOp(op: ApplyPatchOperation): GitFileDiff | null {\n try {\n return v4aToGitFileDiff(op);\n } catch {\n return null;\n }\n}\n\nfunction patchFiles(\n ops: ApplyPatchOperation[],\n parsed?: Array<GitFileDiff | null>,\n): ToolPatchFile[] {\n return ops.map((op, index) => ({\n key: `${op.type}:${op.path}:${index}`,\n path: op.path,\n file: parsed ? (parsed[index] ?? null) : safeParsePatchOp(op),\n diff: op.diff ?? \"\",\n }));\n}\n\n/** Returns null when a settled patch has no op (renderers fall back to generic). */\nexport function applyPatchPresentation(item: ToolCallItem): ToolRowPresentation | null {\n const ops = applyPatchOpsFromToolItem(item);\n const cancelled = item.status === \"cancelled\";\n const firstOp = ops[0];\n const base = { tool: \"apply_patch\" as const, icon: \"file-diff\" as const };\n\n if (item.status === \"running\") {\n // Show the patch structure from the arguments, marked clearly in-progress.\n const fileCount = ops.length;\n const titleVerb = firstOp ? `Applying ${pathBasename(firstOp.path)}` : \"Applying patch\";\n return {\n ...base,\n iconTone: \"running\",\n title: fileCount > 1 ? `Applying ${fileCount} files` : titleVerb,\n running: true,\n preview: textPreview(\n fileCount > 1 ? `${fileCount} files` : firstOp ? firstOp.path : \"applying…\",\n true,\n ),\n body: { kind: \"patch\", files: patchFiles(ops) },\n };\n }\n\n if (item.status === \"failed\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: firstOp ? `${patchVerb(firstOp)} ${pathBasename(firstOp.path)}` : \"apply_patch\",\n chip: { tone: \"bad\", text: \"failed\" },\n preview: textPreview(typeof item.output === \"string\" ? item.output : \"patch failed\"),\n body: {\n kind: \"payloads\",\n blocks: [{ label: \"Error\", value: item.output, failed: true }],\n },\n };\n }\n\n // Multi-file edit: magnitude stays a single muted glyph pair.\n if (ops.length > 1) {\n const parsed = ops.map((op) => safeParsePatchOp(op));\n const goodFiles = parsed.filter((f): f is GitFileDiff => f !== null);\n const add = goodFiles.reduce((n, f) => n + f.additions, 0);\n const del = goodFiles.reduce((n, f) => n + f.deletions, 0);\n return {\n ...base,\n iconTone: \"accent\",\n title: `Edited ${ops.length} files`,\n cancelled,\n preview: { kind: \"files\", count: ops.length, add, del },\n body: { kind: \"patch\", files: patchFiles(ops, parsed) },\n };\n }\n\n if (!firstOp) {\n return null;\n }\n if (firstOp.type === \"delete_file\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: `Deleted ${pathBasename(firstOp.path)}`,\n cancelled,\n preview: { kind: \"path\", path: firstOp.path },\n body: { kind: \"note\", text: \"File deleted — no diff to show.\" },\n };\n }\n\n const file = safeParsePatchOp(firstOp);\n if (!file) {\n return {\n ...base,\n iconTone: \"accent\",\n title: `${patchVerb(firstOp)} ${pathBasename(firstOp.path)}`,\n cancelled,\n preview: { kind: \"malformed\", name: pathBasename(firstOp.path) },\n body: { kind: \"patch\", files: patchFiles([firstOp], [null]), bare: true },\n };\n }\n\n return {\n ...base,\n iconTone: \"accent\",\n title: `${patchVerb(firstOp)} ${pathBasename(file.path)}`,\n cancelled,\n preview: {\n kind: \"path\",\n path: file.path,\n add: file.additions,\n del: file.deletions,\n },\n body: { kind: \"patch\", files: patchFiles([firstOp], [file]) },\n };\n}\n\n/* ---- web search ------------------------------------------------------------ */\n\nexport function webSearchQueryFromArguments(args: unknown): string | null {\n if (typeof args === \"string\") {\n const trimmed = args.trim();\n if (!trimmed) {\n return null;\n }\n try {\n return webSearchQueryFromArguments(JSON.parse(trimmed));\n } catch {\n return trimmed;\n }\n }\n if (!args || typeof args !== \"object\") {\n return null;\n }\n const record = args as Record<string, unknown>;\n if (typeof record.query === \"string\" && record.query.trim().length > 0) {\n return record.query;\n }\n if (Array.isArray(record.queries)) {\n const first = record.queries.find(\n (value): value is string => typeof value === \"string\" && value.trim().length > 0,\n );\n if (first) {\n return first;\n }\n }\n return null;\n}\n\nexport function webSearchPresentation(item: ToolCallItem): ToolRowPresentation {\n const raw = (item.raw ?? {}) as {\n providerData?: {\n action?: {\n type?: string;\n query?: string;\n queries?: string[];\n url?: string;\n pattern?: string;\n };\n };\n };\n const action = raw.providerData?.action ?? {};\n const actionType = action.type ?? \"search\";\n const queries = (action.queries ?? []).filter(\n (value): value is string => typeof value === \"string\" && value.trim().length > 0,\n );\n const searchQuery =\n (typeof action.query === \"string\" && action.query.trim().length > 0 ? action.query : null) ??\n queries[0] ??\n webSearchQueryFromArguments(item.arguments);\n const running = item.status === \"running\";\n const query =\n actionType === \"open_page\"\n ? (action.url ?? \"(page unavailable)\")\n : actionType === \"find_in_page\"\n ? action.pattern && action.url\n ? `\"${action.pattern}\" in ${action.url}`\n : (action.pattern ?? action.url ?? \"(page unavailable)\")\n : // Codex often emits the live card before action.query/queries land.\n (searchQuery ?? (running ? \"…\" : \"(query unavailable)\"));\n const variants = queries.length > 1 ? ` +${queries.length - 1} variants` : \"\";\n const base = { tool: \"web_search\" as const, icon: \"search\" as const };\n\n if (running) {\n return {\n ...base,\n iconTone: \"running\",\n title:\n actionType === \"open_page\"\n ? \"Opening web page\"\n : actionType === \"find_in_page\"\n ? \"Searching within page\"\n : \"Searching the web\",\n running: true,\n preview: textPreview(`${query}${variants}`, true),\n body: {\n kind: \"note\",\n text: \"searching… results fold into the model context (no output event).\",\n },\n };\n }\n\n const rawResults = (item.output as { results?: unknown } | undefined)?.results;\n const results = Array.isArray(rawResults)\n ? (rawResults as unknown[]).filter((r): r is WebSearchResult => !!r && typeof r === \"object\")\n : null;\n return {\n ...base,\n iconTone: \"muted\",\n title:\n actionType === \"open_page\"\n ? \"Opened web page\"\n : actionType === \"find_in_page\"\n ? \"Searched within page\"\n : \"Searched the web\",\n preview: textPreview(`${query}${variants}`),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n body: { kind: \"web-results\", results },\n };\n}\n\n/* ---- MCP-shaped tools: ask, run_on, generic -------------------------------- */\n\nexport function askToolPreview(args: unknown): string | null {\n const record = args && typeof args === \"object\" ? (args as Record<string, unknown>) : null;\n const questions = Array.isArray(record?.questions) ? record.questions : null;\n if (!questions || questions.length === 0) {\n return null;\n }\n const first = questions[0];\n if (!first || typeof first !== \"object\") {\n return null;\n }\n const q = first as Record<string, unknown>;\n const text =\n typeof q.label === \"string\" && q.label.trim()\n ? q.label.trim()\n : typeof q.prompt === \"string\" && q.prompt.trim()\n ? q.prompt.trim()\n : null;\n if (!text) {\n return null;\n }\n const preview = truncatePreview(text, 90);\n return questions.length > 1 ? `${preview} · ${questions.length} questions` : preview;\n}\n\nexport function runOnTargetName(output: unknown): string | null {\n const { text } = unwrapMcpOutput(output);\n const parsed = tryParseJson(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const name = (parsed as { targetName?: unknown }).targetName;\n if (typeof name === \"string\" && name.trim()) {\n return name.trim();\n }\n }\n return null;\n}\n\nexport function runOnOpPreview(args: Record<string, unknown>): string | null {\n const op = args.op;\n if (!op || typeof op !== \"object\" || Array.isArray(op)) {\n return null;\n }\n const record = op as Record<string, unknown>;\n if (record.kind === \"exec\" && typeof record.cmd === \"string\" && record.cmd.trim()) {\n return `$ ${record.cmd.trim()}`;\n }\n if (\n (record.kind === \"read\" || record.kind === \"write\") &&\n typeof record.path === \"string\" &&\n record.path.trim()\n ) {\n return truncatePreview(record.path.trim(), 72);\n }\n return null;\n}\n\nexport function goalToolPreview(name: string, args: unknown): string | null {\n const leaf = mcpToolLeaf(name);\n if (\n leaf !== \"goal_set\" &&\n leaf !== \"goal_update\" &&\n leaf !== \"goal_complete\" &&\n leaf !== \"goal_pause\" &&\n leaf !== \"wait_for_input\"\n ) {\n return null;\n }\n const record = args && typeof args === \"object\" ? (args as Record<string, unknown>) : null;\n if (!record) {\n return null;\n }\n const text =\n typeof record.text === \"string\"\n ? record.text\n : typeof record.evidence === \"string\"\n ? record.evidence\n : typeof record.rationale === \"string\"\n ? record.rationale\n : typeof record.reason === \"string\"\n ? record.reason\n : typeof record.progressNote === \"string\"\n ? record.progressNote\n : null;\n return text ? truncatePreview(text, 90) : null;\n}\n\n/** Explicit first-party leaf/prefix → canonical product icon kind. */\nexport function genericToolIconKind(name: string): ToolIconKind {\n const leaf = mcpToolLeaf(name);\n return leaf === \"request_human_input\"\n ? \"question\"\n : leaf.startsWith(\"goal_\")\n ? \"target\"\n : leaf.startsWith(\"memory_\") ||\n leaf === \"preference_registry_summary\" ||\n leaf === \"preference_registry_get\"\n ? \"brain\"\n : leaf.startsWith(\"session_\") ||\n leaf === \"sessions_list\" ||\n leaf === \"set_session_title\" ||\n leaf === \"set_other_session_title\"\n ? \"sessions\"\n : leaf.startsWith(\"sandbox\") || leaf === \"sandboxes_list\" || leaf === \"run_on\"\n ? \"server\"\n : leaf.startsWith(\"rig_\")\n ? \"server-cog\"\n : leaf.startsWith(\"scheduled_\")\n ? \"calendar\"\n : leaf.startsWith(\"artifacts_\")\n ? \"panels\"\n : leaf.startsWith(\"social_\")\n ? \"share\"\n : leaf.startsWith(\"slack_\")\n ? \"message\"\n : leaf.startsWith(\"github_\")\n ? \"git\"\n : leaf.startsWith(\"variable_\")\n ? \"box\"\n : leaf.startsWith(\"environment_\")\n ? \"key\"\n : leaf.includes(\"document\") ||\n leaf.includes(\"knowledge\") ||\n leaf === \"list_document_bases\"\n ? \"file-search\"\n : leaf === \"tool_search\"\n ? \"package-search\"\n : leaf.startsWith(\"skill_\")\n ? \"plug\"\n : \"wrench\";\n}\n\ntype McpRowOptions = {\n tool: PresentedToolKind;\n icon: ToolIconKind;\n title: string;\n /** Preview while running (falls back to `runningFallback`). */\n runningPreview: string | null;\n runningFallback: string;\n /** Settled preview (null → none); ask/run_on also use it as the error fallback. */\n settledPreview: string | null;\n /** Generic shows \"Done\" when no settled preview exists and skips the error fallback. */\n settledFallback?: string | undefined;\n /** Ask/run_on omit an empty Result block. */\n omitEmptyResult?: boolean | undefined;\n /** Generic shows a goal preview as plain text (no pulse) while running. */\n plainRunningPreview?: boolean | undefined;\n};\n\nfunction mcpRowPresentation(item: ToolCallItem, options: McpRowOptions): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const base = { tool: options.tool, icon: options.icon, title: options.title };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview:\n options.runningPreview != null && options.plainRunningPreview\n ? textPreview(options.runningPreview)\n : textPreview(options.runningPreview ?? options.runningFallback, true),\n body: { kind: \"payloads\", blocks: [{ label: \"Arguments\", value: args }] },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n // Cancelled is not an error, even if the payload carries an isError flag.\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n const errorFallback = options.settledFallback === undefined ? options.settledPreview : null;\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: \"error\" },\n preview: textPreview(truncatePreview(outText, 80) || errorFallback || \"Error\"),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: \"Arguments\", value: args },\n { label: \"Error\", value: outText, failed: true },\n ],\n },\n };\n }\n const settled =\n item.status === \"cancelled\"\n ? null\n : (options.settledPreview ?? options.settledFallback ?? null);\n return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(settled != null ? { preview: textPreview(settled) } : {}),\n body: {\n kind: \"payloads\",\n blocks:\n options.omitEmptyResult && !outText\n ? [{ label: \"Arguments\", value: args }]\n : [\n { label: \"Arguments\", value: args },\n { label: \"Result\", value: outText },\n ],\n },\n };\n}\n\nexport function askPresentation(item: ToolCallItem): ToolRowPresentation {\n const preview = askToolPreview(parseToolArgs(item.arguments));\n return mcpRowPresentation(item, {\n tool: \"ask\",\n icon: \"question\",\n title: \"Ask\",\n runningPreview: preview,\n runningFallback: \"Waiting…\",\n settledPreview: preview,\n omitEmptyResult: true,\n });\n}\n\nexport function runOnPresentation(item: ToolCallItem): ToolRowPresentation {\n const targetName = runOnTargetName(item.output);\n const opPreview = runOnOpPreview(parseToolArgs(item.arguments));\n return mcpRowPresentation(item, {\n tool: \"run_on\",\n icon: \"server\",\n title: targetName ? `Run on ${targetName}` : \"Run on\",\n runningPreview: opPreview,\n runningFallback: \"Running…\",\n settledPreview: opPreview,\n omitEmptyResult: true,\n });\n}\n\n/**\n * Baseline craft for unmatched tools: family icon + title-cased leaf + honest\n * status preview (Running… / Done / error snippet).\n */\nexport function genericToolPresentation(item: ToolCallItem): ToolRowPresentation {\n const goalPreview = goalToolPreview(item.name, parseToolArgs(item.arguments));\n if (item.status !== \"running\") {\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n const base = {\n tool: \"generic\" as const,\n icon: genericToolIconKind(item.name),\n title: toolDisplayName(item.name, item.display),\n };\n const args = parseToolArgs(item.arguments);\n // A permission Block is a decision, not a tool failure: say so plainly instead\n // of the generic \"error occurred, please try again\" wrapper.\n if (isError && BLOCKED_OUTPUT.test(outText)) {\n return {\n ...base,\n iconTone: \"muted\",\n chip: { tone: \"interrupted\", text: \"blocked\" },\n preview: textPreview(\"Blocked by your permission settings\"),\n body: {\n kind: \"payloads\",\n note: \"Your permission settings block this action, so it did not run. You can change this in the integration's tool permissions.\",\n blocks: [{ label: \"Arguments\", value: args }],\n },\n };\n }\n // An interrupted approved action may have run. Never invite a blind retry.\n if (isError && UNCERTAIN_OUTPUT.test(outText)) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: \"outcome unknown\" },\n preview: textPreview(\"It may have run\"),\n body: {\n kind: \"payloads\",\n note: \"This action may have run. Check the result in the connected app before trying again.\",\n blocks: [{ label: \"Arguments\", value: args }],\n },\n };\n }\n }\n return mcpRowPresentation(item, {\n tool: \"generic\",\n icon: genericToolIconKind(item.name),\n title: toolDisplayName(item.name, item.display),\n runningPreview: goalPreview,\n runningFallback: \"Running…\",\n settledPreview: goalPreview,\n settledFallback: \"Done\",\n plainRunningPreview: true,\n });\n}\n\n/** The runtime's exact refusal for a tool whose effective permission is Block. */\nconst BLOCKED_OUTPUT = /Connector action was not executed: blocked\\b/;\n/** The runtime's refusal to guess whether an approved action ran. */\nconst UNCERTAIN_OUTPUT = /Connector action outcome is uncertain\\b/;\n\n/* ---- tool_search (progressive MCP disclosure) ------------------------------ */\n\nexport type DisclosedTool = {\n /** Full wire name (`server__leaf` or bare). */\n name: string;\n /** Server / namespace prefix before `__`, when present. */\n source: string | null;\n /** Leaf tool name after `__`. */\n leaf: string;\n};\n\nexport function splitToolWireName(name: string): DisclosedTool {\n const boundary = name.indexOf(\"__\");\n if (boundary <= 0) {\n return { name, source: null, leaf: name };\n }\n return {\n name,\n source: name.slice(0, boundary),\n leaf: name.slice(boundary + 2),\n };\n}\n\n/** Capability query from live tool_search args (object or JSON string). */\nexport function toolSearchQuery(item: ToolCallItem): string {\n const fromArgs = parseToolArgs(item.arguments);\n if (typeof fromArgs.query === \"string\" && fromArgs.query.trim()) {\n return fromArgs.query.trim();\n }\n const raw = item.raw;\n if (raw && typeof raw === \"object\") {\n const rawArgs = (raw as { arguments?: unknown }).arguments;\n if (typeof rawArgs === \"string\" && rawArgs.trim()) {\n const parsed = tryParseJson(rawArgs);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const query = (parsed as { query?: unknown }).query;\n if (typeof query === \"string\" && query.trim()) {\n return query.trim();\n }\n }\n } else if (rawArgs && typeof rawArgs === \"object\" && !Array.isArray(rawArgs)) {\n const query = (rawArgs as { query?: unknown }).query;\n if (typeof query === \"string\" && query.trim()) {\n return query.trim();\n }\n }\n }\n return \"\";\n}\n\n/**\n * Parse disclosed tools from the runtime event shape.\n * `normalizeSdkEvent` collapses `tool_search_output.tools[]` into text:\n * \"Disclosed tools: a, b\" | \"No matching tools found.\"\n * Also accept a structured `tools` array when a host/enricher preserves it.\n */\nexport function parseDisclosedTools(output: unknown): DisclosedTool[] | null {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const tools = (output as { tools?: unknown }).tools;\n if (Array.isArray(tools)) {\n return tools\n .map((tool) => {\n if (typeof tool === \"string\" && tool.trim()) {\n return splitToolWireName(tool.trim());\n }\n if (\n tool &&\n typeof tool === \"object\" &&\n typeof (tool as { name?: unknown }).name === \"string\"\n ) {\n const name = (tool as { name: string }).name.trim();\n return name ? splitToolWireName(name) : null;\n }\n return null;\n })\n .filter((tool): tool is DisclosedTool => tool != null);\n }\n }\n\n const { text } = unwrapMcpOutput(output);\n const trimmed = text.trim();\n if (!trimmed) {\n return null;\n }\n if (/^no matching tools found\\.?$/i.test(trimmed)) {\n return [];\n }\n const disclosed = trimmed.match(/^disclosed tools:\\s*(.+)$/i);\n if (disclosed?.[1]) {\n return disclosed[1]\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map(splitToolWireName);\n }\n const parsed = tryParseJson(trimmed);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parseDisclosedTools(parsed);\n }\n return null;\n}\n\nexport function toolSearchPreview(\n tools: DisclosedTool[] | null,\n cancelled: boolean,\n): string | undefined {\n if (cancelled) {\n return undefined;\n }\n if (!tools) {\n return \"Done\";\n }\n if (tools.length === 0) {\n return \"No matches\";\n }\n if (tools.length === 1) {\n return tools[0]!.leaf;\n }\n const head = tools[0]!.leaf;\n return `${tools.length} tools · ${truncatePreview(head, 28)}`;\n}\n\nexport function toolSearchPresentation(item: ToolCallItem): ToolRowPresentation {\n const query = toolSearchQuery(item);\n const queryPreview = query ? truncatePreview(query, 64) : \"\";\n const note = query ? `capability query: ${query}` : undefined;\n const args = parseToolArgs(item.arguments);\n const base = { tool: \"tool_search\" as const, icon: \"package-search\" as const };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n title: \"Looking up tools\",\n running: true,\n preview: textPreview(queryPreview || \"Matching capabilities…\", true),\n body: { kind: \"listing\", note, entries: [], blocks: [{ label: \"Arguments\", value: args }] },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: \"Tool lookup failed\",\n failed: true,\n preview: textPreview(truncatePreview(outText, 80) || queryPreview || \"Lookup failed\"),\n body: {\n kind: \"listing\",\n note,\n entries: [],\n blocks: [\n { label: \"Arguments\", value: args },\n { label: \"Error\", value: outText, failed: true },\n ],\n },\n };\n }\n const tools = parseDisclosedTools(item.output);\n const preview = toolSearchPreview(tools, item.status === \"cancelled\");\n return {\n ...base,\n iconTone: \"muted\",\n title: \"Looked up tools\",\n cancelled: item.status === \"cancelled\",\n ...(preview ? { preview: textPreview(preview) } : {}),\n body: {\n kind: \"listing\",\n note,\n entries: (tools ?? []).slice(0, 12).map((tool) => ({\n key: tool.name,\n title: tool.leaf,\n eyebrow: tool.source,\n mono: true,\n })),\n more: tools && tools.length > 12 ? tools.length - 12 : undefined,\n empty:\n tools && tools.length === 0\n ? \"no deferred tools matched this capability query.\"\n : undefined,\n blocks:\n tools == null && outText\n ? [\n { label: \"Arguments\", value: args },\n { label: \"Result\", value: outText },\n ]\n : [{ label: \"Arguments\", value: args }],\n },\n };\n}\n\n/* ---- docs / knowledge search ----------------------------------------------- */\n\nexport type SearchHit = { title: string; snippet: string };\n\nexport function parseSearchHits(outText: string): SearchHit[] | null {\n const parsed = tryParseJson(outText);\n if (parsed == null) {\n return null;\n }\n const list = Array.isArray(parsed)\n ? parsed\n : parsed &&\n typeof parsed === \"object\" &&\n Array.isArray((parsed as { results?: unknown }).results)\n ? (parsed as { results: unknown[] }).results\n : parsed && typeof parsed === \"object\" && Array.isArray((parsed as { hits?: unknown }).hits)\n ? (parsed as { hits: unknown[] }).hits\n : null;\n if (!list) {\n return null;\n }\n return list.map((row) => {\n const r = row && typeof row === \"object\" ? (row as Record<string, unknown>) : {};\n const title =\n (typeof r.title === \"string\" && r.title) ||\n (typeof r.name === \"string\" && r.name) ||\n (typeof r.documentTitle === \"string\" && r.documentTitle) ||\n (typeof r.path === \"string\" && r.path) ||\n (typeof r.id === \"string\" && r.id) ||\n \"Result\";\n const snippet =\n (typeof r.snippet === \"string\" && r.snippet) ||\n (typeof r.text === \"string\" && r.text) ||\n (typeof r.content === \"string\" && r.content) ||\n \"\";\n return { title, snippet: truncatePreview(snippet, 160) };\n });\n}\n\nexport function docsSearchPresentation(item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const query = typeof args.query === \"string\" ? args.query.trim() : \"\";\n const base = {\n tool: \"docs_search\" as const,\n icon: \"file-search\" as const,\n title: query\n ? `Search \\u201c${truncatePreview(query, 48)}\\u201d`\n : toolDisplayName(item.name, item.display),\n };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(\"Searching…\", true),\n body: { kind: \"payloads\", blocks: [{ label: \"Arguments\", value: args }] },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n failed: true,\n preview: textPreview(truncatePreview(outText, 80) || \"Search failed\"),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: \"Arguments\", value: args },\n { label: \"Error\", value: outText, failed: true },\n ],\n },\n };\n }\n const hits = parseSearchHits(outText);\n const preview =\n item.status === \"cancelled\"\n ? undefined\n : hits\n ? hits.length === 0\n ? \"No hits\"\n : `${hits.length} hit${hits.length === 1 ? \"\" : \"s\"}`\n : \"Done\";\n return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(preview ? { preview: textPreview(preview) } : {}),\n body: {\n kind: \"listing\",\n entries: (hits ?? []).slice(0, 8).map((hit) => ({\n key: `${hit.title}\\u0000${hit.snippet}`,\n title: hit.title,\n snippet: hit.snippet || undefined,\n })),\n blocks: [\n { label: \"Arguments\", value: args },\n { label: \"Result\", value: outText },\n ],\n },\n };\n}\n\n/* ---- set_session_title / set_other_session_title --------------------------- */\n\nexport function sessionTitlePresentation(item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const titleArg = typeof args.title === \"string\" ? args.title.trim() : \"\";\n const previewTitle = titleArg ? truncatePreview(titleArg, 72) : \"\";\n const base = {\n tool: \"session_title\" as const,\n icon: \"sessions\" as const,\n title: toolDisplayName(item.name, item.display),\n };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(previewTitle || \"Setting title…\", true),\n body: { kind: \"payloads\", blocks: [{ label: \"Arguments\", value: args }] },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n failed: true,\n preview: textPreview(truncatePreview(outText, 80) || \"Rename failed\"),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: \"Arguments\", value: args },\n { label: \"Error\", value: outText, failed: true },\n ],\n },\n };\n }\n // Prefer the submitted title; fall back to a title field in the tool result.\n let settledTitle = previewTitle;\n if (!settledTitle) {\n const parsed = tryParseJson(outText);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const fromResult = (parsed as { title?: unknown }).title;\n if (typeof fromResult === \"string\" && fromResult.trim()) {\n settledTitle = truncatePreview(fromResult.trim(), 72);\n }\n }\n }\n return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(item.status !== \"cancelled\" && settledTitle ? { preview: textPreview(settledTitle) } : {}),\n body: {\n kind: \"payloads\",\n blocks: outText\n ? [\n { label: \"Arguments\", value: args },\n { label: \"Result\", value: outText },\n ]\n : [{ label: \"Arguments\", value: args }],\n },\n };\n}\n\n/* ---- resolution ------------------------------------------------------------ */\n\nconst PRESENTERS_BY_RAW_TYPE: Record<string, PresentedToolKind> = {\n apply_patch_call: \"apply_patch\",\n // Web renders these with richer media renderers; keep them off name matches.\n computer_call: \"generic\",\n tool_search_call: \"tool_search\",\n};\n\nconst PRESENTERS_BY_NAME: Record<string, PresentedToolKind> = {\n exec_command: \"exec\",\n request_human_input: \"ask\",\n run_on: \"run_on\",\n write_stdin: \"write_stdin\",\n apply_patch_call: \"apply_patch\",\n apply_patch: \"apply_patch\",\n web_search_call: \"web_search\",\n tool_search: \"tool_search\",\n search_documents: \"docs_search\",\n knowledge_search: \"docs_search\",\n set_session_title: \"session_title\",\n set_other_session_title: \"session_title\",\n};\n\n/**\n * Resolve the shared presenter for a call with the web registry's precedence\n * (raw.type, exact name, MCP leaf). Tools whose web renderer is richer than the\n * shared model (computer use, media, knowledge receipts, …) resolve to\n * `generic`; non-DOM renderers may layer their own presenters on top.\n */\nexport function presentedToolKind(item: ToolCallItem): PresentedToolKind {\n const rawType = rawTypeOf(item);\n if (rawType && PRESENTERS_BY_RAW_TYPE[rawType]) {\n return PRESENTERS_BY_RAW_TYPE[rawType];\n }\n const exact = PRESENTERS_BY_NAME[item.name];\n if (exact) {\n return exact;\n }\n const leaf = mcpToolLeaf(item.name);\n if (leaf !== item.name && PRESENTERS_BY_NAME[leaf]) {\n return PRESENTERS_BY_NAME[leaf];\n }\n return \"generic\";\n}\n\nexport function toolRowPresentation(\n item: ToolCallItem,\n context: ToolPresentationContext = {},\n): ToolRowPresentation {\n switch (presentedToolKind(item)) {\n case \"exec\":\n return execPresentation(item, context);\n case \"write_stdin\":\n return writeStdinPresentation(item);\n case \"apply_patch\":\n return applyPatchPresentation(item) ?? genericToolPresentation(item);\n case \"web_search\":\n return webSearchPresentation(item);\n case \"ask\":\n return askPresentation(item);\n case \"run_on\":\n return runOnPresentation(item);\n case \"tool_search\":\n return toolSearchPresentation(item);\n case \"docs_search\":\n return docsSearchPresentation(item);\n case \"session_title\":\n return sessionTitlePresentation(item);\n default:\n return genericToolPresentation(item);\n }\n}\n","/** Decorative loading copy shared by every renderer of the preparing state. */\nexport const GENIE_PREPARING_PHRASES: readonly string[] = [\n \"Polishing the lamp…\",\n \"Consulting the carpet…\",\n \"Untangling wishes…\",\n \"Summoning a little cleverness…\",\n \"Checking the fine print on infinity…\",\n \"Warming up the abracadabra…\",\n \"Rearranging the stars…\",\n \"Negotiating with the lamp…\",\n \"Dusting off a thousand years…\",\n \"Wishful thinking…\",\n \"Decanting a little magic…\",\n \"Finding the good stardust…\",\n \"Fluffing the magic carpet…\",\n \"Putting a wish into motion…\",\n \"A little hocus. A little pocus…\",\n];\nexport const GENIE_WAITING_PHRASES: readonly string[] = [\"Waiting for a response…\"];\n","import type { HumanInputAnswer, HumanInputQuestion } from \"@opengeni/sdk\";\n\n/* Pure drafting and validation rules for structured human-input requests,\n shared by the web HumanInputForm and non-DOM renderers. */\n\nexport type HumanInputAnswerDraft = {\n values: string[];\n other: string;\n otherSelected: boolean;\n};\n\nexport type HumanInputFormMessages = {\n title: string;\n description: string;\n submit: string;\n skip: string;\n submitting: string;\n other: string;\n deadlineLabel: string;\n formatDeadline: (value: string) => string;\n required: string;\n otherRequired: string;\n minSelections: (count: number) => string;\n maxSelections: (count: number) => string;\n optional: string;\n /** Shown when the question list overflows the card and more content is below. */\n moreBelow: string;\n questionCount: (count: number) => string;\n collapse: string;\n expand: string;\n selectionHint: (min: number | null | undefined, max: number | null | undefined) => string | null;\n};\n\nexport const defaultHumanInputFormMessages: HumanInputFormMessages = {\n title: \"Input required\",\n /** Multi-question chrome has no default subtitle; hosts may still override. */\n description: \"\",\n submit: \"Send answers\",\n skip: \"Skip\",\n submitting: \"Submitting…\",\n other: \"Other\",\n deadlineLabel: \"Expires\",\n formatDeadline,\n required: \"This question is required.\",\n otherRequired: \"Enter a value for Other.\",\n minSelections: (count) => `Choose at least ${count} option${count === 1 ? \"\" : \"s\"}.`,\n maxSelections: (count) => `Choose no more than ${count} option${count === 1 ? \"\" : \"s\"}.`,\n optional: \"Optional\",\n moreBelow: \"More below\",\n questionCount: (count) => `${count} questions`,\n collapse: \"Collapse\",\n expand: \"Expand\",\n selectionHint: (min, max) => {\n if (min != null && max != null) return `Choose ${min}–${max}.`;\n if (min != null) return `Choose at least ${min}.`;\n if (max != null) return `Choose up to ${max}.`;\n return null;\n },\n};\n\nexport function answersFromDrafts(\n questions: HumanInputQuestion[],\n drafts: Record<string, HumanInputAnswerDraft>,\n messageOverrides: Partial<HumanInputFormMessages> = {},\n): { answers: HumanInputAnswer[]; errors: Record<string, string> } {\n const messages = { ...defaultHumanInputFormMessages, ...messageOverrides };\n const answers: HumanInputAnswer[] = [];\n const errors: Record<string, string> = {};\n for (const question of questions) {\n const draft = drafts[question.id] ?? emptyDraft();\n const values = question.kind === \"text\" ? draft.values.filter(Boolean) : draft.values;\n const other = draft.otherSelected ? draft.other : \"\";\n const hasOther = Boolean(other.trim());\n const supplied = values.length + (hasOther ? 1 : 0);\n\n // Other-selected-but-empty must win over generic \"required\" — otherwise the\n // user sees the wrong diagnosis next to a clearly selected control.\n if (question.kind !== \"text\" && draft.otherSelected && !hasOther) {\n errors[question.id] = messages.otherRequired;\n continue;\n }\n\n if (question.required && supplied === 0) {\n errors[question.id] = messages.required;\n continue;\n }\n if (question.kind !== \"text\") {\n const min = question.validation?.minSelections;\n const max = question.kind === \"single_select\" ? 1 : question.validation?.maxSelections;\n if (min != null && supplied < min) {\n errors[question.id] = messages.minSelections(min);\n continue;\n }\n if (max != null && supplied > max) {\n errors[question.id] = messages.maxSelections(max);\n continue;\n }\n }\n if (supplied > 0) {\n answers.push({\n questionId: question.id,\n values,\n ...(hasOther ? { other } : {}),\n });\n }\n }\n return { answers, errors };\n}\n\nexport function initialDrafts(\n questions: HumanInputQuestion[],\n): Record<string, HumanInputAnswerDraft> {\n return Object.fromEntries(questions.map((question) => [question.id, emptyDraft()]));\n}\n\nexport function emptyDraft(): HumanInputAnswerDraft {\n return { values: [], other: \"\", otherSelected: false };\n}\n\nexport function formatDeadline(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n const ms = date.getTime() - Date.now();\n if (ms <= 0) return \"deadline passed\";\n const minutes = Math.round(ms / 60_000);\n if (minutes < 1) return \"in under a minute\";\n if (minutes < 60) return `in ${minutes}m`;\n const hours = Math.round(minutes / 60);\n if (hours < 48) return `in ${hours}h`;\n return date.toLocaleString();\n}\n\n/** The form heading: a single question leads with its own label/prompt. */\nexport function humanInputHeading(\n questions: readonly HumanInputQuestion[],\n messages: Pick<HumanInputFormMessages, \"title\" | \"description\">,\n): { title: string; description: string | null } {\n const single = questions.length === 1 ? questions[0]! : null;\n return {\n title: single ? (single.label ?? single.prompt) : messages.title,\n description: single\n ? single.label\n ? single.prompt\n : (single.helpText ?? null)\n : messages.description || null,\n };\n}\n","import type { SessionStatus } from \"@opengeni/sdk\";\n\n/** Status token family (`--og-color-status-<tone>`) for a session status. */\nexport type SessionStatusTone = \"queued\" | \"running\" | \"waiting\" | \"idle\" | \"failed\" | \"cancelled\";\n\n/** Renderer-neutral session status presentation: label, color family and liveness. */\nexport const SESSION_STATUS_PRESENTATION: Record<\n SessionStatus,\n { label: string; tone: SessionStatusTone; pulse: boolean }\n> = {\n queued: { label: \"Queued\", tone: \"queued\", pulse: false },\n running: { label: \"Running\", tone: \"running\", pulse: true },\n recovering: { label: \"Recovering\", tone: \"running\", pulse: true },\n waiting_capacity: { label: \"Waiting for capacity\", tone: \"waiting\", pulse: true },\n idle: { label: \"Idle\", tone: \"idle\", pulse: false },\n requires_action: { label: \"Waiting on you\", tone: \"waiting\", pulse: true },\n failed: { label: \"Failed\", tone: \"failed\", pulse: false },\n cancelled: { label: \"Cancelled\", tone: \"cancelled\", pulse: false },\n};\n\n/**\n * The status badge's color tokens (text, border and its alpha); the fill is the\n * status color at 10%. Mirrors the web badge classes, for non-DOM renderers.\n */\nexport const SESSION_STATUS_BADGE: Record<\n SessionStatus,\n { text: string; border: string; borderAlpha: number; fill: string }\n> = {\n queued: { text: \"fg-muted\", border: \"border\", borderAlpha: 1, fill: \"status-queued\" },\n running: {\n text: \"status-running\",\n border: \"status-running\",\n borderAlpha: 0.3,\n fill: \"status-running\",\n },\n recovering: {\n text: \"status-running\",\n border: \"status-running\",\n borderAlpha: 0.3,\n fill: \"status-running\",\n },\n waiting_capacity: {\n text: \"status-waiting\",\n border: \"status-waiting\",\n borderAlpha: 0.35,\n fill: \"status-waiting\",\n },\n idle: { text: \"status-idle\", border: \"status-idle\", borderAlpha: 0.3, fill: \"status-idle\" },\n requires_action: {\n text: \"status-waiting\",\n border: \"status-waiting\",\n borderAlpha: 0.35,\n fill: \"status-waiting\",\n },\n failed: {\n text: \"status-failed\",\n border: \"status-failed\",\n borderAlpha: 0.35,\n fill: \"status-failed\",\n },\n cancelled: { text: \"fg-subtle\", border: \"border\", borderAlpha: 1, fill: \"status-cancelled\" },\n};\n","import type { NoticeItem } from \"./types\";\n\n/** An approval notice the person has since answered. */\nexport function noticeIsResolvedApproval(item: Pick<NoticeItem, \"text\" | \"resolvedAt\">): boolean {\n return Boolean(item.resolvedAt && item.text.startsWith(\"Approval needed\"));\n}\n\n/** A resolved approval notice reads as history. */\nexport function noticeDisplayText(item: Pick<NoticeItem, \"text\" | \"resolvedAt\">): string {\n return noticeIsResolvedApproval(item) ? \"You responded to this approval.\" : item.text;\n}\n\n/** Notice pill tone: failures stay red, an open wait keeps the waiting hue. */\nexport function noticeTone(\n item: Pick<NoticeItem, \"tone\" | \"resolvedAt\">,\n): \"failed\" | \"waiting\" | \"neutral\" {\n return item.tone === \"failed\"\n ? \"failed\"\n : item.tone === \"waiting\" && !item.resolvedAt\n ? \"waiting\"\n : \"neutral\";\n}\n","/**\n * \"Back to your message\": which prompt the reader is reading the answer to, and\n * whether that prompt has scrolled out of view. Renderer-neutral geometry so\n * the web timeline (DOM rects) and native timelines (layout offsets) agree.\n */\n\n/** How far above the viewport a prompt must be before the pill appears. */\nexport const QUESTION_NAV_HIDDEN_PX = 24;\n/** Breathing room above the question when the reader jumps back to it. */\nexport const QUESTION_NAV_MARGIN_PX = 12;\n\nexport type QuestionNavPrompt = { key: string; top: number; bottom: number };\n\n/**\n * The last prompt before the reading position (the viewport's middle) owns the\n * response in view; it is a target only once it has scrolled fully above the\n * viewport. Prompts are in document order; coordinates share one axis.\n */\nexport function questionNavTarget(\n prompts: readonly QuestionNavPrompt[],\n view: { top: number; height: number },\n): string | null {\n const middle = view.top + view.height / 2;\n const prompt = [...prompts].reverse().find((candidate) => candidate.top <= middle);\n if (!prompt) return null;\n if (prompt.top >= view.top - QUESTION_NAV_HIDDEN_PX || prompt.bottom > view.top) return null;\n return prompt.key;\n}\n"],"mappings":"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","names":["item"]}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import {
|
|
3
|
+
CodeEditor
|
|
4
|
+
} from "./chunk-LSW2OJVV.js";
|
|
2
5
|
import {
|
|
3
6
|
useThemeType
|
|
4
7
|
} from "./chunk-B27E3V37.js";
|
|
5
|
-
import {
|
|
6
|
-
prefersReducedMotion
|
|
7
|
-
} from "./chunk-OYQQJL3J.js";
|
|
8
8
|
import {
|
|
9
9
|
loadPierreDiffs,
|
|
10
10
|
pierreDiffsRevision,
|
|
11
11
|
subscribePierreDiffs
|
|
12
12
|
} from "./chunk-YSRBFJMQ.js";
|
|
13
|
+
import {
|
|
14
|
+
prefersReducedMotion
|
|
15
|
+
} from "./chunk-OYQQJL3J.js";
|
|
13
16
|
import {
|
|
14
17
|
MENU_BUTTON_CLASS,
|
|
15
18
|
MENU_SEPARATOR_CLASS,
|
|
@@ -25,9 +28,6 @@ import {
|
|
|
25
28
|
import {
|
|
26
29
|
useOpenGeni
|
|
27
30
|
} from "./chunk-XTD7TZHW.js";
|
|
28
|
-
import {
|
|
29
|
-
CodeEditor
|
|
30
|
-
} from "./chunk-LSW2OJVV.js";
|
|
31
31
|
import {
|
|
32
32
|
cn
|
|
33
33
|
} from "./chunk-TXS65BB2.js";
|
|
@@ -3122,4 +3122,4 @@ export {
|
|
|
3122
3122
|
PierreFile,
|
|
3123
3123
|
SandboxFiles
|
|
3124
3124
|
};
|
|
3125
|
-
//# sourceMappingURL=chunk-
|
|
3125
|
+
//# sourceMappingURL=chunk-KHF2VRXF.js.map
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
isCreditExhaustion,
|
|
9
9
|
presentFailure,
|
|
10
10
|
tryParseJson
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-ATIRUHBZ.js";
|
|
12
12
|
|
|
13
13
|
// src/timeline/projection.ts
|
|
14
14
|
import {
|
|
@@ -2602,4 +2602,4 @@ export {
|
|
|
2602
2602
|
isTurnExecutionEvidence,
|
|
2603
2603
|
extractSessionRef
|
|
2604
2604
|
};
|
|
2605
|
-
//# sourceMappingURL=chunk-
|
|
2605
|
+
//# sourceMappingURL=chunk-L5OKM2VX.js.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
formatBytes,
|
|
4
|
+
formatRelativeTime
|
|
5
|
+
} from "./chunk-ATIRUHBZ.js";
|
|
6
|
+
|
|
7
|
+
// src/composer-messages.ts
|
|
8
|
+
var defaultChatComposerMessages = {
|
|
9
|
+
messagePlaceholder: "Message the agent\u2026",
|
|
10
|
+
pausedPlaceholder: "Message the agent \u2014 it will wait in the queue\u2026",
|
|
11
|
+
inputLabel: "Message the agent",
|
|
12
|
+
// Shortcuts live in the send button's title; the footer stays quiet unless
|
|
13
|
+
// the host supplies its own hint.
|
|
14
|
+
keyboardHint: "",
|
|
15
|
+
slashCommandBlocked: "That's a slash command \u2014 press Enter in the command list to run it, or edit the line to send a message.",
|
|
16
|
+
controlChangedError: "This workstream was paused while you were sending. Nothing was sent, and your draft is still here.",
|
|
17
|
+
sendFailedError: "Sending failed \u2014 your draft is still here. Try again.",
|
|
18
|
+
dropFiles: "Drop files to attach",
|
|
19
|
+
attachFiles: "Attach files",
|
|
20
|
+
pauseAriaLabel: "Pause this workstream",
|
|
21
|
+
pauseTitle: "Pause this workstream; queued prompts and approvals are preserved",
|
|
22
|
+
stopAriaLabel: "Stop",
|
|
23
|
+
stopTitle: "Stop the response",
|
|
24
|
+
sendMessageAriaLabel: "Send message",
|
|
25
|
+
sendAndResumeAriaLabel: "Add message to queue",
|
|
26
|
+
sendTitle: "Queue message (Enter); steer with Cmd/Ctrl+Enter",
|
|
27
|
+
sendAndResumeTitle: "Add to queue (Enter); steer now with Cmd/Ctrl+Enter",
|
|
28
|
+
annotationNotesRequired: "Add a note to each quote before sending.",
|
|
29
|
+
workspacePaused: "Workspace paused",
|
|
30
|
+
pausedHere: "Paused here",
|
|
31
|
+
parentBlocker: "parent",
|
|
32
|
+
narrowerPause: "a narrower pause",
|
|
33
|
+
pausedBy: (displayName) => `Paused by ${displayName}`,
|
|
34
|
+
queuedAhead: (count) => `${count} waiting prompt${count === 1 ? "" : "s"}; your message joins the queue.`,
|
|
35
|
+
resumingAndSending: "Sending\u2026",
|
|
36
|
+
nextMessageResumes: "Messages wait in the queue until you resume.",
|
|
37
|
+
resumeThisWorkstream: "Resume this workstream",
|
|
38
|
+
resumeShort: "Resume",
|
|
39
|
+
hidePauseDetails: "Hide pause details",
|
|
40
|
+
showPauseDetails: "Show pause details",
|
|
41
|
+
pauseReasonsLabel: "Reasons this workstream is paused",
|
|
42
|
+
pausedByLabel: "Paused by ",
|
|
43
|
+
alsoPausedByLabel: "Also paused by ",
|
|
44
|
+
resumeWorkspace: "Resume workspace",
|
|
45
|
+
resumeFromSession: "Resume from this session",
|
|
46
|
+
sessionCanRun: "This session will be able to run",
|
|
47
|
+
stillPausedBy: (displayName) => `Still paused by ${displayName}`,
|
|
48
|
+
restoredResourcesLabel: "Restored prompt resources",
|
|
49
|
+
restoredFile: (fileId) => `File ${fileId.slice(0, 8)}`,
|
|
50
|
+
removeRestoredResource: (index) => `Remove restored resource ${index + 1}`,
|
|
51
|
+
uploading: "Uploading",
|
|
52
|
+
uploadFailed: "Upload failed",
|
|
53
|
+
previewAttachment: (name) => `Preview ${name}`,
|
|
54
|
+
previewUnavailable: "Preview unavailable",
|
|
55
|
+
attachmentPreviewLabel: "Attachment preview",
|
|
56
|
+
downloadAttachment: (name) => `Download ${name}`,
|
|
57
|
+
closeAttachmentPreview: "Close",
|
|
58
|
+
retryAttachment: (name) => `Retry ${name}`,
|
|
59
|
+
retryUpload: "Retry upload",
|
|
60
|
+
removeAttachment: (name) => `Remove ${name}`,
|
|
61
|
+
confirmCommand: (name) => `Confirm /${name}`,
|
|
62
|
+
confirmDescription: (command) => `Run /${command.name}? ${command.description}`,
|
|
63
|
+
cancel: "Cancel",
|
|
64
|
+
runCommand: (name) => `Run /${name}`,
|
|
65
|
+
commands: "Commands",
|
|
66
|
+
slashCommandsLabel: "Slash commands",
|
|
67
|
+
modelLabel: "Model",
|
|
68
|
+
close: "Close",
|
|
69
|
+
danger: "danger",
|
|
70
|
+
draftConflict: "This draft changed in another tab. Your local draft is still here.",
|
|
71
|
+
useOtherDraft: "Use other draft",
|
|
72
|
+
keepMine: "Keep mine",
|
|
73
|
+
// Kept for embedder message overrides / back-compat. Routine autosave is
|
|
74
|
+
// silent — only draft conflicts surface under the composer.
|
|
75
|
+
savingDraft: "Saving draft\u2026",
|
|
76
|
+
formatBytes,
|
|
77
|
+
formatRelativeTime
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
defaultChatComposerMessages
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=chunk-LHF6BVM4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/composer-messages.ts"],"sourcesContent":["/**\n * The composer's user-facing copy, renderer-free so web and native composers\n * (and hosts translating them) share one message catalog.\n */\nimport type { SlashCommand } from \"./commands/types\";\nimport { formatBytes, formatRelativeTime } from \"./lib/format\";\n\nexport type ChatComposerMessages = {\n messagePlaceholder: string;\n pausedPlaceholder: string;\n inputLabel: string;\n keyboardHint: string;\n slashCommandBlocked: string;\n controlChangedError: string;\n sendFailedError: string;\n dropFiles: string;\n attachFiles: string;\n pauseAriaLabel: string;\n pauseTitle: string;\n /** Stop control shown while a response runs (`runControl=\"stop\"`). */\n stopAriaLabel?: string | undefined;\n stopTitle?: string | undefined;\n sendMessageAriaLabel: string;\n sendAndResumeAriaLabel: string;\n sendTitle: string;\n sendAndResumeTitle: string;\n annotationNotesRequired: string;\n workspacePaused: string;\n pausedHere: string;\n parentBlocker: string;\n narrowerPause: string;\n pausedBy: (displayName: string) => string;\n queuedAhead: (count: number) => string;\n resumingAndSending: string;\n nextMessageResumes: string;\n resumeThisWorkstream: string;\n resumeShort: string;\n hidePauseDetails: string;\n showPauseDetails: string;\n pauseReasonsLabel: string;\n pausedByLabel: string;\n alsoPausedByLabel: string;\n resumeWorkspace: string;\n resumeFromSession: string;\n sessionCanRun: string;\n stillPausedBy: (displayName: string) => string;\n restoredResourcesLabel: string;\n restoredFile: (fileId: string) => string;\n removeRestoredResource: (index: number) => string;\n uploading: string;\n uploadFailed: string;\n previewAttachment: (name: string) => string;\n previewUnavailable?: string | undefined;\n attachmentPreviewLabel: string;\n downloadAttachment: (name: string) => string;\n closeAttachmentPreview: string;\n retryAttachment: (name: string) => string;\n retryUpload: string;\n removeAttachment: (name: string) => string;\n confirmCommand: (name: string) => string;\n confirmDescription: (command: SlashCommand) => string;\n cancel: string;\n runCommand: (name: string) => string;\n commands: string;\n slashCommandsLabel: string;\n modelLabel: string;\n close: string;\n danger: string;\n draftConflict: string;\n useOtherDraft: string;\n keepMine: string;\n savingDraft: string;\n formatBytes: (bytes: number) => string;\n formatRelativeTime: (changedAt: string) => string;\n};\n\nexport const defaultChatComposerMessages: ChatComposerMessages = {\n messagePlaceholder: \"Message the agent…\",\n pausedPlaceholder: \"Message the agent — it will wait in the queue…\",\n inputLabel: \"Message the agent\",\n // Shortcuts live in the send button's title; the footer stays quiet unless\n // the host supplies its own hint.\n keyboardHint: \"\",\n slashCommandBlocked:\n \"That's a slash command — press Enter in the command list to run it, or edit the line to send a message.\",\n controlChangedError:\n \"This workstream was paused while you were sending. Nothing was sent, and your draft is still here.\",\n sendFailedError: \"Sending failed — your draft is still here. Try again.\",\n dropFiles: \"Drop files to attach\",\n attachFiles: \"Attach files\",\n pauseAriaLabel: \"Pause this workstream\",\n pauseTitle: \"Pause this workstream; queued prompts and approvals are preserved\",\n stopAriaLabel: \"Stop\",\n stopTitle: \"Stop the response\",\n sendMessageAriaLabel: \"Send message\",\n sendAndResumeAriaLabel: \"Add message to queue\",\n sendTitle: \"Queue message (Enter); steer with Cmd/Ctrl+Enter\",\n sendAndResumeTitle: \"Add to queue (Enter); steer now with Cmd/Ctrl+Enter\",\n annotationNotesRequired: \"Add a note to each quote before sending.\",\n workspacePaused: \"Workspace paused\",\n pausedHere: \"Paused here\",\n parentBlocker: \"parent\",\n narrowerPause: \"a narrower pause\",\n pausedBy: (displayName) => `Paused by ${displayName}`,\n queuedAhead: (count) =>\n `${count} waiting prompt${count === 1 ? \"\" : \"s\"}; your message joins the queue.`,\n resumingAndSending: \"Sending…\",\n nextMessageResumes: \"Messages wait in the queue until you resume.\",\n resumeThisWorkstream: \"Resume this workstream\",\n resumeShort: \"Resume\",\n hidePauseDetails: \"Hide pause details\",\n showPauseDetails: \"Show pause details\",\n pauseReasonsLabel: \"Reasons this workstream is paused\",\n pausedByLabel: \"Paused by \",\n alsoPausedByLabel: \"Also paused by \",\n resumeWorkspace: \"Resume workspace\",\n resumeFromSession: \"Resume from this session\",\n sessionCanRun: \"This session will be able to run\",\n stillPausedBy: (displayName) => `Still paused by ${displayName}`,\n restoredResourcesLabel: \"Restored prompt resources\",\n restoredFile: (fileId) => `File ${fileId.slice(0, 8)}`,\n removeRestoredResource: (index) => `Remove restored resource ${index + 1}`,\n uploading: \"Uploading\",\n uploadFailed: \"Upload failed\",\n previewAttachment: (name) => `Preview ${name}`,\n previewUnavailable: \"Preview unavailable\",\n attachmentPreviewLabel: \"Attachment preview\",\n downloadAttachment: (name) => `Download ${name}`,\n closeAttachmentPreview: \"Close\",\n retryAttachment: (name) => `Retry ${name}`,\n retryUpload: \"Retry upload\",\n removeAttachment: (name) => `Remove ${name}`,\n confirmCommand: (name) => `Confirm /${name}`,\n confirmDescription: (command) => `Run /${command.name}? ${command.description}`,\n cancel: \"Cancel\",\n runCommand: (name) => `Run /${name}`,\n commands: \"Commands\",\n slashCommandsLabel: \"Slash commands\",\n modelLabel: \"Model\",\n close: \"Close\",\n danger: \"danger\",\n draftConflict: \"This draft changed in another tab. Your local draft is still here.\",\n useOtherDraft: \"Use other draft\",\n keepMine: \"Keep mine\",\n // Kept for embedder message overrides / back-compat. Routine autosave is\n // silent — only draft conflicts surface under the composer.\n savingDraft: \"Saving draft…\",\n formatBytes,\n formatRelativeTime,\n};\n"],"mappings":";;;;;;;AA4EO,IAAM,8BAAoD;AAAA,EAC/D,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,YAAY;AAAA;AAAA;AAAA,EAGZ,cAAc;AAAA,EACd,qBACE;AAAA,EACF,qBACE;AAAA,EACF,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,UAAU,CAAC,gBAAgB,aAAa,WAAW;AAAA,EACnD,aAAa,CAAC,UACZ,GAAG,KAAK,kBAAkB,UAAU,IAAI,KAAK,GAAG;AAAA,EAClD,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,eAAe,CAAC,gBAAgB,mBAAmB,WAAW;AAAA,EAC9D,wBAAwB;AAAA,EACxB,cAAc,CAAC,WAAW,QAAQ,OAAO,MAAM,GAAG,CAAC,CAAC;AAAA,EACpD,wBAAwB,CAAC,UAAU,4BAA4B,QAAQ,CAAC;AAAA,EACxE,WAAW;AAAA,EACX,cAAc;AAAA,EACd,mBAAmB,CAAC,SAAS,WAAW,IAAI;AAAA,EAC5C,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,oBAAoB,CAAC,SAAS,YAAY,IAAI;AAAA,EAC9C,wBAAwB;AAAA,EACxB,iBAAiB,CAAC,SAAS,SAAS,IAAI;AAAA,EACxC,aAAa;AAAA,EACb,kBAAkB,CAAC,SAAS,UAAU,IAAI;AAAA,EAC1C,gBAAgB,CAAC,SAAS,YAAY,IAAI;AAAA,EAC1C,oBAAoB,CAAC,YAAY,QAAQ,QAAQ,IAAI,KAAK,QAAQ,WAAW;AAAA,EAC7E,QAAQ;AAAA,EACR,YAAY,CAAC,SAAS,QAAQ,IAAI;AAAA,EAClC,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,eAAe;AAAA,EACf,UAAU;AAAA;AAAA;AAAA,EAGV,aAAa;AAAA,EACb;AAAA,EACA;AACF;","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/model-mark-paths.ts
|
|
4
|
+
import { modelVendor } from "@opengeni/sdk/model-display";
|
|
5
|
+
var CHATGPT_MARK_PATH = "M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3653-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8414 3.3698-2.02 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.783-2.7622a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z";
|
|
6
|
+
var CLAUDE_MARK_PATH = "m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z";
|
|
7
|
+
var GROK_MARK_PATH = "M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815";
|
|
8
|
+
var MODEL_MARK_PATHS = {
|
|
9
|
+
openai: CHATGPT_MARK_PATH,
|
|
10
|
+
anthropic: CLAUDE_MARK_PATH,
|
|
11
|
+
xai: GROK_MARK_PATH
|
|
12
|
+
};
|
|
13
|
+
function modelMarkVendor(model) {
|
|
14
|
+
const vendor = modelVendor(model);
|
|
15
|
+
return vendor === "openai" || vendor === "anthropic" || vendor === "xai" ? vendor : null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
CHATGPT_MARK_PATH,
|
|
20
|
+
CLAUDE_MARK_PATH,
|
|
21
|
+
GROK_MARK_PATH,
|
|
22
|
+
MODEL_MARK_PATHS,
|
|
23
|
+
modelMarkVendor
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=chunk-N7S72EXK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/model-mark-paths.ts"],"sourcesContent":["// Model maker marks as plain path data (24×24 viewBox, filled with the current\n// color), shared by the web SVG components and native renderers so both draw\n// identical geometry.\nimport { modelVendor, type ModelDisplayInput, type ModelVendor } from \"@opengeni/sdk/model-display\";\n\n/** ChatGPT / OpenAI mark (Simple Icons, CC0). */\nexport const CHATGPT_MARK_PATH =\n \"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3653-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8414 3.3698-2.02 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.783-2.7622a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\";\n\n/** Claude mark (Simple Icons, CC0; https://github.com/simple-icons/simple-icons). */\nexport const CLAUDE_MARK_PATH =\n \"m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z\";\n\n/**\n * MIT License\n *\n * Copyright (c) 2023 LobeHub\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * Source: https://raw.githubusercontent.com/lobehub/lobe-icons/master/src/Grok/components/Mono.tsx\n */\nexport const GROK_MARK_PATH =\n \"M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815\";\n\nexport type MarkedModelVendor = Extract<ModelVendor, \"openai\" | \"anthropic\" | \"xai\">;\n\nexport const MODEL_MARK_PATHS: Record<MarkedModelVendor, string> = {\n openai: CHATGPT_MARK_PATH,\n anthropic: CLAUDE_MARK_PATH,\n xai: GROK_MARK_PATH,\n};\n\n/** The maker whose logo marks this model, or null for the neutral fallback. */\nexport function modelMarkVendor(model: ModelDisplayInput): MarkedModelVendor | null {\n const vendor = modelVendor(model);\n return vendor === \"openai\" || vendor === \"anthropic\" || vendor === \"xai\" ? vendor : null;\n}\n"],"mappings":";;;AAGA,SAAS,mBAA6D;AAG/D,IAAM,oBACX;AAGK,IAAM,mBACX;AA0BK,IAAM,iBACX;AAIK,IAAM,mBAAsD;AAAA,EACjE,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,KAAK;AACP;AAGO,SAAS,gBAAgB,OAAoD;AAClF,QAAM,SAAS,YAAY,KAAK;AAChC,SAAO,WAAW,YAAY,WAAW,eAAe,WAAW,QAAQ,SAAS;AACtF;","names":[]}
|
|
@@ -32,6 +32,23 @@ async function copyTextToClipboard(text) {
|
|
|
32
32
|
return false;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
async function copyPendingTextToClipboard(text) {
|
|
36
|
+
if (typeof ClipboardItem !== "undefined" && typeof navigator !== "undefined" && typeof navigator.clipboard?.write === "function") {
|
|
37
|
+
const blob = text.then((value) => new Blob([value], { type: "text/plain" }));
|
|
38
|
+
blob.catch(() => {
|
|
39
|
+
});
|
|
40
|
+
try {
|
|
41
|
+
await navigator.clipboard.write([new ClipboardItem({ "text/plain": blob })]);
|
|
42
|
+
return true;
|
|
43
|
+
} catch {
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
return await copyTextToClipboard(await text);
|
|
48
|
+
} catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
35
52
|
function tableElementToTsv(table) {
|
|
36
53
|
if (!table) {
|
|
37
54
|
return "";
|
|
@@ -50,6 +67,7 @@ function tableElementToTsv(table) {
|
|
|
50
67
|
|
|
51
68
|
export {
|
|
52
69
|
copyTextToClipboard,
|
|
70
|
+
copyPendingTextToClipboard,
|
|
53
71
|
tableElementToTsv
|
|
54
72
|
};
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
73
|
+
//# sourceMappingURL=chunk-PEHTX3V7.js.map
|