mppx 0.10.0 → 0.10.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # mppx
2
2
 
3
+ ## 0.10.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 232712e: Allowed `prepareRequest` to return responses that do not require payment by default and added a strict `requirePayment` option.
8
+
3
9
  ## 0.10.0
4
10
 
5
11
  ### Minor Changes
package/dist/cli/cli.js CHANGED
@@ -221,7 +221,7 @@ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\
221
221
  `)}function fb(e,t){let[n,...r]=t.split(`.`);if(!n)return{kind:`argument`,label:`input`};if(e.options?.shape[n]){let e=r.length>0?`.${r.join(`.`)}`:``;return{kind:`option`,label:`--${en(n)}${e}`}}return e.env?.shape[n]?{kind:`environment variable`,label:`${n}${r.length>0?`.${r.join(`.`)}`:``}`}:{kind:`argument`,label:`<${t}>`}}function pb(e,t){let[n,...r]=t;if(!n||!e.has(n))return{error:n??`(none)`,path:``,commands:e,rest:r};let i=Hb(e,e.get(n)),a=[n],o=r,s,c=[];if(Bb(i)){let e=i.outputPolicy??s;return{fetchGateway:i,middlewares:c,path:a.join(` `),rest:o,...e?{outputPolicy:e}:void 0}}for(;zb(i);){i.outputPolicy&&(s=i.outputPolicy),i.middlewares&&c.push(...i.middlewares);let e=o[0];if(!e&&i.root){let e=i.root.outputPolicy??s;return{command:i.root,commands:i.commands,middlewares:c,path:a.join(` `),rest:o,...e?{outputPolicy:e}:void 0}}if(!e)return{help:!0,path:a.join(` `),description:i.description,commands:i.commands};let t=i.commands.get(e);if(!t){if(i.root&&!nn(e,i.commands.keys())){let e=i.root.outputPolicy??s;return{command:i.root,commands:i.commands,middlewares:c,path:a.join(` `),rest:o,...e?{outputPolicy:e}:void 0}}return{error:e,path:a.join(` `),commands:i.commands,rest:o.slice(1)}}let n=Hb(i.commands,t);if(a.push(e),o=o.slice(1),i=n,Bb(i)){let e=i.outputPolicy??s;return{fetchGateway:i,middlewares:c,path:a.join(` `),rest:o,...e?{outputPolicy:e}:void 0}}}let l=i.outputPolicy??s;return{command:i,middlewares:c,path:a.join(` `),rest:o,...l?{outputPolicy:l}:void 0}}function mb(e,t={}){let n=!1,r=!1,i=!1,a=!1,o=!1,s=!1,c=!1,l=!1,u=!1,d=`toon`,f=!1,p,m=!1,h,g,_,v=!1,y=[],b=t.configFlag?`--${t.configFlag}`:void 0,x=t.configFlag?`--${t.configFlag}=`:void 0,S=t.configFlag?`--no-${t.configFlag}`:void 0;for(let t=0;t<e.length;t++){let C=e[t];if(C===`--full-output`)n=!0;else if(C===`--llms`)r=!0;else if(C===`--llms-full`)i=!0;else if(C===`--mcp`)a=!0;else if(C===`--help`||C===`-h`)o=!0;else if(C===`--update`)s=!0;else if(C===`--incur-update-check`)c=!0;else if(C===`--version`&&(e[t+1]===void 0||e[t+1].startsWith(`-`)))l=!0;else if(C===`--schema`)u=!0;else if(C===`--json`)d=`json`,f=!0;else if(C===`--format`&&e[t+1]){if(!fx.has(e[t+1]))throw new Sn({message:`Invalid format: "${e[t+1]}". Expected one of: ${[...fx].join(`, `)}`});d=e[t+1],f=!0,t++}else if(b&&C===b){let n=e[t+1];if(n===void 0)throw new Sn({message:`Missing value for flag: ${b}`});p=n,m=!1,t++}else if(x&&C.startsWith(x)){let e=C.slice(x.length);if(e.length===0)throw new Sn({message:`Missing value for flag: ${b}`});p=e,m=!1}else if(S&&C===S)p=void 0,m=!0;else if(C===`--filter-output`&&e[t+1])h=e[t+1],t++;else if(C===`--token-limit`&&e[t+1]){let n=Number(e[t+1]);if(!Number.isFinite(n)||e[t+1].trim()===``)throw new Sn({message:`Invalid value for --token-limit: "${e[t+1]}"`});g=n,t++}else if(C===`--token-offset`&&e[t+1]){let n=Number(e[t+1]);if(!Number.isFinite(n)||e[t+1].trim()===``)throw new Sn({message:`Invalid value for --token-offset: "${e[t+1]}"`});_=n,t++}else C===`--token-count`?v=!0:y.push(C)}return{fullOutput:n,format:d,formatExplicit:f,configPath:p,configDisabled:m,filterOutput:h,tokenLimit:g,tokenOffset:_,tokenCount:v,llms:r,llmsFull:i,mcp:a,help:o,update:s,updateCheck:c,version:l,schema:u,rest:y}}async function hb(e,t,n={}){if(n.configDisabled)return;let{loader:r}=n,i;i=n.configPath?gb(n.configPath):await _b(n.files??[`${e}.json`]);let a;if(r){let e=await r(i);if(e===void 0)return;if(!$t(e))throw new Sn({message:`Config loader must return a plain object or undefined`});a=e}else{if(!i)return;let e=await vb(i,!!n.configPath);if(!e)return;a=e}return yb(a,e,t)}function gb(e){return e.startsWith(`~/`)||e===`~`?c.join(b.homedir(),e.slice(1)):c.resolve(process.cwd(),e)}async function _b(e){for(let t of e){let e=gb(t);try{return await C.access(e,C.constants.R_OK),e}catch{}}}async function vb(e,t){let n;try{n=await C.readFile(e,`utf8`)}catch(n){if(n.code===`ENOENT`){if(t)throw new Sn({message:`Config file not found: ${e}`});return}throw n}let r;try{r=JSON.parse(n)}catch(t){throw new Sn({message:`Invalid JSON config file: ${e}`,cause:t instanceof Error?t:void 0})}if(!$t(r))throw new Sn({message:`Invalid config file: expected a top-level object in ${e}`});return r}function yb(e,t,n){let r=n===t?[]:n.split(` `),i=e;for(let e of r){if(!$t(i))return;let t=i.commands;if(!$t(t)||(i=t[e],i===void 0))return}if(!$t(i))throw new Sn({message:`Invalid config section for '${n}': expected an object`});let a=i.options;if(a!==void 0){if(!$t(a))throw new Sn({message:`Invalid config 'options' for '${n}': expected an object`});return Object.keys(a).length>0?a:void 0}}function bb(e){let t=[];for(let[n,r]of e)Vb(r)||t.push({name:n,description:r.description});return t.sort((e,t)=>e.name.localeCompare(t.name))}function xb(e,t,n){return ql(e[0])?.name===n?0:e[0]===t&&ql(e[1])?.name===n?1:-1}function Sb(e,t){return $l(`${e} ${t.name}`,{aliases:t.aliases,description:t.description,commands:t.subcommands?.map(e=>({name:e.name,description:e.description}))})}function Cb(e,t,n){let r=Jl(t,n);return eu(`${e} ${t.name} ${n}`,{alias:r?.alias,aliases:r?.aliases,description:r?.description,hideGlobalOptions:!0,options:r?.options})}async function wb(e,t,n){let r=[],i=[],a=new T,o=new T,s=[];o.on(`data`,e=>s.push(e.toString()));let c,l=N_(n.mcp?.name??e,n.version??`0.0.0`,t,{input:a,output:o,middlewares:n.middlewares,env:n.envSchema,vars:n.vars,version:n.version,...n.mcp?.instructions?{instructions:n.mcp.instructions}:void 0,...n.mcp?.title?{title:n.mcp.title}:void 0,tools:{...n.mcp?.tools,discovery:`direct`}}).catch(e=>{c=e}),u=!1;if(l.finally(()=>{u=!0}),a.write(`${Pr({jsonrpc:`2.0`,id:1,method:`initialize`,params:{protocolVersion:`2024-11-05`,capabilities:{},clientInfo:{name:`incur-doctor`,version:`1.0.0`}}})}\n`),a.write(`${Pr({jsonrpc:`2.0`,id:2,method:`tools/list`,params:{}})}\n`),await Tb(s,()=>u),a.end(),await l,c)return{ok:!1,toolCount:0,tools:[],warnings:r,errors:[{code:`MCP_SERVER_FAILED`,message:Db(c)}]};let d;try{d=Eb(s)}catch(e){return{ok:!1,toolCount:0,tools:[],warnings:r,errors:[{code:`MCP_RESPONSE_PARSE_FAILED`,message:Db(e)}]}}let f=d.find(e=>e.id===1);f?f.error&&i.push({code:`MCP_INITIALIZE_FAILED`,message:Ob(f.error)}):i.push({code:`MCP_INITIALIZE_MISSING`,message:`Missing initialize response.`});let p=d.find(e=>e.id===2),m=[];return p?p.error?i.push({code:`MCP_TOOLS_LIST_FAILED`,message:Ob(p.error)}):!$t(p.result)||!Array.isArray(p.result.tools)?i.push({code:`MCP_TOOLS_LIST_INVALID`,message:`tools/list did not return a tools array.`}):m=p.result.tools.filter($t).map(e=>({name:typeof e.name==`string`?e.name:``,...typeof e.description==`string`?{description:e.description}:void 0})).filter(e=>e.name):i.push({code:`MCP_TOOLS_LIST_MISSING`,message:`Missing tools/list response.`}),i.length===0&&m.length===0&&r.push(`No MCP tools exposed.`),{ok:i.length===0,toolCount:m.length,tools:m,warnings:r,errors:i}}async function Tb(e,t){let n=Date.now();for(;!t()&&(e.join(``).match(/\n/g)?.length??0)<2;){if(Date.now()-n>=1e3)return;await new Promise(e=>setTimeout(e,5))}}function Eb(e){let t=[];for(let n of e.join(``).split(/\r?\n/)){let e=n.trim();if(!e)continue;let r=JSON.parse(e);if(!$t(r))throw Error(`Expected JSON-RPC response object.`);t.push(r)}return t}function Db(e){return e instanceof Error?e.message:String(e)}function Ob(e){return $t(e)&&typeof e.message==`string`?e.message:Pr(e)}function kb(e,t){let n=[];return t?n.push(`${e} — ${t}`):n.push(e),n.push(``),n.push(`Usage: ${e} <path> [options]`),n.push(``),n.push(`Path segments are joined into the request URL path.`),n.push(``),n.push(`Options:`),n.push(` -X, --method <METHOD> HTTP method (default: GET, POST if body present)`),n.push(` -H, --header "Key: Val" Set a request header (repeatable)`),n.push(` -d, --data <json> Request body (implies POST)`),n.push(` --body <json> Request body (implies POST)`),n.push(` --<key> <value> Query string parameter`),n.join(`
222
222
  `)}async function Ab(e){if(e)return{directory:ee(e)};let t=process.argv[1];if(!t)throw Error("Could not infer the filesystem command directory without an executed entrypoint. Pass a directory URL to `fs()`.");let n=c.resolve(t);try{let e=await C.realpath(n);return{directory:c.dirname(e),exclude:e}}catch(e){if(e.code!==`ENOENT`)throw e;return{directory:c.dirname(n),exclude:n}}}async function jb(e){let t=await _u(e.directory,{exclude:e.exclude});return Promise.all(t.map(async e=>({...e,command:(await import(E(e.file).href)).default})))}function Mb(e){return typeof e==`object`&&!!e&&e[dx]===!0}function Nb(e,t,n,r,i){let a=e;for(let[e,o]of t.entries()){let s=e===t.length-1,c=a.get(o);if(s){if(!c)a.set(o,n);else if(zb(c)&&!c.root)c.root=n,c.description??=n.description;else throw Pb(t,r);Ub(t.join(` `),n,i);for(let e of n.aliases??[]){if(a.has(e))throw Pb([...t.slice(0,-1),e],r);a.set(e,{_alias:!0,target:o})}return}if(!c){let e={_group:!0,commands:new Map};a.set(o,e),a=e.commands;continue}if(Vb(c)||Bb(c))throw Pb(t,r);if(zb(c)){a=c.commands;continue}let l={_group:!0,commands:new Map,description:c.description,root:c};a.set(o,l),a=l.commands}}function Pb(e,t){return Error(`Filesystem command '${e.join(` `)}' from '${t}' conflicts with an existing command or alias.`)}function Fb(e){if(typeof e==`function`)return!0;if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.fetch==`function`&&t.url instanceof URL}function Ib(e){if(typeof e!=`object`||!e||!(`mcp`in e))return!1;let t=e.mcp;return typeof t==`string`||t instanceof URL||typeof t==`object`&&!!t&&`url`in t}function Lb(e){return typeof e==`function`?e:e.fetch}function Rb(e){return typeof e==`function`?void 0:e.url}function zb(e){return`_group`in e}function Bb(e){return`_fetch`in e}function Vb(e){return`_alias`in e}function Hb(e,t){return Vb(t)?e.get(t.target):t}function Ub(e,t,n){if(!(!n||Bb(t)||Vb(t))){if(zb(t)){t.root&&Ub(e,t.root,n);for(let[r,i]of t.commands)Ub(`${e} ${r}`,i,n);return}if(t.options){let r=Object.keys(n.schema.shape),i=Object.keys(t.options.shape);for(let t of i)if(r.includes(t))throw Error(`Command '${e}' option '${t}' conflicts with a global option. Choose a different name.`)}if(n.alias&&t.alias){let r=new Set(Object.values(n.alias));for(let[n,i]of Object.entries(t.alias))if(i&&r.has(i))throw Error(`Command '${e}' alias '-${i}' for '${n}' conflicts with a global alias. Choose a different alias.`)}}}function Wb(e){let t=`${e.code===`UNKNOWN`||e.code===`COMMAND_NOT_FOUND`?`Error`:`Error (${e.code})`}: ${e.message}`;if(e.fieldErrors)for(let n of e.fieldErrors)t+=`\n ${n.path}: ${n.message}`;return t}function Gb(e){let t=[``,e.description],n=Math.max(...e.commands.map(e=>e.command.length));for(let r of e.commands){let e=r.description?` ${``.padEnd(n-r.command.length)}# ${r.description}`:``;t.push(` ${r.command}${e}`)}return t.join(`
