agentic-engineering-harness 0.4.16 → 0.5.1

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 (76) hide show
  1. package/README.md +34 -5
  2. package/dist/agents/outputContracts.d.ts +1 -0
  3. package/dist/agents/outputContracts.js +12 -0
  4. package/dist/agents/outputContracts.js.map +1 -1
  5. package/dist/agents/parallelism.d.ts +1 -0
  6. package/dist/agents/parallelism.js +101 -14
  7. package/dist/agents/parallelism.js.map +1 -1
  8. package/dist/agents/structuredOutput.js +16 -4
  9. package/dist/agents/structuredOutput.js.map +1 -1
  10. package/dist/agents/waveExecutor.d.ts +41 -0
  11. package/dist/agents/waveExecutor.js +208 -0
  12. package/dist/agents/waveExecutor.js.map +1 -0
  13. package/dist/cli.js +1 -1
  14. package/dist/cli.js.map +1 -1
  15. package/dist/core/config.js +23 -6
  16. package/dist/core/config.js.map +1 -1
  17. package/dist/core/controlPlane.d.ts +30 -0
  18. package/dist/core/controlPlane.js +131 -0
  19. package/dist/core/controlPlane.js.map +1 -0
  20. package/dist/core/init.js +12 -4
  21. package/dist/core/init.js.map +1 -1
  22. package/dist/core/run.d.ts +21 -0
  23. package/dist/core/run.js +104 -41
  24. package/dist/core/run.js.map +1 -1
  25. package/dist/core/types.d.ts +83 -1
  26. package/dist/distributed/queue.d.ts +11 -0
  27. package/dist/distributed/queue.js +140 -0
  28. package/dist/distributed/queue.js.map +1 -0
  29. package/dist/distributed/types.d.ts +34 -0
  30. package/dist/distributed/types.js +2 -0
  31. package/dist/distributed/types.js.map +1 -0
  32. package/dist/distributed/worker.d.ts +21 -0
  33. package/dist/distributed/worker.js +111 -0
  34. package/dist/distributed/worker.js.map +1 -0
  35. package/dist/entry.js +110 -46
  36. package/dist/entry.js.map +1 -1
  37. package/dist/evals/runner.js +2 -2
  38. package/dist/evals/runner.js.map +1 -1
  39. package/dist/evals/statistics.d.ts +38 -0
  40. package/dist/evals/statistics.js +88 -0
  41. package/dist/evals/statistics.js.map +1 -0
  42. package/dist/evidence/graph.d.ts +48 -0
  43. package/dist/evidence/graph.js +94 -0
  44. package/dist/evidence/graph.js.map +1 -0
  45. package/dist/mcp/benchmark.d.ts +24 -0
  46. package/dist/mcp/benchmark.js +82 -0
  47. package/dist/mcp/benchmark.js.map +1 -0
  48. package/dist/paseo/start.d.ts +47 -0
  49. package/dist/paseo/start.js +155 -0
  50. package/dist/paseo/start.js.map +1 -0
  51. package/dist/policy/bundles.d.ts +27 -0
  52. package/dist/policy/bundles.js +129 -0
  53. package/dist/policy/bundles.js.map +1 -0
  54. package/dist/security/sandbox.d.ts +12 -0
  55. package/dist/security/sandbox.js +64 -0
  56. package/dist/security/sandbox.js.map +1 -0
  57. package/dist/toolchain/resolve.js +51 -90
  58. package/dist/toolchain/resolve.js.map +1 -1
  59. package/dist/utils/process.d.ts +1 -0
  60. package/dist/utils/process.js +6 -1
  61. package/dist/utils/process.js.map +1 -1
  62. package/dist/validators/graphify.js +28 -6
  63. package/dist/validators/graphify.js.map +1 -1
  64. package/dist/workers/agentPrompt.d.ts +6 -1
  65. package/dist/workers/agentPrompt.js +118 -34
  66. package/dist/workers/agentPrompt.js.map +1 -1
  67. package/dist/workers/podman.js +30 -8
  68. package/dist/workers/podman.js.map +1 -1
  69. package/docs/V0.5.1.md +129 -0
  70. package/docs/V0.5.md +116 -0
  71. package/package.json +2 -2
  72. package/schemas/project.schema.json +27 -8
  73. package/skills/engineering-workflow/SKILL.md +9 -1
  74. package/templates/AGENTS.md +6 -0
  75. package/templates/project.yaml +70 -1
  76. package/templates/toolchain.yaml +8 -1
