usertrust 0.1.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 (149) hide show
  1. package/dist/audit/canonical.d.ts +7 -0
  2. package/dist/audit/canonical.d.ts.map +1 -0
  3. package/dist/audit/canonical.js +24 -0
  4. package/dist/audit/canonical.js.map +1 -0
  5. package/dist/audit/chain.d.ts +33 -0
  6. package/dist/audit/chain.d.ts.map +1 -0
  7. package/dist/audit/chain.js +285 -0
  8. package/dist/audit/chain.js.map +1 -0
  9. package/dist/audit/entropy.d.ts +95 -0
  10. package/dist/audit/entropy.d.ts.map +1 -0
  11. package/dist/audit/entropy.js +229 -0
  12. package/dist/audit/entropy.js.map +1 -0
  13. package/dist/audit/merkle.d.ts +87 -0
  14. package/dist/audit/merkle.d.ts.map +1 -0
  15. package/dist/audit/merkle.js +315 -0
  16. package/dist/audit/merkle.js.map +1 -0
  17. package/dist/audit/rotation.d.ts +61 -0
  18. package/dist/audit/rotation.d.ts.map +1 -0
  19. package/dist/audit/rotation.js +160 -0
  20. package/dist/audit/rotation.js.map +1 -0
  21. package/dist/audit/verify.d.ts +20 -0
  22. package/dist/audit/verify.d.ts.map +1 -0
  23. package/dist/audit/verify.js +73 -0
  24. package/dist/audit/verify.js.map +1 -0
  25. package/dist/board/board.d.ts +67 -0
  26. package/dist/board/board.d.ts.map +1 -0
  27. package/dist/board/board.js +191 -0
  28. package/dist/board/board.js.map +1 -0
  29. package/dist/board/concerns.d.ts +59 -0
  30. package/dist/board/concerns.d.ts.map +1 -0
  31. package/dist/board/concerns.js +149 -0
  32. package/dist/board/concerns.js.map +1 -0
  33. package/dist/board/director.d.ts +49 -0
  34. package/dist/board/director.d.ts.map +1 -0
  35. package/dist/board/director.js +127 -0
  36. package/dist/board/director.js.map +1 -0
  37. package/dist/cli/health.d.ts +8 -0
  38. package/dist/cli/health.d.ts.map +1 -0
  39. package/dist/cli/health.js +119 -0
  40. package/dist/cli/health.js.map +1 -0
  41. package/dist/cli/init.d.ts +8 -0
  42. package/dist/cli/init.d.ts.map +1 -0
  43. package/dist/cli/init.js +67 -0
  44. package/dist/cli/init.js.map +1 -0
  45. package/dist/cli/inspect.d.ts +8 -0
  46. package/dist/cli/inspect.d.ts.map +1 -0
  47. package/dist/cli/inspect.js +114 -0
  48. package/dist/cli/inspect.js.map +1 -0
  49. package/dist/cli/main.d.ts +3 -0
  50. package/dist/cli/main.d.ts.map +1 -0
  51. package/dist/cli/main.js +35 -0
  52. package/dist/cli/main.js.map +1 -0
  53. package/dist/cli/snapshot.d.ts +10 -0
  54. package/dist/cli/snapshot.d.ts.map +1 -0
  55. package/dist/cli/snapshot.js +61 -0
  56. package/dist/cli/snapshot.js.map +1 -0
  57. package/dist/cli/tb.d.ts +8 -0
  58. package/dist/cli/tb.d.ts.map +1 -0
  59. package/dist/cli/tb.js +43 -0
  60. package/dist/cli/tb.js.map +1 -0
  61. package/dist/cli/verify.d.ts +7 -0
  62. package/dist/cli/verify.d.ts.map +1 -0
  63. package/dist/cli/verify.js +32 -0
  64. package/dist/cli/verify.js.map +1 -0
  65. package/dist/config.d.ts +12 -0
  66. package/dist/config.d.ts.map +1 -0
  67. package/dist/config.js +34 -0
  68. package/dist/config.js.map +1 -0
  69. package/dist/detect.d.ts +18 -0
  70. package/dist/detect.d.ts.map +1 -0
  71. package/dist/detect.js +49 -0
  72. package/dist/detect.js.map +1 -0
  73. package/dist/govern.d.ts +75 -0
  74. package/dist/govern.d.ts.map +1 -0
  75. package/dist/govern.js +581 -0
  76. package/dist/govern.js.map +1 -0
  77. package/dist/index.d.ts +6 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +8 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/ledger/client.d.ts +89 -0
  82. package/dist/ledger/client.d.ts.map +1 -0
  83. package/dist/ledger/client.js +417 -0
  84. package/dist/ledger/client.js.map +1 -0
  85. package/dist/ledger/engine.d.ts +68 -0
  86. package/dist/ledger/engine.d.ts.map +1 -0
  87. package/dist/ledger/engine.js +142 -0
  88. package/dist/ledger/engine.js.map +1 -0
  89. package/dist/ledger/pricing.d.ts +35 -0
  90. package/dist/ledger/pricing.d.ts.map +1 -0
  91. package/dist/ledger/pricing.js +142 -0
  92. package/dist/ledger/pricing.js.map +1 -0
  93. package/dist/memory/patterns.d.ts +35 -0
  94. package/dist/memory/patterns.d.ts.map +1 -0
  95. package/dist/memory/patterns.js +152 -0
  96. package/dist/memory/patterns.js.map +1 -0
  97. package/dist/policy/decay.d.ts +95 -0
  98. package/dist/policy/decay.d.ts.map +1 -0
  99. package/dist/policy/decay.js +133 -0
  100. package/dist/policy/decay.js.map +1 -0
  101. package/dist/policy/default-rules.d.ts +21 -0
  102. package/dist/policy/default-rules.d.ts.map +1 -0
  103. package/dist/policy/default-rules.js +60 -0
  104. package/dist/policy/default-rules.js.map +1 -0
  105. package/dist/policy/gate.d.ts +116 -0
  106. package/dist/policy/gate.d.ts.map +1 -0
  107. package/dist/policy/gate.js +227 -0
  108. package/dist/policy/gate.js.map +1 -0
  109. package/dist/policy/pii.d.ts +28 -0
  110. package/dist/policy/pii.d.ts.map +1 -0
  111. package/dist/policy/pii.js +124 -0
  112. package/dist/policy/pii.js.map +1 -0
  113. package/dist/proxy.d.ts +33 -0
  114. package/dist/proxy.d.ts.map +1 -0
  115. package/dist/proxy.js +36 -0
  116. package/dist/proxy.js.map +1 -0
  117. package/dist/resilience/circuit.d.ts +87 -0
  118. package/dist/resilience/circuit.d.ts.map +1 -0
  119. package/dist/resilience/circuit.js +167 -0
  120. package/dist/resilience/circuit.js.map +1 -0
  121. package/dist/resilience/scope.d.ts +97 -0
  122. package/dist/resilience/scope.d.ts.map +1 -0
  123. package/dist/resilience/scope.js +244 -0
  124. package/dist/resilience/scope.js.map +1 -0
  125. package/dist/shared/constants.d.ts +7 -0
  126. package/dist/shared/constants.d.ts.map +1 -0
  127. package/dist/shared/constants.js +7 -0
  128. package/dist/shared/constants.js.map +1 -0
  129. package/dist/shared/errors.d.ts +31 -0
  130. package/dist/shared/errors.d.ts.map +1 -0
  131. package/dist/shared/errors.js +61 -0
  132. package/dist/shared/errors.js.map +1 -0
  133. package/dist/shared/ids.d.ts +7 -0
  134. package/dist/shared/ids.d.ts.map +1 -0
  135. package/dist/shared/ids.js +31 -0
  136. package/dist/shared/ids.js.map +1 -0
  137. package/dist/shared/types.d.ts +162 -0
  138. package/dist/shared/types.d.ts.map +1 -0
  139. package/dist/shared/types.js +41 -0
  140. package/dist/shared/types.js.map +1 -0
  141. package/dist/snapshot/checkpoint.d.ts +22 -0
  142. package/dist/snapshot/checkpoint.d.ts.map +1 -0
  143. package/dist/snapshot/checkpoint.js +172 -0
  144. package/dist/snapshot/checkpoint.js.map +1 -0
  145. package/dist/streaming.d.ts +44 -0
  146. package/dist/streaming.d.ts.map +1 -0
  147. package/dist/streaming.js +123 -0
  148. package/dist/streaming.js.map +1 -0
  149. package/package.json +54 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * CLI: usertrust inspect — Show governance bank statement
