agentcash 0.6.5 → 0.6.6

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 (41) hide show
  1. package/dist/cjs/run-server.cjs +25 -25
  2. package/dist/esm/{check-endpoint-Df0YnKdr.d.ts → check-endpoint-UD2Ycr-4.d.ts} +1 -0
  3. package/dist/esm/chunk-33JE5MUU.js +7 -0
  4. package/dist/esm/{chunk-EYF7JMMC.js → chunk-6OZUZZIH.js} +3 -3
  5. package/dist/esm/{chunk-PLBNJ647.js → chunk-NQ5BLLN7.js} +16 -5
  6. package/dist/esm/chunk-NQ5BLLN7.js.map +1 -0
  7. package/dist/esm/{chunk-VUTE3VTW.js → chunk-P666EAQ2.js} +3 -3
  8. package/dist/esm/{chunk-WBLOSD2E.js → chunk-RFFZRGKI.js} +2 -3
  9. package/dist/esm/chunk-RFFZRGKI.js.map +1 -0
  10. package/dist/esm/{chunk-KPHAAIVC.js → chunk-SDQV56RE.js} +10 -2
  11. package/dist/esm/chunk-SDQV56RE.js.map +1 -0
  12. package/dist/esm/{chunk-5MGZ3UGG.js → chunk-TIP56JAT.js} +6 -2
  13. package/dist/esm/{chunk-5MGZ3UGG.js.map → chunk-TIP56JAT.js.map} +1 -1
  14. package/dist/esm/{chunk-W3V4VWAR.js → chunk-Z453AIOR.js} +2 -2
  15. package/dist/esm/{commands-5GTG7HKC.js → commands-JV2Z4T2M.js} +349 -11
  16. package/dist/esm/commands-JV2Z4T2M.js.map +1 -0
  17. package/dist/esm/{fund-WZGVUR2S.js → fund-RGWDV2M5.js} +3 -3
  18. package/dist/esm/index.js +26 -14
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/{install-A6TREGKW.js → install-IZ2IITSQ.js} +4 -5
  21. package/dist/esm/install-IZ2IITSQ.js.map +1 -0
  22. package/dist/esm/lib.d.ts +1 -1
  23. package/dist/esm/lib.js +5 -12
  24. package/dist/esm/lib.js.map +1 -1
  25. package/dist/esm/{server-4CN2V4WJ.js → server-SMGMX4NA.js} +11 -27
  26. package/dist/esm/server-SMGMX4NA.js.map +1 -0
  27. package/dist/esm/shared/operations/index.d.ts +1 -1
  28. package/dist/esm/shared/operations/index.js +4 -4
  29. package/package.json +3 -3
  30. package/dist/esm/chunk-F5ZDNWEA.js +0 -7
  31. package/dist/esm/chunk-KPHAAIVC.js.map +0 -1
  32. package/dist/esm/chunk-PLBNJ647.js.map +0 -1
  33. package/dist/esm/chunk-WBLOSD2E.js.map +0 -1
  34. package/dist/esm/commands-5GTG7HKC.js.map +0 -1
  35. package/dist/esm/install-A6TREGKW.js.map +0 -1
  36. package/dist/esm/server-4CN2V4WJ.js.map +0 -1
  37. /package/dist/esm/{chunk-F5ZDNWEA.js.map → chunk-33JE5MUU.js.map} +0 -0
  38. /package/dist/esm/{chunk-EYF7JMMC.js.map → chunk-6OZUZZIH.js.map} +0 -0
  39. /package/dist/esm/{chunk-VUTE3VTW.js.map → chunk-P666EAQ2.js.map} +0 -0
  40. /package/dist/esm/{chunk-W3V4VWAR.js.map → chunk-Z453AIOR.js.map} +0 -0
  41. /package/dist/esm/{fund-WZGVUR2S.js.map → fund-RGWDV2M5.js.map} +0 -0
@@ -34,10 +34,10 @@ var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__
34
34
  ));
35
35
  var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2);
36
36
 
37
- // ../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js
37
+ // ../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js
38
38
  var getImportMetaUrl, importMetaUrl;
