agentcash 0.3.2 → 0.3.4
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/dist/cjs/run-server.cjs +995 -711
- package/dist/esm/chunk-CZBCIWYU.js +48 -0
- package/dist/esm/chunk-CZBCIWYU.js.map +1 -0
- package/dist/esm/{chunk-ZVDFFTHM.js → chunk-FJSHGCIM.js} +2 -2
- package/dist/esm/{chunk-VZL5QWWM.js → chunk-GCS3RSLB.js} +6 -4
- package/dist/esm/chunk-GCS3RSLB.js.map +1 -0
- package/dist/esm/chunk-GIYROB7O.js +210 -0
- package/dist/esm/chunk-GIYROB7O.js.map +1 -0
- package/dist/esm/{chunk-VX2WPSZV.js → chunk-KD2ZZXT7.js} +2 -43
- package/dist/esm/chunk-KD2ZZXT7.js.map +1 -0
- package/dist/esm/{chunk-BTIVASGJ.js → chunk-MOO4ZEGR.js} +3 -3
- package/dist/esm/{chunk-E3MKYUQQ.js → chunk-NQNMVKGY.js} +8 -201
- package/dist/esm/chunk-NQNMVKGY.js.map +1 -0
- package/dist/esm/{commands-IANPQPZS.js → commands-DUIGMEXV.js} +12 -9
- package/dist/esm/commands-DUIGMEXV.js.map +1 -0
- package/dist/esm/{fund-H6QAHY62.js → fund-Y2STNDHA.js} +5 -4
- package/dist/esm/{fund-H6QAHY62.js.map → fund-Y2STNDHA.js.map} +1 -1
- package/dist/esm/index.js +9 -9
- package/dist/esm/{install-KLEATNEC.js → install-GFY4JNNJ.js} +8 -6
- package/dist/esm/install-GFY4JNNJ.js.map +1 -0
- package/dist/esm/lib-DIhoN8bW.d.ts +115 -0
- package/dist/esm/lib.d.ts +3 -0
- package/dist/esm/lib.js +11 -0
- package/dist/esm/lib.js.map +1 -0
- package/dist/esm/{server-XNUVCZTJ.js → server-7D6YY3KG.js} +36 -17
- package/dist/esm/server-7D6YY3KG.js.map +1 -0
- package/dist/esm/shared/operations/index.d.ts +12 -120
- package/dist/esm/shared/operations/index.js +8 -5
- package/package.json +14 -7
- package/dist/esm/chunk-E3MKYUQQ.js.map +0 -1
- package/dist/esm/chunk-VX2WPSZV.js.map +0 -1
- package/dist/esm/chunk-VZL5QWWM.js.map +0 -1
- package/dist/esm/commands-IANPQPZS.js.map +0 -1
- package/dist/esm/install-KLEATNEC.js.map +0 -1
- package/dist/esm/server-XNUVCZTJ.js.map +0 -1
- /package/dist/esm/{chunk-ZVDFFTHM.js.map → chunk-FJSHGCIM.js.map} +0 -0
- /package/dist/esm/{chunk-BTIVASGJ.js.map → chunk-MOO4ZEGR.js.map} +0 -0
|
@@ -1,21 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
MCP_VERSION
|
|
3
|
-
} from "./chunk-ZVDFFTHM.js";
|
|
4
1
|
import {
|
|
5
2
|
err,
|
|
6
|
-
fetchErr,
|
|
7
|
-
fetchOk,
|
|
8
|
-
getBalance,
|
|
9
|
-
getBaseUrl,
|
|
10
|
-
getDepositLink,
|
|
11
3
|
log,
|
|
12
4
|
ok,
|
|
13
5
|
resultFromPromise,
|
|
14
6
|
resultFromThrowable,
|
|
15
7
|
safeFetch,
|
|
16
|
-
safeFetchJson,
|
|
17
8
|
safeParseResponse
|
|
18
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-KD2ZZXT7.js";
|
|
19
10
|
|
|
20
11
|
// src/shared/openapi-cache.ts
|
|
21
12
|
var specCache = /* @__PURE__ */ new Map();
|
|
@@ -235,6 +226,9 @@ async function discoverResources(surface, url) {
|
|
|
235
226
|
});
|
|
236
227
|
}
|
|
237
228
|
|
|
229
|
+
// src/shared/operations/check-endpoint.ts
|
|
230
|
+
import { x402Client, x402HTTPClient } from "@x402/core/client";
|
|
231
|
+
|
|
238
232
|
// src/shared/neverthrow/x402/index.ts
|
|
239
233
|
import { createSIWxPayload } from "@x402/extensions/sign-in-with-x";
|
|
240
234
|
var errorType = "x402";
|
|
@@ -289,153 +283,10 @@ var safeCreateSIWxPayload = (surface, serverInfo, signer) => {
|
|
|
289
283
|
);
|
|
290
284
|
};
|
|
291
285
|
|
|
292
|
-
// src/shared/operations/fetch-with-payment.ts
|
|
293
|
-
function createFetchWithPayment(surface, client) {
|
|
294
|
-
return async (request) => {
|
|
295
|
-
const clonedRequest = request.clone();
|
|
296
|
-
const probeResult = await safeFetch(surface, request);
|
|
297
|
-
if (probeResult.isErr()) {
|
|
298
|
-
return fetchErr(surface, probeResult.error);
|
|
299
|
-
}
|
|
300
|
-
if (probeResult.value.status !== 402) {
|
|
301
|
-
return probeResult.andThen(
|
|
302
|
-
(response2) => fetchOk({
|
|
303
|
-
response: response2,
|
|
304
|
-
paymentPayload: void 0
|
|
305
|
-
})
|
|
306
|
-
);
|
|
307
|
-
}
|
|
308
|
-
const response = probeResult.value;
|
|
309
|
-
const paymentRequiredResult = await safeGetPaymentRequired(
|
|
310
|
-
surface,
|
|
311
|
-
client,
|
|
312
|
-
response
|
|
313
|
-
);
|
|
314
|
-
if (paymentRequiredResult.isErr()) {
|
|
315
|
-
return paymentRequiredResult;
|
|
316
|
-
}
|
|
317
|
-
const paymentRequired = paymentRequiredResult.value;
|
|
318
|
-
const paymentPayloadResult = await safeCreatePaymentPayload(
|
|
319
|
-
surface,
|
|
320
|
-
client,
|
|
321
|
-
paymentRequired
|
|
322
|
-
);
|
|
323
|
-
if (paymentPayloadResult.isErr()) {
|
|
324
|
-
return paymentPayloadResult;
|
|
325
|
-
}
|
|
326
|
-
const paymentPayload = paymentPayloadResult.value;
|
|
327
|
-
const paymentHeaders = client.encodePaymentSignatureHeader(paymentPayload);
|
|
328
|
-
if (clonedRequest.headers.has("PAYMENT-SIGNATURE") || clonedRequest.headers.has("X-PAYMENT")) {
|
|
329
|
-
return x402Err(surface, {
|
|
330
|
-
cause: "payment_already_attempted",
|
|
331
|
-
message: "Payment already attempted"
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
for (const [key, value] of Object.entries(paymentHeaders)) {
|
|
335
|
-
clonedRequest.headers.set(key, value);
|
|
336
|
-
}
|
|
337
|
-
clonedRequest.headers.set(
|
|
338
|
-
"Access-Control-Expose-Headers",
|
|
339
|
-
"PAYMENT-RESPONSE,X-PAYMENT-RESPONSE"
|
|
340
|
-
);
|
|
341
|
-
return await safeFetch(surface, clonedRequest).andThen(
|
|
342
|
-
(response2) => x402Ok({
|
|
343
|
-
response: response2,
|
|
344
|
-
paymentPayload
|
|
345
|
-
})
|
|
346
|
-
);
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
// src/shared/operations/wallet-info.ts
|
|
351
|
-
import { formatUnits } from "viem";
|
|
352
|
-
|
|
353
|
-
// src/shared/tempo.ts
|
|
354
|
-
import { createPublicClient, defineChain, http } from "viem";
|
|
355
|
-
var TEMPO_CHAIN_ID = Number(process.env.TEMPO_CHAIN_ID ?? 42431);
|
|
356
|
-
var TEMPO_RPC_URL = process.env.TEMPO_RPC_URL ?? "https://tempo-moderato.g.alchemy.com/v2/GCnF4KF-qMTaDYNxAOMSC";
|
|
357
|
-
var TEMPO_CHAIN_NAME = process.env.TEMPO_CHAIN_NAME ?? "Tempo";
|
|
358
|
-
var TEMPO_TOKEN_ADDRESS = process.env.TEMPO_TOKEN_ADDRESS ?? "0x20c0000000000000000000000000000000000001";
|
|
359
|
-
function getTempoChainId() {
|
|
360
|
-
return TEMPO_CHAIN_ID;
|
|
361
|
-
}
|
|
362
|
-
function getTempoRpcUrl() {
|
|
363
|
-
return TEMPO_RPC_URL;
|
|
364
|
-
}
|
|
365
|
-
function getTempoChainName() {
|
|
366
|
-
return TEMPO_CHAIN_NAME;
|
|
367
|
-
}
|
|
368
|
-
function getTempoTokenAddress() {
|
|
369
|
-
return TEMPO_TOKEN_ADDRESS;
|
|
370
|
-
}
|
|
371
|
-
var tempoChain = defineChain({
|
|
372
|
-
id: TEMPO_CHAIN_ID,
|
|
373
|
-
name: TEMPO_CHAIN_NAME,
|
|
374
|
-
nativeCurrency: { name: "TEMPO", symbol: "TEMPO", decimals: 18 },
|
|
375
|
-
rpcUrls: {
|
|
376
|
-
default: { http: [TEMPO_RPC_URL] }
|
|
377
|
-
}
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
// src/shared/tempo-balance.ts
|
|
381
|
-
var MPPSCAN_BASE = "https://mppscan.com";
|
|
382
|
-
async function getTempoBalance({
|
|
383
|
-
address,
|
|
384
|
-
tokenAddress
|
|
385
|
-
}) {
|
|
386
|
-
const url = `${MPPSCAN_BASE}/api/balance/${address}`;
|
|
387
|
-
const res = await fetch(url, {
|
|
388
|
-
method: "GET",
|
|
389
|
-
headers: { accept: "application/json" }
|
|
390
|
-
});
|
|
391
|
-
if (!res.ok) {
|
|
392
|
-
throw new Error(`mppscan balance request failed: ${res.status}`);
|
|
393
|
-
}
|
|
394
|
-
const data = await res.json();
|
|
395
|
-
return {
|
|
396
|
-
chainId: getTempoChainId(),
|
|
397
|
-
chainName: getTempoChainName(),
|
|
398
|
-
balance: BigInt(data.balance),
|
|
399
|
-
tokenAddress
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// src/shared/operations/wallet-info.ts
|
|
404
|
-
async function getWalletInfo(surface, address, flags) {
|
|
405
|
-
const [balanceResult, tempoResult] = await Promise.all([
|
|
406
|
-
getBalance({ address, flags, surface }),
|
|
407
|
-
getTempoBalance({ address, tokenAddress: getTempoTokenAddress() }).then((r) => Number(formatUnits(r.balance, 6))).catch((e) => {
|
|
408
|
-
log.info(`Failed to fetch Tempo balance: ${e}`);
|
|
409
|
-
return null;
|
|
410
|
-
})
|
|
411
|
-
]);
|
|
412
|
-
if (balanceResult.isErr()) {
|
|
413
|
-
return balanceResult;
|
|
414
|
-
}
|
|
415
|
-
const baseBalance = balanceResult.value.balance;
|
|
416
|
-
const tempoBalance = tempoResult ?? 0;
|
|
417
|
-
const totalBalance = baseBalance + tempoBalance;
|
|
418
|
-
const chains = [
|
|
419
|
-
{ chain: "Base", balance: baseBalance },
|
|
420
|
-
{ chain: "Tempo", balance: tempoBalance }
|
|
421
|
-
];
|
|
422
|
-
return ok({
|
|
423
|
-
address,
|
|
424
|
-
balance: totalBalance,
|
|
425
|
-
chains,
|
|
426
|
-
isNewWallet: totalBalance === 0,
|
|
427
|
-
depositLink: getDepositLink(address, flags),
|
|
428
|
-
...totalBalance < 2.5 && totalBalance > 0 ? { message: "Your balance is low. Consider topping it up" } : {}
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// src/shared/operations/check-endpoint.ts
|
|
433
|
-
import { x402Client, x402HTTPClient } from "@x402/core/client";
|
|
434
|
-
|
|
435
286
|
// src/shared/token.ts
|
|
436
|
-
import { formatUnits
|
|
287
|
+
import { formatUnits } from "viem";
|
|
437
288
|
var tokenStringToNumber = (amount, decimals = 6) => {
|
|
438
|
-
return Number(
|
|
289
|
+
return Number(formatUnits(BigInt(amount), decimals));
|
|
439
290
|
};
|
|
440
291
|
|
|
441
292
|
// src/server/lib/x402-extensions.ts
|
|
@@ -511,43 +362,6 @@ async function checkEndpoint(surface, request) {
|
|
|
511
362
|
});
|
|
512
363
|
}
|
|
513
364
|
|
|
514
|
-
// src/shared/operations/report-error.ts
|
|
515
|
-
import { z } from "zod";
|
|
516
|
-
async function submitErrorReport(surface, input, address, dev) {
|
|
517
|
-
const telemetryResult = await safeFetchJson(
|
|
518
|
-
surface,
|
|
519
|
-
new Request(`${getBaseUrl(dev)}/api/telemetry`, {
|
|
520
|
-
method: "POST",
|
|
521
|
-
headers: {
|
|
522
|
-
"Content-Type": "application/json"
|
|
523
|
-
},
|
|
524
|
-
body: JSON.stringify({
|
|
525
|
-
tool: input.tool,
|
|
526
|
-
summary: input.summary,
|
|
527
|
-
errorMessage: input.errorMessage,
|
|
528
|
-
resource: input.resource,
|
|
529
|
-
stack: input.stack,
|
|
530
|
-
fullReport: input.fullReport,
|
|
531
|
-
walletAddress: address,
|
|
532
|
-
mcpVersion: MCP_VERSION,
|
|
533
|
-
reportedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
534
|
-
})
|
|
535
|
-
}),
|
|
536
|
-
z.object({
|
|
537
|
-
reportId: z.string()
|
|
538
|
-
})
|
|
539
|
-
);
|
|
540
|
-
if (telemetryResult.isErr()) {
|
|
541
|
-
return telemetryResult;
|
|
542
|
-
}
|
|
543
|
-
const { reportId } = telemetryResult.value;
|
|
544
|
-
return ok({
|
|
545
|
-
submitted: true,
|
|
546
|
-
reportId,
|
|
547
|
-
message: "Error report submitted successfully. The agentcash team will investigate."
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
|
|
551
365
|
export {
|
|
552
366
|
tokenStringToNumber,
|
|
553
367
|
x402Ok,
|
|
@@ -561,15 +375,8 @@ export {
|
|
|
561
375
|
getOriginIndex,
|
|
562
376
|
getIndexEntry,
|
|
563
377
|
discoverResources,
|
|
564
|
-
createFetchWithPayment,
|
|
565
|
-
getTempoChainId,
|
|
566
|
-
getTempoRpcUrl,
|
|
567
|
-
getTempoTokenAddress,
|
|
568
|
-
getTempoBalance,
|
|
569
|
-
getWalletInfo,
|
|
570
378
|
getInputSchema,
|
|
571
379
|
getSiwxExtension,
|
|
572
|
-
checkEndpoint
|
|
573
|
-
submitErrorReport
|
|
380
|
+
checkEndpoint
|
|
574
381
|
};
|
|
575
|
-
//# sourceMappingURL=chunk-
|
|
382
|
+
//# sourceMappingURL=chunk-NQNMVKGY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/openapi-cache.ts","../../src/shared/operations/discover.ts","../../src/shared/operations/check-endpoint.ts","../../src/shared/neverthrow/x402/index.ts","../../src/shared/token.ts","../../src/server/lib/x402-extensions.ts"],"sourcesContent":["import { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { safeFetch } from './neverthrow/fetch';\nimport { log } from './log';\n\nimport type { JsonObject, JsonValue } from './neverthrow/json/types';\n\nexport interface EndpointSummary {\n path: string; // \"/api/apollo/people/search\"\n method: string; // \"POST\"\n summary: string; // \"Search for people by name, email, or domain\"\n price?: string; // \"$0.02\" — from x-payment-info, advisory only\n protocols?: string[]; // [\"x402\", \"mpp\"] — from x-payment-info\n}\n\n/**\n * In-memory cache for OpenAPI specs per origin.\n * Populated during discovery or on-demand when check_endpoint needs schema info.\n */\nconst specCache = new Map<string, JsonObject>();\n\n/**\n * Fetch and cache an OpenAPI spec for an origin.\n * Tries multiple well-known locations in order.\n */\nexport async function fetchOpenApiSpec(\n origin: string\n): Promise<JsonObject | null> {\n const cached = specCache.get(origin);\n if (cached) return cached;\n\n const uniqueUrls = [\n `${origin}/openapi.json`,\n `${origin}/.well-known/openapi.json`,\n `${origin}/.well-known/x402`,\n `${origin}/.well-known/mpp`,\n ];\n\n for (const url of uniqueUrls) {\n log.debug(`Fetching OpenAPI spec from: ${url}`);\n const fetchResult = await safeFetch(\n 'fetchOpenApiSpec',\n new Request(url, { headers: { Accept: 'application/json' } })\n );\n\n if (fetchResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI spec from: ${url}`);\n continue;\n }\n\n const response = fetchResult.value;\n if (!response.ok) continue;\n\n const jsonResult = await resultFromPromise(\n 'json',\n 'fetchOpenApiSpec',\n response.json() as Promise<JsonObject>,\n () => ({\n cause: 'parse' as const,\n message: `Failed to parse JSON from: ${url}`,\n })\n );\n\n if (jsonResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI spec from: ${url}`);\n continue;\n }\n\n const spec = jsonResult.value;\n\n // Basic validation - must have paths\n if (spec && typeof spec === 'object' && spec.paths) {\n specCache.set(origin, spec);\n log.info(`Cached OpenAPI spec for origin: ${origin}`);\n return spec;\n }\n }\n\n log.debug(`No OpenAPI spec found for origin: ${origin}`);\n return null;\n}\n\n/**\n * Resolve a JSON $ref pointer within the spec.\n * Only supports local refs: \"#/components/schemas/Foo\"\n */\nfunction resolveRef(\n spec: JsonObject,\n ref: string,\n seen: Set<string>\n): JsonValue | undefined {\n if (!ref.startsWith('#/')) return undefined;\n if (seen.has(ref)) return { $circular: ref } as unknown as JsonValue;\n seen.add(ref);\n\n const parts = ref.slice(2).split('/');\n let current: JsonValue = spec;\n\n for (const part of parts) {\n if (\n current == null ||\n typeof current !== 'object' ||\n Array.isArray(current)\n )\n return undefined;\n const next: JsonValue | undefined = current[part];\n if (next === undefined) return undefined;\n current = next;\n }\n\n if (\n current != null &&\n typeof current === 'object' &&\n !Array.isArray(current)\n ) {\n return resolveRefs(spec, current, seen);\n }\n return current;\n}\n\n/**\n * Recursively resolve all $ref pointers in a JSON object.\n * Keeps it shallow enough to avoid context bloat - max depth 4.\n */\nfunction resolveRefs(\n spec: JsonObject,\n obj: JsonObject,\n seen: Set<string>,\n depth = 0\n): JsonObject {\n if (depth > 4) return obj;\n\n const result: JsonObject = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === '$ref' && typeof value === 'string') {\n const resolved = resolveRef(spec, value, seen);\n if (\n resolved != null &&\n typeof resolved === 'object' &&\n !Array.isArray(resolved)\n ) {\n Object.assign(result, resolved);\n } else {\n result[key] = value;\n }\n } else if (\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n result[key] = resolveRefs(spec, value, seen, depth + 1);\n } else if (Array.isArray(value)) {\n result[key] = value.map(item => {\n if (item != null && typeof item === 'object' && !Array.isArray(item)) {\n return resolveRefs(spec, item, seen, depth + 1);\n }\n return item;\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Normalize a URL path for matching against OpenAPI spec paths.\n * e.g. \"https://example.com/api/foo\" -> \"/api/foo\"\n */\nfunction extractPath(url: string, origin: string): string {\n if (url.startsWith(origin)) {\n return url.slice(origin.length) || '/';\n }\n return URL.canParse(url) ? new URL(url).pathname : url;\n}\n\n/**\n * Extract the schema for a specific endpoint from the OpenAPI spec.\n * Returns the operation object with resolved $refs, or null if not found.\n */\nexport async function getEndpointSchema(\n endpointUrl: string,\n method?: string\n): Promise<JsonObject | null> {\n if (!URL.canParse(endpointUrl)) return null;\n const origin = new URL(endpointUrl).origin;\n\n const spec = await fetchOpenApiSpec(origin);\n if (!spec) return null;\n\n const paths = spec.paths as JsonObject | undefined;\n if (!paths) return null;\n\n const path = extractPath(endpointUrl, origin);\n const httpMethod = (method ?? 'post').toLowerCase();\n\n // Try exact match first, then try path patterns\n let pathEntry = paths[path] as JsonObject | undefined;\n\n if (!pathEntry) {\n // Try matching against parameterized paths like /api/foo/{id}\n for (const [specPath, specEntry] of Object.entries(paths)) {\n if (specEntry == null || typeof specEntry !== 'object') continue;\n\n const pattern = specPath.replace(/\\{[^}]+\\}/g, '[^/]+');\n const regex = new RegExp(`^${pattern}$`);\n if (regex.test(path)) {\n pathEntry = specEntry as JsonObject;\n break;\n }\n }\n }\n\n if (!pathEntry) {\n log.debug(`No OpenAPI path entry found for: ${path}`);\n return null;\n }\n\n const operation = pathEntry[httpMethod] as JsonObject | undefined;\n if (!operation) {\n // If method not found, return all operations for this path\n const resolved = resolveRefs(spec, pathEntry, new Set());\n return { path, ...resolved };\n }\n\n const resolved = resolveRefs(spec, operation, new Set());\n return { path, method: httpMethod, ...resolved };\n}\n\n// ── Lightweight Endpoint Index ──\n\nconst indexCache = new Map<string, EndpointSummary[]>();\n\n/**\n * Lazily build a lightweight index for an origin.\n * Fetches the OpenAPI spec if not cached, then extracts\n * path + method + summary + x-payment-info for each operation.\n */\nexport async function getOriginIndex(\n origin: string\n): Promise<EndpointSummary[] | null> {\n const cached = indexCache.get(origin);\n if (cached) return cached;\n\n const spec = await fetchOpenApiSpec(origin);\n if (!spec?.paths) return null;\n\n const endpoints: EndpointSummary[] = [];\n for (const [path, methods] of Object.entries(\n spec.paths as Record<string, JsonObject>\n )) {\n for (const [method, operation] of Object.entries(methods)) {\n if (typeof operation === 'object' && operation !== null) {\n const op = operation as Record<string, unknown>;\n const paymentInfo = op['x-payment-info'] as\n | Record<string, unknown>\n | undefined;\n const entry: EndpointSummary = {\n path,\n method: method.toUpperCase(),\n summary: (op.summary as string) || (op.description as string) || '',\n };\n if (paymentInfo?.price != null) {\n entry.price = `$${paymentInfo.price as number}`;\n }\n if (Array.isArray(paymentInfo?.protocols)) {\n entry.protocols = paymentInfo.protocols as string[];\n }\n endpoints.push(entry);\n }\n }\n }\n\n indexCache.set(origin, endpoints);\n return endpoints;\n}\n\n/**\n * Look up a single endpoint entry from the lightweight index cache.\n * Returns the matching EndpointSummary (with pricing hints) or undefined.\n * Synchronous — only checks what's already cached.\n */\nexport function getIndexEntry(\n origin: string,\n path: string,\n method: string\n): EndpointSummary | undefined {\n const entries = indexCache.get(origin);\n if (!entries) return undefined;\n\n const m = method.toUpperCase();\n return entries.find(e => e.path === path && e.method === m);\n}\n","import { ok, err } from '@agentcash/neverthrow';\nimport type { Result } from '@agentcash/neverthrow/types';\n\nimport { log } from '@/shared/log';\nimport { safeFetch, safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { fetchOpenApiSpec, getOriginIndex } from '@/shared/openapi-cache';\n\ninterface DiscoveredEndpoint {\n path: string;\n summary: string;\n price?: string;\n}\n\n/**\n * Discovery success result\n */\ninterface DiscoverySuccessResult {\n found: true;\n origin: string;\n source: 'openapi';\n endpoints: DiscoveredEndpoint[];\n instructions?: string;\n}\n\n/**\n * Discovery error with origin context\n */\ninterface DiscoveryError {\n cause: 'not_found';\n message: string;\n origin: string;\n}\n\nconst ERROR_TYPE = 'discovery';\n\n/**\n * Fetch llms.txt instructions from an origin (best-effort).\n */\nasync function fetchLlmsTxt(\n surface: string,\n origin: string\n): Promise<string | null> {\n const llmsTxtUrl = `${origin}/llms.txt`;\n log.debug(`Fetching llms.txt from: ${llmsTxtUrl}`);\n\n const result = await safeFetch(\n surface,\n new Request(llmsTxtUrl, { headers: { Accept: 'text/plain' } })\n );\n\n if (result.isErr()) return null;\n\n const parseResult = await safeParseResponse(surface, result.value);\n if (parseResult.isErr() || parseResult.value.type !== 'text') return null;\n\n return parseResult.value.data;\n}\n\n/**\n * Discover x402-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches llms.txt instructions.\n */\nexport async function discoverResources(\n surface: string,\n url: string\n): Promise<Result<DiscoverySuccessResult, DiscoveryError>> {\n const origin = URL.canParse(url) ? new URL(url).origin : url;\n\n log.info(`Discovering resources for origin: ${origin}`);\n\n // Fetch OpenAPI spec and llms.txt in parallel\n const [spec, instructions] = await Promise.all([\n fetchOpenApiSpec(origin),\n fetchLlmsTxt(surface, origin),\n ]);\n\n if (!spec?.paths) {\n return err(ERROR_TYPE, surface, {\n cause: 'not_found' as const,\n message: `No OpenAPI spec found for ${origin}. Tried: /openapi.json, /.well-known/openapi.json, /.well-known/x402, /.well-known/mpp`,\n origin,\n });\n }\n\n // Build the lightweight endpoint index\n const endpoints = await getOriginIndex(origin);\n\n if (!endpoints || endpoints.length === 0) {\n return err(ERROR_TYPE, surface, {\n cause: 'not_found' as const,\n message: `OpenAPI spec found for ${origin} but no endpoints extracted`,\n origin,\n });\n }\n\n log.info(`Found ${endpoints.length} endpoints for: ${origin}`);\n\n return ok<DiscoverySuccessResult>({\n found: true,\n origin,\n source: 'openapi',\n endpoints: endpoints.map(({ path, summary, price }) => ({\n path,\n summary,\n ...(price ? { price } : {}),\n })),\n ...(instructions ? { instructions } : {}),\n });\n}\n","import { ok } from '@agentcash/neverthrow';\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\n\nimport { log } from '@/shared/log';\nimport { safeFetch, safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { safeGetPaymentRequired } from '@/shared/neverthrow/x402';\nimport { tokenStringToNumber } from '@/shared/token';\nimport { getInputSchema } from '@/server/lib/x402-extensions';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { ParsedResponse } from '@/shared/neverthrow/fetch/types';\n\n/**\n * Check endpoint result for non-402 responses\n */\ninterface CheckEndpointFreeResult {\n requiresPayment: false;\n statusCode: number;\n parsedResponse: ParsedResponse;\n}\n\n/**\n * Check endpoint result for 402 responses\n */\ninterface CheckEndpointPaidResult {\n requiresPayment: true;\n statusCode: number;\n routeDetails: JsonObject;\n}\n\ntype CheckEndpointResult = CheckEndpointFreeResult | CheckEndpointPaidResult;\n\n/**\n * Check if an endpoint is x402-protected and get pricing/schema info.\n * Does not make any payment.\n */\nexport async function checkEndpoint(surface: string, request: Request) {\n log.info('Checking endpoint', request.url);\n\n const responseResult = await safeFetch(surface, request);\n\n if (responseResult.isErr()) {\n return responseResult;\n }\n\n const response = responseResult.value;\n\n // Non-402 error response - return for caller to handle\n if (!response.ok && response.status !== 402) {\n return responseResult;\n }\n\n // Non-402 success response\n if (response.status !== 402) {\n const parseResponseResult = await safeParseResponse(surface, response);\n if (parseResponseResult.isErr()) {\n return parseResponseResult;\n }\n\n return ok<CheckEndpointResult>({\n requiresPayment: false,\n statusCode: response.status,\n parsedResponse: parseResponseResult.value,\n });\n }\n\n // Parse 402 payment required response\n const client = new x402HTTPClient(new x402Client());\n\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n client,\n response\n );\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const { resource, extensions, accepts } = paymentRequiredResult.value;\n\n // Build routeDetails as a clean JsonObject\n const routeDetails: JsonObject = {\n ...resource,\n schema: getInputSchema(extensions) as JsonObject | null,\n paymentMethods: accepts.map(accept => ({\n price: tokenStringToNumber(accept.amount),\n network: accept.network,\n asset: accept.asset,\n })),\n };\n\n return ok<CheckEndpointResult>({\n requiresPayment: true,\n statusCode: response.status,\n routeDetails,\n });\n}\n","import {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\nimport { createSIWxPayload } from '@x402/extensions/sign-in-with-x';\n\nimport type { BaseX402Error } from './types';\nimport type { x402HTTPClient } from '@x402/core/http';\nimport type { PaymentRequired } from '@x402/core/types';\nimport type { CompleteSIWxInfo } from '@x402/extensions/sign-in-with-x';\nimport type { PrivateKeyAccount } from 'viem';\n\nconst errorType = 'x402';\n\nexport const x402Ok = <T>(value: T) => ok(value);\nexport const x402Err = (cause: string, error: BaseX402Error) =>\n err(errorType, cause, error);\n\nconst x402ResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseX402Error\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst x402ResultFromThrowable = <T>(\n surface: string,\n fn: () => T,\n error: (e: unknown) => BaseX402Error\n) => resultFromThrowable(errorType, surface, fn, error);\n\nexport const safeGetPaymentRequired = (\n surface: string,\n client: x402HTTPClient,\n response: Response\n) => {\n return x402ResultFromPromise(\n surface,\n response.json().then(\n json =>\n client.getPaymentRequiredResponse(\n name => response.headers.get(name),\n json\n ),\n () =>\n client.getPaymentRequiredResponse(name => response.headers.get(name))\n ),\n error => ({\n cause: 'parse_payment_required',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse payment required',\n })\n );\n};\n\nexport const safeCreatePaymentPayload = (\n surface: string,\n client: x402HTTPClient,\n paymentRequired: PaymentRequired\n) => {\n return x402ResultFromPromise(\n surface,\n client.createPaymentPayload(paymentRequired),\n error => ({\n cause: 'create_payment_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create payment payload',\n })\n );\n};\n\nexport const safeGetPaymentSettlement = (\n surface: string,\n client: x402HTTPClient,\n response: Response\n) => {\n return x402ResultFromThrowable(\n surface,\n () => client.getPaymentSettleResponse(name => response.headers.get(name)),\n error => ({\n cause: 'get_payment_settlement',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to get payment settlement',\n })\n );\n};\n\nexport const safeCreateSIWxPayload = (\n surface: string,\n serverInfo: CompleteSIWxInfo,\n signer: PrivateKeyAccount\n) => {\n return x402ResultFromPromise(\n surface,\n createSIWxPayload(serverInfo, signer),\n error => ({\n cause: 'create_siwx_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create SIWX payload',\n })\n );\n};\n","import { formatUnits } from 'viem';\n\nexport const tokenStringToNumber = (amount: string, decimals = 6) => {\n return Number(formatUnits(BigInt(amount), decimals));\n};\n","import type { PaymentRequired } from '@x402/core/types';\nimport type { DiscoveryExtension } from '@x402/extensions/bazaar';\nimport type {\n CompleteSIWxInfo,\n SIWxExtensionInfo,\n SupportedChain,\n} from '@x402/extensions/sign-in-with-x';\n\nconst getBazaarExtension = (extensions: PaymentRequired['extensions']) => {\n const { bazaar } = extensions ?? {};\n\n if (!bazaar) {\n return undefined;\n }\n\n return bazaar as DiscoveryExtension;\n};\n\nexport const getInputSchema = (extensions: PaymentRequired['extensions']) =>\n getBazaarExtension(extensions)?.schema.properties.input;\n\nexport const getSiwxExtension = (\n extensions: PaymentRequired['extensions']\n): CompleteSIWxInfo | undefined => {\n const siwx = extensions?.['sign-in-with-x'] as\n | { info?: SIWxExtensionInfo; supportedChains?: SupportedChain[] }\n | undefined;\n\n if (!siwx?.info) {\n return undefined;\n }\n\n // Pick the first EVM chain from supportedChains, falling back to defaults\n const chain = siwx.supportedChains?.find(c =>\n c.chainId.startsWith('eip155:')\n );\n\n return {\n ...siwx.info,\n chainId: chain?.chainId ?? 'eip155:8453',\n type: chain?.type ?? 'eip191',\n signatureScheme: chain?.signatureScheme,\n };\n};\n"],"mappings":"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","names":["resolved"]}
|
|
@@ -3,24 +3,27 @@ import {
|
|
|
3
3
|
requestSchema
|
|
4
4
|
} from "./chunk-XXKBL2AC.js";
|
|
5
5
|
import {
|
|
6
|
-
checkEndpoint,
|
|
7
6
|
createFetchWithPayment,
|
|
8
|
-
discoverResources,
|
|
9
7
|
getWalletInfo,
|
|
8
|
+
submitErrorReport
|
|
9
|
+
} from "./chunk-GIYROB7O.js";
|
|
10
|
+
import {
|
|
11
|
+
checkEndpoint,
|
|
12
|
+
discoverResources,
|
|
10
13
|
safeGetPaymentSettlement,
|
|
11
|
-
submitErrorReport,
|
|
12
14
|
tokenStringToNumber
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-NQNMVKGY.js";
|
|
16
|
+
import "./chunk-FJSHGCIM.js";
|
|
15
17
|
import {
|
|
16
18
|
DEFAULT_NETWORK,
|
|
17
19
|
getWallet,
|
|
18
20
|
redeemInviteCode,
|
|
19
21
|
safeParseJson
|
|
20
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-GCS3RSLB.js";
|
|
23
|
+
import "./chunk-CZBCIWYU.js";
|
|
21
24
|
import {
|
|
22
25
|
safeParseResponse
|
|
23
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-KD2ZZXT7.js";
|
|
24
27
|
import "./chunk-ISR6DJ53.js";
|
|
25
28
|
|
|
26
29
|
// src/cli/commands/fetch.ts
|
|
@@ -500,7 +503,7 @@ async function reportErrorCommand(args, flags) {
|
|
|
500
503
|
|
|
501
504
|
// src/cli/commands/server.ts
|
|
502
505
|
async function serverCommand(flags) {
|
|
503
|
-
const { startServer } = await import("./server-
|
|
506
|
+
const { startServer } = await import("./server-7D6YY3KG.js");
|
|
504
507
|
await startServer(flags);
|
|
505
508
|
}
|
|
506
509
|
export {
|
|
@@ -512,4 +515,4 @@ export {
|
|
|
512
515
|
walletInfoCommand,
|
|
513
516
|
walletRedeemCommand
|
|
514
517
|
};
|
|
515
|
-
//# sourceMappingURL=commands-
|
|
518
|
+
//# sourceMappingURL=commands-DUIGMEXV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/fetch.ts","../../src/cli/output/types.ts","../../src/cli/output/format.ts","../../src/cli/output/response.ts","../../src/cli/commands/lib/get-wallet-or-exit.ts","../../src/cli/commands/lib/parse-request-input.ts","../../src/cli/commands/check.ts","../../src/cli/commands/discover.ts","../../src/cli/commands/wallet.ts","../../src/cli/commands/report-error.ts","../../src/cli/commands/server.ts"],"sourcesContent":["import { randomBytes } from 'crypto';\n\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\nimport { ExactEvmScheme } from '@x402/evm/exact/client';\n\nimport {\n successResponse,\n errorResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { buildRequest } from '@/server/tools/lib/request';\nimport { DEFAULT_NETWORK } from '@/shared/networks';\nimport { tokenStringToNumber } from '@/shared/token';\nimport { safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { safeGetPaymentSettlement } from '@/shared/neverthrow/x402';\nimport { createFetchWithPayment } from '@/shared/operations';\nimport { getWalletOrExit, parseRequestInput } from './lib';\n\nimport type { GlobalFlags } from '@/types';\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\n\nconst SURFACE = 'cli:fetch';\n\ninterface FetchArgs {\n url: string;\n method?: string;\n body?: string;\n headers?: string;\n}\n\nexport async function fetchCommand(\n args: FetchArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n const sessionId = randomBytes(16).toString('hex');\n\n const input = parseRequestInput(SURFACE, args, flags);\n\n // Set up x402 client\n const coreClient = x402Client.fromConfig({\n schemes: [\n { network: DEFAULT_NETWORK, client: new ExactEvmScheme(account) },\n ],\n });\n\n const client = new x402HTTPClient(coreClient);\n\n const provider = flags.provider ?? account.address;\n\n const request = buildRequest({\n input,\n address: account.address,\n sessionId,\n provider,\n });\n\n const fetchWithPay = createFetchWithPayment(SURFACE, client);\n const fetchResult = await fetchWithPay(request);\n\n if (fetchResult.isErr()) {\n return outputAndExit(fromNeverthrowError(fetchResult), flags);\n }\n\n const { response, paymentPayload } = fetchResult.value;\n\n if (!response.ok) {\n const parseResult = await safeParseResponse(SURFACE, response);\n const details: JsonObject = { statusCode: response.status };\n if (parseResult.isOk()) {\n const { type } = parseResult.value;\n if (type === 'json') {\n details.body = parseResult.value.data;\n } else if (type === 'text') {\n details.body = parseResult.value.data;\n } else {\n details.bodyType = type;\n }\n }\n return outputAndExit(\n errorResponse({\n code: 'HTTP_ERROR',\n message: `HTTP ${response.status}: ${response.statusText}`,\n surface: SURFACE,\n cause: 'http',\n details,\n }),\n flags\n );\n }\n\n const parseResponseResult = await safeParseResponse(SURFACE, response);\n if (parseResponseResult.isErr()) {\n return outputAndExit(fromNeverthrowError(parseResponseResult), flags);\n }\n\n const settlementResult = safeGetPaymentSettlement(SURFACE, client, response);\n\n // Build response data\n const data =\n parseResponseResult.value.type === 'json'\n ? parseResponseResult.value.data\n : parseResponseResult.value.type === 'text'\n ? parseResponseResult.value.data\n : { type: parseResponseResult.value.type };\n\n // Build metadata\n const metadata =\n settlementResult.isOk() || paymentPayload !== undefined\n ? {\n ...(paymentPayload !== undefined\n ? {\n price: tokenStringToNumber(\n paymentPayload.accepted.amount\n ).toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n }),\n }\n : {}),\n ...(settlementResult.isOk()\n ? {\n payment: {\n success: settlementResult.value.success,\n transactionHash: settlementResult.value.transaction,\n },\n }\n : {}),\n }\n : undefined;\n\n outputAndExit(successResponse(data, metadata), flags);\n}\n","import type { JsonObject } from '@/shared/neverthrow/json/types';\n\n/**\n * Exit codes for CLI commands\n * Allows agents to programmatically determine error types\n */\nexport enum ExitCode {\n Success = 0,\n GeneralError = 1,\n InsufficientBalance = 2,\n NetworkError = 3,\n PaymentFailed = 4,\n InvalidInput = 5,\n}\n\n/**\n * Error codes for structured error responses\n */\nexport type ErrorCode =\n | 'GENERAL_ERROR'\n | 'INSUFFICIENT_BALANCE'\n | 'NETWORK_ERROR'\n | 'PAYMENT_FAILED'\n | 'INVALID_INPUT'\n | 'WALLET_ERROR'\n | 'PARSE_ERROR'\n | 'HTTP_ERROR'\n | 'X402_ERROR';\n\n/**\n * Maps error codes to exit codes\n */\nexport const errorCodeToExitCode: Record<ErrorCode, ExitCode> = {\n GENERAL_ERROR: ExitCode.GeneralError,\n INSUFFICIENT_BALANCE: ExitCode.InsufficientBalance,\n NETWORK_ERROR: ExitCode.NetworkError,\n PAYMENT_FAILED: ExitCode.PaymentFailed,\n INVALID_INPUT: ExitCode.InvalidInput,\n WALLET_ERROR: ExitCode.GeneralError,\n PARSE_ERROR: ExitCode.InvalidInput,\n HTTP_ERROR: ExitCode.NetworkError,\n X402_ERROR: ExitCode.PaymentFailed,\n};\n\n/**\n * Payment metadata included in successful paid responses\n */\nexport interface PaymentMetadata {\n success: boolean;\n transactionHash?: string;\n}\n\n/**\n * Metadata included in CLI responses\n */\nexport interface ResponseMetadata {\n price?: string;\n payment?: PaymentMetadata;\n}\n\n/**\n * Successful CLI response\n */\nexport interface CliSuccessResponse {\n success: true;\n data: JsonObject | string;\n metadata?: ResponseMetadata;\n}\n\n/**\n * Error details in CLI response\n */\nexport interface CliErrorDetails {\n code: ErrorCode;\n message: string;\n surface?: string;\n cause?: string;\n details?: JsonObject;\n}\n\n/**\n * Failed CLI response\n */\nexport interface CliErrorResponse {\n success: false;\n error: CliErrorDetails;\n}\n\n/**\n * Union type for all CLI responses\n */\nexport type CliResponse = CliSuccessResponse | CliErrorResponse;\n\n/**\n * Output format options\n */\nexport type OutputFormat = 'json' | 'pretty';\n","import type { OutputFormat } from './types';\n\n/**\n * Detect if stdout is a TTY (interactive terminal)\n */\nfunction isTTY(): boolean {\n return process.stdout.isTTY ?? false;\n}\n\n/**\n * Determine output format based on flags and environment\n * - Explicit --format flag takes precedence\n * - Non-TTY (piped) defaults to json\n * - TTY (interactive) defaults to pretty\n */\nexport function getOutputFormat(formatFlag?: string): OutputFormat {\n if (formatFlag === 'json' || formatFlag === 'pretty') {\n return formatFlag;\n }\n return isTTY() ? 'pretty' : 'json';\n}\n\n/**\n * Check if quiet mode is enabled (suppress stderr)\n */\nexport function isQuiet(quietFlag?: boolean): boolean {\n return quietFlag ?? false;\n}\n","import chalk from 'chalk';\n\nimport { getOutputFormat, isQuiet } from './format';\nimport {\n ExitCode,\n errorCodeToExitCode,\n type CliErrorDetails,\n type CliErrorResponse,\n type CliResponse,\n type CliSuccessResponse,\n type ErrorCode,\n type OutputFormat,\n type ResponseMetadata,\n} from './types';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { BaseError, Err } from '@agentcash/neverthrow/types';\n\n/**\n * Output flags that can be passed to commands\n */\nexport interface OutputFlags {\n format?: string;\n quiet?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create a success response\n */\nexport function successResponse(\n data: JsonObject | string,\n metadata?: ResponseMetadata\n): CliSuccessResponse {\n return {\n success: true,\n data,\n ...(metadata ? { metadata } : {}),\n };\n}\n\n/**\n * Create an error response\n */\nexport function errorResponse(error: CliErrorDetails): CliErrorResponse {\n return {\n success: false,\n error,\n };\n}\n\n/**\n * Convert a neverthrow error to a CLI error response\n */\nexport function fromNeverthrowError(\n err: Err<unknown, BaseError<string>>,\n codeOverride?: ErrorCode\n): CliErrorResponse {\n const { error } = err;\n const code = codeOverride ?? mapCauseToErrorCode(error.cause);\n\n return errorResponse({\n code,\n message: error.message,\n surface: error.surface,\n cause: error.cause,\n });\n}\n\n/**\n * Map error cause to error code\n */\nfunction mapCauseToErrorCode(cause: string): ErrorCode {\n switch (cause) {\n case 'network':\n return 'NETWORK_ERROR';\n case 'http':\n return 'HTTP_ERROR';\n case 'parse':\n return 'PARSE_ERROR';\n case 'insufficient_balance':\n return 'INSUFFICIENT_BALANCE';\n case 'payment_failed':\n case 'payment_already_attempted':\n return 'PAYMENT_FAILED';\n case 'invalid_input':\n case 'validation':\n return 'INVALID_INPUT';\n case 'wallet':\n case 'file_not_readable':\n return 'WALLET_ERROR';\n default:\n return 'GENERAL_ERROR';\n }\n}\n\n/**\n * Format response as JSON string\n */\nfunction formatJson(response: CliResponse): string {\n return JSON.stringify(response, null, 2);\n}\n\n/**\n * Format response as pretty output for TTY\n */\nfunction formatPretty(response: CliResponse): string {\n if (response.success) {\n const lines: string[] = [];\n\n // Data\n if (typeof response.data === 'string') {\n lines.push(response.data);\n } else {\n lines.push(JSON.stringify(response.data, null, 2));\n }\n\n // Metadata\n if (response.metadata) {\n lines.push('');\n if (response.metadata.price) {\n lines.push(chalk.dim(`Price: ${response.metadata.price}`));\n }\n if (response.metadata.payment) {\n const { success, transactionHash } = response.metadata.payment;\n lines.push(\n chalk.dim(\n `Payment: ${success ? chalk.green('✓') : chalk.red('✗')}${transactionHash ? ` (${transactionHash.slice(0, 10)}...)` : ''}`\n )\n );\n }\n }\n\n return lines.join('\\n');\n } else {\n const { error } = response;\n const lines = [\n chalk.red(`Error: ${error.message}`),\n chalk.dim(`Code: ${error.code}`),\n ];\n\n if (error.surface) {\n lines.push(chalk.dim(`Surface: ${error.surface}`));\n }\n if (error.cause) {\n lines.push(chalk.dim(`Cause: ${error.cause}`));\n }\n\n return lines.join('\\n');\n }\n}\n\n/**\n * Output a response to stdout and exit with appropriate code\n */\nexport function outputAndExit(\n response: CliResponse,\n flags: OutputFlags = {}\n): never {\n const format = getOutputFormat(flags.format);\n const quiet = isQuiet(flags.quiet);\n\n output(response, format, quiet);\n\n const exitCode = response.success\n ? ExitCode.Success\n : errorCodeToExitCode[response.error.code];\n\n process.exit(exitCode);\n}\n\n/**\n * Output a response to stdout without exiting\n */\nfunction output(\n response: CliResponse,\n format: OutputFormat = 'json',\n quiet = false\n): void {\n const formatted =\n format === 'json' ? formatJson(response) : formatPretty(response);\n\n // Always output to stdout (machine-readable)\n console.log(formatted);\n\n // Optionally suppress stderr output\n if (!quiet && !response.success && format === 'pretty') {\n // Additional debug info could go to stderr\n }\n}\n","import {\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\nimport { getWallet } from '@/shared/wallet';\n\nimport type { GlobalFlags } from '@/types';\nimport type { PrivateKeyAccount } from 'viem/accounts';\n\ninterface WalletInfo {\n account: PrivateKeyAccount;\n}\n\n/**\n * Get wallet or exit with error.\n * This function always returns a valid wallet - if getting the wallet fails,\n * it exits the process with an appropriate error.\n */\nexport async function getWalletOrExit(\n flags: GlobalFlags<OutputFlags>\n): Promise<WalletInfo> {\n const walletResult = await getWallet();\n\n if (walletResult.isErr()) {\n outputAndExit(fromNeverthrowError(walletResult, 'WALLET_ERROR'), flags);\n }\n\n return walletResult.value;\n}\n","import type { z } from 'zod';\n\nimport { errorResponse, outputAndExit, type OutputFlags } from '@/cli/output';\nimport { requestSchema } from '@/server/tools/lib/request';\nimport { safeParseJson } from '@/shared/neverthrow/json';\n\nimport type { GlobalFlags } from '@/types';\n\ninterface RawRequestArgs {\n url: string;\n method?: string;\n body?: string;\n headers?: string;\n}\n\ntype RequestInput = z.infer<typeof requestSchema>;\n\n/**\n * Parse and validate CLI request arguments into a typed RequestInput.\n * Exits with error response if parsing fails.\n */\nexport function parseRequestInput(\n surface: string,\n args: RawRequestArgs,\n flags: GlobalFlags<OutputFlags>\n): RequestInput {\n // Parse body JSON if provided\n let parsedBody: unknown;\n if (args.body) {\n const bodyResult = safeParseJson(surface, args.body);\n if (bodyResult.isErr()) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: `Invalid JSON body: ${args.body}`,\n surface,\n cause: 'invalid_json',\n }),\n flags\n );\n }\n parsedBody = bodyResult.value;\n }\n\n // Parse headers JSON if provided\n let parsedHeaders: Record<string, string> | undefined;\n if (args.headers) {\n const headersResult = safeParseJson(surface, args.headers);\n if (headersResult.isErr()) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: `Invalid JSON headers: ${args.headers}`,\n surface,\n cause: 'invalid_json',\n }),\n flags\n );\n }\n\n // Validate headers is an object with string values\n const headersValue = headersResult.value;\n if (\n typeof headersValue !== 'object' ||\n headersValue === null ||\n Array.isArray(headersValue)\n ) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: 'Headers must be an object',\n surface,\n cause: 'invalid_headers',\n }),\n flags\n );\n }\n\n // Validate all values are strings\n const headers: Record<string, string> = {};\n for (const [key, value] of Object.entries(headersValue)) {\n if (typeof value !== 'string') {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: `Header \"${key}\" must be a string, got ${typeof value}`,\n surface,\n cause: 'invalid_headers',\n }),\n flags\n );\n }\n headers[key] = value;\n }\n parsedHeaders = headers;\n }\n\n // Validate full request input\n const inputResult = requestSchema.safeParse({\n url: args.url,\n method: args.method ?? 'GET',\n body: parsedBody,\n headers: parsedHeaders ?? {},\n });\n\n if (!inputResult.success) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: inputResult.error.message,\n surface,\n cause: 'validation',\n }),\n flags\n );\n }\n\n return inputResult.data;\n}\n","import { randomBytes } from 'crypto';\n\nimport {\n successResponse,\n errorResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { buildRequest } from '@/server/tools/lib/request';\nimport { checkEndpoint } from '@/shared/operations';\nimport { safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { getWalletOrExit, parseRequestInput } from './lib';\n\nimport type { GlobalFlags } from '@/types';\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\n\nconst SURFACE = 'cli:check';\n\ninterface CheckArgs {\n url: string;\n method?: string;\n body?: string;\n headers?: string;\n}\n\nexport async function checkCommand(\n args: CheckArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n const sessionId = randomBytes(16).toString('hex');\n\n const input = parseRequestInput(SURFACE, args, flags);\n\n const request = buildRequest({\n input,\n address: account.address,\n sessionId,\n });\n\n const result = await checkEndpoint(SURFACE, request);\n\n if (result.isErr()) {\n return outputAndExit(fromNeverthrowError(result), flags);\n }\n\n const value = result.value;\n\n // Handle Response (non-ok HTTP response)\n if (value instanceof Response) {\n const response = value;\n const parseResult = await safeParseResponse(SURFACE, response);\n const details: JsonObject = { statusCode: response.status };\n if (parseResult.isOk()) {\n const { type } = parseResult.value;\n if (type === 'json') {\n details.body = parseResult.value.data;\n } else if (type === 'text') {\n details.body = parseResult.value.data;\n } else {\n details.bodyType = type;\n }\n }\n return outputAndExit(\n errorResponse({\n code: 'HTTP_ERROR',\n message: `HTTP ${response.status}: ${response.statusText}`,\n surface: SURFACE,\n cause: 'http',\n details,\n }),\n flags\n );\n }\n\n // Handle CheckEndpointPaidResult\n if ('requiresPayment' in value && value.requiresPayment) {\n return outputAndExit(\n successResponse({\n requiresPayment: true,\n statusCode: value.statusCode,\n routeDetails: value.routeDetails,\n }),\n flags\n );\n }\n\n // Handle CheckEndpointFreeResult\n if ('parsedResponse' in value) {\n const { parsedResponse } = value;\n const data =\n parsedResponse.type === 'json'\n ? parsedResponse.data\n : parsedResponse.type === 'text'\n ? parsedResponse.data\n : { type: parsedResponse.type };\n\n return outputAndExit(\n successResponse({\n requiresPayment: false,\n statusCode: value.statusCode,\n data,\n }),\n flags\n );\n }\n\n // Fallback - shouldn't reach here\n return outputAndExit(\n errorResponse({\n code: 'GENERAL_ERROR',\n message: 'Unexpected response format',\n surface: SURFACE,\n cause: 'unknown',\n }),\n flags\n );\n}\n","import {\n successResponse,\n errorResponse,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { discoverResources } from '@/shared/operations';\n\nimport type { GlobalFlags } from '@/types';\n\ninterface DiscoverArgs {\n url: string;\n}\n\nexport async function discoverCommand(\n args: DiscoverArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const result = await discoverResources('cli:discover', args.url);\n\n if (result.isOk()) {\n return outputAndExit(\n successResponse({\n found: true,\n origin: result.value.origin,\n source: result.value.source,\n endpoints: result.value.endpoints.map(e => ({ ...e })),\n ...(result.value.instructions\n ? { instructions: result.value.instructions }\n : {}),\n }),\n flags\n );\n }\n\n // Error case\n return outputAndExit(\n errorResponse({\n code: 'GENERAL_ERROR',\n message: result.error.message,\n surface: result.error.surface,\n cause: result.error.cause,\n details: { origin: result.error.origin },\n }),\n flags\n );\n}\n","import {\n successResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { getWalletInfo } from '@/shared/operations';\nimport { redeemInviteCode } from '@/shared/redeem-invite';\nimport { getWalletOrExit } from './lib';\n\nimport type { GlobalFlags } from '@/types';\n\nconst SURFACE = 'cli:wallet';\n\nexport async function walletInfoCommand(\n _args: object,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n\n const result = await getWalletInfo(SURFACE, account.address, flags);\n\n if (result.isErr()) {\n return outputAndExit(fromNeverthrowError(result), flags);\n }\n\n return outputAndExit(\n successResponse({\n address: result.value.address,\n balance: result.value.balance,\n chains: result.value.chains.map(c => ({\n chain: c.chain,\n balance: c.balance,\n })),\n isNewWallet: result.value.isNewWallet,\n depositLink: result.value.depositLink,\n ...(result.value.message ? { message: result.value.message } : {}),\n }),\n flags\n );\n}\n\ninterface WalletRedeemArgs {\n code: string;\n}\n\nexport async function walletRedeemCommand(\n args: WalletRedeemArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n\n const result = await redeemInviteCode({\n code: args.code,\n dev: flags.dev,\n address: account.address,\n surface: SURFACE,\n });\n\n if (result.isErr()) {\n return outputAndExit(fromNeverthrowError(result), flags);\n }\n\n return outputAndExit(\n successResponse({\n redeemed: true,\n amount: `${result.value.amount} USDC`,\n txHash: result.value.txHash,\n }),\n flags\n );\n}\n","import {\n successResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { submitErrorReport } from '@/shared/operations';\nimport { getWalletOrExit } from './lib';\n\nimport type { GlobalFlags } from '@/types';\n\nconst SURFACE = 'cli:report-error';\n\ninterface ReportErrorArgs {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: string;\n}\n\nexport async function reportErrorCommand(\n args: ReportErrorArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n\n const result = await submitErrorReport(\n SURFACE,\n {\n tool: args.tool,\n summary: args.summary,\n errorMessage: args.errorMessage,\n resource: args.resource,\n stack: args.stack,\n fullReport: args.fullReport,\n },\n account.address,\n flags.dev\n );\n\n if (result.isErr()) {\n return outputAndExit(fromNeverthrowError(result), flags);\n }\n\n return outputAndExit(\n successResponse({\n submitted: result.value.submitted,\n reportId: result.value.reportId,\n message: result.value.message,\n }),\n flags\n );\n}\n","import type { GlobalFlags } from '@/types';\n\n/**\n * Start the MCP server\n * This is a wrapper that imports and calls the existing server implementation\n */\nexport async function serverCommand(flags: GlobalFlags): Promise<void> {\n const { startServer } = await import('@/server');\n await startServer(flags);\n}\n"],"mappings":"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","names":["randomBytes","SURFACE","randomBytes","SURFACE","SURFACE"]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
promptDeposit
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MOO4ZEGR.js";
|
|
4
4
|
import {
|
|
5
5
|
getWallet
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GCS3RSLB.js";
|
|
7
|
+
import "./chunk-CZBCIWYU.js";
|
|
7
8
|
import {
|
|
8
9
|
log
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-KD2ZZXT7.js";
|
|
10
11
|
import "./chunk-ISR6DJ53.js";
|
|
11
12
|
|
|
12
13
|
// src/cli/fund/index.ts
|
|
@@ -30,4 +31,4 @@ var fundMcpServer = async (flags) => {
|
|
|
30
31
|
export {
|
|
31
32
|
fundMcpServer
|
|
32
33
|
};
|
|
33
|
-
//# sourceMappingURL=fund-
|
|
34
|
+
//# sourceMappingURL=fund-Y2STNDHA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/fund/index.ts"],"sourcesContent":["import type { Command } from '@/types';\nimport { intro, log as clackLog, outro } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { getWallet } from '@/shared/wallet';\nimport { promptDeposit } from '@/cli/lib/deposit';\nimport { log } from '@/shared/log';\n\nexport const fundMcpServer: Command = async flags => {\n intro(chalk.bold(`Fund ${chalk.hex('#2563eb')('agentcash MCP')}`));\n\n const walletResult = await getWallet();\n\n if (walletResult.isErr()) {\n log.error(walletResult.error.message);\n clackLog.error(walletResult.error.message);\n outro(chalk.bold.red('Failed to get wallet'));\n process.exit(1);\n }\n\n const {\n account: { address },\n } = walletResult.value;\n\n await promptDeposit({ address, flags, surface: 'fund' });\n\n outro(chalk.bold.green('Your agentcash MCP server is funded!'));\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/cli/fund/index.ts"],"sourcesContent":["import type { Command } from '@/types';\nimport { intro, log as clackLog, outro } from '@clack/prompts';\nimport chalk from 'chalk';\nimport { getWallet } from '@/shared/wallet';\nimport { promptDeposit } from '@/cli/lib/deposit';\nimport { log } from '@/shared/log';\n\nexport const fundMcpServer: Command = async flags => {\n intro(chalk.bold(`Fund ${chalk.hex('#2563eb')('agentcash MCP')}`));\n\n const walletResult = await getWallet();\n\n if (walletResult.isErr()) {\n log.error(walletResult.error.message);\n clackLog.error(walletResult.error.message);\n outro(chalk.bold.red('Failed to get wallet'));\n process.exit(1);\n }\n\n const {\n account: { address },\n } = walletResult.value;\n\n await promptDeposit({ address, flags, surface: 'fund' });\n\n outro(chalk.bold.green('Your agentcash MCP server is funded!'));\n};\n"],"mappings":";;;;;;;;;;;;;AACA,SAAS,OAAO,OAAO,UAAU,aAAa;AAC9C,OAAO,WAAW;AAKX,IAAM,gBAAyB,OAAM,UAAS;AACnD,QAAM,MAAM,KAAK,QAAQ,MAAM,IAAI,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;AAEjE,QAAM,eAAe,MAAM,UAAU;AAErC,MAAI,aAAa,MAAM,GAAG;AACxB,QAAI,MAAM,aAAa,MAAM,OAAO;AACpC,aAAS,MAAM,aAAa,MAAM,OAAO;AACzC,UAAM,MAAM,KAAK,IAAI,sBAAsB,CAAC;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM;AAAA,IACJ,SAAS,EAAE,QAAQ;AAAA,EACrB,IAAI,aAAa;AAEjB,QAAM,cAAc,EAAE,SAAS,OAAO,SAAS,OAAO,CAAC;AAEvD,QAAM,MAAM,KAAK,MAAM,sCAAsC,CAAC;AAChE;","names":[]}
|
package/dist/esm/index.js
CHANGED
|
@@ -69,7 +69,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
69
69
|
description: "Additional headers as JSON object"
|
|
70
70
|
}),
|
|
71
71
|
async (args) => {
|
|
72
|
-
const { fetchCommand } = await import("./commands-
|
|
72
|
+
const { fetchCommand } = await import("./commands-DUIGMEXV.js");
|
|
73
73
|
await fetchCommand(
|
|
74
74
|
{
|
|
75
75
|
url: args.url,
|
|
@@ -103,7 +103,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
103
103
|
description: "Additional headers as JSON object"
|
|
104
104
|
}),
|
|
105
105
|
async (args) => {
|
|
106
|
-
const { checkCommand } = await import("./commands-
|
|
106
|
+
const { checkCommand } = await import("./commands-DUIGMEXV.js");
|
|
107
107
|
await checkCommand(
|
|
108
108
|
{
|
|
109
109
|
url: args.url,
|
|
@@ -123,7 +123,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
123
123
|
demandOption: true
|
|
124
124
|
}),
|
|
125
125
|
async (args) => {
|
|
126
|
-
const { discoverCommand } = await import("./commands-
|
|
126
|
+
const { discoverCommand } = await import("./commands-DUIGMEXV.js");
|
|
127
127
|
await discoverCommand({ url: args.url }, args);
|
|
128
128
|
}
|
|
129
129
|
).command(
|
|
@@ -134,7 +134,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
134
134
|
"Get wallet address, balance, and deposit link",
|
|
135
135
|
(yargs3) => yargs3,
|
|
136
136
|
async (args) => {
|
|
137
|
-
const { walletInfoCommand } = await import("./commands-
|
|
137
|
+
const { walletInfoCommand } = await import("./commands-DUIGMEXV.js");
|
|
138
138
|
await walletInfoCommand({}, args);
|
|
139
139
|
}
|
|
140
140
|
).command(
|
|
@@ -146,7 +146,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
146
146
|
demandOption: true
|
|
147
147
|
}),
|
|
148
148
|
async (args) => {
|
|
149
|
-
const { walletRedeemCommand } = await import("./commands-
|
|
149
|
+
const { walletRedeemCommand } = await import("./commands-DUIGMEXV.js");
|
|
150
150
|
await walletRedeemCommand({ code: args.code }, args);
|
|
151
151
|
}
|
|
152
152
|
).demandCommand(1, "You must specify a wallet subcommand").strict(),
|
|
@@ -178,7 +178,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
178
178
|
description: "Detailed report with context and repro steps"
|
|
179
179
|
}),
|
|
180
180
|
async (args) => {
|
|
181
|
-
const { reportErrorCommand } = await import("./commands-
|
|
181
|
+
const { reportErrorCommand } = await import("./commands-DUIGMEXV.js");
|
|
182
182
|
await reportErrorCommand(
|
|
183
183
|
{
|
|
184
184
|
tool: args.tool,
|
|
@@ -196,7 +196,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
196
196
|
"Start the MCP server (default when no command specified)",
|
|
197
197
|
(yargs2) => yargs2,
|
|
198
198
|
async (args) => {
|
|
199
|
-
const { serverCommand } = await import("./commands-
|
|
199
|
+
const { serverCommand } = await import("./commands-DUIGMEXV.js");
|
|
200
200
|
await serverCommand(args);
|
|
201
201
|
}
|
|
202
202
|
).command(
|
|
@@ -209,7 +209,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
209
209
|
default: isClaudeCode ? "claude-code" /* ClaudeCode */ : void 0
|
|
210
210
|
}),
|
|
211
211
|
async (args) => {
|
|
212
|
-
const { installMcpServer } = await import("./install-
|
|
212
|
+
const { installMcpServer } = await import("./install-GFY4JNNJ.js");
|
|
213
213
|
await installMcpServer(args);
|
|
214
214
|
}
|
|
215
215
|
).command(
|
|
@@ -217,7 +217,7 @@ void yargs(hideBin(process.argv)).scriptName("agentcash").usage("$0 [command] [o
|
|
|
217
217
|
"Open the funding page to add USDC to your wallet",
|
|
218
218
|
(yargs2) => yargs2,
|
|
219
219
|
async (args) => {
|
|
220
|
-
const { fundMcpServer } = await import("./fund-
|
|
220
|
+
const { fundMcpServer } = await import("./fund-Y2STNDHA.js");
|
|
221
221
|
await fundMcpServer(args);
|
|
222
222
|
}
|
|
223
223
|
).example(
|
|
@@ -4,23 +4,25 @@ import {
|
|
|
4
4
|
} from "./chunk-KPEJO3KV.js";
|
|
5
5
|
import {
|
|
6
6
|
DIST_TAG
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-FJSHGCIM.js";
|
|
8
8
|
import {
|
|
9
9
|
promptDeposit,
|
|
10
10
|
wait
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-MOO4ZEGR.js";
|
|
12
12
|
import {
|
|
13
13
|
getWallet,
|
|
14
14
|
redeemInviteCode
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-GCS3RSLB.js";
|
|
16
|
+
import {
|
|
17
|
+
getBalance
|
|
18
|
+
} from "./chunk-CZBCIWYU.js";
|
|
16
19
|
import {
|
|
17
20
|
err,
|
|
18
|
-
getBalance,
|
|
19
21
|
log,
|
|
20
22
|
resultFromThrowable,
|
|
21
23
|
safeReadFile,
|
|
22
24
|
safeWriteFile
|
|
23
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-KD2ZZXT7.js";
|
|
24
26
|
import "./chunk-ISR6DJ53.js";
|
|
25
27
|
|
|
26
28
|
// src/cli/install/index.ts
|
|
@@ -701,4 +703,4 @@ var installMcpServer = async (flags) => {
|
|
|
701
703
|
export {
|
|
702
704
|
installMcpServer
|
|
703
705
|
};
|
|
704
|
-
//# sourceMappingURL=install-
|
|
706
|
+
//# sourceMappingURL=install-GFY4JNNJ.js.map
|