agentic-engineering-harness 0.6.21 → 0.6.23
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/outputContracts.d.ts +11 -0
- package/dist/agents/outputContracts.js +4 -1
- package/dist/agents/outputContracts.js.map +1 -1
- package/dist/operations/executionContext.js +1 -1
- package/dist/operations/executionContext.js.map +1 -1
- package/dist/operations/liveness.d.ts +5 -0
- package/dist/operations/liveness.js +27 -0
- package/dist/operations/liveness.js.map +1 -1
- package/dist/operations/supervisor.js +37 -106
- package/dist/operations/supervisor.js.map +1 -1
- package/dist/operations/supervisorEventPolicy.d.ts +3 -0
- package/dist/operations/supervisorEventPolicy.js +11 -0
- package/dist/operations/supervisorEventPolicy.js.map +1 -0
- package/dist/operations/supervisorPrompt.d.ts +6 -0
- package/dist/operations/supervisorPrompt.js +103 -0
- package/dist/operations/supervisorPrompt.js.map +1 -0
- package/dist/paseo/launchSpec.js +2 -0
- package/dist/paseo/launchSpec.js.map +1 -1
- package/dist/paseo/sdk.d.ts +3 -2
- package/dist/paseo/sdk.js +50 -6
- package/dist/paseo/sdk.js.map +1 -1
- package/dist/workers/agentPrompt.js +58 -33
- package/dist/workers/agentPrompt.js.map +1 -1
- package/dist/workers/promptPolicy.js +11 -3
- package/dist/workers/promptPolicy.js.map +1 -1
- package/dist/workers/resultCommit.d.ts +2 -0
- package/dist/workers/resultCommit.js +49 -0
- package/dist/workers/resultCommit.js.map +1 -0
- package/dist/workers/resultGateway.d.ts +91 -0
- package/dist/workers/resultGateway.js +278 -0
- package/dist/workers/resultGateway.js.map +1 -0
- package/dist/workers/resultSinkMcp.d.ts +9 -0
- package/dist/workers/resultSinkMcp.js +86 -0
- package/dist/workers/resultSinkMcp.js.map +1 -0
- package/package.json +1 -1
- package/presets/agents/orchestration.jsonc +2 -2
- package/skills/audit-consolidation-protocol/SKILL.md +16 -0
- package/skills/structured-output-delivery/SKILL.md +10 -9
|
@@ -8,6 +8,8 @@ export function compileAgentPromptPolicy(selection, contract, options) {
|
|
|
8
8
|
if (!hasTraceableAcceptance(contract))
|
|
9
9
|
skills.delete("acceptance-traceability");
|
|
10
10
|
}
|
|
11
|
+
if (contractRepair && selection.logicalAgent === "operation-supervisor")
|
|
12
|
+
skills.clear();
|
|
11
13
|
if (contractRepair)
|
|
12
14
|
skills.add("structured-output-delivery");
|
|
13
15
|
return {
|
|
@@ -27,19 +29,25 @@ export function nativeSchemaEnforced(selection, transport) {
|
|
|
27
29
|
}
|
|
28
30
|
export function outputContractContext(contractName, nativeSchema, repair = false) {
|
|
29
31
|
if (repair) {
|
|
30
|
-
return
|
|
32
|
+
return [
|
|
33
|
+
`AEH output contract: ${contractName}. This is a serialization-repair turn.`,
|
|
34
|
+
"If the capability-scoped aeh_submit_result tool is available, submit the already-established contract payload through it; a successful durable submission is authoritative.",
|
|
35
|
+
"Do not redo semantic work. If the result tool is unavailable, structured-output-delivery governs the compatibility marker fallback."
|
|
36
|
+
].join("\n");
|
|
31
37
|
}
|
|
32
38
|
if (nativeSchema) {
|
|
33
39
|
return [
|
|
34
40
|
`AEH output contract: ${contractName}.`,
|
|
35
41
|
"The exact JSON Schema is supplied out-of-band and validated deterministically by the runtime.",
|
|
36
|
-
"
|
|
42
|
+
"If aeh_submit_result is available, submit exactly the final contract payload through it before completing; that durable result is lifecycle-authoritative.",
|
|
43
|
+
"A provider-required native structured final may repeat the same payload for transport compatibility, but must not represent a different semantic result."
|
|
37
44
|
].join("\n");
|
|
38
45
|
}
|
|
39
46
|
const schema = outputJsonSchema(contractName);
|
|
40
47
|
return [
|
|
41
48
|
`AEH output contract: ${contractName}. Runtime validation is authoritative.`,
|
|
42
|
-
"
|
|
49
|
+
"If aeh_submit_result is available, submit exactly the final contract payload through it; the durable result is authoritative.",
|
|
50
|
+
"Otherwise this transport cannot enforce the schema out-of-band, so match the compact schema below exactly and return no prose.",
|
|
43
51
|
schema ? `Schema: ${JSON.stringify(schema)}` : undefined
|
|
44
52
|
].filter(Boolean).join("\n");
|
|
45
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptPolicy.js","sourceRoot":"","sources":["../../src/workers/promptPolicy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAehE,MAAM,UAAU,wBAAwB,CACtC,SAAkC,EAClC,QAAsB,EACtB,OAAiC;IAEjC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,4BAA4B,CAAC,CAAC,CAAC;IAC3G,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;IAE5E,IAAI,OAAO,CAAC,aAAa,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACvC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;YAAE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,cAAc;QAAE,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE7D,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;QACnB,qBAAqB,EAAE,OAAO,CAAC,cAAc;YAC3C,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,cAAc,EAAE,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;YACnH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAsB;IAC3D,OAAO,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAkC,EAAE,SAAiB;IACxF,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,cAAc,KAAK,OAAO,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,YAAqB,EAAE,MAAM,GAAG,KAAK;IAC/F,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,wBAAwB,YAAY,
|
|
1
|
+
{"version":3,"file":"promptPolicy.js","sourceRoot":"","sources":["../../src/workers/promptPolicy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAehE,MAAM,UAAU,wBAAwB,CACtC,SAAkC,EAClC,QAAsB,EACtB,OAAiC;IAEjC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,4BAA4B,CAAC,CAAC,CAAC;IAC3G,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC;IAE5E,IAAI,OAAO,CAAC,aAAa,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACvC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;YAAE,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,cAAc,IAAI,SAAS,CAAC,YAAY,KAAK,sBAAsB;QAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACxF,IAAI,cAAc;QAAE,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE7D,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;QACnB,qBAAqB,EAAE,OAAO,CAAC,cAAc;YAC3C,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,cAAc,EAAE,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;YACnH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAsB;IAC3D,OAAO,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAkC,EAAE,SAAiB;IACxF,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,cAAc,KAAK,OAAO,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,YAAqB,EAAE,MAAM,GAAG,KAAK;IAC/F,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,wBAAwB,YAAY,wCAAwC;YAC5E,6KAA6K;YAC7K,qIAAqI;SACtI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,wBAAwB,YAAY,GAAG;YACvC,+FAA+F;YAC/F,4JAA4J;YAC5J,0JAA0J;SAC3J,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC9C,OAAO;QACL,wBAAwB,YAAY,wCAAwC;QAC5E,+HAA+H;QAC/H,gIAAgI;QAChI,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { type AcceptedStructuredResult, type StructuredResultSource } from "./resultGateway.js";
|
|
2
|
+
export declare function commitStructuredResult<T = unknown>(root: string, operationId: string, channelId: string, payload: unknown, source: StructuredResultSource): Promise<AcceptedStructuredResult<T>>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { validateAgentOutput } from "../agents/outputContracts.js";
|
|
5
|
+
import { operationArtifactDir, resolveOperationStateRoot } from "../operations/state.js";
|
|
6
|
+
import { acceptStructuredResult, loadStructuredResultChannel } from "./resultGateway.js";
|
|
7
|
+
export async function commitStructuredResult(root, operationId, channelId, payload, source) {
|
|
8
|
+
const lock = path.join(operationArtifactDir(resolveOperationStateRoot(root), operationId), "result-channels", `${safe(channelId)}.commit.lock`);
|
|
9
|
+
return withLock(lock, async () => {
|
|
10
|
+
const channel = await loadStructuredResultChannel(root, operationId, channelId);
|
|
11
|
+
const turn = channel.activeTurn;
|
|
12
|
+
if (!turn)
|
|
13
|
+
throw new Error("AEH_RESULT_NO_ACTIVE_TURN: no controller-activated result turn exists.");
|
|
14
|
+
if (turn.status === "ACCEPTED" && turn.sha256 && turn.artifact) {
|
|
15
|
+
const validation = validateAgentOutput(turn.contract, payload);
|
|
16
|
+
if (!validation.ok)
|
|
17
|
+
throw new Error(`RESULT_ALREADY_ACCEPTED: ${validation.issues.join("; ")}`);
|
|
18
|
+
const normalized = validation.value;
|
|
19
|
+
const sha256 = crypto.createHash("sha256").update(JSON.stringify(normalized)).digest("hex");
|
|
20
|
+
if (sha256 !== turn.sha256)
|
|
21
|
+
throw new Error("CONFLICTING_RESULT: the active turn already has a different accepted payload.");
|
|
22
|
+
return { artifact: turn.artifact, sha256, payload: normalized, source: turn.source ?? source, turnId: turn.id, channelId };
|
|
23
|
+
}
|
|
24
|
+
return acceptStructuredResult(root, operationId, channelId, payload, source);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function safe(value) { return value.trim().replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "result"; }
|
|
28
|
+
async function withLock(file, action) {
|
|
29
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
30
|
+
const deadline = Date.now() + 5_000;
|
|
31
|
+
for (;;) {
|
|
32
|
+
try {
|
|
33
|
+
const handle = await fs.open(file, "wx");
|
|
34
|
+
try {
|
|
35
|
+
return await action();
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await handle.close().catch(() => undefined);
|
|
39
|
+
await fs.rm(file, { force: true }).catch(() => undefined);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error.code !== "EEXIST" || Date.now() >= deadline)
|
|
44
|
+
throw error;
|
|
45
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=resultCommit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultCommit.js","sourceRoot":"","sources":["../../src/workers/resultCommit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export type StructuredResultSource = "mcp" | "captured";
|
|
2
|
+
export type StructuredResultTurnStatus = "PENDING" | "ACCEPTED" | "REJECTED" | "CONFLICT";
|
|
3
|
+
export interface StructuredResultTurn {
|
|
4
|
+
id: string;
|
|
5
|
+
sequence: number;
|
|
6
|
+
contract: string;
|
|
7
|
+
phase?: string;
|
|
8
|
+
status: StructuredResultTurnStatus;
|
|
9
|
+
attempts: number;
|
|
10
|
+
activatedAt: string;
|
|
11
|
+
acceptedAt?: string;
|
|
12
|
+
artifact?: string;
|
|
13
|
+
sha256?: string;
|
|
14
|
+
source?: StructuredResultSource;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface StructuredResultChannel {
|
|
18
|
+
version: 1;
|
|
19
|
+
operationId: string;
|
|
20
|
+
channelId: string;
|
|
21
|
+
logicalAgent: string;
|
|
22
|
+
role?: string;
|
|
23
|
+
contract: string;
|
|
24
|
+
agentId?: string;
|
|
25
|
+
createdAt: string;
|
|
26
|
+
updatedAt: string;
|
|
27
|
+
sequence: number;
|
|
28
|
+
activeTurn?: StructuredResultTurn;
|
|
29
|
+
}
|
|
30
|
+
export interface StructuredResultArtifact<T = unknown> {
|
|
31
|
+
version: 1;
|
|
32
|
+
kind: "agent-result";
|
|
33
|
+
operationId: string;
|
|
34
|
+
channelId: string;
|
|
35
|
+
turnId: string;
|
|
36
|
+
sequence: number;
|
|
37
|
+
logicalAgent: string;
|
|
38
|
+
role?: string;
|
|
39
|
+
agentId?: string;
|
|
40
|
+
contract: string;
|
|
41
|
+
source: StructuredResultSource;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
payloadSha256: string;
|
|
44
|
+
payload: T;
|
|
45
|
+
}
|
|
46
|
+
export interface AcceptedStructuredResult<T = unknown> {
|
|
47
|
+
artifact: string;
|
|
48
|
+
sha256: string;
|
|
49
|
+
payload: T;
|
|
50
|
+
source: StructuredResultSource;
|
|
51
|
+
turnId: string;
|
|
52
|
+
channelId: string;
|
|
53
|
+
}
|
|
54
|
+
export interface StructuredResultResolution<T = unknown> {
|
|
55
|
+
ok: boolean;
|
|
56
|
+
accepted?: AcceptedStructuredResult<T>;
|
|
57
|
+
failure?: string;
|
|
58
|
+
}
|
|
59
|
+
export declare function provisionStructuredResultChannel(root: string, input: {
|
|
60
|
+
operationId: string;
|
|
61
|
+
logicalAgent: string;
|
|
62
|
+
role?: string;
|
|
63
|
+
contract: string;
|
|
64
|
+
channelId?: string;
|
|
65
|
+
}): Promise<StructuredResultChannel>;
|
|
66
|
+
export declare function bindStructuredResultChannel(root: string, operationId: string, channelId: string, agentId: string): Promise<StructuredResultChannel>;
|
|
67
|
+
export declare function activateStructuredResultTurn(root: string, operationId: string, channelId: string, phase?: string): Promise<StructuredResultTurn>;
|
|
68
|
+
export declare function activateStructuredResultTurnForAgent(root: string, agentId: string, phase?: string): Promise<StructuredResultTurn | undefined>;
|
|
69
|
+
export declare function acceptStructuredResult<T = unknown>(root: string, operationId: string, channelId: string, payload: unknown, source: StructuredResultSource): Promise<AcceptedStructuredResult<T>>;
|
|
70
|
+
export declare function acceptedStructuredResultForAgent<T = unknown>(root: string, agentId: string): Promise<AcceptedStructuredResult<T> | undefined>;
|
|
71
|
+
export declare function reconcileStructuredResult<T = unknown>(root: string, input: {
|
|
72
|
+
operationId: string;
|
|
73
|
+
agentId?: string;
|
|
74
|
+
logicalAgent: string;
|
|
75
|
+
role?: string;
|
|
76
|
+
contract: string;
|
|
77
|
+
phase?: string;
|
|
78
|
+
stdout: string;
|
|
79
|
+
stderr?: string;
|
|
80
|
+
}): Promise<StructuredResultResolution<T>>;
|
|
81
|
+
export declare function projectAcceptedStructuredResult<T extends {
|
|
82
|
+
stdout: string;
|
|
83
|
+
}>(root: string, agentId: string, result: T): Promise<T>;
|
|
84
|
+
export declare function loadStructuredResultChannel(root: string, operationId: string, channelId: string): Promise<StructuredResultChannel>;
|
|
85
|
+
export declare function resultSinkMcpServerDefinition(root: string, operationId: string, channelId: string): {
|
|
86
|
+
type: "stdio";
|
|
87
|
+
command: string;
|
|
88
|
+
args: string[];
|
|
89
|
+
env: Record<string, string>;
|
|
90
|
+
alwaysLoad: true;
|
|
91
|
+
};
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { validateAgentOutput } from "../agents/outputContracts.js";
|
|
6
|
+
import { extractMarkedJson, StructuredOutputError } from "../agents/structuredOutput.js";
|
|
7
|
+
import { operationArtifactDir, resolveOperationStateRoot, updateOperationParticipant } from "../operations/state.js";
|
|
8
|
+
const CHANNELS_DIR = "result-channels";
|
|
9
|
+
const RESULTS_DIR = "results";
|
|
10
|
+
const GLOBAL_INDEX_DIR = path.join(".harness", "result-channels", "agents");
|
|
11
|
+
const LOCK_RETRY_MS = 10;
|
|
12
|
+
const LOCK_TIMEOUT_MS = 5_000;
|
|
13
|
+
export async function provisionStructuredResultChannel(root, input) {
|
|
14
|
+
const stateRoot = resolveOperationStateRoot(root);
|
|
15
|
+
const channelId = input.channelId ?? crypto.randomUUID();
|
|
16
|
+
const file = channelFile(stateRoot, input.operationId, channelId);
|
|
17
|
+
try {
|
|
18
|
+
return await readJson(file);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
const now = new Date().toISOString();
|
|
22
|
+
const channel = {
|
|
23
|
+
version: 1,
|
|
24
|
+
operationId: input.operationId,
|
|
25
|
+
channelId,
|
|
26
|
+
logicalAgent: input.logicalAgent,
|
|
27
|
+
role: input.role,
|
|
28
|
+
contract: input.contract,
|
|
29
|
+
createdAt: now,
|
|
30
|
+
updatedAt: now,
|
|
31
|
+
sequence: 0
|
|
32
|
+
};
|
|
33
|
+
await writeJsonAtomic(file, channel);
|
|
34
|
+
return channel;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function bindStructuredResultChannel(root, operationId, channelId, agentId) {
|
|
38
|
+
const stateRoot = resolveOperationStateRoot(root);
|
|
39
|
+
const channel = await mutateChannel(stateRoot, operationId, channelId, (current) => ({
|
|
40
|
+
...current,
|
|
41
|
+
agentId,
|
|
42
|
+
updatedAt: new Date().toISOString()
|
|
43
|
+
}));
|
|
44
|
+
const index = agentIndexFile(stateRoot, agentId);
|
|
45
|
+
await writeJsonAtomic(index, { version: 1, operationId, channelId, agentId });
|
|
46
|
+
return channel;
|
|
47
|
+
}
|
|
48
|
+
export async function activateStructuredResultTurn(root, operationId, channelId, phase) {
|
|
49
|
+
const stateRoot = resolveOperationStateRoot(root);
|
|
50
|
+
const channel = await mutateChannel(stateRoot, operationId, channelId, (current) => {
|
|
51
|
+
const sequence = current.sequence + 1;
|
|
52
|
+
const now = new Date().toISOString();
|
|
53
|
+
return {
|
|
54
|
+
...current,
|
|
55
|
+
sequence,
|
|
56
|
+
updatedAt: now,
|
|
57
|
+
activeTurn: {
|
|
58
|
+
id: `${String(sequence).padStart(4, "0")}-${crypto.randomUUID()}`,
|
|
59
|
+
sequence,
|
|
60
|
+
contract: current.contract,
|
|
61
|
+
phase,
|
|
62
|
+
status: "PENDING",
|
|
63
|
+
attempts: 0,
|
|
64
|
+
activatedAt: now
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
if (!channel.activeTurn)
|
|
69
|
+
throw new Error("AEH_RESULT_CHANNEL_STATE: active result turn was not created.");
|
|
70
|
+
return channel.activeTurn;
|
|
71
|
+
}
|
|
72
|
+
export async function activateStructuredResultTurnForAgent(root, agentId, phase) {
|
|
73
|
+
const binding = await loadAgentChannelBinding(root, agentId);
|
|
74
|
+
if (!binding)
|
|
75
|
+
return undefined;
|
|
76
|
+
return activateStructuredResultTurn(root, binding.operationId, binding.channelId, phase);
|
|
77
|
+
}
|
|
78
|
+
export async function acceptStructuredResult(root, operationId, channelId, payload, source) {
|
|
79
|
+
const stateRoot = resolveOperationStateRoot(root);
|
|
80
|
+
const file = channelFile(stateRoot, operationId, channelId);
|
|
81
|
+
return withFileLock(file, async () => {
|
|
82
|
+
const channel = await readJson(file);
|
|
83
|
+
const turn = channel.activeTurn;
|
|
84
|
+
if (!turn)
|
|
85
|
+
throw new Error("AEH_RESULT_NO_ACTIVE_TURN: result submission has no controller-activated turn.");
|
|
86
|
+
const validation = validateAgentOutput(turn.contract, payload);
|
|
87
|
+
if (!validation.ok) {
|
|
88
|
+
const failure = `SCHEMA_VALIDATION_FAILED: ${validation.issues.join("; ")}`;
|
|
89
|
+
channel.activeTurn = { ...turn, status: "REJECTED", attempts: turn.attempts + 1, error: failure };
|
|
90
|
+
channel.updatedAt = new Date().toISOString();
|
|
91
|
+
await writeJsonAtomic(file, channel);
|
|
92
|
+
throw new Error(failure);
|
|
93
|
+
}
|
|
94
|
+
const normalized = validation.value;
|
|
95
|
+
const canonical = JSON.stringify(normalized);
|
|
96
|
+
const sha256 = crypto.createHash("sha256").update(canonical).digest("hex");
|
|
97
|
+
if (turn.status === "ACCEPTED" && turn.sha256) {
|
|
98
|
+
if (turn.sha256 !== sha256) {
|
|
99
|
+
channel.activeTurn = { ...turn, status: "CONFLICT", attempts: turn.attempts + 1, error: "CONFLICTING_RESULT: a different valid payload was submitted for an already accepted turn." };
|
|
100
|
+
channel.updatedAt = new Date().toISOString();
|
|
101
|
+
await writeJsonAtomic(file, channel);
|
|
102
|
+
throw new Error("CONFLICTING_RESULT: a different valid payload was submitted for an already accepted turn.");
|
|
103
|
+
}
|
|
104
|
+
if (!turn.artifact)
|
|
105
|
+
throw new Error("AEH_RESULT_CHANNEL_STATE: accepted turn is missing its artifact reference.");
|
|
106
|
+
return { artifact: turn.artifact, sha256, payload: normalized, source: turn.source ?? source, turnId: turn.id, channelId };
|
|
107
|
+
}
|
|
108
|
+
const artifactEnvelope = {
|
|
109
|
+
version: 1,
|
|
110
|
+
kind: "agent-result",
|
|
111
|
+
operationId,
|
|
112
|
+
channelId,
|
|
113
|
+
turnId: turn.id,
|
|
114
|
+
sequence: turn.sequence,
|
|
115
|
+
logicalAgent: channel.logicalAgent,
|
|
116
|
+
role: channel.role,
|
|
117
|
+
agentId: channel.agentId,
|
|
118
|
+
contract: turn.contract,
|
|
119
|
+
source,
|
|
120
|
+
createdAt: new Date().toISOString(),
|
|
121
|
+
payloadSha256: sha256,
|
|
122
|
+
payload: normalized
|
|
123
|
+
};
|
|
124
|
+
const artifact = await persistResultArtifact(stateRoot, artifactEnvelope);
|
|
125
|
+
const acceptedAt = new Date().toISOString();
|
|
126
|
+
channel.activeTurn = {
|
|
127
|
+
...turn,
|
|
128
|
+
status: "ACCEPTED",
|
|
129
|
+
attempts: turn.attempts + 1,
|
|
130
|
+
acceptedAt,
|
|
131
|
+
artifact,
|
|
132
|
+
sha256,
|
|
133
|
+
source,
|
|
134
|
+
error: undefined
|
|
135
|
+
};
|
|
136
|
+
channel.updatedAt = acceptedAt;
|
|
137
|
+
await writeJsonAtomic(file, channel);
|
|
138
|
+
if (channel.agentId) {
|
|
139
|
+
await updateOperationParticipant(stateRoot, operationId, channel.agentId, { resultArtifact: artifact }).catch(() => undefined);
|
|
140
|
+
}
|
|
141
|
+
return { artifact, sha256, payload: normalized, source, turnId: turn.id, channelId };
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
export async function acceptedStructuredResultForAgent(root, agentId) {
|
|
145
|
+
const binding = await loadAgentChannelBinding(root, agentId);
|
|
146
|
+
if (!binding)
|
|
147
|
+
return undefined;
|
|
148
|
+
const stateRoot = resolveOperationStateRoot(root);
|
|
149
|
+
const channel = await readJson(channelFile(stateRoot, binding.operationId, binding.channelId)).catch(() => undefined);
|
|
150
|
+
const turn = channel?.activeTurn;
|
|
151
|
+
if (!channel || !turn || turn.status !== "ACCEPTED" || !turn.artifact || !turn.sha256)
|
|
152
|
+
return undefined;
|
|
153
|
+
const envelope = await readJson(path.resolve(stateRoot, turn.artifact));
|
|
154
|
+
return { artifact: turn.artifact, sha256: turn.sha256, payload: envelope.payload, source: turn.source ?? envelope.source, turnId: turn.id, channelId: channel.channelId };
|
|
155
|
+
}
|
|
156
|
+
export async function reconcileStructuredResult(root, input) {
|
|
157
|
+
if (input.agentId) {
|
|
158
|
+
const accepted = await acceptedStructuredResultForAgent(root, input.agentId).catch(() => undefined);
|
|
159
|
+
if (accepted)
|
|
160
|
+
return { ok: true, accepted };
|
|
161
|
+
}
|
|
162
|
+
let payload;
|
|
163
|
+
try {
|
|
164
|
+
payload = extractMarkedJson(input.stdout, input.stderr ?? "");
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error instanceof StructuredOutputError)
|
|
168
|
+
return { ok: false, failure: `${error.reason}: ${error.message}` };
|
|
169
|
+
return { ok: false, failure: `OUTPUT_CONTRACT_UNKNOWN: ${String(error)}` };
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const channel = input.agentId
|
|
173
|
+
? await ensureAgentChannel(root, input)
|
|
174
|
+
: await provisionStructuredResultChannel(root, { operationId: input.operationId, logicalAgent: input.logicalAgent, role: input.role, contract: input.contract });
|
|
175
|
+
if (!channel.activeTurn || channel.activeTurn.status === "ACCEPTED") {
|
|
176
|
+
await activateStructuredResultTurn(root, input.operationId, channel.channelId, input.phase);
|
|
177
|
+
}
|
|
178
|
+
const accepted = await acceptStructuredResult(root, input.operationId, channel.channelId, payload, "captured");
|
|
179
|
+
return { ok: true, accepted };
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
return { ok: false, failure: error instanceof Error ? error.message : String(error) };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export async function projectAcceptedStructuredResult(root, agentId, result) {
|
|
186
|
+
const accepted = await acceptedStructuredResultForAgent(root, agentId).catch(() => undefined);
|
|
187
|
+
return accepted ? { ...result, stdout: JSON.stringify(accepted.payload) } : result;
|
|
188
|
+
}
|
|
189
|
+
export async function loadStructuredResultChannel(root, operationId, channelId) {
|
|
190
|
+
return readJson(channelFile(resolveOperationStateRoot(root), operationId, channelId));
|
|
191
|
+
}
|
|
192
|
+
export function resultSinkMcpServerDefinition(root, operationId, channelId) {
|
|
193
|
+
return {
|
|
194
|
+
type: "stdio",
|
|
195
|
+
command: process.execPath,
|
|
196
|
+
args: [fileURLToPath(new URL("./resultSinkMcp.js", import.meta.url))],
|
|
197
|
+
env: {
|
|
198
|
+
AEH_RESULT_CONTROL_ROOT: resolveOperationStateRoot(root),
|
|
199
|
+
AEH_RESULT_OPERATION_ID: operationId,
|
|
200
|
+
AEH_RESULT_CHANNEL_ID: channelId
|
|
201
|
+
},
|
|
202
|
+
alwaysLoad: true
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async function ensureAgentChannel(root, input) {
|
|
206
|
+
if (!input.agentId)
|
|
207
|
+
throw new Error("agentId is required");
|
|
208
|
+
const binding = await loadAgentChannelBinding(root, input.agentId);
|
|
209
|
+
if (binding) {
|
|
210
|
+
const channel = await loadStructuredResultChannel(root, binding.operationId, binding.channelId);
|
|
211
|
+
if (channel.contract !== input.contract)
|
|
212
|
+
throw new Error(`AEH_RESULT_CONTRACT_MISMATCH: channel=${channel.contract} requested=${input.contract}`);
|
|
213
|
+
return channel;
|
|
214
|
+
}
|
|
215
|
+
const channel = await provisionStructuredResultChannel(root, input);
|
|
216
|
+
return bindStructuredResultChannel(root, input.operationId, channel.channelId, input.agentId);
|
|
217
|
+
}
|
|
218
|
+
async function loadAgentChannelBinding(root, agentId) {
|
|
219
|
+
const stateRoot = resolveOperationStateRoot(root);
|
|
220
|
+
return readJson(agentIndexFile(stateRoot, agentId)).catch(() => undefined);
|
|
221
|
+
}
|
|
222
|
+
async function persistResultArtifact(root, envelope) {
|
|
223
|
+
const dir = path.join(operationArtifactDir(root, envelope.operationId), RESULTS_DIR, safe(envelope.logicalAgent));
|
|
224
|
+
await fs.mkdir(dir, { recursive: true });
|
|
225
|
+
const file = path.join(dir, `${String(envelope.sequence).padStart(4, "0")}-${safe(envelope.turnId)}.json`);
|
|
226
|
+
await writeJsonAtomic(file, envelope);
|
|
227
|
+
return path.relative(resolveOperationStateRoot(root), file).replaceAll("\\", "/");
|
|
228
|
+
}
|
|
229
|
+
function channelFile(root, operationId, channelId) {
|
|
230
|
+
return path.join(operationArtifactDir(root, operationId), CHANNELS_DIR, `${safe(channelId)}.json`);
|
|
231
|
+
}
|
|
232
|
+
function agentIndexFile(root, agentId) { return path.resolve(root, GLOBAL_INDEX_DIR, `${safe(agentId)}.json`); }
|
|
233
|
+
function safe(value) { return value.trim().replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "result"; }
|
|
234
|
+
async function mutateChannel(root, operationId, channelId, mutate) {
|
|
235
|
+
const file = channelFile(root, operationId, channelId);
|
|
236
|
+
return withFileLock(file, async () => {
|
|
237
|
+
const current = await readJson(file);
|
|
238
|
+
const next = mutate(current);
|
|
239
|
+
await writeJsonAtomic(file, next);
|
|
240
|
+
return next;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
async function withFileLock(file, action) {
|
|
244
|
+
const lock = `${file}.lock`;
|
|
245
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
246
|
+
const deadline = Date.now() + LOCK_TIMEOUT_MS;
|
|
247
|
+
for (;;) {
|
|
248
|
+
try {
|
|
249
|
+
const handle = await fs.open(lock, "wx");
|
|
250
|
+
try {
|
|
251
|
+
return await action();
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
await handle.close().catch(() => undefined);
|
|
255
|
+
await fs.rm(lock, { force: true }).catch(() => undefined);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
const code = error.code;
|
|
260
|
+
if (code !== "EEXIST" || Date.now() >= deadline)
|
|
261
|
+
throw error;
|
|
262
|
+
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async function readJson(file) { return JSON.parse(await fs.readFile(file, "utf8")); }
|
|
267
|
+
async function writeJsonAtomic(file, value) {
|
|
268
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
269
|
+
const temp = `${file}.${process.pid}.${crypto.randomUUID()}.tmp`;
|
|
270
|
+
await fs.writeFile(temp, `${JSON.stringify(value, null, 2)}\n`);
|
|
271
|
+
try {
|
|
272
|
+
await fs.rename(temp, file);
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
await fs.rm(temp, { force: true }).catch(() => undefined);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=resultGateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultGateway.js","sourceRoot":"","sources":["../../src/workers/resultGateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface JsonRpcRequest {
|
|
2
|
+
jsonrpc?: string;
|
|
3
|
+
id?: string | number | null;
|
|
4
|
+
method?: string;
|
|
5
|
+
params?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export declare function serveResultSinkMcp(): Promise<void>;
|
|
8
|
+
export declare function handleResultSinkRequest(request: JsonRpcRequest): Promise<Record<string, unknown>>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import readline from "node:readline";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { outputJsonSchema } from "../agents/outputContracts.js";
|
|
5
|
+
import { loadStructuredResultChannel } from "./resultGateway.js";
|
|
6
|
+
import { commitStructuredResult } from "./resultCommit.js";
|
|
7
|
+
export async function serveResultSinkMcp() {
|
|
8
|
+
const rl = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
9
|
+
for await (const line of rl) {
|
|
10
|
+
if (!line.trim())
|
|
11
|
+
continue;
|
|
12
|
+
let request;
|
|
13
|
+
try {
|
|
14
|
+
request = JSON.parse(line);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (request.id === undefined || request.id === null)
|
|
20
|
+
continue;
|
|
21
|
+
try {
|
|
22
|
+
write({ jsonrpc: "2.0", id: request.id, result: await handleResultSinkRequest(request) });
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
write({ jsonrpc: "2.0", id: request.id, error: { code: -32603, message: error instanceof Error ? error.message : String(error) } });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function handleResultSinkRequest(request) {
|
|
30
|
+
const root = requiredEnv("AEH_RESULT_CONTROL_ROOT");
|
|
31
|
+
const operationId = requiredEnv("AEH_RESULT_OPERATION_ID");
|
|
32
|
+
const channelId = requiredEnv("AEH_RESULT_CHANNEL_ID");
|
|
33
|
+
const channel = await loadStructuredResultChannel(root, operationId, channelId);
|
|
34
|
+
if (request.method === "initialize") {
|
|
35
|
+
return {
|
|
36
|
+
protocolVersion: typeof request.params?.protocolVersion === "string" ? request.params.protocolVersion : "2025-06-18",
|
|
37
|
+
capabilities: { tools: {} },
|
|
38
|
+
serverInfo: { name: "aeh-result-sink", version: "1" }
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (request.method === "ping")
|
|
42
|
+
return {};
|
|
43
|
+
if (request.method === "tools/list") {
|
|
44
|
+
return {
|
|
45
|
+
tools: [{
|
|
46
|
+
name: "aeh_submit_result",
|
|
47
|
+
description: `Submit the final ${channel.contract} contract result for the current controller-activated AEH turn. This durable submission is authoritative; operation, agent, contract and destination are controller-bound and cannot be supplied by the caller.`,
|
|
48
|
+
inputSchema: outputJsonSchema(channel.contract) ?? { type: "object", additionalProperties: true }
|
|
49
|
+
}]
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (request.method === "tools/call") {
|
|
53
|
+
const params = request.params ?? {};
|
|
54
|
+
if (params.name !== "aeh_submit_result")
|
|
55
|
+
throw new Error(`Unknown result sink tool '${String(params.name ?? "")}'.`);
|
|
56
|
+
const payload = object(params.arguments);
|
|
57
|
+
const accepted = await commitStructuredResult(root, operationId, channelId, payload, "mcp");
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: "text", text: `Accepted ${channel.contract} result ${accepted.sha256.slice(0, 12)} for the active AEH turn.` }],
|
|
60
|
+
structuredContent: {
|
|
61
|
+
status: "ACCEPTED",
|
|
62
|
+
contract: channel.contract,
|
|
63
|
+
artifact: accepted.artifact,
|
|
64
|
+
sha256: accepted.sha256,
|
|
65
|
+
turnId: accepted.turnId
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`Unsupported MCP method: ${request.method ?? "<missing>"}`);
|
|
70
|
+
}
|
|
71
|
+
function requiredEnv(name) {
|
|
72
|
+
const value = process.env[name]?.trim();
|
|
73
|
+
if (!value)
|
|
74
|
+
throw new Error(`${name} is required for the AEH result sink.`);
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
function object(value) {
|
|
78
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
79
|
+
throw new Error("aeh_submit_result arguments must be one JSON object matching the active output contract.");
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
function write(value) { process.stdout.write(`${JSON.stringify(value)}\n`); }
|
|
83
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
84
|
+
serveResultSinkMcp().catch((error) => { process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`); process.exitCode = 1; });
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=resultSinkMcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultSinkMcp.js","sourceRoot":"","sources":["../../src/workers/resultSinkMcp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-engineering-harness",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.23",
|
|
4
4
|
"description": "OSS-first engineering harness for deterministic, spec-driven, issue-driven, audit-governed and orchestration-first multi-agent software delivery.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
"operation-supervisor": {
|
|
21
21
|
"role": "coordinator",
|
|
22
22
|
"domains": ["*"],
|
|
23
|
-
"description": "Own semantic coordination
|
|
23
|
+
"description": "Own operation-local semantic coordination, delegation, consolidation, conflict detection and evidence gaps for exactly one durable AEH operation.",
|
|
24
24
|
"execution": { "model": "@brain" },
|
|
25
25
|
"temperature": 0.1,
|
|
26
|
-
"skills": [
|
|
26
|
+
"skills": [],
|
|
27
27
|
"permissions": { "read": "allow", "write": "deny", "shell": "allow", "network": "deny", "delegate": "allow", "review": "allow", "validate": "deny", "gitWrite": "deny" },
|
|
28
28
|
"outputContract": "supervisor"
|
|
29
29
|
},
|