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.
Files changed (100) hide show
  1. package/dist/botanary.js +2 -0
  2. package/package.json +8 -6
  3. package/dist/bin/botanary.js +0 -25
  4. package/dist/bin/botanary.js.map +0 -1
  5. package/dist/src/app-url.js +0 -52
  6. package/dist/src/app-url.js.map +0 -1
  7. package/dist/src/cli.js +0 -195
  8. package/dist/src/cli.js.map +0 -1
  9. package/dist/src/commands/account.js +0 -171
  10. package/dist/src/commands/account.js.map +0 -1
  11. package/dist/src/commands/agent.js +0 -338
  12. package/dist/src/commands/agent.js.map +0 -1
  13. package/dist/src/commands/authority.js +0 -634
  14. package/dist/src/commands/authority.js.map +0 -1
  15. package/dist/src/commands/mcp.js +0 -163
  16. package/dist/src/commands/mcp.js.map +0 -1
  17. package/dist/src/commands/services.js +0 -460
  18. package/dist/src/commands/services.js.map +0 -1
  19. package/dist/src/commands/session-writes.js +0 -196
  20. package/dist/src/commands/session-writes.js.map +0 -1
  21. package/dist/src/commands/sign.js +0 -311
  22. package/dist/src/commands/sign.js.map +0 -1
  23. package/dist/src/commands/system.js +0 -135
  24. package/dist/src/commands/system.js.map +0 -1
  25. package/dist/src/commands/tokens.js +0 -36
  26. package/dist/src/commands/tokens.js.map +0 -1
  27. package/dist/src/commands/utilities.js +0 -119
  28. package/dist/src/commands/utilities.js.map +0 -1
  29. package/dist/src/commands/wallet.js +0 -1013
  30. package/dist/src/commands/wallet.js.map +0 -1
  31. package/dist/src/commands/watch.js +0 -259
  32. package/dist/src/commands/watch.js.map +0 -1
  33. package/dist/src/completion.js +0 -69
  34. package/dist/src/completion.js.map +0 -1
  35. package/dist/src/config-store.js +0 -52
  36. package/dist/src/config-store.js.map +0 -1
  37. package/dist/src/context.js +0 -19
  38. package/dist/src/context.js.map +0 -1
  39. package/dist/src/errors.js +0 -116
  40. package/dist/src/errors.js.map +0 -1
  41. package/dist/src/help/examples.js +0 -904
  42. package/dist/src/help/examples.js.map +0 -1
  43. package/dist/src/help/format.js +0 -144
  44. package/dist/src/help/format.js.map +0 -1
  45. package/dist/src/help/groups.js +0 -39
  46. package/dist/src/help/groups.js.map +0 -1
  47. package/dist/src/install-method.js +0 -50
  48. package/dist/src/install-method.js.map +0 -1
  49. package/dist/src/mcp-snippets.js +0 -27
  50. package/dist/src/mcp-snippets.js.map +0 -1
  51. package/dist/src/outcome.js +0 -63
  52. package/dist/src/outcome.js.map +0 -1
  53. package/dist/src/package-version.js +0 -53
  54. package/dist/src/package-version.js.map +0 -1
  55. package/dist/src/parser.js +0 -48
  56. package/dist/src/parser.js.map +0 -1
  57. package/dist/src/progress.js +0 -56
  58. package/dist/src/progress.js.map +0 -1
  59. package/dist/src/prompt-doc.js +0 -92
  60. package/dist/src/prompt-doc.js.map +0 -1
  61. package/dist/src/render/accounts.js +0 -21
  62. package/dist/src/render/accounts.js.map +0 -1
  63. package/dist/src/render/activity.js +0 -34
  64. package/dist/src/render/activity.js.map +0 -1
  65. package/dist/src/render/agents.js +0 -42
  66. package/dist/src/render/agents.js.map +0 -1
  67. package/dist/src/render/balance.js +0 -85
  68. package/dist/src/render/balance.js.map +0 -1
  69. package/dist/src/render/banner.js +0 -17
  70. package/dist/src/render/banner.js.map +0 -1
  71. package/dist/src/render/chains.js +0 -52
  72. package/dist/src/render/chains.js.map +0 -1
  73. package/dist/src/render/colors.js +0 -50
  74. package/dist/src/render/colors.js.map +0 -1
  75. package/dist/src/render/gas.js +0 -34
  76. package/dist/src/render/gas.js.map +0 -1
  77. package/dist/src/render/grant.js +0 -34
  78. package/dist/src/render/grant.js.map +0 -1
  79. package/dist/src/render/kv.js +0 -60
  80. package/dist/src/render/kv.js.map +0 -1
  81. package/dist/src/render/mandates.js +0 -111
  82. package/dist/src/render/mandates.js.map +0 -1
  83. package/dist/src/render/print.js +0 -18
  84. package/dist/src/render/print.js.map +0 -1
  85. package/dist/src/render/redact.js +0 -23
  86. package/dist/src/render/redact.js.map +0 -1
  87. package/dist/src/render/table.js +0 -16
  88. package/dist/src/render/table.js.map +0 -1
  89. package/dist/src/repl.js +0 -232
  90. package/dist/src/repl.js.map +0 -1
  91. package/dist/src/review.js +0 -52
  92. package/dist/src/review.js.map +0 -1
  93. package/dist/src/run-installer.js +0 -30
  94. package/dist/src/run-installer.js.map +0 -1
  95. package/dist/src/settings.js +0 -88
  96. package/dist/src/settings.js.map +0 -1
  97. package/dist/src/update-check.js +0 -91
  98. package/dist/src/update-check.js.map +0 -1
  99. package/dist/src/validate.js +0 -138
  100. package/dist/src/validate.js.map +0 -1