223
223
  `)}function Kb(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return{description:t[0].description,commands:t.flatMap(e=>e.commands)}}function qb(e){return Object.values(e.shape).some(e=>e._zod.optout!==`optional`)}function Jb(e){return typeof e==`object`&&!!e&&Sx in e}async function Yb(e,t){let n=t.format===`jsonl`;if(n||!t.formatExplicit&&t.format===`toon`)try{let r;for(;;){let{value:i,done:a}=await e.next();if(a){r=i;break}if(Jb(i)){let e=i;if(e[Sx]===`error`){n?t.writeln(JSON.stringify({type:`error`,ok:!1,error:{code:e.code,message:e.message,...e.retryable===void 0?void 0:{retryable:e.retryable}}})):t.writeln(Wb({code:e.code,message:e.message})),t.exit(e.exitCode??1);return}}n?t.writeln(Pr({type:`chunk`,data:i})):t.renderOutput&&t.writeln(t.truncate(gl(i,t.format)).text)}if(Jb(r)&&r[Sx]===`error`){let e=r;n?t.writeln(JSON.stringify({type:`error`,ok:!1,error:{code:e.code,message:e.message,...e.retryable===void 0?void 0:{retryable:e.retryable}}})):t.writeln(Wb({code:e.code,message:e.message})),t.exit(e.exitCode??1);return}let i=Jb(r)&&r[Sx]===`ok`?pu(t.name,r.cta):void 0;n?t.writeln(JSON.stringify({type:`done`,ok:!0,meta:{command:t.path,duration:`${Math.round(performance.now()-t.start)}ms`,...i?{cta:i}:void 0}})):i&&t.writeln(Gb(i))}catch(e){n?t.writeln(JSON.stringify({type:`error`,ok:!1,error:{code:e instanceof I?e.code:`UNKNOWN`,message:e instanceof Error?e.message:String(e),...e instanceof I?{retryable:e.retryable}:void 0}})):t.writeln(Wb({code:`UNKNOWN`,message:e instanceof Error?e.message:String(e)})),t.exit(e instanceof I?e.exitCode??1:1)}else{let n=[];try{let r;for(;;){let{value:i,done:a}=await e.next();if(a){r=i;break}if(Jb(i)){let e=i;if(e[Sx]===`error`){t.write({ok:!1,error:{code:e.code,message:e.message,...e.retryable===void 0?void 0:{retryable:e.retryable}},meta:{command:t.path,duration:`${Math.round(performance.now()-t.start)}ms`}}),t.exit(e.exitCode??1);return}}n.push(i)}if(Jb(r)&&r[Sx]===`error`){let e=r;t.write({ok:!1,error:{code:e.code,message:e.message,...e.retryable===void 0?void 0:{retryable:e.retryable}},meta:{command:t.path,duration:`${Math.round(performance.now()-t.start)}ms`}}),t.exit(e.exitCode??1);return}let i=Jb(r)&&r[Sx]===`ok`?pu(t.name,r.cta):void 0;t.write({ok:!0,data:n,meta:{command:t.path,duration:`${Math.round(performance.now()-t.start)}ms`,...i?{cta:i}:void 0}})}catch(e){t.write({ok:!1,error:{code:e instanceof I?e.code:`UNKNOWN`,message:e instanceof Error?e.message:String(e),...e instanceof I?{retryable:e.retryable}:void 0},meta:{command:t.path,duration:`${Math.round(performance.now()-t.start)}ms`}}),t.exit(e instanceof I?e.exitCode??1:1)}}}function Xb(e,t=[],n,r){let i=Zb(e,t);return r&&t.length>0&&i.push({name:t.join(` `),...r.description?{description:r.description}:void 0}),{version:`incur.v1`,commands:i.sort((e,t)=>e.name.localeCompare(t.name)),...n?{globals:Tu(n)}:void 0}}function Zb(e,t){let n=[];for(let[r,i]of e){if(Vb(i))continue;let e=[...t,r];if(zb(i)){if(i.root){let t={name:e.join(` `)};i.root.description&&(t.description=i.root.description),n.push(t)}n.push(...Zb(i.commands,e))}else{let t={name:e.join(` `)};Bb(i),i.description&&(t.description=i.description),n.push(t)}}return n}function Qb(e,t=[],n,r){let i=$b(e,t);return r&&t.length>0&&i.push(ex(t,r)),{version:`incur.v1`,commands:i.sort((e,t)=>e.name.localeCompare(t.name)),...n?{globals:Tu(n)}:void 0}}function $b(e,t){let n=[];for(let[r,i]of e){if(Vb(i))continue;let e=[...t,r];if(Bb(i)){let t={name:e.join(` `)};i.description&&(t.description=i.description),n.push(t)}else zb(i)?(i.root&&n.push(ex(e,i.root)),n.push(...$b(i.commands,e))):n.push(ex(e,i))}return n}function ex(e,t){let n={name:e.join(` `)};t.description&&(n.description=t.description);let r=sx(t.args,t.env,t.options),i=t.output?Tu(t.output):void 0;(r||i)&&(n.schema={},r?.args&&(n.schema.args=r.args),r?.env&&(n.schema.env=r.env),r?.options&&(n.schema.options=r.options),i&&(n.schema.output=i));let a=ax(t.examples);if(a){let t=e.join(` `);n.examples=a.map(e=>({...e,command:e.command?`${t} ${e.command}`:t}))}return n}function tx(e,t,n,r){let i=[];if(r){let e={};r.description&&(e.description=r.description),r.args&&(e.args=r.args),r.env&&(e.env=r.env),r.hint&&(e.hint=r.hint),rx(r)&&(e.hint=ix(e.hint)),r.options&&(e.options=r.options),r.output&&(e.output=r.output);let t=ax(r.examples);t&&(e.examples=t),i.push(e)}for(let[r,a]of e){if(Vb(a))continue;let e=[...t,r];if(Bb(a)){let t={name:e.join(` `)};a.description&&(t.description=a.description),t.hint=`Fetch gateway. Pass path segments and curl-style flags (-X, -H, -d, --key value).`,i.push(t)}else zb(a)?(a.description&&n.set(e.join(` `),a.description),a.root&&i.push(nx(e,a.root)),i.push(...tx(a.commands,e,n))):i.push(nx(e,a))}return i.sort((e,t)=>(e.name??``).localeCompare(t.name??``))}function nx(e,t){let n={name:e.join(` `)};t.description&&(n.description=t.description),t.args&&(n.args=t.args),t.env&&(n.env=t.env),t.hint&&(n.hint=t.hint),rx(t)&&(n.hint=ix(n.hint)),t.options&&(n.options=t.options),t.output&&(n.output=t.output);let r=ax(t.examples);if(r){let t=e.join(` `);n.examples=r.map(e=>({...e,command:e.command?`${t} ${e.command}`:t}))}return n}function rx(e){return e.destructive===!0||e.mcp!==!1&&e.mcp?.annotations?.destructiveHint===!0}function ix(e){return e?e.includes(ux)?e:`${e} ${ux}`:ux}function ax(e){if(!(!e||e.length===0))return e.map(e=>{let t=[];if(e.args)for(let n of Object.values(e.args))t.push(String(n));if(e.options)for(let[n,r]of Object.entries(e.options))t.push(`--${n} ${r}`);let n={command:t.join(` `)};return e.description&&(n.description=e.description),n})}function ox(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let n=pl().parse(t[1]);return!n||typeof n!=`object`?{}:n}function sx(e,t,n){if(!e&&!t&&!n)return;let r={};return e&&(r.args=Tu(e)),t&&(r.env=Tu(t)),n&&(r.options=Tu(n)),r}function cx(e,t,n){if(!t)return;let r=t.shape,i=new Set,a=new Map;for(let e of Object.keys(r))if(r[e]?.meta?.()?.deprecated){let t=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`);i.add(t),n?.[e]&&a.set(n[e],t)}if(i.size!==0){for(let t of e)if(t.startsWith(`--`)){let e=t.split(`=`)[0].slice(2),n=!i.has(e)&&e.startsWith(`no-`)?e.slice(3):e;i.has(n)&&process.stderr.write(`Warning: --${n} is deprecated\n`)}else if(t.startsWith(`-`)&&t.length>=2)for(let e of t.slice(1))a.has(e)&&process.stderr.write(`Warning: --${a.get(e)} is deprecated\n`)}}function lx(e,t){let n=process.argv[1];if(!n)return e;let r=c.basename(n);return r===e?e:t?.includes(r)?r:e}var ux,dx,fx,px,mx,hx,gx,_x,vx,yx,bx,xx,Sx,Cx=F((()=>{Qt(),It(),vn(),Cn(),jn(),Fn(),wl(),fu(),Ql(),gu(),wu(),rn(),Ir(),et(),bt(),hl(),iv(),py(),$v(),Vl(),Eu(),wy(),Py(),rb(),ux=`Confirm with the user before executing this destructive command.`,dx=Symbol.for(`incur.fileCommand`),fx=new Set([`toon`,`json`,`yaml`,`md`,`jsonl`]),px=new WeakMap,mx=new WeakMap,hx=new WeakMap,gx=new WeakMap,_x=new WeakMap,vx=new WeakMap,yx=new WeakMap,bx=new WeakMap,xx=new WeakMap,Sx=Symbol.for(`incur.sentinel`)})),wx=F((()=>{It(),Cx(),vn(),Cn(),wl(),fu(),iv(),jn(),$v(),Vl(),Eu(),wy(),hl(),Py(),rb()}));function Tx(e,t){if(!(!e||typeof e!=`object`))return e[t]}var q,Ex,Dx,Ox,kx,Ax,jx=F((()=>{q={acceptPayment:`Accept-Payment`,authorization:`Authorization`,paymentAuthorization:`Payment-Authorization`,paymentReceipt:`Payment-Receipt`,paymentSession:`Payment-Session`,paymentSessionSnapshot:`Payment-Session-Snapshot`,wwwAuthenticate:`WWW-Authenticate`},Ex={payment:`Payment`},Dx={evm:`evm`,stripe:`stripe`,tempo:`tempo`},Ox={charge:`charge`,session:`session`,subscription:`subscription`},kx={sessionProtocol:`sessionProtocol`,sessionSnapshot:`sessionSnapshot`},Ax={v1:`v1`,v2:`v2`}}));function Mx(e){let t=O.toString(e);return JSON.parse(t)}function Nx(e,t){return e.schema.request.parse(t)}function Px(e){let t=j.canonicalize(e);return O.fromString(t,{pad:!1,url:!0})}var Fx=F((()=>{})),J=Je({address:()=>Hx,amount:()=>Lx,datetime:()=>Rx,datetimeInput:()=>zx,hash:()=>Ux,period:()=>Wx,signature:()=>Gx,toDate:()=>Bx,toDatetimeString:()=>Vx,unwrapOptional:()=>Kx});import*as Ix from"zod/mini";Xe(J,Ix);function Lx(){return be.string().check(be.regex(/^\d+(\.\d+)?$/,`Invalid amount`))}function Rx(){return be.string().check(be.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/,`Invalid ISO 8601 datetime`))}function zx(e=`Invalid ISO 8601 datetime`){return be.pipe(be.union([Rx(),be.custom(e=>e instanceof Date)]),be.transform(Bx)).check(be.refine(e=>Number.isFinite(e.getTime()),e))}function Bx(e){return e instanceof Date?e:new Date(e)}function Vx(e){return e instanceof Date?Number.isFinite(e.getTime())?e.toISOString():`Invalid Date`:e}function Hx(){return be.string().check(be.regex(/^0x[0-9a-fA-F]{40}$/,`Invalid address`))}function Ux(){return be.string().check(be.regex(/^0x[0-9a-fA-F]{64}$/,`Invalid hash`))}function Wx(){return be.string().check(be.regex(/^(day|week|month|year|\d+)$/,`Invalid period`))}function Gx(){return be.string().check(be.regex(/^0x[0-9a-fA-F]+$/,`Invalid signature`))}function Kx(e){return e._zod.def.type===`optional`?e._zod.def.innerType:e}var qx=F((()=>{}));function Jx(e,t){let{description:n,digest:r,meta:i,method:a,header:o,intent:s,realm:c,request:l,secretKey:u}=e,d=lS(o)?void 0:o,f=e.expires?Vx(e.expires):void 0,p=e.opaque??(i===void 0?void 0:Px(i)),m=u?uS({...e,expires:f,...i!==void 0&&{meta:i},opaque:p},{secretKey:u}):e.id;return fS.parse({id:m,realm:c,method:a,intent:s,request:l,...n&&{description:n},...r&&{digest:r},...f&&{expires:f},...d!==void 0&&{header:d},...i!==void 0&&{meta:i},...p!==void 0&&{opaque:p}})}function Yx(e){let t=[Xx(`id`,e.id),Xx(`realm`,e.realm),Xx(`method`,e.method),Xx(`intent`,e.intent),Xx(`request`,Px(e.request))];e.description!==void 0&&t.push(Xx(`description`,e.description)),e.digest!==void 0&&t.push(Xx(`digest`,e.digest)),e.expires!==void 0&&t.push(Xx(`expires`,e.expires));let n=e.header;return n!==void 0&&!lS(n)&&t.push(Xx(`header`,n)),e.opaque===void 0?e.meta!==void 0&&t.push(Xx(`opaque`,Px(e.meta))):t.push(Xx(`opaque`,e.opaque)),`${Ex.payment} ${t.join(`, `)}`}function Xx(e,t){if(/[\r\n]/.test(t))throw Error(`Invalid quoted-string value.`);return`${e}="${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/[\u0100-\uffff]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,`0`)}`)}"`}function Zx(e,t){let n=Qx(e);if(!n)throw Error(`Missing Payment scheme.`);let{request:r,opaque:i,...a}=$x(n);if(!r)throw Error(`Missing request parameter.`);if(r.length>dS)throw Error(`Request parameter too large.`);if(a.method&&!/^[a-z][a-z0-9:_-]*$/.test(a.method))throw Error(`Invalid method: "${a.method}". Must be lowercase per spec.`);return Jx({...a,request:Mx(r),...i&&{opaque:i}},t)}function Qx(e){let t=Ex.payment,[n]=rS(e,t);if(n===void 0)return null;let r=n+t.length;for(;r<e.length&&/\s/.test(e[r]??``);)r++;return e.slice(r)}function $x(e){let t=Object.create(null),n=0;for(;n<e.length;){for(;n<e.length&&/[\s,]/.test(e[n]??``);)n++;if(n>=e.length)break;let r=n;for(;n<e.length&&/[A-Za-z0-9_-]/.test(e[n]??``);)n++;let i=e.slice(r,n).toLowerCase();if(!i)throw Error(`Malformed auth-param.`);for(;n<e.length&&/\s/.test(e[n]??``);)n++;if(e[n]!==`=`)break;for(n++;n<e.length&&/\s/.test(e[n]??``);)n++;let[a,o]=eS(e,n);if(n=o,i in t)throw Error(`Duplicate parameter: ${i}`);t[i]=a}return t}function eS(e,t){if(e[t]===`"`)return tS(e,t+1);let n=t;for(;n<e.length&&e[n]!==`,`;)n++;return[e.slice(t,n).trim(),n]}function tS(e,t){let n=t,r=!1,i=t,a;for(;n<e.length;){let o=e[n];if(n++,r){a??=[];let t=o===`u`?e.slice(n,n+4):void 0;t&&/^[0-9A-Fa-f]{4}$/.test(t)?(a.push(String.fromCharCode(Number.parseInt(t,16))),n+=4):a.push(o),i=n,r=!1;continue}if(o===`\\`){a??=[],a.push(e.slice(i,n-1)),i=n,r=!0;continue}if(o===`"`)return[a?[...a,e.slice(i,n-1)].join(``):e.slice(t,n-1),n]}throw Error(`Unterminated quoted-string.`)}function nS(e,t,n){if(e.slice(t,t+n.length).toLowerCase()!==n.toLowerCase())return!1;let r=e[t+n.length];return!!(r&&/\s/.test(r))}function rS(e,t){let n=[],r=!1,i=!1;for(let a=0;a<e.length;a++){let o=e[a];if(r){i?i=!1:o===`\\`?i=!0:o===`"`&&(r=!1);continue}if(o===`"`){r=!0;continue}if(!nS(e,a,t))continue;let s=a-1;for(;s>=0&&/\s/.test(e[s]??``);)s--;s>=0&&e[s]!==`,`||n.push(a)}return n}function iS(e,t){if(e.status!==402)throw Error(`Response status is not 402.`);return aS(e.headers,t)}function aS(e,t){let n=e.get(q.wwwAuthenticate);if(!n)throw Error(`Missing ${q.wwwAuthenticate} header.`);return oS(n,t)}function oS(e,t){let n=rS(e,Ex.payment);if(n.length===0)throw Error(`No Payment schemes found.`);return n.map((r,i)=>{let a=i+1<n.length?n[i+1]:e.length;return Zx(e.slice(r,a).replace(/,\s*$/,``),t)})}function sS(e){let t=[e.realm,e.method,e.intent,Px(e.request),e.expires??``,e.digest??``],n=e.header;return n!==void 0&&!lS(n)&&t.push(n),t.push(e.opaque??(e.meta?Px(e.meta):``)),t.join(`|`)}function cS(e){return e.header??q.authorization}function lS(e){return e?.toLowerCase()===q.authorization.toLowerCase()}function uS(e,t){let n=sS(e),r=ne.fromString(t.secretKey),i=ne.fromString(n),a=k.hmac256(r,i,{as:`Bytes`});return O.fromBytes(a,{url:!0,pad:!1})}var dS,fS,pS=F((()=>{jx(),Fx(),qx(),dS=16384,fS=J.object({description:J.optional(J.string()),digest:J.optional(J.string().check(J.regex(/^sha-256=/,`Invalid digest format`))),expires:J.optional(Rx()),header:J.optional(J.string().check(J.regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,`Invalid HTTP header name`))),id:J.string().check(J.minLength(1)),intent:J.string(),method:J.string(),meta:J.optional(J.record(J.string(),J.string())),opaque:J.optional(J.string()),realm:J.string(),request:J.record(J.string(),J.unknown())})})),mS,hS,Y,gS,_S=F((()=>{mS=class extends Error{details;status=402;hint;constructor(e,t={}){super(e),this.details=t.details}toProblemDetails(e){return{type:this.type,title:this.title,status:this.status,detail:this.message,...this.details&&Object.keys(this.details).length>0&&{details:this.details},...this.hint&&{hint:this.hint},...e&&{challengeId:e}}}},hS=class extends mS{name=`InvalidChallengeError`;title=`Invalid Challenge`;status=402;type=`https://paymentauth.org/problems/invalid-challenge`;constructor(e={}){let{id:t,reason:n}=e,r=t?` "${t}"`:``,i=n?`: ${n}`:``;super(`Challenge${r} is invalid${i}.`)}},Y=class extends mS{name=`VerificationFailedError`;title=`Verification Failed`;type=`https://paymentauth.org/problems/verification-failed`;constructor(e={}){let{details:t,reason:n}=e;super(n?`Payment verification failed: ${n}.`:`Payment verification failed.`,{details:t})}},gS=class extends mS{name=`PaymentExpiredError`;title=`Payment Expired`;type=`https://paymentauth.org/problems/payment-expired`;constructor(e={}){let{expires:t}=e;super(t?`Payment expired at ${t}.`:`Payment has expired.`)}}}));function vS(e,t){if(!e)throw new hS({...t&&{id:t},reason:`missing required expires field`});if(Number.isNaN(new Date(e).getTime()))throw new hS({...t&&{id:t},reason:`malformed expires timestamp`});if(new Date(e)<new Date)throw new gS({expires:e})}var yS=F((()=>{_S()}));function bS(e){return Object.defineProperty(e,SS,{value:!0}),e}function xS(e){return!!e?.[SS]}var SS,CS=F((()=>{SS=Symbol.for(`mppx.x402.challenge`)}));function wS(e){let t={};for(let n of e){let e=t[n.name]??={};e[n.intent]=AS(n)}return t}function TS(e,t){let n=wS(e),r=LS(e,n,t),i=e.map((e,t)=>({intent:e.intent,method:e.name,q:r[AS(e)]??1,index:t}));return{definition:r,entries:i,header:DS(i),keys:n}}function ES(e){let t=e.split(/\s*,\s*/).map(e=>e.trim()).filter(Boolean);if(t.length===0)throw Error(`Accept-Payment header is empty.`);return t.map((e,t)=>FS(e,t))}function DS(e){return e.map(({method:e,intent:t,q:n})=>{let r=`${e}/${t}`;return n===1?r:`${r};q=${VS(n)}`}).join(`, `)}function OS(e,t,n){let r=kS(e,t,n)[0];if(r)return{challenge:r.challenge,method:r.method}}function kS(e,t,n){let r=new Map;for(let e of t){let t=AS(e),n=r.get(t);n?n.push(e):r.set(t,[e])}return e.flatMap((e,t)=>{let i=r.get(AS(e));if(!i)return[];let a=jS(e,n);return!a||a.q<=0?[]:i.filter(t=>t.canHandleChallenge?.({challenge:e})??!0).map(n=>({challenge:e,index:t,match:a,method:n}))}).sort((e,t)=>PS(e.challenge)-PS(t.challenge)||t.match.q-e.match.q||e.index-t.index).map(e=>{let{match:t,...n}=e;return n})}function AS(e){let t=e.method??e.name;if(!t)throw Error(`Missing payment method name.`);return`${t}/${e.intent}`}function jS(e,t){let n;for(let r of t){if(!MS(e,r))continue;let t={...r,specificity:NS(r)};(!n||t.specificity>n.specificity||t.specificity===n.specificity&&t.q>n.q||t.specificity===n.specificity&&t.q===n.q&&t.index<n.index)&&(n=t)}return n}function MS(e,t){return(t.method===`*`||t.method===e.method)&&(t.intent===`*`||t.intent===e.intent)}function NS(e){return Number(e.method!==`*`)+Number(e.intent!==`*`)}function PS(e){return+!!xS(e)}function FS(e,t){let n=/^(?<method>[^/;\s]+|\*)\s*\/\s*(?<intent>[^/;\s]+|\*)(?<params>(?:\s*;\s*.+)?)$/u.exec(e),r=n?.groups?.method,i=n?.groups?.intent;if(!r||!i)throw Error(`Invalid Accept-Payment entry: ${e}`);HS(r,`method`),HS(i,`intent`);let a=1;for(let t of IS(n.groups?.params)){if(!t)continue;let n=/^(?<name>[A-Za-z0-9_-]+)\s*=\s*(?<value>\S+)$/u.exec(t),r=n?.groups?.name,i=n?.groups?.value;if(!r||!i)throw Error(`Invalid Accept-Payment parameter: ${t}`);r===`q`&&(a=zS(i,`Accept-Payment entry "${e}"`))}return{intent:i,method:r,q:a,index:t}}function IS(e){return e?e.split(/\s*;\s*/).filter(Boolean):[]}function LS(e,t,n){if(!n)return{};let r=typeof n==`function`?n(t):n,i=new Set(e.map(e=>AS(e))),a={};for(let[e,t]of Object.entries(r??{})){if(!i.has(e))throw Error(`Unknown payment preference "${e}". Available: ${[...i].join(`, `)}`);a[e]=RS(t,`payment preference "${e}"`)}return a}function RS(e,t){if(typeof e!=`number`||Number.isNaN(e)||!Number.isFinite(e))throw Error(`Invalid q-value for ${t}. Expected a finite number.`);return BS(e,t)}function zS(e,t){if(!/^0(?:\.\d{0,3})?$|^1(?:\.0{0,3})?$/.test(e))throw Error(`Invalid q-value for ${t}. Expected an HTTP qvalue.`);return BS(Number(e),t)}function BS(e,t){if(e<0||e>1)throw Error(`Invalid q-value for ${t}. Expected a value between 0 and 1.`);let n=Math.round(e*1e3);if(Math.abs(e*1e3-n)>1e-9)throw Error(`Invalid q-value for ${t}. Expected at most 3 decimal places.`);return n/1e3}function VS(e){return e.toFixed(3).replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function HS(e,t){if(e!==`*`&&!/^[a-z0-9-]+$/.test(e))throw Error(`Invalid Accept-Payment ${t}: ${e}`)}var US=F((()=>{CS()}));function WS(e){let t=e.match(RegExp(`^${Ex.payment}\\s+(.+)$`,`i`));if(!t?.[1])throw new YS;try{let e=O.toString(t[1]),n=JSON.parse(e),{opaque:r,request:i,meta:a,...o}=n.challenge,{meta:s,opaque:c}=GS(r);return{challenge:fS.parse({...o,...s!==void 0&&{meta:s},...c!==void 0&&{opaque:c},request:Mx(i)}),payload:n.payload,...n.source&&{source:n.source}}}catch{throw new XS}}function GS(e){if(e===void 0)return{};if(typeof e==`string`)return{opaque:e};if(!KS(e))throw Error(`Invalid opaque.`);return{meta:e,opaque:Px(e)}}function KS(e){return typeof e!=`object`||!e||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}function qS(e){let{challenge:t,payload:n,source:r}=e;return{challenge:t,payload:n,...r&&{source:r}}}function JS(e){let{meta:t,opaque:n,request:r,...i}=e.challenge,a=n??(t===void 0?void 0:Px(t)),o={challenge:{...i,...a!==void 0&&{opaque:a},request:Px(r)},payload:e.payload,...e.source&&{source:e.source}},s=JSON.stringify(o),c=O.fromString(s,{pad:!1,url:!0});return`${Ex.payment} ${c}`}var YS,XS,ZS=F((()=>{pS(),jx(),Fx(),YS=class extends Error{name=`MissingPaymentSchemeError`;constructor(){super(`Missing Payment scheme.`)}},XS=class extends Error{name=`InvalidCredentialEncodingError`;constructor(){super(`Invalid base64url or JSON.`)}}})),QS,$S,eC=F((()=>{QS=`org.paymentauth/credential`,$S=`org.paymentauth/payment-required`}));function tC(e){let{extensions:t,resource:n,...r}=e;return hC.parse(r)}var nC,rC,iC,aC,oC,sC,cC,lC,uC,dC,fC,pC,mC,hC,gC,_C,vC,yC,bC,xC,SC,CC,wC=F((()=>{qx(),nC=`charge`,rC=[`exact`],iC=`eip155:`,aC=`x402:`,oC=`PAYMENT-REQUIRED`,sC=`PAYMENT-SIGNATURE`,cC=`PAYMENT-RESPONSE`,lC=J.string().check(J.minLength(1)),uC=J.number().check(J.refine(e=>e>0,`Must be positive`)),dC=J.string().check(J.regex(/^\d+$/,`Invalid atomic amount`)),fC=Hx(),pC=J.string().check(J.regex(RegExp(`^${iC}\\d+$`),`Invalid EVM CAIP-2 network`)),mC=J.object({description:J.optional(J.string()),iconUrl:J.optional(J.string()),mimeType:J.optional(J.string()),serviceName:J.optional(J.string()),tags:J.optional(J.array(J.string())),url:lC}),J.discriminatedUnion(`type`,[J.object({name:lC,type:J.literal(`eip3009`),version:lC}),J.object({name:J.optional(J.string()),type:J.literal(`permit2`),version:J.optional(J.string())})]),hC=J.object({amount:dC,asset:lC,extra:J.optional(J.record(J.string(),J.unknown())),maxTimeoutSeconds:uC,network:pC,payTo:lC,scheme:J.enum(rC)}),gC=J.object({info:J.record(J.string(),J.unknown()),schema:J.record(J.string(),J.unknown())}),_C=J.record(J.string(),gC),vC=J.object({accepts:J.array(hC).check(J.minLength(1)),error:J.optional(J.string()),extensions:J.optional(_C),resource:mC,x402Version:J.literal(2)}),yC=J.object({authorization:J.object({from:fC,nonce:Ux(),to:fC,validAfter:dC,validBefore:dC,value:dC}),signature:Gx()}),bC=J.object({permit2Authorization:J.object({deadline:dC,from:fC,nonce:dC,permitted:J.object({amount:dC,token:fC}),spender:fC,witness:J.object({to:fC,validAfter:dC})}),signature:Gx()}),xC=J.union([yC,bC]),SC=J.object({accepted:hC,extensions:J.optional(_C),payload:xC,resource:J.optional(mC),x402Version:J.literal(2)}),J.object({extensions:J.optional(_C),extra:J.optional(J.record(J.string(),J.unknown())),invalidMessage:J.optional(J.string()),invalidReason:J.optional(J.string()),isValid:J.boolean(),payer:J.optional(J.string())}),CC=J.object({amount:J.optional(dC),errorMessage:J.optional(J.string()),errorReason:J.optional(J.string()),extensions:J.optional(_C),extra:J.optional(J.record(J.string(),J.unknown())),network:lC,payer:J.optional(J.string()),success:J.boolean(),transaction:J.string()})}));function TC(e,t,n){let r=new Headers(e.headers);for(let e of EC)e===q.authorization&&!r.get(e)?.startsWith(`Payment `)||r.delete(e);return r.set(t,n),{...e,headers:r}}var EC,DC=F((()=>{jx(),wC(),EC=[q.authorization,oC,cC,sC]}));function OC(e){if(typeof e==`string`)try{let t=JSON.parse(e),n=t?.id;return t?.jsonrpc!==`2.0`||typeof t?.method!=`string`?void 0:typeof n==`string`||typeof n==`number`?n:void 0}catch{return}}function kC(e){let t=OC(e?.body);if(t===void 0)return;let n=new Headers(e?.headers);if(n.has(`mcp-method`))return t;let r=n.get(`accept`)?.toLowerCase()??``;return r.includes(`application/json`)&&r.includes(`text/event-stream`)?t:void 0}function AC(e){if(!e||typeof e!=`object`)return;let t=e,n=t.id;if(t.jsonrpc!==`2.0`||n!==void 0&&typeof n!=`string`&&typeof n!=`number`)return;let r=`error`in t;if(r!==`result`in t)return r?Number.isInteger(t.error?.code)&&typeof t.error?.message==`string`?e:void 0:n!==void 0&&typeof t.result==`object`?e:void 0}function jC(e){if(!e||typeof e!=`object`)return;let t=e?.challenges;if(!Array.isArray(t)||t.length===0)return;let n=[];for(let e of t){let t=fS.safeParse(e);if(!t.success)return;n.push(t.data)}let{httpStatus:r,problem:i}=e;return{challenges:n,...typeof r==`number`?{httpStatus:r}:{},...i===void 0?{}:{problem:i}}}function MC(e){if(e)return`error`in e?e.error?.code!==-32042&&e.error?.code!==-32043?void 0:jC(e.error.data):jC(e.result?._meta?.[$S])}function NC(e,t){return!e||e.id!==t?[]:MC(e)?.challenges??[]}async function PC(e){let t=e.clone().body?.getReader();if(!t)return;let n=new TextDecoder,r=!1,i,a=xe({onEvent(e){if(!(r||!e.data)&&(r=!0,!(e.event&&e.event!==`message`)))try{i=AC(JSON.parse(e.data))}catch{}}});try{for(;;){if(r)return i;let{done:e,value:o}=await t.read();if(e)return a.feed(n.decode()),a.reset({consume:!0}),i;a.feed(n.decode(o,{stream:!0}))}}finally{t.cancel().catch(()=>{})}}function FC(e){let t=LC.get(e);if(t)return t;let n=(async()=>{let t=e.headers.get(`content-type`)?.toLowerCase()??``;if(t.includes(`application/json`))return e.clone().json().then(AC).catch(()=>void 0);if(t.includes(`text/event-stream`))return PC(e)})();return LC.set(e,n),n}function IC(){return{getChallenges(e,t){let n=kC(t);return e.status===402||n===void 0?[]:FC(e).then(e=>NC(e,n))},setCredential(e,t){let n=JSON.parse(e.body),r=WS(t);return{...e,body:JSON.stringify({...n,params:{...n.params,_meta:{...n.params?._meta,[QS]:r}}})}}}}var LC,RC=F((()=>{pS(),ZS(),eC(),DC(),LC=new WeakMap}));function zC(){return{getChallenges(e){return e.status!==402||!e.headers.has(q.wwwAuthenticate)?[]:iS(e)},setCredential(e,t,n){return TC(e,n?.challenge?cS(n.challenge):q.authorization,t)}}}var BC=F((()=>{pS(),jx(),DC()}));function VC(e){return{encode(t){return O.fromString(JSON.stringify(e.parse(t)))},decode(t){try{return e.parse(JSON.parse(O.toString(t)))}catch{throw new HC}}}}var HC,UC=F((()=>{HC=class extends Error{name=`InvalidJsonHeaderError`;constructor(){super(`Invalid base64 JSON header.`)}}}));function WC(e){try{let t=JSON.parse(O.toString(e));return XC(t)}catch{throw new HC}}var GC,KC,qC,JC,YC,XC,ZC=F((()=>{UC(),wC(),GC=VC(vC),KC=VC(SC),qC=VC(CC),JC=GC.encode,GC.decode,YC=KC.encode,KC.decode,qC.encode,qC.decode,XC=e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new HC;let t=e;if(t.x402Version!==2||!Array.isArray(t.accepts))throw new HC;let n=mC.parse(t.resource),r=t.extensions===void 0?void 0:_C.safeParse(t.extensions).data;return{accepts:t.accepts,...r?{extensions:r}:{},resource:n,x402Version:2}}}));function QC(){return{getChallenges(e){if(e.status!==402)return[];let t=e.headers.get(oC);if(!t)return[];let n=WC(t);if(e.url&&n.resource.url!==e.url)throw Error(`x402 payment-required resource does not match response URL.`);return n.accepts.flatMap((e,t)=>{let r=hC.safeParse(e);if(!r.success)return[];let i=r.data;return bS(Jx({id:`${aC}${t}`,intent:nC,method:`evm`,realm:new URL(n.resource.url).host,request:{...i,...n.extensions?{extensions:n.extensions}:{},resource:n.resource}}))})},setCredential(e,t){return TC(e,sC,t)}}}var $C=F((()=>{pS(),ZC(),CS(),wC(),DC()}));function ew(e){return e}function tw(){let e=[zC(),QC(),IC()],t=new WeakMap,n=(e,n)=>{for(let r of n)t.set(r,e);return n},r=(t,r)=>{let i=(a,o)=>{for(let s=a;s<e.length;s++){let a=e[s],c=a.getChallenges(t,r);if(c instanceof Promise)return c.then(e=>i(s+1,[...o,...n(a,e)]));o.push(...n(a,c))}return o};return i(0,[])};return ew({name:`http`,isPaymentRequired(e,t){if(e.status===402)return!0;let n=r(e,t);return n instanceof Promise?n.then(e=>e.length>0):n.length>0},getChallenges(e,t){return r(e,t)},setCredential(n,r,i){let a=i?.challenge?t.get(i.challenge):void 0,o=e[0];if(!a&&!o)throw Error(`No protocol to attach the credential.`);return(a??o).setCredential(n,r,i)}})}var nw=F((()=>{RC(),BC(),DC(),$C()}));function rw(e,t){return ow.set(e,t),e}function iw(e){return ow.has(e)}function aw(e,t){return Promise.resolve(ow.get(e)?.(t))}var ow,sw=F((()=>{ow=new WeakMap}));function cw(e,t){return pw.set(e,t),e}function lw(e){pw.delete(e)}function uw(e,t,n){pw.has(e)&&mw.set(t,n)}function dw(e){return mw.get(e)}function fw(e,t){return Promise.resolve(pw.get(e)?.(t)??t.response)}var pw,mw,hw=F((()=>{pw=new WeakMap,mw=new WeakMap}));async function gw(e,t){let n=e?.attempt.settle;if(!n)return t.status!==`pending`;e.attempt.settle=void 0;let r=await n(t);return r||(e.attempt.settle=n),r}function _w(e){let{acceptPayment:t,acceptPaymentPolicy:n=`always`,fetch:r=globalThis.fetch,maxPaymentRetries:i=eT,methods:a,onChallenge:o,orderChallenges:s,transport:c=tw()}=e,l=e.eventDispatcher??bw(),u=t??TS(a),d=Vw(r),f=async(e,t,r)=>{let p=Bw(e,t?.headers),m=p.has(q.acceptPayment),h=Kw(p,u),g=Rw(e,t,p),_=Lw(e,t,p,h.header,m,n),v=await d(Hw(_.input),_.init),y=zw(_.init,await g);if(!await c.isPaymentRequired(v,y))return v;let b=t?.context,{context:x,orderChallenges:S,...C}=y??{},w,T,ee,E;try{for(let n=0;n<i;n++){T=await c.getChallenges(v,y);let i=(await qw(kS(T,a,h.entries),S??s))[0];if(!i){if(await gw(E,{challenges:T,response:v,status:`rejected`}),n>0)return v;throw Error(`No method found for challenges: ${T.map(e=>`${e.method}.${e.intent}`).join(`, `)}. Available: ${a.map(e=>`${e.name}.${e.intent}`).join(`, `)}`)}let u=i.challenge;w=u,ee=i.method,w.expires&&vS(w.expires,w.id);let p=Qw(v,_.input,_.input),m=E,g=Yx(u),x=m?.method===i.method&&m?.key===g,D=!1;if(m){let e=await gw(m,{challenges:T,response:v,status:x?`pending`:`rejected`});D=x&&!e}E=D?m:void 0;let te=Tw(async e=>{if(e===void 0&&D&&m)return m.promise;D&&m&&(await gw(m,{status:`rejected`}),E=void 0);let t=e??b;if(!iw(i.method))return Gw(u,i.method,t);let n={prepare:()=>aw(i.method,{challenge:u,context:t,fetch:d,input:p})},r=n.prepare().then(()=>Gw(u,i.method,t,n));return E={attempt:n,key:e===void 0?g:void 0,method:i.method,promise:r},r}),O=await l.emit(`challenge.received`,Ew({challenge:u,challenges:T,createCredential:te,init:t,input:e,method:i.method,response:v}))??(o?await o(w,{createCredential:te}):void 0)??await te(),ne=E;ne&&await ne.promise.catch(()=>void 0)!==O&&(await gw(ne,{status:`rejected`}),E=void 0),Ww(O),await l.emit(`credential.created`,Dw({challenge:u,credential:O,init:t,input:e,method:i.method,response:v})),v=await d(p,c.setCredential({...C,headers:_.headers},O,{challenge:u}));let k=await c.isPaymentRequired(v,y);if(k||(await gw(ne,{response:v,status:v.ok?`accepted`:`rejected`}),E=void 0),v.ok&&xw(l,`payment.response`)&&await l.emit(`payment.response`,Ow({challenge:u,credential:O,init:t,input:e,method:i.method,response:v})),!k)return v.ok?fw(i.method,{challenge:u,credential:O,fetch:d,headers:_.headers,input:p,...r?{refetch:()=>f(Hw(_.input),t,!1)}:{},response:v,signal:Uw(e,t)}):v}T=void 0;try{T=await c.getChallenges(v,y)}catch{}return await gw(E,{challenges:T,response:v,status:`rejected`}),v}catch(n){throw await gw(E,{challenges:T,response:v,status:`rejected`}),await l.emit(`payment.failed`,kw({challenge:w,challenges:T,error:n,init:t,input:e,method:ee,response:v})),n}},p=(e,t)=>f(e,t,!0);return p[$w]=d,p}function vw(e){let t=Object.getOwnPropertyDescriptor(globalThis,`fetch`);if(!t||!t.writable&&!t.set)throw Error(`globalThis.fetch is not writable`);tT||=globalThis.fetch,globalThis.fetch=_w({...e,acceptPaymentPolicy:e.acceptPaymentPolicy??(Xw()?`same-origin`:`always`),fetch:globalThis.fetch})}function yw(e){if(!e)return{};if(e instanceof Headers){let t={};return e.forEach((e,n)=>{t[n]=e}),t}return Array.isArray(e)?Object.fromEntries(e):e}function bw(){let e={"*":new Set,"challenge.received":new Set,"credential.created":new Set,"payment.failed":new Set,"payment.response":new Set},t={async emit(t,n){switch(t){case`challenge.received`:{let r;for(let t of e[`challenge.received`]){let e=await Sw(t,n);if(typeof e==`string`&&e.length>0){r=e;break}}return await ww(e[`*`],t,n),r}case`credential.created`:await Cw(e[`credential.created`],n),await ww(e[`*`],t,n);return;case`payment.failed`:await Cw(e[`payment.failed`],n),await ww(e[`*`],t,n);return;case`payment.response`:await Cw(e[`payment.response`],n),await ww(e[`*`],t,n);return}},on:(t,n)=>{switch(t){case`*`:case`challenge.received`:case`credential.created`:case`payment.failed`:case`payment.response`:return e[t].add(n),()=>e[t].delete(n);default:throw Error(`Unknown client event "${String(t)}".`)}}};return nT.set(t,t=>e[t].size>0||e[`*`].size>0),t}function xw(e,t){return nT.get(e)?.(t)??!0}async function Sw(e,t){try{return await e(t)}catch{return}}async function Cw(e,t){for(let n of e)try{await n(t)}catch{}}async function ww(e,t,n){await Cw(e,Object.freeze({name:t,payload:n}))}function Tw(e){let t;return n=>(t??=e(n),t)}function Ew(e){return Object.freeze({challenge:Pw(e.challenge),challenges:e.challenges.map(e=>Pw(e)),createCredential:e.createCredential,init:Aw(e.init),input:jw(e.input),method:Mw(e.method),response:Nw(e.response)})}function Dw(e){return Object.freeze({challenge:Pw(e.challenge),credential:e.credential,init:Aw(e.init),input:jw(e.input),method:Mw(e.method),...e.response===void 0?{}:{response:Nw(e.response)}})}function Ow(e){return Object.freeze({challenge:Pw(e.challenge),credential:e.credential,init:Aw(e.init),input:jw(e.input),method:Mw(e.method),response:Nw(e.response)})}function kw(e){return Object.freeze({...e.challenge?{challenge:Pw(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>Pw(e))}:{},error:e.error,init:Aw(e.init),input:jw(e.input),...e.method?{method:Mw(e.method)}:{},...e.response===void 0?{}:{response:Nw(e.response)}})}function Aw(e){if(e)return Iw({...e,...e.headers?{headers:new Headers(e.headers)}:{}})}function jw(e){if(e instanceof Request)try{return e.clone()}catch{return e}return e instanceof URL?new URL(e):e}function Mw(e){return Iw(Object.assign({},e))}function Nw(e){return e instanceof Response?e.clone():Pw(e)}function Pw(e){try{return Fw(structuredClone(e))}catch{return Iw(e)}}function Fw(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))Fw(t);return e}function Iw(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function Lw(e,t,n,r,i,a){let o=!!r&&!i&&Jw(e,a);if(!o)return{headers:n,init:t,input:e};let s=new Headers(e instanceof Request?e.headers:void 0);return n.forEach((e,t)=>{s.set(t,e)}),s.set(q.acceptPayment,r),t?(t.headers=s,{headers:s,init:t,input:e}):{headers:s,init:o?{headers:s}:void 0,input:e}}function Rw(e,t,n){if(!(!(e instanceof Request)||t?.body!==void 0||!e.body||e.bodyUsed)){if(!n.has(`mcp-method`)){let e=n.get(`accept`)?.toLowerCase()??``;if(!e.includes(`application/json`)||!e.includes(`text/event-stream`))return}try{return e.clone().text().catch(()=>void 0)}catch{return}}}function zw(e,t){return t===void 0?e:{...e,body:t}}function Bw(e,t){return t?new Headers(t):new Headers(e instanceof Request?e.headers:void 0)}function Vw(e){let t=e;for(;t[$w];)t=t[$w];return t}function Hw(e){if(!(e instanceof Request)||!e.body||e.bodyUsed)return e;try{return e.clone()}catch{return e}}function Uw(e,t){return t?.signal??(e instanceof Request?e.signal:void 0)}function Ww(e){if(!e.trim())throw Error(`Credential header value must be non-empty`);if(e.includes(`\r`)||e.includes(`
