agentic-engineering-harness 0.4.16 → 0.6.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 +159 -189
- package/dist/agents/config.js +2 -0
- package/dist/agents/config.js.map +1 -1
- package/dist/agents/outputContracts.d.ts +1 -0
- package/dist/agents/outputContracts.js +12 -0
- package/dist/agents/outputContracts.js.map +1 -1
- package/dist/agents/parallelism.d.ts +1 -0
- package/dist/agents/parallelism.js +101 -14
- package/dist/agents/parallelism.js.map +1 -1
- package/dist/agents/structuredOutput.js +16 -4
- package/dist/agents/structuredOutput.js.map +1 -1
- package/dist/agents/waveExecutor.d.ts +41 -0
- package/dist/agents/waveExecutor.js +208 -0
- package/dist/agents/waveExecutor.js.map +1 -0
- package/dist/audit/intent.d.ts +20 -0
- package/dist/audit/intent.js +42 -0
- package/dist/audit/intent.js.map +1 -0
- package/dist/audit/run.d.ts +46 -0
- package/dist/audit/run.js +147 -0
- package/dist/audit/run.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/config.js +28 -7
- package/dist/core/config.js.map +1 -1
- package/dist/core/controlPlane.d.ts +30 -0
- package/dist/core/controlPlane.js +131 -0
- package/dist/core/controlPlane.js.map +1 -0
- package/dist/core/init.js +13 -5
- package/dist/core/init.js.map +1 -1
- package/dist/core/run.d.ts +21 -0
- package/dist/core/run.js +104 -41
- package/dist/core/run.js.map +1 -1
- package/dist/core/types.d.ts +103 -1
- package/dist/distributed/queue.d.ts +11 -0
- package/dist/distributed/queue.js +140 -0
- package/dist/distributed/queue.js.map +1 -0
- package/dist/distributed/types.d.ts +34 -0
- package/dist/distributed/types.js +2 -0
- package/dist/distributed/types.js.map +1 -0
- package/dist/distributed/worker.d.ts +21 -0
- package/dist/distributed/worker.js +111 -0
- package/dist/distributed/worker.js.map +1 -0
- package/dist/entry.js +219 -46
- package/dist/entry.js.map +1 -1
- package/dist/evals/runner.js +2 -2
- package/dist/evals/runner.js.map +1 -1
- package/dist/evals/statistics.d.ts +38 -0
- package/dist/evals/statistics.js +88 -0
- package/dist/evals/statistics.js.map +1 -0
- package/dist/evidence/graph.d.ts +48 -0
- package/dist/evidence/graph.js +94 -0
- package/dist/evidence/graph.js.map +1 -0
- package/dist/issues/intake.d.ts +1 -1
- package/dist/mcp/benchmark.d.ts +24 -0
- package/dist/mcp/benchmark.js +82 -0
- package/dist/mcp/benchmark.js.map +1 -0
- package/dist/paseo/capabilities.d.ts +24 -0
- package/dist/paseo/capabilities.js +104 -0
- package/dist/paseo/capabilities.js.map +1 -0
- package/dist/paseo/context.d.ts +45 -0
- package/dist/paseo/context.js +153 -0
- package/dist/paseo/context.js.map +1 -0
- package/dist/paseo/start.d.ts +55 -0
- package/dist/paseo/start.js +138 -0
- package/dist/paseo/start.js.map +1 -0
- package/dist/policy/bundles.d.ts +27 -0
- package/dist/policy/bundles.js +129 -0
- package/dist/policy/bundles.js.map +1 -0
- package/dist/security/sandbox.d.ts +12 -0
- package/dist/security/sandbox.js +64 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/spec/openspec.d.ts +28 -0
- package/dist/spec/openspec.js +179 -0
- package/dist/spec/openspec.js.map +1 -0
- package/dist/toolchain/resolve.js +54 -90
- package/dist/toolchain/resolve.js.map +1 -1
- package/dist/utils/process.d.ts +1 -0
- package/dist/utils/process.js +6 -1
- package/dist/utils/process.js.map +1 -1
- package/dist/validators/graphify.js +28 -6
- package/dist/validators/graphify.js.map +1 -1
- package/dist/workers/agentPrompt.d.ts +6 -1
- package/dist/workers/agentPrompt.js +118 -34
- package/dist/workers/agentPrompt.js.map +1 -1
- package/dist/workers/paseo.js +53 -19
- package/dist/workers/paseo.js.map +1 -1
- package/dist/workers/podman.js +30 -8
- package/dist/workers/podman.js.map +1 -1
- package/docs/PASEO.md +56 -4
- package/docs/V0.5.1.md +129 -0
- package/docs/V0.5.2.md +180 -0
- package/docs/V0.5.md +116 -0
- package/docs/V0.6.md +148 -0
- package/package.json +3 -3
- package/presets/agents/orchestration.jsonc +37 -0
- package/schemas/project.schema.json +38 -8
- package/skills/engineering-workflow/SKILL.md +113 -81
- package/skills/openspec-authoring/SKILL.md +26 -0
- package/skills/paseo-orchestration/SKILL.md +38 -0
- package/templates/AGENTS.md +40 -15
- package/templates/agents.source.jsonc +1 -1
- package/templates/openspec-config.yaml +24 -0
- package/templates/project.yaml +79 -1
- package/templates/toolchain.yaml +19 -2
package/dist/core/types.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export type CheckStatus = "PASS" | "FAIL" | "SKIP" | "WARN";
|
|
2
2
|
export type TaskMode = "spec" | "quick";
|
|
3
3
|
export type ReviewSeverity = "critical" | "high" | "medium" | "low" | "note";
|
|
4
|
+
export type TaskRisk = "low" | "medium" | "high";
|
|
5
|
+
export type PaseoSessionPolicy = "fresh-on-start" | "reuse-compatible" | "resume-explicit";
|
|
4
6
|
export type ValidatorAdapter = "command" | "gherkin" | "graphify" | "opengrep" | "trivy" | "playwright" | "openapi" | "pact" | "mutation" | "property" | string;
|
|
5
7
|
export interface ValidationCommand {
|
|
6
8
|
id: string;
|
|
@@ -49,6 +51,15 @@ export interface McpServerConfig {
|
|
|
49
51
|
timeoutMs?: number;
|
|
50
52
|
codemode?: boolean;
|
|
51
53
|
}
|
|
54
|
+
export interface OrganizationPolicySource {
|
|
55
|
+
name: string;
|
|
56
|
+
path?: string;
|
|
57
|
+
url?: string;
|
|
58
|
+
sha256?: string;
|
|
59
|
+
required?: boolean;
|
|
60
|
+
publicKey?: string;
|
|
61
|
+
signature?: string;
|
|
62
|
+
}
|
|
52
63
|
export interface HarnessProjectConfig {
|
|
53
64
|
version: 1;
|
|
54
65
|
project: {
|
|
@@ -61,6 +72,11 @@ export interface HarnessProjectConfig {
|
|
|
61
72
|
required?: boolean;
|
|
62
73
|
findingsDir?: string;
|
|
63
74
|
};
|
|
75
|
+
controlPlane?: {
|
|
76
|
+
snapshotDir?: string;
|
|
77
|
+
include?: string[];
|
|
78
|
+
required?: boolean;
|
|
79
|
+
};
|
|
64
80
|
workflow?: {
|
|
65
81
|
quick?: {
|
|
66
82
|
maxFiles?: number;
|
|
@@ -74,6 +90,14 @@ export interface HarnessProjectConfig {
|
|
|
74
90
|
plannerAgent?: string;
|
|
75
91
|
autoHandoff?: boolean;
|
|
76
92
|
};
|
|
93
|
+
planning?: {
|
|
94
|
+
enabled?: boolean;
|
|
95
|
+
plannerAgent?: string;
|
|
96
|
+
worktreeIsolation?: boolean;
|
|
97
|
+
barrierValidation?: boolean;
|
|
98
|
+
maxWaveConcurrency?: number;
|
|
99
|
+
distributed?: boolean;
|
|
100
|
+
};
|
|
77
101
|
reviews?: {
|
|
78
102
|
enabled?: boolean;
|
|
79
103
|
reviewQuick?: boolean;
|
|
@@ -113,6 +137,22 @@ export interface HarnessProjectConfig {
|
|
|
113
137
|
timeoutSeconds?: number;
|
|
114
138
|
titlePrefix?: string;
|
|
115
139
|
};
|
|
140
|
+
interactive?: {
|
|
141
|
+
autoSetup?: boolean;
|
|
142
|
+
webUi?: boolean;
|
|
143
|
+
leadAgent?: string;
|
|
144
|
+
/** @deprecated Prefer sessionPolicy. */
|
|
145
|
+
reuseSession?: boolean;
|
|
146
|
+
sessionPolicy?: PaseoSessionPolicy;
|
|
147
|
+
usePaseoTools?: boolean;
|
|
148
|
+
context?: {
|
|
149
|
+
pressureThreshold?: number;
|
|
150
|
+
handoffThreshold?: number;
|
|
151
|
+
hardHandoffThreshold?: number;
|
|
152
|
+
};
|
|
153
|
+
stateDir?: string;
|
|
154
|
+
title?: string;
|
|
155
|
+
};
|
|
116
156
|
};
|
|
117
157
|
toolchain?: {
|
|
118
158
|
configPath?: string;
|
|
@@ -122,6 +162,15 @@ export interface HarnessProjectConfig {
|
|
|
122
162
|
};
|
|
123
163
|
mcp?: {
|
|
124
164
|
servers?: Record<string, McpServerConfig>;
|
|
165
|
+
benchmark?: {
|
|
166
|
+
enabled?: boolean;
|
|
167
|
+
resultsDir?: string;
|
|
168
|
+
repetitions?: number;
|
|
169
|
+
};
|
|
170
|
+
packs?: Record<string, {
|
|
171
|
+
servers: string[];
|
|
172
|
+
enabled?: boolean;
|
|
173
|
+
}>;
|
|
125
174
|
};
|
|
126
175
|
delivery?: {
|
|
127
176
|
stateDir?: string;
|
|
@@ -162,6 +211,34 @@ export interface HarnessProjectConfig {
|
|
|
162
211
|
graphPath?: string;
|
|
163
212
|
snapshotDir?: string;
|
|
164
213
|
refreshCommand?: string;
|
|
214
|
+
scheduling?: {
|
|
215
|
+
useEdges?: boolean;
|
|
216
|
+
maxGraphHops?: number;
|
|
217
|
+
maxSharedNodes?: number;
|
|
218
|
+
centralityConflictThreshold?: number;
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
evidence?: {
|
|
222
|
+
enabled?: boolean;
|
|
223
|
+
outputDir?: string;
|
|
224
|
+
requireComplete?: boolean;
|
|
225
|
+
};
|
|
226
|
+
organization?: {
|
|
227
|
+
policyBundles?: {
|
|
228
|
+
cacheDir?: string;
|
|
229
|
+
required?: boolean;
|
|
230
|
+
sources?: OrganizationPolicySource[];
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
distributed?: {
|
|
234
|
+
enabled?: boolean;
|
|
235
|
+
provider?: "filesystem" | "http" | string;
|
|
236
|
+
queueDir?: string;
|
|
237
|
+
endpoint?: string;
|
|
238
|
+
tokenEnv?: string;
|
|
239
|
+
pollIntervalMs?: number;
|
|
240
|
+
leaseSeconds?: number;
|
|
241
|
+
workerId?: string;
|
|
165
242
|
};
|
|
166
243
|
sdd?: {
|
|
167
244
|
specsDir?: string;
|
|
@@ -169,6 +246,11 @@ export interface HarnessProjectConfig {
|
|
|
169
246
|
reportsDir?: string;
|
|
170
247
|
repairsDir?: string;
|
|
171
248
|
runsDir?: string;
|
|
249
|
+
authoring?: {
|
|
250
|
+
provider?: "openspec" | "native" | string;
|
|
251
|
+
schema?: string;
|
|
252
|
+
managerAgent?: string;
|
|
253
|
+
};
|
|
172
254
|
};
|
|
173
255
|
validation?: {
|
|
174
256
|
baseRef?: string;
|
|
@@ -186,8 +268,20 @@ export interface HarnessProjectConfig {
|
|
|
186
268
|
provider?: "podman" | "docker" | "none" | string;
|
|
187
269
|
required?: boolean;
|
|
188
270
|
image?: string;
|
|
271
|
+
imageDigest?: string;
|
|
189
272
|
network?: boolean;
|
|
190
273
|
extraArgs?: string[];
|
|
274
|
+
readOnlyRoot?: boolean;
|
|
275
|
+
ephemeralHome?: boolean;
|
|
276
|
+
noNewPrivileges?: boolean;
|
|
277
|
+
capDropAll?: boolean;
|
|
278
|
+
pidsLimit?: number;
|
|
279
|
+
memory?: string;
|
|
280
|
+
cpus?: number;
|
|
281
|
+
tmpfs?: string[];
|
|
282
|
+
forceForRisks?: TaskRisk[];
|
|
283
|
+
environmentAllowlist?: string[];
|
|
284
|
+
credentialEnvAllowlist?: string[];
|
|
191
285
|
};
|
|
192
286
|
tools?: string[];
|
|
193
287
|
};
|
|
@@ -204,6 +298,8 @@ export interface HarnessProjectConfig {
|
|
|
204
298
|
corpusDir?: string;
|
|
205
299
|
resultsDir?: string;
|
|
206
300
|
workspacesDir?: string;
|
|
301
|
+
defaultRuns?: number;
|
|
302
|
+
confidenceLevel?: number;
|
|
207
303
|
};
|
|
208
304
|
provenance?: {
|
|
209
305
|
outputDir?: string;
|
|
@@ -237,6 +333,11 @@ export interface TaskIssueMetadata {
|
|
|
237
333
|
contentSha256: string;
|
|
238
334
|
snapshotPath: string;
|
|
239
335
|
}
|
|
336
|
+
export interface TaskAuthoringMetadata {
|
|
337
|
+
provider: string;
|
|
338
|
+
change: string;
|
|
339
|
+
sourceSha256: string;
|
|
340
|
+
}
|
|
240
341
|
export interface TaskContract {
|
|
241
342
|
version: 1;
|
|
242
343
|
mode?: TaskMode;
|
|
@@ -253,6 +354,7 @@ export interface TaskContract {
|
|
|
253
354
|
acceptance?: string;
|
|
254
355
|
issue?: string;
|
|
255
356
|
};
|
|
357
|
+
authoring?: TaskAuthoringMetadata;
|
|
256
358
|
issue?: TaskIssueMetadata;
|
|
257
359
|
git?: {
|
|
258
360
|
baseRef?: string;
|
|
@@ -266,7 +368,7 @@ export interface TaskContract {
|
|
|
266
368
|
routing?: {
|
|
267
369
|
intent?: string;
|
|
268
370
|
domains?: string[];
|
|
269
|
-
risk?:
|
|
371
|
+
risk?: TaskRisk;
|
|
270
372
|
agent?: string;
|
|
271
373
|
reviewers?: string[];
|
|
272
374
|
profile?: string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import type { HarnessProjectConfig } from "../core/types.js";
|
|
3
|
+
import type { ClaimedJob, DistributedDelegationJob, DistributedDelegationResult } from "./types.js";
|
|
4
|
+
export declare function submitDistributedJob(root: string, config: HarnessProjectConfig, job: DistributedDelegationJob): Promise<void>;
|
|
5
|
+
export declare function claimDistributedJob(root: string, config: HarnessProjectConfig, workerId: string): Promise<ClaimedJob | undefined>;
|
|
6
|
+
export declare function completeDistributedJob(root: string, config: HarnessProjectConfig, leaseId: string, result: DistributedDelegationResult): Promise<void>;
|
|
7
|
+
export declare function waitForDistributedResult(root: string, config: HarnessProjectConfig, jobId: string, timeoutMs?: number): Promise<DistributedDelegationResult>;
|
|
8
|
+
export declare function serveDistributedQueue(root: string, config: HarnessProjectConfig, options: {
|
|
9
|
+
port: number;
|
|
10
|
+
host?: string;
|
|
11
|
+
}): Promise<http.Server>;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import http from "node:http";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
export async function submitDistributedJob(root, config, job) {
|
|
6
|
+
if (config.distributed?.provider === "http")
|
|
7
|
+
return submitHttp(config, job);
|
|
8
|
+
const dirs = await queueDirs(root, config);
|
|
9
|
+
await fs.writeFile(path.join(dirs.pending, `${safe(job.id)}.json`), `${JSON.stringify(job, null, 2)}\n`, { flag: "wx" });
|
|
10
|
+
}
|
|
11
|
+
export async function claimDistributedJob(root, config, workerId) {
|
|
12
|
+
if (config.distributed?.provider === "http")
|
|
13
|
+
return claimHttp(config, workerId);
|
|
14
|
+
const dirs = await queueDirs(root, config);
|
|
15
|
+
await reclaimExpired(dirs);
|
|
16
|
+
const files = (await fs.readdir(dirs.pending)).filter((name) => name.endsWith(".json")).sort();
|
|
17
|
+
for (const file of files) {
|
|
18
|
+
const source = path.join(dirs.pending, file);
|
|
19
|
+
const leaseId = `${workerId}-${crypto.randomUUID()}`;
|
|
20
|
+
const destination = path.join(dirs.leased, `${safe(leaseId)}.json`);
|
|
21
|
+
try {
|
|
22
|
+
const raw = await fs.readFile(source, "utf8");
|
|
23
|
+
const job = JSON.parse(raw);
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
const envelope = { leaseId, leasedAt: new Date(now).toISOString(), expiresAt: new Date(now + (config.distributed?.leaseSeconds ?? 1800) * 1000).toISOString(), job };
|
|
26
|
+
await fs.rename(source, destination);
|
|
27
|
+
await fs.writeFile(destination, `${JSON.stringify(envelope, null, 2)}\n`);
|
|
28
|
+
return { job, leaseId };
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error?.code === "ENOENT")
|
|
32
|
+
continue;
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
export async function completeDistributedJob(root, config, leaseId, result) {
|
|
39
|
+
if (config.distributed?.provider === "http")
|
|
40
|
+
return completeHttp(config, leaseId, result);
|
|
41
|
+
const dirs = await queueDirs(root, config);
|
|
42
|
+
const leaseFile = path.join(dirs.leased, `${safe(leaseId)}.json`);
|
|
43
|
+
await fs.writeFile(path.join(dirs.completed, `${safe(result.jobId)}.json`), `${JSON.stringify(result, null, 2)}\n`);
|
|
44
|
+
await fs.rm(leaseFile, { force: true });
|
|
45
|
+
}
|
|
46
|
+
export async function waitForDistributedResult(root, config, jobId, timeoutMs) {
|
|
47
|
+
const timeout = timeoutMs ?? (config.orchestration?.worker?.timeoutSeconds ?? 1800) * 1000;
|
|
48
|
+
const deadline = Date.now() + timeout;
|
|
49
|
+
const interval = config.distributed?.pollIntervalMs ?? 1000;
|
|
50
|
+
while (Date.now() < deadline) {
|
|
51
|
+
const result = config.distributed?.provider === "http" ? await getHttpResult(config, jobId) : await getFilesystemResult(root, config, jobId);
|
|
52
|
+
if (result)
|
|
53
|
+
return result;
|
|
54
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
55
|
+
}
|
|
56
|
+
throw new Error(`Distributed job ${jobId} timed out after ${timeout}ms.`);
|
|
57
|
+
}
|
|
58
|
+
export async function serveDistributedQueue(root, config, options) {
|
|
59
|
+
if (config.distributed?.provider === "http")
|
|
60
|
+
throw new Error("Queue server must use its local filesystem backing store; configure provider=filesystem on the coordinator server.");
|
|
61
|
+
const token = config.distributed?.tokenEnv ? process.env[config.distributed.tokenEnv] : undefined;
|
|
62
|
+
const server = http.createServer(async (request, response) => {
|
|
63
|
+
try {
|
|
64
|
+
if (token && request.headers.authorization !== `Bearer ${token}`) {
|
|
65
|
+
json(response, 401, { error: "unauthorized" });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const url = new URL(request.url ?? "/", `http://${request.headers.host ?? "localhost"}`);
|
|
69
|
+
if (request.method === "POST" && url.pathname === "/v1/jobs") {
|
|
70
|
+
const job = await readJsonBody(request);
|
|
71
|
+
await submitDistributedJob(root, config, job);
|
|
72
|
+
json(response, 202, { id: job.id });
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (request.method === "POST" && url.pathname === "/v1/claim") {
|
|
76
|
+
const body = await readJsonBody(request);
|
|
77
|
+
const claimed = await claimDistributedJob(root, config, body.workerId);
|
|
78
|
+
json(response, claimed ? 200 : 204, claimed);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const complete = url.pathname.match(/^\/v1\/leases\/([^/]+)\/complete$/);
|
|
82
|
+
if (request.method === "POST" && complete) {
|
|
83
|
+
const result = await readJsonBody(request);
|
|
84
|
+
await completeDistributedJob(root, config, decodeURIComponent(complete[1]), result);
|
|
85
|
+
json(response, 200, { ok: true });
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const resultMatch = url.pathname.match(/^\/v1\/jobs\/([^/]+)$/);
|
|
89
|
+
if (request.method === "GET" && resultMatch) {
|
|
90
|
+
const result = await getFilesystemResult(root, config, decodeURIComponent(resultMatch[1]));
|
|
91
|
+
json(response, result ? 200 : 404, result ?? { error: "not-ready" });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
json(response, 404, { error: "not-found" });
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
json(response, 500, { error: String(error) });
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
await new Promise((resolve, reject) => { server.once("error", reject); server.listen(options.port, options.host ?? "127.0.0.1", () => resolve()); });
|
|
101
|
+
return server;
|
|
102
|
+
}
|
|
103
|
+
async function getFilesystemResult(root, config, jobId) { const dirs = await queueDirs(root, config); try {
|
|
104
|
+
return JSON.parse(await fs.readFile(path.join(dirs.completed, `${safe(jobId)}.json`), "utf8"));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return undefined;
|
|
108
|
+
} }
|
|
109
|
+
async function queueDirs(root, config) { const base = path.resolve(root, config.distributed?.queueDir ?? ".harness/distributed"); const dirs = { root: base, pending: path.join(base, "pending"), leased: path.join(base, "leased"), completed: path.join(base, "completed") }; await Promise.all([dirs.pending, dirs.leased, dirs.completed].map((dir) => fs.mkdir(dir, { recursive: true }))); return dirs; }
|
|
110
|
+
async function reclaimExpired(dirs) { const files = (await fs.readdir(dirs.leased)).filter((name) => name.endsWith(".json")); for (const file of files) {
|
|
111
|
+
try {
|
|
112
|
+
const envelope = JSON.parse(await fs.readFile(path.join(dirs.leased, file), "utf8"));
|
|
113
|
+
if (Date.parse(envelope.expiresAt) <= Date.now()) {
|
|
114
|
+
await fs.writeFile(path.join(dirs.pending, `${safe(envelope.job.id)}.json`), `${JSON.stringify(envelope.job, null, 2)}\n`, { flag: "wx" }).catch(() => undefined);
|
|
115
|
+
await fs.rm(path.join(dirs.leased, file), { force: true });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch { /* malformed lease stays visible for operator inspection */ }
|
|
119
|
+
} }
|
|
120
|
+
async function submitHttp(config, job) { const response = await request(config, "/v1/jobs", { method: "POST", body: JSON.stringify(job), headers: { "content-type": "application/json" } }); if (!response.ok)
|
|
121
|
+
throw new Error(`Distributed queue rejected job: HTTP ${response.status} ${await response.text()}`); }
|
|
122
|
+
async function claimHttp(config, workerId) { const response = await request(config, "/v1/claim", { method: "POST", body: JSON.stringify({ workerId }), headers: { "content-type": "application/json" } }); if (response.status === 204)
|
|
123
|
+
return undefined; if (!response.ok)
|
|
124
|
+
throw new Error(`Distributed queue claim failed: HTTP ${response.status}`); return await response.json(); }
|
|
125
|
+
async function completeHttp(config, leaseId, result) { const response = await request(config, `/v1/leases/${encodeURIComponent(leaseId)}/complete`, { method: "POST", body: JSON.stringify(result), headers: { "content-type": "application/json" } }); if (!response.ok)
|
|
126
|
+
throw new Error(`Distributed queue completion failed: HTTP ${response.status}`); }
|
|
127
|
+
async function getHttpResult(config, jobId) { const response = await request(config, `/v1/jobs/${encodeURIComponent(jobId)}`); if (response.status === 404)
|
|
128
|
+
return undefined; if (!response.ok)
|
|
129
|
+
throw new Error(`Distributed queue result lookup failed: HTTP ${response.status}`); return await response.json(); }
|
|
130
|
+
async function request(config, pathname, init = {}) { const endpoint = config.distributed?.endpoint; if (!endpoint)
|
|
131
|
+
throw new Error("distributed.endpoint is required for HTTP distributed queues."); const headers = new Headers(init.headers); const token = config.distributed?.tokenEnv ? process.env[config.distributed.tokenEnv] : undefined; if (token)
|
|
132
|
+
headers.set("authorization", `Bearer ${token}`); return fetch(new URL(pathname, endpoint).toString(), { ...init, headers }); }
|
|
133
|
+
async function readJsonBody(request) { const chunks = []; for await (const chunk of request)
|
|
134
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); return JSON.parse(Buffer.concat(chunks).toString("utf8")); }
|
|
135
|
+
function json(response, status, value) { response.statusCode = status; if (value === undefined) {
|
|
136
|
+
response.end();
|
|
137
|
+
return;
|
|
138
|
+
} response.setHeader("content-type", "application/json"); response.end(JSON.stringify(value)); }
|
|
139
|
+
function safe(value) { return value.replace(/[^A-Za-z0-9._-]/g, "-"); }
|
|
140
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/distributed/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { DelegationTask } from "../agents/outputContracts.js";
|
|
3
|
+
import type { HarnessProjectConfig, TaskContract, WorkerSession } from "../core/types.js";
|
|
4
|
+
export interface DistributedDelegationJob {
|
|
5
|
+
version: 1;
|
|
6
|
+
id: string;
|
|
7
|
+
parentTaskId: string;
|
|
8
|
+
createdAt: string;
|
|
9
|
+
repositoryUrl: string;
|
|
10
|
+
baseRef: string;
|
|
11
|
+
controllerSha256?: string;
|
|
12
|
+
priorPatches: string[];
|
|
13
|
+
task: DelegationTask;
|
|
14
|
+
contract: TaskContract;
|
|
15
|
+
selection: AgentExecutionSelection;
|
|
16
|
+
config: HarnessProjectConfig;
|
|
17
|
+
prompt: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DistributedDelegationResult {
|
|
20
|
+
version: 1;
|
|
21
|
+
jobId: string;
|
|
22
|
+
workerId: string;
|
|
23
|
+
startedAt: string;
|
|
24
|
+
finishedAt: string;
|
|
25
|
+
status: "PASS" | "FAIL";
|
|
26
|
+
session: WorkerSession;
|
|
27
|
+
changedFiles: string[];
|
|
28
|
+
patch: string;
|
|
29
|
+
message?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ClaimedJob {
|
|
32
|
+
job: DistributedDelegationJob;
|
|
33
|
+
leaseId: string;
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/distributed/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { DelegationTask } from "../agents/outputContracts.js";
|
|
3
|
+
import type { ControlPlaneSnapshot } from "../core/controlPlane.js";
|
|
4
|
+
import type { HarnessProjectConfig, TaskContract } from "../core/types.js";
|
|
5
|
+
import type { DistributedDelegationResult } from "./types.js";
|
|
6
|
+
export declare function dispatchDistributedDelegation(input: {
|
|
7
|
+
root: string;
|
|
8
|
+
config: HarnessProjectConfig;
|
|
9
|
+
contract: TaskContract;
|
|
10
|
+
task: DelegationTask;
|
|
11
|
+
selection: AgentExecutionSelection;
|
|
12
|
+
prompt: string;
|
|
13
|
+
priorPatches?: string[];
|
|
14
|
+
controller?: ControlPlaneSnapshot;
|
|
15
|
+
}): Promise<DistributedDelegationResult>;
|
|
16
|
+
export declare function runDistributedWorkerOnce(root: string, config: HarnessProjectConfig, workerId?: string): Promise<DistributedDelegationResult | undefined>;
|
|
17
|
+
export declare function runDistributedWorkerLoop(root: string, config: HarnessProjectConfig, options?: {
|
|
18
|
+
workerId?: string;
|
|
19
|
+
once?: boolean;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import YAML from "yaml";
|
|
6
|
+
import { minimatch } from "minimatch";
|
|
7
|
+
import { executeAgentPrompt } from "../workers/agentPrompt.js";
|
|
8
|
+
import { runProcess } from "../utils/process.js";
|
|
9
|
+
import { claimDistributedJob, completeDistributedJob, submitDistributedJob, waitForDistributedResult } from "./queue.js";
|
|
10
|
+
export async function dispatchDistributedDelegation(input) {
|
|
11
|
+
if (!input.config.distributed?.enabled)
|
|
12
|
+
throw new Error("Distributed execution is not enabled.");
|
|
13
|
+
const remote = await runProcess("git remote get-url origin", { cwd: input.root, timeoutMs: 10_000 });
|
|
14
|
+
if (remote.exitCode !== 0 || !remote.stdout.trim())
|
|
15
|
+
throw new Error("Distributed execution requires a Git remote named origin.");
|
|
16
|
+
const base = await runProcess("git rev-parse HEAD", { cwd: input.root, timeoutMs: 10_000 });
|
|
17
|
+
if (base.exitCode !== 0)
|
|
18
|
+
throw new Error("Distributed execution could not resolve the workspace HEAD.");
|
|
19
|
+
const selection = { ...input.selection, transport: "direct" };
|
|
20
|
+
const job = {
|
|
21
|
+
version: 1,
|
|
22
|
+
id: `${safe(input.contract.task.id)}-${safe(input.task.id)}-${crypto.randomUUID()}`,
|
|
23
|
+
parentTaskId: input.contract.task.id,
|
|
24
|
+
createdAt: new Date().toISOString(),
|
|
25
|
+
repositoryUrl: remote.stdout.trim(),
|
|
26
|
+
baseRef: base.stdout.trim(),
|
|
27
|
+
controllerSha256: input.controller?.compositeSha256,
|
|
28
|
+
priorPatches: input.priorPatches ?? [],
|
|
29
|
+
task: input.task,
|
|
30
|
+
contract: input.contract,
|
|
31
|
+
selection,
|
|
32
|
+
config: sanitizeRemoteConfig(input.config),
|
|
33
|
+
prompt: input.prompt
|
|
34
|
+
};
|
|
35
|
+
await submitDistributedJob(input.root, input.config, job);
|
|
36
|
+
return waitForDistributedResult(input.root, input.config, job.id);
|
|
37
|
+
}
|
|
38
|
+
export async function runDistributedWorkerOnce(root, config, workerId = config.distributed?.workerId ?? `worker-${process.pid}`) {
|
|
39
|
+
const claimed = await claimDistributedJob(root, config, workerId);
|
|
40
|
+
if (!claimed)
|
|
41
|
+
return undefined;
|
|
42
|
+
const result = await executeClaimedJob(claimed.job, workerId);
|
|
43
|
+
await completeDistributedJob(root, config, claimed.leaseId, result);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
export async function runDistributedWorkerLoop(root, config, options = {}) {
|
|
47
|
+
const workerId = options.workerId ?? config.distributed?.workerId ?? `worker-${process.pid}`;
|
|
48
|
+
const interval = config.distributed?.pollIntervalMs ?? 1000;
|
|
49
|
+
do {
|
|
50
|
+
if (options.signal?.aborted)
|
|
51
|
+
return;
|
|
52
|
+
const result = await runDistributedWorkerOnce(root, config, workerId);
|
|
53
|
+
if (options.once)
|
|
54
|
+
return;
|
|
55
|
+
if (!result)
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
57
|
+
} while (!options.signal?.aborted);
|
|
58
|
+
}
|
|
59
|
+
async function executeClaimedJob(job, workerId) {
|
|
60
|
+
const startedAt = new Date().toISOString();
|
|
61
|
+
const worktree = await fs.mkdtemp(path.join(os.tmpdir(), `aeh-remote-${safe(job.id)}-`));
|
|
62
|
+
let session = { provider: job.selection.runtimeAdapter, model: job.selection.modelName, logicalAgent: job.selection.logicalAgent, runtime: job.selection.runtimeName, exitCode: 1, stdout: "", stderr: "remote worker did not start" };
|
|
63
|
+
try {
|
|
64
|
+
const clone = await runProcess(`git clone --quiet --no-checkout ${quote(job.repositoryUrl)} ${quote(worktree)}`, { cwd: os.tmpdir(), timeoutMs: 300_000, toolchain: false });
|
|
65
|
+
if (clone.exitCode !== 0)
|
|
66
|
+
return failure(job, workerId, startedAt, session, `clone failed: ${clone.stderr || clone.stdout}`);
|
|
67
|
+
const checkout = await runProcess(`git checkout --quiet --detach ${quote(job.baseRef)}`, { cwd: worktree, timeoutMs: 120_000 });
|
|
68
|
+
if (checkout.exitCode !== 0)
|
|
69
|
+
return failure(job, workerId, startedAt, session, `checkout failed: ${checkout.stderr || checkout.stdout}`);
|
|
70
|
+
for (const patch of job.priorPatches ?? []) {
|
|
71
|
+
const applied = await runProcess("git apply --binary -", { cwd: worktree, timeoutMs: 60_000, stdin: patch });
|
|
72
|
+
if (applied.exitCode !== 0)
|
|
73
|
+
return failure(job, workerId, startedAt, session, `prior wave patch failed: ${applied.stderr || applied.stdout}`);
|
|
74
|
+
}
|
|
75
|
+
const contractDir = job.config.sdd?.contractsDir ?? ".harness/contracts";
|
|
76
|
+
const contractFile = path.join(worktree, contractDir, `${job.contract.task.id}.yaml`);
|
|
77
|
+
await fs.mkdir(path.dirname(contractFile), { recursive: true });
|
|
78
|
+
await fs.writeFile(contractFile, YAML.stringify(job.contract));
|
|
79
|
+
const baseline = await runProcess("git add -A && git -c user.name=aeh -c user.email=aeh@localhost commit --no-gpg-sign --allow-empty -m 'aeh distributed baseline'", { cwd: worktree, timeoutMs: 60_000 });
|
|
80
|
+
if (baseline.exitCode !== 0)
|
|
81
|
+
return failure(job, workerId, startedAt, session, `baseline commit failed: ${baseline.stderr || baseline.stdout}`);
|
|
82
|
+
session = await executeAgentPrompt(worktree, job.config, job.contract, job.selection, job.prompt);
|
|
83
|
+
if (session.exitCode !== 0)
|
|
84
|
+
return failure(job, workerId, startedAt, session, `agent exited with ${session.exitCode}`);
|
|
85
|
+
const status = await runProcess("git status --porcelain", { cwd: worktree, timeoutMs: 30_000 });
|
|
86
|
+
const untracked = status.stdout.split(/\r?\n/).filter((line) => line.startsWith("?? ")).map((line) => line.slice(3).trim()).filter(Boolean);
|
|
87
|
+
if (untracked.length)
|
|
88
|
+
await runProcess(`git add -N -- ${untracked.map(quote).join(" ")}`, { cwd: worktree, timeoutMs: 30_000 });
|
|
89
|
+
const names = await runProcess("git diff --name-only HEAD", { cwd: worktree, timeoutMs: 30_000 });
|
|
90
|
+
const changedFiles = names.stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
91
|
+
const escaped = changedFiles.filter((file) => !job.task.scope.some((scope) => matches(file, scope)));
|
|
92
|
+
if (escaped.length)
|
|
93
|
+
return failure(job, workerId, startedAt, session, `remote task escaped scope: ${escaped.join(", ")}`, changedFiles);
|
|
94
|
+
const diff = await runProcess("git diff --binary --no-ext-diff HEAD", { cwd: worktree, timeoutMs: 60_000 });
|
|
95
|
+
if (diff.exitCode !== 0)
|
|
96
|
+
return failure(job, workerId, startedAt, session, diff.stderr || "unable to capture patch", changedFiles);
|
|
97
|
+
return { version: 1, jobId: job.id, workerId, startedAt, finishedAt: new Date().toISOString(), status: "PASS", session, changedFiles, patch: diff.stdout };
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
return failure(job, workerId, startedAt, session, String(error));
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
await fs.rm(worktree, { recursive: true, force: true }).catch(() => undefined);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function failure(job, workerId, startedAt, session, message, changedFiles = []) { return { version: 1, jobId: job.id, workerId, startedAt, finishedAt: new Date().toISOString(), status: "FAIL", session: { ...session, exitCode: session.exitCode || 1, stderr: [session.stderr, message].filter(Boolean).join("\n") }, changedFiles, patch: "", message }; }
|
|
107
|
+
function sanitizeRemoteConfig(config) { return { ...config, delivery: { ...config.delivery, github: { ...config.delivery?.github, enabled: false }, paseo: { ...config.delivery?.paseo, enabled: false, autoUseWorkspace: false } }, distributed: { ...config.distributed, enabled: false }, telemetry: { ...config.telemetry, exporter: "none" }, security: { ...config.security, sandbox: { ...config.security?.sandbox, required: false, forceForRisks: [] } } }; }
|
|
108
|
+
function matches(file, scope) { return scope === "**" || minimatch(file, scope, { dot: true }) || file.startsWith(scope.split(/[?*\[]/, 1)[0].replace(/\/+$/, "")); }
|
|
109
|
+
function safe(value) { return value.replace(/[^A-Za-z0-9._-]/g, "-"); }
|
|
110
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
111
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/distributed/worker.ts"],"names":[],"mappings":"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"}
|