@azeth/cli 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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/bin/azeth.js +2 -0
  4. package/dist/commands/agreements.d.ts +4 -0
  5. package/dist/commands/agreements.d.ts.map +1 -0
  6. package/dist/commands/agreements.js +65 -0
  7. package/dist/commands/agreements.js.map +1 -0
  8. package/dist/commands/call.d.ts +3 -0
  9. package/dist/commands/call.d.ts.map +1 -0
  10. package/dist/commands/call.js +142 -0
  11. package/dist/commands/call.js.map +1 -0
  12. package/dist/commands/discover.d.ts +3 -0
  13. package/dist/commands/discover.d.ts.map +1 -0
  14. package/dist/commands/discover.js +114 -0
  15. package/dist/commands/discover.js.map +1 -0
  16. package/dist/commands/find.d.ts +3 -0
  17. package/dist/commands/find.d.ts.map +1 -0
  18. package/dist/commands/find.js +97 -0
  19. package/dist/commands/find.js.map +1 -0
  20. package/dist/commands/init.d.ts +3 -0
  21. package/dist/commands/init.d.ts.map +1 -0
  22. package/dist/commands/init.js +181 -0
  23. package/dist/commands/init.js.map +1 -0
  24. package/dist/commands/pay.d.ts +3 -0
  25. package/dist/commands/pay.d.ts.map +1 -0
  26. package/dist/commands/pay.js +137 -0
  27. package/dist/commands/pay.js.map +1 -0
  28. package/dist/commands/register.d.ts +3 -0
  29. package/dist/commands/register.d.ts.map +1 -0
  30. package/dist/commands/register.js +91 -0
  31. package/dist/commands/register.js.map +1 -0
  32. package/dist/commands/reputation.d.ts +4 -0
  33. package/dist/commands/reputation.d.ts.map +1 -0
  34. package/dist/commands/reputation.js +119 -0
  35. package/dist/commands/reputation.js.map +1 -0
  36. package/dist/commands/skills.d.ts +4 -0
  37. package/dist/commands/skills.d.ts.map +1 -0
  38. package/dist/commands/skills.js +119 -0
  39. package/dist/commands/skills.js.map +1 -0
  40. package/dist/commands/status.d.ts +3 -0
  41. package/dist/commands/status.d.ts.map +1 -0
  42. package/dist/commands/status.js +38 -0
  43. package/dist/commands/status.js.map +1 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +32 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/utils/config.d.ts +15 -0
  49. package/dist/utils/config.d.ts.map +1 -0
  50. package/dist/utils/config.js +58 -0
  51. package/dist/utils/config.js.map +1 -0
  52. package/dist/utils/display.d.ts +17 -0
  53. package/dist/utils/display.d.ts.map +1 -0
  54. package/dist/utils/display.js +45 -0
  55. package/dist/utils/display.js.map +1 -0
  56. package/package.json +60 -0
