@tutti-os/agent-gui 0.0.59 → 0.0.60
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 +1 -1
- package/dist/@-bold-lined-BLLFKBFI.svg +10 -0
- package/dist/add-lined-bold-5QPUDZCU.svg +3 -0
- package/dist/agent-conversation/index.d.ts +2 -2
- package/dist/agent-conversation/index.js +7 -7
- package/dist/agent-message-center/index.js +17 -11
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentGuiNodeTypes-CupCLd9p.d.ts → agentGuiNodeTypes-CC52zXAV.d.ts} +7 -4
- package/dist/app/renderer/agentactivity.css +533 -56
- package/dist/app/renderer/assets/icons/@-bold-lined.svg +10 -0
- package/dist/app/renderer/assets/icons/@-lined.svg +10 -0
- package/dist/app/renderer/assets/icons/add-lined-bold.svg +3 -0
- package/dist/app/renderer/assets/icons/add-lined-icon.svg +3 -0
- package/dist/app/renderer/assets/icons/add-lined.svg +3 -0
- package/dist/app/renderer/assets/icons/agents/claudecode-flat-filled.svg +10 -0
- package/dist/app/renderer/assets/icons/agents/codex-flat-filled.svg +10 -0
- package/dist/app/renderer/assets/icons/agents/provider-rail-claude-code-colorful.png +0 -0
- package/dist/app/renderer/assets/icons/agents/provider-rail-codex-colorful.png +0 -0
- package/dist/app/renderer/assets/icons/agents/provider-rail-hermes-colorful.png +0 -0
- package/dist/app/renderer/assets/icons/agents/provider-rail-tutti.png +0 -0
- package/dist/app/renderer/assets/icons/handoff-lined.png +0 -0
- package/dist/app/renderer/assets/icons/handoff-lined.svg +11 -0
- package/dist/{chunk-5SRRKWE4.js → chunk-24CUBQKJ.js} +2 -2
- package/dist/{chunk-NX6T3DDS.js → chunk-2LGUBUEJ.js} +3 -3
- package/dist/{chunk-UCCUIUGK.js → chunk-4OPTXOOZ.js} +2 -2
- package/dist/{chunk-Q75AK47T.js → chunk-5WB3NGIN.js} +2 -2
- package/dist/{chunk-2WUDORCV.js → chunk-6TEPDMX6.js} +2 -2
- package/dist/{chunk-IS6JUDDY.js → chunk-6VVBG4BF.js} +44 -20
- package/dist/chunk-6VVBG4BF.js.map +1 -0
- package/dist/{chunk-OLI2A3EM.js → chunk-74TIEA6X.js} +2 -2
- package/dist/{chunk-N756UO52.js → chunk-AWIZJQXW.js} +68 -65
- package/dist/chunk-AWIZJQXW.js.map +1 -0
- package/dist/{chunk-SLT5Q37C.js → chunk-B6YDXIZW.js} +5 -3
- package/dist/{chunk-SLT5Q37C.js.map → chunk-B6YDXIZW.js.map} +1 -1
- package/dist/{chunk-7GM7UQXD.js → chunk-BB2SVMEV.js} +46 -8
- package/dist/chunk-BB2SVMEV.js.map +1 -0
- package/dist/{chunk-BT5WEZO5.js → chunk-CUMZV32B.js} +5 -5
- package/dist/chunk-CUMZV32B.js.map +1 -0
- package/dist/{chunk-OFMORNBO.js → chunk-CZSMZRAV.js} +23 -6
- package/dist/chunk-CZSMZRAV.js.map +1 -0
- package/dist/{chunk-HVU46DDA.js → chunk-FRCIPTUD.js} +13 -2
- package/dist/chunk-FRCIPTUD.js.map +1 -0
- package/dist/{chunk-CEMXB7LA.js → chunk-I5ZIKJVN.js} +2 -2
- package/dist/{chunk-4PSDYKZQ.js → chunk-K3UBSTJ5.js} +12 -9
- package/dist/chunk-K3UBSTJ5.js.map +1 -0
- package/dist/{chunk-Z2BTIAOC.js → chunk-MPZ3CW5C.js} +1 -1
- package/dist/chunk-MPZ3CW5C.js.map +1 -0
- package/dist/{chunk-MTFSQWZ6.js → chunk-V4JGVBUN.js} +22 -2
- package/dist/chunk-V4JGVBUN.js.map +1 -0
- package/dist/{chunk-OQJSZSYB.js → chunk-WNVIKTJK.js} +2 -2
- package/dist/{chunk-BEFNWUOZ.js → chunk-YZ3POK7G.js} +374 -316
- package/dist/chunk-YZ3POK7G.js.map +1 -0
- package/dist/claudecode-flat-filled-NHO4JCVK.svg +10 -0
- package/dist/codex-flat-filled-WYHCF5VR.svg +10 -0
- package/dist/context-mention-palette/index.js +8 -8
- package/dist/handoff-lined-4WQUBVG3.svg +11 -0
- package/dist/i18n/index.d.ts +43 -19
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +40 -16
- package/dist/index.js +1357 -501
- package/dist/index.js.map +1 -1
- package/dist/queued-prompt-runtime.d.ts +2 -2
- package/dist/{types-BsHvTjIZ.d.ts → types-DSc2ta3s.d.ts} +1 -1
- package/dist/workbench/contribution.d.ts +4 -8
- package/dist/workbench/contribution.js +9 -7
- package/dist/workbench/index.d.ts +4 -4
- package/dist/workbench/index.js +10 -12
- package/dist/workbench/launch.d.ts +6 -7
- package/dist/workbench/launch.js +2 -4
- package/dist/workbench/providerCatalog.d.ts +1 -1
- package/dist/workbench/sessionTitle.d.ts +1 -1
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workbench/state.d.ts +1 -1
- package/dist/workbench/state.js +2 -2
- package/dist/workbench/types.d.ts +3 -1
- package/dist/workbench/types.js +1 -1
- package/dist/workspace-agent-generated-files.js +3 -3
- package/package.json +12 -12
- package/dist/@-lined-14px-64O2KKB4.svg +0 -3
- package/dist/chunk-4PSDYKZQ.js.map +0 -1
- package/dist/chunk-7GM7UQXD.js.map +0 -1
- package/dist/chunk-BEFNWUOZ.js.map +0 -1
- package/dist/chunk-BT5WEZO5.js.map +0 -1
- package/dist/chunk-HVU46DDA.js.map +0 -1
- package/dist/chunk-IS6JUDDY.js.map +0 -1
- package/dist/chunk-MTFSQWZ6.js.map +0 -1
- package/dist/chunk-N756UO52.js.map +0 -1
- package/dist/chunk-OFMORNBO.js.map +0 -1
- package/dist/chunk-Z2BTIAOC.js.map +0 -1
- /package/dist/{chunk-5SRRKWE4.js.map → chunk-24CUBQKJ.js.map} +0 -0
- /package/dist/{chunk-NX6T3DDS.js.map → chunk-2LGUBUEJ.js.map} +0 -0
- /package/dist/{chunk-UCCUIUGK.js.map → chunk-4OPTXOOZ.js.map} +0 -0
- /package/dist/{chunk-Q75AK47T.js.map → chunk-5WB3NGIN.js.map} +0 -0
- /package/dist/{chunk-2WUDORCV.js.map → chunk-6TEPDMX6.js.map} +0 -0
- /package/dist/{chunk-OLI2A3EM.js.map → chunk-74TIEA6X.js.map} +0 -0
- /package/dist/{chunk-CEMXB7LA.js.map → chunk-I5ZIKJVN.js.map} +0 -0
- /package/dist/{chunk-OQJSZSYB.js.map → chunk-WNVIKTJK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../shared/workspaceAgentTimelineCanonical.ts","../shared/imageGenerationTool.ts","../shared/workspaceAgentToolCallIdentifiers.ts","../shared/workspaceAgentToolCallCanonical.ts","../shared/workspaceAgentToolCallAgentActivity.ts","../shared/workspaceAgentToolCallLabels.ts","../shared/workspaceAgentToolCallDisplay.ts","../shared/workspaceAgentTimelineMessageHelpers.ts","../shared/agentConversation/projection/subAgentTimelinePartition.ts","../shared/workspaceAgentSessionDetailViewModel.ts","../shared/agentConversation/projection/agentApprovalProjection.ts","../shared/agentConversation/projection/agentInteractiveProjection.ts","../shared/agentConversation/projection/agentToolRendererKind.ts","../shared/agentConversation/projection/agentTaskProjection.ts","../shared/agentConversation/projection/agentToolProjection.ts","../shared/agentConversation/projection/agentToolGroupingProjection.ts","../shared/agentConversation/projection/chunkBy.ts","../shared/agentConversation/projection/agentTurnRowProjection.ts","../shared/agentConversation/projection/agentProcessingProjection.ts","../shared/agentConversation/rules/agentPatchMetadata.ts","../shared/agentConversation/projection/agentTurnSummaryProjection.ts","../shared/agentConversation/projection/agentConversationProjection.ts","../shared/agentConversation/components/AgentTranscriptSkeleton.tsx","../shared/agentConversation/components/AgentTranscriptView.tsx","../shared/agentConversation/components/AgentTranscriptItemView.tsx","../shared/agentConversation/actions/agentConversationLinkActions.ts","../shared/agentConversation/components/AgentMessageBlock.tsx","../app/renderer/components/ui/button.tsx","../shared/errors/appError.ts","../app/renderer/shell/utils/format.ts","../shared/agentConversation/components/AgentPlanCard.tsx","../shared/AgentRichTextReadonly.tsx","../agent-gui/agentGuiNode/agentRichText/agentSkillTokenExtension.ts","../agent-gui/agentGuiNode/model/agentSkillOptions.ts","../agent-gui/agentGuiNode/agentRichText/agentCapabilityTokenExtension.ts","../agent-gui/agentGuiNode/agentRichText/agentRichTextDocument.ts","../agent-gui/agentGuiNode/agentRichText/agentRichTextExtensions.ts","../shared/agentConversation/components/CollapsibleReveal.tsx","../shared/WorkspaceAgentSessionThinkingDisclosure.tsx","../app/renderer/components/icons/BrainIcon.tsx","../shared/toolActivityKindIcons.tsx","../shared/agentConversation/components/RawTimelineJsonDisclosure.tsx","../shared/agentConversation/components/AgentThinkingDisclosure.tsx","../contexts/workspace/presentation/renderer/components/shared/CanvasNodeGhostIconButton.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/agentTranscriptComplexity.ts","../shared/agentConversation/components/AgentConversationFlow.tsx","../shared/agentConversation/projection/useProjectedAgentConversation.ts"],"sourcesContent":["import { isLiveTurnLifecyclePhase } from \"@tutti-os/agent-activity-core\";\nimport type {\n WorkspaceAgentActivitySession,\n WorkspaceAgentActivityTimelineItem\n} from \"./workspaceAgentActivityTypes\";\nimport {\n buildWorkspaceAgentToolCallDisplay,\n isWorkspaceAgentToolCallItem,\n resolveWorkspaceAgentToolName,\n type ToolCallStatusKind\n} from \"./workspaceAgentToolCallDisplay\";\nimport type {\n BuildWorkspaceAgentSessionDetailInput,\n WorkspaceAgentSessionDetailAgentItem,\n WorkspaceAgentSessionDetailMessage,\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} from \"./workspaceAgentTimelineMessageHelpers\";\nimport { timelineItemOwnerThreadId } from \"./agentConversation/projection/subAgentTimelinePartition\";\n\nexport function buildCanonicalWorkspaceAgentDetailView({\n activity,\n session,\n timelineItems,\n workspaceRoot = null\n}: BuildWorkspaceAgentSessionDetailInput): WorkspaceAgentSessionDetailViewModel {\n const turns = new Map<string, WorkspaceAgentSessionDetailTurn>();\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 = suppressedClaudeAskUserQuestionCallIds(\n session,\n sortedTimelineItems\n );\n\n for (const item of sortedTimelineItems) {\n // Sub-agent child-thread rows (payload.ownerThreadId) belong to the\n // delegated thread, not the parent transcript. They surface through the\n // parent's collab tool card lanes instead of interleaving here — even\n // when no matching card has arrived yet.\n if (timelineItemOwnerThreadId(item)) {\n continue;\n }\n const role = messageRole(item);\n const body = messageBody(item);\n const explicitTurnId = item.turnId?.trim();\n\n if (role === \"user\") {\n const turnId = explicitTurnId || `seq:${item.seq || item.id}`;\n if (!body) {\n continue;\n }\n if (\n isRecentDuplicateUserMessage(\n recentUserMessages.get(normalizedMessageBody(body)),\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(normalizedMessageBody(body), item);\n continue;\n }\n\n const turnId =\n explicitTurnId || activeSequenceTurnId || `seq:${item.seq || item.id}`;\n const turn = getTurn(turns, turnId);\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);\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 const visibleTurns = [...turns.values()].filter(\n (turn) => turn.userMessages.length > 0 || turn.agentItems.length > 0\n );\n nestDelegatedToolCallsAcrossTurns(visibleTurns);\n visibleTurns.forEach(mergeBackgroundTerminalContinuations);\n const allowTrailingToolGrouping = !isSessionWorking(session);\n\n visibleTurns.forEach((turn, index) => {\n turn.rawAgentItems = [...turn.agentItems];\n turn.agentItems = regroupAgentItems(\n turn.agentItems,\n allowTrailingToolGrouping || index < visibleTurns.length - 1\n );\n });\n\n return {\n activity,\n session,\n cwd: session.cwd.trim(),\n workspaceRoot: workspaceRoot?.trim() || null,\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 suppressedClaudeAskUserQuestionCallIds(\n session: WorkspaceAgentActivitySession,\n items: readonly WorkspaceAgentActivityTimelineItem[]\n): Set<string> {\n const provider = session.provider?.trim().toLowerCase() ?? \"\";\n if (provider !== \"claude-code\") {\n return new Set();\n }\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\nfunction 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\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 allowTrailingFinalization: boolean\n): WorkspaceAgentSessionDetailAgentItem[] {\n const regrouped: WorkspaceAgentSessionDetailAgentItem[] = [];\n let pending: Array<\n Extract<WorkspaceAgentSessionDetailAgentItem, { kind: \"tool-calls\" }>\n > = [];\n\n const flushPending = (finalize: boolean) => {\n if (pending.length === 0) {\n return;\n }\n const groupedCalls = pending.flatMap((item) => item.toolCalls);\n if (finalize && 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(true);\n regrouped.push(item);\n }\n\n flushPending(allowTrailingFinalization);\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 item.toolCalls.every(\n (call) => call.statusKind !== \"working\" && call.statusKind !== \"waiting\"\n )\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 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\nfunction 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\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\nfunction 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\nfunction 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\nfunction toolCallView(\n item: WorkspaceAgentActivityTimelineItem\n): WorkspaceAgentSessionDetailToolCall {\n const display = buildWorkspaceAgentToolCallDisplay(item);\n const preserveTimelineTitle =\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 = preserveTimelineTitle\n ? firstPresentString(item.name, display.name)\n : display.name;\n return withSourceTimelineItems(\n {\n id: display.id,\n name: fallbackName || display.name,\n toolName: toolNameFromItem(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\nfunction withSourceTimelineItems<T extends object>(\n value: T,\n sourceTimelineItems: readonly WorkspaceAgentActivityTimelineItem[] | undefined\n): T & { sourceTimelineItems?: WorkspaceAgentActivityTimelineItem[] } {\n if (!sourceTimelineItems || sourceTimelineItems.length === 0) {\n return value;\n }\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\nfunction mergeSourceTimelineItems(\n previous: readonly WorkspaceAgentActivityTimelineItem[] | undefined,\n next: readonly WorkspaceAgentActivityTimelineItem[] | undefined\n): WorkspaceAgentActivityTimelineItem[] | undefined {\n const merged = [...(previous ?? []), ...(next ?? [])];\n if (merged.length === 0) {\n return undefined;\n }\n const byKey = new Map<string, WorkspaceAgentActivityTimelineItem>();\n for (const item of merged) {\n byKey.set(sourceTimelineItemKey(item), item);\n }\n return [...byKey.values()].sort(compareTimelineItemsAscending);\n}\n\nfunction sourceTimelineItemKey(\n item: WorkspaceAgentActivityTimelineItem\n): string {\n const eventId = item.eventId?.trim();\n if (eventId) {\n return `event:${eventId}`;\n }\n if (Number.isFinite(item.id) && item.id > 0) {\n return `id:${item.id}`;\n }\n const seq = item.seq ?? 0;\n return seq > 0\n ? `seq:${seq}`\n : `local:${item.itemType}:${item.occurredAtUnixMs ?? 0}`;\n}\n\nfunction toolNameFromItem(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n return resolveWorkspaceAgentToolName(item);\n}\n\nfunction normalizedPayload(\n payload: WorkspaceAgentActivityTimelineItem[\"payload\"]\n): Record<string, unknown> | null {\n return payload && typeof payload === \"object\" ? payload : null;\n}\n\nfunction visibleErrorFromPayload(\n payload: Record<string, unknown> | null\n): WorkspaceAgentSessionDetailMessage[\"visibleError\"] {\n if (stringRecordValue(payload, \"kind\") !== \"agent_visible_error\") {\n return null;\n }\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\nfunction systemNoticeFromPayload(\n payload: Record<string, unknown> | null\n): WorkspaceAgentSessionDetailMessage[\"systemNotice\"] {\n if (stringRecordValue(payload, \"kind\") !== \"agent_system_notice\") {\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 title: stringRecordValue(payload, \"title\"),\n detail: stringRecordValue(payload, \"detail\"),\n retryable: booleanRecordValue(payload, \"retryable\")\n };\n}\n\nfunction stringRecordValue(record: unknown, key: string): string | null {\n if (!record || typeof record !== \"object\" || Array.isArray(record)) {\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 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\nfunction booleanRecordValue(record: unknown, key: string): boolean | null {\n if (!record || typeof record !== \"object\" || Array.isArray(record)) {\n return null;\n }\n const value = (record as Record<string, unknown>)[key];\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction firstPresentString(\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 normalizeToolName(name: string | null): string {\n return (name ?? \"\")\n .trim()\n .replace(/[_\\s-]+/g, \"\")\n .toLowerCase();\n}\n\nfunction summarizeToolCallGroup(\n calls: readonly WorkspaceAgentSessionDetailToolCall[]\n): string | null {\n if (calls.length < 2) {\n return null;\n }\n const changedTargets = dedupeStrings(\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 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\nfunction shouldShowProcessingIndicator(\n session: BuildWorkspaceAgentSessionDetailInput[\"session\"],\n turns: readonly WorkspaceAgentSessionDetailTurn[]\n): boolean {\n // The turn lifecycle is the source of truth for \"is a turn running\"\n // (ADR 0008); session.status is only a fallback for records that carry no\n // lifecycle (non-migrated providers).\n if (!sessionHasRunnableIndicatorState(session)) {\n return false;\n }\n const lastTurn = turns.at(-1);\n if (!lastTurn) {\n return true;\n }\n const lastAgentItem = lastTurn.agentItems.at(-1);\n if (\n lastAgentItem?.kind === \"message\" &&\n isTerminalAgentMessageStatus(lastAgentItem.message.statusKind) &&\n !hasActiveRunningTurnLifecycle(session)\n ) {\n return false;\n }\n return !lastTurn.toolCalls.some(\n (call) => call.statusKind === \"working\" || call.statusKind === \"waiting\"\n );\n}\n\n// A completed assistant message usually means the turn is about to settle, so\n// the indicator is suppressed to avoid trailing dots after the final answer.\n// Providers can also emit completed interim messages mid-turn (e.g. codex\n// narration between tool phases); when the turn lifecycle still reports an\n// active, non-settling turn, keep the indicator visible.\nfunction hasActiveRunningTurnLifecycle(\n session: BuildWorkspaceAgentSessionDetailInput[\"session\"]\n): boolean {\n const lifecycle = session.turnLifecycle;\n if (!lifecycle?.activeTurnId || lifecycle.settling === true) {\n return false;\n }\n return isLiveTurnLifecyclePhase(lifecycle.phase);\n}\n\n// Primary indicator gate: a present turn lifecycle decides entirely; the\n// legacy session.status check applies only when the record has no lifecycle.\nfunction sessionHasRunnableIndicatorState(\n session: BuildWorkspaceAgentSessionDetailInput[\"session\"]\n): boolean {\n const lifecycle = session.turnLifecycle;\n if (lifecycle?.phase) {\n return (\n Boolean(lifecycle.activeTurnId) &&\n isLiveTurnLifecyclePhase(lifecycle.phase)\n );\n }\n return isSessionWorking(session);\n}\n\nfunction isTerminalAgentMessageStatus(\n statusKind: ToolCallStatusKind | null | undefined\n): boolean {\n return (\n statusKind === \"completed\" ||\n statusKind === \"failed\" ||\n statusKind === \"canceled\"\n );\n}\n\nfunction isSessionWorking(\n session: BuildWorkspaceAgentSessionDetailInput[\"session\"]\n): boolean {\n const status = normalizedSessionStatus(session.status);\n return isWorkingSessionStatus(status);\n}\n\nfunction isWorkingSessionStatus(status: string): boolean {\n return status === \"working\";\n}\n\nfunction normalizedSessionStatus(status: string | null | undefined): string {\n return status?.trim().toLowerCase() ?? \"\";\n}\n","interface ImageGenerationProbe {\n toolName?: string | null;\n displayName?: string | null;\n content?: unknown;\n outputContent?: unknown;\n inputPrompt?: unknown;\n payloadInputPrompt?: unknown;\n}\n\ninterface ImageGenerationContentEntry {\n type: string | null;\n text: string | null;\n uri: string | null;\n mimeType: string | null;\n}\n\nexport interface ImageGenerationPreview {\n prompt: string | null;\n imageUri: string | null;\n mimeType: string | null;\n}\n\nconst KNOWN_IMAGE_GENERATION_TOOL_NAMES = new Set([\n \"imagegeneration\",\n \"imagegen\",\n \"generateimage\",\n \"generatingimage\",\n \"imagegenerate\",\n \"imagegenerator\"\n]);\n\nexport function resolveImageGenerationCanonicalToolName(\n probe: ImageGenerationProbe\n): \"ImageGeneration\" | null {\n return isImageGenerationToolCall(probe) ? \"ImageGeneration\" : null;\n}\n\nexport function isImageGenerationToolCall(\n probe: ImageGenerationProbe\n): boolean {\n const normalizedToolName = normalizeToolNameToken(probe.toolName);\n const normalizedDisplayName = normalizeToolNameToken(probe.displayName);\n const preview = extractImageGenerationPreview(probe);\n const hasKnownName =\n KNOWN_IMAGE_GENERATION_TOOL_NAMES.has(normalizedToolName) ||\n KNOWN_IMAGE_GENERATION_TOOL_NAMES.has(normalizedDisplayName);\n const hasOpaqueAlias =\n looksLikeOpaqueImageGenerationAlias(probe.toolName) ||\n looksLikeOpaqueImageGenerationAlias(probe.displayName);\n const hasPromptSignal = Boolean(\n preview.prompt &&\n (preview.prompt.toLowerCase().startsWith(\"revised prompt:\") ||\n stringValue(probe.inputPrompt) ||\n stringValue(probe.payloadInputPrompt))\n );\n\n return (\n hasKnownName ||\n (hasOpaqueAlias && preview.imageUri !== null) ||\n (hasPromptSignal && preview.imageUri !== null)\n );\n}\n\nexport function extractImageGenerationPreview(\n probe: ImageGenerationProbe\n): ImageGenerationPreview {\n const entries = [\n ...contentEntries(probe.content),\n ...contentEntries(probe.outputContent)\n ];\n const prompt =\n firstString(\n stringValue(probe.inputPrompt),\n stringValue(probe.payloadInputPrompt),\n promptFromEntries(entries)\n ) ?? null;\n const imageEntry = entries.find((entry) => isImageEntry(entry));\n\n return {\n prompt,\n imageUri: imageEntry?.uri ?? null,\n mimeType: imageEntry?.mimeType ?? null\n };\n}\n\nexport function stripImagePayloadData(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => stripImagePayloadData(item));\n }\n const record = recordValue(value);\n if (!record) {\n return value;\n }\n const imageLike = looksLikeImageRecord(record);\n const sanitized: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(record)) {\n const normalizedKey = key.trim().toLowerCase();\n if (imageLike && normalizedKey === \"data\") {\n continue;\n }\n if (\n imageLike &&\n (normalizedKey === \"uri\" || normalizedKey === \"path\") &&\n typeof entry === \"string\" &&\n entry.trim().toLowerCase().startsWith(\"data:image/\")\n ) {\n continue;\n }\n sanitized[key] = stripImagePayloadData(entry);\n }\n return sanitized;\n}\n\nexport function resolveImageGenerationPreviewSrc(\n uri: string | null\n): string | null {\n const trimmed = uri?.trim();\n if (!trimmed) {\n return null;\n }\n if (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.test(trimmed)) {\n return trimmed;\n }\n if (trimmed.startsWith(\"/\")) {\n return new URL(trimmed, \"file://\").toString();\n }\n if (/^[a-zA-Z]:[\\\\/]/.test(trimmed)) {\n return `file:///${trimmed.replace(/\\\\/g, \"/\")}`;\n }\n return trimmed;\n}\n\nfunction contentEntries(value: unknown): ImageGenerationContentEntry[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((item) => {\n const record = recordValue(item);\n if (!record) {\n return [];\n }\n const nestedContent = recordValue(record.content);\n return [toContentEntry(nestedContent ?? record)];\n });\n}\n\nfunction promptFromEntries(\n entries: ImageGenerationContentEntry[]\n): string | null {\n const revisedPrompt = entries.find(\n (entry) =>\n entry.text && entry.text.toLowerCase().startsWith(\"revised prompt:\")\n );\n return (\n firstString(\n revisedPrompt?.text,\n entries.find((entry) => entry.text)?.text\n ) ?? null\n );\n}\n\nfunction toContentEntry(\n value: Record<string, unknown>\n): ImageGenerationContentEntry {\n return {\n type: stringValue(value.type),\n text:\n firstString(stringValue(value.text), stringValue(value.content)) ?? null,\n uri: firstString(stringValue(value.uri), stringValue(value.path)) ?? null,\n mimeType: stringValue(value.mimeType)\n };\n}\n\nfunction isImageEntry(entry: ImageGenerationContentEntry): boolean {\n return (\n entry.type?.toLowerCase() === \"image\" ||\n (entry.mimeType?.toLowerCase().startsWith(\"image/\") ?? false) ||\n entry.uri !== null\n );\n}\n\nfunction looksLikeImageRecord(value: Record<string, unknown>): boolean {\n const type = stringValue(value.type)?.toLowerCase();\n const mimeType = stringValue(value.mimeType)?.toLowerCase();\n const uri = firstString(stringValue(value.uri), stringValue(value.path));\n return (\n type === \"image\" ||\n Boolean(mimeType?.startsWith(\"image/\")) ||\n Boolean(uri && value.data)\n );\n}\n\nfunction looksLikeOpaqueImageGenerationAlias(\n value: string | null | undefined\n): boolean {\n return /^ig_[a-z0-9]+$/i.test((value ?? \"\").trim());\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 stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction firstString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (value?.trim()) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction normalizeToolNameToken(value: string | null | undefined): string {\n return (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[_\\s-]+/gu, \"\");\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes\";\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","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes\";\nimport { looksLikeOpaqueToolCallIdentifier } from \"./workspaceAgentToolCallIdentifiers\";\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 return null;\n }\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 \"./workspaceAgentActivityTypes\";\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","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 \"./workspaceAgentActivityTypes\";\nimport { translate } from \"../i18n/index\";\nimport {\n extractImageGenerationPreview,\n resolveImageGenerationCanonicalToolName\n} from \"./imageGenerationTool\";\nimport { fileChangeCountFromChanges } from \"./workspaceAgentFileChangePayload\";\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 TOOL_NAME_TRANSLATION_KEYS,\n legacyKindToToolName,\n type ToolActivityKind\n} from \"./workspaceAgentToolCallLabels\";\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 normalizedKind = normalizeToolToken(\n stringRecordValue(item.payload, \"kind\")\n );\n const normalizedTitle = normalizeToolToken(\n firstPresentString(stringRecordValue(item.payload, \"title\"), item.name)\n );\n const input = recordValue(item.payload, \"input\");\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 \"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 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\nfunction 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\nfunction 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\nfunction stringArrayRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): string[] {\n const nested = value?.[key];\n if (!Array.isArray(nested)) {\n return [];\n }\n return nested.flatMap((item) =>\n typeof item === \"string\" && item.trim() ? [item.trim()] : []\n );\n}\n\nfunction stringArrayFirstRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n return stringArrayRecordValue(value, key)[0];\n}\n\nfunction arrayRecordValue(\n value: Record<string, unknown> | undefined,\n key: string\n): Array<Record<string, unknown>> {\n const nested = value?.[key];\n if (!Array.isArray(nested)) {\n return [];\n }\n return nested.flatMap((item) =>\n item && typeof item === \"object\" && !Array.isArray(item)\n ? [item as Record<string, unknown>]\n : []\n );\n}\n\nfunction collectToolPaths(\n metadata: Record<string, unknown> | undefined,\n metadataInput: Record<string, unknown> | undefined,\n payloadInput: Record<string, unknown> | undefined\n): string[] {\n const values = [\n ...stringArrayRecordValue(metadata, \"paths\"),\n ...toolInputPaths(metadataInput),\n ...toolInputPaths(payloadInput)\n ];\n return Array.from(new Set(values));\n}\n\nfunction toolInputPaths(value: Record<string, unknown> | undefined): string[] {\n if (!value) {\n return [];\n }\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 summarizeToolInput(\n value: Record<string, unknown> | undefined\n): string {\n if (!value) {\n return \"\";\n }\n\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) {\n return text;\n }\n }\n\n for (const [key, fieldValue] of Object.entries(value)) {\n if (isSensitiveKey(key)) {\n continue;\n }\n const text = summarizeInputValue(key, fieldValue);\n if (text) {\n return text;\n }\n }\n\n return \"\";\n}\n\nfunction 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) {\n return `${structuredPatch.length} files`;\n }\n const fileChanges = arrayRecordValue(\n recordValue(value, \"fileChanges\"),\n \"files\"\n );\n if (fileChanges.length > 1) {\n return `${fileChanges.length} files`;\n }\n const changesCount = fileChangeCountFromChanges(value?.changes);\n if (changesCount > 1) {\n return `${changesCount} files`;\n }\n }\n return null;\n}\n\nfunction summarizeTodoProgress(\n value: Record<string, unknown> | undefined\n): string | null {\n const todos = arrayRecordValue(value, \"todos\");\n if (todos.length === 0) {\n return null;\n }\n const completed = todos.filter(\n (todo) =>\n normalizeToolToken(stringRecordValue(todo, \"status\")) === \"completed\"\n ).length;\n return `${completed}/${todos.length} completed`;\n}\n\nfunction summarizeWebDomain(value: string | null): string | null {\n if (!value) {\n return null;\n }\n try {\n return new URL(value).hostname.replace(/^www\\./, \"\");\n } catch {\n return null;\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 }\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) {\n return formatInputSummary(key, items.join(\", \"));\n }\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)) {\n continue;\n }\n const text = summarizeInputValue(`${key}.${nestedKey}`, nestedValue);\n if (text) {\n return text;\n }\n }\n }\n return \"\";\n}\n\nfunction summarizeInputValue(key: string, value: unknown): string {\n if (typeof value !== \"string\" || !value.trim()) {\n return \"\";\n }\n return formatInputSummary(key, value);\n}\n\nfunction formatInputSummary(key: string, value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n return \"\";\n }\n const normalizedKey = normalizeToolToken(key);\n const prefixlessKeys = 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((token) => normalizeToolToken(token))\n );\n const text = truncateSummary(trimmed);\n // i18n-check-ignore: Tool input summaries combine schema keys with user input.\n return prefixlessKeys.has(normalizedKey) ? text : `${key}: ${text}`;\n}\n\nfunction truncateSummary(value: string, limit = 140): string {\n return value.length > limit ? `${value.slice(0, limit - 1)}…` : value;\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = normalizeToolToken(key);\n return (\n normalized.includes(\"token\") ||\n normalized.includes(\"password\") ||\n normalized.includes(\"secret\") ||\n normalized.includes(\"api_key\") ||\n normalized.includes(\"apikey\") ||\n normalized.includes(\"authorization\")\n );\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 firstPath(paths: string[]): string {\n return paths[0] ?? \"\";\n}\n\nfunction firstPresentString(\n ...values: Array<string | null | undefined>\n): 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 itemId(item: WorkspaceAgentActivityTimelineItem): string {\n return item.eventId.trim() || `id:${item.id}`;\n}\n\nfunction isGenericToolLabel(normalizedTitle: string): boolean {\n return normalizedTitle === \"tool\" || normalizedTitle === \"usetool\";\n}\n\nfunction looksLikeOpaqueToolCallID(\n value: string | null,\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const trimmed = value?.trim() ?? \"\";\n if (!trimmed) {\n return false;\n }\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) {\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 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) {\n return translate(translationKey);\n }\n if (toolName?.trim()) {\n return humanizeToolName(toolName);\n }\n return translate(\"agentHost.agentTool.fallbackName\");\n}\n\nfunction normalizeToolNameToken(value: string | null | undefined): string {\n return (value ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[_\\s-]+/gu, \"\");\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 { ToolCallStatusKind } from \"./workspaceAgentToolCallDisplay\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes\";\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 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 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 \"../../workspaceAgentActivityTypes\";\nimport {\n isWorkspaceAgentToolCallItem,\n resolveWorkspaceAgentToolName\n} from \"../../workspaceAgentToolCallDisplay\";\nimport type {\n AgentTaskSubAgentActivityVM,\n AgentTaskSubAgentStatus,\n AgentTaskSubAgentVM\n} from \"../contracts/agentTaskItemVM\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport type { AgentToolGroupRowVM } from \"../contracts/agentToolGroupRowVM\";\n\n// Codex app-server collab child threads report their activity through the\n// parent session. The daemon stamps every child-thread row with a non-empty\n// payload.ownerThreadId plus payload.ownerCallId — the spawn call that\n// created the thread (reporter.go withOwnerThreadID, ADR 0007); parent rows\n// never carry the keys. These rows must never interleave with the parent\n// transcript: they are segregated here and re-surfaced as live sub-agent\n// lanes on the parent's collab spawn card, located by ownerCallId alone.\n\nexport interface SubAgentTimelinePartition {\n mainTimelineItems: WorkspaceAgentActivityTimelineItem[];\n subAgentItemsByOwner: ReadonlyMap<\n string,\n WorkspaceAgentActivityTimelineItem[]\n >;\n}\n\nexport function timelineItemOwnerThreadId(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n return trimmedPayloadString(item.payload?.ownerThreadId);\n}\n\nexport function timelineItemOwnerCallId(\n item: WorkspaceAgentActivityTimelineItem\n): string | null {\n return trimmedPayloadString(item.payload?.ownerCallId);\n}\n\nfunction trimmedPayloadString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function partitionSubAgentTimelineItems(\n timelineItems: readonly WorkspaceAgentActivityTimelineItem[]\n): SubAgentTimelinePartition {\n const subAgentItemsByOwner = new Map<\n string,\n WorkspaceAgentActivityTimelineItem[]\n >();\n let mainTimelineItems: WorkspaceAgentActivityTimelineItem[] | null = null;\n for (let index = 0; index < timelineItems.length; index += 1) {\n const item = timelineItems[index];\n if (!item) {\n continue;\n }\n const ownerThreadId = timelineItemOwnerThreadId(item);\n if (!ownerThreadId) {\n mainTimelineItems?.push(item);\n continue;\n }\n if (!mainTimelineItems) {\n mainTimelineItems = timelineItems.slice(0, index);\n }\n const ownerItems = subAgentItemsByOwner.get(ownerThreadId) ?? [];\n ownerItems.push(item);\n subAgentItemsByOwner.set(ownerThreadId, ownerItems);\n }\n return {\n mainTimelineItems:\n mainTimelineItems ??\n (timelineItems as WorkspaceAgentActivityTimelineItem[]),\n subAgentItemsByOwner\n };\n}\n\n// A collab spawn card summarizes one delegated agent in the parent transcript.\n// Lanes attach to cards by the ownerCallId the daemon records on every child\n// row (the spawn call's item id, ADR 0007) — an exact lookup, never a guess.\n// Rows without the key (recordings that predate it) and rows whose spawn card\n// is outside the loaded message window stay hidden: a partial timeline must\n// degrade to \"not loaded yet\", not to a mis-attached lane.\ninterface SubAgentCollabCard {\n callId: string;\n startedAtUnixMs: number;\n task: string | null;\n agentName: string | null;\n // The spawn CALL's own status - only used for receiver-less spawns (e.g.\n // tool-rejected), where no child lifecycle exists to drive the lane.\n callStatus: AgentTaskSubAgentStatus;\n receiverThreadIds: ReadonlySet<string>;\n childStatuses: ReadonlyMap<string, AgentTaskSubAgentStatus>;\n}\n\nexport function buildSubAgentLanesByCallId(\n partition: SubAgentTimelinePartition\n): ReadonlyMap<string, AgentTaskSubAgentVM[]> {\n const lanesByCallId = new Map<string, AgentTaskSubAgentVM[]>();\n const cards = collectCollabCards(partition.mainTimelineItems);\n if (cards.length === 0) {\n return lanesByCallId;\n }\n const cardsByCallId = new Map(cards.map((card) => [card.callId, card]));\n const lanedOwners = new Set<string>();\n for (const [ownerThreadId, items] of partition.subAgentItemsByOwner) {\n const sortedItems = [...items].sort(compareTimelineItemsAscending);\n const ownerCallId = firstOwnerCallId(sortedItems);\n if (!ownerCallId) {\n continue;\n }\n const card = cardsByCallId.get(ownerCallId);\n // The daemon never records a control card as owner; skipping here keeps\n // wait/close cards lane-free even against malformed rows.\n if (!card || isControlAgentToken(card.agentName)) {\n continue;\n }\n lanedOwners.add(ownerThreadId);\n const lanes = lanesByCallId.get(card.callId) ?? [];\n lanes.push(subAgentLane(ownerThreadId, sortedItems, card));\n lanesByCallId.set(card.callId, lanes);\n }\n // A spawn card is a sub-agent card from the moment it exists: seed\n // placeholder lanes for declared children that have not produced any rows\n // yet, so the spawn never renders as a bare tool row. Only spawn-kind cards\n // seed - wait/close control cards also declare receiverThreadIds and must\n // not duplicate the lanes.\n for (const card of cards) {\n if (!isSpawnAgentToken(card.agentName)) {\n continue;\n }\n for (const receiverThreadId of card.receiverThreadIds) {\n if (lanedOwners.has(receiverThreadId)) {\n continue;\n }\n lanedOwners.add(receiverThreadId);\n const lanes = lanesByCallId.get(card.callId) ?? [];\n lanes.push(subAgentLane(receiverThreadId, [], card));\n lanesByCallId.set(card.callId, lanes);\n }\n // A spawn that produced no child threads (e.g. the tool rejected the\n // request) still renders as a sub-agent card - the failed/pending lane is\n // the signal; a bare '委托 agent' tool row never appears for spawns.\n if (!lanesByCallId.has(card.callId)) {\n lanesByCallId.set(card.callId, [\n {\n ...subAgentLane(`spawn-pending:${card.callId}`, [], card),\n status: card.callStatus,\n // No child thread exists yet: codex caps concurrent sub-agents\n // (4/session by default) and queues further spawns.\n queued: card.callStatus === \"running\"\n }\n ]);\n }\n }\n for (const lanes of lanesByCallId.values()) {\n lanes.sort(\n (left, right) =>\n (left.startedAtUnixMs ?? 0) - (right.startedAtUnixMs ?? 0) ||\n left.ownerThreadId.localeCompare(right.ownerThreadId)\n );\n for (let index = 0; index < lanes.length; index += 1) {\n const lane = lanes[index];\n if (!lane) {\n continue;\n }\n lanes[index] = {\n ...lane,\n laneIndex: index + 1,\n laneCount: lanes.length\n };\n }\n }\n return lanesByCallId;\n}\n\nexport function attachSubAgentLanesToConversationVM(\n conversation: AgentConversationVM | null,\n lanesByCallId: ReadonlyMap<string, AgentTaskSubAgentVM[]>\n): AgentConversationVM | null {\n if (!conversation || lanesByCallId.size === 0) {\n return conversation;\n }\n let changed = false;\n const rows = conversation.rows.map((row) => {\n if (row.kind !== \"tool-group\") {\n return row;\n }\n const nextRow = toolGroupRowWithSubAgents(row, lanesByCallId);\n if (nextRow !== row) {\n changed = true;\n }\n return nextRow;\n });\n return changed ? { ...conversation, rows } : conversation;\n}\n\nfunction toolGroupRowWithSubAgents(\n row: AgentToolGroupRowVM,\n lanesByCallId: ReadonlyMap<string, AgentTaskSubAgentVM[]>\n): AgentToolGroupRowVM {\n let changed = false;\n const callsById = new Map<string, AgentToolCallVM>();\n const calls = row.calls.map((call) => {\n const lanes = call.task ? lanesByCallId.get(toolCallRawId(call.id)) : null;\n if (!lanes || lanes.length === 0 || !call.task) {\n return call;\n }\n changed = true;\n const nextCall: AgentToolCallVM = {\n ...call,\n task: { ...call.task, subAgents: lanes }\n };\n callsById.set(nextCall.id, nextCall);\n return nextCall;\n });\n if (!changed) {\n return row;\n }\n const entries = row.entries.map((entry) => {\n if (entry.kind !== \"tool-call\") {\n return entry;\n }\n const nextCall = callsById.get(entry.call.id);\n return nextCall ? { ...entry, call: nextCall } : entry;\n });\n return { ...row, calls, entries };\n}\n\nfunction toolCallRawId(id: string): string {\n return id.startsWith(\"call:\") ? id.slice(\"call:\".length) : id;\n}\n\nconst SUB_AGENT_ACTIVITY_LOG_CAP = 20;\n\nfunction subAgentLane(\n ownerThreadId: string,\n sortedItems: readonly WorkspaceAgentActivityTimelineItem[],\n card: SubAgentCollabCard\n): AgentTaskSubAgentVM {\n const activity = subAgentActivityLog(sortedItems);\n const latest = activity.entries[activity.entries.length - 1] ?? null;\n const terminal = latestTerminalMarker(sortedItems);\n const lastItem = sortedItems[sortedItems.length - 1];\n const status =\n terminal?.status ?? card.childStatuses.get(ownerThreadId) ?? \"running\";\n const terminalAtUnixMs = terminal?.occurredAtUnixMs ?? null;\n return {\n ownerThreadId,\n status,\n // Identity precedence: the child thread's own name (subAgentName marker,\n // rare in practice) > a short name derived from the task's opening\n // self-address (\"你是 X。…\" / \"You are X. …\") > the view's localized\n // numbered fallback. Never the collab tool name.\n name:\n latestNameMarker(sortedItems) ?? deriveSubAgentNameFromTask(card.task),\n task: card.task,\n laneIndex: 1,\n laneCount: 1,\n latestActivity: latest?.text ?? null,\n latestActivityKind: latest?.kind ?? null,\n activityLog: activity.entries,\n activityOmittedCount: activity.omittedCount,\n failureDetail: terminal?.detail ?? null,\n startedAtUnixMs:\n timelineItemTime(sortedItems[0]) || card.startedAtUnixMs || null,\n latestActivityAtUnixMs:\n terminalAtUnixMs ??\n (lastItem ? timelineItemTime(lastItem) : card.startedAtUnixMs) ??\n null,\n terminalAtUnixMs\n };\n}\n\nconst SUB_AGENT_DERIVED_NAME_MAX = 36;\n\nexport function deriveSubAgentNameFromTask(task: string | null): string | null {\n if (!task) {\n return null;\n }\n const firstSentence = task\n .trim()\n .split(/[。..!?!?,,\\n]/, 1)[0]\n ?.trim();\n if (!firstSentence) {\n return null;\n }\n // Only a self-address opening (\"你是 X\" / \"You are X\" / \"Act as X\") is a\n // reliable identity signal; a plain task sentence is not a name.\n const selfAddress = /^(你现在是|你現在是|你是|you are|act as)\\s*/i;\n if (!selfAddress.test(firstSentence)) {\n return null;\n }\n const stripped = firstSentence\n .replace(selfAddress, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (stripped.length < 2 || stripped.length > SUB_AGENT_DERIVED_NAME_MAX) {\n return null;\n }\n // A bare restatement of the tool adds nothing.\n if (/^(spawnagent|agent)$/i.test(stripped)) {\n return null;\n }\n return stripped;\n}\n\nfunction isSpawnAgentToken(agentName: string | null): boolean {\n const token = normalizeToolToken(agentName);\n return token === \"spawnagent\" || token === \"spawn\";\n}\n\nfunction latestNameMarker(\n sortedItems: readonly WorkspaceAgentActivityTimelineItem[]\n): string | null {\n for (let index = sortedItems.length - 1; index >= 0; index -= 1) {\n const payload = sortedItems[index]?.payload;\n if (payload?.messageKind !== \"subAgentName\") {\n continue;\n }\n const name = stringValue(payload.subAgentName);\n if (name) {\n return name;\n }\n }\n return null;\n}\n\nfunction isSubAgentMarkerItem(\n item: WorkspaceAgentActivityTimelineItem\n): boolean {\n const kind = item.payload?.messageKind;\n return kind === \"subAgentLifecycle\" || kind === \"subAgentName\";\n}\n\nfunction subAgentActivityLog(\n sortedItems: readonly WorkspaceAgentActivityTimelineItem[]\n): { entries: AgentTaskSubAgentActivityVM[]; omittedCount: number } {\n const all: AgentTaskSubAgentActivityVM[] = [];\n for (const item of sortedItems) {\n if (!item || isSubAgentMarkerItem(item)) {\n continue;\n }\n const entry = displayableActivityEntry(item);\n if (entry) {\n all.push(entry);\n }\n }\n const omittedCount = Math.max(0, all.length - SUB_AGENT_ACTIVITY_LOG_CAP);\n return { entries: all.slice(omittedCount), omittedCount };\n}\n\nfunction displayableActivityEntry(\n item: WorkspaceAgentActivityTimelineItem\n): AgentTaskSubAgentActivityVM | null {\n const atUnixMs = timelineItemTime(item) || null;\n if (isWorkspaceAgentToolCallItem(item)) {\n const name =\n firstString(item.name, stringValue(item.payload?.name)) ?? null;\n return name ? { kind: \"tool\", text: name, atUnixMs } : null;\n }\n const text = snippet(timelineItemText(item));\n if (!text) {\n return null;\n }\n const itemType = item.itemType?.trim().toLowerCase() ?? \"\";\n const role = item.role?.trim().toLowerCase() ?? \"\";\n if (\n itemType === \"message.assistant_thinking\" ||\n role === \"assistant_thinking\"\n ) {\n return { kind: \"reasoning\", text, atUnixMs };\n }\n return { kind: \"message\", text, atUnixMs };\n}\n\nfunction latestTerminalMarker(\n sortedItems: readonly WorkspaceAgentActivityTimelineItem[]\n): {\n status: AgentTaskSubAgentStatus;\n detail: string | null;\n occurredAtUnixMs: number | null;\n} | null {\n for (let index = sortedItems.length - 1; index >= 0; index -= 1) {\n const item = sortedItems[index];\n const payload = item?.payload;\n if (!payload || payload.messageKind !== \"subAgentLifecycle\") {\n continue;\n }\n return {\n status: subAgentStatusFromLifecycle(payload.subAgentLifecycleStatus),\n detail: stringValue(payload.detail) ?? null,\n occurredAtUnixMs: timelineItemTime(item) || null\n };\n }\n return null;\n}\n\nconst SUB_AGENT_ACTIVITY_SNIPPET_LENGTH = 140;\n\nfunction snippet(text: string): string {\n if (text.length <= SUB_AGENT_ACTIVITY_SNIPPET_LENGTH) {\n return text;\n }\n // Streamed assistant text grows at the tail; the trailing window is the\n // sub-agent's most current activity.\n return `…${text.slice(-SUB_AGENT_ACTIVITY_SNIPPET_LENGTH)}`;\n}\n\nfunction timelineItemText(item: WorkspaceAgentActivityTimelineItem): string {\n const text =\n stringValue(item.payload?.text) ??\n stringValue(item.payload?.content) ??\n stringValue(item.content) ??\n \"\";\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nconst COLLAB_CARD_TOOL_NAMES = new Set([\n \"task\",\n \"subagent\",\n \"delegatetask\",\n \"delegateagent\",\n \"agent\"\n]);\n\nfunction collectCollabCards(\n mainTimelineItems: readonly WorkspaceAgentActivityTimelineItem[]\n): SubAgentCollabCard[] {\n const cardsByCallId = new Map<\n string,\n {\n callId: string;\n startedAtUnixMs: number;\n latestAtUnixMs: number;\n latestCallStatus: string | null;\n receiverThreadIds: Set<string>;\n childStatuses: Map<string, AgentTaskSubAgentStatus>;\n }\n >();\n for (const item of mainTimelineItems) {\n if (!isWorkspaceAgentToolCallItem(item) || !isCollabCardItem(item)) {\n continue;\n }\n const callId = firstString(item.callId, stringValue(item.payload?.callId));\n if (!callId) {\n continue;\n }\n const time = timelineItemTime(item);\n const input = recordValue(item.payload?.input);\n const output = recordValue(item.payload?.output);\n const existing = cardsByCallId.get(callId);\n if (!existing) {\n cardsByCallId.set(callId, {\n callId,\n startedAtUnixMs: time,\n latestAtUnixMs: time,\n latestCallStatus: firstString(\n item.status,\n stringValue(item.payload?.status)\n ),\n receiverThreadIds: collectReceiverThreadIds(input),\n childStatuses: collectChildStatuses(output)\n });\n continue;\n }\n existing.startedAtUnixMs = Math.min(existing.startedAtUnixMs, time);\n if (time >= existing.latestAtUnixMs) {\n existing.latestAtUnixMs = time;\n existing.latestCallStatus =\n firstString(item.status, stringValue(item.payload?.status)) ??\n existing.latestCallStatus;\n }\n for (const value of collectReceiverThreadIds(input)) {\n existing.receiverThreadIds.add(value);\n }\n for (const [threadId, childStatus] of collectChildStatuses(output)) {\n existing.childStatuses.set(threadId, childStatus);\n }\n }\n return [...cardsByCallId.values()]\n .map((card) => {\n const input = recordValue(\n partitionCardInput(mainTimelineItems, card.callId)?.payload?.input\n );\n return {\n callId: card.callId,\n startedAtUnixMs: card.startedAtUnixMs,\n task: stringValue(input?.task),\n agentName: stringValue(input?.agentName),\n callStatus: subAgentStatusFromCallStatus(card.latestCallStatus),\n receiverThreadIds: card.receiverThreadIds,\n childStatuses: card.childStatuses\n };\n })\n .sort((left, right) => left.startedAtUnixMs - right.startedAtUnixMs);\n}\n\nfunction partitionCardInput(\n mainTimelineItems: readonly WorkspaceAgentActivityTimelineItem[],\n callId: string\n): WorkspaceAgentActivityTimelineItem | null {\n for (const item of mainTimelineItems) {\n if (!isWorkspaceAgentToolCallItem(item) || !isCollabCardItem(item)) {\n continue;\n }\n if (\n firstString(item.callId, stringValue(item.payload?.callId)) === callId\n ) {\n return item;\n }\n }\n return null;\n}\n\nfunction isCollabCardItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n const toolName = normalizeToolToken(resolveWorkspaceAgentToolName(item));\n return COLLAB_CARD_TOOL_NAMES.has(toolName);\n}\n\nfunction firstOwnerCallId(\n sortedItems: readonly WorkspaceAgentActivityTimelineItem[]\n): string | null {\n for (const item of sortedItems) {\n const ownerCallId = timelineItemOwnerCallId(item);\n if (ownerCallId) {\n return ownerCallId;\n }\n }\n return null;\n}\n\nfunction isControlAgentToken(agentName: string | null): boolean {\n switch (normalizeToolToken(agentName)) {\n case \"wait\":\n case \"waitagent\":\n case \"close\":\n case \"closeagent\":\n return true;\n default:\n return false;\n }\n}\n\nfunction subAgentStatusFromCallStatus(\n status: string | null\n): AgentTaskSubAgentStatus {\n switch ((status ?? \"\").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 \"canceled\":\n case \"cancelled\":\n return \"canceled\";\n default:\n return \"running\";\n }\n}\n\nfunction subAgentStatusFromLifecycle(status: unknown): AgentTaskSubAgentStatus {\n switch (typeof status === \"string\" ? status.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 \"canceled\":\n case \"cancelled\":\n case \"interrupted\":\n case \"stopped\":\n return \"canceled\";\n default:\n return \"running\";\n }\n}\n\nfunction collectReceiverThreadIds(input: unknown): Set<string> {\n const out = new Set<string>();\n if (input == null || typeof input !== \"object\" || Array.isArray(input)) {\n return out;\n }\n const raw = (input as Record<string, unknown>).receiverThreadIds;\n if (!Array.isArray(raw)) {\n return out;\n }\n for (const entry of raw) {\n const id = stringValue(entry);\n if (id) {\n out.add(id);\n }\n }\n return out;\n}\n\nfunction collectChildStatuses(\n value: unknown\n): Map<string, AgentTaskSubAgentStatus> {\n const out = new Map<string, AgentTaskSubAgentStatus>();\n collectChildStatusesInto(value, out, 0);\n return out;\n}\n\nfunction collectChildStatusesInto(\n value: unknown,\n out: Map<string, AgentTaskSubAgentStatus>,\n depth: number\n): void {\n if (depth > 6 || value == null) {\n return;\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectChildStatusesInto(entry, out, depth + 1);\n }\n return;\n }\n if (typeof value !== \"object\") {\n return;\n }\n const record = value as Record<string, unknown>;\n const status = subAgentStatusFromLifecycle(\n record.status ?? record.state ?? record.lifecycleStatus\n );\n const id = firstString(\n stringValue(record.threadId),\n stringValue(record.threadID),\n stringValue(record.agentId),\n stringValue(record.agent_id),\n stringValue(record.id)\n );\n if (id && status !== \"running\") {\n out.set(id, status);\n }\n for (const [key, entry] of Object.entries(record)) {\n if (key === \"agentsStates\" || key === \"statuses\") {\n collectChildStatusesInto(entry, out, depth + 1);\n continue;\n }\n if (typeof entry === \"object\" && entry != null) {\n const nestedStatus = subAgentStatusFromLifecycle(\n (entry as Record<string, unknown>).status ??\n (entry as Record<string, unknown>).state\n );\n if (nestedStatus !== \"running\" && key.trim()) {\n out.set(key, nestedStatus);\n }\n }\n collectChildStatusesInto(entry, out, depth + 1);\n }\n}\n\nfunction timelineItemTime(\n item: WorkspaceAgentActivityTimelineItem | undefined\n): number {\n return item?.occurredAtUnixMs ?? item?.createdAtUnixMs ?? 0;\n}\n\nfunction compareTimelineItemsAscending(\n left: WorkspaceAgentActivityTimelineItem,\n right: WorkspaceAgentActivityTimelineItem\n): number {\n return (\n timelineItemTime(left) - timelineItemTime(right) ||\n (left.seq ?? 0) - (right.seq ?? 0) ||\n left.id - right.id\n );\n}\n\nfunction normalizeToolToken(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 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 firstString(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n const resolved = stringValue(value);\n if (resolved) {\n return resolved;\n }\n }\n return null;\n}\n","import type {\n WorkspaceAgentActivitySession,\n WorkspaceAgentActivityTimelineItem\n} from \"./workspaceAgentActivityTypes\";\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 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 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: WorkspaceAgentActivitySession;\n cwd: string;\n workspaceRoot: string | null;\n turns: WorkspaceAgentSessionDetailTurn[];\n showProcessingIndicator?: boolean;\n}\n\nexport interface BuildWorkspaceAgentSessionDetailInput {\n activity: WorkspaceAgentActivityCard;\n session: WorkspaceAgentActivitySession;\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 { WorkspaceAgentSessionDetailToolCall } from \"../../workspaceAgentSessionDetailViewModel\";\nimport { extractAgentMcpToolTarget } from \"../../agentMcpToolTarget\";\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 return {\n kind: \"approval\",\n id: call.id,\n turnId: call.turnId ?? \"turn:unknown\",\n requestId,\n callId: call.id.replace(/^call:/, \"\"),\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 value = answersByQuestionId[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 = arrayValue(output?.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 { 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 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 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 { 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 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 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 =\n objectValue(call.payload?.input) ?? objectValue(toolState?.input);\n const output =\n objectValue(call.payload?.output) ?? objectValue(toolState?.output);\n const error =\n objectValue(call.payload?.error) ?? objectValue(toolState?.error);\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","import type {\n WorkspaceAgentSessionDetailMessage,\n WorkspaceAgentSessionDetailThinking,\n WorkspaceAgentSessionDetailTurn\n} from \"../../workspaceAgentSessionDetailViewModel\";\nimport type {\n AgentMessageContentVM,\n AgentThinkingContentVM\n} from \"../contracts/agentMessageRowVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport type {\n AgentToolGroupEntryVM,\n AgentToolGroupRowVM\n} from \"../contracts/agentToolGroupRowVM\";\nimport { projectAgentToolCall } from \"./agentToolProjection\";\n\nconst AVOID_GROUPING_EDITS = false;\n\nexport type AgentTurnSequenceItemVM =\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 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 buildAgentTurnSequenceItems(\n turn: WorkspaceAgentSessionDetailTurn\n): AgentTurnSequenceItemVM[] {\n const items = turn.rawAgentItems ?? turn.agentItems;\n const out: AgentTurnSequenceItemVM[] = [];\n items.forEach((item) => {\n if (item.kind === \"message\") {\n out.push({\n kind: \"assistant-message\",\n message: projectMessage(item.message, turn.id)\n });\n return;\n }\n if (item.kind === \"thinking\") {\n out.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 out.push({\n kind: \"thinking\",\n thinking: projectThinking(entry.thinking, turn.id)\n });\n return;\n }\n out.push({\n kind: \"tool-call\",\n call: projectAgentToolCall(entry.call)\n });\n });\n });\n return out;\n}\n\nexport function computeAgentToolGroups(\n sequence: readonly AgentTurnSequenceItemVM[],\n {\n allowTrailingFinalization,\n avoidGroupingEdits = AVOID_GROUPING_EDITS\n }: {\n allowTrailingFinalization: boolean;\n avoidGroupingEdits?: boolean;\n }\n): AgentComputedToolGroupInfoVM {\n const groups = new Map<number, AgentComputedToolGroupVM>();\n const groupedIndices = new Set<number>();\n // Nothing is hidden anymore. While a session streams a burst of sequential\n // tool calls (e.g. Codex), the trailing run whose newest tool is still active\n // is rendered as individual, always-visible rows instead of grouping or\n // collapsing it. Grouping that run while the tail tool kept changing was what\n // made the transcript flicker between \"one tool\" and \"many\" as the burst\n // advanced. Items before the active trailing run still group as usual.\n const suppressedIndices = new Set<number>();\n const splitFromIndex = allowTrailingFinalization\n ? -1\n : findActiveTailRunStartIndex(sequence);\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 >= 2 &&\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 // Once we reach the still-streaming trailing run, stop grouping: close any\n // open group and let every remaining item fall through to its own visible\n // row so the live view only ever appends.\n if (splitFromIndex >= 0 && index >= splitFromIndex) {\n finalizeGroup();\n continue;\n }\n if (item.kind === \"tool-call\" && isGroupableToolCall(item.call)) {\n if (avoidGroupingEdits && isEditBoundaryToolCall(item.call)) {\n finalizeGroup();\n startIndex = index;\n currentCalls = [item.call];\n currentEntries = [{ kind: \"tool-call\", call: item.call }];\n currentIndices = [index];\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 if (allowTrailingFinalization) {\n finalizeGroup();\n }\n\n return {\n groups,\n groupedIndices,\n suppressedIndices\n };\n}\n\nexport function projectAgentToolGroupRowFromGroup(\n turnId: string,\n group: AgentComputedToolGroupVM\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:${turnId}:${firstCallId}`,\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 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 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 // Codex plan-mode proposals arrive tagged by the daemon and render as a\n // dedicated plan card instead of a regular assistant bubble.\n if (\n message.sourceTimelineItems.some(\n (item) => item.payload?.messageKind === \"plan\"\n )\n ) {\n projected.contentKind = \"plan\";\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\nfunction isGroupableToolCall(call: AgentToolCallVM): boolean {\n if (call.statusKind === \"working\" || call.statusKind === \"waiting\") {\n return false;\n }\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\n/**\n * Index where the still-streaming trailing tool run begins, or -1 when there\n * is none. The run is the contiguous block of tool calls at the end of the\n * sequence whose newest (tail) tool is still active. Returning its start lets\n * the projection keep that whole run as individual, always-visible rows while\n * the burst is in flight, instead of grouping (and previously hiding) it.\n */\nfunction findActiveTailRunStartIndex(\n sequence: readonly AgentTurnSequenceItemVM[]\n): number {\n let tailIndex = -1;\n for (let index = sequence.length - 1; index >= 0; index -= 1) {\n const item = sequence[index];\n if (!item) {\n continue;\n }\n tailIndex = index;\n break;\n }\n const tailItem = tailIndex >= 0 ? sequence[tailIndex] : undefined;\n if (tailItem?.kind !== \"tool-call\" || !isActiveTailTool(tailItem.call)) {\n return -1;\n }\n let startIndex = tailIndex;\n for (let index = tailIndex - 1; index >= 0; index -= 1) {\n const item = sequence[index];\n if (!item) {\n continue;\n }\n if (item.kind !== \"tool-call\") {\n break;\n }\n startIndex = index;\n }\n return startIndex;\n}\n\nfunction isActiveTailTool(call: AgentToolCallVM): boolean {\n // Only an actively running tail tool keeps its trailing run in the live,\n // ungrouped state. Once the latest tail tool has finished, the run finalizes\n // and groups like any other completed run.\n if (call.statusKind !== \"working\" && call.statusKind !== \"waiting\") {\n return false;\n }\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","/**\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 {\n AgentComputedToolGroupVM,\n AgentTurnSequenceItemVM\n} from \"./agentToolGroupingProjection\";\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 | { 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): \"message\" | \"thinking\" | \"tool\" {\n switch (item.kind) {\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 \"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): 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(turnId, last.group);\n }\n if (last.tag === \"tool\") {\n return projectAgentSingleToolRow(last.call, turnId);\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): AgentTranscriptRowVM[] {\n const units = toRenderUnits(sequence, groups, skippedIndices);\n return chunkBy(units, thinkingAbsorbedByMessage).map((run) =>\n renderRun(run, turnId)\n );\n}\n","import type { WorkspaceAgentSessionDetailViewModel } from \"../../workspaceAgentSessionDetailViewModel\";\nimport type { AgentProcessingRowVM } from \"../contracts/agentProcessingRowVM\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\n\nexport function projectAgentProcessingRow(\n detail: WorkspaceAgentSessionDetailViewModel,\n rows: readonly AgentTranscriptRowVM[]\n): AgentProcessingRowVM | null {\n if (!detail.showProcessingIndicator) {\n return null;\n }\n const status = detail.session.status?.trim().toLowerCase() ?? \"\";\n if (!isWorkingSessionStatus(status)) {\n return null;\n }\n if (hasSpecificProgressRow(rows)) {\n return null;\n }\n const turnId = detail.turns.at(-1)?.id ?? null;\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 isWorkingSessionStatus(status: string): boolean {\n return status === \"working\";\n}\n\nfunction hasSpecificProgressRow(\n rows: readonly AgentTranscriptRowVM[]\n): boolean {\n return rows.some((row) => {\n if (row.kind !== \"tool-group\") {\n return false;\n }\n return row.calls.some(\n (call) => call.statusKind === \"working\" || call.statusKind === \"waiting\"\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 if (!text.includes(\"\\n\") && text.includes(\"\\\\n\")) {\n return text.replace(/\\\\n/g, \"\\n\");\n }\n return text;\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 {\n WorkspaceAgentSessionDetailToolCall,\n WorkspaceAgentSessionDetailViewModel,\n WorkspaceAgentSessionDetailTurn\n} from \"../../workspaceAgentSessionDetailViewModel\";\nimport type {\n AgentTurnSummaryPatchBatchVM,\n AgentTurnSummaryPatchChangeVM,\n AgentTurnSummaryFileVM,\n AgentTurnSummaryRowVM\n} from \"../contracts/agentTurnSummaryRowVM\";\nimport {\n extractAgentPatchPath,\n inferAgentPatchChangeType\n} from \"../rules/agentPatchMetadata\";\nimport {\n fileChangeEntriesFromChanges,\n fileChangeTypeValue\n} from \"../../workspaceAgentFileChangePayload\";\n\ntype AgentTurnSummaryChangeType = AgentTurnSummaryFileVM[\"changeType\"];\n\ninterface AgentTurnSummaryProjectionOptions {\n defaultCwd?: string | null;\n workspaceRoot?: string | null;\n}\n\nexport function projectAgentTurnSummaryRows(\n detail: WorkspaceAgentSessionDetailViewModel\n): AgentTurnSummaryRowVM[] {\n const options = {\n defaultCwd: detail.cwd,\n workspaceRoot: detail.workspaceRoot\n };\n const rows = detail.turns.flatMap((turn) =>\n projectAgentTurnSummaryRowForTurn(turn, options)\n );\n if (rows.length > 0) {\n return rows;\n }\n if (detail.activity.changedFiles.length === 0) {\n return [];\n }\n const files = detail.activity.changedFiles.flatMap((file) => {\n const path = normalizedActivityFilePath(file.path, options);\n if (!path) {\n return [];\n }\n const parts = splitFilePath(path);\n return {\n label: path,\n path,\n fileName: parts.fileName,\n directory: parts.directory,\n changeType: \"modified\" as const,\n toolName: null,\n messageId: \"turn-summary:activity\",\n occurredAtUnixMs:\n detail.session.updatedAtUnixMs ?? detail.session.createdAtUnixMs ?? null\n };\n });\n if (files.length === 0) {\n return [];\n }\n const labeledFiles = applyShortestUniqueFileLabels(files);\n return [\n {\n kind: \"turn-summary\",\n id: \"turn-summary:activity\",\n turnId: detail.turns.at(-1)?.id ?? \"turn:activity\",\n files: labeledFiles,\n fileCount: labeledFiles.length,\n modifiedCount: labeledFiles.length,\n createdCount: 0,\n occurredAtUnixMs:\n detail.session.updatedAtUnixMs ?? detail.session.createdAtUnixMs ?? null\n }\n ];\n}\n\nfunction normalizedActivityFilePath(\n value: string | null,\n options: AgentTurnSummaryProjectionOptions\n): string | null {\n const path = value?.trim() ?? \"\";\n return path &&\n !isStructuredPayloadPath(path) &&\n !isIgnoredFilePath(path) &&\n resolveWorkspaceFilePathCandidate({\n path,\n workspaceRoot: options.workspaceRoot\n })\n ? path\n : null;\n}\n\nexport function projectAgentTurnSummaryRowForTurn(\n turn: WorkspaceAgentSessionDetailTurn,\n options: AgentTurnSummaryProjectionOptions = {}\n): AgentTurnSummaryRowVM[] {\n const summaryCalls = turnToolCallsForSummary(turn);\n const files = applyShortestUniqueFileLabels(\n dedupeFiles(summaryCalls.flatMap((call) => filesFromCall(call, options)))\n );\n if (files.length === 0) {\n return [];\n }\n const patchBatches = patchBatchesFromCalls(summaryCalls, options);\n const fileCount = files.length;\n const createdCount = files.filter(\n (file) => file.changeType === \"created\"\n ).length;\n const modifiedCount = fileCount - createdCount;\n const occurredAtUnixMs =\n files\n .map((file) => file.occurredAtUnixMs ?? 0)\n .reduce((latest, value) => (value > latest ? value : latest), 0) || null;\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,\n modifiedCount,\n createdCount,\n occurredAtUnixMs\n }\n ];\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 Array.from(callsById.values());\n}\n\nfunction filesFromCall(\n call: WorkspaceAgentSessionDetailToolCall,\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryFileVM[] {\n const toolState = objectValue(call.payload?.tool_state);\n const input =\n objectValue(call.payload?.input) ??\n objectValue(toolState?.input) ??\n summaryPathInput(call.summary, options);\n const output =\n objectValue(call.payload?.output) ?? objectValue(toolState?.output);\n const error =\n objectValue(call.payload?.error) ?? objectValue(toolState?.error);\n const nestedTaskSteps = nestedTaskStepsFromPayload(call.payload, output);\n\n const directChanges = extractFileChanges({\n id: call.id,\n toolName: call.toolName,\n statusKind: call.statusKind ?? null,\n occurredAtUnixMs: call.occurredAtUnixMs ?? null,\n payload: call.payload ?? null,\n input,\n output,\n error,\n options\n });\n const nestedChanges = nestedTaskSteps.flatMap((value, index) => {\n const step = objectValue(value);\n if (!step) {\n return [];\n }\n return extractFileChanges({\n id:\n stringValue(step.toolUseId) ??\n stringValue(step.id) ??\n `${call.id}:step:${index + 1}`,\n toolName:\n stringValue(step.toolName) ??\n stringValue(step.tool_name) ??\n stringValue(step.name) ??\n null,\n statusKind: nestedTaskStepStatusKind(step, call.statusKind ?? null),\n occurredAtUnixMs:\n numberValue(step.occurredAtUnixMs) ??\n numberValue(step.occurred_at_unix_ms) ??\n call.occurredAtUnixMs ??\n null,\n payload: objectValue(step.payload),\n input: objectValue(step.toolInput) ?? objectValue(step.tool_input),\n output: objectValue(step.toolResult) ?? objectValue(step.tool_result),\n error: objectValue(step.toolError) ?? objectValue(step.tool_error),\n options\n });\n });\n return [...directChanges, ...nestedChanges];\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({\n id: call.id,\n payload: call.payload ?? null,\n toolInput: null,\n toolOutput: null,\n toolError: null,\n options\n });\n const output = objectValue(call.payload?.output);\n const nestedTaskSteps = nestedTaskStepsFromPayload(call.payload, output);\n const nestedBatches = nestedTaskSteps.flatMap((value, index) => {\n const step = objectValue(value);\n if (!step) {\n return [];\n }\n if (\n isFailedToolStatus(\n nestedTaskStepStatusKind(step, call.statusKind ?? null)\n )\n ) {\n return [];\n }\n return patchBatchFromPayload({\n id:\n stringValue(step.toolUseId) ??\n stringValue(step.id) ??\n `${call.id}:step:${index + 1}`,\n payload: objectValue(step.payload),\n toolInput: objectValue(step.toolInput) ?? objectValue(step.tool_input),\n toolOutput: objectValue(step.toolResult) ?? objectValue(step.tool_result),\n toolError: objectValue(step.toolError) ?? objectValue(step.tool_error),\n options\n });\n });\n return [...directBatch, ...nestedBatches];\n}\n\nfunction patchBatchFromPayload(input: {\n id: string;\n payload: Record<string, unknown> | null;\n toolInput: Record<string, unknown> | null;\n toolOutput: Record<string, unknown> | null;\n toolError: Record<string, unknown> | null;\n options: AgentTurnSummaryProjectionOptions;\n}): AgentTurnSummaryPatchBatchVM[] {\n const toolState = objectValue(input.payload?.tool_state);\n const metadata = objectValue(input.payload?.metadata);\n const payloadInput =\n input.toolInput ??\n objectValue(input.payload?.input) ??\n objectValue(toolState?.input);\n const payloadOutput =\n input.toolOutput ??\n objectValue(input.payload?.output) ??\n objectValue(toolState?.output);\n const rawInput = objectValue(payloadInput?.rawInput);\n const changes = firstFileChangeValue(\n payloadOutput?.changes,\n input.payload?.changes,\n payloadInput?.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(input.payload?.cwd),\n stringValue(payloadInput?.cwd),\n stringValue(rawInput?.cwd),\n stringValue(payloadOutput?.cwd),\n stringValue(metadata?.cwd),\n input.options.defaultCwd ?? null\n ) ?? null,\n toolCallId: input.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 normalizedPath = entry.path.trim();\n if (!normalizedPath) {\n return [];\n }\n const normalizedType = 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 (\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 = firstPresentString(\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 return [\n {\n path: normalizedPath,\n changeType: normalizedType ?? inferAgentPatchChangeType(unifiedDiff),\n unifiedDiff,\n oldString,\n newString,\n content\n }\n ];\n });\n}\n\nfunction summaryPathInput(\n summary: string,\n options: AgentTurnSummaryProjectionOptions\n): Record<string, unknown> | null {\n const path = normalizedFilePath(summary, options);\n return path ? { path, summaryPathFallback: true } : null;\n}\n\nfunction extractFileChanges(input: {\n id: string;\n toolName: string | null | undefined;\n statusKind: string | null;\n occurredAtUnixMs: number | null;\n payload: Record<string, unknown> | null;\n input: Record<string, unknown> | null;\n output: Record<string, unknown> | null;\n error: Record<string, unknown> | null;\n options: AgentTurnSummaryProjectionOptions;\n}): AgentTurnSummaryFileVM[] {\n const normalizedToolName = normalizeToolName(input.toolName);\n const payload = input.payload;\n const metadata = objectValue(payload?.metadata);\n const rawInput = objectValue(input.input?.rawInput);\n const inputLocations = arrayValue(input.input?.locations);\n const payloadLocations = arrayValue(payload?.locations);\n const payloadPaths = arrayValue(payload?.paths);\n const structuredWriteTool = isStructuredWriteTool(\n normalizedToolName,\n payload,\n metadata\n );\n if (!isFileChangeTool(normalizedToolName, structuredWriteTool)) {\n return [];\n }\n if (isFailedToolStatus(input.statusKind)) {\n return [];\n }\n const changes = firstFileChangeValue(\n input.output?.changes,\n payload?.changes,\n input.input?.changes,\n rawInput?.changes\n );\n\n const filesFromMetadata = collectMetadataFiles(\n input.id,\n input.toolName ?? null,\n input.occurredAtUnixMs,\n arrayValue(objectValue(payload?.fileChanges)?.files),\n firstNonEmptyString(\n stringValue(input.input?.patch),\n stringValue(input.output?.patch),\n stringValue(payload?.patch),\n stringValue(metadata?.patch)\n ),\n firstPresentString(\n literalStringValue(input.output?.oldString),\n literalStringValue(input.output?.old_string),\n literalStringValue(input.input?.oldString),\n literalStringValue(input.input?.old_string)\n ),\n firstPresentString(\n literalStringValue(input.output?.newString),\n literalStringValue(input.output?.new_string),\n literalStringValue(input.input?.newString),\n literalStringValue(input.input?.new_string)\n ),\n firstPresentString(\n literalStringValue(input.output?.content),\n literalStringValue(input.input?.content)\n ),\n input.options\n );\n if (filesFromMetadata.length > 0) {\n return filesFromMetadata;\n }\n\n const filesFromChangeMap = collectChangeMapFiles(\n input.id,\n input.toolName ?? null,\n input.occurredAtUnixMs,\n changes,\n input.options\n );\n if (filesFromChangeMap.length > 0) {\n return filesFromChangeMap;\n }\n\n const filesFromContentDiff = collectContentDiffFiles(\n input.id,\n input.toolName ?? null,\n input.occurredAtUnixMs,\n arrayValue(input.output?.content) ??\n arrayValue(payload?.content) ??\n arrayValue(input.input?.content),\n changes,\n input.options\n );\n if (filesFromContentDiff.length > 0) {\n return filesFromContentDiff;\n }\n\n const summaryFallbackPath =\n input.input?.summaryPathFallback === true\n ? stringValue(input.input?.path)\n : null;\n const explicitInputPath = summaryFallbackPath\n ? null\n : stringValue(input.input?.path);\n const filePath =\n firstNonEmptyString(\n firstPathValue(payloadPaths),\n stringValue(input.input?.file_path),\n stringValue(input.input?.filePath),\n explicitInputPath,\n stringValue(input.input?.notebook_path),\n stringValue(input.output?.file_path),\n stringValue(input.output?.filePath),\n stringValue(input.output?.path),\n stringValue(input.output?.notebook_path),\n firstLocationPath(inputLocations),\n firstLocationPath(payloadLocations)\n ) ??\n extractAgentPatchPath(\n firstNonEmptyString(\n stringValue(input.input?.patch),\n stringValue(input.output?.patch)\n )\n ) ??\n summaryFallbackPath;\n const normalizedFilePathValue = normalizedFilePath(filePath, input.options);\n if (!normalizedFilePathValue) {\n return [];\n }\n\n const patch =\n firstNonEmptyString(\n stringValue(input.input?.patch),\n stringValue(input.output?.patch),\n stringValue(payload?.patch),\n stringValue(metadata?.patch),\n stringValue(input.output?.content)\n ) ?? null;\n const oldString = firstPresentString(\n literalStringValue(input.output?.oldString),\n literalStringValue(input.output?.old_string),\n literalStringValue(input.input?.oldString),\n literalStringValue(input.input?.old_string)\n );\n const newString = firstPresentString(\n literalStringValue(input.output?.newString),\n literalStringValue(input.output?.new_string),\n literalStringValue(input.input?.newString),\n literalStringValue(input.input?.new_string)\n );\n const content = firstPresentString(\n literalStringValue(input.input?.content),\n literalStringValue(rawInput?.content),\n literalStringValue(input.input?.new_source),\n literalStringValue(input.output?.content),\n literalStringValue(input.output?.new_source)\n );\n const explicitChangeType =\n normalizeChangeType(\n firstNonEmptyString(\n stringValue(payload?.fileChangeKind),\n stringValue(metadata?.fileChangeKind),\n stringValue(input.input?.fileChangeKind),\n stringValue(input.output?.fileChangeKind)\n )\n ) ?? null;\n const changeType =\n explicitChangeType ??\n ((normalizedToolName === \"write\" || normalizedToolName === \"writefile\"\n ? \"created\"\n : normalizedToolName === \"notebookedit\"\n ? \"created\"\n : inferAgentPatchChangeType(patch)) as AgentTurnSummaryChangeType);\n\n return [\n buildFileChange({\n id: input.id,\n toolName: input.toolName ?? null,\n path: normalizedFilePathValue,\n changeType,\n unifiedDiff: patch,\n oldString,\n newString,\n content,\n occurredAtUnixMs: input.occurredAtUnixMs\n })\n ];\n}\n\nfunction isFileChangeTool(\n normalizedToolName: string,\n structuredWriteTool: boolean\n): boolean {\n switch (normalizedToolName) {\n case \"write\":\n case \"writefile\":\n case \"edit\":\n case \"editfile\":\n case \"multiedit\":\n case \"applypatch\":\n case \"notebookedit\":\n return true;\n case \"bash\":\n case \"execcommand\":\n return structuredWriteTool;\n default:\n return false;\n }\n}\n\nfunction isStructuredWriteTool(\n normalizedToolName: string,\n payload: Record<string, unknown> | null,\n metadata: Record<string, unknown> | null\n): boolean {\n if (normalizedToolName !== \"bash\" && normalizedToolName !== \"execcommand\") {\n return false;\n }\n const activityKind = firstNonEmptyString(\n stringValue(payload?.activityKind),\n stringValue(metadata?.activityKind)\n );\n if (\n activityKind === \"write_file\" ||\n activityKind === \"edit_file\" ||\n activityKind === \"delete_file\"\n ) {\n return true;\n }\n return (\n normalizeChangeType(\n firstNonEmptyString(\n stringValue(payload?.fileChangeKind),\n stringValue(metadata?.fileChangeKind)\n )\n ) !== null\n );\n}\n\nfunction collectMetadataFiles(\n messageId: string,\n toolName: string | null,\n occurredAtUnixMs: number | null,\n files: unknown[] | null,\n patch: string | null,\n oldString: string | null,\n newString: string | null,\n content: string | null,\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryFileVM[] {\n if (!files || files.length === 0) {\n return [];\n }\n return files.flatMap((value, index) => {\n const file = objectValue(value);\n const path = normalizedFilePath(stringValue(file?.path), options);\n if (!path) {\n return [];\n }\n const change = normalizeChangeType(stringValue(file?.change));\n return [\n buildFileChange({\n id: `${messageId}:${index + 1}`,\n toolName,\n path,\n changeType: change ?? inferAgentPatchChangeType(patch),\n unifiedDiff: patch,\n oldString,\n newString,\n content,\n occurredAtUnixMs\n })\n ];\n });\n}\n\nfunction collectChangeMapFiles(\n messageId: string,\n toolName: string | null,\n occurredAtUnixMs: number | null,\n changes: unknown,\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryFileVM[] {\n return fileChangeEntriesFromChanges(changes).flatMap((entry) => {\n const change = entry.change;\n const normalizedPath = normalizedFilePath(entry.path, options);\n if (!normalizedPath) {\n return [];\n }\n const normalizedType = normalizeChangeType(fileChangeTypeValue(change));\n const unifiedDiff = firstNonEmptyString(\n stringValue(change.unified_diff),\n stringValue(change.unifiedDiff),\n stringValue(change.diff),\n stringValue(change.patch)\n );\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 (\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 = firstPresentString(\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 return [\n buildFileChange({\n id: `${messageId}:change:${entry.index + 1}`,\n toolName,\n path: normalizedPath,\n changeType: normalizedType ?? inferAgentPatchChangeType(unifiedDiff),\n unifiedDiff,\n oldString,\n newString,\n content,\n occurredAtUnixMs\n })\n ];\n });\n}\n\nfunction collectContentDiffFiles(\n messageId: string,\n toolName: string | null,\n occurredAtUnixMs: number | null,\n contentItems: unknown[] | null,\n changes: unknown,\n options: AgentTurnSummaryProjectionOptions\n): AgentTurnSummaryFileVM[] {\n if (!contentItems) {\n return [];\n }\n const changesByPath = new Map(\n fileChangeEntriesFromChanges(changes).map((entry) => [\n entry.path,\n entry.change\n ])\n );\n return contentItems.flatMap((value, index) => {\n const item = objectValue(value);\n if (!item) {\n return [];\n }\n const type = stringValue(item.type);\n if (type && type !== \"diff\") {\n return [];\n }\n const path = normalizedFilePath(stringValue(item.path), options);\n if (!path) {\n return [];\n }\n const relatedChange = changesByPath.get(path) ?? null;\n const normalizedType = normalizeChangeType(\n relatedChange ? fileChangeTypeValue(relatedChange) : null\n );\n const unifiedDiff = firstNonEmptyString(\n stringValue(item.diff),\n stringValue(item.patch),\n stringValue(relatedChange?.unified_diff),\n stringValue(relatedChange?.unifiedDiff)\n );\n let oldString = firstPresentString(\n literalStringValue(item.oldText),\n literalStringValue(item.oldString),\n literalStringValue(relatedChange?.old_string),\n literalStringValue(relatedChange?.oldString)\n );\n const relatedContent = literalStringValue(relatedChange?.content);\n let newString = firstPresentString(\n literalStringValue(item.newText),\n literalStringValue(item.newString),\n literalStringValue(relatedChange?.new_string),\n literalStringValue(relatedChange?.newString),\n relatedContent\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 = firstPresentString(\n literalStringValue(item.content),\n relatedContent\n );\n const inferredType =\n normalizedType ??\n inferChangeTypeFromToolContent(\n toolName,\n normalizedType === \"deleted\" ? null : explicitContent,\n oldString,\n newString\n );\n if (\n inferredType === \"created\" &&\n oldString === null &&\n newString !== null\n ) {\n oldString = \"\";\n }\n const content = firstPresentString(\n inferredType === \"deleted\" ? null : explicitContent,\n inferredType === \"created\" ? newString : null\n );\n if (\n !unifiedDiff &&\n oldString === null &&\n newString === null &&\n content === null\n ) {\n return [];\n }\n return [\n buildFileChange({\n id: `${messageId}:content:${index + 1}`,\n toolName,\n path,\n changeType: inferredType ?? inferAgentPatchChangeType(unifiedDiff),\n unifiedDiff,\n oldString,\n newString,\n content,\n occurredAtUnixMs\n })\n ];\n });\n}\n\nfunction buildFileChange(input: {\n id: string;\n toolName: string | null;\n path: string;\n changeType: AgentTurnSummaryChangeType;\n unifiedDiff: string | null;\n oldString: string | null;\n newString: string | null;\n content: string | null;\n occurredAtUnixMs: number | null;\n}): AgentTurnSummaryFileVM {\n const parts = splitFilePath(input.path);\n return {\n label: input.path,\n path: input.path,\n fileName: parts.fileName,\n directory: parts.directory,\n changeType: input.changeType,\n toolName: input.toolName,\n messageId: input.id,\n unifiedDiff: input.unifiedDiff,\n oldString: input.oldString,\n newString: input.newString,\n content: input.content,\n occurredAtUnixMs: input.occurredAtUnixMs\n };\n}\n\nfunction 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 })\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\nfunction dedupeFiles(\n files: AgentTurnSummaryFileVM[]\n): AgentTurnSummaryFileVM[] {\n const byPath = new Map<string, AgentTurnSummaryFileVM>();\n files.forEach((file) => {\n const existing = byPath.get(file.path);\n if (!existing) {\n byPath.set(file.path, file);\n return;\n }\n if (existing.changeType === \"deleted\" && file.changeType === \"created\") {\n byPath.set(file.path, {\n ...file,\n changeType: \"modified\",\n unifiedDiff: null,\n oldString:\n existing.oldString ??\n existing.content ??\n existing.unifiedDiff ??\n null,\n newString: file.newString ?? file.content ?? file.unifiedDiff ?? null,\n content: null\n });\n return;\n }\n if (file.changeType === \"deleted\" || existing.changeType === \"deleted\") {\n byPath.set(file.path, file);\n return;\n }\n if (existing.changeType === \"modified\" && file.changeType === \"created\") {\n byPath.set(file.path, file);\n return;\n }\n if (detailScore(file) > detailScore(existing)) {\n byPath.set(file.path, file);\n }\n });\n return [...byPath.values()];\n}\n\nfunction 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\n for (let depth = 1; unresolved.size > 0; depth += 1) {\n const grouped = new Map<string, string[]>();\n\n for (const path of unresolved) {\n const parts = partsByPath.get(path) ?? [];\n const suffix = parts.slice(-Math.min(depth, parts.length)).join(\"/\");\n const fallback = parts.at(-1) ?? path;\n const label = suffix || fallback;\n const group = grouped.get(label);\n if (group) {\n group.push(path);\n } else {\n grouped.set(label, [path]);\n }\n }\n\n let resolvedCount = 0;\n for (const [label, group] of grouped) {\n if (group.length !== 1) {\n continue;\n }\n const path = group[0];\n if (!path) {\n continue;\n }\n labels.set(path, label);\n unresolved.delete(path);\n resolvedCount += 1;\n }\n\n if (resolvedCount === 0) {\n for (const path of unresolved) {\n labels.set(path, path);\n }\n break;\n }\n }\n\n return labels;\n}\n\nfunction detailScore(file: AgentTurnSummaryFileVM): number {\n let score = 0;\n if (file.unifiedDiff) {\n score += 4;\n }\n if (file.oldString || file.newString) {\n score += 3;\n }\n if (file.content) {\n score += 2;\n }\n if (file.toolName) {\n score += 1;\n }\n return score;\n}\n\nfunction 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\nfunction 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 \"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\nfunction inferChangeTypeFromToolContent(\n toolName: string | null,\n content: string | null,\n oldString: string | null,\n newString: string | null\n): \"modified\" | \"created\" | null {\n const normalizedToolName = normalizeToolName(toolName);\n if (normalizedToolName === \"write\" || normalizedToolName === \"writefile\") {\n return content !== null || newString !== null ? \"created\" : null;\n }\n if (oldString !== null || newString !== null) {\n return \"modified\";\n }\n return null;\n}\n\nfunction normalizeToolName(value: string | null | undefined): string {\n return (value ?? \"\")\n .replace(/[_\\s-]+/g, \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction isFailedToolStatus(value: string | null): boolean {\n switch (normalizeToolName(value)) {\n case \"failed\":\n case \"failure\":\n case \"error\":\n case \"errored\":\n return true;\n default:\n return false;\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 firstFileChangeValue(...values: unknown[]): unknown {\n for (const value of values) {\n if (fileChangeEntriesFromChanges(value).length > 0) {\n return value;\n }\n }\n return null;\n}\n\nfunction arrayValue(value: unknown): unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction nestedTaskStepsFromPayload(\n payload: Record<string, unknown> | null,\n output: Record<string, unknown> | null\n): unknown[] {\n const metadata = objectValue(payload?.metadata);\n return (\n arrayValue(metadata?.steps) ??\n arrayValue(output?.steps) ??\n arrayValue(payload?.steps) ??\n []\n );\n}\n\nfunction nestedTaskStepStatusKind(\n step: Record<string, unknown>,\n fallback: string | null\n): string | null {\n return (\n firstNonEmptyString(\n stringValue(step.statusKind),\n stringValue(step.status),\n stringValue(step.toolStatus)\n ) ??\n fallback ??\n null\n );\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 = objectValue(item);\n const path = stringValue(record?.path);\n if (path) {\n return path;\n }\n }\n return null;\n}\n\nfunction firstPathValue(value: unknown[] | null): string | null {\n if (!value) {\n return null;\n }\n for (const item of value) {\n const path = stringValue(item);\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\nfunction literalStringValue(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction numberValue(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction 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\nfunction 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 WorkspaceAgentSessionDetailTurn,\n WorkspaceAgentSessionDetailViewModel\n} from \"../../workspaceAgentSessionDetailViewModel\";\nimport type { AgentApprovalItemVM } from \"../contracts/agentApprovalItemVM\";\nimport type {\n AgentConversationPendingInteractivePromptVM,\n AgentConversationVM\n} from \"../contracts/agentConversationVM\";\nimport type {\n AgentMessageContentVM,\n AgentMessageRowVM\n} from \"../contracts/agentMessageRowVM\";\nimport type { AgentToolCallVM } from \"../contracts/agentToolCallVM\";\nimport type { AgentTranscriptRowVM } from \"../contracts/agentTranscriptRowVM\";\nimport {\n buildAgentTurnSequenceItems,\n computeAgentToolGroups\n} from \"./agentToolGroupingProjection\";\nimport { projectTurnRows } from \"./agentTurnRowProjection\";\nimport { projectAgentProcessingRow } from \"./agentProcessingProjection\";\nimport {\n projectAgentTurnSummaryRowForTurn,\n projectAgentTurnSummaryRows\n} 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\";\n\nexport function projectAgentConversationVM(\n detail: WorkspaceAgentSessionDetailViewModel,\n options: AgentConversationProjectionOptions = {}\n): AgentConversationVM {\n const rows: AgentTranscriptRowVM[] = [];\n const turns = detail.turns;\n const allowTrailingToolGrouping = !isSessionWorking(detail);\n\n turns.forEach((turn, index) => {\n rows.push(...projectUserRows(turn, detail.session.workspaceId));\n rows.push(\n ...projectTurnAgentRows(turn, {\n agentSessionId: detail.session.agentSessionId,\n turnIndex: index,\n allowTrailingFinalization:\n allowTrailingToolGrouping || index < turns.length - 1,\n avoidGroupingEdits: options.avoidGroupingEdits\n })\n );\n if (shouldShowTurnSummaryForTurn(detail, index)) {\n rows.push(\n ...projectAgentTurnSummaryRowForTurn(turn, {\n workspaceRoot: detail.workspaceRoot\n })\n );\n }\n });\n\n if (\n !rows.some((row) => row.kind === \"turn-summary\") &&\n shouldShowLatestTurnSummaryFallback(detail)\n ) {\n rows.push(...projectAgentTurnSummaryRows(detail));\n }\n\n const processing = projectAgentProcessingRow(detail, rows);\n if (processing) {\n rows.push(processing);\n }\n\n const normalizedRows = projectMessageCopyText(\n dropCodexRuntimeDiagnosticNotices(\n dropRedundantErrorWarningNotices(\n mergeAdjacentAssistantMessageRows(\n mergeAdjacentTransportRetryNoticeRows(rows)\n )\n )\n ),\n {\n assistantCopyEligibleTurnIds: buildAssistantCopyEligibleTurnIds(detail)\n }\n );\n\n return {\n activity: detail.activity,\n workspaceRoot: detail.workspaceRoot,\n sourceDetail: detail,\n rows: normalizedRows,\n pendingApproval: selectPendingApproval(normalizedRows),\n pendingInteractivePrompt: selectPendingInteractivePrompt(normalizedRows)\n };\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 pendingApproval: reuseEquivalentValue(\n previous.pendingApproval,\n next.pendingApproval\n ),\n pendingInteractivePrompt: reuseEquivalentValue(\n previous.pendingInteractivePrompt,\n next.pendingInteractivePrompt\n )\n };\n}\n\nfunction reuseEquivalentValue<T>(previous: T, next: T): T {\n return equivalentValue(previous, next) ? previous : next;\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 equivalentValue(left: unknown, right: unknown): 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) => equivalentValue(value, right[index]))\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);\n const rightKeys = Object.keys(rightRecord);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(rightRecord, key) &&\n equivalentValue(leftRecord[key], rightRecord[key])\n )\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 text.includes(CODEX_SKILLS_CONTEXT_BUDGET_NOTICE_FRAGMENT);\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 projectMessageCopyText(\n rows: readonly AgentTranscriptRowVM[],\n options: { assistantCopyEligibleTurnIds: ReadonlySet<string> }\n): AgentTranscriptRowVM[] {\n const assistantCopyTargetKeys = findLatestAssistantCopyTargetKeys(\n rows,\n options.assistantCopyEligibleTurnIds\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 copyText =\n row.speaker === \"user\"\n ? copyTextForUserMessage(message)\n : assistantCopyTargetKeys.has(messageCopyTargetKey(row, message))\n ? message.body\n : null;\n if ((message.copyText ?? null) === copyText) {\n return message;\n }\n changed = true;\n if (copyText) {\n return { ...message, copyText };\n }\n const { copyText: _copyText, ...withoutCopyText } = message;\n return withoutCopyText;\n });\n\n return changed ? { ...row, messages } : row;\n });\n}\n\nfunction buildAssistantCopyEligibleTurnIds(\n detail: WorkspaceAgentSessionDetailViewModel\n): ReadonlySet<string> {\n const ids = new Set<string>();\n detail.turns.forEach((turn, index) => {\n if (index < detail.turns.length - 1 || isLatestTurnSettled(detail)) {\n ids.add(turn.id);\n }\n });\n return ids;\n}\n\nfunction findLatestAssistantCopyTargetKeys(\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 && isSettledTextMessageCopyCandidate(message)) {\n targetKeys.add(messageCopyTargetKey(row, message));\n coveredTurnIds.add(row.turnId);\n break;\n }\n }\n }\n return targetKeys;\n}\n\nfunction messageCopyTargetKey(\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 isTextMessageCopyCandidate(message) ? message.body : null;\n}\n\nfunction isSettledTextMessageCopyCandidate(\n message: AgentMessageContentVM\n): boolean {\n return (\n isTextMessageCopyCandidate(message) &&\n message.statusKind !== \"working\" &&\n message.statusKind !== \"waiting\"\n );\n}\n\nfunction isTextMessageCopyCandidate(message: AgentMessageContentVM): boolean {\n return (\n message.body.trim() !== \"\" &&\n message.contentKind !== \"image-grid\" &&\n !message.visibleError &&\n !message.systemNotice\n );\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 );\n}\n\nfunction shouldShowTurnSummaryForTurn(\n detail: WorkspaceAgentSessionDetailViewModel,\n turnIndex: number\n): boolean {\n return turnIndex < detail.turns.length - 1 || isLatestTurnSettled(detail);\n}\n\nfunction shouldShowLatestTurnSummaryFallback(\n detail: WorkspaceAgentSessionDetailViewModel\n): boolean {\n return detail.turns.length === 0 || isLatestTurnSettled(detail);\n}\n\nfunction isLatestTurnSettled(\n detail: WorkspaceAgentSessionDetailViewModel\n): boolean {\n const status = normalizedSessionDisplayStatus(detail);\n return !isUnsettledSessionStatus(status);\n}\n\nfunction isSessionWorking(\n detail: WorkspaceAgentSessionDetailViewModel\n): boolean {\n const status = normalizedSessionDisplayStatus(detail);\n return isWorkingSessionStatus(status);\n}\n\nfunction isWorkingSessionStatus(status: string): boolean {\n return status === \"working\";\n}\n\nfunction isUnsettledSessionStatus(status: string): boolean {\n return isWorkingSessionStatus(status) || status === \"waiting\";\n}\n\nfunction normalizeStatusToken(status: string | null | undefined): string {\n return status?.trim().toLowerCase() ?? \"\";\n}\n\nfunction normalizedSessionDisplayStatus(\n detail: WorkspaceAgentSessionDetailViewModel\n): string {\n const session = detail.session as {\n effectiveStatus?: string | null;\n turnPhase?: string | null;\n status?: string | null;\n };\n return normalizeStatusToken(\n session.effectiveStatus ?? session.turnPhase ?? session.status\n );\n}\n\nfunction projectUserRows(\n turn: WorkspaceAgentSessionDetailTurn,\n workspaceId: string | null | undefined\n): AgentMessageRowVM[] {\n return turn.userMessages.map((message) => {\n const turnId = message.turnId ?? turn.id;\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}\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 [\n {\n kind: \"message-content\",\n id: message.id,\n turnId,\n body: message.body,\n contentKind: \"text\",\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n sourceTimelineItems: message.sourceTimelineItems\n }\n ];\n }\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 contentKind: \"image-grid\",\n images: imageBlocks.map((image, index) => ({\n id:\n image.path || image.attachmentId || `${message.id}:image:0:${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 path: image.path\n })),\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n sourceTimelineItems: message.sourceTimelineItems\n });\n }\n\n blocks.forEach((block, index) => {\n if (block.type === \"image\") {\n return;\n }\n if (block.text.trim() === \"\") {\n return;\n }\n parts.push({\n kind: \"message-content\",\n id: `${message.id}:text:${index}`,\n turnId,\n body: block.text,\n contentKind: \"text\",\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n sourceTimelineItems: message.sourceTimelineItems\n });\n });\n\n return parts.length > 0\n ? parts\n : [\n {\n kind: \"message-content\",\n id: message.id,\n turnId,\n body: message.body,\n contentKind: \"text\",\n occurredAtUnixMs: message.occurredAtUnixMs ?? null,\n sourceTimelineItems: message.sourceTimelineItems\n }\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 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) {\n return [];\n }\n const displayPrompt = firstString(\n message.sourceTimelineItems?.map((candidate) =>\n typeof candidate.payload?.displayPrompt === \"string\"\n ? candidate.payload.displayPrompt\n : \"\"\n ) ?? []\n );\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) {\n return [];\n }\n if (block.type === \"text\" && typeof block.text === \"string\") {\n if (displayPrompt) {\n return [];\n }\n return [{ type: \"text\", text: block.text }];\n }\n if (block.type !== \"image\") {\n return [];\n }\n const mimeType =\n typeof block.mimeType === \"string\" && block.mimeType.trim()\n ? block.mimeType.trim()\n : \"\";\n if (!mimeType) {\n return [];\n }\n return [\n {\n type: \"image\",\n workspaceId: item?.workspaceId ?? fallbackWorkspaceId ?? null,\n agentSessionId: item?.agentSessionId ?? message.id,\n attachmentId:\n typeof block.attachmentId === \"string\" && block.attachmentId.trim()\n ? block.attachmentId.trim()\n : null,\n mimeType,\n name:\n typeof block.name === \"string\" && block.name.trim()\n ? block.name.trim()\n : null,\n data:\n typeof block.data === \"string\" && block.data.trim()\n ? block.data.trim()\n : null,\n path:\n typeof block.path === \"string\" && block.path.trim()\n ? block.path.trim()\n : null\n }\n ];\n });\n if (!displayPrompt) {\n return blocks;\n }\n return [{ type: \"text\", text: displayPrompt }, ...blocks];\n}\n\nfunction firstString(values: readonly string[]): string {\n for (const value of values) {\n const trimmed = value.trim();\n if (trimmed) {\n return trimmed;\n }\n }\n return \"\";\n}\n\nfunction projectTurnAgentRows(\n turn: WorkspaceAgentSessionDetailTurn,\n options: {\n agentSessionId: string;\n turnIndex: number;\n allowTrailingFinalization: boolean;\n avoidGroupingEdits?: boolean;\n }\n): AgentTranscriptRowVM[] {\n const sequence = buildAgentTurnSequenceItems(turn);\n const { groups, groupedIndices, suppressedIndices } = computeAgentToolGroups(\n sequence,\n options\n );\n const skippedIndices = new Set([...groupedIndices, ...suppressedIndices]);\n return projectTurnRows(sequence, groups, skippedIndices, turn.id);\n}\n\nfunction selectPendingApproval(\n rows: readonly AgentTranscriptRowVM[]\n): AgentApprovalItemVM | null {\n for (const row of [...rows].reverse()) {\n if (row.kind !== \"tool-group\") {\n continue;\n }\n for (const call of toolCallsFromRow(row).reverse()) {\n const approval = call.approval ?? fallbackApprovalFromCall(call);\n if (\n approval &&\n normalizeApprovalPendingStatus(\n approval.status ?? call.status,\n call.statusKind\n ) &&\n !approval.output\n ) {\n return approval;\n }\n }\n }\n return null;\n}\n\nfunction selectPendingInteractivePrompt(\n rows: readonly AgentTranscriptRowVM[]\n): AgentConversationPendingInteractivePromptVM | null {\n for (const row of [...rows].reverse()) {\n if (row.kind !== \"tool-group\") {\n continue;\n }\n for (const call of toolCallsFromRow(row).reverse()) {\n if (\n call.askUserQuestion &&\n normalizeInteractivePendingStatus(\n call.askUserQuestion.status ?? call.status,\n call.statusKind\n ) &&\n call.askUserQuestion.questions.some(\n (question) => question.answer === null\n )\n ) {\n return {\n kind: \"ask-user\",\n requestId: call.askUserQuestion.requestId,\n title: call.askUserQuestion.title,\n questions: call.askUserQuestion.questions\n };\n }\n if (\n call.planMode?.kind === \"exit\" &&\n normalizeInteractivePendingStatus(\n call.planMode.status ?? call.status,\n call.statusKind\n )\n ) {\n return {\n kind: \"exit-plan\",\n requestId: call.planMode.requestId ?? call.id.replace(/^call:/, \"\"),\n title: call.planMode.title,\n options: call.planMode.options ?? [],\n ...(call.planMode.keepPlanningOptionId\n ? { keepPlanningOptionId: call.planMode.keepPlanningOptionId }\n : {})\n };\n }\n }\n }\n return null;\n}\n\nfunction toolCallsFromRow(\n row: Extract<AgentTranscriptRowVM, { kind: \"tool-group\" }>\n): AgentToolCallVM[] {\n return row.calls.length > 0\n ? [...row.calls]\n : row.entries.flatMap((entry) =>\n entry.kind === \"tool-call\" ? [entry.call] : []\n );\n}\n\nfunction normalizeApprovalPendingStatus(\n value: string | null | undefined,\n statusKind: AgentToolCallVM[\"statusKind\"]\n): boolean {\n if (statusKind === \"waiting\") {\n return true;\n }\n const normalized = (value ?? \"\").trim().toLowerCase();\n switch (normalized) {\n case \"awaiting_approval\":\n case \"requested\":\n case \"waiting_approval\":\n case \"waiting\":\n return true;\n default:\n return false;\n }\n}\n\nfunction normalizeInteractivePendingStatus(\n value: string | null | undefined,\n statusKind: AgentToolCallVM[\"statusKind\"]\n): boolean {\n if (statusKind === \"waiting\" || statusKind === \"working\") {\n return true;\n }\n const normalized = (value ?? \"\").trim().toLowerCase();\n return (\n normalized === \"waiting_input\" ||\n normalized === \"waiting\" ||\n normalized === \"pending\" ||\n normalized === \"running\" ||\n normalized === \"streaming\" ||\n normalized === \"working\"\n );\n}\n\nfunction fallbackApprovalFromCall(\n call: AgentToolCallVM\n): AgentApprovalItemVM | null {\n if (call.rendererKind !== \"approval\") {\n return null;\n }\n const rawOptions = Array.isArray(call.input?.options)\n ? call.input.options\n : [];\n const options = rawOptions.flatMap((option) => {\n const record =\n option && typeof option === \"object\" && !Array.isArray(option)\n ? (option as Record<string, unknown>)\n : null;\n const id =\n typeof record?.id === \"string\" && record.id.trim()\n ? record.id.trim()\n : typeof record?.optionId === \"string\" && record.optionId.trim()\n ? record.optionId.trim()\n : \"\";\n if (!id) {\n return [];\n }\n return [\n {\n id,\n label:\n typeof record?.name === \"string\" && record.name.trim()\n ? record.name.trim()\n : typeof record?.label === \"string\" && record.label.trim()\n ? record.label.trim()\n : id,\n kind:\n typeof record?.kind === \"string\" && record.kind.trim()\n ? record.kind.trim()\n : id,\n ...(typeof record?.description === \"string\" && record.description.trim()\n ? { description: record.description.trim() }\n : {})\n }\n ];\n });\n const requestId =\n (typeof call.input?.requestId === \"string\" && call.input.requestId.trim()\n ? call.input.requestId.trim()\n : null) ?? call.id.replace(/^call:/, \"\");\n if (!requestId || options.length === 0) {\n return null;\n }\n return {\n kind: \"approval\",\n id: call.id,\n turnId: call.turnId,\n requestId,\n callId: call.id.replace(/^call:/, \"\"),\n title: call.summary.trim() || call.name,\n status:\n typeof call.payload?.status === \"string\" && call.payload.status.trim()\n ? call.payload.status.trim()\n : call.status,\n toolName: call.toolName,\n input: call.input,\n options,\n output: call.output,\n occurredAtUnixMs: call.occurredAtUnixMs\n };\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 Fragment,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent,\n type FocusEvent,\n type JSX,\n type WheelEvent\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 { AgentTranscriptItemView } from \"./AgentTranscriptItemView\";\nimport { assessAgentTranscriptComplexity } from \"./agentTranscriptComplexity\";\n\nconst AGENT_TRANSCRIPT_VIRTUALIZATION_OVERSCAN = 6;\nconst AGENT_TRANSCRIPT_ESTIMATED_TURN_HEIGHT_PX = 280;\nconst AGENT_TRANSCRIPT_TURN_GAP_PX = 12;\nconst AGENT_TRANSCRIPT_FALLBACK_TURN_COUNT = 3;\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_NATIVE_SMOOTH_MAX_DISTANCE_PX = 720;\nconst AGENT_MESSAGE_LOCATOR_FAST_SCROLL_SPEED_PX_PER_MS = 8;\nconst AGENT_MESSAGE_LOCATOR_FAST_SCROLL_MIN_DURATION_MS = 120;\nconst agentMessageLocatorScrollAnimations = new WeakMap<HTMLElement, number>();\n\ninterface AgentTranscriptTurnGroup {\n key: string;\n turnId: string | null;\n rows: Array<{\n row: AgentConversationVM[\"rows\"][number];\n rowIndex: number;\n }>;\n}\n\ninterface AgentTranscriptViewProps {\n conversation: AgentConversationVM;\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 labels: {\n toolCallsLabel: (count: number) => string;\n thinkingLabel: string;\n processing: string;\n turnSummary: string;\n rawTimelineJson?: string;\n userMessageLocator?: string;\n };\n}\n\ninterface AgentMessageLocatorItem {\n hasAgentResponse: boolean;\n key: string;\n rowKey: string;\n turnGroupIndex: number;\n rowIndex: number;\n summary: string;\n}\n\ninterface AgentMessageLocatorVisibleFrame {\n heightPx: number;\n topOffsetPx: number;\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 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.cwd === next.sourceDetail.cwd &&\n transcriptTurnIdentityEquals(\n previous.sourceDetail.turns,\n next.sourceDetail.turns\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.previewMode === next.previewMode &&\n previous.showRawTimelineJson === next.showRawTimelineJson &&\n transcriptLabelsEqual(previous.labels, next.labels)\n );\n}\n\nexport const AgentTranscriptView = memo(function AgentTranscriptView({\n conversation,\n onLinkAction,\n onAuthLogin,\n availableSkills,\n workspaceAppIcons,\n previewMode = false,\n showRawTimelineJson = false,\n labels\n}: AgentTranscriptViewProps): JSX.Element {\n \"use memo\";\n const [expandedToolRows, setExpandedToolRows] = useState<\n Record<string, boolean>\n >({});\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 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 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 });\n const handleLocateUserMessage = useCallback(\n (item: AgentMessageLocatorItem) => {\n const scrollParent = virtualizerHostRef.current?.parentElement ?? 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 setVirtualScrollElement(null);\n return;\n }\n setVirtualScrollElement(virtualizerHostRef.current?.parentElement ?? null);\n }, [shouldVirtualize]);\n\n const renderRow = (\n row: AgentConversationVM[\"rows\"][number],\n rowIndex: number\n ): JSX.Element => {\n const rowKey = rowKeys[rowIndex] ?? transcriptRowKey(row);\n const showTurnDivider = dividerRowIndexes.has(rowIndex);\n const shouldAnimateEnter =\n row.kind !== \"processing\" && enteringRowKeys.has(rowKey);\n\n return (\n <Fragment key={rowKey}>\n {showTurnDivider ? (\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 <div\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-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 toolGroupExpanded={\n row.kind === \"tool-group\"\n ? expandedToolRows[rowKey] === true\n : undefined\n }\n toolGroupExpansionKey={\n row.kind === \"tool-group\" ? rowKey : undefined\n }\n onToolGroupExpandedChange={handleToolGroupExpandedChange}\n />\n </div>\n </Fragment>\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 />\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: `${AGENT_TRANSCRIPT_TURN_GAP_PX}px`,\n transform: `translateY(${virtualTurn.start}px)`\n }}\n >\n {group.rows.map(({ row, rowIndex }) =>\n renderRow(row, rowIndex)\n )}\n </div>\n );\n })}\n </div>\n </>\n );\n }\n\n return (\n <>\n <AgentMessageLocatorRail\n items={userMessageLocatorItems}\n label={labels.userMessageLocator}\n onLocate={handleLocateUserMessage}\n />\n {conversation.rows.map(renderRow)}\n </>\n );\n}, areAgentTranscriptViewPropsEqual);\n\nfunction AgentMessageLocatorRail({\n items,\n label,\n onLocate\n}: {\n items: readonly AgentMessageLocatorItem[];\n label?: string;\n onLocate: (item: AgentMessageLocatorItem) => void;\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 useEffect(() => {\n if (isPanelOpen) {\n setShouldRenderPanel(true);\n return;\n }\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 setSelectedKey(null);\n }\n }, [items, selectedKey]);\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 = selectMessageLocatorItemAtViewportCenter(\n scrollParent,\n items\n );\n if (nextSelectedKey) {\n setSelectedKey(nextSelectedKey);\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]);\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 =\n viewport.clientHeight ||\n Math.min(railHeight, visibleFrame?.heightPx ?? railHeight);\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 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 index * AGENT_MESSAGE_LOCATOR_ITEM_SPACING_PX +\n AGENT_MESSAGE_LOCATOR_HIT_SIZE_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-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\nfunction 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 const distance = Math.abs(targetScrollTop - scrollParent.scrollTop);\n if (distance <= AGENT_MESSAGE_LOCATOR_NATIVE_SMOOTH_MAX_DISTANCE_PX) {\n row.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n return;\n }\n\n animateMessageLocatorScroll(scrollParent, targetScrollTop, distance);\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 distance: 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 durationMs = Math.max(\n AGENT_MESSAGE_LOCATOR_FAST_SCROLL_MIN_DURATION_MS,\n distance / AGENT_MESSAGE_LOCATOR_FAST_SCROLL_SPEED_PX_PER_MS\n );\n const startedAt = performance.now();\n\n const step = (now: number): void => {\n const progress = Math.min(1, (now - startedAt) / durationMs);\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\nfunction 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 useEnteringTranscriptRows(rowKeys: string[]): 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\nfunction transcriptRowKey(row: AgentConversationVM[\"rows\"][number]): string {\n if (row.kind === \"tool-group\") {\n return row.expansionKey ?? row.id;\n }\n return row.id;\n}\n\nfunction 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 = row.turnId ?? null;\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 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\nfunction 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\nfunction 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 || 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\nfunction 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\nfunction normalizeLocatorSummary(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction escapeCssString(value: string): string {\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction 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 !previousTurnIds.has(currentTurnId)\n ) {\n dividerRowIndexes.add(rowIndex);\n }\n\n previousTurnIds.add(currentTurnId);\n });\n\n return dividerRowIndexes;\n}\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 { 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 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 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 \"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 />\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 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 {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n type ReactNode\n} from \"react\";\nimport { ChevronRight, LoaderCircle } from \"lucide-react\";\nimport { CheckIcon, CopyIcon } from \"@tutti-os/ui-system/icons\";\nimport { Button } from \"../../../app/renderer/components/ui/button\";\nimport { formatAgentMessageTimestamp } from \"../../../app/renderer/shell/utils/format\";\nimport { AgentPlanCard } from \"./AgentPlanCard\";\nimport { translate } from \"../../../i18n/index\";\nimport { useOptionalAgentHostApi } from \"../../../agentActivityHost\";\nimport { getOptionalAgentActivityRuntime } from \"../../../agentActivityRuntime\";\nimport { ZoomableImage } from \"../../../app/renderer/components/ZoomableImage\";\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 { workspaceAgentProviderLabel } from \"../../workspaceAgentProviderLabel\";\nimport { openAgentEnvPanel } from \"../../agentEnv/agentEnvPanelStore\";\nimport {\n classifyFailedAgentMessage,\n resolveAgentErrorPresentation\n} from \"../../agentEnv/agentErrorPresentation\";\nimport type { AgentGUIProviderSkillOption } from \"../../../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport type {\n AgentMessageContentVM,\n AgentMessageImageVM,\n AgentMessageRowVM\n} from \"../contracts/agentMessageRowVM\";\nimport { CollapsibleReveal } from \"./CollapsibleReveal\";\nimport { AgentThinkingDisclosure } from \"./AgentThinkingDisclosure\";\nimport { RawTimelineJsonDisclosure } from \"./RawTimelineJsonDisclosure\";\nimport styles from \"../../../agent-gui/agentGuiNode/AgentGUIConversation.styles\";\nimport { CanvasNodeGhostIconButton } from \"../../../contexts/workspace/presentation/renderer/components/shared/CanvasNodeGhostIconButton\";\n\nconst MESSAGE_COPY_FEEDBACK_MS = 1400;\nconst CONTEXT_COMPACTION_NOTICE_TITLE = \"Context compacted.\";\nconst CONTEXT_COMPACTION_IN_PROGRESS_TITLE = \"Compacting context.\";\nconst CONTEXT_COMPACTION_INTERRUPTED_TITLE = \"Context compaction interrupted.\";\nconst TRANSPORT_RETRY_PROGRESS_PATTERN =\n /\\b(reconnect(?:ing)?(?:\\s*(?:\\.\\.\\.|…|[.。]+|:|-))?\\s*\\(?\\d+\\s*\\/\\s*\\d+\\)?)/i;\nconst SYSTEM_NOTICE_WARNING_CLASS_NAME =\n \"border-[color-mix(in_srgb,var(--state-warning)_14%,transparent)] bg-[color-mix(in_srgb,var(--background-fronted)_100%,var(--state-warning)_6%)]\";\nconst SYSTEM_NOTICE_ERROR_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}\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}: 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 return (\n <div\n className={isUser ? styles.userMessageFlow : styles.assistantMessageFlow}\n >\n {thinkingContent}\n {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 failed message that the provider\n // reported as plain text (e.g. a dropped-login 401), so it still gets the\n // wizard call-to-action instead of a dead red message.\n const recoveredError =\n !isUser && !message.visibleError && message.statusKind === \"failed\"\n ? recoverVisibleErrorFromFailedMessage(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 />\n ) : recoveredError ? (\n <AgentVisibleErrorMessage\n message={recoveredError}\n onAuthLogin={onAuthLogin}\n />\n ) : message.systemNotice ? (\n <AgentSystemNoticeMessage message={message} />\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 deferLongContentRender\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 </div>\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\n return (\n <div className={styles.messageGroup} data-agent-message-speaker={speaker}>\n {children}\n {timestamp || copyText ? (\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 AgentUserImageGrid({\n message\n}: {\n message: AgentMessageContentVM;\n}): JSX.Element {\n \"use memo\";\n const images = message.images ?? [];\n const { loadingIds, sources: loadedImages } =\n 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 = loadedImages.get(image.id) ?? imageDataUrl(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 = getOptionalAgentActivityRuntime();\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 !imageDataUrl(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) {\n continue;\n }\n setLoadingIds((current) => {\n if (current.has(image.id)) {\n return current;\n }\n const next = new Set(current);\n next.add(image.id);\n return next;\n });\n void readImage\n .then((attachment) => {\n if (canceled) {\n return;\n }\n setSources((current) => {\n if (current.has(image.id)) {\n return current;\n }\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) {\n return;\n }\n setLoadingIds((current) => {\n if (!current.has(image.id)) {\n return current;\n }\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) {\n return null;\n }\n return data.startsWith(\"data:\") ? data : `data:${mimeType};base64,${data}`;\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, title)) {\n return (\n <ContextCompactionProgressDivider\n startedAtUnixMs={message.occurredAtUnixMs}\n />\n );\n }\n if (isContextCompactionNotice(message, title)) {\n return (\n <ContextCompactionDivider\n text={translate(\"agentHost.agentGui.contextCompactionCompleted\")}\n />\n );\n }\n if (isContextCompactionInterruptedNotice(message, title)) {\n return (\n <ContextCompactionDivider\n text={translate(\"agentHost.agentGui.contextCompactionInterrupted\")}\n />\n );\n }\n const isStatusNotice = systemNoticeIsStatus(message);\n const noticeToneClassName = systemNoticeToneClassName(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)] ${noticeToneClassName}`}\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 systemNoticeToneClassName(message: AgentMessageContentVM): string {\n const notice = message.systemNotice;\n if (\n notice?.severity === \"error\" ||\n notice?.noticeKind === \"transport_fallback\" ||\n isTransportFallbackNotice(message)\n ) {\n return SYSTEM_NOTICE_ERROR_CLASS_NAME;\n }\n if (notice?.severity === \"warning\") {\n return SYSTEM_NOTICE_WARNING_CLASS_NAME;\n }\n return SYSTEM_NOTICE_WARNING_CLASS_NAME;\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(\n message: AgentMessageContentVM,\n title: string\n): boolean {\n const notice = message.systemNotice;\n return (\n notice?.noticeKind === \"system_notice\" &&\n (notice.detail?.trim() ?? \"\") === \"\" &&\n title.trim() === CONTEXT_COMPACTION_NOTICE_TITLE\n );\n}\n\nfunction isContextCompactionProgressNotice(\n message: AgentMessageContentVM,\n title: string\n): boolean {\n const notice = message.systemNotice;\n return (\n notice?.noticeKind === \"system_notice\" &&\n (notice.detail?.trim() ?? \"\") === \"\" &&\n title.trim() === CONTEXT_COMPACTION_IN_PROGRESS_TITLE\n );\n}\n\nfunction isContextCompactionInterruptedNotice(\n message: AgentMessageContentVM,\n title: string\n): boolean {\n const notice = message.systemNotice;\n return (\n notice?.noticeKind === \"system_notice\" &&\n (notice.detail?.trim() ?? \"\") === \"\" &&\n title.trim() === CONTEXT_COMPACTION_INTERRUPTED_TITLE\n );\n}\n\nfunction ContextCompactionDivider({ text }: { text: string }): JSX.Element {\n \"use memo\";\n return (\n <div\n role=\"status\"\n className=\"box-border flex w-full min-w-0 items-center gap-3 py-2 text-[12px] leading-4 text-[var(--text-secondary)]\"\n >\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 );\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 useElapsedSeconds(startUnixMs: number | null): number | null {\n const [nowUnixMs, setNowUnixMs] = useState(() => Date.now());\n useEffect(() => {\n if (startUnixMs === null) {\n return;\n }\n const timer = setInterval(() => setNowUnixMs(Date.now()), 1000);\n return () => clearInterval(timer);\n }, [startUnixMs]);\n if (startUnixMs === null) {\n return null;\n }\n return Math.max(0, Math.floor((nowUnixMs - startUnixMs) / 1000));\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 deferLongContentRender\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 \"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\n// Builds a synthetic visibleError from a plain failed message whose text is a\n// recognizable env failure, so it renders as the structured remediation card.\nfunction recoverVisibleErrorFromFailedMessage(\n message: AgentMessageContentVM,\n provider: string | null | undefined\n): AgentMessageContentVM | null {\n const code = classifyFailedAgentMessage(message.body);\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\nfunction AgentVisibleErrorMessage({\n message\n}: {\n message: AgentMessageContentVM;\n onAuthLogin?: (provider?: string | null) => void;\n}): JSX.Element {\n \"use memo\";\n const error = message.visibleError;\n const detail = error?.detail?.trim() ?? \"\";\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(error?.code);\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 hint = visibleErrorHint(message);\n return (\n <section\n role=\"alert\"\n className=\"box-border w-full min-w-0 rounded-[8px] border border-[var(--on-danger-hover)] bg-[var(--on-danger)] p-3 text-[13px] leading-5 text-[var(--state-danger)]\"\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 {detail ? (\n <AgentMessageDetailsDisclosure\n detail={detail}\n className=\"mt-1\"\n label={translate(\"agentHost.agentGui.visibleErrorRawDetails\")}\n />\n ) : null}\n </div>\n {focus && actionKey ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-0.5 shrink-0\"\n onClick={() =>\n openAgentEnvPanel({\n provider: error?.provider ?? \"codex\",\n focus\n })\n }\n >\n {translate(actionKey)}\n </Button>\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction 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\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 (\n message.body ||\n translate(\"agentHost.agentGui.visibleErrorRequestFailed\", { 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 * 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 {\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 {\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 provider === \"claude-code\"\n ? \"claude\"\n : provider === \"nexight\"\n ? \"nexight\"\n : provider === \"opencode\"\n ? \"opencode\"\n : provider === \"gemini\"\n ? \"gemini\"\n : provider === \"openclaw\"\n ? \"openclaw\"\n : provider === \"hermes\"\n ? \"hermes\"\n : \"codex\";\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)] shadow-sm 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 { useEffect, type JSX } from \"react\";\nimport type { JSONContent } from \"@tiptap/core\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport { cn } from \"../app/renderer/lib/utils\";\nimport { plainTextToAgentRichTextDoc } from \"../agent-gui/agentGuiNode/agentRichText/agentRichTextDocument\";\nimport { AGENT_RICH_TEXT_CARET_ANCHOR } from \"../agent-gui/agentGuiNode/agentRichText/agentRichTextCaretAnchor\";\nimport { createAgentRichTextReadonlyExtensions } from \"../agent-gui/agentGuiNode/agentRichText/agentRichTextExtensions\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"./AgentMessageMarkdown\";\nimport type { AgentGUIProviderSkillOption } from \"../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport {\n resolveAgentTargetPresentation,\n useAgentTargetPresentations,\n type AgentMessageMarkdownAgentTarget\n} from \"./AgentTargetPresentationContext\";\n\nconst EMPTY_WORKSPACE_APP_ICONS: readonly AgentMessageMarkdownWorkspaceAppIcon[] =\n [];\n\ninterface AgentRichTextReadonlyProps {\n value: string;\n className?: string;\n editorClassName?: string;\n onLinkClick?: (href: string) => void;\n availableSkills?: readonly AgentGUIProviderSkillOption[];\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n agentTargets?: readonly AgentMessageMarkdownAgentTarget[];\n}\n\nexport function AgentRichTextReadonly({\n value,\n className,\n editorClassName,\n onLinkClick,\n availableSkills = [],\n workspaceAppIcons = EMPTY_WORKSPACE_APP_ICONS,\n agentTargets\n}: AgentRichTextReadonlyProps): JSX.Element {\n \"use memo\";\n const contextAgentTargets = useAgentTargetPresentations();\n const effectiveAgentTargets = agentTargets ?? contextAgentTargets;\n const contentDoc = plainTextToAgentRichTextDocWithMentionPresentations(\n value,\n availableSkills,\n workspaceAppIcons,\n effectiveAgentTargets\n );\n const isMentionOnly = isMentionOnlyRichTextDoc(contentDoc);\n const editor = useEditor({\n immediatelyRender: false,\n editable: false,\n extensions: createAgentRichTextReadonlyExtensions({\n skills: availableSkills\n }),\n content: contentDoc,\n editorProps: {\n attributes: {\n class: cn(\n editorClassName,\n \"max-w-full overflow-x-hidden overflow-y-auto whitespace-pre-wrap break-words [overflow-wrap:anywhere] [&_p]:m-0 [&_p]:min-h-[1.45em] [&_a[data-agent-file-mention=true]]:cursor-pointer [&_[data-agent-file-mention=true]]:overflow-hidden\"\n )\n },\n handleDOMEvents: {\n click: (_view, event) => {\n if (!onLinkClick || !(event.target instanceof Element)) {\n return false;\n }\n const mention = event.target.closest(\n '[data-agent-file-mention=\"true\"]'\n );\n if (!(mention instanceof HTMLElement)) {\n return false;\n }\n const href =\n mention instanceof HTMLAnchorElement\n ? mention.getAttribute(\"href\") || \"\"\n : mention.getAttribute(\"data-agent-mention-href\") || \"\";\n if (!href) {\n return false;\n }\n event.preventDefault();\n event.stopPropagation();\n onLinkClick(href);\n return true;\n }\n }\n }\n });\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) {\n return;\n }\n const nextDoc = plainTextToAgentRichTextDocWithMentionPresentations(\n value,\n availableSkills,\n workspaceAppIcons,\n effectiveAgentTargets\n );\n if (JSON.stringify(editor.getJSON()) === JSON.stringify(nextDoc)) {\n return;\n }\n editor.commands.setContent(nextDoc, { emitUpdate: false });\n }, [\n availableSkills,\n effectiveAgentTargets,\n editor,\n value,\n workspaceAppIcons\n ]);\n\n if (!editor) {\n return (\n <div\n className={className}\n data-agent-mention-only={isMentionOnly ? \"true\" : undefined}\n />\n );\n }\n\n return (\n <div\n className={className}\n data-agent-mention-only={isMentionOnly ? \"true\" : undefined}\n >\n <EditorContent editor={editor} />\n </div>\n );\n}\n\nfunction isMentionOnlyRichTextDoc(doc: JSONContent): boolean {\n if (doc.type !== \"doc\") {\n return false;\n }\n const blocks = doc.content ?? [];\n if (blocks.length !== 1) {\n return false;\n }\n const paragraph = blocks[0];\n if (paragraph?.type !== \"paragraph\") {\n return false;\n }\n const inlineContent = (paragraph.content ?? []).filter(\n (node) =>\n !(\n node.type === \"text\" &&\n (node.text ?? \"\").replaceAll(AGENT_RICH_TEXT_CARET_ANCHOR, \"\")\n .length === 0\n )\n );\n return (\n inlineContent.length === 1 && inlineContent[0]?.type === \"agentFileMention\"\n );\n}\n\nfunction plainTextToAgentRichTextDocWithMentionPresentations(\n value: string,\n availableSkills: readonly AgentGUIProviderSkillOption[],\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[],\n agentTargets: readonly AgentMessageMarkdownAgentTarget[]\n): JSONContent {\n let doc = plainTextToAgentRichTextDoc(value, { skills: availableSkills });\n if (workspaceAppIcons.length > 0) {\n doc = hydrateWorkspaceAppMentionIcons(doc, workspaceAppIcons);\n }\n if (agentTargets.length > 0) {\n doc = hydrateAgentTargetMentionPresentations(doc, agentTargets);\n }\n return doc;\n}\n\nfunction hydrateWorkspaceAppMentionIcons(\n node: JSONContent,\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[]\n): JSONContent {\n const nextContent = node.content?.map((child) =>\n hydrateWorkspaceAppMentionIcons(child, workspaceAppIcons)\n );\n if (node.type !== \"agentFileMention\") {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const attrs = node.attrs ?? {};\n const kind = typeof attrs.kind === \"string\" ? attrs.kind : \"\";\n const isWorkspaceAppMention = kind === \"workspace-app\";\n const isAppWorkspaceReferenceMention =\n kind === \"workspace-reference\" && attrs.source === \"app\";\n if (!isWorkspaceAppMention && !isAppWorkspaceReferenceMention) {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const workspaceId =\n typeof attrs.workspaceId === \"string\" ? attrs.workspaceId.trim() : \"\";\n const appId =\n isWorkspaceAppMention && typeof attrs.appId === \"string\"\n ? attrs.appId.trim()\n : typeof attrs.targetId === \"string\"\n ? attrs.targetId.trim()\n : \"\";\n const iconUrl = resolveWorkspaceAppIconUrl({\n appId,\n workspaceId,\n workspaceAppIcons\n });\n if (!iconUrl) {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n return {\n ...node,\n attrs: {\n ...node.attrs,\n iconUrl\n },\n ...(nextContent ? { content: nextContent } : {})\n };\n}\n\nfunction resolveWorkspaceAppIconUrl(input: {\n appId: string;\n workspaceId: string;\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n}): string | undefined {\n if (!input.appId) {\n return undefined;\n }\n const exactMatch = input.workspaceAppIcons.find(\n (icon) =>\n icon.appId.trim() === input.appId &&\n (icon.workspaceId?.trim() ?? \"\") === input.workspaceId &&\n icon.iconUrl?.trim()\n );\n const fallbackMatch = input.workspaceAppIcons.find(\n (icon) => icon.appId.trim() === input.appId && icon.iconUrl?.trim()\n );\n return (\n exactMatch?.iconUrl?.trim() || fallbackMatch?.iconUrl?.trim() || undefined\n );\n}\n\nfunction hydrateAgentTargetMentionPresentations(\n node: JSONContent,\n agentTargets: readonly AgentMessageMarkdownAgentTarget[]\n): JSONContent {\n const nextContent = node.content?.map((child) =>\n hydrateAgentTargetMentionPresentations(child, agentTargets)\n );\n if (node.type !== \"agentFileMention\") {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const attrs = node.attrs ?? {};\n if (attrs.kind !== \"agent-target\") {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const agentTargetId =\n typeof attrs.targetId === \"string\" ? attrs.targetId.trim() : \"\";\n const workspaceId =\n typeof attrs.workspaceId === \"string\" ? attrs.workspaceId.trim() : \"\";\n const target = resolveAgentTargetPresentation({\n agentTargetId,\n agentTargets,\n workspaceId\n });\n if (!target) {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n return {\n ...node,\n attrs: {\n ...node.attrs,\n agentProviderId: target.provider?.trim() ?? \"\",\n iconUrl: target.iconUrl?.trim() ?? \"\",\n name: target.name?.trim() || attrs.name\n },\n ...(nextContent ? { content: nextContent } : {})\n };\n}\n","import { mergeAttributes, Node } from \"@tiptap/core\";\nimport type { AgentGUIProviderSkillOption } from \"../model/agentGuiNodeTypes\";\nimport {\n labelForProviderSkill,\n skillTriggerForPrefix\n} from \"../model/agentSkillOptions\";\n\nexport interface AgentSkillTokenAttrs {\n label: string;\n name: string;\n trigger: string;\n}\n\nexport interface AgentSkillTokenMatch {\n attrs: AgentSkillTokenAttrs;\n end: number;\n}\n\nexport interface AgentSkillTokenExtensionOptions {\n skills?: readonly AgentGUIProviderSkillOption[];\n}\n\nexport function createAgentSkillTokenExtension(\n options: AgentSkillTokenExtensionOptions = {}\n): Node {\n return Node.create({\n name: \"agentSkillToken\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addOptions() {\n return options;\n },\n\n addAttributes() {\n return {\n label: { default: \"\" },\n name: { default: \"\" },\n trigger: { default: \"\" }\n };\n },\n\n parseHTML() {\n return [{ tag: \"span[data-agent-skill-token]\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = attrsToSkillTokenAttrs(HTMLAttributes);\n const displayLabel = skillTokenDisplayLabel(attrs);\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"aria-label\": attrs.label,\n contenteditable: \"false\",\n \"data-agent-skill-token\": \"true\",\n \"data-agent-skill-trigger\": attrs.trigger,\n \"data-agent-mention-kind\": \"skill\",\n class: \"tsh-agent-object-token tsh-agent-object-token--entity\"\n }),\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\"span\", { class: \"tsh-agent-object-token__main\" }, displayLabel]\n ];\n },\n\n renderText({ node }) {\n return attrsToSkillTokenAttrs(node.attrs ?? {}).trigger;\n }\n });\n}\n\nexport function parseAgentSkillToken(\n text: string,\n start: number,\n skills: readonly AgentGUIProviderSkillOption[] = []\n): AgentSkillTokenMatch | null {\n if (!isSkillTokenBoundary(text[start - 1] ?? \"\")) {\n return null;\n }\n for (const candidate of skillTokenCandidates(skills)) {\n if (!text.startsWith(candidate.trigger, start)) {\n continue;\n }\n const end = start + candidate.trigger.length;\n if (!isSkillTokenBoundary(text[end] ?? \"\")) {\n continue;\n }\n return {\n attrs: candidate,\n end\n };\n }\n return null;\n}\n\nfunction skillTokenCandidates(\n skills: readonly AgentGUIProviderSkillOption[]\n): AgentSkillTokenAttrs[] {\n const candidates = new Map<string, AgentSkillTokenAttrs>();\n for (const skill of skills) {\n for (const prefix of [\"$\", \"/\"] as const) {\n const trigger = skillTriggerForPrefix(skill, prefix);\n if (!trigger || candidates.has(trigger)) {\n continue;\n }\n candidates.set(trigger, {\n label: labelForProviderSkill(skill, prefix),\n name: skill.name.trim(),\n trigger\n });\n }\n }\n return [...candidates.values()].sort(\n (left, right) => right.trigger.length - left.trigger.length\n );\n}\n\nfunction isSkillTokenBoundary(value: string): boolean {\n return value === \"\" || value === \" \" || value === \"\\n\" || value === \"\\t\";\n}\n\nfunction attrsToSkillTokenAttrs(\n attrs: Record<string, unknown>\n): AgentSkillTokenAttrs {\n return {\n label: typeof attrs.label === \"string\" ? attrs.label : \"\",\n name: typeof attrs.name === \"string\" ? attrs.name : \"\",\n trigger: typeof attrs.trigger === \"string\" ? attrs.trigger : \"\"\n };\n}\n\nfunction skillTokenDisplayLabel(attrs: AgentSkillTokenAttrs): string {\n const label = attrs.label.trim() || attrs.trigger.trim();\n if (!label || label.startsWith(\"/\") || label.startsWith(\"$\")) {\n return label;\n }\n return `/${label}`;\n}\n","import type { AgentGUIProviderSkillOption } from \"./agentGuiNodeTypes\";\n\nexport function skillTriggerForPrefix(\n skill: AgentGUIProviderSkillOption,\n prefix: \"$\" | \"/\" | undefined\n): string {\n const trigger = skill.trigger.trim();\n if (!trigger) {\n return \"\";\n }\n if (prefix === undefined || trigger.startsWith(prefix)) {\n return trigger;\n }\n if (trigger.startsWith(\"$\") || trigger.startsWith(\"/\")) {\n return `${prefix}${trigger.slice(1)}`;\n }\n return `${prefix}${trigger}`;\n}\n\nexport function labelForProviderSkill(\n skill: AgentGUIProviderSkillOption,\n prefix: \"$\" | \"/\" | undefined\n): string {\n return stripSkillTriggerPrefix(skillTriggerForPrefix(skill, prefix));\n}\n\nexport function promptForProviderSkills(input: {\n prompt: string;\n provider: string;\n skills: readonly AgentGUIProviderSkillOption[];\n}): string {\n const nativePrefix = input.provider.trim() === \"codex\" ? \"$\" : \"/\";\n let prompt = input.prompt;\n for (const skill of input.skills) {\n const nativeTrigger = skillTriggerForPrefix(skill, nativePrefix);\n const aliasPrefix = nativePrefix === \"$\" ? \"/\" : \"$\";\n const aliasTrigger = skillTriggerForPrefix(skill, aliasPrefix);\n if (!nativeTrigger || !aliasTrigger || nativeTrigger === aliasTrigger) {\n continue;\n }\n prompt = replaceSkillTriggerToken(prompt, aliasTrigger, nativeTrigger);\n }\n return prompt;\n}\n\nexport function skillDescriptionForDisplay(\n description: string | undefined\n): string | undefined {\n const line = description\n ?.split(/\\r?\\n/)\n .map((part) => part.trim())\n .find((part) => part !== \"\");\n return line || undefined;\n}\n\nfunction replaceSkillTriggerToken(\n prompt: string,\n from: string,\n to: string\n): string {\n return prompt.replace(\n new RegExp(`(^|\\\\s)${escapeRegExp(from)}(?=$|\\\\s)`, \"g\"),\n (_match, separator: string) => `${separator}${to}`\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction stripSkillTriggerPrefix(trigger: string): string {\n if (trigger.startsWith(\"$\") || trigger.startsWith(\"/\")) {\n return trigger.slice(1);\n }\n return trigger;\n}\n","import { mergeAttributes, Node } from \"@tiptap/core\";\n\nexport interface AgentCapabilityTokenOption {\n capability: string;\n label: string;\n name: string;\n trigger: string;\n}\n\nexport interface AgentCapabilityTokenAttrs {\n capability: string;\n label: string;\n name: string;\n trigger: string;\n}\n\nexport interface AgentCapabilityTokenMatch {\n attrs: AgentCapabilityTokenAttrs;\n end: number;\n}\n\nexport interface AgentCapabilityTokenExtensionOptions {\n capabilities?: readonly AgentCapabilityTokenOption[];\n}\n\nexport function createAgentCapabilityTokenExtension(\n options: AgentCapabilityTokenExtensionOptions = {}\n): Node {\n return Node.create({\n name: \"agentCapabilityToken\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addOptions() {\n return options;\n },\n\n addAttributes() {\n return {\n capability: { default: \"\" },\n label: { default: \"\" },\n name: { default: \"\" },\n trigger: { default: \"\" }\n };\n },\n\n parseHTML() {\n return [{ tag: \"span[data-agent-capability-token]\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = attrsToCapabilityTokenAttrs(HTMLAttributes);\n const displayLabel = capabilityTokenDisplayLabel(attrs);\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"aria-label\": attrs.label,\n contenteditable: \"false\",\n \"data-agent-capability-token\": \"true\",\n \"data-agent-capability-trigger\": attrs.trigger,\n \"data-agent-mention-kind\": \"capability\",\n class: \"tsh-agent-object-token tsh-agent-object-token--entity\"\n }),\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\"span\", { class: \"tsh-agent-object-token__main\" }, displayLabel]\n ];\n },\n\n renderText({ node }) {\n return attrsToCapabilityTokenAttrs(node.attrs ?? {}).trigger;\n }\n });\n}\n\nexport function parseAgentCapabilityToken(\n text: string,\n start: number,\n capabilities: readonly AgentCapabilityTokenOption[] = []\n): AgentCapabilityTokenMatch | null {\n if (!isCapabilityTokenBoundary(text[start - 1] ?? \"\")) {\n return null;\n }\n for (const candidate of capabilityTokenCandidates(capabilities)) {\n if (!text.startsWith(candidate.trigger, start)) {\n continue;\n }\n const end = start + candidate.trigger.length;\n if (!isCapabilityTokenBoundary(text[end] ?? \"\")) {\n continue;\n }\n return {\n attrs: candidate,\n end\n };\n }\n return null;\n}\n\nfunction capabilityTokenCandidates(\n capabilities: readonly AgentCapabilityTokenOption[]\n): AgentCapabilityTokenAttrs[] {\n const candidates = new Map<string, AgentCapabilityTokenAttrs>();\n for (const capability of capabilities) {\n const trigger = capability.trigger.trim();\n if (!trigger || candidates.has(trigger)) {\n continue;\n }\n candidates.set(trigger, {\n capability: capability.capability.trim(),\n label: capability.label.trim(),\n name: capability.name.trim(),\n trigger\n });\n }\n return [...candidates.values()].sort(\n (left, right) => right.trigger.length - left.trigger.length\n );\n}\n\nfunction isCapabilityTokenBoundary(value: string): boolean {\n return value === \"\" || value === \" \" || value === \"\\n\" || value === \"\\t\";\n}\n\nfunction attrsToCapabilityTokenAttrs(\n attrs: Record<string, unknown>\n): AgentCapabilityTokenAttrs {\n return {\n capability: typeof attrs.capability === \"string\" ? attrs.capability : \"\",\n label: typeof attrs.label === \"string\" ? attrs.label : \"\",\n name: typeof attrs.name === \"string\" ? attrs.name : \"\",\n trigger: typeof attrs.trigger === \"string\" ? attrs.trigger : \"\"\n };\n}\n\nfunction capabilityTokenDisplayLabel(attrs: AgentCapabilityTokenAttrs): string {\n const label = attrs.label.trim() || attrs.trigger.trim();\n if (!label || label.startsWith(\"/\") || label.startsWith(\"$\")) {\n return label;\n }\n return `/${label}`;\n}\n","import type { Editor, JSONContent } from \"@tiptap/core\";\nimport {\n attrsToMentionItem,\n formatAgentMentionMarkdown,\n mentionItemToAttrs,\n parseAgentMentionMarkdown\n} from \"./agentFileMentionExtension\";\nimport type { AgentGUIProviderSkillOption } from \"../model/agentGuiNodeTypes\";\nimport { parseAgentSkillToken } from \"./agentSkillTokenExtension\";\nimport {\n parseAgentCapabilityToken,\n type AgentCapabilityTokenOption\n} from \"./agentCapabilityTokenExtension\";\nimport { AGENT_RICH_TEXT_CARET_ANCHOR } from \"./agentRichTextCaretAnchor\";\n\nexport interface AgentRichTextDocumentOptions {\n capabilities?: readonly AgentCapabilityTokenOption[];\n skills?: readonly AgentGUIProviderSkillOption[];\n}\n\nfunction createEmptyDocument(): JSONContent {\n return {\n type: \"doc\",\n content: [{ type: \"paragraph\" }]\n };\n}\n\nfunction isVisualLineStart(content: readonly JSONContent[]): boolean {\n return content.length === 0 || content.at(-1)?.type === \"hardBreak\";\n}\n\nfunction createParagraphFromText(\n text: string,\n options: AgentRichTextDocumentOptions = {}\n): JSONContent {\n const content: JSONContent[] = [];\n let index = 0;\n let textBuffer = \"\";\n\n const flushTextBuffer = (): void => {\n if (textBuffer.length === 0) {\n return;\n }\n content.push({ type: \"text\", text: textBuffer });\n textBuffer = \"\";\n };\n\n while (index < text.length) {\n const current = text[index];\n if (current === \"\\n\") {\n flushTextBuffer();\n content.push({ type: \"hardBreak\" });\n index += 1;\n continue;\n }\n\n const parsedMention = parseAgentMentionMarkdown(text, index);\n if (parsedMention) {\n flushTextBuffer();\n if (isVisualLineStart(content)) {\n content.push({ type: \"text\", text: AGENT_RICH_TEXT_CARET_ANCHOR });\n }\n content.push({\n type: \"agentFileMention\",\n // 转成规范 node attrs(如 workspace-reference 的 source/groupId/fileCount),\n // 否则只读回显里的 reference chip 拿不到文件数 → 不显示「N 个文件」角标。\n attrs: mentionItemToAttrs(parsedMention.item)\n });\n index = parsedMention.end;\n continue;\n }\n\n const parsedCapabilityToken = parseAgentCapabilityToken(\n text,\n index,\n options.capabilities\n );\n if (parsedCapabilityToken) {\n flushTextBuffer();\n content.push({\n type: \"agentCapabilityToken\",\n attrs: parsedCapabilityToken.attrs\n });\n index = parsedCapabilityToken.end;\n continue;\n }\n\n const parsedSkillToken = parseAgentSkillToken(text, index, options.skills);\n if (parsedSkillToken) {\n flushTextBuffer();\n content.push({\n type: \"agentSkillToken\",\n attrs: parsedSkillToken.attrs\n });\n index = parsedSkillToken.end;\n continue;\n }\n\n textBuffer += current;\n index += 1;\n }\n\n flushTextBuffer();\n return content.length > 0\n ? { type: \"paragraph\", content }\n : { type: \"paragraph\" };\n}\n\nexport function plainTextToAgentRichTextDoc(\n text: string,\n options: AgentRichTextDocumentOptions = {}\n): JSONContent {\n if (text.length === 0) {\n return createEmptyDocument();\n }\n const normalized = text.replace(/\\r\\n?/g, \"\\n\");\n return {\n type: \"doc\",\n content: [createParagraphFromText(normalized, options)]\n };\n}\n\nexport function plainTextToAgentRichTextInlineContent(\n text: string,\n options: AgentRichTextDocumentOptions = {}\n): JSONContent[] {\n const paragraph = createParagraphFromText(\n text.replace(/\\r\\n?/g, \"\\n\"),\n options\n );\n return paragraph.content ?? [];\n}\n\nexport function agentRichTextDocToPromptText(doc: JSONContent): string {\n if (doc.type !== \"doc\") {\n return nodeToPromptText(doc);\n }\n return agentRichTextContentToPromptText(doc.content ?? []);\n}\n\nexport function editorToPromptText(editor: Editor): string {\n return agentRichTextDocToPromptText(editor.getJSON());\n}\n\nexport function agentRichTextContentToPromptText(\n content: readonly JSONContent[]\n): string {\n if (content.length === 0) {\n return \"\";\n }\n const separator = content.some((node) => isBlockPromptNode(node)) ? \"\\n\" : \"\";\n return content.map((node) => nodeToPromptText(node)).join(separator);\n}\n\nfunction isBlockPromptNode(node: JSONContent): boolean {\n return node.type === \"doc\" || node.type === \"paragraph\";\n}\n\nfunction nodeToPromptText(node: JSONContent): string {\n if (node.type === \"text\") {\n return (node.text ?? \"\").replaceAll(AGENT_RICH_TEXT_CARET_ANCHOR, \"\");\n }\n if (node.type === \"agentFileMention\") {\n return formatAgentMentionMarkdown(attrsToMentionItem(node.attrs ?? {}));\n }\n if (node.type === \"agentSkillToken\") {\n return typeof node.attrs?.trigger === \"string\" ? node.attrs.trigger : \"\";\n }\n if (node.type === \"agentCapabilityToken\") {\n return typeof node.attrs?.trigger === \"string\" ? node.attrs.trigger : \"\";\n }\n if (node.type === \"hardBreak\") {\n return \"\\n\";\n }\n if (!node.content || node.content.length === 0) {\n return \"\";\n }\n return node.content.map((child) => nodeToPromptText(child)).join(\"\");\n}\n","import { Extension, type Extensions } from \"@tiptap/core\";\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport {\n createAgentFileMentionExtension,\n type AgentFileMentionExtensionOptions\n} from \"./agentFileMentionExtension\";\nimport {\n createAgentCapabilityTokenExtension,\n type AgentCapabilityTokenExtensionOptions\n} from \"./agentCapabilityTokenExtension\";\nimport {\n createAgentSkillTokenExtension,\n type AgentSkillTokenExtensionOptions\n} from \"./agentSkillTokenExtension\";\n\nfunction createAgentPromptStarterKit(): Extensions[0] {\n return StarterKit.configure({\n blockquote: false,\n bold: false,\n bulletList: false,\n code: false,\n codeBlock: false,\n dropcursor: false,\n gapcursor: false,\n heading: false,\n horizontalRule: false,\n italic: false,\n link: false,\n listItem: false,\n listKeymap: false,\n orderedList: false,\n strike: false,\n trailingNode: false,\n underline: false\n });\n}\n\nfunction createAgentTokenKeyboardExtension(): Extensions[0] {\n return Extension.create({\n name: \"agentTokenKeyboard\",\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n props: {\n handleKeyDown(view, event) {\n if (event.key !== \"Backspace\" && event.key !== \"ArrowLeft\") {\n return false;\n }\n const { doc, selection } = view.state;\n if (\n selection instanceof NodeSelection &&\n isSelectableAgentToken(selection.node)\n ) {\n event.preventDefault();\n if (event.key === \"ArrowLeft\") {\n view.dispatch(\n view.state.tr.setSelection(\n TextSelection.create(doc, selection.from)\n )\n );\n } else {\n view.dispatch(\n view.state.tr.delete(selection.from, selection.to)\n );\n }\n return true;\n }\n if (!selection.empty) {\n return false;\n }\n const nodeBefore = selection.$from.nodeBefore;\n if (!nodeBefore || !isSelectableAgentToken(nodeBefore)) {\n return false;\n }\n event.preventDefault();\n view.dispatch(\n view.state.tr.setSelection(\n NodeSelection.create(\n doc,\n selection.from - nodeBefore.nodeSize\n )\n )\n );\n return true;\n }\n }\n })\n ];\n }\n });\n}\n\nfunction isSelectableAgentToken(\n node: { type: { name: string }; nodeSize: number } | null\n): boolean {\n return (\n node?.type.name === \"agentSkillToken\" ||\n node?.type.name === \"agentCapabilityToken\"\n );\n}\n\nexport function createAgentRichTextInputExtensions(\n fileMentionOptions?: AgentFileMentionExtensionOptions,\n skillTokenOptions?: AgentSkillTokenExtensionOptions,\n capabilityTokenOptions?: AgentCapabilityTokenExtensionOptions\n): Extensions {\n return [\n createAgentTokenKeyboardExtension(),\n createAgentPromptStarterKit(),\n createAgentFileMentionExtension(fileMentionOptions),\n createAgentCapabilityTokenExtension(capabilityTokenOptions),\n createAgentSkillTokenExtension(skillTokenOptions)\n ];\n}\n\nexport function createAgentRichTextReadonlyExtensions(\n skillTokenOptions?: AgentSkillTokenExtensionOptions,\n capabilityTokenOptions?: AgentCapabilityTokenExtensionOptions\n): Extensions {\n return [\n createAgentPromptStarterKit(),\n createAgentFileMentionExtension({\n enableSuggestions: false,\n renderAsLink: true\n }),\n createAgentCapabilityTokenExtension(capabilityTokenOptions),\n createAgentSkillTokenExtension(skillTokenOptions)\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 preMountOnIdle?: boolean;\n}\n\nexport function CollapsibleReveal({\n expanded,\n children,\n className,\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\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 const animationFrame = requestAnimationFrame(() => {\n setMounted(true);\n });\n return () => cancelAnimationFrame(animationFrame);\n }, [expanded, mounted, 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 setVisible(false);\n setRevealHeight(\"0px\");\n const animationFrame = requestAnimationFrame(() => {\n measuredHeightRef.current =\n measuredHeightRef.current ?? root.scrollHeight;\n setVisible(true);\n setRevealHeight(`${measuredHeightRef.current}px`);\n });\n return () => cancelAnimationFrame(animationFrame);\n }\n\n if (!wasExpanded) {\n setVisible(false);\n setRevealHeight(\"0px\");\n return undefined;\n }\n\n const measuredHeight = measuredHeightRef.current ?? root.scrollHeight;\n measuredHeightRef.current = measuredHeight;\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 if (heightRef.current === \"auto\") {\n return;\n }\n const nextHeight = Math.ceil(\n entries[0]?.contentRect.height ?? inner.scrollHeight\n );\n const previousHeight = measuredHeightRef.current;\n if (!nextHeight || previousHeight === nextHeight) {\n return;\n }\n\n measuredHeightRef.current = nextHeight;\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 return;\n }\n if (!expanded && !preMountOnIdle) {\n setMounted(false);\n }\n };\n\n const rootStyle: CSSProperties = { height };\n\n return (\n <div\n ref={rootRef}\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 ref={innerRef} className=\"agent-collapsible-reveal__inner\">\n {children}\n </div>\n </div>\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 \"../../workspaceAgentActivityTypes\";\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 { 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 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 tsh-inline-scanlight-group inline-flex items-center gap-1.5\"\n >\n <span className=\"tsh-inline-scanlight-line font-semibold\">\n {processingLabel(row, label)}\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\";\nimport { hasAgentToolContent } from \"./tool-renderers/agentToolContentShared\";\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 = hasGroupDetail(row);\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 hasGroupDetail(row: AgentToolGroupRowVM): boolean {\n return row.entries.some((entry) =>\n entry.kind === \"thinking\"\n ? Boolean(entry.thinking.body.trim())\n : hasAgentToolContent(entry.call)\n );\n}\n\nfunction renderToolCountLabel(label: string): JSX.Element {\n const statusMatch = label.match(/^(.+?)(\\s+(?:已完成|completed))$/i);\n const primary = statusMatch?.[1];\n const status = statusMatch?.[2];\n if (!primary || !status) {\n return (\n <span className=\"workspace-agents-status-panel__detail-tool-count-primary\">\n {label}\n </span>\n );\n }\n\n return (\n <>\n <span className=\"workspace-agents-status-panel__detail-tool-count-primary\">\n {primary}\n </span>\n <span className=\"workspace-agents-status-panel__detail-tool-count-status\">\n {formatInlineStatusLabel(status)}\n </span>\n </>\n );\n}\n\nfunction formatInlineStatusLabel(label: string): string {\n return /^[\\sA-Z]+[a-z]+$/.test(label) ? label.toLowerCase() : label;\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 );\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 diff = firstString(stringValue(file?.diff), stringValue(file?.patch));\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, 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 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\";\nexport {\n getFileChangeRenderData,\n type AgentFileChangeRenderData\n} from \"./agentToolFileChangeRenderData\";\n\nexport type AgentCommandStatus = \"running\" | \"completed\" | \"failed\" | \"unknown\";\n\nexport interface AgentCommandRenderData {\n command: string | null;\n cwd: string | null;\n stdout: string;\n stderr: string;\n exitCode: number | null;\n durationMs: number | null;\n status: AgentCommandStatus;\n}\n\nexport interface AgentSearchRenderData {\n query: string | null;\n scope: string | null;\n mode: \"files_with_matches\" | \"content\" | \"count\" | \"list_files\" | \"unknown\";\n files: string[];\n lines: string[];\n output: string;\n error: string;\n}\n\nexport interface AgentWebSearchRenderData {\n query: string | null;\n queries: string[];\n url: string | null;\n output: string;\n error: string;\n}\n\nexport interface AgentWebFetchRenderData {\n url: string | null;\n domain: string | null;\n content: string | null;\n visibleContent: string | null;\n isTruncated: boolean;\n}\n\nexport interface AgentTodoRenderData {\n content: string;\n status: string | null;\n}\n\nexport interface AgentMcpRenderData {\n server: string | null;\n tool: string | null;\n summary: string | null;\n output: string;\n}\n\nexport interface AgentToolSearchRenderData {\n query: string | null;\n displayQuery: string | null;\n mode: \"direct\" | \"search\";\n matches: string[];\n totalDeferredTools: number | null;\n}\n\nexport interface AgentPlanModeRenderData {\n enterText: string | null;\n plan: string | null;\n filePath: string | null;\n fileName: string | null;\n}\n\nexport interface AgentTaskRenderData {\n title: string;\n status: string | null;\n durationText: string | null;\n latestStepSummary: string | null;\n prompt: string | null;\n childSessionId: string | null;\n steps: AgentTaskStepVM[];\n resultMarkdown: string | null;\n errorMarkdown: string | null;\n}\n\nexport interface AgentSkillRenderData {\n skill: string | null;\n args: string | null;\n success: boolean | null;\n statusText: string | null;\n}\n\nexport interface AgentImageGenerationRenderData {\n prompt: string | null;\n imageUri: string | null;\n mimeType: string | null;\n}\n\nexport interface AgentToolFallbackText {\n summary: string | null;\n input: string | null;\n output: string | null;\n error: string | null;\n}\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 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 \"agent-tool-diff__line grid grid-cols-[48px_minmax(0,1fr)] border-l-[2px] border-l-[var(--state-success)] 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 ? humanizeToolLabel(toolName) : `Step ${index + 1}`;\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 ToolSection,\n type AgentToolRendererProps\n} from \"./agentToolContentShared\";\n\nexport function AgentAskUserQuestionContent({\n call\n}: AgentToolRendererProps): JSX.Element | null {\n \"use memo\";\n const questions = call.askUserQuestion?.questions ?? [];\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 </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","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 { useEffect, useState, type JSX } from \"react\";\nimport { ZoomableImage } from \"../../../../app/renderer/components/ZoomableImage\";\nimport { cn } from \"../../../../app/renderer/lib/utils\";\nimport { resolveWorkspaceImageMimeType } from \"@tutti-os/workspace-file-manager/services\";\nimport { translate } from \"../../../../i18n/index\";\nimport { useOptionalAgentHostApi } from \"../../../../agentActivityHost\";\nimport { resolveImageGenerationPreviewSrc } from \"../../../imageGenerationTool\";\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 && !image.imageUri) {\n return null;\n }\n\n return (\n <div className=\"workspace-agents-status-panel__detail-tool-body\">\n {image.prompt ? (\n <ToolSection title={translate(\"agentHost.agentTool.details.input\")}>\n <ToolMarkdownBlock\n content={image.prompt}\n onLinkClick={onLinkClick}\n collapsible\n />\n </ToolSection>\n ) : null}\n {image.imageUri ? (\n <ImageGenerationPreview\n uri={image.imageUri}\n mimeType={image.mimeType}\n />\n ) : null}\n </div>\n );\n}\n\nfunction ImageGenerationPreview({\n uri,\n mimeType\n}: {\n uri: string;\n mimeType: string | null;\n}): 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 <ToolSection title={translate(\"agentHost.agentTool.details.output\")}>\n <ZoomableImage\n alt={translate(\"agentHost.agentTool.details.imagePreviewAlt\")}\n className={cn(\n \"block max-h-[360px] max-w-full rounded-[8px] border border-[var(--line-2)] bg-[var(--background-panel)] object-contain\"\n )}\n downloadName={localPath ? localPath.split(/[\\\\/]/).pop() : \"image.png\"}\n src={src}\n wrapElement=\"span\"\n />\n </ToolSection>\n );\n}\n\nfunction isLocalImagePath(path: string): boolean {\n const candidate = path.trim();\n return (\n (candidate.length > 1 &&\n candidate.startsWith(\"/\") &&\n !candidate.startsWith(\"//\") &&\n !candidate.includes(\"://\") &&\n !/\\s/.test(candidate)) ||\n /^[a-zA-Z]:[\\\\/]/.test(candidate)\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 { 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) ?? `Item ${index + 1}`}\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 { 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) ?? `Doc ${index + 1}`}\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 ? `Server: ${payload.server}` : null,\n payload.tool ? `Tool: ${payload.tool}` : 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.ownerThreadId}\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.ownerThreadId === right.ownerThreadId &&\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 );\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}: {\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 </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\nfunction useRunningSubAgentNowUnixMs(\n subAgent: AgentTaskSubAgentVM\n): number | null {\n const shouldTick =\n subAgent.status === \"running\" &&\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 : subAgent.status === \"running\" && 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 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 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(agentHostApi, failureMessage);\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 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 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 TurnSummaryFileCard({\n file,\n workspaceRoot,\n expanded,\n onLinkAction,\n onToggle\n}: {\n file: AgentTurnSummaryFileVM;\n workspaceRoot?: 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 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 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;\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 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 === \"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 { memo, type ReactNode, type JSX } from \"react\";\nimport type { WorkspaceLinkAction } from \"../../../contexts/workspace/presentation/renderer/actions/workspaceLinkActions\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"../../AgentMessageMarkdown\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport { AgentTranscriptSkeleton } from \"./AgentTranscriptSkeleton\";\nimport { AgentTranscriptView } from \"./AgentTranscriptView\";\nimport type { AgentGUIProviderSkillOption } from \"../../../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\n\ninterface AgentConversationFlowProps {\n conversation: AgentConversationVM | null;\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 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 isLoading,\n loadingLabel,\n loadingTestId,\n empty,\n onLinkAction,\n onAuthLogin,\n availableSkills,\n workspaceAppIcons,\n previewMode = false,\n showRawTimelineJson = false,\n labels\n}: AgentConversationFlowProps): JSX.Element {\n \"use memo\";\n\n if (isLoading) {\n return (\n <AgentTranscriptSkeleton label={loadingLabel} testId={loadingTestId} />\n );\n }\n\n if (!conversation || conversation.rows.length === 0) {\n return <>{empty}</>;\n }\n\n return (\n <AgentTranscriptView\n conversation={conversation}\n onLinkAction={onLinkAction}\n onAuthLogin={onAuthLogin}\n availableSkills={availableSkills}\n workspaceAppIcons={workspaceAppIcons}\n previewMode={previewMode}\n labels={labels}\n showRawTimelineJson={showRawTimelineJson}\n />\n );\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":["normalizeToolNameToken","recordValue","firstPresentString","stringRecordValue","AGENT_ACTIVITY_KINDS","stringRecordValue","recordValue","firstPresentString","normalizeToolToken","AGENT_ACTIVITY_KINDS","looksLikeOpaqueToolCallID","normalizeToolNameToken","isOpaqueIdentifierTail","content","firstPresentString","stringRecordValue","normalizeToolToken","stringValue","firstString","recordValue","compareTimelineItemsAscending","turnId","turn","itemId","firstPresentString","stringRecordValue","statusKind","entry","stringValue","normalizeToolName","objectValue","stringValue","arrayValue","normalizeToolName","stringValue","normalizeToolName","arrayValue","stringValue","objectValue","objectValue","arrayValue","isGroupableToolCall","summarizeToolCallGroup","dedupeStrings","summarizeCallTarget","isWorkingSessionStatus","objectValue","stringValue","numberValue","firstPresentString","normalizeToolName","arrayValue","isSessionWorking","mergeSourceTimelineItems","isWorkingSessionStatus","normalizeStatusToken","firstString","Fragment","memo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","memo","useCallback","Fragment","useCallback","useEffect","useState","ChevronRight","jsx","jsx","jsxs","Node","Node","mergeAttributes","Node","jsx","useCallback","useEffect","useRef","useState","jsx","animationFrame","useState","ChevronDown","forwardRef","useCallback","useEffect","useRef","jsx","jsxs","forwardRef","useRef","useCallback","useEffect","jsx","normalizeToolName","jsx","jsxs","useState","ChevronDown","useState","ChevronDown","ChevronRight","jsx","jsxs","useState","ChevronDown","ChevronRight","jsx","jsxs","forwardRef","jsx","forwardRef","CanvasNodeGhostIconButton","jsx","jsxs","useCallback","rawTimelineJson","Fragment","useState","useEffect","ChevronRight","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","firstLocationPath","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","useState","ChevronDown","ChevronRight","jsx","jsxs","stringValue","objectValue","contentText","languageForPath","jsx","jsxs","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","useMemo","useState","jsx","jsxs","useState","useMemo","jsx","stringValue","useEffect","useState","jsx","jsxs","useState","useEffect","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","formatInlineStatusLabel","useEffect","useMemo","useState","ChevronDown","ChevronRight","LoaderCircle","jsx","jsx","jsxs","useState","useMemo","useEffect","LoaderCircle","ChevronDown","ChevronRight","jsx","memo","AgentTranscriptItemView","useCallback","Fragment","jsx","jsxs","memo","AgentTranscriptView","useState","useRef","useMemo","useCallback","useLayoutEffect","useEffect","railHeight","viewportHeight","memo","Fragment","jsx","memo","AgentConversationFlow","useMemo","useRef","useRef","useMemo"]}
|