@blade-hq/agent-kit 0.5.1 → 0.5.3

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 (35) hide show
  1. package/dist/{AskUserQuestionBlock-CjvG_pUY.d.ts → AskUserQuestionBlock---kOTouk.d.ts} +2 -2
  2. package/dist/{SkillStatusBar-B7-EU8A4.d.ts → SkillStatusBar-BKAGU9tr.d.ts} +7 -5
  3. package/dist/{blade-client-BKiP6U73.d.ts → blade-client-R3cLVOYs.d.ts} +31 -5
  4. package/dist/{chunk-L2KVYOQP.js → chunk-BFF6D2XV.js} +2 -2
  5. package/dist/{chunk-UPHYN7CQ.js → chunk-IRCXJHXT.js} +2 -2
  6. package/dist/{chunk-ROGNJYST.js → chunk-Q6CSM5DE.js} +63 -5
  7. package/dist/chunk-Q6CSM5DE.js.map +1 -0
  8. package/dist/{chunk-75BPCDBW.js → chunk-RTBAPZIO.js} +277 -216
  9. package/dist/chunk-RTBAPZIO.js.map +1 -0
  10. package/dist/{chunk-DSBIKYKQ.js → chunk-UQEXX57F.js} +16 -10
  11. package/dist/chunk-UQEXX57F.js.map +1 -0
  12. package/dist/{chunk-DAFIIANJ.js → chunk-ZQQNSKQS.js} +2 -11
  13. package/dist/chunk-ZQQNSKQS.js.map +1 -0
  14. package/dist/client/index.d.ts +11 -7
  15. package/dist/client/index.js +1 -1
  16. package/dist/{projection-DIfyh6RK.d.ts → projection-BWYEFYNn.d.ts} +1 -1
  17. package/dist/react/api/vibe-coding.d.ts +3 -3
  18. package/dist/react/api/vibe-coding.js +2 -2
  19. package/dist/react/components/chat/index.d.ts +6 -6
  20. package/dist/react/components/chat/index.js +5 -5
  21. package/dist/react/components/plan/index.d.ts +3 -3
  22. package/dist/react/components/plan/index.js +3 -3
  23. package/dist/react/components/session/index.js +3 -3
  24. package/dist/react/components/workspace/index.js +32 -4
  25. package/dist/react/components/workspace/index.js.map +1 -1
  26. package/dist/react/index.d.ts +15 -11
  27. package/dist/react/index.js +6 -6
  28. package/dist/style.css +1 -1
  29. package/package.json +1 -1
  30. package/dist/chunk-75BPCDBW.js.map +0 -1
  31. package/dist/chunk-DAFIIANJ.js.map +0 -1
  32. package/dist/chunk-DSBIKYKQ.js.map +0 -1
  33. package/dist/chunk-ROGNJYST.js.map +0 -1
  34. /package/dist/{chunk-L2KVYOQP.js.map → chunk-BFF6D2XV.js.map} +0 -0
  35. /package/dist/{chunk-UPHYN7CQ.js.map → chunk-IRCXJHXT.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { P as PendingQuestionRef, C as ContentBlock } from './projection-DIfyh6RK.js';
1
+ import { P as PendingQuestionRef, C as ContentBlock } from './projection-BWYEFYNn.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
 
4
4
  interface TextContentPart {
@@ -72,7 +72,7 @@ interface ChatMessage {
72
72
  entry_id?: string;
73
73
  parent_id?: string | null;
74
74
  loop_name?: string;
75
- /** Entry kind from backend present for non-message entries like planning_enter/exit */
75
+ /** Entry kind from backend -- present for non-message entries like mode changes. */
76
76
  kind?: string;
77
77
  /** Memory references injected into this turn's context */
78
78
  memory_refs?: MemoryRefInfo[];
@@ -1,11 +1,11 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { ComponentType, ReactNode } from 'react';
4
- import { C as ChatMessage, A as AskUserAnswerData, T as ToolCallInfo, M as MessageContent } from './AskUserQuestionBlock-CjvG_pUY.js';
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-nZdIuWrS.js';
7
- import { j as BladeClient } from './blade-client-BKiP6U73.js';
8
- import { C as ContentBlock } from './projection-DIfyh6RK.js';
7
+ import { j as BladeClient } from './blade-client-R3cLVOYs.js';
8
+ import { C as ContentBlock } from './projection-BWYEFYNn.js';
9
9
 
10
10
  /**
11
11
  * 把 whatif-rerun 后端组装的 prompt 文本解析成可折叠展示的结构。
@@ -213,8 +213,9 @@ declare const useSessionStore: zustand.UseBoundStore<zustand.StoreApi<SessionSta
213
213
 
214
214
  interface Props$2 {
215
215
  onSend: (message: MessageContent, targetSessionId?: string, model?: string | null) => void;
216
- onStop: () => void;
216
+ onStop: () => void | Promise<void>;
217
217
  isStreaming: boolean;
218
+ isStopping?: boolean;
218
219
  mode?: SessionMode;
219
220
  onToggleMode?: () => void;
220
221
  renderAttachments?: () => ReactNode;
@@ -274,8 +275,9 @@ type FileComposerAttachment = {
274
275
  file?: File;
275
276
  uploadedPath?: string;
276
277
  textContent?: string | null;
278
+ uploadProgress?: number | null;
277
279
  };
278
- declare function ChatInput({ onSend, onStop, isStreaming, mode, onToggleMode, renderAttachments, onBeforeSend, ensureSession, onCommand, canShareSession, slotAboveTextarea, externalDraft, externalAttachments, maxWidthClassName, className, innerClassName, SkillStatusBarComponent, skillStatusBarClassName, skillStatusBarInnerClassName, onResyncSkills, isResyncingSkills, }: Props$2): react_jsx_runtime.JSX.Element;
280
+ declare function ChatInput({ onSend, onStop, isStreaming, isStopping, mode, onToggleMode, renderAttachments, onBeforeSend, ensureSession, onCommand, canShareSession, slotAboveTextarea, externalDraft, externalAttachments, maxWidthClassName, className, innerClassName, SkillStatusBarComponent, skillStatusBarClassName, skillStatusBarInnerClassName, onResyncSkills, isResyncingSkills, }: Props$2): react_jsx_runtime.JSX.Element;
279
281
 
280
282
  interface Props$1 {
281
283
  open: boolean;
@@ -1,6 +1,6 @@
1
1
  import * as arktype_internal_variants_object_ts from 'arktype/internal/variants/object.ts';
2
2
  import * as arktype_internal_variants_string_ts from 'arktype/internal/variants/string.ts';
3
- import { T as TurnProjection } from './projection-DIfyh6RK.js';
3
+ import { T as TurnProjection } from './projection-BWYEFYNn.js';
4
4
  import { S as SessionInfo, T as TemplateId, b as SessionDetail, c as Solution, B as BizRole } from './session-nZdIuWrS.js';
5
5
  import { Socket } from 'socket.io-client';
6
6
 
@@ -232,6 +232,8 @@ declare class MemoriesResource {
232
232
  declare const ModelOption: arktype_internal_variants_object_ts.ObjectType<{
233
233
  id: string;
234
234
  label: string;
235
+ inputModalities?: string[] | undefined;
236
+ supportsImage?: boolean | undefined;
235
237
  }, {}>;
236
238
  type ModelOption = typeof ModelOption.infer;
237
239
  declare const ModelsConfig: arktype_internal_variants_object_ts.ObjectType<{
@@ -239,6 +241,8 @@ declare const ModelsConfig: arktype_internal_variants_object_ts.ObjectType<{
239
241
  models: {
240
242
  id: string;
241
243
  label: string;
244
+ inputModalities?: string[] | undefined;
245
+ supportsImage?: boolean | undefined;
242
246
  }[];
243
247
  }, {}>;
244
248
  type ModelsConfig = typeof ModelsConfig.infer;
@@ -628,6 +632,9 @@ type UploadFileEntry = File | {
628
632
  file: File;
629
633
  name: string;
630
634
  };
635
+ interface UploadFilesOptions {
636
+ onProgress?: (progress: UploadProgress) => void;
637
+ }
631
638
  interface ImportPreviewSkill {
632
639
  name: string;
633
640
  description: string;
@@ -730,7 +737,7 @@ declare class SessionsResource {
730
737
  task?: BackgroundTask | null;
731
738
  }>;
732
739
  listDir(sessionId: string, dirPath: string): Promise<FileEntry[]>;
733
- uploadFiles(sessionId: string, dirPath: string, files: FileList | File[] | UploadFileEntry[]): Promise<{
740
+ uploadFiles(sessionId: string, dirPath: string, files: FileList | File[] | UploadFileEntry[], options?: UploadFilesOptions): Promise<{
734
741
  uploaded: string[];
735
742
  failed: string[];
736
743
  }>;
@@ -1321,7 +1328,7 @@ declare namespace TurnProjectionPayloadSchema {
1321
1328
  type TurnKind = ("message" | "compaction");
1322
1329
  type Role = ("user" | "assistant" | "system");
1323
1330
  type Status = ("streaming" | "completed" | "paused" | "failed" | "interrupted");
1324
- type Type = ("text" | "thinking" | "tool_use" | "tool_result" | "tool_ui" | "tool_bridge" | "system_notification" | "mode_change" | "planning_enter" | "planning_exit" | "plan_status" | "ask_user_answer");
1331
+ type Type = ("text" | "thinking" | "tool_use" | "tool_result" | "tool_ui" | "tool_bridge" | "system_notification" | "mode_change" | "plan_status" | "ask_user_answer");
1325
1332
  type Content = string;
1326
1333
  type ToolCallId = (string | null);
1327
1334
  type ToolName = (string | null);
@@ -1506,6 +1513,18 @@ declare namespace VibeLogsEndPayloadSchema {
1506
1513
  }
1507
1514
  }
1508
1515
  type VibeLogsEndPayload = VibeLogsEndPayloadSchema.VibeLogsEndPayload;
1516
+ declare namespace ChatStopAckSchema {
1517
+ type Status = string;
1518
+ type Message = (string | null);
1519
+ type Code = (string | number | null);
1520
+ interface ChatStopAck {
1521
+ status: Status;
1522
+ message?: Message;
1523
+ code?: Code;
1524
+ [k: string]: unknown;
1525
+ }
1526
+ }
1527
+ type ChatStopAck = ChatStopAckSchema.ChatStopAck;
1509
1528
  declare namespace ChatCompactAckSchema {
1510
1529
  type Status = string;
1511
1530
  type Message = (string | null);
@@ -1520,7 +1539,7 @@ declare namespace ChatCompactAckSchema {
1520
1539
  type ChatCompactAck = ChatCompactAckSchema.ChatCompactAck;
1521
1540
  interface ClientToServerEvents {
1522
1541
  "chat:send": (payload: ChatSendPayload) => void;
1523
- "chat:stop": (payload: ChatStopPayload) => void;
1542
+ "chat:stop": (payload: ChatStopPayload, ack: (response: ChatStopAck) => void) => void;
1524
1543
  "chat:compact": (payload: ChatCompactPayload, ack: (response: ChatCompactAck) => void) => void;
1525
1544
  "session:subscribe": (payload: SessionSubscribePayload) => void;
1526
1545
  "session:unsubscribe": (payload: SessionUnsubscribePayload) => void;
@@ -1607,6 +1626,7 @@ declare class BladeClient {
1607
1626
  blob(method: HttpMethod, path: string): Promise<Blob>;
1608
1627
  formData(method: HttpMethod, path: string, form: FormData, options?: {
1609
1628
  expectOk?: boolean;
1629
+ onUploadProgress?: (progress: UploadProgress) => void;
1610
1630
  }): Promise<Response>;
1611
1631
  fetch(method: HttpMethod, path: string, init?: BladeFetchInit, isRetry?: boolean): Promise<Response>;
1612
1632
  buildAuthedUrl(path: string): string;
@@ -1622,6 +1642,12 @@ declare class BladeClient {
1622
1642
  private resolveRestToken;
1623
1643
  private resolveSocketToken;
1624
1644
  private resolveToken;
1645
+ private formDataWithUploadProgress;
1646
+ }
1647
+ interface UploadProgress {
1648
+ loaded: number;
1649
+ total?: number;
1650
+ percent?: number;
1625
1651
  }
1626
1652
 
1627
- 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, DatabaseDriver 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, createSocket as aA, normalizeResource as aB, EnvBucketsResource as aC, type EnvBucket as aD, type PlatformEnvBucket as aE, type GisState as aF, type RuntimeConfig as aG, type SkillDetail as aH, type SkillStats as aI, type SkillSummary as aJ, type SkillSearchResult as aK, PartnerSkillInstallPayload as aL, PartnerSkillInstallResult as aM, SessionSkillUploadPayload as aN, SessionSkillUploadResult as aO, PublishedApp as aP, PublishedAppListResponse as aQ, PublishedAppStatus as aR, UnpublishAppResponse as aS, type BackgroundTask as aT, type GisGoal as aU, type GisResource$1 as aV, type GisTarget as aW, type GisMapCommand as aX, Task as aY, AgentDriver as aZ, AgentResource 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 UserInfo as ay, UserPreferencesResource as az, type VibeCodingDebugSessionStatus as b, DatabaseResource as b0, DifyKnowledgeConfig as b1, type GisGoalStatus as b2, HttpToolConfig as b3, KnowledgeDriver as b4, KnowledgeResource as b5, McpToolConfig as b6, MysqlConfig as b7, type ParallelMode as b8, PartnerSkillFile as b9, PartnerSkillName as ba, PostgresqlConfig as bb, SessionSkillFile as bc, SessionSkillName as bd, type StageSpec as be, type StepSpec as bf, TaskStatus as bg, ToolDriver as bh, ToolResource as bi, skillDisplayName as bj, 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 };
1653
+ 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 };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useSessionStore
3
- } from "./chunk-DSBIKYKQ.js";
3
+ } from "./chunk-UQEXX57F.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-L2KVYOQP.js.map
30
+ //# sourceMappingURL=chunk-BFF6D2XV.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  apiFetchResponse,
3
3
  getAuthedUrl
4
- } from "./chunk-DSBIKYKQ.js";
4
+ } from "./chunk-UQEXX57F.js";
5
5
 
6
6
  // src/react/lib/session-file-preview.ts
7
7
  var IMAGE_EXTS = /* @__PURE__ */ new Set(["png", "jpg", "jpeg", "gif", "svg", "webp", "ico", "bmp"]);
@@ -124,4 +124,4 @@ export {
124
124
  CollapsibleTrigger,
125
125
  CollapsibleContent
126
126
  };
127
- //# sourceMappingURL=chunk-UPHYN7CQ.js.map
127
+ //# sourceMappingURL=chunk-IRCXJHXT.js.map
@@ -177,7 +177,7 @@ var HeadlessResource = class {
177
177
  socket.off("system:error", onSystemError);
178
178
  if (sendStop && !stopSent) {
179
179
  stopSent = true;
180
- socket.emit("chat:stop", { session_id });
180
+ socket.emit("chat:stop", { session_id }, () => void 0);
181
181
  }
182
182
  socket.emit("session:unsubscribe", { session_id });
183
183
  };
@@ -331,7 +331,9 @@ var MemoriesResource = class {
331
331
  import { type } from "arktype";
332
332
  var ModelOption = type({
333
333
  id: "string",
334
- label: "string"
334
+ label: "string",
335
+ "inputModalities?": "string[]",
336
+ "supportsImage?": "boolean"
335
337
  });
336
338
  var ModelsConfig = type({
337
339
  default: "string",
@@ -647,7 +649,7 @@ var SessionsResource = class {
647
649
  listDir(sessionId, dirPath) {
648
650
  return this.client.json("GET", `/api/sessions/${sessionId}/ls/${encodeURIComponent(dirPath)}`);
649
651
  }
650
- async uploadFiles(sessionId, dirPath, files) {
652
+ async uploadFiles(sessionId, dirPath, files, options = {}) {
651
653
  const formData = new FormData();
652
654
  const entries = Array.from(files).map(
653
655
  (f) => f instanceof File ? { file: f, name: f.name } : f
@@ -662,7 +664,7 @@ var SessionsResource = class {
662
664
  "POST",
663
665
  `/api/sessions/${sessionId}/upload/${encodeURIComponent(dirPath)}`,
664
666
  formData,
665
- { expectOk: false }
667
+ { expectOk: false, onUploadProgress: options.onProgress }
666
668
  );
667
669
  return response.json();
668
670
  }
@@ -1194,6 +1196,9 @@ var BladeClient = class {
1194
1196
  return response.blob();
1195
1197
  }
1196
1198
  async formData(method, path, form, options = {}) {
1199
+ if (options.onUploadProgress && !this.options.fetchImpl && typeof XMLHttpRequest !== "undefined") {
1200
+ return this.formDataWithUploadProgress(method, path, form, options);
1201
+ }
1197
1202
  return this.fetch(method, path, { body: form, expectOk: options.expectOk });
1198
1203
  }
1199
1204
  async fetch(method, path, init = {}, isRetry = false) {
@@ -1305,6 +1310,50 @@ var BladeClient = class {
1305
1310
  const token = this.options.token === void 0 ? resolver?.() : typeof this.options.token === "function" ? this.options.token() : this.options.token;
1306
1311
  return token ? token : null;
1307
1312
  }
1313
+ formDataWithUploadProgress(method, path, form, options, isRetry = false) {
1314
+ const url = this.buildUrl(path);
1315
+ const headers = this.buildHeaders(url);
1316
+ return new Promise((resolve, reject) => {
1317
+ const xhr = new XMLHttpRequest();
1318
+ xhr.open(method, url.toString(), true);
1319
+ xhr.withCredentials = true;
1320
+ headers.forEach((value, key) => {
1321
+ xhr.setRequestHeader(key, value);
1322
+ });
1323
+ xhr.upload.onprogress = (event) => {
1324
+ options.onUploadProgress?.({
1325
+ loaded: event.loaded,
1326
+ total: event.lengthComputable ? event.total : void 0,
1327
+ percent: event.lengthComputable && event.total > 0 ? event.loaded / event.total : void 0
1328
+ });
1329
+ };
1330
+ xhr.onerror = () => reject(new TypeError("Network request failed"));
1331
+ xhr.ontimeout = () => reject(new TypeError("Network request timed out"));
1332
+ xhr.onabort = () => reject(new DOMException("Request aborted", "AbortError"));
1333
+ xhr.onload = async () => {
1334
+ if (xhr.status === 401 && !isRetry && this.shouldRefreshFor401(url)) {
1335
+ const refreshed = await this.tryRefresh();
1336
+ if (refreshed) {
1337
+ resolve(this.formDataWithUploadProgress(method, path, form, options, true));
1338
+ return;
1339
+ }
1340
+ }
1341
+ const response = new Response(xhr.responseText, {
1342
+ status: xhr.status,
1343
+ statusText: xhr.statusText,
1344
+ headers: parseXhrHeaders(xhr.getAllResponseHeaders())
1345
+ });
1346
+ if (options.expectOk !== false && !response.ok) {
1347
+ const detail = await extractErrorDetail(response.clone());
1348
+ reject(new BladeApiError(response, detail));
1349
+ return;
1350
+ }
1351
+ options.onUploadProgress?.({ loaded: 1, total: 1, percent: 1 });
1352
+ resolve(response);
1353
+ };
1354
+ xhr.send(form);
1355
+ });
1356
+ }
1308
1357
  };
1309
1358
  function normalizeBaseUrl(baseUrl) {
1310
1359
  const normalized = baseUrl.trim().replace(/\/+$/, "");
@@ -1322,6 +1371,15 @@ function readJsonResponse(response) {
1322
1371
  }
1323
1372
  return response.json();
1324
1373
  }
1374
+ function parseXhrHeaders(rawHeaders) {
1375
+ const headers = new Headers();
1376
+ for (const line of rawHeaders.trim().split(/[\r\n]+/)) {
1377
+ const separatorIndex = line.indexOf(":");
1378
+ if (separatorIndex <= 0) continue;
1379
+ headers.append(line.slice(0, separatorIndex).trim(), line.slice(separatorIndex + 1).trim());
1380
+ }
1381
+ return headers;
1382
+ }
1325
1383
 
1326
1384
  export {
1327
1385
  BladeApiError,
@@ -1348,4 +1406,4 @@ export {
1348
1406
  createSocket,
1349
1407
  BladeClient
1350
1408
  };
1351
- //# sourceMappingURL=chunk-ROGNJYST.js.map
1409
+ //# sourceMappingURL=chunk-Q6CSM5DE.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\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, 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 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 timeoutMs = options.timeoutMs ?? 300_000\n const { session_id } = await this.client.sessions.createSessionWithRequest({\n intent: prompt,\n model: options.model ?? null,\n })\n const socket = this.client.socket()\n await ensureSocketConnected(socket, timeoutMs)\n\n return new Promise<T | string>((resolve, reject) => {\n let settled = false\n let stopSent = false\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 }))\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: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 resolve(value)\n }\n const fail = (error: unknown) => {\n if (settled) return\n settled = true\n cleanup(true)\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 onSystemError(payload: SystemErrorPayload) {\n if (payload.session_id !== session_id) return\n if (systemErrorTimeout) {\n clearTimeout(systemErrorTimeout)\n }\n systemErrorTimeout = setTimeout(() => {\n systemErrorTimeout = null\n fail(new HeadlessError(payload.message || \"headless run failed\", payload))\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 const result = payload.result\n if (payload.status === \"failed\") {\n rejectAfterChatEnd(new HeadlessError(errorMessageFromResult(result) ?? \"headless run failed\", payload))\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: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(socket: ReturnType<BladeClient[\"socket\"]>, timeoutMs: number): 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`)))\n }, timeoutMs)\n const onConnect = () => finish(resolve)\n const onConnectError = (error: unknown) => {\n finish(() => reject(new HeadlessError(\"socket connection failed\", 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 version: string,\n ): Promise<{ success: boolean; skill_id: string; version: string }> {\n return this.client.json(\"POST\", `/api/sessions/${encodeURIComponent(sessionId)}/skill-publish`, {\n org,\n version,\n })\n }\n}\n","import type { BladeClient } from \"../blade-client\"\n\nexport interface PreviewUrlItem {\n name: string\n url: string\n}\n\nexport interface QuickScenario {\n id: number\n name: string\n prompt_template: string\n skills: string[]\n preview_urls: PreviewUrlItem[]\n init_script: string\n icon: string\n created_at: string\n updated_at: string\n}\n\nexport interface BladeHubScenarioResource {\n resource_id: string\n resource_name: string\n name: string\n description: string\n prompt_template: string\n skills: string[]\n preview_urls: PreviewUrlItem[]\n init_script: string\n icon: string\n raw?: Record<string, unknown>\n}\n\nexport interface CreateQuickScenarioPayload {\n name: string\n prompt_template?: string\n skills?: string[]\n preview_urls?: PreviewUrlItem[]\n init_script?: string\n icon?: string\n}\n\nexport interface UpdateQuickScenarioPayload extends CreateQuickScenarioPayload {}\n\nexport class ScenariosResource {\n constructor(private client: BladeClient) {}\n\n listQuickScenarios(init?: RequestInit): Promise<QuickScenario[]> {\n return this.client.jsonFromInit(\"/api/scenarios\", init)\n }\n\n createQuickScenario(payload: CreateQuickScenarioPayload, init?: RequestInit): Promise<QuickScenario> {\n return this.client.jsonFromInit(\"/api/scenarios\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n deleteQuickScenario(scenarioId: number, init?: RequestInit): Promise<{ ok: boolean }> {\n return this.client.jsonFromInit(`/api/scenarios/${scenarioId}`, {\n method: \"DELETE\",\n ...init,\n })\n }\n\n updateQuickScenario(\n scenarioId: number,\n payload: UpdateQuickScenarioPayload,\n init?: RequestInit,\n ): Promise<QuickScenario> {\n return this.client.jsonFromInit(`/api/scenarios/${scenarioId}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n ...init,\n })\n }\n\n async listBladeHubScenarioResources(\n limit = 500,\n init?: RequestInit,\n ): Promise<BladeHubScenarioResource[]> {\n const params = new URLSearchParams({ limit: String(limit) })\n const response = await this.client.jsonFromInit<{ items: BladeHubScenarioResource[] }>(\n `/api/skills/scenario-resources?${params}`,\n init,\n )\n return response.items ?? []\n }\n}\n","import type { BackgroundTask } from \"../../react/schemas/background\"\nimport type { TurnProjection } from \"../../react/schemas/projection\"\nimport type { SessionDetail, SessionInfo, TemplateId } from \"../../react/schemas/session\"\nimport type { Task } from \"../../react/schemas/task\"\nimport type { BladeClient, 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 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 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 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 q,\n }: ListSessionsPageParams): Promise<PaginatedSessionsResult> {\n const searchParams = new URLSearchParams()\n searchParams.set(\"limit\", String(limit))\n searchParams.set(\"offset\", String(offset))\n if (template_id_prefix) searchParams.set(\"template_id_prefix\", template_id_prefix)\n const trimmedQuery = q?.trim()\n if (trimmedQuery) searchParams.set(\"q\", trimmedQuery)\n return this.client.json(\"GET\", `/api/sessions?${searchParams.toString()}`)\n }\n\n async listSessions(template_id_prefix?: string): Promise<SessionInfo[]> {\n const pageSize = 100\n const sessions: SessionInfo[] = []\n let offset = 0\n while (true) {\n const page = await this.fetchSessionsPage({ limit: pageSize, offset, template_id_prefix })\n sessions.push(...page.items)\n if (sessions.length >= page.total || page.items.length === 0) return sessions\n offset += page.items.length\n }\n }\n\n listSessionsPaginated(params: {\n limit: number\n offset: number\n template_id_prefix?: string\n q?: string\n }): Promise<PaginatedSessionsResult> {\n return this.fetchSessionsPage(params)\n }\n\n listSessionsWithSkillData(): Promise<SkillDevSession[]> {\n return this.client.json(\"GET\", \"/api/sessions/with-skill-data\")\n }\n\n createSession(\n intent?: string,\n template_id?: TemplateId,\n primary_skill_id?: string | null,\n ): Promise<{ session_id: string }> {\n return this.createSessionWithRequest({ intent, template_id, primary_skill_id })\n }\n\n createSessionWithRequest(request: CreateSessionRequest): Promise<{ session_id: string }> {\n return this.client.json(\"POST\", \"/api/sessions\", toCreateSessionPayload(request))\n }\n\n getSession(sessionId: string, init?: RequestInit): Promise<SessionDetail> {\n return this.client.jsonFromInit(`/api/sessions/${sessionId}`, init)\n }\n\n updateSession(sessionId: string, payload: { intent?: string }): Promise<SessionDetail> {\n return this.client.json(\"PATCH\", `/api/sessions/${sessionId}`, payload)\n }\n\n 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 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":"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","names":["type"]}