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.
- package/README.md +3 -3
- package/dist/agents/permissions.js +12 -0
- package/dist/agents/permissions.js.map +1 -1
- package/dist/audit/run.js +2 -0
- package/dist/audit/run.js.map +1 -1
- package/dist/cli.js +12 -13
- package/dist/cli.js.map +1 -1
- package/dist/context/budget.d.ts +4 -0
- package/dist/context/budget.js +19 -0
- package/dist/context/budget.js.map +1 -0
- package/dist/context/classifier.d.ts +4 -0
- package/dist/context/classifier.js +14 -0
- package/dist/context/classifier.js.map +1 -0
- package/dist/context/compression/headroom.d.ts +18 -0
- package/dist/context/compression/headroom.js +53 -0
- package/dist/context/compression/headroom.js.map +1 -0
- package/dist/context/compression/index.d.ts +3 -0
- package/dist/context/compression/index.js +4 -0
- package/dist/context/compression/index.js.map +1 -0
- package/dist/context/compression/lifecycle.d.ts +20 -0
- package/dist/context/compression/lifecycle.js +70 -0
- package/dist/context/compression/lifecycle.js.map +1 -0
- package/dist/context/compression/types.d.ts +27 -0
- package/dist/context/compression/types.js +2 -0
- package/dist/context/compression/types.js.map +1 -0
- package/dist/context/envelope.d.ts +4 -0
- package/dist/context/envelope.js +20 -0
- package/dist/context/envelope.js.map +1 -0
- package/dist/context/estimator.d.ts +3 -0
- package/dist/context/estimator.js +10 -0
- package/dist/context/estimator.js.map +1 -0
- package/dist/context/eval.d.ts +19 -0
- package/dist/context/eval.js +12 -0
- package/dist/context/eval.js.map +1 -0
- package/dist/context/gateway.d.ts +22 -0
- package/dist/context/gateway.js +202 -0
- package/dist/context/gateway.js.map +1 -0
- package/dist/context/index.d.ts +15 -0
- package/dist/context/index.js +16 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/policy.d.ts +6 -0
- package/dist/context/policy.js +40 -0
- package/dist/context/policy.js.map +1 -0
- package/dist/context/preflight.d.ts +13 -0
- package/dist/context/preflight.js +25 -0
- package/dist/context/preflight.js.map +1 -0
- package/dist/context/projectors/audit.d.ts +2 -0
- package/dist/context/projectors/audit.js +30 -0
- package/dist/context/projectors/audit.js.map +1 -0
- package/dist/context/projectors/diff.d.ts +2 -0
- package/dist/context/projectors/diff.js +8 -0
- package/dist/context/projectors/diff.js.map +1 -0
- package/dist/context/projectors/explorer.d.ts +2 -0
- package/dist/context/projectors/explorer.js +5 -0
- package/dist/context/projectors/explorer.js.map +1 -0
- package/dist/context/projectors/index.d.ts +8 -0
- package/dist/context/projectors/index.js +9 -0
- package/dist/context/projectors/index.js.map +1 -0
- package/dist/context/projectors/operation.d.ts +3 -0
- package/dist/context/projectors/operation.js +26 -0
- package/dist/context/projectors/operation.js.map +1 -0
- package/dist/context/projectors/planner.d.ts +2 -0
- package/dist/context/projectors/planner.js +5 -0
- package/dist/context/projectors/planner.js.map +1 -0
- package/dist/context/projectors/source.d.ts +2 -0
- package/dist/context/projectors/source.js +5 -0
- package/dist/context/projectors/source.js.map +1 -0
- package/dist/context/projectors/structured.d.ts +2 -0
- package/dist/context/projectors/structured.js +24 -0
- package/dist/context/projectors/structured.js.map +1 -0
- package/dist/context/projectors/validation.d.ts +3 -0
- package/dist/context/projectors/validation.js +25 -0
- package/dist/context/projectors/validation.js.map +1 -0
- package/dist/context/provenance.d.ts +3 -0
- package/dist/context/provenance.js +13 -0
- package/dist/context/provenance.js.map +1 -0
- package/dist/context/repository/graphify.d.ts +3 -0
- package/dist/context/repository/graphify.js +7 -0
- package/dist/context/repository/graphify.js.map +1 -0
- package/dist/context/repository/index.d.ts +6 -0
- package/dist/context/repository/index.js +7 -0
- package/dist/context/repository/index.js.map +1 -0
- package/dist/context/repository/map.d.ts +6 -0
- package/dist/context/repository/map.js +34 -0
- package/dist/context/repository/map.js.map +1 -0
- package/dist/context/repository/rank.d.ts +3 -0
- package/dist/context/repository/rank.js +43 -0
- package/dist/context/repository/rank.js.map +1 -0
- package/dist/context/repository/render.d.ts +8 -0
- package/dist/context/repository/render.js +21 -0
- package/dist/context/repository/render.js.map +1 -0
- package/dist/context/repository/serena.d.ts +11 -0
- package/dist/context/repository/serena.js +26 -0
- package/dist/context/repository/serena.js.map +1 -0
- package/dist/context/repository/types.d.ts +34 -0
- package/dist/context/repository/types.js +2 -0
- package/dist/context/repository/types.js.map +1 -0
- package/dist/context/retrieval/authorization.d.ts +11 -0
- package/dist/context/retrieval/authorization.js +9 -0
- package/dist/context/retrieval/authorization.js.map +1 -0
- package/dist/context/retrieval/gateway.d.ts +33 -0
- package/dist/context/retrieval/gateway.js +69 -0
- package/dist/context/retrieval/gateway.js.map +1 -0
- package/dist/context/retrieval/index.d.ts +5 -0
- package/dist/context/retrieval/index.js +6 -0
- package/dist/context/retrieval/index.js.map +1 -0
- package/dist/context/retrieval/mcp.d.ts +3 -0
- package/dist/context/retrieval/mcp.js +8 -0
- package/dist/context/retrieval/mcp.js.map +1 -0
- package/dist/context/retrieval/persisted.d.ts +3 -0
- package/dist/context/retrieval/persisted.js +22 -0
- package/dist/context/retrieval/persisted.js.map +1 -0
- package/dist/context/retrieval/server.d.ts +1 -0
- package/dist/context/retrieval/server.js +52 -0
- package/dist/context/retrieval/server.js.map +1 -0
- package/dist/context/telemetry.d.ts +3 -0
- package/dist/context/telemetry.js +9 -0
- package/dist/context/telemetry.js.map +1 -0
- package/dist/context/types.d.ts +243 -0
- package/dist/context/types.js +29 -0
- package/dist/context/types.js.map +1 -0
- package/dist/core/config.js +19 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/doctor.js +23 -2
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/run.js +35 -14
- package/dist/core/run.js.map +1 -1
- package/dist/core/types.d.ts +52 -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/entry.js +30 -0
- package/dist/entry.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/main.js +1 -0
- package/dist/main.js.map +1 -1
- package/dist/operations/change.js +2 -0
- package/dist/operations/change.js.map +1 -1
- package/dist/paseo/launchSpec.d.ts +3 -0
- package/dist/paseo/launchSpec.js +17 -0
- package/dist/paseo/launchSpec.js.map +1 -1
- 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/headroom.d.ts +2 -0
- package/dist/providers/headroom.js +3 -0
- package/dist/providers/headroom.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/serena.d.ts +1 -0
- package/dist/providers/serena.js +2 -0
- package/dist/providers/serena.js.map +1 -0
- package/dist/providers/types.d.ts +25 -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/toolchain/config.js +10 -1
- package/dist/toolchain/config.js.map +1 -1
- package/dist/toolchain/resolve.js +8 -0
- package/dist/toolchain/resolve.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 +133 -4
- package/dist/workers/agentPrompt.js.map +1 -1
- package/docs/ARCHITECTURE.md +20 -1
- package/docs/COMPONENT_MATURITY.md +43 -0
- package/docs/CONTEXT_EFFICIENCY.md +48 -0
- package/docs/MEMORY.md +9 -0
- package/docs/OBSERVABILITY.md +6 -1
- package/docs/OSS_STACK.md +10 -2
- package/docs/SECURITY.md +12 -0
- package/package.json +2 -2
- package/policies/core/trust-boundary.rego +14 -4
- package/presets/agents/default.jsonc +4 -4
- package/presets/agents/orchestration.jsonc +2 -2
- package/schemas/project.schema.json +14 -0
- package/templates/project.yaml +42 -0
- package/templates/toolchain.yaml +34 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explorer.js","sourceRoot":"","sources":["../../../src/context/projectors/explorer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,eAAe,CAAC,QAAyB;IACvD,OAAO,uBAAuB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./audit.js";
|
|
2
|
+
export * from "./diff.js";
|
|
3
|
+
export * from "./explorer.js";
|
|
4
|
+
export * from "./operation.js";
|
|
5
|
+
export * from "./planner.js";
|
|
6
|
+
export * from "./source.js";
|
|
7
|
+
export * from "./structured.js";
|
|
8
|
+
export * from "./validation.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/projectors/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ContextFragment, ContextFragmentProjection } from "../types.js";
|
|
2
|
+
export type OperationProjectionPhase = "INITIALIZE" | "COORDINATE" | "CONSOLIDATE" | "RECOVER" | "HANDOFF";
|
|
3
|
+
export declare function projectOperation(fragment: ContextFragment, phase?: OperationProjectionPhase): ContextFragmentProjection;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { estimateTokens } from "../estimator.js";
|
|
2
|
+
export function projectOperation(fragment, phase = "COORDINATE") {
|
|
3
|
+
const value = parseJson(fragment.content);
|
|
4
|
+
const lines = [`phase=${phase}`];
|
|
5
|
+
for (const key of ["id", "status", "revision", "currentPhase", "error"])
|
|
6
|
+
if (value?.[key] !== undefined)
|
|
7
|
+
lines.push(`${key}=${format(value[key])}`);
|
|
8
|
+
for (const key of ["participants", "findings", "progress", "result"])
|
|
9
|
+
if (value?.[key] !== undefined)
|
|
10
|
+
lines.push(`${key}=${summarize(value[key])}`);
|
|
11
|
+
lines.push("authoritative OperationRecord remains in its durable artifact");
|
|
12
|
+
const content = lines.join("\n");
|
|
13
|
+
return { ...fragment, content, estimatedTokens: estimateTokens(content), originalTokens: estimateTokens(fragment.content), projected: true };
|
|
14
|
+
}
|
|
15
|
+
function parseJson(content) { try {
|
|
16
|
+
const value = JSON.parse(content);
|
|
17
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
} }
|
|
22
|
+
function format(value) { return typeof value === "string" || typeof value === "number" || typeof value === "boolean" ? String(value) : summarize(value); }
|
|
23
|
+
function summarize(value) { if (Array.isArray(value))
|
|
24
|
+
return `count=${value.length}`; if (value && typeof value === "object")
|
|
25
|
+
return `keys=${Object.keys(value).sort().join(",")}`; return String(value ?? ""); }
|
|
26
|
+
//# sourceMappingURL=operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation.js","sourceRoot":"","sources":["../../../src/context/projectors/operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,MAAM,UAAU,gBAAgB,CAAC,QAAyB,EAAE,QAAkC,YAAY;IACxG,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC;QAAE,IAAI,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACpJ,KAAK,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC;QAAE,IAAI,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACpJ,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/I,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,IAAyC,IAAI,CAAC;IAAC,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,SAAS,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,SAAS,CAAC;AAAC,CAAC,CAAC,CAAC;AAC/Q,SAAS,MAAM,CAAC,KAAc,IAAY,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3K,SAAS,SAAS,CAAC,KAAc,IAAY,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;IAAE,OAAO,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/context/projectors/planner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,UAAU,cAAc,CAAC,QAAyB;IACtD,OAAO,uBAAuB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { estimateTokens } from "../estimator.js";
|
|
2
|
+
export function projectSource(fragment) {
|
|
3
|
+
return { ...fragment, content: fragment.content, estimatedTokens: estimateTokens(fragment.content), originalTokens: estimateTokens(fragment.content), projected: false };
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/context/projectors/source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,UAAU,aAAa,CAAC,QAAyB;IACrD,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC3K,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { estimateTokens } from "../estimator.js";
|
|
2
|
+
export function projectStructuredResult(fragment, role) {
|
|
3
|
+
let content = fragment.content;
|
|
4
|
+
try {
|
|
5
|
+
const value = JSON.parse(fragment.content);
|
|
6
|
+
if (value && typeof value === "object") {
|
|
7
|
+
const record = value;
|
|
8
|
+
const keys = Object.keys(record).sort();
|
|
9
|
+
content = [`role=${role}`, ...keys.map((key) => `${key}=${summarize(record[key])}`), "authoritative structured result remains in its durable artifact"].join("\n");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
content = `${fragment.content}\nauthoritative structured result remains in its durable artifact`;
|
|
14
|
+
}
|
|
15
|
+
return { ...fragment, content, estimatedTokens: estimateTokens(content), originalTokens: estimateTokens(fragment.content), projected: true };
|
|
16
|
+
}
|
|
17
|
+
function summarize(value) {
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
return `count=${value.length}`;
|
|
20
|
+
if (value && typeof value === "object")
|
|
21
|
+
return `keys=${Object.keys(value).sort().join(",")}`;
|
|
22
|
+
return String(value ?? "");
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=structured.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured.js","sourceRoot":"","sources":["../../../src/context/projectors/structured.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,UAAU,uBAAuB,CAAC,QAAyB,EAAE,IAAY;IAC7E,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,KAAgC,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,iEAAiE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrK,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,GAAG,GAAG,QAAQ,CAAC,OAAO,mEAAmE,CAAC;IAAC,CAAC;IAC7G,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC/I,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC;IACzD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACxH,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { estimateTokens } from "../estimator.js";
|
|
2
|
+
export function projectValidation(fragment, report) {
|
|
3
|
+
const raw = report ?? parseReport(fragment.content);
|
|
4
|
+
const checks = raw?.checks ?? [];
|
|
5
|
+
const failing = checks.filter((check) => check.status === "FAIL" || check.status === "WARN");
|
|
6
|
+
const lines = [
|
|
7
|
+
`status=${raw?.status ?? "UNKNOWN"}`,
|
|
8
|
+
`taskId=${raw?.taskId ?? "unknown"}`,
|
|
9
|
+
`checks=${checks.length} failingOrWarning=${failing.length}`,
|
|
10
|
+
...failing.map((check) => `${check.status} ${check.id}: ${check.message}${check.details ? ` details=${JSON.stringify(check.details)}` : ""}`),
|
|
11
|
+
raw?.changedFiles?.length ? `changedFiles=${raw.changedFiles.join(",")}` : undefined,
|
|
12
|
+
"authoritative raw validation artifact is available through the fragment source"
|
|
13
|
+
].filter((line) => Boolean(line));
|
|
14
|
+
return { ...fragment, content: lines.join("\n"), estimatedTokens: estimateTokens(lines.join("\n")), originalTokens: estimateTokens(fragment.content), projected: true };
|
|
15
|
+
}
|
|
16
|
+
function parseReport(content) {
|
|
17
|
+
try {
|
|
18
|
+
const value = JSON.parse(content);
|
|
19
|
+
return Array.isArray(value.checks) ? value : undefined;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/context/projectors/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE,MAAyB;IACpF,MAAM,GAAG,GAAG,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG;QACZ,UAAU,GAAG,EAAE,MAAM,IAAI,SAAS,EAAE;QACpC,UAAU,GAAG,EAAE,MAAM,IAAI,SAAS,EAAE;QACpC,UAAU,MAAM,CAAC,MAAM,qBAAqB,OAAO,CAAC,MAAM,EAAE;QAC5D,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7I,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QACpF,gFAAgF;KACjF,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1K,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAqB,CAAC;QACtD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const CONTEXT_PROJECTION_VERSION = "aeh-context-v1";
|
|
3
|
+
export function sha256(value) {
|
|
4
|
+
return createHash("sha256").update(value).digest("hex");
|
|
5
|
+
}
|
|
6
|
+
export function stableJson(value) {
|
|
7
|
+
return JSON.stringify(value, (_key, nested) => {
|
|
8
|
+
if (!nested || typeof nested !== "object" || Array.isArray(nested))
|
|
9
|
+
return nested;
|
|
10
|
+
return Object.fromEntries(Object.entries(nested).sort(([a], [b]) => a.localeCompare(b)));
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/context/provenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AAE3D,MAAM,UAAU,MAAM,CAAC,KAAsB;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAClF,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { canonicalGraphToRepositoryMap, loadCanonicalGraph } from "../../providers/graphifyModel.js";
|
|
2
|
+
export async function loadGraphifyContextMap(root, graphPath = "graphify-out/graph.json") {
|
|
3
|
+
const graph = await loadCanonicalGraph(root, graphPath);
|
|
4
|
+
return graph ? canonicalGraphToRepositoryMap(graph) : undefined;
|
|
5
|
+
}
|
|
6
|
+
export { normalizeGraphDocument } from "../../providers/graphifyModel.js";
|
|
7
|
+
//# sourceMappingURL=graphify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../../src/context/repository/graphify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAA0B,MAAM,kCAAkC,CAAC;AAE7H,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,SAAS,GAAG,yBAAyB;IAC9F,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,CAAC,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/repository/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { HarnessProjectConfig } from "../../core/types.js";
|
|
2
|
+
import type { RepositoryContextMap, RepositoryRankRequest } from "./types.js";
|
|
3
|
+
import { type RepositoryMapRender } from "./render.js";
|
|
4
|
+
export declare function buildRepositoryContextMap(root: string, config: HarnessProjectConfig, request?: RepositoryRankRequest): Promise<RepositoryMapRender & {
|
|
5
|
+
map: RepositoryContextMap;
|
|
6
|
+
}>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { loadGraphifyContextMap } from "./graphify.js";
|
|
2
|
+
import { rankRepositoryNodes } from "./rank.js";
|
|
3
|
+
import { renderRepositoryMap } from "./render.js";
|
|
4
|
+
export async function buildRepositoryContextMap(root, config, request = {}) {
|
|
5
|
+
const graph = await loadGraphifyContextMap(root, config.codeIntelligence?.graphPath ?? "graphify-out/graph.json") ?? await filesystemContextMap(root);
|
|
6
|
+
const ranked = rankRepositoryNodes(graph, request);
|
|
7
|
+
const rendered = renderRepositoryMap(ranked, config.context?.repositoryMap?.tokenBudget ?? 2_000);
|
|
8
|
+
return { ...rendered, map: graph };
|
|
9
|
+
}
|
|
10
|
+
async function filesystemContextMap(root) {
|
|
11
|
+
const ignored = new Set([".git", "node_modules", "dist", ".harness", ".config"]);
|
|
12
|
+
const files = [];
|
|
13
|
+
async function visit(directory) {
|
|
14
|
+
if (files.length >= 5_000)
|
|
15
|
+
return;
|
|
16
|
+
for (const entry of await fs.readdir(directory, { withFileTypes: true }).catch(() => [])) {
|
|
17
|
+
if (ignored.has(entry.name))
|
|
18
|
+
continue;
|
|
19
|
+
const absolute = path.join(directory, entry.name);
|
|
20
|
+
if (entry.isDirectory())
|
|
21
|
+
await visit(absolute);
|
|
22
|
+
else if (entry.isFile())
|
|
23
|
+
files.push(path.relative(root, absolute).replaceAll(path.sep, "/"));
|
|
24
|
+
if (files.length >= 5_000)
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
await visit(root);
|
|
29
|
+
files.sort();
|
|
30
|
+
return { provider: "filesystem", nodes: files.map((file) => ({ id: `file:${file}`, file })), edges: [] };
|
|
31
|
+
}
|
|
32
|
+
import fs from "node:fs/promises";
|
|
33
|
+
import path from "node:path";
|
|
34
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../../src/context/repository/map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAA4B,MAAM,aAAa,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAY,EAAE,MAA4B,EAAE,UAAiC,EAAE;IAC7H,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,gBAAgB,EAAE,SAAS,IAAI,yBAAyB,CAAC,IAAI,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACtJ,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,IAAI,KAAK,CAAC,CAAC;IAClG,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IAAC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC7G,KAAK,UAAU,KAAK,CAAC,SAAiB;QACpC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;YAAE,OAAO;QAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAgC,CAAC,EAAE,CAAC;YACvH,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;iBAC1C,IAAI,KAAK,CAAC,MAAM,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7F,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;gBAAE,OAAO;QACpC,CAAC;IACH,CAAC;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC3G,CAAC;AACD,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { RankedRepositoryNode, RepositoryContextMap, RepositoryNode, RepositoryRankRequest } from "./types.js";
|
|
2
|
+
export declare function rankRepositoryNodes(map: RepositoryContextMap, request: RepositoryRankRequest): RankedRepositoryNode[];
|
|
3
|
+
export declare function repositoryNodeKey(node: RepositoryNode): string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function rankRepositoryNodes(map, request) {
|
|
2
|
+
const explicit = new Set(request.explicitPaths ?? []);
|
|
3
|
+
const allowed = new Set(request.allowedPaths ?? []);
|
|
4
|
+
const changed = new Set(request.changedFiles ?? []);
|
|
5
|
+
const findings = new Set(request.findingLocations ?? []);
|
|
6
|
+
const references = new Set(request.referenceIds ?? []);
|
|
7
|
+
const ranked = map.nodes.map((node) => {
|
|
8
|
+
const reasons = [];
|
|
9
|
+
let score = 0;
|
|
10
|
+
if (explicit.has(node.file)) {
|
|
11
|
+
score += 100;
|
|
12
|
+
reasons.push("explicit-scope");
|
|
13
|
+
}
|
|
14
|
+
if (allowed.has(node.file)) {
|
|
15
|
+
score += 60;
|
|
16
|
+
reasons.push("task-scope");
|
|
17
|
+
}
|
|
18
|
+
if (changed.has(node.file) || node.changed) {
|
|
19
|
+
score += 40;
|
|
20
|
+
reasons.push("changed-file");
|
|
21
|
+
}
|
|
22
|
+
if (findings.has(node.file)) {
|
|
23
|
+
score += 35;
|
|
24
|
+
reasons.push("finding-location");
|
|
25
|
+
}
|
|
26
|
+
if (request.symbol && (node.symbol === request.symbol || node.file.includes(request.symbol))) {
|
|
27
|
+
score += 50;
|
|
28
|
+
reasons.push("exact-symbol");
|
|
29
|
+
}
|
|
30
|
+
if (references.has(node.id)) {
|
|
31
|
+
score += 30;
|
|
32
|
+
reasons.push("reference");
|
|
33
|
+
}
|
|
34
|
+
if (node.centrality !== undefined) {
|
|
35
|
+
score += Math.round(Math.max(0, Math.min(1, node.centrality)) * 20);
|
|
36
|
+
reasons.push("centrality");
|
|
37
|
+
}
|
|
38
|
+
return { ...node, score, reasons };
|
|
39
|
+
});
|
|
40
|
+
return ranked.sort((a, b) => b.score - a.score || a.file.localeCompare(b.file) || (a.symbol ?? "").localeCompare(b.symbol ?? "") || a.id.localeCompare(b.id));
|
|
41
|
+
}
|
|
42
|
+
export function repositoryNodeKey(node) { return `${node.file}${node.symbol ? `#${node.symbol}` : ""}`; }
|
|
43
|
+
//# sourceMappingURL=rank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rank.js","sourceRoot":"","sources":["../../../src/context/repository/rank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RankedRepositoryNode } from "./types.js";
|
|
2
|
+
export interface RepositoryMapRender {
|
|
3
|
+
content: string;
|
|
4
|
+
selected: string[];
|
|
5
|
+
omitted: string[];
|
|
6
|
+
estimatedTokens: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function renderRepositoryMap(nodes: RankedRepositoryNode[], tokenBudget: number): RepositoryMapRender;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { estimateTokens } from "../estimator.js";
|
|
2
|
+
export function renderRepositoryMap(nodes, tokenBudget) {
|
|
3
|
+
if (!Number.isInteger(tokenBudget) || tokenBudget <= 0)
|
|
4
|
+
throw new Error("Repository map token budget must be positive.");
|
|
5
|
+
const selected = [];
|
|
6
|
+
const omitted = [];
|
|
7
|
+
let tokens = 0;
|
|
8
|
+
for (const node of nodes) {
|
|
9
|
+
const line = `${node.file}${node.symbol ? ` :: ${node.symbol}` : ""}${node.signature ? ` ${node.signature}` : ""} [score=${node.score}${node.reasons.length ? ` ${node.reasons.join(",")}` : ""}]`;
|
|
10
|
+
const next = estimateTokens(`${line}\n`);
|
|
11
|
+
if (tokens + next <= tokenBudget) {
|
|
12
|
+
selected.push(node);
|
|
13
|
+
tokens += next;
|
|
14
|
+
}
|
|
15
|
+
else
|
|
16
|
+
omitted.push(node);
|
|
17
|
+
}
|
|
18
|
+
const content = [...selected.map((node) => `${node.file}${node.symbol ? ` :: ${node.symbol}` : ""}${node.signature ? ` ${node.signature}` : ""} [score=${node.score}${node.reasons.length ? ` ${node.reasons.join(",")}` : ""}]`), omitted.length ? `[${omitted.length} lower-ranked repository nodes omitted; retrieve by authorized map fragment]` : undefined].filter((line) => Boolean(line)).join("\n");
|
|
19
|
+
return { content, selected: selected.map((node) => node.id), omitted: omitted.map((node) => node.id), estimatedTokens: estimateTokens(content) };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/context/repository/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAKjD,MAAM,UAAU,mBAAmB,CAAC,KAA6B,EAAE,WAAmB;IACpF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACzH,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAAC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IACxG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QACnM,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC;YAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM,IAAI,IAAI,CAAC;QAAC,CAAC;;YAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,8EAA8E,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7Z,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;AACnJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { McpServerConfig } from "../../core/types.js";
|
|
2
|
+
import type { ProviderHealth } from "../compression/types.js";
|
|
3
|
+
export declare const SERENA_VERSION = "1.6.1";
|
|
4
|
+
export declare class SerenaSemanticProvider {
|
|
5
|
+
private readonly command;
|
|
6
|
+
readonly name = "serena";
|
|
7
|
+
constructor(command?: string);
|
|
8
|
+
doctor(root: string): Promise<ProviderHealth>;
|
|
9
|
+
mcpServer(root: string): McpServerConfig;
|
|
10
|
+
}
|
|
11
|
+
export declare function semanticFirstInstruction(): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { commandExists, runProcess } from "../../utils/process.js";
|
|
2
|
+
export const SERENA_VERSION = "1.6.1";
|
|
3
|
+
export class SerenaSemanticProvider {
|
|
4
|
+
command;
|
|
5
|
+
name = "serena";
|
|
6
|
+
constructor(command = "serena") {
|
|
7
|
+
this.command = command;
|
|
8
|
+
}
|
|
9
|
+
async doctor(root) {
|
|
10
|
+
if (!(await commandExists(this.command, root)))
|
|
11
|
+
return { ok: false, message: `Serena executable '${this.command}' was not found in the reconciled toolchain PATH.` };
|
|
12
|
+
const result = await runProcess(`${quote(this.command)} --version`, { cwd: root, timeoutMs: 15_000 });
|
|
13
|
+
if (result.exitCode !== 0)
|
|
14
|
+
return { ok: false, message: `Serena health check failed: ${result.stderr || result.stdout}` };
|
|
15
|
+
const version = (result.stdout || result.stderr).trim().split(/\r?\n/)[0];
|
|
16
|
+
return { ok: version.includes(SERENA_VERSION), version, message: version.includes(SERENA_VERSION) ? `Serena semantic retrieval ready (${version}).` : `Serena version drift: expected ${SERENA_VERSION}, got ${version}.` };
|
|
17
|
+
}
|
|
18
|
+
mcpServer(root) {
|
|
19
|
+
return { description: "AEH-managed local Serena semantic repository retrieval; editing is disabled by default.", type: "local", command: [this.command, "start-mcp-server", "--context", "ide-assistant", "--project", root], enabled: true, timeoutMs: 30_000 };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function semanticFirstInstruction() {
|
|
23
|
+
return ["Semantic repository policy:", "1. Locate relevant symbols before reading complete files.", "2. Inspect symbol bodies only when required.", "3. Find referencing symbols before broad repository search.", "4. Read complete files only when file-level context is semantically required.", "5. Do not use Serena memory as AEH historical memory; Engram remains memory authority.", "6. Serena editing is disabled unless the assigned role and frozen scope explicitly permit it."].join("\n");
|
|
24
|
+
}
|
|
25
|
+
function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
|
|
26
|
+
//# sourceMappingURL=serena.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serena.js","sourceRoot":"","sources":["../../../src/context/repository/serena.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGnE,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,OAAO,sBAAsB;IAEJ;IADpB,IAAI,GAAG,QAAQ,CAAC;IACzB,YAA6B,UAAU,QAAQ;QAAlB,YAAO,GAAP,OAAO,CAAW;IAAG,CAAC;IAEnD,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sBAAsB,IAAI,CAAC,OAAO,mDAAmD,EAAE,CAAC;QACrK,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACtG,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,+BAA+B,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1H,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,oCAAoC,OAAO,IAAI,CAAC,CAAC,CAAC,kCAAkC,cAAc,SAAS,OAAO,GAAG,EAAE,CAAC;IAC9N,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,EAAE,WAAW,EAAE,yFAAyF,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACnQ,CAAC;CACF;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,CAAC,6BAA6B,EAAE,2DAA2D,EAAE,8CAA8C,EAAE,6DAA6D,EAAE,+EAA+E,EAAE,wFAAwF,EAAE,+FAA+F,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5e,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,IAAY,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface RepositoryNode {
|
|
2
|
+
id: string;
|
|
3
|
+
file: string;
|
|
4
|
+
symbol?: string;
|
|
5
|
+
signature?: string;
|
|
6
|
+
centrality?: number;
|
|
7
|
+
changed?: boolean;
|
|
8
|
+
community?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RepositoryEdge {
|
|
11
|
+
from: string;
|
|
12
|
+
to: string;
|
|
13
|
+
kind?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface RepositoryContextMap {
|
|
16
|
+
nodes: RepositoryNode[];
|
|
17
|
+
edges: RepositoryEdge[];
|
|
18
|
+
provider: "graphify" | "filesystem" | string;
|
|
19
|
+
generatedAt?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface RepositoryRankRequest {
|
|
22
|
+
explicitPaths?: string[];
|
|
23
|
+
allowedPaths?: string[];
|
|
24
|
+
changedFiles?: string[];
|
|
25
|
+
findingLocations?: string[];
|
|
26
|
+
symbol?: string;
|
|
27
|
+
referenceIds?: string[];
|
|
28
|
+
maxGraphHops?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface RankedRepositoryNode extends RepositoryNode {
|
|
31
|
+
score: number;
|
|
32
|
+
reasons: string[];
|
|
33
|
+
distance?: number;
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/context/repository/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ContextFragment } from "../types.js";
|
|
2
|
+
export interface RetrievalAuthorization {
|
|
3
|
+
root: string;
|
|
4
|
+
operationId: string;
|
|
5
|
+
logicalAgent: string;
|
|
6
|
+
allowedFragmentIds: string[];
|
|
7
|
+
fragments: Map<string, ContextFragment>;
|
|
8
|
+
}
|
|
9
|
+
export declare function authorizeRetrieval(input: Omit<RetrievalAuthorization, "fragments"> & {
|
|
10
|
+
fragments: ContextFragment[];
|
|
11
|
+
}): RetrievalAuthorization;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function authorizeRetrieval(input) {
|
|
2
|
+
const fragments = new Map(input.fragments.map((fragment) => [fragment.id, fragment]));
|
|
3
|
+
const allowed = new Set(input.allowedFragmentIds);
|
|
4
|
+
for (const id of allowed)
|
|
5
|
+
if (!fragments.has(id))
|
|
6
|
+
throw new Error(`Cannot authorize unknown context fragment '${id}'.`);
|
|
7
|
+
return { ...input, allowedFragmentIds: [...allowed].sort(), fragments };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../../src/context/retrieval/authorization.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,kBAAkB,CAAC,KAAmF;IACpH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAClD,KAAK,MAAM,EAAE,IAAI,OAAO;QAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,EAAE,IAAI,CAAC,CAAC;IACxH,OAAO,EAAE,GAAG,KAAK,EAAE,kBAAkB,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RetrievalAuthorization } from "./authorization.js";
|
|
2
|
+
export interface RetrievalRequest {
|
|
3
|
+
fragmentId: string;
|
|
4
|
+
section?: "raw" | "source";
|
|
5
|
+
maxTokens?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface RetrievalResult {
|
|
8
|
+
fragmentId: string;
|
|
9
|
+
content: string;
|
|
10
|
+
artifact: string;
|
|
11
|
+
sha256: string;
|
|
12
|
+
estimatedTokens: number;
|
|
13
|
+
repeated: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface RetrievalLimits {
|
|
16
|
+
maxRequestsPerTurn: number;
|
|
17
|
+
maxTokensPerRequest: number;
|
|
18
|
+
maxTotalTokensPerTurn: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class ContextRetrievalGateway {
|
|
21
|
+
private readonly authorization;
|
|
22
|
+
private readonly limits;
|
|
23
|
+
private requests;
|
|
24
|
+
private totalTokens;
|
|
25
|
+
private readonly seen;
|
|
26
|
+
constructor(authorization: RetrievalAuthorization, limits: RetrievalLimits);
|
|
27
|
+
get metrics(): {
|
|
28
|
+
requests: number;
|
|
29
|
+
repeated: number;
|
|
30
|
+
totalTokens: number;
|
|
31
|
+
};
|
|
32
|
+
retrieve(request: RetrievalRequest): Promise<RetrievalResult>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { estimateTokens } from "../estimator.js";
|
|
4
|
+
import { sha256 } from "../provenance.js";
|
|
5
|
+
export class ContextRetrievalGateway {
|
|
6
|
+
authorization;
|
|
7
|
+
limits;
|
|
8
|
+
requests = 0;
|
|
9
|
+
totalTokens = 0;
|
|
10
|
+
seen = new Set();
|
|
11
|
+
constructor(authorization, limits) {
|
|
12
|
+
this.authorization = authorization;
|
|
13
|
+
this.limits = limits;
|
|
14
|
+
}
|
|
15
|
+
get metrics() { return { requests: this.requests, repeated: [...this.seen].length < this.requests ? this.requests - [...this.seen].length : 0, totalTokens: this.totalTokens }; }
|
|
16
|
+
async retrieve(request) {
|
|
17
|
+
if (!this.authorization.allowedFragmentIds.includes(request.fragmentId))
|
|
18
|
+
throw new Error(`CONTEXT_RETRIEVAL_UNAUTHORIZED: fragment '${request.fragmentId}' is not authorized for operation '${this.authorization.operationId}'.`);
|
|
19
|
+
if (this.requests >= this.limits.maxRequestsPerTurn)
|
|
20
|
+
throw new Error("CONTEXT_RETRIEVAL_BUDGET_EXCEEDED: maximum requests per turn reached.");
|
|
21
|
+
const fragment = this.authorization.fragments.get(request.fragmentId);
|
|
22
|
+
if (!fragment)
|
|
23
|
+
throw new Error(`CONTEXT_RETRIEVAL_NOT_FOUND: fragment '${request.fragmentId}'.`);
|
|
24
|
+
const artifact = fragment.source?.artifact;
|
|
25
|
+
if (!artifact)
|
|
26
|
+
throw new Error(`CONTEXT_RETRIEVAL_NO_ARTIFACT: fragment '${request.fragmentId}' has no durable raw artifact.`);
|
|
27
|
+
const absolute = safeArtifactPath(this.authorization.root, artifact);
|
|
28
|
+
const raw = await fs.readFile(absolute, "utf8");
|
|
29
|
+
const expected = fragment.source?.sha256;
|
|
30
|
+
const actual = sha256(raw);
|
|
31
|
+
if (expected && expected !== actual)
|
|
32
|
+
throw new Error(`CONTEXT_RETRIEVAL_HASH_MISMATCH: ${artifact}.`);
|
|
33
|
+
const maxTokens = Math.min(request.maxTokens ?? this.limits.maxTokensPerRequest, this.limits.maxTokensPerRequest);
|
|
34
|
+
const tokens = estimateTokens(raw);
|
|
35
|
+
if (this.totalTokens + Math.min(tokens, maxTokens) > this.limits.maxTotalTokensPerTurn)
|
|
36
|
+
throw new Error("CONTEXT_RETRIEVAL_BUDGET_EXCEEDED: maximum tokens per turn reached.");
|
|
37
|
+
if (request.section && request.section !== "raw")
|
|
38
|
+
throw new Error(`Unsupported context retrieval section '${request.section}'.`);
|
|
39
|
+
this.requests += 1;
|
|
40
|
+
const repeated = this.seen.has(request.fragmentId);
|
|
41
|
+
this.seen.add(request.fragmentId);
|
|
42
|
+
const content = tokens <= maxTokens ? raw : boundedLines(raw, maxTokens);
|
|
43
|
+
this.totalTokens += estimateTokens(content);
|
|
44
|
+
return { fragmentId: request.fragmentId, content, artifact, sha256: actual, estimatedTokens: estimateTokens(content), repeated };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function safeArtifactPath(root, artifact) {
|
|
48
|
+
if (path.isAbsolute(artifact))
|
|
49
|
+
throw new Error("CONTEXT_RETRIEVAL_PATH_REJECTED: artifact paths must be relative to the operation root.");
|
|
50
|
+
const absoluteRoot = path.resolve(root);
|
|
51
|
+
const absolute = path.resolve(absoluteRoot, artifact);
|
|
52
|
+
if (absolute !== absoluteRoot && !absolute.startsWith(`${absoluteRoot}${path.sep}`))
|
|
53
|
+
throw new Error("CONTEXT_RETRIEVAL_PATH_REJECTED: artifact escapes the operation root.");
|
|
54
|
+
return absolute;
|
|
55
|
+
}
|
|
56
|
+
function boundedLines(value, maxTokens) {
|
|
57
|
+
const lines = value.split(/\r?\n/);
|
|
58
|
+
const selected = [];
|
|
59
|
+
let used = 0;
|
|
60
|
+
for (const line of lines) {
|
|
61
|
+
const next = estimateTokens(`${line}\n`);
|
|
62
|
+
if (used + next > maxTokens)
|
|
63
|
+
break;
|
|
64
|
+
selected.push(line);
|
|
65
|
+
used += next;
|
|
66
|
+
}
|
|
67
|
+
return `${selected.join("\n")}\n[bounded retrieval excerpt; retrieve again with a larger authorized budget for the complete raw artifact]`;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=gateway.js.map
|