@revisium/orchestrator 0.1.0-alpha.9 → 0.2.0-alpha.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/README.md +210 -146
- package/control-plane/bootstrap.config.json +43 -1
- package/control-plane/default-playbook/catalog/pipelines.json +1157 -10
- package/control-plane/default-playbook/catalog/roles.json +54 -0
- package/control-plane/default-playbook/package.json +1 -1
- package/control-plane/default-playbook/prompts/developer.md +1 -0
- package/control-plane/default-playbook/prompts/triager.md +3 -0
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js +0 -1
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -1
- package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js +0 -1
- package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js.map +1 -1
- package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +0 -1
- package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -1
- package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +3 -0
- package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -1
- package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +6 -0
- package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -1
- package/dist/api/graphql-api/pr/model/pr-readiness.model.js +26 -0
- package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -1
- package/dist/api/graphql-api/runs/inputs/create-run.input.js +6 -0
- package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -1
- package/dist/api/graphql-api/runs/model/run.model.js +6 -0
- package/dist/api/graphql-api/runs/model/run.model.js.map +1 -1
- package/dist/api/graphql-api/share/model/issue-ref.model.js +53 -0
- package/dist/api/graphql-api/share/model/issue-ref.model.js.map +1 -0
- package/dist/cli/commands/doctor-report.js +0 -18
- package/dist/cli/commands/doctor-report.js.map +1 -1
- package/dist/cli/commands/lifecycle.js +3 -71
- package/dist/cli/commands/lifecycle.js.map +1 -1
- package/dist/cli/commands/mcp.js +0 -14
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/process-tree.js +4 -26
- package/dist/cli/commands/process-tree.js.map +1 -1
- package/dist/cli/commands/revisium-helpers.js +0 -6
- package/dist/cli/commands/revisium-helpers.js.map +1 -1
- package/dist/cli/commands/rogue-reaper.js +0 -34
- package/dist/cli/commands/rogue-reaper.js.map +1 -1
- package/dist/cli/index.js +0 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/program.js +0 -5
- package/dist/cli/program.js.map +1 -1
- package/dist/config.js +0 -25
- package/dist/config.js.map +1 -1
- package/dist/control-plane/bootstrap.js +12 -27
- package/dist/control-plane/bootstrap.js.map +1 -1
- package/dist/control-plane/change-notifications.js +0 -1
- package/dist/control-plane/change-notifications.js.map +1 -1
- package/dist/control-plane/client-transport.js +1 -12
- package/dist/control-plane/client-transport.js.map +1 -1
- package/dist/control-plane/default-playbook-policy.js +593 -0
- package/dist/control-plane/default-playbook-policy.js.map +1 -0
- package/dist/control-plane/definitions.js +8 -17
- package/dist/control-plane/definitions.js.map +1 -1
- package/dist/control-plane/inbox.js +2 -120
- package/dist/control-plane/inbox.js.map +1 -1
- package/dist/control-plane/resolve-cwd.js +0 -61
- package/dist/control-plane/resolve-cwd.js.map +1 -1
- package/dist/control-plane/schema-migration.js +0 -9
- package/dist/control-plane/schema-migration.js.map +1 -1
- package/dist/control-plane/seed-default-playbook.js +50 -46
- package/dist/control-plane/seed-default-playbook.js.map +1 -1
- package/dist/control-plane/steps.js +0 -15
- package/dist/control-plane/steps.js.map +1 -1
- package/dist/e2e/kit/agents.js +15 -21
- package/dist/e2e/kit/agents.js.map +1 -1
- package/dist/e2e/kit/assertions.js +12 -8
- package/dist/e2e/kit/assertions.js.map +1 -1
- package/dist/e2e/kit/fake-integrator.js +11 -2
- package/dist/e2e/kit/fake-integrator.js.map +1 -1
- package/dist/e2e/kit/git-target-repo.js +1 -1
- package/dist/engine/dbos.service.js +12 -179
- package/dist/engine/dbos.service.js.map +1 -1
- package/dist/engine/ensure-postgres.js +0 -48
- package/dist/engine/ensure-postgres.js.map +1 -1
- package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -1
- package/dist/features/runs/commands/impl/create-run.command.js.map +1 -1
- package/dist/features/runs/queries/handlers/runs-query.handlers.js +1 -0
- package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -1
- package/dist/host/daemon.js +2 -21
- package/dist/host/daemon.js.map +1 -1
- package/dist/host/dbos-identity.js +0 -31
- package/dist/host/dbos-identity.js.map +1 -1
- package/dist/host/ensure-host.js +1 -37
- package/dist/host/ensure-host.js.map +1 -1
- package/dist/host/ensure-revisium.js +1 -135
- package/dist/host/ensure-revisium.js.map +1 -1
- package/dist/host/host-runtime.js +0 -28
- package/dist/host/host-runtime.js.map +1 -1
- package/dist/host/host.lifecycle.js +0 -27
- package/dist/host/host.lifecycle.js.map +1 -1
- package/dist/host/queue-ownership.js +0 -42
- package/dist/host/queue-ownership.js.map +1 -1
- package/dist/host/queue-poller-census.js +1 -28
- package/dist/host/queue-poller-census.js.map +1 -1
- package/dist/http/graphql-host.module.js +0 -3
- package/dist/http/graphql-host.module.js.map +1 -1
- package/dist/mcp/mcp-capabilities.js +23 -5
- package/dist/mcp/mcp-capabilities.js.map +1 -1
- package/dist/mcp/mcp-facade.service.js +335 -22
- package/dist/mcp/mcp-facade.service.js.map +1 -1
- package/dist/mcp/mcp-http.service.js +0 -18
- package/dist/mcp/mcp-http.service.js.map +1 -1
- package/dist/mcp/mcp-tools.js +41 -36
- package/dist/mcp/mcp-tools.js.map +1 -1
- package/dist/observability/activity-signal.js +103 -0
- package/dist/observability/activity-signal.js.map +1 -0
- package/dist/observability/agent-activity-reporter.js +0 -4
- package/dist/observability/agent-activity-reporter.js.map +1 -1
- package/dist/observability/index.js +1 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/pipeline/await-human.js +0 -40
- package/dist/pipeline/await-human.js.map +1 -1
- package/dist/pipeline/data-driven-task.workflow.js +563 -251
- package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
- package/dist/pipeline/data-driven-template.js +0 -25
- package/dist/pipeline/data-driven-template.js.map +1 -1
- package/dist/pipeline/pipeline.module.js +0 -12
- package/dist/pipeline/pipeline.module.js.map +1 -1
- package/dist/pipeline/pipeline.service.js +194 -189
- package/dist/pipeline/pipeline.service.js.map +1 -1
- package/dist/pipeline/route-contract.js +4 -3
- package/dist/pipeline/route-contract.js.map +1 -1
- package/dist/pipeline-core/index.js +1 -13
- package/dist/pipeline-core/index.js.map +1 -1
- package/dist/pipeline-core/interpret.js +21 -94
- package/dist/pipeline-core/interpret.js.map +1 -1
- package/dist/pipeline-core/kit/assertions.js +0 -19
- package/dist/pipeline-core/kit/assertions.js.map +1 -1
- package/dist/pipeline-core/kit/builders.js +1 -21
- package/dist/pipeline-core/kit/builders.js.map +1 -1
- package/dist/pipeline-core/kit/drive.js +1 -31
- package/dist/pipeline-core/kit/drive.js.map +1 -1
- package/dist/pipeline-core/kit/fixtures.js +78 -101
- package/dist/pipeline-core/kit/fixtures.js.map +1 -1
- package/dist/pipeline-core/kit/index.js +0 -8
- package/dist/pipeline-core/kit/index.js.map +1 -1
- package/dist/pipeline-core/types.js +13 -52
- package/dist/pipeline-core/types.js.map +1 -1
- package/dist/pipeline-core/validate-capability.js +0 -3
- package/dist/pipeline-core/validate-capability.js.map +1 -1
- package/dist/pipeline-core/validate-conflicts.js +0 -9
- package/dist/pipeline-core/validate-conflicts.js.map +1 -1
- package/dist/pipeline-core/validate-dataflow.js +0 -17
- package/dist/pipeline-core/validate-dataflow.js.map +1 -1
- package/dist/pipeline-core/validate-diff.js +3 -36
- package/dist/pipeline-core/validate-diff.js.map +1 -1
- package/dist/pipeline-core/validate-edges.js +0 -6
- package/dist/pipeline-core/validate-edges.js.map +1 -1
- package/dist/pipeline-core/validate-graph.js +0 -11
- package/dist/pipeline-core/validate-graph.js.map +1 -1
- package/dist/pipeline-core/validate-loops.js +37 -44
- package/dist/pipeline-core/validate-loops.js.map +1 -1
- package/dist/pipeline-core/validate-parallel.js +9 -15
- package/dist/pipeline-core/validate-parallel.js.map +1 -1
- package/dist/pipeline-core/validate-sink.js +0 -7
- package/dist/pipeline-core/validate-sink.js.map +1 -1
- package/dist/pipeline-core/validate-topology.js +1 -20
- package/dist/pipeline-core/validate-topology.js.map +1 -1
- package/dist/pipeline-core/validate-verdict.js +52 -7
- package/dist/pipeline-core/validate-verdict.js.map +1 -1
- package/dist/pipeline-core/validate.js +5 -29
- package/dist/pipeline-core/validate.js.map +1 -1
- package/dist/playbook/catalog-loader.js +8 -3
- package/dist/playbook/catalog-loader.js.map +1 -1
- package/dist/playbook/import-mapper.js +4 -5
- package/dist/playbook/import-mapper.js.map +1 -1
- package/dist/poller/pr-readiness-core.js +226 -29
- package/dist/poller/pr-readiness-core.js.map +1 -1
- package/dist/revisium/inbox.service.js +0 -24
- package/dist/revisium/inbox.service.js.map +1 -1
- package/dist/revisium/playbooks.service.js +15 -2
- package/dist/revisium/playbooks.service.js.map +1 -1
- package/dist/revisium/revisium.module.js +0 -12
- package/dist/revisium/revisium.module.js.map +1 -1
- package/dist/revisium/roles.service.js +0 -6
- package/dist/revisium/roles.service.js.map +1 -1
- package/dist/revisium/run.service.js +2 -75
- package/dist/revisium/run.service.js.map +1 -1
- package/dist/revisium/tokens.js +0 -4
- package/dist/revisium/tokens.js.map +1 -1
- package/dist/run/append-event.js +6 -37
- package/dist/run/append-event.js.map +1 -1
- package/dist/run/block-run.js.map +1 -1
- package/dist/run/cancel-run.js +0 -33
- package/dist/run/cancel-run.js.map +1 -1
- package/dist/run/complete-run.js.map +1 -1
- package/dist/run/create-run.js +5 -8
- package/dist/run/create-run.js.map +1 -1
- package/dist/run/fail-run.js +0 -3
- package/dist/run/fail-run.js.map +1 -1
- package/dist/run/inspect-run.js +10 -29
- package/dist/run/inspect-run.js.map +1 -1
- package/dist/run/issue-ref.js +88 -0
- package/dist/run/issue-ref.js.map +1 -0
- package/dist/run/run-outputs.js +0 -19
- package/dist/run/run-outputs.js.map +1 -1
- package/dist/run/terminal-run-status.js +0 -12
- package/dist/run/terminal-run-status.js.map +1 -1
- package/dist/runners/claude-code.service.js +2 -13
- package/dist/runners/claude-code.service.js.map +1 -1
- package/dist/runners/codex.service.js +2 -11
- package/dist/runners/codex.service.js.map +1 -1
- package/dist/runners/gh-identity.js +0 -52
- package/dist/runners/gh-identity.js.map +1 -1
- package/dist/runners/integrator-branch-naming.js +16 -19
- package/dist/runners/integrator-branch-naming.js.map +1 -1
- package/dist/runners/integrator-git.js +0 -25
- package/dist/runners/integrator-git.js.map +1 -1
- package/dist/runners/integrator-remote.js +0 -2
- package/dist/runners/integrator-remote.js.map +1 -1
- package/dist/runners/integrator-types.js +0 -7
- package/dist/runners/integrator-types.js.map +1 -1
- package/dist/runners/integrator.js +231 -230
- package/dist/runners/integrator.js.map +1 -1
- package/dist/runners/runner.module.js +0 -6
- package/dist/runners/runner.module.js.map +1 -1
- package/dist/runners/tokens.js +0 -4
- package/dist/runners/tokens.js.map +1 -1
- package/dist/runners/worktree.service.js +3 -19
- package/dist/runners/worktree.service.js.map +1 -1
- package/dist/task-control-plane/pr-readiness.service.js +15 -13
- package/dist/task-control-plane/pr-readiness.service.js.map +1 -1
- package/dist/task-control-plane/run-watch.service.js +170 -63
- package/dist/task-control-plane/run-watch.service.js.map +1 -1
- package/dist/task-control-plane/task-control-plane-api.service.js +285 -40
- package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
- package/dist/worker/artifact-store.js +21 -3
- package/dist/worker/artifact-store.js.map +1 -1
- package/dist/worker/build-context.js +10 -10
- package/dist/worker/build-context.js.map +1 -1
- package/dist/worker/claude-code-runner.js +76 -48
- package/dist/worker/claude-code-runner.js.map +1 -1
- package/dist/worker/codex-runner.js +128 -35
- package/dist/worker/codex-runner.js.map +1 -1
- package/dist/worker/git-worktree-manager.js +20 -67
- package/dist/worker/git-worktree-manager.js.map +1 -1
- package/dist/worker/process-executor.js +144 -27
- package/dist/worker/process-executor.js.map +1 -1
- package/dist/worker/result-envelope.js +33 -49
- package/dist/worker/result-envelope.js.map +1 -1
- package/dist/worker/runner-common.js +29 -0
- package/dist/worker/runner-common.js.map +1 -1
- package/dist/worker/runner-dispatch.js +0 -3
- package/dist/worker/runner-dispatch.js.map +1 -1
- package/dist/worker/runner.js +16 -1
- package/dist/worker/runner.js.map +1 -1
- package/dist/worker/stub-runner.js +0 -7
- package/dist/worker/stub-runner.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,7 +1,46 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { createRunnerActivityTracker, } from '../observability/activity-signal.js';
|
|
3
|
+
export const RUNNER_IDLE_TIMEOUT_KIND = 'runner-idle-timeout';
|
|
4
|
+
export const RUNNER_WALL_CLOCK_LIMIT_KIND = 'runner-wall-clock-limit';
|
|
5
|
+
export const DEFAULT_RUNNER_IDLE_TIMEOUT_MS = 600_000;
|
|
6
|
+
export const DEFAULT_RUNNER_WALL_CLOCK_LIMIT_MS = 3_600_000;
|
|
7
|
+
function readPositiveIntEnv(env, key) {
|
|
8
|
+
const raw = env[key];
|
|
9
|
+
if (raw === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
if (!/^\d+$/.test(raw)) {
|
|
12
|
+
throw new Error(`${key} must be a positive integer number of milliseconds`);
|
|
13
|
+
}
|
|
14
|
+
const parsed = Number(raw);
|
|
15
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0) {
|
|
16
|
+
throw new Error(`${key} must be a positive integer number of milliseconds`);
|
|
17
|
+
}
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
function positiveInt(value, label) {
|
|
21
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
22
|
+
throw new Error(`${label} must be a positive integer number of milliseconds`);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
export function resolveRunnerTimeoutPolicy(opts = {}) {
|
|
27
|
+
return resolveEffectiveRunnerTimeoutPolicy(opts);
|
|
28
|
+
}
|
|
29
|
+
export function resolveEffectiveRunnerTimeoutPolicy(opts = {}) {
|
|
30
|
+
const env = opts.env ?? process.env;
|
|
31
|
+
const roleWallClockLimitMs = typeof opts.roleTimeoutMs === 'number' && opts.roleTimeoutMs > 0
|
|
32
|
+
? opts.roleTimeoutMs
|
|
33
|
+
: undefined;
|
|
34
|
+
return {
|
|
35
|
+
idleTimeoutMs: positiveInt(readPositiveIntEnv(env, 'REVO_RUNNER_IDLE_TIMEOUT_MS')
|
|
36
|
+
?? opts.idleTimeoutMs
|
|
37
|
+
?? DEFAULT_RUNNER_IDLE_TIMEOUT_MS, 'idleTimeoutMs'),
|
|
38
|
+
wallClockLimitMs: positiveInt(readPositiveIntEnv(env, 'REVO_RUNNER_WALL_CLOCK_LIMIT_MS')
|
|
39
|
+
?? roleWallClockLimitMs
|
|
40
|
+
?? opts.wallClockLimitMs
|
|
41
|
+
?? DEFAULT_RUNNER_WALL_CLOCK_LIMIT_MS, 'wallClockLimitMs'),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
5
44
|
function killGroup(child) {
|
|
6
45
|
const pid = child.pid;
|
|
7
46
|
if (pid === undefined) {
|
|
@@ -15,29 +54,109 @@ function killGroup(child) {
|
|
|
15
54
|
child.kill('SIGKILL');
|
|
16
55
|
}
|
|
17
56
|
}
|
|
18
|
-
// Real implementation, used only in production wiring (never in unit tests).
|
|
19
57
|
export const spawnExecutor = (req) => new Promise((resolve, reject) => {
|
|
58
|
+
const policy = resolveRunnerTimeoutPolicy({
|
|
59
|
+
idleTimeoutMs: req.idleTimeoutMs,
|
|
60
|
+
wallClockLimitMs: req.timeoutMs,
|
|
61
|
+
});
|
|
62
|
+
const startedAt = Date.now();
|
|
63
|
+
const timers = {};
|
|
64
|
+
let latestActivity;
|
|
65
|
+
const activity = createRunnerActivityTracker({
|
|
66
|
+
startedAt,
|
|
67
|
+
onChange: (snapshot) => {
|
|
68
|
+
latestActivity = snapshot;
|
|
69
|
+
scheduleIdleTimer();
|
|
70
|
+
},
|
|
71
|
+
});
|
|
20
72
|
const child = spawn(req.command, req.args, {
|
|
21
73
|
cwd: req.cwd,
|
|
22
74
|
env: req.env ? { ...process.env, ...req.env } : process.env,
|
|
23
|
-
// Own process group → a negative-PID SIGKILL reaps `claude` AND its children on timeout.
|
|
24
|
-
// Do NOT unref(): the parent must stay attached to collect stdout/stderr and observe exit.
|
|
25
75
|
detached: true,
|
|
26
76
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
27
77
|
});
|
|
28
78
|
let stdout = '';
|
|
29
79
|
let stderr = '';
|
|
30
80
|
let timedOut = false;
|
|
81
|
+
let timeoutKind;
|
|
82
|
+
let timeoutEvidence;
|
|
31
83
|
let settled = false;
|
|
32
|
-
|
|
33
|
-
|
|
84
|
+
function clearTimers() {
|
|
85
|
+
if (timers.idle)
|
|
86
|
+
clearTimeout(timers.idle);
|
|
87
|
+
if (timers.wallClock)
|
|
88
|
+
clearTimeout(timers.wallClock);
|
|
89
|
+
}
|
|
90
|
+
function rejectFromSetup(err) {
|
|
91
|
+
if (settled)
|
|
92
|
+
return;
|
|
93
|
+
settled = true;
|
|
94
|
+
clearTimers();
|
|
95
|
+
killGroup(child);
|
|
96
|
+
reject(err);
|
|
97
|
+
}
|
|
98
|
+
child.on('error', (err) => {
|
|
99
|
+
if (settled)
|
|
100
|
+
return;
|
|
101
|
+
settled = true;
|
|
102
|
+
clearTimers();
|
|
103
|
+
reject(err);
|
|
104
|
+
});
|
|
105
|
+
try {
|
|
106
|
+
if (child.pid !== undefined)
|
|
107
|
+
req.onSpawn?.(child.pid);
|
|
108
|
+
req.onActivityTracker?.(activity);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
rejectFromSetup(err);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
function buildTimeoutEvidence(snapshot) {
|
|
115
|
+
const now = Date.now();
|
|
116
|
+
return {
|
|
117
|
+
idleTimeoutMs: policy.idleTimeoutMs,
|
|
118
|
+
wallClockLimitMs: policy.wallClockLimitMs,
|
|
119
|
+
elapsedMs: Math.max(0, now - startedAt),
|
|
120
|
+
idleMs: Math.max(0, now - snapshot.lastActivityAt),
|
|
121
|
+
lastActivityAt: new Date(snapshot.lastActivityAt).toISOString(),
|
|
122
|
+
inFlightOperationCount: snapshot.inFlightOperationCount,
|
|
123
|
+
stdoutBytes: snapshot.stdoutBytes,
|
|
124
|
+
stderrBytes: snapshot.stderrBytes,
|
|
125
|
+
eventCount: snapshot.eventCount,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function killFor(kind) {
|
|
129
|
+
if (settled || timedOut)
|
|
130
|
+
return;
|
|
131
|
+
timedOut = true;
|
|
132
|
+
timeoutKind = kind;
|
|
133
|
+
timeoutEvidence = buildTimeoutEvidence(activity.snapshot());
|
|
134
|
+
clearTimers();
|
|
135
|
+
killGroup(child);
|
|
136
|
+
}
|
|
137
|
+
function scheduleIdleTimer() {
|
|
138
|
+
if (settled || timedOut)
|
|
139
|
+
return;
|
|
140
|
+
if (timers.idle)
|
|
141
|
+
clearTimeout(timers.idle);
|
|
142
|
+
const snapshot = latestActivity ?? activity.snapshot();
|
|
143
|
+
if (snapshot.inFlightOperationCount > 0) {
|
|
144
|
+
timers.idle = setTimeout(scheduleIdleTimer, policy.idleTimeoutMs);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const idleMs = Math.max(0, Date.now() - snapshot.lastActivityAt);
|
|
148
|
+
const remainingMs = policy.idleTimeoutMs - idleMs;
|
|
149
|
+
if (remainingMs <= 0) {
|
|
150
|
+
killFor(RUNNER_IDLE_TIMEOUT_KIND);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
timers.idle = setTimeout(scheduleIdleTimer, remainingMs);
|
|
154
|
+
}
|
|
34
155
|
child.stdout?.setEncoding('utf8');
|
|
35
156
|
child.stderr?.setEncoding('utf8');
|
|
36
|
-
// Guard the sink callbacks: a throw here (e.g. a failed artifact write) would otherwise
|
|
37
|
-
// escape the stream 'data' handler as an uncaughtException and crash the worker. The
|
|
38
|
-
// in-memory capture above is unaffected, so the result envelope is still collected.
|
|
39
157
|
child.stdout?.on('data', (chunk) => {
|
|
40
158
|
stdout += chunk;
|
|
159
|
+
activity.recordOutput('stdout', Buffer.byteLength(chunk, 'utf8'));
|
|
41
160
|
try {
|
|
42
161
|
req.onStdoutChunk?.(chunk);
|
|
43
162
|
}
|
|
@@ -47,6 +166,7 @@ export const spawnExecutor = (req) => new Promise((resolve, reject) => {
|
|
|
47
166
|
});
|
|
48
167
|
child.stderr?.on('data', (chunk) => {
|
|
49
168
|
stderr += chunk;
|
|
169
|
+
activity.recordOutput('stderr', Buffer.byteLength(chunk, 'utf8'));
|
|
50
170
|
try {
|
|
51
171
|
req.onStderrChunk?.(chunk);
|
|
52
172
|
}
|
|
@@ -54,27 +174,24 @@ export const spawnExecutor = (req) => new Promise((resolve, reject) => {
|
|
|
54
174
|
console.warn(`Warning: onStderrChunk sink failed: ${String(err)}`);
|
|
55
175
|
}
|
|
56
176
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
// Spawn-level errors (binary missing) reject — the runner converts that to a lesson.
|
|
62
|
-
child.on('error', (err) => {
|
|
63
|
-
if (settled)
|
|
64
|
-
return;
|
|
65
|
-
settled = true;
|
|
66
|
-
clearTimeout(timer);
|
|
67
|
-
reject(err);
|
|
68
|
-
});
|
|
69
|
-
// Never reject for a non-zero exit; return the result and let the runner decide how to map it.
|
|
177
|
+
timers.wallClock = setTimeout(() => {
|
|
178
|
+
killFor(RUNNER_WALL_CLOCK_LIMIT_KIND);
|
|
179
|
+
}, policy.wallClockLimitMs);
|
|
180
|
+
scheduleIdleTimer();
|
|
70
181
|
child.on('close', (code) => {
|
|
71
182
|
if (settled)
|
|
72
183
|
return;
|
|
73
184
|
settled = true;
|
|
74
|
-
|
|
75
|
-
resolve({
|
|
185
|
+
clearTimers();
|
|
186
|
+
resolve({
|
|
187
|
+
code,
|
|
188
|
+
stdout,
|
|
189
|
+
stderr,
|
|
190
|
+
timedOut,
|
|
191
|
+
...(timeoutKind ? { timeoutKind } : {}),
|
|
192
|
+
...(timeoutEvidence ? { timeoutEvidence } : {}),
|
|
193
|
+
});
|
|
76
194
|
});
|
|
77
|
-
// Swallow EPIPE: the child may exit before draining stdin; the 'close' handler reports the result.
|
|
78
195
|
child.stdin?.on('error', () => { });
|
|
79
196
|
if (req.input !== undefined)
|
|
80
197
|
child.stdin?.write(req.input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-executor.js","sourceRoot":"","sources":["../../src/worker/process-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"process-executor.js","sourceRoot":"","sources":["../../src/worker/process-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
const FALLBACK_VERDICT_TOKENS = ['approved', 'changes_requested', 'blocker', 'clean', 'dirty'];
|
|
2
|
+
function verdictMenu(acceptedVerdicts) {
|
|
3
|
+
const tokens = acceptedVerdicts && acceptedVerdicts.length > 0 ? acceptedVerdicts : FALLBACK_VERDICT_TOKENS;
|
|
4
|
+
return tokens.join(' | ');
|
|
5
|
+
}
|
|
6
|
+
export function agentResultSchema(acceptedVerdicts) {
|
|
7
|
+
const verdictEnum = acceptedVerdicts && acceptedVerdicts.length > 0 ? { enum: [...acceptedVerdicts] } : {};
|
|
8
|
+
return JSON.stringify({
|
|
9
|
+
type: 'object',
|
|
10
|
+
additionalProperties: false,
|
|
11
|
+
properties: {
|
|
12
|
+
verdict: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
minLength: 1,
|
|
15
|
+
...verdictEnum,
|
|
16
|
+
description: `the single routing token, lowercase, exactly one of: ${verdictMenu(acceptedVerdicts)}`,
|
|
17
|
+
},
|
|
18
|
+
output: { type: 'string', description: 'a short summary, or the artifact (e.g. the plan) the next step consumes' },
|
|
19
|
+
artifacts: { description: 'optional JSON artifacts, e.g. { "planPath": "docs/plans/00xx.md" }' },
|
|
20
|
+
nextSteps: {
|
|
21
|
+
type: 'array',
|
|
22
|
+
description: 'optional follow-up work items; use [] when there is no follow-up work',
|
|
23
|
+
items: { type: 'object' },
|
|
24
|
+
},
|
|
25
|
+
needsHuman: { type: 'boolean', description: 'true only if you are blocked and a human must intervene' },
|
|
26
|
+
lesson: { type: 'string', description: 'optional one-line note for a future attempt' },
|
|
19
27
|
},
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/** Short prompt note paired with `--json-schema`; the CLI returns the result as `structured_output`. */
|
|
26
|
-
export const STRUCTURED_RESULT_NOTE = `
|
|
28
|
+
required: ['verdict', 'output'],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export function structuredResultNote(acceptedVerdicts) {
|
|
32
|
+
return `
|
|
27
33
|
Return your final answer as JSON matching the provided output schema:
|
|
28
|
-
- "verdict": the single routing token for your role (lowercase
|
|
34
|
+
- "verdict": the single routing token for your role (lowercase), exactly one of: ${verdictMenu(acceptedVerdicts)}. Use no other token.
|
|
29
35
|
- "output": a short summary, or — if you produce an artifact for a later step (e.g. an implementation plan) — that artifact.
|
|
30
36
|
- "nextSteps": [] unless you are explicitly creating legacy follow-up steps.
|
|
31
37
|
Set "needsHuman": true only if you are blocked and a human must intervene.
|
|
32
38
|
`;
|
|
33
|
-
|
|
39
|
+
}
|
|
34
40
|
export function agentResultFromStructured(structured) {
|
|
35
41
|
if (structured === undefined) {
|
|
36
42
|
throw new TypeError('agent structured result missing structured_output');
|
|
@@ -76,8 +82,6 @@ function readFinalText(obj) {
|
|
|
76
82
|
function readNonEmptyString(value) {
|
|
77
83
|
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
78
84
|
}
|
|
79
|
-
// Layer A. Parse defensively; field names are read only inside this module, so a CLI drift is a
|
|
80
|
-
// one-file change. Throws only when stdout is not parseable JSON.
|
|
81
85
|
export function parseTransportEnvelope(stdout) {
|
|
82
86
|
let parsed;
|
|
83
87
|
try {
|
|
@@ -105,24 +109,10 @@ export function parseTransportEnvelope(stdout) {
|
|
|
105
109
|
structuredOutput: obj.structured_output,
|
|
106
110
|
};
|
|
107
111
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Reduce the runner's stdout to the single terminal `result` JSON object, then hand it to
|
|
110
|
-
* parseTransportEnvelope. Handles BOTH shapes:
|
|
111
|
-
* - legacy `--output-format json` → the whole stdout is one `{...}` object;
|
|
112
|
-
* - `--output-format stream-json` → a JSONL stream (system/assistant/user/… lines) whose LAST
|
|
113
|
-
* line is `{"type":"result",...}`.
|
|
114
|
-
* Confirmed by experiment (2026-06-23): under stream-json the terminal result still carries
|
|
115
|
-
* `structured_output`, `usage`, and `total_cost_usd`, so verdict/cost extraction is unchanged.
|
|
116
|
-
* Throws when no result object is present (the runner maps that to a lesson-bearing failure).
|
|
117
|
-
*/
|
|
118
112
|
export function extractTerminalResult(stdout) {
|
|
119
113
|
const trimmed = stdout.trim();
|
|
120
114
|
if (trimmed === '')
|
|
121
115
|
throw new Error('claude -p produced no output (no result envelope)');
|
|
122
|
-
// Legacy single-object form: the whole stdout parses as one object. Accept only a terminal
|
|
123
|
-
// result (`type` 'result' or absent — the legacy `--output-format json` blob is `type:'result'`);
|
|
124
|
-
// a lone non-result stream event (e.g. `{"type":"assistant",…}`) must fall through so the JSONL
|
|
125
|
-
// scan reports the clear "no result event" error rather than failing later on a missing result.
|
|
126
116
|
try {
|
|
127
117
|
const whole = JSON.parse(trimmed);
|
|
128
118
|
if (whole !== null && typeof whole === 'object' && !Array.isArray(whole)) {
|
|
@@ -132,9 +122,7 @@ export function extractTerminalResult(stdout) {
|
|
|
132
122
|
}
|
|
133
123
|
}
|
|
134
124
|
catch {
|
|
135
|
-
// Not a single object → fall through to the JSONL scan.
|
|
136
125
|
}
|
|
137
|
-
// stream-json: the terminal result is the LAST line with `"type":"result"`.
|
|
138
126
|
const lines = trimmed.split(/\r?\n/);
|
|
139
127
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
140
128
|
const line = lines[i].trim();
|
|
@@ -146,14 +134,10 @@ export function extractTerminalResult(stdout) {
|
|
|
146
134
|
return line;
|
|
147
135
|
}
|
|
148
136
|
catch {
|
|
149
|
-
// skip a partial/non-JSON line
|
|
150
137
|
}
|
|
151
138
|
}
|
|
152
139
|
throw new Error('claude -p stream contained no result event (transport envelope)');
|
|
153
140
|
}
|
|
154
|
-
// Map each raw nextSteps entry to NewStepSpec. Require role/kind/input; default taskId and
|
|
155
|
-
// modelProfile from the current step so the agent never needs to know IDs. Throw a lesson-bearing
|
|
156
|
-
// error (naming the index) on a malformed entry.
|
|
157
141
|
export function normalizeNextSteps(raw, step) {
|
|
158
142
|
return raw.map((entry, i) => {
|
|
159
143
|
if (entry === null || typeof entry !== 'object') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-envelope.js","sourceRoot":"","sources":["../../src/worker/result-envelope.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"result-envelope.js","sourceRoot":"","sources":["../../src/worker/result-envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RunAgentError } from './runner.js';
|
|
2
2
|
import { normalizeNextSteps } from './result-envelope.js';
|
|
3
|
+
import { RUNNER_IDLE_TIMEOUT_KIND, RUNNER_WALL_CLOCK_LIMIT_KIND, } from './process-executor.js';
|
|
3
4
|
const ERROR_TAIL = 2_000;
|
|
4
5
|
const OBSERVABILITY_PREVIEW_MAX_CHARS = 1_000;
|
|
5
6
|
const OBSERVABILITY_ARRAY_MAX_ITEMS = 5;
|
|
@@ -63,6 +64,34 @@ export function withProcessArtifact(agentArtifacts, process) {
|
|
|
63
64
|
export function runnerError(message, process) {
|
|
64
65
|
return new RunAgentError(message, withProcessArtifact(undefined, process));
|
|
65
66
|
}
|
|
67
|
+
export function runnerFailure(message, process, metadata = {}) {
|
|
68
|
+
return new RunAgentError(message, withProcessArtifact(undefined, process), metadata);
|
|
69
|
+
}
|
|
70
|
+
function fallbackTimeoutEvidence(result, policy, failureKind) {
|
|
71
|
+
const fallbackElapsedMs = failureKind === RUNNER_IDLE_TIMEOUT_KIND ? policy.idleTimeoutMs : policy.wallClockLimitMs;
|
|
72
|
+
return {
|
|
73
|
+
idleTimeoutMs: policy.idleTimeoutMs,
|
|
74
|
+
wallClockLimitMs: policy.wallClockLimitMs,
|
|
75
|
+
elapsedMs: fallbackElapsedMs,
|
|
76
|
+
idleMs: fallbackElapsedMs,
|
|
77
|
+
lastActivityAt: new Date(0).toISOString(),
|
|
78
|
+
inFlightOperationCount: 0,
|
|
79
|
+
stdoutBytes: Buffer.byteLength(result.stdout, 'utf8'),
|
|
80
|
+
stderrBytes: Buffer.byteLength(result.stderr, 'utf8'),
|
|
81
|
+
eventCount: 0,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function runnerTimeoutFailure(runnerName, result, process, policy) {
|
|
85
|
+
const failureKind = result.timeoutKind ?? RUNNER_WALL_CLOCK_LIMIT_KIND;
|
|
86
|
+
const timing = result.timeoutEvidence ?? fallbackTimeoutEvidence(result, policy, failureKind);
|
|
87
|
+
const message = `${runnerName} runner ${failureKind}: elapsed ${timing.elapsedMs}ms, ` +
|
|
88
|
+
`idle ${timing.idleMs}ms, in-flight operations ${timing.inFlightOperationCount}`;
|
|
89
|
+
return runnerFailure(message, process, {
|
|
90
|
+
failureKind,
|
|
91
|
+
retryableCandidate: true,
|
|
92
|
+
timing,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
66
95
|
export function buildUsageCosts(step, profile, usage) {
|
|
67
96
|
const inputTokens = usage.inputTokens ?? 0;
|
|
68
97
|
const outputTokens = usage.outputTokens ?? 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-common.js","sourceRoot":"","sources":["../../src/worker/runner-common.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner-common.js","sourceRoot":"","sources":["../../src/worker/runner-common.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// The single RunAgent the loop injects. All runner choice hides here, dispatched on role.runner —
|
|
2
|
-
// the loop never learns about runner kinds. A not-implemented runner throws (routing through
|
|
3
|
-
// failStep to a clear lesson); it never silently no-ops.
|
|
4
1
|
export function createRunAgent(deps) {
|
|
5
2
|
return async (args) => {
|
|
6
3
|
switch (args.role.runner) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-dispatch.js","sourceRoot":"","sources":["../../src/worker/runner-dispatch.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"runner-dispatch.js","sourceRoot":"","sources":["../../src/worker/runner-dispatch.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,IAAmE;IAChG,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/B,KAAK,OAAO;gBACV,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBACnF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,KAAK,QAAQ,CAAC;YACd,KAAK,YAAY;gBACf,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACrF,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B;gBACE,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/worker/runner.js
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
export class RunAgentError extends Error {
|
|
2
2
|
artifacts;
|
|
3
|
-
|
|
3
|
+
failureKind;
|
|
4
|
+
retryableCandidate;
|
|
5
|
+
timing;
|
|
6
|
+
constructor(message, artifacts, metadata = {}) {
|
|
4
7
|
super(message);
|
|
5
8
|
this.name = 'RunAgentError';
|
|
6
9
|
this.artifacts = artifacts;
|
|
10
|
+
this.failureKind = metadata.failureKind;
|
|
11
|
+
this.retryableCandidate = metadata.retryableCandidate;
|
|
12
|
+
this.timing = metadata.timing;
|
|
7
13
|
}
|
|
8
14
|
}
|
|
9
15
|
export function artifactsFromRunAgentError(err) {
|
|
10
16
|
return err instanceof RunAgentError ? err.artifacts : undefined;
|
|
11
17
|
}
|
|
18
|
+
export function failureMetadataFromRunAgentError(err) {
|
|
19
|
+
if (!(err instanceof RunAgentError))
|
|
20
|
+
return {};
|
|
21
|
+
return {
|
|
22
|
+
...(err.failureKind ? { failureKind: err.failureKind } : {}),
|
|
23
|
+
...(err.retryableCandidate === undefined ? {} : { retryableCandidate: err.retryableCandidate }),
|
|
24
|
+
...(err.timing ? { timing: err.timing } : {}),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
12
27
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/worker/runner.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,SAAS,CAAW;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/worker/runner.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,SAAS,CAAW;IACpB,WAAW,CAA4B;IACvC,kBAAkB,CAAW;IAC7B,MAAM,CAAyB;IAExC,YACE,OAAe,EACf,SAAmB,EACnB,WAII,EAAE;QAEN,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChC,CAAC;CACF;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACrD,OAAO,GAAG,YAAY,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,GAAY;IAK3D,IAAI,CAAC,CAAC,GAAG,YAAY,aAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO;QACL,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC/F,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
// Zero-cost stub runner for integration testing and smoke verification.
|
|
2
|
-
//
|
|
3
|
-
// GENERIC (plan 0015 slice 4): the stub is role-AGNOSTIC. It emits a top-level passing result
|
|
4
|
-
// (`verdict:'approved'`) regardless of role so smoke paths complete end-to-end at zero cost.
|
|
5
|
-
// Real, scenario-specific verdicts are scripted by the e2e kit's agent; the stub no longer encodes any
|
|
6
|
-
// pipeline-role knowledge (no role-name branching, no `nextSteps` — the data-driven engine sequences
|
|
7
|
-
// nodes from the template, never from a runner-returned chain).
|
|
8
1
|
export const stubRunAgent = async ({ role, step, context }) => {
|
|
9
2
|
const output = {
|
|
10
3
|
echo: `[stub] role=${role.name} step=${step.id} contextSize=${context.length}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stub-runner.js","sourceRoot":"","sources":["../../src/worker/stub-runner.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"stub-runner.js","sourceRoot":"","sources":["../../src/worker/stub-runner.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAa,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;IACtE,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,eAAe,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,gBAAgB,OAAO,CAAC,MAAM,EAAE;KAC/E,CAAC;IAEF,MAAM,MAAM,GAAkB;QAC5B,MAAM;QACN,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,EAAE;QACT,UAAU,EAAE,KAAK;KAClB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revisium/orchestrator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-alpha.0",
|
|
4
4
|
"description": "Local orchestrator for software-development tasks driven by short-lived AI agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agents",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"smoke:claude-runner": "tsx scripts/smoke-claude-runner.ts",
|
|
46
46
|
"smoke:pr-poller": "tsx scripts/smoke-pr-poller.ts",
|
|
47
47
|
"test": "tsx --test $(find src -name '*.test.ts' | sort)",
|
|
48
|
-
"test:e2e": "export REVO_E2E_REAL=1 REVO_DATA_DIR=~/.revisium-orchestrator-e2e REVO_PORT=19422 REVO_PG_PORT=15640 REVO_DEV_TASKS_CONCURRENCY=8 REVO_POLL_PR_INTERVAL_MS=1 REVO_POLL_PR_MAX_POLLS=3 && tsx scripts/e2e-setup.ts && tsx --test --test-concurrency=1 src/e2e/*.e2e.test.ts",
|
|
48
|
+
"test:e2e": "export REVO_E2E_REAL=1 REVO_DATA_DIR=~/.revisium-orchestrator-e2e REVO_PORT=19422 REVO_PG_PORT=15640 REVO_DEV_TASKS_CONCURRENCY=8 REVO_POLL_PR_INTERVAL_MS=1 REVO_POLL_PR_MAX_POLLS=3 REVO_SHUTDOWN_DRAIN_TIMEOUT_MS=100 && tsx scripts/e2e-setup.ts && tsx --test --test-concurrency=1 --test-force-exit src/e2e/*.e2e.test.ts",
|
|
49
49
|
"test:cov": "mkdir -p coverage && node --import tsx --test --experimental-test-coverage --test-reporter=spec --test-reporter=lcov --test-reporter-destination=stdout --test-reporter-destination=coverage/lcov.info $(find src -name '*.test.ts' | sort)",
|
|
50
50
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
51
51
|
"lint:ci": "eslint . --max-warnings 0",
|