agentcash 0.14.3 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/run-server.cjs +41485 -17862
- package/dist/esm/{add-skill-CDIK57A3.js → add-skill-5HFBHQTQ.js} +10 -10
- package/dist/esm/{bridge-6WMUV3ML.js → bridge-BOLVXKCD.js} +7 -7
- package/dist/esm/{check-D5DZ6Y3T.js → check-FEWY37RD.js} +7 -7
- package/dist/esm/{chunk-SCBLFGL2.js → chunk-2C7X7XIG.js} +3 -3
- package/dist/esm/{chunk-UCADMHNP.js → chunk-2E4ZDG2M.js} +2 -2
- package/dist/esm/{chunk-YUPRVVFP.js → chunk-4MCPQDKM.js} +3 -3
- package/dist/esm/{chunk-JX2XE6FD.js → chunk-4TIYIVZF.js} +1 -1
- package/dist/esm/chunk-4TIYIVZF.js.map +1 -0
- package/dist/esm/{chunk-IL2CNAJY.js → chunk-5MITNOWT.js} +2 -2
- package/dist/esm/{chunk-MSNAPI5G.js → chunk-BIO4Y27B.js} +3 -3
- package/dist/esm/{chunk-BNFMFAEF.js → chunk-C7B6LEPE.js} +3 -3
- package/dist/esm/{chunk-KJCWPVQE.js → chunk-EM6OE6WL.js} +3 -3
- package/dist/esm/chunk-FBGNOXFP.js +102 -0
- package/dist/esm/chunk-FBGNOXFP.js.map +1 -0
- package/dist/esm/{chunk-G5FHPXQL.js → chunk-HNDMHX4B.js} +271 -98
- package/dist/esm/chunk-HNDMHX4B.js.map +1 -0
- package/dist/esm/{chunk-NPJV7AMV.js → chunk-HTGTKVXB.js} +6 -2
- package/dist/esm/chunk-HTGTKVXB.js.map +1 -0
- package/dist/esm/{chunk-CFSSHSBN.js → chunk-K3WB4R2P.js} +3 -2
- package/dist/esm/{chunk-CFSSHSBN.js.map → chunk-K3WB4R2P.js.map} +1 -1
- package/dist/esm/{chunk-FV6DADHO.js → chunk-MKA2PTOE.js} +5 -7
- package/dist/esm/chunk-MKA2PTOE.js.map +1 -0
- package/dist/esm/{chunk-KSW2MGQR.js → chunk-MZPHS3IS.js} +4 -4
- package/dist/esm/{chunk-K627XZI4.js → chunk-O57QVTLM.js} +2 -2
- package/dist/esm/{chunk-BFOYXXLG.js → chunk-RAS5DZPQ.js} +15 -1
- package/dist/esm/chunk-RAS5DZPQ.js.map +1 -0
- package/dist/esm/{chunk-KMS4TVJY.js → chunk-SLTRGQ7W.js} +8 -3
- package/dist/esm/{chunk-KMS4TVJY.js.map → chunk-SLTRGQ7W.js.map} +1 -1
- package/dist/esm/chunk-TX7S7QGG.js +146 -0
- package/dist/esm/chunk-TX7S7QGG.js.map +1 -0
- package/dist/esm/{chunk-NP7CKLI4.js → chunk-ULB5PPKW.js} +2 -2
- package/dist/esm/{chunk-LGFUHPDL.js → chunk-VGKAPM5S.js} +3 -3
- package/dist/esm/{chunk-SFESERJN.js → chunk-W37JKCLN.js} +42 -4
- package/dist/esm/chunk-W37JKCLN.js.map +1 -0
- package/dist/esm/{chunk-TTAO2EJK.js → chunk-YPFBBTA2.js} +1 -1
- package/dist/esm/chunk-YPFBBTA2.js.map +1 -0
- package/dist/esm/{discover-X557BWGS.js → discover-TXEJNB5A.js} +5 -5
- package/dist/esm/{fetch-45YPD37H.js → fetch-QAVIWIRX.js} +12 -11
- package/dist/esm/{fetch-45YPD37H.js.map → fetch-QAVIWIRX.js.map} +1 -1
- package/dist/esm/{fund-HHL4QEU5.js → fund-FCOUEG7T.js} +5 -5
- package/dist/esm/index.js +70 -34
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{install-KJOAEIZF.js → install-NJJZYBZU.js} +8 -8
- package/dist/esm/{onboard-M5C6TFWE.js → onboard-TYB4QZE4.js} +12 -12
- package/dist/esm/{origins-XG6O5K27.js → origins-EVVF3N4G.js} +6 -6
- package/dist/esm/{register-AD43YD5O.js → register-T6M2US4B.js} +62 -21
- package/dist/esm/register-T6M2US4B.js.map +1 -0
- package/dist/esm/{report-error-FDDNOZAD.js → report-error-BR7ETMF7.js} +5 -5
- package/dist/esm/{search-VYYPNNIU.js → search-KIPT62MB.js} +11 -10
- package/dist/esm/{search-VYYPNNIU.js.map → search-KIPT62MB.js.map} +1 -1
- package/dist/esm/{server-6FQ4UZMS.js → server-MO3YMDHB.js} +83 -18
- package/dist/esm/server-MO3YMDHB.js.map +1 -0
- package/dist/esm/{server-Q4W2J7OE.js → server-WJH536CN.js} +2 -2
- package/dist/esm/sessions-NUOSJC6M.js +74 -0
- package/dist/esm/sessions-NUOSJC6M.js.map +1 -0
- package/dist/esm/{settings-RLSKK5RM.js → settings-SBL7WIBQ.js} +2 -2
- package/dist/esm/{try-UYLQPTBJ.js → try-2P5ZRXRT.js} +9 -9
- package/dist/esm/{wallet-QOS3FPSF.js → wallet-PY4ZDHNZ.js} +12 -12
- package/package.json +7 -7
- package/dist/esm/chunk-BFOYXXLG.js.map +0 -1
- package/dist/esm/chunk-FV6DADHO.js.map +0 -1
- package/dist/esm/chunk-G5FHPXQL.js.map +0 -1
- package/dist/esm/chunk-JX2XE6FD.js.map +0 -1
- package/dist/esm/chunk-NPJV7AMV.js.map +0 -1
- package/dist/esm/chunk-SFESERJN.js.map +0 -1
- package/dist/esm/chunk-TTAO2EJK.js.map +0 -1
- package/dist/esm/register-AD43YD5O.js.map +0 -1
- package/dist/esm/server-6FQ4UZMS.js.map +0 -1
- /package/dist/esm/{add-skill-CDIK57A3.js.map → add-skill-5HFBHQTQ.js.map} +0 -0
- /package/dist/esm/{bridge-6WMUV3ML.js.map → bridge-BOLVXKCD.js.map} +0 -0
- /package/dist/esm/{check-D5DZ6Y3T.js.map → check-FEWY37RD.js.map} +0 -0
- /package/dist/esm/{chunk-SCBLFGL2.js.map → chunk-2C7X7XIG.js.map} +0 -0
- /package/dist/esm/{chunk-UCADMHNP.js.map → chunk-2E4ZDG2M.js.map} +0 -0
- /package/dist/esm/{chunk-YUPRVVFP.js.map → chunk-4MCPQDKM.js.map} +0 -0
- /package/dist/esm/{chunk-IL2CNAJY.js.map → chunk-5MITNOWT.js.map} +0 -0
- /package/dist/esm/{chunk-MSNAPI5G.js.map → chunk-BIO4Y27B.js.map} +0 -0
- /package/dist/esm/{chunk-BNFMFAEF.js.map → chunk-C7B6LEPE.js.map} +0 -0
- /package/dist/esm/{chunk-KJCWPVQE.js.map → chunk-EM6OE6WL.js.map} +0 -0
- /package/dist/esm/{chunk-KSW2MGQR.js.map → chunk-MZPHS3IS.js.map} +0 -0
- /package/dist/esm/{chunk-K627XZI4.js.map → chunk-O57QVTLM.js.map} +0 -0
- /package/dist/esm/{chunk-NP7CKLI4.js.map → chunk-ULB5PPKW.js.map} +0 -0
- /package/dist/esm/{chunk-LGFUHPDL.js.map → chunk-VGKAPM5S.js.map} +0 -0
- /package/dist/esm/{discover-X557BWGS.js.map → discover-TXEJNB5A.js.map} +0 -0
- /package/dist/esm/{fund-HHL4QEU5.js.map → fund-FCOUEG7T.js.map} +0 -0
- /package/dist/esm/{install-KJOAEIZF.js.map → install-NJJZYBZU.js.map} +0 -0
- /package/dist/esm/{onboard-M5C6TFWE.js.map → onboard-TYB4QZE4.js.map} +0 -0
- /package/dist/esm/{origins-XG6O5K27.js.map → origins-EVVF3N4G.js.map} +0 -0
- /package/dist/esm/{report-error-FDDNOZAD.js.map → report-error-BR7ETMF7.js.map} +0 -0
- /package/dist/esm/{server-Q4W2J7OE.js.map → server-WJH536CN.js.map} +0 -0
- /package/dist/esm/{settings-RLSKK5RM.js.map → settings-SBL7WIBQ.js.map} +0 -0
- /package/dist/esm/{try-UYLQPTBJ.js.map → try-2P5ZRXRT.js.map} +0 -0
- /package/dist/esm/{wallet-QOS3FPSF.js.map → wallet-PY4ZDHNZ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../internal/networks/src/types.ts","../../../../internal/networks/src/configs.ts","../../../../internal/networks/src/schemas.ts","../../../../internal/networks/src/tokens.ts"],"sourcesContent":["import type { Chain, Address as EvmAddress } from 'viem';\nimport type { Address as SolanaAddress } from '@solana/kit';\nimport type { typedAddressSchema } from './schemas';\nimport type z from 'zod';\n\nexport type EthereumAddress = EvmAddress;\nexport { SolanaAddress };\nexport type MixedAddress = EthereumAddress | SolanaAddress;\n\nexport enum Network {\n BASE = 'base',\n TEMPO = 'tempo',\n SOLANA = 'solana',\n}\n\nexport type EvmNetwork = Exclude<Network, Network.SOLANA>;\n\nexport interface BaseNetworkConfig {\n caip2: `${string}:${string}`;\n name: string;\n}\n\nexport interface EvmNetworkConfig extends BaseNetworkConfig {\n chain: Chain;\n usdcAddress: EthereumAddress;\n rpcUrl?: string;\n}\n\nexport interface SolanaNetworkConfig extends BaseNetworkConfig {\n usdcAddress: SolanaAddress;\n}\n\nexport interface NetworkToken {\n symbol: string;\n name: string;\n icon: string;\n address: MixedAddress;\n decimals: number;\n network: Network;\n}\n\nexport type TypedNetworkAddress = z.infer<typeof typedAddressSchema>;\n","import { base, tempo } from 'viem/chains';\n\nimport { Network } from './types';\n\nimport type {\n EvmNetworkConfig,\n EvmNetwork,\n SolanaAddress,\n SolanaNetworkConfig,\n BaseNetworkConfig,\n} from './types';\n\n// Tempo's default RPC requires basic-auth credentials, so we override with\n// a shared engineering credential. Set TEMPO_RPC_URL to use a private RPC.\nconst TEMPO_RPC_URL_FALLBACK =\n 'https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz';\nconst tempoRpcEnvOverride =\n typeof process !== 'undefined' ? process.env?.TEMPO_RPC_URL : undefined;\nconst tempoRpcUrl = tempoRpcEnvOverride ?? TEMPO_RPC_URL_FALLBACK;\n\nexport const EVM_CONFIGS: Record<EvmNetwork, EvmNetworkConfig> = {\n [Network.BASE]: {\n chain: base,\n name: 'Base',\n caip2: 'eip155:8453',\n usdcAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n [Network.TEMPO]: {\n chain: tempo.extend({\n feeToken: '0x20c000000000000000000000b9537d11c60e8b50',\n }),\n name: 'Tempo',\n caip2: 'eip155:4217',\n usdcAddress: '0x20c000000000000000000000b9537d11c60e8b50',\n rpcUrl: tempoRpcUrl,\n },\n};\n\nexport const chainId = (network: EvmNetwork) => EVM_CONFIGS[network].chain.id;\n\nexport const SOLANA_CONFIG: SolanaNetworkConfig = {\n name: 'Solana',\n caip2: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n usdcAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as SolanaAddress,\n};\n\nexport const ALL_NETWORK_CONFIGS: Record<Network, BaseNetworkConfig> = {\n ...EVM_CONFIGS,\n [Network.SOLANA]: SOLANA_CONFIG,\n};\n\nexport const networkToCaip2 = (network: Network) => {\n if (network === Network.SOLANA) {\n return SOLANA_CONFIG.caip2;\n }\n return EVM_CONFIGS[network].caip2;\n};\n\nexport const TX_EXPLORER_URLS: Record<Network, string> = {\n [Network.BASE]: 'https://basescan.org/tx/',\n [Network.TEMPO]: 'https://testnet.tempo.xyz/tx/',\n [Network.SOLANA]: 'https://solscan.io/tx/',\n};\n\nexport const getTxExplorerUrl = (\n txHash: string,\n network: Network = Network.BASE\n) => `${TX_EXPLORER_URLS[network]}${txHash}`;\n\nexport const caip2ToNetwork = (caip2: `${string}:${string}`) => {\n if (caip2 === SOLANA_CONFIG.caip2) {\n return Network.SOLANA;\n }\n const evmNetwork = Object.entries(EVM_CONFIGS).find(\n ([, config]) => config.caip2 === caip2\n )?.[0];\n if (evmNetwork) {\n return evmNetwork as EvmNetwork;\n }\n return null;\n};\n","import z from 'zod';\n\nimport { Network } from './types';\n\nimport { isAddress } from 'viem';\nimport { isAddress as isSolanaAddress } from '@solana/kit';\n\nimport type { MixedAddress, SolanaAddress, EvmNetwork } from './types';\nimport { EVM_CONFIGS } from './configs';\n\nexport const networkSchema = z.enum(Network);\nexport const optionalNetworkSchema = networkSchema.optional();\n\nexport const evmNetworkSchema = z.enum(\n Object.keys(EVM_CONFIGS) as EvmNetwork[]\n);\n\nexport const ethereumAddressSchema = z\n .string()\n .refine(isAddress, 'Invalid EVM address');\n\nexport const solanaAddressSchema: z.ZodType<SolanaAddress, string> = z\n .string()\n .refine(isSolanaAddress, 'Invalid Solana address');\n\nexport const mixedAddressSchema: z.ZodType<MixedAddress, string> = z\n .union([ethereumAddressSchema, solanaAddressSchema])\n .transform(address => address as MixedAddress);\n\nexport const typedAddressSchema = z.discriminatedUnion('network', [\n z.object({\n address: ethereumAddressSchema,\n network: evmNetworkSchema,\n }),\n z.object({\n address: solanaAddressSchema,\n network: z.literal(Network.SOLANA),\n }),\n]);\n","import { EVM_CONFIGS, SOLANA_CONFIG } from './configs';\nimport { Network } from './types';\n\nimport type { NetworkToken } from './types';\n\nexport const usdc = (network: Network): NetworkToken => ({\n symbol: 'USDC',\n name: 'USD Coin',\n icon: '/usdc.png',\n decimals: 6,\n network,\n address:\n network === Network.SOLANA\n ? SOLANA_CONFIG.usdcAddress\n : EVM_CONFIGS[network].usdcAddress,\n});\n"],"mappings":";AASO,IAAK,UAAL,kBAAKA,aAAL;AACL,EAAAA,SAAA,UAAO;AACP,EAAAA,SAAA,WAAQ;AACR,EAAAA,SAAA,YAAS;AAHC,SAAAA;AAAA,GAAA;;;ACTZ,SAAS,MAAM,aAAa;AAc5B,IAAM,yBACJ;AACF,IAAM,sBACJ,OAAO,YAAY,cAAc,QAAQ,KAAK,gBAAgB;AAChE,IAAM,cAAc,uBAAuB;AAEpC,IAAM,cAAoD;AAAA,EAC/D,kBAAa,GAAG;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,oBAAc,GAAG;AAAA,IACf,OAAO,MAAM,OAAO;AAAA,MAClB,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,UAAU,CAAC,YAAwB,YAAY,OAAO,EAAE,MAAM;AAEpE,IAAM,gBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AACf;AAEO,IAAM,sBAA0D;AAAA,EACrE,GAAG;AAAA,EACH,sBAAe,GAAG;AACpB;AAEO,IAAM,iBAAiB,CAAC,YAAqB;AAClD,MAAI,mCAA4B;AAC9B,WAAO,cAAc;AAAA,EACvB;AACA,SAAO,YAAY,OAAO,EAAE;AAC9B;AAEO,IAAM,mBAA4C;AAAA,EACvD,kBAAa,GAAG;AAAA,EAChB,oBAAc,GAAG;AAAA,EACjB,sBAAe,GAAG;AACpB;AAEO,IAAM,mBAAmB,CAC9B,QACA,gCACG,GAAG,iBAAiB,OAAO,CAAC,GAAG,MAAM;AAEnC,IAAM,iBAAiB,CAAC,UAAiC;AAC9D,MAAI,UAAU,cAAc,OAAO;AACjC;AAAA,EACF;AACA,QAAM,aAAa,OAAO,QAAQ,WAAW,EAAE;AAAA,IAC7C,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,UAAU;AAAA,EACnC,IAAI,CAAC;AACL,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AChFA,OAAO,OAAO;AAId,SAAS,iBAAiB;AAC1B,SAAS,aAAa,uBAAuB;AAKtC,IAAM,gBAAgB,EAAE,KAAK,OAAO;AACpC,IAAM,wBAAwB,cAAc,SAAS;AAErD,IAAM,mBAAmB,EAAE;AAAA,EAChC,OAAO,KAAK,WAAW;AACzB;AAEO,IAAM,wBAAwB,EAClC,OAAO,EACP,OAAO,WAAW,qBAAqB;AAEnC,IAAM,sBAAwD,EAClE,OAAO,EACP,OAAO,iBAAiB,wBAAwB;AAE5C,IAAM,qBAAsD,EAChE,MAAM,CAAC,uBAAuB,mBAAmB,CAAC,EAClD,UAAU,aAAW,OAAuB;AAExC,IAAM,qBAAqB,EAAE,mBAAmB,WAAW;AAAA,EAChE,EAAE,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS,EAAE,6BAAsB;AAAA,EACnC,CAAC;AACH,CAAC;;;ACjCM,IAAM,OAAO,CAAC,aAAoC;AAAA,EACvD,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AAAA,EACA,SACE,oCACI,cAAc,cACd,YAAY,OAAO,EAAE;AAC7B;","names":["Network"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TOOL_PARAMS
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W37JKCLN.js";
|
|
4
4
|
import {
|
|
5
5
|
zodUrl
|
|
6
6
|
} from "./chunk-FB5CMO3J.js";
|
|
@@ -83,6 +83,7 @@ async function fetchScanEndpoints(origin, dev) {
|
|
|
83
83
|
found: true,
|
|
84
84
|
origin: data.data.origin,
|
|
85
85
|
source: "scan",
|
|
86
|
+
trustTier: "unverified",
|
|
86
87
|
info: {
|
|
87
88
|
title: data.data.title,
|
|
88
89
|
description: data.data.description
|
|
@@ -106,4 +107,4 @@ export {
|
|
|
106
107
|
discoverResourcesSchema,
|
|
107
108
|
discoverResources
|
|
108
109
|
};
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
110
|
+
//# sourceMappingURL=chunk-K3WB4R2P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/operations/discover.ts"],"sourcesContent":["import {\n discoverOriginSchema,\n GuidanceMode,\n type HttpMethod,\n type AuthMode,\n} from '@agentcash/discovery';\n\nimport { log } from '@/shared/log';\nimport z from 'zod';\nimport { TOOL_PARAMS } from '@/shared/descriptions';\nimport { zodUrl } from '@/shared/url';\nimport { getBaseUrl } from '@/shared/utils';\nimport type { GlobalFlags } from '@/types';\n\nexport const discoverResourcesSchema = z.object({\n url: zodUrl.describe(TOOL_PARAMS.discoverApiEndpoints.url),\n includeGuidance: z\n .boolean()\n .optional()\n .describe(TOOL_PARAMS.discoverApiEndpoints.includeGuidance),\n});\n\nexport type DiscoverResourcesInput = z.input<typeof discoverResourcesSchema>;\n\n/**\n * Discover payment-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches guidance.\n *\n * Returns DiscoverOriginSchemaSuccess on success, DiscoverOriginSchemaNotFound with cause on failure.\n */\nexport interface DiscoverOptions {\n flags?: GlobalFlags;\n}\n\nexport async function discoverResources(\n surface: string,\n args: DiscoverResourcesInput,\n options?: DiscoverOptions\n) {\n const parsedArgs = discoverResourcesSchema.safeParse(args);\n if (!parsedArgs.success) {\n return {\n found: false as const,\n cause: 'invalid_input' as const,\n message: parsedArgs.error.message,\n };\n }\n\n const { url, includeGuidance } = parsedArgs.data;\n\n const guidance =\n includeGuidance === true\n ? GuidanceMode.Always\n : includeGuidance === false\n ? GuidanceMode.Never\n : GuidanceMode.Auto;\n\n const result = await discoverOriginSchema({ target: url, guidance });\n\n if (result.found) {\n return {\n ...result,\n endpoints: result.endpoints.map(e => ({ ...e })),\n };\n }\n\n // Fallback: check agentcash server for scan-derived endpoints\n const scanResult = await fetchScanEndpoints(\n url,\n options?.flags?.dev ?? false\n );\n if (scanResult) {\n log.info(\n `[discoverResources] scan fallback found ${scanResult.endpoints.length} endpoints for ${url}`\n );\n return scanResult;\n }\n\n log.error(`[discoverResources] failed`, {\n surface,\n url,\n cause: result.cause,\n message: result.message,\n });\n return result;\n}\n\nconst scanEndpointSchema = z.object({\n method: z.string(),\n path: z.string(),\n summary: z.string().optional().default(''),\n authMode: z.string().optional(),\n price: z.string().optional(),\n});\n\nconst scanResponseSchema = z.object({\n origin: z.string(),\n title: z.string().optional().default(''),\n description: z.string().optional().default(''),\n endpoints: z.array(scanEndpointSchema),\n});\n\nasync function fetchScanEndpoints(origin: string, dev: boolean) {\n const baseUrl = getBaseUrl(dev);\n const url = `${baseUrl}/api/discover/scan?origin=${encodeURIComponent(origin)}`;\n\n return fetch(url, {\n signal: AbortSignal.timeout(5_000),\n })\n .then(async res => {\n if (!res.ok) return null;\n\n const data = scanResponseSchema.safeParse(await res.json());\n if (!data.success || data.data.endpoints.length === 0) return null;\n\n return {\n found: true as const,\n origin: data.data.origin,\n source: 'scan' as const,\n info: {\n title: data.data.title,\n description: data.data.description,\n },\n endpoints: data.data.endpoints.map(e => ({\n path: e.path,\n method: (e.method || 'GET').toUpperCase() as HttpMethod,\n summary: e.summary,\n authMode: (e.authMode as AuthMode) ?? undefined,\n protocols: ['x402' as const],\n price: e.price,\n })),\n guidanceAvailable: false,\n guidanceTokens: 0,\n guidance: undefined,\n };\n })\n .catch(() => null);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/operations/discover.ts"],"sourcesContent":["import {\n discoverOriginSchema,\n GuidanceMode,\n type HttpMethod,\n type AuthMode,\n} from '@agentcash/discovery';\n\nimport { log } from '@/shared/log';\nimport z from 'zod';\nimport { TOOL_PARAMS } from '@/shared/descriptions';\nimport { zodUrl } from '@/shared/url';\nimport { getBaseUrl } from '@/shared/utils';\nimport type { GlobalFlags } from '@/types';\n\nexport const discoverResourcesSchema = z.object({\n url: zodUrl.describe(TOOL_PARAMS.discoverApiEndpoints.url),\n includeGuidance: z\n .boolean()\n .optional()\n .describe(TOOL_PARAMS.discoverApiEndpoints.includeGuidance),\n});\n\nexport type DiscoverResourcesInput = z.input<typeof discoverResourcesSchema>;\n\n/**\n * Discover payment-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches guidance.\n *\n * Returns DiscoverOriginSchemaSuccess on success, DiscoverOriginSchemaNotFound with cause on failure.\n */\nexport interface DiscoverOptions {\n flags?: GlobalFlags;\n}\n\nexport async function discoverResources(\n surface: string,\n args: DiscoverResourcesInput,\n options?: DiscoverOptions\n) {\n const parsedArgs = discoverResourcesSchema.safeParse(args);\n if (!parsedArgs.success) {\n return {\n found: false as const,\n cause: 'invalid_input' as const,\n message: parsedArgs.error.message,\n };\n }\n\n const { url, includeGuidance } = parsedArgs.data;\n\n const guidance =\n includeGuidance === true\n ? GuidanceMode.Always\n : includeGuidance === false\n ? GuidanceMode.Never\n : GuidanceMode.Auto;\n\n const result = await discoverOriginSchema({ target: url, guidance });\n\n if (result.found) {\n return {\n ...result,\n endpoints: result.endpoints.map(e => ({ ...e })),\n };\n }\n\n // Fallback: check agentcash server for scan-derived endpoints\n const scanResult = await fetchScanEndpoints(\n url,\n options?.flags?.dev ?? false\n );\n if (scanResult) {\n log.info(\n `[discoverResources] scan fallback found ${scanResult.endpoints.length} endpoints for ${url}`\n );\n return scanResult;\n }\n\n log.error(`[discoverResources] failed`, {\n surface,\n url,\n cause: result.cause,\n message: result.message,\n });\n return result;\n}\n\nconst scanEndpointSchema = z.object({\n method: z.string(),\n path: z.string(),\n summary: z.string().optional().default(''),\n authMode: z.string().optional(),\n price: z.string().optional(),\n});\n\nconst scanResponseSchema = z.object({\n origin: z.string(),\n title: z.string().optional().default(''),\n description: z.string().optional().default(''),\n endpoints: z.array(scanEndpointSchema),\n});\n\nasync function fetchScanEndpoints(origin: string, dev: boolean) {\n const baseUrl = getBaseUrl(dev);\n const url = `${baseUrl}/api/discover/scan?origin=${encodeURIComponent(origin)}`;\n\n return fetch(url, {\n signal: AbortSignal.timeout(5_000),\n })\n .then(async res => {\n if (!res.ok) return null;\n\n const data = scanResponseSchema.safeParse(await res.json());\n if (!data.success || data.data.endpoints.length === 0) return null;\n\n return {\n found: true as const,\n origin: data.data.origin,\n source: 'scan' as const,\n trustTier: 'unverified' as const,\n info: {\n title: data.data.title,\n description: data.data.description,\n },\n endpoints: data.data.endpoints.map(e => ({\n path: e.path,\n method: (e.method || 'GET').toUpperCase() as HttpMethod,\n summary: e.summary,\n authMode: (e.authMode as AuthMode) ?? undefined,\n protocols: ['x402' as const],\n price: e.price,\n })),\n guidanceAvailable: false,\n guidanceTokens: 0,\n guidance: undefined,\n };\n })\n .catch(() => null);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TOOL_PARAMS
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W37JKCLN.js";
|
|
4
4
|
import {
|
|
5
5
|
safeFetchJson
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-RAS5DZPQ.js";
|
|
7
7
|
import {
|
|
8
8
|
EVM_CONFIGS,
|
|
9
9
|
chainId,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
solanaAddressSchema,
|
|
12
12
|
typedAddressSchema,
|
|
13
13
|
usdc
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-HTGTKVXB.js";
|
|
15
15
|
import {
|
|
16
16
|
getBaseUrl
|
|
17
17
|
} from "./chunk-U6FRXL3X.js";
|
|
@@ -526,9 +526,7 @@ var bridge = async (args, wallets) => {
|
|
|
526
526
|
createWalletClient({
|
|
527
527
|
account: wallets.evm,
|
|
528
528
|
chain: EVM_CONFIGS[from].chain,
|
|
529
|
-
transport: http(
|
|
530
|
-
from === "tempo" /* TEMPO */ ? "https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz" : void 0
|
|
531
|
-
)
|
|
529
|
+
transport: http(EVM_CONFIGS[from].rpcUrl)
|
|
532
530
|
})
|
|
533
531
|
);
|
|
534
532
|
return executeResult.map(
|
|
@@ -541,4 +539,4 @@ export {
|
|
|
541
539
|
bridgeSchema,
|
|
542
540
|
bridge
|
|
543
541
|
};
|
|
544
|
-
//# sourceMappingURL=chunk-
|
|
542
|
+
//# sourceMappingURL=chunk-MKA2PTOE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/operations/bridge.ts","../../src/shared/network.ts","../../../../internal/bridge/src/quote.ts","../../../../internal/bridge/src/client.ts","../../../../internal/bridge/src/execute.ts","../../../../internal/bridge/src/relay-svm-wallet-adapter.ts","../../src/shared/neverthrow/bridge/index.ts"],"sourcesContent":["import z from 'zod';\n\nimport { createWalletClient, http } from 'viem';\n\nimport { EVM_CONFIGS, Network, networkSchema } from '@agentcash/networks';\n\nimport { toTypedNetworkAddress } from '@/shared/network';\nimport { TOOL_PARAMS } from '@/shared/descriptions';\nimport {\n safeExecuteQuote,\n safeExecuteSolana,\n safeGetBridgeDepositQuote,\n} from '@/shared/neverthrow/bridge';\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\nimport { getBaseUrl } from '@/shared/utils';\n\nimport type { Wallets } from '@/wallet';\nimport type { Execute } from '@agentcash/bridge';\nimport type { GlobalFlags } from '@/types';\n\nexport const bridgeSchema = z\n .object({\n from: networkSchema.describe(TOOL_PARAMS.bridge.from),\n to: networkSchema.describe(TOOL_PARAMS.bridge.to),\n amount: z.number().positive().describe(TOOL_PARAMS.bridge.amount),\n })\n .refine(({ from, to }) => from !== to, {\n message: 'From and to networks cannot be the same',\n });\n\nexport type BridgeInput = z.input<typeof bridgeSchema>;\n\nexport const bridge = async (\n args: GlobalFlags<z.infer<typeof bridgeSchema>>,\n wallets: Wallets\n) => {\n const { from, to, amount } = args;\n\n if (from === Network.SOLANA) {\n const request = new Request(`${getBaseUrl(args.dev)}/api/bridge/solana`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify({\n fromAddress: wallets.svm.address,\n to: toTypedNetworkAddress(to, wallets),\n amount,\n }),\n });\n const response = await safeFetchJson(\n 'bridge',\n request,\n z.object({\n success: z.literal(true),\n partiallySignedTransaction: z.string(),\n quote: z.custom<Execute>(),\n })\n );\n\n if (response.isErr()) {\n return response;\n }\n\n const { partiallySignedTransaction, quote } = response.value;\n\n const executeResult = await safeExecuteSolana('bridge', {\n quote,\n signer: wallets.svm,\n partiallySignedTransaction,\n });\n\n return executeResult.map(\n result => result.data.details ?? { success: true }\n );\n } else {\n const quote = await safeGetBridgeDepositQuote('bridge', {\n from: toTypedNetworkAddress(from, wallets),\n to: toTypedNetworkAddress(to, wallets),\n amount,\n });\n\n if (quote.isErr()) {\n return quote;\n }\n\n const executeResult = await safeExecuteQuote(\n 'bridge',\n quote.value,\n createWalletClient({\n account: wallets.evm,\n chain: EVM_CONFIGS[from].chain,\n transport: http(EVM_CONFIGS[from].rpcUrl),\n })\n );\n\n return executeResult.map(\n result => result.data.details ?? { success: true }\n );\n }\n};\n","import { Network } from '@agentcash/networks';\n\nimport type { TypedNetworkAddress } from '@agentcash/networks';\nimport type { Wallets } from '@/wallet';\n\nexport const toTypedNetworkAddress = (\n network: Network,\n wallets: Wallets\n): TypedNetworkAddress => {\n if (network === Network.SOLANA) {\n return {\n address: wallets.svm.address,\n network: Network.SOLANA,\n };\n }\n return {\n address: wallets.evm.address,\n network: network,\n };\n};\n","import {\n Network,\n solanaAddressSchema,\n typedAddressSchema,\n usdc,\n} from '@agentcash/networks';\nimport z from 'zod';\n\nimport { relayClient, relayChainId } from './client';\n\nexport const getBridgeDepositQuoteSchema = z.object({\n from: typedAddressSchema,\n to: typedAddressSchema,\n amount: z.number(),\n depositFeePayer: solanaAddressSchema.optional(),\n});\n\nexport const getBridgeDepositQuote = async (\n input: z.input<typeof getBridgeDepositQuoteSchema>\n) => {\n const parseResult = getBridgeDepositQuoteSchema.safeParse(input);\n if (!parseResult.success) {\n throw new Error('Invalid input');\n }\n\n const { from, to, amount, depositFeePayer } = parseResult.data;\n\n const fromCurrency = usdc(from.network);\n const toCurrency = usdc(to.network);\n\n return await relayClient.actions.getQuote({\n chainId: relayChainId(from.network),\n toChainId: relayChainId(to.network),\n currency: fromCurrency.address,\n toCurrency: toCurrency.address,\n tradeType: 'EXACT_INPUT',\n user: from.address,\n recipient: to.address,\n amount: (amount * 10 ** fromCurrency.decimals).toString(),\n options: {\n refundTo: from.address,\n depositFeePayer:\n from.network === Network.SOLANA ? depositFeePayer : undefined,\n usePermit: from.network !== Network.SOLANA,\n },\n });\n};\n","import {\n createClient,\n convertViemChainToRelayChain,\n MAINNET_RELAY_API,\n} from '@relayprotocol/relay-sdk';\n\nimport { Network, chainId, EVM_CONFIGS } from '@agentcash/networks';\n\nimport type { RelayChain } from '@relayprotocol/relay-sdk';\n\nexport const SOLANA_RELAY_CHAIN: RelayChain = {\n id: 792703809,\n name: 'solana',\n displayName: 'Solana',\n httpRpcUrl: 'https://api.mainnet-beta.solana.com',\n wsRpcUrl: '',\n explorerUrl: 'https://solscan.io',\n depositEnabled: true,\n tokenSupport: 'All',\n currency: {\n id: 'sol',\n symbol: 'SOL',\n name: 'Solana',\n address: '11111111111111111111111111111111',\n decimals: 9,\n supportsBridging: true,\n },\n featuredTokens: [\n {\n id: 'sol',\n symbol: 'SOL',\n name: 'Solana',\n address: '11111111111111111111111111111111',\n decimals: 9,\n supportsBridging: true,\n metadata: {\n logoURI:\n 'https://upload.wikimedia.org/wikipedia/en/b/b9/Solana_logo.png',\n },\n },\n {\n id: 'usdc',\n symbol: 'USDC',\n name: 'USD Coin',\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n decimals: 6,\n supportsBridging: true,\n metadata: {\n logoURI:\n 'https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694',\n },\n },\n {\n id: 'usdt',\n symbol: 'USDT',\n name: 'USDT',\n address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n decimals: 6,\n supportsBridging: true,\n metadata: {\n logoURI:\n 'https://coin-images.coingecko.com/coins/images/325/large/Tether.png?1696501661',\n },\n },\n ],\n erc20Currencies: [\n {\n id: 'pengu',\n symbol: 'PENGU',\n name: 'Pudgy Penguins',\n address: '2zMMhcVQEXDtdE6vsFS7S7D5oUodfJHE8vd1gnBouauv',\n decimals: 6,\n supportsBridging: true,\n withdrawalFee: 25,\n depositFee: 0,\n surgeEnabled: false,\n },\n {\n id: 'usdc',\n symbol: 'USDC',\n name: 'USD Coin',\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n decimals: 6,\n supportsBridging: true,\n supportsPermit: true,\n withdrawalFee: 2.25,\n depositFee: 2,\n surgeEnabled: false,\n },\n {\n id: 'usdt',\n symbol: 'USDT',\n name: 'USDT',\n address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n decimals: 6,\n supportsBridging: true,\n withdrawalFee: 5,\n depositFee: 2,\n surgeEnabled: false,\n },\n {\n id: 'cash',\n symbol: 'CASH',\n name: 'CASH',\n address: 'CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH',\n decimals: 6,\n supportsBridging: true,\n withdrawalFee: 25,\n depositFee: 0,\n surgeEnabled: false,\n },\n {\n id: 'pyusd',\n symbol: 'PYUSD',\n name: 'PayPal USD',\n address: '2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo',\n decimals: 6,\n supportsBridging: true,\n withdrawalFee: 25,\n depositFee: 0,\n surgeEnabled: false,\n },\n ],\n solverCurrencies: [\n {\n id: 'pengu',\n symbol: 'PENGU',\n name: 'Pudgy Penguins',\n address: '2zMMhcVQEXDtdE6vsFS7S7D5oUodfJHE8vd1gnBouauv',\n decimals: 6,\n },\n {\n id: 'usdc',\n symbol: 'USDC',\n name: 'USD Coin',\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n decimals: 6,\n },\n {\n id: 'usdt',\n symbol: 'USDT',\n name: 'USDT',\n address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n decimals: 6,\n },\n {\n id: 'cash',\n symbol: 'CASH',\n name: 'CASH',\n address: 'CASHx9KJUStyftLFWGvEVf59SGeG9sh5FfcnZMVPCASH',\n decimals: 6,\n },\n {\n id: 'pyusd',\n symbol: 'PYUSD',\n name: 'PayPal USD',\n address: '2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo',\n decimals: 6,\n },\n {\n id: 'sol',\n symbol: 'SOL',\n name: 'Solana',\n address: '11111111111111111111111111111111',\n decimals: 9,\n },\n ],\n iconUrl: 'https://assets.relay.link/icons/792703809/light.png',\n vmType: 'svm',\n baseChainId: 1,\n tags: [],\n protocol: {\n v2: {\n chainId: 'solana',\n depository: '99vQwtBwYtrqqD9YSXbdum3KBdxPAVxYTaQ3cfnJSrN2',\n },\n },\n};\n\nexport const relayChainId = (network: Network) => {\n switch (network) {\n case Network.BASE:\n case Network.TEMPO:\n return chainId(network);\n case Network.SOLANA:\n return SOLANA_RELAY_CHAIN.id;\n }\n};\n\nexport const relayClient = createClient({\n baseApiUrl: MAINNET_RELAY_API,\n source: 'https://agentcash.dev',\n chains: [\n ...Object.values(EVM_CONFIGS).map(config =>\n convertViemChainToRelayChain(config.chain)\n ),\n SOLANA_RELAY_CHAIN,\n ],\n});\n","import { adaptViemWallet } from '@relayprotocol/relay-sdk';\n\nimport { relayClient } from './client';\nimport type { AdaptSolanaKitWalletParams } from './relay-svm-wallet-adapter';\nimport { adaptSolanaKitWallet } from './relay-svm-wallet-adapter';\n\nimport type { WalletClient } from 'viem';\nimport type { Execute } from '@relayprotocol/relay-sdk';\n\nexport const executeQuote = async (quote: Execute, account: WalletClient) => {\n return await relayClient.actions.execute({\n wallet: adaptViemWallet(account),\n quote,\n });\n};\n\nexport interface ExecuteSolanaParams extends AdaptSolanaKitWalletParams {\n quote: Execute;\n}\n\nexport const executeSolana = async ({\n quote,\n ...rest\n}: ExecuteSolanaParams) => {\n return await relayClient.actions.execute({\n wallet: adaptSolanaKitWallet(rest),\n quote,\n });\n};\n","import {\n assertIsSendableTransaction,\n assertIsTransactionWithinSizeLimit,\n createSolanaRpc,\n getBase64EncodedWireTransaction,\n getCompiledTransactionMessageDecoder,\n getSignatureFromTransaction,\n getTransactionDecoder,\n getTransactionLifetimeConstraintFromCompiledTransactionMessage,\n isTransactionModifyingSigner,\n isTransactionPartialSigner,\n isTransactionSendingSigner,\n} from '@solana/kit';\nimport { LogLevel, getClient } from '@relayprotocol/relay-sdk';\n\nimport { SOLANA_RELAY_CHAIN } from './client';\n\nimport type { AdaptedWallet } from '@relayprotocol/relay-sdk';\nimport type {\n ClusterUrl,\n Signature,\n Transaction,\n TransactionSigner,\n TransactionWithLifetime,\n TransactionWithinSizeLimit,\n} from '@solana/kit';\n\nconst BASE58_SIGNATURE_REGEX = /^[1-9A-HJ-NP-Za-km-z]+$/;\nconst DEFAULT_CONFIRM_TIMEOUT_MS = 120_000;\nconst DEFAULT_CONFIRM_POLL_MS = 2_000;\n\nexport interface AdaptSolanaKitWalletParams {\n signer: TransactionSigner;\n partiallySignedTransaction: string;\n rpcUrl?: ClusterUrl;\n}\n\ntype SignableTransaction = Transaction &\n TransactionWithLifetime &\n TransactionWithinSizeLimit;\n\nconst assertBase58TransactionSignature = (signature: string | undefined) => {\n if (\n typeof signature !== 'string' ||\n signature.length === 0 ||\n !BASE58_SIGNATURE_REGEX.test(signature)\n ) {\n throw new Error('Invalid Solana signature: expected base58.');\n }\n};\n\nconst sleep = async (ms: number) =>\n await new Promise(resolve => setTimeout(resolve, ms));\n\nasync function decodePartiallySignedTransaction(\n partiallySignedTransaction: string\n): Promise<SignableTransaction> {\n const decodedTransaction = getTransactionDecoder().decode(\n Uint8Array.from(Buffer.from(partiallySignedTransaction, 'base64'))\n );\n const compiledTransactionMessage =\n getCompiledTransactionMessageDecoder().decode(\n decodedTransaction.messageBytes\n );\n const lifetimeConstraint =\n await getTransactionLifetimeConstraintFromCompiledTransactionMessage(\n compiledTransactionMessage\n );\n const transactionWithLifetime = {\n ...decodedTransaction,\n lifetimeConstraint,\n };\n\n assertIsTransactionWithinSizeLimit(transactionWithLifetime);\n\n return transactionWithLifetime;\n}\n\nasync function signTransactionWithSigner(\n transaction: SignableTransaction,\n signer: TransactionSigner\n): Promise<SignableTransaction> {\n if (isTransactionModifyingSigner(signer)) {\n const [signedTransaction] = await signer.modifyAndSignTransactions([\n transaction,\n ]);\n\n if (!signedTransaction) {\n throw new Error('Modifying signer did not return a signed transaction');\n }\n\n return signedTransaction;\n }\n\n if (isTransactionPartialSigner(signer)) {\n const [signatureDictionary] = await signer.signTransactions([transaction]);\n\n if (!signatureDictionary) {\n throw new Error('Transaction signer did not return signatures');\n }\n\n return {\n ...transaction,\n signatures: Object.freeze({\n ...transaction.signatures,\n ...signatureDictionary,\n }),\n };\n }\n\n if (isTransactionSendingSigner(signer)) {\n throw new Error(\n 'TransactionSendingSigner is not supported by Relay Solana adapter'\n );\n }\n\n throw new Error(\n 'Unsupported Solana transaction signer provided to Relay adapter'\n );\n}\n\nexport const adaptSolanaKitWallet = ({\n rpcUrl = SOLANA_RELAY_CHAIN.httpRpcUrl as ClusterUrl,\n signer,\n partiallySignedTransaction,\n}: AdaptSolanaKitWalletParams): AdaptedWallet => {\n const rpc = createSolanaRpc(rpcUrl);\n return {\n vmType: 'svm',\n getChainId: () => Promise.resolve(SOLANA_RELAY_CHAIN.id),\n address: () => Promise.resolve(signer.address),\n handleSignMessageStep: () => {\n throw new Error('Message signing not implemented for Solana');\n },\n handleSendTransactionStep: async () => {\n const client = getClient();\n const decodedTransaction = await decodePartiallySignedTransaction(\n partiallySignedTransaction\n );\n const signedTransaction = await signTransactionWithSigner(\n decodedTransaction,\n signer\n );\n\n assertIsSendableTransaction(signedTransaction);\n const wireTransaction =\n getBase64EncodedWireTransaction(signedTransaction);\n const signature = getSignatureFromTransaction(signedTransaction);\n\n await rpc\n .sendTransaction(wireTransaction, {\n encoding: 'base64',\n skipPreflight: false,\n preflightCommitment: 'confirmed',\n })\n .send();\n\n assertBase58TransactionSignature(signature);\n\n client.log(\n ['Transaction Signature obtained', { signature }],\n LogLevel.Verbose\n );\n\n return signature;\n },\n handleConfirmTransactionStep: async txHash => {\n assertBase58TransactionSignature(txHash);\n\n const deadline = Date.now() + DEFAULT_CONFIRM_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n const { value: statuses } = await rpc\n .getSignatureStatuses([txHash as Signature])\n .send();\n\n const status = statuses[0];\n\n if (status) {\n if (status.err) {\n throw new Error(\n `Transaction failed: ${JSON.stringify(status.err)}`\n );\n }\n\n if (\n status.confirmationStatus === 'confirmed' ||\n status.confirmationStatus === 'finalized'\n ) {\n return {\n blockHash: status.slot.toString(),\n blockNumber: Number(status.slot),\n txHash,\n };\n }\n }\n\n await sleep(DEFAULT_CONFIRM_POLL_MS);\n }\n\n throw new Error(\n `Transaction not confirmed within ${DEFAULT_CONFIRM_TIMEOUT_MS}ms: ${txHash}`\n );\n },\n switchChain: () => {\n throw new Error('Switching chains not implemented for Solana');\n },\n };\n};\n","import {\n executeQuote,\n executeSolana,\n getBridgeDepositQuote,\n} from '@agentcash/bridge';\nimport { err, resultFromPromise } from '@agentcash/neverthrow';\n\nimport type { BaseBridgeError } from './types';\n\nconst errorType = 'bridge';\n\nexport const bridgeErr = (surface: string, error: BaseBridgeError) =>\n err(errorType, surface, error);\n\nconst bridgeResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseBridgeError\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst getErrorMessage = (error: unknown, fallback: string) => {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n\n if (typeof error === 'string' && error.length > 0) {\n return error;\n }\n\n return fallback;\n};\n\nexport const safeGetBridgeDepositQuote = (\n surface: string,\n ...args: Parameters<typeof getBridgeDepositQuote>\n) =>\n bridgeResultFromPromise(surface, getBridgeDepositQuote(...args), error => {\n const errorMessage = getErrorMessage(\n error,\n 'Failed to get bridge deposit quote'\n );\n\n return {\n cause: 'get_bridge_deposit_quote',\n errorMessage,\n message: `Failed to get bridge deposit quote: ${errorMessage}`,\n };\n });\n\nexport const safeExecuteQuote = (\n surface: string,\n ...args: Parameters<typeof executeQuote>\n) =>\n bridgeResultFromPromise(surface, executeQuote(...args), error => {\n const errorMessage = getErrorMessage(error, 'Failed to execute quote');\n\n return {\n cause: 'execute_quote',\n errorMessage,\n message: `Failed to execute quote: ${errorMessage}`,\n };\n });\n\nexport const safeExecuteSolana = (\n surface: string,\n ...args: Parameters<typeof executeSolana>\n) =>\n bridgeResultFromPromise(surface, executeSolana(...args), error => {\n const errorMessage = getErrorMessage(\n error,\n 'Failed to execute Solana bridge transaction'\n );\n\n return {\n cause: 'execute_solana',\n errorMessage,\n message: `Failed to execute Solana bridge transaction: ${errorMessage}`,\n };\n });\n"],"mappings":"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","names":["z","z"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TOOL_PARAMS
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-W37JKCLN.js";
|
|
4
4
|
import {
|
|
5
5
|
executeFetch
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-HNDMHX4B.js";
|
|
7
7
|
import {
|
|
8
8
|
safeParseResponse
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RAS5DZPQ.js";
|
|
10
10
|
import {
|
|
11
11
|
log
|
|
12
12
|
} from "./chunk-QZCSZB7E.js";
|
|
@@ -89,4 +89,4 @@ export {
|
|
|
89
89
|
searchSchema,
|
|
90
90
|
search
|
|
91
91
|
};
|
|
92
|
-
//# sourceMappingURL=chunk-
|
|
92
|
+
//# sourceMappingURL=chunk-MZPHS3IS.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
discoverResources
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-K3WB4R2P.js";
|
|
4
4
|
import {
|
|
5
5
|
errorResponse
|
|
6
6
|
} from "./chunk-7EBJ4BCH.js";
|
|
@@ -52,4 +52,4 @@ function resolveDescription(result) {
|
|
|
52
52
|
export {
|
|
53
53
|
resolveOrigin
|
|
54
54
|
};
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
55
|
+
//# sourceMappingURL=chunk-O57QVTLM.js.map
|
|
@@ -62,6 +62,19 @@ var safeFetchJson = (surface, request, schema, timeout) => {
|
|
|
62
62
|
}));
|
|
63
63
|
}).andThen((data) => safeParse(surface, schema, data));
|
|
64
64
|
};
|
|
65
|
+
var safeReadResponseText = (surface, response) => {
|
|
66
|
+
return resultFromPromise(
|
|
67
|
+
errorType,
|
|
68
|
+
surface,
|
|
69
|
+
(async () => response.clone().text())(),
|
|
70
|
+
() => ({
|
|
71
|
+
cause: "parse",
|
|
72
|
+
message: "Failed to read response body as text",
|
|
73
|
+
statusCode: response.status,
|
|
74
|
+
contentType: response.headers.get("content-type") ?? "Not specified"
|
|
75
|
+
})
|
|
76
|
+
);
|
|
77
|
+
};
|
|
65
78
|
var safeParseResponse = (surface, response) => {
|
|
66
79
|
return resultFromPromise(
|
|
67
80
|
errorType,
|
|
@@ -134,7 +147,8 @@ export {
|
|
|
134
147
|
fetchHttpErr,
|
|
135
148
|
safeFetch,
|
|
136
149
|
safeFetchJson,
|
|
150
|
+
safeReadResponseText,
|
|
137
151
|
safeParseResponse,
|
|
138
152
|
isFetchError
|
|
139
153
|
};
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
154
|
+
//# sourceMappingURL=chunk-RAS5DZPQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/neverthrow/fetch/index.ts"],"sourcesContent":["import contentType from 'content-type';\nimport { err, ok, resultFromPromise } from '@agentcash/neverthrow';\n\nimport type z from 'zod';\n\nimport type { BaseError, Error } from '@agentcash/neverthrow/types';\nimport type { BaseFetchError, FetchError, ParsedResponse } from './types';\nimport type { JsonObject } from '../json/types';\nimport { safeParse } from '../parse';\n\nconst DEFAULT_USER_FETCH_TIMEOUT = 30_000;\n\nconst IMAGE_TYPES = new Set([\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'image/tiff',\n 'image/bmp',\n 'image/ico',\n]);\n\nconst errorType = 'fetch';\n\nexport const fetchErr = (surface: string, error: BaseFetchError) =>\n err(errorType, surface, error);\nexport const fetchOk = <T>(value: T) => ok(value);\n\nexport const fetchHttpErr = (surface: string, response: Response) =>\n fetchErr(surface, {\n cause: 'http' as const,\n statusCode: response.status,\n message: response.statusText,\n response,\n });\n\nexport const safeFetch = (\n surface: string,\n request: Request,\n timeout = DEFAULT_USER_FETCH_TIMEOUT\n) => {\n const signal = AbortSignal.timeout(timeout);\n\n return resultFromPromise(\n errorType,\n surface,\n fetch(request, ...(signal ? [{ signal }] : [])),\n error => {\n if (\n error instanceof DOMException &&\n (error.name === 'TimeoutError' || error.name === 'AbortError')\n ) {\n return {\n cause: 'timeout',\n message: timeout\n ? `Request timed out after ${timeout}ms. You can increase the timeout by passing a larger value in the 'timeout' parameter.`\n : 'Request was aborted',\n } as BaseFetchError;\n }\n\n return {\n cause: 'network',\n message: error instanceof Error ? error.message : 'Network error',\n } as BaseFetchError;\n }\n );\n};\n\nexport const safeFetchJson = <T>(\n surface: string,\n request: Request,\n schema: z.ZodSchema<T>,\n timeout?: number\n) => {\n return safeFetch(surface, request, timeout)\n .andThen(response => {\n if (!response.ok) {\n return fetchHttpErr(surface, response);\n }\n\n return resultFromPromise(errorType, surface, response.json(), () => ({\n cause: 'parse' as const,\n message: 'Could not parse JSON from response',\n statusCode: response.status,\n contentType: response.headers.get('content-type') ?? 'Not specified',\n }));\n })\n .andThen(data => safeParse(surface, schema, data));\n};\n\nexport const safeReadResponseText = (surface: string, response: Response) => {\n // async IIFE so a sync throw from `.clone()` becomes a rejection alongside\n // any `.text()` rejection — `resultFromPromise` captures both.\n return resultFromPromise(\n errorType,\n surface,\n (async () => response.clone().text())(),\n () => ({\n cause: 'parse' as const,\n message: 'Failed to read response body as text',\n statusCode: response.status,\n contentType: response.headers.get('content-type') ?? 'Not specified',\n })\n );\n};\n\nexport const safeParseResponse = (surface: string, response: Response) => {\n return resultFromPromise(\n errorType,\n surface,\n (async (): Promise<ParsedResponse> => {\n const header = response.headers.get('content-type');\n const { type: mimeType } = header\n ? contentType.parse(header)\n : { type: 'application/octet-stream' };\n\n switch (mimeType) {\n case 'application/json':\n return {\n type: 'json' as const,\n data: (await response.json()) as JsonObject,\n };\n case 'application/pdf':\n return {\n type: 'pdf' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n case 'application/octet-stream':\n return {\n type: 'octet-stream' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n case 'multipart/form-data':\n return { type: 'formData' as const, data: await response.formData() };\n }\n\n if (IMAGE_TYPES.has(mimeType)) {\n return {\n type: 'image' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n }\n\n if (mimeType.startsWith('audio/')) {\n return {\n type: 'audio' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n }\n\n if (mimeType.startsWith('video/')) {\n return {\n type: 'video' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n }\n\n if (mimeType.startsWith('text/')) {\n return { type: 'text' as const, data: await response.text() };\n }\n\n throw new Error(`Unsupported content type: ${header}`);\n })(),\n e => ({\n cause: 'parse' as const,\n message: e instanceof Error ? e.message : 'Could not parse response',\n statusCode: response.status,\n contentType: response.headers.get('content-type') ?? 'Not specified',\n })\n );\n};\n\nexport const isFetchError = (error: Error<BaseError>): error is FetchError => {\n return error.type === errorType;\n};\n"],"mappings":";;;;;;;;;;AAAA,OAAO,iBAAiB;AAUxB,IAAM,6BAA6B;AAEnC,IAAM,cAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,YAAY;AAEX,IAAM,WAAW,CAAC,SAAiB,UACxC,IAAI,WAAW,SAAS,KAAK;AACxB,IAAM,UAAU,CAAI,UAAa,GAAG,KAAK;AAEzC,IAAM,eAAe,CAAC,SAAiB,aAC5C,SAAS,SAAS;AAAA,EAChB,OAAO;AAAA,EACP,YAAY,SAAS;AAAA,EACrB,SAAS,SAAS;AAAA,EAClB;AACF,CAAC;AAEI,IAAM,YAAY,CACvB,SACA,SACA,UAAU,+BACP;AACH,QAAM,SAAS,YAAY,QAAQ,OAAO;AAE1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,SAAS,GAAI,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAE;AAAA,IAC9C,WAAS;AACP,UACE,iBAAiB,iBAChB,MAAM,SAAS,kBAAkB,MAAM,SAAS,eACjD;AACA,eAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS,UACL,2BAA2B,OAAO,2FAClC;AAAA,QACN;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,gBAAgB,CAC3B,SACA,SACA,QACA,YACG;AACH,SAAO,UAAU,SAAS,SAAS,OAAO,EACvC,QAAQ,cAAY;AACnB,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,aAAa,SAAS,QAAQ;AAAA,IACvC;AAEA,WAAO,kBAAkB,WAAW,SAAS,SAAS,KAAK,GAAG,OAAO;AAAA,MACnE,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY,SAAS;AAAA,MACrB,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACvD,EAAE;AAAA,EACJ,CAAC,EACA,QAAQ,UAAQ,UAAU,SAAS,QAAQ,IAAI,CAAC;AACrD;AAEO,IAAM,uBAAuB,CAAC,SAAiB,aAAuB;AAG3E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,KACC,YAAY,SAAS,MAAM,EAAE,KAAK,GAAG;AAAA,IACtC,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY,SAAS;AAAA,MACrB,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACvD;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB,CAAC,SAAiB,aAAuB;AACxE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,KACC,YAAqC;AACpC,YAAM,SAAS,SAAS,QAAQ,IAAI,cAAc;AAClD,YAAM,EAAE,MAAM,SAAS,IAAI,SACvB,YAAY,MAAM,MAAM,IACxB,EAAE,MAAM,2BAA2B;AAEvC,cAAQ,UAAU;AAAA,QAChB,KAAK;AACH,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAO,MAAM,SAAS,KAAK;AAAA,UAC7B;AAAA,QACF,KAAK;AACH,iBAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,YACA,MAAM,MAAM,SAAS,YAAY;AAAA,UACnC;AAAA,QACF,KAAK;AACH,iBAAO;AAAA,YACL,MAAM;AAAA,YACN;AAAA,YACA,MAAM,MAAM,SAAS,YAAY;AAAA,UACnC;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,MAAM,YAAqB,MAAM,MAAM,SAAS,SAAS,EAAE;AAAA,MACxE;AAEA,UAAI,YAAY,IAAI,QAAQ,GAAG;AAC7B,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,MAAM,MAAM,SAAS,YAAY;AAAA,QACnC;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,QAAQ,GAAG;AACjC,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,MAAM,MAAM,SAAS,YAAY;AAAA,QACnC;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,QAAQ,GAAG;AACjC,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,MAAM,MAAM,SAAS,YAAY;AAAA,QACnC;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,OAAO,GAAG;AAChC,eAAO,EAAE,MAAM,QAAiB,MAAM,MAAM,SAAS,KAAK,EAAE;AAAA,MAC9D;AAEA,YAAM,IAAI,MAAM,6BAA6B,MAAM,EAAE;AAAA,IACvD,GAAG;AAAA,IACH,QAAM;AAAA,MACJ,OAAO;AAAA,MACP,SAAS,aAAa,QAAQ,EAAE,UAAU;AAAA,MAC1C,YAAY,SAAS;AAAA,MACrB,aAAa,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACvD;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAAC,UAAiD;AAC5E,SAAO,MAAM,SAAS;AACxB;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
REQUEST_FETCH_PARAMS,
|
|
3
3
|
REQUEST_PARAMS
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-W37JKCLN.js";
|
|
5
5
|
import {
|
|
6
6
|
RequestMethod
|
|
7
7
|
} from "./chunk-LNJIXYCU.js";
|
|
@@ -30,7 +30,12 @@ var fetchShape = {
|
|
|
30
30
|
paymentNetwork: z.enum(paymentNetworks).optional().describe(REQUEST_FETCH_PARAMS.paymentNetwork),
|
|
31
31
|
paymentProtocol: z.enum(paymentProtocols).optional().describe(REQUEST_FETCH_PARAMS.paymentProtocol),
|
|
32
32
|
maxAmount: z.number().positive().optional().describe(REQUEST_FETCH_PARAMS.maxAmount),
|
|
33
|
-
timeout: z.number().int().positive().optional().describe(REQUEST_PARAMS.timeout)
|
|
33
|
+
timeout: z.number().int().positive().optional().describe(REQUEST_PARAMS.timeout),
|
|
34
|
+
stream: z.boolean().optional().describe(REQUEST_FETCH_PARAMS.stream),
|
|
35
|
+
channelId: z.string().regex(
|
|
36
|
+
/^0x[0-9a-fA-F]{64}$/,
|
|
37
|
+
"channelId must be a 0x-prefixed 32-byte hex string"
|
|
38
|
+
).optional().describe(REQUEST_FETCH_PARAMS.channelId)
|
|
34
39
|
};
|
|
35
40
|
|
|
36
41
|
export {
|
|
@@ -40,4 +45,4 @@ export {
|
|
|
40
45
|
paymentProtocols,
|
|
41
46
|
fetchShape
|
|
42
47
|
};
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
48
|
+
//# sourceMappingURL=chunk-SLTRGQ7W.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/request/schemas/core.ts"],"sourcesContent":["import z from 'zod';\n\nimport { REQUEST_PARAMS, REQUEST_FETCH_PARAMS } from '@/shared/descriptions';\nimport { PaymentProtocol } from '@/shared/protocols/types';\nimport { Network } from '@agentcash/networks';\nimport { zodUrl } from '@/shared/url';\n\nimport { RequestMethod } from '../types';\n\nexport const requestMethodValues: readonly RequestMethod[] =\n Object.values(RequestMethod);\n\nconst methodSchema = z\n .enum(RequestMethod)\n .optional()\n .default(RequestMethod.GET)\n .describe(REQUEST_PARAMS.method);\n\nexport const coreRequestSchema = z.object({\n url: zodUrl.describe(REQUEST_PARAMS.url),\n method: methodSchema,\n});\n\nexport const paymentNetworks: Network[] = [\n Network.BASE,\n Network.SOLANA,\n Network.TEMPO,\n];\n\nexport const paymentProtocols: PaymentProtocol[] = [\n PaymentProtocol.X402,\n PaymentProtocol.MPP,\n];\n\nexport const fetchShape = {\n paymentNetwork: z\n .enum(paymentNetworks)\n .optional()\n .describe(REQUEST_FETCH_PARAMS.paymentNetwork),\n paymentProtocol: z\n .enum(paymentProtocols)\n .optional()\n .describe(REQUEST_FETCH_PARAMS.paymentProtocol),\n maxAmount: z\n .number()\n .positive()\n .optional()\n .describe(REQUEST_FETCH_PARAMS.maxAmount),\n timeout: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(REQUEST_PARAMS.timeout),\n};\n"],"mappings":";;;;;;;;;;;;AAAA,OAAO,OAAO;AASP,IAAM,sBACX,OAAO,OAAO,aAAa;AAE7B,IAAM,eAAe,EAClB,KAAK,aAAa,EAClB,SAAS,EACT,uBAAyB,EACzB,SAAS,eAAe,MAAM;AAE1B,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,KAAK,OAAO,SAAS,eAAe,GAAG;AAAA,EACvC,QAAQ;AACV,CAAC;AAEM,IAAM,kBAA6B;AAAA;AAAA;AAAA;AAI1C;AAEO,IAAM,mBAAsC;AAAA;AAAA;AAGnD;AAEO,IAAM,aAAa;AAAA,EACxB,gBAAgB,EACb,KAAK,eAAe,EACpB,SAAS,EACT,SAAS,qBAAqB,cAAc;AAAA,EAC/C,iBAAiB,EACd,KAAK,gBAAgB,EACrB,SAAS,EACT,SAAS,qBAAqB,eAAe;AAAA,EAChD,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,qBAAqB,SAAS;AAAA,EAC1C,SAAS,EACN,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,eAAe,OAAO;
|
|
1
|
+
{"version":3,"sources":["../../src/shared/request/schemas/core.ts"],"sourcesContent":["import z from 'zod';\n\nimport { REQUEST_PARAMS, REQUEST_FETCH_PARAMS } from '@/shared/descriptions';\nimport { PaymentProtocol } from '@/shared/protocols/types';\nimport { Network } from '@agentcash/networks';\nimport { zodUrl } from '@/shared/url';\n\nimport { RequestMethod } from '../types';\n\nexport const requestMethodValues: readonly RequestMethod[] =\n Object.values(RequestMethod);\n\nconst methodSchema = z\n .enum(RequestMethod)\n .optional()\n .default(RequestMethod.GET)\n .describe(REQUEST_PARAMS.method);\n\nexport const coreRequestSchema = z.object({\n url: zodUrl.describe(REQUEST_PARAMS.url),\n method: methodSchema,\n});\n\nexport const paymentNetworks: Network[] = [\n Network.BASE,\n Network.SOLANA,\n Network.TEMPO,\n];\n\nexport const paymentProtocols: PaymentProtocol[] = [\n PaymentProtocol.X402,\n PaymentProtocol.MPP,\n];\n\nexport const fetchShape = {\n paymentNetwork: z\n .enum(paymentNetworks)\n .optional()\n .describe(REQUEST_FETCH_PARAMS.paymentNetwork),\n paymentProtocol: z\n .enum(paymentProtocols)\n .optional()\n .describe(REQUEST_FETCH_PARAMS.paymentProtocol),\n maxAmount: z\n .number()\n .positive()\n .optional()\n .describe(REQUEST_FETCH_PARAMS.maxAmount),\n timeout: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(REQUEST_PARAMS.timeout),\n stream: z.boolean().optional().describe(REQUEST_FETCH_PARAMS.stream),\n channelId: z\n .string()\n .regex(\n /^0x[0-9a-fA-F]{64}$/,\n 'channelId must be a 0x-prefixed 32-byte hex string'\n )\n .optional()\n .describe(REQUEST_FETCH_PARAMS.channelId),\n};\n"],"mappings":";;;;;;;;;;;;AAAA,OAAO,OAAO;AASP,IAAM,sBACX,OAAO,OAAO,aAAa;AAE7B,IAAM,eAAe,EAClB,KAAK,aAAa,EAClB,SAAS,EACT,uBAAyB,EACzB,SAAS,eAAe,MAAM;AAE1B,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,KAAK,OAAO,SAAS,eAAe,GAAG;AAAA,EACvC,QAAQ;AACV,CAAC;AAEM,IAAM,kBAA6B;AAAA;AAAA;AAAA;AAI1C;AAEO,IAAM,mBAAsC;AAAA;AAAA;AAGnD;AAEO,IAAM,aAAa;AAAA,EACxB,gBAAgB,EACb,KAAK,eAAe,EACpB,SAAS,EACT,SAAS,qBAAqB,cAAc;AAAA,EAC/C,iBAAiB,EACd,KAAK,gBAAgB,EACrB,SAAS,EACT,SAAS,qBAAqB,eAAe;AAAA,EAChD,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,qBAAqB,SAAS;AAAA,EAC1C,SAAS,EACN,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,eAAe,OAAO;AAAA,EAClC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qBAAqB,MAAM;AAAA,EACnE,WAAW,EACR,OAAO,EACP;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,SAAS,EACT,SAAS,qBAAqB,SAAS;AAC5C;","names":[]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createTempoClient,
|
|
3
|
+
mppErr,
|
|
4
|
+
mppOk,
|
|
5
|
+
mppResultFromPromise,
|
|
6
|
+
mppResultFromThrowable,
|
|
7
|
+
safeGetMppChallenge,
|
|
8
|
+
sessionCloseFailedErr
|
|
9
|
+
} from "./chunk-FBGNOXFP.js";
|
|
10
|
+
import {
|
|
11
|
+
safeFetch,
|
|
12
|
+
safeReadResponseText
|
|
13
|
+
} from "./chunk-RAS5DZPQ.js";
|
|
14
|
+
|
|
15
|
+
// src/operations/sessions/close.ts
|
|
16
|
+
import { Mppx, tempo as tempoMethod } from "mppx/client";
|
|
17
|
+
import { Session } from "mppx/tempo";
|
|
18
|
+
var DEFAULT_ESCROW_CONTRACT = "0x33b901018174DDabE4841042ab76ba85D4e24f25";
|
|
19
|
+
async function closeMppSession(input, options) {
|
|
20
|
+
const { surface, wallets } = options;
|
|
21
|
+
const { channelId, url, cumulativeAmountRaw } = input;
|
|
22
|
+
const probeResult = await safeFetch(
|
|
23
|
+
surface,
|
|
24
|
+
new Request(url, { method: "POST" })
|
|
25
|
+
);
|
|
26
|
+
if (probeResult.isErr()) {
|
|
27
|
+
return mppErr(
|
|
28
|
+
surface,
|
|
29
|
+
sessionCloseFailedErr(
|
|
30
|
+
probeResult.error.message,
|
|
31
|
+
`Failed to probe ${url} for a session challenge`
|
|
32
|
+
)
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
const probeResponse = probeResult.value;
|
|
36
|
+
if (probeResponse.status !== 402) {
|
|
37
|
+
return mppErr(surface, {
|
|
38
|
+
cause: "mpp_session_close_no_challenge",
|
|
39
|
+
message: `Expected a 402 session challenge from ${url}, received ${probeResponse.status} ${probeResponse.statusText}. The endpoint may not be MPP-protected or the channel has already been closed.`
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const challengeResult = safeGetMppChallenge(surface, probeResponse);
|
|
43
|
+
if (challengeResult.isErr()) {
|
|
44
|
+
return challengeResult;
|
|
45
|
+
}
|
|
46
|
+
const challenge = challengeResult.value;
|
|
47
|
+
if (challenge.intent !== "session") {
|
|
48
|
+
return mppErr(surface, {
|
|
49
|
+
cause: "mpp_session_close_no_challenge",
|
|
50
|
+
message: `${url} returned a ${challenge.method}:${challenge.intent} challenge, not a session challenge.`
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const methodDetails = challenge.request.methodDetails;
|
|
54
|
+
const escrowContract = methodDetails?.escrowContract ?? DEFAULT_ESCROW_CONTRACT;
|
|
55
|
+
const cumulativeResult = await resolveCloseCumulative({
|
|
56
|
+
surface,
|
|
57
|
+
channelId,
|
|
58
|
+
escrowContract,
|
|
59
|
+
cumulativeAmountRaw
|
|
60
|
+
});
|
|
61
|
+
if (cumulativeResult.isErr()) {
|
|
62
|
+
return cumulativeResult;
|
|
63
|
+
}
|
|
64
|
+
const cumulativeRaw = cumulativeResult.value;
|
|
65
|
+
const mppx = Mppx.create({
|
|
66
|
+
polyfill: false,
|
|
67
|
+
methods: [
|
|
68
|
+
tempoMethod({ account: wallets.evm, getClient: createTempoClient })
|
|
69
|
+
]
|
|
70
|
+
});
|
|
71
|
+
const credentialResult = await mppResultFromPromise(
|
|
72
|
+
surface,
|
|
73
|
+
mppx.createCredential(probeResponse, {
|
|
74
|
+
action: "close",
|
|
75
|
+
channelId,
|
|
76
|
+
cumulativeAmountRaw: cumulativeRaw
|
|
77
|
+
}),
|
|
78
|
+
(e) => sessionCloseFailedErr(e, "Failed to sign close credential")
|
|
79
|
+
);
|
|
80
|
+
if (credentialResult.isErr()) {
|
|
81
|
+
return credentialResult;
|
|
82
|
+
}
|
|
83
|
+
const closeResult = await safeFetch(
|
|
84
|
+
surface,
|
|
85
|
+
new Request(url, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: { Authorization: credentialResult.value }
|
|
88
|
+
})
|
|
89
|
+
);
|
|
90
|
+
if (closeResult.isErr()) {
|
|
91
|
+
return mppErr(
|
|
92
|
+
surface,
|
|
93
|
+
sessionCloseFailedErr(
|
|
94
|
+
closeResult.error.message,
|
|
95
|
+
`Close POST to ${url} failed`
|
|
96
|
+
)
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
const closeResponse = closeResult.value;
|
|
100
|
+
if (!closeResponse.ok) {
|
|
101
|
+
const body = await safeReadResponseText(surface, closeResponse).unwrapOr(
|
|
102
|
+
""
|
|
103
|
+
);
|
|
104
|
+
const detail = body ? `: ${body}` : "";
|
|
105
|
+
return mppErr(
|
|
106
|
+
surface,
|
|
107
|
+
sessionCloseFailedErr(
|
|
108
|
+
`Server rejected close credential with ${closeResponse.status} ${closeResponse.statusText}${detail}. The cumulative-amount may be below the server's voucher state \u2014 retry with --cumulative-amount-raw set to the server's expected value.`
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const receiptHeader = closeResponse.headers.get("Payment-Receipt");
|
|
113
|
+
const receipt = receiptHeader ? Session.Receipt.deserializeSessionReceipt(receiptHeader) : null;
|
|
114
|
+
return mppOk({
|
|
115
|
+
channelId,
|
|
116
|
+
cumulativeAmount: receipt?.spent ?? cumulativeRaw,
|
|
117
|
+
...receipt?.txHash ? { transactionHash: receipt.txHash } : {}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async function resolveCloseCumulative(args) {
|
|
121
|
+
const { surface, channelId, escrowContract, cumulativeAmountRaw } = args;
|
|
122
|
+
if (cumulativeAmountRaw !== void 0) {
|
|
123
|
+
return mppResultFromThrowable(
|
|
124
|
+
surface,
|
|
125
|
+
() => BigInt(cumulativeAmountRaw).toString(),
|
|
126
|
+
(e) => sessionCloseFailedErr(e, "Invalid cumulativeAmountRaw")
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
return mppResultFromPromise(
|
|
130
|
+
surface,
|
|
131
|
+
Session.Chain.getOnChainChannel(
|
|
132
|
+
createTempoClient(),
|
|
133
|
+
escrowContract,
|
|
134
|
+
channelId
|
|
135
|
+
).then((onChain) => onChain.settled.toString()),
|
|
136
|
+
(e) => sessionCloseFailedErr(
|
|
137
|
+
e,
|
|
138
|
+
`Failed to read on-chain channel state for ${channelId}`
|
|
139
|
+
)
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
closeMppSession
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=chunk-TX7S7QGG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/operations/sessions/close.ts"],"sourcesContent":["import type { Address, Hex } from 'viem';\n\nimport { Mppx, tempo as tempoMethod } from 'mppx/client';\nimport { Session } from 'mppx/tempo';\n\nimport { safeFetch, safeReadResponseText } from '@/shared/neverthrow/fetch';\nimport {\n createTempoClient,\n mppErr,\n mppOk,\n mppResultFromPromise,\n mppResultFromThrowable,\n safeGetMppChallenge,\n sessionCloseFailedErr,\n} from '@/shared/protocols/mpp';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Wallets } from '@/wallet';\n\nconst DEFAULT_ESCROW_CONTRACT: Address =\n '0x33b901018174DDabE4841042ab76ba85D4e24f25';\n\nexport interface CloseSessionInput {\n channelId: Hex;\n url: string;\n cumulativeAmountRaw?: string;\n}\n\nexport interface CloseSessionOptions {\n surface: string;\n wallets: Wallets;\n flags: GlobalFlags;\n}\n\nexport interface CloseSessionResult {\n channelId: Hex;\n cumulativeAmount: string;\n transactionHash?: string;\n}\n\nexport async function closeMppSession(\n input: CloseSessionInput,\n options: CloseSessionOptions\n) {\n const { surface, wallets } = options;\n const { channelId, url, cumulativeAmountRaw } = input;\n\n const probeResult = await safeFetch(\n surface,\n new Request(url, { method: 'POST' })\n );\n if (probeResult.isErr()) {\n return mppErr(\n surface,\n sessionCloseFailedErr(\n probeResult.error.message,\n `Failed to probe ${url} for a session challenge`\n )\n );\n }\n const probeResponse = probeResult.value;\n\n if (probeResponse.status !== 402) {\n return mppErr(surface, {\n cause: 'mpp_session_close_no_challenge',\n message: `Expected a 402 session challenge from ${url}, received ${probeResponse.status} ${probeResponse.statusText}. The endpoint may not be MPP-protected or the channel has already been closed.`,\n });\n }\n\n const challengeResult = safeGetMppChallenge(surface, probeResponse);\n if (challengeResult.isErr()) {\n return challengeResult;\n }\n const challenge = challengeResult.value;\n\n if (challenge.intent !== 'session') {\n return mppErr(surface, {\n cause: 'mpp_session_close_no_challenge',\n message: `${url} returned a ${challenge.method}:${challenge.intent} challenge, not a session challenge.`,\n });\n }\n\n const methodDetails = challenge.request.methodDetails as\n | { escrowContract?: string }\n | undefined;\n const escrowContract = (methodDetails?.escrowContract ??\n DEFAULT_ESCROW_CONTRACT) as Address;\n\n const cumulativeResult = await resolveCloseCumulative({\n surface,\n channelId,\n escrowContract,\n cumulativeAmountRaw,\n });\n if (cumulativeResult.isErr()) {\n return cumulativeResult;\n }\n const cumulativeRaw = cumulativeResult.value;\n\n const mppx = Mppx.create({\n polyfill: false,\n methods: [\n tempoMethod({ account: wallets.evm, getClient: createTempoClient }),\n ],\n });\n\n const credentialResult = await mppResultFromPromise(\n surface,\n mppx.createCredential(probeResponse, {\n action: 'close',\n channelId,\n cumulativeAmountRaw: cumulativeRaw,\n }),\n e => sessionCloseFailedErr(e, 'Failed to sign close credential')\n );\n if (credentialResult.isErr()) {\n return credentialResult;\n }\n\n const closeResult = await safeFetch(\n surface,\n new Request(url, {\n method: 'POST',\n headers: { Authorization: credentialResult.value },\n })\n );\n if (closeResult.isErr()) {\n return mppErr(\n surface,\n sessionCloseFailedErr(\n closeResult.error.message,\n `Close POST to ${url} failed`\n )\n );\n }\n const closeResponse = closeResult.value;\n\n if (!closeResponse.ok) {\n const body = await safeReadResponseText(surface, closeResponse).unwrapOr(\n ''\n );\n const detail = body ? `: ${body}` : '';\n return mppErr(\n surface,\n sessionCloseFailedErr(\n `Server rejected close credential with ${closeResponse.status} ${closeResponse.statusText}${detail}. The cumulative-amount may be below the server's voucher state — retry with --cumulative-amount-raw set to the server's expected value.`\n )\n );\n }\n\n const receiptHeader = closeResponse.headers.get('Payment-Receipt');\n const receipt = receiptHeader\n ? Session.Receipt.deserializeSessionReceipt(receiptHeader)\n : null;\n\n return mppOk<CloseSessionResult>({\n channelId,\n cumulativeAmount: receipt?.spent ?? cumulativeRaw,\n ...(receipt?.txHash ? { transactionHash: receipt.txHash } : {}),\n });\n}\n\nasync function resolveCloseCumulative(args: {\n surface: string;\n channelId: Hex;\n escrowContract: Address;\n cumulativeAmountRaw: string | undefined;\n}) {\n const { surface, channelId, escrowContract, cumulativeAmountRaw } = args;\n\n if (cumulativeAmountRaw !== undefined) {\n return mppResultFromThrowable(\n surface,\n () => BigInt(cumulativeAmountRaw).toString(),\n e => sessionCloseFailedErr(e, 'Invalid cumulativeAmountRaw')\n );\n }\n\n return mppResultFromPromise(\n surface,\n Session.Chain.getOnChainChannel(\n createTempoClient(),\n escrowContract,\n channelId\n ).then(onChain => onChain.settled.toString()),\n e =>\n sessionCloseFailedErr(\n e,\n `Failed to read on-chain channel state for ${channelId}`\n )\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -4,7 +4,7 @@ import { dirname, join } from "path";
|
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
5
|
function getVersion() {
|
|
6
6
|
if (true) {
|
|
7
|
-
return "0.
|
|
7
|
+
return "0.15.0";
|
|
8
8
|
}
|
|
9
9
|
const __dirname2 = dirname(fileURLToPath(import.meta.url));
|
|
10
10
|
const pkg = JSON.parse(
|
|
@@ -23,4 +23,4 @@ export {
|
|
|
23
23
|
MCP_VERSION,
|
|
24
24
|
INSTALL_PACKAGE_SPECIFIER
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=chunk-
|
|
26
|
+
//# sourceMappingURL=chunk-ULB5PPKW.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MCP_VERSION
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ULB5PPKW.js";
|
|
4
4
|
import {
|
|
5
5
|
safeFetchJson
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-RAS5DZPQ.js";
|
|
7
7
|
import {
|
|
8
8
|
getBaseUrl
|
|
9
9
|
} from "./chunk-U6FRXL3X.js";
|
|
@@ -51,4 +51,4 @@ async function submitErrorReport(surface, input, address, dev) {
|
|
|
51
51
|
export {
|
|
52
52
|
submitErrorReport
|
|
53
53
|
};
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
54
|
+
//# sourceMappingURL=chunk-VGKAPM5S.js.map
|
|
@@ -6,7 +6,7 @@ var ORIGIN_METADATA = {
|
|
|
6
6
|
},
|
|
7
7
|
["https://stablesocial.dev" /* StableSocial */]: {
|
|
8
8
|
title: "StableSocial",
|
|
9
|
-
description: "Social media data for
|
|
9
|
+
description: "Social media data for TikTok, Instagram, Facebook, Reddit"
|
|
10
10
|
},
|
|
11
11
|
["https://stablestudio.dev" /* StableStudio */]: {
|
|
12
12
|
title: "StableStudio",
|
|
@@ -39,6 +39,22 @@ var ORIGIN_METADATA = {
|
|
|
39
39
|
["https://stablemerch.dev" /* StableMerch */]: {
|
|
40
40
|
title: "StableMerch",
|
|
41
41
|
description: "Create shirts and mugs with custom images and have them shipped to your address."
|
|
42
|
+
},
|
|
43
|
+
["https://stablevoice.dev" /* StableVoice */]: {
|
|
44
|
+
title: "StableVoice",
|
|
45
|
+
description: "Text-to-speech with 20+ bundled voices, custom voice cloning, multi-language support (23 languages), mp3/wav output"
|
|
46
|
+
},
|
|
47
|
+
["https://stabletube.dev" /* StableTube */]: {
|
|
48
|
+
title: "StableTube",
|
|
49
|
+
description: "YouTube video downloads \u2014 POST a URL, get a direct CDN download link (expires ~6h)"
|
|
50
|
+
},
|
|
51
|
+
["https://stablekey.dev" /* StableKey */]: {
|
|
52
|
+
title: "StableKey",
|
|
53
|
+
description: "VFX-grade neural green-screen unmixing (CorridorKey) \u2014 submit a green-screen plate, get alpha + foreground + RGBA outputs"
|
|
54
|
+
},
|
|
55
|
+
["https://stablememes.dev" /* StableMemes */]: {
|
|
56
|
+
title: "StableMemes",
|
|
57
|
+
description: "Generate memes \u2014 caption templates, search 1M+ memes, auto-caption, AI meme generation"
|
|
42
58
|
}
|
|
43
59
|
};
|
|
44
60
|
var PRIMARY_ORIGINS = [
|
|
@@ -47,7 +63,11 @@ var PRIMARY_ORIGINS = [
|
|
|
47
63
|
"https://stablestudio.dev" /* StableStudio */,
|
|
48
64
|
"https://stableupload.dev" /* StableUpload */,
|
|
49
65
|
"https://stableemail.dev" /* StableEmail */,
|
|
50
|
-
"https://stablemerch.dev" /* StableMerch
|
|
66
|
+
"https://stablemerch.dev" /* StableMerch */,
|
|
67
|
+
"https://stablevoice.dev" /* StableVoice */,
|
|
68
|
+
"https://stabletube.dev" /* StableTube */,
|
|
69
|
+
"https://stablekey.dev" /* StableKey */,
|
|
70
|
+
"https://stablememes.dev" /* StableMemes */
|
|
51
71
|
];
|
|
52
72
|
var DESCRIPTIONS = {
|
|
53
73
|
bridge: {
|
|
@@ -133,6 +153,12 @@ Set broad=true to widen the search to include newer, unvetted tools that may not
|
|
|
133
153
|
getSettings: {
|
|
134
154
|
mcp: `Get current user settings. Returns persisted values from ~/.agentcash/settings.json with defaults applied.`,
|
|
135
155
|
cli: `Get current user settings from ~/.agentcash/settings.json, with defaults applied.`
|
|
156
|
+
},
|
|
157
|
+
closeSession: {
|
|
158
|
+
mcp: `Close an MPP \`tempo:session\` payment channel. Pass the channelId surfaced in a prior fetch's paymentInfo together with the same URL you originally fetched. Signs a close credential with the on-chain settled cumulative amount and POSTs it to the server, returning the on-chain settlement transaction hash when available. Use this when you want to finalize a channel rather than leaving it open for the server to settle on its own schedule.`,
|
|
159
|
+
cli: `Close an MPP session payment channel. Provide the channelId (printed in a prior fetch's paymentInfo) and the endpoint URL the channel was opened against. Reads on-chain channel state for the cumulative settled amount, signs a close credential, and POSTs it to the server.`,
|
|
160
|
+
epilogue: `agentcash sessions close 0xabc... --url https://example.dev/api/stream
|
|
161
|
+
Pass --cumulative-amount-raw <atomic-units> only when the server reports vouchers above the on-chain cumulative.`
|
|
136
162
|
}
|
|
137
163
|
};
|
|
138
164
|
var WORKFLOW = [
|
|
@@ -173,7 +199,9 @@ var REQUEST_FETCH_PARAMS = {
|
|
|
173
199
|
...REQUEST_PARAMS,
|
|
174
200
|
paymentProtocol: "Payment protocol to use when payment is required. If not specified, the payment protocol will be auto-detected.",
|
|
175
201
|
paymentNetwork: "Chain to use for SIWX and payment when applicable. If not specified, the network will be auto-detected.",
|
|
176
|
-
maxAmount: "Maximum amount (in USD) to pay per request. Aborts if the endpoint requests more. Defaults to $5. Pass a higher value for known-expensive endpoints."
|
|
202
|
+
maxAmount: "Maximum amount (in USD) to pay per request. Aborts if the endpoint requests more. Defaults to $5. Pass a higher value for known-expensive endpoints.",
|
|
203
|
+
stream: "Escape hatch for streaming MPP session endpoints. Typically unnecessary \u2014 a correctly configured server advertises `streaming: true` in its 402 challenge and the signer handles it automatically. Only pass this when the response is actually a stream AND the server fails to advertise it; otherwise long streams may stall once the initial deposit is exhausted.",
|
|
204
|
+
channelId: "Reuse an existing MPP `tempo:session` payment channel instead of opening a new one. Pass the `channelId` surfaced in a prior fetch's paymentInfo. The channel must still have positive on-chain deposit and not be finalized; if it cannot be recovered, the request fails fast rather than silently opening a new channel. 0x-prefixed 32-byte hex string. Ignored by x402 (non-session) endpoints."
|
|
177
205
|
};
|
|
178
206
|
var TOOL_PARAMS = {
|
|
179
207
|
bridge: {
|
|
@@ -225,6 +253,16 @@ var TOOL_PARAMS = {
|
|
|
225
253
|
url: "The origin URL to discover endpoints on (e.g. https://stableenrich.dev)",
|
|
226
254
|
includeGuidance: "Request the origin's usage guidance. true=always include, false=never include, omit=auto (included when compact). Guidance explains how to compose multiple endpoints and covers edge cases."
|
|
227
255
|
},
|
|
256
|
+
closeSession: {
|
|
257
|
+
channelId: "The payment-channel id to close (the `channelId` field from a prior fetch's paymentInfo).",
|
|
258
|
+
url: "The endpoint URL the channel was opened against (the same URL passed to the original fetch).",
|
|
259
|
+
cumulativeAmountRaw: 'Optional override for the cumulative amount the close credential attests to, in raw atomic units (e.g. "12345" = 0.012345 USDC at 6 decimals). Defaults to the on-chain settled amount. Provide this only when the server has accepted vouchers above the on-chain cumulative.',
|
|
260
|
+
output: {
|
|
261
|
+
channelId: "The closed channel id",
|
|
262
|
+
cumulativeAmount: "The cumulative amount (raw atomic units) the channel was settled at",
|
|
263
|
+
transactionHash: "Settlement transaction hash, when the server returns one in the Payment-Receipt header"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
228
266
|
reportError: {
|
|
229
267
|
tool: "MCP tool name",
|
|
230
268
|
resource: "Resource URL",
|
|
@@ -248,4 +286,4 @@ export {
|
|
|
248
286
|
REQUEST_FETCH_PARAMS,
|
|
249
287
|
TOOL_PARAMS
|
|
250
288
|
};
|
|
251
|
-
//# sourceMappingURL=chunk-
|
|
289
|
+
//# sourceMappingURL=chunk-W37JKCLN.js.map
|