@@ -1,904 +0,0 @@
1
- /** Keyed by the command's full path with the program name stripped: 'send', 'agent spend', 'mcp config'. */
2
- export const COMMAND_HELP = {
3
- login: {
4
- body: 'Log in as the account owner. Botanary prints a one-time code and opens your browser; you approve\n' +
5
- 'there. The CLI never sees your key and never signs for you - it stores only a session token, in the\n' +
6
- 'same place botanary-mcp stores its own, so a coding agent on this machine sees the same login.',
7
- examples: ['botanary login', 'botanary login --json'],
8
- notes: 'If a browser cannot be opened (SSH, headless, WSL), the printed URL is the one to visit yourself.',
9
- seeAlso: 'botanary status, botanary logout - wallet_login (MCP)',
10
- },
11
- logout: {
12
- body: 'Revoke the stored owner session on the server and delete it from this machine.',
13
- examples: ['botanary logout'],
14
- seeAlso: 'botanary login - wallet_logout (MCP)',
15
- },
16
- status: {
17
- body: 'The owner session and this machine\'s agent binding, side by side, with no network call beyond\nreading each one.',
18
- examples: ['botanary status', 'botanary status --json'],
19
- seeAlso: 'botanary whoami, botanary diagnose - wallet_status (MCP)',
20
- },
21
- whoami: {
22
- body: 'Who Botanary says you are, in both lanes: the owner session this machine holds, and whether the\n' +
23
- 'agent identity on this machine is a live, claimed connected agent.',
24
- examples: ['botanary whoami', 'botanary whoami --json'],
25
- seeAlso: 'botanary status, botanary agent whoami - wallet_status + whoami (MCP)',
26
- },
27
- balance: {
28
- body: 'What this account holds, across every chain Botanary serves, with a fiat total and the freshness of\n' +
29
- 'the numbers. Balances come from the backend store, which can lag the chain; the footer says so\n' +
30
- 'whenever it does, rather than presenting a stale number as settled.',
31
- examples: ['botanary balance', 'botanary balance --json | jq .balance.totalFiat', 'botanary balance --raw'],
32
- seeAlso: 'botanary activity, botanary chains - wallet_portfolio (MCP)',
33
- },
34
- tokens: {
35
- body: '`send`\'s discovery command. Every token this account holds on one chain, with the contract address\n' +
36
- '`--token` actually needs. `send` is address-only on purpose - a symbol is a label a contract picks\n' +
37
- 'for itself, and two tokens on one chain can legally share one - so this is where the address comes\n' +
38
- 'from, rather than a block explorer.',
39
- examples: ['botanary tokens --chain-id 8453', 'botanary tokens --chain-id 8453 usdc', 'botanary tokens --chain-id 8453 --json'],
40
- seeAlso: 'botanary send, botanary balance',
41
- },
42
- send: {
43
- body: 'Send tokens from an account you own. Botanary never holds your key: the CLI builds an unsigned\n' +
44
- 'operation, then either a mandate signs it locally or you approve it in your browser.\n' +
45
- '\n' +
46
- 'Which lane signs is decided for you:\n' +
47
- ' mandate a live mandate covers this exact amount, token and chain\n' +
48
- ' browser anything else, which opens Botanary for you to approve',
49
- examples: [
50
- 'botanary send # guided',
51
- 'botanary send --amount 25 --token 0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913 --recipient 0xAb..3F --chain-id 8453',
52
- 'botanary send --amount 25 --token 0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913 --recipient 0xAb..3F --chain-id 8453 --dry-run',
53
- 'botanary send --amount 25 --token 0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913 --recipient 0xAb..3F --chain-id 8453 --yes --json | jq -r .txHash',
54
- ],
55
- notes: '--token takes a contract address (0x...) or a CAIP-19 asset ref, never a symbol - a symbol is a\n' +
56
- 'label a contract picks for itself, so two tokens on one chain can share one. `botanary tokens\n' +
57
- '--chain-id <id>` lists every address this account can send.\n' +
58
- 'Mandates are testnet-only today, so on mainnet every send is browser-signed.\n' +
59
- 'Exit 5 means the op was relayed but no receipt arrived yet - poll `botanary api /userops/<opId> --json` to check its status.',
60
- seeAlso: 'botanary tokens, botanary chains, botanary gas, botanary mandates - wallet_send (MCP)',
61
- },
62
- swap: {
63
- body: 'Swap tokens in an account you own. Botanary never holds your key: this parks a typed intent and\n' +
64
- 'waits for you to approve it in your browser, the same one path every mutating command uses.\n' +
65
- '\n' +
66
- '--token-in and --token-out both take a contract address or a CAIP-19 asset ref, never a symbol -\n' +
67
- 'the same restriction `send` applies, and for the same reason.',
68
- examples: [
69
- 'botanary swap --token-in 0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913 --token-out 0x4200000000000000000000000000000000000006 --amount-in 10 --chain-id 8453',
70
- 'botanary swap --token-in 0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913 --token-out 0x4200000000000000000000000000000000000006 --amount-in 10 --chain-id 8453 --max-slippage-bps 100',
71
- 'botanary swap --token-in 0x833589fCD6eDb6E08f4c7C32D4f71b54bda02913 --token-out 0x4200000000000000000000000000000000000006 --amount-in 10 --chain-id 8453 --dry-run',
72
- ],
73
- notes: '`botanary tokens --chain-id <id>` lists every address this account holds.',
74
- seeAlso: 'botanary tokens, botanary send, botanary sign - wallet_sign_request (MCP)',
75
- },
76
- sign: {
77
- body: 'The one write path underneath every command that moves funds or grants authority. Every one of\n' +
78
- 'them parks a typed intent here (`POST /sign-requests`) and waits for your browser - this CLI never\n' +
79
- 'holds your key and never signs on your behalf, whatever the command.',
80
- examples: ['botanary sign list', 'botanary sign show sr_1', 'botanary sign resume hnd_1'],
81
- seeAlso: 'botanary send - wallet_sign_request (MCP)',
82
- },
83
- 'sign list': {
84
- body: 'Sign requests this machine parked and is still waiting on your browser to settle.',
85
- examples: ['botanary sign list', 'botanary sign list --json'],
86
- seeAlso: 'botanary sign show, botanary sign resume',
87
- },
88
- 'sign show': {
89
- body: 'Read one sign request by id: its status, its sign URL, and once relayed, the operation it\n' +
90
- 'produced. For a multi-op request (account.setup, account.migrate, recovery.recover) also shows\n' +
91
- 'each op\'s own status and which one is next.',
92
- examples: ['botanary sign show sr_1', 'botanary sign show sr_1 --json'],
93
- notes: 'There is no `sign reject` - only the browser that signs a request can settle it. `sign show`\n' +
94
- 'prints the sign URL; decline there, or let the request expire on its own.',
95
- seeAlso: 'botanary sign list, botanary sign resume',
96
- },
97
- 'sign resume': {
98
- body: 'Rejoin an interrupted wait on a sign request this machine parked - after a dropped connection, a\n' +
99
- 'Ctrl-C, or a closed terminal. Takes the local handle id `botanary sign list` prints, not the sign\n' +
100
- 'request id.',
101
- examples: ['botanary sign resume hnd_1'],
102
- seeAlso: 'botanary sign list',
103
- },
104
- solana: {
105
- body: 'Send, swap and manage Botanary Mandates on Solana. Solana is key-keyed, not chainId-keyed - every\n' +
106
- 'command here takes --key (see `botanary chains`) rather than --chain-id, and amounts for send and\n' +
107
- 'mandate grant are raw base units (lamports or SPL base units), not display units.',
108
- examples: ['botanary solana send --key solana --to <address> --amount 1000000 --yes'],
109
- seeAlso: 'botanary send, botanary swap, botanary chains',
110
- },
111
- 'solana send': {
112
- body: 'Send tokens on Solana. --amount is a raw base-unit integer string (lamports for SOL), not a display amount.',
113
- examples: ['botanary solana send --key solana --to <address> --amount 1000000 --yes'],
114
- seeAlso: 'botanary solana swap',
115
- },
116
- 'solana swap': {
117
- body: 'Swap tokens on Solana. --amount-in is HUMAN-SCALE (e.g. 1.5), unlike solana send\'s raw base-unit amount.',
118
- examples: ['botanary solana swap --key solana --amount-in 1.5 --max-slippage-bps 100 --yes'],
119
- seeAlso: 'botanary solana send',
120
- },
121
- 'solana mandate': {
122
- body: 'Grant, freeze/unfreeze and revoke Botanary Mandates Program delegations on Solana.',
123
- examples: ['botanary solana mandate grant --key solana --mint <mint> --recipient <address> --per-action-max 1000000 --cap-limit 5000000 --cap-period-seconds 3600 --expiry 2027-01-01T00:00:00Z --yes'],
124
- seeAlso: 'botanary mandates',
125
- },
126
- 'solana mandate grant': {
127
- body: 'Grant a bounded Solana mandate. Unlike the EVM delegation lane, --expiry is mandatory here.',
128
- examples: ['botanary solana mandate grant --key solana --mint <mint> --recipient <address> --per-action-max 1000000 --cap-limit 5000000 --cap-period-seconds 3600 --expiry 2027-01-01T00:00:00Z --yes'],
129
- seeAlso: 'botanary solana mandate freeze, botanary solana mandate revoke',
130
- },
131
- 'solana mandate freeze': {
132
- body: 'Freeze (or --unfreeze) every Solana mandate for this owner at once - one kill switch across every mint.',
133
- examples: ['botanary solana mandate freeze --key solana --yes', 'botanary solana mandate freeze --key solana --unfreeze --yes'],
134
- seeAlso: 'botanary solana mandate grant',
135
- },
136
- 'solana mandate revoke': {
137
- body: 'Revoke a Solana mandate.',
138
- examples: ['botanary solana mandate revoke man_1 --key solana --yes'],
139
- seeAlso: 'botanary solana mandate grant',
140
- },
141
- activity: {
142
- body: 'Recent sends, swaps and yield transactions for this account, newest first.',
143
- examples: ['botanary activity', 'botanary activity --json'],
144
- seeAlso: 'botanary balance - wallet_activity (MCP)',
145
- },
146
- markets: {
147
- body: 'Public market data: the token catalog Botanary prices, with symbols and current prices.',
148
- examples: ['botanary markets', 'botanary markets --json'],
149
- seeAlso: 'botanary yield - wallet_markets (MCP)',
150
- },
151
- yield: {
152
- body: 'Yield pools, a shortlist ranked off your own holdings, and this account\'s farm positions. The\n' +
153
- 'shortlist is ranked server-side and is not scoped by `accounts use`. `deposit`, `withdraw` and\n' +
154
- '`claim` are how you actually enter, exit or collect from one of these pools.',
155
- examples: ['botanary yield', 'botanary yield --json'],
156
- seeAlso: 'botanary markets, botanary yield deposit - wallet_yield (MCP)',
157
- },
158
- 'yield deposit': {
159
- body: 'Deposit into a yield pool, for an account you own. Parks a typed intent and waits for you to\n' +
160
- 'approve it in your browser, the same one path every mutating command uses. --amount is in the\n' +
161
- 'pool\'s underlying asset, not shares.',
162
- examples: [
163
- 'botanary yield deposit --pool-id p_1 --amount 25 --chain-id 84532',
164
- 'botanary yield deposit --pool-id p_1 --amount 25 --chain-id 84532 --dry-run',
165
- ],
166
- seeAlso: 'botanary yield, botanary yield withdraw - wallet_sign_request (MCP)',
167
- },
168
- 'yield withdraw': {
169
- body: 'Withdraw from a yield pool, for an account you own. Parks a typed intent and waits for you to\n' +
170
- 'approve it in your browser. --amount is in the pool\'s underlying asset, not shares.',
171
- examples: [
172
- 'botanary yield withdraw --pool-id p_1 --amount 25 --chain-id 84532',
173
- 'botanary yield withdraw --pool-id p_1 --amount 25 --chain-id 84532 --dry-run',
174
- ],
175
- seeAlso: 'botanary yield, botanary yield deposit - wallet_sign_request (MCP)',
176
- },
177
- 'yield claim': {
178
- body: 'Claim accrued rewards from a yield pool, for an account you own. No --amount: what is claimable is\n' +
179
- 'decided from a live probe of this account\'s own accrued rewards, not a number you supply.',
180
- examples: ['botanary yield claim --pool-id p_1 --chain-id 84532', 'botanary yield claim --pool-id p_1 --chain-id 84532 --dry-run'],
181
- seeAlso: 'botanary yield - wallet_sign_request (MCP)',
182
- },
183
- mandates: {
184
- body: 'What the agent lane may spend unattended: every delegation on this account, its bounds, and how much\n' +
185
- 'of each budget is already spent.',
186
- examples: ['botanary mandates', 'botanary mandates suggest', 'botanary mandates --json'],
187
- notes: 'Mandates are testnet-only and pre-mainnet. Nothing here is enforced on mainnet yet.',
188
- seeAlso: 'botanary agents, botanary agent grant - wallet_mandates (MCP)',
189
- },
190
- 'mandates propose': {
191
- body: 'Compile a parsed rule/mandate intent against the capability matrix. Pure compilation - reads nothing\n' +
192
- 'and writes nothing, so no signature is involved. subject: self routes to a rule (AgentGuard);\n' +
193
- 'copilot routes to a mandate (MandateExecutor); omitted lets the backend decide, or offer both.',
194
- examples: ['botanary mandates propose --primitive per_tx_amount_cap --value 500 --unit USDC --comparator lte --subject copilot'],
195
- seeAlso: 'botanary mandates, botanary mandates suggest',
196
- },
197
- 'mandates suggest': {
198
- body: 'Suggest a bounded mandate for each registered agent that does not have one yet, with a Grant URL for\n' +
199
- 'each. A suggestion only: it never widens an existing grant, and granting happens in Botanary.',
200
- examples: ['botanary mandates suggest', 'botanary mandates suggest --json'],
201
- seeAlso: 'botanary mandates, botanary agents - wallet_suggest_mandate (MCP)',
202
- },
203
- 'mandates grant': {
204
- body: 'Grant bounded access to a delegatee agent - a Smart Session, the classic delegation lane. The full\n' +
205
- 'shape (name, delegateeAddress, chainId, budgets, and the rest) lives in a JSON file, not flags - see\n' +
206
- 'the README. This writes into the Delegations table `botanary mandates` reads, not the Mandates table.',
207
- examples: ['botanary mandates grant --grant-file grant.json --yes'],
208
- seeAlso: 'botanary mandates freeze, botanary mandates revoke, botanary mandates confirm',
209
- },
210
- 'mandates freeze': {
211
- body: 'Freeze a delegation (reversible). Id from the Delegations table in `botanary mandates`.',
212
- examples: ['botanary mandates freeze del_1 --yes'],
213
- seeAlso: 'botanary mandates unfreeze, botanary mandates grant',
214
- },
215
- 'mandates unfreeze': {
216
- body: 'Unfreeze a delegation. Id from the Delegations table in `botanary mandates`.',
217
- examples: ['botanary mandates unfreeze del_1 --yes'],
218
- seeAlso: 'botanary mandates freeze',
219
- },
220
- 'mandates revoke': {
221
- body: 'Revoke a delegation (permanent). Id from the Delegations table in `botanary mandates` - not the\n' +
222
- 'Mandates table, which `botanary mandates cancel` targets instead.',
223
- examples: ['botanary mandates revoke del_1 --yes'],
224
- notes: 'Permanent - use `botanary mandates freeze` instead if you may want it back.',
225
- seeAlso: 'botanary mandates freeze, botanary mandates cancel',
226
- },
227
- 'mandates confirm': {
228
- body: 'Confirm and enable proposed mandates or rules. Candidates are a JSON array, typically saved from\n' +
229
- '`botanary mandates propose --json`.',
230
- examples: ['botanary mandates confirm --candidates-file candidates.json --yes'],
231
- seeAlso: 'botanary mandates propose, botanary mandates pause',
232
- },
233
- 'mandates pause': {
234
- body: 'Pause a mandate (reversible). Id from the Mandates (on-chain) table in `botanary mandates`.',
235
- examples: ['botanary mandates pause man_1 --yes'],
236
- seeAlso: 'botanary mandates resume, botanary mandates cancel',
237
- },
238
- 'mandates resume': {
239
- body: 'Resume a paused mandate. Id from the Mandates (on-chain) table in `botanary mandates`.',
240
- examples: ['botanary mandates resume man_1 --yes'],
241
- seeAlso: 'botanary mandates pause',
242
- },
243
- 'mandates cancel': {
244
- body: 'Revoke a mandate (permanent). Named cancel here, not revoke, to stay distinct from `botanary mandates\n' +
245
- 'revoke`, which targets a delegation, not a mandate. Id from the Mandates (on-chain) table.',
246
- examples: ['botanary mandates cancel man_1 --yes'],
247
- notes: 'Permanent - use `botanary mandates pause` instead if you may want it back.',
248
- seeAlso: 'botanary mandates pause, botanary mandates revoke',
249
- },
250
- agents: {
251
- body: 'Connected agents on this account, and any approval requests waiting on your verdict.',
252
- examples: ['botanary agents', 'botanary agents --json'],
253
- seeAlso: 'botanary mandates, botanary agent requests - wallet_agents (MCP)',
254
- },
255
- accounts: {
256
- body: 'Which of your accounts subsequent commands use.',
257
- examples: ['botanary accounts list', 'botanary accounts use acct_2'],
258
- seeAlso: 'botanary status - wallet_use_account (MCP)',
259
- },
260
- 'accounts list': {
261
- body: 'Every account this login can see, with the active one marked.',
262
- examples: ['botanary accounts list', 'botanary accounts list --json'],
263
- seeAlso: 'botanary accounts use',
264
- },
265
- 'accounts use': {
266
- body: 'Switch the active account. The id is validated against the accounts this login actually has, so a\n' +
267
- 'typo fails here rather than silently targeting the wrong account later.',
268
- examples: ['botanary accounts use acct_2'],
269
- seeAlso: 'botanary accounts list - wallet_use_account (MCP)',
270
- },
271
- recovery: {
272
- body: 'Social recovery: the guardian set on this account, and the emergency signer-set replacement.',
273
- examples: ['botanary recovery status'],
274
- seeAlso: 'botanary panic, botanary signers',
275
- },
276
- 'recovery status': {
277
- body: 'The live guardian set on this account, read on-chain.',
278
- examples: ['botanary recovery status', 'botanary recovery status --json'],
279
- seeAlso: 'botanary recovery install',
280
- },
281
- 'recovery install': {
282
- body: 'Install social recovery with a guardian set and an M-of-N threshold. At least 2 guardians and a threshold of at least 2 - a single guardian could rotate the account unilaterally.',
283
- examples: ['botanary recovery install --guardian 0xAb..1F --guardian 0xCd..2A --threshold 2 --yes'],
284
- seeAlso: 'botanary recovery guardian add, botanary recovery recover',
285
- },
286
- 'recovery guardian': {
287
- body: 'Add or remove one recovery guardian.',
288
- examples: ['botanary recovery guardian add --name "iPhone 15" --kind device --address 0xAb..1F --yes'],
289
- seeAlso: 'botanary recovery status',
290
- },
291
- 'recovery guardian add': {
292
- body: 'Add a recovery guardian.',
293
- examples: ['botanary recovery guardian add --name "iPhone 15" --kind device --address 0xAb..1F --yes'],
294
- seeAlso: 'botanary recovery guardian remove',
295
- },
296
- 'recovery guardian remove': {
297
- body: 'Remove a recovery guardian.',
298
- examples: ['botanary recovery guardian remove grd_1 --yes'],
299
- seeAlso: 'botanary recovery guardian add',
300
- },
301
- 'recovery recover': {
302
- body: "Replace this account's whole signer set - the emergency lane, signed by a guardian rather than the\n" +
303
- 'current owner. The complete new signer set, not a single lost/new pair.',
304
- examples: ['botanary recovery recover --new-signer 0xAb..1F --new-threshold 1 --yes'],
305
- seeAlso: 'botanary recovery install',
306
- },
307
- signers: {
308
- body: "This account's enrolled signers on the v1 authority core (BotanaryPolicyValidator) - who can approve, not how a person reaches the account.",
309
- examples: ['botanary signers list'],
310
- seeAlso: 'botanary devices, botanary recovery',
311
- },
312
- 'signers list': {
313
- body: 'Every enrolled signer, by index.',
314
- examples: ['botanary signers list', 'botanary signers list --json'],
315
- seeAlso: 'botanary signers add',
316
- },
317
- 'signers add': {
318
- body: 'Enrol a new ECDSA signer on this chain.',
319
- examples: ['botanary signers add --address 0xAb..1F --yes'],
320
- seeAlso: 'botanary signers remove, botanary signers list',
321
- },
322
- 'signers remove': {
323
- body: 'Remove a signer from this chain, by index.',
324
- examples: ['botanary signers remove --index 1 --yes'],
325
- seeAlso: 'botanary signers list',
326
- },
327
- 'signers threshold': {
328
- body: 'Set the account-wide signer approval threshold.',
329
- examples: ['botanary signers threshold --threshold 2 --yes'],
330
- seeAlso: 'botanary signers list',
331
- },
332
- 'signers trust-anchor': {
333
- body: "Mirror an issuer's currently-active signing key onto this account. Only google has a live JWKS source today.",
334
- examples: ['botanary signers trust-anchor --yes'],
335
- seeAlso: 'botanary signers add',
336
- },
337
- 'signers guardian': {
338
- body: "Set BotanaryPolicyValidator's own guardian threshold over enrolled signers. Not `recovery guardian`\n" +
339
- 'above - a different contract behind the same English word.',
340
- examples: ['botanary signers guardian set --signer-index 0 --signer-index 1 --threshold 2 --yes'],
341
- seeAlso: 'botanary recovery guardian',
342
- },
343
- 'signers guardian set': {
344
- body: 'Set the policy-validator guardian threshold over a subset of enrolled signer indexes. --threshold 0 opts out.',
345
- examples: ['botanary signers guardian set --signer-index 0 --signer-index 1 --threshold 2 --yes'],
346
- seeAlso: 'botanary signers list',
347
- },
348
- 'signers policy': {
349
- body: 'Write or remove a conditional signing policy at a slot (BotanaryPolicyValidator).',
350
- examples: ['botanary signers policy set --slot 0 --approvals 1 --delay-seconds 0 --signer-index 0 --yes'],
351
- seeAlso: 'botanary signers guardian',
352
- },
353
- 'signers policy set': {
354
- body: 'Write (or overwrite) the conditional signing policy at a slot.',
355
- examples: ['botanary signers policy set --slot 0 --approvals 1 --delay-seconds 0 --signer-index 0 --yes'],
356
- seeAlso: 'botanary signers policy remove',
357
- },
358
- 'signers policy remove': {
359
- body: 'Remove the conditional signing policy at a slot.',
360
- examples: ['botanary signers policy remove --slot 0 --yes'],
361
- seeAlso: 'botanary signers policy set',
362
- },
363
- 'signers condition-set': {
364
- body: 'Add or remove a condition-set member (BotanaryPolicyValidator).',
365
- examples: ['botanary signers condition-set --set-id 0x..32 --member 0x..32 --yes'],
366
- seeAlso: 'botanary signers policy set',
367
- },
368
- 'signers migrate': {
369
- body: "Upgrade this account's authority core onto BotanaryPolicyValidator - step 1 of 2. Not the same flow\n" +
370
- 'as `account migrate` (address migration, a different contract behind the same English word).',
371
- examples: ['botanary signers migrate --yes'],
372
- seeAlso: 'botanary account migrate',
373
- },
374
- devices: {
375
- body: "Co-signer devices on this account's OwnableValidator root, and their M-of-N threshold.",
376
- examples: ['botanary devices list'],
377
- seeAlso: 'botanary signers, botanary panic',
378
- },
379
- 'devices list': {
380
- body: 'The live device set and its M-of-N threshold.',
381
- examples: ['botanary devices list', 'botanary devices list --json'],
382
- seeAlso: 'botanary devices add',
383
- },
384
- 'devices add': {
385
- body: 'Add a device as a co-signer.',
386
- examples: ['botanary devices add --device 0xAb..1F --label "Work laptop" --yes'],
387
- seeAlso: 'botanary devices remove, botanary devices list',
388
- },
389
- 'devices remove': {
390
- body: 'Remove a device from the co-signer set.',
391
- examples: ['botanary devices remove --device 0xAb..1F --yes'],
392
- seeAlso: 'botanary devices list',
393
- },
394
- 'devices threshold': {
395
- body: 'Set the M-of-N device signing threshold.',
396
- examples: ['botanary devices threshold --threshold 2 --yes'],
397
- seeAlso: 'botanary devices list',
398
- },
399
- panic: {
400
- body: 'The panic freeze lane: once installed, any one listed device can freeze the account, gas-abstractedly.',
401
- examples: ['botanary panic install --yes', 'botanary panic freeze --yes'],
402
- seeAlso: 'botanary account freeze, botanary devices',
403
- },
404
- 'panic install': {
405
- body: 'Install the panic freeze lane - a 1-of-N session over the listed device keys, omit to use the account\'s own signer set.',
406
- examples: ['botanary panic install --yes'],
407
- seeAlso: 'botanary panic freeze',
408
- },
409
- 'panic freeze': {
410
- body: 'Freeze the account via the panic lane. Any one listed device can sign - this is the kill-switch.',
411
- examples: ['botanary panic freeze --yes'],
412
- notes: 'Needs `botanary panic install` first.',
413
- seeAlso: 'botanary account unfreeze',
414
- },
415
- rules: {
416
- body: "Owner-lane caps and allowlist on this account's AgentGuard hook - the universal floor every mandate can only narrow from.",
417
- examples: ['botanary rules update --caps-file caps.json --yes'],
418
- notes: 'Accounts created since 2026-07-30 deploy permanently hookless, so the backend declines to build\n' +
419
- 'an op that cannot bind on those accounts. This still parks and signs; it does not enforce on-chain there.',
420
- seeAlso: 'botanary account freeze, botanary mandates',
421
- },
422
- 'rules update': {
423
- body: 'Update account caps and/or the contract/recipient allowlist. Each half is left unchanged if omitted -\n' +
424
- 'both are complex, arbitrarily-sized shapes, so they come from JSON files rather than flags.',
425
- examples: ['botanary rules update --caps-file caps.json --allowlist-file allowlist.json --yes'],
426
- seeAlso: 'botanary rules',
427
- },
428
- 'agents approve': {
429
- body: "Approve an agent's request. The owner signs; the agent can never approve its own request.",
430
- examples: ['botanary agents approve req_1 --yes'],
431
- seeAlso: 'botanary agents, botanary agents deny',
432
- },
433
- 'agents deny': {
434
- body: 'There is no deny action on this surface - reads the request back and explains why. An agent request is either approved or left to expire on its own.',
435
- examples: ['botanary agents deny req_1'],
436
- seeAlso: 'botanary agents approve',
437
- },
438
- 'agents claim': {
439
- body: 'Claim a pending pairing and bind that agent to this account. No signature - a plain session write.',
440
- examples: ['botanary agents claim ABC-123-XYZ --name "Claude Code"'],
441
- seeAlso: 'botanary agent pair, botanary agents revoke',
442
- },
443
- 'agents revoke': {
444
- body: 'Disconnect an agent from this account. No signature - a plain session write.',
445
- examples: ['botanary agents revoke agt_1'],
446
- seeAlso: 'botanary agents claim, botanary agents',
447
- },
448
- notifications: {
449
- body: 'Alerts - blocked actions, depeg warnings, and the like. No signature - a plain session surface.',
450
- examples: ['botanary notifications', 'botanary notifications --unread-only'],
451
- seeAlso: 'botanary watch, botanary notifications read-all',
452
- },
453
- 'notifications read': {
454
- body: 'Mark one notification as read.',
455
- examples: ['botanary notifications read n1'],
456
- seeAlso: 'botanary notifications, botanary notifications read-all',
457
- },
458
- 'notifications read-all': {
459
- body: 'Mark every notification as read.',
460
- examples: ['botanary notifications read-all'],
461
- seeAlso: 'botanary notifications',
462
- },
463
- paysh: {
464
- body: 'pay.sh: the x402 spending balance and its guardrails.',
465
- examples: ['botanary paysh accounts'],
466
- seeAlso: 'botanary apis, botanary agent pay',
467
- },
468
- 'paysh accounts': {
469
- body: "The caller's recorded pay.sh accounts. Read-only - account creation happens entirely client-side via\n" +
470
- 'Privy in the web app, and `POST /pay-sh/accounts` refuses a CLI session outright.',
471
- examples: ['botanary paysh accounts', 'botanary paysh accounts --json'],
472
- seeAlso: 'botanary paysh topup',
473
- },
474
- 'paysh topup': {
475
- body: 'Top up the pay.sh balance.',
476
- examples: ['botanary paysh topup --amount-usdc 25 --yes'],
477
- seeAlso: 'botanary paysh withdraw',
478
- },
479
- 'paysh withdraw': {
480
- body: "Withdraw from a pay.sh account's custodial Solana USDC balance.",
481
- examples: ['botanary paysh withdraw --paysh-account-id psh_1 --amount-usdc 25 --destination <solana address> --yes'],
482
- seeAlso: 'botanary paysh topup, botanary paysh accounts',
483
- },
484
- 'paysh allowlist': {
485
- body: 'The trusted pay.sh domains for one account. Read-only - adding or removing a domain 403s for a CLI\n' +
486
- 'session (CliSessionForbidden), because pay.sh moves value with no owner signature in the loop. Do it\n' +
487
- 'in the web app.',
488
- examples: ['botanary paysh allowlist psh_1'],
489
- seeAlso: 'botanary paysh settings',
490
- },
491
- 'paysh settings': {
492
- body: "One account's persisted default copilot pay.sh mode. Read-only - changing it 403s for a CLI session,\n" +
493
- 'same reason as `paysh allowlist`.',
494
- examples: ['botanary paysh settings psh_1'],
495
- seeAlso: 'botanary paysh allowlist',
496
- },
497
- marketplace: {
498
- body: 'Hire an ACP agent under a bounded mandate, and run its jobs.',
499
- examples: ['botanary marketplace hire --agent-wallet 0xAb..1F --chain-id 8453 --per-job-budget 10 --delegatee-address 0xCd..2A --yes'],
500
- seeAlso: 'botanary mandates, botanary markets',
501
- },
502
- 'marketplace hire': {
503
- body: 'Hire an ACP agent under a bounded mandate.',
504
- examples: ['botanary marketplace hire --agent-wallet 0xAb..1F --chain-id 8453 --per-job-budget 10 --delegatee-address 0xCd..2A --yes'],
505
- seeAlso: 'botanary marketplace deposit, botanary marketplace jobs create',
506
- },
507
- 'marketplace deposit': {
508
- body: 'Deposit into a Virtuals-custodied wallet.',
509
- examples: ['botanary marketplace deposit --chain-id 8453 --amount 50 --token-symbol USDC --token-address 0xAb..1F --yes'],
510
- seeAlso: 'botanary marketplace hire',
511
- },
512
- 'marketplace jobs': {
513
- body: 'ACP jobs run under a marketplace mandate.',
514
- examples: ['botanary marketplace jobs create --mandate-id 0x..32 --agent-wallet 0xAb..1F --description "Write a report" --chain-id 8453 --yes'],
515
- seeAlso: 'botanary marketplace hire',
516
- },
517
- 'marketplace jobs create': {
518
- body: 'Create an ACP job under a mandate - op 1 of a hire.',
519
- examples: ['botanary marketplace jobs create --mandate-id 0x..32 --agent-wallet 0xAb..1F --description "Write a report" --chain-id 8453 --yes'],
520
- seeAlso: 'botanary marketplace jobs fund',
521
- },
522
- 'marketplace jobs fund': {
523
- body: 'Fund an ACP job under a mandate - op 2 of a hire, approve and fund batched together.',
524
- examples: ['botanary marketplace jobs fund --mandate-id 0x..32 --job-id job_1 --per-job-budget 10 --chain-id 8453 --yes'],
525
- seeAlso: 'botanary marketplace jobs create',
526
- },
527
- apis: {
528
- body: 'The x402 paid-API catalog, and the on-chain spending budget backing it.',
529
- examples: ['botanary apis providers', 'botanary apis budget --chain-id 8453 --agent-id agt_1'],
530
- seeAlso: 'botanary agent apis, botanary agent pay',
531
- },
532
- 'apis budget': {
533
- body: 'Read the current API budget and its state: remaining count, per-call max, expiry, epoch, token, exposure, spent.',
534
- examples: ['botanary apis budget 8453 agt_1'],
535
- seeAlso: 'botanary apis budget commit',
536
- },
537
- 'apis budget commit': {
538
- body: 'Commit a three-transaction atomic API spending budget.',
539
- examples: ['botanary apis budget commit --chain-id 8453 --agent-id agt_1 --max-value 1000000 --count 10 --expires-at 2026-12-31T00:00:00Z --yes'],
540
- seeAlso: 'botanary apis budget',
541
- },
542
- 'apis budget revoke': {
543
- body: 'Revoke an agent\'s on-chain API spending budget. This is the only control that stops an agent ' +
544
- 'that has stopped asking permission: pausing a mandate is off-chain and binds a cooperative ' +
545
- 'agent, while the validator never reads the pause flag. Opens your browser to sign, because the ' +
546
- 'backend never signs. On a frozen account it declines and names the alternative.',
547
- examples: ['botanary apis budget revoke --chain-id 84532 --agent-id agt_1'],
548
- seeAlso: 'botanary apis budget, botanary apis budget commit',
549
- },
550
- 'apis providers': {
551
- body: 'Ranked, searchable catalog of x402 API providers.',
552
- examples: ['botanary apis providers', 'botanary apis providers --chain-id 8453 --q weather'],
553
- seeAlso: 'botanary agent apis',
554
- },
555
- onramp: {
556
- body: 'Start a fiat-to-crypto Buy checkout session. No UserOp, no signature - funds arrive directly from the\n' +
557
- 'provider, the same way an ordinary incoming transfer does.',
558
- examples: ['botanary onramp --chain-key base', 'botanary onramp --chain-key base --no-open'],
559
- seeAlso: 'botanary onramp methods, botanary balance',
560
- },
561
- 'onramp methods': {
562
- body: 'Chains currently buyable through the wired onramp provider.',
563
- examples: ['botanary onramp methods'],
564
- seeAlso: 'botanary onramp',
565
- },
566
- agentwallet: {
567
- body: 'Deposit into a Virtuals agent wallet - a per-agent custodial wallet, distinct from `marketplace deposit`.',
568
- examples: ['botanary agentwallet deposit --agent-id agt_1 --network base --token-symbol USDC --token-address 0x..14 --amount 25 --yes'],
569
- seeAlso: 'botanary marketplace deposit',
570
- },
571
- 'agentwallet deposit': {
572
- body: 'Deposit into a Virtuals agent wallet. Base-only in v1 - a solana --network is accepted here but declined server-side.',
573
- examples: ['botanary agentwallet deposit --agent-id agt_1 --network base --token-symbol USDC --token-address 0x..14 --amount 25 --yes'],
574
- seeAlso: 'botanary agentwallet',
575
- },
576
- approvals: {
577
- body: 'Announce a collected off-chain approval, by its digest.',
578
- examples: ['botanary approvals announce 0x..32 --yes'],
579
- seeAlso: 'botanary sign',
580
- },
581
- 'approvals announce': {
582
- body: 'Announce a collected approval, by its digest. Takes no body beyond the digest itself.',
583
- examples: ['botanary approvals announce 0x..32 --yes'],
584
- seeAlso: 'botanary approvals',
585
- },
586
- watch: {
587
- body: 'Tail live events in the foreground - a terminal has no notification bell, so this is how you learn\n' +
588
- 'an agent filed a request, your balance moved, or a parked sign request settled without polling by\n' +
589
- 'hand. Balance and sign-request status are real pushes (SSE), reconnected with backoff on drop;\n' +
590
- 'agent requests are polled, because the backend has no owner-facing push for those yet. Ctrl-C stops\n' +
591
- 'it cleanly, exit 0.',
592
- examples: ['botanary watch', 'botanary watch --json | jq .', 'botanary watch --interval-ms 2000'],
593
- seeAlso: 'botanary sign list, botanary agents, botanary balance',
594
- },
595
- account: {
596
- body: "Owner-signed lifecycle actions on the account itself: deploy a new one, install missing modules,\n" +
597
- 'top up on testnet, freeze/unfreeze the kill-switch, and migrate to today\'s address. Every\n' +
598
- 'subcommand here parks a sign request and waits on your browser, exactly like send and swap.',
599
- examples: ['botanary account deploy', 'botanary account freeze --yes'],
600
- seeAlso: 'botanary accounts list, botanary sign list',
601
- },
602
- 'account deploy': {
603
- body: 'Mint a new account with its own address - always the next CREATE2 index, never an existing one.',
604
- examples: ['botanary account deploy', 'botanary account deploy --yes --json'],
605
- seeAlso: 'botanary accounts list',
606
- },
607
- 'account setup': {
608
- body: 'Install every account module this chain is missing, so the account can actually be used there.',
609
- examples: ['botanary account setup --chain-id 84532 --yes'],
610
- seeAlso: 'botanary account migrate, botanary diagnose',
611
- },
612
- 'account fund': {
613
- body: 'Mint testnet USDC into this account - a faucet top-up, never a real transfer.',
614
- examples: ['botanary account fund --yes'],
615
- seeAlso: 'botanary balance',
616
- },
617
- 'account freeze': {
618
- body: 'Freeze this account, the kill-switch. No further transfers are authorized until you unfreeze.',
619
- examples: ['botanary account freeze --yes', 'botanary account freeze --lane panic --yes'],
620
- notes: 'This is testnet-only enforcement today - see the workspace CLAUDE.md\'s hookless-accounts caveat.',
621
- seeAlso: 'botanary account unfreeze, botanary panic freeze',
622
- },
623
- 'account unfreeze': {
624
- body: 'Unfreeze this account, restoring its ability to authorize transfers.',
625
- examples: ['botanary account unfreeze --yes'],
626
- seeAlso: 'botanary account freeze',
627
- },
628
- 'account rename': {
629
- body: 'Rename (and/or hide/unhide) an account. Off-chain metadata only - never builds, signs or relays a\n' +
630
- 'UserOp, unlike everything else in the account group. No signature - a plain session write.',
631
- examples: ['botanary account rename --label "Trading"', 'botanary account rename acct_2 --hide'],
632
- seeAlso: 'botanary accounts list',
633
- },
634
- 'account migrate': {
635
- body: "Migrate this account to today's address. Produces zero, one or two ops depending on its current migration phase and root validator.",
636
- examples: ['botanary account migrate --chain-id 84532 --yes'],
637
- seeAlso: 'botanary account setup, botanary sign show',
638
- },
639
- chains: {
640
- body: 'Every chain this backend serves, and what each one can actually do:\n' +
641
- ' watch read-only. No bundler, no authority\n' +
642
- ' basic a bundler exists but no AgentGuard: send, swap and manage work; authority declines\n' +
643
- ' botanary full on-chain authority, including mandates\n' +
644
- '\n' +
645
- 'This is the answer to "what do I pass to --chain-id".',
646
- examples: ['botanary chains', 'botanary chains --json | jq -r ".[] | select(.tier==\\"botanary\\") | .key"'],
647
- seeAlso: 'botanary gas, botanary send - list_chains (MCP)',
648
- },
649
- gas: {
650
- body: 'The gas methods actually available for this account on a chain. The backend filters out anything\n' +
651
- 'unavailable, so every row printed is usable. An empty list is the usual cause of a relay failing to\n' +
652
- 'pay for itself.',
653
- examples: ['botanary gas --chain-id 8453', 'botanary gas --chain-id 8453 --json'],
654
- seeAlso: 'botanary chains, botanary send - get_gas_methods (MCP)',
655
- },
656
- api: {
657
- body: 'Read any GET endpoint the frozen OpenAPI contract documents, authenticated as the owner. Paths are\n' +
658
- 'validated against the contract before anything reaches the network, and there is no write\n' +
659
- 'equivalent: every write goes through a typed intent you sign, or an on-chain-bound mandate.',
660
- examples: [
661
- 'botanary api /chains',
662
- 'botanary api "/balance?focusChainRef=eip155:8453"',
663
- 'botanary api --list',
664
- 'botanary api --list yield',
665
- ],
666
- seeAlso: 'botanary balance, botanary activity - wallet_api_get (MCP)',
667
- },
668
- open: {
669
- body: 'Open Botanary in your browser, optionally straight to one surface.',
670
- examples: ['botanary open', 'botanary open mandates', 'botanary open agents'],
671
- seeAlso: 'botanary docs',
672
- },
673
- agent: {
674
- body: 'This machine\'s own agent identity: what it is, what its owner granted it, and what it may spend\n' +
675
- 'unattended. This is never your owner session - the two lanes are deliberately separate.',
676
- examples: ['botanary agent whoami', 'botanary agent grant', 'botanary agent pair'],
677
- seeAlso: 'botanary whoami, botanary mandates',
678
- },
679
- 'agent whoami': {
680
- body: 'What the Botanary backend says about this agent: whether it was actually claimed, which account it is\n' +
681
- 'bound to, and its live grant if it has one. Fails honestly when this agent was never claimed rather\n' +
682
- 'than reporting a fabricated "connected".',
683
- examples: ['botanary agent whoami', 'botanary agent whoami --json'],
684
- seeAlso: 'botanary agent identity, botanary agent grant, botanary diagnose - whoami (MCP)',
685
- },
686
- 'agent identity': {
687
- body: 'This machine\'s local agent key: address, public key, short fingerprint, and which backend holds the\n' +
688
- 'private key (an OS keychain, or a 0600 file when none is available). Never contacts the backend and\n' +
689
- 'never prints the private key. Having an identity grants nothing by itself.',
690
- examples: ['botanary agent identity', 'botanary agent identity --json'],
691
- seeAlso: 'botanary agent whoami, botanary agent pair - get_identity (MCP)',
692
- },
693
- 'agent pair': {
694
- body: 'Show the pairing code for this machine and register it with Botanary. In Botanary, open Connected\n' +
695
- 'agents, enter the code, and name the agent. The same code comes back until it expires; --regenerate\n' +
696
- 'forces a fresh one.',
697
- examples: ['botanary agent pair', 'botanary agent pair --regenerate'],
698
- notes: 'The code only identifies this agent. Completing a pairing also needs a signature from the private key, which never leaves this machine.',
699
- seeAlso: 'botanary agent whoami - get_pairing_code (MCP)',
700
- },
701
- 'agent grant': {
702
- body: 'What this agent may do right now, in plain terms, without hitting any bound to find out.',
703
- examples: ['botanary agent grant', 'botanary agent grant --json'],
704
- seeAlso: 'botanary agent whoami, botanary mandates - what_may_i_do (MCP)',
705
- },
706
- 'agent account': {
707
- body: 'The one account this agent is bound to: its address and deployment status, optionally on one chain.',
708
- examples: ['botanary agent account', 'botanary agent account --chain-id 84532'],
709
- seeAlso: 'botanary agent whoami - get_account (MCP)',
710
- },
711
- 'agent balance': {
712
- body: 'The bound account\'s balance, read with this agent\'s own session rather than the owner\'s.',
713
- examples: ['botanary agent balance', 'botanary agent balance --json'],
714
- seeAlso: 'botanary balance - get_balance (MCP)',
715
- },
716
- 'agent requests': {
717
- body: 'Every approval request this agent has filed, and the owner\'s verdict on each.',
718
- examples: ['botanary agent requests', 'botanary agent requests --json'],
719
- seeAlso: 'botanary agent request - list_requests (MCP)',
720
- },
721
- 'agent request': {
722
- body: 'Ask the owner to approve something this agent could not do under its own grant. Names the exact calls\n' +
723
- 'and why, and returns which bound was crossed and the deadline, as the backend computed them. The\n' +
724
- 'owner approves it as their own action, in Botanary.',
725
- examples: [
726
- 'botanary agent request --reason "Pay the September invoice" --calls-file ./calls.json',
727
- 'botanary agent request --reason "Top up gas" --calls-file ./calls.json --json',
728
- ],
729
- notes: 'The calls file is a JSON array of { to, data, value, chainId } - the same shape a build response already carries.',
730
- seeAlso: 'botanary agent requests, botanary agent spend - request_approval (MCP)',
731
- },
732
- 'agent spend': {
733
- body: 'Spend under this agent\'s own grant, unattended. Reads the grant first: with no grant, an inactive\n' +
734
- 'grant, the wrong chain, or an amount past its remaining budget or per-action cap, this refuses with\n' +
735
- 'the backend\'s own numbers instead of attempting anything.',
736
- examples: [
737
- 'botanary agent spend --amount 5 --token USDC --recipient 0xAb..3F --chain-id 84532',
738
- 'botanary agent spend --amount 5 --token USDC --recipient 0xAb..3F --chain-id 84532 --dry-run',
739
- ],
740
- notes: 'When it refuses, `botanary agent request` is the lane that asks the owner instead.',
741
- seeAlso: 'botanary agent grant, botanary agent status - propose_payment (MCP)',
742
- },
743
- 'agent swap': {
744
- body: 'Swap under this agent\'s own grant, unattended, through the one venue the grant pins.',
745
- examples: [
746
- 'botanary agent swap --token-in USDC --token-out ETH --amount-in 10 --chain-id 84532',
747
- 'botanary agent swap --token-in USDC --token-out ETH --amount-in 10 --chain-id 84532 --max-slippage-bps 100',
748
- ],
749
- seeAlso: 'botanary agent grant - propose_swap (MCP)',
750
- },
751
- 'agent status': {
752
- body: 'The current status of an action this agent relayed, by the op id spend returned: pending, included or\n' +
753
- 'failed, with a transaction hash once one exists. Never resend a payment to find out what happened.',
754
- examples: ['botanary agent status op_123', 'botanary agent status op_123 --json'],
755
- seeAlso: 'botanary agent spend - get_action_status (MCP)',
756
- },
757
- 'agent apis': {
758
- body: 'Paid (x402) third-party API endpoints this agent may call, with live price and remaining budget.',
759
- examples: ['botanary agent apis --chain-id 84532', 'botanary agent apis --chain-id 84532 --json'],
760
- seeAlso: 'botanary agent pay, botanary agent budget - list_apis (MCP)',
761
- },
762
- 'agent pay': {
763
- body: 'Call a paid API endpoint and pay for it inside the budget the owner committed on chain.',
764
- examples: ['botanary agent pay ep_1 --chain-id 84532 --provider-id prov_1 --url https://api.example/v1/thing'],
765
- seeAlso: 'botanary agent apis, botanary agent budget - call_api (MCP)',
766
- },
767
- 'agent budget': {
768
- body: 'Remaining authorizations, per-call maximum, expiry and epoch for this agent on a chain.',
769
- examples: ['botanary agent budget --chain-id 84532', 'botanary agent budget --chain-id 84532 --json'],
770
- seeAlso: 'botanary agent apis - get_api_budget (MCP)',
771
- },
772
- 'agent forget': {
773
- body: 'Step 1 of 2. Preview what forgetting this machine\'s agent identity would destroy, and mint a\n' +
774
- 'confirmation token valid for five minutes. Nothing is deleted by this command.',
775
- examples: ['botanary agent forget'],
776
- seeAlso: 'botanary agent confirm-forget - forget (MCP)',
777
- },
778
- 'agent confirm-forget': {
779
- body: 'Step 2 of 2. Actually delete the agent key from this machine, given the token forget printed. The key\n' +
780
- 'cannot be recovered, and any grant issued to it stays orphaned until the owner revokes it.',
781
- examples: ['botanary agent confirm-forget 9f2c..'],
782
- seeAlso: 'botanary agent forget - confirm_forget (MCP)',
783
- },
784
- mcp: {
785
- body: 'Connect a coding agent (Claude Code, Codex, Cursor, Claude Desktop) to Botanary via botanary-mcp.',
786
- examples: ['botanary mcp config claude', 'botanary mcp install claude', 'botanary mcp serve'],
787
- seeAlso: 'botanary agent pair',
788
- },
789
- 'mcp config': {
790
- body: 'Print the install snippet for one client, ready to copy.',
791
- examples: ['botanary mcp config claude', 'botanary mcp config cursor'],
792
- seeAlso: 'botanary mcp install',
793
- },
794
- 'mcp install': {
795
- body: 'Install botanary-mcp into a client that has its own CLI for it (claude, codex), by running that\n' +
796
- 'client\'s own command. The exact command is printed first and needs your confirmation.\n' +
797
- '\n' +
798
- 'For cursor and claude-desktop this prints the snippet and the config path instead: Botanary does not\n' +
799
- 'edit another tool\'s config file on your behalf.',
800
- examples: ['botanary mcp install claude', 'botanary mcp install codex --yes'],
801
- seeAlso: 'botanary mcp config',
802
- },
803
- 'mcp serve': {
804
- body: 'Run the botanary-mcp server on stdio from this binary, for an MCP client configured to launch\n' +
805
- '`botanary mcp serve`. Identical to running botanary-mcp directly.',
806
- examples: ['botanary mcp serve'],
807
- seeAlso: 'botanary mcp config',
808
- },
809
- diagnose: {
810
- body: 'Start here when anything is unclear or an action failed. One call answers who this agent is bound to,\n' +
811
- 'whether that account is funded on the grant\'s own chain, whether that chain can do what the grant\n' +
812
- 'claims, and what is blocking the next action, ranked, each with a concrete next step.',
813
- examples: ['botanary diagnose', 'botanary diagnose --json'],
814
- seeAlso: 'botanary doctor, botanary agent whoami - diagnose (MCP)',
815
- },
816
- doctor: {
817
- body: 'The same readiness check as `botanary diagnose`, under the name most CLIs use for it.',
818
- examples: ['botanary doctor'],
819
- seeAlso: 'botanary diagnose',
820
- },
821
- config: {
822
- body: 'Where identity and session live, which environment variables are active, and the CLI defaults stored\n' +
823
- 'on this machine. Unauthenticated and safe to run any time.',
824
- examples: ['botanary config', 'botanary config list', 'botanary config set chainId 8453'],
825
- seeAlso: 'botanary diagnose',
826
- },
827
- 'config list': {
828
- body: 'Every setting, its resolved value, and where that value came from: a flag, an environment variable,\n' +
829
- 'the config file, or the built-in default. The provenance column is the point - a stale file value\n' +
830
- 'that overrides nothing looks identical to one silently retargeting every command otherwise.',
831
- examples: ['botanary config list', 'botanary config list --json'],
832
- seeAlso: 'botanary config set',
833
- },
834
- 'config get': {
835
- body: 'Print one stored config value, or nothing when it is unset.',
836
- examples: ['botanary config get chainId'],
837
- seeAlso: 'botanary config list',
838
- },
839
- 'config set': {
840
- body: 'Store a default for one setting, so you stop retyping it. Unknown keys and values are refused.\n' +
841
- 'Warning: `config set confirm never` auto-confirms all mutations. Do not set this in an untrusted terminal.',
842
- examples: ['botanary config set chainId 8453', 'botanary config set output json'],
843
- seeAlso: 'botanary config list, botanary config unset',
844
- },
845
- 'config unset': {
846
- body: 'Remove one stored default, falling back to the environment or the built-in default.',
847
- examples: ['botanary config unset chainId'],
848
- seeAlso: 'botanary config list',
849
- },
850
- version: {
851
- body: 'The installed botanary CLI version.',
852
- examples: ['botanary version', 'botanary --version'],
853
- seeAlso: 'botanary update',
854
- },
855
- 'update-check': {
856
- body: 'Ask npm whether a newer botanary is published. Cached for a day and silent when offline. It only\n' +
857
- 'reports - `botanary update` is the one that changes anything.',
858
- examples: ['botanary update-check', 'botanary update-check --json'],
859
- notes: 'Set BOTANARY_NO_UPDATE_NOTIFIER=1 to suppress the one-line nag other commands print.',
860
- seeAlso: 'botanary update',
861
- },
862
- update: {
863
- body: 'Update botanary to the latest published version. It works out how this copy was installed - npm,\n' +
864
- 'pnpm, yarn or bun - and runs that manager, after showing you the exact command and asking. Under a\n' +
865
- 'one-off runner - `npx`, `pnpm dlx` or `bunx` - there is nothing to update, because those already\n' +
866
- 'fetch the latest botanary every run.',
867
- examples: ['botanary update', 'botanary update --yes', 'botanary update --json --yes', 'botanary update --dry-run'],
868
- notes: 'Needs --yes when it cannot ask, and it never uses sudo: a permission error is yours to resolve.',
869
- seeAlso: 'botanary update-check',
870
- },
871
- docs: {
872
- body: 'Open the Botanary documentation in your browser, optionally at one topic.',
873
- examples: ['botanary docs', 'botanary docs mandates'],
874
- seeAlso: 'botanary open',
875
- },
876
- completion: {
877
- body: 'Print a shell completion script. Add it to your shell profile to complete command names, flags,\n' +
878
- 'chain ids and documented API paths.',
879
- examples: [
880
- 'botanary completion zsh > ~/.botanary-completion.zsh',
881
- 'botanary completion bash >> ~/.bashrc',
882
- ],
883
- seeAlso: 'botanary help',
884
- },
885
- prompt: {
886
- body: 'Print the complete operating manual for a non-human driver: every command, flags-only invocation,\n' +
887
- 'the exit-code table, the JSON envelope, the two lanes, and which steps still need a human. Generated\n' +
888
- 'from the same metadata as --help, so it cannot drift from it.',
889
- examples: ['botanary prompt', 'botanary prompt > BOTANARY.md'],
890
- seeAlso: 'botanary completion, botanary mcp config',
891
- },
892
- };
893
- /** The command's full path with the program name stripped: '', 'send', 'agent spend'. */
894
- export function commandPath(cmd) {
895
- const parts = [];
896
- for (let c = cmd; c && c.parent; c = c.parent) {
897
- parts.unshift(c.name());
898
- }
899
- return parts.join(' ');
900
- }
901
- export function helpFor(cmd) {
902
- return COMMAND_HELP[commandPath(cmd)];
903
- }
904
- //# sourceMappingURL=examples.js.map