@blade-hq/agent-kit 1.0.29 → 1.0.30
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/{chunk-N2OE5MVV.js → chunk-3XDPNPE3.js} +5 -5
- package/dist/{chunk-HCQDDDOX.js → chunk-6G5LCDOS.js} +2 -2
- package/dist/{chunk-YXHPJGXR.js → chunk-7OEW3P7R.js} +120 -27
- package/dist/chunk-7OEW3P7R.js.map +1 -0
- package/dist/{chunk-YJ6BX3FU.js → chunk-GAVSC2AW.js} +4 -2
- package/dist/chunk-GAVSC2AW.js.map +1 -0
- package/dist/{chunk-TVWC3PED.js → chunk-L4C2TY6S.js} +2 -2
- package/dist/{chunk-PYYDXV2A.js → chunk-MJPVAXJN.js} +2 -2
- package/dist/{chunk-UWNQ4PXK.js → chunk-WOKDHXS7.js} +29 -2
- package/dist/chunk-WOKDHXS7.js.map +1 -0
- package/dist/client/index.js +1 -1
- package/dist/client/resources/sessions.d.ts +2 -0
- package/dist/client/types/rest.d.ts +639 -92
- package/dist/react/api/model-config.d.ts +8 -11
- package/dist/react/api/published-apps.js +3 -3
- package/dist/react/api/sessions.js +2 -2
- package/dist/react/components/chat/index.js +5 -5
- package/dist/react/components/markdown/ExternalLinkDialog.d.ts +3 -1
- package/dist/react/components/plan/index.js +4 -4
- package/dist/react/components/session/index.js +3 -3
- package/dist/react/components/workspace/index.js +3 -3
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.js +18 -8
- package/dist/react/index.js.map +1 -1
- package/dist/react/schemas/session.d.ts +4 -0
- package/dist/react/sockets/event-bridge.d.ts +6 -0
- package/dist/react/stores/ui-store.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-UWNQ4PXK.js.map +0 -1
- package/dist/chunk-YJ6BX3FU.js.map +0 -1
- package/dist/chunk-YXHPJGXR.js.map +0 -1
- /package/dist/{chunk-N2OE5MVV.js.map → chunk-3XDPNPE3.js.map} +0 -0
- /package/dist/{chunk-HCQDDDOX.js.map → chunk-6G5LCDOS.js.map} +0 -0
- /package/dist/{chunk-TVWC3PED.js.map → chunk-L4C2TY6S.js.map} +0 -0
- /package/dist/{chunk-PYYDXV2A.js.map → chunk-MJPVAXJN.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/rest.ts","../src/client/resources/api-keys.ts","../src/client/resources/app-dev-templates.ts","../src/client/resources/auth.ts","../src/client/resources/env-buckets.ts","../src/client/resources/gis.ts","../src/client/resources/headless.ts","../src/client/resources/memories.ts","../src/client/resources/models.ts","../src/react/schemas/published-apps.ts","../src/client/resources/published-apps.ts","../src/client/resources/registry.ts","../src/client/shared/projection/helpers.ts","../src/react/schemas/message.ts","../src/client/shared/projection/state.ts","../src/client/shared/projection/builder.ts","../src/client/shared/projection/history.ts","../src/client/resources/runs.ts","../src/client/resources/scenarios.ts","../src/client/resources/sessions.ts","../src/client/resources/skills.ts","../src/client/resources/solutions.ts","../src/client/resources/user-preferences.ts","../src/client/socket.ts","../src/client/auth.ts","../src/client/blade-client.ts"],"sourcesContent":["export class BladeApiError extends Error {\n readonly response: Response\n readonly status: number\n readonly statusText: string\n\n constructor(response: Response, message?: string) {\n super(message ?? `请求失败(${response.status} ${response.statusText})`)\n this.name = \"BladeApiError\"\n this.response = response\n this.status = response.status\n this.statusText = response.statusText\n }\n}\n\n/**\n * 从 FastAPI 风格的错误响应中提取 detail 字段,作为用户可读的中文错误文案。\n * 失败时返回 undefined,调用方会回退到默认提示。\n */\nexport async function extractErrorDetail(response: Response): Promise<string | undefined> {\n try {\n const cloned = response.clone()\n const contentType = cloned.headers.get(\"content-type\") ?? \"\"\n if (contentType.includes(\"application/json\")) {\n const data = (await cloned.json()) as { detail?: unknown }\n const detail = data?.detail\n if (typeof detail === \"string\" && detail.trim()) return detail\n if (Array.isArray(detail) && detail.length > 0) {\n const first = detail[0] as { msg?: unknown }\n if (first && typeof first.msg === \"string\") return first.msg\n }\n } else {\n const text = (await cloned.text()).trim()\n if (text) return text\n }\n } catch {\n // 读取失败时忽略,使用默认提示\n }\n return undefined\n}\n\nexport type HttpMethod = \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\" | \"PUT\" | (string & {})\n\nexport interface BladeFetchInit {\n body?: BodyInit | null\n credentials?: RequestCredentials\n expectOk?: boolean\n headers?: HeadersInit\n signal?: AbortSignal | null\n}\n","import { BladeApiError } from \"../rest\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport interface ApiKeyPublic {\n id: string\n name: string\n masked: string\n created_at: string\n last_used_at: string | null\n /**\n * 完整 key 原文。后端按 #761 设计存明文,支持反复获取;存量 hash-only 行为 null。\n */\n plaintext: string | null\n /**\n * 只读行(如经 bo 经纪人下发的 GIT_ACCESS_TOKEN):UI 只给复制,不给改名/撤销。\n */\n readonly?: boolean\n}\n\nexport interface ApiKeyCreateResponse {\n key: ApiKeyPublic\n plaintext: string\n}\n\nexport class ApiKeysResource {\n constructor(private client: BladeClient) {}\n\n listApiKeys(): Promise<ApiKeyPublic[]> {\n return this.client.json(\"GET\", \"/api/user/api-keys/\")\n }\n\n createApiKey(name: string): Promise<ApiKeyCreateResponse> {\n return this.client.json(\"POST\", \"/api/user/api-keys/\", { name })\n }\n\n renameApiKey(id: string, name: string): Promise<ApiKeyPublic> {\n return this.client.json(\"PATCH\", `/api/user/api-keys/${encodeURIComponent(id)}`, { name })\n }\n\n async deleteApiKey(id: string): Promise<void> {\n try {\n await this.client.json(\"DELETE\", `/api/user/api-keys/${encodeURIComponent(id)}`)\n } catch (err) {\n if (err instanceof BladeApiError) {\n const detail = await readErrorDetail(err.response)\n if (detail) {\n throw new Error(detail)\n }\n }\n throw err\n }\n }\n}\n\nasync function readErrorDetail(response: Response): Promise<string | null> {\n try {\n const data = await response.clone().json()\n const detail = data?.detail\n return typeof detail === \"string\" && detail.trim() ? detail : null\n } catch {\n return null\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface AppDevTemplateCategory {\n id: string\n label: string\n}\n\nexport interface AppDevTemplateBadge {\n text: string | null\n color: string | null\n}\n\nexport interface AppDevTemplateMeta {\n stack: string[]\n fit: string[]\n tags: string[]\n difficulty: string | null\n estimated_minutes: number | null\n author: string | null\n updated_at: string | null\n}\n\nexport interface AppDevTemplateCoverImage {\n path: string | null\n alt: string | null\n}\n\nexport interface AppDevTemplateDemoVideo {\n path: string | null\n mime_type: string | null\n size_bytes: number | null\n duration_seconds: number | null\n poster: string | null\n title: string | null\n description: string | null\n}\n\nexport interface AppDevTemplateScreenshot {\n path: string | null\n title: string | null\n}\n\nexport interface AppDevTemplateMedia {\n cover: AppDevTemplateCoverImage | null\n demo_video: AppDevTemplateDemoVideo | null\n screenshots: AppDevTemplateScreenshot[]\n}\n\nexport interface AppDevTemplateUsageStep {\n step: number\n title: string\n description: string | null\n}\n\nexport interface AppDevTemplateAgent {\n key: string | null\n name: string\n role: string | null\n description: string | null\n default: boolean\n}\n\nexport interface AppDevTemplateOutput {\n type: string | null\n name: string\n description: string | null\n}\n\nexport interface AppDevTemplateSummary {\n slug: string\n title: string\n summary: string\n category: AppDevTemplateCategory\n badge: AppDevTemplateBadge | null\n meta: AppDevTemplateMeta\n cover: string | null\n order: number\n}\n\nexport interface AppDevTemplateDetail extends AppDevTemplateSummary {\n description: string\n media: AppDevTemplateMedia\n included: string[]\n usage_steps: AppDevTemplateUsageStep[]\n creation: Record<string, unknown> | null\n capabilities: string[]\n agents: AppDevTemplateAgent[]\n outputs: AppDevTemplateOutput[]\n}\n\nexport interface AppDevTemplateListResponse {\n items: AppDevTemplateSummary[]\n total: number\n offset: number\n limit: number\n}\n\nexport class AppDevTemplatesResource {\n constructor(private client: BladeClient) {}\n\n list(params?: { offset?: number; limit?: number }): Promise<AppDevTemplateListResponse> {\n const query = new URLSearchParams()\n if (typeof params?.offset === \"number\") query.set(\"offset\", String(params.offset))\n if (typeof params?.limit === \"number\") query.set(\"limit\", String(params.limit))\n const suffix = query.toString() ? `?${query.toString()}` : \"\"\n return this.client.json(\"GET\", `/api/app-dev/templates${suffix}`)\n }\n\n get(slug: string): Promise<AppDevTemplateDetail> {\n return this.client.json(\"GET\", `/api/app-dev/templates/${encodeURIComponent(slug)}`)\n }\n\n getMediaUrl(slug: string, path: string): string {\n const encodedPath = path\n .split(\"/\")\n .map((part) => encodeURIComponent(part))\n .join(\"/\")\n return this.client.buildAuthedUrl(\n `/api/app-dev/templates/${encodeURIComponent(slug)}/media/${encodedPath}`,\n )\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface UserInfo {\n id: string\n username: string\n display_name?: string | null\n avatar_url: string | null\n token: string\n auth_type: \"casdoor\"\n is_admin?: boolean\n}\n\nexport interface ProvidersResponse {\n providers: Array<{\n name: string\n authorize_url: string\n }>\n password_enabled: boolean\n}\n\nexport class AuthResource {\n constructor(private client: BladeClient) {}\n\n getProviders(): Promise<ProvidersResponse> {\n return this.client.json(\"GET\", \"/api/auth/providers\")\n }\n\n getMe(): Promise<UserInfo> {\n return this.client.json(\"GET\", \"/api/auth/me\")\n }\n\n logout(): Promise<{ logout_url: string }> {\n return this.client.json(\"POST\", \"/api/auth/logout\")\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface EnvBucket {\n bucket: string\n env: Record<string, string>\n}\n\nexport interface PlatformEnvBucket {\n env: Record<string, string>\n}\n\nexport class EnvBucketsResource {\n constructor(private client: BladeClient) {}\n\n // 当前用户的所有桶(global + 各 skill)\n listEnvBuckets(): Promise<EnvBucket[]> {\n return this.client.json(\"GET\", \"/api/user/env-buckets\")\n }\n\n getEnvBucket(bucket: string): Promise<EnvBucket> {\n return this.client.json(\"GET\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`)\n }\n\n setEnvBucket(bucket: string, env: Record<string, string>): Promise<EnvBucket> {\n return this.client.json(\"PUT\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`, { env })\n }\n\n async deleteEnvBucket(bucket: string): Promise<void> {\n await this.client.json(\"DELETE\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`)\n }\n\n // 平台桶(仅 admin 可写,所有用户共享)\n getPlatformEnv(): Promise<PlatformEnvBucket> {\n return this.client.json(\"GET\", \"/api/admin/env/global\")\n }\n\n // 平台桶只读视图:所有登录用户可读,用于「我的」面板显示平台默认值。\n getPlatformEnvReadonly(): Promise<PlatformEnvBucket> {\n return this.client.json(\"GET\", \"/api/env/platform\")\n }\n\n setPlatformEnv(env: Record<string, string>): Promise<PlatformEnvBucket> {\n return this.client.json(\"PUT\", \"/api/admin/env/global\", { env })\n }\n\n async deletePlatformEnv(): Promise<void> {\n await this.client.json(\"DELETE\", \"/api/admin/env/global\")\n }\n}\n","import type { GisState, RuntimeConfig } from \"../../react/schemas/gis\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport class GisResource {\n constructor(private client: BladeClient) {}\n\n fetchGisState(sessionId: string, init?: RequestInit): Promise<GisState> {\n return this.client.jsonFromInit(`/api/gis/${sessionId}/state`, init)\n }\n\n fetchRuntimeConfig(init?: RequestInit): Promise<RuntimeConfig> {\n return this.client.jsonFromInit(\"/api/config\", init)\n }\n}\n","import type { BladeClient } from \"../blade-client\"\nimport type { ChatEndPayload, ChatSendPayload, ChatStartPayload, SystemErrorPayload } from \"../types/socket-events\"\n\nexport type JsonSchemaObject = Record<string, unknown>\n\nexport interface HeadlessRunOptions {\n schema?: JsonSchemaObject | null\n model?: string | null\n timeoutMs?: number\n}\n\nexport interface HeadlessRunInSessionResult<T = unknown> {\n session_id: string\n chat_run_id: string | null\n result: T | string\n}\n\nexport class HeadlessError extends Error {\n constructor(\n message: string,\n readonly detail?: unknown,\n ) {\n super(message)\n this.name = \"HeadlessError\"\n }\n}\n\nconst SYSTEM_ERROR_CHAT_END_GRACE_MS = 1_000\n\nexport class HeadlessResource {\n constructor(private client: BladeClient) {}\n\n async run<T = unknown>(prompt: string, options: HeadlessRunOptions & { schema: JsonSchemaObject }): Promise<T>\n async run(prompt: string, options?: HeadlessRunOptions): Promise<string>\n async run<T = unknown>(prompt: string, options: HeadlessRunOptions = {}): Promise<T | string> {\n const { session_id } = await this.client.sessions.createSessionWithRequest({\n intent: prompt,\n model: options.model ?? null,\n })\n return this.runTracked<T>(session_id, prompt, options, false) as Promise<T | string>\n }\n\n async runInSession<T = unknown>(\n sessionId: string,\n prompt: string,\n options: HeadlessRunOptions & { schema: JsonSchemaObject },\n ): Promise<T>\n async runInSession(sessionId: string, prompt: string, options?: HeadlessRunOptions): Promise<string>\n async runInSession<T = unknown>(\n sessionId: string,\n prompt: string,\n options: HeadlessRunOptions = {},\n ): Promise<T | string> {\n return this.runTracked<T>(sessionId, prompt, options, false) as Promise<T | string>\n }\n\n async runWithSession<T = unknown>(\n prompt: string,\n options: HeadlessRunOptions & { schema: JsonSchemaObject },\n ): Promise<HeadlessRunInSessionResult<T>>\n async runWithSession(prompt: string, options?: HeadlessRunOptions): Promise<HeadlessRunInSessionResult<string>>\n async runWithSession<T = unknown>(\n prompt: string,\n options: HeadlessRunOptions = {},\n ): Promise<HeadlessRunInSessionResult<T>> {\n const { session_id } = await this.client.sessions.createSessionWithRequest({\n intent: prompt,\n model: options.model ?? null,\n })\n return this.runTracked<T>(session_id, prompt, options, true) as Promise<HeadlessRunInSessionResult<T>>\n }\n\n private async runTracked<T = unknown>(\n sessionId: string,\n prompt: string,\n options: HeadlessRunOptions,\n returnEnvelope: boolean,\n ): Promise<T | string | HeadlessRunInSessionResult<T>> {\n const timeoutMs = options.timeoutMs ?? 300_000\n const session_id = sessionId\n const socket = this.client.socket()\n await ensureSocketConnected(socket, timeoutMs, { session_id })\n\n return new Promise<T | string | HeadlessRunInSessionResult<T>>((resolve, reject) => {\n let settled = false\n let stopSent = false\n let started = false\n let chatRunId: string | null = null\n let systemErrorTimeout: ReturnType<typeof setTimeout> | null = null\n const timeout = setTimeout(() => {\n fail(new HeadlessError(`headless run timed out after ${timeoutMs}ms`, { session_id, chat_run_id: chatRunId }))\n }, timeoutMs)\n\n const cleanup = (sendStop: boolean) => {\n clearTimeout(timeout)\n if (systemErrorTimeout) {\n clearTimeout(systemErrorTimeout)\n systemErrorTimeout = null\n }\n socket.off(\"chat:start\", onChatStart)\n socket.off(\"chat:end\", onChatEnd)\n socket.off(\"system:error\", onSystemError)\n if (sendStop && !stopSent) {\n stopSent = true\n socket.emit(\"chat:stop\", { session_id }, () => undefined)\n }\n socket.emit(\"session:unsubscribe\", { session_id })\n }\n\n const finish = (value: T | string) => {\n if (settled) return\n settled = true\n cleanup(false)\n if (returnEnvelope) {\n resolve({ session_id, chat_run_id: chatRunId, result: value })\n return\n }\n resolve(value)\n }\n const fail = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(true)\n reject(error)\n }\n const failWithoutStop = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(false)\n reject(error)\n }\n const rejectAfterChatEnd = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(false)\n reject(error)\n }\n\n function onChatStart(payload: ChatStartPayload) {\n if (payload.session_id && payload.session_id !== session_id) return\n started = true\n }\n\n function onSystemError(payload: SystemErrorPayload) {\n if (payload.session_id !== session_id) return\n if (!started) {\n failWithoutStop(new HeadlessError(payload.message || \"headless run failed\", {\n session_id,\n chat_run_id: chatRunId,\n event: payload,\n }))\n return\n }\n if (systemErrorTimeout) {\n clearTimeout(systemErrorTimeout)\n }\n systemErrorTimeout = setTimeout(() => {\n systemErrorTimeout = null\n fail(new HeadlessError(payload.message || \"headless run failed\", {\n session_id,\n chat_run_id: chatRunId,\n event: payload,\n }))\n }, SYSTEM_ERROR_CHAT_END_GRACE_MS)\n }\n\n function onChatEnd(payload: ChatEndPayload) {\n if (payload.session_id && payload.session_id !== session_id) return\n chatRunId = typeof payload.chat_run_id === \"string\" ? payload.chat_run_id : chatRunId\n const result = payload.result\n if (payload.status === \"failed\") {\n rejectAfterChatEnd(new HeadlessError(errorMessageFromResult(result) ?? \"headless run failed\", {\n session_id,\n chat_run_id: chatRunId,\n event: payload,\n }))\n return\n }\n try {\n finish(normalizeResult<T>(result, Boolean(options.schema)))\n } catch (error) {\n rejectAfterChatEnd(error)\n }\n }\n\n socket.on(\"chat:start\", onChatStart)\n socket.on(\"chat:end\", onChatEnd)\n socket.on(\"system:error\", onSystemError)\n socket.emit(\"session:subscribe\", { session_id, event_format: \"raw\" })\n socket.emit(\"chat:send\", {\n session_id,\n message: prompt as unknown as ChatSendPayload[\"message\"],\n headless: true,\n output_schema: options.schema ?? null,\n model: options.model ?? null,\n })\n })\n }\n}\n\nfunction normalizeResult<T>(result: unknown, hasSchema: boolean): T | string {\n if (!isRecord(result)) {\n throw new HeadlessError(\"headless run finished without a result\", result)\n }\n const errMsg = typeof result.err_msg === \"string\" ? result.err_msg : \"\"\n if (errMsg) {\n throw new HeadlessError(errMsg, result)\n }\n if (!hasSchema) {\n const text = result.result\n return typeof text === \"string\" ? text : String(text ?? \"\")\n }\n const { err_msg: _errMsg, ...businessResult } = result\n return businessResult as T\n}\n\nfunction errorMessageFromResult(result: unknown): string | null {\n if (isRecord(result) && typeof result.err_msg === \"string\" && result.err_msg) {\n return result.err_msg\n }\n return null\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction ensureSocketConnected(\n socket: ReturnType<BladeClient[\"socket\"]>,\n timeoutMs: number,\n detail: Record<string, unknown>,\n): Promise<void> {\n if (socket.connected) {\n return Promise.resolve()\n }\n return new Promise((resolve, reject) => {\n let settled = false\n const timeout = setTimeout(() => {\n finish(() => reject(new HeadlessError(`socket connection timed out after ${timeoutMs}ms`, detail)))\n }, timeoutMs)\n const onConnect = () => finish(resolve)\n const onConnectError = (error: unknown) => {\n finish(() => reject(new HeadlessError(\"socket connection failed\", { ...detail, event: error })))\n }\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n clearTimeout(timeout)\n socket.off(\"connect\", onConnect)\n socket.off(\"connect_error\", onConnectError)\n callback()\n }\n socket.on(\"connect\", onConnect)\n socket.on(\"connect_error\", onConnectError)\n socket.connect()\n })\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface Memory {\n id: number\n type: \"feedback\" | \"experience\"\n content: string\n skill_name: string | null\n record_type: \"memory\" | \"skill_comment\" | null\n scope: string | null\n owner: string | null\n topic: string | null\n mem0_id: string | null\n superseded_by: number | null\n write_reason: string | null\n created_at: string\n updated_at: string | null\n hit_count: number\n last_hit_at: string | null\n disabled: boolean\n source_session: string\n}\n\nexport interface MemoryListResponse {\n items: Memory[]\n total: number\n}\n\nexport interface MemoryListParams {\n keyword?: string\n skill_name?: string\n type?: string\n record_type?: string\n scope?: string\n owner?: string\n topic?: string\n status?: string\n offset?: number\n limit?: number\n}\n\nexport interface MemoryCreateBody {\n content: string\n type?: \"feedback\" | \"experience\"\n skill_name?: string | null\n record_type?: \"memory\" | \"skill_comment\" | null\n scope?: string | null\n owner?: string | null\n topic?: string | null\n mem0_id?: string | null\n write_reason?: string | null\n}\n\nexport class MemoriesResource {\n constructor(private client: BladeClient) {}\n\n createMemory(body: MemoryCreateBody): Promise<Memory> {\n return this.client.json(\"POST\", \"/api/memories\", body)\n }\n\n listMemories(params?: MemoryListParams): Promise<MemoryListResponse> {\n const search = new URLSearchParams()\n if (params?.keyword) search.set(\"keyword\", params.keyword)\n if (params?.skill_name != null) search.set(\"skill_name\", params.skill_name)\n if (params?.type) search.set(\"type\", params.type)\n if (params?.record_type) search.set(\"record_type\", params.record_type)\n if (params?.scope) search.set(\"scope\", params.scope)\n if (params?.owner) search.set(\"owner\", params.owner)\n if (params?.topic) search.set(\"topic\", params.topic)\n if (params?.status) search.set(\"status\", params.status)\n if (params?.offset !== undefined) search.set(\"offset\", String(params.offset))\n if (params?.limit !== undefined) search.set(\"limit\", String(params.limit))\n const qs = search.toString()\n return this.client.json(\"GET\", `/api/memories${qs ? `?${qs}` : \"\"}`)\n }\n\n getMemory(id: number): Promise<Memory> {\n return this.client.json(\"GET\", `/api/memories/${id}`)\n }\n\n updateMemory(id: number, body: Partial<MemoryCreateBody>): Promise<Memory> {\n return this.client.json(\"PUT\", `/api/memories/${id}`, body)\n }\n\n patchMemory(id: number, disabled: boolean): Promise<Memory> {\n return this.client.json(\"PATCH\", `/api/memories/${id}`, { disabled })\n }\n\n deleteMemory(id: number): Promise<{ ok: boolean }> {\n return this.client.json(\"DELETE\", `/api/memories/${id}`)\n }\n\n batchMemories(\n action: \"delete\" | \"disable\" | \"enable\",\n ids: number[],\n ): Promise<{ ok: boolean; count: number }> {\n return this.client.json(\"POST\", \"/api/memories/batch\", { action, ids })\n }\n}\n","import { type } from \"arktype\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport const ModelOption = type({\n id: \"string\",\n label: \"string\",\n \"inputModalities?\": \"string[]\",\n \"supportsImage?\": \"boolean\",\n \"thinkingAvailable?\": \"boolean\",\n})\nexport type ModelOption = typeof ModelOption.infer\n\nexport const ModelsConfig = type({\n default: \"string\",\n \"thinkingAvailable?\": \"boolean\",\n models: ModelOption.array(),\n})\n\nexport type ModelsConfig = typeof ModelsConfig.infer\n\nexport class ModelsResource {\n constructor(private client: BladeClient) {}\n\n async getModelsConfig(init?: RequestInit): Promise<ModelsConfig> {\n const data = await this.client.jsonFromInit<unknown>(\"/api/config/models\", init)\n return ModelsConfig.assert(data)\n }\n}\n","import { type } from \"arktype\"\n\nexport const PublishedAppStatus = type(\"'running' | 'restarting' | 'exited'\")\nexport type PublishedAppStatus = typeof PublishedAppStatus.infer\n\nexport const PublishedApp = type({\n session_id: \"string\",\n name: \"string\",\n url: \"string\",\n host_port: \"number\",\n app_port: \"number\",\n icon: \"string\",\n open_in: \"string\",\n created_at: \"number\",\n status: PublishedAppStatus,\n os_app_id: \"string\",\n os_registered: \"boolean\",\n})\nexport type PublishedApp = typeof PublishedApp.infer\n\nexport const PublishedAppListResponse = type({\n items: PublishedApp.array(),\n})\nexport type PublishedAppListResponse = typeof PublishedAppListResponse.infer\n\nexport const UnpublishAppResponse = type({\n ok: \"boolean\",\n \"os_app_id?\": \"string\",\n \"os_registered?\": \"boolean\",\n})\nexport type UnpublishAppResponse = typeof UnpublishAppResponse.infer\n","import type { PublishedApp, UnpublishAppResponse } from \"../../react/schemas/published-apps\"\nimport { PublishedAppListResponse, UnpublishAppResponse as UnpublishAppResponseSchema } from \"../../react/schemas/published-apps\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport class PublishedAppsResource {\n constructor(private client: BladeClient) {}\n\n async listPublishedApps(): Promise<PublishedApp[]> {\n const data = await this.client.json<unknown>(\"GET\", \"/api/published-apps\")\n return PublishedAppListResponse.assert(data).items\n }\n\n async unpublishApp(sessionId: string, appName?: string): Promise<UnpublishAppResponse> {\n const params = appName ? `?app_name=${encodeURIComponent(appName)}` : \"\"\n const data = await this.client.json<unknown>(\n \"DELETE\",\n `/api/published-apps/${encodeURIComponent(sessionId)}${params}`,\n )\n return UnpublishAppResponseSchema.assert(data)\n }\n}\n","import type { AgentResource } from \"../../react/schemas/studio/agent\"\nimport type { DatabaseResource } from \"../../react/schemas/studio/database\"\nimport type { KnowledgeResource } from \"../../react/schemas/studio/knowledge\"\nimport type { ToolResource } from \"../../react/schemas/studio/tool\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport const REGISTRY_PREFIX = \"/api-registry\"\n\nconst API_TO_FRONTEND_TYPE: Record<string, string> = {\n tool: \"tools\",\n datasource: \"data\",\n knowledgebase: \"knowledge\",\n agent: \"agent\",\n}\n\ntype RawResourceResponse = {\n id: number | string\n type: string\n subtype: string\n driver?: string | null\n name: string\n description: string\n tags: string[]\n config: Record<string, unknown>\n status?: string | null\n status_message?: string | null\n last_checked_at?: string | null\n extra?: Record<string, unknown>\n capabilities?: string[]\n actions?: unknown[]\n created_at?: string\n updated_at?: string\n [key: string]: unknown\n}\n\ntype PaginatedResponse = { items: RawResourceResponse[]; total: number }\n\nexport function normalizeResource<T extends Record<string, unknown>>(raw: RawResourceResponse): T {\n return {\n ...raw,\n id: String(raw.id),\n type: API_TO_FRONTEND_TYPE[raw.type] ?? raw.type,\n } as unknown as T\n}\n\nexport type ResourceApi<T extends Record<string, unknown>> = {\n list(init?: RequestInit): Promise<T[]>\n get(id: string, init?: RequestInit): Promise<T>\n create(data: Partial<T>, init?: RequestInit): Promise<T>\n update(id: string, data: Partial<T>, init?: RequestInit): Promise<T>\n delete(id: string, init?: RequestInit): Promise<void>\n}\n\nexport type SkillOrgOption = {\n id: string\n display_name: string\n kind: \"personal\" | \"org\"\n is_mine: boolean\n}\n\nexport type SkillOrgListResponse = {\n orgs: string[]\n org_options?: SkillOrgOption[]\n}\n\nexport class RegistryResource {\n readonly databaseApi: ResourceApi<DatabaseResource>\n readonly toolApi: ResourceApi<ToolResource>\n readonly knowledgeApi: ResourceApi<KnowledgeResource>\n readonly agentApi: ResourceApi<AgentResource>\n\n constructor(private client: BladeClient) {\n this.databaseApi = this.createResourceApi<DatabaseResource>(\"datasource\")\n this.toolApi = this.createResourceApi<ToolResource>(\"tool\")\n this.knowledgeApi = this.createResourceApi<KnowledgeResource>(\"knowledgebase\")\n this.agentApi = this.createResourceApi<AgentResource>(\"agent\")\n }\n\n createResourceApi<T extends Record<string, unknown>>(apiType: string): ResourceApi<T> {\n return {\n list: (init?: RequestInit) =>\n this.client\n .jsonFromInit<PaginatedResponse>(`${REGISTRY_PREFIX}/resources?type=${apiType}`, init)\n .then((response) => (response.items ?? []).map((item) => normalizeResource<T>(item))),\n get: (id: string, init?: RequestInit) =>\n this.client\n .jsonFromInit<RawResourceResponse>(`${REGISTRY_PREFIX}/resources/${encodeURIComponent(id)}`, init)\n .then((item) => normalizeResource<T>(item)),\n create: (data: Partial<T>, init?: RequestInit) =>\n this.client.jsonFromInit(`${REGISTRY_PREFIX}/resources`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n ...init,\n }),\n update: (id: string, data: Partial<T>, init?: RequestInit) =>\n this.client.jsonFromInit(`${REGISTRY_PREFIX}/resources/${encodeURIComponent(id)}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n ...init,\n }),\n delete: async (id: string, init?: RequestInit) => {\n await this.client.textFromInit(`${REGISTRY_PREFIX}/resources/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n ...init,\n })\n },\n }\n }\n\n listSkillOrgs(): Promise<SkillOrgListResponse> {\n return this.client.json(\"GET\", `${REGISTRY_PREFIX}/skills/orgs`)\n }\n\n publishSkill(\n sessionId: string,\n org: string,\n ): Promise<{ success: boolean; skill_id: string }> {\n // main-only:发布只传 org,内容同步到 main,不再有版本号。\n return this.client.json(\"POST\", `/api/sessions/${encodeURIComponent(sessionId)}/skill-publish`, {\n org,\n })\n }\n}\n","import type {\n ContentBlock,\n PendingQuestionRef,\n ToolCallProjection,\n TurnProjection,\n} from \"../../../react/schemas/projection\"\nimport type { TurnState } from \"./state\"\n\n// --- Tool call upsert ---\n\nexport function upsertToolCall(\n state: TurnState,\n toolCallId: string,\n toolName: string,\n displayName: string,\n args: string,\n): void {\n if (!toolCallId) return\n\n let found = false\n for (let i = 0; i < state.toolCalls.length; i++) {\n if (state.toolCalls[i].id !== toolCallId) continue\n const tc = state.toolCalls[i]\n state.toolCalls[i] = {\n ...tc,\n tool_name: toolName || tc.tool_name,\n display_name: displayName || tc.display_name,\n arguments: args || tc.arguments,\n }\n found = true\n break\n }\n if (!found) {\n state.toolCalls.push({\n id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n arguments: args,\n status: \"pending\",\n })\n }\n\n let blockFound = false\n for (let i = 0; i < state.blocks.length; i++) {\n const b = state.blocks[i]\n if (b.type !== \"tool_use\" || b.tool_call_id !== toolCallId) continue\n state.blocks[i] = {\n ...b,\n content: args || b.content,\n tool_name: toolName || b.tool_name,\n display_name: displayName || b.display_name,\n }\n blockFound = true\n break\n }\n if (!blockFound) {\n state.blocks.push({\n type: \"tool_use\",\n content: args,\n tool_call_id: toolCallId,\n tool_name: toolName || null,\n display_name: displayName || null,\n })\n }\n}\n\n// --- Tool result application ---\n\nexport function applyToolResult(\n state: TurnState,\n toolCallId: string,\n result: unknown,\n status: ToolCallProjection[\"status\"],\n durationMs: number | null,\n sourceLoop: { loop_name: string; description: string } | null,\n): void {\n let toolName = \"\"\n let displayName = \"\"\n let finalResult = result\n\n for (let i = 0; i < state.toolCalls.length; i++) {\n const tc = state.toolCalls[i]\n if (tc.id !== toolCallId) continue\n\n if (typeof result === \"string\") {\n finalResult = maybeEnrichAskUserResult(tc.tool_name, result, sourceLoop)\n }\n\n const update: Partial<ToolCallProjection> = { status, result: finalResult }\n if (durationMs != null) update.duration_ms = durationMs\n state.toolCalls[i] = { ...tc, ...update }\n toolName = tc.tool_name\n displayName = tc.display_name\n break\n }\n\n upsertToolResultBlock(state, toolCallId, finalResult, toolName, displayName)\n}\n\nexport function appendToolResultDelta(\n state: TurnState,\n toolCallId: string,\n delta: string,\n): void {\n if (!toolCallId || !delta) return\n\n let toolName = \"\"\n let displayName = \"\"\n let currentResult = \"\"\n\n for (let i = 0; i < state.toolCalls.length; i++) {\n const tc = state.toolCalls[i]\n if (tc.id !== toolCallId) continue\n toolName = tc.tool_name\n displayName = tc.display_name\n if (typeof tc.result === \"string\") currentResult = tc.result\n state.toolCalls[i] = { ...tc, result: currentResult + delta }\n break\n }\n\n for (const block of state.blocks) {\n if (block.type !== \"tool_result\" || block.tool_call_id !== toolCallId) continue\n if (typeof block.content === \"string\") currentResult = block.content\n break\n }\n\n upsertToolResultBlock(state, toolCallId, currentResult + delta, toolName, displayName)\n}\n\nfunction upsertToolResultBlock(\n state: TurnState,\n toolCallId: string,\n content: unknown,\n toolName: string,\n displayName: string,\n): void {\n for (let i = 0; i < state.blocks.length; i++) {\n const block = state.blocks[i]\n if (block.type !== \"tool_result\" || block.tool_call_id !== toolCallId) continue\n state.blocks[i] = {\n ...block,\n content,\n tool_name: toolName || block.tool_name,\n display_name: displayName || block.display_name,\n }\n return\n }\n\n state.blocks.push({\n type: \"tool_result\",\n content,\n tool_call_id: toolCallId,\n tool_name: toolName || null,\n display_name: displayName || null,\n })\n}\n\n// --- Text block append ---\n\nexport function appendTextBlock(\n state: TurnState,\n blockType: ContentBlock[\"type\"],\n content: unknown,\n): void {\n if (content == null || content === \"\") return\n const text = String(content)\n const lastBlock = state.blocks[state.blocks.length - 1]\n if (lastBlock && lastBlock.type === blockType && typeof lastBlock.content === \"string\") {\n state.blocks[state.blocks.length - 1] = {\n ...lastBlock,\n content: lastBlock.content + text,\n }\n return\n }\n state.blocks.push({ type: blockType, content: text })\n}\n\n// --- Tool call arguments append ---\n\nexport function appendToolCallArguments(\n state: TurnState,\n toolCallId: string,\n delta: string,\n): void {\n let newArgs = \"\"\n for (let i = 0; i < state.toolCalls.length; i++) {\n const tc = state.toolCalls[i]\n if (tc.id === toolCallId) {\n newArgs = tc.arguments + delta\n state.toolCalls[i] = { ...tc, arguments: newArgs }\n break\n }\n }\n if (!newArgs) return\n\n for (let i = 0; i < state.blocks.length; i++) {\n const b = state.blocks[i]\n if (b.type === \"tool_use\" && b.tool_call_id === toolCallId) {\n state.blocks[i] = { ...b, content: newArgs }\n break\n }\n }\n}\n\n// --- AskUserQuestion enrichment ---\n\nfunction maybeEnrichAskUserResult(\n toolName: string,\n result: string,\n sourceLoop: { loop_name: string; description: string } | null,\n): string {\n if (!sourceLoop) return result\n const normalized = toolName.includes(\":\") ? toolName.split(\":\").pop()! : toolName\n if (normalized !== \"AskUserQuestion\") return result\n try {\n const payload = JSON.parse(result)\n if (typeof payload !== \"object\" || payload === null) return result\n payload.source_loop = sourceLoop\n return JSON.stringify(payload)\n } catch {\n return result\n }\n}\n\n// --- System notification ---\n\nexport function buildSystemNotificationTurn(\n sequence: number,\n turnId: string,\n loopId: string,\n notificationType: string,\n status: string,\n title: string,\n detail: string | null,\n metadata: Record<string, unknown>,\n): TurnProjection {\n return {\n id: turnId,\n sequence,\n turn_id: turnId,\n loop_id: loopId,\n kind: \"message\",\n role: \"system\",\n status: \"completed\",\n blocks: [\n {\n type: \"system_notification\",\n content: {\n notification_type: notificationType,\n status,\n title,\n detail,\n metadata,\n },\n },\n ],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n}\n\nexport function buildSystemNotificationBlock(\n notificationType: string,\n status: string,\n title: string,\n detail: string | null,\n metadata: Record<string, unknown>,\n): ContentBlock {\n return {\n type: \"system_notification\",\n content: {\n notification_type: notificationType,\n status,\n title,\n detail,\n metadata,\n },\n }\n}\n\n// --- Marker turn ---\n\nexport function buildMarkerTurn(\n sequence: number,\n turnId: string,\n loopId: string,\n blockType: ContentBlock[\"type\"],\n content: unknown,\n): TurnProjection {\n return {\n id: turnId,\n sequence,\n turn_id: turnId,\n loop_id: loopId,\n kind: \"message\",\n role: \"assistant\",\n status: \"completed\",\n blocks: [{ type: blockType, content }],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n}\n\n// --- Compaction turn ---\n\nexport function buildCompactionTurn(\n sequence: number,\n compactionId: string,\n loopId: string,\n status: TurnProjection[\"status\"],\n data: Record<string, unknown>,\n): TurnProjection {\n const tokensBefore = asInt(data.tokens_before)\n const tokensAfter = asInt(data.tokens_after)\n let savedRatio: number | null = null\n if (tokensBefore && tokensBefore > 0 && tokensAfter != null) {\n savedRatio = 1 - tokensAfter / tokensBefore\n } else {\n savedRatio = asFloat(data.saved_ratio)\n }\n let archivedCount = asInt(data.archived_count)\n if (archivedCount == null && Array.isArray(data.archived_files)) {\n archivedCount = data.archived_files.length\n }\n\n const content = data.content\n const summaryFull = compactionSummaryFull(content)\n const summaryPreview = summaryFull\n ? summaryFull\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .join(\" \")\n .slice(0, 200)\n : null\n\n return {\n id: `compaction:${compactionId}`,\n sequence,\n turn_id: `compaction:${compactionId}`,\n loop_id: loopId,\n kind: \"compaction\",\n role: \"system\",\n status,\n blocks: [],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n compaction_id: compactionId,\n summary_preview: summaryPreview,\n summary_full: summaryFull,\n archived_count: archivedCount,\n tokens_before: tokensBefore,\n tokens_after: tokensAfter,\n saved_ratio: savedRatio,\n trigger: asTrigger(data.trigger),\n failure_reason:\n typeof data.reason === \"string\" && data.reason ? (data.reason as string) : null,\n fallback_applied: typeof data.fallback_applied === \"boolean\" ? data.fallback_applied : null,\n }\n}\n\nfunction compactionSummaryFull(content: unknown): string | null {\n const text = String(content ?? \"\")\n if (!text) return null\n const cleaned = text\n .replace(\"<compaction-summary>\", \"\")\n .replace(\"</compaction-summary>\", \"\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\")\n .trim()\n return cleaned || null\n}\n\nfunction asInt(value: unknown): number | null {\n if (typeof value === \"boolean\") return null\n if (typeof value === \"number\") return Math.trunc(value)\n return null\n}\n\nfunction asFloat(value: unknown): number | null {\n if (typeof value === \"boolean\") return null\n if (typeof value === \"number\") return value\n return null\n}\n\nfunction asTrigger(value: unknown): \"auto\" | \"manual\" | \"forced_retry\" | null {\n if (value === \"auto\" || value === \"manual\" || value === \"forced_retry\") return value\n return null\n}\n\n// --- Child pause helpers ---\n\nexport interface ChildPauseInfo {\n parentLoopName: string\n parentToolCallId: string\n childLoopName: string\n childToolCallId: string\n description: string\n}\n\nexport function setToolCallStatus(\n turn: TurnState | TurnProjection | null | undefined,\n toolCallId: string,\n status: ToolCallProjection[\"status\"],\n result: unknown,\n pendingQuestionRef: PendingQuestionRef | null,\n): void {\n if (!turn || !toolCallId) return\n const toolCalls = \"toolCalls\" in turn ? turn.toolCalls : turn.tool_calls\n for (let i = 0; i < toolCalls.length; i++) {\n if (toolCalls[i].id !== toolCallId) continue\n toolCalls[i] = {\n ...toolCalls[i],\n status,\n result,\n pending_question_ref: pendingQuestionRef,\n }\n return\n }\n}\n\nexport function applyAskUserPauseToTurn(\n turn: TurnState | TurnProjection | null | undefined,\n pauseToolData: Record<string, unknown>,\n toolCallId: string,\n childLoopName: string,\n description: string,\n displayNameResolver: (name: string) => string,\n): void {\n if (!turn || !toolCallId) return\n\n const sourceLoop = childLoopName\n ? { loop_name: childLoopName, description }\n : null\n const toolName = String(pauseToolData.name ?? \"AskUserQuestion\")\n const args = JSON.stringify(pauseToolData.arguments ?? {})\n const result = askUserResultFromPausePayload(pauseToolData, sourceLoop)\n\n const isTurnState = \"toolCalls\" in turn\n const toolCalls = isTurnState ? turn.toolCalls : turn.tool_calls\n const blocks = turn.blocks\n\n // upsert tool call\n const displayName = displayNameResolver(toolName)\n let found = false\n for (let i = 0; i < toolCalls.length; i++) {\n if (toolCalls[i].id !== toolCallId) continue\n toolCalls[i] = {\n ...toolCalls[i],\n tool_name: toolName || toolCalls[i].tool_name,\n display_name: displayName || toolCalls[i].display_name,\n arguments: args || toolCalls[i].arguments,\n }\n found = true\n break\n }\n if (!found) {\n toolCalls.push({\n id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n arguments: args,\n status: \"pending\",\n })\n }\n\n // upsert tool_use block\n let blockFound = false\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i].type !== \"tool_use\" || blocks[i].tool_call_id !== toolCallId) continue\n blocks[i] = { ...blocks[i], content: args, tool_name: toolName, display_name: displayName }\n blockFound = true\n break\n }\n if (!blockFound) {\n blocks.push({\n type: \"tool_use\",\n content: args,\n tool_call_id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n })\n }\n\n // set status\n setToolCallStatus(turn, toolCallId, \"awaiting_answer\", result, null)\n\n // upsert tool_result block\n let resultBlockFound = false\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i].type !== \"tool_result\" || blocks[i].tool_call_id !== toolCallId) continue\n blocks[i] = { ...blocks[i], content: result }\n resultBlockFound = true\n break\n }\n if (!resultBlockFound) {\n blocks.push({\n type: \"tool_result\",\n content: result,\n tool_call_id: toolCallId,\n tool_name: toolName,\n display_name: displayName,\n })\n }\n}\n\nexport function applyChildPauseToParent(\n parentTurn: TurnState | TurnProjection | null | undefined,\n parentToolCallId: string,\n childLoopName: string,\n childToolCallId: string,\n description: string,\n displayNameResolver: (name: string) => string,\n): void {\n if (!parentTurn || !parentToolCallId) return\n\n const toolCalls = \"toolCalls\" in parentTurn ? parentTurn.toolCalls : parentTurn.tool_calls\n const blocks = parentTurn.blocks\n\n const displayName = displayNameResolver(\"Agent\")\n let found = false\n for (let i = 0; i < toolCalls.length; i++) {\n if (toolCalls[i].id !== parentToolCallId) continue\n toolCalls[i] = {\n ...toolCalls[i],\n tool_name: \"Agent\",\n display_name: displayName || toolCalls[i].display_name,\n }\n found = true\n break\n }\n if (!found) {\n toolCalls.push({\n id: parentToolCallId,\n tool_name: \"Agent\",\n display_name: displayName,\n arguments: \"\",\n status: \"pending\",\n })\n }\n\n // upsert tool_use block\n let blockFound = false\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i].type !== \"tool_use\" || blocks[i].tool_call_id !== parentToolCallId) continue\n blockFound = true\n break\n }\n if (!blockFound) {\n blocks.push({\n type: \"tool_use\",\n content: \"\",\n tool_call_id: parentToolCallId,\n tool_name: \"Agent\",\n display_name: displayName,\n })\n }\n\n setToolCallStatus(parentTurn, parentToolCallId, \"awaiting_answer\", null, {\n child_loop_name: childLoopName,\n child_tool_call_id: childToolCallId,\n description: description || null,\n })\n}\n\nfunction askUserResultFromPausePayload(\n pauseToolData: Record<string, unknown>,\n sourceLoop: { loop_name: string; description: string } | null,\n): string {\n const args =\n typeof pauseToolData.arguments === \"object\" && pauseToolData.arguments !== null\n ? (pauseToolData.arguments as Record<string, unknown>)\n : {}\n const payload: Record<string, unknown> = { questions: args.questions ?? [] }\n if (sourceLoop) payload.source_loop = sourceLoop\n return JSON.stringify(payload)\n}\n\nexport function sourceLoopFor(\n loopId: string,\n loopDescriptions: Map<string, string>,\n): { loop_name: string; description: string } | null {\n if (loopId === \"root\") return null\n const description = loopDescriptions.get(loopId)\n if (!description) return null\n return { loop_name: loopId, description }\n}\n\nexport function normalizeChildPause(\n pausePayload: Record<string, unknown>,\n): {\n pauseToolData: Record<string, unknown>\n childLoopName: string\n childToolCallId: string\n description: string\n} {\n const rawPtd = pausePayload.pause_tool_data\n const pauseToolData: Record<string, unknown> =\n typeof rawPtd === \"object\" && rawPtd !== null\n ? { ...(rawPtd as Record<string, unknown>) }\n : { ...pausePayload }\n\n let sourceLoop = pauseToolData.source_loop as Record<string, unknown> | undefined\n if (typeof sourceLoop !== \"object\" || sourceLoop === null) {\n sourceLoop = pausePayload.source_loop as Record<string, unknown> | undefined\n }\n\n const childLoopName =\n String(pausePayload.child_loop_name ?? \"\") ||\n (typeof sourceLoop === \"object\" && sourceLoop ? String(sourceLoop.name ?? \"\") : \"\")\n\n const childToolCallId =\n String(\n pausePayload.child_pause_tool_call_id ?? pauseToolData.tool_call_id ?? \"\",\n )\n\n const description =\n typeof sourceLoop === \"object\" && sourceLoop ? String(sourceLoop.description ?? \"\") : \"\"\n\n if (childLoopName && description) {\n pauseToolData.source_loop = { name: childLoopName, description }\n }\n\n return { pauseToolData, childLoopName, childToolCallId, description }\n}\n","import type { ContentBlock, PendingQuestionRef, ToolBridgeContent } from \"./projection\"\n\nexport interface TextContentPart {\n type: \"text\"\n text: string\n}\n\nexport interface ImageUrlContentPart {\n type: \"image_url\"\n image_url: {\n url: string\n }\n}\n\nexport interface FileContentPart {\n type: \"file\"\n name: string\n data: string\n}\n\nexport type MessageContentPart = TextContentPart | ImageUrlContentPart | FileContentPart\nexport type MessageContent = string | MessageContentPart[]\n\nexport interface ToolCallInfo {\n id: string\n name: string\n display_name?: string | null\n arguments: string\n result?: unknown\n status?: \"pending\" | \"done\" | \"error\" | \"cancelled\" | \"awaiting_answer\"\n duration_ms?: number | null\n pending_question_ref?: PendingQuestionRef | null\n}\n\nexport type { ToolBridgeContent }\n\n/** Derive tool status from the result content string. */\nexport function inferToolStatus(\n resultStr: string,\n): \"done\" | \"error\" | \"cancelled\" {\n if (resultStr.includes('\"Cancelled by user\"')) return \"cancelled\"\n try {\n const parsed = JSON.parse(resultStr)\n if (typeof parsed === \"object\" && parsed !== null) {\n // Direct error: {\"error\": \"...\"}\n if (\"error\" in parsed && parsed.error) return \"error\"\n // 部分工具把输出包装为 {\"result\": {\"error\": \"...\"}, ...}\n const nested = parsed.result\n if (typeof nested === \"object\" && nested !== null && \"error\" in nested && nested.error) {\n return \"error\"\n }\n }\n } catch {\n // not JSON, treat as success\n }\n return \"done\"\n}\n\nexport interface MemoryRefInfo {\n id: number\n content_preview: string\n skill_name?: string | null\n}\n\nexport interface CompactionInfo {\n compaction_id: string\n summary_preview?: string | null\n summary_full?: string | null\n archived_count?: number | null\n archived_files?: ArchivedFileInfo[] | null\n archived_tool_calls?: ArchivedToolCallInfo[] | null\n tokens_before?: number | null\n tokens_after?: number | null\n saved_ratio?: number | null\n trigger?: \"auto\" | \"manual\" | \"forced_retry\" | null\n failure_reason?: string | null\n fallback_applied?: boolean | null\n}\n\nexport interface ArchivedFileInfo {\n tool_name?: string | null\n filename?: string | null\n relative_path?: string | null\n size_bytes?: number | null\n}\n\nexport interface ArchivedToolCallInfo {\n tool_call_id?: string | null\n tool_name?: string | null\n archive_path?: string | null\n replacement_content?: string | null\n entry_id?: string | null\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"tool\" | \"error\"\n content: MessageContent\n reasoning?: string\n tool_calls?: ToolCallInfo[]\n status?: \"streaming\" | \"completed\" | \"paused\" | \"failed\" | \"interrupted\"\n duration_ms?: number\n timestamp?: string\n entry_id?: string\n parent_id?: string | null\n loop_name?: string\n /** Entry kind from backend -- present for non-message entries like mode changes. */\n kind?: string\n /** Memory references injected into this turn's context */\n memory_refs?: MemoryRefInfo[]\n /** Raw projection blocks for block-level UI rendering. */\n blocks?: ContentBlock[]\n /** Compaction metadata for compaction turns. */\n compaction?: CompactionInfo\n}\n","import { inferToolStatus } from \"../../../react/schemas/message\"\nimport type {\n ContentBlock,\n MemoryRef,\n ToolCallProjection,\n TurnProjection,\n} from \"../../../react/schemas/projection\"\n\nexport interface TurnState {\n turnId: string\n loopId: string\n role: \"user\" | \"assistant\" | \"system\"\n model: string | null\n startedAt: number\n contextWindow: number\n blocks: ContentBlock[]\n toolCalls: ToolCallProjection[]\n usage: Record<string, unknown> | null\n memoryRefs: MemoryRef[] | null\n parentForkToolCallId: string | null\n}\n\nexport function createTurnState(\n turnId: string,\n loopId: string,\n opts: {\n model?: string | null\n contextWindow?: number\n memoryRefs?: MemoryRef[] | null\n } = {},\n): TurnState {\n return {\n turnId,\n loopId,\n role: \"assistant\",\n model: opts.model ?? null,\n startedAt: Date.now(),\n contextWindow: opts.contextWindow ?? 0,\n blocks: [],\n toolCalls: [],\n usage: null,\n memoryRefs: opts.memoryRefs ?? null,\n parentForkToolCallId: null,\n }\n}\n\nexport function snapshot(\n state: TurnState,\n sequence: number,\n status: TurnProjection[\"status\"],\n): TurnProjection {\n return {\n id: state.turnId,\n sequence,\n turn_id: state.turnId,\n loop_id: state.loopId,\n kind: \"message\",\n role: state.role,\n status,\n blocks: [...state.blocks],\n tool_calls: [...state.toolCalls],\n model: state.model,\n usage: state.usage ? { ...state.usage } : null,\n duration_ms: Math.max(0, Date.now() - state.startedAt),\n started_at: new Date(state.startedAt).toISOString(),\n context_window: state.contextWindow,\n memory_refs: state.memoryRefs,\n parent_fork_tool_call_id: state.parentForkToolCallId,\n }\n}\n\nexport const PAUSE_TOOL_NAMES = new Set([\"AskUserQuestion\", \"ExitPlanMode\"])\n\nexport function toolStatusFromResult(result: unknown): ToolCallProjection[\"status\"] {\n const text =\n typeof result === \"string\"\n ? result\n : Array.isArray(result)\n ? result\n .filter(\n (p): p is { type: string; text: string } =>\n typeof p === \"object\" && p !== null && p.type === \"text\",\n )\n .map((p) => p.text ?? \"\")\n .join(\"\\n\")\n : String(result ?? \"\")\n return inferToolStatus(text)\n}\n","import type { MemoryRef, TurnProjection } from \"../../../react/schemas/projection\"\nimport {\n applyAskUserPauseToTurn,\n applyChildPauseToParent,\n appendTextBlock,\n appendToolCallArguments,\n appendToolResultDelta,\n applyToolResult,\n buildCompactionTurn,\n buildMarkerTurn,\n buildSystemNotificationBlock,\n buildSystemNotificationTurn,\n type ChildPauseInfo,\n normalizeChildPause,\n setToolCallStatus,\n sourceLoopFor,\n upsertToolCall,\n} from \"./helpers\"\nimport { createTurnState, PAUSE_TOOL_NAMES, snapshot, toolStatusFromResult, type TurnState } from \"./state\"\n\nexport interface RawEvent {\n type: string\n payload: Record<string, unknown>\n}\n\nexport type ProjectionUpdate =\n | { kind: \"upsert\"; turn: TurnProjection }\n | { kind: \"workspace_changed\"; loopId: string; toolCallId?: string; toolName?: string }\n\nexport class ClientProjectionBuilder {\n private activeTurns = new Map<string, TurnState>()\n private lastTurnIds = new Map<string, string>()\n private latestTurns = new Map<string, TurnProjection>()\n private loopDescriptions = new Map<string, string>()\n private pendingChildPauses = new Map<string, ChildPauseInfo>()\n private pendingMemoryRefs = new Map<string, { turnId: string; refs: MemoryRef[] }>()\n private activeCompactions = new Map<string, Record<string, unknown>>()\n private seq = 0\n private syntheticCounter = 0\n private displayNameResolver: (name: string) => string\n\n constructor(displayNameResolver?: (name: string) => string) {\n this.displayNameResolver = displayNameResolver ?? ((n) => n)\n }\n\n processBatch(events: RawEvent[]): ProjectionUpdate[] {\n const lastUpsertByTurn = new Map<string, ProjectionUpdate & { kind: \"upsert\" }>()\n const nonUpserts: ProjectionUpdate[] = []\n for (const event of events) {\n const updates = this.processEvent(event)\n if (!updates) continue\n for (const u of updates) {\n if (u.kind === \"upsert\") {\n lastUpsertByTurn.set(u.turn.turn_id, u)\n } else {\n nonUpserts.push(u)\n }\n }\n }\n return [...nonUpserts, ...lastUpsertByTurn.values()]\n }\n\n processEvent(event: RawEvent): ProjectionUpdate[] | null {\n const payload = event.payload\n const loopId = String(payload.loop_name ?? \"root\")\n\n switch (event.type) {\n case \"memory:inject:done\":\n return this.onMemoryInject(loopId, payload)\n case \"memory:inject:none\":\n return null\n case \"loop:turn\":\n return this.onLoopTurn(loopId, payload)\n case \"mode:change\":\n return this.onModeChange(loopId, payload)\n case \"plan:status:update\":\n return this.onPlanStatusUpdate(loopId, payload)\n case \"workspace:changed\":\n return this.onWorkspaceChanged(loopId, payload)\n case \"agent:start\":\n return this.onAgentStart(loopId, payload)\n case \"bg:started\":\n return this.onBgStarted(loopId, payload)\n case \"bg:tasks_completed\":\n return this.onBgTasksCompleted(loopId, payload)\n case \"loop:ask_user_answer\":\n return this.onAskUserAnswer(loopId, payload)\n case \"user:message\":\n return this.onUserMessage(loopId, payload)\n }\n\n if (event.type.startsWith(\"compaction:\"))\n return this.onCompaction(event.type, loopId, payload)\n\n const state = this.activeTurns.get(loopId)\n if (!state) {\n if (event.type === \"chat:end\") {\n this.pendingMemoryRefs.delete(loopId)\n return null\n }\n if (event.type === \"agent:end\") return this.onAgentEnd(null, loopId, payload)\n return null\n }\n\n switch (event.type) {\n case \"llm:thinking:delta\":\n return this.onDelta(state, \"thinking\", \"\", String(payload.content ?? \"\"))\n case \"llm:content:delta\":\n return this.onDelta(state, \"text\", \"\", String(payload.content ?? \"\"))\n case \"llm:tool_call:created\":\n return this.onToolCallCreated(state, payload)\n case \"llm:response:done\":\n return this.onResponseDone(state, loopId, payload)\n case \"tool:result:delta\":\n return this.onToolResultDelta(state, payload)\n case \"tool:result:done\":\n return this.onToolResultDone(state, loopId, payload)\n case \"loop:tool_ui\":\n return this.onToolUi(state, payload)\n case \"loop:tool_bridge\":\n return this.onToolBridge(state, payload)\n case \"tool:approval:required\":\n return this.onToolApprovalRequired(state, payload)\n case \"loop:child_pause\":\n return this.onChildPause(state, loopId, payload)\n case \"chat:end\":\n return this.onChatEnd(state, loopId, payload)\n case \"agent:end\":\n return this.onAgentEnd(state, loopId, payload)\n default:\n return null\n }\n }\n\n reset(): void {\n this.activeTurns.clear()\n this.lastTurnIds.clear()\n this.latestTurns.clear()\n this.loopDescriptions.clear()\n this.pendingChildPauses.clear()\n this.pendingMemoryRefs.clear()\n this.activeCompactions.clear()\n this.seq = 0\n this.syntheticCounter = 0\n }\n\n seedSequence(maxSeq: number): void {\n if (maxSeq > this.seq) {\n this.seq = maxSeq\n }\n }\n\n // --- Event handlers ---\n\n private onMemoryInject(\n loopId: string,\n payload: Record<string, unknown>,\n ): null {\n const refs = payload.memory_refs\n const turnId = String(payload.turn_id ?? \"\")\n if (Array.isArray(refs) && refs.length > 0) {\n this.pendingMemoryRefs.set(loopId, {\n turnId,\n refs: refs.map((r: Record<string, unknown>) => ({\n id: Number(r.id),\n content_preview: String(r.content_preview ?? \"\"),\n skill_name: r.skill_name != null ? String(r.skill_name) : null,\n })),\n })\n }\n return null\n }\n\n private onLoopTurn(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n let turnId = String(payload.turn_id ?? this.nextTurnId(`turn:${loopId}`))\n let memoryRefs: MemoryRef[] | null = null\n\n const pending = this.pendingMemoryRefs.get(loopId)\n if (pending) {\n this.pendingMemoryRefs.delete(loopId)\n if (pending.turnId) turnId = pending.turnId\n memoryRefs = pending.refs\n }\n\n const rawCw = payload.context_window\n const contextWindow =\n typeof rawCw === \"number\" && rawCw > 0 ? Math.trunc(rawCw) : 0\n\n const state = createTurnState(turnId, loopId, {\n model: optStr(payload.model),\n contextWindow,\n memoryRefs,\n })\n\n this.activeTurns.set(loopId, state)\n this.lastTurnIds.set(loopId, turnId)\n\n const turn = snapshot(state, this.nextSeq(), \"streaming\")\n this.latestTurns.set(loopId, turn)\n return [{ kind: \"upsert\", turn }]\n }\n\n private onModeChange(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const content: Record<string, string> = {}\n if (payload.from != null && payload.from !== \"\") content.from = String(payload.from)\n if (payload.to != null && payload.to !== \"\") content.to = String(payload.to)\n const turn = buildMarkerTurn(\n this.nextSeq(),\n this.nextTurnId(\"mode_change\"),\n loopId,\n \"mode_change\",\n content,\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onPlanStatusUpdate(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n let statuses = payload.statuses\n if (typeof statuses !== \"object\" || statuses === null) {\n statuses = payload._statuses ?? {}\n }\n const turn = buildMarkerTurn(\n this.nextSeq(),\n this.nextTurnId(\"plan_status\"),\n loopId,\n \"plan_status\",\n { plan_yaml: payload.plan_yaml ?? \"\", statuses },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onWorkspaceChanged(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const updates: ProjectionUpdate[] = [\n {\n kind: \"workspace_changed\",\n loopId,\n toolCallId: optStr(payload.tool_call_id) ?? undefined,\n toolName: toolNameFromPayload(payload) ?? undefined,\n },\n ]\n const state = this.activeTurns.get(loopId)\n if (state) {\n const turn = snapshot(state, this.nextSeq(), \"streaming\")\n this.latestTurns.set(loopId, turn)\n this.lastTurnIds.set(loopId, turn.turn_id)\n updates.push({ kind: \"upsert\", turn })\n }\n return updates\n }\n\n private onAgentStart(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const description = optStr(payload.description)\n if (description) this.loopDescriptions.set(loopId, description)\n const turn = buildSystemNotificationTurn(\n this.nextSeq(),\n this.nextTurnId(\"agent:start\"),\n loopId,\n \"agent:start\",\n \"running\",\n `Agent: ${payload.description ?? payload.skill_id ?? \"agent\"}`,\n optStr(payload.prompt),\n {\n skill_id: optStr(payload.skill_id),\n description: optStr(payload.description),\n parent_fork_tool_call_id: optStr(payload.parent_fork_tool_call_id),\n },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onBgStarted(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const taskId = optStr(payload.task_id) ?? \"\"\n const command = optStr(payload.command)\n const description = optStr(payload.description)\n const turn = buildSystemNotificationTurn(\n this.nextSeq(),\n this.nextTurnId(\"bg:started\"),\n loopId,\n \"bg:started\",\n \"running\",\n description ?? `Background: ${taskId || \"task\"}`,\n command,\n { task_id: taskId, command, description },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onBgTasksCompleted(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const taskIds = Array.isArray(payload.task_ids) ? payload.task_ids : []\n const count = typeof payload.count === \"number\" ? payload.count : taskIds.length\n const detail = taskIds.map(String).join(\", \")\n const turn = buildSystemNotificationTurn(\n this.nextSeq(),\n this.nextTurnId(\"bg:tasks_completed\"),\n loopId,\n \"bg:tasks_completed\",\n \"done\",\n `Background tasks completed (${count})`,\n detail || null,\n { task_ids: taskIds, count },\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onAskUserAnswer(\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const pending = this.pendingChildPauses.get(toolCallId)\n const parentLoopId = pending?.parentLoopName\n\n // clear child pause\n if (pending) {\n this.pendingChildPauses.delete(toolCallId)\n const childTurn =\n this.activeTurns.get(pending.childLoopName) ??\n this.latestTurns.get(pending.childLoopName)\n setToolCallStatus(childTurn, pending.childToolCallId, \"done\", null, null)\n const parentTurn =\n this.activeTurns.get(pending.parentLoopName) ??\n this.latestTurns.get(pending.parentLoopName)\n setToolCallStatus(parentTurn, pending.parentToolCallId, \"done\", null, null)\n }\n\n // clear direct ask-user pause\n const directTurn = this.activeTurns.get(loopId) ?? this.latestTurns.get(loopId)\n setToolCallStatus(directTurn, toolCallId, \"done\", null, null)\n\n return this.collectLoopUpdates(loopId, parentLoopId)\n }\n\n private onUserMessage(\n _loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] {\n const entryId = String(payload.entry_id ?? this.nextTurnId(\"user\"))\n const displayContent = payload.display_content ?? payload.content ?? \"\"\n const turn: TurnProjection = {\n id: entryId,\n sequence: this.nextSeq(),\n turn_id: entryId,\n loop_id: \"root\",\n kind: \"message\",\n role: \"user\",\n status: \"completed\",\n blocks: [{ type: \"text\", content: displayContent }],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n return [{ kind: \"upsert\", turn }]\n }\n\n // --- Delta / streaming events ---\n\n private onDelta(\n state: TurnState,\n blockType: \"thinking\" | \"text\",\n _toolCallId: string,\n content: string,\n ): ProjectionUpdate[] | null {\n if (!content) return null\n appendTextBlock(state, blockType, content)\n return this.syncPatch(state)\n }\n\n private onToolCallCreated(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n if (\"arguments_delta\" in payload) {\n const delta = String(payload.arguments_delta ?? \"\")\n const toolCallId = String(payload.id ?? \"\")\n if (delta && toolCallId) {\n appendToolCallArguments(state, toolCallId, delta)\n return this.syncPatch(state)\n }\n return null\n }\n const toolCallId = String(payload.id ?? \"\")\n const toolName = toolNameFromPayload(payload)\n const displayName = String(payload.display_name ?? \"\") || this.displayNameResolver(toolName)\n const args = toolArgsFromPayload(payload)\n upsertToolCall(state, toolCallId, toolName, displayName, args)\n return this.syncPatch(state)\n }\n\n private onResponseDone(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const model = optStr(payload.model)\n if (model) state.model = model\n if (typeof payload.usage === \"object\" && payload.usage !== null) {\n state.usage = { ...(payload.usage as Record<string, unknown>) }\n }\n\n // apply tool calls from full response\n const toolCalls = payload.tool_calls\n if (Array.isArray(toolCalls)) {\n for (const raw of toolCalls) {\n if (typeof raw !== \"object\" || raw === null) continue\n const tc = raw as Record<string, unknown>\n const fn = (tc.function ?? {}) as Record<string, unknown>\n const toolName = String(fn.name ?? \"\")\n const displayName =\n String(tc.display_name ?? \"\") || this.displayNameResolver(toolName)\n upsertToolCall(\n state,\n String(tc.id ?? \"\"),\n toolName,\n displayName,\n String(fn.arguments ?? \"\"),\n )\n }\n }\n\n if (state.toolCalls.length === 0) {\n return this.finalize(loopId, \"completed\")\n }\n return this.syncPatch(state)\n }\n\n private onToolResultDone(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const content = payload.content ?? \"\"\n const status = toolStatusFromResult(content)\n const rawDuration = payload.duration_ms\n const durationMs =\n typeof rawDuration === \"number\" && rawDuration >= 0\n ? Math.round(rawDuration)\n : null\n\n const sl = sourceLoopFor(state.loopId, this.loopDescriptions)\n applyToolResult(state, toolCallId, content, status, durationMs, sl)\n\n if (this.shouldFinalizeAfterToolResults(state)) {\n return this.finalize(loopId, \"completed\")\n }\n return this.syncPatch(state)\n }\n\n private onToolResultDelta(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n appendToolResultDelta(\n state,\n String(payload.tool_call_id ?? \"\"),\n String(payload.content ?? \"\"),\n )\n return this.syncPatch(state)\n }\n\n private onToolUi(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const ui = payload.ui\n if (toolCallId && typeof ui === \"object\" && ui !== null) {\n state.blocks.push({\n type: \"tool_ui\",\n content: ui,\n tool_call_id: toolCallId,\n })\n }\n return this.syncPatch(state)\n }\n\n private onToolBridge(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const bridge = payload.bridge\n if (typeof bridge !== \"object\" || bridge === null) return null\n state.blocks.push({\n type: \"tool_bridge\",\n content: bridge,\n tool_call_id: String(payload.tool_call_id ?? \"\") || null,\n })\n return this.syncPatch(state)\n }\n\n private onToolApprovalRequired(\n state: TurnState,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const toolCallId = String(payload.tool_call_id ?? \"\")\n const toolName = String(payload.tool_name ?? \"\")\n const displayName = this.displayNameResolver(toolName)\n upsertToolCall(state, toolCallId, toolName, displayName, \"\")\n return this.syncPatch(state)\n }\n\n private onChildPause(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const pauseToolData = payload.pause_tool_data\n if (typeof pauseToolData !== \"object\" || pauseToolData === null)\n return this.syncPatch(state)\n\n const ptd = pauseToolData as Record<string, unknown>\n const sourceLoop = ptd.source_loop as Record<string, unknown> | undefined\n if (typeof sourceLoop === \"object\" && sourceLoop) {\n const slName = String(sourceLoop.name ?? \"\")\n const slDesc = optStr(sourceLoop.description)\n if (slName && slDesc) this.loopDescriptions.set(slName, slDesc)\n }\n\n const { childLoopName, childToolCallId, description } =\n normalizeChildPause(payload as Record<string, unknown>)\n\n if (!childToolCallId) return this.syncPatch(state)\n\n const existing = this.pendingChildPauses.get(childToolCallId)\n const parentLoopName = String(\n payload.parent_loop_name ?? existing?.parentLoopName ?? \"root\",\n )\n const parentToolCallId = String(\n payload.parent_fork_tool_call_id ?? existing?.parentToolCallId ?? \"\",\n )\n const resolvedChildLoopName =\n String(payload.child_loop_name ?? \"\") || existing?.childLoopName || childLoopName || loopId\n\n this.pendingChildPauses.set(childToolCallId, {\n parentLoopName,\n parentToolCallId,\n childLoopName: resolvedChildLoopName,\n childToolCallId,\n description: description || existing?.description || \"\",\n })\n\n // apply to child\n applyAskUserPauseToTurn(\n state,\n ptd,\n childToolCallId,\n resolvedChildLoopName,\n this.pendingChildPauses.get(childToolCallId)!.description,\n this.displayNameResolver,\n )\n\n // apply to parent\n const parentTurn =\n this.activeTurns.get(parentLoopName) ?? this.latestTurns.get(parentLoopName)\n if (parentTurn) {\n applyChildPauseToParent(\n parentTurn,\n parentToolCallId,\n resolvedChildLoopName,\n childToolCallId,\n this.pendingChildPauses.get(childToolCallId)!.description,\n this.displayNameResolver,\n )\n }\n\n return this.collectLoopUpdates(loopId, parentLoopName)\n }\n\n private onChatEnd(\n state: TurnState,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const status = String(payload.status ?? \"completed\")\n\n const pauseToolData = payload.pause_tool_data\n if (typeof pauseToolData === \"object\" && pauseToolData !== null) {\n const ptd = pauseToolData as Record<string, unknown>\n const pauseToolName = String(ptd.name ?? \"\")\n const normalized = pauseToolName.includes(\":\")\n ? pauseToolName.split(\":\").pop()!\n : pauseToolName\n const sourceLoop = ptd.source_loop as Record<string, unknown> | undefined\n\n if (typeof sourceLoop === \"object\" && sourceLoop) {\n const slName = String(sourceLoop.name ?? \"\")\n const slDesc = optStr(sourceLoop.description)\n if (slName && slDesc) this.loopDescriptions.set(slName, slDesc)\n\n if (status === \"paused\" && slName) {\n applyChildPauseToParent(\n state,\n String(ptd.parent_fork_tool_call_id ?? \"\"),\n slName,\n String(ptd.tool_call_id ?? \"\"),\n slDesc ?? \"\",\n this.displayNameResolver,\n )\n\n const childTurn = this.activeTurns.get(slName)\n if (childTurn) {\n applyAskUserPauseToTurn(\n childTurn,\n ptd,\n String(ptd.tool_call_id ?? \"\"),\n slName,\n slDesc ?? \"\",\n this.displayNameResolver,\n )\n }\n }\n } else if (status === \"paused\" && normalized === \"AskUserQuestion\") {\n applyAskUserPauseToTurn(\n state,\n ptd,\n String(ptd.tool_call_id ?? \"\"),\n \"\",\n \"\",\n this.displayNameResolver,\n )\n }\n }\n\n const finalStatus = (\n { completed: \"completed\", paused: \"paused\", failed: \"failed\", interrupted: \"interrupted\" } as Record<string, TurnProjection[\"status\"]>\n )[status]\n\n if (!finalStatus) return null\n if (!this.activeTurns.has(loopId)) {\n this.pendingMemoryRefs.delete(loopId)\n }\n return this.finalize(loopId, finalStatus)\n }\n\n private onAgentEnd(\n state: TurnState | null,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const ok = payload.ok !== false\n const status = ok ? \"done\" : \"error\"\n const title = `Agent: ${payload.description ?? payload.skill_id ?? \"agent\"}`\n const detail = optStr(payload.error)\n const metadata = {\n skill_id: optStr(payload.skill_id),\n description: optStr(payload.description),\n parent_fork_tool_call_id: optStr(payload.parent_fork_tool_call_id),\n ok,\n }\n if (state) {\n state.blocks.push(buildSystemNotificationBlock(\"agent:end\", status, title, detail, metadata))\n return this.finalize(loopId, ok ? \"completed\" : \"failed\")\n }\n const turn = buildSystemNotificationTurn(\n this.nextSeq(), this.nextTurnId(\"agent:end\"), loopId, \"agent:end\", status, title, detail, metadata,\n )\n return [{ kind: \"upsert\", turn }]\n }\n\n private onCompaction(\n eventType: string,\n loopId: string,\n payload: Record<string, unknown>,\n ): ProjectionUpdate[] | null {\n const compactionId = String(payload.compaction_id ?? \"\")\n if (!compactionId) return null\n\n const current = {\n ...(this.activeCompactions.get(compactionId) ?? {}),\n ...payload,\n loop_id: loopId,\n }\n\n let status: TurnProjection[\"status\"]\n switch (eventType) {\n case \"compaction:start\":\n status = \"streaming\"\n this.activeCompactions.set(compactionId, current)\n break\n case \"compaction:end\":\n status = \"completed\"\n this.activeCompactions.delete(compactionId)\n break\n case \"compaction:abort\":\n status = \"interrupted\"\n this.activeCompactions.delete(compactionId)\n break\n case \"compaction:error\":\n status = \"failed\"\n this.activeCompactions.delete(compactionId)\n break\n default:\n status = \"streaming\"\n this.activeCompactions.set(compactionId, current)\n }\n\n const turn = buildCompactionTurn(this.nextSeq(), compactionId, loopId, status, current)\n return [{ kind: \"upsert\", turn }]\n }\n\n // --- Internal helpers ---\n\n private syncPatch(state: TurnState): ProjectionUpdate[] {\n const turn = snapshot(state, this.nextSeq(), \"streaming\")\n this.latestTurns.set(state.loopId, turn)\n this.lastTurnIds.set(state.loopId, turn.turn_id)\n return [{ kind: \"upsert\", turn }]\n }\n\n private finalize(\n loopId: string,\n status: TurnProjection[\"status\"],\n ): ProjectionUpdate[] | null {\n const state = this.activeTurns.get(loopId)\n if (!state) return null\n this.activeTurns.delete(loopId)\n const turn = snapshot(state, this.nextSeq(), status)\n this.lastTurnIds.set(loopId, turn.turn_id)\n this.latestTurns.set(loopId, turn)\n return [{ kind: \"upsert\", turn }]\n }\n\n private shouldFinalizeAfterToolResults(state: TurnState): boolean {\n if (state.toolCalls.length === 0) return true\n if (state.toolCalls.some((tc) => tc.status === \"pending\")) return false\n return !state.toolCalls.some((tc) => {\n const normalized = tc.tool_name.includes(\":\")\n ? tc.tool_name.split(\":\").pop()!\n : tc.tool_name\n return PAUSE_TOOL_NAMES.has(normalized)\n })\n }\n\n private collectLoopUpdates(\n ...loopIds: (string | undefined | null)[]\n ): ProjectionUpdate[] {\n const updates: ProjectionUpdate[] = []\n for (const loopId of loopIds) {\n if (!loopId) continue\n const state = this.activeTurns.get(loopId)\n if (state) {\n updates.push(...this.syncPatch(state))\n continue\n }\n const proj = this.latestTurns.get(loopId)\n if (proj) {\n const updated = { ...proj, sequence: this.nextSeq() }\n this.latestTurns.set(loopId, updated)\n updates.push({ kind: \"upsert\", turn: updated })\n }\n }\n return updates\n }\n\n private nextSeq(): number {\n return ++this.seq\n }\n\n private nextTurnId(prefix: string): string {\n this.syntheticCounter++\n const hex = Math.random().toString(16).slice(2, 10)\n return `${prefix}:${this.syntheticCounter}:${hex}`\n }\n}\n\n// --- Utility functions ---\n\nfunction optStr(value: unknown): string | null {\n if (value == null || value === \"\") return null\n return String(value)\n}\n\nfunction toolNameFromPayload(payload: Record<string, unknown>): string {\n const fn = payload.function\n if (typeof fn === \"object\" && fn !== null) {\n return String((fn as Record<string, unknown>).name ?? \"\")\n }\n return String(payload.tool_name ?? \"\")\n}\n\nfunction toolArgsFromPayload(payload: Record<string, unknown>): string {\n const fn = payload.function\n if (typeof fn === \"object\" && fn !== null) {\n return String((fn as Record<string, unknown>).arguments ?? \"\")\n }\n return \"\"\n}\n","import type {\n ContentBlock,\n ToolCallProjection,\n TurnProjection,\n} from \"../../../react/schemas/projection\"\nimport { inferToolStatus } from \"../../../react/schemas/message\"\nimport {\n applyAskUserPauseToTurn,\n applyChildPauseToParent,\n buildCompactionTurn,\n setToolCallStatus,\n} from \"./helpers\"\n\nexport interface RawHistoryEntry {\n id?: string\n kind?: string\n loop_name?: string\n message?: Record<string, unknown>\n data?: Record<string, unknown>\n timestamp?: string\n [key: string]: unknown\n}\n\n/** Rebuild completed UI turns from raw persisted history entries. */\nexport function projectHistory(entries: RawHistoryEntry[]): TurnProjection[] {\n const turns: TurnProjection[] = []\n const toolOwners = new Map<string, TurnProjection>()\n const latestAssistantByLoop = new Map<string, TurnProjection>()\n const pendingChildPauses = new Map<\n string,\n { childLoopId: string; parentLoopId: string; parentToolCallId: string }\n >()\n let sequence = 0\n\n for (const entry of entries) {\n const kind = String(entry.kind ?? \"\")\n const loopId = String(entry.loop_name ?? \"root\")\n const id = String(entry.id ?? `history-${sequence + 1}`)\n if (kind === \"message\" && isRecord(entry.message)) {\n const message = entry.message\n const role = String(message.role ?? \"\")\n if (role === \"tool\") {\n const toolCallId = String(message.tool_call_id ?? \"\")\n const owner = toolOwners.get(toolCallId)\n const toolCall = owner?.tool_calls.find((item) => item.id === toolCallId)\n if (owner && toolCall) {\n toolCall.status = message._error\n ? \"error\"\n : inferToolStatus(String(message.content ?? \"\"))\n toolCall.result = message.content ?? \"\"\n owner.blocks.push({\n type: \"tool_result\",\n content: message.content ?? \"\",\n tool_call_id: toolCallId,\n })\n }\n continue\n }\n if (role !== \"user\" && role !== \"assistant\" && role !== \"system\") continue\n\n const toolCalls = role === \"assistant\" ? buildToolCalls(message.tool_calls) : []\n const blocks = buildBlocks(message, toolCalls)\n const turn: TurnProjection = {\n id,\n sequence: ++sequence,\n turn_id: id,\n loop_id: loopId,\n kind: \"message\",\n role,\n status: message._error ? \"failed\" : \"completed\",\n blocks,\n tool_calls: toolCalls,\n model: stringOrNull(message.model),\n usage: isRecord(message._usage) ? { ...message._usage } : null,\n duration_ms: numberOrZero(message._duration_ms),\n started_at: typeof entry.timestamp === \"string\" ? entry.timestamp : undefined,\n }\n turns.push(turn)\n if (role === \"assistant\") latestAssistantByLoop.set(loopId, turn)\n for (const toolCall of toolCalls) toolOwners.set(toolCall.id, turn)\n continue\n }\n\n if (kind === \"mode_change\") {\n turns.push(markerTurn(id, ++sequence, loopId, \"mode_change\", entry.data ?? {}))\n } else if (kind === \"plan_status\") {\n const data = entry.data ?? {}\n turns.push(\n markerTurn(id, ++sequence, loopId, \"plan_status\", {\n plan_yaml: data.plan_yaml ?? \"\",\n statuses: data.statuses ?? data._statuses ?? {},\n }),\n )\n } else if (kind === \"tool_ui\" || kind === \"tool_bridge\") {\n const data = entry.data ?? {}\n const toolCallId = String(data.tool_call_id ?? \"\")\n const owner = toolOwners.get(toolCallId) ?? findLatestAssistant(turns, loopId)\n const content = kind === \"tool_ui\" ? data.ui : data.bridge\n if (owner && content !== undefined) {\n owner.blocks.push({\n type: kind,\n content,\n tool_call_id: toolCallId || null,\n })\n }\n } else if (kind === \"compaction\" || kind === \"tool_result_archive\") {\n const data = entry.data ?? {}\n const compactionId = String(data.compaction_id ?? entry.id ?? `history-${sequence + 1}`)\n let content = isRecord(entry.message) ? entry.message.content : undefined\n if (kind === \"tool_result_archive\") {\n const archivedCount = Array.isArray(data.archived_files) ? data.archived_files.length : 0\n content = `<compaction-summary>\\n已归档 ${archivedCount} 个大型工具结果。\\n</compaction-summary>`\n }\n turns.push(\n buildCompactionTurn(++sequence, compactionId, loopId, \"completed\", {\n ...data,\n content,\n }),\n )\n } else if (kind === \"child_pause\") {\n const data = entry.data ?? {}\n const sourceLoop = isRecord(data.source_loop) ? data.source_loop : {}\n const childLoopId = String(data.child_loop_name ?? sourceLoop.name ?? \"\")\n const childToolCallId = String(data.child_pause_tool_call_id ?? \"\")\n const parentToolCallId = String(data.parent_fork_tool_call_id ?? \"\")\n const pauseToolData = isRecord(data.pause_tool_data) ? data.pause_tool_data : {}\n const description = String(sourceLoop.description ?? \"\")\n applyAskUserPauseToTurn(\n latestAssistantByLoop.get(childLoopId),\n pauseToolData,\n childToolCallId,\n childLoopId,\n description,\n (name) => name,\n )\n applyChildPauseToParent(\n latestAssistantByLoop.get(loopId),\n parentToolCallId,\n childLoopId,\n childToolCallId,\n description,\n (name) => name,\n )\n if (childToolCallId) {\n pendingChildPauses.set(childToolCallId, {\n childLoopId,\n parentLoopId: loopId,\n parentToolCallId,\n })\n }\n } else if (kind === \"ask_user_answer\") {\n const data = entry.data ?? {}\n const toolCallId = String(data.tool_call_id ?? \"\")\n const pending = pendingChildPauses.get(toolCallId)\n if (pending) {\n setToolCallStatus(latestAssistantByLoop.get(pending.childLoopId), toolCallId, \"done\", null, null)\n setToolCallStatus(\n latestAssistantByLoop.get(pending.parentLoopId),\n pending.parentToolCallId,\n \"done\",\n null,\n null,\n )\n pendingChildPauses.delete(toolCallId)\n } else {\n setToolCallStatus(latestAssistantByLoop.get(loopId), toolCallId, \"done\", null, null)\n }\n turns.push(\n markerTurn(\n id,\n ++sequence,\n loopId,\n \"ask_user_answer\",\n data,\n toolCallId || null,\n ),\n )\n }\n }\n return turns\n}\n\nfunction buildToolCalls(value: unknown): ToolCallProjection[] {\n if (!Array.isArray(value)) return []\n return value.filter(isRecord).map((raw) => {\n const fn = isRecord(raw.function) ? raw.function : {}\n const name = String(fn.name ?? \"\")\n return {\n id: String(raw.id ?? \"\"),\n tool_name: name,\n display_name: String(raw.display_name ?? name),\n arguments: typeof fn.arguments === \"string\" ? fn.arguments : JSON.stringify(fn.arguments ?? {}),\n status: \"running\",\n result: null,\n }\n })\n}\n\nfunction buildBlocks(\n message: Record<string, unknown>,\n toolCalls: ToolCallProjection[],\n): ContentBlock[] {\n const stored = message._blocks\n const blocks: ContentBlock[] = []\n if (Array.isArray(stored)) {\n for (const raw of stored) {\n if (!isRecord(raw)) continue\n const type = String(raw.type ?? \"\")\n if (type === \"thinking\") blocks.push({ type, content: raw.thinking ?? raw.content ?? \"\" })\n if (type === \"text\") blocks.push({ type, content: raw.text ?? raw.content ?? \"\" })\n }\n } else if (message.content !== undefined && message.content !== \"\") {\n blocks.push({ type: \"text\", content: message.content })\n }\n for (const toolCall of toolCalls) {\n blocks.push({\n type: \"tool_use\",\n content: { name: toolCall.tool_name, arguments: toolCall.arguments },\n tool_call_id: toolCall.id,\n })\n }\n return blocks\n}\n\nfunction markerTurn(\n id: string,\n sequence: number,\n loopId: string,\n type: \"mode_change\" | \"plan_status\" | \"ask_user_answer\",\n content: Record<string, unknown>,\n toolCallId: string | null = null,\n): TurnProjection {\n return {\n id,\n sequence,\n turn_id: id,\n loop_id: loopId,\n kind: type as TurnProjection[\"kind\"],\n role: \"system\",\n status: \"completed\",\n blocks: [{ type, content, tool_call_id: toolCallId }],\n tool_calls: [],\n model: null,\n usage: null,\n duration_ms: 0,\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction stringOrNull(value: unknown): string | null {\n return typeof value === \"string\" ? value : null\n}\n\nfunction numberOrZero(value: unknown): number {\n return typeof value === \"number\" ? value : 0\n}\n\nfunction findLatestAssistant(\n turns: TurnProjection[],\n loopId: string,\n): TurnProjection | undefined {\n for (let index = turns.length - 1; index >= 0; index -= 1) {\n const turn = turns[index]\n if (turn?.role === \"assistant\" && turn.loop_id === loopId) return turn\n }\n return undefined\n}\n","import type { BladeClient } from \"../blade-client\"\nimport type {\n ChatEndPayload,\n ChatSendPayload,\n ChatStartPayload,\n SystemErrorPayload,\n} from \"../types/socket-events\"\nimport type { RunOptions, RunResult, RunTrace } from \"../types/sdk-profile\"\nimport { ClientProjectionBuilder, type RawEvent } from \"../shared/projection\"\n\nconst SYSTEM_ERROR_CHAT_END_GRACE_MS = 1_000\n\nexport class RunsResource {\n constructor(private client: BladeClient) {}\n\n async run(sessionId: string, message: string, options: RunOptions = {}): Promise<RunResult> {\n const timeoutMs = options.timeoutMs ?? 300_000\n const socket = this.client.socket()\n await ensureSocketConnected(socket, timeoutMs, { session_id: sessionId })\n\n return new Promise<RunResult>((resolve, reject) => {\n const events: unknown[] = []\n let settled = false\n let stopSent = false\n let started = false\n let chatRunId: string | undefined\n let systemErrorTimeout: ReturnType<typeof setTimeout> | null = null\n const projectionBuilder = new ClientProjectionBuilder()\n const timeout = setTimeout(() => {\n fail(new Error(`run timed out after ${timeoutMs}ms`))\n }, timeoutMs)\n\n const cleanup = (sendStop: boolean) => {\n clearTimeout(timeout)\n if (systemErrorTimeout) {\n clearTimeout(systemErrorTimeout)\n systemErrorTimeout = null\n }\n socket.off(\"chat:start\", onChatStart)\n socket.off(\"turn:events\", onTurnEvents)\n socket.off(\"chat:end\", onChatEnd)\n socket.off(\"system:error\", onSystemError)\n if (sendStop && !stopSent) {\n stopSent = true\n socket.emit(\"chat:stop\", { session_id: sessionId }, () => undefined)\n }\n socket.emit(\"session:unsubscribe\", { session_id: sessionId })\n }\n\n const finish = (payload: ChatEndPayload) => {\n if (settled) return\n settled = true\n cleanup(false)\n const payloadChatRunId =\n typeof payload.chat_run_id === \"string\" ? payload.chat_run_id : undefined\n resolve({\n sessionId,\n chatRunId: chatRunId ?? payloadChatRunId,\n result: payload.result,\n events,\n })\n }\n\n const fail = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(true)\n reject(error)\n }\n\n const failWithoutStop = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(false)\n reject(error)\n }\n\n function onChatStart(payload: ChatStartPayload) {\n if (!isSessionEvent(payload, sessionId)) return\n started = true\n events.push({ type: \"chat:start\", payload })\n }\n\n function onTurnEvents(payload: { session_id?: string; events?: RawEvent[] }) {\n if (!isSessionEvent(payload, sessionId) || !payload.events?.length) return\n for (const update of projectionBuilder.processBatch(payload.events)) {\n if (update.kind === \"upsert\") {\n events.push({ type: \"turn:end\", payload: { ...update.turn, session_id: sessionId } })\n }\n }\n }\n\n function onSystemError(payload: SystemErrorPayload) {\n if (!isSessionEvent(payload, sessionId)) return\n events.push({ type: \"system:error\", payload })\n const error = new Error(payload.message || \"run failed\")\n if (!started) {\n failWithoutStop(error)\n return\n }\n if (systemErrorTimeout) {\n clearTimeout(systemErrorTimeout)\n }\n systemErrorTimeout = setTimeout(() => {\n systemErrorTimeout = null\n fail(error)\n }, SYSTEM_ERROR_CHAT_END_GRACE_MS)\n }\n\n function onChatEnd(payload: ChatEndPayload) {\n if (!isSessionEvent(payload, sessionId)) return\n events.push({ type: \"chat:end\", payload })\n chatRunId = typeof payload.chat_run_id === \"string\" ? payload.chat_run_id : chatRunId\n if (payload.status === \"failed\") {\n failWithoutStop(new Error(errorMessageFromResult(payload.result) ?? \"run failed\"))\n return\n }\n finish(payload)\n }\n\n socket.on(\"chat:start\", onChatStart)\n socket.on(\"turn:events\", onTurnEvents)\n socket.on(\"chat:end\", onChatEnd)\n socket.on(\"system:error\", onSystemError)\n socket.emit(\"session:subscribe\", { session_id: sessionId, event_format: \"raw\" })\n socket.emit(\"chat:send\", buildChatSendPayload(sessionId, message, options))\n })\n }\n\n async collectTrace(run: RunResult): Promise<RunTrace> {\n const history = await this.client.sessions.getSessionHistory(run.sessionId)\n return {\n events: run.events,\n history: history.nodes,\n result: run.result,\n configSnapshot: collectConfigSnapshot(run.events),\n }\n }\n}\n\nfunction buildChatSendPayload(\n sessionId: string,\n message: string,\n options: RunOptions,\n): ChatSendPayload {\n return {\n session_id: sessionId,\n message: message as unknown as ChatSendPayload[\"message\"],\n headless: options.headless ?? false,\n output_schema: options.outputSchema ?? null,\n runtime_env: options.runtimeEnv ?? null,\n compaction_ratio: options.compactionRatio ?? null,\n model: options.model ?? null,\n }\n}\n\nfunction collectConfigSnapshot(events: unknown[]): Record<string, unknown> {\n const chatStart = events.find((event) => {\n if (!isRecord(event) || event.type !== \"chat:start\") return false\n return isRecord(event.payload)\n })\n if (!isRecord(chatStart) || !isRecord(chatStart.payload)) {\n return {}\n }\n return chatStart.payload\n}\n\nfunction errorMessageFromResult(result: unknown): string | null {\n if (isRecord(result) && typeof result.err_msg === \"string\" && result.err_msg) {\n return result.err_msg\n }\n return null\n}\n\nfunction isSessionEvent(payload: { session_id?: string | null }, sessionId: string): boolean {\n return !payload.session_id || payload.session_id === sessionId\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction ensureSocketConnected(\n socket: ReturnType<BladeClient[\"socket\"]>,\n timeoutMs: number,\n detail: Record<string, unknown>,\n): Promise<void> {\n if (socket.connected) {\n return Promise.resolve()\n }\n return new Promise((resolve, reject) => {\n let settled = false\n const timeout = setTimeout(() => {\n const detailText = JSON.stringify(detail)\n finish(() =>\n reject(new Error(`socket connection timed out after ${timeoutMs}ms: ${detailText}`)),\n )\n }, timeoutMs)\n const onConnect = () => finish(resolve)\n const onConnectError = (error: unknown) => {\n finish(() => reject(error instanceof Error ? error : new Error(\"socket connection failed\")))\n }\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n clearTimeout(timeout)\n socket.off(\"connect\", onConnect)\n socket.off(\"connect_error\", onConnectError)\n callback()\n }\n socket.on(\"connect\", onConnect)\n socket.on(\"connect_error\", onConnectError)\n socket.connect()\n })\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface PreviewUrlItem {\n name: string\n url: string\n}\n\nexport interface QuickScenario {\n id: number\n name: string\n prompt_template: string\n skills: string[]\n preview_urls: PreviewUrlItem[]\n init_script: string\n icon: string\n created_at: string\n updated_at: string\n}\n\nexport interface BladeHubScenarioResource {\n resource_id: string\n resource_name: string\n name: string\n description: string\n prompt_template: string\n skills: string[]\n preview_urls: PreviewUrlItem[]\n init_script: string\n icon: string\n raw?: Record<string, unknown>\n}\n\nexport interface CreateQuickScenarioPayload {\n name: string\n prompt_template?: string\n skills?: string[]\n preview_urls?: PreviewUrlItem[]\n init_script?: string\n icon?: string\n}\n\nexport interface UpdateQuickScenarioPayload extends CreateQuickScenarioPayload {}\n\nexport class ScenariosResource {\n constructor(private client: BladeClient) {}\n\n listQuickScenarios(init?: RequestInit): Promise<QuickScenario[]> {\n return this.client.jsonFromInit(\"/api/scenarios\", init)\n }\n\n createQuickScenario(payload: CreateQuickScenarioPayload, init?: RequestInit): Promise<QuickScenario> {\n return this.client.jsonFromInit(\"/api/scenarios\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n deleteQuickScenario(scenarioId: number, init?: RequestInit): Promise<{ ok: boolean }> {\n return this.client.jsonFromInit(`/api/scenarios/${scenarioId}`, {\n method: \"DELETE\",\n ...init,\n })\n }\n\n updateQuickScenario(\n scenarioId: number,\n payload: UpdateQuickScenarioPayload,\n init?: RequestInit,\n ): Promise<QuickScenario> {\n return this.client.jsonFromInit(`/api/scenarios/${scenarioId}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n async listBladeHubScenarioResources(\n limit = 500,\n init?: RequestInit,\n ): Promise<BladeHubScenarioResource[]> {\n const params = new URLSearchParams({ limit: String(limit) })\n const response = await this.client.jsonFromInit<{ items: BladeHubScenarioResource[] }>(\n `/api/skills/scenario-resources?${params}`,\n init,\n )\n return response.items ?? []\n }\n}\n","import type { BackgroundTask } from \"../../react/schemas/background\"\nimport type { TurnProjection } from \"../../react/schemas/projection\"\nimport type { SessionDetail, SessionInfo, TemplateId } from \"../../react/schemas/session\"\nimport type { Task } from \"../../react/schemas/task\"\nimport type { BladeClient, UploadProgress } from \"../blade-client\"\nimport type { SessionProfile } from \"../types/sdk-profile\"\nimport { projectHistory, type RawHistoryEntry } from \"../shared/projection\"\n\nexport interface CreateSessionRequest {\n intent?: string\n template_id?: TemplateId\n solution_id?: string\n biz_role_id?: string | null\n primary_skill_id?: string | null\n model?: string | null\n enable_thinking?: boolean | null\n memory_enabled?: boolean | null\n env?: Record<string, string>\n disable_tools?: string[] | null\n session_solution_asset_id?: string | null\n compaction_ratio?: number | null\n}\n\nexport interface CheckpointNode {\n id: string\n parent_id: string | null\n content_preview: string\n content: string\n timestamp: string\n}\n\nexport type ContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string; detail?: string } }\n\nexport interface HistoryNode {\n id: string\n parent_id: string | null\n kind: string\n role: string\n timestamp: string\n preview: string\n content: string | ContentPart[]\n tool_calls: Array<{\n id?: string\n type?: string\n function?: { name?: string; arguments?: string }\n }> | null\n usage: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number } | null\n total_tokens: number\n token_diff: number\n is_deprecated: boolean\n loop_name: string\n}\n\nexport interface SessionHistory {\n nodes: HistoryNode[]\n active_branch: string | null\n branches: string[]\n system_prompt_tokens?: number | null\n tools_tokens?: number | null\n tokenizer_model?: string | null\n}\n\nexport interface TokenizeResult {\n model: string\n prompt_tokens: number\n prompt: string\n}\n\nexport interface PaginatedSessionsResult {\n items: SessionInfo[]\n total: number\n limit: number\n offset: number\n content_match_truncated?: boolean\n}\n\ninterface ListSessionsPageParams {\n limit: number\n offset: number\n template_id_prefix?: string\n solution_id?: string\n q?: string\n}\n\nexport interface SkillDevSession {\n session: SessionInfo\n skill_id: string\n display_name: string\n skill_description: string\n}\n\nexport interface ShareLinkResult {\n token: string\n url: string\n expires_at: string | null\n}\n\nexport interface SessionContextStats {\n tokens_used: number\n context_window: number\n compaction_ratio: number\n}\n\nexport interface FileEntry {\n name: string\n path: string\n is_dir: boolean\n created_at: number\n tags?: string[]\n}\n\nexport type UploadFileEntry = File | { file: File; name: string }\n\nexport interface UploadFilesOptions {\n onProgress?: (progress: UploadProgress) => void\n}\n\nexport interface ImportPreviewSkill {\n name: string\n description: string\n path: string\n}\n\nexport interface ImportPreviewScenario {\n scenario?: { name?: string }\n skills?: string[]\n preview_urls?: string[]\n init_script?: string\n generated_at?: string\n}\n\nexport interface ImportPreview {\n user_messages: string[]\n turn_count: number\n skills: ImportPreviewSkill[]\n scenario: ImportPreviewScenario | null\n}\n\nfunction toCreateSessionPayload(request: CreateSessionRequest) {\n return {\n intent: request.intent ?? \"\",\n template_id: request.template_id,\n solution_id: request.solution_id,\n biz_role_id: request.biz_role_id ?? null,\n model: request.model ?? null,\n enable_thinking: request.enable_thinking ?? null,\n memory_enabled: request.memory_enabled ?? null,\n primary_skill_id: request.primary_skill_id ?? null,\n env: request.env,\n disable_tools: request.disable_tools ?? null,\n session_solution_asset_id: request.session_solution_asset_id ?? null,\n compaction_ratio: request.compaction_ratio ?? null,\n }\n}\n\nexport class SessionsResource {\n constructor(private client: BladeClient) {}\n\n private fetchSessionsPage({\n limit,\n offset,\n template_id_prefix,\n solution_id,\n q,\n }: ListSessionsPageParams): Promise<PaginatedSessionsResult> {\n const searchParams = new URLSearchParams()\n searchParams.set(\"limit\", String(limit))\n searchParams.set(\"offset\", String(offset))\n if (template_id_prefix) searchParams.set(\"template_id_prefix\", template_id_prefix)\n if (solution_id) searchParams.set(\"solution_id\", solution_id)\n const trimmedQuery = q?.trim()\n if (trimmedQuery) searchParams.set(\"q\", trimmedQuery)\n return this.client.json(\"GET\", `/api/sessions?${searchParams.toString()}`)\n }\n\n async listSessions(template_id_prefix?: string, solution_id?: string): Promise<SessionInfo[]> {\n const pageSize = 100\n const sessions: SessionInfo[] = []\n let offset = 0\n while (true) {\n const page = await this.fetchSessionsPage({ limit: pageSize, offset, template_id_prefix, solution_id })\n sessions.push(...page.items)\n if (sessions.length >= page.total || page.items.length === 0) return sessions\n offset += page.items.length\n }\n }\n\n listSessionsPaginated(params: {\n limit: number\n offset: number\n template_id_prefix?: string\n solution_id?: string\n q?: string\n }): Promise<PaginatedSessionsResult> {\n return this.fetchSessionsPage(params)\n }\n\n listSessionsWithSkillData(): Promise<SkillDevSession[]> {\n return this.client.json(\"GET\", \"/api/sessions/with-skill-data\")\n }\n\n createSession(\n intent?: string,\n template_id?: TemplateId,\n primary_skill_id?: string | null,\n ): Promise<{ session_id: string }> {\n return this.createSessionWithRequest({ intent, template_id, primary_skill_id })\n }\n\n createSessionWithRequest(request: CreateSessionRequest): Promise<{ session_id: string }> {\n return this.client.json(\"POST\", \"/api/sessions\", toCreateSessionPayload(request))\n }\n\n createWithProfile(params: {\n intent: string\n profile: SessionProfile\n }): Promise<{ session_id: string }> {\n const { intent, profile } = params\n return this.createSessionWithRequest({\n intent,\n ...profileToCreateSessionRequest(profile),\n })\n }\n\n getSession(sessionId: string, init?: RequestInit): Promise<SessionDetail> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}`, init)\n }\n\n updateSession(sessionId: string, payload: { intent?: string }): Promise<SessionDetail> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}`, payload)\n }\n\n setSessionEnv(sessionId: string, env: Record<string, string>): Promise<SessionDetail> {\n return this.client.json(\"PUT\", `/api/sessions/${sessionId}/env`, { env })\n }\n\n pinSession(sessionId: string, pinned: boolean): Promise<SessionInfo> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/pin`, { pinned })\n }\n\n startReplaySession(sourceSessionId: string, speed: 1 | 2 | 5 = 5): Promise<{ session_id: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sourceSessionId}/replay`, { speed })\n }\n\n updateReplaySession(\n sessionId: string,\n payload: { speed?: 1 | 2 | 5; status?: \"autonomous\" },\n ): Promise<{ replay_state: SessionInfo[\"replay_state\"] }> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/replay`, payload)\n }\n\n updateSharing(sessionId: string, shared: boolean): Promise<{ shared: boolean }> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/sharing`, { shared })\n }\n\n updateSessionMemory(sessionId: string, memoryEnabled: boolean): Promise<{ memory_enabled: boolean }> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/memory`, {\n memory_enabled: memoryEnabled,\n })\n }\n\n createShare(sessionId: string): Promise<ShareLinkResult> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/share`, {})\n }\n\n revokeShare(sessionId: string, token: string): Promise<{ revoked: boolean }> {\n return this.client.json(\"DELETE\", `/api/sessions/${sessionId}/share/${encodeURIComponent(token)}`)\n }\n\n async getSharedSession(token: string): Promise<TurnProjection[]> {\n const entries = await this.client.jsonFromInit<RawHistoryEntry[]>(`/api/share/${encodeURIComponent(token)}`, {\n credentials: \"omit\",\n headers: { Accept: \"application/json\" },\n })\n return projectHistory(entries)\n }\n\n getSessionTasks(sessionId: string): Promise<Task[]> {\n return this.client.json(\"GET\", `/api/sessions/${sessionId}/tasks`)\n }\n\n async getSessionTurns(sessionId: string): Promise<TurnProjection[]> {\n const entries = await this.client.json<RawHistoryEntry[]>(\n \"GET\",\n `/api/sessions/${sessionId}/messages`,\n )\n return projectHistory(entries)\n }\n\n getSessionContextStats(sessionId: string, init?: RequestInit): Promise<SessionContextStats> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}/context-stats`, init)\n }\n\n getSessionHistory(sessionId: string, init?: RequestInit): Promise<SessionHistory> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}/history`, init)\n }\n\n tokenizePrompt(prompt: string, model?: string): Promise<TokenizeResult> {\n return this.client.json(\"POST\", \"/api/sessions/tokenize/prompt\", { prompt, model })\n }\n\n tokenizeMessages(\n messages: Array<Record<string, unknown>>,\n options?: {\n model?: string\n add_generation_prompt?: boolean\n enable_thinking?: boolean | null\n tools?: Array<Record<string, unknown>>\n },\n ): Promise<TokenizeResult> {\n return this.client.json(\"POST\", \"/api/sessions/tokenize/messages\", {\n messages,\n model: options?.model,\n add_generation_prompt: options?.add_generation_prompt ?? true,\n enable_thinking: options?.enable_thinking ?? null,\n tools: options?.tools ?? null,\n })\n }\n\n getSessionCheckpoints(\n sessionId: string,\n init?: RequestInit,\n ): Promise<{ nodes: CheckpointNode[]; leaf_id: string | null }> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}/checkpoints`, init)\n }\n\n checkoutSession(\n sessionId: string,\n checkpointId: string,\n position: \"before\" | \"turn_end\",\n mode?: \"both\" | \"conversation\" | \"code\",\n linear?: boolean,\n ): Promise<{\n id: string\n content: string\n position: string\n mode?: string\n files_restored?: boolean\n linear?: boolean\n }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/checkout`, {\n checkpoint_id: checkpointId,\n position,\n ...(mode ? { mode } : {}),\n ...(linear ? { linear } : {}),\n })\n }\n\n async rewindSession(sessionId: string, checkpointId: string): Promise<{ id: string; content: string }> {\n const result = await this.checkoutSession(sessionId, checkpointId, \"before\")\n return { id: result.id, content: result.content }\n }\n\n switchBranch(sessionId: string, checkpointId: string): Promise<{ id: string; leaf_id: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/switch-branch`, {\n checkpoint_id: checkpointId,\n })\n }\n\n deleteSession(sessionId: string): Promise<{ deleted: boolean }> {\n return this.client.json(\"DELETE\", `/api/sessions/${sessionId}`)\n }\n\n listBackgroundTasks(sessionId: string, init?: RequestInit): Promise<BackgroundTask[]> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}/background-tasks`, init)\n }\n\n getBackgroundTask(\n sessionId: string,\n taskId: string,\n tail = 100,\n init?: RequestInit,\n ): Promise<BackgroundTask> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}/background-tasks/${taskId}?tail=${tail}`, init)\n }\n\n stopBackgroundTask(\n sessionId: string,\n taskId: string,\n ): Promise<{ message: string; task?: BackgroundTask | null }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/background-tasks/${taskId}/stop`)\n }\n\n\n probeSessionUrl(sessionId: string, url: string): Promise<{ reachable: boolean }> {\n return this.client.json(\n \"GET\",\n `/api/sessions/${sessionId}/probe-url?url=${encodeURIComponent(url)}`,\n )\n }\n\n listDir(sessionId: string, dirPath: string): Promise<FileEntry[]> {\n return this.client.json(\"GET\", `/api/sessions/${sessionId}/ls/${encodeURIComponent(dirPath)}`)\n }\n\n async uploadFiles(\n sessionId: string,\n dirPath: string,\n files: FileList | File[] | UploadFileEntry[],\n options: UploadFilesOptions = {},\n ): Promise<{ uploaded: string[]; failed: string[] }> {\n const formData = new FormData()\n const entries = Array.from(files).map((f) =>\n f instanceof File ? { file: f, name: f.name } : (f as { file: File; name: string }),\n )\n for (const entry of entries) {\n formData.append(\"files\", entry.file, entry.name)\n }\n // webkitdirectory 选择的文件带 webkitRelativePath;拖入的文件夹把相对路径放在 name 里。\n // 任一形式包含目录分隔符时都发送 paths,供服务端重建目录结构。\n const relativePaths = entries.map((e) => e.file.webkitRelativePath || e.name)\n if (relativePaths.some((p) => p.includes(\"/\"))) {\n formData.append(\"paths\", JSON.stringify(relativePaths))\n }\n const response = await this.client.formData(\n \"POST\",\n `/api/sessions/${sessionId}/upload/${encodeURIComponent(dirPath)}`,\n formData,\n { expectOk: false, onUploadProgress: options.onProgress },\n )\n return response.json()\n }\n\n async deleteFile(sessionId: string, filePath: string): Promise<void> {\n await this.client.json(\"DELETE\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}`)\n }\n\n writeFile(sessionId: string, filePath: string, content: string): Promise<{ success: boolean }> {\n return this.client.json(\"PUT\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}`, {\n content,\n })\n }\n\n renameFile(sessionId: string, filePath: string, newName: string): Promise<{ path: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}/rename`, {\n new_name: newName,\n })\n }\n\n copyFile(sessionId: string, filePath: string): Promise<{ path: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}/copy`)\n }\n\n shareFile(\n sessionId: string,\n sourcePath: string,\n linkName?: string,\n shareFolder?: string,\n ): Promise<{ path: string; target: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/share-file`, {\n source_path: sourcePath,\n link_name: linkName ?? \"\",\n share_folder: shareFolder ?? \"\",\n })\n }\n\n getDownloadDirUrl(sessionId: string, dirPath: string): string {\n return this.client.buildAuthedUrl(`/api/sessions/${sessionId}/download-dir/${encodeURIComponent(dirPath)}`)\n }\n\n async exportSession(sessionId: string): Promise<void> {\n await this.getSession(sessionId)\n const a = document.createElement(\"a\")\n a.href = this.client.buildAuthedUrl(`/api/sessions/${sessionId}/export`)\n a.download = `${sessionId}.zip`\n document.body.appendChild(a)\n a.click()\n a.remove()\n }\n\n async previewImport(file: File): Promise<ImportPreview> {\n const form = new FormData()\n form.append(\"file\", file)\n const res = await this.client.formData(\"POST\", \"/api/sessions/preview-import\", form)\n return res.json()\n }\n\n async importSession(\n file: File,\n name?: string,\n solutionId?: string | null,\n ): Promise<{ session_id: string }> {\n const form = new FormData()\n form.append(\"file\", file)\n if (name) form.append(\"name\", name)\n if (solutionId) form.append(\"solution_id\", solutionId)\n const res = await this.client.formData(\"POST\", \"/api/sessions/import\", form)\n return res.json()\n }\n}\n\nfunction profileToCreateSessionRequest(profile: SessionProfile): CreateSessionRequest {\n const solution = profile.solution\n return {\n solution_id: solution?.kind === \"existing\" ? solution.solutionId : undefined,\n session_solution_asset_id: solution?.kind === \"prepared\" ? solution.assetId : undefined,\n biz_role_id: solution?.bizRoleId ?? null,\n model: profile.model ?? null,\n compaction_ratio: profile.compactionRatio ?? null,\n enable_thinking: profile.enableThinking ?? null,\n memory_enabled: profile.memoryEnabled ?? null,\n disable_tools: profile.disableTools ?? null,\n env: profile.env,\n }\n}\n","import type {\n PartnerSkillInstallPayload,\n PartnerSkillInstallResult,\n SessionSkillUploadPayload,\n SessionSkillUploadResult,\n} from \"../../react/schemas/partner-skill\"\nimport type { SkillDetail, SkillSearchResult, SkillStats, SkillSummary } from \"../../react/schemas/skill\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport interface GlobalSkillStats {\n remote_configured: boolean\n remote_connected: boolean\n installed_skill_count: number\n}\n\n// 远程 registry 已安装 skill 的最小字段集。\n// 后端原样透传 registry 的 /api/me/skills 响应里的 skills 数组。\nexport interface InstalledRegistrySkill {\n id: string\n name: string\n display_name?: string | null\n description?: string | null\n is_installed?: boolean\n is_preset?: boolean\n preinstalled?: boolean\n org_display_name?: string | null\n // True 表示该 skill 自带 tools.py(代码型)。旧版 bh 不返回此字段时为 undefined。\n has_tools?: boolean\n}\n\nexport class SkillsResource {\n constructor(private client: BladeClient) {}\n\n listSkills(init?: RequestInit): Promise<SkillSummary[]> {\n return this.client.jsonFromInit(\"/api/skills\", init)\n }\n\n listInstalledRegistrySkills(init?: RequestInit): Promise<InstalledRegistrySkill[]> {\n return this.client.jsonFromInit(\"/api/skills/installed\", init)\n }\n\n listSessionSkills(sessionId: string, init?: RequestInit): Promise<SkillSummary[]> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skills`, init)\n }\n\n resyncSkills(\n sessionId: string,\n init?: RequestInit,\n ): Promise<{ detail?: string; copied: number; removed: number; preserved: number }> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skills:resync`, {\n method: \"POST\",\n ...init,\n })\n }\n\n async searchSkills(query: string, limit = 10, init?: RequestInit): Promise<SkillSearchResult[]> {\n const params = new URLSearchParams({ q: query, limit: String(limit) })\n const response = await this.client.jsonFromInit<{ results: SkillSearchResult[] }>(\n `/api/skills/search?${params}`,\n init,\n )\n return response.results\n }\n\n getSkillStats(sessionId: string, init?: RequestInit): Promise<SkillStats> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skill-stats`, init)\n }\n\n getGlobalSkillStats(init?: RequestInit): Promise<GlobalSkillStats> {\n return this.client.jsonFromInit(\"/api/skill-store/stats\", init)\n }\n\n getSkill(skillName: string, init?: RequestInit): Promise<SkillDetail> {\n return this.client.jsonFromInit(`/api/skills/${encodeURIComponent(skillName)}`, init)\n }\n\n uploadSessionSkill(\n sessionId: string,\n payload: SessionSkillUploadPayload,\n init?: RequestInit,\n ): Promise<SessionSkillUploadResult> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skills:upload`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n installPartnerSkill(\n sessionId: string,\n payload: PartnerSkillInstallPayload,\n init?: RequestInit,\n ): Promise<PartnerSkillInstallResult> {\n return this.uploadSessionSkill(sessionId, payload, init)\n }\n}\n","import type { BizRole, Solution } from \"../../react/types/solution\"\nimport type { BladeClient } from \"../blade-client\"\nimport type { ExistingSolutionRef, PreparedSolution } from \"../types/sdk-profile\"\n\nexport type ExportedSolutionFile = {\n blob: Blob\n filename: string\n}\n\nexport class SolutionsResource {\n constructor(private client: BladeClient) {}\n\n async fetchSolutions(): Promise<Solution[]> {\n const payload = await this.client.json<Solution[] | { items?: Solution[] }>(\"GET\", \"/api/solutions\")\n if (Array.isArray(payload)) {\n return payload\n }\n return Array.isArray(payload.items) ? payload.items : []\n }\n\n async prepareFromZip(file: File | Blob): Promise<PreparedSolution> {\n const form = new FormData()\n form.append(\"file\", file)\n const response = await this.client.formData(\"POST\", \"/api/session-assets/solutions\", form)\n const payload = await response.json()\n return toPreparedSolution(payload)\n }\n\n async ensureFromRegistry(registryId: string): Promise<ExistingSolutionRef> {\n const payload = await this.client.json<{ solution_id?: string; solutionId?: string }>(\n \"POST\",\n \"/api/solutions/ensure-from-registry\",\n { registry_id: registryId },\n )\n return { kind: \"existing\", solutionId: payload.solutionId ?? payload.solution_id ?? \"\" }\n }\n\n fetchSolutionFile(solutionId: string, filePath: string): Promise<string> {\n return this.client.text(\n \"GET\",\n `/api/solutions/${encodeURIComponent(solutionId)}/files/${encodeURIComponent(filePath)}`,\n )\n }\n\n async fetchSolutionBizRoles(solutionId: string, userId?: string): Promise<BizRole[]> {\n const params = new URLSearchParams()\n if (userId) {\n params.set(\"user_id\", userId)\n }\n const suffix = params.toString() ? `?${params.toString()}` : \"\"\n const payload = await this.client.json<{ items?: BizRole[] }>(\n \"GET\",\n `/api/solutions/${encodeURIComponent(solutionId)}/biz-roles${suffix}`,\n )\n return Array.isArray(payload.items) ? payload.items : []\n }\n\n /**\n * 把编辑会话里的 solution_name/ 打成 zip 并下载。\n * 返回 Blob 和从 Content-Disposition 解析出来的文件名,\n * 调用方自己负责触发浏览器下载(<a download> 或 window.URL.createObjectURL)。\n */\n async exportSolution(sessionId: string): Promise<ExportedSolutionFile> {\n const response = await this.client.responseFromInit(\n `/api/sessions/${encodeURIComponent(sessionId)}/solution-package`,\n { method: \"POST\" },\n )\n const filename =\n parseContentDispositionFilename(response.headers.get(\"content-disposition\")) ??\n `${sessionId}.zip`\n const blob = await response.blob()\n return { blob, filename }\n }\n\n /**\n * 把编辑会话里的 solution 打包并发布到 skill_registry 商店。\n * 后端会打 zip 并 POST 到 registry,这里只传 org + name + overwrite。\n */\n publishSolution(\n sessionId: string,\n org: string,\n name: string,\n overwrite = true,\n ): Promise<{ success: boolean; solution_id: string; message: string }> {\n return this.client.json(\n \"POST\",\n `/api/sessions/${encodeURIComponent(sessionId)}/solution-publish`,\n { org, name, overwrite },\n )\n }\n}\n\nfunction toPreparedSolution(payload: unknown): PreparedSolution {\n const data = isRecord(payload) ? payload : {}\n const roles = Array.isArray(data.roles)\n ? data.roles.filter((role): role is string => typeof role === \"string\")\n : []\n return {\n kind: \"prepared\",\n assetId: stringField(data, \"assetId\") ?? stringField(data, \"asset_id\") ?? \"\",\n solutionId: stringField(data, \"solutionId\") ?? stringField(data, \"solution_id\") ?? \"\",\n roles,\n expiresAt: stringField(data, \"expiresAt\") ?? stringField(data, \"expires_at\") ?? \"\",\n }\n}\n\nfunction stringField(data: Record<string, unknown>, key: string): string | null {\n const value = data[key]\n return typeof value === \"string\" ? value : null\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction parseContentDispositionFilename(header: string | null): string | null {\n if (!header) return null\n // RFC 5987: filename*=UTF-8''<percent-encoded> 优先\n const starMatch = header.match(/filename\\*\\s*=\\s*[^']*''([^;]+)/i)\n if (starMatch) {\n try {\n return decodeURIComponent(starMatch[1].trim())\n } catch {\n // fallthrough\n }\n }\n const plainMatch = header.match(/filename\\s*=\\s*\"([^\"]+)\"/i) ??\n header.match(/filename\\s*=\\s*([^;]+)/i)\n if (plainMatch) {\n return plainMatch[1].trim().replace(/^\"|\"$/g, \"\")\n }\n return null\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport type ComputerUpgradeReason =\n | \"no_container\"\n | \"no_target\"\n | \"current_latest\"\n | \"up_to_date\"\n | \"upgrade_available\"\n\nexport interface ComputerUpgradeStatusResponse {\n upgrade_available: boolean\n reason: ComputerUpgradeReason\n current_version: string | null\n target_version: string | null\n}\n\nexport interface UpgradeComputerResponse {\n target_version: string | null\n previous_version: string | null\n removed_containers: number\n removed_volume: boolean\n cleared_memo: number\n}\n\nexport class UserPreferencesResource {\n constructor(private client: BladeClient) {}\n\n async getUserPreference(key: string): Promise<string | null> {\n const response = await this.client.json<{ value: string | null }>(\n \"GET\",\n `/api/user/preferences/${encodeURIComponent(key)}`,\n )\n return response.value\n }\n\n async setUserPreference(key: string, value: string): Promise<void> {\n await this.client.json<{ value: string }>(\n \"PUT\",\n `/api/user/preferences/${encodeURIComponent(key)}`,\n { value },\n )\n }\n\n async getPersistentDefault(): Promise<boolean> {\n const response = await this.client.json<{ value: string | null }>(\n \"GET\",\n \"/api/users/me/preferences/sandbox.persistent_default\",\n )\n return response.value === \"true\"\n }\n\n async setPersistentDefault(value: boolean): Promise<void> {\n await this.client.json<{ value: string }>(\n \"PUT\",\n \"/api/users/me/preferences/sandbox.persistent_default\",\n { value: value ? \"true\" : \"false\" },\n )\n }\n\n async resetComputer(): Promise<void> {\n await this.client.json(\"POST\", \"/api/users/me/reset-computer\", {})\n }\n\n async getComputerUpgradeStatus(): Promise<ComputerUpgradeStatusResponse> {\n return await this.client.json<ComputerUpgradeStatusResponse>(\n \"GET\",\n \"/api/users/me/computer-upgrade\",\n )\n }\n\n async upgradeComputer(): Promise<UpgradeComputerResponse> {\n return await this.client.json<UpgradeComputerResponse>(\n \"POST\",\n \"/api/users/me/upgrade-computer\",\n {},\n )\n }\n}\n","import { io, type Socket } from \"socket.io-client\"\nimport { buildSocketAuth, resolveAuthToken, type AuthOptions } from \"./auth\"\nimport type { ClientToServerEvents, ServerToClientEvents } from \"./types/socket-events\"\n\nexport type TypedSocket = Socket<ServerToClientEvents, ClientToServerEvents>\n\nexport interface CreateSocketOptions extends AuthOptions {\n baseUrl: string\n path?: string\n}\n\nexport function createSocket(options: CreateSocketOptions): TypedSocket {\n const auth = buildSocketAuth(options)\n const token = resolveAuthToken(options)\n return io(options.baseUrl, {\n path: options.path ?? \"/socket.io\",\n withCredentials: true,\n query: token ? { token } : undefined,\n auth: typeof options.token === \"function\" ? (cb) => cb(buildSocketAuth(options) ?? {}) : auth,\n autoConnect: false,\n })\n}\n","export interface AuthOptions {\n token?: string | (() => string | null | undefined)\n}\n\nexport function buildAuthHeaders(options: AuthOptions): Record<string, string> {\n const token = resolveAuthToken(options)\n if (!token) {\n return {}\n }\n return {\n Authorization: `Bearer ${token}`,\n }\n}\n\nexport function buildSocketAuth(options: AuthOptions): { token: string } | undefined {\n const token = resolveAuthToken(options)\n return token ? { token } : undefined\n}\n\nexport function resolveAuthToken(options: AuthOptions): string | null {\n const token = typeof options.token === \"function\" ? options.token() : options.token\n return token ? token : null\n}\n","import { BladeApiError, type BladeFetchInit, type HttpMethod, extractErrorDetail } from \"./rest\"\nimport { ApiKeysResource } from \"./resources/api-keys\"\nimport { AppDevTemplatesResource } from \"./resources/app-dev-templates\"\nimport { AuthResource } from \"./resources/auth\"\nimport { EnvBucketsResource } from \"./resources/env-buckets\"\nimport { GisResource } from \"./resources/gis\"\nimport { HeadlessResource } from \"./resources/headless\"\nimport { MemoriesResource } from \"./resources/memories\"\nimport { ModelsResource } from \"./resources/models\"\nimport { PublishedAppsResource } from \"./resources/published-apps\"\nimport { RegistryResource } from \"./resources/registry\"\nimport { RunsResource } from \"./resources/runs\"\nimport { ScenariosResource } from \"./resources/scenarios\"\nimport { SessionsResource } from \"./resources/sessions\"\nimport { SkillsResource } from \"./resources/skills\"\nimport { SolutionsResource } from \"./resources/solutions\"\nimport { UserPreferencesResource } from \"./resources/user-preferences\"\nimport { createSocket, type TypedSocket } from \"./socket\"\n\nexport interface BladeClientOptions {\n baseUrl: string\n token?: string | (() => string | null | undefined)\n fetchImpl?: typeof fetch\n onRefreshSuccess?: () => void | Promise<void>\n}\n\nconst REFRESH_PATH = \"/api/auth/refresh\"\n\nexport class BladeClient {\n private refreshPromise: Promise<boolean> | null = null\n private socketInstance: TypedSocket | null = null\n private storeRestTokenResolver: (() => string | null | undefined) | null = null\n private storeSocketTokenResolver: (() => string | null | undefined) | null = null\n readonly options: BladeClientOptions\n readonly apiKeys: ApiKeysResource\n readonly appDevTemplates: AppDevTemplatesResource\n readonly auth: AuthResource\n readonly envBuckets: EnvBucketsResource\n readonly gis: GisResource\n readonly headless: HeadlessResource\n readonly memories: MemoriesResource\n readonly models: ModelsResource\n readonly publishedApps: PublishedAppsResource\n readonly registry: RegistryResource\n readonly runs: RunsResource\n readonly scenarios: ScenariosResource\n readonly sessions: SessionsResource\n readonly skills: SkillsResource\n readonly solutions: SolutionsResource\n readonly userPreferences: UserPreferencesResource\n\n constructor(options: BladeClientOptions) {\n this.options = {\n ...options,\n baseUrl: normalizeBaseUrl(options.baseUrl),\n }\n this.apiKeys = new ApiKeysResource(this)\n this.appDevTemplates = new AppDevTemplatesResource(this)\n this.auth = new AuthResource(this)\n this.envBuckets = new EnvBucketsResource(this)\n this.gis = new GisResource(this)\n this.headless = new HeadlessResource(this)\n this.memories = new MemoriesResource(this)\n this.models = new ModelsResource(this)\n this.publishedApps = new PublishedAppsResource(this)\n this.registry = new RegistryResource(this)\n this.runs = new RunsResource(this)\n this.scenarios = new ScenariosResource(this)\n this.sessions = new SessionsResource(this)\n this.skills = new SkillsResource(this)\n this.solutions = new SolutionsResource(this)\n this.userPreferences = new UserPreferencesResource(this)\n }\n\n _attachStoreRestTokenResolver(fn: () => string | null | undefined): void {\n this.storeRestTokenResolver = fn\n }\n\n _attachStoreSocketTokenResolver(fn: () => string | null | undefined): void {\n this.storeSocketTokenResolver = fn\n }\n\n setBaseUrl(baseUrl: string): void {\n const nextBaseUrl = normalizeBaseUrl(baseUrl)\n if (nextBaseUrl === this.options.baseUrl) {\n return\n }\n this.options.baseUrl = nextBaseUrl\n if (this.socketInstance) {\n this.socketInstance.removeAllListeners()\n this.socketInstance.disconnect()\n this.socketInstance = null\n }\n }\n\n socket(): TypedSocket {\n if (!this.socketInstance) {\n this.socketInstance = createSocket({\n baseUrl: this.options.baseUrl,\n token: () => this.resolveSocketToken(),\n })\n }\n return this.socketInstance\n }\n\n async json<T>(method: HttpMethod, path: string, body?: unknown): Promise<T> {\n const response = await this.fetch(method, path, {\n body: body === undefined ? undefined : JSON.stringify(body),\n headers: body === undefined ? undefined : { \"content-type\": \"application/json\" },\n })\n return readJsonResponse(response)\n }\n\n async jsonFromInit<T>(path: string, init: RequestInit = {}): Promise<T> {\n const method = (init.method ?? \"GET\").toUpperCase() as HttpMethod\n const headers = new Headers(init.headers)\n if (init.body != null && !isFormData(init.body) && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\")\n }\n const response = await this.fetch(method, path, {\n body: init.body,\n credentials: init.credentials,\n headers,\n signal: init.signal,\n })\n return readJsonResponse(response)\n }\n\n async text(method: HttpMethod, path: string): Promise<string> {\n const response = await this.fetch(method, path)\n return response.text()\n }\n\n async textFromInit(path: string, init: RequestInit = {}): Promise<string> {\n const method = (init.method ?? \"GET\").toUpperCase() as HttpMethod\n const response = await this.fetch(method, path, {\n body: init.body,\n credentials: init.credentials,\n headers: init.headers,\n signal: init.signal,\n })\n return response.text()\n }\n\n async responseFromInit(path: string, init: RequestInit = {}): Promise<Response> {\n const method = (init.method ?? \"GET\").toUpperCase() as HttpMethod\n return this.fetch(method, path, {\n body: init.body,\n credentials: init.credentials,\n headers: init.headers,\n signal: init.signal,\n })\n }\n\n async blob(method: HttpMethod, path: string): Promise<Blob> {\n const response = await this.fetch(method, path)\n return response.blob()\n }\n\n async formData(\n method: HttpMethod,\n path: string,\n form: FormData,\n options: { expectOk?: boolean; onUploadProgress?: (progress: UploadProgress) => void } = {},\n ): Promise<Response> {\n if (options.onUploadProgress && !this.options.fetchImpl && typeof XMLHttpRequest !== \"undefined\") {\n return this.formDataWithUploadProgress(method, path, form, options)\n }\n return this.fetch(method, path, { body: form, expectOk: options.expectOk })\n }\n\n async fetch(\n method: HttpMethod,\n path: string,\n init: BladeFetchInit = {},\n isRetry = false,\n ): Promise<Response> {\n const url = this.buildUrl(path)\n const response = await (this.options.fetchImpl ?? fetch)(url.toString(), {\n method,\n body: init.body,\n credentials: init.credentials ?? \"include\",\n headers: this.buildHeaders(url, init.headers),\n signal: init.signal,\n })\n\n if (response.status === 401 && !isRetry && this.shouldRefreshFor401(url)) {\n const refreshed = await this.tryRefresh()\n if (refreshed) {\n return this.fetch(method, path, init, true)\n }\n }\n\n if (init.expectOk !== false && !response.ok) {\n const detail = await extractErrorDetail(response)\n throw new BladeApiError(response, detail)\n }\n return response\n }\n\n buildAuthedUrl(path: string): string {\n const url = new URL(this.toBaseRelativePath(path), this.baseUrlWithTrailingSlash())\n const token = this.resolveTokenForUrl(url)\n if (token) {\n url.searchParams.set(\"token\", token)\n }\n return url.toString()\n }\n\n private buildHeaders(url: URL, headers?: HeadersInit): Headers {\n const result = new Headers(headers)\n if (!this.isSameBackendUrl(url)) {\n return result\n }\n const token = this.resolveRestToken()\n if (token) {\n result.set(\"Authorization\", `Bearer ${token}`)\n }\n return result\n }\n\n private buildUrl(path: string): URL {\n return new URL(this.toBaseRelativePath(path), this.baseUrlWithTrailingSlash())\n }\n\n private baseUrlWithTrailingSlash(): string {\n return this.options.baseUrl.endsWith(\"/\") ? this.options.baseUrl : `${this.options.baseUrl}/`\n }\n\n private toBaseRelativePath(path: string): string {\n return path.startsWith(\"/\") ? path.slice(1) : path\n }\n\n private isSameBackendUrl(url: URL): boolean {\n const base = new URL(this.baseUrlWithTrailingSlash())\n if (url.origin !== base.origin) {\n return false\n }\n const basePath = base.pathname.replace(/\\/+$/, \"\")\n if (basePath === \"\") {\n return true\n }\n return url.pathname === basePath || url.pathname.startsWith(`${basePath}/`)\n }\n\n private shouldRefreshFor401(url: URL): boolean {\n const refreshUrl = this.buildUrl(REFRESH_PATH)\n return (\n this.isSameBackendUrl(url) &&\n url.pathname !== refreshUrl.pathname &&\n !this.hasExplicitBearerToken()\n )\n }\n\n private hasExplicitBearerToken(): boolean {\n return this.options.token !== undefined\n }\n\n private async tryRefresh(): Promise<boolean> {\n if (this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.refreshPromise = (async () => {\n try {\n const response = await (this.options.fetchImpl ?? fetch)(\n this.buildUrl(REFRESH_PATH).toString(),\n {\n method: \"POST\",\n credentials: \"include\",\n },\n )\n if (!response.ok) {\n return false\n }\n await this.options.onRefreshSuccess?.()\n return true\n } catch {\n return false\n } finally {\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n private resolveTokenForUrl(url: URL): string | null {\n if (!this.isSameBackendUrl(url)) {\n return null\n }\n return this.resolveRestToken()\n }\n\n private resolveRestToken(): string | null {\n return this.resolveToken(this.storeRestTokenResolver)\n }\n\n private resolveSocketToken(): string | null {\n return this.resolveToken(this.storeSocketTokenResolver)\n }\n\n private resolveToken(resolver: (() => string | null | undefined) | null): string | null {\n const token =\n this.options.token === undefined\n ? resolver?.()\n : typeof this.options.token === \"function\"\n ? this.options.token()\n : this.options.token\n return token ? token : null\n }\n\n private formDataWithUploadProgress(\n method: HttpMethod,\n path: string,\n form: FormData,\n options: { expectOk?: boolean; onUploadProgress?: (progress: UploadProgress) => void },\n isRetry = false,\n ): Promise<Response> {\n const url = this.buildUrl(path)\n const headers = this.buildHeaders(url)\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open(method, url.toString(), true)\n xhr.withCredentials = true\n\n headers.forEach((value, key) => {\n xhr.setRequestHeader(key, value)\n })\n\n xhr.upload.onprogress = (event) => {\n options.onUploadProgress?.({\n loaded: event.loaded,\n total: event.lengthComputable ? event.total : undefined,\n percent: event.lengthComputable && event.total > 0 ? event.loaded / event.total : undefined,\n })\n }\n\n xhr.onerror = () => reject(new TypeError(\"Network request failed\"))\n xhr.ontimeout = () => reject(new TypeError(\"Network request timed out\"))\n xhr.onabort = () => reject(new DOMException(\"Request aborted\", \"AbortError\"))\n xhr.onload = async () => {\n if (xhr.status === 401 && !isRetry && this.shouldRefreshFor401(url)) {\n const refreshed = await this.tryRefresh()\n if (refreshed) {\n resolve(this.formDataWithUploadProgress(method, path, form, options, true))\n return\n }\n }\n\n const response = new Response(xhr.responseText, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseXhrHeaders(xhr.getAllResponseHeaders()),\n })\n if (options.expectOk !== false && !response.ok) {\n const detail = await extractErrorDetail(response.clone())\n reject(new BladeApiError(response, detail))\n return\n }\n options.onUploadProgress?.({ loaded: 1, total: 1, percent: 1 })\n resolve(response)\n }\n\n xhr.send(form)\n })\n }\n}\n\nexport interface UploadProgress {\n loaded: number\n total?: number\n percent?: number\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n const normalized = baseUrl.trim().replace(/\\/+$/, \"\")\n if (normalized || typeof window === \"undefined\") {\n return normalized\n }\n return window.location.origin\n}\n\nfunction isFormData(value: BodyInit): boolean {\n return typeof FormData !== \"undefined\" && value instanceof FormData\n}\n\nfunction readJsonResponse<T>(response: Response): Promise<T> {\n if (response.status === 204 || response.headers.get(\"content-length\") === \"0\") {\n return Promise.resolve(undefined as T)\n }\n return response.json() as Promise<T>\n}\n\nfunction parseXhrHeaders(rawHeaders: string): Headers {\n const headers = new Headers()\n for (const line of rawHeaders.trim().split(/[\\r\\n]+/)) {\n const separatorIndex = line.indexOf(\":\")\n if (separatorIndex <= 0) continue\n headers.append(line.slice(0, separatorIndex).trim(), line.slice(separatorIndex + 1).trim())\n }\n return headers\n}\n"],"mappings":"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","names":["type","toolCallId","isRecord","type","SYSTEM_ERROR_CHAT_END_GRACE_MS","ensureSocketConnected","errorMessageFromResult","isRecord","isRecord"]}
|