@oflow-ai/core 0.1.0

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/agents/index.d.ts +35 -0
  4. package/dist/agents/index.js +233 -0
  5. package/dist/ai/chinese-provider.d.ts +146 -0
  6. package/dist/ai/chinese-provider.js +193 -0
  7. package/dist/ai/custom-provider.d.ts +11 -0
  8. package/dist/ai/custom-provider.js +113 -0
  9. package/dist/ai/index.d.ts +7 -0
  10. package/dist/ai/index.js +42 -0
  11. package/dist/ai/openai-provider.d.ts +18 -0
  12. package/dist/ai/openai-provider.js +161 -0
  13. package/dist/config/index.d.ts +20 -0
  14. package/dist/config/index.js +83 -0
  15. package/dist/conversation.d.ts +26 -0
  16. package/dist/conversation.js +126 -0
  17. package/dist/index.d.ts +10 -0
  18. package/dist/index.js +72 -0
  19. package/dist/mcp/index.d.ts +48 -0
  20. package/dist/mcp/index.js +175 -0
  21. package/dist/sandbox/index.d.ts +31 -0
  22. package/dist/sandbox/index.js +197 -0
  23. package/dist/skills/index.d.ts +16 -0
  24. package/dist/skills/index.js +169 -0
  25. package/dist/tools/ask-user-question.d.ts +62 -0
  26. package/dist/tools/ask-user-question.js +71 -0
  27. package/dist/tools/base.d.ts +16 -0
  28. package/dist/tools/base.js +39 -0
  29. package/dist/tools/glob.d.ts +27 -0
  30. package/dist/tools/glob.js +125 -0
  31. package/dist/tools/image-read.d.ts +42 -0
  32. package/dist/tools/image-read.js +125 -0
  33. package/dist/tools/index.d.ts +27 -0
  34. package/dist/tools/index.js +127 -0
  35. package/dist/tools/list-directory.d.ts +28 -0
  36. package/dist/tools/list-directory.js +94 -0
  37. package/dist/tools/pdf-extract.d.ts +32 -0
  38. package/dist/tools/pdf-extract.js +130 -0
  39. package/dist/tools/read-file.d.ts +31 -0
  40. package/dist/tools/read-file.js +116 -0
  41. package/dist/tools/replace.d.ts +35 -0
  42. package/dist/tools/replace.js +93 -0
  43. package/dist/tools/run-shell-command.d.ts +35 -0
  44. package/dist/tools/run-shell-command.js +81 -0
  45. package/dist/tools/save-memory.d.ts +22 -0
  46. package/dist/tools/save-memory.js +91 -0
  47. package/dist/tools/search-file-content.d.ts +42 -0
  48. package/dist/tools/search-file-content.js +153 -0
  49. package/dist/tools/task.d.ts +46 -0
  50. package/dist/tools/task.js +54 -0
  51. package/dist/tools/web-fetch.d.ts +26 -0
  52. package/dist/tools/web-fetch.js +81 -0
  53. package/dist/tools/web-search.d.ts +35 -0
  54. package/dist/tools/web-search.js +86 -0
  55. package/dist/tools/write-file.d.ts +25 -0
  56. package/dist/tools/write-file.js +76 -0
  57. package/dist/types/index.d.ts +166 -0
  58. package/dist/types/index.js +43 -0
  59. package/package.json +54 -0