3
+ *
4
+ * Reads vault state and displays balance, audit chain stats,
5
+ * recent transactions, and Merkle root in a formatted table.
6
+ */
7
+ import { existsSync, readFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { buildMerkleTree } from "../audit/merkle.js";
10
+ import { verifyChain } from "../audit/verify.js";
11
+ import { VAULT_DIR } from "../shared/constants.js";
12
+ function loadConfig(vaultPath) {
13
+ const configPath = join(vaultPath, "usertrust.config.json");
14
+ if (!existsSync(configPath)) {
15
+ return { budget: 0 };
16
+ }
17
+ try {
18
+ const raw = readFileSync(configPath, "utf-8");
19
+ const config = JSON.parse(raw);
20
+ return { budget: typeof config.budget === "number" ? config.budget : 0 };
21
+ }
22
+ catch {
23
+ return { budget: 0 };
24
+ }
25
+ }
26
+ function loadEvents(vaultPath) {
27
+ const logPath = join(vaultPath, "audit", "events.jsonl");
28
+ if (!existsSync(logPath))
29
+ return [];
30
+ try {
31
+ const content = readFileSync(logPath, "utf-8").trim();
32
+ if (!content)
33
+ return [];
34
+ return content
35
+ .split("\n")
36
+ .filter((l) => l.trim())
37
+ .map((line) => JSON.parse(line));
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ }
43
+ function computeSpent(events) {
44
+ let spent = 0;
45
+ for (const e of events) {
46
+ if (e.kind !== "llm_call")
47
+ continue;
48
+ const cost = e.data.cost;
49
+ if (typeof cost === "number") {
50
+ spent += cost;
51
+ }
52
+ }
53
+ return spent;
54
+ }
55
+ function formatTime(timestamp) {
56
+ try {
57
+ const d = new Date(timestamp);
58
+ return d.toTimeString().slice(0, 8);
59
+ }
60
+ catch {
61
+ return "??:??:??";
62
+ }
63
+ }
64
+ function padRight(s, len) {
65
+ return s.length >= len ? s.slice(0, len) : s + " ".repeat(len - s.length);
66
+ }
67
+ function padLeft(s, len) {
68
+ return s.length >= len ? s.slice(0, len) : " ".repeat(len - s.length) + s;
69
+ }
70
+ export async function run(rootDir) {
71
+ const root = rootDir ?? process.cwd();
72
+ const vaultPath = join(root, VAULT_DIR);
73
+ if (!existsSync(vaultPath)) {
74
+ console.log("No governance vault found. Run `usertrust init` first.");
75
+ return;
76
+ }
77
+ const config = loadConfig(vaultPath);
78
+ const events = loadEvents(vaultPath);
79
+ const spent = computeSpent(events);
80
+ const remaining = config.budget - spent;
81
+ const pct = config.budget > 0 ? ((remaining / config.budget) * 100).toFixed(1) : "0.0";
82
+ // Verify chain
83
+ const logPath = join(vaultPath, "audit", "events.jsonl");
84
+ const verification = verifyChain(logPath);
85
+ // Build Merkle tree from event hashes
86
+ const eventHashes = events.map((e) => e.hash);
87
+ const { root: merkleRoot } = buildMerkleTree(eventHashes);
88
+ const integrityLabel = verification.valid ? "SHA-256 verified" : "INTEGRITY FAILURE";
89
+ // Header
90
+ console.log("+--------------------------------------------------------------+");
91
+ console.log(`| * usertrust governance vault${" ".repeat(32)}|`);
92
+ console.log(`${`| Budget: ${remaining.toLocaleString()} / ${config.budget.toLocaleString()} UT remaining (${pct}%)`.padEnd(63)}|`);
93
+ console.log(`${`| Chain: ${verification.eventsVerified} events | Integrity: ${integrityLabel}`.padEnd(63)}|`);
94
+ if (merkleRoot) {
95
+ console.log(`${`| Merkle root: ${merkleRoot.slice(0, 16)}...`.padEnd(63)}|`);
96
+ }
97
+ console.log("+----------+--------------+--------+---------------------------+");
98
+ console.log("| Time | Model | Cost | Receipt |");
99
+ console.log("+----------+--------------+--------+---------------------------+");
100
+ // Show last 10 transactions
101
+ const recent = events.slice(-10).reverse();
102
+ for (const e of recent) {
103
+ const time = formatTime(e.timestamp);
104
+ const model = typeof e.data.model === "string" ? e.data.model : "unknown";
105
+ const cost = typeof e.data.cost === "number" ? `${e.data.cost} UT` : "—";
106
+ const receipt = typeof e.data.transferId === "string" ? e.data.transferId : e.id.slice(0, 20);
107
+ console.log(`| ${padRight(time, 8)} | ${padRight(model, 12)} | ${padLeft(cost, 6)} | ${padRight(receipt, 25)} |`);
108
+ }
109
+ if (recent.length === 0) {
110
+ console.log(`| ${padRight("No transactions recorded", 58)} |`);
111
+ }
112
+ console.log("+----------+--------------+--------+---------------------------+");
113
+ }
114
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/cli/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ const command = process.argv[2];
3
+ switch (command) {
4
+ case "init":
5
+ await import("./init.js").then((m) => m.run());
6
+ break;
7
+ case "inspect":
8
+ await import("./inspect.js").then((m) => m.run());
9
+ break;
10
+ case "health":
11
+ await import("./health.js").then((m) => m.run());
12
+ break;
13
+ case "verify":
14
+ await import("./verify.js").then((m) => m.run());
15
+ break;
16
+ case "snapshot":
17
+ await import("./snapshot.js").then((m) => m.run());
18
+ break;
19
+ case "tb":
20
+ await import("./tb.js").then((m) => m.run());
21
+ break;
22
+ default:
23
+ console.log(`Usage: usertrust <command>
24
+
25
+ Commands:
26
+ init Initialize governance vault
27
+ inspect Show governance bank statement
28
+ health Show entropy diagnostics
29
+ verify Verify audit chain integrity
30
+ snapshot Create/restore vault snapshots
31
+ tb Manage TigerBeetle process`);
32
+ break;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,QAAQ,OAAO,EAAE,CAAC;IACjB,KAAK,MAAM;QACV,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM;IACP,KAAK,SAAS;QACb,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM;IACP,KAAK,QAAQ;QACZ,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM;IACP,KAAK,QAAQ;QACZ,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACjD,MAAM;IACP,KAAK,UAAU;QACd,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM;IACP,KAAK,IAAI;QACR,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7C,MAAM;IACP;QACC,OAAO,CAAC,GAAG,CAAC;;;;;;;;wCAQ0B,CAAC,CAAC;QACxC,MAAM;AACR,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI: usertrust snapshot — Create/restore/list vault snapshots
3
+ *
4
+ * Wraps checkpoint.ts for snapshot management:
5
+ * usertrust snapshot create <name>
6
+ * usertrust snapshot restore <name>
7
+ * usertrust snapshot list
8
+ */
9
+ export declare function run(rootDir?: string): Promise<void>;
10
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/cli/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDzD"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * CLI: usertrust snapshot — Create/restore/list vault snapshots
3
+ *
4
+ * Wraps checkpoint.ts for snapshot management:
5
+ * usertrust snapshot create <name>
6
+ * usertrust snapshot restore <name>
7
+ * usertrust snapshot list
8
+ */
9
+ import { existsSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ import { VAULT_DIR } from "../shared/constants.js";
12
+ import { createSnapshot, listSnapshots, restoreSnapshot } from "../snapshot/checkpoint.js";
13
+ export async function run(rootDir) {
14
+ const root = rootDir ?? process.cwd();
15
+ const vaultPath = join(root, VAULT_DIR);
16
+ if (!existsSync(vaultPath)) {
17
+ console.log("No governance vault found. Run `usertrust init` first.");
18
+ return;
19
+ }
20
+ const subcommand = rootDir !== undefined ? process.argv[3] : process.argv[3];
21
+ const name = process.argv[4];
22
+ switch (subcommand) {
23
+ case "create": {
24
+ if (!name) {
25
+ console.log("Usage: usertrust snapshot create <name>");
26
+ return;
27
+ }
28
+ const meta = await createSnapshot(vaultPath, name);
29
+ console.log(`Snapshot created: ${meta.name}`);
30
+ console.log(` Files: ${meta.files.length}`);
31
+ console.log(` Size: ${meta.size} bytes`);
32
+ console.log(` Timestamp: ${meta.timestamp}`);
33
+ break;
34
+ }
35
+ case "restore": {
36
+ if (!name) {
37
+ console.log("Usage: usertrust snapshot restore <name>");
38
+ return;
39
+ }
40
+ await restoreSnapshot(vaultPath, name);
41
+ console.log(`Snapshot restored: ${name}`);
42
+ break;
43
+ }
44
+ case "list": {
45
+ const snapshots = await listSnapshots(vaultPath);
46
+ if (snapshots.length === 0) {
47
+ console.log("No snapshots found.");
48
+ return;
49
+ }
50
+ console.log("Snapshots:");
51
+ for (const s of snapshots) {
52
+ console.log(` ${s.name} (${s.files.length} files, ${s.size} bytes, ${s.timestamp})`);
53
+ }
54
+ break;
55
+ }
56
+ default:
57
+ console.log("Usage: usertrust snapshot <create|restore|list> [name]");
58
+ break;
59
+ }
60
+ }
61
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/cli/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE3F,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAgB;IACzC,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACR,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE7B,QAAQ,UAAU,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBACvD,OAAO;YACR,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9C,MAAM;QACP,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;gBACxD,OAAO;YACR,CAAC;YACD,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM;QACP,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBACnC,OAAO;YACR,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YACxF,CAAC;YACD,MAAM;QACP,CAAC;QAED;YACC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACtE,MAAM;IACR,CAAC;AACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CLI: usertrust tb — TigerBeetle process management (stubs)
3
+ *
4
+ * v1 stubs: prints helpful setup messages. Future versions will
5
+ * manage the embedded TigerBeetle process lifecycle.
6
+ */
7
+ export declare function run(): Promise<void>;
8
+ //# sourceMappingURL=tb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tb.d.ts","sourceRoot":"","sources":["../../src/cli/tb.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAwCzC"}
package/dist/cli/tb.js ADDED
@@ -0,0 +1,43 @@
1
+ /**
2
+ * CLI: usertrust tb — TigerBeetle process management (stubs)
3
+ *
4
+ * v1 stubs: prints helpful setup messages. Future versions will
5
+ * manage the embedded TigerBeetle process lifecycle.
6
+ */
7
+ export async function run() {
8
+ const subcommand = process.argv[3];
9
+ switch (subcommand) {
10
+ case "start":
11
+ console.log("TigerBeetle start — not yet implemented.");
12
+ console.log("To run TigerBeetle manually:");
13
+ console.log(" tigerbeetle start --addresses=3000 --cache-grid=256MiB ./data/0_0.tigerbeetle");
14
+ break;
15
+ case "stop":
16
+ console.log("TigerBeetle stop — not yet implemented.");
17
+ console.log("To stop TigerBeetle manually:");
18
+ console.log(" kill $(pgrep tigerbeetle)");
19
+ break;
20
+ case "status": {
21
+ let isRunning = false;
22
+ try {
23
+ const { execSync } = await import("node:child_process");
24
+ const result = execSync("pgrep tigerbeetle", { encoding: "utf-8" }).trim();
25
+ isRunning = result.length > 0;
26
+ }
27
+ catch {
28
+ isRunning = false;
29
+ }
30
+ if (isRunning) {
31
+ console.log("TigerBeetle: running");
32
+ }
33
+ else {
34
+ console.log("TigerBeetle: not running");
35
+ }
36
+ break;
37
+ }
38
+ default:
39
+ console.log("Usage: usertrust tb <start|stop|status>");
40
+ break;
41
+ }
42
+ }
43
+ //# sourceMappingURL=tb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tb.js","sourceRoot":"","sources":["../../src/cli/tb.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,KAAK,UAAU,GAAG;IACxB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnC,QAAQ,UAAU,EAAE,CAAC;QACpB,KAAK,OAAO;YACX,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CACV,iFAAiF,CACjF,CAAC;YACF,MAAM;QAEP,KAAK,MAAM;YACV,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,MAAM;QAEP,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC;gBACJ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3E,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACR,SAAS,GAAG,KAAK,CAAC;YACnB,CAAC;YAED,IAAI,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACzC,CAAC;YACD,MAAM;QACP,CAAC;QAED;YACC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,MAAM;IACR,CAAC;AACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI: usertrust verify — Verify audit chain integrity
3
+ *
4
+ * Calls verifyChain() on the local vault's audit log and displays the result.
5
+ */
6
+ export declare function run(rootDir?: string): Promise<void>;
7
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBzD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * CLI: usertrust verify — Verify audit chain integrity
3
+ *
4
+ * Calls verifyChain() on the local vault's audit log and displays the result.
5
+ */
6
+ import { existsSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { verifyChain } from "../audit/verify.js";
9
+ import { VAULT_DIR } from "../shared/constants.js";
10
+ export async function run(rootDir) {
11
+ const root = rootDir ?? process.cwd();
12
+ const vaultPath = join(root, VAULT_DIR);
13
+ if (!existsSync(vaultPath)) {
14
+ console.log("No governance vault found. Run `usertrust init` first.");
15
+ return;
16
+ }
17
+ const logPath = join(vaultPath, "audit", "events.jsonl");
18
+ const result = verifyChain(logPath);
19
+ if (result.valid) {
20
+ console.log(`Chain verified: ${result.eventsVerified} events, all hashes valid.`);
21
+ console.log(`Latest hash: ${result.latestHash}`);
22
+ }
23
+ else {
24
+ console.log(`Chain verification FAILED: ${result.errors.length} error(s) found.`);
25
+ console.log(`Events checked: ${result.eventsVerified}`);
26
+ for (const err of result.errors) {
27
+ console.log(` - ${err}`);
28
+ }
29
+ }
30
+ console.log(`Verified at: ${result.verifiedAt}`);
31
+ }
32
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAgB;IACzC,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,cAAc,4BAA4B,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,MAAM,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACxD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { TrustConfig } from "./shared/types.js";
2
+ /**
3
+ * Load trust config from `.usertrust/usertrust.config.json`, merged with
4
+ * optional runtime overrides. Returns a validated TrustConfig.
5
+ *
6
+ * @param overrides - Optional partial config to merge on top of file values
7
+ * @param vaultBase - Base directory containing the `.usertrust` vault (default: cwd)
8
+ */
9
+ export declare function loadConfig(overrides?: Partial<TrustConfig>, vaultBase?: string): Promise<TrustConfig>;
10
+ /** Identity function for TypeScript config intellisense. */
11
+ export declare function defineConfig(config: TrustConfig): TrustConfig;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
package/dist/config.js ADDED
@@ -0,0 +1,34 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { VAULT_DIR } from "./shared/constants.js";
5
+ import { TrustConfigSchema } from "./shared/types.js";
6
+ /**
7
+ * Load trust config from `.usertrust/usertrust.config.json`, merged with
8
+ * optional runtime overrides. Returns a validated TrustConfig.
9
+ *
10
+ * @param overrides - Optional partial config to merge on top of file values
11
+ * @param vaultBase - Base directory containing the `.usertrust` vault (default: cwd)
12
+ */
13
+ export async function loadConfig(overrides, vaultBase) {
14
+ const base = vaultBase ?? process.cwd();
15
+ const configPath = join(base, VAULT_DIR, "usertrust.config.json");
16
+ let raw = {};
17
+ if (existsSync(configPath)) {
18
+ raw = JSON.parse(await readFile(configPath, "utf-8"));
19
+ }
20
+ const merged = { ...raw };
21
+ if (overrides) {
22
+ for (const [key, val] of Object.entries(overrides)) {
23
+ if (val !== undefined) {
24
+ merged[key] = val;
25
+ }
26
+ }
27
+ }
28
+ return TrustConfigSchema.parse(merged);
29
+ }
30
+ /** Identity function for TypeScript config intellisense. */
31
+ export function defineConfig(config) {
32
+ return TrustConfigSchema.parse(config);
33
+ }
34
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,SAAgC,EAChC,SAAkB;IAElB,MAAM,IAAI,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAClE,IAAI,GAAG,GAA4B,EAAE,CAAC;IACtC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAA4B,CAAC;IAClF,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1B,IAAI,SAAS,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,MAAkC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAChD,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC/C,OAAO,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * LLM Client Detection — duck typing for Anthropic, OpenAI, and Google SDKs.
3
+ *
4
+ * Uses structural checks (duck typing) to identify which SDK a client object
5
+ * belongs to, without requiring the SDK packages as dependencies.
6
+ */
7
+ import type { LLMClientKind } from "./shared/types.js";
8
+ /**
9
+ * Detect which LLM SDK a client belongs to by inspecting its shape.
10
+ *
11
+ * - Anthropic: `client.messages.create()`
12
+ * - OpenAI: `client.chat.completions.create()`
13
+ * - Google: `client.models.generateContent()`
14
+ *
15
+ * @throws {Error} if the client does not match any known SDK shape
16
+ */
17
+ export declare function detectClientKind(client: unknown): LLMClientKind;
18
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAyC/D"}
package/dist/detect.js ADDED
@@ -0,0 +1,49 @@
1
+ /**
2
+ * LLM Client Detection — duck typing for Anthropic, OpenAI, and Google SDKs.
3
+ *
4
+ * Uses structural checks (duck typing) to identify which SDK a client object
5
+ * belongs to, without requiring the SDK packages as dependencies.
6
+ */
7
+ /**
8
+ * Detect which LLM SDK a client belongs to by inspecting its shape.
9
+ *
10
+ * - Anthropic: `client.messages.create()`
11
+ * - OpenAI: `client.chat.completions.create()`
12
+ * - Google: `client.models.generateContent()`
13
+ *
14
+ * @throws {Error} if the client does not match any known SDK shape
15
+ */
16
+ export function detectClientKind(client) {
17
+ if (client != null &&
18
+ typeof client === "object" &&
19
+ "messages" in client &&
20
+ client.messages != null &&
21
+ typeof client.messages === "object" &&
22
+ "create" in client.messages &&
23
+ typeof client.messages.create === "function") {
24
+ return "anthropic";
25
+ }
26
+ if (client != null &&
27
+ typeof client === "object" &&
28
+ "chat" in client &&
29
+ client.chat != null &&
30
+ typeof client.chat === "object" &&
31
+ "completions" in client.chat &&
32
+ client.chat.completions != null &&
33
+ typeof client.chat.completions === "object" &&
34
+ "create" in client.chat.completions &&
35
+ typeof client.chat.completions.create === "function") {
36
+ return "openai";
37
+ }
38
+ if (client != null &&
39
+ typeof client === "object" &&
40
+ "models" in client &&
41
+ client.models != null &&
42
+ typeof client.models === "object" &&
43
+ "generateContent" in client.models &&
44
+ typeof client.models.generateContent === "function") {
45
+ return "google";
46
+ }
47
+ throw new Error("Unsupported LLM client: could not detect Anthropic, OpenAI, or Google SDK");
48
+ }
49
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC/C,IACC,MAAM,IAAI,IAAI;QACd,OAAO,MAAM,KAAK,QAAQ;QAC1B,UAAU,IAAI,MAAM;QACpB,MAAM,CAAC,QAAQ,IAAI,IAAI;QACvB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,QAAQ,IAAI,MAAM,CAAC,QAAQ;QAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,EAC3C,CAAC;QACF,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,IACC,MAAM,IAAI,IAAI;QACd,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,IAAI,MAAM;QAChB,MAAM,CAAC,IAAI,IAAI,IAAI;QACnB,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,aAAa,IAAI,MAAM,CAAC,IAAI;QAC5B,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ;QAC3C,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW;QACnC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,UAAU,EACnD,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,IACC,MAAM,IAAI,IAAI;QACd,OAAO,MAAM,KAAK,QAAQ;QAC1B,QAAQ,IAAI,MAAM;QAClB,MAAM,CAAC,MAAM,IAAI,IAAI;QACrB,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACjC,iBAAiB,IAAI,MAAM,CAAC,MAAM;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,KAAK,UAAU,EAClD,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * trust() — Two-Phase Lifecycle Wrapper
3
+ *
4
+ * The convergence point of the usertrust SDK. Wires together:
5
+ * - LLM client detection (duck typing)
6
+ * - TigerBeetle ledger (PENDING → POST/VOID)
7
+ * - SHA-256 hash-chained audit trail
8
+ * - Policy gate (12-operator rule engine)
9
+ * - PII detection
10
+ * - Circuit breaker (per-provider)
11
+ * - Pattern memory (prompt hashing)
12
+ * - Proxy mode (remote governance)
13
+ *
14
+ * Failure modes (Spec Section 15):
15
+ * 15.1 — LLM succeeds, POST fails → settled: false, settlement_ambiguous audit
16
+ * 15.2 — LLM fails (retryable) → void pending hold, propagate error
17
+ * 15.3 — Audit write fails after POST → auditDegraded flag, still return response
18
+ * 15.4 — TigerBeetle unreachable → LedgerUnavailableError, do NOT forward
19
+ *
20
+ * Usage:
21
+ * ```ts
22
+ * const client = await trust(new Anthropic(), { dryRun: true, budget: 50_000 });
23
+ * const { response, governance } = await client.messages.create({ ... });
24
+ * await client.destroy();
25
+ * ```
26
+ */
27
+ import { type AuditWriter } from "./audit/chain.js";
28
+ export interface TrustOpts {
29
+ /** Path to usertrust.config.json. Defaults to `.usertrust/usertrust.config.json`. */
30
+ configPath?: string;
31
+ /** Remote proxy URL. When set, receipts include a verify URL. */
32
+ proxy?: string;
33
+ /** API key for the proxy. */
34
+ key?: string;
35
+ /** Token budget override. */
36
+ budget?: number;
37
+ /** Tier override. */
38
+ tier?: string;
39
+ /**
40
+ * Dry-run mode — skips TigerBeetle, audit-chain-only.
41
+ * Also enabled by USERTRUST_DRY_RUN=true env var.
42
+ */
43
+ dryRun?: boolean;
44
+ /** Vault directory override (default: cwd). */
45
+ vaultBase?: string;
46
+ /**
47
+ * Inject a mock/test engine. When set, used instead of TigerBeetle.
48
+ * Primarily for testing failure modes.
49
+ * @internal
50
+ */
51
+ _engine?: TrustEngine | null;
52
+ /**
53
+ * Inject a mock/test audit writer. When set, used instead of real audit.
54
+ * @internal
55
+ */
56
+ _audit?: AuditWriter;
57
+ }
58
+ /** Minimal engine interface for two-phase spend lifecycle. */
59
+ export interface TrustEngine {
60
+ spendPending(params: {
61
+ transferId: string;
62
+ amount: number;
63
+ }): Promise<{
64
+ transferId: string;
65
+ }>;
66
+ postPendingSpend(transferId: string): Promise<void>;
67
+ voidPendingSpend(transferId: string): Promise<void>;
68
+ destroy?(): void;
69
+ }
70
+ /** The governed client: original client shape + `destroy()`. */
71
+ export type GovernedClient<T> = T & {
72
+ destroy(): Promise<void>;
73
+ };
74
+ export declare function trust<T>(client: T, opts?: TrustOpts): Promise<GovernedClient<T>>;
75
+ //# sourceMappingURL=govern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"govern.d.ts","sourceRoot":"","sources":["../src/govern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAyBvE,MAAM,WAAW,SAAS;IACzB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC3B,YAAY,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,IAAI,CAAC;CACjB;AAED,gEAAgE;AAChE,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAIjE,wBAAsB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAyctF"}