@praveencs/agent 0.8.8 → 0.9.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 (61) hide show
  1. package/ROADMAP.md +3 -2
  2. package/dist/src/cli/commands/plugins.d.ts.map +1 -1
  3. package/dist/src/cli/commands/plugins.js +2 -0
  4. package/dist/src/cli/commands/plugins.js.map +1 -1
  5. package/dist/src/cli/commands/run.d.ts.map +1 -1
  6. package/dist/src/cli/commands/run.js +30 -3
  7. package/dist/src/cli/commands/run.js.map +1 -1
  8. package/dist/src/cli/commands/scripts-cmd.d.ts +3 -0
  9. package/dist/src/cli/commands/scripts-cmd.d.ts.map +1 -0
  10. package/dist/src/cli/commands/scripts-cmd.js +197 -0
  11. package/dist/src/cli/commands/scripts-cmd.js.map +1 -0
  12. package/dist/src/cli/index.d.ts.map +1 -1
  13. package/dist/src/cli/index.js +3 -1
  14. package/dist/src/cli/index.js.map +1 -1
  15. package/dist/src/cli/repl.d.ts.map +1 -1
  16. package/dist/src/cli/repl.js +14 -5
  17. package/dist/src/cli/repl.js.map +1 -1
  18. package/dist/src/cli/slash-commands.d.ts +2 -0
  19. package/dist/src/cli/slash-commands.d.ts.map +1 -1
  20. package/dist/src/cli/slash-commands.js +21 -0
  21. package/dist/src/cli/slash-commands.js.map +1 -1
  22. package/dist/src/cli/ui/render.d.ts +1 -0
  23. package/dist/src/cli/ui/render.d.ts.map +1 -1
  24. package/dist/src/cli/ui/render.js +2 -1
  25. package/dist/src/cli/ui/render.js.map +1 -1
  26. package/dist/src/config/defaults.d.ts.map +1 -1
  27. package/dist/src/config/defaults.js +3 -0
  28. package/dist/src/config/defaults.js.map +1 -1
  29. package/dist/src/config/schema.d.ts +13 -0
  30. package/dist/src/config/schema.d.ts.map +1 -1
  31. package/dist/src/config/schema.js +5 -0
  32. package/dist/src/config/schema.js.map +1 -1
  33. package/dist/src/index.d.ts +3 -0
  34. package/dist/src/index.d.ts.map +1 -1
  35. package/dist/src/index.js +2 -0
  36. package/dist/src/index.js.map +1 -1
  37. package/dist/src/llm/router.d.ts.map +1 -1
  38. package/dist/src/llm/router.js +31 -9
  39. package/dist/src/llm/router.js.map +1 -1
  40. package/dist/src/plugins/loader.d.ts +3 -2
  41. package/dist/src/plugins/loader.d.ts.map +1 -1
  42. package/dist/src/plugins/loader.js +14 -5
  43. package/dist/src/plugins/loader.js.map +1 -1
  44. package/dist/src/plugins/types.d.ts +4 -0
  45. package/dist/src/plugins/types.d.ts.map +1 -1
  46. package/dist/src/scripts/loader.d.ts +54 -0
  47. package/dist/src/scripts/loader.d.ts.map +1 -0
  48. package/dist/src/scripts/loader.js +269 -0
  49. package/dist/src/scripts/loader.js.map +1 -0
  50. package/dist/src/scripts/runner.d.ts +30 -0
  51. package/dist/src/scripts/runner.d.ts.map +1 -0
  52. package/dist/src/scripts/runner.js +169 -0
  53. package/dist/src/scripts/runner.js.map +1 -0
  54. package/dist/src/scripts/types.d.ts +134 -0
  55. package/dist/src/scripts/types.d.ts.map +1 -0
  56. package/dist/src/scripts/types.js +23 -0
  57. package/dist/src/scripts/types.js.map +1 -0
  58. package/dist/src/tools/registry.d.ts.map +1 -1
  59. package/dist/src/tools/registry.js +4 -1
  60. package/dist/src/tools/registry.js.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,269 @@
