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 +0,0 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"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"}
@@ -1,91 +0,0 @@
1
- import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
- import { botanaryMcpHome } from 'botanary-mcp';
4
- /** One check a day is plenty: this is a courtesy, not a dependency. */
5
- export const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
6
- const REGISTRY_URL = 'https://registry.npmjs.org/botanary/latest';
7
- const DEFAULT_TIMEOUT_MS = 1_500;
8
- export function cachePath() {
9
- return join(botanaryMcpHome(), 'update-check.json');
10
- }
11
- export async function readCache() {
12
- try {
13
- const parsed = JSON.parse(await readFile(cachePath(), 'utf8'));
14
- if (typeof parsed.checkedAt !== 'number')
15
- return null;
16
- if (typeof parsed.latest !== 'string' && parsed.latest !== null)
17
- return null;
18
- return { checkedAt: parsed.checkedAt, latest: parsed.latest };
19
- }
20
- catch {
21
- return null;
22
- }
23
- }
24
- export async function writeCache(entry) {
25
- try {
26
- await mkdir(botanaryMcpHome(), { recursive: true });
27
- await writeFile(cachePath(), `${JSON.stringify(entry)}\n`, { encoding: 'utf8', mode: 0o600 });
28
- }
29
- catch {
30
- // A cache we cannot write just means we check again next time. Never fail a command over it.
31
- }
32
- }
33
- /** Numeric segment comparison. A prerelease sorts BELOW its release, so a beta never nags a stable user. */
34
- export function isNewer(latest, current) {
35
- const parse = (version) => {
36
- const match = /^(\d+)\.(\d+)\.(\d+)(-.*)?$/.exec(version.trim());
37
- if (!match)
38
- return null;
39
- return [Number(match[1]), Number(match[2]), Number(match[3]), match[4] ? 0 : 1];
40
- };
41
- const a = parse(latest);
42
- const b = parse(current);
43
- if (!a || !b)
44
- return false;
45
- for (let i = 0; i < 4; i += 1) {
46
- if (a[i] !== b[i])
47
- return a[i] > b[i];
48
- }
49
- return false;
50
- }
51
- /** Never throws, never waits long. A registry that is slow or unreachable simply produces no answer. */
52
- export async function fetchLatest(deps) {
53
- const controller = new AbortController();
54
- const timer = setTimeout(() => controller.abort(), deps.timeoutMs ?? DEFAULT_TIMEOUT_MS);
55
- try {
56
- const response = await deps.fetchImpl(REGISTRY_URL, { signal: controller.signal });
57
- if (!response.ok)
58
- return null;
59
- const body = (await response.json());
60
- return typeof body.version === 'string' ? body.version : null;
61
- }
62
- catch {
63
- return null;
64
- }
65
- finally {
66
- clearTimeout(timer);
67
- }
68
- }
69
- export async function checkForUpdate(current, deps) {
70
- const cached = await readCache();
71
- if (!deps.force && cached && deps.now() - cached.checkedAt < CACHE_TTL_MS) {
72
- return { current, latest: cached.latest, newer: cached.latest ? isNewer(cached.latest, current) : false, fromCache: true };
73
- }
74
- const latest = await fetchLatest(deps);
75
- await writeCache({ checkedAt: deps.now(), latest });
76
- return { current, latest, newer: latest ? isNewer(latest, current) : false, fromCache: false };
77
- }
78
- /**
79
- * The courtesy line. It leads with `botanary update`, which knows how to do the work, and names the
80
- * manager-specific command only as the fallback for someone who would rather run it themselves. A copy
81
- * with nothing to run - npx - gets no parenthetical, because there is no command to offer.
82
- */
83
- export function nagLine(latest, current, method) {
84
- const fallback = method.command ? ` (or \`${method.command.join(' ')}\`)` : '';
85
- return `Update available: ${current} to ${latest}. Run \`botanary update\`${fallback}.`;
86
- }
87
- /** CI is included because a nag in a build log is noise nobody can act on from there. */
88
- export function nagSuppressed(env) {
89
- return !!env.BOTANARY_NO_UPDATE_NOTIFIER || !!env.CI;
90
- }
91
- //# sourceMappingURL=update-check.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/update-check.ts"],"names":[],"mappings":"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"}
@@ -1,138 +0,0 @@
1
- import { CliError, EXIT, invalidArgs } from './errors.js';
2
- /** Validate an amount at the one boundary that can still say which flag was wrong. 0.1.0 passed the raw
3
- * string to `Number()`, so `--amount abc` became NaN and travelled all the way to a build call. */
4
- export function parseAmount(raw, flag = '--amount') {
5
- const value = typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw.trim()) : Number.NaN;
6
- if (!Number.isFinite(value) || value <= 0) {
7
- throw invalidArgs(`${flag} must be a positive number, got ${JSON.stringify(raw)}.`, 'Amounts are in display units, e.g. 25 for 25 USDC.');
8
- }
9
- return value;
10
- }
11
- /** CAIP-2 namespaces map one-to-one onto address formats. Unknown or absent defaults to EVM, which is the
12
- * only family a chain row without a namespace could be under the current contract. */
13
- export function familyOf(namespace) {
14
- if (namespace === 'solana')
15
- return 'solana';
16
- if (namespace === 'stellar')
17
- return 'stellar';
18
- return 'evm';
19
- }
20
- const PATTERNS = {
21
- evm: { re: /^0x[0-9a-fA-F]{40}$/, label: 'an EVM address', example: '0x' + 'ab'.repeat(20) },
22
- solana: { re: /^[1-9A-HJ-NP-Za-km-z]{32,44}$/, label: 'a Solana address', example: '4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T' },
23
- stellar: { re: /^G[A-Z2-7]{55}$/, label: 'a Stellar address', example: `G${'A'.repeat(55)}` },
24
- };
25
- export function assertAddress(raw, family) {
26
- if (typeof raw !== 'string' || raw.trim() === '') {
27
- throw invalidArgs('--recipient is required.', `Expected ${PATTERNS[family].label}, e.g. ${PATTERNS[family].example}.`);
28
- }
29
- const value = raw.trim();
30
- const pattern = PATTERNS[family];
31
- if (!pattern.re.test(value)) {
32
- throw invalidArgs(`"${value}" is not ${pattern.label}.`, `This chain expects ${pattern.label}, e.g. ${pattern.example}.`);
33
- }
34
- return value;
35
- }
36
- /** Resolve whatever the user typed against the chains the backend actually serves. Accepts a chain id, a
37
- * chain key, a CAIP-2 chainRef, or a case-insensitive name, because all four appear in the product. */
38
- export function findChain(chains, ref) {
39
- const list = (Array.isArray(chains) ? chains : []);
40
- if (!list.length) {
41
- throw new CliError('The backend reported no chains at all.', 'no_chains', EXIT.upstream, 'Try again shortly, or check `botanary config` for the API URL in use.');
42
- }
43
- if (ref === null || ref === undefined || ref === '') {
44
- throw invalidArgs('--chain is required.', `Pass --chain-id for EVM chains or --chain for any family, or set one with \`botanary config set chainId <id>\`. See \`botanary chains\`.`);
45
- }
46
- const needle = String(ref).trim().toLowerCase();
47
- const match = list.find((chain) => String(chain.key ?? '').toLowerCase() === needle ||
48
- String(chain.chainId ?? '').toLowerCase() === needle ||
49
- String(chain.chainRef ?? '').toLowerCase() === needle ||
50
- String(chain.name ?? '').toLowerCase() === needle);
51
- if (!match) {
52
- const known = list.map((chain) => chain.key).filter(Boolean).slice(0, 12).join(', ');
53
- throw invalidArgs(`"${ref}" is not a chain this backend serves. Try one of: ${known}.`, `Full list: \`botanary chains\`.`);
54
- }
55
- return {
56
- key: String(match.key ?? ''),
57
- name: String(match.name ?? ''),
58
- chainId: typeof match.chainId === 'number' ? match.chainId : null,
59
- chainRef: String(match.chainRef ?? ''),
60
- namespace: String(match.namespace ?? 'eip155'),
61
- tier: String(match.tier ?? ''),
62
- testnet: match.testnet === true,
63
- };
64
- }
65
- /**
66
- * Refuse before building what the chain's own tier cannot do. This is an OFF-CHAIN preflight, never an
67
- * on-chain revert - product copy must not imply otherwise (workspace CLAUDE.md, "Chain families and
68
- * tiers") - and it reports as a decline rather than a usage error, because nothing about the command was
69
- * malformed.
70
- */
71
- export function assertTierAllows(chain, need) {
72
- if (need === 'read')
73
- return;
74
- if (chain.tier === 'watch') {
75
- throw new CliError(`${chain.name} (${chain.key}) is a watch-tier chain: read-only, with no bundler.`, 'chain_capability_unavailable', EXIT.declined, 'Pick a chain with tier basic or botanary - see `botanary chains`.');
76
- }
77
- if (need === 'authority' && chain.tier !== 'botanary') {
78
- throw new CliError(`${chain.name} (${chain.key}) carries no AgentGuard, so authority actions are unavailable there.`, 'chain_capability_unavailable', EXIT.declined, 'Authority actions need a botanary-tier chain - see `botanary chains`.');
79
- }
80
- }
81
- /** Every token this account displays on one chain, largest balance first. Reads `/v1/balance`'s
82
- * deprecated-but-still-populated `tokens` array (`TokenBalance[]`) rather than `holdings`
83
- * (`ValuedHolding[]`), because only `tokens` carries `tokenAddress` and `source` - the two fields a
84
- * symbol refusal needs to name a candidate unambiguously. Deliberately not filtered to a positive
85
- * balance: `TokenBalance.displayable = registry ∪ discovered ∪ imported` (see backend `types.ts`), and a
86
- * zero-balance registry or imported row is still a real, addressable token - it just has nothing in it
87
- * right now. Never a catalog beyond that: a token neither registered, discovered nor imported for this
88
- * account is not in `tokens` at all. */
89
- export function tokenChoicesFor(balance, chainId) {
90
- const tokens = balance?.tokens;
91
- const list = Array.isArray(tokens) ? tokens : [];
92
- return list
93
- .filter((t) => t.chainId === chainId)
94
- .filter((t) => typeof t.assetRef === 'string' && typeof t.decimals === 'number')
95
- .map((t) => ({
96
- assetRef: String(t.assetRef),
97
- address: String(t.tokenAddress ?? ''),
98
- symbol: String(t.symbol ?? ''),
99
- name: t.name === undefined ? undefined : String(t.name),
100
- decimals: Number(t.decimals),
101
- amount: typeof t.amount === 'number' ? t.amount : undefined,
102
- source: t.source === undefined ? undefined : String(t.source),
103
- spendable: t.spendable === undefined ? undefined : Boolean(t.spendable),
104
- }))
105
- .sort((a, b) => (b.amount ?? 0) - (a.amount ?? 0));
106
- }
107
- const EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
108
- /** Namespace:reference/assetNamespace: - loose on purpose (CAIP-19 has no public grammar doc this repo
109
- * pins to); it only needs to distinguish a real asset ref from a bare symbol like "USDC". */
110
- const CAIP19_PREFIX_RE = /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}\/[-a-z0-9]{3,8}:/;
111
- /** True for something this CLI will pass through to `resolveAsset` as a token identifier - a contract
112
- * address or a CAIP-19 asset ref. False for anything else, symbols included: `--token` is address-only
113
- * (Task 9), because a symbol is a label a contract picks for itself and two contracts on one chain can
114
- * legally share one. */
115
- export function isTokenRef(value) {
116
- const v = value.trim();
117
- return EVM_ADDRESS_RE.test(v) || CAIP19_PREFIX_RE.test(v);
118
- }
119
- /**
120
- * The refusal a symbol earns - which does the lookup for the user rather than merely complaining. "Pass
121
- * the contract address instead" is an instruction to go and find one somewhere else unless the CLI ships
122
- * the thing that finds it, so this reads the account's own holdings and prints every match as a
123
- * ready-to-paste `--token` flag. A usage error that leaves someone hunting through a block explorer for
124
- * an address is a worse experience than the symbol ambiguity it is protecting them from.
125
- */
126
- export function symbolRefusalMessage(symbol, chainName, matches) {
127
- if (matches.length === 0) {
128
- return (`"${symbol}" is a symbol, not a token - and this account holds no token called "${symbol}" on ` +
129
- `${chainName}. Run \`botanary tokens --chain-id <id>\` to see what it does hold.`);
130
- }
131
- const lines = matches.map((m) => ` --token ${m.address} ${m.symbol} ${m.decimals}dp ${m.source ?? 'unknown source'}`);
132
- const count = matches.length === 1 ? 'One token' : `${matches.length} tokens`;
133
- return (`"${symbol}" is a symbol, not a token. A symbol is a label a contract picks for itself, so Botanary ` +
134
- `will not guess which you meant. ${count} you hold on ${chainName} answer${matches.length === 1 ? 's' : ''} to it:\n` +
135
- lines.join('\n') +
136
- `\n Pass one of those. \`botanary tokens\` lists them all.`);
137
- }
138
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}