@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.
- package/dist/{SkillStatusBar-BUisTEAL.d.ts → SkillStatusBar-CvgcEiSi.d.ts} +6 -3
- package/dist/{blade-client-KmBClau6.d.ts → blade-client-DoodJJDz.d.ts} +42 -1
- package/dist/{chunk-PKQKLRFQ.js → chunk-3HFYDOHY.js} +20 -4
- package/dist/chunk-3HFYDOHY.js.map +1 -0
- package/dist/{chunk-HAFDWDFG.js → chunk-CDL6Y4W7.js} +2 -2
- package/dist/{chunk-SENUKC7C.js → chunk-CTNH3GZY.js} +44 -13
- package/dist/chunk-CTNH3GZY.js.map +1 -0
- package/dist/{chunk-UQWHEHG3.js → chunk-JIPDSO26.js} +11 -5
- package/dist/chunk-JIPDSO26.js.map +1 -0
- package/dist/{chunk-FZXLII7S.js → chunk-OF7ZBBTH.js} +20 -2
- package/dist/chunk-OF7ZBBTH.js.map +1 -0
- package/dist/{chunk-7EVVRQ7G.js → chunk-ZWO6YBLA.js} +4 -3
- package/dist/chunk-ZWO6YBLA.js.map +1 -0
- package/dist/client/index.d.ts +426 -6
- package/dist/client/index.js +1 -1
- package/dist/react/api/vibe-coding.d.ts +2 -2
- package/dist/react/api/vibe-coding.js +2 -2
- package/dist/react/components/chat/index.d.ts +3 -3
- package/dist/react/components/chat/index.js +5 -5
- package/dist/react/components/plan/index.js +4 -4
- package/dist/react/components/session/index.js +3 -3
- package/dist/react/components/workspace/index.d.ts +2 -2
- package/dist/react/components/workspace/index.js +3 -3
- package/dist/react/index.d.ts +27 -6
- package/dist/react/index.js +9 -7
- package/dist/react/index.js.map +1 -1
- package/dist/{sessions-DfRYZZnH.d.ts → sessions-DFGsAOPa.d.ts} +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/dist/chunk-7EVVRQ7G.js.map +0 -1
- package/dist/chunk-FZXLII7S.js.map +0 -1
- package/dist/chunk-PKQKLRFQ.js.map +0 -1
- package/dist/chunk-SENUKC7C.js.map +0 -1
- package/dist/chunk-UQWHEHG3.js.map +0 -1
- /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-
|
|
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-
|
|
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-
|
|
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-
|
|
3237
|
+
//# sourceMappingURL=chunk-OF7ZBBTH.js.map
|