@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.
Files changed (112) hide show
  1. package/dist/cli.js +1 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/execution.d.ts +2 -0
  4. package/dist/execution.d.ts.map +1 -0
  5. package/dist/execution.js +2 -0
  6. package/dist/execution.js.map +1 -0
  7. package/dist/index.d.ts +3 -2
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +8 -8
  10. package/dist/index.js.map +1 -1
  11. package/dist/kernel.d.ts +2 -0
  12. package/dist/kernel.d.ts.map +1 -0
  13. package/dist/kernel.js +2 -0
  14. package/dist/kernel.js.map +1 -0
  15. package/dist/metrics.d.ts +2 -0
  16. package/dist/metrics.d.ts.map +1 -0
  17. package/dist/metrics.js +2 -0
  18. package/dist/metrics.js.map +1 -0
  19. package/dist/runner-pi.d.ts +2 -0
  20. package/dist/runner-pi.d.ts.map +1 -0
  21. package/dist/runner-pi.js +2 -0
  22. package/dist/runner-pi.js.map +1 -0
  23. package/dist/session.d.ts +2 -0
  24. package/dist/session.d.ts.map +1 -0
  25. package/dist/session.js +2 -0
  26. package/dist/session.js.map +1 -0
  27. package/dist/sqlite.d.ts +2 -0
  28. package/dist/sqlite.d.ts.map +1 -0
  29. package/dist/sqlite.js +2 -0
  30. package/dist/sqlite.js.map +1 -0
  31. package/dist/supervisor.d.ts +2 -0
  32. package/dist/supervisor.d.ts.map +1 -0
  33. package/dist/supervisor.js +2 -0
  34. package/dist/supervisor.js.map +1 -0
  35. package/dist/testkit.d.ts +2 -0
  36. package/dist/testkit.d.ts.map +1 -0
  37. package/dist/testkit.js +2 -0
  38. package/dist/testkit.js.map +1 -0
  39. package/node_modules/goah-ledger-contract/dist/execution.d.ts +205 -0
  40. package/node_modules/goah-ledger-contract/dist/execution.d.ts.map +1 -0
  41. package/node_modules/goah-ledger-contract/dist/execution.js +18 -0
  42. package/node_modules/goah-ledger-contract/dist/execution.js.map +1 -0
  43. package/node_modules/goah-ledger-contract/dist/index.d.ts +5 -0
  44. package/node_modules/goah-ledger-contract/dist/index.d.ts.map +1 -0
  45. package/node_modules/goah-ledger-contract/dist/index.js +5 -0
  46. package/node_modules/goah-ledger-contract/dist/index.js.map +1 -0
  47. package/node_modules/goah-ledger-contract/dist/kernel.d.ts +33 -0
  48. package/node_modules/goah-ledger-contract/dist/kernel.d.ts.map +1 -0
  49. package/node_modules/goah-ledger-contract/dist/kernel.js +6 -0
  50. package/node_modules/goah-ledger-contract/dist/kernel.js.map +1 -0
  51. package/node_modules/goah-ledger-contract/dist/metrics.d.ts +40 -0
  52. package/node_modules/goah-ledger-contract/dist/metrics.d.ts.map +1 -0
  53. package/node_modules/goah-ledger-contract/dist/metrics.js +25 -0
  54. package/node_modules/goah-ledger-contract/dist/metrics.js.map +1 -0
  55. package/node_modules/goah-ledger-contract/dist/session.d.ts +37 -0
  56. package/node_modules/goah-ledger-contract/dist/session.d.ts.map +1 -0
  57. package/node_modules/goah-ledger-contract/dist/session.js +53 -0
  58. package/node_modules/goah-ledger-contract/dist/session.js.map +1 -0
  59. package/node_modules/goah-ledger-contract/package.json +29 -0
  60. package/node_modules/goah-ledger-sqlite/dist/index.d.ts +66 -0
  61. package/node_modules/goah-ledger-sqlite/dist/index.d.ts.map +1 -0
  62. package/node_modules/goah-ledger-sqlite/dist/index.js +537 -0
  63. package/node_modules/goah-ledger-sqlite/dist/index.js.map +1 -0
  64. package/node_modules/goah-ledger-sqlite/package.json +26 -0
  65. package/node_modules/goah-runner-pi/dist/index.d.ts +53 -0
  66. package/node_modules/goah-runner-pi/dist/index.d.ts.map +1 -0
  67. package/node_modules/goah-runner-pi/dist/index.js +229 -0
  68. package/node_modules/goah-runner-pi/dist/index.js.map +1 -0
  69. package/node_modules/goah-runner-pi/dist/model-provider.d.ts +13 -0
  70. package/node_modules/goah-runner-pi/dist/model-provider.d.ts.map +1 -0
  71. package/node_modules/goah-runner-pi/dist/model-provider.js +75 -0
  72. package/node_modules/goah-runner-pi/dist/model-provider.js.map +1 -0
  73. package/node_modules/goah-runner-pi/dist/pi-worker.d.ts +11 -0
  74. package/node_modules/goah-runner-pi/dist/pi-worker.d.ts.map +1 -0
  75. package/node_modules/goah-runner-pi/dist/pi-worker.js +263 -0
  76. package/node_modules/goah-runner-pi/dist/pi-worker.js.map +1 -0
  77. package/node_modules/goah-runner-pi/dist/verification-worker.d.ts +2 -0
  78. package/node_modules/goah-runner-pi/dist/verification-worker.d.ts.map +1 -0
  79. package/node_modules/goah-runner-pi/dist/verification-worker.js +48 -0
  80. package/node_modules/goah-runner-pi/dist/verification-worker.js.map +1 -0
  81. package/node_modules/goah-runner-pi/package.json +28 -0
  82. package/node_modules/goah-supervisor/dist/context-view.d.ts +21 -0
  83. package/node_modules/goah-supervisor/dist/context-view.d.ts.map +1 -0
  84. package/node_modules/goah-supervisor/dist/context-view.js +33 -0
  85. package/node_modules/goah-supervisor/dist/context-view.js.map +1 -0
  86. package/node_modules/goah-supervisor/dist/index.d.ts +54 -0
  87. package/node_modules/goah-supervisor/dist/index.d.ts.map +1 -0
  88. package/node_modules/goah-supervisor/dist/index.js +436 -0
  89. package/node_modules/goah-supervisor/dist/index.js.map +1 -0
  90. package/node_modules/goah-supervisor/dist/roles.d.ts +3 -0
  91. package/node_modules/goah-supervisor/dist/roles.d.ts.map +1 -0
  92. package/node_modules/goah-supervisor/dist/roles.js +8 -0
  93. package/node_modules/goah-supervisor/dist/roles.js.map +1 -0
  94. package/node_modules/goah-supervisor/dist/verification.d.ts +82 -0
  95. package/node_modules/goah-supervisor/dist/verification.d.ts.map +1 -0
  96. package/node_modules/goah-supervisor/dist/verification.js +110 -0
  97. package/node_modules/goah-supervisor/dist/verification.js.map +1 -0
  98. package/node_modules/goah-supervisor/package.json +26 -0
  99. package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts +2 -0
  100. package/node_modules/goah-testkit/dist/faux-runner-worker.d.ts.map +1 -0
  101. package/node_modules/goah-testkit/dist/faux-runner-worker.js +29 -0
  102. package/node_modules/goah-testkit/dist/faux-runner-worker.js.map +1 -0
  103. package/node_modules/goah-testkit/dist/index.d.ts +51 -0
  104. package/node_modules/goah-testkit/dist/index.d.ts.map +1 -0
  105. package/node_modules/goah-testkit/dist/index.js +96 -0
  106. package/node_modules/goah-testkit/dist/index.js.map +1 -0
  107. package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts +2 -0
  108. package/node_modules/goah-testkit/dist/mock-connector-worker.d.ts.map +1 -0
  109. package/node_modules/goah-testkit/dist/mock-connector-worker.js +29 -0
  110. package/node_modules/goah-testkit/dist/mock-connector-worker.js.map +1 -0
  111. package/node_modules/goah-testkit/package.json +29 -0
  112. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=faux-runner-worker.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mock-connector-worker.d.ts.map
@@ -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.2.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 -e \"require('node:fs').chmodSync('dist/cli.js', 0o755)\""
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.2.0",
35
- "goah-ledger-sqlite": "0.2.0",
36
- "goah-runner-pi": "0.2.0",
37
- "goah-supervisor": "0.2.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
  }