@obolos_tech/cli 0.3.3 → 0.5.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 (72) hide show
  1. package/README.md +35 -1
  2. package/dist/commands/anp.d.ts +277 -0
  3. package/dist/commands/anp.js +440 -0
  4. package/dist/commands/anp.js.map +1 -0
  5. package/dist/commands/index.d.ts +3 -0
  6. package/dist/commands/index.js +34 -0
  7. package/dist/commands/index.js.map +1 -0
  8. package/dist/commands/jobs.d.ts +111 -0
  9. package/dist/commands/jobs.js +294 -0
  10. package/dist/commands/jobs.js.map +1 -0
  11. package/dist/commands/listings.d.ts +128 -0
  12. package/dist/commands/listings.js +246 -0
  13. package/dist/commands/listings.js.map +1 -0
  14. package/dist/commands/marketplace.d.ts +87 -0
  15. package/dist/commands/marketplace.js +133 -0
  16. package/dist/commands/marketplace.js.map +1 -0
  17. package/dist/commands/reputation.d.ts +27 -0
  18. package/dist/commands/reputation.js +114 -0
  19. package/dist/commands/reputation.js.map +1 -0
  20. package/dist/commands/setup.d.ts +78 -0
  21. package/dist/commands/setup.js +133 -0
  22. package/dist/commands/setup.js.map +1 -0
  23. package/dist/commands/wallet.d.ts +30 -0
  24. package/dist/commands/wallet.js +66 -0
  25. package/dist/commands/wallet.js.map +1 -0
  26. package/dist/index.d.ts +4 -24
  27. package/dist/index.js +61 -2516
  28. package/dist/index.js.map +1 -1
  29. package/dist/registry.d.ts +53 -0
  30. package/dist/registry.js +39 -0
  31. package/dist/registry.js.map +1 -0
  32. package/dist/runtime/acp.d.ts +162 -0
  33. package/dist/runtime/acp.js +132 -0
  34. package/dist/runtime/acp.js.map +1 -0
  35. package/dist/runtime/anp.d.ts +214 -0
  36. package/dist/runtime/anp.js +255 -0
  37. package/dist/runtime/anp.js.map +1 -0
  38. package/dist/runtime/argv.d.ts +18 -0
  39. package/dist/runtime/argv.js +114 -0
  40. package/dist/runtime/argv.js.map +1 -0
  41. package/dist/runtime/config.d.ts +14 -0
  42. package/dist/runtime/config.js +34 -0
  43. package/dist/runtime/config.js.map +1 -0
  44. package/dist/runtime/dispatch.d.ts +13 -0
  45. package/dist/runtime/dispatch.js +123 -0
  46. package/dist/runtime/dispatch.js.map +1 -0
  47. package/dist/runtime/display.d.ts +21 -0
  48. package/dist/runtime/display.js +68 -0
  49. package/dist/runtime/display.js.map +1 -0
  50. package/dist/runtime/errors.d.ts +19 -0
  51. package/dist/runtime/errors.js +23 -0
  52. package/dist/runtime/errors.js.map +1 -0
  53. package/dist/runtime/http.d.ts +9 -0
  54. package/dist/runtime/http.js +36 -0
  55. package/dist/runtime/http.js.map +1 -0
  56. package/dist/runtime/output.d.ts +19 -0
  57. package/dist/runtime/output.js +12 -0
  58. package/dist/runtime/output.js.map +1 -0
  59. package/dist/runtime/payment.d.ts +21 -0
  60. package/dist/runtime/payment.js +91 -0
  61. package/dist/runtime/payment.js.map +1 -0
  62. package/dist/runtime/wallet.d.ts +32 -0
  63. package/dist/runtime/wallet.js +44 -0
  64. package/dist/runtime/wallet.js.map +1 -0
  65. package/dist/schema/json-schema.d.ts +10 -0
  66. package/dist/schema/json-schema.js +34 -0
  67. package/dist/schema/json-schema.js.map +1 -0
  68. package/dist/schema/zod-shape.d.ts +9 -0
  69. package/dist/schema/zod-shape.js +36 -0
  70. package/dist/schema/zod-shape.js.map +1 -0
  71. package/package.json +46 -4
  72. package/scripts/lint-stdout-purity.mjs +62 -0
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Job listing commands: list, info, create, bid, accept, cancel.
3
+ *
4
+ * Listings are the off-chain negotiation layer that sits in front of ACP.
5
+ * When a bid is accepted, the accept command can create an ACP job on-chain
6
+ * (best-effort; falls back to backend-only).
7
+ */
8
+ import { defineCommand } from '../registry.js';
9
+ import { userError } from '../runtime/errors.js';
10
+ import { getAccount } from '../runtime/wallet.js';
11
+ import { createJobOnChain, ZERO_ADDRESS } from '../runtime/acp.js';
12
+ import { c, statusColor, formatDate, shortenAddr, shortenId } from '../runtime/display.js';
13
+ async function walletHeader(config) {
14
+ if (!config.privateKey)
15
+ throw userError('No wallet configured. Run `obolos setup`.');
16
+ const acc = await getAccount(config);
17
+ return { 'x-wallet-address': acc.address };
18
+ }
19
+ // ─── listing.list ───────────────────────────────────────────────────────────
20
+ export const listingListCmd = defineCommand({
21
+ name: 'listing.list',
22
+ summary: 'Browse open job listings.',
23
+ input: {
24
+ status: { type: 'string', description: 'Filter by status', enum: ['open', 'negotiating', 'accepted', 'cancelled'] },
25
+ client: { type: 'string', description: 'Filter by client address' },
26
+ limit: { type: 'number', description: 'Max results', default: 20 },
27
+ },
28
+ examples: ['obolos listing list --status=open'],
29
+ mcp: { expose: true, readOnly: true },
30
+ async run(input, ctx) {
31
+ const params = new URLSearchParams();
32
+ if (input.status)
33
+ params.set('status', String(input.status));
34
+ if (input.client)
35
+ params.set('client', String(input.client));
36
+ params.set('limit', String(input.limit));
37
+ const data = await ctx.http.get(`/api/listings?${params}`);
38
+ return { listings: data.listings || data.data || [], total: data.pagination?.total ?? 0 };
39
+ },
40
+ format(out) {
41
+ if (out.listings.length === 0)
42
+ return `${c.yellow}No listings found.${c.reset}`;
43
+ const lines = [
44
+ '', `${c.bold}${c.cyan}Job Listings${c.reset} ${c.dim}— ${out.total} listings${c.reset}`, '',
45
+ ];
46
+ for (const l of out.listings) {
47
+ const min = l.min_budget != null ? `$${Number(l.min_budget).toFixed(2)}` : '?';
48
+ const max = l.max_budget != null ? `$${Number(l.max_budget).toFixed(2)}` : '?';
49
+ lines.push(` ${shortenId(l.id).padEnd(12)} ${(l.title || 'Untitled').slice(0, 26).padEnd(28)} ${statusColor((l.status || 'open').padEnd(12))} ${(min + '-' + max).padEnd(20)} bids:${l.bid_count ?? l.bids?.length ?? 0} ${shortenAddr(l.client_address || l.client)}`);
50
+ }
51
+ return lines.join('\n');
52
+ },
53
+ });
54
+ // ─── listing.info ───────────────────────────────────────────────────────────
55
+ export const listingInfoCmd = defineCommand({
56
+ name: 'listing.info',
57
+ summary: 'Get listing details and all bids.',
58
+ input: { id: { type: 'string', description: 'Listing id', positional: 0, required: true } },
59
+ examples: ['obolos listing info abc123'],
60
+ mcp: { expose: true, readOnly: true },
61
+ async run(input, ctx) {
62
+ const data = await ctx.http.get(`/api/listings/${encodeURIComponent(String(input.id))}`);
63
+ return data.listing || data;
64
+ },
65
+ format(l) {
66
+ const lines = [
67
+ '', `${c.bold}${c.cyan}${l.title || 'Untitled Listing'}${c.reset}`,
68
+ `${c.dim}${'─'.repeat(60)}${c.reset}`,
69
+ ` ${c.bold}ID:${c.reset} ${l.id}`,
70
+ ` ${c.bold}Status:${c.reset} ${statusColor(l.status || 'open')}`,
71
+ ` ${c.bold}Client:${c.reset} ${l.client_address || '—'}`,
72
+ ];
73
+ if (l.min_budget != null || l.max_budget != null) {
74
+ const min = l.min_budget != null ? `$${Number(l.min_budget).toFixed(2)}` : '?';
75
+ const max = l.max_budget != null ? `$${Number(l.max_budget).toFixed(2)}` : '?';
76
+ lines.push(` ${c.bold}Budget:${c.reset} ${c.green}${min} – ${max} USDC${c.reset}`);
77
+ }
78
+ if (l.deadline)
79
+ lines.push(` ${c.bold}Deadline:${c.reset} ${formatDate(l.deadline)}`);
80
+ if (l.description)
81
+ lines.push('', ` ${l.description}`);
82
+ const bids = l.bids || [];
83
+ if (bids.length > 0) {
84
+ lines.push('', ` ${c.bold}Bids (${bids.length})${c.reset}`);
85
+ for (const b of bids) {
86
+ const price = b.price != null ? `$${Number(b.price).toFixed(2)}` : '—';
87
+ lines.push(` ${shortenId(b.id)} ${shortenAddr(b.provider_address)} ${c.green}${price}${c.reset} ${b.delivery_time ? b.delivery_time + 'h' : ''} ${c.dim}${(b.message || '').slice(0, 40)}${c.reset}`);
88
+ }
89
+ }
90
+ return lines.join('\n');
91
+ },
92
+ });
93
+ // ─── listing.create ─────────────────────────────────────────────────────────
94
+ export const listingCreateCmd = defineCommand({
95
+ name: 'listing.create',
96
+ summary: 'Post a job listing for agents to bid on.',
97
+ input: {
98
+ title: { type: 'string', description: 'Listing title', required: true },
99
+ description: { type: 'string', description: 'Detailed description' },
100
+ 'min-budget': { type: 'number', description: 'Minimum budget in USDC' },
101
+ 'max-budget': { type: 'number', description: 'Maximum budget in USDC' },
102
+ deadline: { type: 'string', description: 'Bidding deadline ("7d", ISO date)' },
103
+ duration: { type: 'number', description: 'Expected job duration in hours' },
104
+ evaluator: { type: 'string', description: 'Preferred evaluator address' },
105
+ hook: { type: 'string', description: 'Hook contract address' },
106
+ },
107
+ examples: [`obolos listing create --title "Parse CSV" --max-budget 10 --deadline 7d`],
108
+ mcp: { expose: true, destructive: true },
109
+ async run(input, ctx) {
110
+ const headers = await walletHeader(ctx.config);
111
+ const payload = { title: input.title };
112
+ if (input.description)
113
+ payload.description = input.description;
114
+ if (input['min-budget'] != null)
115
+ payload.min_budget = input['min-budget'];
116
+ if (input['max-budget'] != null)
117
+ payload.max_budget = input['max-budget'];
118
+ if (input.deadline)
119
+ payload.deadline = input.deadline;
120
+ if (input.duration)
121
+ payload.job_duration = input.duration;
122
+ if (input.evaluator)
123
+ payload.preferred_evaluator = input.evaluator;
124
+ if (input.hook)
125
+ payload.hook_address = input.hook;
126
+ const data = await ctx.http.post('/api/listings', payload, headers);
127
+ return data.listing || data;
128
+ },
129
+ format(l) {
130
+ return ['', `${c.green}Listing created.${c.reset}`,
131
+ ` ${c.bold}ID:${c.reset} ${l.id}`,
132
+ ` ${c.bold}Status:${c.reset} ${statusColor(l.status || 'open')}`,
133
+ '', `${c.dim}Providers can bid: obolos listing bid ${l.id} --price 5.00${c.reset}`].join('\n');
134
+ },
135
+ });
136
+ // ─── listing.bid ────────────────────────────────────────────────────────────
137
+ export const listingBidCmd = defineCommand({
138
+ name: 'listing.bid',
139
+ summary: 'Submit a bid on a listing.',
140
+ input: {
141
+ id: { type: 'string', description: 'Listing id', positional: 0, required: true },
142
+ price: { type: 'number', description: 'Your price in USDC', required: true },
143
+ delivery: { type: 'number', description: 'Delivery time in hours' },
144
+ message: { type: 'string', description: 'Pitch to the client' },
145
+ 'proposal-hash': { type: 'string', description: 'Hash of detailed proposal' },
146
+ },
147
+ examples: [`obolos listing bid abc123 --price 5.00 --delivery 24 --message "Can do in 12h"`],
148
+ mcp: { expose: true, destructive: true },
149
+ async run(input, ctx) {
150
+ const headers = await walletHeader(ctx.config);
151
+ const payload = { price: input.price };
152
+ if (input.delivery)
153
+ payload.delivery_time = input.delivery;
154
+ if (input.message)
155
+ payload.message = input.message;
156
+ if (input['proposal-hash'])
157
+ payload.proposal_hash = input['proposal-hash'];
158
+ const data = await ctx.http.post(`/api/listings/${encodeURIComponent(String(input.id))}/bid`, payload, headers);
159
+ return { bid: data.bid || data, price: input.price, delivery: input.delivery, message: input.message };
160
+ },
161
+ format(out) {
162
+ const lines = ['', `${c.green}Bid submitted.${c.reset}`,
163
+ ` ${c.bold}Bid ID:${c.reset} ${out.bid.id}`,
164
+ ` ${c.bold}Price:${c.reset} ${c.green}$${Number(out.price).toFixed(2)} USDC${c.reset}`];
165
+ if (out.delivery)
166
+ lines.push(` ${c.bold}Delivery:${c.reset} ${out.delivery}h`);
167
+ return lines.join('\n');
168
+ },
169
+ });
170
+ // ─── listing.accept ────────────────────────────────────────────────────────
171
+ export const listingAcceptCmd = defineCommand({
172
+ name: 'listing.accept',
173
+ summary: 'Accept a bid (auto-creates an ACP job on-chain).',
174
+ input: {
175
+ id: { type: 'string', description: 'Listing id', positional: 0, required: true },
176
+ bid: { type: 'string', description: 'Bid id to accept', required: true },
177
+ },
178
+ examples: ['obolos listing accept abc123 --bid bid456'],
179
+ mcp: { expose: true, destructive: true },
180
+ async run(input, ctx) {
181
+ const headers = await walletHeader(ctx.config);
182
+ const listingData = await ctx.http.get(`/api/listings/${encodeURIComponent(String(input.id))}`);
183
+ const listing = listingData.listing || listingData;
184
+ const acceptedBid = (listing.bids || []).find((b) => b.id === input.bid);
185
+ let chainJobId = null, chainTxHash = null, warning = null;
186
+ if (acceptedBid && ctx.config.privateKey) {
187
+ try {
188
+ const clientAddr = (await getAccount(ctx.config)).address;
189
+ const durationHours = acceptedBid.delivery_time || listing.job_duration || 168;
190
+ const expiredAt = Math.floor((Date.now() + durationHours * 3600000) / 1000);
191
+ const description = `${listing.title}: ${listing.description || ''}`.slice(0, 500);
192
+ const result = await createJobOnChain(ctx.config, {
193
+ provider: acceptedBid.provider_address || ZERO_ADDRESS,
194
+ evaluator: listing.preferred_evaluator || clientAddr,
195
+ expiredAt,
196
+ description,
197
+ });
198
+ chainJobId = result.chainJobId;
199
+ chainTxHash = result.txHash;
200
+ }
201
+ catch (err) {
202
+ warning = `On-chain job creation failed: ${err.message}`;
203
+ }
204
+ }
205
+ const payload = { bid_id: input.bid };
206
+ if (chainJobId)
207
+ payload.acp_job_id = chainJobId;
208
+ if (chainTxHash)
209
+ payload.chain_tx_hash = chainTxHash;
210
+ const data = await ctx.http.post(`/api/listings/${encodeURIComponent(String(input.id))}/accept`, payload, headers);
211
+ return { listing: data.listing || data, jobId: data.job_id, chainJobId, chainTxHash, warning };
212
+ },
213
+ format(out) {
214
+ const lines = ['', `${c.green}Bid accepted.${c.reset}`];
215
+ if (out.warning)
216
+ lines.push(`${c.yellow}${out.warning}${c.reset}`);
217
+ if (out.jobId)
218
+ lines.push(` ${c.bold}Job ID:${c.reset} ${out.jobId}`);
219
+ if (out.chainJobId)
220
+ lines.push(` ${c.bold}Chain ID:${c.reset} ${out.chainJobId}`);
221
+ if (out.chainTxHash)
222
+ lines.push(` ${c.bold}Tx:${c.reset} ${c.cyan}${out.chainTxHash}${c.reset}`);
223
+ lines.push('', `${c.dim}Next: obolos job fund ${out.jobId || '<job-id>'}${c.reset}`);
224
+ return lines.join('\n');
225
+ },
226
+ });
227
+ // ─── listing.cancel ────────────────────────────────────────────────────────
228
+ export const listingCancelCmd = defineCommand({
229
+ name: 'listing.cancel',
230
+ summary: 'Cancel an open listing.',
231
+ input: { id: { type: 'string', description: 'Listing id', positional: 0, required: true } },
232
+ examples: ['obolos listing cancel abc123'],
233
+ mcp: { expose: true, destructive: true },
234
+ async run(input, ctx) {
235
+ const headers = await walletHeader(ctx.config);
236
+ const data = await ctx.http.post(`/api/listings/${encodeURIComponent(String(input.id))}/cancel`, {}, headers);
237
+ return data.listing || data;
238
+ },
239
+ format(l) {
240
+ return `${c.yellow}Listing cancelled.${c.reset} ${c.bold}Status:${c.reset} ${statusColor(l.status || 'cancelled')}`;
241
+ },
242
+ });
243
+ export const listingCommands = [
244
+ listingListCmd, listingInfoCmd, listingCreateCmd, listingBidCmd, listingAcceptCmd, listingCancelCmd,
245
+ ];
246
+ //# sourceMappingURL=listings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listings.js","sourceRoot":"","sources":["../../src/commands/listings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Marketplace commands — first group ported to the registry pattern.
3
+ *
4
+ * Each export is a Command<InputSchema, Output> that:
5
+ * - run() : calls runtime/http, returns structured data
6
+ * - format() : pretty-prints for human stdout
7
+ *
8
+ * The runtime chooses which to use based on --json / source=mcp.
9
+ */
10
+ import type { Command } from '../registry.js';
11
+ interface ApiListing {
12
+ id: string;
13
+ name: string;
14
+ price_per_call: number;
15
+ category: string;
16
+ api_type?: string;
17
+ slug?: string;
18
+ }
19
+ interface SearchOutput {
20
+ apis: ApiListing[];
21
+ total: number;
22
+ query: string | null;
23
+ }
24
+ export declare const searchCmd: Command<{
25
+ query: {
26
+ type: "string";
27
+ description: string;
28
+ positional: number;
29
+ };
30
+ category: {
31
+ type: "string";
32
+ description: string;
33
+ };
34
+ limit: {
35
+ type: "number";
36
+ description: string;
37
+ default: number;
38
+ };
39
+ type: {
40
+ type: "string";
41
+ description: string;
42
+ enum: string[];
43
+ default: string;
44
+ };
45
+ }, SearchOutput>;
46
+ interface CategoriesOutput {
47
+ categories: Array<{
48
+ name: string;
49
+ count: number;
50
+ }>;
51
+ nativeCount: number;
52
+ externalCount: number;
53
+ }
54
+ export declare const categoriesCmd: Command<{}, CategoriesOutput>;
55
+ interface ApiInfoOutput {
56
+ id: string;
57
+ name: string;
58
+ api_type: string;
59
+ price_per_call: number;
60
+ http_method: string;
61
+ category: string;
62
+ seller_name: string;
63
+ total_calls: number;
64
+ average_rating?: number;
65
+ review_count?: number;
66
+ description?: string;
67
+ input_schema?: {
68
+ fields?: Record<string, {
69
+ type: string;
70
+ required?: boolean;
71
+ example?: unknown;
72
+ }>;
73
+ };
74
+ example_request?: string;
75
+ example_response?: string;
76
+ slug?: string;
77
+ }
78
+ export declare const infoCmd: Command<{
79
+ id: {
80
+ type: "string";
81
+ description: string;
82
+ positional: number;
83
+ required: true;
84
+ };
85
+ }, ApiInfoOutput>;
86
+ export declare const marketplaceCommands: Command[];
87
+ export {};
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Marketplace commands — first group ported to the registry pattern.
3
+ *
4
+ * Each export is a Command<InputSchema, Output> that:
5
+ * - run() : calls runtime/http, returns structured data
6
+ * - format() : pretty-prints for human stdout
7
+ *
8
+ * The runtime chooses which to use based on --json / source=mcp.
9
+ */
10
+ import { defineCommand } from '../registry.js';
11
+ import { userError } from '../runtime/errors.js';
12
+ const c = {
13
+ reset: '\x1b[0m', bold: '\x1b[1m', dim: '\x1b[2m',
14
+ green: '\x1b[32m', yellow: '\x1b[33m', cyan: '\x1b[36m', red: '\x1b[31m',
15
+ };
16
+ export const searchCmd = defineCommand({
17
+ name: 'search',
18
+ summary: 'Search the Obolos x402 marketplace for pay-per-call APIs.',
19
+ description: 'Returns APIs that AI agents can call with automatic USDC micropayments. ' +
20
+ 'Use this to find data services, AI endpoints, blockchain tools, and more.',
21
+ input: {
22
+ query: { type: 'string', description: 'Free-text query (e.g. "token price")', positional: 0 },
23
+ category: { type: 'string', description: 'Filter by category slug' },
24
+ limit: { type: 'number', description: 'Max results (default 25)', default: 25 },
25
+ type: { type: 'string', description: 'API type', enum: ['native', 'external', 'all'], default: 'native' },
26
+ },
27
+ examples: [
28
+ 'obolos search "token price"',
29
+ 'obolos search --category data --limit 10',
30
+ 'obolos search --json "weather"',
31
+ ],
32
+ mcp: { expose: true, readOnly: true },
33
+ async run(input, ctx) {
34
+ const params = new URLSearchParams();
35
+ if (input.query)
36
+ params.set('q', String(input.query));
37
+ if (input.category)
38
+ params.set('category', String(input.category));
39
+ params.set('limit', String(input.limit));
40
+ if (input.type !== 'all')
41
+ params.set('type', String(input.type));
42
+ const data = await ctx.http.get(`/api/marketplace/apis/search?${params}`);
43
+ return {
44
+ apis: data.apis,
45
+ total: data.pagination?.total ?? data.apis.length,
46
+ query: input.query ?? null,
47
+ };
48
+ },
49
+ format(out) {
50
+ if (out.apis.length === 0) {
51
+ return `${c.yellow}No APIs found${out.query ? ` for "${out.query}"` : ''}.${c.reset}`;
52
+ }
53
+ const lines = [
54
+ '',
55
+ `${c.bold}${c.cyan}Obolos Marketplace${c.reset} ${c.dim}— ${out.total} APIs found${c.reset}`,
56
+ '',
57
+ ];
58
+ for (const api of out.apis) {
59
+ const name = (api.name || 'Unnamed').slice(0, 50);
60
+ lines.push(` ${c.bold}${name}${c.reset}`);
61
+ lines.push(` ${c.green}$${api.price_per_call.toFixed(4)}${c.reset} ${c.dim}${api.category}${c.reset} ${c.cyan}${api.id}${c.reset}`);
62
+ lines.push('');
63
+ }
64
+ lines.push(`${c.dim}Use: obolos info <id> for details${c.reset}`);
65
+ return lines.join('\n');
66
+ },
67
+ });
68
+ export const categoriesCmd = defineCommand({
69
+ name: 'categories',
70
+ summary: 'List all API categories with counts.',
71
+ input: {},
72
+ examples: ['obolos categories', 'obolos categories --json'],
73
+ mcp: { expose: true, readOnly: true },
74
+ async run(_input, ctx) {
75
+ return ctx.http.get('/api/marketplace/categories');
76
+ },
77
+ format(out) {
78
+ const lines = ['', `${c.bold}${c.cyan}API Categories${c.reset}`, ''];
79
+ for (const cat of out.categories) {
80
+ const bar = '█'.repeat(Math.min(50, Math.ceil(cat.count / 5)));
81
+ lines.push(` ${cat.name.padEnd(25)} ${c.green}${String(cat.count).padStart(4)}${c.reset} ${c.dim}${bar}${c.reset}`);
82
+ }
83
+ lines.push('', ` ${c.bold}Total:${c.reset} ${out.nativeCount} native + ${out.externalCount} external`);
84
+ return lines.join('\n');
85
+ },
86
+ });
87
+ export const infoCmd = defineCommand({
88
+ name: 'info',
89
+ summary: 'Get full details for a specific API (schema, pricing, example).',
90
+ input: {
91
+ id: { type: 'string', description: 'API id (from search results)', positional: 0, required: true },
92
+ },
93
+ examples: ['obolos info ext-abc123', 'obolos info ext-abc123 --json'],
94
+ mcp: { expose: true, readOnly: true },
95
+ async run(input, ctx) {
96
+ if (!input.id)
97
+ throw userError('Missing api id');
98
+ return ctx.http.get(`/api/marketplace/apis/${encodeURIComponent(String(input.id))}`);
99
+ },
100
+ format(api, ctx) {
101
+ const lines = [
102
+ '',
103
+ `${c.bold}${c.cyan}${api.name}${c.reset}`,
104
+ `${c.dim}${'─'.repeat(60)}${c.reset}`,
105
+ ` ${c.bold}ID:${c.reset} ${api.id}`,
106
+ ` ${c.bold}Type:${c.reset} ${api.api_type}`,
107
+ ` ${c.bold}Price:${c.reset} ${c.green}$${api.price_per_call.toFixed(4)}${c.reset} USDC`,
108
+ ` ${c.bold}Method:${c.reset} ${api.http_method}`,
109
+ ` ${c.bold}Category:${c.reset} ${api.category}`,
110
+ ` ${c.bold}Seller:${c.reset} ${api.seller_name}`,
111
+ ` ${c.bold}Calls:${c.reset} ${api.total_calls}`,
112
+ ];
113
+ if (api.average_rating) {
114
+ lines.push(` ${c.bold}Rating:${c.reset} ${api.average_rating.toFixed(1)}/5 (${api.review_count} reviews)`);
115
+ }
116
+ if (api.description) {
117
+ lines.push('', ` ${c.bold}Description:${c.reset}`, ` ${api.description}`);
118
+ }
119
+ if (api.input_schema?.fields && Object.keys(api.input_schema.fields).length > 0) {
120
+ lines.push('', ` ${c.bold}Input Fields:${c.reset}`);
121
+ for (const [name, field] of Object.entries(api.input_schema.fields)) {
122
+ const req = field.required ? `${c.red}*${c.reset}` : ' ';
123
+ const ex = field.example ? `${c.dim}(e.g. ${JSON.stringify(field.example)})${c.reset}` : '';
124
+ lines.push(` ${req} ${c.cyan}${name}${c.reset}: ${field.type} ${ex}`);
125
+ }
126
+ }
127
+ lines.push('', ` ${c.bold}Call:${c.reset} obolos call ${api.id}${api.http_method === 'POST' ? " --body '{...}'" : ''}`);
128
+ lines.push(` ${c.bold}Proxy:${c.reset} ${ctx.config.apiUrl}/api/proxy/${api.id}`);
129
+ return lines.join('\n');
130
+ },
131
+ });
132
+ export const marketplaceCommands = [searchCmd, categoriesCmd, infoCmd];
133
+ //# sourceMappingURL=marketplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/commands/marketplace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Reputation commands: check, compare.
3
+ */
4
+ import type { Command } from '../registry.js';
5
+ export declare const reputationCheckCmd: Command<{
6
+ agentId: {
7
+ type: "string";
8
+ description: string;
9
+ positional: number;
10
+ required: true;
11
+ };
12
+ chain: {
13
+ type: "string";
14
+ description: string;
15
+ default: string;
16
+ };
17
+ }, any>;
18
+ export declare const reputationCompareCmd: Command<{
19
+ agents: {
20
+ type: "string";
21
+ description: string;
22
+ required: true;
23
+ };
24
+ }, {
25
+ results: any[];
26
+ }>;
27
+ export declare const reputationCommands: Command[];
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Reputation commands: check, compare.
3
+ */
4
+ import { defineCommand } from '../registry.js';
5
+ import { userError } from '../runtime/errors.js';
6
+ const c = {
7
+ reset: '\x1b[0m', bold: '\x1b[1m', dim: '\x1b[2m',
8
+ green: '\x1b[32m', yellow: '\x1b[33m', cyan: '\x1b[36m', red: '\x1b[31m', gray: '\x1b[90m',
9
+ };
10
+ function scoreBar(score) {
11
+ const pct = Math.max(0, Math.min(100, Math.round(score)));
12
+ const filled = Math.floor(pct / 5);
13
+ const color = pct >= 70 ? c.green : pct >= 40 ? c.yellow : c.red;
14
+ return `${color}${'█'.repeat(filled)}${c.dim}${'░'.repeat(20 - filled)}${c.reset} ${String(pct).padStart(3)}/100`;
15
+ }
16
+ function tierColor(tier) {
17
+ switch ((tier || '').toLowerCase()) {
18
+ case 'trusted':
19
+ case 'high': return `${c.green}${tier}${c.reset}`;
20
+ case 'medium':
21
+ case 'ok': return `${c.yellow}${tier}${c.reset}`;
22
+ case 'low':
23
+ case 'unverified': return `${c.red}${tier}${c.reset}`;
24
+ default: return `${c.gray}${tier}${c.reset}`;
25
+ }
26
+ }
27
+ function verdict(pass) {
28
+ return pass ? `${c.green}PASS${c.reset}` : `${c.red}FAIL${c.reset}`;
29
+ }
30
+ export const reputationCheckCmd = defineCommand({
31
+ name: 'reputation.check',
32
+ summary: 'Check agent trust score across reputation providers.',
33
+ input: {
34
+ agentId: { type: 'string', description: 'Agent id (numeric)', positional: 0, required: true },
35
+ chain: { type: 'string', description: 'Chain slug', default: 'base' },
36
+ },
37
+ examples: ['obolos reputation check 16907', 'obolos rep check 16907 --chain ethereum'],
38
+ mcp: { expose: true, readOnly: true },
39
+ async run(input, ctx) {
40
+ if (!input.agentId)
41
+ throw userError('Missing agentId');
42
+ return ctx.http.get(`/api/anp/reputation/${encodeURIComponent(String(input.agentId))}?chain=${encodeURIComponent(String(input.chain))}`);
43
+ },
44
+ format(data) {
45
+ const combined = data.combined || {};
46
+ const lines = [
47
+ '',
48
+ `${c.bold}${c.cyan}Reputation Report${c.reset} ${c.dim}Agent ${data.agentId ?? ''}${c.reset}`,
49
+ `${c.dim}${'─'.repeat(60)}${c.reset}`,
50
+ ` ${c.bold}Combined Score:${c.reset} ${scoreBar(combined.score ?? 0)}`,
51
+ ` ${c.bold}Tier:${c.reset} ${tierColor(combined.tier ?? 'unknown')}`,
52
+ ` ${c.bold}Verdict:${c.reset} ${verdict(combined.pass ?? false)}`,
53
+ ` ${c.bold}Chain:${c.reset} ${data.chain ?? ''}`,
54
+ ];
55
+ if (data.address)
56
+ lines.push(` ${c.bold}Address:${c.reset} ${data.address}`);
57
+ if (combined.hasSybilFlags)
58
+ lines.push('', ` ${c.red}${c.bold}⚠ Sybil flags detected${c.reset}`);
59
+ for (const s of data.scores ?? []) {
60
+ lines.push('', ` ${c.bold}${s.provider}${c.reset}`);
61
+ lines.push(` Score: ${scoreBar(s.score ?? 0)}`);
62
+ lines.push(` Tier: ${tierColor(s.tier ?? 'unknown')}`);
63
+ lines.push(` Verdict: ${verdict(s.pass ?? false)}`);
64
+ }
65
+ return lines.join('\n');
66
+ },
67
+ });
68
+ export const reputationCompareCmd = defineCommand({
69
+ name: 'reputation.compare',
70
+ summary: 'Compare reputation for multiple agents in parallel.',
71
+ description: 'Pass agent ids as positional args. Optional prefix with chain: `ethereum:456 base:123`.',
72
+ input: {
73
+ agents: { type: 'string', description: 'Space-separated agent ids (prefix chain with "chain:")', required: true },
74
+ },
75
+ examples: ['obolos rep compare "123 456 789"', 'obolos rep compare "base:123 ethereum:456"'],
76
+ mcp: { expose: true, readOnly: true },
77
+ async run(input, ctx) {
78
+ const tokens = String(input.agents).trim().split(/\s+/).filter(Boolean);
79
+ if (tokens.length < 2)
80
+ throw userError('Provide at least 2 agent ids');
81
+ const parsed = tokens.map(t => {
82
+ const parts = t.split(':');
83
+ const id = Number(parts.length === 2 ? parts[1] : parts[0]);
84
+ if (Number.isNaN(id))
85
+ throw userError(`Invalid agent id: ${t}`);
86
+ return { agentId: id, chain: parts.length === 2 ? parts[0] : 'base' };
87
+ });
88
+ const results = await Promise.all(parsed.map(a => ctx.http.get(`/api/anp/reputation/${a.agentId}?chain=${encodeURIComponent(a.chain)}`)
89
+ .then(r => ({ ...r, _input: a }))
90
+ .catch(err => ({ _input: a, error: err.message }))));
91
+ return { results: results.sort((a, b) => (b.combined?.score ?? -1) - (a.combined?.score ?? -1)) };
92
+ },
93
+ format(out) {
94
+ const lines = [
95
+ '',
96
+ `${c.bold}${c.cyan}Reputation Comparison${c.reset}`,
97
+ `${c.dim}${'─'.repeat(70)}${c.reset}`,
98
+ ];
99
+ out.results.forEach((r, i) => {
100
+ const rank = `${i + 1}.`.padEnd(4);
101
+ const agent = String(r._input.agentId).padEnd(10);
102
+ const chain = r._input.chain.padEnd(10);
103
+ if (r.error) {
104
+ lines.push(` ${rank}${agent}${chain}${c.red}Error: ${r.error}${c.reset}`);
105
+ return;
106
+ }
107
+ const combined = r.combined || {};
108
+ lines.push(` ${rank}${agent}${chain}${scoreBar(combined.score ?? 0)} ${tierColor(combined.tier ?? 'unknown')} ${verdict(combined.pass ?? false)}`);
109
+ });
110
+ return lines.join('\n');
111
+ },
112
+ });
113
+ export const reputationCommands = [reputationCheckCmd, reputationCompareCmd];
114
+ //# sourceMappingURL=reputation.js.map