@blade-hq/agent-kit 0.4.11 → 0.4.13
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-CHnXqybx.d.ts → SkillStatusBar-DhEw_C2P.d.ts} +2 -2
- package/dist/{blade-client-BfYaHLco.d.ts → blade-client-Brjw8njI.d.ts} +80 -2
- package/dist/{chunk-3LCNDPP6.js → chunk-6RVI56IR.js} +2 -2
- package/dist/{chunk-CDSCC4OQ.js → chunk-6UVM6PBD.js} +2 -2
- package/dist/{chunk-PJJ3Y3DZ.js → chunk-ACHKHQEO.js} +2 -2
- package/dist/{chunk-4XID5JVK.js → chunk-AGRVE5NY.js} +2 -2
- package/dist/{chunk-O2BVC7QE.js → chunk-C34J6GD3.js} +5 -5
- package/dist/{chunk-Z4FPELIQ.js → chunk-JMNQIZOC.js} +2 -2
- package/dist/{chunk-VCCMO7G5.js → chunk-UWUDHCVV.js} +206 -2
- package/dist/chunk-UWUDHCVV.js.map +1 -0
- package/dist/client/index.d.ts +223 -2
- package/dist/client/index.js +7 -1
- package/dist/{licenses-BGw5jiC4.d.ts → licenses-DZzDCfd0.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 +38 -8
- package/dist/react/index.js +63 -52
- package/dist/react/index.js.map +1 -1
- package/dist/{session-BKOc2lsz.d.ts → session-C7m4f0Gl.d.ts} +7 -2
- package/package.json +2 -1
- package/dist/chunk-VCCMO7G5.js.map +0 -1
- /package/dist/{chunk-3LCNDPP6.js.map → chunk-6RVI56IR.js.map} +0 -0
- /package/dist/{chunk-CDSCC4OQ.js.map → chunk-6UVM6PBD.js.map} +0 -0
- /package/dist/{chunk-PJJ3Y3DZ.js.map → chunk-ACHKHQEO.js.map} +0 -0
- /package/dist/{chunk-4XID5JVK.js.map → chunk-AGRVE5NY.js.map} +0 -0
- /package/dist/{chunk-O2BVC7QE.js.map → chunk-C34J6GD3.js.map} +0 -0
- /package/dist/{chunk-Z4FPELIQ.js.map → chunk-JMNQIZOC.js.map} +0 -0
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/context.ts","../../src/react/provider.tsx","../../src/react/api/api-keys.ts","../../src/react/api/env-buckets.ts","../../src/react/api/memories.ts","../../src/react/api/gis-api.ts","../../src/react/api/solutions.ts","../../src/react/api/scenarios.ts","../../src/react/api/scheduled-tasks.ts","../../src/react/api/software-factory.ts","../../src/react/api/registry.ts","../../src/react/hooks/use-gis.ts","../../src/react/hooks/use-check-skill-file.ts","../../src/react/hooks/use-global-skill-stats.ts","../../src/react/hooks/use-skills.ts","../../src/react/hooks/use-registry.ts","../../src/react/lib/step-ranges.ts","../../src/react/schemas/session.ts","../../src/react/types/solution.ts","../../src/react/schemas/studio/resource-base.ts","../../src/react/schemas/studio/database.ts","../../src/react/schemas/studio/tool.ts","../../src/react/schemas/studio/knowledge.ts","../../src/react/schemas/studio/agent.ts","../../src/react/schemas/studio/scene.ts","../../src/react/schemas/studio/env.ts","../../src/react/schemas/scheduled-task.ts","../../src/react/schemas/task.ts"],"sourcesContent":["import { createContext } from \"react\"\nimport type { BladeClient } from \"../client\"\n\nexport const BladeContext = createContext<BladeClient | null>(null)\n","import type { ReactNode } from \"react\"\nimport { useContext } from \"react\"\nimport type { BladeClient } from \"../client\"\nimport { getBootstrappedClient } from \"./bootstrap\"\nimport { BladeContext } from \"./context\"\n\nexport interface BladeClientProviderProps {\n client?: BladeClient\n children: ReactNode\n}\n\nexport function BladeClientProvider({ client, children }: BladeClientProviderProps) {\n const instance = client ?? getBootstrappedClient()\n return <BladeContext.Provider value={instance}>{children}</BladeContext.Provider>\n}\n\nexport function useBladeClient(): BladeClient {\n return useContext(BladeContext) ?? getBootstrappedClient()\n}\n","import type { ApiKeysResource } from \"../../client/resources/api-keys\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/api-keys\"\nconst r = (): ApiKeysResource => getClient().apiKeys\nexport const listApiKeys = (...args: Parameters<ApiKeysResource[\"listApiKeys\"]>) => r().listApiKeys(...args)\nexport const createApiKey = (...args: Parameters<ApiKeysResource[\"createApiKey\"]>) => r().createApiKey(...args)\nexport const renameApiKey = (...args: Parameters<ApiKeysResource[\"renameApiKey\"]>) => r().renameApiKey(...args)\nexport const deleteApiKey = (...args: Parameters<ApiKeysResource[\"deleteApiKey\"]>) => r().deleteApiKey(...args)\n","import type { EnvBucketsResource } from \"../../client/resources/env-buckets\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/env-buckets\"\nconst r = (): EnvBucketsResource => getClient().envBuckets\nexport const listEnvBuckets = (...args: Parameters<EnvBucketsResource[\"listEnvBuckets\"]>) =>\n r().listEnvBuckets(...args)\nexport const getEnvBucket = (...args: Parameters<EnvBucketsResource[\"getEnvBucket\"]>) =>\n r().getEnvBucket(...args)\nexport const setEnvBucket = (...args: Parameters<EnvBucketsResource[\"setEnvBucket\"]>) =>\n r().setEnvBucket(...args)\nexport const deleteEnvBucket = (...args: Parameters<EnvBucketsResource[\"deleteEnvBucket\"]>) =>\n r().deleteEnvBucket(...args)\nexport const getPlatformEnv = (...args: Parameters<EnvBucketsResource[\"getPlatformEnv\"]>) =>\n r().getPlatformEnv(...args)\nexport const getPlatformEnvReadonly = (\n ...args: Parameters<EnvBucketsResource[\"getPlatformEnvReadonly\"]>\n) => r().getPlatformEnvReadonly(...args)\nexport const setPlatformEnv = (...args: Parameters<EnvBucketsResource[\"setPlatformEnv\"]>) =>\n r().setPlatformEnv(...args)\nexport const deletePlatformEnv = (...args: Parameters<EnvBucketsResource[\"deletePlatformEnv\"]>) =>\n r().deletePlatformEnv(...args)\n","import type { MemoriesResource } from \"../../client/resources/memories\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/memories\"\nconst r = (): MemoriesResource => getClient().memories\nexport const createMemory = (...args: Parameters<MemoriesResource[\"createMemory\"]>) => r().createMemory(...args)\nexport const listMemories = (...args: Parameters<MemoriesResource[\"listMemories\"]>) => r().listMemories(...args)\nexport const getMemory = (...args: Parameters<MemoriesResource[\"getMemory\"]>) => r().getMemory(...args)\nexport const updateMemory = (...args: Parameters<MemoriesResource[\"updateMemory\"]>) => r().updateMemory(...args)\nexport const patchMemory = (...args: Parameters<MemoriesResource[\"patchMemory\"]>) => r().patchMemory(...args)\nexport const deleteMemory = (...args: Parameters<MemoriesResource[\"deleteMemory\"]>) => r().deleteMemory(...args)\nexport const batchMemories = (...args: Parameters<MemoriesResource[\"batchMemories\"]>) => r().batchMemories(...args)\n","import type { GisResource } from \"../../client/resources/gis\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/gis\"\nconst r = (): GisResource => getClient().gis\nexport const fetchGisState = (...args: Parameters<GisResource[\"fetchGisState\"]>) => r().fetchGisState(...args)\nexport const fetchRuntimeConfig = (...args: Parameters<GisResource[\"fetchRuntimeConfig\"]>) => r().fetchRuntimeConfig(...args)\n","import type { SolutionsResource } from \"../../client/resources/solutions\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/solutions\"\nconst r = (): SolutionsResource => getClient().solutions\nexport const fetchSolutions = (...args: Parameters<SolutionsResource[\"fetchSolutions\"]>) => r().fetchSolutions(...args)\nexport const fetchSolutionFile = (...args: Parameters<SolutionsResource[\"fetchSolutionFile\"]>) => r().fetchSolutionFile(...args)\nexport const fetchSolutionBizRoles = (...args: Parameters<SolutionsResource[\"fetchSolutionBizRoles\"]>) => r().fetchSolutionBizRoles(...args)\n","import type { ScenariosResource } from \"../../client/resources/scenarios\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/scenarios\"\nconst r = (): ScenariosResource => getClient().scenarios\nexport const listQuickScenarios = (...args: Parameters<ScenariosResource[\"listQuickScenarios\"]>) => r().listQuickScenarios(...args)\nexport const createQuickScenario = (...args: Parameters<ScenariosResource[\"createQuickScenario\"]>) => r().createQuickScenario(...args)\nexport const deleteQuickScenario = (...args: Parameters<ScenariosResource[\"deleteQuickScenario\"]>) => r().deleteQuickScenario(...args)\nexport const updateQuickScenario = (...args: Parameters<ScenariosResource[\"updateQuickScenario\"]>) => r().updateQuickScenario(...args)\nexport const listBladeHubScenarioResources = (...args: Parameters<ScenariosResource[\"listBladeHubScenarioResources\"]>) => r().listBladeHubScenarioResources(...args)\n","import type {\n ScheduledTask,\n ScheduledTaskCalendarItem,\n ScheduledTaskRun,\n} from \"../schemas/scheduled-task\"\nimport { apiFetch } from \"./client\"\n\nexport interface ScheduledTaskCreatePayload {\n title: string\n prompt: string\n cron: string\n timezone?: string\n enabled?: boolean\n expires_at?: string | null\n skip_confirmations?: boolean\n model?: string | null\n}\n\nexport type ScheduledTaskUpdatePayload = Partial<ScheduledTaskCreatePayload>\n\nfunction taskPath(id: string): string {\n return `/api/scheduled-tasks/${encodeURIComponent(id)}`\n}\n\nexport async function listScheduledTasks(): Promise<ScheduledTask[]> {\n return apiFetch<ScheduledTask[]>(\"/api/scheduled-tasks\")\n}\n\nexport async function createScheduledTask(\n payload: ScheduledTaskCreatePayload,\n): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(\"/api/scheduled-tasks\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n })\n}\n\nexport async function getScheduledTask(id: string): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(taskPath(id))\n}\n\nexport async function updateScheduledTask(\n id: string,\n payload: ScheduledTaskUpdatePayload,\n): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(taskPath(id), {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n })\n}\n\nexport async function deleteScheduledTask(id: string): Promise<void> {\n await apiFetch(taskPath(id), { method: \"DELETE\" })\n}\n\nexport async function startScheduledTask(id: string): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(`${taskPath(id)}/start`, { method: \"POST\" })\n}\n\nexport async function stopScheduledTask(id: string): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(`${taskPath(id)}/stop`, { method: \"POST\" })\n}\n\nexport async function listScheduledTaskRuns(id: string): Promise<ScheduledTaskRun[]> {\n return apiFetch<ScheduledTaskRun[]>(`${taskPath(id)}/runs`)\n}\n\nexport async function getScheduledTaskCalendar(params: {\n from: string\n to: string\n}): Promise<ScheduledTaskCalendarItem[]> {\n const search = new URLSearchParams({ from: params.from, to: params.to })\n return apiFetch<ScheduledTaskCalendarItem[]>(\n `/api/scheduled-tasks/calendar?${search.toString()}`,\n )\n}\n","import type { SoftwareFactoryResource } from \"../../client/resources/software-factory\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/software-factory\"\nconst r = (): SoftwareFactoryResource => getClient().softwareFactory\nexport const listSoftware = (...args: Parameters<SoftwareFactoryResource[\"listSoftware\"]>) => r().listSoftware(...args)\nexport const getSoftware = (...args: Parameters<SoftwareFactoryResource[\"getSoftware\"]>) => r().getSoftware(...args)\nexport const deleteSoftware = (...args: Parameters<SoftwareFactoryResource[\"deleteSoftware\"]>) => r().deleteSoftware(...args)\nexport const createSoftware = (...args: Parameters<SoftwareFactoryResource[\"createSoftware\"]>) => r().createSoftware(...args)\nexport const updateSoftware = (...args: Parameters<SoftwareFactoryResource[\"updateSoftware\"]>) => r().updateSoftware(...args)\nexport const bindTopicModuleSession = (...args: Parameters<SoftwareFactoryResource[\"bindTopicModuleSession\"]>) => r().bindTopicModuleSession(...args)\nexport const submitModuleForReview = (...args: Parameters<SoftwareFactoryResource[\"submitModuleForReview\"]>) => r().submitModuleForReview(...args)\nexport const completeModule = (...args: Parameters<SoftwareFactoryResource[\"completeModule\"]>) => r().completeModule(...args)\nexport const reopenModule = (...args: Parameters<SoftwareFactoryResource[\"reopenModule\"]>) => r().reopenModule(...args)\nexport const listSharedFiles = (...args: Parameters<SoftwareFactoryResource[\"listSharedFiles\"]>) => r().listSharedFiles(...args)\nexport const createSharedFile = (...args: Parameters<SoftwareFactoryResource[\"createSharedFile\"]>) => r().createSharedFile(...args)\nexport const uploadSoftwareDocuments = (...args: Parameters<SoftwareFactoryResource[\"uploadSoftwareDocuments\"]>) => r().uploadSoftwareDocuments(...args)\nexport const ensureIssueSession = (...args: Parameters<SoftwareFactoryResource[\"ensureIssueSession\"]>) => r().ensureIssueSession(...args)\nexport const listCodingTasks = (...args: Parameters<SoftwareFactoryResource[\"listCodingTasks\"]>) => r().listCodingTasks(...args)\nexport const startCoding = (...args: Parameters<SoftwareFactoryResource[\"startCoding\"]>) => r().startCoding(...args)\nexport const readShareFileContent = (...args: Parameters<SoftwareFactoryResource[\"readShareFileContent\"]>) => r().readShareFileContent(...args)\nexport const syncShare = (...args: Parameters<SoftwareFactoryResource[\"syncShare\"]>) => r().syncShare(...args)\nexport const listTopics = (...args: Parameters<SoftwareFactoryResource[\"listTopics\"]>) => r().listTopics(...args)\nexport const replaceTopics = (...args: Parameters<SoftwareFactoryResource[\"replaceTopics\"]>) => r().replaceTopics(...args)\nexport const getFactoryExportUrl = (...args: Parameters<SoftwareFactoryResource[\"getFactoryExportUrl\"]>) => r().getFactoryExportUrl(...args)\nexport const importFactory = (...args: Parameters<SoftwareFactoryResource[\"importFactory\"]>) => r().importFactory(...args)\n","import type { RegistryResource } from \"../../client/resources/registry\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/registry\"\nexport { normalizeResource, REGISTRY_PREFIX } from \"../../client/resources/registry\"\n\nconst r = (): RegistryResource => getClient().registry\nexport const createResourceApi = <T extends Record<string, unknown>>(apiType: string) =>\n r().createResourceApi<T>(apiType)\nexport const listSkillOrgs = (...args: Parameters<RegistryResource[\"listSkillOrgs\"]>) => r().listSkillOrgs(...args)\nexport const publishSkill = (...args: Parameters<RegistryResource[\"publishSkill\"]>) => r().publishSkill(...args)\nexport const databaseApi = new Proxy({} as RegistryResource[\"databaseApi\"], {\n get: (_target, prop) => Reflect.get(r().databaseApi, prop),\n})\nexport const toolApi = new Proxy({} as RegistryResource[\"toolApi\"], {\n get: (_target, prop) => Reflect.get(r().toolApi, prop),\n})\nexport const knowledgeApi = new Proxy({} as RegistryResource[\"knowledgeApi\"], {\n get: (_target, prop) => Reflect.get(r().knowledgeApi, prop),\n})\nexport const agentApi = new Proxy({} as RegistryResource[\"agentApi\"], {\n get: (_target, prop) => Reflect.get(r().agentApi, prop),\n})\n","import { useQuery } from \"@tanstack/react-query\"\nimport { fetchGisState, fetchRuntimeConfig } from \"../api/gis-api\"\nimport type { GisGoal, GisResource, GisTarget, RuntimeConfig } from \"../schemas/gis\"\nimport { useGisStore } from \"../stores/gis-store\"\n\nconst EMPTY_GOALS: GisGoal[] = []\nconst EMPTY_RESOURCES: GisResource[] = []\nconst EMPTY_TARGETS: GisTarget[] = []\nconst EMPTY_RUNTIME_CONFIG: RuntimeConfig = {\n sentryDsn: \"\",\n gisMapUrl: \"\",\n bladeOsPath: \"\",\n}\n\nexport function useGisState(sessionId: string | null | undefined) {\n const setGoals = useGisStore((state) => state.setGoals)\n const setResources = useGisStore((state) => state.setResources)\n const setTargets = useGisStore((state) => state.setTargets)\n const goals = useGisStore((state) =>\n sessionId ? (state.goalsBySession[sessionId] ?? EMPTY_GOALS) : EMPTY_GOALS,\n )\n const resources = useGisStore((state) =>\n sessionId ? (state.resourcesBySession[sessionId] ?? EMPTY_RESOURCES) : EMPTY_RESOURCES,\n )\n const targets = useGisStore((state) =>\n sessionId ? (state.targetsBySession[sessionId] ?? EMPTY_TARGETS) : EMPTY_TARGETS,\n )\n\n const query = useQuery({\n queryKey: [\"gis-state\", sessionId],\n queryFn: ({ signal }) =>\n fetchGisState(sessionId!, { signal }).then((state) => {\n setGoals(sessionId!, state.goals)\n setResources(sessionId!, state.resources)\n setTargets(sessionId!, state.targets)\n return state\n }),\n enabled: Boolean(sessionId),\n })\n\n return {\n data: {\n goals,\n resources,\n targets,\n },\n loading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useRuntimeConfig() {\n const query = useQuery({\n queryKey: [\"runtime-config\"],\n queryFn: ({ signal }) => fetchRuntimeConfig({ signal }),\n })\n\n return {\n data: query.data ?? EMPTY_RUNTIME_CONFIG,\n loading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import { useCallback } from \"react\"\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\"\nimport { apiFetch } from \"../api/client\"\n\nexport function useCheckSkillFile(sessionId: string | null) {\n const queryClient = useQueryClient()\n\n const { data } = useQuery({\n queryKey: [\"sessions\", sessionId, \"skill-file\"],\n queryFn: async () => {\n if (!sessionId) return false\n const response = await apiFetch(`/api/sessions/${encodeURIComponent(sessionId)}/check-skill-file`)\n return (response as { exists: boolean }).exists\n },\n enabled: !!sessionId,\n staleTime: 5000,\n gcTime: 10000,\n })\n\n const refetch = useCallback(() => {\n return queryClient.invalidateQueries({ queryKey: [\"sessions\", sessionId, \"skill-file\"] })\n }, [queryClient, sessionId])\n\n return {\n exists: data ?? false,\n refetch,\n }\n}\n","import { useQuery } from \"@tanstack/react-query\"\nimport { getGlobalSkillStats, type GlobalSkillStats } from \"../api/skills\"\n\nconst EMPTY: GlobalSkillStats = {\n remote_configured: false,\n remote_connected: false,\n installed_skill_count: 0,\n}\n\nexport function useGlobalSkillStats() {\n const query = useQuery({\n queryKey: [\"global-skill-stats\"],\n queryFn: ({ signal }) => getGlobalSkillStats({ signal }),\n refetchInterval: 300_000,\n })\n\n return {\n data: query.data ?? EMPTY,\n loading: query.isLoading,\n error: query.error,\n }\n}\n","import { useQuery } from \"@tanstack/react-query\"\nimport { listSkills } from \"../api/skills\"\nimport type { SkillSummary } from \"../schemas/skill\"\n\nconst EMPTY_SKILLS: SkillSummary[] = []\n\nexport function useSkills() {\n const {\n data = EMPTY_SKILLS,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"skills\"],\n queryFn: ({ signal }) => listSkills({ signal }),\n })\n return { data, loading, error }\n}\n","import { useQuery } from \"@tanstack/react-query\"\nimport { agentApi, databaseApi, knowledgeApi, toolApi } from \"../api/registry\"\nimport type { AgentResource } from \"../schemas/studio/agent\"\nimport type { DatabaseResource } from \"../schemas/studio/database\"\nimport type { KnowledgeResource } from \"../schemas/studio/knowledge\"\nimport type { ToolResource } from \"../schemas/studio/tool\"\n\nconst EMPTY_TOOL_PROVIDERS: ToolResource[] = []\nconst EMPTY_DATA_SOURCES: DatabaseResource[] = []\nconst EMPTY_KNOWLEDGE_BASES: KnowledgeResource[] = []\nconst EMPTY_AGENTS: AgentResource[] = []\n\nexport function useToolProviders() {\n const {\n data = EMPTY_TOOL_PROVIDERS,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"tool-providers\"],\n queryFn: ({ signal }) => toolApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n\nexport function useDataSources() {\n const {\n data = EMPTY_DATA_SOURCES,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"data-sources\"],\n queryFn: ({ signal }) => databaseApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n\nexport function useKnowledgeBases() {\n const {\n data = EMPTY_KNOWLEDGE_BASES,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"knowledge-bases\"],\n queryFn: ({ signal }) => knowledgeApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n\nexport function useAgents() {\n const {\n data = EMPTY_AGENTS,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"agents\"],\n queryFn: ({ signal }) => agentApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n","import type { ChatMessage } from \"../schemas/message\"\n\n/**\n * 每个 step 在消息流中的一段连续范围(R5 whatif 重跑的边界单位)。\n *\n * `[startIndex, endIndex)` 包含所有属于这个 step 的消息。\n * - 中间段:endIndex == 下一段的 startIndex(把本段 assistant 总结纳入本段)\n * - 末段:endIndex 停在最后一条显式 tag 该 step 的消息之后,避免把跑完 skill\n * 后的闲聊尾段误当成 step 的一部分\n *\n * 同一 stepNumber 可以在 stepRanges 里出现多次(每次 what-if 重跑后 step3/4\n * 会产生新一段),每次出现都是独立 range。\n */\nexport interface StepMessageRange {\n stepNumber: number\n startIndex: number\n endIndex: number\n}\n\n// Strategy 1: file-path pattern — matches step1_xxx/, step2/ etc.\nconst STEP_PATH_PATTERN = /step(\\d+)[_/]/g\n\n/** Extract a unique step number from text; null if 0 or multiple distinct matches. */\nfunction extractStepNumber(text: string): number | null {\n const nums = new Set<number>()\n for (const m of text.matchAll(STEP_PATH_PATTERN)) {\n nums.add(Number.parseInt(m[1], 10))\n }\n return nums.size === 1 ? nums.values().next().value! : null\n}\n\nfunction isRunSkillToolResult(text: string): boolean {\n return text.includes('\"tool_name\"') && text.includes('\"skill_id\"')\n}\n\nfunction collectFragments(msg: ChatMessage): string[] {\n const fragments: string[] = []\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n if (tc.arguments) fragments.push(tc.arguments)\n if (typeof tc.result === \"string\") fragments.push(tc.result)\n }\n }\n const content = msg.content\n if (typeof content === \"string\") {\n fragments.push(content)\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (part.type === \"text\") fragments.push(part.text)\n }\n }\n return fragments\n}\n\n/**\n * 把\"tool_name → step_number\"的映射建立起来。两条来源:\n * 1. ListSkillTools 结果里 `tools[].description` 含 \"步骤N\"\n * 2. RunSkillTool 结果按出现顺序填补剩余未映射 step\n */\nfunction buildToolStepMap(\n messages: ChatMessage[],\n sortedStepNumbers: number[],\n): Map<string, number> {\n const map = new Map<string, number>()\n const stepPattern = /步骤\\s*(\\d+)/\n\n for (const msg of messages) {\n for (const frag of collectFragments(msg)) {\n if (!frag.includes('\"tools\"')) continue\n try {\n const parsed = JSON.parse(frag)\n if (!Array.isArray(parsed.tools)) continue\n for (const tool of parsed.tools) {\n const m = tool.description?.match(stepPattern)\n if (m && tool.name) map.set(tool.name, Number.parseInt(m[1], 10))\n }\n } catch {\n // not valid JSON, skip\n }\n }\n }\n const assignedSteps = new Set(map.values())\n const remainingSteps = sortedStepNumbers.filter((n) => !assignedSteps.has(n))\n let seqIndex = 0\n for (const msg of messages) {\n for (const frag of collectFragments(msg)) {\n if (!isRunSkillToolResult(frag)) continue\n const m = frag.match(/\"tool_name\":\\s*\"([^\"]+)\"/)\n if (!m || map.has(m[1])) continue\n if (seqIndex < remainingSteps.length) {\n map.set(m[1], remainingSteps[seqIndex])\n seqIndex++\n }\n }\n }\n return map\n}\n\n// what-if 重跑的用户消息 prompt 头,backend 在 _compose_whatif_prompt 里拼的固定串。\n// snapshot 会顺带含 stepN_xxx/ 路径,会被 STEP_PATH_PATTERN 扫中误 tag;而它本身\n// 是\"从 step N 开始重跑\"的新段起点,应该落在卡片之间的 gap section,不归属任何 step。\nconst WHATIF_HEADER_MARK = \"deprecated_by_rerun,请基于最新用户假设从 step\"\n\nfunction isWhatIfUserMessage(msg: ChatMessage): boolean {\n if (msg.role !== \"user\") return false\n const content = msg.content\n if (typeof content === \"string\") return content.includes(WHATIF_HEADER_MARK)\n if (Array.isArray(content)) {\n for (const part of content) {\n if (part.type === \"text\" && part.text.includes(WHATIF_HEADER_MARK)) return true\n }\n }\n return false\n}\n\nfunction findStepInMessage(\n msg: ChatMessage,\n toolStepMap: Map<string, number>,\n): number | null {\n if (isWhatIfUserMessage(msg)) return null\n const fragments = collectFragments(msg)\n for (const frag of fragments) {\n const n = extractStepNumber(frag)\n if (n != null) return n\n }\n for (const frag of fragments) {\n if (!isRunSkillToolResult(frag)) continue\n const m = frag.match(/\"tool_name\":\\s*\"([^\"]+)\"/)\n if (m) {\n const step = toolStepMap.get(m[1])\n if (step != null) return step\n }\n }\n return null\n}\n\n/**\n * 把消息流切成 step-aligned 的 ranges 数组(纯函数)。\n *\n * 传 `steps` 只是为了拿 stepNumber 白名单,所以参数接受任何带 `stepNumber` 字段\n * 的对象,避免引入 apps/web 的 StepInfo 依赖。\n *\n * 算法概述:\n * 1. 每条消息过 `findStepInMessage`,得到 perMessageStep[]\n * 2. 顺序扫,遇到 step transition 时开新段;往前吃紧邻的 Q&A(user/assistant),\n * 遇到 what-if 重跑 user 消息立即停(它是边界)\n * 3. 末段 endIndex 停在最后一条 tag 该 step 的消息之后(避免吞下尾部闲聊)\n */\nexport function buildStepRanges(\n messages: ChatMessage[],\n steps: ReadonlyArray<{ stepNumber: number }>,\n): StepMessageRange[] {\n if (steps.length === 0) return []\n\n const sortedStepNumbers = steps.map((s) => s.stepNumber).sort((a, b) => a - b)\n const stepNumbers = new Set(sortedStepNumbers)\n\n const toolStepMap = buildToolStepMap(messages, sortedStepNumbers)\n const perMessageStep: (number | null)[] = messages.map((m) =>\n findStepInMessage(m, toolStepMap),\n )\n\n const ranges: Omit<StepMessageRange, \"endIndex\">[] = []\n let prevStep: number | null = null\n\n for (let i = 0; i < messages.length; i++) {\n const stepNum = perMessageStep[i]\n // what-if user 气泡清空 prevStep:它是\"从 step N 开始重跑\"的边界,之后\n // 即便 stepNum === 之前的 step 也必须开新段(rerun 的同步新 step1 不能\n // 和 rerun 前的旧 step1 合并成一段)。\n if (stepNum == null) {\n if (isWhatIfUserMessage(messages[i])) prevStep = null\n continue\n }\n if (!stepNumbers.has(stepNum)) continue\n if (stepNum === prevStep) continue\n prevStep = stepNum\n\n const prevBound = ranges.length > 0 ? ranges[ranges.length - 1].startIndex + 1 : 0\n let start = i\n let foundUser = false\n for (let j = i - 1; j >= prevBound; j--) {\n const msg = messages[j]\n const msgStep = perMessageStep[j]\n if (msgStep != null && msgStep !== stepNum) break\n if (msg.role === \"user\" && isWhatIfUserMessage(msg)) break\n if (msg.role === \"user\") {\n start = j\n foundUser = true\n continue\n }\n if (msg.role === \"assistant\" && foundUser) {\n start = j\n break\n }\n break\n }\n ranges.push({ stepNumber: stepNum, startIndex: start })\n }\n\n ranges.sort((a, b) => a.startIndex - b.startIndex)\n\n const result: StepMessageRange[] = []\n for (let i = 0; i < ranges.length; i++) {\n const r = ranges[i]\n // 上界:中间段是下一段 startIndex,末段是 messages.length。\n const upper = i + 1 < ranges.length ? ranges[i + 1].startIndex : messages.length\n // 从上界往回找最后一条 tag 该 step 的消息;把 [r.startIndex, lastTagged+1)\n // 作为本段。这样中间段的尾巴(例如紧邻下一段的 what-if user boundary 消息\n // 或非本 step 的闲聊)就不会被吞进来。\n let lastTagged = r.startIndex\n for (let j = upper - 1; j >= r.startIndex; j--) {\n if (perMessageStep[j] === r.stepNumber) {\n lastTagged = j\n break\n }\n }\n result.push({ stepNumber: r.stepNumber, startIndex: r.startIndex, endIndex: lastTagged + 1 })\n }\n return result\n}\n\n/**\n * 从 stepRanges 里按 step 归属筛选出需作废(whatif)的消息 id。\n *\n * 输入 `fromStep = min(quotes.map(q => q.step_number))`,返回 stepNumber >=\n * fromStep 的每段 range 内所有 message.entry_id,按 range.startIndex 升序。\n * 重复 id 自动去重。\n *\n * 纯函数,便于放在 core 供 apps/web 的 hook 共用并独立单测。\n */\nexport function deriveDeprecateEntryIds(\n stepRanges: StepMessageRange[],\n messages: ChatMessage[],\n fromStep: number,\n): string[] {\n if (stepRanges.length === 0) return []\n const ids: string[] = []\n const seen = new Set<string>()\n for (const range of stepRanges) {\n if (range.stepNumber < fromStep) continue\n const end = Math.min(range.endIndex, messages.length)\n for (let j = range.startIndex; j < end; j++) {\n const msg = messages[j]\n if (!msg?.entry_id) continue\n if (seen.has(msg.entry_id)) continue\n seen.add(msg.entry_id)\n ids.push(msg.entry_id)\n }\n }\n return ids\n}\n","import { type } from \"arktype\"\nimport type { Solution } from \"../types/solution\"\n\nexport const SessionStatus = type(\n \"'created' | 'running' | 'completed' | 'failed' | 'interrupted' | 'waiting_for_input'\",\n)\nexport type SessionStatus = typeof SessionStatus.infer\n\nexport type TemplateId =\n | \"default\"\n | \"skill_editor\"\n | \"vibe_coding\"\n // ship-attack v2:用户从 ship-attack 页面点\"新建 session\"创建的会话。\n // 后端 _maybe_bind_first_skill 只对此模板触发首次绑定。\n | \"ship_attack\"\n\nexport type SkillEditorTemplateId = \"skill_editor\"\n\nexport type ModeId = \"planning\" | \"executing\"\n\nexport interface ReplayState {\n source_session_id?: string\n status?: \"replay\" | \"autonomous\"\n speed?: 1 | 2 | 5\n next_source_entry_id?: string | null\n ended_at?: string | null\n autonomous_reason?: string | null\n}\n\nexport interface SessionPortMapping {\n container_port: number\n host_port: number\n}\n\n/**\n * 列表搜索时单条会话的命中信息。\n * - field='title':关键词出现在 intent 里,snippet 为 null(标题本身就在 UI 上)\n * - field='content':关键词出现在历史消息里,snippet 含截窗预览与角色\n */\nexport interface SessionSearchMatch {\n field: \"title\" | \"content\"\n snippet: { role: string; text: string } | null\n}\n\nexport const SessionInfo = type({\n id: \"string\",\n intent: \"string\",\n status: SessionStatus,\n created_at: \"string\",\n updated_at: \"string\",\n \"shared?\": \"boolean\",\n \"memory_enabled?\": \"boolean\",\n \"is_persistent?\": \"boolean\",\n \"viewer_role?\": \"'owner' | 'viewer'\",\n \"template_id?\": \"string | null\",\n \"model?\": \"string | null\",\n \"solution_id?\": \"string | null\",\n \"biz_role_id?\": \"string | null\",\n \"solution?\": \"unknown\",\n \"plan_summary?\": \"string | null\",\n \"primary_skill_id?\": \"string | null\",\n // ship-attack v2:后端 engine.set_bound_skill 写入的\"绑定 skill id\"。\n // 未绑定 / 非 ship-attack session 为 null。\n \"bound_skill_id?\": \"string | null\",\n \"replay_state?\": \"unknown\",\n \"is_pinned?\": \"boolean\",\n \"pinned_at?\": \"string | null\",\n \"is_example?\": \"boolean\",\n \"ports?\": \"unknown\",\n \"match?\": \"unknown\",\n})\nexport type SessionInfo = Omit<\n typeof SessionInfo.infer,\n \"template_id\" | \"solution\" | \"ports\" | \"match\"\n> & {\n shared?: boolean\n memory_enabled?: boolean\n is_persistent?: boolean\n viewer_role?: \"owner\" | \"viewer\"\n template_id?: TemplateId | null\n model?: string | null\n solution_id?: string | null\n biz_role_id?: string | null\n solution?: Solution | null\n primary_skill_id?: string | null\n bound_skill_id?: string | null\n replay_state?: ReplayState | null\n is_pinned?: boolean\n pinned_at?: string | null\n is_example?: boolean\n ports?: SessionPortMapping[]\n /** 仅在带 q 搜索的列表响应中出现;普通列表里此字段缺省。 */\n match?: SessionSearchMatch | null\n}\n\n/**\n * 主 skill 配置快照(v2)。创建 session 时从 SKILL.md frontmatter 抽出并\n * 固化到 session_root/.blade/primary-skill.json;ship-attack 页面骨架的唯\n * 一数据源。\n */\nexport interface PrimarySkillStepSpec {\n n: number\n label: string\n}\n\nexport interface PrimarySkillStageSpec {\n id: string\n name: string\n steps: PrimarySkillStepSpec[]\n}\n\nexport interface PrimarySkillParallelMode {\n id: string\n name: string\n prompt_hint: string\n}\n\nexport interface PrimarySkillSnapshot {\n version: number\n skill_id: string\n title: string\n description: string\n stages: PrimarySkillStageSpec[]\n parallel_modes: PrimarySkillParallelMode[]\n captured_at: string\n}\n\n/**\n * 单 session detail(GET /api/sessions/:id)。列表接口返回 SessionInfo,\n * detail 在此基础上附加 primary_skill_snapshot。\n */\nexport interface SessionDetail extends SessionInfo {\n primary_skill_snapshot?: PrimarySkillSnapshot | null\n}\n","export enum LayoutType {\n Default = \"default\",\n SkillEditor = \"skill-editor\",\n BladeCoa = \"blade-coa\",\n}\n\nexport interface Solution {\n id: string\n name: string\n version: string\n description?: string | null\n layout_type: LayoutType | string\n initial_mode?: \"planning\" | \"executing\" | string | null\n initial_message?: string | null\n roles?: BizRole[] | null\n data?: Record<string, unknown> | null\n}\n\nexport interface BizRole {\n id: string\n name: string\n description?: string | null\n}\n","import { type } from \"arktype\"\n\nexport const ResourceBase = type({\n id: \"string\",\n name: \"string\",\n description: \"string\",\n tags: \"string[]\",\n})\nexport type ResourceBase = typeof ResourceBase.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const MysqlConfig = type({\n host: \"string\",\n port: \"number\",\n user: \"string\",\n password: \"string\",\n database: \"string\",\n \"charset?\": \"string\",\n \"tables?\": \"string[]\",\n \"ssl?\": \"boolean\",\n \"connection_pool_size?\": \"number\",\n \"query_timeout?\": \"number\",\n})\nexport type MysqlConfig = typeof MysqlConfig.infer\n\nexport const PostgresqlConfig = type({\n host: \"string\",\n port: \"number\",\n user: \"string\",\n password: \"string\",\n database: \"string\",\n \"schema?\": \"string\",\n \"tables?\": \"string[]\",\n \"ssl_mode?\": \"string\",\n \"connection_pool_size?\": \"number\",\n \"query_timeout?\": \"number\",\n})\nexport type PostgresqlConfig = typeof PostgresqlConfig.infer\n\nexport const DatabaseDriver = type(\"'mysql' | 'postgresql'\")\nexport type DatabaseDriver = typeof DatabaseDriver.infer\n\nexport const DatabaseResource = type({\n \"...\": ResourceBase,\n type: \"'data'\",\n subtype: \"'db'\",\n driver: DatabaseDriver,\n config: \"Record<string, unknown>\",\n})\nexport type DatabaseResource = typeof DatabaseResource.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const McpToolConfig = type({\n \"server_url?\": \"string\",\n \"command?\": \"string\",\n \"args?\": \"string[]\",\n \"env?\": \"Record<string, string>\",\n})\nexport type McpToolConfig = typeof McpToolConfig.infer\n\nexport const HttpToolConfig = type({\n openapi_json_path: \"string\",\n \"base_url?\": \"string\",\n \"auth_header?\": \"string\",\n})\nexport type HttpToolConfig = typeof HttpToolConfig.infer\n\nexport const ToolDriver = type(\"'mcp' | 'http'\")\nexport type ToolDriver = typeof ToolDriver.infer\n\nexport const ToolResource = type({\n \"...\": ResourceBase,\n type: \"'tools'\",\n subtype: ToolDriver,\n config: \"Record<string, unknown>\",\n})\nexport type ToolResource = typeof ToolResource.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const DifyKnowledgeConfig = type({\n base_url: \"string\",\n api_key: \"string\",\n kg_name: \"string\",\n})\nexport type DifyKnowledgeConfig = typeof DifyKnowledgeConfig.infer\n\nexport const KnowledgeDriver = type(\"'dify'\")\nexport type KnowledgeDriver = typeof KnowledgeDriver.infer\n\nexport const KnowledgeResource = type({\n \"...\": ResourceBase,\n type: \"'knowledge'\",\n subtype: KnowledgeDriver,\n config: \"Record<string, unknown>\",\n})\nexport type KnowledgeResource = typeof KnowledgeResource.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const AgentDriver = type(\"'dify'\")\nexport type AgentDriver = typeof AgentDriver.infer\n\nexport const AgentResource = type({\n \"...\": ResourceBase,\n type: \"'agent'\",\n subtype: AgentDriver,\n config: \"Record<string, unknown>\",\n})\nexport type AgentResource = typeof AgentResource.infer\n","import { type } from \"arktype\"\n\nexport const SceneStatus = type(\"'draft' | 'published'\")\nexport type SceneStatus = typeof SceneStatus.infer\n\nexport const Scene = type({\n id: \"string\",\n name: \"string\",\n description: \"string\",\n status: SceneStatus,\n skills: \"string[]\",\n \"created_at?\": \"string\",\n \"updated_at?\": \"string\",\n})\nexport type Scene = typeof Scene.infer\n","import { type } from \"arktype\"\n\nexport const EnvVariable = type({\n key: \"string\",\n value: \"string\",\n \"description?\": \"string\",\n \"is_secret?\": \"boolean\",\n})\nexport type EnvVariable = typeof EnvVariable.infer\n","import { type } from \"arktype\"\n\nexport const ScheduledTask = type({\n id: \"string\",\n title: \"string\",\n prompt: \"string\",\n cron: \"string\",\n timezone: \"string\",\n enabled: \"boolean\",\n expires_at: \"string | null\",\n skip_confirmations: \"boolean\",\n model: \"string | null\",\n next_run_at: \"string | null\",\n last_run_at: \"string | null\",\n created_at: \"string\",\n updated_at: \"string\",\n})\nexport type ScheduledTask = typeof ScheduledTask.infer\n\nexport const ScheduledTaskRun = type({\n id: \"string\",\n task_id: \"string\",\n session_id: \"string | null\",\n status: \"string\",\n error: \"string | null\",\n triggered_at: \"string\",\n finished_at: \"string | null\",\n})\nexport type ScheduledTaskRun = typeof ScheduledTaskRun.infer\n\nexport const ScheduledTaskCalendarItem = type({\n task_id: \"string\",\n title: \"string\",\n occurrences: \"string[]\",\n})\nexport type ScheduledTaskCalendarItem = typeof ScheduledTaskCalendarItem.infer\n","import { type } from \"arktype\"\n\nexport const TaskStatus = type(\"'pending' | 'in_progress' | 'done' | 'failed' | 'skipped'\")\nexport type TaskStatus = typeof TaskStatus.infer\n\nexport const Task = type({\n id: \"string\",\n goal: \"string\",\n skills: \"string[]\",\n depends_on: \"string[]\",\n status: TaskStatus,\n result_summary: \"string\",\n number: \"string\",\n})\nexport type Task = typeof Task.infer\n"],"mappings":"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","names":["r","r","r","r","r","r","r","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","r","LayoutType","type","type","type","type","type","type","type","type","type","type","type","type","type"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/context.ts","../../src/react/provider.tsx","../../src/react/api/api-keys.ts","../../src/react/api/env-buckets.ts","../../src/react/api/memories.ts","../../src/react/api/gis-api.ts","../../src/react/api/published-apps.ts","../../src/react/api/solutions.ts","../../src/react/api/scenarios.ts","../../src/react/api/scheduled-tasks.ts","../../src/react/api/software-factory.ts","../../src/react/api/registry.ts","../../src/react/hooks/use-gis.ts","../../src/react/hooks/use-check-skill-file.ts","../../src/react/hooks/use-global-skill-stats.ts","../../src/react/hooks/use-skills.ts","../../src/react/hooks/use-registry.ts","../../src/react/lib/step-ranges.ts","../../src/react/schemas/session.ts","../../src/react/types/solution.ts","../../src/react/schemas/studio/resource-base.ts","../../src/react/schemas/studio/database.ts","../../src/react/schemas/studio/tool.ts","../../src/react/schemas/studio/knowledge.ts","../../src/react/schemas/studio/agent.ts","../../src/react/schemas/studio/scene.ts","../../src/react/schemas/studio/env.ts","../../src/react/schemas/scheduled-task.ts","../../src/react/schemas/task.ts"],"sourcesContent":["import { createContext } from \"react\"\nimport type { BladeClient } from \"../client\"\n\nexport const BladeContext = createContext<BladeClient | null>(null)\n","import type { ReactNode } from \"react\"\nimport { useContext } from \"react\"\nimport type { BladeClient } from \"../client\"\nimport { getBootstrappedClient } from \"./bootstrap\"\nimport { BladeContext } from \"./context\"\n\nexport interface BladeClientProviderProps {\n client?: BladeClient\n children: ReactNode\n}\n\nexport function BladeClientProvider({ client, children }: BladeClientProviderProps) {\n const instance = client ?? getBootstrappedClient()\n return <BladeContext.Provider value={instance}>{children}</BladeContext.Provider>\n}\n\nexport function useBladeClient(): BladeClient {\n return useContext(BladeContext) ?? getBootstrappedClient()\n}\n","import type { ApiKeysResource } from \"../../client/resources/api-keys\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/api-keys\"\nconst r = (): ApiKeysResource => getClient().apiKeys\nexport const listApiKeys = (...args: Parameters<ApiKeysResource[\"listApiKeys\"]>) => r().listApiKeys(...args)\nexport const createApiKey = (...args: Parameters<ApiKeysResource[\"createApiKey\"]>) => r().createApiKey(...args)\nexport const renameApiKey = (...args: Parameters<ApiKeysResource[\"renameApiKey\"]>) => r().renameApiKey(...args)\nexport const deleteApiKey = (...args: Parameters<ApiKeysResource[\"deleteApiKey\"]>) => r().deleteApiKey(...args)\n","import type { EnvBucketsResource } from \"../../client/resources/env-buckets\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/env-buckets\"\nconst r = (): EnvBucketsResource => getClient().envBuckets\nexport const listEnvBuckets = (...args: Parameters<EnvBucketsResource[\"listEnvBuckets\"]>) =>\n r().listEnvBuckets(...args)\nexport const getEnvBucket = (...args: Parameters<EnvBucketsResource[\"getEnvBucket\"]>) =>\n r().getEnvBucket(...args)\nexport const setEnvBucket = (...args: Parameters<EnvBucketsResource[\"setEnvBucket\"]>) =>\n r().setEnvBucket(...args)\nexport const deleteEnvBucket = (...args: Parameters<EnvBucketsResource[\"deleteEnvBucket\"]>) =>\n r().deleteEnvBucket(...args)\nexport const getPlatformEnv = (...args: Parameters<EnvBucketsResource[\"getPlatformEnv\"]>) =>\n r().getPlatformEnv(...args)\nexport const getPlatformEnvReadonly = (\n ...args: Parameters<EnvBucketsResource[\"getPlatformEnvReadonly\"]>\n) => r().getPlatformEnvReadonly(...args)\nexport const setPlatformEnv = (...args: Parameters<EnvBucketsResource[\"setPlatformEnv\"]>) =>\n r().setPlatformEnv(...args)\nexport const deletePlatformEnv = (...args: Parameters<EnvBucketsResource[\"deletePlatformEnv\"]>) =>\n r().deletePlatformEnv(...args)\n","import type { MemoriesResource } from \"../../client/resources/memories\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/memories\"\nconst r = (): MemoriesResource => getClient().memories\nexport const createMemory = (...args: Parameters<MemoriesResource[\"createMemory\"]>) => r().createMemory(...args)\nexport const listMemories = (...args: Parameters<MemoriesResource[\"listMemories\"]>) => r().listMemories(...args)\nexport const getMemory = (...args: Parameters<MemoriesResource[\"getMemory\"]>) => r().getMemory(...args)\nexport const updateMemory = (...args: Parameters<MemoriesResource[\"updateMemory\"]>) => r().updateMemory(...args)\nexport const patchMemory = (...args: Parameters<MemoriesResource[\"patchMemory\"]>) => r().patchMemory(...args)\nexport const deleteMemory = (...args: Parameters<MemoriesResource[\"deleteMemory\"]>) => r().deleteMemory(...args)\nexport const batchMemories = (...args: Parameters<MemoriesResource[\"batchMemories\"]>) => r().batchMemories(...args)\n","import type { GisResource } from \"../../client/resources/gis\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/gis\"\nconst r = (): GisResource => getClient().gis\nexport const fetchGisState = (...args: Parameters<GisResource[\"fetchGisState\"]>) => r().fetchGisState(...args)\nexport const fetchRuntimeConfig = (...args: Parameters<GisResource[\"fetchRuntimeConfig\"]>) => r().fetchRuntimeConfig(...args)\n","import type { PublishedAppsResource } from \"../../client/resources/published-apps\"\nimport { getClient } from \"./client\"\n\nexport type * from \"../../client/resources/published-apps\"\nexport type * from \"../schemas/published-apps\"\n\nconst r = (): PublishedAppsResource => getClient().publishedApps\n\nexport const listPublishedApps = (\n ...args: Parameters<PublishedAppsResource[\"listPublishedApps\"]>\n) => r().listPublishedApps(...args)\n\nexport const unpublishApp = (...args: Parameters<PublishedAppsResource[\"unpublishApp\"]>) =>\n r().unpublishApp(...args)\n","import type { SolutionsResource } from \"../../client/resources/solutions\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/solutions\"\nconst r = (): SolutionsResource => getClient().solutions\nexport const fetchSolutions = (...args: Parameters<SolutionsResource[\"fetchSolutions\"]>) => r().fetchSolutions(...args)\nexport const fetchSolutionFile = (...args: Parameters<SolutionsResource[\"fetchSolutionFile\"]>) => r().fetchSolutionFile(...args)\nexport const fetchSolutionBizRoles = (...args: Parameters<SolutionsResource[\"fetchSolutionBizRoles\"]>) => r().fetchSolutionBizRoles(...args)\n","import type { ScenariosResource } from \"../../client/resources/scenarios\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/scenarios\"\nconst r = (): ScenariosResource => getClient().scenarios\nexport const listQuickScenarios = (...args: Parameters<ScenariosResource[\"listQuickScenarios\"]>) => r().listQuickScenarios(...args)\nexport const createQuickScenario = (...args: Parameters<ScenariosResource[\"createQuickScenario\"]>) => r().createQuickScenario(...args)\nexport const deleteQuickScenario = (...args: Parameters<ScenariosResource[\"deleteQuickScenario\"]>) => r().deleteQuickScenario(...args)\nexport const updateQuickScenario = (...args: Parameters<ScenariosResource[\"updateQuickScenario\"]>) => r().updateQuickScenario(...args)\nexport const listBladeHubScenarioResources = (...args: Parameters<ScenariosResource[\"listBladeHubScenarioResources\"]>) => r().listBladeHubScenarioResources(...args)\n","import type {\n ScheduledTask,\n ScheduledTaskCalendarItem,\n ScheduledTaskRun,\n} from \"../schemas/scheduled-task\"\nimport { apiFetch } from \"./client\"\n\nexport interface ScheduledTaskCreatePayload {\n title: string\n prompt: string\n cron: string\n timezone?: string\n enabled?: boolean\n expires_at?: string | null\n skip_confirmations?: boolean\n model?: string | null\n}\n\nexport type ScheduledTaskUpdatePayload = Partial<ScheduledTaskCreatePayload>\n\nfunction taskPath(id: string): string {\n return `/api/scheduled-tasks/${encodeURIComponent(id)}`\n}\n\nexport async function listScheduledTasks(): Promise<ScheduledTask[]> {\n return apiFetch<ScheduledTask[]>(\"/api/scheduled-tasks\")\n}\n\nexport async function createScheduledTask(\n payload: ScheduledTaskCreatePayload,\n): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(\"/api/scheduled-tasks\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n })\n}\n\nexport async function getScheduledTask(id: string): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(taskPath(id))\n}\n\nexport async function updateScheduledTask(\n id: string,\n payload: ScheduledTaskUpdatePayload,\n): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(taskPath(id), {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n })\n}\n\nexport async function deleteScheduledTask(id: string): Promise<void> {\n await apiFetch(taskPath(id), { method: \"DELETE\" })\n}\n\nexport async function startScheduledTask(id: string): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(`${taskPath(id)}/start`, { method: \"POST\" })\n}\n\nexport async function stopScheduledTask(id: string): Promise<ScheduledTask> {\n return apiFetch<ScheduledTask>(`${taskPath(id)}/stop`, { method: \"POST\" })\n}\n\nexport async function listScheduledTaskRuns(id: string): Promise<ScheduledTaskRun[]> {\n return apiFetch<ScheduledTaskRun[]>(`${taskPath(id)}/runs`)\n}\n\nexport async function getScheduledTaskCalendar(params: {\n from: string\n to: string\n}): Promise<ScheduledTaskCalendarItem[]> {\n const search = new URLSearchParams({ from: params.from, to: params.to })\n return apiFetch<ScheduledTaskCalendarItem[]>(\n `/api/scheduled-tasks/calendar?${search.toString()}`,\n )\n}\n","import type { SoftwareFactoryResource } from \"../../client/resources/software-factory\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/software-factory\"\nconst r = (): SoftwareFactoryResource => getClient().softwareFactory\nexport const listSoftware = (...args: Parameters<SoftwareFactoryResource[\"listSoftware\"]>) => r().listSoftware(...args)\nexport const getSoftware = (...args: Parameters<SoftwareFactoryResource[\"getSoftware\"]>) => r().getSoftware(...args)\nexport const deleteSoftware = (...args: Parameters<SoftwareFactoryResource[\"deleteSoftware\"]>) => r().deleteSoftware(...args)\nexport const createSoftware = (...args: Parameters<SoftwareFactoryResource[\"createSoftware\"]>) => r().createSoftware(...args)\nexport const updateSoftware = (...args: Parameters<SoftwareFactoryResource[\"updateSoftware\"]>) => r().updateSoftware(...args)\nexport const bindTopicModuleSession = (...args: Parameters<SoftwareFactoryResource[\"bindTopicModuleSession\"]>) => r().bindTopicModuleSession(...args)\nexport const submitModuleForReview = (...args: Parameters<SoftwareFactoryResource[\"submitModuleForReview\"]>) => r().submitModuleForReview(...args)\nexport const completeModule = (...args: Parameters<SoftwareFactoryResource[\"completeModule\"]>) => r().completeModule(...args)\nexport const reopenModule = (...args: Parameters<SoftwareFactoryResource[\"reopenModule\"]>) => r().reopenModule(...args)\nexport const listSharedFiles = (...args: Parameters<SoftwareFactoryResource[\"listSharedFiles\"]>) => r().listSharedFiles(...args)\nexport const createSharedFile = (...args: Parameters<SoftwareFactoryResource[\"createSharedFile\"]>) => r().createSharedFile(...args)\nexport const uploadSoftwareDocuments = (...args: Parameters<SoftwareFactoryResource[\"uploadSoftwareDocuments\"]>) => r().uploadSoftwareDocuments(...args)\nexport const ensureIssueSession = (...args: Parameters<SoftwareFactoryResource[\"ensureIssueSession\"]>) => r().ensureIssueSession(...args)\nexport const listCodingTasks = (...args: Parameters<SoftwareFactoryResource[\"listCodingTasks\"]>) => r().listCodingTasks(...args)\nexport const startCoding = (...args: Parameters<SoftwareFactoryResource[\"startCoding\"]>) => r().startCoding(...args)\nexport const readShareFileContent = (...args: Parameters<SoftwareFactoryResource[\"readShareFileContent\"]>) => r().readShareFileContent(...args)\nexport const syncShare = (...args: Parameters<SoftwareFactoryResource[\"syncShare\"]>) => r().syncShare(...args)\nexport const listTopics = (...args: Parameters<SoftwareFactoryResource[\"listTopics\"]>) => r().listTopics(...args)\nexport const replaceTopics = (...args: Parameters<SoftwareFactoryResource[\"replaceTopics\"]>) => r().replaceTopics(...args)\nexport const getFactoryExportUrl = (...args: Parameters<SoftwareFactoryResource[\"getFactoryExportUrl\"]>) => r().getFactoryExportUrl(...args)\nexport const importFactory = (...args: Parameters<SoftwareFactoryResource[\"importFactory\"]>) => r().importFactory(...args)\n","import type { RegistryResource } from \"../../client/resources/registry\"\nimport { getClient } from \"./client\"\nexport type * from \"../../client/resources/registry\"\nexport { normalizeResource, REGISTRY_PREFIX } from \"../../client/resources/registry\"\n\nconst r = (): RegistryResource => getClient().registry\nexport const createResourceApi = <T extends Record<string, unknown>>(apiType: string) =>\n r().createResourceApi<T>(apiType)\nexport const listSkillOrgs = (...args: Parameters<RegistryResource[\"listSkillOrgs\"]>) => r().listSkillOrgs(...args)\nexport const publishSkill = (...args: Parameters<RegistryResource[\"publishSkill\"]>) => r().publishSkill(...args)\nexport const databaseApi = new Proxy({} as RegistryResource[\"databaseApi\"], {\n get: (_target, prop) => Reflect.get(r().databaseApi, prop),\n})\nexport const toolApi = new Proxy({} as RegistryResource[\"toolApi\"], {\n get: (_target, prop) => Reflect.get(r().toolApi, prop),\n})\nexport const knowledgeApi = new Proxy({} as RegistryResource[\"knowledgeApi\"], {\n get: (_target, prop) => Reflect.get(r().knowledgeApi, prop),\n})\nexport const agentApi = new Proxy({} as RegistryResource[\"agentApi\"], {\n get: (_target, prop) => Reflect.get(r().agentApi, prop),\n})\n","import { useQuery } from \"@tanstack/react-query\"\nimport { fetchGisState, fetchRuntimeConfig } from \"../api/gis-api\"\nimport type { GisGoal, GisResource, GisTarget, RuntimeConfig } from \"../schemas/gis\"\nimport { useGisStore } from \"../stores/gis-store\"\n\nconst EMPTY_GOALS: GisGoal[] = []\nconst EMPTY_RESOURCES: GisResource[] = []\nconst EMPTY_TARGETS: GisTarget[] = []\nconst EMPTY_RUNTIME_CONFIG: RuntimeConfig = {\n sentryDsn: \"\",\n gisMapUrl: \"\",\n bladeOsPath: \"\",\n}\n\nexport function useGisState(sessionId: string | null | undefined) {\n const setGoals = useGisStore((state) => state.setGoals)\n const setResources = useGisStore((state) => state.setResources)\n const setTargets = useGisStore((state) => state.setTargets)\n const goals = useGisStore((state) =>\n sessionId ? (state.goalsBySession[sessionId] ?? EMPTY_GOALS) : EMPTY_GOALS,\n )\n const resources = useGisStore((state) =>\n sessionId ? (state.resourcesBySession[sessionId] ?? EMPTY_RESOURCES) : EMPTY_RESOURCES,\n )\n const targets = useGisStore((state) =>\n sessionId ? (state.targetsBySession[sessionId] ?? EMPTY_TARGETS) : EMPTY_TARGETS,\n )\n\n const query = useQuery({\n queryKey: [\"gis-state\", sessionId],\n queryFn: ({ signal }) =>\n fetchGisState(sessionId!, { signal }).then((state) => {\n setGoals(sessionId!, state.goals)\n setResources(sessionId!, state.resources)\n setTargets(sessionId!, state.targets)\n return state\n }),\n enabled: Boolean(sessionId),\n })\n\n return {\n data: {\n goals,\n resources,\n targets,\n },\n loading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useRuntimeConfig() {\n const query = useQuery({\n queryKey: [\"runtime-config\"],\n queryFn: ({ signal }) => fetchRuntimeConfig({ signal }),\n })\n\n return {\n data: query.data ?? EMPTY_RUNTIME_CONFIG,\n loading: query.isLoading,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import { useCallback } from \"react\"\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\"\nimport { apiFetch } from \"../api/client\"\n\nexport function useCheckSkillFile(sessionId: string | null) {\n const queryClient = useQueryClient()\n\n const { data } = useQuery({\n queryKey: [\"sessions\", sessionId, \"skill-file\"],\n queryFn: async () => {\n if (!sessionId) return false\n const response = await apiFetch(`/api/sessions/${encodeURIComponent(sessionId)}/check-skill-file`)\n return (response as { exists: boolean }).exists\n },\n enabled: !!sessionId,\n staleTime: 5000,\n gcTime: 10000,\n })\n\n const refetch = useCallback(() => {\n return queryClient.invalidateQueries({ queryKey: [\"sessions\", sessionId, \"skill-file\"] })\n }, [queryClient, sessionId])\n\n return {\n exists: data ?? false,\n refetch,\n }\n}\n","import { useQuery } from \"@tanstack/react-query\"\nimport { getGlobalSkillStats, type GlobalSkillStats } from \"../api/skills\"\n\nconst EMPTY: GlobalSkillStats = {\n remote_configured: false,\n remote_connected: false,\n installed_skill_count: 0,\n}\n\nexport function useGlobalSkillStats() {\n const query = useQuery({\n queryKey: [\"global-skill-stats\"],\n queryFn: ({ signal }) => getGlobalSkillStats({ signal }),\n refetchInterval: 300_000,\n })\n\n return {\n data: query.data ?? EMPTY,\n loading: query.isLoading,\n error: query.error,\n }\n}\n","import { useQuery } from \"@tanstack/react-query\"\nimport { listSkills } from \"../api/skills\"\nimport type { SkillSummary } from \"../schemas/skill\"\n\nconst EMPTY_SKILLS: SkillSummary[] = []\n\nexport function useSkills() {\n const {\n data = EMPTY_SKILLS,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"skills\"],\n queryFn: ({ signal }) => listSkills({ signal }),\n })\n return { data, loading, error }\n}\n","import { useQuery } from \"@tanstack/react-query\"\nimport { agentApi, databaseApi, knowledgeApi, toolApi } from \"../api/registry\"\nimport type { AgentResource } from \"../schemas/studio/agent\"\nimport type { DatabaseResource } from \"../schemas/studio/database\"\nimport type { KnowledgeResource } from \"../schemas/studio/knowledge\"\nimport type { ToolResource } from \"../schemas/studio/tool\"\n\nconst EMPTY_TOOL_PROVIDERS: ToolResource[] = []\nconst EMPTY_DATA_SOURCES: DatabaseResource[] = []\nconst EMPTY_KNOWLEDGE_BASES: KnowledgeResource[] = []\nconst EMPTY_AGENTS: AgentResource[] = []\n\nexport function useToolProviders() {\n const {\n data = EMPTY_TOOL_PROVIDERS,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"tool-providers\"],\n queryFn: ({ signal }) => toolApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n\nexport function useDataSources() {\n const {\n data = EMPTY_DATA_SOURCES,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"data-sources\"],\n queryFn: ({ signal }) => databaseApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n\nexport function useKnowledgeBases() {\n const {\n data = EMPTY_KNOWLEDGE_BASES,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"knowledge-bases\"],\n queryFn: ({ signal }) => knowledgeApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n\nexport function useAgents() {\n const {\n data = EMPTY_AGENTS,\n isLoading: loading,\n error,\n } = useQuery({\n queryKey: [\"registry\", \"agents\"],\n queryFn: ({ signal }) => agentApi.list({ signal }),\n })\n\n return { data, loading, error }\n}\n","import type { ChatMessage } from \"../schemas/message\"\n\n/**\n * 每个 step 在消息流中的一段连续范围(R5 whatif 重跑的边界单位)。\n *\n * `[startIndex, endIndex)` 包含所有属于这个 step 的消息。\n * - 中间段:endIndex == 下一段的 startIndex(把本段 assistant 总结纳入本段)\n * - 末段:endIndex 停在最后一条显式 tag 该 step 的消息之后,避免把跑完 skill\n * 后的闲聊尾段误当成 step 的一部分\n *\n * 同一 stepNumber 可以在 stepRanges 里出现多次(每次 what-if 重跑后 step3/4\n * 会产生新一段),每次出现都是独立 range。\n */\nexport interface StepMessageRange {\n stepNumber: number\n startIndex: number\n endIndex: number\n}\n\n// Strategy 1: file-path pattern — matches step1_xxx/, step2/ etc.\nconst STEP_PATH_PATTERN = /step(\\d+)[_/]/g\n\n/** Extract a unique step number from text; null if 0 or multiple distinct matches. */\nfunction extractStepNumber(text: string): number | null {\n const nums = new Set<number>()\n for (const m of text.matchAll(STEP_PATH_PATTERN)) {\n nums.add(Number.parseInt(m[1], 10))\n }\n return nums.size === 1 ? nums.values().next().value! : null\n}\n\nfunction isRunSkillToolResult(text: string): boolean {\n return text.includes('\"tool_name\"') && text.includes('\"skill_id\"')\n}\n\nfunction collectFragments(msg: ChatMessage): string[] {\n const fragments: string[] = []\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n if (tc.arguments) fragments.push(tc.arguments)\n if (typeof tc.result === \"string\") fragments.push(tc.result)\n }\n }\n const content = msg.content\n if (typeof content === \"string\") {\n fragments.push(content)\n } else if (Array.isArray(content)) {\n for (const part of content) {\n if (part.type === \"text\") fragments.push(part.text)\n }\n }\n return fragments\n}\n\n/**\n * 把\"tool_name → step_number\"的映射建立起来。两条来源:\n * 1. ListSkillTools 结果里 `tools[].description` 含 \"步骤N\"\n * 2. RunSkillTool 结果按出现顺序填补剩余未映射 step\n */\nfunction buildToolStepMap(\n messages: ChatMessage[],\n sortedStepNumbers: number[],\n): Map<string, number> {\n const map = new Map<string, number>()\n const stepPattern = /步骤\\s*(\\d+)/\n\n for (const msg of messages) {\n for (const frag of collectFragments(msg)) {\n if (!frag.includes('\"tools\"')) continue\n try {\n const parsed = JSON.parse(frag)\n if (!Array.isArray(parsed.tools)) continue\n for (const tool of parsed.tools) {\n const m = tool.description?.match(stepPattern)\n if (m && tool.name) map.set(tool.name, Number.parseInt(m[1], 10))\n }\n } catch {\n // not valid JSON, skip\n }\n }\n }\n const assignedSteps = new Set(map.values())\n const remainingSteps = sortedStepNumbers.filter((n) => !assignedSteps.has(n))\n let seqIndex = 0\n for (const msg of messages) {\n for (const frag of collectFragments(msg)) {\n if (!isRunSkillToolResult(frag)) continue\n const m = frag.match(/\"tool_name\":\\s*\"([^\"]+)\"/)\n if (!m || map.has(m[1])) continue\n if (seqIndex < remainingSteps.length) {\n map.set(m[1], remainingSteps[seqIndex])\n seqIndex++\n }\n }\n }\n return map\n}\n\n// what-if 重跑的用户消息 prompt 头,backend 在 _compose_whatif_prompt 里拼的固定串。\n// snapshot 会顺带含 stepN_xxx/ 路径,会被 STEP_PATH_PATTERN 扫中误 tag;而它本身\n// 是\"从 step N 开始重跑\"的新段起点,应该落在卡片之间的 gap section,不归属任何 step。\nconst WHATIF_HEADER_MARK = \"deprecated_by_rerun,请基于最新用户假设从 step\"\n\nfunction isWhatIfUserMessage(msg: ChatMessage): boolean {\n if (msg.role !== \"user\") return false\n const content = msg.content\n if (typeof content === \"string\") return content.includes(WHATIF_HEADER_MARK)\n if (Array.isArray(content)) {\n for (const part of content) {\n if (part.type === \"text\" && part.text.includes(WHATIF_HEADER_MARK)) return true\n }\n }\n return false\n}\n\nfunction findStepInMessage(\n msg: ChatMessage,\n toolStepMap: Map<string, number>,\n): number | null {\n if (isWhatIfUserMessage(msg)) return null\n const fragments = collectFragments(msg)\n for (const frag of fragments) {\n const n = extractStepNumber(frag)\n if (n != null) return n\n }\n for (const frag of fragments) {\n if (!isRunSkillToolResult(frag)) continue\n const m = frag.match(/\"tool_name\":\\s*\"([^\"]+)\"/)\n if (m) {\n const step = toolStepMap.get(m[1])\n if (step != null) return step\n }\n }\n return null\n}\n\n/**\n * 把消息流切成 step-aligned 的 ranges 数组(纯函数)。\n *\n * 传 `steps` 只是为了拿 stepNumber 白名单,所以参数接受任何带 `stepNumber` 字段\n * 的对象,避免引入 apps/web 的 StepInfo 依赖。\n *\n * 算法概述:\n * 1. 每条消息过 `findStepInMessage`,得到 perMessageStep[]\n * 2. 顺序扫,遇到 step transition 时开新段;往前吃紧邻的 Q&A(user/assistant),\n * 遇到 what-if 重跑 user 消息立即停(它是边界)\n * 3. 末段 endIndex 停在最后一条 tag 该 step 的消息之后(避免吞下尾部闲聊)\n */\nexport function buildStepRanges(\n messages: ChatMessage[],\n steps: ReadonlyArray<{ stepNumber: number }>,\n): StepMessageRange[] {\n if (steps.length === 0) return []\n\n const sortedStepNumbers = steps.map((s) => s.stepNumber).sort((a, b) => a - b)\n const stepNumbers = new Set(sortedStepNumbers)\n\n const toolStepMap = buildToolStepMap(messages, sortedStepNumbers)\n const perMessageStep: (number | null)[] = messages.map((m) =>\n findStepInMessage(m, toolStepMap),\n )\n\n const ranges: Omit<StepMessageRange, \"endIndex\">[] = []\n let prevStep: number | null = null\n\n for (let i = 0; i < messages.length; i++) {\n const stepNum = perMessageStep[i]\n // what-if user 气泡清空 prevStep:它是\"从 step N 开始重跑\"的边界,之后\n // 即便 stepNum === 之前的 step 也必须开新段(rerun 的同步新 step1 不能\n // 和 rerun 前的旧 step1 合并成一段)。\n if (stepNum == null) {\n if (isWhatIfUserMessage(messages[i])) prevStep = null\n continue\n }\n if (!stepNumbers.has(stepNum)) continue\n if (stepNum === prevStep) continue\n prevStep = stepNum\n\n const prevBound = ranges.length > 0 ? ranges[ranges.length - 1].startIndex + 1 : 0\n let start = i\n let foundUser = false\n for (let j = i - 1; j >= prevBound; j--) {\n const msg = messages[j]\n const msgStep = perMessageStep[j]\n if (msgStep != null && msgStep !== stepNum) break\n if (msg.role === \"user\" && isWhatIfUserMessage(msg)) break\n if (msg.role === \"user\") {\n start = j\n foundUser = true\n continue\n }\n if (msg.role === \"assistant\" && foundUser) {\n start = j\n break\n }\n break\n }\n ranges.push({ stepNumber: stepNum, startIndex: start })\n }\n\n ranges.sort((a, b) => a.startIndex - b.startIndex)\n\n const result: StepMessageRange[] = []\n for (let i = 0; i < ranges.length; i++) {\n const r = ranges[i]\n // 上界:中间段是下一段 startIndex,末段是 messages.length。\n const upper = i + 1 < ranges.length ? ranges[i + 1].startIndex : messages.length\n // 从上界往回找最后一条 tag 该 step 的消息;把 [r.startIndex, lastTagged+1)\n // 作为本段。这样中间段的尾巴(例如紧邻下一段的 what-if user boundary 消息\n // 或非本 step 的闲聊)就不会被吞进来。\n let lastTagged = r.startIndex\n for (let j = upper - 1; j >= r.startIndex; j--) {\n if (perMessageStep[j] === r.stepNumber) {\n lastTagged = j\n break\n }\n }\n result.push({ stepNumber: r.stepNumber, startIndex: r.startIndex, endIndex: lastTagged + 1 })\n }\n return result\n}\n\n/**\n * 从 stepRanges 里按 step 归属筛选出需作废(whatif)的消息 id。\n *\n * 输入 `fromStep = min(quotes.map(q => q.step_number))`,返回 stepNumber >=\n * fromStep 的每段 range 内所有 message.entry_id,按 range.startIndex 升序。\n * 重复 id 自动去重。\n *\n * 纯函数,便于放在 core 供 apps/web 的 hook 共用并独立单测。\n */\nexport function deriveDeprecateEntryIds(\n stepRanges: StepMessageRange[],\n messages: ChatMessage[],\n fromStep: number,\n): string[] {\n if (stepRanges.length === 0) return []\n const ids: string[] = []\n const seen = new Set<string>()\n for (const range of stepRanges) {\n if (range.stepNumber < fromStep) continue\n const end = Math.min(range.endIndex, messages.length)\n for (let j = range.startIndex; j < end; j++) {\n const msg = messages[j]\n if (!msg?.entry_id) continue\n if (seen.has(msg.entry_id)) continue\n seen.add(msg.entry_id)\n ids.push(msg.entry_id)\n }\n }\n return ids\n}\n","import { type } from \"arktype\"\nimport type { Solution } from \"../types/solution\"\n\nexport const SessionStatus = type(\n \"'created' | 'running' | 'completed' | 'failed' | 'interrupted' | 'waiting_for_input'\",\n)\nexport type SessionStatus = typeof SessionStatus.infer\n\nexport type TemplateId =\n | \"default\"\n | \"skill_editor\"\n | \"vibe_coding\"\n // ship-attack v2:用户从 ship-attack 页面点\"新建 session\"创建的会话。\n // 后端 _maybe_bind_first_skill 只对此模板触发首次绑定。\n | \"ship_attack\"\n\nexport type SkillEditorTemplateId = \"skill_editor\"\n\nexport type ModeId = \"planning\" | \"executing\"\n\nexport interface ReplayState {\n source_session_id?: string\n status?: \"replay\" | \"autonomous\"\n speed?: 1 | 2 | 5\n next_source_entry_id?: string | null\n ended_at?: string | null\n autonomous_reason?: string | null\n}\n\nexport interface SessionPortMapping {\n container_port: number\n host_port: number\n}\n\n/**\n * 列表搜索时单条会话的命中信息。\n * - field='title':关键词出现在 intent 里,snippet 为 null(标题本身就在 UI 上)\n * - field='content':关键词出现在历史消息里,snippet 含截窗预览与角色\n */\nexport interface SessionSearchMatch {\n field: \"title\" | \"content\"\n snippet: { role: string; text: string } | null\n}\n\nexport const SessionInfo = type({\n id: \"string\",\n intent: \"string\",\n status: SessionStatus,\n created_at: \"string\",\n updated_at: \"string\",\n \"shared?\": \"boolean\",\n \"memory_enabled?\": \"boolean\",\n \"is_persistent?\": \"boolean\",\n \"viewer_role?\": \"'owner' | 'viewer'\",\n \"template_id?\": \"string | null\",\n \"model?\": \"string | null\",\n \"solution_id?\": \"string | null\",\n \"biz_role_id?\": \"string | null\",\n \"solution?\": \"unknown\",\n \"plan_summary?\": \"string | null\",\n \"primary_skill_id?\": \"string | null\",\n // ship-attack v2:后端 engine.set_bound_skill 写入的\"绑定 skill id\"。\n // 未绑定 / 非 ship-attack session 为 null。\n \"bound_skill_id?\": \"string | null\",\n \"replay_state?\": \"unknown\",\n \"is_pinned?\": \"boolean\",\n \"pinned_at?\": \"string | null\",\n \"is_example?\": \"boolean\",\n \"ports?\": \"unknown\",\n \"match?\": \"unknown\",\n})\nexport type SessionInfo = Omit<\n typeof SessionInfo.infer,\n \"template_id\" | \"solution\" | \"ports\" | \"match\"\n> & {\n shared?: boolean\n memory_enabled?: boolean\n is_persistent?: boolean\n viewer_role?: \"owner\" | \"viewer\"\n template_id?: TemplateId | null\n model?: string | null\n solution_id?: string | null\n biz_role_id?: string | null\n solution?: Solution | null\n primary_skill_id?: string | null\n bound_skill_id?: string | null\n replay_state?: ReplayState | null\n is_pinned?: boolean\n pinned_at?: string | null\n is_example?: boolean\n ports?: SessionPortMapping[]\n /** 仅在带 q 搜索的列表响应中出现;普通列表里此字段缺省。 */\n match?: SessionSearchMatch | null\n}\n\n/**\n * 主 skill 配置快照(v2)。创建 session 时从 SKILL.md frontmatter 抽出并\n * 固化到 session_root/.blade/primary-skill.json;ship-attack 页面骨架的唯\n * 一数据源。\n */\nexport interface PrimarySkillStepSpec {\n n: number\n label: string\n}\n\nexport interface PrimarySkillStageSpec {\n id: string\n name: string\n steps: PrimarySkillStepSpec[]\n}\n\nexport interface PrimarySkillParallelMode {\n id: string\n name: string\n prompt_hint: string\n}\n\nexport interface PrimarySkillSnapshot {\n version: number\n skill_id: string\n title: string\n description: string\n stages: PrimarySkillStageSpec[]\n parallel_modes: PrimarySkillParallelMode[]\n captured_at: string\n}\n\n/**\n * 单 session detail(GET /api/sessions/:id)。列表接口返回 SessionInfo,\n * detail 在此基础上附加 primary_skill_snapshot。\n */\nexport interface SessionDetail extends SessionInfo {\n primary_skill_snapshot?: PrimarySkillSnapshot | null\n /**\n * 会话级环境变量(owner-only)。后端仅在 GET detail 和 PUT /env 响应中返回,\n * 列表/搜索响应不带此字段。调用 setSessionEnv 后可类型安全地读回。\n */\n env?: Record<string, string>\n}\n","export enum LayoutType {\n Default = \"default\",\n SkillEditor = \"skill-editor\",\n BladeCoa = \"blade-coa\",\n}\n\nexport interface Solution {\n id: string\n name: string\n version: string\n description?: string | null\n layout_type: LayoutType | string\n initial_mode?: \"planning\" | \"executing\" | string | null\n initial_message?: string | null\n roles?: BizRole[] | null\n data?: Record<string, unknown> | null\n}\n\nexport interface BizRole {\n id: string\n name: string\n description?: string | null\n}\n","import { type } from \"arktype\"\n\nexport const ResourceBase = type({\n id: \"string\",\n name: \"string\",\n description: \"string\",\n tags: \"string[]\",\n})\nexport type ResourceBase = typeof ResourceBase.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const MysqlConfig = type({\n host: \"string\",\n port: \"number\",\n user: \"string\",\n password: \"string\",\n database: \"string\",\n \"charset?\": \"string\",\n \"tables?\": \"string[]\",\n \"ssl?\": \"boolean\",\n \"connection_pool_size?\": \"number\",\n \"query_timeout?\": \"number\",\n})\nexport type MysqlConfig = typeof MysqlConfig.infer\n\nexport const PostgresqlConfig = type({\n host: \"string\",\n port: \"number\",\n user: \"string\",\n password: \"string\",\n database: \"string\",\n \"schema?\": \"string\",\n \"tables?\": \"string[]\",\n \"ssl_mode?\": \"string\",\n \"connection_pool_size?\": \"number\",\n \"query_timeout?\": \"number\",\n})\nexport type PostgresqlConfig = typeof PostgresqlConfig.infer\n\nexport const DatabaseDriver = type(\"'mysql' | 'postgresql'\")\nexport type DatabaseDriver = typeof DatabaseDriver.infer\n\nexport const DatabaseResource = type({\n \"...\": ResourceBase,\n type: \"'data'\",\n subtype: \"'db'\",\n driver: DatabaseDriver,\n config: \"Record<string, unknown>\",\n})\nexport type DatabaseResource = typeof DatabaseResource.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const McpToolConfig = type({\n \"server_url?\": \"string\",\n \"command?\": \"string\",\n \"args?\": \"string[]\",\n \"env?\": \"Record<string, string>\",\n})\nexport type McpToolConfig = typeof McpToolConfig.infer\n\nexport const HttpToolConfig = type({\n openapi_json_path: \"string\",\n \"base_url?\": \"string\",\n \"auth_header?\": \"string\",\n})\nexport type HttpToolConfig = typeof HttpToolConfig.infer\n\nexport const ToolDriver = type(\"'mcp' | 'http'\")\nexport type ToolDriver = typeof ToolDriver.infer\n\nexport const ToolResource = type({\n \"...\": ResourceBase,\n type: \"'tools'\",\n subtype: ToolDriver,\n config: \"Record<string, unknown>\",\n})\nexport type ToolResource = typeof ToolResource.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const DifyKnowledgeConfig = type({\n base_url: \"string\",\n api_key: \"string\",\n kg_name: \"string\",\n})\nexport type DifyKnowledgeConfig = typeof DifyKnowledgeConfig.infer\n\nexport const KnowledgeDriver = type(\"'dify'\")\nexport type KnowledgeDriver = typeof KnowledgeDriver.infer\n\nexport const KnowledgeResource = type({\n \"...\": ResourceBase,\n type: \"'knowledge'\",\n subtype: KnowledgeDriver,\n config: \"Record<string, unknown>\",\n})\nexport type KnowledgeResource = typeof KnowledgeResource.infer\n","import { type } from \"arktype\"\n\nimport { ResourceBase } from \"./resource-base\"\n\nexport const AgentDriver = type(\"'dify'\")\nexport type AgentDriver = typeof AgentDriver.infer\n\nexport const AgentResource = type({\n \"...\": ResourceBase,\n type: \"'agent'\",\n subtype: AgentDriver,\n config: \"Record<string, unknown>\",\n})\nexport type AgentResource = typeof AgentResource.infer\n","import { type } from \"arktype\"\n\nexport const SceneStatus = type(\"'draft' | 'published'\")\nexport type SceneStatus = typeof SceneStatus.infer\n\nexport const Scene = type({\n id: \"string\",\n name: \"string\",\n description: \"string\",\n status: SceneStatus,\n skills: \"string[]\",\n \"created_at?\": \"string\",\n \"updated_at?\": \"string\",\n})\nexport type Scene = typeof Scene.infer\n","import { type } from \"arktype\"\n\nexport const EnvVariable = type({\n key: \"string\",\n value: \"string\",\n \"description?\": \"string\",\n \"is_secret?\": \"boolean\",\n})\nexport type EnvVariable = typeof EnvVariable.infer\n","import { type } from \"arktype\"\n\nexport const ScheduledTask = type({\n id: \"string\",\n title: \"string\",\n prompt: \"string\",\n cron: \"string\",\n timezone: \"string\",\n enabled: \"boolean\",\n expires_at: \"string | null\",\n skip_confirmations: \"boolean\",\n model: \"string | null\",\n next_run_at: \"string | null\",\n last_run_at: \"string | null\",\n created_at: \"string\",\n updated_at: \"string\",\n})\nexport type ScheduledTask = typeof ScheduledTask.infer\n\nexport const ScheduledTaskRun = type({\n id: \"string\",\n task_id: \"string\",\n session_id: \"string | null\",\n status: \"string\",\n error: \"string | null\",\n triggered_at: \"string\",\n finished_at: \"string | null\",\n})\nexport type ScheduledTaskRun = typeof ScheduledTaskRun.infer\n\nexport const ScheduledTaskCalendarItem = type({\n task_id: \"string\",\n title: \"string\",\n occurrences: \"string[]\",\n})\nexport type ScheduledTaskCalendarItem = typeof ScheduledTaskCalendarItem.infer\n","import { type } from \"arktype\"\n\nexport const TaskStatus = type(\"'pending' | 'in_progress' | 'done' | 'failed' | 'skipped'\")\nexport type TaskStatus = typeof TaskStatus.infer\n\nexport const Task = type({\n id: \"string\",\n goal: \"string\",\n skills: \"string[]\",\n depends_on: \"string[]\",\n status: TaskStatus,\n result_summary: \"string\",\n number: \"string\",\n})\nexport type Task = typeof Task.infer\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAGvB,IAAM,eAAe,cAAkC,IAAI;;;ACFlE,SAAS,kBAAkB;AAYlB;AAFF,SAAS,oBAAoB,EAAE,QAAQ,SAAS,GAA6B;AAClF,QAAM,WAAW,UAAU,sBAAsB;AACjD,SAAO,oBAAC,aAAa,UAAb,EAAsB,OAAO,UAAW,UAAS;AAC3D;AAEO,SAAS,iBAA8B;AAC5C,SAAO,WAAW,YAAY,KAAK,sBAAsB;AAC3D;;;AClBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAM,IAAI,MAAuB,UAAU,EAAE;AACtC,IAAM,cAAc,IAAI,SAAqD,EAAE,EAAE,YAAY,GAAG,IAAI;AACpG,IAAM,eAAe,IAAI,SAAsD,EAAE,EAAE,aAAa,GAAG,IAAI;AACvG,IAAM,eAAe,IAAI,SAAsD,EAAE,EAAE,aAAa,GAAG,IAAI;AACvG,IAAM,eAAe,IAAI,SAAsD,EAAE,EAAE,aAAa,GAAG,IAAI;;;ACP9G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAMA,KAAI,MAA0B,UAAU,EAAE;AACzC,IAAM,iBAAiB,IAAI,SAChCA,GAAE,EAAE,eAAe,GAAG,IAAI;AACrB,IAAM,eAAe,IAAI,SAC9BA,GAAE,EAAE,aAAa,GAAG,IAAI;AACnB,IAAM,eAAe,IAAI,SAC9BA,GAAE,EAAE,aAAa,GAAG,IAAI;AACnB,IAAM,kBAAkB,IAAI,SACjCA,GAAE,EAAE,gBAAgB,GAAG,IAAI;AACtB,IAAM,iBAAiB,IAAI,SAChCA,GAAE,EAAE,eAAe,GAAG,IAAI;AACrB,IAAM,yBAAyB,IACjC,SACAA,GAAE,EAAE,uBAAuB,GAAG,IAAI;AAChC,IAAM,iBAAiB,IAAI,SAChCA,GAAE,EAAE,eAAe,GAAG,IAAI;AACrB,IAAM,oBAAoB,IAAI,SACnCA,GAAE,EAAE,kBAAkB,GAAG,IAAI;;;ACpB/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAMC,KAAI,MAAwB,UAAU,EAAE;AACvC,IAAM,eAAe,IAAI,SAAuDA,GAAE,EAAE,aAAa,GAAG,IAAI;AACxG,IAAM,eAAe,IAAI,SAAuDA,GAAE,EAAE,aAAa,GAAG,IAAI;AACxG,IAAM,YAAY,IAAI,SAAoDA,GAAE,EAAE,UAAU,GAAG,IAAI;AAC/F,IAAM,eAAe,IAAI,SAAuDA,GAAE,EAAE,aAAa,GAAG,IAAI;AACxG,IAAM,cAAc,IAAI,SAAsDA,GAAE,EAAE,YAAY,GAAG,IAAI;AACrG,IAAM,eAAe,IAAI,SAAuDA,GAAE,EAAE,aAAa,GAAG,IAAI;AACxG,IAAM,gBAAgB,IAAI,SAAwDA,GAAE,EAAE,cAAc,GAAG,IAAI;;;ACVlH;AAAA;AAAA;AAAA;AAAA;AAGA,IAAMC,KAAI,MAAmB,UAAU,EAAE;AAClC,IAAM,gBAAgB,IAAI,SAAmDA,GAAE,EAAE,cAAc,GAAG,IAAI;AACtG,IAAM,qBAAqB,IAAI,SAAwDA,GAAE,EAAE,mBAAmB,GAAG,IAAI;;;ACL5H;AAAA;AAAA;AAAA;AAAA;AAMA,IAAMC,KAAI,MAA6B,UAAU,EAAE;AAE5C,IAAM,oBAAoB,IAC5B,SACAA,GAAE,EAAE,kBAAkB,GAAG,IAAI;AAE3B,IAAM,eAAe,IAAI,SAC9BA,GAAE,EAAE,aAAa,GAAG,IAAI;;;ACb1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAMC,KAAI,MAAyB,UAAU,EAAE;AACxC,IAAM,iBAAiB,IAAI,SAA0DA,GAAE,EAAE,eAAe,GAAG,IAAI;AAC/G,IAAM,oBAAoB,IAAI,SAA6DA,GAAE,EAAE,kBAAkB,GAAG,IAAI;AACxH,IAAM,wBAAwB,IAAI,SAAiEA,GAAE,EAAE,sBAAsB,GAAG,IAAI;;;ACN3I;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAMC,KAAI,MAAyB,UAAU,EAAE;AACxC,IAAM,qBAAqB,IAAI,SAA8DA,GAAE,EAAE,mBAAmB,GAAG,IAAI;AAC3H,IAAM,sBAAsB,IAAI,SAA+DA,GAAE,EAAE,oBAAoB,GAAG,IAAI;AAC9H,IAAM,sBAAsB,IAAI,SAA+DA,GAAE,EAAE,oBAAoB,GAAG,IAAI;AAC9H,IAAM,sBAAsB,IAAI,SAA+DA,GAAE,EAAE,oBAAoB,GAAG,IAAI;AAC9H,IAAM,gCAAgC,IAAI,SAAyEA,GAAE,EAAE,8BAA8B,GAAG,IAAI;;;ACRnK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA,SAAS,SAAS,IAAoB;AACpC,SAAO,wBAAwB,mBAAmB,EAAE,CAAC;AACvD;AAEA,eAAsB,qBAA+C;AACnE,SAAO,SAA0B,sBAAsB;AACzD;AAEA,eAAsB,oBACpB,SACwB;AACxB,SAAO,SAAwB,wBAAwB;AAAA,IACrD,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AACH;AAEA,eAAsB,iBAAiB,IAAoC;AACzE,SAAO,SAAwB,SAAS,EAAE,CAAC;AAC7C;AAEA,eAAsB,oBACpB,IACA,SACwB;AACxB,SAAO,SAAwB,SAAS,EAAE,GAAG;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AACH;AAEA,eAAsB,oBAAoB,IAA2B;AACnE,QAAM,SAAS,SAAS,EAAE,GAAG,EAAE,QAAQ,SAAS,CAAC;AACnD;AAEA,eAAsB,mBAAmB,IAAoC;AAC3E,SAAO,SAAwB,GAAG,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,OAAO,CAAC;AAC5E;AAEA,eAAsB,kBAAkB,IAAoC;AAC1E,SAAO,SAAwB,GAAG,SAAS,EAAE,CAAC,SAAS,EAAE,QAAQ,OAAO,CAAC;AAC3E;AAEA,eAAsB,sBAAsB,IAAyC;AACnF,SAAO,SAA6B,GAAG,SAAS,EAAE,CAAC,OAAO;AAC5D;AAEA,eAAsB,yBAAyB,QAGN;AACvC,QAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG,CAAC;AACvE,SAAO;AAAA,IACL,iCAAiC,OAAO,SAAS,CAAC;AAAA,EACpD;AACF;;;AC3EA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,IAAMC,KAAI,MAA+B,UAAU,EAAE;AAC9C,IAAM,eAAe,IAAI,SAA8DA,GAAE,EAAE,aAAa,GAAG,IAAI;AAC/G,IAAM,cAAc,IAAI,SAA6DA,GAAE,EAAE,YAAY,GAAG,IAAI;AAC5G,IAAM,iBAAiB,IAAI,SAAgEA,GAAE,EAAE,eAAe,GAAG,IAAI;AACrH,IAAM,iBAAiB,IAAI,SAAgEA,GAAE,EAAE,eAAe,GAAG,IAAI;AACrH,IAAM,iBAAiB,IAAI,SAAgEA,GAAE,EAAE,eAAe,GAAG,IAAI;AACrH,IAAM,yBAAyB,IAAI,SAAwEA,GAAE,EAAE,uBAAuB,GAAG,IAAI;AAC7I,IAAM,wBAAwB,IAAI,SAAuEA,GAAE,EAAE,sBAAsB,GAAG,IAAI;AAC1I,IAAM,iBAAiB,IAAI,SAAgEA,GAAE,EAAE,eAAe,GAAG,IAAI;AACrH,IAAM,eAAe,IAAI,SAA8DA,GAAE,EAAE,aAAa,GAAG,IAAI;AAC/G,IAAM,kBAAkB,IAAI,SAAiEA,GAAE,EAAE,gBAAgB,GAAG,IAAI;AACxH,IAAM,mBAAmB,IAAI,SAAkEA,GAAE,EAAE,iBAAiB,GAAG,IAAI;AAC3H,IAAM,0BAA0B,IAAI,SAAyEA,GAAE,EAAE,wBAAwB,GAAG,IAAI;AAChJ,IAAM,qBAAqB,IAAI,SAAoEA,GAAE,EAAE,mBAAmB,GAAG,IAAI;AACjI,IAAM,kBAAkB,IAAI,SAAiEA,GAAE,EAAE,gBAAgB,GAAG,IAAI;AACxH,IAAM,cAAc,IAAI,SAA6DA,GAAE,EAAE,YAAY,GAAG,IAAI;AAC5G,IAAM,uBAAuB,IAAI,SAAsEA,GAAE,EAAE,qBAAqB,GAAG,IAAI;AACvI,IAAM,YAAY,IAAI,SAA2DA,GAAE,EAAE,UAAU,GAAG,IAAI;AACtG,IAAM,aAAa,IAAI,SAA4DA,GAAE,EAAE,WAAW,GAAG,IAAI;AACzG,IAAM,gBAAgB,IAAI,SAA+DA,GAAE,EAAE,cAAc,GAAG,IAAI;AAClH,IAAM,sBAAsB,IAAI,SAAqEA,GAAE,EAAE,oBAAoB,GAAG,IAAI;AACpI,IAAM,gBAAgB,IAAI,SAA+DA,GAAE,EAAE,cAAc,GAAG,IAAI;;;ACnBzH,IAAMC,KAAI,MAAwB,UAAU,EAAE;AACvC,IAAM,oBAAoB,CAAoC,YACnEA,GAAE,EAAE,kBAAqB,OAAO;AAC3B,IAAM,gBAAgB,IAAI,SAAwDA,GAAE,EAAE,cAAc,GAAG,IAAI;AAC3G,IAAM,eAAe,IAAI,SAAuDA,GAAE,EAAE,aAAa,GAAG,IAAI;AACxG,IAAM,cAAc,IAAI,MAAM,CAAC,GAAsC;AAAA,EAC1E,KAAK,CAAC,SAAS,SAAS,QAAQ,IAAIA,GAAE,EAAE,aAAa,IAAI;AAC3D,CAAC;AACM,IAAM,UAAU,IAAI,MAAM,CAAC,GAAkC;AAAA,EAClE,KAAK,CAAC,SAAS,SAAS,QAAQ,IAAIA,GAAE,EAAE,SAAS,IAAI;AACvD,CAAC;AACM,IAAM,eAAe,IAAI,MAAM,CAAC,GAAuC;AAAA,EAC5E,KAAK,CAAC,SAAS,SAAS,QAAQ,IAAIA,GAAE,EAAE,cAAc,IAAI;AAC5D,CAAC;AACM,IAAM,WAAW,IAAI,MAAM,CAAC,GAAmC;AAAA,EACpE,KAAK,CAAC,SAAS,SAAS,QAAQ,IAAIA,GAAE,EAAE,UAAU,IAAI;AACxD,CAAC;;;ACrBD,SAAS,gBAAgB;AAKzB,IAAM,cAAyB,CAAC;AAChC,IAAM,kBAAiC,CAAC;AACxC,IAAM,gBAA6B,CAAC;AACpC,IAAM,uBAAsC;AAAA,EAC1C,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AACf;AAEO,SAAS,YAAY,WAAsC;AAChE,QAAM,WAAW,YAAY,CAAC,UAAU,MAAM,QAAQ;AACtD,QAAM,eAAe,YAAY,CAAC,UAAU,MAAM,YAAY;AAC9D,QAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAC1D,QAAM,QAAQ;AAAA,IAAY,CAAC,UACzB,YAAa,MAAM,eAAe,SAAS,KAAK,cAAe;AAAA,EACjE;AACA,QAAM,YAAY;AAAA,IAAY,CAAC,UAC7B,YAAa,MAAM,mBAAmB,SAAS,KAAK,kBAAmB;AAAA,EACzE;AACA,QAAM,UAAU;AAAA,IAAY,CAAC,UAC3B,YAAa,MAAM,iBAAiB,SAAS,KAAK,gBAAiB;AAAA,EACrE;AAEA,QAAM,QAAQ,SAAS;AAAA,IACrB,UAAU,CAAC,aAAa,SAAS;AAAA,IACjC,SAAS,CAAC,EAAE,OAAO,MACjB,cAAc,WAAY,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU;AACpD,eAAS,WAAY,MAAM,KAAK;AAChC,mBAAa,WAAY,MAAM,SAAS;AACxC,iBAAW,WAAY,MAAM,OAAO;AACpC,aAAO;AAAA,IACT,CAAC;AAAA,IACH,SAAS,QAAQ,SAAS;AAAA,EAC5B,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,EACjB;AACF;AAEO,SAAS,mBAAmB;AACjC,QAAM,QAAQ,SAAS;AAAA,IACrB,UAAU,CAAC,gBAAgB;AAAA,IAC3B,SAAS,CAAC,EAAE,OAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC;AAAA,EACxD,CAAC;AAED,SAAO;AAAA,IACL,MAAM,MAAM,QAAQ;AAAA,IACpB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,EACjB;AACF;;;AChEA,SAAS,mBAAmB;AAC5B,SAAS,YAAAC,WAAU,sBAAsB;AAGlC,SAAS,kBAAkB,WAA0B;AAC1D,QAAM,cAAc,eAAe;AAEnC,QAAM,EAAE,KAAK,IAAIC,UAAS;AAAA,IACxB,UAAU,CAAC,YAAY,WAAW,YAAY;AAAA,IAC9C,SAAS,YAAY;AACnB,UAAI,CAAC,UAAW,QAAO;AACvB,YAAM,WAAW,MAAM,SAAS,iBAAiB,mBAAmB,SAAS,CAAC,mBAAmB;AACjG,aAAQ,SAAiC;AAAA,IAC3C;AAAA,IACA,SAAS,CAAC,CAAC;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,UAAU,YAAY,MAAM;AAChC,WAAO,YAAY,kBAAkB,EAAE,UAAU,CAAC,YAAY,WAAW,YAAY,EAAE,CAAC;AAAA,EAC1F,GAAG,CAAC,aAAa,SAAS,CAAC;AAE3B,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF;AACF;;;AC3BA,SAAS,YAAAC,iBAAgB;AAGzB,IAAM,QAA0B;AAAA,EAC9B,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,uBAAuB;AACzB;AAEO,SAAS,sBAAsB;AACpC,QAAM,QAAQC,UAAS;AAAA,IACrB,UAAU,CAAC,oBAAoB;AAAA,IAC/B,SAAS,CAAC,EAAE,OAAO,MAAM,oBAAoB,EAAE,OAAO,CAAC;AAAA,IACvD,iBAAiB;AAAA,EACnB,CAAC;AAED,SAAO;AAAA,IACL,MAAM,MAAM,QAAQ;AAAA,IACpB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,EACf;AACF;;;ACrBA,SAAS,YAAAC,iBAAgB;AAIzB,IAAM,eAA+B,CAAC;AAE/B,SAAS,YAAY;AAC1B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,EACF,IAAIC,UAAS;AAAA,IACX,UAAU,CAAC,QAAQ;AAAA,IACnB,SAAS,CAAC,EAAE,OAAO,MAAM,WAAW,EAAE,OAAO,CAAC;AAAA,EAChD,CAAC;AACD,SAAO,EAAE,MAAM,SAAS,MAAM;AAChC;;;AChBA,SAAS,YAAAC,iBAAgB;AAOzB,IAAM,uBAAuC,CAAC;AAC9C,IAAM,qBAAyC,CAAC;AAChD,IAAM,wBAA6C,CAAC;AACpD,IAAM,eAAgC,CAAC;AAEhC,SAAS,mBAAmB;AACjC,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,EACF,IAAIC,UAAS;AAAA,IACX,UAAU,CAAC,YAAY,gBAAgB;AAAA,IACvC,SAAS,CAAC,EAAE,OAAO,MAAM,QAAQ,KAAK,EAAE,OAAO,CAAC;AAAA,EAClD,CAAC;AAED,SAAO,EAAE,MAAM,SAAS,MAAM;AAChC;AAEO,SAAS,iBAAiB;AAC/B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,EACF,IAAIA,UAAS;AAAA,IACX,UAAU,CAAC,YAAY,cAAc;AAAA,IACrC,SAAS,CAAC,EAAE,OAAO,MAAM,YAAY,KAAK,EAAE,OAAO,CAAC;AAAA,EACtD,CAAC;AAED,SAAO,EAAE,MAAM,SAAS,MAAM;AAChC;AAEO,SAAS,oBAAoB;AAClC,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,EACF,IAAIA,UAAS;AAAA,IACX,UAAU,CAAC,YAAY,iBAAiB;AAAA,IACxC,SAAS,CAAC,EAAE,OAAO,MAAM,aAAa,KAAK,EAAE,OAAO,CAAC;AAAA,EACvD,CAAC;AAED,SAAO,EAAE,MAAM,SAAS,MAAM;AAChC;AAEO,SAAS,YAAY;AAC1B,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,EACF,IAAIA,UAAS;AAAA,IACX,UAAU,CAAC,YAAY,QAAQ;AAAA,IAC/B,SAAS,CAAC,EAAE,OAAO,MAAM,SAAS,KAAK,EAAE,OAAO,CAAC;AAAA,EACnD,CAAC;AAED,SAAO,EAAE,MAAM,SAAS,MAAM;AAChC;;;AC1CA,IAAM,oBAAoB;AAG1B,SAAS,kBAAkB,MAA6B;AACtD,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,KAAK,KAAK,SAAS,iBAAiB,GAAG;AAChD,SAAK,IAAI,OAAO,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;AAAA,EACpC;AACA,SAAO,KAAK,SAAS,IAAI,KAAK,OAAO,EAAE,KAAK,EAAE,QAAS;AACzD;AAEA,SAAS,qBAAqB,MAAuB;AACnD,SAAO,KAAK,SAAS,aAAa,KAAK,KAAK,SAAS,YAAY;AACnE;AAEA,SAAS,iBAAiB,KAA4B;AACpD,QAAM,YAAsB,CAAC;AAC7B,MAAI,IAAI,YAAY;AAClB,eAAW,MAAM,IAAI,YAAY;AAC/B,UAAI,GAAG,UAAW,WAAU,KAAK,GAAG,SAAS;AAC7C,UAAI,OAAO,GAAG,WAAW,SAAU,WAAU,KAAK,GAAG,MAAM;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,UAAU,IAAI;AACpB,MAAI,OAAO,YAAY,UAAU;AAC/B,cAAU,KAAK,OAAO;AAAA,EACxB,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,SAAS,OAAQ,WAAU,KAAK,KAAK,IAAI;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,iBACP,UACA,mBACqB;AACrB,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,cAAc;AAEpB,aAAW,OAAO,UAAU;AAC1B,eAAW,QAAQ,iBAAiB,GAAG,GAAG;AACxC,UAAI,CAAC,KAAK,SAAS,SAAS,EAAG;AAC/B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,YAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,EAAG;AAClC,mBAAW,QAAQ,OAAO,OAAO;AAC/B,gBAAM,IAAI,KAAK,aAAa,MAAM,WAAW;AAC7C,cAAI,KAAK,KAAK,KAAM,KAAI,IAAI,KAAK,MAAM,OAAO,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;AAAA,QAClE;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,IAAI,IAAI,IAAI,OAAO,CAAC;AAC1C,QAAM,iBAAiB,kBAAkB,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;AAC5E,MAAI,WAAW;AACf,aAAW,OAAO,UAAU;AAC1B,eAAW,QAAQ,iBAAiB,GAAG,GAAG;AACxC,UAAI,CAAC,qBAAqB,IAAI,EAAG;AACjC,YAAM,IAAI,KAAK,MAAM,0BAA0B;AAC/C,UAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,EAAG;AACzB,UAAI,WAAW,eAAe,QAAQ;AACpC,YAAI,IAAI,EAAE,CAAC,GAAG,eAAe,QAAQ,CAAC;AACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,IAAM,qBAAqB;AAE3B,SAAS,oBAAoB,KAA2B;AACtD,MAAI,IAAI,SAAS,OAAQ,QAAO;AAChC,QAAM,UAAU,IAAI;AACpB,MAAI,OAAO,YAAY,SAAU,QAAO,QAAQ,SAAS,kBAAkB;AAC3E,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,kBAAkB,EAAG,QAAO;AAAA,IAC7E;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,KACA,aACe;AACf,MAAI,oBAAoB,GAAG,EAAG,QAAO;AACrC,QAAM,YAAY,iBAAiB,GAAG;AACtC,aAAW,QAAQ,WAAW;AAC5B,UAAM,IAAI,kBAAkB,IAAI;AAChC,QAAI,KAAK,KAAM,QAAO;AAAA,EACxB;AACA,aAAW,QAAQ,WAAW;AAC5B,QAAI,CAAC,qBAAqB,IAAI,EAAG;AACjC,UAAM,IAAI,KAAK,MAAM,0BAA0B;AAC/C,QAAI,GAAG;AACL,YAAM,OAAO,YAAY,IAAI,EAAE,CAAC,CAAC;AACjC,UAAI,QAAQ,KAAM,QAAO;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;AAcO,SAAS,gBACd,UACA,OACoB;AACpB,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAEhC,QAAM,oBAAoB,MAAM,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC7E,QAAM,cAAc,IAAI,IAAI,iBAAiB;AAE7C,QAAM,cAAc,iBAAiB,UAAU,iBAAiB;AAChE,QAAM,iBAAoC,SAAS;AAAA,IAAI,CAAC,MACtD,kBAAkB,GAAG,WAAW;AAAA,EAClC;AAEA,QAAM,SAA+C,CAAC;AACtD,MAAI,WAA0B;AAE9B,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,UAAU,eAAe,CAAC;AAIhC,QAAI,WAAW,MAAM;AACnB,UAAI,oBAAoB,SAAS,CAAC,CAAC,EAAG,YAAW;AACjD;AAAA,IACF;AACA,QAAI,CAAC,YAAY,IAAI,OAAO,EAAG;AAC/B,QAAI,YAAY,SAAU;AAC1B,eAAW;AAEX,UAAM,YAAY,OAAO,SAAS,IAAI,OAAO,OAAO,SAAS,CAAC,EAAE,aAAa,IAAI;AACjF,QAAI,QAAQ;AACZ,QAAI,YAAY;AAChB,aAAS,IAAI,IAAI,GAAG,KAAK,WAAW,KAAK;AACvC,YAAM,MAAM,SAAS,CAAC;AACtB,YAAM,UAAU,eAAe,CAAC;AAChC,UAAI,WAAW,QAAQ,YAAY,QAAS;AAC5C,UAAI,IAAI,SAAS,UAAU,oBAAoB,GAAG,EAAG;AACrD,UAAI,IAAI,SAAS,QAAQ;AACvB,gBAAQ;AACR,oBAAY;AACZ;AAAA,MACF;AACA,UAAI,IAAI,SAAS,eAAe,WAAW;AACzC,gBAAQ;AACR;AAAA,MACF;AACA;AAAA,IACF;AACA,WAAO,KAAK,EAAE,YAAY,SAAS,YAAY,MAAM,CAAC;AAAA,EACxD;AAEA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAEjD,QAAM,SAA6B,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAMC,MAAI,OAAO,CAAC;AAElB,UAAM,QAAQ,IAAI,IAAI,OAAO,SAAS,OAAO,IAAI,CAAC,EAAE,aAAa,SAAS;AAI1E,QAAI,aAAaA,IAAE;AACnB,aAAS,IAAI,QAAQ,GAAG,KAAKA,IAAE,YAAY,KAAK;AAC9C,UAAI,eAAe,CAAC,MAAMA,IAAE,YAAY;AACtC,qBAAa;AACb;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,EAAE,YAAYA,IAAE,YAAY,YAAYA,IAAE,YAAY,UAAU,aAAa,EAAE,CAAC;AAAA,EAC9F;AACA,SAAO;AACT;AAWO,SAAS,wBACd,YACA,UACA,UACU;AACV,MAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AACrC,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,SAAS,YAAY;AAC9B,QAAI,MAAM,aAAa,SAAU;AACjC,UAAM,MAAM,KAAK,IAAI,MAAM,UAAU,SAAS,MAAM;AACpD,aAAS,IAAI,MAAM,YAAY,IAAI,KAAK,KAAK;AAC3C,YAAM,MAAM,SAAS,CAAC;AACtB,UAAI,CAAC,KAAK,SAAU;AACpB,UAAI,KAAK,IAAI,IAAI,QAAQ,EAAG;AAC5B,WAAK,IAAI,IAAI,QAAQ;AACrB,UAAI,KAAK,IAAI,QAAQ;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;;;AC3PA,SAAS,YAAY;AAGd,IAAM,gBAAgB;AAAA,EAC3B;AACF;AAuCO,IAAM,cAAc,KAAK;AAAA,EAC9B,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,qBAAqB;AAAA;AAAA;AAAA,EAGrB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AACZ,CAAC;;;ACtEM,IAAK,aAAL,kBAAKC,gBAAL;AACL,EAAAA,YAAA,aAAU;AACV,EAAAA,YAAA,iBAAc;AACd,EAAAA,YAAA,cAAW;AAHD,SAAAA;AAAA,GAAA;;;ACAZ,SAAS,QAAAC,aAAY;AAEd,IAAM,eAAeA,MAAK;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AACR,CAAC;;;ACPD,SAAS,QAAAC,aAAY;AAId,IAAM,cAAcC,MAAK;AAAA,EAC9B,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,yBAAyB;AAAA,EACzB,kBAAkB;AACpB,CAAC;AAGM,IAAM,mBAAmBA,MAAK;AAAA,EACnC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,kBAAkB;AACpB,CAAC;AAGM,IAAM,iBAAiBA,MAAK,wBAAwB;AAGpD,IAAM,mBAAmBA,MAAK;AAAA,EACnC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV,CAAC;;;ACzCD,SAAS,QAAAC,aAAY;AAId,IAAM,gBAAgBC,MAAK;AAAA,EAChC,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,QAAQ;AACV,CAAC;AAGM,IAAM,iBAAiBA,MAAK;AAAA,EACjC,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,gBAAgB;AAClB,CAAC;AAGM,IAAM,aAAaA,MAAK,gBAAgB;AAGxC,IAAM,eAAeA,MAAK;AAAA,EAC/B,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AACV,CAAC;;;AC3BD,SAAS,QAAAC,aAAY;AAId,IAAM,sBAAsBC,MAAK;AAAA,EACtC,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AACX,CAAC;AAGM,IAAM,kBAAkBA,MAAK,QAAQ;AAGrC,IAAM,oBAAoBA,MAAK;AAAA,EACpC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AACV,CAAC;;;ACnBD,SAAS,QAAAC,aAAY;AAId,IAAM,cAAcC,MAAK,QAAQ;AAGjC,IAAM,gBAAgBA,MAAK;AAAA,EAChC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AACV,CAAC;;;ACZD,SAAS,QAAAC,aAAY;AAEd,IAAM,cAAcA,MAAK,uBAAuB;AAGhD,IAAM,QAAQA,MAAK;AAAA,EACxB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,eAAe;AACjB,CAAC;;;ACbD,SAAS,QAAAC,aAAY;AAEd,IAAM,cAAcA,MAAK;AAAA,EAC9B,KAAK;AAAA,EACL,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,cAAc;AAChB,CAAC;;;ACPD,SAAS,QAAAC,aAAY;AAEd,IAAM,gBAAgBA,MAAK;AAAA,EAChC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AACd,CAAC;AAGM,IAAM,mBAAmBA,MAAK;AAAA,EACnC,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,cAAc;AAAA,EACd,aAAa;AACf,CAAC;AAGM,IAAM,4BAA4BA,MAAK;AAAA,EAC5C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AACf,CAAC;;;AClCD,SAAS,QAAAC,cAAY;AAEd,IAAM,aAAaA,OAAK,2DAA2D;AAGnF,IAAM,OAAOA,OAAK;AAAA,EACvB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,QAAQ;AACV,CAAC;","names":["r","r","r","r","r","r","r","r","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","r","LayoutType","type","type","type","type","type","type","type","type","type","type","type","type","type"]}
|
|
@@ -23,7 +23,7 @@ interface BizRole {
|
|
|
23
23
|
description?: string | null;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
declare const SessionStatus: arktype_internal_variants_string_ts.StringType<"
|
|
26
|
+
declare const SessionStatus: arktype_internal_variants_string_ts.StringType<"completed" | "failed" | "interrupted" | "running" | "created" | "waiting_for_input", {}>;
|
|
27
27
|
type SessionStatus = typeof SessionStatus.infer;
|
|
28
28
|
type TemplateId = "default" | "skill_editor" | "vibe_coding" | "ship_attack";
|
|
29
29
|
type SkillEditorTemplateId = "skill_editor";
|
|
@@ -55,7 +55,7 @@ interface SessionSearchMatch {
|
|
|
55
55
|
declare const SessionInfo: arktype_internal_variants_object_ts.ObjectType<{
|
|
56
56
|
id: string;
|
|
57
57
|
intent: string;
|
|
58
|
-
status: "
|
|
58
|
+
status: "completed" | "failed" | "interrupted" | "running" | "created" | "waiting_for_input";
|
|
59
59
|
created_at: string;
|
|
60
60
|
updated_at: string;
|
|
61
61
|
shared?: boolean | undefined;
|
|
@@ -131,6 +131,11 @@ interface PrimarySkillSnapshot {
|
|
|
131
131
|
*/
|
|
132
132
|
interface SessionDetail extends SessionInfo {
|
|
133
133
|
primary_skill_snapshot?: PrimarySkillSnapshot | null;
|
|
134
|
+
/**
|
|
135
|
+
* 会话级环境变量(owner-only)。后端仅在 GET detail 和 PUT /env 响应中返回,
|
|
136
|
+
* 列表/搜索响应不带此字段。调用 setSessionEnv 后可类型安全地读回。
|
|
137
|
+
*/
|
|
138
|
+
env?: Record<string, string>;
|
|
134
139
|
}
|
|
135
140
|
|
|
136
141
|
export { type BizRole as B, LayoutType as L, type ModeId as M, type PrimarySkillParallelMode as P, SessionInfo as S, type TemplateId as T, SessionStatus as a, type SessionDetail as b, type Solution as c, type PrimarySkillSnapshot as d, type PrimarySkillStageSpec as e, type PrimarySkillStepSpec as f, type SkillEditorTemplateId as g };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blade-hq/agent-kit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.13",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/react/index.js",
|
|
6
6
|
"types": "./dist/react/index.d.ts",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"./workspace": "./dist/react/components/workspace/index.js",
|
|
21
21
|
"./api/sessions": "./dist/react/api/sessions.js",
|
|
22
22
|
"./api/licenses": "./dist/react/api/licenses.js",
|
|
23
|
+
"./api/published-apps": "./dist/react/api/published-apps.js",
|
|
23
24
|
"./api/vibe-coding": "./dist/react/api/vibe-coding.js",
|
|
24
25
|
"./cards/register": "./dist/react/cards/register.js",
|
|
25
26
|
"./devtools/bridge-devtools": "./dist/react/devtools/bridge-devtools/index.js",
|
|
@@ -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/env-buckets.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 ?? `请求失败(${response.status} ${response.statusText})`)\n this.name = \"BladeApiError\"\n this.response = response\n this.status = response.status\n this.statusText = response.statusText\n }\n}\n\n/**\n * 从 FastAPI 风格的错误响应中提取 detail 字段,作为用户可读的中文错误文案。\n * 失败时返回 undefined,调用方会回退到默认提示。\n */\nexport async function extractErrorDetail(response: Response): Promise<string | undefined> {\n try {\n const cloned = response.clone()\n const contentType = cloned.headers.get(\"content-type\") ?? \"\"\n if (contentType.includes(\"application/json\")) {\n const data = (await cloned.json()) as { detail?: unknown }\n const detail = data?.detail\n if (typeof detail === \"string\" && detail.trim()) return detail\n if (Array.isArray(detail) && detail.length > 0) {\n const first = detail[0] as { msg?: unknown }\n if (first && typeof first.msg === \"string\") return first.msg\n }\n } else {\n const text = (await cloned.text()).trim()\n if (text) return text\n }\n } catch {\n // 读取失败时忽略,使用默认提示\n }\n return undefined\n}\n\nexport type HttpMethod = \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\" | \"PUT\" | (string & {})\n\nexport interface BladeFetchInit {\n body?: BodyInit | null\n credentials?: RequestCredentials\n expectOk?: boolean\n headers?: HeadersInit\n signal?: AbortSignal | null\n}\n","import { BladeApiError } from \"../rest\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport interface ApiKeyPublic {\n id: string\n name: string\n masked: string\n created_at: string\n last_used_at: string | null\n /**\n * 完整 key 原文。后端按 #761 设计存明文,支持反复获取;存量 hash-only 行为 null。\n */\n plaintext: string | null\n}\n\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 { BladeClient } from \"../blade-client\"\n\nexport interface EnvBucket {\n bucket: string\n env: Record<string, string>\n}\n\nexport interface PlatformEnvBucket {\n env: Record<string, string>\n}\n\nexport class EnvBucketsResource {\n constructor(private client: BladeClient) {}\n\n // 当前用户的所有桶(global + 各 skill)\n listEnvBuckets(): Promise<EnvBucket[]> {\n return this.client.json(\"GET\", \"/api/user/env-buckets\")\n }\n\n getEnvBucket(bucket: string): Promise<EnvBucket> {\n return this.client.json(\"GET\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`)\n }\n\n setEnvBucket(bucket: string, env: Record<string, string>): Promise<EnvBucket> {\n return this.client.json(\"PUT\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`, { env })\n }\n\n async deleteEnvBucket(bucket: string): Promise<void> {\n await this.client.json(\"DELETE\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`)\n }\n\n // 平台桶(仅 admin 可写,所有用户共享)\n getPlatformEnv(): Promise<PlatformEnvBucket> {\n return this.client.json(\"GET\", \"/api/admin/env/global\")\n }\n\n // 平台桶只读视图:所有登录用户可读,用于「我的」面板显示平台默认值。\n getPlatformEnvReadonly(): Promise<PlatformEnvBucket> {\n return this.client.json(\"GET\", \"/api/env/platform\")\n }\n\n setPlatformEnv(env: Record<string, string>): Promise<PlatformEnvBucket> {\n return this.client.json(\"PUT\", \"/api/admin/env/global\", { env })\n }\n\n async deletePlatformEnv(): Promise<void> {\n await this.client.json(\"DELETE\", \"/api/admin/env/global\")\n }\n}\n","import type { GisState, RuntimeConfig } from \"../../react/schemas/gis\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport class GisResource {\n constructor(private client: BladeClient) {}\n\n fetchGisState(sessionId: string, init?: RequestInit): Promise<GisState> {\n return this.client.jsonFromInit(`/api/gis/${sessionId}/state`, init)\n }\n\n fetchRuntimeConfig(init?: RequestInit): Promise<RuntimeConfig> {\n return this.client.jsonFromInit(\"/api/config\", init)\n }\n}\n","import type { BladeClient } from \"../blade-client\"\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 {\n PartnerSkillInstallPayload,\n PartnerSkillInstallResult,\n SessionSkillUploadPayload,\n SessionSkillUploadResult,\n} from \"../../react/schemas/partner-skill\"\nimport type { SkillDetail, SkillSearchResult, SkillStats, SkillSummary } from \"../../react/schemas/skill\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport interface GlobalSkillStats {\n remote_configured: boolean\n remote_connected: boolean\n installed_skill_count: number\n}\n\n// 远程 registry 已安装 skill 的最小字段集。\n// 后端原样透传 registry 的 /api/me/skills 响应里的 skills 数组。\nexport interface InstalledRegistrySkill {\n id: string\n name: string\n description?: string | null\n is_installed?: boolean\n is_preset?: boolean\n preinstalled?: boolean\n org_display_name?: string | null\n // True 表示该 skill 自带 tools.py(代码型)。旧版 bh 不返回此字段时为 undefined。\n has_tools?: boolean\n}\n\nexport class SkillsResource {\n constructor(private client: BladeClient) {}\n\n listSkills(init?: RequestInit): Promise<SkillSummary[]> {\n return this.client.jsonFromInit(\"/api/skills\", init)\n }\n\n listInstalledRegistrySkills(init?: RequestInit): Promise<InstalledRegistrySkill[]> {\n return this.client.jsonFromInit(\"/api/skills/installed\", init)\n }\n\n listSessionSkills(sessionId: string, init?: RequestInit): Promise<SkillSummary[]> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skills`, init)\n }\n\n resyncSkills(\n sessionId: string,\n init?: RequestInit,\n ): Promise<{ detail?: string; copied: number; removed: number; preserved: number }> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skills:resync`, {\n method: \"POST\",\n ...init,\n })\n }\n\n async searchSkills(query: string, limit = 10, init?: RequestInit): Promise<SkillSearchResult[]> {\n const params = new URLSearchParams({ q: query, limit: String(limit) })\n const response = await this.client.jsonFromInit<{ results: SkillSearchResult[] }>(\n `/api/skills/search?${params}`,\n init,\n )\n return response.results\n }\n\n getSkillStats(sessionId: string, init?: RequestInit): Promise<SkillStats> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skill-stats`, init)\n }\n\n getGlobalSkillStats(init?: RequestInit): Promise<GlobalSkillStats> {\n return this.client.jsonFromInit(\"/api/skill-store/stats\", init)\n }\n\n getSkill(skillName: string, init?: RequestInit): Promise<SkillDetail> {\n return this.client.jsonFromInit(`/api/skills/${encodeURIComponent(skillName)}`, init)\n }\n\n uploadSessionSkill(\n sessionId: string,\n payload: SessionSkillUploadPayload,\n init?: RequestInit,\n ): Promise<SessionSkillUploadResult> {\n return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/skills:upload`, {\n method: \"POST\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n installPartnerSkill(\n sessionId: string,\n payload: PartnerSkillInstallPayload,\n init?: RequestInit,\n ): Promise<PartnerSkillInstallResult> {\n return this.uploadSessionSkill(sessionId, payload, init)\n }\n}\n","import type { 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 type ComputerUpgradeReason =\n | \"no_container\"\n | \"no_target\"\n | \"current_latest\"\n | \"up_to_date\"\n | \"upgrade_available\"\n\nexport interface ComputerUpgradeStatusResponse {\n upgrade_available: boolean\n reason: ComputerUpgradeReason\n current_version: string | null\n target_version: string | null\n}\n\nexport interface UpgradeComputerResponse {\n target_version: string | null\n previous_version: string | null\n removed_containers: number\n removed_volume: boolean\n cleared_memo: number\n}\n\nexport class UserPreferencesResource {\n constructor(private client: BladeClient) {}\n\n async getUserPreference(key: string): Promise<string | null> {\n const response = await this.client.json<{ value: string | null }>(\n \"GET\",\n `/api/user/preferences/${encodeURIComponent(key)}`,\n )\n return response.value\n }\n\n async setUserPreference(key: string, value: string): Promise<void> {\n await this.client.json<{ value: string }>(\n \"PUT\",\n `/api/user/preferences/${encodeURIComponent(key)}`,\n { value },\n )\n }\n\n async getPersistentDefault(): Promise<boolean> {\n const response = await this.client.json<{ value: string | null }>(\n \"GET\",\n \"/api/users/me/preferences/sandbox.persistent_default\",\n )\n return response.value === \"true\"\n }\n\n async setPersistentDefault(value: boolean): Promise<void> {\n await this.client.json<{ value: string }>(\n \"PUT\",\n \"/api/users/me/preferences/sandbox.persistent_default\",\n { value: value ? \"true\" : \"false\" },\n )\n }\n\n async resetComputer(): Promise<void> {\n await this.client.json(\"POST\", \"/api/users/me/reset-computer\", {})\n }\n\n async getComputerUpgradeStatus(): Promise<ComputerUpgradeStatusResponse> {\n return await this.client.json<ComputerUpgradeStatusResponse>(\n \"GET\",\n \"/api/users/me/computer-upgrade\",\n )\n }\n\n async upgradeComputer(): Promise<UpgradeComputerResponse> {\n return await this.client.json<UpgradeComputerResponse>(\n \"POST\",\n \"/api/users/me/upgrade-computer\",\n {},\n )\n }\n}\n","import 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, extractErrorDetail } from \"./rest\"\nimport { ApiKeysResource } from \"./resources/api-keys\"\nimport { AuthResource } from \"./resources/auth\"\nimport { EnvBucketsResource } from \"./resources/env-buckets\"\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 envBuckets: EnvBucketsResource\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.envBuckets = new EnvBucketsResource(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 const detail = await extractErrorDetail(response)\n throw new BladeApiError(response, detail)\n }\n return response\n }\n\n buildAuthedUrl(path: string): string {\n const url = new URL(this.toBaseRelativePath(path), this.baseUrlWithTrailingSlash())\n const token = this.resolveTokenForUrl(url)\n if (token) {\n url.searchParams.set(\"token\", token)\n }\n return url.toString()\n }\n\n private buildHeaders(url: URL, headers?: HeadersInit): Headers {\n const result = new Headers(headers)\n if (!this.isSameBackendUrl(url)) {\n return result\n }\n const token = this.resolveRestToken()\n if (token) {\n result.set(\"Authorization\", `Bearer ${token}`)\n }\n return result\n }\n\n private buildUrl(path: string): URL {\n return new URL(this.toBaseRelativePath(path), this.baseUrlWithTrailingSlash())\n }\n\n private baseUrlWithTrailingSlash(): string {\n return this.options.baseUrl.endsWith(\"/\") ? this.options.baseUrl : `${this.options.baseUrl}/`\n }\n\n private toBaseRelativePath(path: string): string {\n return path.startsWith(\"/\") ? path.slice(1) : path\n }\n\n private isSameBackendUrl(url: URL): boolean {\n const base = new URL(this.baseUrlWithTrailingSlash())\n if (url.origin !== base.origin) {\n return false\n }\n const basePath = base.pathname.replace(/\\/+$/, \"\")\n if (basePath === \"\") {\n return true\n }\n return url.pathname === basePath || url.pathname.startsWith(`${basePath}/`)\n }\n\n private shouldRefreshFor401(url: URL): boolean {\n const refreshUrl = this.buildUrl(REFRESH_PATH)\n return (\n this.isSameBackendUrl(url) &&\n url.pathname !== refreshUrl.pathname &&\n !this.hasExplicitBearerToken()\n )\n }\n\n private hasExplicitBearerToken(): boolean {\n return this.options.token !== undefined\n }\n\n private async tryRefresh(): Promise<boolean> {\n if (this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.refreshPromise = (async () => {\n try {\n const response = await (this.options.fetchImpl ?? fetch)(\n this.buildUrl(REFRESH_PATH).toString(),\n {\n method: \"POST\",\n credentials: \"include\",\n },\n )\n if (!response.ok) {\n return false\n }\n await this.options.onRefreshSuccess?.()\n return true\n } catch {\n return false\n } finally {\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n private resolveTokenForUrl(url: URL): string | null {\n if (!this.isSameBackendUrl(url)) {\n return null\n }\n return this.resolveRestToken()\n }\n\n private resolveRestToken(): string | null {\n return this.resolveToken(this.storeRestTokenResolver)\n }\n\n private resolveSocketToken(): string | null {\n return this.resolveToken(this.storeSocketTokenResolver)\n }\n\n private resolveToken(resolver: (() => string | null | undefined) | null): string | null {\n const token =\n this.options.token === undefined\n ? resolver?.()\n : typeof this.options.token === \"function\"\n ? this.options.token()\n : this.options.token\n return token ? token : null\n }\n}\n\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":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|