agentic-engineering-harness 0.4.16
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/LICENSE +201 -0
- package/README.md +273 -0
- package/dist/agents/audit.d.ts +12 -0
- package/dist/agents/audit.js +14 -0
- package/dist/agents/audit.js.map +1 -0
- package/dist/agents/compiler.d.ts +8 -0
- package/dist/agents/compiler.js +103 -0
- package/dist/agents/compiler.js.map +1 -0
- package/dist/agents/config.d.ts +6 -0
- package/dist/agents/config.js +161 -0
- package/dist/agents/config.js.map +1 -0
- package/dist/agents/escalation.d.ts +9 -0
- package/dist/agents/escalation.js +75 -0
- package/dist/agents/escalation.js.map +1 -0
- package/dist/agents/exceptionDetection.d.ts +24 -0
- package/dist/agents/exceptionDetection.js +42 -0
- package/dist/agents/exceptionDetection.js.map +1 -0
- package/dist/agents/findings.d.ts +14 -0
- package/dist/agents/findings.js +40 -0
- package/dist/agents/findings.js.map +1 -0
- package/dist/agents/gitCheckpoint.d.ts +6 -0
- package/dist/agents/gitCheckpoint.js +61 -0
- package/dist/agents/gitCheckpoint.js.map +1 -0
- package/dist/agents/jsonc.d.ts +1 -0
- package/dist/agents/jsonc.js +42 -0
- package/dist/agents/jsonc.js.map +1 -0
- package/dist/agents/outputContracts.d.ts +161 -0
- package/dist/agents/outputContracts.js +16 -0
- package/dist/agents/outputContracts.js.map +1 -0
- package/dist/agents/parallelism.d.ts +14 -0
- package/dist/agents/parallelism.js +54 -0
- package/dist/agents/parallelism.js.map +1 -0
- package/dist/agents/permissions.d.ts +5 -0
- package/dist/agents/permissions.js +30 -0
- package/dist/agents/permissions.js.map +1 -0
- package/dist/agents/qualityConvergence.d.ts +44 -0
- package/dist/agents/qualityConvergence.js +77 -0
- package/dist/agents/qualityConvergence.js.map +1 -0
- package/dist/agents/recovery.d.ts +13 -0
- package/dist/agents/recovery.js +35 -0
- package/dist/agents/recovery.js.map +1 -0
- package/dist/agents/reviewLifecycle.d.ts +30 -0
- package/dist/agents/reviewLifecycle.js +233 -0
- package/dist/agents/reviewLifecycle.js.map +1 -0
- package/dist/agents/routing.d.ts +9 -0
- package/dist/agents/routing.js +37 -0
- package/dist/agents/routing.js.map +1 -0
- package/dist/agents/structuredOutput.d.ts +1 -0
- package/dist/agents/structuredOutput.js +54 -0
- package/dist/agents/structuredOutput.js.map +1 -0
- package/dist/agents/types.d.ts +207 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +221 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.js +59 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/doctor.d.ts +8 -0
- package/dist/core/doctor.js +59 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/git.d.ts +8 -0
- package/dist/core/git.js +47 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/init.d.ts +1 -0
- package/dist/core/init.js +52 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/quick.d.ts +20 -0
- package/dist/core/quick.js +49 -0
- package/dist/core/quick.js.map +1 -0
- package/dist/core/repair.d.ts +8 -0
- package/dist/core/repair.js +7 -0
- package/dist/core/repair.js.map +1 -0
- package/dist/core/run.d.ts +38 -0
- package/dist/core/run.js +165 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/sdd.d.ts +10 -0
- package/dist/core/sdd.js +88 -0
- package/dist/core/sdd.js.map +1 -0
- package/dist/core/seal.d.ts +3 -0
- package/dist/core/seal.js +74 -0
- package/dist/core/seal.js.map +1 -0
- package/dist/core/triage.d.ts +22 -0
- package/dist/core/triage.js +38 -0
- package/dist/core/triage.js.map +1 -0
- package/dist/core/types.d.ts +354 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/verify.d.ts +6 -0
- package/dist/core/verify.js +51 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/delivery/finalize.d.ts +17 -0
- package/dist/delivery/finalize.js +71 -0
- package/dist/delivery/finalize.js.map +1 -0
- package/dist/delivery/handoff.d.ts +39 -0
- package/dist/delivery/handoff.js +250 -0
- package/dist/delivery/handoff.js.map +1 -0
- package/dist/entry.d.ts +2 -0
- package/dist/entry.js +112 -0
- package/dist/entry.js.map +1 -0
- package/dist/evals/runner.d.ts +4 -0
- package/dist/evals/runner.js +112 -0
- package/dist/evals/runner.js.map +1 -0
- package/dist/evals/scoring.d.ts +3 -0
- package/dist/evals/scoring.js +41 -0
- package/dist/evals/scoring.js.map +1 -0
- package/dist/evals/types.d.ts +46 -0
- package/dist/evals/types.js +2 -0
- package/dist/evals/types.js.map +1 -0
- package/dist/issues/intake.d.ts +114 -0
- package/dist/issues/intake.js +213 -0
- package/dist/issues/intake.js.map +1 -0
- package/dist/memory/benchmark.d.ts +33 -0
- package/dist/memory/benchmark.js +69 -0
- package/dist/memory/benchmark.js.map +1 -0
- package/dist/metrics/runMetrics.d.ts +9 -0
- package/dist/metrics/runMetrics.js +34 -0
- package/dist/metrics/runMetrics.js.map +1 -0
- package/dist/metrics/usage.d.ts +3 -0
- package/dist/metrics/usage.js +53 -0
- package/dist/metrics/usage.js.map +1 -0
- package/dist/provenance/generate.d.ts +30 -0
- package/dist/provenance/generate.js +96 -0
- package/dist/provenance/generate.js.map +1 -0
- package/dist/providers/engram.d.ts +8 -0
- package/dist/providers/engram.js +14 -0
- package/dist/providers/engram.js.map +1 -0
- package/dist/providers/graphify.d.ts +9 -0
- package/dist/providers/graphify.js +28 -0
- package/dist/providers/graphify.js.map +1 -0
- package/dist/providers/paseo.d.ts +8 -0
- package/dist/providers/paseo.js +14 -0
- package/dist/providers/paseo.js.map +1 -0
- package/dist/providers/types.d.ts +41 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/telemetry/events.d.ts +2 -0
- package/dist/telemetry/events.js +29 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/otlp.d.ts +3 -0
- package/dist/telemetry/otlp.js +57 -0
- package/dist/telemetry/otlp.js.map +1 -0
- package/dist/toolchain/config.d.ts +10 -0
- package/dist/toolchain/config.js +54 -0
- package/dist/toolchain/config.js.map +1 -0
- package/dist/toolchain/doctor.d.ts +8 -0
- package/dist/toolchain/doctor.js +56 -0
- package/dist/toolchain/doctor.js.map +1 -0
- package/dist/toolchain/mise.d.ts +10 -0
- package/dist/toolchain/mise.js +61 -0
- package/dist/toolchain/mise.js.map +1 -0
- package/dist/toolchain/resolve.d.ts +8 -0
- package/dist/toolchain/resolve.js +159 -0
- package/dist/toolchain/resolve.js.map +1 -0
- package/dist/toolchain/setup.d.ts +7 -0
- package/dist/toolchain/setup.js +141 -0
- package/dist/toolchain/setup.js.map +1 -0
- package/dist/toolchain/types.d.ts +95 -0
- package/dist/toolchain/types.js +2 -0
- package/dist/toolchain/types.js.map +1 -0
- package/dist/utils/process.d.ts +15 -0
- package/dist/utils/process.js +94 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/validators/commands.d.ts +2 -0
- package/dist/validators/commands.js +28 -0
- package/dist/validators/commands.js.map +1 -0
- package/dist/validators/constraints.d.ts +6 -0
- package/dist/validators/constraints.js +30 -0
- package/dist/validators/constraints.js.map +1 -0
- package/dist/validators/diffScope.d.ts +2 -0
- package/dist/validators/diffScope.js +36 -0
- package/dist/validators/diffScope.js.map +1 -0
- package/dist/validators/evidence.d.ts +6 -0
- package/dist/validators/evidence.js +8 -0
- package/dist/validators/evidence.js.map +1 -0
- package/dist/validators/external.d.ts +3 -0
- package/dist/validators/external.js +22 -0
- package/dist/validators/external.js.map +1 -0
- package/dist/validators/gherkin.d.ts +3 -0
- package/dist/validators/gherkin.js +59 -0
- package/dist/validators/gherkin.js.map +1 -0
- package/dist/validators/graphify.d.ts +4 -0
- package/dist/validators/graphify.js +108 -0
- package/dist/validators/graphify.js.map +1 -0
- package/dist/validators/opa.d.ts +3 -0
- package/dist/validators/opa.js +43 -0
- package/dist/validators/opa.js.map +1 -0
- package/dist/validators/openapi.d.ts +25 -0
- package/dist/validators/openapi.js +98 -0
- package/dist/validators/openapi.js.map +1 -0
- package/dist/validators/registry.d.ts +2 -0
- package/dist/validators/registry.js +36 -0
- package/dist/validators/registry.js.map +1 -0
- package/dist/validators/toolCommand.d.ts +5 -0
- package/dist/validators/toolCommand.js +33 -0
- package/dist/validators/toolCommand.js.map +1 -0
- package/dist/validators/types.d.ts +13 -0
- package/dist/validators/types.js +2 -0
- package/dist/validators/types.js.map +1 -0
- package/dist/workers/agentPrompt.d.ts +3 -0
- package/dist/workers/agentPrompt.js +84 -0
- package/dist/workers/agentPrompt.js.map +1 -0
- package/dist/workers/direct.d.ts +13 -0
- package/dist/workers/direct.js +30 -0
- package/dist/workers/direct.js.map +1 -0
- package/dist/workers/factory.d.ts +4 -0
- package/dist/workers/factory.js +10 -0
- package/dist/workers/factory.js.map +1 -0
- package/dist/workers/paseo.d.ts +14 -0
- package/dist/workers/paseo.js +29 -0
- package/dist/workers/paseo.js.map +1 -0
- package/dist/workers/podman.d.ts +13 -0
- package/dist/workers/podman.js +22 -0
- package/dist/workers/podman.js.map +1 -0
- package/dist/workers/prompt.d.ts +4 -0
- package/dist/workers/prompt.js +4 -0
- package/dist/workers/prompt.js.map +1 -0
- package/dist/workers/types.d.ts +11 -0
- package/dist/workers/types.js +2 -0
- package/dist/workers/types.js.map +1 -0
- package/docs/ARCHITECTURE.md +47 -0
- package/docs/EVALS.md +28 -0
- package/docs/MEMORY.md +28 -0
- package/docs/OBSERVABILITY.md +18 -0
- package/docs/OSS_STACK.md +27 -0
- package/docs/PASEO.md +9 -0
- package/docs/PUBLISHING.md +110 -0
- package/docs/SDD.md +35 -0
- package/docs/SECURITY.md +21 -0
- package/docs/V0.2.md +42 -0
- package/docs/V0.3.md +40 -0
- package/docs/V0.4.11.md +30 -0
- package/docs/V0.4.12.md +88 -0
- package/docs/V0.4.13.md +203 -0
- package/docs/V0.4.14.md +209 -0
- package/docs/V0.4.15.md +365 -0
- package/docs/V0.4.16.md +229 -0
- package/docs/V0.4.md +28 -0
- package/docs/VALIDATION.md +23 -0
- package/package.json +18 -0
- package/policies/core/dependency-policy.rego +12 -0
- package/policies/core/schema-policy.rego +12 -0
- package/policies/core/trust-boundary.rego +17 -0
- package/presets/agents/default.jsonc +80 -0
- package/presets/docker.yaml +4 -0
- package/presets/dotnet.yaml +12 -0
- package/presets/expo.yaml +6 -0
- package/presets/generic.yaml +3 -0
- package/presets/nextjs.yaml +8 -0
- package/presets/node.yaml +6 -0
- package/presets/pnpm.yaml +6 -0
- package/presets/postgres.yaml +4 -0
- package/schemas/agent-output-planner.schema.json +1 -0
- package/schemas/agent-topology.schema.json +37 -0
- package/schemas/project.schema.json +36 -0
- package/schemas/quick-contract.schema.json +17 -0
- package/schemas/task-contract.schema.json +18 -0
- package/schemas/toolchain.schema.json +70 -0
- package/schemas/validation-report.schema.json +15 -0
- package/skills/acceptance-traceability/SKILL.md +13 -0
- package/skills/deterministic-validation/SKILL.md +15 -0
- package/skills/engineering-workflow/SKILL.md +108 -0
- package/skills/finding-dedup/SKILL.md +12 -0
- package/skills/github-delivery-lifecycle/SKILL.md +16 -0
- package/skills/implementation-worker/SKILL.md +17 -0
- package/skills/lead-engineer/SKILL.md +30 -0
- package/skills/memory-hygiene/SKILL.md +22 -0
- package/skills/prompt-drift-audit/SKILL.md +10 -0
- package/skills/recovery-classifier/SKILL.md +13 -0
- package/skills/routing-normalizer/SKILL.md +17 -0
- package/skills/sdd/SKILL.md +21 -0
- package/skills/simplify/SKILL.md +16 -0
- package/skills/verification-planning/SKILL.md +17 -0
- package/skills/worktree-lifecycle/SKILL.md +18 -0
- package/templates/AGENTS.md +37 -0
- package/templates/agents.source.jsonc +39 -0
- package/templates/otel-collector.yaml +21 -0
- package/templates/project.yaml +196 -0
- package/templates/toolchain.yaml +127 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
const httpMethods = ["get", "put", "post", "delete", "options", "head", "patch", "trace"];
|
|
5
|
+
export async function runOpenApiValidator(context) {
|
|
6
|
+
const baseline = stringOption(context.spec.options, "baseline");
|
|
7
|
+
const current = stringOption(context.spec.options, "current");
|
|
8
|
+
if (!baseline || !current)
|
|
9
|
+
return { id: context.spec.id, category: "contract", status: context.spec.required ? "FAIL" : "WARN", message: "OpenAPI validator requires options.baseline and options.current." };
|
|
10
|
+
try {
|
|
11
|
+
const before = parseDocument(await fs.readFile(path.resolve(context.root, baseline), "utf8"));
|
|
12
|
+
const after = parseDocument(await fs.readFile(path.resolve(context.root, current), "utf8"));
|
|
13
|
+
const breaking = compareOpenApi(before, after);
|
|
14
|
+
return { id: context.spec.id, category: "contract", status: breaking.length ? "FAIL" : "PASS", message: breaking.length ? `OpenAPI compatibility failed: ${breaking.length} breaking change(s).` : "OpenAPI remains backward compatible for the supported checks.", details: { baseline, current, breaking } };
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return { id: context.spec.id, category: "contract", status: context.spec.required ? "FAIL" : "WARN", message: `OpenAPI compatibility could not run: ${String(error)}` };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function compareOpenApi(before, after) {
|
|
21
|
+
const breaking = [];
|
|
22
|
+
const beforePaths = before.paths ?? {};
|
|
23
|
+
const afterPaths = after.paths ?? {};
|
|
24
|
+
for (const [route, beforePath] of Object.entries(beforePaths)) {
|
|
25
|
+
const afterPath = afterPaths[route];
|
|
26
|
+
if (!afterPath) {
|
|
27
|
+
breaking.push(`removed path ${route}`);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
for (const method of httpMethods) {
|
|
31
|
+
const beforeOperation = beforePath[method];
|
|
32
|
+
if (!beforeOperation)
|
|
33
|
+
continue;
|
|
34
|
+
const afterOperation = afterPath[method];
|
|
35
|
+
if (!afterOperation) {
|
|
36
|
+
breaking.push(`removed operation ${method.toUpperCase()} ${route}`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
compareParameters(route, method, beforeOperation, afterOperation, breaking);
|
|
40
|
+
compareResponses(route, method, beforeOperation, afterOperation, breaking);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const beforeSchemas = before.components?.schemas ?? {};
|
|
44
|
+
const afterSchemas = after.components?.schemas ?? {};
|
|
45
|
+
for (const [name, schema] of Object.entries(beforeSchemas)) {
|
|
46
|
+
const next = afterSchemas[name];
|
|
47
|
+
if (!next) {
|
|
48
|
+
breaking.push(`removed schema ${name}`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
compareSchema(name, schema, next, breaking);
|
|
52
|
+
}
|
|
53
|
+
return breaking;
|
|
54
|
+
}
|
|
55
|
+
function compareParameters(route, method, before, after, breaking) {
|
|
56
|
+
const key = (p) => `${p.in ?? ""}:${p.name ?? ""}`;
|
|
57
|
+
const beforeMap = new Map((before.parameters ?? []).map((item) => [key(item), item]));
|
|
58
|
+
const afterMap = new Map((after.parameters ?? []).map((item) => [key(item), item]));
|
|
59
|
+
for (const [id, parameter] of beforeMap) {
|
|
60
|
+
const next = afterMap.get(id);
|
|
61
|
+
if (!next)
|
|
62
|
+
breaking.push(`removed parameter ${id} from ${method.toUpperCase()} ${route}`);
|
|
63
|
+
else if (!parameter.required && next.required)
|
|
64
|
+
breaking.push(`parameter ${id} became required on ${method.toUpperCase()} ${route}`);
|
|
65
|
+
}
|
|
66
|
+
for (const [id, parameter] of afterMap)
|
|
67
|
+
if (!beforeMap.has(id) && parameter.required)
|
|
68
|
+
breaking.push(`added required parameter ${id} to ${method.toUpperCase()} ${route}`);
|
|
69
|
+
}
|
|
70
|
+
function compareResponses(route, method, before, after, breaking) { const next = after.responses ?? {}; for (const status of Object.keys(before.responses ?? {}))
|
|
71
|
+
if (!(status in next))
|
|
72
|
+
breaking.push(`removed response ${status} from ${method.toUpperCase()} ${route}`); }
|
|
73
|
+
function compareSchema(pathName, before, after, breaking) {
|
|
74
|
+
if (before.type && after.type && before.type !== after.type)
|
|
75
|
+
breaking.push(`schema ${pathName} changed type ${before.type} -> ${after.type}`);
|
|
76
|
+
const beforeProperties = before.properties ?? {};
|
|
77
|
+
const afterProperties = after.properties ?? {};
|
|
78
|
+
for (const [name, schema] of Object.entries(beforeProperties)) {
|
|
79
|
+
const next = afterProperties[name];
|
|
80
|
+
const childPath = `${pathName}.${name}`;
|
|
81
|
+
if (!next)
|
|
82
|
+
breaking.push(`removed property ${childPath}`);
|
|
83
|
+
else
|
|
84
|
+
compareSchema(childPath, schema, next, breaking);
|
|
85
|
+
}
|
|
86
|
+
const beforeRequired = new Set(before.required ?? []);
|
|
87
|
+
for (const required of after.required ?? [])
|
|
88
|
+
if (!beforeRequired.has(required))
|
|
89
|
+
breaking.push(`property ${pathName}.${required} became required`);
|
|
90
|
+
}
|
|
91
|
+
function stringOption(options, key) { const value = options?.[key]; return typeof value === "string" && value.trim() ? value : undefined; }
|
|
92
|
+
function parseDocument(content) { try {
|
|
93
|
+
return JSON.parse(content);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return YAML.parse(content);
|
|
97
|
+
} }
|
|
98
|
+
//# sourceMappingURL=openapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/validators/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import type { HarnessProjectConfig, TaskContract, ValidationCheck } from "../core/types.js";
|
|
2
|
+
export declare function runConfiguredValidators(root: string, config: HarnessProjectConfig, contract: TaskContract, baseRef: string, changedFiles: string[]): Promise<ValidationCheck[]>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { runGherkinValidator } from "./gherkin.js";
|
|
2
|
+
import { runExternalToolValidator } from "./external.js";
|
|
3
|
+
import { runOpenApiValidator } from "./openapi.js";
|
|
4
|
+
import { runGraphifyValidator } from "./graphify.js";
|
|
5
|
+
import { runSpecCommand } from "./toolCommand.js";
|
|
6
|
+
export async function runConfiguredValidators(root, config, contract, baseRef, changedFiles) {
|
|
7
|
+
const specs = [...(config.validation?.validators ?? []), ...(contract.verification?.validators ?? [])];
|
|
8
|
+
const checks = [];
|
|
9
|
+
for (const spec of specs) {
|
|
10
|
+
const context = { root, config, contract, spec, baseRef, changedFiles };
|
|
11
|
+
try {
|
|
12
|
+
checks.push(await runValidator(context));
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
checks.push({ id: spec.id, category: "validator", status: spec.required ? "FAIL" : "WARN", message: `${spec.adapter} validator crashed: ${String(error)}` });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return checks;
|
|
19
|
+
}
|
|
20
|
+
async function runValidator(context) {
|
|
21
|
+
switch (context.spec.adapter) {
|
|
22
|
+
case "gherkin": return runGherkinValidator(context);
|
|
23
|
+
case "graphify": return runGraphifyValidator(context);
|
|
24
|
+
case "openapi": return runOpenApiValidator(context);
|
|
25
|
+
case "opengrep":
|
|
26
|
+
case "trivy":
|
|
27
|
+
case "playwright":
|
|
28
|
+
case "pact":
|
|
29
|
+
case "mutation":
|
|
30
|
+
case "property": return runExternalToolValidator(context);
|
|
31
|
+
case "command": return context.spec.command ? runSpecCommand(context, context.spec.command, "custom") : unknown(context.spec);
|
|
32
|
+
default: return unknown(context.spec);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function unknown(spec) { return { id: spec.id, category: "validator", status: spec.required ? "FAIL" : "WARN", message: `Unknown validator adapter '${spec.adapter}'.` }; }
|
|
36
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/validators/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY,EAAE,MAA4B,EAAE,QAAsB,EAAE,OAAe,EAAE,YAAsB;IACvJ,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IACvG,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAsB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAC3F,IAAI,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAAC,CAAC;QACjD,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,uBAAuB,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAAC,CAAC;IACjL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,KAAK,UAAU,YAAY,CAAC,OAA0B;IACpD,QAAQ,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,KAAK,SAAS,CAAC,CAAC,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,UAAU,CAAC,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACtD,KAAK,SAAS,CAAC,CAAC,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACpD,KAAK,UAAU,CAAC;QAAC,KAAK,OAAO,CAAC;QAAC,KAAK,YAAY,CAAC;QAAC,KAAK,MAAM,CAAC;QAAC,KAAK,UAAU,CAAC;QAAC,KAAK,UAAU,CAAC,CAAC,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC1I,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9H,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AACD,SAAS,OAAO,CAAC,IAAmB,IAAqB,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,8BAA8B,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ValidationCheck, ValidatorSpec } from "../core/types.js";
|
|
2
|
+
import type { ValidationContext } from "./types.js";
|
|
3
|
+
export declare function runSpecCommand(context: ValidationContext, command: string, category: string, details?: Record<string, unknown>): Promise<ValidationCheck>;
|
|
4
|
+
export declare function renderTokens(command: string, context: ValidationContext): string;
|
|
5
|
+
export declare function missingTool(spec: ValidatorSpec, tool: string, category: string): ValidationCheck;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { runProcess } from "../utils/process.js";
|
|
3
|
+
export async function runSpecCommand(context, command, category, details = {}) {
|
|
4
|
+
const rendered = renderTokens(command, context);
|
|
5
|
+
const cwd = path.resolve(context.root, context.spec.workingDirectory ?? ".");
|
|
6
|
+
const result = await runProcess(rendered, { cwd, timeoutMs: (context.spec.timeoutSeconds ?? 900) * 1000 });
|
|
7
|
+
return {
|
|
8
|
+
id: context.spec.id,
|
|
9
|
+
category,
|
|
10
|
+
status: result.exitCode === 0 ? "PASS" : "FAIL",
|
|
11
|
+
message: result.exitCode === 0 ? `${context.spec.adapter} validator passed.` : `${context.spec.adapter} validator failed with exit code ${result.exitCode}.`,
|
|
12
|
+
durationMs: result.durationMs,
|
|
13
|
+
details: { command: rendered, stdout: truncate(result.stdout), stderr: truncate(result.stderr), ...details }
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function renderTokens(command, context) {
|
|
17
|
+
return command
|
|
18
|
+
.replaceAll("{taskId}", context.contract.task.id)
|
|
19
|
+
.replaceAll("{baseRef}", context.baseRef)
|
|
20
|
+
.replaceAll("{acceptance}", context.contract.source?.acceptance ?? "");
|
|
21
|
+
}
|
|
22
|
+
export function missingTool(spec, tool, category) {
|
|
23
|
+
return {
|
|
24
|
+
id: spec.id,
|
|
25
|
+
category,
|
|
26
|
+
status: spec.required ? "FAIL" : "WARN",
|
|
27
|
+
message: `${tool} is not installed; ${spec.required ? "the required validator cannot run" : "optional validator skipped"}.`
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function truncate(value, max = 20_000) {
|
|
31
|
+
return value.length <= max ? value : `${value.slice(0, max)}\n… truncated …`;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=toolCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolCommand.js","sourceRoot":"","sources":["../../src/validators/toolCommand.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA0B,EAAE,OAAe,EAAE,QAAgB,EAAE,UAAmC,EAAE;IACvI,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3G,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC/C,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,oCAAoC,MAAM,CAAC,QAAQ,GAAG;QAC5J,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE;KAC7G,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAA0B;IACtE,OAAO,OAAO;SACX,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;SAChD,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC;SACxC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAmB,EAAE,IAAY,EAAE,QAAgB;IAC7E,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ;QACR,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACvC,OAAO,EAAE,GAAG,IAAI,sBAAsB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,4BAA4B,GAAG;KAC5H,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAG,GAAG,MAAM;IAC3C,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HarnessProjectConfig, TaskContract, ValidationCheck, ValidatorSpec } from "../core/types.js";
|
|
2
|
+
export interface ValidationContext {
|
|
3
|
+
root: string;
|
|
4
|
+
config: HarnessProjectConfig;
|
|
5
|
+
contract: TaskContract;
|
|
6
|
+
spec: ValidatorSpec;
|
|
7
|
+
baseRef: string;
|
|
8
|
+
changedFiles: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface HarnessValidator {
|
|
11
|
+
readonly adapter: string;
|
|
12
|
+
validate(context: ValidationContext): Promise<ValidationCheck>;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/validators/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { HarnessProjectConfig, TaskContract, WorkerSession } from "../core/types.js";
|
|
3
|
+
export declare function executeAgentPrompt(root: string, config: HarnessProjectConfig, contract: TaskContract, selection: AgentExecutionSelection, prompt: string): Promise<WorkerSession>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { buildOpenCodeRuntimeConfig } from "../agents/permissions.js";
|
|
3
|
+
import { deliveryWorkspaceId } from "../delivery/handoff.js";
|
|
4
|
+
import { runProcess } from "../utils/process.js";
|
|
5
|
+
export async function executeAgentPrompt(root, config, contract, selection, prompt) {
|
|
6
|
+
const transport = selection.transport === "inherit" ? (config.orchestration?.provider ?? "none") : selection.transport;
|
|
7
|
+
const effectivePrompt = withAgentCharter(selection, prompt);
|
|
8
|
+
if (transport === "paseo")
|
|
9
|
+
return executeViaPaseo(root, config, contract, selection, effectivePrompt);
|
|
10
|
+
if (transport === "direct")
|
|
11
|
+
return executeDirect(root, config, selection, effectivePrompt);
|
|
12
|
+
if (transport === "podman")
|
|
13
|
+
return executePodman(root, config, contract, selection, effectivePrompt);
|
|
14
|
+
throw new Error(`Unsupported agent prompt transport: ${transport}`);
|
|
15
|
+
}
|
|
16
|
+
async function executeViaPaseo(root, config, contract, selection, prompt) {
|
|
17
|
+
const model = selection.runtimeAdapter === "codex" ? selection.modelName : selection.modelId;
|
|
18
|
+
const title = `${config.orchestration?.worker?.titlePrefix ?? "aeh"}-${contract.task.id}-${selection.logicalAgent}`;
|
|
19
|
+
const workspaceId = await deliveryWorkspaceId(root, config, contract.task.id);
|
|
20
|
+
const parts = ["paseo run --background --quiet", `--title ${quote(title)}`, `--provider ${quote(selection.paseoProvider)}`, `--model ${quote(model)}`];
|
|
21
|
+
if (workspaceId)
|
|
22
|
+
parts.push(`--workspace ${quote(workspaceId)}`);
|
|
23
|
+
parts.push(quote(prompt));
|
|
24
|
+
const launch = await runProcess(parts.join(" "), { cwd: root, timeoutMs: 60_000 });
|
|
25
|
+
if (launch.exitCode !== 0)
|
|
26
|
+
return session(selection, launch.exitCode, launch.stdout, launch.stderr);
|
|
27
|
+
const id = launch.stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).at(-1);
|
|
28
|
+
if (!id)
|
|
29
|
+
return session(selection, 1, launch.stdout, "Paseo returned no agent id.");
|
|
30
|
+
const timeout = config.orchestration?.worker?.timeoutSeconds ?? 1800;
|
|
31
|
+
const wait = await runProcess(`paseo wait ${quote(id)} --timeout ${timeout}`, { cwd: root, timeoutMs: (timeout + 30) * 1000 });
|
|
32
|
+
const logs = await runProcess(`paseo logs ${quote(id)} --tail 200`, { cwd: root, timeoutMs: 60_000 });
|
|
33
|
+
return { ...session(selection, wait.exitCode, logs.stdout || wait.stdout, [wait.stderr, logs.stderr].filter(Boolean).join("\n")), id };
|
|
34
|
+
}
|
|
35
|
+
async function executeDirect(root, config, selection, prompt) {
|
|
36
|
+
let command;
|
|
37
|
+
let env;
|
|
38
|
+
if (selection.runtimeAdapter === "opencode") {
|
|
39
|
+
const args = ["opencode", "run", "--auto", "--format", "json", "--model", selection.modelId];
|
|
40
|
+
if (selection.variant)
|
|
41
|
+
args.push("--variant", selection.variant);
|
|
42
|
+
if (selection.nativeAgent)
|
|
43
|
+
args.push("--agent", selection.nativeAgent);
|
|
44
|
+
args.push(...selection.args, prompt);
|
|
45
|
+
command = args.map(quote).join(" ");
|
|
46
|
+
env = { OPENCODE_CONFIG_CONTENT: JSON.stringify(buildOpenCodeRuntimeConfig(selection, config)) };
|
|
47
|
+
}
|
|
48
|
+
else if (selection.runtimeAdapter === "codex")
|
|
49
|
+
command = ["codex", "exec", "--json", "--model", selection.modelName, ...selection.args, prompt].map(quote).join(" ");
|
|
50
|
+
else
|
|
51
|
+
throw new Error(`No direct runtime adapter for ${selection.runtimeAdapter}`);
|
|
52
|
+
const result = await runProcess(command, { cwd: root, timeoutMs: (config.orchestration?.worker?.timeoutSeconds ?? 1800) * 1000, env });
|
|
53
|
+
return session(selection, result.exitCode, result.stdout, result.stderr);
|
|
54
|
+
}
|
|
55
|
+
async function executePodman(root, config, contract, selection, prompt) {
|
|
56
|
+
const image = config.security?.sandbox?.image;
|
|
57
|
+
if (!image)
|
|
58
|
+
throw new Error("security.sandbox.image is required for Podman agent execution.");
|
|
59
|
+
if (selection.runtimeAdapter !== "opencode")
|
|
60
|
+
throw new Error(`Podman prompt execution currently supports OpenCode; selected ${selection.runtimeAdapter}.`);
|
|
61
|
+
const writable = selection.permissions.write === "allow";
|
|
62
|
+
const mounts = [`-v ${quote(`${root}:/workspace:${writable ? "rw" : "ro"}`)}`];
|
|
63
|
+
if (writable)
|
|
64
|
+
for (const relative of sealedArtifacts(config, contract))
|
|
65
|
+
mounts.push(`-v ${quote(`${path.resolve(root, relative)}:/workspace/${relative}:ro`)}`);
|
|
66
|
+
const network = config.security?.sandbox?.network === false || selection.permissions.network === "deny" ? "--network none" : "";
|
|
67
|
+
const runtimeConfig = JSON.stringify(buildOpenCodeRuntimeConfig(selection, config));
|
|
68
|
+
const args = ["opencode", "run", "--auto", "--format", "json", "--model", selection.modelId];
|
|
69
|
+
if (selection.variant)
|
|
70
|
+
args.push("--variant", selection.variant);
|
|
71
|
+
if (selection.nativeAgent)
|
|
72
|
+
args.push("--agent", selection.nativeAgent);
|
|
73
|
+
args.push(...selection.args, prompt);
|
|
74
|
+
const inner = `cd /workspace && ${args.map(quote).join(" ")}`;
|
|
75
|
+
const extra = (config.security?.sandbox?.extraArgs ?? []).map(quote).join(" ");
|
|
76
|
+
const command = `podman run --rm -i --userns=keep-id ${network} -e ${quote(`OPENCODE_CONFIG_CONTENT=${runtimeConfig}`)} ${extra} ${mounts.join(" ")} ${quote(image)} sh -lc ${quote(inner)}`;
|
|
77
|
+
const result = await runProcess(command, { cwd: root, timeoutMs: (config.orchestration?.worker?.timeoutSeconds ?? 1800) * 1000 });
|
|
78
|
+
return session(selection, result.exitCode, result.stdout, result.stderr);
|
|
79
|
+
}
|
|
80
|
+
function withAgentCharter(selection, prompt) { return selection.description ? `Agent charter for ${selection.logicalAgent}:\n${selection.description}\n\n${prompt}` : prompt; }
|
|
81
|
+
function session(selection, exitCode, stdout, stderr) { return { provider: selection.runtimeAdapter, model: selection.modelName, logicalAgent: selection.logicalAgent, nativeAgent: selection.nativeAgent, runtime: selection.runtimeName, profile: selection.profile, exitCode, stdout, stderr }; }
|
|
82
|
+
function sealedArtifacts(config, contract) { const dir = config.sdd?.contractsDir ?? ".harness/contracts"; return [...new Set([`${dir}/${contract.task.id}.yaml`, `.harness/seals/${contract.task.id}.json`, ...Object.values(contract.source ?? {}).filter((value) => Boolean(value))])]; }
|
|
83
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
84
|
+
//# sourceMappingURL=agentPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentPrompt.js","sourceRoot":"","sources":["../../src/workers/agentPrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { HarnessProjectConfig, RepairPacket, TaskContract, WorkerSession } from "../core/types.js";
|
|
3
|
+
import type { WorkerExecutor } from "./types.js";
|
|
4
|
+
export declare class DirectWorkerExecutor implements WorkerExecutor {
|
|
5
|
+
readonly name = "direct";
|
|
6
|
+
doctor(root: string, _config: HarnessProjectConfig, selection?: AgentExecutionSelection): Promise<{
|
|
7
|
+
ok: boolean;
|
|
8
|
+
message: string;
|
|
9
|
+
}>;
|
|
10
|
+
start(root: string, config: HarnessProjectConfig, contract: TaskContract, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
11
|
+
repair(root: string, config: HarnessProjectConfig, contract: TaskContract, _session: WorkerSession, packet: RepairPacket, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
12
|
+
private run;
|
|
13
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { buildOpenCodeRuntimeConfig } from "../agents/permissions.js";
|
|
2
|
+
import { commandExists, runProcess } from "../utils/process.js";
|
|
3
|
+
import { buildRepairPrompt, buildWorkerPrompt } from "./prompt.js";
|
|
4
|
+
export class DirectWorkerExecutor {
|
|
5
|
+
name = "direct";
|
|
6
|
+
async doctor(root, _config, selection) { if (!selection)
|
|
7
|
+
return { ok: false, message: "Direct execution requires a resolved agent selection." }; const command = selection.runtimeAdapter === "opencode" ? "opencode" : selection.runtimeAdapter === "codex" ? "codex" : selection.runtimeName; const ok = await commandExists(command, root); return { ok, message: ok ? `${command} CLI detected for ${selection.logicalAgent}.` : `${command} CLI not found.` }; }
|
|
8
|
+
async start(root, config, contract, selection) { if (!selection)
|
|
9
|
+
throw new Error("Direct execution requires a resolved agent selection."); return this.run(root, config, contract, buildWorkerPrompt(contract, selection), selection); }
|
|
10
|
+
async repair(root, config, contract, _session, packet, selection) { if (!selection)
|
|
11
|
+
throw new Error("Direct repair requires a resolved agent selection."); return this.run(root, config, contract, `${buildWorkerPrompt(contract, selection)}\n\n${buildRepairPrompt(packet)}`, selection); }
|
|
12
|
+
async run(root, config, _contract, prompt, selection) { let command; let env; if (selection.runtimeAdapter === "opencode") {
|
|
13
|
+
const args = ["opencode", "run", "--auto", "--format", "json", "--model", selection.modelId];
|
|
14
|
+
if (selection.variant)
|
|
15
|
+
args.push("--variant", selection.variant);
|
|
16
|
+
if (selection.nativeAgent)
|
|
17
|
+
args.push("--agent", selection.nativeAgent);
|
|
18
|
+
args.push(...selection.args, prompt);
|
|
19
|
+
command = args.map(quote).join(" ");
|
|
20
|
+
env = { OPENCODE_CONFIG_CONTENT: JSON.stringify(buildOpenCodeRuntimeConfig(selection, config)) };
|
|
21
|
+
}
|
|
22
|
+
else if (selection.runtimeAdapter === "codex") {
|
|
23
|
+
const args = ["codex", "exec", "--json", "--model", selection.modelName, ...selection.args, prompt];
|
|
24
|
+
command = args.map(quote).join(" ");
|
|
25
|
+
}
|
|
26
|
+
else
|
|
27
|
+
throw new Error(`No direct runtime adapter for ${selection.runtimeAdapter}`); const timeout = config.orchestration?.worker?.timeoutSeconds ?? 1800; const result = await runProcess(command, { cwd: root, timeoutMs: timeout * 1000, env }); return { provider: selection.runtimeAdapter, model: selection.modelName, logicalAgent: selection.logicalAgent, nativeAgent: selection.nativeAgent, runtime: selection.runtimeName, profile: selection.profile, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr }; }
|
|
28
|
+
}
|
|
29
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
30
|
+
//# sourceMappingURL=direct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct.js","sourceRoot":"","sources":["../../src/workers/direct.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { HarnessProjectConfig } from "../core/types.js";
|
|
3
|
+
import type { WorkerExecutor } from "./types.js";
|
|
4
|
+
export declare function createWorkerExecutor(config: HarnessProjectConfig, selection?: AgentExecutionSelection): WorkerExecutor;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DirectWorkerExecutor } from "./direct.js";
|
|
2
|
+
import { PaseoWorkerExecutor } from "./paseo.js";
|
|
3
|
+
import { PodmanWorkerExecutor } from "./podman.js";
|
|
4
|
+
export function createWorkerExecutor(config, selection) { const requested = selection?.transport && selection.transport !== "inherit" ? selection.transport : (config.orchestration?.provider ?? "none"); switch (requested) {
|
|
5
|
+
case "paseo": return new PaseoWorkerExecutor();
|
|
6
|
+
case "podman": return new PodmanWorkerExecutor();
|
|
7
|
+
case "direct": return new DirectWorkerExecutor();
|
|
8
|
+
default: throw new Error(`No executable orchestration transport configured: ${requested}`);
|
|
9
|
+
} }
|
|
10
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/workers/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,MAA4B,EAAE,SAAmC,IAAoB,MAAM,SAAS,GAAG,SAAS,EAAE,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC;IAAC,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;IAAC,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,oBAAoB,EAAE,CAAC;IAAC,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,oBAAoB,EAAE,CAAC;IAAC,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,qDAAqD,SAAS,EAAE,CAAC,CAAC;AAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { HarnessProjectConfig, RepairPacket, TaskContract, WorkerSession } from "../core/types.js";
|
|
3
|
+
import type { WorkerExecutor } from "./types.js";
|
|
4
|
+
export declare class PaseoWorkerExecutor implements WorkerExecutor {
|
|
5
|
+
readonly name = "paseo";
|
|
6
|
+
doctor(root: string, _config: HarnessProjectConfig, selection?: AgentExecutionSelection): Promise<{
|
|
7
|
+
ok: boolean;
|
|
8
|
+
message: string;
|
|
9
|
+
}>;
|
|
10
|
+
start(root: string, config: HarnessProjectConfig, contract: TaskContract, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
11
|
+
repair(root: string, config: HarnessProjectConfig, contract: TaskContract, session: WorkerSession, packet: RepairPacket, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
12
|
+
private launch;
|
|
13
|
+
private waitAndCollect;
|
|
14
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { validateExecutionCapabilities } from "../agents/permissions.js";
|
|
2
|
+
import { deliveryWorkspaceId } from "../delivery/handoff.js";
|
|
3
|
+
import { commandExists, runProcess } from "../utils/process.js";
|
|
4
|
+
import { buildRepairPrompt, buildWorkerPrompt } from "./prompt.js";
|
|
5
|
+
export class PaseoWorkerExecutor {
|
|
6
|
+
name = "paseo";
|
|
7
|
+
async doctor(root, _config, selection) { const ok = await commandExists("paseo", root); if (!ok)
|
|
8
|
+
return { ok: false, message: "Paseo CLI not found." }; if (selection) {
|
|
9
|
+
const issues = validateExecutionCapabilities(selection, "paseo");
|
|
10
|
+
if (issues.length)
|
|
11
|
+
return { ok: false, message: issues.join("; ") };
|
|
12
|
+
} return { ok: true, message: "Paseo CLI detected." }; }
|
|
13
|
+
async start(root, config, contract, selection) { return this.launch(root, config, contract, buildWorkerPrompt(contract, selection), selection); }
|
|
14
|
+
async repair(root, config, contract, session, packet, selection) { if (session.id && (!selection || session.logicalAgent === selection.logicalAgent)) {
|
|
15
|
+
const send = await runProcess(`paseo send ${quote(session.id)} --no-wait ${quote(buildRepairPrompt(packet))}`, { cwd: root, timeoutMs: 60_000 });
|
|
16
|
+
if (send.exitCode !== 0)
|
|
17
|
+
throw new Error(`Paseo failed to send repair prompt: ${send.stderr || send.stdout}`);
|
|
18
|
+
return this.waitAndCollect(root, config, session);
|
|
19
|
+
} return this.launch(root, config, contract, `${buildWorkerPrompt(contract, selection)}\n\n${buildRepairPrompt(packet)}`, selection); }
|
|
20
|
+
async launch(root, config, contract, prompt, selection) { const worker = config.orchestration?.worker; const provider = selection?.paseoProvider ?? worker?.provider ?? "opencode"; const model = selection ? (selection.runtimeAdapter === "codex" ? selection.modelName : selection.modelId) : worker?.model; const title = `${worker?.titlePrefix ?? "aeh"}-${contract.task.id}-${selection?.logicalAgent ?? "worker"}`; const workspaceId = await deliveryWorkspaceId(root, config, contract.task.id); const parts = ["paseo run --background --quiet", `--title ${quote(title)}`, `--provider ${quote(provider)}`]; if (workspaceId)
|
|
21
|
+
parts.push(`--workspace ${quote(workspaceId)}`); if (model)
|
|
22
|
+
parts.push(`--model ${quote(model)}`); parts.push(quote(prompt)); const launch = await runProcess(parts.join(" "), { cwd: root, timeoutMs: 60_000 }); if (launch.exitCode !== 0)
|
|
23
|
+
throw new Error(`Paseo failed to launch worker: ${launch.stderr || launch.stdout}`); const id = launch.stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).at(-1); if (!id)
|
|
24
|
+
throw new Error("Paseo returned no agent id for the background worker."); return this.waitAndCollect(root, config, { id, provider, model, logicalAgent: selection?.logicalAgent, nativeAgent: selection?.nativeAgent, runtime: selection?.runtimeName, profile: selection?.profile, exitCode: 0, stdout: launch.stdout, stderr: "" }); }
|
|
25
|
+
async waitAndCollect(root, config, session) { const timeout = config.orchestration?.worker?.timeoutSeconds ?? 1800; const wait = await runProcess(`paseo wait ${quote(session.id)} --timeout ${timeout}`, { cwd: root, timeoutMs: (timeout + 30) * 1000 }); if (wait.exitCode !== 0)
|
|
26
|
+
return { ...session, exitCode: wait.exitCode, stderr: wait.stderr || wait.stdout }; const logs = await runProcess(`paseo logs ${quote(session.id)} --tail 30`, { cwd: root, timeoutMs: 60_000 }); return { ...session, exitCode: 0, stdout: logs.stdout || wait.stdout || session.stdout, stderr: [session.stderr, wait.stderr, logs.stderr].filter(Boolean).join("\n") }; }
|
|
27
|
+
}
|
|
28
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
29
|
+
//# sourceMappingURL=paseo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paseo.js","sourceRoot":"","sources":["../../src/workers/paseo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { HarnessProjectConfig, RepairPacket, TaskContract, WorkerSession } from "../core/types.js";
|
|
3
|
+
import type { WorkerExecutor } from "./types.js";
|
|
4
|
+
export declare class PodmanWorkerExecutor implements WorkerExecutor {
|
|
5
|
+
readonly name = "podman";
|
|
6
|
+
doctor(root: string, config: HarnessProjectConfig): Promise<{
|
|
7
|
+
ok: boolean;
|
|
8
|
+
message: string;
|
|
9
|
+
}>;
|
|
10
|
+
start(root: string, config: HarnessProjectConfig, contract: TaskContract, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
11
|
+
repair(root: string, config: HarnessProjectConfig, contract: TaskContract, _session: WorkerSession, packet: RepairPacket, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
12
|
+
private run;
|
|
13
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { buildOpenCodeRuntimeConfig } from "../agents/permissions.js";
|
|
3
|
+
import { commandExists, runProcess } from "../utils/process.js";
|
|
4
|
+
import { buildRepairPrompt, buildWorkerPrompt } from "./prompt.js";
|
|
5
|
+
export class PodmanWorkerExecutor {
|
|
6
|
+
name = "podman";
|
|
7
|
+
async doctor(root, config) { const ok = await commandExists("podman", root); if (!ok)
|
|
8
|
+
return { ok: false, message: "Podman CLI not found." }; if (!config.security?.sandbox?.image)
|
|
9
|
+
return { ok: false, message: "security.sandbox.image is required for Podman worker execution." }; return { ok: true, message: "Podman worker sandbox configured." }; }
|
|
10
|
+
async start(root, config, contract, selection) { return this.run(root, config, contract, buildWorkerPrompt(contract, selection), selection); }
|
|
11
|
+
async repair(root, config, contract, _session, packet, selection) { return this.run(root, config, contract, `${buildWorkerPrompt(contract, selection)}\n\n${buildRepairPrompt(packet)}`, selection); }
|
|
12
|
+
async run(root, config, contract, prompt, selection) { const sandbox = config.security?.sandbox; const image = sandbox?.image; if (!image)
|
|
13
|
+
throw new Error("Podman image is not configured."); const runtime = selection?.runtimeAdapter ?? "opencode"; if (runtime !== "opencode")
|
|
14
|
+
throw new Error(`Podman executor currently supports OpenCode runtime; selected ${runtime}.`); const model = selection?.modelId ?? config.orchestration?.worker?.model; const mounts = [`-v ${quote(`${root}:/workspace:rw`)}`]; for (const relative of sealedArtifacts(config, contract))
|
|
15
|
+
mounts.push(`-v ${quote(`${path.resolve(root, relative)}:/workspace/${relative}:ro`)}`); const network = sandbox?.network === false ? "--network none" : ""; const extra = (sandbox?.extraArgs ?? []).map(quote).join(" "); const runtimeConfig = selection ? JSON.stringify(buildOpenCodeRuntimeConfig(selection, config)) : undefined; const envArg = runtimeConfig ? `-e ${quote(`OPENCODE_CONFIG_CONTENT=${runtimeConfig}`)}` : ""; const args = ["opencode", "run", "--auto"]; if (model)
|
|
16
|
+
args.push("--model", model); if (selection?.variant)
|
|
17
|
+
args.push("--variant", selection.variant); if (selection?.nativeAgent)
|
|
18
|
+
args.push("--agent", selection.nativeAgent); args.push(...(selection?.args ?? []), prompt); const inner = `cd /workspace && ${args.map(quote).join(" ")}`; const command = `podman run --rm -i --userns=keep-id ${network} ${envArg} ${extra} ${mounts.join(" ")} ${quote(image)} sh -lc ${quote(inner)}`; const timeout = config.orchestration?.worker?.timeoutSeconds ?? 1800; const result = await runProcess(command, { cwd: root, timeoutMs: timeout * 1000 }); return { provider: runtime, model: selection?.modelName ?? model, logicalAgent: selection?.logicalAgent, nativeAgent: selection?.nativeAgent, runtime: selection?.runtimeName, profile: selection?.profile, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr }; }
|
|
19
|
+
}
|
|
20
|
+
function sealedArtifacts(config, contract) { const contractsDir = config.sdd?.contractsDir ?? ".harness/contracts"; return [...new Set([`${contractsDir}/${contract.task.id}.yaml`, `.harness/seals/${contract.task.id}.json`, ...Object.values(contract.source ?? {}).filter((value) => Boolean(value))])]; }
|
|
21
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
22
|
+
//# sourceMappingURL=podman.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"podman.js","sourceRoot":"","sources":["../../src/workers/podman.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
2
|
+
import type { RepairPacket, TaskContract } from "../core/types.js";
|
|
3
|
+
export declare function buildWorkerPrompt(contract: TaskContract, selection?: AgentExecutionSelection): string;
|
|
4
|
+
export declare function buildRepairPrompt(packet: RepairPacket): string;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { permissionSummary } from "../agents/permissions.js";
|
|
2
|
+
export function buildWorkerPrompt(contract, selection) { const sources = Object.entries(contract.source ?? {}).filter(([, value]) => Boolean(value)).map(([key, value]) => `- ${key}: ${value}`).join("\n"); const requirements = (contract.requirements ?? []).map((item) => `- ${item.id}: ${item.description ?? "see spec"}`).join("\n"); const identity = selection ? `Logical agent: ${selection.logicalAgent}\nRole: ${selection.role}\nDomains: ${selection.domains.join(", ") || "generic"}\nAgent charter: ${selection.description ?? "Follow the role/domain boundaries in the TaskContract."}\nRuntime: ${selection.runtimeName}\nModel alias: @${selection.modelAlias}\nNative agent: ${selection.nativeAgent ?? "none"}\nSkills: ${selection.skills.join(", ") || "none"}\nMCPs: ${selection.mcps.join(", ") || "none"}\nPermissions: ${permissionSummary(selection)}\nOutput contract: ${selection.outputContract ?? "none"}` : "Legacy worker configuration."; return `You are the implementation worker for task ${contract.task.id}: ${contract.task.title}.\n\n${identity}\n\nThe lead agent owns architecture and requirements. Implement only the approved task contract.\n\nRead these authoritative artifacts before editing:\n${sources || "- TaskContract only"}\n\nRequirements:\n${requirements || "- See TaskContract/spec"}\n\nRules:\n- Do not modify the TaskContract, its seal, or SDD/acceptance artifacts.\n- Do not expand scope or redesign unrelated architecture.\n- Respect allowed/forbidden paths and dependency/schema constraints.\n- Do not exceed the configured permission/capability envelope.\n- Add or update implementation-level tests as needed; do not weaken frozen acceptance criteria.\n- Run focused checks before reporting completion.\n- Report files changed, tests run, results, deviations and remaining concerns.\n`; }
|
|
3
|
+
export function buildRepairPrompt(packet) { const failures = packet.failures.map((failure) => `- ${failure.id} [${failure.category}]: ${failure.message}${failure.details ? `\n evidence: ${JSON.stringify(failure.details)}` : ""}`).join("\n"); return `Repair attempt ${packet.attempt} for ${packet.taskId}.\nFailure type: ${packet.failureType ?? "unspecified"}\nRecovery action: ${packet.recoveryAction ?? "same-agent"}\n\nThe deterministic harness rejected the implementation for these reasons:\n${failures}\n\nMake the smallest targeted changes needed to satisfy these failures. Do not modify frozen contracts/specs/acceptance artifacts and do not broaden scope. Re-run the focused failing checks before reporting completion.`; }
|
|
4
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/workers/prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,UAAU,iBAAiB,CAAC,QAAsB,EAAE,SAAmC,IAAY,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,IAAI,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,kBAAkB,SAAS,CAAC,YAAY,WAAW,SAAS,CAAC,IAAI,cAAc,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,oBAAoB,SAAS,CAAC,WAAW,IAAI,wDAAwD,cAAc,SAAS,CAAC,WAAW,mBAAmB,SAAS,CAAC,UAAU,mBAAmB,SAAS,CAAC,WAAW,IAAI,MAAM,aAAa,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,WAAW,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,kBAAkB,iBAAiB,CAAC,SAAS,CAAC,sBAAsB,SAAS,CAAC,cAAc,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,OAAO,8CAA8C,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,QAAQ,QAAQ,4JAA4J,OAAO,IAAI,qBAAqB,sBAAsB,YAAY,IAAI,yBAAyB,6fAA6f,CAAC,CAAC,CAAC;AACt0D,MAAM,UAAU,iBAAiB,CAAC,MAAoB,IAAY,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,kBAAkB,MAAM,CAAC,OAAO,QAAQ,MAAM,CAAC,MAAM,oBAAoB,MAAM,CAAC,WAAW,IAAI,aAAa,sBAAsB,MAAM,CAAC,cAAc,IAAI,YAAY,iFAAiF,QAAQ,6NAA6N,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HarnessProjectConfig, RepairPacket, TaskContract, WorkerSession } from "../core/types.js";
|
|
2
|
+
import type { AgentExecutionSelection } from "../agents/types.js";
|
|
3
|
+
export interface WorkerExecutor {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
doctor(root: string, config: HarnessProjectConfig, selection?: AgentExecutionSelection): Promise<{
|
|
6
|
+
ok: boolean;
|
|
7
|
+
message: string;
|
|
8
|
+
}>;
|
|
9
|
+
start(root: string, config: HarnessProjectConfig, contract: TaskContract, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
10
|
+
repair(root: string, config: HarnessProjectConfig, contract: TaskContract, session: WorkerSession, packet: RepairPacket, selection?: AgentExecutionSelection): Promise<WorkerSession>;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workers/types.ts"],"names":[],"mappings":""}
|