agentic-engineering-harness 0.6.27 → 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.
Files changed (202) hide show
  1. package/README.md +3 -3
  2. package/dist/agents/permissions.js +12 -0
  3. package/dist/agents/permissions.js.map +1 -1
  4. package/dist/audit/run.js +2 -0
  5. package/dist/audit/run.js.map +1 -1
  6. package/dist/cli.js +12 -13
  7. package/dist/cli.js.map +1 -1
  8. package/dist/context/budget.d.ts +4 -0
  9. package/dist/context/budget.js +19 -0
  10. package/dist/context/budget.js.map +1 -0
  11. package/dist/context/classifier.d.ts +4 -0
  12. package/dist/context/classifier.js +14 -0
  13. package/dist/context/classifier.js.map +1 -0
  14. package/dist/context/compression/headroom.d.ts +18 -0
  15. package/dist/context/compression/headroom.js +53 -0
  16. package/dist/context/compression/headroom.js.map +1 -0
  17. package/dist/context/compression/index.d.ts +3 -0
  18. package/dist/context/compression/index.js +4 -0
  19. package/dist/context/compression/index.js.map +1 -0
  20. package/dist/context/compression/lifecycle.d.ts +20 -0
  21. package/dist/context/compression/lifecycle.js +70 -0
  22. package/dist/context/compression/lifecycle.js.map +1 -0
  23. package/dist/context/compression/types.d.ts +27 -0
  24. package/dist/context/compression/types.js +2 -0
  25. package/dist/context/compression/types.js.map +1 -0
  26. package/dist/context/envelope.d.ts +4 -0
  27. package/dist/context/envelope.js +20 -0
  28. package/dist/context/envelope.js.map +1 -0
  29. package/dist/context/estimator.d.ts +3 -0
  30. package/dist/context/estimator.js +10 -0
  31. package/dist/context/estimator.js.map +1 -0
  32. package/dist/context/eval.d.ts +19 -0
  33. package/dist/context/eval.js +12 -0
  34. package/dist/context/eval.js.map +1 -0
  35. package/dist/context/gateway.d.ts +22 -0
  36. package/dist/context/gateway.js +202 -0
  37. package/dist/context/gateway.js.map +1 -0
  38. package/dist/context/index.d.ts +15 -0
  39. package/dist/context/index.js +16 -0
  40. package/dist/context/index.js.map +1 -0
  41. package/dist/context/policy.d.ts +6 -0
  42. package/dist/context/policy.js +40 -0
  43. package/dist/context/policy.js.map +1 -0
  44. package/dist/context/preflight.d.ts +13 -0
  45. package/dist/context/preflight.js +25 -0
  46. package/dist/context/preflight.js.map +1 -0
  47. package/dist/context/projectors/audit.d.ts +2 -0
  48. package/dist/context/projectors/audit.js +30 -0
  49. package/dist/context/projectors/audit.js.map +1 -0
  50. package/dist/context/projectors/diff.d.ts +2 -0
  51. package/dist/context/projectors/diff.js +8 -0
  52. package/dist/context/projectors/diff.js.map +1 -0
  53. package/dist/context/projectors/explorer.d.ts +2 -0
  54. package/dist/context/projectors/explorer.js +5 -0
  55. package/dist/context/projectors/explorer.js.map +1 -0
  56. package/dist/context/projectors/index.d.ts +8 -0
  57. package/dist/context/projectors/index.js +9 -0
  58. package/dist/context/projectors/index.js.map +1 -0
  59. package/dist/context/projectors/operation.d.ts +3 -0
  60. package/dist/context/projectors/operation.js +26 -0
  61. package/dist/context/projectors/operation.js.map +1 -0
  62. package/dist/context/projectors/planner.d.ts +2 -0
  63. package/dist/context/projectors/planner.js +5 -0
  64. package/dist/context/projectors/planner.js.map +1 -0
  65. package/dist/context/projectors/source.d.ts +2 -0
  66. package/dist/context/projectors/source.js +5 -0
  67. package/dist/context/projectors/source.js.map +1 -0
  68. package/dist/context/projectors/structured.d.ts +2 -0
  69. package/dist/context/projectors/structured.js +24 -0
  70. package/dist/context/projectors/structured.js.map +1 -0
  71. package/dist/context/projectors/validation.d.ts +3 -0
  72. package/dist/context/projectors/validation.js +25 -0
  73. package/dist/context/projectors/validation.js.map +1 -0
  74. package/dist/context/provenance.d.ts +3 -0
  75. package/dist/context/provenance.js +13 -0
  76. package/dist/context/provenance.js.map +1 -0
  77. package/dist/context/repository/graphify.d.ts +3 -0
  78. package/dist/context/repository/graphify.js +7 -0
  79. package/dist/context/repository/graphify.js.map +1 -0
  80. package/dist/context/repository/index.d.ts +6 -0
  81. package/dist/context/repository/index.js +7 -0
  82. package/dist/context/repository/index.js.map +1 -0
  83. package/dist/context/repository/map.d.ts +6 -0
  84. package/dist/context/repository/map.js +34 -0
  85. package/dist/context/repository/map.js.map +1 -0
  86. package/dist/context/repository/rank.d.ts +3 -0
  87. package/dist/context/repository/rank.js +43 -0
  88. package/dist/context/repository/rank.js.map +1 -0
  89. package/dist/context/repository/render.d.ts +8 -0
  90. package/dist/context/repository/render.js +21 -0
  91. package/dist/context/repository/render.js.map +1 -0
  92. package/dist/context/repository/serena.d.ts +11 -0
  93. package/dist/context/repository/serena.js +26 -0
  94. package/dist/context/repository/serena.js.map +1 -0
  95. package/dist/context/repository/types.d.ts +34 -0
  96. package/dist/context/repository/types.js +2 -0
  97. package/dist/context/repository/types.js.map +1 -0
  98. package/dist/context/retrieval/authorization.d.ts +11 -0
  99. package/dist/context/retrieval/authorization.js +9 -0
  100. package/dist/context/retrieval/authorization.js.map +1 -0
  101. package/dist/context/retrieval/gateway.d.ts +33 -0
  102. package/dist/context/retrieval/gateway.js +69 -0
  103. package/dist/context/retrieval/gateway.js.map +1 -0
  104. package/dist/context/retrieval/index.d.ts +5 -0
  105. package/dist/context/retrieval/index.js +6 -0
  106. package/dist/context/retrieval/index.js.map +1 -0
  107. package/dist/context/retrieval/mcp.d.ts +3 -0
  108. package/dist/context/retrieval/mcp.js +8 -0
  109. package/dist/context/retrieval/mcp.js.map +1 -0
  110. package/dist/context/retrieval/persisted.d.ts +3 -0
  111. package/dist/context/retrieval/persisted.js +22 -0
  112. package/dist/context/retrieval/persisted.js.map +1 -0
  113. package/dist/context/retrieval/server.d.ts +1 -0
  114. package/dist/context/retrieval/server.js +52 -0
  115. package/dist/context/retrieval/server.js.map +1 -0
  116. package/dist/context/telemetry.d.ts +3 -0
  117. package/dist/context/telemetry.js +9 -0
  118. package/dist/context/telemetry.js.map +1 -0
  119. package/dist/context/types.d.ts +243 -0
  120. package/dist/context/types.js +29 -0
  121. package/dist/context/types.js.map +1 -0
  122. package/dist/core/config.js +19 -1
  123. package/dist/core/config.js.map +1 -1
  124. package/dist/core/doctor.js +23 -2
  125. package/dist/core/doctor.js.map +1 -1
  126. package/dist/core/run.js +35 -14
  127. package/dist/core/run.js.map +1 -1
  128. package/dist/core/types.d.ts +52 -0
  129. package/dist/core/verify.d.ts +2 -0
  130. package/dist/core/verify.js +1 -1
  131. package/dist/core/verify.js.map +1 -1
  132. package/dist/entry.js +30 -0
  133. package/dist/entry.js.map +1 -1
  134. package/dist/evals/fullStack.d.ts +17 -0
  135. package/dist/evals/fullStack.js +42 -0
  136. package/dist/evals/fullStack.js.map +1 -0
  137. package/dist/main.js +1 -0
  138. package/dist/main.js.map +1 -1
  139. package/dist/operations/change.js +2 -0
  140. package/dist/operations/change.js.map +1 -1
  141. package/dist/paseo/launchSpec.d.ts +3 -0
  142. package/dist/paseo/launchSpec.js +17 -0
  143. package/dist/paseo/launchSpec.js.map +1 -1
  144. package/dist/provenance/generate.d.ts +19 -0
  145. package/dist/provenance/generate.js +94 -8
  146. package/dist/provenance/generate.js.map +1 -1
  147. package/dist/providers/engram.d.ts +26 -1
  148. package/dist/providers/engram.js +110 -6
  149. package/dist/providers/engram.js.map +1 -1
  150. package/dist/providers/graphify.d.ts +9 -1
  151. package/dist/providers/graphify.js +34 -16
  152. package/dist/providers/graphify.js.map +1 -1
  153. package/dist/providers/graphifyModel.d.ts +23 -0
  154. package/dist/providers/graphifyModel.js +101 -0
  155. package/dist/providers/graphifyModel.js.map +1 -0
  156. package/dist/providers/headroom.d.ts +2 -0
  157. package/dist/providers/headroom.js +3 -0
  158. package/dist/providers/headroom.js.map +1 -0
  159. package/dist/providers/memory.d.ts +1 -0
  160. package/dist/providers/memory.js +2 -0
  161. package/dist/providers/memory.js.map +1 -0
  162. package/dist/providers/serena.d.ts +1 -0
  163. package/dist/providers/serena.js +2 -0
  164. package/dist/providers/serena.js.map +1 -0
  165. package/dist/providers/types.d.ts +25 -2
  166. package/dist/telemetry/events.d.ts +1 -0
  167. package/dist/telemetry/events.js +19 -2
  168. package/dist/telemetry/events.js.map +1 -1
  169. package/dist/telemetry/otlp.d.ts +6 -1
  170. package/dist/telemetry/otlp.js +2 -2
  171. package/dist/telemetry/otlp.js.map +1 -1
  172. package/dist/toolchain/config.js +10 -1
  173. package/dist/toolchain/config.js.map +1 -1
  174. package/dist/toolchain/resolve.js +8 -0
  175. package/dist/toolchain/resolve.js.map +1 -1
  176. package/dist/validators/external.js +24 -3
  177. package/dist/validators/external.js.map +1 -1
  178. package/dist/validators/graphify.js +5 -73
  179. package/dist/validators/graphify.js.map +1 -1
  180. package/dist/validators/opa.d.ts +14 -1
  181. package/dist/validators/opa.js +6 -2
  182. package/dist/validators/opa.js.map +1 -1
  183. package/dist/validators/toolEvidence.d.ts +29 -0
  184. package/dist/validators/toolEvidence.js +104 -0
  185. package/dist/validators/toolEvidence.js.map +1 -0
  186. package/dist/workers/agentPrompt.d.ts +9 -0
  187. package/dist/workers/agentPrompt.js +133 -4
  188. package/dist/workers/agentPrompt.js.map +1 -1
  189. package/docs/ARCHITECTURE.md +20 -1
  190. package/docs/COMPONENT_MATURITY.md +43 -0
  191. package/docs/CONTEXT_EFFICIENCY.md +48 -0
  192. package/docs/MEMORY.md +9 -0
  193. package/docs/OBSERVABILITY.md +6 -1
  194. package/docs/OSS_STACK.md +10 -2
  195. package/docs/SECURITY.md +12 -0
  196. package/package.json +2 -2
  197. package/policies/core/trust-boundary.rego +14 -4
  198. package/presets/agents/default.jsonc +4 -4
  199. package/presets/agents/orchestration.jsonc +2 -2
  200. package/schemas/project.schema.json +14 -0
  201. package/templates/project.yaml +42 -0
  202. package/templates/toolchain.yaml +34 -1
