@blade-hq/agent-kit 0.5.25 → 0.5.27

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/{SkillStatusBar-BUisTEAL.d.ts → SkillStatusBar-CvgcEiSi.d.ts} +6 -3
  2. package/dist/{blade-client-KmBClau6.d.ts → blade-client-DoodJJDz.d.ts} +42 -1
  3. package/dist/{chunk-PKQKLRFQ.js → chunk-3HFYDOHY.js} +20 -4
  4. package/dist/chunk-3HFYDOHY.js.map +1 -0
  5. package/dist/{chunk-HAFDWDFG.js → chunk-CDL6Y4W7.js} +2 -2
  6. package/dist/{chunk-SENUKC7C.js → chunk-CTNH3GZY.js} +44 -13
  7. package/dist/chunk-CTNH3GZY.js.map +1 -0
  8. package/dist/{chunk-UQWHEHG3.js → chunk-JIPDSO26.js} +11 -5
  9. package/dist/chunk-JIPDSO26.js.map +1 -0
  10. package/dist/{chunk-FZXLII7S.js → chunk-OF7ZBBTH.js} +20 -2
  11. package/dist/chunk-OF7ZBBTH.js.map +1 -0
  12. package/dist/{chunk-7EVVRQ7G.js → chunk-ZWO6YBLA.js} +4 -3
  13. package/dist/chunk-ZWO6YBLA.js.map +1 -0
  14. package/dist/client/index.d.ts +426 -6
  15. package/dist/client/index.js +1 -1
  16. package/dist/react/api/vibe-coding.d.ts +2 -2
  17. package/dist/react/api/vibe-coding.js +2 -2
  18. package/dist/react/components/chat/index.d.ts +3 -3
  19. package/dist/react/components/chat/index.js +5 -5
  20. package/dist/react/components/plan/index.js +4 -4
  21. package/dist/react/components/session/index.js +3 -3
  22. package/dist/react/components/workspace/index.d.ts +2 -2
  23. package/dist/react/components/workspace/index.js +3 -3
  24. package/dist/react/index.d.ts +27 -6
  25. package/dist/react/index.js +9 -7
  26. package/dist/react/index.js.map +1 -1
  27. package/dist/{sessions-DfRYZZnH.d.ts → sessions-DFGsAOPa.d.ts} +1 -1
  28. package/dist/style.css +1 -1
  29. package/package.json +1 -1
  30. package/dist/chunk-7EVVRQ7G.js.map +0 -1
  31. package/dist/chunk-FZXLII7S.js.map +0 -1
  32. package/dist/chunk-PKQKLRFQ.js.map +0 -1
  33. package/dist/chunk-SENUKC7C.js.map +0 -1
  34. package/dist/chunk-UQWHEHG3.js.map +0 -1
  35. /package/dist/{chunk-HAFDWDFG.js.map → chunk-CDL6Y4W7.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  apiFetchResponse,
3
3
  getAuthedUrl
4
- } from "./chunk-FZXLII7S.js";
4
+ } from "./chunk-OF7ZBBTH.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"]);
@@ -54,6 +54,13 @@ function buildSessionBinaryPreviewTarget(sessionId, filePath, fileName) {
54
54
  }
55
55
  return null;
56
56
  }
