@glodon-aiot/bot-client-sdk 3.26.0-alpha.4 → 3.26.0-alpha.5

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 (56) hide show
  1. package/README.md +105 -76
  2. package/dist/es/Config.mjs +63 -85
  3. package/dist/es/builtinTools/browserRuntime/BrowserCommandRunner.mjs +201 -0
  4. package/dist/es/builtinTools/browserRuntime/PythonRunner.mjs +356 -0
  5. package/dist/es/builtinTools/browserRuntime/WorkspaceBashFs.mjs +350 -0
  6. package/dist/es/builtinTools/browserRuntime/assets.mjs +9 -0
  7. package/dist/es/builtinTools/browserRuntime/loadBash.mjs +17 -0
  8. package/dist/es/builtinTools/browserRuntime/pyodideRunner.py.mjs +96 -0
  9. package/dist/es/builtinTools/browserRuntime/pyodideWorker.mjs +242 -0
  10. package/dist/es/builtinTools/command.mjs +56 -0
  11. package/dist/es/builtinTools/constants.mjs +10 -0
  12. package/dist/es/builtinTools/createBuiltinToolsPlugin.mjs +236 -0
  13. package/dist/es/builtinTools/overview.mjs +77 -0
  14. package/dist/es/builtinTools/paths.mjs +63 -0
  15. package/dist/es/builtinTools/schemas.mjs +216 -0
  16. package/dist/es/builtinTools/tools.mjs +471 -0
  17. package/dist/es/index.mjs +49 -48
  18. package/dist/es/localFiles/adapters/FileSystemAccessAdapter.mjs +193 -103
  19. package/dist/es/localFiles/adapters/HostBridgeAdapter.mjs +138 -77
  20. package/dist/es/localFiles/adapters/MemoryWorkspaceAdapter.mjs +132 -97
  21. package/dist/es/localFiles/adapters/WorkspaceFileAdapter.mjs +32 -28
  22. package/dist/es/localFiles/constants.mjs +1 -1
  23. package/dist/es/localFiles/host/connectHostBridge.mjs +22 -18
  24. package/dist/es/localFiles/host/protocol.mjs +6 -5
  25. package/dist/es/localFiles/schemas.mjs +45 -60
  26. package/dist/es/localFiles/validate.mjs +37 -37
  27. package/dist/es/localFiles/workspace/LocalWorkspace.mjs +71 -52
  28. package/dist/es/package.json.mjs +33 -27
  29. package/dist/lib/index.js +372 -9
  30. package/dist/src/Config.d.ts +2 -2
  31. package/dist/src/builtinTools/browserRuntime/BrowserCommandRunner.d.ts +26 -0
  32. package/dist/src/builtinTools/browserRuntime/PythonRunner.d.ts +67 -0
  33. package/dist/src/builtinTools/browserRuntime/WorkspaceBashFs.d.ts +51 -0
  34. package/dist/src/builtinTools/browserRuntime/assets.d.ts +13 -0
  35. package/dist/src/builtinTools/browserRuntime/loadBash.d.ts +3 -0
  36. package/dist/src/builtinTools/browserRuntime/pyodideWorker.d.ts +44 -0
  37. package/dist/src/builtinTools/command.d.ts +26 -0
  38. package/dist/src/builtinTools/constants.d.ts +17 -0
  39. package/dist/src/builtinTools/createBuiltinToolsPlugin.d.ts +11 -0
  40. package/dist/src/builtinTools/overview.d.ts +5 -0
  41. package/dist/src/builtinTools/paths.d.ts +15 -0
  42. package/dist/src/builtinTools/schemas.d.ts +3 -0
  43. package/dist/src/builtinTools/tools.d.ts +60 -0
  44. package/dist/src/localFiles/adapters/FileSystemAccessAdapter.d.ts +4 -1
  45. package/dist/src/localFiles/adapters/HostBridgeAdapter.d.ts +20 -1
  46. package/dist/src/localFiles/adapters/MemoryWorkspaceAdapter.d.ts +4 -1
  47. package/dist/src/localFiles/adapters/WorkspaceFileAdapter.d.ts +14 -0
  48. package/dist/src/localFiles/adapters/fsaTypes.d.ts +2 -0
  49. package/dist/src/localFiles/constants.d.ts +2 -1
  50. package/dist/src/localFiles/host/protocol.d.ts +13 -0
  51. package/dist/src/localFiles/index.d.ts +3 -2
  52. package/dist/src/localFiles/schemas.d.ts +2 -3
  53. package/dist/src/localFiles/types.d.ts +14 -1
  54. package/dist/src/localFiles/workspace/LocalWorkspace.d.ts +12 -0
  55. package/package.json +8 -2
  56. package/dist/es/localFiles/createLocalPythonPlugin.mjs +0 -196
