@relayflows/core 0.0.1 → 1.0.1
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 +79 -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,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory implementation of WorkflowDb for local workflow runs.
|
|
3
|
+
* No persistence — state lives only for the duration of the process.
|
|
4
|
+
*/
|
|
5
|
+
export class InMemoryWorkflowDb {
|
|
6
|
+
runs = new Map();
|
|
7
|
+
steps = new Map();
|
|
8
|
+
async insertRun(run) {
|
|
9
|
+
this.runs.set(run.id, { ...run });
|
|
10
|
+
}
|
|
11
|
+
async updateRun(id, patch) {
|
|
12
|
+
const existing = this.runs.get(id);
|
|
13
|
+
if (!existing)
|
|
14
|
+
return;
|
|
15
|
+
this.runs.set(id, { ...existing, ...patch, updatedAt: new Date().toISOString() });
|
|
16
|
+
}
|
|
17
|
+
async getRun(id) {
|
|
18
|
+
return this.runs.get(id) ?? null;
|
|
19
|
+
}
|
|
20
|
+
async insertStep(step) {
|
|
21
|
+
this.steps.set(step.id, { ...step });
|
|
22
|
+
}
|
|
23
|
+
async updateStep(id, patch) {
|
|
24
|
+
const existing = this.steps.get(id);
|
|
25
|
+
if (!existing)
|
|
26
|
+
return;
|
|
27
|
+
this.steps.set(id, { ...existing, ...patch, updatedAt: new Date().toISOString() });
|
|
28
|
+
}
|
|
29
|
+
async getStepsByRunId(runId) {
|
|
30
|
+
return Array.from(this.steps.values()).filter((s) => s.runId === runId);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=memory-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../src/memory-db.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IACzC,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,KAAK,CAAC,SAAS,CAAC,GAAmB;QACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,KAA8B;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAqB;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,KAA+B;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC1E,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter that implements {@link RunnerStepExecutor} on top of a
|
|
3
|
+
* {@link ProcessBackend}. Relay owns command construction (CLI flags, env,
|
|
4
|
+
* cwd, timeout); the backend only provides "where to run" — create an
|
|
5
|
+
* isolated environment, exec the command, destroy.
|
|
6
|
+
*
|
|
7
|
+
* The WorkflowRunner synthesizes one of these when a caller passes
|
|
8
|
+
* `processBackend` without an explicit `executor`, so every existing
|
|
9
|
+
* `executor.executeAgentStep(...)` call site transparently flows through
|
|
10
|
+
* the backend (e.g. a cloud sandbox) without any further plumbing.
|
|
11
|
+
*/
|
|
12
|
+
import type { ProcessBackend, RunnerStepExecutor } from './types.js';
|
|
13
|
+
export interface ProcessBackendExecutorOptions {
|
|
14
|
+
/** Env vars injected into every step (e.g. auth tokens, relayfile config). */
|
|
15
|
+
env?: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export declare function createProcessBackendExecutor(backend: ProcessBackend, options?: ProcessBackendExecutorOptions): RunnerStepExecutor;
|
|
18
|
+
//# sourceMappingURL=process-backend-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-backend-executor.d.ts","sourceRoot":"","sources":["../src/process-backend-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAiC,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAYpG,MAAM,WAAW,6BAA6B;IAC5C,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,6BAAkC,GAC1C,kBAAkB,CAoEpB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter that implements {@link RunnerStepExecutor} on top of a
|
|
3
|
+
* {@link ProcessBackend}. Relay owns command construction (CLI flags, env,
|
|
4
|
+
* cwd, timeout); the backend only provides "where to run" — create an
|
|
5
|
+
* isolated environment, exec the command, destroy.
|
|
6
|
+
*
|
|
7
|
+
* The WorkflowRunner synthesizes one of these when a caller passes
|
|
8
|
+
* `processBackend` without an explicit `executor`, so every existing
|
|
9
|
+
* `executor.executeAgentStep(...)` call site transparently flows through
|
|
10
|
+
* the backend (e.g. a cloud sandbox) without any further plumbing.
|
|
11
|
+
*/
|
|
12
|
+
import { buildCommand } from './process-spawner.js';
|
|
13
|
+
function shellEscape(value) {
|
|
14
|
+
if (value === '')
|
|
15
|
+
return "''";
|
|
16
|
+
if (/^[A-Za-z0-9_\/.:,=+@%-]+$/.test(value))
|
|
17
|
+
return value;
|
|
18
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
19
|
+
}
|
|
20
|
+
function commandToShell(argv) {
|
|
21
|
+
return argv.map(shellEscape).join(' ');
|
|
22
|
+
}
|
|
23
|
+
export function createProcessBackendExecutor(backend, options = {}) {
|
|
24
|
+
const baseEnv = options.env ?? {};
|
|
25
|
+
return {
|
|
26
|
+
async executeAgentStep(step, agentDef, resolvedTask, timeoutMs) {
|
|
27
|
+
if (agentDef.cli === 'api') {
|
|
28
|
+
throw new Error(`processBackend cannot execute cli "api" agents — api agents call the Anthropic API directly. ` +
|
|
29
|
+
`Route agent "${agentDef.name}" through a subprocess CLI (claude, codex, etc.) or omit processBackend.`);
|
|
30
|
+
}
|
|
31
|
+
const extraArgs = agentDef.constraints?.model ? ['--model', agentDef.constraints.model] : [];
|
|
32
|
+
const argv = buildCommand(agentDef.cli, extraArgs, resolvedTask);
|
|
33
|
+
const commandString = commandToShell(argv);
|
|
34
|
+
const env = await backend.createEnvironment(step.name);
|
|
35
|
+
try {
|
|
36
|
+
const execOpts = {};
|
|
37
|
+
if (agentDef.cwd)
|
|
38
|
+
execOpts.cwd = agentDef.cwd;
|
|
39
|
+
if (Object.keys(baseEnv).length > 0)
|
|
40
|
+
execOpts.env = baseEnv;
|
|
41
|
+
// timeoutSeconds is ceil-rounded from the caller's timeoutMs; a 500ms
|
|
42
|
+
// timeout becomes 1s because the backend protocol uses seconds.
|
|
43
|
+
if (timeoutMs && timeoutMs > 0) {
|
|
44
|
+
execOpts.timeoutSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));
|
|
45
|
+
}
|
|
46
|
+
const result = await env.exec(commandString, execOpts);
|
|
47
|
+
if (result.exitCode !== 0) {
|
|
48
|
+
const tail = result.output.slice(-2000);
|
|
49
|
+
throw new Error(`Agent step "${step.name}" exited with code ${result.exitCode}: ${tail}`);
|
|
50
|
+
}
|
|
51
|
+
return result.output;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
await env.destroy().catch(() => undefined);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
async executeDeterministicStep(step, resolvedCommand, cwd) {
|
|
58
|
+
const env = await backend.createEnvironment(step.name);
|
|
59
|
+
try {
|
|
60
|
+
const execOpts = { cwd };
|
|
61
|
+
if (Object.keys(baseEnv).length > 0)
|
|
62
|
+
execOpts.env = baseEnv;
|
|
63
|
+
if (step.timeoutMs && step.timeoutMs > 0) {
|
|
64
|
+
execOpts.timeoutSeconds = Math.max(1, Math.ceil(step.timeoutMs / 1000));
|
|
65
|
+
}
|
|
66
|
+
return await env.exec(resolvedCommand, execOpts);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await env.destroy().catch(() => undefined);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=process-backend-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-backend-executor.js","sourceRoot":"","sources":["../src/process-backend-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ChildProcess, SpawnOptions } from 'node:child_process';
|
|
2
|
+
import type { AgentCli, AgentDefinition, VerificationCheck } from './types.js';
|
|
3
|
+
export interface SpawnOutcome {
|
|
4
|
+
output: string;
|
|
5
|
+
exitCode?: number;
|
|
6
|
+
exitSignal?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SpawnCommand {
|
|
9
|
+
bin: string;
|
|
10
|
+
args: string[];
|
|
11
|
+
env?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
export interface ShellOpts {
|
|
14
|
+
cwd: string;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentOpts extends ShellOpts {
|
|
18
|
+
}
|
|
19
|
+
export interface InteractiveOpts extends ShellOpts {
|
|
20
|
+
}
|
|
21
|
+
export interface ProcessSpawnerDeps {
|
|
22
|
+
cwd: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ProcessSpawner {
|
|
25
|
+
spawnShell(command: string, opts: ShellOpts): Promise<SpawnOutcome>;
|
|
26
|
+
spawnAgent(agent: AgentDefinition, task: string, opts: AgentOpts): Promise<SpawnOutcome>;
|
|
27
|
+
spawnInteractive(agent: AgentDefinition, task: string, opts: InteractiveOpts): Promise<SpawnOutcome>;
|
|
28
|
+
buildCommand(agent: AgentDefinition, task: string): SpawnCommand;
|
|
29
|
+
}
|
|
30
|
+
export declare function buildCommand(cli: AgentCli, extraArgs: string[] | undefined, task: string): string[];
|
|
31
|
+
export declare function spawnProcess(command: string[], options: SpawnOptions): ChildProcess;
|
|
32
|
+
export declare function collectOutput(process: ChildProcess, onChunk?: (accumulated: string) => void): Promise<string>;
|
|
33
|
+
export declare function detectCompletion(output: string, verification?: VerificationCheck): boolean;
|
|
34
|
+
export declare function createProcessSpawner(deps: ProcessSpawnerDeps): ProcessSpawner;
|
|
35
|
+
//# sourceMappingURL=process-spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-spawner.d.ts","sourceRoot":"","sources":["../src/process-spawner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKrE,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,SAAU,SAAQ,SAAS;CAAG;AAG/C,MAAM,WAAW,eAAgB,SAAQ,SAAS;CAAG;AAErD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACzF,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrG,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;CAClE;AAWD,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,YAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAY5F;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY,CAGnF;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GACtC,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAkB1F;AAyFD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAqB7E"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { spawn as cpSpawn } from 'node:child_process';
|
|
2
|
+
import { getCliDefinition } from './cli-registry.js';
|
|
3
|
+
import { resolveCliSync } from './cli-registry.js';
|
|
4
|
+
import { runVerification } from './verification.js';
|
|
5
|
+
function resolveNonInteractiveCli(cli) {
|
|
6
|
+
if (cli !== 'cursor') {
|
|
7
|
+
return cli;
|
|
8
|
+
}
|
|
9
|
+
const resolved = resolveCliSync('cursor');
|
|
10
|
+
return resolved?.binary ?? 'agent';
|
|
11
|
+
}
|
|
12
|
+
export function buildCommand(cli, extraArgs = [], task) {
|
|
13
|
+
if (cli === 'api') {
|
|
14
|
+
throw new Error('cli "api" uses direct API calls, not a subprocess command');
|
|
15
|
+
}
|
|
16
|
+
const resolvedCli = resolveNonInteractiveCli(cli);
|
|
17
|
+
const definition = getCliDefinition(resolvedCli);
|
|
18
|
+
if (!definition || definition.binaries.length === 0) {
|
|
19
|
+
throw new Error(`Unknown or non-executable CLI: ${resolvedCli}`);
|
|
20
|
+
}
|
|
21
|
+
return [definition.binaries[0], ...definition.nonInteractiveArgs(task, extraArgs)];
|
|
22
|
+
}
|
|
23
|
+
export function spawnProcess(command, options) {
|
|
24
|
+
const [bin, ...args] = command;
|
|
25
|
+
return cpSpawn(bin, args, options);
|
|
26
|
+
}
|
|
27
|
+
export function collectOutput(process, onChunk) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
let settled = false;
|
|
30
|
+
const stdout = [];
|
|
31
|
+
const stderr = [];
|
|
32
|
+
const notify = () => {
|
|
33
|
+
if (onChunk && !settled) {
|
|
34
|
+
onChunk(`${stdout.join('')}${stderr.join('')}`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
process.stdout?.on('data', (chunk) => {
|
|
38
|
+
stdout.push(chunk.toString());
|
|
39
|
+
notify();
|
|
40
|
+
});
|
|
41
|
+
process.stderr?.on('data', (chunk) => {
|
|
42
|
+
stderr.push(chunk.toString());
|
|
43
|
+
notify();
|
|
44
|
+
});
|
|
45
|
+
process.once('error', (err) => {
|
|
46
|
+
if (!settled) {
|
|
47
|
+
settled = true;
|
|
48
|
+
reject(err);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
process.once('close', () => {
|
|
52
|
+
if (!settled) {
|
|
53
|
+
settled = true;
|
|
54
|
+
resolve(`${stdout.join('')}${stderr.join('')}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function detectCompletion(output, verification) {
|
|
60
|
+
if (/OWNER_DECISION:\s*(?:INCOMPLETE_RETRY|INCOMPLETE_FAIL|NEEDS_CLARIFICATION)\b/i.test(output)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (/OWNER_DECISION:\s*COMPLETE\b/i.test(output)) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (/\bSTEP_COMPLETE:([A-Za-z0-9_.:-]+)/.test(output)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (!verification) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return runVerification(verification, output, 'process', undefined, { allowFailure: true }).passed;
|
|
73
|
+
}
|
|
74
|
+
async function runCommand(command, opts) {
|
|
75
|
+
const child = spawnProcess([command.bin, ...command.args], {
|
|
76
|
+
cwd: opts.cwd,
|
|
77
|
+
env: { ...process.env, ...command.env },
|
|
78
|
+
stdio: 'pipe',
|
|
79
|
+
});
|
|
80
|
+
// Some agent CLIs keep their process alive after emitting a completion
|
|
81
|
+
// marker (session-style REPLs). Once the marker is observed in the streamed
|
|
82
|
+
// output the step's required artifact already exists, so wait no longer:
|
|
83
|
+
// terminate gracefully and treat it as a success. Without this, such a step
|
|
84
|
+
// sits idle until the full timeout fires and is reported as a spurious
|
|
85
|
+
// "Process timed out" failure despite having already completed.
|
|
86
|
+
let completedEarly = false;
|
|
87
|
+
let earlyKillTimer;
|
|
88
|
+
const outputPromise = collectOutput(child, (accumulated) => {
|
|
89
|
+
if (!completedEarly && detectCompletion(accumulated)) {
|
|
90
|
+
completedEarly = true;
|
|
91
|
+
child.kill('SIGTERM');
|
|
92
|
+
earlyKillTimer = setTimeout(() => child.kill('SIGKILL'), 5000);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
const exitPromise = new Promise((resolve, reject) => {
|
|
96
|
+
let timedOut = false;
|
|
97
|
+
let timer;
|
|
98
|
+
let killTimer;
|
|
99
|
+
if (opts.timeoutMs) {
|
|
100
|
+
timer = setTimeout(() => {
|
|
101
|
+
timedOut = true;
|
|
102
|
+
child.kill('SIGTERM');
|
|
103
|
+
killTimer = setTimeout(() => child.kill('SIGKILL'), 5000);
|
|
104
|
+
}, opts.timeoutMs);
|
|
105
|
+
}
|
|
106
|
+
const clearTimer = () => {
|
|
107
|
+
if (timer)
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
if (killTimer)
|
|
110
|
+
clearTimeout(killTimer);
|
|
111
|
+
if (earlyKillTimer)
|
|
112
|
+
clearTimeout(earlyKillTimer);
|
|
113
|
+
};
|
|
114
|
+
child.once('error', (error) => {
|
|
115
|
+
clearTimer();
|
|
116
|
+
reject(error);
|
|
117
|
+
});
|
|
118
|
+
child.once('close', (exitCode, exitSignal) => {
|
|
119
|
+
clearTimer();
|
|
120
|
+
// Early completion wins over the timeout: even though we SIGTERM'd the
|
|
121
|
+
// child, the marker was already present, so this is a clean success.
|
|
122
|
+
// Normalise the outcome to exit code 0 with no signal — otherwise the
|
|
123
|
+
// SIGTERM would surface downstream as `exitCode === undefined &&
|
|
124
|
+
// exitSignal !== undefined`, which step execution treats as a failure.
|
|
125
|
+
if (completedEarly) {
|
|
126
|
+
resolve({ exitCode: 0, exitSignal: undefined });
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (timedOut) {
|
|
130
|
+
reject(new Error(`Process timed out after ${opts.timeoutMs ?? 'unknown'}ms`));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
resolve({
|
|
134
|
+
exitCode: exitCode ?? undefined,
|
|
135
|
+
exitSignal: exitSignal ?? undefined,
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
const [outputResult, exitResult] = await Promise.allSettled([outputPromise, exitPromise]);
|
|
140
|
+
const output = outputResult.status === 'fulfilled' ? outputResult.value : '';
|
|
141
|
+
if (exitResult.status === 'rejected') {
|
|
142
|
+
const err = exitResult.reason instanceof Error ? exitResult.reason : new Error(String(exitResult.reason));
|
|
143
|
+
err.partialOutput = output;
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
output,
|
|
148
|
+
exitCode: exitResult.value.exitCode,
|
|
149
|
+
exitSignal: exitResult.value.exitSignal,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export function createProcessSpawner(deps) {
|
|
153
|
+
const buildAgentCommand = (agent, task) => {
|
|
154
|
+
const extraArgs = agent.constraints?.model ? ['--model', agent.constraints.model] : [];
|
|
155
|
+
const [bin, ...args] = buildCommand(agent.cli, extraArgs, task);
|
|
156
|
+
return { bin, args };
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
async spawnShell(command, opts) {
|
|
160
|
+
return runCommand({ bin: 'sh', args: ['-c', command] }, { ...opts, cwd: opts.cwd ?? deps.cwd });
|
|
161
|
+
},
|
|
162
|
+
async spawnAgent(agent, task, opts) {
|
|
163
|
+
return runCommand(buildAgentCommand(agent, task), { ...opts, cwd: opts.cwd ?? deps.cwd });
|
|
164
|
+
},
|
|
165
|
+
async spawnInteractive(agent, task, opts) {
|
|
166
|
+
return runCommand(buildAgentCommand(agent, task), { ...opts, cwd: opts.cwd ?? deps.cwd });
|
|
167
|
+
},
|
|
168
|
+
buildCommand(agent, task) {
|
|
169
|
+
return buildAgentCommand(agent, task);
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=process-spawner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-spawner.js","sourceRoot":"","sources":["../src/process-spawner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type AgentPermissions, type CompiledAgentPermissions, type LocalJwksSigningKey } from '@agent-relay/cloud';
|
|
2
|
+
import { type MountHandle } from '@relayfile/sdk/workspace-mount';
|
|
3
|
+
export interface WorkflowProvisionConfig {
|
|
4
|
+
/** RS256 signing key used to mint JWT tokens. */
|
|
5
|
+
tokenSigningKey: LocalJwksSigningKey;
|
|
6
|
+
/** Workspace identifier (e.g. 'my-project'). */
|
|
7
|
+
workspace: string;
|
|
8
|
+
/** Absolute path to the project directory. */
|
|
9
|
+
projectDir: string;
|
|
10
|
+
/** Base URL of the relayfile server (e.g. 'http://127.0.0.1:4080'). */
|
|
11
|
+
relayfileBaseUrl: string;
|
|
12
|
+
/**
|
|
13
|
+
* Agents to provision, keyed by agent name. Each entry carries the
|
|
14
|
+
* AgentPermissions from relay.yaml. When empty/undefined, agents are
|
|
15
|
+
* auto-discovered from dotfiles.
|
|
16
|
+
*/
|
|
17
|
+
agents?: Record<string, AgentPermissions>;
|
|
18
|
+
/** JWT token TTL in seconds. Default: 7200 (2 hours). */
|
|
19
|
+
tokenTtlSeconds?: number;
|
|
20
|
+
/** Directories to exclude from workspace seeding. Defaults: ['.relay', '.git', 'node_modules']. */
|
|
21
|
+
excludeDirs?: string[];
|
|
22
|
+
/** When true, skip workspace creation and file seeding. */
|
|
23
|
+
skipSeeding?: boolean;
|
|
24
|
+
/** Admin scopes for the workspace management token. Uses DEFAULT_ADMIN_SCOPES when omitted. */
|
|
25
|
+
adminScopes?: string[];
|
|
26
|
+
/** Optional explicit relayfile-mount binary path. */
|
|
27
|
+
mountBinaryPath?: string;
|
|
28
|
+
/** Base directory for per-agent mount points. Defaults to <projectDir>/.relay. */
|
|
29
|
+
mountBaseDir?: string;
|
|
30
|
+
/** When true, skip starting relayfile mount processes. */
|
|
31
|
+
skipMount?: boolean;
|
|
32
|
+
/** When true, print a short audit summary to stdout after provisioning. */
|
|
33
|
+
verbose?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface ProvisionSummary {
|
|
36
|
+
readonly: number;
|
|
37
|
+
readwrite: number;
|
|
38
|
+
denied: number;
|
|
39
|
+
customScopes: number;
|
|
40
|
+
}
|
|
41
|
+
export interface AgentProvisionResult {
|
|
42
|
+
name: string;
|
|
43
|
+
tokenPath: string;
|
|
44
|
+
token: string;
|
|
45
|
+
scopes: string[];
|
|
46
|
+
compiled: CompiledAgentPermissions;
|
|
47
|
+
mountPoint?: string;
|
|
48
|
+
}
|
|
49
|
+
export type AgentTokenMap = Record<string, string>;
|
|
50
|
+
export type AgentProvisionMap = Record<string, AgentProvisionResult>;
|
|
51
|
+
export interface ProvisionResult {
|
|
52
|
+
agents: AgentProvisionMap;
|
|
53
|
+
agentNames: string[];
|
|
54
|
+
adminToken: string;
|
|
55
|
+
seededFileCount: number;
|
|
56
|
+
seededAclCount: number;
|
|
57
|
+
summary: ProvisionSummary;
|
|
58
|
+
mounts: Map<string, MountHandle>;
|
|
59
|
+
tokens: Map<string, string>;
|
|
60
|
+
scopes: Map<string, string[]>;
|
|
61
|
+
}
|
|
62
|
+
export declare function provisionWorkflowAgents(config: WorkflowProvisionConfig): Promise<ProvisionResult>;
|
|
63
|
+
export { resolveAgentPermissions } from '@agent-relay/cloud';
|
|
64
|
+
//# sourceMappingURL=provisioner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioner.d.ts","sourceRoot":"","sources":["../src/provisioner.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAK7B,KAAK,mBAAmB,EAGzB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AAIxC,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,eAAe,EAAE,mBAAmB,CAAC;IACrC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mGAAmG;IACnG,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC/B;AA8FD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuNvG;AAKD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
|