agentic-engineering-harness 0.6.4 → 0.6.6
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 +119 -17
- package/dist/audit/run.d.ts +2 -0
- package/dist/audit/run.js +28 -15
- package/dist/audit/run.js.map +1 -1
- package/dist/core/init.js +9 -2
- package/dist/core/init.js.map +1 -1
- package/dist/core/types.d.ts +9 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +266 -0
- package/dist/main.js.map +1 -0
- package/dist/operations/controller.d.ts +17 -0
- package/dist/operations/controller.js +198 -0
- package/dist/operations/controller.js.map +1 -0
- package/dist/operations/interactive.d.ts +5 -0
- package/dist/operations/interactive.js +45 -0
- package/dist/operations/interactive.js.map +1 -0
- package/dist/operations/mcp.d.ts +1 -0
- package/dist/operations/mcp.js +129 -0
- package/dist/operations/mcp.js.map +1 -0
- package/dist/operations/state.d.ts +43 -0
- package/dist/operations/state.js +127 -0
- package/dist/operations/state.js.map +1 -0
- package/dist/paseo/launchSpec.d.ts +25 -0
- package/dist/paseo/launchSpec.js +69 -0
- package/dist/paseo/launchSpec.js.map +1 -0
- package/dist/paseo/runtime.d.ts +8 -1
- package/dist/paseo/runtime.js +66 -21
- package/dist/paseo/runtime.js.map +1 -1
- package/dist/paseo/sdk.d.ts +33 -12
- package/dist/paseo/sdk.js +122 -55
- package/dist/paseo/sdk.js.map +1 -1
- package/dist/paseo/start.d.ts +9 -2
- package/dist/paseo/start.js +63 -13
- package/dist/paseo/start.js.map +1 -1
- package/dist/runtime/invocation.d.ts +10 -0
- package/dist/runtime/invocation.js +51 -0
- package/dist/runtime/invocation.js.map +1 -0
- package/dist/telemetry/events.js +19 -0
- package/dist/telemetry/events.js.map +1 -1
- package/dist/workers/agentPrompt.d.ts +4 -0
- package/dist/workers/agentPrompt.js +110 -32
- package/dist/workers/agentPrompt.js.map +1 -1
- package/dist/workers/paseo.js +23 -26
- package/dist/workers/paseo.js.map +1 -1
- package/docs/PASEO.md +162 -27
- package/package.json +10 -6
- package/scripts/link-self-bin.mjs +36 -0
- package/skills/engineering-workflow/SKILL.md +40 -16
- package/skills/paseo-orchestration/SKILL.md +18 -3
- package/templates/AGENTS.md +8 -6
package/dist/main.js
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import process from "node:process";
|
|
5
|
+
import { loadProjectConfig } from "./core/config.js";
|
|
6
|
+
import { cancelOperation, executeOperation, startDetachedOperation, waitForOperation } from "./operations/controller.js";
|
|
7
|
+
import { promoteInteractiveOperation } from "./operations/interactive.js";
|
|
8
|
+
import { serveOperationMcp } from "./operations/mcp.js";
|
|
9
|
+
import { loadOperation } from "./operations/state.js";
|
|
10
|
+
import { listManagedPaseoAgents } from "./paseo/runtime.js";
|
|
11
|
+
import { planSelfCheckoutRuntime, resolveStartProjectRoot } from "./runtime/invocation.js";
|
|
12
|
+
import { VERSION } from "./version.js";
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
if (args[0] === "start") {
|
|
15
|
+
const root = resolveStartProjectRoot(args.slice(1));
|
|
16
|
+
if (await relaunchSelfCheckoutIfNeeded(root))
|
|
17
|
+
process.exit(process.exitCode ?? 0);
|
|
18
|
+
console.log(`aehRuntime=${VERSION}`);
|
|
19
|
+
console.log(`aehEntry=${path.resolve(process.argv[1])}`);
|
|
20
|
+
}
|
|
21
|
+
const promotion = promoteInteractiveOperation(args);
|
|
22
|
+
if (promotion) {
|
|
23
|
+
console.log(`interactivePromotion=detached-${promotion.kind}`);
|
|
24
|
+
await runOperationStart(promotion.operationArgv);
|
|
25
|
+
process.exit(process.exitCode ?? 0);
|
|
26
|
+
}
|
|
27
|
+
if (args[0] === "operation") {
|
|
28
|
+
await runOperationCommand(args.slice(1));
|
|
29
|
+
process.exit(process.exitCode ?? 0);
|
|
30
|
+
}
|
|
31
|
+
if (args[0] === "paseo" && args[1] === "agents" && hasOperationFilter(args.slice(2))) {
|
|
32
|
+
await runOperationAwarePaseoAgents(args.slice(2));
|
|
33
|
+
process.exit(process.exitCode ?? 0);
|
|
34
|
+
}
|
|
35
|
+
if (args.length === 1 && ["--help", "-h"].includes(args[0]))
|
|
36
|
+
printControlPlaneHelp();
|
|
37
|
+
await import("./entry.js");
|
|
38
|
+
async function relaunchSelfCheckoutIfNeeded(root) {
|
|
39
|
+
if (process.env.AEH_SELF_REEXEC === "1")
|
|
40
|
+
return false;
|
|
41
|
+
const plan = await planSelfCheckoutRuntime(root, process.argv[1]);
|
|
42
|
+
if (!plan.shouldRelaunch)
|
|
43
|
+
return false;
|
|
44
|
+
if (!plan.localEntryReady) {
|
|
45
|
+
throw new Error(`AEH source checkout detected at ${root}, but ${plan.localEntry} is not built. ` +
|
|
46
|
+
"Run 'npm ci && npm run build', then start with 'npm run aeh -- start'. " +
|
|
47
|
+
"Refusing to create a lead from an external/npm-exec runtime because it can be stale.");
|
|
48
|
+
}
|
|
49
|
+
console.log(`aehRuntimeRedirect=${plan.currentEntry} -> ${plan.localEntry}`);
|
|
50
|
+
const exitCode = await spawnAndWait(process.execPath, [plan.localEntry, ...args], {
|
|
51
|
+
cwd: root,
|
|
52
|
+
env: { ...process.env, AEH_SELF_REEXEC: "1" }
|
|
53
|
+
});
|
|
54
|
+
process.exitCode = exitCode;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
function spawnAndWait(command, argv, options) {
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const child = spawn(command, argv, { cwd: options.cwd, env: options.env, stdio: "inherit" });
|
|
60
|
+
child.once("error", reject);
|
|
61
|
+
child.once("close", (code, signal) => {
|
|
62
|
+
if (signal)
|
|
63
|
+
return resolve(1);
|
|
64
|
+
resolve(code ?? 1);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async function runOperationCommand(argv) {
|
|
69
|
+
const sub = argv[0];
|
|
70
|
+
if (sub === "start")
|
|
71
|
+
return runOperationStart(argv.slice(1));
|
|
72
|
+
if (sub === "execute")
|
|
73
|
+
return runOperationExecute(argv.slice(1));
|
|
74
|
+
if (sub === "status")
|
|
75
|
+
return runOperationStatus(argv.slice(1));
|
|
76
|
+
if (sub === "wait")
|
|
77
|
+
return runOperationWait(argv.slice(1));
|
|
78
|
+
if (sub === "cancel")
|
|
79
|
+
return runOperationCancel(argv.slice(1));
|
|
80
|
+
if (sub === "mcp")
|
|
81
|
+
return serveOperationMcp();
|
|
82
|
+
throw new Error("aeh operation requires start, status, wait, cancel, mcp, or internal execute.");
|
|
83
|
+
}
|
|
84
|
+
async function runOperationStart(argv) {
|
|
85
|
+
const kind = argv[0];
|
|
86
|
+
if (kind !== "audit" && kind !== "run")
|
|
87
|
+
throw new Error("aeh operation start requires audit or run.");
|
|
88
|
+
const parsed = parseFlags(argv.slice(1), new Set(kind === "audit" ? ["file", "domain", "risk", "reviewer"] : ["profile"]), new Set());
|
|
89
|
+
const subject = parsed.positional[0];
|
|
90
|
+
if (!subject)
|
|
91
|
+
throw new Error(`aeh operation start ${kind} requires ${kind === "audit" ? "<request>" : "<taskId>"}.`);
|
|
92
|
+
if (parsed.positional.length > 2)
|
|
93
|
+
throw new Error(`aeh operation start ${kind} accepts a subject and at most one project directory.`);
|
|
94
|
+
const root = path.resolve(parsed.positional[1] ?? ".");
|
|
95
|
+
await loadProjectConfig(root);
|
|
96
|
+
const payload = kind === "audit"
|
|
97
|
+
? {
|
|
98
|
+
request: subject,
|
|
99
|
+
files: parsed.values("file"),
|
|
100
|
+
domains: parsed.values("domain"),
|
|
101
|
+
risk: parseRisk(parsed.value("risk")),
|
|
102
|
+
reviewers: parsed.values("reviewer")
|
|
103
|
+
}
|
|
104
|
+
: { taskId: subject, profile: parsed.value("profile") };
|
|
105
|
+
const record = await startDetachedOperation(root, kind, payload, {
|
|
106
|
+
nodeExecutable: process.execPath,
|
|
107
|
+
entryFile: path.resolve(process.argv[1])
|
|
108
|
+
});
|
|
109
|
+
printOperation(record, false);
|
|
110
|
+
}
|
|
111
|
+
async function runOperationExecute(argv) {
|
|
112
|
+
const operationId = argv[0];
|
|
113
|
+
if (!operationId)
|
|
114
|
+
throw new Error("aeh operation execute requires <operationId>.");
|
|
115
|
+
if (argv.length > 2)
|
|
116
|
+
throw new Error("aeh operation execute accepts <operationId> and at most one project directory.");
|
|
117
|
+
const root = path.resolve(argv[1] ?? ".");
|
|
118
|
+
const record = await executeOperation(root, operationId);
|
|
119
|
+
if (record.status === "FAILED")
|
|
120
|
+
process.exitCode = 1;
|
|
121
|
+
}
|
|
122
|
+
async function runOperationStatus(argv) {
|
|
123
|
+
const parsed = parseFlags(argv, new Set(), new Set(["json"]));
|
|
124
|
+
const operationId = parsed.positional[0];
|
|
125
|
+
if (!operationId)
|
|
126
|
+
throw new Error("aeh operation status requires <operationId>.");
|
|
127
|
+
if (parsed.positional.length > 2)
|
|
128
|
+
throw new Error("aeh operation status accepts <operationId> and at most one project directory.");
|
|
129
|
+
printOperation(await loadOperation(path.resolve(parsed.positional[1] ?? "."), operationId), parsed.flag("json"));
|
|
130
|
+
}
|
|
131
|
+
async function runOperationWait(argv) {
|
|
132
|
+
const parsed = parseFlags(argv, new Set(["timeout"]), new Set(["json"]));
|
|
133
|
+
const operationId = parsed.positional[0];
|
|
134
|
+
if (!operationId)
|
|
135
|
+
throw new Error("aeh operation wait requires <operationId>.");
|
|
136
|
+
if (parsed.positional.length > 2)
|
|
137
|
+
throw new Error("aeh operation wait accepts <operationId> and at most one project directory.");
|
|
138
|
+
const timeoutSeconds = Number(parsed.value("timeout") ?? "1800");
|
|
139
|
+
if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0)
|
|
140
|
+
throw new Error("--timeout must be a positive number of seconds.");
|
|
141
|
+
const record = await waitForOperation(path.resolve(parsed.positional[1] ?? "."), operationId, timeoutSeconds * 1000);
|
|
142
|
+
printOperation(record, parsed.flag("json"));
|
|
143
|
+
if (record.status === "FAILED")
|
|
144
|
+
process.exitCode = 1;
|
|
145
|
+
if (record.status === "CANCELLED")
|
|
146
|
+
process.exitCode = 130;
|
|
147
|
+
}
|
|
148
|
+
async function runOperationCancel(argv) {
|
|
149
|
+
if (!argv[0])
|
|
150
|
+
throw new Error("aeh operation cancel requires <operationId>.");
|
|
151
|
+
if (argv.length > 2)
|
|
152
|
+
throw new Error("aeh operation cancel accepts <operationId> and at most one project directory.");
|
|
153
|
+
printOperation(await cancelOperation(path.resolve(argv[1] ?? "."), argv[0]), false);
|
|
154
|
+
}
|
|
155
|
+
async function runOperationAwarePaseoAgents(argv) {
|
|
156
|
+
const parsed = parseFlags(argv, new Set(["task", "role", "kind", "status", "operation", "operation-kind", "phase"]), new Set(["json"]));
|
|
157
|
+
if (parsed.positional.length > 1)
|
|
158
|
+
throw new Error("aeh paseo agents accepts at most one project directory.");
|
|
159
|
+
const root = path.resolve(parsed.positional[0] ?? ".");
|
|
160
|
+
const config = await loadProjectConfig(root);
|
|
161
|
+
const labels = { "aeh.project": config.project.name };
|
|
162
|
+
for (const [flag, label] of [
|
|
163
|
+
["task", "aeh.task"],
|
|
164
|
+
["role", "aeh.role"],
|
|
165
|
+
["kind", "aeh.kind"],
|
|
166
|
+
["operation", "aeh.operation"],
|
|
167
|
+
["operation-kind", "aeh.operation.kind"],
|
|
168
|
+
["phase", "aeh.operation.phase"]
|
|
169
|
+
])
|
|
170
|
+
if (parsed.value(flag))
|
|
171
|
+
labels[label] = parsed.value(flag);
|
|
172
|
+
const requestedStatus = parsed.value("status");
|
|
173
|
+
const agents = (await listManagedPaseoAgents(root, labels)).filter((agent) => !requestedStatus || agent.status === requestedStatus);
|
|
174
|
+
const view = agents.map((agent) => ({
|
|
175
|
+
id: agent.id,
|
|
176
|
+
status: agent.status ?? "unknown",
|
|
177
|
+
title: agent.title,
|
|
178
|
+
workspaceId: agent.workspaceId,
|
|
179
|
+
role: agent.labels?.["aeh.role"],
|
|
180
|
+
task: agent.labels?.["aeh.task"],
|
|
181
|
+
kind: agent.labels?.["aeh.kind"],
|
|
182
|
+
operation: agent.labels?.["aeh.operation"],
|
|
183
|
+
operationKind: agent.labels?.["aeh.operation.kind"],
|
|
184
|
+
phase: agent.labels?.["aeh.operation.phase"],
|
|
185
|
+
workspaceKind: agent.labels?.["aeh.workspace.kind"],
|
|
186
|
+
labels: agent.labels
|
|
187
|
+
}));
|
|
188
|
+
if (parsed.flag("json")) {
|
|
189
|
+
console.log(JSON.stringify(view, null, 2));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (!view.length) {
|
|
193
|
+
console.log("No matching active AEH Paseo agents.");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
for (const agent of view)
|
|
197
|
+
console.log(`${agent.status.padEnd(12)} role=${(agent.role ?? "-").padEnd(24)} op=${(agent.operation ?? "-").padEnd(30)} phase=${(agent.phase ?? "-").padEnd(14)} task=${(agent.task ?? "-").padEnd(24)} id=${agent.id}${agent.title ? ` title=${agent.title}` : ""}`);
|
|
198
|
+
}
|
|
199
|
+
function printOperation(record, json) {
|
|
200
|
+
if (json) {
|
|
201
|
+
console.log(JSON.stringify(record, null, 2));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
console.log(`operationId=${record.id}`);
|
|
205
|
+
console.log(`kind=${record.kind}`);
|
|
206
|
+
console.log(`status=${record.status}`);
|
|
207
|
+
console.log(`phase=${record.phase}`);
|
|
208
|
+
if (record.workspaceId)
|
|
209
|
+
console.log(`workspaceId=${record.workspaceId}`);
|
|
210
|
+
if (record.workspaceWarning)
|
|
211
|
+
console.log(`workspaceWarning=${record.workspaceWarning}`);
|
|
212
|
+
if (record.error)
|
|
213
|
+
console.log(`error=${record.error.split("\n", 1)[0]}`);
|
|
214
|
+
if (record.result)
|
|
215
|
+
console.log(`result=${JSON.stringify(record.result)}`);
|
|
216
|
+
}
|
|
217
|
+
function printControlPlaneHelp() {
|
|
218
|
+
console.log("AEH control-plane commands (in addition to the core command tree below):");
|
|
219
|
+
console.log(" start [directory] Start a fresh managed Paseo lead");
|
|
220
|
+
console.log(" context guard [directory] Inspect managed-lead context pressure");
|
|
221
|
+
console.log(" intent <request> [directory] Classify INFORMATIONAL/AUDIT/CHANGE intent");
|
|
222
|
+
console.log(" audit <request> [directory] Synchronous audit compatibility entrypoint");
|
|
223
|
+
console.log(" operation start audit|run ... Start a detached first-class operation");
|
|
224
|
+
console.log(" operation status|wait|cancel <operationId> Observe/control a detached operation");
|
|
225
|
+
console.log(" paseo agents [directory] Inspect AEH-managed Paseo agents");
|
|
226
|
+
console.log(" setup [directory] Reconcile the managed engineering toolchain");
|
|
227
|
+
console.log(" spec prepare|compile ... OpenSpec-backed SPEC authoring bridge");
|
|
228
|
+
console.log("");
|
|
229
|
+
}
|
|
230
|
+
function hasOperationFilter(argv) { return argv.some((value) => value === "--operation" || value === "--operation-kind" || value === "--phase"); }
|
|
231
|
+
function parseRisk(value) { if (!value)
|
|
232
|
+
return undefined; if (value === "low" || value === "medium" || value === "high")
|
|
233
|
+
return value; throw new Error(`Invalid risk '${value}'. Use low, medium or high.`); }
|
|
234
|
+
function parseFlags(argv, valueFlags, booleanFlags) {
|
|
235
|
+
const flags = new Map();
|
|
236
|
+
const positional = [];
|
|
237
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
238
|
+
const token = argv[i];
|
|
239
|
+
if (!token.startsWith("--")) {
|
|
240
|
+
positional.push(token);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const name = token.slice(2);
|
|
244
|
+
if (valueFlags.has(name)) {
|
|
245
|
+
const next = argv[++i];
|
|
246
|
+
if (!next || next.startsWith("--"))
|
|
247
|
+
throw new Error(`--${name} requires a value.`);
|
|
248
|
+
const list = flags.get(name) ?? [];
|
|
249
|
+
list.push(next);
|
|
250
|
+
flags.set(name, list);
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (!booleanFlags.has(name))
|
|
254
|
+
throw new Error(`Unknown option --${name}.`);
|
|
255
|
+
const list = flags.get(name) ?? [];
|
|
256
|
+
list.push(true);
|
|
257
|
+
flags.set(name, list);
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
positional,
|
|
261
|
+
flag: (name) => flags.get(name)?.includes(true) ?? false,
|
|
262
|
+
value: (name) => flags.get(name)?.find((item) => typeof item === "string"),
|
|
263
|
+
values: (name) => (flags.get(name) ?? []).filter((item) => typeof item === "string")
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { runProcess } from "../utils/process.js";
|
|
3
|
+
import { type OperationKind, type OperationPayload, type OperationRecord } from "./state.js";
|
|
4
|
+
export interface StartOperationOptions {
|
|
5
|
+
nodeExecutable: string;
|
|
6
|
+
entryFile: string;
|
|
7
|
+
spawnProcess?: typeof spawn;
|
|
8
|
+
}
|
|
9
|
+
export interface OperationControllerDeps {
|
|
10
|
+
run?: typeof runProcess;
|
|
11
|
+
}
|
|
12
|
+
export declare function startDetachedOperation(root: string, kind: OperationKind, payload: OperationPayload, options: StartOperationOptions): Promise<OperationRecord>;
|
|
13
|
+
export declare function executeOperation(root: string, operationId: string, deps?: OperationControllerDeps): Promise<OperationRecord>;
|
|
14
|
+
export declare function waitForOperation(root: string, operationId: string, timeoutMs?: number, pollMs?: number): Promise<OperationRecord>;
|
|
15
|
+
export declare function cancelOperation(root: string, operationId: string): Promise<OperationRecord>;
|
|
16
|
+
export declare function createOperationId(kind: OperationKind, seed: string): string;
|
|
17
|
+
export declare function extractWorkspaceId(text: string): string | undefined;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import process from "node:process";
|
|
5
|
+
import { runAudit } from "../audit/run.js";
|
|
6
|
+
import { loadProjectConfig, loadTaskContract } from "../core/config.js";
|
|
7
|
+
import { runTask } from "../core/run.js";
|
|
8
|
+
import { listManagedPaseoAgents } from "../paseo/runtime.js";
|
|
9
|
+
import { runProcess } from "../utils/process.js";
|
|
10
|
+
import { loadOperation, patchOperation, saveOperation } from "./state.js";
|
|
11
|
+
export async function startDetachedOperation(root, kind, payload, options) {
|
|
12
|
+
const absoluteRoot = path.resolve(root);
|
|
13
|
+
const now = new Date().toISOString();
|
|
14
|
+
const id = createOperationId(kind, JSON.stringify(payload));
|
|
15
|
+
const record = {
|
|
16
|
+
version: 1,
|
|
17
|
+
id,
|
|
18
|
+
kind,
|
|
19
|
+
status: "QUEUED",
|
|
20
|
+
phase: "queued",
|
|
21
|
+
root: absoluteRoot,
|
|
22
|
+
payload,
|
|
23
|
+
createdAt: now,
|
|
24
|
+
updatedAt: now
|
|
25
|
+
};
|
|
26
|
+
await saveOperation(absoluteRoot, record);
|
|
27
|
+
const spawnProcess = options.spawnProcess ?? spawn;
|
|
28
|
+
let child;
|
|
29
|
+
try {
|
|
30
|
+
child = spawnProcess(options.nodeExecutable, [options.entryFile, "operation", "execute", id, absoluteRoot], {
|
|
31
|
+
cwd: absoluteRoot,
|
|
32
|
+
detached: true,
|
|
33
|
+
stdio: "ignore",
|
|
34
|
+
env: {
|
|
35
|
+
...process.env,
|
|
36
|
+
AEH_OPERATION_ID: id,
|
|
37
|
+
AEH_OPERATION_KIND: kind
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return patchOperation(absoluteRoot, id, { status: "FAILED", phase: "spawn-failed", error: String(error), finishedAt: new Date().toISOString() });
|
|
43
|
+
}
|
|
44
|
+
child.unref();
|
|
45
|
+
return patchOperation(absoluteRoot, id, { pid: child.pid, phase: "dispatched" });
|
|
46
|
+
}
|
|
47
|
+
export async function executeOperation(root, operationId, deps = {}) {
|
|
48
|
+
const absoluteRoot = path.resolve(root);
|
|
49
|
+
let record = await loadOperation(absoluteRoot, operationId);
|
|
50
|
+
if (record.status === "CANCELLED")
|
|
51
|
+
return record;
|
|
52
|
+
record = await patchOperation(absoluteRoot, operationId, { status: "RUNNING", phase: "preparing", startedAt: new Date().toISOString(), pid: process.pid, error: undefined });
|
|
53
|
+
process.env.AEH_OPERATION_ID = record.id;
|
|
54
|
+
process.env.AEH_OPERATION_KIND = record.kind;
|
|
55
|
+
const workspace = await ensureOperationWorkspace(absoluteRoot, record, deps.run ?? runProcess);
|
|
56
|
+
if (workspace.workspaceId) {
|
|
57
|
+
process.env.AEH_OPERATION_WORKSPACE_ID = workspace.workspaceId;
|
|
58
|
+
record = await patchOperation(absoluteRoot, operationId, { workspaceId: workspace.workspaceId, workspaceWarning: undefined });
|
|
59
|
+
}
|
|
60
|
+
else if (workspace.warning) {
|
|
61
|
+
record = await patchOperation(absoluteRoot, operationId, { workspaceWarning: workspace.warning });
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const config = await loadProjectConfig(absoluteRoot);
|
|
65
|
+
if (record.kind === "audit") {
|
|
66
|
+
const payload = record.payload;
|
|
67
|
+
const report = await runAudit(absoluteRoot, config, { ...payload, auditId: record.id });
|
|
68
|
+
const current = await loadOperation(absoluteRoot, operationId);
|
|
69
|
+
if (current.status === "CANCELLED")
|
|
70
|
+
return current;
|
|
71
|
+
return patchOperation(absoluteRoot, operationId, {
|
|
72
|
+
status: "SUCCEEDED",
|
|
73
|
+
phase: "finished",
|
|
74
|
+
finishedAt: new Date().toISOString(),
|
|
75
|
+
result: { auditId: report.auditId, status: report.status, productionSafe: report.productionSafe, report: `.harness/audits/${report.auditId}.json` }
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const payload = record.payload;
|
|
79
|
+
const contract = await loadTaskContract(absoluteRoot, payload.taskId, config);
|
|
80
|
+
const result = await runTask(absoluteRoot, config, contract, { profile: payload.profile });
|
|
81
|
+
const current = await loadOperation(absoluteRoot, operationId);
|
|
82
|
+
if (current.status === "CANCELLED")
|
|
83
|
+
return current;
|
|
84
|
+
return patchOperation(absoluteRoot, operationId, {
|
|
85
|
+
status: result.status === "PASS" ? "SUCCEEDED" : "FAILED",
|
|
86
|
+
phase: "finished",
|
|
87
|
+
finishedAt: new Date().toISOString(),
|
|
88
|
+
result: { taskId: result.taskId, status: result.status, attempts: result.attempts }
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const current = await loadOperation(absoluteRoot, operationId).catch(() => record);
|
|
93
|
+
if (current.status === "CANCELLED")
|
|
94
|
+
return current;
|
|
95
|
+
return patchOperation(absoluteRoot, operationId, { status: "FAILED", phase: "failed", error: error instanceof Error ? error.stack ?? error.message : String(error), finishedAt: new Date().toISOString() });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export async function waitForOperation(root, operationId, timeoutMs = 1_800_000, pollMs = 500) {
|
|
99
|
+
const deadline = Date.now() + timeoutMs;
|
|
100
|
+
for (;;) {
|
|
101
|
+
const record = await loadOperation(root, operationId);
|
|
102
|
+
if (isTerminal(record.status))
|
|
103
|
+
return record;
|
|
104
|
+
if (Date.now() >= deadline)
|
|
105
|
+
throw new Error(`Timed out waiting for operation ${operationId} after ${timeoutMs}ms.`);
|
|
106
|
+
await new Promise((resolve) => setTimeout(resolve, pollMs));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export async function cancelOperation(root, operationId) {
|
|
110
|
+
const absoluteRoot = path.resolve(root);
|
|
111
|
+
const record = await loadOperation(absoluteRoot, operationId);
|
|
112
|
+
if (isTerminal(record.status))
|
|
113
|
+
return record;
|
|
114
|
+
const cleanupWarnings = [];
|
|
115
|
+
if (record.pid && record.pid !== process.pid) {
|
|
116
|
+
try {
|
|
117
|
+
process.kill(record.pid, "SIGTERM");
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (!/ESRCH/.test(String(error)))
|
|
121
|
+
cleanupWarnings.push(`controller: ${String(error)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const agents = await listManagedPaseoAgents(absoluteRoot, { "aeh.operation": operationId });
|
|
126
|
+
for (const agent of agents) {
|
|
127
|
+
const stopped = await runProcess(`paseo agent stop ${quote(agent.id)}`, { cwd: absoluteRoot, timeoutMs: 30_000 }).catch((error) => ({ exitCode: 1, stdout: "", stderr: String(error), durationMs: 0 }));
|
|
128
|
+
if (stopped.exitCode !== 0)
|
|
129
|
+
cleanupWarnings.push(`agent ${agent.id}: ${stopped.stderr || stopped.stdout || `exit ${stopped.exitCode}`}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
cleanupWarnings.push(`agent discovery: ${String(error)}`);
|
|
134
|
+
}
|
|
135
|
+
return patchOperation(absoluteRoot, operationId, {
|
|
136
|
+
status: "CANCELLED",
|
|
137
|
+
phase: "cancelled",
|
|
138
|
+
finishedAt: new Date().toISOString(),
|
|
139
|
+
cleanupWarnings: cleanupWarnings.length ? cleanupWarnings : undefined
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
export function createOperationId(kind, seed) {
|
|
143
|
+
const stamp = new Date().toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z");
|
|
144
|
+
const hash = crypto.createHash("sha256").update(seed).digest("hex").slice(0, 8);
|
|
145
|
+
return `${kind.toUpperCase()}-${stamp}-${hash}`;
|
|
146
|
+
}
|
|
147
|
+
async function ensureOperationWorkspace(root, record, run) {
|
|
148
|
+
const title = `AEH ${record.kind.toUpperCase()} · ${record.id}`;
|
|
149
|
+
const command = `paseo workspace create --isolation local --path ${quote(root)} --title ${quote(title)} --json`;
|
|
150
|
+
let result;
|
|
151
|
+
try {
|
|
152
|
+
result = await run(command, { cwd: root, timeoutMs: 60_000 });
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return { warning: `Paseo operation workspace could not be created: ${String(error)}` };
|
|
156
|
+
}
|
|
157
|
+
if (result.exitCode !== 0)
|
|
158
|
+
return { warning: `Paseo operation workspace could not be created: ${result.stderr || result.stdout || `exit ${result.exitCode}`}` };
|
|
159
|
+
const workspaceId = extractWorkspaceId(result.stdout);
|
|
160
|
+
return workspaceId ? { workspaceId } : { warning: "Paseo created an operation workspace but AEH could not resolve its id." };
|
|
161
|
+
}
|
|
162
|
+
export function extractWorkspaceId(text) {
|
|
163
|
+
if (!text.trim())
|
|
164
|
+
return undefined;
|
|
165
|
+
try {
|
|
166
|
+
return findWorkspaceId(JSON.parse(text));
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return text.match(/\b(?:workspace(?:Id)?[=: ]+)?(workspace-[A-Za-z0-9._-]+)\b/i)?.[1];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function findWorkspaceId(value) {
|
|
173
|
+
if (!value || typeof value !== "object")
|
|
174
|
+
return undefined;
|
|
175
|
+
if (Array.isArray(value)) {
|
|
176
|
+
for (const item of value) {
|
|
177
|
+
const id = findWorkspaceId(item);
|
|
178
|
+
if (id)
|
|
179
|
+
return id;
|
|
180
|
+
}
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const record = value;
|
|
184
|
+
for (const key of ["workspaceId", "workspace_id", "id"]) {
|
|
185
|
+
const candidate = record[key];
|
|
186
|
+
if (typeof candidate === "string" && candidate && (key !== "id" || /workspace/i.test(candidate) || "cwd" in record || "worktreePath" in record || "path" in record))
|
|
187
|
+
return candidate;
|
|
188
|
+
}
|
|
189
|
+
for (const child of Object.values(record)) {
|
|
190
|
+
const id = findWorkspaceId(child);
|
|
191
|
+
if (id)
|
|
192
|
+
return id;
|
|
193
|
+
}
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
function isTerminal(status) { return status === "SUCCEEDED" || status === "FAILED" || status === "CANCELLED"; }
|
|
197
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
198
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/operations/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function promoteInteractiveOperation(argv, env = process.env) {
|
|
2
|
+
if (!env.PASEO_AGENT_ID?.trim() || env.AEH_ALLOW_SYNC_INTERACTIVE === "1")
|
|
3
|
+
return undefined;
|
|
4
|
+
if (argv[0] === "audit") {
|
|
5
|
+
return { kind: "audit", operationArgv: ["audit", ...argv.slice(1)] };
|
|
6
|
+
}
|
|
7
|
+
if (argv[0] === "run") {
|
|
8
|
+
return { kind: "run", operationArgv: translateRun(argv.slice(1)) };
|
|
9
|
+
}
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
function translateRun(argv) {
|
|
13
|
+
const positional = [];
|
|
14
|
+
let profile;
|
|
15
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
16
|
+
const token = argv[index];
|
|
17
|
+
if (token === "--profile") {
|
|
18
|
+
const value = argv[++index];
|
|
19
|
+
if (!value || value.startsWith("--"))
|
|
20
|
+
throw new Error("Interactive aeh run --profile requires a value.");
|
|
21
|
+
profile = value;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (token.startsWith("--")) {
|
|
25
|
+
throw new Error(`Managed Paseo leads cannot execute synchronous 'aeh run' option ${token}. ` +
|
|
26
|
+
"Prepare/import the task first, then use 'aeh operation start run <taskId>'. " +
|
|
27
|
+
"Set AEH_ALLOW_SYNC_INTERACTIVE=1 only for an explicit compatibility or recovery flow.");
|
|
28
|
+
}
|
|
29
|
+
positional.push(token);
|
|
30
|
+
}
|
|
31
|
+
const taskId = positional[0];
|
|
32
|
+
if (!taskId) {
|
|
33
|
+
throw new Error("Managed Paseo leads cannot execute a synchronous bare 'aeh run'. " +
|
|
34
|
+
"Use a prepared/sealed task id so AEH can start a detached operation.");
|
|
35
|
+
}
|
|
36
|
+
if (positional.length > 2)
|
|
37
|
+
throw new Error("Interactive aeh run accepts <taskId> and at most one project directory.");
|
|
38
|
+
const operationArgv = ["run", taskId];
|
|
39
|
+
if (positional[1])
|
|
40
|
+
operationArgv.push(positional[1]);
|
|
41
|
+
if (profile)
|
|
42
|
+
operationArgv.push("--profile", profile);
|
|
43
|
+
return operationArgv;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/operations/interactive.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,2BAA2B,CACzC,IAAc,EACd,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,0BAA0B,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IAE5F,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,OAA2B,CAAC;IAEhC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACzG,OAAO,GAAG,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,mEAAmE,KAAK,IAAI;gBAC5E,8EAA8E;gBAC9E,uFAAuF,CACxF,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mEAAmE;YACnE,sEAAsE,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAEtH,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO;QAAE,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function serveOperationMcp(): Promise<void>;
|