@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Azeth.ai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # @azeth/cli
2
+
3
+ Command-line interface for Azeth.ai trust infrastructure. Deploy smart accounts, discover services, make x402 payments, and manage on-chain reputation.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @azeth/cli
9
+
10
+ # or use without installing:
11
+ npx @azeth/cli <command>
12
+ ```
13
+
14
+ ## Quick Start
15
+
16
+ ```bash
17
+ # 1. Set environment variables
18
+ export AZETH_PRIVATE_KEY=0x...
19
+ export PIMLICO_API_KEY=...
20
+
21
+ # 2. Deploy account and register on the trust registry
22
+ azeth init --name "MyAgent" --type agent --description "Market data provider" --capabilities "price-feed,analytics"
23
+
24
+ # 3. Check account balances
25
+ azeth status
26
+
27
+ # 4. Discover services
28
+ azeth find --capability price-feed --min-rep 80
29
+
30
+ # 5. Call an x402 service (auto-pay + auto-feedback)
31
+ azeth call https://api.example.com/eth-price --max-amount 0.10
32
+ ```
33
+
34
+ ## Environment Variables
35
+
36
+ | Variable | Required | Description |
37
+ |---|---|---|
38
+ | `AZETH_PRIVATE_KEY` | Yes | Account owner's private key |
39
+ | `PIMLICO_API_KEY` | Yes* | Pimlico bundler key (*required for state-changing ops) |
40
+ | `AZETH_CHAIN` | No | Default chain (`baseSepolia`) |
41
+ | `BASE_RPC_URL` | No | RPC endpoint URL |
42
+ | `AZETH_SERVER_URL` | No | Azeth server URL |
43
+
44
+ ## Commands
45
+
46
+ | Command | Purpose | Key Options |
47
+ |---|---|---|
48
+ | `init` | Deploy account + register | `--name`, `--type`, `--capabilities` |
49
+ | `call <url>` | Auto-pay + auto-feedback | `--max-amount`, `--no-feedback` |
50
+ | `find [query]` | Advanced discovery | `--capability`, `--min-rep`, `--type` |
51
+ | `status` | Check balances | (none) |
52
+ | `skills list` | List capabilities | (none) |
53
+ | `skills add` | Add capabilities | `<capabilities...>` |
54
+ | `reputation show` | View reputation | `<agentId>` |
55
+ | `reputation give` | Submit reputation | `<agentId>`, `<rating>`, `--tag` |
56
+ | `agreements create` | Recurring payments | `--payee`, `--amount`, `--interval` |
57
+ | `register` | Registry registration | `--name`, `--type` |
58
+ | `discover` | Simple discovery | `--capability`, `--min-reputation` |
59
+ | `pay <url>` | Direct x402 payment | `--max-amount`, `--method` |
60
+
61
+ ## Global Options
62
+
63
+ ```
64
+ --chain <chain> Chain: "base" or "baseSepolia" (default: baseSepolia)
65
+ --rpc-url <url> Custom RPC URL
66
+ --server-url <url> Azeth server URL
67
+ ```
68
+
69
+ ## Full Documentation
70
+
71
+ See [docs/cli.md](../../docs/cli.md) for complete command reference with all options, arguments, and example output.
72
+
73
+ ## License
74
+
75
+ MIT
package/bin/azeth.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js';
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const agreementsCommand: Command;
3
+ export { agreementsCommand };
4
+ //# sourceMappingURL=agreements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agreements.d.ts","sourceRoot":"","sources":["../../src/commands/agreements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,QAAA,MAAM,iBAAiB,SAC8B,CAAC;AAsEtD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,65 @@
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 agreementsCommand = new Command('agreements')
7
+ .description('Manage recurring payment agreements');
8
+ agreementsCommand
9
+ .command('create')
10
+ .description('Create a new recurring payment agreement')
11
+ .requiredOption('--payee <address>', 'Payment recipient address')
12
+ .requiredOption('--token <address>', 'Payment token address (e.g., USDC)')
13
+ .requiredOption('--amount <amount>', 'Payment amount per interval (in token smallest unit)')
14
+ .requiredOption('--interval <seconds>', 'Payment interval in seconds (min 3600)')
15
+ .option('--max-executions <n>', 'Maximum number of payments (0 = unlimited)', '0')
16
+ .action(async (_opts, cmd) => {
17
+ try {
18
+ const cliOpts = resolveOptions(cmd);
19
+ const localOpts = cmd.opts();
20
+ // Validate inputs
21
+ if (!/^0x[0-9a-fA-F]{40}$/.test(localOpts.payee)) {
22
+ printError('Invalid payee address');
23
+ process.exit(1);
24
+ }
25
+ if (!/^0x[0-9a-fA-F]{40}$/.test(localOpts.token)) {
26
+ printError('Invalid token address');
27
+ process.exit(1);
28
+ }
29
+ if (!/^\d+$/.test(localOpts.amount) || localOpts.amount === '0') {
30
+ printError('Amount must be a positive integer greater than 0');
31
+ process.exit(1);
32
+ }
33
+ const interval = parseInt(localOpts.interval, 10);
34
+ if (isNaN(interval) || interval < 3600) {
35
+ printError('Interval must be at least 3600 seconds (1 hour)');
36
+ process.exit(1);
37
+ }
38
+ const spinner = ora('Creating payment agreement...').start();
39
+ const kit = await createKit(cliOpts);
40
+ const result = await kit.createPaymentAgreement({
41
+ payee: localOpts.payee,
42
+ token: localOpts.token,
43
+ amount: BigInt(localOpts.amount),
44
+ interval,
45
+ maxExecutions: parseInt(localOpts.maxExecutions, 10) || undefined,
46
+ });
47
+ spinner.stop();
48
+ printHeader('Payment Agreement Created');
49
+ printField('Agreement ID', result.agreementId.toString());
50
+ printField('Payee', localOpts.payee);
51
+ printField('Token', localOpts.token);
52
+ printField('Amount', localOpts.amount);
53
+ printField('Interval', `${interval} seconds`);
54
+ printField('Tx Hash', chalk.cyan(result.txHash));
55
+ printSuccess('Recurring payment agreement is active.');
56
+ console.log();
57
+ await kit.destroy();
58
+ }
59
+ catch (err) {
60
+ printError(err instanceof Error ? err.message : String(err));
61
+ process.exit(1);
62
+ }
63
+ });
64
+ export { agreementsCommand };
65
+ //# sourceMappingURL=agreements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agreements.js","sourceRoot":"","sources":["../../src/commands/agreements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const callCommand: Command;
3
+ //# sourceMappingURL=call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SA4HpB,CAAC"}
@@ -0,0 +1,142 @@
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
+ export const callCommand = new Command('call')
7
+ .description('Call an x402 service — auto-discover, auto-pay, auto-feedback')
8
+ .argument('<url>', 'URL of the service to call')
9
+ .option('--method <method>', 'HTTP method (GET|POST|PUT|DELETE)', 'GET')
10
+ .option('--body <json>', 'JSON request body')
11
+ .option('--max-amount <amount>', 'Maximum payment in USDC (e.g., "1.00")')
12
+ .option('--no-feedback', 'Disable auto-feedback after call')
13
+ .action(async (url, _opts, cmd) => {
14
+ try {
15
+ const cliOpts = resolveOptions(cmd);
16
+ const localOpts = cmd.opts();
17
+ // Validate URL format
18
+ try {
19
+ const parsed = new URL(url);
20
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
21
+ printError('URL must use HTTP or HTTPS protocol');
22
+ process.exit(1);
23
+ }
24
+ }
25
+ catch {
26
+ printError('Invalid URL format');
27
+ process.exit(1);
28
+ }
29
+ // Validate --body is valid JSON
30
+ if (localOpts.body) {
31
+ try {
32
+ JSON.parse(localOpts.body);
33
+ }
34
+ catch {
35
+ printError('--body must be valid JSON');
36
+ process.exit(1);
37
+ }
38
+ }
39
+ const spinner = ora('Connecting...').start();
40
+ const kit = await createKit(cliOpts);
41
+ spinner.text = `Calling ${url}...`;
42
+ const startTime = Date.now();
43
+ const result = await kit.fetch402(url, {
44
+ method: localOpts.method,
45
+ maxAmount: localOpts.maxAmount ? parseUSDC(localOpts.maxAmount) : undefined,
46
+ body: localOpts.body,
47
+ autoReputation: localOpts.feedback,
48
+ });
49
+ const elapsed = Date.now() - startTime;
50
+ spinner.stop();
51
+ printHeader('Service Call Result');
52
+ printField('URL', url);
53
+ printField('Method', localOpts.method);
54
+ printField('Status', colorStatus(result.response.status));
55
+ printField('Time', `${elapsed}ms`);
56
+ printField('Payment', result.paymentMade ? chalk.green('Yes') : chalk.gray('No'));
57
+ if (result.paymentMade && result.amount !== undefined) {
58
+ const usdcFormatted = (Number(result.amount) / 1_000_000).toFixed(6);
59
+ printField('Amount', `${usdcFormatted} USDC`);
60
+ }
61
+ if (result.response.ok) {
62
+ const MAX_BODY_SIZE = 1_048_576;
63
+ const contentLength = result.response.headers.get('content-length');
64
+ // Audit #10: Handle NaN from invalid Content-Length (NaN > X is always false)
65
+ const parsedLength = contentLength ? Number(contentLength) : 0;
66
+ if (contentLength && (!Number.isFinite(parsedLength) || parsedLength > MAX_BODY_SIZE)) {
67
+ printError('Response body too large (Content-Length exceeds limit)');
68
+ process.exit(1);
69
+ }
70
+ const text = await result.response.text();
71
+ if (text.length > MAX_BODY_SIZE) {
72
+ printError('Response body too large');
73
+ process.exit(1);
74
+ }
75
+ const contentType = result.response.headers.get('content-type') ?? '';
76
+ // M-2: Strip ANSI escape codes from external response to prevent terminal injection
77
+ const safeText = stripAnsi(text);
78
+ if (contentType.includes('application/json')) {
79
+ try {
80
+ const body = JSON.parse(safeText);
81
+ const jsonStr = JSON.stringify(body, null, 2);
82
+ printHeader('Response');
83
+ if (jsonStr.length > 2000) {
84
+ console.log(chalk.white(jsonStr.slice(0, 2000)));
85
+ console.log(chalk.yellow(' (response truncated — use --raw for full output)'));
86
+ }
87
+ else {
88
+ console.log(chalk.white(jsonStr));
89
+ }
90
+ }
91
+ catch {
92
+ printHeader('Response');
93
+ if (safeText.length > 2000) {
94
+ console.log(chalk.white(safeText.slice(0, 2000)));
95
+ console.log(chalk.yellow(' (response truncated — use --raw for full output)'));
96
+ }
97
+ else {
98
+ console.log(chalk.white(safeText));
99
+ }
100
+ }
101
+ }
102
+ else {
103
+ printHeader('Response');
104
+ if (safeText.length > 2000) {
105
+ console.log(chalk.white(safeText.slice(0, 2000)));
106
+ console.log(chalk.yellow(' (response truncated — use --raw for full output)'));
107
+ }
108
+ else {
109
+ console.log(chalk.white(safeText));
110
+ }
111
+ }
112
+ printSuccess('Call completed successfully.');
113
+ }
114
+ else {
115
+ printError(`Service returned HTTP ${result.response.status}`);
116
+ }
117
+ console.log();
118
+ await kit.destroy();
119
+ }
120
+ catch (err) {
121
+ printError(err instanceof Error ? err.message : String(err));
122
+ process.exit(1);
123
+ }
124
+ });
125
+ function parseUSDC(value) {
126
+ // LOW-3 fix: Strip comma thousand-separators (e.g., "1,000.50" -> "1000.50")
127
+ const cleaned = value.replace('$', '').replace(/,/g, '').trim();
128
+ if (!/^\d+(\.\d{1,6})?$/.test(cleaned)) {
129
+ throw new Error('Amount must be a positive number in USDC (e.g., "1.00")');
130
+ }
131
+ const [whole = '0', fraction = ''] = cleaned.split('.');
132
+ const paddedFraction = fraction.padEnd(6, '0');
133
+ return BigInt(whole) * 1000000n + BigInt(paddedFraction);
134
+ }
135
+ function colorStatus(status) {
136
+ if (status >= 200 && status < 300)
137
+ return chalk.green(status.toString());
138
+ if (status >= 400 && status < 500)
139
+ return chalk.yellow(status.toString());
140
+ return chalk.red(status.toString());
141
+ }
142
+ //# sourceMappingURL=call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const discoverCommand: Command;
3
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CpC,eAAO,MAAM,eAAe,SA4FxB,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { resolveOptions } from '../utils/config.js';
5
+ import { printHeader, printTableHeader, printTableRow, printError, formatAddress, stripAnsi } from '../utils/display.js';
6
+ function validateServerUrl(url) {
7
+ try {
8
+ const parsed = new URL(url);
9
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
10
+ throw new Error('Server URL must use HTTP or HTTPS');
11
+ }
12
+ // Block obvious internal addresses
13
+ const hostname = parsed.hostname.toLowerCase();
14
+ if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '0.0.0.0') {
15
+ // Allow localhost for development — this is intentional
16
+ }
17
+ }
18
+ catch (e) {
19
+ if (e instanceof Error && e.message.includes('must use'))
20
+ throw e;
21
+ throw new Error(`Invalid server URL format`);
22
+ }
23
+ }
24
+ function validateResponse(body) {
25
+ if (!body || typeof body !== 'object')
26
+ return [];
27
+ const obj = body;
28
+ if (!Array.isArray(obj.data))
29
+ return [];
30
+ return obj.data.filter((entry) => entry !== null &&
31
+ typeof entry === 'object' &&
32
+ typeof entry.tokenId === 'string' &&
33
+ typeof entry.name === 'string');
34
+ }
35
+ export const discoverCommand = new Command('discover')
36
+ .description('Find services by capability and reputation')
37
+ .option('--capability <cap>', 'Filter by capability')
38
+ .option('--type <type>', 'Filter by entity type (agent|service|infrastructure)')
39
+ .option('--min-reputation <score>', 'Minimum reputation score (0-100)')
40
+ .option('--limit <n>', 'Maximum results to return', '10')
41
+ .action(async (_opts, cmd) => {
42
+ try {
43
+ const cliOpts = resolveOptions(cmd);
44
+ const localOpts = cmd.opts();
45
+ const serverUrl = cliOpts.serverUrl ?? 'https://api.azeth.ai';
46
+ validateServerUrl(serverUrl);
47
+ const spinner = ora('Discovering services...').start();
48
+ // Discovery is read-only — query the server API directly (no private key needed)
49
+ const queryParams = new URLSearchParams();
50
+ if (localOpts.capability)
51
+ queryParams.set('capability', localOpts.capability);
52
+ if (localOpts.type)
53
+ queryParams.set('entityType', localOpts.type);
54
+ if (localOpts.minReputation !== undefined)
55
+ queryParams.set('minReputation', localOpts.minReputation);
56
+ queryParams.set('limit', localOpts.limit);
57
+ const response = await fetch(`${serverUrl}/api/v1/registry/discover?${queryParams}`, {
58
+ signal: AbortSignal.timeout(30_000),
59
+ });
60
+ if (!response.ok) {
61
+ spinner.stop();
62
+ printError(`Discovery API returned ${response.status}: ${response.statusText}`);
63
+ process.exit(1);
64
+ }
65
+ // F-5: Limit response body read to 1 MB to prevent memory exhaustion
66
+ const MAX_BODY_SIZE = 1_048_576;
67
+ const contentLength = response.headers.get('content-length');
68
+ if (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) {
69
+ spinner.stop();
70
+ printError('Response body too large (Content-Length exceeds limit)');
71
+ process.exit(1);
72
+ }
73
+ const rawText = await response.text();
74
+ if (rawText.length > MAX_BODY_SIZE) {
75
+ spinner.stop();
76
+ printError('Response body too large');
77
+ process.exit(1);
78
+ }
79
+ let rawBody;
80
+ try {
81
+ rawBody = JSON.parse(rawText);
82
+ }
83
+ catch {
84
+ spinner.stop();
85
+ printError('Invalid JSON response from server');
86
+ process.exit(1);
87
+ }
88
+ const results = validateResponse(rawBody);
89
+ spinner.stop();
90
+ if (results.length === 0) {
91
+ printHeader('Discovery Results');
92
+ console.log(chalk.yellow(' No services found matching your criteria.'));
93
+ return;
94
+ }
95
+ printHeader(`Discovery Results (${results.length} found)`);
96
+ const widths = [8, 18, 14, 20, 30];
97
+ printTableHeader(['TOKEN', 'OWNER', 'TYPE', 'NAME', 'CAPABILITIES'], widths);
98
+ for (const entry of results) {
99
+ printTableRow([
100
+ stripAnsi(entry.tokenId.toString()),
101
+ formatAddress(stripAnsi(entry.owner)),
102
+ stripAnsi(entry.entityType),
103
+ stripAnsi(entry.name).slice(0, 20),
104
+ (entry.capabilities ?? []).map(c => stripAnsi(c)).join(', ').slice(0, 30),
105
+ ], widths);
106
+ }
107
+ console.log();
108
+ }
109
+ catch (err) {
110
+ printError(err instanceof Error ? err.message : String(err));
111
+ process.exit(1);
112
+ }
113
+ });
114
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const findCommand: Command;
3
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/commands/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,WAAW,SA6FpB,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { resolveOptions } from '../utils/config.js';
5
+ import { printHeader, printTableHeader, printTableRow, printError, formatAddress, stripAnsi } from '../utils/display.js';
6
+ export const findCommand = new Command('find')
7
+ .description('Find services by capability and reputation')
8
+ .argument('[query]', 'Search query (matches name, description, or capabilities)')
9
+ .option('--capability <cap>', 'Filter by specific capability')
10
+ .option('--type <type>', 'Filter by entity type (agent|service|infrastructure)')
11
+ .option('--min-rep <score>', 'Minimum reputation score (0-100)')
12
+ .option('--limit <n>', 'Maximum results', '10')
13
+ .action(async (query, _opts, cmd) => {
14
+ try {
15
+ const cliOpts = resolveOptions(cmd);
16
+ const localOpts = cmd.opts();
17
+ const serverUrl = cliOpts.serverUrl ?? 'https://api.azeth.ai';
18
+ const spinner = ora('Searching trust registry...').start();
19
+ const params = new URLSearchParams();
20
+ if (query)
21
+ params.set('capability', query);
22
+ if (localOpts.capability)
23
+ params.set('capability', localOpts.capability);
24
+ if (localOpts.type)
25
+ params.set('entityType', localOpts.type);
26
+ if (localOpts.minRep)
27
+ params.set('minReputation', localOpts.minRep);
28
+ params.set('limit', localOpts.limit);
29
+ const response = await fetch(`${serverUrl}/api/v1/registry/discover?${params}`, {
30
+ signal: AbortSignal.timeout(30_000),
31
+ });
32
+ if (!response.ok) {
33
+ spinner.stop();
34
+ printError(`Registry API returned ${response.status}`);
35
+ process.exit(1);
36
+ }
37
+ const MAX_BODY_SIZE = 1_048_576;
38
+ const contentLength = response.headers.get('content-length');
39
+ if (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) {
40
+ spinner.stop();
41
+ printError('Response body too large (Content-Length exceeds limit)');
42
+ process.exit(1);
43
+ }
44
+ const rawText = await response.text();
45
+ if (rawText.length > MAX_BODY_SIZE) {
46
+ spinner.stop();
47
+ printError('Response too large');
48
+ process.exit(1);
49
+ }
50
+ let rawBody;
51
+ try {
52
+ rawBody = JSON.parse(rawText);
53
+ }
54
+ catch {
55
+ spinner.stop();
56
+ printError('Invalid JSON from registry');
57
+ process.exit(1);
58
+ }
59
+ const results = validateResults(rawBody);
60
+ spinner.stop();
61
+ if (results.length === 0) {
62
+ printHeader('Search Results');
63
+ console.log(chalk.yellow(' No services found matching your criteria.'));
64
+ console.log(chalk.gray(' Try broader search terms or lower --min-rep.'));
65
+ return;
66
+ }
67
+ printHeader(`Found ${results.length} Service${results.length > 1 ? 's' : ''}`);
68
+ const widths = [8, 18, 12, 20, 30];
69
+ printTableHeader(['TOKEN', 'OWNER', 'TYPE', 'NAME', 'CAPABILITIES'], widths);
70
+ for (const entry of results) {
71
+ printTableRow([
72
+ stripAnsi(entry.tokenId.toString()),
73
+ formatAddress(stripAnsi(entry.owner)),
74
+ stripAnsi(entry.entityType),
75
+ stripAnsi(entry.name).slice(0, 20),
76
+ (entry.capabilities ?? []).map(c => stripAnsi(c)).join(', ').slice(0, 30),
77
+ ], widths);
78
+ }
79
+ console.log();
80
+ }
81
+ catch (err) {
82
+ printError(err instanceof Error ? err.message : String(err));
83
+ process.exit(1);
84
+ }
85
+ });
86
+ function validateResults(body) {
87
+ if (!body || typeof body !== 'object')
88
+ return [];
89
+ const obj = body;
90
+ if (!Array.isArray(obj.data))
91
+ return [];
92
+ return obj.data.filter((e) => e !== null &&
93
+ typeof e === 'object' &&
94
+ typeof e.tokenId === 'string' &&
95
+ typeof e.name === 'string');
96
+ }
97
+ //# sourceMappingURL=find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/commands/find.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,WAAW,SAoMpB,CAAC"}