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 +1 @@
1
- {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/cli/snapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/cli/snapshot.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD5E"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD5E"}
@@ -3,12 +3,14 @@
3
3
  /**
4
4
  * CLI: usertrust verify — Verify audit chain integrity
5
5
  *
6
- * Calls verifyChain() on the local vault's audit log and displays the result.
6
+ * Calls verifyVault() on the local vault (anchored to the `.meta` head, spans
7
+ * rotated segments) and displays the result. Sets a nonzero process exit code
8
+ * on a FAILED verdict so CI gates fail on a tampered vault.
7
9
  */
8
10
  import { existsSync } from "node:fs";
9
11
  import { join } from "node:path";
10
12
  import pc from "picocolors";
11
- import { verifyChain } from "../audit/verify.js";
13
+ import { verifyVault } from "../audit/verify.js";
12
14
  import { VAULT_DIR } from "../shared/constants.js";
13
15
  export async function run(rootDir, opts) {
14
16
  const root = rootDir ?? process.cwd();
@@ -25,35 +27,42 @@ export async function run(rootDir, opts) {
25
27
  else {
26
28
  console.log(`${pc.red("No trust vault found.")} Run \`usertrust init\` first.`);
27
29
  }
30
+ // A missing vault is a failed verification for CI purposes.
31
+ process.exitCode = 1;
28
32
  return;
29
33
  }
30
- const logPath = join(vaultPath, "audit", "events.jsonl");
31
- const result = verifyChain(logPath);
34
+ const result = verifyVault(vaultPath);
35
+ const verifiedAt = new Date().toISOString();
32
36
  if (json) {
33
37
  console.log(JSON.stringify({
34
38
  command: "verify",
35
39
  success: result.valid,
36
40
  data: {
37
41
  valid: result.valid,
38
- eventsVerified: result.eventsVerified,
42
+ chainLength: result.chainLength,
39
43
  errors: result.errors,
40
- latestHash: result.latestHash,
41
- verifiedAt: result.verifiedAt,
44
+ merkleRoot: result.merkleRoot,
45
+ verifiedAt,
42
46
  },
43
47
  }));
48
+ if (!result.valid)
49
+ process.exitCode = 1;
44
50
  return;
45
51
  }
46
52
  if (result.valid) {
47
- console.log(pc.green(`Chain verified: ${result.eventsVerified} events, all hashes valid.`));
48
- console.log(`Latest hash: ${pc.dim(result.latestHash)}`);
53
+ console.log(pc.green(`Chain verified: ${result.chainLength} events, all hashes valid.`));
54
+ if (result.merkleRoot)
55
+ console.log(`Merkle root: ${pc.dim(result.merkleRoot)}`);
49
56
  }
50
57
  else {
51
58
  console.log(pc.red(`Chain verification FAILED: ${result.errors.length} error(s) found.`));
52
- console.log(`Events checked: ${result.eventsVerified}`);
59
+ console.log(`Events checked: ${result.chainLength}`);
53
60
  for (const err of result.errors) {
54
61
  console.log(pc.red(` - ${err}`));
55
62
  }
63
+ // Use process.exitCode (not process.exit) so buffered stdout flushes.
64
+ process.exitCode = 1;
56
65
  }
57
- console.log(pc.dim(`Verified at: ${result.verifiedAt}`));
66
+ console.log(pc.dim(`Verified at: ${verifiedAt}`));
58
67
  }
59
68
  //# sourceMappingURL=verify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAgB,EAAE,IAAiB;IAC5D,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAEjC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CAAC;gBACd,OAAO,EAAE,QAAQ;gBACjB,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,EAAE,OAAO,EAAE,mDAAmD,EAAE;aACtE,CAAC,CACF,CAAC;QACH,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC,gCAAgC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CAAC;YACd,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,MAAM,CAAC,KAAK;YACrB,IAAI,EAAE;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;aAC7B;SACD,CAAC,CACF,CAAC;QACF,OAAO;IACR,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,cAAc,4BAA4B,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,MAAM,CAAC,MAAM,kBAAkB,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACxD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"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"}
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"}
package/dist/detect.js CHANGED
@@ -47,4 +47,128 @@ export function detectClientKind(client) {
47
47
  }
48
48
  throw new Error("Unsupported LLM client: could not detect Anthropic, OpenAI, or Google SDK");
49
49
  }
