@blade-hq/agent-kit 1.0.21 → 1.0.23

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/api/partner-skill.ts","../src/react/api/skills.ts","../src/react/schemas/partner-skill.ts","../src/react/stores/ui-bridge-store.ts","../src/react/lib/resource-bridge.ts","../src/react/lib/parent-bridge.ts","../src/react/lib/chat.ts","../src/react/lib/analytics.ts","../src/react/lib/tool-preview.ts","../src/react/lib/ui-meta.ts","../src/react/projection/helpers.ts","../src/react/schemas/message.ts","../src/react/projection/state.ts","../src/react/projection/builder.ts","../src/react/stores/auth-store.ts","../src/react/api/auth.ts","../src/react/sockets/socket-state.ts","../src/react/stores/session-store.ts","../src/react/api/sessions.ts","../src/react/stores/chat-store.ts","../src/react/components/chat/display-utils.ts","../src/react/stores/ui-store.ts","../src/react/stores/task-store.ts","../src/react/stores/background-store.ts","../src/react/stores/connection-store.ts","../src/react/stores/runtime-store.ts","../src/react/stores/gis-store.ts","../src/react/sockets/event-bridge.ts","../src/react/stores/answer-callback-store.ts","../src/react/stores/runtime-features-store.ts","../src/react/bootstrap.ts","../src/react/api/client.ts"],"sourcesContent":["export { installPartnerSkill, uploadSessionSkill } from \"./skills\"\nexport type {\n PartnerSkillInstallPayload,\n PartnerSkillInstallResult,\n SessionSkillUploadPayload,\n SessionSkillUploadResult,\n} from \"../schemas/partner-skill\"\n","import type { SkillsResource } from \"../../client/resources/skills\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/skills\"\n\nconst r = (): SkillsResource => getClient().skills\nexport const listSkills = (...args: Parameters<SkillsResource[\"listSkills\"]>) => r().listSkills(...args)\nexport const listInstalledRegistrySkills = (...args: Parameters<SkillsResource[\"listInstalledRegistrySkills\"]>) =>\n r().listInstalledRegistrySkills(...args)\nexport const listSessionSkills = (...args: Parameters<SkillsResource[\"listSessionSkills\"]>) => r().listSessionSkills(...args)\nexport const resyncSkills = (...args: Parameters<SkillsResource[\"resyncSkills\"]>) => r().resyncSkills(...args)\nexport const searchSkills = (...args: Parameters<SkillsResource[\"searchSkills\"]>) => r().searchSkills(...args)\nexport const getSkillStats = (...args: Parameters<SkillsResource[\"getSkillStats\"]>) => r().getSkillStats(...args)\nexport const getGlobalSkillStats = (...args: Parameters<SkillsResource[\"getGlobalSkillStats\"]>) => r().getGlobalSkillStats(...args)\nexport const getSkill = (...args: Parameters<SkillsResource[\"getSkill\"]>) => r().getSkill(...args)\nexport const uploadSessionSkill = (...args: Parameters<SkillsResource[\"uploadSessionSkill\"]>) => r().uploadSessionSkill(...args)\nexport const installPartnerSkill = (...args: Parameters<SkillsResource[\"installPartnerSkill\"]>) => r().installPartnerSkill(...args)\n","import { type } from \"arktype\"\n\nexport const PartnerSkillName = type(\"/^[a-z0-9-]+\\\\/[a-z0-9-]+$/\")\nexport type PartnerSkillName = typeof PartnerSkillName.infer\nexport const SessionSkillName = PartnerSkillName\nexport type SessionSkillName = PartnerSkillName\n\nexport const PartnerSkillFile = type({\n path: \"string > 0\",\n content: \"string\",\n})\nexport type PartnerSkillFile = typeof PartnerSkillFile.infer\nexport const SessionSkillFile = PartnerSkillFile\nexport type SessionSkillFile = PartnerSkillFile\n\nexport const PartnerSkillInstallPayload = type({\n name: PartnerSkillName,\n files: PartnerSkillFile.array().atLeastLength(1),\n})\nexport type PartnerSkillInstallPayload = typeof PartnerSkillInstallPayload.infer\nexport const SessionSkillUploadPayload = PartnerSkillInstallPayload\nexport type SessionSkillUploadPayload = PartnerSkillInstallPayload\n\nexport const PartnerSkillInstallResult = type({\n name: PartnerSkillName,\n skill_dir: \"string\",\n file_count: \"number.integer >= 0\",\n overwritten: \"boolean\",\n})\nexport type PartnerSkillInstallResult = typeof PartnerSkillInstallResult.infer\nexport const SessionSkillUploadResult = PartnerSkillInstallResult\nexport type SessionSkillUploadResult = PartnerSkillInstallResult\n\nexport function parseSessionSkillUploadPayload(payload: unknown): SessionSkillUploadPayload {\n const parsed = SessionSkillUploadPayload.assert(payload)\n\n if (!parsed.files.some((file) => file.path === \"SKILL.md\")) {\n throw new Error(\"session skill upload payload must include SKILL.md\")\n }\n\n return parsed\n}\n\nexport function parsePartnerSkillInstallPayload(payload: unknown): PartnerSkillInstallPayload {\n return parseSessionSkillUploadPayload(payload)\n}\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nfunction buildSignalId() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID()\n }\n return `bridge-${Date.now()}-${Math.random().toString(36).slice(2)}`\n}\n\nfunction clearSignalRecord<T>(\n record: Record<string, T[]>,\n sessionId: string,\n) {\n if (!(sessionId in record)) {\n return record\n }\n\n const next = { ...record }\n delete next[sessionId]\n return next\n}\n\nexport interface PendingContextSignal {\n id: string\n label: string\n content: string\n imageUrl?: string\n}\n\nexport interface DraftAppendSignal {\n id: string\n text: string\n}\n\nexport interface SendRequestSignal {\n id: string\n}\n\ninterface UiBridgeState extends ClientAwareState {\n pendingContexts: Record<string, PendingContextSignal[]>\n draftAppends: Record<string, DraftAppendSignal[]>\n sendRequests: Record<string, SendRequestSignal[]>\n\n addPendingContext: (sessionId: string, context: Omit<PendingContextSignal, \"id\">) => void\n removePendingContext: (sessionId: string, contextId: string) => void\n consumePendingContexts: (sessionId: string) => PendingContextSignal[]\n clearPendingContexts: (sessionId: string) => void\n\n addDraftAppend: (sessionId: string, text: string) => void\n consumeDraftAppends: (sessionId: string) => DraftAppendSignal[]\n clearDraftAppends: (sessionId: string) => void\n\n addSendRequest: (sessionId: string) => void\n consumeSendRequests: (sessionId: string) => SendRequestSignal[]\n clearSendRequests: (sessionId: string) => void\n\n clearSession: (sessionId: string) => void\n}\n\nexport const useUiBridgeStore = create<UiBridgeState>()((set, get) => ({\n ...createClientActions(set),\n pendingContexts: {},\n draftAppends: {},\n sendRequests: {},\n\n addPendingContext: (sessionId, context) =>\n set((state) => ({\n pendingContexts: {\n ...state.pendingContexts,\n [sessionId]: [\n ...(state.pendingContexts[sessionId] ?? []),\n {\n id: buildSignalId(),\n label: context.label,\n content: context.content,\n imageUrl: context.imageUrl,\n },\n ],\n },\n })),\n removePendingContext: (sessionId, contextId) =>\n set((state) => {\n const contexts = state.pendingContexts[sessionId]\n if (!contexts?.length) {\n return state\n }\n\n const nextContexts = contexts.filter((context) => context.id !== contextId)\n if (nextContexts.length === contexts.length) {\n return state\n }\n\n return {\n pendingContexts:\n nextContexts.length > 0\n ? {\n ...state.pendingContexts,\n [sessionId]: nextContexts,\n }\n : clearSignalRecord(state.pendingContexts, sessionId),\n }\n }),\n consumePendingContexts: (sessionId) => {\n const signals = get().pendingContexts[sessionId] ?? []\n if (signals.length === 0) return []\n set((state) => ({\n pendingContexts: clearSignalRecord(state.pendingContexts, sessionId),\n }))\n return signals\n },\n clearPendingContexts: (sessionId) =>\n set((state) => ({\n pendingContexts: clearSignalRecord(state.pendingContexts, sessionId),\n })),\n\n addDraftAppend: (sessionId, text) =>\n set((state) => ({\n draftAppends: {\n ...state.draftAppends,\n [sessionId]: [\n ...(state.draftAppends[sessionId] ?? []),\n {\n id: buildSignalId(),\n text,\n },\n ],\n },\n })),\n consumeDraftAppends: (sessionId) => {\n const signals = get().draftAppends[sessionId] ?? []\n if (signals.length === 0) return []\n set((state) => ({\n draftAppends: clearSignalRecord(state.draftAppends, sessionId),\n }))\n return signals\n },\n clearDraftAppends: (sessionId) =>\n set((state) => ({\n draftAppends: clearSignalRecord(state.draftAppends, sessionId),\n })),\n\n addSendRequest: (sessionId) =>\n set((state) => ({\n sendRequests: {\n ...state.sendRequests,\n [sessionId]: [\n ...(state.sendRequests[sessionId] ?? []),\n {\n id: buildSignalId(),\n },\n ],\n },\n })),\n consumeSendRequests: (sessionId) => {\n const signals = get().sendRequests[sessionId] ?? []\n if (signals.length === 0) return []\n set((state) => ({\n sendRequests: clearSignalRecord(state.sendRequests, sessionId),\n }))\n return signals\n },\n clearSendRequests: (sessionId) =>\n set((state) => ({\n sendRequests: clearSignalRecord(state.sendRequests, sessionId),\n })),\n\n clearSession: (sessionId) =>\n set((state) => ({\n pendingContexts: clearSignalRecord(state.pendingContexts, sessionId),\n draftAppends: clearSignalRecord(state.draftAppends, sessionId),\n sendRequests: clearSignalRecord(state.sendRequests, sessionId),\n })),\n}))\n","import { useUiBridgeStore } from \"../stores/ui-bridge-store\"\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction getNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null\n}\n\nfunction hasUserActivation() {\n if (typeof navigator === \"undefined\") {\n return false\n }\n return navigator.userActivation?.isActive === true\n}\n\nconst BRIDGE_ACTIONS = [\"addContext\", \"appendInput\", \"sendMessage\"] as const\n\nexport type ResourceBridgeAction = (typeof BRIDGE_ACTIONS)[number]\n\nexport interface ResourceBridgeDispatchParams {\n sessionId: string\n activeSessionId: string | null\n isStreaming: boolean\n action: string\n payload?: unknown\n}\n\nfunction isBridgeAction(action: string): action is ResourceBridgeAction {\n return BRIDGE_ACTIONS.includes(action as ResourceBridgeAction)\n}\n\nexport function resourceBridgeDispatch({\n sessionId,\n activeSessionId,\n isStreaming,\n action,\n payload,\n}: ResourceBridgeDispatchParams): boolean {\n if (!sessionId || !activeSessionId || sessionId !== activeSessionId) {\n return false\n }\n\n if (!isBridgeAction(action)) {\n return false\n }\n\n const bridgeStore = useUiBridgeStore.getState()\n\n if (action === \"addContext\") {\n if (!isRecord(payload)) return false\n const content = getNonEmptyString(payload.content)\n const label = getNonEmptyString(payload.label)\n if (!content || !label) return false\n bridgeStore.addPendingContext(sessionId, { content, label })\n return true\n }\n\n if (action === \"appendInput\") {\n if (!isRecord(payload)) return false\n const text = getNonEmptyString(payload.text)\n if (!text) return false\n bridgeStore.addDraftAppend(sessionId, text)\n return true\n }\n\n if (isStreaming || !hasUserActivation()) {\n return false\n }\n\n bridgeStore.addSendRequest(sessionId)\n return true\n}\n","import { uploadSessionSkill } from \"../api/partner-skill\"\nimport { tapBridgeEvent } from \"../devtools/bridge-devtools/tap\"\nimport { parseSessionSkillUploadPayload } from \"../schemas/partner-skill\"\nimport { resourceBridgeDispatch, type ResourceBridgeAction } from \"./resource-bridge\"\n\ninterface QueryClientLike {\n invalidateQueries: (filters: { queryKey: readonly unknown[] }) => unknown\n}\n\nfunction invalidateSkillStats(sessionId: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"skill-stats\", sessionId] })\n}\n\nconst HOST_BRIDGE_ACTIONS = [\"addContext\", \"appendInput\", \"sendMessage\"] as const\n\ninterface LegacyResourceBridgeEnvelope {\n __resourceBridge: true\n action: string\n payload?: unknown\n}\n\nexport interface BladeBridgeEnvelope {\n __bladeBridge: true\n direction: \"agent-to-host\" | \"host-to-agent\"\n action: string\n payload?: unknown\n meta?: {\n sessionId?: string\n toolCallId?: string\n timestamp?: number\n }\n}\n\nexport interface HostBridgeStateSnapshot {\n sessionId: string | null\n activeSessionId: string | null\n isStreaming: boolean\n}\n\nexport type BladeBridgeHandler = (envelope: BladeBridgeEnvelope) => void\n\nconst bridgeHandlers = new Set<BladeBridgeHandler>()\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isAllowedBridgeAction(action: string): action is ResourceBridgeAction {\n return HOST_BRIDGE_ACTIONS.includes(action as ResourceBridgeAction)\n}\n\nfunction isBladeBridgeEnvelope(value: unknown): value is BladeBridgeEnvelope {\n return (\n isRecord(value) &&\n value.__bladeBridge === true &&\n typeof value.action === \"string\" &&\n (value.direction === \"agent-to-host\" || value.direction === \"host-to-agent\")\n )\n}\n\nfunction isLegacyResourceBridgeEnvelope(value: unknown): value is LegacyResourceBridgeEnvelope {\n return isRecord(value) && value.__resourceBridge === true && typeof value.action === \"string\"\n}\n\ninterface ParsedBridgeEnvelope {\n action: string\n payload?: unknown\n direction?: \"host-to-agent\" | \"agent-to-host\"\n canonical: boolean\n}\n\nfunction toBridgeActionEnvelope(value: unknown): ParsedBridgeEnvelope | null {\n if (isBladeBridgeEnvelope(value)) {\n return {\n action: value.action,\n payload: value.payload,\n direction: value.direction,\n canonical: true,\n }\n }\n\n if (isLegacyResourceBridgeEnvelope(value)) {\n return { action: value.action, payload: value.payload, canonical: false }\n }\n\n return null\n}\n\nexport function isInsideIframe() {\n return typeof window !== \"undefined\" && window.parent !== window\n}\n\nexport function subscribeBladeBridge(handler: BladeBridgeHandler) {\n bridgeHandlers.add(handler)\n return () => {\n bridgeHandlers.delete(handler)\n }\n}\n\nexport function dispatchBladeBridge(envelope: BladeBridgeEnvelope) {\n for (const handler of bridgeHandlers) {\n try {\n handler(envelope)\n } catch (error) {\n console.debug(\"[parent-bridge] bridge handler failed\", error)\n }\n }\n}\n\nexport function postToParent(envelope: BladeBridgeEnvelope) {\n if (!isInsideIframe()) {\n return\n }\n\n tapBridgeEvent({\n side: \"agent\",\n direction: envelope.direction,\n action: envelope.action,\n payload: envelope.payload,\n meta: envelope.meta as Record<string, unknown> | undefined,\n })\n\n try {\n window.parent.postMessage(envelope, \"*\")\n } catch (error) {\n console.debug(\"[parent-bridge] failed to post message to parent\", error)\n }\n}\n\nexport function attachHostBridgeListener(getState: () => HostBridgeStateSnapshot) {\n if (typeof window === \"undefined\") {\n return () => {}\n }\n\n const listener = (event: MessageEvent) => {\n const envelope = toBridgeActionEnvelope(event.data)\n if (!envelope) {\n return\n }\n\n const { sessionId, activeSessionId, isStreaming } = getState()\n\n const tap = (note: string | undefined, rejected: boolean) => {\n tapBridgeEvent({\n side: \"agent\",\n direction: envelope.direction ?? \"host-to-agent\",\n action: envelope.action,\n payload: envelope.payload,\n meta: { canonical: envelope.canonical, sessionId: sessionId ?? null },\n note,\n rejected,\n })\n }\n\n if (!sessionId) {\n tap(\"ignored: no active session\", true)\n return\n }\n\n switch (envelope.action) {\n case \"installSkill\":\n case \"uploadSessionSkill\":\n // uploadSessionSkill 属于高权限操作(会把可执行代码写入会话 skills 目录),\n // 收紧信任边界:只接受带 direction=host-to-agent 的 __bladeBridge 信封。\n // 这样一来:\n // - 外部 host 页面通过标准 envelope 推送 → 允许\n // - 内嵌 _meta.ui 卡片通过标准 envelope 推送 → 允许\n // - 任何 legacy __resourceBridge 或缺失 direction 的消息 → 拒绝\n if (!envelope.canonical || envelope.direction !== \"host-to-agent\") {\n tap(\n \"uploadSessionSkill rejected: requires __bladeBridge envelope with direction=host-to-agent\",\n true,\n )\n console.warn(\n \"[parent-bridge] uploadSessionSkill rejected: requires __bladeBridge envelope with direction=host-to-agent\",\n )\n return\n }\n tap(undefined, false)\n try {\n const payload = parseSessionSkillUploadPayload(envelope.payload)\n void uploadSessionSkill(sessionId, payload)\n .then(() => {\n invalidateSkillStats(sessionId)\n })\n .catch((error) => {\n console.warn(\"[parent-bridge] uploadSessionSkill request failed\", error)\n })\n } catch (error) {\n console.warn(\"[parent-bridge] invalid uploadSessionSkill payload\", error)\n }\n return\n default:\n if (!isAllowedBridgeAction(envelope.action)) {\n tap(`rejected: action not in allowlist [${HOST_BRIDGE_ACTIONS.join(\", \")}]`, true)\n return\n }\n tap(undefined, false)\n }\n\n resourceBridgeDispatch({\n sessionId,\n activeSessionId,\n isStreaming,\n action: envelope.action,\n payload: envelope.payload,\n })\n }\n\n window.addEventListener(\"message\", listener)\n return () => {\n window.removeEventListener(\"message\", listener)\n }\n}\n","import type {\n ChatMessage,\n FileContentPart,\n ImageUrlContentPart,\n MessageContent,\n MessageContentPart,\n} from \"../schemas/message\"\n\nconst SYSTEM_REMINDER_PATTERN = /^<system-reminder>\\s*[\\s\\S]*?\\s*<\\/system-reminder>$/i\nconst LEGACY_FORK_CONTEXT_MARKERS = [\n \"父智能体在派生你之前已经完成了一些操作。\",\n \"可通过 `read_file` 读取。\",\n \"# 你的任务\",\n]\n\nexport function normalizeMessageContent(content: unknown): MessageContent {\n if (typeof content === \"string\") return content\n if (Array.isArray(content)) return content as MessageContentPart[]\n return String(content ?? \"\")\n}\n\nexport function getTextContent(content: MessageContent): string {\n if (typeof content === \"string\") return content\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n}\n\nexport function isSystemReminderText(text: string): boolean {\n return SYSTEM_REMINDER_PATTERN.test(text.trim())\n}\n\nexport function isLegacyForkContextText(text: string): boolean {\n const normalized = text.trim()\n return LEGACY_FORK_CONTEXT_MARKERS.every((marker) => normalized.includes(marker))\n}\n\nexport function isHiddenInternalMessage(message: Pick<ChatMessage, \"role\" | \"content\">): boolean {\n if (message.role !== \"user\") return false\n const text = getTextContent(normalizeMessageContent(message.content))\n return isSystemReminderText(text) || isLegacyForkContextText(text)\n}\n\nexport function buildMessageContent(\n text: string,\n attachments: Array<{\n kind: \"file\"\n name: string\n uploadedPath?: string\n textContent?: string | null\n mimeType?: string\n }>,\n): MessageContent {\n if (attachments.length === 0) return text\n const textSegments: string[] = []\n\n if (text.trim()) {\n textSegments.push(text)\n }\n\n for (const attachment of attachments) {\n let fileText: string\n if (attachment.uploadedPath) {\n const displayName = attachment.uploadedPath.split(\"/\").pop() || attachment.name\n fileText = `[附件: ${displayName}] 已上传到工作区路径: ${attachment.uploadedPath}`\n } else if (attachment.textContent) {\n const MAX_TEXT_CHARS = 100_000\n const content =\n attachment.textContent.length > MAX_TEXT_CHARS\n ? `${attachment.textContent.slice(0, MAX_TEXT_CHARS)}\\n\\n[内容已截断,原始共 ${attachment.textContent.length} 字符]`\n : attachment.textContent\n fileText = `[附件: ${attachment.name}]\\n${content}`\n } else {\n fileText = `[附件: ${attachment.name}]`\n }\n textSegments.push(fileText)\n }\n\n return textSegments.join(\"\\n\\n\")\n}\n\nexport function contentPreview(content: MessageContent, maxLen = 80): string {\n const text = getTextContent(content).trim()\n return text.length > maxLen ? `${text.slice(0, maxLen)}…` : text\n}\n\n/**\n * Transform a skill mention into a natural language skill invocation.\n * Strips the `<skill>name</skill>` tag from the raw input and prepends the instruction.\n */\nexport function transformSlashCommand(skillName: string, rawInput: string): string {\n const prompt = rawInput.replace(`<skill>${skillName}</skill>`, \"\").trim()\n return prompt\n ? `请使用 ${skillName} skill 完成任务\\n${prompt}`\n : `请使用 ${skillName} skill 完成任务`\n}\n\nconst ATTACHMENT_TAG_RE = /\\[附件:\\s*([^\\]]+)\\](?:[ \\t]*已上传到工作区路径:[ \\t]*([^\\r\\n]+))?/g\n// 来自 addContext 的 context 在发送时序列化为独立 text part:`[上下文: LABEL]\\nCONTENT`\n// 整块 part 匹配而非行内替换,避免破坏正文中可能出现的\"[上下文:\"字样\nconst CONTEXT_PART_RE = /^\\[上下文:\\s*([^\\]]+)\\]\\n([\\s\\S]*)$/\n\nexport interface ParsedTextAttachment {\n name: string\n uploadedPath?: string\n}\n\nexport interface ParsedTextContext {\n label: string\n content: string\n}\n\n/**\n * Extract `[附件: name]` and `[上下文: label]` tags from text parts and return\n * the cleaned text plus the collected attachment / context metadata. 每个 text\n * part 独立匹配,以避免跨 part 拼接打乱正则。\n */\nexport function extractTextAttachments(content: MessageContent): {\n cleanText: string\n attachments: ParsedTextAttachment[]\n contexts: ParsedTextContext[]\n} {\n if (typeof content === \"string\") {\n const attachments: ParsedTextAttachment[] = []\n const contexts: ParsedTextContext[] = []\n const ctxMatch = CONTEXT_PART_RE.exec(content)\n let working = content\n if (ctxMatch) {\n contexts.push({ label: ctxMatch[1].trim(), content: ctxMatch[2].trim() })\n working = \"\"\n }\n for (const match of working.matchAll(ATTACHMENT_TAG_RE)) {\n attachments.push({\n name: match[1].trim(),\n uploadedPath: match[2]?.trim() || undefined,\n })\n }\n return {\n cleanText: working.replace(ATTACHMENT_TAG_RE, \"\"),\n attachments,\n contexts,\n }\n }\n\n const attachments: ParsedTextAttachment[] = []\n const contexts: ParsedTextContext[] = []\n const cleanParts: string[] = []\n\n for (const part of content) {\n if (part.type !== \"text\") continue\n\n const ctxMatch = CONTEXT_PART_RE.exec(part.text)\n if (ctxMatch) {\n contexts.push({ label: ctxMatch[1].trim(), content: ctxMatch[2].trim() })\n continue\n }\n\n let hasAttachment = false\n for (const match of part.text.matchAll(ATTACHMENT_TAG_RE)) {\n attachments.push({\n name: match[1].trim(),\n uploadedPath: match[2]?.trim() || undefined,\n })\n hasAttachment = true\n }\n if (hasAttachment) {\n const remaining = part.text.replace(ATTACHMENT_TAG_RE, \"\")\n if (remaining.trim()) cleanParts.push(remaining)\n } else {\n cleanParts.push(part.text)\n }\n }\n\n return { cleanText: cleanParts.join(\"\\n\"), attachments, contexts }\n}\n\nexport function getImageParts(content: MessageContent): ImageUrlContentPart[] {\n if (typeof content === \"string\") return []\n return content.filter((part): part is ImageUrlContentPart => part.type === \"image_url\")\n}\n\nexport function getFileParts(content: MessageContent): FileContentPart[] {\n if (typeof content === \"string\") return []\n return content.filter((part): part is FileContentPart => part.type === \"file\")\n}\n\ninterface MessageGroup {\n root: ChatMessage | null\n childLoops: { loopName: string; messages: ChatMessage[] }[]\n}\n\nexport function groupMessagesByLoop(messages: ChatMessage[]): MessageGroup[] {\n const groups: MessageGroup[] = []\n let currentGroup: MessageGroup | null = null\n\n for (const msg of messages) {\n const loop = msg.loop_name ?? \"root\"\n\n if (loop === \"root\") {\n currentGroup = { root: msg, childLoops: [] }\n groups.push(currentGroup)\n } else {\n if (!currentGroup) {\n currentGroup = { root: null, childLoops: [] }\n groups.push(currentGroup)\n }\n const existingLoop = currentGroup.childLoops.find((l) => l.loopName === loop)\n if (existingLoop) {\n existingLoop.messages.push(msg)\n } else {\n currentGroup.childLoops.push({ loopName: loop, messages: [msg] })\n }\n }\n }\n\n return groups\n}\n","export type AnalyticsEventName =\n | \"message_sent\"\n | \"skill_invoked\"\n | \"session_shared\"\n\ntype AnalyticsClient = {\n capture: (name: AnalyticsEventName, props?: Record<string, unknown>) => void\n}\n\nlet analyticsClient: AnalyticsClient | null = null\n\nexport function setAnalyticsClient(client: AnalyticsClient | null) {\n analyticsClient = client\n}\n\nexport function trackEvent(\n name: AnalyticsEventName,\n props: Record<string, unknown> = {},\n) {\n analyticsClient?.capture(name, props)\n}\n","import type { PreviewTarget } from \"../stores/ui-store\"\n\nexport function buildToolPreviewKey(\n content: string,\n type: PreviewTarget[\"type\"],\n toolCallId: string,\n) {\n if (type === \"resource-uri\") {\n return `tool-preview-uri:${content}`\n }\n return `tool-preview:${toolCallId}`\n}\n","export interface UiMeta {\n resourceUri?: string\n resourceURI?: string\n resourceHTML?: string\n target: \"inline\" | \"preview\"\n height: number\n title?: string\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0\n}\n\nfunction isPositiveNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n}\n\nexport function isUiMeta(value: unknown): value is UiMeta {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false\n }\n const raw = value as Record<string, unknown>\n if (raw.target !== \"inline\" && raw.target !== \"preview\") {\n return false\n }\n if (!isPositiveNumber(raw.height)) {\n return false\n }\n if (\n !isNonEmptyString(raw.resourceHTML) &&\n !isNonEmptyString(raw.resourceUri) &&\n !isNonEmptyString(raw.resourceURI)\n ) {\n return false\n }\n if (raw.title != null && !isNonEmptyString(raw.title)) {\n return false\n }\n return true\n}\n","import type {\n ContentBlock,\n PendingQuestionRef,\n ToolCallProjection,\n TurnProjection,\n} from \"../schemas/projection\"\nimport type { TurnState } from \"./state\"\n\n// --- Tool call upsert ---\n\nexport function upsertToolCall(\n state: TurnState,\n toolCallId: string,\n toolName: string,\n displayName: string,\n args: string,\n): void {\n if (!toolCallId) return\n\n let found = false\n for (let i = 0; i < state.toolCalls.length; i++) {\n if (state.toolCalls[i].id !== toolCallId) continue\n const tc = state.toolCalls[i]\n state.toolCalls[i] = {\n ...tc,\n tool_name: toolName || tc.tool_name,\n display_name: displayName || tc.display_name,\n arguments: args || tc.arguments,\n }\n found = true\n break\n }\n if (!found) {\n state.toolCalls.push({\n id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n arguments: args,\n status: \"pending\",\n })\n }\n\n let blockFound = false\n for (let i = 0; i < state.blocks.length; i++) {\n const b = state.blocks[i]\n if (b.type !== \"tool_use\" || b.tool_call_id !== toolCallId) continue\n state.blocks[i] = {\n ...b,\n content: args || b.content,\n tool_name: toolName || b.tool_name,\n display_name: displayName || b.display_name,\n }\n blockFound = true\n break\n }\n if (!blockFound) {\n state.blocks.push({\n type: \"tool_use\",\n content: args,\n tool_call_id: toolCallId,\n tool_name: toolName || null,\n display_name: displayName || null,\n })\n }\n}\n\n// --- Tool result application ---\n\nexport function applyToolResult(\n state: TurnState,\n toolCallId: string,\n result: unknown,\n status: ToolCallProjection[\"status\"],\n durationMs: number | null,\n sourceLoop: { loop_name: string; description: string } | null,\n): void {\n let toolName = \"\"\n let displayName = \"\"\n let finalResult = result\n\n for (let i = 0; i < state.toolCalls.length; i++) {\n const tc = state.toolCalls[i]\n if (tc.id !== toolCallId) continue\n\n if (typeof result === \"string\") {\n finalResult = maybeEnrichAskUserResult(tc.tool_name, result, sourceLoop)\n }\n\n const update: Partial<ToolCallProjection> = { status, result: finalResult }\n if (durationMs != null) update.duration_ms = durationMs\n state.toolCalls[i] = { ...tc, ...update }\n toolName = tc.tool_name\n displayName = tc.display_name\n break\n }\n\n state.blocks.push({\n type: \"tool_result\",\n content: finalResult,\n tool_call_id: toolCallId,\n tool_name: toolName || null,\n display_name: displayName || null,\n })\n}\n\n// --- Text block append ---\n\nexport function appendTextBlock(\n state: TurnState,\n blockType: ContentBlock[\"type\"],\n content: unknown,\n): void {\n if (content == null || content === \"\") return\n const text = String(content)\n const lastBlock = state.blocks[state.blocks.length - 1]\n if (lastBlock && lastBlock.type === blockType && typeof lastBlock.content === \"string\") {\n state.blocks[state.blocks.length - 1] = {\n ...lastBlock,\n content: lastBlock.content + text,\n }\n return\n }\n state.blocks.push({ type: blockType, content: text })\n}\n\n// --- Tool call arguments append ---\n\nexport function appendToolCallArguments(\n state: TurnState,\n toolCallId: string,\n delta: string,\n): void {\n let newArgs = \"\"\n for (let i = 0; i < state.toolCalls.length; i++) {\n const tc = state.toolCalls[i]\n if (tc.id === toolCallId) {\n newArgs = tc.arguments + delta\n state.toolCalls[i] = { ...tc, arguments: newArgs }\n break\n }\n }\n if (!newArgs) return\n\n for (let i = 0; i < state.blocks.length; i++) {\n const b = state.blocks[i]\n if (b.type === \"tool_use\" && b.tool_call_id === toolCallId) {\n state.blocks[i] = { ...b, content: newArgs }\n break\n }\n }\n}\n\n// --- AskUserQuestion enrichment ---\n\nfunction maybeEnrichAskUserResult(\n toolName: string,\n result: string,\n sourceLoop: { loop_name: string; description: string } | null,\n): string {\n if (!sourceLoop) return result\n const normalized = toolName.includes(\":\") ? toolName.split(\":\").pop()! : toolName\n if (normalized !== \"AskUserQuestion\") return result\n try {\n const payload = JSON.parse(result)\n if (typeof payload !== \"object\" || payload === null) return result\n payload.source_loop = sourceLoop\n return JSON.stringify(payload)\n } catch {\n return result\n }\n}\n\n// --- System notification ---\n\nexport function buildSystemNotificationTurn(\n sequence: number,\n turnId: string,\n loopId: string,\n notificationType: string,\n status: string,\n title: string,\n detail: string | null,\n metadata: Record<string, unknown>,\n): TurnProjection {\n return {\n id: turnId,\n sequence,\n turn_id: turnId,\n loop_id: loopId,\n kind: \"message\",\n role: \"system\",\n status: \"completed\",\n blocks: [\n {\n type: \"system_notification\",\n content: {\n notification_type: notificationType,\n status,\n title,\n detail,\n metadata,\n },\n },\n ],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n}\n\nexport function buildSystemNotificationBlock(\n notificationType: string,\n status: string,\n title: string,\n detail: string | null,\n metadata: Record<string, unknown>,\n): ContentBlock {\n return {\n type: \"system_notification\",\n content: {\n notification_type: notificationType,\n status,\n title,\n detail,\n metadata,\n },\n }\n}\n\n// --- Marker turn ---\n\nexport function buildMarkerTurn(\n sequence: number,\n turnId: string,\n loopId: string,\n blockType: ContentBlock[\"type\"],\n content: unknown,\n): TurnProjection {\n return {\n id: turnId,\n sequence,\n turn_id: turnId,\n loop_id: loopId,\n kind: \"message\",\n role: \"assistant\",\n status: \"completed\",\n blocks: [{ type: blockType, content }],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n}\n\n// --- Compaction turn ---\n\nexport function buildCompactionTurn(\n sequence: number,\n compactionId: string,\n loopId: string,\n status: TurnProjection[\"status\"],\n data: Record<string, unknown>,\n): TurnProjection {\n const tokensBefore = asInt(data.tokens_before)\n const tokensAfter = asInt(data.tokens_after)\n let savedRatio: number | null = null\n if (tokensBefore && tokensBefore > 0 && tokensAfter != null) {\n savedRatio = 1 - tokensAfter / tokensBefore\n } else {\n savedRatio = asFloat(data.saved_ratio)\n }\n let archivedCount = asInt(data.archived_count)\n if (archivedCount == null && Array.isArray(data.archived_files)) {\n archivedCount = data.archived_files.length\n }\n\n const content = data.content\n const summaryFull = compactionSummaryFull(content)\n const summaryPreview = summaryFull\n ? summaryFull\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .join(\" \")\n .slice(0, 200)\n : null\n\n return {\n id: `compaction:${compactionId}`,\n sequence,\n turn_id: `compaction:${compactionId}`,\n loop_id: loopId,\n kind: \"compaction\",\n role: \"system\",\n status,\n blocks: [],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n compaction_id: compactionId,\n summary_preview: summaryPreview,\n summary_full: summaryFull,\n archived_count: archivedCount,\n tokens_before: tokensBefore,\n tokens_after: tokensAfter,\n saved_ratio: savedRatio,\n trigger: asTrigger(data.trigger),\n failure_reason:\n typeof data.reason === \"string\" && data.reason ? (data.reason as string) : null,\n fallback_applied: typeof data.fallback_applied === \"boolean\" ? data.fallback_applied : null,\n }\n}\n\nfunction compactionSummaryFull(content: unknown): string | null {\n const text = String(content ?? \"\")\n if (!text) return null\n const cleaned = text\n .replace(\"<compaction-summary>\", \"\")\n .replace(\"</compaction-summary>\", \"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\")\n .trim()\n return cleaned || null\n}\n\nfunction asInt(value: unknown): number | null {\n if (typeof value === \"boolean\") return null\n if (typeof value === \"number\") return Math.trunc(value)\n return null\n}\n\nfunction asFloat(value: unknown): number | null {\n if (typeof value === \"boolean\") return null\n if (typeof value === \"number\") return value\n return null\n}\n\nfunction asTrigger(value: unknown): \"auto\" | \"manual\" | \"forced_retry\" | null {\n if (value === \"auto\" || value === \"manual\" || value === \"forced_retry\") return value\n return null\n}\n\n// --- Child pause helpers ---\n\nexport interface ChildPauseInfo {\n parentLoopName: string\n parentToolCallId: string\n childLoopName: string\n childToolCallId: string\n description: string\n}\n\nexport function setToolCallStatus(\n turn: TurnState | TurnProjection | null | undefined,\n toolCallId: string,\n status: ToolCallProjection[\"status\"],\n result: unknown,\n pendingQuestionRef: PendingQuestionRef | null,\n): void {\n if (!turn || !toolCallId) return\n const toolCalls = \"toolCalls\" in turn ? turn.toolCalls : turn.tool_calls\n for (let i = 0; i < toolCalls.length; i++) {\n if (toolCalls[i].id !== toolCallId) continue\n toolCalls[i] = {\n ...toolCalls[i],\n status,\n result,\n pending_question_ref: pendingQuestionRef,\n }\n return\n }\n}\n\nexport function applyAskUserPauseToTurn(\n turn: TurnState | TurnProjection | null | undefined,\n pauseToolData: Record<string, unknown>,\n toolCallId: string,\n childLoopName: string,\n description: string,\n displayNameResolver: (name: string) => string,\n): void {\n if (!turn || !toolCallId) return\n\n const sourceLoop = childLoopName\n ? { loop_name: childLoopName, description }\n : null\n const toolName = String(pauseToolData.name ?? \"AskUserQuestion\")\n const args = JSON.stringify(pauseToolData.arguments ?? {})\n const result = askUserResultFromPausePayload(pauseToolData, sourceLoop)\n\n const isTurnState = \"toolCalls\" in turn\n const toolCalls = isTurnState ? turn.toolCalls : turn.tool_calls\n const blocks = turn.blocks\n\n // upsert tool call\n const displayName = displayNameResolver(toolName)\n let found = false\n for (let i = 0; i < toolCalls.length; i++) {\n if (toolCalls[i].id !== toolCallId) continue\n toolCalls[i] = {\n ...toolCalls[i],\n tool_name: toolName || toolCalls[i].tool_name,\n display_name: displayName || toolCalls[i].display_name,\n arguments: args || toolCalls[i].arguments,\n }\n found = true\n break\n }\n if (!found) {\n toolCalls.push({\n id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n arguments: args,\n status: \"pending\",\n })\n }\n\n // upsert tool_use block\n let blockFound = false\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i].type !== \"tool_use\" || blocks[i].tool_call_id !== toolCallId) continue\n blocks[i] = { ...blocks[i], content: args, tool_name: toolName, display_name: displayName }\n blockFound = true\n break\n }\n if (!blockFound) {\n blocks.push({\n type: \"tool_use\",\n content: args,\n tool_call_id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n })\n }\n\n // set status\n setToolCallStatus(turn, toolCallId, \"awaiting_answer\", result, null)\n\n // upsert tool_result block\n let resultBlockFound = false\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i].type !== \"tool_result\" || blocks[i].tool_call_id !== toolCallId) continue\n blocks[i] = { ...blocks[i], content: result }\n resultBlockFound = true\n break\n }\n if (!resultBlockFound) {\n blocks.push({\n type: \"tool_result\",\n content: result,\n tool_call_id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n })\n }\n}\n\nexport function applyChildPauseToParent(\n parentTurn: TurnState | TurnProjection | null | undefined,\n parentToolCallId: string,\n childLoopName: string,\n childToolCallId: string,\n description: string,\n displayNameResolver: (name: string) => string,\n): void {\n if (!parentTurn || !parentToolCallId) return\n\n const toolCalls = \"toolCalls\" in parentTurn ? parentTurn.toolCalls : parentTurn.tool_calls\n const blocks = parentTurn.blocks\n\n const displayName = displayNameResolver(\"Agent\")\n let found = false\n for (let i = 0; i < toolCalls.length; i++) {\n if (toolCalls[i].id !== parentToolCallId) continue\n toolCalls[i] = {\n ...toolCalls[i],\n tool_name: \"Agent\",\n display_name: displayName || toolCalls[i].display_name,\n }\n found = true\n break\n }\n if (!found) {\n toolCalls.push({\n id: parentToolCallId,\n tool_name: \"Agent\",\n display_name: displayName,\n arguments: \"\",\n status: \"pending\",\n })\n }\n\n // upsert tool_use block\n let blockFound = false\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i].type !== \"tool_use\" || blocks[i].tool_call_id !== parentToolCallId) continue\n blockFound = true\n break\n }\n if (!blockFound) {\n blocks.push({\n type: \"tool_use\",\n content: \"\",\n tool_call_id: parentToolCallId,\n tool_name: \"Agent\",\n display_name: displayName,\n })\n }\n\n setToolCallStatus(parentTurn, parentToolCallId, \"awaiting_answer\", null, {\n child_loop_name: childLoopName,\n child_tool_call_id: childToolCallId,\n description: description || null,\n })\n}\n\nfunction askUserResultFromPausePayload(\n pauseToolData: Record<string, unknown>,\n sourceLoop: { loop_name: string; description: string } | null,\n): string {\n const args =\n typeof pauseToolData.arguments === \"object\" && pauseToolData.arguments !== null\n ? (pauseToolData.arguments as Record<string, unknown>)\n : {}\n const payload: Record<string, unknown> = { questions: args.questions ?? [] }\n if (sourceLoop) payload.source_loop = sourceLoop\n return JSON.stringify(payload)\n}\n\nexport function sourceLoopFor(\n loopId: string,\n loopDescriptions: Map<string, string>,\n): { loop_name: string; description: string } | null {\n if (loopId === \"root\") return null\n const description = loopDescriptions.get(loopId)\n if (!description) return null\n return { loop_name: loopId, description }\n}\n\nexport function normalizeChildPause(\n pausePayload: Record<string, unknown>,\n): {\n pauseToolData: Record<string, unknown>\n childLoopName: string\n childToolCallId: string\n description: string\n} {\n const rawPtd = pausePayload.pause_tool_data\n const pauseToolData: Record<string, unknown> =\n typeof rawPtd === \"object\" && rawPtd !== null\n ? { ...(rawPtd as Record<string, unknown>) }\n : { ...pausePayload }\n\n let sourceLoop = pauseToolData.source_loop as Record<string, unknown> | undefined\n if (typeof sourceLoop !== \"object\" || sourceLoop === null) {\n sourceLoop = pausePayload.source_loop as Record<string, unknown> | undefined\n }\n\n const childLoopName =\n String(pausePayload.child_loop_name ?? \"\") ||\n (typeof sourceLoop === \"object\" && sourceLoop ? String(sourceLoop.name ?? \"\") : \"\")\n\n const childToolCallId =\n String(\n pausePayload.child_pause_tool_call_id ?? pauseToolData.tool_call_id ?? \"\",\n )\n\n const description =\n typeof sourceLoop === \"object\" && sourceLoop ? String(sourceLoop.description ?? \"\") : \"\"\n\n if (childLoopName && description) {\n pauseToolData.source_loop = { name: childLoopName, description }\n }\n\n return { pauseToolData, childLoopName, childToolCallId, description }\n}\n","import type { ContentBlock, PendingQuestionRef, ToolBridgeContent } from \"./projection\"\n\nexport interface TextContentPart {\n type: \"text\"\n text: string\n}\n\nexport interface ImageUrlContentPart {\n type: \"image_url\"\n image_url: {\n url: string\n }\n}\n\nexport interface FileContentPart {\n type: \"file\"\n name: string\n data: string\n}\n\nexport type MessageContentPart = TextContentPart | ImageUrlContentPart | FileContentPart\nexport type MessageContent = string | MessageContentPart[]\n\nexport interface ToolCallInfo {\n id: string\n name: string\n display_name?: string | null\n arguments: string\n result?: unknown\n status?: \"pending\" | \"done\" | \"error\" | \"cancelled\" | \"awaiting_answer\"\n duration_ms?: number | null\n pending_question_ref?: PendingQuestionRef | null\n}\n\nexport type { ToolBridgeContent }\n\n/** Derive tool status from the result content string. */\nexport function inferToolStatus(\n resultStr: string,\n): \"done\" | \"error\" | \"cancelled\" {\n if (resultStr.includes('\"Cancelled by user\"')) return \"cancelled\"\n try {\n const parsed = JSON.parse(resultStr)\n if (typeof parsed === \"object\" && parsed !== null) {\n // Direct error: {\"error\": \"...\"}\n if (\"error\" in parsed && parsed.error) return \"error\"\n // 部分工具把输出包装为 {\"result\": {\"error\": \"...\"}, ...}\n const nested = parsed.result\n if (typeof nested === \"object\" && nested !== null && \"error\" in nested && nested.error) {\n return \"error\"\n }\n }\n } catch {\n // not JSON, treat as success\n }\n return \"done\"\n}\n\nexport interface MemoryRefInfo {\n id: number\n content_preview: string\n skill_name?: string | null\n}\n\nexport interface CompactionInfo {\n compaction_id: string\n summary_preview?: string | null\n summary_full?: string | null\n archived_count?: number | null\n archived_files?: ArchivedFileInfo[] | null\n archived_tool_calls?: ArchivedToolCallInfo[] | null\n tokens_before?: number | null\n tokens_after?: number | null\n saved_ratio?: number | null\n trigger?: \"auto\" | \"manual\" | \"forced_retry\" | null\n failure_reason?: string | null\n fallback_applied?: boolean | null\n}\n\nexport interface ArchivedFileInfo {\n tool_name?: string | null\n filename?: string | null\n relative_path?: string | null\n size_bytes?: number | null\n}\n\nexport interface ArchivedToolCallInfo {\n tool_call_id?: string | null\n tool_name?: string | null\n archive_path?: string | null\n replacement_content?: string | null\n entry_id?: string | null\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"tool\" | \"error\"\n content: MessageContent\n reasoning?: string\n tool_calls?: ToolCallInfo[]\n status?: \"streaming\" | \"completed\" | \"paused\" | \"failed\" | \"interrupted\"\n duration_ms?: number\n timestamp?: string\n entry_id?: string\n parent_id?: string | null\n loop_name?: string\n /** Entry kind from backend -- present for non-message entries like mode changes. */\n kind?: string\n /** Memory references injected into this turn's context */\n memory_refs?: MemoryRefInfo[]\n /** Raw projection blocks for block-level UI rendering. */\n blocks?: ContentBlock[]\n /** Compaction metadata for compaction turns. */\n compaction?: CompactionInfo\n}\n","import { inferToolStatus } from \"../schemas/message\"\nimport type {\n ContentBlock,\n MemoryRef,\n ToolCallProjection,\n TurnProjection,\n} from \"../schemas/projection\"\n\nexport interface TurnState {\n turnId: string\n loopId: string\n role: \"user\" | \"assistant\" | \"system\"\n model: string | null\n startedAt: number\n contextWindow: number\n blocks: ContentBlock[]\n toolCalls: ToolCallProjection[]\n usage: Record<string, unknown> | null\n memoryRefs: MemoryRef[] | null\n parentForkToolCallId: string | null\n}\n\nexport function createTurnState(\n turnId: string,\n loopId: string,\n opts: {\n model?: string | null\n contextWindow?: number\n memoryRefs?: MemoryRef[] | null\n } = {},\n): TurnState {\n return {\n turnId,\n loopId,\n role: \"assistant\",\n model: opts.model ?? null,\n startedAt: Date.now(),\n contextWindow: opts.contextWindow ?? 0,\n blocks: [],\n toolCalls: [],\n usage: null,\n memoryRefs: opts.memoryRefs ?? null,\n parentForkToolCallId: null,\n }\n}\n\nexport function snapshot(\n state: TurnState,\n sequence: number,\n status: TurnProjection[\"status\"],\n): TurnProjection {\n return {\n id: state.turnId,\n sequence,\n turn_id: state.turnId,\n loop_id: state.loopId,\n kind: \"message\",\n role: state.role,\n status,\n blocks: [...state.blocks],\n tool_calls: [...state.toolCalls],\n model: state.model,\n usage: state.usage ? { ...state.usage } : null,\n duration_ms: Math.max(0, Date.now() - state.startedAt),\n started_at: new Date(state.startedAt).toISOString(),\n context_window: state.contextWindow,\n memory_refs: state.memoryRefs,\n parent_fork_tool_call_id: state.parentForkToolCallId,\n }\n}\n\nexport const PAUSE_TOOL_NAMES = new Set([\"AskUserQuestion\", \"ExitPlanMode\"])\n\nexport function toolStatusFromResult(result: unknown): ToolCallProjection[\"status\"] {\n const text =\n typeof result === \"string\"\n ? result\n : Array.isArray(result)\n ? result\n .filter(\n (p): p is { type: string; text: string } =>\n typeof p === \"object\" && p !== null && p.type === \"text\",\n )\n .map((p) => p.text ?? \"\")\n .join(\"\\n\")\n : String(result ?? \"\")\n return inferToolStatus(text)\n}\n","import type { MemoryRef, TurnProjection } from \"../schemas/projection\"\nimport {\n applyAskUserPauseToTurn,\n applyChildPauseToParent,\n appendTextBlock,\n appendToolCallArguments,\n applyToolResult,\n buildCompactionTurn,\n buildMarkerTurn,\n buildSystemNotificationBlock,\n buildSystemNotificationTurn,\n type ChildPauseInfo,\n normalizeChildPause,\n setToolCallStatus,\n sourceLoopFor,\n upsertToolCall,\n} from \"./helpers\"\nimport { createTurnState, PAUSE_TOOL_NAMES, snapshot, toolStatusFromResult, type TurnState } from \"./state\"\n\nexport interface RawEvent {\n type: string\n payload: Record<string, unknown>\n}\n\nexport type ProjectionUpdate =\n | { kind: \"upsert\"; turn: TurnProjection }\n | { kind: \"workspace_changed\"; loopId: string; toolCallId?: string; toolName?: string }\n\nexport class ClientProjectionBuilder {\n private activeTurns = new Map<string, TurnState>()\n private lastTurnIds = new Map<string, string>()\n private latestTurns = new Map<string, TurnProjection>()\n private loopDescriptions = new Map<string, string>()\n private pendingChildPauses = new Map<string, ChildPauseInfo>()\n private pendingMemoryRefs = new Map<string, { turnId: string; refs: MemoryRef[] }>()\n private activeCompactions = new Map<string, Record<string, unknown>>()\n private seq = 0\n private syntheticCounter = 0\n private displayNameResolver: (name: string) => string\n\n constructor(displayNameResolver?: (name: string) => string) {\n this.displayNameResolver = displayNameResolver ?? ((n) => n)\n }\n\n processBatch(events: RawEvent[]): ProjectionUpdate[] {\n const lastUpsertByTurn = new Map<string, ProjectionUpdate & { kind: \"upsert\" }>()\n const nonUpserts: ProjectionUpdate[] = []\n for (const event of events) {\n const updates = this.processEvent(event)\n if (!updates) continue\n for (const u of updates) {\n if (u.kind === \"upsert\") {\n lastUpsertByTurn.set(u.turn.turn_id, u)\n } else {\n nonUpserts.push(u)\n }\n }\n }\n return [...nonUpserts, ...lastUpsertByTurn.values()]\n }\n\n processEvent(event: RawEvent): ProjectionUpdate[] | null {\n const payload = event.payload\n const loopId = String(payload.loop_name ?? \"root\")\n\n switch (event.type) {\n case \"memory:inject:done\":\n return this.onMemoryInject(loopId, payload)\n case \"memory:inject:none\":\n return null\n case \"loop:turn\":\n return this.onLoopTurn(loopId, payload)\n case \"mode:change\":\n return this.onModeChange(loopId, payload)\n case \"plan:status:update\":\n return this.onPlanStatusUpdate(loopId, payload)\n case \"workspace:changed\":\n return this.onWorkspaceChanged(loopId, payload)\n case \"agent:start\":\n return this.onAgentStart(loopId, payload)\n case \"bg:started\":\n return this.onBgStarted(loopId, payload)\n case \"bg:tasks_completed\":\n return this.onBgTasksCompleted(loopId, payload)\n case \"loop:ask_user_answer\":\n return this.onAskUserAnswer(loopId, payload)\n case \"user:message\":\n return this.onUserMessage(loopId, payload)\n }\n\n if (event.type.startsWith(\"compaction:\"))\n return this.onCompaction(event.type, loopId, payload)\n\n const state = this.activeTurns.get(loopId)\n if (!state) {\n if (event.type === \"chat:end\") {\n this.pendingMemoryRefs.delete(loopId)\n return null\n }\n if (event.type === \"agent:end\") return this.onAgentEnd(null, loopId, payload)\n return null\n }\n\n switch (event.type) {\n case \"llm:thinking:delta\":\n return this.onDelta(state, \"thinking\", \"\", String(payload.content ?? \"\"))\n case \"llm:content:delta\":\n return this.onDelta(state, \"text\", \"\", String(payload.content ?? \"\"))\n case \"llm:tool_call:created\":\n return this.onToolCallCreated(state, payload)\n case \"llm:response:done\":\n return this.onResponseDone(state, loopId, payload)\n case \"tool:result:done\":\n return this.onToolResultDone(state, loopId, payload)\n case \"loop:tool_ui\":\n return this.onToolUi(state, payload)\n case \"loop:tool_bridge\":\n return this.onToolBridge(state, payload)\n case \"tool:approval:required\":\n return this.onToolApprovalRequired(state, payload)\n case \"loop:child_pause\":\n return this.onChildPause(state, loopId, payload)\n case \"chat:end\":\n return this.onChatEnd(state, loopId, payload)\n case \"agent:end\":\n return this.onAgentEnd(state, loopId, payload)\n default:\n return null\n }\n }\n\n reset(): void {\n this.activeTurns.clear()\n this.lastTurnIds.clear()\n this.latestTurns.clear()\n this.loopDescriptions.clear()\n this.pendingChildPauses.clear()\n this.pendingMemoryRefs.clear()\n this.activeCompactions.clear()\n this.seq = 0\n this.syntheticCounter = 0\n }\n\n seedSequence(maxSeq: number): void {\n if (maxSeq > this.seq) {\n this.seq = maxSeq\n }\n }\n\n // --- Event handlers ---\n\n private onMemoryInject(\n loopId: string,\n payload: Record<string, unknown>,\n ): null {\n const refs = payload.memory_refs\n const turnId = String(payload.turn_id ?? \"\")\n if (Array.isArray(refs) && refs.length > 0) {\n this.pendingMemoryRefs.set(loopId, {\n turnId,\n refs: refs.map((r: Record<string, unknown>) => ({\n id: Number(r.id),\n content_preview: String(r.content_preview ?? \"\"),\n skill_name: r.skill_name != null ? String(r.skill_name) : null,\n })),\n })\n }\n return null\n }\n\n private onLoopTurn(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n let turnId = String(payload.turn_id ?? this.nextTurnId(`turn:${loopId}`))\n let memoryRefs: MemoryRef[] | null = null\n\n const pending = this.pendingMemoryRefs.get(loopId)\n if (pending) {\n this.pendingMemoryRefs.delete(loopId)\n if (pending.turnId) turnId = pending.turnId\n memoryRefs = pending.refs\n }\n\n const rawCw = payload.context_window\n const contextWindow =\n typeof rawCw === \"number\" && rawCw > 0 ? Math.trunc(rawCw) : 0\n\n const state = createTurnState(turnId, loopId, {\n model: optStr(payload.model),\n contextWindow,\n memoryRefs,\n })\n\n this.activeTurns.set(loopId, state)\n this.lastTurnIds.set(loopId, turnId)\n\n const turn = snapshot(state, this.nextSeq(), \"streaming\")\n this.latestTurns.set(loopId, turn)\n return [{ kind: \"upsert\", turn }]\n }\n\n private onModeChange(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const content: Record<string, string> = {}\n if (payload.from != null && payload.from !== \"\") content.from = String(payload.from)\n if (payload.to != null && payload.to !== \"\") content.to = String(payload.to)\n const turn = buildMarkerTurn(\n this.nextSeq(),\n this.nextTurnId(\"mode_change\"),\n loopId,\n \"mode_change\",\n content,\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onPlanStatusUpdate(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n let statuses = payload.statuses\n if (typeof statuses !== \"object\" || statuses === null) {\n statuses = payload._statuses ?? {}\n }\n const turn = buildMarkerTurn(\n this.nextSeq(),\n this.nextTurnId(\"plan_status\"),\n loopId,\n \"plan_status\",\n { plan_yaml: payload.plan_yaml ?? \"\", statuses },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onWorkspaceChanged(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const updates: ProjectionUpdate[] = [\n {\n kind: \"workspace_changed\",\n loopId,\n toolCallId: optStr(payload.tool_call_id) ?? undefined,\n toolName: toolNameFromPayload(payload) ?? undefined,\n },\n ]\n const state = this.activeTurns.get(loopId)\n if (state) {\n const turn = snapshot(state, this.nextSeq(), \"streaming\")\n this.latestTurns.set(loopId, turn)\n this.lastTurnIds.set(loopId, turn.turn_id)\n updates.push({ kind: \"upsert\", turn })\n }\n return updates\n }\n\n private onAgentStart(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const description = optStr(payload.description)\n if (description) this.loopDescriptions.set(loopId, description)\n const turn = buildSystemNotificationTurn(\n this.nextSeq(),\n this.nextTurnId(\"agent:start\"),\n loopId,\n \"agent:start\",\n \"running\",\n `Agent: ${payload.description ?? payload.skill_id ?? \"agent\"}`,\n optStr(payload.prompt),\n {\n skill_id: optStr(payload.skill_id),\n description: optStr(payload.description),\n parent_fork_tool_call_id: optStr(payload.parent_fork_tool_call_id),\n },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onBgStarted(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const taskId = optStr(payload.task_id) ?? \"\"\n const command = optStr(payload.command)\n const description = optStr(payload.description)\n const turn = buildSystemNotificationTurn(\n this.nextSeq(),\n this.nextTurnId(\"bg:started\"),\n loopId,\n \"bg:started\",\n \"running\",\n description ?? `Background: ${taskId || \"task\"}`,\n command,\n { task_id: taskId, command, description },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onBgTasksCompleted(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const taskIds = Array.isArray(payload.task_ids) ? payload.task_ids : []\n const count = typeof payload.count === \"number\" ? payload.count : taskIds.length\n const detail = taskIds.map(String).join(\", \")\n const turn = buildSystemNotificationTurn(\n this.nextSeq(),\n this.nextTurnId(\"bg:tasks_completed\"),\n loopId,\n \"bg:tasks_completed\",\n \"done\",\n `Background tasks completed (${count})`,\n detail || null,\n { task_ids: taskIds, count },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onAskUserAnswer(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const pending = this.pendingChildPauses.get(toolCallId)\n const parentLoopId = pending?.parentLoopName\n\n // clear child pause\n if (pending) {\n this.pendingChildPauses.delete(toolCallId)\n const childTurn =\n this.activeTurns.get(pending.childLoopName) ??\n this.latestTurns.get(pending.childLoopName)\n setToolCallStatus(childTurn, pending.childToolCallId, \"done\", null, null)\n const parentTurn =\n this.activeTurns.get(pending.parentLoopName) ??\n this.latestTurns.get(pending.parentLoopName)\n setToolCallStatus(parentTurn, pending.parentToolCallId, \"done\", null, null)\n }\n\n // clear direct ask-user pause\n const directTurn = this.activeTurns.get(loopId) ?? this.latestTurns.get(loopId)\n setToolCallStatus(directTurn, toolCallId, \"done\", null, null)\n\n return this.collectLoopUpdates(loopId, parentLoopId)\n }\n\n private onUserMessage(\n _loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const entryId = String(payload.entry_id ?? this.nextTurnId(\"user\"))\n const displayContent = payload.display_content ?? payload.content ?? \"\"\n const turn: TurnProjection = {\n id: entryId,\n sequence: this.nextSeq(),\n turn_id: entryId,\n loop_id: \"root\",\n kind: \"message\",\n role: \"user\",\n status: \"completed\",\n blocks: [{ type: \"text\", content: displayContent }],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n return [{ kind: \"upsert\", turn }]\n }\n\n // --- Delta / streaming events ---\n\n private onDelta(\n state: TurnState,\n blockType: \"thinking\" | \"text\",\n _toolCallId: string,\n content: string,\n ): ProjectionUpdate[] | null {\n if (!content) return null\n appendTextBlock(state, blockType, content)\n return this.syncPatch(state)\n }\n\n private onToolCallCreated(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n if (\"arguments_delta\" in payload) {\n const delta = String(payload.arguments_delta ?? \"\")\n const toolCallId = String(payload.id ?? \"\")\n if (delta && toolCallId) {\n appendToolCallArguments(state, toolCallId, delta)\n return this.syncPatch(state)\n }\n return null\n }\n const toolCallId = String(payload.id ?? \"\")\n const toolName = toolNameFromPayload(payload)\n const displayName = String(payload.display_name ?? \"\") || this.displayNameResolver(toolName)\n const args = toolArgsFromPayload(payload)\n upsertToolCall(state, toolCallId, toolName, displayName, args)\n return this.syncPatch(state)\n }\n\n private onResponseDone(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const model = optStr(payload.model)\n if (model) state.model = model\n if (typeof payload.usage === \"object\" && payload.usage !== null) {\n state.usage = { ...(payload.usage as Record<string, unknown>) }\n }\n\n // apply tool calls from full response\n const toolCalls = payload.tool_calls\n if (Array.isArray(toolCalls)) {\n for (const raw of toolCalls) {\n if (typeof raw !== \"object\" || raw === null) continue\n const tc = raw as Record<string, unknown>\n const fn = (tc.function ?? {}) as Record<string, unknown>\n const toolName = String(fn.name ?? \"\")\n const displayName =\n String(tc.display_name ?? \"\") || this.displayNameResolver(toolName)\n upsertToolCall(\n state,\n String(tc.id ?? \"\"),\n toolName,\n displayName,\n String(fn.arguments ?? \"\"),\n )\n }\n }\n\n if (state.toolCalls.length === 0) {\n return this.finalize(loopId, \"completed\")\n }\n return this.syncPatch(state)\n }\n\n private onToolResultDone(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const content = payload.content ?? \"\"\n const status = toolStatusFromResult(content)\n const rawDuration = payload.duration_ms\n const durationMs =\n typeof rawDuration === \"number\" && rawDuration >= 0\n ? Math.round(rawDuration)\n : null\n\n const sl = sourceLoopFor(state.loopId, this.loopDescriptions)\n applyToolResult(state, toolCallId, content, status, durationMs, sl)\n\n if (this.shouldFinalizeAfterToolResults(state)) {\n return this.finalize(loopId, \"completed\")\n }\n return this.syncPatch(state)\n }\n\n private onToolUi(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const ui = payload.ui\n if (toolCallId && typeof ui === \"object\" && ui !== null) {\n state.blocks.push({\n type: \"tool_ui\",\n content: ui,\n tool_call_id: toolCallId,\n })\n }\n return this.syncPatch(state)\n }\n\n private onToolBridge(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const bridge = payload.bridge\n if (typeof bridge !== \"object\" || bridge === null) return null\n state.blocks.push({\n type: \"tool_bridge\",\n content: bridge,\n tool_call_id: String(payload.tool_call_id ?? \"\") || null,\n })\n return this.syncPatch(state)\n }\n\n private onToolApprovalRequired(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const toolName = String(payload.tool_name ?? \"\")\n const displayName = this.displayNameResolver(toolName)\n upsertToolCall(state, toolCallId, toolName, displayName, \"\")\n return this.syncPatch(state)\n }\n\n private onChildPause(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const pauseToolData = payload.pause_tool_data\n if (typeof pauseToolData !== \"object\" || pauseToolData === null)\n return this.syncPatch(state)\n\n const ptd = pauseToolData as Record<string, unknown>\n const sourceLoop = ptd.source_loop as Record<string, unknown> | undefined\n if (typeof sourceLoop === \"object\" && sourceLoop) {\n const slName = String(sourceLoop.name ?? \"\")\n const slDesc = optStr(sourceLoop.description)\n if (slName && slDesc) this.loopDescriptions.set(slName, slDesc)\n }\n\n const { childLoopName, childToolCallId, description } =\n normalizeChildPause(payload as Record<string, unknown>)\n\n if (!childToolCallId) return this.syncPatch(state)\n\n const existing = this.pendingChildPauses.get(childToolCallId)\n const parentLoopName = String(\n payload.parent_loop_name ?? existing?.parentLoopName ?? \"root\",\n )\n const parentToolCallId = String(\n payload.parent_fork_tool_call_id ?? existing?.parentToolCallId ?? \"\",\n )\n const resolvedChildLoopName =\n String(payload.child_loop_name ?? \"\") || existing?.childLoopName || childLoopName || loopId\n\n this.pendingChildPauses.set(childToolCallId, {\n parentLoopName,\n parentToolCallId,\n childLoopName: resolvedChildLoopName,\n childToolCallId,\n description: description || existing?.description || \"\",\n })\n\n // apply to child\n applyAskUserPauseToTurn(\n state,\n ptd,\n childToolCallId,\n resolvedChildLoopName,\n this.pendingChildPauses.get(childToolCallId)!.description,\n this.displayNameResolver,\n )\n\n // apply to parent\n const parentTurn =\n this.activeTurns.get(parentLoopName) ?? this.latestTurns.get(parentLoopName)\n if (parentTurn) {\n applyChildPauseToParent(\n parentTurn,\n parentToolCallId,\n resolvedChildLoopName,\n childToolCallId,\n this.pendingChildPauses.get(childToolCallId)!.description,\n this.displayNameResolver,\n )\n }\n\n return this.collectLoopUpdates(loopId, parentLoopName)\n }\n\n private onChatEnd(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const status = String(payload.status ?? \"completed\")\n\n const pauseToolData = payload.pause_tool_data\n if (typeof pauseToolData === \"object\" && pauseToolData !== null) {\n const ptd = pauseToolData as Record<string, unknown>\n const pauseToolName = String(ptd.name ?? \"\")\n const normalized = pauseToolName.includes(\":\")\n ? pauseToolName.split(\":\").pop()!\n : pauseToolName\n const sourceLoop = ptd.source_loop as Record<string, unknown> | undefined\n\n if (typeof sourceLoop === \"object\" && sourceLoop) {\n const slName = String(sourceLoop.name ?? \"\")\n const slDesc = optStr(sourceLoop.description)\n if (slName && slDesc) this.loopDescriptions.set(slName, slDesc)\n\n if (status === \"paused\" && slName) {\n applyChildPauseToParent(\n state,\n String(ptd.parent_fork_tool_call_id ?? \"\"),\n slName,\n String(ptd.tool_call_id ?? \"\"),\n slDesc ?? \"\",\n this.displayNameResolver,\n )\n\n const childTurn = this.activeTurns.get(slName)\n if (childTurn) {\n applyAskUserPauseToTurn(\n childTurn,\n ptd,\n String(ptd.tool_call_id ?? \"\"),\n slName,\n slDesc ?? \"\",\n this.displayNameResolver,\n )\n }\n }\n } else if (status === \"paused\" && normalized === \"AskUserQuestion\") {\n applyAskUserPauseToTurn(\n state,\n ptd,\n String(ptd.tool_call_id ?? \"\"),\n \"\",\n \"\",\n this.displayNameResolver,\n )\n }\n }\n\n const finalStatus = (\n { completed: \"completed\", paused: \"paused\", failed: \"failed\", interrupted: \"interrupted\" } as Record<string, TurnProjection[\"status\"]>\n )[status]\n\n if (!finalStatus) return null\n if (!this.activeTurns.has(loopId)) {\n this.pendingMemoryRefs.delete(loopId)\n }\n return this.finalize(loopId, finalStatus)\n }\n\n private onAgentEnd(\n state: TurnState | null,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const ok = payload.ok !== false\n const status = ok ? \"done\" : \"error\"\n const title = `Agent: ${payload.description ?? payload.skill_id ?? \"agent\"}`\n const detail = optStr(payload.error)\n const metadata = {\n skill_id: optStr(payload.skill_id),\n description: optStr(payload.description),\n parent_fork_tool_call_id: optStr(payload.parent_fork_tool_call_id),\n ok,\n }\n if (state) {\n state.blocks.push(buildSystemNotificationBlock(\"agent:end\", status, title, detail, metadata))\n return this.finalize(loopId, ok ? \"completed\" : \"failed\")\n }\n const turn = buildSystemNotificationTurn(\n this.nextSeq(), this.nextTurnId(\"agent:end\"), loopId, \"agent:end\", status, title, detail, metadata,\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onCompaction(\n eventType: string,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const compactionId = String(payload.compaction_id ?? \"\")\n if (!compactionId) return null\n\n const current = {\n ...(this.activeCompactions.get(compactionId) ?? {}),\n ...payload,\n loop_id: loopId,\n }\n\n let status: TurnProjection[\"status\"]\n switch (eventType) {\n case \"compaction:start\":\n status = \"streaming\"\n this.activeCompactions.set(compactionId, current)\n break\n case \"compaction:end\":\n status = \"completed\"\n this.activeCompactions.delete(compactionId)\n break\n case \"compaction:abort\":\n status = \"interrupted\"\n this.activeCompactions.delete(compactionId)\n break\n case \"compaction:error\":\n status = \"failed\"\n this.activeCompactions.delete(compactionId)\n break\n default:\n status = \"streaming\"\n this.activeCompactions.set(compactionId, current)\n }\n\n const turn = buildCompactionTurn(this.nextSeq(), compactionId, loopId, status, current)\n return [{ kind: \"upsert\", turn }]\n }\n\n // --- Internal helpers ---\n\n private syncPatch(state: TurnState): ProjectionUpdate[] {\n const turn = snapshot(state, this.nextSeq(), \"streaming\")\n this.latestTurns.set(state.loopId, turn)\n this.lastTurnIds.set(state.loopId, turn.turn_id)\n return [{ kind: \"upsert\", turn }]\n }\n\n private finalize(\n loopId: string,\n status: TurnProjection[\"status\"],\n ): ProjectionUpdate[] | null {\n const state = this.activeTurns.get(loopId)\n if (!state) return null\n this.activeTurns.delete(loopId)\n const turn = snapshot(state, this.nextSeq(), status)\n this.lastTurnIds.set(loopId, turn.turn_id)\n this.latestTurns.set(loopId, turn)\n return [{ kind: \"upsert\", turn }]\n }\n\n private shouldFinalizeAfterToolResults(state: TurnState): boolean {\n if (state.toolCalls.length === 0) return true\n if (state.toolCalls.some((tc) => tc.status === \"pending\")) return false\n return !state.toolCalls.some((tc) => {\n const normalized = tc.tool_name.includes(\":\")\n ? tc.tool_name.split(\":\").pop()!\n : tc.tool_name\n return PAUSE_TOOL_NAMES.has(normalized)\n })\n }\n\n private collectLoopUpdates(\n ...loopIds: (string | undefined | null)[]\n ): ProjectionUpdate[] {\n const updates: ProjectionUpdate[] = []\n for (const loopId of loopIds) {\n if (!loopId) continue\n const state = this.activeTurns.get(loopId)\n if (state) {\n updates.push(...this.syncPatch(state))\n continue\n }\n const proj = this.latestTurns.get(loopId)\n if (proj) {\n const updated = { ...proj, sequence: this.nextSeq() }\n this.latestTurns.set(loopId, updated)\n updates.push({ kind: \"upsert\", turn: updated })\n }\n }\n return updates\n }\n\n private nextSeq(): number {\n return ++this.seq\n }\n\n private nextTurnId(prefix: string): string {\n this.syntheticCounter++\n const hex = Math.random().toString(16).slice(2, 10)\n return `${prefix}:${this.syntheticCounter}:${hex}`\n }\n}\n\n// --- Utility functions ---\n\nfunction optStr(value: unknown): string | null {\n if (value == null || value === \"\") return null\n return String(value)\n}\n\nfunction toolNameFromPayload(payload: Record<string, unknown>): string {\n const fn = payload.function\n if (typeof fn === \"object\" && fn !== null) {\n return String((fn as Record<string, unknown>).name ?? \"\")\n }\n return String(payload.tool_name ?? \"\")\n}\n\nfunction toolArgsFromPayload(payload: Record<string, unknown>): string {\n const fn = payload.function\n if (typeof fn === \"object\" && fn !== null) {\n return String((fn as Record<string, unknown>).arguments ?? \"\")\n }\n return \"\"\n}\n","import { create } from \"zustand\"\nimport { createJSONStorage, persist } from \"zustand/middleware\"\nimport * as authApi from \"../api/auth\"\nimport { agentSocket } from \"../sockets/socket-state\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\nimport { useSessionStore } from \"./session-store\"\n\ninterface User {\n id: string\n username: string\n display_name?: string | null\n avatar_url: string | null\n is_admin?: boolean\n}\n\ninterface AuthState extends ClientAwareState {\n token: string | null\n socketAuthToken: string | null\n user: User | null\n loading: boolean\n error: string | null\n\n logout: () => void\n checkAuth: () => Promise<void>\n hydrateFromCookie: () => Promise<void>\n}\n\ntype PersistedAuthState = Pick<AuthState, \"token\" | \"user\">\n\nconst noopStorage = {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n}\n\nfunction shouldClearPersistedAuthState(value: string): boolean {\n try {\n const parsed = JSON.parse(value) as {\n state?: PersistedAuthState | null\n }\n return parsed.state?.token == null && parsed.state?.user == null\n } catch {\n return false\n }\n}\n\nconst authStorage = createJSONStorage<PersistedAuthState>(() => {\n if (typeof localStorage === \"undefined\") {\n return noopStorage\n }\n\n return {\n getItem: (name) => localStorage.getItem(name),\n setItem: (name, value) => {\n if (shouldClearPersistedAuthState(value)) {\n localStorage.removeItem(name)\n return\n }\n\n localStorage.setItem(name, value)\n },\n removeItem: (name) => localStorage.removeItem(name),\n }\n})\n\nfunction finishAuth(set: (partial: Partial<AuthState>) => void, payload: { token: string; user: User }) {\n set({\n token: payload.token,\n socketAuthToken: null,\n user: payload.user,\n loading: false,\n error: null,\n })\n agentSocket?.reconnect()\n}\n\nfunction finishCookieHydration(\n set: (partial: Partial<AuthState>) => void,\n payload: { token: string; user: User },\n) {\n set({\n token: null,\n socketAuthToken: payload.token,\n user: payload.user,\n loading: false,\n error: null,\n })\n agentSocket?.reconnect()\n}\n\nfunction toUser(info: authApi.UserInfo): User {\n return {\n id: info.id,\n username: info.username,\n display_name: info.display_name,\n avatar_url: info.avatar_url,\n is_admin: info.is_admin,\n }\n}\n\nexport const useAuthStore = create<AuthState>()(\n persist(\n (set, get) => ({\n ...createClientActions(set),\n token: null,\n socketAuthToken: null,\n user: null,\n loading: false,\n error: null,\n\n logout: () => {\n agentSocket?.disconnect()\n useSessionStore.getState().reset()\n // 先调后端清本地 session + 拿 OAuth logout URL,再跳转清 SSO cookie\n // 不提前 set token=null,避免 LoginPage 渲染后自动跳 OAuth 和 logout 跳转竞争\n void authApi\n .logout()\n .then(({ logout_url }) => {\n set({ token: null, socketAuthToken: null, user: null, error: null })\n if (logout_url) {\n const redirect = encodeURIComponent(window.location.origin)\n const sep = logout_url.includes(\"?\") ? \"&\" : \"?\"\n window.location.href = `${logout_url}${sep}redirect=${redirect}`\n }\n })\n .catch(() => {\n // 即使后端调用失败也要清本地状态\n set({ token: null, socketAuthToken: null, user: null, error: null })\n })\n },\n\n checkAuth: async () => {\n const token = get().token\n if (!token) return\n try {\n const auth = await authApi.getMe()\n finishAuth(set, { token: auth.token, user: toUser(auth) })\n } catch {\n set({ token: null, socketAuthToken: null, user: null, error: null })\n useSessionStore.getState().reset()\n }\n },\n\n hydrateFromCookie: async () => {\n set({ loading: true, error: null })\n const previousToken = get().token\n\n if (previousToken) {\n try {\n const auth = await authApi.getMe()\n finishAuth(set, { token: auth.token, user: toUser(auth) })\n return\n } catch {\n set({ token: null, socketAuthToken: null, user: null, error: null })\n useSessionStore.getState().reset()\n }\n }\n\n try {\n const auth = await authApi.getMe()\n finishCookieHydration(set, { token: auth.token, user: toUser(auth) })\n } catch {\n set({\n token: null,\n socketAuthToken: null,\n user: null,\n loading: false,\n error: null,\n })\n useSessionStore.getState().reset()\n }\n },\n }),\n {\n name: \"agent-auth\",\n storage: authStorage,\n partialize: (state) => {\n if (state.socketAuthToken) {\n return { token: null, user: null }\n }\n return { token: state.token, user: state.user }\n },\n },\n ),\n)\n","import type { AuthResource } from \"../../client/resources/auth\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/auth\"\n\nconst r = (): AuthResource => getClient().auth\nexport const getProviders = (...args: Parameters<AuthResource[\"getProviders\"]>) => r().getProviders(...args)\nexport const getMe = (...args: Parameters<AuthResource[\"getMe\"]>) => r().getMe(...args)\nexport const logout = (...args: Parameters<AuthResource[\"logout\"]>) => r().logout(...args)\n","import type { AgentSocket } from \"./event-bridge\"\n\nexport let agentSocket: AgentSocket | null = null\n\nexport function setAgentSocket(nextSocket: AgentSocket | null): void {\n agentSocket = nextSocket\n}\n\nexport function getSocket(): AgentSocket {\n if (!agentSocket) throw new Error(\"Socket not initialized. Call bootstrapBladeClient() first.\")\n return agentSocket\n}\n","import { create } from \"zustand\"\nimport * as sessionsApi from \"../api/sessions\"\nimport type { AskUserAnswerData } from \"../components/chat/AskUserQuestionBlock\"\nimport type { ContentBlock, TurnProjection } from \"../schemas/projection\"\nimport type { ModeId, SessionInfo, SessionStatus } from \"../schemas/session\"\nimport { setChatStoreSessionAccessor, useChatStore } from \"./chat-store\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\nimport { useTaskStore } from \"./task-store\"\n\nexport type SessionMode = ModeId\nconst DEFAULT_SESSION_MODE: SessionMode = \"executing\"\n\ntype QueryClientLike = {\n invalidateQueries: (options: { queryKey: readonly unknown[] }) => Promise<unknown>\n}\n\ninterface SessionState extends ClientAwareState {\n sessions: SessionInfo[]\n activeSessionId: string | null\n loading: boolean\n modes: Record<string, SessionMode>\n rewindDrafts: Record<string, string>\n errorMessages: Record<string, string>\n /** Session IDs that were just created and haven't had their first history load yet */\n _freshSessions: Set<string>\n\n fetchAllSessions: () => Promise<void>\n createSession: (intent?: string) => Promise<string>\n registerCreatedSession: (\n session: SessionInfo,\n mode?: SessionMode,\n options?: { fresh?: boolean },\n ) => void\n upsertSession: (session: SessionInfo) => void\n isFreshSession: (sessionId: string) => boolean\n setActiveSession: (id: string) => void\n clearActiveSession: () => void\n deleteSession: (id: string) => Promise<void>\n updateSessionStatus: (sessionId: string, status: SessionStatus) => void\n updateSessionIntent: (sessionId: string, intent: string) => void\n /**\n * ship-attack v2:通用增量更新 session 字段。用于 session:updated 等事件\n * 广播\"后端刚改了 session 元数据(intent / bound_skill_id / ...)\"时,\n * 前端原地 patch sessions 缓存,而不需要重新拉整个列表。\n */\n patchSession: (sessionId: string, patch: Partial<SessionInfo>) => void\n pinSession: (sessionId: string, pinned: boolean) => Promise<void>\n setErrorMessage: (sessionId: string, message: string) => void\n clearErrorMessage: (sessionId: string) => void\n setRewindDraft: (sessionId: string, text: string | null) => void\n setMode: (sessionId: string, mode: SessionMode) => void\n togglePlanningMode: (sessionId: string) => void\n toggleSharing: (sessionId: string) => Promise<void>\n reset: () => void\n}\n\n// agentSocket will be set after socket init -- see socket.ts\nlet onSessionChange: ((sessionId: string | null) => void) | null = null\nexport function setOnSessionChange(fn: (sessionId: string | null) => void) {\n onSessionChange = fn\n}\n\n/** 侧栏等使用 React Query 拉取会话列表时,与 zustand patch 同步失效。 */\nexport function invalidateHomeSidebarSessions() {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"sessions\", \"home-sidebar\"] })\n}\n\nfunction isSessionAccessRevoked(error: unknown) {\n if (error instanceof Error) {\n const msg = error.message\n return msg.includes(\"API 403\") || msg.includes(\"API 404\")\n }\n return false\n}\n\nfunction removeSessionArtifacts(sessionId: string) {\n useChatStore.getState().clearMessages(sessionId)\n useTaskStore.getState().setTasks(sessionId, [])\n}\n\nfunction pruneSessionState(state: SessionState, sessionId: string) {\n const nextFresh = new Set(state._freshSessions)\n nextFresh.delete(sessionId)\n const { [sessionId]: _mode, ...modes } = state.modes\n const { [sessionId]: _rewindDraft, ...rewindDrafts } = state.rewindDrafts\n\n return {\n sessions: state.sessions.filter((session) => session.id !== sessionId),\n activeSessionId: state.activeSessionId === sessionId ? null : state.activeSessionId,\n modes,\n rewindDrafts,\n _freshSessions: nextFresh,\n }\n}\n\nfunction navigateAwayFromSession(sessionId: string) {\n if (typeof window === \"undefined\") return\n if (window.location.pathname !== `/chat/${sessionId}`) return\n window.history.replaceState(window.history.state, \"\", \"/chat\")\n window.dispatchEvent(new PopStateEvent(\"popstate\"))\n}\n\nfunction handleUnreadableSession(\n set: (\n partial:\n | Partial<SessionState>\n | ((state: SessionState) => Partial<SessionState> | SessionState),\n ) => void,\n get: () => SessionState,\n sessionId: string,\n) {\n const wasActive = get().activeSessionId === sessionId\n removeSessionArtifacts(sessionId)\n set((state) => pruneSessionState(state, sessionId))\n if (wasActive) {\n onSessionChange?.(null)\n navigateAwayFromSession(sessionId)\n }\n invalidateHomeSidebarSessions()\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction extractModeFromBlocks(blocks: ContentBlock[]): SessionMode | null {\n const modeBlock = blocks.find((block) => block.type === \"mode_change\")\n if (\n modeBlock &&\n isPlainRecord(modeBlock.content) &&\n (modeBlock.content.to === \"planning\" || modeBlock.content.to === \"executing\")\n ) {\n return modeBlock.content.to\n }\n return null\n}\n\nfunction toSelectionMap(value: unknown): Record<number, number[]> {\n if (!isPlainRecord(value)) return {}\n const entries = Object.entries(value)\n .map(([questionKey, optionIndexes]) => {\n if (!Array.isArray(optionIndexes)) return null\n const parsedIndexes = optionIndexes\n .map((item) => (typeof item === \"number\" ? item : Number(item)))\n .filter((item) => Number.isInteger(item))\n return [Number(questionKey), parsedIndexes] as const\n })\n .filter((entry): entry is readonly [number, number[]] => entry !== null)\n return Object.fromEntries(entries) as Record<number, number[]>\n}\n\nfunction toCustomMap(value: unknown): Record<number, string> {\n if (!isPlainRecord(value)) return {}\n const entries = Object.entries(value)\n .filter(([, text]) => typeof text === \"string\")\n .map(([questionKey, text]) => [Number(questionKey), text] as const)\n return Object.fromEntries(entries) as Record<number, string>\n}\n\nfunction extractAskAnswers(turns: TurnProjection[]): Record<string, AskUserAnswerData> {\n const answers: Record<string, AskUserAnswerData> = {}\n\n for (const turn of turns) {\n for (const block of turn.blocks) {\n if (block.type !== \"ask_user_answer\" || typeof block.tool_call_id !== \"string\") continue\n answers[block.tool_call_id] = {\n selections: toSelectionMap(isPlainRecord(block.content) ? block.content.selections : undefined),\n custom: toCustomMap(isPlainRecord(block.content) ? block.content.custom : undefined),\n }\n }\n }\n\n return answers\n}\n\nfunction registerCreatedSessionState(\n set: (\n partial:\n | Partial<SessionState>\n | ((state: SessionState) => Partial<SessionState> | SessionState),\n ) => void,\n session: SessionInfo,\n mode: SessionMode = DEFAULT_SESSION_MODE,\n options: { fresh?: boolean } = {},\n) {\n const fresh = options.fresh ?? true\n useChatStore.getState().setTurns(session.id, [])\n useTaskStore.getState().setTasks(session.id, [])\n set((state) => ({\n sessions: [session, ...state.sessions.filter((item) => item.id !== session.id)],\n modes: { ...state.modes, [session.id]: state.modes[session.id] ?? mode },\n _freshSessions: fresh\n ? new Set(state._freshSessions).add(session.id)\n : new Set([...state._freshSessions].filter((id) => id !== session.id)),\n }))\n}\n\nasync function revalidateViewerSessions(existingSessions: SessionInfo[]): Promise<SessionInfo[]> {\n const viewerSessions = existingSessions.filter((session) => session.viewer_role === \"viewer\")\n if (viewerSessions.length === 0) {\n return []\n }\n const refreshed = await Promise.all(\n viewerSessions.map(async (session) => {\n try {\n return await sessionsApi.getSession(session.id)\n } catch (error) {\n if (isSessionAccessRevoked(error)) {\n return null\n }\n return session\n }\n }),\n )\n return refreshed.filter((session): session is SessionInfo => session !== null)\n}\n\nexport const useSessionStore = create<SessionState>()((set, get) => ({\n ...createClientActions(set),\n sessions: [],\n activeSessionId: null,\n loading: false,\n modes: {},\n rewindDrafts: {},\n errorMessages: {},\n _freshSessions: new Set(),\n\n fetchAllSessions: async () => {\n set({ loading: true })\n try {\n const currentState = get()\n const [sessions, viewerSessions] = await Promise.all([\n sessionsApi.listSessions(),\n revalidateViewerSessions(currentState.sessions),\n ])\n const knownSessionIds = new Set(sessions.map((session) => session.id))\n const mergedSessions = [\n ...sessions,\n ...viewerSessions.filter((session) => !knownSessionIds.has(session.id)),\n ]\n const removedSessionIds = currentState.sessions\n .filter(\n (session) =>\n session.viewer_role === \"viewer\" &&\n !mergedSessions.some((candidate) => candidate.id === session.id),\n )\n .map((session) => session.id)\n const activeSessionId = currentState.activeSessionId\n\n for (const sessionId of removedSessionIds) {\n removeSessionArtifacts(sessionId)\n }\n\n let nextState: Partial<SessionState> = {\n sessions: mergedSessions,\n activeSessionId: currentState.activeSessionId,\n loading: false,\n modes: currentState.modes,\n rewindDrafts: currentState.rewindDrafts,\n _freshSessions: currentState._freshSessions,\n }\n for (const sessionId of removedSessionIds) {\n nextState = {\n ...nextState,\n ...pruneSessionState(\n {\n ...currentState,\n sessions: nextState.sessions ?? currentState.sessions,\n activeSessionId: nextState.activeSessionId ?? currentState.activeSessionId,\n loading: nextState.loading ?? currentState.loading,\n modes: nextState.modes ?? currentState.modes,\n rewindDrafts: nextState.rewindDrafts ?? currentState.rewindDrafts,\n _freshSessions: nextState._freshSessions ?? currentState._freshSessions,\n },\n sessionId,\n ),\n }\n }\n set(nextState)\n\n if (activeSessionId && removedSessionIds.includes(activeSessionId)) {\n onSessionChange?.(null)\n navigateAwayFromSession(activeSessionId)\n }\n\n invalidateHomeSidebarSessions()\n } catch (error) {\n set({ loading: false })\n throw error\n }\n },\n\n createSession: async (intent) => {\n const { session_id } = await sessionsApi.createSession(intent)\n const now = new Date().toISOString()\n get().registerCreatedSession({\n id: session_id,\n intent: intent ?? \"\",\n status: \"created\" as const,\n created_at: now,\n updated_at: now,\n })\n get().setActiveSession(session_id)\n invalidateHomeSidebarSessions()\n get()\n .fetchAllSessions()\n .catch(() => {})\n return session_id\n },\n\n registerCreatedSession: (session, mode = DEFAULT_SESSION_MODE, options = {}) => {\n registerCreatedSessionState(set, session, mode, options)\n },\n\n upsertSession: (session) => {\n set((state) => ({\n sessions: state.sessions.some((item) => item.id === session.id)\n ? state.sessions.map((item) => (item.id === session.id ? { ...item, ...session } : item))\n : [session, ...state.sessions],\n }))\n },\n\n isFreshSession: (sessionId) => get()._freshSessions.has(sessionId),\n\n setActiveSession: (id) => {\n set({ activeSessionId: id })\n onSessionChange?.(id)\n // 切换 session 时后端可能已经走完了一轮对话但前端没订阅,sessions 列表里的\n // status 还停留在旧值(running/waiting_for_input 混乱)。异步拉一次 detail\n // 合回 sessions 数组,保证 AskUser 卡片的 answered 判定正确。\n sessionsApi\n .getSession(id)\n .then((detail) => {\n set((state) => ({\n sessions: state.sessions.some((s) => s.id === id)\n ? state.sessions.map((s) =>\n s.id === id\n ? { ...s, status: detail.status, updated_at: detail.updated_at }\n : s,\n )\n : [detail, ...state.sessions],\n }))\n })\n .catch(() => {})\n const tasksPromise = sessionsApi.getSessionTasks(id).catch(() => null)\n Promise.all([sessionsApi.getSessionTurns(id), tasksPromise])\n .then(([turns, tasks]) => {\n if (tasks) useTaskStore.getState().setTasks(id, tasks)\n useChatStore.getState().setAskAnswers(id, extractAskAnswers(turns))\n let inferredMode: SessionMode = DEFAULT_SESSION_MODE\n for (const turn of turns) {\n const nextMode = extractModeFromBlocks(turn.blocks)\n if (nextMode) {\n inferredMode = nextMode\n }\n }\n set((state) => {\n if (state.modes[id] == null) {\n return { modes: { ...state.modes, [id]: inferredMode } }\n }\n return state\n })\n\n // Skip overwriting messages for fresh sessions — the optimistic seed is\n // correct and the history response is empty; overwriting would erase any\n // message that was sent between create and this response arriving.\n const isFresh = get()._freshSessions.has(id)\n if (isFresh) {\n set((state) => {\n const next = new Set(state._freshSessions)\n next.delete(id)\n return { _freshSessions: next }\n })\n // Only apply if history is non-empty (e.g. resumed session)\n if (turns.length > 0) {\n useChatStore.getState().setTurns(id, turns)\n }\n } else {\n useChatStore.getState().setTurns(id, turns)\n }\n })\n .catch((error) => {\n if (isSessionAccessRevoked(error)) {\n handleUnreadableSession(set, get, id)\n return\n }\n console.error(\"Failed to load session data\", error)\n })\n },\n\n clearActiveSession: () => {\n set({ activeSessionId: null })\n onSessionChange?.(null)\n },\n\n deleteSession: async (id) => {\n await sessionsApi.deleteSession(id)\n invalidateHomeSidebarSessions()\n const wasActive = get().activeSessionId === id\n await get().fetchAllSessions()\n if (!wasActive) {\n return\n }\n\n const nextId = get().sessions[0]?.id ?? null\n if (nextId) {\n get().setActiveSession(nextId)\n return\n }\n\n get().clearActiveSession()\n },\n\n updateSessionStatus: (sessionId, status) => {\n set((state) => ({\n sessions: state.sessions.map((s) => (s.id === sessionId ? { ...s, status } : s)),\n }))\n // Only reset streaming on terminal statuses to avoid race conditions\n // where a stale status update from a previous run could cancel streaming\n // for a new in-flight run. The primary streaming reset is via chat:end;\n // this serves as a fallback for missed chat:end events.\n if (status === \"failed\" || status === \"interrupted\") {\n useChatStore.getState().setStreaming(sessionId, false)\n if (status === \"interrupted\") {\n useChatStore.getState().markInterrupted(sessionId)\n } else {\n useChatStore.getState().markFailed(sessionId)\n }\n }\n },\n\n updateSessionIntent: (sessionId, intent) => {\n set((state) => ({\n sessions: state.sessions.map((s) => (s.id === sessionId ? { ...s, intent } : s)),\n }))\n },\n\n patchSession: (sessionId, patch) => {\n set((state) => ({\n sessions: state.sessions.map((s) =>\n s.id === sessionId ? { ...s, ...patch } : s,\n ),\n }))\n },\n\n pinSession: async (sessionId, pinned) => {\n const updated = await sessionsApi.pinSession(sessionId, pinned)\n set((state) => ({\n sessions: state.sessions.map((s) =>\n s.id === sessionId\n ? { ...s, is_pinned: updated.is_pinned, pinned_at: updated.pinned_at }\n : s,\n ),\n }))\n invalidateHomeSidebarSessions()\n },\n\n setErrorMessage: (sessionId, message) => {\n set((state) => ({\n errorMessages: { ...state.errorMessages, [sessionId]: message },\n }))\n },\n\n clearErrorMessage: (sessionId) => {\n set((state) => {\n const { [sessionId]: _, ...rest } = state.errorMessages\n return { errorMessages: rest }\n })\n },\n\n setRewindDraft: (sessionId, text) => {\n set((state) => {\n if (text == null) {\n const { [sessionId]: _, ...rest } = state.rewindDrafts\n return { rewindDrafts: rest }\n }\n\n return {\n rewindDrafts: {\n ...state.rewindDrafts,\n [sessionId]: text,\n },\n }\n })\n },\n\n setMode: (sessionId, mode) => {\n set((state) => ({ modes: { ...state.modes, [sessionId]: mode } }))\n },\n\n togglePlanningMode: (sessionId) => {\n const current = get().modes[sessionId] ?? DEFAULT_SESSION_MODE\n const next = current === \"executing\" ? \"planning\" : \"executing\"\n set((state) => ({ modes: { ...state.modes, [sessionId]: next } }))\n },\n\n toggleSharing: async (sessionId) => {\n const session = get().sessions.find((s) => s.id === sessionId)\n if (!session) return\n const newShared = !session.shared\n const result = await sessionsApi.updateSharing(sessionId, newShared)\n set((state) => ({\n sessions: state.sessions.map((s) =>\n s.id === sessionId ? { ...s, shared: result.shared } : s,\n ),\n }))\n },\n\n reset: () => {\n set({\n sessions: [],\n activeSessionId: null,\n loading: false,\n modes: {},\n rewindDrafts: {},\n errorMessages: {},\n _freshSessions: new Set(),\n })\n invalidateHomeSidebarSessions()\n },\n}))\n\n// Wire up lazy accessor to break circular dependency with chat-store\nsetChatStoreSessionAccessor(() => useSessionStore.getState().activeSessionId)\n","import type { SessionsResource } from \"../../client/resources/sessions\"\nimport { apiFetch, getClient } from \"./client\"\nexport type * from \"../../client/resources/sessions\"\n\nexport interface SessionExtraInfo {\n session_id?: string | null\n extra?: Record<string, unknown> | null\n created_at?: string\n updated_at?: string\n}\n\nconst r = (): SessionsResource => getClient().sessions\n\nexport const listSessions = (...args: Parameters<SessionsResource[\"listSessions\"]>) => r().listSessions(...args)\nexport const listSessionsPaginated = (...args: Parameters<SessionsResource[\"listSessionsPaginated\"]>) => r().listSessionsPaginated(...args)\nexport const listSessionsWithSkillData = (...args: Parameters<SessionsResource[\"listSessionsWithSkillData\"]>) => r().listSessionsWithSkillData(...args)\nexport const createSession = (...args: Parameters<SessionsResource[\"createSession\"]>) => r().createSession(...args)\nexport const createSessionWithRequest = (...args: Parameters<SessionsResource[\"createSessionWithRequest\"]>) => r().createSessionWithRequest(...args)\nexport const getSession = (...args: Parameters<SessionsResource[\"getSession\"]>) => r().getSession(...args)\nexport const updateSession = (...args: Parameters<SessionsResource[\"updateSession\"]>) => r().updateSession(...args)\nexport const pinSession = (...args: Parameters<SessionsResource[\"pinSession\"]>) => r().pinSession(...args)\nexport const startReplaySession = (...args: Parameters<SessionsResource[\"startReplaySession\"]>) => r().startReplaySession(...args)\nexport const updateReplaySession = (...args: Parameters<SessionsResource[\"updateReplaySession\"]>) => r().updateReplaySession(...args)\nexport const updateSharing = (...args: Parameters<SessionsResource[\"updateSharing\"]>) => r().updateSharing(...args)\nexport const updateSessionMemory = (...args: Parameters<SessionsResource[\"updateSessionMemory\"]>) => r().updateSessionMemory(...args)\nexport const createShare = (...args: Parameters<SessionsResource[\"createShare\"]>) => r().createShare(...args)\nexport const revokeShare = (...args: Parameters<SessionsResource[\"revokeShare\"]>) => r().revokeShare(...args)\nexport const getSharedSession = (...args: Parameters<SessionsResource[\"getSharedSession\"]>) => r().getSharedSession(...args)\nexport const getSessionTasks = (...args: Parameters<SessionsResource[\"getSessionTasks\"]>) => r().getSessionTasks(...args)\nexport const getSessionTurns = (...args: Parameters<SessionsResource[\"getSessionTurns\"]>) => r().getSessionTurns(...args)\nexport const getSessionContextStats = (...args: Parameters<SessionsResource[\"getSessionContextStats\"]>) => r().getSessionContextStats(...args)\nexport const getSessionHistory = (...args: Parameters<SessionsResource[\"getSessionHistory\"]>) => r().getSessionHistory(...args)\nexport const tokenizePrompt = (...args: Parameters<SessionsResource[\"tokenizePrompt\"]>) => r().tokenizePrompt(...args)\nexport const tokenizeMessages = (...args: Parameters<SessionsResource[\"tokenizeMessages\"]>) => r().tokenizeMessages(...args)\nexport const getSessionCheckpoints = (...args: Parameters<SessionsResource[\"getSessionCheckpoints\"]>) => r().getSessionCheckpoints(...args)\nexport const checkoutSession = (...args: Parameters<SessionsResource[\"checkoutSession\"]>) => r().checkoutSession(...args)\nexport const rewindSession = (...args: Parameters<SessionsResource[\"rewindSession\"]>) => r().rewindSession(...args)\nexport const switchBranch = (...args: Parameters<SessionsResource[\"switchBranch\"]>) => r().switchBranch(...args)\nexport const deleteSession = (...args: Parameters<SessionsResource[\"deleteSession\"]>) => r().deleteSession(...args)\nexport const listBackgroundTasks = (...args: Parameters<SessionsResource[\"listBackgroundTasks\"]>) => r().listBackgroundTasks(...args)\nexport const getBackgroundTask = (...args: Parameters<SessionsResource[\"getBackgroundTask\"]>) => r().getBackgroundTask(...args)\nexport const stopBackgroundTask = (...args: Parameters<SessionsResource[\"stopBackgroundTask\"]>) => r().stopBackgroundTask(...args)\nexport const probeSessionUrl = (...args: Parameters<SessionsResource[\"probeSessionUrl\"]>) => r().probeSessionUrl(...args)\nexport const listDir = (...args: Parameters<SessionsResource[\"listDir\"]>) => r().listDir(...args)\nexport const uploadFiles = (...args: Parameters<SessionsResource[\"uploadFiles\"]>) => r().uploadFiles(...args)\nexport const deleteFile = (...args: Parameters<SessionsResource[\"deleteFile\"]>) => r().deleteFile(...args)\nexport const writeFile = (...args: Parameters<SessionsResource[\"writeFile\"]>) => r().writeFile(...args)\nexport const renameFile = (...args: Parameters<SessionsResource[\"renameFile\"]>) => r().renameFile(...args)\nexport const copyFile = (...args: Parameters<SessionsResource[\"copyFile\"]>) => r().copyFile(...args)\nexport const shareFile = (...args: Parameters<SessionsResource[\"shareFile\"]>) => r().shareFile(...args)\nexport const getDownloadDirUrl = (...args: Parameters<SessionsResource[\"getDownloadDirUrl\"]>) => r().getDownloadDirUrl(...args)\nexport const exportSession = (...args: Parameters<SessionsResource[\"exportSession\"]>) => r().exportSession(...args)\nexport const previewImport = (...args: Parameters<SessionsResource[\"previewImport\"]>) => r().previewImport(...args)\nexport const importSession = (...args: Parameters<SessionsResource[\"importSession\"]>) => r().importSession(...args)\n\nexport function getSessionExtraInfoByTask(taskId: string): Promise<SessionExtraInfo> {\n return apiFetch<SessionExtraInfo>(\n `/api/sessions/extra_info/by_task/${encodeURIComponent(taskId)}`,\n )\n}\n","import { create } from \"zustand\"\nimport type { AskUserAnswerData } from \"../components/chat/AskUserQuestionBlock\"\nimport { formatToolName } from \"../components/chat/display-utils\"\nimport { normalizeMessageContent } from \"../lib/chat\"\nimport type { ChatMessage, CompactionInfo, MessageContent, ToolCallInfo } from \"../schemas/message\"\nimport type { ContentBlock, PatchEnvelope, TurnProjection } from \"../schemas/projection\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\nimport { useUiStore } from \"./ui-store\"\n\nlet _getActiveSessionId: (() => string | null) | null = null\n\nexport function setChatStoreSessionAccessor(fn: () => string | null) {\n _getActiveSessionId = fn\n}\n\nexport interface AgentLoopInfo {\n toolCallId: string\n description: string\n status: \"running\" | \"done\" | \"error\" | \"cancelled\" | \"awaiting_answer\"\n}\n\nexport interface ActiveCompactionState extends CompactionInfo {\n turn_id: string\n status: \"streaming\" | \"completed\" | \"paused\" | \"failed\" | \"interrupted\"\n}\n\ninterface ChatState extends ClientAwareState {\n turns: Record<string, TurnProjection[]>\n messages: Record<string, ChatMessage[]>\n askAnswers: Record<string, Record<string, AskUserAnswerData>>\n isStreaming: Record<string, boolean>\n agentLoops: Record<string, Record<string, AgentLoopInfo>>\n activeCompactions: Record<string, ActiveCompactionState | null>\n\n addUserMessage: (sessionId: string, content: MessageContent) => void\n setTurns: (sessionId: string, turns: TurnProjection[]) => void\n upsertTurn: (sessionId: string, turn: TurnProjection) => void\n applyTurnPatch: (sessionId: string, patch: PatchEnvelope) => void\n addErrorMessage: (sessionId: string, content: string) => void\n markInterrupted: (sessionId: string) => void\n markFailed: (sessionId: string) => void\n setStreaming: (sessionId: string, streaming: boolean) => void\n setAskAnswers: (sessionId: string, answers: Record<string, AskUserAnswerData>) => void\n clearMessages: (sessionId: string) => void\n}\n\nfunction parseAgentDescription(argumentsJson: string): string {\n try {\n return JSON.parse(argumentsJson)?.description ?? \"子智能体\"\n } catch {\n return \"子智能体\"\n }\n}\n\nfunction inferLoopStatusFromMessages(messages: ChatMessage[]): AgentLoopInfo[\"status\"] {\n const toolCalls = messages.flatMap((message) => message.tool_calls ?? [])\n if (messages.some((message) => message.status === \"streaming\")) return \"running\"\n if (toolCalls.some((toolCall) => toolCall.status === \"awaiting_answer\")) return \"awaiting_answer\"\n if (toolCalls.some((toolCall) => toolCall.status === \"error\")) return \"error\"\n if (toolCalls.some((toolCall) => toolCall.status === \"cancelled\")) return \"cancelled\"\n if (toolCalls.some((toolCall) => toolCall.status === \"pending\")) return \"running\"\n return \"done\"\n}\n\nfunction inferLoopStatusFromTurns(turns: TurnProjection[], messages: ChatMessage[]): AgentLoopInfo[\"status\"] {\n const latestAgentNotification = [...turns]\n .reverse()\n .flatMap((turn) => turn.blocks)\n .find((block) => {\n if (block.type !== \"system_notification\" || !isRecord(block.content)) return false\n return block.content.notification_type === \"agent:start\" || block.content.notification_type === \"agent:end\"\n })\n if (\n latestAgentNotification?.type === \"system_notification\" &&\n isRecord(latestAgentNotification.content)\n ) {\n const notificationType = latestAgentNotification.content.notification_type\n const status = latestAgentNotification.content.status\n if (notificationType === \"agent:start\" || status === \"running\") return \"running\"\n if (status === \"error\") return \"error\"\n if (status === \"cancelled\") return \"cancelled\"\n }\n return inferLoopStatusFromMessages(messages)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction parentForkToolCallIdFromTurn(turn: TurnProjection): string | null {\n if (typeof turn.parent_fork_tool_call_id === \"string\" && turn.parent_fork_tool_call_id.length > 0) {\n return turn.parent_fork_tool_call_id\n }\n for (const block of turn.blocks) {\n if (block.type !== \"system_notification\" || !isRecord(block.content)) continue\n const metadata = block.content.metadata\n if (!isRecord(metadata)) continue\n const parentId = metadata.parent_fork_tool_call_id\n if (typeof parentId === \"string\" && parentId.length > 0) return parentId\n }\n return null\n}\n\nfunction buildMessageContent(turn: TurnProjection): MessageContent {\n const textBlocks = turn.blocks.filter((block) => block.type === \"text\")\n if (textBlocks.length === 0) return \"\"\n if (textBlocks.length === 1) return normalizeMessageContent(textBlocks[0].content)\n return textBlocks\n .map((block) => {\n if (typeof block.content === \"string\") return block.content\n return JSON.stringify(block.content)\n })\n .join(\"\")\n}\n\nfunction askUserAnswerContent(turn: TurnProjection): string | null {\n const answerBlock = turn.blocks.find((block) => block.type === \"ask_user_answer\")\n if (!answerBlock || !isRecord(answerBlock.content)) return null\n const answer = answerBlock.content.answer\n return typeof answer === \"string\" && answer.trim().length > 0 ? answer : null\n}\n\nfunction buildReasoning(turn: TurnProjection): string | undefined {\n const thinking = turn.blocks\n .filter((block) => block.type === \"thinking\")\n .map((block) => (typeof block.content === \"string\" ? block.content : JSON.stringify(block.content)))\n .filter(Boolean)\n if (thinking.length === 0) return undefined\n return thinking.join(\"\\n\\n\")\n}\n\nfunction isModeChangeContent(value: unknown): value is { from: string; to: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { from?: unknown }).from === \"string\" &&\n typeof (value as { to?: unknown }).to === \"string\"\n )\n}\n\nfunction extractModeFromBlocks(blocks: ContentBlock[]): \"planning\" | \"executing\" | null {\n const modeBlock = blocks.find((block) => block.type === \"mode_change\")\n if (modeBlock && isModeChangeContent(modeBlock.content)) {\n return modeBlock.content.to === \"planning\" || modeBlock.content.to === \"executing\"\n ? modeBlock.content.to\n : null\n }\n return null\n}\n\nfunction projectionToMessage(turn: TurnProjection): ChatMessage | null {\n if (turn.kind === \"compaction\" && turn.compaction_id) {\n return {\n role: \"assistant\",\n content: turn.summary_preview ?? \"\",\n kind: \"compaction\",\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n compaction: {\n compaction_id: turn.compaction_id,\n summary_preview: turn.summary_preview,\n summary_full: turn.summary_full,\n archived_count: turn.archived_count,\n archived_files: turn.archived_files,\n archived_tool_calls: turn.archived_tool_calls,\n tokens_before: turn.tokens_before,\n tokens_after: turn.tokens_after,\n saved_ratio: turn.saved_ratio,\n trigger: turn.trigger,\n failure_reason: turn.failure_reason,\n fallback_applied: turn.fallback_applied,\n },\n }\n }\n\n const planningBlock = turn.blocks.find(\n (block) =>\n block.type === \"mode_change\" ||\n block.type === \"plan_status\",\n )\n if (planningBlock) {\n if (planningBlock.type === \"plan_status\") {\n return {\n role: \"tool\",\n content:\n typeof planningBlock.content === \"string\"\n ? planningBlock.content\n : JSON.stringify(planningBlock.content ?? {}, null, 2),\n kind: \"plan_status\",\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n }\n }\n return {\n role: \"assistant\",\n content:\n planningBlock.type === \"mode_change\"\n ? typeof planningBlock.content === \"string\"\n ? planningBlock.content\n : JSON.stringify(planningBlock.content ?? {})\n : \"\",\n kind: planningBlock.type,\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n }\n }\n\n const askAnswer = askUserAnswerContent(turn)\n if (askAnswer !== null) {\n return {\n role: \"user\",\n content: askAnswer,\n blocks: turn.blocks,\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n ...(typeof turn.duration_ms === \"number\" ? { duration_ms: turn.duration_ms } : {}),\n ...(turn.started_at ? { timestamp: turn.started_at } : {}),\n }\n }\n\n const content = buildMessageContent(turn)\n const reasoning = buildReasoning(turn)\n const toolCalls: ToolCallInfo[] | undefined =\n turn.tool_calls.length > 0\n ? turn.tool_calls.map((toolCall) => ({\n id: toolCall.id,\n name: toolCall.tool_name,\n display_name: toolCall.display_name,\n arguments: toolCall.arguments,\n result: toolCall.result ?? undefined,\n pending_question_ref: toolCall.pending_question_ref ?? undefined,\n status:\n toolCall.status === \"pending\" ||\n toolCall.status === \"awaiting_answer\" ||\n toolCall.status === \"done\" ||\n toolCall.status === \"error\" ||\n toolCall.status === \"cancelled\"\n ? toolCall.status\n : \"pending\",\n ...(typeof toolCall.duration_ms === \"number\" ? { duration_ms: toolCall.duration_ms } : {}),\n }))\n : undefined\n\n if (turn.role === \"system\" && !content && !toolCalls?.length) {\n return null\n }\n\n return {\n role: turn.role === \"system\" ? \"assistant\" : turn.role,\n content,\n blocks: turn.blocks,\n ...(reasoning ? { reasoning } : {}),\n ...(toolCalls ? { tool_calls: toolCalls } : {}),\n loop_name: turn.loop_id,\n entry_id: turn.turn_id,\n status: turn.status,\n ...(typeof turn.duration_ms === \"number\" ? { duration_ms: turn.duration_ms } : {}),\n ...(turn.started_at ? { timestamp: turn.started_at } : {}),\n ...(turn.memory_refs?.length ? { memory_refs: turn.memory_refs } : {}),\n }\n}\n\nconst messageProjectionCache = new WeakMap<TurnProjection, ChatMessage | null>()\n\nfunction cachedProjectionToMessage(turn: TurnProjection): ChatMessage | null {\n if (messageProjectionCache.has(turn)) {\n return messageProjectionCache.get(turn) ?? null\n }\n const message = projectionToMessage(turn)\n messageProjectionCache.set(turn, message)\n return message\n}\n\nfunction rebuildAgentLoops(\n turns: TurnProjection[],\n messages: ChatMessage[],\n): Record<string, AgentLoopInfo> {\n const childLoopNames = [...new Set(turns.map((turn) => turn.loop_id).filter((name) => name !== \"root\"))]\n if (childLoopNames.length === 0) return {}\n\n const agentToolCalls = messages\n .filter((message) => message.role === \"assistant\" && (message.loop_name ?? \"root\") === \"root\")\n .flatMap((message) => message.tool_calls ?? [])\n .filter((toolCall) => formatToolName(toolCall.name) === \"Agent\")\n\n const loops: Record<string, AgentLoopInfo> = {}\n const agentToolCallsById = new Map(agentToolCalls.map((toolCall) => [toolCall.id, toolCall]))\n const explicitParentToolCallIds = new Set(\n turns.map(parentForkToolCallIdFromTurn).filter((id): id is string => id !== null),\n )\n const usedToolCallIds = new Set<string>()\n for (const loopName of childLoopNames) {\n const loopMessages = messages.filter((message) => (message.loop_name ?? \"root\") === loopName)\n const loopTurns = turns.filter((turn) => turn.loop_id === loopName)\n const parentToolCallId = loopTurns.map(parentForkToolCallIdFromTurn).find(Boolean)\n const explicitToolCall =\n parentToolCallId && !usedToolCallIds.has(parentToolCallId)\n ? (agentToolCallsById.get(parentToolCallId) ?? null)\n : null\n const fallbackToolCall =\n explicitToolCall === null\n ? agentToolCalls.find(\n (toolCall) => !usedToolCallIds.has(toolCall.id) && !explicitParentToolCallIds.has(toolCall.id),\n )\n : null\n const toolCall = explicitToolCall ?? fallbackToolCall\n if (!toolCall) continue\n usedToolCallIds.add(toolCall.id)\n loops[loopName] = {\n toolCallId: toolCall.id,\n description: parseAgentDescription(toolCall.arguments),\n status: inferLoopStatusFromTurns(loopTurns, loopMessages),\n }\n }\n return loops\n}\n\nfunction applyPlanningSideEffects(sessionId: string, turns: TurnProjection[]) {\n const latestMode = [...turns]\n .reverse()\n .map((turn) => extractModeFromBlocks(turn.blocks))\n .find((mode): mode is \"planning\" | \"executing\" => mode !== null)\n if (latestMode !== \"planning\") return\n if (_getActiveSessionId?.() !== sessionId) return\n const ui = useUiStore.getState()\n ui.setActiveRightTab(\"situation\")\n if (ui.rightPanelCollapsed) {\n ui.toggleRightPanel()\n }\n}\n\nfunction materialize(turns: TurnProjection[]) {\n const projectedMessages = turns\n .map(cachedProjectionToMessage)\n .filter((message): message is ChatMessage => message !== null)\n const messages = projectedMessages\n .filter((message, index, allMessages) => {\n if (!message.blocks?.some((block) => block.type === \"ask_user_answer\")) return true\n const next = allMessages[index + 1]\n return !(next?.role === \"user\" && next.content === message.content)\n })\n const activeCompaction = [...turns]\n .reverse()\n .find(\n (turn): turn is TurnProjection =>\n turn.kind === \"compaction\" && turn.status === \"streaming\" && typeof turn.compaction_id === \"string\",\n )\n return {\n messages,\n agentLoops: rebuildAgentLoops(turns, projectedMessages),\n activeCompaction: activeCompaction\n ? {\n turn_id: activeCompaction.turn_id,\n status: activeCompaction.status,\n compaction_id: activeCompaction.compaction_id!,\n summary_preview: activeCompaction.summary_preview,\n summary_full: activeCompaction.summary_full,\n archived_count: activeCompaction.archived_count,\n archived_files: activeCompaction.archived_files,\n archived_tool_calls: activeCompaction.archived_tool_calls,\n tokens_before: activeCompaction.tokens_before,\n tokens_after: activeCompaction.tokens_after,\n saved_ratio: activeCompaction.saved_ratio,\n trigger: activeCompaction.trigger,\n failure_reason: activeCompaction.failure_reason,\n fallback_applied: activeCompaction.fallback_applied,\n }\n : null,\n }\n}\n\nconst ERROR_ANCHOR_PREFIX = \"error-anchor:\"\n\nfunction orderTurns(turns: TurnProjection[]) {\n for (let index = 1; index < turns.length; index += 1) {\n if (turns[index - 1].sequence > turns[index].sequence) {\n return [...turns].sort((left, right) => left.sequence - right.sequence)\n }\n }\n return turns\n}\n\nfunction areAgentLoopsEqual(\n left: Record<string, AgentLoopInfo> | undefined,\n right: Record<string, AgentLoopInfo>,\n) {\n if (!left) return Object.keys(right).length === 0\n const leftEntries = Object.entries(left)\n const rightKeys = Object.keys(right)\n if (leftEntries.length !== rightKeys.length) return false\n return leftEntries.every(([key, value]) => {\n const next = right[key]\n return (\n next !== undefined &&\n value.toolCallId === next.toolCallId &&\n value.description === next.description &&\n value.status === next.status\n )\n })\n}\n\nfunction updateSessionState(state: ChatState, sessionId: string, turns: TurnProjection[]) {\n const orderedTurns = orderTurns(turns)\n const { messages, agentLoops, activeCompaction } = materialize(orderedTurns)\n const stableAgentLoops = areAgentLoopsEqual(state.agentLoops[sessionId], agentLoops)\n ? state.agentLoops[sessionId]\n : agentLoops\n applyPlanningSideEffects(sessionId, orderedTurns)\n // addErrorMessage 注入的 role===\"error\" 不在 turns 里,默认会被 materialize 抹掉。\n // 给每条 error 打上 turn_id 锚点(见 addErrorMessage),只保留锚点命中当前最后一个 turn 的 error:\n // - upsertTurn/applyTurnPatch 推进同一 turn:锚点仍命中 → 错误气泡保留\n // - 用户发新消息(addUserMessage 追加 user turn):最后一个 turn 变化 → 旧错误自动丢弃\n // - session rewind 到更早 checkpoint:锚点的 turn 已不在列表 → 旧错误自动丢弃\n // - 重连/reload 同一 session:最后一个 turn 仍是那个 failed turn → 错误气泡保留\n const lastTurnId = orderedTurns[orderedTurns.length - 1]?.turn_id ?? null\n const preservedErrors = lastTurnId\n ? (state.messages[sessionId] ?? []).filter(\n (m) =>\n m.role === \"error\" &&\n typeof m.entry_id === \"string\" &&\n m.entry_id.startsWith(`${ERROR_ANCHOR_PREFIX}${lastTurnId}:`),\n )\n : []\n const mergedMessages = preservedErrors.length > 0 ? [...messages, ...preservedErrors] : messages\n return {\n turns: { ...state.turns, [sessionId]: orderedTurns },\n messages: { ...state.messages, [sessionId]: mergedMessages },\n agentLoops: { ...state.agentLoops, [sessionId]: stableAgentLoops ?? agentLoops },\n activeCompactions: { ...state.activeCompactions, [sessionId]: activeCompaction },\n }\n}\n\nexport const useChatStore = create<ChatState>()((set) => ({\n ...createClientActions(set),\n turns: {},\n messages: {},\n askAnswers: {},\n isStreaming: {},\n agentLoops: {},\n activeCompactions: {},\n\n addUserMessage: (sessionId, content) => {\n set((state) => {\n const existing = state.turns[sessionId] ?? []\n const turnId = `local-user-${Date.now()}`\n const optimisticTurn: TurnProjection = {\n id: turnId,\n sequence: Math.max(0, ...existing.map((turn) => turn.sequence)) + 1,\n turn_id: turnId,\n loop_id: \"root\",\n role: \"user\",\n status: \"streaming\",\n blocks: [{ type: \"text\", content }],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n return updateSessionState(state, sessionId, [...existing, optimisticTurn])\n })\n },\n\n setTurns: (sessionId, turns) => {\n set((state) => updateSessionState(state, sessionId, [...turns]))\n },\n\n upsertTurn: (sessionId, turn) => {\n set((state) => {\n let existing = [...(state.turns[sessionId] ?? [])]\n if (turn.role === \"user\" && !turn.turn_id.startsWith(\"local-user-\")) {\n existing = existing.filter((t) => !t.turn_id.startsWith(\"local-user-\"))\n }\n const index = existing.findIndex((item) => item.turn_id === turn.turn_id)\n if (index >= 0) {\n existing[index] = turn\n } else {\n existing.push(turn)\n }\n return {\n ...updateSessionState(state, sessionId, existing),\n }\n })\n },\n\n applyTurnPatch: (sessionId, patch) => {\n set((state) => {\n const turn = patch.data.turn\n if (!turn) return state\n\n const existing = [...(state.turns[sessionId] ?? [])]\n const index = existing.findIndex((item) => item.turn_id === turn.turn_id)\n const lastSequence = index >= 0 ? existing[index].sequence : null\n if (lastSequence !== null && patch.sequence <= lastSequence) {\n return state\n }\n\n const nextTurn = {\n ...turn,\n sequence: patch.sequence,\n }\n if (index >= 0) {\n existing[index] = nextTurn\n } else {\n existing.push(nextTurn)\n }\n return {\n ...updateSessionState(state, sessionId, existing),\n }\n })\n },\n\n addErrorMessage: (sessionId, content) => {\n set((state) => {\n const turns = state.turns[sessionId] ?? []\n const anchorTurnId = turns[turns.length - 1]?.turn_id ?? null\n // 用 entry_id 携带 turn_id 锚点,updateSessionState 据此决定错误气泡去留\n const entry_id = anchorTurnId\n ? `${ERROR_ANCHOR_PREFIX}${anchorTurnId}:${Date.now()}`\n : undefined\n return {\n messages: {\n ...state.messages,\n [sessionId]: [\n ...(state.messages[sessionId] ?? []),\n { role: \"error\", content, loop_name: \"root\", entry_id },\n ],\n },\n }\n })\n },\n\n markInterrupted: (sessionId) => {\n set((state) => {\n const turns = (state.turns[sessionId] ?? []).map((turn) => {\n if (turn.status !== \"streaming\") return turn\n return {\n ...turn,\n status: \"interrupted\" as const,\n tool_calls: turn.tool_calls.map((toolCall) =>\n toolCall.status === \"pending\" || toolCall.status === \"awaiting_answer\"\n ? { ...toolCall, status: \"cancelled\" as const }\n : toolCall,\n ),\n }\n })\n return {\n ...updateSessionState(state, sessionId, turns),\n }\n })\n },\n\n markFailed: (sessionId) => {\n set((state) => {\n const turns = (state.turns[sessionId] ?? []).map((turn) => {\n if (turn.status !== \"streaming\") return turn\n return {\n ...turn,\n status: \"failed\" as const,\n tool_calls: turn.tool_calls.map((toolCall) =>\n toolCall.status === \"pending\" || toolCall.status === \"awaiting_answer\"\n ? { ...toolCall, status: \"error\" as const }\n : toolCall,\n ),\n }\n })\n return {\n ...updateSessionState(state, sessionId, turns),\n }\n })\n },\n\n setStreaming: (sessionId, streaming) => {\n set((state) => ({\n isStreaming: { ...state.isStreaming, [sessionId]: streaming },\n }))\n },\n\n setAskAnswers: (sessionId, answers) => {\n set((state) => ({\n askAnswers: {\n ...state.askAnswers,\n [sessionId]: answers,\n },\n }))\n },\n\n clearMessages: (sessionId) => {\n set((state) => {\n const { [sessionId]: _turns, ...restTurns } = state.turns\n const { [sessionId]: _messages, ...restMessages } = state.messages\n const { [sessionId]: _answers, ...restAnswers } = state.askAnswers\n const { [sessionId]: _loops, ...restLoops } = state.agentLoops\n const { [sessionId]: _compaction, ...restCompactions } = state.activeCompactions\n return {\n turns: restTurns,\n messages: restMessages,\n askAnswers: restAnswers,\n agentLoops: restLoops,\n activeCompactions: restCompactions,\n }\n })\n },\n}))\n","import type { ChatMessage, ToolCallInfo } from \"../../schemas/message\"\n\nconst TOOL_NAME_ALIASES: Record<string, string> = {\n agent: \"Agent\",\n ask_user_question: \"AskUserQuestion\",\n bash: \"Bash\",\n bg_bash: \"BgBash\",\n edit: \"Edit\",\n exit_plan_mode: \"ExitPlanMode\",\n file_edit: \"Edit\",\n file_read: \"Read\",\n file_write: \"Write\",\n finish_task: \"FinishTask\",\n glob: \"Glob\",\n grep: \"Grep\",\n ls: \"Ls\",\n read: \"Read\",\n read_skill: \"ReadSkill\",\n web_fetch: \"WebFetch\",\n web_search: \"WebSearch\",\n write: \"Write\",\n}\n\n/** System tool Chinese display labels */\nconst TOOL_DISPLAY_LABELS: Record<string, string> = {\n Bash: \"执行命令\",\n BgBash: \"后台执行命令\",\n Read: \"读取文件\",\n Write: \"写入文件\",\n Edit: \"编辑文件\",\n Ls: \"列出目录\",\n Glob: \"匹配文件\",\n Grep: \"搜索文本\",\n WebSearch: \"搜索网页\",\n WebFetch: \"整理网页内容\",\n Agent: \"派生子智能体\",\n AskUserQuestion: \"向用户提问\",\n ReadSkill: \"读取技能\",\n FinishTask: \"任务完成\",\n ExitPlanMode: \"提交计划\",\n ListSessions: \"列出历史会话\",\n GetSessionHistory: \"读取会话历史\",\n}\n\n/** Summary format: \"动词 + N + 量词\" style, e.g. \"读取 4 个技能\" */\nconst TOOL_SUMMARY_TEMPLATES: Record<string, (n: number) => string> = {\n Bash: (n) => `执行 ${n} 条命令`,\n BgBash: (n) => `启动 ${n} 个后台任务`,\n Read: (n) => `读取 ${n} 个文件`,\n Write: (n) => `写入 ${n} 个文件`,\n Edit: (n) => `编辑 ${n} 个文件`,\n Ls: (n) => `查看 ${n} 个目录`,\n Glob: (n) => `匹配 ${n} 组文件`,\n Grep: (n) => `搜索 ${n} 次文本`,\n WebSearch: (n) => `搜索 ${n} 次网页`,\n WebFetch: (n) => `整理 ${n} 次网页`,\n ReadSkill: (n) => `读取 ${n} 个技能`,\n Agent: (n) => `调用 ${n} 个子智能体`,\n}\n\nconst OUTPUT_TOOL_ICONS: Record<string, string> = {\n Write: \"📄\",\n Edit: \"📝\",\n}\n\nconst PRIORITY_FILE_KEYS = [\n \"file_path\",\n \"output_file\",\n \"output_path\",\n \"path\",\n \"filepath\",\n \"target_file\",\n \"destination\",\n \"filename\",\n]\n\n\nexport type ToolTone = \"emerald\" | \"blue\" | \"amber\" | \"red\"\n\nexport interface ToolSummaryTag {\n key: string\n label: string\n tone: \"emerald\" | \"blue\"\n}\n\nconst INDIVIDUAL_SUMMARY_TOOL_NAMES = new Set([\"Bash\", \"BgBash\"])\n\nfunction safeParseJson(value: string | null | undefined): unknown {\n if (!value) return null\n try {\n return JSON.parse(value)\n } catch {\n return null\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction getStringArgValue(args: Record<string, unknown> | null, key: string): string {\n const value = args?.[key]\n return typeof value === \"string\" ? value.trim() : \"\"\n}\n\nfunction getCommandDescription(args: Record<string, unknown> | null): string {\n return getStringArgValue(args, \"description\")\n}\n\nfunction findFileLikeValue(value: unknown, depth = 0, allowPlainString = false): string | null {\n if (depth > 3) return null\n if (typeof value === \"string\") {\n const trimmed = value.trim()\n if (!trimmed) return null\n if (allowPlainString || trimmed.includes(\"/\") || /\\.[a-z0-9]{1,8}$/i.test(trimmed)) {\n return trimmed\n }\n return null\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n const found = findFileLikeValue(item, depth + 1, allowPlainString)\n if (found) return found\n }\n return null\n }\n if (isPlainObject(value)) {\n for (const key of PRIORITY_FILE_KEYS) {\n const direct = findFileLikeValue(value[key], depth + 1, true)\n if (direct) return direct\n }\n for (const nested of Object.values(value)) {\n const found = findFileLikeValue(nested, depth + 1, allowPlainString)\n if (found) return found\n }\n }\n return null\n}\n\n\n\nfunction formatFileName(filePath: string): string {\n return filePath.split(\"/\").pop() ?? filePath\n}\n\nfunction isInternalStatusFile(filePath: string): boolean {\n const fileName = formatFileName(filePath).toLowerCase()\n return fileName === \"phase.json\"\n}\n\nexport function formatToolName(name: string): string {\n const trimmed = name.trim()\n if (!trimmed) return name\n\n const stripped =\n trimmed.split(\":\").pop()?.split(\"/\").pop()?.split(\".\").pop()?.trim() || trimmed\n const normalized = stripped\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[^a-zA-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase()\n\n return TOOL_NAME_ALIASES[normalized] ?? stripped\n}\n\n/**\n * Returns a context-aware Chinese display label for a tool call.\n * All system tools now have a `description` argument — use it as primary label.\n */\nexport function getToolDisplayLabel(toolCall: ToolCallInfo): string {\n const normalized = formatToolName(toolCall.name)\n const args = safeParseJson(toolCall.arguments) as Record<string, unknown> | null\n const displayName = toolCall.display_name?.trim() ?? \"\"\n const baseLabel = displayName || TOOL_DISPLAY_LABELS[normalized] || normalized\n const metaDisplayName = getStringArgValue(args, \"_meta_display_name\")\n if (metaDisplayName) {\n return metaDisplayName\n }\n\n const description = getCommandDescription(args)\n\n if (normalized === \"BgBash\") {\n return description ? `后台执行:${description}` : \"后台执行命令\"\n }\n if (normalized === \"FinishTask\") {\n const title = args && typeof args.title === \"string\" ? args.title : \"\"\n return title ? `${baseLabel}:${title}` : baseLabel\n }\n\n return description || baseLabel\n}\n\nexport function getToolTone(status?: ToolCallInfo[\"status\"]): ToolTone {\n if (status === \"error\" || status === \"cancelled\") return \"red\"\n if (status === \"awaiting_answer\") return \"amber\"\n if (status === \"pending\") return \"blue\"\n return \"emerald\"\n}\n\nexport function getToolStatusLabel(status?: ToolCallInfo[\"status\"]): string {\n if (status === \"pending\") return \"运行中\"\n if (status === \"awaiting_answer\") return \"等待回答\"\n if (status === \"error\") return \"错误\"\n if (status === \"cancelled\") return \"已取消\"\n return \"完成\"\n}\n\nexport function getAggregateToolTone(toolCalls: ToolCallInfo[]): ToolTone {\n if (\n toolCalls.some((toolCall) => toolCall.status === \"error\" || toolCall.status === \"cancelled\")\n ) {\n return \"red\"\n }\n if (toolCalls.some((toolCall) => toolCall.status === \"awaiting_answer\")) {\n return \"amber\"\n }\n if (toolCalls.some((toolCall) => toolCall.status === \"pending\")) {\n return \"blue\"\n }\n return \"emerald\"\n}\n\nexport function extractToolFilePath(toolCall: ToolCallInfo): string | null {\n const formattedName = formatToolName(toolCall.name)\n const argsValue = safeParseJson(toolCall.arguments)\n let filePath: string | null = null\n\n if (formattedName === \"Read\" || formattedName === \"Write\" || formattedName === \"Edit\") {\n filePath = findFileLikeValue(argsValue)\n }\n\n if (!filePath || isInternalStatusFile(filePath)) return null\n return filePath\n}\n\nexport function getToolOutputTag(toolCall: ToolCallInfo): ToolSummaryTag | null {\n const toolName = formatToolName(toolCall.name)\n const filePath = extractToolFilePath(toolCall)\n const icon = OUTPUT_TOOL_ICONS[toolName]\n\n if (!icon || !filePath) return null\n\n return {\n key: `${toolCall.id}-${filePath}`,\n label: `${icon} ${filePath.split(\"/\").pop() ?? filePath}`,\n tone: \"blue\",\n }\n}\n\nexport function isSuccessfulToolCall(toolCall: ToolCallInfo): boolean {\n if (toolCall.status === \"error\" || toolCall.status === \"cancelled\") return false\n if (toolCall.status === \"awaiting_answer\") return false\n if (toolCall.status === \"pending\") return false\n return toolCall.status === \"done\" || toolCall.result != null || toolCall.status == null\n}\n\nexport function countSuccessfulToolCalls(toolCalls: ToolCallInfo[]): number {\n return toolCalls.filter(isSuccessfulToolCall).length\n}\n\nexport function countPendingToolCalls(toolCalls: ToolCallInfo[]): number {\n return toolCalls.filter(\n (toolCall) => toolCall.status === \"pending\" || toolCall.status === \"awaiting_answer\",\n ).length\n}\n\nexport function formatToolCallCount(count: number): string {\n return `已执行 ${count} 次工具调用`\n}\n\nexport function summarizeToolCalls(toolCalls: ToolCallInfo[]): ToolSummaryTag[] {\n const outputTagMap = new Map<string, ToolSummaryTag>()\n const counts = new Map<string, number>()\n const individualTags: ToolSummaryTag[] = []\n\n for (const toolCall of toolCalls.filter(isSuccessfulToolCall)) {\n const normalized = formatToolName(toolCall.name)\n const args = safeParseJson(toolCall.arguments) as Record<string, unknown> | null\n\n if (normalized === \"Agent\" || normalized === \"FinishTask\") continue\n\n if (INDIVIDUAL_SUMMARY_TOOL_NAMES.has(normalized)) {\n if (normalized === \"Bash\") {\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: getCommandDescription(args) || \"执行命令行操作\",\n tone: \"emerald\",\n })\n continue\n }\n\n if (normalized === \"BgBash\") {\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: getCommandDescription(args) || \"后台执行命令\",\n tone: \"emerald\",\n })\n continue\n }\n }\n\n const outputTag = getToolOutputTag(toolCall)\n if (outputTag) {\n const fileLabel = outputTag.label.replace(/^[^\\s]+\\s+/, \"\")\n const existing = outputTagMap.get(fileLabel)\n if (existing?.label.startsWith(\"📄\")) {\n continue\n }\n outputTagMap.set(fileLabel, {\n ...outputTag,\n key: fileLabel,\n label:\n normalized === \"Write\" ||\n existing?.label.startsWith(\"📝\")\n ? `📄 ${fileLabel}`\n : outputTag.label,\n })\n continue\n }\n\n counts.set(normalized, (counts.get(normalized) ?? 0) + 1)\n }\n\n const aggregatedCountTags: ToolSummaryTag[] = []\n for (const [normalized, count] of counts.entries()) {\n const template = TOOL_SUMMARY_TEMPLATES[normalized]\n const label = template ? template(count) : `${TOOL_DISPLAY_LABELS[normalized] ?? normalized} ×${count}`\n aggregatedCountTags.push({\n key: `${normalized}-${count}`,\n label,\n tone: \"emerald\",\n })\n }\n\n const outputTags = [...outputTagMap.values()].sort((left, right) =>\n left.label.localeCompare(right.label),\n )\n const sortedCountTags = aggregatedCountTags.sort((left, right) =>\n left.label.localeCompare(right.label),\n )\n const merged = [...individualTags, ...outputTags, ...sortedCountTags]\n\n if (merged.length <= 5) return merged\n\n return [\n ...merged.slice(0, 5),\n {\n key: `overflow-${merged.length - 5}`,\n label: `+${merged.length - 5} 更多`,\n tone: \"emerald\",\n },\n ]\n}\n\nfunction getMessageText(message: ChatMessage): string {\n if (typeof message.content === \"string\") return message.content\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n}\n\nexport function hasNaturalLanguageText(message: ChatMessage): boolean {\n return getMessageText(message).trim().length > 0\n}\n\nexport function findAnchorMessageIndex(messages: ChatMessage[]): number {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n if (hasNaturalLanguageText(messages[index])) {\n return index\n }\n }\n return Math.max(messages.length - 1, 0)\n}\n\nexport function getCollapsedTurnSegments(messages: ChatMessage[]): {\n anchorIndex: number\n summaryMessages: ChatMessage[]\n visibleMessages: ChatMessage[]\n} {\n if (messages.length === 0) {\n return { anchorIndex: 0, summaryMessages: [], visibleMessages: [] }\n }\n\n const anchorIndex = findAnchorMessageIndex(messages)\n return {\n anchorIndex,\n summaryMessages: messages.slice(0, anchorIndex),\n visibleMessages: messages.slice(anchorIndex),\n }\n}\n\nexport function getLatestPendingToolName(toolCalls: ToolCallInfo[]): string | null {\n for (let index = toolCalls.length - 1; index >= 0; index -= 1) {\n if (\n toolCalls[index].status === \"pending\" ||\n toolCalls[index].status === \"awaiting_answer\"\n ) {\n return formatToolName(toolCalls[index].name)\n }\n }\n return null\n}\n\nexport function getFinishTaskTitle(toolCalls: ToolCallInfo[]): string | null {\n for (let index = toolCalls.length - 1; index >= 0; index -= 1) {\n if (formatToolName(toolCalls[index].name) !== \"FinishTask\") continue\n const args = safeParseJson(toolCalls[index].arguments)\n if (!isPlainObject(args)) continue\n const title = typeof args.title === \"string\" ? args.title.trim() : \"\"\n if (title) return title\n }\n return null\n}\n\nexport function getTextContentSegments(messages: ChatMessage[]): string[] {\n return messages\n .map((message) => {\n if (typeof message.content === \"string\") return message.content\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n })\n .map((text) => text.trim())\n .filter(Boolean)\n}\n\nexport function getLastTextSegment(messages: ChatMessage[]): string {\n const texts = getTextContentSegments(messages)\n return texts[texts.length - 1] ?? \"\"\n}\n\nexport function countMessageLines(message: ChatMessage): number {\n const text = typeof message.content === \"string\" ? message.content : \"\"\n const reasoningLines = message.reasoning ? message.reasoning.split(\"\\n\").length : 0\n const textLines = text.trim() ? text.trim().split(\"\\n\").length : 0\n const toolLines = message.tool_calls?.length ?? 0\n return reasoningLines + textLines + toolLines\n}\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\ntype ThemeValue = \"light\" | \"dark\" | \"system\"\n\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\"\n\nexport function resolveEffectiveTheme(theme: ThemeValue): \"light\" | \"dark\" {\n if (theme !== \"system\") return theme\n return isBrowser && window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\"\n}\n\nfunction applyTheme(theme: ThemeValue) {\n if (!isBrowser) return\n const effective = resolveEffectiveTheme(theme)\n document.documentElement.setAttribute(\"data-theme\", effective)\n}\n\n// Initialize theme from localStorage before store creation\nconst storedTheme = isBrowser\n ? (localStorage.getItem(\"blade-theme\") as ThemeValue | null) ?? \"light\"\n : \"light\"\napplyTheme(storedTheme)\n\n// Listen for system preference changes\nif (isBrowser) {\n window.matchMedia(\"(prefers-color-scheme: dark)\").addEventListener(\"change\", () => {\n const current = useUiStore?.getState?.()?.theme\n if (current === \"system\") applyTheme(\"system\")\n })\n}\n\nexport interface PreviewTarget {\n type:\n | \"file\"\n | \"markdown\"\n | \"image\"\n | \"url\"\n | \"html\"\n | \"resource-html\"\n | \"resource-uri\"\n | \"diff\"\n | \"pdf\"\n | \"docx\"\n | \"video\"\n | \"audio\"\n | \"download\"\n | \"card\"\n | \"excel\"\n | \"csv\"\n | \"ppt\"\n content: string\n title?: string\n /** Stable identity key for tab deduplication (e.g. file_path). Falls back to title. */\n key?: string\n /** For diff type: the old content before edit */\n oldContent?: string\n /** Optional bridge session binding for resource iframes. */\n bridgeSessionId?: string\n /** Original source file URL when preview content uses a derived representation (e.g. PPT -> PDF). */\n sourceUrl?: string\n /** Changes when an artifact with the same key is updated in place. */\n revision?: number\n}\n\nexport type ActiveRightTab =\n | \"situation\"\n | \"preview\"\n | \"skill-test\"\n | \"vibe-service\"\n | \"vibe-preview\"\n | \"vibe-access\"\n | \"solution-editor\"\n | \"vibe-board\"\n\ninterface UpsertArtifactOptions {\n reveal?: boolean\n activate?: boolean\n}\n\ninterface UiState extends ClientAwareState {\n leftPanelSize: number\n rightPanelSize: number\n leftPanelCollapsed: boolean\n rightPanelCollapsed: boolean\n activeRightTab: ActiveRightTab\n rightTabActivationId: number\n rightPanelAutoJump: boolean\n rightPanelUnreadTabs: string[]\n /** All open artifact tabs */\n artifacts: PreviewTarget[]\n /** Index of the active tab (-1 if none) */\n activeArtifactIndex: number\n previewUnreadArtifactKeys: string[]\n theme: ThemeValue\n\n setLeftPanelSize: (size: number) => void\n setRightPanelSize: (size: number) => void\n setLeftPanelCollapsed: (collapsed: boolean) => void\n setRightPanelCollapsed: (collapsed: boolean) => void\n toggleLeftPanel: () => void\n toggleRightPanel: () => void\n setActiveRightTab: (tab: ActiveRightTab) => void\n setRightPanelAutoJump: (enabled: boolean) => void\n markRightPanelTabUnread: (tab: string) => void\n clearRightPanelTabUnread: (tab: string) => void\n markPreviewArtifactUnread: (key: string) => void\n clearPreviewArtifactUnread: (key: string) => void\n activateLatestUnreadArtifact: () => void\n /** Add or update an artifact tab (matched by key/title). Opens the panel automatically. */\n pushArtifact: (target: PreviewTarget) => void\n /** Add or update an artifact tab with optional reveal/activate control. */\n upsertArtifact: (target: PreviewTarget, options?: UpsertArtifactOptions) => void\n /** Switch to a tab by index */\n setActiveArtifact: (index: number) => void\n /** Close a tab by index */\n closeArtifact: (index: number) => void\n /** Close a tab by stable key if it exists. */\n removeArtifactByKey: (key: string) => void\n /** Close all tabs and collapse panel */\n clearArtifacts: () => void\n /** Legacy single-target setter for backwards compat */\n setPreviewTarget: (target: PreviewTarget | null) => void\n setTheme: (theme: ThemeValue) => void\n}\n\nfunction removeArtifactAtIndex(state: UiState, index: number) {\n const removed = state.artifacts[index]\n const removedKey = removed ? getPreviewTargetKey(removed) : null\n const next = state.artifacts.filter((_: PreviewTarget, i: number) => i !== index)\n let nextActive = state.activeArtifactIndex\n\n if (next.length === 0) {\n return {\n artifacts: [],\n activeArtifactIndex: -1,\n previewUnreadArtifactKeys: [],\n rightPanelUnreadTabs: state.rightPanelUnreadTabs.filter((tab) => tab !== \"files\"),\n rightPanelCollapsed: true,\n }\n }\n\n if (index < nextActive) {\n nextActive -= 1\n } else if (index === nextActive) {\n nextActive = Math.min(index, next.length - 1)\n }\n\n const previewUnreadArtifactKeys = removedKey\n ? state.previewUnreadArtifactKeys.filter((key) => key !== removedKey)\n : state.previewUnreadArtifactKeys\n\n return {\n artifacts: next,\n activeArtifactIndex: nextActive,\n previewUnreadArtifactKeys,\n rightPanelUnreadTabs: previewUnreadArtifactKeys.length === 0\n ? state.rightPanelUnreadTabs.filter((tab) => tab !== \"files\")\n : state.rightPanelUnreadTabs,\n }\n}\n\nfunction getPreviewTargetKey(target: PreviewTarget) {\n return target.key ?? target.title ?? target.type\n}\n\nfunction addUnique(values: string[], value: string) {\n return values.includes(value) ? values : [...values, value]\n}\n\nfunction upsertArtifactState(state: UiState, target: PreviewTarget, options?: UpsertArtifactOptions) {\n const reveal = options?.reveal ?? true\n const activate = options?.activate ?? true\n const targetKey = target.key ?? target.title\n const applyUiState = (partial: {\n artifacts: PreviewTarget[]\n activeArtifactIndex?: number\n }) => ({\n ...partial,\n ...(reveal\n ? {\n rightPanelCollapsed: false,\n activeRightTab: \"preview\" as const,\n rightTabActivationId: state.rightTabActivationId + 1,\n }\n : {}),\n })\n\n const existing = state.artifacts.findIndex((artifact) => targetKey && (artifact.key ?? artifact.title) === targetKey)\n if (existing >= 0) {\n const updated = [...state.artifacts]\n updated[existing] = target\n return applyUiState({\n artifacts: updated,\n activeArtifactIndex: activate ? existing : state.activeArtifactIndex,\n })\n }\n\n const next = [...state.artifacts, target]\n return applyUiState({\n artifacts: next,\n activeArtifactIndex: activate ? next.length - 1 : state.activeArtifactIndex >= 0 ? state.activeArtifactIndex : 0,\n })\n}\n\nexport const useUiStore = create<UiState>()((set) => ({\n ...createClientActions(set),\n leftPanelSize: 20,\n rightPanelSize: 25,\n leftPanelCollapsed: false,\n rightPanelCollapsed: false,\n activeRightTab: \"situation\",\n rightTabActivationId: 0,\n rightPanelAutoJump: true,\n rightPanelUnreadTabs: [],\n artifacts: [],\n activeArtifactIndex: -1,\n previewUnreadArtifactKeys: [],\n theme: storedTheme,\n\n setLeftPanelSize: (size) => set({ leftPanelSize: size }),\n setRightPanelSize: (size) => set({ rightPanelSize: size }),\n setLeftPanelCollapsed: (collapsed) => set({ leftPanelCollapsed: collapsed }),\n setRightPanelCollapsed: (collapsed) => set({ rightPanelCollapsed: collapsed }),\n toggleLeftPanel: () => set((s) => ({ leftPanelCollapsed: !s.leftPanelCollapsed })),\n toggleRightPanel: () => set((s) => ({ rightPanelCollapsed: !s.rightPanelCollapsed })),\n setActiveRightTab: (tab) =>\n set((state) => ({\n activeRightTab: tab,\n rightTabActivationId: state.rightTabActivationId + 1,\n })),\n setRightPanelAutoJump: (enabled) => set({ rightPanelAutoJump: enabled }),\n markRightPanelTabUnread: (tab) =>\n set((state) => ({ rightPanelUnreadTabs: addUnique(state.rightPanelUnreadTabs, tab) })),\n clearRightPanelTabUnread: (tab) =>\n set((state) => ({\n rightPanelUnreadTabs: state.rightPanelUnreadTabs.filter((item) => item !== tab),\n })),\n markPreviewArtifactUnread: (key) =>\n set((state) => ({\n previewUnreadArtifactKeys: addUnique(state.previewUnreadArtifactKeys, key),\n })),\n clearPreviewArtifactUnread: (key) =>\n set((state) => {\n const previewUnreadArtifactKeys = state.previewUnreadArtifactKeys.filter((item) => item !== key)\n return {\n previewUnreadArtifactKeys,\n rightPanelUnreadTabs: previewUnreadArtifactKeys.length === 0\n ? state.rightPanelUnreadTabs.filter((tab) => tab !== \"files\")\n : state.rightPanelUnreadTabs,\n }\n }),\n activateLatestUnreadArtifact: () =>\n set((state) => {\n for (let index = state.artifacts.length - 1; index >= 0; index -= 1) {\n const key = getPreviewTargetKey(state.artifacts[index])\n if (state.previewUnreadArtifactKeys.includes(key)) {\n const previewUnreadArtifactKeys = state.previewUnreadArtifactKeys.filter((item) => item !== key)\n return {\n activeArtifactIndex: index,\n previewUnreadArtifactKeys,\n rightPanelUnreadTabs: previewUnreadArtifactKeys.length === 0\n ? state.rightPanelUnreadTabs.filter((tab) => tab !== \"files\")\n : state.rightPanelUnreadTabs,\n }\n }\n }\n return state\n }),\n\n pushArtifact: (target) => set((state) => upsertArtifactState(state, target)),\n\n upsertArtifact: (target, options) => set((state) => upsertArtifactState(state, target, options)),\n\n setActiveArtifact: (index) =>\n set((state) => {\n const artifact = state.artifacts[index]\n const key = artifact ? getPreviewTargetKey(artifact) : null\n if (!key) return { activeArtifactIndex: index }\n const previewUnreadArtifactKeys = state.previewUnreadArtifactKeys.filter((item) => item !== key)\n return {\n activeArtifactIndex: index,\n previewUnreadArtifactKeys,\n rightPanelUnreadTabs: previewUnreadArtifactKeys.length === 0\n ? state.rightPanelUnreadTabs.filter((tab) => tab !== \"files\")\n : state.rightPanelUnreadTabs,\n }\n }),\n\n closeArtifact: (index) => set((state) => removeArtifactAtIndex(state, index)),\n\n removeArtifactByKey: (key) =>\n set((state) => {\n const index = state.artifacts.findIndex((artifact) => (artifact.key ?? artifact.title) === key)\n if (index < 0) return state\n return removeArtifactAtIndex(state, index)\n }),\n\n clearArtifacts: () =>\n set((state) => ({\n artifacts: [],\n activeArtifactIndex: -1,\n previewUnreadArtifactKeys: [],\n rightPanelUnreadTabs: state.rightPanelUnreadTabs.filter((tab) => tab !== \"files\"),\n })),\n\n setPreviewTarget: (target: PreviewTarget | null) =>\n set((state) => {\n if (target === null) {\n return { artifacts: [], activeArtifactIndex: -1 }\n }\n // Push as single artifact\n return {\n artifacts: [target],\n activeArtifactIndex: 0,\n rightPanelCollapsed: false,\n activeRightTab: \"preview\",\n rightTabActivationId: state.rightTabActivationId + 1,\n }\n }),\n\n setTheme: (theme: ThemeValue) => {\n localStorage.setItem(\"blade-theme\", theme)\n applyTheme(theme)\n set({ theme })\n },\n}))\n","import { create } from \"zustand\"\nimport type { Task } from \"../schemas/task\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nconst EMPTY_TASKS: Task[] = []\n\ninterface TaskState extends ClientAwareState {\n tasks: Record<string, Task[]>\n setTasks: (sessionId: string, tasks: Task[]) => void\n getTasks: (sessionId: string) => Task[]\n}\n\nexport const useTaskStore = create<TaskState>()((set, get) => ({\n ...createClientActions(set),\n tasks: {},\n\n setTasks: (sessionId, tasks) => {\n set((state) => ({\n tasks: { ...state.tasks, [sessionId]: tasks },\n }))\n },\n\n getTasks: (sessionId) => {\n return get().tasks[sessionId] ?? EMPTY_TASKS\n },\n}))\n","import { create } from \"zustand\"\nimport type { BackgroundTask } from \"../schemas/background\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\ninterface BackgroundState extends ClientAwareState {\n tasks: Record<string, BackgroundTask[]>\n selectedTaskId: Record<string, string | null>\n dismissedTaskIds: Record<string, string[]>\n setTasks: (sessionId: string, tasks: BackgroundTask[]) => void\n upsertTask: (sessionId: string, task: BackgroundTask) => void\n selectTask: (sessionId: string, taskId: string | null) => void\n dismissTask: (sessionId: string, taskId: string) => void\n}\n\nexport const useBackgroundStore = create<BackgroundState>()((set) => ({\n ...createClientActions(set),\n tasks: {},\n selectedTaskId: {},\n dismissedTaskIds: {},\n\n setTasks: (sessionId, tasks) =>\n set((state) => ({\n tasks: { ...state.tasks, [sessionId]: tasks },\n selectedTaskId: {\n ...state.selectedTaskId,\n [sessionId]: state.selectedTaskId[sessionId] ?? tasks[0]?.id ?? null,\n },\n })),\n\n upsertTask: (sessionId, task) =>\n set((state) => {\n const existing = state.tasks[sessionId] ?? []\n const index = existing.findIndex((item) => item.id === task.id)\n const next = [...existing]\n if (index >= 0) {\n next[index] = { ...next[index], ...task }\n } else {\n next.unshift(task)\n }\n return {\n tasks: { ...state.tasks, [sessionId]: next },\n selectedTaskId: {\n ...state.selectedTaskId,\n [sessionId]: state.selectedTaskId[sessionId] ?? task.id,\n },\n }\n }),\n\n selectTask: (sessionId, taskId) =>\n set((state) => ({\n selectedTaskId: { ...state.selectedTaskId, [sessionId]: taskId },\n })),\n\n dismissTask: (sessionId, taskId) =>\n set((state) => {\n const existing = state.dismissedTaskIds[sessionId] ?? []\n if (existing.includes(taskId)) return state\n return {\n dismissedTaskIds: { ...state.dismissedTaskIds, [sessionId]: [...existing, taskId] },\n }\n }),\n}))\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport type ConnectionStatus = \"connecting\" | \"connected\" | \"disconnected\"\n\nexport interface ConnectionState extends ClientAwareState {\n status: ConnectionStatus\n reconnectAttempt: number\n lastConnectedAt: number | null\n lastDisconnectedAt: number | null\n hasEverConnected: boolean\n markConnecting: (attempt?: number) => void\n markConnected: () => void\n markDisconnected: () => void\n reset: () => void\n}\n\nconst initialConnectionState = {\n status: \"disconnected\" as ConnectionStatus,\n reconnectAttempt: 0,\n lastConnectedAt: null,\n lastDisconnectedAt: null,\n hasEverConnected: false,\n}\n\nexport const useConnectionStore = create<ConnectionState>()((set) => ({\n ...createClientActions(set),\n ...initialConnectionState,\n\n markConnecting: (attempt = 0) =>\n set({\n status: \"connecting\",\n reconnectAttempt: attempt,\n }),\n\n markConnected: () =>\n set({\n status: \"connected\",\n reconnectAttempt: 0,\n lastConnectedAt: Date.now(),\n hasEverConnected: true,\n }),\n\n markDisconnected: () =>\n set({\n status: \"disconnected\",\n reconnectAttempt: 0,\n lastDisconnectedAt: Date.now(),\n }),\n\n reset: () => set(initialConnectionState),\n}))\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport interface RuntimeEvent {\n id: string\n sessionId: string\n type: string\n title: string\n status: \"info\" | \"running\" | \"done\" | \"error\"\n timestamp: string\n loopName?: string\n detail?: string\n}\n\ninterface RuntimeState extends ClientAwareState {\n events: Record<string, RuntimeEvent[]>\n addEvent: (sessionId: string, event: Omit<RuntimeEvent, \"id\" | \"sessionId\" | \"timestamp\">) => void\n clearSession: (sessionId: string) => void\n}\n\nexport const useRuntimeStore = create<RuntimeState>()((set) => ({\n ...createClientActions(set),\n events: {},\n\n addEvent: (sessionId, event) =>\n set((state) => {\n const current = state.events[sessionId] ?? []\n const nextEvent: RuntimeEvent = {\n ...event,\n id: `${Date.now()}-${current.length}`,\n sessionId,\n timestamp: new Date().toISOString(),\n }\n return {\n events: {\n ...state.events,\n [sessionId]: [...current.slice(-59), nextEvent],\n },\n }\n }),\n\n clearSession: (sessionId) =>\n set((state) => ({\n events: { ...state.events, [sessionId]: [] },\n })),\n}))\n","import { create } from \"zustand\"\nimport type { GisGoal, GisMapCommand, GisResource, GisTarget } from \"../schemas/gis\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nconst EMPTY_GOALS: GisGoal[] = []\nconst EMPTY_RESOURCES: GisResource[] = []\nconst EMPTY_TARGETS: GisTarget[] = []\nconst EMPTY_COMMANDS: GisMapCommand[] = []\n\ninterface GisStateStore extends ClientAwareState {\n goalsBySession: Record<string, GisGoal[]>\n resourcesBySession: Record<string, GisResource[]>\n targetsBySession: Record<string, GisTarget[]>\n pendingMapCommandsBySession: Record<string, GisMapCommand[]>\n setGoals: (sessionId: string, goals: GisGoal[]) => void\n setResources: (sessionId: string, resources: GisResource[]) => void\n setTargets: (sessionId: string, targets: GisTarget[]) => void\n pushMapCommand: (\n sessionId: string,\n command: Omit<GisMapCommand, \"id\" | \"createdAt\">,\n ) => void\n consumeMapCommand: (sessionId: string, commandId: string) => void\n getGoals: (sessionId: string) => GisGoal[]\n getResources: (sessionId: string) => GisResource[]\n getTargets: (sessionId: string) => GisTarget[]\n getPendingMapCommands: (sessionId: string) => GisMapCommand[]\n}\n\nfunction newCommandId() {\n if (typeof globalThis !== \"undefined\" && \"crypto\" in globalThis) {\n return globalThis.crypto?.randomUUID?.() ?? `gis-map-${Date.now()}-${Math.random()}`\n }\n return `gis-map-${Date.now()}-${Math.random()}`\n}\n\nexport const useGisStore = create<GisStateStore>()((set, get) => ({\n ...createClientActions(set),\n goalsBySession: {},\n resourcesBySession: {},\n targetsBySession: {},\n pendingMapCommandsBySession: {},\n\n setGoals: (sessionId, goals) => {\n set((state) => ({\n goalsBySession: { ...state.goalsBySession, [sessionId]: goals },\n }))\n },\n\n setResources: (sessionId, resources) => {\n set((state) => ({\n resourcesBySession: { ...state.resourcesBySession, [sessionId]: resources },\n }))\n },\n\n setTargets: (sessionId, targets) => {\n set((state) => ({\n targetsBySession: { ...state.targetsBySession, [sessionId]: targets },\n }))\n },\n\n pushMapCommand: (sessionId, command) => {\n set((state) => ({\n pendingMapCommandsBySession: {\n ...state.pendingMapCommandsBySession,\n [sessionId]: [\n ...(state.pendingMapCommandsBySession[sessionId] ?? EMPTY_COMMANDS),\n {\n ...command,\n id: newCommandId(),\n createdAt: Date.now(),\n },\n ],\n },\n }))\n },\n\n consumeMapCommand: (sessionId, commandId) => {\n set((state) => ({\n pendingMapCommandsBySession: {\n ...state.pendingMapCommandsBySession,\n [sessionId]: (state.pendingMapCommandsBySession[sessionId] ?? EMPTY_COMMANDS).filter(\n (command) => command.id !== commandId,\n ),\n },\n }))\n },\n\n getGoals: (sessionId) => get().goalsBySession[sessionId] ?? EMPTY_GOALS,\n getResources: (sessionId) => get().resourcesBySession[sessionId] ?? EMPTY_RESOURCES,\n getTargets: (sessionId) => get().targetsBySession[sessionId] ?? EMPTY_TARGETS,\n getPendingMapCommands: (sessionId) =>\n get().pendingMapCommandsBySession[sessionId] ?? EMPTY_COMMANDS,\n}))\n","import type { BladeClient } from \"../../client\"\nimport { contentPreview, getTextContent } from \"../lib/chat\"\nimport { trackEvent } from \"../lib/analytics\"\nimport { dispatchBladeBridge, postToParent } from \"../lib/parent-bridge\"\nimport { buildToolPreviewKey } from \"../lib/tool-preview\"\nimport { isUiMeta } from \"../lib/ui-meta\"\nimport { ClientProjectionBuilder, type RawEvent } from \"../projection\"\nimport type { MessageContent, ToolBridgeContent } from \"../schemas/message\"\nimport type { ContentBlock, PatchEnvelope, TurnProjection } from \"../schemas/projection\"\nimport type { SessionStatus } from \"../schemas/session\"\nimport { useAuthStore } from \"../stores/auth-store\"\nimport { useBackgroundStore } from \"../stores/background-store\"\nimport { useCardStateStore } from \"../stores/card-state-store\"\nimport { useChatStore } from \"../stores/chat-store\"\nimport { useConnectionStore } from \"../stores/connection-store\"\nimport { useRuntimeStore } from \"../stores/runtime-store\"\nimport {\n invalidateHomeSidebarSessions,\n setOnSessionChange,\n useSessionStore,\n} from \"../stores/session-store\"\nimport { useGisStore } from \"../stores/gis-store\"\nimport { useTaskStore } from \"../stores/task-store\"\nimport { useUiBridgeStore } from \"../stores/ui-bridge-store\"\nimport { type PreviewTarget, useUiStore } from \"../stores/ui-store\"\nimport { agentSocket, setAgentSocket } from \"./socket-state\"\n\ntype QueryClientLike = {\n invalidateQueries: (\n options:\n | { queryKey: readonly unknown[] }\n | { predicate: (query: { queryKey: readonly unknown[] }) => boolean },\n ) => Promise<unknown>\n}\n\ntype WorkspaceFilesChangedEvent = {\n sessionId: string\n filePath?: string\n}\n\ntype SystemNotification = {\n notification_type?: string\n title?: string\n detail?: string | null\n status?: \"info\" | \"running\" | \"done\" | \"error\" | string\n metadata?: Record<string, unknown>\n}\n\ntype ArtifactEvent = {\n file_path: string\n content_type: string\n title: string\n content: string\n old_string?: string\n new_string?: string\n session_id?: string\n}\n\ntype BackgroundTaskEvent = {\n id?: string\n task_id?: string\n command?: string\n description?: string\n status?: string\n exit_code?: number | null\n elapsed_seconds?: number\n output_lines_count?: number\n output_preview?: string[]\n}\n\ntype BackgroundCompletedEvent = {\n task_ids?: string[]\n count?: number\n tasks?: BackgroundTaskEvent[]\n session_id?: string\n}\n\ntype SessionPatchEnvelope = PatchEnvelope & { session_id?: string }\n\ntype AgentBoardBoardTaskChangedEvent = {\n // biome-ignore lint/suspicious/noExplicitAny: app code validates project-specific payloads.\n [key: string]: any\n}\n\ntype AgentBoardFileOpEvent = {\n project_id: number\n session_id: string\n tool_call_id?: string | null\n action: string\n file_path: string\n description?: string | null\n content_preview?: string | null\n final_content?: string | null\n content_delta?: boolean | null\n is_final?: boolean | null\n created_at: string\n}\n\nconst OOM_MESSAGE = \"沙盒内存使用超出限制,已自动重启。如果经常触发,可以联系管理员调整额度。\"\n\nfunction extractSkillIdForAnalytics(message: MessageContent): string | undefined {\n const text = getTextContent(message)\n const tagMatch = text.match(/<skill>([^<]+)<\\/skill>/)\n if (tagMatch?.[1]?.trim()) {\n return tagMatch[1].trim()\n }\n\n const slashCommandMatch = text.match(/^请使用\\s+(.+?)\\s+skill\\s+完成任务(?:\\n|$)/)\n if (slashCommandMatch?.[1]?.trim()) {\n return slashCommandMatch[1].trim()\n }\n\n return undefined\n}\n\nfunction invalidateSessionCheckpoints(sessionId: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"checkpoints\", sessionId] })\n}\n\nfunction invalidateFileTree(sessionId: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"file-tree\", sessionId] })\n}\n\n\nfunction invalidateSkillStats(sessionId: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"skill-stats\", sessionId] })\n}\n\nfunction invalidateSessionSkills(sessionId: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"session-skills\", sessionId] })\n}\n\n/**\n * ship-attack v2:首次 skill 绑定后,`GET /api/sessions/:id` 返回的\n * `primary_skill_snapshot` 从 null 变为 skill 配置快照。useSessionSkillMeta\n * 依赖这份 detail 驱动 StageStepBar / useStepManifestView / 并行控件等;\n * 仅 patch sessions 列表(名字)而不失效 detail 缓存,前端会看到改名但\n * 阶段栏/骨架直到下一次 refetch 才出现。此 helper 触发 detail 重新获取。\n */\nfunction invalidateSessionDetail(sessionId: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"session-detail\", sessionId] })\n}\n\nfunction invalidateContextStats(sessionId: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n void queryClient.invalidateQueries({ queryKey: [\"context-stats\", sessionId] })\n}\n\nlet onWorkspaceFilesChanged: ((event: WorkspaceFilesChangedEvent) => void) | null = null\n\nexport function setOnWorkspaceFilesChanged(\n fn: ((event: WorkspaceFilesChangedEvent) => void) | null,\n) {\n onWorkspaceFilesChanged = fn\n}\n\nfunction invalidateSessionFiles(sessionId: string, filePath?: string) {\n const queryClient = (globalThis as { __agentQueryClient?: QueryClientLike }).__agentQueryClient\n if (!queryClient) return\n // 单个文件已知就精确 invalidate;否则 predicate 匹配该 session 下所有 session-file\n // 查询,覆盖 ExplanationContent / FilePreviewDialog / QuoteButton 等共享同一 cache 的场景。\n if (filePath) {\n void queryClient.invalidateQueries({ queryKey: [\"session-file\", sessionId, filePath] })\n void queryClient.invalidateQueries({ queryKey: [\"session-image\", sessionId, filePath] })\n return\n }\n void queryClient.invalidateQueries({\n predicate: (query) => {\n const [root, sid] = query.queryKey as unknown[]\n return (\n (root === \"session-file\" || root === \"session-image\") &&\n sid === sessionId\n )\n },\n })\n}\n\nfunction notifyWorkspaceFilesChanged(sessionId: string, filePath?: string) {\n invalidateFileTree(sessionId)\n invalidateSessionFiles(sessionId, filePath)\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent<WorkspaceFilesChangedEvent>(\"blade:workspace-files-changed\", {\n detail: { sessionId, filePath },\n }),\n )\n }\n onWorkspaceFilesChanged?.({ sessionId, filePath })\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction extractModeFromBlocks(blocks: ContentBlock[]): string | null {\n const modeBlock = blocks.find((block) => block.type === \"mode_change\")\n if (modeBlock && isRecord(modeBlock.content) && typeof modeBlock.content.to === \"string\") {\n return modeBlock.content.to\n }\n return null\n}\n\nfunction parseJsonRecord(value: unknown): Record<string, unknown> | null {\n if (isRecord(value)) return value\n if (typeof value !== \"string\") return null\n try {\n const parsed = JSON.parse(value)\n return isRecord(parsed) ? parsed : null\n } catch {\n return null\n }\n}\n\n// ASCII keywords use \\b; the Chinese keyword 退出码 cannot rely on \\b (CJK\n// chars are non-word in the JS regex engine), so 137 is anchored with (?!\\d)\n// on both ends to avoid false positives on numbers like 1370.\nconst OOM_KEYWORDS_RE = /(?:\\b(?:exit_code|ExitedWith|exited with)|退出码)\\D*(?<!\\d)137(?!\\d)/i\n\nfunction isOomText(value: unknown): boolean {\n return typeof value === \"string\" && OOM_KEYWORDS_RE.test(value)\n}\n\nfunction isOomResult(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.some((part) => isOomResult(part))\n }\n if (typeof value === \"object\" && value !== null) {\n const record = value as Record<string, unknown>\n if (record.exit_code === 137) return true\n if (typeof record.text === \"string\" && isOomText(record.text)) return true\n if (typeof record.content === \"string\" && isOomText(record.content)) return true\n return false\n }\n if (typeof value === \"string\") {\n const parsed = parseJsonRecord(value)\n if (parsed?.exit_code === 137) return true\n return isOomText(value)\n }\n return false\n}\n\nfunction hasAuthenticatedSession(client: BladeClient) {\n if (hasTokenValue(resolveClientToken(client))) return true\n const { token, socketAuthToken, user } = useAuthStore.getState()\n return Boolean(hasTokenValue(token) || hasTokenValue(socketAuthToken) || user)\n}\n\nfunction resolveClientToken(client: BladeClient): string | null | undefined {\n const token = client.options.token\n return typeof token === \"function\" ? token() : token\n}\n\nfunction hasTokenValue(token: string | null | undefined): boolean {\n return typeof token === \"string\" && token.trim() !== \"\"\n}\n\nfunction resolveArtifactType(contentType: string): PreviewTarget[\"type\"] {\n const normalized = contentType.trim().toLowerCase()\n if (\n normalized === \"markdown\" ||\n normalized === \"md\" ||\n normalized === \"text/markdown\" ||\n normalized === \"text/x-markdown\"\n ) {\n return \"markdown\"\n }\n if (normalized === \"html\" || normalized === \"text/html\") {\n return \"html\"\n }\n if (normalized === \"url\" || normalized === \"text/uri-list\") {\n return \"url\"\n }\n if (normalized === \"pdf\" || normalized === \"application/pdf\") {\n return \"pdf\"\n }\n if (\n normalized === \"docx\" ||\n normalized === \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n ) {\n return \"docx\"\n }\n if (\n normalized === \"excel\" ||\n normalized === \"xlsx\" ||\n normalized === \"xls\" ||\n normalized === \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" ||\n normalized === \"application/vnd.ms-excel\"\n ) {\n return \"excel\"\n }\n if (\n normalized === \"pptx\" ||\n normalized === \"ppt\" ||\n normalized === \"application/vnd.openxmlformats-officedocument.presentationml.presentation\" ||\n normalized === \"application/vnd.ms-powerpoint\" ||\n normalized === \"application/vnd.ms-powerpoint.presentation.macroenabled.12\"\n ) {\n return \"ppt\"\n }\n if (normalized === \"csv\" || normalized === \"text/csv\") {\n return \"csv\"\n }\n if (normalized === \"image\" || normalized.startsWith(\"image/\")) {\n return \"image\"\n }\n return \"file\"\n}\n\nfunction buildToolPreviewSignature(content: string, type: PreviewTarget[\"type\"]) {\n return `${type}:${content}`\n}\n\nfunction isToolBridgeContent(value: unknown): value is ToolBridgeContent {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n typeof (value as { action?: unknown }).action === \"string\"\n )\n}\n\nfunction isGisGoalListPayload(value: unknown): value is { goals: unknown[] } {\n return isRecord(value) && Array.isArray(value.goals)\n}\n\nfunction isGisResourceListPayload(value: unknown): value is { resources: unknown[] } {\n return isRecord(value) && Array.isArray(value.resources)\n}\n\nfunction sessionStatusFromChatEnd(\n status: string | undefined,\n): SessionStatus {\n if (status === \"paused\") return \"waiting_for_input\"\n if (status === \"interrupted\") return \"interrupted\"\n if (status === \"failed\") return \"failed\"\n return \"completed\"\n}\n\nfunction extractTerminalChatEndStatus(events: RawEvent[]): string | null {\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i]\n if (event?.type !== \"chat:end\") continue\n const status = event.payload?.status\n return typeof status === \"string\" ? status : \"completed\"\n }\n return null\n}\n\nfunction isGisTargetListPayload(value: unknown): value is { targets: unknown[] } {\n return isRecord(value) && Array.isArray(value.targets)\n}\n\nfunction buildToolBridgeDeliveryKey(sessionId: string, turn: TurnProjection, block: ContentBlock) {\n const content = isToolBridgeContent(block.content) ? block.content : null\n const action = content?.action ?? \"\"\n let payloadKey = \"\"\n try {\n payloadKey = JSON.stringify(content?.payload ?? null)\n } catch {\n payloadKey = String(content?.payload ?? \"\")\n }\n return [sessionId, block.tool_call_id ?? turn.id, action, payloadKey].join(\"\\u0000\")\n}\n\nexport class AgentSocket {\n // The protocol socket is strongly typed in client/socket.ts; this bridge accepts\n // legacy event payloads while stores finish moving to generated payload shapes.\n // biome-ignore lint/suspicious/noExplicitAny: event bridge normalizes mixed legacy payloads.\n private socket: any\n private subscribedSession: string | null = null\n private readonly attachedSessions = new Set<string>()\n private readonly previewArtifactsByToolCall = new Map<string, string>()\n private readonly deliveredBridgeKeys = new Set<string>()\n private readonly pendingReplayMessages = new Map<string, MessageContent>()\n private readonly pendingReplayModes = new Map<string, string | undefined>()\n private readonly oomNotifiedKeys = new Set<string>()\n private readonly pendingTurnPatches = new Map<string, Map<string, SessionPatchEnvelope>>()\n private readonly joinedSessions = new Set<string>()\n private readonly requestedJoins = new Set<string>()\n private readonly pendingJoins = new Map<string, Promise<void>>()\n private readonly recentChatEndAt = new Map<string, number>()\n private readonly boardProjectRefCounts = new Map<number, number>()\n private frontendTelemetryCounter = 0\n private patchFlushHandle: number | ReturnType<typeof globalThis.setTimeout> | null = null\n private patchFlushCancel: (() => void) | null = null\n private readonly projectionBuilder = new ClientProjectionBuilder()\n\n constructor(private client: BladeClient) {\n this.socket = client.socket()\n this._bindStoreHandlers()\n this._bindConnectionHandlers()\n // Wire session changes to socket subscriptions\n setOnSessionChange((sessionId) => {\n if (sessionId) {\n this.subscribe(sessionId)\n return\n }\n this.unsubscribe()\n })\n // Cookie-authenticated sessions have `user` without a persisted bearer token.\n if (hasAuthenticatedSession(this.client)) {\n useConnectionStore.getState().markConnecting()\n this.socket.connect()\n } else {\n useConnectionStore.getState().markDisconnected()\n }\n }\n\n private _ensureConnected() {\n if (this.socket.connected || this.socket.active) {\n return\n }\n if (!hasAuthenticatedSession(this.client)) {\n return\n }\n useConnectionStore.getState().markConnecting()\n this.socket.connect()\n }\n\n private _resolveSessionId(data?: { session_id?: string | null }): string | null {\n return data?.session_id ?? this.subscribedSession\n }\n\n private _reportFrontendTelemetry(event: string, latencyMs: number) {\n this.frontendTelemetryCounter += 1\n if (latencyMs < 16 && this.frontendTelemetryCounter % 20 !== 0) {\n return\n }\n void this.client\n .json(\"POST\", \"/api/observability/frontend\", {\n event,\n latency_ms: latencyMs,\n })\n .catch(() => undefined)\n }\n\n private _queueTurnPatch(sessionId: string, patch: SessionPatchEnvelope) {\n let sessionPatches = this.pendingTurnPatches.get(sessionId)\n if (!sessionPatches) {\n sessionPatches = new Map()\n this.pendingTurnPatches.set(sessionId, sessionPatches)\n }\n const current = sessionPatches.get(patch.turn_id)\n if (!current || patch.sequence >= current.sequence) {\n sessionPatches.set(patch.turn_id, patch)\n }\n this._scheduleTurnPatchFlush()\n }\n\n private _scheduleTurnPatchFlush() {\n if (this.patchFlushHandle != null) return\n\n const flush = () => {\n this.patchFlushHandle = null\n this.patchFlushCancel = null\n this._flushPendingTurnPatches()\n }\n\n if (typeof window !== \"undefined\" && typeof window.requestAnimationFrame === \"function\") {\n const handle = window.requestAnimationFrame(flush)\n this.patchFlushHandle = handle\n this.patchFlushCancel = () => window.cancelAnimationFrame(handle)\n return\n }\n\n const handle = globalThis.setTimeout(flush, 33)\n this.patchFlushHandle = handle\n this.patchFlushCancel = () => globalThis.clearTimeout(handle)\n }\n\n private _flushPendingTurnPatches(sessionId?: string) {\n const sessions: Array<[string, Map<string, SessionPatchEnvelope>]> =\n sessionId === undefined\n ? [...this.pendingTurnPatches.entries()]\n : this.pendingTurnPatches.has(sessionId)\n ? [[sessionId, this.pendingTurnPatches.get(sessionId)!]]\n : []\n\n if (sessionId === undefined) {\n this.pendingTurnPatches.clear()\n } else {\n this.pendingTurnPatches.delete(sessionId)\n }\n\n for (const [targetSessionId, patchesByTurn] of sessions) {\n const patches = [...patchesByTurn.values()].sort((left, right) => left.sequence - right.sequence)\n const startedAt = performance.now()\n for (const patch of patches) {\n useChatStore.getState().applyTurnPatch(targetSessionId, patch)\n const turn = patch.data.turn\n if (!turn) continue\n const mode = extractModeFromBlocks(turn.blocks)\n if (mode === \"planning\" || mode === \"executing\") {\n useSessionStore.getState().setMode(targetSessionId, mode)\n }\n this._applyProjectionSideEffects(targetSessionId, turn)\n }\n this._reportFrontendTelemetry(\"turn_patch_apply\", performance.now() - startedAt)\n }\n\n if (this.pendingTurnPatches.size === 0 && this.patchFlushCancel) {\n this.patchFlushCancel()\n this.patchFlushHandle = null\n this.patchFlushCancel = null\n }\n }\n\n private _bindStoreHandlers() {\n const s = this.socket\n\n const applyTurn = (sessionId: string, turn: TurnProjection) => {\n this._flushPendingTurnPatches(sessionId)\n useChatStore.getState().upsertTurn(sessionId, turn)\n invalidateContextStats(sessionId)\n const mode = extractModeFromBlocks(turn.blocks)\n if (mode === \"planning\" || mode === \"executing\") {\n useSessionStore.getState().setMode(sessionId, mode)\n }\n this._applyProjectionSideEffects(sessionId, turn)\n }\n\n s.on(\"turn:start\", (data: TurnProjection & { session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n if (!useChatStore.getState().isStreaming[sessionId]) {\n useSessionStore.getState().updateSessionStatus(sessionId, \"running\")\n useChatStore.getState().setStreaming(sessionId, true)\n }\n applyTurn(sessionId, data)\n })\n\n s.on(\"turn:patch\", (data: PatchEnvelope & { session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n if (!useChatStore.getState().isStreaming[sessionId]) {\n useSessionStore.getState().updateSessionStatus(sessionId, \"running\")\n useChatStore.getState().setStreaming(sessionId, true)\n }\n if (data.data.workspace_changed) {\n notifyWorkspaceFilesChanged(sessionId)\n }\n this._queueTurnPatch(sessionId, data)\n })\n\n s.on(\"turn:end\", (data: TurnProjection & { session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n applyTurn(sessionId, data)\n })\n\n s.on(\"turn:events\", (data: { session_id?: string; events: RawEvent[] }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId || !data.events?.length) return\n const terminalChatEndStatus = extractTerminalChatEndStatus(data.events)\n if (!terminalChatEndStatus && !useChatStore.getState().isStreaming[sessionId]) {\n useSessionStore.getState().updateSessionStatus(sessionId, \"running\")\n useChatStore.getState().setStreaming(sessionId, true)\n }\n const existingTurns = useChatStore.getState().turns[sessionId]\n if (existingTurns?.length) {\n this.projectionBuilder.seedSequence(\n Math.max(...existingTurns.map((t) => t.sequence)),\n )\n }\n const applyStartedAt = performance.now()\n const updates = this.projectionBuilder.processBatch(data.events)\n for (const update of updates) {\n if (update.kind === \"upsert\") {\n useChatStore.getState().upsertTurn(sessionId, update.turn)\n const mode = extractModeFromBlocks(update.turn.blocks)\n if (mode === \"planning\" || mode === \"executing\") {\n useSessionStore.getState().setMode(sessionId, mode)\n }\n this._applyProjectionSideEffects(sessionId, update.turn)\n } else if (update.kind === \"workspace_changed\") {\n notifyWorkspaceFilesChanged(sessionId)\n }\n }\n this._reportFrontendTelemetry(\"turn_events_apply\", performance.now() - applyStartedAt)\n if (terminalChatEndStatus) {\n useSessionStore\n .getState()\n .updateSessionStatus(sessionId, sessionStatusFromChatEnd(terminalChatEndStatus))\n if (terminalChatEndStatus === \"interrupted\") {\n useChatStore.getState().markInterrupted(sessionId)\n } else if (terminalChatEndStatus === \"failed\") {\n useChatStore.getState().markFailed(sessionId)\n }\n useChatStore.getState().setStreaming(sessionId, false)\n invalidateContextStats(sessionId)\n }\n })\n\n s.on(\"chat:start\", (data?: { session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n useSessionStore.getState().updateSessionStatus(sessionId, \"running\")\n useSessionStore.getState().clearErrorMessage(sessionId)\n useChatStore.getState().setStreaming(sessionId, true)\n })\n\n s.on(\"chat:end\", (data?: { status?: string; session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (sessionId) {\n this._flushPendingTurnPatches(sessionId)\n const status = data?.status ?? \"completed\"\n useSessionStore\n .getState()\n .updateSessionStatus(sessionId, sessionStatusFromChatEnd(status))\n if (status === \"interrupted\") {\n useChatStore.getState().markInterrupted(sessionId)\n } else if (status === \"failed\") {\n useChatStore.getState().markFailed(sessionId)\n }\n useChatStore.getState().setStreaming(sessionId, false)\n this.recentChatEndAt.set(sessionId, Date.now())\n invalidateContextStats(sessionId)\n void this._syncSessionTurnsFromHistory(sessionId)\n useRuntimeStore.getState().addEvent(sessionId, {\n type: \"chat:end\",\n title:\n status === \"paused\"\n ? \"Waiting for input\"\n : status === \"interrupted\"\n ? \"运行已中断\"\n : status === \"failed\"\n ? \"Run failed\"\n : \"Run completed\",\n status:\n status === \"paused\"\n ? \"info\"\n : status === \"interrupted\" || status === \"failed\"\n ? \"error\"\n : \"done\",\n detail:\n status === \"paused\"\n ? \"Paused for user input\"\n : status === \"interrupted\"\n ? \"用户已中断\"\n : status === \"failed\"\n ? \"Streaming failed\"\n : \"Streaming finished\",\n })\n }\n })\n\n s.on(\"task:updated\", (data: { tasks: unknown[]; session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (sessionId) {\n useTaskStore.getState().setTasks(sessionId, data.tasks as never[])\n }\n })\n\n s.on(\"system:error\", (data: { message: string; session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (sessionId) {\n this._flushPendingTurnPatches(sessionId)\n const message = isOomText(data.message) ? OOM_MESSAGE : data.message\n useSessionStore.getState().updateSessionStatus(sessionId, \"failed\")\n useSessionStore.getState().setErrorMessage(sessionId, message)\n useChatStore.getState().markFailed(sessionId)\n useChatStore.getState().setStreaming(sessionId, false)\n this.recentChatEndAt.set(sessionId, Date.now())\n useRuntimeStore.getState().addEvent(sessionId, {\n type: \"system:error\",\n title: \"Runtime error\",\n status: \"error\",\n detail: message,\n })\n }\n })\n\n s.on(\n \"replay:input_mismatch\",\n (data: { session_id?: string; actual_message?: string; expected_message?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n const keepReplay = !window.confirm(\"即将转入自主模式,是否继续?\")\n const message = this.pendingReplayMessages.get(sessionId) ?? data.actual_message ?? \"\"\n const mode = this.pendingReplayModes.get(sessionId)\n this.pendingReplayMessages.delete(sessionId)\n this.pendingReplayModes.delete(sessionId)\n this.socket.emit(\"chat:send\", {\n session_id: sessionId,\n message,\n mode,\n replay_decision: keepReplay ? \"keep_replay\" : \"continue_replay\",\n })\n },\n )\n\n s.on(\n \"system:notification\",\n (data: {\n session_id?: string\n notification_type?: string\n title?: string\n detail?: string | null\n status?: \"info\" | \"running\" | \"done\" | \"error\" | string\n }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n this._applySystemNotification(sessionId, \"root\", data)\n },\n )\n\n s.on(\"task:synced\", (data: { tasks: unknown[]; session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (sessionId) {\n useTaskStore.getState().setTasks(sessionId, data.tasks as never[])\n }\n })\n\n // 后端编排层直接变更 workspace 文件(例如 whatif rerun rename step 目录)\n // 时发出,不依赖 agent tool 的 turn:patch.workspace_changed 通道。\n s.on(\"workspace:files_changed\", (data: { session_id?: string; file_path?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (sessionId) {\n notifyWorkspaceFilesChanged(sessionId, data.file_path)\n }\n })\n\n // ship-attack v2:首次触发 skill 自动绑定后后端广播;前端原地 patch\n // sessions 缓存里的 intent / bound_skill_id,避免成果表改名需要刷新才能看到。\n s.on(\n \"session:updated\",\n (data: {\n session_id?: string\n intent?: string\n status?: SessionStatus\n model?: string | null\n bound_skill_id?: string | null\n replay_state?: Record<string, unknown> | null\n }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n const patch: {\n intent?: string\n status?: SessionStatus\n model?: string | null\n bound_skill_id?: string | null\n replay_state?: Record<string, unknown> | null\n } = {}\n if (typeof data.intent === \"string\") patch.intent = data.intent\n if (data.status) patch.status = data.status\n if (\"model\" in data) patch.model = data.model\n if (\"bound_skill_id\" in data) patch.bound_skill_id = data.bound_skill_id\n if (\"replay_state\" in data) patch.replay_state = data.replay_state\n if (Object.keys(patch).length > 0) {\n useSessionStore.getState().patchSession(sessionId, patch)\n }\n if (typeof data.intent === \"string\") {\n invalidateHomeSidebarSessions()\n }\n // 同步失效 session detail 缓存:绑定后 primary_skill_snapshot 从 null\n // 变为 skill 快照,useSessionSkillMeta 需重新拉取才能让中间栏阶段徽章\n // 和并行控件出现(见 PR #564 codex review P1)。\n invalidateSessionDetail(sessionId)\n },\n )\n\n s.on(\"session:rewind\", (data: { checkpoint_id: string }) => {\n if (!this.subscribedSession) return\n const sessionId = this.subscribedSession\n // Clear mode and error so history reload can re-infer them\n const { modes, ...rest } = useSessionStore.getState()\n const { [sessionId]: _, ...restModes } = modes\n useSessionStore.setState({ ...rest, modes: restModes })\n useSessionStore.getState().clearErrorMessage(sessionId)\n // Re-load session state\n useSessionStore.getState().setActiveSession(sessionId)\n useRuntimeStore.getState().addEvent(sessionId, {\n type: \"session:rewind\",\n title: \"Conversation rewound\",\n status: \"info\",\n detail: data.checkpoint_id,\n })\n invalidateSessionCheckpoints(sessionId)\n })\n\n const handleArtifact = (sessionId: string, data: ArtifactEvent) => {\n if (_isHiddenPath(data.file_path)) return\n\n // 只处理当前订阅的 session,避免 attachSession 附加的其他 session 的文件推到预览面板\n if (sessionId !== this.subscribedSession) return\n\n const type = resolveArtifactType(data.content_type)\n const filePath = `/api/sessions/${sessionId}/files/${encodeURIComponent(data.file_path)}`\n const fileUrl = this.client.buildAuthedUrl(filePath)\n const content =\n type === \"ppt\"\n ? filePath\n : type === \"image\" || type === \"pdf\" || type === \"docx\" || type === \"excel\"\n ? fileUrl\n : data.content\n\n const target = {\n type,\n content,\n sourceUrl: type === \"ppt\" ? fileUrl : undefined,\n title: data.title,\n key: data.file_path,\n revision: Date.now(),\n } as const\n const uiStore = useUiStore.getState()\n if (uiStore.rightPanelAutoJump) {\n uiStore.clearRightPanelTabUnread(\"files\")\n uiStore.clearPreviewArtifactUnread(data.file_path)\n uiStore.setActiveRightTab(\"preview\")\n uiStore.pushArtifact(target)\n } else {\n uiStore.upsertArtifact(target, { reveal: false, activate: false })\n uiStore.markRightPanelTabUnread(\"files\")\n uiStore.markPreviewArtifactUnread(data.file_path)\n }\n }\n\n s.on(\"artifact:created\", (data: ArtifactEvent) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n notifyWorkspaceFilesChanged(sessionId, data.file_path)\n handleArtifact(sessionId, data)\n })\n s.on(\"bg:started\", (data: BackgroundTaskEvent & { session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n const taskId = typeof data.task_id === \"string\" ? data.task_id : typeof data.id === \"string\" ? data.id : \"\"\n if (!taskId) return\n useBackgroundStore.getState().upsertTask(sessionId, {\n id: taskId,\n command: typeof data.command === \"string\" ? data.command : \"\",\n description: typeof data.description === \"string\" ? data.description : undefined,\n status: \"running\",\n elapsed_seconds: typeof data.elapsed_seconds === \"number\" ? data.elapsed_seconds : 0,\n started_at: Date.now() / 1000,\n })\n })\n s.on(\"bg:tasks_completed\", (data: BackgroundCompletedEvent) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n for (const task of data.tasks ?? []) {\n const taskId =\n typeof task.id === \"string\" ? task.id : typeof task.task_id === \"string\" ? task.task_id : \"\"\n if (!taskId) continue\n useBackgroundStore.getState().upsertTask(sessionId, {\n id: taskId,\n command: typeof task.command === \"string\" ? task.command : \"\",\n description: typeof task.description === \"string\" ? task.description : undefined,\n status:\n task.status === \"running\" || task.status === \"failed\" ? task.status : \"done\",\n exit_code: typeof task.exit_code === \"number\" || task.exit_code === null ? task.exit_code : undefined,\n elapsed_seconds: typeof task.elapsed_seconds === \"number\" ? task.elapsed_seconds : 0,\n output_lines_count:\n typeof task.output_lines_count === \"number\" ? task.output_lines_count : undefined,\n output:\n Array.isArray(task.output_preview) && task.output_preview.length > 0\n ? task.output_preview.join(\"\\n\")\n : undefined,\n })\n }\n })\n s.on(\"skills:changed\", (data?: { session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n invalidateSkillStats(sessionId)\n invalidateSessionSkills(sessionId)\n })\n s.on(\"artifact:updated\", (data: ArtifactEvent) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n notifyWorkspaceFilesChanged(sessionId, data.file_path)\n if (sessionId !== this.subscribedSession) return\n if (data.old_string != null && data.new_string != null) {\n const target = {\n type: \"diff\",\n content: data.new_string,\n oldContent: data.old_string,\n title: data.title,\n key: data.file_path,\n } as const\n const uiStore = useUiStore.getState()\n if (uiStore.rightPanelAutoJump) {\n uiStore.clearRightPanelTabUnread(\"files\")\n uiStore.clearPreviewArtifactUnread(data.file_path)\n uiStore.setActiveRightTab(\"preview\")\n uiStore.pushArtifact(target)\n } else {\n uiStore.upsertArtifact(target, { reveal: false, activate: false })\n uiStore.markRightPanelTabUnread(\"files\")\n uiStore.markPreviewArtifactUnread(data.file_path)\n }\n return\n }\n handleArtifact(sessionId, data)\n })\n }\n\n private _bindConnectionHandlers() {\n this.socket.on(\"connect\", () => {\n useConnectionStore.getState().markConnected()\n console.log(\"[agent-socket] connected, id:\", this.socket.id)\n this.joinedSessions.clear()\n this.requestedJoins.clear()\n this.pendingJoins.clear()\n const sessionId = this.subscribedSession\n if (sessionId) {\n useSessionStore.getState().setActiveSession(sessionId)\n // 重连后 socket.io 会分配新 sid,旧 sid 在后端 room 里的订阅关系不\n // 会迁移过来 —— 必须重新 emit session:subscribe,否则后端 room\n // 广播的 turn:patch / chat:end 我们收不到,UI 会卡在 \"运行中 + 停\n // 止按钮\"(因为没机会把 isStreaming 翻回 false)。\n void this._ensureJoined(sessionId)\n }\n const batchItems = [...this.attachedSessions]\n .filter((id) => id !== sessionId)\n .map((id) => ({ session_id: id, mode: \"status\" as const }))\n if (batchItems.length > 0) {\n this.socket.emit(\"session:subscribe_batch\", { sessions: batchItems })\n }\n })\n\n this.socket.on(\"connect_error\", (err: Error) => {\n useConnectionStore.getState().markDisconnected()\n console.error(\"[agent-socket] connect_error:\", err.message)\n })\n\n this.socket.on(\"disconnect\", (reason: string) => {\n useConnectionStore.getState().markDisconnected()\n console.log(\"[agent-socket] disconnected:\", reason)\n })\n\n this.socket.io.on(\"reconnect_attempt\", (attempt: number) => {\n useConnectionStore\n .getState()\n .markConnecting(typeof attempt === \"number\" ? attempt : 0)\n })\n }\n\n private _applyProjectionSideEffects(sessionId: string, turn: TurnProjection) {\n for (const block of turn.blocks) {\n if (block.type === \"tool_result\" && isOomResult(block.content)) {\n this._notifySandboxOom(sessionId, block.tool_call_id ?? turn.id)\n }\n\n if (block.type === \"tool_bridge\" && isToolBridgeContent(block.content)) {\n if (block.content.action === \"gis.goals.updated\" && isGisGoalListPayload(block.content.payload)) {\n useGisStore.getState().setGoals(sessionId, block.content.payload.goals as never[])\n continue\n }\n\n if (\n block.content.action === \"gis.resources.updated\" &&\n isGisResourceListPayload(block.content.payload)\n ) {\n useGisStore\n .getState()\n .setResources(sessionId, block.content.payload.resources as never[])\n continue\n }\n\n if (\n block.content.action === \"gis.targets.updated\" &&\n isGisTargetListPayload(block.content.payload)\n ) {\n useGisStore.getState().setTargets(sessionId, block.content.payload.targets as never[])\n continue\n }\n\n if (block.content.action.startsWith(\"map.\")) {\n useGisStore.getState().pushMapCommand(sessionId, {\n action: block.content.action,\n payload: block.content.payload,\n toolCallId: block.tool_call_id,\n })\n continue\n }\n\n if (block.content.action.startsWith(\"solution.creator.\")) {\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"blade:solution-creator-bridge\", {\n detail: {\n sessionId,\n action: block.content.action,\n payload: block.content.payload,\n },\n }),\n )\n }\n continue\n }\n\n const deliveryKey = buildToolBridgeDeliveryKey(sessionId, turn, block)\n if (this.deliveredBridgeKeys.has(deliveryKey)) {\n continue\n }\n this.deliveredBridgeKeys.add(deliveryKey)\n\n const envelope = {\n __bladeBridge: true,\n direction: \"agent-to-host\",\n action: block.content.action,\n payload: block.content.payload,\n meta: {\n sessionId,\n ...(block.tool_call_id ? { toolCallId: block.tool_call_id } : {}),\n timestamp: Date.now(),\n },\n } as const\n dispatchBladeBridge(envelope)\n postToParent(envelope)\n continue\n }\n\n if (block.type !== \"tool_ui\" || !block.tool_call_id || !isUiMeta(block.content)) {\n continue\n }\n const ui = block.content\n if (ui.target !== \"preview\") {\n continue\n }\n const previewType: PreviewTarget[\"type\"] = ui.resourceHTML ? \"resource-html\" : \"resource-uri\"\n const previewContent = ui.resourceHTML ?? ui.resourceUri ?? ui.resourceURI\n if (!previewContent) {\n continue\n }\n const previewKey = buildToolPreviewKey(previewContent, previewType, block.tool_call_id)\n const signature = buildToolPreviewSignature(previewContent, previewType)\n if (this.previewArtifactsByToolCall.get(previewKey) === signature) {\n continue\n }\n this.previewArtifactsByToolCall.set(previewKey, signature)\n useUiStore.getState().pushArtifact({\n type: previewType,\n content: previewContent,\n title: ui.title ?? \"工具预览\",\n key: previewKey,\n bridgeSessionId: sessionId,\n })\n }\n\n for (const block of turn.blocks) {\n if (block.type !== \"system_notification\" || !isRecord(block.content)) {\n continue\n }\n this._applySystemNotification(sessionId, turn.loop_id, block.content as SystemNotification)\n }\n\n for (const toolCall of turn.tool_calls) {\n if (toolCall.status === \"done\" || toolCall.status === \"error\") {\n if (isOomResult(toolCall.result)) {\n this._notifySandboxOom(sessionId, toolCall.id)\n }\n }\n }\n }\n\n private _notifySandboxOom(sessionId: string, key: string) {\n const dedupeKey = `${sessionId}:${key}`\n if (this.oomNotifiedKeys.has(dedupeKey)) return\n this.oomNotifiedKeys.add(dedupeKey)\n useChatStore.getState().addErrorMessage(sessionId, OOM_MESSAGE)\n useRuntimeStore.getState().addEvent(sessionId, {\n type: \"sandbox:oom\",\n title: \"沙盒内存超限\",\n status: \"error\",\n detail: OOM_MESSAGE,\n })\n }\n\n private async _syncSessionTurnsFromHistory(sessionId: string) {\n try {\n const turns = await this.client.sessions.getSessionTurns(sessionId)\n if (turns.length === 0) return\n useChatStore.getState().setTurns(sessionId, turns)\n } catch {\n // Best-effort history repair for missed early realtime events.\n }\n }\n\n private _applySystemNotification(\n sessionId: string,\n loopId: string,\n notification: SystemNotification,\n ) {\n const notificationType = notification.notification_type ?? \"system_notification\"\n const title = notification.title ?? notificationType\n const detail =\n typeof notification.detail === \"string\"\n ? notification.detail\n : notification.detail == null\n ? undefined\n : JSON.stringify(notification.detail)\n const status =\n notification.status === \"running\" ||\n notification.status === \"done\" ||\n notification.status === \"error\"\n ? notification.status\n : \"info\"\n\n useRuntimeStore.getState().addEvent(sessionId, {\n type: notificationType,\n title,\n status,\n detail,\n loopName: loopId,\n })\n\n if (notificationType !== \"bg:started\" || !isRecord(notification.metadata)) {\n return\n }\n\n const taskId = typeof notification.metadata.task_id === \"string\" ? notification.metadata.task_id : \"\"\n const command =\n typeof notification.metadata.command === \"string\" ? notification.metadata.command : \"\"\n const description =\n typeof notification.metadata.description === \"string\"\n ? notification.metadata.description\n : undefined\n if (!taskId) return\n\n useBackgroundStore.getState().upsertTask(sessionId, {\n id: taskId,\n command,\n description,\n status: \"running\",\n elapsed_seconds: 0,\n started_at: Date.now() / 1000,\n })\n }\n\n subscribe(sessionId: string) {\n const previousSessionId = this.subscribedSession\n const isSameSession = previousSessionId === sessionId\n if (previousSessionId && !isSameSession) {\n this.socket.emit(\"session:unsubscribe\", { session_id: previousSessionId })\n useUiBridgeStore.getState().clearSession(previousSessionId)\n }\n this.subscribedSession = sessionId\n if (!isSameSession) {\n // Clear artifacts and card states from previous session\n this.previewArtifactsByToolCall.clear()\n this.deliveredBridgeKeys.clear()\n useUiStore.getState().clearArtifacts()\n useCardStateStore.getState().clearAllStates()\n this.projectionBuilder.reset()\n }\n if (this.joinedSessions.has(sessionId)) {\n this._refreshRunningState(sessionId)\n }\n void this._ensureJoined(sessionId)\n }\n\n subscribeAgentBoardProject(projectId: string | number) {\n this._ensureConnected()\n const id = Number(projectId)\n const prev = this.boardProjectRefCounts.get(id) ?? 0\n this.boardProjectRefCounts.set(id, prev + 1)\n if (prev === 0) {\n this.socket.emit(\"agent-board:project:subscribe\", { project_id: id })\n }\n }\n\n unsubscribeAgentBoardProject(projectId: string | number) {\n const id = Number(projectId)\n const prev = this.boardProjectRefCounts.get(id) ?? 0\n if (prev <= 1) {\n this.boardProjectRefCounts.delete(id)\n this.socket.emit(\"agent-board:project:unsubscribe\", { project_id: id })\n } else {\n this.boardProjectRefCounts.set(id, prev - 1)\n }\n }\n\n onAgentBoardTaskChanged(handler: (data: AgentBoardBoardTaskChangedEvent) => void) {\n this.socket.on(\"agent-board:board-task:changed\", handler)\n return () => {\n this.socket.off(\"agent-board:board-task:changed\", handler)\n }\n }\n\n onAgentBoardFileOp(handler: (data: AgentBoardFileOpEvent) => void) {\n this.socket.on(\"agent-board:file-op\", handler)\n return () => {\n this.socket.off(\"agent-board:file-op\", handler)\n }\n }\n\n /**\n * 订阅 session:updated(智能体意图、状态等会话属性变更)。全局 handler 只会\n * patch 已在 useSessionStore 列表里的会话;看板任务这类不在列表里的\n * 会话,由调用方通过本方法自行消费属性更新。\n */\n onSessionUpdated(handler: (data: { session_id?: string; intent?: string; status?: string }) => void) {\n this.socket.on(\"session:updated\", handler)\n return () => {\n this.socket.off(\"session:updated\", handler)\n }\n }\n\n unsubscribe() {\n const previousSessionId = this.subscribedSession\n if (previousSessionId) {\n this.socket.emit(\"session:unsubscribe\", { session_id: previousSessionId })\n useUiBridgeStore.getState().clearSession(previousSessionId)\n this.subscribedSession = null\n this.requestedJoins.delete(previousSessionId)\n this.joinedSessions.delete(previousSessionId)\n this.pendingJoins.delete(previousSessionId)\n }\n this.previewArtifactsByToolCall.clear()\n this.deliveredBridgeKeys.clear()\n }\n\n /**\n * 附加订阅:仅把当前 sid 加进 sessionId 的 room,不切 subscribedSession,\n * 也不清空当前会话的 artifact/card state。用于\"并行拟制\"这类场景 ——\n * 创建 N 个后台 session 后需要收到它们的 chat:end / task:updated 才能让\n * 成果表里那几条卡片状态流转到\"已完成\";缺失订阅时广播事件永远到不了\n * 前端,卡片就会停留在乐观写入的\"运行中\"态。\n *\n * 幂等:后端 session:subscribe handler 只做 enter_room,重复 emit 无副作用。\n * 同时把 sessionId 记到 attachedSessions,连接断开重连时一并重新订阅,\n * 避免长会话期间断网后再回来时丢掉该 session 的 turn 事件。\n */\n attachSession(sessionId: string) {\n this.attachedSessions.add(sessionId)\n void this._ensureJoined(sessionId, \"status\")\n }\n\n private _ensureJoined(sessionId: string, mode: \"full\" | \"status\" = \"full\"): Promise<void> {\n // status 订阅不记录到 joinedSessions,直接 fire-and-forget\n if (mode === \"status\") {\n this.socket.emit(\"session:subscribe\", { session_id: sessionId, mode: \"status\" })\n return Promise.resolve()\n }\n\n if (this.joinedSessions.has(sessionId)) {\n return Promise.resolve()\n }\n\n this.requestedJoins.add(sessionId)\n const pending = this.pendingJoins.get(sessionId)\n if (pending) {\n return pending\n }\n\n const join = new Promise<void>((resolve, reject) => {\n this.socket.timeout(5_000).emit(\n \"session:subscribe\",\n { session_id: sessionId },\n (err: Error | null, response?: { ok?: boolean; message?: string; is_running?: boolean }) => {\n if (err) {\n reject(err)\n return\n }\n if (response && response.ok === false) {\n reject(new Error(response.message || \"Session subscription failed\"))\n return\n }\n if (this.requestedJoins.has(sessionId)) {\n this.joinedSessions.add(sessionId)\n }\n if (response?.is_running) {\n useSessionStore.getState().updateSessionStatus(sessionId, \"running\")\n useChatStore.getState().setStreaming(sessionId, true)\n } else if (useChatStore.getState().isStreaming[sessionId]) {\n useChatStore.getState().setStreaming(sessionId, false)\n void this._syncSessionTurnsFromHistory(sessionId)\n }\n resolve()\n },\n )\n }).finally(() => {\n this.pendingJoins.delete(sessionId)\n })\n\n this.pendingJoins.set(sessionId, join)\n return join\n }\n\n private _refreshRunningState(sessionId: string) {\n this.socket.timeout(5_000).emit(\n \"session:subscribe\",\n { session_id: sessionId },\n (err: Error | null, response?: { ok?: boolean; is_running?: boolean }) => {\n if (err || !response) return\n if (response.is_running) {\n useSessionStore.getState().updateSessionStatus(sessionId, \"running\")\n useChatStore.getState().setStreaming(sessionId, true)\n } else if (useChatStore.getState().isStreaming[sessionId]) {\n useChatStore.getState().setStreaming(sessionId, false)\n void this._syncSessionTurnsFromHistory(sessionId)\n }\n },\n )\n }\n\n private _shouldWaitForJoinBeforeSend(sessionId: string): boolean {\n return (\n this.subscribedSession === sessionId ||\n this.joinedSessions.has(sessionId) ||\n this.pendingJoins.has(sessionId) ||\n this.requestedJoins.has(sessionId)\n )\n }\n\n async send(\n sessionId: string,\n message: MessageContent,\n mode?: string,\n askuserAnswer?: Record<string, unknown>,\n extras?: {\n model?: string\n thinkingOverride?: boolean\n whatif?: {\n from_step: number\n quotes: Array<Record<string, unknown>>\n deprecate_entry_ids: string[]\n }\n replay_decision?: \"keep_replay\" | \"continue_replay\"\n },\n ) {\n this._ensureConnected()\n if (useChatStore.getState().isStreaming[sessionId]) {\n useChatStore.getState().addErrorMessage(sessionId, \"当前回复尚未结束,请稍后再发送。\")\n return\n }\n await this._ensureSessionIdleBeforeSend(sessionId)\n if (useChatStore.getState().isStreaming[sessionId]) {\n useChatStore.getState().addErrorMessage(sessionId, \"当前回复尚未结束,请稍后再发送。\")\n return\n }\n if (!(askuserAnswer && typeof askuserAnswer.tool_call_id === \"string\")) {\n useChatStore.getState().addUserMessage(sessionId, message)\n }\n useChatStore.getState().setStreaming(sessionId, true)\n if (askuserAnswer && typeof askuserAnswer.tool_call_id === \"string\") {\n const { tool_call_id, ...rest } = askuserAnswer\n const current = useChatStore.getState().askAnswers[sessionId] ?? {}\n useChatStore.getState().setAskAnswers(sessionId, {\n ...current,\n [tool_call_id]: rest as { selections: Record<number, number[]>; custom: Record<number, string> },\n })\n }\n useRuntimeStore.getState().addEvent(sessionId, {\n type: \"chat:start\",\n title: \"User prompt sent\",\n status: \"running\",\n detail: contentPreview(message),\n })\n if (!extras?.replay_decision) {\n this.pendingReplayMessages.set(sessionId, message)\n this.pendingReplayModes.set(sessionId, mode)\n }\n const payload = {\n session_id: sessionId,\n message,\n mode,\n askuser_answer: askuserAnswer,\n model: extras?.model,\n thinking_override: extras?.thinkingOverride,\n whatif: extras?.whatif,\n replay_decision: extras?.replay_decision,\n }\n const sendPayload = () => {\n this.socket.emit(\"chat:send\", payload)\n }\n if (this._shouldWaitForJoinBeforeSend(sessionId)) {\n void this._ensureJoined(sessionId)\n .then(sendPayload)\n .catch((error: Error) => {\n useChatStore.getState().setStreaming(sessionId, false)\n useSessionStore.getState().updateSessionStatus(sessionId, \"failed\")\n useChatStore\n .getState()\n .addErrorMessage(sessionId, error.message || \"会话订阅失败,消息未发送\")\n })\n } else {\n sendPayload()\n }\n const skillId = extractSkillIdForAnalytics(message)\n trackEvent(\"message_sent\", {\n session_id: sessionId,\n ...(skillId ? { skill_id: skillId } : {}),\n })\n if (skillId) {\n trackEvent(\"skill_invoked\", {\n session_id: sessionId,\n skill_id: skillId,\n })\n }\n }\n\n private async _ensureSessionIdleBeforeSend(sessionId: string) {\n const lastEndedAt = this.recentChatEndAt.get(sessionId) ?? 0\n if (Date.now() - lastEndedAt > 3000) {\n return\n }\n const deadline = Date.now() + 3000\n while (Date.now() < deadline) {\n const response = await this.stop(sessionId)\n const status = String(response.status ?? \"\")\n if (status === \"idle\" || status === \"done\" || status === \"interrupted\") {\n return\n }\n if (status !== \"stopping\") {\n return\n }\n await new Promise((resolve) => globalThis.setTimeout(resolve, 150))\n }\n }\n\n /**\n * 在 agent loop 运行期间追加补充消息。\n * 消息会在下一轮 LLM 调用前以 user-supplement 形式注入。\n */\n append(sessionId: string, message: string) {\n this._ensureConnected()\n this.socket.emit(\"chat:append\", {\n session_id: sessionId,\n message,\n })\n useChatStore.getState().addUserMessage(sessionId, message)\n }\n\n stop(sessionId: string) {\n return new Promise<Record<string, unknown>>((resolve, reject) => {\n this.socket.timeout(35_000).emit(\n \"chat:stop\",\n { session_id: sessionId },\n (err: Error | null, response: Record<string, unknown> | undefined) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response ?? {})\n },\n )\n })\n }\n\n compact(sessionId: string) {\n return new Promise<Record<string, unknown>>((resolve, reject) => {\n this.socket.timeout(30_000).emit(\n \"chat:compact\",\n { session_id: sessionId },\n (err: Error | null, response: Record<string, unknown> | undefined) => {\n if (err) {\n reject(err)\n return\n }\n resolve(response ?? {})\n },\n )\n })\n }\n\n reconnect() {\n this.socket.disconnect()\n useConnectionStore.getState().markConnecting()\n this.socket.connect()\n }\n\n disconnect() {\n this.socket.disconnect()\n useConnectionStore.getState().markDisconnected()\n }\n\n destroy() {\n this.socket.removeAllListeners()\n this.socket.disconnect()\n useConnectionStore.getState().markDisconnected()\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: socket.io listeners are event-specific and forwarded transparently.\n on(event: string, listener: (...args: any[]) => void) {\n this.socket.on(event, listener)\n return this\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: socket.io listeners are event-specific and forwarded transparently.\n off(event: string, listener: (...args: any[]) => void) {\n this.socket.off(event, listener)\n return this\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: generic emit for custom events.\n emit(event: string, data?: any) {\n this.socket.emit(event, data)\n return this\n }\n\n getSubscribedSession() {\n return this.subscribedSession\n }\n}\n\nexport function bridgeSocketEvents(client: BladeClient, _stores?: unknown) {\n agentSocket?.destroy()\n const nextSocket = new AgentSocket(client)\n setAgentSocket(nextSocket)\n return nextSocket\n}\n\nfunction _isHiddenPath(filePath: string): boolean {\n return filePath.split(\"/\").some((seg) => seg.startsWith(\".\"))\n}\n","import { create } from \"zustand\"\nimport type { AskUserAnswerData } from \"../components/chat/AskUserQuestionBlock\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport type AnswerCallback = (\n answer: string,\n toolCallId: string,\n answerData: AskUserAnswerData,\n) => void\n\ninterface AnswerCallbackState extends ClientAwareState {\n callbacks: Record<string, AnswerCallback | undefined>\n setAnswerCallback: (sessionId: string, callback?: AnswerCallback) => void\n}\n\nexport const useAnswerCallbackStore = create<AnswerCallbackState>()((set) => ({\n ...createClientActions(set),\n callbacks: {},\n setAnswerCallback: (sessionId, callback) => {\n set((state) => ({\n callbacks: {\n ...state.callbacks,\n [sessionId]: callback,\n },\n }))\n },\n}))\n","import { create } from \"zustand\"\nimport { createClientActions, type ClientAwareState } from \"./client-aware\"\n\nexport type AsrProvider = \"volcengine\" | \"qwen\"\n\ninterface RuntimeFeaturesState extends ClientAwareState {\n asrEnabled: boolean\n asrProvider: AsrProvider\n publicSharingEnabled: boolean\n memoryEnabled: boolean\n checkpointsEnabled: boolean\n setFeatures: (features: {\n asrEnabled?: boolean\n asrProvider?: AsrProvider\n publicSharingEnabled?: boolean\n memoryEnabled?: boolean\n checkpointsEnabled?: boolean\n }) => void\n}\n\n/**\n * 运行期特性开关(由后端 /api/config 下发)。默认全部关闭,main.tsx 启动时 fetch 一次填充。\n */\nexport const useRuntimeFeaturesStore = create<RuntimeFeaturesState>((set) => ({\n ...createClientActions(set),\n asrEnabled: false,\n asrProvider: \"volcengine\",\n publicSharingEnabled: false,\n memoryEnabled: false,\n checkpointsEnabled: false,\n setFeatures: (features) =>\n set((prev) => ({\n asrEnabled: features.asrEnabled ?? prev.asrEnabled,\n asrProvider: features.asrProvider ?? prev.asrProvider,\n publicSharingEnabled:\n features.publicSharingEnabled ?? prev.publicSharingEnabled,\n memoryEnabled: features.memoryEnabled ?? prev.memoryEnabled,\n checkpointsEnabled: features.checkpointsEnabled ?? prev.checkpointsEnabled,\n })),\n}))\n","import { BladeClient, type BladeClientOptions } from \"../client\"\nimport { attachHostBridgeListener } from \"./lib/parent-bridge\"\nimport { bridgeSocketEvents } from \"./sockets/event-bridge\"\nimport { useAnswerCallbackStore } from \"./stores/answer-callback-store\"\nimport { useAuthStore } from \"./stores/auth-store\"\nimport { useBackgroundStore } from \"./stores/background-store\"\nimport { useCardStateStore } from \"./stores/card-state-store\"\nimport { useChatStore } from \"./stores/chat-store\"\nimport { useConnectionStore } from \"./stores/connection-store\"\nimport { useGisStore } from \"./stores/gis-store\"\nimport { useRuntimeFeaturesStore } from \"./stores/runtime-features-store\"\nimport { useRuntimeStore } from \"./stores/runtime-store\"\nimport { useSessionStore } from \"./stores/session-store\"\nimport { useTaskStore } from \"./stores/task-store\"\nimport { useUiBridgeStore } from \"./stores/ui-bridge-store\"\nimport { useUiStore } from \"./stores/ui-store\"\n\nlet bootstrappedClient: BladeClient | null = null\nlet detachHostBridgeListener: (() => void) | null = null\n\nconst stores = {\n answerCallback: useAnswerCallbackStore,\n auth: useAuthStore,\n background: useBackgroundStore,\n cardState: useCardStateStore,\n chat: useChatStore,\n connection: useConnectionStore,\n gis: useGisStore,\n runtime: useRuntimeStore,\n runtimeFeatures: useRuntimeFeaturesStore,\n session: useSessionStore,\n task: useTaskStore,\n ui: useUiStore,\n uiBridge: useUiBridgeStore,\n}\n\nexport function attachClientToStores(client: BladeClient): void {\n for (const store of Object.values(stores)) {\n const state = (store as { getState: () => { setClient: (client: BladeClient) => void } }).getState()\n state.setClient(client)\n }\n bridgeSocketEvents(client, stores)\n detachHostBridgeListener?.()\n detachHostBridgeListener = attachHostBridgeListener(() => {\n const activeSessionId = useSessionStore.getState().activeSessionId\n return {\n sessionId: activeSessionId,\n activeSessionId,\n isStreaming: activeSessionId\n ? (useChatStore.getState().isStreaming[activeSessionId] ?? false)\n : false,\n }\n })\n}\n\nexport function bootstrapBladeClient(options: BladeClientOptions): BladeClient {\n const client = new BladeClient(withStoreAuth(options))\n if (options.token === undefined) {\n client._attachStoreRestTokenResolver(() => useAuthStore.getState().token)\n client._attachStoreSocketTokenResolver(() => {\n const auth = useAuthStore.getState()\n return auth.token ?? auth.socketAuthToken\n })\n }\n attachClientToStores(client)\n bootstrappedClient = client\n return client\n}\n\nexport function getBootstrappedClient(): BladeClient {\n if (!bootstrappedClient) {\n throw new Error(\"bootstrapBladeClient() must be called before any SDK usage\")\n }\n return bootstrappedClient\n}\n\nfunction withStoreAuth(options: BladeClientOptions): BladeClientOptions {\n if (options.token !== undefined) {\n return options\n }\n return {\n ...options,\n onRefreshSuccess: async () => {\n await options.onRefreshSuccess?.()\n useAuthStore.setState({ token: null })\n },\n }\n}\n","import type { BladeClient, BladeClientOptions } from \"../../client\"\nimport { getBootstrappedClient } from \"../bootstrap\"\n\nexport function getBaseUrl(): string {\n return getClient().options.baseUrl\n}\n\nexport function getAuthedUrl(path: string): string {\n return getClient().buildAuthedUrl(path)\n}\n\nexport async function apiFetch<T>(path: string, init?: RequestInit): Promise<T> {\n return getClient().jsonFromInit<T>(path, init)\n}\n\nexport async function apiFetchText(path: string, init?: RequestInit): Promise<string> {\n return getClient().textFromInit(path, init)\n}\n\nexport async function apiFetchResponse(path: string, init?: RequestInit): Promise<Response> {\n return getClient().responseFromInit(path, init)\n}\n\nexport function getClient(): BladeClient {\n return getBootstrappedClient()\n}\n\nexport type { BladeClientOptions }\n"],"mappings":"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","names":["isRecord","attachments","contexts","type","r","toolCallId","create","r","create","r","create","create","create","isRecord","buildMessageContent","toolCall","create","create","create","extractModeFromBlocks","create","create","create","create","create","create","create","create","create","create","invalidateSkillStats","isRecord","extractModeFromBlocks","type","handle","create","create","create","create"]}