botanary 0.5.2 → 0.6.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/dist/botanary.js +2 -0
- package/package.json +8 -6
- package/dist/bin/botanary.js +0 -25
- package/dist/bin/botanary.js.map +0 -1
- package/dist/src/app-url.js +0 -52
- package/dist/src/app-url.js.map +0 -1
- package/dist/src/cli.js +0 -195
- package/dist/src/cli.js.map +0 -1
- package/dist/src/commands/account.js +0 -171
- package/dist/src/commands/account.js.map +0 -1
- package/dist/src/commands/agent.js +0 -338
- package/dist/src/commands/agent.js.map +0 -1
- package/dist/src/commands/authority.js +0 -634
- package/dist/src/commands/authority.js.map +0 -1
- package/dist/src/commands/mcp.js +0 -163
- package/dist/src/commands/mcp.js.map +0 -1
- package/dist/src/commands/services.js +0 -460
- package/dist/src/commands/services.js.map +0 -1
- package/dist/src/commands/session-writes.js +0 -196
- package/dist/src/commands/session-writes.js.map +0 -1
- package/dist/src/commands/sign.js +0 -311
- package/dist/src/commands/sign.js.map +0 -1
- package/dist/src/commands/system.js +0 -135
- package/dist/src/commands/system.js.map +0 -1
- package/dist/src/commands/tokens.js +0 -36
- package/dist/src/commands/tokens.js.map +0 -1
- package/dist/src/commands/utilities.js +0 -119
- package/dist/src/commands/utilities.js.map +0 -1
- package/dist/src/commands/wallet.js +0 -1013
- package/dist/src/commands/wallet.js.map +0 -1
- package/dist/src/commands/watch.js +0 -259
- package/dist/src/commands/watch.js.map +0 -1
- package/dist/src/completion.js +0 -69
- package/dist/src/completion.js.map +0 -1
- package/dist/src/config-store.js +0 -52
- package/dist/src/config-store.js.map +0 -1
- package/dist/src/context.js +0 -19
- package/dist/src/context.js.map +0 -1
- package/dist/src/errors.js +0 -116
- package/dist/src/errors.js.map +0 -1
- package/dist/src/help/examples.js +0 -904
- package/dist/src/help/examples.js.map +0 -1
- package/dist/src/help/format.js +0 -144
- package/dist/src/help/format.js.map +0 -1
- package/dist/src/help/groups.js +0 -39
- package/dist/src/help/groups.js.map +0 -1
- package/dist/src/install-method.js +0 -50
- package/dist/src/install-method.js.map +0 -1
- package/dist/src/mcp-snippets.js +0 -27
- package/dist/src/mcp-snippets.js.map +0 -1
- package/dist/src/outcome.js +0 -63
- package/dist/src/outcome.js.map +0 -1
- package/dist/src/package-version.js +0 -53
- package/dist/src/package-version.js.map +0 -1
- package/dist/src/parser.js +0 -48
- package/dist/src/parser.js.map +0 -1
- package/dist/src/progress.js +0 -56
- package/dist/src/progress.js.map +0 -1
- package/dist/src/prompt-doc.js +0 -92
- package/dist/src/prompt-doc.js.map +0 -1
- package/dist/src/render/accounts.js +0 -21
- package/dist/src/render/accounts.js.map +0 -1
- package/dist/src/render/activity.js +0 -34
- package/dist/src/render/activity.js.map +0 -1
- package/dist/src/render/agents.js +0 -42
- package/dist/src/render/agents.js.map +0 -1
- package/dist/src/render/balance.js +0 -85
- package/dist/src/render/balance.js.map +0 -1
- package/dist/src/render/banner.js +0 -17
- package/dist/src/render/banner.js.map +0 -1
- package/dist/src/render/chains.js +0 -52
- package/dist/src/render/chains.js.map +0 -1
- package/dist/src/render/colors.js +0 -50
- package/dist/src/render/colors.js.map +0 -1
- package/dist/src/render/gas.js +0 -34
- package/dist/src/render/gas.js.map +0 -1
- package/dist/src/render/grant.js +0 -34
- package/dist/src/render/grant.js.map +0 -1
- package/dist/src/render/kv.js +0 -60
- package/dist/src/render/kv.js.map +0 -1
- package/dist/src/render/mandates.js +0 -111
- package/dist/src/render/mandates.js.map +0 -1
- package/dist/src/render/print.js +0 -18
- package/dist/src/render/print.js.map +0 -1
- package/dist/src/render/redact.js +0 -23
- package/dist/src/render/redact.js.map +0 -1
- package/dist/src/render/table.js +0 -16
- package/dist/src/render/table.js.map +0 -1
- package/dist/src/repl.js +0 -232
- package/dist/src/repl.js.map +0 -1
- package/dist/src/review.js +0 -52
- package/dist/src/review.js.map +0 -1
- package/dist/src/run-installer.js +0 -30
- package/dist/src/run-installer.js.map +0 -1
- package/dist/src/settings.js +0 -88
- package/dist/src/settings.js.map +0 -1
- package/dist/src/update-check.js +0 -91
- package/dist/src/update-check.js.map +0 -1
- package/dist/src/validate.js +0 -138
- package/dist/src/validate.js.map +0 -1
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
import * as clack from '@clack/prompts';
|
|
2
|
-
import { proposePayment, proposeSwap, describeGrant, botanaryMcpHome, openBrowser, pairingLink, } from 'botanary-mcp';
|
|
3
|
-
import { randomBytes } from 'node:crypto';
|
|
4
|
-
import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
5
|
-
import { join } from 'node:path';
|
|
6
|
-
import { glyphs } from '../render/colors.js';
|
|
7
|
-
import { group } from '../help/groups.js';
|
|
8
|
-
import { printResult } from '../render/print.js';
|
|
9
|
-
import { renderGrant } from '../render/grant.js';
|
|
10
|
-
import { step } from '../progress.js';
|
|
11
|
-
import { confirmOrThrow, dryRunPayload, renderReview } from '../review.js';
|
|
12
|
-
import { classifyAgentAction } from '../outcome.js';
|
|
13
|
-
import { assertAddress, assertTierAllows, familyOf, findChain, parseAmount } from '../validate.js';
|
|
14
|
-
import { invalidArgs } from '../errors.js';
|
|
15
|
-
export function registerAgentCommands(program) {
|
|
16
|
-
const agent = group(program.command('agent').description('This machine\'s own agent identity, grant, and spend under it'), 'Agent');
|
|
17
|
-
agent
|
|
18
|
-
.command('identity')
|
|
19
|
-
.description("This machine's local agent key: address, public key, fingerprint")
|
|
20
|
-
.action(async () => {
|
|
21
|
-
const ctx = program.opts().__ctx;
|
|
22
|
-
const identity = await ctx.runtime.identity();
|
|
23
|
-
printResult(ctx, { address: identity.address, publicKey: identity.publicKey, fingerprint: identity.fingerprint, keyStorage: identity.backend });
|
|
24
|
-
});
|
|
25
|
-
agent
|
|
26
|
-
.command('whoami')
|
|
27
|
-
.description('What Botanary says about this agent: claimed, live, which account')
|
|
28
|
-
.action(async () => {
|
|
29
|
-
const ctx = program.opts().__ctx;
|
|
30
|
-
// Deliberately NOT wrapped in a try/catch that softens the failure: GET /agents/me failing IS the
|
|
31
|
-
// answer when this agent was never claimed, and reporting a fabricated "connected" is the one thing
|
|
32
|
-
// this command must never do. `botanary whoami` is the forgiving both-lanes view.
|
|
33
|
-
const self = await step(ctx, 'Asking Botanary about this agent', () => ctx.runtime.me());
|
|
34
|
-
printResult(ctx, self, () => renderGrant(self, describeGrant(self)));
|
|
35
|
-
});
|
|
36
|
-
agent
|
|
37
|
-
.command('account')
|
|
38
|
-
.description('The one account this agent is bound to')
|
|
39
|
-
.option('--chain-id <chainId>', 'Return the account row for this chain')
|
|
40
|
-
.action(async (opts) => {
|
|
41
|
-
const ctx = program.opts().__ctx;
|
|
42
|
-
const chainId = opts.chainId === undefined ? undefined : Number(opts.chainId);
|
|
43
|
-
if (chainId !== undefined && !Number.isFinite(chainId)) {
|
|
44
|
-
throw invalidArgs(`--chain-id must be a number, got ${JSON.stringify(opts.chainId)}.`);
|
|
45
|
-
}
|
|
46
|
-
const account = await step(ctx, 'Reading the bound account', () => ctx.runtime.getAccount(chainId === undefined ? {} : { chainId }));
|
|
47
|
-
printResult(ctx, account);
|
|
48
|
-
});
|
|
49
|
-
agent
|
|
50
|
-
.command('balance')
|
|
51
|
-
.description("The bound account's balance, read as this agent")
|
|
52
|
-
.action(async () => {
|
|
53
|
-
const ctx = program.opts().__ctx;
|
|
54
|
-
const balance = await step(ctx, 'Reading balance', () => ctx.runtime.getBalance());
|
|
55
|
-
printResult(ctx, balance);
|
|
56
|
-
});
|
|
57
|
-
agent
|
|
58
|
-
.command('request')
|
|
59
|
-
.description('Ask the owner to approve something this grant cannot cover')
|
|
60
|
-
.requiredOption('--reason <reason>', 'What the owner will see, e.g. "Pay the September invoice"')
|
|
61
|
-
.requiredOption('--calls-file <path>', 'JSON file: an array of { to, data, value, chainId }')
|
|
62
|
-
.action(async (opts) => {
|
|
63
|
-
const ctx = program.opts().__ctx;
|
|
64
|
-
let calls;
|
|
65
|
-
try {
|
|
66
|
-
calls = JSON.parse(await readFile(opts.callsFile, 'utf8'));
|
|
67
|
-
}
|
|
68
|
-
catch (e) {
|
|
69
|
-
throw invalidArgs(`Could not read --calls-file "${opts.callsFile}": ${e instanceof Error ? e.message : String(e)}`, 'It must be a readable JSON file containing an array of calls.');
|
|
70
|
-
}
|
|
71
|
-
if (!Array.isArray(calls) || calls.length === 0) {
|
|
72
|
-
throw invalidArgs('--calls-file must contain a non-empty JSON array of calls.');
|
|
73
|
-
}
|
|
74
|
-
for (const [index, call] of calls.entries()) {
|
|
75
|
-
const c = call;
|
|
76
|
-
if (typeof c.to !== 'string' || typeof c.data !== 'string' || typeof c.value !== 'string' || typeof c.chainId !== 'number') {
|
|
77
|
-
throw invalidArgs(`Call ${index} is malformed.`, 'Each call needs a string `to`, a string `data`, a string `value` and a numeric `chainId`.');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
const result = await step(ctx, 'Raising the request', () => ctx.runtime.raiseRequest(calls, opts.reason));
|
|
81
|
-
printResult(ctx, result);
|
|
82
|
-
});
|
|
83
|
-
agent
|
|
84
|
-
.command('pair')
|
|
85
|
-
.description('Show (or rotate) the pairing code, register it, and open the pairing screen')
|
|
86
|
-
.option('--regenerate', 'Rotate to a fresh code')
|
|
87
|
-
.option('--no-open', 'Print the code and the link without opening a browser')
|
|
88
|
-
.action(async (opts) => {
|
|
89
|
-
const ctx = program.opts().__ctx;
|
|
90
|
-
const identity = await ctx.runtime.identity();
|
|
91
|
-
// REGISTERS ON BOTH PATHS. `regeneratePairingCode()` only mints locally, so `--regenerate` used
|
|
92
|
-
// to hand the owner a fresh code the backend had never heard of - the exact "Pairing failed.
|
|
93
|
-
// Check the code and try again." that botanary-mcp's `registerPairing` exists to prevent. It
|
|
94
|
-
// matters more now this command opens a browser: a window onto a form that rejects the code
|
|
95
|
-
// stages a failure rather than a pairing. `pair()` returns the same code `pairingCode()` would.
|
|
96
|
-
const pairing = await step(ctx, opts.regenerate ? 'Rotating the pairing code' : 'Generating the pairing code', async () => {
|
|
97
|
-
if (opts.regenerate)
|
|
98
|
-
await ctx.runtime.regeneratePairingCode();
|
|
99
|
-
return ctx.runtime.pair();
|
|
100
|
-
});
|
|
101
|
-
// The SAME link botanary-mcp's `get_pairing_code` opens, from the same helper - two copies of
|
|
102
|
-
// that template is how the two surfaces drift into sending an owner to different places.
|
|
103
|
-
const url = pairingLink(ctx.runtime.apiBaseUrl, pairing.code);
|
|
104
|
-
// Interactive only, and never under `--json`: a command whose output is being piped must not
|
|
105
|
-
// take over the screen. Mirrors `sign`'s own gate, and `openBrowser` never throws - the headless
|
|
106
|
-
// path is this same flow with the URL printed.
|
|
107
|
-
const opened = ctx.interactive && opts.open !== false ? await openBrowser(url) : false;
|
|
108
|
-
if (!ctx.json) {
|
|
109
|
-
console.log(glyphs.info(`Pairing code: ${pairing.code}`));
|
|
110
|
-
console.log(opened
|
|
111
|
-
? glyphs.info(`Opened Botanary with the code already filled in: ${url}`)
|
|
112
|
-
: `In Botanary, open Connected agents and enter this code - or go straight there: ${url}`);
|
|
113
|
-
}
|
|
114
|
-
printResult(ctx, { ...pairing, address: identity.address, pairingUrl: url, browserOpened: opened });
|
|
115
|
-
});
|
|
116
|
-
agent
|
|
117
|
-
.command('grant')
|
|
118
|
-
.description('This agent\'s current grant, rendered in plain terms (what_may_i_do)')
|
|
119
|
-
.action(async () => {
|
|
120
|
-
const ctx = program.opts().__ctx;
|
|
121
|
-
const self = await step(ctx, 'Reading this agent\'s grant', () => ctx.runtime.me());
|
|
122
|
-
const description = describeGrant(self);
|
|
123
|
-
printResult(ctx, { description, grant: self.grant }, () => renderGrant(self, description));
|
|
124
|
-
});
|
|
125
|
-
agent
|
|
126
|
-
.command('requests')
|
|
127
|
-
.description('Every approval request this agent has filed, and the owner\'s verdict on each (list_requests)')
|
|
128
|
-
.action(async () => {
|
|
129
|
-
const ctx = program.opts().__ctx;
|
|
130
|
-
printResult(ctx, await step(ctx, 'Reading requests', () => ctx.runtime.listRequests()));
|
|
131
|
-
});
|
|
132
|
-
agent
|
|
133
|
-
.command('spend')
|
|
134
|
-
.description('Spend under this agent\'s own grant, unattended (propose_payment)')
|
|
135
|
-
.option('--recipient <address>', 'Destination address (0x... on EVM)')
|
|
136
|
-
.option('--amount <amount>', 'Amount in display units, e.g. 5')
|
|
137
|
-
.option('--token <addressOrAssetRef>', 'Token the grant budgets - contract address or CAIP-19 asset ref, never a symbol')
|
|
138
|
-
.option('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
139
|
-
.action(async (opts) => {
|
|
140
|
-
const ctx = program.opts().__ctx;
|
|
141
|
-
// Validate required inputs before making network calls. If chain-id is not specified and we're
|
|
142
|
-
// not in interactive mode, fail immediately with missing input - do not fetch chains first.
|
|
143
|
-
let { amount: amountRaw, token: tokenSymbol, recipient } = opts;
|
|
144
|
-
const chainId = opts.chainId ?? ctx.chain;
|
|
145
|
-
if (!ctx.interactive && (!chainId || !amountRaw || !tokenSymbol || !recipient)) {
|
|
146
|
-
throw invalidArgs('Missing required input', 'Use --amount, --token, --recipient, and --chain-id, or run in an interactive terminal.');
|
|
147
|
-
}
|
|
148
|
-
const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
|
|
149
|
-
const chain = findChain(chains, chainId);
|
|
150
|
-
assertTierAllows(chain, 'authority');
|
|
151
|
-
const family = familyOf(chain.namespace);
|
|
152
|
-
if (ctx.interactive && (!amountRaw || !tokenSymbol || !recipient)) {
|
|
153
|
-
const answers = await clack.group({
|
|
154
|
-
amount: () => clack.text({
|
|
155
|
-
message: 'Amount?',
|
|
156
|
-
initialValue: amountRaw,
|
|
157
|
-
validate: (value) => {
|
|
158
|
-
const parsed = Number(String(value).trim());
|
|
159
|
-
return Number.isFinite(parsed) && parsed > 0 ? undefined : 'A positive number, e.g. 5';
|
|
160
|
-
},
|
|
161
|
-
}),
|
|
162
|
-
token: () => clack.text({ message: 'Token?', initialValue: tokenSymbol }),
|
|
163
|
-
recipient: () => clack.text({ message: 'To?', initialValue: recipient }),
|
|
164
|
-
}, { onCancel: () => { clack.cancel('Cancelled.'); process.exit(0); } });
|
|
165
|
-
({ amount: amountRaw, token: tokenSymbol, recipient } = answers);
|
|
166
|
-
}
|
|
167
|
-
const amount = parseAmount(amountRaw);
|
|
168
|
-
if (!tokenSymbol)
|
|
169
|
-
throw invalidArgs('--token is required.', 'A token this grant budgets - see `botanary agent grant`.');
|
|
170
|
-
const to = assertAddress(recipient, family);
|
|
171
|
-
const rows = [
|
|
172
|
-
{ label: 'amount', value: `${amount} ${tokenSymbol}` },
|
|
173
|
-
{ label: 'to', value: to },
|
|
174
|
-
{ label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
|
|
175
|
-
{ label: 'signed by', value: "this agent's own grant, unattended" },
|
|
176
|
-
];
|
|
177
|
-
const warnings = ['This spends without asking the owner. The grant is the only bound.'];
|
|
178
|
-
if (ctx.dryRun) {
|
|
179
|
-
printResult(ctx, dryRunPayload('Review this spend', rows, warnings), () => renderReview('Dry run - nothing will be sent', rows, warnings));
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
await confirmOrThrow(ctx, 'Review this spend', rows, warnings);
|
|
183
|
-
const result = await step(ctx, 'Spending under the grant', () => proposePayment(ctx.runtime, { recipient: to, amount, token: tokenSymbol, chainId: chain.chainId ?? Number.NaN }));
|
|
184
|
-
const outcome = classifyAgentAction(result);
|
|
185
|
-
ctx.outcome.exit = outcome.exit;
|
|
186
|
-
printResult(ctx, result);
|
|
187
|
-
});
|
|
188
|
-
agent
|
|
189
|
-
.command('swap')
|
|
190
|
-
.description('Swap under this agent\'s own grant, unattended (propose_swap)')
|
|
191
|
-
.option('--token-in <addressOrAssetRef>', 'Token to sell - contract address or CAIP-19 asset ref, never a symbol')
|
|
192
|
-
.option('--token-out <addressOrAssetRef>', 'Token to buy - contract address or CAIP-19 asset ref, never a symbol')
|
|
193
|
-
.option('--amount-in <amount>', 'Amount of --token-in to sell, in display units')
|
|
194
|
-
.option('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
195
|
-
.option('--max-slippage-bps <bps>', 'Maximum acceptable slippage, in basis points')
|
|
196
|
-
.action(async (opts) => {
|
|
197
|
-
const ctx = program.opts().__ctx;
|
|
198
|
-
const { tokenIn, tokenOut, amountIn, maxSlippageBps } = opts;
|
|
199
|
-
const chainId = opts.chainId ?? ctx.chain;
|
|
200
|
-
if (!tokenIn)
|
|
201
|
-
throw invalidArgs('--token-in is required.', 'The token to sell.');
|
|
202
|
-
if (!tokenOut)
|
|
203
|
-
throw invalidArgs('--token-out is required.', 'The token to buy.');
|
|
204
|
-
if (!amountIn)
|
|
205
|
-
throw invalidArgs('--amount-in is required.', 'How much to sell, in display units.');
|
|
206
|
-
if (!chainId)
|
|
207
|
-
throw invalidArgs('--chain-id is required.', 'The chain the grant is on - see `botanary agent grant`.');
|
|
208
|
-
const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
|
|
209
|
-
const chain = findChain(chains, chainId);
|
|
210
|
-
assertTierAllows(chain, 'authority');
|
|
211
|
-
const amount = parseAmount(amountIn, '--amount-in');
|
|
212
|
-
const rows = [
|
|
213
|
-
{ label: 'sell', value: `${amount} ${tokenIn}` },
|
|
214
|
-
{ label: 'buy', value: tokenOut },
|
|
215
|
-
{ label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
|
|
216
|
-
{ label: 'signed by', value: "this agent's own grant, unattended" },
|
|
217
|
-
];
|
|
218
|
-
const warnings = ['This swaps without asking the owner. The grant is the only bound.'];
|
|
219
|
-
if (ctx.dryRun) {
|
|
220
|
-
printResult(ctx, dryRunPayload('Review this swap', rows, warnings), () => renderReview('Dry run - nothing will be sent', rows, warnings));
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
await confirmOrThrow(ctx, 'Review this swap', rows, warnings);
|
|
224
|
-
const result = await step(ctx, 'Swapping under the grant', () => proposeSwap(ctx.runtime, {
|
|
225
|
-
assetIn: tokenIn,
|
|
226
|
-
assetOut: tokenOut,
|
|
227
|
-
amountIn: amount,
|
|
228
|
-
chainId: chain.chainId ?? Number.NaN,
|
|
229
|
-
...(maxSlippageBps ? { maxSlippageBps: Number(maxSlippageBps) } : {}),
|
|
230
|
-
}));
|
|
231
|
-
const outcome = classifyAgentAction(result);
|
|
232
|
-
ctx.outcome.exit = outcome.exit;
|
|
233
|
-
printResult(ctx, result);
|
|
234
|
-
});
|
|
235
|
-
agent
|
|
236
|
-
.command('status <opId>')
|
|
237
|
-
.description('Check on a pending action this agent relayed (get_action_status)')
|
|
238
|
-
.action(async (opId) => {
|
|
239
|
-
const ctx = program.opts().__ctx;
|
|
240
|
-
printResult(ctx, await step(ctx, 'Checking action status', () => ctx.runtime.getUserOp(opId)));
|
|
241
|
-
});
|
|
242
|
-
agent
|
|
243
|
-
.command('apis')
|
|
244
|
-
.description('Paid (x402) third-party API endpoints this agent may call, with live price and remaining budget (list_apis)')
|
|
245
|
-
.requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
246
|
-
.action(async (opts) => {
|
|
247
|
-
const ctx = program.opts().__ctx;
|
|
248
|
-
printResult(ctx, await step(ctx, 'Reading APIs', () => ctx.runtime.listApis(Number(opts.chainId))));
|
|
249
|
-
});
|
|
250
|
-
agent
|
|
251
|
-
.command('pay <endpointId>')
|
|
252
|
-
.description('Call a paid API endpoint and pay for it inside the owner-committed on-chain budget (call_api)')
|
|
253
|
-
.requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
254
|
-
.requiredOption('--provider-id <providerId>', 'Provider that owns the endpoint')
|
|
255
|
-
.requiredOption('--url <url>', 'The endpoint URL to call')
|
|
256
|
-
.action(async (endpointId, opts) => {
|
|
257
|
-
const ctx = program.opts().__ctx;
|
|
258
|
-
const chainId = Number(opts.chainId);
|
|
259
|
-
const providerId = String(opts.providerId);
|
|
260
|
-
const url = String(opts.url);
|
|
261
|
-
const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
|
|
262
|
-
const chain = findChain(chains, chainId);
|
|
263
|
-
assertTierAllows(chain, 'authority');
|
|
264
|
-
const rows = [
|
|
265
|
-
{ label: 'endpoint', value: endpointId },
|
|
266
|
-
{ label: 'provider', value: providerId },
|
|
267
|
-
{ label: 'url', value: url },
|
|
268
|
-
{ label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
|
|
269
|
-
{ label: 'signed by', value: "this agent's own budget, unattended" },
|
|
270
|
-
];
|
|
271
|
-
const warnings = ['This calls an API and deducts from the on-chain budget without asking the owner.'];
|
|
272
|
-
if (ctx.dryRun) {
|
|
273
|
-
printResult(ctx, dryRunPayload('Review this API call', rows, warnings), () => renderReview('Dry run - nothing will be called', rows, warnings));
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
await confirmOrThrow(ctx, 'Review this API call', rows, warnings);
|
|
277
|
-
const result = await step(ctx, 'Calling the API', () => ctx.runtime.callApi({ chainId, providerId, endpointId, url }));
|
|
278
|
-
const outcome = classifyAgentAction(result);
|
|
279
|
-
ctx.outcome.exit = outcome.exit;
|
|
280
|
-
printResult(ctx, result);
|
|
281
|
-
});
|
|
282
|
-
agent
|
|
283
|
-
.command('budget')
|
|
284
|
-
.description('Remaining authorizations, per-call max, expiry and epoch for this agent on a chain (get_api_budget)')
|
|
285
|
-
.requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
286
|
-
.action(async (opts) => {
|
|
287
|
-
const ctx = program.opts().__ctx;
|
|
288
|
-
printResult(ctx, await step(ctx, 'Reading budget', () => ctx.runtime.getApiBudget(Number(opts.chainId))));
|
|
289
|
-
});
|
|
290
|
-
const FORGET_TOKEN_TTL_MS = 5 * 60 * 1000;
|
|
291
|
-
const pendingForgetPath = () => join(botanaryMcpHome(), '.cli-forget-pending.json');
|
|
292
|
-
agent
|
|
293
|
-
.command('forget')
|
|
294
|
-
.description('Step 1 of 2: preview what forgetting the local identity would destroy')
|
|
295
|
-
.action(async () => {
|
|
296
|
-
const ctx = program.opts().__ctx;
|
|
297
|
-
const hadIdentity = await ctx.runtime.store.hasIdentity();
|
|
298
|
-
if (!hadIdentity) {
|
|
299
|
-
printResult(ctx, { hadIdentity: false, message: 'No agent identity is stored on this machine - nothing to delete.' });
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
const confirmationToken = randomBytes(16).toString('hex');
|
|
303
|
-
await mkdir(botanaryMcpHome(), { recursive: true });
|
|
304
|
-
await writeFile(pendingForgetPath(), JSON.stringify({ token: confirmationToken, expiresAt: Date.now() + FORGET_TOKEN_TTL_MS }), 'utf8');
|
|
305
|
-
printResult(ctx, {
|
|
306
|
-
hadIdentity: true,
|
|
307
|
-
confirmationToken,
|
|
308
|
-
message: `Run \`botanary agent confirm-forget ${confirmationToken}\` within 5 minutes to actually delete the key from this machine.`,
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
agent
|
|
312
|
-
.command('confirm-forget <token>')
|
|
313
|
-
.description('Step 2 of 2: actually delete the agent key from this machine, given the token from forget')
|
|
314
|
-
.action(async (token) => {
|
|
315
|
-
const ctx = program.opts().__ctx;
|
|
316
|
-
let pending = null;
|
|
317
|
-
try {
|
|
318
|
-
pending = JSON.parse(await readFile(pendingForgetPath(), 'utf8'));
|
|
319
|
-
}
|
|
320
|
-
catch {
|
|
321
|
-
pending = null;
|
|
322
|
-
}
|
|
323
|
-
const valid = !!pending && pending.token === token && pending.expiresAt > Date.now();
|
|
324
|
-
if (!valid) {
|
|
325
|
-
throw invalidArgs('No matching, unexpired confirmation token.', 'Run `botanary agent forget` first, then pass the token it prints to `confirm-forget` within 5 minutes.');
|
|
326
|
-
}
|
|
327
|
-
await rm(pendingForgetPath(), { force: true });
|
|
328
|
-
await ctx.runtime.store.forget();
|
|
329
|
-
ctx.runtime.reset();
|
|
330
|
-
if (ctx.json) {
|
|
331
|
-
console.log(JSON.stringify({ status: 'deleted' }));
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
console.log(glyphs.success('Deleted the agent key from this machine.'));
|
|
335
|
-
}
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|