package/README.md CHANGED
@@ -14,9 +14,9 @@ clone / npm bootstrap
14
14
  -> lead acceptance -> deterministic delivery
15
15
  ```
16
16
 
17
- ## Status: v0.4.16
17
+ ## Status: v0.5.1
18
18
 
19
- v0.4.16 adds **declarative toolchain provisioning and one-command bootstrap** on top of v0.4.15 issue-driven execution.
19
+ v0.5.1 adds a zero-friction Paseo entrypoint on top of the v0.5 architecture: start AEH once, then type normal engineering prompts in the persistent Paseo lead and let the Harness choose and execute the complete workflow automatically.
20
20
 
21
21
  - AEH remains a normal npm development package; it is not an application runtime dependency;
22
22
  - `.harness/toolchain.yaml` declares external engineering tools instead of requiring manual one-by-one installation;
@@ -29,7 +29,36 @@ v0.4.16 adds **declarative toolchain provisioning and one-command bootstrap** on
29
29
  - `aeh doctor` verifies the reconciled environment;
30
30
  - no npm `postinstall` silently mutates the host.
31
31
 
32
- See [docs/V0.4.16.md](docs/V0.4.16.md), [docs/V0.4.15.md](docs/V0.4.15.md) and the earlier v0.4 documentation.
32
+ See [docs/V0.5.1.md](docs/V0.5.1.md), [docs/V0.5.md](docs/V0.5.md) and the earlier version documentation.
33
+
34
+ ## Architecture close in v0.5
35
+
36
+ SPEC execution can now run a planner-produced DAG as isolated local or distributed worker waves. Every run freezes its controller/config/policies/skills, validates a requirement evidence graph, and keeps remote workers as untrusted patch producers. Organization policy bundles, statistical eval dashboards, deeper Graphify scheduling, native structured-output adapters and MCP benchmarking are available as governance/scale layers.
37
+
38
+ Useful scale/governance commands:
39
+
40
+ ```bash
41
+ aeh worker serve . --port 8787
42
+ aeh worker run . --worker-id node-01
43
+ aeh policy sync
44
+ aeh eval repeat EVAL-001 --runs 10
45
+ aeh eval dashboard EVAL-001
46
+ aeh mcp benchmark
47
+ ```
48
+
49
+ ## Start AEH + Paseo
50
+
51
+ The default interactive workflow is now one command:
52
+
53
+ ```bash
54
+ aeh start
55
+ # or
56
+ npm exec aeh -- start
57
+ ```
58
+
59
+ This starts or reuses the Paseo daemon and creates/reuses a persistent **AEH Lead** session. Open that session in Paseo and type a normal request such as `add rate limiting to the auth endpoints`. For every repository-changing prompt, the lead automatically inspects the repository, builds triage evidence, runs QUICK/SPEC classification, materializes and seals the appropriate contract, invokes the Harness, and owns the resulting planner/worker/validation/evidence/review/acceptance flow. You do not need to mention AEH or choose the internal workflow. Read-only questions remain direct and non-mutating.
60
+
61
+ Use `aeh start --new` to create a fresh lead session. AEH does not rewrite global `~/.paseo/config.json`; project-local session state lives under gitignored `.harness/paseo/`.
33
62
 
34
63
  ## Recommended installation
35
64
 
@@ -44,7 +73,7 @@ npm exec aeh -- doctor
44
73
  For an existing clone that does not yet have `node_modules`, bootstrap a pinned AEH package explicitly:
45
74
 
46
75
  ```bash
47
- npm exec --yes --package=agentic-engineering-harness@0.4.16 -- aeh setup
76
+ npm exec --yes --package=agentic-engineering-harness@0.5.1 -- aeh setup
48
77
  ```
49
78
 
50
79
  `aeh setup` is the explicit provisioning boundary. Installing the npm package itself does not install Codex, OpenCode, Paseo, scanners or system packages as a side effect.
@@ -107,7 +136,7 @@ Existing project version authority is respected before creating a new lock, incl
107
136
  ## Bootstrap without an existing `.harness`
108
137
 
109
138
  ```bash
