agentic-engineering-harness 0.6.28 → 0.6.29
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/dist/agents/permissions.js +8 -6
- package/dist/agents/permissions.js.map +1 -1
- package/dist/cli.js +12 -13
- package/dist/cli.js.map +1 -1
- package/dist/context/compression/headroom.d.ts +1 -0
- package/dist/context/compression/headroom.js +2 -1
- package/dist/context/compression/headroom.js.map +1 -1
- package/dist/context/envelope.js +1 -1
- package/dist/context/envelope.js.map +1 -1
- package/dist/context/gateway.d.ts +1 -1
- package/dist/context/gateway.js +32 -10
- package/dist/context/gateway.js.map +1 -1
- package/dist/context/policy.js +1 -1
- package/dist/context/policy.js.map +1 -1
- package/dist/context/preflight.js +10 -4
- package/dist/context/preflight.js.map +1 -1
- package/dist/context/repository/graphify.d.ts +1 -0
- package/dist/context/repository/graphify.js +4 -33
- package/dist/context/repository/graphify.js.map +1 -1
- package/dist/context/repository/serena.d.ts +1 -1
- package/dist/context/repository/serena.js +1 -1
- package/dist/context/types.d.ts +19 -1
- package/dist/context/types.js +1 -1
- package/dist/context/types.js.map +1 -1
- package/dist/core/config.js +5 -7
- package/dist/core/config.js.map +1 -1
- package/dist/core/doctor.js +6 -6
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/run.js +33 -14
- package/dist/core/run.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/verify.d.ts +2 -0
- package/dist/core/verify.js +1 -1
- package/dist/core/verify.js.map +1 -1
- package/dist/evals/fullStack.d.ts +17 -0
- package/dist/evals/fullStack.js +42 -0
- package/dist/evals/fullStack.js.map +1 -0
- package/dist/provenance/generate.d.ts +19 -0
- package/dist/provenance/generate.js +94 -8
- package/dist/provenance/generate.js.map +1 -1
- package/dist/providers/engram.d.ts +26 -1
- package/dist/providers/engram.js +110 -6
- package/dist/providers/engram.js.map +1 -1
- package/dist/providers/graphify.d.ts +9 -1
- package/dist/providers/graphify.js +34 -16
- package/dist/providers/graphify.js.map +1 -1
- package/dist/providers/graphifyModel.d.ts +23 -0
- package/dist/providers/graphifyModel.js +101 -0
- package/dist/providers/graphifyModel.js.map +1 -0
- package/dist/providers/memory.d.ts +1 -0
- package/dist/providers/memory.js +2 -0
- package/dist/providers/memory.js.map +1 -0
- package/dist/providers/types.d.ts +8 -2
- package/dist/telemetry/events.d.ts +1 -0
- package/dist/telemetry/events.js +19 -2
- package/dist/telemetry/events.js.map +1 -1
- package/dist/telemetry/otlp.d.ts +6 -1
- package/dist/telemetry/otlp.js +2 -2
- package/dist/telemetry/otlp.js.map +1 -1
- package/dist/validators/external.js +24 -3
- package/dist/validators/external.js.map +1 -1
- package/dist/validators/graphify.js +5 -73
- package/dist/validators/graphify.js.map +1 -1
- package/dist/validators/opa.d.ts +14 -1
- package/dist/validators/opa.js +6 -2
- package/dist/validators/opa.js.map +1 -1
- package/dist/validators/toolEvidence.d.ts +29 -0
- package/dist/validators/toolEvidence.js +104 -0
- package/dist/validators/toolEvidence.js.map +1 -0
- package/dist/workers/agentPrompt.d.ts +9 -0
- package/dist/workers/agentPrompt.js +119 -9
- package/dist/workers/agentPrompt.js.map +1 -1
- package/docs/ARCHITECTURE.md +6 -1
- package/docs/COMPONENT_MATURITY.md +43 -0
- package/docs/CONTEXT_EFFICIENCY.md +11 -2
- package/docs/MEMORY.md +9 -0
- package/docs/OBSERVABILITY.md +6 -1
- package/docs/OSS_STACK.md +8 -2
- package/docs/SECURITY.md +12 -0
- package/package.json +1 -1
- package/policies/core/trust-boundary.rego +14 -4
- package/templates/project.yaml +4 -0
- package/templates/toolchain.yaml +10 -3
package/dist/core/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HarnessProjectConfig } from "../core/types.js";
|
|
2
|
+
import { type DoctorResult } from "../core/doctor.js";
|
|
3
|
+
export interface FullStackDogfoodReport {
|
|
4
|
+
version: 1;
|
|
5
|
+
profile: "full-stack";
|
|
6
|
+
generatedAt: string;
|
|
7
|
+
status: "PASS" | "FAIL";
|
|
8
|
+
checks: DoctorResult[];
|
|
9
|
+
configuredComponents: string[];
|
|
10
|
+
limitations: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Explicit, deterministic full-stack lane. It runs provider setup/doctor
|
|
14
|
+
* checks and records the exact configured surface; expensive agent execution
|
|
15
|
+
* remains opt-in instead of being silently forced into every local run.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runFullStackDogfood(root: string, config: HarnessProjectConfig): Promise<FullStackDogfoodReport>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { runDoctor } from "../core/doctor.js";
|
|
4
|
+
/**
|
|
5
|
+
* Explicit, deterministic full-stack lane. It runs provider setup/doctor
|
|
6
|
+
* checks and records the exact configured surface; expensive agent execution
|
|
7
|
+
* remains opt-in instead of being silently forced into every local run.
|
|
8
|
+
*/
|
|
9
|
+
export async function runFullStackDogfood(root, config) {
|
|
10
|
+
const checks = await runDoctor(root, config);
|
|
11
|
+
const configuredComponents = configuredSurface(config);
|
|
12
|
+
const limitations = ["This lane validates installed/configured provider contracts; consumer application tests remain owned by the consumer repository."];
|
|
13
|
+
const requiredFailures = checks.filter((check) => check.required && !check.ok);
|
|
14
|
+
const report = { version: 1, profile: "full-stack", generatedAt: new Date().toISOString(), status: requiredFailures.length ? "FAIL" : "PASS", checks, configuredComponents, limitations };
|
|
15
|
+
const outputDir = path.resolve(root, config.evals?.resultsDir ?? ".harness/evals/results");
|
|
16
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
17
|
+
await fs.writeFile(path.join(outputDir, `full-stack-${Date.now()}.json`), `${JSON.stringify(report, null, 2)}\n`);
|
|
18
|
+
return report;
|
|
19
|
+
}
|
|
20
|
+
function configuredSurface(config) {
|
|
21
|
+
const result = ["git", "node"];
|
|
22
|
+
if (config.orchestration?.provider && config.orchestration.provider !== "none")
|
|
23
|
+
result.push(config.orchestration.provider);
|
|
24
|
+
if (config.memory?.provider && config.memory.provider !== "none")
|
|
25
|
+
result.push(`memory:${config.memory.provider}`);
|
|
26
|
+
if (config.codeIntelligence?.provider && config.codeIntelligence.provider !== "none")
|
|
27
|
+
result.push(`code-intelligence:${config.codeIntelligence.provider}`);
|
|
28
|
+
if (config.context?.semanticRetrieval?.provider && config.context.semanticRetrieval.provider !== "none")
|
|
29
|
+
result.push(`semantic:${config.context.semanticRetrieval.provider}`);
|
|
30
|
+
if (config.context?.compression?.provider && config.context.compression.provider !== "none")
|
|
31
|
+
result.push(`compression:${config.context.compression.provider}`);
|
|
32
|
+
if (config.validation?.opa?.enabled)
|
|
33
|
+
result.push("opa");
|
|
34
|
+
for (const validator of config.validation?.validators ?? [])
|
|
35
|
+
result.push(`validator:${validator.adapter}`);
|
|
36
|
+
if (config.telemetry?.exporter && config.telemetry.exporter !== "none")
|
|
37
|
+
result.push("otlp");
|
|
38
|
+
if (config.provenance?.cosignKey)
|
|
39
|
+
result.push("cosign");
|
|
40
|
+
return [...new Set(result)];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=fullStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullStack.js","sourceRoot":"","sources":["../../src/evals/fullStack.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,23 @@ export interface ProvenanceOptions {
|
|
|
5
5
|
sbom?: boolean;
|
|
6
6
|
sign?: boolean;
|
|
7
7
|
}
|
|
8
|
+
export interface ProvenanceManifestEntry {
|
|
9
|
+
path: string;
|
|
10
|
+
sha256: string;
|
|
11
|
+
kind: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ProvenanceManifest {
|
|
14
|
+
version: 1;
|
|
15
|
+
generatedAt: string;
|
|
16
|
+
taskId?: string;
|
|
17
|
+
entries: ProvenanceManifestEntry[];
|
|
18
|
+
}
|
|
8
19
|
export interface ProvenanceResult {
|
|
9
20
|
artifact: string;
|
|
10
21
|
sha256: string;
|
|
11
22
|
statementFile: string;
|
|
12
23
|
predicateFile: string;
|
|
24
|
+
manifestFile: string;
|
|
13
25
|
sbomFile?: string;
|
|
14
26
|
bundleFile?: string;
|
|
15
27
|
}
|
|
@@ -22,9 +34,16 @@ export declare function buildSlsaPredicate(input: {
|
|
|
22
34
|
remote: string;
|
|
23
35
|
runDigest?: string;
|
|
24
36
|
reportDigest?: string;
|
|
37
|
+
artifactManifestSha256?: string;
|
|
25
38
|
buildType: string;
|
|
26
39
|
invocationId: string;
|
|
27
40
|
startedOn: string;
|
|
28
41
|
finishedOn: string;
|
|
29
42
|
}): Record<string, unknown>;
|
|
43
|
+
export declare function buildProvenanceManifest(root: string, config: HarnessProjectConfig, taskId: string | undefined, artifact: string, sbomFile?: string): Promise<ProvenanceManifest>;
|
|
44
|
+
export declare function verifyProvenanceManifest(root: string, manifestFile: string): Promise<{
|
|
45
|
+
ok: boolean;
|
|
46
|
+
failures: string[];
|
|
47
|
+
}>;
|
|
48
|
+
export declare function verifyCosignBundle(root: string, statementFile: string, bundleFile: string, key?: string): Promise<boolean>;
|
|
30
49
|
export declare function sha256File(file: string): Promise<string>;
|
|
@@ -2,6 +2,7 @@ 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);
|
|
@@ -16,6 +17,17 @@ export async function generateProvenance(root, config, options) {
|
|
|
16
17
|
const base = sanitize(path.basename(artifact));
|
|
17
18
|
const predicateFile = path.join(outputDir, `${base}.slsa-provenance.json`);
|
|
18
19
|
const statementFile = path.join(outputDir, `${base}.intoto.json`);
|
|
20
|
+
let sbomFile;
|
|
21
|
+
if (options.sbom !== false && await commandExists("trivy", root)) {
|
|
22
|
+
sbomFile = path.join(outputDir, `${base}.cyclonedx.json`);
|
|
23
|
+
const sbom = await runProcess(`trivy fs --format cyclonedx --output ${quote(sbomFile)} ${quote(root)}`, { cwd: root, timeoutMs: 600_000 });
|
|
24
|
+
if (sbom.exitCode !== 0)
|
|
25
|
+
throw new Error(`Trivy SBOM generation failed: ${sbom.stderr || sbom.stdout}`);
|
|
26
|
+
}
|
|
27
|
+
const manifest = await buildProvenanceManifest(root, config, options.taskId, artifact, sbomFile);
|
|
28
|
+
const manifestFile = path.join(outputDir, `${base}.manifest.json`);
|
|
29
|
+
await fs.writeFile(manifestFile, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
30
|
+
const manifestDigest = await sha256File(manifestFile);
|
|
19
31
|
const runDigest = options.taskId ? await optionalDigest(path.resolve(root, config.sdd?.runsDir ?? ".harness/runs", `${options.taskId}.json`)) : undefined;
|
|
20
32
|
const reportDigest = options.taskId ? await optionalDigest(path.resolve(root, config.sdd?.reportsDir ?? ".harness/reports", `${options.taskId}.json`)) : undefined;
|
|
21
33
|
const predicate = buildSlsaPredicate({
|
|
@@ -26,6 +38,7 @@ export async function generateProvenance(root, config, options) {
|
|
|
26
38
|
remote,
|
|
27
39
|
runDigest,
|
|
28
40
|
reportDigest,
|
|
41
|
+
artifactManifestSha256: manifestDigest,
|
|
29
42
|
buildType: config.provenance?.buildType ?? "https://github.com/JamesMorales04/agentic-engineering-harness/v0.3",
|
|
30
43
|
invocationId: crypto.randomUUID(),
|
|
31
44
|
startedOn: new Date().toISOString(),
|
|
@@ -34,13 +47,6 @@ export async function generateProvenance(root, config, options) {
|
|
|
34
47
|
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
48
|
await fs.writeFile(predicateFile, `${JSON.stringify(predicate, null, 2)}\n`);
|
|
36
49
|
await fs.writeFile(statementFile, `${JSON.stringify(statement, null, 2)}\n`);
|
|
37
|
-
let sbomFile;
|
|
38
|
-
if (options.sbom !== false && await commandExists("trivy", root)) {
|
|
39
|
-
sbomFile = path.join(outputDir, `${base}.cyclonedx.json`);
|
|
40
|
-
const sbom = await runProcess(`trivy fs --format cyclonedx --output ${quote(sbomFile)} ${quote(root)}`, { cwd: root, timeoutMs: 600_000 });
|
|
41
|
-
if (sbom.exitCode !== 0)
|
|
42
|
-
throw new Error(`Trivy SBOM generation failed: ${sbom.stderr || sbom.stdout}`);
|
|
43
|
-
}
|
|
44
50
|
let bundleFile;
|
|
45
51
|
if (options.sign) {
|
|
46
52
|
if (!(await commandExists("cosign", root)))
|
|
@@ -50,8 +56,10 @@ export async function generateProvenance(root, config, options) {
|
|
|
50
56
|
const signed = await runProcess(`cosign sign-blob ${quote(statementFile)} --bundle ${quote(bundleFile)}${key}`, { cwd: root, timeoutMs: 300_000, env: { COSIGN_YES: "true" } });
|
|
51
57
|
if (signed.exitCode !== 0)
|
|
52
58
|
throw new Error(`Cosign signing failed: ${signed.stderr || signed.stdout}`);
|
|
59
|
+
if (!(await verifyCosignBundle(root, statementFile, bundleFile, config.provenance?.cosignKey)))
|
|
60
|
+
throw new Error("Cosign produced a bundle that could not be verified.");
|
|
53
61
|
}
|
|
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) };
|
|
62
|
+
return { artifact: path.relative(root, artifact).replaceAll("\\", "/"), 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
63
|
}
|
|
56
64
|
export function buildSlsaPredicate(input) {
|
|
57
65
|
const internalParameters = {};
|
|
@@ -61,6 +69,8 @@ export function buildSlsaPredicate(input) {
|
|
|
61
69
|
internalParameters.runReportSha256 = input.runDigest;
|
|
62
70
|
if (input.reportDigest)
|
|
63
71
|
internalParameters.validationReportSha256 = input.reportDigest;
|
|
72
|
+
if (input.artifactManifestSha256)
|
|
73
|
+
internalParameters.artifactManifestSha256 = input.artifactManifestSha256;
|
|
64
74
|
return {
|
|
65
75
|
buildDefinition: {
|
|
66
76
|
buildType: input.buildType,
|
|
@@ -74,6 +84,82 @@ export function buildSlsaPredicate(input) {
|
|
|
74
84
|
}
|
|
75
85
|
};
|
|
76
86
|
}
|
|
87
|
+
export async function buildProvenanceManifest(root, config, taskId, artifact, sbomFile) {
|
|
88
|
+
const candidates = new Map();
|
|
89
|
+
candidates.set(relative(root, artifact), "final-artifact");
|
|
90
|
+
if (sbomFile)
|
|
91
|
+
candidates.set(relative(root, sbomFile), "sbom");
|
|
92
|
+
if (taskId) {
|
|
93
|
+
candidates.set(relative(root, path.resolve(root, config.sdd?.runsDir ?? ".harness/runs", `${taskId}.json`)), "operation-record");
|
|
94
|
+
candidates.set(relative(root, path.resolve(root, config.sdd?.reportsDir ?? ".harness/reports", `${taskId}.json`)), "validation-report");
|
|
95
|
+
candidates.set(relative(root, path.resolve(root, config.evidence?.outputDir ?? ".harness/evidence", `${taskId}.json`)), "requirement-evidence-graph");
|
|
96
|
+
candidates.set(relative(root, path.resolve(root, config.sdd?.contractsDir ?? ".harness/contracts", `${taskId}.yaml`)), "task-contract");
|
|
97
|
+
candidates.set(relative(root, path.resolve(root, ".harness/seals", `${taskId}.json`)), "task-contract-seal");
|
|
98
|
+
candidates.set(relative(root, path.resolve(root, config.controlPlane?.snapshotDir ?? ".harness/controller", taskId, "manifest.json")), "control-plane-snapshot");
|
|
99
|
+
const contract = await loadTaskContract(root, taskId, config).catch(() => undefined);
|
|
100
|
+
for (const [name, source] of Object.entries(contract?.source ?? {}))
|
|
101
|
+
if (source)
|
|
102
|
+
candidates.set(relative(root, path.resolve(root, source)), `openspec-${name}`);
|
|
103
|
+
for (const [directory, kind] of [[".harness/operations", "operation-record"], [".harness/paseo/handoffs", "handoff"], [".harness/audits", "audit-report"], [config.evidence?.outputDir ?? ".harness/evidence", "evidence"]]) {
|
|
104
|
+
for (const file of await filesUnder(root, directory))
|
|
105
|
+
candidates.set(file, kind);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const entries = [];
|
|
109
|
+
for (const [relativePath, kind] of candidates) {
|
|
110
|
+
try {
|
|
111
|
+
entries.push({ path: relativePath, kind, sha256: await sha256File(path.resolve(root, relativePath)) });
|
|
112
|
+
}
|
|
113
|
+
catch { /* optional artifacts are omitted, never represented with a false digest */ }
|
|
114
|
+
}
|
|
115
|
+
entries.sort((a, b) => a.path.localeCompare(b.path));
|
|
116
|
+
return { version: 1, generatedAt: new Date().toISOString(), taskId, entries };
|
|
117
|
+
}
|
|
118
|
+
async function filesUnder(root, relativeDirectory) {
|
|
119
|
+
const result = [];
|
|
120
|
+
const visit = async (directory) => {
|
|
121
|
+
for (const entry of await fs.readdir(directory, { withFileTypes: true }).catch(() => [])) {
|
|
122
|
+
const absolute = path.join(directory, entry.name);
|
|
123
|
+
if (entry.isDirectory())
|
|
124
|
+
await visit(absolute);
|
|
125
|
+
else if (entry.isFile())
|
|
126
|
+
result.push(relative(root, absolute));
|
|
127
|
+
if (result.length >= 2_000)
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
await visit(path.resolve(root, relativeDirectory));
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
export async function verifyProvenanceManifest(root, manifestFile) {
|
|
135
|
+
const file = path.resolve(root, manifestFile);
|
|
136
|
+
let manifest;
|
|
137
|
+
try {
|
|
138
|
+
manifest = JSON.parse(await fs.readFile(file, "utf8"));
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
return { ok: false, failures: [`manifest unreadable: ${String(error)}`] };
|
|
142
|
+
}
|
|
143
|
+
const failures = [];
|
|
144
|
+
for (const entry of manifest.entries ?? []) {
|
|
145
|
+
try {
|
|
146
|
+
const actual = await sha256File(path.resolve(root, entry.path));
|
|
147
|
+
if (actual !== entry.sha256)
|
|
148
|
+
failures.push(`${entry.path}: expected ${entry.sha256}, got ${actual}`);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
failures.push(`${entry.path}: ${String(error)}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { ok: failures.length === 0, failures };
|
|
155
|
+
}
|
|
156
|
+
export async function verifyCosignBundle(root, statementFile, bundleFile, key) {
|
|
157
|
+
if (!(await commandExists("cosign", root)))
|
|
158
|
+
return false;
|
|
159
|
+
const keyArg = key ? ` --key ${quote(path.resolve(root, key))}` : "";
|
|
160
|
+
const result = await runProcess(`cosign verify-blob --bundle ${quote(path.resolve(root, bundleFile))}${keyArg} ${quote(path.resolve(root, statementFile))}`, { cwd: root, timeoutMs: 60_000 });
|
|
161
|
+
return result.exitCode === 0;
|
|
162
|
+
}
|
|
77
163
|
export async function sha256File(file) {
|
|
78
164
|
return await new Promise((resolve, reject) => {
|
|
79
165
|
const hash = crypto.createHash("sha256");
|
|
@@ -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,33 @@
|
|
|
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
|
+
}
|
|
2
9
|
export declare class EngramMemoryProvider implements MemoryProvider {
|
|
10
|
+
private readonly root;
|
|
3
11
|
readonly name = "engram";
|
|
12
|
+
private readonly command;
|
|
13
|
+
private readonly storagePath;
|
|
14
|
+
private readonly maxRecall;
|
|
15
|
+
private readonly executor;
|
|
16
|
+
constructor(root: string, options?: EngramOptions);
|
|
4
17
|
doctor(root: string): Promise<{
|
|
5
18
|
ok: boolean;
|
|
6
19
|
message: string;
|
|
20
|
+
version?: string;
|
|
7
21
|
}>;
|
|
22
|
+
remember(record: MemoryRecord): Promise<string | undefined>;
|
|
23
|
+
recall(project: string, query: string): Promise<MemoryRecord[]>;
|
|
24
|
+
private readLedger;
|
|
8
25
|
}
|
|
26
|
+
export declare function createMemoryProvider(root: string, config: {
|
|
27
|
+
memory?: {
|
|
28
|
+
provider?: string;
|
|
29
|
+
required?: boolean;
|
|
30
|
+
};
|
|
31
|
+
}): Promise<MemoryProvider | undefined>;
|
|
32
|
+
export declare function memoryFingerprint(record: MemoryRecord): string;
|
|
33
|
+
export declare function filterStaleRecords(root: string, records: MemoryRecord[]): Promise<MemoryRecord[]>;
|
package/dist/providers/engram.js
CHANGED
|
@@ -1,14 +1,118 @@
|
|
|
1
|
-
import
|
|
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";
|
|
2
5
|
export class EngramMemoryProvider {
|
|
6
|
+
root;
|
|
3
7
|
name = "engram";
|
|
8
|
+
command;
|
|
9
|
+
storagePath;
|
|
10
|
+
maxRecall;
|
|
11
|
+
executor;
|
|
12
|
+
constructor(root, options = {}) {
|
|
13
|
+
this.root = root;
|
|
14
|
+
this.command = options.command ?? "engram";
|
|
15
|
+
this.storagePath = path.resolve(root, options.storagePath ?? ".harness/memory/engram.ndjson");
|
|
16
|
+
this.maxRecall = options.maxRecall ?? 8;
|
|
17
|
+
this.executor = options.executor ?? runProcess;
|
|
18
|
+
}
|
|
4
19
|
async doctor(root) {
|
|
5
|
-
|
|
20
|
+
if (!(await commandExists(this.command, root)))
|
|
21
|
+
return { ok: false, message: `Engram executable '${this.command}' was not found in the reconciled toolchain PATH.` };
|
|
22
|
+
const result = await this.executor(`${quote(this.command)} doctor`, { cwd: root, timeoutMs: 20_000 });
|
|
23
|
+
if (result.exitCode !== 0)
|
|
24
|
+
return { ok: false, message: `Engram health check failed: ${result.stderr || result.stdout}` };
|
|
25
|
+
const version = (result.stdout || result.stderr).match(/v?\d+\.\d+(?:\.\d+)?/)?.[0];
|
|
6
26
|
return {
|
|
7
|
-
ok,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
: "Engram CLI was not found. Install/configure it or set memory.required=false."
|
|
27
|
+
ok: true,
|
|
28
|
+
version,
|
|
29
|
+
message: `Engram memory provider ready${version ? ` (${version})` : ""}; memory is advisory.`
|
|
11
30
|
};
|
|
12
31
|
}
|
|
32
|
+
async remember(record) {
|
|
33
|
+
const normalized = normalizeRecord(record);
|
|
34
|
+
const records = await this.readLedger();
|
|
35
|
+
const duplicate = records.find((item) => fingerprint(item) === fingerprint(normalized));
|
|
36
|
+
if (duplicate)
|
|
37
|
+
return duplicate.id;
|
|
38
|
+
const id = normalized.id ?? fingerprint(normalized).slice(0, 24);
|
|
39
|
+
const stored = { ...normalized, id };
|
|
40
|
+
const payload = JSON.stringify({ ...stored, advisory: true, provenance: stored.source });
|
|
41
|
+
const result = await this.executor(`${quote(this.command)} store ${quote(payload)} --type semantic --importance 0.5`, { cwd: this.root, timeoutMs: 30_000, env: { ENGRAM_NAMESPACE_MODE: "isolated", ENGRAM_NAMESPACE: normalized.project } });
|
|
42
|
+
if (result.exitCode !== 0)
|
|
43
|
+
throw new Error(`Engram remember failed: ${result.stderr || result.stdout}`);
|
|
44
|
+
await fs.mkdir(path.dirname(this.storagePath), { recursive: true });
|
|
45
|
+
await fs.appendFile(this.storagePath, `${JSON.stringify(stored)}\n`, "utf8");
|
|
46
|
+
return id;
|
|
47
|
+
}
|
|
48
|
+
async recall(project, query) {
|
|
49
|
+
if (!project.trim() || !query.trim())
|
|
50
|
+
return [];
|
|
51
|
+
const all = await this.readLedger();
|
|
52
|
+
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();
|
|
53
|
+
const result = await this.executor(`${quote(this.command)} recall ${quote(query)} --raw`, { cwd: this.root, timeoutMs: 30_000, env: { ENGRAM_NAMESPACE_MODE: "isolated", ENGRAM_NAMESPACE: project } });
|
|
54
|
+
if (result.exitCode !== 0)
|
|
55
|
+
throw new Error(`Engram recall failed: ${result.stderr || result.stdout}`);
|
|
56
|
+
return dedupe([...local, ...parseRecords(result.stdout, project)]).slice(0, this.maxRecall);
|
|
57
|
+
}
|
|
58
|
+
async readLedger() {
|
|
59
|
+
try {
|
|
60
|
+
return (await fs.readFile(this.storagePath, "utf8")).split(/\r?\n/).filter(Boolean).flatMap((line) => { try {
|
|
61
|
+
return [normalizeRecord(JSON.parse(line))];
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return [];
|
|
65
|
+
} });
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function createMemoryProvider(root, config) {
|
|
73
|
+
const provider = config.memory?.provider;
|
|
74
|
+
if (!provider || provider === "none")
|
|
75
|
+
return undefined;
|
|
76
|
+
if (provider !== "engram")
|
|
77
|
+
throw new Error(`Unsupported memory provider '${provider}'.`);
|
|
78
|
+
const instance = new EngramMemoryProvider(root);
|
|
79
|
+
const health = await instance.doctor(root);
|
|
80
|
+
if (!health.ok) {
|
|
81
|
+
if (config.memory?.required)
|
|
82
|
+
throw new Error(`Required memory provider unavailable: ${health.message}`);
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
return instance;
|
|
86
|
+
}
|
|
87
|
+
export function memoryFingerprint(record) { return fingerprint(normalizeRecord(record)); }
|
|
88
|
+
export async function filterStaleRecords(root, records) {
|
|
89
|
+
const result = [];
|
|
90
|
+
for (const record of records) {
|
|
91
|
+
if (!record.source || !record.sourceSha256) {
|
|
92
|
+
result.push(record);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const actual = crypto.createHash("sha256").update(await fs.readFile(path.resolve(root, record.source))).digest("hex");
|
|
97
|
+
if (actual === record.sourceSha256)
|
|
98
|
+
result.push(record);
|
|
99
|
+
}
|
|
100
|
+
catch { /* an unavailable provenance artifact is stale, not authoritative */ }
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
function normalizeRecord(record) { if (!record.project?.trim() || !record.title?.trim() || !record.content?.trim())
|
|
105
|
+
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() }; }
|
|
106
|
+
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"); }
|
|
107
|
+
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)); }
|
|
108
|
+
function parseRecords(stdout, project) { return stdout.split(/\r?\n/).filter(Boolean).flatMap((line) => { try {
|
|
109
|
+
const value = JSON.parse(line);
|
|
110
|
+
return typeof value.content === "string" && typeof value.title === "string" ? [normalizeRecord({ project, type: value.type ?? "discovery", title: value.title, content: value.content, id: value.id, source: value.source, tags: value.tags })] : [];
|
|
13
111
|
}
|
|
112
|
+
catch {
|
|
113
|
+
return [];
|
|
114
|
+
} }); }
|
|
115
|
+
function dedupe(records) { const seen = new Set(); return records.filter((record) => { const key = fingerprint(record); if (seen.has(key))
|
|
116
|
+
return false; seen.add(key); return true; }); }
|
|
117
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
14
118
|
//# sourceMappingURL=engram.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engram.js","sourceRoot":"","sources":["../../src/providers/engram.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engram.js","sourceRoot":"","sources":["../../src/providers/engram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HarnessProjectConfig } from "../core/types.js";
|
|
2
|
+
import type { CodeIntelligenceProvider, CodeImpactReport } from "./types.js";
|
|
2
3
|
export declare class GraphifyCodeIntelligenceProvider implements CodeIntelligenceProvider {
|
|
4
|
+
private readonly config?;
|
|
3
5
|
readonly name = "graphify";
|
|
6
|
+
constructor(config?: HarnessProjectConfig | undefined);
|
|
4
7
|
doctor(root: string): Promise<{
|
|
5
8
|
ok: boolean;
|
|
6
9
|
message: string;
|
|
7
10
|
}>;
|
|
11
|
+
build(root: string): Promise<void>;
|
|
12
|
+
refresh(root: string): Promise<void>;
|
|
8
13
|
update(root: string): Promise<void>;
|
|
14
|
+
load(root: string): Promise<unknown | undefined>;
|
|
15
|
+
isFresh(root: string): Promise<boolean>;
|
|
16
|
+
impact(root: string): Promise<CodeImpactReport>;
|
|
9
17
|
}
|
|
@@ -1,28 +1,46 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { commandExists } from "../utils/process.js";
|
|
1
|
+
import { commandExists, runProcess } from "../utils/process.js";
|
|
2
|
+
import { loadCanonicalGraph } from "./graphifyModel.js";
|
|
4
3
|
export class GraphifyCodeIntelligenceProvider {
|
|
4
|
+
config;
|
|
5
5
|
name = "graphify";
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
6
9
|
async doctor(root) {
|
|
7
10
|
const cli = await commandExists("graphify", root);
|
|
8
|
-
const graph = await
|
|
11
|
+
const graph = await this.load(root);
|
|
9
12
|
return {
|
|
10
|
-
ok: cli || graph,
|
|
11
|
-
message: graph ? "Graphify graph detected
|
|
13
|
+
ok: Boolean(cli || graph),
|
|
14
|
+
message: graph ? "Graphify graph detected and readable through the canonical AEH model." : cli ? "Graphify CLI detected but no readable graph exists; configure codeIntelligence.refreshCommand or build the graph before a required run." : "Graphify CLI/graph not found. Structural validation can remain optional or be disabled."
|
|
12
15
|
};
|
|
13
16
|
}
|
|
14
|
-
async
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
async build(root) { await this.refresh(root); }
|
|
18
|
+
async refresh(root) {
|
|
19
|
+
const command = this.config?.codeIntelligence?.refreshCommand;
|
|
20
|
+
if (command) {
|
|
21
|
+
const result = await runProcess(command, { cwd: root, timeoutMs: 300_000 });
|
|
22
|
+
if (result.exitCode !== 0)
|
|
23
|
+
throw new Error(`Graphify refresh failed: ${result.stderr || result.stdout}`);
|
|
24
|
+
}
|
|
25
|
+
if (!(await this.load(root)))
|
|
26
|
+
throw new Error("Graphify graph is unavailable after refresh. Configure codeIntelligence.refreshCommand or generate the configured graph path.");
|
|
17
27
|
}
|
|
18
|
-
}
|
|
19
|
-
async
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
async update(root) { await this.refresh(root); }
|
|
29
|
+
async load(root) {
|
|
30
|
+
return loadCanonicalGraph(root, this.config?.codeIntelligence?.graphPath ?? "graphify-out/graph.json");
|
|
31
|
+
}
|
|
32
|
+
async isFresh(root) {
|
|
33
|
+
const graph = await this.load(root);
|
|
34
|
+
if (!graph)
|
|
35
|
+
return false;
|
|
36
|
+
// A configured refresh command is the only provider-specific way to prove
|
|
37
|
+
// freshness. Required runs invoke it before snapshots; this method remains
|
|
38
|
+
// conservative for callers that need a readiness decision.
|
|
39
|
+
return Boolean(graph.generatedAt);
|
|
23
40
|
}
|
|
24
|
-
|
|
25
|
-
|
|
41
|
+
async impact(root) {
|
|
42
|
+
const graph = await this.load(root);
|
|
43
|
+
return { provider: this.name, affectedNodes: graph?.nodes ?? [], affectedCommunities: [...new Set(Object.values(graph?.communities ?? {}))] };
|
|
26
44
|
}
|
|
27
45
|
}
|
|
28
46
|
//# sourceMappingURL=graphify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../src/providers/graphify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../src/providers/graphify.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,OAAO,gCAAgC;IAEd;IADpB,IAAI,GAAG,UAAU,CAAC;IAC3B,YAA6B,MAA6B;QAA7B,WAAM,GAAN,MAAM,CAAuB;IAAG,CAAC;IAC9D,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC;YACzB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,uEAAuE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,yIAAyI,CAAC,CAAC,CAAC,yFAAyF;SACvU,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAAY,IAAmB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,cAAc,CAAC;QAC9D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5E,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+HAA+H,CAAC,CAAC;IACjL,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,IAAY,IAAmB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,IAAI,yBAAyB,CAAC,CAAC;IACzG,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,0EAA0E;QAC1E,2EAA2E;QAC3E,2DAA2D;QAC3D,OAAO,OAAO,CAAE,KAAkC,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAA2E,CAAC;QAC9G,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,mBAAmB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChJ,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RepositoryContextMap } from "../context/repository/types.js";
|
|
2
|
+
/** Canonical, lossless-enough structural representation consumed by all AEH Graphify users. */
|
|
3
|
+
export interface CanonicalGraphEdge {
|
|
4
|
+
from: string;
|
|
5
|
+
to: string;
|
|
6
|
+
relation: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CanonicalGraph {
|
|
9
|
+
createdAt: string;
|
|
10
|
+
source: string;
|
|
11
|
+
sourceHash: string;
|
|
12
|
+
nodes: string[];
|
|
13
|
+
edges: string[];
|
|
14
|
+
edgePairs: CanonicalGraphEdge[];
|
|
15
|
+
nodeFiles: Record<string, string>;
|
|
16
|
+
communities: Record<string, string>;
|
|
17
|
+
centrality: Record<string, number>;
|
|
18
|
+
generatedAt?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function loadCanonicalGraph(root: string, graphPath?: string): Promise<CanonicalGraph | undefined>;
|
|
21
|
+
/** One parser for Graphify variants; callers must not normalize provider output independently. */
|
|
22
|
+
export declare function normalizeGraphDocument(raw: unknown, source?: string, sourceHash?: string): CanonicalGraph;
|
|
23
|
+
export declare function canonicalGraphToRepositoryMap(graph: CanonicalGraph): RepositoryContextMap;
|