224
- `))throw Error(`Credential header value contains illegal newline characters`)}async function Gw(e,t,n,r){let i=t.context&&n!==void 0?t.context.parse(n):void 0,a=i===void 0?{challenge:e}:{challenge:e,context:i};return r&&uw(t,a,r),t.createCredential(a)}function Kw(e,t){let n=e.get(q.acceptPayment);if(!n)return t;try{return{...t,entries:ES(n),header:n}}catch{return t}}async function qw(e,t){return t?t(e):e}function Jw(e,t){if(t===`always`)return!0;if(t===`never`)return!1;let n=Zw(e);return t===`same-origin`?!Xw()||n.origin===globalThis.location.origin:t.origins.some(e=>Yw(n,e))}function Yw(e,t){if(t.startsWith(`*.`)){let n=t.slice(1);return e.hostname.endsWith(n)||e.hostname===t.slice(2)}return e.origin===new URL(t).origin}function Xw(){return globalThis.location!==void 0}function Zw(e){return e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e,Xw()?globalThis.location.href:void 0)}function Qw(e,t,n){if(!e.url)return t;let r=new URL(e.url),i=Zw(n);if(r.origin!==i.origin)throw Error(`Refusing to send payment credential across redirect from ${i.origin} to ${r.origin}`);return e.url}var $w,eT,tT,nT,rT=F((()=>{pS(),jx(),yS(),US(),nw(),sw(),hw(),$w=Symbol.for(`mppx.fetch.wrapper`),eT=3,nT=new WeakMap}));wx(),rT();function iT(){let e=new Uint8Array(64);return crypto.getRandomValues(e),Object.freeze({created:Math.floor(Date.now()/1e3),nonce:O.fromBytes(e,{pad:!1,url:!0})})}function aT(...e){return{protocol:`composed`,async sign(t,n=iT()){for(let r of e)t=await r.sign(t,n);return t}}}function oT(e,t){return async(n,r)=>e(await t.sign(new Request(n,r)))}jx(),yS(),US(),sw(),nw();const sT=new WeakMap;function cT(e){let{attestation:t,maxPaymentRetries:n,onChallenge:r,orderChallenges:i,polyfill:a=!0,acceptPaymentPolicy:o=a&&globalThis.location!==void 0?`same-origin`:`always`,transport:s=tw()}=e,c=Vw(e.fetch??globalThis.fetch),l=t?lT(t):void 0,u=l?oT(c,l):c,d=e.methods.flat(),f=TS(d,e.paymentPreferences),p=bw(),m=r,h={acceptPayment:f,acceptPaymentPolicy:o,...(e.fetch||t)&&{fetch:u},eventDispatcher:p,...n!==void 0&&{maxPaymentRetries:n},...m&&{onChallenge:m},...i&&{orderChallenges:i},methods:d,transport:s},g=_w(h);a&&vw(h);function _(e){return p.on(`challenge.received`,e)}function v(e){return p.on(`credential.created`,e)}function y(e){return p.on(`payment.failed`,e)}function b(e){return p.on(`payment.response`,e)}async function x(e,t){let n=CT(e),r=await s.getChallenges(e,t?.request),a=Object.freeze(r.map(e=>wT(e))),o=DT(f.entries,t?.acceptPayment),c,l;try{let e=(await OT(kS(r,d,o),t?.orderChallenges??i))[0];if(!e)throw Error(`No method found for challenges: ${r.map(e=>`${e.method}.${e.intent}`).join(`, `)}. Available: ${d.map(e=>`${e.name}.${e.intent}`).join(`, `)}`);let u=e.challenge;c=a[e.index],l=e.method,c.expires&&vS(c.expires,c.id);let f=c,m=l,h=vT(async e=>{try{f.expires&&vS(f.expires,f.id);let t=vT(t=>kT(f,m,t??e)),i=await p.emit(`challenge.received`,yT({challenge:f,challenges:r,createCredential:t,method:m,response:n}))??await t();return Ww(i),await p.emit(`credential.created`,bT({challenge:f,credential:i,method:m,response:n})),i}catch(e){throw await p.emit(`payment.failed`,xT({challenge:f,challenges:r,error:e,method:m,response:n})),e}}),g=Object.freeze({challenge:f,challenges:a,createCredential:h,method:ST(m),setCredential(e,t){return Ww(t),s.setCredential(e,t,{challenge:u})}});return sT.set(g,m),g}catch(e){throw await p.emit(`payment.failed`,xT({challenge:c,challenges:r,error:e,method:l,response:n})),e}}async function S(e,t,n){let{maxRedirects:r=20,...i}=n??{},a=await pT({acceptPayment:f.header,acceptPaymentPolicy:o,fetch:c,init:t,input:e,maxRedirects:r,signer:l}),d=mT(a.replayRequest,a.body);if(!await s.isPaymentRequired(a.response,d))throw Error(`Response does not require payment.`);let p=await x(a.response,{...i,request:d}),m=sT.get(p)??p.method,h=vT(async e=>(iw(m)&&await aw(m,{challenge:p.challenge,context:e,fetch:u,input:a.replayRequest}),p.createCredential(e)));return Object.freeze({...p,createCredential:h,request:a.request,response:a.response,redirects:a.redirects,async pay(e){let t=await h(e),n=p.setCredential(mT(a.replayRequest,a.body),t);return u(a.replayRequest.url,{...n,redirect:`manual`})}})}return{fetch:g,rawFetch:c,methods:d,transport:s,on:p.on,onChallengeReceived:_,onCredentialCreated:v,onPaymentFailed:y,onPaymentResponse:b,preparePayment:x,prepareRequest:S,async createCredential(e,t,n){return(await x(e,n)).createCredential(t)}}}function lT(e){let t=Object.values(e);if(t.length===0)throw TypeError(`Mppx client attestation must configure at least one signer.`);return aT(...t)}const uT=new Set([301,302,303,307,308]),dT=[`content-encoding`,`content-language`,`content-length`,`content-location`,`content-type`,`transfer-encoding`],fT=[`authorization`,`cookie`,`cookie2`,`host`,`payment-authorization`,`payment-signature`,`proxy-authorization`,`x-payment`];async function pT(e){let{acceptPayment:t,acceptPaymentPolicy:n,fetch:r,init:i,input:a,maxRedirects:o,signer:s}=e;if(!Number.isInteger(o)||o<0)throw TypeError(`maxRedirects must be a non-negative integer.`);let c=new Request(a,{...i,redirect:`manual`}),l=c.headers.has(q.acceptPayment),u=await hT(c,i?.body),d=[];for(;;){c=gT(c,t,l,n);let e=s?await s.sign(c.clone()):c.clone(),i=await r(e);if(i.type===`opaqueredirect`||i.status===0)throw Error(`prepareRequest requires a runtime that exposes manual redirect responses.`);if(!uT.has(i.status))return{body:u,replayRequest:c,request:e,response:i,redirects:Object.freeze(d)};let a=i.headers.get(`location`);if(!a)return{body:u,replayRequest:c,request:e,response:i,redirects:Object.freeze(d)};if(d.length>=o)throw await i.body?.cancel(),Error(`Payment request exceeded ${o} redirects.`);let f=new URL(c.url),p=new URL(a,f);if(f.protocol===`https:`&&p.protocol!==`https:`)throw await i.body?.cancel(),Error(`Payment request refused HTTPS downgrade redirect to ${p.href}`);let m=new Headers(c.headers),h=c.method;if((i.status===301||i.status===302)&&h===`POST`||i.status===303&&h!==`GET`&&h!==`HEAD`){h=`GET`,u=void 0;for(let e of dT)m.delete(e)}if(f.origin!==p.origin)for(let e of[...m.keys()]){let t=m.get(e)??``;(fT.includes(e)||t.startsWith(`Payment `))&&m.delete(e)}d.push(Object.freeze({from:f.href,status:i.status,to:p.href})),await i.body?.cancel(),c=new Request(p,_T(c,m,h,u))}}function mT(e,t){return _T(e,new Headers(e.headers),e.method,t)}async function hT(e,t){if(typeof t==`string`)return t;if(!e.body)return;let n=e.headers.get(`accept`)?.toLowerCase()??``;return e.headers.has(`mcp-method`)||n.includes(`application/json`)&&n.includes(`text/event-stream`)?e.clone().text():e.clone().arrayBuffer()}function gT(e,t,n,r){if(n)return e;let i=new Headers(e.headers);return i.delete(q.acceptPayment),t&&Jw(e,r)&&i.set(q.acceptPayment,t),new Request(e,{headers:i})}function _T(e,t,n,r){return{...r?{body:r}:{},cache:e.cache,credentials:e.credentials,headers:t,integrity:e.integrity,keepalive:e.keepalive,method:n,mode:e.mode,redirect:`manual`,referrer:e.referrer,referrerPolicy:e.referrerPolicy,signal:e.signal}}function vT(e){let t;return n=>(t??=e(n),t)}function yT(e){return Object.freeze({challenge:wT(e.challenge),challenges:e.challenges.map(e=>wT(e)),createCredential:e.createCredential,method:ST(e.method),response:CT(e.response)})}function bT(e){return Object.freeze({challenge:wT(e.challenge),credential:e.credential,method:ST(e.method),response:CT(e.response)})}function xT(e){return Object.freeze({...e.challenge?{challenge:wT(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>wT(e))}:{},error:e.error,...e.method?{method:ST(e.method)}:{},response:CT(e.response)})}function ST(e){return ET(Object.assign({},e))}function CT(e){if(e instanceof Response)try{return e.clone()}catch{return new Response(null,{headers:e.headers,status:e.status,statusText:e.statusText})}return wT(e)}function wT(e){try{let t=structuredClone(e);if(e&&t&&typeof e==`object`&&typeof t==`object`)for(let n of Object.getOwnPropertySymbols(e)){let r=Object.getOwnPropertyDescriptor(e,n);r&&Object.defineProperty(t,n,r)}return TT(t)}catch{return ET(e)}}function TT(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))TT(t);return e}function ET(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function DT(e,t){return t?typeof t==`string`?ES(t):t:e}async function OT(e,t){return t?t(e):e}async function kT(e,t,n){let r=t.context&&n!==void 0?t.context.parse(n):void 0;return t.createCredential(r===void 0?{challenge:e}:{challenge:e,context:r})}function AT(){return J.string().check(J.regex(jT,`Invalid URI or path`))}var jT,MT,NT,PT,FT,IT,LT,RT,zT,BT=F((()=>{qx(),jT=/^([a-zA-Z][a-zA-Z\d+.-]*:\/\/\S+|\/\S*)$/,MT=new Set([`amount`,`currency`,`description`,`intent`,`method`]),NT=J.looseObject({amount:J.optional(J.union([J.null(),J.string().check(J.regex(/^(0|[1-9][0-9]*)$/,`Invalid amount`))])),currency:J.optional(J.string()),description:J.optional(J.string()),intent:J.optional(J.string()),method:J.optional(J.string())}),PT=J.pipe(J.looseObject({amount:J.optional(J.union([J.null(),J.string().check(J.regex(/^(0|[1-9][0-9]*)$/,`Invalid amount`))])),currency:J.optional(J.string()),description:J.optional(J.string()),intent:J.optional(J.string()),method:J.optional(J.string()),offers:J.optional(J.array(NT).check(J.minLength(1)))}).check(J.refine(e=>e.offers===void 0||Object.keys(e).every(e=>e===`offers`||!MT.has(e)),`Cannot mix offers with flat payment info fields`)),J.transform(e=>{if(e.offers)return{offers:e.offers};let t={};for(let[n,r]of Object.entries(e))n!==`offers`&&(MT.has(n)||r!==void 0)&&(t[n]=r);return{offers:[t]}})),FT=J.looseObject({apiReference:J.optional(AT()),homepage:J.optional(AT()),llms:J.optional(AT())}),IT=J.looseObject({categories:J.optional(J.array(J.string())),docs:J.optional(FT)}),LT=J.looseObject({"x-payment-info":J.optional(PT),requestBody:J.optional(J.unknown()),responses:J.optional(J.record(J.string(),J.unknown())),summary:J.optional(J.string())}),RT=J.looseObject({delete:J.optional(LT),get:J.optional(LT),head:J.optional(LT),options:J.optional(LT),patch:J.optional(LT),post:J.optional(LT),put:J.optional(LT),trace:J.optional(LT)}),zT=J.looseObject({openapi:J.string(),info:J.looseObject({title:J.string(),version:J.string()}),"x-service-info":J.optional(IT),paths:J.optional(J.record(J.string(),RT))})}));BT();function VT(e){let t=[],n=zT.safeParse(e);if(!n.success){for(let e of n.error.issues)t.push({message:e.message,path:e.path.map(String).join(`.`)||`(root)`,severity:`error`});return t}let r=n.data.paths;if(!r)return t;for(let[e,n]of Object.entries(r))for(let[r,i]of Object.entries(n)){if(!i||typeof i!=`object`||Array.isArray(i))continue;let n=i,a=`paths.${e}.${r}`,o=n[`x-payment-info`];if(!o)continue;let s=PT.safeParse(o);if(!s.success){for(let e of s.error.issues){let n=e.path.length>0?`.${e.path.map(String).join(`.`)}`:``;t.push({message:e.message,path:`${a}.x-payment-info${n}`,severity:`error`})}continue}let c=n.responses;(!c||!(`402`in c))&&t.push({message:`Operation with x-payment-info MUST have a 402 response`,path:`${a}.responses`,severity:`error`});let l=r.toUpperCase();!n.requestBody&&(l===`POST`||l===`PUT`||l===`PATCH`)&&t.push({message:`Operation with x-payment-info has no requestBody`,path:a,severity:`warning`})}return t}function HT(e){return e}function UT(e,t){let{canHandleChallenge:n,context:r,createCredential:i}=t;return{...e,canHandleChallenge:n,context:r,createCredential:i}}var WT=F((()=>{}));function GT(e){return J.refine(e=>{let{amount:t,decimals:n}=e;return N(t,n)>0n},e)}function KT(e){let{periodCount:t,periodUnit:n}=e;try{let e=XT[n];return e!==void 0&&BigInt(t)*e<=YT}catch{return!1}}var qT,JT,YT,XT,ZT,QT,$T,eE,tE,nE,rE,iE,aE,oE=F((()=>{jx(),WT(),qx(),qT=[`push`,`pull`],JT=J.object({amount:Lx(),memo:J.optional(Ux()),recipient:J.pipe(J.string(),J.transform(e=>e))}),YT=(1n<<64n)-1n,XT={dev_second:1n,day:86400n,week:604800n},ZT=J.pipe(Hx(),J.transform(e=>e.toLowerCase())),QT=J.object({accessKeyAddress:ZT,keyType:J.enum([`p256`,`secp256k1`,`webAuthn`])}),$T=J.object({accessKey:J.optional(QT),chainId:J.optional(J.number())}),eE=zx(`subscriptionExpires must be a valid date`).check(J.refine(e=>e.getTime()%1e3==0,`subscriptionExpires must be representable as whole seconds`)),tE=J.enum([`dev_second`,`day`,`week`]),nE=J.pipe(J.union([J.string(),J.bigint(),J.custom(e=>typeof e==`number`&&Number.isSafeInteger(e))]),J.transform(e=>e.toString())).check(J.regex(/^[1-9]\d*$/,`Invalid periodCount`),J.refine(e=>{try{return BigInt(e)<=YT}catch{return!1}},`periodCount exceeds uint64`)),rE=HT({name:`tempo`,intent:`charge`,schema:{credential:{payload:J.discriminatedUnion(`type`,[J.object({hash:Ux(),type:J.literal(`hash`)}),J.object({signature:Gx(),type:J.literal(`transaction`)}),J.object({signature:Gx(),type:J.literal(`proof`)})])},request:J.pipe(J.object({amount:Lx(),chainId:J.optional(J.number()),currency:J.string(),decimals:J.number(),description:J.optional(J.string()),externalId:J.optional(J.string()),feePayer:J.optional(J.pipe(J.union([J.boolean(),J.custom()]),J.transform(e=>typeof e==`object`||e))),memo:J.optional(Ux()),recipient:J.optional(J.string()),splits:J.optional(J.array(JT).check(J.minLength(1),J.maxLength(10))),supportedModes:J.optional(J.array(J.enum(qT)).check(J.minLength(1)))}).check(J.refine(({amount:e,decimals:t,splits:n})=>{if(!n)return!0;let r=N(e,t),i=n.reduce((e,n)=>e+N(n.amount,t),0n);return n.every(e=>N(e.amount,t)>0n)&&i<r},`Invalid splits`)),J.transform(({amount:e,chainId:t,decimals:n,feePayer:r,memo:i,splits:a,supportedModes:o,...s})=>({...s,amount:N(e,n).toString(),...t!==void 0||r!==void 0||i!==void 0||a!==void 0||o!==void 0?{methodDetails:{...t!==void 0&&{chainId:t},...r!==void 0&&{feePayer:r},...i!==void 0&&{memo:i},...a!==void 0&&{splits:a.map(e=>({...e,amount:N(e.amount,n).toString()}))},...o!==void 0&&{supportedModes:o}}}:{}})))}}),iE=HT({name:`tempo`,intent:`session`,schema:{credential:{payload:J.discriminatedUnion(`action`,[J.object({action:J.literal(`open`),authorizedSigner:J.optional(J.string()),channelId:Ux(),cumulativeAmount:Lx(),descriptor:J.optional(J.custom()),signature:Gx(),transaction:Gx(),type:J.literal(`transaction`)}),J.object({action:J.literal(`topUp`),additionalDeposit:Lx(),channelId:Ux(),descriptor:J.optional(J.custom()),transaction:Gx(),type:J.literal(`transaction`)}),J.object({action:J.literal(`voucher`),channelId:Ux(),cumulativeAmount:Lx(),descriptor:J.optional(J.custom()),signature:Gx()}),J.object({action:J.literal(`close`),channelId:Ux(),cumulativeAmount:Lx(),descriptor:J.optional(J.custom()),signature:Gx()})])},request:J.pipe(J.object({amount:Lx(),chainId:J.optional(J.number()),channelId:J.optional(Ux()),currency:J.string(),decimals:J.number(),escrowContract:J.optional(J.string()),feePayer:J.optional(J.pipe(J.union([J.boolean(),J.custom()]),J.transform(e=>typeof e==`object`||e))),feeToken:J.optional(Hx()),minVoucherDelta:J.optional(Lx()),operator:J.optional(Hx()),recipient:J.optional(J.string()),sessionProtocol:J.optional(J.enum([Ax.v2,Ax.v1])),sessionSnapshot:J.optional(J.custom()),suggestedDeposit:J.optional(Lx()),unitType:J.string()}).check(J.refine(({amount:e,decimals:t})=>N(e,t)>0n,`Session amount must be greater than 0`)),J.transform(({amount:e,chainId:t,channelId:n,decimals:r,escrowContract:i,feePayer:a,feeToken:o,minVoucherDelta:s,operator:c,sessionProtocol:l,sessionSnapshot:u,suggestedDeposit:d,...f})=>({...f,amount:N(e,r).toString(),...d?{suggestedDeposit:N(d,r).toString()}:{},methodDetails:{escrowContract:i,...n!==void 0&&{channelId:n},...s!==void 0&&{minVoucherDelta:N(s,r).toString()},...t!==void 0&&{chainId:t},...a!==void 0&&{feePayer:a},...o!==void 0&&{feeToken:o},...c!==void 0&&{operator:c},...l!==void 0&&{[kx.sessionProtocol]:l},...u!==void 0&&{[kx.sessionSnapshot]:u}}})))}}),aE=HT({name:`tempo`,intent:`subscription`,schema:{credential:{payload:J.object({signature:Gx(),type:J.literal(`keyAuthorization`)})},request:J.pipe(J.object({amount:Lx(),accessKey:J.optional(QT),chainId:J.optional(J.number()),currency:ZT,decimals:J.number(),description:J.optional(J.string()),externalId:J.optional(J.string()),methodDetails:J.optional($T),periodCount:nE,periodUnit:tE,recipient:ZT,subscriptionExpires:eE}).check(GT(`Subscription amount must be greater than 0`),J.refine(KT,`Subscription period exceeds uint64`)),J.transform(({accessKey:e,amount:t,chainId:n,decimals:r,methodDetails:i,subscriptionExpires:a,...o})=>{let s={...i,...e!==void 0&&{accessKey:e},...n!==void 0&&{chainId:n}};return{...o,amount:N(t,r).toString(),subscriptionExpires:a.toISOString(),...Object.keys(s).length>0?{methodDetails:s}:{}}}))}})}));function sE(e){return e>=0n&&e<=EE}function cE(e){if(!/^\d{1,29}$/.test(e))return;let t=BigInt(e);return sE(t)?t:void 0}function lE(e){return uE(e),e}function uE(e){if(!sE(e))throw Error(`Value ${e} is outside uint96 bounds.`)}function dE(e){return typeof e==`object`&&!!e}function fE(e){return typeof e==`string`&&DE.has(e)}function pE(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(typeof t.channelId!=`string`||t.action!==void 0&&!fE(t.action))}function mE(e,t=`No session credential context available.`){if(!pE(e))throw Error(t);return e}function hE(e){let t=e.request.amount;if(typeof t!=`string`)throw Error(`Session challenge is missing amount.`);return BigInt(t)}function gE(e){return dE(e)?typeof e.channelId==`string`&&typeof e.requiredCumulative==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.deposit==`string`:!1}function _E(e){return dE(e)?e.method===`tempo`&&e.intent===`session`&&e.status===`success`&&typeof e.timestamp==`string`&&typeof e.reference==`string`&&typeof e.challengeId==`string`&&typeof e.channelId==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.spent==`string`&&(e.units===void 0||typeof e.units==`number`)&&(e.txHash===void 0||typeof e.txHash==`string`):!1}function vE(e){let t=O.toString(e),n=JSON.parse(t);if(!_E(n))throw Error(`Invalid session receipt.`);return n}function yE(e){return e.headers.get(`content-type`)?.toLowerCase().startsWith(`text/event-stream`)??!1}function bE(e){let t=`message`,n=[];for(let r of e.split(`
224
+ `))throw Error(`Credential header value contains illegal newline characters`)}async function Gw(e,t,n,r){let i=t.context&&n!==void 0?t.context.parse(n):void 0,a=i===void 0?{challenge:e}:{challenge:e,context:i};return r&&uw(t,a,r),t.createCredential(a)}function Kw(e,t){let n=e.get(q.acceptPayment);if(!n)return t;try{return{...t,entries:ES(n),header:n}}catch{return t}}async function qw(e,t){return t?t(e):e}function Jw(e,t){if(t===`always`)return!0;if(t===`never`)return!1;let n=Zw(e);return t===`same-origin`?!Xw()||n.origin===globalThis.location.origin:t.origins.some(e=>Yw(n,e))}function Yw(e,t){if(t.startsWith(`*.`)){let n=t.slice(1);return e.hostname.endsWith(n)||e.hostname===t.slice(2)}return e.origin===new URL(t).origin}function Xw(){return globalThis.location!==void 0}function Zw(e){return e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e,Xw()?globalThis.location.href:void 0)}function Qw(e,t,n){if(!e.url)return t;let r=new URL(e.url),i=Zw(n);if(r.origin!==i.origin)throw Error(`Refusing to send payment credential across redirect from ${i.origin} to ${r.origin}`);return e.url}var $w,eT,tT,nT,rT=F((()=>{pS(),jx(),yS(),US(),nw(),sw(),hw(),$w=Symbol.for(`mppx.fetch.wrapper`),eT=3,nT=new WeakMap}));wx(),rT();function iT(){let e=new Uint8Array(64);return crypto.getRandomValues(e),Object.freeze({created:Math.floor(Date.now()/1e3),nonce:O.fromBytes(e,{pad:!1,url:!0})})}function aT(...e){return{protocol:`composed`,async sign(t,n=iT()){for(let r of e)t=await r.sign(t,n);return t}}}function oT(e,t){return async(n,r)=>e(await t.sign(new Request(n,r)))}jx(),yS(),US(),sw(),nw();const sT=new WeakMap;function cT(e){let{attestation:t,maxPaymentRetries:n,onChallenge:r,orderChallenges:i,polyfill:a=!0,acceptPaymentPolicy:o=a&&globalThis.location!==void 0?`same-origin`:`always`,transport:s=tw()}=e,c=Vw(e.fetch??globalThis.fetch),l=t?lT(t):void 0,u=l?oT(c,l):c,d=e.methods.flat(),f=TS(d,e.paymentPreferences),p=bw(),m=r,h={acceptPayment:f,acceptPaymentPolicy:o,...(e.fetch||t)&&{fetch:u},eventDispatcher:p,...n!==void 0&&{maxPaymentRetries:n},...m&&{onChallenge:m},...i&&{orderChallenges:i},methods:d,transport:s},g=_w(h);a&&vw(h);function _(e){return p.on(`challenge.received`,e)}function v(e){return p.on(`credential.created`,e)}function y(e){return p.on(`payment.failed`,e)}function b(e){return p.on(`payment.response`,e)}async function x(e,t){let n=CT(e),r=await s.getChallenges(e,t?.request),a=Object.freeze(r.map(e=>wT(e))),o=DT(f.entries,t?.acceptPayment),c,l;try{let e=(await OT(kS(r,d,o),t?.orderChallenges??i))[0];if(!e)throw Error(`No method found for challenges: ${r.map(e=>`${e.method}.${e.intent}`).join(`, `)}. Available: ${d.map(e=>`${e.name}.${e.intent}`).join(`, `)}`);let u=e.challenge;c=a[e.index],l=e.method,c.expires&&vS(c.expires,c.id);let f=c,m=l,h=vT(async e=>{try{f.expires&&vS(f.expires,f.id);let t=vT(t=>kT(f,m,t??e)),i=await p.emit(`challenge.received`,yT({challenge:f,challenges:r,createCredential:t,method:m,response:n}))??await t();return Ww(i),await p.emit(`credential.created`,bT({challenge:f,credential:i,method:m,response:n})),i}catch(e){throw await p.emit(`payment.failed`,xT({challenge:f,challenges:r,error:e,method:m,response:n})),e}}),g=Object.freeze({challenge:f,challenges:a,createCredential:h,method:ST(m),setCredential(e,t){return Ww(t),s.setCredential(e,t,{challenge:u})}});return sT.set(g,m),g}catch(e){throw await p.emit(`payment.failed`,xT({challenge:c,challenges:r,error:e,method:l,response:n})),e}}async function S(e,t,n){let{maxRedirects:r=20,requirePayment:i=!1,...a}=n??{},d=await pT({acceptPayment:f.header,acceptPaymentPolicy:o,fetch:c,init:t,input:e,maxRedirects:r,signer:l}),p=mT(d.replayRequest,d.body);if(!await s.isPaymentRequired(d.response,p)){if(i)throw Error(`Response does not require payment.`);return Object.freeze({payment:void 0,request:d.request,response:d.response,redirects:d.redirects})}let m=await x(d.response,{...a,request:p}),h=sT.get(m)??m.method,g=vT(async e=>(iw(h)&&await aw(h,{challenge:m.challenge,context:e,fetch:u,input:d.replayRequest}),m.createCredential(e))),_=Object.freeze({...m,createCredential:g,async pay(e){let t=await g(e),n=m.setCredential(mT(d.replayRequest,d.body),t);return u(d.replayRequest.url,{...n,redirect:`manual`})}});return Object.freeze({payment:_,request:d.request,response:d.response,redirects:d.redirects})}return{fetch:g,rawFetch:c,methods:d,transport:s,on:p.on,onChallengeReceived:_,onCredentialCreated:v,onPaymentFailed:y,onPaymentResponse:b,preparePayment:x,prepareRequest:S,async createCredential(e,t,n){return(await x(e,n)).createCredential(t)}}}function lT(e){let t=Object.values(e);if(t.length===0)throw TypeError(`Mppx client attestation must configure at least one signer.`);return aT(...t)}const uT=new Set([301,302,303,307,308]),dT=[`content-encoding`,`content-language`,`content-length`,`content-location`,`content-type`,`transfer-encoding`],fT=[`authorization`,`cookie`,`cookie2`,`host`,`payment-authorization`,`payment-signature`,`proxy-authorization`,`x-payment`];async function pT(e){let{acceptPayment:t,acceptPaymentPolicy:n,fetch:r,init:i,input:a,maxRedirects:o,signer:s}=e;if(!Number.isInteger(o)||o<0)throw TypeError(`maxRedirects must be a non-negative integer.`);let c=new Request(a,{...i,redirect:`manual`}),l=c.headers.has(q.acceptPayment),u=await hT(c,i?.body),d=[];for(;;){c=gT(c,t,l,n);let e=s?await s.sign(c.clone()):c.clone(),i=await r(e);if(i.type===`opaqueredirect`||i.status===0)throw Error(`prepareRequest requires a runtime that exposes manual redirect responses.`);if(!uT.has(i.status))return{body:u,replayRequest:c,request:e,response:i,redirects:Object.freeze(d)};let a=i.headers.get(`location`);if(!a)return{body:u,replayRequest:c,request:e,response:i,redirects:Object.freeze(d)};if(d.length>=o)throw await i.body?.cancel(),Error(`Payment request exceeded ${o} redirects.`);let f=new URL(c.url),p=new URL(a,f);if(f.protocol===`https:`&&p.protocol!==`https:`)throw await i.body?.cancel(),Error(`Payment request refused HTTPS downgrade redirect to ${p.href}`);let m=new Headers(c.headers),h=c.method;if((i.status===301||i.status===302)&&h===`POST`||i.status===303&&h!==`GET`&&h!==`HEAD`){h=`GET`,u=void 0;for(let e of dT)m.delete(e)}if(f.origin!==p.origin)for(let e of[...m.keys()]){let t=m.get(e)??``;(fT.includes(e)||t.startsWith(`Payment `))&&m.delete(e)}d.push(Object.freeze({from:f.href,status:i.status,to:p.href})),await i.body?.cancel(),c=new Request(p,_T(c,m,h,u))}}function mT(e,t){return _T(e,new Headers(e.headers),e.method,t)}async function hT(e,t){if(typeof t==`string`)return t;if(!e.body)return;let n=e.headers.get(`accept`)?.toLowerCase()??``;return e.headers.has(`mcp-method`)||n.includes(`application/json`)&&n.includes(`text/event-stream`)?e.clone().text():e.clone().arrayBuffer()}function gT(e,t,n,r){if(n)return e;let i=new Headers(e.headers);return i.delete(q.acceptPayment),t&&Jw(e,r)&&i.set(q.acceptPayment,t),new Request(e,{headers:i})}function _T(e,t,n,r){return{...r?{body:r}:{},cache:e.cache,credentials:e.credentials,headers:t,integrity:e.integrity,keepalive:e.keepalive,method:n,mode:e.mode,redirect:`manual`,referrer:e.referrer,referrerPolicy:e.referrerPolicy,signal:e.signal}}function vT(e){let t;return n=>(t??=e(n),t)}function yT(e){return Object.freeze({challenge:wT(e.challenge),challenges:e.challenges.map(e=>wT(e)),createCredential:e.createCredential,method:ST(e.method),response:CT(e.response)})}function bT(e){return Object.freeze({challenge:wT(e.challenge),credential:e.credential,method:ST(e.method),response:CT(e.response)})}function xT(e){return Object.freeze({...e.challenge?{challenge:wT(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>wT(e))}:{},error:e.error,...e.method?{method:ST(e.method)}:{},response:CT(e.response)})}function ST(e){return ET(Object.assign({},e))}function CT(e){if(e instanceof Response)try{return e.clone()}catch{return new Response(null,{headers:e.headers,status:e.status,statusText:e.statusText})}return wT(e)}function wT(e){try{let t=structuredClone(e);if(e&&t&&typeof e==`object`&&typeof t==`object`)for(let n of Object.getOwnPropertySymbols(e)){let r=Object.getOwnPropertyDescriptor(e,n);r&&Object.defineProperty(t,n,r)}return TT(t)}catch{return ET(e)}}function TT(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))TT(t);return e}function ET(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function DT(e,t){return t?typeof t==`string`?ES(t):t:e}async function OT(e,t){return t?t(e):e}async function kT(e,t,n){let r=t.context&&n!==void 0?t.context.parse(n):void 0;return t.createCredential(r===void 0?{challenge:e}:{challenge:e,context:r})}function AT(){return J.string().check(J.regex(jT,`Invalid URI or path`))}var jT,MT,NT,PT,FT,IT,LT,RT,zT,BT=F((()=>{qx(),jT=/^([a-zA-Z][a-zA-Z\d+.-]*:\/\/\S+|\/\S*)$/,MT=new Set([`amount`,`currency`,`description`,`intent`,`method`]),NT=J.looseObject({amount:J.optional(J.union([J.null(),J.string().check(J.regex(/^(0|[1-9][0-9]*)$/,`Invalid amount`))])),currency:J.optional(J.string()),description:J.optional(J.string()),intent:J.optional(J.string()),method:J.optional(J.string())}),PT=J.pipe(J.looseObject({amount:J.optional(J.union([J.null(),J.string().check(J.regex(/^(0|[1-9][0-9]*)$/,`Invalid amount`))])),currency:J.optional(J.string()),description:J.optional(J.string()),intent:J.optional(J.string()),method:J.optional(J.string()),offers:J.optional(J.array(NT).check(J.minLength(1)))}).check(J.refine(e=>e.offers===void 0||Object.keys(e).every(e=>e===`offers`||!MT.has(e)),`Cannot mix offers with flat payment info fields`)),J.transform(e=>{if(e.offers)return{offers:e.offers};let t={};for(let[n,r]of Object.entries(e))n!==`offers`&&(MT.has(n)||r!==void 0)&&(t[n]=r);return{offers:[t]}})),FT=J.looseObject({apiReference:J.optional(AT()),homepage:J.optional(AT()),llms:J.optional(AT())}),IT=J.looseObject({categories:J.optional(J.array(J.string())),docs:J.optional(FT)}),LT=J.looseObject({"x-payment-info":J.optional(PT),requestBody:J.optional(J.unknown()),responses:J.optional(J.record(J.string(),J.unknown())),summary:J.optional(J.string())}),RT=J.looseObject({delete:J.optional(LT),get:J.optional(LT),head:J.optional(LT),options:J.optional(LT),patch:J.optional(LT),post:J.optional(LT),put:J.optional(LT),trace:J.optional(LT)}),zT=J.looseObject({openapi:J.string(),info:J.looseObject({title:J.string(),version:J.string()}),"x-service-info":J.optional(IT),paths:J.optional(J.record(J.string(),RT))})}));BT();function VT(e){let t=[],n=zT.safeParse(e);if(!n.success){for(let e of n.error.issues)t.push({message:e.message,path:e.path.map(String).join(`.`)||`(root)`,severity:`error`});return t}let r=n.data.paths;if(!r)return t;for(let[e,n]of Object.entries(r))for(let[r,i]of Object.entries(n)){if(!i||typeof i!=`object`||Array.isArray(i))continue;let n=i,a=`paths.${e}.${r}`,o=n[`x-payment-info`];if(!o)continue;let s=PT.safeParse(o);if(!s.success){for(let e of s.error.issues){let n=e.path.length>0?`.${e.path.map(String).join(`.`)}`:``;t.push({message:e.message,path:`${a}.x-payment-info${n}`,severity:`error`})}continue}let c=n.responses;(!c||!(`402`in c))&&t.push({message:`Operation with x-payment-info MUST have a 402 response`,path:`${a}.responses`,severity:`error`});let l=r.toUpperCase();!n.requestBody&&(l===`POST`||l===`PUT`||l===`PATCH`)&&t.push({message:`Operation with x-payment-info has no requestBody`,path:a,severity:`warning`})}return t}function HT(e){return e}function UT(e,t){let{canHandleChallenge:n,context:r,createCredential:i}=t;return{...e,canHandleChallenge:n,context:r,createCredential:i}}var WT=F((()=>{}));function GT(e){return J.refine(e=>{let{amount:t,decimals:n}=e;return N(t,n)>0n},e)}function KT(e){let{periodCount:t,periodUnit:n}=e;try{let e=XT[n];return e!==void 0&&BigInt(t)*e<=YT}catch{return!1}}var qT,JT,YT,XT,ZT,QT,$T,eE,tE,nE,rE,iE,aE,oE=F((()=>{jx(),WT(),qx(),qT=[`push`,`pull`],JT=J.object({amount:Lx(),memo:J.optional(Ux()),recipient:J.pipe(J.string(),J.transform(e=>e))}),YT=(1n<<64n)-1n,XT={dev_second:1n,day:86400n,week:604800n},ZT=J.pipe(Hx(),J.transform(e=>e.toLowerCase())),QT=J.object({accessKeyAddress:ZT,keyType:J.enum([`p256`,`secp256k1`,`webAuthn`])}),$T=J.object({accessKey:J.optional(QT),chainId:J.optional(J.number())}),eE=zx(`subscriptionExpires must be a valid date`).check(J.refine(e=>e.getTime()%1e3==0,`subscriptionExpires must be representable as whole seconds`)),tE=J.enum([`dev_second`,`day`,`week`]),nE=J.pipe(J.union([J.string(),J.bigint(),J.custom(e=>typeof e==`number`&&Number.isSafeInteger(e))]),J.transform(e=>e.toString())).check(J.regex(/^[1-9]\d*$/,`Invalid periodCount`),J.refine(e=>{try{return BigInt(e)<=YT}catch{return!1}},`periodCount exceeds uint64`)),rE=HT({name:`tempo`,intent:`charge`,schema:{credential:{payload:J.discriminatedUnion(`type`,[J.object({hash:Ux(),type:J.literal(`hash`)}),J.object({signature:Gx(),type:J.literal(`transaction`)}),J.object({signature:Gx(),type:J.literal(`proof`)})])},request:J.pipe(J.object({amount:Lx(),chainId:J.optional(J.number()),currency:J.string(),decimals:J.number(),description:J.optional(J.string()),externalId:J.optional(J.string()),feePayer:J.optional(J.pipe(J.union([J.boolean(),J.custom()]),J.transform(e=>typeof e==`object`||e))),memo:J.optional(Ux()),recipient:J.optional(J.string()),splits:J.optional(J.array(JT).check(J.minLength(1),J.maxLength(10))),supportedModes:J.optional(J.array(J.enum(qT)).check(J.minLength(1)))}).check(J.refine(({amount:e,decimals:t,splits:n})=>{if(!n)return!0;let r=N(e,t),i=n.reduce((e,n)=>e+N(n.amount,t),0n);return n.every(e=>N(e.amount,t)>0n)&&i<r},`Invalid splits`)),J.transform(({amount:e,chainId:t,decimals:n,feePayer:r,memo:i,splits:a,supportedModes:o,...s})=>({...s,amount:N(e,n).toString(),...t!==void 0||r!==void 0||i!==void 0||a!==void 0||o!==void 0?{methodDetails:{...t!==void 0&&{chainId:t},...r!==void 0&&{feePayer:r},...i!==void 0&&{memo:i},...a!==void 0&&{splits:a.map(e=>({...e,amount:N(e.amount,n).toString()}))},...o!==void 0&&{supportedModes:o}}}:{}})))}}),iE=HT({name:`tempo`,intent:`session`,schema:{credential:{payload:J.discriminatedUnion(`action`,[J.object({action:J.literal(`open`),authorizedSigner:J.optional(J.string()),channelId:Ux(),cumulativeAmount:Lx(),descriptor:J.optional(J.custom()),signature:Gx(),transaction:Gx(),type:J.literal(`transaction`)}),J.object({action:J.literal(`topUp`),additionalDeposit:Lx(),channelId:Ux(),descriptor:J.optional(J.custom()),transaction:Gx(),type:J.literal(`transaction`)}),J.object({action:J.literal(`voucher`),channelId:Ux(),cumulativeAmount:Lx(),descriptor:J.optional(J.custom()),signature:Gx()}),J.object({action:J.literal(`close`),channelId:Ux(),cumulativeAmount:Lx(),descriptor:J.optional(J.custom()),signature:Gx()})])},request:J.pipe(J.object({amount:Lx(),chainId:J.optional(J.number()),channelId:J.optional(Ux()),currency:J.string(),decimals:J.number(),escrowContract:J.optional(J.string()),feePayer:J.optional(J.pipe(J.union([J.boolean(),J.custom()]),J.transform(e=>typeof e==`object`||e))),feeToken:J.optional(Hx()),minVoucherDelta:J.optional(Lx()),operator:J.optional(Hx()),recipient:J.optional(J.string()),sessionProtocol:J.optional(J.enum([Ax.v2,Ax.v1])),sessionSnapshot:J.optional(J.custom()),suggestedDeposit:J.optional(Lx()),unitType:J.string()}).check(J.refine(({amount:e,decimals:t})=>N(e,t)>0n,`Session amount must be greater than 0`)),J.transform(({amount:e,chainId:t,channelId:n,decimals:r,escrowContract:i,feePayer:a,feeToken:o,minVoucherDelta:s,operator:c,sessionProtocol:l,sessionSnapshot:u,suggestedDeposit:d,...f})=>({...f,amount:N(e,r).toString(),...d?{suggestedDeposit:N(d,r).toString()}:{},methodDetails:{escrowContract:i,...n!==void 0&&{channelId:n},...s!==void 0&&{minVoucherDelta:N(s,r).toString()},...t!==void 0&&{chainId:t},...a!==void 0&&{feePayer:a},...o!==void 0&&{feeToken:o},...c!==void 0&&{operator:c},...l!==void 0&&{[kx.sessionProtocol]:l},...u!==void 0&&{[kx.sessionSnapshot]:u}}})))}}),aE=HT({name:`tempo`,intent:`subscription`,schema:{credential:{payload:J.object({signature:Gx(),type:J.literal(`keyAuthorization`)})},request:J.pipe(J.object({amount:Lx(),accessKey:J.optional(QT),chainId:J.optional(J.number()),currency:ZT,decimals:J.number(),description:J.optional(J.string()),externalId:J.optional(J.string()),methodDetails:J.optional($T),periodCount:nE,periodUnit:tE,recipient:ZT,subscriptionExpires:eE}).check(GT(`Subscription amount must be greater than 0`),J.refine(KT,`Subscription period exceeds uint64`)),J.transform(({accessKey:e,amount:t,chainId:n,decimals:r,methodDetails:i,subscriptionExpires:a,...o})=>{let s={...i,...e!==void 0&&{accessKey:e},...n!==void 0&&{chainId:n}};return{...o,amount:N(t,r).toString(),subscriptionExpires:a.toISOString(),...Object.keys(s).length>0?{methodDetails:s}:{}}}))}})}));function sE(e){return e>=0n&&e<=EE}function cE(e){if(!/^\d{1,29}$/.test(e))return;let t=BigInt(e);return sE(t)?t:void 0}function lE(e){return uE(e),e}function uE(e){if(!sE(e))throw Error(`Value ${e} is outside uint96 bounds.`)}function dE(e){return typeof e==`object`&&!!e}function fE(e){return typeof e==`string`&&DE.has(e)}function pE(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(typeof t.channelId!=`string`||t.action!==void 0&&!fE(t.action))}function mE(e,t=`No session credential context available.`){if(!pE(e))throw Error(t);return e}function hE(e){let t=e.request.amount;if(typeof t!=`string`)throw Error(`Session challenge is missing amount.`);return BigInt(t)}function gE(e){return dE(e)?typeof e.channelId==`string`&&typeof e.requiredCumulative==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.deposit==`string`:!1}function _E(e){return dE(e)?e.method===`tempo`&&e.intent===`session`&&e.status===`success`&&typeof e.timestamp==`string`&&typeof e.reference==`string`&&typeof e.challengeId==`string`&&typeof e.channelId==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.spent==`string`&&(e.units===void 0||typeof e.units==`number`)&&(e.txHash===void 0||typeof e.txHash==`string`):!1}function vE(e){let t=O.toString(e),n=JSON.parse(t);if(!_E(n))throw Error(`Invalid session receipt.`);return n}function yE(e){return e.headers.get(`content-type`)?.toLowerCase().startsWith(`text/event-stream`)??!1}function bE(e){let t=`message`,n=[];for(let r of e.split(`
225
225
  `))r.startsWith(`event: `)?t=r.slice(7).trim():r.startsWith(`data: `)?n.push(r.slice(6)):r===`data:`&&n.push(``);if(n.length===0)return null;let r=n.join(`
