agentic-engineering-harness 0.6.4 → 0.6.5

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.
Files changed (43) hide show
  1. package/README.md +98 -17
  2. package/dist/audit/run.d.ts +2 -0
  3. package/dist/audit/run.js +28 -15
  4. package/dist/audit/run.js.map +1 -1
  5. package/dist/core/init.js +9 -2
  6. package/dist/core/init.js.map +1 -1
  7. package/dist/core/types.d.ts +9 -0
  8. package/dist/main.d.ts +2 -0
  9. package/dist/main.js +204 -0
  10. package/dist/main.js.map +1 -0
  11. package/dist/operations/controller.d.ts +17 -0
  12. package/dist/operations/controller.js +198 -0
  13. package/dist/operations/controller.js.map +1 -0
  14. package/dist/operations/mcp.d.ts +1 -0
  15. package/dist/operations/mcp.js +129 -0
  16. package/dist/operations/mcp.js.map +1 -0
  17. package/dist/operations/state.d.ts +43 -0
  18. package/dist/operations/state.js +127 -0
  19. package/dist/operations/state.js.map +1 -0
  20. package/dist/paseo/launchSpec.d.ts +25 -0
  21. package/dist/paseo/launchSpec.js +69 -0
  22. package/dist/paseo/launchSpec.js.map +1 -0
  23. package/dist/paseo/runtime.d.ts +8 -1
  24. package/dist/paseo/runtime.js +66 -21
  25. package/dist/paseo/runtime.js.map +1 -1
  26. package/dist/paseo/sdk.d.ts +33 -12
  27. package/dist/paseo/sdk.js +122 -55
  28. package/dist/paseo/sdk.js.map +1 -1
  29. package/dist/paseo/start.d.ts +4 -1
  30. package/dist/paseo/start.js +49 -5
  31. package/dist/paseo/start.js.map +1 -1
  32. package/dist/telemetry/events.js +19 -0
  33. package/dist/telemetry/events.js.map +1 -1
  34. package/dist/workers/agentPrompt.d.ts +4 -0
  35. package/dist/workers/agentPrompt.js +110 -32
  36. package/dist/workers/agentPrompt.js.map +1 -1
  37. package/dist/workers/paseo.js +23 -26
  38. package/dist/workers/paseo.js.map +1 -1
  39. package/docs/PASEO.md +162 -27
  40. package/package.json +7 -5
  41. package/skills/engineering-workflow/SKILL.md +40 -16
  42. package/skills/paseo-orchestration/SKILL.md +18 -3
  43. package/templates/AGENTS.md +8 -6
