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.
- package/dist/audit/canonical.d.ts +7 -0
- package/dist/audit/canonical.d.ts.map +1 -0
- package/dist/audit/canonical.js +24 -0
- package/dist/audit/canonical.js.map +1 -0
- package/dist/audit/chain.d.ts +33 -0
- package/dist/audit/chain.d.ts.map +1 -0
- package/dist/audit/chain.js +285 -0
- package/dist/audit/chain.js.map +1 -0
- package/dist/audit/entropy.d.ts +95 -0
- package/dist/audit/entropy.d.ts.map +1 -0
- package/dist/audit/entropy.js +229 -0
- package/dist/audit/entropy.js.map +1 -0
- package/dist/audit/merkle.d.ts +87 -0
- package/dist/audit/merkle.d.ts.map +1 -0
- package/dist/audit/merkle.js +315 -0
- package/dist/audit/merkle.js.map +1 -0
- package/dist/audit/rotation.d.ts +61 -0
- package/dist/audit/rotation.d.ts.map +1 -0
- package/dist/audit/rotation.js +160 -0
- package/dist/audit/rotation.js.map +1 -0
- package/dist/audit/verify.d.ts +20 -0
- package/dist/audit/verify.d.ts.map +1 -0
- package/dist/audit/verify.js +73 -0
- package/dist/audit/verify.js.map +1 -0
- package/dist/board/board.d.ts +67 -0
- package/dist/board/board.d.ts.map +1 -0
- package/dist/board/board.js +191 -0
- package/dist/board/board.js.map +1 -0
- package/dist/board/concerns.d.ts +59 -0
- package/dist/board/concerns.d.ts.map +1 -0
- package/dist/board/concerns.js +149 -0
- package/dist/board/concerns.js.map +1 -0
- package/dist/board/director.d.ts +49 -0
- package/dist/board/director.d.ts.map +1 -0
- package/dist/board/director.js +127 -0
- package/dist/board/director.js.map +1 -0
- package/dist/cli/health.d.ts +8 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +119 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/init.d.ts +8 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +67 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/inspect.d.ts +8 -0
- package/dist/cli/inspect.d.ts.map +1 -0
- package/dist/cli/inspect.js +114 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +35 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/snapshot.d.ts +10 -0
- package/dist/cli/snapshot.d.ts.map +1 -0
- package/dist/cli/snapshot.js +61 -0
- package/dist/cli/snapshot.js.map +1 -0
- package/dist/cli/tb.d.ts +8 -0
- package/dist/cli/tb.d.ts.map +1 -0
- package/dist/cli/tb.js +43 -0
- package/dist/cli/tb.js.map +1 -0
- package/dist/cli/verify.d.ts +7 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +32 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/detect.d.ts +18 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +49 -0
- package/dist/detect.js.map +1 -0
- package/dist/govern.d.ts +75 -0
- package/dist/govern.d.ts.map +1 -0
- package/dist/govern.js +581 -0
- package/dist/govern.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger/client.d.ts +89 -0
- package/dist/ledger/client.d.ts.map +1 -0
- package/dist/ledger/client.js +417 -0
- package/dist/ledger/client.js.map +1 -0
- package/dist/ledger/engine.d.ts +68 -0
- package/dist/ledger/engine.d.ts.map +1 -0
- package/dist/ledger/engine.js +142 -0
- package/dist/ledger/engine.js.map +1 -0
- package/dist/ledger/pricing.d.ts +35 -0
- package/dist/ledger/pricing.d.ts.map +1 -0
- package/dist/ledger/pricing.js +142 -0
- package/dist/ledger/pricing.js.map +1 -0
- package/dist/memory/patterns.d.ts +35 -0
- package/dist/memory/patterns.d.ts.map +1 -0
- package/dist/memory/patterns.js +152 -0
- package/dist/memory/patterns.js.map +1 -0
- package/dist/policy/decay.d.ts +95 -0
- package/dist/policy/decay.d.ts.map +1 -0
- package/dist/policy/decay.js +133 -0
- package/dist/policy/decay.js.map +1 -0
- package/dist/policy/default-rules.d.ts +21 -0
- package/dist/policy/default-rules.d.ts.map +1 -0
- package/dist/policy/default-rules.js +60 -0
- package/dist/policy/default-rules.js.map +1 -0
- package/dist/policy/gate.d.ts +116 -0
- package/dist/policy/gate.d.ts.map +1 -0
- package/dist/policy/gate.js +227 -0
- package/dist/policy/gate.js.map +1 -0
- package/dist/policy/pii.d.ts +28 -0
- package/dist/policy/pii.d.ts.map +1 -0
- package/dist/policy/pii.js +124 -0
- package/dist/policy/pii.js.map +1 -0
- package/dist/proxy.d.ts +33 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +36 -0
- package/dist/proxy.js.map +1 -0
- package/dist/resilience/circuit.d.ts +87 -0
- package/dist/resilience/circuit.d.ts.map +1 -0
- package/dist/resilience/circuit.js +167 -0
- package/dist/resilience/circuit.js.map +1 -0
- package/dist/resilience/scope.d.ts +97 -0
- package/dist/resilience/scope.d.ts.map +1 -0
- package/dist/resilience/scope.js +244 -0
- package/dist/resilience/scope.js.map +1 -0
- package/dist/shared/constants.d.ts +7 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +7 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/errors.d.ts +31 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +61 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/ids.d.ts +7 -0
- package/dist/shared/ids.d.ts.map +1 -0
- package/dist/shared/ids.js +31 -0
- package/dist/shared/ids.js.map +1 -0
- package/dist/shared/types.d.ts +162 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +41 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/snapshot/checkpoint.d.ts +22 -0
- package/dist/snapshot/checkpoint.d.ts.map +1 -0
- package/dist/snapshot/checkpoint.js +172 -0
- package/dist/snapshot/checkpoint.js.map +1 -0
- package/dist/streaming.d.ts +44 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +123 -0
- package/dist/streaming.js.map +1 -0
- package/package.json +54 -0
package/dist/govern.js
ADDED
|
@@ -0,0 +1,581 @@
|
|
|
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 { createHash } from "node:crypto";
|
|
28
|
+
import { existsSync } from "node:fs";
|
|
29
|
+
import { readFile } from "node:fs/promises";
|
|
30
|
+
import { join } from "node:path";
|
|
31
|
+
import { createAuditWriter } from "./audit/chain.js";
|
|
32
|
+
import { writeReceipt } from "./audit/rotation.js";
|
|
33
|
+
import { detectClientKind } from "./detect.js";
|
|
34
|
+
import { TrustTBClient, XFER_SPEND } from "./ledger/client.js";
|
|
35
|
+
import { estimateCost, estimateInputTokens } from "./ledger/pricing.js";
|
|
36
|
+
import { recordPattern } from "./memory/patterns.js";
|
|
37
|
+
import { DecayRateCalculator } from "./policy/decay.js";
|
|
38
|
+
import { evaluatePolicy, loadPolicies } from "./policy/gate.js";
|
|
39
|
+
import { detectPII } from "./policy/pii.js";
|
|
40
|
+
import { connectProxy } from "./proxy.js";
|
|
41
|
+
import { CircuitBreakerRegistry } from "./resilience/circuit.js";
|
|
42
|
+
import { DEFAULT_BUDGET, VAULT_DIR } from "./shared/constants.js";
|
|
43
|
+
import { LedgerUnavailableError, PolicyDeniedError } from "./shared/errors.js";
|
|
44
|
+
import { trustId } from "./shared/ids.js";
|
|
45
|
+
import { TrustConfigSchema } from "./shared/types.js";
|
|
46
|
+
import { createGovernedStream } from "./streaming.js";
|
|
47
|
+
// ── trust() ──
|
|
48
|
+
export async function trust(client, opts) {
|
|
49
|
+
// 1. Load config
|
|
50
|
+
const vaultBase = opts?.vaultBase ?? process.cwd();
|
|
51
|
+
const configPath = opts?.configPath ?? join(vaultBase, VAULT_DIR, "usertrust.config.json");
|
|
52
|
+
let config;
|
|
53
|
+
if (existsSync(configPath)) {
|
|
54
|
+
const raw = JSON.parse(await readFile(configPath, "utf-8"));
|
|
55
|
+
config = TrustConfigSchema.parse({
|
|
56
|
+
...raw,
|
|
57
|
+
...(opts?.budget !== undefined ? { budget: opts.budget } : {}),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
config = TrustConfigSchema.parse({
|
|
62
|
+
budget: opts?.budget ?? DEFAULT_BUDGET,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const isDryRun = opts?.dryRun ?? process.env.USERTRUST_DRY_RUN === "true";
|
|
66
|
+
// 2. Initialise subsystems
|
|
67
|
+
const vaultPath = vaultBase;
|
|
68
|
+
const audit = opts?._audit ?? createAuditWriter(vaultPath);
|
|
69
|
+
const policiesPath = join(vaultPath, VAULT_DIR, config.policies);
|
|
70
|
+
const policyRules = existsSync(policiesPath) ? loadPolicies(policiesPath) : [];
|
|
71
|
+
const breaker = new CircuitBreakerRegistry({
|
|
72
|
+
failureThreshold: config.circuitBreaker.failureThreshold,
|
|
73
|
+
resetTimeoutMs: config.circuitBreaker.resetTimeout,
|
|
74
|
+
});
|
|
75
|
+
// Decay-weighted budget calculator (1-hour half-life)
|
|
76
|
+
const decayCalc = new DecayRateCalculator({ halfLifeMs: 3_600_000 });
|
|
77
|
+
const spendHistory = [];
|
|
78
|
+
// 3. Proxy connection (if proxy mode)
|
|
79
|
+
let proxyConn = null;
|
|
80
|
+
if (opts?.proxy) {
|
|
81
|
+
proxyConn = connectProxy(opts.proxy, opts.key);
|
|
82
|
+
}
|
|
83
|
+
// 4. Engine (injected for tests, real TB client in production, null in dry-run/proxy)
|
|
84
|
+
let engine;
|
|
85
|
+
if (opts?._engine !== undefined) {
|
|
86
|
+
engine = opts._engine;
|
|
87
|
+
}
|
|
88
|
+
else if (!isDryRun && proxyConn == null) {
|
|
89
|
+
try {
|
|
90
|
+
engine = await createTBEngine(config);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
throw new LedgerUnavailableError(err instanceof Error ? err.message : String(err));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
engine = null;
|
|
98
|
+
}
|
|
99
|
+
// 5. Detect client kind
|
|
100
|
+
const kind = detectClientKind(client);
|
|
101
|
+
// 6. Track state
|
|
102
|
+
let destroyed = false;
|
|
103
|
+
let budgetSpent = 0;
|
|
104
|
+
// 7. Two-phase intercept
|
|
105
|
+
async function interceptCall(originalFn, thisArg, args) {
|
|
106
|
+
if (destroyed) {
|
|
107
|
+
throw new Error("GovernedClient has been destroyed");
|
|
108
|
+
}
|
|
109
|
+
const params = (args[0] ?? {});
|
|
110
|
+
const model = params.model ?? "unknown";
|
|
111
|
+
const messages = params.messages ?? [];
|
|
112
|
+
// Per-call audit degradation flag (not sticky across calls)
|
|
113
|
+
let callAuditDegraded = false;
|
|
114
|
+
// a. Circuit breaker check
|
|
115
|
+
const cb = breaker.get(kind);
|
|
116
|
+
cb.allowRequest();
|
|
117
|
+
// b. Estimate cost (before policy, so cost fields are available in context)
|
|
118
|
+
const transferId = trustId("tx");
|
|
119
|
+
const estimatedInputTokens = estimateInputTokens(messages);
|
|
120
|
+
const maxOutputTokens = params.max_tokens ?? 4096;
|
|
121
|
+
const estimatedCost = estimateCost(model, estimatedInputTokens, maxOutputTokens);
|
|
122
|
+
// c. Policy gate
|
|
123
|
+
const policyResult = evaluatePolicy(policyRules, {
|
|
124
|
+
model,
|
|
125
|
+
tier: config.tier,
|
|
126
|
+
estimated_cost: estimatedCost,
|
|
127
|
+
budget_remaining: config.budget - budgetSpent,
|
|
128
|
+
...params,
|
|
129
|
+
});
|
|
130
|
+
if (policyResult.decision === "deny") {
|
|
131
|
+
const reason = policyResult.reasons.length > 0 ? policyResult.reasons.join("; ") : "Policy denied";
|
|
132
|
+
throw new PolicyDeniedError(reason);
|
|
133
|
+
}
|
|
134
|
+
// d. PII check
|
|
135
|
+
if (config.pii !== "off") {
|
|
136
|
+
const piiResult = detectPII(messages);
|
|
137
|
+
if (piiResult.found && config.pii === "block") {
|
|
138
|
+
throw new PolicyDeniedError(`PII detected: ${piiResult.types.join(", ")}`);
|
|
139
|
+
}
|
|
140
|
+
// "warn" and "redact" modes: continue (redact is not implemented at SDK level)
|
|
141
|
+
}
|
|
142
|
+
// d2. Failure mode 15.4: TigerBeetle / engine unreachable — PENDING hold
|
|
143
|
+
if (proxyConn != null && !isDryRun) {
|
|
144
|
+
try {
|
|
145
|
+
await proxyConn.spend({
|
|
146
|
+
model,
|
|
147
|
+
estimatedCost,
|
|
148
|
+
actor: "local",
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (holdErr) {
|
|
152
|
+
throw new LedgerUnavailableError(holdErr instanceof Error ? holdErr.message : String(holdErr));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (engine != null && !isDryRun) {
|
|
156
|
+
try {
|
|
157
|
+
await engine.spendPending({
|
|
158
|
+
transferId,
|
|
159
|
+
amount: estimatedCost,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (holdErr) {
|
|
163
|
+
// Ledger unreachable — do NOT forward to provider
|
|
164
|
+
throw new LedgerUnavailableError(holdErr instanceof Error ? holdErr.message : String(holdErr));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// e. Forward to original SDK
|
|
168
|
+
let settled = true;
|
|
169
|
+
try {
|
|
170
|
+
const response = await originalFn.apply(thisArg, args);
|
|
171
|
+
// e2. Streaming detection: if response is an async iterable, wrap with
|
|
172
|
+
// token accumulation. Settlement and audit happen when the stream ends.
|
|
173
|
+
if (response != null &&
|
|
174
|
+
typeof response === "object" &&
|
|
175
|
+
Symbol.asyncIterator in response) {
|
|
176
|
+
const stream = response;
|
|
177
|
+
const governedStream = createGovernedStream(stream, kind, async (usage) => {
|
|
178
|
+
const streamCost = estimateCost(model, usage.inputTokens, usage.outputTokens);
|
|
179
|
+
budgetSpent += streamCost;
|
|
180
|
+
cb.recordSuccess();
|
|
181
|
+
if (proxyConn != null && !isDryRun) {
|
|
182
|
+
try {
|
|
183
|
+
await proxyConn.settle(transferId, streamCost);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
settled = false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else if (engine != null && !isDryRun) {
|
|
190
|
+
try {
|
|
191
|
+
await engine.postPendingSpend(transferId);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
settled = false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const syntheticHash = createHash("sha256").update(transferId).digest("hex");
|
|
198
|
+
let auditHash = syntheticHash;
|
|
199
|
+
try {
|
|
200
|
+
const auditEvent = await audit.appendEvent({
|
|
201
|
+
kind: "llm_call",
|
|
202
|
+
actor: "local",
|
|
203
|
+
data: { model, cost: streamCost, settled, transferId },
|
|
204
|
+
});
|
|
205
|
+
auditHash = auditEvent.hash;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
callAuditDegraded = true;
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
transferId,
|
|
212
|
+
cost: streamCost,
|
|
213
|
+
budgetRemaining: config.budget - budgetSpent,
|
|
214
|
+
auditHash,
|
|
215
|
+
chainPath: join(VAULT_DIR, "audit"),
|
|
216
|
+
receiptUrl: opts?.proxy != null ? `https://verify.usertools.dev/${transferId}` : null,
|
|
217
|
+
settled,
|
|
218
|
+
model,
|
|
219
|
+
provider: kind,
|
|
220
|
+
timestamp: new Date().toISOString(),
|
|
221
|
+
...(callAuditDegraded ? { auditDegraded: true } : {}),
|
|
222
|
+
};
|
|
223
|
+
}, (error) => {
|
|
224
|
+
cb.recordFailure();
|
|
225
|
+
if (proxyConn != null && !isDryRun) {
|
|
226
|
+
proxyConn.void(transferId).catch(() => { });
|
|
227
|
+
}
|
|
228
|
+
else if (engine != null && !isDryRun) {
|
|
229
|
+
engine.voidPendingSpend(transferId).catch(() => { });
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// For streaming responses, return the wrapped stream with an
|
|
233
|
+
// estimated governance receipt. The actual receipt (with real
|
|
234
|
+
// token counts) is available via governedStream.governance
|
|
235
|
+
// after the stream is fully consumed.
|
|
236
|
+
const auditHash = createHash("sha256").update(transferId).digest("hex");
|
|
237
|
+
const estimatedGovernance = {
|
|
238
|
+
transferId,
|
|
239
|
+
cost: estimatedCost,
|
|
240
|
+
budgetRemaining: config.budget - budgetSpent,
|
|
241
|
+
auditHash,
|
|
242
|
+
chainPath: join(VAULT_DIR, "audit"),
|
|
243
|
+
receiptUrl: opts?.proxy != null ? `https://verify.usertools.dev/${transferId}` : null,
|
|
244
|
+
settled,
|
|
245
|
+
model,
|
|
246
|
+
provider: kind,
|
|
247
|
+
timestamp: new Date().toISOString(),
|
|
248
|
+
...(callAuditDegraded ? { auditDegraded: true } : {}),
|
|
249
|
+
};
|
|
250
|
+
return { response: governedStream, governance: estimatedGovernance };
|
|
251
|
+
}
|
|
252
|
+
// f. Compute actual cost from response usage
|
|
253
|
+
let actualCost = estimatedCost;
|
|
254
|
+
if (response != null && typeof response === "object" && "usage" in response) {
|
|
255
|
+
const usage = response.usage;
|
|
256
|
+
if (usage != null) {
|
|
257
|
+
const inputTokens = usage.input_tokens ??
|
|
258
|
+
usage.prompt_tokens ??
|
|
259
|
+
estimatedInputTokens;
|
|
260
|
+
const outputTokens = usage.output_tokens ??
|
|
261
|
+
usage.completion_tokens ??
|
|
262
|
+
0;
|
|
263
|
+
actualCost = estimateCost(model, inputTokens, outputTokens);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Track budget (cumulative and decay-weighted)
|
|
267
|
+
budgetSpent += actualCost;
|
|
268
|
+
spendHistory.push({ ts: Date.now(), value: actualCost });
|
|
269
|
+
// g. Circuit breaker: record success
|
|
270
|
+
cb.recordSuccess();
|
|
271
|
+
// g2. Failure mode 15.1: POST fails after LLM success
|
|
272
|
+
if (engine != null && !isDryRun) {
|
|
273
|
+
try {
|
|
274
|
+
await engine.postPendingSpend(transferId);
|
|
275
|
+
}
|
|
276
|
+
catch (postErr) {
|
|
277
|
+
// POST failed — LLM call succeeded but settlement is ambiguous
|
|
278
|
+
settled = false;
|
|
279
|
+
await audit
|
|
280
|
+
.appendEvent({
|
|
281
|
+
kind: "settlement_ambiguous",
|
|
282
|
+
actor: "local",
|
|
283
|
+
data: {
|
|
284
|
+
model,
|
|
285
|
+
cost: actualCost,
|
|
286
|
+
transferId,
|
|
287
|
+
error: postErr instanceof Error ? postErr.message : String(postErr),
|
|
288
|
+
},
|
|
289
|
+
})
|
|
290
|
+
.catch(() => {
|
|
291
|
+
// Audit also degraded — nothing more we can do
|
|
292
|
+
callAuditDegraded = true;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// g3. Proxy settlement
|
|
297
|
+
if (proxyConn != null && !isDryRun) {
|
|
298
|
+
try {
|
|
299
|
+
await proxyConn.settle(transferId, actualCost);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
settled = false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// h. Audit event — failure mode 15.3: audit write failure
|
|
306
|
+
const syntheticHash = createHash("sha256").update(transferId).digest("hex");
|
|
307
|
+
let auditHash = syntheticHash;
|
|
308
|
+
try {
|
|
309
|
+
const auditEvent = await audit.appendEvent({
|
|
310
|
+
kind: "llm_call",
|
|
311
|
+
actor: "local",
|
|
312
|
+
data: {
|
|
313
|
+
model,
|
|
314
|
+
cost: actualCost,
|
|
315
|
+
settled,
|
|
316
|
+
transferId,
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
auditHash = auditEvent.hash;
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// Failure mode 15.3: Audit degraded — do not fail the response
|
|
323
|
+
callAuditDegraded = true;
|
|
324
|
+
process.stderr.write(`[usertrust] audit degraded: failed to write llm_call event for ${transferId}\n`);
|
|
325
|
+
}
|
|
326
|
+
// i. Daily-rotated audit receipt (non-blocking)
|
|
327
|
+
if (config.audit.rotation !== "none") {
|
|
328
|
+
writeReceipt(vaultPath, {
|
|
329
|
+
kind: "llm_call",
|
|
330
|
+
subsystem: "trust",
|
|
331
|
+
actor: "local",
|
|
332
|
+
data: { model, cost: actualCost, settled, transferId },
|
|
333
|
+
}, config.audit.indexLimit);
|
|
334
|
+
}
|
|
335
|
+
// i2. Pattern memory
|
|
336
|
+
if (config.patterns.enabled) {
|
|
337
|
+
const promptHash = createHash("sha256").update(JSON.stringify(messages)).digest("hex");
|
|
338
|
+
await recordPattern({
|
|
339
|
+
promptHash,
|
|
340
|
+
model,
|
|
341
|
+
cost: actualCost,
|
|
342
|
+
success: true,
|
|
343
|
+
}).catch(() => { });
|
|
344
|
+
}
|
|
345
|
+
const budgetRemaining = config.budget - budgetSpent;
|
|
346
|
+
const governance = {
|
|
347
|
+
transferId,
|
|
348
|
+
cost: actualCost,
|
|
349
|
+
budgetRemaining,
|
|
350
|
+
auditHash,
|
|
351
|
+
chainPath: join(VAULT_DIR, "audit"),
|
|
352
|
+
receiptUrl: opts?.proxy != null ? `https://verify.usertools.dev/${transferId}` : null,
|
|
353
|
+
settled,
|
|
354
|
+
model,
|
|
355
|
+
provider: kind,
|
|
356
|
+
timestamp: new Date().toISOString(),
|
|
357
|
+
...(callAuditDegraded ? { auditDegraded: true } : {}),
|
|
358
|
+
};
|
|
359
|
+
return { response, governance };
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
// j. Circuit breaker: record failure
|
|
363
|
+
cb.recordFailure();
|
|
364
|
+
// j2. Failure mode 15.2: LLM fails — VOID the pending hold
|
|
365
|
+
if (engine != null && !isDryRun) {
|
|
366
|
+
try {
|
|
367
|
+
await engine.voidPendingSpend(transferId);
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// Best-effort void — log and continue
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// j3. Proxy void
|
|
374
|
+
if (proxyConn != null && !isDryRun) {
|
|
375
|
+
try {
|
|
376
|
+
await proxyConn.void(transferId);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// Best-effort void
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// k. Audit the failure
|
|
383
|
+
await audit
|
|
384
|
+
.appendEvent({
|
|
385
|
+
kind: "llm_call_failed",
|
|
386
|
+
actor: "local",
|
|
387
|
+
data: { model, error: String(err), transferId },
|
|
388
|
+
})
|
|
389
|
+
.catch(() => {
|
|
390
|
+
callAuditDegraded = true;
|
|
391
|
+
});
|
|
392
|
+
// l. Pattern memory: record failure
|
|
393
|
+
if (config.patterns.enabled) {
|
|
394
|
+
const promptHash = createHash("sha256").update(JSON.stringify(messages)).digest("hex");
|
|
395
|
+
await recordPattern({
|
|
396
|
+
promptHash,
|
|
397
|
+
model,
|
|
398
|
+
cost: 0,
|
|
399
|
+
success: false,
|
|
400
|
+
}).catch(() => { });
|
|
401
|
+
}
|
|
402
|
+
throw err;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// 8. Safety net: clean up on process exit if destroy() was never called
|
|
406
|
+
let beforeExitHandler = null;
|
|
407
|
+
// 9. Build Proxy based on client kind
|
|
408
|
+
function createClientProxy() {
|
|
409
|
+
const destroyFn = async () => {
|
|
410
|
+
if (destroyed)
|
|
411
|
+
return;
|
|
412
|
+
destroyed = true;
|
|
413
|
+
// Remove beforeExit safety net
|
|
414
|
+
if (beforeExitHandler != null) {
|
|
415
|
+
process.removeListener("beforeExit", beforeExitHandler);
|
|
416
|
+
beforeExitHandler = null;
|
|
417
|
+
}
|
|
418
|
+
// Flush audit writes
|
|
419
|
+
await audit.flush();
|
|
420
|
+
// Release audit lock
|
|
421
|
+
audit.release();
|
|
422
|
+
// Destroy engine if connected
|
|
423
|
+
if (engine != null && typeof engine.destroy === "function") {
|
|
424
|
+
engine.destroy();
|
|
425
|
+
}
|
|
426
|
+
// Destroy proxy connection if active
|
|
427
|
+
if (proxyConn != null) {
|
|
428
|
+
proxyConn.destroy();
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
if (kind === "anthropic") {
|
|
432
|
+
return buildAnthropicProxy(client, interceptCall, destroyFn);
|
|
433
|
+
}
|
|
434
|
+
if (kind === "openai") {
|
|
435
|
+
return buildOpenAIProxy(client, interceptCall, destroyFn);
|
|
436
|
+
}
|
|
437
|
+
// google
|
|
438
|
+
return buildGoogleProxy(client, interceptCall, destroyFn);
|
|
439
|
+
}
|
|
440
|
+
const governedClient = createClientProxy();
|
|
441
|
+
beforeExitHandler = () => {
|
|
442
|
+
if (!destroyed) {
|
|
443
|
+
governedClient.destroy().catch(() => { });
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
process.on("beforeExit", beforeExitHandler);
|
|
447
|
+
return governedClient;
|
|
448
|
+
}
|
|
449
|
+
// ── TigerBeetle engine factory ──
|
|
450
|
+
/**
|
|
451
|
+
* Create a TrustEngine backed by a real TigerBeetle client.
|
|
452
|
+
* Uses a simplified two-phase interface: pending transfers are created
|
|
453
|
+
* directly against the TB client using escrow-style debit/credit accounts.
|
|
454
|
+
*/
|
|
455
|
+
async function createTBEngine(config) {
|
|
456
|
+
const tbAddresses = config.tigerbeetle.addresses;
|
|
457
|
+
const tbClusterId = BigInt(config.tigerbeetle.clusterId);
|
|
458
|
+
const tbClient = new TrustTBClient({
|
|
459
|
+
addresses: tbAddresses,
|
|
460
|
+
clusterId: tbClusterId,
|
|
461
|
+
});
|
|
462
|
+
// Initialize treasury and escrow accounts
|
|
463
|
+
await tbClient.createTreasury();
|
|
464
|
+
await tbClient.ensureEscrowAccount("trust:escrow");
|
|
465
|
+
// Pending transfer ID mapping (trustId string -> TB bigint)
|
|
466
|
+
const pendingMap = new Map();
|
|
467
|
+
return {
|
|
468
|
+
async spendPending(params) {
|
|
469
|
+
const treasury = tbClient.getTreasuryId();
|
|
470
|
+
// Use a deterministic escrow account for SDK-local holds
|
|
471
|
+
const escrowId = TrustTBClient.deriveAccountId("trust:escrow");
|
|
472
|
+
const tbTransferId = await tbClient.createPendingTransfer({
|
|
473
|
+
debitAccountId: escrowId,
|
|
474
|
+
creditAccountId: treasury,
|
|
475
|
+
amount: params.amount,
|
|
476
|
+
code: XFER_SPEND,
|
|
477
|
+
});
|
|
478
|
+
pendingMap.set(params.transferId, tbTransferId);
|
|
479
|
+
return { transferId: params.transferId };
|
|
480
|
+
},
|
|
481
|
+
async postPendingSpend(transferId) {
|
|
482
|
+
const tbId = pendingMap.get(transferId);
|
|
483
|
+
if (tbId === undefined) {
|
|
484
|
+
throw new Error(`No pending transfer found for ${transferId}`);
|
|
485
|
+
}
|
|
486
|
+
await tbClient.postTransfer(tbId);
|
|
487
|
+
pendingMap.delete(transferId);
|
|
488
|
+
},
|
|
489
|
+
async voidPendingSpend(transferId) {
|
|
490
|
+
const tbId = pendingMap.get(transferId);
|
|
491
|
+
if (tbId === undefined) {
|
|
492
|
+
throw new Error(`No pending transfer found for ${transferId}`);
|
|
493
|
+
}
|
|
494
|
+
await tbClient.voidTransfer(tbId);
|
|
495
|
+
pendingMap.delete(transferId);
|
|
496
|
+
},
|
|
497
|
+
destroy() {
|
|
498
|
+
tbClient.destroy();
|
|
499
|
+
},
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
function buildAnthropicProxy(client, intercept, destroy) {
|
|
503
|
+
const original = client;
|
|
504
|
+
const messages = original.messages;
|
|
505
|
+
const originalCreate = messages.create;
|
|
506
|
+
// Proxy on the messages object: intercept `create`
|
|
507
|
+
const messagesProxy = new Proxy(messages, {
|
|
508
|
+
get(target, prop, receiver) {
|
|
509
|
+
if (prop === "create") {
|
|
510
|
+
return (...args) => intercept(originalCreate, target, args);
|
|
511
|
+
}
|
|
512
|
+
return Reflect.get(target, prop, receiver);
|
|
513
|
+
},
|
|
514
|
+
});
|
|
515
|
+
// Proxy on the client: intercept `messages` to return our proxy, add `destroy`
|
|
516
|
+
const clientProxy = new Proxy(original, {
|
|
517
|
+
get(target, prop, receiver) {
|
|
518
|
+
if (prop === "messages")
|
|
519
|
+
return messagesProxy;
|
|
520
|
+
if (prop === "destroy")
|
|
521
|
+
return destroy;
|
|
522
|
+
return Reflect.get(target, prop, receiver);
|
|
523
|
+
},
|
|
524
|
+
});
|
|
525
|
+
return clientProxy;
|
|
526
|
+
}
|
|
527
|
+
function buildOpenAIProxy(client, intercept, destroy) {
|
|
528
|
+
const original = client;
|
|
529
|
+
const chat = original.chat;
|
|
530
|
+
const completions = chat.completions;
|
|
531
|
+
const originalCreate = completions.create;
|
|
532
|
+
const completionsProxy = new Proxy(completions, {
|
|
533
|
+
get(target, prop, receiver) {
|
|
534
|
+
if (prop === "create") {
|
|
535
|
+
return (...args) => intercept(originalCreate, target, args);
|
|
536
|
+
}
|
|
537
|
+
return Reflect.get(target, prop, receiver);
|
|
538
|
+
},
|
|
539
|
+
});
|
|
540
|
+
const chatProxy = new Proxy(chat, {
|
|
541
|
+
get(target, prop, receiver) {
|
|
542
|
+
if (prop === "completions")
|
|
543
|
+
return completionsProxy;
|
|
544
|
+
return Reflect.get(target, prop, receiver);
|
|
545
|
+
},
|
|
546
|
+
});
|
|
547
|
+
const clientProxy = new Proxy(original, {
|
|
548
|
+
get(target, prop, receiver) {
|
|
549
|
+
if (prop === "chat")
|
|
550
|
+
return chatProxy;
|
|
551
|
+
if (prop === "destroy")
|
|
552
|
+
return destroy;
|
|
553
|
+
return Reflect.get(target, prop, receiver);
|
|
554
|
+
},
|
|
555
|
+
});
|
|
556
|
+
return clientProxy;
|
|
557
|
+
}
|
|
558
|
+
function buildGoogleProxy(client, intercept, destroy) {
|
|
559
|
+
const original = client;
|
|
560
|
+
const models = original.models;
|
|
561
|
+
const originalGenerate = models.generateContent;
|
|
562
|
+
const modelsProxy = new Proxy(models, {
|
|
563
|
+
get(target, prop, receiver) {
|
|
564
|
+
if (prop === "generateContent") {
|
|
565
|
+
return (...args) => intercept(originalGenerate, target, args);
|
|
566
|
+
}
|
|
567
|
+
return Reflect.get(target, prop, receiver);
|
|
568
|
+
},
|
|
569
|
+
});
|
|
570
|
+
const clientProxy = new Proxy(original, {
|
|
571
|
+
get(target, prop, receiver) {
|
|
572
|
+
if (prop === "models")
|
|
573
|
+
return modelsProxy;
|
|
574
|
+
if (prop === "destroy")
|
|
575
|
+
return destroy;
|
|
576
|
+
return Reflect.get(target, prop, receiver);
|
|
577
|
+
},
|
|
578
|
+
});
|
|
579
|
+
return clientProxy;
|
|
580
|
+
}
|
|
581
|
+
//# sourceMappingURL=govern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"govern.js","sourceRoot":"","sources":["../src/govern.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { trust } from "./govern.js";
|
|
2
|
+
export type { TrustOpts, GovernedClient } from "./govern.js";
|
|
3
|
+
export { loadConfig, defineConfig } from "./config.js";
|
|
4
|
+
export type { GovernedResponse, GovernanceReceipt, TrustConfig, PolicyRule, FieldCondition, BoardDecision, AuditEvent, LLMClientKind, } from "./shared/types.js";
|
|
5
|
+
export { InsufficientBalanceError, PolicyDeniedError, LedgerUnavailableError, AuditDegradedError, VaultNotInitializedError, } from "./shared/errors.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGvD,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,aAAa,GACb,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACN,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,GACxB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// usertrust — AI Financial Governance SDK
|
|
2
|
+
// Core
|
|
3
|
+
export { trust } from "./govern.js";
|
|
4
|
+
// Config
|
|
5
|
+
export { loadConfig, defineConfig } from "./config.js";
|
|
6
|
+
// Errors
|
|
7
|
+
export { InsufficientBalanceError, PolicyDeniedError, LedgerUnavailableError, AuditDegradedError, VaultNotInitializedError, } from "./shared/errors.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,OAAO;AACP,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAcvD,SAAS;AACT,OAAO,EACN,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,GACxB,MAAM,oBAAoB,CAAC"}
|