usertrust 1.2.5 → 1.4.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 (106) hide show
  1. package/README.md +9 -9
  2. package/dist/anomaly/detector.d.ts +17 -0
  3. package/dist/anomaly/detector.d.ts.map +1 -0
  4. package/dist/anomaly/detector.js +174 -0
  5. package/dist/anomaly/detector.js.map +1 -0
  6. package/dist/anomaly/index.d.ts +8 -0
  7. package/dist/anomaly/index.d.ts.map +1 -0
  8. package/dist/anomaly/index.js +8 -0
  9. package/dist/anomaly/index.js.map +1 -0
  10. package/dist/anomaly/signals/injection-cascade.d.ts +31 -0
  11. package/dist/anomaly/signals/injection-cascade.d.ts.map +1 -0
  12. package/dist/anomaly/signals/injection-cascade.js +46 -0
  13. package/dist/anomaly/signals/injection-cascade.js.map +1 -0
  14. package/dist/anomaly/signals/spend-velocity.d.ts +41 -0
  15. package/dist/anomaly/signals/spend-velocity.d.ts.map +1 -0
  16. package/dist/anomaly/signals/spend-velocity.js +90 -0
  17. package/dist/anomaly/signals/spend-velocity.js.map +1 -0
  18. package/dist/anomaly/signals/token-rate.d.ts +46 -0
  19. package/dist/anomaly/signals/token-rate.d.ts.map +1 -0
  20. package/dist/anomaly/signals/token-rate.js +90 -0
  21. package/dist/anomaly/signals/token-rate.js.map +1 -0
  22. package/dist/anomaly/types.d.ts +103 -0
  23. package/dist/anomaly/types.d.ts.map +1 -0
  24. package/dist/anomaly/types.js +4 -0
  25. package/dist/anomaly/types.js.map +1 -0
  26. package/dist/audit/chain.d.ts +9 -0
  27. package/dist/audit/chain.d.ts.map +1 -1
  28. package/dist/audit/chain.js +65 -9
  29. package/dist/audit/chain.js.map +1 -1
  30. package/dist/audit/verify.d.ts +19 -0
  31. package/dist/audit/verify.d.ts.map +1 -1
  32. package/dist/audit/verify.js +216 -14
  33. package/dist/audit/verify.js.map +1 -1
  34. package/dist/cli/init.d.ts.map +1 -1
  35. package/dist/cli/init.js +9 -1
  36. package/dist/cli/init.js.map +1 -1
  37. package/dist/cli/skill.d.ts.map +1 -1
  38. package/dist/cli/skill.js +35 -5
  39. package/dist/cli/skill.js.map +1 -1
  40. package/dist/cli/snapshot.d.ts.map +1 -1
  41. package/dist/cli/snapshot.js +20 -2
  42. package/dist/cli/snapshot.js.map +1 -1
  43. package/dist/cli/verify.d.ts.map +1 -1
  44. package/dist/cli/verify.js +20 -11
  45. package/dist/cli/verify.js.map +1 -1
  46. package/dist/govern.d.ts +14 -3
  47. package/dist/govern.d.ts.map +1 -1
  48. package/dist/govern.js +367 -129
  49. package/dist/govern.js.map +1 -1
  50. package/dist/headless.d.ts.map +1 -1
  51. package/dist/headless.js +155 -36
  52. package/dist/headless.js.map +1 -1
  53. package/dist/index.d.ts +4 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +3 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/ledger/client.d.ts +14 -0
  58. package/dist/ledger/client.d.ts.map +1 -1
  59. package/dist/ledger/client.js +56 -0
  60. package/dist/ledger/client.js.map +1 -1
  61. package/dist/ledger/pricing.d.ts.map +1 -1
  62. package/dist/ledger/pricing.js +8 -2
  63. package/dist/ledger/pricing.js.map +1 -1
  64. package/dist/policy/default-rules.d.ts +18 -3
  65. package/dist/policy/default-rules.d.ts.map +1 -1
  66. package/dist/policy/default-rules.js +33 -15
  67. package/dist/policy/default-rules.js.map +1 -1
  68. package/dist/policy/gate.d.ts.map +1 -1
  69. package/dist/policy/gate.js +114 -16
  70. package/dist/policy/gate.js.map +1 -1
  71. package/dist/policy/injection.d.ts.map +1 -1
  72. package/dist/policy/injection.js +25 -16
  73. package/dist/policy/injection.js.map +1 -1
  74. package/dist/policy/pii.d.ts +20 -0
  75. package/dist/policy/pii.d.ts.map +1 -1
  76. package/dist/policy/pii.js +45 -2
  77. package/dist/policy/pii.js.map +1 -1
  78. package/dist/proxy.d.ts +17 -9
  79. package/dist/proxy.d.ts.map +1 -1
  80. package/dist/proxy.js +8 -36
  81. package/dist/proxy.js.map +1 -1
  82. package/dist/shared/errors.d.ts +8 -0
  83. package/dist/shared/errors.d.ts.map +1 -1
  84. package/dist/shared/errors.js +18 -0
  85. package/dist/shared/errors.js.map +1 -1
  86. package/dist/shared/types.d.ts +119 -0
  87. package/dist/shared/types.d.ts.map +1 -1
  88. package/dist/shared/types.js +37 -1
  89. package/dist/shared/types.js.map +1 -1
  90. package/dist/snapshot/checkpoint.d.ts +18 -2
  91. package/dist/snapshot/checkpoint.d.ts.map +1 -1
  92. package/dist/snapshot/checkpoint.js +101 -17
  93. package/dist/snapshot/checkpoint.js.map +1 -1
  94. package/dist/streaming.d.ts +21 -3
  95. package/dist/streaming.d.ts.map +1 -1
  96. package/dist/streaming.js +35 -8
  97. package/dist/streaming.js.map +1 -1
  98. package/dist/supply-chain/permissions.d.ts +16 -3
  99. package/dist/supply-chain/permissions.d.ts.map +1 -1
  100. package/dist/supply-chain/permissions.js +59 -9
  101. package/dist/supply-chain/permissions.js.map +1 -1
  102. package/dist/supply-chain/sign.d.ts +5 -2
  103. package/dist/supply-chain/sign.d.ts.map +1 -1
  104. package/dist/supply-chain/sign.js +10 -2
  105. package/dist/supply-chain/sign.js.map +1 -1
  106. package/package.json +2 -4
