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.
- package/README.md +9 -9
- package/dist/anomaly/detector.d.ts.map +1 -1
- package/dist/anomaly/detector.js +36 -11
- package/dist/anomaly/detector.js.map +1 -1
- package/dist/anomaly/signals/spend-velocity.d.ts +39 -12
- package/dist/anomaly/signals/spend-velocity.d.ts.map +1 -1
- package/dist/anomaly/signals/spend-velocity.js +66 -43
- package/dist/anomaly/signals/spend-velocity.js.map +1 -1
- package/dist/anomaly/signals/token-rate.d.ts +33 -13
- package/dist/anomaly/signals/token-rate.d.ts.map +1 -1
- package/dist/anomaly/signals/token-rate.js +124 -38
- package/dist/anomaly/signals/token-rate.js.map +1 -1
- package/dist/anomaly/types.d.ts +28 -6
- package/dist/anomaly/types.d.ts.map +1 -1
- package/dist/audit/chain.d.ts +9 -0
- package/dist/audit/chain.d.ts.map +1 -1
- package/dist/audit/chain.js +65 -9
- package/dist/audit/chain.js.map +1 -1
- package/dist/audit/verify.d.ts +19 -0
- package/dist/audit/verify.d.ts.map +1 -1
- package/dist/audit/verify.js +216 -14
- package/dist/audit/verify.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +107 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/main.js +0 -0
- package/dist/cli/skill.d.ts.map +1 -1
- package/dist/cli/skill.js +35 -5
- package/dist/cli/skill.js.map +1 -1
- package/dist/cli/snapshot.d.ts.map +1 -1
- package/dist/cli/snapshot.js +20 -2
- package/dist/cli/snapshot.js.map +1 -1
- package/dist/cli/verify.d.ts.map +1 -1
- package/dist/cli/verify.js +20 -11
- package/dist/cli/verify.js.map +1 -1
- package/dist/detect.d.ts +34 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +124 -0
- package/dist/detect.js.map +1 -1
- package/dist/govern.d.ts +13 -2
- package/dist/govern.d.ts.map +1 -1
- package/dist/govern.js +475 -127
- package/dist/govern.js.map +1 -1
- package/dist/headless.d.ts +41 -2
- package/dist/headless.d.ts.map +1 -1
- package/dist/headless.js +203 -35
- package/dist/headless.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/ledger/client.d.ts +14 -0
- package/dist/ledger/client.d.ts.map +1 -1
- package/dist/ledger/client.js +56 -0
- package/dist/ledger/client.js.map +1 -1
- package/dist/ledger/pricing.d.ts +54 -0
- package/dist/ledger/pricing.d.ts.map +1 -1
- package/dist/ledger/pricing.js +134 -8
- package/dist/ledger/pricing.js.map +1 -1
- package/dist/policy/default-rules.d.ts +18 -3
- package/dist/policy/default-rules.d.ts.map +1 -1
- package/dist/policy/default-rules.js +33 -15
- package/dist/policy/default-rules.js.map +1 -1
- package/dist/policy/gate.d.ts.map +1 -1
- package/dist/policy/gate.js +114 -16
- package/dist/policy/gate.js.map +1 -1
- package/dist/policy/injection.d.ts.map +1 -1
- package/dist/policy/injection.js +25 -16
- package/dist/policy/injection.js.map +1 -1
- package/dist/policy/pii.d.ts +20 -0
- package/dist/policy/pii.d.ts.map +1 -1
- package/dist/policy/pii.js +45 -2
- package/dist/policy/pii.js.map +1 -1
- package/dist/shared/types.d.ts +191 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +67 -6
- package/dist/shared/types.js.map +1 -1
- package/dist/snapshot/checkpoint.d.ts +18 -2
- package/dist/snapshot/checkpoint.d.ts.map +1 -1
- package/dist/snapshot/checkpoint.js +101 -17
- package/dist/snapshot/checkpoint.js.map +1 -1
- package/dist/streaming.d.ts +8 -3
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +75 -31
- package/dist/streaming.js.map +1 -1
- package/dist/supply-chain/permissions.d.ts +16 -3
- package/dist/supply-chain/permissions.d.ts.map +1 -1
- package/dist/supply-chain/permissions.js +59 -9
- package/dist/supply-chain/permissions.js.map +1 -1
- package/dist/supply-chain/sign.d.ts +5 -2
- package/dist/supply-chain/sign.d.ts.map +1 -1
- package/dist/supply-chain/sign.js +10 -2
- package/dist/supply-chain/sign.js.map +1 -1
- package/package.json +2 -4
package/dist/cli/snapshot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/cli/snapshot.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;;;;GAOG;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,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG3F,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,UAAU;gBACnB,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,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/cli/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/verify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/cli/verify.js
CHANGED
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* CLI: usertrust verify — Verify audit chain integrity
|
|
5
5
|
*
|
|
6
|
-
* Calls
|
|
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 {
|
|
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
|
|
31
|
-
const
|
|
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
|
-
|
|
42
|
+
chainLength: result.chainLength,
|
|
39
43
|
errors: result.errors,
|
|
40
|
-
|
|
41
|
-
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.
|
|
48
|
-
|
|
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.
|
|
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: ${
|
|
66
|
+
console.log(pc.dim(`Verified at: ${verifiedAt}`));
|
|
58
67
|
}
|
|
59
68
|
//# sourceMappingURL=verify.js.map
|
package/dist/cli/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/cli/verify.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC
|
|
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
|
package/dist/detect.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/detect.js.map
CHANGED
|
@@ -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":"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;AAED,4DAA4D;AAE5D,4EAA4E;AAC5E,0EAA0E;AAC1E,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;AAEnF,6EAA6E;AAC7E,MAAM,eAAe,GAAiC;IACrD,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,MAAM;CACd,CAAC;AAEF,MAAM,aAAa,GAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAE3E,SAAS,QAAQ,CAAC,KAAa;IAC9B,IAAI,CAAC;QACJ,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,QAAgB;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,oBAAoB,CAAC,KAAa,EAAE,GAAQ;IACpD,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,kBAAkB;QAC/D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;AACrC,CAAC;AAED,+EAA+E;AAC/E,SAAS,WAAW,CAAC,MAAe;IACnC,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACzE,MAAM,KAAK,GAAI,MAAgC,CAAC,OAAO,CAAC;QACxD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,gBAAgB,CAC/B,MAAe,EACf,MAAmB,EACnB,QAAgC;IAEhC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpC,8CAA8C;IAC9C,IAAI,QAAQ,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,GAAiB,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;QAC7F,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC;QACjD,IAAI,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;QAC5D,OAAO,IAAI,CAAC;IACb,CAAC;IAED,qFAAqF;IACrF,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAE9C,6CAA6C;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAChE,CAAC;IACF,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3F,CAAC;IAED,qBAAqB;IACrB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC"}
|
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
|
-
|
|
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>;
|
package/dist/govern.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"govern.d.ts","sourceRoot":"","sources":["../src/govern.ts"],"names":[],"mappings":"
|
|
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"}
|