usertrust 1.3.0 → 1.5.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 (94) hide show
  1. package/README.md +9 -9
  2. package/dist/anomaly/detector.d.ts.map +1 -1
  3. package/dist/anomaly/detector.js +36 -11
  4. package/dist/anomaly/detector.js.map +1 -1
  5. package/dist/anomaly/signals/spend-velocity.d.ts +39 -12
  6. package/dist/anomaly/signals/spend-velocity.d.ts.map +1 -1
  7. package/dist/anomaly/signals/spend-velocity.js +66 -43
  8. package/dist/anomaly/signals/spend-velocity.js.map +1 -1
  9. package/dist/anomaly/signals/token-rate.d.ts +33 -13
  10. package/dist/anomaly/signals/token-rate.d.ts.map +1 -1
  11. package/dist/anomaly/signals/token-rate.js +124 -38
  12. package/dist/anomaly/signals/token-rate.js.map +1 -1
  13. package/dist/anomaly/types.d.ts +28 -6
  14. package/dist/anomaly/types.d.ts.map +1 -1
  15. package/dist/audit/chain.d.ts +9 -0
  16. package/dist/audit/chain.d.ts.map +1 -1
  17. package/dist/audit/chain.js +65 -9
  18. package/dist/audit/chain.js.map +1 -1
  19. package/dist/audit/verify.d.ts +19 -0
  20. package/dist/audit/verify.d.ts.map +1 -1
  21. package/dist/audit/verify.js +216 -14
  22. package/dist/audit/verify.js.map +1 -1
  23. package/dist/cli/init.d.ts.map +1 -1
  24. package/dist/cli/init.js +107 -2
  25. package/dist/cli/init.js.map +1 -1
  26. package/dist/cli/main.js +0 -0
  27. package/dist/cli/skill.d.ts.map +1 -1
  28. package/dist/cli/skill.js +35 -5
  29. package/dist/cli/skill.js.map +1 -1
  30. package/dist/cli/snapshot.d.ts.map +1 -1
  31. package/dist/cli/snapshot.js +20 -2
  32. package/dist/cli/snapshot.js.map +1 -1
  33. package/dist/cli/verify.d.ts.map +1 -1
  34. package/dist/cli/verify.js +20 -11
  35. package/dist/cli/verify.js.map +1 -1
  36. package/dist/detect.d.ts +34 -1
  37. package/dist/detect.d.ts.map +1 -1
  38. package/dist/detect.js +124 -0
  39. package/dist/detect.js.map +1 -1
  40. package/dist/govern.d.ts +13 -2
  41. package/dist/govern.d.ts.map +1 -1
  42. package/dist/govern.js +475 -127
  43. package/dist/govern.js.map +1 -1
  44. package/dist/headless.d.ts +41 -2
  45. package/dist/headless.d.ts.map +1 -1
  46. package/dist/headless.js +203 -35
  47. package/dist/headless.js.map +1 -1
  48. package/dist/index.d.ts +4 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +3 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/ledger/client.d.ts +14 -0
  53. package/dist/ledger/client.d.ts.map +1 -1
  54. package/dist/ledger/client.js +56 -0
  55. package/dist/ledger/client.js.map +1 -1
  56. package/dist/ledger/pricing.d.ts +54 -0
  57. package/dist/ledger/pricing.d.ts.map +1 -1
  58. package/dist/ledger/pricing.js +134 -8
  59. package/dist/ledger/pricing.js.map +1 -1
  60. package/dist/policy/default-rules.d.ts +18 -3
  61. package/dist/policy/default-rules.d.ts.map +1 -1
  62. package/dist/policy/default-rules.js +33 -15
  63. package/dist/policy/default-rules.js.map +1 -1
  64. package/dist/policy/gate.d.ts.map +1 -1
  65. package/dist/policy/gate.js +114 -16
  66. package/dist/policy/gate.js.map +1 -1
  67. package/dist/policy/injection.d.ts.map +1 -1
  68. package/dist/policy/injection.js +25 -16
  69. package/dist/policy/injection.js.map +1 -1
  70. package/dist/policy/pii.d.ts +20 -0
  71. package/dist/policy/pii.d.ts.map +1 -1
  72. package/dist/policy/pii.js +45 -2
  73. package/dist/policy/pii.js.map +1 -1
  74. package/dist/shared/types.d.ts +191 -0
  75. package/dist/shared/types.d.ts.map +1 -1
  76. package/dist/shared/types.js +67 -6
  77. package/dist/shared/types.js.map +1 -1
  78. package/dist/snapshot/checkpoint.d.ts +18 -2
  79. package/dist/snapshot/checkpoint.d.ts.map +1 -1
  80. package/dist/snapshot/checkpoint.js +101 -17
  81. package/dist/snapshot/checkpoint.js.map +1 -1
  82. package/dist/streaming.d.ts +8 -3
  83. package/dist/streaming.d.ts.map +1 -1
  84. package/dist/streaming.js +75 -31
  85. package/dist/streaming.js.map +1 -1
  86. package/dist/supply-chain/permissions.d.ts +16 -3
  87. package/dist/supply-chain/permissions.d.ts.map +1 -1
  88. package/dist/supply-chain/permissions.js +59 -9
  89. package/dist/supply-chain/permissions.js.map +1 -1
  90. package/dist/supply-chain/sign.d.ts +5 -2
  91. package/dist/supply-chain/sign.d.ts.map +1 -1
  92. package/dist/supply-chain/sign.js +10 -2
  93. package/dist/supply-chain/sign.js.map +1 -1
  94. package/package.json +2 -4
