langchain_agentx_stream_ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +236 -0
- package/dist/AskUserQuestionToolBody-CyuNy_k5.d.ts +33 -0
- package/dist/MarkdownBlock-3iEW0Ubm.d.ts +100 -0
- package/dist/chunk-4RIOBLGB.js +666 -0
- package/dist/chunk-4RIOBLGB.js.map +1 -0
- package/dist/chunk-DP7V33X7.js +13 -0
- package/dist/chunk-DP7V33X7.js.map +1 -0
- package/dist/chunk-G2KYJCMM.js +5171 -0
- package/dist/chunk-G2KYJCMM.js.map +1 -0
- package/dist/chunk-MHK53ZHC.js +972 -0
- package/dist/chunk-MHK53ZHC.js.map +1 -0
- package/dist/chunk-W6QQHTJ4.js +785 -0
- package/dist/chunk-W6QQHTJ4.js.map +1 -0
- package/dist/chunk-WM6Y6APP.js +411 -0
- package/dist/chunk-WM6Y6APP.js.map +1 -0
- package/dist/default.css +1364 -0
- package/dist/index.d.ts +650 -0
- package/dist/index.js +743 -0
- package/dist/index.js.map +1 -0
- package/dist/multi-session-CviqerRl.d.ts +494 -0
- package/dist/multi-session.d.ts +7 -0
- package/dist/multi-session.js +21 -0
- package/dist/multi-session.js.map +1 -0
- package/dist/nodes-DqhaBW7M.d.ts +195 -0
- package/dist/sessionViewOptions-DLSFRQwZ.d.ts +158 -0
- package/dist/tools-presentation.d.ts +14 -0
- package/dist/tools-presentation.js +37 -0
- package/dist/tools-presentation.js.map +1 -0
- package/dist/tools.d.ts +21 -0
- package/dist/tools.js +43 -0
- package/dist/tools.js.map +1 -0
- package/dist/types-aXj5TYSP.d.ts +33 -0
- package/dist/virtual.d.ts +36 -0
- package/dist/virtual.js +19 -0
- package/dist/virtual.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/tree.ts","../src/types/events.ts","../src/core/classify.ts","../src/core/eventVisibility.ts","../src/core/subagentProgress.ts","../src/core/taskSnapshot.ts","../src/core/reducer.ts","../src/core/replay.ts","../src/core/projection/renderModel.ts","../src/view/sessionViewOptions.ts","../src/core/hooks/useReplayTree.ts","../src/core/hooks/useActiveSession.ts","../src/core/context/SessionContext.tsx","../src/core/hooks/useSessionIds.ts","../src/core/projection/bashExplore.ts","../src/core/projection/memoryPaths.ts","../src/core/projection/classify.ts","../src/core/projection/constants.ts","../src/core/projection/mountCandidates.ts","../src/core/projection/exploreSummary.ts","../src/core/projection/shellProgress.ts","../src/core/projection/accumulators/exploreCollapse.ts","../src/core/projection/agentGrouper.ts","../src/core/projection/accumulators/groupedToolUse.ts","../src/core/projection/systemSummaryText.ts","../src/core/projection/accumulators/systemSummary.ts","../src/core/projection/accumulators/thinkingRoundSummary.ts","../src/core/projection/projector.ts","../src/core/projection/responseId.ts","../src/core/projection/treeAdapter.ts","../src/core/projection/projectTimeline.ts","../src/core/hooks/useProjectedTimeline.ts","../src/core/hooks/index.ts","../src/core/hooks/usePendingPermissionForTool.ts","../src/view/hooks/useMinDisplayTime.ts","../src/view/TimelineItem.tsx","../src/view/nodes/CollapsedExploreNode.tsx","../src/view/nodes/SystemSummaryNode.tsx","../src/view/TaskList.tsx","../src/view/taskListDisplay.ts","../src/view/Spinner.tsx","../src/view/spinner/constants.ts","../src/view/spinner/SpinnerAnimationRow.tsx","../src/view/spinner/SpinnerGlimmerVerb.tsx","../src/view/spinner/spinnerTiming.ts","../src/view/spinner/useAnimationFrame.ts","../src/view/spinner/useReducedMotion.ts","../src/view/spinner/useStalledSpinnerIntensity.ts","../src/view/spinner/taskQueueDisplay.ts","../src/view/TaskListFooter.tsx","../src/view/GroupedToolCallRow.tsx","../src/view/nodes/ThinkingSummaryNode.tsx","../src/view/projectedTimelineRender.tsx","../src/view/TimelineEntries.tsx","../src/view/Timeline.tsx","../src/view/estimateNodeSize.ts","../src/view/VirtualTimeline.tsx","../src/view/SessionTimeline.tsx"],"sourcesContent":["import type { SessionNode } from './nodes';\nimport type { Task } from './tasks';\n\nexport type SessionStatus = 'connecting' | 'running' | 'done' | 'error';\n\n/** 任务列表可见性阶段(对齐 CC / 设计文档 §3.2.3) */\nexport type TaskPhase = 'hidden' | 'visible' | 'hidden-after-completion';\n\nexport interface ReducerError {\n eventIndex: number;\n eventType: string;\n message: string;\n stack?: string;\n}\n\nexport interface SessionTree {\n rootChildren: string[];\n byId: Record<string, SessionNode>;\n openSubAgentStack: string[];\n status: SessionStatus;\n meta: {\n sessionId: string | null;\n startedAt: number | null;\n lastEventId: string | null;\n };\n internalErrors: ReducerError[];\n debugEvents: { eventIndex: number; eventType: string; data: unknown }[];\n /** hook-finished / compact-* 等;供 projection system_summary,不进入主舞台 Unknown */\n systemEvents: {\n eventIndex: number;\n eventType: string;\n data: unknown;\n timestamp: number;\n }[];\n /** step:name → 下一 seq;无 tool_call_id 时分配 tool:step:name:seq */\n toolSeqCounters: Record<string, number>;\n /** step:name → 当前进行中的 tool 节点 id(result 后清除) */\n activeToolByStepName: Record<string, string>;\n /** 当前活跃的 thinking 轮次 ID */\n activeRoundId: string | null;\n /** 已完成的轮次摘要(用于回溯显示) */\n roundSummaries: RoundSummary[];\n /** 任务列表(由 task-list-snapshot 驱动) */\n tasks: Record<string, Task>;\n /** 任务列表可见阶段 */\n taskPhase: TaskPhase;\n /** 本轮是否曾显示过任务列表 */\n hasEverShownTaskList: boolean;\n /** 全部任务完成后等待最终主输出 */\n waitingForFinalResponseAfterTasks: boolean;\n /** 首个任务快照时间(毫秒) */\n taskStartTime: number | null;\n /** Hook 进度跟踪(对齐 CC stopHookSpinnerSuffix) */\n hookProgress: {\n /** 当前正在执行的 hook toolUseID */\n currentToolUseID: string | null;\n /** Hook 总数 */\n total: number;\n /** 已完成数 */\n completed: number;\n /** 自定义状态消息 */\n customMessage: string | null;\n };\n}\n\n/** 轮次摘要记录 */\nexport interface RoundSummary {\n roundId: string;\n reasoningNodeId: string;\n exploreNodeId: string | null;\n summaryNodeId: string | null;\n startedAt: number;\n endedAt: number;\n toolCounts: import('./nodes').ToolCounts;\n}\n\nexport function createEmptyTree(): SessionTree {\n return {\n rootChildren: [],\n byId: {},\n openSubAgentStack: [],\n status: 'connecting',\n meta: { sessionId: null, startedAt: null, lastEventId: null },\n internalErrors: [],\n debugEvents: [],\n systemEvents: [],\n toolSeqCounters: {},\n activeToolByStepName: {},\n activeRoundId: null,\n roundSummaries: [],\n tasks: {},\n taskPhase: 'hidden',\n hasEverShownTaskList: false,\n waitingForFinalResponseAfterTasks: false,\n taskStartTime: null,\n hookProgress: {\n currentToolUseID: null,\n total: 0,\n completed: 0,\n customMessage: null,\n },\n };\n}\n","/** Common fields on every LangchainAgentEvent (SDK mirror). */\nexport interface CommonFields {\n step_index: number | null;\n tool_name: string | null;\n session_id: string | null;\n timestamp: number;\n}\n\nexport interface ToolCallData {\n tool_call_id?: string;\n input?: unknown;\n [key: string]: unknown;\n}\n\nexport interface ToolResultData {\n schema_version?: string;\n status: string;\n summary: string | null;\n payload: unknown;\n display?: unknown;\n blocks?: unknown[];\n artifacts?: unknown[];\n hints?: unknown;\n meta?: unknown;\n error?: { message: string; type?: string } | null;\n truncated?: boolean;\n overflow_file?: string | null;\n tool_name?: string;\n tool_call_id?: string;\n}\n\nexport interface SubagentFoldKeys {\n tool_call_id: string;\n agent_id: string;\n subagent_type?: string;\n [key: string]: unknown;\n}\n\n/** SDK 1.2.0 subagent-start / subagent-end boundary payload。 */\nexport interface SubAgentBoundaryData extends SubagentFoldKeys {\n tool_name: string;\n child_session_id?: string;\n}\n\n/** @deprecated 方案 A 使用 SubAgentBoundaryData;保留类型别名便于检索迁移点。 */\nexport type SubAgentStartData = SubAgentBoundaryData;\n\n/** SDK 1.2.0 subagent-tool-call / subagent-tool-result progress payload。 */\nexport interface SubagentProgressData extends SubagentFoldKeys {\n tool_name: string;\n step?: number;\n summary?: string;\n status?: string;\n}\n\n/** tool-progress:主 agent Bash 等无 agent_id;subagent 冒泡带 agent_id。 */\nexport interface ToolProgressData {\n tool_call_id?: string;\n agent_id?: string;\n tool_name?: string;\n phase?: string;\n current?: number;\n total?: number;\n message?: string;\n data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface ErrorEventData {\n /** 薄层 / 协议约定字段 */\n message?: string;\n type?: string;\n source?: string;\n /** SDK adapter 字段(loop_stream_driver.error_visible 等) */\n error?: string;\n error_type?: string;\n synthetic?: boolean;\n [key: string]: unknown;\n}\n\nexport interface FinishEventData {\n answer?: string;\n is_error?: boolean;\n error_kind?: string;\n terminal_reason?: string;\n errors?: string[];\n recoverable?: boolean;\n [key: string]: unknown;\n}\n\nexport type LangchainAgentEvent =\n | ({ event_type: 'start'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'finish'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'text-start'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'text-delta'; data: { delta?: string; text?: string } } & CommonFields)\n | ({ event_type: 'text-end'; data: { text?: string } } & CommonFields)\n | ({ event_type: 'reasoning-start'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'reasoning-delta'; data: { delta?: string; text?: string } } & CommonFields)\n | ({ event_type: 'reasoning-end'; data: { text?: string } } & CommonFields)\n | ({ event_type: 'tool-input'; data: ToolCallData & { params?: unknown } } & CommonFields)\n | ({ event_type: 'tool-call'; data: ToolCallData } & CommonFields)\n | ({ event_type: 'tool-result'; data: ToolResultData } & CommonFields)\n | ({ event_type: 'tool-artifact'; data: ToolResultData } & CommonFields)\n | ({ event_type: 'tool-error'; data: { message: string; type?: string } } & CommonFields)\n | ({ event_type: 'tool-input-start'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'tool-input-delta'; data: { delta: string } } & CommonFields)\n | ({ event_type: 'tool-progress'; data: ToolProgressData } & CommonFields)\n | ({ event_type: 'start-step'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'finish-step'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'subagent-start'; data: SubAgentBoundaryData } & CommonFields)\n | ({ event_type: 'subagent-end'; data: SubAgentBoundaryData } & CommonFields)\n | ({ event_type: 'subagent-tool-call'; data: SubagentProgressData } & CommonFields)\n | ({ event_type: 'subagent-tool-result'; data: SubagentProgressData } & CommonFields)\n | ({ event_type: 'subagent-model-step'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'hook-progress'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'hook-finished'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'compact-start'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'compact-end'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'task-started'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'task-progress'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'task-notification-enqueued'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'task-notification-consumed'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'task-terminated'; data: Record<string, unknown> } & CommonFields)\n | ({ event_type: 'task-list-snapshot'; data: TaskListSnapshotData } & CommonFields)\n | ({ event_type: 'error'; data: ErrorEventData } & CommonFields)\n | ({ event_type: 'permission-request'; data: PermissionRequestData } & CommonFields)\n | ({ event_type: 'memory-saved'; data: MemorySavedEventData } & CommonFields)\n | ({ event_type: string; data: Record<string, unknown> } & CommonFields);\n\n/** SDK MEMORY_SAVED 事件载荷(对齐 CLI MemorySavedSummaryHandler.parse)。 */\nexport interface MemorySavedEventData {\n count?: number;\n written_paths?: string[];\n display_hint?: string;\n [key: string]: unknown;\n}\n\nexport interface TaskListSnapshotTaskData {\n id: string;\n subject?: string;\n description?: string;\n status?: string;\n blocked_by?: string[];\n blocks?: string[];\n owner?: string;\n active_form?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskListSnapshotData {\n tasks: TaskListSnapshotTaskData[];\n session_id: string;\n timestamp: number;\n /** 磁盘 task_list_id;与 UI session_id 可不同(Simple Demo 为 default) */\n task_list_id?: string;\n}\n\nexport interface PermissionRequestData {\n request_id: string;\n tool_name?: string;\n ask_prompt?: string;\n ask_decision?: { message?: string; behavior?: string };\n input_data?: unknown;\n [key: string]: unknown;\n}\n\nexport type EventType = LangchainAgentEvent['event_type'];\n\nexport type EventTier = 'main' | 'collapsed' | 'debug' | 'state';\n\nexport type TierOverrides = Partial<\n Record<EventType, Exclude<EventTier, 'state'>>\n>;\n\nexport const DEFAULT_EVENT_TIERS: Record<string, EventTier> = {\n start: 'state',\n finish: 'state',\n 'text-start': 'main',\n 'text-delta': 'main',\n 'text-end': 'main',\n 'reasoning-start': 'main',\n 'reasoning-delta': 'main',\n 'reasoning-end': 'main',\n 'tool-call': 'main',\n 'tool-result': 'main',\n 'tool-artifact': 'main',\n 'tool-error': 'main',\n 'tool-input': 'collapsed',\n 'tool-input-start': 'collapsed',\n 'tool-input-delta': 'collapsed',\n 'tool-progress': 'collapsed',\n 'start-step': 'collapsed',\n 'finish-step': 'collapsed',\n 'subagent-start': 'collapsed',\n 'subagent-end': 'collapsed',\n 'subagent-tool-call': 'collapsed',\n 'subagent-tool-result': 'collapsed',\n 'subagent-model-step': 'collapsed',\n 'hook-progress': 'debug',\n 'hook-finished': 'debug',\n 'compact-start': 'debug',\n 'compact-end': 'debug',\n 'task-started': 'debug',\n 'task-progress': 'debug',\n 'task-notification-enqueued': 'debug',\n 'task-notification-consumed': 'debug',\n 'task-terminated': 'debug',\n 'task-list-snapshot': 'state',\n error: 'main',\n 'permission-request': 'main',\n 'memory-saved': 'main',\n};\n","/**\n * 职责:LangchainAgentEvent → tier + parentNodeId(纯函数,不改树)。\n * 链路位置:store.applyEvent → classifyEvent → reduceTree。\n * 当前裁剪范围:DEFAULT_EVENT_TIERS + tierOverrides;subagent 折叠事件挂 Agent ToolCallNode。\n */\nimport {\n DEFAULT_EVENT_TIERS,\n type EventTier,\n type LangchainAgentEvent,\n type TierOverrides,\n} from '../types/events';\nimport type { ClassifiedEvent, ClassifyContext } from '../types/tier';\n\nexport type { ClassifiedEvent, ClassifyContext };\n\nexport function resolveEventTier(\n eventType: string,\n overrides?: TierOverrides,\n): EventTier {\n if (overrides?.[eventType as keyof TierOverrides]) {\n return overrides[eventType as keyof TierOverrides] as EventTier;\n }\n return DEFAULT_EVENT_TIERS[eventType] ?? 'main';\n}\n\nfunction toolNodeIdFromEvent(event: LangchainAgentEvent, seq: number): string {\n const data = event.data as { tool_call_id?: string };\n if (data.tool_call_id) return `tool:${data.tool_call_id}`;\n const step = event.step_index ?? 0;\n const name = event.tool_name ?? 'unknown';\n return `tool:${step}:${name}:${seq}`;\n}\n\nfunction resolveToolParentId(\n event: LangchainAgentEvent,\n ctx: ClassifyContext,\n eventIndex: number,\n): string | undefined {\n const data = event.data as { tool_call_id?: string };\n if (data.tool_call_id) return `tool:${data.tool_call_id}`;\n if (ctx.streamingToolNodeId) return ctx.streamingToolNodeId;\n return toolNodeIdFromEvent(event, eventIndex);\n}\n\nfunction isSubagentFoldEvent(event: LangchainAgentEvent): boolean {\n if (\n event.event_type === 'subagent-start' ||\n event.event_type === 'subagent-end' ||\n event.event_type === 'subagent-tool-call' ||\n event.event_type === 'subagent-tool-result' ||\n event.event_type === 'subagent-model-step'\n ) {\n return true;\n }\n if (event.event_type === 'tool-progress') {\n const data = event.data as { agent_id?: string };\n return typeof data.agent_id === 'string' && data.agent_id.length > 0;\n }\n return false;\n}\n\nfunction resolveAgentToolParentId(event: LangchainAgentEvent): string | undefined {\n const data = event.data as { tool_call_id?: string };\n if (data.tool_call_id) return `tool:${data.tool_call_id}`;\n return undefined;\n}\n\nexport function classifyEvent(\n event: LangchainAgentEvent,\n ctx: ClassifyContext,\n overrides?: TierOverrides,\n eventIndex = 0,\n): ClassifiedEvent {\n const tier = resolveEventTier(event.event_type, overrides);\n let parentNodeId: string | undefined;\n\n if (tier === 'collapsed') {\n if (isSubagentFoldEvent(event)) {\n parentNodeId = resolveAgentToolParentId(event);\n } else if (\n event.event_type.startsWith('tool-') ||\n event.event_type === 'start-step' ||\n event.event_type === 'finish-step'\n ) {\n parentNodeId = resolveToolParentId(event, ctx, eventIndex);\n }\n }\n\n if (tier === 'debug' && ctx.streamingToolNodeId) {\n parentNodeId = ctx.streamingToolNodeId;\n }\n\n return { event, tier, parentNodeId };\n}\n","/**\n * eventVisibility.ts — 事件 UI 可见性(对齐 CLI bridge/event_visibility.py)\n *\n * CC 对照:forkedAgent skipTranscript · claude isAgenticQuery\n * CLI:langchain_agentx_cli/bridge/event_visibility.py — is_subagent_scoped_text_event\n * CLI:message_list.py — _SUBAGENT_LEAK_FOLD_TOOLS / _annotate_leaked_subagent_parent\n */\n\nimport type { ToolCallNode } from '../types/nodes';\nimport type { SessionTree } from '../types/tree';\n\n/** 运行中 Explore 父 Agent 存在时,main-tier 无 parent 的 Bash/Read/Glob/Grep 应折叠(对齐 CLI)。 */\nexport const SUBAGENT_LEAK_FOLD_TOOLS = new Set(['Bash', 'Read', 'Glob', 'Grep']);\n\nexport function isSubagentLeakFoldToolName(toolName: string): boolean {\n return SUBAGENT_LEAK_FOLD_TOOLS.has(toolName);\n}\n\n/** 运行中 Agent/Explore 父 tool_call_id 列表(对齐 CLI _running_agent_parent_call_ids)。 */\nexport function getRunningAgentParentCallIds(tree: SessionTree): string[] {\n const ids: string[] = [];\n const seen = new Set<string>();\n for (const node of Object.values(tree.byId)) {\n if (node.kind !== 'tool_call') continue;\n if (node.toolName !== 'Agent') continue;\n if (node.status !== 'running') continue;\n const raw = node.toolCallId ?? node.id.replace(/^tool:/, '');\n const callId = raw.trim();\n if (callId && !seen.has(callId)) {\n seen.add(callId);\n ids.push(callId);\n }\n }\n return ids;\n}\n\nconst VISIBILITY_KEYS = [\n 'query_source',\n 'emitter_route',\n 'display_hint',\n 'skip_transcript',\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** 父 Agent 工具 call id(Plan A:parent_tool_use_id / parent_tool_call_id)。 */\nexport function resolveParentAgentToolCallId(\n data: Record<string, unknown> | null | undefined,\n): string | null {\n if (!data) return null;\n for (const key of ['parent_tool_call_id', 'parent_tool_use_id']) {\n const raw = data[key];\n if (typeof raw === 'string') {\n const stripped = raw.trim();\n if (stripped) return stripped;\n }\n }\n return null;\n}\n\n/** text 事件:tool_call_id 在 Plan A 子 agent 流上可指父 Agent(对齐 CLI resolve_parent_tool_call_id)。 */\nfunction resolveParentToolCallIdForText(\n data: Record<string, unknown> | null | undefined,\n): string | null {\n if (!data) return null;\n for (const key of ['tool_call_id', 'parent_tool_call_id', 'parent_tool_use_id']) {\n const raw = data[key];\n if (typeof raw === 'string') {\n const stripped = raw.trim();\n if (stripped) return stripped;\n }\n }\n return null;\n}\n\nfunction bridgeEventDisplayMetadata(\n data: Record<string, unknown> | null | undefined,\n): Record<string, unknown> | null {\n if (!data) return null;\n const merged: Record<string, unknown> = {};\n const meta = data.meta;\n if (isRecord(meta)) {\n for (const key of VISIBILITY_KEYS) {\n if (key in meta) merged[key] = meta[key];\n }\n }\n for (const key of VISIBILITY_KEYS) {\n if (key in data) merged[key] = data[key];\n }\n return Object.keys(merged).length > 0 ? merged : null;\n}\n\nfunction isAgentSubagentQuerySource(qs: unknown): boolean {\n if (typeof qs !== 'string') return false;\n const trimmed = qs.trim();\n if (!trimmed) return false;\n return trimmed.startsWith('agent:') || trimmed.includes('subagent');\n}\n\n/**\n * 子 agent 文本流不应进入主时间线 assistant 气泡。\n * 对齐 CLI is_subagent_scoped_text_event + Bridge TEXT_* drop。\n */\nexport function isSubagentScopedTextEvent(\n data: Record<string, unknown> | null | undefined,\n): boolean {\n if (!data) return false;\n if (resolveParentToolCallIdForText(data)) return true;\n const agentId = data.agent_id;\n if (typeof agentId === 'string' && agentId.trim()) return true;\n const meta = bridgeEventDisplayMetadata(data);\n if (meta && isAgentSubagentQuerySource(meta.query_source)) return true;\n if (isAgentSubagentQuerySource(data.query_source)) return true;\n return false;\n}\n\n/** 子 agent reasoning 与 text 同规则(SUBAGENT_MODEL_STEP 已在 collapsed tier no-op)。 */\nexport function isSubagentScopedReasoningEvent(\n data: Record<string, unknown> | null | undefined,\n): boolean {\n return isSubagentScopedTextEvent(data);\n}\n\n/**\n * 防御性兜底:检查 emitter_route ∈ {drop, sidechain}。\n *\n * 正常情况下 backend transcript_gate_middleware 已在 SSE 序列化前丢弃这类事件\n * (D21 P0;对齐 SDK should_display_trace_event)。此函数仅作为 backend gate\n * 关闭 / 失效场景的兜底——reducer 入口处仍能阻止 sidechain 事件污染主时间线。\n *\n * **不**作用于 memory-saved 事件:其本身 emitter_route=sidechain 但需保留为\n * MemorySavedNode 展示(见 reducer.handleMemorySaved + D21 §5.4)。\n */\nexport function isDroppedByEmitterRoute(\n data: Record<string, unknown> | null | undefined,\n): boolean {\n if (!data) return false;\n if (isDropRouteValue(data.emitter_route)) return true;\n const meta = bridgeEventDisplayMetadata(data);\n if (meta && isDropRouteValue(meta.emitter_route)) return true;\n return false;\n}\n\nfunction isDropRouteValue(value: unknown): boolean {\n return value === 'drop' || value === 'sidechain';\n}\n\nexport type LeakedSubagentMainToolCallOptions = {\n toolName?: string;\n runningAgentParentCallIds?: readonly string[];\n};\n\n/**\n * main-tier tool-call 泄漏:带 agent_id / parent 键,或运行中 Explore 父下无 parent 的 fold 工具。\n * 对齐 CLI is_subagent_child_on_timeline + _annotate_leaked_subagent_parent。\n */\nexport function isLeakedSubagentMainToolCall(\n data: Record<string, unknown> | null | undefined,\n options?: LeakedSubagentMainToolCallOptions,\n): boolean {\n if (!data) return false;\n if (typeof data.agent_id === 'string' && data.agent_id.trim()) return true;\n if (resolveParentAgentToolCallId(data) != null) return true;\n const toolName = options?.toolName;\n const runningIds = options?.runningAgentParentCallIds;\n if (\n toolName &&\n runningIds &&\n runningIds.length > 0 &&\n isSubagentLeakFoldToolName(toolName)\n ) {\n return true;\n }\n return false;\n}\n\n/** synthesize tool-call(仅 status,input 已由 tool-input 写入)— 对齐 CLI Bridge TOOL_CALL pass。 */\nexport function isSynthesizeToolCallStatusOnly(\n data: Record<string, unknown> | null | undefined,\n existing?: ToolCallNode,\n): boolean {\n if (!existing) return false;\n if (data?.input !== undefined && data.input !== null) return false;\n return (\n existing.input != null ||\n existing.details?.input != null ||\n (existing.details?.inputStream?.length ?? 0) > 0\n );\n}\n","/**\n * 职责:Subagent progress 分桶与 upsert(纯函数)。\n * 链路位置:reducer handleSubagentTool* → applySubagent*。\n * 当前裁剪范围:单 Agent 工具行内按 agent_id + step + tool_name 索引。\n */\nimport type {\n SubagentProgressEntry,\n SubagentSessionMarker,\n} from '../types/nodes';\n\nexport function progressEntryKey(\n entry: Pick<SubagentProgressEntry, 'agentId' | 'step' | 'toolName'>,\n): string {\n return `${entry.agentId}:${entry.step}:${entry.toolName}`;\n}\n\nexport function sortSubagentProgress(\n entries: SubagentProgressEntry[],\n): SubagentProgressEntry[] {\n return [...entries].sort(\n (a, b) => a.step - b.step || a.toolName.localeCompare(b.toolName),\n );\n}\n\nexport function applySubagentToolCall(\n entries: SubagentProgressEntry[],\n payload: {\n agentId: string;\n subagentType?: string;\n step: number;\n toolName: string;\n summary: string;\n toolInput?: unknown;\n childToolCallId?: string;\n },\n): SubagentProgressEntry[] {\n const entry: SubagentProgressEntry = {\n agentId: payload.agentId,\n subagentType: payload.subagentType,\n step: payload.step,\n toolName: payload.toolName,\n summary: payload.summary,\n status: 'running',\n toolInput: payload.toolInput,\n childToolCallId: payload.childToolCallId,\n };\n const key = progressEntryKey(entry);\n const idx = entries.findIndex((e) => progressEntryKey(e) === key);\n const next = [...entries];\n if (idx >= 0) {\n next[idx] = entry;\n } else {\n next.push(entry);\n }\n return sortSubagentProgress(next);\n}\n\nexport function applySubagentToolResult(\n entries: SubagentProgressEntry[],\n payload: {\n agentId: string;\n step: number;\n toolName: string;\n summary: string;\n },\n): SubagentProgressEntry[] {\n const key = progressEntryKey(payload);\n const idx = entries.findIndex((e) => progressEntryKey(e) === key);\n if (idx < 0) {\n return sortSubagentProgress([\n ...entries,\n {\n agentId: payload.agentId,\n step: payload.step,\n toolName: payload.toolName,\n summary: payload.summary,\n status: 'completed',\n },\n ]);\n }\n const next = [...entries];\n next[idx] = {\n ...next[idx]!,\n summary: payload.summary || next[idx]!.summary,\n status: 'completed',\n };\n return sortSubagentProgress(next);\n}\n\nexport function upsertSubagentSession(\n sessions: Record<string, SubagentSessionMarker>,\n marker: SubagentSessionMarker,\n): Record<string, SubagentSessionMarker> {\n return { ...sessions, [marker.agentId]: marker };\n}\n","/**\n * 职责:task-list-snapshot 载荷解析与 taskPhase 派生(纯函数)。\n * 链路位置:reducer.handleTaskListSnapshot。\n * 当前裁剪范围:不含 UI 渲染;Phase 4 用 taskPhase 控制 Spinner/TaskList 显示。\n */\nimport type { TaskListSnapshotData, TaskListSnapshotTaskData } from '../types/events';\nimport type { TaskPhase } from '../types/tree';\nimport type { Task, TaskStatus } from '../types/tasks';\n\nconst OPEN_TASK_STATUSES = new Set<TaskStatus>(['pending', 'in_progress']);\n\nfunction normalizeTaskStatus(raw: string): TaskStatus {\n if (raw === 'running') return 'in_progress';\n if (raw === 'pending' || raw === 'in_progress' || raw === 'completed') {\n return raw;\n }\n return 'pending';\n}\n\nexport function isOpenTaskStatus(status: TaskStatus): boolean {\n return OPEN_TASK_STATUSES.has(status);\n}\n\n/** 由快照任务列表派生 session 级 taskPhase(对齐设计文档 §3.2.3)。 */\nexport function deriveTaskPhase(tasks: Task[]): TaskPhase {\n if (tasks.length === 0) return 'hidden';\n if (tasks.some((task) => isOpenTaskStatus(task.status))) return 'visible';\n return 'hidden-after-completion';\n}\n\n/** metadata._internal 任务不进入可见列表(对齐 CC / backend mapper P2-D)。 */\nexport function isInternalSnapshotTask(raw: TaskListSnapshotTaskData): boolean {\n const metadata = raw.metadata;\n if (!metadata || typeof metadata !== 'object') return false;\n return Boolean((metadata as Record<string, unknown>)._internal);\n}\n\nfunction snapshotTaskToTask(raw: TaskListSnapshotTaskData): Task | null {\n const id = String(raw.id ?? '').trim();\n if (!id) return null;\n if (isInternalSnapshotTask(raw)) return null;\n return {\n id,\n subject: String(raw.subject ?? ''),\n description: raw.description ? String(raw.description) : undefined,\n activeForm: raw.active_form ? String(raw.active_form) : undefined,\n owner: raw.owner ? String(raw.owner) : undefined,\n status: normalizeTaskStatus(String(raw.status ?? 'pending')),\n blocks: Array.isArray(raw.blocks) ? raw.blocks.map(String) : [],\n blockedBy: Array.isArray(raw.blocked_by) ? raw.blocked_by.map(String) : [],\n metadata:\n raw.metadata && typeof raw.metadata === 'object'\n ? (raw.metadata as Record<string, unknown>)\n : undefined,\n };\n}\n\n/** 将 snapshot.data.tasks 转为 Record<id, Task>,非法条目跳过。 */\nexport function parseSnapshotTasks(rawTasks: TaskListSnapshotData['tasks']): Record<string, Task> {\n const result: Record<string, Task> = {};\n if (!Array.isArray(rawTasks)) return result;\n for (const raw of rawTasks) {\n if (!raw || typeof raw !== 'object') continue;\n const task = snapshotTaskToTask(raw as TaskListSnapshotTaskData);\n if (task) result[task.id] = task;\n }\n return result;\n}\n","/**\n * 职责:ClassifiedEvent / LangchainAgentEvent → SessionTree 纯函数归并。\n * 链路位置:store.applyEvent → classifyEvent → reduceTree。\n * 当前裁剪范围:单会话;V2-A tool seq id;方案 A subagent progress 挂 Agent ToolCallNode。\n */\nimport { classifyEvent, type ClassifyContext } from './classify';\nimport {\n getRunningAgentParentCallIds,\n isDroppedByEmitterRoute,\n isLeakedSubagentMainToolCall,\n isSubagentScopedReasoningEvent,\n isSubagentScopedTextEvent,\n} from './eventVisibility';\nimport {\n applySubagentToolCall,\n applySubagentToolResult,\n upsertSubagentSession,\n} from './subagentProgress';\nimport { deriveTaskPhase, parseSnapshotTasks } from './taskSnapshot';\nimport { INTERNAL_TOOL_NAMES } from '../view/tools/toolNames';\nimport type {\n ErrorEventData,\n FinishEventData,\n LangchainAgentEvent,\n MemorySavedEventData,\n PermissionRequestData,\n SubAgentBoundaryData,\n SubagentProgressData,\n TaskListSnapshotData,\n TierOverrides,\n ToolProgressData,\n ToolResultData,\n} from '../types/events';\nimport type {\n ErrorNode,\n MemorySavedNode,\n NodeDetail,\n PermissionNode,\n ReasoningNode,\n SessionNode,\n StepDetail,\n StepNode,\n TextNode,\n ToolCallNode,\n UnknownNode,\n} from '../types/nodes';\nimport { createEmptyTree, type SessionTree } from '../types/tree';\n\nexport { createEmptyTree };\nexport type { SessionTree };\n\n// 判断是否为内部工具\nfunction isInternalTool(toolName: string): boolean {\n return INTERNAL_TOOL_NAMES.has(toolName);\n}\n\n// 事件时间戳从秒转换为毫秒(后端 eventTimeToMs(event.timestamp) 是秒,前端需要毫秒)\nfunction eventTimeToMs(timestamp: number): number {\n return timestamp * 1000;\n}\n\nexport interface ReduceOptions {\n tierOverrides?: TierOverrides;\n /** true 时 debug tier 也写入 debugEvents(AgentSession debug prop) */\n collectDebug?: boolean;\n}\n\nfunction cloneTree(tree: SessionTree): SessionTree {\n return {\n ...tree,\n rootChildren: [...tree.rootChildren],\n byId: { ...tree.byId },\n openSubAgentStack: [...tree.openSubAgentStack],\n meta: { ...tree.meta },\n internalErrors: [...tree.internalErrors],\n debugEvents: [...tree.debugEvents],\n systemEvents: [...tree.systemEvents],\n toolSeqCounters: { ...tree.toolSeqCounters },\n activeToolByStepName: { ...tree.activeToolByStepName },\n activeRoundId: tree.activeRoundId,\n roundSummaries: [...tree.roundSummaries],\n tasks: { ...tree.tasks },\n taskPhase: tree.taskPhase,\n hasEverShownTaskList: tree.hasEverShownTaskList,\n waitingForFinalResponseAfterTasks: tree.waitingForFinalResponseAfterTasks,\n taskStartTime: tree.taskStartTime,\n hookProgress: { ...tree.hookProgress },\n };\n}\n\nfunction buildClassifyContext(tree: SessionTree): ClassifyContext {\n let streamingToolNodeId: string | undefined;\n const childIds = getActiveChildIds(tree);\n for (let i = childIds.length - 1; i >= 0; i -= 1) {\n const node = tree.byId[childIds[i]!];\n if (node?.kind === 'tool_call' && node.status === 'running') {\n streamingToolNodeId = node.id;\n break;\n }\n }\n return {\n openSubAgentStack: tree.openSubAgentStack,\n streamingToolNodeId,\n };\n}\n\nfunction getActiveChildIds(tree: SessionTree): string[] {\n return tree.rootChildren;\n}\n\nfunction appendToActiveParent(tree: SessionTree, childId: string): void {\n if (!tree.rootChildren.includes(childId)) {\n tree.rootChildren.push(childId);\n }\n}\n\nfunction appendMainStageChild(\n tree: SessionTree,\n childId: string,\n _event: LangchainAgentEvent,\n _seq: number,\n): void {\n appendToActiveParent(tree, childId);\n}\n\nfunction agentToolNode(\n tree: SessionTree,\n parentNodeId: string | undefined,\n): ToolCallNode | undefined {\n if (!parentNodeId) return undefined;\n const node = tree.byId[parentNodeId];\n return node?.kind === 'tool_call' ? node : undefined;\n}\n\nfunction stepNameKey(event: LangchainAgentEvent): string {\n const step = event.step_index ?? 0;\n const name = event.tool_name ?? 'unknown';\n return `${step}:${name}`;\n}\n\nfunction toolNodeId(tree: SessionTree, event: LangchainAgentEvent): string {\n const data = event.data as { tool_call_id?: string };\n if (data.tool_call_id) return `tool:${data.tool_call_id}`;\n const key = stepNameKey(event);\n const active = tree.activeToolByStepName[key];\n if (active && tree.byId[active]) return active;\n const step = event.step_index ?? 0;\n const name = event.tool_name ?? 'unknown';\n const seq = tree.toolSeqCounters[key] ?? 0;\n const id = `tool:${step}:${name}:${seq}`;\n tree.toolSeqCounters[key] = seq + 1;\n tree.activeToolByStepName[key] = id;\n return id;\n}\n\nfunction clearActiveToolKey(tree: SessionTree, toolId: string): void {\n for (const [key, id] of Object.entries(tree.activeToolByStepName)) {\n if (id === toolId) {\n const next = { ...tree.activeToolByStepName };\n delete next[key];\n tree.activeToolByStepName = next;\n break;\n }\n }\n}\n\nfunction ensureToolDetails(node: ToolCallNode): NodeDetail {\n return node.details ?? {};\n}\n\nfunction patchToolNode(tree: SessionTree, id: string, patch: Partial<ToolCallNode>): ToolCallNode {\n const existing = tree.byId[id] as ToolCallNode;\n const next = { ...existing, ...patch };\n tree.byId[id] = next;\n return next;\n}\n\nfunction copyToolResult(data: ToolResultData): ToolCallNode['result'] {\n return {\n schema_version: data.schema_version ?? '1',\n status: data.status ?? 'ok',\n summary: data.summary ?? null,\n payload: data.payload ?? null,\n display: data.display,\n blocks: data.blocks ?? [],\n artifacts: data.artifacts ?? [],\n hints: data.hints ?? null,\n meta: data.meta ?? null,\n error: data.error ?? null,\n truncated: data.truncated ?? false,\n overflow_file: data.overflow_file ?? null,\n };\n}\n\nfunction findStreamingNode(\n tree: SessionTree,\n kind: 'text' | 'reasoning',\n): TextNode | ReasoningNode | undefined {\n const childIds = getActiveChildIds(tree);\n for (let i = childIds.length - 1; i >= 0; i -= 1) {\n const node = tree.byId[childIds[i]!];\n if (node && node.kind === kind && node.status === 'streaming') {\n return node as TextNode | ReasoningNode;\n }\n }\n return undefined;\n}\n\nexport function streamChunk(data: {\n delta?: string;\n text?: string;\n content?: string;\n}): string {\n const chunk = data.delta ?? data.text ?? data.content;\n return typeof chunk === 'string' ? chunk : '';\n}\n\nfunction appendStreamChunk(\n current: string | undefined,\n data: { delta?: string; text?: string; content?: string },\n): string {\n return (current ?? '') + streamChunk(data);\n}\n\nfunction handleStart(tree: SessionTree, event: LangchainAgentEvent): void {\n tree.status = 'running';\n tree.meta.startedAt = eventTimeToMs(event.timestamp);\n if (event.session_id) tree.meta.sessionId = event.session_id;\n}\n\n/** 归一化 error 事件 data(兼容薄层 message/type 与 SDK error/error_type)。 */\nexport function resolveErrorEventFields(\n data: ErrorEventData,\n): { message: string; type: string | null } {\n const message =\n (typeof data.message === 'string' && data.message) ||\n (typeof data.error === 'string' && data.error) ||\n 'Unknown error';\n const type =\n (typeof data.type === 'string' && data.type) ||\n (typeof data.error_type === 'string' && data.error_type) ||\n null;\n return { message, type };\n}\n\nfunction resolveFinishErrorMessage(data: FinishEventData): string {\n if (Array.isArray(data.errors) && data.errors.length > 0) {\n return data.errors.map(String).join('\\n');\n }\n if (typeof data.terminal_reason === 'string' && data.terminal_reason) {\n return `Agent ended with terminal_reason=${data.terminal_reason}`;\n }\n return 'Agent finished with an error';\n}\n\nfunction appendFinishErrorNode(\n tree: SessionTree,\n event: LangchainAgentEvent,\n data: FinishEventData,\n seq: number,\n): void {\n const { message, type } = resolveErrorEventFields({\n message: resolveFinishErrorMessage(data),\n type:\n (typeof data.error_kind === 'string' && data.error_kind) ||\n (typeof data.terminal_reason === 'string' && data.terminal_reason) ||\n undefined,\n });\n const id = `finish-error:${seq}`;\n const node: ErrorNode = {\n kind: 'error',\n id,\n message,\n errorType: type,\n startedAt: eventTimeToMs(event.timestamp),\n };\n tree.byId[id] = node;\n appendMainStageChild(tree, id, event, seq);\n tree.status = 'error';\n}\n\nfunction finalizeRunningToolCalls(\n tree: SessionTree,\n endedAt: number,\n terminalStatus: 'done' | 'failed',\n): void {\n for (const id of Object.keys(tree.byId)) {\n const node = tree.byId[id];\n if (node?.kind !== 'tool_call' || node.status !== 'running') continue;\n tree.byId[id] = {\n ...node,\n status: terminalStatus,\n endedAt: node.endedAt ?? endedAt,\n };\n }\n}\n\nfunction finalizeStreamingNodes(tree: SessionTree): void {\n for (const id of Object.keys(tree.byId)) {\n const node = tree.byId[id];\n if (!node) continue;\n if (\n (node.kind === 'text' || node.kind === 'reasoning') &&\n node.status === 'streaming'\n ) {\n tree.byId[id] = { ...node, status: 'done' };\n }\n }\n}\n\nfunction handleFinish(tree: SessionTree, event: LangchainAgentEvent, seq: number): void {\n const data = event.data as FinishEventData;\n const endedAt = eventTimeToMs(event.timestamp);\n if (data.is_error === true) {\n appendFinishErrorNode(tree, event, data, seq);\n finalizeRunningToolCalls(tree, endedAt, 'failed');\n finalizeStreamingNodes(tree);\n return;\n }\n finalizeRunningToolCalls(tree, endedAt, 'done');\n finalizeStreamingNodes(tree);\n tree.status = 'done';\n}\n\nconst TASK_DEBUG_EVENT_TYPES = new Set([\n 'task-started',\n 'task-progress',\n 'task-terminated',\n 'task-notification-enqueued',\n 'task-notification-consumed',\n]);\n\n/**\n * 处理 task-list-snapshot:唯一驱动可见任务列表的真值源。\n */\nfunction handleTaskListSnapshot(\n tree: SessionTree,\n event: LangchainAgentEvent,\n eventIndex: number,\n): void {\n const data = event.data as TaskListSnapshotData;\n const payloadSessionId = data.session_id;\n\n if (\n tree.meta.sessionId &&\n payloadSessionId &&\n tree.meta.sessionId !== payloadSessionId\n ) {\n tree.internalErrors.push({\n eventIndex,\n eventType: event.event_type,\n message: `task-list-snapshot session_id mismatch: expected ${tree.meta.sessionId}, got ${payloadSessionId}`,\n });\n return;\n }\n\n if (event.session_id && payloadSessionId && event.session_id !== payloadSessionId) {\n tree.internalErrors.push({\n eventIndex,\n eventType: event.event_type,\n message: `task-list-snapshot envelope session_id mismatch: event=${event.session_id}, payload=${payloadSessionId}`,\n });\n return;\n }\n\n if (payloadSessionId && !tree.meta.sessionId) {\n tree.meta.sessionId = payloadSessionId;\n }\n\n const tasks = parseSnapshotTasks(data.tasks);\n tree.tasks = tasks;\n\n const taskValues = Object.values(tasks);\n const phase = deriveTaskPhase(taskValues);\n tree.taskPhase = phase;\n if (taskValues.length > 0) {\n tree.hasEverShownTaskList = true;\n if (!tree.taskStartTime) {\n tree.taskStartTime = eventTimeToMs(data.timestamp ?? event.timestamp);\n }\n }\n if (phase === 'visible') {\n tree.waitingForFinalResponseAfterTasks = false;\n } else if (phase === 'hidden-after-completion') {\n tree.waitingForFinalResponseAfterTasks = true;\n } else {\n tree.waitingForFinalResponseAfterTasks = false;\n }\n}\n\nfunction appendTaskDebugEvent(\n tree: SessionTree,\n event: LangchainAgentEvent,\n eventIndex: number,\n): void {\n tree.debugEvents.push({\n eventIndex,\n eventType: event.event_type,\n data: event.data,\n });\n}\n\n/**\n * 处理 hook 进度事件(对齐 CC stopHookSpinnerSuffix)\n */\nfunction handleHookProgress(tree: SessionTree, event: LangchainAgentEvent): void {\n const data = event.data as {\n tool_use_id?: string;\n hook_event?: string;\n status_message?: string;\n };\n\n const toolUseID = data.tool_use_id;\n const hookEvent = data.hook_event;\n\n // 只处理 Stop 和 SubagentStop 事件\n if (!toolUseID || (hookEvent !== 'Stop' && hookEvent !== 'SubagentStop')) return;\n\n // 如果是新的 toolUseID,重置计数\n if (tree.hookProgress.currentToolUseID !== toolUseID) {\n tree.hookProgress = {\n currentToolUseID: toolUseID,\n total: 1,\n completed: 0,\n customMessage: data.status_message ?? null,\n };\n } else {\n // 同一个 toolUseID 的 hook,增加总数\n tree.hookProgress.total += 1;\n // 如果有自定义消息,更新它\n if (data.status_message) {\n tree.hookProgress.customMessage = data.status_message;\n }\n }\n}\n\n/**\n * 处理 hook 完成事件(清除 hookProgress)\n */\nfunction handleHookFinished(tree: SessionTree, event: LangchainAgentEvent): void {\n const data = event.data as {\n tool_use_id?: string;\n };\n\n const toolUseID = data.tool_use_id;\n\n // 如果是当前正在执行的 hook 完成,增加完成计数\n if (toolUseID && tree.hookProgress.currentToolUseID === toolUseID) {\n tree.hookProgress.completed += 1;\n\n // 如果所有 hook 完成,清除状态\n if (tree.hookProgress.completed >= tree.hookProgress.total) {\n tree.hookProgress = {\n currentToolUseID: null,\n total: 0,\n completed: 0,\n customMessage: null,\n };\n }\n } else if (toolUseID && tree.hookProgress.currentToolUseID === toolUseID) {\n // hook 执行失败或其他原因结束,清除状态\n tree.hookProgress = {\n currentToolUseID: null,\n total: 0,\n completed: 0,\n customMessage: null,\n };\n }\n}\n\nfunction handleTextStart(tree: SessionTree, event: LangchainAgentEvent, seq: number): void {\n const id = `text:${seq}`;\n const node: TextNode = {\n kind: 'text',\n id,\n accumulated: '',\n status: 'streaming',\n startedAt: eventTimeToMs(event.timestamp),\n };\n tree.byId[id] = node;\n appendMainStageChild(tree, id, event, seq);\n}\n\nfunction handleTextDelta(\n tree: SessionTree,\n event: LangchainAgentEvent,\n seq: number,\n): void {\n const data = event.data as { delta?: string; text?: string };\n let node = findStreamingNode(tree, 'text');\n if (!node) {\n handleTextStart(tree, event, seq);\n node = findStreamingNode(tree, 'text');\n }\n if (!node || node.kind !== 'text') return;\n tree.byId[node.id] = {\n ...node,\n accumulated: appendStreamChunk(node.accumulated, data),\n };\n}\n\nfunction handleTextEnd(tree: SessionTree, event: LangchainAgentEvent): void {\n const node = findStreamingNode(tree, 'text');\n if (!node || node.kind !== 'text') return;\n const data = event.data as { text?: string };\n if (import.meta.env?.DEV && data.text != null && data.text !== node.accumulated) {\n console.warn('[langchain_agentx_stream_ui] text-end mismatch', { id: node.id });\n }\n tree.byId[node.id] = {\n ...node,\n status: 'done',\n accumulated: node.accumulated,\n };\n}\n\nfunction handleReasoningStart(tree: SessionTree, event: LangchainAgentEvent, seq: number): void {\n const id = `reasoning:${seq}`;\n // 生成唯一 roundId:round-{seq}\n const roundId = `round-${seq}`;\n const node: ReasoningNode = {\n kind: 'reasoning',\n id,\n accumulated: '',\n status: 'streaming',\n startedAt: eventTimeToMs(event.timestamp),\n roundId,\n isCollapsible: false,\n elapsedSeconds: null,\n endedAt: null,\n };\n tree.byId[id] = node;\n appendMainStageChild(tree, id, event, seq);\n // 设置活跃轮次\n tree.activeRoundId = roundId;\n}\n\nfunction handleReasoningDelta(tree: SessionTree, event: LangchainAgentEvent): void {\n const data = event.data as { delta?: string; text?: string; content?: string };\n const node = findStreamingNode(tree, 'reasoning');\n if (!node || node.kind !== 'reasoning') return;\n tree.byId[node.id] = {\n ...node,\n accumulated: appendStreamChunk(node.accumulated, data),\n };\n}\n\nfunction handleReasoningEnd(tree: SessionTree, event: LangchainAgentEvent): void {\n const node = findStreamingNode(tree, 'reasoning');\n if (!node || node.kind !== 'reasoning') return;\n const data = event.data as { text?: string };\n if (import.meta.env?.DEV && data.text != null && data.text !== node.accumulated) {\n console.warn('[langchain_agentx_stream_ui] reasoning-end mismatch', { id: node.id });\n }\n // 计算耗时(秒)\n const endedAt = eventTimeToMs(event.timestamp);\n const elapsedSeconds = (endedAt - node.startedAt) / 1000;\n tree.byId[node.id] = {\n ...node,\n status: 'done',\n accumulated: node.accumulated,\n endedAt,\n elapsedSeconds,\n isCollapsible: true,\n };\n}\n\nfunction upsertToolNode(\n tree: SessionTree,\n id: string,\n event: LangchainAgentEvent,\n init: Partial<ToolCallNode>,\n seq: number,\n mountMain: boolean,\n): ToolCallNode {\n const data = event.data as { tool_call_id?: string; tool_name?: string };\n const existing = tree.byId[id] as ToolCallNode | undefined;\n const base: ToolCallNode = existing?.kind === 'tool_call'\n ? existing\n : {\n kind: 'tool_call',\n id,\n toolCallId: data.tool_call_id ?? null,\n toolName: event.tool_name ?? data.tool_name ?? 'unknown',\n input: null,\n status: 'running',\n startedAt: eventTimeToMs(event.timestamp),\n endedAt: null,\n result: null,\n progress: null,\n inputDelta: '',\n onMainStage: false,\n };\n\n const merged: ToolCallNode = { ...base, ...init, id };\n tree.byId[id] = merged;\n\n if (mountMain && !merged.onMainStage) {\n appendMainStageChild(tree, id, event, seq);\n tree.byId[id] = { ...merged, onMainStage: true };\n }\n\n return tree.byId[id] as ToolCallNode;\n}\n\nfunction handleToolInputCollapsed(\n tree: SessionTree,\n event: LangchainAgentEvent,\n _parentNodeId: string | undefined,\n seq: number,\n): void {\n const id = toolNodeId(tree, event);\n const data = event.data as {\n tool_call_id?: string;\n tool_name?: string;\n input?: unknown;\n params?: unknown;\n };\n const input = data.input ?? data.params ?? null;\n const existing = tree.byId[id] as ToolCallNode | undefined;\n const details = ensureToolDetails(\n existing?.kind === 'tool_call' ? existing : { kind: 'tool_call' } as ToolCallNode,\n );\n const mergedInput = input ?? existing?.input ?? details.input ?? null;\n upsertToolNode(\n tree,\n id,\n event,\n {\n input: mergedInput,\n details: { ...details, input: mergedInput ?? details.input },\n },\n seq,\n false,\n );\n}\n\nfunction handleToolInputDelta(\n tree: SessionTree,\n event: LangchainAgentEvent,\n _parentNodeId: string | undefined,\n seq: number,\n): void {\n const id = toolNodeId(tree, event);\n const data = event.data as { delta?: string };\n const existing = tree.byId[id] as ToolCallNode | undefined;\n const prevStream =\n existing?.details?.inputStream ?? existing?.inputDelta ?? '';\n const inputStream = prevStream + (data.delta ?? '');\n upsertToolNode(\n tree,\n id,\n event,\n {\n inputDelta: inputStream,\n details: {\n ...ensureToolDetails(existing?.kind === 'tool_call' ? existing : ({} as ToolCallNode)),\n inputStream,\n },\n },\n seq,\n false,\n );\n}\n\nfunction resolveSubagentToolLeak(\n tree: SessionTree,\n data: Record<string, unknown>,\n toolName: string,\n existing?: ToolCallNode,\n): boolean {\n if (existing?.hidden === true) return true;\n return isLeakedSubagentMainToolCall(data, {\n toolName,\n runningAgentParentCallIds: getRunningAgentParentCallIds(tree),\n });\n}\n\nfunction handleToolCall(\n tree: SessionTree,\n event: LangchainAgentEvent,\n seq: number,\n): void {\n const id = toolNodeId(tree, event);\n const data = event.data as { tool_call_id?: string; tool_name?: string; input?: unknown };\n const existing = tree.byId[id] as ToolCallNode | undefined;\n const priorInput =\n existing?.input ?? existing?.details?.input ?? null;\n\n const toolName = event.tool_name ?? data.tool_name ?? 'unknown';\n const isHidden = isInternalTool(toolName);\n const dataRecord = data as unknown as Record<string, unknown>;\n const isSubagentLeak = resolveSubagentToolLeak(tree, dataRecord, toolName, existing);\n const mountMain = !isHidden && !isSubagentLeak;\n\n upsertToolNode(\n tree,\n id,\n event,\n {\n status: 'running',\n input: data.input ?? priorInput,\n hidden: isHidden || isSubagentLeak || undefined,\n },\n seq,\n mountMain,\n );\n}\n\nfunction resolveToolName(\n event: LangchainAgentEvent,\n data: { tool_name?: string },\n existing?: ToolCallNode,\n): string {\n return event.tool_name ?? data.tool_name ?? existing?.toolName ?? 'unknown';\n}\n\nfunction shouldMountToolOnMainStage(\n tree: SessionTree,\n toolName: string,\n data: Record<string, unknown>,\n existing?: ToolCallNode,\n): boolean {\n if (isInternalTool(toolName) || existing?.hidden) return false;\n if (resolveSubagentToolLeak(tree, data, toolName, existing)) return false;\n if (existing?.onMainStage) return false;\n return true;\n}\n\nfunction handleToolResult(\n tree: SessionTree,\n event: LangchainAgentEvent,\n seq: number,\n): void {\n const id = toolNodeId(tree, event);\n const data = event.data as ToolResultData;\n const existing = tree.byId[id] as ToolCallNode | undefined;\n const toolName = resolveToolName(event, data, existing);\n const dataRecord = data as unknown as Record<string, unknown>;\n const isSubagentLeak = resolveSubagentToolLeak(tree, dataRecord, toolName, existing);\n const isHidden = isInternalTool(toolName) || existing?.hidden === true || isSubagentLeak;\n\n upsertToolNode(\n tree,\n id,\n event,\n {\n status: 'done',\n endedAt: eventTimeToMs(event.timestamp),\n result: copyToolResult(data),\n hidden: isHidden || undefined,\n },\n seq,\n shouldMountToolOnMainStage(tree, toolName, dataRecord, existing),\n );\n clearActiveToolKey(tree, id);\n}\n\nfunction handleToolError(\n tree: SessionTree,\n event: LangchainAgentEvent,\n seq: number,\n): void {\n const id = toolNodeId(tree, event);\n const data = event.data as { message: string; type?: string; tool_name?: string };\n const existing = tree.byId[id] as ToolCallNode | undefined;\n const toolName = resolveToolName(event, data, existing);\n const dataRecord = data as unknown as Record<string, unknown>;\n const isSubagentLeak = resolveSubagentToolLeak(tree, dataRecord, toolName, existing);\n const isHidden = isInternalTool(toolName) || existing?.hidden === true || isSubagentLeak;\n const failedResult: ToolCallNode['result'] = {\n schema_version: '1',\n status: 'failed',\n summary: data.message,\n payload: null,\n blocks: [],\n artifacts: [],\n hints: null,\n meta: null,\n error: { message: data.message, type: data.type },\n truncated: false,\n overflow_file: null,\n };\n upsertToolNode(\n tree,\n id,\n event,\n {\n status: 'failed',\n endedAt: eventTimeToMs(event.timestamp),\n result: failedResult,\n hidden: isHidden || undefined,\n },\n seq,\n shouldMountToolOnMainStage(tree, toolName, dataRecord, existing),\n );\n clearActiveToolKey(tree, id);\n}\n\nfunction handleToolProgress(\n tree: SessionTree,\n event: LangchainAgentEvent,\n parentNodeId: string | undefined,\n _seq: number,\n): void {\n const data = event.data as ToolProgressData;\n if (typeof data.agent_id === 'string' && data.agent_id.length > 0) {\n const nested = data.data && typeof data.data === 'object' ? data.data : {};\n const stepRaw = data.step ?? nested.step ?? 0;\n const step = typeof stepRaw === 'number' ? stepRaw : 0;\n const summary =\n (typeof data.summary === 'string' ? data.summary : '') ||\n (typeof nested.summary === 'string' ? nested.summary : '');\n const toolName = String(data.tool_name ?? nested.tool_name ?? '');\n const subagentType =\n typeof nested.subagent_type === 'string' ? nested.subagent_type : undefined;\n const toolCallId =\n (typeof data.tool_call_id === 'string' && data.tool_call_id) ||\n (parentNodeId?.startsWith('tool:') ? parentNodeId.slice('tool:'.length) : '');\n if (!toolCallId) return;\n if (data.phase === 'tool_use') {\n handleSubagentToolCall(tree, event, parentNodeId, {\n tool_call_id: toolCallId,\n agent_id: data.agent_id,\n subagent_type: subagentType,\n step,\n tool_name: toolName,\n summary: summary || (toolName ? `calling ${toolName}` : ''),\n });\n } else if (data.phase === 'tool_result') {\n handleSubagentToolResult(tree, event, parentNodeId, {\n tool_call_id: toolCallId,\n agent_id: data.agent_id,\n step,\n tool_name: toolName,\n summary,\n });\n }\n return;\n }\n\n const id = toolNodeId(tree, event);\n const existing = tree.byId[id] as ToolCallNode | undefined;\n if (!existing || existing.kind !== 'tool_call') return;\n const elapsedRaw = data.elapsed_time_seconds ?? data.elapsedTimeSeconds;\n const totalLinesRaw = data.total_lines ?? data.totalLines;\n patchToolNode(tree, id, {\n progress: {\n current: data.current ?? 0,\n total: data.total ?? 0,\n message: data.message,\n elapsedTimeSeconds: typeof elapsedRaw === 'number' ? elapsedRaw : undefined,\n totalLines: typeof totalLinesRaw === 'number' ? totalLinesRaw : undefined,\n },\n });\n}\n\nfunction handleSubagentBoundaryStart(\n tree: SessionTree,\n event: LangchainAgentEvent,\n parentNodeId: string | undefined,\n): void {\n const tool = agentToolNode(tree, parentNodeId);\n if (!tool || !parentNodeId) return;\n const data = event.data as SubAgentBoundaryData;\n patchToolNode(tree, parentNodeId, {\n subagentSessions: upsertSubagentSession(tool.subagentSessions ?? {}, {\n agentId: data.agent_id,\n subagentType: data.subagent_type,\n status: 'running',\n startedAt: eventTimeToMs(event.timestamp),\n endedAt: null,\n }),\n });\n}\n\nfunction handleSubagentBoundaryEnd(\n tree: SessionTree,\n event: LangchainAgentEvent,\n parentNodeId: string | undefined,\n): void {\n const tool = agentToolNode(tree, parentNodeId);\n if (!tool || !parentNodeId) return;\n const data = event.data as SubAgentBoundaryData;\n const existing = tool.subagentSessions?.[data.agent_id];\n patchToolNode(tree, parentNodeId, {\n subagentSessions: upsertSubagentSession(tool.subagentSessions ?? {}, {\n agentId: data.agent_id,\n subagentType: data.subagent_type ?? existing?.subagentType,\n status: 'done',\n startedAt: existing?.startedAt ?? eventTimeToMs(event.timestamp),\n endedAt: eventTimeToMs(event.timestamp),\n }),\n });\n}\n\nfunction handleSubagentToolCall(\n tree: SessionTree,\n _event: LangchainAgentEvent,\n parentNodeId: string | undefined,\n data: SubagentProgressData,\n): void {\n const tool = agentToolNode(tree, parentNodeId);\n if (!tool || !parentNodeId) return;\n const toolInput =\n data.tool_input ??\n (typeof data.input === 'object' ? data.input : undefined);\n const nestedInput =\n toolInput && typeof toolInput === 'object' && !Array.isArray(toolInput)\n ? (toolInput as Record<string, unknown>)\n : null;\n const childToolCallId =\n (typeof data.child_tool_call_id === 'string' && data.child_tool_call_id) ||\n (nestedInput && typeof nestedInput.tool_call_id === 'string'\n ? nestedInput.tool_call_id\n : undefined);\n\n patchToolNode(tree, parentNodeId, {\n subagentProgress: applySubagentToolCall(tool.subagentProgress ?? [], {\n agentId: data.agent_id,\n subagentType: data.subagent_type,\n step: data.step ?? 0,\n toolName: data.tool_name,\n summary: data.summary ?? `calling ${data.tool_name}`,\n toolInput,\n childToolCallId,\n }),\n });\n}\n\nfunction handleSubagentToolResult(\n tree: SessionTree,\n _event: LangchainAgentEvent,\n parentNodeId: string | undefined,\n data: SubagentProgressData,\n): void {\n const tool = agentToolNode(tree, parentNodeId);\n if (!tool || !parentNodeId) return;\n patchToolNode(tree, parentNodeId, {\n subagentProgress: applySubagentToolResult(tool.subagentProgress ?? [], {\n agentId: data.agent_id,\n step: data.step ?? 0,\n toolName: data.tool_name,\n summary: data.summary ?? '',\n }),\n });\n}\n\nfunction handleStepStart(\n tree: SessionTree,\n event: LangchainAgentEvent,\n parentNodeId: string | undefined,\n seq: number,\n): void {\n const toolId = parentNodeId;\n if (toolId && tree.byId[toolId]?.kind === 'tool_call') {\n const tool = tree.byId[toolId] as ToolCallNode;\n const stepId = `step:${seq}`;\n const detail: StepDetail = {\n id: stepId,\n label: (event.data as { name?: string }).name ?? `step ${seq}`,\n status: 'running',\n startedAt: eventTimeToMs(event.timestamp),\n endedAt: null,\n };\n const details = ensureToolDetails(tool);\n patchToolNode(tree, toolId, {\n details: { ...details, steps: [...(details.steps ?? []), detail] },\n });\n return;\n }\n const id = `step:${seq}`;\n const node: StepNode = {\n kind: 'step',\n id,\n label: (event.data as { name?: string }).name ?? `step ${seq}`,\n status: 'running',\n startedAt: eventTimeToMs(event.timestamp),\n endedAt: null,\n };\n tree.byId[id] = node;\n appendToActiveParent(tree, id);\n}\n\nfunction handleStepFinish(\n tree: SessionTree,\n event: LangchainAgentEvent,\n parentNodeId: string | undefined,\n seq: number,\n): void {\n const toolId = parentNodeId;\n if (toolId && tree.byId[toolId]?.kind === 'tool_call') {\n const tool = tree.byId[toolId] as ToolCallNode;\n const steps = tool.details?.steps;\n if (steps && steps.length > 0) {\n const last = steps[steps.length - 1]!;\n const updated = [...steps.slice(0, -1), { ...last, status: 'done' as const, endedAt: eventTimeToMs(event.timestamp) }];\n patchToolNode(tree, toolId, {\n details: { ...ensureToolDetails(tool), steps: updated },\n });\n }\n return;\n }\n const id = `step:${seq}`;\n const existing = tree.byId[id] as StepNode | undefined;\n if (existing?.kind === 'step') {\n tree.byId[id] = { ...existing, status: 'done', endedAt: eventTimeToMs(event.timestamp) };\n }\n}\n\nfunction attachDebugToParent(\n tree: SessionTree,\n parentNodeId: string | undefined,\n event: LangchainAgentEvent,\n): void {\n if (!parentNodeId) return;\n const parent = tree.byId[parentNodeId];\n if (parent?.kind === 'tool_call') {\n const details = ensureToolDetails(parent);\n const debugLines = [\n ...(details.debugLines ?? []),\n { eventType: event.event_type, data: event.data },\n ];\n patchToolNode(tree, parentNodeId, { details: { ...details, debugLines } });\n } else if (parent?.kind === 'subagent') {\n const details = parent.details ?? {};\n const debugLines = [\n ...(details.debugLines ?? []),\n { eventType: event.event_type, data: event.data },\n ];\n tree.byId[parentNodeId] = {\n ...parent,\n details: { ...details, debugLines },\n };\n }\n}\n\nconst SYSTEM_SUMMARY_SOURCE_EVENTS = new Set([\n 'hook-finished',\n 'compact-start',\n 'compact-end',\n]);\n\nfunction isSystemSummarySourceEvent(eventType: string): boolean {\n return SYSTEM_SUMMARY_SOURCE_EVENTS.has(eventType);\n}\n\nfunction handleDebug(\n tree: SessionTree,\n event: LangchainAgentEvent,\n eventIndex: number,\n parentNodeId: string | undefined,\n collectDebug: boolean,\n): void {\n // 增量 task-* 事件仅诊断,不驱动可见 tasks(snapshot 为真值源)\n if (TASK_DEBUG_EVENT_TYPES.has(event.event_type)) {\n appendTaskDebugEvent(tree, event, eventIndex);\n }\n\n switch (event.event_type) {\n case 'hook-progress':\n handleHookProgress(tree, event);\n break;\n case 'hook-finished':\n handleHookFinished(tree, event);\n break;\n }\n\n if (isSystemSummarySourceEvent(event.event_type)) {\n tree.systemEvents.push({\n eventIndex,\n eventType: event.event_type,\n data: event.data,\n timestamp: eventTimeToMs(event.timestamp),\n });\n }\n if (collectDebug && !TASK_DEBUG_EVENT_TYPES.has(event.event_type)) {\n tree.debugEvents.push({\n eventIndex,\n eventType: event.event_type,\n data: event.data,\n });\n }\n attachDebugToParent(tree, parentNodeId, event);\n}\n\nfunction handlePermissionRequest(tree: SessionTree, event: LangchainAgentEvent, seq: number): void {\n const data = event.data as PermissionRequestData;\n const requestId = data.request_id;\n if (!requestId) return;\n const id = `permission:${requestId}`;\n const ask = data.ask_decision;\n const message =\n (typeof ask?.message === 'string' && ask.message) ||\n (typeof data.ask_prompt === 'string' && data.ask_prompt) ||\n 'Permission required';\n const node: PermissionNode = {\n kind: 'permission',\n id,\n requestId,\n toolName: data.tool_name ?? event.tool_name ?? 'unknown',\n message,\n askPrompt: typeof data.ask_prompt === 'string' ? data.ask_prompt : null,\n status: 'pending',\n startedAt: eventTimeToMs(event.timestamp),\n };\n tree.byId[id] = node;\n appendMainStageChild(tree, id, event, seq);\n}\n\n/**\n * 解析 SDK MEMORY_SAVED 事件 → MemorySavedNode(对齐 CLI MemorySavedSummaryHandler.parse)。\n *\n * 字段降级:\n * - written_paths 缺失/非数组 → 空数组\n * - count 缺失 → 用 written_paths.length 填充;非数字也回退\n * - count 与 paths 都为 0/空 → 不挂节点(避免无意义的 \"Saved 0 memories\")\n * - display_hint 缺失 → \"Saved N memory|memories\";无任何信号时 \"Memory updated\"\n */\nfunction handleMemorySaved(\n tree: SessionTree,\n event: LangchainAgentEvent,\n seq: number,\n): void {\n const data = (event.data as MemorySavedEventData) ?? {};\n const rawPaths = Array.isArray(data.written_paths) ? data.written_paths : [];\n const writtenPaths = rawPaths\n .map((p) => (typeof p === 'string' ? p.trim() : String(p).trim()))\n .filter((p) => p.length > 0);\n\n let count: number;\n if (typeof data.count === 'number' && Number.isFinite(data.count)) {\n count = data.count;\n } else {\n count = writtenPaths.length;\n }\n if (writtenPaths.length > 0) {\n count = Math.max(count, writtenPaths.length);\n }\n if (count <= 0 && writtenPaths.length === 0) {\n return;\n }\n\n const hint = typeof data.display_hint === 'string' ? data.display_hint.trim() : '';\n let displayHint: string;\n if (hint) {\n displayHint = hint;\n } else if (count > 0) {\n displayHint = `Saved ${count} ${count === 1 ? 'memory' : 'memories'}`;\n } else {\n displayHint = 'Memory updated';\n }\n\n const id = `memory_saved:${seq}`;\n const node: MemorySavedNode = {\n kind: 'memory_saved',\n id,\n count,\n writtenPaths,\n displayHint,\n startedAt: eventTimeToMs(event.timestamp),\n };\n tree.byId[id] = node;\n appendMainStageChild(tree, id, event, seq);\n}\n\nfunction handleUnknown(tree: SessionTree, event: LangchainAgentEvent, seq: number): void {\n const id = `unknown:${seq}`;\n const node: UnknownNode = {\n kind: 'unknown',\n id,\n eventType: event.event_type,\n rawData: event.data,\n startedAt: eventTimeToMs(event.timestamp),\n };\n tree.byId[id] = node;\n appendToActiveParent(tree, id);\n if (import.meta.env?.DEV) {\n console.warn(`[langchain_agentx_stream_ui] unknown event_type: ${event.event_type}`);\n }\n}\n\nfunction applyClassified(\n tree: SessionTree,\n classified: ReturnType<typeof classifyEvent>,\n eventIndex: number,\n options?: ReduceOptions,\n): void {\n const { event, tier, parentNodeId } = classified;\n const seq = eventIndex;\n\n if (tier === 'state') {\n switch (event.event_type) {\n case 'start':\n handleStart(tree, event);\n break;\n case 'finish':\n handleFinish(tree, event, seq);\n break;\n case 'task-list-snapshot':\n handleTaskListSnapshot(tree, event, eventIndex);\n break;\n default:\n break;\n }\n return;\n }\n\n if (tier === 'debug') {\n handleDebug(tree, event, eventIndex, parentNodeId, options?.collectDebug === true);\n return;\n }\n\n if (tier === 'collapsed') {\n switch (event.event_type) {\n case 'tool-input':\n handleToolInputCollapsed(tree, event, parentNodeId, seq);\n break;\n case 'tool-input-start':\n break;\n case 'tool-input-delta':\n handleToolInputDelta(tree, event, parentNodeId, seq);\n break;\n case 'tool-progress':\n handleToolProgress(tree, event, parentNodeId, seq);\n break;\n case 'subagent-start':\n handleSubagentBoundaryStart(tree, event, parentNodeId);\n break;\n case 'subagent-end':\n handleSubagentBoundaryEnd(tree, event, parentNodeId);\n break;\n case 'subagent-tool-call':\n handleSubagentToolCall(tree, event, parentNodeId, event.data as SubagentProgressData);\n break;\n case 'subagent-tool-result':\n handleSubagentToolResult(tree, event, parentNodeId, event.data as SubagentProgressData);\n break;\n case 'subagent-model-step':\n break;\n case 'start-step':\n handleStepStart(tree, event, parentNodeId, seq);\n break;\n case 'finish-step':\n handleStepFinish(tree, event, parentNodeId, seq);\n break;\n default:\n attachDebugToParent(tree, parentNodeId, event);\n break;\n }\n return;\n }\n\n switch (event.event_type) {\n case 'text-start':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n if (isSubagentScopedTextEvent(event.data as Record<string, unknown>)) break;\n handleTextStart(tree, event, seq);\n break;\n case 'text-delta':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n if (isSubagentScopedTextEvent(event.data as Record<string, unknown>)) break;\n handleTextDelta(tree, event, seq);\n break;\n case 'text-end':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n if (isSubagentScopedTextEvent(event.data as Record<string, unknown>)) break;\n handleTextEnd(tree, event);\n break;\n case 'reasoning-start':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n if (isSubagentScopedReasoningEvent(event.data as Record<string, unknown>)) break;\n handleReasoningStart(tree, event, seq);\n break;\n case 'reasoning-delta':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n if (isSubagentScopedReasoningEvent(event.data as Record<string, unknown>)) break;\n handleReasoningDelta(tree, event);\n break;\n case 'reasoning-end':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n if (isSubagentScopedReasoningEvent(event.data as Record<string, unknown>)) break;\n handleReasoningEnd(tree, event);\n break;\n case 'tool-call':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n handleToolCall(tree, event, seq);\n break;\n case 'tool-result':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n handleToolResult(tree, event, seq);\n break;\n case 'tool-artifact':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n handleToolResult(tree, event, seq);\n break;\n case 'tool-error':\n if (isDroppedByEmitterRoute(event.data as Record<string, unknown>)) break;\n handleToolError(tree, event, seq);\n break;\n case 'error': {\n const data = event.data as ErrorEventData;\n const { message, type } = resolveErrorEventFields(data);\n const id = `error:${seq}`;\n const node: ErrorNode = {\n kind: 'error',\n id,\n message,\n errorType: type,\n startedAt: eventTimeToMs(event.timestamp),\n };\n tree.byId[id] = node;\n appendMainStageChild(tree, id, event, seq);\n if (\n data.source === 'thin_layer' ||\n data.synthetic === true\n ) {\n tree.status = 'error';\n }\n break;\n }\n case 'permission-request':\n handlePermissionRequest(tree, event, seq);\n break;\n case 'memory-saved':\n handleMemorySaved(tree, event, seq);\n break;\n default:\n handleUnknown(tree, event, seq);\n }\n}\n\n/** Pure reducer: tree + event → new tree. */\nexport function reduceTree(\n tree: SessionTree,\n event: LangchainAgentEvent,\n eventIndex: number,\n options?: ReduceOptions,\n): SessionTree {\n const next = cloneTree(tree);\n const classified = classifyEvent(\n event,\n buildClassifyContext(next),\n options?.tierOverrides,\n eventIndex,\n );\n applyClassified(next, classified, eventIndex, options);\n\n if (event.session_id && !next.meta.sessionId) {\n next.meta.sessionId = event.session_id;\n }\n\n return next;\n}\n\n/** Reduce a sequence of events from empty tree. */\nexport function reduceEvents(\n events: LangchainAgentEvent[],\n options?: ReduceOptions,\n): SessionTree {\n return events.reduce(\n (tree, event, index) => reduceTree(tree, event, index, options),\n createEmptyTree(),\n );\n}\n\n/** Collect main-stage node ids for Timeline rendering. */\nexport function getMainStageIds(tree: SessionTree): string[] {\n return tree.rootChildren.filter((id) => {\n const node = tree.byId[id];\n if (!node) return false;\n if (node.kind === 'step') return false;\n if (node.kind === 'tool_call') {\n if (node.hidden) return false;\n return node.onMainStage !== false;\n }\n return true;\n });\n}\n\nexport function getNodeById(tree: SessionTree, id: string): SessionNode | undefined {\n return tree.byId[id];\n}\n\nexport function getChildIds(tree: SessionTree, parentId: string): string[] {\n if (parentId === 'root') return getMainStageIds(tree);\n const node = tree.byId[parentId];\n if (node?.kind === 'subagent') return node.childIds;\n return [];\n}\n","/**\n * 职责:离线回放纯函数,将 events[] 归并为 SessionTree。\n * 链路位置:测试、历史页、createReplaySource、AgentSession initialEvents 共用。\n * 当前裁剪范围:纯函数;禁止网络与 Date.now();复用 classify + reducer。\n */\nimport type { LangchainAgentEvent, TierOverrides } from '../types/events';\nimport type { SessionTree } from '../types/tree';\nimport { createEmptyTree } from '../types/tree';\nimport { reduceTree, type ReduceOptions } from './reducer';\n\nexport interface ReplayOptions {\n tierOverrides?: TierOverrides;\n collectDebug?: boolean;\n}\n\nfunction toReduceOptions(options?: ReplayOptions): ReduceOptions | undefined {\n if (!options?.tierOverrides && !options?.collectDebug) return undefined;\n return {\n tierOverrides: options.tierOverrides,\n collectDebug: options.collectDebug,\n };\n}\n\n/** 从空树回放完整事件序列。 */\nexport function replayEvents(\n events: LangchainAgentEvent[],\n options?: ReplayOptions,\n): SessionTree {\n return replayTree(createEmptyTree(), events, options);\n}\n\n/** 从已有树继续回放;startEventIndex 默认 0,续流时传 initialEvents.length。 */\nexport function replayTree(\n initialTree: SessionTree,\n events: LangchainAgentEvent[],\n options?: ReplayOptions & { startEventIndex?: number },\n): SessionTree {\n const reduceOpts = toReduceOptions(options);\n const startIndex = options?.startEventIndex ?? 0;\n return events.reduce(\n (tree, event, i) => reduceTree(tree, event, startIndex + i, reduceOpts),\n initialTree,\n );\n}\n","/**\n * renderModel.ts — Canonical / Renderable 投影契约\n *\n * 职责:\n * 定义 CanonicalNodeRef、RenderableEntry、ProjectionContext(Phase 1 SSOT)。\n *\n * 链路位置:\n * treeAdapter → RenderableTimelineProjector.project() → RenderableEntry[]。\n *\n * 当前裁剪范围:\n * 折叠 / 分组 payload 由 Phase 2+ accumulator 填充;本文件仅 contract。\n */\n\nexport type DisplayMode = 'normal' | 'brief_only' | 'transcript';\n\nexport type CanonicalNodeType =\n | 'text'\n | 'reasoning'\n | 'tool_use'\n | 'permission'\n | 'error'\n | 'unknown'\n /** @deprecated 方案 A 不再从 treeAdapter 产出;保留类型供历史 canonical 兼容。 */\n | 'subagent'\n | 'hook'\n | 'compact'\n | 'relevant_memories'\n | 'thinking_round'\n | 'thinking_summary'\n | 'memory_saved';\n\nexport interface CanonicalNodeRef {\n nodeId: string;\n type: CanonicalNodeType;\n payload: Record<string, unknown>;\n responseId?: string | null;\n}\n\nexport type RenderableEntryKind =\n | 'node'\n | 'collapsed_explore'\n | 'grouped_tool_use'\n | 'thinking_summary'\n | 'system_summary';\n\nexport interface RenderableEntry {\n kind: RenderableEntryKind;\n sourceNodeIds: string[];\n payload: Record<string, unknown>;\n}\n\nexport interface ToolUseSnapshot {\n tool_call_id: string;\n tool_name: unknown;\n tool_input: Record<string, unknown>;\n progress_text?: string;\n output?: string;\n is_error?: boolean;\n display?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n}\n\nexport interface CollapsedExplorePayload {\n summaryText: string | null;\n active: boolean;\n searchCount: number;\n readCount: number;\n listCount: number;\n bashCount: number;\n memoryReadCount: number;\n memoryWriteCount: number;\n memorySearchCount: number;\n relevantRecallCount: number;\n gitOpBashCount: number;\n mcpCallCount: number;\n readPaths: string[];\n searchArgs: string[];\n latestDisplayHint: string | null;\n shellProgressSuffix: string | null;\n toolUses: ToolUseSnapshot[];\n /** 所属轮次 ID */\n roundId: string | null;\n /** 关联的 reasoning 节点 ID */\n reasoningNodeId: string | null;\n}\n\nexport interface ProjectionContextOptions {\n displayMode: DisplayMode;\n verbose?: boolean;\n /** CC/CLI normal:false → 不 emit thinking_summary;时间线不 mount reasoning */\n showReasoningInTimeline?: boolean;\n /** 方案 A:任务列表已展示时 suppress 纯 thought 的 thinking_summary */\n hasEverShownTaskList?: boolean;\n memoryDir?: string | null;\n workspaceRoot?: string | null;\n silentTools?: ReadonlySet<string>;\n exploreFullscreenBash?: boolean;\n}\n\nexport class ProjectionContext {\n readonly displayMode: DisplayMode;\n readonly verbose: boolean;\n readonly showReasoningInTimeline: boolean;\n readonly hasEverShownTaskList: boolean;\n readonly memoryDir: string | null;\n readonly workspaceRoot: string | null;\n readonly silentTools: ReadonlySet<string>;\n readonly exploreFullscreenBash: boolean;\n\n constructor(options: ProjectionContextOptions) {\n this.displayMode = options.displayMode;\n this.verbose = options.verbose ?? false;\n this.showReasoningInTimeline = options.showReasoningInTimeline ?? this.verbose;\n this.hasEverShownTaskList = options.hasEverShownTaskList ?? false;\n this.memoryDir = options.memoryDir ?? null;\n this.workspaceRoot = options.workspaceRoot ?? null;\n this.silentTools = options.silentTools ?? DEFAULT_SILENT_TOOLS;\n this.exploreFullscreenBash = options.exploreFullscreenBash ?? true;\n }\n\n withHasEverShownTaskList(hasEverShownTaskList: boolean): ProjectionContext {\n return new ProjectionContext({\n displayMode: this.displayMode,\n verbose: this.verbose,\n showReasoningInTimeline: this.showReasoningInTimeline,\n hasEverShownTaskList,\n memoryDir: this.memoryDir,\n workspaceRoot: this.workspaceRoot,\n silentTools: this.silentTools,\n exploreFullscreenBash: this.exploreFullscreenBash,\n });\n }\n\n get transcript(): boolean {\n return this.displayMode === 'transcript';\n }\n\n get briefOnly(): boolean {\n return this.displayMode === 'brief_only';\n }\n\n get normal(): boolean {\n return this.displayMode === 'normal';\n }\n\n /** 对齐 CLI ProjectionContext.should_apply_grouping */\n shouldApplyGrouping(): boolean {\n return !this.verbose;\n }\n\n /** 对齐 CLI ProjectionContext.should_show_explore_detail */\n shouldShowExploreDetail(): boolean {\n return this.verbose || this.transcript;\n }\n\n /** CC normal:emit thinking_summary(Thought for Ns);reasoning 全文仍由 showReasoningInTimeline 控制 */\n shouldEmitThinkingSummary(): boolean {\n return !this.briefOnly;\n }\n\n /** compact normal / 任务模式:不 emit 无 explore 的 thought-only thinking_summary */\n shouldSuppressThoughtOnlySummary(): boolean {\n return !this.showReasoningInTimeline || this.hasEverShownTaskList;\n }\n}\n\nimport { SILENT_TASK_TOOL_NAMES } from '../../view/tools/toolNames';\n\n/** 默认折叠 SDK Task* 内部工具;宿主可通过 silentTools 覆盖 */\nexport const DEFAULT_SILENT_TOOLS: ReadonlySet<string> = new Set(SILENT_TASK_TOOL_NAMES);\n\nexport function createProjectionContext(\n options: ProjectionContextOptions,\n): ProjectionContext {\n return new ProjectionContext(options);\n}\n","/**\n * sessionViewOptions.ts — Timeline 布局、权限 UI 与 Projection 视图上下文\n *\n * 对齐参考:详设 07 · CLI ProjectionContext · CC display mode / verbose\n */\n\nimport {\n createProjectionContext,\n type DisplayMode,\n type ProjectionContext,\n} from '../core/projection/renderModel';\nimport type { ToolBodyMode } from './tools/types';\n\n/** standalone:V2-D 独立 PermissionCard;inline:挂到 ToolCallShell;both:双轨 */\nexport type PermissionUiMode = 'standalone' | 'inline' | 'both';\n\n/** 对齐 CLI DisplayMode.value;SSOT 在 core/projection/renderModel */\nexport type { DisplayMode };\n\nexport interface SessionViewOptions {\n /**\n * @deprecated Phase 4 起由 core/projection GroupedToolUseAccumulator 替代。\n * 在 projection 全量接入前,TimelineEntries 仍读取此开关。\n */\n groupParallelTools: boolean;\n /** 权限 UI 策略(T4.6);后台 bypass 时通常无 pending */\n permissionUiMode: PermissionUiMode;\n /** 对齐 CC verbose / transcript:展开 reasoning 全文;默认 false 仅一行 ∴ Thinking */\n verboseReasoning: boolean;\n /** 对齐 CLI Normal;explore 折叠默认开启 */\n displayMode: DisplayMode;\n /** 对齐 CC verbose;为 true 时跳过分组(shouldApplyGrouping) */\n verbose: boolean;\n /** 对齐 CLI_EXPLORE_FULLSCREEN_BASH;控制 bash 桶计数 */\n exploreFullscreenBash: boolean;\n /** memory 工具路径分类;宿主注入 workspace memory 目录 */\n memoryDir?: string | null;\n workspaceRoot?: string | null;\n}\n\nexport const DEFAULT_SESSION_VIEW_OPTIONS: SessionViewOptions = {\n groupParallelTools: false,\n permissionUiMode: 'standalone',\n verboseReasoning: false,\n displayMode: 'normal',\n verbose: false,\n exploreFullscreenBash: true,\n memoryDir: null,\n workspaceRoot: null,\n};\n\n/** Phase 1+ ProjectionContext 语义预览(仍由 SessionViewOptions 驱动) */\nexport interface ProjectionViewContext {\n displayMode: DisplayMode;\n verbose: boolean;\n exploreFullscreenBash: boolean;\n memoryDir: string | null;\n workspaceRoot: string | null;\n}\n\nexport function buildProjectionViewContext(\n options: SessionViewOptions = DEFAULT_SESSION_VIEW_OPTIONS,\n): ProjectionViewContext {\n return {\n displayMode: options.displayMode,\n verbose: options.verbose,\n exploreFullscreenBash: options.exploreFullscreenBash,\n memoryDir: options.memoryDir ?? null,\n workspaceRoot: options.workspaceRoot ?? null,\n };\n}\n\n/** SessionViewOptions → ProjectionContext(Phase 1+ projector 入口) */\nexport function buildProjectionContext(\n options: SessionViewOptions = DEFAULT_SESSION_VIEW_OPTIONS,\n): ProjectionContext {\n return createProjectionContext({\n displayMode: options.displayMode,\n verbose: options.verbose,\n showReasoningInTimeline: shouldShowReasoningInTimeline(options),\n exploreFullscreenBash: options.exploreFullscreenBash,\n memoryDir: options.memoryDir ?? null,\n workspaceRoot: options.workspaceRoot ?? null,\n });\n}\n\n/** 对齐 CLI ProjectionContext.shouldApplyGrouping() */\nexport function shouldApplyGrouping(options: SessionViewOptions): boolean {\n return !options.verbose;\n}\n\n/** 对齐 CLI ProjectionContext.shouldShowExploreDetail() */\nexport function shouldShowExploreDetail(\n options: Pick<SessionViewOptions, 'verbose' | 'displayMode'>,\n): boolean {\n return options.verbose || options.displayMode === 'transcript';\n}\n\n/** 对齐 CC/CLI effective_verbose:时间线是否展示 reasoning 全文与 thinking 产物 */\nexport function shouldShowReasoningInTimeline(\n options: Pick<SessionViewOptions, 'verboseReasoning' | 'verbose' | 'displayMode'>,\n): boolean {\n return (\n options.verboseReasoning || options.verbose || options.displayMode === 'transcript'\n );\n}\n\n/** CC normal:紧凑叙事(Thought+explore 合并行 + ● 正文;reasoning 全文仅 transcript) */\nexport function shouldUseCompactNarrative(\n options: Pick<SessionViewOptions, 'verboseReasoning' | 'verbose' | 'displayMode'>,\n): boolean {\n return !shouldShowExploreDetail(options) && !shouldShowReasoningInTimeline(options);\n}\n\n/** transcript / verbose 时 V3 ToolBody 默认 FULL(详设 I07) */\nexport function resolveEffectiveToolBodyMode(\n options: SessionViewOptions,\n defaultMode: ToolBodyMode,\n): ToolBodyMode {\n if (options.verbose || options.displayMode === 'transcript') {\n return 'full';\n }\n return defaultMode;\n}\n\n/**\n * 旧 View 层 groupParallelTools 开关:与 projection 分组并存时的过渡策略。\n * projection 接入后 Timeline 不再读此值。\n */\nexport function shouldApplyLegacyParallelGrouping(options: SessionViewOptions): boolean {\n return options.groupParallelTools && shouldApplyGrouping(options);\n}\n","/**\n * 职责:React hook,对 events[] 做 memo 化 replayEvents。\n * 链路位置:只读历史页、Story;不订阅 live Source。\n * 当前裁剪范围:单会话;options 引用变化时重算。\n */\nimport { useMemo } from 'react';\n\nimport { replayEvents, type ReplayOptions } from '../replay';\nimport type { LangchainAgentEvent } from '../../types/events';\nimport type { SessionTree } from '../../types/tree';\n\nexport function useReplayTree(\n events: LangchainAgentEvent[],\n options?: ReplayOptions,\n): SessionTree {\n return useMemo(\n () => replayEvents(events, options),\n [events, options?.tierOverrides, options?.collectDebug],\n );\n}\n","/**\n * 职责:useActiveSession — 订阅 MultiSessionStore 活跃会话。\n * 链路位置:MultiAgentSession 子树;业务切换 Tab 时读取/设置 activeSessionId。\n * 当前裁剪范围:只读 tree + setActiveSessionId;不含 Source 管理。\n */\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { useMultiSessionStoreApi } from '../context/SessionContext';\nimport type { MultiSessionStoreState } from '../sessionStore';\nimport { createEmptyTree, type SessionTree } from '../../types/tree';\n\nexport interface ActiveSessionView {\n activeSessionId: string | null;\n tree: SessionTree;\n setActiveSessionId: MultiSessionStoreState['setActiveSessionId'];\n}\n\nexport function useActiveSession(): ActiveSessionView {\n const store = useMultiSessionStoreApi();\n return useStore(\n store,\n useShallow((state: MultiSessionStoreState) => ({\n activeSessionId: state.activeSessionId,\n tree:\n state.activeSessionId && state.sessions[state.activeSessionId]\n ? state.sessions[state.activeSessionId].tree\n : createEmptyTree(),\n setActiveSessionId: state.setActiveSessionId,\n })),\n );\n}\n","/**\r\r\n * 职责:向 React 子树注入 zustand SessionStore 与 NodeRegistry。\r\r\n * 链路位置:AgentSession 顶层 Provider。\r\r\n * 当前裁剪范围:单会话与多会话 store 注入;MultiAgentSession 同时提供 bridge SessionStore。\r\r\n */\r\r\nimport { createContext, useContext } from 'react';\r\r\n\r\r\nimport type { SessionStore } from '../store';\r\r\nimport type { MultiSessionStore } from '../sessionStore';\r\r\nimport type { NodeRegistry } from '../../view/NodeRegistry';\r\r\nimport type { ToolDisplayRegistry } from '../../view/tools/registry';\r\r\nimport type { ToolBodyMode } from '../../view/tools/types';\r\r\nimport { createDefaultToolRegistry } from '../../view/tools/registry';\r\r\nimport {\r\r\n DEFAULT_SESSION_VIEW_OPTIONS,\r\r\n type SessionViewOptions,\r\r\n} from '../../view/sessionViewOptions';\r\r\n\r\r\nexport type {\r\r\n MarkdownRenderer,\r\r\n MarkdownRendererProps,\r\r\n} from './MarkdownRendererContext';\r\r\n\r\r\nexport const SessionStoreContext = createContext<SessionStore | null>(null);\r\r\nexport const MultiSessionStoreContext = createContext<MultiSessionStore | null>(null);\r\r\nexport const NodeRegistryContext = createContext<NodeRegistry | null>(null);\r\r\nexport const SessionViewOptionsContext = createContext<SessionViewOptions>(\r\r\n DEFAULT_SESSION_VIEW_OPTIONS,\r\r\n);\r\r\n\r\r\nexport interface ToolDisplayOptions {\r\r\n registry: ToolDisplayRegistry;\r\r\n defaultBodyMode: ToolBodyMode;\r\r\n}\r\r\n\r\r\nconst DEFAULT_TOOL_DISPLAY: ToolDisplayOptions = {\r\r\n registry: createDefaultToolRegistry(),\r\r\n defaultBodyMode: 'preview',\r\r\n};\r\r\n\r\r\nexport const ToolDisplayOptionsContext = createContext<ToolDisplayOptions>(DEFAULT_TOOL_DISPLAY);\r\r\n\r\r\nexport function useSessionStoreApi(): SessionStore {\r\r\n const store = useContext(SessionStoreContext);\r\r\n if (!store) {\r\r\n throw new Error('useSessionStoreApi must be used within AgentSession or MultiAgentSession');\r\r\n }\r\r\n return store;\r\r\n}\r\r\n\r\r\nexport function useMultiSessionStoreApi(): MultiSessionStore {\r\r\n const store = useContext(MultiSessionStoreContext);\r\r\n if (!store) {\r\r\n throw new Error('useMultiSessionStoreApi must be used within MultiAgentSession');\r\r\n }\r\r\n return store;\r\r\n}\r\r\n\r\r\nexport function useNodeRegistry(): NodeRegistry {\r\r\n const registry = useContext(NodeRegistryContext);\r\r\n if (!registry) {\r\r\n throw new Error('useNodeRegistry must be used within AgentSession');\r\r\n }\r\r\n return registry;\r\r\n}\r\r\n\r\r\nexport function useToolDisplayOptions(): ToolDisplayOptions {\r\r\n return useContext(ToolDisplayOptionsContext);\r\r\n}\r\r\n\r\r\nexport function useSessionViewOptions(): SessionViewOptions {\r\r\n return useContext(SessionViewOptionsContext);\r\r\n}\r\r\n\r","/**\n * 职责:useSessionIds — 返回 LRU 顺序的 sessionId 列表。\n * 链路位置:MultiAgentSession 会话 Tab 列表。\n * 当前裁剪范围:只读 order;最近活跃在后。\n */\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { useMultiSessionStoreApi } from '../context/SessionContext';\nimport type { MultiSessionStoreState } from '../sessionStore';\n\nexport function useSessionIds(): string[] {\n const store = useMultiSessionStoreApi();\n return useStore(store, useShallow((state: MultiSessionStoreState) => state.order));\n}\n","/**\n * bashExplore.ts — Bash 探索分类与 hint 格式化(对齐 CC / CLI)\n *\n * 职责:\n * 判断 bash command 是否归入 search/read/list/bash 桶;提供 commandAsHint。\n *\n * 链路位置:\n * ToolProjectionClassifier → ExploreCollapseAccumulator hint 字段。\n *\n * 当前裁剪范围:\n * exploreFullscreenBash 由 ProjectionContext 注入,不读 process.env。\n */\n\nconst BASH_SEARCH = new Set(['find', 'grep', 'rg', 'ag', 'ack', 'locate', 'which', 'whereis']);\nconst BASH_READ = new Set([\n 'cat',\n 'head',\n 'tail',\n 'less',\n 'more',\n 'wc',\n 'stat',\n 'file',\n 'strings',\n 'jq',\n 'awk',\n 'cut',\n 'sort',\n 'uniq',\n 'tr',\n]);\nconst BASH_LIST = new Set(['ls', 'tree', 'du']);\nconst BASH_NEUTRAL = new Set(['echo', 'printf', 'true', 'false', ':']);\nconst REDIRECTS = new Set(['>', '>>', '>&']);\nconst MAX_HINT_CHARS = 300;\nconst GIT_OPERATION =\n /\\bgit\\s+(commit|push|pull|merge|rebase|cherry-pick|checkout\\s+-b|branch|tag)\\b/i;\n\nexport function splitCommandWithOperators(command: string): string[] {\n if (!command.trim()) return [];\n return command\n .trim()\n .split(/\\s*(&&|\\|\\||\\||;)\\s*/)\n .filter((part) => part.length > 0);\n}\n\nexport function classifyBashCommand(command: string): {\n isSearch: boolean;\n isRead: boolean;\n isList: boolean;\n} {\n try {\n const parts = splitCommandWithOperators(command);\n if (parts.length === 0) {\n return { isSearch: false, isRead: false, isList: false };\n }\n\n let hasSearch = false;\n let hasRead = false;\n let hasList = false;\n let hasNonNeutral = false;\n let skipNextRedirectTarget = false;\n\n for (const part of parts) {\n if (skipNextRedirectTarget) {\n skipNextRedirectTarget = false;\n continue;\n }\n if (REDIRECTS.has(part)) {\n skipNextRedirectTarget = true;\n continue;\n }\n if (part === '||' || part === '&&' || part === '|' || part === ';') {\n continue;\n }\n const base = part.trim().split(/\\s+/)[0] ?? '';\n if (!base) continue;\n if (BASH_NEUTRAL.has(base)) continue;\n\n hasNonNeutral = true;\n const isPartSearch = BASH_SEARCH.has(base);\n const isPartRead = BASH_READ.has(base);\n const isPartList = BASH_LIST.has(base);\n if (!isPartSearch && !isPartRead && !isPartList) {\n return { isSearch: false, isRead: false, isList: false };\n }\n if (isPartSearch) hasSearch = true;\n if (isPartRead) hasRead = true;\n if (isPartList) hasList = true;\n }\n\n if (!hasNonNeutral) {\n return { isSearch: false, isRead: false, isList: false };\n }\n return { isSearch: hasSearch, isRead: hasRead, isList: hasList };\n } catch {\n return { isSearch: false, isRead: false, isList: false };\n }\n}\n\nexport function commandAsHint(command: string): string {\n const cleaned =\n '$ ' +\n command\n .split('\\n')\n .map((segment) => segment.replace(/\\s+/g, ' ').trim())\n .filter((line) => line.length > 0)\n .join('\\n');\n if (cleaned.length > MAX_HINT_CHARS) {\n return `${cleaned.slice(0, MAX_HINT_CHARS - 1)}…`;\n }\n return cleaned;\n}\n\n/** G06:bash 内 git 写操作(commit/push 等),不计入 explore bash 桶 */\nexport function isGitOperationCommand(command: string): boolean {\n return GIT_OPERATION.test(command.trim());\n}\n\n/** G06:MCP 工具名识别 */\nexport function isMcpToolName(toolName: string | null | undefined): boolean {\n const name = (toolName ?? '').trim().toLowerCase();\n if (!name) return false;\n return name.startsWith('mcp__') || name.startsWith('mcp_') || name.includes('mcp-server');\n}\n","/**\n * memoryPaths.ts — memory 工具路径识别 SSOT(对齐 CLI memory_paths.py)\n *\n * 职责:\n * 判断 write/read/grep/glob/bash 是否针对 auto-managed memory 目录。\n *\n * 链路位置:\n * ToolProjectionClassifier.memorySubkind() → ExploreCollapseAccumulator。\n *\n * 当前裁剪范围:\n * 基于 memoryDir + workspaceRoot 路径前缀;不含 SDK is_agent_memory_path。\n */\n\nimport { Bash, Edit, Glob, Grep, Read, Write } from '../../view/tools/toolNames';\n\nexport const MemoryKind = {\n Write: 'Write',\n Read: 'Read',\n Search: 'Search',\n} as const;\n\nexport type MemoryToolKind = (typeof MemoryKind)[keyof typeof MemoryKind];\n\nconst MEMORY_WRITE_TOOLS = new Set([Write, Edit]);\nconst MEMORY_READ_TOOLS = new Set([Read]);\nconst MEMORY_SEARCH_TOOLS = new Set([Grep, Glob, Bash]);\n\nfunction normalizePath(raw: string): string {\n return raw.replace(/\\\\/g, '/');\n}\n\nfunction resolvePath(raw: string, workspaceRoot: string | null): string {\n const normalized = normalizePath(raw.trim());\n if (/^[A-Za-z]:\\//.test(normalized) || normalized.startsWith('/')) {\n return normalized;\n }\n if (workspaceRoot) {\n const root = normalizePath(workspaceRoot).replace(/\\/$/, '');\n return `${root}/${normalized.replace(/^\\.\\//, '')}`;\n }\n return normalized;\n}\n\nfunction isUnderDir(path: string, root: string): boolean {\n const p = normalizePath(path).replace(/\\/$/, '');\n const r = normalizePath(root).replace(/\\/$/, '');\n if (p === r) return true;\n return p.startsWith(`${r}/`);\n}\n\nexport function isMemoryPath(path: string, memoryDir: string): boolean {\n return isUnderDir(resolvePath(path, null), normalizePath(memoryDir));\n}\n\nfunction pathFromToolIo(\n toolInput: Record<string, unknown> | null | undefined,\n display: Record<string, unknown> | null | undefined,\n): string | null {\n if (toolInput) {\n for (const key of ['file_path', 'path']) {\n const raw = toolInput[key];\n if (typeof raw === 'string' && raw.trim()) return raw.trim();\n }\n }\n if (display) {\n const raw = display.file_path;\n if (typeof raw === 'string' && raw.trim()) return raw.trim();\n }\n return null;\n}\n\nfunction isAutoManagedMemoryPattern(pattern: string): boolean {\n const g = normalizePath(pattern);\n if (g.includes('agent-memory/') || g.includes('agent-memory-local/')) return true;\n if (g.includes('session-memory') && (g.includes('.md') || g.endsWith('*'))) return true;\n return false;\n}\n\nfunction isMemoryDirectory(dirPath: string, memoryDir: string): boolean {\n if (isUnderDir(dirPath, memoryDir)) return true;\n const normalized = normalizePath(dirPath);\n if (normalized.includes('/agent-memory/') || normalized.includes('/agent-memory-local/')) {\n return true;\n }\n if (normalized.includes('/session-memory/')) return true;\n return false;\n}\n\nfunction isShellCommandTargetingMemory(\n command: string,\n memoryDir: string,\n workspaceRoot: string | null,\n): boolean {\n if (!command.trim()) return false;\n const cmdCmp = normalizePath(command).toLowerCase();\n const memName = normalizePath(memoryDir).split('/').pop()?.toLowerCase() ?? 'memory';\n const markers = [\n memName,\n '.langchain_agentx/memory',\n 'agent-memory/',\n 'agent-memory-local/',\n 'session-memory/',\n ];\n if (!markers.some((m) => cmdCmp.includes(m))) return false;\n\n const pathPattern = /(?:[A-Za-z]:[/\\\\]|\\/)[^\\s'\"]+/g;\n for (const match of command.matchAll(pathPattern)) {\n const clean = match[0].replace(/[,;|&>]+$/, '');\n const resolved = resolvePath(clean, workspaceRoot);\n if (isMemoryPath(resolved, memoryDir) || isMemoryDirectory(resolved, memoryDir)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isMemorySearch(\n toolName: string,\n toolInput: Record<string, unknown> | null | undefined,\n memoryDir: string,\n workspaceRoot: string | null,\n): boolean {\n if (!toolInput) return false;\n const name = toolName.trim();\n if (name === Bash) {\n const cmd = toolInput.command;\n return (\n typeof cmd === 'string' &&\n isShellCommandTargetingMemory(cmd, memoryDir, workspaceRoot)\n );\n }\n const rawPath = toolInput.path;\n if (typeof rawPath === 'string' && rawPath.trim()) {\n const resolved = resolvePath(rawPath.trim(), workspaceRoot);\n if (isMemoryPath(resolved, memoryDir) || isMemoryDirectory(resolved, memoryDir)) {\n return true;\n }\n }\n const rawGlob = toolInput.glob;\n if (typeof rawGlob === 'string' && rawGlob.trim()) {\n const g = rawGlob.trim();\n if (isAutoManagedMemoryPattern(g)) return true;\n const gNorm = normalizePath(g);\n const memRel = normalizePath(memoryDir).split('/').pop() ?? 'memory';\n if (gNorm.includes(memRel) || gNorm.includes('.langchain_agentx/memory') || gNorm.includes('memory/')) {\n return true;\n }\n }\n return false;\n}\n\nexport function classifyMemoryTool(\n toolName: string,\n toolInput: Record<string, unknown> | null | undefined,\n options: { memoryDir: string; workspaceRoot?: string | null; display?: Record<string, unknown> | null },\n): MemoryToolKind | null {\n const name = toolName.trim();\n const { memoryDir, workspaceRoot = null, display = null } = options;\n\n if (MEMORY_WRITE_TOOLS.has(name)) {\n const raw = pathFromToolIo(toolInput, display);\n if (!raw) return null;\n if (isMemoryPath(resolvePath(raw, workspaceRoot), memoryDir)) return MemoryKind.Write;\n return null;\n }\n\n if (MEMORY_READ_TOOLS.has(name)) {\n const raw = pathFromToolIo(toolInput, display);\n if (!raw) return null;\n if (isMemoryPath(resolvePath(raw, workspaceRoot), memoryDir)) return MemoryKind.Read;\n return null;\n }\n\n if (MEMORY_SEARCH_TOOLS.has(name)) {\n if (isMemorySearch(name, toolInput, memoryDir, workspaceRoot)) return MemoryKind.Search;\n }\n\n return null;\n}\n","/**\n * classify.ts — 工具投影分类(CollapseKind)\n *\n * 职责:\n * 将 tool_use 归类为 Read / Search / List / Bash / Memory / None。\n *\n * 链路位置:\n * RenderableTimelineProjector → ToolProjectionClassifier(Phase 2+ accumulator 消费)。\n *\n * 当前裁剪范围:\n * bash 重分类与 memory 路径识别;对齐 CLI classify.py。\n */\n\nimport {\n Bash,\n Glob,\n Grep,\n Read,\n} from '../../view/tools/toolNames';\nimport { classifyBashCommand, isMcpToolName } from './bashExplore';\nimport { classifyMemoryTool, type MemoryToolKind } from './memoryPaths';\nimport type { ProjectionContext } from './renderModel';\n\nconst READ_TOOLS = new Set([Read]);\nconst SEARCH_TOOLS = new Set([Grep]);\nconst LIST_TOOLS = new Set([Glob]);\nconst BASH_TOOLS = new Set([Bash]);\n\nexport enum CollapseKind {\n None = 'None',\n Read = 'Read',\n Search = 'Search',\n List = 'List',\n Bash = 'Bash',\n Memory = 'Memory',\n Mcp = 'Mcp',\n}\n\nexport class ToolProjectionClassifier {\n constructor(private readonly context: ProjectionContext) {}\n\n getContext(): ProjectionContext {\n return this.context;\n }\n\n isSilentTool(toolName: string | null | undefined): boolean {\n if (!toolName) return false;\n return this.context.silentTools.has(toolName);\n }\n\n classifyTool(\n toolName: string | null | undefined,\n toolInput?: Record<string, unknown> | null,\n display?: Record<string, unknown> | null,\n ): CollapseKind {\n const name = (toolName ?? '').trim();\n if (!name || this.isSilentTool(name)) {\n return CollapseKind.None;\n }\n\n if (isMcpToolName(name)) {\n return CollapseKind.Mcp;\n }\n\n const memoryKind = this.memorySubkind(name, toolInput, display);\n if (memoryKind !== null) {\n return CollapseKind.Memory;\n }\n\n if (READ_TOOLS.has(name)) return CollapseKind.Read;\n if (SEARCH_TOOLS.has(name)) return CollapseKind.Search;\n if (LIST_TOOLS.has(name)) return CollapseKind.List;\n if (BASH_TOOLS.has(name)) {\n const command = toolInput?.command;\n if (typeof command === 'string' && command.trim()) {\n const { isSearch, isRead, isList } = classifyBashCommand(command);\n if (isSearch) return CollapseKind.Search;\n if (isList) return CollapseKind.List;\n if (isRead) return CollapseKind.Read;\n }\n if (this.context.exploreFullscreenBash) return CollapseKind.Bash;\n return CollapseKind.None;\n }\n return CollapseKind.None;\n }\n\n isExploreCollapsible(\n toolName: string | null | undefined,\n toolInput?: Record<string, unknown> | null,\n display?: Record<string, unknown> | null,\n ): boolean {\n return this.classifyTool(toolName, toolInput, display) !== CollapseKind.None;\n }\n\n memorySubkind(\n toolName: string | null | undefined,\n toolInput?: Record<string, unknown> | null,\n display?: Record<string, unknown> | null,\n ): MemoryToolKind | null {\n if (this.context.shouldShowExploreDetail()) return null;\n const memoryDir = this.context.memoryDir;\n if (!memoryDir) return null;\n return classifyMemoryTool(toolName ?? '', toolInput ?? null, {\n memoryDir,\n workspaceRoot: this.context.workspaceRoot,\n display: display ?? null,\n });\n }\n}\n\nexport type { MemoryToolKind };\n","/**\n * constants.ts — Renderable Projection 常量 SSOT\n *\n * 职责:\n * 分组工具名等与 CLI D13、grouped_tool_use.py 对齐的 frozen 集合。\n *\n * 链路位置:\n * Phase 1+ classifier / GroupedToolUseAccumulator 消费;Phase 0 定标与单测。\n *\n * 当前裁剪范围:\n * 不含 explore CollapseKind 枚举(Phase 2 classify.ts)。\n */\n\nimport { Agent } from '../../view/tools/toolNames';\n\n/** 对齐 CLI GROUPABLE_TOOL_NAMES · CC applyGrouping 仅 Agent */\nexport const GROUPABLE_TOOL_NAMES: ReadonlySet<string> = new Set([Agent]);\n\nexport function isGroupableToolName(toolName: string): boolean {\n return GROUPABLE_TOOL_NAMES.has(toolName);\n}\n","/**\n * mountCandidates.ts — renderable → Timeline mount 候选\n *\n * 职责:\n * 根据 RenderableEntry[] 计算 entryKey、过滤被 collapsed / grouped 吸收的原子行。\n *\n * 链路位置:\n * useProjectedTimeline / TimelineEntries 消费。\n *\n * 当前裁剪范围:\n * 对齐 CLI renderable_mount.py;B02 禁止 explore 双重 mount。\n */\n\nimport { isGroupableToolName } from './constants';\nimport type { ToolProjectionClassifier } from './classify';\nimport type { CanonicalNodeRef, RenderableEntry } from './renderModel';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isToolUseEntry(entry: RenderableEntry): boolean {\n return entry.kind === 'node' && entry.payload.canonicalType === 'tool_use';\n}\n\nexport function entryKey(entry: RenderableEntry): string {\n switch (entry.kind) {\n case 'collapsed_explore': {\n const ids = entry.sourceNodeIds;\n return ids.length > 0 ? `collapsed_explore:${ids.join(',')}` : 'collapsed_explore:';\n }\n case 'grouped_tool_use': {\n const messageId = entry.payload.messageId ?? entry.payload.message_id;\n const toolName = entry.payload.toolName ?? entry.payload.tool_name;\n if (typeof messageId === 'string' && typeof toolName === 'string') {\n return `grouped:${messageId}:${toolName}`;\n }\n const ids = entry.sourceNodeIds;\n return ids.length > 0 ? `grouped_tool_use:${ids.join(',')}` : 'grouped_tool_use:';\n }\n case 'system_summary': {\n const id = entry.sourceNodeIds[0];\n return id ? `system_summary:${id}` : 'system_summary:';\n }\n default: {\n const id = entry.sourceNodeIds[0];\n return id ? `node:${id}` : 'node:';\n }\n }\n}\n\nfunction hasCollapsedExplore(entries: RenderableEntry[]): boolean {\n return entries.some((entry) => entry.kind === 'collapsed_explore');\n}\n\nfunction groupedSuppressedNodeIds(entries: RenderableEntry[]): Set<string> {\n const ids = new Set<string>();\n for (const entry of entries) {\n if (entry.kind !== 'grouped_tool_use') continue;\n const nodeIds = entry.payload.nodeIds;\n if (Array.isArray(nodeIds)) {\n for (const id of nodeIds) {\n if (typeof id === 'string') ids.add(id);\n }\n }\n for (const id of entry.sourceNodeIds) ids.add(id);\n }\n return ids;\n}\n\nexport function iterMountCandidates(\n entries: RenderableEntry[],\n options: {\n classifier: ToolProjectionClassifier | null;\n exploreDetail: boolean;\n hideStandalonePermissions?: boolean;\n showReasoningInTimeline?: boolean;\n compactNarrative?: boolean;\n },\n): Array<[string, RenderableEntry]> {\n const out: Array<[string, RenderableEntry]> = [];\n const collapsedPresent = hasCollapsedExplore(entries);\n const groupedSuppressed = groupedSuppressedNodeIds(entries);\n const {\n classifier,\n exploreDetail,\n hideStandalonePermissions = false,\n showReasoningInTimeline = false,\n compactNarrative = false,\n } = options;\n for (const entry of entries) {\n if (\n !showReasoningInTimeline &&\n entry.kind === 'node' &&\n entry.payload.canonicalType === 'reasoning'\n ) {\n continue;\n }\n\n if (\n entry.kind === 'grouped_tool_use' ||\n entry.kind === 'system_summary'\n ) {\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n if (entry.kind === 'collapsed_explore') {\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n if (entry.kind === 'thinking_summary') {\n // compact 模式:纯 thought 摘要已在 projector 层 suppress;此处兜底过滤残留 entry\n if (compactNarrative && entry.payload.exploreNodeId == null) continue;\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n if (\n hideStandalonePermissions &&\n entry.kind === 'node' &&\n entry.payload.canonicalType === 'permission'\n ) {\n continue;\n }\n\n if (!isToolUseEntry(entry)) {\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n const parentToolUseId = entry.payload.parent_tool_use_id;\n if (typeof parentToolUseId === 'string' && parentToolUseId.trim()) {\n continue;\n }\n\n const nodeId = entry.sourceNodeIds[0];\n const toolName = entry.payload.tool_name;\n if (\n nodeId &&\n groupedSuppressed.has(nodeId) &&\n typeof toolName === 'string' &&\n isGroupableToolName(toolName)\n ) {\n continue;\n }\n\n const progress = entry.payload.progress_text;\n const waitingPermission =\n typeof progress === 'string' && progress.includes('Waiting for permission');\n\n if (waitingPermission) {\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n if (exploreDetail) {\n if (collapsedPresent) {\n const toolInput = isRecord(entry.payload.tool_input) ? entry.payload.tool_input : null;\n const display = isRecord(entry.payload.display) ? entry.payload.display : null;\n if (\n classifier?.isExploreCollapsible(\n typeof toolName === 'string' ? toolName : null,\n toolInput,\n display,\n )\n ) {\n continue;\n }\n }\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n if (!classifier) {\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n const toolInput = isRecord(entry.payload.tool_input) ? entry.payload.tool_input : null;\n const display = isRecord(entry.payload.display) ? entry.payload.display : null;\n\n if (\n classifier.isExploreCollapsible(\n typeof toolName === 'string' ? toolName : null,\n toolInput,\n display,\n )\n ) {\n if (collapsedPresent || compactNarrative) continue;\n out.push([entryKey(entry), entry]);\n continue;\n }\n\n out.push([entryKey(entry), entry]);\n }\n\n return out;\n}\n\nexport function exploreSuppressedNodeIds(\n canonical: CanonicalNodeRef[],\n options: {\n classifier: ToolProjectionClassifier | null;\n exploreDetail: boolean;\n },\n): Set<string> {\n const { classifier, exploreDetail } = options;\n if (exploreDetail || !classifier) return new Set();\n\n const resolved = new Set<string>();\n for (const item of canonical) {\n if (item.type !== 'tool_use') continue;\n const status = item.payload.status;\n if (status === 'done' || status === 'failed') {\n const callId = item.payload.tool_call_id;\n if (typeof callId === 'string' && callId) resolved.add(callId);\n resolved.add(item.nodeId);\n }\n }\n\n const pending = new Set<string>();\n for (const item of canonical) {\n if (item.type !== 'tool_use') continue;\n const callId = String(item.payload.tool_call_id ?? '').trim();\n const nodeId = item.nodeId;\n if ((!callId && !nodeId) || resolved.has(callId) || resolved.has(nodeId)) continue;\n\n const toolInput = isRecord(item.payload.tool_input) ? item.payload.tool_input : null;\n const display = isRecord(item.payload.display) ? item.payload.display : null;\n const toolName = item.payload.tool_name;\n\n if (\n classifier.isExploreCollapsible(\n typeof toolName === 'string' ? toolName : null,\n toolInput,\n display,\n )\n ) {\n pending.add(nodeId);\n }\n }\n\n return pending;\n}\n","/**\n * exploreSummary.ts — collapsed_explore 摘要文案(对齐 CC / CLI)\n *\n * 职责:\n * 生成与 CC CollapsedReadSearchContent / getSearchReadSummaryText 一致的 plain 摘要。\n *\n * 链路位置:\n * ExploreCollapseAccumulator → payload.summaryText。\n *\n * 当前裁剪范围:\n * 仅 plain text;Rich/bold 渲染在 CollapsedExploreNode(Phase 3)。\n */\n\nexport interface ExploreSummaryCounts {\n searchCount: number;\n readCount: number;\n listCount: number;\n bashCount: number;\n memorySearchCount: number;\n memoryReadCount: number;\n memoryWriteCount: number;\n relevantRecallCount: number;\n gitOpBashCount: number;\n mcpCallCount: number;\n}\n\ninterface SummaryPart {\n verb: string;\n count: number | null;\n suffix: string;\n}\n\nfunction memoryReadTotal(counts: ExploreSummaryCounts): number {\n if (counts.memoryReadCount === 0 && counts.relevantRecallCount > 0) {\n return counts.relevantRecallCount;\n }\n return counts.memoryReadCount;\n}\n\nfunction tenseVerb(options: {\n active: boolean;\n isFirst: boolean;\n presentCap: string;\n presentLower: string;\n pastCap: string;\n pastLower: string;\n}): string {\n if (options.active) {\n return options.isFirst ? options.presentCap : options.presentLower;\n }\n return options.isFirst ? options.pastCap : options.pastLower;\n}\n\nfunction exploreSummaryParts(\n counts: ExploreSummaryCounts,\n active: boolean,\n continuingSentence = false,\n): SummaryPart[] {\n const parts: SummaryPart[] = [];\n let isFirst = !continuingSentence;\n\n // Memory operations first (对齐 CC/CLI)\n const memRead = memoryReadTotal(counts);\n if (memRead > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Recalling',\n presentLower: 'recalling',\n pastCap: 'Recalled',\n pastLower: 'recalled',\n }),\n count: memRead,\n suffix: memRead === 1 ? 'memory' : 'memories',\n });\n isFirst = false;\n }\n\n if (counts.memorySearchCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Searching',\n presentLower: 'searching',\n pastCap: 'Searched',\n pastLower: 'searched',\n }),\n count: null,\n suffix: 'memories',\n });\n isFirst = false;\n }\n\n if (counts.memoryWriteCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Writing',\n presentLower: 'writing',\n pastCap: 'Wrote',\n pastLower: 'wrote',\n }),\n count: counts.memoryWriteCount,\n suffix: counts.memoryWriteCount === 1 ? 'memory' : 'memories',\n });\n isFirst = false;\n }\n\n // Non-memory operations\n if (counts.searchCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Searching for',\n presentLower: 'searching for',\n pastCap: 'Searched for',\n pastLower: 'searched for',\n }),\n count: counts.searchCount,\n suffix: counts.searchCount === 1 ? 'pattern' : 'patterns',\n });\n isFirst = false;\n }\n\n if (counts.readCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Reading',\n presentLower: 'reading',\n pastCap: 'Read',\n pastLower: 'read',\n }),\n count: counts.readCount,\n suffix: counts.readCount === 1 ? 'file' : 'files',\n });\n isFirst = false;\n }\n\n if (counts.listCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Listing',\n presentLower: 'listing',\n pastCap: 'Listed',\n pastLower: 'listed',\n }),\n count: counts.listCount,\n suffix: counts.listCount === 1 ? 'directory' : 'directories',\n });\n isFirst = false;\n }\n\n if (counts.bashCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Running',\n presentLower: 'running',\n pastCap: 'Ran',\n pastLower: 'ran',\n }),\n count: counts.bashCount,\n suffix: counts.bashCount === 1 ? 'bash command' : 'bash commands',\n });\n isFirst = false;\n }\n\n if (counts.gitOpBashCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Running',\n presentLower: 'running',\n pastCap: 'Ran',\n pastLower: 'ran',\n }),\n count: counts.gitOpBashCount,\n suffix: counts.gitOpBashCount === 1 ? 'git command' : 'git commands',\n });\n isFirst = false;\n }\n\n if (counts.mcpCallCount > 0) {\n parts.push({\n verb: tenseVerb({\n active,\n isFirst,\n presentCap: 'Querying',\n presentLower: 'querying',\n pastCap: 'Queried',\n pastLower: 'queried',\n }),\n count: counts.mcpCallCount,\n suffix: counts.mcpCallCount === 1 ? 'MCP tool' : 'MCP tools',\n });\n isFirst = false;\n }\n\n return parts;\n}\n\nfunction partPlainText(part: SummaryPart): string {\n if (part.count !== null) {\n return `${part.verb} ${part.count} ${part.suffix}`.trim();\n }\n return `${part.verb} ${part.suffix}`.trim();\n}\n\nexport function formatExploreSummaryText(\n counts: ExploreSummaryCounts,\n options: {\n active: boolean;\n prefix?: string;\n joiner?: string;\n /** Thought 前缀已占用句首时,explore 动词用小写续写 */\n continuingSentence?: boolean;\n } = { active: false },\n): string | null {\n const parts = exploreSummaryParts(\n counts,\n options.active,\n options.continuingSentence ?? false,\n );\n if (parts.length === 0) return null;\n const joiner = options.joiner ?? ', ';\n let text = parts.map(partPlainText).join(joiner);\n if (options.active) {\n text = `${text}…`;\n }\n if (options.prefix) {\n text = options.prefix + text;\n }\n return text;\n}\n\n/** CC 合并行前缀:Thought for 8s, */\nexport function formatThoughtDurationPrefix(seconds: number): string {\n const rounded = Math.max(1, Math.round(seconds));\n return `Thought for ${rounded}s, `;\n}\n\nexport function exploreCountsHasActivity(counts: ExploreSummaryCounts): boolean {\n return (\n counts.searchCount > 0 ||\n counts.readCount > 0 ||\n counts.listCount > 0 ||\n counts.bashCount > 0 ||\n counts.memorySearchCount > 0 ||\n counts.memoryReadCount > 0 ||\n counts.memoryWriteCount > 0 ||\n counts.relevantRecallCount > 0 ||\n counts.gitOpBashCount > 0 ||\n counts.mcpCallCount > 0\n );\n}\n","/**\n * shellProgress.ts — G05 collapsed_explore shell 进度后缀\n *\n * 对齐 CC CollapsedReadSearchContent:bash 运行 ≥2s 时在摘要后追加 elapsed/lines。\n */\n\nexport const SHELL_PROGRESS_MIN_ELAPSED_SECONDS = 2;\n\nfunction formatDuration(totalSeconds: number): string {\n const seconds = Math.max(0, Math.floor(totalSeconds));\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainder = seconds % 60;\n return remainder > 0 ? `${minutes}m ${remainder}s` : `${minutes}m`;\n}\n\nexport function formatShellProgressSuffix(\n elapsedSeconds: number | undefined,\n totalLines: number | undefined,\n): string | null {\n if (\n elapsedSeconds === undefined ||\n !Number.isFinite(elapsedSeconds) ||\n elapsedSeconds < SHELL_PROGRESS_MIN_ELAPSED_SECONDS\n ) {\n return null;\n }\n const time = formatDuration(elapsedSeconds);\n if (totalLines !== undefined && Number.isFinite(totalLines) && totalLines > 0) {\n const lineWord = totalLines === 1 ? 'line' : 'lines';\n return ` (${time} · ${totalLines} ${lineWord})`;\n }\n return ` (${time})`;\n}\n\nexport function resolveShellProgressFromPayload(payload: Record<string, unknown>): string | null {\n const elapsed = Number(payload.progress_elapsed_seconds);\n const linesRaw = payload.progress_total_lines;\n const lines =\n linesRaw === undefined || linesRaw === null ? undefined : Number(linesRaw);\n return formatShellProgressSuffix(\n Number.isFinite(elapsed) ? elapsed : undefined,\n lines !== undefined && Number.isFinite(lines) ? lines : undefined,\n );\n}\n","/**\n * exploreCollapse.ts — ExploreCollapseAccumulator\n *\n * 职责:\n * 将连续探索类 tool_use 节点折叠为 collapsed_explore RenderableEntry。\n *\n * 链路位置:\n * RenderableTimelineProjector.projectImpl → collapse()。\n *\n * 当前裁剪范围:\n * 前端 canonical 为单节点 tool_call(input+result 合并);对齐 CLI 计数与 payload 字段。\n */\n\nimport { commandAsHint, isGitOperationCommand, isMcpToolName } from '../bashExplore';\nimport { Bash } from '../../../view/tools/toolNames';\nimport { CollapseKind, ToolProjectionClassifier } from '../classify';\nimport { MemoryKind } from '../memoryPaths';\nimport {\n type ExploreSummaryCounts,\n formatExploreSummaryText,\n} from '../exploreSummary';\nimport { formatShellProgressSuffix } from '../shellProgress';\nimport type { RenderableEntry } from '../renderModel';\n\nconst WAITING_PERMISSION = 'Waiting for permission…';\n\nfunction normalizeDisplayPath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/');\n}\n\ninterface ExploreGroup {\n sourceNodeIds: string[];\n toolCallIds: Set<string>;\n absorbed: RenderableEntry[];\n searchCount: number;\n readPaths: Set<string>;\n readOperationCount: number;\n listCount: number;\n bashCount: number;\n memoryWriteCount: number;\n memoryReadPaths: Set<string>;\n memorySearchCount: number;\n relevantRecallCount: number;\n gitOpBashCount: number;\n mcpCallCount: number;\n searchArgs: string[];\n latestDisplayHint: string | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readPayloadString(payload: Record<string, unknown>, key: string): string | null {\n const value = payload[key];\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction isToolUseEntry(entry: RenderableEntry): boolean {\n return entry.kind === 'node' && entry.payload.canonicalType === 'tool_use';\n}\n\n/** 工具是否仍计入 explore「进行中」(对齐 CC:有 result 即视为已结束) */\nfunction isExploreToolActive(entry: RenderableEntry): boolean {\n if (!isToolUseEntry(entry)) return false;\n const payload = entry.payload;\n if (payload.status !== 'running') return false;\n if (payload.display != null || 'is_error' in payload) return false;\n return true;\n}\n\nfunction canonicalType(entry: RenderableEntry): string | null {\n const t = entry.payload.canonicalType;\n return typeof t === 'string' ? t : null;\n}\n\nexport class ExploreCollapseAccumulator {\n /** 当前活跃轮次 ID */\n private currentRoundId: string | null = null;\n /** 当前活跃 reasoning 节点 ID */\n private currentReasoningNodeId: string | null = null;\n\n constructor(private readonly classifier: ToolProjectionClassifier) {}\n\n collapse(entries: RenderableEntry[]): RenderableEntry[] {\n const result: RenderableEntry[] = [];\n let group: ExploreGroup | null = null;\n\n const flush = (): void => {\n if (!group || group.sourceNodeIds.length === 0) {\n group = null;\n return;\n }\n result.push({\n kind: 'collapsed_explore',\n sourceNodeIds: [...group.sourceNodeIds],\n payload: {\n ...this.buildPayload(group),\n roundId: this.currentRoundId,\n reasoningNodeId: this.currentReasoningNodeId,\n },\n });\n group = null;\n };\n\n for (const entry of entries) {\n // 对齐 CLI ThinkingAwareExplore:reasoning 仅 skip,不打断 explore 合并\n if (entry.kind === 'node' && entry.payload.canonicalType === 'reasoning') {\n const payload = entry.payload;\n if (payload.status === 'done') {\n this.currentRoundId = (payload.roundId as string | null | undefined) ?? null;\n this.currentReasoningNodeId = entry.sourceNodeIds[0] ?? null;\n }\n continue;\n }\n\n // 其他边界检测(text、error、非 collapsible 工具等)\n if (this.breaksGroup(entry)) {\n flush();\n // 边界后清除轮次信息(新的工具不再关联之前的轮次)\n this.currentRoundId = null;\n this.currentReasoningNodeId = null;\n result.push(entry);\n continue;\n }\n\n if (entry.payload.canonicalType === 'relevant_memories') {\n group = group ?? this.newGroup();\n const count = Number(entry.payload.count ?? 0);\n if (count > 0) {\n group.relevantRecallCount += count;\n group.sourceNodeIds.push(entry.sourceNodeIds[0] ?? 'rel');\n group.absorbed.push(entry);\n }\n continue;\n }\n\n if (!isToolUseEntry(entry)) {\n flush();\n result.push(entry);\n continue;\n }\n\n if (this.waitingPermission(entry)) {\n flush();\n this.currentRoundId = null;\n this.currentReasoningNodeId = null;\n result.push(entry);\n continue;\n }\n\n const kind = this.toolKind(entry);\n if (kind === CollapseKind.None) {\n flush();\n this.currentRoundId = null;\n this.currentReasoningNodeId = null;\n result.push(entry);\n continue;\n }\n\n group = group ?? this.newGroup();\n this.absorbToolEntry(group, entry, kind);\n }\n\n flush();\n return result;\n }\n\n private newGroup(): ExploreGroup {\n return {\n sourceNodeIds: [],\n toolCallIds: new Set(),\n absorbed: [],\n searchCount: 0,\n readPaths: new Set(),\n readOperationCount: 0,\n listCount: 0,\n bashCount: 0,\n memoryWriteCount: 0,\n memoryReadPaths: new Set(),\n memorySearchCount: 0,\n relevantRecallCount: 0,\n gitOpBashCount: 0,\n mcpCallCount: 0,\n searchArgs: [],\n latestDisplayHint: null,\n };\n }\n\n private breaksGroup(entry: RenderableEntry): boolean {\n const type = canonicalType(entry);\n return type === 'text' || type === 'error';\n }\n\n private waitingPermission(entry: RenderableEntry): boolean {\n const progress = entry.payload.progress_text;\n return typeof progress === 'string' && progress.includes(WAITING_PERMISSION);\n }\n\n private toolKind(entry: RenderableEntry): CollapseKind {\n const toolName = readPayloadString(entry.payload, 'tool_name');\n const toolInput = isRecord(entry.payload.tool_input) ? entry.payload.tool_input : null;\n const display = isRecord(entry.payload.display) ? entry.payload.display : null;\n return this.classifier.classifyTool(toolName, toolInput, display);\n }\n\n private absorbToolEntry(group: ExploreGroup, entry: RenderableEntry, kind: CollapseKind): void {\n const payload = entry.payload;\n const toolName = String(payload.tool_name ?? '');\n const toolInput = isRecord(payload.tool_input) ? payload.tool_input : {};\n const display = isRecord(payload.display) ? payload.display : null;\n const callId =\n readPayloadString(payload, 'tool_call_id') ?? entry.sourceNodeIds[0] ?? '';\n\n group.sourceNodeIds.push(entry.sourceNodeIds[0] ?? callId);\n group.absorbed.push(entry);\n if (callId) group.toolCallIds.add(callId);\n\n if (isMcpToolName(toolName)) {\n group.mcpCallCount += 1;\n return;\n }\n\n if (kind === CollapseKind.Mcp) {\n group.mcpCallCount += 1;\n return;\n }\n\n if (kind === CollapseKind.Memory) {\n const memKind = this.classifier.memorySubkind(toolName, toolInput, display);\n if (memKind === MemoryKind.Write) group.memoryWriteCount += 1;\n else if (memKind === MemoryKind.Read) {\n const path = this.readPath(toolInput, display);\n if (path) group.memoryReadPaths.add(path);\n } else if (memKind === MemoryKind.Search) group.memorySearchCount += 1;\n return;\n }\n\n if (kind === CollapseKind.Search) {\n group.searchCount += 1;\n this.recordSearchArg(group, toolName, toolInput);\n this.recordDisplayHint(group, toolName, toolInput, kind);\n return;\n }\n if (kind === CollapseKind.List) {\n group.listCount += 1;\n this.recordDisplayHint(group, toolName, toolInput, kind);\n return;\n }\n if (kind === CollapseKind.Bash) {\n const command = toolInput.command;\n if (typeof command === 'string' && isGitOperationCommand(command)) {\n group.gitOpBashCount += 1;\n } else {\n group.bashCount += 1;\n }\n this.recordDisplayHint(group, toolName, toolInput, kind);\n return;\n }\n if (kind === CollapseKind.Read) {\n const path = this.readPath(toolInput, display);\n if (path) group.readPaths.add(path);\n else group.readOperationCount += 1;\n this.recordDisplayHint(group, toolName, toolInput, kind, display);\n }\n }\n\n private groupCounts(group: ExploreGroup): ExploreSummaryCounts {\n const readCount = group.readPaths.size > 0 ? group.readPaths.size : group.readOperationCount;\n const memoryRead = group.memoryReadPaths.size + group.relevantRecallCount;\n return {\n searchCount: group.searchCount,\n readCount: Math.max(0, readCount - group.memoryReadPaths.size),\n listCount: group.listCount,\n bashCount: group.bashCount,\n memorySearchCount: group.memorySearchCount,\n memoryReadCount: memoryRead,\n memoryWriteCount: group.memoryWriteCount,\n relevantRecallCount: group.relevantRecallCount,\n gitOpBashCount: group.gitOpBashCount,\n mcpCallCount: group.mcpCallCount,\n };\n }\n\n private resolveShellProgressSuffix(group: ExploreGroup, active: boolean): string | null {\n if (!active) return null;\n let bestElapsed: number | undefined;\n let bestLines: number | undefined;\n for (const entry of group.absorbed) {\n if (!isToolUseEntry(entry)) continue;\n if (String(entry.payload.tool_name ?? '') !== Bash) continue;\n if (entry.payload.status !== 'running') continue;\n const elapsed = Number(entry.payload.progress_elapsed_seconds);\n if (!Number.isFinite(elapsed)) continue;\n const linesRaw = entry.payload.progress_total_lines;\n const lines =\n linesRaw === undefined || linesRaw === null ? undefined : Number(linesRaw);\n if (bestElapsed === undefined || elapsed > bestElapsed) {\n bestElapsed = elapsed;\n bestLines = lines !== undefined && Number.isFinite(lines) ? lines : undefined;\n }\n }\n return formatShellProgressSuffix(bestElapsed, bestLines);\n }\n\n private buildPayload(group: ExploreGroup): Record<string, unknown> {\n const active = group.absorbed.some((entry) => isExploreToolActive(entry));\n const counts = this.groupCounts(group);\n return {\n summaryText: formatExploreSummaryText(counts, { active }),\n active,\n searchCount: counts.searchCount,\n readCount: counts.readCount,\n listCount: counts.listCount,\n bashCount: counts.bashCount,\n memorySearchCount: counts.memorySearchCount,\n memoryReadCount: counts.memoryReadCount,\n memoryWriteCount: counts.memoryWriteCount,\n relevantRecallCount: counts.relevantRecallCount,\n gitOpBashCount: counts.gitOpBashCount,\n mcpCallCount: counts.mcpCallCount,\n readPaths: [...group.readPaths].sort(),\n memoryReadPaths: [...group.memoryReadPaths].sort(),\n searchArgs: [...group.searchArgs],\n latestDisplayHint: this.resolveDisplayHint(group),\n shellProgressSuffix: this.resolveShellProgressSuffix(group, active),\n toolUses: this.serializeToolUses(group),\n };\n }\n\n private serializeToolUses(group: ExploreGroup): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n for (const entry of group.absorbed) {\n if (!isToolUseEntry(entry)) continue;\n const payload = entry.payload;\n const callId = readPayloadString(payload, 'tool_call_id') ?? entry.sourceNodeIds[0] ?? '';\n const toolInput = isRecord(payload.tool_input) ? { ...payload.tool_input } : {};\n const item: Record<string, unknown> = {\n tool_call_id: callId,\n tool_name: payload.tool_name,\n tool_input: toolInput,\n };\n const progress = payload.progress_text;\n if (typeof progress === 'string' && progress.trim()) {\n item.progress_text = progress;\n }\n if ('output' in payload) item.output = String(payload.output ?? '');\n if ('is_error' in payload) item.is_error = Boolean(payload.is_error);\n if (isRecord(payload.display)) item.display = { ...payload.display };\n if (isRecord(payload.meta)) item.meta = { ...payload.meta };\n out.push(item);\n }\n return out;\n }\n\n private readPath(\n toolInput: Record<string, unknown>,\n display: Record<string, unknown> | null,\n ): string | null {\n for (const source of [toolInput, display ?? {}]) {\n for (const key of ['file_path', 'path']) {\n const raw = source[key];\n if (typeof raw === 'string' && raw.trim()) {\n return raw.trim().replace(/\\\\/g, '/');\n }\n }\n }\n return null;\n }\n\n private recordSearchArg(\n group: ExploreGroup,\n toolName: string,\n toolInput: Record<string, unknown>,\n ): void {\n const pattern = toolInput.pattern;\n if (typeof pattern === 'string' && pattern.trim()) {\n group.searchArgs.push(pattern.trim());\n return;\n }\n if (toolName === Bash) {\n const command = toolInput.command;\n if (typeof command === 'string' && command.trim()) {\n group.searchArgs.push(command.trim());\n }\n }\n }\n\n private recordDisplayHint(\n group: ExploreGroup,\n _toolName: string,\n toolInput: Record<string, unknown>,\n kind: CollapseKind,\n display: Record<string, unknown> | null = null,\n ): void {\n let hint: string | null = null;\n if (kind === CollapseKind.Read) {\n const path = this.readPath(toolInput, display);\n if (path) hint = normalizeDisplayPath(path);\n } else if (kind === CollapseKind.Search) {\n const pattern = toolInput.pattern;\n if (typeof pattern === 'string' && pattern.trim()) {\n hint = `\"${pattern.trim()}\"`;\n } else {\n const command = toolInput.command;\n if (typeof command === 'string' && command.trim()) {\n hint = commandAsHint(command);\n }\n }\n } else if (kind === CollapseKind.Bash || kind === CollapseKind.List) {\n const command = toolInput.command;\n if (typeof command === 'string' && command.trim()) {\n hint = commandAsHint(command);\n }\n }\n if (hint) group.latestDisplayHint = hint;\n }\n\n private resolveDisplayHint(group: ExploreGroup): string | null {\n if (group.latestDisplayHint) return group.latestDisplayHint;\n if (group.readPaths.size > 0) {\n const lastRead = [...group.readPaths].sort().at(-1);\n if (lastRead) return normalizeDisplayPath(lastRead);\n }\n if (group.searchArgs.length > 0) {\n return `\"${group.searchArgs.at(-1)}\"`;\n }\n return null;\n }\n}\n\nexport type { MemoryToolKind } from '../memoryPaths';\n","/**\n * agentGrouper.ts — CC 式 Subagent 分组元数据\n *\n * 对齐 CC tools/AgentTool/UI.tsx renderGroupedAgentToolUse (649–759)\n * 与 CLI widgets/tools/agent/subagent_grouper.py\n */\n\nconst GENERAL_PURPOSE_AGENT_TYPE = 'general-purpose';\n\nexport interface AgentGroupStat {\n id: string;\n agentType: string;\n description: string | null;\n isResolved: boolean;\n isError: boolean;\n isAsync: boolean;\n}\n\nexport interface AgentGroupMeta {\n count: number;\n commonType: string | null;\n allResolved: boolean;\n allAsync: boolean;\n hideType: boolean;\n title: string;\n agentStats: AgentGroupStat[];\n}\n\nexport function userFacingAgentName(subagentType: string | null | undefined): string {\n if (subagentType == null) return 'Agent';\n const st = String(subagentType).trim();\n if (!st) return 'Agent';\n if (st === 'worker' || st === GENERAL_PURPOSE_AGENT_TYPE) return 'Agent';\n return st;\n}\n\nfunction readSubagentType(\n toolInput: Record<string, unknown> | null | undefined,\n display: Record<string, unknown> | null | undefined,\n): string | null {\n if (display?.subagent_type != null) {\n return userFacingAgentName(String(display.subagent_type));\n }\n if (toolInput?.subagent_type != null) {\n return userFacingAgentName(String(toolInput.subagent_type));\n }\n return null;\n}\n\nexport function extractAgentTypeFromToolUse(entry: Record<string, unknown>): string {\n const toolInput =\n entry.tool_input != null && typeof entry.tool_input === 'object' && !Array.isArray(entry.tool_input)\n ? (entry.tool_input as Record<string, unknown>)\n : null;\n const display =\n entry.display != null && typeof entry.display === 'object' && !Array.isArray(entry.display)\n ? (entry.display as Record<string, unknown>)\n : null;\n return readSubagentType(toolInput, display) ?? 'Agent';\n}\n\nexport function buildAgentStatsFromToolUses(\n toolUses: Record<string, unknown>[],\n status: {\n resolvedCallIds: string[];\n erroredCallIds: string[];\n pendingCallIds: string[];\n },\n): AgentGroupStat[] {\n const resolved = new Set(status.resolvedCallIds);\n const errored = new Set(status.erroredCallIds);\n const stats: AgentGroupStat[] = [];\n\n for (const entry of toolUses) {\n const id = String(entry.tool_call_id ?? '').trim();\n if (!id) continue;\n\n const toolInput =\n entry.tool_input != null && typeof entry.tool_input === 'object' && !Array.isArray(entry.tool_input)\n ? (entry.tool_input as Record<string, unknown>)\n : null;\n const descriptionRaw = toolInput?.description;\n const description =\n typeof descriptionRaw === 'string' && descriptionRaw.trim()\n ? descriptionRaw.trim()\n : null;\n\n stats.push({\n id,\n agentType: extractAgentTypeFromToolUse(entry),\n description,\n isResolved: resolved.has(id),\n isError: errored.has(id),\n isAsync: Boolean(entry.is_async),\n });\n }\n\n return stats;\n}\n\nexport function canGroupAgents(agentStats: AgentGroupStat[]): boolean {\n if (agentStats.length === 0) return false;\n const first = agentStats[0]!.agentType;\n return agentStats.every((s) => s.agentType === first);\n}\n\nexport function getCommonAgentType(agentStats: AgentGroupStat[]): string | null {\n if (!canGroupAgents(agentStats)) return null;\n const first = agentStats[0]!.agentType;\n return first !== 'Agent' ? first : null;\n}\n\nexport function calculateGroupSummary(agentStats: AgentGroupStat[]): {\n count: number;\n commonType: string | null;\n allResolved: boolean;\n allAsync: boolean;\n} {\n if (agentStats.length === 0) {\n return { count: 0, commonType: null, allResolved: true, allAsync: false };\n }\n return {\n count: agentStats.length,\n commonType: getCommonAgentType(agentStats),\n allResolved: agentStats.every((s) => s.isResolved),\n allAsync: agentStats.every((s) => s.isAsync),\n };\n}\n\n/** CC UI.tsx:741–756 — 组标题文案 */\nexport function formatGroupedTitle(options: {\n count: number;\n commonType: string | null;\n allResolved: boolean;\n allAsync: boolean;\n anyPending?: boolean;\n}): string {\n const { count, commonType, allResolved, allAsync } = options;\n const typePrefix = commonType ? `${commonType} ` : '';\n\n if (allAsync && allResolved) {\n return `${count} background agents launched`;\n }\n if (allResolved) {\n return `${count} ${typePrefix}agents finished`.replace(/\\s+/g, ' ').trim();\n }\n return `Running ${count} ${typePrefix}agents…`.replace(/\\s+/g, ' ').trim();\n}\n\nexport function shouldHideType(agentStats: AgentGroupStat[]): boolean {\n return canGroupAgents(agentStats);\n}\n\nexport function buildAgentGroupMeta(\n toolUses: Record<string, unknown>[],\n status: {\n resolvedCallIds: string[];\n erroredCallIds: string[];\n pendingCallIds: string[];\n },\n): AgentGroupMeta {\n const agentStats = buildAgentStatsFromToolUses(toolUses, status);\n const { count, commonType, allResolved, allAsync } = calculateGroupSummary(agentStats);\n const hideType = shouldHideType(agentStats);\n const title = formatGroupedTitle({\n count,\n commonType,\n allResolved,\n allAsync,\n anyPending: status.pendingCallIds.length > 0,\n });\n\n return {\n count,\n commonType,\n allResolved,\n allAsync,\n hideType,\n title,\n agentStats,\n };\n}\n\nexport function formatAgentSublineTitle(\n entry: Record<string, unknown>,\n hideType: boolean,\n): string {\n const toolInput =\n entry.tool_input != null && typeof entry.tool_input === 'object' && !Array.isArray(entry.tool_input)\n ? (entry.tool_input as Record<string, unknown>)\n : null;\n const agentType = extractAgentTypeFromToolUse(entry);\n const description =\n typeof toolInput?.description === 'string' ? toolInput.description.trim() : '';\n\n if (hideType) {\n return description || agentType;\n }\n if (description) return `${agentType}(${description})`;\n return String(entry.tool_name ?? agentType);\n}\n","/**\n * groupedToolUse.ts — GroupedToolUseAccumulator\n *\n * 职责:\n * 同一 response(message_id)内 2+ 个同类 Agent/Task 合成 grouped_tool_use。\n *\n * 链路位置:\n * RenderableTimelineProjector.projectImpl → group()(在 explore collapse 之前)。\n *\n * 当前裁剪范围:\n * 对齐 CLI grouped_tool_use.py;前端单节点 tool_call(无独立 tool_result 行)。\n */\n\nimport { buildAgentGroupMeta } from '../agentGrouper';\nimport { isGroupableToolName } from '../constants';\nimport type { RenderableEntry } from '../renderModel';\n\ninterface ToolUseEntry {\n entry: RenderableEntry;\n toolCallId: string;\n messageId: string;\n toolName: string;\n nodeId: string;\n}\n\ninterface GroupBucket {\n messageId: string;\n toolName: string;\n toolUses: ToolUseEntry[];\n}\n\nfunction isToolUseEntry(entry: RenderableEntry): boolean {\n return entry.kind === 'node' && entry.payload.canonicalType === 'tool_use';\n}\n\nfunction readPayloadString(payload: Record<string, unknown>, key: string): string | null {\n const value = payload[key];\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction toolUseEntry(entry: RenderableEntry): ToolUseEntry | null {\n if (!isToolUseEntry(entry)) return null;\n const payload = entry.payload;\n const toolName = String(payload.tool_name ?? '').trim();\n if (!isGroupableToolName(toolName)) return null;\n\n const toolCallId =\n readPayloadString(payload, 'tool_call_id') ?? entry.sourceNodeIds[0] ?? '';\n if (!toolCallId) return null;\n\n const messageId =\n readPayloadString(payload, 'message_id') ??\n readPayloadString(payload, 'response_id') ??\n 'default';\n\n return {\n entry,\n toolCallId,\n messageId,\n toolName,\n nodeId: entry.sourceNodeIds[0] ?? toolCallId,\n };\n}\n\nfunction isResolved(payload: Record<string, unknown>): boolean {\n const status = payload.status;\n return status === 'done' || status === 'failed';\n}\n\nfunction isErrored(payload: Record<string, unknown>): boolean {\n return (\n payload.status === 'failed' ||\n payload.is_error === true ||\n payload.error != null\n );\n}\n\nexport class GroupedToolUseAccumulator {\n group(entries: RenderableEntry[]): RenderableEntry[] {\n if (entries.length === 0) return entries;\n\n const buckets = new Map<string, GroupBucket>();\n\n for (const entry of entries) {\n const parsed = toolUseEntry(entry);\n if (!parsed) continue;\n const key = `${parsed.messageId}:${parsed.toolName}`;\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = {\n messageId: parsed.messageId,\n toolName: parsed.toolName,\n toolUses: [],\n };\n buckets.set(key, bucket);\n }\n bucket.toolUses.push(parsed);\n }\n\n const validKeys = new Set(\n [...buckets.entries()]\n .filter(([, bucket]) => bucket.toolUses.length >= 2)\n .map(([key]) => key),\n );\n\n if (validKeys.size === 0) return entries;\n\n const groupedNodeIds = new Set<string>();\n for (const key of validKeys) {\n for (const item of buckets.get(key)!.toolUses) {\n groupedNodeIds.add(item.nodeId);\n }\n }\n\n const result: RenderableEntry[] = [];\n const emitted = new Set<string>();\n\n for (const entry of entries) {\n const parsed = toolUseEntry(entry);\n if (!parsed) {\n result.push(entry);\n continue;\n }\n\n const key = `${parsed.messageId}:${parsed.toolName}`;\n if (!validKeys.has(key)) {\n result.push(entry);\n continue;\n }\n\n if (groupedNodeIds.has(parsed.nodeId)) {\n if (emitted.has(key)) continue;\n emitted.add(key);\n result.push(this.buildGrouped(buckets.get(key)!));\n continue;\n }\n\n result.push(entry);\n }\n\n return result;\n }\n\n private buildGrouped(bucket: GroupBucket): RenderableEntry {\n const toolUses: Record<string, unknown>[] = [];\n const nodeIds: string[] = [];\n const resolvedCallIds: string[] = [];\n const erroredCallIds: string[] = [];\n const pendingCallIds: string[] = [];\n const toolResults: Record<string, unknown>[] = [];\n\n for (const item of bucket.toolUses) {\n const payload = item.entry.payload;\n nodeIds.push(item.nodeId);\n toolUses.push({\n tool_call_id: item.toolCallId,\n tool_name: item.toolName,\n tool_input: payload.tool_input ?? {},\n progress_text: payload.progress_text,\n output: payload.output,\n is_error: payload.is_error,\n display: payload.display,\n meta: payload.meta,\n });\n\n if (isResolved(payload)) {\n resolvedCallIds.push(item.toolCallId);\n toolResults.push({\n tool_call_id: item.toolCallId,\n output: payload.output ?? '',\n display: payload.display,\n is_error: isErrored(payload),\n });\n if (isErrored(payload)) {\n erroredCallIds.push(item.toolCallId);\n }\n } else {\n pendingCallIds.push(item.toolCallId);\n }\n }\n\n const groupMeta = buildAgentGroupMeta(toolUses, {\n resolvedCallIds,\n erroredCallIds,\n pendingCallIds,\n });\n\n return {\n kind: 'grouped_tool_use',\n sourceNodeIds: [...nodeIds],\n payload: {\n toolName: bucket.toolName,\n tool_name: bucket.toolName,\n messageId: bucket.messageId,\n message_id: bucket.messageId,\n nodeIds,\n toolUses,\n toolResults,\n resolvedCallIds,\n erroredCallIds,\n pendingCallIds,\n groupMeta,\n },\n };\n }\n}\n","/**\n * systemSummaryText.ts — system_summary 摘要文案\n *\n * 对齐 CC collapseHookSummaries / CLI system_summary.py 感官。\n */\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction hookLabel(data: Record<string, unknown>): string {\n const raw = data.hook ?? data.hook_name ?? data.hookName;\n return typeof raw === 'string' ? raw.trim() : 'hook';\n}\n\nexport function formatHookFinishedSummary(data: Record<string, unknown>): string {\n const label = hookLabel(data).toLowerCase();\n const status = String(data.status ?? '').toLowerCase();\n if (label === 'stop' || label === 'stop_hook') {\n if (status === 'blocked' || status === 'prevented' || data.prevented === true) {\n return 'Stop hook blocked';\n }\n return 'Ran stop hook';\n }\n const readable = hookLabel(data).replace(/_/g, '-');\n return `Ran ${readable} hook`;\n}\n\nexport function formatSystemEventSummary(\n eventType: string,\n data: unknown,\n): string | null {\n const payload = isRecord(data) ? data : {};\n switch (eventType) {\n case 'hook-finished':\n return formatHookFinishedSummary(payload);\n default:\n return null;\n }\n}\n\nexport function mergeSystemSummaryLines(lines: string[]): string {\n const counts = new Map<string, number>();\n for (const line of lines) {\n counts.set(line, (counts.get(line) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([line, count]) => (count > 1 ? `${line} (×${count})` : line))\n .join(' · ');\n}\n\nexport function summarizeSystemEvents(\n events: Array<{ eventType: string; data: unknown }>,\n): string {\n const lines: string[] = [];\n\n for (const evt of events) {\n // 对齐 CC/CLI:compact 事件不作为 timeline entry 显示\n // CC 用它更新 spinner,CLI 显示进度条后追加简单信息\n if (evt.eventType === 'compact-start' || evt.eventType === 'compact-end') {\n continue;\n }\n const line = formatSystemEventSummary(evt.eventType, evt.data);\n if (line) lines.push(line);\n }\n\n return mergeSystemSummaryLines(lines);\n}\n","/**\n * systemSummary.ts — SystemSummaryAccumulator\n *\n * 职责:连续 hook / compact 系统事件 → system_summary RenderableEntry。\n *\n * 链路位置:\n * RenderableTimelineProjector.projectImpl → collapseSystemSummary()。\n */\n\nimport { summarizeSystemEvents } from '../systemSummaryText';\nimport type { RenderableEntry } from '../renderModel';\n\nconst SYSTEM_CANONICAL_TYPES = new Set(['hook', 'compact']);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction canonicalType(entry: RenderableEntry): string | null {\n const t = entry.payload.canonicalType;\n return typeof t === 'string' ? t : null;\n}\n\nfunction isSystemSummaryEntry(entry: RenderableEntry): boolean {\n if (entry.kind !== 'node') return false;\n const type = canonicalType(entry);\n return type !== null && SYSTEM_CANONICAL_TYPES.has(type);\n}\n\nexport class SystemSummaryAccumulator {\n collapse(entries: RenderableEntry[]): RenderableEntry[] {\n const result: RenderableEntry[] = [];\n let buffer: RenderableEntry[] = [];\n\n const flush = (): void => {\n if (buffer.length === 0) return;\n const summaryText = summarizeSystemEvents(\n buffer.map((entry) => ({\n eventType: String(entry.payload.event_type ?? ''),\n data: entry.payload,\n })),\n );\n if (!summaryText) {\n result.push(...buffer);\n } else {\n result.push({\n kind: 'system_summary',\n sourceNodeIds: buffer\n .map((entry) => entry.sourceNodeIds[0])\n .filter((id): id is string => typeof id === 'string'),\n payload: {\n summaryText,\n events: buffer.map((entry) => ({\n nodeId: entry.sourceNodeIds[0],\n event_type: entry.payload.event_type,\n ...(isRecord(entry.payload) ? entry.payload : {}),\n })),\n },\n });\n }\n buffer = [];\n };\n\n for (const entry of entries) {\n if (isSystemSummaryEntry(entry)) {\n buffer.push(entry);\n continue;\n }\n flush();\n result.push(entry);\n }\n\n flush();\n return result;\n }\n}\n","/**\n * thinkingRoundSummary.ts —轮次摘要生成\n *\n * 职责:\n * 将 thinking round 耗时绑定到 collapsed_explore(CC 合并行);\n * 无 explore 时 emit 独立 thinking_summary。\n *\n * 链路位置:\n * RenderableTimelineProjector.projectImpl → accumulate()。\n */\n\nimport type { RenderableEntry } from '../renderModel';\nimport type { ToolCounts } from '../../../types/nodes';\n\ninterface PendingRound {\n roundId: string;\n reasoningNodeId: string;\n elapsedSeconds: number;\n exploreNodeId: string | null;\n toolCounts: ToolCounts;\n}\n\ninterface ReasoningMeta {\n reasoningNodeId: string;\n elapsedSeconds: number;\n}\n\nfunction zeroToolCounts(): ToolCounts {\n return {\n searchCount: 0,\n readCount: 0,\n listCount: 0,\n bashCount: 0,\n memorySearchCount: 0,\n memoryReadCount: 0,\n memoryWriteCount: 0,\n relevantRecallCount: 0,\n gitOpBashCount: 0,\n mcpCallCount: 0,\n };\n}\n\nexport interface ThinkingRoundSummaryOptions {\n /** 任务模式:不 emit 无 explore 的 thought-only thinking_summary */\n suppressThoughtOnlySummary?: boolean;\n}\n\nexport class ThinkingRoundSummaryAccumulator {\n private readonly suppressThoughtOnlySummary: boolean;\n private reasoningMeta = new Map<string, ReasoningMeta>();\n private reasoningRoundOrder: string[] = [];\n private pendingRounds = new Map<string, PendingRound>();\n private summarizedRounds = new Set<string>();\n\n constructor(options: ThinkingRoundSummaryOptions = {}) {\n this.suppressThoughtOnlySummary = options.suppressThoughtOnlySummary ?? false;\n }\n\n seedReasoningEntries(entries: RenderableEntry[]): void {\n this.reasoningMeta.clear();\n this.reasoningRoundOrder = [];\n for (const entry of entries) {\n if (entry.kind !== 'node' || entry.payload.canonicalType !== 'reasoning') continue;\n const payload = entry.payload;\n if (payload.status !== 'done' || !payload.roundId) continue;\n const roundId = payload.roundId as string;\n if (!this.reasoningMeta.has(roundId)) {\n this.reasoningRoundOrder.push(roundId);\n }\n this.reasoningMeta.set(roundId, {\n reasoningNodeId: entry.sourceNodeIds[0] ?? '',\n elapsedSeconds: (payload.elapsedSeconds as number | null) ?? 0,\n });\n }\n }\n\n accumulate(entries: RenderableEntry[]): RenderableEntry[] {\n const result: RenderableEntry[] = [];\n\n for (const entry of entries) {\n if (entry.kind === 'collapsed_explore') {\n const roundId = entry.payload.roundId as string | null;\n if (roundId) {\n result.push(...this.flushOtherRounds(roundId));\n const pending = this.ensurePending(roundId);\n if (pending) {\n pending.exploreNodeId = entry.sourceNodeIds[0] ?? null;\n pending.toolCounts = this.extractToolCounts(entry);\n }\n }\n result.push(this.enrichExploreWithThought(entry));\n continue;\n }\n\n if (entry.kind === 'node' && entry.payload.canonicalType === 'reasoning') {\n const payload = entry.payload;\n if (payload.status === 'done' && payload.roundId) {\n const currentRoundId = payload.roundId as string;\n if (!this.reasoningMeta.has(currentRoundId)) {\n this.reasoningRoundOrder.push(currentRoundId);\n this.reasoningMeta.set(currentRoundId, {\n reasoningNodeId: entry.sourceNodeIds[0] ?? '',\n elapsedSeconds: (payload.elapsedSeconds as number | null) ?? 0,\n });\n }\n result.push(...this.flushOtherRounds(currentRoundId));\n this.ensurePending(currentRoundId);\n }\n result.push(entry);\n continue;\n }\n\n if (this.isNonReasoningFlushBoundary(entry)) {\n result.push(...this.flushAllPending());\n result.push(...this.emitOrphanSummaries());\n result.push(entry);\n continue;\n }\n\n result.push(entry);\n }\n\n return result;\n }\n\n flushWhenEnd(): RenderableEntry[] {\n return [...this.flushAllPending(), ...this.emitOrphanSummaries()];\n }\n\n /** CC Plan C:thought 耗时写入 explore 行 payload,不再单独 emit summary */\n private enrichExploreWithThought(entry: RenderableEntry): RenderableEntry {\n const roundId = entry.payload.roundId as string | null;\n if (!roundId) return entry;\n const meta = this.reasoningMeta.get(roundId);\n if (!meta) return entry;\n return {\n ...entry,\n payload: {\n ...entry.payload,\n thoughtElapsedSeconds: meta.elapsedSeconds,\n },\n };\n }\n\n private ensurePending(roundId: string): PendingRound | null {\n if (this.summarizedRounds.has(roundId)) {\n return this.pendingRounds.get(roundId) ?? null;\n }\n let pending = this.pendingRounds.get(roundId);\n if (!pending) {\n const meta = this.reasoningMeta.get(roundId);\n if (!meta) return null;\n pending = {\n roundId,\n reasoningNodeId: meta.reasoningNodeId,\n elapsedSeconds: meta.elapsedSeconds,\n exploreNodeId: null,\n toolCounts: zeroToolCounts(),\n };\n this.pendingRounds.set(roundId, pending);\n }\n return pending;\n }\n\n private flushRound(roundId: string): RenderableEntry | null {\n const pending = this.pendingRounds.get(roundId);\n if (!pending) return null;\n this.pendingRounds.delete(roundId);\n this.summarizedRounds.add(roundId);\n if (pending.exploreNodeId) {\n return null;\n }\n if (this.suppressThoughtOnlySummary) {\n return null;\n }\n return this.buildSummary(pending);\n }\n\n private flushOtherRounds(keepRoundId: string): RenderableEntry[] {\n const out: RenderableEntry[] = [];\n for (const roundId of [...this.pendingRounds.keys()]) {\n if (roundId === keepRoundId) continue;\n const summary = this.flushRound(roundId);\n if (summary) out.push(summary);\n }\n return out;\n }\n\n private flushAllPending(): RenderableEntry[] {\n const out: RenderableEntry[] = [];\n for (const roundId of [...this.pendingRounds.keys()]) {\n const summary = this.flushRound(roundId);\n if (summary) out.push(summary);\n }\n return out;\n }\n\n private emitOrphanSummaries(): RenderableEntry[] {\n const out: RenderableEntry[] = [];\n for (const roundId of this.reasoningRoundOrder) {\n if (this.summarizedRounds.has(roundId)) continue;\n if (this.pendingRounds.has(roundId)) continue;\n const meta = this.reasoningMeta.get(roundId);\n if (!meta) continue;\n this.summarizedRounds.add(roundId);\n if (this.suppressThoughtOnlySummary) continue;\n out.push(\n this.buildSummary({\n roundId,\n reasoningNodeId: meta.reasoningNodeId,\n elapsedSeconds: meta.elapsedSeconds,\n exploreNodeId: null,\n toolCounts: zeroToolCounts(),\n }),\n );\n }\n return out;\n }\n\n private isNonReasoningFlushBoundary(entry: RenderableEntry): boolean {\n if (entry.kind === 'node' && entry.payload.canonicalType === 'text') {\n return true;\n }\n if (entry.kind === 'node' && entry.payload.canonicalType === 'error') {\n return true;\n }\n if (entry.kind === 'node' && entry.payload.canonicalType === 'permission') {\n return true;\n }\n return false;\n }\n\n private extractToolCounts(entry: RenderableEntry): ToolCounts {\n const payload = entry.payload;\n return {\n searchCount: (payload.searchCount as number) ?? 0,\n readCount: (payload.readCount as number) ?? 0,\n listCount: (payload.listCount as number) ?? 0,\n bashCount: (payload.bashCount as number) ?? 0,\n memorySearchCount: (payload.memorySearchCount as number) ?? 0,\n memoryReadCount: (payload.memoryReadCount as number) ?? 0,\n memoryWriteCount: (payload.memoryWriteCount as number) ?? 0,\n relevantRecallCount: (payload.relevantRecallCount as number) ?? 0,\n gitOpBashCount: (payload.gitOpBashCount as number) ?? 0,\n mcpCallCount: (payload.mcpCallCount as number) ?? 0,\n };\n }\n\n private buildSummary(pending: PendingRound): RenderableEntry | null {\n const id = `thinking_summary:${pending.roundId}`;\n\n return {\n kind: 'thinking_summary',\n sourceNodeIds: [pending.reasoningNodeId],\n payload: {\n id,\n roundId: pending.roundId,\n reasoningNodeId: pending.reasoningNodeId,\n exploreNodeId: null,\n elapsedSeconds: pending.elapsedSeconds,\n toolCounts: pending.toolCounts,\n isExpanded: false,\n startedAt: Date.now(),\n },\n };\n }\n}\n","/**\n * projector.ts — RenderableTimelineProjector\n *\n * 职责:\n * 接收 canonical 列表,产出 RenderableEntry[]。\n * Phase 4:group → explore collapse pass 顺序对齐 CLI。\n *\n * 链路位置:\n * projectTimeline(tree, context) → 本类 → Timeline(Phase 3 接入)。\n *\n * 当前裁剪范围:\n * pass 顺序 group → explore → systemSummary;异常时 atomic 回退。\n */\n\nimport { ExploreCollapseAccumulator } from './accumulators/exploreCollapse';\nimport { GroupedToolUseAccumulator } from './accumulators/groupedToolUse';\nimport { SystemSummaryAccumulator } from './accumulators/systemSummary';\nimport { ThinkingRoundSummaryAccumulator } from './accumulators/thinkingRoundSummary';\nimport { ToolProjectionClassifier } from './classify';\nimport type { CanonicalNodeRef, ProjectionContext, RenderableEntry } from './renderModel';\n\nexport class RenderableTimelineProjector {\n private readonly classifier: ToolProjectionClassifier;\n\n constructor(private readonly context: ProjectionContext) {\n this.classifier = new ToolProjectionClassifier(context);\n }\n\n getContext(): ProjectionContext {\n return this.context;\n }\n\n getClassifier(): ToolProjectionClassifier {\n return this.classifier;\n }\n\n project(canonical: CanonicalNodeRef[]): RenderableEntry[] {\n try {\n return this.projectImpl(canonical);\n } catch (error) {\n console.error('projection failed; falling back to atomic pass-through', error);\n return this.atomicPassThrough(canonical);\n }\n }\n\n private projectImpl(canonical: CanonicalNodeRef[]): RenderableEntry[] {\n const atomics: RenderableEntry[] = [];\n for (const item of canonical) {\n if (this.shouldOmitFromRenderable(item)) continue;\n atomics.push(this.toRenderableEntry(item));\n }\n\n let projected = atomics;\n if (this.context.shouldApplyGrouping()) {\n projected = new GroupedToolUseAccumulator().group(projected);\n }\n projected = new ExploreCollapseAccumulator(this.classifier).collapse(projected);\n if (this.context.shouldEmitThinkingSummary()) {\n const summaryAccumulator = new ThinkingRoundSummaryAccumulator({\n suppressThoughtOnlySummary: this.context.shouldSuppressThoughtOnlySummary(),\n });\n summaryAccumulator.seedReasoningEntries(atomics);\n projected = summaryAccumulator.accumulate(projected);\n projected = [...projected, ...summaryAccumulator.flushWhenEnd()];\n }\n return new SystemSummaryAccumulator().collapse(projected);\n }\n\n private shouldOmitFromRenderable(item: CanonicalNodeRef): boolean {\n if (item.type !== 'tool_use') return false;\n const toolName = item.payload.tool_name;\n return this.classifier.isSilentTool(\n typeof toolName === 'string' ? toolName : null,\n );\n }\n\n private toRenderableEntry(item: CanonicalNodeRef): RenderableEntry {\n return {\n kind: 'node',\n sourceNodeIds: [item.nodeId],\n payload: {\n ...item.payload,\n canonicalType: item.type,\n },\n };\n }\n\n private atomicPassThrough(canonical: CanonicalNodeRef[]): RenderableEntry[] {\n const entries: RenderableEntry[] = [];\n for (const item of canonical) {\n if (this.shouldOmitFromRenderable(item)) continue;\n entries.push(this.toRenderableEntry(item));\n }\n return entries;\n }\n}\n","/**\n * responseId.ts — 同 response 分组用的 message_id 提取\n *\n * 职责:\n * 从 tool 事件 payload / result.meta 提取 responseId;缺失时返回 null(分组保守 atomic)。\n *\n * 链路位置:\n * Phase 1 treeAdapter → GroupedToolUseAccumulator(对齐 CLI canonical.message_id)。\n *\n * 当前裁剪范围:\n * 不做 turn 边界推断;Phase 4 若 SDK 仍无 message_id 再评估 text-start 分 turn。\n */\n\nfunction readStringField(obj: Record<string, unknown>, key: string): string | null {\n const value = obj[key];\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\n/** 从 tool-call / tool-input 类 event.data 提取 */\nexport function extractResponseIdFromToolPayload(\n data: Record<string, unknown> | undefined | null,\n): string | null {\n if (!data) return null;\n const direct = readStringField(data, 'message_id');\n if (direct) return direct;\n const meta = data.meta;\n if (meta && typeof meta === 'object' && !Array.isArray(meta)) {\n return readStringField(meta as Record<string, unknown>, 'message_id');\n }\n return null;\n}\n\n/** 从 ToolResultData.meta 提取(result 晚于 call 时补全) */\nexport function extractResponseIdFromResultMeta(meta: unknown): string | null {\n if (!meta || typeof meta !== 'object' || Array.isArray(meta)) return null;\n return readStringField(meta as Record<string, unknown>, 'message_id');\n}\n\n/**\n * 合并 call 与 result 侧 candidate;call 优先。\n * message_id 缺失 → null → GroupedToolUseAccumulator 不分组(对齐 CLI 保守策略)。\n */\nexport function resolveResponseId(\n toolPayload: Record<string, unknown> | undefined | null,\n resultMeta: unknown,\n): string | null {\n return (\n extractResponseIdFromToolPayload(toolPayload) ??\n extractResponseIdFromResultMeta(resultMeta)\n );\n}\n","/**\n\n * treeAdapter.ts — SessionTree → CanonicalNodeRef[]\n\n *\n\n * 职责:\n\n * 从 reducer 保真 SessionTree 抽取主舞台 canonical 列表(不改 reducer)。\n\n *\n\n * 链路位置:\n\n * projectTimeline(tree) → buildCanonicalFromTree → RenderableTimelineProjector。\n\n *\n\n * 当前裁剪范围:\n\n * systemEvents(hook/compact)按 timestamp 与主舞台交错;不含 debug tier 其它事件。\n\n */\n\n\n\nimport { getMainStageIds } from '../reducer';\n\nimport type { SessionNode, ToolCallNode } from '../../types/nodes';\n\nimport type { SessionTree } from '../../types/tree';\n\nimport type { CanonicalNodeRef } from './renderModel';\n\nimport { resolveResponseId } from './responseId';\n\n\n\nfunction toolInputRecord(input: unknown): Record<string, unknown> {\n\n if (input && typeof input === 'object' && !Array.isArray(input)) {\n\n return input as Record<string, unknown>;\n\n }\n\n return {};\n\n}\n\n\n\nfunction progressText(node: ToolCallNode): string | undefined {\n\n const message = node.progress?.message;\n\n return typeof message === 'string' && message.length > 0 ? message : undefined;\n\n}\n\n\n\nconst WAITING_PERMISSION_TEXT = 'Waiting for permission…';\n\n\n\nfunction collectPendingPermissionToolNames(tree: SessionTree): Set<string> {\n\n const names = new Set<string>();\n\n for (const nodeId of getMainStageIds(tree)) {\n\n const node = tree.byId[nodeId];\n\n if (node?.kind === 'permission' && node.status === 'pending') {\n\n names.add(node.toolName);\n\n }\n\n }\n\n return names;\n\n}\n\n\n\nfunction mapToolCall(\n node: ToolCallNode,\n pendingPermissionTools?: Set<string>,\n): CanonicalNodeRef {\n\n const toolInput = toolInputRecord(node.input);\n\n const responseId = resolveResponseId(\n\n {\n\n ...toolInput,\n\n tool_call_id: node.toolCallId ?? node.id,\n\n },\n\n node.result?.meta,\n\n );\n\n\n\n const payload: Record<string, unknown> = {\n\n tool_name: node.toolName,\n\n tool_input: toolInput,\n\n tool_call_id: node.toolCallId ?? node.id,\n\n status: node.status,\n\n };\n\n\n\n const progress =\n progressText(node) ??\n (node.status === 'running' && pendingPermissionTools?.has(node.toolName)\n ? WAITING_PERMISSION_TEXT\n : undefined);\n\n if (progress) {\n\n payload.progress_text = progress;\n\n }\n\n if (node.progress?.elapsedTimeSeconds !== undefined) {\n\n payload.progress_elapsed_seconds = node.progress.elapsedTimeSeconds;\n\n }\n\n if (node.progress?.totalLines !== undefined) {\n\n payload.progress_total_lines = node.progress.totalLines;\n\n }\n\n payload.started_at = node.startedAt;\n\n\n\n if (node.result) {\n\n payload.output = node.result.summary ?? '';\n\n payload.display = node.result.display;\n\n payload.is_error = node.result.status === 'error' || node.result.error != null;\n\n payload.meta = node.result.meta;\n\n }\n\n if (node.subagentProgress?.length) {\n\n payload.subagent_progress = node.subagentProgress;\n\n }\n\n\n\n if (responseId) {\n\n payload.message_id = responseId;\n\n }\n\n\n\n return {\n\n nodeId: node.id,\n\n type: 'tool_use',\n\n payload,\n\n responseId,\n\n };\n\n}\n\n\n\nfunction mapNode(\n node: SessionNode,\n pendingPermissionTools?: Set<string>,\n): CanonicalNodeRef | null {\n\n switch (node.kind) {\n\n case 'text':\n\n return {\n\n nodeId: node.id,\n\n type: 'text',\n\n payload: { text: node.accumulated, status: node.status },\n\n };\n\n case 'reasoning':\n\n return {\n\n nodeId: node.id,\n\n type: 'reasoning',\n\n payload: {\n text: node.accumulated,\n status: node.status,\n roundId: node.roundId,\n elapsedSeconds: node.elapsedSeconds,\n isCollapsible: node.isCollapsible,\n endedAt: node.endedAt,\n },\n\n };\n\n case 'tool_call':\n\n return mapToolCall(node, pendingPermissionTools);\n\n case 'permission':\n\n return {\n\n nodeId: node.id,\n\n type: 'permission',\n\n payload: {\n\n tool_name: node.toolName,\n\n request_id: node.requestId,\n\n message: node.message,\n\n status: node.status,\n\n },\n\n };\n\n case 'error':\n\n return {\n\n nodeId: node.id,\n\n type: 'error',\n\n payload: {\n\n message: node.message,\n\n error_type: node.errorType,\n\n },\n\n };\n\n case 'unknown':\n\n return {\n\n nodeId: node.id,\n\n type: 'unknown',\n\n payload: {\n\n event_type: node.eventType,\n\n raw_data: node.rawData,\n\n },\n\n };\n\n /** @deprecated 方案 A 主路径不再投影 subagent 容器;progress 在 tool_use.subagent_progress。 */\n case 'subagent':\n\n return null;\n\n case 'memory_saved':\n\n return {\n\n nodeId: node.id,\n\n type: 'memory_saved',\n\n payload: {\n\n count: node.count,\n\n writtenPaths: node.writtenPaths,\n\n displayHint: node.displayHint,\n\n },\n\n };\n\n default:\n\n return null;\n\n }\n\n}\n\n\n\nfunction systemEventCanonicalType(eventType: string): 'hook' | 'compact' | null {\n\n if (eventType === 'hook-finished') return 'hook';\n\n if (eventType === 'compact-start' || eventType === 'compact-end') return 'compact';\n\n return null;\n\n}\n\n\n\nfunction mapSystemEvent(evt: SessionTree['systemEvents'][number]): CanonicalNodeRef | null {\n\n const canonicalType = systemEventCanonicalType(evt.eventType);\n\n if (!canonicalType) return null;\n\n const data =\n\n evt.data && typeof evt.data === 'object' && !Array.isArray(evt.data)\n\n ? (evt.data as Record<string, unknown>)\n\n : {};\n\n return {\n\n nodeId: `system:${evt.eventIndex}`,\n\n type: canonicalType,\n\n payload: {\n\n ...data,\n\n event_type: evt.eventType,\n\n },\n\n };\n\n}\n\n\n\n/** relevant_memories 单测 / 未来 recall 事件适配 */\n\nexport function buildRelevantMemoriesCanonical(options: {\n\n nodeId?: string;\n\n count: number;\n\n}): CanonicalNodeRef {\n\n return {\n\n nodeId: options.nodeId ?? 'relevant-memories:0',\n\n type: 'relevant_memories',\n\n payload: { count: options.count },\n\n };\n\n}\n\n\n\nexport function buildCanonicalFromTree(tree: SessionTree): CanonicalNodeRef[] {\n\n const ordered: Array<{ ts: number; ref: CanonicalNodeRef }> = [];\n\n const pendingPermissionTools = collectPendingPermissionToolNames(tree);\n\n\n\n for (const nodeId of getMainStageIds(tree)) {\n\n const node = tree.byId[nodeId];\n\n if (!node) continue;\n\n const mapped = mapNode(node, pendingPermissionTools);\n\n if (mapped) {\n\n ordered.push({ ts: node.startedAt ?? 0, ref: mapped });\n\n }\n\n }\n\n\n\n for (const evt of tree.systemEvents) {\n\n const mapped = mapSystemEvent(evt);\n\n if (mapped) {\n\n ordered.push({ ts: evt.timestamp, ref: mapped });\n\n }\n\n }\n\n\n\n ordered.sort((a, b) => a.ts - b.ts || a.ref.nodeId.localeCompare(b.ref.nodeId));\n\n return ordered.map((item) => item.ref);\n\n}\n\n\n\n/** 单测 / fixture 用:构造 tool_use canonical */\n\nexport function buildToolUseCanonical(options: {\n\n nodeId: string;\n\n toolCallId: string;\n\n toolName: string;\n\n toolInput?: Record<string, unknown>;\n\n responseId?: string | null;\n\n progressText?: string | null;\n\n status?: string;\n\n display?: Record<string, unknown> | null;\n\n}): CanonicalNodeRef {\n\n const payload: Record<string, unknown> = {\n\n tool_name: options.toolName,\n\n tool_input: options.toolInput ?? {},\n\n tool_call_id: options.toolCallId,\n\n status: options.status ?? 'running',\n\n };\n\n if (options.progressText) {\n\n payload.progress_text = options.progressText;\n\n }\n\n if (options.responseId) {\n\n payload.message_id = options.responseId;\n\n }\n\n if (options.display) {\n\n payload.display = options.display;\n\n }\n\n return {\n\n nodeId: options.nodeId,\n\n type: 'tool_use',\n\n payload,\n\n responseId: options.responseId ?? null,\n\n };\n\n}\n\n\n\nexport function buildSystemEventCanonical(options: {\n\n eventIndex: number;\n\n eventType: string;\n\n data?: Record<string, unknown>;\n\n timestamp?: number;\n\n}): CanonicalNodeRef {\n\n const canonicalType = systemEventCanonicalType(options.eventType);\n\n if (!canonicalType) {\n\n throw new Error(`unsupported system event: ${options.eventType}`);\n\n }\n\n return {\n\n nodeId: `system:${options.eventIndex}`,\n\n type: canonicalType,\n\n payload: {\n\n ...(options.data ?? {}),\n\n event_type: options.eventType,\n\n },\n\n };\n\n}\n\n\n","/**\n * projectTimeline.ts — 薄封装入口\n *\n * 职责:\n * SessionTree + ProjectionContext → RenderableEntry[]。\n *\n * 链路位置:\n * useProjectedTimeline(Phase 3)/ 公开 API 消费。\n *\n * 当前裁剪范围:\n * 仅委托 RenderableTimelineProjector;不 mount DOM。\n */\n\nimport type { SessionTree } from '../../types/tree';\nimport type { CanonicalNodeRef, ProjectionContext, RenderableEntry } from './renderModel';\nimport { RenderableTimelineProjector } from './projector';\nimport { buildCanonicalFromTree } from './treeAdapter';\n\nexport function projectTimeline(\n tree: SessionTree,\n context: ProjectionContext,\n): RenderableEntry[] {\n const canonical = buildCanonicalFromTree(tree);\n const sessionContext = context.withHasEverShownTaskList(tree.hasEverShownTaskList);\n return new RenderableTimelineProjector(sessionContext).project(canonical);\n}\n\nexport function projectCanonical(\n canonical: CanonicalNodeRef[],\n context: ProjectionContext,\n): RenderableEntry[] {\n return new RenderableTimelineProjector(context).project(canonical);\n}\n","/**\n * useProjectedTimeline.ts — SessionTree → mount 候选 RenderableEntry[]\n *\n * 职责:\n * memo 订阅 tree + SessionViewOptions,运行 projectTimeline + iterMountCandidates。\n *\n * 链路位置:\n * TimelineEntries / VirtualTimeline 消费。\n *\n * 当前裁剪范围:\n * grouped_tool_use / system_summary 由 Phase 4+ 渲染分支处理。\n */\n\nimport { useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport {\n buildProjectionContext,\n shouldShowExploreDetail,\n shouldShowReasoningInTimeline,\n shouldUseCompactNarrative,\n} from '../../view/sessionViewOptions';\nimport { getMainStageIds } from '../reducer';\nimport type { SessionStoreState } from '../store';\nimport { ToolProjectionClassifier } from '../projection/classify';\nimport { entryKey, iterMountCandidates } from '../projection/mountCandidates';\nimport { projectTimeline } from '../projection/projectTimeline';\nimport type { RenderableEntry } from '../projection/renderModel';\nimport { useSessionStoreApi } from '../context/SessionContext';\nimport { useSessionViewOptions } from '../context/SessionContext';\n\nexport interface ProjectedTimelineItem {\n key: string;\n entry: RenderableEntry;\n}\n\nfunction useProjectionSnapshot(): string {\n const store = useSessionStoreApi();\n return useStore(\n store,\n useShallow((state: SessionStoreState) => {\n const ids = getMainStageIds(state.tree);\n const main = ids\n .map((id) => {\n const node = state.tree.byId[id];\n if (!node) return `${id}:missing`;\n if (node.kind === 'tool_call') {\n const progress = node.progress?.message ?? '';\n return `${id}:tool:${node.toolName}:${node.status}:${progress}`;\n }\n if (node.kind === 'text' || node.kind === 'reasoning') {\n return `${id}:${node.kind}:${node.accumulated.length}:${node.status}`;\n }\n if (node.kind === 'permission') {\n return `${id}:permission:${node.toolName}:${node.status}`;\n }\n return `${id}:${node.kind}:${'status' in node ? node.status : ''}`;\n })\n .join('|');\n const system = state.tree.systemEvents\n .map((evt) => `${evt.eventIndex}:${evt.eventType}:${evt.timestamp}`)\n .join('|');\n return `${main}||sys:${system}||task:${state.tree.hasEverShownTaskList}`;\n }),\n );\n}\n\nexport function useProjectedTimeline(): ProjectedTimelineItem[] {\n const store = useSessionStoreApi();\n const viewOptions = useSessionViewOptions();\n const projectionSnapshot = useProjectionSnapshot();\n\n return useMemo(() => {\n const tree = store.getState().tree;\n const context = buildProjectionContext(viewOptions);\n const renderable = projectTimeline(tree, context);\n const classifier = new ToolProjectionClassifier(context);\n const exploreDetail = shouldShowExploreDetail(viewOptions);\n const hideStandalonePermissions = viewOptions.permissionUiMode === 'inline';\n const showReasoningInTimeline = shouldShowReasoningInTimeline(viewOptions);\n const compactNarrative = shouldUseCompactNarrative(viewOptions);\n return iterMountCandidates(renderable, {\n classifier,\n exploreDetail,\n hideStandalonePermissions,\n showReasoningInTimeline,\n compactNarrative,\n }).map(\n ([, entry]) => ({\n key: entryKey(entry),\n entry,\n }),\n );\n }, [store, viewOptions, projectionSnapshot]);\n}\n","/**\n * 职责:细粒度订阅 SessionStore,避免全树重渲。\n * 链路位置:view 节点组件与 Timeline 通过 hooks 读取状态。\n * 当前裁剪范围:7 个公开 hooks;含多会话 useActiveSession / useSessionIds。\n */\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/shallow';\n\nimport { getChildIds, getMainStageIds } from '../reducer';\nimport { useSessionStoreApi } from '../context/SessionContext';\nimport type { SessionStoreState } from '../store';\nimport type { SessionNode, SessionNodeKind } from '../../types/nodes';\nimport type { SessionStatus, ReducerError } from '../../types/tree';\n\nexport function useTimeline(): string[] {\n const store = useSessionStoreApi();\n return useStore(\n store,\n useShallow((state: SessionStoreState) => getMainStageIds(state.tree)),\n );\n}\n\nexport function useNode(id: string): SessionNode | undefined {\n const store = useSessionStoreApi();\n return useStore(store, (state: SessionStoreState) => state.tree.byId[id]);\n}\n\nexport function useNodeTyped<K extends SessionNodeKind>(\n id: string,\n kind: K,\n): Extract<SessionNode, { kind: K }> | undefined {\n const node = useNode(id);\n if (node?.kind === kind) {\n return node as Extract<SessionNode, { kind: K }>;\n }\n return undefined;\n}\n\nexport function useChildren(parentId: string): string[] {\n const store = useSessionStoreApi();\n return useStore(\n store,\n useShallow((state: SessionStoreState) => getChildIds(state.tree, parentId)),\n );\n}\n\nexport function useSessionStatus(): SessionStatus {\n const store = useSessionStoreApi();\n return useStore(store, (state: SessionStoreState) => state.tree.status);\n}\n\nexport function useInternalErrors(): ReducerError[] {\n const store = useSessionStoreApi();\n return useStore(store, (state: SessionStoreState) => state.tree.internalErrors);\n}\n\nexport function useSessionMeta() {\n const store = useSessionStoreApi();\n return useStore(store, (state: SessionStoreState) => state.tree.meta);\n}\n\nexport { useReplayTree } from './useReplayTree';\nexport { useActiveSession } from './useActiveSession';\nexport { useSessionIds } from './useSessionIds';\nexport { usePendingPermissionForTool } from './usePendingPermissionForTool';\nexport { useProjectedTimeline } from './useProjectedTimeline';\nexport { useActiveExploreSummary } from './useActiveExploreSummary';\nexport type { ProjectedTimelineItem } from './useProjectedTimeline';\n","/**\n * usePendingPermissionForTool.ts — 匹配 tool 的 pending permission 节点\n */\nimport { useStore } from 'zustand';\n\nimport { useSessionStoreApi } from '../context/SessionContext';\nimport type { SessionStoreState } from '../store';\nimport type { PermissionNode } from '../../types/nodes';\n\nexport function usePendingPermissionForTool(toolName: string): PermissionNode | undefined {\n const store = useSessionStoreApi();\n return useStore(store, (state: SessionStoreState) => {\n for (const id of state.tree.rootChildren) {\n const node = state.tree.byId[id];\n if (node?.kind !== 'permission' || node.status !== 'pending') continue;\n if (node.toolName !== toolName) continue;\n return node;\n }\n return undefined;\n });\n}\n","/**\n * useMinDisplayTime.ts — hint 最小展示时长(对齐 CC MIN_HINT_DISPLAY_MS = 700)\n */\nimport { useEffect, useRef, useState } from 'react';\n\nexport const MIN_HINT_DISPLAY_MS = 700;\n\n/**\n * 每个 distinct value 至少展示 minMs,避免 hint 闪烁过快。\n */\nexport function useMinDisplayTime<T>(value: T, minMs: number = MIN_HINT_DISPLAY_MS): T {\n const [displayed, setDisplayed] = useState(value);\n const lastShownAtRef = useRef(0);\n\n useEffect(() => {\n const elapsed = Date.now() - lastShownAtRef.current;\n if (elapsed >= minMs) {\n lastShownAtRef.current = Date.now();\n setDisplayed(value);\n return undefined;\n }\n const timer = window.setTimeout(() => {\n lastShownAtRef.current = Date.now();\n setDisplayed(value);\n }, minMs - elapsed);\n return () => window.clearTimeout(timer);\n }, [value, minMs]);\n\n return displayed;\n}\n","/**\n * TimelineItem.tsx — 单个主舞台节点渲染\n */\nimport type { NodeRegistry } from './NodeRegistry';\nimport { useNode } from '../core/hooks';\n\nexport interface TimelineItemProps {\n nodeId: string;\n registry: NodeRegistry;\n}\n\nexport function TimelineItem({ nodeId, registry }: TimelineItemProps) {\n const node = useNode(nodeId);\n if (!node) return null;\n const Widget = registry.get(node.kind);\n if (!Widget) return null;\n return (\n <div className=\"lax-timeline__item\" data-kind={node.kind} data-node-id={nodeId}>\n <Widget nodeId={nodeId} />\n </div>\n );\n}\n","/**\n * CollapsedExploreNode.tsx — collapsed_explore 摘要行(对齐 CC CollapsedReadSearchContent)\n *\n * 职责:\n * 消费 projection payload;active 闪烁 ● + 摘要 + hint + expand 文案。\n *\n * 链路位置:\n * TimelineEntries kind=collapsed_explore 分支。\n *\n * 当前裁剪范围:\n * verbose/transcript 下按 sourceNodeIds 原位展开 ToolCallCard(6b)。\n */\n\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { useSessionViewOptions } from '../../core/context/SessionContext';\nimport { useSessionStatus } from '../../core/hooks';\nimport type { RenderableEntry, ToolUseSnapshot } from '../../core/projection/renderModel';\nimport {\n formatExploreSummaryText,\n formatThoughtDurationPrefix,\n} from '../../core/projection/exploreSummary';\nimport { shouldShowExploreDetail, shouldUseCompactNarrative } from '../sessionViewOptions';\nimport { MIN_HINT_DISPLAY_MS, useMinDisplayTime } from '../hooks/useMinDisplayTime';\nimport type { NodeRegistry } from '../NodeRegistry';\nimport { TimelineItem } from '../TimelineItem';\n\nexport interface CollapsedExploreNodeProps {\n entry: RenderableEntry;\n registry: NodeRegistry;\n}\n\nfunction countsFromPayload(payload: Record<string, unknown>) {\n return {\n searchCount: Number(payload.searchCount ?? 0),\n readCount: Number(payload.readCount ?? 0),\n listCount: Number(payload.listCount ?? 0),\n bashCount: Number(payload.bashCount ?? 0),\n memorySearchCount: Number(payload.memorySearchCount ?? 0),\n memoryReadCount: Number(payload.memoryReadCount ?? 0),\n memoryWriteCount: Number(payload.memoryWriteCount ?? 0),\n relevantRecallCount: Number(payload.relevantRecallCount ?? 0),\n gitOpBashCount: Number(payload.gitOpBashCount ?? 0),\n mcpCallCount: Number(payload.mcpCallCount ?? 0),\n };\n}\n\nfunction toolUseNodeIds(entry: RenderableEntry): string[] {\n const toolUses = entry.payload.toolUses;\n if (!Array.isArray(toolUses) || toolUses.length === 0) {\n return entry.sourceNodeIds;\n }\n const callToNode = new Map<string, string>();\n for (const nodeId of entry.sourceNodeIds) {\n callToNode.set(nodeId, nodeId);\n }\n const ordered: string[] = [];\n for (const raw of toolUses as ToolUseSnapshot[]) {\n const callId = String(raw.tool_call_id ?? '').trim();\n const match = entry.sourceNodeIds.find(\n (nodeId) => nodeId === callId || nodeId.endsWith(`:${callId}`) || nodeId.includes(callId),\n );\n if (match && !ordered.includes(match)) ordered.push(match);\n }\n if (ordered.length > 0) return ordered;\n return entry.sourceNodeIds;\n}\n\nexport function CollapsedExploreNode({ entry, registry }: CollapsedExploreNodeProps) {\n const viewOptions = useSessionViewOptions();\n const sessionStatus = useSessionStatus();\n const globalShowDetail = shouldShowExploreDetail(viewOptions);\n const [locallyExpanded, setLocallyExpanded] = useState(false);\n const showDetail = globalShowDetail || locallyExpanded;\n const payload = entry.payload;\n const payloadActive = Boolean(payload.active);\n const sessionRunning = sessionStatus === 'running' || sessionStatus === 'connecting';\n const active = payloadActive && sessionRunning;\n const [blinkOn, setBlinkOn] = useState(true);\n\n const handleClick = () => {\n if (!globalShowDetail && !active) {\n setLocallyExpanded((prev) => !prev);\n }\n };\n\n const compactNarrative = shouldUseCompactNarrative(viewOptions);\n const thoughtSeconds = payload.thoughtElapsedSeconds;\n const hasThoughtPrefix =\n compactNarrative &&\n !active &&\n !showDetail &&\n typeof thoughtSeconds === 'number' &&\n Number.isFinite(thoughtSeconds) &&\n thoughtSeconds > 0;\n const exploreSummary = useMemo(() => {\n return (\n formatExploreSummaryText(countsFromPayload(payload), {\n active,\n continuingSentence: hasThoughtPrefix,\n }) ?? ''\n );\n }, [payload, active, hasThoughtPrefix]);\n\n const hint =\n typeof payload.latestDisplayHint === 'string' ? payload.latestDisplayHint : null;\n const displayedHint = useMinDisplayTime(hint, MIN_HINT_DISPLAY_MS);\n const shellProgressSuffix =\n typeof payload.shellProgressSuffix === 'string' ? payload.shellProgressSuffix : '';\n const thoughtPrefix = hasThoughtPrefix ? formatThoughtDurationPrefix(thoughtSeconds!) : '';\n const summaryLine = `${thoughtPrefix}${exploreSummary}${shellProgressSuffix}`;\n\n useEffect(() => {\n if (!active || showDetail) return undefined;\n const timer = window.setInterval(() => {\n setBlinkOn((value) => !value);\n }, 500);\n return () => window.clearInterval(timer);\n }, [active, showDetail]);\n\n const verboseNodeIds = showDetail ? toolUseNodeIds(entry) : [];\n\n const roundId = typeof payload.roundId === 'string' ? payload.roundId : null;\n\n return (\n <div\n className={[\n 'lax-collapsed-explore',\n active ? 'lax-collapsed-explore--active' : 'lax-collapsed-explore--finalized',\n ].join(' ')}\n data-kind=\"collapsed_explore\"\n data-active={active ? 'true' : 'false'}\n data-round-id={roundId ?? undefined}\n >\n <div\n className={[\n 'lax-collapsed-explore__summary',\n !globalShowDetail && !active ? 'lax-collapsed-explore__summary--clickable' : '',\n ].join(' ')}\n onClick={handleClick}\n >\n <span className=\"lax-collapsed-explore__marker\" aria-hidden=\"true\">\n {active && !showDetail ? (blinkOn ? '●' : ' ') : ' '}\n </span>\n <span className=\"lax-collapsed-explore__text\">{summaryLine}</span>\n {active && !showDetail ? (\n <span className=\"lax-collapsed-explore__expand-hint\">运行中...</span>\n ) : !showDetail ? (\n <span className=\"lax-collapsed-explore__expand-hint\">\n {compactNarrative ? '(ctrl+o to expand)' : 'click to expand'}\n </span>\n ) : locallyExpanded ? (\n <span className=\"lax-collapsed-explore__expand-hint\">click to collapse</span>\n ) : null}\n </div>\n\n {active && displayedHint && !showDetail ? (\n <div className=\"lax-collapsed-explore__hint\">\n <span className=\"lax-collapsed-explore__hint-prefix\">⎿</span>\n <span className=\"lax-collapsed-explore__hint-text\">{displayedHint}</span>\n </div>\n ) : null}\n\n {showDetail && verboseNodeIds.length > 0 ? (\n <div className=\"lax-collapsed-explore__verbose\">\n {verboseNodeIds.map((nodeId) => (\n <TimelineItem key={nodeId} nodeId={nodeId} registry={registry} />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * SystemSummaryNode.tsx — system_summary 摘要行\n *\n * 对齐 CC / CLI hook · compact 单行系统摘要。\n */\n\nexport interface SystemSummaryNodeProps {\n summaryText: string;\n}\n\nexport function SystemSummaryNode({ summaryText }: SystemSummaryNodeProps) {\n return (\n <div className=\"lax-system-summary\" data-kind=\"system_summary\">\n {summaryText}\n </div>\n );\n}\n","/**\n * TaskList 组件(对齐 CC TaskListV2)\n * 显示任务列表;可见性由 Spinner 根据 taskPhase 控制。\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { Task } from '../types/tasks';\nimport {\n computeTaskListMaxDisplay,\n isTaskBlocked,\n RECENT_COMPLETED_TTL_MS,\n selectVisibleTasks,\n} from './taskListDisplay';\n\nconst TASK_ICONS = {\n completed: '✔',\n in_progress: '◼',\n pending: '◻',\n} as const;\n\ninterface TaskListProps {\n tasks: Task[];\n /** 省略时按视口高度动态计算(对齐 CC 终端行数档位) */\n maxDisplay?: number;\n /** false = Spinner 内嵌模式,不显示统计行(对齐 CC TaskListV2) */\n isStandalone?: boolean;\n}\n\nfunction useTaskListMaxDisplay(explicit?: number): number {\n const [computed, setComputed] = useState(() =>\n computeTaskListMaxDisplay(typeof window !== 'undefined' ? window.innerHeight : 800),\n );\n\n useEffect(() => {\n if (explicit !== undefined) {\n return undefined;\n }\n const sync = () => setComputed(computeTaskListMaxDisplay(window.innerHeight));\n sync();\n window.addEventListener('resize', sync);\n return () => window.removeEventListener('resize', sync);\n }, [explicit]);\n\n return explicit ?? computed;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60000) {\n if (ms === 0) return '0s';\n if (ms < 1000) return `${Math.round(ms / 100) / 10}s`;\n return `${Math.floor(ms / 1000)}s`;\n }\n\n const days = Math.floor(ms / 86400000);\n const hours = Math.floor((ms % 86400000) / 3600000);\n const minutes = Math.floor((ms % 3600000) / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n if (minutes > 0) return `${minutes}m ${seconds}s`;\n return `${seconds}s`;\n}\n\nfunction formatTokenCount(count: number): string {\n if (count < 1000) return count.toString();\n if (count < 10000) return (count / 1000).toFixed(1) + 'k';\n if (count < 1000000) return Math.round(count / 1000).toString() + 'k';\n return (count / 1000000).toFixed(1) + 'M';\n}\n\nexport function TaskList({\n tasks,\n maxDisplay: maxDisplayProp,\n isStandalone = true,\n}: TaskListProps) {\n const maxDisplay = useTaskListMaxDisplay(maxDisplayProp);\n const completionTimestampsRef = useRef(new Map<string, number>());\n const previousCompletedIdsRef = useRef<Set<string> | null>(null);\n const [displayTick, setDisplayTick] = useState(0);\n\n if (previousCompletedIdsRef.current === null) {\n previousCompletedIdsRef.current = new Set(\n tasks.filter((t) => t.status === 'completed').map((t) => t.id),\n );\n }\n\n const currentCompletedIds = useMemo(\n () => new Set(tasks.filter((t) => t.status === 'completed').map((t) => t.id)),\n [tasks],\n );\n\n const now = Date.now();\n for (const id of currentCompletedIds) {\n if (!previousCompletedIdsRef.current.has(id)) {\n completionTimestampsRef.current.set(id, now);\n }\n }\n for (const id of completionTimestampsRef.current.keys()) {\n if (!currentCompletedIds.has(id)) {\n completionTimestampsRef.current.delete(id);\n }\n }\n previousCompletedIdsRef.current = currentCompletedIds;\n\n useEffect(() => {\n if (completionTimestampsRef.current.size === 0) return undefined;\n const currentNow = Date.now();\n let earliestExpiry = Infinity;\n for (const ts of completionTimestampsRef.current.values()) {\n const expiry = ts + RECENT_COMPLETED_TTL_MS;\n if (expiry > currentNow && expiry < earliestExpiry) {\n earliestExpiry = expiry;\n }\n }\n if (earliestExpiry === Infinity) return undefined;\n const timer = setTimeout(() => setDisplayTick((n) => n + 1), earliestExpiry - currentNow);\n return () => clearTimeout(timer);\n }, [tasks]);\n\n const { visibleTasks, hiddenSummary } = useMemo(\n () =>\n selectVisibleTasks(tasks, {\n maxDisplay,\n completionTimestamps: completionTimestampsRef.current,\n }),\n [tasks, maxDisplay, displayTick],\n );\n\n if (tasks.length === 0) {\n return null;\n }\n\n const completedCount = tasks.filter((t) => t.status === 'completed').length;\n const inProgressCount = tasks.filter((t) => t.status === 'in_progress').length;\n const pendingCount = tasks.filter((t) => t.status === 'pending').length;\n\n const items = (\n <div className=\"lax-task-list__items\">\n {visibleTasks.map((task) => (\n <TaskItem key={task.id} task={task} allTasks={tasks} />\n ))}\n {hiddenSummary ? (\n <div className=\"lax-task-list__hidden-summary\">{hiddenSummary}</div>\n ) : null}\n </div>\n );\n\n if (!isStandalone) {\n return (\n <div className=\"lax-task-list lax-task-list--embedded\" data-testid=\"lax-task-list\">\n {items}\n </div>\n );\n }\n\n return (\n <div className=\"lax-task-list\" data-testid=\"lax-task-list\">\n <div className=\"lax-task-list__stats\">\n <span className=\"lax-task-list__stat-count\">{tasks.length}</span>\n <span> tasks (</span>\n <span className=\"lax-task-list__stat-count\">{completedCount}</span>\n <span> done</span>\n {inProgressCount > 0 && (\n <>, <span className=\"lax-task-list__stat-count\">{inProgressCount}</span> in progress</>\n )}\n {pendingCount > 0 && (\n <>, <span className=\"lax-task-list__stat-count\">{pendingCount}</span> open</>\n )}\n <span>)</span>\n </div>\n {items}\n </div>\n );\n}\n\nfunction TaskItem({ task, allTasks }: { task: Task; allTasks: Task[] }) {\n const icon = TASK_ICONS[task.status];\n const isCompleted = task.status === 'completed';\n const isBlocked = isTaskBlocked(task, allTasks);\n const isInProgress = task.status === 'in_progress' && !isBlocked;\n\n const iconClassName = [\n 'lax-task-item__icon',\n isInProgress && 'lax-task-item__icon--in-progress',\n ]\n .filter(Boolean)\n .join(' ');\n\n const subjectClassName = [\n 'lax-task-item__subject',\n isCompleted && 'lax-task-item__subject--completed',\n isInProgress && 'lax-task-item__subject--in-progress',\n isBlocked && 'lax-task-item__subject--blocked',\n ]\n .filter(Boolean)\n .join(' ');\n\n let metaText: string | null = null;\n const metadata = task.metadata;\n\n if (metadata) {\n const parts: string[] = [];\n\n if (typeof metadata.elapsed_time_seconds === 'number') {\n parts.push(formatDuration(metadata.elapsed_time_seconds * 1000));\n } else if (task.startedAt && (isCompleted ? task.completedAt : Date.now())) {\n const elapsed =\n isCompleted && task.completedAt\n ? task.completedAt - task.startedAt\n : Date.now() - task.startedAt;\n if (elapsed > 0) parts.push(formatDuration(elapsed));\n }\n\n const usage = metadata.usage as\n | { input_tokens?: number; output_tokens?: number; total_tokens?: number }\n | undefined;\n if (usage?.total_tokens !== undefined) {\n parts.push(`↑ ${formatTokenCount(usage.total_tokens)} tokens`);\n } else if (usage?.input_tokens !== undefined || usage?.output_tokens !== undefined) {\n const input = usage.input_tokens ?? 0;\n const output = usage.output_tokens ?? 0;\n parts.push(`↑ ${formatTokenCount(input + output)} tokens`);\n }\n\n if (parts.length > 0) metaText = parts.join(' · ');\n }\n\n return (\n <div\n className={`lax-task-item lax-task-item--${task.status}${isBlocked ? ' lax-task-item--blocked' : ''}`}\n data-testid={`lax-task-item-${task.id}`}\n data-blocked={isBlocked ? 'true' : 'false'}\n >\n <span className={iconClassName}>{icon}</span>\n <span className={subjectClassName}>{task.subject}</span>\n {task.owner ? <span className=\"lax-task-item__owner\"> @{task.owner}</span> : null}\n {metaText && <span className=\"lax-task-item__meta\"> ({metaText})</span>}\n </div>\n );\n}\n","/**\n * TaskList 展示逻辑(对齐 CC TaskListV2 截断 + RECENT_COMPLETED_TTL)。\n */\n\nimport type { Task } from '../types/tasks';\n\nexport const RECENT_COMPLETED_TTL_MS = 30_000;\nexport const DEFAULT_TASK_LIST_MAX_DISPLAY = 10;\n\n/** 对齐 CC TaskListV2 终端行数档位(Web 用视口高度近似) */\nexport function computeTaskListMaxDisplay(viewportHeight: number): number {\n const estimated = Math.floor((viewportHeight - 200) / 22);\n return Math.max(5, Math.min(15, estimated));\n}\n\n/** 对齐 CC TaskItem openBlockers — 仍 unresolved 的 blockedBy 项 */\nexport function getOpenBlockerIds(task: Task, tasks: Task[]): string[] {\n const unresolvedIds = new Set(\n tasks.filter((t) => t.status !== 'completed').map((t) => t.id),\n );\n return task.blockedBy.filter((id) => unresolvedIds.has(id));\n}\n\nexport function isTaskBlocked(task: Task, tasks: Task[]): boolean {\n if (task.status === 'completed') {\n return false;\n }\n return getOpenBlockerIds(task, tasks).length > 0;\n}\n\nexport interface TaskListDisplayResult {\n visibleTasks: Task[];\n hiddenSummary: string;\n}\n\nfunction byIdAsc(a: Task, b: Task): number {\n const aNum = parseInt(a.id, 10);\n const bNum = parseInt(b.id, 10);\n if (!Number.isNaN(aNum) && !Number.isNaN(bNum)) return aNum - bNum;\n return a.id.localeCompare(b.id);\n}\n\nexport function buildHiddenSummary(hiddenTasks: Task[]): string {\n if (hiddenTasks.length === 0) return '';\n const hiddenInProgress = hiddenTasks.filter((t) => t.status === 'in_progress').length;\n const hiddenPending = hiddenTasks.filter((t) => t.status === 'pending').length;\n const hiddenCompleted = hiddenTasks.filter((t) => t.status === 'completed').length;\n const parts: string[] = [];\n if (hiddenInProgress > 0) parts.push(`${hiddenInProgress} in progress`);\n if (hiddenPending > 0) parts.push(`${hiddenPending} pending`);\n if (hiddenCompleted > 0) parts.push(`${hiddenCompleted} completed`);\n return parts.length > 0 ? ` … +${parts.join(', ')}` : '';\n}\n\nexport function selectVisibleTasks(\n tasks: Task[],\n options: {\n maxDisplay: number;\n now?: number;\n completionTimestamps?: ReadonlyMap<string, number>;\n },\n): TaskListDisplayResult {\n const now = options.now ?? Date.now();\n const completionTimestamps = options.completionTimestamps ?? new Map<string, number>();\n const maxDisplay = options.maxDisplay;\n\n if (maxDisplay <= 0 || tasks.length <= maxDisplay) {\n return {\n visibleTasks: [...tasks].sort(byIdAsc),\n hiddenSummary: '',\n };\n }\n\n const unresolvedTaskIds = new Set(\n tasks.filter((t) => t.status !== 'completed').map((t) => t.id),\n );\n\n const recentCompleted: Task[] = [];\n const olderCompleted: Task[] = [];\n for (const task of tasks.filter((t) => t.status === 'completed')) {\n const ts = completionTimestamps.get(task.id);\n if (ts !== undefined && now - ts < RECENT_COMPLETED_TTL_MS) {\n recentCompleted.push(task);\n } else {\n olderCompleted.push(task);\n }\n }\n recentCompleted.sort(byIdAsc);\n olderCompleted.sort(byIdAsc);\n\n const inProgress = tasks.filter((t) => t.status === 'in_progress').sort(byIdAsc);\n const pending = tasks\n .filter((t) => t.status === 'pending')\n .sort((a, b) => {\n const aBlocked = a.blockedBy.some((id) => unresolvedTaskIds.has(id));\n const bBlocked = b.blockedBy.some((id) => unresolvedTaskIds.has(id));\n if (aBlocked !== bBlocked) return aBlocked ? 1 : -1;\n return byIdAsc(a, b);\n });\n\n const prioritized = [...recentCompleted, ...inProgress, ...pending, ...olderCompleted];\n const visibleTasks = prioritized.slice(0, maxDisplay);\n const hiddenTasks = prioritized.slice(maxDisplay);\n\n return {\n visibleTasks,\n hiddenSummary: buildHiddenSummary(hiddenTasks),\n };\n}\n","/**\n * 职责:消息流底部的加载状态指示器(对齐 CC Spinner)。\n * 链路位置:AgentSession → SessionTimeline → Spinner → SpinnerAnimationRow。\n * 当前裁剪范围:状态订阅、任务列表内嵌;50ms 动画隔离在 AnimationRow。\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'react';\nimport { useSessionStatus } from '../core/hooks';\nimport { useSessionStoreApi } from '../core/context/SessionContext';\nimport type { TaskPhase } from '../types/tree';\nimport type { Task } from '../types/tasks';\nimport { TaskList } from './TaskList';\nimport { pickRandomVerb } from './spinner/constants';\nimport { SpinnerAnimationRow } from './spinner/SpinnerAnimationRow';\nimport type { SpinnerGlimmerMode } from './spinner/SpinnerGlimmerVerb';\nimport type { SpinnerElapsedInput } from './spinner/spinnerTiming';\nimport {\n findNextPendingTask,\n formatNextTaskLineText,\n shouldShowNextTaskLine,\n} from './spinner/taskQueueDisplay';\n\nfunction MessageResponse({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"lax-message-response\">\n <span className=\"lax-message-response__marker\">⎿ </span>\n <span className=\"lax-message-response__content\">{children}</span>\n </div>\n );\n}\n\n/** 纯函数:Spinner 内是否展示任务列表(对齐 CC showExpandedTodos + tasksV2) */\nexport function shouldShowSpinnerTaskList(\n taskPhase: TaskPhase,\n tasks: Task[],\n hasEverShownTaskList: boolean,\n contentCharCount = 0,\n): boolean {\n if (!hasEverShownTaskList || tasks.length === 0) {\n return false;\n }\n if (taskPhase === 'visible') {\n return true;\n }\n // CC:全 completed 后 Spinner 仍运行时继续显示 ⎿ 任务项,直到主舞台开始输出文本\n if (taskPhase === 'hidden-after-completion') {\n return contentCharCount === 0;\n }\n return false;\n}\n\nexport interface SpinnerProps {\n /** Session 启动时间(毫秒时间戳) */\n startedAt: number | null;\n /** 当前内容字符数(用于估算 Token) */\n contentCharCount?: number;\n /** 当前模式(用于跟踪 thinking 状态) */\n mode?: 'idle' | 'requesting' | 'tool-use' | 'thinking';\n /** 对齐 CC verbose:30s 前仍显示 timer/token 后缀 */\n verbose?: boolean;\n /** pause 扣除(SDK 无事件时省略) */\n timing?: Pick<SpinnerElapsedInput, 'totalPausedMs' | 'pauseStartTimeMs'>;\n}\n\nexport function Spinner({\n startedAt,\n contentCharCount = 0,\n mode = 'idle',\n verbose = false,\n timing,\n}: SpinnerProps) {\n const status = useSessionStatus();\n const store = useSessionStoreApi();\n const isRunning = status === 'running' || status === 'connecting';\n\n const activeRoundId = useSyncExternalStore(\n (callback) => store.subscribe(callback),\n () => store.getState().tree.activeRoundId,\n );\n\n const hookProgress = useSyncExternalStore(\n (callback) => store.subscribe(callback),\n () => store.getState().tree.hookProgress,\n );\n\n const taskListRevision = useSyncExternalStore(\n (callback) => store.subscribe(callback),\n () => {\n const tree = store.getState().tree;\n const parts: string[] = [tree.taskPhase, String(tree.hasEverShownTaskList)];\n for (const id of Object.keys(tree.tasks).sort()) {\n parts.push(`${id}:${tree.tasks[id].status}`);\n }\n return parts.join('|');\n },\n );\n\n const { tasks, taskPhase, hasEverShownTaskList } = useMemo(() => {\n const tree = store.getState().tree;\n return {\n tasks: Object.values(tree.tasks),\n taskPhase: tree.taskPhase,\n hasEverShownTaskList: tree.hasEverShownTaskList,\n };\n }, [store, taskListRevision]);\n\n const showTaskList = shouldShowSpinnerTaskList(\n taskPhase,\n tasks,\n hasEverShownTaskList,\n contentCharCount,\n );\n\n const showNextLine = shouldShowNextTaskLine(showTaskList, tasks, status);\n const nextTask = showNextLine ? findNextPendingTask(tasks) : undefined;\n\n const derivedMode = mode !== 'idle' ? mode : (activeRoundId ? 'thinking' : 'requesting');\n const effectiveMode: SpinnerGlimmerMode =\n derivedMode === 'tool-use' ? 'tool-use' : derivedMode === 'thinking' ? 'thinking' : 'requesting';\n const hasActiveTools = effectiveMode === 'tool-use';\n\n const [fallbackVerb] = useState(() => pickRandomVerb());\n\n const [thinkingStatus, setThinkingStatus] = useState<'thinking' | number | null>(null);\n const thinkingStartRef = useRef<number | null>(null);\n\n useEffect(() => {\n let showDurationTimer: ReturnType<typeof setTimeout> | null = null;\n let clearStatusTimer: ReturnType<typeof setTimeout> | null = null;\n\n if (derivedMode === 'thinking') {\n if (thinkingStartRef.current === null) {\n thinkingStartRef.current = Date.now();\n setThinkingStatus('thinking');\n }\n } else if (thinkingStartRef.current !== null) {\n const duration = Date.now() - thinkingStartRef.current;\n const elapsed = Date.now() - thinkingStartRef.current;\n const remainingThinkingTime = Math.max(0, 2000 - elapsed);\n thinkingStartRef.current = null;\n\n const showDuration = (): void => {\n setThinkingStatus(duration);\n clearStatusTimer = setTimeout(setThinkingStatus, 2000, null);\n };\n\n if (remainingThinkingTime > 0) {\n showDurationTimer = setTimeout(showDuration, remainingThinkingTime);\n } else {\n showDuration();\n }\n }\n\n return () => {\n if (showDurationTimer) clearTimeout(showDurationTimer);\n if (clearStatusTimer) clearTimeout(clearStatusTimer);\n };\n }, [derivedMode]);\n\n if (!isRunning || !startedAt) {\n return null;\n }\n\n const inProgressTasks = tasks.filter((t) => t.status === 'in_progress');\n const currentTodo =\n inProgressTasks[0] ?? tasks.find((t) => t.status === 'pending');\n const effectiveVerb = currentTodo?.activeForm ?? currentTodo?.subject ?? fallbackVerb;\n\n let spinnerSuffix: string | null = null;\n if (hookProgress.total > 0 && hookProgress.currentToolUseID) {\n const { total, completed, customMessage } = hookProgress;\n if (customMessage) {\n spinnerSuffix = total === 1 ? `${customMessage}…` : `${customMessage}… ${completed}/${total}`;\n } else {\n spinnerSuffix = total === 1 ? `running stop hook…` : `running stop hooks… ${completed}/${total}`;\n }\n }\n\n let thinkingText: string | null = null;\n if (thinkingStatus === 'thinking') {\n thinkingText = 'thinking';\n } else if (typeof thinkingStatus === 'number') {\n thinkingText = `thought for ${Math.max(1, Math.round(thinkingStatus / 1000))}s`;\n }\n\n return (\n <div className=\"lax-spinner-container\" data-testid=\"lax-spinner-container\">\n <SpinnerAnimationRow\n mode={effectiveMode}\n verb={effectiveVerb}\n startedAt={startedAt}\n contentCharCount={contentCharCount}\n hasActiveTools={hasActiveTools}\n spinnerSuffix={spinnerSuffix}\n thinkingText={thinkingText}\n thinkingStatus={thinkingStatus}\n verbose={verbose}\n timing={timing}\n />\n\n {showTaskList && (\n <MessageResponse>\n <TaskList tasks={tasks} isStandalone={false} />\n </MessageResponse>\n )}\n\n {nextTask && (\n <MessageResponse>\n <span className=\"lax-spinner-next-line\">{formatNextTaskLineText(nextTask)}</span>\n </MessageResponse>\n )}\n </div>\n );\n}\n","/**\n * 职责:Spinner 动画常量与格式化工具(对齐 CC SPINNER_FRAMES / formatDuration)。\n * 链路位置:SpinnerAnimationRow / SpinnerGlimmerVerb 共享。\n * 当前裁剪范围:帧序列、动词池、duration/token 格式化。\n */\n\nconst _BASE_FRAMES = ['·', '✢', '*', '✶', '✻', '✽'];\nexport const SPINNER_FRAMES = [..._BASE_FRAMES, ..._BASE_FRAMES.slice().reverse()];\n\nexport const SPINNER_FRAME_INTERVAL_MS = 120;\nexport const ANIMATION_TICK_MS = 50;\n\nexport const SPINNER_VERBS = [\n 'Accomplishing',\n 'Actioning',\n 'Actualizing',\n 'Architecting',\n 'Baking',\n 'Beaming',\n 'Beboppin\\'',\n 'Befuddling',\n 'Billowing',\n 'Blanching',\n 'Bloviating',\n 'Boogieing',\n 'Boondoggling',\n 'Booping',\n 'Bootstrapping',\n 'Brewing',\n 'Bunning',\n 'Burrowing',\n 'Calculating',\n 'Canoodling',\n 'Caramelizing',\n 'Cascading',\n 'Catapulting',\n 'Cerebrating',\n 'Channeling',\n 'Channelling',\n 'Choreographing',\n 'Churning',\n 'Clauding',\n 'Coalescing',\n 'Cogitating',\n 'Combobulating',\n 'Composing',\n 'Computing',\n 'Concocting',\n 'Considering',\n 'Contemplating',\n 'Cooking',\n 'Crafting',\n 'Creating',\n 'Crunching',\n 'Crystallizing',\n 'Cultivating',\n 'Deciphering',\n 'Deliberating',\n 'Determining',\n 'Dilly-dallying',\n 'Discombobulating',\n 'Doing',\n 'Doodling',\n 'Drizzling',\n 'Ebbing',\n 'Effecting',\n 'Elucidating',\n 'Embellishing',\n 'Enchanting',\n 'Envisioning',\n 'Evaporating',\n 'Fermenting',\n 'Fiddle-faddling',\n 'Finagling',\n 'Flambéing',\n 'Flibbertigibbet',\n 'Flowing',\n 'Flummoxing',\n 'Fluttering',\n 'Forging',\n 'Forming',\n 'Frolicking',\n 'Frosting',\n 'Gallivanting',\n 'Galloping',\n 'Garnishing',\n 'Generating',\n 'Gesticulating',\n 'Germinating',\n 'Gitifying',\n 'Grooving',\n 'Gusting',\n 'Harmonizing',\n 'Hashing',\n 'Hatching',\n 'Herding',\n 'Honking',\n 'Hullaballooing',\n 'Hyperspacing',\n 'Ideating',\n 'Imagining',\n 'Improvising',\n 'Incubating',\n 'Inferring',\n 'Infusing',\n 'Ionizing',\n 'Jitterbugging',\n 'Julienning',\n 'Kneading',\n 'Leavening',\n 'Levitating',\n 'Lollygagging',\n 'Manifesting',\n 'Marinating',\n 'Meandering',\n 'Metamorphosing',\n 'Misting',\n 'Moonwalking',\n 'Moseying',\n 'Mulling',\n 'Mustering',\n 'Musing',\n 'Nebulizing',\n 'Nesting',\n 'Newspapering',\n 'Noodling',\n 'Nucleating',\n 'Orbiting',\n 'Orchestrating',\n 'Osmosing',\n 'Perambulating',\n 'Percolating',\n 'Perusing',\n 'Philosophising',\n 'Photosynthesizing',\n 'Pollinating',\n 'Pondering',\n 'Pontificating',\n 'Pouncing',\n 'Precipitating',\n 'Prestidigitating',\n 'Processing',\n 'Proofing',\n 'Propagating',\n 'Puttering',\n 'Puzzling',\n 'Quantumizing',\n 'Razzle-dazzling',\n 'Razzmatazzing',\n 'Recombobulating',\n 'Reticulating',\n 'Roosting',\n 'Ruminating',\n 'Sautéing',\n 'Scampering',\n 'Schlepping',\n 'Scurrying',\n 'Seasoning',\n 'Shenaniganing',\n 'Shimmying',\n 'Simmering',\n 'Skedaddling',\n 'Sketching',\n 'Slithering',\n 'Smooshing',\n 'Sock-hopping',\n 'Spelunking',\n 'Spinning',\n 'Sprouting',\n 'Stewing',\n 'Sublimating',\n 'Swirling',\n 'Swooping',\n 'Symbioting',\n 'Synthesizing',\n 'Tempering',\n 'Thinking',\n 'Thundering',\n 'Tinkering',\n 'Tomfoolering',\n 'Topsy-turvying',\n 'Transfiguring',\n 'Transmuting',\n 'Twisting',\n 'Undulating',\n 'Unfurling',\n 'Unravelling',\n 'Vibing',\n 'Waddling',\n 'Wandering',\n 'Warping',\n 'Whatchamacalliting',\n 'Whirlpooling',\n 'Whirring',\n 'Whisking',\n 'Wibbling',\n 'Working',\n 'Wrangling',\n 'Zesting',\n 'Zigzagging',\n] as const;\n\n/** 对齐 CC formatDuration */\nexport function formatDuration(ms: number): string {\n if (ms < 60000) {\n if (ms === 0) return '0s';\n if (ms < 1000) return `${Math.round(ms / 100) / 10}s`;\n return `${Math.floor(ms / 1000)}s`;\n }\n\n const days = Math.floor(ms / 86400000);\n const hours = Math.floor((ms % 86400000) / 3600000);\n const minutes = Math.floor((ms % 3600000) / 60000);\n const seconds = Math.round((ms % 60000) / 1000);\n\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n if (minutes > 0) return `${minutes}m ${seconds}s`;\n return `${seconds}s`;\n}\n\n/** 对齐 CC formatNumber */\nexport function formatTokenCount(count: number): string {\n if (count < 1000) return count.toString();\n if (count < 10000) return (count / 1000).toFixed(1) + 'k';\n if (count < 1000000) return Math.round(count / 1000).toString() + 'k';\n return (count / 1000000).toFixed(1) + 'M';\n}\n\n/** Claude 约为 4 字符/token;Web 沿用 3.5 保守估算 */\nexport function estimateTokens(charCount: number): number {\n return Math.round(charCount / 3.5);\n}\n\nexport function pickRandomVerb(): (typeof SPINNER_VERBS)[number] {\n return SPINNER_VERBS[Math.floor(Math.random() * SPINNER_VERBS.length)];\n}\n\n/** 由动画时钟推导帧索引(对齐 CC Math.floor(time / 120)) */\nexport function getSpinnerFrameIndex(timeMs: number, reducedMotion = false): number {\n if (reducedMotion) return 0;\n return Math.floor(timeMs / SPINNER_FRAME_INTERVAL_MS) % SPINNER_FRAMES.length;\n}\n\nexport function getSpinnerFrame(timeMs: number, reducedMotion = false): string {\n return SPINNER_FRAMES[getSpinnerFrameIndex(timeMs, reducedMotion)];\n}\n","/**\n * 职责:Spinner 50ms 热路径动画行(对齐 CC SpinnerAnimationRow)。\n * 链路位置:Spinner → SpinnerAnimationRow → SpinnerGlimmerVerb。\n * 当前裁剪范围:帧动画、glimmer、token 平滑、elapsed、stall;不含任务列表。\n */\n\nimport { useRef } from 'react';\nimport {\n ANIMATION_TICK_MS,\n SPINNER_FRAMES,\n estimateTokens,\n getSpinnerFrameIndex,\n} from './constants';\nimport { SpinnerGlimmerVerb, type SpinnerGlimmerMode } from './SpinnerGlimmerVerb';\nimport {\n computeEffectiveElapsedMs,\n formatElapsedSuffixText,\n formatTokenSuffixText,\n shouldShowElapsedSuffix,\n shouldShowTokenSuffix,\n stepSmoothedTokenCount,\n type SpinnerElapsedInput,\n type SpinnerSuffixVisibilityOptions,\n} from './spinnerTiming';\nimport { useAnimationFrame } from './useAnimationFrame';\nimport { useReducedMotion } from './useReducedMotion';\nimport { useStalledSpinnerIntensity } from './useStalledSpinnerIntensity';\n\nexport interface SpinnerAnimationRowProps {\n mode: SpinnerGlimmerMode;\n verb: string;\n startedAt: number;\n contentCharCount: number;\n hasActiveTools: boolean;\n spinnerSuffix: string | null;\n thinkingText: string | null;\n thinkingStatus: 'thinking' | number | null;\n /** 对齐 CC verbose:跳过后缀 30s 阈值 */\n verbose?: boolean;\n /** pause 扣除(SDK 无事件时默认 0 / null) */\n timing?: Pick<SpinnerElapsedInput, 'totalPausedMs' | 'pauseStartTimeMs'>;\n}\n\nexport function SpinnerAnimationRow({\n mode,\n verb,\n startedAt,\n contentCharCount,\n hasActiveTools,\n spinnerSuffix,\n thinkingText,\n thinkingStatus,\n verbose = false,\n timing,\n}: SpinnerAnimationRowProps) {\n const reducedMotion = useReducedMotion();\n const time = useAnimationFrame(reducedMotion ? null : ANIMATION_TICK_MS);\n\n const targetTokenCount = estimateTokens(contentCharCount);\n const tokenCounterRef = useRef(targetTokenCount);\n\n const { stalledIntensity } = useStalledSpinnerIntensity(\n time,\n contentCharCount,\n hasActiveTools,\n reducedMotion,\n );\n\n const frameIndex = getSpinnerFrameIndex(time, reducedMotion);\n const frame = SPINNER_FRAMES[frameIndex];\n\n const shimmerActive =\n !reducedMotion &&\n stalledIntensity === 0 &&\n (mode === 'requesting' || mode === 'thinking');\n\n const flashOpacity =\n reducedMotion || mode !== 'tool-use'\n ? 0\n : (Math.sin((time / 1000) * Math.PI) + 1) / 2;\n\n if (reducedMotion) {\n tokenCounterRef.current = targetTokenCount;\n } else {\n tokenCounterRef.current = stepSmoothedTokenCount(\n tokenCounterRef.current,\n targetTokenCount,\n false,\n );\n }\n\n const suffixVisibility: SpinnerSuffixVisibilityOptions = { verbose };\n const effectiveElapsedMs = computeEffectiveElapsedMs({\n nowMs: Date.now(),\n loadingStartTimeMs: startedAt,\n totalPausedMs: timing?.totalPausedMs,\n pauseStartTimeMs: timing?.pauseStartTimeMs,\n });\n\n const elapsedText = shouldShowElapsedSuffix(effectiveElapsedMs, suffixVisibility)\n ? formatElapsedSuffixText(effectiveElapsedMs)\n : '';\n const tokensText = shouldShowTokenSuffix(\n effectiveElapsedMs,\n tokenCounterRef.current,\n suffixVisibility,\n )\n ? formatTokenSuffixText(tokenCounterRef.current)\n : '';\n\n const statusParts: Array<{ text: string; className?: string }> = [];\n if (spinnerSuffix) statusParts.push({ text: spinnerSuffix });\n if (elapsedText) statusParts.push({ text: elapsedText });\n if (tokensText) statusParts.push({ text: tokensText });\n if (thinkingText) {\n statusParts.push({\n text: thinkingText,\n className:\n thinkingStatus === 'thinking' ? 'lax-spinner-status-part--thinking' : undefined,\n });\n }\n\n return (\n <div className=\"lax-spinner\" data-testid=\"lax-spinner\">\n <span className=\"lax-spinner-frame\" data-testid=\"lax-spinner-frame\">\n {frame}\n </span>\n <SpinnerGlimmerVerb\n verb={verb}\n mode={mode}\n reducedMotion={reducedMotion}\n stalledIntensity={stalledIntensity}\n flashOpacity={flashOpacity}\n shimmerActive={shimmerActive}\n />\n {statusParts.length > 0 && (\n <span className=\"lax-spinner-status\">\n {' ('}\n {statusParts.map((part, i) => (\n <span\n key={i}\n className={`lax-spinner-status-part${part.className ? ` ${part.className}` : ''}`}\n >\n {i > 0 && ' · '}\n {part.text}\n </span>\n ))}\n {')'}\n </span>\n )}\n </div>\n );\n}\n","/**\n * 职责:Spinner 动词 shimmer / stall / tool-use 视觉(对齐 CC GlimmerMessage,CSS 实现)。\n * 链路位置:SpinnerAnimationRow → SpinnerGlimmerVerb。\n * 当前裁剪范围:不移植 Ink 逐 grapheme;用 gradient + color-mix。\n */\n\nimport type { CSSProperties } from 'react';\n\nexport type SpinnerGlimmerMode = 'requesting' | 'tool-use' | 'thinking' | 'idle';\n\nexport interface SpinnerGlimmerVerbProps {\n verb: string;\n mode: SpinnerGlimmerMode;\n reducedMotion: boolean;\n stalledIntensity: number;\n flashOpacity: number;\n shimmerActive: boolean;\n}\n\nexport function SpinnerGlimmerVerb({\n verb,\n mode,\n reducedMotion,\n stalledIntensity,\n flashOpacity,\n shimmerActive,\n}: SpinnerGlimmerVerbProps) {\n const classes = ['lax-spinner-verb'];\n if (reducedMotion) {\n classes.push('lax-spinner-verb--static');\n } else if (stalledIntensity > 0) {\n classes.push('lax-spinner-verb--stalled');\n } else if (mode === 'tool-use') {\n classes.push('lax-spinner-verb--tool-use');\n } else if (shimmerActive) {\n classes.push('lax-spinner-verb--shimmer');\n if (mode === 'requesting') {\n classes.push('lax-spinner-verb--shimmer-fast');\n }\n }\n\n const style: CSSProperties = {\n ...(stalledIntensity > 0 && {\n ['--lax-spinner-stall-intensity' as string]: String(stalledIntensity),\n }),\n ...(mode === 'tool-use' &&\n !reducedMotion && {\n ['--lax-spinner-flash-opacity' as string]: String(flashOpacity),\n }),\n };\n\n return (\n <span className={classes.join(' ')} style={style}>\n {verb}…\n </span>\n );\n}\n","/**\n * 职责:Spinner 括号后缀出现时机(对齐 CC SHOW_TOKENS_AFTER_MS / wantsTimerAndTokens)。\n * 链路位置:SpinnerAnimationRow 每 tick 调用纯函数。\n * 当前裁剪范围:30s token 阈值、pause 扣除 API;teammate 分支预留。\n */\n\nimport { formatDuration, formatTokenCount } from './constants';\n\n/** 对齐 CC SpinnerAnimationRow SHOW_TOKENS_AFTER_MS */\nexport const SHOW_TOKENS_AFTER_MS = 30_000;\n\nexport interface SpinnerElapsedInput {\n /** 当前 wall-clock(ms) */\n nowMs: number;\n /** Turn 加载开始时间(ms) */\n loadingStartTimeMs: number;\n /** 已累计 pause 时长(ms);SDK 无 pause 事件时为 0 */\n totalPausedMs?: number;\n /** pause 开始时间;非 null 表示当前处于 pause 冻结 */\n pauseStartTimeMs?: number | null;\n}\n\n/** 对齐 CC elapsedTimeMs:扣除 totalPausedMs;pause 中冻结在 pauseStart */\nexport function computeEffectiveElapsedMs(input: SpinnerElapsedInput): number {\n const totalPausedMs = input.totalPausedMs ?? 0;\n if (input.pauseStartTimeMs != null) {\n return input.pauseStartTimeMs - input.loadingStartTimeMs - totalPausedMs;\n }\n return input.nowMs - input.loadingStartTimeMs - totalPausedMs;\n}\n\nexport interface SpinnerSuffixVisibilityOptions {\n verbose?: boolean;\n /** CC hasRunningTeammates;Web Phase 2 预留 */\n hasRunningTeammates?: boolean;\n}\n\n/** 对齐 CC wantsTimerAndTokens */\nexport function shouldShowTimerAndTokens(\n effectiveElapsedMs: number,\n options: SpinnerSuffixVisibilityOptions = {},\n): boolean {\n if (options.verbose) return true;\n if (options.hasRunningTeammates) return true;\n return effectiveElapsedMs > SHOW_TOKENS_AFTER_MS;\n}\n\n/** 对齐 CC showTokens 前置条件(不含 width gating) */\nexport function shouldShowTokenSuffix(\n effectiveElapsedMs: number,\n tokenCount: number,\n options: SpinnerSuffixVisibilityOptions = {},\n): boolean {\n if (tokenCount <= 0) return false;\n return shouldShowTimerAndTokens(effectiveElapsedMs, options);\n}\n\nexport function shouldShowElapsedSuffix(\n effectiveElapsedMs: number,\n options: SpinnerSuffixVisibilityOptions = {},\n): boolean {\n if (effectiveElapsedMs <= 0) return false;\n return shouldShowTimerAndTokens(effectiveElapsedMs, options);\n}\n\nexport function formatElapsedSuffixText(effectiveElapsedMs: number): string {\n return formatDuration(effectiveElapsedMs);\n}\n\nexport function formatTokenSuffixText(tokenCount: number): string {\n return `↓ ${formatTokenCount(tokenCount)} tokens`;\n}\n\n/** 对齐 CC tokenCounterRef 步进(responseLength 平滑) */\nexport function stepSmoothedTokenCount(\n current: number,\n target: number,\n reducedMotion: boolean,\n): number {\n if (reducedMotion) return target;\n const gap = target - current;\n if (gap <= 0) return current;\n\n let increment: number;\n if (gap < 70) {\n increment = 3;\n } else if (gap < 200) {\n increment = Math.max(8, Math.ceil(gap * 0.15));\n } else {\n increment = 50;\n }\n return Math.min(current + increment, target);\n}\n","/**\n * 职责:50ms 动画时钟(对齐 CC useAnimationFrame 子集)。\n * 链路位置:SpinnerAnimationRow 独占热路径 tick。\n * 当前裁剪范围:rAF 节流;null interval 暂停。\n */\n\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * @param intervalMs 更新间隔;null 暂停且时间冻结\n * @returns 自挂载起的 elapsed ms(每 intervalMs 更新一次)\n */\nexport function useAnimationFrame(intervalMs: number | null): number {\n const [time, setTime] = useState(0);\n const startRef = useRef<number | null>(null);\n const lastTickRef = useRef(0);\n const rafRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (intervalMs === null) return;\n\n startRef.current = null;\n lastTickRef.current = 0;\n\n const tick = (now: number) => {\n if (startRef.current === null) {\n startRef.current = now;\n }\n const elapsed = now - startRef.current;\n if (elapsed - lastTickRef.current >= intervalMs) {\n lastTickRef.current = elapsed;\n setTime(elapsed);\n }\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [intervalMs]);\n\n return time;\n}\n","/**\n * 职责:检测 prefers-reduced-motion(对齐 CC reducedMotion 分支)。\n * 链路位置:SpinnerAnimationRow → SpinnerGlimmerVerb。\n * 当前裁剪范围:matchMedia 订阅。\n */\n\nimport { useEffect, useState } from 'react';\n\nconst QUERY = '(prefers-reduced-motion: reduce)';\n\nexport function useReducedMotion(): boolean {\n const [reducedMotion, setReducedMotion] = useState(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia(QUERY).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const media = window.matchMedia(QUERY);\n const onChange = (): void => setReducedMotion(media.matches);\n media.addEventListener('change', onChange);\n return () => media.removeEventListener('change', onChange);\n }, []);\n\n return reducedMotion;\n}\n","/**\n * 职责:无新 token 超时强度(对齐 CC useStalledAnimation.ts)。\n * 链路位置:SpinnerAnimationRow 每 50ms tick 调用。\n * 当前裁剪范围:3s 阈值 + 2s 渐红;Web 用 CSS color-mix 消费 intensity。\n */\n\nimport { useRef } from 'react';\n\nexport function useStalledSpinnerIntensity(\n time: number,\n currentResponseLength: number,\n hasActiveTools = false,\n reducedMotion = false,\n): { isStalled: boolean; stalledIntensity: number } {\n const lastTokenTime = useRef(time);\n const lastResponseLength = useRef(currentResponseLength);\n const mountTime = useRef(time);\n const stalledIntensityRef = useRef(0);\n const lastSmoothTime = useRef(time);\n\n if (currentResponseLength > lastResponseLength.current) {\n lastTokenTime.current = time;\n lastResponseLength.current = currentResponseLength;\n stalledIntensityRef.current = 0;\n lastSmoothTime.current = time;\n }\n\n let timeSinceLastToken: number;\n if (hasActiveTools) {\n timeSinceLastToken = 0;\n lastTokenTime.current = time;\n } else if (currentResponseLength > 0) {\n timeSinceLastToken = time - lastTokenTime.current;\n } else {\n timeSinceLastToken = time - mountTime.current;\n }\n\n const isStalled = timeSinceLastToken > 3000 && !hasActiveTools;\n const intensity = isStalled\n ? Math.min((timeSinceLastToken - 3000) / 2000, 1)\n : 0;\n\n if (!reducedMotion && (intensity > 0 || stalledIntensityRef.current > 0)) {\n const dt = time - lastSmoothTime.current;\n if (dt >= 50) {\n const steps = Math.floor(dt / 50);\n let current = stalledIntensityRef.current;\n for (let i = 0; i < steps; i++) {\n const diff = intensity - current;\n if (Math.abs(diff) < 0.01) {\n current = intensity;\n break;\n }\n current += diff * 0.1;\n }\n stalledIntensityRef.current = current;\n lastSmoothTime.current = time;\n }\n } else {\n stalledIntensityRef.current = intensity;\n lastSmoothTime.current = time;\n }\n\n const effectiveIntensity = reducedMotion\n ? intensity\n : stalledIntensityRef.current;\n\n return { isStalled, stalledIntensity: effectiveIntensity };\n}\n","/**\n * 职责:Spinner 副行任务队列展示纯函数(对齐 CC findNextPendingTask)。\n * 链路位置:Spinner → shouldShowNextTaskLine / findNextPendingTask。\n * 当前裁剪范围:Next 行;Tip/Budget 留 Phase 6。\n */\n\nimport type { SessionStatus } from '../../types/tree';\nimport type { Task } from '../../types/tasks';\n\n/** 对齐 CC Spinner.tsx findNextPendingTask — 跳过 blocked pending */\nexport function findNextPendingTask(tasks: Task[]): Task | undefined {\n const pendingTasks = tasks.filter((t) => t.status === 'pending');\n if (pendingTasks.length === 0) {\n return undefined;\n }\n\n const unresolvedIds = new Set(\n tasks.filter((t) => t.status !== 'completed').map((t) => t.id),\n );\n\n return (\n pendingTasks.find((t) => !t.blockedBy.some((id) => unresolvedIds.has(id))) ??\n pendingTasks[0]\n );\n}\n\nexport function formatNextTaskLineText(task: Task): string {\n return `Next: ${task.subject}`;\n}\n\n/** 内嵌任务列表未展开时,显示 Next 副行(对齐 CC !showExpandedTodos 分支) */\nexport function shouldShowNextTaskLine(\n showTaskList: boolean,\n tasks: Task[],\n sessionStatus: SessionStatus,\n): boolean {\n if (showTaskList) {\n return false;\n }\n if (sessionStatus !== 'running' && sessionStatus !== 'connecting') {\n return false;\n }\n return findNextPendingTask(tasks) !== undefined;\n}\n","/**\n * 职责:会话 idle 后底部任务状态 pill(对齐 CC BackgroundTaskStatus)。\n * 链路位置:Timeline / VirtualTimeline → TaskListFooter(Spinner 轨的互补,非双轨重复)。\n * 当前裁剪范围:TodoV2 任务;不含 teammate pills / 对话框。\n */\n\nimport { useMemo, useState } from 'react';\nimport { useSyncExternalStore } from 'react';\n\nimport { useSessionStatus } from '../core/hooks';\nimport { useSessionStoreApi } from '../core/context/SessionContext';\nimport type { SessionStatus, TaskPhase } from '../types/tree';\nimport type { Task } from '../types/tasks';\nimport { TaskList } from './TaskList';\n\nfunction MessageResponse({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"lax-message-response\">\n <span className=\"lax-message-response__marker\">⎿ </span>\n <span className=\"lax-message-response__content\">{children}</span>\n </div>\n );\n}\n\n/** 纯函数:footer pill 文案(供单测) */\nexport function formatTaskFooterLabel(tasks: Task[]): string {\n const openTasks = tasks.filter((t) => t.status !== 'completed');\n const inProgress = openTasks.filter((t) => t.status === 'in_progress').length;\n const open = openTasks.length;\n\n if (open === 0) return '';\n if (inProgress > 0 && inProgress === open) {\n return inProgress === 1 ? '1 task in progress' : `${inProgress} tasks in progress`;\n }\n return open === 1 ? '1 open task' : `${open} open tasks`;\n}\n\n/** 纯函数:是否展示 footer(供单测) */\nexport function shouldShowTaskListFooter(\n taskPhase: TaskPhase,\n tasks: Task[],\n hasEverShownTaskList: boolean,\n sessionStatus: SessionStatus,\n): boolean {\n if (!hasEverShownTaskList || tasks.length === 0) {\n return false;\n }\n if (taskPhase !== 'visible') {\n return false;\n }\n if (sessionStatus === 'running' || sessionStatus === 'connecting') {\n return false;\n }\n return tasks.some((t) => t.status !== 'completed');\n}\n\nfunction readTaskListRevision(store: ReturnType<typeof useSessionStoreApi>): string {\n const tree = store.getState().tree;\n const parts: string[] = [tree.taskPhase, tree.status, String(tree.hasEverShownTaskList)];\n for (const id of Object.keys(tree.tasks).sort()) {\n parts.push(`${id}:${tree.tasks[id].status}`);\n }\n return parts.join('|');\n}\n\nexport function TaskListFooter() {\n const store = useSessionStoreApi();\n const sessionStatus = useSessionStatus();\n const [expanded, setExpanded] = useState(false);\n\n const taskListRevision = useSyncExternalStore(\n (callback) => store.subscribe(callback),\n () => readTaskListRevision(store),\n );\n\n const { taskPhase, tasks, hasEverShownTaskList } = useMemo(() => {\n const tree = store.getState().tree;\n return {\n taskPhase: tree.taskPhase,\n tasks: Object.values(tree.tasks),\n hasEverShownTaskList: tree.hasEverShownTaskList,\n };\n }, [store, taskListRevision]);\n\n const visible = shouldShowTaskListFooter(\n taskPhase,\n tasks,\n hasEverShownTaskList,\n sessionStatus,\n );\n\n if (!visible) {\n return null;\n }\n\n const label = formatTaskFooterLabel(tasks);\n\n return (\n <div className=\"lax-task-list-footer\" data-testid=\"lax-task-list-footer\">\n <button\n type=\"button\"\n className=\"lax-task-list-footer__pill\"\n data-testid=\"lax-task-list-footer-pill\"\n aria-expanded={expanded}\n onClick={() => setExpanded((v) => !v)}\n >\n {label}\n <span className=\"lax-task-list-footer__hint\">\n {expanded ? ' · ↑ to hide' : ' · ↓ to view'}\n </span>\n </button>\n {expanded && (\n <MessageResponse>\n <TaskList tasks={tasks} />\n </MessageResponse>\n )}\n </div>\n );\n}\n","/**\n * GroupedToolCallRow.tsx — projection grouped_tool_use 行布局\n *\n * CC 对照:\n * tools/AgentTool/UI.tsx — renderGroupedAgentToolUse (649–759)\n * components/messages/GroupedToolUseContent.tsx\n * components/AgentProgressLine.tsx — 子行 hideType (74–75)\n */\nimport {\n formatAgentSublineTitle,\n type AgentGroupMeta,\n} from '../core/projection/agentGrouper';\n\nconst INITIALIZING = 'Initializing…';\n\nexport interface GroupedToolCallRowProps {\n payload: Record<string, unknown>;\n}\n\nfunction readGroupMeta(payload: Record<string, unknown>): AgentGroupMeta | null {\n const raw = payload.groupMeta;\n if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) return null;\n return raw as AgentGroupMeta;\n}\n\nfunction readToolUses(payload: Record<string, unknown>): Record<string, unknown>[] {\n const raw = payload.toolUses ?? payload.tool_uses;\n if (!Array.isArray(raw)) return [];\n return raw.filter(\n (item): item is Record<string, unknown> =>\n item != null && typeof item === 'object' && !Array.isArray(item),\n );\n}\n\nfunction sublineStatus(\n callId: string,\n payload: Record<string, unknown>,\n): string | null {\n const pending = new Set(\n (Array.isArray(payload.pendingCallIds) ? payload.pendingCallIds : []) as string[],\n );\n const errored = new Set(\n (Array.isArray(payload.erroredCallIds) ? payload.erroredCallIds : []) as string[],\n );\n const resolved = new Set(\n (Array.isArray(payload.resolvedCallIds) ? payload.resolvedCallIds : []) as string[],\n );\n\n if (pending.has(callId)) return INITIALIZING;\n if (errored.has(callId)) return 'Error';\n if (resolved.has(callId)) {\n const results = Array.isArray(payload.toolResults) ? payload.toolResults : [];\n for (const row of results) {\n if (row == null || typeof row !== 'object' || Array.isArray(row)) continue;\n const result = row as Record<string, unknown>;\n if (String(result.tool_call_id) !== callId) continue;\n const display = result.display;\n if (display != null && typeof display === 'object' && !Array.isArray(display)) {\n const steps = (display as Record<string, unknown>).total_steps;\n if (typeof steps === 'number') {\n const suffix = steps === 1 ? 'use' : 'uses';\n return `Done (${steps} tool ${suffix})`;\n }\n }\n return 'Done';\n }\n return 'Done';\n }\n return null;\n}\n\nexport function GroupedToolCallRow({ payload }: GroupedToolCallRowProps) {\n const toolName = String(payload.toolName ?? payload.tool_name ?? 'Agent');\n const groupMeta = readGroupMeta(payload);\n const toolUses = readToolUses(payload);\n const hideType = groupMeta?.hideType ?? false;\n const title = groupMeta?.title ?? `${toolName} × ${toolUses.length}`;\n const anyPending = Array.isArray(payload.pendingCallIds) && payload.pendingCallIds.length > 0;\n const anyError =\n Array.isArray(payload.erroredCallIds) && payload.erroredCallIds.length > 0;\n\n return (\n <div className=\"lax-tool-group\" data-tool-name={toolName} data-kind=\"grouped_tool_use\">\n <div\n className={[\n 'lax-tool-group__header',\n anyPending ? 'lax-tool-group__header--active' : '',\n anyError ? 'lax-tool-group__header--error' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {anyPending && <span className=\"lax-tool-group__dot\" aria-hidden>●</span>}\n <span className=\"lax-tool-group__label\">{title}</span>\n </div>\n <div className=\"lax-tool-group__items\">\n {toolUses.map((entry, index) => {\n const callId = String(entry.tool_call_id ?? '');\n const subTitle = formatAgentSublineTitle(entry, hideType);\n const status = sublineStatus(callId, payload);\n const isLast = index === toolUses.length - 1;\n const treeChar = isLast ? '└─' : '├─';\n\n return (\n <div\n key={callId || `group-item-${index}`}\n className=\"lax-tool-group__item lax-tool-group__subline\"\n data-group-index={index + 1}\n data-tool-call-id={callId}\n >\n <span className=\"lax-tool-group__tree\" aria-hidden>\n {treeChar}\n </span>\n <span className=\"lax-tool-group__subline-title\">{subTitle}</span>\n {status && (\n <span className=\"lax-tool-group__subline-status\"> · {status}</span>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * ThinkingSummaryNode.tsx — thinking_round 摘要节点(对齐 CC Thought for Ns)\n *\n * 职责:\n * 显示一轮思考的耗时;工具统计仅在 verbose / transcript 展开。\n *\n * 链路位置:\n * TimelineEntries kind=thinking_summary 分支。\n */\n\nimport { useSessionViewOptions } from '../../core/context/SessionContext';\nimport type { ThinkingSummaryNode } from '../../types/nodes';\nimport { shouldShowReasoningInTimeline } from '../sessionViewOptions';\n\nexport interface ThinkingSummaryProps {\n node: ThinkingSummaryNode;\n}\n\nfunction formatThoughtDuration(seconds: number): string {\n const rounded = Math.max(1, Math.round(seconds));\n return `${rounded}s`;\n}\n\nfunction formatToolCounts(node: ThinkingSummaryNode): string | null {\n const counts = node.toolCounts;\n const parts: string[] = [];\n\n if (counts.searchCount > 0) parts.push(`${counts.searchCount} searches`);\n if (counts.readCount > 0) parts.push(`${counts.readCount} reads`);\n if (counts.listCount > 0) parts.push(`${counts.listCount} lists`);\n if (counts.bashCount > 0) parts.push(`${counts.bashCount} bash`);\n if (counts.memorySearchCount > 0) parts.push(`${counts.memorySearchCount} mem searches`);\n if (counts.memoryReadCount > 0) parts.push(`${counts.memoryReadCount} mem reads`);\n if (counts.memoryWriteCount > 0) parts.push(`${counts.memoryWriteCount} mem writes`);\n if (counts.relevantRecallCount > 0) parts.push(`${counts.relevantRecallCount} relevant recalls`);\n if (counts.gitOpBashCount > 0) parts.push(`${counts.gitOpBashCount} git ops`);\n if (counts.mcpCallCount > 0) parts.push(`${counts.mcpCallCount} mcp calls`);\n\n if (parts.length === 0) return null;\n return parts.join(', ');\n}\n\nexport function ThinkingSummary({ node }: ThinkingSummaryProps) {\n const viewOptions = useSessionViewOptions();\n const showToolDetail = shouldShowReasoningInTimeline(viewOptions);\n const toolText = showToolDetail ? formatToolCounts(node) : null;\n\n return (\n <div\n className=\"lax-thought-summary\"\n data-kind=\"thinking_summary\"\n data-round-id={node.roundId}\n >\n <span className=\"lax-thought-summary__text\">\n Thought for {formatThoughtDuration(node.elapsedSeconds)}\n </span>\n {toolText ? (\n <span className=\"lax-thought-summary__tools\"> · {toolText}</span>\n ) : null}\n {!showToolDetail ? (\n <span className=\"lax-thought-summary__hint\"> (ctrl+o to expand)</span>\n ) : null}\n </div>\n );\n}\n","/**\n * projectedTimelineRender.tsx — ProjectedTimelineItem → React 节点\n *\n * 职责:\n * 按 RenderableEntry.kind 分支渲染;Timeline / VirtualTimeline 共用。\n *\n * 链路位置:\n * TimelineEntries、VirtualTimeline。\n *\n * 当前裁剪范围:\n * collapsed_explore / grouped_tool_use / system_summary 分支。\n */\n\nimport type { ReactNode } from 'react';\n\nimport type { ProjectedTimelineItem } from '../core/hooks/useProjectedTimeline';\nimport type { NodeRegistry } from './NodeRegistry';\nimport type { ThinkingSummaryNode, ToolCounts } from '../types/nodes';\nimport { GroupedToolCallRow } from './GroupedToolCallRow';\nimport { CollapsedExploreNode } from './nodes/CollapsedExploreNode';\nimport { SystemSummaryNode } from './nodes/SystemSummaryNode';\nimport { ThinkingSummary } from './nodes/ThinkingSummaryNode';\nimport { TimelineItem } from './TimelineItem';\n\nfunction zeroToolCounts(): ToolCounts {\n return {\n searchCount: 0,\n readCount: 0,\n listCount: 0,\n bashCount: 0,\n memorySearchCount: 0,\n memoryReadCount: 0,\n memoryWriteCount: 0,\n relevantRecallCount: 0,\n gitOpBashCount: 0,\n mcpCallCount: 0,\n };\n}\n\nfunction ThinkingSummaryWrapper({ entry }: { entry: ProjectedTimelineItem['entry'] }) {\n const payload = entry.payload;\n const node: ThinkingSummaryNode = {\n kind: 'thinking_summary',\n id: String(payload.id ?? ''),\n roundId: String(payload.roundId ?? ''),\n reasoningNodeId: String(payload.reasoningNodeId ?? ''),\n exploreNodeId: payload.exploreNodeId as string | null,\n elapsedSeconds: Number(payload.elapsedSeconds ?? 0),\n toolCounts: (payload.toolCounts as ToolCounts) ?? zeroToolCounts(),\n isExpanded: Boolean(payload.isExpanded ?? false),\n startedAt: Number(payload.startedAt ?? Date.now()),\n };\n return (\n <div className=\"lax-timeline__item\" data-kind=\"thinking_summary\">\n <ThinkingSummary node={node} />\n </div>\n );\n}\n\nexport function renderProjectedTimelineItem(\n item: ProjectedTimelineItem,\n registry: NodeRegistry,\n): ReactNode {\n const { key, entry } = item;\n\n if (entry.kind === 'thinking_summary') {\n return <ThinkingSummaryWrapper key={key} entry={entry} />;\n }\n\n if (entry.kind === 'collapsed_explore') {\n return (\n <div key={key} className=\"lax-timeline__item\" data-kind=\"collapsed_explore\">\n <CollapsedExploreNode entry={entry} registry={registry} />\n </div>\n );\n }\n\n if (entry.kind === 'grouped_tool_use') {\n return (\n <div key={key} className=\"lax-timeline__item\" data-kind=\"grouped_tool_use\">\n <GroupedToolCallRow payload={entry.payload} />\n </div>\n );\n }\n\n if (entry.kind === 'system_summary') {\n const summary = String(entry.payload.summaryText ?? entry.payload.summary_text ?? '');\n return (\n <div key={key} className=\"lax-timeline__item\" data-kind=\"system_summary\">\n <SystemSummaryNode summaryText={summary} />\n </div>\n );\n }\n\n const nodeId = entry.sourceNodeIds[0];\n if (!nodeId) return null;\n return <TimelineItem key={key} nodeId={nodeId} registry={registry} />;\n}\n","/**\n * TimelineEntries.tsx — 按 projection mount 候选渲染主舞台\n */\nimport type { NodeRegistry } from './NodeRegistry';\nimport { useProjectedTimeline } from '../core/hooks/useProjectedTimeline';\nimport { renderProjectedTimelineItem } from './projectedTimelineRender';\n\nexport function TimelineEntries({ registry }: { registry: NodeRegistry }) {\n const projectedItems = useProjectedTimeline();\n\n return (\n <>\n {projectedItems.map((item) => renderProjectedTimelineItem(item, registry))}\n </>\n );\n}\n","/**\n * 职责:主舞台纵向时间线布局,按 rootChildren 顺序渲染节点。\n * 链路位置:AgentSession 默认子视图;可被业务 children 替换布局。\n * 当前裁剪范围:无虚拟滚动;全量渲染主舞台节点;可选 Grouped 并行布局(T4.5)。\n */\nimport { useNodeRegistry, useSessionViewOptions } from '../core/context/SessionContext';\nimport { TimelineEntries } from './TimelineEntries';\nimport { Spinner } from './Spinner';\nimport { TaskListFooter } from './TaskListFooter';\nimport { useStore } from 'zustand';\nimport { useSessionStoreApi } from '../core/context/SessionContext';\nimport { useShallow } from 'zustand/shallow';\nimport type { SessionStoreState } from '../core/store';\n\nexport { TimelineItem } from './TimelineItem';\nexport type { TimelineItemProps } from './TimelineItem';\n\nfunction useContentCharCount(): number {\n const store = useSessionStoreApi();\n return useStore(\n store,\n useShallow((state: SessionStoreState) => {\n let count = 0;\n for (const node of Object.values(state.tree.byId)) {\n if (node.kind === 'text' || node.kind === 'reasoning') {\n count += node.accumulated.length;\n }\n }\n return count;\n }),\n );\n}\n\nexport function Timeline() {\n const registry = useNodeRegistry();\n const store = useSessionStoreApi();\n const { verbose } = useSessionViewOptions();\n const { startedAt } = useStore(store, (s: SessionStoreState) => s.tree.meta);\n const contentCharCount = useContentCharCount();\n\n return (\n <div className=\"lax-timeline\" data-testid=\"lax-timeline\">\n <TimelineEntries registry={registry} />\n <Spinner\n startedAt={startedAt}\n contentCharCount={contentCharCount}\n verbose={verbose}\n />\n <TaskListFooter />\n </div>\n );\n}\n","/**\n * 职责:VirtualTimeline 按 SessionNode kind 或 RenderableEntry kind 估算行高。\n * 链路位置:VirtualTimeline useVirtualizer estimateSize。\n * 当前裁剪范围:静态表;subagent 估算保留供自定义 registry 兼容。\n */\nimport type { RenderableEntry } from '../core/projection/renderModel';\nimport type { SessionNode, SessionNodeKind } from '../types/nodes';\n\nexport const DEFAULT_ESTIMATE_SIZE = 96;\n\nexport const ESTIMATE_SIZE_BY_KIND: Record<SessionNodeKind, number> = {\n text: 72,\n reasoning: 88,\n thinking_summary: 96,\n tool_call: 120,\n subagent: 200,\n step: 64,\n error: 80,\n unknown: 64,\n permission: 140,\n memory_saved: 56,\n};\n\nconst COLLAPSED_EXPLORE_ESTIMATE = 56;\nconst COLLAPSED_EXPLORE_VERBOSE_PER_TOOL = 120;\nconst GROUPED_TOOL_USE_ESTIMATE = 160;\nconst SYSTEM_SUMMARY_ESTIMATE = 48;\n\nconst SUBAGENT_CHILD_SIZE = 48;\nconst SUBAGENT_CHILD_CAP = 400;\n\nexport function estimateNodeSize(\n node: SessionNode | undefined,\n fallback = DEFAULT_ESTIMATE_SIZE,\n): number {\n if (!node) return fallback;\n if (node.kind === 'subagent') {\n const childBonus = Math.min(node.childIds.length * SUBAGENT_CHILD_SIZE, SUBAGENT_CHILD_CAP);\n return ESTIMATE_SIZE_BY_KIND.subagent + childBonus;\n }\n return ESTIMATE_SIZE_BY_KIND[node.kind] ?? fallback;\n}\n\nexport function estimateProjectedEntrySize(\n entry: RenderableEntry,\n fallback = DEFAULT_ESTIMATE_SIZE,\n): number {\n switch (entry.kind) {\n case 'collapsed_explore': {\n const toolUses = entry.payload.toolUses;\n const verboseCount = Array.isArray(toolUses) ? toolUses.length : 0;\n return COLLAPSED_EXPLORE_ESTIMATE + verboseCount * COLLAPSED_EXPLORE_VERBOSE_PER_TOOL;\n }\n case 'grouped_tool_use':\n return GROUPED_TOOL_USE_ESTIMATE + entry.sourceNodeIds.length * 48;\n case 'system_summary':\n return SYSTEM_SUMMARY_ESTIMATE;\n default:\n return fallback;\n }\n}\n","/**\n * 职责:主舞台虚拟滚动时间线(V2-E);节点数超阈值时替代全量 Timeline。\n * 链路位置:AgentSession virtualized prop → SessionTimeline。\n * 当前裁剪范围:固定 estimateSize;不支持动态高度测量优化。\n */\nimport { useRef } from 'react';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { useStore } from 'zustand';\n\nimport { useNodeRegistry, useSessionStoreApi, useSessionViewOptions } from '../core/context/SessionContext';\nimport { useProjectedTimeline } from '../core/hooks';\nimport { DEFAULT_ESTIMATE_SIZE, estimateProjectedEntrySize } from './estimateNodeSize';\nimport { Spinner } from './Spinner';\nimport { TaskListFooter } from './TaskListFooter';\nimport { renderProjectedTimelineItem } from './projectedTimelineRender';\nimport type { SessionStoreState } from '../core/store';\n\nexport { DEFAULT_ESTIMATE_SIZE } from './estimateNodeSize';\nexport const DEFAULT_VIRTUALIZE_THRESHOLD = 500;\n\nexport interface VirtualTimelineProps {\n estimateSize?: number;\n}\n\nfunction useContentCharCount(): number {\n const store = useSessionStoreApi();\n return useStore(store, (state: SessionStoreState) => {\n let count = 0;\n for (const node of Object.values(state.tree.byId)) {\n if (node.kind === 'text' || node.kind === 'reasoning') {\n count += node.accumulated.length;\n }\n }\n return count;\n });\n}\n\nexport function VirtualTimeline({\n estimateSize = DEFAULT_ESTIMATE_SIZE,\n}: VirtualTimelineProps) {\n const items = useProjectedTimeline();\n const registry = useNodeRegistry();\n const store = useSessionStoreApi();\n const { verbose } = useSessionViewOptions();\n const parentRef = useRef<HTMLDivElement>(null);\n const { startedAt } = useStore(store, (s: SessionStoreState) => s.tree.meta);\n const contentCharCount = useContentCharCount();\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => parentRef.current,\n estimateSize: (index) => {\n const item = items[index];\n return item ? estimateProjectedEntrySize(item.entry, estimateSize) : estimateSize;\n },\n overscan: 5,\n });\n\n return (\n <div\n ref={parentRef}\n className=\"lax-virtual-timeline\"\n data-testid=\"lax-virtual-timeline\"\n >\n <div\n className=\"lax-virtual-timeline__inner\"\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n position: 'relative',\n width: '100%',\n }}\n >\n {virtualizer.getVirtualItems().map((virtualRow) => {\n const item = items[virtualRow.index];\n if (!item) return null;\n return (\n <div\n key={item.key}\n className=\"lax-virtual-timeline__item lax-timeline__item\"\n data-index={virtualRow.index}\n data-kind={item.entry.kind}\n ref={virtualizer.measureElement}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n {renderProjectedTimelineItem(item, registry)}\n </div>\n );\n })}\n </div>\n <Spinner\n startedAt={startedAt}\n contentCharCount={contentCharCount}\n verbose={verbose}\n />\n <TaskListFooter />\n </div>\n );\n}\n","/**\r\r\n * 职责:按 virtualized 阈值选择 Timeline 或 VirtualTimeline。\r\r\n * 链路位置:AgentSession / MultiAgentSession 默认 children。\r\r\n * 当前裁剪范围:Grouped 布局与 virtual 互斥(groupParallelTools 时强制 Timeline)。\r\r\n */\r\r\nimport { useTimeline } from '../core/hooks';\r\r\nimport { Timeline } from './Timeline';\r\r\nimport { DEFAULT_VIRTUALIZE_THRESHOLD, VirtualTimeline } from './VirtualTimeline';\r\r\n\r\r\nexport interface SessionTimelineProps {\r\r\n virtualized?: boolean;\r\r\n virtualizeThreshold?: number;\r\r\n groupParallelTools?: boolean;\r\r\n}\r\r\n\r\r\nexport function SessionTimeline({\r\r\n virtualized = false,\r\r\n virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD,\r\r\n groupParallelTools = false,\r\r\n}: SessionTimelineProps) {\r\r\n const ids = useTimeline();\r\r\n if (groupParallelTools) {\r\r\n return <Timeline />;\r\r\n }\r\r\n if (virtualized && ids.length > virtualizeThreshold) {\r\r\n return <VirtualTimeline />;\r\r\n }\r\r\n return <Timeline />;\r\r\n}\r\r\n"],"mappings":"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AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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","names":["useStore","useShallow","useStore","useShallow","CollapseKind","isRecord","toolInput","display","isRecord","isToolUseEntry","isToolUseEntry","readPayloadString","isRecord","isRecord","canonicalType","canonicalType","canonicalType","useMemo","useStore","useShallow","useStore","useShallow","useMemo","useStore","useShallow","useStore","useStore","useStore","useShallow","useEffect","useMemo","useState","jsx","useState","useMemo","useEffect","jsx","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useEffect","formatDuration","useRef","useMemo","useEffect","useMemo","useRef","useState","formatDuration","formatTokenCount","useRef","jsxs","formatDuration","formatTokenCount","useEffect","useRef","useState","useEffect","useState","useRef","jsx","jsxs","useRef","jsx","jsxs","useMemo","useState","useRef","useEffect","useMemo","useState","useSyncExternalStore","jsx","jsxs","MessageResponse","useState","useSyncExternalStore","useMemo","jsx","jsxs","jsx","jsxs","jsx","zeroToolCounts","Fragment","jsx","useStore","useShallow","jsx","jsxs","useStore","useRef","useStore","jsx","jsxs","useContentCharCount","useStore","useRef","jsx"]}
|