@blade-hq/agent-kit 0.5.19 → 0.5.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/{SkillStatusBar-DR-R6Mpa.d.ts → SkillStatusBar-Dn5im-__.d.ts} +1 -1
  2. package/dist/{blade-client-ByosYYkS.d.ts → blade-client-Bhp0hHiZ.d.ts} +21 -1
  3. package/dist/{chunk-SZKVEYL6.js → chunk-7EVVRQ7G.js} +58 -9
  4. package/dist/chunk-7EVVRQ7G.js.map +1 -0
  5. package/dist/{chunk-RQUD3FGD.js → chunk-HLRMETK7.js} +2 -2
  6. package/dist/{chunk-GIY3MV6F.js → chunk-QJG7TK2W.js} +2 -2
  7. package/dist/{chunk-SPHQXYME.js → chunk-RNSHL4GA.js} +6 -6
  8. package/dist/chunk-RNSHL4GA.js.map +1 -0
  9. package/dist/{chunk-AN45BWO7.js → chunk-SKCCDOY2.js} +50 -31
  10. package/dist/chunk-SKCCDOY2.js.map +1 -0
  11. package/dist/{chunk-MEAVJOEQ.js → chunk-YJ7GDLMH.js} +2 -2
  12. package/dist/client/index.d.ts +240 -1
  13. package/dist/client/index.js +1 -1
  14. package/dist/react/api/vibe-coding.d.ts +2 -2
  15. package/dist/react/api/vibe-coding.js +2 -2
  16. package/dist/react/components/chat/index.d.ts +3 -3
  17. package/dist/react/components/chat/index.js +5 -5
  18. package/dist/react/components/plan/index.js +3 -3
  19. package/dist/react/components/session/index.js +3 -3
  20. package/dist/react/components/workspace/index.js +3 -3
  21. package/dist/react/index.d.ts +4 -4
  22. package/dist/react/index.js +6 -6
  23. package/dist/style.css +1 -1
  24. package/package.json +1 -1
  25. package/dist/chunk-AN45BWO7.js.map +0 -1
  26. package/dist/chunk-SPHQXYME.js.map +0 -1
  27. package/dist/chunk-SZKVEYL6.js.map +0 -1
  28. /package/dist/{chunk-RQUD3FGD.js.map → chunk-HLRMETK7.js.map} +0 -0
  29. /package/dist/{chunk-GIY3MV6F.js.map → chunk-QJG7TK2W.js.map} +0 -0
  30. /package/dist/{chunk-MEAVJOEQ.js.map → chunk-YJ7GDLMH.js.map} +0 -0
@@ -4,7 +4,7 @@ import { ComponentType, ReactNode } from 'react';
4
4
  import { C as ChatMessage, A as AskUserAnswerData, T as ToolCallInfo, M as MessageContent } from './AskUserQuestionBlock---kOTouk.js';
5
5
  import * as zustand from 'zustand';
6
6
  import { M as ModeId, S as SessionInfo, a as SessionStatus } from './session-BuaeCsMC.js';
7
- import { j as BladeClient } from './blade-client-ByosYYkS.js';
7
+ import { j as BladeClient } from './blade-client-Bhp0hHiZ.js';
8
8
  import { C as ContentBlock } from './projection-BWYEFYNn.js';
9
9
 
10
10
  /**
@@ -29,6 +29,10 @@ interface ApiKeyPublic {
29
29
  * 完整 key 原文。后端按 #761 设计存明文,支持反复获取;存量 hash-only 行为 null。
30
30
  */
31
31
  plaintext: string | null;
32
+ /**
33
+ * 只读行(如经 bo 经纪人下发的 GIT_ACCESS_TOKEN):UI 只给复制,不给改名/撤销。
34
+ */
35
+ readonly?: boolean;
32
36
  }
33
37
  interface ApiKeyCreateResponse {
34
38
  key: ApiKeyPublic;
@@ -153,6 +157,11 @@ interface HeadlessRunOptions {
153
157
  model?: string | null;
154
158
  timeoutMs?: number;
155
159
  }
160
+ interface HeadlessRunInSessionResult<T = unknown> {
161
+ session_id: string;
162
+ chat_run_id: string | null;
163
+ result: T | string;
164
+ }
156
165
  declare class HeadlessError extends Error {
157
166
  readonly detail?: unknown | undefined;
158
167
  constructor(message: string, detail?: unknown | undefined);
@@ -164,6 +173,15 @@ declare class HeadlessResource {
164
173
  schema: JsonSchemaObject;
165
174
  }): Promise<T>;
166
175
  run(prompt: string, options?: HeadlessRunOptions): Promise<string>;
176
+ runInSession<T = unknown>(sessionId: string, prompt: string, options: HeadlessRunOptions & {
177
+ schema: JsonSchemaObject;
178
+ }): Promise<T>;
179
+ runInSession(sessionId: string, prompt: string, options?: HeadlessRunOptions): Promise<string>;
180
+ runWithSession<T = unknown>(prompt: string, options: HeadlessRunOptions & {
181
+ schema: JsonSchemaObject;
182
+ }): Promise<HeadlessRunInSessionResult<T>>;
183
+ runWithSession(prompt: string, options?: HeadlessRunOptions): Promise<HeadlessRunInSessionResult<string>>;
184
+ private runTracked;
167
185
  }
168
186
 
