@goah/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -2
- package/dist/cli.js.map +1 -1
- package/dist/execution.d.ts +2 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +2 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +2 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +2 -0
- package/dist/kernel.js.map +1 -0
- package/dist/metrics.d.ts +2 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +2 -0
- package/dist/metrics.js.map +1 -0
- package/dist/runner-pi.d.ts +2 -0
- package/dist/runner-pi.d.ts.map +1 -0
- package/dist/runner-pi.js +2 -0
- package/dist/runner-pi.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +2 -0
- package/dist/session.js.map +1 -0
- package/dist/sqlite.d.ts +2 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/sqlite.js +2 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/supervisor.d.ts +2 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +2 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/testkit.d.ts +2 -0
- package/dist/testkit.d.ts.map +1 -0
- package/dist/testkit.js +2 -0
- package/dist/testkit.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/execution.d.ts +205 -0
- package/node_modules/goah-ledger-contract/dist/execution.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/execution.js +18 -0
- package/node_modules/goah-ledger-contract/dist/execution.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/index.d.ts +5 -0
- package/node_modules/goah-ledger-contract/dist/index.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/index.js +5 -0
- package/node_modules/goah-ledger-contract/dist/index.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/kernel.d.ts +33 -0
- package/node_modules/goah-ledger-contract/dist/kernel.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/kernel.js +6 -0
- package/node_modules/goah-ledger-contract/dist/kernel.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/metrics.d.ts +40 -0
- package/node_modules/goah-ledger-contract/dist/metrics.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/metrics.js +25 -0
- package/node_modules/goah-ledger-contract/dist/metrics.js.map +1 -0
- package/node_modules/goah-ledger-contract/dist/session.d.ts +37 -0
- package/node_modules/goah-ledger-contract/dist/session.d.ts.map +1 -0
- package/node_modules/goah-ledger-contract/dist/session.js +53 -0
- package/node_modules/goah-ledger-contract/dist/session.js.map +1 -0
- package/node_modules/goah-ledger-contract/package.json +29 -0
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts +66 -0
- package/node_modules/goah-ledger-sqlite/dist/index.d.ts.map +1 -0
- package/node_modules/goah-ledger-sqlite/dist/index.js +537 -0
- package/node_modules/goah-ledger-sqlite/dist/index.js.map +1 -0
- package/node_modules/goah-ledger-sqlite/package.json +26 -0
- package/node_modules/goah-runner-pi/dist/index.d.ts +53 -0
- package/node_modules/goah-runner-pi/dist/index.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/index.js +229 -0
- package/node_modules/goah-runner-pi/dist/index.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/model-provider.d.ts +13 -0
- package/node_modules/goah-runner-pi/dist/model-provider.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/model-provider.js +75 -0
- package/node_modules/goah-runner-pi/dist/model-provider.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.d.ts +11 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.js +263 -0
- package/node_modules/goah-runner-pi/dist/pi-worker.js.map +1 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.d.ts +2 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.d.ts.map +1 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.js +48 -0
- package/node_modules/goah-runner-pi/dist/verification-worker.js.map +1 -0
- package/node_modules/goah-runner-pi/package.json +28 -0
- package/node_modules/goah-supervisor/dist/context-view.d.ts +21 -0
- package/node_modules/goah-supervisor/dist/context-view.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/context-view.js +33 -0
- package/node_modules/goah-supervisor/dist/context-view.js.map +1 -0
- package/node_modules/goah-supervisor/dist/index.d.ts +54 -0
- package/node_modules/goah-supervisor/dist/index.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/index.js +436 -0
- package/node_modules/goah-supervisor/dist/index.js.map +1 -0
- package/node_modules/goah-supervisor/dist/roles.d.ts +3 -0
- package/node_modules/goah-supervisor/dist/roles.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/roles.js +8 -0
- package/node_modules/goah-supervisor/dist/roles.js.map +1 -0
- package/node_modules/goah-supervisor/dist/verification.d.ts +82 -0
- package/node_modules/goah-supervisor/dist/verification.d.ts.map +1 -0
- package/node_modules/goah-supervisor/dist/verification.js +110 -0
- package/node_modules/goah-supervisor/dist/verification.js.map +1 -0
- package/node_modules/goah-supervisor/package.json +26 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts +2 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.js +29 -0
- package/node_modules/goah-testkit/dist/faux-runner-worker.js.map +1 -0
- package/node_modules/goah-testkit/dist/index.d.ts +51 -0
- package/node_modules/goah-testkit/dist/index.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/index.js +96 -0
- package/node_modules/goah-testkit/dist/index.js.map +1 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts +2 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts.map +1 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.js +29 -0
- package/node_modules/goah-testkit/dist/mock-connector-worker.js.map +1 -0
- package/node_modules/goah-testkit/package.json +29 -0
- package/package.json +27 -8
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { controlStream, wakeStream } from "goah-ledger-contract";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
export class ProcessVerifierModel {
|
|
4
|
+
spec;
|
|
5
|
+
constructor(spec) {
|
|
6
|
+
this.spec = spec;
|
|
7
|
+
}
|
|
8
|
+
verifySession(input) { return this.#call("verify_session", input); }
|
|
9
|
+
blindAudit(facts) { return this.#call("blind_audit", { facts }); }
|
|
10
|
+
reasonAudit(input) { return this.#call("reason_audit", input); }
|
|
11
|
+
async #call(operation, input) {
|
|
12
|
+
const env = {};
|
|
13
|
+
for (const name of ["PATH", "TMPDIR", "TMP", "TEMP", "SYSTEMROOT"])
|
|
14
|
+
if (process.env[name] !== undefined)
|
|
15
|
+
env[name] = process.env[name];
|
|
16
|
+
const child = spawn(this.spec.command, this.spec.args, { detached: process.platform !== "win32", env: { ...env, ...this.spec.env }, stdio: ["pipe", "pipe", "pipe"] });
|
|
17
|
+
let stdout = "";
|
|
18
|
+
let stderr = "";
|
|
19
|
+
let timedOut = false;
|
|
20
|
+
child.stdout.on("data", (chunk) => { stdout += chunk.toString(); });
|
|
21
|
+
child.stderr.on("data", (chunk) => { stderr += chunk.toString(); });
|
|
22
|
+
child.stdin.end(`${JSON.stringify({ operation, input })}\n`);
|
|
23
|
+
const timer = setTimeout(() => { timedOut = true; if (child.pid) {
|
|
24
|
+
try {
|
|
25
|
+
process.kill(process.platform === "win32" ? child.pid : -child.pid, "SIGKILL");
|
|
26
|
+
}
|
|
27
|
+
catch { }
|
|
28
|
+
} }, this.spec.timeoutMs ?? 60_000);
|
|
29
|
+
const code = await new Promise((resolve, reject) => { child.once("error", reject); child.once("close", resolve); });
|
|
30
|
+
clearTimeout(timer);
|
|
31
|
+
if (code !== 0)
|
|
32
|
+
throw new Error(timedOut ? "verifier process timed out" : stderr.trim() || `verifier exited ${code}`);
|
|
33
|
+
return JSON.parse(stdout);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class VerificationPlane {
|
|
37
|
+
ledger;
|
|
38
|
+
supervisor;
|
|
39
|
+
model;
|
|
40
|
+
constructor(ledger, supervisor, model) {
|
|
41
|
+
this.ledger = ledger;
|
|
42
|
+
this.supervisor = supervisor;
|
|
43
|
+
this.model = model;
|
|
44
|
+
}
|
|
45
|
+
async verifySession(wakeId) {
|
|
46
|
+
const trace = this.ledger.eventsForWake(wakeId);
|
|
47
|
+
const handoff = trace.findLast((event) => event.type === "handoff.recorded")?.data ?? null;
|
|
48
|
+
const seqs = new Set(trace.map((event) => event.seq));
|
|
49
|
+
const actions = this.ledger.actions().filter((action) => action.evidence.some((seq) => seqs.has(seq)));
|
|
50
|
+
const result = await this.model.verifySession({ wakeId, handoff, trace, actions });
|
|
51
|
+
this.#apply(result, "verifier", wakeId);
|
|
52
|
+
this.ledger.appendEvent({ streamId: wakeStream(wakeId), ts: this.supervisor.clock.now().toISOString(), actor: "verifier", type: "verification.completed", data: { wakeId, findings: result.findings.length, tokensUsed: result.tokensUsed } });
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
async auditGlobal(sinceSeq = 0) {
|
|
56
|
+
const facts = this.ledger.eventsSince(sinceSeq).filter((event) => !["handoff.recorded", "runner.note"].includes(event.type)).map(blindFact);
|
|
57
|
+
const blind = await this.model.blindAudit(facts);
|
|
58
|
+
const reasons = this.ledger.actions().map((action) => ({ actionId: action.id, reason: action.reason, evidence: action.evidence }));
|
|
59
|
+
const reasoned = await this.model.reasonAudit({ facts, reasons });
|
|
60
|
+
this.#apply(blind, "audit");
|
|
61
|
+
this.#apply(reasoned, "audit");
|
|
62
|
+
this.ledger.appendEvent({ streamId: controlStream("audit"), ts: this.supervisor.clock.now().toISOString(), actor: "audit", type: "audit.completed", data: { sinceSeq, blindFindings: blind.findings.length, reasonedFindings: reasoned.findings.length, tokensUsed: blind.tokensUsed + reasoned.tokensUsed } });
|
|
63
|
+
return { blind, reasoned };
|
|
64
|
+
}
|
|
65
|
+
#apply(result, by, wakeId) {
|
|
66
|
+
for (const finding of result.findings) {
|
|
67
|
+
if (!this.ledger.action(finding.actionId))
|
|
68
|
+
continue;
|
|
69
|
+
this.supervisor.putAuditAdvice(finding.actionId, { by, body: finding.body, evidence: finding.evidence }, wakeId);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function evaluateVerification(labels, predictedIds) {
|
|
74
|
+
const predicted = new Set(predictedIds);
|
|
75
|
+
const positives = labels.filter((label) => label.shouldFlag);
|
|
76
|
+
const truePositives = positives.filter((label) => predicted.has(label.id));
|
|
77
|
+
const falsePositives = labels.filter((label) => !label.shouldFlag && predicted.has(label.id));
|
|
78
|
+
const precision = truePositives.length + falsePositives.length === 0 ? 1 : truePositives.length / (truePositives.length + falsePositives.length);
|
|
79
|
+
const totalRisk = positives.reduce((sum, label) => sum + label.riskWeight, 0);
|
|
80
|
+
const recalledRisk = truePositives.reduce((sum, label) => sum + label.riskWeight, 0);
|
|
81
|
+
return { precision, riskWeightedRecall: totalRisk === 0 ? 1 : recalledRisk / totalRisk };
|
|
82
|
+
}
|
|
83
|
+
export function calibrateVerificationThreshold(labels, predictions, minimumPrecision) {
|
|
84
|
+
const candidates = [...new Set(predictions.map((prediction) => prediction.score))].sort((a, b) => a - b);
|
|
85
|
+
let selected = 1;
|
|
86
|
+
let bestRecall = -1;
|
|
87
|
+
for (const threshold of candidates) {
|
|
88
|
+
const metrics = evaluateVerification(labels, predictions.filter((prediction) => prediction.score >= threshold).map((prediction) => prediction.id));
|
|
89
|
+
if (metrics.precision >= minimumPrecision && metrics.riskWeightedRecall > bestRecall) {
|
|
90
|
+
selected = threshold;
|
|
91
|
+
bestRecall = metrics.riskWeightedRecall;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return selected;
|
|
95
|
+
}
|
|
96
|
+
function blindFact(event) {
|
|
97
|
+
if (!event.type.startsWith("action."))
|
|
98
|
+
return event;
|
|
99
|
+
const data = structuredClone(event.data);
|
|
100
|
+
const snapshot = data.snapshot;
|
|
101
|
+
if (snapshot) {
|
|
102
|
+
delete snapshot.reason;
|
|
103
|
+
delete snapshot.evidence;
|
|
104
|
+
delete snapshot.auditAdvice;
|
|
105
|
+
}
|
|
106
|
+
delete data.reason;
|
|
107
|
+
delete data.evidence;
|
|
108
|
+
return { ...event, data: data };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "goah-supervisor",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.3.0",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/billc8128/goah.git",
|
|
9
|
+
"directory": "packages/supervisor"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=24.0.0"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"!dist/**/*.test.*",
|
|
17
|
+
"!dist/.tsbuildinfo"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": "./dist/index.js",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"goah-ledger-contract": "0.3.0"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faux-runner-worker.d.ts","sourceRoot":"","sources":["../src/faux-runner-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { runProcessWorker } from "goah-runner-pi";
|
|
4
|
+
await runProcessWorker(async (request, emit, rpc) => {
|
|
5
|
+
if (process.env.GOAH_FAUX_CONTEXT_FILE)
|
|
6
|
+
writeFileSync(process.env.GOAH_FAUX_CONTEXT_FILE, JSON.stringify(request.context));
|
|
7
|
+
const steps = JSON.parse(process.env.GOAH_FAUX_STEPS ?? "[]");
|
|
8
|
+
for (const step of steps) {
|
|
9
|
+
if (step.write) {
|
|
10
|
+
const path = join(process.cwd(), step.write.path);
|
|
11
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
12
|
+
writeFileSync(path, step.write.content);
|
|
13
|
+
}
|
|
14
|
+
for (const trace of step.trace ?? [])
|
|
15
|
+
emit(trace);
|
|
16
|
+
if (step.rpc)
|
|
17
|
+
emit({ type: "runner.rpc.result", data: await rpc(step.rpc.method, step.rpc.params) });
|
|
18
|
+
if (step.crash)
|
|
19
|
+
throw new Error(step.crash);
|
|
20
|
+
if (step.delayMs)
|
|
21
|
+
await new Promise((resolve) => setTimeout(resolve, step.delayMs));
|
|
22
|
+
if (step.hang)
|
|
23
|
+
await new Promise(() => undefined);
|
|
24
|
+
if (step.handoff)
|
|
25
|
+
return { outcome: "handoff", output: step.handoff };
|
|
26
|
+
}
|
|
27
|
+
return { outcome: "abnormal", reason: "faux worker stopped without handoff" };
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=faux-runner-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faux-runner-worker.js","sourceRoot":"","sources":["../src/faux-runner-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAalD,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAyB,EAAE;IACzE,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3H,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAiB,CAAC;IAC9E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;YAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACpF,IAAI,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;AAChF,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type Clock, type ConnectorManifest, type ConnectorProcessSpec, type JsonValue, type Ledger, type RunRequest, type WakeOutput } from "goah-ledger-contract";
|
|
2
|
+
import { SqliteLedger, type SqliteLedgerOptions } from "goah-ledger-sqlite";
|
|
3
|
+
import type { PiDriver, PiSession } from "goah-runner-pi";
|
|
4
|
+
export declare class SimulatedClock implements Clock {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(value?: string);
|
|
7
|
+
now(): Date;
|
|
8
|
+
advance(ms: number): void;
|
|
9
|
+
set(value: string): void;
|
|
10
|
+
}
|
|
11
|
+
export declare function createMemoryLedger(options?: SqliteLedgerOptions): SqliteLedger;
|
|
12
|
+
export interface FauxStep {
|
|
13
|
+
advanceMs?: number;
|
|
14
|
+
trace?: Array<{
|
|
15
|
+
type: string;
|
|
16
|
+
data: JsonValue;
|
|
17
|
+
}>;
|
|
18
|
+
write?: {
|
|
19
|
+
path: string;
|
|
20
|
+
content: string;
|
|
21
|
+
};
|
|
22
|
+
handoff?: WakeOutput;
|
|
23
|
+
stop?: boolean;
|
|
24
|
+
crash?: string;
|
|
25
|
+
effect?: (request: RunRequest) => void;
|
|
26
|
+
}
|
|
27
|
+
export declare class FauxPiDriver implements PiDriver {
|
|
28
|
+
#private;
|
|
29
|
+
readonly clock: SimulatedClock;
|
|
30
|
+
readonly directory: string;
|
|
31
|
+
readonly requests: RunRequest[];
|
|
32
|
+
constructor(clock: SimulatedClock, sessions: FauxStep[][], directory?: string);
|
|
33
|
+
createSession(request: RunRequest): Promise<PiSession>;
|
|
34
|
+
}
|
|
35
|
+
export declare class MockConnector {
|
|
36
|
+
#private;
|
|
37
|
+
readonly statePath: string;
|
|
38
|
+
readonly manifest: ConnectorManifest;
|
|
39
|
+
readonly spec: ConnectorProcessSpec;
|
|
40
|
+
constructor(connector?: string, kind?: string);
|
|
41
|
+
get dispatched(): string[];
|
|
42
|
+
set failAfterEffect(value: boolean);
|
|
43
|
+
}
|
|
44
|
+
export declare function mockConnectorWorkerPath(): string;
|
|
45
|
+
export declare function fauxRunnerWorkerPath(): string;
|
|
46
|
+
export interface LedgerConformanceFactory {
|
|
47
|
+
(clock: Clock): Ledger;
|
|
48
|
+
}
|
|
49
|
+
/** Public, storage-independent contract checks for third-party Ledger implementations. */
|
|
50
|
+
export declare function assertLedgerConformance(create: LedgerConformanceFactory): void;
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,cAAe,YAAW,KAAK;;gBAE9B,KAAK,SAA6B;IAC9C,GAAG,IAAI,IAAI;IACX,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IACzB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CACzB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAAkD;AAErI,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAED,qBAAa,YAAa,YAAW,QAAQ;;IAG/B,QAAQ,CAAC,KAAK,EAAE,cAAc;IAA0B,QAAQ,CAAC,SAAS;IAFtF,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAM;gBAEhB,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAW,SAAS,SAAgB;IAChG,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;CAoB7D;AAID,qBAAa,aAAa;;IACxB,QAAQ,CAAC,SAAS,SAAqE;IACvF,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;gBACxB,SAAS,SAAS,EAAE,IAAI,SAAe;IAUnD,IAAI,UAAU,IAAI,MAAM,EAAE,CAAqC;IAC/D,IAAI,eAAe,CAAC,KAAK,EAAE,OAAO,EAAuH;CAE1J;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAAkF;AACnI,wBAAgB,oBAAoB,IAAI,MAAM,CAA+E;AAE7H,MAAM,WAAW,wBAAwB;IAAG,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE;AAEpE,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAkB9E"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { CONTRACT_VERSION, } from "goah-ledger-contract";
|
|
6
|
+
import { SqliteLedger } from "goah-ledger-sqlite";
|
|
7
|
+
export class SimulatedClock {
|
|
8
|
+
#value;
|
|
9
|
+
constructor(value = "2026-08-18T00:00:00.000Z") { this.#value = new Date(value); }
|
|
10
|
+
now() { return new Date(this.#value); }
|
|
11
|
+
advance(ms) { this.#value = new Date(this.#value.getTime() + ms); }
|
|
12
|
+
set(value) { this.#value = new Date(value); }
|
|
13
|
+
}
|
|
14
|
+
export function createMemoryLedger(options = {}) { return new SqliteLedger(":memory:", options); }
|
|
15
|
+
export class FauxPiDriver {
|
|
16
|
+
clock;
|
|
17
|
+
directory;
|
|
18
|
+
requests = [];
|
|
19
|
+
#sessions;
|
|
20
|
+
constructor(clock, sessions, directory = process.cwd()) {
|
|
21
|
+
this.clock = clock;
|
|
22
|
+
this.directory = directory;
|
|
23
|
+
this.#sessions = sessions.map((steps) => [...steps]);
|
|
24
|
+
}
|
|
25
|
+
async createSession(request) {
|
|
26
|
+
this.requests.push(request);
|
|
27
|
+
const steps = this.#sessions.shift() ?? [];
|
|
28
|
+
return {
|
|
29
|
+
step: async () => {
|
|
30
|
+
const step = steps.shift();
|
|
31
|
+
if (!step)
|
|
32
|
+
return { stopped: true };
|
|
33
|
+
if (step.advanceMs)
|
|
34
|
+
this.clock.advance(step.advanceMs);
|
|
35
|
+
if (step.write) {
|
|
36
|
+
const path = join(this.directory, step.write.path);
|
|
37
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
38
|
+
writeFileSync(path, step.write.content);
|
|
39
|
+
}
|
|
40
|
+
step.effect?.(request);
|
|
41
|
+
if (step.crash)
|
|
42
|
+
throw new Error(step.crash);
|
|
43
|
+
return { ...(step.trace ? { trace: step.trace } : {}), ...(step.handoff ? { handoff: step.handoff } : {}), ...(step.stop ? { stopped: true } : {}) };
|
|
44
|
+
},
|
|
45
|
+
close: async () => undefined,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class MockConnector {
|
|
50
|
+
statePath = join(tmpdir(), `goah-mock-connector-${crypto.randomUUID()}.json`);
|
|
51
|
+
manifest;
|
|
52
|
+
spec;
|
|
53
|
+
constructor(connector = "mock", kind = "mock.write") {
|
|
54
|
+
this.manifest = {
|
|
55
|
+
contractVersion: CONTRACT_VERSION,
|
|
56
|
+
connector,
|
|
57
|
+
dryRun: true,
|
|
58
|
+
capabilities: [{ kind, nativeIdempotency: true, query: "by_idempotency_key", automaticRetry: false, risk: "reversible" }],
|
|
59
|
+
};
|
|
60
|
+
writeFileSync(this.statePath, JSON.stringify({ dispatched: [], failAfterEffect: false }));
|
|
61
|
+
this.spec = { manifest: this.manifest, command: process.execPath, args: [mockConnectorWorkerPath()], env: { GOAH_MOCK_CONNECTOR_STATE: this.statePath }, timeoutMs: 2_000 };
|
|
62
|
+
}
|
|
63
|
+
get dispatched() { return this.#state().dispatched; }
|
|
64
|
+
set failAfterEffect(value) { const state = this.#state(); state.failAfterEffect = value; writeFileSync(this.statePath, JSON.stringify(state)); }
|
|
65
|
+
#state() { return JSON.parse(readFileSync(this.statePath, "utf8")); }
|
|
66
|
+
}
|
|
67
|
+
export function mockConnectorWorkerPath() { return fileURLToPath(new URL("./mock-connector-worker.js", import.meta.url)); }
|
|
68
|
+
export function fauxRunnerWorkerPath() { return fileURLToPath(new URL("./faux-runner-worker.js", import.meta.url)); }
|
|
69
|
+
/** Public, storage-independent contract checks for third-party Ledger implementations. */
|
|
70
|
+
export function assertLedgerConformance(create) {
|
|
71
|
+
const clock = new SimulatedClock("2030-01-01T00:00:00.000Z");
|
|
72
|
+
const ledger = create(clock);
|
|
73
|
+
ledger.putGoal({ id: "root", parentId: null, objective: "test", owner: "a", phase: "active", revision: 0 }, "human");
|
|
74
|
+
const first = ledger.enqueueWake({ id: "z", agent: "a", triggerRef: "first", status: "queued", leaseUntil: null, attempt: 0, startedAt: null, endedAt: null, enqueuedSeq: 0, leaseToken: null, runnerPid: null }, "supervisor");
|
|
75
|
+
ledger.enqueueWake({ id: "a", agent: "b", triggerRef: "second", status: "queued", leaseUntil: null, attempt: 0, startedAt: null, endedAt: null, enqueuedSeq: 0, leaseToken: null, runnerPid: null }, "supervisor");
|
|
76
|
+
const claimed = ledger.claimNextWake(clock.now().toISOString(), "2030-01-01T00:01:00.000Z", "lease");
|
|
77
|
+
if (claimed?.id !== "z")
|
|
78
|
+
throw new Error("ledger conformance: wakes are not FIFO");
|
|
79
|
+
if (first.event.ts !== clock.now().toISOString())
|
|
80
|
+
throw new Error("ledger conformance: injected clock was ignored");
|
|
81
|
+
let rejected = false;
|
|
82
|
+
try {
|
|
83
|
+
ledger.requestAction({ id: "bad", agent: "a", kind: "mock", connector: "mock", payload: {}, reason: "bad", evidence: [999_999], gated: false, status: "requested", reconciledAt: null, externalRef: null, auditAdvice: null, adviceAcked: false }, "a");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
rejected = true;
|
|
87
|
+
}
|
|
88
|
+
if (!rejected)
|
|
89
|
+
throw new Error("ledger conformance: nonexistent evidence was accepted");
|
|
90
|
+
const before = JSON.stringify({ goals: ledger.goals(), wakes: ledger.wakes() });
|
|
91
|
+
ledger.rebuildProjections();
|
|
92
|
+
if (JSON.stringify({ goals: ledger.goals(), wakes: ledger.wakes() }) !== before)
|
|
93
|
+
throw new Error("ledger conformance: projection replay changed state");
|
|
94
|
+
ledger.close();
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-connector-worker.d.ts","sourceRoot":"","sources":["../src/mock-connector-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
const statePath = process.env.GOAH_MOCK_CONNECTOR_STATE;
|
|
4
|
+
if (!statePath)
|
|
5
|
+
throw new Error("GOAH_MOCK_CONNECTOR_STATE is required");
|
|
6
|
+
const input = createInterface({ input: process.stdin });
|
|
7
|
+
for await (const line of input) {
|
|
8
|
+
const request = JSON.parse(line);
|
|
9
|
+
const state = JSON.parse(readFileSync(statePath, "utf8"));
|
|
10
|
+
if (request.operation === "dispatch") {
|
|
11
|
+
if (!state.dispatched.includes(request.action.id))
|
|
12
|
+
state.dispatched.push(request.action.id);
|
|
13
|
+
if (state.failAfterEffect) {
|
|
14
|
+
state.failAfterEffect = false;
|
|
15
|
+
writeFileSync(statePath, JSON.stringify(state));
|
|
16
|
+
process.stderr.write("injected connector crash after side effect\n");
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
writeFileSync(statePath, JSON.stringify(state));
|
|
21
|
+
process.stdout.write(JSON.stringify({ status: "confirmed", externalRef: `mock:${request.action.id}` }));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
process.stdout.write(JSON.stringify(state.dispatched.includes(request.action.id)
|
|
25
|
+
? { status: "confirmed", externalRef: `mock:${request.action.id}` }
|
|
26
|
+
: { status: "failed" }));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=mock-connector-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-connector-worker.js","sourceRoot":"","sources":["../src/mock-connector-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;AACxD,IAAI,CAAC,SAAS;IAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AACzE,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AACxD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgE,CAAC;IAChG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAuD,CAAC;IAChH,IAAI,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;YAC9B,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,CAAC;QACD,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1G,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE;YACnE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "goah-testkit",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.3.0",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/billc8128/goah.git",
|
|
9
|
+
"directory": "packages/testkit"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=24.0.0"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"!dist/**/*.test.*",
|
|
17
|
+
"!dist/.tsbuildinfo"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": "./dist/index.js",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"goah-ledger-contract": "0.3.0",
|
|
25
|
+
"goah-ledger-sqlite": "0.3.0",
|
|
26
|
+
"goah-runner-pi": "0.3.0",
|
|
27
|
+
"goah-supervisor": "0.3.0"
|
|
28
|
+
}
|
|
29
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goah/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,18 +22,37 @@
|
|
|
22
22
|
"main": "./dist/index.js",
|
|
23
23
|
"types": "./dist/index.d.ts",
|
|
24
24
|
"exports": {
|
|
25
|
-
".": "./dist/index.js"
|
|
25
|
+
".": "./dist/index.js",
|
|
26
|
+
"./kernel": "./dist/kernel.js",
|
|
27
|
+
"./session": "./dist/session.js",
|
|
28
|
+
"./execution": "./dist/execution.js",
|
|
29
|
+
"./metrics": "./dist/metrics.js",
|
|
30
|
+
"./sqlite": "./dist/sqlite.js",
|
|
31
|
+
"./supervisor": "./dist/supervisor.js",
|
|
32
|
+
"./runner-pi": "./dist/runner-pi.js",
|
|
33
|
+
"./testkit": "./dist/testkit.js"
|
|
26
34
|
},
|
|
27
35
|
"bin": {
|
|
28
36
|
"goah": "dist/cli.js"
|
|
29
37
|
},
|
|
30
38
|
"scripts": {
|
|
31
|
-
"prepack": "node -
|
|
39
|
+
"prepack": "node ../../scripts/prepare-single-package.mjs",
|
|
40
|
+
"postpack": "node ../../scripts/cleanup-single-package.mjs"
|
|
32
41
|
},
|
|
33
42
|
"dependencies": {
|
|
34
|
-
"goah-ledger-contract": "0.
|
|
35
|
-
"goah-ledger-sqlite": "0.
|
|
36
|
-
"goah-runner-pi": "0.
|
|
37
|
-
"goah-supervisor": "0.
|
|
38
|
-
|
|
43
|
+
"goah-ledger-contract": "0.3.0",
|
|
44
|
+
"goah-ledger-sqlite": "0.3.0",
|
|
45
|
+
"goah-runner-pi": "0.3.0",
|
|
46
|
+
"goah-supervisor": "0.3.0",
|
|
47
|
+
"goah-testkit": "0.3.0",
|
|
48
|
+
"@earendil-works/pi-agent-core": "0.84.2",
|
|
49
|
+
"@earendil-works/pi-ai": "0.84.2"
|
|
50
|
+
},
|
|
51
|
+
"bundledDependencies": [
|
|
52
|
+
"goah-ledger-contract",
|
|
53
|
+
"goah-ledger-sqlite",
|
|
54
|
+
"goah-runner-pi",
|
|
55
|
+
"goah-supervisor",
|
|
56
|
+
"goah-testkit"
|
|
57
|
+
]
|
|
39
58
|
}
|