@@ -0,0 +1,90 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Usertools, Inc.
3
+ export const TOKEN_RATE_DEFAULTS = {
4
+ thresholdTokPerSec: 500,
5
+ windowMs: 2_000,
6
+ consecutiveWindows: 3,
7
+ };
8
+ export function resolveTokenRateConfig(cfg) {
9
+ return {
10
+ thresholdTokPerSec: cfg?.thresholdTokPerSec ?? TOKEN_RATE_DEFAULTS.thresholdTokPerSec,
11
+ windowMs: cfg?.windowMs ?? TOKEN_RATE_DEFAULTS.windowMs,
12
+ consecutiveWindows: cfg?.consecutiveWindows ?? TOKEN_RATE_DEFAULTS.consecutiveWindows,
13
+ };
14
+ }
15
+ export function createTokenRateSignal(cfg) {
16
+ const state = {
17
+ currentWindowTokens: 0,
18
+ currentWindowStartMs: 0,
19
+ consecutiveHotWindows: 0,
20
+ lastWindowRateTokPerSec: 0,
21
+ };
22
+ let initialized = false;
23
+ function rollWindowsTo(nowMs) {
24
+ // Roll forward: close completed windows, evaluate threshold, advance.
25
+ while (nowMs - state.currentWindowStartMs >= cfg.windowMs) {
26
+ const windowEndMs = state.currentWindowStartMs + cfg.windowMs;
27
+ const seconds = cfg.windowMs / 1_000;
28
+ const rate = state.currentWindowTokens / seconds;
29
+ state.lastWindowRateTokPerSec = rate;
30
+ if (rate >= cfg.thresholdTokPerSec) {
31
+ state.consecutiveHotWindows += 1;
32
+ }
33
+ else {
34
+ state.consecutiveHotWindows = 0;
35
+ }
36
+ state.currentWindowStartMs = windowEndMs;
37
+ state.currentWindowTokens = 0;
38
+ }
39
+ }
40
+ function observe(deltaTokens, nowMs) {
41
+ if (!initialized) {
42
+ state.currentWindowStartMs = nowMs;
43
+ initialized = true;
44
+ }
45
+ rollWindowsTo(nowMs);
46
+ state.currentWindowTokens += Math.max(0, deltaTokens);
47
+ }
48
+ function check(nowMs) {
49
+ if (!initialized) {
50
+ return {
51
+ tripped: false,
52
+ metric: 0,
53
+ threshold: cfg.thresholdTokPerSec,
54
+ hotWindows: 0,
55
+ };
56
+ }
57
+ rollWindowsTo(nowMs);
58
+ // Also evaluate the current (incomplete) window if it has surpassed threshold
59
+ // by enough margin to count: only if it would already be a "hot" window.
60
+ const elapsedMs = nowMs - state.currentWindowStartMs;
61
+ let inFlightHot = false;
62
+ let inFlightRate = 0;
63
+ if (elapsedMs > 0) {
64
+ inFlightRate = state.currentWindowTokens / (elapsedMs / 1_000);
65
+ // Only consider in-flight as "hot" once the window has accumulated meaningful
66
+ // data (>=50% elapsed) to avoid false positives from one large early chunk.
67
+ if (elapsedMs >= cfg.windowMs / 2 && inFlightRate >= cfg.thresholdTokPerSec) {
68
+ inFlightHot = true;
69
+ }
70
+ }
71
+ const effectiveHot = state.consecutiveHotWindows + (inFlightHot ? 1 : 0);
72
+ const tripped = effectiveHot >= cfg.consecutiveWindows;
73
+ const metric = Math.max(state.lastWindowRateTokPerSec, inFlightRate);
74
+ return {
75
+ tripped,
76
+ metric,
77
+ threshold: cfg.thresholdTokPerSec,
78
+ hotWindows: effectiveHot,
79
+ };
80
+ }
81
+ function reset() {
82
+ state.currentWindowTokens = 0;
83
+ state.currentWindowStartMs = 0;
84
+ state.consecutiveHotWindows = 0;
85
+ state.lastWindowRateTokPerSec = 0;
86
+ initialized = false;
87
+ }
88
+ return { state, observe, check, reset };
89
+ }
90
+ //# sourceMappingURL=token-rate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-rate.js","sourceRoot":"","sources":["../../../src/anomaly/signals/token-rate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * anomaly/types.ts — Shared types for the streaming anomaly detector.
3
+ *
4
+ * The detector is a per-operation observer attached to a streaming LLM call.
5
+ * It receives `observe(event)` calls for each chunk, accumulates per-signal
6
+ * state, and `check()` returns a verdict. On a "trip" verdict, the caller
7
+ * should VOID the PENDING hold, throw `AnomalyError`, and emit a hash-chained
8
+ * `anomaly_detected` audit event.
9
+ */
10
+ import type { LLMClientKind } from "../shared/types.js";
11
+ /** The three signal types the detector watches. */
12
+ export type AnomalyKind = "token_rate" | "spend_velocity" | "injection_cascade";
13
+ /** Token-rate signal config. */
14
+ export interface TokenRateConfig {
15
+ /** Threshold tokens-per-second above which a window is "hot". Default 500. */
16
+ thresholdTokPerSec?: number;
17
+ /** Window size in milliseconds. Default 2000. */
18
+ windowMs?: number;
19
+ /** Number of consecutive hot windows required to trip. Default 3. */
20
+ consecutiveWindows?: number;
21
+ }
22
+ /** Spend-velocity signal config. */
23
+ export interface SpendVelocityConfig {
24
+ /** Maximum dollars per minute (rolling). Default 1.00. */
25
+ thresholdDollarsPerMin?: number;
26
+ /** Rolling window in milliseconds. Default 10000. */
27
+ windowMs?: number;
28
+ }
29
+ /** Injection-cascade signal config. */
30
+ export interface InjectionCascadeConfig {
31
+ /** Number of injection events to trip. Default 3. */
32
+ eventCount?: number;
33
+ /** Window in milliseconds. Default 60000. */
34
+ windowMs?: number;
35
+ }
36
+ /** Top-level anomaly governance config (extends TrustConfig). */
37
+ export interface AnomalyConfig {
38
+ /** Enable streaming anomaly detection. Default: false (opt-in). */
39
+ enabled?: boolean;
40
+ tokenRate?: TokenRateConfig;
41
+ spendVelocity?: SpendVelocityConfig;
42
+ injectionCascade?: InjectionCascadeConfig;
43
+ /** Cooldown after a trip before auto-reset. Default 30000 ms. */
44
+ cooldownMs?: number;
45
+ }
46
+ /** Resolved (defaulted) config used internally. */
47
+ export interface ResolvedAnomalyConfig {
48
+ enabled: boolean;
49
+ tokenRate: Required<TokenRateConfig>;
50
+ spendVelocity: Required<SpendVelocityConfig>;
51
+ injectionCascade: Required<InjectionCascadeConfig>;
52
+ cooldownMs: number;
53
+ }
54
+ /** Per-chunk observation passed to the detector. */
55
+ export interface AnomalyChunkEvent {
56
+ kind: "chunk";
57
+ /** Tokens contained in this chunk (delta, not cumulative). */
58
+ deltaTokens: number;
59
+ /** Cumulative input tokens reported by provider so far (or last estimate). */
60
+ cumulativeInputTokens: number;
61
+ /** Cumulative output tokens reported by provider so far (or last estimate). */
62
+ cumulativeOutputTokens: number;
63
+ /** Wall-clock timestamp. Defaults to Date.now() if omitted. */
64
+ at?: number;
65
+ }
66
+ /** Out-of-band injection event (fired when detect.injection finds something). */
67
+ export interface AnomalyInjectionEvent {
68
+ kind: "injection";
69
+ at?: number;
70
+ patterns?: string[];
71
+ }
72
+ export type AnomalyEvent = AnomalyChunkEvent | AnomalyInjectionEvent;
73
+ /** Detector verdict after each observation or on demand. */
74
+ export type AnomalyVerdict = {
75
+ tripped: false;
76
+ } | {
77
+ tripped: true;
78
+ kind: AnomalyKind;
79
+ message: string;
80
+ /** Numeric metric that crossed the threshold (e.g., 612.4 for tok/s). */
81
+ metric: number;
82
+ /** The configured threshold the metric crossed. */
83
+ threshold: number;
84
+ };
85
+ export interface AnomalyDetectorOptions {
86
+ /** The provider kind being observed (used for audit/log context). */
87
+ provider?: LLMClientKind;
88
+ /** Model name being observed (used for cost calculation in spend-velocity). */
89
+ model?: string;
90
+ /** Override the cost calculator (for testing). Returns dollars for given tokens. */
91
+ costCalculator?: (model: string, inputTokens: number, outputTokens: number) => number;
92
+ /** Time source override (for deterministic tests). */
93
+ now?: () => number;
94
+ }
95
+ export interface AnomalyDetectorState {
96
+ /** Whether the detector is currently in a tripped state (post-trip, pre-cooldown). */
97
+ tripped: boolean;
98
+ /** When the trip occurred (ms since epoch), if tripped. */
99
+ trippedAt: number | null;
100
+ /** The kind that tripped, if tripped. */
101
+ trippedKind: AnomalyKind | null;
102
+ }
103
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/anomaly/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Usertools, Inc.
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/anomaly/types.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC"}
@@ -11,6 +11,15 @@ export interface AuditWriter {
11
11
  flush(): Promise<void>;
12
12
  release(): void;
13
13
  }
