agentic-engineering-harness 0.6.28 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/agents/permissions.js +9 -6
  2. package/dist/agents/permissions.js.map +1 -1
  3. package/dist/cli.js +35 -14
  4. package/dist/cli.js.map +1 -1
  5. package/dist/context/compression/headroom.d.ts +6 -0
  6. package/dist/context/compression/headroom.js +61 -15
  7. package/dist/context/compression/headroom.js.map +1 -1
  8. package/dist/context/compression/types.d.ts +1 -0
  9. package/dist/context/envelope.js +1 -1
  10. package/dist/context/envelope.js.map +1 -1
  11. package/dist/context/gateway.d.ts +2 -1
  12. package/dist/context/gateway.js +77 -41
  13. package/dist/context/gateway.js.map +1 -1
  14. package/dist/context/policy.js +1 -1
  15. package/dist/context/policy.js.map +1 -1
  16. package/dist/context/preflight.js +10 -4
  17. package/dist/context/preflight.js.map +1 -1
  18. package/dist/context/repository/graphify.d.ts +1 -0
  19. package/dist/context/repository/graphify.js +4 -33
  20. package/dist/context/repository/graphify.js.map +1 -1
  21. package/dist/context/repository/serena.d.ts +1 -1
  22. package/dist/context/repository/serena.js +2 -1
  23. package/dist/context/repository/serena.js.map +1 -1
  24. package/dist/context/transport.d.ts +33 -0
  25. package/dist/context/transport.js +63 -0
  26. package/dist/context/transport.js.map +1 -0
  27. package/dist/context/types.d.ts +19 -1
  28. package/dist/context/types.js +1 -1
  29. package/dist/context/types.js.map +1 -1
  30. package/dist/core/config.js +6 -8
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/doctor.js +6 -6
  33. package/dist/core/doctor.js.map +1 -1
  34. package/dist/core/init.js +2 -1
  35. package/dist/core/init.js.map +1 -1
  36. package/dist/core/run.js +37 -14
  37. package/dist/core/run.js.map +1 -1
  38. package/dist/core/types.d.ts +30 -0
  39. package/dist/core/verify.d.ts +2 -0
  40. package/dist/core/verify.js +3 -2
  41. package/dist/core/verify.js.map +1 -1
  42. package/dist/evals/fullStack.d.ts +20 -0
  43. package/dist/evals/fullStack.js +138 -0
  44. package/dist/evals/fullStack.js.map +1 -0
  45. package/dist/evidence/graph.js +24 -7
  46. package/dist/evidence/graph.js.map +1 -1
  47. package/dist/memory/candidates.d.ts +29 -0
  48. package/dist/memory/candidates.js +31 -0
  49. package/dist/memory/candidates.js.map +1 -0
  50. package/dist/paseo/launchSpec.js +4 -4
  51. package/dist/paseo/launchSpec.js.map +1 -1
  52. package/dist/provenance/generate.d.ts +34 -0
  53. package/dist/provenance/generate.js +209 -41
  54. package/dist/provenance/generate.js.map +1 -1
  55. package/dist/providers/engram.d.ts +27 -1
  56. package/dist/providers/engram.js +142 -6
  57. package/dist/providers/engram.js.map +1 -1
  58. package/dist/providers/graphify.d.ts +28 -1
  59. package/dist/providers/graphify.js +114 -16
  60. package/dist/providers/graphify.js.map +1 -1
  61. package/dist/providers/graphifyModel.d.ts +23 -0
  62. package/dist/providers/graphifyModel.js +101 -0
  63. package/dist/providers/graphifyModel.js.map +1 -0
  64. package/dist/providers/memory.d.ts +1 -0
  65. package/dist/providers/memory.js +2 -0
  66. package/dist/providers/memory.js.map +1 -0
  67. package/dist/providers/serenaMcp.d.ts +7 -0
  68. package/dist/providers/serenaMcp.js +77 -0
  69. package/dist/providers/serenaMcp.js.map +1 -0
  70. package/dist/providers/types.d.ts +8 -2
  71. package/dist/providers/versions.d.ts +10 -0
  72. package/dist/providers/versions.js +3 -0
  73. package/dist/providers/versions.js.map +1 -0
  74. package/dist/telemetry/events.d.ts +1 -0
  75. package/dist/telemetry/events.js +37 -21
  76. package/dist/telemetry/events.js.map +1 -1
  77. package/dist/telemetry/otlp.d.ts +7 -1
  78. package/dist/telemetry/otlp.js +20 -41
  79. package/dist/telemetry/otlp.js.map +1 -1
  80. package/dist/telemetry/tracing.d.ts +19 -0
  81. package/dist/telemetry/tracing.js +141 -0
  82. package/dist/telemetry/tracing.js.map +1 -0
  83. package/dist/toolchain/config.js +3 -2
  84. package/dist/toolchain/config.js.map +1 -1
  85. package/dist/validators/external.js +27 -5
  86. package/dist/validators/external.js.map +1 -1
  87. package/dist/validators/graphify.js +5 -73
  88. package/dist/validators/graphify.js.map +1 -1
  89. package/dist/validators/opa.d.ts +14 -1
  90. package/dist/validators/opa.js +6 -2
  91. package/dist/validators/opa.js.map +1 -1
  92. package/dist/validators/toolEvidence.d.ts +9 -0
  93. package/dist/validators/toolEvidence.js +137 -0
  94. package/dist/validators/toolEvidence.js.map +1 -0
  95. package/dist/workers/agentPrompt.d.ts +9 -0
  96. package/dist/workers/agentPrompt.js +121 -9
  97. package/dist/workers/agentPrompt.js.map +1 -1
  98. package/docs/ARCHITECTURE.md +6 -1
  99. package/docs/COMPONENT_MATURITY.md +47 -0
  100. package/docs/CONTEXT_EFFICIENCY.md +11 -2
  101. package/docs/MEMORY.md +9 -0
  102. package/docs/OBSERVABILITY.md +6 -1
  103. package/docs/OSS_STACK.md +8 -2
  104. package/docs/SECURITY.md +12 -0
  105. package/docs/component-maturity.json +34 -0
  106. package/package.json +7 -1
  107. package/policies/core/trust-boundary.rego +14 -4
  108. package/schemas/project.schema.json +1 -1
  109. package/schemas/validation-report.schema.json +2 -1
  110. package/scripts/headroom-bridge.py +88 -0
  111. package/templates/project.yaml +4 -0
  112. package/templates/provider-versions.json +10 -0
  113. package/templates/toolchain.yaml +21 -6
