@relayflows/core 0.0.1 → 1.0.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/dist/agent-handle.d.ts +27 -0
- package/dist/agent-handle.d.ts.map +1 -0
- package/dist/agent-handle.js +32 -0
- package/dist/agent-handle.js.map +1 -0
- package/dist/api-executor.d.ts +16 -0
- package/dist/api-executor.d.ts.map +1 -0
- package/dist/api-executor.js +94 -0
- package/dist/api-executor.js.map +1 -0
- package/dist/barrier.d.ts +72 -0
- package/dist/barrier.d.ts.map +1 -0
- package/dist/barrier.js +162 -0
- package/dist/barrier.js.map +1 -0
- package/dist/budget-tracker.d.ts +75 -0
- package/dist/budget-tracker.d.ts.map +1 -0
- package/dist/budget-tracker.js +184 -0
- package/dist/budget-tracker.js.map +1 -0
- package/dist/builder.d.ts +229 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +430 -0
- package/dist/builder.js.map +1 -0
- package/dist/builtin-templates/bug-fix.yaml +139 -0
- package/dist/builtin-templates/code-review.yaml +137 -0
- package/dist/builtin-templates/competitive.yaml +107 -0
- package/dist/builtin-templates/documentation.yaml +128 -0
- package/dist/builtin-templates/feature-dev.yaml +146 -0
- package/dist/builtin-templates/refactor.yaml +145 -0
- package/dist/builtin-templates/review-loop.yaml +227 -0
- package/dist/builtin-templates/security-audit.yaml +139 -0
- package/dist/channel-messenger.d.ts +28 -0
- package/dist/channel-messenger.d.ts.map +1 -0
- package/dist/channel-messenger.js +275 -0
- package/dist/channel-messenger.js.map +1 -0
- package/dist/cli-registry.d.ts +77 -0
- package/dist/cli-registry.d.ts.map +1 -0
- package/dist/cli-registry.js +268 -0
- package/dist/cli-registry.js.map +1 -0
- package/dist/cli-session-collector.d.ts +39 -0
- package/dist/cli-session-collector.d.ts.map +1 -0
- package/dist/cli-session-collector.js +23 -0
- package/dist/cli-session-collector.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +395 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-runner.d.ts +15 -0
- package/dist/cloud-runner.d.ts.map +1 -0
- package/dist/cloud-runner.js +41 -0
- package/dist/cloud-runner.js.map +1 -0
- package/dist/cloud-schedules.d.ts +3 -0
- package/dist/cloud-schedules.d.ts.map +1 -0
- package/dist/cloud-schedules.js +2 -0
- package/dist/cloud-schedules.js.map +1 -0
- package/dist/collectors/claude.d.ts +6 -0
- package/dist/collectors/claude.d.ts.map +1 -0
- package/dist/collectors/claude.js +330 -0
- package/dist/collectors/claude.js.map +1 -0
- package/dist/collectors/codex.d.ts +18 -0
- package/dist/collectors/codex.d.ts.map +1 -0
- package/dist/collectors/codex.js +265 -0
- package/dist/collectors/codex.js.map +1 -0
- package/dist/collectors/opencode.d.ts +6 -0
- package/dist/collectors/opencode.d.ts.map +1 -0
- package/dist/collectors/opencode.js +204 -0
- package/dist/collectors/opencode.js.map +1 -0
- package/dist/coordinator.d.ts +73 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +647 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/custom-steps.d.ts +73 -0
- package/dist/custom-steps.d.ts.map +1 -0
- package/dist/custom-steps.js +321 -0
- package/dist/custom-steps.js.map +1 -0
- package/dist/default-logger.d.ts +9 -0
- package/dist/default-logger.d.ts.map +1 -0
- package/dist/default-logger.js +104 -0
- package/dist/default-logger.js.map +1 -0
- package/dist/dry-run-format.d.ts +6 -0
- package/dist/dry-run-format.d.ts.map +1 -0
- package/dist/dry-run-format.js +76 -0
- package/dist/dry-run-format.js.map +1 -0
- package/dist/file-db.d.ts +85 -0
- package/dist/file-db.d.ts.map +1 -0
- package/dist/file-db.js +215 -0
- package/dist/file-db.js.map +1 -0
- package/dist/index.d.ts +37 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -3
- package/dist/index.js.map +1 -0
- package/dist/integrations/browser.d.ts +99 -0
- package/dist/integrations/browser.d.ts.map +1 -0
- package/dist/integrations/browser.js +419 -0
- package/dist/integrations/browser.js.map +1 -0
- package/dist/integrations/github.d.ts +79 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +459 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/slack.d.ts +80 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +355 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/listr-renderer.d.ts +26 -0
- package/dist/listr-renderer.d.ts.map +1 -0
- package/dist/listr-renderer.js +230 -0
- package/dist/listr-renderer.js.map +1 -0
- package/dist/memory-db.d.ts +17 -0
- package/dist/memory-db.d.ts.map +1 -0
- package/dist/memory-db.js +33 -0
- package/dist/memory-db.js.map +1 -0
- package/dist/process-backend-executor.d.ts +18 -0
- package/dist/process-backend-executor.d.ts.map +1 -0
- package/dist/process-backend-executor.js +74 -0
- package/dist/process-backend-executor.js.map +1 -0
- package/dist/process-spawner.d.ts +35 -0
- package/dist/process-spawner.d.ts.map +1 -0
- package/dist/process-spawner.js +173 -0
- package/dist/process-spawner.js.map +1 -0
- package/dist/provisioner.d.ts +64 -0
- package/dist/provisioner.d.ts.map +1 -0
- package/dist/provisioner.js +269 -0
- package/dist/provisioner.js.map +1 -0
- package/dist/proxy-env.d.ts +52 -0
- package/dist/proxy-env.d.ts.map +1 -0
- package/dist/proxy-env.js +92 -0
- package/dist/proxy-env.js.map +1 -0
- package/dist/run-script.d.ts +82 -0
- package/dist/run-script.d.ts.map +1 -0
- package/dist/run-script.js +527 -0
- package/dist/run-script.js.map +1 -0
- package/dist/run-summary-table.d.ts +5 -0
- package/dist/run-summary-table.d.ts.map +1 -0
- package/dist/run-summary-table.js +132 -0
- package/dist/run-summary-table.js.map +1 -0
- package/dist/run.d.ts +45 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +37 -0
- package/dist/run.js.map +1 -0
- package/dist/runner.d.ts +528 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +6269 -0
- package/dist/runner.js.map +1 -0
- package/dist/schema.d.ts +275 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +27 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.json +940 -0
- package/dist/sibling-links.d.ts +100 -0
- package/dist/sibling-links.d.ts.map +1 -0
- package/dist/sibling-links.js +205 -0
- package/dist/sibling-links.js.map +1 -0
- package/dist/state.d.ts +77 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +140 -0
- package/dist/state.js.map +1 -0
- package/dist/step-executor.d.ts +95 -0
- package/dist/step-executor.d.ts.map +1 -0
- package/dist/step-executor.js +393 -0
- package/dist/step-executor.js.map +1 -0
- package/dist/template-resolver.d.ts +33 -0
- package/dist/template-resolver.d.ts.map +1 -0
- package/dist/template-resolver.js +144 -0
- package/dist/template-resolver.js.map +1 -0
- package/dist/templates.d.ts +47 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +405 -0
- package/dist/templates.js.map +1 -0
- package/dist/trajectory.d.ts +87 -0
- package/dist/trajectory.d.ts.map +1 -0
- package/dist/trajectory.js +412 -0
- package/dist/trajectory.js.map +1 -0
- package/dist/types.d.ts +471 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +11 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +186 -0
- package/dist/validator.js.map +1 -0
- package/dist/verification.d.ts +53 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +238 -0
- package/dist/verification.js.map +1 -0
- package/package.json +12 -8
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic local runner for `.ts` / `.tsx` / `.py` workflow scripts.
|
|
3
|
+
*
|
|
4
|
+
* This is the body of the `agent-relay run <script>` command extracted into
|
|
5
|
+
* the SDK so other tools (e.g. `ricky run`) can drive the same execution
|
|
6
|
+
* flow without shelling out to the `agent-relay` binary.
|
|
7
|
+
*
|
|
8
|
+
* Behavior is preserved exactly — the relay CLI's `run` command now
|
|
9
|
+
* delegates to `runScriptWorkflow()` with no semantic change.
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import { execFileSync, spawn as spawnProcess, spawnSync } from 'node:child_process';
|
|
14
|
+
// ── Diagnostics ──────────────────────────────────────────────────────────────
|
|
15
|
+
function diag(msg) {
|
|
16
|
+
try {
|
|
17
|
+
process.stderr.write(`[agent-relay] ${msg}\n`);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
try {
|
|
21
|
+
process.stdout.write(`[agent-relay] ${msg}\n`);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Both streams closed — silently give up. Never throw from diag().
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ── Local SDK workspace detection ────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Walk upward from `startDir` looking for a workspace where the root
|
|
31
|
+
* `package.json` is `agent-relay` and `packages/sdk/package.json` is
|
|
32
|
+
* `@agent-relay/sdk`. Returns the matched paths or `null`.
|
|
33
|
+
*/
|
|
34
|
+
export function findLocalSdkWorkspace(startDir) {
|
|
35
|
+
let current = path.resolve(startDir);
|
|
36
|
+
const root = path.parse(current).root;
|
|
37
|
+
while (true) {
|
|
38
|
+
const packageJsonPath = path.join(current, 'package.json');
|
|
39
|
+
const sdkDir = path.join(current, 'packages', 'sdk');
|
|
40
|
+
const sdkPackageJsonPath = path.join(sdkDir, 'package.json');
|
|
41
|
+
try {
|
|
42
|
+
if (fs.existsSync(packageJsonPath) && fs.existsSync(sdkPackageJsonPath)) {
|
|
43
|
+
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
44
|
+
const sdkPkg = JSON.parse(fs.readFileSync(sdkPackageJsonPath, 'utf8'));
|
|
45
|
+
if (pkg.name === 'agent-relay' && sdkPkg.name === '@agent-relay/sdk') {
|
|
46
|
+
return { rootDir: current, sdkDir };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Ignore parse/read errors and continue walking upward.
|
|
52
|
+
}
|
|
53
|
+
if (current === root)
|
|
54
|
+
return null;
|
|
55
|
+
current = path.dirname(current);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* When running inside the relay monorepo, ensure `packages/sdk/dist/workflows`
|
|
60
|
+
* is built so the script can resolve `@relayflows/core`. No-op
|
|
61
|
+
* outside the monorepo or when the build is already present.
|
|
62
|
+
*/
|
|
63
|
+
export function ensureLocalSdkWorkflowRuntime(startDir, execRunner = execFileSync) {
|
|
64
|
+
const workspace = findLocalSdkWorkspace(startDir);
|
|
65
|
+
if (!workspace)
|
|
66
|
+
return;
|
|
67
|
+
const workflowsEntry = path.join(workspace.sdkDir, 'dist', 'workflows', 'index.js');
|
|
68
|
+
if (fs.existsSync(workflowsEntry))
|
|
69
|
+
return;
|
|
70
|
+
console.log('[agent-relay] Detected local @agent-relay/sdk workspace without built workflows runtime; building SDK workflow dependencies...');
|
|
71
|
+
const buildCommands = [
|
|
72
|
+
['run', 'build:config'],
|
|
73
|
+
['--prefix', 'packages/workflow-types', 'run', 'build'],
|
|
74
|
+
['--prefix', 'packages/github-primitive', 'run', 'build'],
|
|
75
|
+
['--prefix', 'packages/slack-primitive', 'run', 'build'],
|
|
76
|
+
['--prefix', 'packages/cloud', 'run', 'build'],
|
|
77
|
+
['run', 'build:sdk'],
|
|
78
|
+
];
|
|
79
|
+
for (const args of buildCommands) {
|
|
80
|
+
execRunner('npm', args, {
|
|
81
|
+
cwd: workspace.rootDir,
|
|
82
|
+
stdio: 'inherit',
|
|
83
|
+
env: process.env,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (!fs.existsSync(workflowsEntry)) {
|
|
87
|
+
throw new Error(`Local SDK workflows runtime is still missing after build: ${workflowsEntry}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// ── Workflow parse error normalization ───────────────────────────────────────
|
|
91
|
+
/**
|
|
92
|
+
* Parse tsx's stderr for the esbuild parse-error fingerprint and extract a
|
|
93
|
+
* normalized {@link ParsedWorkflowError}. Returns null if nothing looks like
|
|
94
|
+
* a parse error — runtime errors, module-not-found, etc. pass through.
|
|
95
|
+
*
|
|
96
|
+
* We match two common esbuild output formats:
|
|
97
|
+
* 1. `/path/file.ts:LINE:COL: ERROR: message` (most common, one-liner)
|
|
98
|
+
* 2. `✘ [ERROR] message\n\n /path/file.ts:LINE:COL:\n LINE │ text\n ╵ pointer`
|
|
99
|
+
* (pretty-printed, multi-line)
|
|
100
|
+
*/
|
|
101
|
+
export function parseTsxStderr(stderr) {
|
|
102
|
+
// Strip ANSI color codes so our regex isn't thrown off by escape sequences.
|
|
103
|
+
// eslint-disable-next-line no-control-regex
|
|
104
|
+
const clean = stderr.replace(/\x1b\[[0-9;]*m/g, '');
|
|
105
|
+
// Format 1: file:line:col: ERROR: message
|
|
106
|
+
const inlineMatch = clean.match(/(\/[^\s:]+\.(?:ts|tsx|mts|cts)):(\d+):(\d+):\s*ERROR:\s*([^\n]+)/);
|
|
107
|
+
if (inlineMatch) {
|
|
108
|
+
return {
|
|
109
|
+
file: inlineMatch[1],
|
|
110
|
+
line: Number(inlineMatch[2]),
|
|
111
|
+
column: Number(inlineMatch[3]),
|
|
112
|
+
message: inlineMatch[4].trim(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Format 2: ✘ [ERROR] message ... file:line:col:
|
|
116
|
+
const prettyError = clean.match(/✘\s*\[ERROR\]\s*([^\n]+)/);
|
|
117
|
+
if (prettyError) {
|
|
118
|
+
const locationMatch = clean.match(/(\/[^\s:]+\.(?:ts|tsx|mts|cts)):(\d+):(\d+):/);
|
|
119
|
+
if (locationMatch) {
|
|
120
|
+
return {
|
|
121
|
+
file: locationMatch[1],
|
|
122
|
+
line: Number(locationMatch[2]),
|
|
123
|
+
column: Number(locationMatch[3]),
|
|
124
|
+
message: prettyError[1].trim(),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Format 3: "Transform failed with N errors" — loose fallback, any file+loc pair
|
|
129
|
+
if (/Transform failed with \d+ error/i.test(clean) || /TransformError/.test(clean)) {
|
|
130
|
+
const looseMatch = clean.match(/(\/[^\s:]+\.(?:ts|tsx|mts|cts)):(\d+):(\d+)/);
|
|
131
|
+
if (looseMatch) {
|
|
132
|
+
return {
|
|
133
|
+
file: looseMatch[1],
|
|
134
|
+
line: Number(looseMatch[2]),
|
|
135
|
+
column: Number(looseMatch[3]),
|
|
136
|
+
message: 'TypeScript parse error (see tsx output above)',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
function resolveLocalTypeScriptImport(fromFile, specifier) {
|
|
143
|
+
if (!specifier.startsWith('.') && !specifier.startsWith('/')) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
const basePath = specifier.startsWith('/')
|
|
147
|
+
? path.resolve(specifier)
|
|
148
|
+
: path.resolve(path.dirname(fromFile), specifier);
|
|
149
|
+
const ext = path.extname(basePath);
|
|
150
|
+
const candidates = ext === '.js' || ext === '.mjs' || ext === '.cjs'
|
|
151
|
+
? [
|
|
152
|
+
`${basePath.slice(0, -ext.length)}.ts`,
|
|
153
|
+
`${basePath.slice(0, -ext.length)}.tsx`,
|
|
154
|
+
`${basePath.slice(0, -ext.length)}.mts`,
|
|
155
|
+
`${basePath.slice(0, -ext.length)}.cts`,
|
|
156
|
+
basePath,
|
|
157
|
+
]
|
|
158
|
+
: ext
|
|
159
|
+
? [basePath]
|
|
160
|
+
: [
|
|
161
|
+
`${basePath}.ts`,
|
|
162
|
+
`${basePath}.tsx`,
|
|
163
|
+
`${basePath}.mts`,
|
|
164
|
+
`${basePath}.cts`,
|
|
165
|
+
path.join(basePath, 'index.ts'),
|
|
166
|
+
path.join(basePath, 'index.tsx'),
|
|
167
|
+
path.join(basePath, 'index.mts'),
|
|
168
|
+
path.join(basePath, 'index.cts'),
|
|
169
|
+
];
|
|
170
|
+
for (const candidate of candidates) {
|
|
171
|
+
if (/\.(?:ts|tsx|mts|cts)$/.test(candidate) && fs.existsSync(candidate)) {
|
|
172
|
+
return candidate;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
function findStaticLocalTypeScriptImports(filePath, source) {
|
|
178
|
+
const imports = [];
|
|
179
|
+
const staticImportPattern = /(?:^|[\n;])\s*(?:import\s+(?:type\s+)?(?:[^'"]*?\s+from\s+)?|export\s+(?:type\s+)?[^'"]*?\s+from\s+)['"]([^'"]+)['"]/g;
|
|
180
|
+
for (const match of source.matchAll(staticImportPattern)) {
|
|
181
|
+
const resolved = resolveLocalTypeScriptImport(filePath, match[1]);
|
|
182
|
+
if (resolved) {
|
|
183
|
+
imports.push(resolved);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return imports;
|
|
187
|
+
}
|
|
188
|
+
export function shouldSkipNodeStripTypesPreflight(filePath, seen = new Set(), isEntry = true) {
|
|
189
|
+
const resolvedPath = path.resolve(filePath);
|
|
190
|
+
if (seen.has(resolvedPath)) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
seen.add(resolvedPath);
|
|
194
|
+
let source;
|
|
195
|
+
try {
|
|
196
|
+
source = fs.readFileSync(resolvedPath, 'utf8');
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return !isEntry;
|
|
200
|
+
}
|
|
201
|
+
// Node's strip-only runner cannot parse TypeScript constructs that require
|
|
202
|
+
// code generation. Detecting them before execution lets valid workflows go
|
|
203
|
+
// straight to tsx without retrying after user code may have already run.
|
|
204
|
+
if (containsNodeStripTypesUnsupportedSyntax(source)) {
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
return findStaticLocalTypeScriptImports(resolvedPath, source).some((importPath) => shouldSkipNodeStripTypesPreflight(importPath, seen, false));
|
|
208
|
+
}
|
|
209
|
+
function stripCommentsAndStringsForSyntaxScan(source) {
|
|
210
|
+
let output = '';
|
|
211
|
+
for (let index = 0; index < source.length; index += 1) {
|
|
212
|
+
const char = source[index];
|
|
213
|
+
const next = source[index + 1];
|
|
214
|
+
if (char === '/' && next === '/') {
|
|
215
|
+
output += ' ';
|
|
216
|
+
index += 1;
|
|
217
|
+
while (index + 1 < source.length && source[index + 1] !== '\n') {
|
|
218
|
+
output += ' ';
|
|
219
|
+
index += 1;
|
|
220
|
+
}
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (char === '/' && next === '*') {
|
|
224
|
+
output += ' ';
|
|
225
|
+
index += 1;
|
|
226
|
+
while (index + 1 < source.length) {
|
|
227
|
+
index += 1;
|
|
228
|
+
const current = source[index];
|
|
229
|
+
output += current === '\n' ? '\n' : ' ';
|
|
230
|
+
if (current === '*' && source[index + 1] === '/') {
|
|
231
|
+
output += ' ';
|
|
232
|
+
index += 1;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (char === '"' || char === "'" || char === '`') {
|
|
239
|
+
const quote = char;
|
|
240
|
+
output += ' ';
|
|
241
|
+
while (index + 1 < source.length) {
|
|
242
|
+
index += 1;
|
|
243
|
+
const current = source[index];
|
|
244
|
+
output += current === '\n' ? '\n' : ' ';
|
|
245
|
+
if (current === '\\') {
|
|
246
|
+
if (index + 1 < source.length) {
|
|
247
|
+
index += 1;
|
|
248
|
+
output += source[index] === '\n' ? '\n' : ' ';
|
|
249
|
+
}
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (current === quote) {
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
output += char;
|
|
259
|
+
}
|
|
260
|
+
return output;
|
|
261
|
+
}
|
|
262
|
+
function containsNodeStripTypesUnsupportedSyntax(source) {
|
|
263
|
+
const scanSource = stripCommentsAndStringsForSyntaxScan(source);
|
|
264
|
+
return (/(?:^|[;\n{}])\s*(?:export\s+)?(?:const\s+)?enum\s+[A-Za-z_$][\w$]*/.test(scanSource) ||
|
|
265
|
+
/(?:^|[;\n{}])\s*(?:export\s+)?(?:declare\s+)?(?:namespace|module)\s+[A-Za-z_$][\w$]*/.test(scanSource) ||
|
|
266
|
+
/\bconstructor\s*\([^)]*\b(?:public|private|protected|readonly)\s+(?:readonly\s+)?[A-Za-z_$][\w$]*/.test(scanSource) ||
|
|
267
|
+
/(?:^|[;\n{}])\s*import\s+[A-Za-z_$][\w$]*\s*=\s*(?:require\s*\(|[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)/.test(scanSource) ||
|
|
268
|
+
/(?:^|[;\n{}])\s*export\s*=\s*/.test(scanSource));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Format a {@link ParsedWorkflowError} as an actionable workflow-author error
|
|
272
|
+
* message with hints keyed off the most common mistakes in `command:` /
|
|
273
|
+
* `task:` template literals.
|
|
274
|
+
*/
|
|
275
|
+
export function formatWorkflowParseError(parsed) {
|
|
276
|
+
const where = parsed.line !== undefined
|
|
277
|
+
? `${parsed.file}:${parsed.line}${parsed.column !== undefined ? `:${parsed.column}` : ''}`
|
|
278
|
+
: parsed.file;
|
|
279
|
+
const hints = [];
|
|
280
|
+
const text = parsed.message;
|
|
281
|
+
if (/Expected "\}" but found/i.test(text) || /Unterminated template literal/i.test(text)) {
|
|
282
|
+
hints.push('Likely a JavaScript template literal metacharacter inside a `command:` or `task:` block. ' +
|
|
283
|
+
'Inside workflow .ts files every `command: \\`...\\`` is a JavaScript template literal — ' +
|
|
284
|
+
'backticks terminate it and `${...}` triggers JS interpolation before the shell ever sees the string.', 'Fixes: use single quotes instead of backticks in prose/commit messages; ' +
|
|
285
|
+
'for shell variables use `$VAR` (no braces) or escape as `\\${VAR}`; ' +
|
|
286
|
+
'never write literal `\\n` inside a shell comment (it becomes a real newline).');
|
|
287
|
+
}
|
|
288
|
+
if (/Unexpected "\$"/.test(text)) {
|
|
289
|
+
hints.push('Unexpected `$` inside a template literal usually means `${...}` was interpreted as JS interpolation. ' +
|
|
290
|
+
'Escape it as `\\${...}` or drop the braces and use plain `$VAR`.');
|
|
291
|
+
}
|
|
292
|
+
if (/Expected identifier/.test(text) && /template/i.test(text)) {
|
|
293
|
+
hints.push('A template literal interpolation `${...}` needs a valid JS expression inside. ' +
|
|
294
|
+
'If you meant a shell variable, escape the `$` or drop the braces.');
|
|
295
|
+
}
|
|
296
|
+
const lines = ['', `Workflow file failed to parse: ${where}`, ` ${text}`];
|
|
297
|
+
if (parsed.lineText) {
|
|
298
|
+
lines.push(` | ${parsed.lineText}`);
|
|
299
|
+
if (parsed.column !== undefined && parsed.column >= 0) {
|
|
300
|
+
lines.push(` | ${' '.repeat(parsed.column)}^`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (hints.length > 0) {
|
|
304
|
+
lines.push('');
|
|
305
|
+
for (const hint of hints) {
|
|
306
|
+
lines.push(`Hint: ${hint}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
lines.push('');
|
|
310
|
+
const wrapped = new Error(lines.join('\n'));
|
|
311
|
+
wrapped.code = 'WORKFLOW_PARSE_ERROR';
|
|
312
|
+
return wrapped;
|
|
313
|
+
}
|
|
314
|
+
// ── Spawn helper ─────────────────────────────────────────────────────────────
|
|
315
|
+
/**
|
|
316
|
+
* Spawn a TypeScript runner (tsx, ts-node, npx tsx) with stdin/stdout
|
|
317
|
+
* inherited and stderr tee'd to both the user's terminal and an internal
|
|
318
|
+
* buffer. The buffer is inspected on non-zero exit to produce actionable
|
|
319
|
+
* error messages for workflow parse errors.
|
|
320
|
+
*
|
|
321
|
+
* Why this instead of `spawnSync({ stdio: 'inherit' })`: sync + inherit makes
|
|
322
|
+
* it impossible to post-process stderr. Async + tee gives us the best of
|
|
323
|
+
* both worlds — live progress for the user AND captured stderr for the
|
|
324
|
+
* parse-error wrapper.
|
|
325
|
+
*/
|
|
326
|
+
async function spawnRunnerWithStderrCapture(command, args, env) {
|
|
327
|
+
return new Promise((resolve) => {
|
|
328
|
+
const child = spawnProcess(command, args, {
|
|
329
|
+
stdio: ['inherit', 'inherit', 'pipe'],
|
|
330
|
+
env,
|
|
331
|
+
});
|
|
332
|
+
let stderrBuf = '';
|
|
333
|
+
child.stderr?.on('data', (chunk) => {
|
|
334
|
+
const text = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
|
|
335
|
+
stderrBuf += text;
|
|
336
|
+
try {
|
|
337
|
+
process.stderr.write(text);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
// stderr closed — keep buffering for post-processing.
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
child.on('error', (err) => {
|
|
344
|
+
resolve({ status: null, stderr: stderrBuf, error: err });
|
|
345
|
+
});
|
|
346
|
+
child.on('close', (status) => {
|
|
347
|
+
resolve({ status, stderr: stderrBuf });
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
// ── Main entry ───────────────────────────────────────────────────────────────
|
|
352
|
+
/**
|
|
353
|
+
* Run a `.ts`, `.tsx`, or `.py` workflow script locally.
|
|
354
|
+
*
|
|
355
|
+
* For TypeScript files, tries Node's `--experimental-strip-types` first
|
|
356
|
+
* (Node 22.6+), then falls back to `tsx`, `ts-node`, and finally `npx tsx`.
|
|
357
|
+
* For Python files, tries `python3` then `python`.
|
|
358
|
+
*
|
|
359
|
+
* Throws on non-zero exit. The error message includes the run id (when
|
|
360
|
+
* the script wrote one to `AGENT_RELAY_RUN_ID_FILE`) so callers can resume
|
|
361
|
+
* with `--start-from <step> --previous-run-id <id>`.
|
|
362
|
+
*/
|
|
363
|
+
export async function runScriptWorkflow(filePath, options = {}) {
|
|
364
|
+
diag(`runScriptWorkflow: resolving ${filePath}`);
|
|
365
|
+
const resolved = path.resolve(filePath);
|
|
366
|
+
// Validate the extension before existence so an unsupported file type is
|
|
367
|
+
// reported as such even when the path does not exist — the file type is a
|
|
368
|
+
// caller mistake regardless of whether the file is present.
|
|
369
|
+
const ext = path.extname(resolved).toLowerCase();
|
|
370
|
+
if (ext !== '.ts' && ext !== '.tsx' && ext !== '.py') {
|
|
371
|
+
throw new Error(`Unsupported file type: ${ext}. Use .yaml, .yml, .ts, or .py`);
|
|
372
|
+
}
|
|
373
|
+
if (!fs.existsSync(resolved)) {
|
|
374
|
+
throw new Error(`File not found: ${resolved}`);
|
|
375
|
+
}
|
|
376
|
+
const runIdFile = path.join(process.cwd(), '.agent-relay', `script-run-id-${process.pid}-${Date.now()}.txt`);
|
|
377
|
+
try {
|
|
378
|
+
fs.mkdirSync(path.dirname(runIdFile), { recursive: true });
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
// Run-id hint is optional — don't abort if directory is not writable
|
|
382
|
+
}
|
|
383
|
+
const childEnv = { ...process.env, AGENT_RELAY_RUN_ID_FILE: runIdFile };
|
|
384
|
+
if (options.dryRun)
|
|
385
|
+
childEnv.DRY_RUN = 'true';
|
|
386
|
+
if (options.resume)
|
|
387
|
+
childEnv.RESUME_RUN_ID = options.resume;
|
|
388
|
+
if (options.startFrom)
|
|
389
|
+
childEnv.START_FROM = options.startFrom;
|
|
390
|
+
if (options.previousRunId)
|
|
391
|
+
childEnv.PREVIOUS_RUN_ID = options.previousRunId;
|
|
392
|
+
const augmentErrorWithRunId = (err) => {
|
|
393
|
+
try {
|
|
394
|
+
if (fs.existsSync(runIdFile)) {
|
|
395
|
+
const runId = fs.readFileSync(runIdFile, 'utf8').trim();
|
|
396
|
+
if (runId && typeof err?.message === 'string' && !err.message.includes('Run ID:')) {
|
|
397
|
+
err.message += `
|
|
398
|
+
Run ID: ${runId}`;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// Ignore run-id hint failures and preserve the original error.
|
|
404
|
+
}
|
|
405
|
+
finally {
|
|
406
|
+
try {
|
|
407
|
+
fs.rmSync(runIdFile, { force: true });
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
// Ignore cleanup failure.
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
throw err;
|
|
414
|
+
};
|
|
415
|
+
const cleanupRunIdFile = () => {
|
|
416
|
+
try {
|
|
417
|
+
fs.rmSync(runIdFile, { force: true });
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
/* ignore */
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
if (ext === '.ts' || ext === '.tsx') {
|
|
424
|
+
diag('runScriptWorkflow: ensureLocalSdkWorkflowRuntime start');
|
|
425
|
+
ensureLocalSdkWorkflowRuntime(path.dirname(resolved));
|
|
426
|
+
diag('runScriptWorkflow: ensureLocalSdkWorkflowRuntime done');
|
|
427
|
+
// Wrap a runner exit in an actionable workflow parse error if the
|
|
428
|
+
// captured stderr looks like esbuild tripped on a template literal.
|
|
429
|
+
// Otherwise fall through to a plain exit-code error (stderr was
|
|
430
|
+
// already live-streamed to the terminal).
|
|
431
|
+
const wrapRunnerError = (runner, result) => {
|
|
432
|
+
const parsed = parseTsxStderr(result.stderr);
|
|
433
|
+
if (parsed) {
|
|
434
|
+
return formatWorkflowParseError(parsed);
|
|
435
|
+
}
|
|
436
|
+
return new Error(`${runner} exited with code ${result.status}`);
|
|
437
|
+
};
|
|
438
|
+
// Prefer Node's built-in type stripping (Node 22.6+) — no extra deps,
|
|
439
|
+
// no tsx CJS resolver quirks walking node_modules. Falls through to
|
|
440
|
+
// tsx/ts-node on older Nodes (they exit non-zero with an unknown-flag
|
|
441
|
+
// error, not ENOENT, so we treat any non-zero from this runner as a
|
|
442
|
+
// "try the next runner" signal rather than a real user error).
|
|
443
|
+
const runners = [
|
|
444
|
+
{
|
|
445
|
+
label: 'node --experimental-strip-types',
|
|
446
|
+
bin: 'node',
|
|
447
|
+
preArgs: ['--experimental-strip-types', '--no-warnings=ExperimentalWarning'],
|
|
448
|
+
},
|
|
449
|
+
{ label: 'tsx', bin: 'tsx', preArgs: [] },
|
|
450
|
+
{ label: 'ts-node', bin: 'ts-node', preArgs: [] },
|
|
451
|
+
];
|
|
452
|
+
for (const { label, bin, preArgs } of runners) {
|
|
453
|
+
if (bin === 'node' && shouldSkipNodeStripTypesPreflight(resolved)) {
|
|
454
|
+
diag(`runScriptWorkflow: ${label} cannot parse this TypeScript file — trying next`);
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
diag(`runScriptWorkflow: trying runner ${label}`);
|
|
458
|
+
const result = await spawnRunnerWithStderrCapture(bin, [...preArgs, resolved], childEnv);
|
|
459
|
+
if (result.error) {
|
|
460
|
+
if (result.error.code === 'ENOENT') {
|
|
461
|
+
diag(`runScriptWorkflow: runner ${label} returned ENOENT — trying next`);
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
return augmentErrorWithRunId(result.error);
|
|
465
|
+
}
|
|
466
|
+
if (result.status !== 0) {
|
|
467
|
+
// Node exits with code 9 ("Invalid Argument") when it doesn't
|
|
468
|
+
// recognise --experimental-strip-types (Node <22.6). Other non-zero
|
|
469
|
+
// exits may have occurred after entry module evaluation, so do not
|
|
470
|
+
// retry them under another runner.
|
|
471
|
+
if (bin === 'node' && result.status === 9) {
|
|
472
|
+
diag(`runScriptWorkflow: runner ${label} cannot handle this TypeScript file — trying next`);
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
return augmentErrorWithRunId(wrapRunnerError(label, result));
|
|
476
|
+
}
|
|
477
|
+
diag(`runScriptWorkflow: runner ${label} completed exit=0`);
|
|
478
|
+
cleanupRunIdFile();
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
diag('runScriptWorkflow: falling back to npx tsx');
|
|
482
|
+
const npxResult = await spawnRunnerWithStderrCapture('npx', ['tsx', resolved], childEnv);
|
|
483
|
+
if (npxResult.error) {
|
|
484
|
+
return augmentErrorWithRunId(npxResult.error);
|
|
485
|
+
}
|
|
486
|
+
if (npxResult.status !== 0) {
|
|
487
|
+
return augmentErrorWithRunId(wrapRunnerError('npx tsx', npxResult));
|
|
488
|
+
}
|
|
489
|
+
diag('runScriptWorkflow: npx tsx completed');
|
|
490
|
+
cleanupRunIdFile();
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
if (ext === '.py') {
|
|
494
|
+
const runners = ['python3', 'python'];
|
|
495
|
+
for (const runner of runners) {
|
|
496
|
+
diag(`runScriptWorkflow: trying runner ${runner}`);
|
|
497
|
+
const spawnResult = spawnSync(runner, [resolved], {
|
|
498
|
+
stdio: 'inherit',
|
|
499
|
+
env: childEnv,
|
|
500
|
+
});
|
|
501
|
+
if (spawnResult.error) {
|
|
502
|
+
if (spawnResult.error.code === 'ENOENT') {
|
|
503
|
+
diag(`runScriptWorkflow: runner ${runner} returned ENOENT — trying next`);
|
|
504
|
+
continue;
|
|
505
|
+
}
|
|
506
|
+
return augmentErrorWithRunId(spawnResult.error);
|
|
507
|
+
}
|
|
508
|
+
if (spawnResult.status !== 0) {
|
|
509
|
+
const err = new Error(`${runner} exited with code ${spawnResult.status}`);
|
|
510
|
+
return augmentErrorWithRunId(err);
|
|
511
|
+
}
|
|
512
|
+
diag(`runScriptWorkflow: runner ${runner} completed exit=0`);
|
|
513
|
+
cleanupRunIdFile();
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
cleanupRunIdFile();
|
|
517
|
+
throw new Error('Python not found. Install Python 3.10+ to run .py workflow files.');
|
|
518
|
+
}
|
|
519
|
+
try {
|
|
520
|
+
fs.rmSync(runIdFile, { force: true });
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
// Ignore cleanup failure.
|
|
524
|
+
}
|
|
525
|
+
throw new Error(`Unsupported file type: ${ext}. Use .yaml, .yml, .ts, or .py`);
|
|
526
|
+
}
|
|
527
|
+
//# sourceMappingURL=run-script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-script.js","sourceRoot":"","sources":["../src/run-script.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CliSessionReport } from './cli-session-collector.js';
|
|
2
|
+
import type { RunSummaryBudgetData } from './budget-tracker.js';
|
|
3
|
+
import type { StepOutcome } from './trajectory.js';
|
|
4
|
+
export declare function formatRunSummaryTable(outcomes: StepOutcome[], reports: Map<string, CliSessionReport>, budgetData?: RunSummaryBudgetData): string;
|
|
5
|
+
//# sourceMappingURL=run-summary-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-summary-table.d.ts","sourceRoot":"","sources":["../src/run-summary-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAoB,MAAM,qBAAqB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAkDnD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACtC,UAAU,CAAC,EAAE,oBAAoB,GAChC,MAAM,CA+FR"}
|