14
+ /**
15
+ * Run `fn` while holding the audit writer's advisory lock for the vault whose
16
+ * audit log is `logPath`. Acquires the same in-process live-writer registration
17
+ * + on-disk lock that {@link createAuditWriter} uses, so a live writer on the
18
+ * same vault in this process is refused. Use this to mutate the audit log
19
+ * outside the writer (e.g. snapshot restore) without risking a forked chain.
20
+ * The lock is always released, even if `fn` throws.
21
+ */
22
+ export declare function withAuditWriterLock<T>(logPath: string, fn: () => Promise<T> | T): Promise<T>;
14
23
  /**
15
24
  * Create an audit writer instance for the given vault path.
16
25
  *
@@ -1 +1 @@
1
- {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/audit/chain.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC3B,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,gBAAgB,IAAI,MAAM,CAAC;IAC3B,UAAU,IAAI,OAAO,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;CAChB;AAmQD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAyGhE"}
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../../src/audit/chain.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC3B,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,gBAAgB,IAAI,MAAM,CAAC;IAC3B,UAAU,IAAI,OAAO,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;CAChB;AA4MD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAC1C,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACtB,OAAO,CAAC,CAAC,CAAC,CASZ;AAmGD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAmHhE"}
@@ -34,17 +34,30 @@ class AsyncMutex {
34
34
  return release;
35
35
  }
36
36
  }
37
- // ── Advisory Lock ──
37
+ /**
38
+ * Dirs currently locked by a LIVE writer in THIS process → dir → writerId.
39
+ *
40
+ * A same-PID lock file is only safe to reclaim when NO live writer in this
41
+ * process owns the dir (i.e. the lock is from a crashed prior instance or a
42
+ * recycled PID). This registry is what distinguishes a crashed writer from a
43
+ * live sibling — reclaiming a live sibling's lock would fork the chain, which
44
+ * is exactly the vulnerability the advisory lock exists to prevent.
45
+ */
46
+ const inProcessLockOwners = new Map();
38
47
  /**
39
48
  * Check if a lock file is stale (held by a dead process).
40
49
  * Returns true if stale and cleaned up, false if held by a live process.
41
50
  * Throws if the lock is actively held.
42
51
  */