1
+ import { readFile, readdir, access } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { ScriptManifestSchema } from './types.js';
4
+ import { validateSchema } from '../utils/schema.js';
5
+ /**
6
+ * Script Loader — discovers, validates, and loads scripts
7
+ *
8
+ * Scripts are directories containing a `script.yaml` manifest and an
9
+ * entrypoint file (shell, Node, Python, etc.).
10
+ *
11
+ * Default location: `.agent/scripts/`
12
+ * Also loaded from plugins via `plugin.json` → `scripts` field.
13
+ */
14
+ export class ScriptLoader {
15
+ scripts = new Map();
16
+ /**
17
+ * Load scripts from all configured install paths
18
+ */
19
+ async loadAll(installPaths, projectRoot) {
20
+ this.scripts.clear();
21
+ for (const scriptPath of installPaths) {
22
+ const absPath = path.resolve(projectRoot, scriptPath);
23
+ await this.loadFromDirectory(absPath, 'project');
24
+ }
25
+ return Array.from(this.scripts.values());
26
+ }
27
+ /**
28
+ * Load scripts from the default project location (.agent/scripts/)
29
+ */
30
+ async loadProjectScripts(projectRoot) {
31
+ const scriptsDir = path.join(projectRoot, '.agent', 'scripts');
32
+ return this.loadFromDirectory(scriptsDir, 'project');
33
+ }
34
+ /**
35
+ * Load scripts from a directory
36
+ */
37
+ async loadFromDirectory(dirPath, source = 'project') {
38
+ try {
39
+ await access(dirPath);
40
+ }
41
+ catch {
42
+ return 0; // Directory doesn't exist
43
+ }
44
+ const entries = await readdir(dirPath, { withFileTypes: true });
45
+ let count = 0;
46
+ for (const entry of entries) {
47
+ if (!entry.isDirectory())
48
+ continue;
49
+ const scriptDir = path.join(dirPath, entry.name);
50
+ const script = await this.loadScript(scriptDir, source);
51
+ if (script) {
52
+ this.scripts.set(script.manifest.name, script);
53
+ count++;
54
+ }
55
+ }
56
+ return count;
57
+ }
58
+ /**
59
+ * Load a single script from its directory
60
+ */
61
+ async loadScript(scriptDir, source = 'project') {
62
+ // Try script.yaml first, then script.yml, then script.json
63
+ let manifestPath = null;
64
+ for (const filename of ['script.yaml', 'script.yml', 'script.json']) {
65
+ const candidate = path.join(scriptDir, filename);
66
+ try {
67
+ await access(candidate);
68
+ manifestPath = candidate;
69
+ break;
70
+ }
71
+ catch {
72
+ // Try next
73
+ }
74
+ }
75
+ if (!manifestPath) {
76
+ return null; // No manifest found
77
+ }
78
+ try {
79
+ const content = await readFile(manifestPath, 'utf-8');
80
+ let raw;
81
+ if (manifestPath.endsWith('.json')) {
82
+ raw = JSON.parse(content);
83
+ }
84
+ else {
85
+ // Simple YAML parser for flat structures
86
+ raw = this.parseSimpleYaml(content);
87
+ }
88
+ const result = validateSchema(ScriptManifestSchema, raw, `script manifest in ${path.basename(scriptDir)}`);
89
+ if (!result.success) {
90
+ console.error(`Invalid script manifest at ${manifestPath}:\n${result.errors.join('\n')}`);
91
+ return null;
92
+ }
93
+ const manifest = result.data;
94
+ const entrypointPath = path.resolve(scriptDir, manifest.entrypoint);
95
+ // Verify entrypoint exists
96
+ try {
97
+ await access(entrypointPath);
98
+ }
99
+ catch {
100
+ console.error(`Script entrypoint not found: ${entrypointPath}`);
101
+ return null;
102
+ }
103
+ return {
104
+ manifest,
105
+ path: scriptDir,
106
+ entrypointPath,
107
+ source,
108
+ };
109
+ }
110
+ catch (err) {
111
+ console.error(`Failed to load script from ${scriptDir}: ${err.message}`);
112
+ return null;
113
+ }
114
+ }
115
+ /**
116
+ * Simple YAML parser — handles flat key: value, arrays, and nested objects
117
+ */
118
+ parseSimpleYaml(content) {
119
+ const result = {};
120
+ const lines = content.split('\n');
121
+ let currentKey = null;
122
+ let currentObject = null;
123
+ let currentSubKey = null;
124
+ let currentSubObject = null;
125
+ for (const line of lines) {
126
+ // Skip comments and empty lines
127
+ if (line.trim().startsWith('#') || line.trim() === '')
128
+ continue;
129
+ if (line.trim() === '---')
130
+ continue;
131
+ const indent = line.length - line.trimStart().length;
132
+ if (indent === 0) {
133
+ // Top-level key
134
+ if (currentSubObject && currentSubKey && currentObject) {
135
+ currentObject[currentSubKey] = currentSubObject;
136
+ currentSubObject = null;
137
+ currentSubKey = null;
138
+ }
139
+ if (currentObject && currentKey) {
140
+ result[currentKey] = currentObject;
141
+ currentObject = null;
142
+ }
143
+ const colonIdx = line.indexOf(':');
144
+ if (colonIdx === -1)
145
+ continue;
146
+ const key = line.slice(0, colonIdx).trim();
147
+ const value = line.slice(colonIdx + 1).trim();
148
+ if (value === '') {
149
+ // Start of a nested object or array
150
+ currentKey = key;
151
+ currentObject = {};
152
+ }
153
+ else {
154
+ result[key] = this.parseYamlValue(value);
155
+ currentKey = null;
156
+ }
157
+ }
158
+ else if (indent >= 2 && indent < 4 && currentKey) {
159
+ // First-level nesting
160
+ if (currentSubObject && currentSubKey && currentObject) {
161
+ currentObject[currentSubKey] = currentSubObject;
162
+ currentSubObject = null;
163
+ currentSubKey = null;
164
+ }
165
+ const trimmed = line.trim();
166
+ // Array item
167
+ if (trimmed.startsWith('- ')) {
168
+ const item = trimmed.slice(2).trim();
169
+ if (!Array.isArray(currentObject)) {
170
+ if (currentKey)
171
+ result[currentKey] = [];
172
+ currentObject = null;
173
+ }
174
+ const arr = result[currentKey];
175
+ if (!Array.isArray(arr)) {
176
+ result[currentKey] = [this.parseYamlValue(item)];
177
+ }
178
+ else {
179
+ arr.push(this.parseYamlValue(item));
180
+ }
181
+ continue;
182
+ }
183
+ const colonIdx = trimmed.indexOf(':');
184
+ if (colonIdx === -1)
185
+ continue;
186
+ const subKey = trimmed.slice(0, colonIdx).trim();
187
+ const subValue = trimmed.slice(colonIdx + 1).trim();
188
+ if (!currentObject || Array.isArray(currentObject)) {
189
+ currentObject = {};
190
+ }
191
+ if (subValue === '') {
192
+ currentSubKey = subKey;
193
+ currentSubObject = {};
194
+ }
195
+ else {
196
+ currentObject[subKey] = this.parseYamlValue(subValue);
197
+ }
198
+ }
199
+ else if (indent >= 4 && currentSubKey && currentSubObject) {
200
+ // Second-level nesting
201
+ const trimmed = line.trim();
202
+ const colonIdx = trimmed.indexOf(':');
203
+ if (colonIdx === -1)
204
+ continue;
205
+ const deepKey = trimmed.slice(0, colonIdx).trim();
206
+ const deepValue = trimmed.slice(colonIdx + 1).trim();
207
+ currentSubObject[deepKey] = this.parseYamlValue(deepValue);
208
+ }
209
+ }
210
+ // Flush remaining
211
+ if (currentSubObject && currentSubKey && currentObject && !Array.isArray(currentObject)) {
212
+ currentObject[currentSubKey] = currentSubObject;
213
+ }
214
+ if (currentObject && currentKey && !Array.isArray(result[currentKey])) {
215
+ result[currentKey] = currentObject;
216
+ }
217
+ return result;
218
+ }
219
+ /**
220
+ * Parse a YAML scalar value
221
+ */
222
+ parseYamlValue(value) {
223
+ if (value === 'true')
224
+ return true;
225
+ if (value === 'false')
226
+ return false;
227
+ if (value === 'null' || value === '~')
228
+ return null;
229
+ // Number
230
+ if (/^-?\d+(\.\d+)?$/.test(value)) {
231
+ return Number(value);
232
+ }
233
+ // Inline array [item1, item2]
234
+ if (value.startsWith('[') && value.endsWith(']')) {
235
+ return value.slice(1, -1).split(',').map(s => s.trim()).filter(Boolean);
236
+ }
237
+ // Strip quotes
238
+ if ((value.startsWith('"') && value.endsWith('"')) ||
239
+ (value.startsWith("'") && value.endsWith("'"))) {
240
+ return value.slice(1, -1);
241
+ }
242
+ return value;
243
+ }
244
+ /**
245
+ * Get a loaded script by name
246
+ */
247
+ get(name) {
248
+ return this.scripts.get(name);
249
+ }
250
+ /**
251
+ * Check if a script exists
252
+ */
253
+ has(name) {
254
+ return this.scripts.has(name);
255
+ }
256
+ /**
257
+ * List all loaded scripts
258
+ */
259
+ list() {
260
+ return Array.from(this.scripts.values());
261
+ }
262
+ /**
263
+ * Get count of loaded scripts
264
+ */
265
+ get size() {
266
+ return this.scripts.size;
267
+ }
268
+ }
269
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/scripts/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { LoadedScript, ScriptRunResult } from './types.js';
2
+ /**
3
+ * Script Runner — executes scripts as child processes
4
+ *
5
+ * Features:
6
+ * - Auto-detects interpreter from file extension
7
+ * - Injects env vars and script args as SCRIPT_ARG_* env vars
8
+ * - Applies timeout from manifest
9
+ * - Streams stdout/stderr in real-time
10
+ * - Returns structured result with exit code
11
+ */
12
+ export declare class ScriptRunner {
13
+ /**
14
+ * Execute a loaded script with optional arguments
15
+ */
16
+ run(script: LoadedScript, args?: Record<string, string | boolean | number>, options?: {
17
+ projectRoot?: string;
18
+ onStdout?: (data: string) => void;
19
+ onStderr?: (data: string) => void;
20
+ }): Promise<ScriptRunResult>;
21
+ /**
22
+ * Determine the interpreter and args from the script's entrypoint extension
23
+ */
24
+ private resolveInterpreter;
25
+ /**
26
+ * Resolve args by merging provided values with defaults
27
+ */
28
+ private resolveArgs;
29
+ }
30
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/scripts/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAE9E;;;;;;;;;GASG;AACH,qBAAa,YAAY;IACrB;;OAEG;IACG,GAAG,CACL,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAM,EACpD,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAAO,GAC7G,OAAO,CAAC,eAAe,CAAC;IA6G3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmC1B;;OAEG;IACH,OAAO,CAAC,WAAW;CAuBtB"}
@@ -0,0 +1,169 @@
1
+ import { spawn } from 'node:child_process';
2
+ import path from 'node:path';
3
+ /**
4
+ * Script Runner — executes scripts as child processes
5
+ *
6
+ * Features:
7
+ * - Auto-detects interpreter from file extension
8
+ * - Injects env vars and script args as SCRIPT_ARG_* env vars
9
+ * - Applies timeout from manifest
10
+ * - Streams stdout/stderr in real-time
11
+ * - Returns structured result with exit code
12
+ */
13
+ export class ScriptRunner {
14
+ /**
15
+ * Execute a loaded script with optional arguments
16
+ */
17
+ async run(script, args = {}, options = {}) {
18
+ const start = Date.now();
19
+ const manifest = script.manifest;
20
+ // Validate required args
21
+ if (manifest.args) {
22
+ for (const [argName, argDef] of Object.entries(manifest.args)) {
23
+ if (argDef.required && !(argName in args) && argDef.default === undefined) {
24
+ return {
25
+ success: false,
26
+ exitCode: 1,
27
+ stdout: '',
28
+ stderr: `Missing required argument: ${argName} — ${argDef.description}`,
29
+ durationMs: Date.now() - start,
30
+ };
31
+ }
32
+ }
33
+ }
34
+ // Resolve working directory
35
+ const projectRoot = options.projectRoot ?? process.cwd();
36
+ const cwd = path.resolve(projectRoot, manifest.cwd ?? '.');
37
+ // Determine interpreter
38
+ const { command, commandArgs } = this.resolveInterpreter(script);
39
+ // Build environment variables
40
+ const env = {
41
+ ...process.env,
42
+ SCRIPT_NAME: manifest.name,
43
+ SCRIPT_DIR: script.path,
44
+ ...(manifest.env ?? {}),
45
+ };
46
+ // Inject args as SCRIPT_ARG_* env vars and as positional hints
47
+ const resolvedArgs = this.resolveArgs(manifest.args ?? {}, args);
48
+ for (const [key, value] of Object.entries(resolvedArgs)) {
49
+ env[`SCRIPT_ARG_${key.toUpperCase().replace(/-/g, '_')}`] = String(value);
50
+ }
51
+ return new Promise((resolve) => {
52
+ let stdout = '';
53
+ let stderr = '';
54
+ let timedOut = false;
55
+ const proc = spawn(command, commandArgs, {
56
+ cwd,
57
+ env,
58
+ stdio: ['inherit', 'pipe', 'pipe'],
59
+ shell: command === 'bash' || command === 'sh' || command === 'zsh',
60
+ });
61
+ // Timeout handling
62
+ const timeout = manifest.timeout ?? 300_000;
63
+ const timer = setTimeout(() => {
64
+ timedOut = true;
65
+ proc.kill('SIGTERM');
66
+ setTimeout(() => proc.kill('SIGKILL'), 5000);
67
+ }, timeout);
68
+ proc.stdout?.on('data', (data) => {
69
+ const text = data.toString();
70
+ stdout += text;
71
+ if (options.onStdout) {
72
+ options.onStdout(text);
73
+ }
74
+ else {
75
+ process.stdout.write(text);
76
+ }
77
+ });
78
+ proc.stderr?.on('data', (data) => {
79
+ const text = data.toString();
80
+ stderr += text;
81
+ if (options.onStderr) {
82
+ options.onStderr(text);
83
+ }
84
+ else {
85
+ process.stderr.write(text);
86
+ }
87
+ });
88
+ proc.on('close', (code) => {
89
+ clearTimeout(timer);
90
+ if (timedOut) {
91
+ stderr += `\nScript timed out after ${timeout}ms`;
92
+ }
93
+ resolve({
94
+ success: code === 0 && !timedOut,
95
+ exitCode: code ?? 1,
96
+ stdout: stdout.trim(),
97
+ stderr: stderr.trim(),
98
+ durationMs: Date.now() - start,
99
+ });
100
+ });
101
+ proc.on('error', (err) => {
102
+ clearTimeout(timer);
103
+ resolve({
104
+ success: false,
105
+ exitCode: 1,
106
+ stdout: '',
107
+ stderr: err.message,
108
+ durationMs: Date.now() - start,
109
+ });
110
+ });
111
+ });
112
+ }
113
+ /**
114
+ * Determine the interpreter and args from the script's entrypoint extension
115
+ */
116
+ resolveInterpreter(script) {
117
+ const { manifest, entrypointPath } = script;
118
+ if (manifest.interpreter) {
119
+ return {
120
+ command: manifest.interpreter,
121
+ commandArgs: [entrypointPath],
122
+ };
123
+ }
124
+ const ext = path.extname(entrypointPath).toLowerCase();
125
+ switch (ext) {
126
+ case '.sh':
127
+ case '.bash':
128
+ return { command: 'bash', commandArgs: [entrypointPath] };
129
+ case '.zsh':
130
+ return { command: 'zsh', commandArgs: [entrypointPath] };
131
+ case '.ts':
132
+ return { command: 'npx', commandArgs: ['tsx', entrypointPath] };
133
+ case '.mts':
134
+ return { command: 'npx', commandArgs: ['tsx', entrypointPath] };
135
+ case '.js':
136
+ case '.mjs':
137
+ return { command: 'node', commandArgs: [entrypointPath] };
138
+ case '.py':
139
+ return { command: 'python3', commandArgs: [entrypointPath] };
140
+ case '.rb':
141
+ return { command: 'ruby', commandArgs: [entrypointPath] };
142
+ default:
143
+ // Try to execute directly (must be executable)
144
+ return { command: entrypointPath, commandArgs: [] };
145
+ }
146
+ }
147
+ /**
148
+ * Resolve args by merging provided values with defaults
149
+ */
150
+ resolveArgs(argDefs, provided) {
151
+ const resolved = {};
152
+ for (const [name, def] of Object.entries(argDefs)) {
153
+ if (name in provided) {
154
+ resolved[name] = provided[name];
155
+ }
156
+ else if (def.default !== undefined) {
157
+ resolved[name] = def.default;
158
+ }
159
+ }
160
+ // Also pass through any extra args not in the manifest
161
+ for (const [name, value] of Object.entries(provided)) {
162
+ if (!(name in resolved)) {
163
+ resolved[name] = value;
164
+ }
165
+ }
166
+ return resolved;
167
+ }
168
+ }
169
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/scripts/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;;;;;GASG;AACH,MAAM,OAAO,YAAY;IACrB;;OAEG;IACH,KAAK,CAAC,GAAG,CACL,MAAoB,EACpB,OAAkD,EAAE,EACpD,UAA0G,EAAE;QAE5G,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,yBAAyB;QACzB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5D,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBACxE,OAAO;wBACH,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,CAAC;wBACX,MAAM,EAAE,EAAE;wBACV,MAAM,EAAE,8BAA8B,OAAO,MAAM,MAAM,CAAC,WAAW,EAAE;wBACvE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;qBACjC,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAE3D,wBAAwB;QACxB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAEjE,8BAA8B;QAC9B,MAAM,GAAG,GAA2B;YAChC,GAAG,OAAO,CAAC,GAA6B;YACxC,WAAW,EAAE,QAAQ,CAAC,IAAI;YAC1B,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;SAC1B,CAAC;QAEF,+DAA+D;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,cAAc,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,IAAI,OAAO,CAAkB,CAAC,OAAO,EAAE,EAAE;YAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE;gBACrC,GAAG;gBACH,GAAG;gBACH,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;gBAClC,KAAK,EAAE,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK;aACrE,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC;YAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,IAAI,CAAC;gBACf,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,IAAI,CAAC;gBACf,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;gBAEpB,IAAI,QAAQ,EAAE,CAAC;oBACX,MAAM,IAAI,4BAA4B,OAAO,IAAI,CAAC;gBACtD,CAAC;gBAED,OAAO,CAAC;oBACJ,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ;oBAChC,QAAQ,EAAE,IAAI,IAAI,CAAC;oBACnB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;iBACjC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC;oBACJ,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,CAAC;oBACX,MAAM,EAAE,EAAE;oBACV,MAAM,EAAE,GAAG,CAAC,OAAO;oBACnB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;iBACjC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAoB;QAC3C,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;QAE5C,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,OAAO;gBACH,OAAO,EAAE,QAAQ,CAAC,WAAW;gBAC7B,WAAW,EAAE,CAAC,cAAc,CAAC;aAChC,CAAC;QACN,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QAEvD,QAAQ,GAAG,EAAE,CAAC;YACV,KAAK,KAAK,CAAC;YACX,KAAK,OAAO;gBACR,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9D,KAAK,MAAM;gBACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7D,KAAK,KAAK;gBACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;YACpE,KAAK,MAAM;gBACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;YACpE,KAAK,KAAK,CAAC;YACX,KAAK,MAAM;gBACP,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9D,KAAK,KAAK;gBACN,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YACjE,KAAK,KAAK;gBACN,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9D;gBACI,+CAA+C;gBAC/C,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QAC5D,CAAC;IACL,CAAC;IAED;;OAEG;IACK,WAAW,CACf,OAAqC,EACrC,QAAmD;QAEnD,MAAM,QAAQ,GAA8C,EAAE,CAAC;QAE/D,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;YACjC,CAAC;QACL,CAAC;QAED,uDAAuD;QACvD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ"}
@@ -0,0 +1,134 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Script System — Types
4
+ *
5
+ * Scripts are repeatable, scriptable tasks — direct execution of shell/Node
6
+ * scripts without LLM involvement. They fill the gap between heavy Skills
7
+ * (LLM-driven) and lightweight Commands (markdown prompts).
8
+ *
9
+ * Scripts live in `.agent/scripts/` or inside plugins, defined via `script.yaml`.
10
+ */
11
+ export interface ScriptArgDef {
12
+ /** Human-readable description of the argument */
13
+ description: string;
14
+ /** Argument type: string, boolean, or number */
15
+ type?: 'string' | 'boolean' | 'number';
16
+ /** Default value if not provided */
17
+ default?: string | boolean | number;
18
+ /** Whether this argument is required */
19
+ required?: boolean;
20
+ }
21
+ export interface ScriptManifest {
22
+ /** Unique script name */
23
+ name: string;
24
+ /** Semver version */
25
+ version?: string;
26
+ /** Human-readable description */
27
+ description: string;
28
+ /** Author name */
29
+ author?: string;
30
+ /** The script file to execute (relative to script directory) */
31
+ entrypoint: string;
32
+ /** Interpreter override (auto-detected from extension if omitted) */
33
+ interpreter?: string;
34
+ /** Environment variables to inject */
35
+ env?: Record<string, string>;
36
+ /** Named arguments with definitions */
37
+ args?: Record<string, ScriptArgDef>;
38
+ /** Working directory relative to project root (default: '.') */
39
+ cwd?: string;
40
+ /** Timeout in ms (default: 300000 = 5 min) */
41
+ timeout?: number;
42
+ /** Whether to prompt for confirmation before execution */
43
+ confirm?: boolean;
44
+ /** Tags for discoverability */
45
+ tags?: string[];
46
+ }
47
+ export declare const ScriptManifestSchema: z.ZodObject<{
48
+ name: z.ZodString;
49
+ version: z.ZodOptional<z.ZodString>;
50
+ description: z.ZodString;
51
+ author: z.ZodOptional<z.ZodString>;
52
+ entrypoint: z.ZodString;
53
+ interpreter: z.ZodOptional<z.ZodString>;
54
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
55
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
56
+ description: z.ZodString;
57
+ type: z.ZodDefault<z.ZodEnum<["string", "boolean", "number"]>>;
58
+ default: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodBoolean, z.ZodNumber]>>;
59
+ required: z.ZodDefault<z.ZodBoolean>;
60
+ }, "strip", z.ZodTypeAny, {
61
+ type: "string" | "number" | "boolean";
62
+ required: boolean;
63
+ description: string;
64
+ default?: string | number | boolean | undefined;
65
+ }, {
66
+ description: string;
67
+ type?: "string" | "number" | "boolean" | undefined;
68
+ required?: boolean | undefined;
69
+ default?: string | number | boolean | undefined;
70
+ }>>>;
71
+ cwd: z.ZodDefault<z.ZodString>;
72
+ timeout: z.ZodDefault<z.ZodNumber>;
73
+ confirm: z.ZodDefault<z.ZodBoolean>;
74
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
75
+ }, "strip", z.ZodTypeAny, {
76
+ confirm: boolean;
77
+ timeout: number;
78
+ name: string;
79
+ cwd: string;
80
+ description: string;
81
+ entrypoint: string;
82
+ args?: Record<string, {
83
+ type: "string" | "number" | "boolean";
84
+ required: boolean;
85
+ description: string;
86
+ default?: string | number | boolean | undefined;
87
+ }> | undefined;
88
+ env?: Record<string, string> | undefined;
89
+ author?: string | undefined;
90
+ version?: string | undefined;
91
+ tags?: string[] | undefined;
92
+ interpreter?: string | undefined;
93
+ }, {
94
+ name: string;
95
+ description: string;
96
+ entrypoint: string;
97
+ confirm?: boolean | undefined;
98
+ timeout?: number | undefined;
99
+ cwd?: string | undefined;
100
+ args?: Record<string, {
101
+ description: string;
102
+ type?: "string" | "number" | "boolean" | undefined;
103
+ required?: boolean | undefined;
104
+ default?: string | number | boolean | undefined;
105
+ }> | undefined;
106
+ env?: Record<string, string> | undefined;
107
+ author?: string | undefined;
108
+ version?: string | undefined;
109
+ tags?: string[] | undefined;
110
+ interpreter?: string | undefined;
111
+ }>;
112
+ export interface LoadedScript {
113
+ /** Parsed manifest */
114
+ manifest: ScriptManifest;
115
+ /** Absolute path to the script directory */
116
+ path: string;
117
+ /** Absolute path to the entrypoint file */
118
+ entrypointPath: string;
119
+ /** Source: 'project' or plugin name */
120
+ source: string;
121
+ }
122
+ export interface ScriptRunResult {
123
+ /** Whether the script exited with code 0 */
124
+ success: boolean;
125
+ /** Process exit code */
126
+ exitCode: number;
127
+ /** Standard output */
128
+ stdout: string;
129
+ /** Standard error */
130
+ stderr: string;
131
+ /** Duration in milliseconds */
132
+ durationMs: number;
133
+ }
134
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scripts/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;GAQG;AAIH,MAAM,WAAW,YAAY;IACzB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACpC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAID,MAAM,WAAW,cAAc;IAC3B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,gEAAgE;IAChE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAWD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAa/B,CAAC;AAIH,MAAM,WAAW,YAAY;IACzB,sBAAsB;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,eAAe;IAC5B,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ // ─── Zod Schema for Validation ───
3
+ const ScriptArgDefSchema = z.object({
4
+ description: z.string(),
5
+ type: z.enum(['string', 'boolean', 'number']).default('string'),
6
+ default: z.union([z.string(), z.boolean(), z.number()]).optional(),
7
+ required: z.boolean().default(false),
8
+ });
9
+ export const ScriptManifestSchema = z.object({
10
+ name: z.string().min(1).regex(/^[a-z0-9][a-z0-9._-]*$/, 'Must be lowercase alphanumeric with dots, underscores, hyphens'),
11
+ version: z.string().optional(),
12
+ description: z.string().min(1),
13
+ author: z.string().optional(),
14
+ entrypoint: z.string().min(1),
15
+ interpreter: z.string().optional(),
16
+ env: z.record(z.string(), z.string()).optional(),
17
+ args: z.record(z.string(), ScriptArgDefSchema).optional(),
18
+ cwd: z.string().default('.'),
19
+ timeout: z.number().default(300_000),
20
+ confirm: z.boolean().default(false),
21
+ tags: z.array(z.string()).optional(),
22
+ });
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/scripts/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsDxB,oCAAoC;AAEpC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAwB,EAAE,gEAAgE,CAAC;IACzH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE;IACzD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC"}