agentaos 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/LICENSE +199 -0
- package/README.md +249 -0
- package/dist/cli/commands/admin.command.d.ts +3 -0
- package/dist/cli/commands/admin.command.d.ts.map +1 -0
- package/dist/cli/commands/admin.command.js +415 -0
- package/dist/cli/commands/admin.command.js.map +1 -0
- package/dist/cli/commands/balance.command.d.ts +3 -0
- package/dist/cli/commands/balance.command.d.ts.map +1 -0
- package/dist/cli/commands/balance.command.js +65 -0
- package/dist/cli/commands/balance.command.js.map +1 -0
- package/dist/cli/commands/deploy.command.d.ts +3 -0
- package/dist/cli/commands/deploy.command.d.ts.map +1 -0
- package/dist/cli/commands/deploy.command.js +101 -0
- package/dist/cli/commands/deploy.command.js.map +1 -0
- package/dist/cli/commands/info.command.d.ts +3 -0
- package/dist/cli/commands/info.command.d.ts.map +1 -0
- package/dist/cli/commands/info.command.js +30 -0
- package/dist/cli/commands/info.command.js.map +1 -0
- package/dist/cli/commands/init.command.d.ts +3 -0
- package/dist/cli/commands/init.command.d.ts.map +1 -0
- package/dist/cli/commands/init.command.js +364 -0
- package/dist/cli/commands/init.command.js.map +1 -0
- package/dist/cli/commands/link.command.d.ts +3 -0
- package/dist/cli/commands/link.command.d.ts.map +1 -0
- package/dist/cli/commands/link.command.js +111 -0
- package/dist/cli/commands/link.command.js.map +1 -0
- package/dist/cli/commands/login.command.d.ts +4 -0
- package/dist/cli/commands/login.command.d.ts.map +1 -0
- package/dist/cli/commands/login.command.js +149 -0
- package/dist/cli/commands/login.command.js.map +1 -0
- package/dist/cli/commands/network.command.d.ts +3 -0
- package/dist/cli/commands/network.command.d.ts.map +1 -0
- package/dist/cli/commands/network.command.js +206 -0
- package/dist/cli/commands/network.command.js.map +1 -0
- package/dist/cli/commands/proxy.command.d.ts +3 -0
- package/dist/cli/commands/proxy.command.d.ts.map +1 -0
- package/dist/cli/commands/proxy.command.js +248 -0
- package/dist/cli/commands/proxy.command.js.map +1 -0
- package/dist/cli/commands/receive.command.d.ts +3 -0
- package/dist/cli/commands/receive.command.d.ts.map +1 -0
- package/dist/cli/commands/receive.command.js +360 -0
- package/dist/cli/commands/receive.command.js.map +1 -0
- package/dist/cli/commands/send.command.d.ts +3 -0
- package/dist/cli/commands/send.command.d.ts.map +1 -0
- package/dist/cli/commands/send.command.js +83 -0
- package/dist/cli/commands/send.command.js.map +1 -0
- package/dist/cli/commands/sign.command.d.ts +3 -0
- package/dist/cli/commands/sign.command.d.ts.map +1 -0
- package/dist/cli/commands/sign.command.js +53 -0
- package/dist/cli/commands/sign.command.js.map +1 -0
- package/dist/cli/commands/status.command.d.ts +3 -0
- package/dist/cli/commands/status.command.d.ts.map +1 -0
- package/dist/cli/commands/status.command.js +109 -0
- package/dist/cli/commands/status.command.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/theme.d.ts +35 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +96 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts +2 -0
- package/dist/lib/__tests__/transfer-crypto.test.d.ts.map +1 -0
- package/dist/lib/__tests__/transfer-crypto.test.js +151 -0
- package/dist/lib/__tests__/transfer-crypto.test.js.map +1 -0
- package/dist/lib/authenticated-fetch.d.ts +6 -0
- package/dist/lib/authenticated-fetch.d.ts.map +1 -0
- package/dist/lib/authenticated-fetch.js +74 -0
- package/dist/lib/authenticated-fetch.js.map +1 -0
- package/dist/lib/config.d.ts +42 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +163 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/erc20-abi.d.ts +43 -0
- package/dist/lib/erc20-abi.d.ts.map +1 -0
- package/dist/lib/erc20-abi.js +34 -0
- package/dist/lib/erc20-abi.js.map +1 -0
- package/dist/lib/errors.d.ts +12 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +23 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/keychain.d.ts +11 -0
- package/dist/lib/keychain.d.ts.map +1 -0
- package/dist/lib/keychain.js +216 -0
- package/dist/lib/keychain.js.map +1 -0
- package/dist/lib/policy-conversions.d.ts +19 -0
- package/dist/lib/policy-conversions.d.ts.map +1 -0
- package/dist/lib/policy-conversions.js +62 -0
- package/dist/lib/policy-conversions.js.map +1 -0
- package/dist/lib/signer-manager.d.ts +17 -0
- package/dist/lib/signer-manager.d.ts.map +1 -0
- package/dist/lib/signer-manager.js +80 -0
- package/dist/lib/signer-manager.js.map +1 -0
- package/dist/lib/transfer-crypto.d.ts +36 -0
- package/dist/lib/transfer-crypto.d.ts.map +1 -0
- package/dist/lib/transfer-crypto.js +109 -0
- package/dist/lib/transfer-crypto.js.map +1 -0
- package/dist/lib/x402-client.d.ts +63 -0
- package/dist/lib/x402-client.d.ts.map +1 -0
- package/dist/lib/x402-client.js +236 -0
- package/dist/lib/x402-client.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +73 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/call-contract.d.ts +4 -0
- package/dist/mcp/tools/call-contract.d.ts.map +1 -0
- package/dist/mcp/tools/call-contract.js +68 -0
- package/dist/mcp/tools/call-contract.js.map +1 -0
- package/dist/mcp/tools/execute.d.ts +4 -0
- package/dist/mcp/tools/execute.d.ts.map +1 -0
- package/dist/mcp/tools/execute.js +59 -0
- package/dist/mcp/tools/execute.js.map +1 -0
- package/dist/mcp/tools/get-audit-log.d.ts +4 -0
- package/dist/mcp/tools/get-audit-log.d.ts.map +1 -0
- package/dist/mcp/tools/get-audit-log.js +85 -0
- package/dist/mcp/tools/get-audit-log.js.map +1 -0
- package/dist/mcp/tools/get-balances.d.ts +4 -0
- package/dist/mcp/tools/get-balances.d.ts.map +1 -0
- package/dist/mcp/tools/get-balances.js +84 -0
- package/dist/mcp/tools/get-balances.js.map +1 -0
- package/dist/mcp/tools/get-status.d.ts +4 -0
- package/dist/mcp/tools/get-status.d.ts.map +1 -0
- package/dist/mcp/tools/get-status.js +66 -0
- package/dist/mcp/tools/get-status.js.map +1 -0
- package/dist/mcp/tools/list-networks.d.ts +4 -0
- package/dist/mcp/tools/list-networks.d.ts.map +1 -0
- package/dist/mcp/tools/list-networks.js +36 -0
- package/dist/mcp/tools/list-networks.js.map +1 -0
- package/dist/mcp/tools/list-signers.d.ts +4 -0
- package/dist/mcp/tools/list-signers.d.ts.map +1 -0
- package/dist/mcp/tools/list-signers.js +36 -0
- package/dist/mcp/tools/list-signers.js.map +1 -0
- package/dist/mcp/tools/read-contract.d.ts +4 -0
- package/dist/mcp/tools/read-contract.d.ts.map +1 -0
- package/dist/mcp/tools/read-contract.js +62 -0
- package/dist/mcp/tools/read-contract.js.map +1 -0
- package/dist/mcp/tools/resolve-address.d.ts +4 -0
- package/dist/mcp/tools/resolve-address.d.ts.map +1 -0
- package/dist/mcp/tools/resolve-address.js +37 -0
- package/dist/mcp/tools/resolve-address.js.map +1 -0
- package/dist/mcp/tools/send-eth.d.ts +4 -0
- package/dist/mcp/tools/send-eth.d.ts.map +1 -0
- package/dist/mcp/tools/send-eth.js +52 -0
- package/dist/mcp/tools/send-eth.js.map +1 -0
- package/dist/mcp/tools/send-token.d.ts +4 -0
- package/dist/mcp/tools/send-token.d.ts.map +1 -0
- package/dist/mcp/tools/send-token.js +102 -0
- package/dist/mcp/tools/send-token.js.map +1 -0
- package/dist/mcp/tools/sign-message.d.ts +4 -0
- package/dist/mcp/tools/sign-message.d.ts.map +1 -0
- package/dist/mcp/tools/sign-message.js +33 -0
- package/dist/mcp/tools/sign-message.js.map +1 -0
- package/dist/mcp/tools/sign-typed-data.d.ts +4 -0
- package/dist/mcp/tools/sign-typed-data.d.ts.map +1 -0
- package/dist/mcp/tools/sign-typed-data.js +48 -0
- package/dist/mcp/tools/sign-typed-data.js.map +1 -0
- package/dist/mcp/tools/simulate.d.ts +4 -0
- package/dist/mcp/tools/simulate.d.ts.map +1 -0
- package/dist/mcp/tools/simulate.js +54 -0
- package/dist/mcp/tools/simulate.js.map +1 -0
- package/dist/mcp/tools/wallet-overview.d.ts +4 -0
- package/dist/mcp/tools/wallet-overview.d.ts.map +1 -0
- package/dist/mcp/tools/wallet-overview.js +109 -0
- package/dist/mcp/tools/wallet-overview.js.map +1 -0
- package/dist/mcp/tools/x402-check.d.ts +3 -0
- package/dist/mcp/tools/x402-check.d.ts.map +1 -0
- package/dist/mcp/tools/x402-check.js +44 -0
- package/dist/mcp/tools/x402-check.js.map +1 -0
- package/dist/mcp/tools/x402-discover.d.ts +3 -0
- package/dist/mcp/tools/x402-discover.d.ts.map +1 -0
- package/dist/mcp/tools/x402-discover.js +42 -0
- package/dist/mcp/tools/x402-discover.js.map +1 -0
- package/dist/mcp/tools/x402-fetch.d.ts +4 -0
- package/dist/mcp/tools/x402-fetch.d.ts.map +1 -0
- package/dist/mcp/tools/x402-fetch.js +45 -0
- package/dist/mcp/tools/x402-fetch.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { formatUnits } from 'viem';
|
|
5
|
+
import { createClientFromConfig, getDefaultSignerName, listSigners, loadSignerConfig, } from '../../lib/config.js';
|
|
6
|
+
import { brand, brandBold, brandDot, dim, statusColor } from '../theme.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping is intentional
|
|
11
|
+
const ANSI_RE = /\u001B\[[0-9;]*m/g;
|
|
12
|
+
function pad(str, width) {
|
|
13
|
+
const visible = str.replace(ANSI_RE, '');
|
|
14
|
+
return str + ' '.repeat(Math.max(0, width - visible.length));
|
|
15
|
+
}
|
|
16
|
+
function fmtAddr(address) {
|
|
17
|
+
if (!address || address.length < 10)
|
|
18
|
+
return dim('—');
|
|
19
|
+
return dim(`${address.slice(0, 6)}…${address.slice(-4)}`);
|
|
20
|
+
}
|
|
21
|
+
function fmtBal(weiStr) {
|
|
22
|
+
if (!weiStr || weiStr === '0')
|
|
23
|
+
return dim('0 ETH');
|
|
24
|
+
const eth = formatUnits(BigInt(weiStr), 18);
|
|
25
|
+
const clean = eth.includes('.') ? eth.replace(/\.?0+$/, '') : eth;
|
|
26
|
+
return `${clean} ETH`;
|
|
27
|
+
}
|
|
28
|
+
async function fetchInfo(name, config) {
|
|
29
|
+
const info = {
|
|
30
|
+
name,
|
|
31
|
+
address: config.ethAddress || '',
|
|
32
|
+
status: 'unknown',
|
|
33
|
+
balance: undefined,
|
|
34
|
+
policies: undefined,
|
|
35
|
+
isDefault: false,
|
|
36
|
+
};
|
|
37
|
+
try {
|
|
38
|
+
const { api } = createClientFromConfig(config);
|
|
39
|
+
const signers = await api.listSigners();
|
|
40
|
+
const [s] = signers;
|
|
41
|
+
if (s) {
|
|
42
|
+
info.status = s.status;
|
|
43
|
+
info.balance = s.balance;
|
|
44
|
+
info.policies = s.policyCount;
|
|
45
|
+
if (s.ethAddress)
|
|
46
|
+
info.address = s.ethAddress;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
info.status = 'offline';
|
|
51
|
+
}
|
|
52
|
+
return info;
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Command
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
export const statusCommand = new Command('status')
|
|
58
|
+
.description('Show all your wallets')
|
|
59
|
+
.action(async () => {
|
|
60
|
+
const names = listSigners();
|
|
61
|
+
if (names.length === 0) {
|
|
62
|
+
console.log(chalk.yellow('\n No wallets found. Run `agenta init` to create one.\n'));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const defaultName = getDefaultSignerName();
|
|
66
|
+
const spinner = ora({
|
|
67
|
+
text: `Checking ${names.length} wallet${names.length > 1 ? 's' : ''}…`,
|
|
68
|
+
indent: 2,
|
|
69
|
+
}).start();
|
|
70
|
+
const wallets = await Promise.all(names.map(async (name) => {
|
|
71
|
+
try {
|
|
72
|
+
const config = loadSignerConfig(name);
|
|
73
|
+
const info = await fetchInfo(name, config);
|
|
74
|
+
info.isDefault = name === defaultName;
|
|
75
|
+
return info;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return {
|
|
79
|
+
name,
|
|
80
|
+
address: '',
|
|
81
|
+
status: 'error',
|
|
82
|
+
balance: undefined,
|
|
83
|
+
policies: undefined,
|
|
84
|
+
isDefault: name === defaultName,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
spinner.stop();
|
|
89
|
+
const nw = Math.max(4, ...wallets.map((w) => w.name.length)) + 3;
|
|
90
|
+
const aw = 15;
|
|
91
|
+
const sw = 10;
|
|
92
|
+
console.log('');
|
|
93
|
+
for (const w of wallets) {
|
|
94
|
+
const dot = brandDot(w.isDefault);
|
|
95
|
+
const name = w.isDefault ? brandBold(w.name) : w.name;
|
|
96
|
+
const addr = fmtAddr(w.address);
|
|
97
|
+
const status = statusColor(w.status);
|
|
98
|
+
const pol = w.policies != null ? dim(`${w.policies} pol`) : '';
|
|
99
|
+
console.log(` ${dot} ${pad(name, nw)} ${pad(addr, aw)} ${pad(status, sw)} ${pol}`);
|
|
100
|
+
}
|
|
101
|
+
console.log('');
|
|
102
|
+
const activeLabel = defaultName ? brand(defaultName) : dim('none');
|
|
103
|
+
console.log(dim(' Active: ') +
|
|
104
|
+
activeLabel +
|
|
105
|
+
dim(` · ${wallets.length} wallet${wallets.length > 1 ? 's' : ''}`));
|
|
106
|
+
console.log(dim(` Run ${chalk.reset('agenta info <name>')} for full details`));
|
|
107
|
+
console.log('');
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=status.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.command.js","sourceRoot":"","sources":["../../../src/cli/commands/status.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAgBA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAuC5C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { adminCommand } from './commands/admin.command.js';
|
|
3
|
+
import { balanceCommand } from './commands/balance.command.js';
|
|
4
|
+
import { deployCommand } from './commands/deploy.command.js';
|
|
5
|
+
import { infoCommand } from './commands/info.command.js';
|
|
6
|
+
import { initCommand } from './commands/init.command.js';
|
|
7
|
+
import { linkCommand } from './commands/link.command.js';
|
|
8
|
+
import { loginCommand, logoutCommand } from './commands/login.command.js';
|
|
9
|
+
import { networkCommand } from './commands/network.command.js';
|
|
10
|
+
import { proxyCommand } from './commands/proxy.command.js';
|
|
11
|
+
import { receiveCommand } from './commands/receive.command.js';
|
|
12
|
+
import { sendCommand } from './commands/send.command.js';
|
|
13
|
+
import { signMessageCommand } from './commands/sign.command.js';
|
|
14
|
+
import { statusCommand } from './commands/status.command.js';
|
|
15
|
+
import { BRAND_BANNER, dim } from './theme.js';
|
|
16
|
+
export async function runCli() {
|
|
17
|
+
const program = new Command();
|
|
18
|
+
program
|
|
19
|
+
.name('agenta')
|
|
20
|
+
.description(BRAND_BANNER)
|
|
21
|
+
.version('0.1.0')
|
|
22
|
+
.option('-s, --signer <name>', 'Signer name (default: auto-detected)')
|
|
23
|
+
.addHelpText('after', `
|
|
24
|
+
${dim('Getting started:')}
|
|
25
|
+
$ agenta login Log in with email + OTP
|
|
26
|
+
$ agenta init Create your first wallet
|
|
27
|
+
$ agenta status See all your wallets
|
|
28
|
+
$ agenta send 0x... 0.01 Send ETH
|
|
29
|
+
$ agenta link <name> Export share to another device
|
|
30
|
+
$ agenta receive <name> Import share from another device
|
|
31
|
+
|
|
32
|
+
${dim('Docs: https://github.com/AgentaOS/agentaos')}
|
|
33
|
+
`);
|
|
34
|
+
program.addCommand(loginCommand);
|
|
35
|
+
program.addCommand(logoutCommand);
|
|
36
|
+
program.addCommand(initCommand);
|
|
37
|
+
program.addCommand(statusCommand);
|
|
38
|
+
program.addCommand(infoCommand);
|
|
39
|
+
program.addCommand(balanceCommand);
|
|
40
|
+
program.addCommand(sendCommand);
|
|
41
|
+
program.addCommand(signMessageCommand);
|
|
42
|
+
program.addCommand(deployCommand);
|
|
43
|
+
program.addCommand(proxyCommand);
|
|
44
|
+
program.addCommand(networkCommand);
|
|
45
|
+
program.addCommand(linkCommand);
|
|
46
|
+
program.addCommand(receiveCommand);
|
|
47
|
+
program.addCommand(adminCommand);
|
|
48
|
+
await program.parseAsync();
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,MAAM;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACL,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,YAAY,CAAC;SACzB,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;SACrE,WAAW,CACX,OAAO,EACP;EACD,GAAG,CAAC,kBAAkB,CAAC;;;;;;;;EAQvB,GAAG,CAAC,4CAA4C,CAAC;CAClD,CACE,CAAC;IAEH,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAEjC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ChalkInstance } from 'chalk';
|
|
2
|
+
/** Brand accent — bold white. Mirrors #1A1A1A-on-cream in terminal. */
|
|
3
|
+
export declare const brand: ChalkInstance;
|
|
4
|
+
export declare const brandBold: ChalkInstance;
|
|
5
|
+
/** Success — checkmarks, completed status. Brand: #22C55E */
|
|
6
|
+
export declare const success: ChalkInstance;
|
|
7
|
+
/** Warning — paused state, caution messages. Brand: #F59E0B */
|
|
8
|
+
export declare const warn: ChalkInstance;
|
|
9
|
+
/** Danger — errors, revoked, blocked. Brand: #EF4444 */
|
|
10
|
+
export declare const danger: ChalkInstance;
|
|
11
|
+
/** Muted — secondary text, labels, separators. Brand: #6B6B6B */
|
|
12
|
+
export declare const dim: ChalkInstance;
|
|
13
|
+
/** Bold — section headers, emphasis */
|
|
14
|
+
export declare const bold: ChalkInstance;
|
|
15
|
+
export declare function brandDot(active: boolean): string;
|
|
16
|
+
export declare function statusColor(status: string): string;
|
|
17
|
+
export declare function successMark(text: string): string;
|
|
18
|
+
export declare function failMark(text: string): string;
|
|
19
|
+
export declare const BRAND_LINE: string;
|
|
20
|
+
export declare const BRAND_BANNER: string;
|
|
21
|
+
export declare function section(label: string): void;
|
|
22
|
+
export declare function hint(text: string): void;
|
|
23
|
+
export declare const promptTheme: {
|
|
24
|
+
prefix: {
|
|
25
|
+
idle: string;
|
|
26
|
+
done: string;
|
|
27
|
+
};
|
|
28
|
+
style: {
|
|
29
|
+
answer: (text: string) => string;
|
|
30
|
+
highlight: (text: string) => string;
|
|
31
|
+
key: (text: string) => string;
|
|
32
|
+
description: (text: string) => string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/cli/theme.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAUlD,uEAAuE;AACvE,eAAO,MAAM,KAAK,EAAE,aAA0B,CAAC;AAC/C,eAAO,MAAM,SAAS,EAAE,aAA0B,CAAC;AAEnD,6DAA6D;AAC7D,eAAO,MAAM,OAAO,EAAE,aAAoC,CAAC;AAE3D,+DAA+D;AAC/D,eAAO,MAAM,IAAI,EAAE,aAAoC,CAAC;AAExD,wDAAwD;AACxD,eAAO,MAAM,MAAM,EAAE,aAAoC,CAAC;AAE1D,iEAAiE;AACjE,eAAO,MAAM,GAAG,EAAE,aAAyB,CAAC;AAE5C,uCAAuC;AACvC,eAAO,MAAM,IAAI,EAAE,aAA0B,CAAC;AAM9C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAclD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAMD,eAAO,MAAM,UAAU,QAA+D,CAAC;AAEvF,eAAO,MAAM,YAAY,QAab,CAAC;AAMb,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AASD,eAAO,MAAM,WAAW;;;;;;uBAMP,MAAM;0BACH,MAAM;oBACZ,MAAM;4BACE,MAAM;;CAE3B,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import chalk, {} from 'chalk';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Agenta brand palette (from brand-guidelines.html)
|
|
4
|
+
//
|
|
5
|
+
// The brand is monochrome: #1A1A1A accent on #FAFAF8 cream.
|
|
6
|
+
// Terminal adaptation: bold/white for emphasis, dim for secondary.
|
|
7
|
+
// Color only for semantic meaning — green, red, amber.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/** Brand accent — bold white. Mirrors #1A1A1A-on-cream in terminal. */
|
|
10
|
+
export const brand = chalk.bold;
|
|
11
|
+
export const brandBold = chalk.bold;
|
|
12
|
+
/** Success — checkmarks, completed status. Brand: #22C55E */
|
|
13
|
+
export const success = chalk.hex('#22c55e');
|
|
14
|
+
/** Warning — paused state, caution messages. Brand: #F59E0B */
|
|
15
|
+
export const warn = chalk.hex('#f59e0b');
|
|
16
|
+
/** Danger — errors, revoked, blocked. Brand: #EF4444 */
|
|
17
|
+
export const danger = chalk.hex('#ef4444');
|
|
18
|
+
/** Muted — secondary text, labels, separators. Brand: #6B6B6B */
|
|
19
|
+
export const dim = chalk.dim;
|
|
20
|
+
/** Bold — section headers, emphasis */
|
|
21
|
+
export const bold = chalk.bold;
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Composite helpers
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
export function brandDot(active) {
|
|
26
|
+
return active ? '●' : dim('○');
|
|
27
|
+
}
|
|
28
|
+
export function statusColor(status) {
|
|
29
|
+
switch (status) {
|
|
30
|
+
case 'active':
|
|
31
|
+
return success(status);
|
|
32
|
+
case 'paused':
|
|
33
|
+
return warn(status);
|
|
34
|
+
case 'revoked':
|
|
35
|
+
return danger(status);
|
|
36
|
+
case 'offline':
|
|
37
|
+
case 'error':
|
|
38
|
+
return danger(status);
|
|
39
|
+
default:
|
|
40
|
+
return dim(status);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function successMark(text) {
|
|
44
|
+
return `${success('✓')} ${text}`;
|
|
45
|
+
}
|
|
46
|
+
export function failMark(text) {
|
|
47
|
+
return `${danger('✕')} ${text}`;
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Brand header + ASCII logo
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
export const BRAND_LINE = `${brand('▪')} ${brandBold('AgentaOS')} ${dim('by Agenta')}`;
|
|
53
|
+
export const BRAND_BANNER = [
|
|
54
|
+
'',
|
|
55
|
+
` ${bold('●')} ${bold('●')} ${bold('●')}`,
|
|
56
|
+
'',
|
|
57
|
+
` ${bold(' █████╗ ██████╗ ███████╗███╗ ██╗████████╗ █████╗ ██████╗ ███████╗')}`,
|
|
58
|
+
` ${bold('██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔══██╗██╔═══██╗██╔════╝')}`,
|
|
59
|
+
` ${bold('███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ███████║██║ ██║███████╗')}`,
|
|
60
|
+
` ${bold('██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ██╔══██║██║ ██║╚════██║')}`,
|
|
61
|
+
` ${bold('██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ██║ ██║╚██████╔╝███████║')}`,
|
|
62
|
+
` ${bold('╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝')}`,
|
|
63
|
+
'',
|
|
64
|
+
` ${bold('AgentaOS')} ${dim('The financial OS for autonomous agents.')}`,
|
|
65
|
+
'',
|
|
66
|
+
].join('\n');
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Section helpers — visual breathing room between prompt groups
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
export function section(label) {
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log(` ${dim('─')} ${bold(label)}`);
|
|
73
|
+
console.log('');
|
|
74
|
+
}
|
|
75
|
+
export function hint(text) {
|
|
76
|
+
console.log(` ${dim(text)}`);
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// @inquirer/prompts theme — monochrome brand
|
|
80
|
+
//
|
|
81
|
+
// Pass as `theme` option to select(), input(), confirm(), password()
|
|
82
|
+
// e.g. select({ message: '...', choices: [...], theme: promptTheme })
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
export const promptTheme = {
|
|
85
|
+
prefix: {
|
|
86
|
+
idle: bold('?'),
|
|
87
|
+
done: success('✓'),
|
|
88
|
+
},
|
|
89
|
+
style: {
|
|
90
|
+
answer: (text) => bold(text),
|
|
91
|
+
highlight: (text) => bold(text),
|
|
92
|
+
key: (text) => bold(`<${text}>`),
|
|
93
|
+
description: (text) => dim(text),
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/cli/theme.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { isatty } from 'node:tty';
|
|
3
|
+
const args = process.argv.slice(2);
|
|
4
|
+
if (args.length > 0) {
|
|
5
|
+
// CLI mode: agenta <command> [options]
|
|
6
|
+
const { runCli } = await import('./cli/index.js');
|
|
7
|
+
await runCli();
|
|
8
|
+
}
|
|
9
|
+
else if (isatty(0)) {
|
|
10
|
+
// Interactive terminal with no args → show help instead of silent MCP
|
|
11
|
+
process.argv.push('--help');
|
|
12
|
+
const { runCli } = await import('./cli/index.js');
|
|
13
|
+
await runCli();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
// Piped / non-interactive → MCP server (for AI agents)
|
|
17
|
+
const { runMcp } = await import('./mcp/index.js');
|
|
18
|
+
await runMcp();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IACrB,uCAAuC;IACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,MAAM,EAAE,CAAC;AAChB,CAAC;KAAM,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtB,sEAAsE;IACtE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,MAAM,EAAE,CAAC;AAChB,CAAC;KAAM,CAAC;IACP,uDAAuD;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,MAAM,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-crypto.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/transfer-crypto.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { wordlist } from '@scure/bip39/wordlists/english.js';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { decryptShareFromTransfer, deriveTransferKey, encryptShareForTransfer, generateTransferCode, } from '../transfer-crypto.js';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// generateTransferCode
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
describe('generateTransferCode', () => {
|
|
8
|
+
const transferId = 'test-transfer-001';
|
|
9
|
+
it('returns exactly 6 words', () => {
|
|
10
|
+
const { words } = generateTransferCode(transferId);
|
|
11
|
+
expect(words).toHaveLength(6);
|
|
12
|
+
});
|
|
13
|
+
it('all words are valid BIP39 English words', () => {
|
|
14
|
+
const wordSet = new Set(wordlist);
|
|
15
|
+
const { words } = generateTransferCode(transferId);
|
|
16
|
+
for (const word of words) {
|
|
17
|
+
expect(wordSet.has(word)).toBe(true);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
it('returns a 32-byte transfer key', () => {
|
|
21
|
+
const { transferKey } = generateTransferCode(transferId);
|
|
22
|
+
expect(transferKey).toBeInstanceOf(Uint8Array);
|
|
23
|
+
expect(transferKey.length).toBe(32);
|
|
24
|
+
});
|
|
25
|
+
it('different calls produce different words', () => {
|
|
26
|
+
const a = generateTransferCode(transferId);
|
|
27
|
+
const b = generateTransferCode(transferId);
|
|
28
|
+
// 6 words from 2048 wordlist — collision probability per word is 1/2048.
|
|
29
|
+
// All 6 matching is ~(1/2048)^6 ≈ 1.4e-20, effectively impossible.
|
|
30
|
+
expect(a.words).not.toEqual(b.words);
|
|
31
|
+
});
|
|
32
|
+
it('transfer key matches deriveTransferKey with same words and transferId', () => {
|
|
33
|
+
const { words, transferKey } = generateTransferCode(transferId);
|
|
34
|
+
const derived = deriveTransferKey(words, transferId);
|
|
35
|
+
expect(Buffer.from(transferKey).toString('hex')).toBe(Buffer.from(derived).toString('hex'));
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// deriveTransferKey
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
describe('deriveTransferKey', () => {
|
|
42
|
+
const words = ['abandon', 'ability', 'able', 'about', 'above', 'absent'];
|
|
43
|
+
const transferId = 'transfer-abc-123';
|
|
44
|
+
it('is deterministic — same words + transferId produce same key', () => {
|
|
45
|
+
const key1 = deriveTransferKey(words, transferId);
|
|
46
|
+
const key2 = deriveTransferKey(words, transferId);
|
|
47
|
+
expect(Buffer.from(key1).toString('hex')).toBe(Buffer.from(key2).toString('hex'));
|
|
48
|
+
});
|
|
49
|
+
it('different words produce a different key', () => {
|
|
50
|
+
const altWords = ['zoo', 'zone', 'zero', 'youth', 'young', 'year'];
|
|
51
|
+
const key1 = deriveTransferKey(words, transferId);
|
|
52
|
+
const key2 = deriveTransferKey(altWords, transferId);
|
|
53
|
+
expect(Buffer.from(key1).toString('hex')).not.toBe(Buffer.from(key2).toString('hex'));
|
|
54
|
+
});
|
|
55
|
+
it('different transferId produces a different key (same words)', () => {
|
|
56
|
+
const key1 = deriveTransferKey(words, 'transfer-aaa');
|
|
57
|
+
const key2 = deriveTransferKey(words, 'transfer-bbb');
|
|
58
|
+
expect(Buffer.from(key1).toString('hex')).not.toBe(Buffer.from(key2).toString('hex'));
|
|
59
|
+
});
|
|
60
|
+
it('throws if word count is not 6', () => {
|
|
61
|
+
expect(() => deriveTransferKey(['abandon'], transferId)).toThrowError('Expected 6 words, got 1');
|
|
62
|
+
expect(() => deriveTransferKey(['abandon', 'ability', 'able', 'about', 'above', 'absent', 'extra'], transferId)).toThrowError('Expected 6 words, got 7');
|
|
63
|
+
expect(() => deriveTransferKey([], transferId)).toThrowError('Expected 6 words, got 0');
|
|
64
|
+
});
|
|
65
|
+
it('throws if a word is not in the BIP39 wordlist', () => {
|
|
66
|
+
const badWords = ['abandon', 'ability', 'able', 'about', 'above', 'notaword'];
|
|
67
|
+
expect(() => deriveTransferKey(badWords, transferId)).toThrowError('Invalid word: "notaword"');
|
|
68
|
+
});
|
|
69
|
+
it('is case insensitive — lowercase and uppercase produce the same key', () => {
|
|
70
|
+
const upper = words.map((w) => w.toUpperCase());
|
|
71
|
+
const mixed = words.map((w, i) => (i % 2 === 0 ? w.toUpperCase() : w));
|
|
72
|
+
const keyLower = deriveTransferKey(words, transferId);
|
|
73
|
+
const keyUpper = deriveTransferKey(upper, transferId);
|
|
74
|
+
const keyMixed = deriveTransferKey(mixed, transferId);
|
|
75
|
+
const hex = Buffer.from(keyLower).toString('hex');
|
|
76
|
+
expect(Buffer.from(keyUpper).toString('hex')).toBe(hex);
|
|
77
|
+
expect(Buffer.from(keyMixed).toString('hex')).toBe(hex);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// encryptShareForTransfer + decryptShareFromTransfer (round-trip)
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
describe('encryptShareForTransfer / decryptShareFromTransfer', () => {
|
|
84
|
+
const transferId = 'roundtrip-test';
|
|
85
|
+
/** Helper: generate a fresh 32-byte key for testing. */
|
|
86
|
+
function makeKey() {
|
|
87
|
+
const { transferKey } = generateTransferCode(transferId);
|
|
88
|
+
return transferKey;
|
|
89
|
+
}
|
|
90
|
+
it('encrypt then decrypt returns original data', async () => {
|
|
91
|
+
const key = makeKey();
|
|
92
|
+
const plaintext = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
|
93
|
+
const ciphertext = await encryptShareForTransfer(plaintext, key);
|
|
94
|
+
const recovered = await decryptShareFromTransfer(ciphertext, key);
|
|
95
|
+
expect(Buffer.from(recovered).toString('hex')).toBe(Buffer.from(plaintext).toString('hex'));
|
|
96
|
+
});
|
|
97
|
+
it('works with an empty Uint8Array', async () => {
|
|
98
|
+
const key = makeKey();
|
|
99
|
+
const plaintext = new Uint8Array(0);
|
|
100
|
+
const ciphertext = await encryptShareForTransfer(plaintext, key);
|
|
101
|
+
const recovered = await decryptShareFromTransfer(ciphertext, key);
|
|
102
|
+
expect(recovered.length).toBe(0);
|
|
103
|
+
});
|
|
104
|
+
it('works with large data (1 MB)', async () => {
|
|
105
|
+
const key = makeKey();
|
|
106
|
+
const plaintext = new Uint8Array(1024 * 1024);
|
|
107
|
+
// Fill with a deterministic pattern so we can verify round-trip
|
|
108
|
+
for (let i = 0; i < plaintext.length; i++) {
|
|
109
|
+
plaintext[i] = i & 0xff;
|
|
110
|
+
}
|
|
111
|
+
const ciphertext = await encryptShareForTransfer(plaintext, key);
|
|
112
|
+
const recovered = await decryptShareFromTransfer(ciphertext, key);
|
|
113
|
+
expect(recovered.length).toBe(plaintext.length);
|
|
114
|
+
expect(Buffer.from(recovered).toString('hex')).toBe(Buffer.from(plaintext).toString('hex'));
|
|
115
|
+
});
|
|
116
|
+
it('different keys produce different ciphertext', async () => {
|
|
117
|
+
const key1 = makeKey();
|
|
118
|
+
const key2 = makeKey();
|
|
119
|
+
const plaintext = new Uint8Array([10, 20, 30, 40]);
|
|
120
|
+
const ct1 = await encryptShareForTransfer(plaintext, key1);
|
|
121
|
+
const ct2 = await encryptShareForTransfer(plaintext, key2);
|
|
122
|
+
// Different keys + different random IVs means ciphertexts should differ
|
|
123
|
+
expect(ct1).not.toBe(ct2);
|
|
124
|
+
});
|
|
125
|
+
it('wrong key throws on decrypt', async () => {
|
|
126
|
+
const correctKey = makeKey();
|
|
127
|
+
const wrongKey = makeKey();
|
|
128
|
+
const plaintext = new Uint8Array([99, 88, 77]);
|
|
129
|
+
const ciphertext = await encryptShareForTransfer(plaintext, correctKey);
|
|
130
|
+
await expect(decryptShareFromTransfer(ciphertext, wrongKey)).rejects.toThrowError('Decryption failed');
|
|
131
|
+
});
|
|
132
|
+
it('corrupted ciphertext throws on decrypt', async () => {
|
|
133
|
+
const key = makeKey();
|
|
134
|
+
const plaintext = new Uint8Array([1, 2, 3, 4]);
|
|
135
|
+
const ciphertext = await encryptShareForTransfer(plaintext, key);
|
|
136
|
+
// Decode, flip a byte in the ciphertext body, re-encode
|
|
137
|
+
const packed = Buffer.from(ciphertext, 'base64');
|
|
138
|
+
// Flip a byte past the 12-byte IV, in the ciphertext/tag region
|
|
139
|
+
packed[14] = packed[14] ^ 0xff;
|
|
140
|
+
const corrupted = packed.toString('base64');
|
|
141
|
+
await expect(decryptShareFromTransfer(corrupted, key)).rejects.toThrowError('Decryption failed');
|
|
142
|
+
});
|
|
143
|
+
it('truncated ciphertext (less than IV + tag) throws "Ciphertext too short"', async () => {
|
|
144
|
+
const key = makeKey();
|
|
145
|
+
// IV is 12 bytes, GCM tag is 16 bytes — minimum valid length is 28 bytes.
|
|
146
|
+
// Provide only 20 bytes (less than 12 + 16 = 28).
|
|
147
|
+
const tooShort = Buffer.from(new Uint8Array(20)).toString('base64');
|
|
148
|
+
await expect(decryptShareFromTransfer(tooShort, key)).rejects.toThrowError('Ciphertext too short');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=transfer-crypto.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-crypto.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/transfer-crypto.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch wrapper for CLI commands that require authentication.
|
|
3
|
+
* Automatically retries with a refreshed access token on 401.
|
|
4
|
+
*/
|
|
5
|
+
export declare function authenticatedFetch(url: string, opts?: RequestInit): Promise<Response>;
|
|
6
|
+
//# sourceMappingURL=authenticated-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authenticated-fetch.d.ts","sourceRoot":"","sources":["../../src/lib/authenticated-fetch.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyB3F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { getRefreshToken, getSession, getSessionServerUrl, storeSession } from './keychain.js';
|
|
2
|
+
// Deduplicate concurrent refresh calls (same pattern as browser api-client.ts)
|
|
3
|
+
let refreshing = null;
|
|
4
|
+
/**
|
|
5
|
+
* Fetch wrapper for CLI commands that require authentication.
|
|
6
|
+
* Automatically retries with a refreshed access token on 401.
|
|
7
|
+
*/
|
|
8
|
+
export async function authenticatedFetch(url, opts) {
|
|
9
|
+
const token = await getSession();
|
|
10
|
+
if (!token) {
|
|
11
|
+
throw new Error('Not logged in. Run agenta login first.');
|
|
12
|
+
}
|
|
13
|
+
let res = await fetch(url, {
|
|
14
|
+
...opts,
|
|
15
|
+
headers: { ...opts?.headers, authorization: `Bearer ${token}` },
|
|
16
|
+
});
|
|
17
|
+
if (res.status === 401) {
|
|
18
|
+
const refreshed = await refreshSession();
|
|
19
|
+
if (refreshed) {
|
|
20
|
+
const newToken = await getSession();
|
|
21
|
+
res = await fetch(url, {
|
|
22
|
+
...opts,
|
|
23
|
+
headers: { ...opts?.headers, authorization: `Bearer ${newToken}` },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
throw new Error('Session expired. Run agenta login again.');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return res;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Attempt to refresh the access token using the stored refresh token.
|
|
34
|
+
* On success, persists new tokens to session.json. Returns true on success.
|
|
35
|
+
* Deduplicates concurrent calls to prevent rotation race conditions.
|
|
36
|
+
*/
|
|
37
|
+
async function refreshSession() {
|
|
38
|
+
if (refreshing)
|
|
39
|
+
return refreshing;
|
|
40
|
+
refreshing = (async () => {
|
|
41
|
+
const refreshToken = await getRefreshToken();
|
|
42
|
+
if (!refreshToken)
|
|
43
|
+
return false;
|
|
44
|
+
const serverUrl = await getSessionServerUrl();
|
|
45
|
+
if (!serverUrl)
|
|
46
|
+
return false;
|
|
47
|
+
try {
|
|
48
|
+
const res = await fetch(`${serverUrl}/api/v1/auth/refresh`, {
|
|
49
|
+
method: 'POST',
|
|
50
|
+
headers: { 'Content-Type': 'application/json' },
|
|
51
|
+
body: JSON.stringify({ refreshToken }),
|
|
52
|
+
signal: AbortSignal.timeout(10_000),
|
|
53
|
+
});
|
|
54
|
+
if (!res.ok)
|
|
55
|
+
return false;
|
|
56
|
+
const data = (await res.json());
|
|
57
|
+
if (data.token) {
|
|
58
|
+
await storeSession(data.token, serverUrl, data.refreshToken);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
try {
|
|
68
|
+
return await refreshing;
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
refreshing = null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=authenticated-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authenticated-fetch.js","sourceRoot":"","sources":["../../src/lib/authenticated-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/F,+EAA+E;AAC/E,IAAI,UAAU,GAA4B,IAAI,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,IAAkB;IACvE,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC1B,GAAG,IAAI;QACP,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC/D,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,MAAM,cAAc,EAAE,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;YACpC,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBACtB,GAAG,IAAI;gBACP,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE;aAClE,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc;IAC5B,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,YAAY,GAAG,MAAM,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAEhC,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE7B,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,sBAAsB,EAAE;gBAC3D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;gBACtC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACnC,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YAE1B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;YAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACb,CAAC;YAED,OAAO,KAAK,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,CAAC;QACJ,OAAO,MAAM,UAAU,CAAC;IACzB,CAAC;YAAS,CAAC;QACV,UAAU,GAAG,IAAI,CAAC;IACnB,CAAC;AACF,CAAC"}
|