43
- function tryCleanStaleLock(candidateLockPath) {
52
+ function tryCleanStaleLock(candidateLockPath, dir) {
44
53
  try {
45
54
  const content = readFileSync(candidateLockPath, "utf-8");
46
55
  const lockData = JSON.parse(content);
47
- if (lockData.pid === process.pid) {
56
+ if (lockData.pid === process.pid && !inProcessLockOwners.has(dir)) {
57
+ // Same PID but no live writer registered for this dir → the lock is
58
+ // from a crashed prior instance (the registry is cleared on release)
59
+ // or a recycled PID. A live sibling is caught earlier by the registry
60
+ // guard in acquireProcessLock, which throws before we ever get here.
48
61
  console.warn(`[AUDIT] Reclaiming stale same-PID lock (PID ${process.pid}). Previous process exited without releasing the lock.`);
49
62
  unlinkSync(candidateLockPath);
50
63
  return true;
@@ -83,16 +96,24 @@ function tryCleanStaleLock(candidateLockPath) {
83
96
  return true;
84
97
  }
85
98
  }
86
- function acquireProcessLock(logPath, locksByDir) {
99
+ function acquireProcessLock(logPath, locksByDir, writerId) {
87
100
  const dir = dirname(logPath);
88
101
  if (locksByDir.has(dir))
89
102
  return;
103
+ // AUD-471: A live writer already holds this dir in THIS process → refuse.
104
+ // The advisory lock guarantees exactly one writer per vault per process;
105
+ // reclaiming a live sibling's lock (same-PID) would fork the chain because
106
+ // each writer keeps an independent tail cache.
107
+ if (inProcessLockOwners.has(dir)) {
108
+ throw new Error(`Audit writer lock held by another writer in this process (dir ${dir}). Only one writer per vault per process.`);
109
+ }
90
110
  const candidateLockPath = `${dir}/.audit-writer.lock`;
91
111
  // AUD-458: Use O_WRONLY | O_CREAT | O_EXCL atomically instead of existsSync + openSync('wx').
92
112
  // This eliminates the TOCTOU race where two processes both detect a stale lock,
93
113
  // both unlink, and both try to create — one gets EEXIST.
94
114
  const lockContent = JSON.stringify({
95
115
  pid: process.pid,
116
+ writerId,
96
117
  startedAt: new Date().toISOString(),
97
118
  });
98
119
  // First attempt: atomic exclusive create
@@ -106,7 +127,8 @@ function acquireProcessLock(logPath, locksByDir) {
106
127
  // AUD-459: Close fd immediately — lock semantics rely on file existence, not open fd
107
128
  closeSync(fd);
108
129
  }
109
- locksByDir.set(dir, { path: candidateLockPath });
130
+ locksByDir.set(dir, { path: candidateLockPath, writerId });
131
+ inProcessLockOwners.set(dir, writerId);
110
132
  return;
111
133
  }
112
134
  catch (err) {
@@ -116,7 +138,7 @@ function acquireProcessLock(logPath, locksByDir) {
116
138
  // File exists — check if stale
117
139
  }
118
140
  // Lock file exists — check if it's stale and clean up if so
119
- tryCleanStaleLock(candidateLockPath);
141
+ tryCleanStaleLock(candidateLockPath, dir);
120
142
  // Second attempt after stale lock cleanup. If another process raced us and
121
143
  // already re-created the lock, EEXIST here means they won — report as held.
122
144
  try {
@@ -128,7 +150,8 @@ function acquireProcessLock(logPath, locksByDir) {
128
150
  finally {
129
151
  closeSync(fd);
130
152
  }
131
- locksByDir.set(dir, { path: candidateLockPath });
153
+ locksByDir.set(dir, { path: candidateLockPath, writerId });
154
+ inProcessLockOwners.set(dir, writerId);
132
155
  }
133
156
  catch (retryErr) {
134
157
  if (retryErr instanceof Error &&
@@ -149,9 +172,33 @@ function releaseLocks(locksByDir) {
149
172
  catch {
150
173
  /* already removed */
151
174
  }
175
+ // Clear the live-writer registration so a subsequent same-process writer
176
+ // (or a snapshot restore via withAuditWriterLock) can acquire the dir.
177
+ if (inProcessLockOwners.get(dir) === lock.writerId) {
178
+ inProcessLockOwners.delete(dir);
179
+ }
152
180
  locksByDir.delete(dir);
153
181
  }
154
182
  }
183
+ /**
184
+ * Run `fn` while holding the audit writer's advisory lock for the vault whose
185
+ * audit log is `logPath`. Acquires the same in-process live-writer registration
186
+ * + on-disk lock that {@link createAuditWriter} uses, so a live writer on the
187
+ * same vault in this process is refused. Use this to mutate the audit log
188
+ * outside the writer (e.g. snapshot restore) without risking a forked chain.
189
+ * The lock is always released, even if `fn` throws.
190
+ */
191
+ export async function withAuditWriterLock(logPath, fn) {
192
+ const locksByDir = new Map();
193
+ const writerId = randomUUID();
194
+ acquireProcessLock(logPath, locksByDir, writerId);
195
+ try {
196
+ return await fn();
197
+ }
198
+ finally {
199
+ releaseLocks(locksByDir);
200
+ }
201
+ }
155
202
  function getLastEvent(logPath, cache) {
156
203
  const cached = cache.get(logPath);
157
204
  if (cached)
@@ -237,6 +284,7 @@ export function createAuditWriter(vaultPath) {
237
284
  mkdirSync(auditDir, { recursive: true });
238
285
  }
239
286
  const logPath = join(auditDir, "events.jsonl");
287
+ const writerId = randomUUID();
240
288
  const mutex = new AsyncMutex();
241
289
  const lastEventCache = new Map();
242
290
  const locksByDir = new Map();
@@ -245,7 +293,7 @@ export function createAuditWriter(vaultPath) {
245
293
  async function appendEvent(input) {
246
294
  const release = await mutex.acquire();
247
295
  try {
248
- acquireProcessLock(logPath, locksByDir);
296
+ acquireProcessLock(logPath, locksByDir, writerId);
249
297
  const last = getLastEvent(logPath, lastEventCache);
250
298
  const previousHash = last?.hash ?? GENESIS_HASH;
251
299
  const sequence = (last?.sequence ?? 0) + 1;
@@ -264,9 +312,17 @@ export function createAuditWriter(vaultPath) {
264
312
  ...event,
265
313
  hash,
266
314
  };
315
+ // HARDEN: persist the CANONICAL bytes, not JSON.stringify output. The
316
+ // hash pre-image is `canonicalize(event)`; the verifier recomputes
317
+ // `sha256(canonicalize(persisted − hash))`. For any value with a
318
+ // `toJSON` (e.g. Buffer) `JSON.stringify` diverges from `canonicalize`,
319
+ // which would make an untampered event verify as TAMPERED. canonicalize
320
+ // is idempotent over its own output, so the bytes hashed equal the bytes
321
+ // persisted and the verify pkg stays in lockstep (hash format unchanged).
322
+ const persisted = canonicalize(fullEvent);
267
323
  const fd = openSync(logPath, "a");
268
324
  try {
269
- writeSync(fd, `${JSON.stringify(fullEvent)}\n`);
325
+ writeSync(fd, `${persisted}\n`);
270
326
  fsyncSync(fd);
271
327
  }
272
328
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/audit/chain.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EACN,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAkB9C,mBAAmB;AAEnB;;;;;;GAMG;AACH,MAAM,UAAU;IACP,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEjD,KAAK,CAAC,OAAO;QACZ,IAAI,OAAiC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC1C,OAAO,GAAG,OAAO,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,MAAM,IAAI,CAAC;QACX,OAAO,OAAqB,CAAC;IAC9B,CAAC;CACD;AAED,sBAAsB;AAEtB;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,iBAAyB;IACnD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAC;QACxD,IAAI,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CACX,+CAA+C,OAAO,CAAC,GAAG,wDAAwD,CAClH,CAAC;YACF,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC9B,kCAAkC;YAClC,MAAM,IAAI,KAAK,CACd,iCAAiC,QAAQ,CAAC,GAAG,6DAA6D,iBAAiB,EAAE,CAC7H,CAAC;QACH,CAAC;QAAC,OAAO,OAAgB,EAAE,CAAC;YAC3B,IAAI,OAAO,YAAY,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAI,OAA6B,CAAC,IAAI,CAAC;gBACjD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACtB,+BAA+B;oBAC/B,UAAU,CAAC,iBAAiB,CAAC,CAAC;oBAC9B,OAAO,IAAI,CAAC;gBACb,CAAC;gBACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CACd,iCAAiC,QAAQ,CAAC,GAAG,6DAA6D,iBAAiB,EAAE,CAC7H,CAAC;gBACH,CAAC;YACF,CAAC;YACD,MAAM,OAAO,CAAC;QACf,CAAC;IACF,CAAC;IAAC,OAAO,QAAQ,EAAE,CAAC;QACnB,IAAI,QAAQ,YAAY,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YACtF,MAAM,QAAQ,CAAC;QAChB,CAAC;QACD,gCAAgC;QAChC,IAAI,CAAC;YACJ,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACR,iBAAiB;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,UAAyC;IACrF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAEhC,MAAM,iBAAiB,GAAG,GAAG,GAAG,qBAAqB,CAAC;IAEtD,8FAA8F;IAC9F,gFAAgF;IAChF,yDAAyD;IACzD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;QAClC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACnC,CAAC,CAAC;IAEH,yCAAyC;IACzC,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,QAAQ,CAClB,iBAAiB,EACjB,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,EAC/D,KAAK,CACL,CAAC;QACF,IAAI,CAAC;YACJ,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3B,SAAS,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;gBAAS,CAAC;YACV,qFAAqF;YACrF,SAAS,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACjD,OAAO;IACR,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,IAAK,GAAyB,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC9F,MAAM,GAAG,CAAC;QACX,CAAC;QACD,+BAA+B;IAChC,CAAC;IAED,4DAA4D;IAC5D,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAErC,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,QAAQ,CAClB,iBAAiB,EACjB,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,EAC/D,KAAK,CACL,CAAC;QACF,IAAI,CAAC;YACJ,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3B,SAAS,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;gBAAS,CAAC;YACV,SAAS,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,QAAiB,EAAE,CAAC;QAC5B,IACC,QAAQ,YAAY,KAAK;YACzB,MAAM,IAAI,QAAQ;YACjB,QAA8B,CAAC,IAAI,KAAK,QAAQ,EAChD,CAAC;YACF,MAAM,IAAI,KAAK,CACd,uFAAuF,iBAAiB,EAAE,CAC1G,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,CAAC;IAChB,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,+DAA+D;AAC/D,SAAS,YAAY,CAAC,UAAyC;IAC9D,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC;YACJ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACR,qBAAqB;QACtB,CAAC;QACD,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;AACF,CAAC;AASD,SAAS,YAAY,CAAC,OAAe,EAAE,KAA8B;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,GAAG,OAAO,OAAO,CAAC;QACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAGtD,CAAC;gBACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACR,yBAAyB;YAC1B,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAuC,CAAC;QACzE,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACpF,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QACxD,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,QAAQ,GAAG,GAAG,OAAO,OAAO,CAAC;QACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAGtD,CAAC;gBACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACR,yBAAyB;YAC1B,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,mBAAmB;AAEnB,SAAS,eAAe,CACvB,SAAiB,EACjB,KAOC;IAED,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,gEAAgE;QAChE,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC;YACJ,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,SAAS,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;gBAAS,CAAC;YACV,SAAS,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,2DAA2D;QAC3D,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC;AAED,gBAAgB;AAEhB;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAsB,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IACvD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,UAAU,WAAW,CAAC,KAAuB;QACjD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC;YACJ,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAExC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC;YAChD,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAE3C,MAAM,KAAK,GAAoD;gBAC9D,EAAE,EAAE,UAAU,EAAE;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,YAAY;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ;aACR,CAAC;YAEF,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAElE,MAAM,SAAS,GAAsC;gBACpD,GAAG,KAAK;gBACR,IAAI;aACJ,CAAC;YAEF,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC;gBACJ,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChD,SAAS,CAAC,EAAE,CAAC,CAAC;YACf,CAAC;oBAAS,CAAC;gBACV,SAAS,CAAC,EAAE,CAAC,CAAC;YACf,CAAC;YACD,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEhD,kEAAkE;YAClE,MAAM,QAAQ,GAAG,GAAG,OAAO,OAAO,CAAC;YACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC;gBACJ,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAChE,SAAS,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;oBAAS,CAAC;gBACV,SAAS,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;YAED,OAAO,SAAS,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE;gBAC3D,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACvD,CAAC,CAAC;YACH,eAAe,CAAC,SAAS,EAAE;gBAC1B,MAAM,EAAE,yBAAyB;gBACjC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC,CAAC;YACH,MAAM,GAAG,CAAC;QACX,CAAC;gBAAS,CAAC;YACV,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAED,SAAS,gBAAgB;QACxB,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,SAAS,YAAY;QACpB,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,KAAK,UAAU,KAAK;QACnB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,SAAS,aAAa;QACrB,cAAc,CAAC,KAAK,EAAE,CAAC;QACvB,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,QAAQ,GAAG,KAAK,CAAC;QACjB,aAAa,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,OAAO;QACN,WAAW;QACX,gBAAgB;QAChB,UAAU,EAAE,YAAY;QACxB,KAAK;QACL,OAAO,EAAE,aAAa;KACtB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/audit/chain.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,24 @@ export interface ChainVerificationResult {
6
6
  latestHash: string;
7
7
  verifiedAt: string;
8
8
  }
9
+ export interface VaultVerificationResult {
10
+ valid: boolean;
11
+ errors: string[];
12
+ chainLength: number;
13
+ validHashes: number;
14
+ merkleRoot: string | null;
15
+ firstEvent: string | null;
16
+ lastEvent: string | null;
17
+ }
9
18
  export declare function verifyChain(logPath: string): ChainVerificationResult;
19
+ /**
20
+ * Verify an entire `.usertrust` vault directory, anchored to the `.meta` head.
21
+ *
22
+ * Gathers `events.jsonl` plus every rotated `*.jsonl` segment, orders all events
23
+ * by the persisted global `sequence`, walks a single continuous chain (GENESIS
24
+ * required only at the global head), enforces sequence continuity (so whole-
25
+ * segment deletion surfaces as a sequence gap rather than an indistinguishable
26
+ * "previousHash mismatch"), and checks the `.meta` tail anchor.
27
+ */
28
+ export declare function verifyVault(vaultPath: string): VaultVerificationResult;
10
29
  //# sourceMappingURL=verify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/audit/verify.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAiFpE"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/audit/verify.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AA0BD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAgGpE;AAaD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB,CAuKtE"}