package/dist/main.js ADDED
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { loadProjectConfig } from "./core/config.js";
5
+ import { cancelOperation, executeOperation, startDetachedOperation, waitForOperation } from "./operations/controller.js";
6
+ import { serveOperationMcp } from "./operations/mcp.js";
7
+ import { loadOperation } from "./operations/state.js";
8
+ import { listManagedPaseoAgents } from "./paseo/runtime.js";
9
+ const args = process.argv.slice(2);
10
+ if (args[0] === "operation") {
11
+ await runOperationCommand(args.slice(1));
12
+ process.exit(process.exitCode ?? 0);
13
+ }
14
+ if (args[0] === "paseo" && args[1] === "agents" && hasOperationFilter(args.slice(2))) {
15
+ await runOperationAwarePaseoAgents(args.slice(2));
16
+ process.exit(process.exitCode ?? 0);
17
+ }
18
+ await import("./entry.js");
19
+ async function runOperationCommand(argv) {
20
+ const sub = argv[0];
21
+ if (sub === "start")
22
+ return runOperationStart(argv.slice(1));
23
+ if (sub === "execute")
24
+ return runOperationExecute(argv.slice(1));
25
+ if (sub === "status")
26
+ return runOperationStatus(argv.slice(1));
27
+ if (sub === "wait")
28
+ return runOperationWait(argv.slice(1));
29
+ if (sub === "cancel")
30
+ return runOperationCancel(argv.slice(1));
31
+ if (sub === "mcp")
32
+ return serveOperationMcp();
33
+ throw new Error("aeh operation requires start, status, wait, cancel, mcp, or internal execute.");
34
+ }
35
+ async function runOperationStart(argv) {
36
+ const kind = argv[0];
37
+ if (kind !== "audit" && kind !== "run")
38
+ throw new Error("aeh operation start requires audit or run.");
39
+ const parsed = parseFlags(argv.slice(1), new Set(kind === "audit" ? ["file", "domain", "risk", "reviewer"] : ["profile"]), new Set());
40
+ const subject = parsed.positional[0];
41
+ if (!subject)
42
+ throw new Error(`aeh operation start ${kind} requires ${kind === "audit" ? "<request>" : "<taskId>"}.`);
43
+ if (parsed.positional.length > 2)
44
+ throw new Error(`aeh operation start ${kind} accepts a subject and at most one project directory.`);
45
+ const root = path.resolve(parsed.positional[1] ?? ".");
46
+ await loadProjectConfig(root);
47
+ const payload = kind === "audit"
48
+ ? {
49
+ request: subject,
50
+ files: parsed.values("file"),
51
+ domains: parsed.values("domain"),
52
+ risk: parseRisk(parsed.value("risk")),
53
+ reviewers: parsed.values("reviewer")
54
+ }
55
+ : { taskId: subject, profile: parsed.value("profile") };
56
+ const record = await startDetachedOperation(root, kind, payload, {
57
+ nodeExecutable: process.execPath,
58
+ entryFile: path.resolve(process.argv[1])
59
+ });
60
+ printOperation(record, false);
61
+ }
62
+ async function runOperationExecute(argv) {
63
+ const operationId = argv[0];
64
+ if (!operationId)
65
+ throw new Error("aeh operation execute requires <operationId>.");
66
+ if (argv.length > 2)
67
+ throw new Error("aeh operation execute accepts <operationId> and at most one project directory.");
68
+ const root = path.resolve(argv[1] ?? ".");
69
+ const record = await executeOperation(root, operationId);
70
+ if (record.status === "FAILED")
71
+ process.exitCode = 1;
72
+ }
73
+ async function runOperationStatus(argv) {
74
+ const parsed = parseFlags(argv, new Set(), new Set(["json"]));
75
+ const operationId = parsed.positional[0];
76
+ if (!operationId)
77
+ throw new Error("aeh operation status requires <operationId>.");
78
+ if (parsed.positional.length > 2)
79
+ throw new Error("aeh operation status accepts <operationId> and at most one project directory.");
80
+ printOperation(await loadOperation(path.resolve(parsed.positional[1] ?? "."), operationId), parsed.flag("json"));
81
+ }
82
+ async function runOperationWait(argv) {
83
+ const parsed = parseFlags(argv, new Set(["timeout"]), new Set(["json"]));
84
+ const operationId = parsed.positional[0];
85
+ if (!operationId)
86
+ throw new Error("aeh operation wait requires <operationId>.");
87
+ if (parsed.positional.length > 2)
88
+ throw new Error("aeh operation wait accepts <operationId> and at most one project directory.");
89
+ const timeoutSeconds = Number(parsed.value("timeout") ?? "1800");
90
+ if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0)
91
+ throw new Error("--timeout must be a positive number of seconds.");
92
+ const record = await waitForOperation(path.resolve(parsed.positional[1] ?? "."), operationId, timeoutSeconds * 1000);
93
+ printOperation(record, parsed.flag("json"));
94
+ if (record.status === "FAILED")
95
+ process.exitCode = 1;
96
+ if (record.status === "CANCELLED")
97
+ process.exitCode = 130;
98
+ }
99
+ async function runOperationCancel(argv) {
100
+ if (!argv[0])
101
+ throw new Error("aeh operation cancel requires <operationId>.");
102
+ if (argv.length > 2)
103
+ throw new Error("aeh operation cancel accepts <operationId> and at most one project directory.");
104
+ printOperation(await cancelOperation(path.resolve(argv[1] ?? "."), argv[0]), false);
105
+ }
106
+ async function runOperationAwarePaseoAgents(argv) {
107
+ const parsed = parseFlags(argv, new Set(["task", "role", "kind", "status", "operation", "operation-kind", "phase"]), new Set(["json"]));
108
+ if (parsed.positional.length > 1)
109
+ throw new Error("aeh paseo agents accepts at most one project directory.");
110
+ const root = path.resolve(parsed.positional[0] ?? ".");
111
+ const config = await loadProjectConfig(root);
112
+ const labels = { "aeh.project": config.project.name };
113
+ for (const [flag, label] of [
114
+ ["task", "aeh.task"],
115
+ ["role", "aeh.role"],
116
+ ["kind", "aeh.kind"],
117
+ ["operation", "aeh.operation"],
118
+ ["operation-kind", "aeh.operation.kind"],
119
+ ["phase", "aeh.operation.phase"]
120
+ ])
121
+ if (parsed.value(flag))
122
+ labels[label] = parsed.value(flag);
123
+ const requestedStatus = parsed.value("status");
124
+ const agents = (await listManagedPaseoAgents(root, labels)).filter((agent) => !requestedStatus || agent.status === requestedStatus);
125
+ const view = agents.map((agent) => ({
126
+ id: agent.id,
127
+ status: agent.status ?? "unknown",
128
+ title: agent.title,
129
+ workspaceId: agent.workspaceId,
130
+ role: agent.labels?.["aeh.role"],
131
+ task: agent.labels?.["aeh.task"],
132
+ kind: agent.labels?.["aeh.kind"],
133
+ operation: agent.labels?.["aeh.operation"],
134
+ operationKind: agent.labels?.["aeh.operation.kind"],
135
+ phase: agent.labels?.["aeh.operation.phase"],
136
+ workspaceKind: agent.labels?.["aeh.workspace.kind"],
137
+ labels: agent.labels
138
+ }));
139
+ if (parsed.flag("json")) {
140
+ console.log(JSON.stringify(view, null, 2));
141
+ return;
142
+ }
143
+ if (!view.length) {
144
+ console.log("No matching active AEH Paseo agents.");
145
+ return;
146
+ }
147
+ for (const agent of view)
148
+ 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}` : ""}`);
149
+ }
150
+ function printOperation(record, json) {
151
+ if (json) {
152
+ console.log(JSON.stringify(record, null, 2));
153
+ return;
154
+ }
155
+ console.log(`operationId=${record.id}`);
156
+ console.log(`kind=${record.kind}`);
157
+ console.log(`status=${record.status}`);
158
+ console.log(`phase=${record.phase}`);
159
+ if (record.workspaceId)
160
+ console.log(`workspaceId=${record.workspaceId}`);
161
+ if (record.workspaceWarning)
162
+ console.log(`workspaceWarning=${record.workspaceWarning}`);
163
+ if (record.error)
164
+ console.log(`error=${record.error.split("\n", 1)[0]}`);
165
+ if (record.result)
166
+ console.log(`result=${JSON.stringify(record.result)}`);
167
+ }
168
+ function hasOperationFilter(argv) { return argv.some((value) => value === "--operation" || value === "--operation-kind" || value === "--phase"); }
169
+ function parseRisk(value) { if (!value)
170
+ return undefined; if (value === "low" || value === "medium" || value === "high")
171
+ return value; throw new Error(`Invalid risk '${value}'. Use low, medium or high.`); }
172
+ function parseFlags(argv, valueFlags, booleanFlags) {
173
+ const flags = new Map();
174
+ const positional = [];
175
+ for (let i = 0; i < argv.length; i += 1) {
176
+ const token = argv[i];
177
+ if (!token.startsWith("--")) {
178
+ positional.push(token);
179
+ continue;
180
+ }
181
+ const name = token.slice(2);
182
+ if (valueFlags.has(name)) {
183
+ const next = argv[++i];
184
+ if (!next || next.startsWith("--"))
185
+ throw new Error(`--${name} requires a value.`);
186
+ const list = flags.get(name) ?? [];
187
+ list.push(next);
188
+ flags.set(name, list);
189
+ continue;
190
+ }
191
+ if (!booleanFlags.has(name))
192
+ throw new Error(`Unknown option --${name}.`);
193
+ const list = flags.get(name) ?? [];
194
+ list.push(true);
195
+ flags.set(name, list);
196
+ }
197
+ return {
198
+ positional,
199
+ flag: (name) => flags.get(name)?.includes(true) ?? false,
200
+ value: (name) => flags.get(name)?.find((item) => typeof item === "string"),
201
+ values: (name) => (flags.get(name) ?? []).filter((item) => typeof item === "string")
202
+ };
203
+ }
204
+ //# sourceMappingURL=main.js.map
@@ -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 @@
1
+ export declare function serveOperationMcp(): Promise<void>;
@@ -0,0 +1,129 @@
1
+ import readline from "node:readline";
2
+ import path from "node:path";
3
+ import process from "node:process";
4
+ import { cancelOperation, startDetachedOperation } from "./controller.js";
5
+ import { loadOperation } from "./state.js";
6
+ const tools = [
7
+ {
8
+ name: "aeh_operation_start_audit",
9
+ description: "Start a detached Harness AUDIT for this lead's fixed project root and return its durable operation record immediately.",
10
+ inputSchema: {
11
+ type: "object",
12
+ properties: {
13
+ request: { type: "string" },
14
+ files: { type: "array", items: { type: "string" } },
15
+ domains: { type: "array", items: { type: "string" } },
16
+ risk: { type: "string", enum: ["low", "medium", "high"] },
17
+ reviewers: { type: "array", items: { type: "string" } }
18
+ },
19
+ required: ["request"],
20
+ additionalProperties: false
21
+ }
22
+ },
23
+ {
24
+ name: "aeh_operation_start_run",
25
+ description: "Start detached execution of an already prepared/sealed AEH task in this lead's fixed project root and return its operation record immediately.",
26
+ inputSchema: {
27
+ type: "object",
28
+ properties: { taskId: { type: "string" }, profile: { type: "string" } },
29
+ required: ["taskId"],
30
+ additionalProperties: false
31
+ }
32
+ },
33
+ {
34
+ name: "aeh_operation_status",
35
+ description: "Read durable status/phase/result for an AEH operation in this lead's fixed project root without blocking the caller.",
36
+ inputSchema: {
37
+ type: "object",
38
+ properties: { operationId: { type: "string" } },
39
+ required: ["operationId"],
40
+ additionalProperties: false
41
+ }
42
+ },
43
+ {
44
+ name: "aeh_operation_cancel",
45
+ description: "Cancel a running AEH operation in this lead's fixed project root and persist CANCELLED state.",
46
+ inputSchema: {
47
+ type: "object",
48
+ properties: { operationId: { type: "string" } },
49
+ required: ["operationId"],
50
+ additionalProperties: false
51
+ }
52
+ }
53
+ ];
54
+ export async function serveOperationMcp() {
55
+ const rl = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
56
+ for await (const line of rl) {
57
+ if (!line.trim())
58
+ continue;
59
+ let request;
60
+ try {
61
+ request = JSON.parse(line);
62
+ }
63
+ catch {
64
+ continue;
65
+ }
66
+ if (request.id === undefined || request.id === null)
67
+ continue;
68
+ try {
69
+ write({ jsonrpc: "2.0", id: request.id, result: await handle(request) });
70
+ }
71
+ catch (error) {
72
+ write({ jsonrpc: "2.0", id: request.id, error: { code: -32603, message: error instanceof Error ? error.message : String(error) } });
73
+ }
74
+ }
75
+ }
76
+ async function handle(request) {
77
+ if (request.method === "initialize") {
78
+ return {
79
+ protocolVersion: typeof request.params?.protocolVersion === "string" ? request.params.protocolVersion : "2025-06-18",
80
+ capabilities: { tools: {} },
81
+ serverInfo: { name: "aeh-operation-controller", version: "1" }
82
+ };
83
+ }
84
+ if (request.method === "ping")
85
+ return {};
86
+ if (request.method === "tools/list")
87
+ return { tools };
88
+ if (request.method === "tools/call")
89
+ return callTool(request.params ?? {});
90
+ throw new Error(`Unsupported MCP method: ${request.method ?? "<missing>"}`);
91
+ }
92
+ async function callTool(params) {
93
+ const name = string(params.name, "tool name");
94
+ const args = object(params.arguments);
95
+ const root = controlRoot();
96
+ if (name === "aeh_operation_start_audit") {
97
+ const payload = {
98
+ request: string(args.request, "request"),
99
+ files: stringArray(args.files),
100
+ domains: stringArray(args.domains),
101
+ risk: risk(args.risk),
102
+ reviewers: stringArray(args.reviewers)
103
+ };
104
+ return toolResult(await startDetachedOperation(root, "audit", payload, { nodeExecutable: process.execPath, entryFile: path.resolve(process.argv[1]) }));
105
+ }
106
+ if (name === "aeh_operation_start_run") {
107
+ const payload = { taskId: string(args.taskId, "taskId"), profile: optionalString(args.profile) };
108
+ return toolResult(await startDetachedOperation(root, "run", payload, { nodeExecutable: process.execPath, entryFile: path.resolve(process.argv[1]) }));
109
+ }
110
+ if (name === "aeh_operation_status")
111
+ return toolResult(await loadOperation(root, string(args.operationId, "operationId")));
112
+ if (name === "aeh_operation_cancel")
113
+ return toolResult(await cancelOperation(root, string(args.operationId, "operationId")));
114
+ throw new Error(`Unknown AEH operation tool '${name}'.`);
115
+ }
116
+ function controlRoot() { return path.resolve(process.env.AEH_CONTROL_ROOT?.trim() || process.cwd()); }
117
+ function toolResult(value) { return { content: [{ type: "text", text: JSON.stringify(value, null, 2) }], structuredContent: value }; }
118
+ function write(value) { process.stdout.write(`${JSON.stringify(value)}\n`); }
119
+ function object(value) { return value && typeof value === "object" && !Array.isArray(value) ? value : {}; }
120
+ function string(value, name) { if (typeof value !== "string" || !value.trim())
121
+ throw new Error(`${name} is required.`); return value.trim(); }
122
+ function optionalString(value) { return typeof value === "string" && value.trim() ? value.trim() : undefined; }
123
+ function stringArray(value) { if (value === undefined)
124
+ return undefined; if (!Array.isArray(value) || value.some((item) => typeof item !== "string"))
125
+ throw new Error("Expected an array of strings."); return value; }
126
+ function risk(value) { if (value === undefined)
127
+ return undefined; if (value === "low" || value === "medium" || value === "high")
128
+ return value; throw new Error("risk must be low, medium or high."); }
129
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/operations/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export type OperationKind = "audit" | "run";
2
+ export type OperationStatus = "QUEUED" | "RUNNING" | "SUCCEEDED" | "FAILED" | "CANCELLED";
3
+ export interface AuditOperationPayload {
4
+ request: string;
5
+ files?: string[];
6
+ domains?: string[];
7
+ risk?: "low" | "medium" | "high";
8
+ reviewers?: string[];
9
+ }
10
+ export interface RunOperationPayload {
11
+ taskId: string;
12
+ profile?: string;
13
+ }
14
+ export type OperationPayload = AuditOperationPayload | RunOperationPayload;
15
+ export interface OperationRecord {
16
+ version: 1;
17
+ id: string;
18
+ kind: OperationKind;
19
+ status: OperationStatus;
20
+ phase: string;
21
+ root: string;
22
+ payload: OperationPayload;
23
+ createdAt: string;
24
+ updatedAt: string;
25
+ startedAt?: string;
26
+ finishedAt?: string;
27
+ pid?: number;
28
+ workspaceId?: string;
29
+ workspaceWarning?: string;
30
+ cleanupWarnings?: string[];
31
+ result?: Record<string, unknown>;
32
+ error?: string;
33
+ }
34
+ export declare function operationFile(root: string, operationId: string): string;
35
+ export declare function loadOperation(root: string, operationId: string): Promise<OperationRecord>;
36
+ export declare function saveOperation(root: string, record: OperationRecord): Promise<void>;
37
+ export declare function patchOperation(root: string, operationId: string, patch: Partial<OperationRecord>): Promise<OperationRecord>;
38
+ export declare function currentOperationContext(): {
39
+ id?: string;
40
+ kind?: string;
41
+ workspaceId?: string;
42
+ };
43
+ export declare function updateCurrentOperationPhase(root: string, phase: string): Promise<void>;