50
+ // ── Endpoint classification (M2 local-model governance) ──
51
+ // Compared against normalizeHostname(url.hostname) — the WHATWG-serialized,
52
+ // bracket-stripped form. `::ffff:7f00:1` is how Node's URL serializes the
53
+ // IPv4-mapped IPv6 loopback `::ffff:127.0.0.1` (the last 32 bits render as hex,
54
+ // never dotted-quad), so the map entry MUST be the serialized form to match.
55
+ const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "::1", "::ffff:7f00:1"]);
56
+ /** Best-effort runtime hint by conventional default port (metadata only). */
57
+ const RUNTIME_BY_PORT = {
58
+ "11434": "ollama",
59
+ "1234": "lmstudio",
60
+ "8000": "vllm",
61
+ };
62
+ const CLOUD_DEFAULT = { class: "cloud", runtime: "unknown" };
63
+ function parseUrl(value) {
64
+ try {
65
+ return new URL(value);
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Normalize a URL hostname for comparison: lowercase, IPv6 brackets stripped
73
+ * (Node's WHATWG URL keeps brackets in `hostname` for IPv6 literals).
74
+ */
75
+ function normalizeHostname(hostname) {
76
+ const lower = hostname.toLowerCase();
77
+ if (lower.startsWith("[") && lower.endsWith("]"))
78
+ return lower.slice(1, -1);
79
+ return lower;
80
+ }
81
+ /**
82
+ * Match a parsed baseURL against one config.endpoints[].match entry (A1).
83
+ * Exactly three entry forms — never raw string prefixing:
84
+ * (i) scheme entry ("http://gpu-box:8000") → parsed; match iff origins are equal
85
+ * (path/query/trailing slash ignored; kills "http://gpu-box:8000.evil.com"
86
+ * and "http://gpu-box:8000@evil.com" bypass shapes);
87
+ * (ii) leading-star entry ("*.gpu.internal") → hostname SUFFIX match: matches
88
+ * "a.gpu.internal" and "x.y.gpu.internal", NOT "gpu.internal" itself;
89
+ * (iii) bare hostname → case-insensitive hostname equality (any port).
90
+ * Unparseable scheme entries never match (and never throw).
91
+ */
92
+ function matchesEndpointEntry(entry, url) {
93
+ if (/^https?:\/\//i.test(entry)) {
94
+ const entryUrl = parseUrl(entry);
95
+ return entryUrl !== null && entryUrl.origin === url.origin;
96
+ }
97
+ const host = normalizeHostname(url.hostname);
98
+ if (entry.startsWith("*.")) {
99
+ const suffix = entry.slice(1).toLowerCase(); // ".gpu.internal"
100
+ return host.endsWith(suffix);
101
+ }
102
+ return host === entry.toLowerCase();
103
+ }
104
+ /** Read a string `baseURL` property off an SDK client instance, if present. */
105
+ function readBaseURL(client) {
106
+ if (client != null && typeof client === "object" && "baseURL" in client) {
107
+ const value = client.baseURL;
108
+ if (typeof value === "string")
109
+ return value;
110
+ }
111
+ return undefined;
112
+ }
113
+ /**
114
+ * Classify the endpoint a client points at — local (self-hosted) or cloud —
115
+ * selecting the settlement regime for every governed call. Runs BESIDE
116
+ * `detectClientKind` (which stays the transport detector); the endpoint class,
117
+ * not the model string, picks local vs cloud metering, so model-name spoofing
118
+ * (`ollama cp llama3.2 gpt-4o`) cannot change the regime.
119
+ *
120
+ * Classification order:
121
+ * 1. `override.class` provided → override wins (runtime defaults to "unknown").
122
+ * 2. `client.baseURL` read when it is a string; absent or malformed (URL parse
123
+ * failure) → treated as absent → cloud default. Never throws.
124
+ * 3. `config.endpoints[]` first match (origin / leading-star hostname suffix /
125
+ * bare hostname — see matchesEndpointEntry).
126
+ * 4. Loopback autodetect (config.local.autoDetectLoopback): hostname
127
+ * localhost | 127.0.0.1 | ::1 | ::ffff:127.0.0.1 (case-insensitive, IPv6
128
+ * brackets stripped, IPv4-mapped form matched by its WHATWG serialization) →
129
+ * local, runtime hinted by port (11434 ollama, 1234 lmstudio, 8000 vllm,
130
+ * else "openai-compat").
131
+ * 5. Default `{ class: "cloud", runtime: "unknown" }` — fail-EXPENSIVE:
132
+ * over-charging at cloud rates is recoverable, under-charging a paid
133
+ * endpoint is not.
134
+ *
135
+ * **Security posture (trusted-operator boundary):** endpoint classification —
136
+ * config matchers, overrides, and loopback autodetect — is a TRUSTED-OPERATOR
137
+ * decision. Never wire it to end-user or request input. In server/multi-tenant
138
+ * deployments set `local.autoDetectLoopback: false` and classify via explicit
139
+ * `endpoints[]` config: loopback inside a container can be a forwarding sidecar
140
+ * to a paid API. This is the same trust boundary as `budget`/`customRates` —
141
+ * the config author already controls billing entirely. Note that a compromised
142
+ * local server can under-report usage; receipts expose `usageSource` and
143
+ * `meter.rateSource` precisely so that this is auditable.
144
+ */
145
+ export function classifyEndpoint(client, config, override) {
146
+ const baseURL = readBaseURL(client);
147
+ // (1) Explicit override wins over everything.
148
+ if (override?.class !== undefined) {
149
+ const info = { class: override.class, runtime: override.runtime ?? "unknown" };
150
+ const overrideBase = override.baseURL ?? baseURL;
151
+ if (overrideBase !== undefined)
152
+ info.baseURL = overrideBase;
153
+ return info;
154
+ }
155
+ // (2) No readable baseURL → cloud default. Malformed → treat as absent, never throw.
156
+ if (baseURL === undefined)
157
+ return { ...CLOUD_DEFAULT };
158
+ const url = parseUrl(baseURL);
159
+ if (url === null)
160
+ return { ...CLOUD_DEFAULT };
161
+ // (3) config.endpoints[] — first match wins.
162
+ for (const entry of config.endpoints) {
163
+ if (matchesEndpointEntry(entry.match, url)) {
164
+ return { class: entry.class, runtime: entry.runtime, baseURL };
165
+ }
166
+ }
167
+ // (4) Loopback autodetect.
168
+ if (config.local.autoDetectLoopback && LOOPBACK_HOSTS.has(normalizeHostname(url.hostname))) {
169
+ return { class: "local", runtime: RUNTIME_BY_PORT[url.port] ?? "openai-compat", baseURL };
170
+ }
171
+ // (5) Cloud default.
172
+ return { class: "cloud", runtime: "unknown", baseURL };
173
+ }
50
174
  //# sourceMappingURL=detect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAuBjC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC/C,IACC,MAAM,IAAI,IAAI;QACd,OAAO,MAAM,KAAK,QAAQ;QAC1B,UAAU,IAAI,MAAM;QACpB,MAAM,CAAC,QAAQ,IAAI,IAAI;QACvB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,QAAQ,IAAI,MAAM,CAAC,QAAQ;QAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,EAC3C,CAAC;QACF,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,IACC,MAAM,IAAI,IAAI;QACd,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,IAAI,MAAM;QAChB,MAAM,CAAC,IAAI,IAAI,IAAI;QACnB,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,aAAa,IAAI,MAAM,CAAC,IAAI;QAC5B,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ;QAC3C,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW;QACnC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,UAAU,EACnD,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,IACC,MAAM,IAAI,IAAI;QACd,OAAO,MAAM,KAAK,QAAQ;QAC1B,QAAQ,IAAI,MAAM;QAClB,MAAM,CAAC,MAAM,IAAI,IAAI;QACrB,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACjC,iBAAiB,IAAI,MAAM,CAAC,MAAM;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,KAAK,UAAU,EAClD,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;AAC9F,CAAC"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
package/dist/govern.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type AuditWriter } from "./audit/chain.js";
2
- import type { ActionDescriptor, GovernedActionResult } from "./shared/types.js";
2
+ import type { ActionDescriptor, EndpointInfo, GovernedActionResult } from "./shared/types.js";
3
3
  export interface TrustOpts {
4
4
  /** Path to usertrust.config.json. Defaults to `.usertrust/usertrust.config.json`. */
5
5
  configPath?: string;
@@ -25,6 +25,13 @@ export interface TrustOpts {
25
25
  dryRun?: boolean;
26
26
  /** Vault directory override (default: cwd). */
27
27
  vaultBase?: string;
28
+ /**
29
+ * Explicit endpoint classification override (M2) — wins over config.endpoints
30
+ * matchers and loopback autodetect. TRUSTED-OPERATOR input, same trust
31
+ * boundary as budget/customRates: never derive it from end-user or request
32
+ * data (A10).
33
+ */
34
+ endpoint?: Partial<EndpointInfo> | undefined;
28
35
  /**
29
36
  * Inject a mock/test engine. When set, used instead of TigerBeetle.
30
37
  * Primarily for testing failure modes.
@@ -45,7 +52,11 @@ export interface TrustEngine {
45
52
  }): Promise<{
46
53
  transferId: string;
47
54
  }>;
48
- postPendingSpend(transferId: string): Promise<void>;
55
+ /**
56
+ * Settle a PENDING hold. `actualAmount` posts the true consumed cost (which may
57
+ * be less than the reserved estimate); omitting it posts the full pending amount.
58
+ */
59
+ postPendingSpend(transferId: string, actualAmount?: number): Promise<void>;
49
60
  voidPendingSpend(transferId: string): Promise<void>;
50
61
  /** AUD-461: Void all remaining pending transfers on destroy. */
51
62
  voidAllPending?(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"govern.d.ts","sourceRoot":"","sources":["../src/govern.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAoBvE,OAAO,KAAK,EACX,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,mBAAmB,CAAC;AAK3B,MAAM,WAAW,SAAS;IACzB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC3B,YAAY,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,gEAAgE;IAChE,cAAc,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,IAAI,CAAC;CACjB;AAED,sEAAsE;AACtE,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG;IAClC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,YAAY,CAAC,CAAC,EACb,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC;AAyEF,wBAAsB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAikCrF"}
1
+ {"version":3,"file":"govern.d.ts","sourceRoot":"","sources":["../src/govern.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAgCvE,OAAO,KAAK,EACX,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EAKpB,MAAM,mBAAmB,CAAC;AAK3B,MAAM,WAAW,SAAS;IACzB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IAC7C;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC3B,YAAY,CAAC,MAAM,EAAE;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpC;;;OAGG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,gEAAgE;IAChE,cAAc,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,IAAI,CAAC;CACjB;AAED,sEAAsE;AACtE,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG;IAClC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,YAAY,CAAC,CAAC,EACb,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC;AA6KF,wBAAsB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CA2xCrF"}