226
226
  `);switch(t){case`message`:return{type:`message`,data:r};case`payment-need-voucher`:{let e=xE(r);return gE(e)?{type:`payment-need-voucher`,data:e}:null}case`payment-receipt`:{let e=xE(r);return _E(e)?{type:`payment-receipt`,data:e}:null}default:return{type:`message`,data:r}}}function xE(e){try{return JSON.parse(e)}catch{return null}}function SE(e){return JSON.stringify({mpp:`authorization`,authorization:e})}function CE(){return JSON.stringify({mpp:`payment-close-request`})}function wE(e){let t=TE(e);return t?t.mpp===`authorization`&&typeof t.authorization==`string`?{mpp:`authorization`,authorization:t.authorization}:t.mpp===`message`&&typeof t.data==`string`?{mpp:`message`,data:t.data}:t.mpp===`payment-close-request`?{mpp:`payment-close-request`}:t.mpp===`payment-close-ready`&&_E(t.data)?{mpp:`payment-close-ready`,data:t.data}:t.mpp===`payment-error`&&typeof t.status==`number`&&typeof t.message==`string`?{mpp:`payment-error`,status:t.status,message:t.message}:t.mpp===`payment-need-voucher`&&gE(t.data)?{mpp:`payment-need-voucher`,data:t.data}:t.mpp===`payment-receipt`&&_E(t.data)?{mpp:`payment-receipt`,data:t.data}:null:null}function TE(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t?null:t}catch{return null}}var EE,DE,OE,kE=F((()=>{EE=(1n<<96n)-1n,DE=new Set([`open`,`topUp`,`voucher`,`close`]),OE=`0x4d50500000000000000000000000000000000000`}));function AE(e){return LE.encode(e)}function jE(e){return LE.decode(e)}var ME,NE,PE,FE,IE,LE,RE=F((()=>{UC(),qx(),ME=J.custom(e=>typeof e==`string`&&pe(e,{strict:!1})),NE=J.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),PE=J.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]+$/.test(e)),FE=J.object({authorizedSigner:ME,expiringNonceHash:NE,operator:ME,payee:ME,payer:ME,salt:NE,token:ME}),IE=J.object({acceptedCumulative:J.string(),chainId:J.number(),channelId:NE,closeRequestedAt:J.optional(J.string()),deposit:J.string(),descriptor:FE,escrow:ME,highestVoucher:J.optional(J.object({channelId:NE,cumulativeAmount:J.string(),signature:PE})),requiredCumulative:J.string(),settled:J.string(),spent:J.string(),units:J.optional(J.number())}),LE=VC(IE)}));function zE(e){return{status:`active`,...e}}function BE(e,t){switch(t.type){case`challengeReceived`:return e.status===`closing`||e.status===`closed`?GE(e,t):{state:{status:`challenged`,challengeId:t.challengeId},effects:[]};case`challenge`:return e.status!==`idle`&&e.status!==`active`?GE(e,t):t.snapshot?{state:{status:`hydrating`,challengeId:t.challengeId,snapshot:t.snapshot},effects:[{type:`hydrate`,snapshot:t.snapshot}]}:{state:{status:`opening`,challengeId:t.challengeId},effects:[{type:`open`}]};case`hydrated`:return e.status===`hydrating`?{state:UE(e.challengeId,t.snapshot),effects:[]}:GE(e,t);case`activated`:return e.status===`closing`||e.status===`closed`?GE(e,t):{state:rD({challengeId:t.challengeId,entry:t.entry,spent:t.spent,units:t.units??0}),effects:[]};case`opened`:return e.status===`opening`?{state:WE(e.challengeId,t.receipt,t.descriptor,t.deposit),effects:[]}:GE(e,t);case`receiptAccepted`:return e.status===`closing`||e.status===`closed`?GE(e,t):{state:oD(t.receipt,t.entry),effects:[]};case`needVoucher`:return e.status===`active`?HE({challengeId:e.challengeId,descriptor:t.descriptor,event:t.event}):GE(e,t);case`topUpStarted`:return e.status===`voucherNeeded`?{state:{status:`toppingUp`,challengeId:e.challengeId,channelId:e.channelId,descriptor:e.descriptor,deposit:e.deposit},effects:[]}:GE(e,t);case`voucherAccepted`:return e.status!==`voucherNeeded`&&e.status!==`toppingUp`?GE(e,t):{state:WE(e.challengeId,t.receipt,e.descriptor,t.deposit??e.deposit),effects:[]};case`settleStarted`:return e.status===`active`?{state:{status:`settling`,channelId:e.channelId,descriptor:e.descriptor,deposit:e.deposit},effects:[{type:`settle`,channelId:e.channelId}]}:GE(e,t);case`settled`:return e.status===`settling`?{state:WE(t.receipt.challengeId,t.receipt,e.descriptor,t.deposit??e.deposit),effects:[]}:GE(e,t);case`closeRequested`:return e.status===`active`?{state:{status:`closeRequested`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`requestClose`,channelId:e.channelId}]}:GE(e,t);case`withdrawable`:return e.status===`closeRequested`?{state:{status:`withdrawable`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`withdraw`,channelId:e.channelId}]}:GE(e,t);case`closeStarted`:return e.status!==`active`&&e.status!==`withdrawable`&&e.status!==`closeRequested`?GE(e,t):{state:{status:`closing`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`close`,channelId:e.channelId}]};case`closed`:return e.status!==`closing`&&e.status!==`withdrawable`?GE(e,t):{state:{status:`closed`,channelId:e.channelId,descriptor:e.descriptor},effects:[]}}}function VE(e,t){let n=BE(e.state,t);return e.state=n.state,n}function HE(e){let{challengeId:t,descriptor:n,event:r}=e,i=BigInt(r.requiredCumulative),a=BigInt(r.deposit);return i>a?{state:{status:`toppingUp`,challengeId:t,channelId:r.channelId,descriptor:n,deposit:r.deposit},effects:[{type:`topUp`,channelId:r.channelId,amount:(i-a).toString()}]}:{state:{status:`voucherNeeded`,challengeId:t,channelId:r.channelId,descriptor:n,requiredCumulative:r.requiredCumulative,deposit:r.deposit},effects:[{type:`voucher`}]}}function UE(e,t){return zE({challengeId:e,channelId:t.channelId,descriptor:t.descriptor,acceptedCumulative:t.acceptedCumulative,deposit:t.deposit,spent:t.spent,units:t.units??0})}function WE(e,t,n,r){return zE({challengeId:e,channelId:t.channelId,descriptor:n,acceptedCumulative:t.acceptedCumulative,deposit:r,spent:t.spent,units:t.units??0})}function GE(e,t){throw Error(`Invalid session transition: ${e.status} + ${t.type}`)}function KE(e){let{cumulativeAmount:t,maxVoucherCumulative:n}=e;if(n!==null&&!(t<=n))throw Error(`requested voucher amount ${t} exceeds local maxDeposit ${n}`)}function qE(e){let{channel:t,maxVoucherCumulative:n,receipt:r}=e;if(!t||r.channelId!==t.channelId)return;let i=BigInt(r.acceptedCumulative),a=BigInt(r.spent);if(a>i)throw Error(`receipt spent exceeds accepted cumulative voucher amount`);if(i>t.cumulativeAmount)throw Error(`receipt accepted cumulative exceeds local voucher state`);if(a>t.cumulativeAmount)throw Error(`receipt spent exceeds local voucher state`);KE({cumulativeAmount:i,maxVoucherCumulative:n}),KE({cumulativeAmount:a,maxVoucherCumulative:n})}function JE(e){let{channel:t,maxVoucherCumulative:n,receipt:r,spent:i}=e;if(!r||r.channelId!==t?.channelId)return i;qE({channel:t,maxVoucherCumulative:n,receipt:r});let a=BigInt(r.spent);return i>a?i:a}function YE(e,t){return typeof e==`bigint`?e:N(e,t)}function XE(e){let{contextDepositRaw:t,maxDeposit:n,requestAmount:r,suggestedDepositRaw:i}=e;if(QE(r,n),t!==void 0){let e=BigInt(t);if(e<r)throw Error(`opening deposit ${e} below request amount ${r}`);return e}let a=i===void 0?void 0:BigInt(i),o=a!==void 0&&a>r?a:r;return n===void 0||o<n?o:n}function ZE(e){let{deposit:t,maxDeposit:n,requiredCumulative:r,suggestedDeposit:i,topUpAmount:a}=e;if(r<=t)return 0n;KE({cumulativeAmount:r,maxVoucherCumulative:n??null});let o=r-t,s=a??i??o,c=s>o?s:o;if(n==null)return c;let l=n-t;return c<l?c:l}function QE(e,t){KE({cumulativeAmount:e,maxVoucherCumulative:t??null})}function $E(e){let{channel:t,currentSocket:n,lastChallenge:r}=e;if(!t?.opened)return;let i=n?.challenge??r,a=n?.channelId??t.channelId;if(!i)throw Error(`Cannot close session: no challenge available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or make a request first to receive a fresh 402 challenge.`);if(!a)throw Error(`Cannot close session: no channel ID available. The session may not have been fully opened.`);return{challenge:i,channel:t,channelId:a}}function eD(e){let{cumulativeAmount:t,spent:n}=e;return t>n?t:n}function tD(e){let{cumulativeAmount:t,readySpent:n,spent:r}=e;if(!sE(n))throw Error(`close-ready spent is not a uint96 amount`);if(n<r)throw Error(`close-ready spent is below locally confirmed spend`);if(n>eD({cumulativeAmount:t,spent:r}))throw Error(`close-ready spent exceeds local voucher state`)}function nD(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:i=0n,receipt:a}=e,o=cE(r),s=cE(a.spent);return o===void 0||s===void 0||!sE(i)?!1:!!a.txHash&&a.challengeId===t&&a.channelId===n&&a.acceptedCumulative===r&&s>=i&&s<=o}function rD(e){return zE({challengeId:e.challengeId,channelId:e.entry.channelId,descriptor:e.entry.descriptor,acceptedCumulative:e.entry.cumulativeAmount.toString(),deposit:e.entry.deposit.toString(),spent:e.spent,units:e.units})}function iD(){return{channel:null,lastChallenge:null,lastUrl:null,spent:0n,socketSession:null,state:fD}}function aD(e){let{maxVoucherCumulative:t,receipt:n,runtime:r}=e;r.spent=JE({channel:r.channel,maxVoucherCumulative:t,receipt:n,spent:r.spent}),n&&r.channel?.channelId===n.channelId&&VE(r,{type:`receiptAccepted`,receipt:n,entry:r.channel})}function oD(e,t){return zE({challengeId:e.challengeId,channelId:e.channelId,descriptor:t.descriptor,acceptedCumulative:e.acceptedCumulative,deposit:t.deposit.toString(),spent:e.spent,units:e.units??0})}function sD(e){let{challengeId:t,channelId:n,closeReadyReceipt:r,cumulativeAmount:i,deliveredChunks:a=0n,socketChallengeId:o,socketChannelId:s,spent:c,tickCost:l=0n}=e;if(c>i)throw Error(`locally confirmed spend exceeds local voucher state`);if(r&&r.challengeId===t&&r.channelId===n){let e=cE(r.spent);if(e===void 0)throw Error(`close-ready spent is not a uint96 amount`);return e>c?e:c}if(o===t&&s===n&&l>0n){let e=a*l,t=c>e?c:e;return t>i?i:t}return i}function cD(e){let{channel:t,channelId:n,challengeId:r,cumulativeAmount:i,spent:a,state:o}=e;if(!(!t||t.channelId!==n)&&(t.cumulativeAmount=i,r))return BE(o,{type:`activated`,challengeId:r,entry:t,spent:a.toString(),units:o.status===`active`?o.units:0}).state}function lD(e){return{channel:e.channel===null?null:{entry:e.channel,cumulativeAmount:e.channel.cumulativeAmount,deposit:e.channel.deposit,opened:e.channel.opened},spent:e.spent,state:e.state}}function uD(e,t){return e.channel?(e.channel.entry.cumulativeAmount=e.channel.cumulativeAmount,e.channel.entry.deposit=e.channel.deposit,e.channel.entry.opened=e.channel.opened,{channel:e.channel.entry,spent:e.spent,state:e.state}):(t&&(t.opened=!1),{channel:null,spent:e.spent,state:e.state})}async function dD(e){let{activeSocket:t,currentSocket:n,target:r}=e,i=n.closeReadyReceipt??await(async()=>(t.send(CE()),e.waitForCloseReady()))(),a=BigInt(i.spent);tD({cumulativeAmount:r.channel.cumulativeAmount,readySpent:a,spent:e.spent});let o=await e.createSessionCredential(r.challenge,{action:`close`,channelId:r.channelId,descriptor:r.channel.descriptor,cumulativeAmountRaw:a.toString()}),s=a.toString();n.expectedCloseAmount=s;try{let i=e.waitForReceipt(e=>nD({challengeId:r.challenge.id,channelId:r.channelId,expectedCloseAmount:s,minimumSpent:a,receipt:e}));t.send(SE(o));let c=await i;return t.close(),n.closeReadyReceipt=null,c}finally{n.expectedCloseAmount=null}}var fD,pD=F((()=>{kE(),RE(),fD={status:`idle`}}));function mD(e){let t=new Map,n=!1,r=[],i=e.readyState,a=(e,n,i)=>{let a=t.get(e);if(a||(a=new Set,t.set(e,a)),a.add({once:typeof i==`object`&&i.once===!0,value:n}),e===`message`&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},o=(e,n)=>{let r=t.get(e);if(r)for(let e of r)e.value===n&&r.delete(e)};function s(e,a){if(a.type===`close`){if(n)return;n=!0,i=ZD.CLOSED,r=null}if(a.type===`open`&&(i=ZD.OPEN),a.type===`message`&&r){r.push(a);return}switch(a.type){case`close`:l.onclose?.(a);break;case`error`:l.onerror?.(a);break;case`message`:l.onmessage?.(a);break;case`open`:l.onopen?.(a)}let o=t.get(e);if(o)for(let e of Array.from(o))typeof e.value==`function`?e.value(a):e.value.handleEvent(a),e.once&&o.delete(e)}let c=null,l={addEventListener:a,close(t,n){e.close(t,n)},get bufferedAmount(){return e.bufferedAmount},get extensions(){return e.extensions},on(e,t){a(e,t)},onclose:null,onerror:null,get onmessage(){return c},set onmessage(e){if(c=e,e&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},onopen:null,off(e,t){o(e,t)},get protocol(){return e.protocol},get readyState(){return i},removeEventListener:o,send(t){e.send(t)},get url(){return e.url}};return{emit:s,socket:l}}function hD(e){return{acceptedCumulative:BigInt(e.acceptedCumulative),deposit:BigInt(e.deposit),requiredCumulative:BigInt(e.requiredCumulative)}}function gD(e){let{amount:t,assertVoucherWithinLocalLimit:n,channel:r,decimals:i,lastChallenge:a,lastUrl:o}=e;if(!r?.opened)throw Error(`Cannot top up session: no open channel.`);if(!a)throw Error(`Cannot top up session: no challenge available. Make a request first.`);if(!o)throw Error(`Cannot top up session: no URL available. Call fetch(), sse(), or ws() first.`);let s=YE(t,i);if(s<=0n)throw Error(`Top-up amount must be greater than zero.`);return n(r.cumulativeAmount+s),{additionalDeposit:s,challenge:a,channelId:r.channelId,input:o}}function _D(e){let{additionalDeposit:t,channel:n,channelId:r,challengeId:i,currentState:a,knownDeposit:o,receipt:s,spent:c}=e;if(n?.channelId!==r)return;let l=o!==void 0&&o>n.deposit?o:n.deposit,u={...n,deposit:l+t};return s?{channel:u,state:oD(s,u)}:i?{channel:u,state:rD({challengeId:i,entry:u,spent:c.toString(),units:a.status===`active`?a.units:0})}:{channel:u}}async function vD(e){if(e.event.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`channel-mismatch`};let t=hD(e.event);e.assertVoucherWithinLocalLimit(t.requiredCumulative),await e.topUpIfNeeded({challenge:e.challenge,input:e.input,channelId:e.expectedChannelId,deposit:t.deposit,requiredCumulative:t.requiredCumulative});let n=e.getChannel();if(!n||n.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`missing-channel`};let r=n.cumulativeAmount>t.requiredCumulative?n.cumulativeAmount:lE(t.requiredCumulative);return{status:`ready`,context:{action:`voucher`,channelId:e.expectedChannelId,descriptor:n.descriptor,cumulativeAmountRaw:r.toString()}}}function yD(e){return e.method===Dx.tempo&&e.intent===Ox.session}function bD(e){return yD(e)&&Tx(e.request.methodDetails,kx.sessionProtocol)===Ax.v2}function xD(e){return Tx(e.request.methodDetails,kx.sessionSnapshot)}function SD(e,t,n){let r=e instanceof Request?e.headers:void 0;return{...t,headers:{...yw(r),...yw(t?.headers),[q.authorization]:n}}}function CD(e){try{let t=typeof location>`u`?void 0:location.href,n=e instanceof Request?new URL(e.url):e instanceof URL?new URL(e):new URL(String(e),t);return n.hash=``,n}catch{return e}}function wD(e){let t=new URL(e.toString());return t.protocol===`ws:`&&(t.protocol=`http:`),t.protocol===`wss:`&&(t.protocol=`https:`),t}async function TD(e){let t=await e.text().catch(()=>``);if(!t)return``;if(!e.headers.get(`Content-Type`)?.includes(`application/problem+json`))return t;try{return JSON.parse(t).detail??t}catch{return t}}async function ED(e){let{channel:t,channelId:n}=e;if(!t?.descriptor||t.channelId!==n)throw Error(`Cannot top up session: no local channel descriptor available.`);let r=await DD({challenge:e.challenge,context:{action:`topUp`,channelId:n,descriptor:t.descriptor,additionalDepositRaw:e.additionalDeposit.toString()},createSessionCredential:e.createSessionCredential,fetch:e.fetch,input:e.input});if(!r.ok)throw Error(`Top-up POST failed with status ${r.status}`);let i=r.headers.get(q.paymentReceipt);return i?vE(i):void 0}async function DD(e){let t=async t=>e.fetch(CD(e.input),{method:`POST`,headers:{[q.authorization]:await e.createSessionCredential(t,e.context)}}),n=await t(e.challenge);if(n.status!==402)return n;let r=iS(n).find(bD);return r?t(r):n}async function OD(e){let t=kD({channel:e.getChannel(),response:e.response});if(!t)return;let{channel:n,challenge:r,snapshot:i}=t;e.setChallenge(r);let a=BigInt(i.requiredCumulative),o=n.cumulativeAmount;await e.topUpIfNeeded({challenge:r,input:e.input,channelId:i.channelId,deposit:BigInt(i.deposit),requiredCumulative:a});let s=e.getChannel();if(!s?.descriptor||s.channelId!==i.channelId)return;let c=s.cumulativeAmount>a?s.cumulativeAmount:a,l=()=>e.restoreCumulative(i.channelId,o),u;try{let t=await e.createSessionCredential(r,{action:`voucher`,channelId:i.channelId,descriptor:s.descriptor,cumulativeAmountRaw:c.toString()});u=await e.fetch(e.input,SD(e.input,e.init,t))}catch(e){throw await l(),e}return!u.ok&&!u.headers.get(q.paymentReceipt)&&await l(),u}function kD(e){let t=iS(e.response).find(bD);if(!t)return;let n=xD(t);if(!n)return;let{channel:r}=e;if(!(!r?.descriptor||r.channelId!==n.channelId))return{channel:r,challenge:t,snapshot:n}}async function AD(e){if(!e.lastUrl)throw Error(`Cannot close session: no URL available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or call fetch()/sse() before close().`);let t=e.target.challenge,n=e.signedCloseAmount,r=async(r,i=!1)=>{t=r,n=(i?e.resolveSignedCloseAmount?.(r):void 0)??e.signedCloseAmount;let a=await e.createSessionCredential(r,{action:`close`,channelId:e.target.channelId,descriptor:e.target.channel.descriptor,cumulativeAmountRaw:n});return e.fetch(e.lastUrl,{method:`POST`,headers:{[q.authorization]:a}})},i=await r(e.target.challenge);if(i.status===402){let t=iS(i).find(bD);t&&(e.setChallenge?.(t),i=await r(t,!0))}if(!i.ok){let e=await TD(i),t=i.headers.get(q.wwwAuthenticate)??``;throw Error(`Close request failed with status ${i.status}${e?`: ${e}`:``}${t?` [${q.wwwAuthenticate}: ${t}]`:``}`)}let a=i.headers.get(q.paymentReceipt);if(!a)return;let o=vE(a);if(!o.txHash||!A.validate(o.txHash,{strict:!0})||A.size(o.txHash)!==32||!nD({challengeId:t.id,channelId:e.target.channelId,expectedCloseAmount:n,minimumSpent:e.getMinimumSpent?.()??0n,receipt:o}))throw Error(`Session close response included a mismatched payment receipt.`);return o}async function jD(e,t,n){let{onReceipt:r,signal:i,...a}=t??{},o={...a,headers:{...yw(a.headers),Accept:`text/event-stream`},...i?{signal:i}:{}},s=await n.doFetch(e,o);return!yE(s)&&n.getChannel()?.opened&&(s=await n.doFetch(e,o)),MD(e,s,{onReceipt:r,signal:i},n)}function MD(e,t,n,r){if(!yE(t))throw Error(`SSE response is not an event stream.`);if(!t.body)throw Error(`Response has no body.`);let i=r.getChallenge();return ND({onNeedVoucher:t=>RD({challenge:i,driver:r,input:e},t),onReceipt(e){r.acceptReceipt(e),n?.onReceipt?.(e)},response:t,signal:n?.signal})}async function*ND(e){for await(let t of PD(e))t.data!==void 0&&(yield t.data)}async function*PD(e){if(!e.response.body)throw Error(`Response has no body.`);let t=e.response.body.getReader(),n=new TextDecoder,r=``,i=!1,a=()=>{t.cancel(e.signal?.reason).catch(()=>void 0)};e.signal?.addEventListener(`abort`,a,{once:!0}),e.signal?.aborted&&a();try{for(;!e.signal?.aborted;){let{done:a,value:o}=await t.read();for(a?(i=!0,r+=n.decode()):r+=n.decode(o,{stream:!0});;){let t=FD(r,a);if(!t)break;let n=t.index+t.length,i=r.slice(0,t.index),o=r.slice(0,n);if(r=r.slice(n),!i.trim())continue;let s=bE(i.replace(/\r\n|\r/g,`
227
227
  `));if(!s){yield{raw:o};continue}switch(s.type){case`message`:yield{data:s.data,raw:o};break;case`payment-need-voucher`:await e.onNeedVoucher(s.data);break;case`payment-receipt`:e.onReceipt(s.data)}}if(a)break}}finally{e.signal?.removeEventListener(`abort`,a),i||await t.cancel().catch(()=>void 0),t.releaseLock()}}function FD(e,t){for(let n=0;n<e.length;n++){let r=ID(e,n,t);if(!r)continue;let i=ID(e,n+r,t);if(i)return{index:n,length:r+i};n+=r-1}}function ID(e,t,n){return e[t]===`
