@blade-hq/agent-kit 0.4.5 → 0.4.7

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.
Files changed (52) hide show
  1. package/README.md +39 -1
  2. package/dist/{SkillStatusBar-DItrW2vv.d.ts → SkillStatusBar-DQyipdzn.d.ts} +112 -8
  3. package/dist/chunk-2UP7MG3J.js +66 -0
  4. package/dist/chunk-2UP7MG3J.js.map +1 -0
  5. package/dist/chunk-4VWLTG5L.js +2984 -0
  6. package/dist/chunk-4VWLTG5L.js.map +1 -0
  7. package/dist/chunk-7LEKQI47.js +32 -0
  8. package/dist/chunk-7LEKQI47.js.map +1 -0
  9. package/dist/chunk-CGOQI7ZL.js +8124 -0
  10. package/dist/chunk-CGOQI7ZL.js.map +1 -0
  11. package/dist/chunk-DQCXSPHP.js +33 -0
  12. package/dist/chunk-DQCXSPHP.js.map +1 -0
  13. package/dist/chunk-I3FFV63W.js +30 -0
  14. package/dist/chunk-I3FFV63W.js.map +1 -0
  15. package/dist/chunk-J3XVFPOV.js +58 -0
  16. package/dist/chunk-J3XVFPOV.js.map +1 -0
  17. package/dist/chunk-JCJFFJ42.js +39 -0
  18. package/dist/chunk-JCJFFJ42.js.map +1 -0
  19. package/dist/chunk-OKQWPNE3.js +1077 -0
  20. package/dist/chunk-OKQWPNE3.js.map +1 -0
  21. package/dist/chunk-PZ5AY32C.js +10 -0
  22. package/dist/chunk-PZ5AY32C.js.map +1 -0
  23. package/dist/chunk-TC5BBLWO.js +29 -0
  24. package/dist/chunk-TC5BBLWO.js.map +1 -0
  25. package/dist/chunk-VD4CKRMT.js +127 -0
  26. package/dist/chunk-VD4CKRMT.js.map +1 -0
  27. package/dist/chunk-X6MEYCU7.js +1401 -0
  28. package/dist/chunk-X6MEYCU7.js.map +1 -0
  29. package/dist/client/index.js +24 -1052
  30. package/dist/client/index.js.map +1 -1
  31. package/dist/react/api/licenses.js +11 -1470
  32. package/dist/react/api/licenses.js.map +1 -1
  33. package/dist/react/api/vibe-coding.js +25 -1481
  34. package/dist/react/api/vibe-coding.js.map +1 -1
  35. package/dist/react/cards/register.js +45 -138
  36. package/dist/react/cards/register.js.map +1 -1
  37. package/dist/react/components/chat/index.d.ts +7 -21
  38. package/dist/react/components/chat/index.js +28 -11366
  39. package/dist/react/components/chat/index.js.map +1 -1
  40. package/dist/react/components/plan/index.js +135 -3054
  41. package/dist/react/components/plan/index.js.map +1 -1
  42. package/dist/react/components/session/index.js +21 -1499
  43. package/dist/react/components/session/index.js.map +1 -1
  44. package/dist/react/components/workspace/index.js +116 -1715
  45. package/dist/react/components/workspace/index.js.map +1 -1
  46. package/dist/react/devtools/bridge-devtools/index.js +8 -51
  47. package/dist/react/devtools/bridge-devtools/index.js.map +1 -1
  48. package/dist/react/index.d.ts +2 -2
  49. package/dist/react/index.js +625 -14035
  50. package/dist/react/index.js.map +1 -1
  51. package/dist/style.css +1 -1
  52. package/package.json +1 -1
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ export {
8
+ __export
9
+ };
10
+ //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,29 @@
1
+ import {
2
+ getClient
3
+ } from "./chunk-4VWLTG5L.js";
4
+ import {
5
+ __export
6
+ } from "./chunk-PZ5AY32C.js";
7
+
8
+ // src/react/api/licenses.ts
9
+ var licenses_exports = {};
10
+ __export(licenses_exports, {
11
+ getDeviceUuid: () => getDeviceUuid,
12
+ getLicenseStatus: () => getLicenseStatus,
13
+ uploadLicense: () => uploadLicense,
14
+ validateLicense: () => validateLicense
15
+ });
16
+ var r = () => getClient().licenses;
17
+ var getDeviceUuid = (...args) => r().getDeviceUuid(...args);
18
+ var validateLicense = (...args) => r().validateLicense(...args);
19
+ var getLicenseStatus = (...args) => r().getLicenseStatus(...args);
20
+ var uploadLicense = (...args) => r().uploadLicense(...args);
21
+
22
+ export {
23
+ getDeviceUuid,
24
+ validateLicense,
25
+ getLicenseStatus,
26
+ uploadLicense,
27
+ licenses_exports
28
+ };
29
+ //# sourceMappingURL=chunk-TC5BBLWO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/api/licenses.ts"],"sourcesContent":["import type { LicensesResource } from \"../../client/resources/licenses\"\nimport { getClient } from \"./client\"\nconst r = (): LicensesResource => getClient().licenses\nexport const getDeviceUuid = (...args: Parameters<LicensesResource[\"getDeviceUuid\"]>) => r().getDeviceUuid(...args)\nexport const validateLicense = (...args: Parameters<LicensesResource[\"validateLicense\"]>) => r().validateLicense(...args)\nexport const getLicenseStatus = (...args: Parameters<LicensesResource[\"getLicenseStatus\"]>) => r().getLicenseStatus(...args)\nexport const uploadLicense = (...args: Parameters<LicensesResource[\"uploadLicense\"]>) => r().uploadLicense(...args)\n"],"mappings":";;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAM,IAAI,MAAwB,UAAU,EAAE;AACvC,IAAM,gBAAgB,IAAI,SAAwD,EAAE,EAAE,cAAc,GAAG,IAAI;AAC3G,IAAM,kBAAkB,IAAI,SAA0D,EAAE,EAAE,gBAAgB,GAAG,IAAI;AACjH,IAAM,mBAAmB,IAAI,SAA2D,EAAE,EAAE,iBAAiB,GAAG,IAAI;AACpH,IAAM,gBAAgB,IAAI,SAAwD,EAAE,EAAE,cAAc,GAAG,IAAI;","names":[]}
@@ -0,0 +1,127 @@
1
+ import {
2
+ apiFetchResponse,
3
+ getAuthedUrl
4
+ } from "./chunk-4VWLTG5L.js";
5
+
6
+ // src/react/lib/session-file-preview.ts
7
+ var IMAGE_EXTS = /* @__PURE__ */ new Set(["png", "jpg", "jpeg", "gif", "svg", "webp", "ico", "bmp"]);
8
+ var DOCX_EXTS = /* @__PURE__ */ new Set(["docx", "doc"]);
9
+ var EXCEL_EXTS = /* @__PURE__ */ new Set(["xlsx", "xls", "xlsm", "xlsb"]);
10
+ var PPT_EXTS = /* @__PURE__ */ new Set(["pptx", "ppt"]);
11
+ var CSV_EXTS = /* @__PURE__ */ new Set(["csv"]);
12
+ var MARKDOWN_EXTS = /* @__PURE__ */ new Set(["md", "markdown"]);
13
+ var HTML_EXTS = /* @__PURE__ */ new Set(["html", "htm"]);
14
+ function getExt(fileName) {
15
+ return fileName.split(".").pop()?.toLowerCase() ?? "";
16
+ }
17
+ function getDisplayFileName(filePath, fileName) {
18
+ return fileName?.trim() || filePath.split("/").pop() || filePath;
19
+ }
20
+ function getSessionFilePath(sessionId, filePath) {
21
+ return `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}`;
22
+ }
23
+ function getSessionFileDownloadUrl(sessionId, filePath) {
24
+ return getAuthedUrl(getSessionFilePath(sessionId, filePath));
25
+ }
26
+ function isTextualContentType(contentType) {
27
+ return contentType.startsWith("text/") || contentType.includes("json") || contentType.includes("xml") || contentType.includes("yaml") || contentType.includes("javascript");
28
+ }
29
+ function buildSessionBinaryPreviewTarget(sessionId, filePath, fileName) {
30
+ const resolvedFileName = getDisplayFileName(filePath, fileName);
31
+ const ext = getExt(resolvedFileName);
32
+ const filePathUrl = getSessionFilePath(sessionId, filePath);
33
+ const downloadUrl = getSessionFileDownloadUrl(sessionId, filePath);
34
+ if (IMAGE_EXTS.has(ext)) {
35
+ return { type: "image", content: downloadUrl, title: resolvedFileName, key: filePath };
36
+ }
37
+ if (ext === "pdf") {
38
+ return { type: "pdf", content: downloadUrl, title: resolvedFileName, key: filePath };
39
+ }
40
+ if (DOCX_EXTS.has(ext)) {
41
+ return { type: "docx", content: downloadUrl, title: resolvedFileName, key: filePath };
42
+ }
43
+ if (EXCEL_EXTS.has(ext)) {
44
+ return { type: "excel", content: downloadUrl, title: resolvedFileName, key: filePath };
45
+ }
46
+ if (PPT_EXTS.has(ext)) {
47
+ return {
48
+ type: "ppt",
49
+ content: filePathUrl,
50
+ sourceUrl: downloadUrl,
51
+ title: resolvedFileName,
52
+ key: filePath
53
+ };
54
+ }
55
+ return null;
56
+ }
57
+ async function resolveSessionFilePreviewTarget(sessionId, filePath, fileName) {
58
+ const resolvedFileName = getDisplayFileName(filePath, fileName);
59
+ const binaryTarget = buildSessionBinaryPreviewTarget(sessionId, filePath, resolvedFileName);
60
+ if (binaryTarget) {
61
+ return binaryTarget;
62
+ }
63
+ const downloadUrl = getSessionFileDownloadUrl(sessionId, filePath);
64
+ const res = await apiFetchResponse(getSessionFilePath(sessionId, filePath));
65
+ const contentType = (res.headers.get("content-type") ?? "").toLowerCase();
66
+ if (contentType.startsWith("video/")) {
67
+ void res.body?.cancel();
68
+ return { type: "video", content: downloadUrl, title: resolvedFileName, key: filePath };
69
+ }
70
+ if (contentType.startsWith("audio/")) {
71
+ void res.body?.cancel();
72
+ return { type: "audio", content: downloadUrl, title: resolvedFileName, key: filePath };
73
+ }
74
+ if (!isTextualContentType(contentType)) {
75
+ void res.body?.cancel();
76
+ return { type: "download", content: downloadUrl, title: resolvedFileName, key: filePath };
77
+ }
78
+ const content = await res.text();
79
+ const ext = getExt(resolvedFileName);
80
+ const type = MARKDOWN_EXTS.has(ext) ? "markdown" : CSV_EXTS.has(ext) ? "csv" : HTML_EXTS.has(ext) ? "html" : "file";
81
+ return {
82
+ type,
83
+ content,
84
+ title: resolvedFileName,
85
+ key: filePath
86
+ };
87
+ }
88
+
89
+ // src/react/components/ui/collapsible.tsx
90
+ import { Collapsible as CollapsiblePrimitive } from "radix-ui";
91
+ import { jsx } from "react/jsx-runtime";
92
+ function Collapsible({
93
+ ...props
94
+ }) {
95
+ return /* @__PURE__ */ jsx(CollapsiblePrimitive.Root, { "data-slot": "collapsible", ...props });
96
+ }
97
+ function CollapsibleTrigger({
98
+ ...props
99
+ }) {
100
+ return /* @__PURE__ */ jsx(
101
+ CollapsiblePrimitive.CollapsibleTrigger,
102
+ {
103
+ "data-slot": "collapsible-trigger",
104
+ ...props
105
+ }
106
+ );
107
+ }
108
+ function CollapsibleContent({
109
+ ...props
110
+ }) {
111
+ return /* @__PURE__ */ jsx(
112
+ CollapsiblePrimitive.CollapsibleContent,
113
+ {
114
+ "data-slot": "collapsible-content",
115
+ ...props
116
+ }
117
+ );
118
+ }
119
+
120
+ export {
121
+ buildSessionBinaryPreviewTarget,
122
+ resolveSessionFilePreviewTarget,
123
+ Collapsible,
124
+ CollapsibleTrigger,
125
+ CollapsibleContent
126
+ };
127
+ //# sourceMappingURL=chunk-VD4CKRMT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/lib/session-file-preview.ts","../src/react/components/ui/collapsible.tsx"],"sourcesContent":["import { apiFetchResponse, getAuthedUrl } from \"../api/client\"\nimport type { PreviewTarget } from \"../stores/ui-store\"\n\nconst IMAGE_EXTS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\", \"bmp\"])\nconst DOCX_EXTS = new Set([\"docx\", \"doc\"])\nconst EXCEL_EXTS = new Set([\"xlsx\", \"xls\", \"xlsm\", \"xlsb\"])\nconst PPT_EXTS = new Set([\"pptx\", \"ppt\"])\nconst CSV_EXTS = new Set([\"csv\"])\nconst MARKDOWN_EXTS = new Set([\"md\", \"markdown\"])\nconst HTML_EXTS = new Set([\"html\", \"htm\"])\n\nfunction getExt(fileName: string): string {\n return fileName.split(\".\").pop()?.toLowerCase() ?? \"\"\n}\n\nfunction getDisplayFileName(filePath: string, fileName?: string): string {\n return fileName?.trim() || filePath.split(\"/\").pop() || filePath\n}\n\nfunction getSessionFilePath(sessionId: string, filePath: string): string {\n return `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}`\n}\n\nfunction getSessionFileDownloadUrl(sessionId: string, filePath: string): string {\n return getAuthedUrl(getSessionFilePath(sessionId, filePath))\n}\n\n/**\n * 后端把可解码为 UTF-8 的文件返回为 text/plain,二进制文件返回各自的 MIME。\n * 只有文本类内容才能安全地整体读进内存渲染——其余一律不能读 body。\n */\nfunction isTextualContentType(contentType: string): boolean {\n return (\n contentType.startsWith(\"text/\") ||\n contentType.includes(\"json\") ||\n contentType.includes(\"xml\") ||\n contentType.includes(\"yaml\") ||\n contentType.includes(\"javascript\")\n )\n}\n\nexport function buildSessionBinaryPreviewTarget(\n sessionId: string,\n filePath: string,\n fileName?: string,\n): PreviewTarget | null {\n const resolvedFileName = getDisplayFileName(filePath, fileName)\n const ext = getExt(resolvedFileName)\n const filePathUrl = getSessionFilePath(sessionId, filePath)\n const downloadUrl = getSessionFileDownloadUrl(sessionId, filePath)\n\n if (IMAGE_EXTS.has(ext)) {\n return { type: \"image\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (ext === \"pdf\") {\n return { type: \"pdf\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (DOCX_EXTS.has(ext)) {\n return { type: \"docx\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (EXCEL_EXTS.has(ext)) {\n return { type: \"excel\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (PPT_EXTS.has(ext)) {\n return {\n type: \"ppt\",\n content: filePathUrl,\n sourceUrl: downloadUrl,\n title: resolvedFileName,\n key: filePath,\n }\n }\n\n return null\n}\n\nexport async function resolveSessionFilePreviewTarget(\n sessionId: string,\n filePath: string,\n fileName?: string,\n): Promise<PreviewTarget> {\n const resolvedFileName = getDisplayFileName(filePath, fileName)\n const binaryTarget = buildSessionBinaryPreviewTarget(sessionId, filePath, resolvedFileName)\n if (binaryTarget) {\n return binaryTarget\n }\n\n const downloadUrl = getSessionFileDownloadUrl(sessionId, filePath)\n\n // 其余文件按后端返回的 Content-Type 分派,而不是猜扩展名:\n // 视频/音频/压缩包等二进制文件绝不能读 body(整体读进内存会卡死页面),\n // 改为把下载 URL 交给原生 <video>/<audio> 流式播放,或回退为下载。\n const res = await apiFetchResponse(getSessionFilePath(sessionId, filePath))\n const contentType = (res.headers.get(\"content-type\") ?? \"\").toLowerCase()\n\n if (contentType.startsWith(\"video/\")) {\n void res.body?.cancel()\n return { type: \"video\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (contentType.startsWith(\"audio/\")) {\n void res.body?.cancel()\n return { type: \"audio\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (!isTextualContentType(contentType)) {\n void res.body?.cancel()\n return { type: \"download\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n const content = await res.text()\n const ext = getExt(resolvedFileName)\n const type: PreviewTarget[\"type\"] = MARKDOWN_EXTS.has(ext)\n ? \"markdown\"\n : CSV_EXTS.has(ext)\n ? \"csv\"\n : HTML_EXTS.has(ext)\n ? \"html\"\n : \"file\"\n\n return {\n type,\n content,\n title: resolvedFileName,\n key: filePath,\n }\n}\n","import { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n"],"mappings":"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","names":[]}