@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
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 @@
|
|
|
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 @@
|
|
|
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":"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,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEnG,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,+DAA+D,CAAC;KAC5E,QAAQ,CAAC,OAAO,EAAE,4BAA4B,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,EAAE,KAAK,CAAC;KACvE,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;KAC5C,MAAM,CAAC,uBAAuB,EAAE,wCAAwC,CAAC;KACzE,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC3D,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAKtB,CAAC;QAEL,sBAAsB;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,UAAU,CAAC,qCAAqC,CAAC,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,oBAAoB,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gCAAgC;QAChC,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,CAAC,2BAA2B,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QAErC,OAAO,CAAC,IAAI,GAAG,WAAW,GAAG,KAAK,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;YACrC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3E,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,cAAc,EAAE,SAAS,CAAC,QAAQ;SACnC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACvC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,WAAW,CAAC,qBAAqB,CAAC,CAAC;QACnC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvB,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACvC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,UAAU,CAAC,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC;QACnC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAElF,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtD,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrE,UAAU,CAAC,QAAQ,EAAE,GAAG,aAAa,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,SAAS,CAAC;YAChC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACpE,8EAA8E;YAC9E,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC;gBACtF,UAAU,CAAC,wDAAwD,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;gBAChC,UAAU,CAAC,yBAAyB,CAAC,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACtE,oFAAoF;YACpF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAY,CAAC;oBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBAC9C,WAAW,CAAC,UAAU,CAAC,CAAC;oBACxB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;wBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;wBACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;oBAClF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,WAAW,CAAC,UAAU,CAAC,CAAC;oBACxB,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;wBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;oBAClF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,UAAU,CAAC,CAAC;gBACxB,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;gBAClF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YACD,YAAY,CAAC,8BAA8B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,yBAAyB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,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;AAEL,SAAS,SAAS,CAAC,KAAa;IAC9B,6EAA6E;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,QAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzE,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|