@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.
- package/ROADMAP.md +3 -2
- package/dist/src/cli/commands/plugins.d.ts.map +1 -1
- package/dist/src/cli/commands/plugins.js +2 -0
- package/dist/src/cli/commands/plugins.js.map +1 -1
- package/dist/src/cli/commands/run.d.ts.map +1 -1
- package/dist/src/cli/commands/run.js +30 -3
- package/dist/src/cli/commands/run.js.map +1 -1
- package/dist/src/cli/commands/scripts-cmd.d.ts +3 -0
- package/dist/src/cli/commands/scripts-cmd.d.ts.map +1 -0
- package/dist/src/cli/commands/scripts-cmd.js +197 -0
- package/dist/src/cli/commands/scripts-cmd.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +3 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/repl.d.ts.map +1 -1
- package/dist/src/cli/repl.js +14 -5
- package/dist/src/cli/repl.js.map +1 -1
- package/dist/src/cli/slash-commands.d.ts +2 -0
- package/dist/src/cli/slash-commands.d.ts.map +1 -1
- package/dist/src/cli/slash-commands.js +21 -0
- package/dist/src/cli/slash-commands.js.map +1 -1
- package/dist/src/cli/ui/render.d.ts +1 -0
- package/dist/src/cli/ui/render.d.ts.map +1 -1
- package/dist/src/cli/ui/render.js +2 -1
- package/dist/src/cli/ui/render.js.map +1 -1
- package/dist/src/config/defaults.d.ts.map +1 -1
- package/dist/src/config/defaults.js +3 -0
- package/dist/src/config/defaults.js.map +1 -1
- package/dist/src/config/schema.d.ts +13 -0
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +5 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/llm/router.d.ts.map +1 -1
- package/dist/src/llm/router.js +31 -9
- package/dist/src/llm/router.js.map +1 -1
- package/dist/src/plugins/loader.d.ts +3 -2
- package/dist/src/plugins/loader.d.ts.map +1 -1
- package/dist/src/plugins/loader.js +14 -5
- package/dist/src/plugins/loader.js.map +1 -1
- package/dist/src/plugins/types.d.ts +4 -0
- package/dist/src/plugins/types.d.ts.map +1 -1
- package/dist/src/scripts/loader.d.ts +54 -0
- package/dist/src/scripts/loader.d.ts.map +1 -0
- package/dist/src/scripts/loader.js +269 -0
- package/dist/src/scripts/loader.js.map +1 -0
- package/dist/src/scripts/runner.d.ts +30 -0
- package/dist/src/scripts/runner.d.ts.map +1 -0
- package/dist/src/scripts/runner.js +169 -0
- package/dist/src/scripts/runner.js.map +1 -0
- package/dist/src/scripts/types.d.ts +134 -0
- package/dist/src/scripts/types.d.ts.map +1 -0
- package/dist/src/scripts/types.js +23 -0
- package/dist/src/scripts/types.js.map +1 -0
- package/dist/src/tools/registry.d.ts.map +1 -1
- package/dist/src/tools/registry.js +4 -1
- package/dist/src/tools/registry.js.map +1 -1
- 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":"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"}
|
|
@@ -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"}
|