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,244 @@
1
+ /**
2
+ * Scope Locking — minimatch-based overlap detection & lease management
3
+ *
4
+ * Prevents conflicts between parallel workers by tracking scope-based leases.
5
+ * Each lease locks a set of glob patterns; overlapping patterns from different
6
+ * actors are rejected.
7
+ *
8
+ * Store path: `.usertools/leases.json`
9
+ */
10
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { minimatch } from "minimatch";
13
+ import { VAULT_DIR } from "../shared/constants.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Path Resolution
16
+ // ---------------------------------------------------------------------------
17
+ let storeDir = join(process.cwd(), VAULT_DIR);
18
+ /**
19
+ * Set the store directory path (for testing).
20
+ */
21
+ export function setStoreDir(dir) {
22
+ storeDir = dir;
23
+ }
24
+ /**
25
+ * Get the current store directory.
26
+ */
27
+ export function getStoreDir() {
28
+ return storeDir;
29
+ }
30
+ function getLeasesPath() {
31
+ return join(storeDir, "leases.json");
32
+ }
33
+ function ensureStoreDir() {
34
+ if (!existsSync(storeDir)) {
35
+ mkdirSync(storeDir, { recursive: true });
36
+ }
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // File Operations
40
+ // ---------------------------------------------------------------------------
41
+ function readLeases() {
42
+ ensureStoreDir();
43
+ const path = getLeasesPath();
44
+ if (!existsSync(path)) {
45
+ return {};
46
+ }
47
+ try {
48
+ const data = readFileSync(path, "utf-8");
49
+ return JSON.parse(data);
50
+ }
51
+ catch {
52
+ return {};
53
+ }
54
+ }
55
+ function writeLeases(store) {
56
+ ensureStoreDir();
57
+ writeFileSync(getLeasesPath(), JSON.stringify(store, null, "\t"));
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // ID Generation
61
+ // ---------------------------------------------------------------------------
62
+ function generateLeaseId() {
63
+ const hex = Math.random().toString(16).substring(2, 10);
64
+ return `ls_${hex}`;
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Scope Overlap
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Check if two scope patterns overlap.
71
+ *
72
+ * Two patterns overlap when:
73
+ * 1. Either literally matches the other via minimatch, OR
74
+ * 2. They share a common base prefix (e.g. `src/**` and `src/foo/**`)
75
+ */
76
+ export function scopesOverlap(scopeA, scopeB) {
77
+ for (const patternA of scopeA) {
78
+ for (const patternB of scopeB) {
79
+ // Check if either pattern matches the other
80
+ if (minimatch(patternA, patternB) || minimatch(patternB, patternA)) {
81
+ return true;
82
+ }
83
+ // Check for common prefix overlap (e.g., "src/**" and "src/foo/**")
84
+ const baseA = patternA.replace(/\*.*$/, "");
85
+ const baseB = patternB.replace(/\*.*$/, "");
86
+ if (baseA.startsWith(baseB) || baseB.startsWith(baseA)) {
87
+ return true;
88
+ }
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+ /**
94
+ * Check if a file matches any of the scope patterns.
95
+ */
96
+ export function fileMatchesScope(file, scope) {
97
+ for (const pattern of scope) {
98
+ if (minimatch(file, pattern)) {
99
+ return true;
100
+ }
101
+ }
102
+ return false;
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // ScopeManager
106
+ // ---------------------------------------------------------------------------
107
+ /**
108
+ * Scope-based lease manager.
109
+ *
110
+ * Provides `acquireLease`, `releaseLease`, `findConflicts`, and `expireStale`
111
+ * for coordinating parallel workers operating on overlapping file scopes.
112
+ */
113
+ export class ScopeManager {
114
+ clock;
115
+ constructor(clock) {
116
+ this.clock = clock ?? Date.now;
117
+ }
118
+ /**
119
+ * Acquire a lease for the given scope.
120
+ * Throws if scope overlaps with another actor's active lease.
121
+ */
122
+ acquireLease(options) {
123
+ const store = readLeases();
124
+ const ttlMin = options.ttlMin ?? 60;
125
+ // Expire stale leases first
126
+ this.expireStaleInStore(store);
127
+ // Check for scope overlap with other actors' active leases
128
+ const conflicts = this.findConflictsInStore(store, options.scope, options.actor);
129
+ if (conflicts.length > 0) {
130
+ const first = conflicts[0];
131
+ throw new Error(`Scope overlap with lease ${first.lease.lease_id} ` +
132
+ `(actor: ${first.lease.actor}, ` +
133
+ `scope: ${first.lease.scope.join(", ")})`);
134
+ }
135
+ const now = new Date(this.clock()).toISOString();
136
+ const expiresAt = new Date(this.clock() + ttlMin * 60_000).toISOString();
137
+ const leaseId = generateLeaseId();
138
+ const lease = {
139
+ lease_id: leaseId,
140
+ actor: options.actor,
141
+ scope: options.scope,
142
+ intent: options.intent,
143
+ issued_at: now,
144
+ expires_at: expiresAt,
145
+ status: "active",
146
+ };
147
+ store[leaseId] = lease;
148
+ writeLeases(store);
149
+ return lease;
150
+ }
151
+ /**
152
+ * Renew an existing lease, extending its TTL.
153
+ */
154
+ renewLease(leaseId, ttlMin = 60) {
155
+ const store = readLeases();
156
+ const lease = store[leaseId];
157
+ if (!lease) {
158
+ throw new Error(`Lease ${leaseId} not found`);
159
+ }
160
+ if (lease.status !== "active") {
161
+ throw new Error(`Lease ${leaseId} is ${lease.status}, cannot renew`);
162
+ }
163
+ lease.expires_at = new Date(this.clock() + ttlMin * 60_000).toISOString();
164
+ lease.last_renewed_at = new Date(this.clock()).toISOString();
165
+ writeLeases(store);
166
+ return lease;
167
+ }
168
+ /**
169
+ * Release a lease, marking it as released.
170
+ */
171
+ releaseLease(leaseId) {
172
+ const store = readLeases();
173
+ const lease = store[leaseId];
174
+ if (!lease) {
175
+ throw new Error(`Lease ${leaseId} not found`);
176
+ }
177
+ lease.status = "released";
178
+ writeLeases(store);
179
+ return lease;
180
+ }
181
+ /**
182
+ * Find conflicts for a proposed scope against active leases.
183
+ */
184
+ findConflicts(scope, excludeActor) {
185
+ const store = readLeases();
186
+ this.expireStaleInStore(store);
187
+ return this.findConflictsInStore(store, scope, excludeActor);
188
+ }
189
+ /**
190
+ * Expire stale leases and persist the result.
191
+ * Returns the number of leases expired.
192
+ */
193
+ expireStale() {
194
+ const store = readLeases();
195
+ const count = this.expireStaleInStore(store);
196
+ if (count > 0) {
197
+ writeLeases(store);
198
+ }
199
+ return count;
200
+ }
201
+ /**
202
+ * Get all active leases.
203
+ */
204
+ getActiveLeases() {
205
+ const store = readLeases();
206
+ return Object.values(store).filter((l) => l.status === "active");
207
+ }
208
+ /**
209
+ * Get a lease by ID.
210
+ */
211
+ getLease(leaseId) {
212
+ const store = readLeases();
213
+ return store[leaseId];
214
+ }
215
+ // ── Private helpers ──
216
+ findConflictsInStore(store, scope, excludeActor) {
217
+ const conflicts = [];
218
+ for (const lease of Object.values(store)) {
219
+ if (lease.status !== "active")
220
+ continue;
221
+ if (excludeActor && lease.actor === excludeActor)
222
+ continue;
223
+ if (scopesOverlap(scope, lease.scope)) {
224
+ conflicts.push({
225
+ lease,
226
+ overlappingPatterns: lease.scope,
227
+ });
228
+ }
229
+ }
230
+ return conflicts;
231
+ }
232
+ expireStaleInStore(store) {
233
+ const now = new Date(this.clock());
234
+ let count = 0;
235
+ for (const lease of Object.values(store)) {
236
+ if (lease.status === "active" && new Date(lease.expires_at) < now) {
237
+ lease.status = "expired";
238
+ count++;
239
+ }
240
+ }
241
+ return count;
242
+ }
243
+ }
244
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/resilience/scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const GENESIS_HASH = "0000000000000000000000000000000000000000000000000000000000000000";
2
+ export declare const VAULT_DIR = ".usertrust";
3
+ export declare const AUDIT_DIR = "audit";
4
+ export declare const RECEIPT_VERSION = 3;
5
+ export declare const DEFAULT_HOLD_TTL_MS: number;
6
+ export declare const DEFAULT_BUDGET = 50000;
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,qEAAqE,CAAC;AAC/F,eAAO,MAAM,SAAS,eAAe,CAAC;AACtC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,mBAAmB,QAAgB,CAAC;AACjD,eAAO,MAAM,cAAc,QAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const GENESIS_HASH = "0000000000000000000000000000000000000000000000000000000000000000";
2
+ export const VAULT_DIR = ".usertrust";
3
+ export const AUDIT_DIR = "audit";
4
+ export const RECEIPT_VERSION = 3;
5
+ export const DEFAULT_HOLD_TTL_MS = 5 * 60 * 1000; // 5 minutes
6
+ export const DEFAULT_BUDGET = 50_000;
7
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,kEAAkE,CAAC;AAC/F,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC"}
@@ -0,0 +1,31 @@
1
+ export declare class InsufficientBalanceError extends Error {
2
+ readonly userId: string;
3
+ readonly required: number;
4
+ readonly available: number;
5
+ constructor(userId: string, required: number, available: number);
6
+ }
7
+ export declare class PolicyDeniedError extends Error {
8
+ readonly reason: string;
9
+ constructor(reason: string);
10
+ }
11
+ export declare class AccountNotFoundError extends Error {
12
+ readonly userId: string;
13
+ constructor(userId: string);
14
+ }
15
+ export declare class IdempotencyConflictError extends Error {
16
+ readonly key: string;
17
+ constructor(key: string);
18
+ }
19
+ export declare class LedgerUnavailableError extends Error {
20
+ readonly cause_message: string;
21
+ constructor(reason: string);
22
+ }
23
+ export declare class AuditDegradedError extends Error {
24
+ readonly cause_message: string;
25
+ constructor(reason: string);
26
+ }
27
+ export declare class VaultNotInitializedError extends Error {
28
+ readonly path: string;
29
+ constructor(path: string);
30
+ }
31
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAyB,SAAQ,KAAK;IAClD,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAO/D;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,MAAM,EAAE,MAAM;CAK1B;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC9C,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,MAAM,EAAE,MAAM;CAK1B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAClD,SAAgB,GAAG,EAAE,MAAM,CAAC;gBAEhB,GAAG,EAAE,MAAM;CAKvB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,SAAgB,aAAa,EAAE,MAAM,CAAC;gBAE1B,MAAM,EAAE,MAAM;CAK1B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,SAAgB,aAAa,EAAE,MAAM,CAAC;gBAE1B,MAAM,EAAE,MAAM;CAK1B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAClD,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,IAAI,EAAE,MAAM;CAKxB"}
@@ -0,0 +1,61 @@
1
+ export class InsufficientBalanceError extends Error {
2
+ userId;
3
+ required;
4
+ available;
5
+ constructor(userId, required, available) {
6
+ super(`Insufficient balance for user ${userId}: need ${required}, have ${available}`);
7
+ this.name = "InsufficientBalanceError";
8
+ this.userId = userId;
9
+ this.required = required;
10
+ this.available = available;
11
+ }
12
+ }
13
+ export class PolicyDeniedError extends Error {
14
+ reason;
15
+ constructor(reason) {
16
+ super(`Policy denied: ${reason}`);
17
+ this.name = "PolicyDeniedError";
18
+ this.reason = reason;
19
+ }
20
+ }
21
+ export class AccountNotFoundError extends Error {
22
+ userId;
23
+ constructor(userId) {
24
+ super(`Account not found for user: ${userId}`);
25
+ this.name = "AccountNotFoundError";
26
+ this.userId = userId;
27
+ }
28
+ }
29
+ export class IdempotencyConflictError extends Error {
30
+ key;
31
+ constructor(key) {
32
+ super(`Idempotency conflict for key: ${key}`);
33
+ this.name = "IdempotencyConflictError";
34
+ this.key = key;
35
+ }
36
+ }
37
+ export class LedgerUnavailableError extends Error {
38
+ cause_message;
39
+ constructor(reason) {
40
+ super(`Ledger unavailable: ${reason}`);
41
+ this.name = "LedgerUnavailableError";
42
+ this.cause_message = reason;
43
+ }
44
+ }
45
+ export class AuditDegradedError extends Error {
46
+ cause_message;
47
+ constructor(reason) {
48
+ super(`Audit degraded: ${reason}`);
49
+ this.name = "AuditDegradedError";
50
+ this.cause_message = reason;
51
+ }
52
+ }
53
+ export class VaultNotInitializedError extends Error {
54
+ path;
55
+ constructor(path) {
56
+ super(`Vault not initialized at: ${path}`);
57
+ this.name = "VaultNotInitializedError";
58
+ this.path = path;
59
+ }
60
+ }
61
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAClC,MAAM,CAAS;IACf,QAAQ,CAAS;IACjB,SAAS,CAAS;IAElC,YAAY,MAAc,EAAE,QAAgB,EAAE,SAAiB;QAC9D,KAAK,CAAC,iCAAiC,MAAM,UAAU,QAAQ,UAAU,SAAS,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;CACD;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC3B,MAAM,CAAS;IAE/B,YAAY,MAAc;QACzB,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC9B,MAAM,CAAS;IAE/B,YAAY,MAAc;QACzB,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;CACD;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAClC,GAAG,CAAS;IAE5B,YAAY,GAAW;QACtB,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;CACD;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAChC,aAAa,CAAS;IAEtC,YAAY,MAAc;QACzB,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC7B,CAAC;CACD;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC5B,aAAa,CAAS;IAEtC,YAAY,MAAc;QACzB,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC7B,CAAC;CACD;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAClC,IAAI,CAAS;IAE7B,YAAY,IAAY;QACvB,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;CACD"}
@@ -0,0 +1,7 @@
1
+ /** Generate a u128 bigint ID for TigerBeetle (time-based + random) */
2
+ export declare function tbId(): bigint;
3
+ /** Generate a string ID for trust records */
4
+ export declare function trustId(prefix: string): string;
5
+ /** FNV-1a 32-bit hash */
6
+ export declare function fnv1a32(str: string): number;
7
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/shared/ids.ts"],"names":[],"mappings":"AAEA,sEAAsE;AACtE,wBAAgB,IAAI,IAAI,MAAM,CAc7B;AAED,6CAA6C;AAC7C,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,yBAAyB;AACzB,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO3C"}
@@ -0,0 +1,31 @@
1
+ import { randomBytes } from "node:crypto";
2
+ /** Generate a u128 bigint ID for TigerBeetle (time-based + random) */
3
+ export function tbId() {
4
+ const buf = randomBytes(16);
5
+ const now = BigInt(Date.now());
6
+ buf[0] = Number((now >> 40n) & 0xffn);
7
+ buf[1] = Number((now >> 32n) & 0xffn);
8
+ buf[2] = Number((now >> 24n) & 0xffn);
9
+ buf[3] = Number((now >> 16n) & 0xffn);
10
+ buf[4] = Number((now >> 8n) & 0xffn);
11
+ buf[5] = Number(now & 0xffn);
12
+ let id = 0n;
13
+ for (let i = 0; i < 16; i++) {
14
+ id = (id << 8n) | BigInt(buf[i]);
15
+ }
16
+ return id;
17
+ }
18
+ /** Generate a string ID for trust records */
19
+ export function trustId(prefix) {
20
+ return `${prefix}_${Date.now().toString(36)}_${randomBytes(4).toString("hex")}`;
21
+ }
22
+ /** FNV-1a 32-bit hash */
23
+ export function fnv1a32(str) {
24
+ let hash = 0x811c9dc5;
25
+ for (let i = 0; i < str.length; i++) {
26
+ hash ^= str.charCodeAt(i);
27
+ hash = Math.imul(hash, 0x01000193);
28
+ }
29
+ return hash >>> 0;
30
+ }
31
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/shared/ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,sEAAsE;AACtE,MAAM,UAAU,IAAI;IACnB,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACtC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACtC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACtC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACtC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;IACrC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;IAC7B,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAW,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,OAAO,CAAC,MAAc;IACrC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,OAAO,CAAC,GAAW;IAClC,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,162 @@
1
+ import { z } from "zod";
2
+ export interface GovernanceReceipt {
3
+ transferId: string;
4
+ cost: number;
5
+ budgetRemaining: number;
6
+ auditHash: string;
7
+ chainPath: string;
8
+ receiptUrl: string | null;
9
+ settled: boolean;
10
+ model: string;
11
+ provider: string;
12
+ timestamp: string;
13
+ /** Present and true when the audit chain write failed (failure mode 15.3). */
14
+ auditDegraded?: boolean;
15
+ }
16
+ export interface GovernedResponse<T> {
17
+ response: T;
18
+ governance: GovernanceReceipt;
19
+ }
20
+ export declare const TrustConfigSchema: z.ZodObject<{
21
+ budget: z.ZodNumber;
22
+ tier: z.ZodDefault<z.ZodEnum<["free", "mini", "pro", "mega", "ultra"]>>;
23
+ proxy: z.ZodOptional<z.ZodString>;
24
+ key: z.ZodOptional<z.ZodString>;
25
+ policies: z.ZodDefault<z.ZodString>;
26
+ pii: z.ZodDefault<z.ZodEnum<["redact", "warn", "block", "off"]>>;
27
+ board: z.ZodDefault<z.ZodObject<{
28
+ enabled: z.ZodDefault<z.ZodBoolean>;
29
+ vetoThreshold: z.ZodDefault<z.ZodEnum<["low", "medium", "high", "critical"]>>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ enabled: boolean;
32
+ vetoThreshold: "low" | "medium" | "high" | "critical";
33
+ }, {
34
+ enabled?: boolean | undefined;
35
+ vetoThreshold?: "low" | "medium" | "high" | "critical" | undefined;
36
+ }>>;
37
+ circuitBreaker: z.ZodDefault<z.ZodObject<{
38
+ failureThreshold: z.ZodDefault<z.ZodNumber>;
39
+ resetTimeout: z.ZodDefault<z.ZodNumber>;
40
+ }, "strip", z.ZodTypeAny, {
41
+ failureThreshold: number;
42
+ resetTimeout: number;
43
+ }, {
44
+ failureThreshold?: number | undefined;
45
+ resetTimeout?: number | undefined;
46
+ }>>;
47
+ patterns: z.ZodDefault<z.ZodObject<{
48
+ enabled: z.ZodDefault<z.ZodBoolean>;
49
+ feedProxy: z.ZodDefault<z.ZodBoolean>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ enabled: boolean;
52
+ feedProxy: boolean;
53
+ }, {
54
+ enabled?: boolean | undefined;
55
+ feedProxy?: boolean | undefined;
56
+ }>>;
57
+ audit: z.ZodDefault<z.ZodObject<{
58
+ rotation: z.ZodDefault<z.ZodEnum<["daily", "weekly", "none"]>>;
59
+ indexLimit: z.ZodDefault<z.ZodNumber>;
60
+ }, "strip", z.ZodTypeAny, {
61
+ rotation: "daily" | "weekly" | "none";
62
+ indexLimit: number;
63
+ }, {
64
+ rotation?: "daily" | "weekly" | "none" | undefined;
65
+ indexLimit?: number | undefined;
66
+ }>>;
67
+ tigerbeetle: z.ZodDefault<z.ZodObject<{
68
+ addresses: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
69
+ clusterId: z.ZodDefault<z.ZodNumber>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ addresses: string[];
72
+ clusterId: number;
73
+ }, {
74
+ addresses?: string[] | undefined;
75
+ clusterId?: number | undefined;
76
+ }>>;
77
+ }, "strip", z.ZodTypeAny, {
78
+ audit: {
79
+ rotation: "daily" | "weekly" | "none";
80
+ indexLimit: number;
81
+ };
82
+ budget: number;
83
+ tier: "free" | "mini" | "pro" | "mega" | "ultra";
84
+ policies: string;
85
+ pii: "redact" | "warn" | "block" | "off";
86
+ board: {
87
+ enabled: boolean;
88
+ vetoThreshold: "low" | "medium" | "high" | "critical";
89
+ };
90
+ circuitBreaker: {
91
+ failureThreshold: number;
92
+ resetTimeout: number;
93
+ };
94
+ patterns: {
95
+ enabled: boolean;
96
+ feedProxy: boolean;
97
+ };
98
+ tigerbeetle: {
99
+ addresses: string[];
100
+ clusterId: number;
101
+ };
102
+ proxy?: string | undefined;
103
+ key?: string | undefined;
104
+ }, {
105
+ budget: number;
106
+ audit?: {
107
+ rotation?: "daily" | "weekly" | "none" | undefined;
108
+ indexLimit?: number | undefined;
109
+ } | undefined;
110
+ tier?: "free" | "mini" | "pro" | "mega" | "ultra" | undefined;
111
+ proxy?: string | undefined;
112
+ key?: string | undefined;
113
+ policies?: string | undefined;
114
+ pii?: "redact" | "warn" | "block" | "off" | undefined;
115
+ board?: {
116
+ enabled?: boolean | undefined;
117
+ vetoThreshold?: "low" | "medium" | "high" | "critical" | undefined;
118
+ } | undefined;
119
+ circuitBreaker?: {
120
+ failureThreshold?: number | undefined;
121
+ resetTimeout?: number | undefined;
122
+ } | undefined;
123
+ patterns?: {
124
+ enabled?: boolean | undefined;
125
+ feedProxy?: boolean | undefined;
126
+ } | undefined;
127
+ tigerbeetle?: {
128
+ addresses?: string[] | undefined;
129
+ clusterId?: number | undefined;
130
+ } | undefined;
131
+ }>;
132
+ export type TrustConfig = z.infer<typeof TrustConfigSchema>;
133
+ export type PolicyEffect = "deny" | "warn";
134
+ export type PolicyEnforcement = "hard" | "soft";
135
+ export type PolicySeverity = "critical" | "high" | "medium" | "low" | "info";
136
+ export interface PolicyRule {
137
+ name: string;
138
+ effect: PolicyEffect;
139
+ enforcement: PolicyEnforcement;
140
+ severity?: PolicySeverity;
141
+ conditions: FieldCondition[];
142
+ }
143
+ export type FieldOperator = "exists" | "not_exists" | "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "in" | "not_in" | "contains" | "regex";
144
+ export interface FieldCondition {
145
+ field: string;
146
+ operator: FieldOperator;
147
+ value?: unknown;
148
+ }
149
+ export interface AuditEvent {
150
+ id: string;
151
+ timestamp: string;
152
+ previousHash: string;
153
+ hash: string;
154
+ kind: string;
155
+ actor: string;
156
+ data: Record<string, unknown>;
157
+ }
158
+ export type BoardDecision = "approved" | "blocked" | "escalated";
159
+ export type ConcernType = "hallucination" | "bias" | "safety" | "scope_creep" | "resource_abuse" | "policy_violation";
160
+ export type DirectorVote = "approve" | "veto" | "abstain";
161
+ export type LLMClientKind = "anthropic" | "openai" | "google";
162
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,iBAAiB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC;IACZ,UAAU,EAAE,iBAAiB,CAAC;CAC9B;AAGD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqC5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAG5D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAC3C,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAChD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7E,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,GACtB,QAAQ,GACR,YAAY,GACZ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,QAAQ,GACR,UAAU,GACV,OAAO,CAAC;AAEX,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAGD,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAGD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AACjE,MAAM,MAAM,WAAW,GACpB,eAAe,GACf,MAAM,GACN,QAAQ,GACR,aAAa,GACb,gBAAgB,GAChB,kBAAkB,CAAC;AACtB,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ // ── Config schema ──
3
+ export const TrustConfigSchema = z.object({
4
+ budget: z.number().int().positive(),
5
+ tier: z.enum(["free", "mini", "pro", "mega", "ultra"]).default("mini"),
6
+ proxy: z.string().url().optional(),
7
+ key: z.string().optional(),
8
+ policies: z.string().default("./policies/default.yml"),
9
+ pii: z.enum(["redact", "warn", "block", "off"]).default("warn"),
10
+ board: z
11
+ .object({
12
+ enabled: z.boolean().default(false),
13
+ vetoThreshold: z.enum(["low", "medium", "high", "critical"]).default("high"),
14
+ })
15
+ .default({}),
16
+ circuitBreaker: z
17
+ .object({
18
+ failureThreshold: z.number().int().default(5),
19
+ resetTimeout: z.number().int().default(60_000),
20
+ })
21
+ .default({}),
22
+ patterns: z
23
+ .object({
24
+ enabled: z.boolean().default(true),
25
+ feedProxy: z.boolean().default(false),
26
+ })
27
+ .default({}),
28
+ audit: z
29
+ .object({
30
+ rotation: z.enum(["daily", "weekly", "none"]).default("daily"),
31
+ indexLimit: z.number().int().default(10_000),
32
+ })
33
+ .default({}),
34
+ tigerbeetle: z
35
+ .object({
36
+ addresses: z.array(z.string()).default(["127.0.0.1:3001"]),
37
+ clusterId: z.number().int().nonnegative().default(0),
38
+ })
39
+ .default({}),
40
+ });
41
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwBxB,sBAAsB;AACtB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACnC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACtE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACtD,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/D,KAAK,EAAE,CAAC;SACN,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KAC5E,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;IACb,cAAc,EAAE,CAAC;SACf,MAAM,CAAC;QACP,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;KAC9C,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;IACb,QAAQ,EAAE,CAAC;SACT,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAClC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;KACrC,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;IACb,KAAK,EAAE,CAAC;SACN,MAAM,CAAC;QACP,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC9D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;KAC5C,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;SACZ,MAAM,CAAC;QACP,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC1D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;KACpD,CAAC;SACD,OAAO,CAAC,EAAE,CAAC;CACb,CAAC,CAAC"}