troxy-cli 1.8.1 → 1.8.3
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/bin/troxy.js +9 -9
- package/package.json +1 -1
- package/src/approvals.js +1 -1
- package/src/auth.js +1 -1
- package/src/cards.js +1 -1
- package/src/chat-budget.js +2 -2
- package/src/init.js +2 -2
- package/src/mcp-server.js +6 -6
- package/src/mcps.js +6 -6
- package/src/policies.js +2 -2
- package/src/secrets.js +1 -1
- package/src/settings.js +2 -2
- package/src/uninstall.js +1 -1
package/bin/troxy.js
CHANGED
|
@@ -44,7 +44,7 @@ function _handleError(err) {
|
|
|
44
44
|
} else if (source === 'config') {
|
|
45
45
|
console.error('\n API key revoked or invalid.');
|
|
46
46
|
console.error(' Your saved key is no longer accepted by Troxy.');
|
|
47
|
-
console.error(' Run: npx troxy init --key <new-key> to reconnect.\n');
|
|
47
|
+
console.error(' Run: npx troxy-cli init --key <new-key> to reconnect.\n');
|
|
48
48
|
} else {
|
|
49
49
|
console.error('\n API key invalid or revoked.');
|
|
50
50
|
console.error(' Check the key in your Troxy dashboard → API Keys.\n');
|
|
@@ -66,7 +66,7 @@ switch (command) {
|
|
|
66
66
|
const res = await fetch('https://registry.npmjs.org/troxy-cli/latest', { signal: AbortSignal.timeout(3000) });
|
|
67
67
|
const { version: latest } = await res.json();
|
|
68
68
|
if (version !== latest) {
|
|
69
|
-
process.stdout.write(` ⚠ ${latest} available
|
|
69
|
+
process.stdout.write(` ⚠ ${latest} available, run: troxy update`);
|
|
70
70
|
}
|
|
71
71
|
} catch {}
|
|
72
72
|
process.stdout.write('\n');
|
|
@@ -139,7 +139,7 @@ switch (command) {
|
|
|
139
139
|
Old: ${oldPrefix ? oldPrefix + '... (revoked)' : '(none)'}
|
|
140
140
|
New: ${newPrefix}...
|
|
141
141
|
|
|
142
|
-
New key (shown once
|
|
142
|
+
New key (shown once, save it now):
|
|
143
143
|
${newKey}
|
|
144
144
|
|
|
145
145
|
~/.troxy/config.json updated ✓
|
|
@@ -175,7 +175,7 @@ switch (command) {
|
|
|
175
175
|
console.log(`
|
|
176
176
|
troxy pay --merchant <name> --amount <n> [options]
|
|
177
177
|
|
|
178
|
-
Simulates a payment evaluation request
|
|
178
|
+
Simulates a payment evaluation request, identical to what your AI agent sends.
|
|
179
179
|
Use this to test your policies. Login required.
|
|
180
180
|
|
|
181
181
|
By default, payments that come back ALLOW or NOTIFY are auto-confirmed as
|
|
@@ -189,7 +189,7 @@ switch (command) {
|
|
|
189
189
|
Optional:
|
|
190
190
|
--card <alias> Card alias (default: "Work")
|
|
191
191
|
--category <cat> Merchant category (e.g. travel, software, food)
|
|
192
|
-
--no-confirm Don't auto-confirm
|
|
192
|
+
--no-confirm Don't auto-confirm, leaves the row PENDING
|
|
193
193
|
--fail Confirm as a failed charge instead of success
|
|
194
194
|
(simulates a declined card)
|
|
195
195
|
|
|
@@ -217,7 +217,7 @@ switch (command) {
|
|
|
217
217
|
const result = await api.evaluate(body, apiKey);
|
|
218
218
|
const ICON = { ALLOW: '✓', BLOCK: '✗', ESCALATE: '⏳', NOTIFY: '~' };
|
|
219
219
|
const icon = ICON[result.decision] || '?';
|
|
220
|
-
const suffix = result.policy ? ` ← "${result.policy}"` : result.reason ? `
|
|
220
|
+
const suffix = result.policy ? ` ← "${result.policy}"` : result.reason ? ` (${result.reason})` : ' (default action)';
|
|
221
221
|
console.log(`\n ${icon} ${result.decision}${suffix}`);
|
|
222
222
|
if (result.audit_id) console.log(` audit: ${result.audit_id}`);
|
|
223
223
|
|
|
@@ -236,7 +236,7 @@ switch (command) {
|
|
|
236
236
|
}, apiKey);
|
|
237
237
|
console.log(` confirmed: charge ${status}`);
|
|
238
238
|
} catch (e) {
|
|
239
|
-
console.log(` (confirm step failed
|
|
239
|
+
console.log(` (confirm step failed, row will stay PENDING)`);
|
|
240
240
|
}
|
|
241
241
|
}
|
|
242
242
|
console.log();
|
|
@@ -301,7 +301,7 @@ switch (command) {
|
|
|
301
301
|
const data = await api.agentInsights(jwt, period);
|
|
302
302
|
const d = data;
|
|
303
303
|
console.log(`
|
|
304
|
-
Insights
|
|
304
|
+
Insights (last ${d.period_days} days)
|
|
305
305
|
──────────────────────────────────
|
|
306
306
|
Total requests: ${d.total_requests}
|
|
307
307
|
Total spent: $${Number(d.total_spent).toFixed(2)}
|
|
@@ -499,7 +499,7 @@ switch (command) {
|
|
|
499
499
|
default:
|
|
500
500
|
if (command) console.error(` Unknown command: ${command}\n`);
|
|
501
501
|
console.log(`
|
|
502
|
-
Troxy
|
|
502
|
+
Troxy: AI payment control
|
|
503
503
|
|
|
504
504
|
First time? Run these two commands in order:
|
|
505
505
|
1) npx troxy-cli init --key txy-... (get key from https://dash.troxy.io)
|
package/package.json
CHANGED
package/src/approvals.js
CHANGED
|
@@ -13,7 +13,7 @@ async function _find(jwt, idPrefix) {
|
|
|
13
13
|
const { items: approvals = [] } = await api.listApprovals(jwt);
|
|
14
14
|
const matches = approvals.filter(a => a.id.startsWith(idPrefix));
|
|
15
15
|
if (matches.length === 0) { console.error(` No pending approval starting with "${idPrefix}". Run: troxy approvals list\n`); process.exit(1); }
|
|
16
|
-
if (matches.length > 1) { console.error(` "${idPrefix}" matches ${matches.length} pending approvals
|
|
16
|
+
if (matches.length > 1) { console.error(` "${idPrefix}" matches ${matches.length} pending approvals, use a longer prefix\n`); process.exit(1); }
|
|
17
17
|
return matches[0];
|
|
18
18
|
}
|
|
19
19
|
|
package/src/auth.js
CHANGED
|
@@ -58,7 +58,7 @@ export function requireKey(flags = {}) {
|
|
|
58
58
|
return saved;
|
|
59
59
|
}
|
|
60
60
|
console.error('\n No API key found.');
|
|
61
|
-
console.error(' Run: npx troxy init --key txy-... to connect this machine.\n');
|
|
61
|
+
console.error(' Run: npx troxy-cli init --key txy-... to connect this machine.\n');
|
|
62
62
|
process.exit(1);
|
|
63
63
|
}
|
|
64
64
|
|
package/src/cards.js
CHANGED
|
@@ -81,7 +81,7 @@ export async function runCards([sub, ...args], flags) {
|
|
|
81
81
|
body.default_action = action;
|
|
82
82
|
}
|
|
83
83
|
if (flags.notes != null) body.notes = flags.notes;
|
|
84
|
-
if (Object.keys(body).length === 0) { console.error(' Nothing to update
|
|
84
|
+
if (Object.keys(body).length === 0) { console.error(' Nothing to update, pass at least one option\n'); process.exit(1); }
|
|
85
85
|
|
|
86
86
|
await api.updateCard(jwt, card.id, body);
|
|
87
87
|
console.log(`\n Card "${name}" updated ✓\n`);
|
package/src/chat-budget.js
CHANGED
|
@@ -7,7 +7,7 @@ const VALID_ACTIONS = ['block', 'allow', 'notify', 'escalate'];
|
|
|
7
7
|
|
|
8
8
|
const HELP = {
|
|
9
9
|
show: ` troxy chat-budget show\n\n Shows Troxy Chat's monthly budget limits and what happens when they're hit.\n`,
|
|
10
|
-
set: ` troxy chat-budget set [options]\n\n Updates Troxy Chat's monthly budget. Login required.\n\n --currency <cur> USD, ILS, or EUR (default: USD)\n --limit <n> Monthly limit for that currency\n --clear Remove the limit for that currency\n --action <action> block, allow, notify, or escalate
|
|
10
|
+
set: ` troxy chat-budget set [options]\n\n Updates Troxy Chat's monthly budget. Login required.\n\n --currency <cur> USD, ILS, or EUR (default: USD)\n --limit <n> Monthly limit for that currency\n --clear Remove the limit for that currency\n --action <action> block, allow, notify, or escalate: what happens once the limit is hit\n\n Examples:\n troxy chat-budget set --currency USD --limit 500\n troxy chat-budget set --action notify\n troxy chat-budget set --currency EUR --clear\n`,
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
export async function runChatBudget([sub, ...args], flags) {
|
|
@@ -56,7 +56,7 @@ export async function runChatBudget([sub, ...args], flags) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
if (Object.keys(body).length === 0) {
|
|
59
|
-
console.error(' Nothing to update
|
|
59
|
+
console.error(' Nothing to update, pass at least one option. Run troxy chat-budget set --help\n');
|
|
60
60
|
process.exit(1);
|
|
61
61
|
}
|
|
62
62
|
|
package/src/init.js
CHANGED
|
@@ -63,11 +63,11 @@ const MCP_CLIENTS = [
|
|
|
63
63
|
export async function runInit({ key } = {}) {
|
|
64
64
|
if (!key || !key.startsWith('txy-')) {
|
|
65
65
|
console.error('\n Error: --key is required and must start with txy-');
|
|
66
|
-
console.error(' Usage: npx troxy init --key txy-...\n');
|
|
66
|
+
console.error(' Usage: npx troxy-cli init --key txy-...\n');
|
|
67
67
|
process.exit(1);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
console.log('\n Troxy
|
|
70
|
+
console.log('\n Troxy: AI payment control\n');
|
|
71
71
|
|
|
72
72
|
// Validate the key by hitting /evaluate (404 card = key is valid, TypeError = network failure)
|
|
73
73
|
process.stdout.write(' Validating API key... ');
|
package/src/mcp-server.js
CHANGED
|
@@ -21,7 +21,7 @@ export async function runMcp() {
|
|
|
21
21
|
|
|
22
22
|
if (!apiKey) {
|
|
23
23
|
process.stderr.write(
|
|
24
|
-
'Troxy: no API key found. Run: npx troxy init --key txy-...\n',
|
|
24
|
+
'Troxy: no API key found. Run: npx troxy-cli init --key txy-...\n',
|
|
25
25
|
);
|
|
26
26
|
process.exit(1);
|
|
27
27
|
}
|
|
@@ -35,9 +35,9 @@ export async function runMcp() {
|
|
|
35
35
|
'You MUST call the evaluate_payment tool before completing any purchase, payment, or financial transaction. ' +
|
|
36
36
|
'Never submit a payment form, confirm a checkout, or transfer funds without first receiving an ALLOW decision from evaluate_payment. ' +
|
|
37
37
|
'If the decision is BLOCK, abort the transaction and inform the user. ' +
|
|
38
|
-
'If the decision is ESCALATE, the response includes an approval_token. Immediately call wait_for_payment_approval with that token
|
|
38
|
+
'If the decision is ESCALATE, the response includes an approval_token. Immediately call wait_for_payment_approval with that token; it polls automatically until the payment is approved or declined (up to 10 minutes). Once it returns approved, call evaluate_payment again with the same payment details PLUS the approval_token field. The second call will return ALLOW without re-escalating. ' +
|
|
39
39
|
'If the decision is NOTIFY, proceed but the user will be notified. ' +
|
|
40
|
-
'When calling evaluate_payment, use the merchant\'s domain name as merchant_name when available (e.g. "amazon.com", "indigobloom.co.il")
|
|
40
|
+
'When calling evaluate_payment, use the merchant\'s domain name as merchant_name when available (e.g. "amazon.com", "indigobloom.co.il"); this ensures consistent matching against policies. ' +
|
|
41
41
|
'After every ALLOW or NOTIFY decision, attempt the payment, then call confirm_payment with the audit_id and the outcome (success/failed/cancelled). Always include a reason when the charge fails.',
|
|
42
42
|
},
|
|
43
43
|
{ capabilities: { tools: {} } },
|
|
@@ -50,7 +50,7 @@ export async function runMcp() {
|
|
|
50
50
|
description:
|
|
51
51
|
'Report the actual outcome of a payment attempt to Troxy. ' +
|
|
52
52
|
'Call this after every ALLOW or NOTIFY decision, once you know whether the charge succeeded or failed. ' +
|
|
53
|
-
'This is required for accurate audit logs
|
|
53
|
+
'This is required for accurate audit logs. Without it, approved payments show as unconfirmed.',
|
|
54
54
|
inputSchema: {
|
|
55
55
|
type: 'object',
|
|
56
56
|
required: ['audit_id', 'status'],
|
|
@@ -124,7 +124,7 @@ export async function runMcp() {
|
|
|
124
124
|
},
|
|
125
125
|
currency: {
|
|
126
126
|
type: 'string',
|
|
127
|
-
description: 'ISO 4217 currency code
|
|
127
|
+
description: 'ISO 4217 currency code. Always include this. Examples: "ILS" for Israeli Shekel (NIS), "USD" for US Dollar, "EUR" for Euro.',
|
|
128
128
|
},
|
|
129
129
|
approval_token: {
|
|
130
130
|
type: 'string',
|
|
@@ -229,7 +229,7 @@ export async function runMcp() {
|
|
|
229
229
|
text = `✗ Payment blocked by policy "${policy}". Do not proceed with this payment. (audit: ${audit_id})`;
|
|
230
230
|
break;
|
|
231
231
|
case 'ESCALATE':
|
|
232
|
-
text = `⏳ Payment requires human approval
|
|
232
|
+
text = `⏳ Payment requires human approval; a request has been sent to the account owner.\n\nApproval token: ${approval_token}\n\nNow call wait_for_payment_approval(approval_token="${approval_token}") to automatically detect approval. Do not proceed until it returns approved. (audit: ${audit_id})`;
|
|
233
233
|
break;
|
|
234
234
|
case 'NOTIFY':
|
|
235
235
|
text = `✓ Payment approved with notification. Policy matched: "${policy}". (audit: ${audit_id})\n\nAfter the charge attempt completes, call confirm_payment with audit_id "${audit_id}" and status "success", "failed", or "cancelled".`;
|
package/src/mcps.js
CHANGED
|
@@ -4,13 +4,13 @@ import { requireJwt } from './auth.js';
|
|
|
4
4
|
import { table } from './print.js';
|
|
5
5
|
|
|
6
6
|
const HELP = {
|
|
7
|
-
list: ` troxy mcps list\n\n Lists all MCP connections on your account
|
|
7
|
+
list: ` troxy mcps list\n\n Lists all MCP connections on your account: name, prefix, status, last seen,\n policies assigned, default action, budgets, and which one is this machine.\n`,
|
|
8
8
|
rename: ` troxy mcps rename --name <new-name> [--mcp <target>]\n\n Renames an MCP. Without --mcp, renames this machine's MCP.\n\n Options:\n --name New name\n --mcp Name/prefix of the MCP to rename (default: this machine)\n\n Example:\n troxy mcps rename --name "My Laptop"\n troxy mcps rename --mcp "old-name" --name "Staging Server"\n`,
|
|
9
|
-
create: ` troxy mcps create --name <name>\n\n Creates a new API key for another agent/machine. The key is shown once
|
|
9
|
+
create: ` troxy mcps create --name <name>\n\n Creates a new API key for another agent/machine. The key is shown once.\n Save it, then run 'troxy init --key <key>' on that machine.\n\n Options:\n --name Label for the new key\n`,
|
|
10
10
|
revoke: ` troxy mcps revoke --mcp <name>\n\n Permanently revokes an MCP's API key. That machine will stop being able\n to evaluate payments until reconnected with a new key.\n`,
|
|
11
|
-
pause: ` troxy pause / troxy mcps pause [--mcp <name>]\n\n Pauses an MCP (blocks all its payment evaluations). Without --mcp, pauses\n this machine's MCP
|
|
11
|
+
pause: ` troxy pause / troxy mcps pause [--mcp <name>]\n\n Pauses an MCP (blocks all its payment evaluations). Without --mcp, pauses\n this machine's MCP, same as running 'troxy pause'.\n`,
|
|
12
12
|
resume: ` troxy resume / troxy mcps resume [--mcp <name>]\n\n Resumes a paused MCP. Without --mcp, resumes this machine's MCP.\n`,
|
|
13
|
-
budget: ` troxy mcps budget --mcp <name> [options]\n\n Sets or clears a monthly spend limit for a specific MCP.\n\n Options:\n --mcp <name> MCP to configure (required)\n --currency <cur> USD, ILS, or EUR (default: USD)\n --limit <n> Monthly limit\n --clear Remove the limit for that currency\n --action <action> block, escalate, notify, or allow
|
|
13
|
+
budget: ` troxy mcps budget --mcp <name> [options]\n\n Sets or clears a monthly spend limit for a specific MCP.\n\n Options:\n --mcp <name> MCP to configure (required)\n --currency <cur> USD, ILS, or EUR (default: USD)\n --limit <n> Monthly limit\n --clear Remove the limit for that currency\n --action <action> block, escalate, notify, or allow: what happens once hit\n --reset-usage Reset this cycle's usage back to 0\n\n Example:\n troxy mcps budget --mcp "My Laptop" --currency USD --limit 500\n`,
|
|
14
14
|
'set-default-action': ` troxy mcps set-default-action --mcp <name> --action <action>\n\n Sets the fallback decision for an MCP when no policy matches.\n\n Options:\n --mcp <name> MCP to configure (required)\n --action <action> ALLOW, BLOCK, ESCALATE, or NOTIFY\n`,
|
|
15
15
|
};
|
|
16
16
|
|
|
@@ -86,7 +86,7 @@ export async function runMcps([sub, ...args], flags) {
|
|
|
86
86
|
const result = await api.createToken(jwt, { name });
|
|
87
87
|
console.log(`\n API key created for "${name}":\n`);
|
|
88
88
|
console.log(` ${result.key}\n`);
|
|
89
|
-
console.log(' Shown once
|
|
89
|
+
console.log(' Shown once, save it now. Run "troxy init --key <key>" on that machine to connect it.\n');
|
|
90
90
|
break;
|
|
91
91
|
}
|
|
92
92
|
|
|
@@ -128,7 +128,7 @@ export async function runMcps([sub, ...args], flags) {
|
|
|
128
128
|
else { console.error(' --limit is required (or pass --clear)\n'); process.exit(1); }
|
|
129
129
|
}
|
|
130
130
|
if (flags['reset-usage']) body.reset_usage = true;
|
|
131
|
-
if (Object.keys(body).length === 0) { console.error(' Nothing to update
|
|
131
|
+
if (Object.keys(body).length === 0) { console.error(' Nothing to update, pass at least one option\n'); process.exit(1); }
|
|
132
132
|
await api.updateTokenBudget(jwt, tok.id, body);
|
|
133
133
|
console.log(`\n Budget updated for "${tok.name || tok.prefix}" ✓\n`);
|
|
134
134
|
break;
|
package/src/policies.js
CHANGED
|
@@ -14,7 +14,7 @@ function _promptYN(question) {
|
|
|
14
14
|
const HELP = {
|
|
15
15
|
list: ` troxy policies list\n\n Lists all policies in your account with their action, scope, status, and conditions.\n`,
|
|
16
16
|
describe: ` troxy policies describe --name <policy-name>\n\n Shows full details for a single policy.\n\n Options:\n --name Name of the policy (use single quotes for names with special chars)\n`,
|
|
17
|
-
create: ` troxy policies create --name <name> --action <action> [options]\n troxy policies create --describe "<plain English>"\n\n Creates a new policy. Login required.\n\n AI builder:\n --describe "<text>" Describe the policy in plain English (e.g. "block\n Amazon purchases over $200") and Troxy AI drafts\n it for you to confirm. Rate-limited per day.\n\n Manual
|
|
17
|
+
create: ` troxy policies create --name <name> --action <action> [options]\n troxy policies create --describe "<plain English>"\n\n Creates a new policy. Login required.\n\n AI builder:\n --describe "<text>" Describe the policy in plain English (e.g. "block\n Amazon purchases over $200") and Troxy AI drafts\n it for you to confirm. Rate-limited per day.\n\n Manual (required):\n --name Policy name\n --action ALLOW, BLOCK, NOTIFY, or ESCALATE\n\n Manual (optional conditions):\n --field Field to match: amount, merchant_name, tx_per_day\n --operator eq, neq, gt, gte, lt, lte, contains, starts_with, not_contains, between\n --value Comparison value (e.g. 500, amazon)\n --value2 Upper bound for 'between' operator\n\n Priority:\n --priority <n> Explicit priority number (default: auto, max+10)\n Lower number = higher priority (evaluated first).\n\n Scope (default: all agents, every MCP plus Troxy Chat):\n --mcp <name> Scope to one or more MCPs (comma-separated).\n Run 'troxy mcps list' to see MCP names.\n --chat Include Troxy Chat. Implied by default; combine with\n --mcp to scope to specific MCPs *and* chat, or use\n alone to scope to Troxy Chat only (no MCPs).\n --no-chat Exclude Troxy Chat from this policy's scope.\n\n Examples:\n troxy policies create --describe "block Amazon purchases over $200"\n troxy policies create --name "Block large" --action BLOCK --field amount --operator gte --value 500\n troxy policies create --name "Block Amazon" --action BLOCK --field merchant_name --operator contains --value amazon\n troxy policies create --name "Cap volume" --action BLOCK --field tx_per_day --operator gt --value 20\n troxy policies create --name "Allow Wiki" --action ALLOW --priority 5 --field merchant_name --operator contains --value Wiki\n troxy policies create --name "Laptop only" --action BLOCK --mcp "My Laptop" --field amount --operator gte --value 100\n troxy policies create --name "Multi-agent" --action BLOCK --mcp "My Laptop,Server" --field amount --operator gte --value 100\n troxy policies create --name "Chat only" --action ESCALATE --chat --field amount --operator gte --value 200\n troxy policies create --name "MCPs, no chat" --action BLOCK --no-chat --field merchant_name --operator contains --value casino\n`,
|
|
18
18
|
'set-priority': ` troxy policies set-priority --name <policy-name> --priority <n>\n\n Changes the priority of a policy. Lower number = higher priority (evaluated first).\n\n Options:\n --name Name of the policy\n --priority New priority number (e.g. 10, 20, 50)\n\n Example:\n troxy policies set-priority --name "Block Wiki" --priority 5\n`,
|
|
19
19
|
resume: ` troxy policies resume --name <policy-name>\n\n Resumes a paused policy.\n\n Options:\n --name Name of the policy to resume\n`,
|
|
20
20
|
pause: ` troxy policies pause --name <policy-name>\n\n Pauses a policy without deleting it. The policy stops firing until you resume it.\n\n Options:\n --name Name of the policy to pause\n`,
|
|
@@ -182,7 +182,7 @@ export async function runPolicies([sub, ...args], flags) {
|
|
|
182
182
|
const appliesToChat = flags['no-chat'] ? false : true;
|
|
183
183
|
|
|
184
184
|
if (!isGlobal && mcpIds.length === 0 && !appliesToChat) {
|
|
185
|
-
console.error(' Nothing to scope to
|
|
185
|
+
console.error(' Nothing to scope to, pass --mcp, --chat, or drop --no-chat\n'); process.exit(1);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
const priority = flags.priority != null ? parseInt(flags.priority, 10) : undefined;
|
package/src/secrets.js
CHANGED
|
@@ -5,7 +5,7 @@ import { table } from './print.js';
|
|
|
5
5
|
|
|
6
6
|
const HELP = {
|
|
7
7
|
list: ` troxy secrets list\n\n Lists your saved LLM provider keys (used by Troxy Chat). Values are\n never shown, only a masked preview.\n`,
|
|
8
|
-
set: ` troxy secrets set --name <name> [--type api_key|text]\n\n Saves or updates an LLM provider key. You'll be prompted for the value\n so it never appears in your shell history. Login required.\n\n Options:\n --name Label for this key (e.g. "OpenAI", "Anthropic")\n --type api_key (default) or text\n\n Card secrets are dashboard-only
|
|
8
|
+
set: ` troxy secrets set --name <name> [--type api_key|text]\n\n Saves or updates an LLM provider key. You'll be prompted for the value\n so it never appears in your shell history. Login required.\n\n Options:\n --name Label for this key (e.g. "OpenAI", "Anthropic")\n --type api_key (default) or text\n\n Card secrets are dashboard-only; troxy secrets does not handle them.\n\n Example:\n troxy secrets set --name "OpenAI"\n`,
|
|
9
9
|
delete: ` troxy secrets delete --name <name>\n\n Deletes a saved key. Login required.\n`,
|
|
10
10
|
};
|
|
11
11
|
|
package/src/settings.js
CHANGED
|
@@ -32,7 +32,7 @@ export async function runSettings([sub, ...args], flags) {
|
|
|
32
32
|
Notify email: ${s.notify_prefs.notify_email || '(account email)'}
|
|
33
33
|
|
|
34
34
|
Chat budget action: ${s.chat_budget_action}
|
|
35
|
-
Chat budget limits: ${s.chat_budget_limits.length ? s.chat_budget_limits.map(b => `${b.currency} ${b.used}/${b.limit}`).join(', ') : 'none set
|
|
35
|
+
Chat budget limits: ${s.chat_budget_limits.length ? s.chat_budget_limits.map(b => `${b.currency} ${b.used}/${b.limit}`).join(', ') : 'none set, run troxy chat-budget'}
|
|
36
36
|
`);
|
|
37
37
|
break;
|
|
38
38
|
}
|
|
@@ -69,7 +69,7 @@ export async function runSettings([sub, ...args], flags) {
|
|
|
69
69
|
if (Object.keys(notify_prefs).length) body.notify_prefs = notify_prefs;
|
|
70
70
|
|
|
71
71
|
if (Object.keys(body).length === 0) {
|
|
72
|
-
console.error(' Nothing to update
|
|
72
|
+
console.error(' Nothing to update, pass at least one option. Run troxy settings set --help\n');
|
|
73
73
|
process.exit(1);
|
|
74
74
|
}
|
|
75
75
|
|
package/src/uninstall.js
CHANGED
|
@@ -84,7 +84,7 @@ function removeMcpEntries() {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
export async function runUninstall() {
|
|
87
|
-
console.log('\n Troxy
|
|
87
|
+
console.log('\n Troxy: Uninstall\n');
|
|
88
88
|
|
|
89
89
|
const answer = await prompt(' This will remove Troxy from this machine. Continue? (y/N): ');
|
|
90
90
|
if (answer.toLowerCase() !== 'y') {
|