@@ -244,7 +244,7 @@ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\
244
244
  `)){let e=t.trim();if(e===`[[keys]]`){r?.wallet_address&&n.push(r),r={wallet_type:`local`,wallet_address:``,chain_id:0};continue}if(!r)continue;let i=e.match(/^(\w+)\s*=\s*"?([^"]*)"?$/);if(!i)continue;let[,a,o]=i;a===`wallet_type`?r.wallet_type=o:a===`wallet_address`?r.wallet_address=o:a===`chain_id`&&(r.chain_id=Number.parseInt(o,10))}return r?.wallet_address&&n.push(r),n}catch{return[]}}function jP(e){let t=AP();if(t.length===0)return;let n=e.slice(6);if(n==="default"||n===``)return t[0];let r=Number.parseInt(n,10);if(!Number.isNaN(r)&&r>=0&&r<t.length)return t[r]}function MP(){if(BP!==void 0)return BP;try{m.execFileSync(`which`,[`tempo`],{stdio:`ignore`}),BP=!0}catch{BP=!1}return BP}async function NP(e){return new Promise((t,n)=>{m.execFile(`tempo`,[`mpp`,`sign`,`--challenge`,e],(e,r,i)=>{if(e){let t=i?.trim()||e.message;n(Error(`tempo mpp sign failed: ${t}`));return}let a=r.trim();if(!a){n(Error(`tempo mpp sign returned empty output`));return}t(a)})})}function PP(){let e=BO();if(gO(e.get())&&!MP()&&b.platform()===`darwin`)try{let t=m.execFileSync(`security`,[`dump-keychain`],{encoding:`utf-8`}),n=[];for(let e of t.split(`keychain:`)){let t=e.match(/"svce"<blob>="([^"]*)"/),r=e.match(/"acct"<blob>="([^"]*)"/);t?.[1]===FP&&r?.[1]&&n.push(r[1])}if(n.length>0)return e.set(n[0]),n[0]}catch{}}var FP,IP,LP,RP,zP,BP,VP=F((()=>{wx(),rT(),jx(),ZS(),sP(),kE(),$j(),JO(),PO(),Gk(),FP=`mppx`,IP=p.union([p.boolean(),p.literal(`true`).transform(()=>!0),p.literal(`false`).transform(()=>!1)]),LP=p.object({allowCustomEscrow:p.optional(IP),autoSwap:p.optional(IP),channel:p.optional(p.coerce.string()),deposit:p.optional(p.union([p.string(),p.number()])),payWith:p.optional(p.string()),slippage:p.optional(p.coerce.number()),tokenIn:p.optional(p.string())}),RP=[`allowCustomEscrow`,`autoSwap`,`channel`,`deposit`,`payWith`,`slippage`,`tokenIn`],zP=[`payable`,`unknownBalance`,`insufficientBalance`,`unsupported`]}));CS(),JO(),Gk();const HP=[...Object.entries(QO),...Object.entries($O),...Object.entries(ek),...Object.entries(tk)];function UP(){return Wk({method:`evm`,supports:WP,async setup({challenge:e,options:t}){let n=e.request,r=n.network?GP(ck(n.network)):void 0,i=n.network&&n.asset?HP.find(([,e])=>ok(e,n.asset,n.network)):void 0,a=n.extra?.name,o=n.extra?.version,s=n.asset&&n.network&&typeof a==`string`&&typeof o==`string`?XO({address:n.asset,decimals:i?.[1].decimals??6,network:n.network,transfer:{name:a,type:`eip3009`,version:o}}):void 0,c=await GO(t.account);return{explorerUrl:r?.blockExplorers?.default?.url,methods:[...Uk({account:c,...s&&{currencies:[s]}})],tokenDecimals:i?.[1].decimals??6,tokenSymbol:i?.[0]??``}}})}function WP(e){if(!xS(e))return!1;let t=e.request,n=t.extra,r=n?.assetTransferMethod;return t.scheme===`exact`&&typeof t.asset==`string`&&typeof t.network==`string`&&typeof n?.name==`string`&&typeof n?.version==`string`&&(r===void 0||r===`eip3009`)}function GP(e){return Object.values(Ie).find(t=>t.id===e)}pS(),US(),VP();const KP=[dP(),tA(),Kk(),UP()];async function qP(e,t,n){let r=n;for(let n of t??[]){let t=await n.preparePayment?.({challenge:e,...r===void 0?{}:{credentialContext:r}});t&&`credentialContext`in t&&(r=t.credentialContext)}return r}function JP(e,t){let n=t?.plugins?.find(t=>QP(t,e));if(n)return{plugin:n};let r=ZP(t)?.filter(t=>t.name===e.method&&t.intent===e.intent),i=r?.find(t=>t.canHandleChallenge?.({challenge:e})??!0);if(i)return{method:i};if(r?.length)return{};let a=KP.find(t=>QP(t,e));return a?{plugin:a}:{}}function YP(e,t){let n=ZP(t);if(n?.length){let r=OS(e,n,TS(n,t?.paymentPreferences).entries);if(r){let e=t?.plugins?.find(e=>QP(e,r.challenge));return{challenge:r.challenge,...e?{plugin:e}:{method:r.method}}}return}for(let n of e){let e=JP(n,t);if(e.plugin||e.method)return{challenge:n,...e}}}function XP(e){let t=ZP(e);if(t?.length)return TS(t,e?.paymentPreferences).header}function ZP(e){return Array.isArray(e?.methods)?e.methods.flat():void 0}function QP(e,t){return e.supports?e.supports(t):e.method===t.method}async function $P(e){let t=eF(e);if(!t)return;let n=await import(t);return{config:n.default??n,path:t}}function eF(e){if(e){let n=c.resolve(e);return t.existsSync(n)?n:void 0}let n=process.env.MPPX_CONFIG?.trim();if(n){let e=c.resolve(n);return t.existsSync(e)?e:void 0}}function tF(e,t){function n(t){let n={...t.request};if(t.method===`tempo`&&t.intent===`session`){let e={...n.methodDetails};delete e.sessionSnapshot,Object.keys(e).length?n.methodDetails=e:delete n.methodDetails}return Yx({...t,request:n,id:e.id,expires:e.expires})}if(n(t)!==n(e))throw Error(`Payment request changed on retry. Run the command again to approve the new payment.`)}VP(),pS(),mM(),vN(),ON(),eO();function nF(e){return e??globalThis.fetch.bind(globalThis)}function rF(e,t){let n=e.request.methodDetails?.chainId;if(n!==void 0&&n!==t.chainId)throw Error(`Close challenge changed the session chain.`);if(typeof e.request.recipient!=`string`||e.request.recipient.toLowerCase()!==t.descriptor.payee.toLowerCase())throw Error(`Close challenge changed the session payee.`);if(typeof e.request.currency!=`string`||e.request.currency.toLowerCase()!==t.descriptor.token.toLowerCase())throw Error(`Close challenge changed the session token.`);if(sM(e,t.escrow).toLowerCase()!==t.escrow.toLowerCase())throw Error(`Close challenge changed the session escrow.`);let r=xD(e);if(r&&r.channelId.toLowerCase()!==t.channelId.toLowerCase())throw Error(`Close challenge changed the session channel.`)}async function iF(e){rF(e.challenge,e.channel);let t=nF(e.fetch),n,r=async(r,i)=>{n&&=(await e.onChallenge?.(n),void 0);let a=await t(r,i);if(a.status!==402)return a;let o=iS(a).find(yD);if(!o)throw Error(`Refreshed close response did not include tempo/session.`);return rF(o,e.channel),n=o,a},i=DN({...e.manager,bootstrap:!1,escrow:e.channel.escrow,fetch:r});gN(i).rehydrate(e);let a=await i.close();if(!a)throw Error(`Session close response did not include a payment receipt.`);return{manager:i,receipt:a}}pS(),mM(),bM(),eO(),Lj(),qx();var aF=class extends Error{name=`SessionStateError`;code=`SESSION_STATE_INVALID`;file;constructor(e,t={}){super(e,t.cause===void 0?void 0:{cause:t.cause}),this.file=t.file}},oF=class extends Error{name=`SessionBusyError`;code=`SESSION_BUSY`;exitCode=75;scope;owner;constructor(e,t){super(`Session scope is busy in process ${t.pid} on ${t.hostname}.`),this.scope=e,this.owner=t}};const sF=J.object({channelId:Ux(),cumulativeAmount:J.string(),deposit:J.string(),descriptor:J.object({payer:Hx(),payee:Hx(),operator:Hx(),token:Hx(),salt:Ux(),authorizedSigner:Hx(),expiringNonceHash:Ux()}),escrow:Hx(),chainId:J.number(),opened:J.boolean()}),cF=J.object({name:J.optional(J.string()),address:Hx()}),lF=J.object({method:J.literal(`tempo`),intent:J.literal(`session`),status:J.literal(`success`),timestamp:J.string(),reference:J.string(),challengeId:J.string(),channelId:Ux(),acceptedCumulative:J.string(),spent:J.string(),units:J.optional(J.number()),txHash:J.optional(Ux())}),uF=J.object({version:J.literal(1),method:J.literal(`tempo`),intent:J.literal(`session`),status:J.enum([`opening`,`open`,`closing`,`stale`]),channel:sF,account:cF,endpoint:J.string(),challenge:fS,receipt:J.optional(lF),spent:J.string(),units:J.number(),createdAt:J.string(),updatedAt:J.string()}),dF=J.object({version:J.literal(1),channelId:Ux()}),fF=J.object({version:J.literal(1),scope:J.string(),hostname:J.string(),pid:J.number(),token:J.string(),createdAt:J.string()});function pF(e,t,n,r){let i=e.safeParse(t);if(!i.success)throw Z(n,r,i.error);return i.data}function mF(e){let t=wF(e);return[t.payer,t.payee,t.token,t.escrow,t.chainId].join(`:`)}function hF(e){return{payer:e.descriptor.payer,payee:e.descriptor.payee,token:e.descriptor.token,escrow:e.escrow,chainId:e.chainId}}function gF(e={}){let t=e.stateRoot??vF(),n={root:t,channels:c.join(t,`channels`),locks:c.join(t,`locks`),preferred:c.join(t,`preferred`)},r=e.hostname??b.hostname(),i=e.pid??process.pid,a=e.now??(()=>new Date),o=e.isProcessAlive??XF;async function s(){for(let e of[n.root,n.channels,n.locks,n.preferred])await C.mkdir(e,{recursive:!0,mode:448}),await C.chmod(e,448)}async function l(e){let t=SF(e),r=yF(n,t),i=await VF(r);if(i===void 0)return;let a=MF(i,r);if(a.channel.channelId.toLowerCase()!==t)throw Z(r,`Session filename does not match its channel ID.`);return NF(a)}async function u(){let e;try{e=await C.readdir(n.channels,{withFileTypes:!0})}catch(e){if(QF(e,`ENOENT`))return[];throw Z(n.channels,`Unable to list managed sessions.`,e)}let t=[];for(let n of e){if(!n.isFile()||n.name.includes(`.tmp-`)||!n.name.endsWith(`.json`))continue;let e=n.name.slice(0,-5);SF(e);let r=await l(e);r&&t.push(r)}return t.sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}async function d(e){await s();let t=OF(e.channel),r=SF(t.channelId),i=yF(n,r),o=await VF(i),c=o===void 0?void 0:MF(o,i);c&&PF(c,e,i);let l=AF(e.challenge,i);IF(l,t,i);let u=e.receipt?jF(e.receipt,t.channelId,i):void 0,d=c?yM(c.channel):void 0,f=BF(t.cumulativeAmount,d?.cumulativeAmount??0n),p=BF(e.spent??0n,u?BigInt(u.spent):0n,c?BigInt(c.spent):0n);if(p>f)throw Z(i,`Session spend exceeds the locally authorized cumulative amount.`);let m=kF(vM({...t,cumulativeAmount:f}),i),h=zF(c?.updatedAt,a(),i),g=RF(c?.receipt,u),_=DF(e.account,i),v=MF({version:1,method:`tempo`,intent:`session`,status:e.status,channel:m,account:{..._.name===void 0?c?.account.name===void 0?{}:{name:c.account.name}:{name:_.name},address:_.address},endpoint:EF(e.endpoint,i),challenge:l,...g!==void 0&&{receipt:g},spent:p.toString(),units:Math.max(c?.units??0,e.units??0,u?.units??0),createdAt:c?.createdAt??h,updatedAt:h},i);return await HF(i,v),NF(v)}async function f(e){let t=xF(n,e),r=await VF(t);if(r===void 0)return;let{channelId:i}=pF(dF,r,t,`Preferred session is invalid.`),a=await l(i);if(!a)throw Z(t,`Preferred session ${i} does not exist.`);return LF(a.channel,e,t),i}async function p(e,t){let r=SF(t),i=await l(r),a=xF(n,e);if(!i)throw Z(a,`Session ${r} does not exist.`);LF(i.channel,e,a),await HF(a,{version:1,channelId:r})}async function m(e,t){let r=xF(n,e),i=t===void 0?void 0:SF(t),a=await VF(r);if(a===void 0)return;let o=pF(dF,a,r,`Preferred session is invalid.`).channelId;i&&o.toLowerCase()!==i||await JF(r,`Unable to clear preferred session.`)}async function h(e){let t=SF(e),r=await l(t);r&&(await m(hF(r.channel),t),await JF(yF(n,t),`Unable to remove session.`))}async function g(e){await s();let t=bF(n,e);for(let n=0;n<3;n++){let n={version:1,scope:e,hostname:r,pid:i,token:_(),createdAt:a().toISOString()};try{if(await UF(t,n),await KF(GF(t))){await qF(t,n);continue}return{async release(){await qF(t,n)}}}catch(e){if(!QF(e,`EEXIST`))throw e}let s=await VF(t);if(s===void 0)continue;let c=pF(fF,s,t,`Session lock is invalid.`);if(c.scope!==e)throw Z(t,`Session lock scope is invalid.`);if(c.hostname!==r||o(c.pid))throw new oF(e,c);await WF(t,c)}let c=await VF(t);throw c===void 0?Z(t,`Unable to acquire session lock.`):new oF(e,pF(fF,c,t,`Session lock is invalid.`))}async function v(e){return g(mF(e))}return{root:t,get:l,list:u,upsert:d,remove:h,getPreferred:f,setPreferred:p,clearPreferred:m,acquire:v}}function _F(e,t){let n=TF(t.scope),r=t.selection===`auto`||t.selection===`new`?void 0:SF(t.selection);function i(e){if(e.toLowerCase()!==n)throw new aF(`Session manager requested an unexpected payment scope.`)}async function a(n=!0){if(t.selection===`new`&&!r)return;let i=r??await e.getPreferred(t.scope);if(!i)return;let a=await e.get(i);if(!a)throw new aF(`Session ${i} does not exist.`);if(LF(a.channel,t.scope),!(n&&(a.status!==`open`||!a.channel.opened)))return r=i,a}return{async get(e){return i(e),(await a())?.channel},async set(n){if(i(gM(n)),LF(n,t.scope),r&&r.toLowerCase()!==n.channelId.toLowerCase())throw new aF(`Session manager selected ${r}, but attempted to store ${n.channelId}.`);r||t.onNewChannel?.(n);let a=await e.upsert({...t.context(),channel:n});r=a.channel.channelId,await e.setPreferred(t.scope,a.channel.channelId)},async delete(n){i(n);let o=await a(!1);if(!o)return;let s=t.context();await e.upsert({...o,...s,status:s.status===`closing`?`closing`:`stale`,channel:o.channel,spent:s.spent??o.spent,units:s.units??o.units}),s.status!==`closing`&&await e.clearPreferred(t.scope,o.channel.channelId),r=void 0}}}function vF(){let e=process.env.XDG_STATE_HOME||c.join(b.homedir(),`.local`,`state`);return c.join(e,`mppx`,`sessions`,`v1`)}function yF(e,t){return c.join(e.channels,`${t}.json`)}function bF(e,t){let n=g(`sha256`).update(t).digest(`hex`);return c.join(e.locks,`${n}.lock`)}function xF(e,t){let n=g(`sha256`).update(mF(t)).digest(`hex`);return c.join(e.preferred,`${n}.json`)}function SF(e){return pF(Ux(),e,void 0,`Invalid session channel ID: ${e}.`).toLowerCase()}function CF(e,t,n){return pF(Hx(),e,n,`Invalid ${t}.`).toLowerCase()}function wF(e){if(!Number.isSafeInteger(e.chainId)||e.chainId<0)throw new aF(`Invalid session chain ID.`);return{payer:CF(e.payer,`session payer`),payee:CF(e.payee,`session payee`),token:CF(e.token,`session token`),escrow:CF(e.escrow,`session escrow`),chainId:e.chainId}}function TF(e){let t=wF(e);return[t.payee,t.token,t.escrow,t.chainId].join(`:`)}function EF(e,t){if(typeof e!=`string`)throw Z(t,`Session endpoint is invalid.`);let n;try{n=new URL(e)}catch(e){throw Z(t,`Session endpoint is invalid.`,e)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw Z(t,`Session endpoint must use HTTP or HTTPS.`);if(n.username||n.password)throw Z(t,`Session endpoint must not contain credentials.`);let r=e.indexOf(`#`);return r===-1?e:e.slice(0,r)}function DF(e,t){return pF(cF,e,t,`Session account is invalid.`)}function OF(e){return yM(kF(vM(e)))}function kF(e,t){return pF(sF,e,t,`Stored session channel is invalid.`)}function AF(e,t){let n=fS.safeParse(e);if(!n.success||!yD(n.data))throw Z(t,`Stored session challenge is invalid.`);return n.data}function jF(e,t,n){let r=pF(lF,e,n,`Stored session receipt is invalid.`);if(r.channelId!==t.toLowerCase())throw Z(n,`Stored session receipt has a different channel ID.`);if(r.reference.toLowerCase()!==t.toLowerCase())throw Z(n,`Stored session receipt has a different reference.`);if(BigInt(r.spent)>BigInt(r.acceptedCumulative))throw Z(n,`Stored session receipt spend exceeds its accepted amount.`);return r}function MF(e,t){let n=pF(uF,e,t,`Stored session is invalid.`),{receipt:r,...i}=n,a=n.channel,o=n.account;if(o.address.toLowerCase()!==a.descriptor.payer.toLowerCase())throw Z(t,`Stored session account does not match the channel payer.`);let s=r?jF(r,a.channelId,t):void 0,c=n.spent,l=BigInt(a.cumulativeAmount);if(BigInt(c)>l)throw Z(t,`Stored session spend exceeds its cumulative authorization.`);if(s&&BigInt(s.acceptedCumulative)>l)throw Z(t,`Stored receipt exceeds the cumulative authorization.`);if(Date.parse(n.updatedAt)<Date.parse(n.createdAt))throw Z(t,`Stored session timestamps are not monotonic.`);let u=EF(n.endpoint,t);if(u!==n.endpoint)throw Z(t,`Stored session endpoint contains a fragment.`);let d=AF(n.challenge,t);return IF(d,yM(a),t),{...i,account:o,channel:a,endpoint:u,challenge:d,...s&&{receipt:s}}}function NF(e){return{version:1,status:e.status,channel:yM(e.channel),account:e.account,endpoint:e.endpoint,challenge:e.challenge,...e.receipt&&{receipt:e.receipt},spent:BigInt(e.spent),units:e.units,createdAt:e.createdAt,updatedAt:e.updatedAt}}function PF(e,t,n){let r=OF(t.channel),i=DF(t.account,n),a=yM(e.channel);if(JSON.stringify(FF(r))!==JSON.stringify(FF(a)))throw Z(n,`Session update changed immutable channel identity.`);if(i.address.toLowerCase()!==e.account.address.toLowerCase())throw Z(n,`Session update changed the payer account.`)}function FF(e){return{channelId:e.channelId.toLowerCase(),descriptor:Object.fromEntries(Object.entries(e.descriptor).map(([e,t])=>[e,typeof t==`string`?t.toLowerCase():t])),escrow:e.escrow.toLowerCase(),chainId:e.chainId}}function IF(e,t,n){if(Nj({...t.descriptor,chainId:t.chainId,escrow:t.escrow}).toLowerCase()!==t.channelId.toLowerCase())throw Z(n,`Session channel ID does not match its descriptor.`);let r=CF(e.request.recipient,`challenge recipient`,n),i=CF(e.request.currency,`challenge currency`,n);if(r!==t.descriptor.payee.toLowerCase())throw Z(n,`Session challenge payee does not match the channel.`);if(i!==t.descriptor.token.toLowerCase())throw Z(n,`Session challenge token does not match the channel.`);if(sM(e,t.escrow).toLowerCase()!==t.escrow.toLowerCase())throw Z(n,`Session challenge escrow does not match the channel.`);if(ZF(e.request.methodDetails)){let r=e.request.methodDetails;if(r.chainId!==void 0&&r.chainId!==t.chainId)throw Z(n,`Session challenge chain does not match the channel.`)}}function LF(e,t,n){let r=wF(t);if(e.descriptor.payer.toLowerCase()!==r.payer||e.descriptor.payee.toLowerCase()!==r.payee||e.descriptor.token.toLowerCase()!==r.token||e.escrow.toLowerCase()!==r.escrow||e.chainId!==r.chainId)throw Z(n,`Session channel does not match the selected payment scope.`)}function RF(e,t){return e?t&&Date.parse(t.timestamp)>=Date.parse(e.timestamp)?t:e:t}function zF(e,t,n){if(!Number.isFinite(t.getTime()))throw Z(n,`Session clock is invalid.`);let r=t.toISOString();return!e||Date.parse(r)>=Date.parse(e)?r:e}function BF(...e){return e.reduce((e,t)=>t>e?t:e,0n)}async function VF(e){let t;try{t=await C.readFile(e,`utf8`)}catch(t){if(QF(t,`ENOENT`))return;throw Z(e,`Unable to read session state.`,t)}try{return JSON.parse(t)}catch(t){throw Z(e,`Session state contains invalid JSON.`,t)}}async function HF(e,t){await C.mkdir(c.dirname(e),{recursive:!0,mode:448}),await C.chmod(c.dirname(e),448);let n=`${e}.tmp-${process.pid}-${_()}`,r;try{r=await C.open(n,`wx`,384),await r.writeFile(`${JSON.stringify(t,null,2)}\n`,`utf8`),await r.sync(),await r.close(),r=void 0,await C.rename(n,e),await C.chmod(e,384),await YF(c.dirname(e))}catch(t){throw await r?.close().catch(()=>void 0),await C.unlink(n).catch(()=>void 0),t instanceof aF?t:Z(e,`Unable to write session state.`,t)}}async function UF(e,t){let n;try{n=await C.open(e,`wx`,384),await n.writeFile(`${JSON.stringify(t)}\n`,`utf8`),await n.sync(),await n.close(),n=void 0,await YF(c.dirname(e))}catch(t){throw await n?.close().catch(()=>void 0),n&&await C.unlink(e).catch(()=>void 0),t}}async function WF(e,t){let n=GF(e);try{await C.link(e,n)}catch(t){if(QF(t,`EEXIST`)||QF(t,`ENOENT`))return;throw Z(e,`Unable to claim dead lock.`,t)}try{let r=await VF(n);if(r===void 0||pF(fF,r,n,`Session lock is invalid.`).token!==t.token)return;await JF(e,`Unable to reclaim dead lock.`)}finally{await JF(n,`Unable to release dead lock claim.`)}}function GF(e){return`${e}.reclaim`}async function KF(e){try{return await C.access(e),!0}catch(t){if(QF(t,`ENOENT`))return!1;throw Z(e,`Unable to inspect session lock.`,t)}}async function qF(e,t){let n=await VF(e);n!==void 0&&pF(fF,n,e,`Session lock is invalid.`).token===t.token&&await JF(e,`Unable to release session lock.`)}async function JF(e,t){try{await C.unlink(e),await YF(c.dirname(e))}catch(n){if(!QF(n,`ENOENT`))throw Z(e,t,n)}}async function YF(e){let t=await C.open(e,`r`);try{await t.sync()}finally{await t.close()}}function XF(e){try{return process.kill(e,0),!0}catch(e){if(QF(e,`ESRCH`))return!1;if(QF(e,`EPERM`))return!0;throw e}}function ZF(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function QF(e,t){return e instanceof Error&&`code`in e&&e.code===t}function Z(e,t,n){return new aF(t,{...n!==void 0&&{cause:n},file:e})}wx(),rT(),cN(),TM(),Lj(),JO(),PO();const $F=p.object({status:p.enum([`opening`,`open`,`closing`,`stale`]),channelId:p.string(),account:p.string().optional(),payer:p.string(),payee:p.string(),authorizedSigner:p.string(),token:p.string(),escrow:p.string(),chainId:p.number(),cumulativeAmount:p.string(),confirmedSpend:p.string(),deposit:p.string(),units:p.number(),resourceUrl:p.string(),createdAt:p.string(),updatedAt:p.string()}),eI=p.object({channelId:p.string(),status:p.enum([`closed`,`already-closed`]),spent:p.string(),txHash:p.string().optional()}),tI=p.object({closed:p.array(eI),failed:p.array(p.object({channelId:p.string(),message:p.string()}))});function nI(e){return e===`mainnet`?ve.id:ye.id}function rI(e){if(e===ve.id)return`mainnet`;if(e===ye.id)return`testnet`}function iI(e){let t={};for(let n of e??[]){let e=n.indexOf(`:`);if(e===-1)throw new I({code:`INVALID_HEADER`,message:`Invalid header format: ${n}`,exitCode:2});t[n.slice(0,e).trim()]=n.slice(e+1).trim()}return t}function aI(e){return{status:e.status,channelId:e.channel.channelId,...e.account.name&&{account:e.account.name},payer:e.channel.descriptor.payer,payee:e.channel.descriptor.payee,authorizedSigner:e.channel.descriptor.authorizedSigner,token:e.channel.descriptor.token,escrow:e.channel.escrow,chainId:e.channel.chainId,cumulativeAmount:e.channel.cumulativeAmount.toString(),confirmedSpend:e.spent.toString(),deposit:e.channel.deposit.toString(),units:e.units,resourceUrl:e.endpoint,createdAt:e.createdAt,updatedAt:e.updatedAt}}function oI(e,t){throw e instanceof I?e:e instanceof oF?new I({code:e.code,message:e.message,exitCode:e.exitCode,cause:e}):e instanceof aF?new I({code:e.code,message:e.message,exitCode:65,cause:e}):new I({code:t,message:e instanceof Error?e.message:String(e),exitCode:75,...e instanceof Error&&{cause:e}})}async function sI(e,t){let n=await WO(t??e.account.name);if(!KM(n.account,e.channel.descriptor))throw new I({code:`SESSION_ACCOUNT_MISMATCH`,message:`Account ${n.account.address} cannot sign for session ${e.channel.channelId}.`,exitCode:2});return n}async function cI(e,t){if(t.network&&nI(t.network)!==e)throw new I({code:`CHAIN_MISMATCH`,message:`Session uses chainId ${e}, not ${t.network}.`,exitCode:2});let n=t.network??rI(e),r=bO(t.rpcUrl,{network:n}),i=await SO({network:n,rpcUrl:r});if(i.id!==e)throw new I({code:`CHAIN_MISMATCH`,message:`Session uses chainId ${e}, but RPC is chainId ${i.id}.`,exitCode:2});return ie({chain:i,transport:fe(r)})}const lI=ib(`sessions`,{description:`Manage persistent payment sessions (list, view, close)`}).command(`list`,{description:`List persistent payment sessions`,options:p.object({account:p.string().optional().describe(`Filter by account name`),network:p.enum([`mainnet`,`testnet`]).optional().describe(`Filter by Tempo network`)}),output:p.object({sessions:p.array($F)}),alias:{account:`a`},async run(e){try{let t=(await gF().list()).filter(t=>!(e.options.account&&t.account.name!==e.options.account||e.options.network&&t.channel.chainId!==nI(e.options.network))).map(aI),n={sessions:t};if(e.format===`json`&&e.formatExplicit)return e.ok(n);t.length===0&&console.log(`No sessions.`);for(let[e,n]of t.entries())e>0&&console.log(``),uI(n);return}catch(e){return oI(e,`SESSION_LIST_FAILED`)}}}).command(`view`,{description:`View a persistent payment session`,args:p.object({channelId:p.string().describe(`Full session channel ID`)}),output:$F,async run(e){try{let t=await gF().get(e.args.channelId);if(!t)throw new I({code:`SESSION_NOT_FOUND`,message:`Session ${e.args.channelId} was not found.`,exitCode:2});let n=aI(t);if(e.format===`json`&&e.formatExplicit)return e.ok(n);uI(n);return}catch(e){return oI(e,`SESSION_VIEW_FAILED`)}}}).command(`close`,{description:`Cooperatively close persistent payment sessions`,usage:[{suffix:`<channel-id> [options]`},{suffix:`--all --yes [options]`}],args:p.object({channelId:p.string().optional().describe(`Full session channel ID`)}),options:p.object({account:p.string().optional().describe(`Account name`),all:p.boolean().optional().default(!1).describe(`Close every matching session`),header:p.array(p.string()).optional().describe(`Add close request header (repeatable)`),network:p.enum([`mainnet`,`testnet`]).optional().describe(`Tempo network`),rpcUrl:p.string().optional().describe(`RPC endpoint (env: MPPX_RPC_URL)`),url:p.string().optional().describe(`Override the stored resource URL`),yes:p.boolean().optional().default(!1).describe(`Confirm closing every session`)}),output:p.union([eI,tI]),alias:{account:`a`,header:`H`,rpcUrl:`r`},async run(e){if(e.options.all&&e.args.channelId)return e.error({code:`INVALID_SESSION_CLOSE`,message:`Specify a channel ID or --all, not both.`,exitCode:2});if(!e.options.all&&!e.args.channelId)return e.error({code:`INVALID_SESSION_CLOSE`,message:`Specify a channel ID or --all.`,exitCode:2});if(e.options.all&&!e.options.yes)return e.error({code:`CONFIRMATION_REQUIRED`,message:`Closing all sessions requires --yes.`,exitCode:2});if(e.options.all&&(e.options.header||e.options.rpcUrl||e.options.url))return e.error({code:`INVALID_SESSION_CLOSE`,message:`--header, --rpc-url, and --url only apply to a single session.`,exitCode:2});let t=gF();async function n(e,n={}){let r=await t.get(e);if(!r)throw new I({code:`SESSION_NOT_FOUND`,message:`Session ${e} was not found.`,exitCode:2});let i=hF(r.channel),a=await t.acquire(i);try{let r=await t.get(e);if(!r)throw new I({code:`SESSION_NOT_FOUND`,message:`Session ${e} was not found.`,exitCode:2});let a=await sI(r,n.account),o=await cI(r.channel.chainId,n);if(Nj({...r.channel.descriptor,escrow:r.channel.escrow,chainId:r.channel.chainId}).toLowerCase()!==r.channel.channelId.toLowerCase())throw new I({code:`SESSION_STATE_INVALID`,message:`Stored descriptor does not derive the session channel ID.`,exitCode:65});if((await SM(o,r.channel.channelId,r.channel.escrow)).deposit===0n)return await t.remove(r.channel.channelId),{channelId:r.channel.channelId,status:`already-closed`,spent:r.spent.toString()};let s=EF(n.resourceUrl??r.endpoint),c={...a.source===`keychain`&&{name:a.accountName},address:a.account.address},l=(e=r.challenge)=>({status:`closing`,account:c,endpoint:s,challenge:e,...r.receipt&&{receipt:r.receipt},spent:r.spent,units:r.units}),u=await t.upsert({...l(),channel:r.channel}),d=iI(n.headers),f=u.challenge,p=await iF({channel:u.channel,challenge:u.challenge,fetch:async(e,t)=>globalThis.fetch(e,{...t,headers:{...d,...yw(t?.headers)}}),input:s,spent:u.spent,async onChallenge(e){f=e,await t.upsert({...l(e),channel:u.channel})},manager:{account:a.account,client:o,channelStore:_F(t,{scope:i,selection:u.channel.channelId,context:()=>l(f)})}});return await t.remove(u.channel.channelId),{channelId:u.channel.channelId,status:`closed`,spent:p.receipt.spent,txHash:p.receipt.txHash}}finally{await a.release()}}try{if(e.options.all){let r=(await t.list()).filter(t=>(!e.options.account||t.account.name===e.options.account)&&(!e.options.network||t.channel.chainId===nI(e.options.network))),i=[],a=[];for(let t of r)try{i.push(await n(t.channel.channelId,{account:e.options.account,network:e.options.network}))}catch(e){a.push({channelId:t.channel.channelId,message:e instanceof Error?e.message:String(e)})}let o={closed:i,failed:a};if(a.length>0){for(let e of a)process.stderr.write(`${e.channelId}: ${e.message}\n`);process.exitCode=1}if(e.format===`json`&&e.formatExplicit)return e.ok(o);for(let e of i)console.log(`${e.channelId} ${e.status} ${e.spent}`);for(let e of a)console.log(`${e.channelId} failed ${e.message}`);return}let r=await n(e.args.channelId,{account:e.options.account,headers:e.options.header,network:e.options.network,resourceUrl:e.options.url,rpcUrl:e.options.rpcUrl});if(e.format===`json`&&e.formatExplicit)return e.ok(r);console.log(`${r.channelId} ${r.status} ${r.spent}`),r.txHash&&console.log(` transaction ${r.txHash}`);return}catch(e){return oI(e,`SESSION_CLOSE_FAILED`)}}});function uI(e){console.log(e.channelId),console.log(` status ${e.status}`),console.log(` cumulative amount ${e.cumulativeAmount}`),console.log(` confirmed spend ${e.confirmedSpend}`),console.log(` deposit ${e.deposit}`),console.log(` chain ${e.chainId}`),console.log(` payer ${e.payer}`),console.log(` payee ${e.payee}`),console.log(` token ${e.token}`),console.log(` resource ${e.resourceUrl}`)}wx(),cN(),vN(),ON(),kE(),JO(),PO();function dI(e,t){if(t&&e!==`auto`&&t.toLowerCase()!==e.toLowerCase())throw new I({code:`SESSION_SELECTION_CONFLICT`,message:`--session and -M channel= select different sessions.`,exitCode:2});let n=t??e;if(n===`auto`||n===`new`)return n;if(/^0x[0-9a-fA-F]{64}$/.test(n))return n.toLowerCase();throw new I({code:`INVALID_SESSION`,message:`Session must be auto, new, or a 32-byte channel ID.`,exitCode:2})}function fI(e){return typeof e.request.decimals==`number`?e.request.decimals:6}function pI(e){let t=e.allowCustomEscrow;if(t!==void 0){if(t===`true`)return!0;if(t===`false`)return!1;throw new I({code:`INVALID_ALLOW_CUSTOM_ESCROW`,message:`allowCustomEscrow must be true or false.`,exitCode:2})}}function mI(e,t,n){if(t.deposit!==void 0)return t.deposit;let r=e.request.suggestedDeposit;return typeof r==`string`?M(BigInt(r),fI(e)):n?`10`:void 0}function hI(e,t){if(!e)return;if(e.challengeId!==t.challenge.id)throw Error(`Session receipt challenge does not match the paid request.`);if(e.channelId.toLowerCase()!==t.channelId.toLowerCase())throw Error(`Session receipt channel does not match the selected channel.`);let n=BigInt(e.acceptedCumulative),r=BigInt(e.spent);if(n>t.cumulative)throw Error(`Session receipt exceeds the local cumulative authorization.`);if(r>n)throw Error(`Session receipt spend exceeds its accepted authorization.`);return e}function gI(e,t){return e.channel.channelId.toLowerCase()===t.toLowerCase()}function _I(e){if(e.trim()!==`[DONE]`){if(e.length===0){process.stdout.write(`