110
- npm exec --yes --package=agentic-engineering-harness@0.4.16 -- aeh init --setup /path/to/repo
139
+ npm exec --yes --package=agentic-engineering-harness@0.5.1 -- aeh init --setup /path/to/repo
111
140
  ```
112
141
 
113
142
  `aeh init` creates the project config, thin agent overlay extending `aeh:default`, reusable skills, policies and toolchain source. `--setup` additionally compiles and reconciles the toolchain.
@@ -159,3 +159,4 @@ export declare function validateAgentOutput(contractName: string, value: unknown
159
159
  issues: string[];
160
160
  };
161
161
  export declare function knownOutputContracts(): string[];
162
+ export declare function outputJsonSchema(contractName: string): Record<string, unknown> | undefined;
@@ -10,7 +10,19 @@ export const validatorOutputSchema = z.object({ verdict: z.enum(["PASS", "FAIL",
10
10
  export const recoveryOutputSchema = z.object({ failureType: z.enum(["PATCH_CONTEXT_MISMATCH", "TOOL_FAILURE", "MISSING_CONTEXT", "WRONG_AGENT", "VALIDATION_FAILURE", "REVIEW_FAILURE", "AMBIGUOUS_OUTPUT", "CONFLICTING_RESULTS"]), rationale: z.string(), nextAction: z.string() });
11
11
  export const orchestratorOutputSchema = z.object({ summary: z.string(), delegatedAgents: z.array(z.string()).default([]), validationStatus: z.string().optional(), unresolved: z.array(z.string()).default([]), finalizationSafe: z.boolean().optional() });
12
12
  const schemas = { planner: plannerOutputSchema, implementer: implementerOutputSchema, reviewer: reviewerOutputSchema, validator: validatorOutputSchema, recovery: recoveryOutputSchema, orchestrator: orchestratorOutputSchema };
13
+ const stringArray = { type: "array", items: { type: "string" } };
14
+ const delegationTaskJson = { type: "object", additionalProperties: false, required: ["id", "summary", "agent", "scope", "dependencies", "acceptance", "risk"], properties: { id: { type: "string" }, summary: { type: "string" }, agent: { type: "string" }, scope: stringArray, dependencies: stringArray, acceptance: stringArray, risk: { enum: ["low", "medium", "high"] } } };
15
+ const findingJson = { type: "object", additionalProperties: false, required: ["id", "severity", "category", "location", "evidence", "impact", "recommendedFix", "suggestedAgent"], properties: { id: { type: "string" }, severity: { enum: ["critical", "high", "medium", "low", "note"] }, category: { type: "string" }, location: { type: "object", additionalProperties: false, required: ["file"], properties: { file: { type: "string" }, startLine: { type: "integer", minimum: 1 }, endLine: { type: "integer", minimum: 1 } } }, evidence: { type: "string" }, impact: { type: "string" }, recommendedFix: { type: "string" }, suggestedAgent: { type: "string" }, exceptionType: { enum: ["IMPLEMENTATION_DEFECT", "SPEC_CONTRADICTION", "REQUIRES_PRODUCT_DECISION", "BLOCKED_EXTERNAL", "SYSTEM_FAILURE"] } } };
16
+ const jsonSchemas = {
17
+ planner: { type: "object", additionalProperties: false, required: ["tasks", "affectedAreas", "requiredReviewers", "validationGates", "fallbackRouting", "outOfScopeImprovements"], properties: { tasks: { type: "array", items: delegationTaskJson }, affectedAreas: stringArray, requiredReviewers: stringArray, validationGates: stringArray, fallbackRouting: stringArray, outOfScopeImprovements: stringArray } },
18
+ implementer: { type: "object", additionalProperties: false, required: ["filesChanged", "behaviorImplemented", "decisions", "assumptions", "risks", "validationCommands", "reviewers", "followUp"], properties: { filesChanged: stringArray, behaviorImplemented: stringArray, decisions: stringArray, assumptions: stringArray, risks: stringArray, validationCommands: stringArray, reviewers: stringArray, followUp: stringArray, contractSync: stringArray } },
19
+ reviewer: { type: "object", additionalProperties: false, required: ["verdict", "findings", "finalizationSafety", "followUp"], properties: { verdict: { enum: ["PASS", "FAIL", "PASS_WITH_WARNINGS"] }, findings: { type: "array", items: findingJson }, finalizationSafety: { enum: ["SAFE", "BLOCKED", "RISK_KNOWN"] }, confidence: { type: "string" }, followUp: stringArray } },
20
+ validator: { type: "object", additionalProperties: false, required: ["verdict", "checks"], properties: { verdict: { enum: ["PASS", "FAIL", "WARN"] }, checks: { type: "array", items: { type: "object", additionalProperties: false, required: ["id", "status"], properties: { id: { type: "string" }, status: { enum: ["PASS", "FAIL", "WARN", "SKIP"] }, evidence: { type: "string" } } } } } },
21
+ recovery: { type: "object", additionalProperties: false, required: ["failureType", "rationale", "nextAction"], properties: { failureType: { enum: ["PATCH_CONTEXT_MISMATCH", "TOOL_FAILURE", "MISSING_CONTEXT", "WRONG_AGENT", "VALIDATION_FAILURE", "REVIEW_FAILURE", "AMBIGUOUS_OUTPUT", "CONFLICTING_RESULTS"] }, rationale: { type: "string" }, nextAction: { type: "string" } } },
22
+ orchestrator: { type: "object", additionalProperties: false, required: ["summary", "delegatedAgents", "unresolved"], properties: { summary: { type: "string" }, delegatedAgents: stringArray, validationStatus: { type: "string" }, unresolved: stringArray, finalizationSafe: { type: "boolean" } } }
23
+ };
13
24
  export function validateAgentOutput(contractName, value) { const schema = schemas[contractName]; if (!schema)
14
25
  return { ok: false, issues: [`Unknown agent output contract: ${contractName}`] }; const parsed = schema.safeParse(value); return parsed.success ? { ok: true, value: parsed.data, issues: [] } : { ok: false, issues: parsed.error.issues.map((issue) => `${issue.path.join(".") || "root"}: ${issue.message}`) }; }
15
26
  export function knownOutputContracts() { return Object.keys(schemas).sort(); }
27
+ export function outputJsonSchema(contractName) { const schema = jsonSchemas[contractName]; return schema ? structuredClone(schema) : undefined; }
16
28
  //# sourceMappingURL=outputContracts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outputContracts.js","sourceRoot":"","sources":["../../src/agents/outputContracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outputContracts.js","sourceRoot":"","sources":["../../src/agents/outputContracts.ts"],"names":[],"mappings":"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"}
@@ -10,5 +10,6 @@ export interface ParallelismPlan {
10
10
  waves: string[][];
11
11
  conflicts: TaskConflict[];
12
12
  graphUsed: boolean;
13
+ taskNodes?: Record<string, string[]>;
13
14
  }
14
15
  export declare function planParallelism(root: string, config: HarnessProjectConfig, taskId: string, tasks: DelegationTask[]): Promise<ParallelismPlan>;
@@ -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) { const reasons = []; if (a.dependencies.includes(b.id) || b.dependencies.includes(a.id))
36
- reasons.push("dependency"); if (scopesOverlap(a.scope, b.scope))
37
- reasons.push("scope-overlap"); if (graph && shareCommunity(a.scope, b.scope, graph))
38
- reasons.push("graphify-community-overlap"); return reasons; }
39
- function scopesOverlap(a, b) { return a.some((left) => b.some((right) => left === right || minimatch(left, right, { dot: true }) || minimatch(right, left, { dot: true }) || staticPrefix(left).startsWith(staticPrefix(right)) || staticPrefix(right).startsWith(staticPrefix(left)))); }
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 shareCommunity(aScopes, bScopes, graph) { const communities = graph.communities ?? {}; const a = communitiesForScopes(aScopes, graph.nodes ?? [], communities); const b = communitiesForScopes(bScopes, graph.nodes ?? [], communities); return [...a].some((community) => b.has(community)); }
42
- function communitiesForScopes(scopes, nodes, communities) { const result = new Set(); for (const node of nodes)
43
- if (scopes.some((scope) => minimatch(node, scope, { dot: true }) || node.includes(staticPrefix(scope)))) {
44
- const community = communities[node];
45
- if (community)
46
- result.add(community);
47
- } return result; }
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":"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"}
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 raw = candidate.slice(index + marker.length).trim();
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
- throw new Error("Agent output did not contain a valid AEH_RESULT_JSON=<json> marker.");
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;QAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAClC,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS;QACxB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY,EAAE,MAAgB;IAC7D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC;YAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AACD,SAAS,cAAc,CAAC,KAAc,EAAE,MAAgB;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC7F,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC;YAAE,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3I,CAAC;AACD,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,wCAAwC,CAAC,CAAC;IAClF,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAAC,CAAC;IAC9H,OAAO,SAAS,CAAC;AACnB,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