usertrust 0.2.6 → 1.0.1

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 (84) hide show
  1. package/dist/cli/init.d.ts +2 -0
  2. package/dist/cli/init.d.ts.map +1 -1
  3. package/dist/cli/init.js +231 -37
  4. package/dist/cli/init.js.map +1 -1
  5. package/dist/cli/main.d.ts +1 -1
  6. package/dist/cli/main.d.ts.map +1 -1
  7. package/dist/cli/main.js +18 -3
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/cli/pricing.d.ts +5 -0
  10. package/dist/cli/pricing.d.ts.map +1 -0
  11. package/dist/cli/pricing.js +61 -0
  12. package/dist/cli/pricing.js.map +1 -0
  13. package/dist/cli/validate-key.d.ts +17 -0
  14. package/dist/cli/validate-key.d.ts.map +1 -0
  15. package/dist/cli/validate-key.js +58 -0
  16. package/dist/cli/validate-key.js.map +1 -0
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +31 -0
  19. package/dist/config.js.map +1 -1
  20. package/dist/govern.d.ts +3 -1
  21. package/dist/govern.d.ts.map +1 -1
  22. package/dist/govern.js +495 -39
  23. package/dist/govern.js.map +1 -1
  24. package/dist/headless.d.ts +77 -0
  25. package/dist/headless.d.ts.map +1 -0
  26. package/dist/headless.js +566 -0
  27. package/dist/headless.js.map +1 -0
  28. package/dist/index.d.ts +12 -2
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +13 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/ledger/pricing.d.ts +6 -2
  33. package/dist/ledger/pricing.d.ts.map +1 -1
  34. package/dist/ledger/pricing.js +31 -3
  35. package/dist/ledger/pricing.js.map +1 -1
  36. package/dist/policy/canary.d.ts +17 -0
  37. package/dist/policy/canary.d.ts.map +1 -0
  38. package/dist/policy/canary.js +44 -0
  39. package/dist/policy/canary.js.map +1 -0
  40. package/dist/policy/injection.d.ts +24 -0
  41. package/dist/policy/injection.d.ts.map +1 -0
  42. package/dist/policy/injection.js +178 -0
  43. package/dist/policy/injection.js.map +1 -0
  44. package/dist/policy/pii.d.ts +13 -1
  45. package/dist/policy/pii.d.ts.map +1 -1
  46. package/dist/policy/pii.js +88 -0
  47. package/dist/policy/pii.js.map +1 -1
  48. package/dist/shared/errors.d.ts +20 -0
  49. package/dist/shared/errors.d.ts.map +1 -1
  50. package/dist/shared/errors.js +46 -0
  51. package/dist/shared/errors.js.map +1 -1
  52. package/dist/shared/types.d.ts +268 -0
  53. package/dist/shared/types.d.ts.map +1 -1
  54. package/dist/shared/types.js +67 -0
  55. package/dist/shared/types.js.map +1 -1
  56. package/dist/streaming.d.ts +7 -2
  57. package/dist/streaming.d.ts.map +1 -1
  58. package/dist/streaming.js +15 -8
  59. package/dist/streaming.js.map +1 -1
  60. package/dist/supply-chain/manifest.d.ts +22 -0
  61. package/dist/supply-chain/manifest.d.ts.map +1 -0
  62. package/dist/supply-chain/manifest.js +46 -0
  63. package/dist/supply-chain/manifest.js.map +1 -0
  64. package/dist/supply-chain/permissions.d.ts +12 -0
  65. package/dist/supply-chain/permissions.d.ts.map +1 -0
  66. package/dist/supply-chain/permissions.js +89 -0
  67. package/dist/supply-chain/permissions.js.map +1 -0
  68. package/dist/supply-chain/sign.d.ts +17 -0
  69. package/dist/supply-chain/sign.d.ts.map +1 -0
  70. package/dist/supply-chain/sign.js +95 -0
  71. package/dist/supply-chain/sign.js.map +1 -0
  72. package/dist/vault/derive.d.ts +13 -0
  73. package/dist/vault/derive.d.ts.map +1 -0
  74. package/dist/vault/derive.js +32 -0
  75. package/dist/vault/derive.js.map +1 -0
  76. package/dist/vault/scope.d.ts +20 -0
  77. package/dist/vault/scope.d.ts.map +1 -0
  78. package/dist/vault/scope.js +35 -0
  79. package/dist/vault/scope.js.map +1 -0
  80. package/dist/vault/store.d.ts +31 -0
  81. package/dist/vault/store.d.ts.map +1 -0
  82. package/dist/vault/store.js +204 -0
  83. package/dist/vault/store.js.map +1 -0
  84. package/package.json +15 -4
