usertrust 1.4.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 (46) hide show
  1. package/dist/anomaly/detector.d.ts.map +1 -1
  2. package/dist/anomaly/detector.js +36 -11
  3. package/dist/anomaly/detector.js.map +1 -1
  4. package/dist/anomaly/signals/spend-velocity.d.ts +39 -12
  5. package/dist/anomaly/signals/spend-velocity.d.ts.map +1 -1
  6. package/dist/anomaly/signals/spend-velocity.js +66 -43
  7. package/dist/anomaly/signals/spend-velocity.js.map +1 -1
  8. package/dist/anomaly/signals/token-rate.d.ts +33 -13
  9. package/dist/anomaly/signals/token-rate.d.ts.map +1 -1
  10. package/dist/anomaly/signals/token-rate.js +124 -38
  11. package/dist/anomaly/signals/token-rate.js.map +1 -1
  12. package/dist/anomaly/types.d.ts +28 -6
  13. package/dist/anomaly/types.d.ts.map +1 -1
  14. package/dist/cli/init.d.ts.map +1 -1
  15. package/dist/cli/init.js +98 -1
  16. package/dist/cli/init.js.map +1 -1
  17. package/dist/cli/main.js +0 -0
  18. package/dist/detect.d.ts +34 -1
  19. package/dist/detect.d.ts.map +1 -1
  20. package/dist/detect.js +124 -0
  21. package/dist/detect.js.map +1 -1
  22. package/dist/govern.d.ts +8 -1
  23. package/dist/govern.d.ts.map +1 -1
  24. package/dist/govern.js +191 -12
  25. package/dist/govern.js.map +1 -1
  26. package/dist/headless.d.ts +41 -2
  27. package/dist/headless.d.ts.map +1 -1
  28. package/dist/headless.js +54 -3
  29. package/dist/headless.js.map +1 -1
  30. package/dist/index.d.ts +4 -3
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +3 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/ledger/pricing.d.ts +54 -0
  35. package/dist/ledger/pricing.d.ts.map +1 -1
  36. package/dist/ledger/pricing.js +128 -8
  37. package/dist/ledger/pricing.js.map +1 -1
  38. package/dist/shared/types.d.ts +175 -0
  39. package/dist/shared/types.d.ts.map +1 -1
  40. package/dist/shared/types.js +55 -5
  41. package/dist/shared/types.js.map +1 -1
  42. package/dist/streaming.d.ts +8 -3
  43. package/dist/streaming.d.ts.map +1 -1
  44. package/dist/streaming.js +61 -30
  45. package/dist/streaming.js.map +1 -1
  46. package/package.json +1 -1
@@ -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":"AAGA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAIhF,gCAAgC;AAChC,MAAM,WAAW,eAAe;IAC/B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,oCAAoC;AACpC,MAAM,WAAW,mBAAmB;IACnC,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,sBAAsB;IACtC,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC7B,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACrC,aAAa,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC7C,gBAAgB,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;CACnB;AAID,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,qBAAqB,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,sBAAsB,EAAE,MAAM,CAAC;IAC/B,+DAA+D;IAC/D,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,qBAAqB,CAAC;AAIrE,4DAA4D;AAC5D,MAAM,MAAM,cAAc,GACvB;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAClB;IACA,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;CACjB,CAAC;AAIL,MAAM,WAAW,sBAAsB;IACtC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IACtF,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACpC,sFAAsF;IACtF,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yCAAyC;IACzC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/anomaly/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAwCD,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuO5E"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAwED,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuS5E"}
package/dist/cli/init.js CHANGED
@@ -18,6 +18,11 @@ const ENV_VAR_MAP = {
18
18
  openai: "OPENAI_API_KEY",
19
19
  google: "GOOGLE_API_KEY",
20
20
  };