@@ -0,0 +1,31 @@
1
+ export type SandboxBackend = 'none' | 'docker' | 'podman';
2
+ export interface SandboxConfig {
3
+ backend: SandboxBackend;
4
+ image?: string;
5
+ timeout?: number;
6
+ memoryLimit?: string;
7
+ cpuLimit?: string;
8
+ networkEnabled?: boolean;
9
+ mountPoints?: {
10
+ host: string;
11
+ container: string;
12
+ }[];
13
+ }
14
+ export interface SandboxResult {
15
+ stdout: string;
16
+ stderr: string;
17
+ exitCode: number;
18
+ timedOut: boolean;
19
+ }
20
+ export declare class SandboxExecutor {
21
+ private config;
22
+ private containerId;
23
+ constructor(config?: Partial<SandboxConfig>);
24
+ execute(command: string, cwd?: string): Promise<SandboxResult>;
25
+ private executeDirectly;
26
+ private executeInDocker;
27
+ private executeInPodman;
28
+ private runContainerCommand;
29
+ static detectBackend(): Promise<SandboxBackend>;
30
+ }
31
+ export declare function createSandboxExecutor(config?: Partial<SandboxConfig>): Promise<SandboxExecutor>;
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SandboxExecutor = void 0;
4
+ exports.createSandboxExecutor = createSandboxExecutor;
5
+ const child_process_1 = require("child_process");
6
+ const DEFAULT_IMAGE = 'node:20-slim';
7
+ const DEFAULT_TIMEOUT = 120000; // 2 minutes
8
+ class SandboxExecutor {
9
+ config;
10
+ containerId = null;
11
+ constructor(config) {
12
+ this.config = {
13
+ backend: config?.backend || 'none',
14
+ image: config?.image || DEFAULT_IMAGE,
15
+ timeout: config?.timeout || DEFAULT_TIMEOUT,
16
+ memoryLimit: config?.memoryLimit,
17
+ cpuLimit: config?.cpuLimit,
18
+ networkEnabled: config?.networkEnabled ?? false,
19
+ mountPoints: config?.mountPoints || []
20
+ };
21
+ }
22
+ async execute(command, cwd) {
23
+ switch (this.config.backend) {
24
+ case 'docker':
25
+ return this.executeInDocker(command, cwd);
26
+ case 'podman':
27
+ return this.executeInPodman(command, cwd);
28
+ case 'none':
29
+ default:
30
+ return this.executeDirectly(command, cwd);
31
+ }
32
+ }
33
+ async executeDirectly(command, cwd) {
34
+ return new Promise((resolve) => {
35
+ const isWindows = process.platform === 'win32';
36
+ const shell = isWindows ? 'powershell.exe' : '/bin/bash';
37
+ const shellArgs = isWindows
38
+ ? ['-NoProfile', '-Command', command]
39
+ : ['-c', command];
40
+ const proc = (0, child_process_1.spawn)(shell, shellArgs, {
41
+ cwd: cwd || process.cwd(),
42
+ env: process.env
43
+ });
44
+ let stdout = '';
45
+ let stderr = '';
46
+ let timedOut = false;
47
+ const timeoutId = setTimeout(() => {
48
+ timedOut = true;
49
+ proc.kill();
50
+ }, this.config.timeout);
51
+ proc.stdout.on('data', (data) => {
52
+ stdout += data.toString();
53
+ });
54
+ proc.stderr.on('data', (data) => {
55
+ stderr += data.toString();
56
+ });
57
+ proc.on('close', (code) => {
58
+ clearTimeout(timeoutId);
59
+ resolve({
60
+ stdout,
61
+ stderr,
62
+ exitCode: code || 0,
63
+ timedOut
64
+ });
65
+ });
66
+ proc.on('error', (error) => {
67
+ clearTimeout(timeoutId);
68
+ resolve({
69
+ stdout,
70
+ stderr: error.message,
71
+ exitCode: 1,
72
+ timedOut: false
73
+ });
74
+ });
75
+ });
76
+ }
77
+ async executeInDocker(command, cwd) {
78
+ const workingDir = cwd || process.cwd();
79
+ // 构建Docker运行命令
80
+ const dockerArgs = [
81
+ 'run',
82
+ '--rm',
83
+ '-v', `${workingDir}:/workspace`,
84
+ '-w', '/workspace'
85
+ ];
86
+ // 网络设置
87
+ if (!this.config.networkEnabled) {
88
+ dockerArgs.push('--network', 'none');
89
+ }
90
+ // 内存限制
91
+ if (this.config.memoryLimit) {
92
+ dockerArgs.push('--memory', this.config.memoryLimit);
93
+ }
94
+ // CPU限制
95
+ if (this.config.cpuLimit) {
96
+ dockerArgs.push('--cpus', this.config.cpuLimit);
97
+ }
98
+ // 超时设置
99
+ dockerArgs.push('--timeout', String(Math.floor(this.config.timeout / 1000)));
100
+ // 添加镜像和命令
101
+ dockerArgs.push(this.config.image);
102
+ dockerArgs.push('sh', '-c', command);
103
+ return this.runContainerCommand('docker', dockerArgs);
104
+ }
105
+ async executeInPodman(command, cwd) {
106
+ const workingDir = cwd || process.cwd();
107
+ // Podman参数与Docker类似
108
+ const podmanArgs = [
109
+ 'run',
110
+ '--rm',
111
+ '-v', `${workingDir}:/workspace`,
112
+ '-w', '/workspace'
113
+ ];
114
+ if (!this.config.networkEnabled) {
115
+ podmanArgs.push('--network', 'none');
116
+ }
117
+ if (this.config.memoryLimit) {
118
+ podmanArgs.push('--memory', this.config.memoryLimit);
119
+ }
120
+ if (this.config.cpuLimit) {
121
+ podmanArgs.push('--cpus', this.config.cpuLimit);
122
+ }
123
+ podmanArgs.push(this.config.image);
124
+ podmanArgs.push('sh', '-c', command);
125
+ return this.runContainerCommand('podman', podmanArgs);
126
+ }
127
+ runContainerCommand(runtime, args) {
128
+ return new Promise((resolve) => {
129
+ const proc = (0, child_process_1.spawn)(runtime, args, {
130
+ env: process.env
131
+ });
132
+ let stdout = '';
133
+ let stderr = '';
134
+ let timedOut = false;
135
+ const timeoutId = setTimeout(() => {
136
+ timedOut = true;
137
+ proc.kill();
138
+ }, this.config.timeout);
139
+ proc.stdout.on('data', (data) => {
140
+ stdout += data.toString();
141
+ });
142
+ proc.stderr.on('data', (data) => {
143
+ stderr += data.toString();
144
+ });
145
+ proc.on('close', (code) => {
146
+ clearTimeout(timeoutId);
147
+ resolve({
148
+ stdout,
149
+ stderr,
150
+ exitCode: code || 0,
151
+ timedOut
152
+ });
153
+ });
154
+ proc.on('error', (error) => {
155
+ clearTimeout(timeoutId);
156
+ resolve({
157
+ stdout,
158
+ stderr: `Failed to run ${runtime}: ${error.message}`,
159
+ exitCode: 1,
160
+ timedOut: false
161
+ });
162
+ });
163
+ });
164
+ }
165
+ static async detectBackend() {
166
+ // 检查Docker是否可用
167
+ try {
168
+ const dockerCheck = await new Promise((resolve) => {
169
+ const proc = (0, child_process_1.spawn)('docker', ['--version']);
170
+ proc.on('close', (code) => resolve(code === 0));
171
+ proc.on('error', () => resolve(false));
172
+ });
173
+ if (dockerCheck)
174
+ return 'docker';
175
+ }
176
+ catch { }
177
+ // 检查Podman是否可用
178
+ try {
179
+ const podmanCheck = await new Promise((resolve) => {
180
+ const proc = (0, child_process_1.spawn)('podman', ['--version']);
181
+ proc.on('close', (code) => resolve(code === 0));
182
+ proc.on('error', () => resolve(false));
183
+ });
184
+ if (podmanCheck)
185
+ return 'podman';
186
+ }
187
+ catch { }
188
+ return 'none';
189
+ }
190
+ }
191
+ exports.SandboxExecutor = SandboxExecutor;
192
+ // 工具函数:创建沙箱执行器
193
+ async function createSandboxExecutor(config) {
194
+ const backend = config?.backend || await SandboxExecutor.detectBackend();
195
+ return new SandboxExecutor({ ...config, backend });
196
+ }
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FuZGJveC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrUEEsc0RBR0M7QUFyUEQsaURBQW9EO0FBdUJwRCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLENBQUMsWUFBWTtBQUU1QyxNQUFhLGVBQWU7SUFDbEIsTUFBTSxDQUFnQjtJQUN0QixXQUFXLEdBQWtCLElBQUksQ0FBQztJQUUxQyxZQUFZLE1BQStCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDWixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNO1lBQ2xDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLGFBQWE7WUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksZUFBZTtZQUMzQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVc7WUFDaEMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRO1lBQzFCLGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxJQUFJLEtBQUs7WUFDL0MsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLElBQUksRUFBRTtTQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBZSxFQUFFLEdBQVk7UUFDekMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLEtBQUssTUFBTSxDQUFDO1lBQ1o7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxH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QyxhQUFhLEVBQUUsQ0FBQztJQUN6RSxPQUFPLElBQUksZUFBZSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd24sIENoaWxkUHJvY2VzcyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcblxuZXhwb3J0IHR5cGUgU2FuZGJveEJhY2tlbmQgPSAnbm9uZScgfCAnZG9ja2VyJyB8ICdwb2RtYW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hDb25maWcge1xuICBiYWNrZW5kOiBTYW5kYm94QmFja2VuZDtcbiAgaW1hZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIG1lbW9yeUxpbWl0Pzogc3RyaW5nO1xuICBjcHVMaW1pdD86IHN0cmluZztcbiAgbmV0d29ya0VuYWJsZWQ/OiBib29sZWFuO1xuICBtb3VudFBvaW50cz86IHsgaG9zdDogc3RyaW5nOyBjb250YWluZXI6IHN0cmluZyB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFJlc3VsdCB7XG4gIHN0ZG91dDogc3RyaW5nO1xuICBzdGRlcnI6IHN0cmluZztcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgdGltZWRPdXQ6IGJvb2xlYW47XG59XG5cbmNvbnN0IERFRkFVTFRfSU1BR0UgPSAnbm9kZToyMC1zbGltJztcbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDEyMDAwMDsgLy8gMiBtaW51dGVzXG5cbmV4cG9ydCBjbGFzcyBTYW5kYm94RXhlY3V0b3Ige1xuICBwcml2YXRlIGNvbmZpZzogU2FuZGJveENvbmZpZztcbiAgcHJpdmF0ZSBjb250YWluZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxTYW5kYm94Q29uZmlnPikge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgYmFja2VuZDogY29uZmlnPy5iYWNrZW5kIHx8ICdub25lJyxcbiAgICAgIGltYWdlOiBjb25maWc/LmltYWdlIHx8IERFRkFVTFRfSU1BR0UsXG4gICAgICB0aW1lb3V0OiBjb25maWc/LnRpbWVvdXQgfHwgREVGQVVMVF9USU1FT1VULFxuICAgICAgbWVtb3J5TGltaXQ6IGNvbmZpZz8ubWVtb3J5TGltaXQsXG4gICAgICBjcHVMaW1pdDogY29uZmlnPy5jcHVMaW1pdCxcbiAgICAgIG5ldHdvcmtFbmFibGVkOiBjb25maWc/Lm5ldHdvcmtFbmFibGVkID8/IGZhbHNlLFxuICAgICAgbW91bnRQb2ludHM6IGNvbmZpZz8ubW91bnRQb2ludHMgfHwgW11cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZShjb21tYW5kOiBzdHJpbmcsIGN3ZD86IHN0cmluZyk6IFByb21pc2U8U2FuZGJveFJlc3VsdD4ge1xuICAgIHN3aXRjaCAodGhpcy5jb25maWcuYmFja2VuZCkge1xuICAgICAgY2FzZSAnZG9ja2VyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUluRG9ja2VyKGNvbW1hbmQsIGN3ZCk7XG4gICAgICBjYXNlICdwb2RtYW4nOlxuICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlSW5Qb2RtYW4oY29tbWFuZCwgY3dkKTtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZURpcmVjdGx5KGNvbW1hbmQsIGN3ZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlRGlyZWN0bHkoY29tbWFuZDogc3RyaW5nLCBjd2Q/OiBzdHJpbmcpOiBQcm9taXNlPFNhbmRib3hSZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgICBjb25zdCBzaGVsbCA9IGlzV2luZG93cyA/ICdwb3dlcnNoZWxsLmV4ZScgOiAnL2Jpbi9iYXNoJztcbiAgICAgIGNvbnN0IHNoZWxsQXJncyA9IGlzV2luZG93cyBcbiAgICAgICAgPyBbJy1Ob1Byb2ZpbGUnLCAnLUNvbW1hbmQnLCBjb21tYW5kXVxuICAgICAgICA6IFsnLWMnLCBjb21tYW5kXTtcblxuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKHNoZWxsLCBzaGVsbEFyZ3MsIHtcbiAgICAgICAgY3dkOiBjd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudlxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGxldCB0aW1lZE91dCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGltZWRPdXQgPSB0cnVlO1xuICAgICAgICBwcm9jLmtpbGwoKTtcbiAgICAgIH0sIHRoaXMuY29uZmlnLnRpbWVvdXQpO1xuXG4gICAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBzdGRlcnIgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgZXhpdENvZGU6IGNvZGUgfHwgMCxcbiAgICAgICAgICB0aW1lZE91dFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgIHN0ZGVycjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgICB0aW1lZE91dDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUluRG9ja2VyKGNvbW1hbmQ6IHN0cmluZywgY3dkPzogc3RyaW5nKTogUHJvbWlzZTxTYW5kYm94UmVzdWx0PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIFxuICAgIC8vIOaehOW7ukRvY2tlcui/kOihjOWRveS7pFxuICAgIGNvbnN0IGRvY2tlckFyZ3MgPSBbXG4gICAgICAncnVuJyxcbiAgICAgICctLXJtJyxcbiAgICAgICctdicsIGAke3dvcmtpbmdEaXJ9Oi93b3Jrc3BhY2VgLFxuICAgICAgJy13JywgJy93b3Jrc3BhY2UnXG4gICAgXTtcblxuICAgIC8vIOe9kee7nOiuvue9rlxuICAgIGlmICghdGhpcy5jb25maWcubmV0d29ya0VuYWJsZWQpIHtcbiAgICAgIGRvY2tlckFyZ3MucHVzaCgnLS1uZXR3b3JrJywgJ25vbmUnKTtcbiAgICB9XG5cbiAgICAvLyDlhoXlrZjpmZDliLZcbiAgICBpZiAodGhpcy5jb25maWcubWVtb3J5TGltaXQpIHtcbiAgICAgIGRvY2tlckFyZ3MucHVzaCgnLS1tZW1vcnknLCB0aGlzLmNvbmZpZy5tZW1vcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQ1BV6ZmQ5Yi2XG4gICAgaWYgKHRoaXMuY29uZmlnLmNwdUxpbWl0KSB7XG4gICAgICBkb2NrZXJBcmdzLnB1c2goJy0tY3B1cycsIHRoaXMuY29uZmlnLmNwdUxpbWl0KTtcbiAgICB9XG5cbiAgICAvLyDotoXml7borr7nva5cbiAgICBkb2NrZXJBcmdzLnB1c2goJy0tdGltZW91dCcsIFN0cmluZyhNYXRoLmZsb29yKHRoaXMuY29uZmlnLnRpbWVvdXQhIC8gMTAwMCkpKTtcblxuICAgIC8vIOa3u+WKoOmVnOWDj+WSjOWRveS7pFxuICAgIGRvY2tlckFyZ3MucHVzaCh0aGlzLmNvbmZpZy5pbWFnZSEpO1xuICAgIGRvY2tlckFyZ3MucHVzaCgnc2gnLCAnLWMnLCBjb21tYW5kKTtcblxuICAgIHJldHVybiB0aGlzLnJ1bkNvbnRhaW5lckNvbW1hbmQoJ2RvY2tlcicsIGRvY2tlckFyZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlSW5Qb2RtYW4oY29tbWFuZDogc3RyaW5nLCBjd2Q/OiBzdHJpbmcpOiBQcm9taXNlPFNhbmRib3hSZXN1bHQ+IHtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gY3dkIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgXG4gICAgLy8gUG9kbWFu5Y+C5pWw5LiORG9ja2Vy57G75Ly8XG4gICAgY29uc3QgcG9kbWFuQXJncyA9IFtcbiAgICAgICdydW4nLFxuICAgICAgJy0tcm0nLFxuICAgICAgJy12JywgYCR7d29ya2luZ0Rpcn06L3dvcmtzcGFjZWAsXG4gICAgICAnLXcnLCAnL3dvcmtzcGFjZSdcbiAgICBdO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5uZXR3b3JrRW5hYmxlZCkge1xuICAgICAgcG9kbWFuQXJncy5wdXNoKCctLW5ldHdvcmsnLCAnbm9uZScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5tZW1vcnlMaW1pdCkge1xuICAgICAgcG9kbWFuQXJncy5wdXNoKCctLW1lbW9yeScsIHRoaXMuY29uZmlnLm1lbW9yeUxpbWl0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuY3B1TGltaXQpIHtcbiAgICAgIHBvZG1hbkFyZ3MucHVzaCgnLS1jcHVzJywgdGhpcy5jb25maWcuY3B1TGltaXQpO1xuICAgIH1cblxuICAgIHBvZG1hbkFyZ3MucHVzaCh0aGlzLmNvbmZpZy5pbWFnZSEpO1xuICAgIHBvZG1hbkFyZ3MucHVzaCgnc2gnLCAnLWMnLCBjb21tYW5kKTtcblxuICAgIHJldHVybiB0aGlzLnJ1bkNvbnRhaW5lckNvbW1hbmQoJ3BvZG1hbicsIHBvZG1hbkFyZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBydW5Db250YWluZXJDb21tYW5kKHJ1bnRpbWU6IHN0cmluZywgYXJnczogc3RyaW5nW10pOiBQcm9taXNlPFNhbmRib3hSZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihydW50aW1lLCBhcmdzLCB7XG4gICAgICAgIGVudjogcHJvY2Vzcy5lbnZcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBsZXQgdGltZWRPdXQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgcHJvYy5raWxsKCk7XG4gICAgICB9LCB0aGlzLmNvbmZpZy50aW1lb3V0KTtcblxuICAgICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIHByb2Muc3RkZXJyLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgIGV4aXRDb2RlOiBjb2RlIHx8IDAsXG4gICAgICAgICAgdGltZWRPdXRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICBzdGRlcnI6IGBGYWlsZWQgdG8gcnVuICR7cnVudGltZX06ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgIGV4aXRDb2RlOiAxLFxuICAgICAgICAgIHRpbWVkT3V0OiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRldGVjdEJhY2tlbmQoKTogUHJvbWlzZTxTYW5kYm94QmFja2VuZD4ge1xuICAgIC8vIOajgOafpURvY2tlcuaYr+WQpuWPr+eUqFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkb2NrZXJDaGVjayA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2MgPSBzcGF3bignZG9ja2VyJywgWyctLXZlcnNpb24nXSk7XG4gICAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHJlc29sdmUoY29kZSA9PT0gMCkpO1xuICAgICAgICBwcm9jLm9uKCdlcnJvcicsICgpID0+IHJlc29sdmUoZmFsc2UpKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRvY2tlckNoZWNrKSByZXR1cm4gJ2RvY2tlcic7XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgLy8g5qOA5p+lUG9kbWFu5piv5ZCm5Y+v55SoXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBvZG1hbkNoZWNrID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgcHJvYyA9IHNwYXduKCdwb2RtYW4nLCBbJy0tdmVyc2lvbiddKTtcbiAgICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4gcmVzb2x2ZShjb2RlID09PSAwKSk7XG4gICAgICAgIHByb2Mub24oJ2Vycm9yJywgKCkgPT4gcmVzb2x2ZShmYWxzZSkpO1xuICAgICAgfSk7XG4gICAgICBpZiAocG9kbWFuQ2hlY2spIHJldHVybiAncG9kbWFuJztcbiAgICB9IGNhdGNoIHt9XG5cbiAgICByZXR1cm4gJ25vbmUnO1xuICB9XG59XG5cbi8vIOW3peWFt+WHveaVsO+8muWIm+W7uuaymeeuseaJp+ihjOWZqFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNhbmRib3hFeGVjdXRvcihjb25maWc/OiBQYXJ0aWFsPFNhbmRib3hDb25maWc+KTogUHJvbWlzZTxTYW5kYm94RXhlY3V0b3I+IHtcbiAgY29uc3QgYmFja2VuZCA9IGNvbmZpZz8uYmFja2VuZCB8fCBhd2FpdCBTYW5kYm94RXhlY3V0b3IuZGV0ZWN0QmFja2VuZCgpO1xuICByZXR1cm4gbmV3IFNhbmRib3hFeGVjdXRvcih7IC4uLmNvbmZpZywgYmFja2VuZCB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { Skill } from '../types';
2
+ export declare class SkillManager {
3
+ private skillsDir;
4
+ private projectSkillsDir;
5
+ private skills;
6
+ constructor(skillsDir?: string, projectSkillsDir?: string);
7
+ loadSkills(): Promise<Skill[]>;
8
+ private loadSkillsFromDir;
9
+ private parseSkillFile;
10
+ getSkill(id: string): Skill | undefined;
11
+ getAllSkills(): Skill[];
12
+ getSkillContent(id: string): Promise<string | null>;
13
+ installSkill(source: string, scope?: 'global' | 'project'): Promise<Skill>;
14
+ private copyDir;
15
+ uninstallSkill(id: string): Promise<boolean>;
16
+ }
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SkillManager = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const SKILL_FILE = 'SKILL.md';
40
+ class SkillManager {
41
+ skillsDir;
42
+ projectSkillsDir;
43
+ skills = new Map();
44
+ constructor(skillsDir, projectSkillsDir) {
45
+ this.skillsDir = skillsDir || path.join(process.cwd(), '.oflow', 'skills');
46
+ this.projectSkillsDir = projectSkillsDir || path.join(process.cwd(), '.oflow', 'skills');
47
+ }
48
+ async loadSkills() {
49
+ this.skills.clear();
50
+ // Load global skills
51
+ await this.loadSkillsFromDir(this.skillsDir, 'global');
52
+ // Load project skills (override global with same name)
53
+ await this.loadSkillsFromDir(this.projectSkillsDir, 'project');
54
+ return this.getAllSkills();
55
+ }
56
+ async loadSkillsFromDir(dir, scope) {
57
+ try {
58
+ const entries = await fs.readdir(dir, { withFileTypes: true });
59
+ for (const entry of entries) {
60
+ if (!entry.isDirectory())
61
+ continue;
62
+ const skillPath = path.join(dir, entry.name);
63
+ const skillFile = path.join(skillPath, SKILL_FILE);
64
+ try {
65
+ const content = await fs.readFile(skillFile, 'utf-8');
66
+ const skill = this.parseSkillFile(skillPath, content);
67
+ if (skill) {
68
+ this.skills.set(skill.id, { ...skill, path: skillPath });
69
+ }
70
+ }
71
+ catch {
72
+ // Skip invalid skills
73
+ }
74
+ }
75
+ }
76
+ catch {
77
+ // Directory doesn't exist
78
+ }
79
+ }
80
+ parseSkillFile(skillPath, content) {
81
+ try {
82
+ // Parse YAML frontmatter
83
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
84
+ if (!frontmatterMatch) {
85
+ return null;
86
+ }
87
+ const frontmatter = frontmatterMatch[1];
88
+ const mainContent = frontmatterMatch[2];
89
+ // Parse frontmatter (simple key: value parsing)
90
+ const meta = {};
91
+ frontmatter.split('\n').forEach(line => {
92
+ const match = line.match(/^(\w+):\s*(.*)$/);
93
+ if (match) {
94
+ meta[match[1]] = match[2];
95
+ }
96
+ });
97
+ return {
98
+ id: meta.id || path.basename(skillPath),
99
+ name: meta.name || path.basename(skillPath),
100
+ description: meta.description || '',
101
+ version: meta.version || '1.0.0',
102
+ path: skillPath,
103
+ mainFile: SKILL_FILE
104
+ };
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ getSkill(id) {
111
+ return this.skills.get(id);
112
+ }
113
+ getAllSkills() {
114
+ return Array.from(this.skills.values());
115
+ }
116
+ async getSkillContent(id) {
117
+ const skill = this.skills.get(id);
118
+ if (!skill)
119
+ return null;
120
+ try {
121
+ const skillFile = path.join(skill.path, SKILL_FILE);
122
+ return await fs.readFile(skillFile, 'utf-8');
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }
128
+ async installSkill(source, scope = 'project') {
129
+ const targetDir = scope === 'global' ? this.skillsDir : this.projectSkillsDir;
130
+ const skillId = path.basename(source).replace(/\.git$/, '');
131
+ const targetPath = path.join(targetDir, skillId);
132
+ // For now, we'll just copy from a local path
133
+ // In a real implementation, this would support git repos, archives, etc.
134
+ await fs.mkdir(targetDir, { recursive: true });
135
+ // Copy directory
136
+ await this.copyDir(source, targetPath);
137
+ // Reload skills
138
+ await this.loadSkills();
139
+ const skill = this.skills.get(skillId);
140
+ if (!skill) {
141
+ throw new Error('Failed to load installed skill');
142
+ }
143
+ return skill;
144
+ }
145
+ async copyDir(src, dest) {
146
+ await fs.mkdir(dest, { recursive: true });
147
+ const entries = await fs.readdir(src, { withFileTypes: true });
148
+ for (const entry of entries) {
149
+ const srcPath = path.join(src, entry.name);
150
+ const destPath = path.join(dest, entry.name);
151
+ if (entry.isDirectory()) {
152
+ await this.copyDir(srcPath, destPath);
153
+ }
154
+ else {
155
+ await fs.copyFile(srcPath, destPath);
156
+ }
157
+ }
158
+ }
159
+ async uninstallSkill(id) {
160
+ const skill = this.skills.get(id);
161
+ if (!skill)
162
+ return false;
163
+ await fs.rm(skill.path, { recursive: true, force: true });
164
+ this.skills.delete(id);
165
+ return true;
166
+ }
167
+ }
168
+ exports.SkillManager = SkillManager;
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2tpbGxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUFrQztBQUNsQywyQ0FBNkI7QUFHN0IsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBRTlCLE1BQWEsWUFBWTtJQUNmLFNBQVMsQ0FBUztJQUNsQixnQkFBZ0IsQ0FBUztJQUN6QixNQUFNLEdBQXVCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFL0MsWUFBWSxTQUFrQixFQUFFLGdCQUF5QjtRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXBCLHFCQUFxQjtRQUNyQixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXZELHVEQUF1RDtRQUN2RCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFL0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsS0FBMkI7UUFDdEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxF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S0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXpCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQXRKRCxvQ0FzSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU2tpbGwgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IFNLSUxMX0ZJTEUgPSAnU0tJTEwubWQnO1xuXG5leHBvcnQgY2xhc3MgU2tpbGxNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBza2lsbHNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBwcm9qZWN0U2tpbGxzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgc2tpbGxzOiBNYXA8c3RyaW5nLCBTa2lsbD4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3Ioc2tpbGxzRGlyPzogc3RyaW5nLCBwcm9qZWN0U2tpbGxzRGlyPzogc3RyaW5nKSB7XG4gICAgdGhpcy5za2lsbHNEaXIgPSBza2lsbHNEaXIgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcub2Zsb3cnLCAnc2tpbGxzJyk7XG4gICAgdGhpcy5wcm9qZWN0U2tpbGxzRGlyID0gcHJvamVjdFNraWxsc0RpciB8fCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vZmxvdycsICdza2lsbHMnKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRTa2lsbHMoKTogUHJvbWlzZTxTa2lsbFtdPiB7XG4gICAgdGhpcy5za2lsbHMuY2xlYXIoKTtcbiAgICBcbiAgICAvLyBMb2FkIGdsb2JhbCBza2lsbHNcbiAgICBhd2FpdCB0aGlzLmxvYWRTa2lsbHNGcm9tRGlyKHRoaXMuc2tpbGxzRGlyLCAnZ2xvYmFsJyk7XG4gICAgXG4gICAgLy8gTG9hZCBwcm9qZWN0IHNraWxscyAob3ZlcnJpZGUgZ2xvYmFsIHdpdGggc2FtZSBuYW1lKVxuICAgIGF3YWl0IHRoaXMubG9hZFNraWxsc0Zyb21EaXIodGhpcy5wcm9qZWN0U2tpbGxzRGlyLCAncHJvamVjdCcpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsU2tpbGxzKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRTa2lsbHNGcm9tRGlyKGRpcjogc3RyaW5nLCBzY29wZTogJ2dsb2JhbCcgfCAncHJvamVjdCcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc2tpbGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICAgIGNvbnN0IHNraWxsRmlsZSA9IHBhdGguam9pbihza2lsbFBhdGgsIFNLSUxMX0ZJTEUpO1xuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2tpbGxGaWxlLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBza2lsbCA9IHRoaXMucGFyc2VTa2lsbEZpbGUoc2tpbGxQYXRoLCBjb250ZW50KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc2tpbGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpbGxzLnNldChza2lsbC5pZCwgeyAuLi5za2lsbCwgcGF0aDogc2tpbGxQYXRoIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gU2tpcCBpbnZhbGlkIHNraWxsc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTa2lsbEZpbGUoc2tpbGxQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFNraWxsIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFBhcnNlIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxuKFtcXHNcXFNdKj8pXFxuLS0tXFxuKFtcXHNcXFNdKikkLyk7XG4gICAgICBcbiAgICAgIGlmICghZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgICAgY29uc3QgbWFpbkNvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzJdO1xuXG4gICAgICAvLyBQYXJzZSBmcm9udG1hdHRlciAoc2ltcGxlIGtleTogdmFsdWUgcGFyc2luZylcbiAgICAgIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZyb250bWF0dGVyLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14oXFx3Kyk6XFxzKiguKikkLyk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIG1ldGFbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogbWV0YS5pZCB8fCBwYXRoLmJhc2VuYW1lKHNraWxsUGF0aCksXG4gICAgICAgIG5hbWU6IG1ldGEubmFtZSB8fCBwYXRoLmJhc2VuYW1lKHNraWxsUGF0aCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBtZXRhLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICB2ZXJzaW9uOiBtZXRhLnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgICAgcGF0aDogc2tpbGxQYXRoLFxuICAgICAgICBtYWluRmlsZTogU0tJTExfRklMRVxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFNraWxsKGlkOiBzdHJpbmcpOiBTa2lsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2tpbGxzLmdldChpZCk7XG4gIH1cblxuICBnZXRBbGxTa2lsbHMoKTogU2tpbGxbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5za2lsbHMudmFsdWVzKCkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0U2tpbGxDb250ZW50KGlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBza2lsbCA9IHRoaXMuc2tpbGxzLmdldChpZCk7XG4gICAgaWYgKCFza2lsbCkgcmV0dXJuIG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2tpbGxGaWxlID0gcGF0aC5qb2luKHNraWxsLnBhdGgsIFNLSUxMX0ZJTEUpO1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnJlYWRGaWxlKHNraWxsRmlsZSwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnN0YWxsU2tpbGwoc291cmNlOiBzdHJpbmcsIHNjb3BlOiAnZ2xvYmFsJyB8ICdwcm9qZWN0JyA9ICdwcm9qZWN0Jyk6IFByb21pc2U8U2tpbGw+IHtcbiAgICBjb25zdCB0YXJnZXREaXIgPSBzY29wZSA9PT0gJ2dsb2JhbCcgPyB0aGlzLnNraWxsc0RpciA6IHRoaXMucHJvamVjdFNraWxsc0RpcjtcbiAgICBjb25zdCBza2lsbElkID0gcGF0aC5iYXNlbmFtZShzb3VyY2UpLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsIHNraWxsSWQpO1xuXG4gICAgLy8gRm9yIG5vdywgd2UnbGwganVzdCBjb3B5IGZyb20gYSBsb2NhbCBwYXRoXG4gICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdvdWxkIHN1cHBvcnQgZ2l0IHJlcG9zLCBhcmNoaXZlcywgZXRjLlxuICAgIGF3YWl0IGZzLm1rZGlyKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgXG4gICAgLy8gQ29weSBkaXJlY3RvcnlcbiAgICBhd2FpdCB0aGlzLmNvcHlEaXIoc291cmNlLCB0YXJnZXRQYXRoKTtcbiAgICBcbiAgICAvLyBSZWxvYWQgc2tpbGxzXG4gICAgYXdhaXQgdGhpcy5sb2FkU2tpbGxzKCk7XG4gICAgXG4gICAgY29uc3Qgc2tpbGwgPSB0aGlzLnNraWxscy5nZXQoc2tpbGxJZCk7XG4gICAgaWYgKCFza2lsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBpbnN0YWxsZWQgc2tpbGwnKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNraWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RGlyKHNyYzogc3RyaW5nLCBkZXN0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5ta2RpcihkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihzcmMsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihzcmMsIGVudHJ5Lm5hbWUpO1xuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdCwgZW50cnkubmFtZSk7XG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29weURpcihzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmNQYXRoLCBkZXN0UGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdW5pbnN0YWxsU2tpbGwoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNraWxsID0gdGhpcy5za2lsbHMuZ2V0KGlkKTtcbiAgICBpZiAoIXNraWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBmcy5ybShza2lsbC5wYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgdGhpcy5za2lsbHMuZGVsZXRlKGlkKTtcbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,62 @@
1
+ import { BaseTool, ToolExecuteOptions } from './base';
2
+ interface AskUserQuestionParams {
3
+ questions: Array<{
4
+ question: string;
5
+ header: string;
6
+ options: Array<{
7
+ label: string;
8
+ description: string;
9
+ }>;
10
+ multiSelect?: boolean;
11
+ }>;
12
+ }
13
+ export declare class AskUserQuestionTool extends BaseTool<AskUserQuestionParams> {
14
+ name: string;
15
+ description: string;
16
+ parameters: {
17
+ type: string;
18
+ properties: {
19
+ questions: {
20
+ type: string;
21
+ description: string;
22
+ items: {
23
+ type: string;
24
+ properties: {
25
+ question: {
26
+ type: string;
27
+ description: string;
28
+ };
29
+ header: {
30
+ type: string;
31
+ description: string;
32
+ };
33
+ options: {
34
+ type: string;
35
+ description: string;
36
+ items: {
37
+ type: string;
38
+ properties: {
39
+ label: {
40
+ type: string;
41
+ description: string;
42
+ };
43
+ description: {
44
+ type: string;
45
+ description: string;
46
+ };
47
+ };
48
+ };
49
+ };
50
+ multiSelect: {
51
+ type: string;
52
+ description: string;
53
+ };
54
+ };
55
+ };
56
+ };
57
+ };
58
+ required: string[];
59
+ };
60
+ execute(params: AskUserQuestionParams, options?: ToolExecuteOptions): Promise<string>;
61
+ }
62
+ export {};
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AskUserQuestionTool = void 0;
4
+ const base_1 = require("./base");
5
+ class AskUserQuestionTool extends base_1.BaseTool {
6
+ name = 'ask_user_question';
7
+ description = 'Use this tool when you need to ask the user questions during execution to gather preferences, clarify instructions, or make decisions.';
8
+ parameters = {
9
+ type: 'object',
10
+ properties: {
11
+ questions: {
12
+ type: 'array',
13
+ description: 'Questions to ask the user (1-4 questions)',
14
+ items: {
15
+ type: 'object',
16
+ properties: {
17
+ question: {
18
+ type: 'string',
19
+ description: 'The complete question to ask'
20
+ },
21
+ header: {
22
+ type: 'string',
23
+ description: 'Very short label (max 12 chars)'
24
+ },
25
+ options: {
26
+ type: 'array',
27
+ description: 'Available choices (2-4 options)',
28
+ items: {
29
+ type: 'object',
30
+ properties: {
31
+ label: {
32
+ type: 'string',
33
+ description: 'Display text for this option'
34
+ },
35
+ description: {
36
+ type: 'string',
37
+ description: 'Explanation of this option'
38
+ }
39
+ }
40
+ }
41
+ },
42
+ multiSelect: {
43
+ type: 'boolean',
44
+ description: 'Allow multiple selections'
45
+ }
46
+ }
47
+ }
48
+ }
49
+ },
50
+ required: ['questions']
51
+ };
52
+ async execute(params, options) {
53
+ this.validateRequired(params, ['questions']);
54
+ if (params.questions.length === 0 || params.questions.length > 4) {
55
+ return 'Error: Must provide 1-4 questions';
56
+ }
57
+ // 返回需要用户回答的问题
58
+ // 在交互模式下,CLI会捕获这个并显示给用户
59
+ return JSON.stringify({
60
+ type: 'user_question',
61
+ questions: params.questions.map(q => ({
62
+ question: q.question,
63
+ header: q.header,
64
+ options: q.options,
65
+ multiSelect: q.multiSelect || false
66
+ }))
67
+ });
68
+ }
69
+ }
70
+ exports.AskUserQuestionTool = AskUserQuestionTool;
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLXVzZXItcXVlc3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvYXNrLXVzZXItcXVlc3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQXVFO0FBZ0J2RSxNQUFhLG1CQUFvQixTQUFRLGVBQStCO0lBQ3RFLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUMzQixXQUFXLEdBQUcsd0lBQXdJLENBQUM7SUFDdkosVUFBVSxHQUFHO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsV0FBVyxFQUFFLDJDQUEyQztnQkFDeEQsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixRQUFRLEVBQUU7NEJBQ1IsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLDhCQUE4Qjt5QkFDNUM7d0JBQ0QsTUFBTSxFQUFFOzRCQUNOLElBQUksRUFBRSxRQUFROzRCQUNkLFdBQVcsRUFBRSxpQ0FBaUM7eUJBQy9DO3dCQUNELE9BQU8sRUFBRTs0QkFDUCxJQUFJLEVBQUUsT0FBTzs0QkFDYixXQUFXLEVBQUUsaUNBQWlDOzRCQUM5QyxLQUFLLEVBQUU7Z0NBQ0wsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsVUFBVSxFQUFFO29DQUNWLEtBQUssRUFBRTt3Q0FDTCxJQUFJLEVBQUUsUUFBUTt3Q0FDZCxXQUFXLEVBQUUsOEJBQThCO3FDQUM1QztvQ0FDRCxXQUFXLEVBQUU7d0NBQ1gsSUFBSSxFQUFFLFFBQVE7d0NBQ2QsV0FBVyxFQUFFLDRCQUE0QjtxQ0FDMUM7aUNBQ0Y7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsV0FBVyxFQUFFOzRCQUNYLElBQUksRUFBRSxTQUFTOzRCQUNmLFdBQVcsRUFBRSwyQkFBMkI7eUJBQ3pDO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQztLQUN4QixDQUFDO0lBRUYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUE2QixFQUFFLE9BQTRCO1FBQ3ZFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRTdDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE9BQU8sbUNBQW1DLENBQUM7UUFDN0MsQ0FBQztRQUVELGNBQWM7UUFDZCx3QkFBd0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3BCLElBQUksRUFBRSxlQUFlO1lBQ3JCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO2dCQUNoQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87Z0JBQ2xCLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLEtBQUs7YUFDcEMsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkVELGtEQW1FQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VUb29sLCBUb29sRXhlY3V0ZU9wdGlvbnMsIGZvcm1hdFRvb2xFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbnRlcmZhY2UgQXNrVXNlclF1ZXN0aW9uUGFyYW1zIHtcbiAgcXVlc3Rpb25zOiBBcnJheTx7XG4gICAgcXVlc3Rpb246IHN0cmluZztcbiAgICBoZWFkZXI6IHN0cmluZztcbiAgICBvcHRpb25zOiBBcnJheTx7XG4gICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICB9PjtcbiAgICBtdWx0aVNlbGVjdD86IGJvb2xlYW47XG4gIH0+O1xufVxuXG5leHBvcnQgY2xhc3MgQXNrVXNlclF1ZXN0aW9uVG9vbCBleHRlbmRzIEJhc2VUb29sPEFza1VzZXJRdWVzdGlvblBhcmFtcz4ge1xuICBuYW1lID0gJ2Fza191c2VyX3F1ZXN0aW9uJztcbiAgZGVzY3JpcHRpb24gPSAnVXNlIHRoaXMgdG9vbCB3aGVuIHlvdSBuZWVkIHRvIGFzayB0aGUgdXNlciBxdWVzdGlvbnMgZHVyaW5nIGV4ZWN1dGlvbiB0byBnYXRoZXIgcHJlZmVyZW5jZXMsIGNsYXJpZnkgaW5zdHJ1Y3Rpb25zLCBvciBtYWtlIGRlY2lzaW9ucy4nO1xuICBwYXJhbWV0ZXJzID0ge1xuICAgIHR5cGU6ICdvYmplY3QnLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHF1ZXN0aW9uczoge1xuICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1F1ZXN0aW9ucyB0byBhc2sgdGhlIHVzZXIgKDEtNCBxdWVzdGlvbnMpJyxcbiAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBxdWVzdGlvbjoge1xuICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgY29tcGxldGUgcXVlc3Rpb24gdG8gYXNrJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcjoge1xuICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdWZXJ5IHNob3J0IGxhYmVsIChtYXggMTIgY2hhcnMpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBdmFpbGFibGUgY2hvaWNlcyAoMi00IG9wdGlvbnMpJyxcbiAgICAgICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBsYWJlbDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdEaXNwbGF5IHRleHQgZm9yIHRoaXMgb3B0aW9uJ1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0V4cGxhbmF0aW9uIG9mIHRoaXMgb3B0aW9uJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG11bHRpU2VsZWN0OiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb25zJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsncXVlc3Rpb25zJ11cbiAgfTtcblxuICBhc3luYyBleGVjdXRlKHBhcmFtczogQXNrVXNlclF1ZXN0aW9uUGFyYW1zLCBvcHRpb25zPzogVG9vbEV4ZWN1dGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLnZhbGlkYXRlUmVxdWlyZWQocGFyYW1zLCBbJ3F1ZXN0aW9ucyddKTtcblxuICAgIGlmIChwYXJhbXMucXVlc3Rpb25zLmxlbmd0aCA9PT0gMCB8fCBwYXJhbXMucXVlc3Rpb25zLmxlbmd0aCA+IDQpIHtcbiAgICAgIHJldHVybiAnRXJyb3I6IE11c3QgcHJvdmlkZSAxLTQgcXVlc3Rpb25zJztcbiAgICB9XG5cbiAgICAvLyDov5Tlm57pnIDopoHnlKjmiLflm57nrZTnmoTpl67pophcbiAgICAvLyDlnKjkuqTkupLmqKHlvI/kuIvvvIxDTEnkvJrmjZXojrfov5nkuKrlubbmmL7npLrnu5nnlKjmiLdcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdHlwZTogJ3VzZXJfcXVlc3Rpb24nLFxuICAgICAgcXVlc3Rpb25zOiBwYXJhbXMucXVlc3Rpb25zLm1hcChxID0+ICh7XG4gICAgICAgIHF1ZXN0aW9uOiBxLnF1ZXN0aW9uLFxuICAgICAgICBoZWFkZXI6IHEuaGVhZGVyLFxuICAgICAgICBvcHRpb25zOiBxLm9wdGlvbnMsXG4gICAgICAgIG11bHRpU2VsZWN0OiBxLm11bHRpU2VsZWN0IHx8IGZhbHNlXG4gICAgICB9KSlcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,16 @@
1
+ import { ToolDefinition, ToolResult } from '../types';
2
+ export interface ToolExecuteOptions {
3
+ workingDirectory?: string;
4
+ timeout?: number;
5
+ sandbox?: boolean;
6
+ }
7
+ export declare abstract class BaseTool<TParams = Record<string, unknown>> {
8
+ abstract readonly name: string;
9
+ abstract readonly description: string;
10
+ abstract readonly parameters: Record<string, unknown>;
11
+ getDefinition(): ToolDefinition;
12
+ abstract execute(params: TParams, options?: ToolExecuteOptions): Promise<string>;
13
+ protected validateRequired(params: TParams, required: string[]): void;
14
+ }
15
+ export declare function createToolResult(toolCallId: string, content: string, isError?: boolean): ToolResult;
16
+ export declare function formatToolError(error: unknown): string;