botanary 0.1.0 → 0.2.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 +186 -9
- package/dist/bin/botanary.js +13 -3
- package/dist/bin/botanary.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/src/app-url.js +32 -0
- package/dist/src/app-url.js.map +1 -0
- package/dist/src/cli.js +113 -23
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/agent.js +190 -49
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/mcp.js +136 -5
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/system.js +109 -12
- package/dist/src/commands/system.js.map +1 -1
- package/dist/src/commands/utilities.js +44 -0
- package/dist/src/commands/utilities.js.map +1 -0
- package/dist/src/commands/wallet.js +332 -94
- package/dist/src/commands/wallet.js.map +1 -1
- package/dist/src/completion.js +69 -0
- package/dist/src/completion.js.map +1 -0
- package/dist/src/config-store.js +52 -0
- package/dist/src/config-store.js.map +1 -0
- package/dist/src/context.js +14 -4
- package/dist/src/context.js.map +1 -1
- package/dist/src/errors.js +116 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/help/examples.js +357 -0
- package/dist/src/help/examples.js.map +1 -0
- package/dist/src/help/format.js +144 -0
- package/dist/src/help/format.js.map +1 -0
- package/dist/src/help/groups.js +39 -0
- package/dist/src/help/groups.js.map +1 -0
- package/dist/src/mcp-snippets.js +6 -0
- package/dist/src/mcp-snippets.js.map +1 -1
- package/dist/src/outcome.js +63 -0
- package/dist/src/outcome.js.map +1 -0
- package/dist/src/parser.js +18 -39
- package/dist/src/parser.js.map +1 -1
- package/dist/src/progress.js +37 -0
- package/dist/src/progress.js.map +1 -0
- package/dist/src/prompt-doc.js +92 -0
- package/dist/src/prompt-doc.js.map +1 -0
- package/dist/src/render/accounts.js +21 -0
- package/dist/src/render/accounts.js.map +1 -0
- package/dist/src/render/activity.js +34 -0
- package/dist/src/render/activity.js.map +1 -0
- package/dist/src/render/agents.js +42 -0
- package/dist/src/render/agents.js.map +1 -0
- package/dist/src/render/balance.js +68 -0
- package/dist/src/render/balance.js.map +1 -0
- package/dist/src/render/chains.js +52 -0
- package/dist/src/render/chains.js.map +1 -0
- package/dist/src/render/gas.js +34 -0
- package/dist/src/render/gas.js.map +1 -0
- package/dist/src/render/grant.js +34 -0
- package/dist/src/render/grant.js.map +1 -0
- package/dist/src/render/kv.js +60 -0
- package/dist/src/render/kv.js.map +1 -0
- package/dist/src/render/mandates.js +111 -0
- package/dist/src/render/mandates.js.map +1 -0
- package/dist/src/render/print.js +18 -0
- package/dist/src/render/print.js.map +1 -0
- package/dist/src/repl.js +114 -10
- package/dist/src/repl.js.map +1 -1
- package/dist/src/review.js +52 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/settings.js +88 -0
- package/dist/src/settings.js.map +1 -0
- package/dist/src/update-check.js +85 -0
- package/dist/src/update-check.js.map +1 -0
- package/dist/src/validate.js +92 -0
- package/dist/src/validate.js.map +1 -0
- package/package.json +2 -2
|
@@ -4,19 +4,82 @@ import { randomBytes } from 'node:crypto';
|
|
|
4
4
|
import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { glyphs } from '../render/colors.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
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';
|
|
10
15
|
export function registerAgentCommands(program) {
|
|
11
|
-
const agent = program.command('agent').description('This machine\'s own agent identity, grant, and spend under it');
|
|
16
|
+
const agent = group(program.command('agent').description('This machine\'s own agent identity, grant, and spend under it'), 'Agent');
|
|
12
17
|
agent
|
|
13
|
-
.command('
|
|
14
|
-
.description(
|
|
18
|
+
.command('identity')
|
|
19
|
+
.description("This machine's local agent key: address, public key, fingerprint")
|
|
15
20
|
.action(async () => {
|
|
16
21
|
const ctx = program.opts().__ctx;
|
|
17
22
|
const identity = await ctx.runtime.identity();
|
|
18
23
|
printResult(ctx, { address: identity.address, publicKey: identity.publicKey, fingerprint: identity.fingerprint, keyStorage: identity.backend });
|
|
19
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
|
+
});
|
|
20
83
|
agent
|
|
21
84
|
.command('pair')
|
|
22
85
|
.description('Show (or rotate) the pairing code and register it with Botanary')
|
|
@@ -24,7 +87,7 @@ export function registerAgentCommands(program) {
|
|
|
24
87
|
.action(async (opts) => {
|
|
25
88
|
const ctx = program.opts().__ctx;
|
|
26
89
|
const identity = await ctx.runtime.identity();
|
|
27
|
-
const pairing = opts.regenerate ?
|
|
90
|
+
const pairing = await step(ctx, opts.regenerate ? 'Rotating the pairing code' : 'Generating the pairing code', () => opts.regenerate ? ctx.runtime.regeneratePairingCode() : ctx.runtime.pair());
|
|
28
91
|
if (!ctx.json) {
|
|
29
92
|
console.log(glyphs.info(`Pairing code: ${pairing.code}`));
|
|
30
93
|
console.log('In Botanary, open Connected agents and enter this code.');
|
|
@@ -36,66 +99,118 @@ export function registerAgentCommands(program) {
|
|
|
36
99
|
.description('This agent\'s current grant, rendered in plain terms (what_may_i_do)')
|
|
37
100
|
.action(async () => {
|
|
38
101
|
const ctx = program.opts().__ctx;
|
|
39
|
-
const self = await ctx.runtime.me();
|
|
102
|
+
const self = await step(ctx, 'Reading this agent\'s grant', () => ctx.runtime.me());
|
|
40
103
|
const description = describeGrant(self);
|
|
41
|
-
|
|
42
|
-
console.log(description);
|
|
43
|
-
else
|
|
44
|
-
printResult(ctx, { description, grant: self.grant });
|
|
104
|
+
printResult(ctx, { description, grant: self.grant }, () => renderGrant(self, description));
|
|
45
105
|
});
|
|
46
106
|
agent
|
|
47
107
|
.command('requests')
|
|
48
108
|
.description('Every approval request this agent has filed, and the owner\'s verdict on each (list_requests)')
|
|
49
109
|
.action(async () => {
|
|
50
110
|
const ctx = program.opts().__ctx;
|
|
51
|
-
printResult(ctx, await ctx.runtime.listRequests());
|
|
111
|
+
printResult(ctx, await step(ctx, 'Reading requests', () => ctx.runtime.listRequests()));
|
|
52
112
|
});
|
|
53
113
|
agent
|
|
54
114
|
.command('spend')
|
|
55
115
|
.description('Spend under this agent\'s own grant, unattended (propose_payment)')
|
|
56
|
-
.option('--recipient <address>')
|
|
57
|
-
.option('--amount <amount>')
|
|
58
|
-
.option('--token <symbol>')
|
|
59
|
-
.option('--chain-id <chainId>')
|
|
116
|
+
.option('--recipient <address>', 'Destination address (0x... on EVM)')
|
|
117
|
+
.option('--amount <amount>', 'Amount in display units, e.g. 5')
|
|
118
|
+
.option('--token <symbol>', 'Token symbol the grant budgets, e.g. USDC')
|
|
119
|
+
.option('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
60
120
|
.action(async (opts) => {
|
|
61
121
|
const ctx = program.opts().__ctx;
|
|
62
|
-
|
|
63
|
-
|
|
122
|
+
// Validate required inputs before making network calls. If chain-id is not specified and we're
|
|
123
|
+
// not in interactive mode, fail immediately with missing input - do not fetch chains first.
|
|
124
|
+
let { amount: amountRaw, token: tokenSymbol, recipient } = opts;
|
|
125
|
+
const chainId = opts.chainId ?? ctx.chain;
|
|
126
|
+
if (!ctx.interactive && (!chainId || !amountRaw || !tokenSymbol || !recipient)) {
|
|
127
|
+
throw invalidArgs('Missing required input', 'Use --amount, --token, --recipient, and --chain-id, or run in an interactive terminal.');
|
|
128
|
+
}
|
|
129
|
+
const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
|
|
130
|
+
const chain = findChain(chains, chainId);
|
|
131
|
+
assertTierAllows(chain, 'authority');
|
|
132
|
+
const family = familyOf(chain.namespace);
|
|
133
|
+
if (ctx.interactive && (!amountRaw || !tokenSymbol || !recipient)) {
|
|
64
134
|
const answers = await clack.group({
|
|
65
|
-
amount: () => clack.text({
|
|
135
|
+
amount: () => clack.text({
|
|
136
|
+
message: 'Amount?',
|
|
137
|
+
initialValue: amountRaw,
|
|
138
|
+
validate: (value) => {
|
|
139
|
+
const parsed = Number(String(value).trim());
|
|
140
|
+
return Number.isFinite(parsed) && parsed > 0 ? undefined : 'A positive number, e.g. 5';
|
|
141
|
+
},
|
|
142
|
+
}),
|
|
66
143
|
token: () => clack.text({ message: 'Token?', initialValue: tokenSymbol }),
|
|
67
144
|
recipient: () => clack.text({ message: 'To?', initialValue: recipient }),
|
|
68
|
-
chainId: () => clack.text({ message: 'Chain ID?', initialValue: chainId }),
|
|
69
145
|
}, { onCancel: () => { clack.cancel('Cancelled.'); process.exit(0); } });
|
|
70
|
-
({
|
|
146
|
+
({ amount: amountRaw, token: tokenSymbol, recipient } = answers);
|
|
71
147
|
}
|
|
72
|
-
|
|
73
|
-
|
|
148
|
+
const amount = parseAmount(amountRaw);
|
|
149
|
+
if (!tokenSymbol)
|
|
150
|
+
throw invalidArgs('--token is required.', 'A token this grant budgets - see `botanary agent grant`.');
|
|
151
|
+
const to = assertAddress(recipient, family);
|
|
152
|
+
const rows = [
|
|
153
|
+
{ label: 'amount', value: `${amount} ${tokenSymbol}` },
|
|
154
|
+
{ label: 'to', value: to },
|
|
155
|
+
{ label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
|
|
156
|
+
{ label: 'signed by', value: "this agent's own grant, unattended" },
|
|
157
|
+
];
|
|
158
|
+
const warnings = ['This spends without asking the owner. The grant is the only bound.'];
|
|
159
|
+
if (ctx.dryRun) {
|
|
160
|
+
printResult(ctx, dryRunPayload('Review this spend', rows, warnings), () => renderReview('Dry run - nothing will be sent', rows, warnings));
|
|
161
|
+
return;
|
|
74
162
|
}
|
|
75
|
-
|
|
163
|
+
await confirmOrThrow(ctx, 'Review this spend', rows, warnings);
|
|
164
|
+
const result = await step(ctx, 'Spending under the grant', () => proposePayment(ctx.runtime, { recipient: to, amount, tokenSymbol, chainId: chain.chainId ?? Number.NaN }));
|
|
165
|
+
const outcome = classifyAgentAction(result);
|
|
166
|
+
ctx.outcome.exit = outcome.exit;
|
|
76
167
|
printResult(ctx, result);
|
|
77
168
|
});
|
|
78
169
|
agent
|
|
79
170
|
.command('swap')
|
|
80
171
|
.description('Swap under this agent\'s own grant, unattended (propose_swap)')
|
|
81
|
-
.option('--token-in <symbol>')
|
|
82
|
-
.option('--token-out <symbol>')
|
|
83
|
-
.option('--amount-in <amount>')
|
|
84
|
-
.option('--chain-id <chainId>')
|
|
85
|
-
.option('--max-slippage-bps <bps>')
|
|
172
|
+
.option('--token-in <symbol>', 'Token to sell')
|
|
173
|
+
.option('--token-out <symbol>', 'Token to buy')
|
|
174
|
+
.option('--amount-in <amount>', 'Amount of --token-in to sell, in display units')
|
|
175
|
+
.option('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
176
|
+
.option('--max-slippage-bps <bps>', 'Maximum acceptable slippage, in basis points')
|
|
86
177
|
.action(async (opts) => {
|
|
87
178
|
const ctx = program.opts().__ctx;
|
|
88
|
-
const { tokenIn, tokenOut, amountIn,
|
|
89
|
-
|
|
90
|
-
|
|
179
|
+
const { tokenIn, tokenOut, amountIn, maxSlippageBps } = opts;
|
|
180
|
+
const chainId = opts.chainId ?? ctx.chain;
|
|
181
|
+
if (!tokenIn)
|
|
182
|
+
throw invalidArgs('--token-in is required.', 'The token to sell.');
|
|
183
|
+
if (!tokenOut)
|
|
184
|
+
throw invalidArgs('--token-out is required.', 'The token to buy.');
|
|
185
|
+
if (!amountIn)
|
|
186
|
+
throw invalidArgs('--amount-in is required.', 'How much to sell, in display units.');
|
|
187
|
+
if (!chainId)
|
|
188
|
+
throw invalidArgs('--chain-id is required.', 'The chain the grant is on - see `botanary agent grant`.');
|
|
189
|
+
const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
|
|
190
|
+
const chain = findChain(chains, chainId);
|
|
191
|
+
assertTierAllows(chain, 'authority');
|
|
192
|
+
const amount = parseAmount(amountIn, '--amount-in');
|
|
193
|
+
const rows = [
|
|
194
|
+
{ label: 'sell', value: `${amount} ${tokenIn}` },
|
|
195
|
+
{ label: 'buy', value: tokenOut },
|
|
196
|
+
{ label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
|
|
197
|
+
{ label: 'signed by', value: "this agent's own grant, unattended" },
|
|
198
|
+
];
|
|
199
|
+
const warnings = ['This swaps without asking the owner. The grant is the only bound.'];
|
|
200
|
+
if (ctx.dryRun) {
|
|
201
|
+
printResult(ctx, dryRunPayload('Review this swap', rows, warnings), () => renderReview('Dry run - nothing will be sent', rows, warnings));
|
|
202
|
+
return;
|
|
91
203
|
}
|
|
92
|
-
|
|
204
|
+
await confirmOrThrow(ctx, 'Review this swap', rows, warnings);
|
|
205
|
+
const result = await step(ctx, 'Swapping under the grant', () => proposeSwap(ctx.runtime, {
|
|
93
206
|
tokenIn,
|
|
94
207
|
tokenOut,
|
|
95
|
-
amountIn:
|
|
96
|
-
chainId: Number
|
|
208
|
+
amountIn: amount,
|
|
209
|
+
chainId: chain.chainId ?? Number.NaN,
|
|
97
210
|
...(maxSlippageBps ? { maxSlippageBps: Number(maxSlippageBps) } : {}),
|
|
98
|
-
});
|
|
211
|
+
}));
|
|
212
|
+
const outcome = classifyAgentAction(result);
|
|
213
|
+
ctx.outcome.exit = outcome.exit;
|
|
99
214
|
printResult(ctx, result);
|
|
100
215
|
});
|
|
101
216
|
agent
|
|
@@ -103,33 +218,55 @@ export function registerAgentCommands(program) {
|
|
|
103
218
|
.description('Check on a pending action this agent relayed (get_action_status)')
|
|
104
219
|
.action(async (opId) => {
|
|
105
220
|
const ctx = program.opts().__ctx;
|
|
106
|
-
printResult(ctx, await ctx.runtime.getUserOp(opId));
|
|
221
|
+
printResult(ctx, await step(ctx, 'Checking action status', () => ctx.runtime.getUserOp(opId)));
|
|
107
222
|
});
|
|
108
223
|
agent
|
|
109
224
|
.command('apis')
|
|
110
225
|
.description('Paid (x402) third-party API endpoints this agent may call, with live price and remaining budget (list_apis)')
|
|
111
|
-
.requiredOption('--chain-id <chainId>')
|
|
226
|
+
.requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
112
227
|
.action(async (opts) => {
|
|
113
228
|
const ctx = program.opts().__ctx;
|
|
114
|
-
printResult(ctx, await ctx.runtime.listApis(Number(opts.chainId)));
|
|
229
|
+
printResult(ctx, await step(ctx, 'Reading APIs', () => ctx.runtime.listApis(Number(opts.chainId))));
|
|
115
230
|
});
|
|
116
231
|
agent
|
|
117
232
|
.command('pay <endpointId>')
|
|
118
233
|
.description('Call a paid API endpoint and pay for it inside the owner-committed on-chain budget (call_api)')
|
|
119
|
-
.requiredOption('--chain-id <chainId>')
|
|
120
|
-
.requiredOption('--provider-id <providerId>')
|
|
121
|
-
.requiredOption('--url <url>')
|
|
234
|
+
.requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
235
|
+
.requiredOption('--provider-id <providerId>', 'Provider that owns the endpoint')
|
|
236
|
+
.requiredOption('--url <url>', 'The endpoint URL to call')
|
|
122
237
|
.action(async (endpointId, opts) => {
|
|
123
238
|
const ctx = program.opts().__ctx;
|
|
124
|
-
|
|
239
|
+
const chainId = Number(opts.chainId);
|
|
240
|
+
const providerId = String(opts.providerId);
|
|
241
|
+
const url = String(opts.url);
|
|
242
|
+
const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
|
|
243
|
+
const chain = findChain(chains, chainId);
|
|
244
|
+
assertTierAllows(chain, 'authority');
|
|
245
|
+
const rows = [
|
|
246
|
+
{ label: 'endpoint', value: endpointId },
|
|
247
|
+
{ label: 'provider', value: providerId },
|
|
248
|
+
{ label: 'url', value: url },
|
|
249
|
+
{ label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
|
|
250
|
+
{ label: 'signed by', value: "this agent's own budget, unattended" },
|
|
251
|
+
];
|
|
252
|
+
const warnings = ['This calls an API and deducts from the on-chain budget without asking the owner.'];
|
|
253
|
+
if (ctx.dryRun) {
|
|
254
|
+
printResult(ctx, dryRunPayload('Review this API call', rows, warnings), () => renderReview('Dry run - nothing will be called', rows, warnings));
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
await confirmOrThrow(ctx, 'Review this API call', rows, warnings);
|
|
258
|
+
const result = await step(ctx, 'Calling the API', () => ctx.runtime.callApi({ chainId, providerId, endpointId, url }));
|
|
259
|
+
const outcome = classifyAgentAction(result);
|
|
260
|
+
ctx.outcome.exit = outcome.exit;
|
|
261
|
+
printResult(ctx, result);
|
|
125
262
|
});
|
|
126
263
|
agent
|
|
127
264
|
.command('budget')
|
|
128
265
|
.description('Remaining authorizations, per-call max, expiry and epoch for this agent on a chain (get_api_budget)')
|
|
129
|
-
.requiredOption('--chain-id <chainId>')
|
|
266
|
+
.requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
|
|
130
267
|
.action(async (opts) => {
|
|
131
268
|
const ctx = program.opts().__ctx;
|
|
132
|
-
printResult(ctx, await ctx.runtime.getApiBudget(Number(opts.chainId)));
|
|
269
|
+
printResult(ctx, await step(ctx, 'Reading budget', () => ctx.runtime.getApiBudget(Number(opts.chainId))));
|
|
133
270
|
});
|
|
134
271
|
const FORGET_TOKEN_TTL_MS = 5 * 60 * 1000;
|
|
135
272
|
const pendingForgetPath = () => join(botanaryMcpHome(), '.cli-forget-pending.json');
|
|
@@ -166,13 +303,17 @@ export function registerAgentCommands(program) {
|
|
|
166
303
|
}
|
|
167
304
|
const valid = !!pending && pending.token === token && pending.expiresAt > Date.now();
|
|
168
305
|
if (!valid) {
|
|
169
|
-
throw
|
|
170
|
-
'token it prints to `confirm-forget` within 5 minutes.');
|
|
306
|
+
throw invalidArgs('No matching, unexpired confirmation token.', 'Run `botanary agent forget` first, then pass the token it prints to `confirm-forget` within 5 minutes.');
|
|
171
307
|
}
|
|
172
308
|
await rm(pendingForgetPath(), { force: true });
|
|
173
309
|
await ctx.runtime.store.forget();
|
|
174
310
|
ctx.runtime.reset();
|
|
175
|
-
|
|
311
|
+
if (ctx.json) {
|
|
312
|
+
console.log(JSON.stringify({ status: 'deleted' }));
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
console.log(glyphs.success('Deleted the agent key from this machine.'));
|
|
316
|
+
}
|
|
176
317
|
});
|
|
177
318
|
}
|
|
178
319
|
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,SAAS,WAAW,CAAC,GAAe,EAAE,IAAa;IACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,+DAA+D,CAAC,CAAC;IAEpH,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mEAAmE,CAAC;SAChF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9C,WAAW,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAClJ,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,cAAc,EAAE,wBAAwB,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACzE,CAAC;QACD,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;;YACnC,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,+FAA+F,CAAC;SAC5G,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mEAAmE,CAAC;SAChF,MAAM,CAAC,uBAAuB,CAAC;SAC/B,MAAM,CAAC,mBAAmB,CAAC;SAC3B,MAAM,CAAC,kBAAkB,CAAC;SAC1B,MAAM,CAAC,sBAAsB,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9E,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAC/B;gBACE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBACtE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;gBACzE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;gBACxE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;aAC3E,EACD,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACrE,CAAC;YACF,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAsB,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAChH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/H,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,qBAAqB,CAAC;SAC7B,MAAM,CAAC,sBAAsB,CAAC;SAC9B,MAAM,CAAC,sBAAsB,CAAC;SAC9B,MAAM,CAAC,sBAAsB,CAAC;SAC9B,MAAM,CAAC,0BAA0B,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;QACtE,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE;YAC5C,OAAO;YACP,QAAQ;YACR,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;YACxB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC;QACH,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6GAA6G,CAAC;SAC1H,cAAc,CAAC,sBAAsB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,+FAA+F,CAAC;SAC5G,cAAc,CAAC,sBAAsB,CAAC;SACtC,cAAc,CAAC,4BAA4B,CAAC;SAC5C,cAAc,CAAC,aAAa,CAAC;SAC7B,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAAI,EAAE,EAAE;QACzC,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzI,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qGAAqG,CAAC;SAClH,cAAc,CAAC,sBAAsB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEL,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1C,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,0BAA0B,CAAC,CAAC;IAEpF,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,kEAAkE,EAAE,CAAC,CAAC;YACtH,OAAO;QACT,CAAC;QACD,MAAM,iBAAiB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,CACb,iBAAiB,EAAE,EACnB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,EAAE,CAAC,EACzF,MAAM,CACP,CAAC;QACF,WAAW,CAAC,GAAG,EAAE;YACf,WAAW,EAAE,IAAI;YACjB,iBAAiB;YACjB,OAAO,EAAE,uCAAuC,iBAAiB,mEAAmE;SACrI,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,2FAA2F,CAAC;SACxG,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,IAAI,OAAO,GAAgD,IAAI,CAAC;QAChE,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,+FAA+F;gBAC7F,uDAAuD,CAC1D,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,CAAC,iBAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/src/commands/mcp.js
CHANGED
|
@@ -1,19 +1,150 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
1
5
|
import { MCP_SNIPPETS } from '../mcp-snippets.js';
|
|
6
|
+
import { group } from '../help/groups.js';
|
|
7
|
+
import { colors, glyphs } from '../render/colors.js';
|
|
8
|
+
import { confirmOrThrow, dryRunPayload, renderReview } from '../review.js';
|
|
9
|
+
import { printResult } from '../render/print.js';
|
|
10
|
+
import { CliError, EXIT, invalidArgs } from '../errors.js';
|
|
11
|
+
/**
|
|
12
|
+
* The installed botanary-mcp bin, found by walking up from its resolved entry to the package root.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately NOT `require.resolve('botanary-mcp/package.json')`: that package's `exports` map declares
|
|
15
|
+
* only ".", so a subpath resolve throws ERR_PACKAGE_PATH_NOT_EXPORTED. Walking the filesystem sidesteps the
|
|
16
|
+
* exports map entirely and keeps working whether the dependency is a registry install or a local link.
|
|
17
|
+
*/
|
|
18
|
+
export function resolveMcpBin() {
|
|
19
|
+
const require = createRequire(import.meta.url);
|
|
20
|
+
let dir = dirname(require.resolve('botanary-mcp'));
|
|
21
|
+
for (let depth = 0; depth < 6; depth += 1) {
|
|
22
|
+
try {
|
|
23
|
+
const manifest = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
|
|
24
|
+
if (manifest.name === 'botanary-mcp') {
|
|
25
|
+
const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.['botanary-mcp'];
|
|
26
|
+
if (bin)
|
|
27
|
+
return join(dir, bin);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Not a package root, or unreadable - keep walking.
|
|
32
|
+
}
|
|
33
|
+
const parent = dirname(dir);
|
|
34
|
+
if (parent === dir)
|
|
35
|
+
break;
|
|
36
|
+
dir = parent;
|
|
37
|
+
}
|
|
38
|
+
throw new CliError('Could not locate the botanary-mcp binary in this install.', 'mcp_bin_not_found', EXIT.error, 'Reinstall botanary, or run `npx -y botanary-mcp` directly.');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Helper to spawn a child process and wait for it to exit. The onError callback is invoked when
|
|
42
|
+
* the child emits an 'error' event (e.g. when the command is not found).
|
|
43
|
+
*/
|
|
44
|
+
async function spawnAndWait(command, args, onError) {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
const child = spawn(command, args, { stdio: 'inherit' });
|
|
47
|
+
child.on('error', (error) => resolve(onError(error)));
|
|
48
|
+
child.on('close', (code) => resolve(code ?? 1));
|
|
49
|
+
});
|
|
50
|
+
}
|
|
2
51
|
export function registerMcpCommands(program) {
|
|
3
|
-
const mcp = program.command('mcp').description('Connect a coding agent to Botanary via botanary-mcp');
|
|
52
|
+
const mcp = group(program.command('mcp').description('Connect a coding agent to Botanary via botanary-mcp'), 'Connect');
|
|
4
53
|
mcp
|
|
5
54
|
.command('config [client]')
|
|
6
|
-
.description('Print the install snippet for a client
|
|
55
|
+
.description('Print the install snippet for a client')
|
|
7
56
|
.action((client) => {
|
|
57
|
+
const ctx = program.opts().__ctx;
|
|
8
58
|
if (!client) {
|
|
9
|
-
|
|
59
|
+
const clients = Object.keys(MCP_SNIPPETS);
|
|
60
|
+
if (ctx.json) {
|
|
61
|
+
console.log(JSON.stringify({ clients }));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(`Usage: botanary mcp config <${clients.join('|')}>`);
|
|
65
|
+
}
|
|
10
66
|
return;
|
|
11
67
|
}
|
|
12
68
|
const entry = MCP_SNIPPETS[client];
|
|
13
69
|
if (!entry) {
|
|
14
|
-
throw
|
|
70
|
+
throw invalidArgs(`Unknown client "${client}".`, `Choose one of: ${Object.keys(MCP_SNIPPETS).join(', ')}.`);
|
|
71
|
+
}
|
|
72
|
+
if (ctx.json) {
|
|
73
|
+
console.log(JSON.stringify({ client, label: entry.label, snippet: entry.snippet }));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(`${entry.label}:\n\n${entry.snippet}`);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
mcp
|
|
80
|
+
.command('install <client>')
|
|
81
|
+
.description("Install botanary-mcp using that client's own CLI")
|
|
82
|
+
.action(async (client) => {
|
|
83
|
+
const ctx = program.opts().__ctx;
|
|
84
|
+
const entry = MCP_SNIPPETS[client];
|
|
85
|
+
if (!entry) {
|
|
86
|
+
throw invalidArgs(`Unknown client "${client}".`, `Choose one of: ${Object.keys(MCP_SNIPPETS).join(', ')}.`);
|
|
87
|
+
}
|
|
88
|
+
// No installCommand means this client is configured by editing a file we do not own. Print, explain,
|
|
89
|
+
// and stop - the design spec's deliberate blast-radius limit.
|
|
90
|
+
if (!entry.installCommand) {
|
|
91
|
+
if (ctx.dryRun) {
|
|
92
|
+
const rows = [
|
|
93
|
+
{ label: 'client', value: entry.label },
|
|
94
|
+
{ label: 'config file', value: entry.configPath ?? 'unknown' },
|
|
95
|
+
];
|
|
96
|
+
const warnings = ['botanary does not edit another tool\'s config file on your behalf.'];
|
|
97
|
+
printResult(ctx, dryRunPayload(`Install botanary-mcp into ${entry.label}`, rows, warnings), () => `${renderReview(`Dry run - nothing will be edited`, rows, warnings)}\n\nAdd this to ${entry.configPath}:\n\n${entry.snippet}`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log([
|
|
101
|
+
glyphs.info(`${entry.label} is configured by editing ${entry.configPath}.`),
|
|
102
|
+
colors.dim(' botanary does not edit another tool\'s config file on your behalf.'),
|
|
103
|
+
'',
|
|
104
|
+
entry.snippet,
|
|
105
|
+
].join('\n'));
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const printable = entry.installCommand.join(' ');
|
|
110
|
+
const rows = [
|
|
111
|
+
{ label: 'runs', value: printable },
|
|
112
|
+
{ label: 'changes', value: `${entry.label}'s own MCP server list` },
|
|
113
|
+
];
|
|
114
|
+
const warnings = [];
|
|
115
|
+
if (ctx.dryRun) {
|
|
116
|
+
printResult(ctx, dryRunPayload(`Install botanary-mcp into ${entry.label}`, rows, warnings), () => renderReview('Dry run - nothing will be installed', rows, warnings));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
await confirmOrThrow(ctx, `Install botanary-mcp into ${entry.label}`, rows, warnings, {
|
|
120
|
+
question: 'Run it?',
|
|
121
|
+
because: `This runs \`${printable}\` and needs a confirmation it cannot ask for here.`,
|
|
122
|
+
});
|
|
123
|
+
const [command, ...args] = entry.installCommand;
|
|
124
|
+
const exitCode = await spawnAndWait(command, args, () => -1);
|
|
125
|
+
if (exitCode === -1) {
|
|
126
|
+
throw new CliError(`Could not run \`${command}\` - it does not appear to be installed.`, 'client_cli_missing', EXIT.error, `Install ${entry.label} first, or use \`botanary mcp config ${client}\` and add it yourself.`);
|
|
15
127
|
}
|
|
16
|
-
|
|
128
|
+
if (exitCode !== 0) {
|
|
129
|
+
throw new CliError(`\`${printable}\` exited ${exitCode}.`, 'client_cli_failed', EXIT.error);
|
|
130
|
+
}
|
|
131
|
+
if (ctx.json) {
|
|
132
|
+
console.log(JSON.stringify({ status: 'installed', client: entry.label }));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
console.log(glyphs.success(`Installed into ${entry.label}.`));
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
mcp
|
|
139
|
+
.command('serve')
|
|
140
|
+
.description('Run the botanary-mcp server on stdio')
|
|
141
|
+
.action(async () => {
|
|
142
|
+
// Spawned with NO arguments deliberately: botanary-mcp's own bin treats a bare invocation as "serve
|
|
143
|
+
// and stay alive", and exits immediately after connecting when it is given any argument at all.
|
|
144
|
+
const bin = resolveMcpBin();
|
|
145
|
+
const exitCode = await spawnAndWait(process.execPath, [bin], () => 1);
|
|
146
|
+
if (exitCode !== 0)
|
|
147
|
+
throw new CliError(`botanary-mcp exited ${exitCode}.`, 'mcp_exited', EXIT.error);
|
|
17
148
|
});
|
|
18
149
|
}
|
|
19
150
|
//# sourceMappingURL=mcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|