57
+ function resolveTextPreviewType(fileName) {
58
+ const ext = getExt(fileName);
59
+ if (MARKDOWN_EXTS.has(ext)) return "markdown";
60
+ if (CSV_EXTS.has(ext)) return "csv";
61
+ if (HTML_EXTS.has(ext)) return "html";
62
+ return "file";
63
+ }
57
64
  async function resolveSessionFilePreviewTarget(sessionId, filePath, fileName) {
58
65
  const resolvedFileName = getDisplayFileName(filePath, fileName);
59
66
  const binaryTarget = buildSessionBinaryPreviewTarget(sessionId, filePath, resolvedFileName);
@@ -76,10 +83,8 @@ async function resolveSessionFilePreviewTarget(sessionId, filePath, fileName) {
76
83
  return { type: "download", content: downloadUrl, title: resolvedFileName, key: filePath };
77
84
  }
78
85
  const content = await res.text();
79
- const ext = getExt(resolvedFileName);
80
- const type = MARKDOWN_EXTS.has(ext) ? "markdown" : CSV_EXTS.has(ext) ? "csv" : HTML_EXTS.has(ext) ? "html" : "file";
81
86
  return {
82
- type,
87
+ type: resolveTextPreviewType(resolvedFileName),
83
88
  content,
84
89
  title: resolvedFileName,
85
90
  key: filePath
@@ -89,6 +94,7 @@ async function resolveSessionFilePreviewTarget(sessionId, filePath, fileName) {
89
94
  export {
90
95
  getSessionFilePath,
91
96
  buildSessionBinaryPreviewTarget,
97
+ resolveTextPreviewType,
92
98
  resolveSessionFilePreviewTarget
93
99
  };
94
- //# sourceMappingURL=chunk-UQWHEHG3.js.map
100
+ //# sourceMappingURL=chunk-JIPDSO26.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/lib/session-file-preview.ts"],"sourcesContent":["import { apiFetchResponse, getAuthedUrl } from \"../api/client\"\nimport type { PreviewTarget } from \"../stores/ui-store\"\n\nconst IMAGE_EXTS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\", \"bmp\"])\nconst DOCX_EXTS = new Set([\"docx\", \"doc\"])\nconst EXCEL_EXTS = new Set([\"xlsx\", \"xls\", \"xlsm\", \"xlsb\"])\nconst PPT_EXTS = new Set([\"pptx\", \"ppt\"])\nconst CSV_EXTS = new Set([\"csv\"])\nconst MARKDOWN_EXTS = new Set([\"md\", \"markdown\"])\nconst HTML_EXTS = new Set([\"html\", \"htm\"])\n\nfunction getExt(fileName: string): string {\n return fileName.split(\".\").pop()?.toLowerCase() ?? \"\"\n}\n\nfunction getDisplayFileName(filePath: string, fileName?: string): string {\n return fileName?.trim() || filePath.split(\"/\").pop() || filePath\n}\n\nexport function getSessionFilePath(sessionId: string, filePath: string): string {\n return `/api/sessions/${sessionId}/files/${encodeURIComponent(filePath)}`\n}\n\nfunction getSessionFileDownloadUrl(sessionId: string, filePath: string): string {\n return getAuthedUrl(getSessionFilePath(sessionId, filePath))\n}\n\n/**\n * 后端把可解码为 UTF-8 的文件返回为 text/plain,二进制文件返回各自的 MIME。\n * 只有文本类内容才能安全地整体读进内存渲染——其余一律不能读 body。\n */\nfunction isTextualContentType(contentType: string): boolean {\n return (\n contentType.startsWith(\"text/\") ||\n contentType.includes(\"json\") ||\n contentType.includes(\"xml\") ||\n contentType.includes(\"yaml\") ||\n contentType.includes(\"javascript\")\n )\n}\n\nexport function buildSessionBinaryPreviewTarget(\n sessionId: string,\n filePath: string,\n fileName?: string,\n): PreviewTarget | null {\n const resolvedFileName = getDisplayFileName(filePath, fileName)\n const ext = getExt(resolvedFileName)\n const filePathUrl = getSessionFilePath(sessionId, filePath)\n const downloadUrl = getSessionFileDownloadUrl(sessionId, filePath)\n\n if (IMAGE_EXTS.has(ext)) {\n return { type: \"image\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (ext === \"pdf\") {\n return { type: \"pdf\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (DOCX_EXTS.has(ext)) {\n return { type: \"docx\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (EXCEL_EXTS.has(ext)) {\n return { type: \"excel\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (PPT_EXTS.has(ext)) {\n return {\n type: \"ppt\",\n content: filePathUrl,\n sourceUrl: downloadUrl,\n title: resolvedFileName,\n key: filePath,\n }\n }\n\n return null\n}\n\nexport function resolveTextPreviewType(fileName: string): PreviewTarget[\"type\"] {\n const ext = getExt(fileName)\n if (MARKDOWN_EXTS.has(ext)) return \"markdown\"\n if (CSV_EXTS.has(ext)) return \"csv\"\n if (HTML_EXTS.has(ext)) return \"html\"\n return \"file\"\n}\n\nexport async function resolveSessionFilePreviewTarget(\n sessionId: string,\n filePath: string,\n fileName?: string,\n): Promise<PreviewTarget> {\n const resolvedFileName = getDisplayFileName(filePath, fileName)\n const binaryTarget = buildSessionBinaryPreviewTarget(sessionId, filePath, resolvedFileName)\n if (binaryTarget) {\n return binaryTarget\n }\n\n const downloadUrl = getSessionFileDownloadUrl(sessionId, filePath)\n\n // 其余文件按后端返回的 Content-Type 分派,而不是猜扩展名:\n // 视频/音频/压缩包等二进制文件绝不能读 body(整体读进内存会卡死页面),\n // 改为把下载 URL 交给原生 <video>/<audio> 流式播放,或回退为下载。\n const res = await apiFetchResponse(getSessionFilePath(sessionId, filePath))\n const contentType = (res.headers.get(\"content-type\") ?? \"\").toLowerCase()\n\n if (contentType.startsWith(\"video/\")) {\n void res.body?.cancel()\n return { type: \"video\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (contentType.startsWith(\"audio/\")) {\n void res.body?.cancel()\n return { type: \"audio\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n if (!isTextualContentType(contentType)) {\n void res.body?.cancel()\n return { type: \"download\", content: downloadUrl, title: resolvedFileName, key: filePath }\n }\n\n const content = await res.text()\n\n return {\n type: resolveTextPreviewType(resolvedFileName),\n content,\n title: resolvedFileName,\n key: filePath,\n }\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-J3XVFPOV.js";
4
4
  import {
5
5
  BladeClient
6
- } from "./chunk-7EVVRQ7G.js";
6
+ } from "./chunk-ZWO6YBLA.js";
7
7
  import {
8
8
  createClientActions,
9
9
  useCardStateStore
@@ -2810,6 +2810,12 @@ var AgentSocket = class {
2810
2810
  this.socket.off("agent-board:board-task:changed", handler);
2811
2811
  };
2812
2812
  }
2813
+ onAgentBoardFileOp(handler) {
2814
+ this.socket.on("agent-board:file-op", handler);
2815
+ return () => {
2816
+ this.socket.off("agent-board:file-op", handler);
2817
+ };
2818
+ }
2813
2819
  unsubscribe() {
2814
2820
  const previousSessionId = this.subscribedSession;
2815
2821
  if (previousSessionId) {
@@ -2942,6 +2948,18 @@ var AgentSocket = class {
2942
2948
  });
2943
2949
  }
2944
2950
  }
2951
+ /**
2952
+ * 在 agent loop 运行期间追加补充消息。
2953
+ * 消息会在下一轮 LLM 调用前以 user-supplement 形式注入。
2954
+ */
2955
+ append(sessionId, message) {
2956
+ this._ensureConnected();
2957
+ this.socket.emit("chat:append", {
2958
+ session_id: sessionId,
2959
+ message
2960
+ });
2961
+ useChatStore.getState().addUserMessage(sessionId, message);
2962
+ }
2945
2963
  stop(sessionId) {
2946
2964
  return new Promise((resolve, reject) => {
2947
2965
  this.socket.timeout(35e3).emit(
@@ -3216,4 +3234,4 @@ export {
3216
3234
  bootstrapBladeClient,
3217
3235
  getBootstrappedClient
3218
3236
  };
3219
- //# sourceMappingURL=chunk-FZXLII7S.js.map
3237
+ //# sourceMappingURL=chunk-OF7ZBBTH.js.map