39
39
  var init_cjs_shims = __esm({
40
- "../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js"() {
40
+ "../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js"() {
41
41
  "use strict";
42
42
  getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
43
43
  importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
@@ -104303,7 +104303,7 @@ var import_path2 = require("path");
104303
104303
  var import_url = require("url");
104304
104304
  function getVersion2() {
104305
104305
  if (true) {
104306
- return "0.6.5";
104306
+ return "0.6.6";
104307
104307
  }
104308
104308
  const __dirname3 = (0, import_path2.dirname)((0, import_url.fileURLToPath)(importMetaUrl));
104309
104309
  const pkg = JSON.parse(
@@ -104466,7 +104466,7 @@ var TEMPO_TOKEN_ADDRESS = "0x20c0000000000000000000000000000000000000";
104466
104466
 
104467
104467
  // src/shared/mpp-enabled.ts
104468
104468
  init_cjs_shims();
104469
- var isMppEnabled = () => "0.6.5".includes("-mpp");
104469
+ var isMppEnabled = () => "0.6.6".includes("-mpp");
104470
104470
 
104471
104471
  // src/shared/operations/fetch-with-payment.ts
104472
104472
  init_cjs_shims();
@@ -110991,6 +110991,19 @@ init_cjs_shims();
110991
110991
  // src/shared/redeem-invite.ts
110992
110992
  init_cjs_shims();
110993
110993
 
110994
+ // src/shared/origins.ts
110995
+ init_cjs_shims();
110996
+ var ORIGINS = [
110997
+ "https://stableenrich.dev" /* StableEnrich */,
110998
+ "https://stablesocial.dev" /* StableSocial */,
110999
+ "https://stablestudio.dev" /* StableStudio */,
111000
+ "https://stableupload.dev" /* StableUpload */,
111001
+ "https://stableemail.dev" /* StableEmail */,
111002
+ "https://x402scan.com" /* X402Scan */,
111003
+ "https://shirt.sh" /* Shirt */,
111004
+ "https://x402puppet.com" /* X402Puppet */
111005
+ ];
111006
+
110994
111007
  // src/shared/state.ts
110995
111008
  init_cjs_shims();
110996
111009
  var import_fs4 = __toESM(require("fs"), 1);
@@ -111020,7 +111033,6 @@ var setState = (state) => {
111020
111033
  // src/shared/redeem-invite.ts
111021
111034
  var redeemInviteCode = async ({
111022
111035
  code,
111023
- dev,
111024
111036
  address,
111025
111037
  surface: surface2
111026
111038
  }) => {
@@ -111033,7 +111045,7 @@ var redeemInviteCode = async ({
111033
111045
  }
111034
111046
  const result = await safeFetchJson(
111035
111047
  surface2,
111036
- new Request(`${getBaseUrl(dev)}/api/invite/redeem`, {
111048
+ new Request(`${"https://x402scan.com" /* X402Scan */}/api/invite/redeem`, {
111037
111049
  method: "POST",
111038
111050
  headers: {
111039
111051
  "Content-Type": "application/json"
@@ -111060,8 +111072,7 @@ var redeemInviteCode = async ({
111060
111072
  // src/server/tools/redeem-invite.ts
111061
111073
  var registerRedeemInviteTool = ({
111062
111074
  server,
111063
- account: { address },
111064
- flags
111075
+ account: { address }
111065
111076
  }) => {
111066
111077
  server.registerTool(
111067
111078
  "redeem_invite",
@@ -111089,7 +111100,6 @@ var registerRedeemInviteTool = ({
111089
111100
  async ({ code }) => {
111090
111101
  const result = await redeemInviteCode({
111091
111102
  code,
111092
- dev: flags.dev,
111093
111103
  address,
111094
111104
  surface: "redeem_invite"
111095
111105
  });
@@ -111216,19 +111226,6 @@ var registerTelemetryTools = ({
111216
111226
  // src/server/tools/discover-resources.ts
111217
111227
  init_cjs_shims();
111218
111228
 
111219
- // src/shared/origins.ts
111220
- init_cjs_shims();
111221
- var ORIGINS = [
111222
- "https://stableenrich.dev" /* StableEnrich */,
111223
- "https://stablesocial.dev" /* StableSocial */,
111224
- "https://stablestudio.dev" /* StableStudio */,
111225
- "https://stableupload.dev" /* StableUpload */,
111226
- "https://stableemail.dev" /* StableEmail */,
111227
- "https://x402scan.com" /* X402Scan */,
111228
- "https://shirt.sh" /* Shirt */,
111229
- "https://x402puppet.com" /* X402Puppet */
111230
- ];
111231
-
111232
111229
  // src/shared/operations/discover.ts
111233
111230
  init_cjs_shims();
111234
111231
  async function fetchLlmsTxt(surface2, origin) {
@@ -111246,6 +111243,9 @@ async function fetchLlmsTxt(surface2, origin) {
111246
111243
  return parseResult.value.data;
111247
111244
  }
111248
111245
  async function discoverResources(surface2, url3) {
111246
+ if (!/^[a-zA-Z][a-zA-Z\d+\-.]*:\/\//.test(url3)) {
111247
+ url3 = `https://${url3}`;
111248
+ }
111249
111249
  const origin = URL.canParse(url3) ? new URL(url3).origin : url3;
111250
111250
  log.info(`Discovering resources for origin: ${origin}`);
111251
111251
  const [specResult, instructions] = await Promise.all([
@@ -111274,6 +111274,7 @@ async function discoverResources(surface2, url3) {
111274
111274
  ...typeof rawInfo.description === "string" ? { description: rawInfo.description } : {}
111275
111275
  } : void 0;
111276
111276
  return {
111277
+ found: true,
111277
111278
  origin,
111278
111279
  source: "openapi",
111279
111280
  ...info ? { info } : {},
@@ -111861,7 +111862,7 @@ var import_path3 = require("path");
111861
111862
  var import_url2 = require("url");
111862
111863
  function getVersion3() {
111863
111864
  if (true) {
111864
- return "0.6.5";
111865
+ return "0.6.6";
111865
111866
  }
111866
111867
  const __dirname3 = (0, import_path3.dirname)((0, import_url2.fileURLToPath)(importMetaUrl));
111867
111868
  const pkg = JSON.parse(
@@ -112048,7 +112049,7 @@ async function getWallet() {
112048
112049
  // src/server/index.ts
112049
112050
  var startServer = async (flags) => {
112050
112051
  log.info("Starting agentcash...");
112051
- const { dev, invite } = flags;
112052
+ const { invite } = flags;
112052
112053
  let { sessionId } = flags;
112053
112054
  sessionId ??= (0, import_crypto2.randomBytes)(16).toString("hex");
112054
112055
  const walletResult = await getWallet();
@@ -112062,7 +112063,6 @@ var startServer = async (flags) => {
112062
112063
  if (code) {
112063
112064
  await redeemInviteCode({
112064
112065
  code,
112065
- dev,
112066
112066
  address: account.address,
112067
112067
  surface: "startServer"
112068
112068
  });
@@ -18,6 +18,7 @@ interface OpenApiInfo {
18
18
  description?: string;
19
19
  }
20
20
  interface DiscoveryResult {
21
+ found: true;
21
22
  origin: string;
22
23
  source: 'openapi';
23
24
  info?: OpenApiInfo;
@@ -0,0 +1,7 @@
1
+ // src/shared/mpp-enabled.ts
2
+ var isMppEnabled = () => "0.6.6".includes("-mpp");
3
+
4
+ export {
5
+ isMppEnabled
6
+ };
7
+ //# sourceMappingURL=chunk-33JE5MUU.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  isMppEnabled
3
- } from "./chunk-F5ZDNWEA.js";
3
+ } from "./chunk-33JE5MUU.js";
4
4
  import {
5
5
  MCP_VERSION
6
- } from "./chunk-W3V4VWAR.js";
6
+ } from "./chunk-Z453AIOR.js";
7
7
  import {
8
8
  getBalance,
9
9
  getBaseUrl,
@@ -119,4 +119,4 @@ export {
119
119
  getWalletInfo,
120
120
  submitErrorReport
121
121
  };
122
- //# sourceMappingURL=chunk-EYF7JMMC.js.map
122
+ //# sourceMappingURL=chunk-6OZUZZIH.js.map
@@ -1,6 +1,5 @@
1
1
  import {
2
- getBalance,
3
- getBaseUrl
2
+ getBalance
4
3
  } from "./chunk-YUCA2PQT.js";
5
4
  import {
6
5
  LEGACY_DIRECTORY,
@@ -211,6 +210,18 @@ async function getWallet() {
211
210
  // src/shared/redeem-invite.ts
212
211
  import z3 from "zod";
213
212
 
213
+ // src/shared/origins.ts
214
+ var ORIGINS = [
215
+ "https://stableenrich.dev" /* StableEnrich */,
216
+ "https://stablesocial.dev" /* StableSocial */,
217
+ "https://stablestudio.dev" /* StableStudio */,
218
+ "https://stableupload.dev" /* StableUpload */,
219
+ "https://stableemail.dev" /* StableEmail */,
220
+ "https://x402scan.com" /* X402Scan */,
221
+ "https://shirt.sh" /* Shirt */,
222
+ "https://x402puppet.com" /* X402Puppet */
223
+ ];
224
+
214
225
  // src/shared/state.ts
215
226
  import z2 from "zod";
216
227
  import fs from "fs";
@@ -240,7 +251,6 @@ var setState = (state) => {
240
251
  // src/shared/redeem-invite.ts
241
252
  var redeemInviteCode = async ({
242
253
  code,
243
- dev,
244
254
  address,
245
255
  surface
246
256
  }) => {
@@ -253,7 +263,7 @@ var redeemInviteCode = async ({
253
263
  }
254
264
  const result = await safeFetchJson(
255
265
  surface,
256
- new Request(`${getBaseUrl(dev)}/api/invite/redeem`, {
266
+ new Request(`${"https://x402scan.com" /* X402Scan */}/api/invite/redeem`, {
257
267
  method: "POST",
258
268
  headers: {
259
269
  "Content-Type": "application/json"
@@ -359,6 +369,7 @@ export {
359
369
  toJsonObject,
360
370
  safeParseJson,
361
371
  getWallet,
372
+ ORIGINS,
362
373
  redeemInviteCode
363
374
  };
364
- //# sourceMappingURL=chunk-PLBNJ647.js.map
375
+ //# sourceMappingURL=chunk-NQ5BLLN7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/wallet.ts","../../src/shared/neverthrow/json/index.ts","../../src/shared/redeem-invite.ts","../../src/shared/origins.ts","../../src/shared/state.ts","../../src/shared/networks.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { getAddress } from 'viem';\nimport { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';\n\nimport z from 'zod';\n\nimport {\n ok,\n resultFromThrowable,\n resultFromPromise,\n} from '@agentcash/neverthrow';\n\nimport {\n fsErr,\n safeChmod,\n safeReadFile,\n safeWriteFile,\n} from '@/shared/neverthrow/fs';\nimport { jsonErr, safeParseJson } from '@/shared/neverthrow/json';\nimport { safeParse } from '@/shared/neverthrow/parse';\nimport { getBalance } from '@/shared/balance';\n\nimport { log } from './log';\nimport { configFile, LEGACY_DIRECTORY } from './fs';\n\nimport type { Hex } from 'viem';\nimport type { PrivateKeyAccount } from 'viem/accounts';\n\nconst WALLET_FILE = configFile('wallet.json');\n\nconst storedWalletSchema = z.object({\n privateKey: z\n .string()\n .regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid Ethereum private key')\n .transform(privateKey => privateKey as Hex),\n address: z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address')\n .transform(address => getAddress(address)),\n createdAt: z.string(),\n});\n\nconst walletSurface = 'wallet';\n\nconst LEGACY_WALLET = join(LEGACY_DIRECTORY, 'wallet.json');\n\nconst reconcileSurface = 'wallet-reconcile';\n\nasync function reconcileLegacyWallet(\n current: PrivateKeyAccount,\n isNew: boolean\n): Promise<{ account: PrivateKeyAccount; isNew: boolean }> {\n const noChange = { account: current, isNew };\n\n // 1. No legacy wallet → nothing to reconcile\n if (!existsSync(LEGACY_WALLET)) {\n return noChange;\n }\n\n // 2. Read & parse legacy wallet\n const legacyResult = resultFromThrowable(\n 'wallet',\n reconcileSurface,\n () => {\n const raw = readFileSync(LEGACY_WALLET, 'utf-8');\n return storedWalletSchema.parse(JSON.parse(raw));\n },\n () => ({\n cause: 'file_not_readable' as const,\n message: 'Legacy wallet exists but is invalid',\n })\n );\n\n if (legacyResult.isErr()) {\n log.info('Legacy wallet exists but is invalid, skipping reconciliation');\n return noChange;\n }\n\n const legacyKey = legacyResult.value.privateKey;\n\n // 3. Same key → already reconciled\n const legacyAccount = privateKeyToAccount(legacyKey);\n if (legacyAccount.address === current.address) {\n return noChange;\n }\n\n // 4. Keys differ → check balances\n const balancesResult = await resultFromPromise(\n 'wallet',\n reconcileSurface,\n Promise.all([\n getBalance({\n address: legacyAccount.address,\n surface: reconcileSurface,\n }),\n getBalance({\n address: current.address,\n surface: reconcileSurface,\n }),\n ]),\n () => ({\n cause: 'balance_check' as const,\n message: 'Network error during wallet reconciliation',\n })\n );\n\n if (balancesResult.isErr()) {\n log.info('Network error during wallet reconciliation, skipping');\n return noChange;\n }\n\n const [legacyBalanceResult, currentBalanceResult] = balancesResult.value;\n\n if (legacyBalanceResult.isErr() || currentBalanceResult.isErr()) {\n log.info('Could not check balances for wallet reconciliation, skipping');\n return noChange;\n }\n\n const legacyBalance = legacyBalanceResult.value.balance;\n const currentBalance = currentBalanceResult.value.balance;\n\n // 4a. Legacy has balance, current is empty → recover legacy\n if (legacyBalance > 0 && currentBalance === 0) {\n log.info(\n `Recovering funded legacy wallet ${legacyAccount.address} (balance: ${legacyBalance})`\n );\n const stored = {\n privateKey: legacyKey,\n address: legacyAccount.address,\n createdAt: new Date().toISOString(),\n };\n const writeResult = await safeWriteFile(\n reconcileSurface,\n WALLET_FILE,\n JSON.stringify(stored, null, 2)\n ).andThen(() => safeChmod(reconcileSurface, WALLET_FILE, 0o600));\n\n if (writeResult.isErr()) {\n log.error(\n `Failed to write recovered wallet: ${writeResult.error.message}`\n );\n return noChange;\n }\n\n return { account: legacyAccount, isNew: false };\n }\n\n // 4b. Both have balance → manual intervention needed\n if (legacyBalance > 0 && currentBalance > 0) {\n log.info(\n `Both wallets have funds. Current: ${current.address} (${currentBalance}), Legacy: ${legacyAccount.address} (${legacyBalance}). ` +\n `Manually copy ${LEGACY_WALLET} to ${WALLET_FILE} if you want to use the legacy wallet.`\n );\n return noChange;\n }\n\n // 4c. Legacy has no balance → nothing to recover\n return noChange;\n}\n\nexport async function getWallet() {\n if (process.env.X402_PRIVATE_KEY) {\n const account = privateKeyToAccount(process.env.X402_PRIVATE_KEY as Hex);\n log.info(`Using wallet from env: ${account.address}`);\n return ok({ account, isNew: false });\n }\n\n const readFileResult = await safeReadFile(walletSurface, WALLET_FILE);\n\n if (!readFileResult.isOk()) {\n const fileExistsResult = existsSync(WALLET_FILE);\n // file exists but is not readable\n if (fileExistsResult) {\n return fsErr(walletSurface, {\n cause: 'file_not_readable',\n message: `The file exists but is not readable. Fix corrupted state file: ${WALLET_FILE}`,\n });\n }\n }\n\n if (readFileResult.isOk()) {\n const data = readFileResult.value;\n const jsonParseResult = safeParseJson(walletSurface, data);\n\n // file exists but is not valid JSON\n if (jsonParseResult.isErr()) {\n return jsonErr(walletSurface, {\n cause: 'parse',\n message: `The data in ${WALLET_FILE} is not valid JSON`,\n });\n }\n\n const parseResult = safeParse(\n walletSurface,\n storedWalletSchema,\n jsonParseResult.value\n );\n\n // file has valid JSON but is not a valid wallet configuration\n if (parseResult.isErr()) {\n return parseResult;\n }\n\n const account = privateKeyToAccount(parseResult.value.privateKey);\n log.info(`Loaded wallet: ${account.address}`);\n const reconciled = await reconcileLegacyWallet(account, false);\n return ok(reconciled);\n }\n\n // Generate new\n const privateKey = generatePrivateKey();\n const account = privateKeyToAccount(privateKey);\n const stored = {\n privateKey,\n address: account.address,\n createdAt: new Date().toISOString(),\n };\n\n const saveResult = await safeWriteFile(\n walletSurface,\n WALLET_FILE,\n JSON.stringify(stored, null, 2)\n ).andThen(() => safeChmod(walletSurface, WALLET_FILE, 0o600));\n\n if (saveResult.isErr()) {\n return saveResult;\n }\n\n log.info(`Created wallet: ${account.address}`);\n log.info(`Saved to: ${WALLET_FILE}`);\n\n const reconciled = await reconcileLegacyWallet(account, true);\n return ok(reconciled);\n}\n","import { err, resultFromThrowable } from '@agentcash/neverthrow';\n\nimport type { BaseJsonError, JsonObject } from './types';\n\nconst type = 'json';\n\nexport const jsonErr = (surface: string, error: BaseJsonError) => {\n return err(type, surface, error);\n};\n\nexport const safeStringifyJson = (surface: string, value: JsonObject) => {\n return resultFromThrowable(\n type,\n surface,\n () => JSON.stringify(value, null, 2),\n () => ({\n cause: 'stringify' as const,\n message: 'Could not stringify JSON',\n })\n );\n};\n\n/**\n * Convert a value with optional properties into a clean JsonObject\n * by round-tripping through JSON serialization (strips `undefined` keys).\n */\nexport const toJsonObject = <T>(value: T): JsonObject =>\n JSON.parse(JSON.stringify(value)) as JsonObject;\n\nexport const safeParseJson = (surface: string, value: string) => {\n return resultFromThrowable(\n type,\n surface,\n () => JSON.parse(value) as JsonObject,\n e => ({\n cause: 'parse' as const,\n message: e instanceof Error ? e.message : 'Could not parse JSON',\n })\n );\n};\n","import z from 'zod';\n\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\nimport { err } from '@agentcash/neverthrow';\n\nimport { Origin } from './origins';\nimport { getState, setState } from './state';\n\nimport type { Address } from 'viem';\n\nexport interface RedeemInviteProps {\n code: string;\n address: Address;\n surface: string;\n}\n\nexport const redeemInviteCode = async ({\n code,\n address,\n surface,\n}: RedeemInviteProps) => {\n const state = getState();\n\n if (state.redeemedCodes?.includes(code)) {\n return err('user', surface, {\n cause: 'conflict',\n message: 'This invite code has already been redeemed',\n });\n }\n\n const result = await safeFetchJson(\n surface,\n new Request(`${Origin.X402Scan}/api/invite/redeem`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code,\n recipientAddr: address,\n }),\n }),\n z.object({\n redemptionId: z.string(),\n txHash: z.string(),\n amount: z.coerce.number(),\n })\n );\n\n if (result.isOk()) {\n setState({\n redeemedCodes: [...(state.redeemedCodes ?? []), code],\n });\n }\n\n return result;\n};\n","/**\n * Known x402-protected API origins.\n * Using const enum so values are inlined at build time.\n */\nexport const enum Origin {\n StableEnrich = 'https://stableenrich.dev',\n StableSocial = 'https://stablesocial.dev',\n StableStudio = 'https://stablestudio.dev',\n StableUpload = 'https://stableupload.dev',\n StableEmail = 'https://stableemail.dev',\n X402Scan = 'https://x402scan.com',\n Shirt = 'https://shirt.sh',\n X402Puppet = 'https://x402puppet.com',\n X402Facilitator = 'https://x402facilitator.com',\n}\n\n/**\n * Array of all known origins for iteration.\n * Const enums are erased at compile time, so we need a regular array for runtime iteration.\n */\nexport const ORIGINS = [\n Origin.StableEnrich,\n Origin.StableSocial,\n Origin.StableStudio,\n Origin.StableUpload,\n Origin.StableEmail,\n Origin.X402Scan,\n Origin.Shirt,\n Origin.X402Puppet,\n] as const;\n","import z from 'zod';\nimport fs from 'fs';\n\nimport { configFile } from './fs';\n\nconst STATE_FILE = configFile('state.json');\n\nconst stateSchema = z\n .looseObject({\n redeemedCodes: z.array(z.string()),\n })\n .partial();\n\nexport const getState = () => {\n const stateFileExists = fs.existsSync(STATE_FILE);\n if (!stateFileExists) {\n fs.writeFileSync(STATE_FILE, '{}');\n return {};\n }\n\n const stateFileContent = fs.readFileSync(STATE_FILE, 'utf-8');\n const result = stateSchema.safeParse(JSON.parse(stateFileContent));\n if (!result.success) {\n return {};\n }\n return result.data;\n};\n\nexport const setState = (state: z.infer<typeof stateSchema>) => {\n const existing = getState();\n const newState = stateSchema.parse({ ...existing, ...state });\n fs.writeFileSync(STATE_FILE, JSON.stringify(newState, null, 2));\n};\n","import {\n base,\n baseSepolia,\n mainnet,\n sepolia,\n optimism,\n arbitrum,\n polygon,\n} from 'viem/chains';\n\nimport type { Chain } from 'viem';\n\nexport interface ChainConfig {\n chain: Chain;\n caip2: string;\n v1Name: string;\n usdcAddress: `0x${string}`;\n}\n\nconst CHAIN_CONFIGS: Record<string, ChainConfig> = {\n 'eip155:8453': {\n chain: base,\n caip2: 'eip155:8453',\n v1Name: 'base',\n usdcAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n 'eip155:84532': {\n chain: baseSepolia,\n caip2: 'eip155:84532',\n v1Name: 'base-sepolia',\n usdcAddress: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n },\n 'eip155:1': {\n chain: mainnet,\n caip2: 'eip155:1',\n v1Name: 'ethereum',\n usdcAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n },\n 'eip155:11155111': {\n chain: sepolia,\n caip2: 'eip155:11155111',\n v1Name: 'ethereum-sepolia',\n usdcAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n },\n 'eip155:10': {\n chain: optimism,\n caip2: 'eip155:10',\n v1Name: 'optimism',\n usdcAddress: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n },\n 'eip155:42161': {\n chain: arbitrum,\n caip2: 'eip155:42161',\n v1Name: 'arbitrum',\n usdcAddress: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n },\n 'eip155:137': {\n chain: polygon,\n caip2: 'eip155:137',\n v1Name: 'polygon',\n usdcAddress: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n },\n};\n\nconst V1_TO_CAIP2: Record<string, string> = {\n base: 'eip155:8453',\n 'base-sepolia': 'eip155:84532',\n ethereum: 'eip155:1',\n 'ethereum-sepolia': 'eip155:11155111',\n optimism: 'eip155:10',\n arbitrum: 'eip155:42161',\n polygon: 'eip155:137',\n};\n\nexport const DEFAULT_NETWORK = 'eip155:8453';\n\n/** Convert any network identifier to CAIP-2 format */\nexport function toCaip2(network: string): string {\n if (network.startsWith('eip155:')) return network;\n return V1_TO_CAIP2[network.toLowerCase()] ?? network;\n}\n\n/** Get chain config from network identifier */\nexport function getChainConfig(network: string): ChainConfig | undefined {\n return CHAIN_CONFIGS[toCaip2(network)];\n}\n\n/** Get USDC address for a network */\nexport function getUSDCAddress(network: string): `0x${string}` | undefined {\n return getChainConfig(network)?.usdcAddress;\n}\n\n/** Extract chain ID from CAIP-2 identifier */\nexport function getChainId(network: string): number | undefined {\n const caip2 = toCaip2(network);\n const match = /^eip155:(\\d+)$/.exec(caip2);\n return match ? parseInt(match[1]!, 10) : undefined;\n}\n\n/** Get human-readable chain name */\nexport function getChainName(network: string): string {\n return getChainConfig(network)?.chain.name ?? network;\n}\n\n/** Check if network is a testnet */\nexport function isTestnet(network: string): boolean {\n return getChainConfig(network)?.chain.testnet === true;\n}\n"],"mappings":"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","names":["account","reconciled","z","z","z","z"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getTempoBalance
3
- } from "./chunk-EYF7JMMC.js";
3
+ } from "./chunk-6OZUZZIH.js";
4
4
  import {
5
5
  detectPaymentProtocols,
6
6
  getSiwxExtension,
@@ -11,7 +11,7 @@ import {
11
11
  tokenStringToNumber,
12
12
  x402Err,
13
13
  x402Ok
14
- } from "./chunk-5MGZ3UGG.js";
14
+ } from "./chunk-TIP56JAT.js";
15
15
  import {
16
16
  getBalance
17
17
  } from "./chunk-YUCA2PQT.js";
@@ -412,4 +412,4 @@ export {
412
412
  createFetchWithPayment,
413
413
  createFetchWithAuth
414
414
  };
415
- //# sourceMappingURL=chunk-VUTE3VTW.js.map
415
+ //# sourceMappingURL=chunk-P666EAQ2.js.map
@@ -2,7 +2,7 @@ import {
2
2
  DEFAULT_NETWORK,
3
3
  getChainName,
4
4
  redeemInviteCode
5
- } from "./chunk-PLBNJ647.js";
5
+ } from "./chunk-NQ5BLLN7.js";
6
6
  import {
7
7
  getDepositLink
8
8
  } from "./chunk-YUCA2PQT.js";
@@ -81,7 +81,6 @@ var promptDeposit = async (props) => {
81
81
  s.start("Redeeming invite code...");
82
82
  const redeemResult = await redeemInviteCode({
83
83
  code,
84
- dev: flags.dev,
85
84
  address,
86
85
  surface: "redeemInvite"
87
86
  });
@@ -111,4 +110,4 @@ export {
111
110
  wait,
112
111
  promptDeposit
113
112
  };
114
- //# sourceMappingURL=chunk-WBLOSD2E.js.map
113
+ //# sourceMappingURL=chunk-RFFZRGKI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/lib/deposit.ts","../../src/cli/lib/wait.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { select, text, log, spinner } from '@clack/prompts';\nimport open from 'open';\n\nimport { DEFAULT_NETWORK, getChainName } from '../../shared/networks';\nimport { wait } from './wait';\nimport { getDepositLink } from '../../shared/utils';\nimport { redeemInviteCode } from '../../shared/redeem-invite';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\ninterface PromptDepositProps {\n address: Address;\n flags: GlobalFlags;\n surface: string;\n}\n\nexport const promptDeposit = async (\n props: PromptDepositProps\n): Promise<void> => {\n const { address, flags, surface } = props;\n\n const depositLink = getDepositLink(address, flags);\n\n const depositChoice =\n flags.yes || surface === 'guided'\n ? 'manual'\n : await select({\n message: chalk.bold('How would you like to deposit?'),\n initialValue: 'guided' as string | undefined,\n options: [\n {\n label: 'Guided - Recommended',\n value: 'guided',\n hint: 'Online portal in agentcash',\n },\n {\n label: 'Manual',\n value: 'manual',\n hint: 'Print deposit instructions',\n },\n {\n label: 'Redeem Invite Code',\n value: 'invite',\n hint: 'Enter an invite code for starter money',\n },\n {\n label: 'Skip',\n value: undefined,\n hint: 'Skip deposit process - functionality limited',\n },\n ],\n });\n\n if (depositChoice === 'guided') {\n await wait({\n startText: 'Opening deposit page...',\n stopText: `Opening ${chalk.underline.hex('#2563eb')(depositLink)}`,\n ms: 1000,\n });\n\n await open(depositLink);\n } else if (depositChoice === 'manual') {\n log.step(chalk.bold('Account Information'));\n\n log.message(`Address: ${address}`);\n log.message(`Network: ${getChainName(DEFAULT_NETWORK)}`);\n\n log.step(chalk.bold('Online Portal'));\n log.message(`${chalk.underline(depositLink)}`);\n } else if (depositChoice === 'invite') {\n const code = await text({\n message: 'Enter your invite code',\n placeholder: 'MRT-XXXXX',\n validate: value => {\n if (!value || value.trim().length === 0) {\n return 'Please enter an invite code';\n }\n },\n });\n\n if (typeof code !== 'string') {\n return promptDeposit({ address, flags, surface });\n }\n\n const s = spinner();\n s.start('Redeeming invite code...');\n\n const redeemResult = await redeemInviteCode({\n code,\n address,\n surface: 'redeemInvite',\n });\n\n if (redeemResult.isErr()) {\n s.stop('Invite code redemption failed');\n log.error('Failed to redeem invite code');\n return promptDeposit({ address, flags, surface });\n }\n\n s.stop('Invite code redeemed successfully!');\n\n const { amount, txHash } = redeemResult.value;\n\n await wait({\n startText: 'Processing...',\n stopText: chalk.green(\n `${chalk.bold(amount)} USDC has been sent to your wallet!`\n ),\n ms: 1500,\n });\n\n log.success(chalk.bold(`Your wallet has been funded with ${amount} USDC`));\n\n if (txHash) {\n log.info(chalk.dim(`Transaction: https://basescan.org/tx/${txHash}`));\n }\n\n return;\n }\n};\n","import { spinner } from '@clack/prompts';\n\ninterface WaitProps {\n startText: string;\n stopText: string;\n ms: number;\n}\n\nexport const wait = async ({ startText, stopText, ms }: WaitProps) => {\n const { start: startSpinner, stop: stopSpinner } = spinner();\n startSpinner(startText);\n await new Promise(resolve => setTimeout(resolve, ms));\n stopSpinner(stopText);\n};\n"],"mappings":";;;;;;;;;;AAAA,OAAO,WAAW;AAClB,SAAS,QAAQ,MAAM,KAAK,WAAAA,gBAAe;AAC3C,OAAO,UAAU;;;ACFjB,SAAS,eAAe;AAQjB,IAAM,OAAO,OAAO,EAAE,WAAW,UAAU,GAAG,MAAiB;AACpE,QAAM,EAAE,OAAO,cAAc,MAAM,YAAY,IAAI,QAAQ;AAC3D,eAAa,SAAS;AACtB,QAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACpD,cAAY,QAAQ;AACtB;;;ADKO,IAAM,gBAAgB,OAC3B,UACkB;AAClB,QAAM,EAAE,SAAS,OAAO,QAAQ,IAAI;AAEpC,QAAM,cAAc,eAAe,SAAS,KAAK;AAEjD,QAAM,gBACJ,MAAM,OAAO,YAAY,WACrB,WACA,MAAM,OAAO;AAAA,IACX,SAAS,MAAM,KAAK,gCAAgC;AAAA,IACpD,cAAc;AAAA,IACd,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAEP,MAAI,kBAAkB,UAAU;AAC9B,UAAM,KAAK;AAAA,MACT,WAAW;AAAA,MACX,UAAU,WAAW,MAAM,UAAU,IAAI,SAAS,EAAE,WAAW,CAAC;AAAA,MAChE,IAAI;AAAA,IACN,CAAC;AAED,UAAM,KAAK,WAAW;AAAA,EACxB,WAAW,kBAAkB,UAAU;AACrC,QAAI,KAAK,MAAM,KAAK,qBAAqB,CAAC;AAE1C,QAAI,QAAQ,YAAY,OAAO,EAAE;AACjC,QAAI,QAAQ,YAAY,aAAa,eAAe,CAAC,EAAE;AAEvD,QAAI,KAAK,MAAM,KAAK,eAAe,CAAC;AACpC,QAAI,QAAQ,GAAG,MAAM,UAAU,WAAW,CAAC,EAAE;AAAA,EAC/C,WAAW,kBAAkB,UAAU;AACrC,UAAM,OAAO,MAAM,KAAK;AAAA,MACtB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,WAAS;AACjB,YAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,cAAc,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,IAClD;AAEA,UAAM,IAAIC,SAAQ;AAClB,MAAE,MAAM,0BAA0B;AAElC,UAAM,eAAe,MAAM,iBAAiB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAED,QAAI,aAAa,MAAM,GAAG;AACxB,QAAE,KAAK,+BAA+B;AACtC,UAAI,MAAM,8BAA8B;AACxC,aAAO,cAAc,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,IAClD;AAEA,MAAE,KAAK,oCAAoC;AAE3C,UAAM,EAAE,QAAQ,OAAO,IAAI,aAAa;AAExC,UAAM,KAAK;AAAA,MACT,WAAW;AAAA,MACX,UAAU,MAAM;AAAA,QACd,GAAG,MAAM,KAAK,MAAM,CAAC;AAAA,MACvB;AAAA,MACA,IAAI;AAAA,IACN,CAAC;AAED,QAAI,QAAQ,MAAM,KAAK,oCAAoC,MAAM,OAAO,CAAC;AAEzE,QAAI,QAAQ;AACV,UAAI,KAAK,MAAM,IAAI,wCAAwC,MAAM,EAAE,CAAC;AAAA,IACtE;AAEA;AAAA,EACF;AACF;","names":["spinner","spinner"]}
@@ -32,7 +32,15 @@ async function registerOrigin(surface, input, dev) {
32
32
  return ok(result.value);
33
33
  }
34
34
 
35
+ // src/lib.ts
36
+ async function registerOrigin2(surface, input, dev) {
37
+ const result = await registerOrigin(surface, input, dev);
38
+ if (result.isErr()) throw new Error(result.error.message);
39
+ return result.value;
40
+ }
41
+
35
42
  export {
36
- registerOrigin
43
+ registerOrigin,
44
+ registerOrigin2
37
45
  };
38
- //# sourceMappingURL=chunk-KPHAAIVC.js.map
46
+ //# sourceMappingURL=chunk-SDQV56RE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/operations/register.ts","../../src/lib.ts"],"sourcesContent":["import { z } from 'zod';\nimport { ok } from '@agentcash/neverthrow';\n\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\n\nconst AGENTCASH_BASE_URL = 'https://agentcash.dev';\nconst AGENTCASH_DEV_URL = 'http://localhost:3000';\n\nconst getRegisterUrl = (dev: boolean) =>\n `${dev ? AGENTCASH_DEV_URL : AGENTCASH_BASE_URL}/api/register`;\n\n/**\n * Input for registering an origin with agentcash.\n */\nexport interface RegisterInput {\n url: string;\n}\n\n/**\n * Result returned from a successful registration.\n */\nexport interface RegisterResult {\n origin: {\n id: string;\n origin: string;\n name: string;\n };\n resourceCount: number;\n}\n\nconst registerResponseSchema = z.object({\n origin: z.object({\n id: z.string(),\n origin: z.string(),\n name: z.string(),\n }),\n resourceCount: z.number(),\n});\n\n/**\n * Register an origin with agentcash by POSTing to agentcash.dev/api/register.\n */\nexport async function registerOrigin(\n surface: string,\n input: RegisterInput,\n dev: boolean\n) {\n const result = await safeFetchJson(\n surface,\n new Request(getRegisterUrl(dev), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ url: input.url }),\n }),\n registerResponseSchema\n );\n\n if (result.isErr()) {\n return result;\n }\n\n return ok<RegisterResult>(result.value);\n}\n","/**\n * Library entry point for programmatic use (e.g. importing into a Next.js app).\n * The CLI entry point is src/index.ts (used by the `bin` field).\n *\n * All exports return plain types (no Result<> from neverthrow) to avoid\n * leaking internal @agentcash/neverthrow/types into published .d.ts files.\n *\n * IMPORTANT: Import directly from the individual operation modules — NOT\n * the operations barrel — so that CLI-only modules (wallet-info, report-error)\n * and their transitive filesystem dependencies are never pulled into the\n * bundle for Next.js / serverless consumers.\n */\nexport {\n discoverResources,\n type DiscoveryResult,\n type DiscoverFailure,\n type OpenApiInfo,\n} from '@/shared/operations/discover';\n\nexport {\n checkEndpoint,\n type CheckEndpointOptions,\n type CheckEndpointResult,\n type ProbeMethodResult,\n type PaymentOption,\n type MppPaymentOption,\n type X402PaymentOption,\n type SupportedMethod,\n SUPPORTED_METHODS,\n} from '@/shared/operations/check-endpoint';\n\nimport { registerOrigin as _registerOrigin } from '@/shared/operations/register';\nexport type {\n RegisterInput,\n RegisterResult,\n} from '@/shared/operations/register';\n\nexport async function registerOrigin(\n surface: string,\n input: { url: string },\n dev: boolean\n) {\n const result = await _registerOrigin(surface, input, dev);\n if (result.isErr()) throw new Error(result.error.message);\n return result.value;\n}\n"],"mappings":";;;;;;AAAA,SAAS,SAAS;AAKlB,IAAM,qBAAqB;AAC3B,IAAM,oBAAoB;AAE1B,IAAM,iBAAiB,CAAC,QACtB,GAAG,MAAM,oBAAoB,kBAAkB;AAqBjD,IAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,QAAQ,EAAE,OAAO;AAAA,IACf,IAAI,EAAE,OAAO;AAAA,IACb,QAAQ,EAAE,OAAO;AAAA,IACjB,MAAM,EAAE,OAAO;AAAA,EACjB,CAAC;AAAA,EACD,eAAe,EAAE,OAAO;AAC1B,CAAC;AAKD,eAAsB,eACpB,SACA,OACA,KACA;AACA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,IAAI,QAAQ,eAAe,GAAG,GAAG;AAAA,MAC/B,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,IACzC,CAAC;AAAA,IACD;AAAA,EACF;AAEA,MAAI,OAAO,MAAM,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,GAAmB,OAAO,KAAK;AACxC;;;ACzBA,eAAsBA,gBACpB,SACA,OACA,KACA;AACA,QAAM,SAAS,MAAM,eAAgB,SAAS,OAAO,GAAG;AACxD,MAAI,OAAO,MAAM,EAAG,OAAM,IAAI,MAAM,OAAO,MAAM,OAAO;AACxD,SAAO,OAAO;AAChB;","names":["registerOrigin"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isMppEnabled
3
- } from "./chunk-F5ZDNWEA.js";
3
+ } from "./chunk-33JE5MUU.js";
4
4
  import {
5
5
  DEFAULT_FETCH_TIMEOUT,
6
6
  err,
@@ -633,6 +633,9 @@ async function fetchLlmsTxt(surface, origin) {
633
633
  return parseResult.value.data;
634
634
  }
635
635
  async function discoverResources(surface, url) {
636
+ if (!/^[a-zA-Z][a-zA-Z\d+\-.]*:\/\//.test(url)) {
637
+ url = `https://${url}`;
638
+ }
636
639
  const origin = URL.canParse(url) ? new URL(url).origin : url;
637
640
  log.info(`Discovering resources for origin: ${origin}`);
638
641
  const [specResult, instructions] = await Promise.all([
@@ -661,6 +664,7 @@ async function discoverResources(surface, url) {
661
664
  ...typeof rawInfo.description === "string" ? { description: rawInfo.description } : {}
662
665
  } : void 0;
663
666
  return {
667
+ found: true,
664
668
  origin,
665
669
  source: "openapi",
666
670
  ...info ? { info } : {},
@@ -691,4 +695,4 @@ export {
691
695
  checkEndpoint,
692
696
  discoverResources
693
697
  };
694
- //# sourceMappingURL=chunk-5MGZ3UGG.js.map
698
+ //# sourceMappingURL=chunk-TIP56JAT.js.map