@@ -0,0 +1,216 @@
1
+ import { MAX_COMMAND_CHARS as s, MAX_WRITE_BYTES as n, BUILTIN_FUNCTION_CODES as r } from "./constants.mjs";
2
+ const e = (i) => ({
3
+ type: "string",
4
+ minLength: 1,
5
+ description: i
6
+ }), t = "必填。工作区内绝对路径,以 / 开头,例如 /说明.md。不要使用 /input、/output、/uploads、/tmp,也不要新建这些目录。", o = {
7
+ shell: {
8
+ functionCode: "shell",
9
+ name: "执行命令",
10
+ description: "在当前会话工作区中执行一条 shell 命令并返回标准输出。每次调用都是新的 shell,只保留上次停留的目录;环境变量不会保留,需要时在同一条命令里设置。当前目录是工作区根目录。用相对路径,或以 / 开头表示工作区内已有的路径,例如 notes/a.md、/说明.md。不要使用或新建 input、output、uploads、tmp。/dev、/usr、/bin 仍是系统路径。写进脚本文件里的路径要用相对路径(见 run_file)。超过 20000 字的脚本请用 write_file 写到工作区文件后再调用 run_file;读取文件正文或结构摘要请用 read_file 的 start_line 和 end_line,不要用 cat、sed 或 head 把大文件正文打到标准输出。",
11
+ parameters: {
12
+ type: "object",
13
+ required: ["command"],
14
+ properties: {
15
+ command: {
16
+ type: "string",
17
+ minLength: 1,
18
+ maxLength: s,
19
+ description: "必填。一条不超过 20000 字的 shell 命令。当前目录已是工作区根目录。可以包含短的 python 或 heredoc。读取文件正文请改用 read_file。"
20
+ }
21
+ }
22
+ }
23
+ },
24
+ read_file: {
25
+ functionCode: "read_file",
26
+ name: "读取文件",
27
+ description: "按绝对路径读取工作区内的文本文件并返回内容;读不到时返回失败原因。未超过上限的文本按原文返回;超过单次读取上限的结构化文本(JSON/XML/SVG/CSV/TSV)会先附带通用结构概览和短预览,需要特定片段时再用 start_line 和 end_line。PDF 和图片只返回文件摘要,不返回正文。",
28
+ parameters: {
29
+ type: "object",
30
+ required: ["path"],
31
+ properties: {
32
+ path: e(t),
33
+ start_line: {
34
+ type: "integer",
35
+ minimum: 1,
36
+ description: "可选。起始行号,从 1 开始,含本行。省略则从第 1 行读。"
37
+ },
38
+ end_line: {
39
+ type: "integer",
40
+ minimum: 1,
41
+ description: "可选。结束行号,从 1 开始,含本行。省略则读到文件末尾。"
42
+ }
43
+ }
44
+ }
45
+ },
46
+ write_file: {
47
+ functionCode: "write_file",
48
+ name: "写入文件",
49
+ description: `把文本写入工作区内文件,path 为工作区内绝对路径,文件已存在时覆盖。单次覆盖写入按 UTF-8 字节计,默认不超过 ${n} 字节。超限时先写一段,再用 edit_file 修改,或用 append_file 追加下一段。SVG 和整页 HTML 由工作区里的脚本生成,不要直接放进 content。`,
50
+ parameters: {
51
+ type: "object",
52
+ required: ["path", "content"],
53
+ properties: {
54
+ path: e(t),
55
+ content: {
56
+ type: "string",
57
+ description: `必填。覆盖写入的文本,UTF-8 不超过 ${n} 字节。不要放入 SVG 或整页 HTML。`
58
+ }
59
+ }
60
+ }
61
+ },
62
+ append_file: {
63
+ functionCode: "append_file",
64
+ name: "追加文件",
65
+ description: "把一段文本追加到工作区内文件末尾,path 为工作区内绝对路径,文件不存在时创建。覆盖写入超过字节上限时,用本工具把下一段接到同一文件。追加不设字节上限,但不要在一次调用里放入整份 HTML 或 SVG。",
66
+ parameters: {
67
+ type: "object",
68
+ required: ["path", "content"],
69
+ properties: {
70
+ path: e(t),
71
+ content: {
72
+ type: "string",
73
+ description: "必填。要追加到文件末尾的文本。不受覆盖写入的字节上限约束。"
74
+ }
75
+ }
76
+ }
77
+ },
78
+ run_file: {
79
+ functionCode: "run_file",
80
+ name: "执行文件",
81
+ description: "执行工作区里已经存在的 .py、.sh 或 .js 脚本文件。生成 SVG、HTML、JSON 等产物时优先使用:先用 write_file 写脚本,脚本自行读取工作区文件并写出产物,再调用本工具。脚本运行时当前目录是工作区根目录,脚本里访问工作区文件要写相对路径,例如 data.json、notes/a.py。不要使用或新建 input、output、uploads、tmp。需要查看文件正文时用 read_file,不要把整份文件打印到标准输出。",
82
+ parameters: {
83
+ type: "object",
84
+ required: ["path"],
85
+ properties: {
86
+ path: e("必填。要执行的 .py、.sh 或 .js 文件,工作区内绝对路径,例如 /scripts/gen.py。")
87
+ }
88
+ }
89
+ },
90
+ edit_file: {
91
+ functionCode: "edit_file",
92
+ name: "修改文件",
93
+ description: "把工作区内文本文件中第一处与 old_text 完全相同的内容替换为 new_text。找不到 old_text 时返回最接近片段的行号,可直接复制原文重试,不必再读全文。old_text 与 new_text 不设长度上限。",
94
+ parameters: {
95
+ type: "object",
96
+ required: ["path", "old_text", "new_text"],
97
+ properties: {
98
+ path: e(t),
99
+ old_text: {
100
+ type: "string",
101
+ minLength: 1,
102
+ description: "必填。文件中要被替换的原文,必须完全一致。"
103
+ },
104
+ new_text: {
105
+ type: "string",
106
+ description: "必填。替换后的文本。可以是一整段生成逻辑,不必拆成追加。"
107
+ }
108
+ }
109
+ }
110
+ },
111
+ grep: {
112
+ functionCode: "grep",
113
+ name: "搜索文件",
114
+ description: "在工作区目录中递归搜索文本,返回带行号的匹配行。path 为工作区内绝对路径,pattern 按 grep 基本正则匹配。用于定位内容,不要用来取回大文件全文。",
115
+ parameters: {
116
+ type: "object",
117
+ required: ["path", "pattern"],
118
+ properties: {
119
+ path: e(t),
120
+ pattern: {
121
+ type: "string",
122
+ minLength: 1,
123
+ description: "必填。grep 基本正则表达式。"
124
+ }
125
+ }
126
+ }
127
+ },
128
+ find: {
129
+ functionCode: "find",
130
+ name: "查找文件",
131
+ description: "按文件名通配在工作区目录中查找文件。path 为起始绝对路径,name 传给 find 的 -name,例如 *.html。",
132
+ parameters: {
133
+ type: "object",
134
+ required: ["path", "name"],
135
+ properties: {
136
+ path: e(t),
137
+ name: {
138
+ type: "string",
139
+ minLength: 1,
140
+ description: "必填。find -name 通配,例如 *.svg 或 *.html。"
141
+ }
142
+ }
143
+ }
144
+ },
145
+ load_skill: {
146
+ functionCode: "load_skill",
147
+ name: "加载技能",
148
+ description: "按技能名称加载指定技能的完整说明(SKILL.md)。",
149
+ parameters: {
150
+ type: "object",
151
+ required: ["skill_name"],
152
+ properties: {
153
+ skill_name: {
154
+ type: "string",
155
+ minLength: 1,
156
+ description: "必填。要加载的技能名称。"
157
+ }
158
+ }
159
+ }
160
+ },
161
+ read_skill_resource: {
162
+ functionCode: "read_skill_resource",
163
+ name: "读取技能资源",
164
+ description: "读取与指定技能关联的资源文件,例如参考资料、模板或附加说明。",
165
+ parameters: {
166
+ type: "object",
167
+ required: ["skill_name", "resource_name"],
168
+ properties: {
169
+ skill_name: {
170
+ type: "string",
171
+ minLength: 1,
172
+ description: "必填。技能名称。"
173
+ },
174
+ resource_name: {
175
+ type: "string",
176
+ minLength: 1,
177
+ description: "必填。要读取的技能资源相对路径名称。"
178
+ }
179
+ }
180
+ }
181
+ },
182
+ run_skill_script: {
183
+ functionCode: "run_skill_script",
184
+ name: "运行技能脚本",
185
+ description: "在当前会话工作区中执行与指定技能关联的脚本并返回输出。脚本运行时当前目录是工作区根目录,参数里的文件路径按相对工作区根目录传,例如 docs/a.docx。",
186
+ parameters: {
187
+ type: "object",
188
+ required: ["skill_name", "script_name"],
189
+ properties: {
190
+ skill_name: {
191
+ type: "string",
192
+ minLength: 1,
193
+ description: "必填。技能名称。"
194
+ },
195
+ script_name: {
196
+ type: "string",
197
+ minLength: 1,
198
+ description: "必填。要运行的技能脚本相对路径(保持技能说明中列出的目录前缀,如 scripts/run.py)。"
199
+ },
200
+ args: {
201
+ type: "array",
202
+ description: '传递给脚本的命令行位置参数数组,例如 ["input.docx", "--output", "result.idx"]。',
203
+ items: {
204
+ type: "string",
205
+ description: "单个脚本参数。"
206
+ }
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }, p = Object.keys(o);
212
+ if (p.length !== r.length || r.some((i) => !p.includes(i)))
213
+ throw new Error("BUILTIN_TOOL_SCHEMAS 与 BUILTIN_FUNCTION_CODES 不一致");
214
+ export {
215
+ o as BUILTIN_TOOL_SCHEMAS
216
+ };
@@ -0,0 +1,471 @@
1
+ var l = (t, n, e) => new Promise((r, o) => {
2
+ var c = (a) => {
3
+ try {
4
+ s(e.next(a));
5
+ } catch (f) {
6
+ o(f);
7
+ }
8
+ }, i = (a) => {
9
+ try {
10
+ s(e.throw(a));
11
+ } catch (f) {
12
+ o(f);
13
+ }
14
+ }, s = (a) => a.done ? r(a.value) : Promise.resolve(a.value).then(c, i);
15
+ s((e = e.apply(t, n)).next());
16
+ });
17
+ import { throwIfAborted as x, ToolError as d, ToolCode as u } from "../localFiles/errors.mjs";
18
+ import { looksBinary as g, utf8ByteLength as v, readBytes as j } from "../localFiles/tools/runtime.mjs";
19
+ import { MAX_READ_BYTES as _, MAX_WRITE_BYTES as k, RUNNABLE_EXTENSIONS as A, SHELL_CWD as U } from "./constants.mjs";
20
+ import { isImagePath as M, isPdf as I, isStructuredPath as z, structureOverview as W, extensionOf as X } from "./overview.mjs";
21
+ import { resolveFilePath as m, resolveRunPath as Y, mentionsSyntheticDir as C, SYNTHETIC_DIR_MESSAGE as H, isSafeCwd as G, skillRelative as $, toVirtualPath as B } from "./paths.mjs";
22
+ function E(t) {
23
+ return !!t && typeof t == "object" && t.name === "NotFoundError";
24
+ }
25
+ function p(t) {
26
+ try {
27
+ return new TextDecoder("utf-8", {
28
+ fatal: !0
29
+ }).decode(t);
30
+ } catch (n) {
31
+ throw new d(u.BadRequest, "文件不是 UTF-8 文本。");
32
+ }
33
+ }
34
+ function T(t) {
35
+ return t === "" ? [] : (t.endsWith(`
36
+ `) ? t.slice(0, -1) : t).split(`
37
+ `);
38
+ }
39
+ function K(t, n, e) {
40
+ if (n !== void 0 && e !== void 0 && e < n)
41
+ throw new d(u.BadRequest, "end_line 不能小于 start_line。");
42
+ const r = T(t), o = Math.max((n != null ? n : 1) - 1, 0), c = e != null ? e : r.length;
43
+ return r.slice(o, c).join(`
44
+ `);
45
+ }
46
+ function q(t) {
47
+ if (v(t) <= _)
48
+ return {
49
+ text: t,
50
+ truncated: !1
51
+ };
52
+ const n = new TextEncoder().encode(t);
53
+ let e = _;
54
+ for (; e > 0 && (n[e] & 192) === 128; )
55
+ e -= 1;
56
+ const r = new TextDecoder().decode(n.slice(0, e)), o = r.lastIndexOf(`
57
+ `);
58
+ return {
59
+ text: o > 0 ? r.slice(0, o) : r,
60
+ truncated: !0
61
+ };
62
+ }
63
+ function y(t, n) {
64
+ return l(this, null, function* () {
65
+ const e = yield t.stat(n);
66
+ if (e.kind !== "file")
67
+ throw new d(u.BadRequest, "目标是目录,不是文件。");
68
+ const r = yield j(yield t.readFile(n));
69
+ return {
70
+ entry: e,
71
+ bytes: r
72
+ };
73
+ });
74
+ }
75
+ function L(t, n, e) {
76
+ const r = typeof e == "number" ? `${e} 字节,` : "";
77
+ return `${t},${r}路径 ${B(n)}。不返回正文。`;
78
+ }
79
+ function S(t) {
80
+ const n = X(t);
81
+ if (!A.includes(n))
82
+ throw new d(u.BadRequest, "只能执行 .py、.sh 或 .js 文件。");
83
+ return n === ".py" ? "python3" : n === ".js" ? "node" : "sh";
84
+ }
85
+ function N(t) {
86
+ if (!t.runner)
87
+ throw new d(u.NotImplemented, "当前环境不能执行命令或脚本,需要端侧宿主。");
88
+ return t.runner;
89
+ }
90
+ function b(t, n, e, r) {
91
+ return l(this, null, function* () {
92
+ yield t.writeFile(n, e, {
93
+ createDirectories: !0,
94
+ signal: r
95
+ });
96
+ });
97
+ }
98
+ function at(t, n) {
99
+ return l(this, null, function* () {
100
+ const e = m(t.path);
101
+ if (x(n.signal), M(e)) {
102
+ const a = yield n.adapter.stat(e);
103
+ if (a.kind !== "file")
104
+ throw new d(u.BadRequest, "目标是目录,不是文件。");
105
+ return {
106
+ data: {
107
+ content: L("图片", e, a.size),
108
+ truncated: !1
109
+ }
110
+ };
111
+ }
112
+ const {
113
+ entry: r,
114
+ bytes: o
115
+ } = yield y(n.adapter, e);
116
+ if (I(e, o))
117
+ return {
118
+ data: {
119
+ content: L("PDF", e, r.size),
120
+ truncated: !1
121
+ }
122
+ };
123
+ if (g(o))
124
+ throw new d(u.BadRequest, "文件不是文本,无法读取正文。");
125
+ const c = p(o);
126
+ if (t.start_line !== void 0 || t.end_line !== void 0) {
127
+ const a = K(c, t.start_line, t.end_line), f = q(a);
128
+ return {
129
+ data: {
130
+ content: f.text,
131
+ truncated: f.truncated
132
+ }
133
+ };
134
+ }
135
+ if (o.byteLength > _ && z(e))
136
+ return {
137
+ data: {
138
+ content: W(e, c),
139
+ truncated: !0
140
+ }
141
+ };
142
+ const s = q(c);
143
+ return {
144
+ data: {
145
+ content: s.text,
146
+ truncated: s.truncated
147
+ }
148
+ };
149
+ });
150
+ }
151
+ function it(t, n) {
152
+ return l(this, null, function* () {
153
+ const e = m(t.path);
154
+ if (v(t.content) > k)
155
+ throw new d(u.TooLarge, `content 按 UTF-8 计超过 ${k} 字节。请缩短后写入,或改用 append_file、edit_file。`);
156
+ return x(n.signal), yield b(n.adapter, e, t.content, n.signal), {
157
+ data: {}
158
+ };
159
+ });
160
+ }
161
+ function lt(t, n) {
162
+ return l(this, null, function* () {
163
+ const e = m(t.path);
164
+ x(n.signal);
165
+ let r = "";
166
+ try {
167
+ const {
168
+ bytes: o
169
+ } = yield y(n.adapter, e);
170
+ if (g(o))
171
+ throw new d(u.BadRequest, "文件不是文本,无法追加。");
172
+ r = p(o);
173
+ } catch (o) {
174
+ if (!E(o))
175
+ throw o;
176
+ }
177
+ return yield b(n.adapter, e, r + t.content, n.signal), {
178
+ data: {}
179
+ };
180
+ });
181
+ }
182
+ function dt(t, n) {
183
+ return l(this, null, function* () {
184
+ const e = m(t.path);
185
+ x(n.signal);
186
+ const {
187
+ bytes: r
188
+ } = yield y(n.adapter, e);
189
+ if (g(r))
190
+ throw new d(u.BadRequest, "文件不是文本,无法修改。");
191
+ const o = p(r), c = o.indexOf(t.old_text);
192
+ if (c < 0) {
193
+ const s = V(o, t.old_text);
194
+ throw new d(u.BadRequest, `找不到与 old_text 完全相同的内容。最接近的原文从第 ${s.line} 行开始,可复制后重试:
195
+ ${s.excerpt}`, {
196
+ line: s.line,
197
+ excerpt: s.excerpt
198
+ });
199
+ }
200
+ const i = o.slice(0, c) + t.new_text + o.slice(c + t.old_text.length);
201
+ return yield b(n.adapter, e, i, n.signal), {
202
+ data: {}
203
+ };
204
+ });
205
+ }
206
+ function V(t, n) {
207
+ var a;
208
+ const e = T(t);
209
+ if (e.length === 0)
210
+ return {
211
+ line: 1,
212
+ excerpt: ""
213
+ };
214
+ const r = n.split(`
215
+ `), o = ((a = r[0]) != null ? a : "").slice(0, 200);
216
+ let c = 0, i = -1;
217
+ for (let f = 0; f < e.length; f += 1) {
218
+ const w = J(e[f], o);
219
+ w > i && (i = w, c = f);
220
+ }
221
+ const s = Math.min(Math.max(r.length, 1), 8);
222
+ return {
223
+ line: c + 1,
224
+ excerpt: e.slice(c, c + s).join(`
225
+ `)
226
+ };
227
+ }
228
+ function J(t, n) {
229
+ if (!n)
230
+ return 0;
231
+ const e = t.toLowerCase(), r = n.toLowerCase();
232
+ let o = 0, c = 0;
233
+ for (const i of e)
234
+ c < r.length && i === r[c] && (o += 1, c += 1);
235
+ return o;
236
+ }
237
+ function Q(t) {
238
+ let n = "";
239
+ for (let e = 0; e < t.length; e += 1) {
240
+ const r = t[e];
241
+ if (r === "\\") {
242
+ const o = t[e + 1];
243
+ if (o === void 0) {
244
+ n += "\\\\";
245
+ continue;
246
+ }
247
+ e += 1, n += "+?|{}()".includes(o) ? `\\${o}` : o === "n" ? "\\n" : o === "t" ? "\\t" : R(o);
248
+ continue;
249
+ }
250
+ if ("+?|{}()".includes(r)) {
251
+ n += `\\${r}`;
252
+ continue;
253
+ }
254
+ if (r === "[") {
255
+ const o = t.indexOf("]", e + 1);
256
+ if (o < 0) {
257
+ n += "\\[";
258
+ continue;
259
+ }
260
+ n += t.slice(e, o + 1), e = o;
261
+ continue;
262
+ }
263
+ n += ".^$*".includes(r) ? r : R(r);
264
+ }
265
+ return new RegExp(n);
266
+ }
267
+ function R(t) {
268
+ return /[\\^$.*+?()[\]{}|]/.test(t) ? `\\${t}` : t;
269
+ }
270
+ function Z(t) {
271
+ try {
272
+ return Q(t);
273
+ } catch (n) {
274
+ throw new d(u.BadRequest, "pattern 不是合法的 grep 基本正则。");
275
+ }
276
+ }
277
+ function F(t, n, e, r, o) {
278
+ return l(this, null, function* () {
279
+ if (r > 16)
280
+ return;
281
+ x(e);
282
+ const c = yield t.stat(n);
283
+ if (yield o(n, c.kind), c.kind !== "directory")
284
+ return;
285
+ const i = yield t.listEntries(n, e);
286
+ i.sort((s, a) => s.name < a.name ? -1 : s.name > a.name ? 1 : 0);
287
+ for (const s of i) {
288
+ const a = n ? `${n}/${s.name}` : s.name;
289
+ yield F(t, a, e, r + 1, o);
290
+ }
291
+ });
292
+ }
293
+ function ut(t, n) {
294
+ return l(this, null, function* () {
295
+ const e = m(t.path), r = Z(t.pattern), o = [];
296
+ yield F(n.adapter, e, n.signal, 0, (i, s) => l(this, null, function* () {
297
+ if (s !== "file" || o.length >= 200)
298
+ return;
299
+ const {
300
+ bytes: a
301
+ } = yield y(n.adapter, i);
302
+ if (g(a) || M(i) || I(i, a))
303
+ return;
304
+ let f;
305
+ try {
306
+ f = p(a);
307
+ } catch (h) {
308
+ return;
309
+ }
310
+ const w = T(f);
311
+ for (let h = 0; h < w.length && o.length < 200; h += 1) {
312
+ if (!r.test(w[h]))
313
+ continue;
314
+ const D = w[h].length > 500 ? `${w[h].slice(0, 500)}…` : w[h];
315
+ o.push(`${B(i)}:${h + 1}:${D}`);
316
+ }
317
+ }));
318
+ const c = o.join(`
319
+ `);
320
+ return {
321
+ data: {
322
+ matches: o.length >= 200 ? `${c}
323
+ (匹配过多,已截断)` : c
324
+ }
325
+ };
326
+ });
327
+ }
328
+ function tt(t, n) {
329
+ let e = "^";
330
+ for (let r = 0; r < t.length; r += 1) {
331
+ const o = t[r];
332
+ if (o === "*")
333
+ e += ".*";
334
+ else if (o === "?")
335
+ e += ".";
336
+ else if (o === "[") {
337
+ const c = t.indexOf("]", r + 1);
338
+ c < 0 ? e += "\\[" : (e += t.slice(r, c + 1), r = c);
339
+ } else
340
+ e += R(o);
341
+ }
342
+ return new RegExp(`${e}$`).test(n);
343
+ }
344
+ function ft(t, n) {
345
+ return l(this, null, function* () {
346
+ const e = m(t.path), r = [];
347
+ yield F(n.adapter, e, n.signal, 0, (c) => l(this, null, function* () {
348
+ var s;
349
+ if (r.length >= 500)
350
+ return;
351
+ const i = (s = c.split("/").pop()) != null ? s : c;
352
+ tt(t.name, i) && r.push(B(c));
353
+ })), r.sort();
354
+ const o = r.join(`
355
+ `);
356
+ return {
357
+ data: {
358
+ files: r.length >= 500 ? `${o}
359
+ (结果过多,已截断)` : o
360
+ }
361
+ };
362
+ });
363
+ }
364
+ function O(t, n, e) {
365
+ return l(this, null, function* () {
366
+ const r = N(e);
367
+ yield y(e.adapter, t);
368
+ const o = yield r.exec({
369
+ argv: [S(t), t, ...n],
370
+ cwd: U,
371
+ timeoutMs: e.timeoutMs,
372
+ signal: e.signal
373
+ });
374
+ return {
375
+ data: {
376
+ exitCode: o.exitCode,
377
+ stdout: o.stdout,
378
+ stderr: o.stderr
379
+ }
380
+ };
381
+ });
382
+ }
383
+ function wt(t, n) {
384
+ return l(this, null, function* () {
385
+ const e = Y(t.path);
386
+ return S(e), O(e, [], n);
387
+ });
388
+ }
389
+ function ht(t, n) {
390
+ return l(this, null, function* () {
391
+ if (C(t.command) || C(n.shellCwd.cwd))
392
+ return {
393
+ data: {
394
+ exitCode: 1,
395
+ stdout: "",
396
+ stderr: `${H}
397
+ `
398
+ }
399
+ };
400
+ const r = yield N(n).exec({
401
+ command: t.command,
402
+ cwd: n.shellCwd.cwd,
403
+ timeoutMs: n.timeoutMs,
404
+ signal: n.signal
405
+ });
406
+ return r.cwd && G(r.cwd) && (n.shellCwd.cwd = r.cwd), {
407
+ data: {
408
+ exitCode: r.exitCode,
409
+ stdout: r.stdout,
410
+ stderr: r.stderr
411
+ }
412
+ };
413
+ });
414
+ }
415
+ function P(t, n) {
416
+ return l(this, null, function* () {
417
+ try {
418
+ const {
419
+ bytes: e
420
+ } = yield y(n.adapter, t);
421
+ if (g(e))
422
+ throw new d(u.BadRequest, "技能资源不是文本。");
423
+ return p(e);
424
+ } catch (e) {
425
+ throw E(e) ? new d(u.NotFound, "技能或资源不存在。") : e;
426
+ }
427
+ });
428
+ }
429
+ function mt(t, n) {
430
+ return l(this, null, function* () {
431
+ return {
432
+ data: {
433
+ content: yield P($(t.skill_name, "SKILL.md"), n)
434
+ }
435
+ };
436
+ });
437
+ }
438
+ function yt(t, n) {
439
+ return l(this, null, function* () {
440
+ return {
441
+ data: {
442
+ content: yield P($(t.skill_name, t.resource_name), n)
443
+ }
444
+ };
445
+ });
446
+ }
447
+ function xt(t, n) {
448
+ return l(this, null, function* () {
449
+ var r;
450
+ const e = $(t.skill_name, t.script_name);
451
+ S(e);
452
+ try {
453
+ return yield O(e, (r = t.args) != null ? r : [], n);
454
+ } catch (o) {
455
+ throw E(o) ? new d(u.NotFound, "技能脚本不存在。") : o;
456
+ }
457
+ });
458
+ }
459
+ export {
460
+ lt as appendFile,
461
+ dt as editFile,
462
+ ft as find,
463
+ ut as grep,
464
+ mt as loadSkill,
465
+ at as readFile,
466
+ yt as readSkillResource,
467
+ wt as runFile,
468
+ xt as runSkillScript,
469
+ ht as shell,
470
+ it as writeFile
471
+ };