@tutti-os/agent-gui 0.0.211 → 0.0.213
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 +19 -11
- package/dist/{AgentRichTextReadonly-GEGDM5UJ.js → AgentRichTextReadonly-TASIMIK4.js} +5 -5
- package/dist/agent-conversation/index.d.ts +1 -1
- package/dist/agent-conversation/index.js +9 -9
- package/dist/agent-conversation/interactive-answer.d.ts +34 -0
- package/dist/agent-conversation/interactive-answer.js +11 -0
- package/dist/agent-conversation/interactive-answer.js.map +1 -0
- package/dist/agent-env/index.d.ts +1 -8
- package/dist/agent-env/index.js +1 -1
- package/dist/agent-gui.d.ts +21 -48
- package/dist/agent-gui.js +17 -16
- package/dist/agent-message-center/index.js +8 -7
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentFileMentionContracts-B0yQizXB.d.ts → agentFileMentionContracts-BeBex-Sf.d.ts} +5 -0
- package/dist/{agentGuiNodeTypes-DTeerTzS.d.ts → agentGuiNodeTypes-BMcpfKTn.d.ts} +5 -1
- package/dist/app/renderer/agentactivity.css +45 -30
- package/dist/{chunk-7CJEFNHW.js → chunk-2HYADTQP.js} +7 -2
- package/dist/chunk-2HYADTQP.js.map +1 -0
- package/dist/{chunk-4VXUWPPZ.js → chunk-7SSORDQY.js} +18 -32
- package/dist/chunk-7SSORDQY.js.map +1 -0
- package/dist/{chunk-3MMKYY6R.js → chunk-AD2RTSMS.js} +2 -2
- package/dist/{chunk-X2LSVRRX.js → chunk-BYHNJQYH.js} +2 -2
- package/dist/{chunk-SXZJ3MDI.js → chunk-FEUU4YMY.js} +31 -32
- package/dist/chunk-FEUU4YMY.js.map +1 -0
- package/dist/chunk-FMTWYOHM.js +25 -0
- package/dist/chunk-FMTWYOHM.js.map +1 -0
- package/dist/{chunk-CVGUT36H.js → chunk-G2QO6HPB.js} +2 -2
- package/dist/{chunk-PLAOIDNY.js → chunk-ISC67YBJ.js} +171 -36
- package/dist/chunk-ISC67YBJ.js.map +1 -0
- package/dist/{chunk-U5NVLMW2.js → chunk-L4E2Y52A.js} +2 -2
- package/dist/{chunk-Z23HCYYR.js → chunk-LQKLBDBK.js} +3 -3
- package/dist/{chunk-JZ6KUUDY.js → chunk-N4HLBSMJ.js} +2 -32
- package/dist/chunk-N4HLBSMJ.js.map +1 -0
- package/dist/{chunk-Y2VQMPUR.js → chunk-QVLEP54U.js} +4 -56
- package/dist/chunk-QVLEP54U.js.map +1 -0
- package/dist/{chunk-AT4DII34.js → chunk-RLFO3NJV.js} +1692 -2046
- package/dist/chunk-RLFO3NJV.js.map +1 -0
- package/dist/{chunk-KY2IYJXK.js → chunk-XERDRMSF.js} +11 -5
- package/dist/chunk-XERDRMSF.js.map +1 -0
- package/dist/{chunk-HH5EWBH2.js → chunk-YBIT37P5.js} +2 -2
- package/dist/{chunk-P4LVBSFC.js → chunk-ZNHMWCO4.js} +8 -8
- package/dist/context-mention-palette/index.d.ts +1 -1
- package/dist/context-mention-palette/index.js +8 -8
- package/dist/i18n/index.d.ts +3 -55
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +46 -624
- package/dist/index.js +18 -25
- package/dist/index.js.map +1 -1
- package/dist/mention-search.d.ts +2 -2
- package/dist/mention-search.js +6 -6
- package/dist/workbench/contribution.js +3 -3
- package/dist/workbench/index.js +6 -6
- package/dist/workbench/sessionTitle.js +2 -2
- package/package.json +22 -15
- package/dist/app/renderer/assets/commercial/registration-credits-bg.png +0 -0
- package/dist/chunk-4VXUWPPZ.js.map +0 -1
- package/dist/chunk-7CJEFNHW.js.map +0 -1
- package/dist/chunk-AT4DII34.js.map +0 -1
- package/dist/chunk-JZ6KUUDY.js.map +0 -1
- package/dist/chunk-KY2IYJXK.js.map +0 -1
- package/dist/chunk-PLAOIDNY.js.map +0 -1
- package/dist/chunk-SXZJ3MDI.js.map +0 -1
- package/dist/chunk-Y2VQMPUR.js.map +0 -1
- /package/dist/{AgentRichTextReadonly-GEGDM5UJ.js.map → AgentRichTextReadonly-TASIMIK4.js.map} +0 -0
- /package/dist/{chunk-3MMKYY6R.js.map → chunk-AD2RTSMS.js.map} +0 -0
- /package/dist/{chunk-X2LSVRRX.js.map → chunk-BYHNJQYH.js.map} +0 -0
- /package/dist/{chunk-CVGUT36H.js.map → chunk-G2QO6HPB.js.map} +0 -0
- /package/dist/{chunk-U5NVLMW2.js.map → chunk-L4E2Y52A.js.map} +0 -0
- /package/dist/{chunk-Z23HCYYR.js.map → chunk-LQKLBDBK.js.map} +0 -0
- /package/dist/{chunk-HH5EWBH2.js.map → chunk-YBIT37P5.js.map} +0 -0
- /package/dist/{chunk-P4LVBSFC.js.map → chunk-ZNHMWCO4.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/workspaceAgentSystemNoticeSemantics.ts","../shared/workspaceAgentToolCallIdentifiers.ts","../shared/workspaceAgentToolCallLabels.ts","../shared/workspaceAgentToolCallCanonical.ts","../shared/workspaceAgentToolCallAgentActivity.ts","../shared/workspaceAgentToolCallSummary.ts","../shared/workspaceAgentToolCallPresentation.ts","../shared/workspaceAgentToolCallDisplay.ts","../shared/workspaceAgentTimelineProjectionHelpers.ts","../shared/workspaceAgentGoalControlProjection.ts","../shared/workspaceAgentTimelineMessageHelpers.ts","../shared/agentConversation/projection/agentCollaborationProjection.ts","../shared/workspaceAgentTurnErrorProjection.ts","../shared/workspaceAgentTimelineSuppression.ts","../shared/workspaceAgentTimelineCanonical.ts","../shared/workspaceAgentSessionDetailViewModel.ts","../shared/agentConversation/projection/agentMessageFinalTextProjection.ts","../shared/agentConversation/projection/agentToolGroupingProjection.ts","../shared/agentConversation/projection/agentToolRendererKind.ts","../shared/agentConversation/projection/agentTranscriptPresentation.ts","../shared/agentConversation/projection/agentApprovalProjection.ts","../shared/agentConversation/projection/agentInteractiveProjection.ts","../shared/agentConversation/projection/agentTaskProjection.ts","../shared/agentConversation/projection/agentToolProjection.ts","../agent-gui/agentGuiNode/model/agentComposerDraft.ts","../shared/agentConversation/projection/agentConversationUserProjection.ts","../shared/agentConversation/projection/agentTurnSequenceProjection.ts","../shared/agentConversation/projection/chunkBy.ts","../shared/agentConversation/projection/agentTurnRowProjection.ts","../shared/agentConversation/projection/agentProcessingProjection.ts","../shared/agentConversation/rules/agentPatchMetadata.ts","../shared/agentConversation/projection/agentTurnSummaryFileProjection.ts","../shared/agentConversation/projection/agentTurnSummaryProjection.ts","../shared/agentConversation/projection/agentConversationProjection.ts","../agent-gui/agentGuiNode/model/agentConversationCopy.ts","../shared/agentConversation/components/AgentTranscriptSkeleton.tsx","../shared/commerce/AgentCommercePresentationContext.tsx","../shared/agentConversation/components/AgentTranscriptView.tsx","../shared/agentConversation/components/AgentTranscriptItemView.tsx","../shared/agentConversation/actions/agentConversationLinkActions.ts","../shared/agentConversation/components/AgentGeneratedImagePreview.tsx","../shared/agentConversation/components/AgentGeneratedImageRow.tsx","../shared/agentConversation/components/AgentGoalControlRow.tsx","../shared/agentConversation/components/AgentMessageBlock.tsx","../shared/errors/appError.ts","../app/renderer/shell/utils/format.ts","../shared/agentConversation/components/AgentPlanCard.tsx","../shared/agentConversation/components/AgentCollaborationRow.tsx","../shared/agentConversation/components/AgentMessageDetailsDisclosure.tsx","../shared/agentConversation/components/CollapsibleReveal.tsx","../app/renderer/components/ui/button.tsx","../shared/agentConversation/components/AgentVisibleErrorMessage.tsx","../shared/WorkspaceAgentSessionThinkingDisclosure.tsx","../app/renderer/components/icons/BrainIcon.tsx","../shared/toolActivityKindIcons.tsx","../shared/agentConversation/components/RawTimelineJsonDisclosure.tsx","../shared/agentConversation/components/AgentThinkingDisclosure.tsx","../shared/agentConversation/components/useElapsedSeconds.ts","../contexts/workspace/presentation/renderer/components/shared/CanvasNodeGhostIconButton.tsx","../shared/agentConversation/components/AgentMessageImages.tsx","../shared/agentConversation/components/AgentProcessingRow.tsx","../shared/agentConversation/components/AgentToolGroupRow.tsx","../shared/agentConversation/components/AgentAskUserQuestionCard.tsx","../shared/agentConversation/components/AgentToolCallHeader.tsx","../app/renderer/components/icons/FilePenLineIcon.tsx","../app/renderer/components/icons/FileTextIcon.tsx","../app/renderer/components/icons/HammerIcon.tsx","../app/renderer/components/icons/ToolsLinedIcon.tsx","../app/renderer/components/icons/WriteLinedIcon.tsx","../shared/agentConversation/components/tool-renderers/render-data/agentToolFileChangeRenderData.ts","../shared/agentConversation/components/tool-renderers/render-data/agentToolRenderData.ts","../shared/agentConversation/components/tool-renderers/code/AgentCodeBlock.tsx","../shared/agentConversation/components/tool-renderers/AgentPathTailLabel.tsx","../shared/agentConversation/components/tool-renderers/file-diff/AgentMonacoDiffViewer.tsx","../app/renderer/components/icons/AtomIcon.tsx","../shared/agentConversation/components/tool-renderers/file-diff/AgentUnifiedPatchViewer.tsx","../shared/agentConversation/components/tool-renderers/AgentToolScrollArea.tsx","../shared/agentConversation/components/tool-renderers/file-diff/agentUnifiedDiff.ts","../shared/agentConversation/components/tool-renderers/agentToolContentShared.tsx","../shared/agentConversation/components/tool-renderers/AgentReadContent.tsx","../shared/agentConversation/components/tool-renderers/AgentEditContent.tsx","../shared/agentConversation/components/tool-renderers/AgentWebFetchContent.tsx","../shared/agentConversation/components/tool-renderers/AgentWebSearchContent.tsx","../shared/agentConversation/components/tool-renderers/AgentApprovalContent.tsx","../shared/agentConversation/components/tool-renderers/AgentAskUserQuestionContent.tsx","../shared/agentConversation/components/tool-renderers/terminal/AgentTerminalBlock.tsx","../shared/agentConversation/components/tool-renderers/AgentBashContent.tsx","../shared/agentConversation/components/tool-renderers/AgentImageGenerationContent.tsx","../shared/agentConversation/components/tool-renderers/mcp-renderers/agentMcpShared.tsx","../shared/agentConversation/components/tool-renderers/mcp-renderers/agentAtlassianRenderers.tsx","../shared/agentConversation/components/tool-renderers/mcp-renderers/agentContext7Renderers.tsx","../shared/agentConversation/components/tool-renderers/mcp-renderers/agentMcpRendererRegistry.tsx","../shared/agentConversation/components/tool-renderers/AgentMcpToolContent.tsx","../shared/agentConversation/components/tool-renderers/AgentPlanModeContent.tsx","../shared/agentConversation/components/tool-renderers/AgentSearchContent.tsx","../shared/agentConversation/components/tool-renderers/AgentSkillContent.tsx","../shared/agentConversation/components/AgentTaskStepList.tsx","../shared/agentConversation/components/tool-renderers/AgentTaskContent.tsx","../shared/agentConversation/components/tool-renderers/AgentTodoWriteContent.tsx","../shared/agentConversation/components/tool-renderers/AgentToolSearchContent.tsx","../shared/agentConversation/components/tool-renderers/AgentWriteContent.tsx","../shared/agentConversation/components/tool-renderers/AgentExpandedToolContent.tsx","../shared/agentConversation/components/AgentEnterPlanModeCard.tsx","../shared/agentConversation/components/AgentExitPlanModeCard.tsx","../shared/agentConversation/components/AgentTaskCallCard.tsx","../shared/agentConversation/components/AgentSubAgentCards.tsx","../app/renderer/components/icons/AgentLinedIcon.tsx","../shared/agentConversation/components/AgentToolCallCard.tsx","../shared/agentConversation/components/AgentTurnSummaryRow.tsx","../app/renderer/components/icons/DirectLinedIcon.tsx","../shared/agentConversation/rules/agentTurnSummaryPatchDiff.ts","../shared/agentConversation/rules/agentTurnSummaryPatchRuntime.ts","../shared/agentConversation/components/AgentTurnDisclosureContext.tsx","../shared/agentConversation/components/AgentTurnWorkSection.tsx","../shared/agentConversation/components/agentTurnWorkSectionModel.ts","../shared/agentConversation/components/agentTranscriptComplexity.ts","../shared/agentConversation/components/useTurnDisclosureMotion.ts","../shared/agentConversation/components/AgentMessageLocatorRail.tsx","../shared/agentConversation/components/agentTranscriptModel.ts","../shared/agentConversation/components/useAgentTranscriptTurnAttachments.tsx","../shared/agentConversation/components/AgentConversationFlow.tsx","../shared/agentConversation/projection/useProjectedAgentConversation.ts"],"sourcesContent":["import type { AgentActivityMessageSemantics } from \"@tutti-os/agent-activity-core\";\n\ntype NoticeCommand = NonNullable<\n AgentActivityMessageSemantics[\"noticeCommand\"]\n>;\ntype NoticeCommandStatus = NonNullable<\n AgentActivityMessageSemantics[\"noticeCommandStatus\"]\n>;\n\nexport interface WorkspaceAgentNoticeCommandSemantics {\n command: NoticeCommand;\n commandStatus: NoticeCommandStatus;\n}\n\nexport function resolveWorkspaceAgentNoticeCommandSemantics(input: {\n eventId?: string | null;\n messageSemantics?: AgentActivityMessageSemantics;\n payload: Record<string, unknown> | null;\n status?: string | null;\n}): WorkspaceAgentNoticeCommandSemantics | null {\n const semanticCommand = noticeCommand(input.messageSemantics?.noticeCommand);\n const semanticCommandStatus = noticeCommandStatus(\n input.messageSemantics?.noticeCommandStatus\n );\n const payloadCommand = noticeCommand(\n recordString(input.payload, \"noticeCommand\")\n );\n const payloadCommandStatus = noticeCommandStatus(\n recordString(input.payload, \"noticeCommandStatus\")\n );\n const command = semanticCommand ?? payloadCommand;\n const commandStatus = semanticCommandStatus ?? payloadCommandStatus;\n if (command && commandStatus) {\n return { command, commandStatus };\n }\n\n const source = recordString(input.payload, \"source\");\n const hasCompactIdentity =\n source === \"compact\" ||\n /^(?:claude-sdk:compact:|compaction:)/u.test(input.eventId?.trim() ?? \"\");\n if (!hasCompactIdentity) {\n return null;\n }\n const legacyCompactStatus =\n compactTitleStatus(recordString(input.payload, \"title\"), input.status) ??\n (source === \"compact\" ? compactStreamStatus(input.status) : null);\n if (!legacyCompactStatus) {\n return null;\n }\n return {\n command: \"compact\",\n commandStatus: legacyCompactStatus\n };\n}\n\nfunction noticeCommand(value: unknown): NoticeCommand | null {\n switch (value) {\n case \"compact\":\n case \"review\":\n case \"undo\":\n case \"goal\":\n return value;\n default:\n return null;\n }\n}\n\nfunction noticeCommandStatus(value: unknown): NoticeCommandStatus | null {\n switch (value) {\n case \"running\":\n case \"completed\":\n case \"failed\":\n case \"canceled\":\n return value;\n default:\n return null;\n }\n}\n\nfunction compactTitleStatus(\n title: string | null,\n status: string | null | undefined\n): NoticeCommandStatus | null {\n switch (title) {\n case \"Compacting context.\":\n return \"running\";\n case \"Context compacted.\":\n return \"completed\";\n case \"Context compaction interrupted.\":\n return compactStreamStatus(status) === \"canceled\" ? \"canceled\" : \"failed\";\n default:\n return null;\n }\n}\n\nfunction compactStreamStatus(\n status: string | null | undefined\n): NoticeCommandStatus {\n switch (status?.trim().toLowerCase()) {\n case \"completed\":\n case \"complete\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"failed\":\n case \"error\":\n return \"failed\";\n case \"canceled\":\n case \"cancelled\":\n case \"stopped\":\n return \"canceled\";\n default:\n return \"running\";\n }\n}\n\nfunction recordString(\n record: Record<string, unknown> | null,\n key: string\n): string | null {\n const value = record?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\n\nexport function looksLikeOpaqueToolCallIdentifier(value: string): boolean {\n return /^call[_:-](?:function[_:-])?[a-z0-9][a-z0-9_-]{11,}$/i.test(value);\n}\n\nexport function isOpaqueWorkspaceAgentToolCallIdentifier(\n value: string | null | undefined,\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const trimmed = value?.trim();\n if (!trimmed) {\n return false;\n }\n const knownCallId = firstPresentString(\n stringRecordValue(item.payload, \"callId\"),\n stringRecordValue(item.payload, \"callID\"),\n stringRecordValue(item.payload, \"call_id\"),\n item.callId\n );\n if (\n knownCallId &&\n normalizeOpaqueToolCallIdentifier(trimmed) ===\n normalizeOpaqueToolCallIdentifier(knownCallId)\n ) {\n return true;\n }\n return looksLikeOpaqueToolCallIdentifier(trimmed);\n}\n\nfunction normalizeOpaqueToolCallIdentifier(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^call:/, \"call\")\n .replace(/[\\s_-]+/gu, \"\");\n}\n\nfunction firstPresentString(...values: Array<string | undefined>): string {\n for (const value of values) {\n const normalized = value?.trim();\n if (normalized) {\n return normalized;\n }\n }\n return \"\";\n}\n\nfunction stringRecordValue(record: unknown, key: string): string | undefined {\n if (!record || typeof record !== \"object\" || Array.isArray(record)) {\n return undefined;\n }\n const value = (record as Record<string, unknown>)[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n","export type ToolActivityKind = keyof typeof TOOL_ACTIVITY_KIND_TRANSLATION_KEYS;\n\nexport const TOOL_ACTIVITY_KIND_TRANSLATION_KEYS = {\n run_command: \"agentHost.agentTool.labels.runCommand\",\n read_file: \"agentHost.agentTool.labels.readFile\",\n write_file: \"agentHost.agentTool.labels.writeFile\",\n edit_file: \"agentHost.agentTool.labels.editFile\",\n list_files: \"agentHost.agentTool.labels.listFiles\",\n search_files: \"agentHost.agentTool.labels.searchFiles\",\n web_search: \"agentHost.agentTool.labels.webSearch\",\n web_fetch: \"agentHost.agentTool.labels.webFetch\",\n apply_patch: \"agentHost.agentTool.labels.applyPatch\",\n use_tool: \"agentHost.agentTool.labels.useTool\",\n find_files: \"agentHost.agentTool.labels.findFiles\",\n read_command_output: \"agentHost.agentTool.labels.readCommandOutput\",\n stop_command: \"agentHost.agentTool.labels.stopCommand\",\n read_notebook: \"agentHost.agentTool.labels.readNotebook\",\n edit_notebook: \"agentHost.agentTool.labels.editNotebook\",\n update_todos: \"agentHost.agentTool.labels.updateTodos\",\n delegate_agent: \"agentHost.agentTool.labels.delegateAgent\",\n thinking: \"agentHost.agentTool.labels.thinking\",\n responding: \"agentHost.agentTool.labels.responding\",\n notification: \"agentHost.agentTool.labels.notification\"\n} as const;\n\nexport const AGENT_ACTIVITY_KINDS = new Set<ToolActivityKind>([\n \"thinking\",\n \"responding\",\n \"notification\"\n]);\n\nexport const TOOL_NAME_TRANSLATION_KEYS: Record<string, string> = {\n bash: \"agentHost.agentTool.labels.runCommand\",\n read: \"agentHost.agentTool.labels.readFile\",\n write: \"agentHost.agentTool.labels.writeFile\",\n edit: \"agentHost.agentTool.labels.editFile\",\n glob: \"agentHost.agentTool.labels.findFiles\",\n grep: \"agentHost.agentTool.labels.searchFiles\",\n websearch: \"agentHost.agentTool.labels.webSearch\",\n webfetch: \"agentHost.agentTool.labels.webFetch\",\n todowrite: \"agentHost.agentTool.labels.updateTodos\",\n task: \"agentHost.agentTool.labels.delegateAgent\",\n currenttask: \"agentHost.agentTool.labels.currentIssue\",\n agent: \"agentHost.agentTool.labels.delegateAgent\",\n closeagent: \"agentHost.agentTool.labels.closeAgent\",\n wait: \"agentHost.agentTool.labels.waitAgent\"\n};\n\nexport function legacyKindToToolName(kind: ToolActivityKind): string | null {\n switch (kind) {\n case \"run_command\":\n case \"read_command_output\":\n case \"stop_command\":\n return \"Bash\";\n case \"read_file\":\n case \"read_notebook\":\n case \"list_files\":\n return \"Read\";\n case \"write_file\":\n return \"Write\";\n case \"edit_file\":\n case \"edit_notebook\":\n case \"apply_patch\":\n return \"Edit\";\n case \"find_files\":\n return \"Glob\";\n case \"search_files\":\n return \"Grep\";\n case \"web_search\":\n return \"WebSearch\";\n case \"web_fetch\":\n return \"WebFetch\";\n case \"update_todos\":\n return \"TodoWrite\";\n case \"delegate_agent\":\n return \"Task\";\n default:\n return null;\n }\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport { looksLikeOpaqueToolCallIdentifier } from \"./workspaceAgentToolCallIdentifiers\";\nimport {\n legacyKindToToolName,\n TOOL_ACTIVITY_KIND_TRANSLATION_KEYS,\n type ToolActivityKind\n} from \"./workspaceAgentToolCallLabels\";\n\nexport function resolveCanonicalToolName(\n toolName: string | null | undefined\n): string | null {\n const normalized = normalizeToolNameToken(toolName);\n switch (normalized) {\n case \"imagegeneration\":\n case \"imagegen\":\n case \"generateimage\":\n case \"generatingimage\":\n case \"imagegenerate\":\n case \"imagegenerator\":\n return \"ImageGeneration\";\n case \"approval\":\n return \"Approval\";\n case \"askuserquestion\":\n return \"AskUserQuestion\";\n case \"enterplanmode\":\n return \"EnterPlanMode\";\n case \"exitplanmode\":\n return \"ExitPlanMode\";\n case \"toolsearch\":\n return \"ToolSearch\";\n case \"skill\":\n return \"Skill\";\n case \"think\":\n return \"Think\";\n case \"bash\":\n return \"Bash\";\n case \"read\":\n return \"Read\";\n case \"write\":\n return \"Write\";\n case \"edit\":\n return \"Edit\";\n case \"glob\":\n return \"Glob\";\n case \"grep\":\n return \"Grep\";\n case \"websearch\":\n return \"WebSearch\";\n case \"webfetch\":\n return \"WebFetch\";\n case \"todowrite\":\n return \"TodoWrite\";\n case \"task\":\n case \"subagent\":\n case \"runsubagent\":\n case \"delegatetask\":\n case \"delegateagent\":\n return \"Agent\";\n case \"agent\":\n return \"Agent\";\n default:\n // Codex/legacy tool calls (including ones reconstructed by the\n // Codex/Claude Code history import pipeline, which does not run the\n // live daemon's canonicalization step) report the raw snake_case\n // provider tool name verbatim, e.g. \"apply_patch\" for a file edit.\n // Recognize those exactly as the equivalent live-session ToolActivityKind\n // so imported and live tool calls resolve to the same canonical name and\n // render with the same specialized (e.g. diff/file-reference) content.\n return resolveLegacySnakeCaseToolName(toolName);\n }\n}\n\nfunction resolveLegacySnakeCaseToolName(\n toolName: string | null | undefined\n): string | null {\n const trimmed = toolName?.trim() ?? \"\";\n if (!trimmed || !(trimmed in TOOL_ACTIVITY_KIND_TRANSLATION_KEYS)) {\n return null;\n }\n return legacyKindToToolName(trimmed as ToolActivityKind);\n}\n\nexport function resolveLiveCanonicalToolName(\n item: WorkspaceAgentActivityTimelineItem,\n rawPayloadToolName: string | null | undefined,\n legacyACPToolName: string | null\n): string | null | undefined {\n const itemName = (item.name ?? \"\").trim();\n if (\n rawPayloadToolName &&\n looksLikeOpaqueToolCallID(rawPayloadToolName, item)\n ) {\n return null;\n }\n if (\n rawPayloadToolName &&\n isCanonicalMcpToolName(rawPayloadToolName, item.callType, item.payload)\n ) {\n return rawPayloadToolName.trim();\n }\n if (!isLiveCanonicalToolCall(item) || !hasCanonicalACPPayload(item.payload)) {\n return undefined;\n }\n if (rawPayloadToolName) {\n if (\n !shouldFallBackToLegacyACPToolName(\n rawPayloadToolName,\n itemName,\n legacyACPToolName\n )\n ) {\n return rawPayloadToolName.trim();\n }\n return null;\n }\n const normalizedCallType = (\n item.callType ??\n stringPayloadValue(item.payload, \"callType\") ??\n \"\"\n )\n .trim()\n .toLowerCase();\n if (normalizedCallType === \"tool\" || normalizedCallType === \"mcp\") {\n return null;\n }\n return undefined;\n}\n\nfunction shouldFallBackToLegacyACPToolName(\n rawPayloadToolName: string,\n itemName: string,\n legacyACPToolName: string | null\n): boolean {\n const trimmed = rawPayloadToolName.trim();\n if (!trimmed) {\n return false;\n }\n if (looksLikeOpaqueToolCallIdentifier(trimmed)) {\n return true;\n }\n if (legacyACPToolName === null) {\n return false;\n }\n if (trimmed === itemName) {\n return true;\n }\n return looksLikeOpaqueACPFunctionAlias(trimmed);\n}\n\nfunction looksLikeOpaqueACPFunctionAlias(value: string): boolean {\n return /^[A-Z][a-z0-9]{9,}$/.test(value);\n}\n\nfunction looksLikeOpaqueToolCallID(\n value: string,\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const trimmed = value.trim();\n if (!trimmed) {\n return false;\n }\n const payloadCallID =\n stringPayloadValue(item.payload, \"callId\") ??\n stringPayloadValue(item.payload, \"callID\") ??\n stringPayloadValue(item.payload, \"call_id\");\n if (trimmed === item.callId?.trim() || trimmed === payloadCallID?.trim()) {\n return true;\n }\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"call_\")) {\n return isOpaqueIdentifierTail(trimmed.slice(\"call_\".length));\n }\n if (lower.startsWith(\"ws_\")) {\n return isOpaqueIdentifierTail(trimmed.slice(\"ws_\".length));\n }\n return false;\n}\n\nfunction isOpaqueIdentifierTail(value: string): boolean {\n return value.length >= 12 && /^[a-z0-9]+$/i.test(value);\n}\n\nfunction isCanonicalMcpToolName(\n toolName: string,\n callType: string | undefined,\n payload: Record<string, unknown> | undefined\n): boolean {\n const trimmed = toolName.trim();\n if (!trimmed) {\n return false;\n }\n if (trimmed.toLowerCase().startsWith(\"mcp__\")) {\n return true;\n }\n const payloadCallType = stringPayloadValue(payload, \"callType\");\n return (\n (callType ?? \"\").trim().toLowerCase() === \"mcp\" ||\n (payloadCallType ?? \"\").trim().toLowerCase() === \"mcp\"\n );\n}\n\nfunction isLiveCanonicalToolCall(\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const itemType = item.itemType.trim().toLowerCase();\n return (\n itemType === \"call.started\" ||\n itemType === \"call.completed\" ||\n itemType === \"call.errored\"\n );\n}\n\nfunction hasCanonicalACPPayload(\n payload: Record<string, unknown> | undefined\n): boolean {\n return Boolean(\n recordPayloadValue(payload, \"acp\") ||\n stringPayloadValue(payload, \"sessionUpdate\")\n );\n}\n\nfunction normalizeToolNameToken(value: string | null | undefined): string {\n return (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[_\\s-]+/g, \"\");\n}\n\nfunction recordPayloadValue(\n value: Record<string, unknown> | undefined,\n key: string\n): Record<string, unknown> | undefined {\n const nested = value?.[key];\n return nested && typeof nested === \"object\" && !Array.isArray(nested)\n ? (nested as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringPayloadValue(\n value: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const nested = value?.[key];\n return typeof nested === \"string\" ? nested : undefined;\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\n\nconst AGENT_ACTIVITY_KINDS = new Set([\n \"thinking\",\n \"responding\",\n \"notification\"\n]);\n\nexport function isAgentActivityTimelineItem(\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const activityKey = activityPayloadKey(item);\n if (activityKey.startsWith(\"agent.\")) {\n return true;\n }\n\n const metadata = recordValue(item.payload, \"metadata\");\n const normalizedKind = normalizeToolToken(\n firstPresentString(\n stringRecordValue(item.payload, \"activityKind\"),\n stringRecordValue(item.payload, \"activity_kind\"),\n stringRecordValue(metadata, \"activityKind\"),\n stringRecordValue(metadata, \"activity_kind\")\n )\n );\n if (AGENT_ACTIVITY_KINDS.has(normalizedKind)) {\n return true;\n }\n\n const normalizedName = (item.name ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[.\\-\\s]+/gu, \"_\");\n return normalizedName.startsWith(\"agent_\");\n}\n\nfunction activityPayloadKey(item: WorkspaceAgentActivityTimelineItem): string {\n const metadata = recordValue(item.payload, \"metadata\");\n return firstPresentString(\n stringRecordValue(item.payload, \"activityKey\"),\n stringRecordValue(item.payload, \"activity_key\"),\n stringRecordValue(metadata, \"activityKey\"),\n stringRecordValue(metadata, \"activity_key\")\n )\n .trim()\n .toLowerCase();\n}\n\nfunction normalizeToolToken(value: string | undefined): string {\n return (\n value\n ?.trim()\n .toLowerCase()\n .replace(/[-\\s]+/gu, \"_\") ?? \"\"\n );\n}\n\nfunction recordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): Record<string, unknown> | undefined {\n const entry = value?.[key];\n return typeof entry === \"object\" && entry !== null && !Array.isArray(entry)\n ? (entry as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const entry = value?.[key];\n return typeof entry === \"string\" ? entry : undefined;\n}\n\nfunction firstPresentString(...values: Array<string | undefined>): string {\n return (\n values.find(\n (value) => typeof value === \"string\" && value.trim().length > 0\n ) ?? \"\"\n );\n}\n","import { fileChangeCountFromChanges } from \"./workspaceAgentFileChangePayload\";\n\nexport function recordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): Record<string, unknown> | undefined {\n const nested = value?.[key];\n return nested && typeof nested === \"object\" && !Array.isArray(nested)\n ? (nested as Record<string, unknown>)\n : undefined;\n}\n\nexport function stringRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const nested = value?.[key];\n return typeof nested === \"string\" ? nested : undefined;\n}\n\nexport function stringArrayRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): string[] {\n const nested = value?.[key];\n return Array.isArray(nested)\n ? nested.flatMap((item) =>\n typeof item === \"string\" && item.trim() ? [item.trim()] : []\n )\n : [];\n}\n\nexport function stringArrayFirstRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n return stringArrayRecordValue(value, key)[0];\n}\n\nexport function arrayRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): Array<Record<string, unknown>> {\n const nested = value?.[key];\n return Array.isArray(nested)\n ? nested.flatMap((item) =>\n item && typeof item === \"object\" && !Array.isArray(item)\n ? [item as Record<string, unknown>]\n : []\n )\n : [];\n}\n\nexport function collectToolPaths(\n metadata: Record<string, unknown> | undefined,\n metadataInput: Record<string, unknown> | undefined,\n payloadInput: Record<string, unknown> | undefined\n): string[] {\n return Array.from(\n new Set([\n ...stringArrayRecordValue(metadata, \"paths\"),\n ...toolInputPaths(metadataInput),\n ...toolInputPaths(payloadInput)\n ])\n );\n}\n\nexport function summarizeToolInput(\n value: Record<string, unknown> | undefined\n): string {\n if (!value) return \"\";\n for (const key of [\n \"path\",\n \"file_path\",\n \"filePath\",\n \"filepath\",\n \"fileName\",\n \"filename\",\n \"target_path\",\n \"targetPath\",\n \"url\",\n \"uri\",\n \"query\",\n \"pattern\",\n \"prompt\",\n \"instruction\",\n \"task\",\n \"title\",\n \"message\",\n \"text\",\n \"cmd\",\n \"command\"\n ]) {\n const text = summarizeInputField(value, key);\n if (text) return text;\n }\n for (const [key, fieldValue] of Object.entries(value)) {\n if (isSensitiveKey(key)) continue;\n const text = summarizeInputValue(key, fieldValue);\n if (text) return text;\n }\n return \"\";\n}\n\nexport function summarizeFileChangeCount(\n ...values: Array<Record<string, unknown> | undefined>\n): string | null {\n for (const value of values) {\n const structuredPatch = arrayRecordValue(value, \"structuredPatch\");\n if (structuredPatch.length > 1) return `${structuredPatch.length} files`;\n const files = arrayRecordValue(recordValue(value, \"fileChanges\"), \"files\");\n if (files.length > 1) return `${files.length} files`;\n const count = fileChangeCountFromChanges(value?.changes);\n if (count > 1) return `${count} files`;\n }\n return null;\n}\n\nexport function summarizeTodoProgress(\n value: Record<string, unknown> | undefined\n): string | null {\n const todos = arrayRecordValue(value, \"todos\");\n if (todos.length === 0) return null;\n const completed = todos.filter(\n (todo) =>\n normalizeToolToken(stringRecordValue(todo, \"status\")) === \"completed\"\n ).length;\n return `${completed}/${todos.length} completed`;\n}\n\nexport function summarizeWebDomain(value: string | null): string | null {\n if (!value) return null;\n try {\n return new URL(value).hostname.replace(/^www\\./, \"\");\n } catch {\n return null;\n }\n}\n\nexport function firstPath(paths: string[]): string {\n return paths[0] ?? \"\";\n}\n\nexport function firstPresentString(\n ...values: Array<string | null | undefined>\n): string {\n for (const value of values) {\n const normalized = value?.trim();\n if (normalized) return normalized;\n }\n return \"\";\n}\n\nfunction toolInputPaths(value: Record<string, unknown> | undefined): string[] {\n if (!value) return [];\n return [\n ...stringValues(\n value,\n \"path\",\n \"file_path\",\n \"filePath\",\n \"filepath\",\n \"fileName\",\n \"filename\",\n \"target_path\",\n \"targetPath\"\n ),\n ...stringArrayRecordValue(value, \"paths\"),\n ...stringArrayRecordValue(value, \"file_paths\"),\n ...stringArrayRecordValue(value, \"filePaths\"),\n ...stringArrayRecordValue(value, \"file_names\"),\n ...stringArrayRecordValue(value, \"fileNames\"),\n ...stringArrayRecordValue(value, \"filenames\")\n ];\n}\n\nfunction summarizeInputField(\n value: Record<string, unknown>,\n key: string\n): string {\n const fieldValue = value[key];\n if (typeof fieldValue === \"string\")\n return formatInputSummary(key, fieldValue);\n if (Array.isArray(fieldValue)) {\n const items = fieldValue\n .flatMap((item) =>\n typeof item === \"string\" && item.trim() ? [item.trim()] : []\n )\n .slice(0, 3);\n if (items.length > 0) return formatInputSummary(key, items.join(\", \"));\n }\n if (\n fieldValue &&\n typeof fieldValue === \"object\" &&\n !Array.isArray(fieldValue)\n ) {\n for (const [nestedKey, nestedValue] of Object.entries(\n fieldValue as Record<string, unknown>\n )) {\n if (isSensitiveKey(nestedKey)) continue;\n const text = summarizeInputValue(`${key}.${nestedKey}`, nestedValue);\n if (text) return text;\n }\n }\n return \"\";\n}\n\nfunction summarizeInputValue(key: string, value: unknown): string {\n return typeof value === \"string\" && value.trim()\n ? formatInputSummary(key, value)\n : \"\";\n}\n\nfunction formatInputSummary(key: string, value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n const prefixless = new Set(\n [\n \"path\",\n \"file_path\",\n \"filePath\",\n \"filepath\",\n \"fileName\",\n \"filename\",\n \"target_path\",\n \"targetPath\",\n \"url\",\n \"uri\",\n \"query\",\n \"pattern\",\n \"cmd\",\n \"command\"\n ].map(normalizeToolToken)\n );\n const text = trimmed.length > 140 ? `${trimmed.slice(0, 139)}…` : trimmed;\n // i18n-check-ignore: Tool input summaries combine schema keys with user input.\n return prefixless.has(normalizeToolToken(key)) ? text : `${key}: ${text}`;\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = normalizeToolToken(key);\n return [\n \"token\",\n \"password\",\n \"secret\",\n \"api_key\",\n \"apikey\",\n \"authorization\"\n ].some((part) => normalized.includes(part));\n}\n\nfunction stringValues(\n value: Record<string, unknown>,\n ...keys: string[]\n): string[] {\n return keys.flatMap((key) => {\n const text = stringRecordValue(value, key)?.trim();\n return text ? [text] : [];\n });\n}\n\nfunction normalizeToolToken(value: string | undefined): string {\n return (\n value\n ?.trim()\n .toLowerCase()\n .replace(/[-\\s]+/gu, \"_\") ?? \"\"\n );\n}\n","import { translate } from \"../i18n/index\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport { TOOL_NAME_TRANSLATION_KEYS } from \"./workspaceAgentToolCallLabels\";\nimport {\n firstPresentString,\n recordValue,\n stringRecordValue\n} from \"./workspaceAgentToolCallSummary\";\n\nexport function itemId(item: WorkspaceAgentActivityTimelineItem): string {\n return item.eventId.trim() || `id:${item.id}`;\n}\n\nexport function isGenericToolLabel(normalizedTitle: string): boolean {\n return normalizedTitle === \"tool\" || normalizedTitle === \"usetool\";\n}\n\nexport function looksLikeOpaqueToolCallID(\n value: string | null,\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const trimmed = value?.trim() ?? \"\";\n if (!trimmed) return false;\n const metadata = recordValue(item.payload, \"metadata\");\n const callID = firstPresentString(\n item.callId,\n stringRecordValue(item.payload, \"callId\"),\n stringRecordValue(item.payload, \"callID\"),\n stringRecordValue(item.payload, \"call_id\"),\n stringRecordValue(metadata, \"callId\"),\n stringRecordValue(metadata, \"callID\"),\n stringRecordValue(metadata, \"call_id\")\n );\n if (callID && trimmed === callID) return true;\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"call_\")) return isOpaqueTail(trimmed.slice(5));\n if (lower.startsWith(\"ws_\")) return isOpaqueTail(trimmed.slice(3));\n return false;\n}\n\nexport function toolCallLabel(toolName: string | null): string {\n const normalized = normalizeToolNameToken(toolName);\n const translationKey = normalized\n ? TOOL_NAME_TRANSLATION_KEYS[normalized]\n : null;\n if (translationKey) return translate(translationKey);\n if (toolName?.trim()) return humanizeToolName(toolName);\n return translate(\"agentHost.agentTool.fallbackName\");\n}\n\nexport function normalizeToolNameToken(\n value: string | null | undefined\n): string {\n return (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[_\\s-]+/gu, \"\");\n}\n\nfunction isOpaqueTail(value: string): boolean {\n return value.length >= 12 && /^[a-z0-9]+$/i.test(value);\n}\n\nfunction humanizeToolName(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport { translate } from \"../i18n/index\";\nimport {\n extractImageGenerationPreview,\n resolveImageGenerationCanonicalToolName\n} from \"./imageGenerationTool\";\nimport {\n resolveCanonicalToolName,\n resolveLiveCanonicalToolName\n} from \"./workspaceAgentToolCallCanonical\";\nimport { isAgentActivityTimelineItem } from \"./workspaceAgentToolCallAgentActivity\";\nimport { isOpaqueWorkspaceAgentToolCallIdentifier } from \"./workspaceAgentToolCallIdentifiers\";\nimport {\n AGENT_ACTIVITY_KINDS,\n TOOL_ACTIVITY_KIND_TRANSLATION_KEYS,\n legacyKindToToolName,\n type ToolActivityKind\n} from \"./workspaceAgentToolCallLabels\";\nimport {\n isGenericToolLabel,\n itemId,\n looksLikeOpaqueToolCallID,\n normalizeToolNameToken,\n toolCallLabel\n} from \"./workspaceAgentToolCallPresentation\";\nimport {\n collectToolPaths,\n firstPath,\n firstPresentString,\n recordValue,\n stringArrayFirstRecordValue,\n stringRecordValue,\n summarizeFileChangeCount,\n summarizeTodoProgress,\n summarizeToolInput,\n summarizeWebDomain\n} from \"./workspaceAgentToolCallSummary\";\nexport type { ToolActivityKind } from \"./workspaceAgentToolCallLabels\";\nexport type ToolCallStatusKind =\n | \"working\"\n | \"completed\"\n | \"failed\"\n | \"canceled\"\n | \"waiting\";\n\nexport interface WorkspaceAgentToolCallDisplay {\n id: string;\n name: string;\n status: string | null;\n statusKind: ToolCallStatusKind | null;\n detail?: string;\n}\n\nexport function isWorkspaceAgentToolCallItem(\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const itemType = item.itemType.trim().toLowerCase();\n if (isAgentActivityTimelineItem(item)) {\n return false;\n }\n if (itemType === \"call\" || itemType.startsWith(\"call.\")) {\n return true;\n }\n if (itemType.startsWith(\"approval.\") || itemType.startsWith(\"interactive.\")) {\n return true;\n }\n const payloadCallType = stringRecordValue(item.payload, \"callType\");\n if (payloadCallType === \"approval\" || payloadCallType === \"interactive\") {\n return true;\n }\n return isToolActivityTimelineItem(item);\n}\n\nexport function buildWorkspaceAgentToolCallDisplay(\n item: WorkspaceAgentActivityTimelineItem\n): WorkspaceAgentToolCallDisplay {\n const toolName = resolveWorkspaceAgentToolName(item);\n const detail = toolCallDetail(item, toolName);\n return {\n id: toolCallId(item),\n name: toolCallLabel(toolName),\n ...toolCallStatus(item),\n ...(detail ? { detail } : {})\n };\n}\n\nfunction toolCallId(item: WorkspaceAgentActivityTimelineItem): string {\n const metadata = recordValue(item.payload, \"metadata\");\n const callId = firstPresentString(\n stringRecordValue(item.payload, \"callId\"),\n stringRecordValue(item.payload, \"callID\"),\n stringRecordValue(item.payload, \"call_id\"),\n stringRecordValue(metadata, \"callId\"),\n stringRecordValue(metadata, \"callID\"),\n stringRecordValue(metadata, \"call_id\"),\n item.callId\n );\n return callId ? `call:${callId}` : itemId(item);\n}\n\nexport function resolveWorkspaceAgentToolName(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n const metadata = recordValue(item.payload, \"metadata\");\n const input = recordValue(item.payload, \"input\");\n const output = recordValue(item.payload, \"output\");\n const rawPayloadToolName = firstPresentString(\n stringRecordValue(item.payload, \"toolName\"),\n stringRecordValue(metadata, \"toolName\"),\n claudeCodeToolName(input),\n claudeCodeToolName(output)\n );\n const imageGenerationToolName = resolveImageGenerationCanonicalToolName({\n toolName: rawPayloadToolName,\n displayName: item.name,\n content: item.payload?.content,\n outputContent: output?.content,\n inputPrompt: input?.prompt\n });\n if (imageGenerationToolName) {\n return imageGenerationToolName;\n }\n const canonicalToolName = resolveCanonicalToolName(rawPayloadToolName);\n if (canonicalToolName) {\n return canonicalToolName;\n }\n const liveCanonicalToolName = resolveLiveCanonicalToolName(\n item,\n rawPayloadToolName,\n resolveLegacyACPToolName(item)\n );\n if (\n typeof liveCanonicalToolName === \"string\" &&\n liveCanonicalToolName.trim()\n ) {\n return liveCanonicalToolName;\n }\n if (liveCanonicalToolName === null && !rawPayloadToolName) {\n return null;\n }\n return resolveLegacyToolName(item) ?? resolveLegacyNamedToolName(item);\n}\n\nfunction resolveFetchToolName(\n payload: Record<string, unknown> | undefined\n): string | null {\n const input = recordValue(payload, \"input\");\n const action = recordValue(input, \"action\");\n const actionType = normalizeToolToken(stringRecordValue(action, \"type\"));\n switch (actionType) {\n case \"search\":\n case \"search_query\":\n case \"web_search\":\n return \"WebSearch\";\n case \"open_page\":\n case \"open\":\n case \"fetch\":\n case \"web_fetch\":\n return \"WebFetch\";\n default:\n break;\n }\n if (\n firstPresentString(\n stringRecordValue(action, \"url\"),\n stringRecordValue(input, \"url\")\n )\n ) {\n return \"WebFetch\";\n }\n if (\n firstPresentString(\n stringRecordValue(action, \"query\"),\n stringRecordValue(input, \"query\"),\n stringRecordValue(input, \"search_query\"),\n stringRecordValue(input, \"searchQuery\")\n )\n ) {\n return \"WebSearch\";\n }\n return null;\n}\n\nfunction resolveLegacyToolName(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n const metadata = recordValue(item.payload, \"metadata\");\n const rawKind =\n stringRecordValue(item.payload, \"activityKind\") ??\n stringRecordValue(item.payload, \"activity_kind\") ??\n stringRecordValue(metadata, \"activityKind\") ??\n stringRecordValue(metadata, \"activity_kind\");\n const normalizedKind = normalizeToolToken(rawKind);\n if (AGENT_ACTIVITY_KINDS.has(normalizedKind as ToolActivityKind)) {\n return null;\n }\n if (isToolActivityKind(normalizedKind)) {\n return legacyKindToToolName(normalizedKind);\n }\n\n return resolveLegacyACPToolName(item);\n}\n\nfunction resolveLegacyACPToolName(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n const input = recordValue(item.payload, \"input\");\n const normalizedKind = normalizeToolToken(\n firstPresentString(\n stringRecordValue(item.payload, \"kind\"),\n stringRecordValue(input, \"kind\")\n )\n );\n const normalizedTitle = normalizeToolToken(\n firstPresentString(\n stringRecordValue(item.payload, \"title\"),\n stringRecordValue(input, \"title\"),\n item.name\n )\n );\n const fetchToolName = resolveFetchToolName(item.payload);\n\n if (fetchToolName) {\n return fetchToolName;\n }\n\n if (normalizedKind === \"fetch\") {\n return \"WebFetch\";\n }\n if (normalizedKind === \"read\") {\n return stringRecordValue(input, \"pattern\") ? \"Glob\" : \"Read\";\n }\n if (normalizedKind === \"think\") {\n return normalizedTitle === \"update_todo\" || Array.isArray(input?.todos)\n ? \"TodoWrite\"\n : \"Think\";\n }\n if (normalizedKind === \"search\") {\n switch (normalizedTitle) {\n case \"glob\":\n case \"find\":\n case \"fd\":\n case \"file_search\":\n return \"Glob\";\n case \"grep\":\n case \"rg\":\n case \"ripgrep\":\n case \"codebase_search\":\n return \"Grep\";\n default:\n return \"Bash\";\n }\n }\n if (normalizedKind === \"other\") {\n switch (normalizedTitle) {\n case \"todowrite\":\n case \"updatetodo\":\n return \"TodoWrite\";\n case \"skill\":\n return \"Skill\";\n case \"task\":\n case \"subagent\":\n case \"runsubagent\":\n case \"delegatetask\":\n case \"delegateagent\":\n case \"agent\":\n return \"Agent\";\n case \"rg\":\n case \"ripgrep\":\n return \"Grep\";\n case \"find\":\n case \"fd\":\n return \"Glob\";\n default:\n return null;\n }\n }\n switch (normalizedKind) {\n case \"execute\":\n case \"exec\":\n case \"command\":\n case \"shell\":\n return \"Bash\";\n case \"edit\":\n case \"move\":\n return \"Edit\";\n case \"delete\":\n return \"Write\";\n default:\n return null;\n }\n}\n\nfunction resolveLegacyNamedToolName(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n const metadata = recordValue(item.payload, \"metadata\");\n const rawTitle = firstPresentString(\n stringRecordValue(item.payload, \"tool\"),\n stringRecordValue(metadata, \"tool\"),\n item.name\n );\n if (looksLikeOpaqueToolCallID(rawTitle, item)) {\n return null;\n }\n const normalizedTitle = normalizeToolNameToken(rawTitle);\n switch (normalizedTitle) {\n case \"approval\":\n return \"Approval\";\n case \"askuserquestion\":\n return \"AskUserQuestion\";\n case \"enterplanmode\":\n return \"EnterPlanMode\";\n case \"exitplanmode\":\n return \"ExitPlanMode\";\n case \"toolsearch\":\n return \"ToolSearch\";\n case \"skill\":\n return \"Skill\";\n case \"bash\":\n case \"shell\":\n case \"exec\":\n case \"execcommand\":\n case \"runshellcommand\":\n return \"Bash\";\n case \"read\":\n case \"readfile\":\n return \"Read\";\n case \"write\":\n case \"writefile\":\n return \"Write\";\n case \"edit\":\n case \"editfile\":\n case \"multiedit\":\n return \"Edit\";\n case \"grep\":\n return \"Grep\";\n case \"glob\":\n return \"Glob\";\n case \"websearch\":\n return \"WebSearch\";\n case \"webfetch\":\n return \"WebFetch\";\n case \"todowrite\":\n return \"TodoWrite\";\n case \"task\":\n case \"subagent\":\n case \"runsubagent\":\n case \"delegatetask\":\n case \"delegateagent\":\n case \"agent\":\n return \"Agent\";\n default:\n break;\n }\n\n const lowerTitle = rawTitle.trim().toLowerCase();\n if (lowerTitle.startsWith(\"read \")) {\n return \"Read\";\n }\n if (lowerTitle.startsWith(\"write \")) {\n return \"Write\";\n }\n if (lowerTitle.startsWith(\"edit \")) {\n return \"Edit\";\n }\n\n if (\n !normalizedTitle ||\n isGenericToolLabel(normalizedTitle) ||\n isOpaqueWorkspaceAgentToolCallIdentifier(rawTitle, item)\n ) {\n return null;\n }\n return rawTitle.trim();\n}\n\nfunction toolCallStatus(item: WorkspaceAgentActivityTimelineItem): {\n status: string | null;\n statusKind: ToolCallStatusKind | null;\n} {\n const payloadStatus = firstPresentString(\n item.status,\n stringRecordValue(item.payload, \"status\"),\n stringRecordValue(item.payload, \"activityStatus\"),\n statusFromActivityEventType(activityEventType(item))\n );\n switch (normalizeToolToken(payloadStatus)) {\n case \"active\":\n case \"running\":\n case \"working\":\n return {\n status: translate(\"agentHost.agentTool.statusWorking\"),\n statusKind: \"working\"\n };\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return {\n status: translate(\"agentHost.agentTool.statusCompleted\"),\n statusKind: \"completed\"\n };\n case \"failed\":\n case \"error\":\n return {\n status: translate(\"agentHost.agentTool.statusFailed\"),\n statusKind: \"failed\"\n };\n case \"canceled\":\n return {\n status: translate(\"agentHost.agentTool.statusCanceled\"),\n statusKind: \"canceled\"\n };\n case \"pending\":\n case \"waiting\":\n case \"awaiting_approval\":\n case \"waiting_approval\":\n case \"waiting_input\":\n return {\n status: translate(\"agentHost.agentTool.statusWaiting\"),\n statusKind: \"waiting\"\n };\n default:\n return { status: null, statusKind: null };\n }\n}\n\nfunction toolCallDetail(\n item: WorkspaceAgentActivityTimelineItem,\n toolName: string | null\n): string | null {\n const metadata = recordValue(item.payload, \"metadata\");\n const metadataInput = recordValue(metadata, \"input\");\n const metadataError = recordValue(metadata, \"error\");\n const payloadInput = recordValue(item.payload, \"input\");\n const payloadOutput = recordValue(item.payload, \"output\");\n const payloadError = recordValue(item.payload, \"error\");\n const paths = collectToolPaths(metadata, metadataInput, payloadInput);\n const rawToolName = firstPresentString(\n stringRecordValue(metadata, \"tool\"),\n stringRecordValue(item.payload, \"tool\"),\n toolNameFromActivityKey(toolActivityKey(item)),\n item.name\n );\n const visibleRawToolName = isOpaqueWorkspaceAgentToolCallIdentifier(\n rawToolName,\n item\n )\n ? \"\"\n : rawToolName;\n const fallback = firstPresentString(\n commandDetail(\n item.payload,\n metadata,\n metadataInput,\n metadataError,\n payloadInput,\n payloadError\n ),\n toolContentDetail(\n item.payload,\n metadata,\n metadataInput,\n metadataError,\n payloadInput,\n payloadError\n ),\n item.content,\n stringRecordValue(item.payload, \"summary\"),\n stringRecordValue(item.payload, \"content\"),\n stringRecordValue(item.payload, \"text\"),\n stringRecordValue(metadata, \"summary\")\n );\n const query = firstPresentString(\n stringRecordValue(item.payload, \"query\"),\n stringArrayFirstRecordValue(item.payload, \"search_query\"),\n stringArrayFirstRecordValue(item.payload, \"searchQuery\"),\n stringRecordValue(metadata, \"query\"),\n stringRecordValue(metadataInput, \"query\"),\n stringArrayFirstRecordValue(metadataInput, \"search_query\"),\n stringArrayFirstRecordValue(metadataInput, \"searchQuery\"),\n stringRecordValue(payloadInput, \"query\"),\n stringArrayFirstRecordValue(payloadInput, \"search_query\"),\n stringArrayFirstRecordValue(payloadInput, \"searchQuery\"),\n stringRecordValue(recordValue(payloadInput, \"action\"), \"query\"),\n stringRecordValue(recordValue(payloadInput, \"action\"), \"url\")\n );\n const webTarget = firstPresentString(\n query,\n stringRecordValue(metadataInput, \"url\"),\n stringRecordValue(payloadInput, \"url\")\n );\n const pattern = firstPresentString(\n stringRecordValue(item.payload, \"pattern\"),\n stringRecordValue(metadata, \"pattern\"),\n stringRecordValue(metadataInput, \"pattern\"),\n stringRecordValue(payloadInput, \"pattern\")\n );\n const command = firstPresentString(\n stringRecordValue(metadata, \"command\"),\n stringRecordValue(metadataInput, \"cmd\"),\n stringRecordValue(metadataInput, \"command\"),\n stringRecordValue(payloadInput, \"cmd\"),\n stringRecordValue(payloadInput, \"command\")\n );\n const path = firstPresentString(\n stringRecordValue(metadataInput, \"path\"),\n stringRecordValue(metadataInput, \"file_path\"),\n stringRecordValue(metadataInput, \"fileName\"),\n stringRecordValue(metadataInput, \"filename\"),\n stringRecordValue(payloadInput, \"path\"),\n stringRecordValue(payloadInput, \"file_path\"),\n stringRecordValue(payloadInput, \"fileName\"),\n stringRecordValue(payloadInput, \"filename\")\n );\n const inputSummary = firstPresentString(\n summarizeToolInput(metadataInput),\n summarizeToolInput(payloadInput)\n );\n const normalizedToolName = normalizeToolNameToken(toolName);\n const multiFileSummary = summarizeFileChangeCount(\n payloadOutput,\n payloadInput,\n item.payload,\n metadataInput\n );\n const todoSummary = summarizeTodoProgress(payloadInput);\n const webDomainSummary = summarizeWebDomain(webTarget);\n const imageGeneration = extractImageGenerationPreview({\n toolName,\n displayName: visibleRawToolName,\n content: item.payload?.content,\n outputContent: payloadOutput?.content,\n outputSavedPath: payloadOutput?.savedPath ?? payloadOutput?.saved_path,\n inputPrompt: payloadInput?.prompt,\n payloadInputPrompt: metadataInput?.prompt\n });\n\n switch (normalizedToolName) {\n case \"imagegeneration\":\n return (\n imageGeneration.prompt ||\n imageGeneration.imageUri ||\n fallback ||\n inputSummary ||\n null\n );\n case \"read\":\n case \"write\":\n case \"edit\":\n case \"multiedit\":\n return (\n multiFileSummary ||\n path ||\n firstPath(paths) ||\n fallback ||\n inputSummary ||\n command ||\n null\n );\n case \"glob\":\n return (\n pattern ||\n query ||\n path ||\n firstPath(paths) ||\n fallback ||\n inputSummary ||\n null\n );\n case \"bash\":\n return (\n command || path || firstPath(paths) || fallback || inputSummary || null\n );\n case \"grep\":\n return (\n query ||\n pattern ||\n fallback ||\n inputSummary ||\n command ||\n firstPath(paths) ||\n null\n );\n case \"websearch\":\n return (\n query ||\n webDomainSummary ||\n pattern ||\n fallback ||\n inputSummary ||\n command ||\n firstPath(paths) ||\n null\n );\n case \"webfetch\":\n return (\n webDomainSummary ||\n query ||\n pattern ||\n fallback ||\n inputSummary ||\n command ||\n firstPath(paths) ||\n null\n );\n case \"todowrite\":\n return todoSummary || inputSummary || fallback || null;\n case \"toolsearch\":\n case \"skill\":\n case \"task\":\n case \"agent\":\n return (\n inputSummary ||\n fallback ||\n path ||\n firstPath(paths) ||\n query ||\n pattern ||\n command ||\n visibleRawToolName ||\n null\n );\n default:\n return (\n fallback ||\n command ||\n path ||\n firstPath(paths) ||\n query ||\n pattern ||\n inputSummary ||\n visibleRawToolName ||\n null\n );\n }\n}\n\nfunction commandDetail(\n payload: Record<string, unknown> | undefined,\n metadata: Record<string, unknown> | undefined,\n metadataInput: Record<string, unknown> | undefined,\n metadataError: Record<string, unknown> | undefined,\n payloadInput: Record<string, unknown> | undefined,\n payloadError: Record<string, unknown> | undefined\n): string {\n const payloadRawInput = recordValue(payloadInput, \"rawInput\");\n return firstPresentString(\n stringRecordValue(payload, \"command\"),\n stringRecordValue(payload, \"cmd\"),\n stringRecordValue(metadata, \"command\"),\n stringRecordValue(metadata, \"cmd\"),\n stringRecordValue(metadataInput, \"cmd\"),\n stringRecordValue(metadataInput, \"command\"),\n stringRecordValue(metadataError, \"cmd\"),\n stringRecordValue(metadataError, \"command\"),\n stringRecordValue(payloadInput, \"cmd\"),\n stringRecordValue(payloadInput, \"command\"),\n stringRecordValue(payloadRawInput, \"cmd\"),\n stringRecordValue(payloadRawInput, \"command\"),\n stringRecordValue(payloadError, \"cmd\"),\n stringRecordValue(payloadError, \"command\")\n );\n}\n\nfunction claudeCodeToolName(\n value: Record<string, unknown> | undefined\n): string | undefined {\n const meta = recordValue(value, \"_meta\");\n const claudeCode = recordValue(meta, \"claudeCode\");\n return stringRecordValue(claudeCode, \"toolName\");\n}\n\nfunction toolContentDetail(\n payload: Record<string, unknown> | undefined,\n metadata: Record<string, unknown> | undefined,\n metadataInput: Record<string, unknown> | undefined,\n metadataError: Record<string, unknown> | undefined,\n payloadInput: Record<string, unknown> | undefined,\n payloadError: Record<string, unknown> | undefined\n): string {\n return firstPresentString(\n stringRecordValue(payload, \"query\"),\n stringRecordValue(payload, \"search_query\"),\n stringRecordValue(payload, \"searchQuery\"),\n stringRecordValue(payload, \"pattern\"),\n stringRecordValue(payload, \"glob\"),\n stringRecordValue(payload, \"regex\"),\n stringRecordValue(payload, \"url\"),\n stringRecordValue(payload, \"patch\"),\n stringRecordValue(metadata, \"query\"),\n stringRecordValue(metadata, \"pattern\"),\n stringRecordValue(metadata, \"glob\"),\n stringRecordValue(metadata, \"regex\"),\n stringRecordValue(metadata, \"url\"),\n stringRecordValue(metadata, \"patch\"),\n stringRecordValue(metadataInput, \"query\"),\n stringRecordValue(metadataInput, \"pattern\"),\n stringRecordValue(metadataInput, \"glob\"),\n stringRecordValue(metadataInput, \"regex\"),\n stringRecordValue(metadataInput, \"url\"),\n stringRecordValue(metadataInput, \"patch\"),\n stringRecordValue(metadataError, \"query\"),\n stringRecordValue(metadataError, \"pattern\"),\n stringRecordValue(metadataError, \"url\"),\n stringRecordValue(payloadInput, \"query\"),\n stringRecordValue(payloadInput, \"search_query\"),\n stringRecordValue(payloadInput, \"searchQuery\"),\n stringRecordValue(payloadInput, \"pattern\"),\n stringRecordValue(payloadInput, \"glob\"),\n stringRecordValue(payloadInput, \"regex\"),\n stringRecordValue(payloadInput, \"url\"),\n stringRecordValue(payloadInput, \"patch\"),\n stringRecordValue(payloadError, \"query\"),\n stringRecordValue(payloadError, \"pattern\"),\n stringRecordValue(payloadError, \"url\")\n );\n}\n\nfunction isToolActivityTimelineItem(\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const eventType = activityEventType(item);\n if (!eventType.startsWith(\"activity.\")) {\n return false;\n }\n const activityKey = toolActivityKey(item);\n if (activityKey.startsWith(\"tool.\")) {\n return true;\n }\n return resolveLegacyToolName(item) !== null;\n}\n\nfunction activityEventType(item: WorkspaceAgentActivityTimelineItem): string {\n const itemType = item.itemType.trim().toLowerCase();\n if (itemType.startsWith(\"activity.\")) {\n return itemType;\n }\n return firstPresentString(\n stringRecordValue(item.payload, \"eventKey\"),\n item.itemType\n )\n .trim()\n .toLowerCase();\n}\n\nfunction statusFromActivityEventType(eventType: string): string {\n switch (eventType) {\n case \"activity.started\":\n case \"call.started\":\n return \"running\";\n case \"activity.completed\":\n case \"call.completed\":\n return \"completed\";\n case \"activity.failed\":\n case \"call.failed\":\n case \"call.errored\":\n return \"failed\";\n default:\n return \"\";\n }\n}\n\nfunction toolActivityKey(item: WorkspaceAgentActivityTimelineItem): string {\n const metadata = recordValue(item.payload, \"metadata\");\n return firstPresentString(\n stringRecordValue(item.payload, \"activityKey\"),\n stringRecordValue(item.payload, \"activity_key\"),\n stringRecordValue(metadata, \"activityKey\"),\n stringRecordValue(metadata, \"activity_key\")\n )\n .trim()\n .toLowerCase();\n}\n\nfunction toolNameFromActivityKey(activityKey: string): string {\n return activityKey.startsWith(\"tool.\")\n ? activityKey.slice(\"tool.\".length)\n : \"\";\n}\n\nfunction isToolActivityKind(value: string): value is ToolActivityKind {\n return value in TOOL_ACTIVITY_KIND_TRANSLATION_KEYS;\n}\n\nfunction normalizeToolToken(value: string | undefined): string {\n return (\n value\n ?.trim()\n .toLowerCase()\n .replace(/[-\\s]+/gu, \"_\") ?? \"\"\n );\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport { resolveWorkspaceAgentNoticeCommandSemantics } from \"./workspaceAgentSystemNoticeSemantics\";\nimport {\n buildWorkspaceAgentToolCallDisplay,\n resolveWorkspaceAgentToolName,\n type ToolCallStatusKind\n} from \"./workspaceAgentToolCallDisplay\";\nimport type {\n BuildWorkspaceAgentSessionDetailInput,\n WorkspaceAgentSessionDetailMessage,\n WorkspaceAgentSessionDetailToolCall,\n WorkspaceAgentSessionDetailTurn\n} from \"./workspaceAgentSessionDetailViewModel\";\n\nexport function delegatedToolStepFromCall(\n call: WorkspaceAgentSessionDetailToolCall\n): Record<string, unknown> {\n const payload = normalizedPayload(call.payload ?? undefined);\n return {\n id: call.id,\n toolUseId: call.id.replace(/^call:/, \"\"),\n name: call.name,\n toolName: call.toolName,\n callType: call.callType,\n status: call.status,\n toolInput: normalizedPayload(\n payload?.input as WorkspaceAgentActivityTimelineItem[\"payload\"]\n ),\n toolResult: normalizedPayload(\n payload?.output as WorkspaceAgentActivityTimelineItem[\"payload\"]\n ),\n toolError: normalizedPayload(\n payload?.error as WorkspaceAgentActivityTimelineItem[\"payload\"]\n ),\n payload,\n metadata: normalizedPayload(\n payload?.metadata as WorkspaceAgentActivityTimelineItem[\"payload\"]\n ),\n content: Array.isArray(payload?.content) ? payload.content : null,\n locations: Array.isArray(payload?.locations) ? payload.locations : null,\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n}\n\nexport function compareToolCallsAscending(\n left: WorkspaceAgentSessionDetailToolCall,\n right: WorkspaceAgentSessionDetailToolCall\n): number {\n return (\n (left.occurredAtUnixMs ?? 0) - (right.occurredAtUnixMs ?? 0) ||\n left.id.localeCompare(right.id)\n );\n}\n\nexport function parentToolUseIdFromCall(\n call: WorkspaceAgentSessionDetailToolCall\n): string | null {\n const metadata = normalizedPayload(\n call.payload?.metadata as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const input = normalizedPayload(\n call.payload?.input as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const output = normalizedPayload(\n call.payload?.output as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const error = normalizedPayload(\n call.payload?.error as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n return firstPresentString(\n stringRecordValue(metadata, \"parentToolUseId\"),\n stringRecordValue(call.payload, \"parentToolUseId\"),\n claudeCodeMetaValue(input, \"parentToolUseId\"),\n claudeCodeMetaValue(output, \"parentToolUseId\"),\n claudeCodeMetaValue(error, \"parentToolUseId\")\n );\n}\n\nexport function isTaskLikeToolCall(\n call: WorkspaceAgentSessionDetailToolCall\n): boolean {\n return [\n \"task\",\n \"subagent\",\n \"delegatetask\",\n \"delegateagent\",\n \"agent\"\n ].includes(normalizeToolName(call.toolName));\n}\n\nexport function toolCallView(\n item: WorkspaceAgentActivityTimelineItem\n): WorkspaceAgentSessionDetailToolCall {\n const display = buildWorkspaceAgentToolCallDisplay(item);\n const preserveTitle =\n item.itemType.trim().toLowerCase().startsWith(\"approval.\") ||\n item.itemType.trim().toLowerCase().startsWith(\"interactive.\") ||\n firstPresentString(\n item.callType,\n stringRecordValue(item.payload, \"callType\")\n ) === \"approval\";\n const fallbackName = preserveTitle\n ? firstPresentString(item.name, display.name)\n : display.name;\n return withSourceTimelineItems(\n {\n id: display.id,\n name: fallbackName || display.name,\n toolName: resolveWorkspaceAgentToolName(item),\n callType: firstPresentString(\n item.callType,\n stringRecordValue(item.payload, \"callType\")\n ),\n status: display.status,\n statusKind: display.statusKind,\n summary: display.detail ?? \"\",\n payload: normalizedPayload(item.payload),\n turnId: item.turnId?.trim() || undefined,\n compactSummary: display.detail ?? \"\",\n occurredAtUnixMs: item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null\n },\n [item]\n );\n}\n\nexport function withSourceTimelineItems<T extends object>(\n value: T,\n sourceTimelineItems: readonly WorkspaceAgentActivityTimelineItem[] | undefined\n): T & { sourceTimelineItems?: WorkspaceAgentActivityTimelineItem[] } {\n if (!sourceTimelineItems || sourceTimelineItems.length === 0) return value;\n Object.defineProperty(value, \"sourceTimelineItems\", {\n configurable: true,\n enumerable: false,\n value: [...sourceTimelineItems],\n writable: true\n });\n return value as T & {\n sourceTimelineItems?: WorkspaceAgentActivityTimelineItem[];\n };\n}\n\nexport function mergeSourceTimelineItems(\n previous: readonly WorkspaceAgentActivityTimelineItem[] | undefined,\n next: readonly WorkspaceAgentActivityTimelineItem[] | undefined\n): WorkspaceAgentActivityTimelineItem[] | undefined {\n const merged = [...(previous ?? []), ...(next ?? [])];\n if (merged.length === 0) return undefined;\n const byKey = new Map<string, WorkspaceAgentActivityTimelineItem>();\n for (const item of merged) byKey.set(sourceTimelineItemKey(item), item);\n return [...byKey.values()].sort(compareTimelineItemsAscending);\n}\n\nexport function normalizedPayload(\n payload: WorkspaceAgentActivityTimelineItem[\"payload\"]\n): Record<string, unknown> | null {\n return payload && typeof payload === \"object\" ? payload : null;\n}\n\nexport function visibleErrorFromPayload(\n payload: Record<string, unknown> | null\n): WorkspaceAgentSessionDetailMessage[\"visibleError\"] {\n if (stringRecordValue(payload, \"kind\") !== \"agent_visible_error\") return null;\n return {\n code: stringRecordValue(payload, \"code\"),\n phase: stringRecordValue(payload, \"phase\"),\n provider: stringRecordValue(payload, \"provider\"),\n detail: stringRecordValue(payload, \"detail\"),\n retryable: booleanRecordValue(payload, \"retryable\")\n };\n}\n\nexport function systemNoticeFromPayload(\n payload: Record<string, unknown> | null,\n context: Pick<\n WorkspaceAgentActivityTimelineItem,\n \"eventId\" | \"messageSemantics\" | \"status\"\n >\n): WorkspaceAgentSessionDetailMessage[\"systemNotice\"] {\n const commandSemantics = resolveWorkspaceAgentNoticeCommandSemantics({\n eventId: context.eventId,\n messageSemantics: context.messageSemantics,\n payload,\n status: context.status\n });\n if (\n stringRecordValue(payload, \"kind\") !== \"agent_system_notice\" &&\n !commandSemantics\n ) {\n return null;\n }\n const source = stringRecordValue(payload, \"source\");\n return {\n noticeKind: stringRecordValue(payload, \"noticeKind\"),\n severity: stringRecordValue(payload, \"severity\"),\n ...(source ? { source } : {}),\n ...(commandSemantics\n ? {\n command: commandSemantics.command,\n commandStatus: commandSemantics.commandStatus\n }\n : {}),\n title: stringRecordValue(payload, \"title\"),\n detail: stringRecordValue(payload, \"detail\"),\n retryable: booleanRecordValue(payload, \"retryable\")\n };\n}\n\nexport function stringRecordValue(record: unknown, key: string): string | null {\n if (!record || typeof record !== \"object\" || Array.isArray(record))\n return null;\n const value = (record as Record<string, unknown>)[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nexport function claudeCodeMetaValue(\n record: Record<string, unknown> | null,\n key: string\n): string | null {\n const meta = normalizedPayload(\n record?._meta as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const claudeCode = normalizedPayload(\n meta?.claudeCode as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n return stringRecordValue(claudeCode, key);\n}\n\nexport function firstPresentString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return null;\n}\n\nexport function summarizeToolCallGroup(\n calls: readonly WorkspaceAgentSessionDetailToolCall[]\n): string | null {\n if (calls.length < 2) return null;\n const targets = [\n ...new Set(\n calls\n .filter((call) =>\n [\"edit\", \"multiedit\", \"write\"].includes(\n normalizeToolName(call.toolName)\n )\n )\n .map((call) => summarizeCallTarget(call.summary))\n .filter((value): value is string => value !== null)\n )\n ];\n if (targets.length === 0) return null;\n return targets.length === 1\n ? `Changed ${targets[0]}`\n : `Changed ${targets[0]} and ${targets.length - 1} more files`;\n}\n\nexport function shouldShowProcessingIndicator(\n session: BuildWorkspaceAgentSessionDetailInput[\"session\"],\n turns: readonly WorkspaceAgentSessionDetailTurn[]\n): boolean {\n if (!sessionHasRunnableIndicatorState(session)) return false;\n const lastTurn = turns.at(-1);\n if (!lastTurn) return true;\n const lastAgentItem = lastTurn.agentItems.at(-1);\n if (\n lastAgentItem?.kind === \"message\" &&\n isTerminalAgentMessageStatus(lastAgentItem.message.statusKind) &&\n !hasActiveRunningTurn(session)\n ) {\n return false;\n }\n return !lastTurn.toolCalls.some(\n (call) => call.statusKind === \"working\" || call.statusKind === \"waiting\"\n );\n}\n\nfunction sourceTimelineItemKey(\n item: WorkspaceAgentActivityTimelineItem\n): string {\n const eventId = item.eventId?.trim();\n if (eventId) return `event:${eventId}`;\n if (Number.isFinite(item.id) && item.id > 0) return `id:${item.id}`;\n const seq = item.seq ?? 0;\n return seq > 0\n ? `seq:${seq}`\n : `local:${item.itemType}:${item.occurredAtUnixMs ?? 0}`;\n}\n\nfunction compareTimelineItemsAscending(\n left: WorkspaceAgentActivityTimelineItem,\n right: WorkspaceAgentActivityTimelineItem\n): number {\n return (\n (left.seq ?? 0) - (right.seq ?? 0) ||\n (left.occurredAtUnixMs ?? left.createdAtUnixMs ?? 0) -\n (right.occurredAtUnixMs ?? right.createdAtUnixMs ?? 0) ||\n left.id - right.id\n );\n}\n\nfunction booleanRecordValue(record: unknown, key: string): boolean | null {\n if (!record || typeof record !== \"object\" || Array.isArray(record))\n return null;\n const value = (record as Record<string, unknown>)[key];\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction normalizeToolName(name: string | null): string {\n return (name ?? \"\")\n .trim()\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n\nfunction summarizeCallTarget(summary: string): string | null {\n const firstLine = summary.trim().split(\"\\n\")[0]?.trim() ?? \"\";\n if (!firstLine) return null;\n return firstLine.split(/[\\\\/]/).filter(Boolean).at(-1) ?? firstLine;\n}\n\nfunction hasActiveRunningTurn(\n session: BuildWorkspaceAgentSessionDetailInput[\"session\"]\n): boolean {\n const activeTurn = session.activeTurn;\n return Boolean(activeTurn && activeTurn.phase !== \"settled\");\n}\n\nfunction sessionHasRunnableIndicatorState(\n session: BuildWorkspaceAgentSessionDetailInput[\"session\"]\n): boolean {\n return session.activeTurn ? session.activeTurn.phase !== \"settled\" : false;\n}\n\nfunction isTerminalAgentMessageStatus(\n status: ToolCallStatusKind | null | undefined\n): boolean {\n return status === \"completed\" || status === \"failed\" || status === \"canceled\";\n}\n","import type { WorkspaceAgentSessionDetailGoalControl } from \"./workspaceAgentSessionDetailViewModel\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport { normalizedPayload } from \"./workspaceAgentTimelineProjectionHelpers\";\n\nexport function appendWorkspaceAgentGoalControl(\n target: WorkspaceAgentSessionDetailGoalControl[],\n item: WorkspaceAgentActivityTimelineItem,\n id: string,\n body: string\n): boolean {\n if (item.itemType !== \"goal.control\") {\n return false;\n }\n const action = normalizedPayload(item.payload)?.action;\n if (\n action !== \"pause\" &&\n action !== \"resume\" &&\n action !== \"clear\" &&\n action !== \"set\"\n ) {\n return true;\n }\n const normalizedBody = body.trim();\n if (!normalizedBody) {\n return true;\n }\n target.push({\n id,\n action,\n body: normalizedBody,\n occurredAtUnixMs: item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null,\n sourceTimelineItems: [item]\n });\n return true;\n}\n","import type { ToolCallStatusKind } from \"./workspaceAgentToolCallDisplay\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\n\nexport function messageRole(\n item: WorkspaceAgentActivityTimelineItem\n): \"user\" | \"agent\" | \"thinking\" | null {\n const explicitRole = item.role?.trim().toLowerCase();\n if (explicitRole === \"user\") {\n return \"user\";\n }\n if (explicitRole === \"assistant_thinking\") {\n return \"thinking\";\n }\n if (explicitRole === \"assistant\" || explicitRole === \"agent\") {\n return \"agent\";\n }\n\n const itemType = item.itemType.trim().toLowerCase();\n if (itemType === \"message.user\") {\n return \"user\";\n }\n if (itemType === \"message.agent\" || itemType === \"message.assistant\") {\n return \"agent\";\n }\n if (itemType === \"message.assistant_thinking\") {\n return \"thinking\";\n }\n return null;\n}\n\nexport function messageBody(item: WorkspaceAgentActivityTimelineItem): string {\n const payloadContent = item.payload?.content;\n if (typeof payloadContent === \"string\" && payloadContent.trim()) {\n const content = payloadContent.trim();\n return isWorkspaceAgentSyntheticControlMessage(content) ? \"\" : content;\n }\n\n const content = item.content?.trim();\n if (content) {\n return isWorkspaceAgentSyntheticControlMessage(content) ? \"\" : content;\n }\n\n const payloadText = item.payload?.text;\n if (typeof payloadText !== \"string\") {\n return \"\";\n }\n const text = payloadText.trim();\n return isWorkspaceAgentSyntheticControlMessage(text) ? \"\" : text;\n}\n\nexport function thinkingStatusKind(\n item: WorkspaceAgentActivityTimelineItem\n): ToolCallStatusKind | null {\n const status = firstPresentString(\n item.status,\n stringRecordValue(item.payload, \"status\"),\n stringRecordValue(item.payload, \"streamState\"),\n stringRecordValue(item.payload, \"messageStreamState\")\n );\n return messageStatusKind(status);\n}\n\nexport function messageStatusKind(\n status: string | null\n): ToolCallStatusKind | null {\n switch (normalizeStatusToken(status)) {\n case \"active\":\n case \"running\":\n case \"streaming\":\n case \"working\":\n case \"inprogress\":\n case \"in_progress\":\n return \"working\";\n case \"completed\":\n case \"complete\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"failed\":\n case \"error\":\n return \"failed\";\n case \"canceled\":\n return \"canceled\";\n case \"pending\":\n case \"waiting\":\n return \"waiting\";\n default:\n return null;\n }\n}\n\nexport function isPlaceholderThinkingBody(body: string): boolean {\n const normalized = body.trim();\n return normalized === \"...\" || normalized === \"…\";\n}\n\n// Codex review reasoning summaries lead with a bold section title, e.g.\n// \"**Considering workspace registration order**\\n\\nI'm looking at...\". Hide\n// the title in /review process prose; keep the body paragraph.\nconst reviewProcessSummaryTitlePattern = /^\\*\\*(.+?)\\*\\*(?:\\r?\\n\\s*)?/;\n\nexport function stripReviewProcessSummaryTitle(body: string): string {\n const match = body.match(reviewProcessSummaryTitlePattern);\n if (!match) {\n return body;\n }\n return body.slice(match[0].length).trimStart();\n}\n\nexport function normalizedMessageBody(body: string): string {\n return body.trim().replace(/\\s+/g, \" \");\n}\n\nexport function userMessageProjectionKey(\n item: WorkspaceAgentActivityTimelineItem,\n body: string\n): string | null {\n const normalizedBody = normalizedMessageBody(body);\n if (normalizedBody) {\n return `text:${normalizedBody}`;\n }\n if (!hasRenderableUserPromptContent(item.payload?.content)) {\n return null;\n }\n const clientSubmitId = stringRecordValue(item.payload, \"clientSubmitId\");\n return clientSubmitId\n ? `client-submit:${clientSubmitId}`\n : `event:${item.eventId}`;\n}\n\nexport function isRecentDuplicateUserMessage(\n previous: WorkspaceAgentActivityTimelineItem | undefined,\n current: WorkspaceAgentActivityTimelineItem\n): boolean {\n if (!previous) {\n return false;\n }\n\n const previousTurnId = previous.turnId?.trim();\n const currentTurnId = current.turnId?.trim();\n if (previousTurnId && currentTurnId && previousTurnId === currentTurnId) {\n return true;\n }\n if (previousTurnId && currentTurnId) {\n return false;\n }\n\n const previousOccurredAt = previous.occurredAtUnixMs ?? 0;\n const currentOccurredAt = current.occurredAtUnixMs ?? 0;\n if (previousOccurredAt > 0 && currentOccurredAt > 0) {\n return Math.abs(currentOccurredAt - previousOccurredAt) <= 60_000;\n }\n\n const previousSeq = previous.seq ?? 0;\n const currentSeq = current.seq ?? 0;\n if (previousSeq > 0 && currentSeq > 0) {\n return Math.abs(currentSeq - previousSeq) <= 5;\n }\n\n return false;\n}\n\nfunction hasRenderableUserPromptContent(content: unknown): boolean {\n if (!Array.isArray(content)) {\n return false;\n }\n return content.some((candidate) => {\n if (\n !candidate ||\n typeof candidate !== \"object\" ||\n Array.isArray(candidate)\n ) {\n return false;\n }\n const block = candidate as Record<string, unknown>;\n if (block.type === \"text\") {\n return typeof block.text === \"string\" && block.text.trim().length > 0;\n }\n return (\n block.type === \"image\" &&\n typeof block.mimeType === \"string\" &&\n block.mimeType.trim().length > 0\n );\n });\n}\n\nfunction stringRecordValue(record: unknown, key: string): string | null {\n if (!record || typeof record !== \"object\") {\n return null;\n }\n const value = (record as Record<string, unknown>)[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction firstPresentString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n const normalized = value?.trim();\n if (normalized) {\n return normalized;\n }\n }\n return null;\n}\n\nfunction normalizeStatusToken(value: string | null): string {\n return (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, \"_\");\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"../../workspaceAgentTimelineTypes\";\nimport type { AgentCollaborationVM } from \"../contracts/agentCollaborationVM\";\n\nexport const COLLABORATION_TIMELINE_ITEM_TYPE = \"collaboration\";\n\nexport function isCollaborationTimelineItem(\n item: Pick<WorkspaceAgentActivityTimelineItem, \"itemType\">\n): boolean {\n return (\n item.itemType.trim().toLowerCase() === COLLABORATION_TIMELINE_ITEM_TYPE\n );\n}\n\n/**\n * Pure projection of one durable collaboration message payload into the typed\n * card view model. Returns null when the payload has no run identity, so a\n * malformed row degrades to a plain assistant message instead of a broken\n * card.\n */\nexport function projectAgentCollaborationVM(\n item: Pick<\n WorkspaceAgentActivityTimelineItem,\n \"agentSessionId\" | \"payload\" | \"status\" | \"workspaceId\"\n >\n): AgentCollaborationVM | null {\n const payload = normalizedPayload(item.payload);\n if (!payload) {\n return null;\n }\n const runId = stringField(payload, \"runId\");\n const mode = stringField(payload, \"mode\");\n if (!runId || !mode) {\n return null;\n }\n const status =\n stringField(payload, \"status\") ?? item.status?.trim() ?? \"running\";\n return {\n kind: \"collaboration\",\n runId,\n workspaceId: item.workspaceId?.trim() || null,\n agentSessionId: item.agentSessionId.trim() || null,\n mode,\n status,\n triggerSource: stringField(payload, \"triggerSource\") ?? \"user\",\n triggerReason: stringField(payload, \"triggerReason\"),\n targetSessionId: stringField(payload, \"targetSessionId\"),\n targetAgentTargetId: stringField(payload, \"targetAgentTargetId\"),\n modelPlanId: stringField(payload, \"modelPlanId\"),\n modelPlanName:\n stringField(payload, \"modelPlanName\") ?? stringField(payload, \"planName\"),\n model: stringField(payload, \"model\"),\n contextScope: stringField(payload, \"contextScope\"),\n resultText: stringField(payload, \"resultText\"),\n failureReason: stringField(payload, \"failureReason\"),\n durationMs: positiveNumberField(payload, \"durationMs\"),\n usage: usageField(payload),\n adoption: stringField(payload, \"adoption\") ?? \"not_applicable\"\n };\n}\n\nfunction usageField(\n payload: Record<string, unknown>\n): AgentCollaborationVM[\"usage\"] {\n const usage = normalizedPayload(\n payload.usage as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n if (!usage) {\n return null;\n }\n const inputTokens = nonNegativeNumberValue(usage.inputTokens);\n const outputTokens = nonNegativeNumberValue(usage.outputTokens);\n if (inputTokens === null && outputTokens === null) {\n return null;\n }\n return {\n inputTokens: inputTokens ?? 0,\n outputTokens: outputTokens ?? 0\n };\n}\n\nfunction normalizedPayload(\n payload: WorkspaceAgentActivityTimelineItem[\"payload\"]\n): Record<string, unknown> | null {\n return payload && typeof payload === \"object\" && !Array.isArray(payload)\n ? payload\n : null;\n}\n\nfunction stringField(\n payload: Record<string, unknown>,\n key: string\n): string | null {\n const value = payload[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction positiveNumberField(\n payload: Record<string, unknown>,\n key: string\n): number | null {\n const value = nonNegativeNumberValue(payload[key]);\n return value !== null && value > 0 ? value : null;\n}\n\nfunction nonNegativeNumberValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : null;\n}\n","import type { AgentActivityTurn } from \"@tutti-os/agent-activity-core\";\nimport type {\n WorkspaceAgentSessionDetailMessage,\n WorkspaceAgentSessionDetailTurn\n} from \"./workspaceAgentSessionDetailViewModel\";\n\nexport function projectCanonicalTurnErrors({\n turns,\n sessionTurns,\n provider,\n agentSessionId\n}: {\n turns: Map<string, WorkspaceAgentSessionDetailTurn>;\n sessionTurns: readonly AgentActivityTurn[];\n provider: string;\n agentSessionId: string;\n}): void {\n for (const canonicalTurn of sessionTurns) {\n if (\n canonicalTurn.outcome !== \"failed\" &&\n canonicalTurn.outcome !== \"interrupted\"\n ) {\n continue;\n }\n const detail = canonicalTurn.error?.message.trim() ?? \"\";\n if (!detail) {\n continue;\n }\n\n const turn = getOrCreateTurn(turns, canonicalTurn.turnId);\n if (turn.agentMessages.some((message) => message.visibleError)) {\n continue;\n }\n\n const matchingMessage = turn.agentMessages.find(\n (message) => message.body.trim() === detail\n );\n if (matchingMessage) {\n matchingMessage.status = \"failed\";\n matchingMessage.statusKind = \"failed\";\n matchingMessage.visibleError = visibleErrorFromCanonicalTurn(\n canonicalTurn,\n provider\n );\n continue;\n }\n\n const message: WorkspaceAgentSessionDetailMessage = {\n id: `turn-error:${agentSessionId}:${canonicalTurn.turnId}`,\n body: detail,\n status: \"failed\",\n statusKind: \"failed\",\n turnId: canonicalTurn.turnId,\n occurredAtUnixMs:\n canonicalTurn.settledAtUnixMs ?? canonicalTurn.updatedAtUnixMs,\n visibleError: visibleErrorFromCanonicalTurn(canonicalTurn, provider)\n };\n turn.agentMessages.push(message);\n turn.agentItems.push({ kind: \"message\", message });\n }\n}\n\nfunction getOrCreateTurn(\n turns: Map<string, WorkspaceAgentSessionDetailTurn>,\n turnId: string\n): WorkspaceAgentSessionDetailTurn {\n const existing = turns.get(turnId);\n if (existing) {\n return existing;\n }\n const turn: WorkspaceAgentSessionDetailTurn = {\n id: turnId,\n userMessage: null,\n userMessages: [],\n agentMessages: [],\n toolCalls: [],\n toolCallCount: 0,\n hasFailedToolCall: false,\n agentItems: []\n };\n turns.set(turnId, turn);\n return turn;\n}\n\nfunction visibleErrorFromCanonicalTurn(\n turn: AgentActivityTurn,\n provider: string\n): NonNullable<WorkspaceAgentSessionDetailMessage[\"visibleError\"]> {\n return {\n code: turn.error?.code?.trim() || null,\n phase: \"turn\",\n provider: provider.trim() || null,\n detail: turn.error?.message.trim() || null,\n retryable: null\n };\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport {\n firstPresentString,\n normalizedPayload,\n stringRecordValue\n} from \"./workspaceAgentTimelineProjectionHelpers\";\nimport { resolveWorkspaceAgentToolName } from \"./workspaceAgentToolCallDisplay\";\n\nfunction toolNameFromItem(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n return resolveWorkspaceAgentToolName(item);\n}\n\nexport function normalizeToolName(name: string | null): string {\n return (name ?? \"\")\n .trim()\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n\nexport function suppressedUnavailableAskUserQuestionCallIds(\n items: readonly WorkspaceAgentActivityTimelineItem[]\n): Set<string> {\n const suppressed = new Set<string>();\n for (const item of items) {\n if (\n normalizeToolName(toolNameFromItem(item)) !== \"askuserquestion\" ||\n !isUnavailableAskUserQuestionFailure(item)\n ) {\n continue;\n }\n const callId = toolCallSuppressionId(item);\n if (callId) {\n suppressed.add(callId);\n }\n }\n return suppressed;\n}\n\nexport function shouldSuppressToolCall(\n item: WorkspaceAgentActivityTimelineItem,\n suppressedToolCallIds: ReadonlySet<string>\n): boolean {\n const callId = toolCallSuppressionId(item);\n return callId ? suppressedToolCallIds.has(callId) : false;\n}\n\nfunction toolCallSuppressionId(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n return firstPresentString(\n item.callId,\n stringRecordValue(item.payload, \"callId\"),\n stringRecordValue(item.payload, \"toolCallId\")\n );\n}\n\nfunction isUnavailableAskUserQuestionFailure(\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const status = firstPresentString(\n item.status,\n stringRecordValue(item.payload, \"status\")\n );\n if (status !== \"failed\") {\n return false;\n }\n const payload = normalizedPayload(item.payload);\n const output = normalizedPayload(\n payload?.output as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const error = normalizedPayload(\n payload?.error as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const message = firstPresentString(\n stringRecordValue(output, \"output\"),\n stringRecordValue(output, \"text\"),\n stringRecordValue(output, \"message\"),\n stringRecordValue(error, \"error\"),\n stringRecordValue(error, \"message\"),\n stringRecordValue(payload, \"error\"),\n stringRecordValue(payload, \"message\")\n );\n return message?.includes(\"No such tool available: AskUserQuestion\") ?? false;\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport { appendWorkspaceAgentGoalControl } from \"./workspaceAgentGoalControlProjection\";\nimport { isWorkspaceAgentToolCallItem } from \"./workspaceAgentToolCallDisplay\";\nimport type {\n BuildWorkspaceAgentSessionDetailInput,\n WorkspaceAgentSessionDetailAgentItem,\n WorkspaceAgentSessionDetailGoalControl,\n WorkspaceAgentSessionDetailToolCall,\n WorkspaceAgentSessionDetailToolGroupEntry,\n WorkspaceAgentSessionDetailTurn,\n WorkspaceAgentSessionDetailViewModel\n} from \"./workspaceAgentSessionDetailViewModel\";\nimport {\n isPlaceholderThinkingBody,\n isRecentDuplicateUserMessage,\n messageBody,\n messageRole,\n messageStatusKind,\n normalizedMessageBody,\n stripReviewProcessSummaryTitle,\n thinkingStatusKind,\n userMessageProjectionKey\n} from \"./workspaceAgentTimelineMessageHelpers\";\nimport { isCollaborationTimelineItem } from \"./agentConversation/projection/agentCollaborationProjection\";\nimport {\n compareToolCallsAscending,\n delegatedToolStepFromCall,\n firstPresentString,\n isTaskLikeToolCall,\n mergeSourceTimelineItems,\n normalizedPayload,\n parentToolUseIdFromCall,\n shouldShowProcessingIndicator,\n stringRecordValue,\n summarizeToolCallGroup,\n systemNoticeFromPayload,\n toolCallView,\n visibleErrorFromPayload,\n withSourceTimelineItems\n} from \"./workspaceAgentTimelineProjectionHelpers\";\nimport { projectCanonicalTurnErrors } from \"./workspaceAgentTurnErrorProjection\";\nimport {\n normalizeToolName,\n shouldSuppressToolCall,\n suppressedUnavailableAskUserQuestionCallIds\n} from \"./workspaceAgentTimelineSuppression\";\n\nexport function buildCanonicalWorkspaceAgentDetailView({\n activity,\n session,\n sessionTurns = [],\n timelineItems,\n workspaceRoot = null\n}: BuildWorkspaceAgentSessionDetailInput): WorkspaceAgentSessionDetailViewModel {\n const turns = new Map<string, WorkspaceAgentSessionDetailTurn>();\n const goalControls: WorkspaceAgentSessionDetailGoalControl[] = [];\n const recentUserMessages = new Map<\n string,\n WorkspaceAgentActivityTimelineItem\n >();\n const seenThinkingMessages = new Set<string>();\n let activeSequenceTurnId: string | null = null;\n const sortedTimelineItems = [...timelineItems].sort(\n compareTimelineItemsAscending\n );\n const suppressedToolCallIds =\n suppressedUnavailableAskUserQuestionCallIds(sortedTimelineItems);\n\n for (const item of sortedTimelineItems) {\n const role = messageRole(item);\n const body = messageBody(item);\n const explicitTurnId = item.turnId?.trim();\n\n if (\n appendWorkspaceAgentGoalControl(goalControls, item, itemId(item), body)\n ) {\n continue;\n }\n\n if (role === \"user\") {\n const turnId = explicitTurnId || `seq:${item.seq || item.id}`;\n const projectionKey = userMessageProjectionKey(item, body);\n if (!projectionKey) {\n continue;\n }\n if (\n isRecentDuplicateUserMessage(\n recentUserMessages.get(projectionKey),\n item\n )\n ) {\n continue;\n }\n activeSequenceTurnId = turnId;\n const turn = getTurn(turns, turnId);\n const message = withSourceTimelineItems(\n {\n id: itemId(item),\n body,\n turnId,\n occurredAtUnixMs:\n item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null\n },\n [item]\n );\n turn.userMessages.push(message);\n turn.userMessage ??= message;\n recentUserMessages.set(projectionKey, item);\n continue;\n }\n\n const turnId =\n explicitTurnId || activeSequenceTurnId || `seq:${item.seq || item.id}`;\n const turn = getTurn(turns, turnId);\n\n // Collaboration runs render as a dedicated card. Unlike ordinary agent\n // messages they must stay visible while their body (resultText) is still\n // empty — a running consult has no output yet — so this branch does not\n // require a non-empty body.\n if (isCollaborationTimelineItem(item)) {\n const status = firstPresentString(\n item.status,\n stringRecordValue(item.payload, \"status\")\n );\n const statusKind = messageStatusKind(status);\n const message = withSourceTimelineItems(\n {\n id: itemId(item),\n body,\n ...(status ? { status } : {}),\n ...(statusKind ? { statusKind } : {}),\n turnId,\n occurredAtUnixMs:\n item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null\n },\n [item]\n );\n turn.agentMessages.push(message);\n turn.agentItems.push({ kind: \"message\", message });\n continue;\n }\n\n if (isWorkspaceAgentToolCallItem(item)) {\n if (shouldSuppressToolCall(item, suppressedToolCallIds)) {\n continue;\n }\n upsertToolCall(turn, item);\n continue;\n }\n\n if (role === \"thinking\" && body) {\n const payload = normalizedPayload(item.payload);\n if (payload?.messageKind === \"review-process\") {\n const status = firstPresentString(\n item.status,\n stringRecordValue(payload, \"status\")\n );\n const statusKind = messageStatusKind(status);\n const message = withSourceTimelineItems(\n {\n id: itemId(item),\n body: stripReviewProcessSummaryTitle(body),\n ...(status ? { status } : {}),\n ...(statusKind ? { statusKind } : {}),\n turnId,\n occurredAtUnixMs:\n item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null\n },\n [item]\n );\n turn.agentMessages.push(message);\n turn.agentItems.push({ kind: \"message\", message });\n continue;\n }\n if (isPlaceholderThinkingBody(body)) {\n continue;\n }\n const duplicateKey = `${turnId}\\u0000${normalizedMessageBody(body)}`;\n if (seenThinkingMessages.has(duplicateKey)) {\n continue;\n }\n seenThinkingMessages.add(duplicateKey);\n const statusKind = thinkingStatusKind(item);\n const thinking = withSourceTimelineItems(\n {\n id: itemId(item),\n body,\n ...(statusKind ? { statusKind } : {}),\n turnId,\n occurredAtUnixMs:\n item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null\n },\n [item]\n );\n turn.agentItems.push({ kind: \"thinking\", thinking });\n continue;\n }\n\n if (role === \"agent\" && body) {\n const payload = normalizedPayload(item.payload);\n const visibleError = visibleErrorFromPayload(payload);\n const systemNotice = systemNoticeFromPayload(payload, item);\n const status = firstPresentString(\n item.status,\n stringRecordValue(payload, \"status\")\n );\n const statusKind = messageStatusKind(status);\n const message = withSourceTimelineItems(\n {\n id: itemId(item),\n body,\n ...(status ? { status } : {}),\n ...(statusKind ? { statusKind } : {}),\n turnId,\n occurredAtUnixMs:\n item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null,\n ...(visibleError ? { visibleError } : {}),\n ...(systemNotice ? { systemNotice } : {})\n },\n [item]\n );\n turn.agentMessages.push(message);\n turn.agentItems.push({ kind: \"message\", message });\n }\n }\n\n projectCanonicalTurnErrors({\n turns,\n sessionTurns:\n sessionTurns.length > 0\n ? sessionTurns\n : session.latestTurn\n ? [session.latestTurn]\n : [],\n provider: session.provider,\n agentSessionId: session.agentSessionId\n });\n\n const visibleTurns = [...turns.values()].filter(\n (turn) => turn.userMessages.length > 0 || turn.agentItems.length > 0\n );\n nestDelegatedToolCallsAcrossTurns(visibleTurns);\n visibleTurns.forEach(mergeBackgroundTerminalContinuations);\n visibleTurns.forEach((turn) => {\n turn.rawAgentItems = [...turn.agentItems];\n turn.agentItems = regroupAgentItems(turn.agentItems);\n });\n\n return {\n activity,\n session,\n sessionTurns,\n cwd: session.cwd.trim(),\n workspaceRoot: workspaceRoot?.trim() || null,\n goalControls,\n turns: visibleTurns,\n showProcessingIndicator: shouldShowProcessingIndicator(\n session,\n visibleTurns\n )\n };\n}\n\nfunction getTurn(\n turns: Map<string, WorkspaceAgentSessionDetailTurn>,\n id: string\n): WorkspaceAgentSessionDetailTurn {\n const existing = turns.get(id);\n if (existing) {\n return existing;\n }\n const turn: WorkspaceAgentSessionDetailTurn = {\n id,\n userMessage: null,\n userMessages: [],\n agentMessages: [],\n toolCalls: [],\n toolCallCount: 0,\n hasFailedToolCall: false,\n agentItems: []\n };\n turns.set(id, turn);\n return turn;\n}\n\nfunction compareTimelineItemsAscending(\n left: WorkspaceAgentActivityTimelineItem,\n right: WorkspaceAgentActivityTimelineItem\n): number {\n const leftSeq = left.seq ?? 0;\n const rightSeq = right.seq ?? 0;\n if (leftSeq > 0 && rightSeq > 0 && leftSeq !== rightSeq) {\n return leftSeq - rightSeq;\n }\n return (\n (left.occurredAtUnixMs ?? left.createdAtUnixMs ?? 0) -\n (right.occurredAtUnixMs ?? right.createdAtUnixMs ?? 0) ||\n leftSeq - rightSeq ||\n left.id - right.id\n );\n}\n\nfunction itemId(item: WorkspaceAgentActivityTimelineItem): string {\n const eventId = item.eventId?.trim();\n if (eventId) {\n return eventId;\n }\n const seq = item.seq ?? 0;\n return seq > 0 ? `seq:${seq}` : `id:${item.id}`;\n}\n\nfunction upsertToolCall(\n turn: WorkspaceAgentSessionDetailTurn,\n item: WorkspaceAgentActivityTimelineItem\n): void {\n const call = toolCallView(item);\n const existingIndex = turn.toolCalls.findIndex(\n (existing) => existing.id === call.id\n );\n if (existingIndex >= 0) {\n const existing = turn.toolCalls[existingIndex];\n if (!existing) {\n return;\n }\n turn.toolCalls[existingIndex] = mergeToolCallDetail(existing, call);\n } else {\n turn.toolCalls.push(call);\n }\n turn.toolCallCount = turn.toolCalls.length;\n turn.hasFailedToolCall = turn.toolCalls.some(\n (existing) => existing.statusKind === \"failed\"\n );\n upsertToolCallAgentItem(turn, call, itemId(item));\n}\n\nfunction upsertToolCallAgentItem(\n turn: WorkspaceAgentSessionDetailTurn,\n call: WorkspaceAgentSessionDetailToolCall,\n sourceId: string\n): void {\n for (const entry of turn.agentItems) {\n if (entry.kind !== \"tool-calls\") {\n continue;\n }\n const existingIndex = entry.toolCalls.findIndex(\n (existing) => existing.id === call.id\n );\n if (existingIndex >= 0) {\n const existing = entry.toolCalls[existingIndex];\n if (!existing) {\n continue;\n }\n entry.toolCalls[existingIndex] = mergeToolCallDetail(existing, call);\n refreshToolCallAgentItem(entry);\n return;\n }\n }\n\n const entry: WorkspaceAgentSessionDetailAgentItem = {\n kind: \"tool-calls\",\n id: `tools:${sourceId}`,\n toolCalls: [call],\n toolCallCount: 1,\n hasFailedToolCall: call.statusKind === \"failed\"\n };\n turn.agentItems.push(entry);\n}\n\nfunction refreshToolCallAgentItem(\n entry: Extract<WorkspaceAgentSessionDetailAgentItem, { kind: \"tool-calls\" }>\n): void {\n entry.toolCallCount = entry.toolCalls.length;\n entry.hasFailedToolCall = entry.toolCalls.some(\n (existing) => existing.statusKind === \"failed\"\n );\n const summary = summarizeToolCallGroup(entry.toolCalls);\n if (summary) {\n entry.summary = summary;\n } else {\n delete entry.summary;\n }\n}\n\nfunction regroupAgentItems(\n items: readonly WorkspaceAgentSessionDetailAgentItem[]\n): WorkspaceAgentSessionDetailAgentItem[] {\n const regrouped: WorkspaceAgentSessionDetailAgentItem[] = [];\n let pending: Array<\n Extract<WorkspaceAgentSessionDetailAgentItem, { kind: \"tool-calls\" }>\n > = [];\n\n const flushPending = () => {\n if (pending.length === 0) {\n return;\n }\n const groupedCalls = pending.flatMap((item) => item.toolCalls);\n if (groupedCalls.length >= 2) {\n regrouped.push({\n kind: \"tool-calls\",\n id: pending.map((item) => item.id).join(\"+\"),\n toolCalls: groupedCalls,\n toolCallCount: groupedCalls.length,\n hasFailedToolCall: groupedCalls.some(\n (call) => call.statusKind === \"failed\"\n ),\n summary: summarizeToolCallGroup(groupedCalls),\n groupEntries:\n pending.flatMap<WorkspaceAgentSessionDetailToolGroupEntry>((item) =>\n item.toolCalls.map((call) => ({ kind: \"tool-call\", call }))\n )\n });\n } else {\n regrouped.push(...pending);\n }\n pending = [];\n };\n\n for (const item of items) {\n if (item.kind === \"tool-calls\" && isGroupableToolCallItem(item)) {\n pending.push(item);\n continue;\n }\n flushPending();\n regrouped.push(item);\n }\n\n flushPending();\n return regrouped;\n}\n\nfunction isGroupableToolCallItem(\n item: Extract<WorkspaceAgentSessionDetailAgentItem, { kind: \"tool-calls\" }>\n): boolean {\n return (\n item.toolCalls.length === 1 &&\n item.toolCalls.every((call) => isGroupableToolCall(call))\n );\n}\n\nfunction mergeToolCallDetail(\n previous: WorkspaceAgentSessionDetailToolCall,\n next: WorkspaceAgentSessionDetailToolCall\n): WorkspaceAgentSessionDetailToolCall {\n return withSourceTimelineItems(\n {\n ...next,\n name: next.name || previous.name,\n toolName: next.toolName || previous.toolName,\n callType: next.callType || previous.callType,\n summary: next.summary || previous.summary,\n payload: next.payload ?? previous.payload\n },\n mergeSourceTimelineItems(\n previous.sourceTimelineItems,\n next.sourceTimelineItems\n )\n );\n}\n\nfunction mergeBackgroundTerminalContinuations(\n turn: WorkspaceAgentSessionDetailTurn\n): void {\n if (turn.agentItems.length === 0 || turn.toolCalls.length === 0) {\n return;\n }\n\n const removedCallIDs = new Set<string>();\n\n for (let index = 0; index < turn.agentItems.length; index += 1) {\n const item = turn.agentItems[index];\n if (!item) {\n continue;\n }\n if (item.kind !== \"tool-calls\" || item.toolCalls.length !== 1) {\n continue;\n }\n const primaryCall = item.toolCalls[0];\n if (!primaryCall) {\n continue;\n }\n const terminalSessionID = backgroundTerminalSessionID(primaryCall);\n if (!terminalSessionID) {\n continue;\n }\n\n for (\n let nextIndex = index + 1;\n nextIndex < turn.agentItems.length;\n nextIndex += 1\n ) {\n const nextItem = turn.agentItems[nextIndex];\n if (!nextItem) {\n continue;\n }\n if (nextItem.kind !== \"tool-calls\" || nextItem.toolCalls.length !== 1) {\n continue;\n }\n const continuationCall = nextItem.toolCalls[0];\n if (!continuationCall) {\n continue;\n }\n if (\n !isBackgroundTerminalContinuation(continuationCall, terminalSessionID)\n ) {\n break;\n }\n\n const mergedCall = mergeBackgroundTerminalCall(\n primaryCall,\n continuationCall\n );\n item.toolCalls[0] = mergedCall;\n const turnToolIndex = turn.toolCalls.findIndex(\n (existing) => existing.id === primaryCall.id\n );\n if (turnToolIndex >= 0) {\n turn.toolCalls[turnToolIndex] = mergedCall;\n }\n refreshToolCallAgentItem(item);\n removedCallIDs.add(continuationCall.id);\n turn.agentItems.splice(nextIndex, 1);\n break;\n }\n }\n\n if (removedCallIDs.size === 0) {\n return;\n }\n\n turn.toolCalls = turn.toolCalls.filter(\n (call) => !removedCallIDs.has(call.id)\n );\n turn.toolCallCount = turn.toolCalls.length;\n turn.hasFailedToolCall = turn.toolCalls.some(\n (existing) => existing.statusKind === \"failed\"\n );\n}\n\nfunction mergeBackgroundTerminalCall(\n primary: WorkspaceAgentSessionDetailToolCall,\n continuation: WorkspaceAgentSessionDetailToolCall\n): WorkspaceAgentSessionDetailToolCall {\n const continuationOutput = normalizedPayload(\n continuation.payload\n ?.output as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const mergedPayload = primary.payload ? { ...primary.payload } : {};\n if (continuationOutput) {\n mergedPayload.output = continuationOutput;\n }\n return {\n ...primary,\n status: continuation.status || primary.status,\n statusKind: continuation.statusKind || primary.statusKind,\n payload:\n Object.keys(mergedPayload).length > 0 ? mergedPayload : primary.payload,\n occurredAtUnixMs: continuation.occurredAtUnixMs ?? primary.occurredAtUnixMs\n };\n}\n\nfunction nestDelegatedToolCallsAcrossTurns(\n turns: readonly WorkspaceAgentSessionDetailTurn[]\n): void {\n if (turns.length === 0) {\n return;\n }\n const parentCalls = new Map<string, WorkspaceAgentSessionDetailToolCall>();\n const callTurnByID = new Map<string, WorkspaceAgentSessionDetailTurn>();\n for (const turn of turns) {\n for (const call of turn.toolCalls) {\n parentCalls.set(call.id, call);\n parentCalls.set(call.id.replace(/^call:/, \"\"), call);\n callTurnByID.set(call.id, turn);\n callTurnByID.set(call.id.replace(/^call:/, \"\"), turn);\n }\n }\n const childCallsByParent = new Map<\n string,\n WorkspaceAgentSessionDetailToolCall[]\n >();\n for (const turn of turns) {\n for (const call of turn.toolCalls) {\n const parentToolUseId = parentToolUseIdFromCall(call);\n if (!parentToolUseId) {\n continue;\n }\n const parentCall = parentCalls.get(parentToolUseId);\n if (!parentCall || !isTaskLikeToolCall(parentCall)) {\n continue;\n }\n const children = childCallsByParent.get(parentToolUseId) ?? [];\n children.push(call);\n childCallsByParent.set(parentToolUseId, children);\n }\n }\n if (childCallsByParent.size === 0) {\n return;\n }\n const removeIDsByTurn = new Map<\n WorkspaceAgentSessionDetailTurn,\n Set<string>\n >();\n for (const [parentID, childCalls] of childCallsByParent.entries()) {\n const parentCall = parentCalls.get(parentID);\n if (!parentCall) {\n continue;\n }\n appendDelegatedToolSteps(parentCall, childCalls);\n for (const childCall of childCalls) {\n const childTurn = callTurnByID.get(childCall.id);\n if (!childTurn) {\n continue;\n }\n const removeIDs = removeIDsByTurn.get(childTurn) ?? new Set<string>();\n removeIDs.add(childCall.id);\n removeIDsByTurn.set(childTurn, removeIDs);\n }\n }\n for (const [turn, removeIDs] of removeIDsByTurn.entries()) {\n pruneTurnToolCalls(turn, removeIDs);\n }\n}\n\nfunction backgroundTerminalSessionID(\n call: WorkspaceAgentSessionDetailToolCall\n): string | null {\n const outputText = stringRecordValue(call.payload?.output, \"output\");\n if (!outputText) {\n return null;\n }\n const match = outputText.match(/Process running with session ID (\\d+)/i);\n return match?.[1] ?? null;\n}\n\nfunction isBackgroundTerminalContinuation(\n call: WorkspaceAgentSessionDetailToolCall,\n sessionID: string\n): boolean {\n const input = normalizedPayload(\n call.payload?.input as WorkspaceAgentActivityTimelineItem[\"payload\"]\n );\n const inputSessionID = firstPresentString(\n stringRecordValue(input, \"session_id\"),\n stringRecordValue(input, \"sessionId\")\n );\n if (inputSessionID !== sessionID) {\n return false;\n }\n const chars = firstPresentString(stringRecordValue(input, \"chars\")) ?? \"\";\n if (chars !== \"\") {\n return false;\n }\n return stringRecordValue(call.payload?.output, \"output\") !== null;\n}\n\nfunction isGroupableToolCall(\n call: WorkspaceAgentSessionDetailToolCall\n): boolean {\n if (\n call.callType === \"approval\" ||\n call.callType === \"interactive\" ||\n call.callType === \"subagent\"\n ) {\n return false;\n }\n switch (normalizeToolName(call.toolName)) {\n case \"askuserquestion\":\n case \"enterplanmode\":\n case \"exitplanmode\":\n case \"task\":\n case \"subagent\":\n case \"delegatetask\":\n return false;\n default:\n return true;\n }\n}\n\nfunction pruneTurnToolCalls(\n turn: WorkspaceAgentSessionDetailTurn,\n removeIDs: ReadonlySet<string>\n): void {\n if (removeIDs.size === 0) {\n return;\n }\n turn.toolCalls = turn.toolCalls.filter((call) => !removeIDs.has(call.id));\n turn.toolCallCount = turn.toolCalls.length;\n turn.hasFailedToolCall = turn.toolCalls.some(\n (existing) => existing.statusKind === \"failed\"\n );\n turn.agentItems =\n turn.agentItems.flatMap<WorkspaceAgentSessionDetailAgentItem>((item) => {\n if (item.kind !== \"tool-calls\") {\n return [item];\n }\n const toolCalls = item.toolCalls.filter(\n (call) => !removeIDs.has(call.id)\n );\n if (toolCalls.length === 0) {\n return [];\n }\n const nextItem = {\n ...item,\n toolCalls\n };\n refreshToolCallAgentItem(nextItem);\n return [nextItem];\n });\n}\n\nfunction appendDelegatedToolSteps(\n parentCall: WorkspaceAgentSessionDetailToolCall,\n childCalls: readonly WorkspaceAgentSessionDetailToolCall[]\n): void {\n const nextPayload = parentCall.payload ? { ...parentCall.payload } : {};\n const nextMetadata =\n normalizedPayload(\n nextPayload.metadata as WorkspaceAgentActivityTimelineItem[\"payload\"]\n ) ?? {};\n const existingSteps = Array.isArray(nextMetadata.steps)\n ? [...nextMetadata.steps]\n : [];\n const existingStepIDs = new Set(\n existingSteps\n .map((step) =>\n normalizedPayload(step as WorkspaceAgentActivityTimelineItem[\"payload\"])\n )\n .map(\n (step) =>\n stringRecordValue(step, \"toolUseId\") ?? stringRecordValue(step, \"id\")\n )\n .filter((value): value is string => Boolean(value))\n );\n for (const childCall of [...childCalls].sort(compareToolCallsAscending)) {\n const step = delegatedToolStepFromCall(childCall);\n const stepID =\n stringRecordValue(step, \"toolUseId\") ?? stringRecordValue(step, \"id\");\n if (stepID && existingStepIDs.has(stepID)) {\n continue;\n }\n if (stepID) {\n existingStepIDs.add(stepID);\n }\n existingSteps.push(step);\n }\n nextMetadata.steps = existingSteps;\n nextPayload.metadata = nextMetadata;\n parentCall.payload = nextPayload;\n}\n","import type {\n AgentActivityGoalControlAction,\n AgentActivityMessageSemantics,\n AgentActivitySession,\n AgentActivityTurn\n} from \"@tutti-os/agent-activity-core\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\nimport type { WorkspaceAgentActivityCard } from \"./workspaceAgentActivityListViewModel\";\nimport type { ToolCallStatusKind } from \"./workspaceAgentToolCallDisplay\";\nimport { buildCanonicalWorkspaceAgentDetailView } from \"./workspaceAgentTimelineCanonical\";\n\nexport interface WorkspaceAgentSessionDetailMessage {\n id: string;\n body: string;\n status?: string | null;\n statusKind?: ToolCallStatusKind | null;\n turnId?: string;\n occurredAtUnixMs?: number | null;\n sourceTimelineItems?: WorkspaceAgentActivityTimelineItem[];\n visibleError?: {\n code: string | null;\n phase: string | null;\n provider: string | null;\n detail: string | null;\n retryable: boolean | null;\n } | null;\n systemNotice?: {\n noticeKind: string | null;\n severity: string | null;\n source?: string | null;\n command?: AgentActivityMessageSemantics[\"noticeCommand\"] | null;\n commandStatus?: AgentActivityMessageSemantics[\"noticeCommandStatus\"] | null;\n title: string | null;\n detail: string | null;\n retryable: boolean | null;\n } | null;\n}\n\nexport interface WorkspaceAgentSessionDetailThinking {\n id: string;\n body: string;\n statusKind?: ToolCallStatusKind | null;\n turnId?: string;\n occurredAtUnixMs?: number | null;\n sourceTimelineItems?: WorkspaceAgentActivityTimelineItem[];\n}\n\nexport interface WorkspaceAgentSessionDetailGoalControl {\n id: string;\n action: AgentActivityGoalControlAction;\n body: string;\n occurredAtUnixMs?: number | null;\n sourceTimelineItems?: WorkspaceAgentActivityTimelineItem[];\n}\n\nexport interface WorkspaceAgentSessionDetailToolCall {\n id: string;\n name: string;\n toolName: string | null;\n callType: string | null;\n status: string | null;\n statusKind: ToolCallStatusKind | null;\n summary: string;\n payload: Record<string, unknown> | null;\n turnId?: string;\n compactSummary?: string | null;\n occurredAtUnixMs?: number | null;\n sourceTimelineItems?: WorkspaceAgentActivityTimelineItem[];\n}\n\nexport type WorkspaceAgentSessionDetailToolGroupEntry =\n | {\n kind: \"thinking\";\n thinking: WorkspaceAgentSessionDetailThinking;\n }\n | {\n kind: \"tool-call\";\n call: WorkspaceAgentSessionDetailToolCall;\n };\n\nexport type WorkspaceAgentSessionDetailAgentItem =\n | {\n kind: \"message\";\n message: WorkspaceAgentSessionDetailMessage;\n }\n | {\n kind: \"thinking\";\n thinking: WorkspaceAgentSessionDetailThinking;\n }\n | {\n kind: \"tool-calls\";\n id: string;\n toolCalls: WorkspaceAgentSessionDetailToolCall[];\n toolCallCount: number;\n hasFailedToolCall: boolean;\n summary?: string | null;\n groupEntries?: WorkspaceAgentSessionDetailToolGroupEntry[];\n };\n\nexport interface WorkspaceAgentSessionDetailTurn {\n id: string;\n userMessage: WorkspaceAgentSessionDetailMessage | null;\n userMessages: WorkspaceAgentSessionDetailMessage[];\n agentMessages: WorkspaceAgentSessionDetailMessage[];\n toolCalls: WorkspaceAgentSessionDetailToolCall[];\n toolCallCount: number;\n hasFailedToolCall: boolean;\n rawAgentItems?: WorkspaceAgentSessionDetailAgentItem[];\n agentItems: WorkspaceAgentSessionDetailAgentItem[];\n}\n\nexport interface WorkspaceAgentSessionDetailViewModel {\n activity: WorkspaceAgentActivityCard;\n session: AgentActivitySession;\n cwd: string;\n workspaceRoot: string | null;\n goalControls?: WorkspaceAgentSessionDetailGoalControl[];\n turns: WorkspaceAgentSessionDetailTurn[];\n sessionTurns?: readonly AgentActivityTurn[];\n showProcessingIndicator?: boolean;\n}\n\nexport interface BuildWorkspaceAgentSessionDetailInput {\n activity: WorkspaceAgentActivityCard;\n session: AgentActivitySession;\n sessionTurns?: readonly AgentActivityTurn[];\n timelineItems: WorkspaceAgentActivityTimelineItem[];\n workspaceRoot?: string | null;\n}\n\nexport function buildWorkspaceAgentSessionDetailViewModel(\n input: BuildWorkspaceAgentSessionDetailInput\n): WorkspaceAgentSessionDetailViewModel {\n return buildCanonicalWorkspaceAgentDetailView(input);\n}\n","import type { WorkspaceAgentSessionDetailViewModel } from \"../../workspaceAgentSessionDetailViewModel\";\nimport type {\n AgentMessageContentVM,\n AgentMessageRowVM\n} from \"../contracts/agentMessageRowVM\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\n\nexport function projectAgentMessageFinalText(\n rows: readonly AgentTranscriptRowVM[],\n detail: WorkspaceAgentSessionDetailViewModel\n): AgentTranscriptRowVM[] {\n const finalTextTargetKeys = findLatestAssistantFinalTextTargetKeys(\n rows,\n buildAssistantFinalTextEligibleTurnIds(detail)\n );\n return rows.map((row) => {\n if (row.kind !== \"message\") {\n return row;\n }\n\n let changed = false;\n const messages = row.messages.map((message) => {\n const isTurnFinalText =\n row.speaker === \"assistant\" &&\n finalTextTargetKeys.has(messagePresentationTargetKey(row, message));\n const copyText =\n row.speaker === \"user\"\n ? copyTextForUserMessage(message)\n : isTurnFinalText\n ? message.body\n : null;\n if (\n (message.copyText ?? null) === copyText &&\n message.isTurnFinalText === (isTurnFinalText ? true : undefined)\n ) {\n return message;\n }\n changed = true;\n const nextMessage = isTurnFinalText\n ? { ...message, isTurnFinalText: true as const }\n : omitTurnFinalText(message);\n if (copyText) {\n return { ...nextMessage, copyText };\n }\n const { copyText: _copyText, ...withoutCopyText } = nextMessage;\n return withoutCopyText;\n });\n\n return changed ? { ...row, messages } : row;\n });\n}\n\nfunction omitTurnFinalText(\n message: AgentMessageContentVM\n): AgentMessageContentVM {\n const { isTurnFinalText: _isTurnFinalText, ...withoutTurnFinalText } =\n message;\n return withoutTurnFinalText;\n}\n\nfunction buildAssistantFinalTextEligibleTurnIds(\n detail: WorkspaceAgentSessionDetailViewModel\n): ReadonlySet<string> {\n const ids = new Set<string>();\n detail.turns.forEach((turn, index) => {\n if (\n index < detail.turns.length - 1 ||\n isLatestTranscriptTurnSettled(detail)\n ) {\n ids.add(turn.id);\n }\n });\n return ids;\n}\n\nfunction isLatestTranscriptTurnSettled(\n detail: WorkspaceAgentSessionDetailViewModel\n): boolean {\n const latestTranscriptTurnId = detail.turns.at(-1)?.id;\n const canonicalTurn = detail.sessionTurns?.find(\n (turn) => turn.turnId === latestTranscriptTurnId\n );\n const activeTurn = detail.session.activeTurn;\n if (\n activeTurn &&\n activeTurn.turnId === latestTranscriptTurnId &&\n activeTurn.phase !== \"settled\"\n ) {\n return false;\n }\n if (canonicalTurn) {\n return (\n canonicalTurn.phase === \"settled\" &&\n detail.showProcessingIndicator !== true\n );\n }\n const activePhase = activeTurn?.phase ?? \"\";\n return (\n detail.showProcessingIndicator !== true &&\n ![\"submitted\", \"running\", \"waiting\", \"settling\"].includes(activePhase)\n );\n}\n\nfunction findLatestAssistantFinalTextTargetKeys(\n rows: readonly AgentTranscriptRowVM[],\n eligibleTurnIds: ReadonlySet<string>\n): ReadonlySet<string> {\n const targetKeys = new Set<string>();\n const coveredTurnIds = new Set<string>();\n for (let rowIndex = rows.length - 1; rowIndex >= 0; rowIndex -= 1) {\n const row = rows[rowIndex];\n if (\n row?.kind !== \"message\" ||\n row.speaker !== \"assistant\" ||\n coveredTurnIds.has(row.turnId) ||\n !eligibleTurnIds.has(row.turnId)\n ) {\n continue;\n }\n for (\n let messageIndex = row.messages.length - 1;\n messageIndex >= 0;\n messageIndex -= 1\n ) {\n const message = row.messages[messageIndex];\n if (message && isSettledAssistantFinalTextCandidate(message)) {\n targetKeys.add(messagePresentationTargetKey(row, message));\n coveredTurnIds.add(row.turnId);\n break;\n }\n }\n }\n return targetKeys;\n}\n\nfunction messagePresentationTargetKey(\n row: AgentMessageRowVM,\n message: AgentMessageContentVM\n): string {\n return `${row.id}\\u0000${message.id}`;\n}\n\nfunction copyTextForUserMessage(message: AgentMessageContentVM): string | null {\n return isVisibleTextMessage(message) ? message.body : null;\n}\n\nfunction isSettledAssistantFinalTextCandidate(\n message: AgentMessageContentVM\n): boolean {\n return (\n isVisibleTextMessage(message) &&\n message.statusKind !== \"working\" &&\n message.statusKind !== \"waiting\"\n );\n}\n\nfunction isVisibleTextMessage(message: AgentMessageContentVM): boolean {\n return (\n message.body.trim() !== \"\" &&\n message.contentKind !== \"image-grid\" &&\n message.contentKind !== \"collaboration\" &&\n !message.visibleError &&\n !message.systemNotice\n );\n}\n","import type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport type {\n AgentToolGroupEntryVM,\n AgentToolGroupRowVM\n} from \"../contracts/agentToolGroupRowVM\";\nimport type { AgentTurnSequenceItemVM } from \"./agentTurnSequenceProjection\";\n\nconst AVOID_GROUPING_EDITS = false;\n\nexport interface AgentComputedToolGroupVM {\n startIndex: number;\n endIndex: number;\n calls: AgentToolCallVM[];\n entries: AgentToolGroupEntryVM[];\n}\n\nexport interface AgentComputedToolGroupInfoVM {\n groups: Map<number, AgentComputedToolGroupVM>;\n groupedIndices: Set<number>;\n suppressedIndices: Set<number>;\n}\n\nexport function computeAgentToolGroups(\n sequence: readonly AgentTurnSequenceItemVM[],\n {\n avoidGroupingEdits = AVOID_GROUPING_EDITS\n }: {\n avoidGroupingEdits?: boolean;\n }\n): AgentComputedToolGroupInfoVM {\n const groups = new Map<number, AgentComputedToolGroupVM>();\n const groupedIndices = new Set<number>();\n const suppressedIndices = new Set<number>();\n\n let currentCalls: AgentToolCallVM[] = [];\n let currentEntries: AgentToolGroupEntryVM[] = [];\n let currentIndices: number[] = [];\n let pendingBridgeEntries: AgentToolGroupEntryVM[] = [];\n let pendingBridgeIndices: number[] = [];\n let startIndex = -1;\n\n const finalizeGroup = () => {\n if (\n currentCalls.length >= 1 &&\n startIndex >= 0 &&\n currentIndices.length > 0\n ) {\n const endIndex = currentIndices[currentIndices.length - 1] ?? startIndex;\n groups.set(startIndex, {\n startIndex,\n endIndex,\n calls: [...currentCalls],\n entries: [...currentEntries]\n });\n currentIndices.forEach((index) => groupedIndices.add(index));\n }\n currentCalls = [];\n currentEntries = [];\n currentIndices = [];\n pendingBridgeEntries = [];\n pendingBridgeIndices = [];\n startIndex = -1;\n };\n\n for (let index = 0; index < sequence.length; index += 1) {\n const item = sequence[index];\n if (!item) {\n continue;\n }\n if (item.kind === \"tool-call\" && isGroupableToolCall(item.call)) {\n if (avoidGroupingEdits && isEditBoundaryToolCall(item.call)) {\n finalizeGroup();\n continue;\n }\n if (startIndex < 0) {\n startIndex = index;\n }\n if (pendingBridgeEntries.length > 0) {\n currentEntries.push(...pendingBridgeEntries);\n currentIndices.push(...pendingBridgeIndices);\n pendingBridgeEntries = [];\n pendingBridgeIndices = [];\n }\n currentCalls.push(item.call);\n currentEntries.push({ kind: \"tool-call\", call: item.call });\n currentIndices.push(index);\n continue;\n }\n\n if (\n item.kind === \"thinking\" &&\n startIndex >= 0 &&\n currentCalls.length > 0\n ) {\n pendingBridgeEntries.push({ kind: \"thinking\", thinking: item.thinking });\n pendingBridgeIndices.push(index);\n continue;\n }\n\n finalizeGroup();\n }\n\n finalizeGroup();\n\n return {\n groups,\n groupedIndices,\n suppressedIndices\n };\n}\n\nexport function projectAgentToolGroupRowFromGroup(\n turnId: string,\n group: AgentComputedToolGroupVM,\n agentSessionId?: string\n): AgentToolGroupRowVM {\n const firstCallId = group.calls[0]?.id ?? \"unknown\";\n return {\n kind: \"tool-group\",\n id: `tool-group:${turnId}:${group.calls.map((call) => call.id).join(\"+\")}`,\n expansionKey: [\"tool-group\", agentSessionId, turnId, firstCallId]\n .filter(Boolean)\n .join(\":\"),\n turnId,\n grouped: true,\n calls: group.calls,\n summary: summarizeToolCallGroup(group.calls),\n entries: group.entries,\n occurredAtUnixMs:\n group.calls\n .map((call) => call.occurredAtUnixMs ?? 0)\n .reduce((latest, value) => (value > latest ? value : latest), 0) || null\n };\n}\n\nexport function projectAgentSingleToolRow(\n call: AgentToolCallVM,\n turnId = call.turnId\n): AgentToolGroupRowVM {\n return {\n kind: \"tool-group\",\n id: `tool-row:${call.id}`,\n expansionKey: `tool-group:${turnId}:${call.id}`,\n turnId,\n grouped: false,\n calls: [call],\n summary: null,\n entries: [{ kind: \"tool-call\", call }],\n occurredAtUnixMs: call.occurredAtUnixMs\n };\n}\n\nfunction isGroupableToolCall(call: AgentToolCallVM): boolean {\n switch (call.rendererKind) {\n case \"approval\":\n case \"ask-user\":\n case \"plan-enter\":\n case \"plan-exit\":\n case \"task\":\n return false;\n default:\n return true;\n }\n}\n\nfunction isEditBoundaryToolCall(call: AgentToolCallVM): boolean {\n return call.rendererKind === \"edit\" || call.rendererKind === \"write\";\n}\n\nfunction summarizeToolCallGroup(\n calls: readonly AgentToolCallVM[]\n): string | null {\n if (calls.length < 2) {\n return null;\n }\n const changedTargets = dedupeStrings(\n calls\n .filter(\n (call) => call.rendererKind === \"edit\" || call.rendererKind === \"write\"\n )\n .map((call) => summarizeCallTarget(call.compactSummary ?? call.summary))\n .filter((value): value is string => value !== null)\n );\n if (changedTargets.length === 0) {\n return null;\n }\n if (changedTargets.length === 1) {\n return `Changed ${changedTargets[0]}`;\n }\n return `Changed ${changedTargets[0]} and ${changedTargets.length - 1} more files`;\n}\n\nfunction summarizeCallTarget(summary: string): string | null {\n const normalized = summary.trim();\n if (!normalized) {\n return null;\n }\n const firstLine = normalized.split(\"\\n\")[0]?.trim() ?? normalized;\n if (!firstLine) {\n return null;\n }\n const segments = firstLine.split(/[\\\\/]/).filter(Boolean);\n return segments.at(-1) ?? firstLine;\n}\n\nfunction dedupeStrings(values: readonly string[]): string[] {\n return [...new Set(values.map((value) => value.trim()).filter(Boolean))];\n}\n","import type { AgentAskUserQuestionItemVM } from \"../contracts/agentAskUserQuestionItemVM\";\nimport type { AgentPlanModeItemVM } from \"../contracts/agentPlanModeItemVM\";\nimport type { AgentTaskItemVM } from \"../contracts/agentTaskItemVM\";\nimport type {\n AgentToolCallVM,\n AgentToolRendererKind\n} from \"../contracts/agentToolCallVM\";\nimport { isImageGenerationToolCall } from \"../../imageGenerationTool\";\n\ninterface AgentToolRendererProbe {\n toolName: string | null | undefined;\n displayName?: string | null | undefined;\n callType: string | null | undefined;\n input?: Record<string, unknown> | null;\n output?: Record<string, unknown> | null;\n content?: unknown[] | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport function resolveAgentToolRendererKind(\n call: AgentToolRendererProbe,\n approval: AgentToolCallVM[\"approval\"] = null,\n askUserQuestion: AgentAskUserQuestionItemVM | null = null,\n planMode: AgentPlanModeItemVM | null = null,\n task: AgentTaskItemVM | null = null\n): AgentToolRendererKind {\n const normalizedToolName = normalizeToolName(call.toolName);\n const normalizedCallType = normalizeCallType(call.callType);\n if (approval) {\n return \"approval\";\n }\n if (askUserQuestion) {\n return \"ask-user\";\n }\n if (normalizedToolName === \"askuserquestion\") {\n return \"ask-user\";\n }\n if (planMode?.kind === \"enter\") {\n return \"plan-enter\";\n }\n if (normalizedToolName === \"enterplanmode\") {\n return \"plan-enter\";\n }\n if (planMode?.kind === \"exit\") {\n return \"plan-exit\";\n }\n if (normalizedToolName === \"exitplanmode\") {\n return \"plan-exit\";\n }\n if (normalizedCallType === \"approval\" || normalizedToolName === \"approval\") {\n return \"approval\";\n }\n if (task) {\n return \"task\";\n }\n if (\n [\"task\", \"subagent\", \"delegatetask\", \"delegateagent\", \"agent\"].includes(\n normalizedToolName\n )\n ) {\n return \"task\";\n }\n if (\n isImageGenerationToolCall({\n toolName: call.toolName,\n displayName: call.displayName,\n content: call.content,\n outputContent: call.output?.content,\n outputSavedPath: call.output?.savedPath ?? call.output?.saved_path,\n inputPrompt: call.input?.prompt\n })\n ) {\n return \"image-generation\";\n }\n switch (normalizedToolName) {\n case \"read\":\n case \"readfile\":\n return \"read\";\n case \"write\":\n case \"writefile\":\n return \"write\";\n case \"edit\":\n case \"editfile\":\n case \"multiedit\":\n return \"edit\";\n case \"bash\":\n case \"shell\":\n case \"exec\":\n case \"execcommand\":\n return \"bash\";\n case \"grep\":\n case \"glob\":\n case \"search\":\n case \"searchfiles\":\n return \"search\";\n case \"websearch\":\n return \"web-search\";\n case \"webfetch\":\n return \"web-fetch\";\n case \"todowrite\":\n return \"todo-write\";\n case \"toolsearch\":\n return \"tool-search\";\n case \"skill\":\n return \"skill\";\n default:\n if (\n normalizedCallType === \"mcp\" ||\n normalizedToolName.startsWith(\"mcp\") ||\n hasMcpMetadata(call.metadata)\n ) {\n return \"mcp\";\n }\n return \"default\";\n }\n}\n\nexport function inferToolCallType(toolName: string | null | undefined): string {\n const normalizedToolName = normalizeToolName(toolName);\n if (normalizedToolName === \"approval\") {\n return \"approval\";\n }\n if (\n [\"askuserquestion\", \"enterplanmode\", \"exitplanmode\"].includes(\n normalizedToolName\n )\n ) {\n return \"interactive\";\n }\n if (normalizedToolName.startsWith(\"mcp\")) {\n return \"mcp\";\n }\n return \"tool\";\n}\n\nexport function isApprovalToolCall(call: {\n toolName: string | null | undefined;\n callType: string | null | undefined;\n}): boolean {\n return (\n normalizeCallType(call.callType) === \"approval\" ||\n normalizeToolName(call.toolName) === \"approval\"\n );\n}\n\nexport function normalizeToolName(value: string | null | undefined): string {\n return (value ?? \"\")\n .replace(/[_\\s-]+/g, \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction hasMcpMetadata(\n metadata: Record<string, unknown> | null | undefined\n): boolean {\n return Boolean(\n stringValue(metadata?.server) ??\n stringValue(metadata?.serverName) ??\n stringValue(metadata?.mcpServer)\n );\n}\n\nfunction normalizeCallType(value: string | null | undefined): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n","import type { AgentMessageContentVM } from \"../contracts/agentMessageRowVM\";\nimport type { AgentTranscriptPresentationKind } from \"../contracts/agentTranscriptPresentation\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\n\ntype AgentSystemNoticeVM = NonNullable<AgentMessageContentVM[\"systemNotice\"]>;\n\nexport function resolveAgentTranscriptPresentationKind(\n notice: Pick<AgentSystemNoticeVM, \"command\" | \"commandStatus\"> | null\n): AgentTranscriptPresentationKind {\n if (notice?.command !== \"compact\") {\n return \"content\";\n }\n if (notice.commandStatus === \"running\") {\n return \"specific-progress\";\n }\n if (\n notice.commandStatus === \"completed\" ||\n notice.commandStatus === \"failed\" ||\n notice.commandStatus === \"canceled\"\n ) {\n return \"turn-boundary\";\n }\n return \"content\";\n}\n\nexport function agentTranscriptRowHasPresentationKind(\n row: AgentTranscriptRowVM | undefined,\n presentationKind: AgentTranscriptPresentationKind\n): boolean {\n return Boolean(\n row?.kind === \"message\" &&\n row.messages.some(\n (message) => message.presentationKind === presentationKind\n )\n );\n}\n","import type { WorkspaceAgentSessionDetailToolCall } from \"../../workspaceAgentSessionDetailViewModel\";\nimport { extractAgentMcpToolTarget } from \"../../agentMcpToolTarget\";\nimport { normalizeAgentApprovalPurpose } from \"../agentApprovalPurpose\";\nimport type {\n AgentApprovalItemVM,\n AgentApprovalOptionVM\n} from \"../contracts/agentApprovalItemVM\";\nimport { isExitPlanSwitchModeInput } from \"../exitPlanOptions\";\n\nexport function projectAgentApprovalItem(\n call: WorkspaceAgentSessionDetailToolCall,\n input: Record<string, unknown> | null,\n output: Record<string, unknown> | null\n): AgentApprovalItemVM | null {\n const callType = normalizeToken(call.callType);\n const toolName = normalizeToken(call.toolName);\n if (callType !== \"approval\" && toolName !== \"approval\") {\n return null;\n }\n const requestId =\n stringValue(input?.requestId) ??\n stringValue(call.payload?.requestId) ??\n stringValue(output?.requestId);\n if (!requestId) {\n return null;\n }\n const options = normalizeApprovalOptions(\n arrayValue(input?.options) ?? arrayValue(call.payload?.options) ?? []\n );\n if (isExitPlanSwitchModeInput(input)) {\n return null;\n }\n const mcpTarget = extractAgentMcpToolTarget({\n input,\n payload: call.payload,\n toolName: call.toolName,\n name: call.name\n });\n const approvalPurpose = normalizeAgentApprovalPurpose(\n call.payload?.approvalPurpose\n );\n return {\n kind: \"approval\",\n id: call.id,\n turnId: call.turnId ?? \"turn:unknown\",\n requestId,\n callId: call.id.replace(/^call:/, \"\"),\n ...(approvalPurpose ? { approvalPurpose } : {}),\n title: mcpTarget?.displayName ?? (call.summary.trim() || call.name),\n toolName: call.toolName,\n status: stringValue(call.payload?.status) ?? call.status,\n input,\n options,\n output,\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n}\n\nfunction normalizeApprovalOptions(\n values: readonly unknown[]\n): AgentApprovalOptionVM[] {\n return values.flatMap((value) => {\n const option = objectValue(value);\n const id = stringValue(option?.optionId) ?? stringValue(option?.id);\n if (!id) {\n return [];\n }\n const label =\n stringValue(option?.name) ??\n stringValue(option?.label) ??\n stringValue(option?.title) ??\n stringValue(option?.kind) ??\n id;\n return [\n {\n id,\n label,\n kind: stringValue(option?.kind) ?? \"\",\n ...(stringValue(option?.description)\n ? { description: stringValue(option?.description) as string }\n : {})\n }\n ];\n });\n}\n\nfunction normalizeToken(value: string | null | undefined): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n","import type { WorkspaceAgentSessionDetailToolCall } from \"../../workspaceAgentSessionDetailViewModel\";\nimport type { AgentAskUserQuestionItemVM } from \"../contracts/agentAskUserQuestionItemVM\";\nimport type { AgentPlanModeItemVM } from \"../contracts/agentPlanModeItemVM\";\nimport { normalizeAskUserQuestions } from \"../askUserQuestions\";\nimport {\n extractExitPlanKeepPlanningOptionId,\n extractExitPlanModeOptions,\n isExitPlanSwitchModeInput\n} from \"../exitPlanOptions\";\n\nexport function projectAgentAskUserQuestionItem(\n call: WorkspaceAgentSessionDetailToolCall,\n input: Record<string, unknown> | null,\n output: Record<string, unknown> | null\n): AgentAskUserQuestionItemVM | null {\n if (normalizeToolName(call.toolName) !== \"askuserquestion\") {\n return null;\n }\n const questions = normalizeAskUserQuestions(input?.questions);\n if (questions.length === 0) {\n return null;\n }\n const answersByQuestionId = objectValue(output?.answersByQuestionId) ?? {};\n return {\n kind: \"ask-user\",\n id: call.id,\n turnId: call.turnId ?? \"turn:unknown\",\n requestId:\n stringValue(input?.requestId) ??\n stringValue(call.payload?.requestId) ??\n call.id.replace(/^call:/, \"\"),\n title: call.name,\n status: call.status,\n questions: questions.map((question) => ({\n ...question,\n answer: answerForQuestion(question.id, answersByQuestionId, output)\n })),\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n}\n\nexport function projectAgentPlanModeItem(\n call: WorkspaceAgentSessionDetailToolCall,\n input: Record<string, unknown> | null\n): AgentPlanModeItemVM | null {\n if (isExitPlanSwitchModeInput(input)) {\n return {\n itemKind: \"plan-mode\",\n id: call.id,\n turnId: call.turnId ?? \"turn:unknown\",\n requestId:\n stringValue(input?.requestId) ??\n stringValue(call.payload?.requestId) ??\n call.id.replace(/^call:/, \"\"),\n kind: \"exit\",\n title: stringValue(objectValue(input?.toolCall)?.title) ?? call.name,\n status: call.status,\n plan:\n stringValue(input?.plan) ??\n stringValue(call.payload?.plan) ??\n (call.summary.trim() || null),\n filePath:\n stringValue(input?.filePath) ?? stringValue(call.payload?.filePath),\n options: extractExitPlanModeOptions(input),\n ...keepPlanningOption(extractExitPlanKeepPlanningOptionId(input)),\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n }\n const toolName = normalizeToolName(call.toolName);\n if (toolName === \"enterplanmode\") {\n return {\n itemKind: \"plan-mode\",\n id: call.id,\n turnId: call.turnId ?? \"turn:unknown\",\n kind: \"enter\",\n title: call.name,\n status: call.status,\n plan: stringValue(input?.content) ?? (call.summary.trim() || null),\n filePath: stringValue(input?.filePath),\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n }\n if (toolName !== \"exitplanmode\") {\n return null;\n }\n return {\n itemKind: \"plan-mode\",\n id: call.id,\n turnId: call.turnId ?? \"turn:unknown\",\n requestId:\n stringValue(input?.requestId) ??\n stringValue(call.payload?.requestId) ??\n call.id.replace(/^call:/, \"\"),\n kind: \"exit\",\n title: call.name,\n status: call.status,\n plan:\n stringValue(input?.plan) ??\n stringValue(call.payload?.plan) ??\n (call.summary.trim() || null),\n filePath:\n stringValue(input?.filePath) ?? stringValue(call.payload?.filePath),\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n}\n\nfunction answerForQuestion(\n questionId: string,\n answersByQuestionId: Record<string, unknown>,\n output: Record<string, unknown> | null\n): string | string[] | null {\n const responsePayload = objectValue(output?.payload);\n const responseAnswersByQuestionId =\n objectValue(responsePayload?.answersByQuestionId) ?? {};\n const value =\n answersByQuestionId[questionId] ?? responseAnswersByQuestionId[questionId];\n if (Array.isArray(value)) {\n return value.flatMap((item) =>\n typeof item === \"string\" && item.trim() ? [item.trim()] : []\n );\n }\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n const answers =\n arrayValue(output?.answers) ?? arrayValue(responsePayload?.answers);\n return answers && answers.length > 0\n ? answers.filter(\n (item): item is string =>\n typeof item === \"string\" && item.trim().length > 0\n )\n : null;\n}\n\nfunction keepPlanningOption(optionId: string | null): {\n keepPlanningOptionId?: string;\n} {\n return optionId ? { keepPlanningOptionId: optionId } : {};\n}\n\nfunction normalizeToolName(value: string | null | undefined): string {\n return (value ?? \"\")\n .replace(/[_\\s-]+/g, \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n","import type { WorkspaceAgentSessionDetailToolCall } from \"../../workspaceAgentSessionDetailViewModel\";\nimport type {\n AgentTaskItemVM,\n AgentTaskStepVM\n} from \"../contracts/agentTaskItemVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport { projectAgentApprovalItem } from \"./agentApprovalProjection\";\nimport {\n projectAgentAskUserQuestionItem,\n projectAgentPlanModeItem\n} from \"./agentInteractiveProjection\";\nimport {\n inferToolCallType,\n isApprovalToolCall,\n normalizeToolName,\n resolveAgentToolRendererKind\n} from \"./agentToolRendererKind\";\n\nexport function projectAgentTaskItem(\n call: WorkspaceAgentSessionDetailToolCall,\n input: Record<string, unknown> | null,\n output: Record<string, unknown> | null,\n metadata: Record<string, unknown> | null\n): AgentTaskItemVM | null {\n const toolName = normalizeToolName(call.toolName);\n if (\n ![\"task\", \"subagent\", \"delegatetask\", \"delegateagent\", \"agent\"].includes(\n toolName\n )\n ) {\n return null;\n }\n const claudeToolResponse =\n claudeCodeToolResponse(input) ??\n claudeCodeToolResponse(output) ??\n claudeCodeToolResponse(metadata);\n const steps = normalizeTaskSteps(\n arrayValue(metadata?.steps) ??\n arrayValue(output?.steps) ??\n arrayValue(call.payload?.steps) ??\n [],\n call.turnId ?? \"turn:unknown\"\n );\n return {\n kind: \"task\",\n id: call.id,\n turnId: call.turnId ?? \"turn:unknown\",\n title: call.summary.trim() || call.name,\n status:\n stringValue(metadata?.taskStatus) ??\n stringValue(metadata?.subagentStatus) ??\n call.status,\n prompt:\n stringValue(input?.prompt) ??\n stringValue(input?.description) ??\n stringValue(call.payload?.description) ??\n stringValue(claudeToolResponse?.prompt),\n delegateSessionId:\n stringValue(metadata?.childSessionID) ??\n stringValue(metadata?.child_session_id) ??\n stringValue(metadata?.subagentSessionID) ??\n stringValue(metadata?.subagent_session_id) ??\n stringValue(metadata?.subagentAgentId) ??\n stringValue(metadata?.agentId) ??\n stringValue(claudeToolResponse?.agentId),\n steps,\n result: firstNonEmptyText(output),\n resultMarkdown: firstNonEmptyText(output),\n durationMs:\n numberValue(metadata?.durationMs) ??\n numberValue(output?.durationMs) ??\n numberValue(claudeToolResponse?.totalDurationMs),\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n}\n\nfunction normalizeTaskSteps(\n values: readonly unknown[],\n turnId: string\n): AgentTaskStepVM[] {\n return values.flatMap((value, index) => {\n const step = objectValue(value);\n if (!step) {\n return [];\n }\n const toolName =\n stringValue(step.toolName) ??\n stringValue(step.tool_name) ??\n stringValue(step.name);\n const callType = stringValue(step.callType) ?? stringValue(step.call_type);\n if (isApprovalToolCall({ toolName, callType })) {\n return [];\n }\n const inputPayload =\n objectValue(step.toolInput) ?? objectValue(step.tool_input);\n const outputPayload =\n objectValue(step.toolResult) ?? objectValue(step.tool_result);\n const errorPayload =\n objectValue(step.toolError) ?? objectValue(step.tool_error);\n const payload = objectValue(step.payload);\n const metadata = objectValue(step.metadata);\n const content = arrayValue(step.content);\n const locations = arrayValue(step.locations);\n return [\n {\n id:\n stringValue(step.toolUseId) ??\n stringValue(step.id) ??\n `step-${index + 1}`,\n turnId,\n name: toolName ? humanizeToolLabel(toolName) : `Step ${index + 1}`,\n toolName: toolName ?? null,\n status:\n stringValue(step.status) ??\n stringValue(objectValue(step.toolResult)?.status) ??\n stringValue(objectValue(step.tool_result)?.status),\n summary: firstNonEmptyText(outputPayload, inputPayload) ?? \"\",\n payload: {\n input: inputPayload,\n output: outputPayload,\n error: errorPayload\n },\n tool: projectAgentTaskStepTool({\n id:\n stringValue(step.toolUseId) ??\n stringValue(step.id) ??\n `step-${index + 1}`,\n turnId,\n toolName,\n name: stringValue(step.name),\n callType,\n status:\n stringValue(step.status) ?? stringValue(outputPayload?.status),\n summary: firstNonEmptyText(outputPayload, inputPayload) ?? \"\",\n payload,\n metadata,\n input: inputPayload,\n output: outputPayload,\n error: errorPayload,\n content,\n locations,\n occurredAtUnixMs: numberValue(step.occurredAtUnixMs)\n }),\n occurredAtUnixMs: numberValue(step.occurredAtUnixMs) ?? null\n }\n ];\n });\n}\n\nexport function projectAgentTaskStepTool(step: {\n id: string;\n turnId: string;\n toolName: string | null;\n name: string | null;\n callType: string | null;\n status: string | null;\n summary: string;\n payload: Record<string, unknown> | null;\n metadata: Record<string, unknown> | null;\n input: Record<string, unknown> | null;\n output: Record<string, unknown> | null;\n error: Record<string, unknown> | null;\n content: unknown[] | null;\n locations: unknown[] | null;\n occurredAtUnixMs: number | null;\n}): AgentToolCallVM {\n const call: WorkspaceAgentSessionDetailToolCall = {\n id: `call:${step.id}`,\n turnId: step.turnId,\n name:\n step.name ?? (step.toolName ? humanizeToolLabel(step.toolName) : \"Tool\"),\n toolName: step.toolName,\n callType: step.callType ?? inferToolCallType(step.toolName),\n status: step.status,\n statusKind: normalizeTaskStepStatus(step.status),\n summary: step.summary,\n compactSummary: step.summary || null,\n payload: step.payload,\n occurredAtUnixMs: step.occurredAtUnixMs\n };\n const approval = projectAgentApprovalItem(call, step.input, step.output);\n const askUserQuestion = projectAgentAskUserQuestionItem(\n call,\n step.input,\n step.output\n );\n const planMode = projectAgentPlanModeItem(call, step.input);\n const task = projectAgentTaskItem(\n call,\n step.input,\n step.output,\n step.metadata\n );\n const rendererKind = resolveAgentToolRendererKind(\n {\n toolName: call.toolName,\n displayName: call.name,\n callType: call.callType,\n input: step.input,\n output: step.output,\n content: step.content,\n metadata: step.metadata\n },\n approval,\n askUserQuestion,\n planMode,\n task\n );\n return {\n kind: \"tool-call\",\n ...call,\n turnId: step.turnId,\n compactSummary: call.compactSummary ?? null,\n payload: step.payload,\n toolState: null,\n input: step.input,\n output: step.output,\n error: step.error,\n metadata: step.metadata,\n content: step.content,\n locations: step.locations,\n occurredAtUnixMs: call.occurredAtUnixMs ?? null,\n rendererKind,\n approval,\n planMode,\n askUserQuestion,\n task\n };\n}\n\nfunction humanizeToolLabel(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/^\\w/, (match) => match.toUpperCase());\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction numberValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction normalizeTaskStepStatus(\n value: string | null\n): AgentToolCallVM[\"statusKind\"] {\n switch ((value ?? \"\").trim().toLowerCase()) {\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"failed\":\n case \"error\":\n case \"errored\":\n return \"failed\";\n case \"waiting\":\n case \"waiting_input\":\n case \"waiting_approval\":\n return \"waiting\";\n case \"running\":\n case \"working\":\n case \"active\":\n return \"working\";\n default:\n return null;\n }\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction claudeCodeToolResponse(\n value: Record<string, unknown> | null\n): Record<string, unknown> | null {\n const meta = objectValue(value?._meta);\n const claudeCode = objectValue(meta?.claudeCode);\n return objectValue(claudeCode?.toolResponse);\n}\n\nfunction firstNonEmptyText(\n ...values: Array<Record<string, unknown> | string | null | undefined>\n): string | null {\n for (const value of values) {\n const text = extractText(value);\n if (text) {\n return text;\n }\n }\n return null;\n}\n\nfunction extractText(value: unknown, depth = 0): string | null {\n if (depth > 4) {\n return null;\n }\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n const text = extractText(item, depth + 1);\n if (text) {\n return text;\n }\n }\n return null;\n }\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\n \"text\",\n \"output\",\n \"summary\",\n \"message\",\n \"patch\",\n \"result\"\n ]) {\n const text = extractText(record[key], depth + 1);\n if (text) {\n return text;\n }\n }\n return extractText(record.content, depth + 1);\n }\n return null;\n}\n","import type { WorkspaceAgentSessionDetailToolCall } from \"../../workspaceAgentSessionDetailViewModel\";\nimport { extractAgentMcpToolTarget } from \"../../agentMcpToolTarget\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport { projectAgentApprovalItem } from \"./agentApprovalProjection\";\nimport {\n projectAgentAskUserQuestionItem,\n projectAgentPlanModeItem\n} from \"./agentInteractiveProjection\";\nimport { projectAgentTaskItem } from \"./agentTaskProjection\";\nimport { resolveAgentToolRendererKind } from \"./agentToolRendererKind\";\n\nexport function projectAgentToolCall(\n call: WorkspaceAgentSessionDetailToolCall\n): AgentToolCallVM {\n const toolState = objectValue(call.payload?.tool_state);\n const input = normalizeStandardACPEnvelope(\n objectValue(call.payload?.input) ?? objectValue(toolState?.input)\n );\n const output = normalizeStandardACPEnvelope(\n objectValue(call.payload?.output) ?? objectValue(toolState?.output)\n );\n const error = normalizeStandardACPEnvelope(\n objectValue(call.payload?.error) ?? objectValue(toolState?.error)\n );\n const metadata = objectValue(call.payload?.metadata);\n const content = arrayValue(call.payload?.content);\n const locations = arrayValue(call.payload?.locations);\n const approval = projectAgentApprovalItem(call, input, output);\n const askUserQuestion = projectAgentAskUserQuestionItem(call, input, output);\n const planMode = projectAgentPlanModeItem(call, input);\n const task = projectAgentTaskItem(call, input, output, metadata);\n const mcpTarget = extractAgentMcpToolTarget({\n input,\n metadata,\n payload: call.payload,\n toolName: call.toolName,\n name: call.name\n });\n const rendererKind = resolveAgentToolRendererKind(\n {\n toolName: call.toolName,\n displayName: call.name,\n callType: call.callType,\n input,\n output,\n content,\n metadata\n },\n approval,\n askUserQuestion,\n planMode,\n task\n );\n const projectedCall: AgentToolCallVM = {\n kind: \"tool-call\",\n ...call,\n turnId: call.turnId ?? \"turn:unknown\",\n name: mcpTarget?.displayName ?? call.name,\n compactSummary: call.compactSummary ?? call.summary,\n payload: call.payload ?? null,\n toolState,\n input,\n output,\n error,\n metadata,\n content,\n locations,\n rendererKind,\n approval,\n askUserQuestion,\n planMode,\n task,\n occurredAtUnixMs: call.occurredAtUnixMs ?? null\n };\n if (call.sourceTimelineItems) {\n projectedCall.sourceTimelineItems = call.sourceTimelineItems;\n }\n return projectedCall;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction normalizeStandardACPEnvelope(\n value: Record<string, unknown> | null\n): Record<string, unknown> | null {\n if (!value) return null;\n const raw = objectValue(value.rawInput) ?? objectValue(value.rawOutput);\n if (!raw) return value;\n const metadata = objectValue(raw.metadata);\n return {\n ...value,\n ...raw,\n ...(metadata?.diff !== undefined ? { diff: metadata.diff } : {}),\n ...(metadata?.files !== undefined ? { files: metadata.files } : {}),\n ...(metadata?.structuredPatch !== undefined\n ? { structuredPatch: metadata.structuredPatch }\n : {}),\n ...(metadata?.detailedContent !== undefined\n ? { detailedContent: metadata.detailedContent }\n : {}),\n ...(metadata?.changes !== undefined ? { changes: metadata.changes } : {}),\n ...(metadata?.exit !== undefined ? { exitCode: metadata.exit } : {})\n };\n}\n","import { createRichTextMentionMarkdown } from \"@tutti-os/ui-rich-text/core\";\nimport type { AgentPromptContentBlock } from \"../../../shared/contracts/dto\";\nimport type {\n AgentComposerDraft,\n AgentComposerFileBlock,\n AgentComposerDraftFile,\n AgentComposerDraftLargeText,\n AgentComposerDraftImage,\n AgentComposerDraftContent,\n AgentGUIProviderSkillOption\n} from \"./agentGuiNodeTypes\";\nimport {\n AGENT_PASTED_TEXT_BLOCK_KIND,\n AGENT_PASTED_TEXT_MENTION_KIND\n} from \"./agentGuiNodeTypes\";\nimport {\n agentPromptContentToComposerPrompt,\n agentPromptFileBlocks,\n agentPromptPastedTextBlocks,\n agentPreparedPromptFileToDraftFile,\n materializeAgentComposerFileMentions\n} from \"./agentExternalPromptFiles\";\nimport { agentComposerFileMentionReferences } from \"../agentRichText/agentMentionMarkdown\";\n\nconst PASTED_TEXT_MENTION_PREVIEW_MAX_CHARS = 10;\n\n/**\n * First {@link PASTED_TEXT_MENTION_PREVIEW_MAX_CHARS} characters of the pasted\n * body (collapsed to a single line), used as the chip label everywhere. Markdown\n * link-label metacharacters are stripped so it round-trips through the\n * `[preview](path)` reference the persisted content carries.\n */\nexport function pastedTextPreview(text: string): string {\n const collapsed = text\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/[[\\]()]/g, \"\");\n if (collapsed.length <= PASTED_TEXT_MENTION_PREVIEW_MAX_CHARS) {\n return collapsed;\n }\n return `${collapsed.slice(0, PASTED_TEXT_MENTION_PREVIEW_MAX_CHARS)}…`;\n}\n\n/**\n * First non-empty line of the pasted body, trimmed and length-capped, used as\n * the chip's primary label in the conversation flow. Falls back to the display\n * file name when the body is unavailable (e.g. a queue-restored item).\n */\nfunction pastedTextPreviewLabel(\n item: AgentComposerDraftLargeText,\n index: number\n): string {\n return (\n pastedTextPreview(item.text) ||\n item.name.trim() ||\n pastedTextDraftDisplayName(index)\n );\n}\n\n/**\n * Encodes a landed pasted-text item as a canonical mention link for the\n * conversation-flow display prompt. The href (a `mention://pasted-text/...`\n * URL) losslessly carries the archive `path` and byte size so the host can\n * render a chip and open a preview on click — the persisted, reload-safe\n * \"custom protocol\" for pasted text. Returns \"\" when the item has not landed.\n */\nexport function pastedTextMentionMarkdown(\n item: AgentComposerDraftLargeText,\n index: number\n): string {\n const path = item.path?.trim();\n if (!path) {\n return \"\";\n }\n return createRichTextMentionMarkdown({\n providerId: AGENT_PASTED_TEXT_MENTION_KIND,\n entityId: item.id,\n label: pastedTextPreviewLabel(item, index),\n scope: {\n path,\n ...(typeof item.sizeBytes === \"number\" && Number.isFinite(item.sizeBytes)\n ? { size: String(item.sizeBytes) }\n : {})\n }\n });\n}\nimport {\n promptForProviderSkills,\n skillTriggerForPrefix\n} from \"./agentSkillOptions\";\n\nexport const MAX_AGENT_COMPOSER_DRAFT_IMAGES = 8;\n\ntype AgentPromptImageContentBlock = AgentPromptContentBlock & {\n type: \"image\";\n mimeType: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n attachmentId?: string;\n data?: string;\n path?: string;\n};\n\nexport function emptyAgentComposerDraft(): AgentComposerDraft {\n return [{ type: \"text\", text: \"\" }];\n}\n\nexport function snapshotAgentComposerDraft(\n draft: AgentComposerDraft\n): AgentComposerDraft {\n const [textBlock, ...attachmentBlocks] = draft;\n return [{ ...textBlock }, ...attachmentBlocks.map((block) => ({ ...block }))];\n}\n\nexport function agentComposerDraftPrompt(\n draft: AgentComposerDraftContent\n): string {\n return draft[0].text;\n}\n\nexport function agentComposerDraftImages(\n draft: AgentComposerDraftContent\n): AgentComposerDraftImage[] {\n return draft\n .filter(\n (\n block\n ): block is Extract<\n AgentComposerDraftContent[number],\n { type: \"image\" }\n > => block.type === \"image\"\n )\n .map(({ type: _type, ...image }) => image);\n}\n\nexport function agentComposerDraftFiles(\n draft: AgentComposerDraftContent\n): AgentComposerDraftFile[] {\n return draft\n .filter(\n (\n block\n ): block is Extract<\n AgentComposerDraftContent[number],\n { type: \"file\" }\n > => block.type === \"file\" && block.kind === \"file\"\n )\n .map(({ type: _type, kind: _kind, text: _text, ...file }) => file);\n}\n\nexport function agentComposerDraftLargeTexts(\n draft: AgentComposerDraftContent\n): AgentComposerDraftLargeText[] {\n return draft\n .filter(\n (\n block\n ): block is Extract<\n AgentComposerDraftContent[number],\n { type: \"file\"; kind: typeof AGENT_PASTED_TEXT_BLOCK_KIND }\n > => block.type === \"file\" && block.kind === AGENT_PASTED_TEXT_BLOCK_KIND\n )\n .map(({ type: _type, kind: _kind, ...item }) => item);\n}\n\ninterface AgentComposerDraftAttachmentProjection {\n images: AgentComposerDraftImage[];\n files: AgentComposerDraftFile[];\n largeTexts: AgentComposerDraftLargeText[];\n}\n\nconst attachmentProjectionByDraft = new WeakMap<\n AgentComposerDraftContent,\n AgentComposerDraftAttachmentProjection\n>();\n\nexport function agentComposerDraftAttachmentProjection(\n draft: AgentComposerDraftContent\n): AgentComposerDraftAttachmentProjection {\n const cached = attachmentProjectionByDraft.get(draft);\n if (cached) return cached;\n const projection = {\n images: agentComposerDraftImages(draft),\n files: agentComposerDraftFiles(draft),\n largeTexts: agentComposerDraftLargeTexts(draft)\n };\n attachmentProjectionByDraft.set(draft, projection);\n return projection;\n}\n\nexport function buildAgentComposerDraft(input: {\n prompt: string;\n images?: readonly AgentComposerDraftImage[];\n files?: readonly AgentComposerDraftFile[];\n largeTexts?: readonly AgentComposerDraftLargeText[];\n}): AgentComposerDraft {\n return [\n { type: \"text\", text: input.prompt },\n ...(input.images ?? []).map((image) => ({\n type: \"image\" as const,\n ...image\n })),\n ...(input.files ?? []).map((file) => ({\n type: \"file\" as const,\n kind: \"file\" as const,\n ...file\n })),\n ...(input.largeTexts ?? []).map(\n (item): AgentComposerFileBlock => ({\n type: \"file\" as const,\n kind: AGENT_PASTED_TEXT_BLOCK_KIND,\n ...item\n })\n )\n ];\n}\n\nexport function updateAgentComposerDraft(\n draft: AgentComposerDraft,\n update: Partial<{\n prompt: string;\n images: readonly AgentComposerDraftImage[];\n files: readonly AgentComposerDraftFile[];\n largeTexts: readonly AgentComposerDraftLargeText[];\n }>\n): AgentComposerDraft {\n return buildAgentComposerDraft({\n prompt: update.prompt ?? agentComposerDraftPrompt(draft),\n images: update.images ?? agentComposerDraftImages(draft),\n files: update.files ?? agentComposerDraftFiles(draft),\n largeTexts: update.largeTexts ?? agentComposerDraftLargeTexts(draft)\n });\n}\n\nexport function agentComposerDraftHasContent(\n draft: AgentComposerDraft\n): boolean {\n const prompt = agentComposerDraftPrompt(draft);\n const references = agentComposerFileMentionReferences(prompt);\n let cursor = 0;\n let textWithoutComposerFiles = \"\";\n for (const reference of references) {\n textWithoutComposerFiles += prompt.slice(cursor, reference.start);\n cursor = reference.end;\n }\n textWithoutComposerFiles += prompt.slice(cursor);\n const referencedFileIds = new Set(\n references.map((reference) => reference.id)\n );\n if (\n textWithoutComposerFiles.trim() ||\n agentComposerDraftFiles(draft).some((file) =>\n referencedFileIds.has(file.id)\n )\n ) {\n return true;\n }\n return draft.some((block) => {\n if (block.type === \"text\") return false;\n if (block.type === \"image\") return true;\n return block.kind === \"file\"\n ? false\n : block.text.trim() !== \"\" || Boolean(block.path);\n });\n}\n\nexport function normalizeAgentPromptContentBlocks(\n content: readonly AgentPromptContentBlock[]\n): AgentPromptContentBlock[] {\n const result: AgentPromptContentBlock[] = [];\n for (const block of content) {\n if (block.type === \"text\") {\n const text = block.text?.trim() ?? \"\";\n if (text) {\n result.push({ type: \"text\", text });\n }\n continue;\n }\n if (block.type === \"image\") {\n const mimeType = block.mimeType?.trim();\n const attachmentId = block.attachmentId?.trim();\n const data = block.data?.trim();\n const url = block.url?.trim();\n const imagePath = block.path?.trim();\n if (\n (!attachmentId && !data && !url && !imagePath) ||\n (data && url) ||\n (url && !isSafePromptImageUrl(url)) ||\n (mimeType !== \"image/png\" &&\n mimeType !== \"image/jpeg\" &&\n mimeType !== \"image/webp\")\n ) {\n continue;\n }\n result.push({\n type: \"image\",\n mimeType,\n ...(attachmentId ? { attachmentId } : {}),\n ...(url\n ? { url }\n : data\n ? { data }\n : imagePath\n ? { path: imagePath }\n : {}),\n ...(block.name?.trim() ? { name: block.name.trim() } : {})\n });\n continue;\n }\n if (block.type === \"file\") {\n const filePath = block.path?.trim();\n const hostPath = block.hostPath?.trim();\n const url = block.url?.trim();\n const uri = block.uri?.trim();\n const assetId = block.assetId?.trim();\n if (!filePath && !hostPath && !url && !uri && !assetId) {\n continue;\n }\n result.push({\n type: \"file\",\n ...(block.mimeType?.trim() ? { mimeType: block.mimeType.trim() } : {}),\n ...(filePath ? { path: filePath } : {}),\n ...(hostPath ? { hostPath } : {}),\n ...(url ? { url } : {}),\n ...(block.name?.trim() ? { name: block.name.trim() } : {}),\n ...(uri ? { uri } : {}),\n ...(block.uploadStatus?.trim()\n ? { uploadStatus: block.uploadStatus.trim() }\n : {}),\n ...(assetId ? { assetId } : {}),\n ...(typeof block.sizeBytes === \"number\"\n ? { sizeBytes: block.sizeBytes }\n : {}),\n kind:\n block.kind === AGENT_PASTED_TEXT_BLOCK_KIND\n ? AGENT_PASTED_TEXT_BLOCK_KIND\n : \"file\"\n });\n continue;\n }\n if (block.type === \"skill\" || block.type === \"mention\") {\n const name = block.name?.trim();\n const path = block.path?.trim();\n if (name && path) {\n result.push({ type: block.type, name, path });\n }\n }\n }\n return result;\n}\n\nfunction isSafePromptImageUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n Boolean(url.hostname) &&\n !url.username &&\n !url.password\n );\n } catch {\n return false;\n }\n}\n\nexport function agentPromptContentDisplayText(\n content: readonly AgentPromptContentBlock[]\n): string {\n return content\n .filter((block) => block.type === \"text\")\n .map((block) => block.text?.trim() ?? \"\")\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nexport function agentPromptContentHasImage(\n content: readonly AgentPromptContentBlock[]\n): boolean {\n return content.some((block) => block.type === \"image\");\n}\n\nexport function agentPromptContentHasFile(\n content: readonly AgentPromptContentBlock[]\n): boolean {\n return content.some((block) => block.type === \"file\");\n}\n\nexport function agentPromptContentImageBlocks(\n content: readonly AgentPromptContentBlock[]\n): AgentPromptImageContentBlock[] {\n return normalizeAgentPromptContentBlocks(content).filter(\n (block): block is AgentPromptImageContentBlock =>\n block.type === \"image\" &&\n (typeof block.attachmentId === \"string\" ||\n typeof block.data === \"string\" ||\n typeof block.url === \"string\" ||\n typeof block.path === \"string\") &&\n typeof block.mimeType === \"string\"\n );\n}\n\nexport function agentPromptContentToComposerDraft(\n content: readonly AgentPromptContentBlock[],\n idPrefix: string\n): AgentComposerDraft {\n const normalizedContent = normalizeAgentPromptContentBlocks(content);\n const largeTexts = agentPromptPastedTextBlocks(normalizedContent).map(\n (block) => agentPromptPastedTextBlockToDraftLargeText(block)\n );\n const files = agentPromptFileBlocks(normalizedContent).map((file, index) =>\n agentPreparedPromptFileToDraftFile(file, idPrefix, index)\n );\n return buildAgentComposerDraft({\n prompt: agentPromptContentToComposerPrompt(normalizedContent, files),\n images: agentPromptContentImageBlocks(normalizedContent)\n .slice(0, MAX_AGENT_COMPOSER_DRAFT_IMAGES)\n .map((image, index) =>\n agentPromptImageBlockToDraftImage(image, idPrefix, index)\n ),\n files,\n largeTexts\n });\n}\n\nfunction agentPromptPastedTextBlockToDraftLargeText(\n block: AgentPromptContentBlock & { type: \"file\" }\n): AgentComposerDraftLargeText {\n return {\n id: crypto.randomUUID(),\n name: block.name?.trim() || \"pasted-text.txt\",\n text: \"\",\n ...(block.path ? { path: block.path } : {}),\n ...(typeof block.sizeBytes === \"number\"\n ? { sizeBytes: block.sizeBytes }\n : {})\n };\n}\n\nexport function agentComposerDraftToPromptContent(input: {\n draft: AgentComposerDraft;\n skills: readonly AgentGUIProviderSkillOption[];\n}): AgentPromptContentBlock[] {\n const providerPrompt = materializeAgentComposerFileMentions(\n agentComposerDraftPrompt(input.draft),\n agentComposerDraftFiles(input.draft)\n );\n const prompt = promptForProviderSkills({\n prompt: providerPrompt,\n skills: input.skills\n });\n return normalizeAgentPromptContentBlocks([\n ...textPromptContent(prompt),\n ...promptItemBlocksForProviderSkills({\n prompt,\n skills: input.skills\n }),\n ...agentComposerDraftImages(input.draft)\n .slice(0, MAX_AGENT_COMPOSER_DRAFT_IMAGES)\n .filter((image) => !image.uploading && !image.uploadError)\n .map((image) => ({\n type: \"image\" as const,\n mimeType: image.mimeType,\n ...(image.attachmentId ? { attachmentId: image.attachmentId } : {}),\n ...(image.url\n ? { url: image.url }\n : image.path\n ? { path: image.path }\n : { data: image.data }),\n name: image.name\n })),\n ...largeTextPromptContent(agentComposerDraftLargeTexts(input.draft))\n ]);\n}\n\nexport function agentComposerDraftSubmittedText(\n draft: AgentComposerDraft\n): string {\n return agentPromptContentDisplayText(\n normalizeAgentPromptContentBlocks([\n ...textPromptContent(agentComposerDraftPrompt(draft)),\n ...largeTextPromptContent(agentComposerDraftLargeTexts(draft))\n ])\n );\n}\n\nexport function agentComposerDraftDisplayPrompt(\n draft: AgentComposerDraft\n): string | undefined {\n const prompt = agentComposerDraftPrompt(draft).trim();\n const largeTexts = agentComposerDraftLargeTexts(draft).filter(\n (item) => Boolean(item.path) && !item.uploading && !item.uploadError\n );\n if (!largeTexts.length) {\n return prompt.includes(\"](mention://\") ? prompt : undefined;\n }\n const parts = [prompt].filter(Boolean);\n parts.push(\n ...largeTexts\n .map((item, index) => pastedTextMentionMarkdown(item, index))\n .filter(Boolean)\n );\n return parts.join(\"\\n\");\n}\n\nexport function projectAgentComposerDraftSubmission(input: {\n draft: AgentComposerDraft;\n skills: readonly AgentGUIProviderSkillOption[];\n}): {\n content: AgentPromptContentBlock[];\n displayPrompt?: string;\n} {\n const content = agentComposerDraftToPromptContent(input);\n const explicitDisplayPrompt = agentComposerDraftDisplayPrompt(input.draft);\n const visibleText = agentComposerDraftSubmittedText(input.draft);\n const runtimeText = agentPromptContentDisplayText(content);\n const displayPrompt =\n explicitDisplayPrompt ??\n (visibleText !== runtimeText ? visibleText : undefined);\n\n return {\n content,\n ...(displayPrompt ? { displayPrompt } : {})\n };\n}\n\nfunction promptItemBlocksForProviderSkills(input: {\n prompt: string;\n skills: readonly AgentGUIProviderSkillOption[];\n}): AgentPromptContentBlock[] {\n const result: AgentPromptContentBlock[] = [];\n for (const skill of input.skills) {\n if (skill.invocation !== \"promptItem\") {\n continue;\n }\n const path = skill.path?.trim();\n if (!path) {\n continue;\n }\n const trigger = skillTriggerForPrefix(skill, \"$\");\n if (!trigger || !promptHasTrigger(input.prompt, trigger)) {\n continue;\n }\n result.push({\n type: skill.kind === \"connector\" ? \"mention\" : \"skill\",\n name: skill.name,\n path\n });\n }\n return result;\n}\n\nfunction promptHasTrigger(prompt: string, trigger: string): boolean {\n return new RegExp(`(^|\\\\s)${escapeRegExp(trigger)}(?=$|\\\\s)`).test(prompt);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function textPromptContent(prompt: string): AgentPromptContentBlock[] {\n const text = prompt.trim();\n return text ? [{ type: \"text\", text }] : [];\n}\n\n/**\n * Display/label name for a pasted-text attachment, addressed purely by its\n * position in the draft (`pasted-text-1.txt`, `pasted-text-2.txt`, …). The\n * stored `item.name` is content-addressed and intentionally not used here, so\n * labels never collide and always renumber with the list.\n */\nexport function pastedTextDraftDisplayName(index: number): string {\n return `pasted-text-${index + 1}.txt`;\n}\n\n// Matches a landed pasted-text archive path (content-addressed .txt under the\n// host's agent-prompt-assets dir). The path may contain spaces (e.g. macOS\n// \"Application Support\"), so match from the leading \"/\" or drive letter up to\n// the first \".txt\" after \"agent-prompt-assets\", staying on one line.\nconst PASTED_TEXT_ARCHIVE_PATH_RE =\n /(?:\\/|[A-Za-z]:\\\\)[^\\n]*?agent-prompt-assets[^\\n]*?\\.txt/;\n\nfunction firstPastedTextArchivePath(line: string): string | null {\n return line.match(PASTED_TEXT_ARCHIVE_PATH_RE)?.[0].trim() ?? null;\n}\n\n/**\n * Extracts landed pasted-text archive paths from a persisted content text block\n * (the codex-style \"Referenced pasted text files:\" instruction the agent\n * receives). This is the reload-safe source of truth for the chip — see\n * {@link linkifyPastedTextReferences}.\n */\nexport function extractPastedTextArchivePaths(text: string): string[] {\n const paths: string[] = [];\n for (const line of text.split(\"\\n\")) {\n const path = firstPastedTextArchivePath(line);\n if (path && !paths.includes(path)) {\n paths.push(path);\n }\n }\n return paths;\n}\n\nfunction pastedTextReferenceMentionMarkdown(\n preview: string,\n path: string,\n index: number\n): string {\n return createRichTextMentionMarkdown({\n providerId: AGENT_PASTED_TEXT_MENTION_KIND,\n entityId: `ref-${index}`,\n label: preview.trim() || pastedTextDraftDisplayName(index),\n scope: { path }\n });\n}\n\n// The persisted instruction line embeds the preview quoted: `… \"<preview>\": …`.\nfunction firstQuotedPreview(line: string): string {\n return line.match(/\"([^\"]*)\"/)?.[1]?.trim() ?? \"\";\n}\n\n/**\n * Rewrites a persisted content text block that carries pasted-text references\n * into the same pasted-text mention chips the composer/display prompt produce,\n * so a reloaded message renders identical chips instead of the raw\n * \"Referenced pasted text files: - pasted text file: <path>. Read this…\" text.\n *\n * Mirrors the Codex approach (parse the agent-facing text back into attachment\n * chips): the pasted-text instruction is appended as its own content block, so a\n * block containing archive paths is entirely that section and is replaced by the\n * clean chip list (dropping the localized header/instruction wording). Blocks\n * without a pasted-text path are returned unchanged.\n */\nexport function linkifyPastedTextReferences(text: string): string {\n if (!PASTED_TEXT_ARCHIVE_PATH_RE.test(text)) {\n return text;\n }\n const lines = text.split(\"\\n\");\n const out: string[] = [];\n let refIndex = 0;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const path = firstPastedTextArchivePath(line);\n if (path) {\n out.push(\n pastedTextReferenceMentionMarkdown(\n firstQuotedPreview(line),\n path,\n refIndex\n )\n );\n refIndex += 1;\n continue;\n }\n // Drop the localized header line that directly precedes a reference line;\n // the pasted-text instruction always emits \"<header>\\n<refs>\" as its own\n // block, so this only removes the header, never user text.\n const next = lines[i + 1];\n if (next != null && firstPastedTextArchivePath(next)) {\n continue;\n }\n out.push(line);\n }\n return out.join(\"\\n\").trim();\n}\n\n/**\n * Pasted long text submits as a structured `file` block (content-addressed\n * archive path) tagged with {@link AGENT_PASTED_TEXT_BLOCK_KIND}. Only landed\n * items are emitted — same rule as images: still-uploading or errored items are\n * dropped from submit (a visible error chip remains for the user to retry or\n * remove). The codex-style \"read this file\" instruction is NOT added here; it\n * is materialized in the controller at send time via\n * {@link materializePastedTextInstructions} so translations never enter the\n * model layer or the persisted/queued draft.\n */\nfunction largeTextPromptContent(\n largeTexts: readonly AgentComposerDraftLargeText[]\n): AgentPromptContentBlock[] {\n return largeTexts\n .filter((item) => {\n const path = item.path?.trim();\n return Boolean(path) && !item.uploading && !item.uploadError;\n })\n .map((item, index) => ({\n type: \"file\" as const,\n kind: AGENT_PASTED_TEXT_BLOCK_KIND,\n path: item.path,\n // The preview (first chars of the pasted body) is the chip label; carry it\n // as the block name so the send-time instruction persists it in content.\n name: pastedTextPreviewLabel(item, index),\n ...(typeof item.sizeBytes === \"number\"\n ? { sizeBytes: item.sizeBytes }\n : {})\n }));\n}\n\n/**\n * True when a prompt `file` block is a pasted-text attachment rather than a\n * user-attached file.\n */\nexport function isPastedTextPromptBlock(\n block: AgentPromptContentBlock\n): boolean {\n return block.type === \"file\" && block.kind === AGENT_PASTED_TEXT_BLOCK_KIND;\n}\n\n/**\n * Rewrites `content` for send: the structured pasted-text `file` blocks\n * (kept in the draft/queue so the composer can show a chip and restore it on\n * edit) are replaced by a single codex-style instruction text block at the tail\n * that references each landed file by path — mirroring the Codex desktop app,\n * which references pasted text as a plain \"read this file\" line rather than a\n * structured attachment. This also keeps the sent content free of `file` blocks,\n * which the desktop tuttid pipeline rejects. The instruction copy is passed in\n * already-translated so the model layer stays free of any i18n dependency. When\n * there are no pasted-text blocks the input is returned unchanged.\n */\nexport function materializePastedTextInstructions(\n content: readonly AgentPromptContentBlock[],\n format: {\n header: () => string;\n line: (preview: string, path: string) => string;\n }\n): AgentPromptContentBlock[] {\n const pastedRefs = content\n .filter(isPastedTextPromptBlock)\n .map((block) => ({\n preview: sanitizePastedTextPreviewForContent(block.name),\n path: block.path?.trim() ?? \"\"\n }))\n .filter((ref) => ref.path !== \"\");\n if (pastedRefs.length === 0) {\n return [...content];\n }\n const withoutPastedText = content.filter(\n (block) => !isPastedTextPromptBlock(block)\n );\n const instruction = [\n format.header(),\n ...pastedRefs.map((ref) => format.line(ref.preview, ref.path))\n ].join(\"\\n\");\n return [...withoutPastedText, { type: \"text\", text: instruction }];\n}\n\n// The preview is embedded quoted in the persisted instruction line\n// (`… \"<preview>\": <path> …`), so strip the quote/newline delimiters that would\n// break the parse-back in {@link linkifyPastedTextReferences}.\nfunction sanitizePastedTextPreviewForContent(name: string | undefined): string {\n return (name ?? \"\").replace(/[\"\\n\\r]/g, \" \").trim();\n}\n\nexport function formatAgentComposerDraftBytes(sizeBytes: number): string {\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n }\n const kib = sizeBytes / 1024;\n if (kib < 1024) {\n return `${kib.toFixed(kib >= 10 ? 0 : 1)} KB`;\n }\n const mib = kib / 1024;\n return `${mib.toFixed(mib >= 10 ? 0 : 1)} MB`;\n}\n\nfunction agentPromptImageBlockToDraftImage(\n image: AgentPromptImageContentBlock,\n idPrefix: string,\n index: number\n): AgentComposerDraftImage {\n return {\n id: `${idPrefix}:image:${index}`,\n name: image.name?.trim() || `image-${index + 1}`,\n mimeType: image.mimeType,\n ...(image.attachmentId ? { attachmentId: image.attachmentId } : {}),\n ...(image.data ? { data: image.data } : {}),\n ...(image.url ? { url: image.url } : {}),\n ...(image.path ? { path: image.path } : {}),\n previewUrl:\n typeof image.data === \"string\" && image.data\n ? image.data.startsWith(\"data:\")\n ? image.data\n : `data:${image.mimeType};base64,${image.data}`\n : (image.url ?? \"\")\n };\n}\n","import { linkifyPastedTextReferences } from \"../../../agent-gui/agentGuiNode/model/agentComposerDraft\";\nimport type { WorkspaceAgentSessionDetailTurn } from \"../../workspaceAgentSessionDetailViewModel\";\nimport type {\n AgentMessageContentVM,\n AgentMessageRowVM\n} from \"../contracts/agentMessageRowVM\";\n\nexport function projectConversationUserRow(\n message: WorkspaceAgentSessionDetailTurn[\"userMessages\"][number],\n fallbackTurnId: string,\n workspaceId: string | null | undefined\n): AgentMessageRowVM {\n const turnId = message.turnId ?? fallbackTurnId;\n return {\n kind: \"message\",\n id: `message:user:${message.id}`,\n turnId,\n speaker: \"user\",\n messages: projectUserMessageContentParts(message, turnId, workspaceId),\n thinking: [],\n occurredAtUnixMs: message.occurredAtUnixMs ?? null\n };\n}\n\nfunction projectUserMessageContentParts(\n message: WorkspaceAgentSessionDetailTurn[\"userMessages\"][number],\n turnId: string,\n workspaceId: string | null | undefined\n): AgentMessageContentVM[] {\n const blocks = userPromptContentBlocks(message, workspaceId);\n if (blocks.length === 0) {\n return [textPart(message, turnId)];\n }\n const parts: AgentMessageContentVM[] = [];\n const imageBlocks = blocks.filter(\n (block): block is UserPromptImageBlock => block.type === \"image\"\n );\n if (imageBlocks.length > 0) {\n parts.push({\n kind: \"message-content\",\n id: `${message.id}:images:0`,\n turnId,\n body: \"\",\n presentationKind: \"content\",\n contentKind: \"image-grid\",\n images: imageBlocks.map((image, index) => ({\n id: `${message.id}:image:${index}`,\n workspaceId: image.workspaceId,\n agentSessionId: image.agentSessionId,\n attachmentId: image.attachmentId,\n mimeType: image.mimeType,\n name: image.name,\n data: image.data,\n url: image.url,\n path: image.path\n })),\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n sourceTimelineItems: message.sourceTimelineItems\n });\n }\n blocks.forEach((block, index) => {\n if (block.type === \"image\" || block.text.trim() === \"\") return;\n parts.push({\n kind: \"message-content\",\n id: `${message.id}:text:${index}`,\n turnId,\n body: block.text,\n presentationKind: \"content\",\n contentKind: \"text\",\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n sourceTimelineItems: message.sourceTimelineItems\n });\n });\n return parts.length > 0 ? parts : [textPart(message, turnId)];\n}\n\nfunction textPart(\n message: WorkspaceAgentSessionDetailTurn[\"userMessages\"][number],\n turnId: string\n): AgentMessageContentVM {\n return {\n kind: \"message-content\",\n id: message.id,\n turnId,\n body: message.body,\n presentationKind: \"content\",\n contentKind: \"text\",\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n sourceTimelineItems: message.sourceTimelineItems\n };\n}\n\ntype UserPromptContentBlock = UserPromptTextBlock | UserPromptImageBlock;\n\ninterface UserPromptTextBlock {\n type: \"text\";\n text: string;\n}\n\ninterface UserPromptImageBlock {\n type: \"image\";\n workspaceId?: string | null;\n agentSessionId: string;\n attachmentId?: string | null;\n mimeType: string;\n name?: string | null;\n data?: string | null;\n url?: string | null;\n path?: string | null;\n}\n\nfunction userPromptContentBlocks(\n message: WorkspaceAgentSessionDetailTurn[\"userMessages\"][number],\n fallbackWorkspaceId: string | null | undefined\n): UserPromptContentBlock[] {\n const item = message.sourceTimelineItems?.find((candidate) =>\n Array.isArray(candidate.payload?.content)\n );\n const content = Array.isArray(item?.payload?.content)\n ? item.payload.content\n : null;\n if (!content) return [];\n const displayPrompt = firstString(\n message.sourceTimelineItems?.map((candidate) =>\n typeof candidate.payload?.displayPrompt === \"string\"\n ? candidate.payload.displayPrompt\n : \"\"\n ) ?? []\n );\n const visibleDisplayPrompt = isSyntheticImageOnlyDisplayPrompt(\n displayPrompt,\n content\n )\n ? \"\"\n : displayPrompt;\n const blocks = content.flatMap((raw): UserPromptContentBlock[] => {\n const block =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : null;\n if (!block) return [];\n if (block.type === \"text\" && typeof block.text === \"string\") {\n return visibleDisplayPrompt\n ? []\n : [{ type: \"text\", text: linkifyPastedTextReferences(block.text) }];\n }\n if (block.type !== \"image\") return [];\n const mimeType =\n typeof block.mimeType === \"string\" ? block.mimeType.trim() : \"\";\n if (!mimeType) return [];\n return [\n {\n type: \"image\",\n workspaceId: item?.workspaceId ?? fallbackWorkspaceId ?? null,\n agentSessionId: item?.agentSessionId ?? message.id,\n attachmentId: optionalString(block.attachmentId),\n mimeType,\n name: optionalString(block.name),\n data: optionalString(block.data),\n url: optionalString(block.url),\n path: optionalString(block.path)\n }\n ];\n });\n return visibleDisplayPrompt\n ? [{ type: \"text\", text: visibleDisplayPrompt }, ...blocks]\n : blocks;\n}\n\nfunction isSyntheticImageOnlyDisplayPrompt(\n displayPrompt: string,\n content: readonly unknown[]\n): boolean {\n if (displayPrompt !== \"[Image]\" && displayPrompt !== \"[Images]\") {\n return false;\n }\n let imageCount = 0;\n for (const raw of content) {\n const block =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : null;\n if (!block) continue;\n if (\n block.type === \"text\" &&\n typeof block.text === \"string\" &&\n block.text.trim()\n ) {\n return false;\n }\n if (block.type === \"image\") {\n imageCount += 1;\n }\n }\n return displayPrompt === \"[Image]\" ? imageCount === 1 : imageCount > 1;\n}\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction firstString(values: readonly string[]): string {\n for (const value of values) {\n const trimmed = value.trim();\n if (trimmed) return trimmed;\n }\n return \"\";\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"../../workspaceAgentTimelineTypes\";\nimport type {\n WorkspaceAgentSessionDetailMessage,\n WorkspaceAgentSessionDetailThinking,\n WorkspaceAgentSessionDetailTurn\n} from \"../../workspaceAgentSessionDetailViewModel\";\nimport type {\n AgentMessageContentVM,\n AgentMessageRowVM,\n AgentThinkingContentVM\n} from \"../contracts/agentMessageRowVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport { isApprovalToolCall } from \"./agentToolRendererKind\";\nimport { resolveAgentTranscriptPresentationKind } from \"./agentTranscriptPresentation\";\nimport { projectAgentToolCall } from \"./agentToolProjection\";\nimport {\n isCollaborationTimelineItem,\n projectAgentCollaborationVM\n} from \"./agentCollaborationProjection\";\nimport { projectConversationUserRow } from \"./agentConversationUserProjection\";\n\nexport type AgentTurnSequenceItemVM =\n | {\n kind: \"user-message\";\n row: AgentMessageRowVM;\n }\n | {\n kind: \"assistant-message\";\n message: AgentMessageContentVM;\n }\n | {\n kind: \"thinking\";\n thinking: AgentThinkingContentVM;\n }\n | {\n kind: \"tool-call\";\n call: AgentToolCallVM;\n };\n\nexport function buildAgentTurnSequenceItems(\n turn: WorkspaceAgentSessionDetailTurn,\n workspaceId?: string | null\n): AgentTurnSequenceItemVM[] {\n const items = turn.rawAgentItems ?? turn.agentItems;\n const sequence: AgentTurnSequenceItemVM[] = turn.userMessages.map(\n (message) => ({\n kind: \"user-message\",\n row: projectConversationUserRow(message, turn.id, workspaceId)\n })\n );\n items.forEach((item) => {\n if (item.kind === \"message\") {\n sequence.push({\n kind: \"assistant-message\",\n message: projectMessage(item.message, turn.id)\n });\n return;\n }\n if (item.kind === \"thinking\") {\n sequence.push({\n kind: \"thinking\",\n thinking: projectThinking(item.thinking, turn.id)\n });\n return;\n }\n const sourceEntries =\n item.groupEntries ??\n item.toolCalls.map((call) => ({ kind: \"tool-call\", call }) as const);\n sourceEntries.forEach((entry) => {\n if (entry.kind === \"thinking\") {\n sequence.push({\n kind: \"thinking\",\n thinking: projectThinking(entry.thinking, turn.id)\n });\n return;\n }\n if (isApprovalToolCall(entry.call)) {\n return;\n }\n sequence.push({\n kind: \"tool-call\",\n call: projectAgentToolCall(entry.call)\n });\n });\n });\n return sortTurnSequenceItems(sequence);\n}\n\nfunction sortTurnSequenceItems(\n sequence: readonly AgentTurnSequenceItemVM[]\n): AgentTurnSequenceItemVM[] {\n const positioned = sequence.map((item, sourceIndex) => ({\n item,\n sourceIndex,\n position: turnSequencePosition(item)\n }));\n if (positioned.every((entry) => entry.position.seq > 0)) {\n return positioned\n .sort(\n (left, right) =>\n left.position.seq - right.position.seq ||\n left.sourceIndex - right.sourceIndex\n )\n .map((entry) => entry.item);\n }\n if (positioned.every((entry) => entry.position.occurredAtUnixMs > 0)) {\n return positioned\n .sort(\n (left, right) =>\n left.position.occurredAtUnixMs - right.position.occurredAtUnixMs ||\n left.sourceIndex - right.sourceIndex\n )\n .map((entry) => entry.item);\n }\n return [...sequence];\n}\n\nfunction turnSequencePosition(item: AgentTurnSequenceItemVM): {\n seq: number;\n occurredAtUnixMs: number;\n} {\n const sourceItems = turnSequenceSourceItems(item);\n const seq = minimumPositive(\n sourceItems.map((sourceItem) => sourceItem.seq ?? 0)\n );\n const occurredAtUnixMs = minimumPositive(\n sourceItems.map(\n (sourceItem) =>\n sourceItem.occurredAtUnixMs ?? sourceItem.createdAtUnixMs ?? 0\n )\n );\n if (occurredAtUnixMs > 0) {\n return { seq, occurredAtUnixMs };\n }\n switch (item.kind) {\n case \"user-message\":\n return { seq, occurredAtUnixMs: item.row.occurredAtUnixMs ?? 0 };\n case \"assistant-message\":\n return { seq, occurredAtUnixMs: item.message.occurredAtUnixMs ?? 0 };\n case \"thinking\":\n return { seq, occurredAtUnixMs: item.thinking.occurredAtUnixMs ?? 0 };\n case \"tool-call\":\n return { seq, occurredAtUnixMs: item.call.occurredAtUnixMs ?? 0 };\n }\n}\n\nfunction turnSequenceSourceItems(\n item: AgentTurnSequenceItemVM\n): WorkspaceAgentActivityTimelineItem[] {\n switch (item.kind) {\n case \"user-message\":\n return item.row.messages.flatMap(\n (message) => message.sourceTimelineItems ?? []\n );\n case \"assistant-message\":\n return item.message.sourceTimelineItems ?? [];\n case \"thinking\":\n return item.thinking.sourceTimelineItems ?? [];\n case \"tool-call\":\n return item.call.sourceTimelineItems ?? [];\n }\n}\n\nfunction minimumPositive(values: readonly number[]): number {\n return values.reduce(\n (minimum, value) =>\n value > 0 && (minimum === 0 || value < minimum) ? value : minimum,\n 0\n );\n}\n\nfunction projectMessage(\n message: WorkspaceAgentSessionDetailMessage,\n turnId: string\n): AgentMessageContentVM {\n const projected: AgentMessageContentVM = {\n kind: \"message-content\",\n id: message.id,\n turnId: message.turnId ?? turnId,\n body: message.body,\n presentationKind: resolveAgentTranscriptPresentationKind(\n message.systemNotice ?? null\n ),\n statusKind: message.statusKind ?? null,\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n visibleError: message.visibleError ?? null,\n systemNotice: message.systemNotice ?? null\n };\n if (message.sourceTimelineItems) {\n projected.sourceTimelineItems = message.sourceTimelineItems;\n if (\n message.sourceTimelineItems.some(\n (item) => item.payload?.messageKind === \"plan\"\n )\n ) {\n projected.contentKind = \"plan\";\n }\n const collaborationItem = message.sourceTimelineItems.find(\n isCollaborationTimelineItem\n );\n if (collaborationItem) {\n const collaboration = projectAgentCollaborationVM(collaborationItem);\n if (collaboration) {\n projected.contentKind = \"collaboration\";\n projected.collaboration = collaboration;\n }\n }\n }\n return projected;\n}\n\nfunction projectThinking(\n thinking: WorkspaceAgentSessionDetailThinking,\n turnId: string\n): AgentThinkingContentVM {\n const projected: AgentThinkingContentVM = {\n kind: \"thinking-content\",\n id: thinking.id,\n turnId: thinking.turnId ?? turnId,\n body: thinking.body,\n statusKind: thinking.statusKind ?? null,\n occurredAtUnixMs: thinking.occurredAtUnixMs ?? null\n };\n if (thinking.sourceTimelineItems) {\n projected.sourceTimelineItems = thinking.sourceTimelineItems;\n }\n return projected;\n}\n","/**\n * Split a flat list into consecutive runs. A new run starts whenever\n * `sameRun(previousItem, currentItem)` returns false. Total function: every\n * input element lands in exactly one run, runs preserve order, and an empty\n * input yields an empty result. No element is ever dropped or duplicated.\n *\n * This is the segmentation primitive behind neighbour-dependent projections\n * (e.g. coalescing thinking into the message it precedes). Keeping it generic\n * and pure means the grouping decision lives entirely in the `sameRun`\n * predicate, which is trivially table-testable on its own.\n */\nexport function chunkBy<T>(\n items: readonly T[],\n sameRun: (previous: T, current: T) => boolean\n): T[][] {\n const runs: T[][] = [];\n for (const item of items) {\n const current = runs.at(-1);\n if (current && sameRun(current.at(-1)!, item)) {\n current.push(item);\n continue;\n }\n runs.push([item]);\n }\n return runs;\n}\n","import type {\n AgentMessageContentVM,\n AgentThinkingContentVM\n} from \"../contracts/agentMessageRowVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\nimport type { AgentComputedToolGroupVM } from \"./agentToolGroupingProjection\";\nimport type { AgentTurnSequenceItemVM } from \"./agentTurnSequenceProjection\";\nimport {\n projectAgentSingleToolRow,\n projectAgentToolGroupRowFromGroup\n} from \"./agentToolGroupingProjection\";\nimport { chunkBy } from \"./chunkBy\";\n\n/**\n * A render unit is one item that will become (part of) a single transcript\n * row. Unlike the raw turn sequence, tool groups have already been resolved to\n * one unit spanning their calls, and grouped/suppressed indices have been\n * dropped. This flattening is what lets the row pass reason about immediate\n * neighbours instead of looking ahead across skipped indices.\n */\nexport type AgentRenderUnit =\n | { tag: \"tool-group\"; group: AgentComputedToolGroupVM }\n | { tag: \"tool\"; call: AgentToolCallVM }\n | {\n tag: \"user-message\";\n row: Extract<AgentTranscriptRowVM, { kind: \"message\" }>;\n }\n | { tag: \"thinking\"; thinking: AgentThinkingContentVM }\n | { tag: \"message\"; message: AgentMessageContentVM };\n\nexport type AgentRenderUnitTag = AgentRenderUnit[\"tag\"];\n\n/** Pure classifier for a raw turn sequence item. */\nexport function tagOf(\n item: AgentTurnSequenceItemVM\n): \"user-message\" | \"message\" | \"thinking\" | \"tool\" {\n switch (item.kind) {\n case \"user-message\":\n return \"user-message\";\n case \"assistant-message\":\n return \"message\";\n case \"thinking\":\n return \"thinking\";\n case \"tool-call\":\n return \"tool\";\n }\n}\n\n/**\n * Run predicate: a thinking unit is absorbed into the assistant message that\n * immediately follows it (rendered as that message's `thinking`). Every other\n * adjacency starts a new run, so tools, tool groups and lone thinking each\n * become their own row.\n */\nexport function thinkingAbsorbedByMessage(\n previous: AgentRenderUnit,\n current: AgentRenderUnit\n): boolean {\n return previous.tag === \"thinking\" && current.tag === \"message\";\n}\n\n/**\n * Resolve the raw turn sequence into render units: emit one unit per tool\n * group (skipping its span), drop grouped/suppressed indices, and tag the\n * remaining message/thinking/tool items. Removing skipped items here is what\n * makes a thinking and a later message become adjacent units when only\n * suppressed tools sat between them.\n */\nexport function toRenderUnits(\n sequence: readonly AgentTurnSequenceItemVM[],\n groups: ReadonlyMap<number, AgentComputedToolGroupVM>,\n skippedIndices: ReadonlySet<number>\n): AgentRenderUnit[] {\n const units: AgentRenderUnit[] = [];\n for (let index = 0; index < sequence.length; index += 1) {\n const group = groups.get(index);\n if (group) {\n units.push({ tag: \"tool-group\", group });\n index = group.endIndex;\n continue;\n }\n if (skippedIndices.has(index)) {\n continue;\n }\n const item = sequence[index];\n if (!item) {\n continue;\n }\n switch (item.kind) {\n case \"user-message\":\n units.push({ tag: \"user-message\", row: item.row });\n break;\n case \"assistant-message\":\n units.push({ tag: \"message\", message: item.message });\n break;\n case \"thinking\":\n units.push({ tag: \"thinking\", thinking: item.thinking });\n break;\n case \"tool-call\":\n units.push({ tag: \"tool\", call: item.call });\n break;\n }\n }\n return units;\n}\n\n/**\n * Render one run into a transcript row. A run is either a singleton\n * (tool group / tool / lone thinking) or leading thinking units followed by a\n * single assistant message that absorbs them.\n */\nexport function renderRun(\n run: readonly AgentRenderUnit[],\n turnId: string,\n agentSessionId?: string\n): AgentTranscriptRowVM {\n const last = run.at(-1);\n if (!last) {\n throw new Error(\"renderRun received an empty run\");\n }\n if (last.tag === \"tool-group\") {\n return projectAgentToolGroupRowFromGroup(\n turnId,\n last.group,\n agentSessionId\n );\n }\n if (last.tag === \"tool\") {\n return projectAgentSingleToolRow(last.call, turnId);\n }\n if (last.tag === \"user-message\") {\n return last.row;\n }\n const thinking = run\n .filter(\n (unit): unit is Extract<AgentRenderUnit, { tag: \"thinking\" }> =>\n unit.tag === \"thinking\"\n )\n .map((unit) => unit.thinking);\n if (last.tag === \"message\") {\n return {\n kind: \"message\",\n id: `message:assistant:${last.message.id}`,\n turnId: last.message.turnId,\n speaker: \"assistant\",\n messages: [last.message],\n thinking,\n occurredAtUnixMs: last.message.occurredAtUnixMs\n };\n }\n return {\n kind: \"message\",\n id: `message:thinking:${turnId}:${thinking.map((entry) => entry.id).join(\"+\")}`,\n turnId,\n speaker: \"assistant\",\n messages: [],\n thinking,\n occurredAtUnixMs:\n thinking.at(-1)?.occurredAtUnixMs ?? thinking[0]?.occurredAtUnixMs ?? null\n };\n}\n\n/** Project a turn's sequence (with computed groups/skips) into transcript rows. */\nexport function projectTurnRows(\n sequence: readonly AgentTurnSequenceItemVM[],\n groups: ReadonlyMap<number, AgentComputedToolGroupVM>,\n skippedIndices: ReadonlySet<number>,\n turnId: string,\n agentSessionId?: string\n): AgentTranscriptRowVM[] {\n const units = toRenderUnits(sequence, groups, skippedIndices);\n return chunkBy(units, thinkingAbsorbedByMessage).map((run) =>\n renderRun(run, turnId, agentSessionId)\n );\n}\n","import type { WorkspaceAgentSessionDetailViewModel } from \"../../workspaceAgentSessionDetailViewModel\";\nimport type { AgentProcessingRowVM } from \"../contracts/agentProcessingRowVM\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\nimport { agentTranscriptRowHasPresentationKind } from \"./agentTranscriptPresentation\";\n\nexport function projectAgentProcessingRow(\n detail: WorkspaceAgentSessionDetailViewModel,\n rows: readonly AgentTranscriptRowVM[]\n): AgentProcessingRowVM | null {\n if (!detail.showProcessingIndicator) {\n return null;\n }\n const activeTurnId = detail.session.activeTurnId;\n const canonicalTurn = detail.sessionTurns?.find(\n (turn) => turn.turnId === activeTurnId\n );\n if (\n canonicalTurn &&\n canonicalTurn.phase !== \"settled\" &&\n Number.isFinite(canonicalTurn.startedAtUnixMs)\n ) {\n if (activeTurnId && hasTurnTimingHostRow(rows, activeTurnId)) {\n return null;\n }\n return processingRow(detail, activeTurnId);\n }\n const fallbackTurnId = activeTurnId ?? detail.turns.at(-1)?.id ?? null;\n if (fallbackTurnId && hasSpecificProgressRow(rows, fallbackTurnId)) {\n return null;\n }\n return processingRow(detail, fallbackTurnId);\n}\n\nfunction processingRow(\n detail: WorkspaceAgentSessionDetailViewModel,\n turnId: string | null\n): AgentProcessingRowVM {\n return {\n kind: \"processing\",\n id: `processing:${turnId ?? \"session\"}`,\n turnId,\n occurredAtUnixMs:\n detail.session.updatedAtUnixMs ?? detail.session.createdAtUnixMs ?? null\n };\n}\n\nfunction hasTurnTimingHostRow(\n rows: readonly AgentTranscriptRowVM[],\n activeTurnId: string\n): boolean {\n return rows.some((row) => row.turnId === activeTurnId);\n}\n\nfunction hasSpecificProgressRow(\n rows: readonly AgentTranscriptRowVM[],\n activeTurnId: string\n): boolean {\n return rows.some((row) => {\n if (row.turnId !== activeTurnId) {\n return false;\n }\n return (\n agentTranscriptRowHasPresentationKind(row, \"specific-progress\") ||\n (row.kind === \"tool-group\" &&\n row.calls.some(\n (call) =>\n call.statusKind === \"working\" || call.statusKind === \"waiting\"\n ))\n );\n });\n}\n","export type AgentPatchChangeType = \"created\" | \"modified\" | \"deleted\";\n\nexport function normalizeAgentPatchText(text: string): string {\n if (!text) {\n return text;\n }\n const contentField = tryExtractContentField(text);\n if (contentField) {\n return normalizeAgentPatchText(contentField);\n }\n const expanded =\n !text.includes(\"\\n\") && text.includes(\"\\\\n\")\n ? text.replace(/\\\\n/g, \"\\n\")\n : text;\n return expanded\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) =>\n line.trimStart() === \"\\\\"\n ? \"\\\\"\n : line\n )\n .join(\"\\n\");\n}\n\nexport function extractAgentPatchPath(patchText: string | null): string | null {\n const normalized = normalizeAgentPatchText(patchText ?? \"\");\n if (!normalized.trim()) {\n return null;\n }\n\n const applyPatchPath = extractApplyPatchPath(normalized);\n if (applyPatchPath) {\n return applyPatchPath;\n }\n\n const changeType = inferAgentPatchChangeType(normalized);\n const gitHeader = normalized.match(/^diff --git a\\/(.+?) b\\/(.+)$/m);\n const oldPath = gitHeader?.[1]?.trim() ?? null;\n const newPath = gitHeader?.[2]?.trim() ?? null;\n if (oldPath || newPath) {\n return changeType === \"deleted\"\n ? (nonNullPath(oldPath) ?? nonNullPath(newPath))\n : (nonNullPath(newPath) ?? nonNullPath(oldPath));\n }\n\n if (changeType === \"deleted\") {\n return extractOldHeaderPath(normalized);\n }\n return extractNewHeaderPath(normalized);\n}\n\nexport function inferAgentPatchChangeType(\n patchText: string | null\n): AgentPatchChangeType {\n const normalized = normalizeAgentPatchText(patchText ?? \"\").trim();\n if (!normalized) {\n return \"modified\";\n }\n if (\n /^(\\*\\*\\* Delete File:|deleted file mode\\b|\\+\\+\\+ \\/dev\\/null$)/m.test(\n normalized\n )\n ) {\n return \"deleted\";\n }\n if (\n /^(\\*\\*\\* Add File:|new file mode\\b|--- \\/dev\\/null$)/m.test(normalized)\n ) {\n return \"created\";\n }\n return \"modified\";\n}\n\nfunction extractApplyPatchPath(text: string): string | null {\n const match = text.match(/^\\*\\*\\* (?:Add|Delete|Update) File:\\s+(.+?)\\s*$/m);\n return match?.[1]?.trim() || null;\n}\n\nfunction extractOldHeaderPath(text: string): string | null {\n const match = text.match(/^---\\s+(?:a\\/)?([^\\n]+)$/m);\n return nonNullPath(match?.[1]?.trim() ?? null);\n}\n\nfunction extractNewHeaderPath(text: string): string | null {\n const match = text.match(/^\\+\\+\\+\\s+(?:b\\/)?([^\\n]+)$/m);\n return nonNullPath(match?.[1]?.trim() ?? null);\n}\n\nfunction nonNullPath(path: string | null): string | null {\n if (!path || path === \"/dev/null\" || path === \"dev/null\") {\n return null;\n }\n return path;\n}\n\nfunction tryExtractContentField(text: string): string | null {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (\n parsed &&\n typeof parsed === \"object\" &&\n typeof (parsed as { content?: unknown }).content === \"string\"\n ) {\n return (parsed as { content: string }).content;\n }\n return null;\n } catch {\n return null;\n }\n}\n","import { resolveWorkspaceFilePathCandidate } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport type { AgentTurnSummaryFileVM } from \"../contracts/agentTurnSummaryRowVM\";\n\nexport type AgentTurnSummaryChangeType = AgentTurnSummaryFileVM[\"changeType\"];\nexport interface AgentTurnSummaryProjectionOptions {\n defaultCwd?: string | null;\n workspaceRoot?: string | null;\n}\n\nexport function normalizedFilePath(\n value: string | null,\n options: AgentTurnSummaryProjectionOptions = {}\n): string | null {\n const path = value?.trim() ?? \"\";\n if (!path || isStructuredPayloadPath(path) || isIgnoredFilePath(path)) {\n return null;\n }\n return resolveWorkspaceFilePathCandidate({\n path,\n workspaceRoot: options.workspaceRoot,\n basePath: options.defaultCwd\n })\n ? path\n : null;\n}\n\nfunction isIgnoredFilePath(path: string): boolean {\n const normalizedPath = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n return normalizedPath === \"/dev/null\" || normalizedPath === \"NUL\";\n}\n\nfunction isStructuredPayloadPath(path: string): boolean {\n if (/[\\r\\n]/.test(path)) {\n return true;\n }\n if (!path.startsWith(\"{\") && !path.startsWith(\"[\")) {\n return false;\n }\n try {\n JSON.parse(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function applyShortestUniqueFileLabels(\n files: AgentTurnSummaryFileVM[]\n): AgentTurnSummaryFileVM[] {\n const suffixByPath = shortestUniquePathSuffixByPath(\n files.map((file) => file.path)\n );\n return files.map((file) => ({\n ...file,\n label: suffixByPath.get(file.path) ?? file.label\n }));\n}\n\nfunction shortestUniquePathSuffixByPath(paths: string[]): Map<string, string> {\n const partsByPath = new Map(\n paths.map((path) => [path, splitPathSegments(path)])\n );\n const labels = new Map<string, string>();\n const unresolved = new Set(paths);\n for (let depth = 1; unresolved.size > 0; depth += 1) {\n const grouped = new Map<string, string[]>();\n for (const path of unresolved) {\n const parts = partsByPath.get(path) ?? [];\n const label =\n parts.slice(-Math.min(depth, parts.length)).join(\"/\") ||\n parts.at(-1) ||\n path;\n grouped.set(label, [...(grouped.get(label) ?? []), path]);\n }\n let resolvedCount = 0;\n for (const [label, group] of grouped) {\n if (group.length !== 1 || !group[0]) {\n continue;\n }\n labels.set(group[0], label);\n unresolved.delete(group[0]);\n resolvedCount += 1;\n }\n if (resolvedCount === 0) {\n for (const path of unresolved) {\n labels.set(path, path);\n }\n break;\n }\n }\n return labels;\n}\n\nexport function splitFilePath(path: string): {\n fileName: string;\n directory: string | null;\n} {\n const normalized = path.trim();\n const parts = splitPathSegments(normalized);\n if (parts.length <= 1) {\n return { fileName: parts[0] ?? normalized, directory: null };\n }\n return {\n fileName: parts.at(-1) ?? normalized,\n directory: parts.slice(0, -1).join(\"/\")\n };\n}\n\nfunction splitPathSegments(path: string): string[] {\n return path.trim().split(/[\\\\/]/).filter(Boolean);\n}\n\nexport function normalizeChangeType(\n value: string | null\n): AgentTurnSummaryChangeType | null {\n switch ((value ?? \"\").trim().toLowerCase()) {\n case \"add\":\n case \"added\":\n case \"create\":\n case \"created\":\n case \"new\":\n return \"created\";\n case \"modify\":\n case \"modified\":\n case \"edit\":\n case \"edited\":\n case \"change\":\n case \"changed\":\n case \"update\":\n case \"updated\":\n return \"modified\";\n case \"delete\":\n case \"deleted\":\n case \"remove\":\n case \"removed\":\n return \"deleted\";\n default:\n return null;\n }\n}\n\nexport function isFailedToolStatus(value: string | null): boolean {\n const normalized = (value ?? \"\").trim().toLowerCase();\n return [\"failed\", \"error\", \"errored\", \"canceled\", \"cancelled\"].includes(\n normalized\n );\n}\n\nexport function objectValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function firstFileChangeValue(...values: unknown[]): unknown {\n for (const value of values) {\n if (Array.isArray(value) || objectValue(value)) {\n return value;\n }\n }\n return null;\n}\n\nexport function arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nexport function nestedTaskStepsFromPayload(\n payload: Record<string, unknown> | null,\n output: Record<string, unknown> | null\n): unknown[] {\n const candidates = [\n arrayValue(payload?.steps),\n arrayValue(output?.steps),\n arrayValue(objectValue(payload?.metadata)?.steps),\n arrayValue(objectValue(output?.metadata)?.steps)\n ];\n return candidates.find((value) => value && value.length > 0) ?? [];\n}\n\nexport function nestedTaskStepStatusKind(\n step: Record<string, unknown>,\n fallback: string | null\n): string | null {\n return (\n stringValue(step.statusKind) ?? stringValue(step.status) ?? fallback ?? null\n );\n}\n\nexport function stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nexport function literalStringValue(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nexport function firstNonEmptyString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nexport function firstPresentString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\") {\n return value;\n }\n }\n return null;\n}\n","import type {\n WorkspaceAgentSessionDetailToolCall,\n WorkspaceAgentSessionDetailTurn,\n WorkspaceAgentSessionDetailViewModel\n} from \"../../workspaceAgentSessionDetailViewModel\";\nimport type {\n AgentTurnSummaryPatchBatchVM,\n AgentTurnSummaryPatchChangeVM,\n AgentTurnSummaryFileVM,\n AgentTurnSummaryRowVM\n} from \"../contracts/agentTurnSummaryRowVM\";\nimport { inferAgentPatchChangeType } from \"../rules/agentPatchMetadata\";\nimport {\n fileChangeEntriesFromChanges,\n fileChangeTypeValue\n} from \"../../workspaceAgentFileChangePayload\";\nimport {\n applyShortestUniqueFileLabels,\n arrayValue,\n firstFileChangeValue,\n firstNonEmptyString,\n firstPresentString,\n isFailedToolStatus,\n literalStringValue,\n nestedTaskStepsFromPayload,\n nestedTaskStepStatusKind,\n normalizedFilePath,\n normalizeChangeType,\n objectValue,\n splitFilePath,\n stringValue\n} from \"./agentTurnSummaryFileProjection\";\n\ninterface AgentTurnSummaryProjectionOptions {\n defaultCwd?: string | null;\n workspaceRoot?: string | null;\n occurredAtUnixMs?: number | null;\n}\n\n/**\n * Projects the response-tail file list from durable turn state. Tool calls are\n * consulted only for executable Undo/Reapply patch batches; they never infer\n * which files changed or whether a change was create/modify/delete.\n */\nexport function projectAgentTurnSummaryRows(\n detail: WorkspaceAgentSessionDetailViewModel\n): AgentTurnSummaryRowVM[] {\n const transcriptTurnsById = new Map(\n detail.turns.map((turn) => [turn.id, turn])\n );\n return (detail.sessionTurns ?? []).flatMap((turn) => {\n const transcriptTurn = transcriptTurnsById.get(turn.turnId);\n if (\n !isSettledTurnSummaryVisible(detail, turn.turnId, turn.phase) ||\n !turn.fileChanges ||\n !transcriptTurn\n ) {\n return [];\n }\n return projectAgentTurnSummaryRowForTurn(transcriptTurn, turn.fileChanges, {\n defaultCwd: detail.cwd,\n workspaceRoot: detail.workspaceRoot,\n occurredAtUnixMs: turn.updatedAtUnixMs\n });\n });\n}\n\nfunction isSettledTurnSummaryVisible(\n detail: WorkspaceAgentSessionDetailViewModel,\n turnId: string,\n phase: string\n): boolean {\n if (phase !== \"settled\") return false;\n const activeTurn = detail.session.activeTurn;\n if (activeTurn?.turnId === turnId && activeTurn.phase !== \"settled\") {\n return false;\n }\n return (\n detail.showProcessingIndicator !== true ||\n detail.turns.at(-1)?.id !== turnId\n );\n}\n\nexport function projectAgentTurnSummaryRowForTurn(\n turn: WorkspaceAgentSessionDetailTurn,\n fileChanges: Record<string, unknown> | null,\n options: AgentTurnSummaryProjectionOptions = {}\n): AgentTurnSummaryRowVM[] {\n const files = canonicalTurnFiles(turn.id, fileChanges, options);\n if (files.length === 0) {\n return [];\n }\n const visiblePaths = new Set(files.map((file) => file.path));\n const patchBatches = patchBatchesFromCalls(\n turnToolCallsForSummary(turn),\n options\n ).flatMap((batch) => {\n const changes = batch.changes.filter((change) =>\n visiblePaths.has(change.path)\n );\n return changes.length > 0 ? [{ ...batch, changes }] : [];\n });\n const createdCount = files.filter(\n (file) => file.changeType === \"created\"\n ).length;\n return [\n {\n kind: \"turn-summary\",\n id: `turn-summary:${turn.id}`,\n turnId: turn.id,\n files,\n ...(patchBatches.length > 0 ? { patchBatches } : {}),\n fileCount: files.length,\n modifiedCount: files.length - createdCount,\n createdCount,\n occurredAtUnixMs: options.occurredAtUnixMs ?? null\n }\n ];\n}\n\nfunction canonicalTurnFiles(\n turnId: string,\n fileChanges: Record<string, unknown> | null,\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryFileVM[] {\n const byPath = new Map<string, AgentTurnSummaryFileVM>();\n for (const [index, value] of (\n arrayValue(objectValue(fileChanges)?.files) ?? []\n ).entries()) {\n const file = objectValue(value);\n const path = normalizedFilePath(\n firstNonEmptyString(\n stringValue(file?.path),\n stringValue(file?.filePath),\n stringValue(file?.file_path)\n ),\n options\n );\n if (!file || !path) {\n continue;\n }\n const parts = splitFilePath(path);\n byPath.set(path, {\n label: path,\n path,\n fileName: parts.fileName,\n directory: parts.directory,\n changeType:\n normalizeChangeType(\n firstNonEmptyString(\n stringValue(file.change),\n stringValue(file.type),\n stringValue(file.status)\n )\n ) ?? \"modified\",\n toolName: null,\n messageId: `turn-summary:${turnId}:file:${index + 1}`,\n unifiedDiff:\n firstNonEmptyString(\n stringValue(file.unifiedDiff),\n stringValue(file.unified_diff),\n stringValue(file.diff),\n stringValue(file.patch)\n ) ?? null,\n oldString: firstPresentString(\n literalStringValue(file.oldString),\n literalStringValue(file.old_string)\n ),\n newString: firstPresentString(\n literalStringValue(file.newString),\n literalStringValue(file.new_string)\n ),\n content: literalStringValue(file.content),\n occurredAtUnixMs: options.occurredAtUnixMs ?? null\n });\n }\n return applyShortestUniqueFileLabels([...byPath.values()]);\n}\n\nfunction turnToolCallsForSummary(\n turn: WorkspaceAgentSessionDetailTurn\n): WorkspaceAgentSessionDetailToolCall[] {\n const callsById = new Map<string, WorkspaceAgentSessionDetailToolCall>();\n for (const call of turn.toolCalls) {\n callsById.set(call.id, call);\n }\n for (const item of turn.agentItems) {\n if (item.kind !== \"tool-calls\") {\n continue;\n }\n for (const call of item.toolCalls) {\n callsById.set(call.id, call);\n }\n for (const entry of item.groupEntries ?? []) {\n if (entry.kind === \"tool-call\") {\n callsById.set(entry.call.id, entry.call);\n }\n }\n }\n return [...callsById.values()];\n}\n\nfunction patchBatchesFromCalls(\n calls: readonly WorkspaceAgentSessionDetailToolCall[],\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryPatchBatchVM[] {\n return calls.flatMap((call) => patchBatchesFromCall(call, options));\n}\n\nfunction patchBatchesFromCall(\n call: WorkspaceAgentSessionDetailToolCall,\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryPatchBatchVM[] {\n const directBatch = isFailedToolStatus(call.statusKind ?? null)\n ? []\n : patchBatchFromPayload(call.id, call.payload ?? null, null, null, options);\n const output = objectValue(call.payload?.output);\n const nestedBatches = nestedTaskStepsFromPayload(\n call.payload,\n output\n ).flatMap((value, index) => {\n const step = objectValue(value);\n if (\n !step ||\n isFailedToolStatus(\n nestedTaskStepStatusKind(step, call.statusKind ?? null)\n )\n ) {\n return [];\n }\n return patchBatchFromPayload(\n stringValue(step.toolUseId) ??\n stringValue(step.id) ??\n `${call.id}:step:${index + 1}`,\n objectValue(step.payload),\n objectValue(step.toolInput) ?? objectValue(step.tool_input),\n objectValue(step.toolResult) ?? objectValue(step.tool_result),\n options\n );\n });\n return [...directBatch, ...nestedBatches];\n}\n\nfunction patchBatchFromPayload(\n id: string,\n payload: Record<string, unknown> | null,\n toolInput: Record<string, unknown> | null,\n toolOutput: Record<string, unknown> | null,\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryPatchBatchVM[] {\n const toolState = objectValue(payload?.tool_state);\n const metadata = objectValue(payload?.metadata);\n const input =\n toolInput ?? objectValue(payload?.input) ?? objectValue(toolState?.input);\n const output =\n toolOutput ??\n objectValue(payload?.output) ??\n objectValue(toolState?.output);\n const rawInput = objectValue(input?.rawInput);\n const changes = firstFileChangeValue(\n output?.changes,\n payload?.changes,\n input?.changes,\n rawInput?.changes\n );\n const patchChanges = patchChangesFromChangeMap(changes);\n if (patchChanges.length === 0) {\n return [];\n }\n return [\n {\n cwd:\n firstNonEmptyString(\n stringValue(payload?.cwd),\n stringValue(input?.cwd),\n stringValue(rawInput?.cwd),\n stringValue(output?.cwd),\n stringValue(metadata?.cwd),\n options.defaultCwd ?? null\n ) ?? null,\n toolCallId: id,\n changes: patchChanges\n }\n ];\n}\n\nfunction patchChangesFromChangeMap(\n changes: unknown\n): AgentTurnSummaryPatchChangeVM[] {\n return fileChangeEntriesFromChanges(changes).flatMap((entry) => {\n const change = entry.change;\n const path = entry.path.trim();\n if (!path) {\n return [];\n }\n const changeType = normalizeChangeType(fileChangeTypeValue(change));\n const unifiedDiff =\n firstNonEmptyString(\n stringValue(change.unified_diff),\n stringValue(change.unifiedDiff),\n stringValue(change.diff),\n stringValue(change.patch)\n ) ?? null;\n let oldString = firstPresentString(\n literalStringValue(change.old_string),\n literalStringValue(change.oldString)\n );\n const explicitContent = literalStringValue(change.content);\n let newString = firstPresentString(\n literalStringValue(change.new_string),\n literalStringValue(change.newString),\n explicitContent\n );\n if (changeType === \"created\" && oldString === null && newString !== null) {\n oldString = \"\";\n }\n if (changeType === \"deleted\" && oldString === null && newString !== null) {\n oldString = newString;\n newString = \"\";\n }\n if (changeType === \"deleted\" && newString === null && oldString !== null) {\n newString = \"\";\n }\n const content = firstPresentString(\n changeType === \"deleted\" ? null : explicitContent,\n changeType === \"created\" ? newString : null\n );\n if (\n !unifiedDiff &&\n oldString === null &&\n newString === null &&\n content === null\n ) {\n return [];\n }\n return [\n {\n path,\n changeType: changeType ?? inferAgentPatchChangeType(unifiedDiff),\n unifiedDiff,\n oldString,\n newString,\n content\n }\n ];\n });\n}\n","import type {\n WorkspaceAgentSessionDetailTurn,\n WorkspaceAgentSessionDetailViewModel\n} from \"../../workspaceAgentSessionDetailViewModel\";\nimport { extractImageGenerationPreview } from \"../../imageGenerationTool\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport type { AgentGeneratedImageRowVM } from \"../contracts/agentGeneratedImageRowVM\";\nimport type { AgentGoalControlRowVM } from \"../contracts/agentGoalControlRowVM\";\nimport type {\n AgentMessageContentVM,\n AgentMessageRowVM\n} from \"../contracts/agentMessageRowVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\nimport { projectAgentMessageFinalText } from \"./agentMessageFinalTextProjection\";\nimport { computeAgentToolGroups } from \"./agentToolGroupingProjection\";\nimport { buildAgentTurnSequenceItems } from \"./agentTurnSequenceProjection\";\nimport { projectTurnRows } from \"./agentTurnRowProjection\";\nimport { projectAgentProcessingRow } from \"./agentProcessingProjection\";\nimport { projectAgentTurnSummaryRows } from \"./agentTurnSummaryProjection\";\n\nexport interface AgentConversationProjectionOptions {\n avoidGroupingEdits?: boolean;\n}\n\nconst RENDER_IRRELEVANT_TRANSCRIPT_ROW_FIELDS = new Set([\"occurredAtUnixMs\"]);\nconst CODEX_SKILLS_CONTEXT_BUDGET_NOTICE_FRAGMENT =\n \"skill descriptions were shortened to fit the 2% skills context budget\";\nconst CODEX_MODEL_METADATA_FALLBACK_NOTICE_FRAGMENT =\n \"defaulting to fallback metadata\";\nconst MARKDOWN_IMAGE_PATTERN =\n /!\\[[^\\]]*]\\(\\s*(?:<([^>]+)>|([^)\\s]+))(?:\\s+[\"'][^\"']*[\"'])?\\s*\\)/g;\n\nexport function projectAgentConversationVM(\n detail: WorkspaceAgentSessionDetailViewModel,\n options: AgentConversationProjectionOptions = {}\n): AgentConversationVM {\n const rows: AgentTranscriptRowVM[] = [];\n const turns = detail.turns;\n const summariesByTurnId = new Map(\n projectAgentTurnSummaryRows(detail).map((summary) => [\n summary.turnId,\n summary\n ])\n );\n\n turns.forEach((turn) => {\n rows.push(\n ...projectTurnConversationRows(turn, detail.session.workspaceId, {\n agentSessionId: detail.session.agentSessionId,\n avoidGroupingEdits: options.avoidGroupingEdits\n })\n );\n const summary = summariesByTurnId.get(turn.id);\n if (summary) rows.push(summary);\n });\n\n const normalizedRows = dropCodexRuntimeDiagnosticNotices(\n dropRedundantErrorWarningNotices(\n mergeAdjacentAssistantMessageRows(\n dropRedundantCompactFailureEchoRows(\n mergeAdjacentTransportRetryNoticeRows(rows)\n )\n )\n )\n );\n const timelineRows = insertGoalControlRows(normalizedRows, detail);\n const processing = projectAgentProcessingRow(detail, timelineRows);\n const projectedRows = projectAgentMessageFinalText(\n processing ? [...timelineRows, processing] : timelineRows,\n detail\n );\n\n return {\n activity: detail.activity,\n workspaceRoot: detail.workspaceRoot,\n sourceDetail: detail,\n rows: projectedRows\n };\n}\n\nfunction insertGoalControlRows(\n rows: readonly AgentTranscriptRowVM[],\n detail: WorkspaceAgentSessionDetailViewModel\n): AgentTranscriptRowVM[] {\n const controls = detail.goalControls ?? [];\n if (controls.length === 0) {\n return [...rows];\n }\n const merged = [...rows];\n for (const control of controls) {\n const row: AgentGoalControlRowVM = {\n kind: \"goal-control\",\n id: `goal-control:${control.id}`,\n turnId: null,\n action: control.action,\n body: control.body,\n occurredAtUnixMs: control.occurredAtUnixMs ?? null,\n sourceTimelineItems: control.sourceTimelineItems\n };\n const insertionIndex = merged.findIndex(\n (candidate) =>\n row.occurredAtUnixMs !== null &&\n candidate.occurredAtUnixMs !== null &&\n candidate.occurredAtUnixMs > row.occurredAtUnixMs\n );\n if (insertionIndex < 0) {\n merged.push(row);\n } else {\n merged.splice(insertionIndex, 0, row);\n }\n }\n return merged;\n}\n\nfunction dropRedundantCompactFailureEchoRows(\n rows: readonly AgentTranscriptRowVM[]\n): AgentTranscriptRowVM[] {\n const filtered: AgentTranscriptRowVM[] = [];\n for (const row of rows) {\n const previous = filtered.at(-1);\n if (\n isSingleCompactFailureNoticeRow(previous) &&\n isSinglePlainAssistantMessageRow(row) &&\n previous.turnId === row.turnId &&\n previous.messages[0]?.systemNotice?.detail?.trim() ===\n row.messages[0]?.body.trim()\n ) {\n continue;\n }\n filtered.push(row);\n }\n return filtered;\n}\n\nfunction isSingleCompactFailureNoticeRow(\n row: AgentTranscriptRowVM | undefined\n): row is AgentMessageRowVM {\n if (\n !row ||\n row.kind !== \"message\" ||\n row.speaker !== \"assistant\" ||\n row.thinking.length > 0 ||\n row.messages.length !== 1\n ) {\n return false;\n }\n const notice = row.messages[0]?.systemNotice;\n return (\n notice?.command === \"compact\" &&\n notice.commandStatus === \"failed\" &&\n Boolean(notice.detail?.trim())\n );\n}\n\nfunction isSinglePlainAssistantMessageRow(\n row: AgentTranscriptRowVM\n): row is AgentMessageRowVM {\n return (\n row.kind === \"message\" &&\n row.speaker === \"assistant\" &&\n row.thinking.length === 0 &&\n row.messages.length === 1 &&\n !row.messages[0]?.visibleError &&\n !row.messages[0]?.systemNotice\n );\n}\n\n/**\n * Latest plain assistant reply in the projected transcript (newest first).\n * Used as the optional consult context; error cards, system notices, plan and\n * collaboration cards are skipped so only ordinary reply text qualifies.\n */\nexport function latestAssistantMessageText(\n conversation: Pick<AgentConversationVM, \"rows\"> | null | undefined\n): string | null {\n if (!conversation) {\n return null;\n }\n for (let rowIndex = conversation.rows.length - 1; rowIndex >= 0; rowIndex--) {\n const row = conversation.rows[rowIndex];\n if (row?.kind !== \"message\" || row.speaker !== \"assistant\") {\n continue;\n }\n for (\n let messageIndex = row.messages.length - 1;\n messageIndex >= 0;\n messageIndex--\n ) {\n const message = row.messages[messageIndex];\n if (!message || message.visibleError || message.systemNotice) {\n continue;\n }\n if (message.contentKind && message.contentKind !== \"text\") {\n continue;\n }\n const body = message.body.trim();\n if (body) {\n return body;\n }\n }\n }\n return null;\n}\n\nexport function reconcileProjectedAgentConversationVM(\n previous: AgentConversationVM | null | undefined,\n next: AgentConversationVM\n): AgentConversationVM {\n if (!previous) {\n return next;\n }\n\n const previousRowsById = new Map(previous.rows.map((row) => [row.id, row]));\n let reusedRowCount = 0;\n const rows = next.rows.map((row) => {\n const previousRow = previousRowsById.get(row.id);\n if (previousRow && equivalentTranscriptRowForRender(previousRow, row)) {\n reusedRowCount += 1;\n return previousRow;\n }\n return row;\n });\n const rowsArrayReused =\n reusedRowCount === next.rows.length &&\n next.rows.length === previous.rows.length &&\n next.rows.every((_row, index) => rows[index] === previous.rows[index]);\n\n return {\n ...next,\n rows: rowsArrayReused ? previous.rows : rows\n };\n}\n\nfunction equivalentTranscriptRowForRender(\n previous: AgentTranscriptRowVM,\n next: AgentTranscriptRowVM\n): boolean {\n return equivalentValueIgnoringKeys(\n previous,\n next,\n RENDER_IRRELEVANT_TRANSCRIPT_ROW_FIELDS\n );\n}\n\nfunction equivalentValueIgnoringKeys(\n left: unknown,\n right: unknown,\n ignoredKeys: ReadonlySet<string>\n): boolean {\n if (Object.is(left, right)) {\n return true;\n }\n if (typeof left !== typeof right || left === null || right === null) {\n return false;\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n return (\n Array.isArray(left) &&\n Array.isArray(right) &&\n left.length === right.length &&\n left.every((value, index) =>\n equivalentValueIgnoringKeys(value, right[index], ignoredKeys)\n )\n );\n }\n if (typeof left !== \"object\" || typeof right !== \"object\") {\n return false;\n }\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const leftKeys = Object.keys(leftRecord).filter(\n (key) => !ignoredKeys.has(key)\n );\n const rightKeys = Object.keys(rightRecord).filter(\n (key) => !ignoredKeys.has(key)\n );\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(rightRecord, key) &&\n equivalentValueIgnoringKeys(\n leftRecord[key],\n rightRecord[key],\n ignoredKeys\n )\n )\n );\n}\n\nfunction mergeAdjacentAssistantMessageRows(\n rows: readonly AgentTranscriptRowVM[]\n): AgentTranscriptRowVM[] {\n const merged: AgentTranscriptRowVM[] = [];\n for (const row of rows) {\n const previous = merged.at(-1);\n if (\n isMergeableAssistantMessageRow(previous) &&\n canMergeAdjacentAssistantMessageRows(previous, row)\n ) {\n const lastMessage = previous.messages.at(-1);\n const nextMessage = row.messages[0];\n if (lastMessage && nextMessage) {\n lastMessage.body += nextMessage.body;\n lastMessage.statusKind =\n nextMessage.statusKind ?? lastMessage.statusKind ?? null;\n lastMessage.occurredAtUnixMs =\n nextMessage.occurredAtUnixMs ?? lastMessage.occurredAtUnixMs;\n }\n if (row.messages.length > 1) {\n previous.messages.push(...row.messages.slice(1));\n }\n previous.occurredAtUnixMs =\n row.occurredAtUnixMs ?? previous.occurredAtUnixMs;\n continue;\n }\n merged.push(row);\n }\n return merged;\n}\n\nfunction dropCodexRuntimeDiagnosticNotices(\n rows: readonly AgentTranscriptRowVM[]\n): AgentTranscriptRowVM[] {\n const filteredRows: AgentTranscriptRowVM[] = [];\n for (const row of rows) {\n if (row.kind !== \"message\" || row.speaker !== \"assistant\") {\n filteredRows.push(row);\n continue;\n }\n const messages = row.messages.filter(\n (message) => !isCodexSkillsContextBudgetNotice(message)\n );\n if (messages.length === 0 && row.thinking.length === 0) {\n continue;\n }\n if (messages.length === row.messages.length) {\n filteredRows.push(row);\n continue;\n }\n filteredRows.push({ ...row, messages });\n }\n return filteredRows;\n}\n\nfunction isCodexSkillsContextBudgetNotice(\n message: AgentMessageContentVM\n): boolean {\n const notice = message.systemNotice;\n if (!notice || notice.noticeKind !== \"warning\") {\n return false;\n }\n if (notice.source !== \"runtime\") {\n return false;\n }\n const text = [notice.title, notice.detail, message.body]\n .filter(Boolean)\n .join(\"\\n\")\n .toLowerCase();\n return (\n text.includes(CODEX_SKILLS_CONTEXT_BUDGET_NOTICE_FRAGMENT) ||\n text.includes(CODEX_MODEL_METADATA_FALLBACK_NOTICE_FRAGMENT)\n );\n}\n\nfunction dropRedundantErrorWarningNotices(\n rows: readonly AgentTranscriptRowVM[]\n): AgentTranscriptRowVM[] {\n const turnsWithVisibleError = new Set<string>();\n for (const row of rows) {\n if (row.kind !== \"message\" || row.speaker !== \"assistant\") {\n continue;\n }\n for (const message of row.messages) {\n if (message.visibleError) {\n turnsWithVisibleError.add(row.turnId);\n }\n }\n }\n if (turnsWithVisibleError.size === 0) {\n return [...rows];\n }\n\n const filteredRows: AgentTranscriptRowVM[] = [];\n for (const row of rows) {\n if (row.kind !== \"message\" || row.speaker !== \"assistant\") {\n filteredRows.push(row);\n continue;\n }\n if (!turnsWithVisibleError.has(row.turnId)) {\n filteredRows.push(row);\n continue;\n }\n const messages = row.messages.filter(\n (message) => !isRedundantErrorWarningNotice(message)\n );\n if (messages.length === 0) {\n continue;\n }\n if (messages.length === row.messages.length) {\n filteredRows.push(row);\n continue;\n }\n filteredRows.push({ ...row, messages });\n }\n return filteredRows;\n}\n\nfunction isRedundantErrorWarningNotice(\n message: AgentMessageContentVM\n): boolean {\n const notice = message.systemNotice;\n if (!notice || notice.noticeKind !== \"warning\") {\n return false;\n }\n const title = notice.title?.trim() ?? \"\";\n return title === \"Codex reported an error.\";\n}\n\nfunction mergeAdjacentTransportRetryNoticeRows(\n rows: readonly AgentTranscriptRowVM[]\n): AgentTranscriptRowVM[] {\n const merged: AgentTranscriptRowVM[] = [];\n for (const row of rows) {\n const previous = merged.at(-1);\n if (\n isSingleTransportRetryNoticeRow(previous) &&\n isSingleTransportRetryNoticeRow(row) &&\n previous.turnId === row.turnId\n ) {\n const previousMessage = previous.messages[0];\n const nextMessage = row.messages[0];\n if (!previousMessage || !nextMessage) {\n merged.push(row);\n continue;\n }\n const sourceTimelineItems = mergeSourceTimelineItems(\n previousMessage.sourceTimelineItems,\n nextMessage.sourceTimelineItems\n );\n previous.messages[0] = {\n ...previousMessage,\n body: nextMessage.body || previousMessage.body,\n systemNotice: nextMessage.systemNotice ?? previousMessage.systemNotice,\n statusKind:\n nextMessage.statusKind ?? previousMessage.statusKind ?? null,\n occurredAtUnixMs:\n nextMessage.occurredAtUnixMs ?? previousMessage.occurredAtUnixMs,\n ...(sourceTimelineItems ? { sourceTimelineItems } : {})\n };\n previous.occurredAtUnixMs =\n row.occurredAtUnixMs ?? previous.occurredAtUnixMs;\n continue;\n }\n merged.push(row);\n }\n return merged;\n}\n\nfunction isSingleTransportRetryNoticeRow(\n row: AgentTranscriptRowVM | undefined\n): row is AgentMessageRowVM {\n if (\n !row ||\n row.kind !== \"message\" ||\n row.speaker !== \"assistant\" ||\n row.thinking.length > 0 ||\n row.messages.length !== 1\n ) {\n return false;\n }\n return row.messages[0]?.systemNotice?.noticeKind === \"transport_retry\";\n}\n\nfunction mergeSourceTimelineItems(\n previous: AgentMessageContentVM[\"sourceTimelineItems\"],\n next: AgentMessageContentVM[\"sourceTimelineItems\"]\n): AgentMessageContentVM[\"sourceTimelineItems\"] {\n if (!previous || previous.length === 0) {\n return next;\n }\n if (!next || next.length === 0) {\n return previous;\n }\n return [...previous, ...next];\n}\n\nfunction isMergeableAssistantMessageRow(\n row: AgentTranscriptRowVM | undefined\n): row is AgentMessageRowVM {\n return Boolean(\n row &&\n row.kind === \"message\" &&\n row.speaker === \"assistant\" &&\n row.thinking.length === 0 &&\n !row.messages.some(isSpecialAssistantMessage)\n );\n}\n\nfunction canMergeAdjacentAssistantMessageRows(\n previous: AgentMessageRowVM,\n next: AgentTranscriptRowVM\n): next is AgentMessageRowVM {\n return (\n next.kind === \"message\" &&\n next.speaker === \"assistant\" &&\n next.thinking.length === 0 &&\n previous.turnId === next.turnId &&\n !next.messages.some(isSpecialAssistantMessage)\n );\n}\n\nfunction isSpecialAssistantMessage(message: {\n visibleError?: unknown;\n systemNotice?: unknown;\n contentKind?: string;\n}): boolean {\n return Boolean(\n message.visibleError ||\n message.systemNotice ||\n message.contentKind === \"plan\" ||\n message.contentKind === \"collaboration\"\n );\n}\n\nfunction projectTurnConversationRows(\n turn: WorkspaceAgentSessionDetailTurn,\n workspaceId: string | null | undefined,\n options: {\n agentSessionId: string;\n avoidGroupingEdits?: boolean;\n }\n): AgentTranscriptRowVM[] {\n const sequence = buildAgentTurnSequenceItems(turn, workspaceId);\n const { groups, groupedIndices, suppressedIndices } = computeAgentToolGroups(\n sequence,\n options\n );\n const skippedIndices = new Set([...groupedIndices, ...suppressedIndices]);\n return promoteGeneratedImageRows(\n projectTurnRows(\n sequence,\n groups,\n skippedIndices,\n turn.id,\n options.agentSessionId\n )\n );\n}\n\nfunction promoteGeneratedImageRows(\n rows: readonly AgentTranscriptRowVM[]\n): AgentTranscriptRowVM[] {\n const promoted: AgentTranscriptRowVM[] = [];\n for (const row of rows) {\n promoted.push(row);\n if (row.kind !== \"tool-group\") {\n continue;\n }\n for (const call of row.calls) {\n const artifact = projectGeneratedImageRow(call, row.turnId);\n if (artifact) {\n promoted.push(artifact);\n }\n }\n }\n return dropDuplicateGeneratedImageMarkdown(promoted);\n}\n\nfunction dropDuplicateGeneratedImageMarkdown(\n rows: readonly AgentTranscriptRowVM[]\n): AgentTranscriptRowVM[] {\n const generatedImagesByTurn = new Map<string, Set<string>>();\n for (const row of rows) {\n if (row.kind !== \"generated-image\") {\n continue;\n }\n const reference = normalizeGeneratedImageReference(row.uri);\n if (!reference) {\n continue;\n }\n const references = generatedImagesByTurn.get(row.turnId) ?? new Set();\n references.add(reference);\n generatedImagesByTurn.set(row.turnId, references);\n }\n if (generatedImagesByTurn.size === 0) {\n return [...rows];\n }\n\n const filtered: AgentTranscriptRowVM[] = [];\n for (const row of rows) {\n if (row.kind !== \"message\" || row.speaker !== \"assistant\") {\n filtered.push(row);\n continue;\n }\n const generatedImages = generatedImagesByTurn.get(row.turnId);\n if (!generatedImages) {\n filtered.push(row);\n continue;\n }\n let changed = false;\n const messages = row.messages.flatMap((message) => {\n const body = removeGeneratedImageMarkdown(message.body, generatedImages);\n if (body === message.body) {\n return [message];\n }\n changed = true;\n return body ? [{ ...message, body }] : [];\n });\n if (messages.length === 0 && row.thinking.length === 0) {\n continue;\n }\n filtered.push(changed ? { ...row, messages } : row);\n }\n return filtered;\n}\n\nfunction removeGeneratedImageMarkdown(\n body: string,\n generatedImages: ReadonlySet<string>\n): string {\n let removed = false;\n const next = body.replace(\n MARKDOWN_IMAGE_PATTERN,\n (\n match,\n angleReference: string | undefined,\n plainReference: string | undefined\n ) => {\n const reference = normalizeGeneratedImageReference(\n angleReference ?? plainReference ?? \"\"\n );\n if (!reference || !generatedImages.has(reference)) {\n return match;\n }\n removed = true;\n return \"\";\n }\n );\n return removed\n ? next\n .replace(/[ \\t]+\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim()\n : body;\n}\n\nfunction normalizeGeneratedImageReference(reference: string): string | null {\n let normalized = reference.trim();\n if (!normalized) {\n return null;\n }\n if (/^file:\\/\\//i.test(normalized)) {\n if (!URL.canParse(normalized)) {\n return null;\n }\n normalized = new URL(normalized).pathname;\n } else if (/^[a-z][a-z\\d+.-]*:\\/\\//i.test(normalized)) {\n return URL.canParse(normalized) ? new URL(normalized).href : normalized;\n }\n normalized = decodePercentEncodedReference(normalized);\n normalized = normalized.replaceAll(\"\\\\\", \"/\");\n const prefix = normalized.startsWith(\"/\") ? \"/\" : \"\";\n const parts: string[] = [];\n for (const part of normalized.split(\"/\")) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\" && parts.length > 0) {\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n const collapsed = `${prefix}${parts.join(\"/\")}`;\n return /^[a-z]:\\//i.test(collapsed) ? collapsed.toLowerCase() : collapsed;\n}\n\nfunction decodePercentEncodedReference(reference: string): string {\n return reference.replace(/(?:%[a-f\\d]{2})+/gi, (encodedRun) => {\n const bytes = encodedRun\n .slice(1)\n .split(\"%\")\n .map((hex) => Number.parseInt(hex, 16));\n return new TextDecoder().decode(Uint8Array.from(bytes));\n });\n}\n\nfunction projectGeneratedImageRow(\n call: AgentToolCallVM,\n turnId: string\n): AgentGeneratedImageRowVM | null {\n if (\n call.rendererKind !== \"image-generation\" ||\n call.statusKind !== \"completed\"\n ) {\n return null;\n }\n const image = extractImageGenerationPreview({\n toolName: call.toolName,\n displayName: call.name,\n content: call.content,\n outputContent: call.output?.content,\n outputSavedPath: call.output?.savedPath ?? call.output?.saved_path,\n inputPrompt: call.input?.prompt,\n payloadInputPrompt:\n call.payload?.input &&\n typeof call.payload.input === \"object\" &&\n !Array.isArray(call.payload.input)\n ? (call.payload.input as Record<string, unknown>).prompt\n : null\n });\n if (!image.imageUri) {\n return null;\n }\n return {\n kind: \"generated-image\",\n id: `generated-image:${call.id}`,\n turnId,\n sourceCallId: call.id,\n uri: image.imageUri,\n mimeType: image.mimeType,\n prompt: image.prompt,\n occurredAtUnixMs: call.occurredAtUnixMs\n };\n}\n","import type {\n AgentActivityMessage,\n AgentPromptContentBlock\n} from \"@tutti-os/agent-activity-core\";\nimport { isLocalImagePath } from \"../../../shared/imageGenerationTool\";\nimport type { AgentActivityRuntime } from \"../../../agentActivityRuntime\";\n\nconst COPY_PAGE_SIZE = 200;\nconst MAX_COPY_PAGES = 1_000;\n\n// Per-image cap (binary bytes) for embedding into the hydrated text/html\n// variant. Larger images keep the lean reference instead and are surfaced to\n// the user through the omittedImages count.\nexport const AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES = 2 * 1024 * 1024;\n\nexport type AgentGUIConversationCopyAction = \"copy-markdown\" | \"copy-reference\";\n\nexport interface AgentGUIConversationCopyLabels {\n file: string;\n image: string;\n mentionPrefix: string;\n /** Template for the collapsed-interim summary; contains `{{count}}`. */\n previousMessages: string;\n}\n\nexport interface AgentGUIConversationAttachment {\n data: string;\n mimeType: string;\n name?: string;\n}\n\n/** Hydrates a local workspace image path into base64 bytes at copy time. */\nexport type AgentGUIConversationLocalImageReader = (input: {\n path: string;\n mimeType: string | null;\n}) => Promise<AgentGUIConversationAttachment>;\n\nexport interface AgentGUIConversationSerializedTranscript {\n /** Hydrated variant for the text/html flavor: images embed as data URIs. */\n hydratedMarkdown: string;\n /** Lean variant for text/plain: short image references, never base64. */\n markdown: string;\n /** Hydratable images left unembedded (oversized or failed reads). */\n omittedImages: number;\n}\n\nexport async function loadCompleteAgentConversationMessages(input: {\n agentSessionId: string;\n runtime: Pick<AgentActivityRuntime, \"listSessionMessages\">;\n workspaceId: string;\n}): Promise<AgentActivityMessage[]> {\n const messagesById = new Map<string, AgentActivityMessage>();\n let beforeVersion: number | undefined;\n\n for (let pageIndex = 0; pageIndex < MAX_COPY_PAGES; pageIndex += 1) {\n const page = await input.runtime.listSessionMessages({\n agentSessionId: input.agentSessionId,\n ...(beforeVersion === undefined ? {} : { beforeVersion }),\n cache: false,\n limit: COPY_PAGE_SIZE,\n order: \"desc\",\n workspaceId: input.workspaceId\n });\n\n for (const message of page.messages) {\n const key = message.messageId.trim() || `${message.version}`;\n const existing = messagesById.get(key);\n if (!existing || message.version >= existing.version) {\n messagesById.set(key, message);\n }\n }\n\n if (!page.hasMore) {\n return [...messagesById.values()].sort(compareMessagesAscending);\n }\n\n const nextBeforeVersion = minimumPositiveVersion(page.messages);\n if (\n nextBeforeVersion === null ||\n (beforeVersion !== undefined && nextBeforeVersion >= beforeVersion)\n ) {\n throw new Error(\"Conversation message pagination did not advance.\");\n }\n beforeVersion = nextBeforeVersion;\n }\n\n throw new Error(\"Conversation message pagination exceeded the safety limit.\");\n}\n\n// Lean Codex-export-style transcript: user inputs and per-turn final agent\n// replies are kept in full; interim agent narration collapses into one\n// <details> block per assistant run; tool payloads are dropped except image\n// outputs (session deliverables such as generated images), which are emitted\n// plain; thinking, runtime system notices, and JSON fallbacks are dropped.\n// One message walk accumulates two parallel variants that differ only on\n// image targets: `markdown` (text/plain) keeps short references — source\n// link, attachment:ID, or a bold label — and never carries base64, while\n// `hydratedMarkdown` (rendered into the text/html flavor) embeds image bytes\n// as data URIs from inline data, the runtime attachment store, and local\n// workspace paths via the host reader, because rich-paste targets consume\n// data URIs but cannot fetch local paths.\nexport async function serializeAgentConversationForClipboard(input: {\n labels: AgentGUIConversationCopyLabels;\n messages: readonly AgentActivityMessage[];\n readAttachment?: (\n attachmentId: string\n ) => Promise<AgentGUIConversationAttachment>;\n readLocalImage?: AgentGUIConversationLocalImageReader;\n title: string;\n}): Promise<AgentGUIConversationSerializedTranscript> {\n const context: SerializeContext = {\n labels: input.labels,\n readAttachment: input.readAttachment,\n readLocalImage: input.readLocalImage,\n stats: { omittedImages: 0 }\n };\n const kept: {\n body: SerializedBody;\n isToolImage?: boolean;\n role: \"assistant\" | \"user\";\n }[] = [];\n for (const message of [...input.messages].sort(compareMessagesAscending)) {\n if (isSystemNoticeMessage(message)) {\n continue;\n }\n if (isToolMessage(message)) {\n const body = await serializeImagesOnly(message.payload ?? {}, context);\n if (body.plain) {\n kept.push({ body, isToolImage: true, role: \"assistant\" });\n }\n continue;\n }\n const role = keptMessageRole(message);\n if (!role) {\n continue;\n }\n const body = await serializeMessageContent(message.payload ?? {}, context);\n if (body.plain) {\n kept.push({ body, role });\n }\n }\n\n // Both variants assemble in lockstep from the same kept entries so the\n // grouping (blockquotes, details collapse, ordering) stays identical and\n // only image targets differ.\n const markdownBlocks: string[] = [`# ${singleLine(input.title)}`];\n const hydratedBlocks: string[] = [`# ${singleLine(input.title)}`];\n const pushBlock = (plain: string, hydrated: string): void => {\n markdownBlocks.push(plain);\n hydratedBlocks.push(hydrated);\n };\n let index = 0;\n while (index < kept.length) {\n const entry = kept[index]!;\n if (entry.role === \"user\") {\n pushBlock(\n blockquoteMarkdown(entry.body.plain),\n blockquoteMarkdown(entry.body.hydrated)\n );\n index += 1;\n continue;\n }\n let last = index;\n while (last + 1 < kept.length && kept[last + 1]!.role === \"assistant\") {\n last += 1;\n }\n const run = kept.slice(index, last + 1);\n const textEntries = run.filter((item) => !item.isToolImage);\n const interim = textEntries.slice(0, -1);\n const finalText = textEntries.at(-1);\n if (interim.length > 0) {\n const summary = input.labels.previousMessages.replace(\n \"{{count}}\",\n `${interim.length}`\n );\n const detailsBlock = (side: keyof SerializedBody): string =>\n [\n `<details><summary>${summary}</summary>`,\n ...interim.map((item) => blockquoteMarkdown(item.body[side])),\n \"</details>\"\n ].join(\"\\n\\n\");\n pushBlock(detailsBlock(\"plain\"), detailsBlock(\"hydrated\"));\n }\n for (const item of run) {\n if (item.isToolImage || item === finalText) {\n pushBlock(item.body.plain, item.body.hydrated);\n }\n }\n index = last + 1;\n }\n\n return {\n hydratedMarkdown: hydratedBlocks.join(\"\\n\\n\").trim(),\n markdown: markdownBlocks.join(\"\\n\\n\").trim(),\n omittedImages: context.stats.omittedImages\n };\n}\n\ninterface SerializeContext {\n labels: AgentGUIConversationCopyLabels;\n readAttachment?: (\n attachmentId: string\n ) => Promise<AgentGUIConversationAttachment>;\n readLocalImage?: AgentGUIConversationLocalImageReader;\n stats: { omittedImages: number };\n}\n\n// The plain/hydrated variants of one serialized fragment. Only image blocks\n// diverge; every other block serializes identically on both sides.\ninterface SerializedBody {\n hydrated: string;\n plain: string;\n}\n\nfunction sameBody(value: string): SerializedBody {\n return { hydrated: value, plain: value };\n}\n\nfunction joinBodies(bodies: readonly SerializedBody[]): SerializedBody {\n return {\n hydrated: bodies\n .map((body) => body.hydrated)\n .filter(Boolean)\n .join(\"\\n\\n\")\n .trim(),\n plain: bodies\n .map((body) => body.plain)\n .filter(Boolean)\n .join(\"\\n\\n\")\n .trim()\n };\n}\n\nfunction keptMessageRole(\n message: AgentActivityMessage\n): \"assistant\" | \"user\" | null {\n const role = normalizedRole(message.role);\n if (role === \"user\") {\n return \"user\";\n }\n if (role === \"assistant\" || role === \"agent\") {\n return \"assistant\";\n }\n return null;\n}\n\n// Single-pass .replace over newlines (not split/map/join) keeps peak memory\n// low: bodies can carry large inline data-URI images.\nfunction blockquoteMarkdown(value: string): string {\n const quoted = value.replace(/\\n(.?)/g, (_match, next: string) =>\n next ? `\\n> ${next}` : \"\\n>\"\n );\n return `> ${quoted}`;\n}\n\nasync function serializeMessageContent(\n payload: Record<string, unknown>,\n context: SerializeContext\n): Promise<SerializedBody> {\n const content = payload.content;\n if (Array.isArray(content)) {\n const blocks = await Promise.all(\n content.map((block) => serializeContentValue(block, context))\n );\n const serialized = joinBodies(blocks);\n if (serialized.plain) {\n return serialized;\n }\n } else if (typeof content === \"string\" && content.trim()) {\n return sameBody(content.trim());\n }\n\n return sameBody(\n firstString(\n payload.displayPrompt,\n payload.text,\n payload.detail,\n payload.title,\n payload.summary\n ) ?? \"\"\n );\n}\n\nasync function serializeContentValue(\n value: unknown,\n context: SerializeContext\n): Promise<SerializedBody> {\n if (typeof value === \"string\") {\n return sameBody(value.trim());\n }\n if (!isRecord(value)) {\n return sameBody(\"\");\n }\n\n if (value.type === \"content\" && value.content !== undefined) {\n return serializeContentValue(value.content, context);\n }\n\n const block = value as AgentPromptContentBlock & Record<string, unknown>;\n switch (block.type) {\n case \"text\":\n return sameBody(typeof block.text === \"string\" ? block.text.trim() : \"\");\n case \"image\":\n return serializeImageBlock(block, context);\n case \"file\":\n return sameBody(serializeFileBlock(block, context.labels));\n case \"mention\":\n return sameBody(serializeMentionBlock(block, context.labels));\n case \"skill\":\n return sameBody(serializeSkillBlock(block));\n default: {\n const nested = await Promise.all(\n [value.content, value.output, value.result]\n .filter((candidate) => candidate !== undefined)\n .map((candidate) => serializeContentValue(candidate, context))\n );\n return joinBodies(nested);\n }\n }\n}\n\n// Images-only projection of serializeContentValue: recurses through the same\n// wrappers (arrays, {type:\"content\"} envelopes, and content/output/result of\n// unknown records) but emits image blocks alone. Used for tool-call payloads,\n// whose only copy-worthy content is a generated-image deliverable.\nasync function serializeImagesOnly(\n value: unknown,\n context: SerializeContext\n): Promise<SerializedBody> {\n if (Array.isArray(value)) {\n const nested = await Promise.all(\n value.map((item) => serializeImagesOnly(item, context))\n );\n return joinBodies(nested);\n }\n if (!isRecord(value)) {\n return sameBody(\"\");\n }\n\n if (value.type === \"content\" && value.content !== undefined) {\n return serializeImagesOnly(value.content, context);\n }\n\n const block = value as AgentPromptContentBlock & Record<string, unknown>;\n switch (block.type) {\n case \"image\":\n return serializeImageBlock(block, context);\n case \"text\":\n case \"file\":\n case \"mention\":\n case \"skill\":\n return sameBody(\"\");\n default: {\n const nested = await Promise.all(\n [value.content, value.output, value.result]\n .filter((candidate) => candidate !== undefined)\n .map((candidate) => serializeImagesOnly(candidate, context))\n );\n return joinBodies(nested);\n }\n }\n}\n\nasync function serializeImageBlock(\n block: AgentPromptContentBlock & Record<string, unknown>,\n context: SerializeContext\n): Promise<SerializedBody> {\n const attachmentId = firstString(block.attachmentId);\n const blockMimeType = firstString(block.mimeType);\n const name = firstString(block.name) ?? context.labels.image;\n const source = firstString(block.url, block.uri, block.path, block.hostPath);\n const inlineData =\n typeof block.data === \"string\" && block.data.trim()\n ? block.data.trim()\n : null;\n\n // Plain (text/plain markdown) side: synchronous short references only,\n // never base64 bytes. Inline-data images and data:-URI sources (providers\n // do put data URIs into url/uri fields) have no short reference, so they\n // degrade to a bold label.\n const isDataSource = source?.startsWith(\"data:\") ?? false;\n const plain =\n source && !isDataSource\n ? imageLinkMarkdown(name, source)\n : attachmentId\n ? imageLinkMarkdown(name, `attachment:${attachmentId}`)\n : `**${name}**`;\n\n // Hydrated (text/html) side: embed real bytes as data URIs — rich-paste\n // targets (Word, Feishu docs, Notion) consume and re-upload data URIs but\n // never fetch local paths or localhost URLs. An oversized image and a\n // failed attachment/local-path read both count as omitted (either way the\n // recipient did not get the bytes) and keep the lean form. A missing\n // reader is not counted: hydration was never available on that surface.\n // http(s), data: and other scheme-qualified sources pass through as-is.\n let hydrated = plain;\n if (source && isDataSource) {\n const payload = source.slice(source.indexOf(\",\") + 1);\n if (\n base64BinaryByteSize(payload) <=\n AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES\n ) {\n hydrated = imageLinkMarkdown(name, source);\n } else {\n context.stats.omittedImages += 1;\n }\n } else if (source) {\n const localPath = localImagePathFromSource(source);\n if (localPath && context.readLocalImage) {\n try {\n const attachment = await context.readLocalImage({\n mimeType: blockMimeType,\n path: localPath\n });\n hydrated = embedWithinLimit(name, attachment, plain, context);\n } catch {\n context.stats.omittedImages += 1;\n }\n }\n } else if (inlineData) {\n const dataUri = inlineData.startsWith(\"data:\")\n ? inlineData\n : `data:${blockMimeType ?? \"image/png\"};base64,${inlineData}`;\n const payload = dataUri.slice(dataUri.indexOf(\",\") + 1);\n if (\n base64BinaryByteSize(payload) <=\n AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES\n ) {\n hydrated = imageLinkMarkdown(name, dataUri);\n } else {\n context.stats.omittedImages += 1;\n }\n } else if (attachmentId && context.readAttachment) {\n try {\n const attachment = await context.readAttachment(attachmentId);\n hydrated = embedWithinLimit(name, attachment, plain, context);\n } catch {\n context.stats.omittedImages += 1;\n }\n }\n return { hydrated, plain };\n}\n\nfunction embedWithinLimit(\n name: string,\n attachment: AgentGUIConversationAttachment,\n fallback: string,\n context: SerializeContext\n): string {\n if (\n base64BinaryByteSize(attachment.data) >\n AGENT_CONVERSATION_COPY_MAX_EMBEDDED_IMAGE_BYTES\n ) {\n context.stats.omittedImages += 1;\n return fallback;\n }\n return imageLinkMarkdown(\n name,\n `data:${attachment.mimeType};base64,${attachment.data}`\n );\n}\n\nfunction imageLinkMarkdown(name: string, target: string): string {\n return `}>)`;\n}\n\n// Binary size of a base64 payload without decoding it: 3 bytes per 4 chars,\n// minus padding.\nfunction base64BinaryByteSize(value: string): number {\n const trimmed = value.trim();\n const padding = trimmed.endsWith(\"==\") ? 2 : trimmed.endsWith(\"=\") ? 1 : 0;\n return Math.max(0, Math.floor((trimmed.length * 3) / 4) - padding);\n}\n\n// file:// URLs address the same local files as bare paths, so they hydrate\n// through the same reader after URL decoding (a Windows drive pathname keeps\n// no leading slash).\nfunction localImagePathFromSource(source: string): string | null {\n const trimmed = source.trim();\n if (isLocalImagePath(trimmed)) {\n return trimmed;\n }\n if (!/^file:\\/\\//i.test(trimmed)) {\n return null;\n }\n try {\n const pathname = decodeURIComponent(new URL(trimmed).pathname);\n return /^\\/[a-zA-Z]:[\\\\/]/.test(pathname) ? pathname.slice(1) : pathname;\n } catch {\n return null;\n }\n}\n\nfunction serializeFileBlock(\n block: AgentPromptContentBlock & Record<string, unknown>,\n labels: AgentGUIConversationCopyLabels\n): string {\n const source = firstString(block.uri, block.path, block.hostPath, block.url);\n const name = firstString(block.name) ?? source ?? labels.file;\n return source\n ? `[${escapeMarkdownLabel(name)}](<${escapeMarkdownTarget(source)}>)`\n : `**${labels.file}:** ${escapeMarkdownLabel(name)}`;\n}\n\nfunction serializeMentionBlock(\n block: AgentPromptContentBlock & Record<string, unknown>,\n labels: AgentGUIConversationCopyLabels\n): string {\n const text = firstString(block.text, block.name);\n if (text) {\n return text.startsWith(labels.mentionPrefix)\n ? text\n : `${labels.mentionPrefix}${text}`;\n }\n return firstString(block.uri, block.path) ?? \"\";\n}\n\nfunction serializeSkillBlock(\n block: AgentPromptContentBlock & Record<string, unknown>\n): string {\n const name = firstString(block.name, block.text);\n return name ? (name.startsWith(\"/\") ? name : `/${name}`) : \"\";\n}\n\n// Runtime notices (context-budget warnings, provider advisories) ride as\n// assistant-role messages; they are operational chrome, never transcript.\nfunction isSystemNoticeMessage(message: AgentActivityMessage): boolean {\n return firstString(message.payload.kind) === \"agent_system_notice\";\n}\n\nfunction isToolMessage(message: AgentActivityMessage): boolean {\n const kind = message.kind.trim().toLowerCase();\n return (\n kind.includes(\"tool\") ||\n kind.includes(\"call\") ||\n firstString(message.payload.callType, message.payload.toolName) !== null\n );\n}\n\nfunction compareMessagesAscending(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n const leftSequence = left.sequence ?? 0;\n const rightSequence = right.sequence ?? 0;\n if (leftSequence > 0 && rightSequence > 0 && leftSequence !== rightSequence) {\n return leftSequence - rightSequence;\n }\n return (\n left.occurredAtUnixMs - right.occurredAtUnixMs ||\n left.version - right.version ||\n left.messageId.localeCompare(right.messageId)\n );\n}\n\nfunction minimumPositiveVersion(\n messages: readonly AgentActivityMessage[]\n): number | null {\n let minimum = Number.POSITIVE_INFINITY;\n for (const message of messages) {\n if (Number.isFinite(message.version) && message.version > 0) {\n minimum = Math.min(minimum, message.version);\n }\n }\n return Number.isFinite(minimum) ? minimum : null;\n}\n\nfunction normalizedRole(role: string): string {\n return role.trim().toLowerCase();\n}\n\nfunction firstString(...values: unknown[]): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction singleLine(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n\nfunction escapeMarkdownLabel(value: string): string {\n return value\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"[\", \"\\\\[\")\n .replaceAll(\"]\", \"\\\\]\");\n}\n\nfunction escapeMarkdownTarget(value: string): string {\n return value.replace(/>/g, \"%3E\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","export function AgentTranscriptSkeleton({\n label,\n testId = \"agent-gui-transcript-loading-skeleton\"\n}: {\n label: string;\n testId?: string;\n}): React.JSX.Element {\n \"use memo\";\n return (\n <div\n className=\"agent-gui-node__transcript-skeleton\"\n role=\"status\"\n aria-label={label}\n data-testid={testId}\n >\n <div className=\"agent-gui-node__transcript-skeleton-row agent-gui-node__transcript-skeleton-row-user\">\n <span className=\"agent-gui-node__transcript-skeleton-bubble agent-gui-node__transcript-skeleton-line-medium\" />\n </div>\n <div className=\"agent-gui-node__transcript-skeleton-row agent-gui-node__transcript-skeleton-row-assistant\">\n <span className=\"agent-gui-node__transcript-skeleton-line agent-gui-node__transcript-skeleton-line-long\" />\n <span className=\"agent-gui-node__transcript-skeleton-line agent-gui-node__transcript-skeleton-line-medium\" />\n <span className=\"agent-gui-node__transcript-skeleton-line agent-gui-node__transcript-skeleton-line-short\" />\n </div>\n <div className=\"agent-gui-node__transcript-skeleton-row agent-gui-node__transcript-skeleton-row-user\">\n <span className=\"agent-gui-node__transcript-skeleton-bubble agent-gui-node__transcript-skeleton-line-short\" />\n </div>\n <div className=\"agent-gui-node__transcript-skeleton-row agent-gui-node__transcript-skeleton-row-assistant\">\n <span className=\"agent-gui-node__transcript-skeleton-line agent-gui-node__transcript-skeleton-line-medium\" />\n <span className=\"agent-gui-node__transcript-skeleton-line agent-gui-node__transcript-skeleton-line-long\" />\n </div>\n </div>\n );\n}\n","import {\n createContext,\n useContext,\n type JSX,\n type PropsWithChildren\n} from \"react\";\nimport type { AgentGUIMembershipAccessState } from \"../../agent-gui/agentGuiNode/accountMenuState\";\n\nexport interface AgentGUICommercePresentation {\n membershipAccess?: AgentGUIMembershipAccessState;\n planUrl?: string | null;\n}\n\nconst AgentCommercePresentationContext =\n createContext<AgentGUICommercePresentation | null>(null);\n\nexport function AgentCommercePresentationProvider({\n children,\n value\n}: PropsWithChildren<{\n value?: AgentGUICommercePresentation | null;\n}>): JSX.Element {\n return (\n <AgentCommercePresentationContext.Provider value={value ?? null}>\n {children}\n </AgentCommercePresentationContext.Provider>\n );\n}\n\nexport function useAgentCommercePresentation(): AgentGUICommercePresentation | null {\n return useContext(AgentCommercePresentationContext);\n}\n","import {\n Fragment,\n memo,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type JSX,\n type Ref\n} from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type { WorkspaceLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"../../AgentMessageMarkdown\";\nimport type { AgentGUIProviderSkillOption } from \"../../../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport type { AgentConversationParticipantPresentation } from \"../contracts/agentConversationParticipantPresentation\";\nimport { AgentTranscriptItemView } from \"./AgentTranscriptItemView\";\nimport { useAgentTurnDisclosureStore } from \"./AgentTurnDisclosureContext\";\nimport { AgentTurnWorkSection } from \"./AgentTurnWorkSection\";\nimport { buildAgentTurnWorkSectionModel } from \"./agentTurnWorkSectionModel\";\nimport { assessAgentTranscriptComplexity } from \"./agentTranscriptComplexity\";\nimport { useTurnDisclosureMotion } from \"./useTurnDisclosureMotion\";\nimport {\n AgentMessageLocatorRail,\n findMessageLocatorScrollParent,\n scrollTranscriptRowIntoView\n} from \"./AgentMessageLocatorRail\";\nimport {\n buildAgentTranscriptTurnGroups,\n buildTurnGroupIndexByRowIndex,\n buildUserMessageLocatorItems,\n escapeCssString,\n findTurnDividerRowIndexes,\n transcriptRowKey,\n useEnteringTranscriptRows,\n type AgentMessageLocatorItem\n} from \"./agentTranscriptModel\";\nimport {\n AgentTranscriptAttachmentView,\n useAgentTranscriptTurnAttachments,\n type AgentTranscriptAttachmentLocator,\n type AgentTranscriptTurnAttachment\n} from \"./useAgentTranscriptTurnAttachments\";\n\nconst AGENT_TRANSCRIPT_VIRTUALIZATION_OVERSCAN = 6;\nconst AGENT_TRANSCRIPT_ESTIMATED_TURN_HEIGHT_PX = 280;\nconst AGENT_TRANSCRIPT_DISCLOSURE_TURN_GAP_PX = 24;\nconst AGENT_TRANSCRIPT_LEGACY_TURN_GAP_PX = 12;\nconst AGENT_TRANSCRIPT_FALLBACK_TURN_COUNT = 3;\nconst preventVirtualScrollAdjustment = () => false;\n\nexport type {\n AgentTranscriptAttachmentLocator,\n AgentTranscriptTurnAttachment\n} from \"./useAgentTranscriptTurnAttachments\";\nexport interface AgentTranscriptViewProps {\n conversation: AgentConversationVM;\n turnAttachments?: readonly AgentTranscriptTurnAttachment[];\n turnAttachmentLocatorRef?: Ref<AgentTranscriptAttachmentLocator>;\n onTurnAttachmentVisibilityChange?: (\n attachmentId: string,\n visible: boolean\n ) => void;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onAuthLogin?: (provider?: string | null) => void;\n availableSkills?: readonly AgentGUIProviderSkillOption[];\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n previewMode?: boolean;\n showRawTimelineJson?: boolean;\n participantPresentation?: AgentConversationParticipantPresentation;\n labels: {\n toolCallsLabel: (count: number) => string;\n thinkingLabel: string;\n processing: string;\n turnSummary: string;\n rawTimelineJson?: string;\n userMessageLocator?: string;\n };\n}\n\nfunction participantPresentationEqual(\n previous: AgentConversationParticipantPresentation | undefined,\n next: AgentConversationParticipantPresentation | undefined\n): boolean {\n if (previous === next) {\n return true;\n }\n if ((!previous || !previous.enabled) && (!next || !next.enabled)) {\n return true;\n }\n if (!previous?.enabled || !next?.enabled) {\n return false;\n }\n if (previous.status !== next.status) {\n return false;\n }\n if (previous.status === \"loading\" || next.status === \"loading\") {\n return true;\n }\n return (\n previous.user.name === next.user.name &&\n previous.user.avatarUrl === next.user.avatarUrl &&\n previous.agent.name === next.agent.name &&\n previous.agent.avatarUrl === next.agent.avatarUrl\n );\n}\n\nfunction transcriptLabelsEqual(\n previous: AgentTranscriptViewProps[\"labels\"],\n next: AgentTranscriptViewProps[\"labels\"]\n): boolean {\n return (\n previous === next ||\n (previous.thinkingLabel === next.thinkingLabel &&\n previous.processing === next.processing &&\n previous.turnSummary === next.turnSummary &&\n previous.rawTimelineJson === next.rawTimelineJson &&\n previous.userMessageLocator === next.userMessageLocator &&\n previous.toolCallsLabel === next.toolCallsLabel)\n );\n}\n\nfunction transcriptTurnIdentityEquals(\n previous: AgentConversationVM[\"sourceDetail\"][\"turns\"],\n next: AgentConversationVM[\"sourceDetail\"][\"turns\"]\n): boolean {\n return (\n previous === next ||\n (previous.length === next.length &&\n previous.every((turn, index) => turn.id === next[index]?.id))\n );\n}\n\nfunction transcriptCanonicalTurnsEqual(\n previous: AgentConversationVM[\"sourceDetail\"][\"sessionTurns\"],\n next: AgentConversationVM[\"sourceDetail\"][\"sessionTurns\"]\n): boolean {\n return (\n previous === next ||\n (previous?.length === next?.length &&\n (previous?.every((turn, index) => {\n const nextTurn = next?.[index];\n return (\n turn.turnId === nextTurn?.turnId &&\n turn.phase === nextTurn.phase &&\n turn.outcome === nextTurn.outcome &&\n turn.startedAtUnixMs === nextTurn.startedAtUnixMs &&\n turn.settledAtUnixMs === nextTurn.settledAtUnixMs\n );\n }) ??\n true))\n );\n}\n\nfunction transcriptConversationRenderInputEquals(\n previous: AgentConversationVM,\n next: AgentConversationVM\n): boolean {\n return (\n previous === next ||\n (previous.rows === next.rows &&\n previous.workspaceRoot === next.workspaceRoot &&\n previous.sourceDetail.session.agentSessionId ===\n next.sourceDetail.session.agentSessionId &&\n previous.sourceDetail.session.activeTurnId ===\n next.sourceDetail.session.activeTurnId &&\n previous.sourceDetail.session.imported ===\n next.sourceDetail.session.imported &&\n previous.sourceDetail.cwd === next.sourceDetail.cwd &&\n transcriptTurnIdentityEquals(\n previous.sourceDetail.turns,\n next.sourceDetail.turns\n ) &&\n transcriptCanonicalTurnsEqual(\n previous.sourceDetail.sessionTurns,\n next.sourceDetail.sessionTurns\n ))\n );\n}\n\nexport function areAgentTranscriptViewPropsEqual(\n previous: AgentTranscriptViewProps,\n next: AgentTranscriptViewProps\n): boolean {\n return (\n transcriptConversationRenderInputEquals(\n previous.conversation,\n next.conversation\n ) &&\n previous.onLinkAction === next.onLinkAction &&\n previous.onAuthLogin === next.onAuthLogin &&\n previous.availableSkills === next.availableSkills &&\n previous.workspaceAppIcons === next.workspaceAppIcons &&\n previous.turnAttachments === next.turnAttachments &&\n previous.turnAttachmentLocatorRef === next.turnAttachmentLocatorRef &&\n previous.onTurnAttachmentVisibilityChange ===\n next.onTurnAttachmentVisibilityChange &&\n previous.previewMode === next.previewMode &&\n previous.showRawTimelineJson === next.showRawTimelineJson &&\n participantPresentationEqual(\n previous.participantPresentation,\n next.participantPresentation\n ) &&\n transcriptLabelsEqual(previous.labels, next.labels)\n );\n}\n\nexport const AgentTranscriptView = memo(function AgentTranscriptView({\n conversation,\n turnAttachments = [],\n turnAttachmentLocatorRef,\n onTurnAttachmentVisibilityChange,\n onLinkAction,\n onAuthLogin,\n availableSkills,\n workspaceAppIcons,\n previewMode = false,\n showRawTimelineJson = false,\n participantPresentation,\n labels\n}: AgentTranscriptViewProps): JSX.Element {\n \"use memo\";\n const [expandedToolRows, setExpandedToolRows] = useState<\n Record<string, boolean>\n >({});\n const [hasMovingTurnDisclosure, handleDisclosureMotionChange] =\n useTurnDisclosureMotion();\n const turnDisclosureStore = useAgentTurnDisclosureStore();\n const virtualizerHostRef = useRef<HTMLDivElement | null>(null);\n const [virtualScrollElement, setVirtualScrollElement] =\n useState<HTMLElement | null>(null);\n const rowKeys = useMemo(\n () => conversation.rows.map(transcriptRowKey),\n [conversation.rows]\n );\n const turnGroups = useMemo(\n () => buildAgentTranscriptTurnGroups(conversation.rows, rowKeys),\n [conversation.rows, rowKeys]\n );\n const turnGroupIndexByRowIndex = useMemo(\n () => buildTurnGroupIndexByRowIndex(turnGroups),\n [turnGroups]\n );\n const userMessageLocatorItems = useMemo(\n () =>\n buildUserMessageLocatorItems(\n conversation.rows,\n rowKeys,\n turnGroupIndexByRowIndex\n ),\n [conversation.rows, rowKeys, turnGroupIndexByRowIndex]\n );\n const enteringRowKeys = useEnteringTranscriptRows(rowKeys);\n const handleToolGroupExpandedChange = useCallback(\n (key: string, expanded: boolean) => {\n setExpandedToolRows((previous) => {\n if (previous[key] === expanded) {\n return previous;\n }\n return {\n ...previous,\n [key]: expanded\n };\n });\n },\n []\n );\n const turnIndexById = useMemo(\n () =>\n new Map(\n conversation.sourceDetail.turns.map((turn, index) => [turn.id, index])\n ),\n [conversation.sourceDetail.turns]\n );\n const dividerRowIndexes = useMemo(\n () => findTurnDividerRowIndexes(turnIndexById, conversation.rows),\n [conversation.rows, turnIndexById]\n );\n const canonicalTurnById = new Map(\n (conversation.sourceDetail.sessionTurns ?? []).map((turn) => [\n turn.turnId,\n turn\n ])\n );\n const turnWorkSectionModelByKey = new Map(\n turnGroups.map((group) => {\n const isActiveTurn =\n group.turnId !== null &&\n group.turnId === conversation.sourceDetail.session.activeTurnId;\n return [\n group.key,\n buildAgentTurnWorkSectionModel(\n group,\n group.turnId ? (canonicalTurnById.get(group.turnId) ?? null) : null,\n isActiveTurn,\n {\n collapseIntermediateAssistantReplies:\n !conversation.sourceDetail.session.imported\n }\n )\n ] as const;\n })\n );\n const basePath = conversation.sourceDetail.cwd;\n const workspaceRoot = conversation.workspaceRoot;\n const provider = conversation.activity.agentProvider;\n const shouldVirtualize = useMemo(\n () => assessAgentTranscriptComplexity(turnGroups).shouldVirtualize,\n [turnGroups]\n );\n const rowVirtualizer = useVirtualizer({\n anchorTo: shouldVirtualize && hasMovingTurnDisclosure ? \"start\" : \"end\",\n count: turnGroups.length,\n estimateSize: () => AGENT_TRANSCRIPT_ESTIMATED_TURN_HEIGHT_PX,\n getItemKey: (index) => turnGroups[index]?.key ?? index,\n getScrollElement: () => virtualScrollElement,\n overscan: AGENT_TRANSCRIPT_VIRTUALIZATION_OVERSCAN,\n scrollEndThreshold: 24\n });\n rowVirtualizer.shouldAdjustScrollPositionOnItemSizeChange =\n shouldVirtualize && hasMovingTurnDisclosure\n ? preventVirtualScrollAdjustment\n : undefined;\n const attachmentProjection = useAgentTranscriptTurnAttachments({\n attachments: turnAttachments,\n locatorRef: turnAttachmentLocatorRef,\n onVisibilityChange: onTurnAttachmentVisibilityChange,\n rowVirtualizer,\n shouldVirtualize,\n turnGroups,\n virtualizerHostRef\n });\n const handleLocateUserMessage = useCallback(\n (item: AgentMessageLocatorItem) => {\n const scrollParent = virtualizerHostRef.current\n ? findMessageLocatorScrollParent(virtualizerHostRef.current)\n : null;\n const scrollToRenderedRow = (): boolean => {\n const renderedRow = (\n scrollParent ?? document\n ).querySelector<HTMLElement>(\n `[data-agent-transcript-row=\"${escapeCssString(item.rowKey)}\"]`\n );\n if (!renderedRow) {\n return false;\n }\n scrollTranscriptRowIntoView(\n renderedRow,\n scrollParent ?? findMessageLocatorScrollParent(renderedRow)\n );\n return true;\n };\n\n if (scrollToRenderedRow()) {\n return;\n }\n if (shouldVirtualize) {\n rowVirtualizer.scrollToIndex(item.turnGroupIndex, {\n align: \"center\"\n });\n window.setTimeout(scrollToRenderedRow, 0);\n }\n },\n [rowVirtualizer, shouldVirtualize]\n );\n\n useLayoutEffect(() => {\n if (!shouldVirtualize) {\n return;\n }\n setVirtualScrollElement(\n virtualizerHostRef.current\n ? findMessageLocatorScrollParent(virtualizerHostRef.current)\n : null\n );\n }, [shouldVirtualize]);\n\n const renderRow = (\n row: AgentConversationVM[\"rows\"][number],\n rowIndex: number,\n renderKey?: string\n ): JSX.Element => {\n const rowKey =\n renderKey ??\n (conversation.rows[rowIndex] === row\n ? (rowKeys[rowIndex] ?? transcriptRowKey(row))\n : transcriptRowKey(row));\n const shouldAnimateEnter =\n row.kind !== \"processing\" && enteringRowKeys.has(rowKey);\n\n return (\n <div\n key={rowKey}\n className=\"agent-gui-transcript-row\"\n data-agent-transcript-row={rowKey}\n data-agent-transcript-row-kind={row.kind}\n data-agent-transcript-row-speaker={\n row.kind === \"message\" ? row.speaker : undefined\n }\n data-agent-transcript-row-thinking-first={\n row.kind === \"message\" &&\n row.speaker === \"assistant\" &&\n row.thinking.length > 0\n ? \"true\"\n : undefined\n }\n data-agent-transcript-row-thinking-last={\n row.kind === \"message\" &&\n row.speaker === \"assistant\" &&\n row.thinking.length > 0 &&\n row.messages.length === 0\n ? \"true\"\n : undefined\n }\n data-agent-transcript-row-index={rowIndex}\n data-agent-transcript-row-enter={\n shouldAnimateEnter ? \"true\" : undefined\n }\n >\n <AgentTranscriptItemView\n workspaceRoot={workspaceRoot}\n basePath={basePath}\n row={row}\n labels={labels}\n onLinkAction={onLinkAction}\n onAuthLogin={onAuthLogin}\n provider={provider}\n availableSkills={availableSkills}\n workspaceAppIcons={workspaceAppIcons}\n previewMode={previewMode}\n showRawTimelineJson={showRawTimelineJson}\n participantPresentation={participantPresentation}\n toolGroupExpanded={\n row.kind === \"tool-group\"\n ? expandedToolRows[rowKey] === true\n : undefined\n }\n toolGroupExpansionKey={row.kind === \"tool-group\" ? rowKey : undefined}\n onToolGroupExpandedChange={handleToolGroupExpandedChange}\n />\n </div>\n );\n };\n\n const renderLegacyTurnGroup = (\n group: (typeof turnGroups)[number]\n ): JSX.Element => (\n <Fragment key={group.key}>\n {group.rows.map(({ row, rowIndex }) => {\n const rowKey = rowKeys[rowIndex] ?? transcriptRowKey(row);\n return (\n <Fragment key={rowKey}>\n {dividerRowIndexes.has(rowIndex) ? (\n <div\n className=\"h-px w-full flex-none bg-[var(--line-2,var(--tutti-line-2))]\"\n data-testid=\"agent-transcript-turn-divider\"\n aria-hidden=\"true\"\n />\n ) : null}\n {renderRow(row, rowIndex)}\n </Fragment>\n );\n })}\n </Fragment>\n );\n\n const renderTurnGroup = (group: (typeof turnGroups)[number]): JSX.Element => {\n const model = turnWorkSectionModelByKey.get(group.key) ?? null;\n if (!model) {\n return renderLegacyTurnGroup(group);\n }\n\n return (\n <AgentTurnWorkSection\n key={group.key}\n model={model}\n sessionId={conversation.sourceDetail.session.agentSessionId}\n turnKey={group.turnId ?? group.key}\n showDivider={group.rows.some(({ rowIndex }) =>\n dividerRowIndexes.has(rowIndex)\n )}\n disclosureStore={turnDisclosureStore}\n onDisclosureMotionChange={handleDisclosureMotionChange}\n renderRow={renderRow}\n />\n );\n };\n\n const renderAttachment = (\n attachment: AgentTranscriptTurnAttachment\n ): JSX.Element => (\n <AgentTranscriptAttachmentView\n key={attachment.id}\n attachment={attachment}\n onElementChange={attachmentProjection.onElementChange}\n />\n );\n\n if (shouldVirtualize) {\n const virtualItems =\n virtualScrollElement === null\n ? turnGroups\n .slice(-AGENT_TRANSCRIPT_FALLBACK_TURN_COUNT)\n .map((group, fallbackIndex) => ({\n index:\n turnGroups.length -\n Math.min(\n turnGroups.length,\n AGENT_TRANSCRIPT_FALLBACK_TURN_COUNT\n ) +\n fallbackIndex,\n key: group.key,\n start:\n (turnGroups.length -\n Math.min(\n turnGroups.length,\n AGENT_TRANSCRIPT_FALLBACK_TURN_COUNT\n ) +\n fallbackIndex) *\n AGENT_TRANSCRIPT_ESTIMATED_TURN_HEIGHT_PX\n }))\n : rowVirtualizer.getVirtualItems();\n return (\n <>\n <AgentMessageLocatorRail\n items={userMessageLocatorItems}\n label={labels.userMessageLocator}\n onLocate={handleLocateUserMessage}\n virtualSelectionSource={rowVirtualizer}\n />\n <div\n ref={virtualizerHostRef}\n className=\"agent-gui-transcript-virtual\"\n data-agent-transcript-virtualized=\"true\"\n style={{ height: `${rowVirtualizer.getTotalSize()}px` }}\n >\n {virtualItems.map((virtualTurn) => {\n const group = turnGroups[virtualTurn.index];\n if (!group) {\n return null;\n }\n return (\n <div\n key={virtualTurn.key}\n ref={rowVirtualizer.measureElement}\n className=\"agent-gui-transcript-virtual-item\"\n data-index={virtualTurn.index}\n data-agent-transcript-virtual-turn={group.key}\n style={{\n paddingBottom: `${\n turnWorkSectionModelByKey.get(group.key)\n ? AGENT_TRANSCRIPT_DISCLOSURE_TURN_GAP_PX\n : AGENT_TRANSCRIPT_LEGACY_TURN_GAP_PX\n }px`,\n transform: `translateY(${virtualTurn.start}px)`\n }}\n >\n {renderTurnGroup(group)}\n {attachmentProjection.byGroupIndex\n .get(virtualTurn.index)\n ?.map(renderAttachment)}\n </div>\n );\n })}\n </div>\n {attachmentProjection.trailing.map(renderAttachment)}\n </>\n );\n }\n\n return (\n <>\n <AgentMessageLocatorRail\n items={userMessageLocatorItems}\n label={labels.userMessageLocator}\n onLocate={handleLocateUserMessage}\n />\n {turnGroups.map((group, groupIndex) => (\n <Fragment key={group.key}>\n {renderTurnGroup(group)}\n {attachmentProjection.byGroupIndex\n .get(groupIndex)\n ?.map(renderAttachment)}\n </Fragment>\n ))}\n {attachmentProjection.trailing.map(renderAttachment)}\n </>\n );\n}, areAgentTranscriptViewPropsEqual);\n","import { memo, useCallback, type JSX } from \"react\";\nimport type { WorkspaceLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"../../AgentMessageMarkdown\";\nimport type { AgentGUIProviderSkillOption } from \"../../../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport { resolveAgentConversationLinkAction } from \"../actions/agentConversationLinkActions\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\nimport type { AgentConversationParticipantPresentation } from \"../contracts/agentConversationParticipantPresentation\";\nimport { AgentGeneratedImageRow } from \"./AgentGeneratedImageRow\";\nimport { AgentGoalControlRow } from \"./AgentGoalControlRow\";\nimport { AgentMessageBlock } from \"./AgentMessageBlock\";\nimport { AgentProcessingRow } from \"./AgentProcessingRow\";\nimport { AgentToolGroupRow } from \"./AgentToolGroupRow\";\nimport { AgentTurnSummaryRow } from \"./AgentTurnSummaryRow\";\n\ninterface AgentTranscriptItemViewProps {\n workspaceRoot: string | null;\n basePath: string;\n row: AgentTranscriptRowVM;\n labels: {\n toolCallsLabel: (count: number) => string;\n thinkingLabel: string;\n processing: string;\n turnSummary: string;\n rawTimelineJson?: string;\n };\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onAuthLogin?: (provider?: string | null) => void;\n provider?: string | null;\n availableSkills?: readonly AgentGUIProviderSkillOption[];\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n previewMode?: boolean;\n showRawTimelineJson?: boolean;\n participantPresentation?: AgentConversationParticipantPresentation;\n toolGroupExpanded?: boolean;\n toolGroupExpansionKey?: string;\n onToolGroupExpandedChange?: (key: string, expanded: boolean) => void;\n}\n\nexport const AgentTranscriptItemView = memo(function AgentTranscriptItemView({\n workspaceRoot,\n basePath,\n row,\n labels,\n onLinkAction,\n onAuthLogin,\n provider,\n availableSkills,\n workspaceAppIcons,\n previewMode = false,\n showRawTimelineJson = false,\n participantPresentation,\n toolGroupExpanded,\n toolGroupExpansionKey,\n onToolGroupExpandedChange\n}: AgentTranscriptItemViewProps): JSX.Element {\n \"use memo\";\n\n const handleLinkClick = useCallback(\n (href: string) => {\n const action = resolveAgentConversationLinkAction({\n workspaceRoot,\n basePath,\n href,\n source: \"agent-markdown\"\n });\n if (action) {\n onLinkAction?.(action);\n }\n },\n [basePath, onLinkAction, workspaceRoot]\n );\n switch (row.kind) {\n case \"generated-image\":\n return <AgentGeneratedImageRow row={row} />;\n case \"goal-control\":\n return (\n <AgentGoalControlRow\n row={row}\n availableSkills={availableSkills}\n workspaceAppIcons={workspaceAppIcons}\n />\n );\n case \"message\":\n return (\n <AgentMessageBlock\n workspaceRoot={workspaceRoot}\n basePath={basePath}\n row={row}\n onLinkAction={onLinkAction}\n onAuthLogin={onAuthLogin}\n provider={provider}\n availableSkills={availableSkills}\n workspaceAppIcons={workspaceAppIcons}\n previewMode={previewMode}\n thinkingLabel={labels.thinkingLabel}\n showRawTimelineJson={showRawTimelineJson}\n rawTimelineJsonLabel={labels.rawTimelineJson}\n participantPresentation={participantPresentation}\n />\n );\n case \"tool-group\":\n return (\n <AgentToolGroupRow\n row={row}\n label={labels.toolCallsLabel}\n thinkingLabel={labels.thinkingLabel}\n onLinkClick={handleLinkClick}\n previewMode={previewMode}\n showRawTimelineJson={showRawTimelineJson}\n rawTimelineJsonLabel={labels.rawTimelineJson}\n expanded={row.grouped ? toolGroupExpanded : undefined}\n onExpandedChange={row.grouped ? onToolGroupExpandedChange : undefined}\n expansionKey={toolGroupExpansionKey}\n />\n );\n case \"turn-summary\":\n return (\n <AgentTurnSummaryRow\n row={row}\n workspaceRoot={workspaceRoot}\n basePath={basePath}\n label={labels.turnSummary}\n onLinkAction={onLinkAction}\n previewMode={previewMode}\n />\n );\n case \"processing\":\n return <AgentProcessingRow row={row} label={labels.processing} />;\n }\n});\n","import {\n resolveWorkspaceLinkAction,\n type WorkspaceLinkAction,\n type WorkspaceLinkActionSource\n} from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\n\nexport function resolveAgentConversationLinkAction({\n workspaceRoot,\n basePath,\n href,\n source\n}: {\n workspaceRoot: AgentConversationVM[\"workspaceRoot\"];\n basePath: AgentConversationVM[\"sourceDetail\"][\"cwd\"];\n href: string;\n source: WorkspaceLinkActionSource;\n}): WorkspaceLinkAction | null {\n return resolveWorkspaceLinkAction({\n href,\n workspaceRoot: workspaceRoot,\n basePath,\n source\n });\n}\n","import { useEffect, useState, type JSX } from \"react\";\nimport { resolveWorkspaceImageMimeType } from \"@tutti-os/workspace-file-preview\";\nimport { useOptionalAgentHostApi } from \"../../../agentActivityHost\";\nimport { ZoomableImage } from \"../../../app/renderer/components/ZoomableImage\";\nimport {\n isLocalImagePath,\n resolveImageGenerationPreviewSrc\n} from \"../../imageGenerationTool\";\n\ninterface AgentGeneratedImagePreviewProps {\n uri: string;\n mimeType: string | null;\n alt: string;\n className: string;\n}\n\nexport function AgentGeneratedImagePreview({\n uri,\n mimeType,\n alt,\n className\n}: AgentGeneratedImagePreviewProps): JSX.Element | null {\n \"use memo\";\n const agentHostApi = useOptionalAgentHostApi();\n const localPath = isLocalImagePath(uri) ? uri.trim() : null;\n const readWorkspaceImage = localPath\n ? agentHostApi?.workspace?.readFile\n : undefined;\n const [src, setSrc] = useState<string | null>(() =>\n !localPath ? resolveImageGenerationPreviewSrc(uri) : null\n );\n\n useEffect(() => {\n if (!localPath || !readWorkspaceImage) {\n setSrc(resolveImageGenerationPreviewSrc(uri));\n return;\n }\n\n const resolvedLocalPath = localPath;\n const resolvedReadWorkspaceImage = readWorkspaceImage;\n let canceled = false;\n let objectUrl: string | null = null;\n const resolvedMimeType =\n mimeType?.trim() ||\n resolveWorkspaceImageMimeType(resolvedLocalPath) ||\n \"image/png\";\n\n async function loadWorkspaceImage(): Promise<void> {\n try {\n const result = await resolvedReadWorkspaceImage({\n path: resolvedLocalPath\n });\n if (canceled) {\n return;\n }\n const bytes =\n result.bytes instanceof Uint8Array\n ? result.bytes\n : new Uint8Array(result.bytes);\n const arrayBuffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n ) as ArrayBuffer;\n objectUrl = URL.createObjectURL(\n new Blob([arrayBuffer], { type: resolvedMimeType })\n );\n setSrc(objectUrl);\n } catch {\n if (!canceled) {\n setSrc(null);\n }\n }\n }\n\n setSrc(null);\n void loadWorkspaceImage();\n\n return () => {\n canceled = true;\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n };\n }, [localPath, mimeType, readWorkspaceImage, uri]);\n\n if (!src) {\n return null;\n }\n\n return (\n <ZoomableImage\n alt={alt}\n className={className}\n downloadName={localPath ? localPath.split(/[\\\\/]/).pop() : \"image.png\"}\n src={src}\n wrapElement=\"span\"\n />\n );\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../i18n/index\";\nimport type { AgentGeneratedImageRowVM } from \"../contracts/agentGeneratedImageRowVM\";\nimport { AgentGeneratedImagePreview } from \"./AgentGeneratedImagePreview\";\n\nexport function AgentGeneratedImageRow({\n row\n}: {\n row: AgentGeneratedImageRowVM;\n}): JSX.Element {\n \"use memo\";\n return (\n <div\n className=\"flex max-w-full justify-start\"\n data-testid=\"agent-generated-image-artifact\"\n >\n <AgentGeneratedImagePreview\n uri={row.uri}\n mimeType={row.mimeType}\n alt={translate(\"agentHost.agentTool.details.imagePreviewAlt\")}\n className=\"block max-h-[560px] max-w-full rounded-[10px] border border-[var(--line-2)] bg-[var(--background-panel)] object-contain\"\n />\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"../../AgentMessageMarkdown\";\nimport { AgentRichTextReadonly } from \"../../AgentRichTextReadonly\";\nimport type { AgentGUIProviderSkillOption } from \"../../../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nimport type { AgentGoalControlRowVM } from \"../contracts/agentGoalControlRowVM\";\n\ninterface AgentGoalControlRowProps {\n row: AgentGoalControlRowVM;\n availableSkills?: readonly AgentGUIProviderSkillOption[];\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n}\n\nexport function AgentGoalControlRow({\n row,\n availableSkills,\n workspaceAppIcons\n}: AgentGoalControlRowProps): JSX.Element {\n \"use memo\";\n return (\n <div\n className={styles.userMessageFlow}\n data-agent-goal-control-action={row.action}\n >\n <AgentRichTextReadonly\n value={row.body}\n className={`workspace-agents-status-panel__detail-user-message ${styles.userMessageBubble}`}\n editorClassName=\"text-[inherit]\"\n availableSkills={availableSkills}\n workspaceAppIcons={workspaceAppIcons}\n />\n </div>\n );\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useState,\n type JSX,\n type ReactNode\n} from \"react\";\nimport { Avatar } from \"@tutti-os/ui-system\";\nimport { CheckIcon, CopyIcon } from \"@tutti-os/ui-system/icons\";\nimport { formatAgentMessageTimestamp } from \"../../../app/renderer/shell/utils/format\";\nimport { AgentPlanCard } from \"./AgentPlanCard\";\nimport { AgentCollaborationRow } from \"./AgentCollaborationRow\";\nimport { translate } from \"../../../i18n/index\";\nimport { useOptionalAgentHostApi } from \"../../../agentActivityHost\";\nimport type { WorkspaceLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport {\n AgentMessageMarkdown,\n type AgentMessageMarkdownWorkspaceAppIcon\n} from \"../../AgentMessageMarkdown\";\nimport { AgentRichTextReadonly } from \"../../AgentRichTextReadonly\";\nimport { resolveAgentConversationLinkAction } from \"../actions/agentConversationLinkActions\";\nimport type { AgentGUIProviderSkillOption } from \"../../../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport type {\n AgentMessageContentVM,\n AgentMessageRowVM\n} from \"../contracts/agentMessageRowVM\";\nimport type {\n AgentConversationParticipantIdentity,\n AgentConversationParticipantPresentation\n} from \"../contracts/agentConversationParticipantPresentation\";\nimport { AgentMessageDetailsDisclosure } from \"./AgentMessageDetailsDisclosure\";\nimport {\n AgentVisibleErrorMessage,\n recoverVisibleErrorFromMessage\n} from \"./AgentVisibleErrorMessage\";\nimport { AgentThinkingDisclosure } from \"./AgentThinkingDisclosure\";\nimport { RawTimelineJsonDisclosure } from \"./RawTimelineJsonDisclosure\";\nimport { useElapsedSeconds } from \"./useElapsedSeconds\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nimport { CanvasNodeGhostIconButton } from \"../../../contexts/workspace/presentation/renderer/components/shared/CanvasNodeGhostIconButton\";\nimport { AgentUserImageGrid } from \"./AgentMessageImages\";\n\nconst MESSAGE_COPY_FEEDBACK_MS = 1400;\nconst TRANSPORT_RETRY_PROGRESS_PATTERN =\n /\\b(reconnect(?:ing)?(?:\\s*(?:\\.\\.\\.|…|[.。]+|:|-))?\\s*\\(?\\d+\\s*\\/\\s*\\d+\\)?)/i;\n// All system-notice banners use the light-red danger surface. Yellow/warning\n// surfaces are banned for notice boxes — see \"Badges And Status\" in\n// docs/conventions/desktop-visual-language.md.\nconst SYSTEM_NOTICE_CLASS_NAME =\n \"border-[var(--on-danger-hover)] bg-[var(--on-danger)]\";\n\ninterface AgentMessageBlockProps {\n workspaceRoot: string | null;\n basePath: string;\n row: AgentMessageRowVM;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n thinkingLabel: string;\n onAuthLogin?: (provider?: string | null) => void;\n // The conversation's provider, so a failed message recovered as an env error\n // routes its wizard CTA to the right provider.\n provider?: string | null;\n availableSkills?: readonly AgentGUIProviderSkillOption[];\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n previewMode?: boolean;\n showRawTimelineJson?: boolean;\n rawTimelineJsonLabel?: string;\n participantPresentation?: AgentConversationParticipantPresentation;\n}\n\nexport function AgentMessageBlock({\n workspaceRoot,\n basePath,\n row,\n onLinkAction,\n thinkingLabel,\n onAuthLogin,\n provider,\n availableSkills,\n workspaceAppIcons,\n previewMode = false,\n showRawTimelineJson = false,\n rawTimelineJsonLabel = \"\",\n participantPresentation\n}: AgentMessageBlockProps): JSX.Element {\n \"use memo\";\n const agentHostApi = useOptionalAgentHostApi();\n const isUser = row.speaker === \"user\";\n const handleLinkClick = useCallback(\n (href: string): void => {\n const action = resolveAgentConversationLinkAction({\n workspaceRoot,\n basePath,\n href,\n source: \"agent-markdown\"\n });\n if (action) {\n onLinkAction?.(action);\n }\n },\n [basePath, onLinkAction, workspaceRoot]\n );\n const handleCopyMessageText = useCallback(\n async (text: string): Promise<boolean> => {\n if (!text.trim()) {\n return false;\n }\n\n try {\n const hostWriteText = agentHostApi?.clipboard?.writeText;\n if (typeof hostWriteText === \"function\") {\n await hostWriteText(text);\n return true;\n }\n if (\n typeof navigator !== \"undefined\" &&\n typeof navigator.clipboard?.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n return false;\n }\n return false;\n },\n [agentHostApi]\n );\n const thinkingContent = !isUser\n ? row.thinking.map((thinking) => (\n <AgentThinkingDisclosure\n key={thinking.id}\n thinking={thinking}\n label={thinkingLabel}\n onLinkClick={handleLinkClick}\n previewMode={previewMode}\n showRawTimelineJson={showRawTimelineJson}\n rawTimelineJsonLabel={rawTimelineJsonLabel}\n />\n ))\n : null;\n\n const messageContent = row.messages.map((message) => {\n const rawTimelineJson =\n showRawTimelineJson &&\n rawTimelineJsonLabel &&\n (message.sourceTimelineItems?.length ?? 0) > 0 ? (\n <RawTimelineJsonDisclosure\n items={message.sourceTimelineItems}\n label={rawTimelineJsonLabel}\n />\n ) : null;\n // Recover a structured error card from a terminal message that the\n // provider reported as plain text, including Claude SDK's completed\n // standalone login notice.\n const recoveredError =\n !isUser && !message.visibleError\n ? recoverVisibleErrorFromMessage(message, provider)\n : null;\n const content =\n isUser && message.contentKind === \"image-grid\" ? (\n <AgentUserImageGrid message={message} />\n ) : isUser ? (\n <AgentRichTextReadonly\n value={message.body}\n className={`workspace-agents-status-panel__detail-user-message ${styles.userMessageBubble}`}\n editorClassName=\"text-[inherit]\"\n onLinkClick={handleLinkClick}\n availableSkills={availableSkills}\n workspaceAppIcons={workspaceAppIcons}\n />\n ) : message.visibleError ? (\n <AgentVisibleErrorMessage\n message={message}\n onAuthLogin={onAuthLogin}\n onExternalLink={handleLinkClick}\n />\n ) : recoveredError ? (\n <AgentVisibleErrorMessage\n message={recoveredError}\n onAuthLogin={onAuthLogin}\n onExternalLink={handleLinkClick}\n />\n ) : message.systemNotice ? (\n <AgentSystemNoticeMessage message={message} />\n ) : message.contentKind === \"collaboration\" && message.collaboration ? (\n <AgentCollaborationRow\n collaboration={message.collaboration}\n workspaceRoot={workspaceRoot}\n basePath={basePath}\n onLinkAction={onLinkAction}\n workspaceAppIcons={workspaceAppIcons}\n previewMode={previewMode}\n />\n ) : message.contentKind === \"plan\" ? (\n <AgentPlanCardMessage\n message={message}\n workspaceRoot={workspaceRoot}\n basePath={basePath}\n onLinkAction={onLinkAction}\n workspaceAppIcons={workspaceAppIcons}\n previewMode={previewMode}\n />\n ) : (\n <AgentMessageMarkdown\n content={message.body}\n className={styles.assistantMarkdown}\n onLinkAction={onLinkAction}\n workspaceLinkContext={{\n workspaceRoot,\n basePath,\n source: \"agent-markdown\"\n }}\n workspaceAppIcons={workspaceAppIcons}\n enableImageZoom\n previewMode={previewMode}\n streaming={message.statusKind === \"working\"}\n />\n );\n\n if (rawTimelineJson) {\n return (\n <AgentCopyableMessageGroup\n key={message.id}\n copyText={message.copyText ?? null}\n occurredAtUnixMs={message.occurredAtUnixMs}\n speaker={row.speaker}\n onCopyMessageText={handleCopyMessageText}\n >\n {content}\n {rawTimelineJson}\n </AgentCopyableMessageGroup>\n );\n }\n\n const copyText = message.copyText ?? null;\n if (copyText) {\n return (\n <AgentCopyableMessageGroup\n key={message.id}\n copyText={copyText}\n occurredAtUnixMs={message.occurredAtUnixMs}\n speaker={row.speaker}\n onCopyMessageText={handleCopyMessageText}\n >\n {content}\n </AgentCopyableMessageGroup>\n );\n }\n\n return <Fragment key={message.id}>{content}</Fragment>;\n });\n const enabledParticipantPresentation =\n participantPresentation?.enabled === true ? participantPresentation : null;\n const showParticipant =\n enabledParticipantPresentation !== null && row.messages.length > 0;\n\n return (\n <div\n className={isUser ? styles.userMessageFlow : styles.assistantMessageFlow}\n data-agent-message-flow-thinking-first={\n !isUser && row.thinking.length > 0 ? \"true\" : undefined\n }\n data-agent-message-flow-thinking-last={\n !isUser && row.thinking.length > 0 && row.messages.length === 0\n ? \"true\"\n : undefined\n }\n >\n {thinkingContent}\n {showParticipant ? (\n <div\n className={styles.participantMessageLayout}\n data-agent-message-speaker={row.speaker}\n >\n {!isUser ? (\n <AgentConversationParticipantAvatar\n presentation={enabledParticipantPresentation}\n speaker=\"assistant\"\n />\n ) : null}\n <div className={styles.participantMessageContent}>\n {messageContent}\n </div>\n {isUser ? (\n <AgentConversationParticipantAvatar\n presentation={enabledParticipantPresentation}\n speaker=\"user\"\n />\n ) : null}\n </div>\n ) : (\n messageContent\n )}\n </div>\n );\n}\n\nfunction AgentConversationParticipantAvatar({\n presentation,\n speaker\n}: {\n presentation: Extract<\n AgentConversationParticipantPresentation,\n { enabled: true }\n >;\n speaker: AgentMessageRowVM[\"speaker\"];\n}): JSX.Element {\n if (presentation.status === \"loading\") {\n return (\n <Avatar\n aria-hidden=\"true\"\n className={styles.participantAvatar}\n data-agent-conversation-participant-avatar={speaker}\n label=\"\"\n loading\n size=\"md\"\n />\n );\n }\n\n const participant: AgentConversationParticipantIdentity =\n speaker === \"user\" ? presentation.user : presentation.agent;\n return (\n <Avatar\n aria-label={participant.name}\n className={styles.participantAvatar}\n data-agent-conversation-participant-avatar={speaker}\n label={participant.name}\n size=\"md\"\n src={participant.avatarUrl}\n />\n );\n}\n\nfunction AgentCopyableMessageGroup({\n children,\n copyText,\n occurredAtUnixMs,\n onCopyMessageText,\n speaker\n}: {\n children: ReactNode;\n copyText: string | null;\n occurredAtUnixMs: number | null;\n onCopyMessageText: (text: string) => Promise<boolean>;\n speaker: AgentMessageRowVM[\"speaker\"];\n}): JSX.Element {\n \"use memo\";\n const timestamp = formatAgentMessageTimestamp(occurredAtUnixMs);\n const hasFooter = Boolean(timestamp || copyText);\n\n return (\n <div\n className={styles.messageGroup}\n data-agent-message-footer={hasFooter ? \"true\" : undefined}\n data-agent-message-speaker={speaker}\n >\n {children}\n {hasFooter ? (\n <div className={styles.messageFooter}>\n {timestamp ? (\n <span className={styles.messageTimestamp}>{timestamp}</span>\n ) : null}\n {copyText ? (\n <AgentMessageCopyButton\n copyText={copyText}\n onCopyMessageText={onCopyMessageText}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction AgentMessageCopyButton({\n copyText,\n onCopyMessageText\n}: {\n copyText: string;\n onCopyMessageText: (text: string) => Promise<boolean>;\n}): JSX.Element {\n \"use memo\";\n const [copied, setCopied] = useState(false);\n useEffect(() => {\n if (!copied) {\n return;\n }\n const reset = window.setTimeout(() => {\n setCopied(false);\n }, MESSAGE_COPY_FEEDBACK_MS);\n return () => window.clearTimeout(reset);\n }, [copied]);\n const handleClick = useCallback(async () => {\n if (await onCopyMessageText(copyText)) {\n setCopied(true);\n }\n }, [copyText, onCopyMessageText]);\n const label = copied\n ? translate(\"agentHost.agentGui.messageCopied\")\n : translate(\"agentHost.agentGui.copyMessage\");\n\n return (\n <CanvasNodeGhostIconButton\n className={styles.messageCopyButton}\n aria-label={label}\n data-copied={copied ? \"true\" : \"false\"}\n onClick={handleClick}\n >\n {copied ? (\n <CheckIcon width={14} height={14} aria-hidden=\"true\" />\n ) : (\n <CopyIcon width={14} height={14} aria-hidden=\"true\" />\n )}\n </CanvasNodeGhostIconButton>\n );\n}\n\nfunction AgentSystemNoticeMessage({\n message\n}: {\n message: AgentMessageContentVM;\n}): JSX.Element {\n \"use memo\";\n const notice = message.systemNotice;\n const detail = notice?.detail?.trim() ?? \"\";\n const title = systemNoticeTitle(message);\n if (notice?.noticeKind === \"transport_retry\") {\n const retryText = transportRetryNoticeText(message);\n return (\n <div\n role=\"status\"\n className=\"box-border w-full min-w-0 py-1 text-[13px] leading-5 text-[var(--text-primary)]\"\n >\n {retryText}\n </div>\n );\n }\n if (isContextCompactionProgressNotice(message)) {\n return (\n <ContextCompactionProgressDivider\n startedAtUnixMs={message.occurredAtUnixMs}\n />\n );\n }\n if (isContextCompactionNotice(message)) {\n return (\n <ContextCompactionDivider\n text={translate(\"agentHost.agentGui.contextCompactionCompleted\")}\n />\n );\n }\n if (isContextCompactionInterruptedNotice(message)) {\n return (\n <ContextCompactionDivider\n text={translate(\"agentHost.agentGui.contextCompactionInterrupted\")}\n detail={detail || null}\n />\n );\n }\n const isStatusNotice = systemNoticeIsStatus(message);\n return (\n <section\n role={isStatusNotice ? \"status\" : undefined}\n className={`box-border w-full min-w-0 rounded-[8px] border p-3 text-[13px] leading-5 text-[var(--text-primary)] ${SYSTEM_NOTICE_CLASS_NAME}`}\n >\n <div className=\"min-w-0\">\n <div className=\"font-medium text-[var(--text-primary)]\">{title}</div>\n {detail ? (\n <AgentMessageDetailsDisclosure detail={detail} className=\"mt-1\" />\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction systemNoticeIsStatus(message: AgentMessageContentVM): boolean {\n const notice = message.systemNotice;\n return (\n notice?.severity === \"warning\" ||\n notice?.severity === \"error\" ||\n notice?.noticeKind === \"transport_fallback\" ||\n isTransportFallbackNotice(message)\n );\n}\n\nfunction isTransportFallbackNotice(message: AgentMessageContentVM): boolean {\n const notice = message.systemNotice;\n const text = [notice?.title, notice?.detail, message.body]\n .filter(Boolean)\n .join(\"\\n\")\n .toLowerCase();\n return (\n text.includes(\"falling back from websockets\") ||\n text.includes(\"https transport\")\n );\n}\n\nfunction transportRetryNoticeText(message: AgentMessageContentVM): string {\n const notice = message.systemNotice;\n const detail = notice?.detail?.trim() ?? \"\";\n const progressText =\n transportRetryProgressText(detail) ??\n transportRetryProgressText(notice?.title ?? \"\") ??\n transportRetryProgressText(message.body);\n if (progressText) {\n return progressText;\n }\n return (\n notice?.title?.trim() ||\n message.body.trim() ||\n translate(\"agentHost.agentGui.systemNoticeTransportRetry\")\n );\n}\n\nfunction transportRetryProgressText(value: string): string | null {\n const match = TRANSPORT_RETRY_PROGRESS_PATTERN.exec(value.trim());\n return match?.[1]?.replace(/\\s+/g, \" \").trim() || null;\n}\n\nfunction isContextCompactionNotice(message: AgentMessageContentVM): boolean {\n const notice = message.systemNotice;\n return notice?.command === \"compact\" && notice.commandStatus === \"completed\";\n}\n\nfunction isContextCompactionProgressNotice(\n message: AgentMessageContentVM\n): boolean {\n const notice = message.systemNotice;\n return notice?.command === \"compact\" && notice.commandStatus === \"running\";\n}\n\nfunction isContextCompactionInterruptedNotice(\n message: AgentMessageContentVM\n): boolean {\n const notice = message.systemNotice;\n return (\n notice?.command === \"compact\" &&\n (notice.commandStatus === \"failed\" || notice.commandStatus === \"canceled\")\n );\n}\n\nfunction ContextCompactionDivider({\n text,\n detail = null\n}: {\n text: string;\n detail?: string | null;\n}): JSX.Element {\n \"use memo\";\n return (\n <div\n role=\"status\"\n className=\"box-border w-full min-w-0 py-2 text-[12px] leading-4 text-[var(--text-secondary)]\"\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"h-px min-w-4 flex-1 bg-[var(--line-1)]\"\n />\n <span className=\"shrink-0 whitespace-nowrap\">{text}</span>\n <span\n aria-hidden=\"true\"\n className=\"h-px min-w-4 flex-1 bg-[var(--line-1)]\"\n />\n </div>\n {detail ? (\n <div className=\"mt-1 min-w-0 whitespace-pre-wrap break-words text-center leading-5\">\n {detail}\n </div>\n ) : null}\n </div>\n );\n}\n\n// Live compaction banner: the daemon replaces this notice in place with the\n// \"Context compacted.\" notice once the provider finishes, so the timer only\n// runs while compaction is actually in flight.\nfunction ContextCompactionProgressDivider({\n startedAtUnixMs\n}: {\n startedAtUnixMs: number | null;\n}): JSX.Element {\n \"use memo\";\n const elapsedSeconds = useElapsedSeconds(startedAtUnixMs);\n const label = translate(\"agentHost.agentGui.contextCompactionInProgress\");\n const text =\n elapsedSeconds === null\n ? label\n : `${label} · ${formatElapsedSeconds(elapsedSeconds)}`;\n return <ContextCompactionDivider text={text} />;\n}\n\nfunction formatElapsedSeconds(seconds: number): string {\n if (seconds < 60) {\n return `${seconds}s`;\n }\n return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\n// Codex plan-mode proposals render as a framed card (mirrors the codex TUI\n// treating the plan item as a distinct artifact rather than chat text).\nfunction AgentPlanCardMessage({\n message,\n workspaceRoot,\n basePath,\n onLinkAction,\n workspaceAppIcons,\n previewMode = false\n}: {\n message: AgentMessageContentVM;\n workspaceRoot: string | null;\n basePath: string;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n previewMode?: boolean;\n}): JSX.Element {\n \"use memo\";\n return (\n <AgentPlanCard copyText={message.body}>\n <AgentMessageMarkdown\n content={message.body}\n className={styles.assistantMarkdown}\n onLinkAction={onLinkAction}\n workspaceLinkContext={{\n workspaceRoot,\n basePath,\n source: \"agent-markdown\"\n }}\n workspaceAppIcons={workspaceAppIcons}\n enableImageZoom\n previewMode={previewMode}\n />\n </AgentPlanCard>\n );\n}\n\nfunction systemNoticeTitle(message: AgentMessageContentVM): string {\n const notice = message.systemNotice;\n switch (notice?.noticeKind) {\n case \"transport_retry\":\n return translate(\"agentHost.agentGui.systemNoticeTransportRetry\");\n case \"transport_fallback\":\n return translate(\"agentHost.agentGui.systemNoticeTransportFallback\");\n case \"plan_implementation_pending_confirmation\":\n return translate(\n \"agentHost.agentGui.systemNoticePlanImplementationPendingConfirmation\"\n );\n case \"plan_implementation_completed\":\n return translate(\n \"agentHost.agentGui.systemNoticePlanImplementationCompleted\"\n );\n case \"warning\":\n return (\n notice.title || translate(\"agentHost.agentGui.systemNoticeWarning\")\n );\n default:\n return (\n notice?.title ||\n message.body ||\n translate(\"agentHost.agentGui.systemNoticeDefault\")\n );\n }\n}\n","import type {\n AppErrorCode,\n AppErrorDescriptor,\n AppErrorParams\n} from \"../contracts/dto\";\nimport type { IpcInvokeResult } from \"../contracts/ipc\";\n\nfunction createMessageMap(): Record<AppErrorCode, string> {\n return {\n \"common.invalid_input\": \"The request was invalid.\",\n \"common.approved_path_required\":\n \"The selected path is outside approved workspaces.\",\n \"common.unavailable\": \"This feature is unavailable.\",\n \"common.unexpected\": \"Something went wrong. Please try again.\",\n \"session.not_found\": \"Session not found.\",\n \"control_surface.unauthorized\": \"Unauthorized request.\",\n \"workspace.select_directory_failed\": \"Unable to open the directory picker.\",\n \"workspace.select_files_failed\": \"Unable to open the file picker.\",\n \"workspace.ensure_directory_failed\": \"Unable to create the directory.\",\n \"workspace.import_files_failed\": \"Unable to import the selected files.\",\n \"workspace.read_file_failed\": \"Unable to load the selected file.\",\n \"workspace.write_file_failed\": \"Unable to save the selected file.\",\n \"workspace.export_file_failed\": \"Unable to export the selected file.\",\n \"workspace.copy_path_failed\": \"Unable to copy the path.\",\n \"workspace.host_unsupported\":\n \"This Mac cannot run the workspace environment required by tsh. Please use macOS 13 or later on Apple Silicon (or an Intel Mac that supports Apple Virtualization), and ensure virtualization is not blocked by MDM.\",\n \"workspace.runtime_artifact_unavailable\":\n \"Unable to prepare the workspace environment required by tsh. Check your network connection and try again.\",\n \"runtime.guest_agent_lane_unavailable\":\n \"The workspace environment connection is unavailable. Refresh and try again.\",\n \"workspace.room_full\": \"Room is full.\",\n \"workspace.room_delete_forbidden\":\n \"Only the space owner can delete this space.\",\n \"workspace.room_delete_not_found\": \"This space no longer exists.\",\n \"filesystem.create_directory_failed\": \"Unable to create the directory.\",\n \"filesystem.read_file_bytes_failed\": \"Unable to read the file.\",\n \"filesystem.read_file_text_failed\": \"Unable to read the file.\",\n \"filesystem.write_file_text_failed\": \"Unable to save the file.\",\n \"filesystem.copy_entry_failed\": \"Unable to copy the file or folder.\",\n \"filesystem.move_entry_failed\": \"Unable to move the file or folder.\",\n \"filesystem.rename_entry_failed\": \"Unable to rename the file or folder.\",\n \"filesystem.delete_entry_failed\": \"Unable to delete the file or folder.\",\n \"filesystem.read_directory_failed\": \"Unable to load the directory.\",\n \"filesystem.stat_failed\": \"Unable to read file details.\",\n \"terminal.spawn_failed\": \"Unable to start the terminal.\",\n \"terminal.write_failed\": \"Unable to write to the terminal.\",\n \"terminal.resize_failed\": \"Unable to resize the terminal.\",\n \"terminal.close_failed\": \"Unable to close the terminal.\",\n \"terminal.attach_failed\": \"Unable to attach the terminal session.\",\n \"terminal.detach_failed\": \"Unable to detach the terminal session.\",\n \"terminal.snapshot_failed\": \"Unable to read terminal output.\",\n \"agent.list_models_failed\": \"Unable to load models for this provider.\",\n \"agent.launch_failed\": \"Unable to start the agent.\",\n \"agent.read_last_message_failed\": \"Unable to read the last agent message.\",\n \"agent.provider_session_not_found\":\n \"The previous agent session can no longer be restored.\",\n \"agent.resume_session_not_local\":\n \"The previous agent session is not available on this machine.\",\n \"agent.resume_session_resolve_failed\":\n \"Unable to resolve the previous agent session.\",\n \"agent.settings_require_new_session\":\n \"This model can only be used in a new session to preserve context.\",\n \"task.suggest_title_failed\": \"Unable to generate task details.\",\n \"persistence.unavailable\":\n \"Storage is unavailable; changes will not be saved.\",\n \"persistence.quota_exceeded\": \"Storage quota was exceeded.\",\n \"persistence.payload_too_large\": \"Workspace state is too large to save.\",\n \"persistence.io_failed\": \"Unable to save data to storage.\",\n \"persistence.invalid_state\": \"The workspace state could not be saved.\",\n \"persistence.invalid_node_id\": \"The terminal history could not be saved.\",\n \"update.get_state_failed\": \"Unable to read the update status.\",\n \"update.configure_failed\": \"Unable to apply update settings.\",\n \"update.check_failed\": \"Unable to check for updates.\",\n \"update.download_failed\": \"Unable to download the update.\",\n \"update.install_failed\": \"Unable to install the update.\",\n PACKAGE_DOWNLOAD_INTERRUPTED:\n \"The agent package download was interrupted. Check your network connection and retry.\",\n PACKAGE_DOWNLOAD_HTTP_STATUS:\n \"The agent package server rejected the download. Retry later or contact support.\",\n PACKAGE_DOWNLOAD_INVALID:\n \"The downloaded agent package failed integrity checks. Retry the download.\",\n PACKAGE_DOWNLOAD_DISK_ERROR:\n \"Unable to write the agent package cache. Check disk permissions and free space.\"\n };\n}\n\nconst APP_ERROR_MESSAGES = createMessageMap();\n\nfunction normalizeDebugMessage(error: unknown): string | undefined {\n if (error instanceof TshAppError) {\n return error.debugMessage;\n }\n\n if (error instanceof Error) {\n return error.message.length > 0\n ? `${error.name}: ${error.message}`\n : error.name;\n }\n\n if (typeof error === \"string\") {\n return error.length > 0 ? error : undefined;\n }\n\n return undefined;\n}\n\nexport function createAppErrorDescriptor(\n code: AppErrorCode,\n options: {\n params?: AppErrorParams;\n debugMessage?: string;\n } = {}\n): AppErrorDescriptor {\n return {\n code,\n ...(options.params ? { params: options.params } : {}),\n ...(options.debugMessage ? { debugMessage: options.debugMessage } : {})\n };\n}\n\nexport function isAppErrorDescriptor(\n value: unknown\n): value is AppErrorDescriptor {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n return typeof record.code === \"string\" && record.code in APP_ERROR_MESSAGES;\n}\n\nexport function getAppErrorCode(error: unknown): AppErrorCode | null {\n if (error instanceof TshAppError) {\n return error.code;\n }\n\n if (isAppErrorDescriptor(error)) {\n return error.code;\n }\n\n if (error && typeof error === \"object\") {\n const code = (error as { code?: unknown }).code;\n if (typeof code === \"string\" && code in APP_ERROR_MESSAGES) {\n return code as AppErrorCode;\n }\n }\n\n return null;\n}\n\nexport class TshAppError extends Error {\n public readonly code: AppErrorCode;\n public readonly params: AppErrorParams | undefined;\n public readonly debugMessage: string | undefined;\n\n public constructor(descriptor: AppErrorDescriptor) {\n super(formatAppErrorMessage(descriptor));\n this.name = \"TshAppError\";\n this.code = descriptor.code;\n this.params = descriptor.params;\n this.debugMessage = descriptor.debugMessage;\n }\n\n public toDescriptor(): AppErrorDescriptor {\n return createAppErrorDescriptor(this.code, {\n params: this.params,\n debugMessage: this.debugMessage\n });\n }\n}\n\nexport function createAppError(\n codeOrDescriptor: AppErrorCode | AppErrorDescriptor,\n options: {\n params?: AppErrorParams;\n debugMessage?: string;\n } = {}\n): TshAppError {\n const descriptor =\n typeof codeOrDescriptor === \"string\"\n ? createAppErrorDescriptor(codeOrDescriptor, options)\n : codeOrDescriptor;\n\n return new TshAppError(descriptor);\n}\n\nexport function toAppErrorDescriptor(\n error: unknown,\n fallbackCode: AppErrorCode = \"common.unexpected\"\n): AppErrorDescriptor {\n if (error instanceof TshAppError) {\n return error.toDescriptor();\n }\n\n if (isAppErrorDescriptor(error)) {\n return error;\n }\n\n return createAppErrorDescriptor(fallbackCode, {\n debugMessage: normalizeDebugMessage(error)\n });\n}\n\nexport function formatAppErrorMessage(\n error: AppErrorDescriptor | TshAppError\n): string {\n const descriptor =\n error instanceof TshAppError ? error.toDescriptor() : error;\n return (\n APP_ERROR_MESSAGES[descriptor.code] ??\n APP_ERROR_MESSAGES[\"common.unexpected\"]\n );\n}\n\nexport function getAppErrorDebugMessage(\n error: AppErrorDescriptor | TshAppError | Error | string | null | undefined\n): string | undefined {\n if (!error) {\n return undefined;\n }\n\n if (error instanceof TshAppError) {\n return error.debugMessage;\n }\n\n if (isAppErrorDescriptor(error)) {\n return error.debugMessage;\n }\n\n return normalizeDebugMessage(error);\n}\n\nexport function isIpcInvokeResult<T>(\n value: unknown\n): value is IpcInvokeResult<T> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n return record.__tshIpcEnvelope === true && typeof record.ok === \"boolean\";\n}\n","import type { AgentProvider } from \"../../../../contexts/settings/domain/agentSettings\";\nimport { getActiveUiLanguage, translate } from \"../../../../i18n/index\";\nimport { resolveMigratedAgentGUIProviderIdentity } from \"../../../../providerIdentityCatalog.ts\";\nimport {\n formatAppErrorMessage,\n isAppErrorDescriptor,\n TshAppError\n} from \"../../../../shared/errors/appError\";\n\n/** 在数字与非数字、非空白字符的边界插入空格(如「3小时前」→「3 小时前」)。 */\nexport function addSpacesAroundDigits(s: string): string {\n return s\n .replace(/(\\d)([^\\d\\s])/g, \"$1 $2\")\n .replace(/([^\\d\\s])(\\d)/g, \"$1 $2\");\n}\n\nconst relativeTimeFormatterByLanguage = new Map<\n string,\n Intl.RelativeTimeFormat\n>();\nconst dateTimeFormatterByLanguage = new Map<string, Intl.DateTimeFormat>();\nconst shortDateFormatterByLanguage = new Map<string, Intl.DateTimeFormat>();\nconst shortDateTimeFormatterByLanguage = new Map<string, Intl.DateTimeFormat>();\nconst weekdayTimeFormatterByLanguage = new Map<string, Intl.DateTimeFormat>();\n\nfunction getRelativeTimeFormatter(language: string): Intl.RelativeTimeFormat {\n const cached = relativeTimeFormatterByLanguage.get(language);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.RelativeTimeFormat(language, { numeric: \"auto\" });\n relativeTimeFormatterByLanguage.set(language, formatter);\n return formatter;\n}\n\nfunction getDateTimeFormatter(language: string): Intl.DateTimeFormat {\n const cached = dateTimeFormatterByLanguage.get(language);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(language, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\"\n });\n dateTimeFormatterByLanguage.set(language, formatter);\n return formatter;\n}\n\nfunction getShortDateFormatter(language: string): Intl.DateTimeFormat {\n const cached = shortDateFormatterByLanguage.get(language);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(language, {\n month: language === \"en\" ? \"short\" : \"numeric\",\n day: \"numeric\"\n });\n shortDateFormatterByLanguage.set(language, formatter);\n return formatter;\n}\n\nfunction getShortDateTimeFormatter(language: string): Intl.DateTimeFormat {\n const cached = shortDateTimeFormatterByLanguage.get(language);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(language, {\n month: language === \"en\" ? \"short\" : \"numeric\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\"\n });\n shortDateTimeFormatterByLanguage.set(language, formatter);\n return formatter;\n}\n\nfunction getWeekdayTimeFormatter(language: string): Intl.DateTimeFormat {\n const cached = weekdayTimeFormatterByLanguage.get(language);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(language, {\n weekday: \"long\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\"\n });\n weekdayTimeFormatterByLanguage.set(language, formatter);\n return formatter;\n}\n\nfunction toLocalWeekdayTime(\n value: Date | number,\n language = getActiveUiLanguage()\n): string {\n const formatter = getWeekdayTimeFormatter(language);\n const parts = formatter.formatToParts(value);\n const weekday = parts.find((part) => part.type === \"weekday\")?.value;\n const hour = parts.find((part) => part.type === \"hour\")?.value;\n const minute = parts.find((part) => part.type === \"minute\")?.value;\n if (weekday && hour && minute) {\n return `${weekday} ${hour}:${minute}`;\n }\n\n return formatter.format(value);\n}\n\nexport function toErrorMessage(error: unknown): string {\n if (error instanceof TshAppError) {\n return formatAppErrorMessage(error);\n }\n\n if (isAppErrorDescriptor(error)) {\n return formatAppErrorMessage(error);\n }\n\n if (error instanceof Error && error.message) {\n return error.message;\n }\n\n if (typeof error === \"string\" && error.length > 0) {\n return error;\n }\n\n return translate(\"common.unknownError\");\n}\n\nexport function toAgentNodeTitle(\n provider: AgentProvider,\n model: string | null\n): string {\n const providerTitle =\n resolveMigratedAgentGUIProviderIdentity(provider)?.providerId ??\n (provider.trim().toLowerCase() || \"unknown\");\n return `${providerTitle} · ${model ?? translate(\"common.defaultModel\")}`;\n}\n\nexport function toLocalDateTime(iso: string | null): string {\n const formatter = getDateTimeFormatter(getActiveUiLanguage());\n\n if (!iso) {\n return formatter.format(Date.now());\n }\n\n const timestamp = Date.parse(iso);\n if (Number.isNaN(timestamp)) {\n return iso;\n }\n\n return formatter.format(timestamp);\n}\n\nexport function toLocalShortDate(\n value: Date | number,\n language = getActiveUiLanguage()\n): string {\n return getShortDateFormatter(language).format(value);\n}\n\nexport function toLocalShortDateTime(\n value: Date | number,\n language = getActiveUiLanguage()\n): string {\n return getShortDateTimeFormatter(language).format(value);\n}\n\nexport function formatUnixTimestampAsLocalShortDateTime(\n unix?: number | null,\n language = getActiveUiLanguage()\n): string {\n if (!unix || !Number.isFinite(unix)) {\n return \"—\";\n }\n\n const value = unix > 1_000_000_000_000 ? unix : unix * 1000;\n return toLocalShortDateTime(value, language);\n}\n\nexport function formatAgentMessageTimestamp(\n unix?: number | null,\n language = getActiveUiLanguage(),\n now: Date = new Date()\n): string | null {\n if (unix == null || !Number.isFinite(unix)) {\n return null;\n }\n\n const value = unix > 1_000_000_000_000 ? unix : unix * 1000;\n const messageDate = new Date(value);\n const startOfWeek = new Date(now);\n const daysSinceMonday = (startOfWeek.getDay() + 6) % 7;\n startOfWeek.setHours(0, 0, 0, 0);\n startOfWeek.setDate(startOfWeek.getDate() - daysSinceMonday);\n\n if (messageDate.getTime() >= startOfWeek.getTime()) {\n return toLocalWeekdayTime(value, language);\n }\n\n return toLocalShortDateTime(value, language);\n}\n\nexport function toRelativeTime(iso: string | null): string {\n const formatter = getRelativeTimeFormatter(getActiveUiLanguage());\n\n if (!iso) {\n return addSpacesAroundDigits(formatter.format(0, \"second\"));\n }\n\n const timestamp = Date.parse(iso);\n if (Number.isNaN(timestamp)) {\n return addSpacesAroundDigits(formatter.format(0, \"second\"));\n }\n\n const deltaSeconds = Math.max(0, Math.floor((Date.now() - timestamp) / 1000));\n if (deltaSeconds < 60) {\n return addSpacesAroundDigits(formatter.format(0, \"second\"));\n }\n\n if (deltaSeconds < 3600) {\n return addSpacesAroundDigits(\n formatter.format(-Math.floor(deltaSeconds / 60), \"minute\")\n );\n }\n\n if (deltaSeconds < 86400) {\n return addSpacesAroundDigits(\n formatter.format(-Math.floor(deltaSeconds / 3600), \"hour\")\n );\n }\n\n const deltaDays = Math.floor(deltaSeconds / 86400);\n if (deltaDays < 30) {\n return addSpacesAroundDigits(formatter.format(-deltaDays, \"day\"));\n }\n\n const deltaMonths = Math.floor(deltaDays / 30);\n if (deltaMonths < 12) {\n return addSpacesAroundDigits(formatter.format(-deltaMonths, \"month\"));\n }\n\n return addSpacesAroundDigits(\n formatter.format(-Math.floor(deltaDays / 365), \"year\")\n );\n}\n","import { useCallback, useRef, useState, type JSX, type ReactNode } from \"react\";\nimport { Check, ChevronDown, ChevronUp, Copy, ListChecks } from \"lucide-react\";\nimport { translate } from \"../../../i18n/index\";\n\nconst COLLAPSED_MAX_HEIGHT_PX = 220;\n\n/**\n * Shared collapsible plan card used by both providers' plan proposals so the\n * codex plan item and the claude-code ExitPlanMode plan render identically:\n * a framed card with a title, a copy action, and a collapse/expand affordance\n * (long plans default to collapsed with an \"expand plan\" overlay).\n */\nexport function AgentPlanCard({\n title,\n copyText,\n children,\n defaultCollapsed = true\n}: {\n title?: string;\n copyText: string;\n children: ReactNode;\n defaultCollapsed?: boolean;\n}): JSX.Element {\n \"use memo\";\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleCopy = useCallback(() => {\n void navigator.clipboard?.writeText(copyText).then(() => {\n setCopied(true);\n if (copyResetRef.current) {\n clearTimeout(copyResetRef.current);\n }\n copyResetRef.current = setTimeout(() => setCopied(false), 1500);\n });\n }, [copyText]);\n\n return (\n <section\n data-testid=\"agent-plan-card\"\n data-collapsed={collapsed ? \"true\" : \"false\"}\n className=\"box-border w-full min-w-0 rounded-[8px] border border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)] p-3\"\n >\n <div className=\"mb-2 flex items-center gap-1.5\">\n <ListChecks\n size={14}\n strokeWidth={2}\n aria-hidden=\"true\"\n className=\"shrink-0 text-[var(--text-secondary)]\"\n />\n <span\n data-testid=\"agent-plan-card-title\"\n className=\"flex-1 truncate text-[12px] font-medium text-[var(--text-secondary)]\"\n >\n {title ?? translate(\"agentHost.agentGui.planCardTitle\")}\n </span>\n <button\n type=\"button\"\n data-testid=\"agent-plan-card-copy\"\n className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-[6px] text-[var(--text-tertiary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-secondary)]\"\n aria-label={translate(\"agentHost.agentGui.planCardCopy\")}\n title={translate(\"agentHost.agentGui.planCardCopy\")}\n onClick={handleCopy}\n >\n {copied ? (\n <Check size={14} strokeWidth={2} aria-hidden=\"true\" />\n ) : (\n <Copy size={14} strokeWidth={2} aria-hidden=\"true\" />\n )}\n </button>\n <button\n type=\"button\"\n data-testid=\"agent-plan-card-toggle\"\n className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-[6px] text-[var(--text-tertiary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-secondary)]\"\n aria-expanded={!collapsed}\n aria-label={translate(\n collapsed\n ? \"agentHost.agentGui.planCardExpand\"\n : \"agentHost.agentGui.planCardCollapse\"\n )}\n title={translate(\n collapsed\n ? \"agentHost.agentGui.planCardExpand\"\n : \"agentHost.agentGui.planCardCollapse\"\n )}\n onClick={() => setCollapsed((value) => !value)}\n >\n {collapsed ? (\n <ChevronDown size={15} strokeWidth={2} aria-hidden=\"true\" />\n ) : (\n <ChevronUp size={15} strokeWidth={2} aria-hidden=\"true\" />\n )}\n </button>\n </div>\n <div className=\"relative\">\n <div\n data-testid=\"agent-plan-card-body\"\n className=\"min-w-0 overflow-hidden\"\n style={\n collapsed\n ? { maxHeight: `${COLLAPSED_MAX_HEIGHT_PX}px` }\n : undefined\n }\n >\n {children}\n </div>\n {collapsed ? (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 flex justify-center bg-gradient-to-t from-[var(--tutti-purple-bg)] via-[color-mix(in_srgb,var(--tutti-purple-bg)_70%,transparent)] to-transparent pt-8 pb-1\">\n <button\n type=\"button\"\n data-testid=\"agent-plan-card-expand\"\n className=\"pointer-events-auto inline-flex h-7 items-center rounded-full border border-[var(--line-2)] bg-[var(--background-fronted)] px-3 text-[12px] font-medium text-[var(--text-secondary)] transition-colors hover:text-[var(--text-primary)]\"\n onClick={() => setCollapsed(false)}\n >\n {translate(\"agentHost.agentGui.planCardExpand\")}\n </button>\n </div>\n ) : null}\n </div>\n </section>\n );\n}\n","import { useCallback, useState, type JSX } from \"react\";\nimport {\n ArrowRightLeft,\n ChevronDown,\n ChevronUp,\n GitFork,\n LoaderCircle,\n MessageCircleQuestion,\n Users\n} from \"lucide-react\";\nimport { toast } from \"@tutti-os/ui-system\";\nimport { translate } from \"../../../i18n/index\";\nimport { useOptionalAgentHostApi } from \"../../../agentActivityHost\";\nimport { useOptionalAgentActivityRuntime } from \"../../../agentActivityRuntime\";\nimport {\n AgentMessageMarkdown,\n type AgentMessageMarkdownWorkspaceAppIcon\n} from \"../../AgentMessageMarkdown\";\nimport type { WorkspaceLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport type { AgentCollaborationVM } from \"../contracts/agentCollaborationVM\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\n\n/**\n * Transcript card for one durable collaboration run (model consult, fork,\n * delegate, or handoff). The daemon updates the same message in place as the\n * run progresses, so all durable state comes from the projected\n * `AgentCollaborationVM`; the card owns only UI-local interaction state\n * (result disclosure, in-flight adoption action + optimistic echo).\n */\nexport function AgentCollaborationRow({\n collaboration,\n workspaceRoot,\n basePath,\n onLinkAction,\n workspaceAppIcons,\n previewMode = false\n}: {\n collaboration: AgentCollaborationVM;\n workspaceRoot: string | null;\n basePath: string;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n previewMode?: boolean;\n}): JSX.Element {\n \"use memo\";\n const agentHostApi = useOptionalAgentHostApi();\n const runtime = useOptionalAgentActivityRuntime();\n const [resultExpanded, setResultExpanded] = useState(false);\n const [adoptionPending, setAdoptionPending] = useState(false);\n // Optimistic echo until the daemon's in-place message update arrives.\n const [localAdoption, setLocalAdoption] = useState<string | null>(null);\n\n const adoption = localAdoption ?? collaboration.adoption;\n const resultText = collaboration.resultText?.trim() ?? \"\";\n const canSubmitAdoption = Boolean(\n runtime?.setCollaborationAdoption &&\n collaboration.workspaceId &&\n collaboration.agentSessionId &&\n !previewMode\n );\n const showAdoptionControls =\n (collaboration.mode === \"consult\" || collaboration.mode === \"delegate\") &&\n adoption !== \"not_applicable\" &&\n collaboration.status === \"completed\" &&\n canSubmitAdoption;\n\n const submitAdoption = useCallback(\n async (nextAdoption: \"adopted\" | \"rejected\") => {\n const setCollaborationAdoption = runtime?.setCollaborationAdoption;\n if (\n !setCollaborationAdoption ||\n !collaboration.workspaceId ||\n !collaboration.agentSessionId ||\n adoptionPending\n ) {\n return;\n }\n setAdoptionPending(true);\n try {\n const run = await setCollaborationAdoption({\n adoption: nextAdoption,\n agentSessionId: collaboration.agentSessionId,\n runId: collaboration.runId,\n workspaceId: collaboration.workspaceId\n });\n setLocalAdoption(run.adoption);\n } catch {\n const message = translate(\n \"agentHost.agentGui.collaborationAdoptionFailed\"\n );\n if (agentHostApi?.toast?.error) {\n agentHostApi.toast.error(message);\n } else {\n toast.error(message);\n }\n } finally {\n setAdoptionPending(false);\n }\n },\n [\n adoptionPending,\n agentHostApi,\n collaboration.agentSessionId,\n collaboration.runId,\n collaboration.workspaceId,\n runtime\n ]\n );\n\n const ModeIcon = collaborationModeIcon(collaboration.mode);\n const planText = collaboration.modelPlanName ?? collaboration.modelPlanId;\n\n return (\n <section\n data-testid=\"agent-collaboration-row\"\n data-collaboration-run-id={collaboration.runId}\n data-collaboration-mode={collaboration.mode}\n data-collaboration-status={collaboration.status}\n className=\"box-border w-full min-w-0 rounded-[8px] border border-[var(--line-2)] bg-[var(--background-fronted)] p-3 text-[13px] leading-5 text-[var(--text-primary)]\"\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"inline-flex min-w-0 items-center gap-1.5 font-medium\">\n <ModeIcon\n size={14}\n strokeWidth={2}\n aria-hidden=\"true\"\n className=\"shrink-0 text-[var(--text-secondary)]\"\n />\n <span className=\"truncate\">\n {collaborationModeLabel(collaboration.mode)}\n </span>\n </span>\n <span\n data-testid=\"agent-collaboration-trigger\"\n className=\"shrink-0 rounded-full border border-[var(--line-2)] px-1.5 text-[11px] leading-4 text-[var(--text-tertiary)]\"\n >\n {collaborationTriggerLabel(collaboration.triggerSource)}\n </span>\n {planText || collaboration.model ? (\n <span\n data-testid=\"agent-collaboration-model\"\n className=\"min-w-0 truncate text-[12px] text-[var(--text-tertiary)]\"\n >\n {planText\n ? translate(\"agentHost.agentGui.collaborationPlanLabel\", {\n name: planText\n })\n : null}\n {planText && collaboration.model ? \" · \" : null}\n {collaboration.model}\n </span>\n ) : null}\n <span className=\"min-w-0 flex-1\" />\n <span\n data-testid=\"agent-collaboration-status\"\n data-status={collaboration.status}\n className={`inline-flex shrink-0 items-center gap-1 rounded-full px-2 text-[11px] leading-[18px] ${collaborationStatusClassName(collaboration.status)}`}\n >\n {collaboration.status === \"running\" ? (\n <LoaderCircle\n size={11}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"animate-spin\"\n />\n ) : null}\n {collaborationStatusLabel(collaboration.status)}\n {collaboration.durationMs !== null &&\n collaboration.status !== \"running\"\n ? ` · ${formatCollaborationDuration(collaboration.durationMs)}`\n : null}\n </span>\n </div>\n {collaboration.usage ? (\n <div\n data-testid=\"agent-collaboration-usage\"\n className=\"mt-1 text-[11px] text-[var(--text-tertiary)]\"\n >\n {translate(\"agentHost.agentGui.collaborationUsageTokens\", {\n input: String(collaboration.usage.inputTokens),\n output: String(collaboration.usage.outputTokens)\n })}\n </div>\n ) : null}\n {collaboration.failureReason ? (\n <div\n data-testid=\"agent-collaboration-failure\"\n className=\"mt-1.5 text-[12px] text-[var(--state-danger)]\"\n >\n {translate(\"agentHost.agentGui.collaborationFailureReason\", {\n reason: collaboration.failureReason\n })}\n </div>\n ) : null}\n {collaboration.mode === \"consult\" && resultText ? (\n <div className=\"mt-2\">\n <button\n type=\"button\"\n data-testid=\"agent-collaboration-result-toggle\"\n aria-expanded={resultExpanded}\n className=\"inline-flex items-center gap-1 text-[12px] text-[var(--text-secondary)] transition-colors hover:text-[var(--text-primary)]\"\n onClick={() => setResultExpanded((value) => !value)}\n >\n {translate(\n resultExpanded\n ? \"agentHost.agentGui.collaborationResultHide\"\n : \"agentHost.agentGui.collaborationResultShow\"\n )}\n {resultExpanded ? (\n <ChevronUp size={13} strokeWidth={2} aria-hidden=\"true\" />\n ) : (\n <ChevronDown size={13} strokeWidth={2} aria-hidden=\"true\" />\n )}\n </button>\n {resultExpanded ? (\n <div\n data-testid=\"agent-collaboration-result\"\n className=\"mt-1.5 min-w-0\"\n >\n <AgentMessageMarkdown\n content={resultText}\n className={styles.assistantMarkdown}\n onLinkAction={onLinkAction}\n workspaceLinkContext={{\n workspaceRoot,\n basePath,\n source: \"agent-markdown\"\n }}\n workspaceAppIcons={workspaceAppIcons}\n enableImageZoom\n previewMode={previewMode}\n />\n </div>\n ) : null}\n </div>\n ) : null}\n {showAdoptionControls && adoption === \"pending\" ? (\n <div className=\"mt-2 flex items-center gap-2\">\n <button\n type=\"button\"\n data-testid=\"agent-collaboration-adopt\"\n disabled={adoptionPending}\n className=\"inline-flex h-6 items-center rounded-[6px] border border-[var(--line-2)] px-2 text-[12px] font-medium text-[var(--text-secondary)] transition-colors hover:text-[var(--text-primary)] disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={() => void submitAdoption(\"adopted\")}\n >\n {translate(\"agentHost.agentGui.collaborationAdopt\")}\n </button>\n <button\n type=\"button\"\n data-testid=\"agent-collaboration-reject\"\n disabled={adoptionPending}\n className=\"inline-flex h-6 items-center rounded-[6px] border border-[var(--line-2)] px-2 text-[12px] text-[var(--text-tertiary)] transition-colors hover:text-[var(--text-secondary)] disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={() => void submitAdoption(\"rejected\")}\n >\n {translate(\"agentHost.agentGui.collaborationReject\")}\n </button>\n </div>\n ) : null}\n {adoption === \"adopted\" || adoption === \"rejected\" ? (\n <div\n data-testid=\"agent-collaboration-adoption\"\n data-adoption={adoption}\n className=\"mt-2 text-[11px] text-[var(--text-tertiary)]\"\n >\n {translate(\n adoption === \"adopted\"\n ? \"agentHost.agentGui.collaborationAdopted\"\n : \"agentHost.agentGui.collaborationRejected\"\n )}\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction collaborationModeIcon(\n mode: AgentCollaborationVM[\"mode\"]\n): typeof MessageCircleQuestion {\n switch (mode) {\n case \"fork\":\n return GitFork;\n case \"delegate\":\n return Users;\n case \"handoff\":\n return ArrowRightLeft;\n default:\n return MessageCircleQuestion;\n }\n}\n\nfunction collaborationModeLabel(mode: AgentCollaborationVM[\"mode\"]): string {\n switch (mode) {\n case \"consult\":\n return translate(\"agentHost.agentGui.collaborationModeConsult\");\n case \"fork\":\n return translate(\"agentHost.agentGui.collaborationModeFork\");\n case \"delegate\":\n return translate(\"agentHost.agentGui.collaborationModeDelegate\");\n case \"handoff\":\n return translate(\"agentHost.agentGui.collaborationModeHandoff\");\n default:\n return mode;\n }\n}\n\nfunction collaborationTriggerLabel(\n triggerSource: AgentCollaborationVM[\"triggerSource\"]\n): string {\n switch (triggerSource) {\n case \"user\":\n return translate(\"agentHost.agentGui.collaborationTriggerUser\");\n case \"agent\":\n return translate(\"agentHost.agentGui.collaborationTriggerAgent\");\n case \"policy\":\n return translate(\"agentHost.agentGui.collaborationTriggerPolicy\");\n default:\n return triggerSource;\n }\n}\n\nfunction collaborationStatusLabel(\n status: AgentCollaborationVM[\"status\"]\n): string {\n switch (status) {\n case \"running\":\n return translate(\"agentHost.agentGui.collaborationStatusRunning\");\n case \"completed\":\n return translate(\"agentHost.agentGui.collaborationStatusCompleted\");\n case \"failed\":\n return translate(\"agentHost.agentGui.collaborationStatusFailed\");\n case \"canceled\":\n return translate(\"agentHost.agentGui.collaborationStatusCanceled\");\n default:\n return status;\n }\n}\n\nfunction collaborationStatusClassName(\n status: AgentCollaborationVM[\"status\"]\n): string {\n switch (status) {\n case \"failed\":\n return \"bg-[var(--on-danger)] text-[var(--state-danger)]\";\n case \"running\":\n return \"bg-[color-mix(in_srgb,var(--tutti-purple)_12%,transparent)] text-[var(--tutti-purple)]\";\n default:\n return \"bg-[var(--transparency-hover)] text-[var(--text-secondary)]\";\n }\n}\n\nfunction formatCollaborationDuration(durationMs: number): string {\n const totalSeconds = Math.max(0, Math.round(durationMs / 1000));\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n","import { useState, type JSX } from \"react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { translate } from \"../../../i18n/index\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\n\nexport function AgentMessageDetailsDisclosure({\n detail,\n className = \"\",\n label\n}: {\n detail: string;\n className?: string;\n label?: string;\n}): JSX.Element {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n return (\n <div className={`${className} text-[11px] text-[var(--state-danger)]`}>\n <button\n type=\"button\"\n className=\"inline-flex w-fit max-w-full min-w-0 cursor-pointer select-none items-center gap-1.5 border-0 bg-transparent p-0 text-left font-[inherit] text-[inherit] transition-colors duration-150 hover:text-[var(--state-danger-hover)]\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {label ?? translate(\"agentHost.agentGui.visibleErrorDetails\")}\n <ChevronRight\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"shrink-0 text-[var(--state-danger)]\"\n style={{\n transform: expanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transformOrigin: \"center\",\n transition: \"transform 200ms cubic-bezier(0.22, 1.18, 0.36, 1)\",\n willChange: \"transform\"\n }}\n />\n </button>\n <CollapsibleReveal expanded={expanded} preMountOnIdle>\n <pre className=\"mt-2 max-h-[220px] overflow-auto whitespace-pre-wrap break-words rounded-[6px] bg-[var(--on-danger)] px-3 py-2 font-[var(--tsh-font-mono)] text-[11px] leading-5 text-[var(--state-danger)]\">\n {detail}\n </pre>\n </CollapsibleReveal>\n </div>\n );\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n type ReactNode,\n type TransitionEvent\n} from \"react\";\n\ninterface CollapsibleRevealProps {\n expanded: boolean;\n children: ReactNode;\n className?: string;\n innerClassName?: string;\n onHeightTransitionEnd?: () => void;\n preMountOnIdle?: boolean;\n}\n\nexport function CollapsibleReveal({\n expanded,\n children,\n className,\n innerClassName,\n onHeightTransitionEnd,\n preMountOnIdle = false\n}: CollapsibleRevealProps): JSX.Element | null {\n \"use memo\";\n const [mounted, setMounted] = useState(expanded);\n const [visible, setVisible] = useState(expanded);\n const [height, setHeight] = useState<string>(expanded ? \"auto\" : \"0px\");\n const rootRef = useRef<HTMLDivElement | null>(null);\n const innerRef = useRef<HTMLDivElement | null>(null);\n const heightRef = useRef(height);\n const measuredHeightRef = useRef<number | null>(null);\n const previousExpandedRef = useRef(expanded);\n const heightTransitionPendingRef = useRef(false);\n\n const setRootRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (\n rootRef.current !== null &&\n node === null &&\n heightTransitionPendingRef.current\n ) {\n heightTransitionPendingRef.current = false;\n onHeightTransitionEnd?.();\n }\n rootRef.current = node;\n },\n [onHeightTransitionEnd]\n );\n\n const setRevealHeight = useCallback((nextHeight: string) => {\n heightRef.current = nextHeight;\n setHeight(nextHeight);\n }, []);\n\n useLayoutEffect(() => {\n if (!expanded || mounted) {\n return undefined;\n }\n if (preMountOnIdle) {\n setMounted(true);\n return undefined;\n }\n let mountFrameStarted = false;\n const animationFrame = requestAnimationFrame(() => {\n mountFrameStarted = true;\n setMounted(true);\n });\n return () => {\n cancelAnimationFrame(animationFrame);\n if (!mountFrameStarted) {\n onHeightTransitionEnd?.();\n }\n };\n }, [expanded, mounted, onHeightTransitionEnd, preMountOnIdle]);\n\n useEffect(() => {\n if (!preMountOnIdle || mounted || expanded) {\n return undefined;\n }\n\n const mountCollapsedContent = () => setMounted(true);\n if (\"requestIdleCallback\" in window) {\n const idleCallbackId = window.requestIdleCallback(mountCollapsedContent, {\n timeout: 600\n });\n return () => window.cancelIdleCallback(idleCallbackId);\n }\n\n const timeoutId = globalThis.setTimeout(mountCollapsedContent, 120);\n return () => globalThis.clearTimeout(timeoutId);\n }, [expanded, mounted, preMountOnIdle]);\n\n useLayoutEffect(() => {\n if (!mounted) {\n return undefined;\n }\n\n const root = rootRef.current;\n if (!root) {\n return undefined;\n }\n\n const wasExpanded = previousExpandedRef.current;\n previousExpandedRef.current = expanded;\n\n if (expanded) {\n if (wasExpanded && visible && height === \"auto\") {\n return undefined;\n }\n heightTransitionPendingRef.current = true;\n setVisible(false);\n setRevealHeight(\"0px\");\n const animationFrame = requestAnimationFrame(() => {\n measuredHeightRef.current = root.scrollHeight;\n setVisible(true);\n setRevealHeight(`${measuredHeightRef.current}px`);\n });\n return () => cancelAnimationFrame(animationFrame);\n }\n\n if (!wasExpanded) {\n heightTransitionPendingRef.current = false;\n setVisible(false);\n setRevealHeight(\"0px\");\n return undefined;\n }\n\n const renderedHeight = root.getBoundingClientRect().height;\n const cachedHeight = measuredHeightRef.current;\n const measuredHeight =\n renderedHeight > 0 ? renderedHeight : (cachedHeight ?? root.scrollHeight);\n measuredHeightRef.current = measuredHeight;\n heightTransitionPendingRef.current = true;\n setRevealHeight(`${measuredHeight}px`);\n setVisible(false);\n const animationFrame = requestAnimationFrame(() => {\n setRevealHeight(\"0px\");\n });\n return () => cancelAnimationFrame(animationFrame);\n }, [expanded, mounted]);\n\n useLayoutEffect(() => {\n if (!mounted || !expanded || !visible) {\n return undefined;\n }\n\n const root = rootRef.current;\n const inner = innerRef.current;\n if (!root || !inner || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n let animationFrame: number | null = null;\n const resizeObserver = new ResizeObserver((entries) => {\n const innerScrollHeight = inner.scrollHeight;\n const nextHeight = Math.ceil(\n innerScrollHeight > 0\n ? innerScrollHeight\n : (entries[0]?.contentRect.height ?? 0)\n );\n const previousHeight = measuredHeightRef.current;\n if (!nextHeight || previousHeight === nextHeight) {\n return;\n }\n\n measuredHeightRef.current = nextHeight;\n if (heightRef.current === \"auto\") {\n return;\n }\n setRevealHeight(\n `${previousHeight ?? root.getBoundingClientRect().height}px`\n );\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n animationFrame = requestAnimationFrame(() => {\n setRevealHeight(`${nextHeight}px`);\n });\n });\n\n resizeObserver.observe(inner);\n return () => {\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n resizeObserver.disconnect();\n };\n }, [expanded, mounted, setRevealHeight, visible]);\n\n if (!mounted) {\n return null;\n }\n\n const handleTransitionEnd = (event: TransitionEvent<HTMLDivElement>) => {\n if (\n event.target !== event.currentTarget ||\n (event.propertyName ? event.propertyName !== \"height\" : false)\n ) {\n return;\n }\n if (visible) {\n setRevealHeight(\"auto\");\n } else if (!expanded && !preMountOnIdle) {\n setMounted(false);\n }\n if (heightTransitionPendingRef.current) {\n heightTransitionPendingRef.current = false;\n onHeightTransitionEnd?.();\n }\n };\n\n const rootStyle: CSSProperties = { height };\n\n return (\n <div\n ref={setRootRef}\n className={[\"agent-collapsible-reveal\", className ?? \"\"]\n .filter(Boolean)\n .join(\" \")}\n data-expanded={\n preMountOnIdle && expanded ? \"true\" : visible ? \"true\" : \"false\"\n }\n aria-hidden={visible ? undefined : true}\n style={rootStyle}\n onTransitionEnd={handleTransitionEnd}\n >\n <div\n ref={innerRef}\n className={[\"agent-collapsible-reveal__inner\", innerClassName ?? \"\"]\n .filter(Boolean)\n .join(\" \")}\n >\n {children}\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Button as UISystemButton, buttonVariants } from \"@tutti-os/ui-system\";\nimport { cn } from \"../../lib/utils\";\n\ntype UISystemButtonProps = React.ComponentProps<typeof UISystemButton>;\ntype LegacyButtonSize =\n | UISystemButtonProps[\"size\"]\n | \"mini\"\n | \"md\"\n | \"max\"\n | \"iconClose\";\n\nexport interface ButtonProps extends Omit<UISystemButtonProps, \"size\"> {\n size?: LegacyButtonSize;\n}\n\nfunction resolveButtonSize(\n size: LegacyButtonSize | undefined\n): UISystemButtonProps[\"size\"] {\n switch (size) {\n case \"mini\":\n return \"xs\";\n case \"md\":\n return \"default\";\n case \"max\":\n return \"lg\";\n case \"iconClose\":\n return \"icon-sm\";\n default:\n return size;\n }\n}\n\nfunction resolveButtonClassName(\n size: LegacyButtonSize | undefined,\n className: string | undefined\n): string | undefined {\n if (size !== \"iconClose\") {\n return className;\n }\n\n return cn(\n \"h-[28px] w-[28px] min-h-[28px] min-w-[28px] shrink-0 rounded-[4px] p-0 [&_svg]:size-[14px]\",\n className\n );\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, size, ...props }, ref) => (\n <UISystemButton\n ref={ref}\n className={resolveButtonClassName(size, className)}\n size={resolveButtonSize(size)}\n {...props}\n />\n )\n);\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import type { JSX } from \"react\";\nimport { Button } from \"../../../app/renderer/components/ui/button\";\nimport { translate } from \"../../../i18n/index\";\nimport { workspaceAgentProviderLabel } from \"../../workspaceAgentProviderLabel\";\nimport { useOpenAgentEnvPanel } from \"../../agentEnv\";\nimport {\n classifyRecoverableAgentMessage,\n resolveAgentErrorPresentation\n} from \"../../agentEnv/agentErrorPresentation\";\nimport { useAgentCommercePresentation } from \"../../commerce/AgentCommercePresentationContext\";\nimport type { AgentMessageContentVM } from \"../contracts/agentMessageRowVM\";\n\n// All error banners use the light-red danger surface. Yellow/warning surfaces\n// are banned for notice boxes — see \"Badges And Status\" in\n// docs/conventions/desktop-visual-language.md.\nconst ERROR_BANNER_CLASS_NAME =\n \"border-[var(--on-danger-hover)] bg-[var(--on-danger)] text-[var(--state-danger)]\";\n\n// Builds a synthetic visibleError from a plain message whose text and terminal\n// status identify a recognizable environment failure.\nexport function recoverVisibleErrorFromMessage(\n message: AgentMessageContentVM,\n provider: string | null | undefined\n): AgentMessageContentVM | null {\n const code = classifyRecoverableAgentMessage({\n body: message.body,\n statusKind: message.statusKind\n });\n if (!code) {\n return null;\n }\n return {\n ...message,\n visibleError: {\n code,\n phase: null,\n provider: provider ?? null,\n detail: message.body,\n retryable: null\n }\n };\n}\n\nexport function AgentVisibleErrorMessage({\n message,\n onExternalLink\n}: {\n message: AgentMessageContentVM;\n onAuthLogin?: (provider?: string | null) => void;\n onExternalLink?: (href: string) => void;\n}): JSX.Element {\n \"use memo\";\n const openAgentEnvPanel = useOpenAgentEnvPanel();\n const commercePresentation = useAgentCommercePresentation();\n const error = message.visibleError;\n\n // One card for every run-failure code. The presentation (keyed on the codes\n // the daemon actually emits — see agentErrorPresentation) supplies a granular,\n // provider-aware message and, when the failure is something the env wizard can\n // detect or repair, a single deep-linking call-to-action. Transient/server-side\n // failures resolve to no focus, so no (misleading) wizard button is shown.\n const providerLabel = workspaceAgentProviderLabel(\n error?.provider ?? \"unknown\"\n );\n const presentation = resolveAgentErrorPresentation(\n error?.code,\n commercePresentation\n );\n const headline = presentation?.messageKey\n ? translate(presentation.messageKey, { provider: providerLabel })\n : visibleErrorTitle(message);\n const focus = presentation?.focus ?? null;\n const actionKey = presentation?.actionKey ?? null;\n const externalUrl = presentation?.externalUrl ?? null;\n const hint = visibleErrorHint(message);\n // Account limits are status notices, not process crashes. Provider payloads\n // stay in the canonical model and diagnostics; the product card never renders\n // raw upstream text.\n const isPlanOrQuotaLimit =\n error?.code === \"quota_or_rate_limit\" ||\n error?.code === \"insufficient_credits\";\n return (\n <section\n role={isPlanOrQuotaLimit ? \"status\" : \"alert\"}\n className={`box-border w-full min-w-0 rounded-[8px] border p-3 text-[13px] leading-5 text-[var(--text-primary)] ${ERROR_BANNER_CLASS_NAME}`}\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-[var(--text-primary)]\">\n {headline}\n </div>\n {hint ? (\n <div className=\"mt-1 text-[11px] text-[var(--text-secondary)]\">\n {hint}\n </div>\n ) : null}\n </div>\n {actionKey &&\n ((focus && openAgentEnvPanel) || (externalUrl && onExternalLink)) ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-0.5 shrink-0\"\n onClick={() => {\n if (externalUrl) {\n onExternalLink?.(externalUrl);\n return;\n }\n if (focus && openAgentEnvPanel) {\n openAgentEnvPanel({\n provider: error?.provider ?? null,\n focus\n });\n }\n }}\n >\n {translate(actionKey)}\n </Button>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction visibleErrorTitle(message: AgentMessageContentVM): string {\n const error = message.visibleError;\n const provider = workspaceAgentProviderLabel(error?.provider ?? \"unknown\");\n switch (error?.code) {\n case \"auth_required\":\n return translate(\"agentHost.agentGui.visibleErrorAuthRequired\", {\n provider\n });\n case \"request_timed_out\":\n return translate(\"agentHost.agentGui.visibleErrorRequestTimedOut\", {\n provider\n });\n case \"runtime_unavailable\":\n return translate(\"agentHost.agentGui.visibleErrorRuntimeUnavailable\", {\n provider\n });\n case \"quota_or_rate_limit\":\n return translate(\"agentHost.agentGui.visibleErrorQuotaOrRateLimit\", {\n provider\n });\n default:\n if (error?.phase === \"start\") {\n return translate(\"agentHost.agentGui.visibleErrorStartFailed\", {\n provider\n });\n }\n return translate(\"agentHost.agentGui.visibleErrorRequestFailed\", {\n provider\n });\n }\n}\n\nfunction visibleErrorHint(message: AgentMessageContentVM): string | null {\n const error = message.visibleError;\n if (error?.code !== \"auth_required\") {\n return null;\n }\n return translate(\n \"agentHost.agentGui.visibleErrorAuthRequiredLocalAgentHint\",\n {\n provider: workspaceAgentProviderLabel(error.provider ?? \"unknown\")\n }\n );\n}\n","import { useState, type JSX } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { BrainIcon } from \"../app/renderer/components/icons/BrainIcon\";\nimport { translate } from \"../i18n/index\";\nimport { CollapsibleReveal } from \"./agentConversation/components/CollapsibleReveal\";\nimport { AgentMessageMarkdown } from \"./AgentMessageMarkdown\";\nimport type { WorkspaceAgentSessionDetailThinking } from \"./workspaceAgentSessionDetailViewModel\";\nimport { ToolActivityKindIcon } from \"./toolActivityKindIcons\";\n\ninterface WorkspaceAgentSessionThinkingDisclosureProps {\n thinking: WorkspaceAgentSessionDetailThinking;\n label: string;\n onLinkClick?: (href: string) => void;\n previewMode?: boolean;\n}\n\nexport function WorkspaceAgentSessionThinkingDisclosure({\n thinking,\n label,\n onLinkClick,\n previewMode = false\n}: WorkspaceAgentSessionThinkingDisclosureProps): JSX.Element {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n const isActive =\n thinking.statusKind === \"working\" || thinking.statusKind === \"waiting\";\n const statusLabel =\n thinking.statusKind === \"working\"\n ? null\n : thinkingStatusLabel(thinking.statusKind);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-thinking-disclosure flex w-full min-w-0 flex-col items-start gap-[7px]\">\n <button\n type=\"button\"\n className={[\n \"group/thinking-disclosure inline-flex w-fit max-w-full min-w-0 items-center gap-1.5 border-0 bg-transparent p-0 text-left font-[var(--tsh-font-ui)] text-[13px] leading-[1.3] font-normal text-[var(--text-secondary)] transition-colors duration-150 hover:text-[var(--tsh-shell-body)]\",\n isActive ? \"tsh-inline-scanlight-group\" : \"\"\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-expanded={expanded}\n data-active={isActive ? \"true\" : undefined}\n onClick={() => {\n setExpanded((value) => !value);\n }}\n >\n {isActive ? (\n <BrainIcon\n size={16}\n active\n aria-hidden=\"true\"\n className=\"tsh-inline-scanlight-icon shrink-0 opacity-[0.86]\"\n />\n ) : (\n <ToolActivityKindIcon\n kind=\"thinking\"\n width={16}\n height={16}\n className=\"tsh-inline-scanlight-icon shrink-0 opacity-[0.72]\"\n />\n )}\n <span className={isActive ? \"tsh-inline-scanlight-line\" : undefined}>\n <span className=\"font-semibold\">{label}</span>\n {statusLabel ? (\n <span className=\"ml-1.5\">\n {formatInlineStatusLabel(statusLabel)}\n </span>\n ) : null}\n {isActive ? <LoadingEllipsis /> : null}\n </span>\n {expanded ? (\n <ChevronDown\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"shrink-0 text-[var(--text-tertiary)] opacity-0 transition-opacity duration-150 group-hover/thinking-disclosure:opacity-100 group-focus-visible/thinking-disclosure:opacity-100\"\n />\n ) : (\n <ChevronRight\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"shrink-0 text-[var(--text-tertiary)] opacity-0 transition-opacity duration-150 group-hover/thinking-disclosure:opacity-100 group-focus-visible/thinking-disclosure:opacity-100\"\n />\n )}\n </button>\n\n <CollapsibleReveal expanded={expanded} className=\"w-full\">\n <div className=\"box-border w-full min-w-0 rounded-[6px] bg-[var(--transparency-block)] p-3\">\n <AgentMessageMarkdown\n content={thinking.body}\n onLinkClick={onLinkClick}\n className=\"text-[11px] text-[var(--text-secondary)] opacity-92 [&_p]:mb-1\"\n enableImageZoom\n previewMode={previewMode}\n />\n </div>\n </CollapsibleReveal>\n </div>\n );\n}\n\nfunction LoadingEllipsis(): JSX.Element {\n \"use memo\";\n return (\n <span className=\"tsh-inline-loading-ellipsis\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n );\n}\n\nfunction thinkingStatusLabel(\n statusKind: WorkspaceAgentSessionDetailThinking[\"statusKind\"]\n): string | null {\n switch (statusKind) {\n case \"working\":\n return translate(\"agentHost.agentTool.statusWorking\");\n case \"completed\":\n return translate(\"agentHost.agentTool.statusCompleted\");\n case \"failed\":\n return translate(\"agentHost.agentTool.statusFailed\");\n case \"canceled\":\n return translate(\"agentHost.agentTool.statusCanceled\");\n case \"waiting\":\n return translate(\"agentHost.agentTool.statusWaiting\");\n default:\n return null;\n }\n}\n\nfunction formatInlineStatusLabel(label: string): string {\n return /^[A-Z][a-z]+$/.test(label) ? label.toLowerCase() : label;\n}\n","\"use client\";\n\nimport type { HTMLAttributes, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef\n} from \"react\";\nimport {\n motion,\n useAnimation,\n useReducedMotion,\n type Transition,\n type Variants\n} from \"framer-motion\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface BrainIconHandle {\n startAnimation: () => void;\n stopAnimation: () => void;\n}\n\ninterface BrainIconProps extends HTMLAttributes<HTMLDivElement> {\n size?: number;\n active?: boolean;\n}\n\nconst brainTransition: Transition = {\n duration: 1.4,\n repeat: Number.POSITIVE_INFINITY,\n repeatType: \"mirror\" as const,\n ease: \"easeInOut\"\n};\n\nconst BRAIN_STEM_VARIANTS: Variants = {\n normal: { pathLength: 1, pathOffset: 0 },\n animate: {\n pathLength: [1, 0.4, 1],\n pathOffset: [0, 0.25, 0],\n transition: brainTransition\n }\n};\n\nconst BRAIN_SIDE_VARIANTS: Variants = {\n normal: { pathLength: 1, pathOffset: 0 },\n animate: {\n pathLength: [1, 0.5, 1],\n pathOffset: [0, 0.25, 0],\n transition: brainTransition\n }\n};\n\nconst BRAIN_TOP_ARC_VARIANTS: Variants = {\n normal: { pathLength: 1, pathOffset: 0 },\n animate: {\n pathLength: [1, 0.8, 1],\n pathOffset: [0, 0.07, 0],\n transition: brainTransition\n }\n};\n\nconst BRAIN_LOWER_ARC_VARIANTS: Variants = {\n normal: { pathLength: 1, pathOffset: 0 },\n animate: {\n pathLength: [1, 0.8, 1],\n pathOffset: [0, 0.14, 0],\n transition: brainTransition\n }\n};\n\nconst BrainIcon = forwardRef<BrainIconHandle, BrainIconProps>(\n (\n {\n active = false,\n onMouseEnter,\n onMouseLeave,\n className,\n size = 28,\n ...props\n },\n ref\n ) => {\n const controls = useAnimation();\n const reduceMotion = useReducedMotion();\n const isControlledRef = useRef(false);\n\n const startAnimation = useCallback(() => {\n if (reduceMotion) {\n return;\n }\n void controls.start(\"animate\");\n }, [controls, reduceMotion]);\n\n const stopAnimation = useCallback(() => {\n void controls.start(\"normal\");\n }, [controls]);\n\n useImperativeHandle(ref, () => {\n isControlledRef.current = true;\n\n return {\n startAnimation,\n stopAnimation\n };\n });\n\n useEffect(() => {\n if (active) {\n startAnimation();\n return;\n }\n stopAnimation();\n }, [active, startAnimation, stopAnimation]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseEnter?.(event);\n } else {\n startAnimation();\n }\n },\n [onMouseEnter, startAnimation]\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseLeave?.(event);\n } else {\n stopAnimation();\n }\n },\n [onMouseLeave, stopAnimation]\n );\n\n return (\n <div\n className={cn(\"inline-flex items-center justify-center\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <motion.svg\n animate={controls}\n fill=\"none\"\n height={size}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n variants={{\n normal: {\n scale: 1,\n strokeWidth: 2\n },\n animate: {\n scale: [1, 1.08, 1],\n strokeWidth: [2, 2.25, 2],\n transition: brainTransition\n }\n }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <motion.path\n animate={controls}\n d=\"M12 18V5\"\n variants={BRAIN_STEM_VARIANTS}\n />\n <motion.path\n animate={controls}\n d=\"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4\"\n variants={BRAIN_SIDE_VARIANTS}\n />\n\n <motion.path\n animate={controls}\n d=\"M12 5A3 3 0 1 1 17.598 6.5\"\n variants={BRAIN_TOP_ARC_VARIANTS}\n />\n <motion.path\n animate={controls}\n d=\"M12 5A3 3 0 1 0 6.402 6.5\"\n variants={BRAIN_TOP_ARC_VARIANTS}\n />\n\n <path d=\"M17.997 5.125a4 4 0 0 1 2.526 5.77\" />\n\n <motion.path\n animate={controls}\n d=\"M18 18a4 4 0 0 0 2-7.464\"\n variants={BRAIN_LOWER_ARC_VARIANTS}\n />\n\n <path d=\"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517\" />\n\n <motion.path\n animate={controls}\n d=\"M6 18a4 4 0 0 1-2-7.464\"\n variants={BRAIN_LOWER_ARC_VARIANTS}\n />\n <path d=\"M6.003 5.125a4 4 0 0 0-2.526 5.77\" />\n </motion.svg>\n </div>\n );\n }\n);\n\nBrainIcon.displayName = \"BrainIcon\";\n\nexport { BrainIcon };\n","/**\n * 工具类型图标内联为 SVG,填色 `currentColor` 以随 `text-secondary` 等主题字色。\n *\n * 与 `TOOL_ACTIVITY_KIND_LABELS` 的映射(9 枚图标对应 13 类 activity,部分共用):\n * - 产品文档:read_file、list_files\n * - 画笔:write_file、edit_file\n * - 网站内容抓取:search_files\n * - 构建:run_command、apply_patch\n * - 联网:web_search\n * - 任务:update_todos\n * - 能力:delegate_agent;未知工具(展示「使用工具」)亦用能力\n * - 思考:thinking\n * - chat:responding、notification\n * - 图片生成:image_generation / Image Generation 等生成图片类工具名\n */\nimport type { JSX, SVGProps } from \"react\";\nimport type { ToolActivityKind } from \"./workspaceAgentToolCallLabels\";\n\ntype GlyphProps = SVGProps<SVGSVGElement>;\n\n/** Property 1=产品文档 */\nfunction IconProductDoc(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M14.04 1.00098C14.4743 1.00553 14.9042 1.09245 15.3057 1.25879C15.7193 1.43022 16.0949 1.68198 16.4111 1.99902L19.9971 5.58496L20.1133 5.70605C20.3773 5.99585 20.5896 6.32951 20.7402 6.69238C20.9122 7.1067 21.0005 7.55143 21 8V20C21 20.7957 20.6837 21.5585 20.1211 22.1211C19.5585 22.6837 18.7957 23 18 23H6C5.20435 23 4.44152 22.6837 3.87891 22.1211C3.3163 21.5585 3 20.7957 3 20V4C3 3.20435 3.3163 2.44151 3.87891 1.87891C4.44152 1.3163 5.20435 1 6 1H14C14.0134 1 14.0268 1.00045 14.04 1.00098ZM6 3C5.73478 3 5.4805 3.10543 5.29297 3.29297C5.10543 3.4805 5 3.73478 5 4V20C5 20.2652 5.10543 20.5195 5.29297 20.707C5.48051 20.8946 5.73478 21 6 21H18C18.2652 21 18.5195 20.8946 18.707 20.707C18.8946 20.5195 19 20.2652 19 20V9H15C14.4696 9 13.961 8.78913 13.5859 8.41406C13.2109 8.03899 13 7.53043 13 7V3H6ZM16 16C16.5523 16 17 16.4477 17 17C17 17.5523 16.5523 18 16 18H8C7.44772 18 7 17.5523 7 17C7 16.4477 7.44772 16 8 16H16ZM16 12C16.5523 12 17 12.4477 17 13C17 13.5523 16.5523 14 16 14H8C7.44772 14 7 13.5523 7 13C7 12.4477 7.44772 12 8 12H16ZM10 8C10.5523 8 11 8.44772 11 9C11 9.55229 10.5523 10 10 10H8C7.44772 10 7 9.55229 7 9C7 8.44772 7.44772 8 8 8H10ZM15 7H18.584L15 3.41602V7Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=构建 */\nfunction IconBuild(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M12.5166 2C14.3722 2.0005 16.1516 2.73783 17.4639 4.0498L19.1211 5.70703L19.3203 5.92676C19.7578 6.46048 19.9999 7.13198 20 7.82812V8.17188L20.0049 8.27051C20.0276 8.49945 20.1288 8.71482 20.293 8.87891L21.5303 10.1162C21.9083 9.9151 22.3885 9.97443 22.707 10.293C23.0976 10.6835 23.0976 11.3165 22.707 11.707L18.707 15.707C18.3165 16.0976 17.6835 16.0976 17.293 15.707C16.9744 15.3885 16.9151 14.9083 17.1162 14.5303L15.8789 13.293C15.7431 13.1571 15.5715 13.0672 15.3867 13.0264L6.33398 22.0801C6.0442 22.3699 5.69992 22.5999 5.32129 22.7568C4.94266 22.9137 4.53679 22.995 4.12695 22.9951C3.29924 22.9952 2.50538 22.6661 1.91992 22.0811C1.3344 21.4957 1.00502 20.701 1.00488 19.873C1.00487 19.0453 1.33373 18.2514 1.91895 17.666L11 8.58496V8.48535C10.9999 7.1596 10.4734 5.88777 9.53613 4.9502L8.29297 3.70703C8.00697 3.42103 7.92139 2.99086 8.07617 2.61719C8.23098 2.24359 8.59558 2 9 2H12.5166ZM3.33301 19.0801C3.12284 19.2904 3.00487 19.5757 3.00488 19.873C3.00493 20.1705 3.12359 20.4557 3.33398 20.666C3.54437 20.8763 3.82951 20.9952 4.12695 20.9951C4.27409 20.9951 4.41972 20.9655 4.55566 20.9092C4.69174 20.8528 4.81578 20.7702 4.91992 20.666L13.0859 12.5L11.499 10.9131L3.33301 19.0801ZM11.3721 4C12.4187 5.2535 12.9999 6.83919 13 8.48535V9.58594L14.4141 11H15.1719C15.9674 11.0002 16.7305 11.3164 17.293 11.8789L18.5 13.0859L20.0859 11.5L18.8789 10.293C18.3164 9.73051 18.0002 8.96738 18 8.17188V7.82812C17.9999 7.56296 17.8946 7.30857 17.707 7.12109L16.0498 5.46387C15.1124 4.52677 13.8411 4.00028 12.5156 4H11.3721Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=画笔 */\nfunction IconBrush(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M19.1816 1C20.1944 1.00019 21.1658 1.40292 21.8818 2.11914C22.5976 2.83537 23.0001 3.8067 23 4.81934C22.9998 5.7688 22.6461 6.68243 22.0117 7.38281L21.8808 7.51953L19.79 9.60937C19.7641 9.6428 19.7377 9.67636 19.707 9.70703C19.6763 9.7377 19.6428 9.76419 19.6093 9.79004L8.53414 20.8682L8.53317 20.8691C8.1855 21.2156 7.75766 21.4724 7.28805 21.6152H7.28707L2.93454 22.9355L2.93161 22.9365C2.67255 23.0143 2.39705 23.02 2.13473 22.9541C1.87235 22.8881 1.63194 22.7526 1.44039 22.5615C1.24885 22.3703 1.11234 22.1296 1.04586 21.8672C0.979582 21.605 0.985166 21.3294 1.06246 21.0703L1.06442 21.0664L2.38473 16.7139L2.38571 16.7109C2.52986 16.2409 2.78761 15.813 3.13571 15.4658L14.2089 4.38867C14.2346 4.35552 14.2625 4.32341 14.2929 4.29297C14.3234 4.26252 14.3555 4.23468 14.3886 4.20898L16.4804 2.11816C17.1967 1.40209 18.1688 0.999896 19.1816 1ZM4.54879 16.8818L4.54782 16.8828C4.43196 16.9985 4.34581 17.1413 4.29782 17.2978L3.24899 20.749L6.70602 19.7012L6.82028 19.6592C6.93185 19.6097 7.0341 19.5397 7.12106 19.4531L17.5791 8.99316L15.0068 6.4209L4.54879 16.8818ZM19.1816 3C18.6995 2.99996 18.2366 3.19147 17.8955 3.53223L16.4209 5.00683L18.9931 7.5791L20.4668 6.10547L20.5879 5.97168C20.8529 5.64823 20.9998 5.24116 21 4.81934C21 4.33701 20.8077 3.87434 20.4668 3.5332C20.1258 3.19221 19.6638 3.00019 19.1816 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=联网 */\nfunction IconNetwork(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12C1 5.92487 5.92487 1 12 1ZM3.05664 13C3.46745 16.7156 6.13893 19.7477 9.66602 20.6924C8.12455 18.4164 7.21164 15.7616 7.0332 13H3.05664ZM16.9668 13C16.7883 15.7618 15.8747 18.4163 14.333 20.6924C17.8605 19.748 20.5325 16.7159 20.9434 13H16.9668ZM9.04004 13C9.24354 15.738 10.2754 18.3489 12 20.4834C13.7246 18.3489 14.7565 15.738 14.96 13H9.04004ZM9.66602 3.30664C6.13881 4.25125 3.46746 7.28435 3.05664 11H7.0332C7.21166 8.23812 8.12427 5.58281 9.66602 3.30664ZM12 3.51562C10.2751 5.65021 9.24348 8.26166 9.04004 11H14.96C14.7565 8.26166 13.7249 5.65021 12 3.51562ZM14.333 3.30664C15.8749 5.58292 16.7883 8.23793 16.9668 11H20.9434C20.5325 7.28403 17.8607 4.25097 14.333 3.30664Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=能力 */\nfunction IconCapability(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M9.9994 1C11.0602 1 12.0784 1.42185 12.8285 2.17188C13.5784 2.92198 13.9994 3.93932 13.9994 5C13.9994 5.79565 13.6831 6.55849 13.1205 7.12109C12.5579 7.68352 11.7949 8 10.9994 8C10.7316 7.99997 10.4793 7.97795 10.2416 7.93555C10.1632 8.06833 10.0871 8.26075 10.0209 8.53906C9.88898 9.09327 9.84537 9.79653 9.81483 10.6309C9.79404 11.1989 9.77711 11.8293 9.72987 12.4463C9.97013 12.3481 10.2169 12.2638 10.4691 12.1973C10.9061 12.0821 11.3533 12.0166 11.8021 12.002C12.3709 11.0149 13.211 10.2051 14.2299 9.6748C15.4546 9.03749 16.8622 8.84264 18.2142 9.12207C19.5664 9.40164 20.781 10.1391 21.6527 11.21C22.5243 12.2808 23 13.6193 22.9994 15C22.9994 19.6358 18.3055 23 12.9994 23C10.8986 23 8.78485 22.7894 6.89588 22.3604C5.0205 21.9343 3.29732 21.2773 2.03358 20.3418L2.0326 20.3408C1.29831 19.7958 0.992816 18.9434 1.00917 18.1553C1.06353 15.4363 1.21559 11.2582 2.32655 7.74219C2.88372 5.97897 3.7061 4.30115 4.94764 3.05469C6.21544 1.78207 7.88237 1.00014 9.9994 1ZM9.9994 3C8.43065 3.00014 7.26908 3.55883 6.36463 4.4668C5.4339 5.40127 4.73903 6.74579 4.23378 8.34473C3.34681 11.1518 3.11601 14.4956 3.03553 17.1191L3.00819 18.1963C3.00256 18.4674 3.107 18.6472 3.22401 18.7344L3.4076 18.8652C4.35656 19.5118 5.71073 20.0394 7.33827 20.4092C9.06058 20.8004 11.0238 21 12.9994 21C17.5463 21 20.791 18.2751 20.9896 15.29L20.9994 15C20.9998 14.0795 20.683 13.1866 20.1019 12.4727C19.5209 11.7589 18.7112 11.2665 17.8099 11.0801C16.9085 10.8938 15.9692 11.0243 15.1527 11.4492C14.7154 11.6769 14.3294 11.9838 14.0072 12.3477C14.5766 12.55 15.115 12.8355 15.601 13.2002C16.0421 13.5316 16.1311 14.1581 15.8002 14.5996C15.4687 15.0413 14.8415 15.1312 14.3998 14.7998C13.9171 14.4376 13.3582 14.189 12.766 14.0732C12.6241 14.0455 12.4807 14.0259 12.3373 14.0137C12.323 14.0126 12.3087 14.0114 12.2943 14.0098C11.8533 13.977 11.4086 14.0176 10.9789 14.1309C10.3955 14.2848 9.85404 14.5693 9.39588 14.9619C9.18332 15.1441 8.99158 15.3483 8.82264 15.5693C8.81507 15.5797 8.80788 15.5903 8.80018 15.6006C8.79478 15.6078 8.78816 15.6141 8.7826 15.6211C8.60462 15.862 8.45397 16.1231 8.33338 16.3994C8.11263 16.9055 7.52309 17.1365 7.01698 16.916C6.51076 16.6952 6.27858 16.1058 6.4994 15.5996C6.68858 15.166 6.92793 14.7579 7.21131 14.3828C7.42382 14.0896 7.58136 13.6141 7.67518 12.9092C7.76955 12.2 7.78452 11.4136 7.81581 10.5586C7.84563 9.7437 7.89048 8.84999 8.0746 8.07617C8.16126 7.71213 8.28971 7.32979 8.48866 6.97559C8.3626 6.8338 8.25388 6.68808 8.16053 6.54395C7.86057 6.08046 7.99311 5.46035 8.45643 5.16016C8.91985 4.86043 9.53908 4.99291 9.83924 5.45605C9.96076 5.64373 10.0773 5.7612 10.2152 5.83984C10.3527 5.91812 10.5849 5.99992 10.9994 6C11.2645 6 11.5189 5.89438 11.7064 5.70703C11.894 5.51949 11.9994 5.26522 11.9994 5C11.9994 4.46957 11.7885 3.96101 11.4135 3.58594C11.0384 3.21105 10.5297 3 9.9994 3Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=任务 */\nfunction IconTask(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M8.29297 14.793C8.68349 14.4025 9.31651 14.4025 9.70703 14.793C10.0976 15.1835 10.0976 15.8166 9.70703 16.2071L5.70703 20.2071C5.31651 20.5976 4.68349 20.5976 4.29297 20.2071L2.29297 18.2071C1.90244 17.8166 1.90244 17.1836 2.29297 16.793C2.68349 16.4025 3.31651 16.4025 3.70703 16.793L5 18.086L8.29297 14.793ZM21 18.0001C21.5523 18.0001 22 18.4478 22 19.0001C22 19.5524 21.5523 20.0001 21 20.0001H13C12.4477 20.0001 12 19.5524 12 19.0001C12 18.4478 12.4477 18.0001 13 18.0001H21ZM21 11C21.5523 11 22 11.4478 22 12C22 12.5523 21.5523 13 21 13H13C12.4477 13 12 12.5523 12 12C12 11.4478 12.4477 11 13 11H21ZM8 3.5C9.10457 3.5 10 4.39543 10 5.50001V9.50003C10 10.6046 9.10457 11.5 8 11.5H4C2.89543 11.5 2 10.6046 2 9.50003V5.50001C2 4.39543 2.89543 3.5 4 3.5H8ZM4 9.50003H8V5.50001H4V9.50003ZM21 4C21.5523 4 22 4.44772 22 5.00001C22 5.55229 21.5523 6.00001 21 6.00001H13C12.4477 6.00001 12 5.55229 12 5.00001C12 4.44772 12.4477 4 13 4H21Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=思考 */\nfunction IconThinking(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M14.2196 1.07688C14.8213 0.957197 15.4424 0.977694 16.035 1.13645C16.6276 1.29523 17.1763 1.5884 17.6375 1.99289C18.0986 2.39735 18.4604 2.90282 18.6952 3.46945C18.8188 3.76806 18.9045 4.07981 18.953 4.39719C19.4186 4.59467 19.8537 4.86066 20.2411 5.19016C20.8188 5.68166 21.2767 6.29905 21.5809 6.99387C21.885 7.6887 22.0276 8.44402 21.9969 9.20188C21.9767 9.69961 21.8801 10.1897 21.7157 10.657C22.0929 11.0764 22.4002 11.5585 22.619 12.0866C23.0401 13.1034 23.1137 14.2306 22.8289 15.2937C22.5441 16.3567 21.9169 17.2965 21.0438 17.9665C21.0288 17.978 21.013 17.9884 20.9979 17.9997C20.9973 18.4648 20.9337 18.9287 20.8045 19.3777C20.6156 20.0344 20.2945 20.646 19.8602 21.1736C19.4258 21.7011 18.8873 22.1344 18.2791 22.446C17.6712 22.7574 17.0057 22.9408 16.3241 22.9851C15.6421 23.0293 14.9577 22.9332 14.3143 22.7029C13.6711 22.4725 13.0816 22.1131 12.5828 21.6462C12.3689 21.4459 12.1747 21.2263 11.9998 20.9929C11.825 21.2262 11.6308 21.4459 11.4168 21.6462C10.918 22.1131 10.3286 22.4725 9.68539 22.7029C9.042 22.9332 8.35756 23.0293 7.67562 22.9851C6.99397 22.9408 6.32852 22.7574 5.72054 22.446C5.11231 22.1344 4.57383 21.7012 4.13949 21.1736C3.70518 20.6459 3.38408 20.0344 3.19515 19.3777C3.06602 18.9287 3.00239 18.4648 3.00179 17.9997C2.98677 17.9885 2.9708 17.978 2.95589 17.9665C2.08287 17.2965 1.4546 16.3567 1.16976 15.2937C0.885081 14.2307 0.959612 13.1033 1.3807 12.0866C1.59937 11.5587 1.90602 11.0763 2.28304 10.657C2.1187 10.1898 2.023 9.69947 2.00277 9.20188C1.97203 8.44402 2.11464 7.68869 2.41879 6.99387C2.723 6.29902 3.1809 5.68168 3.75863 5.19016C4.14595 4.86066 4.58112 4.59469 5.04671 4.39719C5.09514 4.07979 5.18087 3.76807 5.30453 3.46945C5.53925 2.90278 5.90106 2.39737 6.36214 1.99289C6.82342 1.58835 7.37206 1.29526 7.96468 1.13645C8.55726 0.977667 9.17842 0.957222 9.78011 1.07688C10.3818 1.19657 10.9487 1.45244 11.4354 1.8259C11.6413 1.98391 11.8293 2.16269 11.9998 2.35617C12.1704 2.16264 12.3583 1.98395 12.5643 1.8259C13.051 1.4524 13.6178 1.19659 14.2196 1.07688ZM9.39046 3.03781C9.08963 2.978 8.77853 2.9887 8.48226 3.06809C8.18611 3.14746 7.91204 3.29371 7.68148 3.49582C7.45094 3.69801 7.26958 3.95083 7.15218 4.2341C7.03482 4.51747 6.98371 4.82453 7.00375 5.13059C7.02381 5.43655 7.11416 5.73416 7.26742 5.99973C7.54355 6.47794 7.38032 7.08972 6.90218 7.36594C6.42391 7.64207 5.81213 7.47799 5.53597 6.99973C5.4474 6.8463 5.37072 6.68703 5.30355 6.52414C5.21761 6.58295 5.13419 6.64582 5.05453 6.71359C4.70797 7.00847 4.43333 7.3788 4.25082 7.79563C4.06831 8.21252 3.98337 8.66611 4.00179 9.12082C4.00751 9.2611 4.02461 9.40046 4.04964 9.53781C4.37718 9.55443 4.68985 9.73089 4.86605 10.0359C5.14206 10.5141 4.97805 11.1259 4.49984 11.4021C3.92803 11.7323 3.48104 12.2422 3.22836 12.8523C2.9758 13.4622 2.93159 14.1384 3.10238 14.7761C3.27327 15.4139 3.6499 15.9776 4.17367 16.3796C4.6975 16.7816 5.33955 16.9996 5.99984 16.9997C6.55196 16.9998 6.99969 17.4476 6.99984 17.9997C6.99982 18.5519 6.55202 18.9996 5.99984 18.9997C5.71286 18.9997 5.42816 18.9739 5.14828 18.9255C5.26423 19.2812 5.44532 19.6127 5.68343 19.9021C5.94396 20.2185 6.26688 20.4788 6.63168 20.6657C6.99658 20.8527 7.39637 20.9634 7.8055 20.99C8.21465 21.0165 8.62555 20.9582 9.01156 20.82C9.39738 20.6818 9.75142 20.4663 10.0506 20.1863C10.3499 19.9061 10.5885 19.5671 10.7518 19.1911C10.8947 18.862 10.9773 18.5097 10.9959 18.1521L10.9998 17.9988V13.0798C10.4898 13.4758 9.90763 13.7763 9.28011 13.9597C8.75012 14.1144 8.1948 13.81 8.03988 13.28C7.88534 12.7501 8.18971 12.1947 8.71957 12.0398C9.37716 11.8475 9.95497 11.4472 10.3661 10.8991C10.7771 10.351 10.9994 9.68388 10.9998 8.99875V4.99973C10.9998 4.69303 10.9294 4.39004 10.7938 4.11496C10.6581 3.83995 10.4609 3.5995 10.2176 3.41281C9.97436 3.22619 9.69116 3.09768 9.39046 3.03781ZM15.5174 3.06809C15.2211 2.98873 14.91 2.97797 14.6092 3.03781C14.3085 3.09771 14.0253 3.22615 13.7821 3.41281C13.5388 3.59953 13.3416 3.83991 13.2059 4.11496C13.0703 4.39004 12.9999 4.69303 12.9998 4.99973V8.99875C13.0003 9.68382 13.2227 10.351 13.6336 10.8991C14.0447 11.4472 14.6226 11.8474 15.2801 12.0398C15.81 12.1947 16.1144 12.7501 15.9598 13.28C15.8049 13.81 15.2496 14.1144 14.7196 13.9597C14.0921 13.7762 13.5098 13.4759 12.9998 13.0798V17.9988L13.0037 18.1521C13.0224 18.5097 13.1049 18.862 13.2479 19.1911C13.4112 19.5671 13.6498 19.9061 13.9491 20.1863C14.2483 20.4664 14.6023 20.6818 14.9881 20.82C15.3741 20.9583 15.785 21.0165 16.1942 20.99C16.6033 20.9634 17.0031 20.8527 17.368 20.6657C17.7328 20.4788 18.0557 20.2185 18.3162 19.9021C18.5543 19.6128 18.7345 19.2811 18.8504 18.9255C18.5709 18.9738 18.2865 18.9997 17.9998 18.9997C17.4476 18.9996 16.9999 18.552 16.9998 17.9997C17 17.4476 17.4477 16.9998 17.9998 16.9997C18.6602 16.9997 19.3021 16.7816 19.826 16.3796C20.3498 15.9776 20.7264 15.4139 20.8973 14.7761C21.0681 14.1384 21.0239 13.4622 20.7713 12.8523C20.5186 12.2423 20.0716 11.7323 19.4998 11.4021C19.0217 11.1259 18.8576 10.5141 19.1336 10.0359C19.3098 9.73087 19.6226 9.55356 19.95 9.53684C19.975 9.39977 19.9922 9.2608 19.9979 9.12082C20.0163 8.6661 19.9314 8.21252 19.7489 7.79563C19.5664 7.37884 19.2917 7.00845 18.9452 6.71359C18.8653 6.64564 18.7813 6.58308 18.6952 6.52414C18.628 6.68692 18.5522 6.84641 18.4637 6.99973C18.1875 7.47801 17.5758 7.64211 17.0975 7.36594C16.6195 7.08967 16.4562 6.47789 16.7323 5.99973C16.8856 5.73413 16.9759 5.4366 16.9959 5.13059C17.016 4.82452 16.9649 4.51748 16.8475 4.2341C16.7301 3.95087 16.5487 3.69799 16.3182 3.49582C16.0876 3.29376 15.8135 3.14743 15.5174 3.06809Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=网站内容抓取 */\nfunction IconWebScrape(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M19 3C20.6569 3 22 4.34315 22 6V18L21.9961 18.1543C21.9184 19.6883 20.6883 20.9184 19.1543 20.9961L19 21H5L4.8457 20.9961C3.31166 20.9184 2.08163 19.6883 2.00391 18.1543L2 18V6C2 4.34315 3.34315 3 5 3H19ZM4 18C4 18.5523 4.44772 19 5 19H19C19.5523 19 20 18.5523 20 18V9H4V18ZM14.5 15C14.7761 15 15 15.2239 15 15.5V16.5C15 16.7761 14.7761 17 14.5 17H6.5C6.22386 17 6 16.7761 6 16.5V15.5C6 15.2239 6.22386 15 6.5 15H14.5ZM9.5 11C9.77614 11 10 11.2239 10 11.5V12.5C10 12.7761 9.77614 13 9.5 13H6.5C6.22386 13 6 12.7761 6 12.5V11.5C6 11.2239 6.22386 11 6.5 11H9.5ZM5 5C4.44772 5 4 5.44772 4 6V7H6V5H5ZM12 7H20V6C20 5.44771 19.5523 5 19 5H12V7ZM8 7H10V5H8V7Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=chat */\nfunction IconChat(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M12 1C12.5523 1 13 1.44772 13 2V5H18C18.7956 5 19.5585 5.3163 20.1211 5.87891C20.6837 6.44151 21 7.20435 21 8V11H22C22.5523 11 23 11.4477 23 12C23 12.5523 22.5523 13 22 13H21V16C21 16.7957 20.6837 17.5585 20.1211 18.1211C19.5585 18.6837 18.7957 19 18 19H8.82812C8.56296 19.0001 8.30857 19.1054 8.12109 19.293L5.91895 21.4951C5.6799 21.7341 5.37545 21.8969 5.04395 21.9629C4.71233 22.0288 4.36805 21.9956 4.05566 21.8662C3.74327 21.7368 3.47598 21.5174 3.28809 21.2363C3.10019 20.9552 3.00004 20.6243 3 20.2861V13H2C1.44772 13 1 12.5523 1 12C1 11.4477 1.44772 11 2 11H3V8C3 7.20435 3.3163 6.44152 3.87891 5.87891C4.44152 5.3163 5.20435 5 6 5H11V3H8C7.44772 3 7 2.55228 7 2C7 1.44772 7.44772 1 8 1H12ZM6 7C5.73478 7 5.4805 7.10543 5.29297 7.29297C5.10543 7.4805 5 7.73478 5 8V19.5859L6.70703 17.8789L6.92676 17.6797C7.46048 17.2422 8.13198 17.0001 8.82812 17H18C18.2652 17 18.5195 16.8946 18.707 16.707C18.8946 16.5195 19 16.2652 19 16V8C19 7.73478 18.8946 7.48051 18.707 7.29297C18.5195 7.10543 18.2652 7 18 7H6ZM9 10C9.55229 10 10 10.4477 10 11V13C10 13.5523 9.55229 14 9 14C8.44772 14 8 13.5523 8 13V11C8 10.4477 8.44772 10 9 10ZM15 10C15.5523 10 16 10.4477 16 11V13C16 13.5523 15.5523 14 15 14C14.4477 14 14 13.5523 14 13V11C14 10.4477 14.4477 10 15 10Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Property 1=图片生成 */\nfunction IconImageGeneration(props: GlyphProps): JSX.Element {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M14.04 1.00098C14.4743 1.00553 14.9042 1.09245 15.3057 1.25879C15.7193 1.43022 16.0949 1.68198 16.4111 1.99902L19.9971 5.58496L20.1133 5.70605C20.3773 5.99585 20.5896 6.32951 20.7402 6.69238C20.9122 7.1067 21.0005 7.55143 21 8V20C21 20.7957 20.6837 21.5585 20.1211 22.1211C19.5585 22.6837 18.7957 23 18 23H6C5.20435 23 4.44152 22.6837 3.87891 22.1211C3.3163 21.5585 3 20.7957 3 20V4C3 3.20435 3.3163 2.44151 3.87891 1.87891C4.44152 1.3163 5.20435 1 6 1H14C14.0134 1 14.0268 1.00045 14.04 1.00098ZM17 15.998C16.6261 15.998 16.2673 16.1468 16.0029 16.4111L11.4141 21H18C18.2652 21 18.5195 20.8946 18.707 20.707C18.8946 20.5195 19 20.2652 19 20V17.4141L17.9971 16.4111C17.7327 16.1468 17.3739 15.998 17 15.998ZM6 3C5.73478 3 5.4805 3.10543 5.29297 3.29297C5.10543 3.4805 5 3.73478 5 4V20C5 20.2652 5.10543 20.5195 5.29297 20.707C5.48051 20.8946 5.73478 21 6 21H8.58594L14.5889 14.9971C15.2283 14.3577 16.0957 13.998 17 13.998C17.7229 13.998 18.4218 14.2286 19 14.6475V9H15C14.4696 9 13.961 8.78913 13.5859 8.41406C13.2109 8.03899 13 7.53043 13 7V3H6ZM10 9C11.6569 9 13 10.3431 13 12C13 13.6569 11.6569 15 10 15C8.34315 15 7 13.6569 7 12C7 10.3431 8.34315 9 10 9ZM10 11C9.44772 11 9 11.4477 9 12C9 12.5523 9.44772 13 10 13C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11ZM15 7H18.584L15 3.41602V7Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nconst TOOL_ACTIVITY_KIND_ICONS: Record<\n ToolActivityKind,\n (props: GlyphProps) => JSX.Element\n> = {\n read_file: IconProductDoc,\n list_files: IconProductDoc,\n find_files: IconProductDoc,\n read_notebook: IconProductDoc,\n write_file: IconBrush,\n edit_file: IconBrush,\n edit_notebook: IconBrush,\n search_files: IconWebScrape,\n run_command: IconBuild,\n read_command_output: IconBuild,\n stop_command: IconBuild,\n apply_patch: IconBuild,\n web_search: IconNetwork,\n web_fetch: IconNetwork,\n update_todos: IconTask,\n delegate_agent: IconCapability,\n use_tool: IconCapability,\n thinking: IconThinking,\n responding: IconChat,\n notification: IconChat\n};\n\nexport function ToolActivityKindIcon({\n kind,\n ...props\n}: { kind: ToolActivityKind | null } & GlyphProps): JSX.Element {\n \"use memo\";\n const Icon = kind ? TOOL_ACTIVITY_KIND_ICONS[kind] : IconCapability;\n return <Icon {...props} />;\n}\n\nexport function ToolNameIcon({\n toolName,\n ...props\n}: { toolName: string | null } & GlyphProps): JSX.Element {\n \"use memo\";\n switch (normalizeToolName(toolName)) {\n case \"imagegeneration\":\n case \"imagegen\":\n case \"generateimage\":\n case \"generatingimage\":\n case \"imagegenerate\":\n case \"imagegenerator\":\n return <IconImageGeneration {...props} />;\n case \"read\":\n case \"readfile\":\n case \"glob\":\n return <IconProductDoc {...props} />;\n case \"write\":\n case \"writefile\":\n case \"edit\":\n case \"editfile\":\n case \"multiedit\":\n return <IconBrush {...props} />;\n case \"bash\":\n case \"shell\":\n case \"exec\":\n case \"execcommand\":\n case \"grep\":\n return <IconBuild {...props} />;\n case \"writestdin\":\n return <IconBrush {...props} />;\n case \"websearch\":\n case \"webfetch\":\n return <IconNetwork {...props} />;\n case \"todowrite\":\n return <IconTask {...props} />;\n case \"think\":\n return <IconThinking {...props} />;\n default:\n return <IconCapability {...props} />;\n }\n}\n\nfunction normalizeToolName(value: string | null): string {\n return (value ?? \"\")\n .trim()\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n","import { useState, type JSX } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"../../workspaceAgentTimelineTypes\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\n\ninterface RawTimelineJsonDisclosureProps {\n items: readonly WorkspaceAgentActivityTimelineItem[] | null | undefined;\n label: string;\n}\n\nexport function RawTimelineJsonDisclosure({\n items,\n label\n}: RawTimelineJsonDisclosureProps): JSX.Element | null {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n const json = rawTimelineJson(items);\n if (!json) {\n return null;\n }\n\n return (\n <div className=\"mt-2 rounded-md border border-[color:color-mix(in_srgb,var(--state-danger)_18%,transparent)] bg-[color:color-mix(in_srgb,var(--background-fronted)_92%,var(--state-danger))] px-2 py-1.5 text-[11px] text-[var(--state-danger)]\">\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1.5 border-0 bg-transparent p-0 text-left font-semibold text-[var(--state-danger)]\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? (\n <ChevronDown size={13} strokeWidth={2.2} aria-hidden />\n ) : (\n <ChevronRight size={13} strokeWidth={2.2} aria-hidden />\n )}\n <span>{label}</span>\n </button>\n <CollapsibleReveal expanded={expanded} preMountOnIdle>\n <pre className=\"mt-2 max-h-[320px] overflow-auto whitespace-pre-wrap break-words rounded-md border border-[var(--line-2)] bg-[var(--background-fronted)] px-3 py-2 font-mono text-[11px] leading-5 text-[var(--text-primary)]\">\n <code>{json}</code>\n </pre>\n </CollapsibleReveal>\n </div>\n );\n}\n\nfunction rawTimelineJson(\n items: readonly WorkspaceAgentActivityTimelineItem[] | null | undefined\n): string | null {\n if (!items || items.length === 0) {\n return null;\n }\n try {\n return JSON.stringify(items.length === 1 ? items[0] : items, null, 2);\n } catch {\n return null;\n }\n}\n","import type { JSX } from \"react\";\nimport { WorkspaceAgentSessionThinkingDisclosure } from \"../../WorkspaceAgentSessionThinkingDisclosure\";\nimport type { AgentThinkingContentVM } from \"../contracts/agentMessageRowVM\";\nimport { RawTimelineJsonDisclosure } from \"./RawTimelineJsonDisclosure\";\n\ninterface AgentThinkingDisclosureProps {\n thinking: AgentThinkingContentVM;\n label: string;\n onLinkClick?: (href: string) => void;\n previewMode?: boolean;\n showRawTimelineJson?: boolean;\n rawTimelineJsonLabel?: string;\n}\n\nexport function AgentThinkingDisclosure({\n thinking,\n label,\n onLinkClick,\n previewMode = false,\n showRawTimelineJson = false,\n rawTimelineJsonLabel = \"\"\n}: AgentThinkingDisclosureProps): JSX.Element {\n \"use memo\";\n\n return (\n <>\n <WorkspaceAgentSessionThinkingDisclosure\n thinking={thinking}\n label={label}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n {showRawTimelineJson && rawTimelineJsonLabel ? (\n <RawTimelineJsonDisclosure\n items={thinking.sourceTimelineItems}\n label={rawTimelineJsonLabel}\n />\n ) : null}\n </>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useElapsedSeconds(startUnixMs: number | null): number | null {\n const [nowUnixMs, setNowUnixMs] = useState(() => Date.now());\n useEffect(() => {\n if (startUnixMs === null) {\n return;\n }\n // timing: drive second-level elapsed UI only while the canonical active turn is visible.\n const timer = setInterval(() => setNowUnixMs(Date.now()), 1_000);\n return () => clearInterval(timer);\n }, [startUnixMs]);\n if (startUnixMs === null) {\n return null;\n }\n return Math.max(0, Math.floor((nowUnixMs - startUnixMs) / 1_000));\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"../../../../../../app/renderer/lib/utils\";\n\nexport type CanvasNodeGhostIconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\"\n> & {\n children: ReactNode;\n /**\n * When true (default), pointer/click stopPropagation — keeps React Flow from stealing node chrome\n * interactions. Set false for Radix `DropdownMenuTrigger asChild` and other portaled triggers.\n */\n stopsEventPropagation?: boolean;\n};\n\n/**\n * Ghost icon control for canvas node chrome.\n */\nexport const CanvasNodeGhostIconButton = forwardRef<\n HTMLButtonElement,\n CanvasNodeGhostIconButtonProps\n>(function CanvasNodeGhostIconButton(\n {\n className,\n children,\n onPointerDown,\n onMouseDown,\n onClick,\n stopsEventPropagation = true,\n ...rest\n },\n ref\n) {\n \"use memo\";\n return (\n <button\n ref={ref}\n {...rest}\n type=\"button\"\n className={cn(\n \"nodrag inline-flex h-7 min-h-7 w-7 min-w-7 shrink-0 items-center justify-center rounded-[4px] border border-transparent bg-transparent p-0 text-[var(--text-secondary)] transition-[background-color,color,border-color,opacity] duration-200 ease-in-out [-webkit-app-region:no-drag] hover:border-transparent hover:bg-[var(--transparency-block)] hover:text-[var(--text-primary)] active:bg-[var(--transparency-block-active)] active:text-[var(--text-primary)] disabled:cursor-not-allowed disabled:opacity-45 focus-visible:outline-2 focus-visible:outline-[color:color-mix(in_srgb,var(--tsh-shell-accent)_80%,white)] focus-visible:outline-offset-2 [&_svg]:block [&_svg]:h-3.5 [&_svg]:w-3.5 [&_svg]:shrink-0 [&_svg:not([data-nexight-chrome-glyph=fill]):not([data-tutti-chrome-glyph=fill])]:fill-none [&_svg:not([data-nexight-chrome-glyph=fill]):not([data-tutti-chrome-glyph=fill])]:stroke-current data-[menu-open=true]:border-transparent data-[menu-open=true]:bg-[var(--transparency-block)] data-[menu-open=true]:text-[var(--text-primary)] data-[menu-open=true]:hover:bg-[var(--transparency-block-active)]\",\n className\n )}\n onPointerDown={(event) => {\n if (stopsEventPropagation) {\n event.stopPropagation();\n }\n onPointerDown?.(event);\n }}\n onMouseDown={(event) => {\n if (stopsEventPropagation) {\n event.stopPropagation();\n }\n onMouseDown?.(event);\n }}\n onClick={(event) => {\n if (stopsEventPropagation) {\n event.stopPropagation();\n }\n onClick?.(event);\n }}\n >\n {children}\n </button>\n );\n});\n","import { useEffect, useMemo, useState, type JSX } from \"react\";\nimport { LoaderCircle } from \"lucide-react\";\nimport { useOptionalAgentActivityRuntime } from \"../../../agentActivityRuntime\";\nimport { ZoomableImage } from \"../../../app/renderer/components/ZoomableImage\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nimport type {\n AgentMessageContentVM,\n AgentMessageImageVM\n} from \"../contracts/agentMessageRowVM\";\n\nexport function AgentUserImageGrid({\n message\n}: {\n message: AgentMessageContentVM;\n}): JSX.Element {\n \"use memo\";\n const images = message.images ?? [];\n const { loadingIds, sources } = useAgentMessageImageSources(images);\n const columnCount = Math.min(Math.max(images.length, 1), 4);\n const thumbnailWidth = images.length === 1 ? \"160px\" : \"80px\";\n return (\n <div\n className={styles.userImageGrid}\n style={{\n gridTemplateColumns: `repeat(${columnCount}, ${thumbnailWidth})`\n }}\n >\n {images.map((image) => {\n const src = sources.get(image.id) ?? imageSourceUrl(image);\n const loading = !src && loadingIds.has(image.id);\n return (\n <div key={image.id} className={styles.userImageThumbnail}>\n {src ? (\n <ZoomableImage\n src={src}\n alt={image.name?.trim() || \"image\"}\n className=\"block max-h-20 w-full rounded-[7px] object-contain\"\n draggable={false}\n downloadName={image.name?.trim() || \"image.png\"}\n />\n ) : loading ? (\n <div\n className=\"flex h-20 w-full items-center justify-center bg-[color-mix(in_srgb,var(--text-primary)_6%,transparent)]\"\n data-testid=\"agent-gui-message-image-loading\"\n >\n <LoaderCircle\n aria-hidden=\"true\"\n className=\"size-5 animate-spin text-[color-mix(in_srgb,var(--text-primary)_45%,transparent)]\"\n strokeWidth={2}\n />\n </div>\n ) : (\n <div className=\"h-20 w-full animate-pulse bg-[color-mix(in_srgb,var(--text-primary)_8%,transparent)]\" />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction useAgentMessageImageSources(images: readonly AgentMessageImageVM[]): {\n loadingIds: ReadonlySet<string>;\n sources: ReadonlyMap<string, string>;\n} {\n const runtime = useOptionalAgentActivityRuntime();\n const [sources, setSources] = useState<Map<string, string>>(() => new Map());\n const [loadingIds, setLoadingIds] = useState<Set<string>>(() => new Set());\n const missingImages = useMemo(\n () =>\n images.filter(\n (image) =>\n !imageSourceUrl(image) &&\n !sources.has(image.id) &&\n image.workspaceId &&\n image.agentSessionId &&\n (image.attachmentId || image.path)\n ),\n [images, sources]\n );\n\n useEffect(() => {\n if (\n (!runtime?.readSessionAttachment && !runtime?.readPromptAsset) ||\n missingImages.length === 0\n ) {\n return;\n }\n let canceled = false;\n for (const image of missingImages) {\n const readImage = image.attachmentId\n ? runtime.readSessionAttachment?.({\n workspaceId: image.workspaceId ?? \"\",\n agentSessionId: image.agentSessionId,\n attachmentId: image.attachmentId ?? \"\"\n })\n : runtime.readPromptAsset?.({\n workspaceId: image.workspaceId ?? \"\",\n agentSessionId: image.agentSessionId,\n mimeType: image.mimeType,\n name: image.name,\n path: image.path\n });\n if (!readImage) continue;\n setLoadingIds((current) => new Set(current).add(image.id));\n void readImage\n .then((attachment) => {\n if (canceled) return;\n setSources((current) => {\n const next = new Map(current);\n next.set(\n image.id,\n `data:${attachment.mimeType};base64,${attachment.data}`\n );\n return next;\n });\n })\n .catch(() => {})\n .finally(() => {\n if (canceled) return;\n setLoadingIds((current) => {\n const next = new Set(current);\n next.delete(image.id);\n return next;\n });\n });\n }\n return () => {\n canceled = true;\n };\n }, [missingImages, runtime]);\n\n return { loadingIds, sources };\n}\n\nfunction imageDataUrl(image: AgentMessageImageVM): string | null {\n const data = image.data?.trim() ?? \"\";\n const mimeType = image.mimeType.trim();\n if (!data || !mimeType) return null;\n return data.startsWith(\"data:\") ? data : `data:${mimeType};base64,${data}`;\n}\n\nfunction imageSourceUrl(image: AgentMessageImageVM): string | null {\n const url = image.url?.trim() ?? \"\";\n return url || imageDataUrl(image);\n}\n","import type { JSX } from \"react\";\nimport type { AgentProcessingRowVM } from \"../contracts/agentProcessingRowVM\";\n\nexport function AgentProcessingRow({\n row,\n label\n}: {\n row: AgentProcessingRowVM;\n label: string;\n}): JSX.Element {\n \"use memo\";\n\n return (\n <div\n data-row-id={row.id}\n className=\"workspace-agents-status-panel__detail-processing inline-flex items-center gap-1.5\"\n >\n <span className=\"inline-flex min-w-0 items-center gap-1 font-semibold\">\n <span>{processingLabel(row, label)}</span>\n <LoadingEllipsis />\n </span>\n </div>\n );\n}\n\nfunction processingLabel(row: AgentProcessingRowVM, fallback: string): string {\n if (row.label?.trim()) {\n return row.label.trim();\n }\n return fallback;\n}\n\nfunction LoadingEllipsis(): JSX.Element {\n \"use memo\";\n return (\n <span\n className=\"tsh-inline-loading-ellipsis tsh-inline-loading-ellipsis--entry-timing\"\n aria-hidden=\"true\"\n >\n <span />\n <span />\n <span />\n </span>\n );\n}\n","import { memo, useState, type JSX } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { ToolActivityKindIcon } from \"../../toolActivityKindIcons\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport type { AgentToolGroupRowVM } from \"../contracts/agentToolGroupRowVM\";\nimport { AgentAskUserQuestionCard } from \"./AgentAskUserQuestionCard\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport { AgentEnterPlanModeCard } from \"./AgentEnterPlanModeCard\";\nimport { AgentExitPlanModeCard } from \"./AgentExitPlanModeCard\";\nimport { AgentThinkingDisclosure } from \"./AgentThinkingDisclosure\";\nimport { AgentTaskCallCard } from \"./AgentTaskCallCard\";\nimport { AgentSubAgentCards } from \"./AgentSubAgentCards\";\nimport { AgentToolCallCard } from \"./AgentToolCallCard\";\nimport { RawTimelineJsonDisclosure } from \"./RawTimelineJsonDisclosure\";\n\ninterface AgentToolGroupRowProps {\n row: AgentToolGroupRowVM;\n label: (count: number) => string;\n thinkingLabel: string;\n onLinkClick?: (href: string) => void;\n previewMode?: boolean;\n expanded?: boolean;\n expansionKey?: string;\n onExpandedChange?: (key: string, expanded: boolean) => void;\n showRawTimelineJson?: boolean;\n rawTimelineJsonLabel?: string;\n}\n\nexport const AgentToolGroupRow = memo(function AgentToolGroupRow({\n row,\n label,\n thinkingLabel,\n onLinkClick,\n previewMode = false,\n expanded,\n expansionKey,\n onExpandedChange,\n showRawTimelineJson = false,\n rawTimelineJsonLabel = \"\"\n}: AgentToolGroupRowProps): JSX.Element {\n \"use memo\";\n const [localExpanded, setLocalExpanded] = useState(false);\n const hasDetail = row.entries.length > 0;\n const isExpanded = hasDetail && (expanded ?? localExpanded);\n const setNextExpanded = (nextExpanded: boolean) => {\n if (expanded === undefined) {\n setLocalExpanded(nextExpanded);\n }\n if (expansionKey) {\n onExpandedChange?.(expansionKey, nextExpanded);\n }\n };\n const groupLabel = label(row.calls.length);\n const singleCall = row.calls[0];\n if (!row.grouped && singleCall) {\n return renderToolCard(\n singleCall,\n onLinkClick,\n previewMode,\n showRawTimelineJson,\n rawTimelineJsonLabel\n );\n }\n\n return (\n <div\n className=\"workspace-agents-status-panel__detail-tool-section\"\n data-tool-group-expanded={isExpanded ? \"true\" : undefined}\n >\n {hasDetail ? (\n <button\n type=\"button\"\n className=\"workspace-agents-status-panel__detail-tool-count\"\n aria-expanded={isExpanded}\n aria-label={groupLabel}\n onClick={() => setNextExpanded(!isExpanded)}\n >\n <ToolGroupLabel label={groupLabel} />\n {isExpanded ? (\n <ChevronDown\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"workspace-agents-status-panel__detail-tool-count-chevron\"\n />\n ) : (\n <ChevronRight\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"workspace-agents-status-panel__detail-tool-count-chevron\"\n />\n )}\n </button>\n ) : (\n <div className=\"workspace-agents-status-panel__detail-tool-count\">\n <ToolGroupLabel label={groupLabel} />\n </div>\n )}\n {hasDetail ? (\n <CollapsibleReveal expanded={isExpanded}>\n <div className=\"workspace-agents-status-panel__detail-tool-list\">\n {row.entries.map((entry) =>\n entry.kind === \"thinking\" ? (\n <div\n key={entry.thinking.id}\n className=\"workspace-agents-status-panel__detail-tool-list-item workspace-agents-status-panel__detail-tool-row\"\n >\n <AgentThinkingDisclosure\n thinking={entry.thinking}\n label={thinkingLabel}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n showRawTimelineJson={showRawTimelineJson}\n rawTimelineJsonLabel={rawTimelineJsonLabel}\n />\n </div>\n ) : (\n <div\n key={entry.call.id}\n className=\"workspace-agents-status-panel__detail-tool-list-item\"\n >\n {renderToolCard(\n entry.call,\n onLinkClick,\n previewMode,\n showRawTimelineJson,\n rawTimelineJsonLabel\n )}\n </div>\n )\n )}\n </div>\n </CollapsibleReveal>\n ) : null}\n </div>\n );\n});\n\nfunction ToolGroupLabel({ label }: { label: string }): JSX.Element {\n \"use memo\";\n return (\n <>\n <ToolActivityKindIcon\n kind=\"update_todos\"\n width={16}\n height={16}\n className=\"workspace-agents-status-panel__detail-tool-count-icon\"\n />\n <span className=\"workspace-agents-status-panel__detail-tool-count-label\">\n {renderToolCountLabel(label)}\n </span>\n </>\n );\n}\n\nfunction renderToolCountLabel(label: string): JSX.Element {\n return (\n <span className=\"workspace-agents-status-panel__detail-tool-count-primary\">\n {label}\n </span>\n );\n}\n\nfunction renderToolCard(\n call: AgentToolCallVM,\n onLinkClick?: (href: string) => void,\n previewMode = false,\n showRawTimelineJson = false,\n rawTimelineJsonLabel = \"\"\n): JSX.Element {\n const props = { call, onLinkClick, previewMode };\n // A delegated sub-agent renders as its own first-class card - no tool-row\n // chrome, no prompt echo; identity/status belong to the sub-agent itself.\n if (call.task?.subAgents?.length) {\n return <AgentSubAgentCards call={call} onLinkClick={onLinkClick} />;\n }\n let card: JSX.Element;\n switch (call.rendererKind) {\n case \"plan-enter\":\n card = <AgentEnterPlanModeCard {...props} />;\n break;\n case \"plan-exit\":\n card = <AgentExitPlanModeCard {...props} />;\n break;\n case \"ask-user\":\n card = <AgentAskUserQuestionCard {...props} />;\n break;\n case \"task\":\n card = <AgentTaskCallCard {...props} />;\n break;\n default:\n card = <AgentToolCallCard {...props} />;\n }\n return (\n <>\n {card}\n {showRawTimelineJson && rawTimelineJsonLabel ? (\n <RawTimelineJsonDisclosure\n items={call.sourceTimelineItems}\n label={rawTimelineJsonLabel}\n />\n ) : null}\n </>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport type { AgentToolCallCardProps } from \"./AgentToolCallCard\";\nimport { AgentToolCallHeader } from \"./AgentToolCallHeader\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport { AgentExpandedToolContent } from \"./tool-renderers/AgentExpandedToolContent\";\nimport { hasAgentToolContent } from \"./tool-renderers/agentToolContentShared\";\n\nexport function AgentAskUserQuestionCard({\n call,\n onLinkClick,\n previewMode = false,\n defaultExpanded,\n nonCollapsible\n}: AgentToolCallCardProps): JSX.Element {\n \"use memo\";\n const waitingInput =\n (call.askUserQuestion?.status ?? call.status ?? \"\").trim().toLowerCase() ===\n \"waiting_input\";\n const hasDetail = hasAgentToolContent(call);\n const pinned = nonCollapsible ?? waitingInput;\n const [expanded, setExpanded] = useState(defaultExpanded ?? waitingInput);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-row workspace-agents-status-panel__detail-tool-row--ask-user\">\n {hasDetail && !pinned ? (\n <button\n type=\"button\"\n className=\"workspace-agents-status-panel__detail-tool-row-head workspace-agents-status-panel__detail-tool-row-head--button\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n <AgentToolCallHeader call={call} expanded={expanded} hasDetail />\n </button>\n ) : (\n <div className=\"workspace-agents-status-panel__detail-tool-row-head\">\n <AgentToolCallHeader call={call} expanded={false} hasDetail={false} />\n </div>\n )}\n {!hasDetail && call.summary ? (\n <div className=\"workspace-agents-status-panel__detail-tool-summary\">\n {call.summary}\n </div>\n ) : null}\n {hasDetail && pinned ? (\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n ) : null}\n {hasDetail && !pinned ? (\n <CollapsibleReveal expanded={expanded}>\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n </CollapsibleReveal>\n ) : null}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { AlertCircle, ChevronDown, ChevronRight } from \"lucide-react\";\nimport { FilePenLineIcon } from \"../../../app/renderer/components/icons/FilePenLineIcon\";\nimport { FileTextIcon } from \"../../../app/renderer/components/icons/FileTextIcon\";\nimport { HammerIcon } from \"../../../app/renderer/components/icons/HammerIcon\";\nimport { ToolsLinedIcon } from \"../../../app/renderer/components/icons/ToolsLinedIcon\";\nimport { WriteLinedIcon } from \"../../../app/renderer/components/icons/WriteLinedIcon\";\nimport { ToolNameIcon } from \"../../toolActivityKindIcons\";\nimport { isImageGenerationToolCall } from \"../../imageGenerationTool\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport { getFileChangeRenderData } from \"./tool-renderers/render-data/agentToolRenderData\";\n\nconst TOOL_ROW_ICON_SIZE = 16;\n\ninterface AgentToolCallHeaderProps {\n call: AgentToolCallVM;\n expanded: boolean;\n hasDetail: boolean;\n}\n\nexport function AgentToolCallHeader({\n call,\n expanded,\n hasDetail\n}: AgentToolCallHeaderProps): JSX.Element {\n \"use memo\";\n const diffStats = diffStatsForCall(call);\n const isActive =\n call.statusKind === \"working\" || call.statusKind === \"waiting\";\n const isFailed = call.statusKind === \"failed\" || isFailedStatus(call.status);\n\n return (\n <div\n data-active={isActive ? \"true\" : undefined}\n className={[\n \"workspace-agents-status-panel__detail-tool-row-header-content\",\n isActive ? \"tsh-inline-scanlight-group\" : \"\"\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"workspace-agents-status-panel__detail-tool-row-icon tsh-inline-scanlight-icon\">\n {isFailed ? (\n <AlertCircle\n size={TOOL_ROW_ICON_SIZE}\n strokeWidth={2}\n aria-hidden=\"true\"\n />\n ) : isActive && isFileReadTool(call.toolName) ? (\n <FileTextIcon\n size={TOOL_ROW_ICON_SIZE}\n active\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid=\"agent-tool-read-loading-icon\"\n />\n ) : isActive && isFileWriteTool(call.toolName) ? (\n <FilePenLineIcon\n size={TOOL_ROW_ICON_SIZE}\n active\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid=\"agent-tool-write-loading-icon\"\n />\n ) : isActive && isFileEditTool(call.toolName) ? (\n <FileTextIcon\n size={TOOL_ROW_ICON_SIZE}\n active\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid=\"agent-tool-edit-loading-icon\"\n />\n ) : isActive && isStdinWriteTool(call.toolName) ? (\n <WriteLinedIcon\n width={TOOL_ROW_ICON_SIZE}\n height={TOOL_ROW_ICON_SIZE}\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid=\"agent-tool-stdin-write-icon\"\n />\n ) : isImageGenerationToolCall({\n toolName: call.toolName,\n displayName: call.name\n }) ? (\n <ToolNameIcon\n toolName={call.toolName ?? call.name}\n width={TOOL_ROW_ICON_SIZE}\n height={TOOL_ROW_ICON_SIZE}\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid={\n isActive\n ? \"agent-tool-image-generation-loading-icon\"\n : \"agent-tool-image-generation-icon\"\n }\n />\n ) : isWebTool(call.toolName) ? (\n <ToolNameIcon\n toolName={call.toolName}\n width={TOOL_ROW_ICON_SIZE}\n height={TOOL_ROW_ICON_SIZE}\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid={\n isActive ? \"agent-tool-web-loading-icon\" : \"agent-tool-web-icon\"\n }\n />\n ) : isFileReadTool(call.toolName) ? (\n <ToolNameIcon\n toolName={call.toolName}\n width={TOOL_ROW_ICON_SIZE}\n height={TOOL_ROW_ICON_SIZE}\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid=\"agent-tool-read-icon\"\n />\n ) : call.statusKind === \"working\" || call.statusKind === \"waiting\" ? (\n <HammerIcon\n size={TOOL_ROW_ICON_SIZE}\n active\n aria-hidden=\"true\"\n className=\"text-current\"\n data-testid=\"agent-tool-call-loading-icon\"\n />\n ) : (\n <ToolsLinedIcon\n width={TOOL_ROW_ICON_SIZE}\n height={TOOL_ROW_ICON_SIZE}\n aria-hidden=\"true\"\n />\n )}\n </div>\n <div\n className={[\n \"workspace-agents-status-panel__detail-tool-row-text\",\n isActive ? \"tsh-inline-scanlight-line\" : \"\"\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <strong className=\"workspace-agents-status-panel__detail-tool-row-title\">\n {formatInlineTitleLabel(call.name)}\n </strong>\n {call.status ? (\n <span className=\"workspace-agents-status-panel__detail-tool-status\">\n {formatInlineStatusLabel(call.status)}\n </span>\n ) : null}\n {isActive ? <LoadingEllipsis /> : null}\n {diffStats ? (\n <span className=\"workspace-agents-status-panel__detail-tool-diff-stats\">\n {diffStats.added > 0 ? (\n <span className=\"workspace-agents-status-panel__detail-tool-diff-added\">\n +{diffStats.added}\n </span>\n ) : null}\n {diffStats.removed > 0 ? (\n <span className=\"workspace-agents-status-panel__detail-tool-diff-removed\">\n -{diffStats.removed}\n </span>\n ) : null}\n </span>\n ) : null}\n </div>\n {hasDetail ? (\n expanded ? (\n <ChevronDown\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"workspace-agents-status-panel__detail-tool-row-chevron\"\n />\n ) : (\n <ChevronRight\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"workspace-agents-status-panel__detail-tool-row-chevron\"\n />\n )\n ) : null}\n </div>\n );\n}\n\nfunction formatInlineStatusLabel(label: string): string {\n return /^[A-Z][a-z]+$/.test(label) ? label.toLowerCase() : label;\n}\n\nfunction isFailedStatus(value: string | null | undefined): boolean {\n const normalized = (value ?? \"\").trim().toLowerCase();\n return normalized === \"failed\" || normalized === \"error\";\n}\n\nfunction formatInlineTitleLabel(label: string): string {\n const trimmed = label.trim();\n if (!/[a-z]/.test(trimmed) || !/[A-Z]/.test(trimmed.slice(1))) {\n return label;\n }\n\n const words = trimmed.split(/(\\s+)/);\n let changed = false;\n const normalized = words\n .map((word, index) => {\n if (index === 0 || !/^[A-Z][a-z]+$/.test(word)) {\n return word;\n }\n changed = true;\n return word.toLowerCase();\n })\n .join(\"\");\n return changed ? normalized : label;\n}\n\nfunction LoadingEllipsis(): JSX.Element {\n \"use memo\";\n return (\n <span className=\"tsh-inline-loading-ellipsis\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n );\n}\n\nfunction diffStatsForCall(\n call: AgentToolCallVM\n): { added: number; removed: number } | null {\n if (call.rendererKind === \"approval\") {\n return null;\n }\n const files = getFileChangeRenderData(call);\n if (files.length > 0) {\n const totals = files.reduce(\n (accumulator, file) => ({\n added: accumulator.added + file.added,\n removed: accumulator.removed + file.removed\n }),\n { added: 0, removed: 0 }\n );\n if (totals.added > 0 || totals.removed > 0) {\n return totals;\n }\n }\n return null;\n}\n\nfunction isFileReadTool(toolName: string | null): boolean {\n switch (normalizeToolName(toolName)) {\n case \"read\":\n case \"readfile\":\n case \"listfiles\":\n case \"findfiles\":\n case \"glob\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isFileEditTool(toolName: string | null): boolean {\n switch (normalizeToolName(toolName)) {\n case \"edit\":\n case \"editfile\":\n case \"multiedit\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isFileWriteTool(toolName: string | null): boolean {\n switch (normalizeToolName(toolName)) {\n case \"write\":\n case \"writefile\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isStdinWriteTool(toolName: string | null): boolean {\n return normalizeToolName(toolName) === \"writestdin\";\n}\n\nfunction isWebTool(toolName: string | null): boolean {\n switch (normalizeToolName(toolName)) {\n case \"websearch\":\n case \"webfetch\":\n return true;\n default:\n return false;\n }\n}\n\nfunction normalizeToolName(value: string | null): string {\n return (value ?? \"\")\n .trim()\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n","\"use client\";\n\nimport type { HTMLAttributes, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef\n} from \"react\";\nimport {\n motion,\n useAnimation,\n useReducedMotion,\n type Variants\n} from \"framer-motion\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface FilePenLineIconHandle {\n startAnimation: () => void;\n stopAnimation: () => void;\n}\n\ninterface FilePenLineIconProps extends HTMLAttributes<HTMLDivElement> {\n size?: number;\n active?: boolean;\n}\n\nconst PEN_VARIANTS: Variants = {\n normal: {\n rotate: 0,\n x: 0,\n y: 0\n },\n animate: {\n rotate: [-0.3, 0.2, -0.4],\n x: [0, -0.5, 1, 0],\n y: [0, 1, -0.5, 0],\n transition: {\n duration: 0.5,\n repeat: 1,\n ease: \"easeInOut\"\n }\n },\n active: {\n rotate: [-0.3, 0.2, -0.4],\n x: [0, -0.5, 1, 0],\n y: [0, 1, -0.5, 0],\n transition: {\n duration: 0.5,\n repeat: Number.POSITIVE_INFINITY,\n repeatDelay: 0.75,\n ease: \"easeInOut\"\n }\n }\n};\n\nconst LINE_VARIANTS: Variants = {\n normal: { d: \"M8 18h1\" },\n animate: {\n d: \"M8 18h5\",\n transition: { duration: 0.5 }\n },\n active: {\n d: [\"M8 18h1\", \"M8 18h5\", \"M8 18h1\"],\n transition: {\n duration: 0.8,\n repeat: Number.POSITIVE_INFINITY,\n repeatDelay: 0.45,\n ease: \"easeInOut\"\n }\n }\n};\n\nconst FilePenLineIcon = forwardRef<FilePenLineIconHandle, FilePenLineIconProps>(\n (\n {\n active = false,\n onMouseEnter,\n onMouseLeave,\n className,\n size = 28,\n ...props\n },\n ref\n ) => {\n const controls = useAnimation();\n const reduceMotion = useReducedMotion();\n const isControlledRef = useRef(false);\n\n const startAnimation = useCallback(() => {\n if (reduceMotion) {\n return;\n }\n void controls.start(active ? \"active\" : \"animate\");\n }, [active, controls, reduceMotion]);\n\n const stopAnimation = useCallback(() => {\n void controls.start(\"normal\");\n }, [controls]);\n\n useImperativeHandle(ref, () => {\n isControlledRef.current = true;\n\n return {\n startAnimation,\n stopAnimation\n };\n });\n\n useEffect(() => {\n if (active) {\n startAnimation();\n return;\n }\n stopAnimation();\n }, [active, startAnimation, stopAnimation]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseEnter?.(event);\n } else {\n startAnimation();\n }\n },\n [onMouseEnter, startAnimation]\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseLeave?.(event);\n } else {\n stopAnimation();\n }\n },\n [onMouseLeave, stopAnimation]\n );\n\n return (\n <div\n className={cn(\"inline-flex items-center justify-center\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <svg\n fill=\"none\"\n height={size}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m18 5-2.414-2.414A2 2 0 0 0 14.172 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2\" />\n <motion.path\n animate={controls}\n d=\"M21.378 12.626a1 1 0 0 0-3.004-3.004l-4.01 4.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z\"\n initial=\"normal\"\n variants={PEN_VARIANTS}\n />\n <motion.path\n animate={controls}\n d=\"M8 18h1\"\n initial=\"normal\"\n variants={LINE_VARIANTS}\n />\n </svg>\n </div>\n );\n }\n);\n\nFilePenLineIcon.displayName = \"FilePenLineIcon\";\n\nexport { FilePenLineIcon };\n","\"use client\";\n\nimport type { HTMLAttributes, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef\n} from \"react\";\nimport {\n motion,\n useAnimation,\n useReducedMotion,\n type Variants\n} from \"framer-motion\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface FileTextIconHandle {\n startAnimation: () => void;\n stopAnimation: () => void;\n}\n\ninterface FileTextIconProps extends HTMLAttributes<HTMLDivElement> {\n size?: number;\n active?: boolean;\n}\n\nconst FILE_TEXT_LINE_VARIANTS: Variants = {\n normal: {\n pathLength: 1,\n pathOffset: 0\n },\n animate: (delay: number) => ({\n pathLength: [1, 0, 1],\n pathOffset: [0, 1, 0],\n transition: {\n duration: 0.7,\n delay,\n ease: \"easeInOut\"\n }\n }),\n active: (delay: number) => ({\n pathLength: [1, 0, 1],\n pathOffset: [0, 1, 0],\n transition: {\n duration: 0.7,\n delay,\n ease: \"easeInOut\",\n repeat: Number.POSITIVE_INFINITY,\n repeatDelay: 1.1\n }\n })\n};\n\nconst FileTextIcon = forwardRef<FileTextIconHandle, FileTextIconProps>(\n (\n {\n active = false,\n onMouseEnter,\n onMouseLeave,\n className,\n size = 28,\n ...props\n },\n ref\n ) => {\n const controls = useAnimation();\n const reduceMotion = useReducedMotion();\n const isControlledRef = useRef(false);\n\n const startAnimation = useCallback(() => {\n if (reduceMotion) {\n return;\n }\n void controls.start(active ? \"active\" : \"animate\");\n }, [active, controls, reduceMotion]);\n\n const stopAnimation = useCallback(() => {\n void controls.start(\"normal\");\n }, [controls]);\n\n useImperativeHandle(ref, () => {\n isControlledRef.current = true;\n\n return {\n startAnimation,\n stopAnimation\n };\n });\n\n useEffect(() => {\n if (active) {\n startAnimation();\n return;\n }\n stopAnimation();\n }, [active, startAnimation, stopAnimation]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseEnter?.(event);\n } else {\n startAnimation();\n }\n },\n [onMouseEnter, startAnimation]\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseLeave?.(event);\n } else {\n stopAnimation();\n }\n },\n [onMouseLeave, stopAnimation]\n );\n\n return (\n <div\n className={cn(\"inline-flex items-center justify-center\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <motion.svg\n animate={controls}\n fill=\"none\"\n height={size}\n initial=\"normal\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n variants={{\n normal: { scale: 1 },\n animate: {\n scale: 1.05,\n transition: {\n duration: 0.3,\n ease: \"easeOut\"\n }\n },\n active: {\n scale: [1, 1.05, 1],\n transition: {\n duration: 0.9,\n ease: \"easeInOut\",\n repeat: Number.POSITIVE_INFINITY,\n repeatDelay: 0.9\n }\n }\n }}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <motion.path\n animate={controls}\n custom={0.3}\n d=\"M10 9H8\"\n variants={FILE_TEXT_LINE_VARIANTS}\n />\n <motion.path\n animate={controls}\n custom={0.5}\n d=\"M16 13H8\"\n variants={FILE_TEXT_LINE_VARIANTS}\n />\n <motion.path\n animate={controls}\n custom={0.7}\n d=\"M16 17H8\"\n variants={FILE_TEXT_LINE_VARIANTS}\n />\n </motion.svg>\n </div>\n );\n }\n);\n\nFileTextIcon.displayName = \"FileTextIcon\";\n\nexport { FileTextIcon };\n","import type { HTMLAttributes, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef\n} from \"react\";\nimport {\n motion,\n useAnimation,\n useReducedMotion,\n type Variants\n} from \"framer-motion\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface HammerIconHandle {\n startAnimation: () => void;\n stopAnimation: () => void;\n}\n\ninterface HammerIconProps extends HTMLAttributes<HTMLDivElement> {\n size?: number;\n active?: boolean;\n}\n\nconst HAMMER_VARIANTS: Variants = {\n normal: {\n rotate: 0,\n transition: {\n duration: 0.3,\n ease: \"easeOut\"\n }\n },\n animate: {\n rotate: [0, -20, 25, 0],\n transition: {\n duration: 0.8,\n times: [0, 0.6, 0.8, 1],\n ease: [\"easeInOut\", \"easeOut\", \"easeOut\"]\n }\n },\n active: {\n rotate: [0, -20, 25, 0],\n transition: {\n duration: 0.8,\n times: [0, 0.6, 0.8, 1],\n ease: [\"easeInOut\", \"easeOut\", \"easeOut\"],\n repeat: Infinity,\n repeatDelay: 0.9\n }\n }\n};\n\nconst HammerIcon = forwardRef<HammerIconHandle, HammerIconProps>(\n (\n {\n active = false,\n onMouseEnter,\n onMouseLeave,\n className,\n size = 28,\n ...props\n },\n ref\n ) => {\n const controls = useAnimation();\n const reduceMotion = useReducedMotion();\n const isControlledRef = useRef(false);\n\n const startAnimation = useCallback(() => {\n if (reduceMotion) {\n return;\n }\n void controls.start(active ? \"active\" : \"animate\");\n }, [active, controls, reduceMotion]);\n\n const stopAnimation = useCallback(() => {\n void controls.start(\"normal\");\n }, [controls]);\n\n useImperativeHandle(ref, () => {\n isControlledRef.current = true;\n return {\n startAnimation,\n stopAnimation\n };\n });\n\n useEffect(() => {\n if (active) {\n startAnimation();\n return;\n }\n stopAnimation();\n }, [active, startAnimation, stopAnimation]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseEnter?.(event);\n } else {\n startAnimation();\n }\n },\n [onMouseEnter, startAnimation]\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseLeave?.(event);\n } else {\n stopAnimation();\n }\n },\n [onMouseLeave, stopAnimation]\n );\n\n return (\n <div\n className={cn(\"inline-flex items-center justify-center\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <motion.svg\n animate={controls}\n fill=\"none\"\n height={size}\n initial=\"normal\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n style={{ transformOrigin: \"0% 100%\", transformBox: \"fill-box\" }}\n variants={HAMMER_VARIANTS}\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9\" />\n <path d=\"m18 15 4-4\" />\n <path d=\"m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5\" />\n </motion.svg>\n </div>\n );\n }\n);\n\nHammerIcon.displayName = \"HammerIcon\";\n\nexport { HammerIcon };\n","import type { SVGProps } from \"react\";\n\nexport function ToolsLinedIcon(props: SVGProps<SVGSVGElement>) {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M12.5166 2C14.3722 2.0005 16.1516 2.73783 17.4639 4.0498L19.1211 5.70703L19.3203 5.92676C19.7578 6.46048 19.9999 7.13198 20 7.82812V8.17188L20.0049 8.27051C20.0276 8.49945 20.1288 8.71482 20.293 8.87891L21.5303 10.1162C21.9083 9.9151 22.3885 9.97443 22.707 10.293C23.0976 10.6835 23.0976 11.3165 22.707 11.707L18.707 15.707C18.3165 16.0976 17.6835 16.0976 17.293 15.707C16.9744 15.3885 16.9151 14.9083 17.1162 14.5303L15.8789 13.293C15.7431 13.1571 15.5715 13.0672 15.3867 13.0264L6.33398 22.0801C6.0442 22.3699 5.69992 22.5999 5.32129 22.7568C4.94266 22.9137 4.53679 22.995 4.12695 22.9951C3.29924 22.9952 2.50538 22.6661 1.91992 22.0811C1.3344 21.4957 1.00502 20.701 1.00488 19.873C1.00487 19.0453 1.33373 18.2514 1.91895 17.666L11 8.58496V8.48535C10.9999 7.1596 10.4734 5.88777 9.53613 4.9502L8.29297 3.70703C8.00697 3.42103 7.92139 2.99086 8.07617 2.61719C8.23098 2.24359 8.59558 2 9 2H12.5166ZM3.33301 19.0801C3.12284 19.2904 3.00487 19.5757 3.00488 19.873C3.00493 20.1705 3.12359 20.4557 3.33398 20.666C3.54437 20.8763 3.82951 20.9952 4.12695 20.9951C4.27409 20.9951 4.41972 20.9655 4.55566 20.9092C4.69174 20.8528 4.81578 20.7702 4.91992 20.666L13.0859 12.5L11.499 10.9131L3.33301 19.0801ZM11.3721 4C12.4187 5.2535 12.9999 6.83919 13 8.48535V9.58594L14.4141 11H15.1719C15.9674 11.0002 16.7305 11.3164 17.293 11.8789L18.5 13.0859L20.0859 11.5L18.8789 10.293C18.3164 9.73051 18.0002 8.96738 18 8.17188V7.82812C17.9999 7.56296 17.8946 7.30857 17.707 7.12109L16.0498 5.46387C15.1124 4.52677 13.8411 4.00028 12.5156 4H11.3721Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import type { JSX, SVGProps } from \"react\";\n\n/**\n * Lined write glyph (24x24 viewBox). Fill uses `currentColor`.\n */\nexport function WriteLinedIcon(props: SVGProps<SVGSVGElement>): JSX.Element {\n \"use memo\";\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden\n {...props}\n >\n <path\n fill=\"currentColor\"\n d=\"M19.1816 1C20.1944 1.00019 21.1658 1.40292 21.8818 2.11914C22.5976 2.83537 23.0001 3.8067 23 4.81934C22.9998 5.7688 22.6461 6.68243 22.0117 7.38281L21.8808 7.51953L19.79 9.60937C19.7641 9.6428 19.7377 9.67636 19.707 9.70703C19.6763 9.7377 19.6428 9.76419 19.6093 9.79004L8.53414 20.8682L8.53317 20.8691C8.1855 21.2156 7.75766 21.4724 7.28805 21.6152H7.28707L2.93454 22.9355L2.93161 22.9365C2.67255 23.0143 2.39705 23.02 2.13473 22.9541C1.87235 22.8881 1.63194 22.7526 1.44039 22.5615C1.24885 22.3703 1.11234 22.1296 1.04586 21.8672C0.979582 21.605 0.985166 21.3294 1.06246 21.0703L1.06442 21.0664L2.38473 16.7139L2.38571 16.7109C2.52986 16.2409 2.78761 15.813 3.13571 15.4658L14.2089 4.38867C14.2346 4.35552 14.2625 4.32341 14.2929 4.29297C14.3234 4.26252 14.3555 4.23468 14.3886 4.20898L16.4804 2.11816C17.1967 1.40209 18.1688 0.999896 19.1816 1ZM4.54879 16.8818L4.54782 16.8828C4.43196 16.9985 4.34581 17.1413 4.29782 17.2978L3.24899 20.749L6.70602 19.7012L6.82028 19.6592C6.93185 19.6097 7.0341 19.5397 7.12106 19.4531L17.5791 8.99316L15.0068 6.4209L4.54879 16.8818ZM19.1816 3C18.6995 2.99996 18.2366 3.19147 17.8955 3.53223L16.4209 5.00683L18.9931 7.5791L20.4668 6.10547L20.5879 5.97168C20.8529 5.64823 20.9998 5.24116 21 4.81934C21 4.33701 20.8077 3.87434 20.4668 3.5332C20.1258 3.19221 19.6638 3.00019 19.1816 3Z\"\n />\n </svg>\n );\n}\n","import type { AgentToolCallVM } from \"../../../contracts/agentToolCallVM\";\nimport {\n extractAgentPatchPath,\n inferAgentPatchChangeType\n} from \"../../../rules/agentPatchMetadata\";\nimport {\n fileChangeEntriesFromChanges,\n fileChangeTypeValue\n} from \"../../../../workspaceAgentFileChangePayload\";\n\nexport interface AgentFileChangeRenderData {\n path: string;\n changeType: \"created\" | \"modified\" | \"deleted\" | \"unknown\";\n language: string | null;\n content: string | null;\n oldString: string | null;\n newString: string | null;\n unifiedDiff: string | null;\n added: number;\n removed: number;\n}\n\nexport function getFileChangeRenderData(\n call: AgentToolCallVM\n): AgentFileChangeRenderData[] {\n const payloadInput = recordValue(call.payload?.input);\n const payloadOutput = recordValue(call.payload?.output);\n const rawInput =\n recordValue(call.input?.rawInput) ?? recordValue(payloadInput?.rawInput);\n const inputLocations =\n arrayValue(call.locations) ??\n arrayValue(call.input?.locations) ??\n arrayValue(payloadInput?.locations);\n const fromStructuredPatch = structuredPatchFiles(\n call.output?.structuredPatch ??\n payloadOutput?.structuredPatch ??\n call.payload?.structuredPatch ??\n call.output?.files ??\n payloadOutput?.files\n );\n if (fromStructuredPatch.length > 0) {\n return fromStructuredPatch;\n }\n\n const fromDetailedContent = detailedDiffFiles(\n call.output?.detailedContent ??\n payloadOutput?.detailedContent ??\n call.payload?.detailedContent\n );\n if (fromDetailedContent.length > 0) {\n return fromDetailedContent;\n }\n\n const fromFileChanges = fileChangesFiles(\n call.payload?.fileChanges ?? payloadOutput?.fileChanges\n );\n if (fromFileChanges.length > 0) {\n return fromFileChanges;\n }\n\n const fromChangeMap = changeMapFiles(\n call.output?.changes ??\n payloadOutput?.changes ??\n call.input?.changes ??\n payloadInput?.changes\n );\n if (fromChangeMap.length > 0) {\n return fromChangeMap;\n }\n\n const fromContentDiff = contentDiffFiles(\n call.content ??\n call.output?.content ??\n payloadOutput?.content ??\n call.input?.content ??\n payloadInput?.content ??\n call.payload?.content,\n call.output?.changes ??\n payloadOutput?.changes ??\n call.input?.changes ??\n payloadInput?.changes,\n call.toolName\n );\n if (fromContentDiff.length > 0) {\n return fromContentDiff;\n }\n\n const inputPath = firstString(\n stringValue(call.input?.file_path),\n stringValue(call.input?.filePath),\n stringValue(call.input?.path),\n stringValue(payloadInput?.file_path),\n stringValue(payloadInput?.filePath),\n stringValue(payloadInput?.path),\n firstLocationPath(inputLocations)\n );\n const unifiedDiff = firstString(\n stringValue(call.output?.patch),\n stringValue(payloadOutput?.patch),\n stringValue(call.output?.diff),\n stringValue(payloadOutput?.diff)\n );\n const path = firstString(\n inputPath,\n unifiedDiff ? extractAgentPatchPath(unifiedDiff) : null\n );\n if (!path) {\n return [];\n }\n\n const content = firstString(\n stringValue(call.input?.content),\n stringValue(payloadInput?.content),\n stringValue(rawInput?.content)\n );\n const oldString = firstString(\n stringValue(call.input?.old_string),\n stringValue(payloadInput?.old_string),\n stringValue(call.output?.oldString),\n stringValue(payloadOutput?.oldString)\n );\n const newString = firstString(\n stringValue(call.input?.new_string),\n stringValue(payloadInput?.new_string),\n stringValue(call.output?.newString),\n stringValue(payloadOutput?.newString)\n );\n const changeType = inferFileChangeType(\n call.toolName,\n unifiedDiff,\n content,\n oldString,\n newString\n );\n const normalizedUnifiedDiff =\n !unifiedDiff && oldString !== null && newString !== null\n ? syntheticUnifiedDiff(path, changeType, oldString, newString)\n : unifiedDiff;\n const lineStats = fileChangeStats(\n changeType,\n normalizedUnifiedDiff,\n content,\n oldString,\n newString\n );\n\n return [\n {\n path,\n changeType,\n language: languageForPath(path),\n content,\n oldString,\n newString,\n unifiedDiff: normalizedUnifiedDiff,\n added: lineStats.added,\n removed: lineStats.removed\n }\n ];\n}\n\nfunction structuredPatchFiles(value: unknown): AgentFileChangeRenderData[] {\n const patches = arrayValue(value);\n if (!patches) {\n return [];\n }\n return patches.flatMap((item) => {\n const patch = recordValue(item);\n const path = firstString(\n stringValue(patch?.filePath),\n stringValue(patch?.path)\n );\n const diff = firstString(\n stringValue(patch?.diff),\n stringValue(patch?.patch)\n );\n if (!path) {\n return [];\n }\n const oldString = firstString(\n stringValue(patch?.oldString),\n stringValue(patch?.old_string)\n );\n const newString = firstString(\n stringValue(patch?.newString),\n stringValue(patch?.new_string)\n );\n const content = firstString(stringValue(patch?.content), newString);\n if (!diff && !oldString && !newString && !content) {\n return [];\n }\n const changeType = firstKnownChangeType(\n normalizeChangeType(stringValue(patch?.kind)),\n normalizeChangeType(stringValue(patch?.change)),\n inferFileChangeType(null, diff, content, oldString, newString)\n );\n const stats = fileChangeStats(\n changeType,\n diff,\n content,\n oldString,\n newString\n );\n return [\n {\n path,\n changeType,\n language: languageForPath(path),\n content,\n oldString,\n newString,\n unifiedDiff: diff,\n added: stats.added,\n removed: stats.removed\n }\n ];\n });\n}\n\nfunction detailedDiffFiles(value: unknown): AgentFileChangeRenderData[] {\n const diff = stringValue(value);\n if (!diff) {\n return [];\n }\n const path = diffPath(diff);\n if (!path) {\n return [];\n }\n const stats = diffLineStats(diff);\n const changeType = inferFileChangeType(null, diff, null, null, null);\n return [\n {\n path,\n changeType,\n language: languageForPath(path),\n content: null,\n oldString: null,\n newString: null,\n unifiedDiff: diff,\n added: stats.added,\n removed: stats.removed\n }\n ];\n}\n\nfunction fileChangesFiles(value: unknown): AgentFileChangeRenderData[] {\n const record = recordValue(value);\n const files = arrayValue(record?.files);\n if (!files) {\n return [];\n }\n return files.flatMap((item) => {\n const file = recordValue(item);\n const path = stringValue(file?.path);\n if (!path) {\n return [];\n }\n const unifiedDiff = firstString(\n stringValue(file?.diff),\n stringValue(file?.patch),\n stringValue(file?.unifiedDiff),\n stringValue(file?.unified_diff)\n );\n const oldString = firstString(\n stringValue(file?.oldString),\n stringValue(file?.old_string)\n );\n const newString = firstString(\n stringValue(file?.newString),\n stringValue(file?.new_string)\n );\n const content = firstString(stringValue(file?.content), newString);\n const changeType = firstKnownChangeType(\n normalizeChangeType(stringValue(file?.change)),\n normalizeChangeType(stringValue(file?.kind)),\n inferFileChangeType(null, unifiedDiff, content, oldString, newString)\n );\n const stats = fileChangeStats(\n changeType,\n unifiedDiff,\n content,\n oldString,\n newString\n );\n return [\n {\n path,\n changeType,\n language: languageForPath(path),\n content,\n oldString,\n newString,\n unifiedDiff,\n added: stats.added,\n removed: stats.removed\n }\n ];\n });\n}\n\nfunction changeMapFiles(value: unknown): AgentFileChangeRenderData[] {\n return fileChangeEntriesFromChanges(value).flatMap((entry) => {\n const change = entry.change;\n const normalizedPath = entry.path.trim();\n if (!normalizedPath) {\n return [];\n }\n const unifiedDiff = firstString(\n stringValue(change.unified_diff),\n stringValue(change.unifiedDiff),\n stringValue(change.diff),\n stringValue(change.patch)\n );\n const explicitContent = stringValue(change.content);\n const normalizedType = normalizeChangeType(fileChangeTypeValue(change));\n let oldString = firstString(\n stringValue(change.old_string),\n stringValue(change.oldString)\n );\n let newString = firstString(\n stringValue(change.new_string),\n stringValue(change.newString),\n explicitContent\n );\n if (\n normalizedType === \"created\" &&\n oldString === null &&\n newString !== null\n ) {\n oldString = \"\";\n }\n if (\n normalizedType === \"deleted\" &&\n oldString === null &&\n newString !== null\n ) {\n oldString = newString;\n newString = \"\";\n }\n if (\n normalizedType === \"deleted\" &&\n newString === null &&\n oldString !== null\n ) {\n newString = \"\";\n }\n const content = firstString(\n normalizedType === \"deleted\" ? null : explicitContent,\n normalizedType === \"created\" ? newString : null\n );\n if (\n !unifiedDiff &&\n oldString === null &&\n newString === null &&\n content === null\n ) {\n return [];\n }\n const changeType = firstKnownChangeType(\n normalizedType,\n inferFileChangeType(null, unifiedDiff, content, oldString, newString)\n );\n const normalizedUnifiedDiff =\n !unifiedDiff && oldString !== null && newString !== null\n ? syntheticUnifiedDiff(normalizedPath, changeType, oldString, newString)\n : unifiedDiff;\n const stats = fileChangeStats(\n changeType,\n normalizedUnifiedDiff,\n content,\n oldString,\n newString\n );\n return [\n {\n path: normalizedPath,\n changeType,\n language: languageForPath(normalizedPath),\n content,\n oldString,\n newString,\n unifiedDiff: normalizedUnifiedDiff,\n added: stats.added,\n removed: stats.removed\n }\n ];\n });\n}\n\nfunction contentDiffFiles(\n value: unknown,\n changesValue: unknown,\n toolName: string | null\n): AgentFileChangeRenderData[] {\n const items = arrayValue(value);\n if (!items) {\n return [];\n }\n const changesByPath = new Map(\n fileChangeEntriesFromChanges(changesValue).map((entry) => [\n entry.path,\n entry.change\n ])\n );\n return items.flatMap((item) => {\n const record = recordValue(item);\n if (!record) {\n return [];\n }\n const type = stringValue(record.type);\n if (type && type !== \"diff\") {\n return [];\n }\n const path = stringValue(record.path);\n if (!path) {\n return [];\n }\n const relatedChange = changesByPath.get(path) ?? null;\n const unifiedDiff = firstString(\n stringValue(record.diff),\n stringValue(record.patch),\n stringValue(relatedChange?.unified_diff),\n stringValue(relatedChange?.unifiedDiff)\n );\n const normalizedType = normalizeChangeType(\n relatedChange ? fileChangeTypeValue(relatedChange) : null\n );\n let oldString = firstString(\n stringValue(record.oldText),\n stringValue(record.oldString),\n stringValue(relatedChange?.old_string),\n stringValue(relatedChange?.oldString)\n );\n let newString = firstString(\n stringValue(record.newText),\n stringValue(record.newString),\n stringValue(relatedChange?.new_string),\n stringValue(relatedChange?.newString),\n stringValue(relatedChange?.content)\n );\n if (\n normalizedType === \"created\" &&\n oldString === null &&\n newString !== null\n ) {\n oldString = \"\";\n }\n if (\n normalizedType === \"deleted\" &&\n oldString === null &&\n newString !== null\n ) {\n oldString = newString;\n newString = \"\";\n }\n if (\n normalizedType === \"deleted\" &&\n newString === null &&\n oldString !== null\n ) {\n newString = \"\";\n }\n const explicitContent = firstString(\n stringValue(record.content),\n stringValue(relatedChange?.content)\n );\n const changeType = firstKnownChangeType(\n normalizedType,\n inferFileChangeType(\n toolName,\n unifiedDiff,\n normalizedType === \"deleted\" ? null : explicitContent,\n oldString,\n newString\n )\n );\n if (changeType === \"created\" && oldString === null && newString !== null) {\n oldString = \"\";\n }\n const content = firstString(\n changeType === \"deleted\" ? null : explicitContent,\n changeType === \"created\" ? newString : null\n );\n if (\n !unifiedDiff &&\n oldString === null &&\n newString === null &&\n content === null\n ) {\n return [];\n }\n const normalizedUnifiedDiff =\n !unifiedDiff && oldString !== null && newString !== null\n ? syntheticUnifiedDiff(path, changeType, oldString, newString)\n : unifiedDiff;\n const stats = fileChangeStats(\n changeType,\n normalizedUnifiedDiff,\n content,\n oldString,\n newString\n );\n return [\n {\n path,\n changeType,\n language: languageForPath(path),\n content,\n oldString,\n newString,\n unifiedDiff: normalizedUnifiedDiff,\n added: stats.added,\n removed: stats.removed\n }\n ];\n });\n}\n\nfunction inferFileChangeType(\n toolName: string | null,\n unifiedDiff: string | null,\n content: string | null,\n oldString: string | null,\n newString: string | null\n): AgentFileChangeRenderData[\"changeType\"] {\n if (unifiedDiff) {\n return inferAgentPatchChangeType(unifiedDiff);\n }\n const normalizedToolName = normalizeToolName(toolName);\n if (normalizedToolName === \"write\" && (content || newString)) {\n return \"created\";\n }\n if (normalizedToolName === \"edit\" || oldString || newString) {\n return \"modified\";\n }\n return \"unknown\";\n}\n\nfunction normalizeChangeType(\n value: string | null\n): AgentFileChangeRenderData[\"changeType\"] {\n switch ((value ?? \"\").trim().toLowerCase()) {\n case \"add\":\n case \"create\":\n case \"created\":\n case \"added\":\n return \"created\";\n case \"edit\":\n case \"modify\":\n case \"modified\":\n case \"change\":\n case \"changed\":\n case \"update\":\n case \"updated\":\n return \"modified\";\n case \"delete\":\n case \"deleted\":\n case \"remove\":\n case \"removed\":\n return \"deleted\";\n default:\n return \"unknown\";\n }\n}\n\nfunction firstKnownChangeType(\n ...values: Array<AgentFileChangeRenderData[\"changeType\"]>\n): AgentFileChangeRenderData[\"changeType\"] {\n for (const value of values) {\n if (value !== \"unknown\") {\n return value;\n }\n }\n return \"unknown\";\n}\n\nfunction diffPath(value: string): string | null {\n const match = value.match(/^diff --git a\\/(.+?) b\\/(.+)$/m);\n return match?.[2]?.trim() ?? match?.[1]?.trim() ?? null;\n}\n\nfunction diffLineStats(value: string | null): {\n added: number;\n removed: number;\n} {\n if (!value) {\n return { added: 0, removed: 0 };\n }\n let added = 0;\n let removed = 0;\n value.split(\"\\n\").forEach((line) => {\n if (line.startsWith(\"+++\") || line.startsWith(\"---\")) {\n return;\n }\n if (line.startsWith(\"+\")) {\n added += 1;\n return;\n }\n if (line.startsWith(\"-\")) {\n removed += 1;\n }\n });\n return { added, removed };\n}\n\nfunction fileChangeStats(\n changeType: AgentFileChangeRenderData[\"changeType\"],\n unifiedDiff: string | null,\n content: string | null,\n oldString: string | null,\n newString: string | null\n): { added: number; removed: number } {\n if (unifiedDiff) {\n return diffLineStats(unifiedDiff);\n }\n if (changeType === \"created\") {\n return { added: countTextLines(content ?? newString), removed: 0 };\n }\n if (changeType === \"deleted\") {\n return { added: 0, removed: countTextLines(oldString) };\n }\n return { added: 0, removed: 0 };\n}\n\nfunction countTextLines(value: string | null): number {\n if (!value) {\n return 0;\n }\n const normalized = value.trimEnd();\n return normalized ? normalized.split(\"\\n\").length : 0;\n}\n\nfunction syntheticUnifiedDiff(\n path: string,\n changeType: AgentFileChangeRenderData[\"changeType\"],\n oldString: string,\n newString: string\n): string {\n const oldLines = patchLines(oldString);\n const newLines = patchLines(newString);\n switch (changeType) {\n case \"created\":\n return [\n `diff --git a/${path} b/${path}`,\n \"new file mode 100644\",\n \"--- /dev/null\",\n `+++ b/${path}`,\n `@@ -0,0 +1,${newLines.length} @@`,\n ...newLines.map((line) => `+${line}`)\n ].join(\"\\n\");\n case \"deleted\":\n return [\n `diff --git a/${path} b/${path}`,\n \"deleted file mode 100644\",\n `--- a/${path}`,\n \"+++ /dev/null\",\n `@@ -1,${oldLines.length} +0,0 @@`,\n ...oldLines.map((line) => `-${line}`)\n ].join(\"\\n\");\n default:\n return [\n `diff --git a/${path} b/${path}`,\n `--- a/${path}`,\n `+++ b/${path}`,\n `@@ -1,${oldLines.length} +1,${newLines.length} @@`,\n ...oldLines.map((line) => `-${line}`),\n ...newLines.map((line) => `+${line}`)\n ].join(\"\\n\");\n }\n}\n\nfunction patchLines(value: string): string[] {\n if (!value) {\n return [];\n }\n const normalized = value.endsWith(\"\\n\") ? value.slice(0, -1) : value;\n return normalized ? normalized.split(\"\\n\") : [];\n}\n\nfunction languageForPath(path: string): string | null {\n const extension = path.split(\".\").pop()?.toLowerCase();\n switch (extension) {\n case \"ts\":\n case \"tsx\":\n return \"typescript\";\n case \"js\":\n case \"jsx\":\n return \"javascript\";\n case \"go\":\n return \"go\";\n case \"md\":\n return \"markdown\";\n case \"json\":\n return \"json\";\n default:\n return extension || null;\n }\n}\n\nfunction normalizeToolName(value: string | null): string {\n return (value ?? \"\")\n .trim()\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n\nfunction firstString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction firstLocationPath(value: unknown[] | null): string | null {\n if (!value) {\n return null;\n }\n for (const item of value) {\n const record = recordValue(item);\n const path = stringValue(record?.path);\n if (path) {\n return path;\n }\n }\n return null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n","import type { AgentToolCallVM } from \"../../../contracts/agentToolCallVM\";\nimport { extractImageGenerationPreview } from \"../../../../imageGenerationTool\";\nimport type { AgentTaskStepVM } from \"../../../contracts/agentTaskItemVM\";\nimport type {\n AgentCommandRenderData,\n AgentCommandStatus,\n AgentImageGenerationRenderData,\n AgentMcpRenderData,\n AgentPlanModeRenderData,\n AgentSearchRenderData,\n AgentSkillRenderData,\n AgentTaskRenderData,\n AgentTodoRenderData,\n AgentToolFallbackText,\n AgentToolSearchRenderData,\n AgentWebFetchRenderData,\n AgentWebSearchRenderData\n} from \"./agentToolRenderDataTypes\";\nexport type * from \"./agentToolRenderDataTypes\";\nexport {\n getFileChangeRenderData,\n type AgentFileChangeRenderData\n} from \"./agentToolFileChangeRenderData\";\n\nexport function getCommandRenderData(\n call: AgentToolCallVM\n): AgentCommandRenderData {\n const inputRawInput = recordValue(call.input?.rawInput);\n const payloadInput = recordValue(call.payload?.input);\n const payloadInputRawInput = recordValue(payloadInput?.rawInput);\n const outputRawOutput = recordValue(call.output?.rawOutput);\n const errorRawOutput = recordValue(call.error?.rawOutput);\n return {\n command: firstString(\n stringValue(call.input?.command),\n stringValue(call.input?.cmd),\n commandArrayToString(call.input?.command),\n stringValue(inputRawInput?.command),\n stringValue(inputRawInput?.cmd),\n stringValue(call.payload?.command),\n stringValue(payloadInput?.command),\n stringValue(payloadInputRawInput?.command),\n stringValue(payloadInputRawInput?.cmd)\n ),\n cwd: firstString(\n stringValue(call.input?.cwd),\n stringValue(inputRawInput?.cwd),\n stringValue(payloadInput?.cwd),\n stringValue(payloadInputRawInput?.cwd)\n ),\n stdout:\n firstRawString(\n rawStringValue(call.output?.stdout),\n rawStringValue(call.output?.output),\n rawStringValue(call.output?.aggregated_output),\n rawStringValue(call.output?.formatted_output),\n rawStringValue(call.output?.rawOutput),\n rawStringValue(outputRawOutput?.stdout),\n rawStringValue(outputRawOutput?.output),\n rawStringValue(outputRawOutput?.aggregated_output),\n contentText(call.output?.content),\n rawStringValue(call.output?.text),\n rawStringValue(call.error?.aggregated_output),\n rawStringValue(call.error?.stdout),\n rawStringValue(call.error?.formatted_output),\n rawStringValue(call.error?.rawOutput),\n rawStringValue(errorRawOutput?.stdout),\n rawStringValue(errorRawOutput?.output),\n rawStringValue(errorRawOutput?.aggregated_output)\n ) ?? \"\",\n stderr:\n firstRawString(\n rawStringValue(call.output?.stderr),\n rawStringValue(outputRawOutput?.stderr),\n rawStringValue(call.error?.stderr),\n rawStringValue(errorRawOutput?.stderr)\n ) ?? \"\",\n exitCode:\n numberValue(call.output?.exit_code) ??\n numberValue(call.output?.exitCode) ??\n numberValue(outputRawOutput?.exit_code) ??\n numberValue(outputRawOutput?.exitCode) ??\n numberValue(call.error?.exit_code) ??\n numberValue(call.error?.exitCode) ??\n numberValue(errorRawOutput?.exit_code) ??\n numberValue(errorRawOutput?.exitCode),\n durationMs:\n durationToMs(call.output?.duration) ??\n numberValue(call.output?.duration_ms) ??\n numberValue(call.output?.durationMs) ??\n durationToMs(outputRawOutput?.duration) ??\n numberValue(outputRawOutput?.duration_ms) ??\n numberValue(outputRawOutput?.durationMs) ??\n durationToMs(call.error?.duration) ??\n durationToMs(errorRawOutput?.duration) ??\n numberValue(errorRawOutput?.duration_ms) ??\n numberValue(errorRawOutput?.durationMs),\n status: normalizeCommandStatus(call.statusKind ?? call.status)\n };\n}\n\nexport function getSearchRenderData(\n call: AgentToolCallVM\n): AgentSearchRenderData {\n const canonicalContent = contentText(call.content);\n const canonicalFiles = locationPaths(call.locations);\n const output =\n firstString(\n canonicalContent,\n contentText(call.output?.content),\n stringValue(call.output?.content),\n stringValue(call.output?.output),\n stringValue(call.output?.aggregated_output),\n stringValue(call.output?.formatted_output),\n stringValue(call.output?.stdout),\n stringValue(call.summary),\n \"\"\n ) ?? \"\";\n const outputLines = output.split(\"\\n\").filter(Boolean);\n const mode =\n canonicalFiles.length > 0 && !output\n ? \"list_files\"\n : searchMode(call.output, output);\n const filenames =\n canonicalFiles.length > 0\n ? canonicalFiles\n : stringArray(call.output?.filenames);\n return {\n query: firstString(\n stringValue(call.input?.pattern),\n stringValue(call.input?.query),\n stringValue(call.input?.search_query),\n stringValue(call.input?.searchQuery),\n stringValue(call.input?.glob)\n ),\n scope: firstString(\n stringValue(call.input?.path),\n stringValue(call.input?.file_path),\n stringValue(call.input?.glob)\n ),\n mode,\n files:\n filenames.length > 0\n ? filenames\n : mode === \"list_files\"\n ? outputLines\n : [],\n lines: outputLines,\n output,\n error:\n firstString(\n stringValue(call.error?.aggregated_output),\n stringValue(call.error?.stdout),\n stringValue(call.error?.formatted_output),\n stringValue(call.error?.message)\n ) ?? \"\"\n };\n}\n\nexport function getWebSearchRenderData(\n call: AgentToolCallVM\n): AgentWebSearchRenderData {\n const queries = normalizedQueries(\n call.input?.search_query,\n call.input?.searchQuery,\n recordValue(call.input?.action)?.search_query,\n recordValue(call.input?.action)?.searchQuery\n );\n return {\n query: firstString(\n stringValue(call.input?.query),\n stringValue(recordValue(call.input?.action)?.query),\n queries[0] ?? null\n ),\n queries,\n url: firstString(\n stringValue(call.input?.url),\n stringValue(recordValue(call.input?.action)?.url)\n ),\n output:\n firstString(\n stringValue(call.output?.text),\n contentText(call.content),\n contentText(call.output?.content),\n stringValue(call.output?.stdout),\n stringValue(call.output?.output),\n stringValue(call.output?.content)\n ) ?? \"\",\n error:\n firstString(\n stringValue(call.error?.message),\n stringValue(call.error?.stdout)\n ) ?? \"\"\n };\n}\n\nexport function getWebFetchRenderData(\n call: AgentToolCallVM,\n maxContentLength = 3000\n): AgentWebFetchRenderData {\n const url = firstString(\n stringValue(call.input?.url),\n stringValue(recordValue(call.input?.action)?.url)\n );\n const content = firstString(\n contentText(call.content),\n contentText(call.output?.content),\n stringValue(call.output?.output),\n stringValue(call.output?.content),\n stringValue(call.output?.stdout)\n );\n return {\n url,\n domain: domainForUrl(url),\n content,\n visibleContent: content ? content.slice(0, maxContentLength) : null,\n isTruncated: Boolean(content && content.length > maxContentLength)\n };\n}\n\nexport function getTodoRenderData(\n call: AgentToolCallVM\n): AgentTodoRenderData[] {\n const todos = arrayValue(call.input?.todos);\n if (!todos) {\n return [];\n }\n return todos.flatMap((todo) => {\n const record = recordValue(todo);\n const content = firstString(\n stringValue(record?.content),\n stringValue(record?.text)\n );\n if (!content) {\n return [];\n }\n return [{ content, status: stringValue(record?.status) }];\n });\n}\n\nexport function getMcpRenderData(call: AgentToolCallVM): AgentMcpRenderData {\n return {\n server: firstString(\n stringValue(call.metadata?.server),\n stringValue(call.metadata?.serverName),\n stringValue(call.metadata?.mcpServer)\n ),\n tool: call.toolName,\n summary: stringValue(call.summary),\n output:\n firstString(\n stringValue(call.output?.content),\n stringValue(call.output?.output),\n stringValue(call.output?.stdout)\n ) ?? \"\"\n };\n}\n\nexport function getToolSearchRenderData(\n call: AgentToolCallVM\n): AgentToolSearchRenderData {\n const query = stringValue(call.input?.query);\n const matches =\n arrayValue(call.output?.matches)\n ?.map(stringValue)\n .filter((value): value is string => value !== null) ?? [];\n const totalDeferredTools =\n numberValue(call.output?.total_deferred_tools) ??\n numberValue(call.output?.totalDeferredTools) ??\n numberValue(recordValue(call.payload?.output)?.total_deferred_tools);\n const mode: AgentToolSearchRenderData[\"mode\"] = query?.startsWith(\"select:\")\n ? \"direct\"\n : \"search\";\n const displayQuery = query?.startsWith(\"select:\")\n ? query.slice(\"select:\".length)\n : query?.startsWith(\"+\")\n ? query.slice(1)\n : query;\n return {\n query,\n displayQuery: displayQuery ?? null,\n mode,\n matches,\n totalDeferredTools\n };\n}\n\nexport function getPlanModeRenderData(\n call: AgentToolCallVM\n): AgentPlanModeRenderData {\n const enterText =\n call.rendererKind === \"plan-enter\"\n ? firstString(\n stringValue(call.planMode?.plan),\n stringValue(call.output?.text),\n stringValue(call.input?.content),\n nonEmpty(call.summary),\n \"Exploring codebase and designing implementation approach.\"\n )\n : null;\n const filePath = firstString(\n stringValue(call.input?.filePath),\n stringValue(call.input?.file_path)\n );\n return {\n enterText,\n plan:\n call.rendererKind === \"plan-enter\"\n ? null\n : firstString(\n stringValue(call.input?.plan),\n stringValue(call.payload?.plan),\n nonEmpty(call.summary)\n ),\n filePath,\n fileName: filePath ? (filePath.split(\"/\").pop() ?? null) : null\n };\n}\n\nexport function getTaskRenderData(call: AgentToolCallVM): AgentTaskRenderData {\n const task = call.task;\n const steps: AgentTaskStepVM[] =\n task?.steps ?? normalizeTaskStepsFromCall(call);\n const outputRawOutput = recordValue(call.output?.rawOutput);\n const errorRawOutput = recordValue(call.error?.rawOutput);\n return {\n title: task?.title ?? call.name,\n status:\n task?.status ??\n stringValue(call.metadata?.taskStatus) ??\n stringValue(call.metadata?.subagentStatus),\n durationText:\n typeof task?.durationMs === \"number\" && Number.isFinite(task.durationMs)\n ? formatDuration(task.durationMs)\n : null,\n latestStepSummary:\n task?.status === \"running\" ? (steps.at(-1)?.summary ?? null) : null,\n prompt: firstString(\n stringValue(task?.prompt),\n stringValue(call.input?.prompt),\n stringValue(call.input?.description),\n stringValue(call.payload?.description)\n ),\n childSessionId: firstString(\n stringValue(task?.delegateSessionId),\n stringValue(call.metadata?.childSessionID),\n stringValue(call.metadata?.child_session_id),\n stringValue(call.metadata?.subagentSessionID),\n stringValue(call.metadata?.subagent_session_id),\n stringValue(call.metadata?.subagentAgentId),\n stringValue(call.metadata?.agentId)\n ),\n steps,\n resultMarkdown: firstString(\n stringValue(task?.resultMarkdown),\n firstNonEmptyStructuredText(call.output, outputRawOutput)\n ),\n errorMarkdown: firstNonEmptyStructuredText(call.error, errorRawOutput)\n };\n}\n\nexport function getSkillRenderData(\n call: AgentToolCallVM\n): AgentSkillRenderData {\n const inputRawInput = recordValue(call.input?.rawInput);\n const outputRawOutput = call.output?.rawOutput;\n const success =\n booleanValue(call.output?.success) ??\n legacySkillSuccess(outputRawOutput) ??\n booleanValue(recordValue(outputRawOutput)?.success);\n return {\n skill: firstString(\n stringValue(call.input?.skill),\n stringValue(inputRawInput?.skill),\n stringValue(call.output?.commandName),\n stringValue(recordValue(outputRawOutput)?.commandName),\n nonEmpty(call.summary)\n ),\n args: firstString(\n stringValue(call.input?.args),\n stringValue(inputRawInput?.args)\n ),\n success,\n statusText:\n success === null\n ? null\n : success\n ? \"Skill loaded\"\n : \"Failed to load skill\"\n };\n}\n\nexport function getImageGenerationRenderData(\n call: AgentToolCallVM\n): AgentImageGenerationRenderData {\n const preview = extractImageGenerationPreview({\n toolName: call.toolName,\n displayName: call.name,\n content: call.content,\n outputContent: call.output?.content,\n outputSavedPath: call.output?.savedPath ?? call.output?.saved_path,\n inputPrompt: call.input?.prompt,\n payloadInputPrompt: recordValue(call.payload?.input)?.prompt\n });\n return {\n prompt: preview.prompt,\n imageUri: preview.imageUri,\n mimeType: preview.mimeType\n };\n}\n\nfunction legacySkillSuccess(value: unknown): boolean | null {\n if (typeof value !== \"string\" || !value.trim()) {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n if (\n normalized.includes(\"failed\") ||\n normalized.includes(\"error\") ||\n normalized.includes(\"unable\") ||\n normalized.includes(\"not found\")\n ) {\n return false;\n }\n if (\n normalized.includes(\"launching skill:\") ||\n normalized.includes(\"skill loaded\") ||\n normalized.includes(\"loaded skill\")\n ) {\n return true;\n }\n return null;\n}\n\nexport function getToolFallbackText(\n call: AgentToolCallVM\n): AgentToolFallbackText {\n return {\n summary: nonEmpty(call.summary),\n input: structuredText(call.input),\n output: structuredText(call.output),\n error: structuredText(call.error)\n };\n}\n\nfunction normalizeTaskStepsFromCall(call: AgentToolCallVM): AgentTaskStepVM[] {\n const steps =\n arrayValue(call.metadata?.steps) ??\n arrayValue(call.output?.steps) ??\n arrayValue(call.payload?.steps) ??\n [];\n return steps.flatMap((value, index) => {\n const step = recordValue(value);\n if (!step) {\n return [];\n }\n const toolName =\n stringValue(step.toolName) ??\n stringValue(step.tool_name) ??\n stringValue(step.name) ??\n null;\n const name = toolName ? humanizeToolName(toolName) : `Step ${index + 1}`;\n const status =\n stringValue(step.status) ??\n stringValue(recordValue(step.toolResult)?.status) ??\n stringValue(recordValue(step.tool_result)?.status) ??\n null;\n const summary =\n firstNonEmptyStructuredText(\n recordValue(step.toolResult),\n recordValue(step.tool_result),\n recordValue(step.toolInput),\n recordValue(step.tool_input)\n ) ?? \"\";\n return [\n {\n id:\n stringValue(step.toolUseId) ??\n stringValue(step.id) ??\n `step-${index + 1}`,\n turnId: call.turnId,\n name,\n toolName,\n status,\n summary,\n payload: {\n input: recordValue(step.toolInput) ?? recordValue(step.tool_input),\n output: recordValue(step.toolResult) ?? recordValue(step.tool_result),\n error: recordValue(step.toolError) ?? recordValue(step.tool_error)\n },\n tool: null,\n occurredAtUnixMs: null\n }\n ];\n });\n}\n\nfunction humanizeToolName(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[_-]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/^\\w/, (match) => match.toUpperCase());\n}\n\nfunction firstNonEmptyStructuredText(...values: Array<unknown>): string | null {\n for (const value of values) {\n const text = structuredText(value);\n if (text) {\n return text;\n }\n }\n return null;\n}\n\nfunction booleanValue(value: unknown): boolean | null {\n return typeof value === \"boolean\" ? value : null;\n}\n\nexport function formatAgentToolDurationMs(value: number): string {\n return formatDuration(value);\n}\n\nfunction formatDuration(value: number): string {\n if (value < 1000) {\n return `${value}ms`;\n }\n if (value < 60_000) {\n return `${(value / 1000).toFixed(value >= 10_000 ? 0 : 1)}s`;\n }\n const minutes = Math.floor(value / 60_000);\n const seconds = Math.round((value % 60_000) / 1000);\n return `${minutes}m ${seconds}s`;\n}\n\nfunction domainForUrl(url: string | null): string | null {\n if (!url) {\n return null;\n }\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return url;\n }\n}\n\nfunction normalizeCommandStatus(\n value: string | null | undefined\n): AgentCommandStatus {\n switch ((value ?? \"\").trim().toLowerCase()) {\n case \"working\":\n case \"running\":\n case \"in_progress\":\n return \"running\";\n case \"completed\":\n case \"done\":\n return \"completed\";\n case \"failed\":\n case \"error\":\n return \"failed\";\n default:\n return \"unknown\";\n }\n}\n\nfunction searchMode(\n output: Record<string, unknown> | null,\n outputText: string\n): AgentSearchRenderData[\"mode\"] {\n const mode = stringValue(output?.mode);\n if (\n mode === \"files_with_matches\" ||\n mode === \"content\" ||\n mode === \"count\" ||\n mode === \"list_files\"\n ) {\n return mode;\n }\n if (stringArray(output?.filenames).length > 0) {\n return \"files_with_matches\";\n }\n if (outputText.includes(\":\")) {\n return \"content\";\n }\n return \"unknown\";\n}\n\nfunction commandArrayToString(value: unknown): string | null {\n const array = arrayValue(value);\n if (!array) {\n return null;\n }\n const parts = array.flatMap((item) =>\n typeof item === \"string\" && item.trim() ? [item.trim()] : []\n );\n return parts.length > 0 ? parts.join(\" \") : null;\n}\n\nfunction durationToMs(value: unknown): number | null {\n const record = recordValue(value);\n if (!record) {\n return null;\n }\n const secs = numberValue(record.secs) ?? 0;\n const nanos = numberValue(record.nanos) ?? 0;\n if (secs === 0 && nanos === 0) {\n return null;\n }\n return secs * 1000 + nanos / 1_000_000;\n}\n\nfunction contentText(value: unknown): string | null {\n const items = arrayValue(value);\n if (!items) {\n return null;\n }\n const text = items\n .flatMap((item) => {\n const record = recordValue(item);\n if (!record) {\n return [];\n }\n return [\n firstString(\n stringValue(record.text),\n stringValue(record.content),\n stringValue(recordValue(record.content)?.text)\n )\n ].filter(Boolean) as string[];\n })\n .join(\"\\n\")\n .trim();\n return text || null;\n}\n\nfunction structuredText(value: unknown): string | null {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n const record = recordValue(value);\n if (!record) {\n return null;\n }\n const preferred = firstString(\n stringValue(record.plan),\n stringValue(record.text),\n stringValue(record.output),\n stringValue(record.content),\n contentText(record.content),\n stringValue(record.summary),\n stringValue(record.result),\n stringValue(record.message),\n stringValue(record.aggregated_output),\n stringValue(record.formatted_output),\n stringValue(record.stdout),\n stringValue(record.stderr),\n stringValue(record.query),\n stringValue(record.path),\n stringValue(record.file),\n stringValue(record.filePath),\n stringValue(record.file_path),\n stringValue(record.url),\n stringValue(record.cmd),\n stringValue(record.command)\n );\n if (preferred) {\n return preferred;\n }\n return null;\n}\n\nfunction firstString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction firstRawString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) {\n return value;\n }\n }\n return null;\n}\n\nfunction nonEmpty(value: string | null | undefined): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction rawStringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value : null;\n}\n\nfunction numberValue(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction stringArray(value: unknown): string[] {\n const array = arrayValue(value);\n if (!array) {\n return [];\n }\n return array.flatMap((item) =>\n typeof item === \"string\" && item.trim() ? [item.trim()] : []\n );\n}\n\nfunction normalizedQueries(...values: Array<unknown>): string[] {\n for (const value of values) {\n const queries = stringArray(value);\n if (queries.length > 0) {\n return queries;\n }\n }\n return [];\n}\n\nfunction locationPaths(value: unknown): string[] {\n const locations = arrayValue(value);\n if (!locations) {\n return [];\n }\n const paths = locations.flatMap((location) => {\n const record = recordValue(location);\n if (!record) {\n return [];\n }\n return [\n firstString(\n stringValue(record.path),\n stringValue(record.filePath),\n stringValue(record.file_path)\n )\n ].filter((path): path is string => path !== null);\n });\n return Array.from(new Set(paths));\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { translate } from \"../../../../../i18n/index\";\nimport { AgentPathTailLabel } from \"../AgentPathTailLabel\";\n\nconst MAX_VISIBLE_LINES = 120;\n\nexport function AgentCodeBlock({\n path,\n content,\n language,\n showHeader = true,\n collapsible = false,\n flat = false\n}: {\n path?: string | null;\n content: string;\n language?: string | null;\n showHeader?: boolean;\n collapsible?: boolean;\n flat?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n const normalized = content.trimEnd();\n const lines = useMemo(\n () => (normalized ? normalized.split(\"\\n\") : []),\n [normalized]\n );\n const lineCount = lines.length;\n const truncated = collapsible && !expanded && lineCount > MAX_VISIBLE_LINES;\n const visibleContent = truncated\n ? lines.slice(0, MAX_VISIBLE_LINES).join(\"\\n\")\n : normalized;\n const visibleLines = useMemo(\n () =>\n (truncated ? lines.slice(0, MAX_VISIBLE_LINES) : lines).map(\n (line, lineIndex) => ({\n key: `${lineIndex + 1}:${line}`,\n line,\n lineNumber: lineIndex + 1\n })\n ),\n [lines, truncated]\n );\n const addedCount = lineCount;\n const fileLabel = fileNameFromPath(path) ?? path ?? \"Code\";\n if (!normalized) {\n return null;\n }\n const disclosureButton =\n collapsible && lineCount > MAX_VISIBLE_LINES ? (\n <button\n type=\"button\"\n className=\"flex w-full items-center px-3 py-2 text-left text-[11px] font-medium text-[var(--tutti-purple)] transition-colors\"\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded\n ? translate(\"agentHost.agentTool.details.collapseContent\")\n : translate(\"agentHost.agentTool.details.showFullContent\", {\n count: lineCount\n })}\n </button>\n ) : null;\n return (\n <div\n className={`workspace-agents-status-panel__detail-tool-code overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] ${\n flat ? \"workspace-agents-status-panel__detail-tool-code--flat\" : \"\"\n }`}\n >\n {flat ? (\n <>\n {showHeader ? (\n <div className=\"flex items-center justify-between gap-3 border-b border-[var(--line-2)] bg-[var(--transparency-block)] px-3 py-1.5 text-[11px]\">\n <span\n className=\"truncate font-[var(--tsh-font-mono)] text-[var(--text-secondary)]\"\n title={path ?? undefined}\n >\n {fileLabel}\n </span>\n <span className=\"shrink-0 font-semibold text-[var(--state-success)]\">\n +{addedCount}\n </span>\n </div>\n ) : null}\n <div className=\"workspace-agents-status-panel__detail-scroll-region max-h-[240px] overflow-auto bg-[var(--background-panel)]\">\n {visibleLines.map((line) => (\n <div\n key={line.key}\n className=\"grid grid-cols-[56px_minmax(0,1fr)] border-l-[3px] border-l-[var(--state-success)] font-[var(--tsh-font-mono)] text-[11px] leading-6\"\n >\n <div className=\"select-none px-2.5 text-right text-[color:color-mix(in_srgb,var(--state-success)_90%,transparent)]\">\n {line.lineNumber}\n </div>\n <pre className=\"m-0 overflow-x-auto px-3 py-0 text-[var(--text-primary)]\">\n <code>{line.line || \" \"}</code>\n </pre>\n </div>\n ))}\n {disclosureButton}\n </div>\n </>\n ) : (\n <>\n {showHeader ? (\n <div className=\"flex items-center justify-between gap-3 border-b border-[var(--line-2)] bg-[var(--transparency-block)] px-3 py-1.5 text-[11px] text-[var(--text-secondary)]\">\n <AgentPathTailLabel\n path={path}\n fallback=\"Code\"\n className=\"font-[var(--tsh-font-mono)]\"\n />\n <span className=\"shrink-0\">\n {language ? `${language} · ` : \"\"}\n {lineCount} lines\n </span>\n </div>\n ) : null}\n <pre className=\"workspace-agents-status-panel__detail-scroll-region max-h-[200px] overflow-auto px-3 py-2 text-[11px] leading-5 text-[var(--text-primary)]\">\n <code>{visibleContent}</code>\n </pre>\n {disclosureButton}\n </>\n )}\n </div>\n );\n}\n\nfunction fileNameFromPath(path: string | null | undefined): string | null {\n if (!path) {\n return null;\n }\n const normalized = path.trim();\n if (!normalized) {\n return null;\n }\n const segments = normalized.split(\"/\");\n return segments[segments.length - 1] || normalized;\n}\n","import type { JSX } from \"react\";\n\ninterface AgentPathTailLabelProps {\n path?: string | null;\n fallback: string;\n className?: string;\n}\n\nexport function AgentPathTailLabel({\n path,\n fallback,\n className\n}: AgentPathTailLabelProps): JSX.Element {\n \"use memo\";\n const label = path?.trim() || fallback;\n const parts = splitPathTail(label);\n\n if (!parts) {\n return (\n <span\n className={`agent-path-tail-label ${className ?? \"\"}`}\n title={path ?? undefined}\n >\n <span className=\"agent-path-tail-label__file\">{label}</span>\n </span>\n );\n }\n\n return (\n <span\n className={`agent-path-tail-label ${className ?? \"\"}`}\n title={path ?? undefined}\n >\n <span className=\"agent-path-tail-label__directory\">\n {parts.directory}\n </span>\n <span className=\"agent-path-tail-label__file\">{parts.fileName}</span>\n </span>\n );\n}\n\nfunction splitPathTail(\n value: string\n): { directory: string; fileName: string } | null {\n const lastForwardSlash = value.lastIndexOf(\"/\");\n const lastBackwardSlash = value.lastIndexOf(\"\\\\\");\n const lastSeparator = Math.max(lastForwardSlash, lastBackwardSlash);\n if (lastSeparator <= 0 || lastSeparator === value.length - 1) {\n return null;\n }\n return {\n directory: value.slice(0, lastSeparator + 1),\n fileName: value.slice(lastSeparator + 1)\n };\n}\n","import { lazy, Suspense, type JSX } from \"react\";\nimport { AtomIcon } from \"../../../../../app/renderer/components/icons/AtomIcon\";\nimport { translate } from \"../../../../../i18n/index\";\nimport { AgentPathTailLabel } from \"../AgentPathTailLabel\";\n\nconst MonacoDiffEditor = lazy(async () => {\n const module = await import(\"@monaco-editor/react\");\n return { default: module.DiffEditor };\n});\n\nexport function AgentMonacoDiffViewer({\n path,\n oldValue,\n newValue,\n flat = false,\n showHeader = true\n}: {\n path?: string | null;\n oldValue: string;\n newValue: string;\n flat?: boolean;\n showHeader?: boolean;\n}): JSX.Element {\n \"use memo\";\n return (\n <div\n className={`overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] ${\n flat ? \"workspace-agents-status-panel__detail-tool-monaco--flat\" : \"\"\n }`}\n >\n {showHeader ? (\n <div\n className=\"border-b border-[var(--line-2)] bg-[var(--transparency-block)] px-3 py-1.5 text-[11px] text-[var(--text-secondary)]\"\n data-agent-diff-header=\"true\"\n >\n <AgentPathTailLabel\n path={path}\n fallback=\"Diff\"\n className=\"font-[var(--tsh-font-mono)]\"\n />\n </div>\n ) : null}\n <div className=\"h-[220px] bg-[var(--background-panel)]\">\n <Suspense\n fallback={\n <div className=\"flex items-center gap-1.5 px-3 py-2.5 text-[11px] text-[var(--text-secondary)]\">\n <AtomIcon\n size={14}\n active\n aria-hidden=\"true\"\n className=\"shrink-0\"\n />\n <span>\n {translate(\"agentHost.agentTool.details.loadingDiff\")}\n </span>\n </div>\n }\n >\n <MonacoDiffEditor\n original={oldValue}\n modified={newValue}\n language={languageForPath(path)}\n options={{\n readOnly: true,\n renderSideBySide: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n wordWrap: \"on\",\n automaticLayout: true\n }}\n />\n </Suspense>\n </div>\n </div>\n );\n}\n\nfunction languageForPath(path: string | null | undefined): string {\n const extension = path?.split(\".\").pop()?.toLowerCase();\n switch (extension) {\n case \"ts\":\n case \"tsx\":\n return \"typescript\";\n case \"js\":\n case \"jsx\":\n return \"javascript\";\n case \"go\":\n return \"go\";\n case \"md\":\n return \"markdown\";\n case \"json\":\n return \"json\";\n default:\n return \"plaintext\";\n }\n}\n","import type { HTMLAttributes, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef\n} from \"react\";\nimport {\n motion,\n useAnimation,\n useReducedMotion,\n type Variants\n} from \"framer-motion\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface AtomIconHandle {\n startAnimation: () => void;\n stopAnimation: () => void;\n}\n\ninterface AtomIconProps extends HTMLAttributes<HTMLDivElement> {\n size?: number;\n active?: boolean;\n}\n\nconst ATOM_ICON_ANIMATION_DURATION = 0.75;\nconst ATOM_ICON_REPEAT_DELAY = 1.5;\n\nconst PATH_VARIANTS: Variants = {\n normal: (custom: number) => ({\n opacity: 1,\n pathLength: 1,\n pathOffset: 0,\n transition: {\n duration: ATOM_ICON_ANIMATION_DURATION,\n ease: \"easeInOut\",\n delay: custom\n }\n }),\n animate: (custom: number) => ({\n opacity: [0, 1],\n pathLength: [0, 1],\n pathOffset: [1, 0],\n transition: {\n duration: ATOM_ICON_ANIMATION_DURATION,\n ease: \"easeInOut\",\n delay: custom\n }\n }),\n active: (custom: number) => ({\n opacity: [0, 1],\n pathLength: [0, 1],\n pathOffset: [1, 0],\n transition: {\n duration: ATOM_ICON_ANIMATION_DURATION,\n ease: \"easeInOut\",\n delay: custom,\n repeat: Infinity,\n repeatDelay: ATOM_ICON_REPEAT_DELAY\n }\n })\n};\n\nconst AtomIcon = forwardRef<AtomIconHandle, AtomIconProps>(\n (\n {\n active = false,\n onMouseEnter,\n onMouseLeave,\n className,\n size = 28,\n ...props\n },\n ref\n ) => {\n const controls = useAnimation();\n const reduceMotion = useReducedMotion();\n const isControlledRef = useRef(false);\n\n const startAnimation = useCallback(() => {\n if (reduceMotion) {\n return;\n }\n void controls.start(active ? \"active\" : \"animate\");\n }, [active, controls, reduceMotion]);\n\n const stopAnimation = useCallback(() => {\n void controls.start(\"normal\");\n }, [controls]);\n\n useImperativeHandle(ref, () => {\n isControlledRef.current = true;\n\n return {\n startAnimation,\n stopAnimation\n };\n });\n\n useEffect(() => {\n if (active) {\n startAnimation();\n return;\n }\n stopAnimation();\n }, [active, startAnimation, stopAnimation]);\n\n const handleMouseEnter = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseEnter?.(event);\n } else {\n startAnimation();\n }\n },\n [onMouseEnter, startAnimation]\n );\n\n const handleMouseLeave = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (isControlledRef.current) {\n onMouseLeave?.(event);\n } else {\n stopAnimation();\n }\n },\n [onMouseLeave, stopAnimation]\n );\n\n return (\n <div\n className={cn(\"inline-flex items-center justify-center\", className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n <svg\n fill=\"none\"\n height={size}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <motion.circle\n animate={controls}\n custom={0}\n cx=\"12\"\n cy=\"12\"\n r=\"1\"\n variants={PATH_VARIANTS}\n />\n <motion.path\n animate={controls}\n custom={0.3}\n d=\"M20.2 20.2c2.04-2.03.02-7.36-4.5-11.9-4.54-4.52-9.87-6.54-11.9-4.5-2.04 2.03-.02 7.36 4.5 11.9 4.54 4.52 9.87 6.54 11.9 4.5Z\"\n variants={PATH_VARIANTS}\n />\n <motion.path\n animate={controls}\n custom={0.6}\n d=\"M15.7 15.7c4.52-4.54 6.54-9.87 4.5-11.9-2.03-2.04-7.36-.02-11.9 4.5-4.52 4.54-6.54 9.87-4.5 11.9 2.03 2.04 7.36.02 11.9-4.5Z\"\n variants={PATH_VARIANTS}\n />\n </svg>\n </div>\n );\n }\n);\n\nAtomIcon.displayName = \"AtomIcon\";\n\nexport { AtomIcon };\n","import { useMemo, useState, type JSX } from \"react\";\nimport { translate } from \"../../../../../i18n/index\";\nimport { AgentToolScrollArea } from \"../AgentToolScrollArea\";\nimport { AgentPathTailLabel } from \"../AgentPathTailLabel\";\nimport {\n parseAgentUnifiedDiffLines,\n parseAgentUnifiedDiffStats\n} from \"./agentUnifiedDiff\";\n\nconst MAX_VISIBLE_LINES = 120;\n\nexport function AgentUnifiedPatchViewer({\n path,\n diffText,\n showHeader = true,\n collapsible = false,\n compact = false,\n flat = false\n}: {\n path?: string | null;\n diffText: string;\n showHeader?: boolean;\n collapsible?: boolean;\n compact?: boolean;\n flat?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n const normalized = diffText.trimEnd();\n const lines = useMemo(\n () => (normalized ? visiblePatchLines(normalized, compact) : []),\n [compact, normalized]\n );\n const diffLines = useMemo(\n () => (flat && normalized ? parseAgentUnifiedDiffLines(normalized) : []),\n [flat, normalized]\n );\n const stats = useMemo(\n () =>\n normalized\n ? parseAgentUnifiedDiffStats(normalized)\n : { added: 0, removed: 0 },\n [normalized]\n );\n const fileLabel = fileNameFromPath(path) ?? path ?? \"Patch\";\n const truncated =\n collapsible && !expanded && lines.length > MAX_VISIBLE_LINES;\n const visibleLines = useMemo(\n () =>\n (truncated ? lines.slice(0, MAX_VISIBLE_LINES) : lines).map(\n (line, lineIndex) => ({\n key: `${lineIndex + 1}:${line}`,\n line\n })\n ),\n [lines, truncated]\n );\n const visibleDiffLines = useMemo(\n () =>\n (collapsible && !expanded && diffLines.length > MAX_VISIBLE_LINES\n ? diffLines.slice(0, MAX_VISIBLE_LINES)\n : diffLines\n ).map((line) => ({\n key: `${line.kind}:${line.oldLineNumber ?? \"x\"}:${line.newLineNumber ?? \"x\"}:${line.text}`,\n line\n })),\n [collapsible, diffLines, expanded]\n );\n if (!normalized) {\n return null;\n }\n const disclosureButton =\n collapsible && lines.length > MAX_VISIBLE_LINES ? (\n <button\n type=\"button\"\n className=\"flex w-full items-center px-3 py-2 text-left text-[11px] font-medium text-[var(--tutti-purple)] transition-colors\"\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded\n ? translate(\"agentHost.agentTool.details.collapseContent\")\n : translate(\"agentHost.agentTool.details.showFullDiff\", {\n count: lines.length\n })}\n </button>\n ) : null;\n return (\n <div\n className={`workspace-agents-status-panel__detail-tool-diff overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] ${\n flat ? \"workspace-agents-status-panel__detail-tool-diff--flat\" : \"\"\n }`}\n >\n {flat ? (\n <>\n {showHeader ? (\n <div\n className=\"flex items-center justify-between gap-3 border-b border-[var(--line-2)] bg-[var(--transparency-block)] px-3 py-1.5 text-[11px]\"\n data-agent-diff-header=\"true\"\n >\n <span\n className=\"truncate font-[var(--tsh-font-mono)] text-[var(--text-secondary)]\"\n title={path ?? undefined}\n >\n {fileLabel}\n </span>\n <span className=\"inline-flex items-center gap-2 text-[11px] font-semibold\">\n <span className=\"text-[var(--state-success)]\">\n +{stats.added}\n </span>\n <span className=\"text-[var(--state-danger)]\">\n -{stats.removed}\n </span>\n </span>\n </div>\n ) : null}\n <AgentToolScrollArea viewportClassName=\"agent-tool-diff__viewport\">\n {visibleDiffLines.map(({ key, line }) => (\n <div key={key} className={flatLineClassName(line.kind)}>\n <div className=\"select-none px-2.5 text-right text-[var(--text-tertiary)]\">\n {line.newLineNumber ?? line.oldLineNumber ?? \"\"}\n </div>\n <pre className=\"m-0 overflow-x-auto px-3 py-0 text-[var(--text-primary)]\">\n <code>{line.text || \" \"}</code>\n </pre>\n </div>\n ))}\n {disclosureButton}\n </AgentToolScrollArea>\n </>\n ) : (\n <>\n {showHeader ? (\n <div\n className=\"border-b border-[var(--line-2)] bg-[var(--transparency-block)] px-3 py-1.5 text-[11px] text-[var(--text-secondary)]\"\n data-agent-diff-header=\"true\"\n >\n <AgentPathTailLabel\n path={path}\n fallback=\"Patch\"\n className=\"font-[var(--tsh-font-mono)]\"\n />\n </div>\n ) : null}\n <AgentToolScrollArea viewportClassName=\"agent-tool-diff__viewport px-4 py-3 text-[11px] leading-5\">\n {visibleLines.map(({ key, line }) => (\n <div key={key} className={lineClassName(line)}>\n {line || \" \"}\n </div>\n ))}\n </AgentToolScrollArea>\n {disclosureButton}\n </>\n )}\n </div>\n );\n}\n\nfunction fileNameFromPath(path: string | null | undefined): string | null {\n if (!path) {\n return null;\n }\n const normalized = path.trim();\n if (!normalized) {\n return null;\n }\n const segments = normalized.split(\"/\");\n return segments[segments.length - 1] || normalized;\n}\n\nfunction flatLineClassName(kind: \"add\" | \"remove\" | \"context\"): string {\n if (kind === \"add\") {\n return \"grid grid-cols-[48px_minmax(0,1fr)] border-l-[2px] border-l-[var(--state-success)] bg-[color:color-mix(in_srgb,var(--state-success)_10%,transparent)] font-[var(--tsh-font-mono)] text-[11px] leading-6\";\n }\n if (kind === \"remove\") {\n return \"grid grid-cols-[48px_minmax(0,1fr)] border-l-[2px] border-l-[var(--state-danger)] bg-[color:color-mix(in_srgb,var(--state-danger)_10%,transparent)] font-[var(--tsh-font-mono)] text-[11px] leading-6\";\n }\n return \"agent-tool-diff__line grid grid-cols-[48px_minmax(0,1fr)] font-[var(--tsh-font-mono)] text-[11px] leading-6\";\n}\n\nfunction visiblePatchLines(value: string, compact: boolean): string[] {\n const lines = value.split(\"\\n\");\n if (!compact) {\n return lines;\n }\n const firstHunkIndex = lines.findIndex((line) => line.startsWith(\"@@\"));\n if (firstHunkIndex <= 0) {\n return lines;\n }\n return lines.slice(firstHunkIndex);\n}\n\nfunction lineClassName(line: string): string {\n if (line.startsWith(\"@@\")) {\n return \"border-y border-[var(--line-2)] bg-[var(--transparency-block)] px-2 py-1 text-[var(--text-secondary)]\";\n }\n if (\n line.startsWith(\"diff --git\") ||\n line.startsWith(\"index \") ||\n line.startsWith(\"--- \") ||\n line.startsWith(\"+++ \")\n ) {\n return \"px-2 py-0.5 text-[var(--text-tertiary)]\";\n }\n if (line.startsWith(\"+\")) {\n return \"bg-[color:color-mix(in_srgb,var(--state-success)_10%,transparent)] px-2 py-0.5 text-[var(--state-success)]\";\n }\n if (line.startsWith(\"-\")) {\n return \"bg-[color:color-mix(in_srgb,var(--state-danger)_10%,transparent)] px-2 py-0.5 text-[var(--state-danger)]\";\n }\n return \"px-2 py-0.5 text-[var(--text-primary)]\";\n}\n","import type { HTMLAttributes, JSX, ReactNode } from \"react\";\nimport { CustomScrollArea } from \"../../../../app/renderer/components/ui/custom-scroll-area\";\nimport { cn } from \"../../../../app/renderer/lib/utils\";\n\ninterface AgentToolScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n viewportClassName?: string;\n maxHeightClassName?: string;\n}\n\nexport function AgentToolScrollArea({\n children,\n className,\n viewportClassName,\n maxHeightClassName = \"max-h-[240px]\",\n ...props\n}: AgentToolScrollAreaProps): JSX.Element {\n \"use memo\";\n return (\n <CustomScrollArea\n className={cn(\n \"agent-tool-scroll-area group/agent-tool-scroll\",\n className\n )}\n viewportClassName={cn(\n \"workspace-agents-status-panel__detail-scroll-region\",\n maxHeightClassName,\n viewportClassName\n )}\n scrollbarClassName=\"agent-tool-scroll-area__scrollbar\"\n scrollbarThumbClassName=\"workspace-agents-status-panel__scrollbar-thumb\"\n {...props}\n >\n {children}\n </CustomScrollArea>\n );\n}\n","import {\n extractAgentPatchPath,\n inferAgentPatchChangeType,\n normalizeAgentPatchText,\n type AgentPatchChangeType\n} from \"../../../rules/agentPatchMetadata\";\n\nexport { extractAgentPatchPath, inferAgentPatchChangeType };\nexport type AgentUnifiedDiffChangeType = AgentPatchChangeType;\n\nexport interface ParsedAgentUnifiedDiff {\n oldString: string;\n newString: string;\n}\n\nexport interface ParsedAgentUnifiedDiffLine {\n kind: \"add\" | \"remove\" | \"context\";\n oldLineNumber: number | null;\n newLineNumber: number | null;\n text: string;\n}\n\nconst DIFF_META_PREFIXES = [\n \"diff --git \",\n \"index \",\n \"--- \",\n \"+++ \",\n \"*** \"\n] as const;\n\nexport function parseAgentUnifiedDiff(\n diffText: string\n): ParsedAgentUnifiedDiff | null {\n if (!diffText.trim()) {\n return null;\n }\n\n const normalizedText = normalizeAgentPatchText(diffText);\n const oldLines: string[] = [];\n const newLines: string[] = [];\n let sawChangeLine = false;\n let sawHunkHeader = false;\n\n for (const line of normalizedText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")) {\n if (line.startsWith(\"@@\")) {\n if (sawHunkHeader && (oldLines.length > 0 || newLines.length > 0)) {\n oldLines.push(\"\");\n newLines.push(\"\");\n }\n sawHunkHeader = true;\n continue;\n }\n if (DIFF_META_PREFIXES.some((prefix) => line.startsWith(prefix))) {\n continue;\n }\n if (line === \"\\\\") {\n continue;\n }\n if (line.startsWith(\"+\")) {\n newLines.push(line.slice(1));\n sawChangeLine = true;\n continue;\n }\n if (line.startsWith(\"-\")) {\n oldLines.push(line.slice(1));\n sawChangeLine = true;\n continue;\n }\n if (line.startsWith(\" \")) {\n const content = line.slice(1);\n oldLines.push(content);\n newLines.push(content);\n }\n }\n\n if (!sawChangeLine) {\n return null;\n }\n\n return {\n oldString: oldLines.join(\"\\n\"),\n newString: newLines.join(\"\\n\")\n };\n}\n\nexport function parseAgentUnifiedDiffLines(\n diffText: string\n): ParsedAgentUnifiedDiffLine[] {\n const normalized = normalizeAgentPatchText(diffText);\n if (!normalized.trim()) {\n return [];\n }\n\n const lines: ParsedAgentUnifiedDiffLine[] = [];\n let oldLineNumber = 0;\n let newLineNumber = 0;\n\n for (const line of normalized.replace(/\\r\\n/g, \"\\n\").split(\"\\n\")) {\n if (line.startsWith(\"@@\")) {\n const match = line.match(/^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (!match) {\n continue;\n }\n oldLineNumber = Number.parseInt(match[1] ?? \"0\", 10);\n newLineNumber = Number.parseInt(match[2] ?? \"0\", 10);\n continue;\n }\n if (DIFF_META_PREFIXES.some((prefix) => line.startsWith(prefix))) {\n continue;\n }\n if (line === \"\\\\") {\n continue;\n }\n if (line.startsWith(\"+\")) {\n lines.push({\n kind: \"add\",\n oldLineNumber: null,\n newLineNumber,\n text: line.slice(1)\n });\n newLineNumber += 1;\n continue;\n }\n if (line.startsWith(\"-\")) {\n lines.push({\n kind: \"remove\",\n oldLineNumber,\n newLineNumber: null,\n text: line.slice(1)\n });\n oldLineNumber += 1;\n continue;\n }\n if (line.startsWith(\" \")) {\n lines.push({\n kind: \"context\",\n oldLineNumber,\n newLineNumber,\n text: line.slice(1)\n });\n oldLineNumber += 1;\n newLineNumber += 1;\n }\n }\n\n return lines;\n}\n\nexport function parseAgentUnifiedDiffStats(diffText: string): {\n added: number;\n removed: number;\n} {\n let added = 0;\n let removed = 0;\n for (const line of normalizeAgentPatchText(diffText)\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")) {\n if (line.startsWith(\"+++\") || line.startsWith(\"---\")) {\n continue;\n }\n if (line.startsWith(\"+\")) {\n added += 1;\n continue;\n }\n if (line.startsWith(\"-\")) {\n removed += 1;\n }\n }\n return { added, removed };\n}\n","import {\n createContext,\n useContext,\n useState,\n type JSX,\n type ReactNode\n} from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { translate } from \"../../../../i18n/index\";\nimport { AgentMessageMarkdown } from \"../../../AgentMessageMarkdown\";\nimport { stripImagePayloadData } from \"../../../imageGenerationTool\";\nimport type { AgentToolCallVM } from \"../../contracts/agentToolCallVM\";\nimport {\n getFileChangeRenderData,\n getImageGenerationRenderData,\n getToolFallbackText,\n getWebFetchRenderData,\n getWebSearchRenderData\n} from \"./render-data/agentToolRenderData\";\nimport { CollapsibleReveal } from \"../CollapsibleReveal\";\nimport { fileRange } from \"./AgentReadContent\";\n\nexport interface AgentToolRendererProps {\n call: AgentToolCallVM;\n onLinkClick?: (href: string) => void;\n previewMode?: boolean;\n}\n\nconst AgentToolPreviewModeContext = createContext(false);\n\nexport function AgentToolPreviewModeProvider({\n children,\n previewMode\n}: {\n children: ReactNode;\n previewMode: boolean;\n}): JSX.Element {\n \"use memo\";\n return (\n <AgentToolPreviewModeContext.Provider value={previewMode}>\n {children}\n </AgentToolPreviewModeContext.Provider>\n );\n}\n\nexport interface TaskStepView {\n id: string;\n name: string;\n status: string | null;\n summary: string;\n toolName: string | null;\n payload: Record<string, unknown> | null;\n}\n\nexport function ToolSection({\n title,\n children\n}: {\n title: string;\n children: ReactNode;\n}): JSX.Element | null {\n \"use memo\";\n if (!children) {\n return null;\n }\n return (\n <section className=\"workspace-agents-status-panel__detail-tool-section-block\">\n <div className=\"workspace-agents-status-panel__detail-tool-section-title\">\n {title}\n </div>\n {children}\n </section>\n );\n}\n\nexport function ToolMarkdownBlock({\n content,\n onLinkClick,\n collapsible = false,\n previewMode\n}: {\n content: string;\n onLinkClick?: (href: string) => void;\n collapsible?: boolean;\n previewMode?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n const contextPreviewMode = useContext(AgentToolPreviewModeContext);\n const effectivePreviewMode = previewMode ?? contextPreviewMode;\n const normalized = content.trim();\n if (!normalized) {\n return null;\n }\n return (\n <AgentMessageMarkdown\n content={normalized}\n onLinkClick={onLinkClick}\n collapsible={collapsible}\n enableImageZoom\n previewMode={effectivePreviewMode}\n className=\"workspace-agents-status-panel__detail-tool-markdown [&_ol]:text-[var(--text-secondary)] [&_ul]:text-[var(--text-secondary)]\"\n />\n );\n}\n\nexport function AgentDefaultToolContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const fallbackText = getToolFallbackText(call);\n const inputText = dedupeToolSectionContent(fallbackText.input);\n const outputText = dedupeToolSectionContent(fallbackText.output, inputText);\n const errorText = dedupeToolSectionContent(\n fallbackText.error,\n inputText,\n outputText\n );\n const detail = dedupeToolSummary(\n call.summary.trim(),\n inputText,\n outputText,\n errorText\n );\n const sections = [\n detail\n ? {\n key: \"summary\",\n title: translate(\"agentHost.agentTool.details.summary\"),\n content: detail,\n collapsible: true\n }\n : null,\n inputText\n ? {\n key: \"input\",\n title: translate(\"agentHost.agentTool.details.input\"),\n content: inputText,\n collapsible: true\n }\n : null,\n outputText\n ? {\n key: \"output\",\n title: translate(\"agentHost.agentTool.details.output\"),\n content: outputText,\n collapsible: true\n }\n : null,\n errorText\n ? {\n key: \"error\",\n title: translate(\"agentHost.agentTool.details.error\"),\n content: errorText,\n collapsible: true\n }\n : null\n ].filter(\n (\n section\n ): section is {\n key: string;\n title: string;\n content: string;\n collapsible: boolean;\n } => section !== null\n );\n const rawPayload = call.payload ?? rawPayloadFromCall(call);\n\n if (sections.length === 0 && !rawPayload) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {sections.map((section) => (\n <ToolSection key={section.key} title={section.title}>\n <ToolMarkdownBlock\n content={section.content}\n onLinkClick={onLinkClick}\n collapsible={section.collapsible}\n />\n </ToolSection>\n ))}\n <RawPayloadSection payload={rawPayload} />\n </div>\n );\n}\n\nexport function hasAgentToolContent(call: AgentToolCallVM): boolean {\n if (call.rendererKind === \"approval\") {\n return Boolean(call.input?.toolCall || call.summary.trim());\n }\n\n switch (call.rendererKind) {\n case \"plan-enter\":\n case \"plan-exit\":\n return Boolean(call.planMode || hasGenericStructuredContent(call));\n case \"ask-user\":\n return Boolean(call.askUserQuestion || hasGenericStructuredContent(call));\n case \"task\":\n return Boolean(call.task || hasGenericStructuredContent(call));\n case \"read\":\n return hasReadContent(call);\n case \"write\":\n return hasWriteContent(call);\n case \"edit\":\n return hasEditContent(call);\n case \"bash\":\n case \"search\":\n return hasGenericStructuredContent(call);\n case \"web-search\":\n return hasWebSearchContent(call);\n case \"web-fetch\":\n return hasWebFetchContent(call) || hasGenericStructuredContent(call);\n case \"image-generation\": {\n const image = getImageGenerationRenderData(call);\n return Boolean(image.prompt || image.imageUri);\n }\n case \"todo-write\":\n case \"tool-search\":\n case \"skill\":\n case \"mcp\":\n return true;\n default:\n return Boolean(\n call.summary.trim() || call.input || call.output || call.error\n );\n }\n}\n\nfunction hasGenericStructuredContent(call: AgentToolCallVM): boolean {\n return Boolean(\n call.summary.trim() ||\n call.compactSummary?.trim() ||\n call.input ||\n call.output ||\n call.error ||\n call.payload ||\n call.metadata ||\n call.content?.length ||\n call.locations?.length\n );\n}\n\nfunction hasWebFetchContent(call: AgentToolCallVM): boolean {\n const web = getWebFetchRenderData(call);\n return Boolean(web.url || web.visibleContent);\n}\n\nfunction hasWebSearchContent(call: AgentToolCallVM): boolean {\n // Mirror what AgentWebSearchContent can actually render. Web search payloads\n // (notably the Codex path) often carry only a query and no results, so guard\n // against treating an empty payload as renderable detail.\n const web = getWebSearchRenderData(call);\n return Boolean(\n web.query ||\n web.queries.length > 0 ||\n web.output.trim() ||\n web.error ||\n arrayValue(call.output?.links)?.length\n );\n}\n\nfunction hasReadContent(call: AgentToolCallVM): boolean {\n const file = objectValue(call.output?.file);\n return Boolean(\n stringValue(call.output?.text) ||\n stringValue(call.output?.output) ||\n readContentText(call.output?.content) ||\n stringValue(call.output?.aggregated_output) ||\n stringValue(call.output?.formatted_output) ||\n stringValue(call.output?.stdout) ||\n (!file && call.summary.trim()) ||\n stringValue(call.input?.path) ||\n stringValue(call.input?.file_path) ||\n stringValue(call.input?.filePath) ||\n stringValue(call.input?.file) ||\n fileRange(file) ||\n numericValue(file?.totalLines) !== null\n );\n}\n\nfunction hasWriteContent(call: AgentToolCallVM): boolean {\n const files = getFileChangeRenderData(call);\n return Boolean(\n files.some((file) => file.content || file.unifiedDiff) ||\n (files.length === 0 &&\n (call.summary.trim() ||\n stringValue(call.input?.path) ||\n stringValue(call.input?.file_path) ||\n stringValue(call.input?.filePath)))\n );\n}\n\nfunction hasEditContent(call: AgentToolCallVM): boolean {\n const files = getFileChangeRenderData(call);\n return Boolean(\n files.some(\n (file) =>\n file.unifiedDiff ||\n (file.oldString !== null && file.newString !== null) ||\n file.content\n ) ||\n (files.length === 0 &&\n (stringValue(call.input?.path) ||\n stringValue(call.input?.file_path) ||\n stringValue(call.input?.filePath)))\n );\n}\n\nfunction readContentText(value: unknown): string | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const text = value\n .flatMap((item) => {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) {\n return [];\n }\n const record = item as Record<string, unknown>;\n const nestedContent =\n record.content &&\n typeof record.content === \"object\" &&\n !Array.isArray(record.content)\n ? (record.content as Record<string, unknown>)\n : null;\n return [\n stringValue(record.text),\n stringValue(record.content),\n stringValue(nestedContent?.text)\n ].filter((entry): entry is string => Boolean(entry));\n })\n .join(\"\\n\")\n .trim();\n return text || null;\n}\n\nexport function normalizeTaskSteps(call: AgentToolCallVM): TaskStepView[] {\n const steps =\n arrayValue(call.metadata?.steps) ??\n arrayValue(call.output?.steps) ??\n arrayValue(call.payload?.steps) ??\n [];\n return steps.flatMap((value, index) => {\n const step = optionRecord(value);\n if (!step) {\n return [];\n }\n const toolName =\n stringValue(step.toolName) ??\n stringValue(step.tool_name) ??\n stringValue(step.name) ??\n null;\n const name = toolName\n ? humanizeToolLabel(toolName)\n : translate(\"agentHost.agentTool.details.stepLabel\", {\n index: index + 1\n });\n const status =\n stringValue(step.status) ??\n stringValue(optionRecord(step.toolResult)?.status) ??\n stringValue(optionRecord(step.tool_result)?.status) ??\n null;\n const summary =\n firstNonEmptyText(\n optionRecord(step.toolResult),\n optionRecord(step.tool_result),\n optionRecord(step.toolInput),\n optionRecord(step.tool_input)\n ) ?? \"\";\n return [\n {\n id:\n stringValue(step.toolUseId) ??\n stringValue(step.id) ??\n `step-${index + 1}`,\n name,\n status,\n summary,\n toolName,\n payload: {\n input: optionRecord(step.toolInput) ?? optionRecord(step.tool_input),\n output:\n optionRecord(step.toolResult) ?? optionRecord(step.tool_result),\n error: optionRecord(step.toolError) ?? optionRecord(step.tool_error)\n }\n }\n ];\n });\n}\n\nexport function formatLineRange(\n input: Record<string, unknown> | null\n): string | null {\n if (!input) {\n return null;\n }\n const start = numericValue(input.startLine) ?? numericValue(input.start_line);\n const end = numericValue(input.endLine) ?? numericValue(input.end_line);\n if (start === null || end === null) {\n return null;\n }\n return start === end ? `L${start}` : `L${start}-${end}`;\n}\n\nexport function optionRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function objectValue(value: unknown): Record<string, unknown> | null {\n return optionRecord(value);\n}\n\nexport function arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nexport function stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction numericValue(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nexport function firstNonEmptyText(...values: Array<unknown>): string | null {\n for (const value of values) {\n const text = structuredText(value);\n if (text) {\n return text;\n }\n }\n return null;\n}\n\nfunction structuredText(value: unknown): string | null {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n const preferred = [\n stringValue(record.plan),\n stringValue(record.text),\n stringValue(record.output),\n stringValue(record.content),\n stringValue(record.summary),\n stringValue(record.result),\n stringValue(record.message),\n stringValue(record.stdout),\n stringValue(record.stderr),\n stringValue(record.query),\n stringValue(record.path),\n stringValue(record.file),\n stringValue(record.filePath),\n stringValue(record.file_path),\n stringValue(record.url),\n stringValue(record.cmd),\n stringValue(record.command)\n ].find(Boolean);\n if (preferred) {\n return preferred;\n }\n return null;\n}\n\nexport function RawPayloadSection({\n payload\n}: {\n payload: unknown;\n}): JSX.Element | null {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n const rawJson = rawPayloadJson(payload);\n if (!rawJson) {\n return null;\n }\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-raw\">\n <button\n type=\"button\"\n className=\"group/raw-payload inline-flex items-center gap-1.5 border-0 bg-transparent p-0 text-left text-[11px] font-normal text-[var(--text-secondary)]\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n <span>{translate(\"agentHost.agentTool.details.rawPayload\")}</span>\n {expanded ? (\n <ChevronDown\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"shrink-0 opacity-0 transition-opacity duration-150 group-hover/raw-payload:opacity-100 group-focus-visible/raw-payload:opacity-100\"\n />\n ) : (\n <ChevronRight\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"shrink-0 opacity-0 transition-opacity duration-150 group-hover/raw-payload:opacity-100 group-focus-visible/raw-payload:opacity-100\"\n />\n )}\n </button>\n <CollapsibleReveal expanded={expanded} preMountOnIdle>\n <pre className=\"workspace-agents-status-panel__detail-scroll-region mt-2 max-h-[320px] overflow-auto rounded-[8px] border border-[var(--line-2)] bg-[var(--transparency-block)] px-3 py-2 text-[11px] leading-[1.45] text-[var(--text-secondary)]\">\n <code>{rawJson}</code>\n </pre>\n </CollapsibleReveal>\n </div>\n );\n}\n\nfunction rawPayloadFromCall(\n call: AgentToolRendererProps[\"call\"]\n): Record<string, unknown> | null {\n const payload: Record<string, unknown> = {};\n if (call.input) {\n payload.input = call.input;\n }\n if (call.output) {\n payload.output = call.output;\n }\n if (call.error) {\n payload.error = call.error;\n }\n if (call.metadata) {\n payload.metadata = call.metadata;\n }\n return Object.keys(payload).length > 0 ? payload : null;\n}\n\nfunction rawPayloadJson(value: unknown): string | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n try {\n return JSON.stringify(stripImagePayloadData(value), null, 2);\n } catch {\n return null;\n }\n}\n\nfunction dedupeToolSummary(\n summary: string,\n ...otherValues: Array<string | null>\n): string {\n return dedupeToolSectionContent(summary, ...otherValues);\n}\n\nexport function dedupeToolSectionContent(\n content: string | null | undefined,\n ...previousValues: Array<string | null | undefined>\n): string {\n const normalizedContent = content?.trim() ?? \"\";\n if (!normalizedContent) {\n return \"\";\n }\n const contentKey = normalizeToolSectionContent(normalizedContent);\n const duplicate = previousValues.some(\n (value) => normalizeToolSectionContent(value) === contentKey\n );\n return duplicate ? \"\" : normalizedContent;\n}\n\nexport function normalizeToolSectionContent(\n value: string | null | undefined\n): string {\n return (value ?? \"\").trim().replace(/\\s+/g, \" \");\n}\n\nexport function askUserAnswer(\n question: Record<string, unknown>,\n index: number,\n output: Record<string, unknown> | null\n): string | null {\n if (!output) {\n return null;\n }\n const questionId = stringValue(question.id);\n const answersById = optionRecord(output.answersByQuestionId);\n if (questionId) {\n const byId = firstNonEmptyText(answersById?.[questionId]);\n if (byId) {\n return byId;\n }\n }\n const answers = optionRecord(output.answers);\n const questionText = stringValue(question.question);\n if (questionText) {\n const byQuestion = firstNonEmptyText(answers?.[questionText]);\n if (byQuestion) {\n return byQuestion;\n }\n }\n return (\n firstNonEmptyText((output.answers as unknown[] | undefined)?.[index]) ??\n firstNonEmptyText((output.selected as unknown[] | undefined)?.[index]) ??\n null\n );\n}\n\nexport function humanizeToolLabel(name: string): string {\n switch (\n (name ?? \"\")\n .trim()\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase()\n ) {\n case \"bash\":\n case \"shell\":\n case \"exec\":\n case \"execcommand\":\n case \"runshellcommand\":\n return translate(\"agentHost.agentTool.labels.runCommand\");\n case \"read\":\n case \"readfile\":\n return translate(\"agentHost.agentTool.labels.readFile\");\n case \"write\":\n case \"writefile\":\n return translate(\"agentHost.agentTool.labels.writeFile\");\n case \"edit\":\n case \"editfile\":\n case \"multiedit\":\n return translate(\"agentHost.agentTool.labels.editFile\");\n case \"ls\":\n case \"list\":\n case \"listdirectory\":\n case \"listfiles\":\n return translate(\"agentHost.agentTool.labels.listFiles\");\n case \"glob\":\n case \"find\":\n case \"findfiles\":\n return translate(\"agentHost.agentTool.labels.findFiles\");\n case \"search\":\n case \"searchfiles\":\n case \"searchfilecontent\":\n case \"grep\":\n return translate(\"agentHost.agentTool.labels.searchFiles\");\n case \"websearch\":\n case \"websearchpreview\":\n case \"googlewebsearch\":\n return translate(\"agentHost.agentTool.labels.webSearch\");\n case \"webfetch\":\n case \"fetchurl\":\n return translate(\"agentHost.agentTool.labels.webFetch\");\n case \"applypatch\":\n return translate(\"agentHost.agentTool.labels.applyPatch\");\n case \"bashoutput\":\n case \"readcommandoutput\":\n return translate(\"agentHost.agentTool.labels.readCommandOutput\");\n case \"killbash\":\n case \"stopcommand\":\n return translate(\"agentHost.agentTool.labels.stopCommand\");\n case \"notebookread\":\n case \"readnotebook\":\n return translate(\"agentHost.agentTool.labels.readNotebook\");\n case \"notebookedit\":\n case \"editnotebook\":\n return translate(\"agentHost.agentTool.labels.editNotebook\");\n case \"todowrite\":\n case \"updatetodos\":\n case \"todo\":\n case \"writetodos\":\n return translate(\"agentHost.agentTool.labels.updateTodos\");\n case \"task\":\n case \"delegatetask\":\n case \"subagent\":\n case \"agent\":\n return translate(\"agentHost.agentTool.labels.delegateAgent\");\n case \"closeagent\":\n return translate(\"agentHost.agentTool.labels.closeAgent\");\n case \"wait\":\n return translate(\"agentHost.agentTool.labels.waitAgent\");\n default:\n return name;\n }\n}\n","import type { JSX } from \"react\";\nimport { AgentCodeBlock } from \"./code/AgentCodeBlock\";\nimport {\n objectValue,\n stringValue,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { AgentPathTailLabel } from \"./AgentPathTailLabel\";\n\nexport function AgentReadContent({\n call\n}: AgentToolRendererProps): JSX.Element {\n \"use memo\";\n const path =\n stringValue(call.input?.path) ??\n stringValue(call.input?.file_path) ??\n stringValue(call.input?.filePath) ??\n stringValue(call.input?.file) ??\n null;\n const file = objectValue(call.output?.file);\n const outputText =\n stringValue(call.output?.text) ??\n stringValue(call.output?.output) ??\n contentText(call.output?.content) ??\n stringValue(call.output?.aggregated_output) ??\n stringValue(call.output?.formatted_output) ??\n stringValue(call.output?.stdout) ??\n (!file ? call.summary.trim() || null : null);\n const fileLineRange = fileRange(file);\n const fileTotalLines = numericValue(file?.totalLines);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body workspace-agents-status-panel__detail-tool-body--plain\">\n {outputText ? (\n <AgentCodeBlock\n path={path}\n content={outputText}\n language={languageForPath(path)}\n />\n ) : path || fileLineRange || fileTotalLines !== null ? (\n <div className=\"rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] px-3 py-2\">\n {path ? (\n <AgentPathTailLabel\n path={path}\n fallback=\"File\"\n className=\"font-[var(--tsh-font-mono)] text-[11px] text-[var(--text-secondary)]\"\n />\n ) : null}\n {fileLineRange || fileTotalLines !== null ? (\n <div className=\"mt-1 text-[11px] text-[var(--text-secondary)]\">\n {[\n fileLineRange,\n fileTotalLines !== null ? `${fileTotalLines} lines` : null\n ]\n .filter((value): value is string => Boolean(value))\n .join(\" · \")}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function fileRange(file: Record<string, unknown> | null): string | null {\n const startLine = numericValue(file?.startLine);\n const numLines = numericValue(file?.numLines);\n if (startLine === null || numLines === null || numLines <= 0) {\n return null;\n }\n const endLine = startLine + numLines - 1;\n return startLine === endLine ? `L${startLine}` : `L${startLine}-${endLine}`;\n}\n\nfunction contentText(value: unknown): string | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const text = value\n .flatMap((item) => {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) {\n return [];\n }\n const record = item as Record<string, unknown>;\n const nestedContent =\n record.content &&\n typeof record.content === \"object\" &&\n !Array.isArray(record.content)\n ? (record.content as Record<string, unknown>)\n : null;\n return [\n stringValue(record.text),\n stringValue(record.content),\n stringValue(nestedContent?.text)\n ].filter((entry): entry is string => Boolean(entry));\n })\n .join(\"\\n\")\n .trim();\n return text || null;\n}\n\nfunction numericValue(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction languageForPath(path: string | null): string | null {\n const extension = path?.split(\".\").pop()?.toLowerCase();\n switch (extension) {\n case \"ts\":\n case \"tsx\":\n return \"typescript\";\n case \"js\":\n case \"jsx\":\n return \"javascript\";\n case \"go\":\n return \"go\";\n case \"md\":\n return \"markdown\";\n case \"json\":\n return \"json\";\n default:\n return extension || null;\n }\n}\n","import type { JSX } from \"react\";\nimport { AgentCodeBlock } from \"./code/AgentCodeBlock\";\nimport { AgentMonacoDiffViewer } from \"./file-diff/AgentMonacoDiffViewer\";\nimport { AgentUnifiedPatchViewer } from \"./file-diff/AgentUnifiedPatchViewer\";\nimport {\n stringValue,\n ToolMarkdownBlock,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getFileChangeRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentEditContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const files = getFileChangeRenderData(call);\n const [file] = files;\n const path =\n file?.path ??\n stringValue(call.input?.path) ??\n stringValue(call.input?.file_path) ??\n stringValue(call.input?.filePath) ??\n null;\n const patchFiles = files.filter((candidate) => candidate.unifiedDiff);\n const diffFiles = files.filter(\n (candidate) =>\n !candidate.unifiedDiff &&\n candidate.oldString !== null &&\n candidate.newString !== null\n );\n const contentFiles = files.filter(\n (candidate) =>\n !candidate.unifiedDiff &&\n !(candidate.oldString !== null && candidate.newString !== null) &&\n candidate.content\n );\n const hasRenderableContent =\n Boolean(path && files.length === 0) ||\n patchFiles.length > 0 ||\n diffFiles.length > 0 ||\n contentFiles.length > 0;\n\n if (!hasRenderableContent) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body workspace-agents-status-panel__detail-tool-body--flat\">\n {path && files.length === 0 ? (\n <ToolMarkdownBlock content={path} onLinkClick={onLinkClick} />\n ) : null}\n {patchFiles.map((candidate) => (\n <AgentUnifiedPatchViewer\n key={`patch:${candidate.path}`}\n path={candidate.path}\n diffText={candidate.unifiedDiff!}\n compact\n flat\n />\n ))}\n {diffFiles.map((candidate) => (\n <AgentMonacoDiffViewer\n key={`diff:${candidate.path}`}\n path={candidate.path}\n oldValue={candidate.oldString!}\n newValue={candidate.newString!}\n flat\n />\n ))}\n {contentFiles.map((candidate) => (\n <AgentCodeBlock\n key={`content:${candidate.path}`}\n path={candidate.path}\n content={candidate.content!}\n language={candidate.language}\n showHeader={false}\n flat\n />\n ))}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n dedupeToolSectionContent,\n ToolMarkdownBlock,\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport {\n getToolFallbackText,\n getWebFetchRenderData\n} from \"./render-data/agentToolRenderData\";\n\nexport function AgentWebFetchContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const web = getWebFetchRenderData(call);\n const urlText =\n web.url && web.domain && web.domain !== web.url\n ? `${web.domain}\\n\\n${web.url}`\n : web.url;\n const visibleContent = dedupeToolSectionContent(\n web.visibleContent,\n web.url,\n web.domain,\n urlText\n );\n const fallbackText = getToolFallbackText(call);\n const errorText = dedupeToolSectionContent(\n fallbackText.error,\n urlText,\n visibleContent\n );\n if (!web.url && !visibleContent && !errorText) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {web.url ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.url\")}>\n <ToolMarkdownBlock\n content={urlText ?? \"\"}\n onLinkClick={onLinkClick}\n />\n </ToolSection>\n ) : null}\n {visibleContent ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.content\")}>\n <ToolMarkdownBlock\n content={visibleContent}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n {web.isTruncated ? (\n <div className=\"text-[10px] italic text-[var(--text-tertiary)]\">\n {translate(\"agentHost.agentTool.details.contentTruncated\")}\n </div>\n ) : null}\n {errorText ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.error\")}>\n <ToolMarkdownBlock\n content={errorText}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n arrayValue,\n dedupeToolSectionContent,\n optionRecord,\n stringValue,\n ToolMarkdownBlock,\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getWebSearchRenderData } from \"./render-data/agentToolRenderData\";\n\nconst MAX_SUMMARY_LENGTH = 3000;\n\nexport function AgentWebSearchContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const web = getWebSearchRenderData(call);\n const queries = web.queries;\n const outputText = web.output;\n const links = normalizeLinks(call.output?.links, outputText);\n const queryText = webSearchQueryText(web.query, queries);\n const summary = extractSummary(outputText);\n const visibleSummary = dedupeToolSectionContent(\n summary ? summary.slice(0, MAX_SUMMARY_LENGTH) : null,\n queryText,\n links.map((link) => `${link.domain} ${link.title}`).join(\"\\n\")\n );\n\n const hasRenderableContent = Boolean(\n queryText || links.length > 0 || visibleSummary || web.error\n );\n if (!hasRenderableContent) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {queryText ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.query\")}>\n <ToolMarkdownBlock content={queryText} onLinkClick={onLinkClick} />\n </ToolSection>\n ) : null}\n {links.length > 0 ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.results\")}>\n <div className=\"workspace-agents-status-panel__detail-tool-result-list overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--transparency-block)]\">\n {links.map((link, index) => (\n <a\n key={`${link.url}:${link.title}`}\n href={link.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={`flex items-center gap-3 px-3 py-2 text-[11px] ${\n index > 0 ? \"border-t border-[var(--line-2)]\" : \"\"\n }`}\n >\n <span className=\"w-[120px] shrink-0 truncate text-[11px] text-[var(--text-tertiary)]\">\n {link.domain}\n </span>\n <span className=\"truncate text-[var(--text-primary)]\">\n {link.title}\n </span>\n </a>\n ))}\n </div>\n </ToolSection>\n ) : null}\n {visibleSummary ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n <ToolMarkdownBlock\n content={visibleSummary}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n {summary && summary.length > MAX_SUMMARY_LENGTH ? (\n <div className=\"text-[10px] italic text-[var(--text-tertiary)]\">\n {translate(\"agentHost.agentTool.details.summaryTruncated\")}\n </div>\n ) : null}\n {web.error ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.error\")}>\n <ToolMarkdownBlock\n content={web.error}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n </div>\n );\n}\n\nfunction webSearchQueryText(\n query: string | null,\n queries: readonly string[]\n): string | null {\n const candidates = queries.length > 0 ? queries : query ? [query] : [];\n const deduped = [\n ...new Set(candidates.map((value) => value.trim()).filter(Boolean))\n ];\n return deduped.length > 0 ? deduped.join(\"\\n\") : null;\n}\n\nfunction normalizeLinks(\n value: unknown,\n output: string\n): Array<{ title: string; url: string; domain: string }> {\n const explicitLinks =\n arrayValue(value)\n ?.map(optionRecord)\n .filter(\n (candidate): candidate is Record<string, unknown> => candidate !== null\n )\n .flatMap((link) => {\n const url = stringValue(link.url);\n if (!url) {\n return [];\n }\n return [\n {\n title: stringValue(link.title) ?? url,\n url,\n domain: domainForUrl(url)\n }\n ];\n }) ?? [];\n if (explicitLinks.length > 0) {\n return explicitLinks;\n }\n\n const match = output.match(/^Links:\\s*(\\[[\\s\\S]*?\\])(?:\\n\\n|\\n|$)/);\n if (!match) {\n return extractQuotedLinks(output);\n }\n try {\n const linksJson = match[1];\n if (!linksJson) {\n return extractQuotedLinks(output);\n }\n const parsed = JSON.parse(linksJson) as unknown[];\n return parsed.flatMap((entry) => {\n const link = optionRecord(entry);\n const url = stringValue(link?.url);\n if (!url) {\n return [];\n }\n return [\n {\n title: stringValue(link?.title) ?? url,\n url,\n domain: domainForUrl(url)\n }\n ];\n });\n } catch {\n return extractQuotedLinks(output);\n }\n}\n\nfunction extractQuotedLinks(\n output: string\n): Array<{ title: string; url: string; domain: string }> {\n return Array.from(\n output.matchAll(/\"title\":\"([^\"]+)\"\\s*,\\s*\"url\":\"([^\"]+)\"/g)\n ).flatMap((entry) => {\n const title = entry[1];\n const url = entry[2];\n if (!title || !url) {\n return [];\n }\n return [{ title, url, domain: domainForUrl(url) }];\n });\n}\n\nfunction extractSummary(output: string): string | null {\n const trimmed = output.trim();\n if (!trimmed) {\n return null;\n }\n const withLinksRemoved = trimmed\n .replace(/^Links:\\s*\\[[\\s\\S]*?\\](?:\\n\\n|\\n)?/, \"\")\n .trim();\n return withLinksRemoved || (!trimmed.startsWith(\"Links:\") ? trimmed : null);\n}\n\nfunction domainForUrl(url: string): string {\n try {\n return new URL(url).hostname.replace(/^www\\./, \"\");\n } catch {\n return url;\n }\n}\n","import type { JSX } from \"react\";\nimport type {\n AgentToolCallVM,\n AgentToolRendererKind\n} from \"../../contracts/agentToolCallVM\";\nimport { AgentEditContent } from \"./AgentEditContent\";\nimport { AgentWebFetchContent } from \"./AgentWebFetchContent\";\nimport { AgentWebSearchContent } from \"./AgentWebSearchContent\";\nimport {\n arrayValue,\n objectValue,\n stringValue,\n ToolMarkdownBlock,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\n\nexport function AgentApprovalContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const previewCall = approvalPreviewCall(call);\n if (!previewCall && !call.summary.trim()) {\n return null;\n }\n if (previewCall) {\n switch (previewCall.rendererKind) {\n case \"web-fetch\":\n return (\n <AgentWebFetchContent call={previewCall} onLinkClick={onLinkClick} />\n );\n case \"web-search\":\n return (\n <AgentWebSearchContent call={previewCall} onLinkClick={onLinkClick} />\n );\n default:\n return (\n <AgentEditContent call={previewCall} onLinkClick={onLinkClick} />\n );\n }\n }\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n <ToolMarkdownBlock content={call.summary} />\n </div>\n );\n}\n\ninterface ApprovalPreviewKind {\n rendererKind: AgentToolRendererKind;\n toolName: string;\n}\n\n// The nested tool-call's `kind` follows the ACP vocabulary (edit/move/fetch/...)\n// when the provider sends it (e.g. Codex); Claude Code omits `kind` and only\n// sets `title`/`toolName` to the canonical tool name (e.g. \"WebFetch\"), so\n// both vocabularies are matched here.\nfunction approvalPreviewKindFor(\n normalizedKind: string\n): ApprovalPreviewKind | null {\n switch (normalizedKind) {\n case \"edit\":\n case \"move\":\n return { rendererKind: \"edit\", toolName: \"Edit\" };\n case \"fetch\":\n case \"webfetch\":\n case \"web_fetch\":\n case \"web-fetch\":\n return { rendererKind: \"web-fetch\", toolName: \"WebFetch\" };\n case \"websearch\":\n case \"web_search\":\n case \"web-search\":\n return { rendererKind: \"web-search\", toolName: \"WebSearch\" };\n default:\n return null;\n }\n}\n\nfunction approvalPreviewCall(call: AgentToolCallVM): AgentToolCallVM | null {\n const toolCall = objectValue(call.input?.toolCall);\n if (!toolCall) {\n return null;\n }\n const normalizedKind = normalizeToolKind(\n stringValue(toolCall.kind) ??\n stringValue(toolCall.title) ??\n stringValue(toolCall.toolName)\n );\n const preview = approvalPreviewKindFor(normalizedKind);\n if (!preview) {\n return null;\n }\n const input = objectValue(toolCall.rawInput) ?? objectValue(toolCall.input);\n const content = arrayValue(toolCall.content);\n const locations = arrayValue(toolCall.locations);\n return {\n kind: \"tool-call\",\n id: `${call.id}:approval-preview`,\n turnId: call.turnId,\n name: stringValue(toolCall.title) ?? call.name,\n toolName: preview.toolName,\n callType: \"tool\",\n status: stringValue(toolCall.status) ?? call.status,\n statusKind: call.statusKind,\n summary: \"\",\n compactSummary: null,\n payload: {\n input,\n content,\n locations\n },\n toolState: null,\n input,\n output: null,\n error: null,\n metadata: null,\n content,\n locations,\n rendererKind: preview.rendererKind,\n approval: null,\n planMode: null,\n askUserQuestion: null,\n task: null,\n occurredAtUnixMs: call.occurredAtUnixMs\n };\n}\n\nfunction normalizeToolKind(value: string | null): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n","import type { JSX } from \"react\";\nimport { MessageSquareMoreIcon } from \"../../../../app/renderer/components/icons/MessageSquareMoreIcon\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n ToolMarkdownBlock,\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\n\nexport function AgentAskUserQuestionContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const questions = call.askUserQuestion?.questions ?? [];\n const outputText = stringValue(call.output?.text);\n if (questions.length === 0) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n <ToolSection title={translate(\"agentHost.agentTool.details.questions\")}>\n <div className=\"workspace-agents-status-panel__detail-tool-stack\">\n {questions.map((question) => {\n const body =\n question.question ||\n question.header ||\n translate(\"agentHost.agentTool.details.questionFallback\");\n const answer = formatAnswer(question.answer);\n const questionKey =\n question.id.trim() ||\n `${question.header}:${question.question}:${question.options.map((option) => option.label).join(\"|\")}`;\n return (\n <div\n key={questionKey}\n className=\"workspace-agents-status-panel__detail-tool-stack-item\"\n >\n <div className=\"workspace-agents-status-panel__detail-tool-question\">\n {body}\n </div>\n {question.options.length > 0 ? (\n <div className=\"workspace-agents-status-panel__detail-tool-stack\">\n {question.options.map((option) => (\n <div\n key={`${questionKey}-option-${option.label}:${option.description}`}\n className=\"workspace-agents-status-panel__detail-tool-stack-item\"\n >\n <div className=\"workspace-agents-status-panel__detail-tool-summary\">\n {option.label}\n </div>\n {option.description ? (\n <div className=\"workspace-agents-status-panel__detail-tool-answer workspace-agents-status-panel__detail-tool-answer--muted\">\n {option.description}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n ) : null}\n {answer ? (\n <div className=\"workspace-agents-status-panel__detail-tool-answer\">\n {translate(\"agentHost.agentTool.details.answerPrefix\", {\n answer\n })}\n </div>\n ) : (\n <div className=\"workspace-agents-status-panel__detail-tool-answer workspace-agents-status-panel__detail-tool-answer--muted inline-flex items-center gap-1.5\">\n <MessageSquareMoreIcon\n size={14}\n active\n aria-hidden=\"true\"\n className=\"shrink-0\"\n />\n {translate(\"agentHost.agentTool.details.waitingForAnswer\")}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </ToolSection>\n {outputText ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n <ToolMarkdownBlock\n content={outputText}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n </div>\n );\n}\n\nfunction formatAnswer(\n answer: string | string[] | null | undefined\n): string | null {\n if (Array.isArray(answer)) {\n return answer.filter((value) => value.trim()).join(\", \") || null;\n }\n return typeof answer === \"string\" && answer.trim() ? answer.trim() : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { AgentToolScrollArea } from \"../AgentToolScrollArea\";\n\nconst MAX_OUTPUT_LINES = 200;\n\nexport function AgentTerminalBlock({\n command,\n stdout,\n stderr,\n status\n}: {\n command: string | null;\n stdout: string;\n stderr: string;\n exitCode: number | null;\n durationMs: number | null;\n status: \"running\" | \"completed\" | \"failed\" | \"unknown\";\n}): JSX.Element | null {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n const outputText = useMemo(\n () => [stdout, stderr].filter(Boolean).join(\"\\n\"),\n [stdout, stderr]\n );\n const outputLines = useMemo(\n () => (outputText ? outputText.split(\"\\n\") : []),\n [outputText]\n );\n const truncated = !expanded && outputLines.length > MAX_OUTPUT_LINES;\n const visibleOutput = truncated\n ? outputLines.slice(0, MAX_OUTPUT_LINES).join(\"\\n\")\n : outputText;\n const failed = status === \"failed\";\n const hasOutput = Boolean(visibleOutput);\n const disclosureButton =\n outputLines.length > MAX_OUTPUT_LINES ? (\n <button\n type=\"button\"\n className=\"mt-2 flex w-fit items-center border-0 bg-transparent p-0 text-left text-[11px] font-medium text-[var(--tutti-purple)] transition-colors hover:underline focus-visible:underline focus-visible:outline-none\"\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded\n ? \"Collapse output\"\n : `Show full output (${outputLines.length} lines)`}\n </button>\n ) : null;\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-terminal overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)]\">\n {command ? (\n <div\n className={`flex min-w-0 items-center gap-3 px-3 text-[11px] text-[var(--text-secondary)] ${\n hasOutput\n ? \"border-b border-[var(--line-2)] bg-[var(--transparency-block)] py-1.5\"\n : \"bg-[var(--transparency-block)] py-2\"\n }`}\n data-agent-terminal-command-row=\"true\"\n >\n <span className=\"shrink-0 font-semibold text-[var(--tutti-purple)]\">\n $\n </span>\n <span\n className=\"min-w-0 flex-1 whitespace-pre-wrap [overflow-wrap:anywhere]\"\n data-agent-terminal-command=\"true\"\n >\n {command}\n </span>\n </div>\n ) : null}\n {hasOutput ? (\n <AgentToolScrollArea\n maxHeightClassName=\"max-h-[160px]\"\n viewportClassName={`px-3 py-2 text-[11px] leading-5 ${\n failed ? \"text-[var(--state-danger)]\" : \"text-[var(--text-primary)]\"\n }`}\n >\n <pre className=\"m-0 min-w-0 max-w-full whitespace-pre-wrap [overflow-wrap:anywhere]\">\n <code>{visibleOutput}</code>\n </pre>\n {disclosureButton}\n </AgentToolScrollArea>\n ) : null}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { AgentTerminalBlock } from \"./terminal/AgentTerminalBlock\";\nimport {\n stringValue,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getCommandRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentBashContent({\n call\n}: AgentToolRendererProps): JSX.Element {\n \"use memo\";\n const commandData = getCommandRenderData(call);\n const fallbackErrorText =\n commandData.status === \"failed\" &&\n !commandData.stdout &&\n !commandData.stderr\n ? stringValue(call.error?.message)\n : null;\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body workspace-agents-status-panel__detail-tool-body--plain\">\n <AgentTerminalBlock\n command={commandData.command}\n stdout={commandData.stdout}\n stderr={commandData.stderr || fallbackErrorText || \"\"}\n exitCode={commandData.exitCode}\n durationMs={commandData.durationMs}\n status={commandData.status}\n />\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport type { AgentToolRendererProps } from \"./agentToolContentShared\";\nimport { ToolMarkdownBlock, ToolSection } from \"./agentToolContentShared\";\nimport { getImageGenerationRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentImageGenerationContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const image = getImageGenerationRenderData(call);\n if (!image.prompt) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n <ToolSection title={translate(\"agentHost.agentTool.details.input\")}>\n <ToolMarkdownBlock\n content={image.prompt}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n </div>\n );\n}\n","import type { AgentToolCallVM } from \"../../../contracts/agentToolCallVM\";\nimport { extractAgentMcpToolTarget } from \"../../../../agentMcpToolTarget\";\nimport {\n arrayValue,\n objectValue,\n stringValue\n} from \"../agentToolContentShared\";\n\nexport interface AgentMcpNormalizedPayload {\n server: string | null;\n tool: string | null;\n inputSummary: string | null;\n structured: unknown;\n text: string | null;\n}\n\nexport function normalizeMcpPayload(\n call: AgentToolCallVM\n): AgentMcpNormalizedPayload {\n const target = extractAgentMcpToolTarget({\n input: call.input,\n metadata: call.metadata,\n payload: call.payload,\n toolName: call.toolName,\n name: call.name\n });\n const server =\n target?.server ??\n stringValue(call.metadata?.server) ??\n stringValue(call.metadata?.serverName) ??\n stringValue(call.metadata?.mcpServer) ??\n null;\n const tool =\n target?.tool ??\n stringValue(call.metadata?.tool) ??\n stringValue(call.metadata?.toolName) ??\n call.toolName;\n\n const structured = firstStructuredValue(\n call.output?.structuredContent,\n parseJsonString(call.output?.content),\n parseJsonString(call.output?.output),\n parseJsonString(call.output?.stdout)\n );\n\n return {\n server,\n tool,\n inputSummary: firstString(\n stringValue(call.input?.query),\n stringValue(call.input?.url),\n stringValue(call.input?.path),\n stringValue(call.input?.prompt),\n stringValue(call.input?.command)\n ),\n structured,\n text: firstString(\n contentArrayText(call.output?.content),\n stringValue(call.output?.content),\n stringValue(call.output?.output),\n stringValue(call.output?.stdout)\n )\n };\n}\n\nexport function parsedItems(value: unknown): Array<Record<string, unknown>> {\n if (Array.isArray(value)) {\n return value.flatMap((entry) => {\n const record = objectValue(entry);\n return record ? [record] : [];\n });\n }\n const record = objectValue(value);\n if (!record) {\n return [];\n }\n const candidateArrays = [\n arrayValue(record.issues),\n arrayValue(record.pages),\n arrayValue(record.results),\n arrayValue(record.resources),\n arrayValue(record.documents),\n arrayValue(record.docs),\n arrayValue(record.items)\n ];\n for (const candidate of candidateArrays) {\n if (candidate && candidate.length > 0) {\n return candidate.flatMap((entry) => {\n const item = objectValue(entry);\n return item ? [item] : [];\n });\n }\n }\n return [];\n}\n\nexport function itemPrimaryText(item: Record<string, unknown>): string | null {\n return firstString(\n stringValue(item.key),\n stringValue(item.title),\n stringValue(item.name),\n stringValue(item.path),\n stringValue(item.url),\n stringValue(item.id)\n );\n}\n\nexport function itemSecondaryText(\n item: Record<string, unknown>\n): string | null {\n return firstString(\n stringValue(item.summary),\n stringValue(item.description),\n stringValue(item.status),\n stringValue(item.type)\n );\n}\n\nfunction firstStructuredValue(...values: unknown[]): unknown {\n for (const value of values) {\n if (Array.isArray(value)) {\n return value;\n }\n if (value && typeof value === \"object\") {\n return value;\n }\n }\n return null;\n}\n\nfunction parseJsonString(value: unknown): unknown {\n if (typeof value !== \"string\" || !value.trim()) {\n return null;\n }\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction contentArrayText(value: unknown): string | null {\n const items = arrayValue(value);\n if (!items) {\n return null;\n }\n const text = items\n .flatMap((entry) => {\n const record = objectValue(entry);\n if (!record) {\n return [];\n }\n return [\n firstString(\n stringValue(record.text),\n stringValue(record.content),\n stringValue(objectValue(record.content)?.text)\n )\n ].filter((candidate): candidate is string => Boolean(candidate));\n })\n .join(\"\\n\")\n .trim();\n return text || null;\n}\n\nfunction firstString(...values: Array<string | null>): string | null {\n for (const value of values) {\n if (value) {\n return value;\n }\n }\n return null;\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../../i18n/index\";\nimport { ToolMarkdownBlock } from \"../agentToolContentShared\";\nimport {\n itemPrimaryText,\n itemSecondaryText,\n parsedItems,\n type AgentMcpNormalizedPayload\n} from \"./agentMcpShared\";\n\nexport function renderAtlassianMcp(\n payload: AgentMcpNormalizedPayload\n): JSX.Element | null {\n const items = parsedItems(payload.structured);\n if (items.length > 0) {\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-result-list overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--transparency-block)]\">\n {items.map((item, index) => (\n <div\n key={`${itemPrimaryText(item) ?? \"item\"}::${itemSecondaryText(item) ?? \"\"}`}\n className={`px-3 py-2 ${index > 0 ? \"border-t border-[var(--line-2)]\" : \"\"}`}\n >\n <div className=\"text-[11px] font-semibold text-[var(--text-primary)]\">\n {itemPrimaryText(item) ??\n translate(\"agentHost.agentTool.details.mcpItem\", {\n index: index + 1\n })}\n </div>\n {itemSecondaryText(item) ? (\n <div className=\"text-[11px] text-[var(--text-tertiary)]\">\n {itemSecondaryText(item)}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n );\n }\n\n return payload.text ? (\n <ToolMarkdownBlock content={payload.text} collapsible />\n ) : null;\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../../i18n/index\";\nimport { ToolMarkdownBlock } from \"../agentToolContentShared\";\nimport {\n itemPrimaryText,\n itemSecondaryText,\n parsedItems,\n type AgentMcpNormalizedPayload\n} from \"./agentMcpShared\";\n\nexport function renderContext7Mcp(\n payload: AgentMcpNormalizedPayload\n): JSX.Element | null {\n const items = parsedItems(payload.structured);\n if (items.length > 0) {\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-result-list overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--transparency-block)]\">\n {items.map((item, index) => (\n <div\n key={`${itemPrimaryText(item) ?? \"doc\"}::${itemSecondaryText(item) ?? \"\"}`}\n className={`px-3 py-2 ${index > 0 ? \"border-t border-[var(--line-2)]\" : \"\"}`}\n >\n <div className=\"text-[11px] font-semibold text-[var(--text-primary)]\">\n {itemPrimaryText(item) ??\n translate(\"agentHost.agentTool.details.mcpDoc\", {\n index: index + 1\n })}\n </div>\n {itemSecondaryText(item) ? (\n <div className=\"text-[11px] text-[var(--text-tertiary)]\">\n {itemSecondaryText(item)}\n </div>\n ) : null}\n </div>\n ))}\n </div>\n );\n }\n\n return payload.text ? (\n <ToolMarkdownBlock content={payload.text} collapsible />\n ) : null;\n}\n","import type { JSX } from \"react\";\nimport { renderAtlassianMcp } from \"./agentAtlassianRenderers\";\nimport { renderContext7Mcp } from \"./agentContext7Renderers\";\nimport type { AgentMcpNormalizedPayload } from \"./agentMcpShared\";\n\nexport function renderRegisteredMcp(\n payload: AgentMcpNormalizedPayload\n): JSX.Element | null {\n const identity =\n `${payload.server ?? \"\"} ${payload.tool ?? \"\"}`.toLowerCase();\n if (\n identity.includes(\"jira\") ||\n identity.includes(\"confluence\") ||\n identity.includes(\"atlassian\")\n ) {\n return renderAtlassianMcp(payload);\n }\n if (identity.includes(\"context7\")) {\n return renderContext7Mcp(payload);\n }\n return null;\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n dedupeToolSectionContent,\n RawPayloadSection,\n ToolMarkdownBlock,\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { renderRegisteredMcp } from \"./mcp-renderers/agentMcpRendererRegistry\";\nimport { normalizeMcpPayload } from \"./mcp-renderers/agentMcpShared\";\n\nexport function AgentMcpToolContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element {\n \"use memo\";\n const payload = normalizeMcpPayload(call);\n const specialized = renderRegisteredMcp(payload);\n const visibleText = dedupeToolSectionContent(\n payload.text,\n payload.inputSummary\n );\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {payload.server || payload.tool ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.mcp\")}>\n <ToolMarkdownBlock\n content={[\n payload.server\n ? `${translate(\"agentHost.agentTool.details.mcpServer\")}: ${payload.server}`\n : null,\n payload.tool\n ? `${translate(\"agentHost.agentTool.details.mcpTool\")}: ${payload.tool}`\n : null\n ]\n .filter((value): value is string => Boolean(value))\n .join(\"\\n\\n\")}\n onLinkClick={onLinkClick}\n />\n </ToolSection>\n ) : null}\n {payload.inputSummary ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.input\")}>\n <ToolMarkdownBlock\n content={payload.inputSummary}\n onLinkClick={onLinkClick}\n />\n </ToolSection>\n ) : null}\n {specialized ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n {specialized}\n </ToolSection>\n ) : visibleText ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n <ToolMarkdownBlock\n content={visibleText}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n <RawPayloadSection payload={call.payload ?? payload.structured} />\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n ToolMarkdownBlock,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getPlanModeRenderData } from \"./render-data/agentToolRenderData\";\nimport { AgentPlanCard } from \"../AgentPlanCard\";\n\nexport function AgentPlanModeContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const planMode = getPlanModeRenderData(call);\n if (call.rendererKind === \"plan-enter\") {\n if (!planMode.enterText) {\n return null;\n }\n return (\n <div className=\"rounded-[8px] bg-[var(--transparency-block)] px-3 py-2 text-[11px] text-[var(--text-secondary)]\">\n <ToolMarkdownBlock\n content={planMode.enterText}\n onLinkClick={onLinkClick}\n />\n </div>\n );\n }\n\n if (!planMode.plan) {\n return null;\n }\n return (\n <AgentPlanCard\n title={planMode.fileName ?? undefined}\n copyText={planMode.plan}\n >\n <ToolMarkdownBlock content={planMode.plan} onLinkClick={onLinkClick} />\n </AgentPlanCard>\n );\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n dedupeToolSectionContent,\n ToolMarkdownBlock,\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getSearchRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentSearchContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element {\n \"use memo\";\n const search = getSearchRenderData(call);\n const queryText = search.scope\n ? `${search.query ?? \"\"}\\n\\n${translate(\"agentHost.agentTool.details.scope\")}: ${search.scope}`.trim()\n : search.query;\n const resultFiles = withStableOccurrenceKeys(search.files, \"file\");\n const visibleOutput = dedupeToolSectionContent(search.output, queryText);\n const outputLines = withStableOccurrenceKeys(\n visibleOutput.split(\"\\n\").filter(Boolean),\n \"line\"\n );\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {queryText ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.query\")}>\n <ToolMarkdownBlock content={queryText} onLinkClick={onLinkClick} />\n </ToolSection>\n ) : null}\n {(search.mode === \"files_with_matches\" || search.mode === \"list_files\") &&\n search.files.length > 0 ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.results\")}>\n <div className=\"workspace-agents-status-panel__detail-tool-result-list overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--transparency-block)]\">\n {resultFiles.map(({ key, value: file, isFirst }) => (\n <div\n key={key}\n className={`px-3 py-2 font-[var(--tsh-font-mono)] text-[11px] text-[var(--text-primary)] ${\n isFirst ? \"\" : \"border-t border-[var(--line-2)]\"\n }`}\n >\n {file}\n </div>\n ))}\n </div>\n </ToolSection>\n ) : null}\n {search.mode === \"content\" && visibleOutput ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n <pre className=\"max-h-[320px] overflow-auto rounded-[8px] border border-[var(--line-2)] bg-[var(--transparency-block)] px-3 py-2 text-[11px] leading-5 text-[var(--text-primary)]\">\n {outputLines.map(({ key, value: line }) => (\n <div\n key={key}\n className={\n line.includes(\":\")\n ? \"text-[var(--text-primary)]\"\n : \"text-[var(--text-tertiary)]\"\n }\n >\n {line}\n </div>\n ))}\n </pre>\n </ToolSection>\n ) : null}\n {search.mode === \"count\" ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.results\")}>\n <div className=\"inline-flex rounded-full border border-[var(--line-2)] bg-[var(--transparency-block)] px-2.5 py-1 text-[11px] text-[var(--text-tertiary)]\">\n {search.output || \"0\"}\n </div>\n </ToolSection>\n ) : null}\n {(search.mode === \"files_with_matches\" ||\n search.mode === \"list_files\" ||\n search.mode === \"count\") &&\n search.files.length === 0 &&\n !visibleOutput &&\n !search.error ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.results\")}>\n <div className=\"text-[11px] italic text-[var(--text-tertiary)]\">\n {translate(\"agentHost.agentTool.details.noMatches\")}\n </div>\n </ToolSection>\n ) : null}\n {search.mode === \"unknown\" && visibleOutput ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n <ToolMarkdownBlock\n content={visibleOutput}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n {search.error ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.error\")}>\n <ToolMarkdownBlock\n content={search.error}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n </div>\n );\n}\n\nfunction withStableOccurrenceKeys(\n values: readonly string[],\n prefix: string\n): Array<{ key: string; value: string; isFirst: boolean }> {\n const seen = new Map<string, number>();\n const keyedValues: Array<{ key: string; value: string; isFirst: boolean }> =\n [];\n let isFirst = true;\n for (const value of values) {\n const occurrence = seen.get(value) ?? 0;\n seen.set(value, occurrence + 1);\n keyedValues.push({\n key: `${prefix}:${value}:${occurrence}`,\n value,\n isFirst\n });\n isFirst = false;\n }\n return keyedValues;\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { ToolMarkdownBlock } from \"./agentToolContentShared\";\nimport { getSkillRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentSkillContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const skill = getSkillRenderData(call);\n\n if (!skill.skill && !skill.statusText) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {skill.skill ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.skill\")}>\n <ToolMarkdownBlock\n content={\n skill.args ? `${skill.skill}\\n\\n${skill.args}` : skill.skill\n }\n onLinkClick={onLinkClick}\n />\n </ToolSection>\n ) : null}\n {skill.statusText ? (\n <div className=\"text-[10px] text-[var(--text-tertiary)]\">\n {skill.statusText}\n </div>\n ) : null}\n </div>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport type { AgentTaskStepVM } from \"../contracts/agentTaskItemVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport { projectAgentTaskStepTool } from \"../projection/agentTaskProjection\";\nimport { AgentToolCallHeader } from \"./AgentToolCallHeader\";\nimport { AgentExpandedToolContent } from \"./tool-renderers/AgentExpandedToolContent\";\nimport { hasAgentToolContent } from \"./tool-renderers/agentToolContentShared\";\n\ninterface AgentTaskStepListProps {\n steps: AgentTaskStepVM[];\n onLinkClick?: (href: string) => void;\n}\n\nexport function AgentTaskStepList({\n steps,\n onLinkClick\n}: AgentTaskStepListProps): JSX.Element {\n \"use memo\";\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-stack\">\n {steps.map((step) => (\n <AgentTaskStepRow key={step.id} step={step} onLinkClick={onLinkClick} />\n ))}\n </div>\n );\n}\n\nfunction AgentTaskStepRow({\n step,\n onLinkClick\n}: {\n step: AgentTaskStepVM;\n onLinkClick?: (href: string) => void;\n}): JSX.Element {\n \"use memo\";\n const [expanded, setExpanded] = useState(false);\n const call = step.tool ?? projectTaskStepCall(step);\n const hasDetail = hasAgentToolContent(call);\n const ariaLabel = taskStepAriaLabel(call);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-row\">\n {hasDetail ? (\n <button\n type=\"button\"\n className=\"workspace-agents-status-panel__detail-tool-row-head workspace-agents-status-panel__detail-tool-row-head--button\"\n aria-expanded={expanded}\n aria-label={ariaLabel}\n onClick={() => setExpanded((value) => !value)}\n >\n <AgentToolCallHeader call={call} expanded={expanded} hasDetail />\n </button>\n ) : (\n <div className=\"workspace-agents-status-panel__detail-tool-row-head\">\n <AgentToolCallHeader call={call} expanded={false} hasDetail={false} />\n </div>\n )}\n {!hasDetail && step.summary ? (\n <div className=\"workspace-agents-status-panel__detail-tool-summary\">\n {step.summary}\n </div>\n ) : null}\n {hasDetail && expanded ? (\n <AgentExpandedToolContent call={call} onLinkClick={onLinkClick} />\n ) : null}\n </div>\n );\n}\n\nfunction taskStepAriaLabel(call: AgentToolCallVM): string {\n return [\n call.name,\n call.status,\n call.compactSummary?.trim() || call.summary.trim()\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction projectTaskStepCall(step: AgentTaskStepVM): AgentToolCallVM {\n return projectAgentTaskStepTool({\n id: step.id,\n turnId: step.turnId,\n toolName: step.toolName,\n name: step.name,\n callType: null,\n status: step.status,\n summary: step.summary,\n payload: null,\n metadata: null,\n input:\n step.payload &&\n typeof step.payload.input === \"object\" &&\n step.payload.input !== null\n ? (step.payload.input as Record<string, unknown>)\n : null,\n output:\n step.payload &&\n typeof step.payload.output === \"object\" &&\n step.payload.output !== null\n ? (step.payload.output as Record<string, unknown>)\n : null,\n error:\n step.payload &&\n typeof step.payload.error === \"object\" &&\n step.payload.error !== null\n ? (step.payload.error as Record<string, unknown>)\n : null,\n content: null,\n locations: null,\n occurredAtUnixMs: step.occurredAtUnixMs ?? null\n });\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n ToolMarkdownBlock,\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { AgentTaskStepList } from \"../AgentTaskStepList\";\nimport { getTaskRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentTaskContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element {\n \"use memo\";\n const task = getTaskRenderData(call);\n const failureMarkdown =\n task.errorMarkdown ??\n (isFailedTaskStatus(call.statusKind, task.status, call.status)\n ? translate(\"agentHost.agentTool.details.missingFailureDetails\")\n : null);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n <div className=\"workspace-agents-status-panel__detail-tool-answer\">\n <strong>{task.title}</strong>\n {task.status ? (\n <span className=\"workspace-agents-status-panel__detail-tool-answer--muted\">\n {\" · \"}\n {task.status}\n </span>\n ) : null}\n {task.durationText ? (\n <span className=\"workspace-agents-status-panel__detail-tool-answer--muted\">\n {\" · \"}\n {task.durationText}\n </span>\n ) : null}\n </div>\n {task.status === \"running\" && task.latestStepSummary ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.summary\")}>\n <div className=\"workspace-agents-status-panel__detail-tool-answer workspace-agents-status-panel__detail-tool-answer--muted\">\n {task.latestStepSummary}\n </div>\n </ToolSection>\n ) : null}\n {task.prompt ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.prompt\")}>\n <ToolMarkdownBlock content={task.prompt} onLinkClick={onLinkClick} />\n </ToolSection>\n ) : null}\n {task.childSessionId ? (\n <ToolSection\n title={translate(\"agentHost.agentTool.details.delegateSession\")}\n >\n <div className=\"workspace-agents-status-panel__detail-tool-answer\">\n {task.childSessionId}\n </div>\n </ToolSection>\n ) : null}\n {task.steps.length > 0 ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.steps\")}>\n <AgentTaskStepList steps={task.steps} onLinkClick={onLinkClick} />\n </ToolSection>\n ) : null}\n {task.resultMarkdown ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n <ToolMarkdownBlock\n content={task.resultMarkdown}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n {failureMarkdown ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.error\")}>\n <ToolMarkdownBlock\n content={failureMarkdown}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n </div>\n );\n}\n\nfunction isFailedTaskStatus(\n ...values: Array<string | null | undefined>\n): boolean {\n return values.some((value) => {\n const normalized = (value ?? \"\").trim().toLowerCase();\n return normalized === \"failed\" || normalized === \"error\";\n });\n}\n","import type { JSX } from \"react\";\nimport { CheckCircle2, Circle } from \"lucide-react\";\nimport { AtomIcon } from \"../../../../app/renderer/components/icons/AtomIcon\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getTodoRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentTodoWriteContent({\n call\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const todos = getTodoRenderData(call);\n if (todos.length === 0) {\n return null;\n }\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n <ToolSection title={translate(\"agentHost.agentTool.details.todos\")}>\n <div className=\"space-y-1\">\n {todos.map((todo) => (\n <div\n key={`${todo.content}:${todo.status ?? \"pending\"}`}\n className=\"flex items-start gap-2 rounded-[8px] px-1 py-0.5 text-[11px]\"\n >\n <div className=\"mt-[1px] shrink-0\">\n {iconForStatus(todo.status)}\n </div>\n <span className={contentClassName(todo.status)}>\n {todo.content}\n </span>\n </div>\n ))}\n </div>\n </ToolSection>\n </div>\n );\n}\n\nfunction iconForStatus(status: string | null): JSX.Element {\n switch (status) {\n case \"completed\":\n return (\n <CheckCircle2\n size={14}\n className=\"text-[var(--state-success)]\"\n aria-hidden=\"true\"\n />\n );\n case \"in_progress\":\n return (\n <AtomIcon\n size={14}\n active\n className=\"text-[var(--tutti-purple)]\"\n aria-hidden=\"true\"\n />\n );\n default:\n return (\n <Circle\n size={14}\n className=\"text-[var(--text-tertiary)]\"\n aria-hidden=\"true\"\n />\n );\n }\n}\n\nfunction contentClassName(status: string | null): string {\n switch (status) {\n case \"completed\":\n return \"text-[var(--text-tertiary)] line-through\";\n case \"in_progress\":\n return \"text-[var(--text-primary)]\";\n default:\n return \"text-[var(--text-secondary)]\";\n }\n}\n","import type { JSX } from \"react\";\nimport { translate } from \"../../../../i18n/index\";\nimport {\n ToolMarkdownBlock,\n ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getToolSearchRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentToolSearchContent({\n call\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const toolSearch = getToolSearchRenderData(call);\n if (!toolSearch.query && toolSearch.matches.length === 0) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {toolSearch.displayQuery ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.query\")}>\n <ToolMarkdownBlock\n content={`${toolSearch.displayQuery}\\n\\n${toolSearch.mode}`}\n />\n </ToolSection>\n ) : null}\n {toolSearch.matches.length > 0 ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.results\")}>\n <div className=\"workspace-agents-status-panel__detail-tool-result-list overflow-hidden rounded-[8px] border border-[var(--line-2)] bg-[var(--transparency-block)]\">\n {toolSearch.matches.map((match, index) => (\n <div\n key={match}\n className={`px-3 py-2 font-[var(--tsh-font-mono)] text-[11px] text-[var(--text-primary)] ${\n index > 0 ? \"border-t border-[var(--line-2)]\" : \"\"\n }`}\n >\n {match}\n </div>\n ))}\n </div>\n </ToolSection>\n ) : null}\n {toolSearch.matches.length === 0 ? (\n <div className=\"text-[11px] italic text-[var(--text-tertiary)]\">\n {translate(\"agentHost.agentTool.details.noMatchingTools\")}\n </div>\n ) : null}\n {typeof toolSearch.totalDeferredTools === \"number\" ? (\n <div className=\"text-[10px] text-[var(--text-tertiary)]\">\n {translate(\"agentHost.agentTool.details.loadedAvailable\", {\n loaded: toolSearch.matches.length,\n available: toolSearch.totalDeferredTools\n })}\n </div>\n ) : null}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { AgentCodeBlock } from \"./code/AgentCodeBlock\";\nimport { AgentUnifiedPatchViewer } from \"./file-diff/AgentUnifiedPatchViewer\";\nimport {\n stringValue,\n ToolMarkdownBlock,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\nimport { getFileChangeRenderData } from \"./render-data/agentToolRenderData\";\n\nexport function AgentWriteContent({\n call,\n onLinkClick\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const files = getFileChangeRenderData(call);\n const [file] = files;\n const path =\n file?.path ??\n stringValue(call.input?.path) ??\n stringValue(call.input?.file_path) ??\n stringValue(call.input?.filePath) ??\n null;\n const contentFiles = files.filter((candidate) => candidate.content);\n const contentPaths = new Set(contentFiles.map((candidate) => candidate.path));\n const patchFiles = files.filter(\n (candidate) => candidate.unifiedDiff && !contentPaths.has(candidate.path)\n );\n const fallbackContent =\n files.length === 0 ? call.summary.trim() || null : null;\n const showFileHeaders = files.length > 1;\n const hasRenderableContent =\n Boolean(path && files.length === 0) ||\n patchFiles.length > 0 ||\n contentFiles.length > 0 ||\n Boolean(fallbackContent);\n\n if (!hasRenderableContent) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body workspace-agents-status-panel__detail-tool-body--flat\">\n {path && files.length === 0 ? (\n <ToolMarkdownBlock content={path} onLinkClick={onLinkClick} />\n ) : null}\n {patchFiles.map((candidate) => (\n <AgentUnifiedPatchViewer\n key={`patch:${candidate.path}`}\n path={candidate.path}\n diffText={candidate.unifiedDiff!}\n showHeader={showFileHeaders}\n compact\n flat\n />\n ))}\n {contentFiles.map((candidate) => (\n <AgentCodeBlock\n key={`content:${candidate.path}`}\n path={candidate.path}\n content={candidate.content!}\n language={candidate.language}\n showHeader={showFileHeaders}\n flat\n />\n ))}\n {fallbackContent ? (\n <AgentCodeBlock\n path={path}\n content={fallbackContent}\n language={file?.language ?? null}\n showHeader={false}\n flat\n />\n ) : null}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { AgentToolCallVM } from \"../../contracts/agentToolCallVM\";\nimport { AgentApprovalContent } from \"./AgentApprovalContent\";\nimport { AgentAskUserQuestionContent } from \"./AgentAskUserQuestionContent\";\nimport { AgentBashContent } from \"./AgentBashContent\";\nimport { AgentEditContent } from \"./AgentEditContent\";\nimport { AgentImageGenerationContent } from \"./AgentImageGenerationContent\";\nimport { AgentMcpToolContent } from \"./AgentMcpToolContent\";\nimport { AgentPlanModeContent } from \"./AgentPlanModeContent\";\nimport { AgentReadContent } from \"./AgentReadContent\";\nimport { AgentSearchContent } from \"./AgentSearchContent\";\nimport { AgentSkillContent } from \"./AgentSkillContent\";\nimport { AgentTaskContent } from \"./AgentTaskContent\";\nimport { AgentTodoWriteContent } from \"./AgentTodoWriteContent\";\nimport { AgentToolSearchContent } from \"./AgentToolSearchContent\";\nimport {\n AgentDefaultToolContent,\n AgentToolPreviewModeProvider\n} from \"./agentToolContentShared\";\nimport { AgentWebFetchContent } from \"./AgentWebFetchContent\";\nimport { AgentWebSearchContent } from \"./AgentWebSearchContent\";\nimport { AgentWriteContent } from \"./AgentWriteContent\";\n\nexport function AgentExpandedToolContent({\n call,\n onLinkClick,\n previewMode = false\n}: {\n call: AgentToolCallVM;\n onLinkClick?: (href: string) => void;\n previewMode?: boolean;\n}): JSX.Element | null {\n \"use memo\";\n const props = { call, onLinkClick, previewMode };\n let content: JSX.Element | null;\n switch (call.rendererKind) {\n case \"approval\":\n content = <AgentApprovalContent {...props} />;\n break;\n case \"plan-enter\":\n case \"plan-exit\":\n content = <AgentPlanModeContent {...props} />;\n break;\n case \"ask-user\":\n content = <AgentAskUserQuestionContent {...props} />;\n break;\n case \"task\":\n content = <AgentTaskContent {...props} />;\n break;\n case \"read\":\n content = <AgentReadContent {...props} />;\n break;\n case \"write\":\n content = <AgentWriteContent {...props} />;\n break;\n case \"edit\":\n content = <AgentEditContent {...props} />;\n break;\n case \"bash\":\n content = <AgentBashContent {...props} />;\n break;\n case \"search\":\n content = <AgentSearchContent {...props} />;\n break;\n case \"web-search\":\n content = <AgentWebSearchContent {...props} />;\n break;\n case \"web-fetch\":\n content = <AgentWebFetchContent {...props} />;\n break;\n case \"image-generation\":\n content = <AgentImageGenerationContent {...props} />;\n break;\n case \"todo-write\":\n content = <AgentTodoWriteContent {...props} />;\n break;\n case \"tool-search\":\n content = <AgentToolSearchContent {...props} />;\n break;\n case \"skill\":\n content = <AgentSkillContent {...props} />;\n break;\n case \"mcp\":\n content = <AgentMcpToolContent {...props} />;\n break;\n default:\n content = <AgentDefaultToolContent {...props} />;\n }\n if (!content) {\n return null;\n }\n return (\n <AgentToolPreviewModeProvider previewMode={previewMode}>\n {content}\n </AgentToolPreviewModeProvider>\n );\n}\n","import type { JSX } from \"react\";\nimport type { AgentToolCallCardProps } from \"./AgentToolCallCard\";\nimport { AgentToolCallHeader } from \"./AgentToolCallHeader\";\nimport { AgentExpandedToolContent } from \"./tool-renderers/AgentExpandedToolContent\";\nimport { hasAgentToolContent } from \"./tool-renderers/agentToolContentShared\";\n\nexport function AgentEnterPlanModeCard({\n call,\n onLinkClick,\n previewMode = false\n}: AgentToolCallCardProps): JSX.Element {\n \"use memo\";\n const hasDetail = hasAgentToolContent(call);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-row workspace-agents-status-panel__detail-tool-row--plan-enter\">\n <div className=\"workspace-agents-status-panel__detail-tool-row-head\">\n <AgentToolCallHeader call={call} expanded={false} hasDetail={false} />\n </div>\n {!hasDetail && call.summary ? (\n <div className=\"workspace-agents-status-panel__detail-tool-summary\">\n {call.summary}\n </div>\n ) : null}\n {hasDetail ? (\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n ) : null}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { AgentToolCallCardProps } from \"./AgentToolCallCard\";\nimport { AgentToolCallHeader } from \"./AgentToolCallHeader\";\nimport { AgentExpandedToolContent } from \"./tool-renderers/AgentExpandedToolContent\";\nimport { hasAgentToolContent } from \"./tool-renderers/agentToolContentShared\";\n\nexport function AgentExitPlanModeCard({\n call,\n onLinkClick,\n previewMode = false\n}: AgentToolCallCardProps): JSX.Element {\n \"use memo\";\n const hasDetail = hasAgentToolContent(call);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-row workspace-agents-status-panel__detail-tool-row--plan-exit\">\n <div className=\"workspace-agents-status-panel__detail-tool-row-head\">\n <AgentToolCallHeader call={call} expanded={false} hasDetail={false} />\n </div>\n {!hasDetail && call.summary ? (\n <div className=\"workspace-agents-status-panel__detail-tool-summary\">\n {call.summary}\n </div>\n ) : null}\n {hasDetail ? (\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n ) : null}\n </div>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport type { AgentToolCallCardProps } from \"./AgentToolCallCard\";\nimport { AgentToolCallHeader } from \"./AgentToolCallHeader\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport { AgentExpandedToolContent } from \"./tool-renderers/AgentExpandedToolContent\";\nimport { hasAgentToolContent } from \"./tool-renderers/agentToolContentShared\";\n\nexport function AgentTaskCallCard({\n call,\n onLinkClick,\n previewMode = false,\n defaultExpanded,\n nonCollapsible\n}: AgentToolCallCardProps): JSX.Element {\n \"use memo\";\n const running =\n (call.task?.status ?? call.status ?? \"\").trim().toLowerCase() === \"running\";\n const hasDetail = hasAgentToolContent(call);\n const pinned = nonCollapsible ?? running;\n const [expanded, setExpanded] = useState(defaultExpanded ?? running);\n const ariaLabel = taskCallAriaLabel(call);\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-row workspace-agents-status-panel__detail-tool-row--task\">\n {hasDetail && !pinned ? (\n <button\n type=\"button\"\n className=\"workspace-agents-status-panel__detail-tool-row-head workspace-agents-status-panel__detail-tool-row-head--button\"\n aria-expanded={expanded}\n aria-label={ariaLabel}\n onClick={() => setExpanded((value) => !value)}\n >\n <AgentToolCallHeader call={call} expanded={expanded} hasDetail />\n </button>\n ) : (\n <div className=\"workspace-agents-status-panel__detail-tool-row-head\">\n <AgentToolCallHeader call={call} expanded={false} hasDetail={false} />\n </div>\n )}\n {!hasDetail && call.summary ? (\n <div className=\"workspace-agents-status-panel__detail-tool-summary\">\n {call.summary}\n </div>\n ) : null}\n {hasDetail && pinned ? (\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n ) : null}\n {hasDetail && !pinned ? (\n <CollapsibleReveal expanded={expanded}>\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n </CollapsibleReveal>\n ) : null}\n </div>\n );\n}\n\nfunction taskCallAriaLabel(call: AgentToolCallCardProps[\"call\"]): string {\n return [\n call.name,\n call.status,\n call.compactSummary?.trim() || call.summary.trim()\n ]\n .filter(Boolean)\n .join(\" \");\n}\n","import { memo, useEffect, useState, type JSX } from \"react\";\nimport { AlertCircle, ChevronDown, ChevronRight } from \"lucide-react\";\nimport { AgentLinedIcon } from \"../../../app/renderer/components/icons/AgentLinedIcon\";\nimport { translate } from \"../../../i18n/index\";\nimport type { AgentTaskSubAgentVM } from \"../contracts/agentTaskItemVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport { formatAgentToolDurationMs } from \"./tool-renderers/render-data/agentToolRenderData\";\n\n// A delegated sub-agent renders as a first-class row aligned with tool rows:\n// header = \"Sub-agent · <name> · <elapsed> · <status>\" with a chevron, body =\n// the indented detail panel (TASK / PROGRESS). Identity and status are the\n// sub-agent's own (child thread nickname + lifecycle), never the spawn tool's.\nexport function AgentSubAgentCards({\n call,\n onLinkClick\n}: {\n call: AgentToolCallVM;\n onLinkClick?: (href: string) => void;\n}): JSX.Element | null {\n \"use memo\";\n const subAgents = call.task?.subAgents ?? [];\n if (subAgents.length === 0) {\n return null;\n }\n // No wrapper element: the transcript row's spacing-compression selectors\n // match direct .detail-tool-row children, keeping gaps identical to tools.\n return (\n <>\n {subAgents.map((subAgent) => (\n <AgentSubAgentCard\n key={subAgent.childSessionId}\n subAgent={subAgent}\n onLinkClick={onLinkClick}\n />\n ))}\n </>\n );\n}\n\n// Field-level memo: streaming updates elsewhere in the transcript must not\n// re-render settled cards; a collapsed card renders only its header row\n// (CollapsibleReveal lazy-mounts the body on first expand).\nexport const AgentSubAgentCard = memo(\n AgentSubAgentCardImpl,\n (prev, next) =>\n prev.onLinkClick === next.onLinkClick &&\n subAgentVMEquals(prev.subAgent, next.subAgent)\n);\n\nfunction subAgentVMEquals(\n left: AgentTaskSubAgentVM,\n right: AgentTaskSubAgentVM\n): boolean {\n return (\n left.childSessionId === right.childSessionId &&\n left.parentToolCallId === right.parentToolCallId &&\n left.status === right.status &&\n left.name === right.name &&\n left.task === right.task &&\n left.laneIndex === right.laneIndex &&\n left.laneCount === right.laneCount &&\n left.latestActivity === right.latestActivity &&\n left.failureDetail === right.failureDetail &&\n left.queued === right.queued &&\n left.startedAtUnixMs === right.startedAtUnixMs &&\n left.latestActivityAtUnixMs === right.latestActivityAtUnixMs &&\n left.terminalAtUnixMs === right.terminalAtUnixMs &&\n left.childSessions === right.childSessions\n );\n}\n\nfunction AgentSubAgentCardImpl({\n subAgent,\n onLinkClick\n}: {\n subAgent: AgentTaskSubAgentVM;\n onLinkClick?: (href: string) => void;\n}): JSX.Element {\n \"use memo\";\n // Expanded by default while running; always collapsible via the header.\n const [expanded, setExpanded] = useState(subAgent.status === \"running\");\n\n return (\n <div\n className=\"workspace-agents-status-panel__detail-tool-row workspace-agents-status-panel__detail-tool-row--subagent\"\n data-status={subAgent.status}\n >\n <button\n type=\"button\"\n className=\"workspace-agents-status-panel__detail-tool-row-head workspace-agents-status-panel__detail-tool-row-head--button\"\n aria-expanded={expanded}\n aria-label={subAgentAriaLabel(subAgent)}\n onClick={() => setExpanded((value) => !value)}\n >\n <SubAgentHeader subAgent={subAgent} expanded={expanded} />\n </button>\n <CollapsibleReveal expanded={expanded}>\n <div className=\"workspace-agents-status-panel__detail-subagent-reveal\">\n <SubAgentBody subAgent={subAgent} onLinkClick={onLinkClick} />\n </div>\n </CollapsibleReveal>\n </div>\n );\n}\n\nfunction SubAgentHeader({\n subAgent,\n expanded\n}: {\n subAgent: AgentTaskSubAgentVM;\n expanded: boolean;\n}): JSX.Element {\n \"use memo\";\n const running = subAgent.status === \"running\";\n const statusLabel = subAgentStatusLabel(subAgent.status);\n const runningNowUnixMs = useRunningSubAgentNowUnixMs(subAgent);\n const elapsedText = subAgentElapsedText(subAgent, runningNowUnixMs);\n const nameText = subAgentNameText(subAgent);\n return (\n <div\n data-active={running ? \"true\" : undefined}\n className={[\n \"workspace-agents-status-panel__detail-tool-row-header-content\",\n running ? \"tsh-inline-scanlight-group\" : \"\"\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"workspace-agents-status-panel__detail-tool-row-icon tsh-inline-scanlight-icon\">\n {subAgent.status === \"failed\" ? (\n <AlertCircle size={16} strokeWidth={2} aria-hidden=\"true\" />\n ) : (\n <AgentLinedIcon width={16} height={16} aria-hidden=\"true\" />\n )}\n </div>\n <div className=\"workspace-agents-status-panel__detail-tool-row-text\">\n <strong className=\"workspace-agents-status-panel__detail-tool-row-title\">\n {translate(\"agentHost.agentTool.details.subAgentFallbackName\")}\n </strong>\n {nameText ? (\n <span className=\"workspace-agents-status-panel__detail-subagent-name\">\n {nameText}\n </span>\n ) : null}\n <span className=\"workspace-agents-status-panel__detail-tool-status\">\n {elapsedText ? `${elapsedText} · ` : \"\"}\n {statusLabel}\n </span>\n </div>\n {expanded ? (\n <ChevronDown\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"workspace-agents-status-panel__detail-tool-row-chevron\"\n />\n ) : (\n <ChevronRight\n size={12}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"workspace-agents-status-panel__detail-tool-row-chevron\"\n />\n )}\n </div>\n );\n}\n\nfunction SubAgentBody({\n subAgent,\n onLinkClick\n}: {\n subAgent: AgentTaskSubAgentVM;\n onLinkClick?: (href: string) => void;\n}): JSX.Element {\n \"use memo\";\n // Bash-block layout: the task is the header strip, live progress renders\n // below it - no section labels.\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body workspace-agents-status-panel__detail-tool-body--plain\">\n <div className=\"workspace-agents-status-panel__detail-subagent-terminal\">\n {subAgent.task ? (\n <div className=\"workspace-agents-status-panel__detail-subagent-task-strip\">\n {subAgent.task}\n </div>\n ) : null}\n <SubAgentProgress subAgent={subAgent} />\n {subAgent.childSessions.length > 0 ? (\n <div className=\"workspace-agents-status-panel__detail-subagent-children\">\n {subAgent.childSessions.map((childSession) => (\n <AgentSubAgentCard\n key={childSession.childSessionId}\n subAgent={childSession}\n onLinkClick={onLinkClick}\n />\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction SubAgentProgress({\n subAgent\n}: {\n subAgent: AgentTaskSubAgentVM;\n}): JSX.Element {\n \"use memo\";\n // Progress stays a single line - the sub-agent's most recent activity (or\n // failure detail), not a scrolling log.\n const text =\n subAgent.failureDetail ??\n subAgent.latestActivity ??\n translate(\n subAgent.queued\n ? \"agentHost.agentTool.details.subAgentQueued\"\n : \"agentHost.agentTool.details.subAgentStarting\"\n );\n return (\n <div\n className={`workspace-agents-status-panel__detail-subagent-activity workspace-agents-status-panel__detail-subagent-activity--in-terminal${\n subAgent.failureDetail\n ? \" workspace-agents-status-panel__detail-subagent-activity--failure\"\n : \"\"\n }`}\n >\n {text}\n </div>\n );\n}\n\nfunction subAgentNameText(subAgent: AgentTaskSubAgentVM): string | null {\n if (subAgent.name) {\n return subAgent.name;\n }\n return subAgent.laneCount > 1 ? `#${subAgent.laneIndex}` : null;\n}\n\nfunction subAgentAriaLabel(subAgent: AgentTaskSubAgentVM): string {\n return [\n translate(\"agentHost.agentTool.details.subAgentFallbackName\"),\n subAgentNameText(subAgent),\n subAgentStatusLabel(subAgent.status)\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction subAgentStatusLabel(status: AgentTaskSubAgentVM[\"status\"]): string {\n switch (status) {\n case \"completed\":\n return translate(\"agentHost.agentTool.statusCompleted\");\n case \"failed\":\n return translate(\"agentHost.agentTool.statusFailed\");\n case \"canceled\":\n return translate(\"agentHost.agentTool.statusCanceled\");\n case \"running\":\n default:\n return translate(\"agentHost.agentTool.statusWorking\");\n }\n}\n\n// A sub-agent that is merely `queued` has been accepted but has not been\n// dispatched to a provider yet (codex caps concurrent sub-agents and queues\n// spawns beyond the cap - see AgentTaskSubAgentVM.queued). Its `status` still\n// reads \"running\" (there is no child lifecycle yet to say otherwise) and its\n// `startedAtUnixMs` is stamped from the spawn call itself, i.e. dispatch/\n// queued time, not from when the sub-agent actually started running. Ticking\n// a live clock off that timestamp would count queued wait time as elapsed\n// run time, so the clock must stay off until the sub-agent is no longer\n// queued.\nfunction isSubAgentActivelyRunning(subAgent: AgentTaskSubAgentVM): boolean {\n return subAgent.status === \"running\" && !subAgent.queued;\n}\n\nfunction useRunningSubAgentNowUnixMs(\n subAgent: AgentTaskSubAgentVM\n): number | null {\n const shouldTick =\n isSubAgentActivelyRunning(subAgent) &&\n typeof subAgent.startedAtUnixMs === \"number\";\n const [nowUnixMs, setNowUnixMs] = useState<number | null>(() =>\n shouldTick ? Date.now() : null\n );\n\n useEffect(() => {\n if (!shouldTick) {\n setNowUnixMs(null);\n return;\n }\n\n const updateNow = () => setNowUnixMs(Date.now());\n updateNow();\n const intervalId = window.setInterval(updateNow, 1000);\n return () => window.clearInterval(intervalId);\n }, [shouldTick, subAgent.startedAtUnixMs]);\n\n return nowUnixMs;\n}\n\nfunction subAgentElapsedText(\n subAgent: AgentTaskSubAgentVM,\n runningNowUnixMs: number | null\n): string | null {\n const started = subAgent.startedAtUnixMs;\n if (typeof started !== \"number\") {\n return null;\n }\n\n const terminal = subAgent.terminalAtUnixMs;\n const latest = subAgent.latestActivityAtUnixMs;\n const ended =\n typeof terminal === \"number\"\n ? terminal\n : isSubAgentActivelyRunning(subAgent) &&\n typeof runningNowUnixMs === \"number\"\n ? Math.max(latest ?? started, runningNowUnixMs)\n : latest;\n if (typeof ended !== \"number\" || ended <= started) {\n return null;\n }\n return formatAgentToolDurationMs(ended - started);\n}\n","import type { SVGProps } from \"react\";\n\nexport function AgentLinedIcon(props: SVGProps<SVGSVGElement>) {\n \"use memo\";\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M12 3C12.5523 3 13 3.44772 13 4V7H18C19.6569 7 21 8.34315 21 10V13H22C22.5523 13 23 13.4477 23 14C23 14.5523 22.5523 15 22 15H21V18C21 19.6569 19.6569 21 18 21H6C4.34315 21 3 19.6569 3 18V15H2C1.44772 15 1 14.5523 1 14C1 13.4477 1.44772 13 2 13H3V10C3 8.34315 4.34315 7 6 7H11V5H8C7.44772 5 7 4.55228 7 4C7 3.44772 7.44772 3 8 3H12ZM6 9C5.44772 9 5 9.44772 5 10V18C5 18.5523 5.44772 19 6 19H18C18.5523 19 19 18.5523 19 18V10C19 9.44772 18.5523 9 18 9H6ZM9 12C9.55229 12 10 12.4477 10 13V15C10 15.5523 9.55229 16 9 16C8.44772 16 8 15.5523 8 15V13C8 12.4477 8.44772 12 9 12ZM15 12C15.5523 12 16 12.4477 16 13V15C16 15.5523 15.5523 16 15 16C14.4477 16 14 15.5523 14 15V13C14 12.4477 14.4477 12 15 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport { AgentToolCallHeader } from \"./AgentToolCallHeader\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport { AgentExpandedToolContent } from \"./tool-renderers/AgentExpandedToolContent\";\nimport { hasAgentToolContent } from \"./tool-renderers/agentToolContentShared\";\n\nexport interface AgentToolCallCardProps {\n call: AgentToolCallVM;\n onLinkClick?: (href: string) => void;\n previewMode?: boolean;\n defaultExpanded?: boolean;\n nonCollapsible?: boolean;\n variantClassName?: string;\n}\n\nexport function AgentToolCallCard({\n call,\n onLinkClick,\n previewMode = false,\n defaultExpanded = false,\n nonCollapsible = false,\n variantClassName\n}: AgentToolCallCardProps): JSX.Element {\n \"use memo\";\n const [expanded, setExpanded] = useState(defaultExpanded);\n const hasDetail = hasAgentToolContent(call);\n const canCollapse = hasDetail && !nonCollapsible;\n const ariaLabel = toolCallAriaLabel(call);\n\n return (\n <div\n className={[\n \"workspace-agents-status-panel__detail-tool-row\",\n variantClassName ?? \"\"\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {canCollapse ? (\n <button\n type=\"button\"\n className=\"workspace-agents-status-panel__detail-tool-row-head workspace-agents-status-panel__detail-tool-row-head--button\"\n aria-expanded={expanded}\n aria-label={ariaLabel}\n onClick={() => setExpanded((value) => !value)}\n >\n <AgentToolCallHeader call={call} expanded={expanded} hasDetail />\n </button>\n ) : (\n <div className=\"workspace-agents-status-panel__detail-tool-row-head\">\n <AgentToolCallHeader call={call} expanded={false} hasDetail={false} />\n </div>\n )}\n {hasDetail && nonCollapsible ? (\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n ) : null}\n {hasDetail && !nonCollapsible ? (\n <CollapsibleReveal expanded={expanded}>\n <AgentExpandedToolContent\n call={call}\n onLinkClick={onLinkClick}\n previewMode={previewMode}\n />\n </CollapsibleReveal>\n ) : null}\n </div>\n );\n}\n\nfunction toolCallAriaLabel(call: AgentToolCallVM): string {\n return [\n call.name,\n call.status,\n call.compactSummary?.trim() || call.summary.trim()\n ]\n .filter(Boolean)\n .join(\" \");\n}\n","import { useEffect, useMemo, useState, type JSX, type MouseEvent } from \"react\";\nimport {\n ChevronDown,\n ChevronRight,\n LoaderCircle,\n Redo2,\n Undo2\n} from \"lucide-react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n toast\n} from \"@tutti-os/ui-system\";\nimport { DirectLinedIcon } from \"../../../app/renderer/components/icons/DirectLinedIcon\";\nimport { translate } from \"../../../i18n/index\";\nimport { useOptionalAgentHostApi } from \"../../../agentActivityHost\";\nimport type { WorkspaceLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport { resolveWorkspaceFileLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport { CanvasNodeGhostIconButton } from \"../../../contexts/workspace/presentation/renderer/components/shared/CanvasNodeGhostIconButton\";\nimport type {\n AgentTurnSummaryFileVM,\n AgentTurnSummaryPatchBatchVM,\n AgentTurnSummaryRowVM\n} from \"../contracts/agentTurnSummaryRowVM\";\nimport { buildAgentTurnSummaryPatchDiff } from \"../rules/agentTurnSummaryPatchDiff\";\nimport {\n fileCanBuildPatch,\n patchBatchDirectoryCwd,\n resolvePatchDiffCwd,\n resolvePatchExecutionCwd\n} from \"../rules/agentTurnSummaryPatchRuntime\";\nimport { AgentCodeBlock } from \"./tool-renderers/code/AgentCodeBlock\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport { AgentMonacoDiffViewer } from \"./tool-renderers/file-diff/AgentMonacoDiffViewer\";\nimport { parseAgentUnifiedDiffStats } from \"./tool-renderers/file-diff/agentUnifiedDiff\";\nimport { AgentUnifiedPatchViewer } from \"./tool-renderers/file-diff/AgentUnifiedPatchViewer\";\n\ninterface AgentTurnSummaryRowProps {\n row: AgentTurnSummaryRowVM;\n workspaceRoot?: string | null;\n basePath?: string | null;\n label: string;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n previewMode?: boolean;\n}\n\ntype PatchSupportState =\n | { key: string; status: \"checking\" }\n | { key: string; status: \"supported\" }\n | { key: string; status: \"unsupported\" };\n\nexport function AgentTurnSummaryRow({\n row,\n workspaceRoot,\n basePath,\n onLinkAction\n}: AgentTurnSummaryRowProps): JSX.Element {\n \"use memo\";\n const [expandedFiles, setExpandedFiles] = useState<Record<string, boolean>>(\n {}\n );\n const [showAllFiles, setShowAllFiles] = useState(false);\n const [patchAction, setPatchAction] = useState<\"undo\" | \"reapply\">(\"undo\");\n const [patchPending, setPatchPending] = useState(false);\n const [patchSupportState, setPatchSupportState] =\n useState<PatchSupportState | null>(null);\n const agentHostApi = useOptionalAgentHostApi();\n const aggregateStats = useMemo(\n () => summarizeRowDiff(row.files),\n [row.files]\n );\n const patchBatches = useMemo(() => {\n const fileFallbackBatches = row.files.flatMap((file) =>\n fileCanBuildPatch(file)\n ? [\n {\n changes: [\n {\n path: file.path,\n changeType: file.changeType,\n unifiedDiff: file.unifiedDiff,\n oldString: file.oldString ?? null,\n newString: file.newString ?? null,\n content: file.content ?? null\n }\n ],\n cwd: fallbackPatchFileCwd(file.path, workspaceRoot),\n toolCallId: `${row.id}:${file.messageId}:unified-diff`\n }\n ]\n : []\n ) satisfies AgentTurnSummaryPatchBatchVM[];\n const sourceBatches =\n row.patchBatches && row.patchBatches.length > 0\n ? row.patchBatches\n : fileFallbackBatches;\n const batches = buildExecutablePatchBatches(sourceBatches, workspaceRoot);\n if (batches.length > 0 || sourceBatches === fileFallbackBatches) {\n return batches;\n }\n return buildExecutablePatchBatches(fileFallbackBatches, workspaceRoot);\n }, [row.files, row.id, row.patchBatches, workspaceRoot]);\n const canRenderPatchButton = Boolean(\n agentHostApi?.workspace.applyGitPatch && row.files.length > 0\n );\n const canApplyPatch = Boolean(\n agentHostApi?.workspace.applyGitPatch && patchBatches.length > 0\n );\n const patchSupportCwds = useMemo(\n () => Array.from(new Set(patchBatches.map((batch) => batch.cwd))).sort(),\n [patchBatches]\n );\n const patchSupportKey = patchSupportCwds.join(\"\\n\");\n const resolveGitPatchSupport = agentHostApi?.workspace.resolveGitPatchSupport;\n useEffect(() => {\n if (!resolveGitPatchSupport || patchSupportCwds.length === 0) {\n setPatchSupportState(null);\n return;\n }\n let disposed = false;\n setPatchSupportState({ key: patchSupportKey, status: \"checking\" });\n void (async () => {\n try {\n for (const cwd of patchSupportCwds) {\n const result = await resolveGitPatchSupport({ cwd });\n if (!result.supported) {\n if (!disposed) {\n setPatchSupportState({\n key: patchSupportKey,\n status: \"unsupported\"\n });\n }\n return;\n }\n }\n if (!disposed) {\n setPatchSupportState({ key: patchSupportKey, status: \"supported\" });\n }\n } catch {\n if (!disposed) {\n setPatchSupportState({ key: patchSupportKey, status: \"supported\" });\n }\n }\n })();\n return () => {\n disposed = true;\n };\n }, [patchSupportCwds, patchSupportKey, resolveGitPatchSupport]);\n const visibleFiles = row.files.slice(0, 3);\n const hiddenFiles = row.files.slice(3);\n const hiddenFileCount = hiddenFiles.length;\n const patchActionLabel =\n patchAction === \"undo\"\n ? translate(\"agentHost.agentGui.turnSummaryUndo\")\n : translate(\"agentHost.agentGui.turnSummaryReapply\");\n const isPatchSupportChecking = Boolean(\n resolveGitPatchSupport &&\n patchSupportCwds.length > 0 &&\n (patchSupportState?.key !== patchSupportKey ||\n patchSupportState.status === \"checking\")\n );\n const isPatchUnsupported = Boolean(\n patchSupportState?.key === patchSupportKey &&\n patchSupportState.status === \"unsupported\"\n );\n const patchDisabledReason = isPatchUnsupported\n ? translate(\"agentHost.agentGui.turnSummaryGitRequired\")\n : isPatchSupportChecking\n ? translate(\"agentHost.agentGui.turnSummaryCheckingGit\")\n : !canApplyPatch\n ? translate(\"agentHost.agentGui.turnSummaryPatchUnavailable\")\n : null;\n const isPatchActionDisabled = Boolean(\n patchPending ||\n isPatchSupportChecking ||\n isPatchUnsupported ||\n !canApplyPatch\n );\n\n const handlePatchAction = async (event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n if (!agentHostApi?.workspace.applyGitPatch || isPatchActionDisabled) {\n return;\n }\n const orderedBatches =\n patchAction === \"undo\" ? [...patchBatches].reverse() : patchBatches;\n if (orderedBatches.length === 0) {\n return;\n }\n setPatchPending(true);\n let changed = false;\n const failureMessage =\n patchAction === \"undo\"\n ? translate(\"agentHost.agentGui.turnSummaryUndoFailed\")\n : translate(\"agentHost.agentGui.turnSummaryReapplyFailed\");\n try {\n for (const batch of orderedBatches) {\n const result = await agentHostApi.workspace.applyGitPatch({\n cwd: batch.cwd,\n diff: batch.diff,\n revert: patchAction === \"undo\"\n });\n if (\n result.status === \"success\" ||\n result.appliedPaths.length > 0 ||\n result.conflictedPaths.length > 0\n ) {\n changed = true;\n }\n if (result.status !== \"success\") {\n showPatchFailureToast(\n agentHostApi,\n patchFailureMessage(result.errorCode, failureMessage)\n );\n return;\n }\n }\n setPatchAction((current) => (current === \"undo\" ? \"reapply\" : \"undo\"));\n } catch {\n showPatchFailureToast(agentHostApi, failureMessage);\n } finally {\n setPatchPending(false);\n if (changed) {\n window.dispatchEvent(new CustomEvent(\"tutti-agent-git-patch-applied\"));\n }\n }\n };\n\n return (\n <section className=\"workspace-agents-status-panel__detail-turn-summary\">\n <div className=\"agent-turn-summary-card w-full overflow-hidden rounded-[8px] text-[var(--text-primary)]\">\n <div className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"min-w-0 text-[15px] font-semibold leading-5 tracking-[0] text-[var(--text-primary)]\">\n {translate(\"agentHost.agentGui.turnSummaryFilesChanged\", {\n count: row.fileCount\n })}\n </div>\n <div className=\"inline-flex shrink-0 items-center gap-2.5 text-[11px] font-semibold\">\n {aggregateStats.added > 0 ? (\n <span className=\"workspace-agents-status-panel__detail-tool-diff-added\">\n +{aggregateStats.added}\n </span>\n ) : null}\n {aggregateStats.removed > 0 ? (\n <span className=\"workspace-agents-status-panel__detail-tool-diff-removed\">\n -{aggregateStats.removed}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n {canRenderPatchButton ? (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className={`inline-flex shrink-0 ${\n isPatchActionDisabled ? \"cursor-not-allowed\" : \"\"\n }`}\n >\n <CanvasNodeGhostIconButton\n aria-label={patchActionLabel}\n className=\"w-auto min-w-0 gap-1.5 px-2 text-[12px] font-medium leading-4 disabled:pointer-events-none\"\n disabled={isPatchActionDisabled}\n onClick={handlePatchAction}\n >\n {patchPending || isPatchSupportChecking ? (\n <LoaderCircle\n width={14}\n height={14}\n aria-hidden=\"true\"\n className=\"animate-spin text-[var(--text-secondary)]\"\n />\n ) : patchAction === \"undo\" ? (\n <Undo2\n width={14}\n height={14}\n aria-hidden=\"true\"\n className=\"text-[var(--text-secondary)]\"\n />\n ) : (\n <Redo2\n width={14}\n height={14}\n aria-hidden=\"true\"\n className=\"text-[var(--text-secondary)]\"\n />\n )}\n <span>{patchActionLabel}</span>\n </CanvasNodeGhostIconButton>\n </span>\n </TooltipTrigger>\n {patchDisabledReason ? (\n <TooltipContent className=\"max-w-[260px] whitespace-normal text-left\">\n {patchDisabledReason}\n </TooltipContent>\n ) : null}\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </div>\n\n <div className=\"agent-turn-summary-card__list\">\n {visibleFiles.map((file) => {\n const key = `${file.path}:${file.messageId}`;\n return (\n <TurnSummaryFileCard\n key={key}\n file={file}\n workspaceRoot={workspaceRoot}\n basePath={basePath}\n expanded={Boolean(expandedFiles[key])}\n onLinkAction={onLinkAction}\n onToggle={() =>\n setExpandedFiles((current) => ({\n ...current,\n [key]: !current[key]\n }))\n }\n />\n );\n })}\n\n {hiddenFileCount > 0 ? (\n <CollapsibleReveal expanded={showAllFiles} preMountOnIdle>\n <div className=\"agent-turn-summary-card__overflow-list\">\n {hiddenFiles.map((file) => {\n const key = `${file.path}:${file.messageId}`;\n return (\n <TurnSummaryFileCard\n key={key}\n file={file}\n workspaceRoot={workspaceRoot}\n basePath={basePath}\n expanded={Boolean(expandedFiles[key])}\n onLinkAction={onLinkAction}\n onToggle={() =>\n setExpandedFiles((current) => ({\n ...current,\n [key]: !current[key]\n }))\n }\n />\n );\n })}\n </div>\n </CollapsibleReveal>\n ) : null}\n\n {hiddenFileCount > 0 && !showAllFiles ? (\n <button\n type=\"button\"\n className=\"agent-turn-summary-card__toggle-more flex w-full items-center gap-2 px-4 py-2.5 text-left text-[11px] font-semibold transition-colors\"\n onClick={() => setShowAllFiles(true)}\n >\n <span>\n {translate(\"agentHost.agentGui.turnSummaryShowMoreFiles\", {\n count: hiddenFileCount\n })}\n </span>\n <ChevronDown size={16} strokeWidth={2.2} aria-hidden=\"true\" />\n </button>\n ) : hiddenFileCount > 0 ? (\n <button\n type=\"button\"\n className=\"agent-turn-summary-card__toggle-more flex w-full items-center gap-2 px-4 py-2.5 text-left text-[11px] font-semibold transition-colors\"\n onClick={() => setShowAllFiles(false)}\n >\n <span>\n {translate(\"agentHost.agentGui.turnSummaryShowFewerFiles\")}\n </span>\n <ChevronRight\n size={16}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className=\"-rotate-90\"\n />\n </button>\n ) : null}\n </div>\n </div>\n </section>\n );\n}\n\nfunction patchFailureMessage(\n errorCode: string | undefined,\n fallback: string\n): string {\n switch (errorCode) {\n case \"invalid-patch\":\n return translate(\"agentHost.agentGui.turnSummaryInvalidPatch\");\n case \"patch-does-not-apply\":\n return translate(\"agentHost.agentGui.turnSummaryPatchDoesNotApply\");\n case \"not-git-repo\":\n return translate(\"agentHost.agentGui.turnSummaryGitRequired\");\n default:\n return fallback;\n }\n}\n\nfunction TurnSummaryFileCard({\n file,\n workspaceRoot,\n basePath,\n expanded,\n onLinkAction,\n onToggle\n}: {\n file: AgentTurnSummaryFileVM;\n workspaceRoot?: string | null;\n basePath?: string | null;\n expanded: boolean;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onToggle: () => void;\n}): JSX.Element {\n \"use memo\";\n const action = resolveWorkspaceFileLinkAction({\n path: file.path,\n workspaceRoot: workspaceRoot,\n basePath,\n source: \"agent-file-change\"\n });\n const canOpen = Boolean(action && onLinkAction);\n const stats = summarizeFileDiff(file);\n const preview = filePreview(file);\n\n return (\n <div className=\"agent-turn-summary-card__file\">\n <div className=\"agent-turn-summary-card__file-row flex min-w-0 items-center gap-2.5 overflow-hidden px-4 py-2.5\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2.5\">\n <button\n type=\"button\"\n className=\"group/file-toggle flex min-w-0 flex-1 items-center gap-1 overflow-hidden text-left\"\n aria-expanded={expanded}\n onClick={onToggle}\n >\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n <span\n className={`agent-turn-summary-card__path flex min-w-0 max-w-full overflow-hidden whitespace-nowrap text-[13px] font-medium leading-5 text-[var(--text-secondary)] ${\n file.changeType === \"deleted\" ? \"line-through\" : \"\"\n }`}\n title={file.path}\n >\n {file.directory ? (\n <span className=\"agent-turn-summary-card__path-directory\">\n {file.directory}/\n </span>\n ) : null}\n <span className=\"agent-turn-summary-card__path-file\">\n {file.fileName}\n </span>\n </span>\n </div>\n <span className=\"shrink-0 text-[var(--text-tertiary)] opacity-0 transition-opacity group-hover/file-toggle:opacity-100 group-focus-visible/file-toggle:opacity-100\">\n <ChevronRight\n size={14}\n strokeWidth={2.2}\n aria-hidden=\"true\"\n className={`transition-transform duration-150 ease-out ${expanded ? \"rotate-90\" : \"rotate-0\"}`}\n />\n </span>\n </button>\n <span className=\"ml-auto inline-flex shrink-0 items-center gap-2 text-[11px] font-semibold\">\n {stats.added > 0 ? (\n <span className=\"workspace-agents-status-panel__detail-tool-diff-added\">\n +{stats.added}\n </span>\n ) : null}\n {stats.removed > 0 ? (\n <span className=\"workspace-agents-status-panel__detail-tool-diff-removed\">\n -{stats.removed}\n </span>\n ) : null}\n </span>\n </div>\n\n {canOpen ? (\n <CanvasNodeGhostIconButton\n aria-label={translate(\n \"agentHost.workspaceAgentSessionDetailOpenFile\",\n {\n path: file.path\n }\n )}\n onClick={() => {\n onLinkAction?.(action as WorkspaceLinkAction);\n }}\n >\n <DirectLinedIcon\n width={14}\n height={14}\n aria-hidden=\"true\"\n className=\"text-[var(--text-secondary)]\"\n />\n </CanvasNodeGhostIconButton>\n ) : null}\n </div>\n\n {preview ? (\n <CollapsibleReveal expanded={expanded} preMountOnIdle>\n <div className=\"agent-turn-summary-card__preview rounded-none px-4 pb-3 pt-2\">\n {preview}\n </div>\n </CollapsibleReveal>\n ) : null}\n </div>\n );\n}\n\nfunction filePreview(file: AgentTurnSummaryFileVM): JSX.Element | null {\n if (file.changeType === \"created\" && file.content?.trim()) {\n return (\n <AgentCodeBlock\n path={file.path}\n content={file.content}\n showHeader={false}\n collapsible\n flat\n />\n );\n }\n\n if (file.unifiedDiff?.trim()) {\n return (\n <AgentUnifiedPatchViewer\n path={file.path}\n diffText={file.unifiedDiff}\n showHeader={false}\n flat\n />\n );\n }\n\n if (file.changeType === \"created\" && file.newString?.trim()) {\n return (\n <AgentCodeBlock\n path={file.path}\n content={file.newString}\n showHeader={false}\n collapsible\n flat\n />\n );\n }\n\n if (file.oldString?.trim() || file.newString?.trim()) {\n return (\n <AgentMonacoDiffViewer\n path={file.path}\n oldValue={file.oldString ?? \"\"}\n newValue={file.newString ?? \"\"}\n flat\n showHeader={false}\n />\n );\n }\n\n if (file.content?.trim()) {\n return (\n <AgentCodeBlock\n path={file.path}\n content={file.content}\n showHeader={false}\n collapsible\n flat\n />\n );\n }\n\n return null;\n}\n\nfunction summarizeRowDiff(files: AgentTurnSummaryFileVM[]): {\n added: number;\n removed: number;\n} {\n return files.reduce(\n (totals, file) => {\n const stats = summarizeFileDiff(file);\n return {\n added: totals.added + stats.added,\n removed: totals.removed + stats.removed\n };\n },\n { added: 0, removed: 0 }\n );\n}\n\nfunction showPatchFailureToast(\n agentHostApi: ReturnType<typeof useOptionalAgentHostApi>,\n message: string\n): void {\n if (agentHostApi?.toast?.error) {\n agentHostApi.toast.error(message);\n return;\n }\n toast.error(message);\n}\n\nfunction buildExecutablePatchBatches(\n sourceBatches: readonly AgentTurnSummaryPatchBatchVM[],\n workspaceRoot?: string | null\n): { cwd: string; diff: string }[] {\n return sourceBatches.flatMap((batch) => {\n const sourceCwd = patchBatchDirectoryCwd(\n batch.cwd ?? workspaceRoot ?? null,\n batch.changes\n );\n const executionCwd = resolvePatchExecutionCwd(sourceCwd, workspaceRoot);\n const diffCwd = resolvePatchDiffCwd({\n executionCwd,\n sourceCwd,\n changes: batch.changes\n });\n const diff = buildAgentTurnSummaryPatchDiff({\n ...batch,\n cwd: diffCwd\n });\n return executionCwd && diff.trim() ? [{ cwd: executionCwd, diff }] : [];\n });\n}\n\nfunction fallbackPatchFileCwd(\n path: string,\n workspaceRoot?: string | null\n): string | null {\n const root = workspaceRoot?.trim() ?? \"\";\n if (root && root !== \"/\") {\n return root;\n }\n const normalizedPath = path.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/, \"\");\n if (!normalizedPath.startsWith(\"/\")) {\n return root || null;\n }\n const index = normalizedPath.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalizedPath.slice(0, index);\n}\n\nfunction summarizeFileDiff(file: AgentTurnSummaryFileVM): {\n added: number;\n removed: number;\n} {\n if (file.unifiedDiff?.trim()) {\n return parseAgentUnifiedDiffStats(file.unifiedDiff);\n }\n if (file.content?.trim()) {\n return {\n added: file.content.split(\"\\n\").filter(Boolean).length || 1,\n removed: 0\n };\n }\n if (file.changeType === \"created\" && file.newString?.trim()) {\n return {\n added: file.newString.split(\"\\n\").filter(Boolean).length || 1,\n removed: 0\n };\n }\n if (file.changeType === \"deleted\" && file.oldString?.trim()) {\n return {\n added: 0,\n removed: file.oldString.split(\"\\n\").filter(Boolean).length || 1\n };\n }\n return { added: 0, removed: 0 };\n}\n","import type { JSX, SVGProps } from \"react\";\n\n/**\n * Lined direct/open glyph (24x24 viewBox). Fill uses `currentColor`.\n */\nexport function DirectLinedIcon(props: SVGProps<SVGSVGElement>): JSX.Element {\n \"use memo\";\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden\n data-nexight-chrome-glyph=\"fill\"\n data-tutti-chrome-glyph=\"fill\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n d=\"M11 2C11.5523 2 12 2.44772 12 3C12 3.55228 11.5523 4 11 4H5C4.73478 4 4.4805 4.10543 4.29297 4.29297C4.10543 4.4805 4 4.73478 4 5V19C4 19.2652 4.10543 19.5195 4.29297 19.707C4.48051 19.8946 4.73478 20 5 20H19C19.2652 20 19.5195 19.8946 19.707 19.707C19.8946 19.5195 20 19.2652 20 19V13C20 12.4477 20.4477 12 21 12C21.5523 12 22 12.4477 22 13V19C22 19.7957 21.6837 20.5585 21.1211 21.1211C20.5585 21.6837 19.7957 22 19 22H5C4.20435 22 3.44152 21.6837 2.87891 21.1211C2.3163 20.5585 2 19.7957 2 19V5C2 4.20435 2.3163 3.44152 2.87891 2.87891C3.44152 2.3163 4.20435 2 5 2H11ZM21 2C21.0563 2 21.1113 2.00571 21.165 2.01465C21.1738 2.01611 21.1827 2.01686 21.1914 2.01855L21.2012 2.02051C21.211 2.02252 21.2207 2.02504 21.2305 2.02734C21.251 2.0322 21.2717 2.0368 21.292 2.04297C21.3408 2.05783 21.3873 2.0778 21.4326 2.09961C21.4466 2.10634 21.4609 2.11269 21.4746 2.12012C21.6203 2.19887 21.7441 2.31255 21.835 2.4502C21.8597 2.48768 21.8812 2.52662 21.9004 2.56641C21.9222 2.61159 21.9412 2.65838 21.9561 2.70703C21.9623 2.72732 21.9668 2.74799 21.9717 2.76855C21.9893 2.84294 22 2.92022 22 3V9C22 9.55228 21.5523 10 21 10C20.4477 10 20 9.55228 20 9V5.41406L12.707 12.707C12.3165 13.0976 11.6835 13.0976 11.293 12.707C10.9024 12.3165 10.9024 11.6835 11.293 11.293L18.5859 4H15C14.4477 4 14 3.55228 14 3C14 2.44772 14.4477 2 15 2H21Z\"\n />\n </svg>\n );\n}\n","import type {\n AgentTurnSummaryPatchBatchVM,\n AgentTurnSummaryPatchChangeVM\n} from \"../contracts/agentTurnSummaryRowVM\";\nimport { normalizeAgentPatchText } from \"./agentPatchMetadata\";\n\nexport function buildAgentTurnSummaryPatchDiff(\n batch: AgentTurnSummaryPatchBatchVM\n): string {\n return batch.changes\n .map((change) => patchChangeToUnifiedDiff(change, batch.cwd))\n .filter((diff) => diff.trim().length > 0)\n .join(\"\\n\");\n}\n\nfunction patchChangeToUnifiedDiff(\n change: AgentTurnSummaryPatchChangeVM,\n cwd: string | null\n): string {\n const path = patchPathRelativeToCwd(change.path, cwd);\n const rawDiff = normalizeAgentPatchText(change.unifiedDiff ?? \"\").trim();\n if (rawDiff && looksLikeUnifiedDiff(rawDiff)) {\n return ensureTrailingNewline(\n wrapUnifiedDiff(path, change.changeType, rawDiff)\n );\n }\n if (change.changeType === \"created\") {\n return fileContentPatch(\n path,\n \"created\",\n change.content ?? change.newString ?? rawDiff\n );\n }\n if (change.changeType === \"deleted\") {\n return fileContentPatch(\n path,\n \"deleted\",\n change.oldString ?? change.content ?? rawDiff\n );\n }\n if (change.oldString != null || change.newString != null) {\n return modifiedFilePatch(\n path,\n change.oldString ?? \"\",\n change.newString ?? \"\"\n );\n }\n return \"\";\n}\n\nfunction wrapUnifiedDiff(\n path: string,\n changeType: AgentTurnSummaryPatchChangeVM[\"changeType\"],\n diff: string\n): string {\n if (diff.startsWith(\"diff --git \")) {\n return diff;\n }\n const headers = [`diff --git a/${path} b/${path}`];\n if (changeType === \"created\") {\n headers.push(\"new file mode 100644\", \"--- /dev/null\", `+++ b/${path}`);\n } else if (changeType === \"deleted\") {\n headers.push(\"deleted file mode 100644\", `--- a/${path}`, \"+++ /dev/null\");\n } else if (!diff.startsWith(\"--- \") && !diff.includes(\"\\n--- \")) {\n headers.push(`--- a/${path}`, `+++ b/${path}`);\n }\n return [...headers, diff].join(\"\\n\");\n}\n\nfunction fileContentPatch(\n path: string,\n changeType: \"created\" | \"deleted\",\n content: string\n): string {\n const lines = splitPatchContentLines(content);\n const count = Math.max(lines.length, 1);\n const prefix = changeType === \"created\" ? \"+\" : \"-\";\n const body =\n lines.length > 0 ? lines.map((line) => `${prefix}${line}`) : [`${prefix}`];\n const header =\n changeType === \"created\"\n ? [\n `diff --git a/${path} b/${path}`,\n \"new file mode 100644\",\n \"--- /dev/null\",\n `+++ b/${path}`,\n `@@ -0,0 +1,${count} @@`\n ]\n : [\n `diff --git a/${path} b/${path}`,\n \"deleted file mode 100644\",\n `--- a/${path}`,\n \"+++ /dev/null\",\n `@@ -1,${count} +0,0 @@`\n ];\n return ensureTrailingNewline([...header, ...body].join(\"\\n\"));\n}\n\nfunction modifiedFilePatch(\n path: string,\n oldContent: string,\n newContent: string\n): string {\n const oldLines = splitPatchContentLines(oldContent);\n const newLines = splitPatchContentLines(newContent);\n const oldCount = Math.max(oldLines.length, 1);\n const newCount = Math.max(newLines.length, 1);\n return ensureTrailingNewline(\n [\n `diff --git a/${path} b/${path}`,\n `--- a/${path}`,\n `+++ b/${path}`,\n `@@ -1,${oldCount} +1,${newCount} @@`,\n ...oldLines.map((line) => `-${line}`),\n ...newLines.map((line) => `+${line}`)\n ].join(\"\\n\")\n );\n}\n\nfunction patchPathRelativeToCwd(path: string, cwd: string | null): string {\n const normalizedPath = normalizePathForPatch(path);\n const normalizedCwd = normalizePathForPatch(cwd ?? \"\");\n if (\n normalizedPath.startsWith(\"/\") &&\n normalizedCwd &&\n normalizedPath.startsWith(`${normalizedCwd}/`)\n ) {\n return normalizedPath.slice(normalizedCwd.length + 1);\n }\n return normalizedPath.replace(/^\\/+/, \"\");\n}\n\nfunction normalizePathForPatch(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction looksLikeUnifiedDiff(value: string): boolean {\n return (\n value.startsWith(\"diff --git \") ||\n value.startsWith(\"@@ \") ||\n value.startsWith(\"--- \") ||\n value.includes(\"\\n@@ \")\n );\n}\n\nfunction splitPatchContentLines(content: string): string[] {\n if (!content) {\n return [];\n }\n return content.replace(/\\r\\n/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\");\n}\n\nfunction ensureTrailingNewline(value: string): string {\n return value.endsWith(\"\\n\") ? value : `${value}\\n`;\n}\n","import type {\n AgentTurnSummaryFileVM,\n AgentTurnSummaryPatchChangeVM\n} from \"../contracts/agentTurnSummaryRowVM\";\n\nexport function fileCanBuildPatch(file: AgentTurnSummaryFileVM): boolean {\n return (\n file.unifiedDiff != null ||\n file.content != null ||\n file.oldString != null ||\n file.newString != null\n );\n}\n\nexport function patchBatchDirectoryCwd(\n cwd: string | null,\n changes: readonly Pick<AgentTurnSummaryPatchChangeVM, \"path\">[]\n): string | null {\n const normalizedCwd = normalizePatchHostPath(cwd ?? \"\");\n if (!normalizedCwd) {\n return null;\n }\n const cwdIsChangedFilePath = changes.some(\n (change) => normalizePatchHostPath(change.path) === normalizedCwd\n );\n return cwdIsChangedFilePath ? dirnameForPatchHostPath(normalizedCwd) : cwd;\n}\n\nexport function resolvePatchExecutionCwd(\n cwd: string | null,\n workspaceRoot?: string | null\n): string | null {\n const normalizedCwd = normalizePatchHostPath(cwd ?? \"\");\n const normalizedRoot = normalizePatchHostPath(workspaceRoot ?? \"\");\n if (!normalizedCwd) {\n return normalizedRoot || null;\n }\n if (!normalizedRoot) {\n return normalizedCwd;\n }\n if (isSyntheticWorkspacePath(normalizedRoot)) {\n return normalizedCwd;\n }\n if (normalizedCwd === \"/workspace\") {\n return normalizedRoot;\n }\n if (normalizedCwd.startsWith(\"/workspace/\")) {\n return `${normalizedRoot}/${normalizedCwd.slice(\"/workspace/\".length)}`;\n }\n return normalizedCwd;\n}\n\nexport function resolvePatchDiffCwd({\n sourceCwd,\n executionCwd,\n changes\n}: {\n sourceCwd: string | null;\n executionCwd: string | null;\n changes: readonly Pick<AgentTurnSummaryPatchChangeVM, \"path\">[];\n}): string | null {\n const normalizedSourceCwd = normalizePatchHostPath(sourceCwd ?? \"\");\n const normalizedExecutionCwd = normalizePatchHostPath(executionCwd ?? \"\");\n if (\n !isSyntheticWorkspacePath(normalizedSourceCwd) ||\n !normalizedExecutionCwd\n ) {\n return sourceCwd;\n }\n const hasSyntheticChangePath = changes.some((change) =>\n isInsideOrEqualPatchPath(\n normalizePatchHostPath(change.path),\n normalizedSourceCwd\n )\n );\n const hasHostChangePath = changes.some((change) =>\n isInsideOrEqualPatchPath(\n normalizePatchHostPath(change.path),\n normalizedExecutionCwd\n )\n );\n return hasHostChangePath && !hasSyntheticChangePath\n ? normalizedExecutionCwd\n : sourceCwd;\n}\n\nfunction normalizePatchHostPath(path: string): string {\n return path.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction dirnameForPatchHostPath(path: string): string {\n const normalized = normalizePatchHostPath(path);\n const index = normalized.lastIndexOf(\"/\");\n if (index < 0) {\n return \"\";\n }\n if (index === 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n\nfunction isSyntheticWorkspacePath(path: string): boolean {\n return path === \"/workspace\" || path.startsWith(\"/workspace/\");\n}\n\nfunction isInsideOrEqualPatchPath(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type JSX,\n type ReactNode\n} from \"react\";\n\nexport interface AgentTurnDisclosureStore {\n expandedOverrides: Readonly<Record<string, boolean>>;\n setExpandedOverride: (key: string, expanded: boolean) => void;\n}\n\nconst AgentTurnDisclosureContext =\n createContext<AgentTurnDisclosureStore | null>(null);\n\nexport function AgentTurnDisclosureProvider({\n children\n}: {\n children: ReactNode;\n}): JSX.Element {\n const store = useAgentTurnDisclosureStoreState();\n return (\n <AgentTurnDisclosureContext.Provider value={store}>\n {children}\n </AgentTurnDisclosureContext.Provider>\n );\n}\n\nexport function useAgentTurnDisclosureStore(): AgentTurnDisclosureStore {\n const contextStore = useContext(AgentTurnDisclosureContext);\n const localStore = useAgentTurnDisclosureStoreState();\n return contextStore ?? localStore;\n}\n\nfunction useAgentTurnDisclosureStoreState(): AgentTurnDisclosureStore {\n const [expandedOverrides, setExpandedOverrides] = useState<\n Record<string, boolean>\n >({});\n const setExpandedOverride = useCallback((key: string, expanded: boolean) => {\n setExpandedOverrides((previous) =>\n previous[key] === expanded ? previous : { ...previous, [key]: expanded }\n );\n }, []);\n return useMemo(\n () => ({ expandedOverrides, setExpandedOverride }),\n [expandedOverrides, setExpandedOverride]\n );\n}\n","import { useCallback, useRef, type JSX, type ReactNode } from \"react\";\nimport { Button } from \"@tutti-os/ui-system/components\";\nimport { ChevronDownIcon } from \"@tutti-os/ui-system/icons\";\nimport { useTranslation } from \"../../../i18n/index\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport type { AgentTurnDisclosureStore } from \"./AgentTurnDisclosureContext\";\nimport { useElapsedSeconds } from \"./useElapsedSeconds\";\nimport {\n formatAgentTurnDuration,\n type AgentTurnDuration,\n type AgentTurnTiming,\n type AgentTurnWorkSectionModel,\n type AgentTurnWorkSectionRow\n} from \"./agentTurnWorkSectionModel\";\n\ninterface AgentTurnWorkSectionProps {\n model: AgentTurnWorkSectionModel;\n sessionId: string;\n turnKey: string;\n showDivider?: boolean;\n disclosureStore: AgentTurnDisclosureStore;\n onDisclosureMotionChange?: (\n turnKey: string,\n active: boolean,\n anchorElement?: HTMLElement | null\n ) => void;\n renderRow: (\n row: AgentTurnWorkSectionRow[\"row\"],\n rowIndex: number,\n renderKey?: string\n ) => JSX.Element;\n}\n\nexport function AgentTurnWorkSection({\n model,\n sessionId,\n turnKey,\n showDivider = false,\n disclosureStore,\n onDisclosureMotionChange,\n renderRow\n}: AgentTurnWorkSectionProps): JSX.Element {\n const { t } = useTranslation();\n const disclosureKey = `${sessionId}:${turnKey}`;\n const expanded = model.collapseEligible\n ? (disclosureStore.expandedOverrides[disclosureKey] ?? false)\n : true;\n\n const toggleLabel = expanded\n ? t(\"agentHost.agentGui.collapseTurnWork\")\n : t(\"agentHost.agentGui.expandTurnWork\");\n const pendingRevealTransitionsRef = useRef(0);\n const disclosureMotionActiveRef = useRef(false);\n const collapsibleSectionCount = model.sections.reduce(\n (count, section) =>\n count + (section.kind === \"work\" && model.collapseEligible ? 1 : 0),\n 0\n );\n const finishDisclosureMotion = useCallback(() => {\n if (!disclosureMotionActiveRef.current) {\n return;\n }\n disclosureMotionActiveRef.current = false;\n pendingRevealTransitionsRef.current = 0;\n onDisclosureMotionChange?.(turnKey, false);\n }, [onDisclosureMotionChange, turnKey]);\n const startDisclosureMotion = useCallback(\n (anchorElement: HTMLElement | null) => {\n pendingRevealTransitionsRef.current = collapsibleSectionCount;\n if (collapsibleSectionCount === 0) {\n return;\n }\n disclosureMotionActiveRef.current = true;\n onDisclosureMotionChange?.(turnKey, true, anchorElement);\n },\n [collapsibleSectionCount, onDisclosureMotionChange, turnKey]\n );\n const handleRevealTransitionEnd = useCallback(() => {\n if (!disclosureMotionActiveRef.current) {\n return;\n }\n pendingRevealTransitionsRef.current -= 1;\n if (pendingRevealTransitionsRef.current <= 0) {\n finishDisclosureMotion();\n }\n }, [finishDisclosureMotion]);\n\n return (\n <div className=\"grid min-w-0\" data-agent-turn-work-section={turnKey}>\n {showDivider ? (\n <div\n className=\"mb-4 h-px w-full flex-none bg-[var(--line-2,var(--tutti-line-2))]\"\n data-testid=\"agent-transcript-turn-divider\"\n aria-hidden=\"true\"\n />\n ) : null}\n {model.leadingRows.length > 0 ? (\n <div className=\"mb-4 grid gap-4\">\n {renderRows(model.leadingRows, renderRow)}\n </div>\n ) : null}\n <div\n className=\"flex min-h-6 items-center gap-0.5 text-[12px] text-[var(--text-tertiary)]\"\n data-agent-turn-work-header={turnKey}\n >\n {model.collapseEligible ? (\n <Button\n type=\"button\"\n variant=\"chrome\"\n size=\"xs\"\n className=\"-ml-2 gap-0.5 px-2 text-[12px] font-normal\"\n aria-label={toggleLabel}\n aria-expanded={expanded}\n title={toggleLabel}\n onClick={(event) => {\n startDisclosureMotion(\n event.currentTarget.closest<HTMLElement>(\n \"[data-agent-turn-work-header]\"\n )\n );\n disclosureStore.setExpandedOverride(disclosureKey, !expanded);\n }}\n >\n <AgentTurnDurationLabel timing={model.timing} />\n <ChevronDownIcon\n aria-hidden=\"true\"\n data-icon=\"inline-end\"\n className={`transition-transform duration-150 ${\n expanded ? \"rotate-0\" : \"-rotate-90\"\n }`}\n />\n </Button>\n ) : (\n <AgentTurnDurationLabel timing={model.timing} />\n )}\n </div>\n {model.sections.map((section, sectionIndex) => {\n const content = renderRows(section.rows, renderRow);\n if (section.kind !== \"work\" || !model.collapseEligible) {\n const firstRow = section.rows[0];\n return (\n <div\n key={`${section.kind}:${firstRow?.renderKey ?? firstRow?.row.id ?? sectionIndex}`}\n className=\"grid gap-4 pt-4\"\n >\n {content}\n </div>\n );\n }\n const firstRow = section.rows[0];\n return (\n <CollapsibleReveal\n key={`work:${firstRow?.renderKey ?? firstRow?.row.id ?? sectionIndex}`}\n expanded={expanded}\n innerClassName=\"grid gap-4 pt-4\"\n onHeightTransitionEnd={handleRevealTransitionEnd}\n >\n {content}\n </CollapsibleReveal>\n );\n })}\n </div>\n );\n}\n\nfunction renderRows(\n rows: readonly AgentTurnWorkSectionRow[],\n renderRow: AgentTurnWorkSectionProps[\"renderRow\"]\n): ReactNode {\n return rows.map(({ row, rowIndex, renderKey }) =>\n renderRow(row, rowIndex, renderKey)\n );\n}\n\nfunction AgentTurnDurationLabel({\n timing\n}: {\n timing: AgentTurnTiming;\n}): JSX.Element {\n const { t } = useTranslation();\n const liveElapsedSeconds = useElapsedSeconds(\n timing.kind === \"live\" ? timing.startedAtUnixMs : null\n );\n const elapsedSeconds =\n timing.kind === \"live\" ? (liveElapsedSeconds ?? 0) : timing.elapsedSeconds;\n return <span>{translateDuration(t, timing.kind, elapsedSeconds)}</span>;\n}\n\nfunction translateDuration(\n t: ReturnType<typeof useTranslation>[\"t\"],\n kind: AgentTurnTiming[\"kind\"],\n elapsedSeconds: number\n): string {\n const duration = formatAgentTurnDuration(elapsedSeconds);\n return kind === \"live\"\n ? translateLiveDuration(t, duration)\n : translateSettledDuration(t, duration);\n}\n\nfunction translateLiveDuration(\n t: ReturnType<typeof useTranslation>[\"t\"],\n duration: AgentTurnDuration\n): string {\n if (duration.kind === \"seconds\") {\n return t(\"agentHost.agentGui.turnProcessedSeconds\", {\n seconds: duration.seconds\n });\n }\n if (duration.kind === \"minutes\") {\n return t(\"agentHost.agentGui.turnProcessedMinutes\", {\n minutes: duration.minutes\n });\n }\n return t(\"agentHost.agentGui.turnProcessedMinutesSeconds\", {\n minutes: duration.minutes,\n seconds: duration.seconds\n });\n}\n\nfunction translateSettledDuration(\n t: ReturnType<typeof useTranslation>[\"t\"],\n duration: AgentTurnDuration\n): string {\n if (duration.kind === \"seconds\") {\n return t(\"agentHost.agentGui.turnTotalSeconds\", {\n seconds: duration.seconds\n });\n }\n if (duration.kind === \"minutes\") {\n return t(\"agentHost.agentGui.turnTotalMinutes\", {\n minutes: duration.minutes\n });\n }\n return t(\"agentHost.agentGui.turnTotalMinutesSeconds\", {\n minutes: duration.minutes,\n seconds: duration.seconds\n });\n}\n","import type { AgentActivityTurn } from \"@tutti-os/agent-activity-core\";\nimport type {\n AgentMessageContentVM,\n AgentMessageRowVM\n} from \"../contracts/agentMessageRowVM\";\nimport type { AgentTranscriptTurnGroup } from \"./agentTranscriptModel\";\n\nexport type AgentTurnTiming =\n | { kind: \"live\"; startedAtUnixMs: number }\n | { kind: \"settled\"; elapsedSeconds: number };\n\nexport type AgentTurnDuration =\n | { kind: \"seconds\"; seconds: number }\n | { kind: \"minutes\"; minutes: number }\n | { kind: \"minutes-seconds\"; minutes: number; seconds: number };\n\nexport type AgentTurnWorkSectionRow =\n AgentTranscriptTurnGroup[\"rows\"][number] & {\n renderKey?: string;\n };\n\nexport interface AgentTurnWorkSectionSegment {\n kind: \"visible\" | \"work\";\n rows: AgentTurnWorkSectionRow[];\n}\n\nexport interface AgentTurnWorkSectionModel {\n timing: AgentTurnTiming;\n leadingRows: AgentTurnWorkSectionRow[];\n sections: AgentTurnWorkSectionSegment[];\n collapseEligible: boolean;\n}\n\ninterface AgentTurnWorkSectionOptions {\n collapseIntermediateAssistantReplies?: boolean;\n}\n\nexport function resolveAgentTurnTiming(\n turn: AgentActivityTurn | null | undefined,\n isActiveTurn: boolean,\n submittedAtUnixMs?: number | null\n): AgentTurnTiming | null {\n if (!turn || !Number.isFinite(turn.startedAtUnixMs)) {\n return null;\n }\n const timingStartedAtUnixMs =\n Number.isFinite(submittedAtUnixMs) &&\n (submittedAtUnixMs as number) <= turn.startedAtUnixMs\n ? (submittedAtUnixMs as number)\n : turn.startedAtUnixMs;\n\n if (turn.phase !== \"settled\") {\n return isActiveTurn\n ? { kind: \"live\", startedAtUnixMs: timingStartedAtUnixMs }\n : null;\n }\n\n const endUnixMs = turn.settledAtUnixMs;\n if (\n !Number.isFinite(endUnixMs) ||\n (endUnixMs as number) < timingStartedAtUnixMs\n ) {\n return null;\n }\n\n return {\n kind: \"settled\",\n elapsedSeconds: Math.max(\n 0,\n Math.floor(((endUnixMs as number) - timingStartedAtUnixMs) / 1_000)\n )\n };\n}\n\nexport function formatAgentTurnDuration(\n elapsedSeconds: number\n): AgentTurnDuration {\n const safeSeconds = Math.max(0, Math.floor(elapsedSeconds));\n if (safeSeconds < 60) {\n return { kind: \"seconds\", seconds: safeSeconds };\n }\n\n const minutes = Math.floor(safeSeconds / 60);\n const seconds = safeSeconds % 60;\n if (seconds === 0) {\n return { kind: \"minutes\", minutes };\n }\n return { kind: \"minutes-seconds\", minutes, seconds };\n}\n\nexport function buildAgentTurnWorkSectionModel(\n group: AgentTranscriptTurnGroup,\n turn: AgentActivityTurn | null | undefined,\n isActiveTurn = false,\n options: AgentTurnWorkSectionOptions = {}\n): AgentTurnWorkSectionModel | null {\n const leadingRowCount = countLeadingUserRows(group.rows);\n const leadingRows = group.rows.slice(0, leadingRowCount);\n const submittedAtUnixMs = resolveTurnSubmittedAtUnixMs(\n leadingRows,\n turn?.startedAtUnixMs\n );\n const timing = resolveAgentTurnTiming(turn, isActiveTurn, submittedAtUnixMs);\n if (!timing) {\n return null;\n }\n\n const finalTarget = findFinalAssistantTextTarget(group.rows);\n const sections = buildOrderedSections(\n group.rows,\n leadingRowCount,\n finalTarget,\n options.collapseIntermediateAssistantReplies === true\n );\n const hasHiddenWork = sections.some(\n (section) => section.kind === \"work\" && section.rows.length > 0\n );\n const collapseEligible =\n finalTarget !== null &&\n turn?.phase === \"settled\" &&\n turn.outcome === \"completed\" &&\n hasHiddenWork &&\n !groupContainsBlockingMessage(group) &&\n !group.rows.some(({ row }) => row.kind === \"generated-image\");\n\n return {\n timing,\n leadingRows,\n sections,\n collapseEligible\n };\n}\n\nfunction resolveTurnSubmittedAtUnixMs(\n leadingRows: readonly AgentTurnWorkSectionRow[],\n fallbackUnixMs: number | null | undefined\n): number | null {\n const exactTimestamps = leadingRows.flatMap(({ row }) => {\n if (row.kind !== \"message\" || row.speaker !== \"user\") {\n return [];\n }\n return row.messages.flatMap((message) =>\n (message.sourceTimelineItems ?? []).flatMap((item) => {\n const value = item.payload?.clientSubmittedAtUnixMs;\n return validUnixMs(value) ? [value] : [];\n })\n );\n });\n const exact = minimumTimestamp(exactTimestamps);\n if (exact !== null) {\n return exact;\n }\n\n const projected = minimumTimestamp(\n leadingRows.flatMap(({ row }) =>\n row.kind === \"message\" && row.speaker === \"user\"\n ? [\n row.occurredAtUnixMs,\n ...row.messages.map((message) => message.occurredAtUnixMs)\n ]\n : []\n )\n );\n return projected ?? (validUnixMs(fallbackUnixMs) ? fallbackUnixMs : null);\n}\n\nfunction minimumTimestamp(\n values: readonly (number | null | undefined)[]\n): number | null {\n const valid = values.filter(validUnixMs);\n return valid.length > 0 ? Math.min(...valid) : null;\n}\n\nfunction validUnixMs(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nfunction countLeadingUserRows(\n rows: readonly AgentTurnWorkSectionRow[]\n): number {\n let count = 0;\n while (isUserMessageRow(rows[count]?.row)) {\n count += 1;\n }\n return count;\n}\n\nfunction buildOrderedSections(\n rows: readonly AgentTurnWorkSectionRow[],\n startIndex: number,\n finalTarget: { rowIndex: number; messageIndex: number } | null,\n collapseIntermediateAssistantReplies: boolean\n): AgentTurnWorkSectionSegment[] {\n const sections: AgentTurnWorkSectionSegment[] = [];\n for (let rowIndex = startIndex; rowIndex < rows.length; rowIndex += 1) {\n const entry = rows[rowIndex]!;\n if (entry.row.kind === \"message\" && entry.row.speaker === \"assistant\") {\n if (!collapseIntermediateAssistantReplies) {\n appendAssistantMessageSections(sections, entry);\n } else if (finalTarget?.rowIndex === rowIndex) {\n appendFinalAssistantSections(sections, entry, finalTarget.messageIndex);\n } else {\n appendSectionRow(sections, \"work\", entry);\n }\n continue;\n }\n appendSectionRow(\n sections,\n isExplicitWorkRow(entry.row) ? \"work\" : \"visible\",\n entry\n );\n }\n return sections;\n}\n\nfunction appendFinalAssistantSections(\n sections: AgentTurnWorkSectionSegment[],\n sourceEntry: AgentTurnWorkSectionRow,\n finalMessageIndex: number\n): void {\n const sourceRow = sourceEntry.row as AgentMessageRowVM;\n const messagesBeforeFinal = sourceRow.messages.slice(0, finalMessageIndex);\n const messagesAfterFinal = sourceRow.messages.slice(finalMessageIndex + 1);\n\n if (sourceRow.thinking.length > 0 || messagesBeforeFinal.length > 0) {\n appendSectionRow(sections, \"work\", {\n ...sourceEntry,\n renderKey: `${sourceRow.id}:turn-work-before`,\n row: cloneAssistantRow(sourceRow, messagesBeforeFinal, sourceRow.thinking)\n });\n }\n\n appendSectionRow(sections, \"visible\", {\n ...sourceEntry,\n renderKey: `${sourceRow.id}:turn-final`,\n row: cloneAssistantRow(\n sourceRow,\n [sourceRow.messages[finalMessageIndex]!],\n []\n )\n });\n\n if (messagesAfterFinal.length > 0) {\n appendSectionRow(sections, \"work\", {\n ...sourceEntry,\n renderKey: `${sourceRow.id}:turn-work-after`,\n row: cloneAssistantRow(sourceRow, messagesAfterFinal, [])\n });\n }\n}\n\nfunction appendAssistantMessageSections(\n sections: AgentTurnWorkSectionSegment[],\n sourceEntry: AgentTurnWorkSectionRow\n): void {\n const sourceRow = sourceEntry.row as AgentMessageRowVM;\n const parts: Array<{\n kind: AgentTurnWorkSectionSegment[\"kind\"];\n messages: AgentMessageContentVM[];\n thinking: AgentMessageRowVM[\"thinking\"];\n }> = [];\n\n if (sourceRow.thinking.length > 0) {\n parts.push({ kind: \"work\", messages: [], thinking: sourceRow.thinking });\n }\n\n for (const message of sourceRow.messages) {\n const kind = isExplicitWorkMessage(message) ? \"work\" : \"visible\";\n const previous = parts.at(-1);\n if (previous?.kind === kind && previous.thinking.length === 0) {\n previous.messages.push(message);\n continue;\n }\n parts.push({ kind, messages: [message], thinking: [] });\n }\n\n if (parts.length === 0) {\n appendSectionRow(sections, \"visible\", sourceEntry);\n return;\n }\n\n if (parts.length === 1 && sourceRow.thinking.length === 0) {\n appendSectionRow(sections, parts[0]!.kind, sourceEntry);\n return;\n }\n\n parts.forEach((part, partIndex) => {\n appendSectionRow(sections, part.kind, {\n ...sourceEntry,\n renderKey: `${sourceRow.id}:turn-${part.kind}-${partIndex}`,\n row: cloneAssistantRow(sourceRow, part.messages, part.thinking)\n });\n });\n}\n\nfunction appendSectionRow(\n sections: AgentTurnWorkSectionSegment[],\n kind: AgentTurnWorkSectionSegment[\"kind\"],\n row: AgentTurnWorkSectionRow\n): void {\n const previous = sections.at(-1);\n if (previous?.kind === kind) {\n previous.rows.push(row);\n return;\n }\n sections.push({ kind, rows: [row] });\n}\n\nfunction findFinalAssistantTextTarget(\n rows: readonly AgentTurnWorkSectionRow[]\n): { rowIndex: number; messageIndex: number } | null {\n for (let rowIndex = rows.length - 1; rowIndex >= 0; rowIndex -= 1) {\n const row = rows[rowIndex]?.row;\n if (row?.kind !== \"message\" || row.speaker !== \"assistant\") {\n continue;\n }\n for (\n let messageIndex = row.messages.length - 1;\n messageIndex >= 0;\n messageIndex -= 1\n ) {\n const message = row.messages[messageIndex];\n if (\n message?.isTurnFinalText &&\n message.body.trim() &&\n message.contentKind !== \"image-grid\" &&\n !message.visibleError &&\n !message.systemNotice\n ) {\n return { rowIndex, messageIndex };\n }\n }\n }\n return null;\n}\n\nfunction groupContainsBlockingMessage(\n group: AgentTranscriptTurnGroup\n): boolean {\n return group.rows.some(\n ({ row }) =>\n row.kind === \"message\" &&\n row.messages.some((message) =>\n Boolean(\n message.visibleError ||\n (message.systemNotice && message.presentationKind === \"content\")\n )\n )\n );\n}\n\nfunction isExplicitWorkRow(row: AgentTurnWorkSectionRow[\"row\"]): boolean {\n return (\n row.kind === \"tool-group\" ||\n row.kind === \"turn-summary\" ||\n row.kind === \"processing\"\n );\n}\n\nfunction isExplicitWorkMessage(message: AgentMessageContentVM): boolean {\n return (\n message.presentationKind === \"specific-progress\" ||\n message.presentationKind === \"turn-boundary\"\n );\n}\n\nfunction isUserMessageRow(\n row: AgentTurnWorkSectionRow[\"row\"] | undefined\n): row is AgentMessageRowVM {\n return row?.kind === \"message\" && row.speaker === \"user\";\n}\n\nfunction cloneAssistantRow(\n source: AgentMessageRowVM,\n messages: AgentMessageContentVM[],\n thinking: AgentMessageRowVM[\"thinking\"]\n): AgentMessageRowVM {\n return {\n ...source,\n messages,\n thinking\n };\n}\n","import type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\n\nexport interface AgentTranscriptComplexity {\n totalScore: number;\n maxTurnScore: number;\n turnScores: readonly number[];\n}\n\nexport interface AgentTranscriptComplexityAssessment extends AgentTranscriptComplexity {\n shouldVirtualize: boolean;\n turnCount: number;\n}\n\nconst AGENT_TRANSCRIPT_COMPLEXITY_VIRTUALIZATION_SCORE = 40;\nconst AGENT_TRANSCRIPT_COMPLEXITY_SINGLE_TURN_SCORE = 24;\nconst AGENT_TRANSCRIPT_COMPLEXITY_TURN_COUNT = 30;\nconst AGENT_TRANSCRIPT_COMPLEXITY_MINIMUM_TURN_COUNT = 8;\n\nexport function assessAgentTranscriptComplexity(\n turnGroups: ReadonlyArray<{\n rows: ReadonlyArray<{ row: AgentTranscriptRowVM }>;\n }>\n): AgentTranscriptComplexityAssessment {\n const complexity = calculateAgentTranscriptComplexity(turnGroups);\n return {\n ...complexity,\n shouldVirtualize: shouldVirtualizeAgentTranscript({\n turnCount: turnGroups.length,\n complexity\n }),\n turnCount: turnGroups.length\n };\n}\n\nexport function calculateAgentTranscriptComplexity(\n turnGroups: ReadonlyArray<{\n rows: ReadonlyArray<{ row: AgentTranscriptRowVM }>;\n }>\n): AgentTranscriptComplexity {\n const turnScores = turnGroups.map((group) => calculateTurnScore(group.rows));\n const totalScore = turnScores.reduce((total, score) => total + score, 0);\n return {\n totalScore,\n maxTurnScore: Math.max(0, ...turnScores),\n turnScores\n };\n}\n\nexport function shouldVirtualizeAgentTranscript(input: {\n turnCount: number;\n complexity: AgentTranscriptComplexity;\n}): boolean {\n if (input.turnCount < AGENT_TRANSCRIPT_COMPLEXITY_MINIMUM_TURN_COUNT) {\n return false;\n }\n return (\n input.turnCount >= AGENT_TRANSCRIPT_COMPLEXITY_TURN_COUNT ||\n input.complexity.totalScore >=\n AGENT_TRANSCRIPT_COMPLEXITY_VIRTUALIZATION_SCORE ||\n input.complexity.maxTurnScore >=\n AGENT_TRANSCRIPT_COMPLEXITY_SINGLE_TURN_SCORE\n );\n}\n\nfunction calculateTurnScore(\n rows: ReadonlyArray<{ row: AgentTranscriptRowVM }>\n): number {\n let rowCount = 0;\n let charCount = 0;\n let codeFenceCount = 0;\n let tableCount = 0;\n let toolCallCount = 0;\n let thinkingBlockCount = 0;\n let imageCount = 0;\n\n for (const { row } of rows) {\n rowCount += 1;\n if (row.kind === \"generated-image\") {\n imageCount += 1;\n continue;\n }\n if (row.kind === \"message\") {\n for (const message of row.messages) {\n charCount += message.body.length;\n codeFenceCount += countCodeFences(message.body);\n tableCount += countMarkdownTables(message.body);\n imageCount +=\n (message.images?.length ?? 0) + countMarkdownImages(message.body);\n }\n for (const thinking of row.thinking) {\n thinkingBlockCount += 1;\n charCount += thinking.body.length;\n codeFenceCount += countCodeFences(thinking.body);\n }\n continue;\n }\n if (row.kind === \"tool-group\") {\n toolCallCount += row.calls.length;\n thinkingBlockCount += row.entries.filter(\n (entry) => entry.kind === \"thinking\"\n ).length;\n charCount += (row.summary ?? \"\").length;\n continue;\n }\n if (row.kind === \"turn-summary\") {\n charCount += row.files.reduce(\n (total, file) =>\n total +\n file.label.length +\n file.path.length +\n (file.unifiedDiff?.length ?? 0) +\n (file.content?.length ?? 0),\n 0\n );\n }\n }\n\n return (\n rowCount +\n charCount / 1200 +\n codeFenceCount * 4 +\n tableCount * 5 +\n toolCallCount * 2 +\n thinkingBlockCount * 2 +\n imageCount * 4\n );\n}\n\nfunction countCodeFences(value: string): number {\n let count = 0;\n for (const line of value.split(\"\\n\")) {\n const trimmed = line.trimStart();\n if (trimmed.startsWith(\"```\") || trimmed.startsWith(\"~~~\")) {\n count += 1;\n }\n }\n return Math.ceil(count / 2);\n}\n\nfunction countMarkdownTables(value: string): number {\n const lines = value.split(\"\\n\");\n let count = 0;\n for (let index = 1; index < lines.length; index += 1) {\n if (\n looksLikeTableSeparator(lines[index] ?? \"\") &&\n lines[index - 1]?.includes(\"|\")\n ) {\n count += 1;\n }\n }\n return count;\n}\n\nfunction countMarkdownImages(value: string): number {\n let count = 0;\n let index = 0;\n while (index < value.length) {\n const imageStart = value.indexOf(\"![\", index);\n if (imageStart < 0) {\n break;\n }\n const labelEnd = value.indexOf(\"]\", imageStart + 2);\n const targetStart = labelEnd >= 0 ? value.indexOf(\"(\", labelEnd) : -1;\n const targetEnd = targetStart >= 0 ? value.indexOf(\")\", targetStart) : -1;\n if (\n labelEnd >= 0 &&\n targetStart === labelEnd + 1 &&\n targetEnd > targetStart\n ) {\n count += 1;\n index = targetEnd + 1;\n continue;\n }\n index = imageStart + 2;\n }\n return count;\n}\n\nfunction looksLikeTableSeparator(line: string): boolean {\n const cells = line\n .split(\"|\")\n .map((cell) => cell.trim())\n .filter(Boolean);\n return (\n cells.length > 0 &&\n cells.every((cell) => {\n const normalized = cell.replace(/:/gu, \"\");\n return (\n normalized.length >= 3 && [...normalized].every((char) => char === \"-\")\n );\n })\n );\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { findMessageLocatorScrollParent } from \"./AgentMessageLocatorRail\";\n\ninterface TurnDisclosureScrollAnchor {\n release: () => void;\n}\n\nclass TurnDisclosureMotionController {\n private readonly movingTurnKeys = new Set<string>();\n private scrollAnchor: TurnDisclosureScrollAnchor | null = null;\n\n setTurnMotionActive(\n turnKey: string,\n active: boolean,\n anchorElement?: HTMLElement | null\n ): boolean {\n if (active) {\n this.movingTurnKeys.add(turnKey);\n if (anchorElement) {\n this.scrollAnchor?.release();\n this.scrollAnchor = lockDisclosureRowPosition(anchorElement);\n }\n } else {\n this.movingTurnKeys.delete(turnKey);\n if (this.movingTurnKeys.size === 0) {\n this.scrollAnchor?.release();\n this.scrollAnchor = null;\n }\n }\n return this.movingTurnKeys.size > 0;\n }\n}\n\nfunction lockDisclosureRowPosition(\n anchorElement: HTMLElement\n): TurnDisclosureScrollAnchor | null {\n const scrollParent = findMessageLocatorScrollParent(anchorElement);\n if (!scrollParent) {\n return null;\n }\n\n const anchorTop = anchorElement.getBoundingClientRect().top;\n const previousOverflowAnchor =\n scrollParent.style.getPropertyValue(\"overflow-anchor\");\n const previousOverflowAnchorPriority =\n scrollParent.style.getPropertyPriority(\"overflow-anchor\");\n scrollParent.style.setProperty(\"overflow-anchor\", \"none\");\n\n const preserveAnchorTop = (): void => {\n if (!anchorElement.isConnected) {\n return;\n }\n const topDelta = anchorElement.getBoundingClientRect().top - anchorTop;\n if (Math.abs(topDelta) < 0.5) {\n return;\n }\n scrollParent.scrollTop += topDelta;\n };\n scrollParent.addEventListener(\"scroll\", preserveAnchorTop);\n\n return {\n release: () => {\n preserveAnchorTop();\n scrollParent.removeEventListener(\"scroll\", preserveAnchorTop);\n if (previousOverflowAnchor) {\n scrollParent.style.setProperty(\n \"overflow-anchor\",\n previousOverflowAnchor,\n previousOverflowAnchorPriority\n );\n } else {\n scrollParent.style.removeProperty(\"overflow-anchor\");\n }\n }\n };\n}\n\nexport function useTurnDisclosureMotion(): readonly [\n active: boolean,\n setTurnMotionActive: (\n turnKey: string,\n active: boolean,\n anchorElement?: HTMLElement | null\n ) => void\n] {\n const motionControllerRef = useRef<TurnDisclosureMotionController | null>(\n null\n );\n if (!motionControllerRef.current) {\n motionControllerRef.current = new TurnDisclosureMotionController();\n }\n const motionController = motionControllerRef.current;\n const [active, setActive] = useState(false);\n const setTurnMotionActive = useCallback(\n (turnKey: string, moving: boolean, anchorElement?: HTMLElement | null) => {\n setActive(\n motionController.setTurnMotionActive(turnKey, moving, anchorElement)\n );\n },\n [motionController]\n );\n\n return [active, setTurnMotionActive];\n}\n","import {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type JSX,\n type MouseEvent,\n type WheelEvent\n} from \"react\";\nimport type { AgentMessageLocatorItem } from \"./agentTranscriptModel\";\nimport { escapeCssString } from \"./agentTranscriptModel\";\n\nconst AGENT_MESSAGE_LOCATOR_PANEL_FADE_MS = 160;\nconst AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX = 30;\nconst AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX = 36;\nconst AGENT_MESSAGE_LOCATOR_BOTTOM_SAFE_INSET_MAX_PX = 48;\nconst AGENT_MESSAGE_LOCATOR_SCROLL_DURATION_MS = 160;\nconst agentMessageLocatorScrollAnimations = new WeakMap<HTMLElement, number>();\n\ninterface AgentMessageLocatorVisibleFrame {\n heightPx: number;\n topOffsetPx: number;\n}\n\ninterface AgentMessageLocatorVirtualSelectionSource {\n readonly scrollOffset: number | null;\n readonly scrollRect: { readonly height: number } | null;\n getVirtualItemForOffset(\n offset: number\n ): { readonly index: number } | undefined;\n}\n\nexport function AgentMessageLocatorRail({\n items,\n label,\n onLocate,\n virtualSelectionSource\n}: {\n items: readonly AgentMessageLocatorItem[];\n label?: string;\n onLocate: (item: AgentMessageLocatorItem) => void;\n virtualSelectionSource?: AgentMessageLocatorVirtualSelectionSource;\n}): JSX.Element | null {\n const locatorRef = useRef<HTMLElement | null>(null);\n const locatorViewportRef = useRef<HTMLDivElement | null>(null);\n const closePanelTimeoutRef = useRef<number | null>(null);\n const [isPanelOpen, setIsPanelOpen] = useState(false);\n const [shouldRenderPanel, setShouldRenderPanel] = useState(false);\n const [activeKey, setActiveKey] = useState<string | null>(null);\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n const previousAgentResponseByKeyRef = useRef<ReadonlyMap<\n string,\n boolean\n > | null>(null);\n const [unreadAgentResponseKeys, setUnreadAgentResponseKeys] = useState<\n ReadonlySet<string>\n >(new Set());\n const [visibleFrame, setVisibleFrame] =\n useState<AgentMessageLocatorVisibleFrame | null>(null);\n const virtualSelectionReady =\n !virtualSelectionSource ||\n (virtualSelectionSource.scrollOffset !== null &&\n virtualSelectionSource.scrollRect !== null);\n useEffect(() => {\n if (isPanelOpen) {\n setShouldRenderPanel(true);\n return;\n }\n // timing: keep the panel mounted through its close-fade transition\n const timeout = window.setTimeout(\n () => setShouldRenderPanel(false),\n AGENT_MESSAGE_LOCATOR_PANEL_FADE_MS\n );\n return () => window.clearTimeout(timeout);\n }, [isPanelOpen]);\n useEffect(\n () => () => {\n if (closePanelTimeoutRef.current !== null) {\n window.clearTimeout(closePanelTimeoutRef.current);\n }\n },\n []\n );\n useEffect(() => {\n if (selectedKey && !items.some((item) => item.key === selectedKey)) {\n const locator = locatorRef.current;\n const scrollParent = locator\n ? findMessageLocatorScrollParent(locator)\n : null;\n const nextSelectedKey = virtualSelectionSource\n ? selectVirtualizedMessageLocatorItemAtViewportCenter(\n virtualSelectionSource,\n items,\n scrollParent?.scrollTop ?? virtualSelectionSource.scrollOffset\n )\n : null;\n setSelectedKey(\n items.some((item) => item.key === nextSelectedKey)\n ? nextSelectedKey\n : null\n );\n }\n }, [items, selectedKey, virtualSelectionSource]);\n useEffect(() => {\n const previousAgentResponseByKey = previousAgentResponseByKeyRef.current;\n const currentKeys = new Set(items.map((item) => item.key));\n\n setUnreadAgentResponseKeys((currentUnreadKeys) => {\n let nextUnreadKeys: Set<string> | null = null;\n const ensureNextUnreadKeys = (): Set<string> => {\n if (!nextUnreadKeys) {\n nextUnreadKeys = new Set(currentUnreadKeys);\n }\n return nextUnreadKeys;\n };\n\n for (const key of currentUnreadKeys) {\n if (!currentKeys.has(key)) {\n ensureNextUnreadKeys().delete(key);\n }\n }\n\n if (previousAgentResponseByKey) {\n for (const item of items) {\n const hadAgentResponse =\n previousAgentResponseByKey.get(item.key) ?? false;\n if (\n previousAgentResponseByKey.has(item.key) &&\n item.hasAgentResponse &&\n !hadAgentResponse &&\n item.key !== selectedKey\n ) {\n ensureNextUnreadKeys().add(item.key);\n }\n }\n }\n\n return nextUnreadKeys ?? currentUnreadKeys;\n });\n\n previousAgentResponseByKeyRef.current = new Map(\n items.map((item) => [item.key, item.hasAgentResponse])\n );\n }, [items, selectedKey]);\n useEffect(() => {\n if (!selectedKey) {\n return;\n }\n setUnreadAgentResponseKeys((currentUnreadKeys) => {\n if (!currentUnreadKeys.has(selectedKey)) {\n return currentUnreadKeys;\n }\n const nextUnreadKeys = new Set(currentUnreadKeys);\n nextUnreadKeys.delete(selectedKey);\n return nextUnreadKeys;\n });\n }, [selectedKey]);\n useLayoutEffect(() => {\n const locator = locatorRef.current;\n const scrollParent = locator\n ? findMessageLocatorScrollParent(locator)\n : null;\n if (!scrollParent) {\n return;\n }\n\n let animationFrame: number | null = null;\n const updateVisibleFrame = (): void => {\n animationFrame = null;\n const nextFrame = readMessageLocatorVisibleFrame(scrollParent);\n setVisibleFrame((current) =>\n current?.heightPx === nextFrame.heightPx &&\n current.topOffsetPx === nextFrame.topOffsetPx\n ? current\n : nextFrame\n );\n };\n const scheduleUpdate = (): void => {\n if (animationFrame !== null) {\n return;\n }\n animationFrame = window.requestAnimationFrame(updateVisibleFrame);\n };\n\n scheduleUpdate();\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(scrollParent);\n window.addEventListener(\"resize\", scheduleUpdate);\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n if (animationFrame !== null) {\n window.cancelAnimationFrame(animationFrame);\n }\n };\n }, [items.length]);\n useEffect(() => {\n const locator = locatorRef.current;\n const scrollParent = locator\n ? findMessageLocatorScrollParent(locator)\n : null;\n if (!scrollParent) {\n return;\n }\n\n let animationFrame: number | null = null;\n const updateSelectedFromScroll = (): void => {\n animationFrame = null;\n const nextSelectedKey = virtualSelectionSource\n ? selectVirtualizedMessageLocatorItemAtViewportCenter(\n virtualSelectionSource,\n items,\n scrollParent.scrollTop\n )\n : selectMessageLocatorItemAtViewportCenter(scrollParent, items);\n if (nextSelectedKey) {\n setSelectedKey((currentKey) =>\n currentKey === nextSelectedKey ? currentKey : nextSelectedKey\n );\n }\n };\n const scheduleUpdate = (): void => {\n if (animationFrame !== null) {\n return;\n }\n animationFrame = window.requestAnimationFrame(updateSelectedFromScroll);\n };\n\n scheduleUpdate();\n scrollParent.addEventListener(\"scroll\", scheduleUpdate, { passive: true });\n return () => {\n scrollParent.removeEventListener(\"scroll\", scheduleUpdate);\n if (animationFrame !== null) {\n window.cancelAnimationFrame(animationFrame);\n }\n };\n }, [items, virtualSelectionReady, virtualSelectionSource]);\n useLayoutEffect(() => {\n const selectedIndex = selectedKey\n ? items.findIndex((item) => item.key === selectedKey)\n : -1;\n const viewport = locatorViewportRef.current;\n if (selectedIndex < 0 || !viewport) {\n return;\n }\n\n const railHeight =\n (items.length - 1) * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX +\n AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX;\n const viewportHeight = Math.min(\n railHeight,\n visibleFrame?.heightPx ?? railHeight\n );\n scrollMessageLocatorViewportToIndex(\n viewport,\n selectedIndex,\n viewportHeight\n );\n }, [items, selectedKey, visibleFrame]);\n\n if (items.length < 2) {\n return null;\n }\n\n const railHeight =\n (items.length - 1) * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX +\n AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX;\n const viewportHeight =\n visibleFrame === null\n ? railHeight\n : Math.min(railHeight, visibleFrame.heightPx);\n const activeOrSelectedKey = activeKey ?? selectedKey;\n const markItemRead = (itemKey: string): void => {\n setUnreadAgentResponseKeys((currentUnreadKeys) => {\n if (!currentUnreadKeys.has(itemKey)) {\n return currentUnreadKeys;\n }\n const nextUnreadKeys = new Set(currentUnreadKeys);\n nextUnreadKeys.delete(itemKey);\n return nextUnreadKeys;\n });\n };\n const handleLocateItem = (item: AgentMessageLocatorItem): void => {\n setSelectedKey(item.key);\n setActiveKey(item.key);\n markItemRead(item.key);\n onLocate(item);\n };\n const itemFromPointerEvent = (\n event: MouseEvent<HTMLElement>\n ): AgentMessageLocatorItem | null => {\n const viewport = locatorViewportRef.current;\n if (!viewport) {\n return null;\n }\n const rect = viewport.getBoundingClientRect();\n const pointerY = event.clientY - rect.top + viewport.scrollTop;\n const index = Math.round(\n (pointerY - AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX / 2) /\n AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX\n );\n return items[Math.max(0, Math.min(items.length - 1, index))] ?? null;\n };\n const handleViewportClick = (event: MouseEvent<HTMLDivElement>): void => {\n if ((event.target as HTMLElement | null)?.closest(\"button\")) {\n return;\n }\n const item = itemFromPointerEvent(event);\n if (item) {\n handleLocateItem(item);\n }\n };\n const handleViewportMouseMove = (event: MouseEvent<HTMLDivElement>): void => {\n const item = itemFromPointerEvent(event);\n if (item) {\n setActiveKey(item.key);\n }\n };\n const openPanel = (): void => {\n if (closePanelTimeoutRef.current !== null) {\n window.clearTimeout(closePanelTimeoutRef.current);\n closePanelTimeoutRef.current = null;\n }\n setIsPanelOpen(true);\n };\n const closePanelSoon = (): void => {\n if (closePanelTimeoutRef.current !== null) {\n window.clearTimeout(closePanelTimeoutRef.current);\n }\n // timing: delay closing so pointer can move from trigger into panel content\n closePanelTimeoutRef.current = window.setTimeout(() => {\n closePanelTimeoutRef.current = null;\n setIsPanelOpen(false);\n setActiveKey(null);\n }, 120);\n };\n const closePanelNow = (): void => {\n if (closePanelTimeoutRef.current !== null) {\n window.clearTimeout(closePanelTimeoutRef.current);\n closePanelTimeoutRef.current = null;\n }\n setIsPanelOpen(false);\n setActiveKey(null);\n };\n const handleBlurCapture = (event: FocusEvent<HTMLElement>): void => {\n const nextTarget = event.relatedTarget;\n if (\n nextTarget instanceof Node &&\n event.currentTarget.contains(nextTarget)\n ) {\n return;\n }\n closePanelNow();\n };\n\n return (\n <nav\n ref={locatorRef}\n className=\"agent-gui-message-locator\"\n aria-label={label ?? items[0]?.summary}\n data-testid=\"agent-message-locator\"\n onBlurCapture={handleBlurCapture}\n onFocusCapture={openPanel}\n onMouseEnter={openPanel}\n onMouseLeave={closePanelSoon}\n style={\n {\n \"--agent-message-locator-height\": `${railHeight}px`,\n \"--agent-message-locator-viewport-height\": `${viewportHeight}px`,\n ...(visibleFrame !== null\n ? {\n \"--agent-message-locator-visible-height\": `${visibleFrame.heightPx}px`,\n \"--agent-message-locator-visible-top-offset\": `${visibleFrame.topOffsetPx}px`\n }\n : {})\n } as CSSProperties\n }\n >\n <div\n ref={locatorViewportRef}\n className=\"agent-gui-message-locator__viewport\"\n data-testid=\"agent-message-locator-viewport\"\n onClick={handleViewportClick}\n onMouseMove={handleViewportMouseMove}\n >\n <div\n className=\"agent-gui-message-locator__content\"\n style={\n {\n \"--agent-message-locator-height\": `${railHeight}px`\n } as CSSProperties\n }\n >\n {items.slice(0, -1).map((item, index) => (\n <div\n key={`segment:${item.key}`}\n className=\"agent-gui-message-locator__track-segment\"\n style={\n {\n \"--agent-message-locator-segment-position\": `${\n AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX / 2 +\n (index + 0.5) * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX\n }px`\n } as CSSProperties\n }\n aria-hidden=\"true\"\n />\n ))}\n {items.map((item, index) => (\n <button\n key={item.key}\n type=\"button\"\n className=\"agent-gui-message-locator__tick nodrag tsh-desktop-no-drag\"\n style={\n {\n \"--agent-message-locator-position\": `${\n index * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX +\n AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX / 2\n }px`\n } as CSSProperties\n }\n aria-label={item.summary}\n title={item.summary}\n data-selected={item.key === selectedKey ? \"true\" : undefined}\n data-agent-message-locator-turn-group-index={item.turnGroupIndex}\n data-unread-agent-response={\n unreadAgentResponseKeys.has(item.key) ? \"true\" : undefined\n }\n onClick={() => handleLocateItem(item)}\n onFocus={() => setActiveKey(item.key)}\n onMouseEnter={() => setActiveKey(item.key)}\n >\n <span\n className=\"agent-gui-message-locator__dot\"\n aria-hidden=\"true\"\n />\n </button>\n ))}\n </div>\n </div>\n {shouldRenderPanel ? (\n <div\n className=\"agent-gui-message-locator__panel\"\n role=\"tooltip\"\n data-open={isPanelOpen ? \"true\" : undefined}\n data-testid=\"agent-message-locator-panel\"\n onMouseEnter={openPanel}\n onMouseLeave={closePanelSoon}\n onWheel={containMessageLocatorPanelWheel}\n >\n {items.map((item) => (\n <button\n key={`panel:${item.key}`}\n type=\"button\"\n className=\"agent-gui-message-locator__panel-item nodrag tsh-desktop-no-drag\"\n data-active={\n item.key === activeOrSelectedKey ? \"true\" : undefined\n }\n onClick={() => handleLocateItem(item)}\n onFocus={() => setActiveKey(item.key)}\n onMouseEnter={() => setActiveKey(item.key)}\n >\n <span className=\"agent-gui-message-locator__panel-item-text\">\n {item.summary}\n </span>\n </button>\n ))}\n </div>\n ) : null}\n </nav>\n );\n}\n\nfunction scrollMessageLocatorViewportToIndex(\n viewport: HTMLElement,\n selectedIndex: number,\n viewportHeight: number\n): void {\n const selectedTop =\n selectedIndex * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX -\n AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX / 2;\n const selectedBottom = selectedTop + AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX;\n const padding = AGENT_MESSAGE_LOCATOR_HIT_SIZE_PX;\n const currentTop = viewport.scrollTop;\n const currentBottom = currentTop + viewportHeight;\n\n if (selectedTop < currentTop + padding) {\n viewport.scrollTop = Math.max(0, selectedTop - padding);\n return;\n }\n\n if (selectedBottom > currentBottom - padding) {\n viewport.scrollTop = Math.max(0, selectedBottom - viewportHeight + padding);\n }\n}\n\nexport function scrollTranscriptRowIntoView(\n row: HTMLElement,\n scrollParent: HTMLElement | null\n): void {\n if (!scrollParent) {\n row.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n return;\n }\n\n const targetScrollTop = targetScrollTopForTranscriptRow(row, scrollParent);\n animateMessageLocatorScroll(scrollParent, targetScrollTop);\n}\n\nfunction targetScrollTopForTranscriptRow(\n row: HTMLElement,\n scrollParent: HTMLElement\n): number {\n const rowRect = row.getBoundingClientRect();\n const scrollParentRect = scrollParent.getBoundingClientRect();\n const visibleFrame = readMessageLocatorVisibleFrame(scrollParent);\n const rowCenter =\n rowRect.top -\n scrollParentRect.top +\n scrollParent.scrollTop +\n rowRect.height / 2;\n const maxScrollTop = Math.max(\n 0,\n scrollParent.scrollHeight - scrollParent.clientHeight\n );\n const targetScrollTop =\n rowCenter - visibleFrame.topOffsetPx - visibleFrame.heightPx / 2;\n return Math.min(maxScrollTop, Math.max(0, targetScrollTop));\n}\n\nfunction animateMessageLocatorScroll(\n scrollParent: HTMLElement,\n targetScrollTop: number\n): void {\n const previousAnimation =\n agentMessageLocatorScrollAnimations.get(scrollParent);\n if (previousAnimation !== undefined) {\n window.cancelAnimationFrame(previousAnimation);\n }\n\n const startScrollTop = scrollParent.scrollTop;\n const delta = targetScrollTop - startScrollTop;\n const startedAt = performance.now();\n\n const step = (now: number): void => {\n const progress = Math.min(\n 1,\n (now - startedAt) / AGENT_MESSAGE_LOCATOR_SCROLL_DURATION_MS\n );\n scrollParent.scrollTop = startScrollTop + delta * progress;\n if (progress >= 1) {\n scrollParent.scrollTop = targetScrollTop;\n agentMessageLocatorScrollAnimations.delete(scrollParent);\n return;\n }\n agentMessageLocatorScrollAnimations.set(\n scrollParent,\n window.requestAnimationFrame(step)\n );\n };\n\n agentMessageLocatorScrollAnimations.set(\n scrollParent,\n window.requestAnimationFrame(step)\n );\n}\n\nfunction readMessageLocatorVisibleFrame(\n scrollParent: HTMLElement\n): AgentMessageLocatorVisibleFrame {\n const style = window.getComputedStyle(scrollParent);\n const topOffsetPx = parseCssPx(style.scrollPaddingTop);\n const bottomOffsetPx = Math.min(\n parseCssPx(style.scrollPaddingBottom),\n AGENT_MESSAGE_LOCATOR_BOTTOM_SAFE_INSET_MAX_PX\n );\n return {\n heightPx: Math.max(\n 0,\n scrollParent.clientHeight - topOffsetPx - bottomOffsetPx\n ),\n topOffsetPx\n };\n}\n\nfunction parseCssPx(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? Math.max(0, parsed) : 0;\n}\n\nfunction containMessageLocatorPanelWheel(\n event: WheelEvent<HTMLDivElement>\n): void {\n event.stopPropagation();\n if (event.deltaY === 0) {\n return;\n }\n event.preventDefault();\n event.currentTarget.scrollTop += event.deltaY;\n}\n\nexport function findMessageLocatorScrollParent(\n locator: HTMLElement\n): HTMLElement | null {\n const timeline = locator.closest<HTMLElement>(\n '[data-testid=\"agent-gui-timeline\"]'\n );\n if (timeline) {\n return timeline;\n }\n\n let current = locator.parentElement;\n while (current) {\n const style = window.getComputedStyle(current);\n const overflowY = style.overflowY;\n if (\n (overflowY === \"auto\" || overflowY === \"scroll\") &&\n current.scrollHeight > current.clientHeight\n ) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\nfunction selectMessageLocatorItemAtViewportCenter(\n scrollParent: HTMLElement,\n items: readonly AgentMessageLocatorItem[]\n): string | null {\n const viewportRect = scrollParent.getBoundingClientRect();\n const viewportCenterY = viewportRect.top + viewportRect.height / 2;\n let nearest: { key: string; distance: number } | null = null;\n\n for (const item of items) {\n const row = scrollParent.querySelector<HTMLElement>(\n `[data-agent-transcript-row=\"${escapeCssString(item.rowKey)}\"]`\n );\n if (!row) {\n continue;\n }\n const rowRect = row.getBoundingClientRect();\n const rowCenterY = rowRect.top + rowRect.height / 2;\n const distance = Math.abs(rowCenterY - viewportCenterY);\n if (!nearest || distance < nearest.distance) {\n nearest = { key: item.key, distance };\n }\n }\n\n return nearest?.key ?? null;\n}\n\nfunction selectVirtualizedMessageLocatorItemAtViewportCenter(\n source: AgentMessageLocatorVirtualSelectionSource,\n items: readonly AgentMessageLocatorItem[],\n observedScrollOffset = source.scrollOffset\n): string | null {\n const viewportHeight = source.scrollRect?.height;\n if (observedScrollOffset === null || viewportHeight === undefined) {\n return null;\n }\n const virtualTurn = source.getVirtualItemForOffset(\n observedScrollOffset + viewportHeight / 2\n );\n if (!virtualTurn) {\n return null;\n }\n\n let start = 0;\n let end = items.length - 1;\n let matchedIndex = -1;\n while (start <= end) {\n const middle = Math.floor((start + end) / 2);\n const item = items[middle];\n if (!item) {\n break;\n }\n if (item.turnGroupIndex <= virtualTurn.index) {\n matchedIndex = middle;\n start = middle + 1;\n } else {\n end = middle - 1;\n }\n }\n return items[matchedIndex < 0 ? 0 : matchedIndex]?.key ?? null;\n}\n","import { useLayoutEffect, useRef } from \"react\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport { agentTranscriptRowHasPresentationKind } from \"../projection/agentTranscriptPresentation\";\nimport { normalizeAgentTitleText } from \"../../utils/agentTitleText.ts\";\n\nexport interface AgentTranscriptTurnGroup {\n key: string;\n turnId: string | null;\n rows: Array<{\n row: AgentConversationVM[\"rows\"][number];\n rowIndex: number;\n }>;\n}\n\nexport interface AgentMessageLocatorItem {\n hasAgentResponse: boolean;\n key: string;\n rowKey: string;\n turnGroupIndex: number;\n rowIndex: number;\n summary: string;\n}\n\nexport function useEnteringTranscriptRows(\n rowKeys: string[]\n): ReadonlySet<string> {\n const previousKeysRef = useRef<Set<string> | null>(null);\n const previousKeys = previousKeysRef.current;\n const enteringRowKeys = new Set<string>();\n\n if (previousKeys) {\n for (const key of rowKeys) {\n if (!previousKeys.has(key)) {\n enteringRowKeys.add(key);\n }\n }\n }\n\n useLayoutEffect(() => {\n previousKeysRef.current = new Set(rowKeys);\n }, [rowKeys]);\n\n return enteringRowKeys;\n}\n\nexport function transcriptRowKey(\n row: AgentConversationVM[\"rows\"][number]\n): string {\n if (row.kind === \"tool-group\") {\n return row.expansionKey ?? row.id;\n }\n return row.id;\n}\n\nexport function buildAgentTranscriptTurnGroups(\n rows: ReadonlyArray<AgentConversationVM[\"rows\"][number]>,\n rowKeys: ReadonlyArray<string>\n): AgentTranscriptTurnGroup[] {\n const groups: AgentTranscriptTurnGroup[] = [];\n let currentGroup: AgentTranscriptTurnGroup | null = null;\n\n rows.forEach((row, rowIndex) => {\n const turnId = transcriptPresentationTurnId(\n rows,\n rowIndex,\n currentGroup?.turnId ?? null\n );\n if (!currentGroup || currentGroup.turnId !== turnId) {\n currentGroup = {\n key: turnId ?? `orphan:${rowKeys[rowIndex] ?? transcriptRowKey(row)}`,\n turnId,\n rows: []\n };\n groups.push(currentGroup);\n }\n\n currentGroup.rows.push({ row, rowIndex });\n });\n\n return groups;\n}\n\nfunction transcriptPresentationTurnId(\n rows: ReadonlyArray<AgentConversationVM[\"rows\"][number]>,\n rowIndex: number,\n currentTurnId: string | null\n): string | null {\n const rowTurnId = rows[rowIndex]?.turnId ?? null;\n if (rowTurnId || !currentTurnId) {\n return rowTurnId;\n }\n const nextTurnId =\n rows.slice(rowIndex + 1).find((candidate) => candidate.turnId !== null)\n ?.turnId ?? null;\n // A session-level row can occur chronologically inside a live Turn. Keep it\n // in that Turn's presentation group only when the next lifecycle-owned row\n // proves the surrounding Turn is unchanged; the row itself stays turnless.\n return nextTurnId === currentTurnId ? currentTurnId : null;\n}\n\nexport function buildTurnGroupIndexByRowIndex(\n turnGroups: readonly AgentTranscriptTurnGroup[]\n): ReadonlyMap<number, number> {\n const rowIndexToTurnGroupIndex = new Map<number, number>();\n turnGroups.forEach((group, groupIndex) => {\n group.rows.forEach(({ rowIndex }) => {\n rowIndexToTurnGroupIndex.set(rowIndex, groupIndex);\n });\n });\n return rowIndexToTurnGroupIndex;\n}\n\nexport function buildUserMessageLocatorItems(\n rows: ReadonlyArray<AgentConversationVM[\"rows\"][number]>,\n rowKeys: ReadonlyArray<string>,\n turnGroupIndexByRowIndex: ReadonlyMap<number, number>\n): AgentMessageLocatorItem[] {\n const items: AgentMessageLocatorItem[] = [];\n rows.forEach((row, rowIndex) => {\n if (row.kind !== \"message\" || row.speaker !== \"user\") {\n return;\n }\n const summary = summarizeUserMessageRow(row);\n if (!summary) {\n return;\n }\n const rowKey = rowKeys[rowIndex] ?? transcriptRowKey(row);\n items.push({\n hasAgentResponse: hasAgentResponseForTurn(rows, row, rowIndex),\n key: `user-message:${rowKey}`,\n rowKey,\n turnGroupIndex: turnGroupIndexByRowIndex.get(rowIndex) ?? rowIndex,\n rowIndex,\n summary\n });\n });\n return items;\n}\n\nexport function hasAgentResponseForTurn(\n rows: ReadonlyArray<AgentConversationVM[\"rows\"][number]>,\n userRow: AgentConversationVM[\"rows\"][number],\n userRowIndex: number\n): boolean {\n const turnId = userRow.turnId ?? null;\n for (let index = userRowIndex + 1; index < rows.length; index += 1) {\n const row = rows[index];\n if (!row) {\n continue;\n }\n if (row.kind === \"generated-image\") {\n return !turnId || row.turnId === turnId;\n }\n if (row.kind !== \"message\") {\n continue;\n }\n if (row.speaker === \"user\") {\n return false;\n }\n if (turnId && row.turnId !== turnId) {\n return false;\n }\n if (row.speaker === \"assistant\") {\n return true;\n }\n }\n return false;\n}\n\nexport function summarizeUserMessageRow(\n row: Extract<AgentConversationVM[\"rows\"][number], { kind: \"message\" }>\n): string {\n return normalizeLocatorSummary(\n row.messages.map((message) => message.copyText ?? message.body).join(\" \")\n );\n}\n\nexport function normalizeLocatorSummary(value: string): string {\n return normalizeAgentTitleText(value);\n}\n\nexport function escapeCssString(value: string): string {\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nexport function findTurnDividerRowIndexes(\n turnIndexById: ReadonlyMap<string, number>,\n rows: ReadonlyArray<AgentConversationVM[\"rows\"][number]>\n): ReadonlySet<number> {\n const dividerRowIndexes = new Set<number>();\n const previousTurnIds = new Set<string>();\n\n rows.forEach((row, rowIndex) => {\n const currentTurnId = row.turnId ?? null;\n if (!currentTurnId) {\n return;\n }\n\n const turnIndex = turnIndexById.get(currentTurnId) ?? -1;\n const previousTurnId = rows[rowIndex - 1]?.turnId ?? null;\n if (\n rowIndex > 0 &&\n turnIndex > 0 &&\n previousTurnId &&\n previousTurnId !== currentTurnId &&\n !agentTranscriptRowHasPresentationKind(\n rows[rowIndex - 1],\n \"turn-boundary\"\n ) &&\n !previousTurnIds.has(currentTurnId)\n ) {\n dividerRowIndexes.add(rowIndex);\n }\n\n previousTurnIds.add(currentTurnId);\n });\n\n return dividerRowIndexes;\n}\n","import {\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type JSX,\n type ReactNode,\n type Ref,\n type RefObject\n} from \"react\";\nimport {\n findMessageLocatorScrollParent,\n scrollTranscriptRowIntoView\n} from \"./AgentMessageLocatorRail\";\nimport type { AgentTranscriptTurnGroup } from \"./agentTranscriptModel\";\n\nexport interface AgentTranscriptTurnAttachment {\n id: string;\n anchorTurnId: string | null;\n content: ReactNode;\n}\n\nexport type AgentTranscriptAttachmentLocator = (attachmentId: string) => void;\n\ninterface TurnAttachmentVirtualizer {\n scrollToIndex(index: number, options: { align: \"center\" }): void;\n}\n\nexport function useAgentTranscriptTurnAttachments(input: {\n attachments: readonly AgentTranscriptTurnAttachment[];\n locatorRef?: Ref<AgentTranscriptAttachmentLocator>;\n onVisibilityChange?: (attachmentId: string, visible: boolean) => void;\n rowVirtualizer: TurnAttachmentVirtualizer;\n shouldVirtualize: boolean;\n turnGroups: readonly AgentTranscriptTurnGroup[];\n virtualizerHostRef: RefObject<HTMLDivElement | null>;\n}): {\n byGroupIndex: ReadonlyMap<number, readonly AgentTranscriptTurnAttachment[]>;\n onElementChange: (attachmentId: string, element: HTMLElement | null) => void;\n trailing: readonly AgentTranscriptTurnAttachment[];\n} {\n const projection = useMemo(() => {\n const lastGroupIndexByTurnId = new Map<string, number>();\n input.turnGroups.forEach((group, groupIndex) => {\n if (group.turnId) lastGroupIndexByTurnId.set(group.turnId, groupIndex);\n });\n const byGroupIndex = new Map<number, AgentTranscriptTurnAttachment[]>();\n const trailing: AgentTranscriptTurnAttachment[] = [];\n for (const attachment of input.attachments) {\n const groupIndex = attachment.anchorTurnId\n ? lastGroupIndexByTurnId.get(attachment.anchorTurnId)\n : undefined;\n if (groupIndex === undefined) {\n trailing.push(attachment);\n continue;\n }\n const groupAttachments = byGroupIndex.get(groupIndex) ?? [];\n groupAttachments.push(attachment);\n byGroupIndex.set(groupIndex, groupAttachments);\n }\n const groupIndexByAttachmentId = new Map<string, number>();\n byGroupIndex.forEach((attachments, groupIndex) => {\n attachments.forEach((attachment) =>\n groupIndexByAttachmentId.set(attachment.id, groupIndex)\n );\n });\n return { byGroupIndex, groupIndexByAttachmentId, trailing };\n }, [input.attachments, input.turnGroups]);\n const attachmentElementsRef = useRef(new Map<string, HTMLElement>());\n const attachmentObserverRef = useRef<IntersectionObserver | null>(null);\n\n const onElementChange = useCallback(\n (attachmentId: string, element: HTMLElement | null): void => {\n const previous = attachmentElementsRef.current.get(attachmentId);\n if (previous && previous !== element) {\n attachmentObserverRef.current?.unobserve(previous);\n }\n if (!element) {\n attachmentElementsRef.current.delete(attachmentId);\n input.onVisibilityChange?.(attachmentId, false);\n if (attachmentElementsRef.current.size === 0) {\n attachmentObserverRef.current?.disconnect();\n attachmentObserverRef.current = null;\n }\n return;\n }\n attachmentElementsRef.current.set(attachmentId, element);\n if (\n !attachmentObserverRef.current &&\n input.onVisibilityChange &&\n typeof IntersectionObserver === \"function\"\n ) {\n attachmentObserverRef.current = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const id = (entry.target as HTMLElement).dataset\n .agentTranscriptAttachment;\n if (id) input.onVisibilityChange?.(id, entry.isIntersecting);\n }\n });\n }\n attachmentObserverRef.current?.observe(element);\n },\n [input.onVisibilityChange]\n );\n\n const locateAttachment = useCallback(\n (attachmentId: string): void => {\n const scrollParent = input.virtualizerHostRef.current\n ? findMessageLocatorScrollParent(input.virtualizerHostRef.current)\n : null;\n const scrollToRenderedAttachment = (): boolean => {\n const renderedAttachment =\n attachmentElementsRef.current.get(attachmentId);\n if (!renderedAttachment) return false;\n scrollTranscriptRowIntoView(\n renderedAttachment,\n scrollParent ?? findMessageLocatorScrollParent(renderedAttachment)\n );\n renderedAttachment.animate?.(\n [\n { boxShadow: \"0 0 0 2px var(--tutti-purple)\" },\n { boxShadow: \"0 0 0 2px transparent\" }\n ],\n { duration: 1400, easing: \"ease-out\" }\n );\n return true;\n };\n\n if (scrollToRenderedAttachment()) return;\n const groupIndex = projection.groupIndexByAttachmentId.get(attachmentId);\n if (input.shouldVirtualize && groupIndex !== undefined) {\n input.rowVirtualizer.scrollToIndex(groupIndex, { align: \"center\" });\n requestAnimationFrame(scrollToRenderedAttachment);\n }\n },\n [\n input.rowVirtualizer,\n input.shouldVirtualize,\n input.virtualizerHostRef,\n projection.groupIndexByAttachmentId\n ]\n );\n useImperativeHandle(input.locatorRef ?? null, () => locateAttachment, [\n locateAttachment\n ]);\n\n return {\n byGroupIndex: projection.byGroupIndex,\n onElementChange,\n trailing: projection.trailing\n };\n}\n\nexport function AgentTranscriptAttachmentView({\n attachment,\n onElementChange\n}: {\n attachment: AgentTranscriptTurnAttachment;\n onElementChange: (attachmentId: string, element: HTMLElement | null) => void;\n}): JSX.Element {\n const handleRef = useCallback(\n (element: HTMLDivElement | null) => onElementChange(attachment.id, element),\n [attachment.id, onElementChange]\n );\n return (\n <div\n ref={handleRef}\n className=\"agent-gui-transcript-attachment\"\n data-agent-transcript-attachment={attachment.id}\n >\n {attachment.content}\n </div>\n );\n}\n","import { memo, type ReactNode, type JSX, type Ref } from \"react\";\nimport type { WorkspaceLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"../../AgentMessageMarkdown\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport type { AgentConversationParticipantPresentation } from \"../contracts/agentConversationParticipantPresentation\";\nimport { AgentTranscriptSkeleton } from \"./AgentTranscriptSkeleton\";\nimport {\n AgentTranscriptView,\n type AgentTranscriptAttachmentLocator,\n type AgentTranscriptTurnAttachment\n} from \"./AgentTranscriptView\";\nimport { AgentTurnDisclosureProvider } from \"./AgentTurnDisclosureContext\";\nimport type { AgentGUIProviderSkillOption } from \"../../../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\n\nexport interface AgentConversationFlowProps {\n conversation: AgentConversationVM | null;\n turnAttachments?: readonly AgentTranscriptTurnAttachment[];\n turnAttachmentLocatorRef?: Ref<AgentTranscriptAttachmentLocator>;\n onTurnAttachmentVisibilityChange?: (\n attachmentId: string,\n visible: boolean\n ) => void;\n isLoading: boolean;\n loadingLabel: string;\n loadingTestId?: string;\n empty: ReactNode;\n onLinkAction?: (action: WorkspaceLinkAction) => void;\n onAuthLogin?: (provider?: string | null) => void;\n availableSkills?: readonly AgentGUIProviderSkillOption[];\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n previewMode?: boolean;\n showRawTimelineJson?: boolean;\n participantPresentation?: AgentConversationParticipantPresentation;\n labels: {\n toolCallsLabel: (count: number) => string;\n thinkingLabel: string;\n processing: string;\n turnSummary: string;\n rawTimelineJson?: string;\n userMessageLocator?: string;\n };\n}\n\nexport const AgentConversationFlow = memo(function AgentConversationFlow({\n conversation,\n turnAttachments,\n turnAttachmentLocatorRef,\n onTurnAttachmentVisibilityChange,\n isLoading,\n loadingLabel,\n loadingTestId,\n empty,\n onLinkAction,\n onAuthLogin,\n availableSkills,\n workspaceAppIcons,\n previewMode = false,\n showRawTimelineJson = false,\n participantPresentation,\n labels\n}: AgentConversationFlowProps): JSX.Element {\n \"use memo\";\n\n let content: JSX.Element;\n if (isLoading) {\n content = (\n <AgentTranscriptSkeleton label={loadingLabel} testId={loadingTestId} />\n );\n } else if (\n !conversation ||\n (conversation.rows.length === 0 && !turnAttachments?.length)\n ) {\n content = <>{empty}</>;\n } else {\n content = (\n <AgentTranscriptView\n conversation={conversation}\n turnAttachments={turnAttachments}\n turnAttachmentLocatorRef={turnAttachmentLocatorRef}\n onTurnAttachmentVisibilityChange={onTurnAttachmentVisibilityChange}\n onLinkAction={onLinkAction}\n onAuthLogin={onAuthLogin}\n availableSkills={availableSkills}\n workspaceAppIcons={workspaceAppIcons}\n previewMode={previewMode}\n labels={labels}\n showRawTimelineJson={showRawTimelineJson}\n participantPresentation={participantPresentation}\n />\n );\n }\n\n return <AgentTurnDisclosureProvider>{content}</AgentTurnDisclosureProvider>;\n});\n","import { useMemo, useRef } from \"react\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport type { WorkspaceAgentSessionDetailViewModel } from \"../../workspaceAgentSessionDetailViewModel\";\nimport {\n projectAgentConversationVM,\n reconcileProjectedAgentConversationVM\n} from \"./agentConversationProjection\";\n\nexport function useProjectedAgentConversation({\n conversation,\n detail,\n avoidGroupingEdits = false\n}: {\n conversation?: AgentConversationVM | null;\n detail?: WorkspaceAgentSessionDetailViewModel | null;\n avoidGroupingEdits?: boolean;\n}): AgentConversationVM | null {\n const previousConversationRef = useRef<AgentConversationVM | null>(null);\n\n return useMemo(() => {\n if (!conversation && !detail) {\n previousConversationRef.current = null;\n return null;\n }\n\n const nextConversation =\n conversation ??\n projectAgentConversationVM(\n detail as WorkspaceAgentSessionDetailViewModel,\n {\n avoidGroupingEdits\n }\n );\n const reconciledConversation = reconcileProjectedAgentConversationVM(\n previousConversationRef.current,\n nextConversation\n );\n previousConversationRef.current = reconciledConversation;\n return reconciledConversation;\n }, [avoidGroupingEdits, conversation, detail]);\n}\n"],"mappings":"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","names":["AGENT_ACTIVITY_KINDS","firstPresentString","stringRecordValue","recordValue","stringRecordValue","normalizeToolToken","firstPresentString","looksLikeOpaqueToolCallID","recordValue","firstPresentString","stringRecordValue","normalizeToolNameToken","stringRecordValue","recordValue","firstPresentString","normalizeToolToken","looksLikeOpaqueToolCallID","normalizeToolNameToken","firstPresentString","stringRecordValue","content","firstPresentString","stringRecordValue","normalizedPayload","message","normalizeToolName","firstPresentString","stringRecordValue","compareTimelineItemsAscending","itemId","turnId","turn","firstPresentString","stringRecordValue","statusKind","entry","normalizeToolName","isGroupableToolCall","summarizeToolCallGroup","summarizeCallTarget","normalizeToolName","stringValue","normalizeToolName","objectValue","stringValue","arrayValue","normalizeToolName","arrayValue","stringValue","objectValue","objectValue","arrayValue","objectValue","arrayValue","stringValue","firstPresentString","arrayValue","objectValue","stringValue","firstPresentString","mergeSourceTimelineItems","body","firstString","jsx","Fragment","memo","useCallback","useLayoutEffect","useMemo","useRef","useState","memo","useCallback","jsx","jsx","jsx","Fragment","useCallback","useEffect","useState","useState","jsx","jsxs","useState","useCallback","useState","ChevronDown","ChevronUp","jsx","jsxs","useState","useCallback","ChevronUp","ChevronDown","useState","useCallback","useEffect","useRef","useState","jsx","animationFrame","jsx","jsxs","useState","jsx","jsx","jsxs","useState","ChevronDown","ChevronRight","forwardRef","useCallback","useEffect","useRef","jsx","jsxs","forwardRef","useRef","useCallback","useEffect","jsx","normalizeToolName","jsx","jsxs","useState","ChevronDown","ChevronRight","useState","ChevronDown","ChevronRight","jsx","jsxs","useState","ChevronDown","ChevronRight","jsx","jsxs","useEffect","useState","forwardRef","jsx","forwardRef","CanvasNodeGhostIconButton","useEffect","useState","LoaderCircle","jsx","LoaderCircle","useState","useEffect","jsx","jsxs","useCallback","rawTimelineJson","Fragment","useState","useEffect","jsx","jsxs","LoadingEllipsis","memo","useState","ChevronDown","ChevronRight","useState","ChevronDown","ChevronRight","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","motion","useAnimation","useReducedMotion","jsx","jsxs","forwardRef","useAnimation","useReducedMotion","useRef","useCallback","useImperativeHandle","useEffect","motion","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","motion","useAnimation","useReducedMotion","jsx","jsxs","forwardRef","useAnimation","useReducedMotion","useRef","useCallback","useImperativeHandle","useEffect","motion","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","motion","useAnimation","useReducedMotion","jsx","jsxs","forwardRef","useAnimation","useReducedMotion","useRef","useCallback","useImperativeHandle","useEffect","motion","jsx","jsx","recordValue","arrayValue","firstString","stringValue","normalizeChangeType","normalizeToolName","recordValue","firstString","stringValue","numberValue","arrayValue","stringValue","arrayValue","numberValue","recordValue","firstString","humanizeToolName","jsx","jsxs","formatInlineStatusLabel","LoadingEllipsis","ChevronDown","ChevronRight","normalizeToolName","useMemo","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useMemo","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","motion","useAnimation","useReducedMotion","jsx","jsxs","forwardRef","useAnimation","useReducedMotion","useRef","useCallback","useImperativeHandle","useEffect","motion","jsx","jsxs","languageForPath","useMemo","useState","jsx","Fragment","jsx","jsxs","MAX_VISIBLE_LINES","useState","useMemo","fileNameFromPath","createContext","useContext","useState","ChevronDown","ChevronRight","jsx","jsxs","stringValue","objectValue","contentText","languageForPath","jsx","jsxs","createContext","useContext","arrayValue","objectValue","stringValue","numericValue","objectValue","arrayValue","stringValue","numericValue","useState","jsxs","jsx","ChevronDown","ChevronRight","jsx","jsxs","stringValue","jsx","jsxs","jsx","jsxs","arrayValue","stringValue","domainForUrl","jsx","objectValue","stringValue","arrayValue","jsx","jsxs","stringValue","useMemo","useState","jsx","jsxs","useState","useMemo","jsx","stringValue","jsx","stringValue","firstString","record","objectValue","arrayValue","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","stringValue","jsx","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","useEffect","useState","AlertCircle","ChevronDown","ChevronRight","jsx","Fragment","jsx","jsxs","useState","AlertCircle","ChevronDown","ChevronRight","useEffect","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","memo","AgentToolGroupRow","useState","ChevronDown","ChevronRight","useEffect","useMemo","useState","ChevronDown","ChevronRight","LoaderCircle","toast","jsx","jsx","jsxs","useState","useMemo","useEffect","LoaderCircle","ChevronDown","ChevronRight","toast","jsx","memo","AgentTranscriptItemView","useCallback","createContext","useCallback","useContext","useMemo","useState","jsx","useCallback","useRef","Button","jsx","jsxs","useRef","useCallback","Button","firstRow","useCallback","useRef","useState","useEffect","useLayoutEffect","useRef","useState","useLayoutEffect","useRef","useRef","useLayoutEffect","jsx","jsxs","useRef","useState","useEffect","useLayoutEffect","railHeight","viewportHeight","useRef","useState","useCallback","useCallback","useImperativeHandle","useMemo","useRef","jsx","useMemo","useRef","useCallback","useImperativeHandle","Fragment","jsx","jsxs","memo","AgentTranscriptView","useState","useRef","useMemo","useCallback","useLayoutEffect","memo","Fragment","jsx","memo","AgentConversationFlow","useMemo","useRef","useRef","useMemo"]}
|