botanary 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/botanary.js +2 -0
- package/package.json +8 -6
- package/dist/bin/botanary.js +0 -25
- package/dist/bin/botanary.js.map +0 -1
- package/dist/src/app-url.js +0 -52
- package/dist/src/app-url.js.map +0 -1
- package/dist/src/cli.js +0 -195
- package/dist/src/cli.js.map +0 -1
- package/dist/src/commands/account.js +0 -171
- package/dist/src/commands/account.js.map +0 -1
- package/dist/src/commands/agent.js +0 -338
- package/dist/src/commands/agent.js.map +0 -1
- package/dist/src/commands/authority.js +0 -634
- package/dist/src/commands/authority.js.map +0 -1
- package/dist/src/commands/mcp.js +0 -163
- package/dist/src/commands/mcp.js.map +0 -1
- package/dist/src/commands/services.js +0 -460
- package/dist/src/commands/services.js.map +0 -1
- package/dist/src/commands/session-writes.js +0 -196
- package/dist/src/commands/session-writes.js.map +0 -1
- package/dist/src/commands/sign.js +0 -311
- package/dist/src/commands/sign.js.map +0 -1
- package/dist/src/commands/system.js +0 -135
- package/dist/src/commands/system.js.map +0 -1
- package/dist/src/commands/tokens.js +0 -36
- package/dist/src/commands/tokens.js.map +0 -1
- package/dist/src/commands/utilities.js +0 -119
- package/dist/src/commands/utilities.js.map +0 -1
- package/dist/src/commands/wallet.js +0 -1013
- package/dist/src/commands/wallet.js.map +0 -1
- package/dist/src/commands/watch.js +0 -259
- package/dist/src/commands/watch.js.map +0 -1
- package/dist/src/completion.js +0 -69
- package/dist/src/completion.js.map +0 -1
- package/dist/src/config-store.js +0 -52
- package/dist/src/config-store.js.map +0 -1
- package/dist/src/context.js +0 -19
- package/dist/src/context.js.map +0 -1
- package/dist/src/errors.js +0 -116
- package/dist/src/errors.js.map +0 -1
- package/dist/src/help/examples.js +0 -904
- package/dist/src/help/examples.js.map +0 -1
- package/dist/src/help/format.js +0 -144
- package/dist/src/help/format.js.map +0 -1
- package/dist/src/help/groups.js +0 -39
- package/dist/src/help/groups.js.map +0 -1
- package/dist/src/install-method.js +0 -50
- package/dist/src/install-method.js.map +0 -1
- package/dist/src/mcp-snippets.js +0 -27
- package/dist/src/mcp-snippets.js.map +0 -1
- package/dist/src/outcome.js +0 -63
- package/dist/src/outcome.js.map +0 -1
- package/dist/src/package-version.js +0 -53
- package/dist/src/package-version.js.map +0 -1
- package/dist/src/parser.js +0 -48
- package/dist/src/parser.js.map +0 -1
- package/dist/src/progress.js +0 -56
- package/dist/src/progress.js.map +0 -1
- package/dist/src/prompt-doc.js +0 -92
- package/dist/src/prompt-doc.js.map +0 -1
- package/dist/src/render/accounts.js +0 -21
- package/dist/src/render/accounts.js.map +0 -1
- package/dist/src/render/activity.js +0 -34
- package/dist/src/render/activity.js.map +0 -1
- package/dist/src/render/agents.js +0 -42
- package/dist/src/render/agents.js.map +0 -1
- package/dist/src/render/balance.js +0 -85
- package/dist/src/render/balance.js.map +0 -1
- package/dist/src/render/banner.js +0 -17
- package/dist/src/render/banner.js.map +0 -1
- package/dist/src/render/chains.js +0 -52
- package/dist/src/render/chains.js.map +0 -1
- package/dist/src/render/colors.js +0 -50
- package/dist/src/render/colors.js.map +0 -1
- package/dist/src/render/gas.js +0 -34
- package/dist/src/render/gas.js.map +0 -1
- package/dist/src/render/grant.js +0 -34
- package/dist/src/render/grant.js.map +0 -1
- package/dist/src/render/kv.js +0 -60
- package/dist/src/render/kv.js.map +0 -1
- package/dist/src/render/mandates.js +0 -111
- package/dist/src/render/mandates.js.map +0 -1
- package/dist/src/render/print.js +0 -18
- package/dist/src/render/print.js.map +0 -1
- package/dist/src/render/redact.js +0 -23
- package/dist/src/render/redact.js.map +0 -1
- package/dist/src/render/table.js +0 -16
- package/dist/src/render/table.js.map +0 -1
- package/dist/src/repl.js +0 -232
- package/dist/src/repl.js.map +0 -1
- package/dist/src/review.js +0 -52
- package/dist/src/review.js.map +0 -1
- package/dist/src/run-installer.js +0 -30
- package/dist/src/run-installer.js.map +0 -1
- package/dist/src/settings.js +0 -88
- package/dist/src/settings.js.map +0 -1
- package/dist/src/update-check.js +0 -91
- package/dist/src/update-check.js.map +0 -1
- package/dist/src/validate.js +0 -138
- package/dist/src/validate.js.map +0 -1
package/dist/src/prompt-doc.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { EXIT_CODES } from './errors.js';
|
|
2
|
-
import { COMMAND_HELP, commandPath } from './help/examples.js';
|
|
3
|
-
import { DOCS_URL, GROUP_ORDER, groupOf } from './help/groups.js';
|
|
4
|
-
/**
|
|
5
|
-
* The whole operating manual for a non-human driver, generated from the same metadata `--help` renders, so
|
|
6
|
-
* a new command appears in both or in neither. Deliberately plain text with no ANSI: its destination is a
|
|
7
|
-
* file, a prompt, or another program's context window.
|
|
8
|
-
*/
|
|
9
|
-
export function promptDoc(program, cliVersion) {
|
|
10
|
-
const lines = [];
|
|
11
|
-
lines.push(`# botanary CLI ${cliVersion} - operating manual for an automation`);
|
|
12
|
-
lines.push('');
|
|
13
|
-
lines.push('You are driving the `botanary` CLI non-interactively. Botanary never holds a signing key: the');
|
|
14
|
-
lines.push('CLI builds unsigned operations and either an on-chain mandate signs them locally or the human');
|
|
15
|
-
lines.push('owner approves them in a browser. Nothing you do here can sign as the owner.');
|
|
16
|
-
lines.push('');
|
|
17
|
-
lines.push('## Two lanes, never confuse them');
|
|
18
|
-
lines.push('');
|
|
19
|
-
lines.push('- OWNER lane (`login`, `balance`, `send`, ...): acts as the human account owner, using a session');
|
|
20
|
-
lines.push(' token stored on this machine. A `send` that no mandate covers needs the human in a browser.');
|
|
21
|
-
lines.push('- AGENT lane (`agent ...`): acts as this machine\'s own paired agent, spending unattended within');
|
|
22
|
-
lines.push(' whatever the owner granted it. `agent spend` refuses out-of-bounds amounts; `agent request`');
|
|
23
|
-
lines.push(' asks the owner instead.');
|
|
24
|
-
lines.push('');
|
|
25
|
-
lines.push('## Invocation rules');
|
|
26
|
-
lines.push('');
|
|
27
|
-
lines.push('- Always pass `--json`. Output is then a single compact JSON line on stdout (except `completion`,');
|
|
28
|
-
lines.push(' which prints a shell script regardless).');
|
|
29
|
-
lines.push('- Always pass `--yes` on a command that moves funds, or it exits 2 rather than prompting.');
|
|
30
|
-
lines.push('- Use `--dry-run` first on anything that moves funds: same checks, same review, nothing sent.');
|
|
31
|
-
lines.push('- `--chain-id` is required by money commands. Run `botanary chains --json` to learn valid ids.');
|
|
32
|
-
lines.push('- Never retry a `send` that returned exit 5. The operation is live; poll');
|
|
33
|
-
lines.push(' `botanary api /userops/<opId> --json` to check its status. A retry moves funds twice.');
|
|
34
|
-
lines.push('- Never retry an `agent spend` that returned exit 5 either; poll `botanary agent status');
|
|
35
|
-
lines.push(' <opId> --json` instead.');
|
|
36
|
-
lines.push('');
|
|
37
|
-
lines.push('## Failure contract');
|
|
38
|
-
lines.push('');
|
|
39
|
-
lines.push('On failure with `--json`, stdout carries a single JSON line. The error object always has');
|
|
40
|
-
lines.push('`code` and `message`. The `hint` field is optional and must not be assumed to exist.');
|
|
41
|
-
lines.push('Example:');
|
|
42
|
-
lines.push('');
|
|
43
|
-
lines.push(' {"ok":false,"error":{"code":"declined","message":"...","hint":"..."}}');
|
|
44
|
-
lines.push('');
|
|
45
|
-
lines.push('A successful command prints its payload bare, with no wrapper. Branch on the exit code first');
|
|
46
|
-
lines.push('and on `error.code` second. Never string-match a message.');
|
|
47
|
-
lines.push('');
|
|
48
|
-
lines.push('## Exit codes');
|
|
49
|
-
lines.push('');
|
|
50
|
-
for (const { code, meaning } of EXIT_CODES)
|
|
51
|
-
lines.push(`- exit ${code}: ${meaning}`);
|
|
52
|
-
lines.push('');
|
|
53
|
-
lines.push('## Commands');
|
|
54
|
-
lines.push('');
|
|
55
|
-
const visible = program.commands.filter((cmd) => !cmd.name().startsWith('help'));
|
|
56
|
-
for (const title of GROUP_ORDER) {
|
|
57
|
-
const groupCommands = visible.filter((cmd) => groupOf(cmd) === title);
|
|
58
|
-
if (!groupCommands.length)
|
|
59
|
-
continue;
|
|
60
|
-
lines.push(`### ${title}`);
|
|
61
|
-
lines.push('');
|
|
62
|
-
for (const cmd of groupCommands) {
|
|
63
|
-
const describe = (target) => {
|
|
64
|
-
const path = commandPath(target);
|
|
65
|
-
lines.push(`- \`botanary ${path}\` - ${target.description()}`);
|
|
66
|
-
const meta = COMMAND_HELP[path];
|
|
67
|
-
for (const example of meta?.examples ?? [])
|
|
68
|
-
lines.push(` ${example}`);
|
|
69
|
-
if (meta?.notes) {
|
|
70
|
-
for (const note of meta.notes.split('\n'))
|
|
71
|
-
lines.push(` note: ${note}`);
|
|
72
|
-
}
|
|
73
|
-
for (const sub of target.commands)
|
|
74
|
-
describe(sub);
|
|
75
|
-
};
|
|
76
|
-
describe(cmd);
|
|
77
|
-
}
|
|
78
|
-
lines.push('');
|
|
79
|
-
}
|
|
80
|
-
lines.push('## What still needs a human');
|
|
81
|
-
lines.push('');
|
|
82
|
-
lines.push('- `login`: the owner approves in a browser. The CLI prints the code and URL to stderr');
|
|
83
|
-
lines.push(' immediately (never silenced by `--json`); relay them to the human and wait.');
|
|
84
|
-
lines.push('- `send` without a covering mandate: the same, via an approval URL.');
|
|
85
|
-
lines.push('- Granting or widening a mandate: only ever in Botanary itself. `mandates suggest` proposes,');
|
|
86
|
-
lines.push(' it does not grant.');
|
|
87
|
-
lines.push('');
|
|
88
|
-
lines.push(`Docs: ${DOCS_URL}`);
|
|
89
|
-
lines.push('');
|
|
90
|
-
return lines.join('\n');
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=prompt-doc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-doc.js","sourceRoot":"","sources":["../../src/prompt-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
import { columns, dash, section, shortAddress } from './kv.js';
|
|
3
|
-
const HEADERS = ['', 'ID', 'LABEL', 'ADDRESS'];
|
|
4
|
-
export function accountRows(list, activeId) {
|
|
5
|
-
const accounts = Array.isArray(list) ? list : [];
|
|
6
|
-
return accounts
|
|
7
|
-
.filter((account) => account !== null && typeof account === 'object')
|
|
8
|
-
.map((account) => [
|
|
9
|
-
account.id && account.id === activeId ? '*' : '',
|
|
10
|
-
dash(account.id),
|
|
11
|
-
dash(account.label ?? account.name),
|
|
12
|
-
shortAddress(account.address),
|
|
13
|
-
]);
|
|
14
|
-
}
|
|
15
|
-
export function renderAccounts(list, activeId) {
|
|
16
|
-
const rows = accountRows(list, activeId);
|
|
17
|
-
if (!rows.length)
|
|
18
|
-
return `${section('Accounts')}\n${colors.muted(' No accounts on this login.')}`;
|
|
19
|
-
return `${section('Accounts')}\n${columns(HEADERS, rows)}\n${colors.dim(' * is the active account. Switch with `botanary accounts use <id>`.')}`;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=accounts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../src/render/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAS/D,MAAM,OAAO,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAE/C,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,QAAuB;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;SACpE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAChD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;QACnC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAa,EAAE,QAAuB;IACnE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC;IACnG,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,sEAAsE,CAAC,EAAE,CAAC;AACpJ,CAAC"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
import { amount, columns, dash, section, shortTime } from './kv.js';
|
|
3
|
-
const HEADERS = ['WHEN', 'WHAT', 'AMOUNT', 'CHAIN', 'STATUS'];
|
|
4
|
-
function statusCell(item) {
|
|
5
|
-
if (item.declineReason)
|
|
6
|
-
return colors.danger(`declined: ${item.declineReason}`);
|
|
7
|
-
if (item.status === 'executed')
|
|
8
|
-
return colors.success('executed');
|
|
9
|
-
if (item.status === 'pending')
|
|
10
|
-
return colors.warning('pending');
|
|
11
|
-
return dash(item.status);
|
|
12
|
-
}
|
|
13
|
-
export function activityRows(payload) {
|
|
14
|
-
const items = payload?.history?.items;
|
|
15
|
-
const list = Array.isArray(items) ? items : [];
|
|
16
|
-
return list
|
|
17
|
-
.filter((item) => item !== null && typeof item === 'object')
|
|
18
|
-
.map((item) => [
|
|
19
|
-
shortTime(item.timestamp),
|
|
20
|
-
dash(item.title),
|
|
21
|
-
item.amount?.value === undefined
|
|
22
|
-
? '-'
|
|
23
|
-
: `${amount(item.amount.value)} ${dash(item.amount.token?.symbol)}`.trim(),
|
|
24
|
-
dash(item.chain),
|
|
25
|
-
statusCell(item),
|
|
26
|
-
]);
|
|
27
|
-
}
|
|
28
|
-
export function renderActivity(payload) {
|
|
29
|
-
const rows = activityRows(payload);
|
|
30
|
-
if (!rows.length)
|
|
31
|
-
return `${section('Activity')}\n${colors.muted(' No activity yet.')}`;
|
|
32
|
-
return `${section('Activity')}\n${columns(HEADERS, rows)}`;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=activity.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/render/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAWpE,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAE9D,SAAS,UAAU,CAAC,IAAiB;IACnC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAChF,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,KAAK,GAAI,OAAyD,EAAE,OAAO,EAAE,KAAK,CAAC;IACzF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACb,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAChB,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS;YAC9B,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAC5E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC;KACjB,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC;IACzF,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
import { columns, dash, section, shortAddress, shortTime } from './kv.js';
|
|
3
|
-
const AGENT_HEADERS = ['NAME', 'ADDRESS', 'FINGERPRINT', 'CONNECTED'];
|
|
4
|
-
const REQUEST_HEADERS = ['ID', 'REASON', 'BOUND CROSSED', 'STATUS', 'EXPIRES'];
|
|
5
|
-
export function agentRows(payload) {
|
|
6
|
-
const agents = payload?.agents;
|
|
7
|
-
const list = Array.isArray(agents) ? agents : [];
|
|
8
|
-
return list
|
|
9
|
-
.filter((agent) => agent !== null && typeof agent === 'object')
|
|
10
|
-
.map((agent) => [
|
|
11
|
-
dash(agent.name),
|
|
12
|
-
shortAddress(agent.address),
|
|
13
|
-
dash(agent.fingerprint),
|
|
14
|
-
shortTime(agent.connectedAt),
|
|
15
|
-
]);
|
|
16
|
-
}
|
|
17
|
-
export function requestRows(payload) {
|
|
18
|
-
const requests = payload?.requests;
|
|
19
|
-
const list = Array.isArray(requests) ? requests : [];
|
|
20
|
-
return list
|
|
21
|
-
.filter((request) => request !== null && typeof request === 'object')
|
|
22
|
-
.map((request) => [
|
|
23
|
-
dash(request.id),
|
|
24
|
-
dash(request.reason),
|
|
25
|
-
dash(request.declineReason),
|
|
26
|
-
request.status === 'open' ? colors.warning('open') : dash(request.status),
|
|
27
|
-
shortTime(request.expiresAt),
|
|
28
|
-
]);
|
|
29
|
-
}
|
|
30
|
-
export function renderAgents(payload) {
|
|
31
|
-
const agents = agentRows(payload);
|
|
32
|
-
const requests = requestRows(payload);
|
|
33
|
-
const blocks = [section('Connected agents')];
|
|
34
|
-
blocks.push(agents.length
|
|
35
|
-
? columns(AGENT_HEADERS, agents)
|
|
36
|
-
: colors.muted(' No agents are connected to this account. `botanary agent pair` starts one.'));
|
|
37
|
-
blocks.push('');
|
|
38
|
-
blocks.push(section('Approval requests'));
|
|
39
|
-
blocks.push(requests.length ? columns(REQUEST_HEADERS, requests) : colors.muted(' Nothing waiting on you.'));
|
|
40
|
-
return blocks.join('\n');
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=agents.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/render/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAiB1E,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AACtE,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE/E,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,MAAM,MAAM,GAAI,OAA4C,EAAE,MAAM,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;SAC9D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAChB,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QACvB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,QAAQ,GAAI,OAA8C,EAAE,QAAQ,CAAC;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;SACpE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QAC3B,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACzE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAa,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,MAAM;QACX,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC;QAChC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,8EAA8E,CAAC,CACjG,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAC9G,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
import { amount, columns, dash, kv, money, section, shortAddress, shortTime } from './kv.js';
|
|
3
|
-
// Appended after VALUE, not inserted after ASSET: every other column's index stays stable for callers
|
|
4
|
-
// that read `rows[i]` by position, and the address is supporting detail, not the thing a person scans for.
|
|
5
|
-
const HEADERS = ['ASSET', 'CHAIN', 'AMOUNT', 'PRICE', 'VALUE', 'ADDRESS'];
|
|
6
|
-
function chainNameOf(assetRef, chains) {
|
|
7
|
-
if (typeof assetRef !== 'string')
|
|
8
|
-
return '-';
|
|
9
|
-
const chainRef = assetRef.split('/')[0];
|
|
10
|
-
const match = chains.find((c) => c.chainRef === chainRef);
|
|
11
|
-
// No guessing a name from a chainRef the backend did not describe: an unnamed chain is a hyphen.
|
|
12
|
-
return dash(match?.name);
|
|
13
|
-
}
|
|
14
|
-
/** The address segment of a CAIP-19 assetRef, e.g. `0x8335...` out of `eip155:8453/erc20:0x8335...`. A
|
|
15
|
-
* native coin (`slip44:60`) has no discrete contract address, so it renders as a hyphen rather than the
|
|
16
|
-
* slip44 index, which is not something anyone could paste into `--token`. */
|
|
17
|
-
function addressOf(assetRef) {
|
|
18
|
-
if (typeof assetRef !== 'string')
|
|
19
|
-
return '-';
|
|
20
|
-
const tail = assetRef.split('/')[1];
|
|
21
|
-
if (!tail)
|
|
22
|
-
return '-';
|
|
23
|
-
const [kind, value] = tail.split(':');
|
|
24
|
-
if (kind === 'slip44' || !value)
|
|
25
|
-
return '-';
|
|
26
|
-
return shortAddress(value);
|
|
27
|
-
}
|
|
28
|
-
export function balanceRows(payload, opts) {
|
|
29
|
-
const root = (payload ?? {});
|
|
30
|
-
const balance = root.balance ?? {};
|
|
31
|
-
const chains = Array.isArray(root.chains) ? root.chains : [];
|
|
32
|
-
const allHoldings = Array.isArray(balance.holdings)
|
|
33
|
-
? balance.holdings.filter((h) => h !== null && typeof h === 'object')
|
|
34
|
-
: [];
|
|
35
|
-
const shown = opts.verbose ? allHoldings : allHoldings.filter((h) => typeof h.amount === 'number' && h.amount !== 0);
|
|
36
|
-
const hiddenZeroCount = allHoldings.length - shown.length;
|
|
37
|
-
let sawAdvisory = false;
|
|
38
|
-
const rows = shown.map((holding) => {
|
|
39
|
-
const advisory = holding.priceAdvisory === true;
|
|
40
|
-
if (advisory)
|
|
41
|
-
sawAdvisory = true;
|
|
42
|
-
return [
|
|
43
|
-
dash(holding.symbol),
|
|
44
|
-
chainNameOf(holding.assetRef, chains),
|
|
45
|
-
amount(holding.amount),
|
|
46
|
-
`${money(holding.priceUsd)}${advisory ? '*' : ''}`,
|
|
47
|
-
money(holding.fiat),
|
|
48
|
-
addressOf(holding.assetRef),
|
|
49
|
-
];
|
|
50
|
-
});
|
|
51
|
-
const totals = [
|
|
52
|
-
['total', money(balance.totalFiat)],
|
|
53
|
-
['stablecoins', money(balance.stablecoinFiat)],
|
|
54
|
-
['24h change', Number.isFinite(balance.change24h) ? `${balance.change24h}%` : '-'],
|
|
55
|
-
['as of', shortTime(balance.asOf)],
|
|
56
|
-
];
|
|
57
|
-
const footnotes = [];
|
|
58
|
-
if (sawAdvisory)
|
|
59
|
-
footnotes.push('* price is advisory, not a settled quote.');
|
|
60
|
-
if (hiddenZeroCount > 0) {
|
|
61
|
-
footnotes.push(`${hiddenZeroCount} asset${hiddenZeroCount === 1 ? '' : 's'} with a zero balance hidden - pass --verbose to show.`);
|
|
62
|
-
}
|
|
63
|
-
// The backend's own sentence about how current these numbers are, verbatim. Never paraphrased: a stale
|
|
64
|
-
// balance presented as settled is the one thing this view must not do.
|
|
65
|
-
const note = root.freshness?.note;
|
|
66
|
-
if (typeof note === 'string' && note)
|
|
67
|
-
footnotes.push(note);
|
|
68
|
-
return { rows, hiddenZeroCount, totals, footnotes };
|
|
69
|
-
}
|
|
70
|
-
export function renderBalance(payload, opts) {
|
|
71
|
-
const { rows, totals, footnotes } = balanceRows(payload, opts);
|
|
72
|
-
const blocks = [];
|
|
73
|
-
blocks.push(section('Holdings'));
|
|
74
|
-
blocks.push(rows.length ? columns(HEADERS, rows) : colors.muted(' No holdings to show.'));
|
|
75
|
-
blocks.push('');
|
|
76
|
-
blocks.push(section('Totals'));
|
|
77
|
-
blocks.push(kv(totals));
|
|
78
|
-
if (footnotes.length) {
|
|
79
|
-
blocks.push('');
|
|
80
|
-
for (const note of footnotes)
|
|
81
|
-
blocks.push(colors.dim(` ${note}`));
|
|
82
|
-
}
|
|
83
|
-
return blocks.join('\n');
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=balance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/render/balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import figlet from 'figlet';
|
|
2
|
-
import gradient from 'gradient-string';
|
|
3
|
-
import { COSMIC_BANNER_STOPS, isColorEnabled } from './colors.js';
|
|
4
|
-
/** The reserved cosmic-gradient wordmark - shown once, on bare invocation and on --help, never on every
|
|
5
|
-
* line of output (cosmic is a reserved register in the FE too: it earns impact by contrast). Falls back
|
|
6
|
-
* to plain text when color is disabled or the terminal is narrower than the wordmark. The default reads
|
|
7
|
-
* the real current color state from colors.ts rather than hardcoding true, so setColorEnabled(false)
|
|
8
|
-
* (--no-color/NO_COLOR) actually takes effect on a bare renderBanner(text) call. */
|
|
9
|
-
export function renderBanner(text, colorEnabled = isColorEnabled()) {
|
|
10
|
-
const ascii = figlet.textSync(text, { font: 'ANSI Shadow' });
|
|
11
|
-
const widest = Math.max(...ascii.split('\n').map((l) => l.length));
|
|
12
|
-
const columns = process.stdout.columns ?? 80;
|
|
13
|
-
if (!colorEnabled || widest > columns)
|
|
14
|
-
return ascii;
|
|
15
|
-
return gradient(Array.from(COSMIC_BANNER_STOPS)).multiline(ascii);
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=banner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/render/banner.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE;;;;qFAIqF;AACrF,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,YAAY,GAAG,cAAc,EAAE;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,YAAY,IAAI,MAAM,GAAG,OAAO;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
import { columns, dash, section } from './kv.js';
|
|
3
|
-
const HEADERS = ['CHAIN', 'NAME', 'TIER', 'NET', 'GAS'];
|
|
4
|
-
/** What each tier actually permits, in the backend's own terms (GET /chains' `tier` enum). */
|
|
5
|
-
const TIER_MEANING = {
|
|
6
|
-
watch: 'read-only: no bundler, no authority',
|
|
7
|
-
basic: 'send, swap and manage; authority actions decline',
|
|
8
|
-
botanary: 'full on-chain authority, including mandates',
|
|
9
|
-
};
|
|
10
|
-
function tierCell(tier) {
|
|
11
|
-
if (tier === 'botanary')
|
|
12
|
-
return colors.success('botanary');
|
|
13
|
-
if (tier === 'basic')
|
|
14
|
-
return colors.info('basic');
|
|
15
|
-
if (tier === 'watch')
|
|
16
|
-
return colors.muted('watch');
|
|
17
|
-
return dash(tier);
|
|
18
|
-
}
|
|
19
|
-
export function chainRows(chains) {
|
|
20
|
-
const list = Array.isArray(chains) ? chains : [];
|
|
21
|
-
return list
|
|
22
|
-
.filter((chain) => chain !== null && typeof chain === 'object')
|
|
23
|
-
.map((chain) => [
|
|
24
|
-
// `key` not `chainId`: Solana and Stellar are key-keyed and carry a null chainId, so the key is the
|
|
25
|
-
// one identifier that addresses every chain family.
|
|
26
|
-
dash(chain.key),
|
|
27
|
-
dash(chain.name),
|
|
28
|
-
tierCell(chain.tier),
|
|
29
|
-
chain.testnet === true ? 'testnet' : chain.testnet === false ? 'mainnet' : '-',
|
|
30
|
-
Array.isArray(chain.gasTokens) && chain.gasTokens.length ? chain.gasTokens.join(', ') : '-',
|
|
31
|
-
]);
|
|
32
|
-
}
|
|
33
|
-
export function renderChains(chains) {
|
|
34
|
-
const rows = chainRows(chains);
|
|
35
|
-
if (!rows.length)
|
|
36
|
-
return `${section('Chains')}\n${colors.muted(' No chains reported.')}`;
|
|
37
|
-
const tiers = new Set((Array.isArray(chains) ? chains : [])
|
|
38
|
-
.filter((c) => c !== null && typeof c === 'object')
|
|
39
|
-
.map((c) => c.tier));
|
|
40
|
-
const legend = Object.entries(TIER_MEANING)
|
|
41
|
-
.filter(([tier]) => tiers.has(tier))
|
|
42
|
-
.map(([tier, meaning]) => colors.dim(` ${tier.padEnd(9)} ${meaning}`));
|
|
43
|
-
return [
|
|
44
|
-
section('Chains'),
|
|
45
|
-
columns(HEADERS, rows),
|
|
46
|
-
'',
|
|
47
|
-
section('Tiers'),
|
|
48
|
-
...legend,
|
|
49
|
-
colors.dim(' Pass CHAIN to --chain-id (EVM) or --chain (any family).'),
|
|
50
|
-
].join('\n');
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=chains.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/render/chains.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import pc from 'picocolors';
|
|
2
|
-
// Botanary's real design tokens, not invented here:
|
|
3
|
-
// botanary-fe/src/ui/styles/tokens/gradients.css -> --gradient-cosmic
|
|
4
|
-
// botanary-fe/src/ui/styles/tokens/dark.css -> [data-theme="dark"]
|
|
5
|
-
// Cosmic is reserved for the banner moment only (see banner.ts). Everyday status output uses the
|
|
6
|
-
// dark-theme's charcoal-tuned semantic colors. Brand rule: never purple.
|
|
7
|
-
export const COSMIC_BANNER_STOPS = ['#0f7a5a', '#1fbfa0', '#b1f0bb'];
|
|
8
|
-
const DARK_TOKENS = {
|
|
9
|
-
brand: '#7cbf95',
|
|
10
|
-
brandStrong: '#a6dcb8',
|
|
11
|
-
success: '#7cbf95',
|
|
12
|
-
warning: '#e6ac52',
|
|
13
|
-
danger: '#e8695f',
|
|
14
|
-
info: '#7fe0cf',
|
|
15
|
-
muted: '#6f7f74',
|
|
16
|
-
};
|
|
17
|
-
let colorEnabled = pc.isColorSupported;
|
|
18
|
-
/** Called once from cli.ts when --no-color is passed or NO_COLOR is set, overriding auto-detection. */
|
|
19
|
-
export function setColorEnabled(enabled) {
|
|
20
|
-
colorEnabled = enabled;
|
|
21
|
-
}
|
|
22
|
-
export function isColorEnabled() {
|
|
23
|
-
return colorEnabled;
|
|
24
|
-
}
|
|
25
|
-
function hex(hexColor, text) {
|
|
26
|
-
if (!colorEnabled)
|
|
27
|
-
return text;
|
|
28
|
-
const r = parseInt(hexColor.slice(1, 3), 16);
|
|
29
|
-
const g = parseInt(hexColor.slice(3, 5), 16);
|
|
30
|
-
const b = parseInt(hexColor.slice(5, 7), 16);
|
|
31
|
-
return `\x1b[38;2;${r};${g};${b}m${text}\x1b[39m`;
|
|
32
|
-
}
|
|
33
|
-
export const colors = {
|
|
34
|
-
brand: (s) => hex(DARK_TOKENS.brand, s),
|
|
35
|
-
brandStrong: (s) => hex(DARK_TOKENS.brandStrong, s),
|
|
36
|
-
success: (s) => hex(DARK_TOKENS.success, s),
|
|
37
|
-
warning: (s) => hex(DARK_TOKENS.warning, s),
|
|
38
|
-
danger: (s) => hex(DARK_TOKENS.danger, s),
|
|
39
|
-
info: (s) => hex(DARK_TOKENS.info, s),
|
|
40
|
-
muted: (s) => hex(DARK_TOKENS.muted, s),
|
|
41
|
-
bold: (s) => (colorEnabled ? pc.bold(s) : s),
|
|
42
|
-
dim: (s) => (colorEnabled ? pc.dim(s) : s),
|
|
43
|
-
};
|
|
44
|
-
export const glyphs = {
|
|
45
|
-
success: (s) => `${colors.success('✔')} ${s}`,
|
|
46
|
-
warning: (s) => `${colors.warning('⚠')} ${s}`,
|
|
47
|
-
danger: (s) => `${colors.danger('✖')} ${s}`,
|
|
48
|
-
info: (s) => `${colors.info('ℹ')} ${s}`,
|
|
49
|
-
};
|
|
50
|
-
//# sourceMappingURL=colors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../../src/render/colors.ts"],"names":[],"mappings":"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"}
|
package/dist/src/render/gas.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
import { amount, columns, dash, section } from './kv.js';
|
|
3
|
-
const HEADERS = ['METHOD', 'LABEL', 'BALANCE', 'DEFAULT', 'NOTE'];
|
|
4
|
-
export function gasRows(methods) {
|
|
5
|
-
const list = Array.isArray(methods) ? methods : [];
|
|
6
|
-
return list
|
|
7
|
-
.filter((method) => method !== null && typeof method === 'object')
|
|
8
|
-
.map((method) => [
|
|
9
|
-
dash(method.method),
|
|
10
|
-
dash(method.label),
|
|
11
|
-
method.balance === null || method.balance === undefined
|
|
12
|
-
? '-'
|
|
13
|
-
: `${amount(method.balance)} ${dash(method.token?.symbol)}`.trim(),
|
|
14
|
-
method.isDefault ? '*' : '',
|
|
15
|
-
dash(method.note),
|
|
16
|
-
]);
|
|
17
|
-
}
|
|
18
|
-
export function renderGas(methods, chainLabel) {
|
|
19
|
-
const rows = gasRows(methods);
|
|
20
|
-
if (!rows.length) {
|
|
21
|
-
return [
|
|
22
|
-
section('Gas'),
|
|
23
|
-
colors.warning(` No gas method is available for this account on ${chainLabel}.`),
|
|
24
|
-
colors.dim(' This is the usual cause of a relay that cannot pay for itself. Fund the account, or'),
|
|
25
|
-
colors.dim(' try a chain whose gas you can already pay - see `botanary chains`.'),
|
|
26
|
-
].join('\n');
|
|
27
|
-
}
|
|
28
|
-
return [
|
|
29
|
-
section(`Gas on ${chainLabel}`),
|
|
30
|
-
columns(HEADERS, rows),
|
|
31
|
-
colors.dim(' Every method listed is available: the backend filters out the rest. * is the default.'),
|
|
32
|
-
].join('\n');
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=gas.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../src/render/gas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAWzD,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAElE,MAAM,UAAU,OAAO,CAAC,OAAgB;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC;SACjE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAClB,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YACrD,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QACpE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;KAClB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,UAAkB;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACL,OAAO,CAAC,KAAK,CAAC;YACd,MAAM,CAAC,OAAO,CAAC,oDAAoD,UAAU,GAAG,CAAC;YACjF,MAAM,CAAC,GAAG,CAAC,uFAAuF,CAAC;YACnG,MAAM,CAAC,GAAG,CAAC,sEAAsE,CAAC;SACnF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO;QACL,OAAO,CAAC,UAAU,UAAU,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,yFAAyF,CAAC;KACtG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/dist/src/render/grant.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
import { amount, columns, dash, section, shortTime } from './kv.js';
|
|
3
|
-
const HEADERS = ['TOKEN', 'LIMIT', 'SPENT', 'REMAINING', 'RESETS'];
|
|
4
|
-
/**
|
|
5
|
-
* `description` is `describeGrant()`'s output from botanary-mcp, printed verbatim - the CLI does not
|
|
6
|
-
* re-author what a grant allows. The meters below are the same fact in numbers, for scanning.
|
|
7
|
-
*/
|
|
8
|
-
export function renderGrant(self, description) {
|
|
9
|
-
const grant = self?.grant;
|
|
10
|
-
const blocks = [section('Grant'), ...description.split('\n').map((line) => (line ? ` ${line}` : ''))];
|
|
11
|
-
if (!grant)
|
|
12
|
-
return blocks.join('\n');
|
|
13
|
-
blocks.push('');
|
|
14
|
-
blocks.push(section('Status'));
|
|
15
|
-
blocks.push(` ${dash(grant.status)} on ${dash(grant.chain)}`);
|
|
16
|
-
const meters = Array.isArray(grant.spentToDate)
|
|
17
|
-
? grant.spentToDate.filter((m) => m !== null && typeof m === 'object')
|
|
18
|
-
: [];
|
|
19
|
-
if (meters.length) {
|
|
20
|
-
blocks.push('');
|
|
21
|
-
blocks.push(section('Budgets'));
|
|
22
|
-
blocks.push(columns(HEADERS, meters.map((meter) => [
|
|
23
|
-
dash(meter.token?.symbol),
|
|
24
|
-
amount(meter.limit),
|
|
25
|
-
amount(meter.spent),
|
|
26
|
-
amount(meter.remaining),
|
|
27
|
-
meter.expiresAt ? shortTime(meter.expiresAt) : '-',
|
|
28
|
-
])));
|
|
29
|
-
}
|
|
30
|
-
blocks.push('');
|
|
31
|
-
blocks.push(colors.dim(' A convenience read. The chain enforces the real bound regardless of what this says.'));
|
|
32
|
-
return blocks.join('\n');
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=grant.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grant.js","sourceRoot":"","sources":["../../../src/render/grant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAUpE,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,WAAmB;IAC5D,MAAM,KAAK,GAAI,IAAkG,EAAE,KAAK,CAAC;IACzH,MAAM,MAAM,GAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjH,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAC7C,CAAC,CAAE,KAAK,CAAC,WAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;QACnF,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CACT,OAAO,CACL,OAAO,EACP,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YACvB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;SACnD,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC,CAAC;IACjH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/src/render/kv.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { colors } from './colors.js';
|
|
2
|
-
const ANSI = /\x1b\[[0-9;]*m/g;
|
|
3
|
-
/** Width as a terminal sees it: color escapes take no columns. */
|
|
4
|
-
export function visibleWidth(text) {
|
|
5
|
-
return text.replace(ANSI, '').length;
|
|
6
|
-
}
|
|
7
|
-
export function section(title) {
|
|
8
|
-
return colors.brand(colors.bold(`◆ ${title}`));
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* A borderless, aligned column block. Hand-rolled rather than cli-table3 so alignment measures VISIBLE
|
|
12
|
-
* width - a colored cell (a chain tier, a declined status) is otherwise padded by its escape bytes and
|
|
13
|
-
* the column drifts.
|
|
14
|
-
*/
|
|
15
|
-
export function columns(headers, rows) {
|
|
16
|
-
const widths = headers.map((header, i) => Math.max(visibleWidth(header), ...rows.map((row) => visibleWidth(row[i] ?? ''))));
|
|
17
|
-
const line = (cells) => cells
|
|
18
|
-
.map((cell, i) => cell + ' '.repeat(Math.max(0, widths[i] - visibleWidth(cell))))
|
|
19
|
-
.join(' ')
|
|
20
|
-
.trimEnd();
|
|
21
|
-
return [colors.dim(line(headers)), ...rows.map((row) => line(row))].join('\n');
|
|
22
|
-
}
|
|
23
|
-
/** Aligned two-column key/value block, for a summary rather than a list. */
|
|
24
|
-
export function kv(rows) {
|
|
25
|
-
const width = Math.max(0, ...rows.map(([key]) => visibleWidth(key)));
|
|
26
|
-
return rows
|
|
27
|
-
.map(([key, value]) => ` ${key}${' '.repeat(width - visibleWidth(key))} ${value}`.trimEnd())
|
|
28
|
-
.join('\n');
|
|
29
|
-
}
|
|
30
|
-
/** An absent value is a hyphen. Never a zero, never an empty string, never a guess. */
|
|
31
|
-
export function dash(value) {
|
|
32
|
-
if (value === null || value === undefined || value === '')
|
|
33
|
-
return '-';
|
|
34
|
-
return String(value);
|
|
35
|
-
}
|
|
36
|
-
export function money(value) {
|
|
37
|
-
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
38
|
-
return '-';
|
|
39
|
-
return `$${value.toFixed(2)}`;
|
|
40
|
-
}
|
|
41
|
-
/** Up to five decimal places, trailing zeros trimmed - token amounts are not currency. */
|
|
42
|
-
export function amount(value) {
|
|
43
|
-
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
44
|
-
return '-';
|
|
45
|
-
return String(Number(value.toFixed(5)));
|
|
46
|
-
}
|
|
47
|
-
export function shortAddress(value) {
|
|
48
|
-
if (typeof value !== 'string' || value.length < 14)
|
|
49
|
-
return dash(value);
|
|
50
|
-
return `${value.slice(0, 8)}..${value.slice(-6)}`;
|
|
51
|
-
}
|
|
52
|
-
export function shortTime(value) {
|
|
53
|
-
if (typeof value !== 'string')
|
|
54
|
-
return '-';
|
|
55
|
-
const date = new Date(value);
|
|
56
|
-
if (Number.isNaN(date.getTime()))
|
|
57
|
-
return '-';
|
|
58
|
-
return date.toISOString().replace('T', ' ').slice(0, 16);
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=kv.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kv.js","sourceRoot":"","sources":["../../../src/render/kv.ts"],"names":[],"mappings":"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"}
|