245
245
  `);return}try{let t=JSON.parse(e);process.stdout.write(t.token??t.choices?.[0]?.delta?.content??e)}catch{process.stdout.write(e)}}}async function vI(e){let{options:t}=e,n=await WO(t.account),r=bO(t.rpcUrl,{network:t.network}),i=await SO({network:t.network,rpcUrl:r}),a=ie({chain:i,transport:fe(r)}),o=pI(e.methodOptions),s=await BM({allowCustomEscrow:o,challenge:e.challenge,getClient:async()=>a});if(s.chainId!==i.id)throw new I({code:`CHAIN_MISMATCH`,message:`Challenge requires chainId ${s.chainId}, but RPC is chainId ${i.id}.`,exitCode:2});let c={payer:n.account.address,payee:s.payee,token:s.token,escrow:s.escrow,chainId:s.chainId},l=dI(t.session,e.methodOptions.channel),u=e.registry??gF(),d=await u.acquire(c).catch(e=>{throw e instanceof oF?new I({code:e.code,message:e.message,exitCode:e.exitCode,cause:e}):e});try{let r=l===`auto`?await u.getPreferred(c):l===`new`?void 0:l,s=r?await u.get(r):void 0;if(r&&!s)throw new I({code:`SESSION_NOT_FOUND`,message:`Session ${r} was not found.`,exitCode:2});if(s&&l!==`auto`&&(s.status!==`open`||!s.channel.opened||mF(hF(s.channel))!==mF(c)||!KM(n.account,s.channel.descriptor)))throw new I({code:`SESSION_MISMATCH`,message:`Session ${s.channel.channelId} cannot be used for this account and challenge.`,exitCode:2});let d=s?.status===`open`&&s.channel.opened?s:void 0,f=d?`open`:`opening`,p=e.challenge,m=d?.receipt,h=d?.spent??0n,g=d?.units??0,_=EF(e.endpoint),v={...n.source===`keychain`&&{name:n.accountName},address:n.account.address},y=_F(u,{scope:c,selection:l,context:()=>({status:f,account:v,endpoint:_,challenge:p,...m&&{receipt:m},spent:h,units:g}),onNewChannel(){f=`opening`,m=void 0,h=0n,g=0}}),{signal:b,...x}=e.init,S={...x,...b&&{signal:b},onReceipt(e){m=e,h=h>BigInt(e.spent)?h:BigInt(e.spent),g=Math.max(g,e.units??0)}};if(e.challengeResponse.status!==402||e.challengeResponse.bodyUsed)throw Error(`Session manager requires an unconsumed 402 challenge response.`);let C=!0,w=DN({account:n.account,allowCustomEscrow:o,bootstrap:!1,client:a,channelStore:y,credentialContext:e.credentialContext,decimals:fI(e.challenge),maxDeposit:mI(e.challenge,e.methodOptions,TO(i)),fetch:async(t,n)=>C?(C=!1,e.challengeResponse):e.fetch(t,n)});d&&gN(w).rehydrate({channel:d.channel,challenge:e.challenge,input:e.fetchInput,spent:d.spent});let{onReceipt:T,...ee}=S,E=await w.fetch(e.fetchInput,ee);if(t.fail&&E.status>=400)throw new I({code:`HTTP_ERROR`,message:`HTTP error ${E.status}`,exitCode:22});if(E.status===402)throw new I({code:`PAYMENT_REJECTED`,message:`Payment rejected.`,exitCode:75});lO(E,{include:!1,verbose:t.include?Math.max(t.verbose,2):t.verbose,silent:t.silent}),p=E.challenge??e.challenge;let D=w.channelId;if(!D)throw Error(`Session manager did not select a channel.`);if(m=hI(E.receipt,{challenge:p,channelId:D,cumulative:w.cumulative})??m,yE(E)){let t=gN(w).consumeSseResponse(e.fetchInput,E,{onReceipt:T,signal:e.init.signal??void 0});for await(let e of t)_I(e)}else process.stdout.write(Buffer.from(await E.arrayBuffer()));let te=await u.get(D);if(!te||!gI(te,D))throw Error(`Session ${D} was not persisted.`);if(m){let e=hI(m,{challenge:p,channelId:D,cumulative:w.cumulative});if(!e)throw Error(`Session receipt validation failed.`);m=e,h=h>BigInt(e.spent)?h:BigInt(e.spent),g=Math.max(g,e.units??0),f=`open`}await u.upsert({status:f,channel:te.channel,account:v,endpoint:_,challenge:p,...m&&{receipt:m},spent:h,units:g}),t.silent||(e.info(`Session retained ${D}\n`),e.info(`Close with: mppx sessions close ${D}\n`))}finally{await d.release()}}PO();function Q(e,t){return t?{label:e,detail:t,severity:`pass`}:{label:e,severity:`pass`}}function $(e,t,n){let r={label:e,severity:`fail`};return t&&(r.detail=t),n&&(r.hint=n),r}function yI(e,t,n){let r={label:e,severity:`warn`};return t&&(r.detail=t),n&&(r.hint=n),r}function bI(e,t,n){let r=t?{label:e,detail:t,severity:`skip`}:{label:e,severity:`skip`};return n&&(r.hint=n),r}const xI={pass:X.green(`✓`),fail:X.red(`✗`),warn:X.yellow(`⚠`),suggested:X.cyan(`◇`),skip:X.dim(`○`)};function SI(e){let t=xI[e.severity],n=e.detail?`${e.label} (${e.detail})`:e.label;console.log(` ${t} ${n}`),e.hint&&e.severity!==`pass`&&console.log(X.dim(` → ${e.hint}`))}function CI(e){console.log(`\n${X.bold(e)}`)}function wI(e,t){for(let n of e)SI(n),n.severity===`pass`?t.passed++:n.severity===`fail`?t.failed++:n.severity===`warn`?t.warnings++:n.severity===`suggested`?t.suggested++:n.severity===`skip`&&t.skipped++}async function TI(e,t,n=15e3){let r=new AbortController,i=setTimeout(()=>r.abort(),n);try{return await fetch(e,{...t,signal:r.signal})}finally{clearTimeout(i)}}function EI(e){return e<1024?`${e}B`:e<1048576?`${(e/1024).toFixed(1)}KB`:`${(e/1048576).toFixed(1)}MB`}const DI=new Set([`get`,`post`,`put`,`patch`,`delete`,`head`,`options`,`trace`]);function OI(e){return typeof e==`string`&&/^0x[0-9a-fA-F]{40}$/.test(e)}function kI(e){return typeof e==`string`&&/^(0|[1-9][0-9]*)$/.test(e)}function AI(e){let t=e.indexOf(`:`);if(t<1)return null;let n=e.slice(0,t).toLowerCase();if(!DI.has(n))return null;let r=e.slice(t+1);if(!r)return null;let i=r.startsWith(`/`)?r:`/`+r;return{method:n.toUpperCase(),path:i}}function jI(e,t){if(e){try{let n=JSON.parse(e);if(n&&typeof n==`object`&&!Array.isArray(n)){let e=Object.keys(n);if(e.length>0&&e.every(e=>e.startsWith(`/`))){let e=n[t];return e===void 0?void 0:typeof e==`string`?e:JSON.stringify(e)}}}catch{}return e}}function MI(e){if(!e)return{};let t={};for(let n of e){let e=n.indexOf(`:`);e>0&&(t[n.slice(0,e).trim().toLowerCase()]=n.slice(e+1).trim())}return t}async function NI(e){let t=new URL(`openapi.json`,e.replace(/\/?$/,`/`)).href;try{let e=await TI(t,{});if(!e.ok)return{error:`HTTP ${e.status}`};let n=await e.text();return{doc:JSON.parse(n),raw:n}}catch(e){return e instanceof DOMException&&e.name===`AbortError`?{error:`Request timed out after 15s`}:e instanceof SyntaxError?{error:`Invalid JSON`}:{error:e.message}}}async function PI(e){let t=new URL(`/llms.txt`,e).href,n=`llms.txt found and nonempty`;try{let e=await TI(t,{});if(!e.ok)throw Error(`HTTP ${e.status}`);let r=(await e.text()).trim();if(!r)throw Error(`Empty document`);let i=e.headers.get(`content-type`)?.split(`;`)[0]?.trim().toLowerCase();if(i&&!i.startsWith(`text/`)||i===`text/html`||/^<(?:!doctype html|html|head|body)\b/i.test(r))throw Error(`Expected text documentation, received non-text or HTML content`);return Q(n,t)}catch(e){return{label:n,detail:`${t}: ${e.message}`,severity:`suggested`,hint:`Serve nonempty text documentation at /llms.txt.`}}}function FI(e){let t=[],n=[],r=e.paths;if(!r)return[];for(let[e,i]of Object.entries(r)){let r=RI(i.parameters);for(let[a,o]of Object.entries(i)){if(!DI.has(a)||!o||typeof o!=`object`||Array.isArray(o))continue;let i=o,s=zI(r,RI(i.parameters)),c=s.length>0?s:void 0;if(i[`x-payment-info`]){let n=i[`x-payment-info`];t.push({method:a.toUpperCase(),path:e,amount:n.amount,parameters:c})}else{let t=i.responses;t&&`402`in t&&n.push({method:a.toUpperCase(),path:e,parameters:c})}}}return t.length>0?t:n}function II(e,t){let n=e.paths;if(!n)return;let r=n[t.path];if(!r)return;let i=r[t.method.toLowerCase()];if(!i?.requestBody)return;let a=i.requestBody.content?.[`application/json`];if(!a)return;if(a.example)return JSON.stringify(a.example);if(a.examples&&typeof a.examples==`object`){let e=Object.values(a.examples)[0];if(e?.value)return JSON.stringify(e.value)}let o=a.schema,s=new Set;if(o=VI(o,e,s),!o||o.type!==`object`)return;let c=HI(o,e,s);if(c&&typeof c==`object`&&Object.keys(c).length>0)return JSON.stringify(c)}function LI(e,t,n){let r=t.path;t.parameters&&(r=BI(r,t.parameters));let i=r.startsWith(`/`)?r.slice(1):r,a=new URL(i,e.replace(/\/?$/,`/`)).href;if(n){let e=new URL(a);for(let t of n){let[n,...r]=t.split(`=`);n&&e.searchParams.set(n,r.join(`=`))}a=e.href}return a}function RI(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!=`object`)continue;let e=n;e.in===`path`&&typeof e.name==`string`&&t.push(e.schema&&typeof e.schema==`object`?{name:e.name,in:`path`,schema:e.schema,example:e.example}:{name:e.name,in:`path`,example:e.example})}return t}function zI(e,t){let n=[...e];for(let e of t){let t=n.findIndex(t=>t.name===e.name);t>=0?n[t]=e:n.push(e)}return n}function BI(e,t){return e.replace(/\{([^}]+)\}/g,(e,n)=>{let r=t.find(e=>e.name===n&&e.in===`path`);if(!r)return e;let i=r.example??r.schema?.example??r.schema?.default;return i===void 0?e:encodeURIComponent(String(i))})}function VI(e,t,n){if(!e||typeof e.$ref!=`string`)return e;if(n?.has(e.$ref))return;let r=e.$ref.replace(/^#\//,``).split(`/`),i=t;for(let e of r)if(i&&typeof i==`object`)i=i[e];else return;return i}function HI(e,t,n){let r=VI(e,t,n)??e;if(r.const!==void 0)return r.const;if(r.example!==void 0)return r.example;if(r.default!==void 0)return r.default;switch(r.type){case`string`:return r.enum&&Array.isArray(r.enum)?r.enum[0]:r.format===`email`?`test@example.com`:r.format===`uuid`?`00000000-0000-0000-0000-000000000000`:r.format===`uri`||r.format===`url`?`https://example.com`:r.format===`date`?`2026-01-01`:r.pattern===`^\\d{5}(?:-\\d{4})?$`?`10001`:r.pattern===`^[A-Z]{2}$`?`US`:`test`;case`number`:case`integer`:return r.minimum??1;case`boolean`:return!0;case`array`:return[];case`object`:{let e=r.properties;if(!e)return{};let i=r.required||[],a={};for(let r of i){let i=e[r];i&&(a[r]=HI(i,t,n))}return a}default:return null}}pS(),jx(),ZC(),PO();const UI=Object.values(Ie);function WI(e){let t=e.request.methodDetails;return typeof t?.chainId==`number`&&UI.find(e=>e.id===t.chainId)?.testnet===!0}async function GI(e,t,n,r){let i=[],a=LI(e,t,r?.query),o=MI(r?.extraHeaders),s;r?.body&&!r.bodyIsAutogenerated&&(s=r.body,o[`content-type`]||=`application/json`);let c;try{let e={method:t.method};Object.keys(o).length>0&&(e.headers=o),s&&(e.body=s),c=await TI(a,e)}catch(e){return i.push($(`Request failed`,e.message)),{results:i}}if(!s&&(c.status===400||c.status===422)){let e=r?.body??(r?.discoveryDoc?II(r.discoveryDoc,t):void 0);if(e){n&&console.log(X.dim(` Retrying with body: ${e}`)),s=e,o[`content-type`]=`application/json`;try{c=await TI(a,{method:t.method,headers:o,body:s})}catch(e){return i.push($(`Request failed`,e.message)),{results:i}}}}if(c.status!==402)return c.status===200?i.push(bI(`Returns 402 without credentials`,`Got 200 (endpoint may not require payment in all cases)`)):c.status===401||c.status===403?i.push(bI(`Returns 402 without credentials`,`Got ${c.status} (endpoint requires auth before payment gate)`)):i.push($(`Returns 402 without credentials`,`Got ${c.status} instead`,c.status===400||c.status===422?`Server requires a valid request body before returning 402. Add a requestBody schema with examples to your OpenAPI doc, or use --body.`:`Endpoints that require payment must return HTTP 402 with a WWW-Authenticate: Payment header when no valid credential is provided.`)),{results:i};i.push(Q(`Returns 402 without credentials`));let l=c.headers.get(q.wwwAuthenticate),u=nL(c);if(!l)return u.length>0?(i.push(bI(`Not an MPP endpoint`,`No WWW-Authenticate header — x402 protocol detected`)),i.push(...u)):i.push(bI(`Not an MPP endpoint`,`No WWW-Authenticate header (may be x402 or other protocol)`)),{results:i};if(u.length>0&&i.push(...u),!l.startsWith(`${Ex.payment} `))return i.push(bI(`Not an MPP endpoint`,`WWW-Authenticate scheme is not Payment`)),{results:i};i.push(Q(`WWW-Authenticate header present`,`Payment scheme`));let d;try{d=iS(c)}catch(e){let t=e.message;i.push($(`Challenge parseable`,t,`The Payment challenge must include a request="<base64url>" parameter containing JSON-encoded payment details.`));let n=l.slice(l.indexOf(` `)+1);return i.push(yI(`Received`,n.length>200?n.slice(0,200)+`...`:n)),{results:i}}if(d.length===0)return i.push($(`Challenge parseable`,`No Payment challenges found in header`)),{results:i};let f=d.map(e=>`${e.method}/${e.intent}`).join(`, `);i.push(Q(`Challenge parseable`,d.length===1?f:`${d.length} methods: ${f}`));let p=new URL(e).hostname;KI(d,i),qI(d,i),JI(d,i),YI(d,p,i);let m=d.length>1;for(let e of d){let t=e.request;XI(e,t,i,m)}if(n)for(let e of d)console.log(X.dim(` Challenge (${e.method}/${e.intent}): ${JSON.stringify(e,null,2)}`));return{results:i,resolvedBody:s,challenges:d}}function KI(e,t){let n=e.filter(e=>!e.id);n.length===0?t.push(Q(`Challenge has id`)):t.push($(`Challenge has id`,`${n.length} missing`,`Every challenge must include a unique id field.`))}function qI(e,t){let n=e.filter(e=>!e.realm);n.length===0?t.push(Q(`Challenge has realm`)):t.push($(`Challenge has realm`,`${n.length} missing`,`Set realm to your server's hostname.`))}function JI(e,t){let n=new Date;for(let r of e){if(!r.expires){t.push(yI(`Challenge has expiration`,`missing expires field`,`Add an expires field (ISO 8601) to prevent replay attacks.`));return}if(new Date(r.expires)<=n){t.push($(`Challenge expires in the future`,`Expired at ${r.expires}`,`The expires timestamp must be in the future.`));return}}let r=Math.min(...e.map(e=>new Date(e.expires).getTime()-n.getTime()));t.push(Q(`Challenge expires in the future`,`${Math.round(r/6e4)}m from now`))}function YI(e,t,n){let r=[...new Set(e.map(e=>e.realm??``))].filter(e=>e&&e!==t&&!t.endsWith(`.${e}`));r.length>0?n.push(yI(`Realm matches server hostname`,`realm="${r[0]}" vs host="${t}"`,`Set the realm to your production hostname (or base domain) in the challenge.`)):n.push(Q(`Realm matches server hostname`))}function XI(e,t,n,r){let i=r?`[${e.method}] `:``;e.method===Dx.tempo?ZI(t,i,n,e):e.method===Dx.stripe?QI(t,i,n):e.method===Dx.evm&&$I(e,t,i,n)}function ZI(e,t,n,r){let i=e.methodDetails,a=Array.isArray(i?.splits)&&i.splits.length>0;if(OI(e.recipient)?n.push(Q(`${t}Valid recipient address`)):e.recipient===void 0&&a?n.push(Q(`${t}Uses splits (no single recipient)`)):e.recipient===void 0?n.push($(`${t}Valid recipient address`,`Missing recipient (and no splits defined)`,`Set request.recipient to a valid 0x address, or use methodDetails.splits for multiple recipients.`)):n.push($(`${t}Valid recipient address`,`Got: ${String(e.recipient)}`,`Set request.recipient to a valid 0x-prefixed 40-hex-char address.`)),OI(e.currency)){let e=WI(r)?`testnet`:`mainnet`;n.push(Q(`${t}Valid currency address`,e))}else n.push($(`${t}Valid currency address`,`Got: ${String(e.currency)}`,`Set request.currency to a valid token address.`));eL(e,t,n,`token's smallest unit (e.g. "10000" = $0.01 for 6-decimal tokens)`)}function QI(e,t,n){eL(e,t,n,`currency's smallest unit (e.g. "100" = $1.00 for USD)`);let r=e.currency;typeof r==`string`&&/^[a-z]{3}$/i.test(r)?n.push(Q(`${t}Valid currency code`,r.toUpperCase())):n.push($(`${t}Valid currency code`,r?`Got: ${r}`:`missing`,`Must be a three-letter ISO currency code (e.g. "usd").`));let i=e.methodDetails,a=i?.networkId;a?n.push(Q(`${t}Has networkId`,a.slice(0,20))):n.push($(`${t}Has networkId`,`Missing methodDetails.networkId`,`Set methodDetails.networkId to your Stripe Business Network profile ID.`));let o=i?.paymentMethodTypes;Array.isArray(o)&&o.length>0?n.push(Q(`${t}Has paymentMethodTypes`,o.join(`, `))):n.push($(`${t}Has paymentMethodTypes`,`Missing or empty`,`Set methodDetails.paymentMethodTypes to an array (e.g. ["card"]).`))}function $I(e,t,n,r){if(OI(t.recipient)?r.push(Q(`${n}Valid recipient address`)):r.push($(`${n}Valid recipient address`,`Got: ${String(t.recipient)}`,`Set request.recipient to a valid 0x-prefixed Ethereum address.`)),OI(t.currency)){let t=WI(e)?`testnet`:`mainnet`;r.push(Q(`${n}Valid currency address`,t))}else r.push($(`${n}Valid currency address`,`Got: ${String(t.currency)}`,`Set request.currency to a valid ERC-20 token contract address.`));eL(t,n,r,`token's smallest unit`);let i=t.methodDetails?.chainId;typeof i==`number`&&i>0?r.push(Q(`${n}Has chainId`,String(i))):r.push($(`${n}Has chainId`,`Missing methodDetails.chainId`,`Set methodDetails.chainId to the EVM chain ID.`))}function eL(e,t,n,r){kI(e.amount)?n.push(Q(`${t}Amount is valid integer string`)):e.amount===void 0||e.amount===null?n.push($(`${t}Amount is valid integer string`,`Missing amount`,`Set request.amount to a string of digits in the ${r}.`)):n.push($(`${t}Amount is valid integer string`,`Got: ${String(e.amount)}`,`request.amount must be a string of digits (no decimals, no prefix).`))}async function tL(e,t,n){let r=[],i=LI(e,t,n?.query),a={[q.authorization]:`${Ex.payment} dGhpcyBpcyBnYXJiYWdl`},o;n?.body&&(o=n.body,a[`content-type`]=`application/json`);try{let e=await TI(i,{method:t.method,headers:a,body:o??null});e.status===402?(r.push(Q(`Malformed credential returns 402`,`not 500`)),e.headers.get(q.wwwAuthenticate)?.startsWith(`${Ex.payment} `)?r.push(Q(`Error response includes fresh challenge`)):r.push(yI(`Error response includes fresh challenge`,`No WWW-Authenticate header`,`When rejecting an invalid credential, respond with 402 and include a fresh WWW-Authenticate: Payment challenge so the client can retry.`))):e.status>=500?r.push($(`Malformed credential returns 402`,`Got ${e.status} (server error)`,`When the Authorization header contains an invalid credential, respond with 402 (not 500). Catch credential validation errors and return a fresh challenge.`)):r.push(yI(`Malformed credential returns 402`,`Got ${e.status}`,`When the Authorization header contains an invalid Payment credential, respond with 402 and a fresh WWW-Authenticate challenge. Returning ${e.status} prevents the client from retrying with a valid payment.`))}catch(e){r.push($(`Error handling test`,e.message))}return r}function nL(e){let t=[],n=e.headers.get(`payment-required`)??e.headers.get(`x-payment-required`);if(!n)return t;let r=e.headers.get(`payment-required`)?`PAYMENT-REQUIRED`:`X-Payment-Required`;try{let e=WC(n);t.push(Q(`x402 payment challenge`,`${r} with valid x402 v${e.x402Version} payload`))}catch{t.push(yI(`x402 payment challenge`,`${r} header present but failed schema validation`,`Ensure the PAYMENT-REQUIRED header contains a valid base64-encoded JSON payload matching the x402 schema.`))}return t}const rL=[`No discovery document found, endpoints could not be automatically found.`,`MPP servers must serve an OpenAPI document at /openapi.json with x-payment-info extensions.`,`The MPP SDKs can automatically expose this endpoint. See https://mpp.dev/sdk.`,``,`To test a specific endpoint: mppx validate <url> --endpoint POST:/your/path`].join(`
