botanary 0.2.1 → 0.3.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 +7 -1
- package/dist/package.json +15 -8
- package/dist/src/cli.js +25 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/agent.js +9 -41
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/mcp.js +17 -4
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/tokens.js +36 -0
- package/dist/src/commands/tokens.js.map +1 -0
- package/dist/src/commands/utilities.js +76 -1
- package/dist/src/commands/utilities.js.map +1 -1
- package/dist/src/commands/wallet.js +53 -25
- package/dist/src/commands/wallet.js.map +1 -1
- package/dist/src/help/examples.js +33 -14
- package/dist/src/help/examples.js.map +1 -1
- package/dist/src/install-method.js +50 -0
- package/dist/src/install-method.js.map +1 -0
- package/dist/src/progress.js +19 -0
- package/dist/src/progress.js.map +1 -1
- package/dist/src/render/balance.js +19 -2
- package/dist/src/render/balance.js.map +1 -1
- package/dist/src/render/chains.js +1 -1
- package/dist/src/render/chains.js.map +1 -1
- package/dist/src/review.js +2 -5
- package/dist/src/review.js.map +1 -1
- package/dist/src/run-installer.js +30 -0
- package/dist/src/run-installer.js.map +1 -0
- package/dist/src/update-check.js +8 -2
- package/dist/src/update-check.js.map +1 -1
- package/dist/src/validate.js +55 -9
- package/dist/src/validate.js.map +1 -1
- package/package.json +15 -8
- package/dist/src/render/apis.js +0 -44
- package/dist/src/render/apis.js.map +0 -1
- package/dist/src/render/json-mode.js +0 -10
- package/dist/src/render/json-mode.js.map +0 -1
package/dist/src/review.js
CHANGED
|
@@ -27,10 +27,6 @@ export function dryRunPayload(title, rows, warnings) {
|
|
|
27
27
|
* proceeds on an assumption. `--yes` is an explicit yes; an interactive terminal is asked; and anything
|
|
28
28
|
* else - a script, a pipe, `--json`, `--no-interactive` - is exit 2 naming the flag it needed, rather than
|
|
29
29
|
* a prompt that cannot render or a silent self-confirmation.
|
|
30
|
-
*
|
|
31
|
-
* Under `--quiet`, the review panel is still printed: this is the essential output for a funds-moving
|
|
32
|
-
* command, not decoration. `--quiet` mutes progress spinners and update checks, not the record of what
|
|
33
|
-
* is being approved.
|
|
34
30
|
*/
|
|
35
31
|
export async function confirmOrThrow(ctx, title, rows, warnings, opts) {
|
|
36
32
|
// When yes came from the config file (confirm: never), still print the review panel so the user sees
|
|
@@ -46,7 +42,8 @@ export async function confirmOrThrow(ctx, title, rows, warnings, opts) {
|
|
|
46
42
|
if (ctx.json || !ctx.interactive) {
|
|
47
43
|
throw invalidArgs(`${opts?.because ?? 'This command moves funds and needs a confirmation it cannot ask for here.'} Pass --yes to confirm non-interactively, or --dry-run to preflight it instead.`);
|
|
48
44
|
}
|
|
49
|
-
|
|
45
|
+
if (!ctx.quiet)
|
|
46
|
+
console.log(renderReview(title, rows, warnings));
|
|
50
47
|
const answer = await clack.confirm({ message: opts?.question ?? 'Send it?', initialValue: false });
|
|
51
48
|
if (answer !== true) {
|
|
52
49
|
throw new CliError('Cancelled - nothing was signed and nothing was sent.', 'cancelled', EXIT.error);
|
package/dist/src/review.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB1D,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAC/E,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAqB,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAChF,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,QAAQ;KACT,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB1D,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAC/E,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAqB,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAChF,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAc,EACd,KAAa,EACb,IAAiB,EACjB,QAAkB,EAClB,IAA8C;IAE9C,qGAAqG;IACrG,uEAAuE;IACvE,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,MAAM,CAAC;IAC1E,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO;IACpB,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,WAAW,CACf,GAAG,IAAI,EAAE,OAAO,IAAI,2EAA2E,iFAAiF,CACjL,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACnG,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,sDAAsD,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Run a package manager and report its exit code.
|
|
4
|
+
*
|
|
5
|
+
* stdio is inherited (or partly silenced - see `RunInstallerOptions`) so npm's own progress, prompts and
|
|
6
|
+
* errors reach the user unfiltered - an installer failure explains itself far better than anything this
|
|
7
|
+
* CLI could re-author, and an EACCES on a global directory is exactly the kind of message that must not be
|
|
8
|
+
* swallowed.
|
|
9
|
+
*
|
|
10
|
+
* Never throws. A binary that is missing resolves non-zero like any other failure, because the caller
|
|
11
|
+
* does the same thing either way: report that nothing changed.
|
|
12
|
+
*/
|
|
13
|
+
export function runInstaller(command, options = {}) {
|
|
14
|
+
const [bin, ...args] = command;
|
|
15
|
+
if (!bin)
|
|
16
|
+
return Promise.resolve(1);
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const child = spawn(bin, args, {
|
|
19
|
+
stdio: options.silent ? ['ignore', 'ignore', 'inherit'] : 'inherit',
|
|
20
|
+
// npm, pnpm and yarn are `.cmd` shims on Windows. `spawn` does not apply PATHEXT, and since the fix
|
|
21
|
+
// for CVE-2024-27980 Node refuses to run a `.cmd` at all without `shell: true`. There is no
|
|
22
|
+
// injection surface here: `command` is always one of classifyInstall's constant-literal argv
|
|
23
|
+
// arrays, never user input.
|
|
24
|
+
shell: process.platform === 'win32',
|
|
25
|
+
});
|
|
26
|
+
child.on('error', () => resolve(1));
|
|
27
|
+
child.on('close', (code) => resolve(code ?? 1));
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=run-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-installer.js","sourceRoot":"","sources":["../../src/run-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAY3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,OAAiB,EAAE,UAA+B,EAAE;IAC/E,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YACnE,oGAAoG;YACpG,4FAA4F;YAC5F,6FAA6F;YAC7F,4BAA4B;YAC5B,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/src/update-check.js
CHANGED
|
@@ -75,8 +75,14 @@ export async function checkForUpdate(current, deps) {
|
|
|
75
75
|
await writeCache({ checkedAt: deps.now(), latest });
|
|
76
76
|
return { current, latest, newer: latest ? isNewer(latest, current) : false, fromCache: false };
|
|
77
77
|
}
|
|
78
|
-
|
|
79
|
-
|
|
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}.`;
|
|
80
86
|
}
|
|
81
87
|
/** CI is included because a nag in a build log is noise nobody can act on from there. */
|
|
82
88
|
export function nagSuppressed(env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/update-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/update-check.ts"],"names":[],"mappings":"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"}
|
package/dist/src/validate.js
CHANGED
|
@@ -78,15 +78,61 @@ export function assertTierAllows(chain, need) {
|
|
|
78
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
79
|
}
|
|
80
80
|
}
|
|
81
|
-
/**
|
|
82
|
-
*
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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 : [];
|
|
86
92
|
return list
|
|
87
|
-
.filter((
|
|
88
|
-
.filter((
|
|
89
|
-
.map((
|
|
90
|
-
|
|
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.`);
|
|
91
137
|
}
|
|
92
138
|
//# sourceMappingURL=validate.js.map
|
package/dist/src/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "botanary",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"description": "Botanary from your terminal - a guided CLI over the same wallet and agent lanes botanary-mcp exposes to a coding agent.",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
7
|
"homepage": "https://docs.botanary.xyz",
|
|
8
|
-
"keywords": [
|
|
8
|
+
"keywords": [
|
|
9
|
+
"botanary",
|
|
10
|
+
"cli",
|
|
11
|
+
"wallet"
|
|
12
|
+
],
|
|
9
13
|
"bin": {
|
|
10
14
|
"botanary": "dist/bin/botanary.js"
|
|
11
15
|
},
|
|
12
|
-
"files": [
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
13
20
|
"engines": {
|
|
14
21
|
"node": ">=22.0.0"
|
|
15
22
|
},
|
|
@@ -23,13 +30,13 @@
|
|
|
23
30
|
"test:watch": "vitest"
|
|
24
31
|
},
|
|
25
32
|
"dependencies": {
|
|
26
|
-
"botanary-mcp": "^0.6.1",
|
|
27
|
-
"commander": "^13.1.0",
|
|
28
33
|
"@clack/prompts": "^0.9.1",
|
|
29
|
-
"
|
|
30
|
-
"
|
|
34
|
+
"botanary-mcp": "^0.7.0",
|
|
35
|
+
"cli-table3": "^0.6.5",
|
|
36
|
+
"commander": "^13.1.0",
|
|
31
37
|
"figlet": "^1.7.0",
|
|
32
|
-
"
|
|
38
|
+
"gradient-string": "^3.0.0",
|
|
39
|
+
"picocolors": "^1.1.1"
|
|
33
40
|
},
|
|
34
41
|
"devDependencies": {
|
|
35
42
|
"@swc-node/register": "^1.10.9",
|
package/dist/src/render/apis.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { columns, dash, section } from './kv.js';
|
|
2
|
-
const HEADERS = ['ID', 'NAME', 'CATEGORY', 'ENDPOINTS', 'VERIFIED', 'MIN PRICE (ATOMIC)', 'MAX PRICE (ATOMIC)'];
|
|
3
|
-
/**
|
|
4
|
-
* Render atomic price units honestly: null renders as a dash, strings render as-is.
|
|
5
|
-
* Never converts to decimals or adds currency symbols.
|
|
6
|
-
*/
|
|
7
|
-
function priceAtomicCell(priceUnits) {
|
|
8
|
-
if (priceUnits === null || priceUnits === undefined)
|
|
9
|
-
return '-';
|
|
10
|
-
return String(priceUnits);
|
|
11
|
-
}
|
|
12
|
-
export function providerRows(providers) {
|
|
13
|
-
const list = Array.isArray(providers) ? providers : [];
|
|
14
|
-
return list
|
|
15
|
-
.filter((provider) => provider !== null && typeof provider === 'object')
|
|
16
|
-
.map((provider) => [
|
|
17
|
-
dash(provider.id),
|
|
18
|
-
dash(provider.name),
|
|
19
|
-
dash(provider.category),
|
|
20
|
-
dash(provider.endpointCount),
|
|
21
|
-
dash(provider.verifiedCount),
|
|
22
|
-
priceAtomicCell(provider.minPriceUnits),
|
|
23
|
-
priceAtomicCell(provider.maxPriceUnits),
|
|
24
|
-
]);
|
|
25
|
-
}
|
|
26
|
-
export function renderApis(response) {
|
|
27
|
-
const data = response;
|
|
28
|
-
const providers = data?.providers;
|
|
29
|
-
const rows = providerRows(providers);
|
|
30
|
-
if (!rows.length)
|
|
31
|
-
return `${section('API Providers')}\n No providers available.`;
|
|
32
|
-
const output = [section('API Providers'), columns(HEADERS, rows)];
|
|
33
|
-
// Surface filtering info if providers were hidden
|
|
34
|
-
if (data?.hidden && data.hidden > 0) {
|
|
35
|
-
output.push('');
|
|
36
|
-
output.push(section('Hidden'));
|
|
37
|
-
output.push(` ${data.hidden} provider(s) have no endpoints on this chain.`);
|
|
38
|
-
if (data.reasonsTruncated) {
|
|
39
|
-
output.push(' (Reasons truncated at 50 entries)');
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return output.join('\n');
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=apis.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apis.js","sourceRoot":"","sources":["../../../src/render/apis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAmBjD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;AAEhH;;;GAGG;AACH,SAAS,eAAe,CAAC,UAAmB;IAC1C,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAChE,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,SAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC;SACvE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5B,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC;QACvC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC;KACxC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAiB;IAC1C,MAAM,IAAI,GAAG,QAA2B,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC;IAElC,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,6BAA6B,CAAC;IAElF,MAAM,MAAM,GAAa,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5E,kDAAkD;IAClD,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,+CAA+C,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/** --json forces it on. Otherwise: a non-TTY stdout (piped, redirected, or run from another program)
|
|
2
|
-
* auto-enables it, matching the Alchemy CLI reference exactly. --no-interactive alone does NOT force
|
|
3
|
-
* JSON - it only disables prompts; a human running --no-interactive in a real terminal still wants
|
|
4
|
-
* human-readable output unless they also asked for --json or piped it. */
|
|
5
|
-
export function isJsonMode(opts, stdout = process.stdout) {
|
|
6
|
-
if (opts.json)
|
|
7
|
-
return true;
|
|
8
|
-
return !stdout.isTTY;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=json-mode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json-mode.js","sourceRoot":"","sources":["../../../src/render/json-mode.ts"],"names":[],"mappings":"AAKA;;;2EAG2E;AAC3E,MAAM,UAAU,UAAU,CAAC,IAAkB,EAAE,SAA8B,OAAO,CAAC,MAAM;IACzF,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AACvB,CAAC"}
|