169
187
  interface Memory {
@@ -1253,11 +1271,13 @@ declare namespace ChatEndPayloadSchema {
1253
1271
  type SessionId = (string | null);
1254
1272
  type Status = (string | null);
1255
1273
  type FinishReason = (string | null);
1274
+ type ChatRunId = (string | null);
1256
1275
  interface ChatEndPayload {
1257
1276
  session_id?: SessionId;
1258
1277
  status?: Status;
1259
1278
  result?: unknown;
1260
1279
  finish_reason?: FinishReason;
1280
+ chat_run_id?: ChatRunId;
1261
1281
  [k: string]: unknown;
1262
1282
  }
1263
1283
  }
@@ -1654,4 +1674,4 @@ interface UploadProgress {
1654
1674
  percent?: number;
1655
1675
  }
1656
1676
 
1657
- export { ModelsResource as $, type ApiKeyCreateResponse as A, BladeApiError as B, type CreateVibeCodingSessionResult as C, type DeployBumpMode as D, type CreateSoftwareFactorySoftwarePayload as E, type FileEntry as F, GisResource as G, type GlobalSkillStats as H, HeadlessError as I, HeadlessResource as J, type HeadlessRunOptions as K, type HistoryNode as L, type HttpMethod as M, type ImportPreview as N, type ImportPreviewScenario as O, type PortMapping as P, type ImportPreviewSkill as Q, type InstalledRegistrySkill as R, type JsonSchemaObject as S, MemoriesResource as T, type Memory as U, VibeCodingResource as V, type MemoryCreateBody as W, type MemoryListParams as X, type MemoryListResponse as Y, ModelOption as Z, ModelsConfig as _, type VibeCodingDeployStatus as a, AgentResource as a$, type PaginatedSessionsResult as a0, type PreviewUrlItem as a1, type ProvidersResponse as a2, PublishedAppsResource as a3, type QuickScenario as a4, REGISTRY_PREFIX as a5, RegistryResource as a6, type ResourceApi as a7, ScenariosResource as a8, type ServerToClientEvents as a9, UserPreferencesResource as aA, createSocket as aB, normalizeResource as aC, EnvBucketsResource as aD, type EnvBucket as aE, type PlatformEnvBucket as aF, type GisState as aG, type RuntimeConfig as aH, type SkillDetail as aI, type SkillStats as aJ, type SkillSummary as aK, type SkillSearchResult as aL, PartnerSkillInstallPayload as aM, PartnerSkillInstallResult as aN, SessionSkillUploadPayload as aO, SessionSkillUploadResult as aP, PublishedApp as aQ, PublishedAppListResponse as aR, PublishedAppStatus as aS, UnpublishAppResponse as aT, type BackgroundTask as aU, type GisGoal as aV, type GisResource$1 as aW, type GisTarget as aX, type GisMapCommand as aY, Task as aZ, AgentDriver as a_, type SessionContextStats as aa, type SessionHistory as ab, type SessionUpdatedPayload as ac, SessionsResource as ad, type ShareLinkResult as ae, type SkillDevSession as af, type SkillOrgListResponse as ag, type SkillOrgOption as ah, SkillsResource as ai, type SoftwareFactoryModuleBlueprint as aj, SoftwareFactoryResource as ak, type SoftwareFactorySharedFile as al, type SoftwareFactorySoftware as am, type SoftwareFactoryTopic as an, type SoftwareFactoryTopicModule as ao, SolutionsResource as ap, type SystemErrorPayload as aq, type SystemNotificationPayload as ar, type TokenizeResult as as, type TurnProjectionPayload as at, type TypedSocket as au, type UpdateQuickScenarioPayload as av, type UpgradeComputerResponse as aw, type UploadFileEntry as ax, type UploadFilesOptions as ay, type UserInfo as az, type VibeCodingDebugSessionStatus as b, DatabaseDriver as b0, DatabaseResource as b1, DifyKnowledgeConfig as b2, type GisGoalStatus as b3, HttpToolConfig as b4, KnowledgeDriver as b5, KnowledgeResource as b6, McpToolConfig as b7, MysqlConfig as b8, type ParallelMode as b9, PartnerSkillFile as ba, PartnerSkillName as bb, PostgresqlConfig as bc, SessionSkillFile as bd, SessionSkillName as be, type StageSpec as bf, type StepSpec as bg, TaskStatus as bh, ToolDriver as bi, ToolResource as bj, skillDisplayName as bk, type VibeCodingSessionStatus as c, type VibeCodingDeployRecord as d, type VibeCodingSessionInfo as e, type CreateVibeCodingSessionParams as f, type ApiKeyPublic as g, ApiKeysResource as h, AuthResource as i, BladeClient as j, type BladeClientOptions as k, type BladeFetchInit as l, type BladeHubScenarioResource as m, type ChatEndPayload as n, type ChatSendPayload as o, type CheckpointNode as p, type ClientToServerEvents as q, type CodingTask as r, type CodingTaskTopic as s, type ComputerUpgradeReason as t, type ComputerUpgradeStatusResponse as u, type ContentPart as v, type CreateQuickScenarioPayload as w, type CreateSessionRequest as x, type CreateSocketOptions as y, type CreateSoftwareFactorySharedFilePayload as z };
1677
+ export { ModelsConfig as $, type ApiKeyCreateResponse as A, BladeApiError as B, type CreateVibeCodingSessionResult as C, type DeployBumpMode as D, type CreateSoftwareFactorySoftwarePayload as E, type FileEntry as F, GisResource as G, type GlobalSkillStats as H, HeadlessError as I, HeadlessResource as J, type HeadlessRunInSessionResult as K, type HeadlessRunOptions as L, type HistoryNode as M, type HttpMethod as N, type ImportPreview as O, type PortMapping as P, type ImportPreviewScenario as Q, type ImportPreviewSkill as R, type InstalledRegistrySkill as S, type JsonSchemaObject as T, MemoriesResource as U, VibeCodingResource as V, type Memory as W, type MemoryCreateBody as X, type MemoryListParams as Y, type MemoryListResponse as Z, ModelOption as _, type VibeCodingDeployStatus as a, AgentDriver as a$, ModelsResource as a0, type PaginatedSessionsResult as a1, type PreviewUrlItem as a2, type ProvidersResponse as a3, PublishedAppsResource as a4, type QuickScenario as a5, REGISTRY_PREFIX as a6, RegistryResource as a7, type ResourceApi as a8, ScenariosResource as a9, type UserInfo as aA, UserPreferencesResource as aB, createSocket as aC, normalizeResource as aD, EnvBucketsResource as aE, type EnvBucket as aF, type PlatformEnvBucket as aG, type GisState as aH, type RuntimeConfig as aI, type SkillDetail as aJ, type SkillStats as aK, type SkillSummary as aL, type SkillSearchResult as aM, PartnerSkillInstallPayload as aN, PartnerSkillInstallResult as aO, SessionSkillUploadPayload as aP, SessionSkillUploadResult as aQ, PublishedApp as aR, PublishedAppListResponse as aS, PublishedAppStatus as aT, UnpublishAppResponse as aU, type BackgroundTask as aV, type GisGoal as aW, type GisResource$1 as aX, type GisTarget as aY, type GisMapCommand as aZ, Task as a_, type ServerToClientEvents as aa, type SessionContextStats as ab, type SessionHistory as ac, type SessionUpdatedPayload as ad, SessionsResource as ae, type ShareLinkResult as af, type SkillDevSession as ag, type SkillOrgListResponse as ah, type SkillOrgOption as ai, SkillsResource as aj, type SoftwareFactoryModuleBlueprint as ak, SoftwareFactoryResource as al, type SoftwareFactorySharedFile as am, type SoftwareFactorySoftware as an, type SoftwareFactoryTopic as ao, type SoftwareFactoryTopicModule as ap, SolutionsResource as aq, type SystemErrorPayload as ar, type SystemNotificationPayload as as, type TokenizeResult as at, type TurnProjectionPayload as au, type TypedSocket as av, type UpdateQuickScenarioPayload as aw, type UpgradeComputerResponse as ax, type UploadFileEntry as ay, type UploadFilesOptions as az, type VibeCodingDebugSessionStatus as b, AgentResource as b0, DatabaseDriver as b1, DatabaseResource as b2, DifyKnowledgeConfig as b3, type GisGoalStatus as b4, HttpToolConfig as b5, KnowledgeDriver as b6, KnowledgeResource as b7, McpToolConfig as b8, MysqlConfig as b9, type ParallelMode as ba, PartnerSkillFile as bb, PartnerSkillName as bc, PostgresqlConfig as bd, SessionSkillFile as be, SessionSkillName as bf, type StageSpec as bg, type StepSpec as bh, TaskStatus as bi, ToolDriver as bj, ToolResource as bk, skillDisplayName as bl, type VibeCodingSessionStatus as c, type VibeCodingDeployRecord as d, type VibeCodingSessionInfo as e, type CreateVibeCodingSessionParams as f, type ApiKeyPublic as g, ApiKeysResource as h, AuthResource as i, BladeClient as j, type BladeClientOptions as k, type BladeFetchInit as l, type BladeHubScenarioResource as m, type ChatEndPayload as n, type ChatSendPayload as o, type CheckpointNode as p, type ClientToServerEvents as q, type CodingTask as r, type CodingTaskTopic as s, type ComputerUpgradeReason as t, type ComputerUpgradeStatusResponse as u, type ContentPart as v, type CreateQuickScenarioPayload as w, type CreateSessionRequest as x, type CreateSocketOptions as y, type CreateSoftwareFactorySharedFilePayload as z };
@@ -153,19 +153,35 @@ var HeadlessResource = class {
153
153
  }
154
154
  client;
155
155
  async run(prompt, options = {}) {
156
- const timeoutMs = options.timeoutMs ?? 3e5;
157
156
  const { session_id } = await this.client.sessions.createSessionWithRequest({
158
157
  intent: prompt,
159
158
  model: options.model ?? null
160
159
  });
160
+ return this.runTracked(session_id, prompt, options, false);
161
+ }
162
+ async runInSession(sessionId, prompt, options = {}) {
163
+ return this.runTracked(sessionId, prompt, options, false);
164
+ }
165
+ async runWithSession(prompt, options = {}) {
166
+ const { session_id } = await this.client.sessions.createSessionWithRequest({
167
+ intent: prompt,
168
+ model: options.model ?? null
169
+ });
170
+ return this.runTracked(session_id, prompt, options, true);
171
+ }
172
+ async runTracked(sessionId, prompt, options, returnEnvelope) {
173
+ const timeoutMs = options.timeoutMs ?? 3e5;
174
+ const session_id = sessionId;
161
175
  const socket = this.client.socket();
162
- await ensureSocketConnected(socket, timeoutMs);
176
+ await ensureSocketConnected(socket, timeoutMs, { session_id });
163
177
  return new Promise((resolve, reject) => {
164
178
  let settled = false;
165
179
  let stopSent = false;
180
+ let started = false;
181
+ let chatRunId = null;
166
182
  let systemErrorTimeout = null;
167
183
  const timeout = setTimeout(() => {
168
- fail(new HeadlessError(`headless run timed out after ${timeoutMs}ms`, { session_id }));
184
+ fail(new HeadlessError(`headless run timed out after ${timeoutMs}ms`, { session_id, chat_run_id: chatRunId }));
169
185
  }, timeoutMs);
170
186
  const cleanup = (sendStop) => {
171
187
  clearTimeout(timeout);
@@ -173,6 +189,7 @@ var HeadlessResource = class {
173
189
  clearTimeout(systemErrorTimeout);
174
190
  systemErrorTimeout = null;
175
191
  }
192
+ socket.off("chat:start", onChatStart);
176
193
  socket.off("chat:end", onChatEnd);
177
194
  socket.off("system:error", onSystemError);
178
195
  if (sendStop && !stopSent) {
@@ -185,6 +202,10 @@ var HeadlessResource = class {
185
202
  if (settled) return;
186
203
  settled = true;
187
204
  cleanup(false);
205
+ if (returnEnvelope) {
206
+ resolve({ session_id, chat_run_id: chatRunId, result: value });
207
+ return;
208
+ }
188
209
  resolve(value);
189
210
  };
190
211
  const fail = (error) => {
@@ -193,27 +214,54 @@ var HeadlessResource = class {
193
214
  cleanup(true);
194
215
  reject(error);
195
216
  };
217
+ const failWithoutStop = (error) => {
218
+ if (settled) return;
219
+ settled = true;
220
+ cleanup(false);
221
+ reject(error);
222
+ };
196
223
  const rejectAfterChatEnd = (error) => {
197
224
  if (settled) return;
198
225
  settled = true;
199
226
  cleanup(false);
200
227
  reject(error);
201
228
  };
229
+ function onChatStart(payload) {
230
+ if (payload.session_id && payload.session_id !== session_id) return;
231
+ started = true;
232
+ }
202
233
  function onSystemError(payload) {
203
234
  if (payload.session_id !== session_id) return;
235
+ if (!started) {
236
+ failWithoutStop(new HeadlessError(payload.message || "headless run failed", {
237
+ session_id,
238
+ chat_run_id: chatRunId,
239
+ event: payload
240
+ }));
241
+ return;
242
+ }
204
243
  if (systemErrorTimeout) {
205
244
  clearTimeout(systemErrorTimeout);
206
245
  }
207
246
  systemErrorTimeout = setTimeout(() => {
208
247
  systemErrorTimeout = null;
209
- fail(new HeadlessError(payload.message || "headless run failed", payload));
248
+ fail(new HeadlessError(payload.message || "headless run failed", {
249
+ session_id,
250
+ chat_run_id: chatRunId,
251
+ event: payload
252
+ }));
210
253
  }, SYSTEM_ERROR_CHAT_END_GRACE_MS);
211
254
  }
212
255
  function onChatEnd(payload) {
213
256
  if (payload.session_id && payload.session_id !== session_id) return;
257
+ chatRunId = typeof payload.chat_run_id === "string" ? payload.chat_run_id : chatRunId;
214
258
  const result = payload.result;
215
259
  if (payload.status === "failed") {
216
- rejectAfterChatEnd(new HeadlessError(errorMessageFromResult(result) ?? "headless run failed", payload));
260
+ rejectAfterChatEnd(new HeadlessError(errorMessageFromResult(result) ?? "headless run failed", {
261
+ session_id,
262
+ chat_run_id: chatRunId,
263
+ event: payload
264
+ }));
217
265
  return;
218
266
  }
219
267
  try {
@@ -222,6 +270,7 @@ var HeadlessResource = class {
222
270
  rejectAfterChatEnd(error);
223
271
  }
224
272
  }
273
+ socket.on("chat:start", onChatStart);
225
274
  socket.on("chat:end", onChatEnd);
226
275
  socket.on("system:error", onSystemError);
227
276
  socket.emit("session:subscribe", { session_id });
@@ -259,18 +308,18 @@ function errorMessageFromResult(result) {
259
308
  function isRecord(value) {
260
309
  return typeof value === "object" && value !== null && !Array.isArray(value);
261
310
  }
262
- function ensureSocketConnected(socket, timeoutMs) {
311
+ function ensureSocketConnected(socket, timeoutMs, detail) {
263
312
  if (socket.connected) {
264
313
  return Promise.resolve();
265
314
  }
266
315
  return new Promise((resolve, reject) => {
267
316
  let settled = false;
268
317
  const timeout = setTimeout(() => {
269
- finish(() => reject(new HeadlessError(`socket connection timed out after ${timeoutMs}ms`)));
318
+ finish(() => reject(new HeadlessError(`socket connection timed out after ${timeoutMs}ms`, detail)));
270
319
  }, timeoutMs);
271
320
  const onConnect = () => finish(resolve);
272
321
  const onConnectError = (error) => {
273
- finish(() => reject(new HeadlessError("socket connection failed", error)));
322
+ finish(() => reject(new HeadlessError("socket connection failed", { ...detail, event: error })));
274
323
  };
275
324
  const finish = (callback) => {
276
325
  if (settled) return;
@@ -1414,4 +1463,4 @@ export {
1414
1463
  createSocket,
1415
1464
  BladeClient
1416
1465
  };
1417
- //# sourceMappingURL=chunk-SZKVEYL6.js.map
1466
+ //# sourceMappingURL=chunk-7EVVRQ7G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/rest.ts","../src/client/resources/api-keys.ts","../src/client/resources/auth.ts","../src/client/resources/env-buckets.ts","../src/client/resources/gis.ts","../src/client/resources/headless.ts","../src/client/resources/memories.ts","../src/client/resources/models.ts","../src/react/schemas/published-apps.ts","../src/client/resources/published-apps.ts","../src/client/resources/registry.ts","../src/client/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 * 只读行(如经 bo 经纪人下发的 GIT_ACCESS_TOKEN):UI 只给复制,不给改名/撤销。\n */\n readonly?: boolean\n}\n\nexport interface ApiKeyCreateResponse {\n key: ApiKeyPublic\n plaintext: string\n}\n\nexport class ApiKeysResource {\n constructor(private client: BladeClient) {}\n\n listApiKeys(): Promise<ApiKeyPublic[]> {\n return this.client.json(\"GET\", \"/api/user/api-keys/\")\n }\n\n createApiKey(name: string): Promise<ApiKeyCreateResponse> {\n return this.client.json(\"POST\", \"/api/user/api-keys/\", { name })\n }\n\n renameApiKey(id: string, name: string): Promise<ApiKeyPublic> {\n return this.client.json(\"PATCH\", `/api/user/api-keys/${encodeURIComponent(id)}`, { name })\n }\n\n async deleteApiKey(id: string): Promise<void> {\n try {\n await this.client.json(\"DELETE\", `/api/user/api-keys/${encodeURIComponent(id)}`)\n } catch (err) {\n if (err instanceof BladeApiError) {\n const detail = await readErrorDetail(err.response)\n if (detail) {\n throw new Error(detail)\n }\n }\n throw err\n }\n }\n}\n\nasync function readErrorDetail(response: Response): Promise<string | null> {\n try {\n const data = await response.clone().json()\n const detail = data?.detail\n return typeof detail === \"string\" && detail.trim() ? detail : null\n } catch {\n return null\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface UserInfo {\n id: string\n username: string\n display_name?: string | null\n avatar_url: string | null\n token: string\n auth_type: \"casdoor\"\n is_admin?: boolean\n}\n\nexport interface ProvidersResponse {\n providers: Array<{\n name: string\n authorize_url: string\n }>\n password_enabled: boolean\n}\n\nexport class AuthResource {\n constructor(private client: BladeClient) {}\n\n getProviders(): Promise<ProvidersResponse> {\n return this.client.json(\"GET\", \"/api/auth/providers\")\n }\n\n getMe(): Promise<UserInfo> {\n return this.client.json(\"GET\", \"/api/auth/me\")\n }\n\n logout(): Promise<{ logout_url: string }> {\n return this.client.json(\"POST\", \"/api/auth/logout\")\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface EnvBucket {\n bucket: string\n env: Record<string, string>\n}\n\nexport interface PlatformEnvBucket {\n env: Record<string, string>\n}\n\nexport class EnvBucketsResource {\n constructor(private client: BladeClient) {}\n\n // 当前用户的所有桶(global + 各 skill)\n listEnvBuckets(): Promise<EnvBucket[]> {\n return this.client.json(\"GET\", \"/api/user/env-buckets\")\n }\n\n getEnvBucket(bucket: string): Promise<EnvBucket> {\n return this.client.json(\"GET\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`)\n }\n\n setEnvBucket(bucket: string, env: Record<string, string>): Promise<EnvBucket> {\n return this.client.json(\"PUT\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`, { env })\n }\n\n async deleteEnvBucket(bucket: string): Promise<void> {\n await this.client.json(\"DELETE\", `/api/user/env-buckets/${encodeURIComponent(bucket)}`)\n }\n\n // 平台桶(仅 admin 可写,所有用户共享)\n getPlatformEnv(): Promise<PlatformEnvBucket> {\n return this.client.json(\"GET\", \"/api/admin/env/global\")\n }\n\n // 平台桶只读视图:所有登录用户可读,用于「我的」面板显示平台默认值。\n getPlatformEnvReadonly(): Promise<PlatformEnvBucket> {\n return this.client.json(\"GET\", \"/api/env/platform\")\n }\n\n setPlatformEnv(env: Record<string, string>): Promise<PlatformEnvBucket> {\n return this.client.json(\"PUT\", \"/api/admin/env/global\", { env })\n }\n\n async deletePlatformEnv(): Promise<void> {\n await this.client.json(\"DELETE\", \"/api/admin/env/global\")\n }\n}\n","import type { GisState, RuntimeConfig } from \"../../react/schemas/gis\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport class GisResource {\n constructor(private client: BladeClient) {}\n\n fetchGisState(sessionId: string, init?: RequestInit): Promise<GisState> {\n return this.client.jsonFromInit(`/api/gis/${sessionId}/state`, init)\n }\n\n fetchRuntimeConfig(init?: RequestInit): Promise<RuntimeConfig> {\n return this.client.jsonFromInit(\"/api/config\", init)\n }\n}\n","import type { BladeClient } from \"../blade-client\"\nimport type { ChatEndPayload, ChatSendPayload, ChatStartPayload, SystemErrorPayload } from \"../types/socket-events\"\n\nexport type JsonSchemaObject = Record<string, unknown>\n\nexport interface HeadlessRunOptions {\n schema?: JsonSchemaObject | null\n model?: string | null\n timeoutMs?: number\n}\n\nexport interface HeadlessRunInSessionResult<T = unknown> {\n session_id: string\n chat_run_id: string | null\n result: T | string\n}\n\nexport class HeadlessError extends Error {\n constructor(\n message: string,\n readonly detail?: unknown,\n ) {\n super(message)\n this.name = \"HeadlessError\"\n }\n}\n\nconst SYSTEM_ERROR_CHAT_END_GRACE_MS = 1_000\n\nexport class HeadlessResource {\n constructor(private client: BladeClient) {}\n\n async run<T = unknown>(prompt: string, options: HeadlessRunOptions & { schema: JsonSchemaObject }): Promise<T>\n async run(prompt: string, options?: HeadlessRunOptions): Promise<string>\n async run<T = unknown>(prompt: string, options: HeadlessRunOptions = {}): Promise<T | string> {\n const { session_id } = await this.client.sessions.createSessionWithRequest({\n intent: prompt,\n model: options.model ?? null,\n })\n return this.runTracked<T>(session_id, prompt, options, false) as Promise<T | string>\n }\n\n async runInSession<T = unknown>(\n sessionId: string,\n prompt: string,\n options: HeadlessRunOptions & { schema: JsonSchemaObject },\n ): Promise<T>\n async runInSession(sessionId: string, prompt: string, options?: HeadlessRunOptions): Promise<string>\n async runInSession<T = unknown>(\n sessionId: string,\n prompt: string,\n options: HeadlessRunOptions = {},\n ): Promise<T | string> {\n return this.runTracked<T>(sessionId, prompt, options, false) as Promise<T | string>\n }\n\n async runWithSession<T = unknown>(\n prompt: string,\n options: HeadlessRunOptions & { schema: JsonSchemaObject },\n ): Promise<HeadlessRunInSessionResult<T>>\n async runWithSession(prompt: string, options?: HeadlessRunOptions): Promise<HeadlessRunInSessionResult<string>>\n async runWithSession<T = unknown>(\n prompt: string,\n options: HeadlessRunOptions = {},\n ): Promise<HeadlessRunInSessionResult<T>> {\n const { session_id } = await this.client.sessions.createSessionWithRequest({\n intent: prompt,\n model: options.model ?? null,\n })\n return this.runTracked<T>(session_id, prompt, options, true) as Promise<HeadlessRunInSessionResult<T>>\n }\n\n private async runTracked<T = unknown>(\n sessionId: string,\n prompt: string,\n options: HeadlessRunOptions,\n returnEnvelope: boolean,\n ): Promise<T | string | HeadlessRunInSessionResult<T>> {\n const timeoutMs = options.timeoutMs ?? 300_000\n const session_id = sessionId\n const socket = this.client.socket()\n await ensureSocketConnected(socket, timeoutMs, { session_id })\n\n return new Promise<T | string | HeadlessRunInSessionResult<T>>((resolve, reject) => {\n let settled = false\n let stopSent = false\n let started = false\n let chatRunId: string | null = null\n let systemErrorTimeout: ReturnType<typeof setTimeout> | null = null\n const timeout = setTimeout(() => {\n fail(new HeadlessError(`headless run timed out after ${timeoutMs}ms`, { session_id, chat_run_id: chatRunId }))\n }, timeoutMs)\n\n const cleanup = (sendStop: boolean) => {\n clearTimeout(timeout)\n if (systemErrorTimeout) {\n clearTimeout(systemErrorTimeout)\n systemErrorTimeout = null\n }\n socket.off(\"chat:start\", onChatStart)\n socket.off(\"chat:end\", onChatEnd)\n socket.off(\"system:error\", onSystemError)\n if (sendStop && !stopSent) {\n stopSent = true\n socket.emit(\"chat:stop\", { session_id }, () => undefined)\n }\n socket.emit(\"session:unsubscribe\", { session_id })\n }\n\n const finish = (value: T | string) => {\n if (settled) return\n settled = true\n cleanup(false)\n if (returnEnvelope) {\n resolve({ session_id, chat_run_id: chatRunId, result: value })\n return\n }\n resolve(value)\n }\n const fail = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(true)\n reject(error)\n }\n const failWithoutStop = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(false)\n reject(error)\n }\n const rejectAfterChatEnd = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(false)\n reject(error)\n }\n\n function onChatStart(payload: ChatStartPayload) {\n if (payload.session_id && payload.session_id !== session_id) return\n started = true\n }\n\n function onSystemError(payload: SystemErrorPayload) {\n if (payload.session_id !== session_id) return\n if (!started) {\n failWithoutStop(new HeadlessError(payload.message || \"headless run failed\", {\n session_id,\n chat_run_id: chatRunId,\n event: payload,\n }))\n return\n }\n if (systemErrorTimeout) {\n clearTimeout(systemErrorTimeout)\n }\n systemErrorTimeout = setTimeout(() => {\n systemErrorTimeout = null\n fail(new HeadlessError(payload.message || \"headless run failed\", {\n session_id,\n chat_run_id: chatRunId,\n event: payload,\n }))\n }, SYSTEM_ERROR_CHAT_END_GRACE_MS)\n }\n\n function onChatEnd(payload: ChatEndPayload) {\n if (payload.session_id && payload.session_id !== session_id) return\n chatRunId = typeof payload.chat_run_id === \"string\" ? payload.chat_run_id : chatRunId\n const result = payload.result\n if (payload.status === \"failed\") {\n rejectAfterChatEnd(new HeadlessError(errorMessageFromResult(result) ?? \"headless run failed\", {\n session_id,\n chat_run_id: chatRunId,\n event: payload,\n }))\n return\n }\n try {\n finish(normalizeResult<T>(result, Boolean(options.schema)))\n } catch (error) {\n rejectAfterChatEnd(error)\n }\n }\n\n socket.on(\"chat:start\", onChatStart)\n socket.on(\"chat:end\", onChatEnd)\n socket.on(\"system:error\", onSystemError)\n socket.emit(\"session:subscribe\", { session_id })\n socket.emit(\"chat:send\", {\n session_id,\n message: prompt as unknown as ChatSendPayload[\"message\"],\n headless: true,\n output_schema: options.schema ?? null,\n model: options.model ?? null,\n })\n })\n }\n}\n\nfunction normalizeResult<T>(result: unknown, hasSchema: boolean): T | string {\n if (!isRecord(result)) {\n throw new HeadlessError(\"headless run finished without a result\", result)\n }\n const errMsg = typeof result.err_msg === \"string\" ? result.err_msg : \"\"\n if (errMsg) {\n throw new HeadlessError(errMsg, result)\n }\n if (!hasSchema) {\n const text = result.result\n return typeof text === \"string\" ? text : String(text ?? \"\")\n }\n const { err_msg: _errMsg, ...businessResult } = result\n return businessResult as T\n}\n\nfunction errorMessageFromResult(result: unknown): string | null {\n if (isRecord(result) && typeof result.err_msg === \"string\" && result.err_msg) {\n return result.err_msg\n }\n return null\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction ensureSocketConnected(\n socket: ReturnType<BladeClient[\"socket\"]>,\n timeoutMs: number,\n detail: Record<string, unknown>,\n): Promise<void> {\n if (socket.connected) {\n return Promise.resolve()\n }\n return new Promise((resolve, reject) => {\n let settled = false\n const timeout = setTimeout(() => {\n finish(() => reject(new HeadlessError(`socket connection timed out after ${timeoutMs}ms`, detail)))\n }, timeoutMs)\n const onConnect = () => finish(resolve)\n const onConnectError = (error: unknown) => {\n finish(() => reject(new HeadlessError(\"socket connection failed\", { ...detail, event: error })))\n }\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n clearTimeout(timeout)\n socket.off(\"connect\", onConnect)\n socket.off(\"connect_error\", onConnectError)\n callback()\n }\n socket.on(\"connect\", onConnect)\n socket.on(\"connect_error\", onConnectError)\n socket.connect()\n })\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface Memory {\n id: number\n type: \"feedback\" | \"experience\"\n content: string\n skill_name: string | null\n record_type: \"memory\" | \"skill_comment\" | null\n scope: string | null\n owner: string | null\n topic: string | null\n mem0_id: string | null\n superseded_by: number | null\n write_reason: string | null\n created_at: string\n updated_at: string | null\n hit_count: number\n last_hit_at: string | null\n disabled: boolean\n source_session: string\n}\n\nexport interface MemoryListResponse {\n items: Memory[]\n total: number\n}\n\nexport interface MemoryListParams {\n keyword?: string\n skill_name?: string\n type?: string\n record_type?: string\n scope?: string\n owner?: string\n topic?: string\n status?: string\n offset?: number\n limit?: number\n}\n\nexport interface MemoryCreateBody {\n content: string\n type?: \"feedback\" | \"experience\"\n skill_name?: string | null\n record_type?: \"memory\" | \"skill_comment\" | null\n scope?: string | null\n owner?: string | null\n topic?: string | null\n mem0_id?: string | null\n write_reason?: string | null\n}\n\nexport class MemoriesResource {\n constructor(private client: BladeClient) {}\n\n createMemory(body: MemoryCreateBody): Promise<Memory> {\n return this.client.json(\"POST\", \"/api/memories\", body)\n }\n\n listMemories(params?: MemoryListParams): Promise<MemoryListResponse> {\n const search = new URLSearchParams()\n if (params?.keyword) search.set(\"keyword\", params.keyword)\n if (params?.skill_name != null) search.set(\"skill_name\", params.skill_name)\n if (params?.type) search.set(\"type\", params.type)\n if (params?.record_type) search.set(\"record_type\", params.record_type)\n if (params?.scope) search.set(\"scope\", params.scope)\n if (params?.owner) search.set(\"owner\", params.owner)\n if (params?.topic) search.set(\"topic\", params.topic)\n if (params?.status) search.set(\"status\", params.status)\n if (params?.offset !== undefined) search.set(\"offset\", String(params.offset))\n if (params?.limit !== undefined) search.set(\"limit\", String(params.limit))\n const qs = search.toString()\n return this.client.json(\"GET\", `/api/memories${qs ? `?${qs}` : \"\"}`)\n }\n\n getMemory(id: number): Promise<Memory> {\n return this.client.json(\"GET\", `/api/memories/${id}`)\n }\n\n updateMemory(id: number, body: Partial<MemoryCreateBody>): Promise<Memory> {\n return this.client.json(\"PUT\", `/api/memories/${id}`, body)\n }\n\n patchMemory(id: number, disabled: boolean): Promise<Memory> {\n return this.client.json(\"PATCH\", `/api/memories/${id}`, { disabled })\n }\n\n deleteMemory(id: number): Promise<{ ok: boolean }> {\n return this.client.json(\"DELETE\", `/api/memories/${id}`)\n }\n\n batchMemories(\n action: \"delete\" | \"disable\" | \"enable\",\n ids: number[],\n ): Promise<{ ok: boolean; count: number }> {\n return this.client.json(\"POST\", \"/api/memories/batch\", { action, ids })\n }\n}\n","import { type } from \"arktype\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport const ModelOption = type({\n id: \"string\",\n label: \"string\",\n \"inputModalities?\": \"string[]\",\n \"supportsImage?\": \"boolean\",\n})\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 } from \"arktype\"\n\nexport const PublishedAppStatus = type(\"'running' | 'restarting' | 'exited'\")\nexport type PublishedAppStatus = typeof PublishedAppStatus.infer\n\nexport const PublishedApp = type({\n session_id: \"string\",\n name: \"string\",\n url: \"string\",\n host_port: \"number\",\n app_port: \"number\",\n icon: \"string\",\n open_in: \"string\",\n created_at: \"number\",\n status: PublishedAppStatus,\n os_app_id: \"string\",\n os_registered: \"boolean\",\n})\nexport type PublishedApp = typeof PublishedApp.infer\n\nexport const PublishedAppListResponse = type({\n items: PublishedApp.array(),\n})\nexport type PublishedAppListResponse = typeof PublishedAppListResponse.infer\n\nexport const UnpublishAppResponse = type({\n ok: \"boolean\",\n \"os_app_id?\": \"string\",\n \"os_registered?\": \"boolean\",\n})\nexport type UnpublishAppResponse = typeof UnpublishAppResponse.infer\n","import type { PublishedApp, UnpublishAppResponse } from \"../../react/schemas/published-apps\"\nimport { PublishedAppListResponse, UnpublishAppResponse as UnpublishAppResponseSchema } from \"../../react/schemas/published-apps\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport class PublishedAppsResource {\n constructor(private client: BladeClient) {}\n\n async listPublishedApps(): Promise<PublishedApp[]> {\n const data = await this.client.json<unknown>(\"GET\", \"/api/published-apps\")\n return PublishedAppListResponse.assert(data).items\n }\n\n async unpublishApp(sessionId: string): Promise<UnpublishAppResponse> {\n const data = await this.client.json<unknown>(\n \"DELETE\",\n `/api/published-apps/${encodeURIComponent(sessionId)}`,\n )\n return UnpublishAppResponseSchema.assert(data)\n }\n}\n","import type { AgentResource } from \"../../react/schemas/studio/agent\"\nimport type { DatabaseResource } from \"../../react/schemas/studio/database\"\nimport type { KnowledgeResource } from \"../../react/schemas/studio/knowledge\"\nimport type { ToolResource } from \"../../react/schemas/studio/tool\"\nimport type { BladeClient } from \"../blade-client\"\n\nexport const REGISTRY_PREFIX = \"/api-registry\"\n\nconst API_TO_FRONTEND_TYPE: Record<string, string> = {\n tool: \"tools\",\n datasource: \"data\",\n knowledgebase: \"knowledge\",\n agent: \"agent\",\n}\n\ntype RawResourceResponse = {\n id: number | string\n type: string\n subtype: string\n driver?: string | null\n name: string\n description: string\n tags: string[]\n config: Record<string, unknown>\n status?: string | null\n status_message?: string | null\n last_checked_at?: string | null\n extra?: Record<string, unknown>\n capabilities?: string[]\n actions?: unknown[]\n created_at?: string\n updated_at?: string\n [key: string]: unknown\n}\n\ntype PaginatedResponse = { items: RawResourceResponse[]; total: number }\n\nexport function normalizeResource<T extends Record<string, unknown>>(raw: RawResourceResponse): T {\n return {\n ...raw,\n id: String(raw.id),\n type: API_TO_FRONTEND_TYPE[raw.type] ?? raw.type,\n } as unknown as T\n}\n\nexport type ResourceApi<T extends Record<string, unknown>> = {\n list(init?: RequestInit): Promise<T[]>\n get(id: string, init?: RequestInit): Promise<T>\n create(data: Partial<T>, init?: RequestInit): Promise<T>\n update(id: string, data: Partial<T>, init?: RequestInit): Promise<T>\n delete(id: string, init?: RequestInit): Promise<void>\n}\n\nexport type SkillOrgOption = {\n id: string\n display_name: string\n kind: \"personal\" | \"org\"\n is_mine: boolean\n}\n\nexport type SkillOrgListResponse = {\n orgs: string[]\n org_options?: SkillOrgOption[]\n}\n\nexport class RegistryResource {\n readonly databaseApi: ResourceApi<DatabaseResource>\n readonly toolApi: ResourceApi<ToolResource>\n readonly knowledgeApi: ResourceApi<KnowledgeResource>\n readonly agentApi: ResourceApi<AgentResource>\n\n constructor(private client: BladeClient) {\n this.databaseApi = this.createResourceApi<DatabaseResource>(\"datasource\")\n this.toolApi = this.createResourceApi<ToolResource>(\"tool\")\n this.knowledgeApi = this.createResourceApi<KnowledgeResource>(\"knowledgebase\")\n this.agentApi = this.createResourceApi<AgentResource>(\"agent\")\n }\n\n createResourceApi<T extends Record<string, unknown>>(apiType: string): ResourceApi<T> {\n return {\n list: (init?: RequestInit) =>\n this.client\n .jsonFromInit<PaginatedResponse>(`${REGISTRY_PREFIX}/resources?type=${apiType}`, init)\n .then((response) => (response.items ?? []).map((item) => normalizeResource<T>(item))),\n get: (id: string, init?: RequestInit) =>\n this.client\n .jsonFromInit<RawResourceResponse>(`${REGISTRY_PREFIX}/resources/${encodeURIComponent(id)}`, init)\n .then((item) => normalizeResource<T>(item)),\n create: (data: Partial<T>, init?: RequestInit) =>\n this.client.jsonFromInit(`${REGISTRY_PREFIX}/resources`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n ...init,\n }),\n update: (id: string, data: Partial<T>, init?: RequestInit) =>\n this.client.jsonFromInit(`${REGISTRY_PREFIX}/resources/${encodeURIComponent(id)}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(data),\n ...init,\n }),\n delete: async (id: string, init?: RequestInit) => {\n await this.client.textFromInit(`${REGISTRY_PREFIX}/resources/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n ...init,\n })\n },\n }\n }\n\n listSkillOrgs(): Promise<SkillOrgListResponse> {\n return this.client.json(\"GET\", `${REGISTRY_PREFIX}/skills/orgs`)\n }\n\n publishSkill(\n sessionId: string,\n org: string,\n ): Promise<{ success: boolean; skill_id: string }> {\n // main-only:发布只传 org,内容同步到 main,不再有版本号。\n return this.client.json(\"POST\", `/api/sessions/${encodeURIComponent(sessionId)}/skill-publish`, {\n org,\n })\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface PreviewUrlItem {\n name: string\n url: string\n}\n\nexport interface QuickScenario {\n id: number\n name: string\n prompt_template: string\n skills: string[]\n preview_urls: PreviewUrlItem[]\n init_script: string\n icon: string\n created_at: string\n updated_at: string\n}\n\nexport interface BladeHubScenarioResource {\n resource_id: string\n resource_name: string\n name: string\n description: string\n prompt_template: string\n skills: string[]\n preview_urls: PreviewUrlItem[]\n init_script: string\n icon: string\n raw?: Record<string, unknown>\n}\n\nexport interface CreateQuickScenarioPayload {\n name: string\n prompt_template?: string\n skills?: string[]\n preview_urls?: PreviewUrlItem[]\n init_script?: string\n icon?: string\n}\n\nexport interface UpdateQuickScenarioPayload extends CreateQuickScenarioPayload {}\n\nexport class ScenariosResource {\n constructor(private client: BladeClient) {}\n\n listQuickScenarios(init?: RequestInit): Promise<QuickScenario[]> {\n return this.client.jsonFromInit(\"/api/scenarios\", init)\n }\n\n createQuickScenario(payload: CreateQuickScenarioPayload, init?: RequestInit): Promise<QuickScenario> {\n return this.client.jsonFromInit(\"/api/scenarios\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n deleteQuickScenario(scenarioId: number, init?: RequestInit): Promise<{ ok: boolean }> {\n return this.client.jsonFromInit(`/api/scenarios/${scenarioId}`, {\n method: \"DELETE\",\n ...init,\n })\n }\n\n updateQuickScenario(\n scenarioId: number,\n payload: UpdateQuickScenarioPayload,\n init?: RequestInit,\n ): Promise<QuickScenario> {\n return this.client.jsonFromInit(`/api/scenarios/${scenarioId}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n async listBladeHubScenarioResources(\n limit = 500,\n init?: RequestInit,\n ): Promise<BladeHubScenarioResource[]> {\n const params = new URLSearchParams({ limit: String(limit) })\n const response = await this.client.jsonFromInit<{ items: BladeHubScenarioResource[] }>(\n `/api/skills/scenario-resources?${params}`,\n init,\n )\n return response.items ?? []\n }\n}\n","import type { BackgroundTask } from \"../../react/schemas/background\"\nimport type { TurnProjection } from \"../../react/schemas/projection\"\nimport type { SessionDetail, SessionInfo, TemplateId } from \"../../react/schemas/session\"\nimport type { Task } from \"../../react/schemas/task\"\nimport type { BladeClient, UploadProgress } from \"../blade-client\"\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 workspace_id?: string | null\n is_persistent?: boolean | null\n model?: string | null\n software_factory_id?: number | null\n memory_enabled?: boolean | null\n env?: Record<string, string>\n disable_tools?: string[] | null\n}\n\nexport interface CheckpointNode {\n id: string\n parent_id: string | null\n content_preview: string\n content: string\n timestamp: string\n}\n\nexport type ContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string; detail?: string } }\n\nexport interface HistoryNode {\n id: string\n parent_id: string | null\n kind: string\n role: string\n timestamp: string\n preview: string\n content: string | ContentPart[]\n tool_calls: Array<{\n id?: string\n type?: string\n function?: { name?: string; arguments?: string }\n }> | null\n usage: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number } | null\n total_tokens: number\n token_diff: number\n is_deprecated: boolean\n loop_name: string\n}\n\nexport interface SessionHistory {\n nodes: HistoryNode[]\n active_branch: string | null\n branches: string[]\n system_prompt_tokens?: number | null\n tools_tokens?: number | null\n tokenizer_model?: string | null\n}\n\nexport interface TokenizeResult {\n model: string\n prompt_tokens: number\n prompt: string\n}\n\nexport interface PaginatedSessionsResult {\n items: SessionInfo[]\n total: number\n limit: number\n offset: number\n content_match_truncated?: boolean\n}\n\ninterface ListSessionsPageParams {\n limit: number\n offset: number\n template_id_prefix?: string\n solution_id?: string\n q?: string\n}\n\nexport interface SkillDevSession {\n session: SessionInfo\n skill_id: string\n display_name: string\n skill_description: string\n}\n\nexport interface ShareLinkResult {\n token: string\n url: string\n expires_at: string | null\n}\n\nexport interface SessionContextStats {\n tokens_used: number\n context_window: number\n compaction_ratio: number\n}\n\nexport interface FileEntry {\n name: string\n path: string\n is_dir: boolean\n created_at: number\n tags?: string[]\n}\n\nexport type UploadFileEntry = File | { file: File; name: string }\n\nexport interface UploadFilesOptions {\n onProgress?: (progress: UploadProgress) => void\n}\n\nexport interface ImportPreviewSkill {\n name: string\n description: string\n path: string\n}\n\nexport interface ImportPreviewScenario {\n scenario?: { name?: string }\n skills?: string[]\n preview_urls?: string[]\n init_script?: string\n generated_at?: string\n}\n\nexport interface ImportPreview {\n user_messages: string[]\n turn_count: number\n skills: ImportPreviewSkill[]\n scenario: ImportPreviewScenario | null\n}\n\nfunction toCreateSessionPayload(request: CreateSessionRequest) {\n return {\n intent: request.intent ?? \"\",\n template_id: request.template_id,\n solution_id: request.solution_id,\n biz_role_id: request.biz_role_id ?? null,\n model: request.model ?? null,\n memory_enabled: request.memory_enabled ?? null,\n primary_skill_id: request.primary_skill_id ?? null,\n workspace_id: request.workspace_id ?? null,\n is_persistent: request.is_persistent ?? false,\n software_factory_id: request.software_factory_id ?? null,\n env: request.env,\n disable_tools: request.disable_tools ?? null,\n }\n}\n\nexport class SessionsResource {\n constructor(private client: BladeClient) {}\n\n private fetchSessionsPage({\n limit,\n offset,\n template_id_prefix,\n solution_id,\n q,\n }: ListSessionsPageParams): Promise<PaginatedSessionsResult> {\n const searchParams = new URLSearchParams()\n searchParams.set(\"limit\", String(limit))\n searchParams.set(\"offset\", String(offset))\n if (template_id_prefix) searchParams.set(\"template_id_prefix\", template_id_prefix)\n if (solution_id) searchParams.set(\"solution_id\", solution_id)\n const trimmedQuery = q?.trim()\n if (trimmedQuery) searchParams.set(\"q\", trimmedQuery)\n return this.client.json(\"GET\", `/api/sessions?${searchParams.toString()}`)\n }\n\n async listSessions(template_id_prefix?: string): 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 solution_id?: string\n q?: string\n }): Promise<PaginatedSessionsResult> {\n return this.fetchSessionsPage(params)\n }\n\n listSessionsWithSkillData(): Promise<SkillDevSession[]> {\n return this.client.json(\"GET\", \"/api/sessions/with-skill-data\")\n }\n\n createSession(\n intent?: string,\n template_id?: TemplateId,\n primary_skill_id?: string | null,\n ): Promise<{ session_id: string }> {\n return this.createSessionWithRequest({ intent, template_id, primary_skill_id })\n }\n\n createSessionWithRequest(request: CreateSessionRequest): Promise<{ session_id: string }> {\n return this.client.json(\"POST\", \"/api/sessions\", toCreateSessionPayload(request))\n }\n\n getSession(sessionId: string, init?: RequestInit): Promise<SessionDetail> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}`, init)\n }\n\n updateSession(sessionId: string, payload: { intent?: string }): Promise<SessionDetail> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}`, payload)\n }\n\n setSessionEnv(sessionId: string, env: Record<string, string>): Promise<SessionDetail> {\n return this.client.json(\"PUT\", `/api/sessions/${sessionId}/env`, { env })\n }\n\n pinSession(sessionId: string, pinned: boolean): Promise<SessionInfo> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/pin`, { pinned })\n }\n\n startReplaySession(sourceSessionId: string, speed: 1 | 2 | 5 = 5): Promise<{ session_id: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sourceSessionId}/replay`, { speed })\n }\n\n updateReplaySession(\n sessionId: string,\n payload: { speed?: 1 | 2 | 5; status?: \"autonomous\" },\n ): Promise<{ replay_state: SessionInfo[\"replay_state\"] }> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/replay`, payload)\n }\n\n updateSharing(sessionId: string, shared: boolean): Promise<{ shared: boolean }> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/sharing`, { shared })\n }\n\n updateSessionMemory(sessionId: string, memoryEnabled: boolean): Promise<{ memory_enabled: boolean }> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}/memory`, {\n memory_enabled: memoryEnabled,\n })\n }\n\n createShare(sessionId: string): Promise<ShareLinkResult> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/share`, {})\n }\n\n revokeShare(sessionId: string, token: string): Promise<{ revoked: boolean }> {\n return this.client.json(\"DELETE\", `/api/sessions/${sessionId}/share/${encodeURIComponent(token)}`)\n }\n\n 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\n probeSessionUrl(sessionId: string, url: string): Promise<{ reachable: boolean }> {\n return this.client.json(\n \"GET\",\n `/api/sessions/${sessionId}/probe-url?url=${encodeURIComponent(url)}`,\n )\n }\n\n listDir(sessionId: string, dirPath: string): Promise<FileEntry[]> {\n return this.client.json(\"GET\", `/api/sessions/${sessionId}/ls/${encodeURIComponent(dirPath)}`)\n }\n\n async uploadFiles(\n sessionId: string,\n dirPath: string,\n files: FileList | File[] | UploadFileEntry[],\n options: UploadFilesOptions = {},\n ): Promise<{ uploaded: string[]; failed: string[] }> {\n const formData = new FormData()\n const entries = Array.from(files).map((f) =>\n f instanceof File ? { file: f, name: f.name } : (f as { file: File; name: string }),\n )\n for (const entry of entries) {\n formData.append(\"files\", entry.file, entry.name)\n }\n 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, onUploadProgress: options.onProgress },\n )\n return response.json()\n }\n\n async deleteFile(sessionId: string, filePath: string): Promise<void> {\n await this.client.json(\"DELETE\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}`)\n }\n\n writeFile(sessionId: string, filePath: string, content: string): Promise<{ success: boolean }> {\n return this.client.json(\"PUT\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}`, {\n content,\n })\n }\n\n renameFile(sessionId: string, filePath: string, newName: string): Promise<{ path: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}/rename`, {\n new_name: newName,\n })\n }\n\n copyFile(sessionId: string, filePath: string): Promise<{ path: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}/copy`)\n }\n\n shareFile(\n sessionId: string,\n sourcePath: string,\n linkName?: string,\n shareFolder?: string,\n ): Promise<{ path: string; target: string }> {\n return this.client.json(\"POST\", `/api/sessions/${sessionId}/share-file`, {\n source_path: sourcePath,\n link_name: linkName ?? \"\",\n share_folder: shareFolder ?? \"\",\n })\n }\n\n getDownloadDirUrl(sessionId: string, dirPath: string): string {\n return this.client.buildAuthedUrl(`/api/sessions/${sessionId}/download-dir/${encodeURIComponent(dirPath)}`)\n }\n\n async exportSession(sessionId: string): Promise<void> {\n await this.getSession(sessionId)\n const a = document.createElement(\"a\")\n a.href = this.client.buildAuthedUrl(`/api/sessions/${sessionId}/export`)\n a.download = `${sessionId}.zip`\n document.body.appendChild(a)\n a.click()\n a.remove()\n }\n\n async previewImport(file: File): Promise<ImportPreview> {\n const form = new FormData()\n form.append(\"file\", file)\n const res = await this.client.formData(\"POST\", \"/api/sessions/preview-import\", form)\n return res.json()\n }\n\n async importSession(\n file: File,\n name?: string,\n solutionId?: string | null,\n ): Promise<{ session_id: string }> {\n const form = new FormData()\n form.append(\"file\", file)\n if (name) form.append(\"name\", name)\n if (solutionId) form.append(\"solution_id\", solutionId)\n const res = await this.client.formData(\"POST\", \"/api/sessions/import\", form)\n return res.json()\n }\n}\n","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 { HeadlessResource } from \"./resources/headless\"\nimport { MemoriesResource } from \"./resources/memories\"\nimport { ModelsResource } from \"./resources/models\"\nimport { PublishedAppsResource } from \"./resources/published-apps\"\nimport { RegistryResource } from \"./resources/registry\"\nimport { 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 headless: HeadlessResource\n readonly memories: MemoriesResource\n readonly models: ModelsResource\n readonly publishedApps: PublishedAppsResource\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.headless = new HeadlessResource(this)\n this.memories = new MemoriesResource(this)\n this.models = new ModelsResource(this)\n this.publishedApps = new PublishedAppsResource(this)\n this.registry = new RegistryResource(this)\n this.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; onUploadProgress?: (progress: UploadProgress) => void } = {},\n ): Promise<Response> {\n if (options.onUploadProgress && !this.options.fetchImpl && typeof XMLHttpRequest !== \"undefined\") {\n return this.formDataWithUploadProgress(method, path, form, options)\n }\n return this.fetch(method, path, { body: form, expectOk: options.expectOk })\n }\n\n async fetch(\n method: HttpMethod,\n path: string,\n init: BladeFetchInit = {},\n isRetry = false,\n ): Promise<Response> {\n const url = this.buildUrl(path)\n const response = await (this.options.fetchImpl ?? fetch)(url.toString(), {\n method,\n body: init.body,\n credentials: init.credentials ?? \"include\",\n headers: this.buildHeaders(url, init.headers),\n signal: init.signal,\n })\n\n if (response.status === 401 && !isRetry && this.shouldRefreshFor401(url)) {\n const refreshed = await this.tryRefresh()\n if (refreshed) {\n return this.fetch(method, path, init, true)\n }\n }\n\n if (init.expectOk !== false && !response.ok) {\n const detail = await extractErrorDetail(response)\n throw new BladeApiError(response, detail)\n }\n return response\n }\n\n buildAuthedUrl(path: string): string {\n const url = new URL(this.toBaseRelativePath(path), this.baseUrlWithTrailingSlash())\n const token = this.resolveTokenForUrl(url)\n if (token) {\n url.searchParams.set(\"token\", token)\n }\n return url.toString()\n }\n\n private buildHeaders(url: URL, headers?: HeadersInit): Headers {\n const result = new Headers(headers)\n if (!this.isSameBackendUrl(url)) {\n return result\n }\n const token = this.resolveRestToken()\n if (token) {\n result.set(\"Authorization\", `Bearer ${token}`)\n }\n return result\n }\n\n private buildUrl(path: string): URL {\n return new URL(this.toBaseRelativePath(path), this.baseUrlWithTrailingSlash())\n }\n\n private baseUrlWithTrailingSlash(): string {\n return this.options.baseUrl.endsWith(\"/\") ? this.options.baseUrl : `${this.options.baseUrl}/`\n }\n\n private toBaseRelativePath(path: string): string {\n return path.startsWith(\"/\") ? path.slice(1) : path\n }\n\n private isSameBackendUrl(url: URL): boolean {\n const base = new URL(this.baseUrlWithTrailingSlash())\n if (url.origin !== base.origin) {\n return false\n }\n const basePath = base.pathname.replace(/\\/+$/, \"\")\n if (basePath === \"\") {\n return true\n }\n return url.pathname === basePath || url.pathname.startsWith(`${basePath}/`)\n }\n\n private shouldRefreshFor401(url: URL): boolean {\n const refreshUrl = this.buildUrl(REFRESH_PATH)\n return (\n this.isSameBackendUrl(url) &&\n url.pathname !== refreshUrl.pathname &&\n !this.hasExplicitBearerToken()\n )\n }\n\n private hasExplicitBearerToken(): boolean {\n return this.options.token !== undefined\n }\n\n private async tryRefresh(): Promise<boolean> {\n if (this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.refreshPromise = (async () => {\n try {\n const response = await (this.options.fetchImpl ?? fetch)(\n this.buildUrl(REFRESH_PATH).toString(),\n {\n method: \"POST\",\n credentials: \"include\",\n },\n )\n if (!response.ok) {\n return false\n }\n await this.options.onRefreshSuccess?.()\n return true\n } catch {\n return false\n } finally {\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n private resolveTokenForUrl(url: URL): string | null {\n if (!this.isSameBackendUrl(url)) {\n return null\n }\n return this.resolveRestToken()\n }\n\n private resolveRestToken(): string | null {\n return this.resolveToken(this.storeRestTokenResolver)\n }\n\n private resolveSocketToken(): string | null {\n return this.resolveToken(this.storeSocketTokenResolver)\n }\n\n private resolveToken(resolver: (() => string | null | undefined) | null): string | null {\n const token =\n this.options.token === undefined\n ? resolver?.()\n : typeof this.options.token === \"function\"\n ? this.options.token()\n : this.options.token\n return token ? token : null\n }\n\n private formDataWithUploadProgress(\n method: HttpMethod,\n path: string,\n form: FormData,\n options: { expectOk?: boolean; onUploadProgress?: (progress: UploadProgress) => void },\n isRetry = false,\n ): Promise<Response> {\n const url = this.buildUrl(path)\n const headers = this.buildHeaders(url)\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.open(method, url.toString(), true)\n xhr.withCredentials = true\n\n headers.forEach((value, key) => {\n xhr.setRequestHeader(key, value)\n })\n\n xhr.upload.onprogress = (event) => {\n options.onUploadProgress?.({\n loaded: event.loaded,\n total: event.lengthComputable ? event.total : undefined,\n percent: event.lengthComputable && event.total > 0 ? event.loaded / event.total : undefined,\n })\n }\n\n xhr.onerror = () => reject(new TypeError(\"Network request failed\"))\n xhr.ontimeout = () => reject(new TypeError(\"Network request timed out\"))\n xhr.onabort = () => reject(new DOMException(\"Request aborted\", \"AbortError\"))\n xhr.onload = async () => {\n if (xhr.status === 401 && !isRetry && this.shouldRefreshFor401(url)) {\n const refreshed = await this.tryRefresh()\n if (refreshed) {\n resolve(this.formDataWithUploadProgress(method, path, form, options, true))\n return\n }\n }\n\n const response = new Response(xhr.responseText, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseXhrHeaders(xhr.getAllResponseHeaders()),\n })\n if (options.expectOk !== false && !response.ok) {\n const detail = await extractErrorDetail(response.clone())\n reject(new BladeApiError(response, detail))\n return\n }\n options.onUploadProgress?.({ loaded: 1, total: 1, percent: 1 })\n resolve(response)\n }\n\n xhr.send(form)\n })\n }\n}\n\nexport interface UploadProgress {\n loaded: number\n total?: number\n percent?: number\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n const normalized = baseUrl.trim().replace(/\\/+$/, \"\")\n if (normalized || typeof window === \"undefined\") {\n return normalized\n }\n return window.location.origin\n}\n\nfunction isFormData(value: BodyInit): boolean {\n return typeof FormData !== \"undefined\" && value instanceof FormData\n}\n\nfunction readJsonResponse<T>(response: Response): Promise<T> {\n if (response.status === 204 || response.headers.get(\"content-length\") === \"0\") {\n return Promise.resolve(undefined as T)\n }\n return response.json() as Promise<T>\n}\n\nfunction parseXhrHeaders(rawHeaders: string): Headers {\n const headers = new Headers()\n for (const line of rawHeaders.trim().split(/[\\r\\n]+/)) {\n const separatorIndex = line.indexOf(\":\")\n if (separatorIndex <= 0) continue\n headers.append(line.slice(0, separatorIndex).trim(), line.slice(separatorIndex + 1).trim())\n }\n return headers\n}\n"],"mappings":";AAAO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAoB,SAAkB;AAChD,UAAM,WAAW,iCAAQ,SAAS,MAAM,IAAI,SAAS,UAAU,QAAG;AAClE,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,SAAS,SAAS;AACvB,SAAK,aAAa,SAAS;AAAA,EAC7B;AACF;AAMA,eAAsB,mBAAmB,UAAiD;AACxF,MAAI;AACF,UAAM,SAAS,SAAS,MAAM;AAC9B,UAAM,cAAc,OAAO,QAAQ,IAAI,cAAc,KAAK;AAC1D,QAAI,YAAY,SAAS,kBAAkB,GAAG;AAC5C,YAAM,OAAQ,MAAM,OAAO,KAAK;AAChC,YAAM,SAAS,MAAM;AACrB,UAAI,OAAO,WAAW,YAAY,OAAO,KAAK,EAAG,QAAO;AACxD,UAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,cAAM,QAAQ,OAAO,CAAC;AACtB,YAAI,SAAS,OAAO,MAAM,QAAQ,SAAU,QAAO,MAAM;AAAA,MAC3D;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,MAAM,OAAO,KAAK,GAAG,KAAK;AACxC,UAAI,KAAM,QAAO;AAAA,IACnB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;;;ACdO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,cAAuC;AACrC,WAAO,KAAK,OAAO,KAAK,OAAO,qBAAqB;AAAA,EACtD;AAAA,EAEA,aAAa,MAA6C;AACxD,WAAO,KAAK,OAAO,KAAK,QAAQ,uBAAuB,EAAE,KAAK,CAAC;AAAA,EACjE;AAAA,EAEA,aAAa,IAAY,MAAqC;AAC5D,WAAO,KAAK,OAAO,KAAK,SAAS,sBAAsB,mBAAmB,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;AAAA,EAC3F;AAAA,EAEA,MAAM,aAAa,IAA2B;AAC5C,QAAI;AACF,YAAM,KAAK,OAAO,KAAK,UAAU,sBAAsB,mBAAmB,EAAE,CAAC,EAAE;AAAA,IACjF,SAAS,KAAK;AACZ,UAAI,eAAe,eAAe;AAChC,cAAM,SAAS,MAAM,gBAAgB,IAAI,QAAQ;AACjD,YAAI,QAAQ;AACV,gBAAM,IAAI,MAAM,MAAM;AAAA,QACxB;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAe,gBAAgB,UAA4C;AACzE,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,MAAM,EAAE,KAAK;AACzC,UAAM,SAAS,MAAM;AACrB,WAAO,OAAO,WAAW,YAAY,OAAO,KAAK,IAAI,SAAS;AAAA,EAChE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC1CO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,eAA2C;AACzC,WAAO,KAAK,OAAO,KAAK,OAAO,qBAAqB;AAAA,EACtD;AAAA,EAEA,QAA2B;AACzB,WAAO,KAAK,OAAO,KAAK,OAAO,cAAc;AAAA,EAC/C;AAAA,EAEA,SAA0C;AACxC,WAAO,KAAK,OAAO,KAAK,QAAQ,kBAAkB;AAAA,EACpD;AACF;;;ACvBO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA;AAAA,EAGpB,iBAAuC;AACrC,WAAO,KAAK,OAAO,KAAK,OAAO,uBAAuB;AAAA,EACxD;AAAA,EAEA,aAAa,QAAoC;AAC/C,WAAO,KAAK,OAAO,KAAK,OAAO,yBAAyB,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACtF;AAAA,EAEA,aAAa,QAAgB,KAAiD;AAC5E,WAAO,KAAK,OAAO,KAAK,OAAO,yBAAyB,mBAAmB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,EAC/F;AAAA,EAEA,MAAM,gBAAgB,QAA+B;AACnD,UAAM,KAAK,OAAO,KAAK,UAAU,yBAAyB,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACxF;AAAA;AAAA,EAGA,iBAA6C;AAC3C,WAAO,KAAK,OAAO,KAAK,OAAO,uBAAuB;AAAA,EACxD;AAAA;AAAA,EAGA,yBAAqD;AACnD,WAAO,KAAK,OAAO,KAAK,OAAO,mBAAmB;AAAA,EACpD;AAAA,EAEA,eAAe,KAAyD;AACtE,WAAO,KAAK,OAAO,KAAK,OAAO,yBAAyB,EAAE,IAAI,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,oBAAmC;AACvC,UAAM,KAAK,OAAO,KAAK,UAAU,uBAAuB;AAAA,EAC1D;AACF;;;AC7CO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,cAAc,WAAmB,MAAuC;AACtE,WAAO,KAAK,OAAO,aAAa,YAAY,SAAS,UAAU,IAAI;AAAA,EACrE;AAAA,EAEA,mBAAmB,MAA4C;AAC7D,WAAO,KAAK,OAAO,aAAa,eAAe,IAAI;AAAA,EACrD;AACF;;;ACIO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YACE,SACS,QACT;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EAJW;AAKb;AAEA,IAAM,iCAAiC;AAEhC,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAIpB,MAAM,IAAiB,QAAgB,UAA8B,CAAC,GAAwB;AAC5F,UAAM,EAAE,WAAW,IAAI,MAAM,KAAK,OAAO,SAAS,yBAAyB;AAAA,MACzE,QAAQ;AAAA,MACR,OAAO,QAAQ,SAAS;AAAA,IAC1B,CAAC;AACD,WAAO,KAAK,WAAc,YAAY,QAAQ,SAAS,KAAK;AAAA,EAC9D;AAAA,EAQA,MAAM,aACJ,WACA,QACA,UAA8B,CAAC,GACV;AACrB,WAAO,KAAK,WAAc,WAAW,QAAQ,SAAS,KAAK;AAAA,EAC7D;AAAA,EAOA,MAAM,eACJ,QACA,UAA8B,CAAC,GACS;AACxC,UAAM,EAAE,WAAW,IAAI,MAAM,KAAK,OAAO,SAAS,yBAAyB;AAAA,MACzE,QAAQ;AAAA,MACR,OAAO,QAAQ,SAAS;AAAA,IAC1B,CAAC;AACD,WAAO,KAAK,WAAc,YAAY,QAAQ,SAAS,IAAI;AAAA,EAC7D;AAAA,EAEA,MAAc,WACZ,WACA,QACA,SACA,gBACqD;AACrD,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,aAAa;AACnB,UAAM,SAAS,KAAK,OAAO,OAAO;AAClC,UAAM,sBAAsB,QAAQ,WAAW,EAAE,WAAW,CAAC;AAE7D,WAAO,IAAI,QAAoD,CAAC,SAAS,WAAW;AAClF,UAAI,UAAU;AACd,UAAI,WAAW;AACf,UAAI,UAAU;AACd,UAAI,YAA2B;AAC/B,UAAI,qBAA2D;AAC/D,YAAM,UAAU,WAAW,MAAM;AAC/B,aAAK,IAAI,cAAc,gCAAgC,SAAS,MAAM,EAAE,YAAY,aAAa,UAAU,CAAC,CAAC;AAAA,MAC/G,GAAG,SAAS;AAEZ,YAAM,UAAU,CAAC,aAAsB;AACrC,qBAAa,OAAO;AACpB,YAAI,oBAAoB;AACtB,uBAAa,kBAAkB;AAC/B,+BAAqB;AAAA,QACvB;AACA,eAAO,IAAI,cAAc,WAAW;AACpC,eAAO,IAAI,YAAY,SAAS;AAChC,eAAO,IAAI,gBAAgB,aAAa;AACxC,YAAI,YAAY,CAAC,UAAU;AACzB,qBAAW;AACX,iBAAO,KAAK,aAAa,EAAE,WAAW,GAAG,MAAM,MAAS;AAAA,QAC1D;AACA,eAAO,KAAK,uBAAuB,EAAE,WAAW,CAAC;AAAA,MACnD;AAEA,YAAM,SAAS,CAAC,UAAsB;AACpC,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,KAAK;AACb,YAAI,gBAAgB;AAClB,kBAAQ,EAAE,YAAY,aAAa,WAAW,QAAQ,MAAM,CAAC;AAC7D;AAAA,QACF;AACA,gBAAQ,KAAK;AAAA,MACf;AACA,YAAM,OAAO,CAAC,UAAmB;AAC/B,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,IAAI;AACZ,eAAO,KAAK;AAAA,MACd;AACA,YAAM,kBAAkB,CAAC,UAAmB;AAC1C,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,KAAK;AACb,eAAO,KAAK;AAAA,MACd;AACA,YAAM,qBAAqB,CAAC,UAAmB;AAC7C,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,KAAK;AACb,eAAO,KAAK;AAAA,MACd;AAEA,eAAS,YAAY,SAA2B;AAC9C,YAAI,QAAQ,cAAc,QAAQ,eAAe,WAAY;AAC7D,kBAAU;AAAA,MACZ;AAEA,eAAS,cAAc,SAA6B;AAClD,YAAI,QAAQ,eAAe,WAAY;AACvC,YAAI,CAAC,SAAS;AACZ,0BAAgB,IAAI,cAAc,QAAQ,WAAW,uBAAuB;AAAA,YAC1E;AAAA,YACA,aAAa;AAAA,YACb,OAAO;AAAA,UACT,CAAC,CAAC;AACF;AAAA,QACF;AACA,YAAI,oBAAoB;AACtB,uBAAa,kBAAkB;AAAA,QACjC;AACA,6BAAqB,WAAW,MAAM;AACpC,+BAAqB;AACrB,eAAK,IAAI,cAAc,QAAQ,WAAW,uBAAuB;AAAA,YAC/D;AAAA,YACA,aAAa;AAAA,YACb,OAAO;AAAA,UACT,CAAC,CAAC;AAAA,QACJ,GAAG,8BAA8B;AAAA,MACnC;AAEA,eAAS,UAAU,SAAyB;AAC1C,YAAI,QAAQ,cAAc,QAAQ,eAAe,WAAY;AAC7D,oBAAY,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AAC5E,cAAM,SAAS,QAAQ;AACvB,YAAI,QAAQ,WAAW,UAAU;AAC/B,6BAAmB,IAAI,cAAc,uBAAuB,MAAM,KAAK,uBAAuB;AAAA,YAC5F;AAAA,YACA,aAAa;AAAA,YACb,OAAO;AAAA,UACT,CAAC,CAAC;AACF;AAAA,QACF;AACA,YAAI;AACF,iBAAO,gBAAmB,QAAQ,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAAA,QAC5D,SAAS,OAAO;AACd,6BAAmB,KAAK;AAAA,QAC1B;AAAA,MACF;AAEA,aAAO,GAAG,cAAc,WAAW;AACnC,aAAO,GAAG,YAAY,SAAS;AAC/B,aAAO,GAAG,gBAAgB,aAAa;AACvC,aAAO,KAAK,qBAAqB,EAAE,WAAW,CAAC;AAC/C,aAAO,KAAK,aAAa;AAAA,QACvB;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,eAAe,QAAQ,UAAU;AAAA,QACjC,OAAO,QAAQ,SAAS;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAmB,QAAiB,WAAgC;AAC3E,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,UAAM,IAAI,cAAc,0CAA0C,MAAM;AAAA,EAC1E;AACA,QAAM,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACrE,MAAI,QAAQ;AACV,UAAM,IAAI,cAAc,QAAQ,MAAM;AAAA,EACxC;AACA,MAAI,CAAC,WAAW;AACd,UAAM,OAAO,OAAO;AACpB,WAAO,OAAO,SAAS,WAAW,OAAO,OAAO,QAAQ,EAAE;AAAA,EAC5D;AACA,QAAM,EAAE,SAAS,SAAS,GAAG,eAAe,IAAI;AAChD,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAgC;AAC9D,MAAI,SAAS,MAAM,KAAK,OAAO,OAAO,YAAY,YAAY,OAAO,SAAS;AAC5E,WAAO,OAAO;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,sBACP,QACA,WACA,QACe;AACf,MAAI,OAAO,WAAW;AACpB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,UAAU;AACd,UAAM,UAAU,WAAW,MAAM;AAC/B,aAAO,MAAM,OAAO,IAAI,cAAc,qCAAqC,SAAS,MAAM,MAAM,CAAC,CAAC;AAAA,IACpG,GAAG,SAAS;AACZ,UAAM,YAAY,MAAM,OAAO,OAAO;AACtC,UAAM,iBAAiB,CAAC,UAAmB;AACzC,aAAO,MAAM,OAAO,IAAI,cAAc,4BAA4B,EAAE,GAAG,QAAQ,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,IACjG;AACA,UAAM,SAAS,CAAC,aAAyB;AACvC,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,OAAO;AACpB,aAAO,IAAI,WAAW,SAAS;AAC/B,aAAO,IAAI,iBAAiB,cAAc;AAC1C,eAAS;AAAA,IACX;AACA,WAAO,GAAG,WAAW,SAAS;AAC9B,WAAO,GAAG,iBAAiB,cAAc;AACzC,WAAO,QAAQ;AAAA,EACjB,CAAC;AACH;;;AC5MO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,aAAa,MAAyC;AACpD,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,IAAI;AAAA,EACvD;AAAA,EAEA,aAAa,QAAwD;AACnE,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,QAAS,QAAO,IAAI,WAAW,OAAO,OAAO;AACzD,QAAI,QAAQ,cAAc,KAAM,QAAO,IAAI,cAAc,OAAO,UAAU;AAC1E,QAAI,QAAQ,KAAM,QAAO,IAAI,QAAQ,OAAO,IAAI;AAChD,QAAI,QAAQ,YAAa,QAAO,IAAI,eAAe,OAAO,WAAW;AACrE,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK;AACnD,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK;AACnD,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,OAAO,KAAK;AACnD,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,OAAO,MAAM;AACtD,QAAI,QAAQ,WAAW,OAAW,QAAO,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAC5E,QAAI,QAAQ,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACzE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,OAAO,KAAK,OAAO,gBAAgB,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EACrE;AAAA,EAEA,UAAU,IAA6B;AACrC,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,EAAE,EAAE;AAAA,EACtD;AAAA,EAEA,aAAa,IAAY,MAAkD;AACzE,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,EAAE,IAAI,IAAI;AAAA,EAC5D;AAAA,EAEA,YAAY,IAAY,UAAoC;AAC1D,WAAO,KAAK,OAAO,KAAK,SAAS,iBAAiB,EAAE,IAAI,EAAE,SAAS,CAAC;AAAA,EACtE;AAAA,EAEA,aAAa,IAAsC;AACjD,WAAO,KAAK,OAAO,KAAK,UAAU,iBAAiB,EAAE,EAAE;AAAA,EACzD;AAAA,EAEA,cACE,QACA,KACyC;AACzC,WAAO,KAAK,OAAO,KAAK,QAAQ,uBAAuB,EAAE,QAAQ,IAAI,CAAC;AAAA,EACxE;AACF;;;ACjGA,SAAS,YAAY;AAGd,IAAM,cAAc,KAAK;AAAA,EAC9B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,kBAAkB;AACpB,CAAC;AAGM,IAAM,eAAe,KAAK;AAAA,EAC/B,SAAS;AAAA,EACT,QAAQ,YAAY,MAAM;AAC5B,CAAC;AAIM,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,MAAM,gBAAgB,MAA2C;AAC/D,UAAM,OAAO,MAAM,KAAK,OAAO,aAAsB,sBAAsB,IAAI;AAC/E,WAAO,aAAa,OAAO,IAAI;AAAA,EACjC;AACF;;;ACzBA,SAAS,QAAAA,aAAY;AAEd,IAAM,qBAAqBA,MAAK,qCAAqC;AAGrE,IAAM,eAAeA,MAAK;AAAA,EAC/B,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AACjB,CAAC;AAGM,IAAM,2BAA2BA,MAAK;AAAA,EAC3C,OAAO,aAAa,MAAM;AAC5B,CAAC;AAGM,IAAM,uBAAuBA,MAAK;AAAA,EACvC,IAAI;AAAA,EACJ,cAAc;AAAA,EACd,kBAAkB;AACpB,CAAC;;;ACzBM,IAAM,wBAAN,MAA4B;AAAA,EACjC,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,MAAM,oBAA6C;AACjD,UAAM,OAAO,MAAM,KAAK,OAAO,KAAc,OAAO,qBAAqB;AACzE,WAAO,yBAAyB,OAAO,IAAI,EAAE;AAAA,EAC/C;AAAA,EAEA,MAAM,aAAa,WAAkD;AACnE,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,uBAAuB,mBAAmB,SAAS,CAAC;AAAA,IACtD;AACA,WAAO,qBAA2B,OAAO,IAAI;AAAA,EAC/C;AACF;;;ACbO,IAAM,kBAAkB;AAE/B,IAAM,uBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,OAAO;AACT;AAwBO,SAAS,kBAAqD,KAA6B;AAChG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,OAAO,IAAI,EAAE;AAAA,IACjB,MAAM,qBAAqB,IAAI,IAAI,KAAK,IAAI;AAAA,EAC9C;AACF;AAsBO,IAAM,mBAAN,MAAuB;AAAA,EAM5B,YAAoB,QAAqB;AAArB;AAClB,SAAK,cAAc,KAAK,kBAAoC,YAAY;AACxE,SAAK,UAAU,KAAK,kBAAgC,MAAM;AAC1D,SAAK,eAAe,KAAK,kBAAqC,eAAe;AAC7E,SAAK,WAAW,KAAK,kBAAiC,OAAO;AAAA,EAC/D;AAAA,EALoB;AAAA,EALX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAST,kBAAqD,SAAiC;AACpF,WAAO;AAAA,MACL,MAAM,CAAC,SACL,KAAK,OACF,aAAgC,GAAG,eAAe,mBAAmB,OAAO,IAAI,IAAI,EACpF,KAAK,CAAC,cAAc,SAAS,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,kBAAqB,IAAI,CAAC,CAAC;AAAA,MACxF,KAAK,CAAC,IAAY,SAChB,KAAK,OACF,aAAkC,GAAG,eAAe,cAAc,mBAAmB,EAAE,CAAC,IAAI,IAAI,EAChG,KAAK,CAAC,SAAS,kBAAqB,IAAI,CAAC;AAAA,MAC9C,QAAQ,CAAC,MAAkB,SACzB,KAAK,OAAO,aAAa,GAAG,eAAe,cAAc;AAAA,QACvD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,GAAG;AAAA,MACL,CAAC;AAAA,MACH,QAAQ,CAAC,IAAY,MAAkB,SACrC,KAAK,OAAO,aAAa,GAAG,eAAe,cAAc,mBAAmB,EAAE,CAAC,IAAI;AAAA,QACjF,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB,GAAG;AAAA,MACL,CAAC;AAAA,MACH,QAAQ,OAAO,IAAY,SAAuB;AAChD,cAAM,KAAK,OAAO,aAAa,GAAG,eAAe,cAAc,mBAAmB,EAAE,CAAC,IAAI;AAAA,UACvF,QAAQ;AAAA,UACR,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAA+C;AAC7C,WAAO,KAAK,OAAO,KAAK,OAAO,GAAG,eAAe,cAAc;AAAA,EACjE;AAAA,EAEA,aACE,WACA,KACiD;AAEjD,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,mBAAmB,SAAS,CAAC,kBAAkB;AAAA,MAC9F;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACjFO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,mBAAmB,MAA8C;AAC/D,WAAO,KAAK,OAAO,aAAa,kBAAkB,IAAI;AAAA,EACxD;AAAA,EAEA,oBAAoB,SAAqC,MAA4C;AACnG,WAAO,KAAK,OAAO,aAAa,kBAAkB;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,YAAoB,MAA8C;AACpF,WAAO,KAAK,OAAO,aAAa,kBAAkB,UAAU,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,oBACE,YACA,SACA,MACwB;AACxB,WAAO,KAAK,OAAO,aAAa,kBAAkB,UAAU,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,8BACJ,QAAQ,KACR,MACqC;AACrC,UAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC;AAC3D,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,kCAAkC,MAAM;AAAA,MACxC;AAAA,IACF;AACA,WAAO,SAAS,SAAS,CAAC;AAAA,EAC5B;AACF;;;ACkDA,SAAS,uBAAuB,SAA+B;AAC7D,SAAO;AAAA,IACL,QAAQ,QAAQ,UAAU;AAAA,IAC1B,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ,eAAe;AAAA,IACpC,OAAO,QAAQ,SAAS;AAAA,IACxB,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,kBAAkB,QAAQ,oBAAoB;AAAA,IAC9C,cAAc,QAAQ,gBAAgB;AAAA,IACtC,eAAe,QAAQ,iBAAiB;AAAA,IACxC,qBAAqB,QAAQ,uBAAuB;AAAA,IACpD,KAAK,QAAQ;AAAA,IACb,eAAe,QAAQ,iBAAiB;AAAA,EAC1C;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEZ,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA6D;AAC3D,UAAM,eAAe,IAAI,gBAAgB;AACzC,iBAAa,IAAI,SAAS,OAAO,KAAK,CAAC;AACvC,iBAAa,IAAI,UAAU,OAAO,MAAM,CAAC;AACzC,QAAI,mBAAoB,cAAa,IAAI,sBAAsB,kBAAkB;AACjF,QAAI,YAAa,cAAa,IAAI,eAAe,WAAW;AAC5D,UAAM,eAAe,GAAG,KAAK;AAC7B,QAAI,aAAc,cAAa,IAAI,KAAK,YAAY;AACpD,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,aAAa,SAAS,CAAC,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAM,aAAa,oBAAqD;AACtE,UAAM,WAAW;AACjB,UAAM,WAA0B,CAAC;AACjC,QAAI,SAAS;AACb,WAAO,MAAM;AACX,YAAM,OAAO,MAAM,KAAK,kBAAkB,EAAE,OAAO,UAAU,QAAQ,mBAAmB,CAAC;AACzF,eAAS,KAAK,GAAG,KAAK,KAAK;AAC3B,UAAI,SAAS,UAAU,KAAK,SAAS,KAAK,MAAM,WAAW,EAAG,QAAO;AACrE,gBAAU,KAAK,MAAM;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,sBAAsB,QAMe;AACnC,WAAO,KAAK,kBAAkB,MAAM;AAAA,EACtC;AAAA,EAEA,4BAAwD;AACtD,WAAO,KAAK,OAAO,KAAK,OAAO,+BAA+B;AAAA,EAChE;AAAA,EAEA,cACE,QACA,aACA,kBACiC;AACjC,WAAO,KAAK,yBAAyB,EAAE,QAAQ,aAAa,iBAAiB,CAAC;AAAA,EAChF;AAAA,EAEA,yBAAyB,SAAgE;AACvF,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,uBAAuB,OAAO,CAAC;AAAA,EAClF;AAAA,EAEA,WAAW,WAAmB,MAA4C;AACxE,WAAO,KAAK,OAAO,aAAa,iBAAiB,SAAS,IAAI,IAAI;AAAA,EACpE;AAAA,EAEA,cAAc,WAAmB,SAAsD;AACrF,WAAO,KAAK,OAAO,KAAK,SAAS,iBAAiB,SAAS,IAAI,OAAO;AAAA,EACxE;AAAA,EAEA,cAAc,WAAmB,KAAqD;AACpF,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,SAAS,QAAQ,EAAE,IAAI,CAAC;AAAA,EAC1E;AAAA,EAEA,WAAW,WAAmB,QAAuC;AACnE,WAAO,KAAK,OAAO,KAAK,SAAS,iBAAiB,SAAS,QAAQ,EAAE,OAAO,CAAC;AAAA,EAC/E;AAAA,EAEA,mBAAmB,iBAAyB,QAAmB,GAAoC;AACjG,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,eAAe,WAAW,EAAE,MAAM,CAAC;AAAA,EACtF;AAAA,EAEA,oBACE,WACA,SACwD;AACxD,WAAO,KAAK,OAAO,KAAK,SAAS,iBAAiB,SAAS,WAAW,OAAO;AAAA,EAC/E;AAAA,EAEA,cAAc,WAAmB,QAA+C;AAC9E,WAAO,KAAK,OAAO,KAAK,SAAS,iBAAiB,SAAS,YAAY,EAAE,OAAO,CAAC;AAAA,EACnF;AAAA,EAEA,oBAAoB,WAAmB,eAA8D;AACnG,WAAO,KAAK,OAAO,KAAK,SAAS,iBAAiB,SAAS,WAAW;AAAA,MACpE,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,YAAY,WAA6C;AACvD,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,SAAS,UAAU,CAAC,CAAC;AAAA,EACxE;AAAA,EAEA,YAAY,WAAmB,OAA8C;AAC3E,WAAO,KAAK,OAAO,KAAK,UAAU,iBAAiB,SAAS,UAAU,mBAAmB,KAAK,CAAC,EAAE;AAAA,EACnG;AAAA,EAEA,iBAAiB,OAA0C;AACzD,WAAO,KAAK,OAAO,aAAa,cAAc,mBAAmB,KAAK,CAAC,IAAI;AAAA,MACzE,aAAa;AAAA,MACb,SAAS,EAAE,QAAQ,mBAAmB;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,WAAoC;AAClD,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,SAAS,QAAQ;AAAA,EACnE;AAAA,EAEA,gBAAgB,WAA8C;AAC5D,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,SAAS,WAAW;AAAA,EACtE;AAAA,EAEA,uBAAuB,WAAmB,MAAkD;AAC1F,WAAO,KAAK,OAAO,aAAa,iBAAiB,SAAS,kBAAkB,IAAI;AAAA,EAClF;AAAA,EAEA,kBAAkB,WAAmB,MAA6C;AAChF,WAAO,KAAK,OAAO,aAAa,iBAAiB,SAAS,YAAY,IAAI;AAAA,EAC5E;AAAA,EAEA,eAAe,QAAgB,OAAyC;AACtE,WAAO,KAAK,OAAO,KAAK,QAAQ,iCAAiC,EAAE,QAAQ,MAAM,CAAC;AAAA,EACpF;AAAA,EAEA,iBACE,UACA,SAMyB;AACzB,WAAO,KAAK,OAAO,KAAK,QAAQ,mCAAmC;AAAA,MACjE;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,uBAAuB,SAAS,yBAAyB;AAAA,MACzD,iBAAiB,SAAS,mBAAmB;AAAA,MAC7C,OAAO,SAAS,SAAS;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,sBACE,WACA,MAC8D;AAC9D,WAAO,KAAK,OAAO,aAAa,iBAAiB,SAAS,gBAAgB,IAAI;AAAA,EAChF;AAAA,EAEA,gBACE,WACA,cACA,UAC4D;AAC5D,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,SAAS,aAAa;AAAA,MACrE,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,WAAmB,cAAgE;AACrG,UAAM,SAAS,MAAM,KAAK,gBAAgB,WAAW,cAAc,QAAQ;AAC3E,WAAO,EAAE,IAAI,OAAO,IAAI,SAAS,OAAO,QAAQ;AAAA,EAClD;AAAA,EAEA,aAAa,WAAmB,cAAgE;AAC9F,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,SAAS,kBAAkB;AAAA,MAC1E,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,cAAc,WAAkD;AAC9D,WAAO,KAAK,OAAO,KAAK,UAAU,iBAAiB,SAAS,EAAE;AAAA,EAChE;AAAA,EAEA,oBAAoB,WAAmB,MAA+C;AACpF,WAAO,KAAK,OAAO,aAAa,iBAAiB,SAAS,qBAAqB,IAAI;AAAA,EACrF;AAAA,EAEA,kBACE,WACA,QACA,OAAO,KACP,MACyB;AACzB,WAAO,KAAK,OAAO,aAAa,iBAAiB,SAAS,qBAAqB,MAAM,SAAS,IAAI,IAAI,IAAI;AAAA,EAC5G;AAAA,EAEA,mBACE,WACA,QAC4D;AAC5D,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,SAAS,qBAAqB,MAAM,OAAO;AAAA,EAC9F;AAAA,EAGA,gBAAgB,WAAmB,KAA8C;AAC/E,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,iBAAiB,SAAS,kBAAkB,mBAAmB,GAAG,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,QAAQ,WAAmB,SAAuC;AAChE,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,SAAS,OAAO,mBAAmB,OAAO,CAAC,EAAE;AAAA,EAC/F;AAAA,EAEA,MAAM,YACJ,WACA,SACA,OACA,UAA8B,CAAC,GACoB;AACnD,UAAM,WAAW,IAAI,SAAS;AAC9B,UAAM,UAAU,MAAM,KAAK,KAAK,EAAE;AAAA,MAAI,CAAC,MACrC,aAAa,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAK;AAAA,IACnD;AACA,eAAW,SAAS,SAAS;AAC3B,eAAS,OAAO,SAAS,MAAM,MAAM,MAAM,IAAI;AAAA,IACjD;AACA,QAAI,QAAQ,KAAK,CAAC,MAAM,QAAQ,EAAE,KAAK,kBAAkB,CAAC,GAAG;AAC3D,eAAS,OAAO,SAAS,KAAK,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,sBAAsB,EAAE,IAAI,CAAC,CAAC;AAAA,IAClG;AACA,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC;AAAA,MACA,iBAAiB,SAAS,WAAW,mBAAmB,OAAO,CAAC;AAAA,MAChE;AAAA,MACA,EAAE,UAAU,OAAO,kBAAkB,QAAQ,WAAW;AAAA,IAC1D;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,WAAW,WAAmB,UAAiC;AACnE,UAAM,KAAK,OAAO,KAAK,UAAU,iBAAiB,SAAS,UAAU,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EACrG;AAAA,EAEA,UAAU,WAAmB,UAAkB,SAAgD;AAC7F,WAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,SAAS,UAAU,mBAAmB,QAAQ,CAAC,IAAI;AAAA,MACjG;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,WAAmB,UAAkB,SAA4C;AAC1F,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,SAAS,UAAU,mBAAmB,QAAQ,CAAC,WAAW;AAAA,MACzG,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,SAAS,WAAmB,UAA6C;AACvE,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,SAAS,UAAU,mBAAmB,QAAQ,CAAC,OAAO;AAAA,EACzG;AAAA,EAEA,UACE,WACA,YACA,UACA,aAC2C;AAC3C,WAAO,KAAK,OAAO,KAAK,QAAQ,iBAAiB,SAAS,eAAe;AAAA,MACvE,aAAa;AAAA,MACb,WAAW,YAAY;AAAA,MACvB,cAAc,eAAe;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB,WAAmB,SAAyB;AAC5D,WAAO,KAAK,OAAO,eAAe,iBAAiB,SAAS,iBAAiB,mBAAmB,OAAO,CAAC,EAAE;AAAA,EAC5G;AAAA,EAEA,MAAM,cAAc,WAAkC;AACpD,UAAM,KAAK,WAAW,SAAS;AAC/B,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO,KAAK,OAAO,eAAe,iBAAiB,SAAS,SAAS;AACvE,MAAE,WAAW,GAAG,SAAS;AACzB,aAAS,KAAK,YAAY,CAAC;AAC3B,MAAE,MAAM;AACR,MAAE,OAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAAc,MAAoC;AACtD,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,QAAQ,IAAI;AACxB,UAAM,MAAM,MAAM,KAAK,OAAO,SAAS,QAAQ,gCAAgC,IAAI;AACnF,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,cACJ,MACA,MACA,YACiC;AACjC,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,QAAQ,IAAI;AACxB,QAAI,KAAM,MAAK,OAAO,QAAQ,IAAI;AAClC,QAAI,WAAY,MAAK,OAAO,eAAe,UAAU;AACrD,UAAM,MAAM,MAAM,KAAK,OAAO,SAAS,QAAQ,wBAAwB,IAAI;AAC3E,WAAO,IAAI,KAAK;AAAA,EAClB;AACF;;;AC9aO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,WAAW,MAA6C;AACtD,WAAO,KAAK,OAAO,aAAa,eAAe,IAAI;AAAA,EACrD;AAAA,EAEA,4BAA4B,MAAuD;AACjF,WAAO,KAAK,OAAO,aAAa,yBAAyB,IAAI;AAAA,EAC/D;AAAA,EAEA,kBAAkB,WAAmB,MAA6C;AAChF,WAAO,KAAK,OAAO,aAAa,iBAAiB,mBAAmB,SAAS,CAAC,WAAW,IAAI;AAAA,EAC/F;AAAA,EAEA,aACE,WACA,MACkF;AAClF,WAAO,KAAK,OAAO,aAAa,iBAAiB,mBAAmB,SAAS,CAAC,kBAAkB;AAAA,MAC9F,QAAQ;AAAA,MACR,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAAe,QAAQ,IAAI,MAAkD;AAC9F,UAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,OAAO,OAAO,OAAO,KAAK,EAAE,CAAC;AACrE,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC,sBAAsB,MAAM;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,cAAc,WAAmB,MAAyC;AACxE,WAAO,KAAK,OAAO,aAAa,iBAAiB,mBAAmB,SAAS,CAAC,gBAAgB,IAAI;AAAA,EACpG;AAAA,EAEA,oBAAoB,MAA+C;AACjE,WAAO,KAAK,OAAO,aAAa,0BAA0B,IAAI;AAAA,EAChE;AAAA,EAEA,SAAS,WAAmB,MAA0C;AACpE,WAAO,KAAK,OAAO,aAAa,eAAe,mBAAmB,SAAS,CAAC,IAAI,IAAI;AAAA,EACtF;AAAA,EAEA,mBACE,WACA,SACA,MACmC;AACnC,WAAO,KAAK,OAAO,aAAa,iBAAiB,mBAAmB,SAAS,CAAC,kBAAkB;AAAA,MAC9F,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,oBACE,WACA,SACA,MACoC;AACpC,WAAO,KAAK,mBAAmB,WAAW,SAAS,IAAI;AAAA,EACzD;AACF;;;ACPO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,eAAmD;AACjD,WAAO,KAAK,OAAO,KAAK,OAAO,gCAAgC;AAAA,EACjE;AAAA,EAEA,YAAY,YAAsD;AAChE,WAAO,KAAK,OAAO,KAAK,OAAO,kCAAkC,UAAU,EAAE;AAAA,EAC/E;AAAA,EAEA,eAAe,YAA8C;AAC3D,WAAO,KAAK,OAAO,KAAK,UAAU,kCAAkC,UAAU,EAAE;AAAA,EAClF;AAAA,EAEA,eAAe,SAAiF;AAC9F,WAAO,KAAK,OAAO,KAAK,QAAQ,kCAAkC,OAAO;AAAA,EAC3E;AAAA,EAEA,eACE,YACA,SACkC;AAClC,WAAO,KAAK,OAAO,KAAK,SAAS,kCAAkC,UAAU,IAAI,OAAO;AAAA,EAC1F;AAAA,EAEA,uBACE,YACA,UACA,WACA,WACA,UACkC;AAClC,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,kCAAkC,UAAU,WAAW,QAAQ,YAAY,SAAS;AAAA,MACpF;AAAA,QACE,YAAY;AAAA,QACZ,eAAe,UAAU,QAAQ;AAAA,QACjC,eAAe,UAAU,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,sBACE,YACA,UACA,WACA,SAAS,WAC4B;AACrC,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,kCAAkC,UAAU,WAAW,QAAQ,YAAY,SAAS;AAAA,MACpF,EAAE,SAAS,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,eACE,YACA,UACA,WACA,SAAS,WAC4B;AACrC,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,kCAAkC,UAAU,WAAW,QAAQ,YAAY,SAAS;AAAA,MACpF,EAAE,SAAS,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,aACE,YACA,UACA,WACA,SAAS,WAC4B;AACrC,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,kCAAkC,UAAU,WAAW,QAAQ,YAAY,SAAS;AAAA,MACpF,EAAE,SAAS,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,gBAAgB,YAA0D;AACxE,WAAO,KAAK,OAAO,KAAK,OAAO,kCAAkC,UAAU,eAAe;AAAA,EAC5F;AAAA,EAEA,iBACE,YACA,SACoC;AACpC,WAAO,KAAK,OAAO,KAAK,QAAQ,kCAAkC,UAAU,iBAAiB,OAAO;AAAA,EACtG;AAAA,EAEA,MAAM,wBACJ,YACA,OACmD;AACnD,UAAM,WAAW,IAAI,SAAS;AAC9B,eAAW,QAAQ,MAAO,UAAS,OAAO,SAAS,IAAI;AACvD,UAAM,MAAM,MAAM,KAAK,OAAO;AAAA,MAC5B;AAAA,MACA,kCAAkC,UAAU;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,mBAAmB,YAAqD;AACtE,WAAO,KAAK,OAAO,KAAK,QAAQ,kCAAkC,UAAU,gBAAgB;AAAA,EAC9F;AAAA,EAEA,gBAAgB,YAA4D;AAC1E,WAAO,KAAK,OAAO,KAAK,OAAO,kCAAkC,UAAU,eAAe;AAAA,EAC5F;AAAA,EAEA,YACE,YACA,SAM2E;AAC3E,WAAO,KAAK,OAAO,KAAK,QAAQ,kCAAkC,UAAU,iBAAiB,OAAO;AAAA,EACtG;AAAA,EAEA,qBAAqB,YAAoB,MAA4C;AACnF,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,kCAAkC,UAAU,4BAA4B,mBAAmB,IAAI,CAAC;AAAA,IAClG;AAAA,EACF;AAAA,EAEA,UAAU,YAA4D;AACpE,WAAO,KAAK,OAAO,KAAK,QAAQ,kCAAkC,UAAU,aAAa;AAAA,EAC3F;AAAA,EAEA,WAAW,YAAqD;AAC9D,WAAO,KAAK,OAAO,KAAK,OAAO,kCAAkC,UAAU,SAAS;AAAA,EACtF;AAAA,EAEA,cACE,YACA,QACiC;AACjC,WAAO,KAAK,OAAO,KAAK,OAAO,kCAAkC,UAAU,WAAW,EAAE,OAAO,CAAC;AAAA,EAClG;AAAA,EAEA,oBAAoB,YAA4B;AAC9C,WAAO,KAAK,OAAO,eAAe,kCAAkC,UAAU,SAAS;AAAA,EACzF;AAAA,EAEA,MAAM,cAAc,MAAsF;AACxG,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI;AAC5B,UAAM,MAAM,MAAM,KAAK,OAAO,SAAS,QAAQ,yCAAyC,QAAQ;AAChG,WAAO,IAAI,KAAK;AAAA,EAClB;AACF;;;ACpPO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,MAAM,iBAAsC;AAC1C,UAAM,UAAU,MAAM,KAAK,OAAO,KAA0C,OAAO,gBAAgB;AACnG,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAAA,EACzD;AAAA,EAEA,kBAAkB,YAAoB,UAAmC;AACvE,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,kBAAkB,mBAAmB,UAAU,CAAC,UAAU,mBAAmB,QAAQ,CAAC;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,MAAM,sBAAsB,YAAoB,QAAqC;AACnF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ;AACV,aAAO,IAAI,WAAW,MAAM;AAAA,IAC9B;AACA,UAAM,SAAS,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK;AAC7D,UAAM,UAAU,MAAM,KAAK,OAAO;AAAA,MAChC;AAAA,MACA,kBAAkB,mBAAmB,UAAU,CAAC,aAAa,MAAM;AAAA,IACrE;AACA,WAAO,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAAA,EACzD;AACF;;;ACTO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,MAAM,kBAAkB,KAAqC;AAC3D,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC;AAAA,MACA,yBAAyB,mBAAmB,GAAG,CAAC;AAAA,IAClD;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,kBAAkB,KAAa,OAA8B;AACjE,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MACA,yBAAyB,mBAAmB,GAAG,CAAC;AAAA,MAChD,EAAE,MAAM;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,uBAAyC;AAC7C,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC;AAAA,MACA;AAAA,IACF;AACA,WAAO,SAAS,UAAU;AAAA,EAC5B;AAAA,EAEA,MAAM,qBAAqB,OAA+B;AACxD,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,MACA,EAAE,OAAO,QAAQ,SAAS,QAAQ;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,gBAA+B;AACnC,UAAM,KAAK,OAAO,KAAK,QAAQ,gCAAgC,CAAC,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,2BAAmE;AACvE,WAAO,MAAM,KAAK,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAoD;AACxD,WAAO,MAAM,KAAK,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACvBO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAAoB,QAAqB;AAArB;AAAA,EAAsB;AAAA,EAAtB;AAAA,EAEpB,wBACE,QACwC;AACxC,WAAO,KAAK,OAAO,KAAK,QAAQ,6BAA6B,MAAM;AAAA,EACrE;AAAA,EAEA,MAAM,6BAA+D;AACnE,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,gCAAgC,WAA0D;AACxF,WAAO,KAAK,OAAO,KAAK,OAAO,6BAA6B,SAAS,eAAe;AAAA,EACtF;AAAA,EAEA,2BAA2B,WAAqD;AAC9E,WAAO,KAAK,OAAO,KAAK,OAAO,6BAA6B,SAAS,SAAS;AAAA,EAChF;AAAA,EAEA,0BAA0B,WAAoD;AAC5E,WAAO,KAAK,OAAO,KAAK,OAAO,6BAA6B,SAAS,gBAAgB;AAAA,EACvF;AAAA,EAEA,uBAAuB,WAA8D;AACnF,WAAO,KAAK,OAAO,KAAK,QAAQ,6BAA6B,SAAS,QAAQ;AAAA,EAChF;AAAA,EAEA,sBAAsB,WAA8D;AAClF,WAAO,KAAK,OAAO,KAAK,QAAQ,6BAA6B,SAAS,OAAO;AAAA,EAC/E;AAAA,EAEA,6BAA6B,WAAiE;AAC5F,WAAO,KAAK,OAAO,KAAK,QAAQ,6BAA6B,SAAS,uBAAuB;AAAA,EAC/F;AAAA,EAEA,wBACE,WACA,MACA,OAAuB,SAC8D;AACrF,UAAM,UAAoD,EAAE,KAAK;AACjE,UAAM,iBAAiB,MAAM,KAAK;AAClC,QAAI,eAAgB,SAAQ,OAAO;AACnC,WAAO,KAAK,OAAO,KAAK,QAAQ,6BAA6B,SAAS,WAAW,OAAO;AAAA,EAC1F;AAAA,EAEA,MAAM,6BAA6B,WAAsD;AACvF,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B;AAAA,MACA,6BAA6B,SAAS;AAAA,IACxC;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,6BACE,WACA,SACwF;AACxF,UAAM,QAAQ,UAAU,YAAY,mBAAmB,OAAO,CAAC,KAAK;AACpE,WAAO,KAAK,OAAO,KAAK,QAAQ,6BAA6B,SAAS,gBAAgB,KAAK,EAAE;AAAA,EAC/F;AAAA,EAEA,4BACE,WACA,SAC2C;AAC3C,UAAM,QAAQ,UAAU,YAAY,mBAAmB,OAAO,CAAC,KAAK;AACpE,WAAO,KAAK,OAAO,KAAK,QAAQ,6BAA6B,SAAS,eAAe,KAAK,EAAE;AAAA,EAC9F;AAAA,EAEA,8BAA8B,WAAmB,SAA2C;AAC1F,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,6BAA6B,SAAS,oBAAoB,mBAAmB,OAAO,CAAC;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,wBAAwB,WAA6C;AACnE,WAAO,KAAK,OAAO,KAAK,UAAU,6BAA6B,SAAS,EAAE;AAAA,EAC5E;AAAA,EAEA,uBAAuB,WAAmB,KAA8C;AACtF,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,6BAA6B,SAAS,cAAc,mBAAmB,GAAG,CAAC;AAAA,IAC7E;AAAA,EACF;AAAA,EAEA,MAAM,wBAAwB,WAAkC;AAC9D,UAAM,MAAM,MAAM,KAAK,OAAO,MAAM,OAAO,6BAA6B,SAAS,SAAS;AAC1F,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,WAAW,GAAG,SAAS;AACzB,aAAS,KAAK,YAAY,CAAC;AAC3B,MAAE,MAAM;AACR,MAAE,OAAO;AACT,QAAI,gBAAgB,GAAG;AAAA,EACzB;AAAA,EAEA,MAAM,wBACJ,MACA,MACA,gBACwC;AACxC,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,QAAQ,IAAI;AACxB,QAAI,KAAM,MAAK,OAAO,QAAQ,IAAI;AAClC,QAAI,eAAgB,MAAK,OAAO,mBAAmB,cAAc;AACjE,UAAM,MAAM,MAAM,KAAK,OAAO,SAAS,QAAQ,oCAAoC,IAAI;AACvF,WAAO,IAAI,KAAK;AAAA,EAClB;AACF;;;AC7KA,SAAS,UAAuB;;;ACczB,SAAS,gBAAgB,SAAqD;AACnF,QAAM,QAAQ,iBAAiB,OAAO;AACtC,SAAO,QAAQ,EAAE,MAAM,IAAI;AAC7B;AAEO,SAAS,iBAAiB,SAAqC;AACpE,QAAM,QAAQ,OAAO,QAAQ,UAAU,aAAa,QAAQ,MAAM,IAAI,QAAQ;AAC9E,SAAO,QAAQ,QAAQ;AACzB;;;ADXO,SAAS,aAAa,SAA2C;AACtE,QAAM,OAAO,gBAAgB,OAAO;AACpC,SAAO,GAAG,QAAQ,SAAS;AAAA,IACzB,MAAM,QAAQ,QAAQ;AAAA,IACtB,iBAAiB;AAAA,IACjB,MAAM,OAAO,QAAQ,UAAU,aAAa,CAAC,OAAO,GAAG,gBAAgB,OAAO,KAAK,CAAC,CAAC,IAAI;AAAA,IACzF,aAAa;AAAA,EACf,CAAC;AACH;;;AEOA,IAAM,eAAe;AAEd,IAAM,cAAN,MAAkB;AAAA,EACf,iBAA0C;AAAA,EAC1C,iBAAqC;AAAA,EACrC,yBAAmE;AAAA,EACnE,2BAAqE;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAA6B;AACvC,SAAK,UAAU;AAAA,MACb,GAAG;AAAA,MACH,SAAS,iBAAiB,QAAQ,OAAO;AAAA,IAC3C;AACA,SAAK,UAAU,IAAI,gBAAgB,IAAI;AACvC,SAAK,OAAO,IAAI,aAAa,IAAI;AACjC,SAAK,aAAa,IAAI,mBAAmB,IAAI;AAC7C,SAAK,MAAM,IAAI,YAAY,IAAI;AAC/B,SAAK,WAAW,IAAI,iBAAiB,IAAI;AACzC,SAAK,WAAW,IAAI,iBAAiB,IAAI;AACzC,SAAK,SAAS,IAAI,eAAe,IAAI;AACrC,SAAK,gBAAgB,IAAI,sBAAsB,IAAI;AACnD,SAAK,WAAW,IAAI,iBAAiB,IAAI;AACzC,SAAK,YAAY,IAAI,kBAAkB,IAAI;AAC3C,SAAK,WAAW,IAAI,iBAAiB,IAAI;AACzC,SAAK,SAAS,IAAI,eAAe,IAAI;AACrC,SAAK,kBAAkB,IAAI,wBAAwB,IAAI;AACvD,SAAK,YAAY,IAAI,kBAAkB,IAAI;AAC3C,SAAK,kBAAkB,IAAI,wBAAwB,IAAI;AACvD,SAAK,aAAa,IAAI,mBAAmB,IAAI;AAAA,EAC/C;AAAA,EAEA,8BAA8B,IAA2C;AACvE,SAAK,yBAAyB;AAAA,EAChC;AAAA,EAEA,gCAAgC,IAA2C;AACzE,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEA,WAAW,SAAuB;AAChC,UAAM,cAAc,iBAAiB,OAAO;AAC5C,QAAI,gBAAgB,KAAK,QAAQ,SAAS;AACxC;AAAA,IACF;AACA,SAAK,QAAQ,UAAU;AACvB,QAAI,KAAK,gBAAgB;AACvB,WAAK,eAAe,mBAAmB;AACvC,WAAK,eAAe,WAAW;AAC/B,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,SAAsB;AACpB,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAiB,aAAa;AAAA,QACjC,SAAS,KAAK,QAAQ;AAAA,QACtB,OAAO,MAAM,KAAK,mBAAmB;AAAA,MACvC,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,KAAQ,QAAoB,MAAc,MAA4B;AAC1E,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,MAAM;AAAA,MAC9C,MAAM,SAAS,SAAY,SAAY,KAAK,UAAU,IAAI;AAAA,MAC1D,SAAS,SAAS,SAAY,SAAY,EAAE,gBAAgB,mBAAmB;AAAA,IACjF,CAAC;AACD,WAAO,iBAAiB,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAM,aAAgB,MAAc,OAAoB,CAAC,GAAe;AACtE,UAAM,UAAU,KAAK,UAAU,OAAO,YAAY;AAClD,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,QAAI,KAAK,QAAQ,QAAQ,CAAC,WAAW,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,cAAc,GAAG;AAC/E,cAAQ,IAAI,gBAAgB,kBAAkB;AAAA,IAChD;AACA,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,MAAM;AAAA,MAC9C,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,WAAO,iBAAiB,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAM,KAAK,QAAoB,MAA+B;AAC5D,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,IAAI;AAC9C,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,aAAa,MAAc,OAAoB,CAAC,GAAoB;AACxE,UAAM,UAAU,KAAK,UAAU,OAAO,YAAY;AAClD,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,MAAM;AAAA,MAC9C,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,iBAAiB,MAAc,OAAoB,CAAC,GAAsB;AAC9E,UAAM,UAAU,KAAK,UAAU,OAAO,YAAY;AAClD,WAAO,KAAK,MAAM,QAAQ,MAAM;AAAA,MAC9B,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,QAAoB,MAA6B;AAC1D,UAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,IAAI;AAC9C,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,SACJ,QACA,MACA,MACA,UAAyF,CAAC,GACvE;AACnB,QAAI,QAAQ,oBAAoB,CAAC,KAAK,QAAQ,aAAa,OAAO,mBAAmB,aAAa;AAChG,aAAO,KAAK,2BAA2B,QAAQ,MAAM,MAAM,OAAO;AAAA,IACpE;AACA,WAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,MAAM,MAAM,UAAU,QAAQ,SAAS,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAM,MACJ,QACA,MACA,OAAuB,CAAC,GACxB,UAAU,OACS;AACnB,UAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,UAAM,WAAW,OAAO,KAAK,QAAQ,aAAa,OAAO,IAAI,SAAS,GAAG;AAAA,MACvE;AAAA,MACA,MAAM,KAAK;AAAA,MACX,aAAa,KAAK,eAAe;AAAA,MACjC,SAAS,KAAK,aAAa,KAAK,KAAK,OAAO;AAAA,MAC5C,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,QAAI,SAAS,WAAW,OAAO,CAAC,WAAW,KAAK,oBAAoB,GAAG,GAAG;AACxE,YAAM,YAAY,MAAM,KAAK,WAAW;AACxC,UAAI,WAAW;AACb,eAAO,KAAK,MAAM,QAAQ,MAAM,MAAM,IAAI;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,SAAS,CAAC,SAAS,IAAI;AAC3C,YAAM,SAAS,MAAM,mBAAmB,QAAQ;AAChD,YAAM,IAAI,cAAc,UAAU,MAAM;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,MAAsB;AACnC,UAAM,MAAM,IAAI,IAAI,KAAK,mBAAmB,IAAI,GAAG,KAAK,yBAAyB,CAAC;AAClF,UAAM,QAAQ,KAAK,mBAAmB,GAAG;AACzC,QAAI,OAAO;AACT,UAAI,aAAa,IAAI,SAAS,KAAK;AAAA,IACrC;AACA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAEQ,aAAa,KAAU,SAAgC;AAC7D,UAAM,SAAS,IAAI,QAAQ,OAAO;AAClC,QAAI,CAAC,KAAK,iBAAiB,GAAG,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,KAAK,iBAAiB;AACpC,QAAI,OAAO;AACT,aAAO,IAAI,iBAAiB,UAAU,KAAK,EAAE;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAmB;AAClC,WAAO,IAAI,IAAI,KAAK,mBAAmB,IAAI,GAAG,KAAK,yBAAyB,CAAC;AAAA,EAC/E;AAAA,EAEQ,2BAAmC;AACzC,WAAO,KAAK,QAAQ,QAAQ,SAAS,GAAG,IAAI,KAAK,QAAQ,UAAU,GAAG,KAAK,QAAQ,OAAO;AAAA,EAC5F;AAAA,EAEQ,mBAAmB,MAAsB;AAC/C,WAAO,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,EAChD;AAAA,EAEQ,iBAAiB,KAAmB;AAC1C,UAAM,OAAO,IAAI,IAAI,KAAK,yBAAyB,CAAC;AACpD,QAAI,IAAI,WAAW,KAAK,QAAQ;AAC9B,aAAO;AAAA,IACT;AACA,UAAM,WAAW,KAAK,SAAS,QAAQ,QAAQ,EAAE;AACjD,QAAI,aAAa,IAAI;AACnB,aAAO;AAAA,IACT;AACA,WAAO,IAAI,aAAa,YAAY,IAAI,SAAS,WAAW,GAAG,QAAQ,GAAG;AAAA,EAC5E;AAAA,EAEQ,oBAAoB,KAAmB;AAC7C,UAAM,aAAa,KAAK,SAAS,YAAY;AAC7C,WACE,KAAK,iBAAiB,GAAG,KACzB,IAAI,aAAa,WAAW,YAC5B,CAAC,KAAK,uBAAuB;AAAA,EAEjC;AAAA,EAEQ,yBAAkC;AACxC,WAAO,KAAK,QAAQ,UAAU;AAAA,EAChC;AAAA,EAEA,MAAc,aAA+B;AAC3C,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,kBAAkB,YAAY;AACjC,UAAI;AACF,cAAM,WAAW,OAAO,KAAK,QAAQ,aAAa;AAAA,UAChD,KAAK,SAAS,YAAY,EAAE,SAAS;AAAA,UACrC;AAAA,YACE,QAAQ;AAAA,YACR,aAAa;AAAA,UACf;AAAA,QACF;AACA,YAAI,CAAC,SAAS,IAAI;AAChB,iBAAO;AAAA,QACT;AACA,cAAM,KAAK,QAAQ,mBAAmB;AACtC,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT,UAAE;AACA,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF,GAAG;AAEH,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,mBAAmB,KAAyB;AAClD,QAAI,CAAC,KAAK,iBAAiB,GAAG,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AAAA,EAEQ,mBAAkC;AACxC,WAAO,KAAK,aAAa,KAAK,sBAAsB;AAAA,EACtD;AAAA,EAEQ,qBAAoC;AAC1C,WAAO,KAAK,aAAa,KAAK,wBAAwB;AAAA,EACxD;AAAA,EAEQ,aAAa,UAAmE;AACtF,UAAM,QACJ,KAAK,QAAQ,UAAU,SACnB,WAAW,IACX,OAAO,KAAK,QAAQ,UAAU,aAC5B,KAAK,QAAQ,MAAM,IACnB,KAAK,QAAQ;AACrB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEQ,2BACN,QACA,MACA,MACA,SACA,UAAU,OACS;AACnB,UAAM,MAAM,KAAK,SAAS,IAAI;AAC9B,UAAM,UAAU,KAAK,aAAa,GAAG;AAErC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,MAAM,IAAI,eAAe;AAC/B,UAAI,KAAK,QAAQ,IAAI,SAAS,GAAG,IAAI;AACrC,UAAI,kBAAkB;AAEtB,cAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC9B,YAAI,iBAAiB,KAAK,KAAK;AAAA,MACjC,CAAC;AAED,UAAI,OAAO,aAAa,CAAC,UAAU;AACjC,gBAAQ,mBAAmB;AAAA,UACzB,QAAQ,MAAM;AAAA,UACd,OAAO,MAAM,mBAAmB,MAAM,QAAQ;AAAA,UAC9C,SAAS,MAAM,oBAAoB,MAAM,QAAQ,IAAI,MAAM,SAAS,MAAM,QAAQ;AAAA,QACpF,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,MAAM,OAAO,IAAI,UAAU,wBAAwB,CAAC;AAClE,UAAI,YAAY,MAAM,OAAO,IAAI,UAAU,2BAA2B,CAAC;AACvE,UAAI,UAAU,MAAM,OAAO,IAAI,aAAa,mBAAmB,YAAY,CAAC;AAC5E,UAAI,SAAS,YAAY;AACvB,YAAI,IAAI,WAAW,OAAO,CAAC,WAAW,KAAK,oBAAoB,GAAG,GAAG;AACnE,gBAAM,YAAY,MAAM,KAAK,WAAW;AACxC,cAAI,WAAW;AACb,oBAAQ,KAAK,2BAA2B,QAAQ,MAAM,MAAM,SAAS,IAAI,CAAC;AAC1E;AAAA,UACF;AAAA,QACF;AAEA,cAAM,WAAW,IAAI,SAAS,IAAI,cAAc;AAAA,UAC9C,QAAQ,IAAI;AAAA,UACZ,YAAY,IAAI;AAAA,UAChB,SAAS,gBAAgB,IAAI,sBAAsB,CAAC;AAAA,QACtD,CAAC;AACD,YAAI,QAAQ,aAAa,SAAS,CAAC,SAAS,IAAI;AAC9C,gBAAM,SAAS,MAAM,mBAAmB,SAAS,MAAM,CAAC;AACxD,iBAAO,IAAI,cAAc,UAAU,MAAM,CAAC;AAC1C;AAAA,QACF;AACA,gBAAQ,mBAAmB,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC;AAC9D,gBAAQ,QAAQ;AAAA,MAClB;AAEA,UAAI,KAAK,IAAI;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAQA,SAAS,iBAAiB,SAAyB;AACjD,QAAM,aAAa,QAAQ,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACpD,MAAI,cAAc,OAAO,WAAW,aAAa;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,OAAO,SAAS;AACzB;AAEA,SAAS,WAAW,OAA0B;AAC5C,SAAO,OAAO,aAAa,eAAe,iBAAiB;AAC7D;AAEA,SAAS,iBAAoB,UAAgC;AAC3D,MAAI,SAAS,WAAW,OAAO,SAAS,QAAQ,IAAI,gBAAgB,MAAM,KAAK;AAC7E,WAAO,QAAQ,QAAQ,MAAc;AAAA,EACvC;AACA,SAAO,SAAS,KAAK;AACvB;AAEA,SAAS,gBAAgB,YAA6B;AACpD,QAAM,UAAU,IAAI,QAAQ;AAC5B,aAAW,QAAQ,WAAW,KAAK,EAAE,MAAM,SAAS,GAAG;AACrD,UAAM,iBAAiB,KAAK,QAAQ,GAAG;AACvC,QAAI,kBAAkB,EAAG;AACzB,YAAQ,OAAO,KAAK,MAAM,GAAG,cAAc,EAAE,KAAK,GAAG,KAAK,MAAM,iBAAiB,CAAC,EAAE,KAAK,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;","names":["type"]}
@@ -6,7 +6,7 @@ import {
6
6
  formatToolName,
7
7
  getAuthedUrl,
8
8
  useUiStore
9
- } from "./chunk-SPHQXYME.js";
9
+ } from "./chunk-RNSHL4GA.js";
10
10
  import {
11
11
  cn,
12
12
  copyToClipboard
@@ -1728,4 +1728,4 @@ export {
1728
1728
  PlanSummaryCard,
1729
1729
  extractLatestPlanMessages
1730
1730
  };
1731
- //# sourceMappingURL=chunk-RQUD3FGD.js.map
1731
+ //# sourceMappingURL=chunk-HLRMETK7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSessionStore
3
- } from "./chunk-SPHQXYME.js";
3
+ } from "./chunk-RNSHL4GA.js";
4
4
 
5
5
  // src/react/hooks/use-session.ts
6
6
  function useSession() {
@@ -27,4 +27,4 @@ function useSession() {
27
27
  export {
28
28
  useSession
29
29
  };
30
- //# sourceMappingURL=chunk-GIY3MV6F.js.map
30
+ //# sourceMappingURL=chunk-QJG7TK2W.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-J3XVFPOV.js";
4
4
  import {
5
5
  BladeClient
6
- } from "./chunk-SZKVEYL6.js";
6
+ } from "./chunk-7EVVRQ7G.js";
7
7
  import {
8
8
  createClientActions,
9
9
  useCardStateStore
@@ -447,7 +447,7 @@ function extractTextAttachments(content) {
447
447
  });
448
448
  }
449
449
  return {
450
- cleanText: working.replace(ATTACHMENT_TAG_RE, "").trim(),
450
+ cleanText: working.replace(ATTACHMENT_TAG_RE, ""),
451
451
  attachments: attachments2,
452
452
  contexts: contexts2
453
453
  };
@@ -471,13 +471,13 @@ function extractTextAttachments(content) {
471
471
  hasAttachment = true;
472
472
  }
473
473
  if (hasAttachment) {
474
- const remaining = part.text.replace(ATTACHMENT_TAG_RE, "").trim();
475
- if (remaining) cleanParts.push(remaining);
474
+ const remaining = part.text.replace(ATTACHMENT_TAG_RE, "");
475
+ if (remaining.trim()) cleanParts.push(remaining);
476
476
  } else {
477
477
  cleanParts.push(part.text);
478
478
  }
479
479
  }
480
- return { cleanText: cleanParts.join("\n").trim(), attachments, contexts };
480
+ return { cleanText: cleanParts.join("\n"), attachments, contexts };
481
481
  }
482
482
  function getImageParts(content) {
483
483
  if (typeof content === "string") return [];
@@ -3141,4 +3141,4 @@ export {
3141
3141
  bootstrapBladeClient,
3142
3142
  getBootstrappedClient
3143
3143
  };
3144
- //# sourceMappingURL=chunk-SPHQXYME.js.map
3144
+ //# sourceMappingURL=chunk-RNSHL4GA.js.map