246
246
  `);qx();const iL={method:J.string(),reference:J.string(),externalId:J.optional(J.string()),subscriptionId:J.optional(J.string()),status:J.literal(`success`),timestamp:Rx()};J.object(iL);const aL=J.looseObject(iL);function oL(e){let t=O.toString(e);return sL(JSON.parse(t))}function sL(e){return aL.parse(e)}pS(),jx(),sP(),oO(),eO(),JO(),PO();async function cL(e,t,n){try{n||console.log(X.dim(` Provisioning testnet wallet and funding via faucet...`));let t=he(),r=_e(t),i=ie({chain:ye,transport:fe()}),a=await je.faucet.fund(i,{account:r});await Promise.all(a.map(e=>Oe(i,{hash:e}))),n||console.log(X.dim(` Using wallet: ${r.address}`));let o=e.request.currency;if(typeof o==`string`)for(let e=0;e<10;e++){let e=await je.token.getBalance(i,{account:r.address,token:o}).catch(()=>void 0);if(e&&e.amount>0n)break;await new Promise(e=>setTimeout(e,500))}return{methods:[...rP({account:r})]}}catch(e){t&&console.log(X.dim(` Provisioning failed: ${e.message}`));return}}async function lL(){let e=VO(),{isTempoAccount:t}=await Promise.resolve().then(()=>(PO(),sO)),{resolveTempoAccount:n}=await Promise.resolve().then(()=>(VP(),cP));if(t(e)){let t=n(e);if(t)return t.wallet_address}try{return(await GO()).address}catch{return}}function uL(e){try{let{execSync:t}=m,n=t(`stripe config --list`,{encoding:`utf8`,timeout:5e3}).match(/test_mode_api_key\s*=\s*'([^']+)'/);if(n?.[1])return e&&console.log(X.dim(` Using Stripe test key from stripe CLI`)),n[1]}catch{}}async function dL(e,t,n){let r=ie({chain:e,transport:fe()}),[i,a]=await Promise.all([Ce(r,{address:t,abi:ce,functionName:`balanceOf`,args:[n]}),Ce(r,{address:t,abi:ce,functionName:`symbol`}).catch(()=>void 0)]);return{balance:i,symbol:a??void 0}}function fL(e){return Object.values(Ie).find(t=>t.id===e)}function pL(e,t){return`$${(Number(e)/10**t).toFixed(2)}`}function mL(e){switch(e.method){case Dx.evm:return`no EVM payment plugin yet`;case`solana`:return`no Solana payment plugin yet`;default:return`no plugin for ${e.method}/${e.intent}`}}async function hL(e,t,n,r){let i=[],a=LI(e,t,r.query),o=MI(r.extraHeaders),s;r.body&&(s=r.body,o[`content-type`]=`application/json`);let c;try{c=await TI(a,{method:t.method,headers:o,body:s??null})}catch(e){return i.push($(`Payment: fetch challenge`,e.message)),i}if(c.status!==402)return i.push(bI(`Payment: skipped`,`Endpoint returned ${c.status}`)),i;let l;try{l=iS(c)}catch(e){return i.push($(`Payment: parse challenge`,e.message)),i}if(l.length===0)return i.push($(`Payment: parse challenge`,`No Payment challenges in response`)),i;let u=await $P().catch(()=>void 0),d=l.find(e=>{if(e.method!==Dx.tempo||ZP(u?.config)?.some(t=>t.name===e.method&&t.intent===e.intent))return!1;let t=e.request.methodDetails;return typeof t?.chainId==`number`&&t.chainId!==tO.mainnet});if(d){let e=await cL(d,n,r.silent);if(e){let r=new Response(null,{status:402,headers:{[q.wwwAuthenticate]:Yx(d)}});try{let c=cT({methods:e.methods,polyfill:!1}),l=await qP(d,u?.config.extensions),f=await c.createCredential(r,l);i.push(Q(`Payment: submitted`,`ephemeral testnet wallet`)),await yL(i,a,t,f,o,s,n,ye,cS(d))}catch(e){i.push($(`Payment: create credential`,e.message))}}else i.push($(`Payment: auto-provision wallet`,`Failed to create and fund testnet wallet`));r.onResults?.(i)}let f=r.interactive,p=process.env.MPPX_STRIPE_SECRET_KEY??uL(n),m=p?.startsWith(`sk_test_`)||p?.startsWith(`rk_test_`),h=new Set([Dx.tempo,Dx.evm,Dx.stripe]);for(let e of l){if(e===d||!h.has(e.method))continue;r.silent||console.log(``);let c=i.length,l=()=>{r.onResults&&i.length>c&&r.onResults(i.slice(c))},g=`Payment [${e.method}]`;try{switch(e.method){case Dx.tempo:case Dx.evm:await gL(e,g,{results:i,url:a,endpoint:t,fetchHeaders:o,fetchBody:s,verbose:n,loaded:u,isInteractive:f,options:r});break;case Dx.stripe:await _L(e,g,{results:i,url:a,endpoint:t,fetchHeaders:o,fetchBody:s,verbose:n,loaded:u,isInteractive:f,isStripeTestKey:m??!1,stripeKey:p,options:r})}}finally{l()}}return i}async function gL(e,t,n){let{results:r,url:i,endpoint:a,fetchHeaders:o,fetchBody:s,verbose:c,loaded:l,options:u}=n,d=e.request,f=d.methodDetails,p=kI(d.amount)?BigInt(d.amount):void 0,m=f?.decimals??d.decimals??6,h=d.currency,{plugin:g,method:_}=JP(e,l?.config);if(!g&&!_){r.push(bI(t,mL(e)));return}let v;if(!_){try{v=await lL()}catch{}if(!v){r.push(bI(t,`no wallet configured. Run "mppx account create" to create one.`));return}}let y;if(e.method===Dx.tempo){let e=f?.chainId??(_?void 0:ve.id);e!==void 0&&(y=e===ye.id?ye:fL(e))}else if(e.method===Dx.evm){let e=f?.chainId;e&&(y=fL(e))}let b;if(v&&p&&h&&y)try{let n;if(e.method===Dx.tempo){let e=await EO(ie({chain:y,transport:fe()}),h,v);n=e.balance,b=e.symbol}else{let e=await dL(y,h,v);n=e.balance,b=e.symbol}if(n<p){let e=pL(p,m),i=pL(n,m),a=b??`tokens`;r.push(bI(t,`insufficient balance (have ${i}, need ${e} ${a} on ${y.name})`,`Fund wallet ${v} with at least ${e} ${a} on ${y.name}.`));return}}catch(e){c&&console.log(X.dim(` Balance check skipped: ${e.message}`))}let x=p?pL(p,m):`unknown amount`,S=b??(h?.length===3?h.toUpperCase():``),C=y?.name,w=`${x}${S?` ${S}`:``}${C?` on ${C}`:``}`;if(u.silent||console.log(X.dim(v?` Attempting payment with wallet ${v}`:` Attempting payment with configured method`)),!_&&y?.testnet)u.silent||console.log(X.dim(` Auto-approved: ${w} (testnet)`));else if(!u.yes&&!n.isInteractive){r.push(bI(t,`non-interactive mode, use --yes to approve`));return}else if(u.yes)u.silent||console.log(X.dim(` Auto-approved: ${w}`));else if(!await vO(` ${X.yellow(`Pay`)} ${w}. Continue?`,!1)){r.push(bI(t,`declined`));return}let T,ee,E;if(g)try{let t=await g.setup({challenge:e,options:{network:`mainnet`},methodOpts:{}});T=t.methods,ee=t.createCredential,E=t.credentialContext}catch(e){r.push(bI(t,e.message));return}else T=[_];if(_&&yD(e)){let n=!0,u=cT({methods:[_],polyfill:!1,async onChallenge(n,{createCredential:i}){let a=await qP(n,l?.config.extensions);tF(e,n);let o=await i(a);return r.push(Q(`${t}: submitted`)),o},fetch:async(t,r)=>n?(n=!1,new Response(null,{status:402,headers:{[q.wwwAuthenticate]:Yx(e)}})):TI(t,r??{},3e4)});try{await bL(r,await u.fetch(i,{method:a.method,headers:o,body:s??null}),c,y)}catch(e){r.push($(t,e.message))}return}let D=await vL(e,T,ee,t,r,l?.config.extensions,E);D&&(g?.prepareCredentialRequest?.({challenge:e,credential:D,headers:o}),await yL(r,i,a,D,o,s,c,y,cS(e)))}async function _L(e,t,n){let{results:r,url:i,endpoint:a,fetchHeaders:o,fetchBody:s,verbose:c,loaded:l,options:u,stripeKey:d}=n,{plugin:f,method:p}=JP(e,l?.config);if(!f&&!p){r.push(bI(t,`no Stripe payment method available`));return}let m=!!(f&&!l?.config.plugins?.includes(f)&&n.isStripeTestKey),h=e.request,g=kI(h.amount)?BigInt(h.amount):void 0,_=h.decimals??2,v=h.currency,y=g?pL(g,_):`unknown amount`,b=v?.length===3?v.toUpperCase():``,x=`${y}${b?` ${b}`:``} via Stripe${m?` (testmode)`:``}`;if(m)u.silent||console.log(X.dim(` Attempting: ${x}`));else if(!u.yes&&!n.isInteractive){r.push(bI(t,`non-interactive mode, use --yes to approve`));return}else if(u.yes)u.silent||console.log(X.dim(` Auto-approved: ${x}`));else if(!await vO(` ${X.yellow(`Pay`)} ${x}. Continue?`,!1)){r.push(bI(t,`declined`));return}let S,C,w;if(f)try{let t={paymentMethod:`pm_card_visa`};d&&(t.secretKey=d);let n=await f.setup({challenge:e,options:{},methodOpts:t});S=n.methods,C=n.createCredential,w=n.credentialContext}catch(e){r.push(bI(t,e.message));return}else S=[p];let T=await vL(e,S,C,t,r,l?.config.extensions,w);if(T){if(f?.prepareCredentialRequest?.({challenge:e,credential:T,headers:o}),m){let n=await TI(i,{method:a.method,headers:{...o,[cS(e)]:T},body:s??null},3e4);n.status>=200&&n.status<300?r.push(Q(`${t}: successful`,`HTTP ${n.status}`)):r.push(bI(`${t}: server is in livemode`,void 0,`Run your server with a Stripe test key to automatically validate Stripe payments in testmode.`));return}await yL(r,i,a,T,o,s,c,void 0,cS(e))}}async function vL(e,t,n,r,i,a,o){let s=new Response(null,{status:402,headers:{[q.wwwAuthenticate]:Yx(e)}});try{let c=await qP(e,a,o),l;return l=n?await n(s,c):await cT({methods:t,polyfill:!1}).createCredential(s,c),i.push(Q(`${r}: submitted`)),l}catch(e){let t=e.message;t.toLowerCase().includes(`insufficient`)?i.push(bI(r,`insufficient balance: ${t}`)):i.push($(r,t));return}}async function yL(e,t,n,r,i,a,o,s,c=q.authorization){let l;try{l=await TI(t,{method:n.method,headers:{...i,[c]:r},body:a??null},3e4)}catch(t){return e.push($(`Payment: send credential`,t.message)),e}return bL(e,l,o,s)}async function bL(e,t,n,r){if(t.status===402){let n=await t.text().catch(()=>``),r=`Payment rejected`;try{let e=JSON.parse(n);r=e.detail??e.title??r}catch{}return e.push($(`Payment: accepted`,r,`The server rejected a valid credential. Check that your payment verification logic accepts the credential format and that the payment was processed on-chain.`)),e}if(t.status>=400&&t.status<500)e.push(yI(`Payment: post-payment response`,`Got ${t.status}`,`Payment succeeded but the endpoint returned a client error. The endpoint likely requires request body parameters. Use --body to provide them.`));else if(t.status>=500)return e.push($(`Payment: server response`,`Got ${t.status}`,`Payment was accepted but the server errored while generating the response. Check server logs for the underlying error.`)),e;else e.push(Q(`Payment: successful`,`HTTP ${t.status}`));let i=t.headers.get(q.paymentReceipt);if(!i)e.push($(`Payment-Receipt header present`,void 0,`After accepting payment, include a Payment-Receipt header with a base64url-encoded JSON object containing: method, reference, status ("success"), and timestamp (ISO 8601).`));else{e.push(Q(`Payment-Receipt header present`));try{let t=oL(i);if(e.push(Q(`Receipt parseable`)),t.status===`success`?e.push(Q(`Receipt status is "success"`)):e.push($(`Receipt status is "success"`,`Got: ${t.status}`)),t.reference){let n=/^0x[0-9a-fA-F]{64}$/.test(t.reference),r=t.reference.startsWith(`pi_`);n||r?e.push(Q(`Receipt reference valid`,t.reference.slice(0,20)+`...`)):e.push(yI(`Receipt reference format`,t.reference.slice(0,40)))}else e.push(yI(`Receipt has reference`,`No reference field`));if(t.timestamp){let n=new Date(t.timestamp),r=Date.now()-n.getTime();r<6e4?e.push(Q(`Receipt timestamp recent`,`${Math.round(r/1e3)}s ago`)):e.push(yI(`Receipt timestamp recent`,`${Math.round(r/6e4)}m ago`))}n&&console.log(X.dim(` Receipt: ${JSON.stringify(t,null,2)}`))}catch(t){e.push($(`Receipt parseable`,t.message))}}let a=t.headers.get(`content-type`)??``,o=await t.text().catch(()=>``);if(o.length>0)e.push(Q(`Response body non-empty`,`${a.split(`;`)[0]}, ${EI(o.length)}`));else{let n=[...t.headers.entries()].filter(([e])=>!e.startsWith(`x-`)&&![`content-type`,`content-length`,`date`,`server`,`connection`,`keep-alive`,`cache-control`,`vary`,`access-control-allow-origin`,`payment-receipt`,`payment-session`,`payment-session-snapshot`].includes(e.toLowerCase()));n.length>0?e.push(yI(`Response body empty -- data may be in headers only`,n.map(([e])=>e).join(`, `))):e.push(yI(`Response body empty`))}if(a?e.push(Q(`Content-Type header set`,a.split(`;`)[0])):e.push(yI(`Content-Type header set`)),i)try{let t=oL(i);if(t.reference&&/^0x[0-9a-fA-F]{64}$/.test(t.reference)){let n=r?.blockExplorers?.default?.url;if(n){let r=n.includes(`tempo`)?`receipt`:`tx`;e.push(Q(`On-chain transaction`,`${n}/${r}/${t.reference}`))}}}catch{}return e}async function*xL(e){let t=e.url.replace(/\/$/,``).replace(/\/openapi\.json$/i,``),n=e.verbose??!1,r=await EL(t,e);yield{phase:`discovery`,discovery:r,results:r.checks};for(let i of r.endpoints){yield{phase:`endpoint`,endpoint:i};let a,o=!1;e.endpoint?a=e.body:(a=jI(e.body,i.path),!a&&r.doc&&(a=II(r.doc,i),o=!!a));let{results:s,resolvedBody:c,challenges:l}=await GI(t,i,n,{body:a,bodyIsAutogenerated:o,query:e.query,extraHeaders:e.headers,discoveryDoc:r.doc??void 0}),u=c??a,d=s.some(e=>e.severity===`pass`&&e.label===`Challenge parseable`),f=(l??[]).filter(e=>e.method!==`stripe`).map(e=>e.request.methodDetails?.chainId).filter(e=>typeof e==`number`),p=f.some(TL),m=f.some(e=>!TL(e)),h=!d&&s.some(e=>e.label===`Not an MPP endpoint`),g=s.some(e=>e.severity===`pass`&&e.label===`WWW-Authenticate header present`),_=s.some(e=>e.severity===`fail`&&e.label===`Challenge parseable`);if(yield{phase:`challenge`,endpoint:i,results:s,isMpp:d,isTestnet:p,isMainnet:m,isNonMppPayment:h,isMalformedChallenge:!d&&g&&_,methods:l?.map(e=>e.method)??[]},d&&(yield{phase:`errorHandling`,endpoint:i,results:await tL(t,i,{body:u,query:e.query})},!e.skipPayment)){let r=e.onPaymentResults,a=await hL(t,i,n,{body:u,query:e.query,extraHeaders:e.headers,yes:e.yes,silent:!r,interactive:e.interactive,...r&&{onResults:r}});yield{phase:`payment`,endpoint:i,results:a,succeeded:a.some(e=>e.severity===`pass`&&e.label===`Payment: successful`)}}}}async function SL(e){let t=e.url.replace(/\/$/,``).replace(/\/openapi\.json$/i,``),n,r=[],i,a=!1,o=!1;for await(let t of xL(e))switch(t.phase){case`discovery`:n=t.discovery;break;case`endpoint`:i={method:t.endpoint.method,path:t.endpoint.path,challenge:[],errorHandling:[],payment:[]},r.push(i);break;case`challenge`:i&&(i.challenge=t.results),t.isMpp&&(t.isTestnet&&(a=!0),t.isMainnet&&(o=!0));break;case`errorHandling`:i&&(i.errorHandling=t.results);break;case`payment`:i&&(i.payment=t.results)}let s={passed:0,failed:0,warnings:0,suggested:0,skipped:0};if(n)for(let e of n.checks)e.severity===`pass`?s.passed++:e.severity===`fail`?s.failed++:e.severity===`warn`?s.warnings++:e.severity===`suggested`?s.suggested++:e.severity===`skip`&&s.skipped++;for(let e of r)for(let t of[...e.challenge,...e.errorHandling,...e.payment])t.severity===`pass`?s.passed++:t.severity===`fail`?s.failed++:t.severity===`warn`?s.warnings++:t.severity===`suggested`?s.suggested++:t.severity===`skip`&&s.skipped++;if(!n)throw Error(`Discovery phase did not complete`);let c=CL(r,n,{sawTestnet:a,sawMainnet:o});return{url:t,discovery:n,endpoints:r,summary:s,suggestions:c}}function CL(e,t,n){let r=[],i=e.flatMap(e=>[...e.challenge,...e.payment]);t.found||r.push(rL);let a=n.sawMainnet,o=n.sawTestnet,s=i.some(e=>e.label.includes(`[stripe]`)&&e.label.includes(`livemode`));return a&&!o?r.push(`Validate your testnet server to test without real funds (Tempo wallets are automatically provisioned).`):o&&!a&&r.push(`Validate your mainnet server to confirm real payments work end-to-end.`),s&&r.push(`Validate your testmode Stripe server to test card payments end-to-end (auto-pays with test card).`),r}const wL=Object.values(Ie);function TL(e){return wL.find(t=>t.id===e)?.testnet===!0}async function EL(e,t){let n=[],r=[],i=null,a=!1,o=!1;n.push(await PI(e));let s=new URL(e).origin,c;t.discoveryPath?c=[new URL(t.discoveryPath,e+`/`).href.replace(/\/openapi\.json$/i,``)]:(c=[e,s,`${s}/api`],c=[...new Set(c)]);let l,u=[];for(let e of c)if(l=await NI(e),`error`in l)u.push(`${e}/openapi.json: ${l.error}`);else break;if(!l||`error`in l)n.push({label:`Document found`,detail:u.join(`; `),hint:`MPP servers must serve an OpenAPI document at /openapi.json with x-payment-info extensions.`,severity:`fail`});else{a=!0,n.push({label:`Document found and parseable`,severity:`pass`});let e=VT(l.doc),t=e.filter(e=>e.severity===`error`),r=e.filter(e=>e.severity===`warning`);if(t.length>0){n.push({label:`Valid OpenAPI structure`,detail:`${t.length} error(s)`,severity:`fail`});for(let e of t)n.push({label:e.message,detail:e.path,severity:`fail`})}else o=!0,n.push({label:`Valid OpenAPI structure`,severity:`pass`});for(let e of r)n.push({label:e.message,detail:e.path,severity:`warn`});i=l.doc}if(t.endpoint){let e=AI(t.endpoint);e&&r.push(e)}else if(i){r=FI(i);let e=BigInt(`999999999999999999`);r.sort((t,n)=>{let r=kI(t.amount)?BigInt(t.amount):e,i=kI(n.amount)?BigInt(n.amount):e;return r<i?-1:+(r>i)}),r.length>0?n.push({label:`Paid endpoints found`,detail:`${r.length} endpoint(s)`,severity:`pass`}):n.push({label:`Paid endpoints found`,detail:`No endpoints with x-payment-info`,severity:`warn`})}return{found:a,valid:o,endpoints:r,checks:n,doc:i}}wx(),PO();const DL=ib(`validate`,{description:`Validate an MPP server implementation end-to-end`,args:p.object({url:p.string().describe(`Base URL of the MPP server to validate`)}),options:p.object({endpoint:p.string().optional().describe(`Endpoint to test (METHOD:path). Skips discovery.`),body:p.string().optional().describe(`Request body. With --endpoint, used directly. In discovery mode, JSON with / keys is a per-path mapping.`),query:p.array(p.string()).optional().describe(`Query parameter (key=value, repeatable)`),header:p.array(p.string()).optional().describe(`Request header (key:value, repeatable)`),verbose:p.number().default(0).meta({count:!0}).describe(`Verbosity level`),yes:p.boolean().default(!1).describe(`Auto-approve mainnet payments`),outputJson:p.boolean().default(!1).describe(`Output results as JSON (auto-enabled in known agent environments)`)}),alias:{endpoint:`e`,header:`H`,verbose:`v`,yes:`y`,outputJson:`j`},async run(e){if(e.options.outputJson||hO()){let t=await SL({url:e.args.url,endpoint:e.options.endpoint,body:e.options.body,query:e.options.query,headers:e.options.header,verbose:e.options.verbose>0,yes:e.options.yes,interactive:!1});console.log(JSON.stringify(t,null,2));let n=t.endpoints.length===0&&!e.options.endpoint;(t.summary.failed>0||!t.discovery.found||n)&&process.exit(1);return}let t=e.args.url.replace(/\/$/,``).replace(/\/openapi\.json$/i,``);console.log(`\n${X.bold(`mppx validate`)} ${X.dim(t)}\n`);let n={passed:0,failed:0,warnings:0,suggested:0,skipped:0},r=!1,i=!1,a=!1,o=!1,s=!1,c=!1,l=!1,u=0;for await(let t of xL({url:e.args.url,endpoint:e.options.endpoint,body:e.options.body,query:e.options.query,headers:e.options.header,verbose:e.options.verbose>0,yes:e.options.yes,interactive:!!process.stdin.isTTY,onPaymentResults:e=>wI(e,n)}))switch(t.phase){case`discovery`:if(CI(`Discovery (/openapi.json)`),wI(t.results,n),l=t.discovery.found,!l&&!e.options.endpoint){console.log(``);let[e,...t]=rL.split(`
