@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.
- package/LICENSE +21 -0
- package/README.md +75 -0
- package/bin/azeth.js +2 -0
- package/dist/commands/agreements.d.ts +4 -0
- package/dist/commands/agreements.d.ts.map +1 -0
- package/dist/commands/agreements.js +65 -0
- package/dist/commands/agreements.js.map +1 -0
- package/dist/commands/call.d.ts +3 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +142 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/discover.d.ts +3 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +114 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/find.d.ts +3 -0
- package/dist/commands/find.d.ts.map +1 -0
- package/dist/commands/find.js +97 -0
- package/dist/commands/find.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +181 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pay.d.ts +3 -0
- package/dist/commands/pay.d.ts.map +1 -0
- package/dist/commands/pay.js +137 -0
- package/dist/commands/pay.js.map +1 -0
- package/dist/commands/register.d.ts +3 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +91 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/reputation.d.ts +4 -0
- package/dist/commands/reputation.d.ts.map +1 -0
- package/dist/commands/reputation.js +119 -0
- package/dist/commands/reputation.js.map +1 -0
- package/dist/commands/skills.d.ts +4 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +119 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +38 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +15 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +58 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/display.d.ts +17 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +45 -0
- package/dist/utils/display.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGxF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,uDAAuD,CAAC;KACpE,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,mBAAmB,EAAE,sCAAsC,CAAC;KACnE,MAAM,CAAC,kBAAkB,EAAE,sEAAsE,CAAC;KAClG,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,EAQtB,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,MAAM,OAAO,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,GAAG,gBAAgB,SAAS,CAAC,IAAI,QAAQ,OAAO,CAAC,KAAK,KAAK,CAAC;QAExE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC;YACtC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,UAAU,EAAE,SAAS,CAAC,IAAkB;YACxC,YAAY,EAAE,SAAS,CAAC,YAAY;gBAClC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,CAAC,CAAC,EAAE;YACN,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;SACvE,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,WAAW,CAAC,uBAAuB,CAAC,CAAC;QACrC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,YAAY,CAAC,+CAA+C,CAAC,CAAC;QAE9D,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 @@
|
|
|
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 @@
|
|
|
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"}
|