@@ -1,5 +1,32 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // Copyright 2026 Usertools, Inc.
3
+ /**
4
+ * token-rate.ts — Token-rate anomaly signal.
5
+ *
6
+ * Buckets observed chunks into fixed-width windows (default 2 s) and counts
7
+ * tokens-per-second within each window. Trips when N consecutive windows
8
+ * exceed the effective threshold (default 500 tok/s, 3 windows).
9
+ *
10
+ * Brief spikes (1-2 hot windows) are ignored — only sustained runaway
11
+ * behavior trips the circuit.
12
+ *
13
+ * M2 scoped thresholds: each observation may carry the event's model and
14
+ * endpointClass. Local-scope events select `perModel` (trailing-* glob,
15
+ * matched via matchModelPattern) first, then `localThresholdTokPerSec`
16
+ * (default 5000 — fast local GPU inference legitimately exceeds the cloud
17
+ * 500). Cloud/unscoped events keep the legacy `thresholdTokPerSec`. The
18
+ * check() result names which threshold applied via `thresholdLabel`.
19
+ *
20
+ * Cross-scope isolation: cloud and local keep SEPARATE rolling windows, each
21
+ * judged against its own threshold. A shared detector observes interleaved
22
+ * cloud+local streams, so a single mutable threshold/window would let one
23
+ * scope's chunks contaminate the other's verdict — a cloud runaway inheriting
24
+ * the 10x local threshold (evasion), or a local burst false-tripping the cloud
25
+ * 500. Mirrors the dual-series pattern in spend-velocity.ts.
26
+ */
27
+ import { matchModelPattern } from "../../ledger/pricing.js";
28
+ /** Default local-scope threshold, applied where consumed (resolved config keeps it optional). */
29
+ const LOCAL_THRESHOLD_TOK_PER_SEC_DEFAULT = 5_000;
3
30
  export const TOKEN_RATE_DEFAULTS = {
4
31
  thresholdTokPerSec: 500,
5
32
  windowMs: 2_000,
@@ -8,82 +35,141 @@ export const TOKEN_RATE_DEFAULTS = {
8
35
  export function resolveTokenRateConfig(cfg) {
9
36
  return {
10
37
  thresholdTokPerSec: cfg?.thresholdTokPerSec ?? TOKEN_RATE_DEFAULTS.thresholdTokPerSec,
38
+ // M2 fields stay optional in resolved config — defaulted where consumed.
39
+ localThresholdTokPerSec: cfg?.localThresholdTokPerSec,
40
+ perModel: cfg?.perModel,
11
41
  windowMs: cfg?.windowMs ?? TOKEN_RATE_DEFAULTS.windowMs,
12
42
  consecutiveWindows: cfg?.consecutiveWindows ?? TOKEN_RATE_DEFAULTS.consecutiveWindows,
13
43
  };
14
44
  }
15
45
  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) {
46
+ const localDefaultThreshold = cfg.localThresholdTokPerSec ?? LOCAL_THRESHOLD_TOK_PER_SEC_DEFAULT;
47
+ function makeWindow(threshold, label) {
48
+ return {
49
+ currentWindowTokens: 0,
50
+ currentWindowStartMs: 0,
51
+ consecutiveHotWindows: 0,
52
+ lastWindowRateTokPerSec: 0,
53
+ initialized: false,
54
+ threshold,
55
+ thresholdLabel: label,
56
+ };
57
+ }
58
+ // Independent per-scope windows: cloud/unscoped events accumulate against the
59
+ // legacy threshold, local events against the local/perModel threshold. Neither
60
+ // can move the other's threshold or window (evasion + false-trip fix).
61
+ const cloud = makeWindow(cfg.thresholdTokPerSec, "thresholdTokPerSec");
62
+ const local = makeWindow(localDefaultThreshold, "localThresholdTokPerSec");
63
+ const state = { cloud, local };
64
+ /** Resolve the local-scope threshold/label for an event's model (perModel glob first). */
65
+ function applyLocalThreshold(model) {
66
+ if (model !== undefined && cfg.perModel !== undefined) {
67
+ const match = matchModelPattern(model, cfg.perModel);
68
+ if (match !== undefined) {
69
+ local.threshold = match.value;
70
+ local.thresholdLabel = `perModel["${match.pattern}"]`;
71
+ return;
72
+ }
73
+ }
74
+ local.threshold = localDefaultThreshold;
75
+ local.thresholdLabel = "localThresholdTokPerSec";
76
+ }
77
+ function rollWindowsTo(w, nowMs) {
24
78
  // Roll forward: close completed windows, evaluate threshold, advance.
25
- while (nowMs - state.currentWindowStartMs >= cfg.windowMs) {
26
- const windowEndMs = state.currentWindowStartMs + cfg.windowMs;
79
+ while (nowMs - w.currentWindowStartMs >= cfg.windowMs) {
80
+ const windowEndMs = w.currentWindowStartMs + cfg.windowMs;
27
81
  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;
82
+ const rate = w.currentWindowTokens / seconds;
83
+ w.lastWindowRateTokPerSec = rate;
84
+ if (rate >= w.threshold) {
85
+ w.consecutiveHotWindows += 1;
32
86
  }
33
87
  else {
34
- state.consecutiveHotWindows = 0;
88
+ w.consecutiveHotWindows = 0;
35
89
  }
36
- state.currentWindowStartMs = windowEndMs;
37
- state.currentWindowTokens = 0;
90
+ w.currentWindowStartMs = windowEndMs;
91
+ w.currentWindowTokens = 0;
38
92
  }
39
93
  }
40
- function observe(deltaTokens, nowMs) {
41
- if (!initialized) {
42
- state.currentWindowStartMs = nowMs;
43
- initialized = true;
94
+ function observe(deltaTokens, nowMs, context) {
95
+ const w = context?.endpointClass === "local" ? local : cloud;
96
+ if (w === local) {
97
+ applyLocalThreshold(context?.model);
98
+ }
99
+ if (!w.initialized) {
100
+ w.currentWindowStartMs = nowMs;
101
+ w.initialized = true;
44
102
  }
45
- rollWindowsTo(nowMs);
46
- state.currentWindowTokens += Math.max(0, deltaTokens);
103
+ rollWindowsTo(w, nowMs);
104
+ w.currentWindowTokens += Math.max(0, deltaTokens);
47
105
  }
48
- function check(nowMs) {
49
- if (!initialized) {
106
+ /** Evaluate one scope's window against its own threshold. */
107
+ function evaluate(w, nowMs) {
108
+ if (!w.initialized) {
50
109
  return {
51
110
  tripped: false,
52
111
  metric: 0,
53
- threshold: cfg.thresholdTokPerSec,
112
+ threshold: w.threshold,
54
113
  hotWindows: 0,
114
+ thresholdLabel: w.thresholdLabel,
55
115
  };
56
116
  }
57
- rollWindowsTo(nowMs);
117
+ rollWindowsTo(w, nowMs);
58
118
  // Also evaluate the current (incomplete) window if it has surpassed threshold
59
119
  // by enough margin to count: only if it would already be a "hot" window.
60
- const elapsedMs = nowMs - state.currentWindowStartMs;
120
+ const elapsedMs = nowMs - w.currentWindowStartMs;
61
121
  let inFlightHot = false;
62
122
  let inFlightRate = 0;
63
123
  if (elapsedMs > 0) {
64
- inFlightRate = state.currentWindowTokens / (elapsedMs / 1_000);
124
+ inFlightRate = w.currentWindowTokens / (elapsedMs / 1_000);
65
125
  // Only consider in-flight as "hot" once the window has accumulated meaningful
66
126
  // data (>=50% elapsed) to avoid false positives from one large early chunk.
67
- if (elapsedMs >= cfg.windowMs / 2 && inFlightRate >= cfg.thresholdTokPerSec) {
127
+ if (elapsedMs >= cfg.windowMs / 2 && inFlightRate >= w.threshold) {
68
128
  inFlightHot = true;
69
129
  }
70
130
  }
71
- const effectiveHot = state.consecutiveHotWindows + (inFlightHot ? 1 : 0);
131
+ const effectiveHot = w.consecutiveHotWindows + (inFlightHot ? 1 : 0);
72
132
  const tripped = effectiveHot >= cfg.consecutiveWindows;
73
- const metric = Math.max(state.lastWindowRateTokPerSec, inFlightRate);
133
+ const metric = Math.max(w.lastWindowRateTokPerSec, inFlightRate);
74
134
  return {
75
135
  tripped,
76
136
  metric,
77
- threshold: cfg.thresholdTokPerSec,
137
+ threshold: w.threshold,
78
138
  hotWindows: effectiveHot,
139
+ thresholdLabel: w.thresholdLabel,
79
140
  };
80
141
  }
142
+ function check(nowMs) {
143
+ // Cloud is evaluated first so a cloud runaway is reported with the cloud
144
+ // threshold even while a slower local stream interleaves.
145
+ const cloudResult = evaluate(cloud, nowMs);
146
+ if (cloudResult.tripped)
147
+ return cloudResult;
148
+ const localResult = evaluate(local, nowMs);
149
+ if (localResult.tripped)
150
+ return localResult;
151
+ // Neither tripped: report the initialized scope closer to its threshold
152
+ // (higher metric/threshold ratio); default to cloud (legacy) otherwise.
153
+ if (!local.initialized)
154
+ return cloudResult;
155
+ if (!cloud.initialized)
156
+ return localResult;
157
+ const cloudRatio = cloudResult.threshold > 0 ? cloudResult.metric / cloudResult.threshold : 0;
158
+ const localRatio = localResult.threshold > 0 ? localResult.metric / localResult.threshold : 0;
159
+ return localRatio > cloudRatio ? localResult : cloudResult;
160
+ }
81
161
  function reset() {
82
- state.currentWindowTokens = 0;
83
- state.currentWindowStartMs = 0;
84
- state.consecutiveHotWindows = 0;
85
- state.lastWindowRateTokPerSec = 0;
86
- initialized = false;
162
+ for (const w of [cloud, local]) {
163
+ w.currentWindowTokens = 0;
164
+ w.currentWindowStartMs = 0;
165
+ w.consecutiveHotWindows = 0;
166
+ w.lastWindowRateTokPerSec = 0;
167
+ w.initialized = false;
168
+ }
169
+ cloud.threshold = cfg.thresholdTokPerSec;
170
+ cloud.thresholdLabel = "thresholdTokPerSec";
171
+ local.threshold = localDefaultThreshold;
172
+ local.thresholdLabel = "localThresholdTokPerSec";
87
173
  }
88
174
  return { state, observe, check, reset };
89
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token-rate.js","sourceRoot":"","sources":["../../../src/anomaly/signals/token-rate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"token-rate.js","sourceRoot":"","sources":["../../../src/anomaly/signals/token-rate.ts"],"names":[],"mappings":"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"}
@@ -7,13 +7,17 @@
7
7
  * should VOID the PENDING hold, throw `AnomalyError`, and emit a hash-chained
8
8
  * `anomaly_detected` audit event.
9
9
  */
10
- import type { LLMClientKind } from "../shared/types.js";
10
+ import type { EndpointClass, LLMClientKind } from "../shared/types.js";
11
11
  /** The three signal types the detector watches. */
12
12
  export type AnomalyKind = "token_rate" | "spend_velocity" | "injection_cascade";
13
13
  /** Token-rate signal config. */
14
14
  export interface TokenRateConfig {
15
15
  /** Threshold tokens-per-second above which a window is "hot". Default 500. */
16
16
  thresholdTokPerSec?: number;
17
+ /** Local-scope threshold tokens-per-second (M2). Default 5000. */
18
+ localThresholdTokPerSec?: number | undefined;
19
+ /** Per-model threshold overrides. Keys: exact model or trailing-* glob (M2). */
20
+ perModel?: Record<string, number> | undefined;
17
21
  /** Window size in milliseconds. Default 2000. */
18
22
  windowMs?: number;
19
23
  /** Number of consecutive hot windows required to trip. Default 3. */
@@ -23,6 +27,8 @@ export interface TokenRateConfig {
23
27
  export interface SpendVelocityConfig {
24
28
  /** Maximum dollars per minute (rolling). Default 1.00. */
25
29
  thresholdDollarsPerMin?: number;
30
+ /** Local-scope threshold in nominal usertokens per minute (M2). Default 10000. */
31
+ localThresholdUsertokensPerMin?: number | undefined;
26
32
  /** Rolling window in milliseconds. Default 10000. */
27
33
  windowMs?: number;
28
34
  }
@@ -43,11 +49,17 @@ export interface AnomalyConfig {
43
49
  /** Cooldown after a trip before auto-reset. Default 30000 ms. */
44
50
  cooldownMs?: number;
45
51
  }
46
- /** Resolved (defaulted) config used internally. */
52
+ /**
53
+ * Resolved (defaulted) config used internally.
54
+ *
55
+ * Legacy fields are fully defaulted; the M2 local-scope fields
56
+ * (localThresholdTokPerSec, perModel, localThresholdUsertokensPerMin) stay
57
+ * optional here and are defaulted at the signal when absent.
58
+ */
47
59
  export interface ResolvedAnomalyConfig {
48
60
  enabled: boolean;
49
- tokenRate: Required<TokenRateConfig>;
50
- spendVelocity: Required<SpendVelocityConfig>;
61
+ tokenRate: Required<Omit<TokenRateConfig, "localThresholdTokPerSec" | "perModel">> & Pick<TokenRateConfig, "localThresholdTokPerSec" | "perModel">;
62
+ spendVelocity: Required<Omit<SpendVelocityConfig, "localThresholdUsertokensPerMin">> & Pick<SpendVelocityConfig, "localThresholdUsertokensPerMin">;
51
63
  injectionCascade: Required<InjectionCascadeConfig>;
52
64
  cooldownMs: number;
53
65
  }
@@ -62,6 +74,10 @@ export interface AnomalyChunkEvent {
62
74
  cumulativeOutputTokens: number;
63
75
  /** Wall-clock timestamp. Defaults to Date.now() if omitted. */
64
76
  at?: number;
77
+ /** Model of the call this chunk belongs to. Overrides options.model when present (M2). */
78
+ model?: string | undefined;
79
+ /** Endpoint scope of the call this chunk belongs to. Default scope: cloud (M2). */
80
+ endpointClass?: EndpointClass | undefined;
65
81
  }
66
82
  /** Out-of-band injection event (fired when detect.injection finds something). */
67
83
  export interface AnomalyInjectionEvent {
@@ -87,8 +103,14 @@ export interface AnomalyDetectorOptions {
87
103
  provider?: LLMClientKind;
88
104
  /** Model name being observed (used for cost calculation in spend-velocity). */
89
105
  model?: string;
90
- /** Override the cost calculator (for testing). Returns dollars for given tokens. */
91
- costCalculator?: (model: string, inputTokens: number, outputTokens: number) => number;
106
+ /**
107
+ * Override the cost calculator. Returns the cost for the given cumulative tokens —
108
+ * dollars for cloud-scope events, nominal usertokens for local-scope events.
109
+ * The observed chunk event is passed as the optional 4th argument so an injected
110
+ * calculator can price per-event (scoped by event.model/event.endpointClass); 3-arg
111
+ * implementations remain assignable (backward compatible).
112
+ */
113
+ costCalculator?: (model: string, inputTokens: number, outputTokens: number, event?: AnomalyChunkEvent) => number;
92
114
  /** Time source override (for deterministic tests). */
93
115
  now?: () => number;
94
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/anomaly/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/anomaly/types.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
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"}