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,89 @@
1
+ /**
2
+ * TigerBeetle client wrapper for the usertrust SDK.
3
+ * Extracted from usertools platform — provides account/transfer CRUD
4
+ * with reconnect logic and deterministic account IDs.
5
+ */
6
+ import type { Account, Transfer } from "tigerbeetle-node";
7
+ /** Typed error carrying the numeric TB error code for structured matching. */
8
+ export declare class TBTransferError extends Error {
9
+ readonly code: number;
10
+ constructor(code: number, message: string);
11
+ }
12
+ export declare const LEDGER_USERTOKENS = 1;
13
+ export declare const CODE_USER_WALLET = 1;
14
+ export declare const CODE_PLATFORM_TREASURY = 2;
15
+ export declare const CODE_ESCROW = 3;
16
+ export declare const XFER_PURCHASE = 1;
17
+ export declare const XFER_SPEND = 2;
18
+ export declare const XFER_TRANSFER = 3;
19
+ export declare const XFER_REFUND = 4;
20
+ export declare const XFER_ALLOCATION = 5;
21
+ export declare const XFER_TOOL_CALL = 6;
22
+ export declare const XFER_A2A_DELEGATION = 7;
23
+ export interface TrustTBClientOptions {
24
+ addresses: string[];
25
+ clusterId?: bigint;
26
+ /** Optional callback invoked on connection issues (replaces sendAlert) */
27
+ onAlert?: (message: string, meta: Record<string, unknown>) => void;
28
+ }
29
+ export declare class TrustTBClient {
30
+ private client;
31
+ private accountMap;
32
+ private treasuryId;
33
+ private initialized;
34
+ private readonly startedAt;
35
+ private readonly initGraceMs;
36
+ private opts;
37
+ private onAlert?;
38
+ private healthCheckInterval;
39
+ private reconnectPromise;
40
+ constructor(opts: TrustTBClientOptions);
41
+ private isConnectionError;
42
+ reconnect(): Promise<void>;
43
+ private _doReconnect;
44
+ private withReconnect;
45
+ /**
46
+ * Derive a deterministic TigerBeetle account ID from a userId via SHA-256
47
+ * truncation. Uses 128 bits (full TB u128 space) to minimize collision risk.
48
+ */
49
+ static deriveAccountId(userId: string): bigint;
50
+ createUserWallet(userId: string): Promise<bigint>;
51
+ setTreasuryId(id: bigint): void;
52
+ createTreasury(): Promise<bigint>;
53
+ ensureEscrowAccount(label: string): Promise<bigint>;
54
+ setAccountMapping(userId: string, accountId: bigint): void;
55
+ getAccountId(userId: string): bigint;
56
+ getTreasuryId(): bigint;
57
+ createPendingTransfer(p: {
58
+ debitAccountId: bigint;
59
+ creditAccountId: bigint;
60
+ amount: number;
61
+ code: number;
62
+ timeoutSeconds?: number;
63
+ userData128?: bigint;
64
+ userData64?: bigint;
65
+ userData32?: number;
66
+ }): Promise<bigint>;
67
+ postTransfer(pendingId: bigint, amount?: number): Promise<bigint>;
68
+ voidTransfer(pendingId: bigint): Promise<bigint>;
69
+ immediateTransfer(p: {
70
+ debitAccountId: bigint;
71
+ creditAccountId: bigint;
72
+ amount: number;
73
+ code: number;
74
+ transferId?: bigint;
75
+ userData128?: bigint;
76
+ userData64?: bigint;
77
+ userData32?: number;
78
+ }): Promise<bigint>;
79
+ lookupTransfer(transferId: bigint): Promise<Transfer | null>;
80
+ lookupAccounts(accountIds: bigint[]): Promise<Account[]>;
81
+ lookupBalance(accountId: bigint): Promise<{
82
+ available: number;
83
+ pending: number;
84
+ total: number;
85
+ }>;
86
+ ping(): Promise<boolean>;
87
+ destroy(): void;
88
+ }
89
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ledger/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,417 @@
1
+ /**
2
+ * TigerBeetle client wrapper for the usertrust SDK.
3
+ * Extracted from usertools platform — provides account/transfer CRUD
4
+ * with reconnect logic and deterministic account IDs.
5
+ */
6
+ import { createHash } from "node:crypto";
7
+ import { AccountFlags, CreateAccountError, CreateTransferError, TransferFlags, amount_max, createClient, } from "tigerbeetle-node";
8
+ import { tbId } from "../shared/ids.js";
9
+ /** Typed error carrying the numeric TB error code for structured matching. */
10
+ export class TBTransferError extends Error {
11
+ code;
12
+ constructor(code, message) {
13
+ super(message);
14
+ this.code = code;
15
+ this.name = "TBTransferError";
16
+ }
17
+ }
18
+ // Ledger ID: all usertokens live on ledger 1
19
+ export const LEDGER_USERTOKENS = 1;
20
+ // Account codes
21
+ export const CODE_USER_WALLET = 1;
22
+ export const CODE_PLATFORM_TREASURY = 2;
23
+ export const CODE_ESCROW = 3;
24
+ // Transfer codes
25
+ export const XFER_PURCHASE = 1;
26
+ export const XFER_SPEND = 2;
27
+ export const XFER_TRANSFER = 3;
28
+ export const XFER_REFUND = 4;
29
+ export const XFER_ALLOCATION = 5;
30
+ export const XFER_TOOL_CALL = 6;
31
+ export const XFER_A2A_DELEGATION = 7;
32
+ export class TrustTBClient {
33
+ client;
34
+ accountMap = new Map();
35
+ treasuryId;
36
+ initialized = false;
37
+ startedAt = Date.now();
38
+ initGraceMs = 60_000;
39
+ opts;
40
+ onAlert;
41
+ healthCheckInterval = null;
42
+ reconnectPromise = null;
43
+ constructor(opts) {
44
+ this.opts = {
45
+ addresses: opts.addresses,
46
+ clusterId: opts.clusterId ?? 0n,
47
+ };
48
+ if (opts.onAlert) {
49
+ this.onAlert = opts.onAlert;
50
+ }
51
+ this.client = createClient({
52
+ cluster_id: this.opts.clusterId,
53
+ replica_addresses: this.opts.addresses,
54
+ });
55
+ this.healthCheckInterval = setInterval(() => {
56
+ this.ping().catch(() => this.reconnect().catch((err) => {
57
+ console.error("[TB] Health check reconnection failed:", err);
58
+ if (this.healthCheckInterval) {
59
+ clearInterval(this.healthCheckInterval);
60
+ this.healthCheckInterval = null;
61
+ }
62
+ const msg = "TigerBeetle health check failed — interval stopped";
63
+ const meta = { error: err instanceof Error ? err.message : String(err) };
64
+ if (this.onAlert) {
65
+ this.onAlert(msg, meta);
66
+ }
67
+ else {
68
+ console.warn(`[usertrust] ${msg}`, meta);
69
+ }
70
+ }));
71
+ }, 30_000);
72
+ }
73
+ isConnectionError(err) {
74
+ if (!(err instanceof Error))
75
+ return false;
76
+ const msg = err.message.toLowerCase();
77
+ return (msg.includes("connection refused") ||
78
+ msg.includes("econnrefused") ||
79
+ msg.includes("econnreset") ||
80
+ msg.includes("client is closed") ||
81
+ msg.includes("closed") ||
82
+ msg.includes("not connected") ||
83
+ msg.includes("socket") ||
84
+ msg.includes("timeout"));
85
+ }
86
+ async reconnect() {
87
+ if (this.reconnectPromise)
88
+ return this.reconnectPromise;
89
+ this.reconnectPromise = this._doReconnect().finally(() => {
90
+ this.reconnectPromise = null;
91
+ });
92
+ return this.reconnectPromise;
93
+ }
94
+ async _doReconnect() {
95
+ const maxRetries = 5;
96
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
97
+ try {
98
+ console.log(`[TB] Reconnection attempt ${attempt + 1}/${maxRetries}`);
99
+ try {
100
+ this.client.destroy();
101
+ }
102
+ catch {
103
+ /* ignore destroy errors */
104
+ }
105
+ this.client = createClient({
106
+ cluster_id: this.opts.clusterId,
107
+ replica_addresses: this.opts.addresses,
108
+ });
109
+ return;
110
+ }
111
+ catch (err) {
112
+ if (attempt === maxRetries - 1) {
113
+ console.error("[TB] CRITICAL: All reconnection attempts failed");
114
+ const msg = "TigerBeetle connection lost — all reconnection attempts failed";
115
+ if (this.onAlert) {
116
+ this.onAlert(msg, {});
117
+ }
118
+ else {
119
+ console.warn(`[usertrust] ${msg}`);
120
+ }
121
+ throw err;
122
+ }
123
+ const delay = 1000 * 2 ** attempt;
124
+ await new Promise((resolve) => setTimeout(resolve, delay));
125
+ }
126
+ }
127
+ }
128
+ async withReconnect(fn) {
129
+ try {
130
+ return await fn();
131
+ }
132
+ catch (err) {
133
+ if (this.isConnectionError(err)) {
134
+ await this.reconnect();
135
+ return await fn();
136
+ }
137
+ throw err;
138
+ }
139
+ }
140
+ /**
141
+ * Derive a deterministic TigerBeetle account ID from a userId via SHA-256
142
+ * truncation. Uses 128 bits (full TB u128 space) to minimize collision risk.
143
+ */
144
+ static deriveAccountId(userId) {
145
+ const hash = createHash("sha256").update(`wallet:${userId}`).digest("hex");
146
+ return BigInt(`0x${hash.slice(0, 32)}`);
147
+ }
148
+ async createUserWallet(userId) {
149
+ const existing = this.accountMap.get(userId);
150
+ if (existing)
151
+ return existing;
152
+ const accountId = TrustTBClient.deriveAccountId(userId);
153
+ const account = {
154
+ id: accountId,
155
+ debits_pending: 0n,
156
+ debits_posted: 0n,
157
+ credits_pending: 0n,
158
+ credits_posted: 0n,
159
+ user_data_128: 0n,
160
+ user_data_64: 0n,
161
+ user_data_32: 0,
162
+ reserved: 0,
163
+ ledger: LEDGER_USERTOKENS,
164
+ code: CODE_USER_WALLET,
165
+ flags: AccountFlags.debits_must_not_exceed_credits | AccountFlags.history,
166
+ timestamp: 0n,
167
+ };
168
+ const errors = await this.withReconnect(() => this.client.createAccounts([account]));
169
+ if (errors.length > 0) {
170
+ const err = errors[0];
171
+ if (!err)
172
+ throw new Error("Unknown account/transfer error");
173
+ if (err.result === CreateAccountError.exists) {
174
+ this.accountMap.set(userId, accountId);
175
+ return accountId;
176
+ }
177
+ throw new Error(`Failed to create account: ${CreateAccountError[err.result] ?? err.result}`);
178
+ }
179
+ this.accountMap.set(userId, accountId);
180
+ return accountId;
181
+ }
182
+ setTreasuryId(id) {
183
+ this.treasuryId = id;
184
+ this.initialized = true;
185
+ }
186
+ async createTreasury() {
187
+ if (this.treasuryId) {
188
+ const tid = this.treasuryId;
189
+ const accounts = await this.withReconnect(() => this.client.lookupAccounts([tid]));
190
+ if (accounts.length > 0)
191
+ return this.treasuryId;
192
+ }
193
+ const accountId = this.treasuryId ?? tbId();
194
+ const account = {
195
+ id: accountId,
196
+ debits_pending: 0n,
197
+ debits_posted: 0n,
198
+ credits_pending: 0n,
199
+ credits_posted: 0n,
200
+ user_data_128: 0n,
201
+ user_data_64: 0n,
202
+ user_data_32: 0,
203
+ reserved: 0,
204
+ ledger: LEDGER_USERTOKENS,
205
+ code: CODE_PLATFORM_TREASURY,
206
+ flags: AccountFlags.history,
207
+ timestamp: 0n,
208
+ };
209
+ const errors = await this.withReconnect(() => this.client.createAccounts([account]));
210
+ if (errors.length > 0) {
211
+ const err = errors[0];
212
+ if (!err)
213
+ throw new Error("Unknown account/transfer error");
214
+ throw new Error(`Failed to create treasury: ${CreateAccountError[err.result] ?? err.result}`);
215
+ }
216
+ this.treasuryId = accountId;
217
+ this.initialized = true;
218
+ return accountId;
219
+ }
220
+ async ensureEscrowAccount(label) {
221
+ const accountId = TrustTBClient.deriveAccountId(label);
222
+ const account = {
223
+ id: accountId,
224
+ debits_pending: 0n,
225
+ debits_posted: 0n,
226
+ credits_pending: 0n,
227
+ credits_posted: 0n,
228
+ user_data_128: 0n,
229
+ user_data_64: 0n,
230
+ user_data_32: 0,
231
+ reserved: 0,
232
+ ledger: LEDGER_USERTOKENS,
233
+ code: CODE_ESCROW,
234
+ flags: AccountFlags.history,
235
+ timestamp: 0n,
236
+ };
237
+ const errors = await this.withReconnect(() => this.client.createAccounts([account]));
238
+ if (errors.length > 0) {
239
+ const err = errors[0];
240
+ if (!err)
241
+ throw new Error("Unknown account/transfer error");
242
+ if (err.result === CreateAccountError.exists) {
243
+ return accountId;
244
+ }
245
+ throw new Error(`Failed to create escrow account: ${CreateAccountError[err.result] ?? err.result}`);
246
+ }
247
+ return accountId;
248
+ }
249
+ setAccountMapping(userId, accountId) {
250
+ this.accountMap.set(userId, accountId);
251
+ }
252
+ getAccountId(userId) {
253
+ const id = this.accountMap.get(userId);
254
+ if (!id)
255
+ throw new Error(`No TigerBeetle account for user: ${userId}`);
256
+ return id;
257
+ }
258
+ getTreasuryId() {
259
+ if (!this.treasuryId)
260
+ throw new Error("Treasury not initialized");
261
+ return this.treasuryId;
262
+ }
263
+ async createPendingTransfer(p) {
264
+ const transferId = tbId();
265
+ const transfer = {
266
+ id: transferId,
267
+ debit_account_id: p.debitAccountId,
268
+ credit_account_id: p.creditAccountId,
269
+ amount: BigInt(p.amount),
270
+ pending_id: 0n,
271
+ user_data_128: p.userData128 ?? 0n,
272
+ user_data_64: p.userData64 ?? 0n,
273
+ user_data_32: p.userData32 ?? 0,
274
+ timeout: p.timeoutSeconds ?? 300,
275
+ ledger: LEDGER_USERTOKENS,
276
+ code: p.code,
277
+ flags: TransferFlags.pending,
278
+ timestamp: 0n,
279
+ };
280
+ const errors = await this.withReconnect(() => this.client.createTransfers([transfer]));
281
+ if (errors.length > 0) {
282
+ const err = errors[0];
283
+ if (!err)
284
+ throw new Error("Unknown account/transfer error");
285
+ throw new TBTransferError(err.result, `Pending transfer failed: ${CreateTransferError[err.result] ?? err.result}`);
286
+ }
287
+ return transferId;
288
+ }
289
+ async postTransfer(pendingId, amount) {
290
+ const postId = tbId();
291
+ const transfer = {
292
+ id: postId,
293
+ debit_account_id: 0n,
294
+ credit_account_id: 0n,
295
+ amount: amount != null ? BigInt(amount) : amount_max,
296
+ pending_id: pendingId,
297
+ user_data_128: 0n,
298
+ user_data_64: 0n,
299
+ user_data_32: 0,
300
+ timeout: 0,
301
+ ledger: 0,
302
+ code: 0,
303
+ flags: TransferFlags.post_pending_transfer,
304
+ timestamp: 0n,
305
+ };
306
+ const errors = await this.withReconnect(() => this.client.createTransfers([transfer]));
307
+ if (errors.length > 0) {
308
+ const err = errors[0];
309
+ if (!err)
310
+ throw new Error("Unknown account/transfer error");
311
+ throw new Error(`Post transfer failed: ${CreateTransferError[err.result] ?? err.result}`);
312
+ }
313
+ return postId;
314
+ }
315
+ async voidTransfer(pendingId) {
316
+ const voidId = tbId();
317
+ const transfer = {
318
+ id: voidId,
319
+ debit_account_id: 0n,
320
+ credit_account_id: 0n,
321
+ amount: 0n,
322
+ pending_id: pendingId,
323
+ user_data_128: 0n,
324
+ user_data_64: 0n,
325
+ user_data_32: 0,
326
+ timeout: 0,
327
+ ledger: 0,
328
+ code: 0,
329
+ flags: TransferFlags.void_pending_transfer,
330
+ timestamp: 0n,
331
+ };
332
+ const errors = await this.withReconnect(() => this.client.createTransfers([transfer]));
333
+ if (errors.length > 0) {
334
+ const err = errors[0];
335
+ if (!err)
336
+ throw new Error("Unknown account/transfer error");
337
+ throw new Error(`Void transfer failed: ${CreateTransferError[err.result] ?? err.result}`);
338
+ }
339
+ return voidId;
340
+ }
341
+ async immediateTransfer(p) {
342
+ const transferId = p.transferId ?? tbId();
343
+ const transfer = {
344
+ id: transferId,
345
+ debit_account_id: p.debitAccountId,
346
+ credit_account_id: p.creditAccountId,
347
+ amount: BigInt(p.amount),
348
+ pending_id: 0n,
349
+ user_data_128: p.userData128 ?? 0n,
350
+ user_data_64: p.userData64 ?? 0n,
351
+ user_data_32: p.userData32 ?? 0,
352
+ timeout: 0,
353
+ ledger: LEDGER_USERTOKENS,
354
+ code: p.code,
355
+ flags: 0,
356
+ timestamp: 0n,
357
+ };
358
+ const errors = await this.withReconnect(() => this.client.createTransfers([transfer]));
359
+ if (errors.length > 0) {
360
+ const err = errors[0];
361
+ if (!err)
362
+ throw new Error("Unknown account/transfer error");
363
+ throw new TBTransferError(err.result, `Transfer failed: ${CreateTransferError[err.result] ?? err.result}`);
364
+ }
365
+ return transferId;
366
+ }
367
+ async lookupTransfer(transferId) {
368
+ const transfers = await this.withReconnect(() => this.client.lookupTransfers([transferId]));
369
+ return transfers.length > 0 ? transfers[0] : null;
370
+ }
371
+ async lookupAccounts(accountIds) {
372
+ return await this.withReconnect(() => this.client.lookupAccounts(accountIds));
373
+ }
374
+ async lookupBalance(accountId) {
375
+ const accounts = await this.withReconnect(() => this.client.lookupAccounts([accountId]));
376
+ if (accounts.length === 0)
377
+ throw new Error(`Account not found: ${accountId}`);
378
+ const acct = accounts[0];
379
+ const postedBig = acct.credits_posted - acct.debits_posted;
380
+ if (postedBig > BigInt(Number.MAX_SAFE_INTEGER) ||
381
+ postedBig < -BigInt(Number.MAX_SAFE_INTEGER)) {
382
+ throw new Error(`[TB] Balance overflow: ${postedBig.toString()} exceeds Number.MAX_SAFE_INTEGER`);
383
+ }
384
+ const pendingBig = acct.debits_pending;
385
+ if (pendingBig > BigInt(Number.MAX_SAFE_INTEGER)) {
386
+ throw new Error(`[TB] Pending overflow: ${pendingBig.toString()} exceeds Number.MAX_SAFE_INTEGER`);
387
+ }
388
+ const posted = Number(postedBig);
389
+ const pending = Number(acct.debits_pending);
390
+ return {
391
+ available: Math.max(0, posted - pending),
392
+ pending,
393
+ total: Math.max(0, posted),
394
+ };
395
+ }
396
+ async ping() {
397
+ try {
398
+ if (!this.initialized || !this.treasuryId) {
399
+ return Date.now() - this.startedAt < this.initGraceMs;
400
+ }
401
+ const tid = this.treasuryId;
402
+ const accounts = await this.withReconnect(() => this.client.lookupAccounts([tid]));
403
+ return accounts.length > 0;
404
+ }
405
+ catch {
406
+ return false;
407
+ }
408
+ }
409
+ destroy() {
410
+ if (this.healthCheckInterval) {
411
+ clearInterval(this.healthCheckInterval);
412
+ this.healthCheckInterval = null;
413
+ }
414
+ this.client.destroy();
415
+ }
416
+ }
417
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ledger/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Two-phase spend engine for the usertrust SDK.
3
+ * Implements PENDING -> POST/VOID lifecycle for all governed operations.
4
+ *
5
+ * Extracted from usertools platform TokenEngineImpl.
6
+ */
7
+ import type { TrustTBClient } from "./client.js";
8
+ import { type ModelRates } from "./pricing.js";
9
+ export interface SpendAction {
10
+ type: "ai_compute";
11
+ model: string;
12
+ inputTokens: number;
13
+ outputTokens: number;
14
+ }
15
+ export interface TransferResult {
16
+ transferId: string;
17
+ debitAccountId: string;
18
+ creditAccountId: string;
19
+ amount: number;
20
+ timestamp: string;
21
+ pending: boolean;
22
+ }
23
+ export interface PricingTable {
24
+ [model: string]: ModelRates;
25
+ }
26
+ export interface TrustEngineOptions {
27
+ tbClient: TrustTBClient;
28
+ pricing?: PricingTable;
29
+ /** Hold timeout in milliseconds (default: 5 minutes) */
30
+ holdTtlMs?: number;
31
+ /** DLQ directory path (default: .usertools/dlq/) */
32
+ dlqPath?: string;
33
+ }
34
+ export declare class TrustEngine {
35
+ private tb;
36
+ private holdTtlMs;
37
+ private dlqPath;
38
+ constructor(opts: TrustEngineOptions);
39
+ /**
40
+ * Create a PENDING hold for an AI compute action.
41
+ * The hold reserves tokens until settled (POST) or released (VOID).
42
+ */
43
+ spendPending(p: {
44
+ userId: string;
45
+ action: SpendAction;
46
+ metadata?: {
47
+ agentRef?: string;
48
+ };
49
+ }): Promise<TransferResult>;
50
+ /**
51
+ * Settle a PENDING hold — debit is finalized.
52
+ * Optionally pass actual amount if less than the hold.
53
+ */
54
+ postPendingSpend(transferId: string, actualAmount?: number): Promise<void>;
55
+ /**
56
+ * Release a PENDING hold — tokens returned to the user's available balance.
57
+ */
58
+ voidPendingSpend(transferId: string): Promise<void>;
59
+ /**
60
+ * Query balance for a user.
61
+ */
62
+ balance(userId: string): Promise<{
63
+ available: number;
64
+ pending: number;
65
+ total: number;
66
+ }>;
67
+ }
68
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/ledger/engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,KAAK,UAAU,EAA+B,MAAM,cAAc,CAAC;AAI5E,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAgDD,qBAAa,WAAW;IACvB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,kBAAkB;IAMpC;;;OAGG;IACG,YAAY,CAAC,CAAC,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,WAAW,CAAC;QACpB,QAAQ,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACjC,GAAG,OAAO,CAAC,cAAc,CAAC;IAwC3B;;;OAGG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BhF;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;CAIF"}