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
|
@@ -4,9 +4,13 @@ import { minimatch } from "minimatch";
|
|
|
4
4
|
export async function planParallelism(root, config, taskId, tasks) {
|
|
5
5
|
const graph = await loadBeforeGraph(root, config, taskId);
|
|
6
6
|
const conflicts = [];
|
|
7
|
+
const taskNodes = {};
|
|
8
|
+
if (graph)
|
|
9
|
+
for (const task of tasks)
|
|
10
|
+
taskNodes[task.id] = [...nodesForScopes(task.scope, graph)].sort();
|
|
7
11
|
for (let i = 0; i < tasks.length; i += 1)
|
|
8
12
|
for (let j = i + 1; j < tasks.length; j += 1) {
|
|
9
|
-
const reasons = conflictReasons(tasks[i], tasks[j], graph);
|
|
13
|
+
const reasons = conflictReasons(tasks[i], tasks[j], graph, taskNodes, config);
|
|
10
14
|
if (reasons.length)
|
|
11
15
|
conflicts.push({ a: tasks[i].id, b: tasks[j].id, reasons });
|
|
12
16
|
}
|
|
@@ -30,21 +34,104 @@ export async function planParallelism(root, config, taskId, tasks) {
|
|
|
30
34
|
remaining.delete(task.id);
|
|
31
35
|
}
|
|
32
36
|
}
|
|
33
|
-
return { taskId, waves, conflicts, graphUsed: Boolean(graph) };
|
|
37
|
+
return { taskId, waves, conflicts, graphUsed: Boolean(graph), taskNodes: graph ? taskNodes : undefined };
|
|
34
38
|
}
|
|
35
|
-
function conflictReasons(a, b, graph
|
|
36
|
-
reasons
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
function conflictReasons(a, b, graph, taskNodes, config) {
|
|
40
|
+
const reasons = [];
|
|
41
|
+
if (a.dependencies.includes(b.id) || b.dependencies.includes(a.id))
|
|
42
|
+
reasons.push("dependency");
|
|
43
|
+
if (scopesOverlap(a.scope, b.scope))
|
|
44
|
+
reasons.push("scope-overlap");
|
|
45
|
+
if (!graph)
|
|
46
|
+
return reasons;
|
|
47
|
+
if (shareCommunity(new Set(taskNodes[a.id] ?? []), new Set(taskNodes[b.id] ?? []), graph))
|
|
48
|
+
reasons.push("graphify-community-overlap");
|
|
49
|
+
const scheduling = config.codeIntelligence?.scheduling;
|
|
50
|
+
if (scheduling?.useEdges !== false) {
|
|
51
|
+
const left = new Set(taskNodes[a.id] ?? []);
|
|
52
|
+
const right = new Set(taskNodes[b.id] ?? []);
|
|
53
|
+
const shared = [...left].filter((node) => right.has(node));
|
|
54
|
+
if (shared.length > (scheduling?.maxSharedNodes ?? 0))
|
|
55
|
+
reasons.push(`graphify-shared-node:${shared.length}`);
|
|
56
|
+
const hops = Math.max(1, scheduling?.maxGraphHops ?? 1);
|
|
57
|
+
const distance = minimumDistance(left, right, graph, hops);
|
|
58
|
+
if (distance !== undefined && distance <= hops)
|
|
59
|
+
reasons.push(`graphify-nearby:${distance}-hop`);
|
|
60
|
+
const threshold = scheduling?.centralityConflictThreshold ?? 0.35;
|
|
61
|
+
if (distance !== undefined && highCentrality([...left, ...right], graph, threshold))
|
|
62
|
+
reasons.push("graphify-centrality-risk");
|
|
63
|
+
}
|
|
64
|
+
return [...new Set(reasons)];
|
|
65
|
+
}
|
|
66
|
+
function scopesOverlap(a, b) { return a.some((left) => b.some((right) => left === right || minimatch(left, right, { dot: true }) || minimatch(right, left, { dot: true }) || nonEmptyPrefixOverlap(staticPrefix(left), staticPrefix(right)))); }
|
|
67
|
+
function nonEmptyPrefixOverlap(left, right) { return Boolean(left && right) && (left.startsWith(right) || right.startsWith(left)); }
|
|
40
68
|
function staticPrefix(pattern) { return pattern.split(/[?*\[]/, 1)[0].replace(/\/+$/, ""); }
|
|
41
|
-
function
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
69
|
+
function nodesForScopes(scopes, graph) {
|
|
70
|
+
const result = new Set();
|
|
71
|
+
const files = graph.nodeFiles ?? {};
|
|
72
|
+
for (const node of graph.nodes ?? []) {
|
|
73
|
+
const file = files[node];
|
|
74
|
+
if (file && scopes.some((scope) => pathMatches(file, scope))) {
|
|
75
|
+
result.add(node);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (scopes.some((scope) => { const prefix = staticPrefix(scope); return Boolean(prefix) && node.toLowerCase().includes(prefix.toLowerCase()); }))
|
|
79
|
+
result.add(node);
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
function pathMatches(file, scope) { return minimatch(file, scope, { dot: true }) || file.startsWith(staticPrefix(scope)); }
|
|
84
|
+
function shareCommunity(a, b, graph) { const communities = graph.communities ?? {}; const left = new Set([...a].map((node) => communities[node]).filter(Boolean)); return [...b].some((node) => Boolean(communities[node] && left.has(communities[node]))); }
|
|
85
|
+
function adjacency(graph) {
|
|
86
|
+
const map = new Map();
|
|
87
|
+
const add = (from, to) => { const set = map.get(from) ?? new Set(); set.add(to); map.set(from, set); };
|
|
88
|
+
for (const edge of graph.edgePairs ?? []) {
|
|
89
|
+
add(edge.from, edge.to);
|
|
90
|
+
add(edge.to, edge.from);
|
|
91
|
+
}
|
|
92
|
+
if (!(graph.edgePairs?.length))
|
|
93
|
+
for (const text of graph.edges ?? []) {
|
|
94
|
+
const match = text.match(/^(.*?)\s+--.*?-->\s+(.*)$/);
|
|
95
|
+
if (match) {
|
|
96
|
+
add(match[1], match[2]);
|
|
97
|
+
add(match[2], match[1]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return map;
|
|
101
|
+
}
|
|
102
|
+
function minimumDistance(left, right, graph, maxHops) {
|
|
103
|
+
if ([...left].some((node) => right.has(node)))
|
|
104
|
+
return 0;
|
|
105
|
+
const adj = adjacency(graph);
|
|
106
|
+
let frontier = new Set(left);
|
|
107
|
+
const visited = new Set(left);
|
|
108
|
+
for (let distance = 1; distance <= maxHops; distance += 1) {
|
|
109
|
+
const next = new Set();
|
|
110
|
+
for (const node of frontier)
|
|
111
|
+
for (const neighbor of adj.get(node) ?? []) {
|
|
112
|
+
if (right.has(neighbor))
|
|
113
|
+
return distance;
|
|
114
|
+
if (!visited.has(neighbor)) {
|
|
115
|
+
visited.add(neighbor);
|
|
116
|
+
next.add(neighbor);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
frontier = next;
|
|
120
|
+
if (!frontier.size)
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
function highCentrality(nodes, graph, threshold) {
|
|
126
|
+
const explicit = graph.centrality ?? {};
|
|
127
|
+
if (nodes.some((node) => (explicit[node] ?? 0) >= threshold))
|
|
128
|
+
return true;
|
|
129
|
+
if (Object.keys(explicit).length)
|
|
130
|
+
return false;
|
|
131
|
+
const adj = adjacency(graph);
|
|
132
|
+
const denominator = Math.max(1, (graph.nodes?.length ?? adj.size) - 1);
|
|
133
|
+
return nodes.some((node) => (adj.get(node)?.size ?? 0) / denominator >= threshold);
|
|
134
|
+
}
|
|
48
135
|
async function loadBeforeGraph(root, config, taskId) { const dir = path.resolve(root, config.codeIntelligence?.snapshotDir ?? ".harness/graph"); try {
|
|
49
136
|
return JSON.parse(await fs.readFile(path.join(dir, taskId, "before.json"), "utf8"));
|
|
50
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallelism.js","sourceRoot":"","sources":["../../src/agents/parallelism.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"parallelism.js","sourceRoot":"","sources":["../../src/agents/parallelism.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,22 @@ export function extractMarkedJson(stdout, stderr = "") {
|
|
|
2
2
|
const candidates = [];
|
|
3
3
|
collectCandidateStrings(stdout, candidates);
|
|
4
4
|
collectCandidateStrings(stderr, candidates);
|
|
5
|
-
for (const candidate of candidates.reverse()) {
|
|
5
|
+
for (const candidate of [...candidates].reverse()) {
|
|
6
6
|
const marker = "AEH_RESULT_JSON=";
|
|
7
7
|
const index = candidate.lastIndexOf(marker);
|
|
8
8
|
if (index < 0)
|
|
9
9
|
continue;
|
|
10
|
-
const
|
|
11
|
-
const parsed = parseJsonPrefix(raw);
|
|
10
|
+
const parsed = parseJsonPrefix(candidate.slice(index + marker.length).trim());
|
|
12
11
|
if (parsed !== undefined)
|
|
13
12
|
return parsed;
|
|
14
13
|
}
|
|
15
|
-
|
|
14
|
+
const stdoutJson = parseWholeJson(stdout.trim());
|
|
15
|
+
if (stdoutJson !== undefined)
|
|
16
|
+
return stdoutJson;
|
|
17
|
+
const stderrJson = parseWholeJson(stderr.trim());
|
|
18
|
+
if (stderrJson !== undefined)
|
|
19
|
+
return stderrJson;
|
|
20
|
+
throw new Error("Agent output did not contain valid native JSON or an AEH_RESULT_JSON=<json> marker.");
|
|
16
21
|
}
|
|
17
22
|
function collectCandidateStrings(text, output) {
|
|
18
23
|
output.push(text);
|
|
@@ -51,4 +56,11 @@ function parseJsonPrefix(raw) {
|
|
|
51
56
|
}
|
|
52
57
|
return undefined;
|
|
53
58
|
}
|
|
59
|
+
function parseWholeJson(raw) { if (!raw)
|
|
60
|
+
return undefined; try {
|
|
61
|
+
return JSON.parse(raw);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
} }
|
|
54
66
|
//# sourceMappingURL=structuredOutput.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structuredOutput.js","sourceRoot":"","sources":["../../src/agents/structuredOutput.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAM,GAAG,EAAE;IAC3D,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5C,uBAAuB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5C,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"structuredOutput.js","sourceRoot":"","sources":["../../src/agents/structuredOutput.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AgentExecutionSelection, ResolvedAgentTopology } from "./types.js";
|
|
2
|
+
import { type ParallelismPlan } from "./parallelism.js";
|
|
3
|
+
import { type DelegationTask, type PlannerOutput } from "./outputContracts.js";
|
|
4
|
+
import type { ControlPlaneSnapshot } from "../core/controlPlane.js";
|
|
5
|
+
import type { HarnessProjectConfig, TaskContract, ValidationReport, WorkerSession } from "../core/types.js";
|
|
6
|
+
export interface DelegationExecutionResult {
|
|
7
|
+
task: DelegationTask;
|
|
8
|
+
session: WorkerSession;
|
|
9
|
+
changedFiles: string[];
|
|
10
|
+
patch: string;
|
|
11
|
+
status: "PASS" | "FAIL";
|
|
12
|
+
message?: string;
|
|
13
|
+
distributed?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface WaveExecutionSummary {
|
|
16
|
+
wave: number;
|
|
17
|
+
taskIds: string[];
|
|
18
|
+
status: "PASS" | "FAIL";
|
|
19
|
+
results: DelegationExecutionResult[];
|
|
20
|
+
barrier?: ValidationReport;
|
|
21
|
+
}
|
|
22
|
+
export interface PlannerWaveResult {
|
|
23
|
+
used: boolean;
|
|
24
|
+
plan?: PlannerOutput;
|
|
25
|
+
schedule?: ParallelismPlan;
|
|
26
|
+
waves: WaveExecutionSummary[];
|
|
27
|
+
sessions: WorkerSession[];
|
|
28
|
+
aggregateSession?: WorkerSession;
|
|
29
|
+
report?: ValidationReport;
|
|
30
|
+
}
|
|
31
|
+
export declare function executePlannerWaves(input: {
|
|
32
|
+
root: string;
|
|
33
|
+
stateRoot: string;
|
|
34
|
+
config: HarnessProjectConfig;
|
|
35
|
+
contract: TaskContract;
|
|
36
|
+
topology: ResolvedAgentTopology;
|
|
37
|
+
implementationSelection: AgentExecutionSelection;
|
|
38
|
+
controller?: ControlPlaneSnapshot;
|
|
39
|
+
revalidate: () => Promise<ValidationReport>;
|
|
40
|
+
}): Promise<PlannerWaveResult>;
|
|
41
|
+
export declare function validatePlannerWavePlan(contract: TaskContract, topology: ResolvedAgentTopology, plan: PlannerOutput): string[];
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { minimatch } from "minimatch";
|
|
5
|
+
import { executionSelectionForAgent } from "./routing.js";
|
|
6
|
+
import { planParallelism } from "./parallelism.js";
|
|
7
|
+
import { plannerOutputSchema } from "./outputContracts.js";
|
|
8
|
+
import { extractMarkedJson } from "./structuredOutput.js";
|
|
9
|
+
import { validateExecutionCapabilities } from "./permissions.js";
|
|
10
|
+
import { materializeControlPlaneSnapshot } from "../core/controlPlane.js";
|
|
11
|
+
import { executeAgentPrompt } from "../workers/agentPrompt.js";
|
|
12
|
+
import { dispatchDistributedDelegation } from "../distributed/worker.js";
|
|
13
|
+
import { enforceSandboxPolicy } from "../security/sandbox.js";
|
|
14
|
+
import { runProcess } from "../utils/process.js";
|
|
15
|
+
import { recordEvent } from "../telemetry/events.js";
|
|
16
|
+
export async function executePlannerWaves(input) {
|
|
17
|
+
const planning = input.config.workflow?.planning;
|
|
18
|
+
if (planning?.enabled === false || input.contract.mode === "quick")
|
|
19
|
+
return { used: false, waves: [], sessions: [] };
|
|
20
|
+
const planner = findPlanner(input.topology, planning?.plannerAgent);
|
|
21
|
+
if (!planner)
|
|
22
|
+
return { used: false, waves: [], sessions: [] };
|
|
23
|
+
const plannerSelection = executionSelectionForAgent(input.topology, planner);
|
|
24
|
+
const plannerSession = await executeAgentPrompt(input.root, input.config, input.contract, plannerSelection, buildPlannerPrompt(input.contract), { outputContract: "planner" });
|
|
25
|
+
const sessions = [plannerSession];
|
|
26
|
+
if (plannerSession.exitCode !== 0)
|
|
27
|
+
return { used: true, waves: [], sessions, aggregateSession: aggregate(sessions, 1, "Planner runtime failed.") };
|
|
28
|
+
let plan;
|
|
29
|
+
try {
|
|
30
|
+
plan = plannerOutputSchema.parse(extractMarkedJson(plannerSession.stdout, plannerSession.stderr));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return { used: true, waves: [], sessions, aggregateSession: aggregate(sessions, 1, `Invalid planner output: ${String(error)}`) };
|
|
34
|
+
}
|
|
35
|
+
const planIssues = validatePlannerWavePlan(input.contract, input.topology, plan);
|
|
36
|
+
if (planIssues.length)
|
|
37
|
+
return { used: true, plan, waves: [], sessions, aggregateSession: aggregate(sessions, 1, `Planner contract rejected: ${planIssues.join("; ")}`) };
|
|
38
|
+
if (!plan.tasks.length)
|
|
39
|
+
return { used: false, plan, waves: [], sessions };
|
|
40
|
+
const schedule = await planParallelism(input.root, input.config, input.contract.task.id, plan.tasks);
|
|
41
|
+
await recordEvent(input.stateRoot, input.config, "harness.plan.ready", { taskId: input.contract.task.id, tasks: plan.tasks.length, waves: schedule.waves.length, conflicts: schedule.conflicts.length, graphUsed: schedule.graphUsed, distributed: planning?.distributed === true && input.config.distributed?.enabled === true });
|
|
42
|
+
const acceptedPatches = [];
|
|
43
|
+
const waveSummaries = [];
|
|
44
|
+
let finalReport;
|
|
45
|
+
for (let index = 0; index < schedule.waves.length; index += 1) {
|
|
46
|
+
const ids = schedule.waves[index];
|
|
47
|
+
const tasks = ids.map((id) => plan.tasks.find((task) => task.id === id)).filter(Boolean);
|
|
48
|
+
const results = await mapLimit(tasks, planning?.maxWaveConcurrency ?? tasks.length, (task) => executeDelegation({ ...input, task, priorPatches: acceptedPatches }));
|
|
49
|
+
sessions.push(...results.map((result) => result.session));
|
|
50
|
+
if (results.some((result) => result.status === "FAIL")) {
|
|
51
|
+
const summary = { wave: index + 1, taskIds: ids, status: "FAIL", results };
|
|
52
|
+
waveSummaries.push(summary);
|
|
53
|
+
await recordEvent(input.stateRoot, input.config, "harness.wave.finish", { taskId: input.contract.task.id, wave: index + 1, status: "FAIL", tasks: ids });
|
|
54
|
+
return { used: true, plan, schedule, waves: waveSummaries, sessions, aggregateSession: aggregate(sessions, 1, `Wave ${index + 1} failed.`) };
|
|
55
|
+
}
|
|
56
|
+
for (const result of results) {
|
|
57
|
+
if (!result.patch.trim())
|
|
58
|
+
continue;
|
|
59
|
+
const check = await runProcess("git apply --check --binary -", { cwd: input.root, timeoutMs: 60_000, stdin: result.patch });
|
|
60
|
+
if (check.exitCode !== 0) {
|
|
61
|
+
result.status = "FAIL";
|
|
62
|
+
result.message = `Patch integration check failed: ${check.stderr || check.stdout}`;
|
|
63
|
+
const summary = { wave: index + 1, taskIds: ids, status: "FAIL", results };
|
|
64
|
+
waveSummaries.push(summary);
|
|
65
|
+
return { used: true, plan, schedule, waves: waveSummaries, sessions, aggregateSession: aggregate(sessions, 1, result.message) };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const result of results) {
|
|
69
|
+
if (!result.patch.trim())
|
|
70
|
+
continue;
|
|
71
|
+
const apply = await runProcess("git apply --binary -", { cwd: input.root, timeoutMs: 60_000, stdin: result.patch });
|
|
72
|
+
if (apply.exitCode !== 0)
|
|
73
|
+
throw new Error(`Previously checked wave patch failed to apply: ${apply.stderr || apply.stdout}`);
|
|
74
|
+
acceptedPatches.push(result.patch);
|
|
75
|
+
}
|
|
76
|
+
finalReport = planning?.barrierValidation === false ? undefined : await input.revalidate();
|
|
77
|
+
const status = finalReport?.status === "FAIL" ? "FAIL" : "PASS";
|
|
78
|
+
const summary = { wave: index + 1, taskIds: ids, status, results, barrier: finalReport };
|
|
79
|
+
waveSummaries.push(summary);
|
|
80
|
+
await recordEvent(input.stateRoot, input.config, "harness.wave.finish", { taskId: input.contract.task.id, wave: index + 1, status, tasks: ids, checks: finalReport?.checks.length });
|
|
81
|
+
if (status === "FAIL")
|
|
82
|
+
return { used: true, plan, schedule, waves: waveSummaries, sessions, aggregateSession: aggregate(sessions, 1, `Wave ${index + 1} deterministic barrier failed.`), report: finalReport };
|
|
83
|
+
}
|
|
84
|
+
finalReport ??= await input.revalidate();
|
|
85
|
+
return { used: true, plan, schedule, waves: waveSummaries, sessions, aggregateSession: aggregate(sessions, finalReport.status === "PASS" ? 0 : 1, `Executed ${plan.tasks.length} task(s) across ${schedule.waves.length} wave(s).`), report: finalReport };
|
|
86
|
+
}
|
|
87
|
+
async function executeDelegation(input) {
|
|
88
|
+
let selection = input.topology.agents[input.task.agent] ? executionSelectionForAgent(input.topology, input.task.agent) : input.implementationSelection;
|
|
89
|
+
try {
|
|
90
|
+
selection = enforceSandboxPolicy(selection, input.config, input.task.risk).selection;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return failed(input.task, selection, String(error));
|
|
94
|
+
}
|
|
95
|
+
const transport = selection.transport === "inherit" ? (input.config.orchestration?.provider ?? "none") : selection.transport;
|
|
96
|
+
const capabilityIssues = validateExecutionCapabilities(selection, transport);
|
|
97
|
+
if (capabilityIssues.length)
|
|
98
|
+
return failed(input.task, selection, `Agent ${selection.logicalAgent} cannot execute: ${capabilityIssues.join("; ")}`);
|
|
99
|
+
const prompt = buildDelegationPrompt(input.contract, input.task);
|
|
100
|
+
if (input.config.workflow?.planning?.distributed === true && input.config.distributed?.enabled === true) {
|
|
101
|
+
try {
|
|
102
|
+
const remote = await dispatchDistributedDelegation({ root: input.root, config: input.config, contract: input.contract, task: input.task, selection, prompt, priorPatches: input.priorPatches, controller: input.controller });
|
|
103
|
+
const violations = remote.changedFiles.filter((file) => !matchesAny(file, input.task.scope));
|
|
104
|
+
if (violations.length)
|
|
105
|
+
return { task: input.task, session: remote.session, changedFiles: remote.changedFiles, patch: "", status: "FAIL", distributed: true, message: `Remote delegation escaped scope: ${violations.join(", ")}` };
|
|
106
|
+
return { task: input.task, session: remote.session, changedFiles: remote.changedFiles, patch: remote.patch, status: remote.status, distributed: true, message: remote.message };
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return failed(input.task, selection, `Distributed delegation failed: ${String(error)}`, true);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const worktree = await fs.mkdtemp(path.join(os.tmpdir(), `aeh-${safe(input.contract.task.id)}-${safe(input.task.id)}-`));
|
|
113
|
+
const add = await runProcess(`git worktree add --detach ${quote(worktree)} HEAD`, { cwd: input.root, timeoutMs: 120_000 });
|
|
114
|
+
if (add.exitCode !== 0)
|
|
115
|
+
return failed(input.task, selection, `Unable to create task worktree: ${add.stderr || add.stdout}`);
|
|
116
|
+
try {
|
|
117
|
+
for (const patchText of input.priorPatches) {
|
|
118
|
+
const applied = await runProcess("git apply --binary -", { cwd: worktree, timeoutMs: 60_000, stdin: patchText });
|
|
119
|
+
if (applied.exitCode !== 0)
|
|
120
|
+
return failed(input.task, selection, `Unable to materialize prior wave state: ${applied.stderr || applied.stdout}`);
|
|
121
|
+
}
|
|
122
|
+
await copyTaskContext(input.root, worktree, input.config, input.contract);
|
|
123
|
+
if (input.controller)
|
|
124
|
+
await materializeControlPlaneSnapshot(input.controller, worktree, input.config);
|
|
125
|
+
await runProcess("git add -A && git -c user.name=aeh -c user.email=aeh@localhost commit --no-gpg-sign -m 'aeh wave baseline' --allow-empty", { cwd: worktree, timeoutMs: 60_000 });
|
|
126
|
+
const session = await executeAgentPrompt(worktree, input.config, input.contract, selection, prompt);
|
|
127
|
+
if (session.exitCode !== 0)
|
|
128
|
+
return { task: input.task, session, changedFiles: [], patch: "", status: "FAIL", message: `Agent exited with ${session.exitCode}.` };
|
|
129
|
+
const status = await runProcess("git status --porcelain", { cwd: worktree, timeoutMs: 30_000 });
|
|
130
|
+
const untracked = status.stdout.split(/\r?\n/).filter((line) => line.startsWith("?? ")).map((line) => line.slice(3).trim()).filter(Boolean);
|
|
131
|
+
if (untracked.length)
|
|
132
|
+
await runProcess(`git add -N -- ${untracked.map(quote).join(" ")}`, { cwd: worktree, timeoutMs: 30_000 });
|
|
133
|
+
const names = await runProcess("git diff --name-only HEAD", { cwd: worktree, timeoutMs: 30_000 });
|
|
134
|
+
const changedFiles = names.stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
135
|
+
const violations = changedFiles.filter((file) => !matchesAny(file, input.task.scope));
|
|
136
|
+
if (violations.length)
|
|
137
|
+
return { task: input.task, session, changedFiles, patch: "", status: "FAIL", message: `Delegation escaped scope: ${violations.join(", ")}` };
|
|
138
|
+
const diff = await runProcess("git diff --binary --no-ext-diff HEAD", { cwd: worktree, timeoutMs: 60_000 });
|
|
139
|
+
if (diff.exitCode !== 0)
|
|
140
|
+
return { task: input.task, session, changedFiles, patch: "", status: "FAIL", message: diff.stderr || "Unable to capture delegation patch." };
|
|
141
|
+
return { task: input.task, session, changedFiles, patch: diff.stdout, status: "PASS" };
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await runProcess(`git worktree remove --force ${quote(worktree)}`, { cwd: input.root, timeoutMs: 120_000 });
|
|
145
|
+
await fs.rm(worktree, { recursive: true, force: true }).catch(() => undefined);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export function validatePlannerWavePlan(contract, topology, plan) {
|
|
149
|
+
const issues = [];
|
|
150
|
+
const ids = new Set();
|
|
151
|
+
const requirements = new Set((contract.requirements ?? []).map((item) => item.id));
|
|
152
|
+
const covered = new Set();
|
|
153
|
+
for (const task of plan.tasks) {
|
|
154
|
+
if (ids.has(task.id))
|
|
155
|
+
issues.push(`duplicate task id ${task.id}`);
|
|
156
|
+
ids.add(task.id);
|
|
157
|
+
if (!topology.agents[task.agent])
|
|
158
|
+
issues.push(`${task.id} references unknown agent ${task.agent}`);
|
|
159
|
+
if (!task.scope.length)
|
|
160
|
+
issues.push(`${task.id} has empty scope`);
|
|
161
|
+
for (const scope of task.scope)
|
|
162
|
+
if (!withinContractScope(scope, contract.scope?.allowed ?? ["**"]))
|
|
163
|
+
issues.push(`${task.id} scope ${scope} is outside TaskContract scope`);
|
|
164
|
+
for (const req of task.acceptance) {
|
|
165
|
+
if (requirements.size && !requirements.has(req))
|
|
166
|
+
issues.push(`${task.id} references unknown requirement ${req}`);
|
|
167
|
+
if (requirements.has(req))
|
|
168
|
+
covered.add(req);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (const task of plan.tasks)
|
|
172
|
+
for (const dependency of task.dependencies)
|
|
173
|
+
if (!ids.has(dependency))
|
|
174
|
+
issues.push(`${task.id} depends on unknown task ${dependency}`);
|
|
175
|
+
for (const requirement of requirements)
|
|
176
|
+
if (!covered.has(requirement))
|
|
177
|
+
issues.push(`requirement ${requirement} is not assigned to any implementation task`);
|
|
178
|
+
return [...new Set(issues)];
|
|
179
|
+
}
|
|
180
|
+
function findPlanner(topology, configured) { if (configured && topology.agents[configured] && !topology.agents[configured].disabled)
|
|
181
|
+
return configured; return Object.values(topology.agents).find((agent) => agent.role === "planner" && !agent.disabled)?.name; }
|
|
182
|
+
function buildPlannerPrompt(contract) { const requirements = (contract.requirements ?? []).map((item) => `- ${item.id}: ${item.description ?? ""}`).join("\n") || "- none"; return `Create the implementation delegation plan for ${contract.task.id}: ${contract.task.title}.\nThe TaskContract and sealed sources are immutable. Produce the smallest dependency-aware tasks, assign each to a configured logical implementer, give concrete path scopes, and map every requirement ID to at least one task. Do not create product requirements.\nRequirements:\n${requirements}\nAllowed scope: ${(contract.scope?.allowed ?? ["**"]).join(", ")}\nReturn output matching the planner contract; when native structured output is unavailable, use one final AEH_RESULT_JSON=<json> line.`; }
|
|
183
|
+
function buildDelegationPrompt(contract, task) { return `Implement only delegated task ${task.id} for parent ${contract.task.id}.\nSummary: ${task.summary}\nAllowed task scope: ${task.scope.join(", ")}\nDependencies already integrated: ${task.dependencies.join(", ") || "none"}\nAcceptance requirement IDs: ${task.acceptance.join(", ")}\nRisk: ${task.risk}.\nThe parent TaskContract, SDD and control-plane snapshot are frozen. Do not edit outside the delegated scope, do not commit, push, rebase or change requirements. Run focused tests when practical and leave the worktree with only the implementation diff.`; }
|
|
184
|
+
async function copyTaskContext(root, target, config, contract) { const relative = [`${config.sdd?.contractsDir ?? ".harness/contracts"}/${contract.task.id}.yaml`, `.harness/seals/${contract.task.id}.json`, ...Object.values(contract.source ?? {}).filter((value) => Boolean(value)), contract.issue?.snapshotPath].filter((value) => Boolean(value)); for (const item of [...new Set(relative)]) {
|
|
185
|
+
const source = path.resolve(root, item);
|
|
186
|
+
const destination = path.resolve(target, item);
|
|
187
|
+
try {
|
|
188
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
189
|
+
await fs.copyFile(source, destination);
|
|
190
|
+
}
|
|
191
|
+
catch { /* deterministic validation owns required context failures */ }
|
|
192
|
+
} }
|
|
193
|
+
function withinContractScope(candidate, allowed) { return allowed.some((pattern) => pattern === "**" || minimatch(candidate, pattern, { dot: true }) || nonEmptyPrefix(staticPrefix(candidate), staticPrefix(pattern))); }
|
|
194
|
+
function nonEmptyPrefix(left, right) { return Boolean(left && right) && (left.startsWith(right) || right.startsWith(left)); }
|
|
195
|
+
function matchesAny(file, patterns) { return patterns.some((pattern) => pattern === "**" || minimatch(file, pattern, { dot: true }) || (Boolean(staticPrefix(pattern)) && file.startsWith(staticPrefix(pattern)))); }
|
|
196
|
+
function staticPrefix(pattern) { return pattern.split(/[?*\[]/, 1)[0].replace(/\/+$/, ""); }
|
|
197
|
+
function failed(task, selection, message, distributed = false) { return { task, session: { provider: selection.runtimeAdapter, model: selection.modelName, logicalAgent: selection.logicalAgent, runtime: selection.runtimeName, profile: selection.profile, exitCode: 1, stdout: "", stderr: message }, changedFiles: [], patch: "", status: "FAIL", message, distributed }; }
|
|
198
|
+
function aggregate(sessions, exitCode, message) { return { provider: "multi-worker", logicalAgent: "planner-waves", exitCode, stdout: message, stderr: exitCode ? sessions.filter((session) => session.exitCode !== 0).map((session) => session.stderr).filter(Boolean).join("\n") : "" }; }
|
|
199
|
+
async function mapLimit(values, limit, fn) { if (!values.length)
|
|
200
|
+
return []; const result = new Array(values.length); let cursor = 0; const workers = Array.from({ length: Math.max(1, Math.min(limit, values.length)) }, async () => { while (true) {
|
|
201
|
+
const index = cursor++;
|
|
202
|
+
if (index >= values.length)
|
|
203
|
+
return;
|
|
204
|
+
result[index] = await fn(values[index]);
|
|
205
|
+
} }); await Promise.all(workers); return result; }
|
|
206
|
+
function safe(value) { return value.replace(/[^A-Za-z0-9._-]/g, "-"); }
|
|
207
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
208
|
+
//# sourceMappingURL=waveExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waveExecutor.js","sourceRoot":"","sources":["../../src/agents/waveExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HarnessProjectConfig, TaskRisk } from "../core/types.js";
|
|
2
|
+
import { type TriageDecision, type TriageEvidence } from "../core/triage.js";
|
|
3
|
+
export type EngineeringIntent = "informational" | "audit" | "change";
|
|
4
|
+
export interface EngineeringIntentEvidence extends TriageEvidence {
|
|
5
|
+
explicitIntent?: EngineeringIntent;
|
|
6
|
+
}
|
|
7
|
+
export interface EngineeringIntentDecision {
|
|
8
|
+
intent: EngineeringIntent;
|
|
9
|
+
reasons: string[];
|
|
10
|
+
evidence: {
|
|
11
|
+
request: string;
|
|
12
|
+
files: string[];
|
|
13
|
+
domains: string[];
|
|
14
|
+
risk: TaskRisk;
|
|
15
|
+
flags: TriageEvidence["flags"] extends Array<infer T> | undefined ? T[] : never[];
|
|
16
|
+
};
|
|
17
|
+
changeTriage?: TriageDecision;
|
|
18
|
+
}
|
|
19
|
+
export declare function classifyEngineeringIntent(config: HarnessProjectConfig, input: EngineeringIntentEvidence): EngineeringIntentDecision;
|
|
20
|
+
export declare function formatEngineeringIntent(decision: EngineeringIntentDecision): string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { triageChange } from "../core/triage.js";
|
|
2
|
+
const CHANGE_PATTERNS = [
|
|
3
|
+
[/\b(implement|fix|repair|refactor|rewrite|replace|remove|delete|rename|migrate|upgrade|update|change|modify|edit)\b/i, "request explicitly asks to change repository state"],
|
|
4
|
+
[/\b(add|create|introduce|enable|disable|configure|integrate)\b/i, "request asks to add or configure repository behavior"],
|
|
5
|
+
[/\b(make|turn)\b.{0,80}\b(pass|work|support|use|return|accept|reject)\b/i, "request asks for a behavioral modification"]
|
|
6
|
+
];
|
|
7
|
+
const AUDIT_PATTERNS = [
|
|
8
|
+
[/\b(review|audit|assess|inspect|analy[sz]e|validate|evaluate)\b/i, "request asks for an engineering assessment"],
|
|
9
|
+
[/\b(find|identify|look for|search for|detect)\b.{0,80}\b(bug|bugs|issue|issues|problem|problems|risk|risks|vulnerabilit|improvement|improvements|dead code|regression|regressions)\b/i, "request asks to discover engineering findings"],
|
|
10
|
+
[/\b(check|measure)\b.{0,80}\b(coverage|quality|security|performance|architecture|maintainability|correctness|compliance)\b/i, "request asks to measure repository quality"],
|
|
11
|
+
[/\b(code review|security review|architecture review|test review|performance review)\b/i, "request is an explicit review operation"]
|
|
12
|
+
];
|
|
13
|
+
export function classifyEngineeringIntent(config, input) {
|
|
14
|
+
const request = input.request.trim();
|
|
15
|
+
const files = [...new Set(input.files ?? [])];
|
|
16
|
+
const domains = [...new Set(input.domains ?? [])];
|
|
17
|
+
const risk = input.risk ?? "low";
|
|
18
|
+
const flags = [...new Set(input.flags ?? [])];
|
|
19
|
+
const evidence = { request, files, domains, risk, flags };
|
|
20
|
+
if (input.explicitIntent) {
|
|
21
|
+
return withChangeTriage(config, input.explicitIntent, [`explicit intent=${input.explicitIntent}`], evidence);
|
|
22
|
+
}
|
|
23
|
+
const changeReasons = CHANGE_PATTERNS.filter(([pattern]) => pattern.test(request)).map(([, reason]) => reason);
|
|
24
|
+
if (changeReasons.length)
|
|
25
|
+
return withChangeTriage(config, "change", changeReasons, evidence);
|
|
26
|
+
const auditReasons = AUDIT_PATTERNS.filter(([pattern]) => pattern.test(request)).map(([, reason]) => reason);
|
|
27
|
+
if (auditReasons.length)
|
|
28
|
+
return { intent: "audit", reasons: [...new Set(auditReasons)], evidence };
|
|
29
|
+
return { intent: "informational", reasons: ["request asks for information and contains no repository-change or engineering-audit signal"], evidence };
|
|
30
|
+
}
|
|
31
|
+
function withChangeTriage(config, intent, reasons, evidence) {
|
|
32
|
+
if (intent !== "change")
|
|
33
|
+
return { intent, reasons, evidence };
|
|
34
|
+
const changeTriage = triageChange(config, evidence);
|
|
35
|
+
return { intent, reasons, evidence, changeTriage };
|
|
36
|
+
}
|
|
37
|
+
export function formatEngineeringIntent(decision) {
|
|
38
|
+
if (decision.intent !== "change")
|
|
39
|
+
return `${decision.intent.toUpperCase()} — ${decision.reasons.join("; ")}`;
|
|
40
|
+
return `CHANGE/${decision.changeTriage?.mode.toUpperCase() ?? "UNKNOWN"} — ${[...decision.reasons, ...(decision.changeTriage?.reasons ?? [])].join("; ")}`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.js","sourceRoot":"","sources":["../../src/audit/intent.ts"],"names":[],"mappings":"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"}
|