@@ -1,5 +1,7 @@
1
1
  export interface CliOptions {
2
2
  json?: boolean;
3
+ skipVerify?: boolean;
4
+ reconfigure?: boolean;
3
5
  }
4
6
  export declare function run(rootDir?: string, opts?: CliOptions): Promise<void>;
5
7
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAsCD,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D5E"}
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;AAgCD,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyO5E"}
package/dist/cli/init.js CHANGED
@@ -1,24 +1,22 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // Copyright 2026 Usertools, Inc.
3
3
  /**
4
- * CLI: usertrust init — Initialize trust vault
4
+ * CLI: usertrust init — Interactive onboarding wizard
5
5
  *
6
- * Creates the .usertrust/ directory structure with default config,
7
- * policy, and .gitignore. Sets permissions to 700 (owner only).
6
+ * Walks the user through API key setup, budget configuration,
7
+ * and pricing selection. Creates the .usertrust/ vault with
8
+ * config, .env, policy, and .gitignore.
8
9
  */
9
10
  import { chmodSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
10
11
  import { join } from "node:path";
11
- import pc from "picocolors";
12
+ import * as clack from "@clack/prompts";
13
+ import { PRICING_TABLE, PRICING_TABLE_VERSION, modelsForProvider } from "../ledger/pricing.js";
12
14
  import { VAULT_DIR } from "../shared/constants.js";
13
- const DEFAULT_CONFIG = {
14
- budget: 50000,
15
- tier: "mini",
16
- policies: "./policies/default.yml",
17
- pii: "warn",
18
- board: { enabled: false, vetoThreshold: "high" },
19
- circuitBreaker: { failureThreshold: 5, resetTimeout: 60000 },
20
- patterns: { enabled: true, feedProxy: false },
21
- audit: { rotation: "daily", indexLimit: 10000 },
15
+ import { detectProvider, maskKey, validateKey } from "./validate-key.js";
16
+ const ENV_VAR_MAP = {
17
+ anthropic: "ANTHROPIC_API_KEY",
18
+ openai: "OPENAI_API_KEY",
19
+ google: "GOOGLE_API_KEY",
22
20
  };
23
21
  const DEFAULT_POLICY = `rules:
24
22
  - name: block-zero-budget
@@ -37,16 +35,16 @@ const DEFAULT_POLICY = `rules:
37
35
  operator: gt
38
36
  value: 1000
39
37
  `;
40
- const GITIGNORE = `tigerbeetle/
41
- *.tigerbeetle
42
- dlq/
43
- `;
44
38
  const SUBDIRS = ["audit", "policies", "patterns", "snapshots", "board", "dlq"];
39
+ function envVarName(provider) {
40
+ return ENV_VAR_MAP[provider] ?? `${provider.toUpperCase()}_API_KEY`;
41
+ }
45
42
  export async function run(rootDir, opts) {
46
43
  const root = rootDir ?? process.cwd();
47
44
  const vaultPath = join(root, VAULT_DIR);
48
45
  const json = opts?.json === true;
49
- if (existsSync(vaultPath)) {
46
+ // ── Check existing vault ──
47
+ if (existsSync(vaultPath) && !opts?.reconfigure) {
50
48
  if (json) {
51
49
  console.log(JSON.stringify({
52
50
  command: "init",
@@ -55,24 +53,18 @@ export async function run(rootDir, opts) {
55
53
  }));
56
54
  }
57
55
  else {
58
- console.log(pc.yellow(`Vault already exists at ${vaultPath}`));
56
+ clack.log.warn(`Vault already exists at ${vaultPath}`);
59
57
  }
60
58
  return;
61
59
  }
62
- // Create directory structure
63
- mkdirSync(vaultPath, { recursive: true });
64
- for (const sub of SUBDIRS) {
65
- mkdirSync(join(vaultPath, sub), { recursive: true });
66
- }
67
- // Write default config
68
- writeFileSync(join(vaultPath, "usertrust.config.json"), JSON.stringify(DEFAULT_CONFIG, null, "\t"), "utf-8");
69
- // Write default policy
70
- writeFileSync(join(vaultPath, "policies", "default.yml"), DEFAULT_POLICY, "utf-8");
71
- // Write .gitignore
72
- writeFileSync(join(vaultPath, ".gitignore"), GITIGNORE, "utf-8");
73
- // Set vault permissions to 700 (owner only)
74
- chmodSync(vaultPath, 0o700);
60
+ // ── Non-interactive (--json) mode ──
75
61
  if (json) {
62
+ createVault(vaultPath, {
63
+ budget: 50_000,
64
+ providers: [],
65
+ pricing: "recommended",
66
+ keys: {},
67
+ });
76
68
  console.log(JSON.stringify({
77
69
  command: "init",
78
70
  success: true,
@@ -83,12 +75,214 @@ export async function run(rootDir, opts) {
83
75
  policy: "policies/default.yml",
84
76
  },
85
77
  }));
78
+ return;
86
79
  }
87
- else {
88
- console.log(pc.green(`Initialized trust vault at ${vaultPath}`));
89
- console.log(pc.dim(" Created: audit/, policies/, patterns/, snapshots/, board/, dlq/"));
90
- console.log(pc.dim(" Config: usertrust.config.json"));
91
- console.log(pc.dim(" Policy: policies/default.yml"));
80
+ // ── Interactive wizard ──
81
+ clack.intro("usertrust init");
82
+ // Step 1: API key loop
83
+ const keys = {};
84
+ const providers = [];
85
+ // biome-ignore lint/correctness/noConstantCondition: intentional loop
86
+ while (true) {
87
+ const keyResult = await clack.text({
88
+ message: Object.keys(keys).length === 0
89
+ ? "Paste your API key:"
90
+ : "Paste another API key (empty = done):",
91
+ placeholder: "sk-...",
92
+ });
93
+ if (clack.isCancel(keyResult)) {
94
+ clack.log.warn("Setup cancelled.");
95
+ return;
96
+ }
97
+ const key = keyResult.trim();
98
+ if (key === "")
99
+ break;
100
+ let provider = detectProvider(key);
101
+ if (provider === null) {
102
+ const providerResult = await clack.text({
103
+ message: "Could not detect provider. Enter provider name:",
104
+ placeholder: "e.g. mistral, deepseek",
105
+ });
106
+ if (clack.isCancel(providerResult)) {
107
+ clack.log.warn("Setup cancelled.");
108
+ return;
109
+ }
110
+ provider = providerResult.trim().toLowerCase();
111
+ if (!/^[a-z][a-z0-9-]{0,31}$/.test(provider)) {
112
+ clack.log.warn("Provider name must be lowercase alphanumeric (max 32 chars).");
113
+ continue;
114
+ }
115
+ }
116
+ // Validate key unless --skip-verify
117
+ if (!opts?.skipVerify) {
118
+ const s = clack.spinner();
119
+ s.start(`Validating ${provider} key...`);
120
+ const result = await validateKey(key, provider);
121
+ if (result.valid) {
122
+ s.stop(`${provider} key valid (${maskKey(key)})`);
123
+ }
124
+ else {
125
+ s.stop(`${provider} key validation failed: ${result.error}`);
126
+ clack.log.warn("Key added anyway — you can fix it later in .usertrust/.env");
127
+ }
128
+ }
129
+ else {
130
+ clack.log.info(`Added ${provider} key (${maskKey(key)})`);
131
+ }
132
+ keys[provider] = key;
133
+ const models = modelsForProvider(provider);
134
+ providers.push({ name: provider, models });
135
+ }
136
+ // Step 2: Budget
137
+ const budgetResult = await clack.text({
138
+ message: "Monthly budget: $",
139
+ placeholder: "50",
140
+ validate: (value) => {
141
+ if (!value)
142
+ return "Enter a positive number";
143
+ const cleaned = value.replace(/[$,]/g, "");
144
+ if (Number.isNaN(Number(cleaned)) || Number(cleaned) <= 0) {
145
+ return "Enter a positive number";
146
+ }
147
+ },
148
+ });
149
+ if (clack.isCancel(budgetResult)) {
150
+ clack.log.warn("Setup cancelled.");
151
+ return;
92
152
  }
153
+ const dollars = Number(budgetResult.replace(/[$,]/g, ""));
154
+ const budgetUsertokens = Math.round(dollars * 10_000);
155
+ // Step 3: Rates
156
+ let pricing = "recommended";
157
+ let customRates;
158
+ const useRecommended = await clack.confirm({
159
+ message: `Use recommended rates? (verified ${PRICING_TABLE_VERSION})`,
160
+ initialValue: true,
161
+ });
162
+ if (clack.isCancel(useRecommended)) {
163
+ clack.log.warn("Setup cancelled.");
164
+ return;
165
+ }
166
+ if (!useRecommended) {
167
+ pricing = "custom";
168
+ customRates = {};
169
+ // Show rate card for configured providers
170
+ for (const p of providers) {
171
+ const models = modelsForProvider(p.name);
172
+ if (models.length === 0)
173
+ continue;
174
+ clack.log.info(`\n${p.name} models:`);
175
+ for (const model of models) {
176
+ const rates = PRICING_TABLE[model];
177
+ if (!rates)
178
+ continue;
179
+ clack.log.step(` ${model}: input=${rates.inputPer1k}/1k, output=${rates.outputPer1k}/1k`);
180
+ }
181
+ }
182
+ // Allow editing individual models
183
+ // biome-ignore lint/correctness/noConstantCondition: intentional loop
184
+ while (true) {
185
+ const modelResult = await clack.text({
186
+ message: "Model to edit (empty = accept all):",
187
+ placeholder: "e.g. claude-sonnet-4-6",
188
+ });
189
+ if (clack.isCancel(modelResult)) {
190
+ clack.log.warn("Setup cancelled.");
191
+ return;
192
+ }
193
+ const model = modelResult.trim();
194
+ if (model === "")
195
+ break;
196
+ if (!/^[a-z0-9][a-z0-9._-]{0,127}$/i.test(model)) {
197
+ clack.log.warn("Invalid model name.");
198
+ continue;
199
+ }
200
+ const inputResult = await clack.text({
201
+ message: `${model} input rate ($/1M tokens):`,
202
+ });
203
+ if (clack.isCancel(inputResult)) {
204
+ clack.log.warn("Setup cancelled.");
205
+ return;
206
+ }
207
+ const outputResult = await clack.text({
208
+ message: `${model} output rate ($/1M tokens):`,
209
+ });
210
+ if (clack.isCancel(outputResult)) {
211
+ clack.log.warn("Setup cancelled.");
212
+ return;
213
+ }
214
+ const inputPerM = Number(inputResult);
215
+ const outputPerM = Number(outputResult);
216
+ if (!Number.isFinite(inputPerM) ||
217
+ inputPerM < 0 ||
218
+ !Number.isFinite(outputPerM) ||
219
+ outputPerM < 0) {
220
+ clack.log.warn("Rates must be non-negative numbers. Skipping.");
221
+ continue;
222
+ }
223
+ // Convert $/1M to usertokens/1K: $X per 1M = X*10 usertokens per 1K
224
+ customRates[model] = {
225
+ inputPer1k: inputPerM * 10,
226
+ outputPer1k: outputPerM * 10,
227
+ };
228
+ clack.log.success(`Updated ${model}`);
229
+ }
230
+ }
231
+ // Step 4: Create vault
232
+ createVault(vaultPath, {
233
+ budget: budgetUsertokens,
234
+ providers,
235
+ pricing,
236
+ ...(customRates !== undefined ? { customRates } : {}),
237
+ keys,
238
+ });
239
+ clack.outro(`Vault created at ${vaultPath}`);
240
+ }
241
+ function createVault(vaultPath, data) {
242
+ // Create directory structure
243
+ mkdirSync(vaultPath, { recursive: true });
244
+ for (const sub of SUBDIRS) {
245
+ mkdirSync(join(vaultPath, sub), { recursive: true });
246
+ }
247
+ // Build config
248
+ const config = {
249
+ budget: data.budget,
250
+ tier: "mini",
251
+ policies: "./policies/default.yml",
252
+ pii: "warn",
253
+ board: { enabled: false, vetoThreshold: "high" },
254
+ circuitBreaker: { failureThreshold: 5, resetTimeout: 60000 },
255
+ patterns: { enabled: true, feedProxy: false },
256
+ audit: { rotation: "daily", indexLimit: 10000 },
257
+ providers: data.providers,
258
+ pricing: data.pricing,
259
+ };
260
+ if (data.customRates && Object.keys(data.customRates).length > 0) {
261
+ config.customRates = data.customRates;
262
+ }
263
+ // Write config
264
+ writeFileSync(join(vaultPath, "usertrust.config.json"), JSON.stringify(config, null, "\t"), "utf-8");
265
+ // Write default policy
266
+ writeFileSync(join(vaultPath, "policies", "default.yml"), DEFAULT_POLICY, "utf-8");
267
+ // Write .env with API keys
268
+ if (data.keys && Object.keys(data.keys).length > 0) {
269
+ const envLines = Object.entries(data.keys).map(([provider, key]) => {
270
+ const escaped = key.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
271
+ return `${envVarName(provider)}="${escaped}"`;
272
+ });
273
+ writeFileSync(join(vaultPath, ".env"), `${envLines.join("\n")}\n`, {
274
+ encoding: "utf-8",
275
+ mode: 0o600,
276
+ });
277
+ }
278
+ // Write .gitignore
279
+ const gitignoreContent = `tigerbeetle/
280
+ *.tigerbeetle
281
+ dlq/
282
+ .env
283
+ `;
284
+ writeFileSync(join(vaultPath, ".gitignore"), gitignoreContent, "utf-8");
285
+ // Set vault permissions to 700 (owner only)
286
+ chmodSync(vaultPath, 0o700);
93
287
  }
94
288
  //# sourceMappingURL=init.js.map
@@ -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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"}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- declare const COMMANDS: readonly ["init", "inspect", "health", "verify", "snapshot", "tb", "completions"];
2
+ declare const COMMANDS: readonly ["init", "inspect", "health", "verify", "snapshot", "tb", "pricing", "completions"];
3
3
  /** Simple Levenshtein distance — two-row DP, no dependency needed. */
4
4
  declare function levenshtein(a: string, b: string): number;
5
5
  declare function suggestCommand(input: string): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAIA,QAAA,MAAM,QAAQ,mFAAoF,CAAC;AAOnG,sEAAsE;AACtE,iBAAS,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBjD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAczD;AAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAIA,QAAA,MAAM,QAAQ,8FASJ,CAAC;AAWX,sEAAsE;AACtE,iBAAS,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBjD;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAczD;AAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC"}
package/dist/cli/main.js CHANGED
@@ -1,10 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  // Copyright 2026 Usertools, Inc.
4
- const COMMANDS = ["init", "inspect", "health", "verify", "snapshot", "tb", "completions"];
4
+ const COMMANDS = [
5
+ "init",
6
+ "inspect",
7
+ "health",
8
+ "verify",
9
+ "snapshot",
10
+ "tb",
11
+ "pricing",
12
+ "completions",
13
+ ];
5
14
  const argv = process.argv.slice(2);
6
15
  const jsonFlag = argv.includes("--json");
7
- const positional = argv.filter((a) => a !== "--json");
16
+ const skipVerify = argv.includes("--skip-verify");
17
+ const reconfigure = argv.includes("--reconfigure");
18
+ const positional = argv.filter((a) => a !== "--json" && a !== "--skip-verify" && a !== "--reconfigure");
8
19
  const command = positional[0];
9
20
  /** Simple Levenshtein distance — two-row DP, no dependency needed. */
10
21
  function levenshtein(a, b) {
@@ -41,7 +52,7 @@ function suggestCommand(input) {
41
52
  export { levenshtein, suggestCommand, COMMANDS };
42
53
  switch (command) {
43
54
  case "init":
44
- await import("./init.js").then((m) => m.run(undefined, { json: jsonFlag }));
55
+ await import("./init.js").then((m) => m.run(undefined, { json: jsonFlag, skipVerify, reconfigure }));
45
56
  break;
46
57
  case "inspect":
47
58
  await import("./inspect.js").then((m) => m.run(undefined, { json: jsonFlag }));
@@ -58,6 +69,9 @@ switch (command) {
58
69
  case "tb":
59
70
  await import("./tb.js").then((m) => m.run({ json: jsonFlag }));
60
71
  break;
72
+ case "pricing":
73
+ await import("./pricing.js").then((m) => m.run(undefined, { json: jsonFlag }));
74
+ break;
61
75
  case "completions":
62
76
  await import("./completions.js").then((m) => m.run(positional[1], { json: jsonFlag }));
63
77
  break;
@@ -79,6 +93,7 @@ Commands:
79
93
  verify Verify audit chain integrity
80
94
  snapshot Create/restore vault snapshots
81
95
  tb Manage TigerBeetle process
96
+ pricing Show current rate configuration
82
97
  completions Output shell completion scripts
83
98
 
84
99
  Options:
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface PricingOpts {
2
+ json: boolean;
3
+ }
4
+ export declare function run(rootDir?: string, opts?: PricingOpts): Promise<void>;
5
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/cli/pricing.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D7E"}
@@ -0,0 +1,61 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Usertools, Inc.
3
+ /**
4
+ * CLI: usertrust pricing — Display current rate configuration
5
+ */
6
+ import { existsSync } from "node:fs";
7
+ import { readFile } from "node:fs/promises";
8
+ import { join } from "node:path";
9
+ import pc from "picocolors";
10
+ import { PRICING_TABLE, PRICING_TABLE_VERSION, modelsForProvider } from "../ledger/pricing.js";
11
+ import { VAULT_DIR } from "../shared/constants.js";
12
+ import { TrustConfigSchema } from "../shared/types.js";
13
+ export async function run(rootDir, opts) {
14
+ const root = rootDir ?? process.cwd();
15
+ const configPath = join(root, VAULT_DIR, "usertrust.config.json");
16
+ const json = opts?.json === true;
17
+ let config = null;
18
+ if (existsSync(configPath)) {
19
+ const raw = JSON.parse(await readFile(configPath, "utf-8"));
20
+ config = TrustConfigSchema.parse(raw);
21
+ }
22
+ const pricing = config?.pricing ?? "recommended";
23
+ const customRates = config?.customRates;
24
+ const providers = config?.providers ?? [];
25
+ // Determine which models to show
26
+ const modelKeys = providers.length > 0
27
+ ? providers.flatMap((p) => modelsForProvider(p.name))
28
+ : Object.keys(PRICING_TABLE);
29
+ if (json) {
30
+ const rates = {};
31
+ for (const model of modelKeys) {
32
+ const custom = customRates?.[model];
33
+ const base = PRICING_TABLE[model];
34
+ const source = custom ? "custom" : "recommended";
35
+ const r = custom ?? base;
36
+ if (r) {
37
+ rates[model] = {
38
+ inputPerM: r.inputPer1k / 10,
39
+ outputPerM: r.outputPer1k / 10,
40
+ source,
41
+ };
42
+ }
43
+ }
44
+ console.log(JSON.stringify({ command: "pricing", pricing, version: PRICING_TABLE_VERSION, rates }));
45
+ return;
46
+ }
47
+ console.log(pc.bold(`\n Rates (${pricing}, verified ${PRICING_TABLE_VERSION})\n`));
48
+ for (const model of modelKeys) {
49
+ const custom = customRates?.[model];
50
+ const base = PRICING_TABLE[model];
51
+ const r = custom ?? base;
52
+ if (!r)
53
+ continue;
54
+ const inputPerM = (r.inputPer1k / 10).toFixed(2);
55
+ const outputPerM = (r.outputPer1k / 10).toFixed(2);
56
+ const tag = custom ? pc.yellow(" (custom)") : "";
57
+ console.log(` ${pc.cyan(model.padEnd(24))} $${inputPerM} / $${outputPerM} per 1M tokens${tag}`);
58
+ }
59
+ console.log(pc.dim(`\n Mode: ${pricing} | Run \`usertrust init --reconfigure\` to change\n`));
60
+ }
61
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/cli/pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CLI: API key duck-typing and validation.
3
+ *
4
+ * Detects provider from key prefix, validates by hitting
5
+ * a lightweight provider endpoint (3s timeout).
6
+ */
7
+ export interface KeyValidationResult {
8
+ valid: boolean;
9
+ error?: string;
10
+ }
11
+ /** Detect provider from API key prefix. Returns null if unrecognized. */
12
+ export declare function detectProvider(key: string): string | null;
13
+ /** Validate an API key against the provider's models endpoint. */
14
+ export declare function validateKey(key: string, provider: string): Promise<KeyValidationResult>;
15
+ /** Mask an API key for display: show prefix + dots. */
16
+ export declare function maskKey(key: string): string;
17
+ //# sourceMappingURL=validate-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-key.d.ts","sourceRoot":"","sources":["../../src/cli/validate-key.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKzD;AAED,kEAAkE;AAClE,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkB7F;AAED,uDAAuD;AACvD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG3C"}
@@ -0,0 +1,58 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Usertools, Inc.
3
+ const PROVIDER_ENDPOINTS = {
4
+ anthropic: {
5
+ url: "https://api.anthropic.com/v1/models",
6
+ headers: (key) => ({
7
+ "x-api-key": key,
8
+ "anthropic-version": "2023-06-01",
9
+ }),
10
+ },
11
+ openai: {
12
+ url: "https://api.openai.com/v1/models",
13
+ headers: (key) => ({ Authorization: `Bearer ${key}` }),
14
+ },
15
+ google: {
16
+ url: "https://generativelanguage.googleapis.com/v1/models",
17
+ headers: (key) => ({ "x-goog-api-key": key }),
18
+ },
19
+ };
20
+ /** Detect provider from API key prefix. Returns null if unrecognized. */
21
+ export function detectProvider(key) {
22
+ if (key.startsWith("sk-ant-"))
23
+ return "anthropic";
24
+ if (key.startsWith("sk-"))
25
+ return "openai";
26
+ if (key.startsWith("AIza"))
27
+ return "google";
28
+ return null;
29
+ }
30
+ /** Validate an API key against the provider's models endpoint. */
31
+ export async function validateKey(key, provider) {
32
+ const endpoint = PROVIDER_ENDPOINTS[provider];
33
+ if (!endpoint)
34
+ return { valid: true };
35
+ try {
36
+ const resp = await fetch(endpoint.url, {
37
+ method: "GET",
38
+ headers: endpoint.headers(key),
39
+ signal: AbortSignal.timeout(3000),
40
+ });
41
+ if (resp.ok)
42
+ return { valid: true };
43
+ return { valid: false, error: `HTTP ${resp.status}` };
44
+ }
45
+ catch (err) {
46
+ return {
47
+ valid: false,
48
+ error: err instanceof Error ? err.message : String(err),
49
+ };
50
+ }
51
+ }
52
+ /** Mask an API key for display: show prefix + dots. */
53
+ export function maskKey(key) {
54
+ if (key.length <= 8)
55
+ return "••••••••";
56
+ return `${key.slice(0, 8)}••••••••`;
57
+ }
58
+ //# sourceMappingURL=validate-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-key.js","sourceRoot":"","sources":["../../src/cli/validate-key.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAcjC,MAAM,kBAAkB,GAGpB;IACH,SAAS,EAAE;QACV,GAAG,EAAE,qCAAqC;QAC1C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClB,WAAW,EAAE,GAAG;YAChB,mBAAmB,EAAE,YAAY;SACjC,CAAC;KACF;IACD,MAAM,EAAE;QACP,GAAG,EAAE,kCAAkC;QACvC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;KACtD;IACD,MAAM,EAAE;QACP,GAAG,EAAE,qDAAqD;QAC1D,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC;KAC7C;CACD,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,WAAW,CAAC;IAClD,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,IAAI,CAAC;AACb,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,QAAgB;IAC9D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAEtC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;YACtC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;YAC9B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SACjC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO;YACN,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACvD,CAAC;IACH,CAAC;AACF,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,OAAO,CAAC,GAAW;IAClC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IACvC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC;AACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BrD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAwBtB;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}