@@ -1,14 +1,118 @@
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";
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
- const ok = await commandExists("engram", root);
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
- 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."
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":"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,17 @@
1
- import type { CodeIntelligenceProvider } from "./types.js";
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 fs from "node:fs/promises";
2
- import path from "node:path";
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 graphExists(root);
11
+ const graph = await this.load(root);
9
12
  return {
10
- ok: cli || graph,
11
- message: graph ? "Graphify graph detected at graphify-out/graph.json. Refresh it through the Graphify skill or codeIntelligence.refreshCommand before after-snapshots." : cli ? "Graphify CLI detected, but no graphify-out/graph.json exists yet. Build the graph through the Graphify skill." : "Graphify CLI/graph not found. Structural validation can remain optional or be disabled."
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 update(root) {
15
- if (!(await graphExists(root)))
16
- throw new Error("Graphify graph is unavailable. Build or refresh graphify-out/graph.json through the Graphify assistant skill or codeIntelligence.refreshCommand.");
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 function graphExists(root) {
20
- try {
21
- await fs.access(path.join(root, "graphify-out", "graph.json"));
22
- return true;
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
- catch {
25
- return false;
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":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,gCAAgC;IAClC,IAAI,GAAG,UAAU,CAAC;IAC3B,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO;YACL,EAAE,EAAE,GAAG,IAAI,KAAK;YAChB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,sJAAsJ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,+GAA+G,CAAC,CAAC,CAAC,yFAAyF;SAC5X,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kJAAkJ,CAAC,CAAC;IACtM,CAAC;CACF;AACD,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAC9G,CAAC"}
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;
@@ -0,0 +1,101 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ export async function loadCanonicalGraph(root, graphPath = "graphify-out/graph.json") {
5
+ const source = path.resolve(root, graphPath);
6
+ try {
7
+ const content = await fs.readFile(source, "utf8");
8
+ return normalizeGraphDocument(JSON.parse(content), graphPath, crypto.createHash("sha256").update(content).digest("hex"));
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ /** One parser for Graphify variants; callers must not normalize provider output independently. */
15
+ export function normalizeGraphDocument(raw, source = "graphify", sourceHash = crypto.createHash("sha256").update(JSON.stringify(raw)).digest("hex")) {
16
+ const labels = new Map();
17
+ const nodeFiles = {};
18
+ const communities = {};
19
+ const edges = new Set();
20
+ const edgePairs = new Map();
21
+ const nodes = new Set();
22
+ const visitNodes = (value) => {
23
+ if (!value || typeof value !== "object")
24
+ return;
25
+ if (Array.isArray(value)) {
26
+ value.forEach(visitNodes);
27
+ return;
28
+ }
29
+ const object = value;
30
+ const id = scalar(object.id ?? object.key ?? object.node_id);
31
+ const label = scalar(object.label ?? object.name ?? object.qualified_name ?? object.title ?? object.file ?? object.path);
32
+ if (id && label)
33
+ labels.set(id, label);
34
+ if (label)
35
+ nodes.add(label);
36
+ const community = scalar(object.community ?? object.community_id ?? object.cluster);
37
+ if (label && community)
38
+ communities[label] = community;
39
+ const file = scalar(object.file ?? object.path ?? object.filepath ?? object.file_path ?? object.source_file ?? object.sourcePath);
40
+ if (label && file && looksLikePath(file))
41
+ nodeFiles[label] = normalizePath(file);
42
+ Object.values(object).forEach(visitNodes);
43
+ };
44
+ visitNodes(raw);
45
+ const visitEdges = (value) => {
46
+ if (!value || typeof value !== "object")
47
+ return;
48
+ if (Array.isArray(value)) {
49
+ value.forEach(visitEdges);
50
+ return;
51
+ }
52
+ const object = value;
53
+ const sourceId = scalar(object.source ?? object.from ?? object.source_id);
54
+ const targetId = scalar(object.target ?? object.to ?? object.target_id);
55
+ if (sourceId && targetId) {
56
+ const from = labels.get(sourceId) ?? sourceId;
57
+ const to = labels.get(targetId) ?? targetId;
58
+ const relation = scalar(object.relation ?? object.type ?? object.kind ?? object.label) ?? "relates";
59
+ nodes.add(from);
60
+ nodes.add(to);
61
+ const text = `${from} --${relation}--> ${to}`;
62
+ edges.add(text);
63
+ edgePairs.set(text, { from, to, relation });
64
+ }
65
+ Object.values(object).forEach(visitEdges);
66
+ };
67
+ visitEdges(raw);
68
+ const adjacency = new Map();
69
+ const add = (from, to) => { const set = adjacency.get(from) ?? new Set(); set.add(to); adjacency.set(from, set); };
70
+ for (const edge of edgePairs.values()) {
71
+ add(edge.from, edge.to);
72
+ add(edge.to, edge.from);
73
+ }
74
+ const denominator = Math.max(1, nodes.size - 1);
75
+ const centrality = {};
76
+ for (const node of nodes)
77
+ centrality[node] = (adjacency.get(node)?.size ?? 0) / denominator;
78
+ const record = raw && typeof raw === "object" ? raw : {};
79
+ return {
80
+ createdAt: new Date().toISOString(), source, sourceHash,
81
+ generatedAt: typeof record.generatedAt === "string" ? record.generatedAt : typeof record.createdAt === "string" ? record.createdAt : undefined,
82
+ edges: [...edges].sort(),
83
+ edgePairs: [...edgePairs.values()].sort((a, b) => `${a.from}:${a.relation}:${a.to}`.localeCompare(`${b.from}:${b.relation}:${b.to}`)),
84
+ nodes: [...nodes].sort(), nodeFiles, communities, centrality
85
+ };
86
+ }
87
+ export function canonicalGraphToRepositoryMap(graph) {
88
+ const nodes = graph.nodes.map((label) => ({
89
+ id: label,
90
+ file: graph.nodeFiles[label] ?? label,
91
+ symbol: graph.nodeFiles[label] ? label : undefined,
92
+ centrality: graph.centrality[label],
93
+ community: graph.communities[label]
94
+ }));
95
+ const edges = graph.edgePairs.map((edge) => ({ from: edge.from, to: edge.to, kind: edge.relation }));
96
+ return { provider: "graphify", generatedAt: graph.generatedAt, nodes, edges };
97
+ }
98
+ function scalar(value) { return typeof value === "string" || typeof value === "number" ? String(value) : undefined; }
99
+ function looksLikePath(value) { return /[\\/]/.test(value) || /\.[A-Za-z0-9]{1,8}$/.test(value); }
100
+ function normalizePath(value) { return value.replaceAll("\\", "/").replace(/^\.\//, ""); }
101
+ //# sourceMappingURL=graphifyModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphifyModel.js","sourceRoot":"","sources":["../../src/providers/graphifyModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { HeadroomCompressionProvider } from "../context/compression/headroom.js";
2
+ export { HeadroomRuntimeManager } from "../context/compression/lifecycle.js";
@@ -0,0 +1,3 @@
1
+ export { HeadroomCompressionProvider } from "../context/compression/headroom.js";
2
+ export { HeadroomRuntimeManager } from "../context/compression/lifecycle.js";
3
+ //# sourceMappingURL=headroom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headroom.js","sourceRoot":"","sources":["../../src/providers/headroom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1 @@
1
+ export { createMemoryProvider, EngramMemoryProvider, filterStaleRecords, memoryFingerprint } from "./engram.js";
@@ -0,0 +1,2 @@
1
+ export { createMemoryProvider, EngramMemoryProvider, filterStaleRecords, memoryFingerprint } from "./engram.js";
2
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/providers/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { SerenaSemanticProvider, SERENA_VERSION, semanticFirstInstruction } from "../context/repository/serena.js";
@@ -0,0 +1,2 @@
1
+ export { SerenaSemanticProvider, SERENA_VERSION, semanticFirstInstruction } from "../context/repository/serena.js";
2
+ //# sourceMappingURL=serena.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serena.js","sourceRoot":"","sources":["../../src/providers/serena.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -5,6 +5,8 @@ export interface MemoryRecord {
5
5
  title: string;
6
6
  content: string;
7
7
  source?: string;
8
+ sourceSha256?: string;
9
+ createdAt?: string;
8
10
  supersedes?: string;
9
11
  tags?: string[];
10
12
  }
@@ -14,8 +16,8 @@ export interface MemoryProvider {
14
16
  ok: boolean;
15
17
  message: string;
16
18
  }>;
17
- remember?(record: MemoryRecord): Promise<string | undefined>;
18
- recall?(project: string, query: string): Promise<MemoryRecord[]>;
19
+ remember(record: MemoryRecord): Promise<string | undefined>;
20
+ recall(project: string, query: string): Promise<MemoryRecord[]>;
19
21
  }
20
22
  export interface CodeImpactReport {
21
23
  provider: string;
@@ -29,9 +31,30 @@ export interface CodeIntelligenceProvider {
29
31
  ok: boolean;
30
32
  message: string;
31
33
  }>;
34
+ build?(root: string): Promise<void>;
35
+ refresh?(root: string): Promise<void>;
32
36
  update?(root: string): Promise<void>;
37
+ load?(root: string): Promise<unknown | undefined>;
38
+ isFresh?(root: string): Promise<boolean>;
33
39
  impact?(root: string, diffRef?: string): Promise<CodeImpactReport>;
34
40
  }
41
+ export interface SemanticRepositoryProvider {
42
+ readonly name: string;
43
+ doctor(root: string): Promise<{
44
+ ok: boolean;
45
+ message: string;
46
+ version?: string;
47
+ }>;
48
+ mcpServer?(root: string): unknown;
49
+ }
50
+ export interface ContextCompressionProvider {
51
+ readonly name: string;
52
+ doctor(root: string): Promise<{
53
+ ok: boolean;
54
+ message: string;
55
+ version?: string;
56
+ }>;
57
+ }
35
58
  export interface OrchestrationProvider {
36
59
  readonly name: string;
37
60
  doctor(root: string): Promise<{
@@ -1,2 +1,3 @@
1
1
  import type { HarnessProjectConfig } from "../core/types.js";
2
2
  export declare function recordEvent(root: string, config: HarnessProjectConfig, name: string, attributes: Record<string, unknown>): Promise<void>;
3
+ export declare function resetOperationTrace(operationId?: string): void;
@@ -1,8 +1,10 @@
1
+ import crypto from "node:crypto";
1
2
  import fs from "node:fs/promises";
2
3
  import path from "node:path";
3
4
  import { trace } from "@opentelemetry/api";
4
5
  import { updateCurrentOperationPhase } from "../operations/state.js";
5
6
  import { exportEventSpan } from "./otlp.js";
7
+ const operationTraces = new Map();
6
8
  export async function recordEvent(root, config, name, attributes) {
7
9
  const phase = operationPhaseForEvent(name);
8
10
  if (phase)
@@ -10,6 +12,8 @@ export async function recordEvent(root, config, name, attributes) {
10
12
  if (config.telemetry?.enabled === false)
11
13
  return;
12
14
  const at = new Date();
15
+ const operationId = typeof attributes.operationId === "string" ? attributes.operationId : typeof attributes.taskId === "string" ? attributes.taskId : undefined;
16
+ const operationTrace = operationId ? traceFor(operationId, name) : undefined;
13
17
  const tracer = trace.getTracer("agentic-engineering-harness");
14
18
  const span = tracer.startSpan(name);
15
19
  for (const [key, value] of Object.entries(attributes)) {
@@ -20,9 +24,9 @@ export async function recordEvent(root, config, name, attributes) {
20
24
  const relative = config.telemetry?.localEventsFile ?? ".harness/telemetry/events.ndjson";
21
25
  const file = path.resolve(root, relative);
22
26
  await fs.mkdir(path.dirname(file), { recursive: true });
23
- await fs.appendFile(file, `${JSON.stringify({ at: at.toISOString(), name, attributes })}\n`);
27
+ await fs.appendFile(file, `${JSON.stringify({ at: at.toISOString(), name, traceId: operationTrace?.traceId, spanId: operationTrace?.spanId, parentSpanId: operationTrace?.parentSpanId, attributes })}\n`);
24
28
  try {
25
- await exportEventSpan(config, name, attributes, at);
29
+ await exportEventSpan(config, name, attributes, at, operationTrace);
26
30
  }
27
31
  catch (error) {
28
32
  if (config.telemetry?.required)
@@ -30,6 +34,19 @@ export async function recordEvent(root, config, name, attributes) {
30
34
  await fs.appendFile(file, `${JSON.stringify({ at: new Date().toISOString(), name: "harness.telemetry.export.error", attributes: { sourceEvent: name, error: String(error) } })}\n`);
31
35
  }
32
36
  }
37
+ export function resetOperationTrace(operationId) { if (operationId)
38
+ operationTraces.delete(operationId);
39
+ else
40
+ operationTraces.clear(); }
41
+ function traceFor(operationId, name) {
42
+ const existing = operationTraces.get(operationId);
43
+ const root = !existing || /(?:operation|run|audit)\.start$/.test(name);
44
+ const traceId = root ? crypto.randomBytes(16).toString("hex") : existing.traceId;
45
+ const parentSpanId = root ? undefined : existing.lastSpanId;
46
+ const spanId = crypto.randomBytes(8).toString("hex");
47
+ operationTraces.set(operationId, { traceId, lastSpanId: spanId });
48
+ return { traceId, parentSpanId, spanId };
49
+ }
33
50
  function operationPhaseForEvent(name) {
34
51
  if (name === "harness.run.start")
35
52
  return "executing";
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/telemetry/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/telemetry/events.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
1
  import type { HarnessProjectConfig } from "../core/types.js";
2
- export declare function exportEventSpan(config: HarnessProjectConfig, name: string, attributes: Record<string, unknown>, at?: Date): Promise<void>;
2
+ export interface TraceContext {
3
+ traceId: string;
4
+ parentSpanId?: string;
5
+ spanId: string;
6
+ }
7
+ export declare function exportEventSpan(config: HarnessProjectConfig, name: string, attributes: Record<string, unknown>, at?: Date, context?: TraceContext): Promise<void>;
3
8
  export declare function resolveEndpoint(config: HarnessProjectConfig): string | undefined;
@@ -1,5 +1,5 @@
1
1
  import crypto from "node:crypto";
2
- export async function exportEventSpan(config, name, attributes, at = new Date()) {
2
+ export async function exportEventSpan(config, name, attributes, at = new Date(), context) {
3
3
  if (config.telemetry?.exporter !== "otlp-http-json")
4
4
  return;
5
5
  const endpoint = resolveEndpoint(config);
@@ -12,7 +12,7 @@ export async function exportEventSpan(config, name, attributes, at = new Date())
12
12
  scopeSpans: [{
13
13
  scope: { name: "agentic-engineering-harness", version: "0.3.0" },
14
14
  spans: [{
15
- traceId: crypto.randomBytes(16).toString("hex"), spanId: crypto.randomBytes(8).toString("hex"), name, kind: 1,
15
+ traceId: context?.traceId ?? crypto.randomBytes(16).toString("hex"), spanId: context?.spanId ?? crypto.randomBytes(8).toString("hex"), ...(context?.parentSpanId ? { parentSpanId: context.parentSpanId } : {}), name, kind: 1,
16
16
  startTimeUnixNano: nanos, endTimeUnixNano: nanos,
17
17
  attributes: Object.entries(attributes).flatMap(([key, value]) => value === undefined || value === null ? [] : [attribute(key, value)]),
18
18
  status: { code: 1 }
@@ -1 +1 @@
1
- {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../src/telemetry/otlp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../src/telemetry/otlp.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,16 @@ export function toolchainStatePath(config, toolchain) { return config.toolchain?
29
29
  export function generatedMisePath(config, toolchain) { return config.toolchain?.generatedMisePath ?? toolchain.manager.generatedConfig ?? ".config/mise/conf.d/aeh.toml"; }
30
30
  export async function loadToolchainConfig(root, config) {
31
31
  const file = path.resolve(root, toolchainConfigPath(config));
32
- return schema.parse(YAML.parse(await fs.readFile(file, "utf8")));
32
+ const parsed = schema.parse(YAML.parse(await fs.readFile(file, "utf8")));
33
+ return config.context ? addMandatoryContextTools(parsed) : parsed;
34
+ }
35
+ function addMandatoryContextTools(config) {
36
+ const tools = { ...config.tools };
37
+ tools.python ??= { kind: "mise", command: "python", source: "python", version: "3.13", required: true, activateWhen: ["semantic-retrieval:serena", "compression:headroom"] };
38
+ tools.uv ??= { kind: "mise", command: "uv", source: "uv", version: "latest", activateWhen: ["semantic-retrieval:serena", "compression:headroom"] };
39
+ tools.serena ??= { kind: "mise", command: "serena", source: "pipx:serena", version: "1.5.3", required: true, dependsOn: ["uv", "python"], activateWhen: ["semantic-retrieval:serena"] };
40
+ tools.headroom ??= { kind: "mise", command: "headroom", source: "pipx:headroom-ai[all]", version: "0.27.0", required: true, dependsOn: ["uv", "python"], activateWhen: ["compression:headroom"] };
41
+ return { ...config, tools };
33
42
  }
34
43
  export async function loadToolchainLock(root, config, toolchain) {
35
44
  try {