@blade-hq/agent-kit 0.4.13 → 0.4.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{SkillStatusBar-DhEw_C2P.d.ts → SkillStatusBar-DCOlTYcT.d.ts} +2 -2
- package/dist/{blade-client-Brjw8njI.d.ts → blade-client-BEjbedNc.d.ts} +4 -32
- package/dist/{chunk-6RVI56IR.js → chunk-47YVQZQ7.js} +2 -2
- package/dist/{chunk-6UVM6PBD.js → chunk-LKNU4NUC.js} +8 -2
- package/dist/chunk-LKNU4NUC.js.map +1 -0
- package/dist/{chunk-C34J6GD3.js → chunk-MOEPOLPQ.js} +10 -10
- package/dist/{chunk-UWUDHCVV.js → chunk-ROGNJYST.js} +4 -28
- package/dist/chunk-ROGNJYST.js.map +1 -0
- package/dist/{chunk-AGRVE5NY.js → chunk-WQYDTSSV.js} +2 -2
- package/dist/{chunk-JMNQIZOC.js → chunk-WZT2DOBJ.js} +2 -2
- package/dist/client/index.d.ts +4741 -2109
- package/dist/client/index.js +1 -3
- package/dist/react/api/vibe-coding.d.ts +3 -3
- package/dist/react/api/vibe-coding.js +2 -2
- package/dist/react/assets/file-icons/archive/7z.png +0 -0
- package/dist/react/assets/file-icons/archive/bz2.png +0 -0
- package/dist/react/assets/file-icons/archive/dmg.png +0 -0
- package/dist/react/assets/file-icons/archive/gz.png +0 -0
- package/dist/react/assets/file-icons/archive/iso.png +0 -0
- package/dist/react/assets/file-icons/archive/pkg.png +0 -0
- package/dist/react/assets/file-icons/archive/rar.png +0 -0
- package/dist/react/assets/file-icons/archive/tar.png +0 -0
- package/dist/react/assets/file-icons/archive/tgz.png +0 -0
- package/dist/react/assets/file-icons/archive/xz.png +0 -0
- package/dist/react/assets/file-icons/archive/zip.png +0 -0
- package/dist/react/assets/file-icons/audio/aac.png +0 -0
- package/dist/react/assets/file-icons/audio/aiff.png +0 -0
- package/dist/react/assets/file-icons/audio/flac.png +0 -0
- package/dist/react/assets/file-icons/audio/m4a.png +0 -0
- package/dist/react/assets/file-icons/audio/mid.png +0 -0
- package/dist/react/assets/file-icons/audio/mp3.png +0 -0
- package/dist/react/assets/file-icons/audio/ogg.png +0 -0
- package/dist/react/assets/file-icons/audio/wav.png +0 -0
- package/dist/react/assets/file-icons/code/c.png +0 -0
- package/dist/react/assets/file-icons/code/cpp.png +0 -0
- package/dist/react/assets/file-icons/code/cs.png +0 -0
- package/dist/react/assets/file-icons/code/css.png +0 -0
- package/dist/react/assets/file-icons/code/go.png +0 -0
- package/dist/react/assets/file-icons/code/h.png +0 -0
- package/dist/react/assets/file-icons/code/hpp.png +0 -0
- package/dist/react/assets/file-icons/code/html.png +0 -0
- package/dist/react/assets/file-icons/code/java.png +0 -0
- package/dist/react/assets/file-icons/code/js.png +0 -0
- package/dist/react/assets/file-icons/code/json.png +0 -0
- package/dist/react/assets/file-icons/code/jsx.png +0 -0
- package/dist/react/assets/file-icons/code/kt.png +0 -0
- package/dist/react/assets/file-icons/code/lock.png +0 -0
- package/dist/react/assets/file-icons/code/php.png +0 -0
- package/dist/react/assets/file-icons/code/py.png +0 -0
- package/dist/react/assets/file-icons/code/rb.png +0 -0
- package/dist/react/assets/file-icons/code/rs.png +0 -0
- package/dist/react/assets/file-icons/code/scss.png +0 -0
- package/dist/react/assets/file-icons/code/sh.png +0 -0
- package/dist/react/assets/file-icons/code/sql.png +0 -0
- package/dist/react/assets/file-icons/code/svelte.png +0 -0
- package/dist/react/assets/file-icons/code/swift.png +0 -0
- package/dist/react/assets/file-icons/code/toml.png +0 -0
- package/dist/react/assets/file-icons/code/ts.png +0 -0
- package/dist/react/assets/file-icons/code/tsx.png +0 -0
- package/dist/react/assets/file-icons/code/vue.png +0 -0
- package/dist/react/assets/file-icons/code/xml.png +0 -0
- package/dist/react/assets/file-icons/code/yaml.png +0 -0
- package/dist/react/assets/file-icons/code/yml.png +0 -0
- package/dist/react/assets/file-icons/code/zsh.png +0 -0
- package/dist/react/assets/file-icons/config/conf.png +0 -0
- package/dist/react/assets/file-icons/config/env.png +0 -0
- package/dist/react/assets/file-icons/config/ini.png +0 -0
- package/dist/react/assets/file-icons/data/db.png +0 -0
- package/dist/react/assets/file-icons/data/jsonl.png +0 -0
- package/dist/react/assets/file-icons/data/ndjson.png +0 -0
- package/dist/react/assets/file-icons/data/parquet.png +0 -0
- package/dist/react/assets/file-icons/data/plist.png +0 -0
- package/dist/react/assets/file-icons/data/sqlite.png +0 -0
- package/dist/react/assets/file-icons/design/blend.png +0 -0
- package/dist/react/assets/file-icons/design/fig.png +0 -0
- package/dist/react/assets/file-icons/design/sketch.png +0 -0
- package/dist/react/assets/file-icons/design/xd.png +0 -0
- package/dist/react/assets/file-icons/document/epub.png +0 -0
- package/dist/react/assets/file-icons/document/key.png +0 -0
- package/dist/react/assets/file-icons/document/log.png +0 -0
- package/dist/react/assets/file-icons/document/markdown.png +0 -0
- package/dist/react/assets/file-icons/document/md.png +0 -0
- package/dist/react/assets/file-icons/document/numbers.png +0 -0
- package/dist/react/assets/file-icons/document/pages.png +0 -0
- package/dist/react/assets/file-icons/document/pdf.png +0 -0
- package/dist/react/assets/file-icons/document/tex.png +0 -0
- package/dist/react/assets/file-icons/document/txt.png +0 -0
- package/dist/react/assets/file-icons/folder.png +0 -0
- package/dist/react/assets/file-icons/font/otf.png +0 -0
- package/dist/react/assets/file-icons/font/ttf.png +0 -0
- package/dist/react/assets/file-icons/font/woff.png +0 -0
- package/dist/react/assets/file-icons/font/woff2.png +0 -0
- package/dist/react/assets/file-icons/generic-file.png +0 -0
- package/dist/react/assets/file-icons/image/ai.png +0 -0
- package/dist/react/assets/file-icons/image/avif.png +0 -0
- package/dist/react/assets/file-icons/image/bmp.png +0 -0
- package/dist/react/assets/file-icons/image/gif.png +0 -0
- package/dist/react/assets/file-icons/image/heic.png +0 -0
- package/dist/react/assets/file-icons/image/heif.png +0 -0
- package/dist/react/assets/file-icons/image/ico.png +0 -0
- package/dist/react/assets/file-icons/image/jpeg.png +0 -0
- package/dist/react/assets/file-icons/image/jpg.png +0 -0
- package/dist/react/assets/file-icons/image/png.png +0 -0
- package/dist/react/assets/file-icons/image/psd.png +0 -0
- package/dist/react/assets/file-icons/image/svg.png +0 -0
- package/dist/react/assets/file-icons/image/tif.png +0 -0
- package/dist/react/assets/file-icons/image/tiff.png +0 -0
- package/dist/react/assets/file-icons/image/webp.png +0 -0
- package/dist/react/assets/file-icons/office/csv.png +0 -0
- package/dist/react/assets/file-icons/office/doc.png +0 -0
- package/dist/react/assets/file-icons/office/docx.png +0 -0
- package/dist/react/assets/file-icons/office/ppt.png +0 -0
- package/dist/react/assets/file-icons/office/pptx.png +0 -0
- package/dist/react/assets/file-icons/office/rtf.png +0 -0
- package/dist/react/assets/file-icons/office/tsv.png +0 -0
- package/dist/react/assets/file-icons/office/xls.png +0 -0
- package/dist/react/assets/file-icons/office/xlsx.png +0 -0
- package/dist/react/assets/file-icons/open-document/odg.png +0 -0
- package/dist/react/assets/file-icons/open-document/odp.png +0 -0
- package/dist/react/assets/file-icons/open-document/ods.png +0 -0
- package/dist/react/assets/file-icons/open-document/odt.png +0 -0
- package/dist/react/assets/file-icons/video/avi.png +0 -0
- package/dist/react/assets/file-icons/video/flv.png +0 -0
- package/dist/react/assets/file-icons/video/m4v.png +0 -0
- package/dist/react/assets/file-icons/video/mkv.png +0 -0
- package/dist/react/assets/file-icons/video/mov.png +0 -0
- package/dist/react/assets/file-icons/video/mp4.png +0 -0
- package/dist/react/assets/file-icons/video/webm.png +0 -0
- package/dist/react/assets/file-icons/video/wmv.png +0 -0
- package/dist/react/components/chat/index.d.ts +4 -4
- package/dist/react/components/chat/index.js +5 -5
- package/dist/react/components/plan/index.js +3 -3
- package/dist/react/components/session/index.d.ts +1 -1
- package/dist/react/components/session/index.js +3 -3
- package/dist/react/components/workspace/index.js +124 -121
- package/dist/react/components/workspace/index.js.map +1 -1
- package/dist/react/index.d.ts +532 -9
- package/dist/react/index.js +390 -13
- package/dist/react/index.js.map +1 -1
- package/dist/{session-C7m4f0Gl.d.ts → session-nZdIuWrS.d.ts} +2 -0
- package/package.json +1 -2
- package/dist/chunk-6UVM6PBD.js.map +0 -1
- package/dist/chunk-ACHKHQEO.js +0 -29
- package/dist/chunk-ACHKHQEO.js.map +0 -1
- package/dist/chunk-UWUDHCVV.js.map +0 -1
- package/dist/licenses-DZzDCfd0.d.ts +0 -16
- package/dist/react/api/licenses.d.ts +0 -7
- package/dist/react/api/licenses.js +0 -18
- package/dist/react/api/licenses.js.map +0 -1
- /package/dist/{chunk-6RVI56IR.js.map → chunk-47YVQZQ7.js.map} +0 -0
- /package/dist/{chunk-C34J6GD3.js.map → chunk-MOEPOLPQ.js.map} +0 -0
- /package/dist/{chunk-AGRVE5NY.js.map → chunk-WQYDTSSV.js.map} +0 -0
- /package/dist/{chunk-JMNQIZOC.js.map → chunk-WZT2DOBJ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
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/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}\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 },\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\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 postToParent(envelope: BladeBridgeEnvelope) {\n if (!isInsideIframe()) {\n return\n }\n\n tapBridgeEvent({\n side: \"agent\",\n direction: \"agent-to-host\",\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, \"\").trim(),\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, \"\").trim()\n if (remaining) cleanParts.push(remaining)\n } else {\n cleanParts.push(part.text)\n }\n }\n\n return { cleanText: cleanParts.join(\"\\n\").trim(), 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 { 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 useSessionStore\n .getState()\n .fetchSessions()\n .catch(() => {})\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 useSessionStore\n .getState()\n .fetchSessions()\n .catch(() => {})\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 void authApi.logout().catch(() => {})\n set({ token: null, socketAuthToken: null, user: null, error: null })\n agentSocket?.disconnect()\n useSessionStore.getState().reset()\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 /** Session IDs that were just created and haven't had their first history load yet */\n _freshSessions: Set<string>\n\n fetchSessions: () => Promise<void>\n createSession: (intent?: string) => Promise<string>\n registerCreatedSession: (session: SessionInfo, mode?: SessionMode) => 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 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 if (blocks.some((block) => block.type === \"planning_enter\")) return \"planning\"\n if (blocks.some((block) => block.type === \"planning_exit\")) return \"executing\"\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) {\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: new Set(state._freshSessions).add(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 _freshSessions: new Set(),\n\n fetchSessions: 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 .fetchSessions()\n .catch(() => {})\n return session_id\n },\n\n registerCreatedSession: (session, mode = DEFAULT_SESSION_MODE) => {\n registerCreatedSessionState(set, session, mode)\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().fetchSessions()\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 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 _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 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 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 if (blocks.some((block) => block.type === \"planning_enter\")) return \"planning\"\n if (blocks.some((block) => block.type === \"planning_exit\")) return \"executing\"\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 === \"planning_enter\" ||\n block.type === \"planning_exit\" ||\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 if (turn.blocks.some((block) => block.type === \"ask_user_answer\")) {\n return null\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\nfunction rebuildAgentLoops(turns: TurnProjection[]): Record<string, AgentLoopInfo> {\n const messages = turns.map(projectionToMessage).filter(Boolean) as ChatMessage[]\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 messages = turns\n .map(projectionToMessage)\n .filter((message): message is ChatMessage => message !== null)\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),\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 updateSessionState(state: ChatState, sessionId: string, turns: TurnProjection[]) {\n const orderedTurns = [...turns].sort((left, right) => left.sequence - right.sequence)\n const { messages, agentLoops, activeCompaction } = materialize(orderedTurns)\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]: 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: \"completed\",\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 const existing = [...(state.turns[sessionId] ?? [])]\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 get_skill_content: \"GetSkillContent\",\n glob: \"Glob\",\n grep: \"Grep\",\n list_skill_tools: \"ListSkillTools\",\n load_skill_tools: \"LoadSkillTools\",\n ls: \"Ls\",\n read: \"Read\",\n run_skill_tool: \"RunSkillTool\",\n search_skills: \"SearchSkills\",\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 SearchSkills: \"搜索技能\",\n GetSkillContent: \"读取技能\",\n ListSkillTools: \"查看工具列表\",\n LoadSkillTools: \"加载技能\",\n RunSkillTool: \"执行技能工具\",\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 SearchSkills: (n) => `搜索 ${n} 次技能`,\n GetSkillContent: (n) => `读取 ${n} 个技能`,\n ListSkillTools: (n) => `查看 ${n} 个工具列表`,\n RunSkillTool: (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\nconst FILE_PATH_PATTERN =\n /(?:^|[\\s\"'`::])([^\\s\"'`,;:)\\]},。;、]+?\\.[a-z0-9]{1,8})(?=$|[\\s\"'`,.;:)\\]},。;、])/i\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([\"RunSkillTool\", \"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\n/** Generic spec labels that should NOT be treated as per-call display names. */\nconst GENERIC_DISPLAY_NAMES = new Set(Object.values(TOOL_DISPLAY_LABELS))\n\nfunction getRunSkillDisplayName(\n toolCall: ToolCallInfo,\n args: Record<string, unknown> | null,\n): string {\n // Prefer per-call display name from arguments over the spec-level generic label.\n const argDisplayName = getStringArgValue(args, \"display_name\")\n if (argDisplayName) return argDisplayName\n\n // Only use toolCall.display_name if it's not a generic spec label\n const displayName = toolCall.display_name?.trim() ?? \"\"\n if (displayName && (displayName === \"写入文件\" || !GENERIC_DISPLAY_NAMES.has(displayName))) {\n return displayName\n }\n\n const argToolName = getStringArgValue(args, \"tool_name\")\n if (argToolName) return argToolName\n\n return \"\"\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\nfunction extractFilePathFromText(text: string): string | null {\n return text.match(FILE_PATH_PATTERN)?.[1] ?? null\n}\n\nfunction extractFilePathFromResult(result: unknown): string | null {\n if (typeof result === \"string\") {\n const parsed = safeParseJson(result)\n if (parsed != null && parsed !== result) {\n const found = extractFilePathFromResult(parsed)\n if (found) return found\n }\n return extractFilePathFromText(result)\n }\n if (Array.isArray(result)) {\n for (const item of result) {\n const found = extractFilePathFromResult(item)\n if (found) return found\n }\n return null\n }\n if (isPlainObject(result)) {\n for (const key of PRIORITY_FILE_KEYS) {\n const direct = findFileLikeValue(result[key], 0, true)\n if (direct) return direct\n }\n for (const nested of Object.values(result)) {\n const found = extractFilePathFromResult(nested)\n if (found) return found\n }\n }\n return null\n}\n\nfunction isWriteLikeRunSkillTool(label: string, args: Record<string, unknown> | null): boolean {\n const normalizedLabel = label.trim()\n if (normalizedLabel === \"写入文件\" || /write/i.test(normalizedLabel)) return true\n\n const toolName = getStringArgValue(args, \"tool_name\")\n if (/write/i.test(toolName)) return true\n\n return false\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 * Uses tool arguments to provide specific context (e.g., skill name, file path).\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 switch (normalized) {\n case \"RunSkillTool\": {\n const runSkillDisplayName = getRunSkillDisplayName(toolCall, args)\n if (runSkillDisplayName) {\n const filePath = extractToolFilePath(toolCall)\n if (filePath && isWriteLikeRunSkillTool(runSkillDisplayName, args)) {\n return `${runSkillDisplayName}「${formatFileName(filePath)}」`\n }\n return runSkillDisplayName\n }\n return \"执行技能工具\"\n }\n case \"Bash\": {\n const description = getCommandDescription(args)\n return description || \"执行命令行操作\"\n }\n case \"BgBash\": {\n const description = getCommandDescription(args)\n return description ? `后台执行:${description}` : \"后台执行命令\"\n }\n case \"Ls\": {\n const path = args && typeof args.path === \"string\" ? args.path : \"\"\n return path ? `${baseLabel}「${path}」` : baseLabel\n }\n case \"Glob\": {\n const pattern = args && typeof args.pattern === \"string\" ? args.pattern : \"\"\n return pattern ? `${baseLabel}「${pattern}」` : baseLabel\n }\n case \"Grep\": {\n const pattern = args && typeof args.pattern === \"string\" ? args.pattern : \"\"\n return pattern ? `${baseLabel}「${pattern}」` : baseLabel\n }\n case \"WebSearch\":\n case \"WebFetch\": {\n const query = args && typeof args.query === \"string\" ? args.query : \"\"\n return query ? `${baseLabel}「${query}」` : baseLabel\n }\n case \"GetSkillContent\": {\n const skillName =\n args && typeof args.skill_id === \"string\"\n ? args.skill_id\n : args && typeof args.skill_name === \"string\"\n ? args.skill_name\n : \"\"\n return skillName ? `${baseLabel}「${skillName}」` : baseLabel\n }\n case \"SearchSkills\": {\n const query = args && typeof args.query === \"string\" ? args.query : \"\"\n return query ? `${baseLabel}「${query}」` : baseLabel\n }\n case \"ListSkillTools\": {\n const skillId = args && typeof args.skill_id === \"string\" ? args.skill_id : \"\"\n return skillId ? `${baseLabel}「${skillId}」` : baseLabel\n }\n case \"LoadSkillTools\":\n return \"加载技能\"\n case \"FinishTask\": {\n const title = args && typeof args.title === \"string\" ? args.title : \"\"\n return title ? `${baseLabel}:${title}` : baseLabel\n }\n default:\n return baseLabel\n }\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 } else if (formattedName === \"RunSkillTool\") {\n filePath = findFileLikeValue(argsValue) ?? extractFilePathFromResult(toolCall.result)\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 === \"RunSkillTool\") {\n const runSkillDisplayName = getRunSkillDisplayName(toolCall, args)\n const filePath = extractToolFilePath(toolCall)\n if (filePath && isWriteLikeRunSkillTool(runSkillDisplayName, args)) {\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: `📄 ${formatFileName(filePath)}`,\n tone: \"blue\",\n })\n continue\n }\n individualTags.push({\n key: `${individualTags.length}-${toolCall.id}`,\n label: runSkillDisplayName || \"执行技能工具\",\n tone: \"emerald\",\n })\n continue\n }\n\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\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 /** All open artifact tabs */\n artifacts: PreviewTarget[]\n /** Index of the active tab (-1 if none) */\n activeArtifactIndex: number\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 /** 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 next = state.artifacts.filter((_: PreviewTarget, i: number) => i !== index)\n let nextActive = state.activeArtifactIndex\n\n if (next.length === 0) {\n return { artifacts: [], activeArtifactIndex: -1, rightPanelCollapsed: true }\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 return { artifacts: next, activeArtifactIndex: nextActive }\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 ? { rightPanelCollapsed: false, activeRightTab: \"preview\" as const } : {}),\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 artifacts: [],\n activeArtifactIndex: -1,\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) => set({ activeRightTab: tab }),\n\n pushArtifact: (target) => set((state) => upsertArtifactState(state, target)),\n\n upsertArtifact: (target, options) => set((state) => upsertArtifactState(state, target, options)),\n\n setActiveArtifact: (index) => set({ activeArtifactIndex: index }),\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: () => set({ artifacts: [], activeArtifactIndex: -1 }),\n\n setPreviewTarget: (target: PreviewTarget | null) =>\n set(() => {\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 }\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 setTasks: (sessionId: string, tasks: BackgroundTask[]) => void\n upsertTask: (sessionId: string, task: BackgroundTask) => void\n selectTask: (sessionId: string, taskId: string | null) => void\n}\n\nexport const useBackgroundStore = create<BackgroundState>()((set) => ({\n ...createClientActions(set),\n tasks: {},\n selectedTaskId: {},\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","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 { postToParent } from \"../lib/parent-bridge\"\nimport { buildToolPreviewKey } from \"../lib/tool-preview\"\nimport { isUiMeta } from \"../lib/ui-meta\"\nimport type { MessageContent, ToolBridgeContent } from \"../schemas/message\"\nimport type { ContentBlock, PatchEnvelope, TurnProjection } from \"../schemas/projection\"\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\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\nfunction shouldSuppressOptimisticUserMessage(\n sessionId: string,\n askuserAnswer?: Record<string, unknown>,\n): boolean {\n if (askuserAnswer && typeof askuserAnswer.tool_call_id === \"string\") {\n return true\n }\n const session = useSessionStore.getState().sessions.find((item) => item.id === sessionId)\n if (session?.status !== \"waiting_for_input\") {\n return false\n }\n const messages = useChatStore.getState().messages[sessionId] ?? []\n return messages.some((message) =>\n (message.tool_calls ?? []).some((toolCall) => toolCall.status === \"awaiting_answer\"),\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 if (blocks.some((block) => block.type === \"planning_enter\")) return \"planning\"\n if (blocks.some((block) => block.type === \"planning_exit\")) return \"executing\"\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 isGisTargetListPayload(value: unknown): value is { targets: unknown[] } {\n return isRecord(value) && Array.isArray(value.targets)\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 previewArtifactsByToolCall = new Map<string, 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\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 _bindStoreHandlers() {\n const s = this.socket\n\n const applyTurn = (sessionId: string, turn: TurnProjection) => {\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 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 useChatStore.getState().applyTurnPatch(sessionId, data)\n if (data.data.workspace_changed) {\n notifyWorkspaceFilesChanged(sessionId)\n }\n const turn = data.data.turn\n if (!turn) return\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: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(\"chat:start\", (data?: { session_id?: string }) => {\n const sessionId = this._resolveSessionId(data)\n if (!sessionId) return\n useSessionStore.getState().updateSessionStatus(sessionId, \"running\")\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 const status = data?.status ?? \"completed\"\n useSessionStore.getState().updateSessionStatus(\n sessionId,\n status === \"paused\"\n ? \"waiting_for_input\"\n : status === \"interrupted\"\n ? \"interrupted\"\n : status === \"failed\"\n ? \"failed\"\n : \"completed\",\n )\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 invalidateContextStats(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 const message = isOomText(data.message) ? OOM_MESSAGE : data.message\n useSessionStore.getState().updateSessionStatus(sessionId, \"failed\")\n useChatStore.getState().markFailed(sessionId)\n useChatStore.getState().addErrorMessage(sessionId, message)\n useChatStore.getState().setStreaming(sessionId, false)\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 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 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 (\"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 so history reload can re-infer it\n const { modes, ...rest } = useSessionStore.getState()\n const { [sessionId]: _, ...restModes } = modes\n useSessionStore.setState({ ...rest, modes: restModes })\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 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 if (data.session_id != null && data.session_id === this.subscribedSession) {\n useUiStore.getState().setActiveRightTab(\"preview\")\n }\n useUiStore.getState().pushArtifact({\n type,\n content,\n sourceUrl: type === \"ppt\" ? fileUrl : undefined,\n title: data.title,\n key: data.file_path,\n revision: Date.now(),\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 })\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 (data.old_string != null && data.new_string != null) {\n useUiStore.getState().pushArtifact({\n type: \"diff\",\n content: data.new_string,\n oldContent: data.old_string,\n title: data.title,\n key: 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 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 this.socket.emit(\"session:subscribe\", { session_id: sessionId })\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 postToParent({\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 })\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 _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 })\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 useUiStore.getState().clearArtifacts()\n useCardStateStore.getState().clearAllStates()\n }\n this.socket.emit(\"session:subscribe\", { session_id: sessionId })\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 }\n this.previewArtifactsByToolCall.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 */\n attachSession(sessionId: string) {\n this.socket.emit(\"session:subscribe\", { session_id: sessionId })\n }\n\n send(\n sessionId: string,\n message: MessageContent,\n mode?: string,\n askuserAnswer?: Record<string, unknown>,\n extras?: {\n model?: string\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 const suppressOptimisticUserMessage = shouldSuppressOptimisticUserMessage(\n sessionId,\n askuserAnswer,\n )\n if (!suppressOptimisticUserMessage) {\n useChatStore.getState().addUserMessage(sessionId, message)\n }\n useChatStore.getState().setStreaming(sessionId, true)\n // Optimistically update askAnswers so live multi-turn AskUserQuestion\n // sessions keep previously answered cards in answered state.\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 if (!suppressOptimisticUserMessage) {\n useRuntimeStore.getState().addEvent(sessionId, {\n type: \"chat:start\",\n title: \"User prompt sent\",\n status: \"running\",\n detail: contentPreview(message),\n })\n }\n if (!extras?.replay_decision) {\n this.pendingReplayMessages.set(sessionId, message)\n this.pendingReplayModes.set(sessionId, mode)\n }\n this.socket.emit(\"chat:send\", {\n session_id: sessionId,\n message,\n mode,\n askuser_answer: askuserAnswer,\n model: extras?.model,\n whatif: extras?.whatif,\n replay_decision: extras?.replay_decision,\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 stop(sessionId: string) {\n this.socket.emit(\"chat:stop\", { session_id: sessionId })\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","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 setFeatures: (features: {\n asrEnabled?: boolean\n asrProvider?: AsrProvider\n publicSharingEnabled?: boolean\n memoryEnabled?: 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 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 })),\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","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","create","create","create","create"]}
|