21
+ const LOCAL_PRESET_URLS = {
22
+ ollama: "http://localhost:11434",
23
+ lmstudio: "http://localhost:1234",
24
+ vllm: "http://localhost:8000",
25
+ };
21
26
  const DEFAULT_POLICY = `rules:
22
27
  - name: block-budget-overshoot
23
28
  effect: deny
@@ -47,6 +52,31 @@ const SUBDIRS = ["audit", "policies", "patterns", "snapshots", "board", "dlq"];
47
52
  function envVarName(provider) {
48
53
  return ENV_VAR_MAP[provider] ?? `${provider.toUpperCase()}_API_KEY`;
49
54
  }
55
+ /**
56
+ * Probe an OpenAI-compatible endpoint for its installed model list.
57
+ * Best-effort: global fetch with a 500ms AbortController timeout; any
58
+ * failure (endpoint down, non-200, bad JSON) returns an empty list and
59
+ * the wizard proceeds without a model list.
60
+ */
61
+ async function probeLocalModels(base) {
62
+ const controller = new AbortController();
63
+ const timer = setTimeout(() => controller.abort(), 500);
64
+ try {
65
+ const res = await fetch(`${base}/v1/models`, { signal: controller.signal });
66
+ if (!res.ok)
67
+ return [];
68
+ const body = (await res.json());
69
+ if (!Array.isArray(body.data))
70
+ return [];
71
+ return body.data.map((entry) => entry.id).filter((id) => typeof id === "string");
72
+ }
73
+ catch {
74
+ return [];
75
+ }
76
+ finally {
77
+ clearTimeout(timer);
78
+ }
79
+ }
50
80
  export async function run(rootDir, opts) {
51
81
  const root = rootDir ?? process.cwd();
52
82
  const vaultPath = join(root, VAULT_DIR);
@@ -234,12 +264,71 @@ export async function run(rootDir, opts) {
234
264
  clack.log.success(`Updated ${model}`);
235
265
  }
236
266
  }
237
- // Step 4: Create vault
267
+ // Step 4: Local inference — Ollama / LM Studio / vLLM endpoint presets.
268
+ // The chosen endpoint classifies as LOCAL scope: calls settle at nominal
269
+ // local rates (default {0,0} + the >=1 floor = 1 usertoken per call)
270
+ // instead of frontier fallback rates.
271
+ let endpoints;
272
+ let localModels;
273
+ // Opt-in confirm gate before the runtime picker (Task 7 integration fix):
274
+ // declining (the default) reproduces the pre-M2 prompt sequence exactly —
275
+ // the picker below (clack.select, a prompt primitive the pre-M2 wizard
276
+ // never used) is only reached on explicit opt-in, so existing interactive
277
+ // flows and their pinned tests observe an unchanged wizard.
278
+ const wantsLocal = await clack.confirm({
279
+ message: "Configure local inference (Ollama / LM Studio / vLLM)?",
280
+ initialValue: false,
281
+ });
282
+ if (clack.isCancel(wantsLocal)) {
283
+ clack.log.warn("Setup cancelled.");
284
+ return;
285
+ }
286
+ if (wantsLocal === true) {
287
+ const localChoice = await clack.select({
288
+ message: "Pick your local runtime:",
289
+ options: [
290
+ { value: "skip", label: "Skip — cloud providers only" },
291
+ { value: "ollama", label: `Ollama (${LOCAL_PRESET_URLS.ollama})` },
292
+ { value: "lmstudio", label: `LM Studio (${LOCAL_PRESET_URLS.lmstudio})` },
293
+ { value: "vllm", label: `vLLM (${LOCAL_PRESET_URLS.vllm})` },
294
+ ],
295
+ initialValue: "skip",
296
+ });
297
+ if (clack.isCancel(localChoice)) {
298
+ clack.log.warn("Setup cancelled.");
299
+ return;
300
+ }
301
+ if (localChoice !== "skip") {
302
+ const runtime = localChoice;
303
+ const base = LOCAL_PRESET_URLS[runtime];
304
+ endpoints = [{ match: base, class: "local", runtime }];
305
+ const s = clack.spinner();
306
+ s.start(`Probing ${base}/v1/models...`);
307
+ const models = await probeLocalModels(base);
308
+ if (models.length > 0) {
309
+ s.stop(`Found ${models.length} model${models.length === 1 ? "" : "s"} at ${base}`);
310
+ // {0,0} suggested rates: with the >=1 cost floor, every call to these
311
+ // models settles at exactly 1 nominal usertoken. Raise the rates later
312
+ // for GPU-amortized showback (local.rateClass: "amortized-usd").
313
+ localModels = {};
314
+ for (const model of models) {
315
+ clack.log.step(` ${model}`);
316
+ localModels[model] = { inputPer1k: 0, outputPer1k: 0 };
317
+ }
318
+ }
319
+ else {
320
+ s.stop("No response — endpoint saved without a model list");
321
+ }
322
+ }
323
+ }
324
+ // Step 5: Create vault
238
325
  createVault(vaultPath, {
239
326
  budget: budgetUsertokens,
240
327
  providers,
241
328
  pricing,
242
329
  ...(customRates !== undefined ? { customRates } : {}),
330
+ ...(endpoints !== undefined ? { endpoints } : {}),
331
+ ...(localModels !== undefined ? { localModels } : {}),
243
332
  keys,
244
333
  });
245
334
  clack.outro(`Vault created at ${vaultPath}`);
@@ -266,6 +355,14 @@ function createVault(vaultPath, data) {
266
355
  if (data.customRates && Object.keys(data.customRates).length > 0) {
267
356
  config.customRates = data.customRates;
268
357
  }
358
+ if (data.endpoints && data.endpoints.length > 0) {
359
+ config.endpoints = data.endpoints;
360
+ }
361
+ if (data.localModels && Object.keys(data.localModels).length > 0) {
362
+ // All other local.* keys are zod-defaulted (autoDetectLoopback: true,
363
+ // defaultRate {0,0}, rateClass "nominal", injectUsageOptions: true).
364
+ config.local = { models: data.localModels };
365
+ }
269
366
  // Write config
270
367
  writeFileSync(join(vaultPath, "usertrust.config.json"), JSON.stringify(config, null, "\t"), "utf-8");
271
368
  // Write default policy
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
package/dist/cli/main.js CHANGED
File without changes
package/dist/detect.d.ts CHANGED
@@ -16,7 +16,7 @@
16
16
  * implement their own budget and audit controls or wrap calls through the
17
17
  * governed entry points above.
18
18
  */
19
- import type { LLMClientKind } from "./shared/types.js";
19
+ import type { EndpointInfo, LLMClientKind, TrustConfig } from "./shared/types.js";
20
20
  /**
21
21
  * Detect which LLM SDK a client belongs to by inspecting its shape.
22
22
  *
@@ -32,4 +32,37 @@ import type { LLMClientKind } from "./shared/types.js";
32
32
  * @throws {Error} if the client does not match any known SDK shape
33
33
  */
34
34
  export declare function detectClientKind(client: unknown): LLMClientKind;
35
+ /**
36
+ * Classify the endpoint a client points at — local (self-hosted) or cloud —
37
+ * selecting the settlement regime for every governed call. Runs BESIDE
38
+ * `detectClientKind` (which stays the transport detector); the endpoint class,
39
+ * not the model string, picks local vs cloud metering, so model-name spoofing
40
+ * (`ollama cp llama3.2 gpt-4o`) cannot change the regime.
41
+ *
42
+ * Classification order:
43
+ * 1. `override.class` provided → override wins (runtime defaults to "unknown").
44
+ * 2. `client.baseURL` read when it is a string; absent or malformed (URL parse
45
+ * failure) → treated as absent → cloud default. Never throws.
46
+ * 3. `config.endpoints[]` first match (origin / leading-star hostname suffix /
47
+ * bare hostname — see matchesEndpointEntry).
48
+ * 4. Loopback autodetect (config.local.autoDetectLoopback): hostname
49
+ * localhost | 127.0.0.1 | ::1 | ::ffff:127.0.0.1 (case-insensitive, IPv6
50
+ * brackets stripped, IPv4-mapped form matched by its WHATWG serialization) →
51
+ * local, runtime hinted by port (11434 ollama, 1234 lmstudio, 8000 vllm,
52
+ * else "openai-compat").
53
+ * 5. Default `{ class: "cloud", runtime: "unknown" }` — fail-EXPENSIVE:
54
+ * over-charging at cloud rates is recoverable, under-charging a paid
55
+ * endpoint is not.
56
+ *
57
+ * **Security posture (trusted-operator boundary):** endpoint classification —
58
+ * config matchers, overrides, and loopback autodetect — is a TRUSTED-OPERATOR
59
+ * decision. Never wire it to end-user or request input. In server/multi-tenant
60
+ * deployments set `local.autoDetectLoopback: false` and classify via explicit
61
+ * `endpoints[]` config: loopback inside a container can be a forwarding sidecar
62
+ * to a paid API. This is the same trust boundary as `budget`/`customRates` —
63
+ * the config author already controls billing entirely. Note that a compromised
64
+ * local server can under-report usage; receipts expose `usageSource` and
65
+ * `meter.rateSource` precisely so that this is auditable.
66
+ */
67
+ export declare function classifyEndpoint(client: unknown, config: TrustConfig, override?: Partial<EndpointInfo>): EndpointInfo;
35
68
  //# sourceMappingURL=detect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAyC/D"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAgB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAyC/D;AAsED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,YAAY,CA8Bd"}