botanary 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -9
- package/dist/bin/botanary.js +13 -3
- package/dist/bin/botanary.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/src/app-url.js +32 -0
- package/dist/src/app-url.js.map +1 -0
- package/dist/src/cli.js +113 -23
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/agent.js +190 -49
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/mcp.js +136 -5
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/system.js +109 -12
- package/dist/src/commands/system.js.map +1 -1
- package/dist/src/commands/utilities.js +44 -0
- package/dist/src/commands/utilities.js.map +1 -0
- package/dist/src/commands/wallet.js +332 -94
- package/dist/src/commands/wallet.js.map +1 -1
- package/dist/src/completion.js +69 -0
- package/dist/src/completion.js.map +1 -0
- package/dist/src/config-store.js +52 -0
- package/dist/src/config-store.js.map +1 -0
- package/dist/src/context.js +14 -4
- package/dist/src/context.js.map +1 -1
- package/dist/src/errors.js +116 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/help/examples.js +357 -0
- package/dist/src/help/examples.js.map +1 -0
- package/dist/src/help/format.js +144 -0
- package/dist/src/help/format.js.map +1 -0
- package/dist/src/help/groups.js +39 -0
- package/dist/src/help/groups.js.map +1 -0
- package/dist/src/mcp-snippets.js +6 -0
- package/dist/src/mcp-snippets.js.map +1 -1
- package/dist/src/outcome.js +63 -0
- package/dist/src/outcome.js.map +1 -0
- package/dist/src/parser.js +18 -39
- package/dist/src/parser.js.map +1 -1
- package/dist/src/progress.js +37 -0
- package/dist/src/progress.js.map +1 -0
- package/dist/src/prompt-doc.js +92 -0
- package/dist/src/prompt-doc.js.map +1 -0
- package/dist/src/render/accounts.js +21 -0
- package/dist/src/render/accounts.js.map +1 -0
- package/dist/src/render/activity.js +34 -0
- package/dist/src/render/activity.js.map +1 -0
- package/dist/src/render/agents.js +42 -0
- package/dist/src/render/agents.js.map +1 -0
- package/dist/src/render/balance.js +68 -0
- package/dist/src/render/balance.js.map +1 -0
- package/dist/src/render/chains.js +52 -0
- package/dist/src/render/chains.js.map +1 -0
- package/dist/src/render/gas.js +34 -0
- package/dist/src/render/gas.js.map +1 -0
- package/dist/src/render/grant.js +34 -0
- package/dist/src/render/grant.js.map +1 -0
- package/dist/src/render/kv.js +60 -0
- package/dist/src/render/kv.js.map +1 -0
- package/dist/src/render/mandates.js +111 -0
- package/dist/src/render/mandates.js.map +1 -0
- package/dist/src/render/print.js +18 -0
- package/dist/src/render/print.js.map +1 -0
- package/dist/src/repl.js +114 -10
- package/dist/src/repl.js.map +1 -1
- package/dist/src/review.js +52 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/settings.js +88 -0
- package/dist/src/settings.js.map +1 -0
- package/dist/src/update-check.js +85 -0
- package/dist/src/update-check.js.map +1 -0
- package/dist/src/validate.js +92 -0
- package/dist/src/validate.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,42 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { colors } from './colors.js';
|
|
2
|
+
import { amount, columns, dash, kv, money, section, shortTime } from './kv.js';
|
|
3
|
+
const HEADERS = ['ASSET', 'CHAIN', 'AMOUNT', 'PRICE', 'VALUE'];
|
|
4
|
+
function chainNameOf(assetRef, chains) {
|
|
5
|
+
if (typeof assetRef !== 'string')
|
|
6
|
+
return '-';
|
|
7
|
+
const chainRef = assetRef.split('/')[0];
|
|
8
|
+
const match = chains.find((c) => c.chainRef === chainRef);
|
|
9
|
+
// No guessing a name from a chainRef the backend did not describe: an unnamed chain is a hyphen.
|
|
10
|
+
return dash(match?.name);
|
|
11
|
+
}
|
|
12
|
+
export function balanceRows(payload, opts) {
|
|
13
|
+
const root = (payload ?? {});
|
|
14
|
+
const balance = root.balance ?? {};
|
|
15
|
+
const chains = Array.isArray(root.chains) ? root.chains : [];
|
|
16
|
+
const allHoldings = Array.isArray(balance.holdings)
|
|
17
|
+
? balance.holdings.filter((h) => h !== null && typeof h === 'object')
|
|
18
|
+
: [];
|
|
19
|
+
const shown = opts.verbose ? allHoldings : allHoldings.filter((h) => typeof h.amount === 'number' && h.amount !== 0);
|
|
20
|
+
const hiddenZeroCount = allHoldings.length - shown.length;
|
|
21
|
+
let sawAdvisory = false;
|
|
22
|
+
const rows = shown.map((holding) => {
|
|
23
|
+
const advisory = holding.priceAdvisory === true;
|
|
24
|
+
if (advisory)
|
|
25
|
+
sawAdvisory = true;
|
|
26
|
+
return [
|
|
27
|
+
dash(holding.symbol),
|
|
28
|
+
chainNameOf(holding.assetRef, chains),
|
|
29
|
+
amount(holding.amount),
|
|
30
|
+
`${money(holding.priceUsd)}${advisory ? '*' : ''}`,
|
|
31
|
+
money(holding.fiat),
|
|
32
|
+
];
|
|
33
|
+
});
|
|
34
|
+
const totals = [
|
|
35
|
+
['total', money(balance.totalFiat)],
|
|
36
|
+
['stablecoins', money(balance.stablecoinFiat)],
|
|
37
|
+
['24h change', Number.isFinite(balance.change24h) ? `${balance.change24h}%` : '-'],
|
|
38
|
+
['as of', shortTime(balance.asOf)],
|
|
39
|
+
];
|
|
40
|
+
const footnotes = [];
|
|
41
|
+
if (sawAdvisory)
|
|
42
|
+
footnotes.push('* price is advisory, not a settled quote.');
|
|
43
|
+
if (hiddenZeroCount > 0) {
|
|
44
|
+
footnotes.push(`${hiddenZeroCount} asset${hiddenZeroCount === 1 ? '' : 's'} with a zero balance hidden - pass --verbose to show.`);
|
|
45
|
+
}
|
|
46
|
+
// The backend's own sentence about how current these numbers are, verbatim. Never paraphrased: a stale
|
|
47
|
+
// balance presented as settled is the one thing this view must not do.
|
|
48
|
+
const note = root.freshness?.note;
|
|
49
|
+
if (typeof note === 'string' && note)
|
|
50
|
+
footnotes.push(note);
|
|
51
|
+
return { rows, hiddenZeroCount, totals, footnotes };
|
|
52
|
+
}
|
|
53
|
+
export function renderBalance(payload, opts) {
|
|
54
|
+
const { rows, totals, footnotes } = balanceRows(payload, opts);
|
|
55
|
+
const blocks = [];
|
|
56
|
+
blocks.push(section('Holdings'));
|
|
57
|
+
blocks.push(rows.length ? columns(HEADERS, rows) : colors.muted(' No holdings to show.'));
|
|
58
|
+
blocks.push('');
|
|
59
|
+
blocks.push(section('Totals'));
|
|
60
|
+
blocks.push(kv(totals));
|
|
61
|
+
if (footnotes.length) {
|
|
62
|
+
blocks.push('');
|
|
63
|
+
for (const note of footnotes)
|
|
64
|
+
blocks.push(colors.dim(` ${note}`));
|
|
65
|
+
}
|
|
66
|
+
return blocks.join('\n');
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/render/balance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/render/chains.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv.js","sourceRoot":"","sources":["../../../src/render/kv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { colors } from './colors.js';
|
|
2
|
+
import { amount, columns, dash, section, shortTime } from './kv.js';
|
|
3
|
+
const DELEGATION_HEADERS = ['ID', 'STATUS', 'CHAIN', 'WHAT IT ALLOWS', 'BUDGET USED', 'EXPIRES'];
|
|
4
|
+
const MANDATE_HEADERS = ['ID', 'AGENT ADDRESS', 'CHAIN', 'POLICY', 'STATUS', 'CREATED'];
|
|
5
|
+
/** The caveat the design spec requires stated inline, matching the workspace CLAUDE.md's live caveat. */
|
|
6
|
+
const CAVEAT = 'Mandates are testnet-only and pre-mainnet. Nothing here is enforced on mainnet yet.';
|
|
7
|
+
/** The caveat about owner-lane rules not being enforced on-chain today. */
|
|
8
|
+
const OWNER_RULES_CAVEAT = 'Owner-lane rules are not enforced on-chain on accounts created since 2026-07-30. They remain available for future use.';
|
|
9
|
+
function statusCell(status) {
|
|
10
|
+
if (status === 'active')
|
|
11
|
+
return colors.success('active');
|
|
12
|
+
if (status === 'revoked' || status === 'expired' || status === 'paused')
|
|
13
|
+
return colors.muted(String(status));
|
|
14
|
+
return dash(status);
|
|
15
|
+
}
|
|
16
|
+
function budgetCell(meters) {
|
|
17
|
+
if (!Array.isArray(meters) || !meters.length)
|
|
18
|
+
return '-';
|
|
19
|
+
return meters
|
|
20
|
+
.map((meter) => `${amount(meter.spent)}/${amount(meter.limit)} ${dash(meter.token?.symbol)}`)
|
|
21
|
+
.join(', ');
|
|
22
|
+
}
|
|
23
|
+
export function mandateRows(payload) {
|
|
24
|
+
const delegations = payload?.delegations;
|
|
25
|
+
const list = Array.isArray(delegations) ? delegations : [];
|
|
26
|
+
return list
|
|
27
|
+
.filter((delegation) => delegation !== null && typeof delegation === 'object')
|
|
28
|
+
.map((delegation) => [
|
|
29
|
+
dash(delegation.id),
|
|
30
|
+
statusCell(delegation.status),
|
|
31
|
+
dash(delegation.chain),
|
|
32
|
+
// The backend's own sentence, never re-authored: it is the only description of the bound that cannot
|
|
33
|
+
// drift into overstating what is actually enforced.
|
|
34
|
+
dash(delegation.humanSummary),
|
|
35
|
+
budgetCell(delegation.spentToDate),
|
|
36
|
+
delegation.policySet?.expiresAt ? shortTime(delegation.policySet.expiresAt) : '-',
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
export function onchainMandateRows(mandates) {
|
|
40
|
+
const list = Array.isArray(mandates) ? mandates : [];
|
|
41
|
+
return list
|
|
42
|
+
.filter((mandate) => mandate !== null && typeof mandate === 'object')
|
|
43
|
+
.map((mandate) => [
|
|
44
|
+
dash(mandate.id),
|
|
45
|
+
dash(mandate.delegateeAddress),
|
|
46
|
+
dash(mandate.chainId),
|
|
47
|
+
dash(mandate.policySummary),
|
|
48
|
+
statusCell(mandate.status),
|
|
49
|
+
mandate.createdAt ? shortTime(mandate.createdAt) : '-',
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
export function renderMandates(payload) {
|
|
53
|
+
const delegationRows = mandateRows(payload);
|
|
54
|
+
const mandatesData = payload?.mandates;
|
|
55
|
+
const mandateList = Array.isArray(mandatesData?.mandates) ? mandatesData.mandates : [];
|
|
56
|
+
const mandateRowsList = onchainMandateRows(mandateList);
|
|
57
|
+
const accountRules = mandatesData?.rules;
|
|
58
|
+
const rulesSummary = accountRules?.summary;
|
|
59
|
+
const blocks = [colors.warning(`⚠ ${CAVEAT}`)];
|
|
60
|
+
// Delegations section
|
|
61
|
+
blocks.push('');
|
|
62
|
+
blocks.push(section('Delegations (Smart Sessions)'));
|
|
63
|
+
if (delegationRows.length) {
|
|
64
|
+
blocks.push(columns(DELEGATION_HEADERS, delegationRows));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
blocks.push(colors.muted(' No delegations on this account.'));
|
|
68
|
+
}
|
|
69
|
+
// On-chain mandates section
|
|
70
|
+
blocks.push('');
|
|
71
|
+
blocks.push(section('Mandates (on-chain)'));
|
|
72
|
+
if (mandateRowsList.length) {
|
|
73
|
+
blocks.push(columns(MANDATE_HEADERS, mandateRowsList));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
blocks.push(colors.muted(' No mandates on this account.'));
|
|
77
|
+
}
|
|
78
|
+
// Rules summary section - only if summary exists and has meaningful (non-zero) content
|
|
79
|
+
if (rulesSummary) {
|
|
80
|
+
const rulesRows = [];
|
|
81
|
+
if (typeof rulesSummary.weeklyLimit === 'number' && rulesSummary.weeklyLimit > 0) {
|
|
82
|
+
rulesRows.push(['Weekly limit', `${amount(rulesSummary.weeklyLimit)}`]);
|
|
83
|
+
}
|
|
84
|
+
if (typeof rulesSummary.weeklySpent === 'number' && rulesSummary.weeklySpent > 0) {
|
|
85
|
+
rulesRows.push(['Weekly spent', `${amount(rulesSummary.weeklySpent)}`]);
|
|
86
|
+
}
|
|
87
|
+
if (typeof rulesSummary.allowContracts === 'number' && rulesSummary.allowContracts > 0) {
|
|
88
|
+
rulesRows.push(['Allowed contracts', String(rulesSummary.allowContracts)]);
|
|
89
|
+
}
|
|
90
|
+
if (typeof rulesSummary.denyContracts === 'number' && rulesSummary.denyContracts > 0) {
|
|
91
|
+
rulesRows.push(['Denied contracts', String(rulesSummary.denyContracts)]);
|
|
92
|
+
}
|
|
93
|
+
if (typeof rulesSummary.allowRecipients === 'number' && rulesSummary.allowRecipients > 0) {
|
|
94
|
+
rulesRows.push(['Allowed recipients', String(rulesSummary.allowRecipients)]);
|
|
95
|
+
}
|
|
96
|
+
if (rulesRows.length) {
|
|
97
|
+
blocks.push('');
|
|
98
|
+
blocks.push(section('Owner rules (policy caps)'));
|
|
99
|
+
blocks.push(rulesRows.map(([k, v]) => ` ${k.padEnd(20)} ${v}`).join('\n'));
|
|
100
|
+
blocks.push(colors.dim(` ${OWNER_RULES_CAVEAT}`));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Empty state message when truly nothing is granted (no delegations, mandates, or rules)
|
|
104
|
+
if (!delegationRows.length && !mandateRowsList.length && !rulesSummary) {
|
|
105
|
+
blocks.push('');
|
|
106
|
+
blocks.push(colors.muted(' Nothing granted to the agent lane on this account.'));
|
|
107
|
+
blocks.push(colors.dim(' `botanary mandates suggest` proposes a starting point.'));
|
|
108
|
+
}
|
|
109
|
+
return blocks.join('\n');
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=mandates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mandates.js","sourceRoot":"","sources":["../../../src/render/mandates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One printer, three modes. `--json` is the machine contract and wins over everything (including the
|
|
3
|
+
* implicit --json a pipe brings). `--raw` is the human escape hatch that keeps 0.1.0's pretty-JSON dump
|
|
4
|
+
* reachable. Otherwise the view renderer runs - which is the whole point: 0.1.0 printed ~40 KB of JSON to
|
|
5
|
+
* a terminal for `balance`.
|
|
6
|
+
*/
|
|
7
|
+
export function printResult(ctx, data, render) {
|
|
8
|
+
if (ctx.json) {
|
|
9
|
+
console.log(JSON.stringify(data));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (ctx.raw || !render) {
|
|
13
|
+
console.log(typeof data === 'string' ? data : JSON.stringify(data, null, 2));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
console.log(render(data));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=print.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print.js","sourceRoot":"","sources":["../../../src/render/print.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAAe,EAAE,IAAa,EAAE,MAAkC;IAC5F,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC"}
|