@@ -0,0 +1,181 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { privateKeyToAccount } from 'viem/accounts';
5
+ import { resolveOptions, createKit } from '../utils/config.js';
6
+ import { printHeader, printField, printSuccess, printError } from '../utils/display.js';
7
+ import { TOKENS } from '@azeth/common';
8
+ export const initCommand = new Command('init')
9
+ .description('Deploy a new Azeth smart account with guardian guardrails and register on the trust registry')
10
+ .requiredOption('--name <name>', 'Participant name')
11
+ .requiredOption('--description <desc>', 'Participant description')
12
+ .option('--type <type>', 'Entity type (agent|service|infrastructure)', 'agent')
13
+ .option('--capabilities <caps>', 'Comma-separated capabilities')
14
+ .option('--endpoint <url>', 'Service endpoint URL')
15
+ .option('--guardian <address>', 'Guardian address for co-signing over-limit operations')
16
+ .option('--emergency-address <address>', 'Emergency withdrawal destination address')
17
+ .option('--max-tx <usd>', 'Max USD per transaction (default: $100 testnet, $50 mainnet)')
18
+ .option('--daily-limit <usd>', 'Max USD per day (default: $1000 testnet, $500 mainnet)')
19
+ .action(async (_opts, cmd) => {
20
+ try {
21
+ const cliOpts = resolveOptions(cmd);
22
+ const localOpts = cmd.opts();
23
+ // Validate name/description length
24
+ if (localOpts.name.length > 256) {
25
+ printError('Name must be 256 characters or fewer');
26
+ process.exit(1);
27
+ }
28
+ if (localOpts.description.length > 1024) {
29
+ printError('Description must be 1024 characters or fewer');
30
+ process.exit(1);
31
+ }
32
+ const validTypes = ['agent', 'service', 'infrastructure'];
33
+ if (!validTypes.includes(localOpts.type)) {
34
+ printError(`Invalid entity type "${localOpts.type}". Must be one of: ${validTypes.join(', ')}`);
35
+ process.exit(1);
36
+ }
37
+ // Validate endpoint URL
38
+ if (localOpts.endpoint) {
39
+ try {
40
+ const parsed = new URL(localOpts.endpoint);
41
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
42
+ printError('Endpoint must use HTTP or HTTPS protocol');
43
+ process.exit(1);
44
+ }
45
+ }
46
+ catch {
47
+ printError('Invalid endpoint URL format');
48
+ process.exit(1);
49
+ }
50
+ }
51
+ // Validate capabilities
52
+ if (localOpts.capabilities) {
53
+ const caps = localOpts.capabilities.split(',').map(c => c.trim()).filter(Boolean);
54
+ if (caps.length > 50) {
55
+ printError('Maximum 50 capabilities allowed');
56
+ process.exit(1);
57
+ }
58
+ for (const cap of caps) {
59
+ if (cap.length > 128) {
60
+ printError(`Capability "${cap.slice(0, 20)}..." exceeds 128 character limit`);
61
+ process.exit(1);
62
+ }
63
+ }
64
+ }
65
+ // Parse spending limits
66
+ const isTestnet = cliOpts.chain === 'baseSepolia';
67
+ const maxTxUSD = localOpts.maxTx ? parseFloat(localOpts.maxTx) : (isTestnet ? 100 : 50);
68
+ const dailyUSD = localOpts.dailyLimit ? parseFloat(localOpts.dailyLimit) : (isTestnet ? 1000 : 500);
69
+ if (isNaN(maxTxUSD) || maxTxUSD <= 0) {
70
+ printError('--max-tx must be a positive number');
71
+ process.exit(1);
72
+ }
73
+ if (isNaN(dailyUSD) || dailyUSD <= 0) {
74
+ printError('--daily-limit must be a positive number');
75
+ process.exit(1);
76
+ }
77
+ const spinner = ora('Initializing Azeth participant...').start();
78
+ const kit = await createKit(cliOpts);
79
+ // Resolve guardian address: CLI flag > AZETH_GUARDIAN_KEY env > self-guardian (owner)
80
+ let guardianAddress = kit.address;
81
+ let guardianSource = 'self (owner EOA)';
82
+ if (localOpts.guardian) {
83
+ if (!/^0x[0-9a-fA-F]{40}$/.test(localOpts.guardian)) {
84
+ spinner.stop();
85
+ printError(`Invalid guardian address: "${localOpts.guardian}"`);
86
+ process.exit(1);
87
+ }
88
+ guardianAddress = localOpts.guardian;
89
+ guardianSource = 'CLI flag';
90
+ }
91
+ else {
92
+ const guardianKey = process.env['AZETH_GUARDIAN_KEY'];
93
+ if (guardianKey && /^0x[0-9a-fA-F]{64}$/.test(guardianKey.trim())) {
94
+ const guardianAccount = privateKeyToAccount(guardianKey.trim());
95
+ guardianAddress = guardianAccount.address;
96
+ guardianSource = 'AZETH_GUARDIAN_KEY';
97
+ }
98
+ }
99
+ // Resolve emergency address: CLI flag > AZETH_EMERGENCY_ADDRESS env > owner EOA
100
+ let emergencyAddress = kit.address;
101
+ if (localOpts.emergencyAddress) {
102
+ if (!/^0x[0-9a-fA-F]{40}$/.test(localOpts.emergencyAddress)) {
103
+ spinner.stop();
104
+ printError(`Invalid emergency address: "${localOpts.emergencyAddress}"`);
105
+ process.exit(1);
106
+ }
107
+ emergencyAddress = localOpts.emergencyAddress;
108
+ }
109
+ else {
110
+ const envEmergency = process.env['AZETH_EMERGENCY_ADDRESS'];
111
+ if (envEmergency && /^0x[0-9a-fA-F]{40}$/.test(envEmergency.trim())) {
112
+ emergencyAddress = envEmergency.trim();
113
+ }
114
+ }
115
+ // Build guardrails (guardian limits are 5x standard limits)
116
+ const guardrails = {
117
+ maxTxAmountUSD: BigInt(Math.round(maxTxUSD)) * 10n ** 18n,
118
+ dailySpendLimitUSD: BigInt(Math.round(dailyUSD)) * 10n ** 18n,
119
+ guardianMaxTxAmountUSD: BigInt(Math.round(maxTxUSD * 5)) * 10n ** 18n,
120
+ guardianDailySpendLimitUSD: BigInt(Math.round(dailyUSD * 5)) * 10n ** 18n,
121
+ guardian: guardianAddress,
122
+ emergencyWithdrawTo: emergencyAddress,
123
+ };
124
+ // Default token whitelist: ETH + USDC + WETH
125
+ const defaultTokens = [
126
+ '0x0000000000000000000000000000000000000000',
127
+ TOKENS[cliOpts.chain].USDC,
128
+ TOKENS[cliOpts.chain].WETH,
129
+ ];
130
+ // Deploy smart account + register on trust registry
131
+ spinner.text = `Deploying smart account on ${cliOpts.chain}...`;
132
+ const result = await kit.createAccount({
133
+ owner: kit.address,
134
+ guardrails,
135
+ tokens: defaultTokens,
136
+ registry: {
137
+ name: localOpts.name,
138
+ description: localOpts.description,
139
+ entityType: localOpts.type,
140
+ capabilities: localOpts.capabilities
141
+ ? localOpts.capabilities.split(',').map((c) => c.trim())
142
+ : [],
143
+ endpoint: localOpts.endpoint,
144
+ },
145
+ });
146
+ spinner.stop();
147
+ // Display results
148
+ printHeader('Azeth Participant Initialized');
149
+ printField('Name', localOpts.name);
150
+ printField('Type', localOpts.type);
151
+ printField('Smart Account', chalk.cyan(result.account));
152
+ printField('Owner EOA', kit.address);
153
+ printField('Token ID', result.tokenId.toString());
154
+ printField('Chain', cliOpts.chain);
155
+ printField('Tx Hash', chalk.cyan(result.txHash));
156
+ console.log();
157
+ printField('Guardian', `${guardianAddress} (${guardianSource})`);
158
+ printField('Emergency To', emergencyAddress);
159
+ printField('Max Tx', `$${maxTxUSD} (guardian: $${maxTxUSD * 5})`);
160
+ printField('Daily Limit', `$${dailyUSD} (guardian: $${dailyUSD * 5})`);
161
+ if (guardianAddress === kit.address) {
162
+ console.log();
163
+ console.log(chalk.yellow(' Warning: Guardian is set to your own address (self-guardian).'));
164
+ console.log(chalk.yellow(' For production, set AZETH_GUARDIAN_KEY or use --guardian <address>.'));
165
+ }
166
+ console.log();
167
+ printSuccess('Smart account deployed and registered on the trust registry.');
168
+ console.log();
169
+ console.log(chalk.gray(' Next steps:'));
170
+ console.log(chalk.gray(' azeth status — Check account status'));
171
+ console.log(chalk.gray(' azeth discover — Find other services'));
172
+ console.log(chalk.gray(' azeth pay <url> — Pay for an x402 service'));
173
+ console.log();
174
+ await kit.destroy();
175
+ }
176
+ catch (err) {
177
+ printError(err instanceof Error ? err.message : String(err));
178
+ process.exit(1);
179
+ }
180
+ });
181
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,MAAM,EAAoC,MAAM,eAAe,CAAC;AAEzE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,8FAA8F,CAAC;KAC3G,cAAc,CAAC,eAAe,EAAE,kBAAkB,CAAC;KACnD,cAAc,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;KACjE,MAAM,CAAC,eAAe,EAAE,4CAA4C,EAAE,OAAO,CAAC;KAC9E,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;KAC/D,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;KAClD,MAAM,CAAC,sBAAsB,EAAE,uDAAuD,CAAC;KACvF,MAAM,CAAC,+BAA+B,EAAE,0CAA0C,CAAC;KACnF,MAAM,CAAC,gBAAgB,EAAE,8DAA8D,CAAC;KACxF,MAAM,CAAC,qBAAqB,EAAE,wDAAwD,CAAC;KACvF,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAUtB,CAAC;QAEL,mCAAmC;QACnC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAChC,UAAU,CAAC,sCAAsC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACxC,UAAU,CAAC,8CAA8C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,gBAAgB,CAAU,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAkB,CAAC,EAAE,CAAC;YACvD,UAAU,CAAC,wBAAwB,SAAS,CAAC,IAAI,sBAAsB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,wBAAwB;QACxB,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnD,UAAU,CAAC,0CAA0C,CAAC,CAAC;oBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,CAAC,6BAA6B,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClF,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACrB,UAAU,CAAC,iCAAiC,CAAC,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBACrB,UAAU,CAAC,eAAe,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,kCAAkC,CAAC,CAAC;oBAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,aAAa,CAAC;QAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEpG,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACrC,UAAU,CAAC,oCAAoC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACrC,UAAU,CAAC,yCAAyC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QAErC,sFAAsF;QACtF,IAAI,eAAe,GAAkB,GAAG,CAAC,OAAO,CAAC;QACjD,IAAI,cAAc,GAAG,kBAAkB,CAAC;QAExC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACvB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,UAAU,CAAC,8BAA8B,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,eAAe,GAAG,SAAS,CAAC,QAAyB,CAAC;YACtD,cAAc,GAAG,UAAU,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YACtD,IAAI,WAAW,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAClE,MAAM,eAAe,GAAG,mBAAmB,CAAC,WAAW,CAAC,IAAI,EAAmB,CAAC,CAAC;gBACjF,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC;gBAC1C,cAAc,GAAG,oBAAoB,CAAC;YACxC,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,IAAI,gBAAgB,GAAkB,GAAG,CAAC,OAAO,CAAC;QAClD,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAC/B,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC5D,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,UAAU,CAAC,+BAA+B,SAAS,CAAC,gBAAgB,GAAG,CAAC,CAAC;gBACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,gBAAgB,GAAG,SAAS,CAAC,gBAAiC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YAC5D,IAAI,YAAY,IAAI,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACpE,gBAAgB,GAAG,YAAY,CAAC,IAAI,EAAmB,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,MAAM,UAAU,GAAe;YAC7B,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG;YACzD,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG;YAC7D,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG;YACrE,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG;YACzE,QAAQ,EAAE,eAAe;YACzB,mBAAmB,EAAE,gBAAgB;SACtC,CAAC;QAEF,6CAA6C;QAC7C,MAAM,aAAa,GAAoB;YACrC,4CAA4C;YAC5C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI;YAC1B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI;SAC3B,CAAC;QAEF,oDAAoD;QACpD,OAAO,CAAC,IAAI,GAAG,8BAA8B,OAAO,CAAC,KAAK,KAAK,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;YACrC,KAAK,EAAE,GAAG,CAAC,OAAO;YAClB,UAAU;YACV,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,WAAW,EAAE,SAAS,CAAC,WAAW;gBAClC,UAAU,EAAE,SAAS,CAAC,IAAkB;gBACxC,YAAY,EAAE,SAAS,CAAC,YAAY;oBAClC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACxD,CAAC,CAAC,EAAE;gBACN,QAAQ,EAAE,SAAS,CAAC,QAAQ;aAC7B;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,kBAAkB;QAClB,WAAW,CAAC,+BAA+B,CAAC,CAAC;QAC7C,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,UAAU,CAAC,UAAU,EAAE,GAAG,eAAe,KAAK,cAAc,GAAG,CAAC,CAAC;QACjE,UAAU,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QAC7C,UAAU,CAAC,QAAQ,EAAE,IAAI,QAAQ,gBAAgB,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;QAClE,UAAU,CAAC,aAAa,EAAE,IAAI,QAAQ,gBAAgB,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvE,IAAI,eAAe,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iEAAiE,CAAC,CAAC,CAAC;YAC7F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAC,CAAC;QACvG,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,YAAY,CAAC,8DAA8D,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const payCommand: Command;
3
+ //# sourceMappingURL=pay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pay.d.ts","sourceRoot":"","sources":["../../src/commands/pay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,UAAU,SAyHnB,CAAC"}
@@ -0,0 +1,137 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { resolveOptions, createKit } from '../utils/config.js';
5
+ import { printHeader, printField, printSuccess, printError, stripAnsi } from '../utils/display.js';
6
+ /** L-4: Parse --max-amount as human-readable USDC (e.g. "10" = 10 USDC, "0.50" = 0.50 USDC).
7
+ * Converts to atomic units (6 decimals) for consistency with MCP tool inputs.
8
+ * LOW-3 (Audit): Comma thousand-separators are intentionally stripped (e.g., "1,000.50" ->
9
+ * "1000.50") as a CLI convenience for human-facing input. The SDK does NOT perform this
10
+ * normalization — machine callers should provide raw numeric strings. */
11
+ function parseMaxAmount(value) {
12
+ const cleaned = value.replace('$', '').replace(/,/g, '').trim();
13
+ if (!/^\d+(\.\d{1,6})?$/.test(cleaned)) {
14
+ throw new Error('--max-amount must be a positive number in USDC (e.g., "10" for 10 USDC, "0.50" for 50 cents)');
15
+ }
16
+ const [whole = '0', fraction = ''] = cleaned.split('.');
17
+ const paddedFraction = fraction.padEnd(6, '0');
18
+ return BigInt(whole) * 1000000n + BigInt(paddedFraction);
19
+ }
20
+ export const payCommand = new Command('pay')
21
+ .description('Pay for an x402-gated service')
22
+ .argument('<url>', 'URL of the x402-gated service')
23
+ .option('--method <method>', 'HTTP method (GET|POST)', 'GET')
24
+ .option('--max-amount <amount>', 'Maximum payment amount in USDC (e.g., "10" for 10 USDC)')
25
+ .option('--body <json>', 'JSON request body (for POST)')
26
+ .action(async (url, _opts, cmd) => {
27
+ try {
28
+ const cliOpts = resolveOptions(cmd);
29
+ const localOpts = cmd.opts();
30
+ // Validate URL format
31
+ try {
32
+ const parsed = new URL(url);
33
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
34
+ printError('URL must use HTTP or HTTPS protocol');
35
+ process.exit(1);
36
+ }
37
+ }
38
+ catch {
39
+ printError('Invalid URL format');
40
+ process.exit(1);
41
+ }
42
+ // Validate --body is valid JSON
43
+ if (localOpts.body) {
44
+ try {
45
+ JSON.parse(localOpts.body);
46
+ }
47
+ catch {
48
+ printError('--body must be valid JSON');
49
+ process.exit(1);
50
+ }
51
+ }
52
+ const spinner = ora('Connecting...').start();
53
+ const kit = await createKit(cliOpts);
54
+ spinner.text = `Fetching ${url}...`;
55
+ const result = await kit.fetch402(url, {
56
+ method: localOpts.method,
57
+ maxAmount: localOpts.maxAmount ? parseMaxAmount(localOpts.maxAmount) : undefined,
58
+ body: localOpts.body,
59
+ });
60
+ spinner.stop();
61
+ printHeader('x402 Payment Result');
62
+ printField('URL', url);
63
+ printField('Method', localOpts.method);
64
+ printField('Status', result.response.status.toString());
65
+ printField('Payment Made', result.paymentMade ? chalk.green('Yes') : chalk.gray('No'));
66
+ if (result.paymentMade && result.amount !== undefined) {
67
+ // USDC has 6 decimals
68
+ const usdcFormatted = (Number(result.amount) / 1_000_000).toFixed(6);
69
+ printField('Amount', `${usdcFormatted} USDC`);
70
+ }
71
+ if (result.response.ok) {
72
+ // F-5: Limit response body read to 1 MB to prevent memory exhaustion from huge responses
73
+ const MAX_BODY_SIZE = 1_048_576;
74
+ const contentLength = result.response.headers.get('content-length');
75
+ // Audit #10: Handle NaN from invalid Content-Length (NaN > X is always false)
76
+ const parsedLength = contentLength ? Number(contentLength) : 0;
77
+ if (contentLength && (!Number.isFinite(parsedLength) || parsedLength > MAX_BODY_SIZE)) {
78
+ spinner.stop();
79
+ printError('Response body too large (Content-Length exceeds limit)');
80
+ process.exit(1);
81
+ }
82
+ const text = await result.response.text();
83
+ if (text.length > MAX_BODY_SIZE) {
84
+ spinner.stop();
85
+ printError('Response body too large');
86
+ process.exit(1);
87
+ }
88
+ // M-2: Strip ANSI escape codes from external response to prevent terminal injection
89
+ const safeText = stripAnsi(text);
90
+ const contentType = result.response.headers.get('content-type') ?? '';
91
+ if (contentType.includes('application/json')) {
92
+ try {
93
+ const body = JSON.parse(safeText);
94
+ const jsonStr = JSON.stringify(body, null, 2);
95
+ printHeader('Response');
96
+ if (jsonStr.length > 2000) {
97
+ console.log(chalk.white(jsonStr.slice(0, 2000)));
98
+ console.log(chalk.yellow(' (response truncated — use --raw for full output)'));
99
+ }
100
+ else {
101
+ console.log(chalk.white(jsonStr));
102
+ }
103
+ }
104
+ catch {
105
+ printHeader('Response');
106
+ if (safeText.length > 2000) {
107
+ console.log(chalk.white(safeText.slice(0, 2000)));
108
+ console.log(chalk.yellow(' (response truncated — use --raw for full output)'));
109
+ }
110
+ else {
111
+ console.log(chalk.white(safeText));
112
+ }
113
+ }
114
+ }
115
+ else {
116
+ printHeader('Response');
117
+ if (safeText.length > 2000) {
118
+ console.log(chalk.white(safeText.slice(0, 2000)));
119
+ console.log(chalk.yellow(' (response truncated — use --raw for full output)'));
120
+ }
121
+ else {
122
+ console.log(chalk.white(safeText));
123
+ }
124
+ }
125
+ printSuccess('Request completed successfully.');
126
+ }
127
+ else {
128
+ printError(`Service returned HTTP ${result.response.status}`);
129
+ }
130
+ await kit.destroy();
131
+ }
132
+ catch (err) {
133
+ printError(err instanceof Error ? err.message : String(err));
134
+ process.exit(1);
135
+ }
136
+ });
137
+ //# sourceMappingURL=pay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/commands/pay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const registerCommand: Command;
3
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,eAAe,SAmGxB,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { resolveOptions, createKit } from '../utils/config.js';
5
+ import { printHeader, printField, printSuccess, printError } from '../utils/display.js';
6
+ export const registerCommand = new Command('register')
7
+ .description('Register a participant on the ERC-8004 trust registry')
8
+ .requiredOption('--name <name>', 'Participant name')
9
+ .requiredOption('--description <desc>', 'Participant description')
10
+ .option('--type <type>', 'Entity type (agent|service|infrastructure)', 'agent')
11
+ .option('--capabilities <caps>', 'Comma-separated capabilities')
12
+ .option('--endpoint <url>', 'Service endpoint URL')
13
+ .option('--pricing <price>', 'Listed price (e.g., "$0.01/request")')
14
+ .option('--catalog <json>', 'Service catalog JSON array (e.g., \'[{"name":"API","path":"/v1"}]\')')
15
+ .action(async (_opts, cmd) => {
16
+ try {
17
+ const cliOpts = resolveOptions(cmd);
18
+ const localOpts = cmd.opts();
19
+ // Validate name/description length
20
+ if (localOpts.name.length > 256) {
21
+ printError('Name must be 256 characters or fewer');
22
+ process.exit(1);
23
+ }
24
+ if (localOpts.description.length > 1024) {
25
+ printError('Description must be 1024 characters or fewer');
26
+ process.exit(1);
27
+ }
28
+ const validTypes = ['agent', 'service', 'infrastructure'];
29
+ if (!validTypes.includes(localOpts.type)) {
30
+ printError(`Invalid entity type "${localOpts.type}". Must be one of: ${validTypes.join(', ')}`);
31
+ process.exit(1);
32
+ }
33
+ // Validate endpoint URL
34
+ if (localOpts.endpoint) {
35
+ try {
36
+ const parsed = new URL(localOpts.endpoint);
37
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
38
+ printError('Endpoint must use HTTP or HTTPS protocol');
39
+ process.exit(1);
40
+ }
41
+ }
42
+ catch {
43
+ printError('Invalid endpoint URL format');
44
+ process.exit(1);
45
+ }
46
+ }
47
+ // Validate capabilities
48
+ if (localOpts.capabilities) {
49
+ const caps = localOpts.capabilities.split(',').map(c => c.trim()).filter(Boolean);
50
+ if (caps.length > 50) {
51
+ printError('Maximum 50 capabilities allowed');
52
+ process.exit(1);
53
+ }
54
+ for (const cap of caps) {
55
+ if (cap.length > 128) {
56
+ printError(`Capability "${cap.slice(0, 20)}..." exceeds 128 character limit`);
57
+ process.exit(1);
58
+ }
59
+ }
60
+ }
61
+ const spinner = ora('Creating AzethKit instance...').start();
62
+ const kit = await createKit(cliOpts);
63
+ spinner.text = `Registering "${localOpts.name}" on ${cliOpts.chain}...`;
64
+ const result = await kit.publishService({
65
+ name: localOpts.name,
66
+ description: localOpts.description,
67
+ entityType: localOpts.type,
68
+ capabilities: localOpts.capabilities
69
+ ? localOpts.capabilities.split(',').map((c) => c.trim())
70
+ : [],
71
+ endpoint: localOpts.endpoint,
72
+ pricing: localOpts.pricing,
73
+ catalog: localOpts.catalog ? JSON.parse(localOpts.catalog) : undefined,
74
+ });
75
+ spinner.stop();
76
+ printHeader('Registration Complete');
77
+ printField('Name', localOpts.name);
78
+ printField('Type', localOpts.type);
79
+ printField('Chain', cliOpts.chain);
80
+ printField('Token ID', result.tokenId.toString());
81
+ printField('Tx Hash', chalk.cyan(result.txHash));
82
+ printField('Account', kit.address);
83
+ printSuccess('Participant registered on the trust registry.');
84
+ await kit.destroy();
85
+ }
86
+ catch (err) {
87
+ printError(err instanceof Error ? err.message : String(err));
88
+ process.exit(1);
89
+ }
90
+ });
91
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const reputationCommand: Command;
3
+ export { reputationCommand };
4
+ //# sourceMappingURL=reputation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.d.ts","sourceRoot":"","sources":["../../src/commands/reputation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,QAAA,MAAM,iBAAiB,SACkD,CAAC;AAgI1E,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { resolveOptions, createKit } from '../utils/config.js';
5
+ import { printHeader, printField, printSuccess, printError } from '../utils/display.js';
6
+ const reputationCommand = new Command('reputation')
7
+ .description('Query and manage on-chain reputation (payment-weighted)');
8
+ reputationCommand
9
+ .command('show')
10
+ .description('Show payment-weighted reputation for an agent')
11
+ .argument('<agentId>', 'ERC-8004 token ID of the agent')
12
+ .action(async (agentIdStr, _opts, cmd) => {
13
+ try {
14
+ if (!/^\d+$/.test(agentIdStr)) {
15
+ printError('Agent ID must be a positive integer');
16
+ process.exit(1);
17
+ }
18
+ const agentId = BigInt(agentIdStr);
19
+ const MAX_UINT256 = (1n << 256n) - 1n;
20
+ if (agentId > MAX_UINT256 || agentId === 0n) {
21
+ printError('Agent ID must be between 1 and 2^256-1');
22
+ process.exit(1);
23
+ }
24
+ const cliOpts = resolveOptions(cmd);
25
+ const spinner = ora('Fetching weighted reputation...').start();
26
+ const kit = await createKit(cliOpts);
27
+ const rep = await kit.getWeightedReputation(agentId);
28
+ spinner.stop();
29
+ printHeader(`Reputation for Agent #${agentIdStr}`);
30
+ printField('Opinion Count', rep.opinionCount.toString());
31
+ if (rep.opinionCount > 0n) {
32
+ const score = Number(rep.weightedValue);
33
+ const coloredScore = score >= 80
34
+ ? chalk.green(`${score}`)
35
+ : score >= 50
36
+ ? chalk.yellow(`${score}`)
37
+ : chalk.red(`${score}`);
38
+ printField('Weighted Score', coloredScore);
39
+ printField('Total Weight', rep.totalWeight.toString());
40
+ }
41
+ else {
42
+ console.log(chalk.yellow(' No opinions yet.'));
43
+ }
44
+ console.log();
45
+ await kit.destroy();
46
+ }
47
+ catch (err) {
48
+ printError(err instanceof Error ? err.message : String(err));
49
+ process.exit(1);
50
+ }
51
+ });
52
+ reputationCommand
53
+ .command('give')
54
+ .description('Submit reputation opinion for an agent (requires prior payment)')
55
+ .argument('<agentId>', 'ERC-8004 token ID of the agent')
56
+ .argument('<rating>', 'Rating from -100 to 100 (supports decimals like 85.5)')
57
+ .option('--tag <tag>', 'Opinion tag (e.g., quality, uptime)', 'quality')
58
+ .option('--endpoint <url>', 'Service endpoint being rated')
59
+ .action(async (agentIdStr, ratingStr, _opts, cmd) => {
60
+ try {
61
+ if (!/^\d+$/.test(agentIdStr)) {
62
+ printError('Agent ID must be a positive integer');
63
+ process.exit(1);
64
+ }
65
+ {
66
+ const agentIdCheck = BigInt(agentIdStr);
67
+ const MAX_UINT256 = (1n << 256n) - 1n;
68
+ if (agentIdCheck > MAX_UINT256 || agentIdCheck === 0n) {
69
+ printError('Agent ID must be between 1 and 2^256-1');
70
+ process.exit(1);
71
+ }
72
+ }
73
+ const rating = parseFloat(ratingStr);
74
+ if (isNaN(rating)) {
75
+ printError('Rating must be a valid number');
76
+ process.exit(1);
77
+ }
78
+ if (rating < -100 || rating > 100) {
79
+ printError('Rating must be between -100 and 100');
80
+ process.exit(1);
81
+ }
82
+ const cliOpts = resolveOptions(cmd);
83
+ const localOpts = cmd.opts();
84
+ // Validate tag: alphanumeric + hyphens, max 64 chars
85
+ if (localOpts.tag.length > 64 || !/^[a-zA-Z0-9_-]+$/.test(localOpts.tag)) {
86
+ printError('Tag must be 1-64 characters, alphanumeric with hyphens and underscores only');
87
+ process.exit(1);
88
+ }
89
+ // Convert rating to WAD (18-decimal) for on-chain storage
90
+ const wadValue = BigInt(Math.round(rating * 1e18));
91
+ const spinner = ora('Submitting opinion...').start();
92
+ const kit = await createKit(cliOpts);
93
+ const txHash = await kit.submitOpinion({
94
+ agentId: BigInt(agentIdStr),
95
+ value: wadValue,
96
+ valueDecimals: 18, // Always WAD
97
+ tag1: localOpts.tag,
98
+ tag2: 'cli',
99
+ endpoint: localOpts.endpoint ?? '',
100
+ opinionURI: '',
101
+ opinionHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
102
+ });
103
+ spinner.stop();
104
+ printHeader('Opinion Submitted');
105
+ printField('Agent ID', agentIdStr);
106
+ printField('Rating', `${rating} (scale: -100 to 100)`);
107
+ printField('Tag', localOpts.tag);
108
+ printField('Tx Hash', chalk.cyan(txHash));
109
+ printSuccess('On-chain reputation opinion recorded (payment-gated).');
110
+ console.log();
111
+ await kit.destroy();
112
+ }
113
+ catch (err) {
114
+ printError(err instanceof Error ? err.message : String(err));
115
+ process.exit(1);
116
+ }
117
+ });
118
+ export { reputationCommand };
119
+ //# sourceMappingURL=reputation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.js","sourceRoot":"","sources":["../../src/commands/reputation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const skillsCommand: Command;
3
+ export { skillsCommand };
4
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,QAAA,MAAM,aAAa,SACoD,CAAC;AAwIxE,OAAO,EAAE,aAAa,EAAE,CAAC"}