@@ -2,11 +2,11 @@ import crypto from "node:crypto";
2
2
  import fs from "node:fs/promises";
3
3
  import { createReadStream } from "node:fs";
4
4
  import path from "node:path";
5
+ import { loadTaskContract } from "../core/config.js";
5
6
  import { commandExists, runProcess } from "../utils/process.js";
6
7
  export async function generateProvenance(root, config, options) {
7
8
  const artifact = path.resolve(root, options.artifact);
8
- const stat = await fs.stat(artifact);
9
- if (!stat.isFile())
9
+ if (!(await fs.stat(artifact)).isFile())
10
10
  throw new Error("Provenance currently requires --artifact to point to a file.");
11
11
  const digest = await sha256File(artifact);
12
12
  const commit = await gitValue(root, "git rev-parse HEAD");
@@ -16,24 +16,7 @@ export async function generateProvenance(root, config, options) {
16
16
  const base = sanitize(path.basename(artifact));
17
17
  const predicateFile = path.join(outputDir, `${base}.slsa-provenance.json`);
18
18
  const statementFile = path.join(outputDir, `${base}.intoto.json`);
19
- const runDigest = options.taskId ? await optionalDigest(path.resolve(root, config.sdd?.runsDir ?? ".harness/runs", `${options.taskId}.json`)) : undefined;
20
- const reportDigest = options.taskId ? await optionalDigest(path.resolve(root, config.sdd?.reportsDir ?? ".harness/reports", `${options.taskId}.json`)) : undefined;
21
- const predicate = buildSlsaPredicate({
22
- project: config.project.name,
23
- artifact: path.basename(artifact),
24
- taskId: options.taskId,
25
- commit,
26
- remote,
27
- runDigest,
28
- reportDigest,
29
- buildType: config.provenance?.buildType ?? "https://github.com/JamesMorales04/agentic-engineering-harness/v0.3",
30
- invocationId: crypto.randomUUID(),
31
- startedOn: new Date().toISOString(),
32
- finishedOn: new Date().toISOString()
33
- });
34
- const statement = { _type: "https://in-toto.io/Statement/v1", subject: [{ name: path.basename(artifact), digest: { sha256: digest } }], predicateType: "https://slsa.dev/provenance/v1", predicate };
35
- await fs.writeFile(predicateFile, `${JSON.stringify(predicate, null, 2)}\n`);
36
- await fs.writeFile(statementFile, `${JSON.stringify(statement, null, 2)}\n`);
19
+ const manifestFile = path.join(outputDir, `${base}.manifest.json`);
37
20
  let sbomFile;
38
21
  if (options.sbom !== false && await commandExists("trivy", root)) {
39
22
  sbomFile = path.join(outputDir, `${base}.cyclonedx.json`);
@@ -41,17 +24,33 @@ export async function generateProvenance(root, config, options) {
41
24
  if (sbom.exitCode !== 0)
42
25
  throw new Error(`Trivy SBOM generation failed: ${sbom.stderr || sbom.stdout}`);
43
26
  }
27
+ const manifest = await buildProvenanceManifest(root, config, options.taskId, artifact, sbomFile);
28
+ manifest.subject = { path: relative(root, artifact), sha256: digest };
29
+ const plannedBundle = options.sign ? path.join(outputDir, `${base}.sigstore.json`) : undefined;
30
+ manifest.attestations = { statement: relative(root, statementFile), predicate: relative(root, predicateFile), ...(plannedBundle ? { bundle: relative(root, plannedBundle) } : {}) };
31
+ await fs.writeFile(manifestFile, `${JSON.stringify(manifest, null, 2)}\n`);
32
+ const manifestDigest = await sha256File(manifestFile);
33
+ const runDigest = options.taskId ? await optionalDigest(path.resolve(root, config.sdd?.runsDir ?? ".harness/runs", `${options.taskId}.json`)) : undefined;
34
+ const reportDigest = options.taskId ? await optionalDigest(path.resolve(root, config.sdd?.reportsDir ?? ".harness/reports", `${options.taskId}.json`)) : undefined;
35
+ const predicate = buildSlsaPredicate({ project: config.project.name, artifact: path.basename(artifact), taskId: options.taskId, commit, remote, runDigest, reportDigest, artifactManifestSha256: manifestDigest, buildType: config.provenance?.buildType ?? "https://github.com/JamesMorales04/agentic-engineering-harness/v0.3", invocationId: crypto.randomUUID(), startedOn: new Date().toISOString(), finishedOn: new Date().toISOString() });
36
+ const statement = { _type: "https://in-toto.io/Statement/v1", subject: [{ name: path.basename(artifact), digest: { sha256: digest } }], predicateType: "https://slsa.dev/provenance/v1", predicate };
37
+ await fs.writeFile(predicateFile, `${JSON.stringify(predicate, null, 2)}\n`);
38
+ await fs.writeFile(statementFile, `${JSON.stringify(statement, null, 2)}\n`);
44
39
  let bundleFile;
45
40
  if (options.sign) {
46
41
  if (!(await commandExists("cosign", root)))
47
42
  throw new Error("--sign requested but cosign is not installed.");
48
- bundleFile = path.join(outputDir, `${base}.sigstore.json`);
43
+ if (!plannedBundle)
44
+ throw new Error("Signing bundle path could not be resolved.");
45
+ bundleFile = plannedBundle;
49
46
  const key = config.provenance?.cosignKey ? ` --key ${quote(config.provenance.cosignKey)}` : "";
50
47
  const signed = await runProcess(`cosign sign-blob ${quote(statementFile)} --bundle ${quote(bundleFile)}${key}`, { cwd: root, timeoutMs: 300_000, env: { COSIGN_YES: "true" } });
51
48
  if (signed.exitCode !== 0)
52
49
  throw new Error(`Cosign signing failed: ${signed.stderr || signed.stdout}`);
50
+ if (!(await verifyCosignBundle(root, statementFile, bundleFile, config.provenance?.cosignKey)))
51
+ throw new Error("Cosign produced a bundle that could not be verified.");
53
52
  }
54
- return { artifact: path.relative(root, artifact).replaceAll("\\", "/"), sha256: digest, statementFile: relative(root, statementFile), predicateFile: relative(root, predicateFile), sbomFile: sbomFile && relative(root, sbomFile), bundleFile: bundleFile && relative(root, bundleFile) };
53
+ return { artifact: relative(root, artifact), sha256: digest, statementFile: relative(root, statementFile), predicateFile: relative(root, predicateFile), manifestFile: relative(root, manifestFile), sbomFile: sbomFile && relative(root, sbomFile), bundleFile: bundleFile && relative(root, bundleFile) };
55
54
  }
56
55
  export function buildSlsaPredicate(input) {
57
56
  const internalParameters = {};
@@ -61,28 +60,196 @@ export function buildSlsaPredicate(input) {
61
60
  internalParameters.runReportSha256 = input.runDigest;
62
61
  if (input.reportDigest)
63
62
  internalParameters.validationReportSha256 = input.reportDigest;
64
- return {
65
- buildDefinition: {
66
- buildType: input.buildType,
67
- externalParameters: { project: input.project, artifact: input.artifact },
68
- internalParameters,
69
- resolvedDependencies: input.commit ? [{ uri: input.remote ? `git+${input.remote}` : "git:local", digest: { gitCommit: input.commit } }] : []
70
- },
71
- runDetails: {
72
- builder: { id: "https://github.com/JamesMorales04/agentic-engineering-harness" },
73
- metadata: { invocationId: input.invocationId, startedOn: input.startedOn, finishedOn: input.finishedOn }
63
+ if (input.artifactManifestSha256)
64
+ internalParameters.artifactManifestSha256 = input.artifactManifestSha256;
65
+ return { buildDefinition: { buildType: input.buildType, externalParameters: { project: input.project, artifact: input.artifact }, internalParameters, resolvedDependencies: input.commit ? [{ uri: input.remote ? `git+${input.remote}` : "git:local", digest: { gitCommit: input.commit } }] : [] }, runDetails: { builder: { id: "https://github.com/JamesMorales04/agentic-engineering-harness" }, metadata: { invocationId: input.invocationId, startedOn: input.startedOn, finishedOn: input.finishedOn } } };
66
+ }
67
+ export async function buildProvenanceManifest(root, config, taskId, artifact, sbomFile) {
68
+ const candidates = new Map();
69
+ candidates.set(relative(root, artifact), "final-artifact");
70
+ if (sbomFile)
71
+ candidates.set(relative(root, sbomFile), "sbom");
72
+ let operationId;
73
+ const required = [];
74
+ const members = [];
75
+ if (taskId) {
76
+ const runFile = path.resolve(root, config.sdd?.runsDir ?? ".harness/runs", taskId + ".json");
77
+ const reportFile = path.resolve(root, config.sdd?.reportsDir ?? ".harness/reports", taskId + ".json");
78
+ const evidenceFile = path.resolve(root, config.evidence?.outputDir ?? ".harness/evidence", taskId + ".json");
79
+ const contractFile = path.resolve(root, config.sdd?.contractsDir ?? ".harness/contracts", taskId + ".yaml");
80
+ const sealFile = path.resolve(root, ".harness/seals", taskId + ".json");
81
+ const controlPlaneFile = path.resolve(root, config.controlPlane?.snapshotDir ?? ".harness/controller", taskId, "manifest.json");
82
+ addCandidate(root, candidates, runFile, "operation-result");
83
+ addCandidate(root, candidates, reportFile, "validation-report");
84
+ addCandidate(root, candidates, evidenceFile, "requirement-evidence-graph");
85
+ addCandidate(root, candidates, contractFile, "task-contract");
86
+ addCandidate(root, candidates, sealFile, "task-contract-seal");
87
+ addCandidate(root, candidates, controlPlaneFile, "control-plane-snapshot");
88
+ const contract = await loadTaskContract(root, taskId, config).catch(() => undefined);
89
+ for (const source of Object.values(contract?.source ?? {}))
90
+ if (source)
91
+ addCandidate(root, candidates, path.resolve(root, source), "normative-spec-source");
92
+ const runRecord = await readJson(root, relative(root, runFile), []);
93
+ const authoritativeOperationId = typeof runRecord?.operationId === "string" ? runRecord.operationId : typeof runRecord?.result?.operationId === "string" ? runRecord.result.operationId : undefined;
94
+ const operation = await selectOperation(root, taskId, authoritativeOperationId);
95
+ if (authoritativeOperationId && !operation)
96
+ throw new Error("PROVENANCE_REQUIRED_ARTIFACT_MISSING: " + path.posix.join(".harness/operations", safeId(authoritativeOperationId) + ".json"));
97
+ if (operation) {
98
+ operationId = operation.id;
99
+ const operationFile = path.resolve(root, ".harness/operations", safeId(operation.id) + ".json");
100
+ await requireArtifact(root, candidates, required, operationFile, "operation-record");
101
+ members.push(relative(root, operationFile));
102
+ await requireArtifact(root, candidates, required, contractFile, "task-contract");
103
+ if (config.validation?.requireSeal !== false)
104
+ await requireArtifact(root, candidates, required, sealFile, "task-contract-seal");
105
+ await requireArtifact(root, candidates, required, runFile, "operation-result");
106
+ await requireArtifact(root, candidates, required, reportFile, "validation-report");
107
+ if (config.evidence?.enabled || config.evidence?.requireComplete)
108
+ await requireArtifact(root, candidates, required, evidenceFile, "requirement-evidence-graph");
109
+ if (config.controlPlane?.required)
110
+ await requireArtifact(root, candidates, required, controlPlaneFile, "control-plane-snapshot");
111
+ const eventFile = path.resolve(root, ".harness/operations", safeId(operation.id), "events.ndjson");
112
+ addCandidate(root, candidates, eventFile, "operation-events");
113
+ for (const ref of referencedPaths(operation)) {
114
+ const absolute = path.resolve(root, ref);
115
+ addCandidate(root, candidates, absolute, "lineage-artifact");
116
+ if (await exists(absolute))
117
+ members.push(relative(root, absolute));
118
+ }
119
+ }
120
+ }
121
+ const entries = [];
122
+ for (const [relativePath, kind] of candidates) {
123
+ try {
124
+ entries.push({ path: relativePath, kind, sha256: await sha256File(path.resolve(root, relativePath)) });
74
125
  }
75
- };
126
+ catch { /* optional artifacts are omitted */ }
127
+ }
128
+ entries.sort((a, b) => a.path.localeCompare(b.path));
129
+ const lineage = operationId ? { operationId, gitCommit: await gitValue(root, "git rev-parse HEAD"), required, members: [...new Set(members)] } : undefined;
130
+ return { version: 1, generatedAt: new Date().toISOString(), taskId, entries, ...(lineage ? { lineage } : {}) };
76
131
  }
77
- export async function sha256File(file) {
78
- return await new Promise((resolve, reject) => {
79
- const hash = crypto.createHash("sha256");
80
- const stream = createReadStream(file);
81
- stream.on("data", (chunk) => hash.update(chunk));
82
- stream.on("error", reject);
83
- stream.on("end", () => resolve(hash.digest("hex")));
84
- });
132
+ export async function verifyProvenanceManifest(root, manifestFile) {
133
+ const file = path.resolve(root, manifestFile);
134
+ let manifest;
135
+ try {
136
+ manifest = JSON.parse(await fs.readFile(file, "utf8"));
137
+ }
138
+ catch (error) {
139
+ return { ok: false, failures: [`manifest unreadable: ${String(error)}`] };
140
+ }
141
+ const failures = [];
142
+ if (manifest.version !== 1 || !Array.isArray(manifest.entries))
143
+ failures.push("manifest structure is invalid");
144
+ const paths = new Set();
145
+ for (const entry of manifest.entries ?? []) {
146
+ if (!entry?.path || paths.has(entry.path) || !isSafeRelative(entry.path) || !/^[a-f0-9]{64}$/.test(entry.sha256)) {
147
+ failures.push(`invalid manifest entry: ${JSON.stringify(entry)}`);
148
+ continue;
149
+ }
150
+ paths.add(entry.path);
151
+ try {
152
+ const actual = await sha256File(path.resolve(root, entry.path));
153
+ if (actual !== entry.sha256)
154
+ failures.push(`${entry.path}: expected ${entry.sha256}, got ${actual}`);
155
+ }
156
+ catch (error) {
157
+ failures.push(`${entry.path}: ${String(error)}`);
158
+ }
159
+ }
160
+ if (manifest.subject) {
161
+ if (!isSafeRelative(manifest.subject.path) || !/^[a-f0-9]{64}$/.test(manifest.subject.sha256))
162
+ failures.push("manifest subject is invalid");
163
+ else
164
+ try {
165
+ const actual = await sha256File(path.resolve(root, manifest.subject.path));
166
+ if (actual !== manifest.subject.sha256)
167
+ failures.push(`subject ${manifest.subject.path}: digest mismatch`);
168
+ }
169
+ catch (error) {
170
+ failures.push(`subject ${manifest.subject.path}: ${String(error)}`);
171
+ }
172
+ }
173
+ if (manifest.lineage)
174
+ for (const member of manifest.lineage.required)
175
+ if (!paths.has(member))
176
+ failures.push(`required lineage member missing: ${member}`);
177
+ if (manifest.attestations) {
178
+ if (!isSafeRelative(manifest.attestations.statement) || !isSafeRelative(manifest.attestations.predicate))
179
+ failures.push("attestation references are invalid");
180
+ const statement = isSafeRelative(manifest.attestations.statement) ? await readJson(root, manifest.attestations.statement, failures) : undefined;
181
+ const predicate = isSafeRelative(manifest.attestations.predicate) ? await readJson(root, manifest.attestations.predicate, failures) : undefined;
182
+ if (statement && manifest.subject) {
183
+ const subject = Array.isArray(statement.subject) ? statement.subject[0] : undefined;
184
+ if (subject?.digest?.sha256 !== manifest.subject.sha256)
185
+ failures.push("in-toto statement subject does not match manifest subject");
186
+ }
187
+ const predicateDigest = predicate?.buildDefinition?.internalParameters?.artifactManifestSha256;
188
+ const actualManifestDigest = await sha256File(file).catch(() => undefined);
189
+ if (predicateDigest && actualManifestDigest && predicateDigest !== actualManifestDigest)
190
+ failures.push("SLSA predicate does not bind this manifest digest");
191
+ const commit = predicate?.buildDefinition?.resolvedDependencies?.[0]?.digest?.gitCommit;
192
+ if (commit && manifest.lineage?.gitCommit && commit !== manifest.lineage.gitCommit)
193
+ failures.push("SLSA resolved dependency commit disagrees with lineage");
194
+ if (manifest.attestations.bundle && (!isSafeRelative(manifest.attestations.bundle) || !isSafeRelative(manifest.attestations.statement) || !(await verifyCosignBundle(root, manifest.attestations.statement, manifest.attestations.bundle))))
195
+ failures.push("Cosign bundle verification failed");
196
+ }
197
+ return { ok: failures.length === 0, failures };
198
+ }
199
+ export async function verifyCosignBundle(root, statementFile, bundleFile, key) {
200
+ if (!(await commandExists("cosign", root)))
201
+ return false;
202
+ const keyArg = key ? ` --key ${quote(path.resolve(root, key))}` : "";
203
+ const result = await runProcess(`cosign verify-blob --bundle ${quote(path.resolve(root, bundleFile))}${keyArg} ${quote(path.resolve(root, statementFile))}`, { cwd: root, timeoutMs: 60_000 });
204
+ return result.exitCode === 0;
205
+ }
206
+ export async function sha256File(file) { return await new Promise((resolve, reject) => { const hash = crypto.createHash("sha256"); const stream = createReadStream(file); stream.on("data", (chunk) => hash.update(chunk)); stream.on("error", reject); stream.on("end", () => resolve(hash.digest("hex"))); }); }
207
+ async function selectOperation(root, taskId, authoritativeOperationId) {
208
+ const directory = path.resolve(root, ".harness/operations");
209
+ if (authoritativeOperationId)
210
+ return readJson(root, path.posix.join(".harness/operations", safeId(authoritativeOperationId) + ".json"), []);
211
+ const files = await fs.readdir(directory, { withFileTypes: true }).catch(() => []);
212
+ const records = [];
213
+ for (const entry of files)
214
+ if (entry.isFile() && entry.name.endsWith(".json") && !entry.name.endsWith(".wake.json") && !entry.name.endsWith(".completion.json")) {
215
+ const record = await readJson(root, path.relative(root, path.join(directory, entry.name)), []);
216
+ if (record && operationMatches(record, taskId))
217
+ records.push(record);
218
+ }
219
+ return records.sort((a, b) => String(b.updatedAt ?? b.createdAt).localeCompare(String(a.updatedAt ?? a.createdAt)))[0];
220
+ }
221
+ function operationMatches(value, taskId) { return value.payload?.taskId === taskId || value.result?.taskId === taskId || value.result?.contract?.task?.id === taskId; }
222
+ function referencedPaths(operation) { const result = []; const visit = (value, key = "") => { if (typeof value === "string" && /(artifact|report|handoff|evidence|result|checkpoint|statement|predicate|seal|contract|spec)/i.test(key) && value.length < 500 && !value.includes("\n"))
223
+ result.push(value);
224
+ else if (Array.isArray(value))
225
+ value.forEach((item) => visit(item, key));
226
+ else if (value && typeof value === "object")
227
+ Object.entries(value).forEach(([name, item]) => visit(item, name)); }; visit(operation.result, "result"); visit(operation.stages, "stage"); visit(operation.participants, "participant"); visit(operation.supervision, "supervision"); return [...new Set(result)].filter((item) => !item.startsWith("http://") && !item.startsWith("https://")); }
228
+ function addCandidate(root, candidates, absolute, kind) { const relativePath = relative(root, absolute); if (relativePath === ".." || relativePath.startsWith(`..${path.sep}`) || path.isAbsolute(relativePath))
229
+ return; candidates.set(relativePath, kind); }
230
+ async function requireArtifact(root, candidates, required, absolute, kind) {
231
+ const relativePath = relative(root, absolute);
232
+ if (!isSafeRelative(relativePath) || !(await exists(absolute)))
233
+ throw new Error("PROVENANCE_REQUIRED_ARTIFACT_MISSING: " + relativePath);
234
+ candidates.set(relativePath, kind);
235
+ required.push(relativePath);
236
+ }
237
+ async function exists(file) { try {
238
+ await fs.stat(file);
239
+ return true;
240
+ }
241
+ catch {
242
+ return false;
243
+ } }
244
+ function isSafeRelative(value) { return typeof value === "string" && value.length > 0 && !path.isAbsolute(value) && !value.split(/[\\/]/).includes(".."); }
245
+ async function readJson(root, relativePath, failures) { try {
246
+ const value = JSON.parse(await fs.readFile(path.resolve(root, relativePath), "utf8"));
247
+ return value && typeof value === "object" ? value : undefined;
85
248
  }
249
+ catch (error) {
250
+ failures.push(`${relativePath}: ${String(error)}`);
251
+ return undefined;
252
+ } }
86
253
  async function optionalDigest(file) { try {
87
254
  return await sha256File(file);
88
255
  }
@@ -92,5 +259,6 @@ catch {
92
259
  async function gitValue(root, command) { const result = await runProcess(command, { cwd: root, timeoutMs: 30_000 }); return result.exitCode === 0 ? result.stdout.trim() : ""; }
93
260
  function relative(root, file) { return path.relative(root, file).replaceAll("\\", "/"); }
94
261
  function sanitize(value) { return value.replace(/[^A-Za-z0-9._-]/g, "-"); }
262
+ function safeId(value) { return value.replace(/[^A-Za-z0-9._-]/g, "-"); }
95
263
  function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
96
264
  //# sourceMappingURL=generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/provenance/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/provenance/generate.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,34 @@
1
- import type { MemoryProvider } from "./types.js";
1
+ import type { MemoryProvider, MemoryRecord } from "./types.js";
2
+ import { runProcess } from "../utils/process.js";
3
+ export interface EngramOptions {
4
+ command?: string;
5
+ storagePath?: string;
6
+ maxRecall?: number;
7
+ executor?: typeof runProcess;
8
+ }
9
+ export declare const ENGRAM_VERSION: string;
2
10
  export declare class EngramMemoryProvider implements MemoryProvider {
11
+ private readonly root;
3
12
  readonly name = "engram";
13
+ private readonly command;
14
+ private readonly storagePath;
15
+ private readonly maxRecall;
16
+ private readonly executor;
17
+ constructor(root: string, options?: EngramOptions);
4
18
  doctor(root: string): Promise<{
5
19
  ok: boolean;
6
20
  message: string;
21
+ version?: string;
7
22
  }>;
23
+ remember(record: MemoryRecord): Promise<string | undefined>;
24
+ recall(project: string, query: string): Promise<MemoryRecord[]>;
25
+ private readLedger;
8
26
  }
27
+ export declare function createMemoryProvider(root: string, config: {
28
+ memory?: {
29
+ provider?: string;
30
+ required?: boolean;
31
+ };
32
+ }): Promise<MemoryProvider | undefined>;
33
+ export declare function memoryFingerprint(record: MemoryRecord): string;
34
+ export declare function filterStaleRecords(root: string, records: MemoryRecord[]): Promise<MemoryRecord[]>;
@@ -1,14 +1,150 @@
1
- import { commandExists } from "../utils/process.js";
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { commandExists, runProcess } from "../utils/process.js";
5
+ import { providerVersions } from "./versions.js";
6
+ export const ENGRAM_VERSION = providerVersions.engram;
2
7
  export class EngramMemoryProvider {
8
+ root;
3
9
  name = "engram";
10
+ command;
11
+ storagePath;
12
+ maxRecall;
13
+ executor;
14
+ constructor(root, options = {}) {
15
+ this.root = root;
16
+ this.command = options.command ?? "engram";
17
+ this.storagePath = path.resolve(root, options.storagePath ?? ".harness/memory/engram.ndjson");
18
+ this.maxRecall = options.maxRecall ?? 8;
19
+ this.executor = options.executor ?? runProcess;
20
+ }
4
21
  async doctor(root) {
5
- const ok = await commandExists("engram", root);
22
+ if (!(await commandExists(this.command, root)))
23
+ return { ok: false, message: `Engram executable '${this.command}' was not found in the reconciled toolchain PATH.` };
24
+ const result = await this.executor(`${quote(this.command)} doctor`, { cwd: root, timeoutMs: 20_000 });
25
+ if (result.exitCode !== 0)
26
+ return { ok: false, message: `Engram health check failed: ${result.stderr || result.stdout}` };
27
+ const version = (result.stdout || result.stderr).match(/v?\d+\.\d+(?:\.\d+)?/)?.[0];
6
28
  return {
7
- ok,
8
- message: ok
9
- ? "Engram CLI detected. Memory remains advisory; Git artifacts remain authoritative."
10
- : "Engram CLI was not found. Install/configure it or set memory.required=false."
29
+ ok: true,
30
+ version,
31
+ message: `Engram memory provider ready${version ? ` (${version})` : ""}; memory is advisory.`
11
32
  };
12
33
  }
34
+ async remember(record) {
35
+ const normalized = normalizeRecord(record);
36
+ const records = await this.readLedger();
37
+ const duplicate = records.find((item) => fingerprint(item) === fingerprint(normalized));
38
+ if (duplicate)
39
+ return duplicate.id;
40
+ const id = normalized.id ?? fingerprint(normalized).slice(0, 24);
41
+ const stored = { ...normalized, id };
42
+ const payload = JSON.stringify({ ...stored, advisory: true, provenance: stored.source });
43
+ const result = await this.executor(`${quote(this.command)} store ${quote(payload)} --type semantic --importance 0.5 --namespace ${quote(normalized.project)} --source aeh`, { cwd: this.root, timeoutMs: 30_000, env: { ENGRAM_NAMESPACE_MODE: "isolated", ENGRAM_NAMESPACE: normalized.project } });
44
+ if (result.exitCode !== 0)
45
+ throw new Error(`Engram remember failed: ${result.stderr || result.stdout}`);
46
+ await fs.mkdir(path.dirname(this.storagePath), { recursive: true });
47
+ await fs.appendFile(this.storagePath, `${JSON.stringify(stored)}\n`, "utf8");
48
+ return id;
49
+ }
50
+ async recall(project, query) {
51
+ if (!project.trim() || !query.trim())
52
+ return [];
53
+ const all = await this.readLedger();
54
+ const local = (await filterStaleRecords(this.root, all)).filter((record) => record.project === project && !all.some((candidate) => candidate.supersedes === record.id && candidate.project === project) && matches(record, query)).slice(-this.maxRecall).reverse();
55
+ const result = await this.executor(`${quote(this.command)} recall ${quote(query)} --json`, { cwd: this.root, timeoutMs: 30_000, env: { ENGRAM_NAMESPACE_MODE: "isolated", ENGRAM_NAMESPACE: project } });
56
+ if (result.exitCode !== 0)
57
+ throw new Error(`Engram recall failed: ${result.stderr || result.stdout}`);
58
+ return dedupe([...local, ...parseRecords(result.stdout, project)]).slice(0, this.maxRecall);
59
+ }
60
+ async readLedger() {
61
+ try {
62
+ return (await fs.readFile(this.storagePath, "utf8")).split(/\r?\n/).filter(Boolean).flatMap((line) => { try {
63
+ return [normalizeRecord(JSON.parse(line))];
64
+ }
65
+ catch {
66
+ return [];
67
+ } });
68
+ }
69
+ catch {
70
+ return [];
71
+ }
72
+ }
73
+ }
74
+ export async function createMemoryProvider(root, config) {
75
+ const provider = config.memory?.provider;
76
+ if (!provider || provider === "none")
77
+ return undefined;
78
+ if (provider !== "engram")
79
+ throw new Error(`Unsupported memory provider '${provider}'.`);
80
+ const instance = new EngramMemoryProvider(root);
81
+ const health = await instance.doctor(root);
82
+ if (!health.ok) {
83
+ if (config.memory?.required)
84
+ throw new Error(`Required memory provider unavailable: ${health.message}`);
85
+ return undefined;
86
+ }
87
+ return instance;
88
+ }
89
+ export function memoryFingerprint(record) { return fingerprint(normalizeRecord(record)); }
90
+ export async function filterStaleRecords(root, records) {
91
+ const result = [];
92
+ for (const record of records) {
93
+ if (!record.source || !record.sourceSha256) {
94
+ result.push(record);
95
+ continue;
96
+ }
97
+ try {
98
+ const actual = crypto.createHash("sha256").update(await fs.readFile(path.resolve(root, record.source))).digest("hex");
99
+ if (actual === record.sourceSha256)
100
+ result.push(record);
101
+ }
102
+ catch { /* an unavailable provenance artifact is stale, not authoritative */ }
103
+ }
104
+ return result;
105
+ }
106
+ function normalizeRecord(record) { if (!record.project?.trim() || !record.title?.trim() || !record.content?.trim())
107
+ throw new Error("Memory records require project, title and content."); return { ...record, project: record.project.trim(), title: record.title.trim(), content: record.content.trim(), tags: [...new Set(record.tags ?? [])].sort() }; }
108
+ function fingerprint(record) { return crypto.createHash("sha256").update(JSON.stringify({ project: record.project, type: record.type, title: record.title, content: record.content, tags: record.tags ?? [] })).digest("hex"); }
109
+ function matches(record, query) { const haystack = `${record.title} ${record.content} ${(record.tags ?? []).join(" ")}`.toLocaleLowerCase(); return query.toLocaleLowerCase().split(/\s+/).filter(Boolean).some((term) => haystack.includes(term)); }
110
+ function parseRecords(stdout, project) {
111
+ try {
112
+ const parsed = JSON.parse(stdout);
113
+ const values = Array.isArray(parsed) ? parsed : parsed && typeof parsed === "object" && Array.isArray(parsed.memories) ? parsed.memories : [parsed];
114
+ return values.flatMap((item) => parseRecord(item, project));
115
+ }
116
+ catch {
117
+ return stdout.split(/\r?\n/).filter(Boolean).flatMap((line) => { try {
118
+ return parseRecord(JSON.parse(line), project);
119
+ }
120
+ catch {
121
+ return [];
122
+ } });
123
+ }
124
+ }
125
+ function parseRecord(item, project) {
126
+ if (!item || typeof item !== "object")
127
+ return [];
128
+ const value = item;
129
+ if (typeof value.content !== "string")
130
+ return [];
131
+ let embedded;
132
+ try {
133
+ const parsed = JSON.parse(value.content);
134
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed))
135
+ embedded = parsed;
136
+ }
137
+ catch { /* ordinary Engram content */ }
138
+ if (typeof value.project === "string" && value.project !== project)
139
+ return [];
140
+ if (embedded?.project && embedded.project !== project)
141
+ return [];
142
+ const source = embedded ?? value;
143
+ const title = typeof source.title === "string" ? source.title : typeof value.title === "string" ? value.title : "Engram recalled memory";
144
+ const content = typeof embedded?.content === "string" ? embedded.content : value.content;
145
+ return [normalizeRecord({ project, type: typeof source.type === "string" ? source.type : "discovery", title, content, id: typeof source.id === "string" ? source.id : typeof value.id === "string" ? value.id : undefined, source: typeof source.source === "string" ? source.source : typeof value.source === "string" ? value.source : undefined, sourceSha256: typeof source.sourceSha256 === "string" ? source.sourceSha256 : undefined, tags: Array.isArray(source.tags) ? source.tags.filter((tag) => typeof tag === "string") : undefined })];
13
146
  }
147
+ function dedupe(records) { const seen = new Set(); return records.filter((record) => { const key = fingerprint(record); if (seen.has(key))
148
+ return false; seen.add(key); return true; }); }
149
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
14
150
  //# sourceMappingURL=engram.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engram.js","sourceRoot":"","sources":["../../src/providers/engram.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,QAAQ,CAAC;IAEzB,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO;YACL,EAAE;YACF,OAAO,EAAE,EAAE;gBACT,CAAC,CAAC,mFAAmF;gBACrF,CAAC,CAAC,8EAA8E;SACnF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"engram.js","sourceRoot":"","sources":["../../src/providers/engram.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,36 @@
1
- import type { CodeIntelligenceProvider } from "./types.js";
1
+ import type { HarnessProjectConfig } from "../core/types.js";
2
+ import type { CodeIntelligenceProvider, CodeImpactReport } from "./types.js";
3
+ import { runProcess } from "../utils/process.js";
4
+ export interface GraphifyGenerationMetadata {
5
+ version: 1;
6
+ provider: "graphify";
7
+ providerVersion: string;
8
+ gitCommit?: string;
9
+ sourceFingerprint: string;
10
+ graphSha256: string;
11
+ generatedAt: string;
12
+ }
13
+ export declare const GRAPHIFY_VERSION: string;
14
+ /** Graphify owns generation/freshness; all consumers use graphifyModel.ts. */
2
15
  export declare class GraphifyCodeIntelligenceProvider implements CodeIntelligenceProvider {
16
+ private readonly config?;
17
+ private readonly executor;
3
18
  readonly name = "graphify";
19
+ constructor(config?: HarnessProjectConfig | undefined, executor?: typeof runProcess);
4
20
  doctor(root: string): Promise<{
5
21
  ok: boolean;
6
22
  message: string;
7
23
  }>;
24
+ build(root: string): Promise<void>;
25
+ refresh(root: string): Promise<void>;
8
26
  update(root: string): Promise<void>;
27
+ load(root: string): Promise<unknown | undefined>;
28
+ isFresh(root: string): Promise<boolean>;
29
+ impact(root: string): Promise<CodeImpactReport>;
30
+ private generate;
31
+ private targetConfiguredGraph;
32
+ private graphPath;
33
+ private metadataPath;
34
+ private readMetadata;
35
+ private providerVersion;
9
36
  }