@blade-hq/agent-kit 0.4.7 → 0.4.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{SkillStatusBar-DQyipdzn.d.ts → SkillStatusBar-BnDtYUf9.d.ts} +2 -2
- package/dist/{blade-client-nOsdVlb1.d.ts → blade-client-n7fiBaFk.d.ts} +60 -2
- package/dist/{chunk-I3FFV63W.js → chunk-5ZFK62RQ.js} +2 -2
- package/dist/{chunk-OKQWPNE3.js → chunk-C3KSHIRA.js} +86 -5
- package/dist/chunk-C3KSHIRA.js.map +1 -0
- package/dist/{chunk-X6MEYCU7.js → chunk-CK7JMN5S.js} +228 -82
- package/dist/chunk-CK7JMN5S.js.map +1 -0
- package/dist/{chunk-4VWLTG5L.js → chunk-EDMS2G5P.js} +88 -17
- package/dist/chunk-EDMS2G5P.js.map +1 -0
- package/dist/{chunk-TC5BBLWO.js → chunk-EFNGK46B.js} +2 -2
- package/dist/{chunk-VD4CKRMT.js → chunk-FYPS4SFF.js} +2 -2
- package/dist/{chunk-CGOQI7ZL.js → chunk-TYCA6WYX.js} +98 -81
- package/dist/chunk-TYCA6WYX.js.map +1 -0
- package/dist/client/index.d.ts +395 -29
- package/dist/client/index.js +1 -1
- package/dist/{licenses-Cxl1xGVy.d.ts → licenses-BZpFl0qG.d.ts} +1 -1
- package/dist/react/api/licenses.d.ts +3 -3
- package/dist/react/api/licenses.js +3 -3
- package/dist/react/api/vibe-coding.d.ts +3 -3
- package/dist/react/api/vibe-coding.js +2 -2
- package/dist/react/components/chat/index.d.ts +4 -4
- package/dist/react/components/chat/index.js +5 -5
- package/dist/react/components/plan/index.js +3 -3
- package/dist/react/components/session/index.d.ts +1 -1
- package/dist/react/components/session/index.js +3 -3
- package/dist/react/components/workspace/index.js +3 -3
- package/dist/react/index.d.ts +64 -12
- package/dist/react/index.js +100 -63
- package/dist/react/index.js.map +1 -1
- package/dist/{session-CDeiO81j.d.ts → session-BKOc2lsz.d.ts} +9 -1
- package/dist/style.css +1 -1
- package/package.json +2 -1
- package/dist/chunk-4VWLTG5L.js.map +0 -1
- package/dist/chunk-CGOQI7ZL.js.map +0 -1
- package/dist/chunk-OKQWPNE3.js.map +0 -1
- package/dist/chunk-X6MEYCU7.js.map +0 -1
- /package/dist/{chunk-I3FFV63W.js.map → chunk-5ZFK62RQ.js.map} +0 -0
- /package/dist/{chunk-TC5BBLWO.js.map → chunk-EFNGK46B.js.map} +0 -0
- /package/dist/{chunk-VD4CKRMT.js.map → chunk-FYPS4SFF.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/rest.ts","../src/client/resources/api-keys.ts","../src/client/resources/auth.ts","../src/client/resources/gis.ts","../src/client/resources/licenses.ts","../src/client/resources/memories.ts","../src/client/resources/models.ts","../src/client/resources/registry.ts","../src/client/resources/scenarios.ts","../src/client/resources/sessions.ts","../src/client/resources/skills.ts","../src/client/resources/software-factory.ts","../src/client/resources/solutions.ts","../src/client/resources/user-preferences.ts","../src/client/resources/vibe-coding.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 ?? `Blade API request failed with ${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\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\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 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 { 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\"\n\nexport interface DeviceUuidResponse {\n device_uuid: string\n}\n\nexport interface LicenseValidateResponse {\n version?: string\n expired?: number\n validate: boolean\n remaining_days?: number\n remaining_hours?: number\n message?: string\n device_uuid?: string\n}\n\nexport interface LicenseStatusResponse {\n enabled: boolean\n}\n\nexport interface UploadLicenseResponse {\n success: boolean\n message: string\n remaining_days?: number\n}\n\nexport class LicensesResource {\n constructor(private client: BladeClient) {}\n\n getDeviceUuid(): Promise<DeviceUuidResponse> {\n return this.client.json(\"GET\", \"/api/licenses/device-uuid\")\n }\n\n validateLicense(): Promise<LicenseValidateResponse> {\n return this.client.json(\"GET\", \"/api/licenses/validate\")\n }\n\n getLicenseStatus(): Promise<LicenseStatusResponse> {\n return this.client.json(\"GET\", \"/api/licenses/status\")\n }\n\n async uploadLicense(file: File): Promise<UploadLicenseResponse> {\n const formData = new FormData()\n formData.append(\"file\", file)\n const response = await this.client.formData(\"POST\", \"/api/licenses/upload\", formData)\n return response.json() as Promise<UploadLicenseResponse>\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})\nexport type ModelOption = typeof ModelOption.infer\n\nexport const ModelsConfig = type({\n default: \"string\",\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 { 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 version: string,\n ): Promise<{ success: boolean; skill_id: string; version: string }> {\n return this.client.json(\"POST\", `/api/sessions/${encodeURIComponent(sessionId)}/skill-publish`, {\n org,\n version,\n })\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 } from \"../blade-client\"\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 software_factory_id?: number | null\n memory_enabled?: boolean | 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 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 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 memory_enabled: request.memory_enabled ?? null,\n primary_skill_id: request.primary_skill_id ?? null,\n software_factory_id: request.software_factory_id ?? 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 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 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): 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 })\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 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 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 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 getSharedSession(token: string): Promise<TurnProjection[]> {\n return this.client.jsonFromInit(`/api/share/${encodeURIComponent(token)}`, {\n credentials: \"omit\",\n headers: { Accept: \"application/json\" },\n })\n }\n\n getSessionTasks(sessionId: string): Promise<Task[]> {\n return this.client.json(\"GET\", `/api/sessions/${sessionId}/tasks`)\n }\n\n getSessionTurns(sessionId: string): Promise<TurnProjection[]> {\n return this.client.json(\"GET\", `/api/sessions/${sessionId}/messages`)\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 ): Promise<{ id: string; content: string; position: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/checkout`, {\n checkpoint_id: checkpointId,\n position,\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 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 ): 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 if (entries.some((e) => Boolean(e.file.webkitRelativePath))) {\n formData.append(\"paths\", JSON.stringify(entries.map((e) => e.file.webkitRelativePath || e.name)))\n }\n const response = await this.client.formData(\n \"POST\",\n `/api/sessions/${sessionId}/upload/${encodeURIComponent(dirPath)}`,\n formData,\n { expectOk: false },\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","import type { PartnerSkillInstallPayload, PartnerSkillInstallResult } 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\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 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 installPartnerSkill(\n sessionId: string,\n payload: PartnerSkillInstallPayload,\n init?: RequestInit,\n ): Promise<PartnerSkillInstallResult> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skills/install`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface SoftwareFactoryTopicModule {\n software_id: number\n topic_key: string\n topic_title: string\n topic_description: string\n module_key: string\n module_name: string\n required: boolean\n enabled: boolean\n order_index: number\n session_id: string | null\n sub_key: string\n label: string\n opt: string\n assignee_name: string | null\n assignee_type: string | null\n timeline_json: string\n created_at: string\n updated_at: string\n}\n\nexport interface SoftwareFactoryModuleBlueprint {\n key: string\n name: string\n required: boolean\n order_index: number\n}\n\nexport interface SoftwareFactorySoftware {\n id: number\n name: string\n description: string\n issue_session_id: string | null\n created_at: string\n updated_at: string\n module_blueprints: SoftwareFactoryModuleBlueprint[]\n topic_modules: SoftwareFactoryTopicModule[]\n}\n\nexport interface CreateSoftwareFactorySoftwarePayload {\n name: string\n description?: string\n}\n\nexport interface SoftwareFactorySharedFile {\n id: number\n software_id: number\n module_key: string\n module_name: string\n session_id: string\n file_path: string\n file_name: string\n created_at: string\n updated_at: string\n}\n\nexport interface CreateSoftwareFactorySharedFilePayload {\n module_key: string\n session_id: string\n file_path: string\n file_name?: string\n}\n\nexport interface SoftwareFactoryTopic {\n id: number\n software_id: number\n topic_key: string\n title: string\n description: string\n order_index: number\n created_at: string\n updated_at: string\n}\n\nexport interface CodingTask {\n name: string\n path: string\n files: string[]\n}\n\nexport interface CodingTaskTopic {\n topic_name: string\n tasks: CodingTask[]\n}\n\nexport class SoftwareFactoryResource {\n constructor(private client: BladeClient) {}\n\n listSoftware(): Promise<SoftwareFactorySoftware[]> {\n return this.client.json(\"GET\", \"/api/software-factory/software\")\n }\n\n getSoftware(softwareId: number): Promise<SoftwareFactorySoftware> {\n return this.client.json(\"GET\", `/api/software-factory/software/${softwareId}`)\n }\n\n deleteSoftware(softwareId: number): Promise<{ ok: boolean }> {\n return this.client.json(\"DELETE\", `/api/software-factory/software/${softwareId}`)\n }\n\n createSoftware(payload: CreateSoftwareFactorySoftwarePayload): Promise<SoftwareFactorySoftware> {\n return this.client.json(\"POST\", \"/api/software-factory/software\", payload)\n }\n\n updateSoftware(\n softwareId: number,\n payload: { name?: string; description?: string },\n ): Promise<SoftwareFactorySoftware> {\n return this.client.json(\"PATCH\", `/api/software-factory/software/${softwareId}`, payload)\n }\n\n bindTopicModuleSession(\n softwareId: number,\n topicKey: string,\n moduleKey: string,\n sessionId: string,\n assignee?: { name?: string | null; type?: string | null },\n ): Promise<SoftwareFactorySoftware> {\n return this.client.json(\n \"PATCH\",\n `/api/software-factory/software/${softwareId}/topics/${topicKey}/modules/${moduleKey}/session`,\n {\n session_id: sessionId,\n assignee_name: assignee?.name ?? null,\n assignee_type: assignee?.type ?? null,\n },\n )\n }\n\n submitModuleForReview(\n softwareId: number,\n topicKey: string,\n moduleKey: string,\n subKey = \"default\",\n ): Promise<SoftwareFactoryTopicModule> {\n return this.client.json(\n \"POST\",\n `/api/software-factory/software/${softwareId}/topics/${topicKey}/modules/${moduleKey}/submit-review`,\n { sub_key: subKey },\n )\n }\n\n completeModule(\n softwareId: number,\n topicKey: string,\n moduleKey: string,\n subKey = \"default\",\n ): Promise<SoftwareFactoryTopicModule> {\n return this.client.json(\n \"POST\",\n `/api/software-factory/software/${softwareId}/topics/${topicKey}/modules/${moduleKey}/complete`,\n { sub_key: subKey },\n )\n }\n\n reopenModule(\n softwareId: number,\n topicKey: string,\n moduleKey: string,\n subKey = \"default\",\n ): Promise<SoftwareFactoryTopicModule> {\n return this.client.json(\n \"POST\",\n `/api/software-factory/software/${softwareId}/topics/${topicKey}/modules/${moduleKey}/reopen`,\n { sub_key: subKey },\n )\n }\n\n listSharedFiles(softwareId: number): Promise<SoftwareFactorySharedFile[]> {\n return this.client.json(\"GET\", `/api/software-factory/software/${softwareId}/shared-files`)\n }\n\n createSharedFile(\n softwareId: number,\n payload: CreateSoftwareFactorySharedFilePayload,\n ): Promise<SoftwareFactorySharedFile> {\n return this.client.json(\"POST\", `/api/software-factory/software/${softwareId}/shared-files`, payload)\n }\n\n async uploadSoftwareDocuments(\n softwareId: number,\n files: File[],\n ): Promise<{ uploaded: string[]; failed: string[] }> {\n const formData = new FormData()\n for (const file of files) formData.append(\"files\", file)\n const res = await this.client.formData(\n \"POST\",\n `/api/software-factory/software/${softwareId}/upload-documents`,\n formData,\n )\n return res.json()\n }\n\n ensureIssueSession(softwareId: number): Promise<{ session_id: string }> {\n return this.client.json(\"POST\", `/api/software-factory/software/${softwareId}/issue-session`)\n }\n\n listCodingTasks(softwareId: number): Promise<{ topics: CodingTaskTopic[] }> {\n return this.client.json(\"GET\", `/api/software-factory/software/${softwareId}/coding-tasks`)\n }\n\n startCoding(\n softwareId: number,\n payload: {\n topic_name: string\n task_paths: string[]\n assignee_name?: string | null\n assignee_type?: string | null\n },\n ): Promise<{ session_id: string; topic_name: string; task_names: string[] }> {\n return this.client.json(\"POST\", `/api/software-factory/software/${softwareId}/start-coding`, payload)\n }\n\n readShareFileContent(softwareId: number, path: string): Promise<{ content: string }> {\n return this.client.json(\n \"GET\",\n `/api/software-factory/software/${softwareId}/share-file-content?path=${encodeURIComponent(path)}`,\n )\n }\n\n syncShare(softwareId: number): Promise<{ synced_sessions: string[] }> {\n return this.client.json(\"POST\", `/api/software-factory/software/${softwareId}/sync-share`)\n }\n\n listTopics(softwareId: number): Promise<SoftwareFactoryTopic[]> {\n return this.client.json(\"GET\", `/api/software-factory/software/${softwareId}/topics`)\n }\n\n replaceTopics(\n softwareId: number,\n topics: Array<{ topic_key: string; title: string; description?: string }>,\n ): Promise<SoftwareFactoryTopic[]> {\n return this.client.json(\"PUT\", `/api/software-factory/software/${softwareId}/topics`, { topics })\n }\n\n getFactoryExportUrl(softwareId: number): string {\n return this.client.buildAuthedUrl(`/api/software-factory/software/${softwareId}/export`)\n }\n\n async importFactory(file: File): Promise<{ software_id: number; session_id_map: Record<string, string> }> {\n const formData = new FormData()\n formData.append(\"file\", file)\n const res = await this.client.formData(\"POST\", \"/api/software-factory/software/import\", formData)\n return res.json()\n }\n}\n","import type { BizRole, Solution } from \"../../react/types/solution\"\nimport type { BladeClient } from \"../blade-client\"\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 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","import type { BladeClient } from \"../blade-client\"\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","import type { BladeClient } from \"../blade-client\"\n\nexport interface PortMapping {\n host_port: number\n container_port: number\n}\n\nexport interface VibeCodingSessionInfo {\n session_id: string\n name: string\n coding_template: string\n test_port: number\n deploy_port: number | null\n test_service: string | null\n deploy_service: string | null\n deploy_version: string | null\n max_version: string | null\n}\n\nexport interface VibeCodingSessionStatus extends VibeCodingSessionInfo {}\n\nexport interface VibeCodingDebugSessionStatus {\n session_id: string\n running: boolean\n test_running: boolean\n ports: PortMapping[]\n}\n\nexport interface VibeCodingDeployStatus {\n deploy_running: boolean\n deploy_version: string | null\n deploy_port: number | null\n}\n\nexport interface VibeCodingDeployRecord {\n version: string\n release_path: string\n note: string | null\n created_at: string\n}\n\nexport type DeployBumpMode = \"major\" | \"minor\" | \"patch\"\n\nexport interface CreateVibeCodingSessionParams {\n name?: string\n coding_template?: string\n model?: string | null\n}\n\nexport interface CreateVibeCodingSessionResult {\n session_id: string\n test_port: number\n}\n\nexport class VibeCodingResource {\n constructor(private client: BladeClient) {}\n\n createVibeCodingSession(\n params: CreateVibeCodingSessionParams,\n ): Promise<CreateVibeCodingSessionResult> {\n return this.client.json(\"POST\", \"/api/vibe-coding/sessions\", params)\n }\n\n async listVibeCodingSessionInfos(): Promise<VibeCodingSessionInfo[]> {\n const result = await this.client.json<{ items: VibeCodingSessionInfo[] }>(\n \"GET\",\n \"/api/vibe-coding/sessions/status\",\n )\n return result.items\n }\n\n getVibeCodingSessionDebugStatus(sessionId: string): Promise<VibeCodingDebugSessionStatus> {\n return this.client.json(\"GET\", `/api/vibe-coding/sessions/${sessionId}/debug/status`)\n }\n\n getVibeCodingSessionStatus(sessionId: string): Promise<VibeCodingSessionStatus> {\n return this.client.json(\"GET\", `/api/vibe-coding/sessions/${sessionId}/status`)\n }\n\n getVibeCodingDeployStatus(sessionId: string): Promise<VibeCodingDeployStatus> {\n return this.client.json(\"GET\", `/api/vibe-coding/sessions/${sessionId}/deploy/status`)\n }\n\n startVibeCodingService(sessionId: string): Promise<{ ok: boolean; details: string }> {\n return this.client.json(\"POST\", `/api/vibe-coding/sessions/${sessionId}/start`)\n }\n\n stopVibeCodingService(sessionId: string): Promise<{ ok: boolean; details: string }> {\n return this.client.json(\"POST\", `/api/vibe-coding/sessions/${sessionId}/stop`)\n }\n\n updateVibeCodingDebugService(sessionId: string): Promise<{ ok: boolean; session_id: string }> {\n return this.client.json(\"POST\", `/api/vibe-coding/sessions/${sessionId}/update_debug_service`)\n }\n\n deployVibeCodingSession(\n sessionId: string,\n note?: string,\n bump: DeployBumpMode = \"patch\",\n ): Promise<{ ok: boolean; version: string; deploy_port: number; release_dir: string }> {\n const payload: { note?: string; bump?: DeployBumpMode } = { bump }\n const normalizedNote = note?.trim()\n if (normalizedNote) payload.note = normalizedNote\n return this.client.json(\"POST\", `/api/vibe-coding/sessions/${sessionId}/deploy`, payload)\n }\n\n async listVibeCodingDeployVersions(sessionId: string): Promise<VibeCodingDeployRecord[]> {\n const result = await this.client.json<{ items: VibeCodingDeployRecord[] }>(\n \"GET\",\n `/api/vibe-coding/sessions/${sessionId}/deploy/versions`,\n )\n return result.items\n }\n\n startVibeCodingDeployService(\n sessionId: string,\n version?: string,\n ): Promise<{ ok: boolean; details: string; deploy_version: string; release_dir: string }> {\n const query = version ? `?version=${encodeURIComponent(version)}` : \"\"\n return this.client.json(\"POST\", `/api/vibe-coding/sessions/${sessionId}/deploy/start${query}`)\n }\n\n stopVibeCodingDeployService(\n sessionId: string,\n version?: string,\n ): Promise<{ ok: boolean; details: string }> {\n const query = version ? `?version=${encodeURIComponent(version)}` : \"\"\n return this.client.json(\"POST\", `/api/vibe-coding/sessions/${sessionId}/deploy/stop${query}`)\n }\n\n deleteVibeCodingDeployVersion(sessionId: string, version: string): Promise<{ ok: boolean }> {\n return this.client.json(\n \"DELETE\",\n `/api/vibe-coding/sessions/${sessionId}/deploy/versions/${encodeURIComponent(version)}`,\n )\n }\n\n deleteVibeCodingSession(sessionId: string): Promise<{ ok: boolean }> {\n return this.client.json(\"DELETE\", `/api/vibe-coding/sessions/${sessionId}`)\n }\n\n probeVibeCodingService(sessionId: string, url: string): Promise<{ reachable: boolean }> {\n return this.client.json(\n \"GET\",\n `/api/vibe-coding/sessions/${sessionId}/probe?url=${encodeURIComponent(url)}`,\n )\n }\n\n async exportVibeCodingSession(sessionId: string): Promise<void> {\n const res = await this.client.fetch(\"GET\", `/api/vibe-coding/sessions/${sessionId}/export`)\n const blob = await res.blob()\n const url = URL.createObjectURL(blob)\n const a = document.createElement(\"a\")\n a.href = url\n a.download = `${sessionId}.zip`\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n }\n\n async importVibeCodingSession(\n file: File,\n name?: string,\n codingTemplate?: string,\n ): Promise<CreateVibeCodingSessionResult> {\n const form = new FormData()\n form.append(\"file\", file)\n if (name) form.append(\"name\", name)\n if (codingTemplate) form.append(\"coding_template\", codingTemplate)\n const res = await this.client.formData(\"POST\", \"/api/vibe-coding/sessions/import\", form)\n return res.json()\n }\n}\n","import { io, type Socket } from \"socket.io-client\"\nimport { buildSocketAuth, 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 return io(options.baseUrl, {\n path: options.path ?? \"/socket.io\",\n withCredentials: true,\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 } from \"./rest\"\nimport { ApiKeysResource } from \"./resources/api-keys\"\nimport { AuthResource } from \"./resources/auth\"\nimport { GisResource } from \"./resources/gis\"\nimport { LicensesResource } from \"./resources/licenses\"\nimport { MemoriesResource } from \"./resources/memories\"\nimport { ModelsResource } from \"./resources/models\"\nimport { RegistryResource } from \"./resources/registry\"\nimport { ScenariosResource } from \"./resources/scenarios\"\nimport { SessionsResource } from \"./resources/sessions\"\nimport { SkillsResource } from \"./resources/skills\"\nimport { SoftwareFactoryResource } from \"./resources/software-factory\"\nimport { SolutionsResource } from \"./resources/solutions\"\nimport { UserPreferencesResource } from \"./resources/user-preferences\"\nimport { VibeCodingResource } from \"./resources/vibe-coding\"\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 auth: AuthResource\n readonly gis: GisResource\n readonly licenses: LicensesResource\n readonly memories: MemoriesResource\n readonly models: ModelsResource\n readonly registry: RegistryResource\n readonly scenarios: ScenariosResource\n readonly sessions: SessionsResource\n readonly skills: SkillsResource\n readonly softwareFactory: SoftwareFactoryResource\n readonly solutions: SolutionsResource\n readonly userPreferences: UserPreferencesResource\n readonly vibeCoding: VibeCodingResource\n\n constructor(options: BladeClientOptions) {\n this.options = {\n ...options,\n baseUrl: normalizeBaseUrl(options.baseUrl),\n }\n this.apiKeys = new ApiKeysResource(this)\n this.auth = new AuthResource(this)\n this.gis = new GisResource(this)\n this.licenses = new LicensesResource(this)\n this.memories = new MemoriesResource(this)\n this.models = new ModelsResource(this)\n this.registry = new RegistryResource(this)\n this.scenarios = new ScenariosResource(this)\n this.sessions = new SessionsResource(this)\n this.skills = new SkillsResource(this)\n this.softwareFactory = new SoftwareFactoryResource(this)\n this.solutions = new SolutionsResource(this)\n this.userPreferences = new UserPreferencesResource(this)\n this.vibeCoding = new VibeCodingResource(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 } = {},\n ): Promise<Response> {\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 throw new BladeApiError(response)\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\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"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/lib/code-highlight.ts","../src/react/components/card/CardContext.tsx","../src/react/components/card/CardCodeBlock.tsx","../src/react/components/card/CardRenderer.tsx","../src/react/components/card/CardStates.tsx","../src/react/components/markdown/MarkdownContent.tsx","../src/react/components/chat/AskUserQuestionBlock.tsx","../src/react/components/plan/parse-plan-tree.ts","../src/react/components/plan/parse-plan-messages.ts","../src/react/components/plan/PlanSummaryCard.tsx","../src/react/components/plan/extract-plan-messages.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\n\nconst DARK_THEME = \"github-dark-default\"\nconst LIGHT_THEME = \"github-light-default\"\n\nconst SUPPORTED_LANGUAGES = [\n \"python\",\n \"javascript\",\n \"typescript\",\n \"tsx\",\n \"jsx\",\n \"yaml\",\n \"markdown\",\n \"bash\",\n \"json\",\n \"go\",\n \"rust\",\n \"css\",\n \"html\",\n] as const\n\nexport type SupportedCodeLanguage = (typeof SUPPORTED_LANGUAGES)[number]\n\nconst LANGUAGE_ALIASES: Record<string, SupportedCodeLanguage> = {\n bash: \"bash\",\n css: \"css\",\n go: \"go\",\n golang: \"go\",\n htm: \"html\",\n html: \"html\",\n javascript: \"javascript\",\n js: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n jsx: \"jsx\",\n markdown: \"markdown\",\n md: \"markdown\",\n py: \"python\",\n python: \"python\",\n rs: \"rust\",\n rust: \"rust\",\n scss: \"css\",\n sh: \"bash\",\n shell: \"bash\",\n ts: \"typescript\",\n tsx: \"tsx\",\n typescript: \"typescript\",\n yaml: \"yaml\",\n yml: \"yaml\",\n zsh: \"bash\",\n}\n\ntype CodeHighlighter = {\n codeToHtml: (\n code: string,\n options: {\n lang: SupportedCodeLanguage\n themes: { light: string; dark: string }\n defaultColor?: false\n },\n ) => string\n}\n\nlet highlighterPromise: Promise<CodeHighlighter> | null = null\n\nconst CACHE_MAX_SIZE = 200\nconst highlightCache = new Map<string, Promise<string | null>>()\n\nexport function normalizeCodeLanguage(language?: string | null): SupportedCodeLanguage | null {\n if (!language) return null\n\n return LANGUAGE_ALIASES[language.trim().toLowerCase()] ?? null\n}\n\nexport function useHighlightedCodeHtml(code: string, language?: string | null) {\n const normalizedLanguage = useMemo(() => normalizeCodeLanguage(language), [language])\n const [highlightedHtml, setHighlightedHtml] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n setHighlightedHtml(null)\n\n if (!normalizedLanguage) {\n return () => {\n cancelled = true\n }\n }\n\n void highlightCodeToInnerHtml(code, normalizedLanguage).then((result) => {\n if (!cancelled) {\n setHighlightedHtml(result)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [code, normalizedLanguage])\n\n return { highlightedHtml, language: normalizedLanguage }\n}\n\nasync function highlightCodeToInnerHtml(code: string, language: SupportedCodeLanguage) {\n const cacheKey = `${language}\\u0000${code}`\n const cached = highlightCache.get(cacheKey)\n\n if (cached) {\n return cached\n }\n\n const request = loadCodeHighlighter()\n .then((highlighter) => {\n const html = highlighter.codeToHtml(code, {\n lang: language,\n themes: { light: LIGHT_THEME, dark: DARK_THEME },\n defaultColor: false,\n })\n return extractInnerCodeHtml(html)\n })\n .catch(() => {\n highlightCache.delete(cacheKey)\n return null\n })\n\n if (highlightCache.size >= CACHE_MAX_SIZE) {\n const oldest = highlightCache.keys().next().value\n if (oldest !== undefined) highlightCache.delete(oldest)\n }\n highlightCache.set(cacheKey, request)\n return request\n}\n\nasync function loadCodeHighlighter(): Promise<CodeHighlighter> {\n if (!highlighterPromise) {\n highlighterPromise = Promise.all([\n import(\"shiki/core\"),\n import(\"shiki/engine/javascript\"),\n import(\"@shikijs/langs/bash\"),\n import(\"@shikijs/langs/css\"),\n import(\"@shikijs/langs/go\"),\n import(\"@shikijs/langs/html\"),\n import(\"@shikijs/langs/javascript\"),\n import(\"@shikijs/langs/json\"),\n import(\"@shikijs/langs/jsx\"),\n import(\"@shikijs/langs/markdown\"),\n import(\"@shikijs/langs/python\"),\n import(\"@shikijs/langs/rust\"),\n import(\"@shikijs/langs/tsx\"),\n import(\"@shikijs/langs/typescript\"),\n import(\"@shikijs/langs/yaml\"),\n import(\"@shikijs/themes/github-dark-default\"),\n import(\"@shikijs/themes/github-light-default\"),\n ]).then(\n ([\n core,\n engine,\n bash,\n css,\n go,\n html,\n javascript,\n json,\n jsx,\n markdown,\n python,\n rust,\n tsx,\n typescript,\n yaml,\n darkTheme,\n lightTheme,\n ]) =>\n core.createHighlighterCore({\n engine: engine.createJavaScriptRegexEngine(),\n langs: [\n bash.default,\n css.default,\n go.default,\n html.default,\n javascript.default,\n json.default,\n jsx.default,\n markdown.default,\n python.default,\n rust.default,\n tsx.default,\n typescript.default,\n yaml.default,\n ],\n themes: [darkTheme.default, lightTheme.default],\n }),\n ).catch((err) => {\n highlighterPromise = null\n throw err\n })\n }\n\n return highlighterPromise as Promise<CodeHighlighter>\n}\n\nfunction extractInnerCodeHtml(html: string) {\n const match = html.match(/<code[^>]*>([\\s\\S]*)<\\/code><\\/pre>\\s*$/)\n return match?.[1] ?? null\n}\n","import { createContext, useContext } from \"react\"\n\nexport interface CardContextValue {\n sendMessage?: (content: string) => Promise<void>\n sessionId?: string\n messageId?: string\n}\n\nexport const CardContext = createContext<CardContextValue>({})\n\nexport const useCardContext = () => useContext(CardContext)\n","import type { JSX } from \"react\"\nimport { useIsCodeFenceIncomplete } from \"streamdown\"\nimport type { ExtraProps } from \"streamdown\"\nimport { CardJSON } from \"../../lib/card-registry\"\nimport { normalizeCodeLanguage, useHighlightedCodeHtml } from \"../../lib/code-highlight\"\nimport { CardRenderer } from \"./CardRenderer\"\n\ntype CodeProps = JSX.IntrinsicElements[\"code\"] & ExtraProps\n\nexport function CardCodeBlock({ className, children, node, ...props }: CodeProps) {\n const isIncomplete = useIsCodeFenceIncomplete()\n const match = /language-(\\S+)/.exec(className || \"\")\n const lang = match?.[1]\n const isInline = !className\n const raw = String(children ?? \"\")\n const normalizedLang = normalizeCodeLanguage(lang)\n const { highlightedHtml } = useHighlightedCodeHtml(raw, normalizedLang)\n\n if (!isInline && CardJSON.isCardsLanguage(lang)) {\n return (\n <CardRenderer\n raw={raw}\n blockPosition={node?.position?.start?.line}\n isCodeFenceIncomplete={isIncomplete}\n />\n )\n }\n\n if (!isInline && highlightedHtml) {\n return (\n <code\n className={className}\n {...props}\n // biome-ignore lint/security/noDangerouslySetInnerHtml: syntax highlighting output is generated locally\n dangerouslySetInnerHTML={{ __html: highlightedHtml }}\n />\n )\n }\n\n return (\n <code className={className} {...props}>\n {children}\n </code>\n )\n}\n","import { Component, type ErrorInfo, type ReactNode } from \"react\"\nimport { type Card, CardJSON, cardRegistry } from \"../../lib/card-registry\"\nimport { useUiStore } from \"../../stores/ui-store\"\nimport { useCardContext } from \"./CardContext\"\nimport { CardErrorState, CardLoadingState, CardWarningState } from \"./CardStates\"\n\ninterface Props {\n raw: string\n blockPosition?: number\n isCodeFenceIncomplete?: boolean\n}\n\nfunction looksIncomplete(text: string): boolean {\n const t = text.trim()\n if (!t) return true\n const openBraces = (t.match(/{/g) || []).length\n const closeBraces = (t.match(/}/g) || []).length\n const openBrackets = (t.match(/\\[/g) || []).length\n const closeBrackets = (t.match(/]/g) || []).length\n const quotes = (t.match(/\"/g) || []).length\n\n return (\n (!t.endsWith(\"}\") && !t.endsWith(\"]\")) ||\n openBraces !== closeBraces ||\n openBrackets !== closeBrackets ||\n t.endsWith(\",\") ||\n t.endsWith(\":\") ||\n quotes % 2 !== 0\n )\n}\n\ninterface ErrorBoundaryProps {\n fallback: ReactNode\n children: ReactNode\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean\n}\n\nclass CardErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n state: ErrorBoundaryState = { hasError: false }\n\n static getDerivedStateFromError(): ErrorBoundaryState {\n return { hasError: true }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"Card render error:\", error, info)\n }\n\n render() {\n if (this.state.hasError) return this.props.fallback\n return this.props.children\n }\n}\n\nfunction OpenInPreviewButton({ card }: { card: Card }) {\n const pushArtifact = useUiStore((s) => s.pushArtifact)\n\n return (\n <button\n type=\"button\"\n onClick={() =>\n pushArtifact({\n type: \"card\",\n content: JSON.stringify(card, null, 2),\n title: card.title || card.type,\n key: `card-${card.id}`,\n })\n }\n className=\"absolute right-2 top-2 rounded bg-[hsl(var(--accent))] px-1.5 py-0.5 text-[10px] text-[hsl(var(--muted-foreground))] opacity-0 transition-opacity group-hover/card:opacity-100 hover:text-[hsl(var(--foreground))]\"\n >\n 预览\n </button>\n )\n}\n\nexport function CardRenderer({ raw, blockPosition, isCodeFenceIncomplete }: Props) {\n const { sessionId, messageId, sendMessage } = useCardContext()\n const trimmed = raw.trim()\n\n if (!trimmed) return <CardLoadingState content=\"\" />\n\n // If code fence is still streaming, show loading\n if (isCodeFenceIncomplete) {\n return <CardLoadingState content={trimmed} />\n }\n\n const parsed = CardJSON.safeParseJSON(trimmed)\n\n if (!parsed.ok) {\n if (looksIncomplete(trimmed)) {\n return <CardLoadingState content={trimmed} />\n }\n return <CardErrorState content={trimmed} message={parsed.error} />\n }\n\n const cards = CardJSON.toCardArray(parsed.value)\n if (!cards) {\n return <CardWarningState content={trimmed} message=\"JSON 格式正确但不符合卡片结构\" />\n }\n\n const cardsWithIds = cards.map((c, i) => {\n if (c.id) return c\n return {\n ...c,\n id: `${messageId || \"msg\"}-block-${blockPosition ?? 0}-card-${i}`,\n }\n })\n\n return (\n <>\n {cardsWithIds.map((card) => {\n const CardComponent = cardRegistry.get(card.type)\n if (!CardComponent) {\n return (\n <CardWarningState\n key={card.id}\n content={JSON.stringify(card, null, 2)}\n message={`未知的卡片类型: ${card.type}`}\n />\n )\n }\n return (\n <div key={card.id} className=\"group/card relative my-4\">\n <CardErrorBoundary\n fallback={\n <CardErrorState\n content={JSON.stringify(card, null, 2)}\n message=\"卡片渲染出错\"\n />\n }\n >\n <CardComponent card={card} sendMessage={sendMessage} sessionId={sessionId} />\n <OpenInPreviewButton card={card} />\n </CardErrorBoundary>\n </div>\n )\n })}\n </>\n )\n}\n","interface CardStateProps {\n content: string\n message?: string\n}\n\nexport function CardLoadingState({ content }: CardStateProps) {\n return (\n <div className=\"my-4 rounded-md border border-[hsl(var(--primary)/0.2)] bg-[hsl(var(--primary)/0.05)] p-4\">\n <div className=\"mb-2 flex items-center gap-2\">\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-[hsl(var(--primary))] border-t-transparent\" />\n <p className=\"text-sm text-[hsl(var(--primary))]\">正在加载卡片数据...</p>\n </div>\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer text-xs text-[hsl(var(--primary)/0.7)]\">查看接收中的数据</summary>\n <pre className=\"mt-1 whitespace-pre-wrap rounded bg-[hsl(var(--primary)/0.1)] p-2 font-mono text-xs text-[hsl(var(--primary)/0.8)]\">\n {content}\n </pre>\n </details>\n </div>\n )\n}\n\nexport function CardErrorState({ content, message }: CardStateProps) {\n return (\n <div className=\"my-4 rounded-md border border-red-500/20 bg-red-500/5 p-4\">\n <p className=\"mb-2 text-sm text-red-400\">{message || \"卡片数据解析失败\"}</p>\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer text-xs text-red-400/70 hover:underline\">\n 查看原始代码块\n </summary>\n <pre className=\"mt-2 overflow-x-auto whitespace-pre-wrap rounded bg-red-500/10 p-3 font-mono text-xs text-red-400/80\">\n {content}\n </pre>\n </details>\n </div>\n )\n}\n\nexport function CardWarningState({ content, message }: CardStateProps) {\n return (\n <div className=\"my-4 rounded-md border border-yellow-500/20 bg-yellow-500/5 p-4\">\n <p className=\"mb-2 text-sm text-yellow-400\">{message || \"数据格式不符合卡片要求\"}</p>\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer text-xs text-yellow-400/70\">查看原始数据</summary>\n <pre className=\"mt-1 whitespace-pre-wrap rounded bg-yellow-500/10 p-2 font-mono text-xs text-yellow-400/80\">\n {content}\n </pre>\n </details>\n </div>\n )\n}\n","import { mermaid } from \"@streamdown/mermaid\"\nimport { Check, Copy, Download } from \"lucide-react\"\nimport {\n type ComponentProps,\n type ComponentPropsWithRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { type ExtraProps, Streamdown } from \"streamdown\"\nimport { getAuthedUrl } from \"../../api/client\"\nimport { cn, copyToClipboard } from \"../../lib/utils\"\nimport { CardCodeBlock } from \"../card/CardCodeBlock\"\n\ntype StreamdownProps = ComponentProps<typeof Streamdown>\n\nconst STREAMDOWN_PLUGINS = { mermaid } satisfies NonNullable<StreamdownProps[\"plugins\"]>\n\nconst SYSTEM_REMINDER_TAG = \"system-reminder\"\nconst HIDDEN_SYSTEM_REMINDER_TAGS: NonNullable<StreamdownProps[\"allowedTags\"]> = {\n [SYSTEM_REMINDER_TAG]: [],\n}\nconst HIDDEN_SYSTEM_REMINDER_COMPONENTS = {\n [SYSTEM_REMINDER_TAG]: () => null,\n} as NonNullable<StreamdownProps[\"components\"]>\n\ntype PreProps = ComponentPropsWithRef<\"pre\"> & ExtraProps\n\nfunction CodeBlockPre({ children, node: _node, ...props }: PreProps) {\n const preRef = useRef<HTMLPreElement>(null)\n const [copied, setCopied] = useState(false)\n const [hasCodeNode, setHasCodeNode] = useState(false)\n\n useEffect(() => {\n setHasCodeNode(!!preRef.current?.querySelector(\"code\"))\n }, [])\n\n const getRawCode = () => preRef.current?.querySelector(\"code\")?.textContent ?? \"\"\n\n const handleCopy = async () => {\n const ok = await copyToClipboard(getRawCode())\n if (ok) {\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }\n\n const handleDownload = () => {\n const codeEl = preRef.current?.querySelector(\"code\")\n const text = codeEl?.textContent ?? \"\"\n const ext = codeEl?.className.match(/language-(\\S+)/)?.[1] ?? \"txt\"\n const blob = new Blob([text], { type: \"text/plain\" })\n const url = URL.createObjectURL(blob)\n const a = document.createElement(\"a\")\n a.href = url\n a.download = `code.${ext}`\n a.click()\n URL.revokeObjectURL(url)\n }\n\n return (\n <div className=\"relative group\">\n <pre ref={preRef} {...props}>\n {children}\n </pre>\n {hasCodeNode && (\n <div className=\"absolute top-2 right-2 flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n \"flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] transition-colors\",\n copied\n ? \"text-[hsl(var(--primary))]\"\n : \"text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))]\",\n )}\n >\n {copied ? <Check size={12} /> : <Copy size={12} />}\n <span>{copied ? \"已复制\" : \"复制\"}</span>\n </button>\n <button\n type=\"button\"\n onClick={handleDownload}\n className=\"flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] transition-colors text-[hsl(var(--muted-foreground))] hover:text-[hsl(var(--foreground))] hover:bg-[hsl(var(--accent))]\"\n >\n <Download size={12} />\n <span>下载</span>\n </button>\n </div>\n )}\n </div>\n )\n}\n\nfunction isExternalImageSrc(src: string): boolean {\n if (!src) return false\n if (src.startsWith(\"data:\") || src.startsWith(\"blob:\")) return true\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(src)) return true\n if (src.startsWith(\"/\")) return true\n return false\n}\n\nfunction decodeMarkdownPath(src: string): string {\n try {\n return decodeURIComponent(src)\n } catch {\n return src\n }\n}\n\nconst MARKDOWN_IMAGE_PATTERN =\n /!\\[((?:\\\\.|[^\\]\\\\])*)\\]\\(\\s*(?:<([^>\\n]+)>|([^\\s)]+))(\\s+(?:\"[^\"]*\"|'[^']*'|\\([^)]*\\)))?\\s*\\)/g\n\nfunction resolveSessionImageMarkdown(children: string, sessionId: string): string {\n return children.replace(\n MARKDOWN_IMAGE_PATTERN,\n (match, alt: string, angleSrc: string | undefined, plainSrc: string | undefined, title = \"\") => {\n const src = angleSrc ?? plainSrc\n if (!src || isExternalImageSrc(src)) {\n return match\n }\n\n const resolved = getAuthedUrl(\n `/api/sessions/${encodeURIComponent(sessionId)}/files/${encodeURIComponent(decodeMarkdownPath(src))}`,\n )\n return ``\n },\n )\n}\n\ntype MarkdownContentProps = StreamdownProps & {\n /** 当提供时,markdown 中相对路径的 <img> src 会解析为 session 工作区文件 URL */\n sessionId?: string\n}\n\nexport function MarkdownContent({\n allowedTags,\n children,\n components,\n mode,\n plugins,\n sessionId,\n ...props\n}: MarkdownContentProps) {\n const resolvedChildren = useMemo(\n () =>\n sessionId && typeof children === \"string\"\n ? resolveSessionImageMarkdown(children, sessionId)\n : children,\n [children, sessionId],\n )\n\n return (\n <Streamdown\n {...props}\n mode={mode ?? \"static\"}\n allowedTags={{\n ...(allowedTags ?? {}),\n ...HIDDEN_SYSTEM_REMINDER_TAGS,\n }}\n components={{\n code: CardCodeBlock,\n pre: CodeBlockPre,\n ...(components ?? {}),\n ...HIDDEN_SYSTEM_REMINDER_COMPONENTS,\n }}\n plugins={{\n ...STREAMDOWN_PLUGINS,\n ...(plugins ?? {}),\n }}\n >\n {resolvedChildren}\n </Streamdown>\n )\n}\n","import { Check, Loader2, MessageSquareMore } from \"lucide-react\"\nimport { useEffect, useMemo, useState } from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { MarkdownContent } from \"../markdown/MarkdownContent\"\n\ninterface OptionItem {\n label: string\n description: string\n}\n\ninterface QuestionItem {\n question: string\n options: OptionItem[]\n multiSelect?: boolean\n}\n\ninterface SourceLoopInfo {\n loop_name: string\n description: string\n}\n\ninterface AskUserQuestionData {\n questions: QuestionItem[]\n source_loop?: SourceLoopInfo | null\n}\n\nexport type AskUserAnswerData = {\n selections: Record<number, number[]>\n custom: Record<number, string>\n}\n\ninterface Props {\n data: AskUserQuestionData\n answered: boolean\n toolCallId: string\n sessionStatus: string\n answerData?: AskUserAnswerData | undefined\n onAnswer?: (answer: string, toolCallId: string, answerData: AskUserAnswerData) => void\n}\n\nexport function AskUserQuestionBlock({\n data,\n answered,\n toolCallId,\n sessionStatus,\n answerData,\n onAnswer,\n}: Props) {\n // Per-question state: selected option indices or custom text\n const [selections, setSelections] = useState<Map<number, Set<number>>>(new Map())\n const [customTexts, setCustomTexts] = useState<Map<number, string>>(new Map())\n const [usingCustom, setUsingCustom] = useState<Set<number>>(new Set())\n const [submitted, setSubmitted] = useState(false)\n\n useEffect(() => {\n if (sessionStatus === \"failed\" || sessionStatus === \"interrupted\") {\n setSubmitted(false)\n }\n }, [sessionStatus])\n\n const displayAnswerState = useMemo(() => {\n if (!(answered && answerData)) {\n return {\n selections,\n customTexts,\n usingCustom,\n }\n }\n\n const nextSelections = new Map<number, Set<number>>()\n const nextCustomTexts = new Map<number, string>()\n const nextUsingCustom = new Set<number>()\n\n for (const [questionKey, optionIndexes] of Object.entries(answerData.selections)) {\n nextSelections.set(Number(questionKey), new Set(optionIndexes))\n }\n\n for (const [questionKey, text] of Object.entries(answerData.custom)) {\n const qIdx = Number(questionKey)\n nextCustomTexts.set(qIdx, text)\n nextUsingCustom.add(qIdx)\n }\n\n return {\n selections: nextSelections,\n customTexts: nextCustomTexts,\n usingCustom: nextUsingCustom,\n }\n }, [answerData, answered, customTexts, selections, usingCustom])\n\n const displaySelections = displayAnswerState.selections\n const displayCustomTexts = displayAnswerState.customTexts\n const displayUsingCustom = displayAnswerState.usingCustom\n\n const toggleOption = (qIdx: number, optIdx: number, multi: boolean) => {\n if (answered || submitted) return\n setSelections((prev) => {\n const next = new Map(prev)\n const current = new Set(next.get(qIdx) ?? [])\n if (multi) {\n if (current.has(optIdx)) current.delete(optIdx)\n else current.add(optIdx)\n } else {\n current.clear()\n current.add(optIdx)\n }\n next.set(qIdx, current)\n return next\n })\n // Clear custom for this question\n setUsingCustom((prev) => {\n const next = new Set(prev)\n next.delete(qIdx)\n return next\n })\n }\n\n const handleCustomFocus = (qIdx: number) => {\n if (answered || submitted) return\n setSelections((prev) => {\n const next = new Map(prev)\n next.delete(qIdx)\n return next\n })\n setUsingCustom((prev) => new Set(prev).add(qIdx))\n }\n\n const setCustomText = (qIdx: number, text: string) => {\n if (answered || submitted) return\n setCustomTexts((prev) => new Map(prev).set(qIdx, text))\n }\n\n const getAnswer = (qIdx: number): string | null => {\n const q = data.questions[qIdx]\n if (usingCustom.has(qIdx)) {\n const text = (customTexts.get(qIdx) ?? \"\").trim()\n return text || null\n }\n const sel = selections.get(qIdx)\n if (!sel || sel.size === 0) return null\n return [...sel]\n .sort()\n .map((i) => q.options[i].label)\n .join(\", \")\n }\n\n const allAnswered = data.questions.every((_, i) => getAnswer(i) !== null)\n\n const handleSubmit = () => {\n if (answered || submitted || !allAnswered || !onAnswer) return\n\n const nextAnswerData: AskUserAnswerData = {\n selections: Object.fromEntries(\n Array.from(selections.entries()).map(([qIdx, optionIndexes]) => [\n qIdx,\n Array.from(optionIndexes).sort((a, b) => a - b),\n ]),\n ) as Record<number, number[]>,\n custom: Object.fromEntries(\n Array.from(usingCustom)\n .map((qIdx) => [qIdx, (customTexts.get(qIdx) ?? \"\").trim()] as const)\n .filter(([, text]) => text.length > 0),\n ) as Record<number, string>,\n }\n\n const parts = data.questions.map((q, i) => `- ${q.question} -> ${getAnswer(i)}`)\n const text = `关于需要确认的问题,用户的回答如下:\\n${parts.join(\"\\n\")}`\n setSubmitted(true)\n onAnswer(text, toolCallId, nextAnswerData)\n }\n\n return (\n <div\n className={cn(\n \"ml-4 rounded-xl border border-[hsl(var(--border))] bg-[hsl(var(--card))]\",\n answered\n ? \"max-w-2xl space-y-3 p-3 text-xs text-[hsl(var(--muted-foreground))] opacity-80\"\n : \"max-w-lg space-y-5 p-4 text-sm\",\n )}\n >\n {data.source_loop?.description && (\n <div className=\"rounded-lg bg-[hsl(var(--muted)/0.35)] px-3 py-2 text-xs text-[hsl(var(--muted-foreground))]\">\n 子智能体「{data.source_loop.description}」在等待你的回答\n </div>\n )}\n {data.questions.map((q, qIdx) => (\n <QuestionCard\n key={q.question}\n question={q}\n qIdx={qIdx}\n answered={answered}\n selected={displaySelections.get(qIdx) ?? new Set()}\n isCustom={displayUsingCustom.has(qIdx)}\n customText={displayCustomTexts.get(qIdx) ?? \"\"}\n onToggle={toggleOption}\n onCustomFocus={handleCustomFocus}\n onCustomChange={setCustomText}\n />\n ))}\n\n {!answered && !submitted && onAnswer && (\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!allAnswered}\n className=\"w-full rounded-lg bg-[hsl(var(--primary))] px-4 py-2 text-xs font-semibold text-[hsl(var(--primary-foreground))] transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60\"\n >\n {allAnswered ? \"确认\" : \"请先选择一个选项\"}\n </button>\n )}\n\n {submitted && !answered && (\n <button\n type=\"button\"\n disabled\n className=\"flex w-full items-center justify-center gap-2 rounded-lg bg-[hsl(var(--primary))] px-4 py-2 text-xs font-semibold text-[hsl(var(--primary-foreground))] opacity-80\"\n >\n <Loader2 size={14} className=\"animate-spin\" />\n 确认中\n </button>\n )}\n </div>\n )\n}\n\nfunction QuestionCard({\n question,\n qIdx,\n answered,\n selected,\n isCustom,\n customText,\n onToggle,\n onCustomFocus,\n onCustomChange,\n}: {\n question: QuestionItem\n qIdx: number\n answered: boolean\n selected: Set<number>\n isCustom: boolean\n customText: string\n onToggle: (qIdx: number, optIdx: number, multi: boolean) => void\n onCustomFocus: (qIdx: number) => void\n onCustomChange: (qIdx: number, text: string) => void\n}) {\n const multi = question.multiSelect ?? false\n\n return (\n <div>\n <div className={cn(\"flex items-start gap-2\", answered ? \"mb-2\" : \"mb-3\")}>\n <MessageSquareMore\n size={answered ? 12 : 13}\n className=\"mt-0.5 shrink-0 text-[hsl(var(--primary))]\"\n />\n <div\n className={cn(\n \"min-w-0 flex-1 font-medium text-[hsl(var(--foreground))]\",\n answered ? \"text-xs\" : \"text-sm\",\n )}\n >\n <MarkdownContent\n className={cn(\n \"prose prose-sm prose-invert max-w-none [&_li>p]:inline [&_ol]:my-1 [&_p]:my-1 [&_p:first-child]:mt-0 [&_p:last-child]:mb-0 [&_ul]:my-1\",\n answered ? \"text-xs\" : \"text-sm\",\n )}\n controls={{ code: true }}\n >\n {question.question}\n </MarkdownContent>\n </div>\n </div>\n\n <div className={cn(\"flex flex-col pl-5\", answered ? \"gap-1\" : \"gap-1.5\")}>\n {question.options.map((opt, optIdx) => {\n const isSel = selected.has(optIdx)\n return (\n <button\n key={opt.label}\n type=\"button\"\n disabled={answered}\n onClick={() => onToggle(qIdx, optIdx, multi)}\n className={cn(\n \"flex items-start gap-2.5 rounded-lg border text-left transition-all\",\n answered ? \"px-2.5 py-1.5\" : \"px-3 py-2.5\",\n isSel && !answered\n ? \"border-[hsl(var(--primary)/0.8)] bg-[hsl(var(--primary))] text-[hsl(var(--primary-foreground))]\"\n : isSel\n ? \"border-[hsl(var(--primary)/0.45)] bg-[hsl(var(--primary)/0.08)] text-[hsl(var(--foreground))]\"\n : \"border-[hsl(var(--border))] bg-[hsl(var(--muted)/0.2)]\",\n !answered && !isSel && \"hover:border-[hsl(var(--ring)/0.4)] hover:bg-[hsl(var(--accent))]\",\n answered && \"cursor-default opacity-70\",\n )}\n >\n {multi && (\n <div\n className={cn(\n \"mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition-colors\",\n isSel && !answered\n ? \"border-[hsl(var(--primary-foreground)/0.6)] bg-[hsl(var(--primary-foreground)/0.2)]\"\n : isSel\n ? \"border-[hsl(var(--primary)/0.45)] bg-[hsl(var(--primary)/0.12)]\"\n : \"border-[hsl(var(--border))]\",\n )}\n >\n {isSel && (\n <Check\n size={9}\n className={\n answered\n ? \"text-[hsl(var(--primary))]\"\n : \"text-[hsl(var(--primary-foreground))]\"\n }\n />\n )}\n </div>\n )}\n <div className=\"min-w-0\">\n <div className={cn(\"font-medium\", answered ? \"text-xs\" : \"text-[13px]\")}>\n {opt.label}\n </div>\n {opt.description && (\n <div\n className={cn(\n \"mt-0.5\",\n answered ? \"text-[11px]\" : \"text-xs\",\n isSel && !answered ? \"opacity-75\" : \"text-[hsl(var(--muted-foreground))]\",\n )}\n >\n {opt.description}\n </div>\n )}\n </div>\n </button>\n )\n })}\n\n {/* \"Other\" inline input */}\n {answered && !isCustom ? null : (\n <div\n className={cn(\n \"flex items-center gap-2 rounded-lg border transition-all\",\n answered ? \"px-2.5 py-1.5\" : \"px-3 py-2.5\",\n isCustom\n ? \"border-[hsl(var(--ring)/0.6)] bg-[hsl(var(--accent))]\"\n : \"border-[hsl(var(--border))] hover:border-[hsl(var(--ring)/0.3)] hover:bg-[hsl(var(--accent))]\",\n answered && \"cursor-default opacity-70\",\n )}\n >\n <span className=\"shrink-0 text-xs text-[hsl(var(--muted-foreground))]\">其他:</span>\n <input\n type=\"text\"\n value={customText}\n disabled={answered}\n onChange={(e) => onCustomChange(qIdx, e.target.value)}\n onFocus={() => onCustomFocus(qIdx)}\n aria-label=\"自定义回答\"\n placeholder=\"输入你的答案...\"\n className={cn(\n \"min-w-0 flex-1 bg-transparent text-[hsl(var(--foreground))] outline-none placeholder:text-[hsl(var(--muted-foreground)/0.5)]\",\n answered ? \"text-xs\" : \"text-sm\",\n )}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport function parseAskUserQuestion(\n toolResult: string | null | undefined,\n): AskUserQuestionData | null {\n if (!toolResult) return null\n try {\n const parsed = JSON.parse(toolResult)\n let questions = parsed?.questions\n // 容错:LLM 偶尔将 questions 输出为 JSON 字符串而非数组\n if (typeof questions === \"string\") {\n try {\n questions = JSON.parse(questions)\n } catch {\n return null\n }\n }\n if (Array.isArray(questions) && questions.every(isQuestionItem)) {\n return { ...parsed, questions } as AskUserQuestionData\n }\n } catch {\n // not JSON\n }\n return null\n}\n\nfunction isQuestionItem(value: unknown): value is QuestionItem {\n if (!value || typeof value !== \"object\") return false\n const question = (value as { question?: unknown }).question\n const options = (value as { options?: unknown }).options\n return typeof question === \"string\" && Array.isArray(options) && options.every(isOptionItem)\n}\n\nfunction isOptionItem(value: unknown): value is OptionItem {\n if (!value || typeof value !== \"object\") return false\n const option = value as { label?: unknown; description?: unknown }\n return typeof option.label === \"string\" && typeof option.description === \"string\"\n}\n","import { load } from \"js-yaml\"\nimport type { PlanNode } from \"./types\"\n\ninterface PlanStep {\n label: string\n skill?: string\n id?: string\n status?: string\n children?: PlanStep[]\n}\n\ninterface PlanDocument {\n title: string\n objective: string\n steps: PlanStep[]\n notes?: string[]\n}\n\ninterface ParsedPlanResult {\n plan: { root: PlanNode; notes: string[] } | null\n error: string | null\n}\n\nexport type PlanStatusMap = Record<string, PlanNode[\"status\"]>\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0\n}\n\nfunction isPlanStep(value: unknown): value is PlanStep {\n if (!value || typeof value !== \"object\") return false\n const step = value as Record<string, unknown>\n if (!isNonEmptyString(step.label)) return false\n if (\"skill\" in step && step.skill !== undefined && !isNonEmptyString(step.skill)) return false\n if (\"children\" in step && !Array.isArray(step.children)) return false\n\n const children = Array.isArray(step.children) ? step.children : []\n if (children.length > 0 && !isNonEmptyString(step.skill)) return false\n return children.every((child) => isPlanStep(child))\n}\n\nfunction isPlanDocument(value: unknown): value is PlanDocument {\n if (!value || typeof value !== \"object\") return false\n const doc = value as Record<string, unknown>\n if (!isNonEmptyString(doc.title) || !isNonEmptyString(doc.objective)) return false\n if (!Array.isArray(doc.steps) || doc.steps.length === 0) return false\n if (!doc.steps.every((step) => isPlanStep(step))) return false\n if (\"notes\" in doc) {\n if (!Array.isArray(doc.notes)) return false\n if (!doc.notes.every((note) => isNonEmptyString(note))) return false\n }\n return true\n}\n\nfunction getPlanDocumentError(value: unknown): string {\n if (!value || typeof value !== \"object\") return \"PLAN.yaml 顶层结构必须是对象\"\n\n const doc = value as Record<string, unknown>\n if (!isNonEmptyString(doc.title)) return \"PLAN.yaml 缺少非空 title\"\n if (!isNonEmptyString(doc.objective)) return \"PLAN.yaml 缺少非空 objective\"\n if (!Array.isArray(doc.steps) || doc.steps.length === 0) return \"PLAN.yaml 缺少非空 steps\"\n if (!doc.steps.every((step) => isPlanStep(step))) {\n return \"PLAN.yaml 步骤结构无效,请检查 label / skill / children\"\n }\n if (\"notes\" in doc) {\n if (!Array.isArray(doc.notes) || !doc.notes.every((note) => isNonEmptyString(note))) {\n return \"PLAN.yaml notes 必须是非空字符串列表\"\n }\n }\n return \"PLAN.yaml 结构无效\"\n}\n\nfunction toPlanStatus(value: unknown): PlanNode[\"status\"] {\n if (!isNonEmptyString(value)) return \"pending\"\n const normalized = value.trim().toLowerCase()\n return normalized === \"pending\" || normalized === \"running\" || normalized === \"done\" || normalized === \"failed\"\n ? normalized\n : \"pending\"\n}\n\nexport function parsePlanTree(content: string): { root: PlanNode; notes: string[] } | null {\n return parsePlanTreeResult(content).plan\n}\n\nexport function applyPlanStatusesById(root: PlanNode, statuses: PlanStatusMap): PlanNode {\n const nextStatus = statuses[root.id] ?? root.status\n const children = Array.isArray(root.children) ? root.children : []\n return {\n ...root,\n status: nextStatus,\n children: children.map((child) => applyPlanStatusesById(child, statuses)),\n }\n}\n\nexport function parsePlanTreeResult(content: string): ParsedPlanResult {\n if (!content.trim()) {\n return { plan: null, error: null }\n }\n\n let parsed: unknown\n try {\n parsed = load(content)\n } catch (error) {\n return {\n plan: null,\n error: error instanceof Error ? `PLAN.yaml YAML 语法错误:${error.message}` : \"PLAN.yaml YAML 语法错误\",\n }\n }\n\n if (!isPlanDocument(parsed)) {\n return { plan: null, error: getPlanDocumentError(parsed) }\n }\n\n const createNode = (step: PlanStep, depth: number, fallbackId: string): PlanNode => {\n const children = Array.isArray(step.children) ? step.children : []\n return {\n id: isNonEmptyString(step.id) ? step.id.trim() : fallbackId,\n label: step.label.trim(),\n skillRef: isNonEmptyString(step.skill) ? step.skill.trim() : null,\n status: toPlanStatus(step.status),\n children: children.map((child, index) => createNode(child, depth + 1, `${fallbackId}.${index + 1}`)),\n depth,\n }\n }\n\n const root: PlanNode = {\n id: \"plan-root\",\n label: parsed.title.trim(),\n skillRef: null,\n status: \"pending\",\n children: parsed.steps.map((step, index) => createNode(step, 1, `${index + 1}`)),\n depth: 0,\n }\n\n const notes = [parsed.objective.trim(), ...(parsed.notes ?? []).map((note) => note.trim())]\n\n return { plan: { root, notes }, error: null }\n}\n","import type { ChatMessage } from \"../../schemas/message\"\nimport { parseAskUserQuestion } from \"../chat/AskUserQuestionBlock\"\nimport { applyPlanStatusesById, parsePlanTreeResult, type PlanStatusMap } from \"./parse-plan-tree\"\nimport type { PlanData, SkillInfo } from \"./types\"\n\nfunction resultAsString(result: unknown): string | null {\n if (typeof result === \"string\") return result\n return null\n}\n\nconst PAUSE_TOOLS = new Set([\"AskUserQuestion\", \"ExitPlanMode\"])\nconst READ_FILE_TOOLS = new Set([\"Read\"])\nconst PLAN_WRITE_TOOLS = new Set([\"Write\"])\nconst PLAN_EDIT_TOOLS = new Set([\"Edit\"])\n\nfunction getSkillId(payload: { skill_id?: string; name?: string } | null | undefined): string {\n if (!payload) {\n return \"\"\n }\n if (typeof payload.skill_id === \"string\" && payload.skill_id) {\n return payload.skill_id\n }\n if (typeof payload.name === \"string\" && payload.name) {\n return payload.name\n }\n return \"\"\n}\n\nfunction getSkillDisplayName(\n payload: { display_name?: string; skill_id?: string; name?: string } | null | undefined,\n): string | undefined {\n if (!payload || typeof payload.display_name !== \"string\") {\n return undefined\n }\n const displayName = payload.display_name.trim()\n if (!displayName) {\n return undefined\n }\n const skillId = getSkillId(payload)\n return displayName === skillId ? undefined : displayName\n}\n\nfunction parseModeChange(message: ChatMessage): { from: string; to: string } | null {\n if (message.kind !== \"mode_change\" || typeof message.content !== \"string\") {\n return null\n }\n try {\n const parsed = JSON.parse(message.content) as { from?: unknown; to?: unknown }\n if (typeof parsed.from === \"string\" && typeof parsed.to === \"string\") {\n return { from: parsed.from, to: parsed.to }\n }\n } catch {}\n return null\n}\n\nfunction isPlanningBoundaryMessage(message: ChatMessage): boolean {\n if (message.kind === \"planning_enter\" || message.kind === \"planning_exit\") {\n return true\n }\n const modeChange = parseModeChange(message)\n if (!modeChange) {\n return false\n }\n return modeChange.to === \"planning\" || modeChange.from === \"planning\"\n}\n\n/**\n * Extract structured plan data from planning phase messages.\n *\n * Expects messages between planning_enter/exit markers containing:\n * - search_skills tool calls (Phase 1)\n * - get_skill_content tool calls (Phase 2)\n * - Write tool call to PLAN.yaml with plan YAML (Phase 3)\n */\nexport function parsePlanMessages(allMessages: ChatMessage[]): PlanData {\n const messages = Array.isArray(allMessages) ? allMessages : []\n // Extract intent from the first search_skills query\n let intent = \"\"\n for (const msg of messages) {\n if (!msg.tool_calls) continue\n const searchTc = msg.tool_calls.find(\n (tc) => tc.name === \"search_skills\" || tc.name === \"SearchSkills\",\n )\n if (searchTc) {\n try {\n intent = JSON.parse(searchTc.arguments).query ?? \"\"\n } catch {}\n if (intent) break\n }\n }\n\n const plannerMsgs = messages.filter(\n (message) => !isPlanningBoundaryMessage(message),\n )\n const searchResults: SkillInfo[] = []\n const searchMap = new Map<string, SkillInfo>()\n const selectedSkills: SkillInfo[] = []\n const selectedSet = new Set<string>()\n const askQuestions: PlanData[\"askQuestions\"] = []\n const readFiles: PlanData[\"readFiles\"] = []\n let lastPauseTool: PlanData[\"lastPauseTool\"] = null\n let planContent = \"\"\n let planContentPriority = 0\n let latestStatuses: PlanStatusMap = {}\n\n const setPlanContent = (nextContent: unknown, priority: number) => {\n if (typeof nextContent !== \"string\" || !nextContent.trim()) {\n return\n }\n if (priority < planContentPriority) {\n return\n }\n planContent = nextContent\n planContentPriority = priority\n }\n\n const applyPlanEdit = (args: Record<string, unknown>) => {\n const oldString = typeof args.old_string === \"string\" ? args.old_string : \"\"\n const newString = typeof args.new_string === \"string\" ? args.new_string : \"\"\n if (!planContent || !oldString || !planContent.includes(oldString)) {\n return\n }\n planContent = planContent.replace(oldString, newString)\n }\n\n const maybeParsePlanStatus = (msg: ChatMessage) => {\n if (msg.kind !== \"plan_status\") return\n if (typeof msg.content !== \"string\" || !msg.content.trim()) return\n try {\n const data = JSON.parse(msg.content) as { plan_yaml?: unknown; statuses?: unknown }\n setPlanContent(data.plan_yaml, 3)\n if (data.statuses && typeof data.statuses === \"object\" && !Array.isArray(data.statuses)) {\n latestStatuses = Object.fromEntries(\n Object.entries(data.statuses)\n .filter((entry): entry is [string, string] => typeof entry[0] === \"string\" && typeof entry[1] === \"string\")\n .map(([stepId, status]) => [stepId, normalizePlanStatus(status)]),\n )\n }\n } catch {}\n }\n\n for (const msg of plannerMsgs) {\n maybeParsePlanStatus(msg)\n if (!msg.tool_calls) continue\n for (const tc of msg.tool_calls) {\n if ((tc.name === \"search_skills\" || tc.name === \"SearchSkills\") && resultAsString(tc.result)) {\n try {\n const parsed = JSON.parse(resultAsString(tc.result)!)\n const results: Array<{\n skill_id?: string\n name?: string\n display_name?: string\n description?: string\n }> =\n Array.isArray(parsed) ? parsed : Array.isArray(parsed?.results) ? parsed.results : []\n for (const r of results) {\n const skillId = getSkillId(r)\n if (!skillId || searchMap.has(skillId)) continue\n const skill: SkillInfo = {\n skillId,\n displayName: getSkillDisplayName(r),\n description: r.description ?? \"\",\n }\n searchMap.set(skillId, skill)\n searchResults.push(skill)\n }\n } catch {}\n }\n if (\n (tc.name === \"get_skill_content\" || tc.name === \"GetSkillContent\") &&\n resultAsString(tc.result)\n ) {\n try {\n const data = JSON.parse(resultAsString(tc.result)!) as {\n skill_id?: string\n name?: string\n display_name?: string\n description?: string\n content?: string\n }\n const skillId = getSkillId(data)\n if (!skillId || selectedSet.has(skillId)) continue\n let existing = searchMap.get(skillId)\n if (!existing) {\n // Skill fetched directly without prior search — auto-add to searchResults\n existing = {\n skillId,\n displayName: getSkillDisplayName(data),\n description: data.description ?? \"\",\n }\n searchMap.set(skillId, existing)\n searchResults.push(existing)\n }\n existing.displayName ??= getSkillDisplayName(data)\n existing.content = data.content\n existing.references = extractRefs(data.content ?? \"\")\n selectedSkills.push(existing)\n selectedSet.add(skillId)\n } catch {}\n }\n if (tc.name === \"AskUserQuestion\" && resultAsString(tc.result)) {\n const data = parseAskUserQuestion(resultAsString(tc.result))\n if (data) {\n askQuestions.push({ toolCallId: tc.id, data })\n }\n }\n if (READ_FILE_TOOLS.has(tc.name) && tc.arguments) {\n try {\n const args = JSON.parse(tc.arguments)\n if (typeof args.file_path === \"string\" && args.file_path) {\n readFiles.push({ path: args.file_path, status: tc.status ?? \"done\" })\n }\n } catch {}\n }\n if (\n PLAN_WRITE_TOOLS.has(tc.name) &&\n tc.arguments &&\n tc.status === \"done\" &&\n !(typeof tc.result === \"string\" && tc.result.startsWith(\"错误\"))\n ) {\n try {\n const args = JSON.parse(tc.arguments) as {\n file_path?: unknown\n content?: unknown\n }\n if (\n typeof args.file_path === \"string\" &&\n (args.file_path === \"PLAN.yaml\" || args.file_path.endsWith(\"/PLAN.yaml\")) &&\n typeof args.content === \"string\"\n ) {\n setPlanContent(args.content, 1)\n }\n } catch {}\n }\n if (\n PLAN_EDIT_TOOLS.has(tc.name) &&\n tc.arguments &&\n tc.status === \"done\" &&\n !(typeof tc.result === \"string\" && tc.result.startsWith(\"错误\"))\n ) {\n try {\n const args = JSON.parse(tc.arguments) as {\n file_path?: unknown\n old_string?: unknown\n new_string?: unknown\n }\n if (\n typeof args.file_path === \"string\" &&\n (args.file_path === \"PLAN.yaml\" || args.file_path.endsWith(\"/PLAN.yaml\"))\n ) {\n applyPlanEdit(args as Record<string, unknown>)\n }\n } catch {}\n }\n // Track the last pause-triggering tool across the whole phase.\n // Multi-round planning produces multiple pauses (e.g. AskUserQuestion\n // then ExitPlanMode); the UI needs the most recent one.\n if (PAUSE_TOOLS.has(tc.name) && tc.status === \"done\") {\n lastPauseTool = tc.name as PlanData[\"lastPauseTool\"]\n }\n if (tc.name === \"ExitPlanMode\" && resultAsString(tc.result)) {\n try {\n const data = JSON.parse(resultAsString(tc.result)!) as { plan?: unknown }\n setPlanContent(data.plan, 2)\n } catch {}\n }\n }\n }\n\n const { plan: parsedPlan, error: parseError } = parsePlanTreeResult(planContent)\n const plan =\n parsedPlan == null\n ? null\n : {\n ...parsedPlan,\n root: applyPlanStatusesById(parsedPlan.root, latestStatuses),\n }\n\n return {\n intent,\n searchResults,\n selectedSkills,\n plan,\n hasPlanContent: planContent.trim().length > 0,\n parseError,\n askQuestions,\n readFiles,\n lastPauseTool,\n }\n}\n\nfunction normalizePlanStatus(value: string): \"pending\" | \"running\" | \"done\" | \"failed\" {\n const normalized = value.trim().toLowerCase()\n return normalized === \"running\" || normalized === \"done\" || normalized === \"failed\"\n ? normalized\n : \"pending\"\n}\n\nfunction extractRefs(content: string): string[] {\n const seen = new Set<string>()\n const refs: string[] = []\n for (const m of content.matchAll(/\\[\\[([^\\]]+)\\]\\]/g)) {\n const ref = m[1].trim()\n if (ref && !seen.has(ref)) {\n seen.add(ref)\n refs.push(ref)\n }\n }\n return refs\n}\n","import { CheckCircle2, ChevronRight, PencilLine, Play, Sparkles } from \"lucide-react\"\nimport { useMemo, useState } from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { ChatMessage } from \"../../schemas/message\"\nimport { useUiStore } from \"../../stores/ui-store\"\nimport { parsePlanMessages } from \"./parse-plan-messages\"\n\ninterface Props {\n messages: ChatMessage[]\n sessionStatus?: string\n onConfirmPlan?: (action: \"execute\" | \"revise\", text?: string) => void\n}\n\ntype SummaryState =\n | { kind: \"complete\"; label: string }\n | { kind: \"failed\"; label: string }\n | { kind: \"interrupted\"; label: string }\n | { kind: \"progress\"; label: string; dots: string }\n\nexport function PlanSummaryCard({\n messages,\n sessionStatus,\n onConfirmPlan,\n}: Props) {\n const data = useMemo(() => parsePlanMessages(messages), [messages])\n const rightPanelCollapsed = useUiStore((state) => state.rightPanelCollapsed)\n const toggleRightPanel = useUiStore((state) => state.toggleRightPanel)\n const setActiveRightTab = useUiStore((state) => state.setActiveRightTab)\n const summaryState = useMemo(() => getSummaryState(data, sessionStatus), [data, sessionStatus])\n const stepCount = useMemo(() => countPlanSteps(data.plan), [data.plan])\n const isWaitingForInput = sessionStatus === \"waiting_for_input\"\n const canConfirm =\n Boolean(onConfirmPlan) &&\n isWaitingForInput &&\n data.lastPauseTool === \"ExitPlanMode\"\n\n const openPlanPanel = () => {\n if (rightPanelCollapsed) {\n toggleRightPanel()\n }\n setActiveRightTab(\"situation\")\n }\n\n return (\n <div className=\"flex w-full flex-col gap-4 rounded-2xl border border-[hsl(var(--border))] bg-[hsl(var(--card)/0.55)] p-4\">\n <button\n type=\"button\"\n onClick={openPlanPanel}\n className=\"flex w-full flex-col gap-4 text-left transition-colors hover:text-[hsl(var(--foreground))]\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex items-center gap-2 text-xs text-[hsl(var(--muted-foreground))]\">\n <Sparkles size={12} />\n <span>规划摘要</span>\n </div>\n <div className=\"truncate text-base font-medium text-[hsl(var(--foreground))]\">\n {data.intent || \"当前规划\"}\n </div>\n <div className=\"flex flex-wrap items-center gap-2 text-xs\">\n {summaryState.kind === \"progress\" ? (\n <>\n <span className=\"rounded-full bg-[hsl(var(--accent))] px-2.5 py-1 text-[hsl(var(--foreground))]\">\n {summaryState.label}\n </span>\n <span className=\"font-mono tracking-[0.25em] text-[hsl(var(--muted-foreground))]\">\n {summaryState.dots}\n </span>\n </>\n ) : (\n <span\n className={cn(\n \"rounded-full px-2.5 py-1\",\n summaryState.kind === \"complete\" &&\n \"bg-[hsl(var(--primary)/0.12)] text-[hsl(var(--primary))]\",\n summaryState.kind === \"failed\" &&\n \"bg-[hsl(var(--destructive)/0.12)] text-[hsl(var(--destructive))]\",\n summaryState.kind === \"interrupted\" && \"bg-orange-500/12 text-orange-300\",\n )}\n >\n {summaryState.label}\n </span>\n )}\n </div>\n </div>\n <ChevronRight\n size={16}\n className=\"mt-1 shrink-0 text-[hsl(var(--muted-foreground))]\"\n aria-hidden=\"true\"\n />\n </div>\n\n {summaryState.kind === \"complete\" && (\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-[hsl(var(--muted-foreground))]\">\n <span className=\"rounded-full border border-[hsl(var(--border))] px-2.5 py-1\">\n {data.selectedSkills.length} 个技能\n </span>\n <span className=\"rounded-full border border-[hsl(var(--border))] px-2.5 py-1\">\n {stepCount} 个步骤\n </span>\n <span className=\"inline-flex items-center gap-1 text-[hsl(var(--muted-foreground))]\">\n <CheckCircle2 size={12} />\n 右侧查看详情\n </span>\n </div>\n )}\n </button>\n\n {canConfirm && <PlanConfirmationPanel onConfirmPlan={onConfirmPlan} />}\n </div>\n )\n}\n\nfunction PlanConfirmationPanel({\n onConfirmPlan,\n}: {\n onConfirmPlan?: (action: \"execute\" | \"revise\", text?: string) => void\n}) {\n const [isEditing, setIsEditing] = useState(false)\n const [revisionText, setRevisionText] = useState(\"\")\n\n const submitRevision = () => {\n const trimmed = revisionText.trim()\n if (!trimmed) return\n onConfirmPlan?.(\"revise\", trimmed)\n setRevisionText(\"\")\n setIsEditing(false)\n }\n\n return (\n <div className=\"space-y-3 rounded-xl border border-[hsl(var(--border))] bg-[hsl(var(--background)/0.45)] p-3\">\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => onConfirmPlan?.(\"execute\")}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-[hsl(var(--primary))] px-3 py-2 text-sm font-medium text-[hsl(var(--primary-foreground))] transition-opacity hover:opacity-90\"\n >\n <Play size={14} />\n 开始执行\n </button>\n <button\n type=\"button\"\n onClick={() => setIsEditing((value) => !value)}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-[hsl(var(--border))] px-3 py-2 text-sm text-[hsl(var(--foreground))] transition-colors hover:bg-[hsl(var(--accent))]\"\n >\n <PencilLine size={14} />\n 修改\n </button>\n </div>\n\n {isEditing && (\n <div className=\"space-y-2\">\n <textarea\n value={revisionText}\n onChange={(event) => setRevisionText(event.target.value)}\n placeholder=\"输入修改建议...\"\n className=\"min-h-24 w-full resize-y rounded-lg border border-[hsl(var(--border))] bg-transparent px-3 py-2 text-sm text-[hsl(var(--foreground))] outline-none placeholder:text-[hsl(var(--muted-foreground))]\"\n />\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n disabled={!revisionText.trim()}\n onClick={submitRevision}\n className=\"rounded-lg bg-[hsl(var(--primary))] px-3 py-1.5 text-xs font-medium text-[hsl(var(--primary-foreground))] transition-opacity hover:opacity-90 disabled:opacity-30\"\n >\n 提交修改意见\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction getSummaryState(\n data: ReturnType<typeof parsePlanMessages>,\n sessionStatus?: string,\n): SummaryState {\n if (sessionStatus === \"failed\") {\n return { kind: \"failed\", label: \"出错\" }\n }\n if (sessionStatus === \"interrupted\") {\n return { kind: \"interrupted\", label: \"已中断\" }\n }\n if (data.parseError) {\n return { kind: \"failed\", label: \"解析失败\" }\n }\n if (data.hasPlanContent || data.plan != null) {\n return { kind: \"complete\", label: \"已生成\" }\n }\n if (data.selectedSkills.length > 0) {\n return { kind: \"progress\", label: \"技能分析中\", dots: \"●●○\" }\n }\n if (data.searchResults.length > 0) {\n return { kind: \"progress\", label: \"技能发现中\", dots: \"●○○\" }\n }\n return { kind: \"progress\", label: \"规划准备中\", dots: \"○○○\" }\n}\n\nfunction countPlanSteps(plan: ReturnType<typeof parsePlanMessages>[\"plan\"]): number {\n if (!plan) return 0\n\n const countNode = (node: (typeof plan.root)[\"children\"][number] | typeof plan.root): number => {\n const children = Array.isArray(node.children) ? node.children : []\n return 1 + children.reduce((total, child) => total + countNode(child), 0)\n }\n\n if (plan.root.id === \"plan-root\") {\n const children = Array.isArray(plan.root.children) ? plan.root.children : []\n return children.reduce((total, child) => total + countNode(child), 0)\n }\n\n return countNode(plan.root)\n}\n","import type { ChatMessage } from \"../../schemas/message\"\n\nfunction parseModeChange(message: ChatMessage): { from: string; to: string } | null {\n if (message.kind !== \"mode_change\" || typeof message.content !== \"string\") {\n return null\n }\n try {\n const parsed = JSON.parse(message.content) as { from?: unknown; to?: unknown }\n if (typeof parsed.from === \"string\" && typeof parsed.to === \"string\") {\n return { from: parsed.from, to: parsed.to }\n }\n } catch {}\n return null\n}\n\nfunction isPlanningEnter(message: ChatMessage): boolean {\n if (message.kind === \"planning_enter\") {\n return true\n }\n const modeChange = parseModeChange(message)\n return modeChange?.to === \"planning\"\n}\n\nfunction isPlanningExit(message: ChatMessage): boolean {\n if (message.kind === \"planning_exit\") {\n return true\n }\n const modeChange = parseModeChange(message)\n return modeChange?.from === \"planning\"\n}\n\nexport function extractLatestPlanMessages(messages: ChatMessage[]): ChatMessage[] {\n const safeMessages = Array.isArray(messages) ? messages : []\n let enterIndex = -1\n let exitIndex = -1\n\n for (let i = safeMessages.length - 1; i >= 0; i -= 1) {\n const message = safeMessages[i]\n if (isPlanningExit(message) && exitIndex === -1) {\n exitIndex = i\n continue\n }\n if (isPlanningEnter(message)) {\n enterIndex = i\n break\n }\n }\n\n if (enterIndex === -1) {\n return []\n }\n\n return safeMessages\n .slice(enterIndex + 1)\n .filter((message, offset) => {\n const absoluteIndex = enterIndex + 1 + offset\n if (isPlanningEnter(message) || isPlanningExit(message)) {\n return false\n }\n if (exitIndex !== -1 && absoluteIndex > exitIndex) {\n return message.kind === \"plan_status\"\n }\n return true\n })\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,WAAW,SAAS,gBAAgB;AAE7C,IAAM,aAAa;AACnB,IAAM,cAAc;AAoBpB,IAAM,mBAA0D;AAAA,EAC9D,MAAM;AAAA,EACN,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP;AAaA,IAAI,qBAAsD;AAE1D,IAAM,iBAAiB;AACvB,IAAM,iBAAiB,oBAAI,IAAoC;AAExD,SAAS,sBAAsB,UAAwD;AAC5F,MAAI,CAAC,SAAU,QAAO;AAEtB,SAAO,iBAAiB,SAAS,KAAK,EAAE,YAAY,CAAC,KAAK;AAC5D;AAEO,SAAS,uBAAuB,MAAc,UAA0B;AAC7E,QAAM,qBAAqB,QAAQ,MAAM,sBAAsB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACpF,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAE1E,YAAU,MAAM;AACd,QAAI,YAAY;AAEhB,uBAAmB,IAAI;AAEvB,QAAI,CAAC,oBAAoB;AACvB,aAAO,MAAM;AACX,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,SAAK,yBAAyB,MAAM,kBAAkB,EAAE,KAAK,CAAC,WAAW;AACvE,UAAI,CAAC,WAAW;AACd,2BAAmB,MAAM;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,kBAAkB,CAAC;AAE7B,SAAO,EAAE,iBAAiB,UAAU,mBAAmB;AACzD;AAEA,eAAe,yBAAyB,MAAc,UAAiC;AACrF,QAAM,WAAW,GAAG,QAAQ,KAAS,IAAI;AACzC,QAAM,SAAS,eAAe,IAAI,QAAQ;AAE1C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,oBAAoB,EACjC,KAAK,CAAC,gBAAgB;AACrB,UAAM,OAAO,YAAY,WAAW,MAAM;AAAA,MACxC,MAAM;AAAA,MACN,QAAQ,EAAE,OAAO,aAAa,MAAM,WAAW;AAAA,MAC/C,cAAc;AAAA,IAChB,CAAC;AACD,WAAO,qBAAqB,IAAI;AAAA,EAClC,CAAC,EACA,MAAM,MAAM;AACX,mBAAe,OAAO,QAAQ;AAC9B,WAAO;AAAA,EACT,CAAC;AAEH,MAAI,eAAe,QAAQ,gBAAgB;AACzC,UAAM,SAAS,eAAe,KAAK,EAAE,KAAK,EAAE;AAC5C,QAAI,WAAW,OAAW,gBAAe,OAAO,MAAM;AAAA,EACxD;AACA,iBAAe,IAAI,UAAU,OAAO;AACpC,SAAO;AACT;AAEA,eAAe,sBAAgD;AAC7D,MAAI,CAAC,oBAAoB;AACvB,yBAAqB,QAAQ,IAAI;AAAA,MAC/B,OAAO,YAAY;AAAA,MACnB,OAAO,yBAAyB;AAAA,MAChC,OAAO,qBAAqB;AAAA,MAC5B,OAAO,oBAAoB;AAAA,MAC3B,OAAO,mBAAmB;AAAA,MAC1B,OAAO,qBAAqB;AAAA,MAC5B,OAAO,2BAA2B;AAAA,MAClC,OAAO,qBAAqB;AAAA,MAC5B,OAAO,oBAAoB;AAAA,MAC3B,OAAO,yBAAyB;AAAA,MAChC,OAAO,uBAAuB;AAAA,MAC9B,OAAO,qBAAqB;AAAA,MAC5B,OAAO,oBAAoB;AAAA,MAC3B,OAAO,2BAA2B;AAAA,MAClC,OAAO,qBAAqB;AAAA,MAC5B,OAAO,qCAAqC;AAAA,MAC5C,OAAO,sCAAsC;AAAA,IAC/C,CAAC,EAAE;AAAA,MACD,CAAC;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,MACE,KAAK,sBAAsB;AAAA,QACzB,QAAQ,OAAO,4BAA4B;AAAA,QAC3C,OAAO;AAAA,UACL,KAAK;AAAA,UACL,IAAI;AAAA,UACJ,GAAG;AAAA,UACH,KAAK;AAAA,UACL,WAAW;AAAA,UACX,KAAK;AAAA,UACLA,KAAI;AAAA,UACJ,SAAS;AAAA,UACT,OAAO;AAAA,UACP,KAAK;AAAA,UACL,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,KAAK;AAAA,QACP;AAAA,QACA,QAAQ,CAAC,UAAU,SAAS,WAAW,OAAO;AAAA,MAChD,CAAC;AAAA,IACL,EAAE,MAAM,CAAC,QAAQ;AACf,2BAAqB;AACrB,YAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAc;AAC1C,QAAM,QAAQ,KAAK,MAAM,yCAAyC;AAClE,SAAO,QAAQ,CAAC,KAAK;AACvB;;;AC5MA,SAAS,eAAe,kBAAkB;AAQnC,IAAM,cAAc,cAAgC,CAAC,CAAC;AAEtD,IAAM,iBAAiB,MAAM,WAAW,WAAW;;;ACT1D,SAAS,gCAAgC;;;ACDzC,SAAS,iBAAiD;;;ACQpD,SACE,KADF;AAHC,SAAS,iBAAiB,EAAE,QAAQ,GAAmB;AAC5D,SACE,qBAAC,SAAI,WAAU,6FACb;AAAA,yBAAC,SAAI,WAAU,gCACb;AAAA,0BAAC,SAAI,WAAU,gGAA+F;AAAA,MAC9G,oBAAC,OAAE,WAAU,sCAAqC,iEAAW;AAAA,OAC/D;AAAA,IACA,qBAAC,aAAQ,WAAU,QACjB;AAAA,0BAAC,aAAQ,WAAU,yDAAwD,8DAAQ;AAAA,MACnF,oBAAC,SAAI,WAAU,sHACZ,mBACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEO,SAAS,eAAe,EAAE,SAAS,QAAQ,GAAmB;AACnE,SACE,qBAAC,SAAI,WAAU,6DACb;AAAA,wBAAC,OAAE,WAAU,6BAA6B,qBAAW,oDAAW;AAAA,IAChE,qBAAC,aAAQ,WAAU,QACjB;AAAA,0BAAC,aAAQ,WAAU,0DAAyD,wDAE5E;AAAA,MACA,oBAAC,SAAI,WAAU,wGACZ,mBACH;AAAA,OACF;AAAA,KACF;AAEJ;AAEO,SAAS,iBAAiB,EAAE,SAAS,QAAQ,GAAmB;AACrE,SACE,qBAAC,SAAI,WAAU,mEACb;AAAA,wBAAC,OAAE,WAAU,gCAAgC,qBAAW,sEAAc;AAAA,IACtE,qBAAC,aAAQ,WAAU,QACjB;AAAA,0BAAC,aAAQ,WAAU,6CAA4C,kDAAM;AAAA,MACrE,oBAAC,SAAI,WAAU,8FACZ,mBACH;AAAA,OACF;AAAA,KACF;AAEJ;;;ADWI,SAmDA,UAnDA,OAAAC,MAiEQ,QAAAC,aAjER;AAjDJ,SAAS,gBAAgB,MAAuB;AAC9C,QAAM,IAAI,KAAK,KAAK;AACpB,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,cAAc,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG;AACzC,QAAM,eAAe,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG;AAC1C,QAAM,gBAAgB,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG;AAC5C,QAAM,iBAAiB,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG;AAC5C,QAAM,UAAU,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG;AAErC,SACG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,EAAE,SAAS,GAAG,KACpC,eAAe,eACf,iBAAiB,iBACjB,EAAE,SAAS,GAAG,KACd,EAAE,SAAS,GAAG,KACd,SAAS,MAAM;AAEnB;AAWA,IAAM,oBAAN,cAAgC,UAAkD;AAAA,EAChF,QAA4B,EAAE,UAAU,MAAM;AAAA,EAE9C,OAAO,2BAA+C;AACpD,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAEA,kBAAkB,OAAc,MAAiB;AAC/C,YAAQ,MAAM,sBAAsB,OAAO,IAAI;AAAA,EACjD;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,MAAM,SAAU,QAAO,KAAK,MAAM;AAC3C,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,oBAAoB,EAAE,KAAK,GAAmB;AACrD,QAAM,eAAe,WAAW,CAAC,MAAM,EAAE,YAAY;AAErD,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,MACP,aAAa;AAAA,QACX,MAAM;AAAA,QACN,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,QACrC,OAAO,KAAK,SAAS,KAAK;AAAA,QAC1B,KAAK,QAAQ,KAAK,EAAE;AAAA,MACtB,CAAC;AAAA,MAEH,WAAU;AAAA,MACX;AAAA;AAAA,EAED;AAEJ;AAEO,SAAS,aAAa,EAAE,KAAK,eAAe,sBAAsB,GAAU;AACjF,QAAM,EAAE,WAAW,WAAW,YAAY,IAAI,eAAe;AAC7D,QAAM,UAAU,IAAI,KAAK;AAEzB,MAAI,CAAC,QAAS,QAAO,gBAAAA,KAAC,oBAAiB,SAAQ,IAAG;AAGlD,MAAI,uBAAuB;AACzB,WAAO,gBAAAA,KAAC,oBAAiB,SAAS,SAAS;AAAA,EAC7C;AAEA,QAAM,SAAS,SAAS,cAAc,OAAO;AAE7C,MAAI,CAAC,OAAO,IAAI;AACd,QAAI,gBAAgB,OAAO,GAAG;AAC5B,aAAO,gBAAAA,KAAC,oBAAiB,SAAS,SAAS;AAAA,IAC7C;AACA,WAAO,gBAAAA,KAAC,kBAAe,SAAS,SAAS,SAAS,OAAO,OAAO;AAAA,EAClE;AAEA,QAAM,QAAQ,SAAS,YAAY,OAAO,KAAK;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO,gBAAAA,KAAC,oBAAiB,SAAS,SAAS,SAAQ,iFAAoB;AAAA,EACzE;AAEA,QAAM,eAAe,MAAM,IAAI,CAAC,GAAG,MAAM;AACvC,QAAI,EAAE,GAAI,QAAO;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,IAAI,GAAG,aAAa,KAAK,UAAU,iBAAiB,CAAC,SAAS,CAAC;AAAA,IACjE;AAAA,EACF,CAAC;AAED,SACE,gBAAAA,KAAA,YACG,uBAAa,IAAI,CAAC,SAAS;AAC1B,UAAM,gBAAgB,aAAa,IAAI,KAAK,IAAI;AAChD,QAAI,CAAC,eAAe;AAClB,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,UACrC,SAAS,+CAAY,KAAK,IAAI;AAAA;AAAA,QAFzB,KAAK;AAAA,MAGZ;AAAA,IAEJ;AACA,WACE,gBAAAA,KAAC,SAAkB,WAAU,4BAC3B,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,UACE,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,YACrC,SAAQ;AAAA;AAAA,QACV;AAAA,QAGF;AAAA,0BAAAA,KAAC,iBAAc,MAAY,aAA0B,WAAsB;AAAA,UAC3E,gBAAAA,KAAC,uBAAoB,MAAY;AAAA;AAAA;AAAA,IACnC,KAXQ,KAAK,EAYf;AAAA,EAEJ,CAAC,GACH;AAEJ;;;AD1HM,gBAAAE,YAAA;AAXC,SAAS,cAAc,EAAE,WAAW,UAAU,MAAM,GAAG,MAAM,GAAc;AAChF,QAAM,eAAe,yBAAyB;AAC9C,QAAM,QAAQ,iBAAiB,KAAK,aAAa,EAAE;AACnD,QAAM,OAAO,QAAQ,CAAC;AACtB,QAAM,WAAW,CAAC;AAClB,QAAM,MAAM,OAAO,YAAY,EAAE;AACjC,QAAM,iBAAiB,sBAAsB,IAAI;AACjD,QAAM,EAAE,gBAAgB,IAAI,uBAAuB,KAAK,cAAc;AAEtE,MAAI,CAAC,YAAY,SAAS,gBAAgB,IAAI,GAAG;AAC/C,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,eAAe,MAAM,UAAU,OAAO;AAAA,QACtC,uBAAuB;AAAA;AAAA,IACzB;AAAA,EAEJ;AAEA,MAAI,CAAC,YAAY,iBAAiB;AAChC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QAEJ,yBAAyB,EAAE,QAAQ,gBAAgB;AAAA;AAAA,IACrD;AAAA,EAEJ;AAEA,SACE,gBAAAA,KAAC,UAAK,WAAuB,GAAG,OAC7B,UACH;AAEJ;;;AG5CA,SAAS,eAAe;AACxB,SAAS,OAAO,MAAM,gBAAgB;AACtC;AAAA,EAGE,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,OACK;AACP,SAA0B,kBAAkB;AAqDtC,gBAAAC,MAKI,QAAAC,aALJ;AA9CN,IAAM,qBAAqB,EAAE,QAAQ;AAErC,IAAM,sBAAsB;AAC5B,IAAM,8BAA2E;AAAA,EAC/E,CAAC,mBAAmB,GAAG,CAAC;AAC1B;AACA,IAAM,oCAAoC;AAAA,EACxC,CAAC,mBAAmB,GAAG,MAAM;AAC/B;AAIA,SAAS,aAAa,EAAE,UAAU,MAAM,OAAO,GAAG,MAAM,GAAa;AACnE,QAAM,SAAS,OAAuB,IAAI;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AAEpD,EAAAC,WAAU,MAAM;AACd,mBAAe,CAAC,CAAC,OAAO,SAAS,cAAc,MAAM,CAAC;AAAA,EACxD,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,MAAM,OAAO,SAAS,cAAc,MAAM,GAAG,eAAe;AAE/E,QAAM,aAAa,YAAY;AAC7B,UAAM,KAAK,MAAM,gBAAgB,WAAW,CAAC;AAC7C,QAAI,IAAI;AACN,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC3B,UAAM,SAAS,OAAO,SAAS,cAAc,MAAM;AACnD,UAAM,OAAO,QAAQ,eAAe;AACpC,UAAM,MAAM,QAAQ,UAAU,MAAM,gBAAgB,IAAI,CAAC,KAAK;AAC9D,UAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,aAAa,CAAC;AACpD,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,WAAW,QAAQ,GAAG;AACxB,MAAE,MAAM;AACR,QAAI,gBAAgB,GAAG;AAAA,EACzB;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAU,kBACb;AAAA,oBAAAD,KAAC,SAAI,KAAK,QAAS,GAAG,OACnB,UACH;AAAA,IACC,eACC,gBAAAC,MAAC,SAAI,WAAU,0FACb;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,YACT;AAAA,YACA,SACI,+BACA;AAAA,UACN;AAAA,UAEC;AAAA,qBAAS,gBAAAD,KAAC,SAAM,MAAM,IAAI,IAAK,gBAAAA,KAAC,QAAK,MAAM,IAAI;AAAA,YAChD,gBAAAA,KAAC,UAAM,mBAAS,uBAAQ,gBAAK;AAAA;AAAA;AAAA,MAC/B;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAEV;AAAA,4BAAAD,KAAC,YAAS,MAAM,IAAI;AAAA,YACpB,gBAAAA,KAAC,UAAK,0BAAE;AAAA;AAAA;AAAA,MACV;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,mBAAmB,KAAsB;AAChD,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,EAAG,QAAO;AAC/D,MAAI,4BAA4B,KAAK,GAAG,EAAG,QAAO;AAClD,MAAI,IAAI,WAAW,GAAG,EAAG,QAAO;AAChC,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAqB;AAC/C,MAAI;AACF,WAAO,mBAAmB,GAAG;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,yBACJ;AAEF,SAAS,4BAA4B,UAAkB,WAA2B;AAChF,SAAO,SAAS;AAAA,IACd;AAAA,IACA,CAAC,OAAO,KAAa,UAA8B,UAA8B,QAAQ,OAAO;AAC9F,YAAM,MAAM,YAAY;AACxB,UAAI,CAAC,OAAO,mBAAmB,GAAG,GAAG;AACnC,eAAO;AAAA,MACT;AAEA,YAAM,WAAW;AAAA,QACf,iBAAiB,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,mBAAmB,GAAG,CAAC,CAAC;AAAA,MACrG;AACA,aAAO,KAAK,GAAG,MAAM,QAAQ,IAAI,KAAK;AAAA,IACxC;AAAA,EACF;AACF;AAOO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,mBAAmBI;AAAA,IACvB,MACE,aAAa,OAAO,aAAa,WAC7B,4BAA4B,UAAU,SAAS,IAC/C;AAAA,IACN,CAAC,UAAU,SAAS;AAAA,EACtB;AAEA,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAM,QAAQ;AAAA,MACd,aAAa;AAAA,QACX,GAAI,eAAe,CAAC;AAAA,QACpB,GAAG;AAAA,MACL;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,KAAK;AAAA,QACL,GAAI,cAAc,CAAC;AAAA,QACnB,GAAG;AAAA,MACL;AAAA,MACA,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAI,WAAW,CAAC;AAAA,MAClB;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AC/KA,SAAS,SAAAK,QAAO,SAAS,yBAAyB;AAClD,SAAS,aAAAC,YAAW,WAAAC,UAAS,YAAAC,iBAAgB;AAoLrC,SAKA,OAAAC,MALA,QAAAC,aAAA;AA7ID,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAU;AAER,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAmC,oBAAI,IAAI,CAAC;AAChF,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA8B,oBAAI,IAAI,CAAC;AAC7E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AACrE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAEhD,EAAAC,WAAU,MAAM;AACd,QAAI,kBAAkB,YAAY,kBAAkB,eAAe;AACjE,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,qBAAqBC,SAAQ,MAAM;AACvC,QAAI,EAAE,YAAY,aAAa;AAC7B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,oBAAI,IAAyB;AACpD,UAAM,kBAAkB,oBAAI,IAAoB;AAChD,UAAM,kBAAkB,oBAAI,IAAY;AAExC,eAAW,CAAC,aAAa,aAAa,KAAK,OAAO,QAAQ,WAAW,UAAU,GAAG;AAChF,qBAAe,IAAI,OAAO,WAAW,GAAG,IAAI,IAAI,aAAa,CAAC;AAAA,IAChE;AAEA,eAAW,CAAC,aAAa,IAAI,KAAK,OAAO,QAAQ,WAAW,MAAM,GAAG;AACnE,YAAM,OAAO,OAAO,WAAW;AAC/B,sBAAgB,IAAI,MAAM,IAAI;AAC9B,sBAAgB,IAAI,IAAI;AAAA,IAC1B;AAEA,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,aAAa,YAAY,WAAW,CAAC;AAE/D,QAAM,oBAAoB,mBAAmB;AAC7C,QAAM,qBAAqB,mBAAmB;AAC9C,QAAM,qBAAqB,mBAAmB;AAE9C,QAAM,eAAe,CAAC,MAAc,QAAgB,UAAmB;AACrE,QAAI,YAAY,UAAW;AAC3B,kBAAc,CAAC,SAAS;AACtB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAM,UAAU,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC;AAC5C,UAAI,OAAO;AACT,YAAI,QAAQ,IAAI,MAAM,EAAG,SAAQ,OAAO,MAAM;AAAA,YACzC,SAAQ,IAAI,MAAM;AAAA,MACzB,OAAO;AACL,gBAAQ,MAAM;AACd,gBAAQ,IAAI,MAAM;AAAA,MACpB;AACA,WAAK,IAAI,MAAM,OAAO;AACtB,aAAO;AAAA,IACT,CAAC;AAED,mBAAe,CAAC,SAAS;AACvB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,IAAI;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,oBAAoB,CAAC,SAAiB;AAC1C,QAAI,YAAY,UAAW;AAC3B,kBAAc,CAAC,SAAS;AACtB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,IAAI;AAChB,aAAO;AAAA,IACT,CAAC;AACD,mBAAe,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,EAClD;AAEA,QAAM,gBAAgB,CAAC,MAAc,SAAiB;AACpD,QAAI,YAAY,UAAW;AAC3B,mBAAe,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,IAAI,MAAM,IAAI,CAAC;AAAA,EACxD;AAEA,QAAM,YAAY,CAAC,SAAgC;AACjD,UAAM,IAAI,KAAK,UAAU,IAAI;AAC7B,QAAI,YAAY,IAAI,IAAI,GAAG;AACzB,YAAM,QAAQ,YAAY,IAAI,IAAI,KAAK,IAAI,KAAK;AAChD,aAAO,QAAQ;AAAA,IACjB;AACA,UAAM,MAAM,WAAW,IAAI,IAAI;AAC/B,QAAI,CAAC,OAAO,IAAI,SAAS,EAAG,QAAO;AACnC,WAAO,CAAC,GAAG,GAAG,EACX,KAAK,EACL,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,EAC7B,KAAK,IAAI;AAAA,EACd;AAEA,QAAM,cAAc,KAAK,UAAU,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,MAAM,IAAI;AAExE,QAAM,eAAe,MAAM;AACzB,QAAI,YAAY,aAAa,CAAC,eAAe,CAAC,SAAU;AAExD,UAAM,iBAAoC;AAAA,MACxC,YAAY,OAAO;AAAA,QACjB,MAAM,KAAK,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,aAAa,MAAM;AAAA,UAC9D;AAAA,UACA,MAAM,KAAK,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,OAAO;AAAA,QACb,MAAM,KAAK,WAAW,EACnB,IAAI,CAAC,SAAS,CAAC,OAAO,YAAY,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,CAAU,EACnE,OAAO,CAAC,CAAC,EAAEC,KAAI,MAAMA,MAAK,SAAS,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,KAAK,EAAE,QAAQ,OAAO,UAAU,CAAC,CAAC,EAAE;AAC/E,UAAM,OAAO;AAAA,EAAuB,MAAM,KAAK,IAAI,CAAC;AACpD,iBAAa,IAAI;AACjB,aAAS,MAAM,YAAY,cAAc;AAAA,EAC3C;AAEA,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,WACI,mFACA;AAAA,MACN;AAAA,MAEC;AAAA,aAAK,aAAa,eACjB,gBAAAA,MAAC,SAAI,WAAU,gGAA+F;AAAA;AAAA,UACtG,KAAK,YAAY;AAAA,UAAY;AAAA,WACrC;AAAA,QAED,KAAK,UAAU,IAAI,CAAC,GAAG,SACtB,gBAAAD;AAAA,UAAC;AAAA;AAAA,YAEC,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,UAAU,kBAAkB,IAAI,IAAI,KAAK,oBAAI,IAAI;AAAA,YACjD,UAAU,mBAAmB,IAAI,IAAI;AAAA,YACrC,YAAY,mBAAmB,IAAI,IAAI,KAAK;AAAA,YAC5C,UAAU;AAAA,YACV,eAAe;AAAA,YACf,gBAAgB;AAAA;AAAA,UATX,EAAE;AAAA,QAUT,CACD;AAAA,QAEA,CAAC,YAAY,CAAC,aAAa,YAC1B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,CAAC;AAAA,YACX,WAAU;AAAA,YAET,wBAAc,iBAAO;AAAA;AAAA,QACxB;AAAA,QAGD,aAAa,CAAC,YACb,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAQ;AAAA,YACR,WAAU;AAAA,YAEV;AAAA,8BAAAD,KAAC,WAAQ,MAAM,IAAI,WAAU,gBAAe;AAAA,cAAE;AAAA;AAAA;AAAA,QAEhD;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,QAAQ,SAAS,eAAe;AAEtC,SACE,gBAAAC,MAAC,SACC;AAAA,oBAAAA,MAAC,SAAI,WAAW,GAAG,0BAA0B,WAAW,SAAS,MAAM,GACrE;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,WAAW,KAAK;AAAA,UACtB,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,WAAW,YAAY;AAAA,UACzB;AAAA,UAEA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,WAAW,YAAY;AAAA,cACzB;AAAA,cACA,UAAU,EAAE,MAAM,KAAK;AAAA,cAEtB,mBAAS;AAAA;AAAA,UACZ;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAW,GAAG,sBAAsB,WAAW,UAAU,SAAS,GACpE;AAAA,eAAS,QAAQ,IAAI,CAAC,KAAK,WAAW;AACrC,cAAM,QAAQ,SAAS,IAAI,MAAM;AACjC,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,YAC3C,WAAW;AAAA,cACT;AAAA,cACA,WAAW,kBAAkB;AAAA,cAC7B,SAAS,CAAC,WACN,oGACA,QACE,kGACA;AAAA,cACN,CAAC,YAAY,CAAC,SAAS;AAAA,cACvB,YAAY;AAAA,YACd;AAAA,YAEC;AAAA,uBACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,SAAS,CAAC,WACN,wFACA,QACE,oEACF;AAAA,kBACN;AAAA,kBAEC,mBACC,gBAAAA;AAAA,oBAACM;AAAA,oBAAA;AAAA,sBACC,MAAM;AAAA,sBACN,WACE,WACI,+BACA;AAAA;AAAA,kBAER;AAAA;AAAA,cAEJ;AAAA,cAEF,gBAAAL,MAAC,SAAI,WAAU,WACb;AAAA,gCAAAD,KAAC,SAAI,WAAW,GAAG,eAAe,WAAW,YAAY,aAAa,GACnE,cAAI,OACP;AAAA,gBACC,IAAI,eACH,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,WAAW,gBAAgB;AAAA,sBAC3B,SAAS,CAAC,WAAW,eAAe;AAAA,oBACtC;AAAA,oBAEC,cAAI;AAAA;AAAA,gBACP;AAAA,iBAEJ;AAAA;AAAA;AAAA,UAtDK,IAAI;AAAA,QAuDX;AAAA,MAEJ,CAAC;AAAA,MAGA,YAAY,CAAC,WAAW,OACvB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,WAAW,kBAAkB;AAAA,YAC7B,WACI,0DACA;AAAA,YACJ,YAAY;AAAA,UACd;AAAA,UAEA;AAAA,4BAAAD,KAAC,UAAK,WAAU,wDAAuD,gCAAG;AAAA,YAC1E,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,UAAU,CAAC,MAAM,eAAe,MAAM,EAAE,OAAO,KAAK;AAAA,gBACpD,SAAS,MAAM,cAAc,IAAI;AAAA,gBACjC,cAAW;AAAA,gBACX,aAAY;AAAA,gBACZ,WAAW;AAAA,kBACT;AAAA,kBACA,WAAW,YAAY;AAAA,gBACzB;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,KACF;AAEJ;AAEO,SAAS,qBACd,YAC4B;AAC5B,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,UAAU;AACpC,QAAI,YAAY,QAAQ;AAExB,QAAI,OAAO,cAAc,UAAU;AACjC,UAAI;AACF,oBAAY,KAAK,MAAM,SAAS;AAAA,MAClC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,MAAM,QAAQ,SAAS,KAAK,UAAU,MAAM,cAAc,GAAG;AAC/D,aAAO,EAAE,GAAG,QAAQ,UAAU;AAAA,IAChC;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuC;AAC7D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,WAAY,MAAiC;AACnD,QAAM,UAAW,MAAgC;AACjD,SAAO,OAAO,aAAa,YAAY,MAAM,QAAQ,OAAO,KAAK,QAAQ,MAAM,YAAY;AAC7F;AAEA,SAAS,aAAa,OAAqC;AACzD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,SAAS;AACf,SAAO,OAAO,OAAO,UAAU,YAAY,OAAO,OAAO,gBAAgB;AAC3E;;;ACrZA,SAAS,YAAY;AAyBrB,SAAS,iBAAiB,OAAiC;AACzD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEA,SAAS,WAAW,OAAmC;AACrD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,OAAO;AACb,MAAI,CAAC,iBAAiB,KAAK,KAAK,EAAG,QAAO;AAC1C,MAAI,WAAW,QAAQ,KAAK,UAAU,UAAa,CAAC,iBAAiB,KAAK,KAAK,EAAG,QAAO;AACzF,MAAI,cAAc,QAAQ,CAAC,MAAM,QAAQ,KAAK,QAAQ,EAAG,QAAO;AAEhE,QAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AACjE,MAAI,SAAS,SAAS,KAAK,CAAC,iBAAiB,KAAK,KAAK,EAAG,QAAO;AACjE,SAAO,SAAS,MAAM,CAAC,UAAU,WAAW,KAAK,CAAC;AACpD;AAEA,SAAS,eAAe,OAAuC;AAC7D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,MAAM;AACZ,MAAI,CAAC,iBAAiB,IAAI,KAAK,KAAK,CAAC,iBAAiB,IAAI,SAAS,EAAG,QAAO;AAC7E,MAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,MAAM,WAAW,EAAG,QAAO;AAChE,MAAI,CAAC,IAAI,MAAM,MAAM,CAAC,SAAS,WAAW,IAAI,CAAC,EAAG,QAAO;AACzD,MAAI,WAAW,KAAK;AAClB,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAG,QAAO;AACtC,QAAI,CAAC,IAAI,MAAM,MAAM,CAAC,SAAS,iBAAiB,IAAI,CAAC,EAAG,QAAO;AAAA,EACjE;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAwB;AACpD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAM,MAAM;AACZ,MAAI,CAAC,iBAAiB,IAAI,KAAK,EAAG,QAAO;AACzC,MAAI,CAAC,iBAAiB,IAAI,SAAS,EAAG,QAAO;AAC7C,MAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,MAAM,WAAW,EAAG,QAAO;AAChE,MAAI,CAAC,IAAI,MAAM,MAAM,CAAC,SAAS,WAAW,IAAI,CAAC,GAAG;AAChD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK;AAClB,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,SAAS,iBAAiB,IAAI,CAAC,GAAG;AACnF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAoC;AACxD,MAAI,CAAC,iBAAiB,KAAK,EAAG,QAAO;AACrC,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,SAAO,eAAe,aAAa,eAAe,aAAa,eAAe,UAAU,eAAe,WACnG,aACA;AACN;AAMO,SAAS,sBAAsB,MAAgB,UAAmC;AACvF,QAAM,aAAa,SAAS,KAAK,EAAE,KAAK,KAAK;AAC7C,QAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AACjE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,UAAU,SAAS,IAAI,CAAC,UAAU,sBAAsB,OAAO,QAAQ,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,oBAAoB,SAAmC;AACrE,MAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,WAAO,EAAE,MAAM,MAAM,OAAO,KAAK;AAAA,EACnC;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,OAAO;AAAA,EACvB,SAAS,OAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,iBAAiB,QAAQ,gDAAuB,MAAM,OAAO,KAAK;AAAA,IAC3E;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,WAAO,EAAE,MAAM,MAAM,OAAO,qBAAqB,MAAM,EAAE;AAAA,EAC3D;AAEA,QAAM,aAAa,CAAC,MAAgB,OAAe,eAAiC;AAClF,UAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AACjE,WAAO;AAAA,MACL,IAAI,iBAAiB,KAAK,EAAE,IAAI,KAAK,GAAG,KAAK,IAAI;AAAA,MACjD,OAAO,KAAK,MAAM,KAAK;AAAA,MACvB,UAAU,iBAAiB,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,MAC7D,QAAQ,aAAa,KAAK,MAAM;AAAA,MAChC,UAAU,SAAS,IAAI,CAAC,OAAO,UAAU,WAAW,OAAO,QAAQ,GAAG,GAAG,UAAU,IAAI,QAAQ,CAAC,EAAE,CAAC;AAAA,MACnG;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAiB;AAAA,IACrB,IAAI;AAAA,IACJ,OAAO,OAAO,MAAM,KAAK;AAAA,IACzB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU,OAAO,MAAM,IAAI,CAAC,MAAM,UAAU,WAAW,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC/E,OAAO;AAAA,EACT;AAEA,QAAM,QAAQ,CAAC,OAAO,UAAU,KAAK,GAAG,IAAI,OAAO,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;AAE1F,SAAO,EAAE,MAAM,EAAE,MAAM,MAAM,GAAG,OAAO,KAAK;AAC9C;;;ACpIA,SAAS,eAAe,QAAgC;AACtD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAO;AACT;AAEA,IAAM,cAAc,oBAAI,IAAI,CAAC,mBAAmB,cAAc,CAAC;AAC/D,IAAM,kBAAkB,oBAAI,IAAI,CAAC,MAAM,CAAC;AACxC,IAAM,mBAAmB,oBAAI,IAAI,CAAC,OAAO,CAAC;AAC1C,IAAM,kBAAkB,oBAAI,IAAI,CAAC,MAAM,CAAC;AAExC,SAAS,WAAW,SAA0E;AAC5F,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAQ,aAAa,YAAY,QAAQ,UAAU;AAC5D,WAAO,QAAQ;AAAA,EACjB;AACA,MAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,MAAM;AACpD,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,oBACP,SACoB;AACpB,MAAI,CAAC,WAAW,OAAO,QAAQ,iBAAiB,UAAU;AACxD,WAAO;AAAA,EACT;AACA,QAAM,cAAc,QAAQ,aAAa,KAAK;AAC9C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,WAAW,OAAO;AAClC,SAAO,gBAAgB,UAAU,SAAY;AAC/C;AAEA,SAAS,gBAAgB,SAA2D;AAClF,MAAI,QAAQ,SAAS,iBAAiB,OAAO,QAAQ,YAAY,UAAU;AACzE,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,QAAQ,OAAO;AACzC,QAAI,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,UAAU;AACpE,aAAO,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG;AAAA,IAC5C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,SAAS,0BAA0B,SAA+B;AAChE,MAAI,QAAQ,SAAS,oBAAoB,QAAQ,SAAS,iBAAiB;AACzE,WAAO;AAAA,EACT;AACA,QAAM,aAAa,gBAAgB,OAAO;AAC1C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,SAAO,WAAW,OAAO,cAAc,WAAW,SAAS;AAC7D;AAUO,SAAS,kBAAkB,aAAsC;AACtE,QAAM,WAAW,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC;AAE7D,MAAI,SAAS;AACb,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,IAAI,WAAY;AACrB,UAAM,WAAW,IAAI,WAAW;AAAA,MAC9B,CAAC,OAAO,GAAG,SAAS,mBAAmB,GAAG,SAAS;AAAA,IACrD;AACA,QAAI,UAAU;AACZ,UAAI;AACF,iBAAS,KAAK,MAAM,SAAS,SAAS,EAAE,SAAS;AAAA,MACnD,QAAQ;AAAA,MAAC;AACT,UAAI,OAAQ;AAAA,IACd;AAAA,EACF;AAEA,QAAM,cAAc,SAAS;AAAA,IAC3B,CAAC,YAAY,CAAC,0BAA0B,OAAO;AAAA,EACjD;AACA,QAAM,gBAA6B,CAAC;AACpC,QAAM,YAAY,oBAAI,IAAuB;AAC7C,QAAM,iBAA8B,CAAC;AACrC,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,eAAyC,CAAC;AAChD,QAAM,YAAmC,CAAC;AAC1C,MAAI,gBAA2C;AAC/C,MAAI,cAAc;AAClB,MAAI,sBAAsB;AAC1B,MAAI,iBAAgC,CAAC;AAErC,QAAM,iBAAiB,CAAC,aAAsB,aAAqB;AACjE,QAAI,OAAO,gBAAgB,YAAY,CAAC,YAAY,KAAK,GAAG;AAC1D;AAAA,IACF;AACA,QAAI,WAAW,qBAAqB;AAClC;AAAA,IACF;AACA,kBAAc;AACd,0BAAsB;AAAA,EACxB;AAEA,QAAM,gBAAgB,CAAC,SAAkC;AACvD,UAAM,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAC1E,UAAM,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAC1E,QAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY,SAAS,SAAS,GAAG;AAClE;AAAA,IACF;AACA,kBAAc,YAAY,QAAQ,WAAW,SAAS;AAAA,EACxD;AAEA,QAAM,uBAAuB,CAAC,QAAqB;AACjD,QAAI,IAAI,SAAS,cAAe;AAChC,QAAI,OAAO,IAAI,YAAY,YAAY,CAAC,IAAI,QAAQ,KAAK,EAAG;AAC5D,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,IAAI,OAAO;AACnC,qBAAe,KAAK,WAAW,CAAC;AAChC,UAAI,KAAK,YAAY,OAAO,KAAK,aAAa,YAAY,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACvF,yBAAiB,OAAO;AAAA,UACtB,OAAO,QAAQ,KAAK,QAAQ,EACzB,OAAO,CAAC,UAAqC,OAAO,MAAM,CAAC,MAAM,YAAY,OAAO,MAAM,CAAC,MAAM,QAAQ,EACzG,IAAI,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,QAAQ,oBAAoB,MAAM,CAAC,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,aAAW,OAAO,aAAa;AAC7B,yBAAqB,GAAG;AACxB,QAAI,CAAC,IAAI,WAAY;AACrB,eAAW,MAAM,IAAI,YAAY;AAC/B,WAAK,GAAG,SAAS,mBAAmB,GAAG,SAAS,mBAAmB,eAAe,GAAG,MAAM,GAAG;AAC5F,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,eAAe,GAAG,MAAM,CAAE;AACpD,gBAAM,UAMJ,MAAM,QAAQ,MAAM,IAAI,SAAS,MAAM,QAAQ,QAAQ,OAAO,IAAI,OAAO,UAAU,CAAC;AACtF,qBAAW,KAAK,SAAS;AACvB,kBAAM,UAAU,WAAW,CAAC;AAC5B,gBAAI,CAAC,WAAW,UAAU,IAAI,OAAO,EAAG;AACxC,kBAAM,QAAmB;AAAA,cACvB;AAAA,cACA,aAAa,oBAAoB,CAAC;AAAA,cAClC,aAAa,EAAE,eAAe;AAAA,YAChC;AACA,sBAAU,IAAI,SAAS,KAAK;AAC5B,0BAAc,KAAK,KAAK;AAAA,UAC1B;AAAA,QACF,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,WACG,GAAG,SAAS,uBAAuB,GAAG,SAAS,sBAChD,eAAe,GAAG,MAAM,GACxB;AACA,YAAI;AACF,gBAAM,OAAO,KAAK,MAAM,eAAe,GAAG,MAAM,CAAE;AAOlD,gBAAM,UAAU,WAAW,IAAI;AAC/B,cAAI,CAAC,WAAW,YAAY,IAAI,OAAO,EAAG;AAC1C,cAAI,WAAW,UAAU,IAAI,OAAO;AACpC,cAAI,CAAC,UAAU;AAEb,uBAAW;AAAA,cACT;AAAA,cACA,aAAa,oBAAoB,IAAI;AAAA,cACrC,aAAa,KAAK,eAAe;AAAA,YACnC;AACA,sBAAU,IAAI,SAAS,QAAQ;AAC/B,0BAAc,KAAK,QAAQ;AAAA,UAC7B;AACA,mBAAS,gBAAgB,oBAAoB,IAAI;AACjD,mBAAS,UAAU,KAAK;AACxB,mBAAS,aAAa,YAAY,KAAK,WAAW,EAAE;AACpD,yBAAe,KAAK,QAAQ;AAC5B,sBAAY,IAAI,OAAO;AAAA,QACzB,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,UAAI,GAAG,SAAS,qBAAqB,eAAe,GAAG,MAAM,GAAG;AAC9D,cAAM,OAAO,qBAAqB,eAAe,GAAG,MAAM,CAAC;AAC3D,YAAI,MAAM;AACR,uBAAa,KAAK,EAAE,YAAY,GAAG,IAAI,KAAK,CAAC;AAAA,QAC/C;AAAA,MACF;AACA,UAAI,gBAAgB,IAAI,GAAG,IAAI,KAAK,GAAG,WAAW;AAChD,YAAI;AACF,gBAAM,OAAO,KAAK,MAAM,GAAG,SAAS;AACpC,cAAI,OAAO,KAAK,cAAc,YAAY,KAAK,WAAW;AACxD,sBAAU,KAAK,EAAE,MAAM,KAAK,WAAW,QAAQ,GAAG,UAAU,OAAO,CAAC;AAAA,UACtE;AAAA,QACF,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,UACE,iBAAiB,IAAI,GAAG,IAAI,KAC5B,GAAG,aACH,GAAG,WAAW,UACd,EAAE,OAAO,GAAG,WAAW,YAAY,GAAG,OAAO,WAAW,cAAI,IAC5D;AACA,YAAI;AACF,gBAAM,OAAO,KAAK,MAAM,GAAG,SAAS;AAIpC,cACE,OAAO,KAAK,cAAc,aACzB,KAAK,cAAc,eAAe,KAAK,UAAU,SAAS,YAAY,MACvE,OAAO,KAAK,YAAY,UACxB;AACA,2BAAe,KAAK,SAAS,CAAC;AAAA,UAChC;AAAA,QACF,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,UACE,gBAAgB,IAAI,GAAG,IAAI,KAC3B,GAAG,aACH,GAAG,WAAW,UACd,EAAE,OAAO,GAAG,WAAW,YAAY,GAAG,OAAO,WAAW,cAAI,IAC5D;AACA,YAAI;AACF,gBAAM,OAAO,KAAK,MAAM,GAAG,SAAS;AAKpC,cACE,OAAO,KAAK,cAAc,aACzB,KAAK,cAAc,eAAe,KAAK,UAAU,SAAS,YAAY,IACvE;AACA,0BAAc,IAA+B;AAAA,UAC/C;AAAA,QACF,QAAQ;AAAA,QAAC;AAAA,MACX;AAIA,UAAI,YAAY,IAAI,GAAG,IAAI,KAAK,GAAG,WAAW,QAAQ;AACpD,wBAAgB,GAAG;AAAA,MACrB;AACA,UAAI,GAAG,SAAS,kBAAkB,eAAe,GAAG,MAAM,GAAG;AAC3D,YAAI;AACF,gBAAM,OAAO,KAAK,MAAM,eAAe,GAAG,MAAM,CAAE;AAClD,yBAAe,KAAK,MAAM,CAAC;AAAA,QAC7B,QAAQ;AAAA,QAAC;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,YAAY,OAAO,WAAW,IAAI,oBAAoB,WAAW;AAC/E,QAAM,OACJ,cAAc,OACV,OACA;AAAA,IACE,GAAG;AAAA,IACH,MAAM,sBAAsB,WAAW,MAAM,cAAc;AAAA,EAC7D;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,YAAY,KAAK,EAAE,SAAS;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAA0D;AACrF,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,SAAO,eAAe,aAAa,eAAe,UAAU,eAAe,WACvE,aACA;AACN;AAEA,SAAS,YAAY,SAA2B;AAC9C,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,OAAiB,CAAC;AACxB,aAAW,KAAK,QAAQ,SAAS,mBAAmB,GAAG;AACrD,UAAM,MAAM,EAAE,CAAC,EAAE,KAAK;AACtB,QAAI,OAAO,CAAC,KAAK,IAAI,GAAG,GAAG;AACzB,WAAK,IAAI,GAAG;AACZ,WAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;;;ACrTA,SAAS,cAAc,cAAc,YAAY,MAAM,gBAAgB;AACvE,SAAS,WAAAO,UAAS,YAAAC,iBAAgB;AAmDtB,SASI,YAAAC,WARF,OAAAC,MADF,QAAAC,aAAA;AAjCL,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,OAAOC,SAAQ,MAAM,kBAAkB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAClE,QAAM,sBAAsB,WAAW,CAAC,UAAU,MAAM,mBAAmB;AAC3E,QAAM,mBAAmB,WAAW,CAAC,UAAU,MAAM,gBAAgB;AACrE,QAAM,oBAAoB,WAAW,CAAC,UAAU,MAAM,iBAAiB;AACvE,QAAM,eAAeA,SAAQ,MAAM,gBAAgB,MAAM,aAAa,GAAG,CAAC,MAAM,aAAa,CAAC;AAC9F,QAAM,YAAYA,SAAQ,MAAM,eAAe,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;AACtE,QAAM,oBAAoB,kBAAkB;AAC5C,QAAM,aACJ,QAAQ,aAAa,KACrB,qBACA,KAAK,kBAAkB;AAEzB,QAAM,gBAAgB,MAAM;AAC1B,QAAI,qBAAqB;AACvB,uBAAiB;AAAA,IACnB;AACA,sBAAkB,WAAW;AAAA,EAC/B;AAEA,SACE,gBAAAD,MAAC,SAAI,WAAU,4GACb;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QAEV;AAAA,0BAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,qBACb;AAAA,8BAAAA,MAAC,SAAI,WAAU,uEACb;AAAA,gCAAAD,KAAC,YAAS,MAAM,IAAI;AAAA,gBACpB,gBAAAA,KAAC,UAAK,sCAAI;AAAA,iBACZ;AAAA,cACA,gBAAAA,KAAC,SAAI,WAAU,gEACZ,eAAK,UAAU,4BAClB;AAAA,cACA,gBAAAA,KAAC,SAAI,WAAU,6CACZ,uBAAa,SAAS,aACrB,gBAAAC,MAAAF,WAAA,EACE;AAAA,gCAAAC,KAAC,UAAK,WAAU,kFACb,uBAAa,OAChB;AAAA,gBACA,gBAAAA,KAAC,UAAK,WAAU,mEACb,uBAAa,MAChB;AAAA,iBACF,IAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,aAAa,SAAS,cACpB;AAAA,oBACF,aAAa,SAAS,YACpB;AAAA,oBACF,aAAa,SAAS,iBAAiB;AAAA,kBACzC;AAAA,kBAEC,uBAAa;AAAA;AAAA,cAChB,GAEJ;AAAA,eACF;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,WAAU;AAAA,gBACV,eAAY;AAAA;AAAA,YACd;AAAA,aACF;AAAA,UAEC,aAAa,SAAS,cACrB,gBAAAC,MAAC,SAAI,WAAU,iFACb;AAAA,4BAAAA,MAAC,UAAK,WAAU,+DACb;AAAA,mBAAK,eAAe;AAAA,cAAO;AAAA,eAC9B;AAAA,YACA,gBAAAA,MAAC,UAAK,WAAU,+DACb;AAAA;AAAA,cAAU;AAAA,eACb;AAAA,YACA,gBAAAA,MAAC,UAAK,WAAU,sEACd;AAAA,8BAAAD,KAAC,gBAAa,MAAM,IAAI;AAAA,cAAE;AAAA,eAE5B;AAAA,aACF;AAAA;AAAA;AAAA,IAEJ;AAAA,IAEC,cAAc,gBAAAA,KAAC,yBAAsB,eAA8B;AAAA,KACtE;AAEJ;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AACF,GAEG;AACD,QAAM,CAAC,WAAW,YAAY,IAAIG,UAAS,KAAK;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,EAAE;AAEnD,QAAM,iBAAiB,MAAM;AAC3B,UAAM,UAAU,aAAa,KAAK;AAClC,QAAI,CAAC,QAAS;AACd,oBAAgB,UAAU,OAAO;AACjC,oBAAgB,EAAE;AAClB,iBAAa,KAAK;AAAA,EACpB;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAU,gGACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,wBACb;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,gBAAgB,SAAS;AAAA,UACxC,WAAU;AAAA,UAEV;AAAA,4BAAAD,KAAC,QAAK,MAAM,IAAI;AAAA,YAAE;AAAA;AAAA;AAAA,MAEpB;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,CAAC,UAAU,CAAC,KAAK;AAAA,UAC7C,WAAU;AAAA,UAEV;AAAA,4BAAAD,KAAC,cAAW,MAAM,IAAI;AAAA,YAAE;AAAA;AAAA;AAAA,MAE1B;AAAA,OACF;AAAA,IAEC,aACC,gBAAAC,MAAC,SAAI,WAAU,aACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,UAAU,gBAAgB,MAAM,OAAO,KAAK;AAAA,UACvD,aAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAU,oBACb,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU,CAAC,aAAa,KAAK;AAAA,UAC7B,SAAS;AAAA,UACT,WAAU;AAAA,UACX;AAAA;AAAA,MAED,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,gBACP,MACA,eACc;AACd,MAAI,kBAAkB,UAAU;AAC9B,WAAO,EAAE,MAAM,UAAU,OAAO,eAAK;AAAA,EACvC;AACA,MAAI,kBAAkB,eAAe;AACnC,WAAO,EAAE,MAAM,eAAe,OAAO,qBAAM;AAAA,EAC7C;AACA,MAAI,KAAK,YAAY;AACnB,WAAO,EAAE,MAAM,UAAU,OAAO,2BAAO;AAAA,EACzC;AACA,MAAI,KAAK,kBAAkB,KAAK,QAAQ,MAAM;AAC5C,WAAO,EAAE,MAAM,YAAY,OAAO,qBAAM;AAAA,EAC1C;AACA,MAAI,KAAK,eAAe,SAAS,GAAG;AAClC,WAAO,EAAE,MAAM,YAAY,OAAO,kCAAS,MAAM,qBAAM;AAAA,EACzD;AACA,MAAI,KAAK,cAAc,SAAS,GAAG;AACjC,WAAO,EAAE,MAAM,YAAY,OAAO,kCAAS,MAAM,qBAAM;AAAA,EACzD;AACA,SAAO,EAAE,MAAM,YAAY,OAAO,kCAAS,MAAM,qBAAM;AACzD;AAEA,SAAS,eAAe,MAA4D;AAClF,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,YAAY,CAAC,SAA4E;AAC7F,UAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,WAAW,CAAC;AACjE,WAAO,IAAI,SAAS,OAAO,CAAC,OAAO,UAAU,QAAQ,UAAU,KAAK,GAAG,CAAC;AAAA,EAC1E;AAEA,MAAI,KAAK,KAAK,OAAO,aAAa;AAChC,UAAM,WAAW,MAAM,QAAQ,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,WAAW,CAAC;AAC3E,WAAO,SAAS,OAAO,CAAC,OAAO,UAAU,QAAQ,UAAU,KAAK,GAAG,CAAC;AAAA,EACtE;AAEA,SAAO,UAAU,KAAK,IAAI;AAC5B;;;ACnNA,SAASI,iBAAgB,SAA2D;AAClF,MAAI,QAAQ,SAAS,iBAAiB,OAAO,QAAQ,YAAY,UAAU;AACzE,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,QAAQ,OAAO;AACzC,QAAI,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,UAAU;AACpE,aAAO,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG;AAAA,IAC5C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,SAAS,gBAAgB,SAA+B;AACtD,MAAI,QAAQ,SAAS,kBAAkB;AACrC,WAAO;AAAA,EACT;AACA,QAAM,aAAaA,iBAAgB,OAAO;AAC1C,SAAO,YAAY,OAAO;AAC5B;AAEA,SAAS,eAAe,SAA+B;AACrD,MAAI,QAAQ,SAAS,iBAAiB;AACpC,WAAO;AAAA,EACT;AACA,QAAM,aAAaA,iBAAgB,OAAO;AAC1C,SAAO,YAAY,SAAS;AAC9B;AAEO,SAAS,0BAA0B,UAAwC;AAChF,QAAM,eAAe,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC;AAC3D,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,WAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AACpD,UAAM,UAAU,aAAa,CAAC;AAC9B,QAAI,eAAe,OAAO,KAAK,cAAc,IAAI;AAC/C,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,gBAAgB,OAAO,GAAG;AAC5B,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,IAAI;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,aACJ,MAAM,aAAa,CAAC,EACpB,OAAO,CAAC,SAAS,WAAW;AAC3B,UAAM,gBAAgB,aAAa,IAAI;AACvC,QAAI,gBAAgB,OAAO,KAAK,eAAe,OAAO,GAAG;AACvD,aAAO;AAAA,IACT;AACA,QAAI,cAAc,MAAM,gBAAgB,WAAW;AACjD,aAAO,QAAQ,SAAS;AAAA,IAC1B;AACA,WAAO;AAAA,EACT,CAAC;AACL;","names":["jsx","jsx","jsxs","jsx","useEffect","useMemo","useState","jsx","jsxs","useState","useEffect","useMemo","Check","useEffect","useMemo","useState","jsx","jsxs","useState","useEffect","useMemo","text","Check","useMemo","useState","Fragment","jsx","jsxs","useMemo","useState","parseModeChange"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|