247
- `);console.log(X.yellow(` ${e}`));for(let e of t)console.log(e?X.dim(` ${e}`):``);console.log(``),process.exit(1)}t.discovery.endpoints.length===0&&!e.options.endpoint&&l&&(console.log(X.dim(` Use --endpoint to specify endpoints manually.`)),console.log(``),process.exit(1));break;case`endpoint`:u++,CI(`${t.endpoint.method} ${t.endpoint.path}`);break;case`challenge`:console.log(X.dim(` Challenge`)),wI(t.results,n),t.isMpp&&(r=!0,t.isTestnet&&(o=!0),t.isMainnet&&(s=!0)),t.isNonMppPayment&&(i=!0),t.isMalformedChallenge&&(a=!0);break;case`errorHandling`:console.log(X.dim(` Error Handling`)),wI(t.results,n);break;case`payment`:t.succeeded&&(c=!0)}OL(n,{sawMppEndpoint:r,sawNonMppPaymentEndpoint:i,sawMalformedChallenge:a,sawTestnet:o,sawMainnet:s,paymentSucceeded:c},u)}});function OL(e,t,n){!t.sawMppEndpoint&&n>0&&(console.log(``),t.sawMalformedChallenge?(console.log(X.yellow(` Payment scheme detected but challenge format is invalid on ${n} endpoint(s).`)),console.log(X.dim(` The server uses WWW-Authenticate: Payment but the challenge parameters do not conform to MPP.`)),console.log(X.dim(` Fix: encode payment details as base64url JSON in a request="..." parameter. See errors above.`))):t.sawNonMppPaymentEndpoint?(console.log(X.yellow(` No MPP endpoints found. Tested ${n} endpoint(s) but none use WWW-Authenticate: Payment.`)),console.log(X.dim(` This server may use x402 or another payment protocol.`))):e.skipped>0&&e.failed===0?(console.log(X.yellow(` Could not reach payment gate on any endpoint (all returned 401/403/200).`)),console.log(X.dim(` The server may require authentication before payment. Try providing auth or use --endpoint with a public path.`))):(console.log(X.yellow(` No MPP endpoints found. Tested ${n} endpoint(s) but none use WWW-Authenticate: Payment.`)),console.log(X.dim(` This server may use x402 or another payment protocol.`))),console.log(``),process.exit(1)),console.log(``);let r=[];e.passed>0&&r.push(X.green(`${e.passed} passed`)),e.failed>0&&r.push(X.red(`${e.failed} failed`)),e.warnings>0&&r.push(X.yellow(`${e.warnings} warning(s)`)),e.suggested>0&&r.push(X.cyan(`${e.suggested} suggested`)),e.skipped>0&&r.push(X.yellow(`${e.skipped} skipped`)),console.log(`${X.bold(`Summary:`)} ${r.join(`, `)}`),t.paymentSucceeded&&t.sawTestnet&&!t.sawMainnet?(console.log(``),console.log(X.dim(` Tip: also validate your mainnet server to confirm real payments work end-to-end.`))):t.sawMainnet&&!t.sawTestnet&&(console.log(``),console.log(X.dim(` Tip: also validate your testnet server for free. This CLI automatically provisions and funds a testnet wallet for testing.`))),console.log(``),e.failed>0&&process.exit(1)}function kL(e){return jL(e)?e.offers:[e]}function AL(e){let{_canonicalRequest:t,intent:n,name:r}=e,i=t.methodDetails??{},a=ML(t.amount)??ML(i.amount)??null,o=ML(t.currency)??ML(i.currency),s=ML(e.description)??ML(t.description),c={amount:a,...o?{currency:o}:{},...s?{description:s}:{},intent:n,method:r},l=new Set([`amount`,`currency`,`description`,`methodDetails`]);for(let[e,n]of Object.entries(t))!l.has(e)&&n!==void 0&&(c[e]=n);return c}function jL(e){return`offers`in e&&!(`_canonicalRequest`in e)}function ML(e){return typeof e==`string`?e:void 0}var NL=F((()=>{})),PL=Je({generate:()=>FL,generateProxy:()=>IL});function FL(e,t){let n=e.methods,r=new Map,i={};for(let e of n)r.set(`${e.name}/${e.intent}`,e),i[e.intent]=(i[e.intent]??0)+1;for(let e of n)i[e.intent]===1&&r.set(e.intent,e);let a=t.routes.map(e=>RL(e,r));return LL({info:{title:t.info?.title??e.realm,version:t.info?.version??`1.0.0`},routes:a,serviceInfo:t.serviceInfo})}function IL(e){let t=e.routes.map(t=>({...t,path:zL(e.basePath,t.path)}));return LL({info:{title:e.info?.title??`API Proxy`,version:e.info?.version??`1.0.0`},routes:t,serviceInfo:e.serviceInfo})}function LL(e){let t={};for(let n of e.routes){let e=n.method.toLowerCase(),r={responses:{...n.payment?{402:{description:`Payment Required`}}:{},200:{description:`Successful response`}}};n.payment&&(r[`x-payment-info`]=PT.parse(n.payment)),n.summary&&(r.summary=n.summary),n.requestBody&&(r.requestBody=n.requestBody),t[n.path]||(t[n.path]={}),t[n.path][e]=r}let n={info:e.info,openapi:`3.1.0`,paths:t};return e.serviceInfo&&(n[`x-service-info`]=e.serviceInfo),n}function RL(e,t){if(`handler`in e){let t=e.handler._internal;if(!t)throw Error(`Route ${e.method.toUpperCase()} ${e.path} is missing discovery metadata`);return{method:e.method,path:e.path,payment:{offers:kL(t).map(AL)},...e.requestBody?{requestBody:e.requestBody}:{},...e.summary?{summary:e.summary}:{}}}let n=t.get(e.intent);if(!n)throw Error(`Unknown intent "${e.intent}" for route ${e.method.toUpperCase()} ${e.path}. Available: ${[...t.keys()].join(`, `)}`);let{description:r,...i}=e.options,a={_canonicalRequest:Nx(n,i),...typeof r==`string`?{description:r}:{},intent:n.intent,name:n.name};return{method:e.method,path:e.path,payment:AL(a),...e.requestBody?{requestBody:e.requestBody}:{},...e.summary?{summary:e.summary}:{}}}function zL(e,t){if(!e)return t;let n=e.startsWith(`/`)?e:`/${e}`;return`${n.endsWith(`/`)?n.slice(0,-1):n}${t}`}var BL=F((()=>{Fx(),BT(),NL()}));wx(),pS(),rT(),BC(),$C(),nw(),jx(),eO(),ZC(),CS(),wC(),JO(),PO();const VL=`0.10.0`,HL=p.object({address:p.string(),isDefault:p.boolean().optional(),name:p.string(),source:p.string().optional()}),UL=p.object({address:p.string(),balances:p.array(p.string()).optional(),name:p.string(),type:p.string().optional()}),WL=p.object({message:p.string(),path:p.string(),severity:p.string()}),GL=p.object({description:p.string().optional(),id:p.string(),name:p.string().optional(),paidEndpoints:p.number(),status:p.string().optional(),url:p.string().optional()}),KL=p.object({description:p.string().optional(),method:p.string(),path:p.string(),payment:p.unknown().optional()});function qL(e){return e.format===`json`&&e.formatExplicit}function JL(e,t,n){if(qL(e))return e.ok(t);n()}async function YL(t){if(!t.body)return;let n=t.body.getReader();try{for(;;){let{done:t,value:r}=await n.read();if(t)break;process.stdout.write(Buffer.from(r))||await e(process.stdout,`drain`)}}finally{n.releaseLock()}}function XL(){return process.stdin.isTTY===!1&&process.stdin.listenerCount(`data`)===0&&process.stdin.listenerCount(`readable`)===0}function ZL(e){return typeof e==`string`?e:void 0}function QL(e){return Array.isArray(e.endpoints)?e.endpoints.filter(e=>typeof e==`object`&&!!e):[]}function $L(e){let t=QL(e);return{...ZL(e.description)?{description:ZL(e.description)}:{},id:ZL(e.id)??ZL(e.name)??`unknown`,...ZL(e.name)?{name:ZL(e.name)}:{},paidEndpoints:t.filter(e=>e.payment).length,...ZL(e.status)?{status:ZL(e.status)}:{},...ZL(e.serviceUrl)||ZL(e.url)?{url:ZL(e.serviceUrl)??ZL(e.url)}:{}}}function eR(e){return{...ZL(e.description)?{description:ZL(e.description)}:{},method:ZL(e.method)??`GET`,path:ZL(e.path)??`/`,...e.payment===void 0?{}:{payment:e.payment}}}function tR(e){if(!e)return`free`;if(typeof e!=`object`)return String(e);let t=e,n=ZL(t.amount),r=ZL(t.currency),i=ZL(t.method),a=ZL(t.intent);return[n,r,i&&a?`${i}/${a}`:i??a].filter(Boolean).join(` `)}function nR(e){return e.request.currency??e.request.asset}function rR(e,t){if(!t)return[...e];let n=t.toLowerCase();return e.filter(e=>{let t=nR(e);return typeof t==`string`&&t.toLowerCase()===n})}async function iR(e,t,n={}){let r=()=>zC().getChallenges(e),i=()=>QC().getChallenges(n.ignoreX402ResponseUrl?new Response(null,{headers:e.headers,status:e.status}):e);if(t===`mpp`)return r();if(t===`x402`)return i();let a=[],o;try{a=await r()}catch(e){o=e}let s=[],c;try{s=await i()}catch(e){c=e}if(a.length||s.length)return[...a,...s];if(o)throw o;if(c)throw c;return[]}function aR(e){return ew({name:`selected-challenge`,isPaymentRequired:e=>e.status===402,getChallenges:()=>[e],setCredential:e=>e})}function oR(e,t){if(!xS(e))return new Response(null,{status:402,headers:{[q.wwwAuthenticate]:Yx(e)}});let n=e.request;return n.resource?new Response(null,{status:402,headers:{[oC]:JC({accepts:[tC(n)],...n.extensions&&{extensions:n.extensions},resource:n.resource,x402Version:2})}}):t}function sR(e){let{host:t,hostname:n}=new URL(e);return!n.endsWith(`.localhost`)||n===`localhost`?{url:e}:{host:t,url:e.replace(n,`127.0.0.1`)}}function cR(e,t){for(let t of Object.keys(e))t.toLowerCase()===`host`&&delete e[t];t&&(e.Host=t)}function lR(e){let t=e.request.resource;return typeof t?.url==`string`?t.url:void 0}async function uR(){let e=process.env.MPPX_SERVICES_URL??`https://mpp.dev/api/services`,t=await globalThis.fetch(e);if(!t.ok)throw new I({code:`SERVICES_FETCH_FAILED`,message:`Failed to fetch services registry: HTTP ${t.status}`,exitCode:1});let n=await t.json();if(!n||typeof n!=`object`||!Array.isArray(n.services))throw new I({code:`SERVICES_INVALID`,message:`Services registry response did not contain a services array.`,exitCode:1});return n.services}function dR(e,t){let n=t.toLowerCase();return e.find(e=>{let t=ZL(e.id)?.toLowerCase(),r=ZL(e.name)?.toLowerCase();return t===n||r===n})}const fR=ib(`mppx`,{mcp:{tools:{discovery:`direct`}},version:VL,description:`Make HTTP requests with automatic payment handling`,usage:[{suffix:`<url> [options]`}],args:p.object({url:p.string().describe(`URL to make request to`)}),options:p.object({account:p.string().optional().describe(`Account name (env: MPPX_ACCOUNT)`),autoSwap:p.boolean().optional().describe(`Auto-swap source tokens into payment currency`),config:p.string().optional().describe(`Path to config file`),confirm:p.boolean().optional().default(!1).describe(`Show confirmation prompts`),currency:p.string().optional().describe(`Payment currency/token address to select`),data:p.string().optional().describe(`Send request body (implies POST unless -X is set)`),fail:p.boolean().optional().describe(`Fail silently on HTTP errors (exit 22)`),header:p.array(p.string()).optional().describe(`Add header (repeatable)`),include:p.boolean().optional().describe(`Include response headers in output`),insecure:p.boolean().optional().describe(`Skip TLS certificate verification (true for localhost/.local)`),jsonBody:p.string().optional().describe(`Send JSON body (sets Content-Type and Accept, implies POST)`),location:p.boolean().optional().describe(`Follow redirects`),method:p.string().optional().describe(`HTTP method`),methodOpt:p.array(p.string()).optional().describe(`Method-specific option (key=value, repeatable)`),network:p.enum([`mainnet`,`testnet`]).optional().describe(`Tempo network`),payWith:p.string().optional().describe(`Source token for Tempo auto-swap`),protocol:p.enum([`auto`,`mpp`,`x402`]).default(`auto`).describe(`Payment protocol to use`),rpcUrl:p.string().optional().describe(`RPC endpoint, defaults to public RPC for chain (env: MPPX_RPC_URL)`),session:p.string().optional().default(`auto`).refine(e=>e===`auto`||e===`new`||/^0x[0-9a-fA-F]{64}$/.test(e),`Expected auto, new, or a 32-byte channel ID`).describe(`Session selection: auto, new, or channel ID`),silent:p.boolean().default(!1).describe(`Silent mode (suppress progress and info)`),slippage:p.number().optional().describe(`Tempo auto-swap max slippage percentage`),userAgent:p.string().optional().default(`mppx/${VL}`).describe(`Set User-Agent header`),verbose:p.number().default(0).meta({count:!0}).describe(`Verbosity (-v details, -vv headers)`)}),alias:{account:`a`,config:`c`,data:`d`,fail:`f`,header:`H`,include:`i`,insecure:`k`,jsonBody:`J`,location:`L`,method:`X`,methodOpt:`M`,rpcUrl:`r`,silent:`s`,userAgent:`A`,verbose:`v`},examples:[{args:{url:`mpp.dev/api/ping/paid`},description:`Make a payment request`}],async run(e){let t=e.options.silent?e=>{}:e=>process.stderr.write(e),n=await $P(e.options.config);n&&e.options.verbose>=1&&t(`${X.dim(`Using config`)} ${X.blue(c.relative(process.cwd(),n.path))}\n`);let r={"User-Agent":e.options.userAgent};if(e.options.header)for(let t of e.options.header){let n=t.indexOf(`:`);if(n===-1)return e.error({code:`INVALID_HEADER`,message:`Invalid header format: ${t}`,exitCode:2});r[t.slice(0,n).trim()]=t.slice(n+1).trim()}let i=XP(n?.config);i&&!Object.keys(r).some(e=>e.toLowerCase()===`accept-payment`)&&(r[`Accept-Payment`]=i);let a=(()=>{let t=/^https?:\/\//.test(e.args.url),n=/^(localhost|.*\.localhost|127\.0\.0\.1|\[::1\])(:\d+)?/.test(e.args.url);return t?e.args.url:`${n?`http`:`https`}://${e.args.url}`})(),{hostname:o}=new URL(a),s=e.options.insecure||o===`localhost`||o.endsWith(`.localhost`)||o.endsWith(`.local`)?async(e,t)=>{let n=process.env.NODE_TLS_REJECT_UNAUTHORIZED;process.env.NODE_TLS_REJECT_UNAUTHORIZED=`0`;try{return await globalThis.fetch(e,t)}finally{n===void 0?delete process.env.NODE_TLS_REJECT_UNAUTHORIZED:process.env.NODE_TLS_REJECT_UNAUTHORIZED=n}}:globalThis.fetch,l=sR(a),u=l.url;l.host&&(r.Host=l.host);try{let i=mO(e.options.methodOpt),o=gF(),c={redirect:e.options.location?`follow`:`manual`};e.options.jsonBody?(c.body=e.options.jsonBody,r[`Content-Type`]??=`application/json`,r.Accept??=`application/json`):e.options.data&&(c.body=e.options.data),e.options.method?c.method=e.options.method.toUpperCase():c.body&&(c.method=`POST`),Object.keys(r).length>0&&(c.headers=r);let d={include:e.options.include??!1,verbose:e.options.verbose,silent:e.options.silent};e.options.verbose>=2&&cO(a,c,t);let f=await s(u,c);if(f.status!==402){if(e.options.session!==`auto`)return e.error({code:`UNSUPPORTED_SESSION`,message:`--session requires a tempo/session payment challenge.`,exitCode:2});if(e.options.fail&&f.status>=400)return e.error({code:`HTTP_ERROR`,message:`HTTP error ${f.status}`,exitCode:22});lO(f,d),await YL(f);return}let p=f.url?new URL(f.url):void 0,m=l.host!==void 0&&p?.hostname===`127.0.0.1`,h=await iR(f,e.options.protocol,{ignoreX402ResponseUrl:m});if(h.length===0)return e.error({code:`UNSUPPORTED_PROTOCOL`,message:e.options.protocol===`auto`?`Server did not offer a payment challenge.`:`Server did not offer an ${e.options.protocol} payment challenge.`,exitCode:2});let g=rR(h,e.options.currency);if(e.options.currency&&g.length===0){let t=h.map(nR).filter(e=>typeof e==`string`).join(`, `);return e.error({code:`UNSUPPORTED_CURRENCY`,message:`Server did not offer payment currency ${e.options.currency}.${t?` Offered currencies: ${t}.`:``}`,exitCode:2})}let _=ZP(n?.config)?.length?g:await uP(g,{options:{account:e.options.account,network:e.options.network,rpcUrl:e.options.rpcUrl}}),v=YP(_,n?.config);if(!v){let t=_.map(e=>`${e.method}/${e.intent}`).join(`, `);return e.error({code:`UNSUPPORTED_METHOD`,message:`Unsupported payment method. Server offers: ${t}. Add it to mppx.config.ts using defineConfig().`,exitCode:2})}let{challenge:y,plugin:b,method:x}=v,S=xS(y),C=oR(y,f),w=y.request.currency??``,T=y.request.decimals??6,ee,E;b&&(E=await b.setup({challenge:y,options:{account:e.options.account,autoSwap:e.options.autoSwap,network:e.options.network,payWith:e.options.payWith,rpcUrl:e.options.rpcUrl,slippage:e.options.slippage},methodOpts:i}),w=E.tokenSymbol,T=E.tokenDecimals,ee=E.explorerUrl);let D=!e.options.silent&&e.options.confirm,te=new Set;{lO(f,y.method===`tempo`&&y.intent===`session`&&e.options.include?{...d,include:!1,verbose:Math.max(d.verbose,2)}:d);let n=(()=>{let e=new Set([`id`,`request`]),t=[];for(let[n,r]of Object.entries(y))e.has(n)||r===void 0||t.push([n,fO(n,r)]);return t.sort(([e],[t])=>e.localeCompare(t))})(),r={tokenSymbol:w,tokenDecimals:T,explorerUrl:ee},i=(()=>{let e=new Set([`decimals`,`currency`,`methodDetails`]),t=[];for(let[n,i]of Object.entries(y.request))e.has(n)||i===void 0||t.push([n,uO(n,i,r)]);return t.sort(([e],[t])=>e.localeCompare(t))})(),a=(()=>{let e=y.request.methodDetails;if(!e)return[];let t=[];for(let[n,i]of Object.entries(e))if(i!==void 0){if(n===`memo`&&typeof i==`string`){let e=dO(i);t.push([n,e?`${e}\n${X.dim(i)}`:i])}else t.push([n,uO(n,i,r)])}return t.sort(([e],[t])=>e.localeCompare(t))})(),o=[[`Challenge`,n],[`Request`,i],...a.length?[[`Details`,a]]:[]];for(let[,e]of o)for(let[t]of e)te.add(t);let s=Math.max(...o.flatMap(([,e])=>e.map(([e])=>e.length))),c=` ${``.padEnd(s)} `;if(e.options.verbose>=1||D){t(`${X.bold(X.yellow(`Payment Required`))}\n`);for(let[e,n]of o){t(`${X.bold(e)}\n`);for(let[e,r]of n){let[n,...i]=r.split(`
247
+ `);console.log(X.yellow(` ${e}`));for(let e of t)console.log(e?X.dim(` ${e}`):``);console.log(``),process.exit(1)}t.discovery.endpoints.length===0&&!e.options.endpoint&&l&&(console.log(X.dim(` Use --endpoint to specify endpoints manually.`)),console.log(``),process.exit(1));break;case`endpoint`:u++,CI(`${t.endpoint.method} ${t.endpoint.path}`);break;case`challenge`:console.log(X.dim(` Challenge`)),wI(t.results,n),t.isMpp&&(r=!0,t.isTestnet&&(o=!0),t.isMainnet&&(s=!0)),t.isNonMppPayment&&(i=!0),t.isMalformedChallenge&&(a=!0);break;case`errorHandling`:console.log(X.dim(` Error Handling`)),wI(t.results,n);break;case`payment`:t.succeeded&&(c=!0)}OL(n,{sawMppEndpoint:r,sawNonMppPaymentEndpoint:i,sawMalformedChallenge:a,sawTestnet:o,sawMainnet:s,paymentSucceeded:c},u)}});function OL(e,t,n){!t.sawMppEndpoint&&n>0&&(console.log(``),t.sawMalformedChallenge?(console.log(X.yellow(` Payment scheme detected but challenge format is invalid on ${n} endpoint(s).`)),console.log(X.dim(` The server uses WWW-Authenticate: Payment but the challenge parameters do not conform to MPP.`)),console.log(X.dim(` Fix: encode payment details as base64url JSON in a request="..." parameter. See errors above.`))):t.sawNonMppPaymentEndpoint?(console.log(X.yellow(` No MPP endpoints found. Tested ${n} endpoint(s) but none use WWW-Authenticate: Payment.`)),console.log(X.dim(` This server may use x402 or another payment protocol.`))):e.skipped>0&&e.failed===0?(console.log(X.yellow(` Could not reach payment gate on any endpoint (all returned 401/403/200).`)),console.log(X.dim(` The server may require authentication before payment. Try providing auth or use --endpoint with a public path.`))):(console.log(X.yellow(` No MPP endpoints found. Tested ${n} endpoint(s) but none use WWW-Authenticate: Payment.`)),console.log(X.dim(` This server may use x402 or another payment protocol.`))),console.log(``),process.exit(1)),console.log(``);let r=[];e.passed>0&&r.push(X.green(`${e.passed} passed`)),e.failed>0&&r.push(X.red(`${e.failed} failed`)),e.warnings>0&&r.push(X.yellow(`${e.warnings} warning(s)`)),e.suggested>0&&r.push(X.cyan(`${e.suggested} suggested`)),e.skipped>0&&r.push(X.yellow(`${e.skipped} skipped`)),console.log(`${X.bold(`Summary:`)} ${r.join(`, `)}`),t.paymentSucceeded&&t.sawTestnet&&!t.sawMainnet?(console.log(``),console.log(X.dim(` Tip: also validate your mainnet server to confirm real payments work end-to-end.`))):t.sawMainnet&&!t.sawTestnet&&(console.log(``),console.log(X.dim(` Tip: also validate your testnet server for free. This CLI automatically provisions and funds a testnet wallet for testing.`))),console.log(``),e.failed>0&&process.exit(1)}function kL(e){return jL(e)?e.offers:[e]}function AL(e){let{_canonicalRequest:t,intent:n,name:r}=e,i=t.methodDetails??{},a=ML(t.amount)??ML(i.amount)??null,o=ML(t.currency)??ML(i.currency),s=ML(e.description)??ML(t.description),c={amount:a,...o?{currency:o}:{},...s?{description:s}:{},intent:n,method:r},l=new Set([`amount`,`currency`,`description`,`methodDetails`]);for(let[e,n]of Object.entries(t))!l.has(e)&&n!==void 0&&(c[e]=n);return c}function jL(e){return`offers`in e&&!(`_canonicalRequest`in e)}function ML(e){return typeof e==`string`?e:void 0}var NL=F((()=>{})),PL=Je({generate:()=>FL,generateProxy:()=>IL});function FL(e,t){let n=e.methods,r=new Map,i={};for(let e of n)r.set(`${e.name}/${e.intent}`,e),i[e.intent]=(i[e.intent]??0)+1;for(let e of n)i[e.intent]===1&&r.set(e.intent,e);let a=t.routes.map(e=>RL(e,r));return LL({info:{title:t.info?.title??e.realm,version:t.info?.version??`1.0.0`},routes:a,serviceInfo:t.serviceInfo})}function IL(e){let t=e.routes.map(t=>({...t,path:zL(e.basePath,t.path)}));return LL({info:{title:e.info?.title??`API Proxy`,version:e.info?.version??`1.0.0`},routes:t,serviceInfo:e.serviceInfo})}function LL(e){let t={};for(let n of e.routes){let e=n.method.toLowerCase(),r={responses:{...n.payment?{402:{description:`Payment Required`}}:{},200:{description:`Successful response`}}};n.payment&&(r[`x-payment-info`]=PT.parse(n.payment)),n.summary&&(r.summary=n.summary),n.requestBody&&(r.requestBody=n.requestBody),t[n.path]||(t[n.path]={}),t[n.path][e]=r}let n={info:e.info,openapi:`3.1.0`,paths:t};return e.serviceInfo&&(n[`x-service-info`]=e.serviceInfo),n}function RL(e,t){if(`handler`in e){let t=e.handler._internal;if(!t)throw Error(`Route ${e.method.toUpperCase()} ${e.path} is missing discovery metadata`);return{method:e.method,path:e.path,payment:{offers:kL(t).map(AL)},...e.requestBody?{requestBody:e.requestBody}:{},...e.summary?{summary:e.summary}:{}}}let n=t.get(e.intent);if(!n)throw Error(`Unknown intent "${e.intent}" for route ${e.method.toUpperCase()} ${e.path}. Available: ${[...t.keys()].join(`, `)}`);let{description:r,...i}=e.options,a={_canonicalRequest:Nx(n,i),...typeof r==`string`?{description:r}:{},intent:n.intent,name:n.name};return{method:e.method,path:e.path,payment:AL(a),...e.requestBody?{requestBody:e.requestBody}:{},...e.summary?{summary:e.summary}:{}}}function zL(e,t){if(!e)return t;let n=e.startsWith(`/`)?e:`/${e}`;return`${n.endsWith(`/`)?n.slice(0,-1):n}${t}`}var BL=F((()=>{Fx(),BT(),NL()}));wx(),pS(),rT(),BC(),$C(),nw(),jx(),eO(),ZC(),CS(),wC(),JO(),PO();const VL=`0.10.1`,HL=p.object({address:p.string(),isDefault:p.boolean().optional(),name:p.string(),source:p.string().optional()}),UL=p.object({address:p.string(),balances:p.array(p.string()).optional(),name:p.string(),type:p.string().optional()}),WL=p.object({message:p.string(),path:p.string(),severity:p.string()}),GL=p.object({description:p.string().optional(),id:p.string(),name:p.string().optional(),paidEndpoints:p.number(),status:p.string().optional(),url:p.string().optional()}),KL=p.object({description:p.string().optional(),method:p.string(),path:p.string(),payment:p.unknown().optional()});function qL(e){return e.format===`json`&&e.formatExplicit}function JL(e,t,n){if(qL(e))return e.ok(t);n()}async function YL(t){if(!t.body)return;let n=t.body.getReader();try{for(;;){let{done:t,value:r}=await n.read();if(t)break;process.stdout.write(Buffer.from(r))||await e(process.stdout,`drain`)}}finally{n.releaseLock()}}function XL(){return process.stdin.isTTY===!1&&process.stdin.listenerCount(`data`)===0&&process.stdin.listenerCount(`readable`)===0}function ZL(e){return typeof e==`string`?e:void 0}function QL(e){return Array.isArray(e.endpoints)?e.endpoints.filter(e=>typeof e==`object`&&!!e):[]}function $L(e){let t=QL(e);return{...ZL(e.description)?{description:ZL(e.description)}:{},id:ZL(e.id)??ZL(e.name)??`unknown`,...ZL(e.name)?{name:ZL(e.name)}:{},paidEndpoints:t.filter(e=>e.payment).length,...ZL(e.status)?{status:ZL(e.status)}:{},...ZL(e.serviceUrl)||ZL(e.url)?{url:ZL(e.serviceUrl)??ZL(e.url)}:{}}}function eR(e){return{...ZL(e.description)?{description:ZL(e.description)}:{},method:ZL(e.method)??`GET`,path:ZL(e.path)??`/`,...e.payment===void 0?{}:{payment:e.payment}}}function tR(e){if(!e)return`free`;if(typeof e!=`object`)return String(e);let t=e,n=ZL(t.amount),r=ZL(t.currency),i=ZL(t.method),a=ZL(t.intent);return[n,r,i&&a?`${i}/${a}`:i??a].filter(Boolean).join(` `)}function nR(e){return e.request.currency??e.request.asset}function rR(e,t){if(!t)return[...e];let n=t.toLowerCase();return e.filter(e=>{let t=nR(e);return typeof t==`string`&&t.toLowerCase()===n})}async function iR(e,t,n={}){let r=()=>zC().getChallenges(e),i=()=>QC().getChallenges(n.ignoreX402ResponseUrl?new Response(null,{headers:e.headers,status:e.status}):e);if(t===`mpp`)return r();if(t===`x402`)return i();let a=[],o;try{a=await r()}catch(e){o=e}let s=[],c;try{s=await i()}catch(e){c=e}if(a.length||s.length)return[...a,...s];if(o)throw o;if(c)throw c;return[]}function aR(e){return ew({name:`selected-challenge`,isPaymentRequired:e=>e.status===402,getChallenges:()=>[e],setCredential:e=>e})}function oR(e,t){if(!xS(e))return new Response(null,{status:402,headers:{[q.wwwAuthenticate]:Yx(e)}});let n=e.request;return n.resource?new Response(null,{status:402,headers:{[oC]:JC({accepts:[tC(n)],...n.extensions&&{extensions:n.extensions},resource:n.resource,x402Version:2})}}):t}function sR(e){let{host:t,hostname:n}=new URL(e);return!n.endsWith(`.localhost`)||n===`localhost`?{url:e}:{host:t,url:e.replace(n,`127.0.0.1`)}}function cR(e,t){for(let t of Object.keys(e))t.toLowerCase()===`host`&&delete e[t];t&&(e.Host=t)}function lR(e){let t=e.request.resource;return typeof t?.url==`string`?t.url:void 0}async function uR(){let e=process.env.MPPX_SERVICES_URL??`https://mpp.dev/api/services`,t=await globalThis.fetch(e);if(!t.ok)throw new I({code:`SERVICES_FETCH_FAILED`,message:`Failed to fetch services registry: HTTP ${t.status}`,exitCode:1});let n=await t.json();if(!n||typeof n!=`object`||!Array.isArray(n.services))throw new I({code:`SERVICES_INVALID`,message:`Services registry response did not contain a services array.`,exitCode:1});return n.services}function dR(e,t){let n=t.toLowerCase();return e.find(e=>{let t=ZL(e.id)?.toLowerCase(),r=ZL(e.name)?.toLowerCase();return t===n||r===n})}const fR=ib(`mppx`,{mcp:{tools:{discovery:`direct`}},version:VL,description:`Make HTTP requests with automatic payment handling`,usage:[{suffix:`<url> [options]`}],args:p.object({url:p.string().describe(`URL to make request to`)}),options:p.object({account:p.string().optional().describe(`Account name (env: MPPX_ACCOUNT)`),autoSwap:p.boolean().optional().describe(`Auto-swap source tokens into payment currency`),config:p.string().optional().describe(`Path to config file`),confirm:p.boolean().optional().default(!1).describe(`Show confirmation prompts`),currency:p.string().optional().describe(`Payment currency/token address to select`),data:p.string().optional().describe(`Send request body (implies POST unless -X is set)`),fail:p.boolean().optional().describe(`Fail silently on HTTP errors (exit 22)`),header:p.array(p.string()).optional().describe(`Add header (repeatable)`),include:p.boolean().optional().describe(`Include response headers in output`),insecure:p.boolean().optional().describe(`Skip TLS certificate verification (true for localhost/.local)`),jsonBody:p.string().optional().describe(`Send JSON body (sets Content-Type and Accept, implies POST)`),location:p.boolean().optional().describe(`Follow redirects`),method:p.string().optional().describe(`HTTP method`),methodOpt:p.array(p.string()).optional().describe(`Method-specific option (key=value, repeatable)`),network:p.enum([`mainnet`,`testnet`]).optional().describe(`Tempo network`),payWith:p.string().optional().describe(`Source token for Tempo auto-swap`),protocol:p.enum([`auto`,`mpp`,`x402`]).default(`auto`).describe(`Payment protocol to use`),rpcUrl:p.string().optional().describe(`RPC endpoint, defaults to public RPC for chain (env: MPPX_RPC_URL)`),session:p.string().optional().default(`auto`).refine(e=>e===`auto`||e===`new`||/^0x[0-9a-fA-F]{64}$/.test(e),`Expected auto, new, or a 32-byte channel ID`).describe(`Session selection: auto, new, or channel ID`),silent:p.boolean().default(!1).describe(`Silent mode (suppress progress and info)`),slippage:p.number().optional().describe(`Tempo auto-swap max slippage percentage`),userAgent:p.string().optional().default(`mppx/${VL}`).describe(`Set User-Agent header`),verbose:p.number().default(0).meta({count:!0}).describe(`Verbosity (-v details, -vv headers)`)}),alias:{account:`a`,config:`c`,data:`d`,fail:`f`,header:`H`,include:`i`,insecure:`k`,jsonBody:`J`,location:`L`,method:`X`,methodOpt:`M`,rpcUrl:`r`,silent:`s`,userAgent:`A`,verbose:`v`},examples:[{args:{url:`mpp.dev/api/ping/paid`},description:`Make a payment request`}],async run(e){let t=e.options.silent?e=>{}:e=>process.stderr.write(e),n=await $P(e.options.config);n&&e.options.verbose>=1&&t(`${X.dim(`Using config`)} ${X.blue(c.relative(process.cwd(),n.path))}\n`);let r={"User-Agent":e.options.userAgent};if(e.options.header)for(let t of e.options.header){let n=t.indexOf(`:`);if(n===-1)return e.error({code:`INVALID_HEADER`,message:`Invalid header format: ${t}`,exitCode:2});r[t.slice(0,n).trim()]=t.slice(n+1).trim()}let i=XP(n?.config);i&&!Object.keys(r).some(e=>e.toLowerCase()===`accept-payment`)&&(r[`Accept-Payment`]=i);let a=(()=>{let t=/^https?:\/\//.test(e.args.url),n=/^(localhost|.*\.localhost|127\.0\.0\.1|\[::1\])(:\d+)?/.test(e.args.url);return t?e.args.url:`${n?`http`:`https`}://${e.args.url}`})(),{hostname:o}=new URL(a),s=e.options.insecure||o===`localhost`||o.endsWith(`.localhost`)||o.endsWith(`.local`)?async(e,t)=>{let n=process.env.NODE_TLS_REJECT_UNAUTHORIZED;process.env.NODE_TLS_REJECT_UNAUTHORIZED=`0`;try{return await globalThis.fetch(e,t)}finally{n===void 0?delete process.env.NODE_TLS_REJECT_UNAUTHORIZED:process.env.NODE_TLS_REJECT_UNAUTHORIZED=n}}:globalThis.fetch,l=sR(a),u=l.url;l.host&&(r.Host=l.host);try{let i=mO(e.options.methodOpt),o=gF(),c={redirect:e.options.location?`follow`:`manual`};e.options.jsonBody?(c.body=e.options.jsonBody,r[`Content-Type`]??=`application/json`,r.Accept??=`application/json`):e.options.data&&(c.body=e.options.data),e.options.method?c.method=e.options.method.toUpperCase():c.body&&(c.method=`POST`),Object.keys(r).length>0&&(c.headers=r);let d={include:e.options.include??!1,verbose:e.options.verbose,silent:e.options.silent};e.options.verbose>=2&&cO(a,c,t);let f=await s(u,c);if(f.status!==402){if(e.options.session!==`auto`)return e.error({code:`UNSUPPORTED_SESSION`,message:`--session requires a tempo/session payment challenge.`,exitCode:2});if(e.options.fail&&f.status>=400)return e.error({code:`HTTP_ERROR`,message:`HTTP error ${f.status}`,exitCode:22});lO(f,d),await YL(f);return}let p=f.url?new URL(f.url):void 0,m=l.host!==void 0&&p?.hostname===`127.0.0.1`,h=await iR(f,e.options.protocol,{ignoreX402ResponseUrl:m});if(h.length===0)return e.error({code:`UNSUPPORTED_PROTOCOL`,message:e.options.protocol===`auto`?`Server did not offer a payment challenge.`:`Server did not offer an ${e.options.protocol} payment challenge.`,exitCode:2});let g=rR(h,e.options.currency);if(e.options.currency&&g.length===0){let t=h.map(nR).filter(e=>typeof e==`string`).join(`, `);return e.error({code:`UNSUPPORTED_CURRENCY`,message:`Server did not offer payment currency ${e.options.currency}.${t?` Offered currencies: ${t}.`:``}`,exitCode:2})}let _=ZP(n?.config)?.length?g:await uP(g,{options:{account:e.options.account,network:e.options.network,rpcUrl:e.options.rpcUrl}}),v=YP(_,n?.config);if(!v){let t=_.map(e=>`${e.method}/${e.intent}`).join(`, `);return e.error({code:`UNSUPPORTED_METHOD`,message:`Unsupported payment method. Server offers: ${t}. Add it to mppx.config.ts using defineConfig().`,exitCode:2})}let{challenge:y,plugin:b,method:x}=v,S=xS(y),C=oR(y,f),w=y.request.currency??``,T=y.request.decimals??6,ee,E;b&&(E=await b.setup({challenge:y,options:{account:e.options.account,autoSwap:e.options.autoSwap,network:e.options.network,payWith:e.options.payWith,rpcUrl:e.options.rpcUrl,slippage:e.options.slippage},methodOpts:i}),w=E.tokenSymbol,T=E.tokenDecimals,ee=E.explorerUrl);let D=!e.options.silent&&e.options.confirm,te=new Set;{lO(f,y.method===`tempo`&&y.intent===`session`&&e.options.include?{...d,include:!1,verbose:Math.max(d.verbose,2)}:d);let n=(()=>{let e=new Set([`id`,`request`]),t=[];for(let[n,r]of Object.entries(y))e.has(n)||r===void 0||t.push([n,fO(n,r)]);return t.sort(([e],[t])=>e.localeCompare(t))})(),r={tokenSymbol:w,tokenDecimals:T,explorerUrl:ee},i=(()=>{let e=new Set([`decimals`,`currency`,`methodDetails`]),t=[];for(let[n,i]of Object.entries(y.request))e.has(n)||i===void 0||t.push([n,uO(n,i,r)]);return t.sort(([e],[t])=>e.localeCompare(t))})(),a=(()=>{let e=y.request.methodDetails;if(!e)return[];let t=[];for(let[n,i]of Object.entries(e))if(i!==void 0){if(n===`memo`&&typeof i==`string`){let e=dO(i);t.push([n,e?`${e}\n${X.dim(i)}`:i])}else t.push([n,uO(n,i,r)])}return t.sort(([e],[t])=>e.localeCompare(t))})(),o=[[`Challenge`,n],[`Request`,i],...a.length?[[`Details`,a]]:[]];for(let[,e]of o)for(let[t]of e)te.add(t);let s=Math.max(...o.flatMap(([,e])=>e.map(([e])=>e.length))),c=` ${``.padEnd(s)} `;if(e.options.verbose>=1||D){t(`${X.bold(X.yellow(`Payment Required`))}\n`);for(let[e,n]of o){t(`${X.bold(e)}\n`);for(let[e,r]of n){let[n,...i]=r.split(`
248
248
  `);t(` ${X.dim(e.padEnd(s))} ${n}\n`);for(let e of i)t(`${c}${e}\n`)}}}if(D&&(t(`
249
249
  `),!await vO(`Proceed with ${y.intent}?`,!0))){t(`Aborted.
250
250
  `);return}}let ne=process.env.MPPX_PRIVATE_KEY?.trim()||!gO(VO(e.options.account));if(yD(y)&&ne&&!x){try{await vI({challenge:y,challengeResponse:C,credentialContext:await qP(y,n?.config.extensions,E?.credentialContext),endpoint:a,fetch:s,fetchInput:u,init:c,info:t,methodOptions:i,options:{account:e.options.account,fail:e.options.fail,include:e.options.include,network:e.options.network,rpcUrl:e.options.rpcUrl,session:e.options.session,silent:e.options.silent,verbose:e.options.verbose},registry:o})}catch(e){return oI(e,`SESSION_REQUEST_FAILED`)}return}if(e.options.session!==`auto`)return e.error({code:`UNSUPPORTED_SESSION`,message:x&&yD(y)?`--session cannot override a configured session method. Configure its channelStore instead.`:`--session requires a tempo/session payment challenge.`,exitCode:2});let k=x&&yD(y)?void 0:await qP(y,n?.config.extensions,E?.credentialContext),A,j;if(x&&yD(y)){let e=C;A=await cT({methods:[x],polyfill:!1,async onChallenge(e,{createCredential:t}){let r=await qP(e,n?.config.extensions,E?.credentialContext);return tF(y,e),t(r)},fetch:async(t,n)=>{if(e){let t=e;return e=void 0,t}return s(t,n)}}).fetch(u,{...c,context:k})}else{if(E?.createCredential)j=await E.createCredential(C,k);else if(E)j=await cT({methods:E.methods,polyfill:!1,transport:aR(y)}).createCredential(C,k);else if(x)j=await cT({methods:[x],polyfill:!1,transport:aR(y)}).createCredential(C,k);else throw Error(`unreachable`);let n=S?sC:cS(y),r={...yw(c.headers),[n]:j},i=S?sR((lR(y)??f.url)||a):l;S&&cR(r,i.host),b?.prepareCredentialRequest?.({challenge:y,credential:j,headers:r});let o={...c,...S&&{redirect:`manual`},headers:r};e.options.verbose>=2&&cO(i.url,o,t),A=await s(i.url,o)}if(e.options.fail&&A.status>=400)return e.error({code:`HTTP_ERROR`,message:`HTTP error ${A.status}`,exitCode:22});if(A.status===402){let n=await A.text();t(`${X.bold(X.red(`Payment Rejected`))}\n`);try{let e=JSON.parse(n),r=[];for(let[t,n]of Object.entries(e))n!==void 0&&r.push([t,String(n)]);r.sort(([e],[t])=>e.localeCompare(t));let i=Math.max(...r.map(([e])=>e.length));for(let[e,n]of r)t(` ${X.dim(e.padEnd(i))} ${n}\n`)}catch{n&&t(` ${n}\n`)}return e.error({code:`PAYMENT_REJECTED`,message:`Payment rejected`,exitCode:75})}if(lO(A,d),!(j&&await b?.handleResponse?.({challenge:y,credential:j,response:A,fetchUrl:u,fetchInit:c,silent:e.options.silent,verbose:e.options.verbose,confirmEnabled:D,confirm:vO,tokenSymbol:w,tokenDecimals:T,explorerUrl:ee,shownKeys:te}))){let n=A.headers.get(q.paymentReceipt);if(n&&e.options.verbose>=1)try{let e=JSON.parse(O.toString(n));t(`\n${X.bold(X.green(`Payment Receipt`))}\n`);let r=[],i=e.channelId,a=e.reference,o=i&&a&&i===a,s=new Set([`acceptedCumulative`,`spent`]);for(let[t,n]of Object.entries(e)){if(n===void 0||te.has(t)||t===`reference`&&o)continue;let e=b?.formatReceiptField?.(t,n);e===void 0?s.has(t)&&typeof n==`string`?r.push([t,`${n} ${X.dim(`(${yO(BigInt(n),w,T)})`)}`]):(t===`reference`||t===`txHash`)&&typeof n==`string`&&ee?r.push([t,pO(`${ee}/tx/${n}`,n)]):r.push([t,String(n)]):r.push([t,e])}r.sort(([e],[t])=>e.localeCompare(t));let c=Math.max(...r.map(([e])=>e.length));for(let[e,n]of r)t(` ${X.dim(e.padEnd(c))} ${n}\n`);t(`
@@ -24,18 +24,23 @@ export type PreparedPayment<methods extends readonly Method.AnyClient[] = readon
24
24
  /** Attaches a credential using the protocol that produced the selected challenge. */
25
25
  setCredential: (request: Transport.RequestOf<transport>, credential: string) => Transport.RequestOf<transport>;
26
26
  }>;
27
- /** A payment challenge prepared together with the exact HTTP request that produced it. */
28
- export type PreparedRequest<methods extends readonly Method.AnyClient[]> = Readonly<PreparedPayment<methods, Transport.Transport<RequestInit, Response>> & {
29
- /** Exact request that returned the selected payment challenge. */
27
+ /** An HTTP request prepared together with its response and optional payment. */
28
+ export type PreparedRequest<methods extends readonly Method.AnyClient[], requirePayment extends boolean = false> = Readonly<{
29
+ /** Exact request that produced {@link response}. */
30
30
  request: Request;
31
- /** Payment-required response returned for {@link request}. */
31
+ /** Response returned for {@link request}. */
32
32
  response: Response;
33
- /** Redirects followed before receiving the payment challenge. */
33
+ /** Redirects followed before receiving {@link response}. */
34
34
  redirects: readonly PreparedRequest.Redirect[];
35
- /** Creates and sends a credential to the prepared request without following redirects. */
36
- pay: (context?: AnyContextFor<methods> | undefined) => Promise<Response>;
35
+ /** Selected payment when the response requires payment. */
36
+ payment: requirePayment extends true ? PreparedRequest.Payment<methods> : PreparedRequest.Payment<methods> | undefined;
37
37
  }>;
38
38
  export declare namespace PreparedRequest {
39
+ /** A request-bound payment that can be inspected or paid. */
40
+ type Payment<methods extends readonly Method.AnyClient[]> = Readonly<PreparedPayment<methods, Transport.Transport<RequestInit, Response>> & {
41
+ /** Creates and sends a credential to the prepared request without following redirects. */
42
+ pay: (context?: AnyContextFor<methods> | undefined) => Promise<Response>;
43
+ }>;
39
44
  /** A redirect followed while discovering a payment challenge. */
40
45
  type Redirect = Readonly<{
41
46
  from: string;
@@ -70,11 +75,17 @@ export type Mppx<methods extends Methods = Methods, transport extends Transport.
70
75
  */
71
76
  preparePayment: (response: Transport.ResponseOf<transport>, options?: preparePayment.Options<FlattenMethods<methods>, transport> | undefined) => Promise<PreparedPayment<FlattenMethods<methods>, transport>>;
72
77
  /**
73
- * Follows safe pre-payment redirects and prepares the challenge with the exact request that
74
- * produced it. Credential-bearing requests never follow redirects. Requires a runtime that
75
- * exposes manual redirect responses; browsers return opaque redirects and are not supported.
78
+ * Follows safe pre-payment redirects and returns the response with its exact request. When the
79
+ * response requires payment, prepares its selected challenge without creating a credential.
80
+ * Credential-bearing requests never follow redirects. Requires a runtime that exposes manual
81
+ * redirect responses; browsers return opaque redirects and are not supported.
76
82
  */
77
- prepareRequest: transport extends Transport.Transport<RequestInit, Response> ? (input: RequestInfo | URL, init?: RequestInit | undefined, options?: prepareRequest.Options<FlattenMethods<methods>> | undefined) => Promise<PreparedRequest<FlattenMethods<methods>>> : never;
83
+ prepareRequest: transport extends Transport.Transport<RequestInit, Response> ? {
84
+ <const requirePayment extends boolean>(input: RequestInfo | URL, init: RequestInit | undefined, options: prepareRequest.Options<FlattenMethods<methods>, requirePayment> & {
85
+ requirePayment: requirePayment;
86
+ }): Promise<PreparedRequest<FlattenMethods<methods>, requirePayment>>;
87
+ (input: RequestInfo | URL, init?: RequestInit | undefined, options?: prepareRequest.Options<FlattenMethods<methods>> | undefined): Promise<PreparedRequest<FlattenMethods<methods>>>;
88
+ } : never;
78
89
  /** Creates a credential from a payment-required response by routing to the correct method. */
79
90
  createCredential: (response: Transport.ResponseOf<transport>, context?: AnyContextFor<FlattenMethods<methods>> | undefined, options?: createCredential.Options<FlattenMethods<methods>, transport> | undefined) => Promise<string>;
80
91
  /** Register a client event handler by canonical event name. */
@@ -116,9 +127,11 @@ export declare namespace preparePayment {
116
127
  }
117
128
  export declare namespace prepareRequest {
118
129
  /** Options for preparing a request-bound payment. */
119
- type Options<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[]> = Omit<preparePayment.Options<methods, Transport.Transport<RequestInit, Response>>, 'request'> & {
130
+ type Options<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[], requirePayment extends boolean = false> = Omit<preparePayment.Options<methods, Transport.Transport<RequestInit, Response>>, 'request'> & {
120
131
  /** Maximum redirects followed before rejecting the request. @default 20 */
121
132
  maxRedirects?: number | undefined;
133
+ /** Throw when the response does not require payment. @default false */
134
+ requirePayment?: requirePayment | undefined;
122
135
  };
123
136
  }
124
137
  export declare namespace createCredential {