@oracle-agent/oracle 0.35.40 → 0.35.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-sessions.mjs +17 -17
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-data-mcp.mjs +19 -19
- package/dist/bin/oracle-gateway.mjs +44 -44
- package/dist/bin/oracle-investigate.mjs +5 -5
- package/dist/bin/oracle-launch-radar-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-arb-shadow.mjs +6 -6
- package/dist/bin/oracle-mev-shadow.mjs +6 -6
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +31 -31
- package/dist/bin/oracle-scan.mjs +11 -11
- package/dist/bin/oracle.mjs +1 -1
- package/dist/cli/commands/agent-session.mjs +20 -20
- package/dist/cli/commands/airdrop.mjs +8 -8
- package/dist/cli/commands/auth.mjs +5 -5
- package/dist/cli/commands/chat.mjs +218 -217
- package/dist/cli/commands/doctor.mjs +9 -9
- package/dist/cli/commands/eval.mjs +204 -217
- package/dist/cli/commands/extension-policy.mjs +3 -3
- package/dist/cli/commands/farm.mjs +17 -17
- package/dist/cli/commands/follow.mjs +17 -17
- package/dist/cli/commands/harness.mjs +7 -7
- package/dist/cli/commands/mint.mjs +10 -10
- package/dist/cli/commands/model.mjs +222 -221
- package/dist/cli/commands/portfolio-risk.mjs +1 -1
- package/dist/cli/commands/project.mjs +7 -7
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/receipt.mjs +12 -12
- package/dist/cli/commands/resolve.mjs +7 -7
- package/dist/cli/commands/setup.mjs +13 -13
- package/dist/cli/commands/sign.mjs +4 -4
- package/dist/cli/commands/signer.mjs +14 -14
- package/dist/cli/commands/snipe.mjs +9 -9
- package/dist/cli/commands/strategy.mjs +4 -4
- package/dist/cli/commands/swap.mjs +14 -14
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/cli/project-access.mjs +3 -0
- package/dist/data/desk-data.mjs +26 -26
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +44 -44
- package/dist/investigator/index.mjs +2 -2
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +2 -2
- package/dist/local-signer/runtime.mjs +8 -8
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +8 -8
- package/dist/portfolio-risk.mjs +1 -1
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +4 -4
- package/dist/strategy/index.mjs +3 -3
- package/dist/tui/standalone-client.mjs +86 -85
- package/package.json +5 -4
- package/public/eval-report.json +1 -1
- package/public/oracle-splash/_variants/ice.html +2 -4
- package/public/oracle-splash/_variants/ivory.html +2 -4
- package/public/oracle-splash/assets/fonts/LICENSE-Cormorant-Garamond.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-IBM-Plex-Mono.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-Outfit.txt +93 -0
- package/public/oracle-splash/assets/fonts/LICENSE-UnifrakturCook.txt +94 -0
- package/public/oracle-splash/assets/fonts/font-provenance.json +426 -0
- package/public/oracle-splash/assets/fonts/oracle-font-00.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-01.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-02.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-03.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-04.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-05.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-06.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-07.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-08.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-09.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-10.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-11.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-12.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-13.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-14.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-15.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-16.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-17.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-18.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-19.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-20.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-21.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-22.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-23.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-24.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-25.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-26.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-font-27.woff2 +0 -0
- package/public/oracle-splash/assets/fonts/oracle-fonts.css +504 -0
- package/public/oracle-splash/assets/transport-probe-sw.js +2 -0
- package/public/oracle-splash/docs/browser-and-web/index.html +6 -6
- package/public/oracle-splash/docs/connectors/index.html +5 -5
- package/public/oracle-splash/docs/docs.css +4 -4
- package/public/oracle-splash/docs/docs.js +119 -7
- package/public/oracle-splash/docs/getting-started/index.html +5 -5
- package/public/oracle-splash/docs/index.html +6 -6
- package/public/oracle-splash/docs/reference/index.html +5 -5
- package/public/oracle-splash/docs/security/index.html +5 -5
- package/public/oracle-splash/docs/using-oracle/index.html +5 -5
- package/public/oracle-splash/download/index.html +8 -10
- package/public/oracle-splash/downloads/index.html +3 -5
- package/public/oracle-splash/eval/archive/oracle-0.35.40.json +101 -0
- package/public/oracle-splash/eval/archive/oracle-0.35.41-blocked-attempt.json +672 -0
- package/public/oracle-splash/eval/index.html +104 -0
- package/public/oracle-splash/eval/releases/oracle-0.35.41.json +788 -0
- package/public/oracle-splash/index.html +16 -18
- package/public/oracle-splash/mesh-graph.svg +1 -1
- package/public/oracle-splash/pricing/index.html +6 -8
- package/public/oracle-splash/security/index.html +3 -5
- package/public/oracle-splash/what-it-does/index.html +4 -6
- package/public/oracle-splash/where-it-works/index.html +3 -5
- package/server.json +2 -2
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import{createHash as it}from"node:crypto";import{Interface as Se,encodeBytes32String as at,formatUnits as ct,isAddress as lt}from"ethers";import{createHash as Le}from"node:crypto";import{types as _}from"node:util";import U from"node:net";import Ie from"node:dns";var He=new Set(["localhost","metadata.google.internal","metadata.goog"]);function W(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=o=>{if(!o)return[];let c=o.split(":"),d=c.at(-1);if(d?.includes(".")){let h=d.split(".").map(Number);if(h.length!==4||h.some(m=>!Number.isInteger(m)||m<0||m>255))return null;c.splice(c.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return c.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:c.map(h=>Number.parseInt(h,16))},[n,i]=e.split("::"),f=r(n),s=r(i);if(!f||!s)return null;let l=e.includes("::"),a=8-f.length-s.length;if(!l&&a!==0||l&&a<1)return null;let u=[...f,...Array(Math.max(0,a)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(o=>[o>>8,o&255]))}function Q(t,e,r){let n=Math.floor(r/8),i=r%8;for(let s=0;s<n;s+=1)if(t[s]!==e[s])return!1;if(!i)return!0;let f=255<<8-i;return(t[n]&f)===(e[n]&f)}function ee(t){if(U.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(U.isIPv6(t)){let e=W(t);if(!e)return!1;let r=W("::ffff:0:0");return Q(e,r,96)?ee([...e.slice(12)].join(".")):Q(e,W("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([i,f])=>Q(e,W(i),f)):!1}return!1}function _e(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(He.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=U.isIP(r);return n!==0&&!ee(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function te(t,{lookupFn:e=Ie.promises.lookup}={}){let r=_e(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:U.isIPv6(r.host)?6:4}]};let n;try{n=await e(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(i=>!ee(i.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function re({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let c=await e();r=c.Agent,n=c.fetch}catch(c){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${c?.message||c}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let i=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),f=new Map,s=c=>(Array.isArray(c)?c:[c]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(U.isIPv6(d.address)?6:4)})),l=(c,d,h)=>{f.set(i(c),s(typeof d=="string"?[{address:d,family:h}]:d))},a=c=>{let d=i(c);if(U.isIP(d))return[{address:d,family:U.isIPv6(d)?6:4}];let h=f.get(d);if(!h||!h.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return h},u=new r({connect:{lookup(c,d,h){let m;try{m=a(c)}catch(O){return h(O)}return d?.all?h(null,m):h(null,m[0].address,m[0].family)}}}),o=Ce((c,d={})=>n(c,{...d,dispatcher:u}),l);return{dispatcher:u,fetch:o,pin:l,resolve:a,async close(){try{await u.destroy()}catch{}}}}var ne=Symbol.for("oracle.egressGuard.pinCapableFetch");function Ce(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[ne]=Object.freeze({pin:e}),t}function oe(t){return typeof t=="function"&&typeof t[ne]?.pin=="function"}function pe(t,e,r){if(!oe(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[ne].pin(e,r)}var Fe=new Set([408,425,429,500,502,503,504]),he=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ne=2,me=4e3,Me=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Ue=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,De=AbortSignal.prototype.throwIfAborted,Be=EventTarget.prototype.addEventListener,ye=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,ae=t=>t?Me.call(t):!1,ze=t=>t?Ue.call(t):void 0,Je=new Set([301,302,303,307,308]),K=3,Rt=64*1024,H=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function T(t){return L(`HTTP JSON body refused: ${t}`)}function Ge(t){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(e=>typeof _[e]=="function"&&_[e](t))}function Ve(t){let e=[],r=0,n=0,i=0,f=0,s=new WeakSet,l=o=>{if(r+=Buffer.byteLength(o,"utf8"),r>H.bytes)throw T("serialized byte limit exceeded");e.push(o)},a=o=>{if(Buffer.byteLength(o,"utf8")>H.bytes)throw T("serialized byte limit exceeded");return JSON.stringify(o)},u=(o,c)=>{if(n+=1,n>H.nodes)throw T("node limit exceeded");if(c>H.depth)throw T("depth limit exceeded");if(o===null){l("null");return}if(typeof o=="string"){l(a(o));return}if(typeof o=="boolean"){l(o?"true":"false");return}if(typeof o=="number"){if(!Number.isFinite(o))throw T("non-finite number");l(Object.is(o,-0)?"0":String(o));return}if(typeof o!="object")throw T("unsupported non-JSON value");if(_.isProxy(o))throw T("proxy value");if(Ge(o))throw T("unsupported exotic object");if(s.has(o))throw T("cyclic value");s.add(o);try{if(Object.getOwnPropertySymbols(o).length>0)throw T("symbol-keyed fields are unsupported");if(Array.isArray(o)){let m=Object.getPrototypeOf(o),O=0;for(;m!==null;){if(_.isProxy(m))throw T("proxy array prototype");if(O+=1,O>H.depth)throw T("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(o.length>H.arrayLength)throw T("array length limit exceeded");for(let j=0;j<o.length;j+=1){let v=Object.getOwnPropertyDescriptor(o,String(j));if(!v||!Object.hasOwn(v,"value")||v.enumerable!==!0)throw T("array entries must be dense enumerable own data")}let P=0;for(let j in o){if(f+=1,f>H.fields)throw T("enumeration limit exceeded");if(Object.hasOwn(o,j)&&(P+=1,P>o.length))throw T("named array fields are unsupported")}if(P!==o.length)throw T("array entries must be dense enumerable own data");l("[");for(let j=0;j<o.length;j+=1)j&&l(","),u(Object.getOwnPropertyDescriptor(o,String(j)).value,c+1);l("]");return}let d=Object.getPrototypeOf(o);if(d!==Object.prototype&&d!==null)throw T("non-plain object");let h=[];for(let m in o){if(f+=1,f>H.fields)throw T("enumeration limit exceeded");if(!Object.hasOwn(o,m))continue;if(i+=1,i>H.fields)throw T("field limit exceeded");let O=Object.getOwnPropertyDescriptor(o,m);if(!O||!Object.hasOwn(O,"value")||O.enumerable!==!0)throw T("object fields must be enumerable own data");h.push([m,O.value])}l("{");for(let m=0;m<h.length;m+=1)m&&l(","),l(a(h[m][0])),l(":"),u(h[m][1],c+1);l("}")}finally{s.delete(o)}};return u(t,0),e.join("")}function We(t){let e=Object.create(null);if(t==null)return e;if(typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP headers must be an object");if(_.isProxy(t))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(t)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let i=n.toLowerCase();if(r.has(i))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(i);let f=Object.getOwnPropertyDescriptor(t,n);if(!f||!Object.hasOwn(f,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=f.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");e[n]=String(s)}return e}function Ze(){return Object.assign(Object.create(null),{Accept:"application/json"})}function Ke(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function Ye(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var se=new Map,we=new WeakMap,be=1;function Z(t){if((typeof t!="object"||t===null)&&typeof t!="function")return`${typeof t}:${String(t)}`;let e=we.get(t);return e||(e=be,be+=1,we.set(t,e)),`reference:${e}`}var qe=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Xe=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function ge(t){if(!t||typeof t!="object"||Array.isArray(t)||!Object.hasOwn(t,"jsonrpc")||!Object.hasOwn(t,"method")||t.jsonrpc!=="2.0")return!1;let e=typeof t.method=="string"?t.method:"";return e?qe.has(e)||/^get[A-Z0-9_]/u.test(e)||/^is[A-Z0-9_]/u.test(e)||/^eth_get[A-Z0-9_]/u.test(e):!1}function Te(t,e){if(t==="GET"&&e==null)return!0;if(t!=="POST"||e==null)return!1;let r=e;if(typeof e=="string")try{r=JSON.parse(e)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(ge);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return ge(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&Xe.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function Qe(t,e,r,n={},i=null){let f=Le("sha256"),s=(a,u)=>{let o=String(u);f.update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a),f.update("=").update(String(Buffer.byteLength(o,"utf8"))).update(":").update(o).update(`
|
|
2
|
-
`)};s("method",t),s("url",e),Object.keys(r||{}).map((a,u)=>({name:a.toLowerCase(),order:u,value:String(r[a])})).sort((a,u)=>a.name.localeCompare(u.name)||a.order-u.order).forEach((a,u)=>{s(`header-name-${u}`,a.name),s(`header-value-${u}`,a.value)}),s("body",i??"-");for(let a of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${a}`,n[a]??"-");return f.digest("hex")}function et(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,me):Math.min(250*2**t,me)+Math.floor(Math.random()*100)}var tt=t=>new Promise(e=>setTimeout(e,t));function L(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function ie(t,e,r){return L(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function D(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function rt(t){return t?t.byteLength??t.length??0:0}async function nt(t,e,{url:r,truncate:n=!1,onOversize:i}={}){if(e==null)return await t.text();let f=Number(t.headers?.get?.("content-length"));if(Number.isFinite(f)&&f>e&&(D(t),!n))throw ie(r,`content-length ${f}`,e);let s=t.body?.getReader?.();if(!s){let c=await t.text(),d=Buffer.byteLength(c,"utf8");if(d>e){if(!n)throw ie(r,`body ${d} bytes`,e);return Buffer.from(c,"utf8").subarray(0,e).toString("utf8")}return c}let l=[],a=0,u=!1;try{for(;;){let{value:c,done:d}=await s.read();if(d)break;if(c&&(l.push(Buffer.from(c)),a+=rt(c),a>e)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof i=="function"&&i(),!n))throw ie(r,`streamed ${a} bytes`,e);let o=Buffer.concat(l);return(u?o.subarray(0,e):o).toString("utf8")}function ot(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function st(t,{fetchImpl:e,method:r,headers:n,body:i,timeoutMs:f,lookupFn:s,realFetch:l,untrustedUrl:a=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:o=!1,importUndici:c,validateResponse:d,signal:h,redirectPolicy:m="follow",maxRedirects:O=K}){let P=new AbortController,j=setTimeout(()=>P.abort(),f),v=h?ye?ye([h,P.signal]):h:P.signal,g=null,R=e,B=s?{lookupFn:s}:{};if(a&&!l&&!oe(R))throw L(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let J=async(y,{status:A=null}={})=>{let E=await te(y,B);if(!E.ok)throw L(A==null?`HTTP refused ${y}: ${E.error}`:`HTTP redirect to ${y} ${E.error}`,A==null?{}:{status:A});let C=new URL(y).hostname;if(l){if(g&&(await g.close(),g=null),!g)try{g=await re({requireUndici:!0,...c?{importUndici:c}:{}})}catch(p){throw L(A==null?`HTTP refused ${y}: ${p?.message||p}`:`HTTP redirect to ${y} refused: ${p?.message||p}`,A==null?{}:{status:A})}g.pin(C,E.addresses),R=g.fetch}else pe(R,C,E.addresses);return E};try{let y=String(t),A=Object.assign(Object.create(null),n||{});a&&await J(y);for(let E=0;E<=O;E+=1){let C=Object.assign(Object.create(null),{method:r,headers:A,body:i,signal:v,redirect:"manual",dispatcher:void 0}),p=await R(y,C);if((m==="error"||O===0)&&p.status>=300&&p.status<400)throw D(p),L(`HTTP ${p.status} ${r} redirect refused`,{status:p.status,redirectRefused:!0});if(Je.has(p.status)){let x=o===!0&&r==="POST"&&[307,308].includes(p.status)&&Te(r,i);if(r!=="GET"&&r!=="HEAD"&&!x){D(p);let S=new Error(`HTTP ${p.status} ${r} ${y} redirected non-idempotent request`);throw S.status=p.status,S}if(E===O)throw D(p),L(`HTTP ${p.status} ${r} redirect budget exhausted`,{status:p.status,redirectRefused:!0});let fe=p.headers?.get?.("location"),k;try{k=Ke(fe,y)}catch(S){throw D(p),S}let N=!Ye(k,y);if(D(p),N&&r==="POST"){let S=new Error(`HTTP ${p.status} ${r} cross-origin redirect refused`);throw S.status=p.status,S}if(N&&o){let S=new Error(`HTTP ${p.status} ${r} cross-origin redirect refused`);throw S.status=p.status,S.retryable=!1,S}if(N&&(A=Ze(A)),a)await J(k,{status:p.status});else if(N){let S=await te(k,B);if(!S.ok){let b=new Error(`HTTP redirect from ${y} ${S.error}`);throw b.status=p.status,b.retryable=!1,b}l&&S.addresses?.length&&(g||(g=await re(c?{importUndici:c}:{})),g&&(g.pin(new URL(k).hostname,S.addresses),R=g.fetch))}y=k;continue}if(typeof d=="function")try{await d(p,{url:y})}catch(x){throw D(p),L(x?.message||String(x))}let $=await nt(p,u,{url:y,onOversize:()=>P.abort()}),G=ot($);if(!p.ok){let x=new Error(`HTTP ${p.status} ${r} ${y}`);throw x.status=p.status,x.retryAfter=p.headers?.get?.("retry-after")??null,x.body=G??$.slice(0,300),x}return G??$}throw new Error(`HTTP redirect loop for ${t}`)}catch(y){if(P.signal.aborted&&!ae(h)){let A=y&&(typeof y=="object"||typeof y=="function")&&!_.isProxy(y)?y:null,E=A?Object.getOwnPropertyDescriptor(A,"oversize"):null;if(!(E&&Object.hasOwn(E,"value")&&E.value===!0))try{if(!A)throw new TypeError("unsafe rejection");Object.defineProperties(A,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let p=new Error("HTTP request timed out");throw Object.defineProperties(p,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),p}}throw y}finally{clearTimeout(j),g&&await g.close()}}async function ce(t,e={}){if(e!=null&&typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP options must be an object");if(e!=null&&_.isProxy(e))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(e!=null){if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP options contain unknown fields");for(let b of Object.getOwnPropertyNames(e)){let w=Object.getOwnPropertyDescriptor(e,b);if(!(b==="toJSON"&&w&&Object.hasOwn(w,"value")&&w.value===void 0)){if(!r.has(b))throw new TypeError("HTTP options contain unknown fields");if(!w||!w.enumerable||!Object.hasOwn(w,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=b=>{if(e==null||!Object.hasOwn(e,b))return;let w=Object.getOwnPropertyDescriptor(e,b);if(!w||!Object.hasOwn(w,"value"))throw new TypeError("HTTP options must contain own data properties");return w.value};if(typeof t!="string"||t.length===0||t.length>8192)throw new TypeError("HTTP URL must be a bounded string");let i=n("method");if(i!==void 0&&(typeof i!="string"||!/^[A-Za-z]+$/u.test(i)))throw new TypeError("HTTP method must be a string token");let f=n("timeoutMs");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let l=n("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let a=n("maxRedirects");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>K))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${K}`);if(l==="error"&&a!==void 0&&a!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=l??"follow",o=u==="error"?0:a??K;for(let b of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let w=n(b);if(w!==void 0&&typeof w!="boolean")throw new TypeError(`HTTP ${b} must be boolean`)}let c=n("maxResponseBytes");if(c!==void 0&&(!Number.isInteger(c)||c<1||c>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let d=n("signal");if(d!==void 0){if(_.isProxy(d)||!(d instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{ae(d)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let b of["importUndici","lookupFn","validateResponse"]){let w=n(b);if(w!==void 0&&typeof w!="function")throw new TypeError(`HTTP ${b} must be a function`)}let h=n("fetchImpl"),m=h||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let O=f??12e3,P=(i||"GET").toUpperCase(),j=n("headers"),v=We(j),g=Object.assign(Object.create(null),v);Object.keys(g).some(b=>b.toLowerCase()==="accept")||(g.Accept="application/json");let R=n("body");R!=null&&typeof R!="string"&&(Object.keys(g).find(w=>w.toLowerCase()==="content-type")||(g["Content-Type"]="application/json"),R=Ve(R));let B=s??Ne,J=n("lookupFn"),y=!h,A=n("untrustedUrl")===!0,E=n("sameOriginRedirectsOnly")===!0,C=n("importUndici"),p=n("validateResponse"),$=d,G=c??null,x=async()=>{let b;for(let w=0;w<=B;w++){$&&De.call($);try{return await st(t,{fetchImpl:m,method:P,headers:g,body:R,timeoutMs:O,lookupFn:J,realFetch:y,untrustedUrl:A,maxResponseBytes:G,sameOriginRedirectsOnly:E,importUndici:C,validateResponse:p,signal:$,redirectPolicy:u,maxRedirects:o})}catch(M){b=M;let z=X=>{if(!M||typeof M!="object"&&typeof M!="function"||_.isProxy(M))return;let V=Object.getOwnPropertyDescriptor(M,X);return V&&Object.hasOwn(V,"value")?V.value:void 0},q=z("status"),Re=z("oracleTimeout")===!0||z("name")==="AbortError"||z("name")==="TimeoutError"||ae($),$e=new Set([408,425,429]),xe=z("retryable")===!1?!1:q!=null?$e.has(q)||Fe.has(q)&&he.has(P):!Re&&he.has(P);if(w===B||!xe)throw M;let de=et(w,z("retryAfter"));$?await new Promise((X,V)=>{let ke=setTimeout(X,de);Be.call($,"abort",()=>{clearTimeout(ke),V(ze($)||new DOMException("Aborted","AbortError"))},{once:!0})}):await tt(de)}}throw b};if(!(n("dedupe")!==!1&&!$&&Te(P,R)))return x();let k=Qe(P,t,g,{untrustedUrl:A,maxResponseBytes:G,sameOriginRedirectsOnly:E,redirectPolicy:u,maxRedirects:o,timeoutMs:O,retries:B,fetchImpl:Z(m),realFetch:y,lookupFn:Z(J),importUndici:Z(C),validateResponse:Z(p)},R),N=se.get(k);if(N)return N;let S=x().finally(()=>se.delete(k));return se.set(k,S),S}var ut=`0x${"00".repeat(32)}`,ft=Object.freeze(["now","30days","60days","90days","stake"]),Pe=Object.freeze([Object.freeze({id:"pharos-pros-genesis",project:"Pharos Genesis",addressFamily:"evm",chain:"pharos",chainId:1672,rpcUrl:"https://rpc.pharos.xyz",claimUrl:"https://claim.pharos.xyz/",evidenceUrl:"https://claim.pharos.xyz/user-guide",contract:"0xe5bfde2310fa2a315f814dcc0c8b97c159c8062d",tokenSymbol:"PROS",decimals:18,adapter:"pharos-static-v1",tiers:ft,readOnly:!0}),Object.freeze({id:"plume-pp-season-2",project:"Plume PP Season 2",addressFamily:"evm",chain:"plume",chainId:98866,rpcUrl:"https://rpc.plume.org",claimUrl:"https://claim-pp.plume.org/",evidenceUrl:"https://claim-pp.plume.org/",contract:"0x8a2725a6f04816a5274ddd9feadd3bd0c253c1a6",tokenSymbol:"PLUME",decimals:18,adapter:"hedgey-v4",campaignUuid:"8f5ea864-3707-492f-8766-93f0da811a98",proofUrl:"https://api.hedgey.finance/token-claims/proof",restriction:"Official portal excludes US and OFAC-sanctioned jurisdictions.",readOnly:!0})]),dt=new Se(["function campaigns(bytes16 campaignId) view returns (address manager,address token,uint256 amount,uint256 start,uint256 end,uint8 tokenLockup,bytes32 root,bool delegating)","function claimed(bytes16 campaignId,address claimer) view returns (bool)","function verify(bytes32 root,bytes32[] proof,address claimer,uint256 amount) pure returns (bool)"]),pt=new Se(["function hasClaimed(address claimer) view returns (bool)","function claimTiers(bytes32 tier) view returns (bytes32 root,address token,uint256 start,uint256 end)","function check_proof(bytes32 tier,address claimer,uint256 amount,bytes32 root,bytes32[] proof) pure returns (bool)"]);function ht(t){let e=String(t||"").trim();return/^0x[0-9a-fA-F]{40}$/u.test(e)?"evm":/^0x[0-9a-fA-F]{64}$/u.test(e)?"starknet-or-move":/^(bc1|tb1)[ac-hj-np-z02-9]{11,87}$/iu.test(e)?"bitcoin":/^[a-z][a-z0-9]{1,30}1[02-9ac-hj-np-z]{20,90}$/u.test(e)?"cosmos":e==="11111111111111111111111111111111"?"solana":/^[13][1-9A-HJ-NP-Za-km-z]{25,34}$/u.test(e)?"bitcoin":/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u.test(e)?"solana":null}function mt(t,e){let r=String(t||"").trim(),i=String(e||"").trim().toLowerCase().slice(2,5),f=it("md5").update(`pharosairdrop${r}${i}`.toLowerCase()).digest("hex");return`https://static.claim.pharos.xyz/resources/airdrops/PROD/PHAROSAIRDROP/${r}/proof_${f}_${r}.json`}function yt(t,e=Pe[1]){return`${e.proofUrl}/${e.campaignUuid}/${String(t||"").trim().toLowerCase()}`}function wt(t){return`0x${String(t).replaceAll("-","")}`}function Y(t){if(typeof t=="bigint")return t.toString();if(Array.isArray(t))return t.map(Y);if(t&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t))/^\d+$/u.test(r)||(e[r]=Y(n));return e}return t}function le(t){return String(t?.message||t||"unknown source failure").slice(0,200)}function I(t){let e=Number(t);return Number.isFinite(e)&&e>0?e*1e3:null}function Ae(t,e,r){let n=I(t),i=I(e);return n&&r<n?"not-open":i&&r>i?"expired":"claimable"}function ue(t,e){return ct(BigInt(String(t)),e).replace(/\.0+$/u,"").replace(/(\.\d*?[1-9])0+$/u,"$1")}function Oe(t){let e={claimable:0,claimed:0,ineligible:0,expired:0,notOpen:0,unavailable:0};for(let r of t)r.status==="claimable"?e.claimable+=1:r.status==="claimed"?e.claimed+=1:r.status==="ineligible"?e.ineligible+=1:r.status==="expired"?e.expired+=1:r.status==="not-open"?e.notOpen+=1:r.status==="unavailable"&&(e.unavailable+=1);return e}function F(t,e={}){return{campaignId:t.id,project:t.project,chain:t.chain,chainId:t.chainId,tokenSymbol:t.tokenSymbol,contract:t.contract,claimUrl:t.claimUrl,evidenceUrl:t.evidenceUrl,restriction:t.restriction||null,readOnly:!0,...e}}async function bt(t,e){return await ce(t,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3,retries:e.retries??1,maxResponseBytes:e.maxResponseBytes??8*1024*1024})}async function gt({campaign:t,functionName:e,args:r},n){let i=t.adapter==="hedgey-v4"?dt:pt,f=r;t.adapter==="hedgey-v4"&&["campaigns","claimed"].includes(e)&&(f=[wt(t.campaignUuid),...r.slice(1)]),t.adapter==="pharos-static-v1"&&["claimTiers","check_proof"].includes(e)&&(f=[at(r[0]),...r.slice(1)]);let s=i.encodeFunctionData(e,f),l=await ce(t.rpcUrl,{method:"POST",body:{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.contract,data:s},"latest"]},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,retries:n.retries??1,maxResponseBytes:1024*1024});if(!l||l.error||typeof l.result!="string")throw new Error(l?.error?.message||`invalid ${t.chain} RPC response`);let a=i.decodeFunctionResult(e,l.result);if(a.length===1)return Y(a[0]);let u=i.getFunction(e);return Object.fromEntries(u.outputs.map((o,c)=>[o.name||String(c),Y(a[c])]))}async function Tt(t,e,r,n){try{let i=await r.rpcRead({campaign:t,functionName:"campaigns",args:[t.campaignUuid]});if(await r.rpcRead({campaign:t,functionName:"claimed",args:[t.campaignUuid,e]})===!0)return F(t,{status:"claimed",proofVerified:!1});let s=await r.fetchJson(yt(e,t)),l=s?.amount,a=s?.proof;if(s?.canClaim!==!0||!l||!Array.isArray(a)||a.length===0)return F(t,{status:"ineligible",proofVerified:!1});if(await r.rpcRead({campaign:t,functionName:"verify",args:[i.root,a,e,l]})!==!0)throw new Error("official proof did not verify against the claim contract");return F(t,{status:Ae(i.start,i.end,n),amountRaw:String(l),amountFormatted:ue(l,t.decimals),proofVerified:!0,claimStart:I(i.start)?new Date(I(i.start)).toISOString():null,claimEnd:I(i.end)?new Date(I(i.end)).toISOString():null})}catch(i){return F(t,{status:"unavailable",proofVerified:!1,error:le(i)})}}async function Ot(t,e,r,n){try{if(await r.rpcRead({campaign:t,functionName:"hasClaimed",args:[e]})===!0)return F(t,{status:"claimed",proofVerified:!1});let f=[];for(let o of t.tiers){let c=await r.rpcRead({campaign:t,functionName:"claimTiers",args:[o]});String(c.root||"").toLowerCase()!==ut&&f.push({tier:o,state:c})}let s=[],l=[];for(let{tier:o,state:c}of f){let d;try{d=await r.fetchJson(mt(o,e))}catch(v){if(v?.status===404)continue;l.push(le(v));continue}if(!Array.isArray(d)){l.push(`${o} proof shard returned invalid data`);continue}let h=d.find(v=>Array.isArray(v)&&String(v[0]).toLowerCase()===e.toLowerCase());if(!h)continue;let[,m,O,P]=h;if(!m||String(O).toLowerCase()!==String(c.root).toLowerCase()||!Array.isArray(P)){l.push(`${o} proof row did not match onchain state`);continue}if(await r.rpcRead({campaign:t,functionName:"check_proof",args:[o,e,m,O,P]})!==!0){l.push(`${o} proof did not verify against the claim contract`);continue}s.push({tier:o,amount:String(m),state:c})}if(s.length===0){if(l.length>0)throw new Error(l.join("; "));return F(t,{status:"ineligible",proofVerified:!1})}s.sort((o,c)=>BigInt(c.amount)>BigInt(o.amount)?1:BigInt(c.amount)<BigInt(o.amount)?-1:0);let a=s[0],u=l.length===0;return F(t,{status:Ae(a.state.start,a.state.end,n),amountRaw:a.amount,amountFormatted:ue(a.amount,t.decimals),proofVerified:!0,sourceComplete:u,error:u?void 0:l.join("; ").slice(0,200),selectedTier:a.tier,allocationOptions:s.map(o=>({tier:o.tier,amountFormatted:ue(o.amount,t.decimals)})),claimStart:I(a.state.start)?new Date(I(a.state.start)).toISOString():null,claimEnd:I(a.state.end)?new Date(I(a.state.end)).toISOString():null})}catch(i){return F(t,{status:"unavailable",proofVerified:!1,error:le(i)})}}async function Ee(t,e={}){let r=String(t||"").trim(),n=ht(r);if(!n)throw new Error("unsupported or invalid wallet address");if(n==="evm"&&!lt(r))throw new Error("invalid EVM address");let i=Pe.filter(u=>u.addressFamily===n),f="Oracle checks packaged official machine-readable campaigns; this is not a universal airdrop index.";if(i.length===0)return{address:r,addressFamily:n,generatedAt:new Date(e.nowMs??Date.now()).toISOString(),complete:!1,coverage:{universal:!1,campaignsChecked:0,chainsChecked:[],reason:`Oracle has no packaged official campaigns for ${n}; this is not a universal airdrop index.`},summary:Oe([]),results:[]};let s={fetchJson:e.fetchJson||(u=>bt(u,e)),rpcRead:e.rpcRead||(u=>gt(u,e))},l=e.nowMs??Date.now(),a=await Promise.all(i.map(u=>u.adapter==="hedgey-v4"?Tt(u,r,s,l):Ot(u,r,s,l)));return{address:r,addressFamily:n,generatedAt:new Date(l).toISOString(),complete:a.every(u=>u.status!=="unavailable"&&u.sourceComplete!==!1),coverage:{universal:!1,campaignsChecked:i.length,chainsChecked:[...new Set(i.map(u=>u.chain))].sort(),reason:f},summary:Oe(a),results:a}}function je(t){let e=[],r=t.summary?.claimable||0;e.push(`Airdrop scan: ${r} verified claimable${r===1?"":"s"}`),e.push(`Address: ${t.address} (${t.addressFamily})`);for(let n of t.results||[]){let i=n.amountFormatted?`${n.amountFormatted} ${n.tokenSymbol}`:n.tokenSymbol;e.push(`${String(n.status).toUpperCase()} ${i} ${n.project} on ${n.chain}`),n.status==="claimable"&&e.push(`Claim: ${n.claimUrl}`),n.error&&e.push(`Source error: ${n.error}`),n.restriction&&e.push(`Restriction: ${n.restriction}`)}return(t.results||[]).length===0&&e.push("No packaged official campaigns support this address family yet."),e.push(`Coverage: ${t.coverage.reason}`),e.join(`
|
|
3
|
-
`)}var
|
|
1
|
+
import{createHash as ct}from"node:crypto";import{Interface as Ee,encodeBytes32String as lt,formatUnits as ut,isAddress as ft}from"ethers";import{createHash as Ne}from"node:crypto";import{types as _}from"node:util";import U from"node:net";import _e from"node:dns";var Ce=new Set(["localhost","metadata.google.internal","metadata.goog"]);function K(t){let e=String(t).toLowerCase().split("%")[0];if((e.match(/::/g)||[]).length>1)return null;let r=o=>{if(!o)return[];let c=o.split(":"),d=c.at(-1);if(d?.includes(".")){let h=d.split(".").map(Number);if(h.length!==4||h.some(m=>!Number.isInteger(m)||m<0||m>255))return null;c.splice(c.length-1,1,(h[0]<<8|h[1]).toString(16),(h[2]<<8|h[3]).toString(16))}return c.some(h=>!/^[0-9a-f]{1,4}$/.test(h))?null:c.map(h=>Number.parseInt(h,16))},[n,i]=e.split("::"),f=r(n),s=r(i);if(!f||!s)return null;let l=e.includes("::"),a=8-f.length-s.length;if(!l&&a!==0||l&&a<1)return null;let u=[...f,...Array(Math.max(0,a)).fill(0),...s];return u.length!==8?null:Uint8Array.from(u.flatMap(o=>[o>>8,o&255]))}function te(t,e,r){let n=Math.floor(r/8),i=r%8;for(let s=0;s<n;s+=1)if(t[s]!==e[s])return!1;if(!i)return!0;let f=255<<8-i;return(t[n]&f)===(e[n]&f)}function re(t){if(U.isIPv4(t)){let e=t.split(".").map(Number);return!(e[0]===0||e[0]===10||e[0]===127||e[0]>=224||e[0]===100&&e[1]>=64&&e[1]<=127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&(e[1]===0||e[1]===2||e[1]===168)||e[0]===192&&e[1]===88&&e[2]===99||e[0]===198&&(e[1]===18||e[1]===19||e[1]===51)||e[0]===203&&e[1]===0&&e[2]===113)}if(U.isIPv6(t)){let e=K(t);if(!e)return!1;let r=K("::ffff:0:0");return te(e,r,96)?re([...e.slice(12)].join(".")):te(e,K("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([i,f])=>te(e,K(i),f)):!1}return!1}function Le(t){let e;try{e=new URL(String(t))}catch{return{ok:!1,error:`not a valid URL: ${String(t).slice(0,120)}`}}if(e.protocol!=="http:"&&e.protocol!=="https:")return{ok:!1,error:`refused protocol ${e.protocol} (only http/https)`};let r=e.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Ce.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=U.isIP(r);return n!==0&&!re(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:e,host:r,isLiteralIp:n!==0}}async function ne(t,{lookupFn:e=_e.promises.lookup}={}){let r=Le(t);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:U.isIPv6(r.host)?6:4}]};let n;try{n=await e(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(i=>!re(i.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function oe({requireUndici:t=!1,importUndici:e=()=>import("undici")}={}){let r,n;try{let c=await e();r=c.Agent,n=c.fetch}catch(c){if(t)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${c?.message||c}`);return null}if(typeof r!="function"||typeof n!="function"){if(t)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let i=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),f=new Map,s=c=>(Array.isArray(c)?c:[c]).map(d=>typeof d=="string"?{address:d}:d).filter(d=>d&&d.address).map(d=>({address:d.address,family:d.family||(U.isIPv6(d.address)?6:4)})),l=(c,d,h)=>{f.set(i(c),s(typeof d=="string"?[{address:d,family:h}]:d))},a=c=>{let d=i(c);if(U.isIP(d))return[{address:d,family:U.isIPv6(d)?6:4}];let h=f.get(d);if(!h||!h.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return h},u=new r({connect:{lookup(c,d,h){let m;try{m=a(c)}catch(O){return h(O)}return d?.all?h(null,m):h(null,m[0].address,m[0].family)}}}),o=Fe((c,d={})=>n(c,{...d,dispatcher:u}),l);return{dispatcher:u,fetch:o,pin:l,resolve:a,async close(){try{await u.destroy()}catch{}}}}var se=Symbol.for("oracle.egressGuard.pinCapableFetch");function Fe(t,e){if(typeof t!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof e!="function")throw new Error("markPinCapableFetch: pin must be a function");return t[se]=Object.freeze({pin:e}),t}function ie(t){return typeof t=="function"&&typeof t[se]?.pin=="function"}function me(t,e,r){if(!ie(t))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");t[se].pin(e,r)}var Me=new Set([408,425,429,500,502,503,504]),ye=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ue=2,we=4e3,De=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Be=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,ze=AbortSignal.prototype.throwIfAborted,Je=EventTarget.prototype.addEventListener,be=EventTarget.prototype.removeEventListener,ge=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Z=t=>t?De.call(t):!1,Ge=t=>t?Be.call(t):void 0,Ve=new Set([301,302,303,307,308]),q=3,xt=64*1024,H=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});function T(t){return L(`HTTP JSON body refused: ${t}`)}function We(t){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(e=>typeof _[e]=="function"&&_[e](t))}function Ze(t){let e=[],r=0,n=0,i=0,f=0,s=new WeakSet,l=o=>{if(r+=Buffer.byteLength(o,"utf8"),r>H.bytes)throw T("serialized byte limit exceeded");e.push(o)},a=o=>{if(Buffer.byteLength(o,"utf8")>H.bytes)throw T("serialized byte limit exceeded");return JSON.stringify(o)},u=(o,c)=>{if(n+=1,n>H.nodes)throw T("node limit exceeded");if(c>H.depth)throw T("depth limit exceeded");if(o===null){l("null");return}if(typeof o=="string"){l(a(o));return}if(typeof o=="boolean"){l(o?"true":"false");return}if(typeof o=="number"){if(!Number.isFinite(o))throw T("non-finite number");l(Object.is(o,-0)?"0":String(o));return}if(typeof o!="object")throw T("unsupported non-JSON value");if(_.isProxy(o))throw T("proxy value");if(We(o))throw T("unsupported exotic object");if(s.has(o))throw T("cyclic value");s.add(o);try{if(Object.getOwnPropertySymbols(o).length>0)throw T("symbol-keyed fields are unsupported");if(Array.isArray(o)){let m=Object.getPrototypeOf(o),O=0;for(;m!==null;){if(_.isProxy(m))throw T("proxy array prototype");if(O+=1,O>H.depth)throw T("array prototype depth limit exceeded");m=Object.getPrototypeOf(m)}if(o.length>H.arrayLength)throw T("array length limit exceeded");for(let S=0;S<o.length;S+=1){let v=Object.getOwnPropertyDescriptor(o,String(S));if(!v||!Object.hasOwn(v,"value")||v.enumerable!==!0)throw T("array entries must be dense enumerable own data")}let y=0;for(let S in o){if(f+=1,f>H.fields)throw T("enumeration limit exceeded");if(Object.hasOwn(o,S)&&(y+=1,y>o.length))throw T("named array fields are unsupported")}if(y!==o.length)throw T("array entries must be dense enumerable own data");l("[");for(let S=0;S<o.length;S+=1)S&&l(","),u(Object.getOwnPropertyDescriptor(o,String(S)).value,c+1);l("]");return}let d=Object.getPrototypeOf(o);if(d!==Object.prototype&&d!==null)throw T("non-plain object");let h=[];for(let m in o){if(f+=1,f>H.fields)throw T("enumeration limit exceeded");if(!Object.hasOwn(o,m))continue;if(i+=1,i>H.fields)throw T("field limit exceeded");let O=Object.getOwnPropertyDescriptor(o,m);if(!O||!Object.hasOwn(O,"value")||O.enumerable!==!0)throw T("object fields must be enumerable own data");h.push([m,O.value])}l("{");for(let m=0;m<h.length;m+=1)m&&l(","),l(a(h[m][0])),l(":"),u(h[m][1],c+1);l("}")}finally{s.delete(o)}};return u(t,0),e.join("")}function Ke(t){let e=Object.create(null);if(t==null)return e;if(typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP headers must be an object");if(_.isProxy(t))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(t)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let i=n.toLowerCase();if(r.has(i))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(i);let f=Object.getOwnPropertyDescriptor(t,n);if(!f||!Object.hasOwn(f,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=f.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");e[n]=String(s)}return e}function Ye(){return Object.assign(Object.create(null),{Accept:"application/json"})}function qe(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let r=new URL(String(t),String(e));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${r.protocol}`);return r.toString()}function Xe(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var ae=new Map,Te=new WeakMap,Oe=1;function Y(t){if((typeof t!="object"||t===null)&&typeof t!="function")return`${typeof t}:${String(t)}`;let e=Te.get(t);return e||(e=Oe,Oe+=1,Te.set(t,e)),`reference:${e}`}var Qe=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),et=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);function Se(t){if(!t||typeof t!="object"||Array.isArray(t)||!Object.hasOwn(t,"jsonrpc")||!Object.hasOwn(t,"method")||t.jsonrpc!=="2.0")return!1;let e=typeof t.method=="string"?t.method:"";return e?Qe.has(e)||/^get[A-Z0-9_]/u.test(e)||/^is[A-Z0-9_]/u.test(e)||/^eth_get[A-Z0-9_]/u.test(e):!1}function Pe(t,e){if(t==="GET"&&e==null)return!0;if(t!=="POST"||e==null)return!1;let r=e;if(typeof e=="string")try{r=JSON.parse(e)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(Se);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Se(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&et.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function tt(t,e,r,n={},i=null){let f=Ne("sha256"),s=(a,u)=>{let o=String(u);f.update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a),f.update("=").update(String(Buffer.byteLength(o,"utf8"))).update(":").update(o).update(`
|
|
2
|
+
`)};s("method",t),s("url",e),Object.keys(r||{}).map((a,u)=>({name:a.toLowerCase(),order:u,value:String(r[a])})).sort((a,u)=>a.name.localeCompare(u.name)||a.order-u.order).forEach((a,u)=>{s(`header-name-${u}`,a.name),s(`header-value-${u}`,a.value)}),s("body",i??"-");for(let a of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${a}`,n[a]??"-");return f.digest("hex")}function rt(t,e){let r=Number(e);return Number.isFinite(r)&&r>0?Math.min(r*1e3,we):Math.min(250*2**t,we)+Math.floor(Math.random()*100)}var nt=t=>new Promise(e=>setTimeout(e,t));function L(t,e={}){let r=new Error(t);return r.retryable=!1,Object.assign(r,e),r}function ce(t,e,r){return L(`HTTP response from ${t} exceeded maxResponseBytes ${r} (${e})`,{oversize:!0})}function D(t){try{let e=t?.body?.cancel?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}function ot(t){return t?t.byteLength??t.length??0:0}async function st(t,e,{url:r,truncate:n=!1,onOversize:i}={}){if(e==null)return await t.text();let f=Number(t.headers?.get?.("content-length"));if(Number.isFinite(f)&&f>e&&(D(t),!n))throw ce(r,`content-length ${f}`,e);let s=t.body?.getReader?.();if(!s){let c=await t.text(),d=Buffer.byteLength(c,"utf8");if(d>e){if(!n)throw ce(r,`body ${d} bytes`,e);return Buffer.from(c,"utf8").subarray(0,e).toString("utf8")}return c}let l=[],a=0,u=!1;try{for(;;){let{value:c,done:d}=await s.read();if(d)break;if(c&&(l.push(Buffer.from(c)),a+=ot(c),a>e)){u=!0;break}}}finally{if(u)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(u&&(typeof i=="function"&&i(),!n))throw ce(r,`streamed ${a} bytes`,e);let o=Buffer.concat(l);return(u?o.subarray(0,e):o).toString("utf8")}function it(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function at(t,{fetchImpl:e,method:r,headers:n,body:i,timeoutMs:f,lookupFn:s,realFetch:l,untrustedUrl:a=!1,maxResponseBytes:u=null,sameOriginRedirectsOnly:o=!1,importUndici:c,validateResponse:d,signal:h,redirectPolicy:m="follow",maxRedirects:O=q}){let y=null,S=e,v=s?{lookupFn:s}:{};if(a&&!l&&!ie(S))throw L(`HTTP refused ${t}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let R=new AbortController,I=setTimeout(()=>R.abort(),f),z=h?ge?ge([h,R.signal]):h:R.signal,J=async(w,{status:A=null}={})=>{let E=await ne(w,v);if(!E.ok)throw L(A==null?`HTTP refused ${w}: ${E.error}`:`HTTP redirect to ${w} ${E.error}`,A==null?{}:{status:A});let C=new URL(w).hostname;if(l){if(y&&(await y.close(),y=null),!y)try{y=await oe({requireUndici:!0,...c?{importUndici:c}:{}})}catch(p){throw L(A==null?`HTTP refused ${w}: ${p?.message||p}`:`HTTP redirect to ${w} refused: ${p?.message||p}`,A==null?{}:{status:A})}y.pin(C,E.addresses),S=y.fetch}else me(S,C,E.addresses);return E};try{let w=String(t),A=Object.assign(Object.create(null),n||{});a&&await J(w);for(let E=0;E<=O;E+=1){let C=Object.assign(Object.create(null),{method:r,headers:A,body:i,signal:z,redirect:"manual",dispatcher:void 0}),p=await S(w,C);if((m==="error"||O===0)&&p.status>=300&&p.status<400)throw D(p),L(`HTTP ${p.status} ${r} redirect refused`,{status:p.status,redirectRefused:!0});if(Ve.has(p.status)){let $=o===!0&&r==="POST"&&[307,308].includes(p.status)&&Pe(r,i);if(r!=="GET"&&r!=="HEAD"&&!$){D(p);let P=new Error(`HTTP ${p.status} ${r} ${w} redirected non-idempotent request`);throw P.status=p.status,P}if(E===O)throw D(p),L(`HTTP ${p.status} ${r} redirect budget exhausted`,{status:p.status,redirectRefused:!0});let de=p.headers?.get?.("location"),x;try{x=qe(de,w)}catch(P){throw D(p),P}let N=!Xe(x,w);if(D(p),N&&r==="POST"){let P=new Error(`HTTP ${p.status} ${r} cross-origin redirect refused`);throw P.status=p.status,P}if(N&&o){let P=new Error(`HTTP ${p.status} ${r} cross-origin redirect refused`);throw P.status=p.status,P.retryable=!1,P}if(N&&(A=Ye(A)),a)await J(x,{status:p.status});else if(N){let P=await ne(x,v);if(!P.ok){let g=new Error(`HTTP redirect from ${w} ${P.error}`);throw g.status=p.status,g.retryable=!1,g}l&&P.addresses?.length&&(y||(y=await oe(c?{importUndici:c}:{})),y&&(y.pin(new URL(x).hostname,P.addresses),S=y.fetch))}w=x;continue}if(typeof d=="function")try{await d(p,{url:w})}catch($){throw D(p),L($?.message||String($))}let j=await st(p,u,{url:w,onOversize:()=>R.abort()}),G=it(j);if(!p.ok){let $=new Error(`HTTP ${p.status} ${r} ${w}`);throw $.status=p.status,$.retryAfter=p.headers?.get?.("retry-after")??null,$.body=G??j.slice(0,300),$}return G??j}throw new Error(`HTTP redirect loop for ${t}`)}catch(w){if(R.signal.aborted&&!Z(h)){let A=w&&(typeof w=="object"||typeof w=="function")&&!_.isProxy(w)?w:null,E=A?Object.getOwnPropertyDescriptor(A,"oversize"):null;if(!(E&&Object.hasOwn(E,"value")&&E.value===!0))try{if(!A)throw new TypeError("unsafe rejection");Object.defineProperties(A,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let p=new Error("HTTP request timed out");throw Object.defineProperties(p,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),p}}throw w}finally{clearTimeout(I),y&&await y.close()}}async function le(t,e={}){if(e!=null&&typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP options must be an object");if(e!=null&&_.isProxy(e))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(e!=null){if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP options contain unknown fields");for(let g of Object.getOwnPropertyNames(e)){let b=Object.getOwnPropertyDescriptor(e,g);if(!(g==="toJSON"&&b&&Object.hasOwn(b,"value")&&b.value===void 0)){if(!r.has(g))throw new TypeError("HTTP options contain unknown fields");if(!b||!b.enumerable||!Object.hasOwn(b,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=g=>{if(e==null||!Object.hasOwn(e,g))return;let b=Object.getOwnPropertyDescriptor(e,g);if(!b||!Object.hasOwn(b,"value"))throw new TypeError("HTTP options must contain own data properties");return b.value};if(typeof t!="string"||t.length===0||t.length>8192)throw new TypeError("HTTP URL must be a bounded string");let i=n("method");if(i!==void 0&&(typeof i!="string"||!/^[A-Za-z]+$/u.test(i)))throw new TypeError("HTTP method must be a string token");let f=n("timeoutMs");if(f!==void 0&&(!Number.isInteger(f)||f<1||f>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let l=n("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let a=n("maxRedirects");if(a!==void 0&&(!Number.isInteger(a)||a<0||a>q))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${q}`);if(l==="error"&&a!==void 0&&a!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let u=l??"follow",o=u==="error"?0:a??q;for(let g of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let b=n(g);if(b!==void 0&&typeof b!="boolean")throw new TypeError(`HTTP ${g} must be boolean`)}let c=n("maxResponseBytes");if(c!==void 0&&(!Number.isInteger(c)||c<1||c>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let d=n("signal");if(d!==void 0){if(_.isProxy(d)||!(d instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Z(d)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let g of["importUndici","lookupFn","validateResponse"]){let b=n(g);if(b!==void 0&&typeof b!="function")throw new TypeError(`HTTP ${g} must be a function`)}let h=n("fetchImpl"),m=h||globalThis.fetch;if(typeof m!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let O=f??12e3,y=(i||"GET").toUpperCase(),S=n("headers"),v=Ke(S),R=Object.assign(Object.create(null),v);Object.keys(R).some(g=>g.toLowerCase()==="accept")||(R.Accept="application/json");let I=n("body");I!=null&&typeof I!="string"&&(Object.keys(R).find(b=>b.toLowerCase()==="content-type")||(R["Content-Type"]="application/json"),I=Ze(I));let z=s??Ue,J=n("lookupFn"),w=!h,A=n("untrustedUrl")===!0,E=n("sameOriginRedirectsOnly")===!0,C=n("importUndici"),p=n("validateResponse"),j=d,G=c??null,$=async()=>{let g;for(let b=0;b<=z;b++){j&&ze.call(j);try{return await at(t,{fetchImpl:m,method:y,headers:R,body:I,timeoutMs:O,lookupFn:J,realFetch:w,untrustedUrl:A,maxResponseBytes:G,sameOriginRedirectsOnly:E,importUndici:C,validateResponse:p,signal:j,redirectPolicy:u,maxRedirects:o})}catch(M){g=M;let B=ee=>{if(!M||typeof M!="object"&&typeof M!="function"||_.isProxy(M))return;let V=Object.getOwnPropertyDescriptor(M,ee);return V&&Object.hasOwn(V,"value")?V.value:void 0},Q=B("status"),ke=B("oracleTimeout")===!0||B("name")==="AbortError"||B("name")==="TimeoutError"||Z(j),Ie=new Set([408,425,429]),He=B("retryable")===!1?!1:Q!=null?Ie.has(Q)||Me.has(Q)&&ye.has(y):!ke&&ye.has(y);if(b===z||!He)throw M;let pe=rt(b,B("retryAfter"));j?await new Promise((ee,V)=>{let he,W=()=>{clearTimeout(he),be.call(j,"abort",W),V(Ge(j)||new DOMException("Aborted","AbortError"))};if(Z(j)){W();return}he=setTimeout(()=>{be.call(j,"abort",W),ee()},pe),Je.call(j,"abort",W,{once:!0}),Z(j)&&W()}):await nt(pe)}}throw g};if(!(n("dedupe")!==!1&&!j&&Pe(y,I)))return $();let x=tt(y,t,R,{untrustedUrl:A,maxResponseBytes:G,sameOriginRedirectsOnly:E,redirectPolicy:u,maxRedirects:o,timeoutMs:O,retries:z,fetchImpl:Y(m),realFetch:w,lookupFn:Y(J),importUndici:Y(C),validateResponse:Y(p)},I),N=ae.get(x);if(N)return N;let P=$().finally(()=>ae.delete(x));return ae.set(x,P),P}var dt=`0x${"00".repeat(32)}`,pt=Object.freeze(["now","30days","60days","90days","stake"]),je=Object.freeze([Object.freeze({id:"pharos-pros-genesis",project:"Pharos Genesis",addressFamily:"evm",chain:"pharos",chainId:1672,rpcUrl:"https://rpc.pharos.xyz",claimUrl:"https://claim.pharos.xyz/",evidenceUrl:"https://claim.pharos.xyz/user-guide",contract:"0xe5bfde2310fa2a315f814dcc0c8b97c159c8062d",tokenSymbol:"PROS",decimals:18,adapter:"pharos-static-v1",tiers:pt,readOnly:!0}),Object.freeze({id:"plume-pp-season-2",project:"Plume PP Season 2",addressFamily:"evm",chain:"plume",chainId:98866,rpcUrl:"https://rpc.plume.org",claimUrl:"https://claim-pp.plume.org/",evidenceUrl:"https://claim-pp.plume.org/",contract:"0x8a2725a6f04816a5274ddd9feadd3bd0c253c1a6",tokenSymbol:"PLUME",decimals:18,adapter:"hedgey-v4",campaignUuid:"8f5ea864-3707-492f-8766-93f0da811a98",proofUrl:"https://api.hedgey.finance/token-claims/proof",restriction:"Official portal excludes US and OFAC-sanctioned jurisdictions.",readOnly:!0})]),ht=new Ee(["function campaigns(bytes16 campaignId) view returns (address manager,address token,uint256 amount,uint256 start,uint256 end,uint8 tokenLockup,bytes32 root,bool delegating)","function claimed(bytes16 campaignId,address claimer) view returns (bool)","function verify(bytes32 root,bytes32[] proof,address claimer,uint256 amount) pure returns (bool)"]),mt=new Ee(["function hasClaimed(address claimer) view returns (bool)","function claimTiers(bytes32 tier) view returns (bytes32 root,address token,uint256 start,uint256 end)","function check_proof(bytes32 tier,address claimer,uint256 amount,bytes32 root,bytes32[] proof) pure returns (bool)"]);function yt(t){let e=String(t||"").trim();return/^0x[0-9a-fA-F]{40}$/u.test(e)?"evm":/^0x[0-9a-fA-F]{64}$/u.test(e)?"starknet-or-move":/^(bc1|tb1)[ac-hj-np-z02-9]{11,87}$/iu.test(e)?"bitcoin":/^[a-z][a-z0-9]{1,30}1[02-9ac-hj-np-z]{20,90}$/u.test(e)?"cosmos":e==="11111111111111111111111111111111"?"solana":/^[13][1-9A-HJ-NP-Za-km-z]{25,34}$/u.test(e)?"bitcoin":/^[1-9A-HJ-NP-Za-km-z]{32,44}$/u.test(e)?"solana":null}function wt(t,e){let r=String(t||"").trim(),i=String(e||"").trim().toLowerCase().slice(2,5),f=ct("md5").update(`pharosairdrop${r}${i}`.toLowerCase()).digest("hex");return`https://static.claim.pharos.xyz/resources/airdrops/PROD/PHAROSAIRDROP/${r}/proof_${f}_${r}.json`}function bt(t,e=je[1]){return`${e.proofUrl}/${e.campaignUuid}/${String(t||"").trim().toLowerCase()}`}function gt(t){return`0x${String(t).replaceAll("-","")}`}function X(t){if(typeof t=="bigint")return t.toString();if(Array.isArray(t))return t.map(X);if(t&&typeof t=="object"){let e={};for(let[r,n]of Object.entries(t))/^\d+$/u.test(r)||(e[r]=X(n));return e}return t}function ue(t){return String(t?.message||t||"unknown source failure").slice(0,200)}function k(t){let e=Number(t);return Number.isFinite(e)&&e>0?e*1e3:null}function ve(t,e,r){let n=k(t),i=k(e);return n&&r<n?"not-open":i&&r>i?"expired":"claimable"}function fe(t,e){return ut(BigInt(String(t)),e).replace(/\.0+$/u,"").replace(/(\.\d*?[1-9])0+$/u,"$1")}function Ae(t){let e={claimable:0,claimed:0,ineligible:0,expired:0,notOpen:0,unavailable:0};for(let r of t)r.status==="claimable"?e.claimable+=1:r.status==="claimed"?e.claimed+=1:r.status==="ineligible"?e.ineligible+=1:r.status==="expired"?e.expired+=1:r.status==="not-open"?e.notOpen+=1:r.status==="unavailable"&&(e.unavailable+=1);return e}function F(t,e={}){return{campaignId:t.id,project:t.project,chain:t.chain,chainId:t.chainId,tokenSymbol:t.tokenSymbol,contract:t.contract,claimUrl:t.claimUrl,evidenceUrl:t.evidenceUrl,restriction:t.restriction||null,readOnly:!0,...e}}async function Tt(t,e){return await le(t,{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs??12e3,retries:e.retries??1,maxResponseBytes:e.maxResponseBytes??8*1024*1024})}async function Ot({campaign:t,functionName:e,args:r},n){let i=t.adapter==="hedgey-v4"?ht:mt,f=r;t.adapter==="hedgey-v4"&&["campaigns","claimed"].includes(e)&&(f=[gt(t.campaignUuid),...r.slice(1)]),t.adapter==="pharos-static-v1"&&["claimTiers","check_proof"].includes(e)&&(f=[lt(r[0]),...r.slice(1)]);let s=i.encodeFunctionData(e,f),l=await le(t.rpcUrl,{method:"POST",body:{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t.contract,data:s},"latest"]},fetchImpl:n.fetchImpl,timeoutMs:n.timeoutMs??12e3,retries:n.retries??1,maxResponseBytes:1024*1024});if(!l||l.error||typeof l.result!="string")throw new Error(l?.error?.message||`invalid ${t.chain} RPC response`);let a=i.decodeFunctionResult(e,l.result);if(a.length===1)return X(a[0]);let u=i.getFunction(e);return Object.fromEntries(u.outputs.map((o,c)=>[o.name||String(c),X(a[c])]))}async function St(t,e,r,n){try{let i=await r.rpcRead({campaign:t,functionName:"campaigns",args:[t.campaignUuid]});if(await r.rpcRead({campaign:t,functionName:"claimed",args:[t.campaignUuid,e]})===!0)return F(t,{status:"claimed",proofVerified:!1});let s=await r.fetchJson(bt(e,t)),l=s?.amount,a=s?.proof;if(s?.canClaim!==!0||!l||!Array.isArray(a)||a.length===0)return F(t,{status:"ineligible",proofVerified:!1});if(await r.rpcRead({campaign:t,functionName:"verify",args:[i.root,a,e,l]})!==!0)throw new Error("official proof did not verify against the claim contract");return F(t,{status:ve(i.start,i.end,n),amountRaw:String(l),amountFormatted:fe(l,t.decimals),proofVerified:!0,claimStart:k(i.start)?new Date(k(i.start)).toISOString():null,claimEnd:k(i.end)?new Date(k(i.end)).toISOString():null})}catch(i){return F(t,{status:"unavailable",proofVerified:!1,error:ue(i)})}}async function Pt(t,e,r,n){try{if(await r.rpcRead({campaign:t,functionName:"hasClaimed",args:[e]})===!0)return F(t,{status:"claimed",proofVerified:!1});let f=[];for(let o of t.tiers){let c=await r.rpcRead({campaign:t,functionName:"claimTiers",args:[o]});String(c.root||"").toLowerCase()!==dt&&f.push({tier:o,state:c})}let s=[],l=[];for(let{tier:o,state:c}of f){let d;try{d=await r.fetchJson(wt(o,e))}catch(v){if(v?.status===404)continue;l.push(ue(v));continue}if(!Array.isArray(d)){l.push(`${o} proof shard returned invalid data`);continue}let h=d.find(v=>Array.isArray(v)&&String(v[0]).toLowerCase()===e.toLowerCase());if(!h)continue;let[,m,O,y]=h;if(!m||String(O).toLowerCase()!==String(c.root).toLowerCase()||!Array.isArray(y)){l.push(`${o} proof row did not match onchain state`);continue}if(await r.rpcRead({campaign:t,functionName:"check_proof",args:[o,e,m,O,y]})!==!0){l.push(`${o} proof did not verify against the claim contract`);continue}s.push({tier:o,amount:String(m),state:c})}if(s.length===0){if(l.length>0)throw new Error(l.join("; "));return F(t,{status:"ineligible",proofVerified:!1})}s.sort((o,c)=>BigInt(c.amount)>BigInt(o.amount)?1:BigInt(c.amount)<BigInt(o.amount)?-1:0);let a=s[0],u=l.length===0;return F(t,{status:ve(a.state.start,a.state.end,n),amountRaw:a.amount,amountFormatted:fe(a.amount,t.decimals),proofVerified:!0,sourceComplete:u,error:u?void 0:l.join("; ").slice(0,200),selectedTier:a.tier,allocationOptions:s.map(o=>({tier:o.tier,amountFormatted:fe(o.amount,t.decimals)})),claimStart:k(a.state.start)?new Date(k(a.state.start)).toISOString():null,claimEnd:k(a.state.end)?new Date(k(a.state.end)).toISOString():null})}catch(i){return F(t,{status:"unavailable",proofVerified:!1,error:ue(i)})}}async function Re(t,e={}){let r=String(t||"").trim(),n=yt(r);if(!n)throw new Error("unsupported or invalid wallet address");if(n==="evm"&&!ft(r))throw new Error("invalid EVM address");let i=je.filter(u=>u.addressFamily===n),f="Oracle checks packaged official machine-readable campaigns; this is not a universal airdrop index.";if(i.length===0)return{address:r,addressFamily:n,generatedAt:new Date(e.nowMs??Date.now()).toISOString(),complete:!1,coverage:{universal:!1,campaignsChecked:0,chainsChecked:[],reason:`Oracle has no packaged official campaigns for ${n}; this is not a universal airdrop index.`},summary:Ae([]),results:[]};let s={fetchJson:e.fetchJson||(u=>Tt(u,e)),rpcRead:e.rpcRead||(u=>Ot(u,e))},l=e.nowMs??Date.now(),a=await Promise.all(i.map(u=>u.adapter==="hedgey-v4"?St(u,r,s,l):Pt(u,r,s,l)));return{address:r,addressFamily:n,generatedAt:new Date(l).toISOString(),complete:a.every(u=>u.status!=="unavailable"&&u.sourceComplete!==!1),coverage:{universal:!1,campaignsChecked:i.length,chainsChecked:[...new Set(i.map(u=>u.chain))].sort(),reason:f},summary:Ae(a),results:a}}function $e(t){let e=[],r=t.summary?.claimable||0;e.push(`Airdrop scan: ${r} verified claimable${r===1?"":"s"}`),e.push(`Address: ${t.address} (${t.addressFamily})`);for(let n of t.results||[]){let i=n.amountFormatted?`${n.amountFormatted} ${n.tokenSymbol}`:n.tokenSymbol;e.push(`${String(n.status).toUpperCase()} ${i} ${n.project} on ${n.chain}`),n.status==="claimable"&&e.push(`Claim: ${n.claimUrl}`),n.error&&e.push(`Source error: ${n.error}`),n.restriction&&e.push(`Restriction: ${n.restriction}`)}return(t.results||[]).length===0&&e.push("No packaged official campaigns support this address family yet."),e.push(`Coverage: ${t.coverage.reason}`),e.join(`
|
|
3
|
+
`)}var xe=`oracle airdrop <address> [--json]
|
|
4
4
|
|
|
5
5
|
Checks packaged official machine-readable airdrop sources, then verifies proofs
|
|
6
6
|
and claimed state against each project claim contract.
|
|
7
7
|
|
|
8
8
|
Read-only. Requires an explicit wallet address. It never connects a wallet,
|
|
9
9
|
signs, approves, broadcasts, or claims. Coverage is not a universal airdrop
|
|
10
|
-
index, and unavailable sources are never reported as ineligible.`,
|
|
11
|
-
`),1;if(e.includes("--help")||e.includes("-h"))return process.stdout.write(`${
|
|
10
|
+
index, and unavailable sources are never reported as ineligible.`,Ft={name:"airdrop",summary:"verify official airdrop eligibility and claimed state",group:"read",usage:xe,async run(t={}){let e=Array.isArray(t.argv)?t.argv:[],r=new Set(["--json","--help","-h"]),n=e.filter(s=>s.startsWith("-")&&!r.has(s)),i=e.filter(s=>!s.startsWith("-"));if(n.length||i.length>1)return process.stderr.write(`oracle airdrop only accepts one explicit address and optional --json
|
|
11
|
+
`),1;if(e.includes("--help")||e.includes("-h"))return process.stdout.write(`${xe}
|
|
12
12
|
`),0;let f=String(i[0]||"").trim();if(!f)return process.stderr.write(`oracle airdrop requires an explicit wallet address
|
|
13
|
-
`),1;try{let l=await(t.airdropScan||
|
|
14
|
-
`):process.stdout.write(`${(t.airdropRender
|
|
13
|
+
`),1;try{let l=await(t.airdropScan||Re)(f,t.fetchImpl?{fetchImpl:t.fetchImpl}:{});return e.includes("--json")?process.stdout.write(`${JSON.stringify(l,null,2)}
|
|
14
|
+
`):process.stdout.write(`${(t.airdropRender||$e)(l)}
|
|
15
15
|
`),0}catch(s){return process.stderr.write(`oracle airdrop failed: ${s?.message||s}
|
|
16
|
-
`),1}}};export{
|
|
16
|
+
`),1}}};export{Ft as default};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var Ie=Object.defineProperty;var Le=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var De=(e,t)=>{for(var r in t)Ie(e,r,{get:t[r],enumerable:!0})};var be={};De(be,{OAUTH_USAGE_PROVIDERS:()=>
|
|
2
|
-
`,{mode:384}),B.renameSync(o,r),process.platform!=="win32"&&B.chmodSync(r,384),t}import{createHash as st,randomBytes as Q,timingSafeEqual as at}from"node:crypto";import
|
|
1
|
+
var Ie=Object.defineProperty;var Le=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var De=(e,t)=>{for(var r in t)Ie(e,r,{get:t[r],enumerable:!0})};var be={};De(be,{OAUTH_USAGE_PROVIDERS:()=>kt,collectOAuthUsage:()=>St,parseAnthropicUsage:()=>Ae,parseCodexUsage:()=>Se});function ke(e){let t=Number(e);return Number.isFinite(t)?t:null}function At(e){let t=ke(e);if(t==null)return null;let r=t<=1?t*100:t;return Math.max(0,Math.min(100,r))}function Ae(e){let t=[["five_hour","5h"],["seven_day","7d"],["seven_day_opus","Opus 7d"],["seven_day_sonnet","Sonnet 7d"]],r=[];for(let[o,n]of t){let i=e?.[o]||{},s=At(i.utilization);s!=null&&r.push({label:n,usedPercent:s,resetAt:i.resets_at||i.reset_at||null})}return{source:"oauth_usage_api",windows:r}}function Se(e){let t=e?.rate_limit||{},r=[["primary_window","5h"],["secondary_window","wk"]],o=[];for(let[n,i]of r){let s=t[n]||{},c=ke(s.used_percent);c!=null&&o.push({label:i,usedPercent:Math.max(0,Math.min(100,c)),resetAt:s.reset_at||s.resets_at||null})}return{source:"usage_api",windows:o}}function P({id:e,label:t,connected:r,windows:o=[],unavailable:n=null}){let i=o[0]||null;return{id:e,label:t,connected:r,usedPercent:i?i.usedPercent:null,windowLabel:i?i.label:null,resetAt:i?i.resetAt:null,windows:o,unavailable:n}}function re(e,t){try{return String(e?.get?.(t)?.accessToken||"").trim()}catch{return""}}async function xe(e,t,r){let o=await e(t,{headers:r});if(!o?.ok)throw new Error(`HTTP ${o?.status||0}`);return o.json()}async function St(e,{fetchFn:t=globalThis.fetch}={}){let r=new Date().toISOString(),o=[],n=re(e,"anthropic-oauth");if(!n)o.push(P({id:"anthropic-oauth",label:"Claude",connected:!1,unavailable:"not connected"}));else try{let c=await xe(t,"https://api.anthropic.com/api/oauth/usage",{Authorization:`Bearer ${n}`,Accept:"application/json","anthropic-beta":"oauth-2025-04-20","User-Agent":"claude-code/2.1.0"}),u=Ae(c);o.push(P({id:"anthropic-oauth",label:"Claude",connected:!0,windows:u.windows,unavailable:u.windows.length?null:"quota unavailable"}))}catch{o.push(P({id:"anthropic-oauth",label:"Claude",connected:!0,unavailable:"quota unavailable"}))}let i=re(e,"openai-codex");if(!i)o.push(P({id:"openai-codex",label:"Codex",connected:!1,unavailable:"not connected"}));else try{let c=await xe(t,"https://chatgpt.com/backend-api/wham/usage",{Authorization:`Bearer ${i}`,Accept:"application/json","User-Agent":"codex-cli"}),u=Se(c);o.push(P({id:"openai-codex",label:"Codex",connected:!0,windows:u.windows,unavailable:u.windows.length?null:"quota unavailable"}))}catch{o.push(P({id:"openai-codex",label:"Codex",connected:!0,unavailable:"quota unavailable"}))}let s=re(e,"xai-oauth");return o.push(P({id:"xai-oauth",label:"Grok",connected:!!s,unavailable:s?"quota not published":"not connected"})),{fetchedAt:r,providers:o}}var kt,_e=Le(()=>{kt=Object.freeze([{id:"anthropic-oauth",label:"Claude"},{id:"openai-codex",label:"Codex"},{id:"xai-oauth",label:"Grok"}])});import B from"node:fs";import W from"node:path";import L from"node:fs";import Fe from"node:os";import R from"node:path";import{fileURLToPath as ze}from"node:url";var Ke=R.dirname(ze(import.meta.url)),$t=R.resolve(Ke,"../..");function z(){return process.env.ORACLE_FAKE_HOME||Fe.homedir()}function Me(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function A(){return Me()?process.env.ORACLE_CONFIG_DIR||R.join(z(),".config","oracle"):R.join(z(),".config","oracle")}function Ne(){return R.join(A(),"desk.json")}function Be(){return R.join(A(),"env")}function C({force:e=!1}={}){if(C._done&&!e)return C._result||null;C._done=!0;let t={},r=(n,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=s,t[n]=s))};try{let n=Be();if(L.existsSync(n))for(let i of L.readFileSync(n,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let c=s[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(s[1],c)}}catch{}try{let n=Ne();if(L.existsSync(n)){let i=JSON.parse(L.readFileSync(n,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(r("ORACLE_DESK_URL",o),r("ORACLE_DATA_URL",o),r("ORACLE_API_URL",o),r("ORACLE_PUBLIC_URL",o),r("MAD_DESK_URL",o)),C._result=Object.keys(t).length?t:null,C._result}try{C()}catch{}function K(e){return L.mkdirSync(e,{recursive:!0}),e}var Je=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"]);function M(e){return String(e||"").trim()||void 0}function He(e,{required:t=!1}={}){let r=M(e)?.toLowerCase();if(!r){if(t)throw new Error("model provider is required");return}if(!Je.has(r))throw new Error(`unsupported provider: ${r}`);return r}function qe(e,{required:t=!1}={}){let r=M(e);if(!r){if(t)throw new Error("model is required");return}if(r.includes("..")||r.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(r))throw new Error("invalid model id");return r}function We(e){let t=M(e);if(!t||t.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(t)}catch{throw new Error("invalid custom base URL")}let o=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),n=o==="localhost"||o==="127.0.0.1"||o==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&n)||r.username||r.password||r.search||r.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return r.toString().replace(/\/+$/,"")}function N({provider:e,model:t,baseUrl:r}={},{requireModel:o=!1}={}){let n=He(e),i=qe(t,{required:o});if(n==="custom")return{provider:n,...i?{model:i}:{},baseUrl:We(r)};if(M(r))throw new Error("baseUrl is only supported for the custom provider");return{...n?{provider:n}:{},...i?{model:i}:{}}}var Ve=new Set(["auto","standalone","hermes","remote","arch"]);function Ge(){return W.join(A(),"model.json")}function U(e){return String(e||"").trim()||void 0}function Xe(e={}){let t=U(e.backend)?.toLowerCase()||"auto",r=N({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:t==="standalone"}),o=U(e.apiKeyEnv),n=Number.parseInt(String(e.contextLength||""),10),i=Object.fromEntries(Object.entries(e.contextByModel||{}).filter(([,y])=>Number.isSafeInteger(y)&&y>0)),s=U(e.reasoningEffort),c=U(e.computeHost||e.remoteHost),u=U(e.computeUser||e.remoteUser),m=U(e.computePath||e.remotePath);if(!Ve.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(t==="remote"&&!c)throw new Error("remote backend requires computeHost");return{backend:t,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(n)&&n>0?{contextLength:n}:{},...Object.keys(i).length?{contextByModel:i}:{},...s?{reasoningEffort:s}:{},...c?{computeHost:c}:{},...u?{computeUser:u}:{},...m?{computePath:m}:{}}}function ce(e){let t=Xe(e),r=Ge();K(W.dirname(r)),process.platform!=="win32"&&B.chmodSync(W.dirname(r),448);let o=`${r}.${process.pid}.tmp`;return B.writeFileSync(o,`${JSON.stringify(t,null,2)}
|
|
2
|
+
`,{mode:384}),B.renameSync(o,r),process.platform!=="win32"&&B.chmodSync(r,384),t}import{createHash as st,randomBytes as Q,timingSafeEqual as at}from"node:crypto";import x from"node:fs";import w from"node:path";import ct from"node:readline/promises";import{spawn as ut,spawnSync as dt}from"node:child_process";import b from"node:fs";import v from"node:path";var V=Object.freeze(["anthropic-oauth","openai-codex","xai-oauth"]);function ue(e){let t=String(e||"").trim();if(!t||!v.isAbsolute(t))return"";try{return b.statSync(t).isFile()?t:""}catch{return""}}function Ze(e){try{return b.readdirSync(e,{withFileTypes:!0})}catch{return[]}}function Ye(e=process.env){return!(e.ORACLE_PUBLIC_DESKTOP==="1"&&e.ORACLE_OWNER_DESKTOP!=="1")}function Qe(e=process.env){let t=String(e.ORACLE_REAL_HOME||"").trim();return t&&v.isAbsolute(t)?t:z()}function et(e={}){let t=e.home||Qe(e.env),r={"anthropic-oauth":[],"openai-codex":[],"xai-oauth":[]},o=(i,s)=>{let c=ue(s);c&&(r[i].includes(c)||r[i].push(c))};o("anthropic-oauth",v.join(t,".claude",".credentials.json"));for(let i of Ze(v.join(t,".claude-lanes")))!i.isDirectory()||i.name.startsWith(".")||o("anthropic-oauth",v.join(t,".claude-lanes",i.name,".credentials.json"));let n=v.join(t,".hermes","auth.json");for(let i of V)o(i,n);return o("anthropic-oauth",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),o("openai-codex",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),o("xai-oauth",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),r}function tt(e){if(!b.existsSync(e))return{providers:{}};try{let t=JSON.parse(b.readFileSync(e,"utf8"));return!t||typeof t!="object"||Array.isArray(t)?{providers:{}}:{providers:t.providers&&typeof t.providers=="object"&&!Array.isArray(t.providers)?t.providers:{}}}catch{return{providers:{}}}}function rt(e,t){let r=[];for(let o of[...Array.isArray(e)?e:[],...t]){let n=ue(o)||(v.isAbsolute(String(o||""))?String(o):"");!n||r.includes(n)||r.push(n)}return r}function de(e={}){if(!Ye(e.env))return{wrote:!1,providers:{}};let t=e.linksFile||v.join(A(),"oauth-links.json"),r=et(e),n={providers:{...tt(t).providers||{}}},i=!1;for(let m of V){let y=rt(n.providers[m],r[m]);JSON.stringify(y)!==JSON.stringify(n.providers[m]||[])?(n.providers[m]=y,i=!0):y.length&&(n.providers[m]=y)}if(!V.some(m=>(n.providers[m]||[]).length))return{wrote:!1,providers:n.providers};if(!i&&b.existsSync(t))return{wrote:!1,providers:n.providers};let c=v.dirname(t);if(b.mkdirSync(c,{recursive:!0}),process.platform!=="win32")try{b.chmodSync(c,448)}catch{}let u=`${t}.${process.pid}.tmp`;return b.writeFileSync(u,`${JSON.stringify(n,null,2)}
|
|
3
3
|
`,{mode:384}),b.renameSync(u,t),process.platform!=="win32"&&b.chmodSync(t,384),{wrote:!0,providers:n.providers}}import O from"node:fs";import fe from"node:path";var le=/access|refresh|idToken|id_token|token|secret|key|seed|mnemonic/i;function ot(e=A()){return fe.join(e,"user-profile.json")}function nt(e){if(!O.existsSync(e))return{identities:{},wallets:{}};try{let t=JSON.parse(O.readFileSync(e,"utf8"));return!t||typeof t!="object"||Array.isArray(t)?{identities:{},wallets:{}}:{identities:t.identities&&typeof t.identities=="object"?t.identities:{},wallets:t.wallets&&typeof t.wallets=="object"?t.wallets:{},updatedAt:t.updatedAt}}catch{return{identities:{},wallets:{}}}}function pe(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t={};for(let[r,o]of Object.entries(e))if(!le.test(r)){if(typeof o=="string"||typeof o=="number"||typeof o=="boolean"){t[r]=o;continue}if(o&&typeof o=="object"&&!Array.isArray(o)){let n={};for(let[i,s]of Object.entries(o))le.test(i)||(typeof s=="string"||typeof s=="number"||typeof s=="boolean")&&(n[i]=s);t[r]=n}}return t}function it(e,t){let r=fe.dirname(e);if(O.mkdirSync(r,{recursive:!0}),process.platform!=="win32")try{O.chmodSync(r,448)}catch{}let o={updatedAt:new Date().toISOString(),identities:pe(t.identities),wallets:pe(t.wallets)},n=`${e}.${process.pid}.tmp`;return O.writeFileSync(n,`${JSON.stringify(o,null,2)}
|
|
4
|
-
`,{mode:384}),O.renameSync(n,e),process.platform!=="win32"&&O.chmodSync(e,384),o}function G(e){let r=String(e||"").trim().split(".");if(r.length<2)return{};try{let o=JSON.parse(Buffer.from(r[1],"base64url").toString("utf8")),n=String(o.email||"").trim(),i=String(o.name||o.preferred_username||"").trim();return{...n?{email:n}:{},...i?{name:i}:{}}}catch{return{}}}function X(e,t={},r={}){let o=String(e||"").trim();if(!o)return null;let n=r.file||ot(r.configDir),i=nt(n),s=i.identities[o]&&typeof i.identities[o]=="object"?i.identities[o]:{};return i.identities[o]={...s,provider:o,source:String(t.source||s.source||"oracle"),loggedInAt:t.loggedInAt||new Date().toISOString(),...t.label?{label:String(t.label)}:{},...t.email?{email:String(t.email)}:{},...t.name?{name:String(t.name)}:{}},it(n,i)}var T=Object.freeze({"anthropic-oauth":{aliases:["anthropic-oauth","anthropic","claude","claude-oauth"],clientId:"9d1c250a-e61b-44d9-88ed-5944d1962f5e",authorizeUrl:"https://claude.ai/oauth/authorize",tokenUrl:"https://platform.claude.com/v1/oauth/token",redirectUri:"https://console.anthropic.com/oauth/code/callback",scope:"org:create_api_key user:profile user:inference",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},"openai-codex":{aliases:["openai-codex","openai-oauth","codex","codex-oauth"],clientId:"app_EMoamEEZ73f0CkXaXp7hrann",issuer:"https://auth.openai.com",tokenUrl:"https://auth.openai.com/oauth/token",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.6-sol",protocol:"responses"},"xai-oauth":{aliases:["xai-oauth","xai","grok","grok-oauth"],clientId:"b1a00492-073a-47ea-816f-4c329264a828",issuer:"https://auth.x.ai",discoveryUrl:"https://auth.x.ai/.well-known/openid-configuration",deviceUrl:"https://auth.x.ai/oauth2/device/code",scope:"openid profile email offline_access grok-cli:access api:access",baseUrl:"https://api.x.ai/v1",model:"grok-4.6",protocol:"responses"}}),he=12e4;function lt(e={}){return typeof e.now=="function"?Number(e.now()):Date.now()}function E(e){let t=String(e||"").trim().toLowerCase();for(let[r,o]of Object.entries(T))if(o.aliases.includes(t))return r;throw new Error(`unsupported OAuth provider: ${e||"(empty)"}`)}function ye(e){let t=E(e);return{id:t,...T[t]}}function g(e,t={}){if(!
|
|
5
|
-
`,{mode:384}),k.renameSync(r,e),process.platform!=="win32"&&k.chmodSync(e,384)}function pt(e){if(process.platform!=="linux")return!1;let t=e("secret-tool",["--version"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return!t.error&&t.status===0}function Z(e){let t=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(t))throw new Error(`invalid API-key provider: ${e||"(empty)"}`);return t}function $(e={}){let t=String(e.accessToken||e.access_token||"").trim(),r=String(e.refreshToken||e.refresh_token||"").trim(),o=Number(e.expiresAt||e.expires_at||0);if(Number.isFinite(o)&&o>=1e9&&o<1e12&&(o=o*1e3),!t)throw new Error("OAuth credential is missing access token");return{accessToken:t,refreshToken:r,expiresAt:Number.isFinite(o)?o:0,tokenType:String(e.tokenType||e.token_type||"Bearer"),source:String(e.source||"oracle"),...e.discovery?{discovery:e.discovery}:{},...e.scope?{scope:e.scope}:{},...e.idToken||e.id_token?{idToken:String(e.idToken||e.id_token)}:{}}}function ft(e={}){let t=e.file||y.join(A(),"oauth.json"),r=e.metadataFile||y.join(y.dirname(t),"oauth-meta.json"),o=e.linksFile||y.join(y.dirname(t),"oauth-links.json"),n=()=>typeof e.now=="function"?Number(e.now()):Date.now(),i=e.spawnFn||dt,s=e.keychain!==!1&&process.env.ORACLE_AUTH_FILE_STORE!=="1"&&pt(i),c=s?"linux-secret-service":"private-file",u=`${t}.lock`;async function m(f){we(y.dirname(u));let l;for(let a=0;a<400;a+=1)try{l=k.openSync(u,"wx",384);break}catch(d){if(d?.code!=="EEXIST")throw d;try{Date.now()-k.statSync(u).mtimeMs>3e5&&k.unlinkSync(u)}catch{}await new Promise(p=>setTimeout(p,25))}if(l===void 0)throw new Error("timed out waiting for OAuth credential lock");try{return await f()}finally{try{k.closeSync(l)}catch{}try{k.unlinkSync(u)}catch{}}}function w(f,l="oauth"){return["application","oracle","kind",l,"provider",f]}let D=!1;function ie(){if(D)return;D=!0;let f=y.join(A(),"oauth-links.json");if(y.resolve(o)===y.resolve(f))try{de({linksFile:o})}catch{}}function F(f){if(ie(),!k.existsSync(o))return[];let a=g(o,{providers:{}}).providers?.[f];if(!Array.isArray(a))return[];let d=[];for(let p of a)if(y.isAbsolute(String(p||"")))try{let h=g(p,{});if(f==="anthropic-oauth"&&h.claudeAiOauth){let S=$(h.claudeAiOauth);d.push({...S,refreshToken:"",source:"external-access-only",label:y.basename(y.dirname(p))||"claude-lane"});continue}let x=h.credential_pool&&typeof h.credential_pool=="object"?h.credential_pool:null;if(x){let S=x[f]||x[f.replace(/-oauth$/,"")]||[],$e=Array.isArray(S)?S:S?[S]:[];for(let I of $e)if(!(!I||typeof I!="object"))try{let Te=$(I);d.push({...Te,refreshToken:"",source:"external-access-only",label:String(I.label||I.id||y.basename(y.dirname(p))||f)})}catch{}}}catch{}return d}function H(f){let l=F(f);return l.length?l.find(a=>!a.expiresAt||a.expiresAt>n()+he)||l[0]:null}function q(f){return f.map(l=>({label:String(l.label||"lane"),source:"external-access-only",expiresAt:Number(l.expiresAt||0),healthy:!l.expiresAt||l.expiresAt>n()+he}))}function se(f){let l=E(f);if(s){let p=i("secret-tool",["lookup",...w(l)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(!p.error&&p.status===0&&String(p.stdout||"").trim())try{return $(JSON.parse(String(p.stdout).trim()))}catch{}return H(l)}let d=g(t,{providers:{}}).providers?.[l];if(d)try{return $(d)}catch{}return H(l)}function je(f,l){let a=E(f),d=$(l);if(s){let h=i("secret-tool",["store",`--label=Oracle ${a} OAuth`,...w(a)],{input:JSON.stringify(d),encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(h.error||h.status!==0)throw new Error("OS credential store rejected OAuth credential");let x=g(r,{providers:{}});x.providers||={},x.providers[a]={expiresAt:d.expiresAt,source:d.source},_(r,x);try{let S=G(d.idToken);X(a,{source:d.source,...S,label:S.name||S.email||a},{configDir:y.dirname(t)})}catch{}return d}let p=g(t,{providers:{}});p.providers||={},p.providers[a]=d,_(t,p);try{let h=G(d.idToken);X(a,{source:d.source,...h,label:h.name||h.email||a},{configDir:y.dirname(t)})}catch{}return d}function Pe(f){let l=E(f);if(s){let p=i("secret-tool",["clear",...w(l)],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),h=g(r,{providers:{}});return h.providers&&delete h.providers[l],_(r,h),!p.error&&p.status===0}let a=g(t,{providers:{}}),d=!!a.providers?.[l];return a.providers&&delete a.providers[l],_(t,a),d}function ae(f){let l=Z(f);if(s){let a=i("secret-tool",["lookup",...w(l,"api-key")],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return a.error||a.status!==0?"":String(a.stdout||"").trim()}return String(g(t,{apiKeys:{}}).apiKeys?.[l]||"").trim()}function Ce(f,l){let a=Z(f),d=String(l||"").trim();if(!d)throw new Error("API key is empty");if(s){let h=i("secret-tool",["store",`--label=Oracle ${a} API key`,...w(a,"api-key")],{input:d,encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(h.error||h.status!==0)throw new Error("OS credential store rejected API key");let x=g(r,{providers:{},apiKeys:{}});return x.apiKeys||={},x.apiKeys[a]={configured:!0},_(r,x),!0}let p=g(t,{providers:{},apiKeys:{}});return p.apiKeys||={},p.apiKeys[a]=d,_(t,p),!0}function Re(f){let l=Z(f);if(s){let p=i("secret-tool",["clear",...w(l,"api-key")],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),h=g(r,{providers:{},apiKeys:{}});return h.apiKeys&&delete h.apiKeys[l],_(r,h),!p.error&&p.status===0}let a=g(t,{providers:{},apiKeys:{}}),d=!!a.apiKeys?.[l];return a.apiKeys&&delete a.apiKeys[l],_(t,a),d}function Ue(){ie();let f={},l={};if(s){let a=g(r,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(a.providers||{}))f[d]={loggedIn:!!se(d),expiresAt:Number(p.expiresAt||0),source:String(p.source||"oracle"),storage:c,lanes:q(F(d))};for(let d of Object.keys(a.apiKeys||{}))l[d]={configured:!!ae(d),storage:c}}else{let a=g(t,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(a.providers||{}))f[d]={loggedIn:!!p?.accessToken,expiresAt:Number(p?.expiresAt||0),source:String(p?.source||"oracle"),storage:c,lanes:q(F(d))};for(let[d,p]of Object.entries(a.apiKeys||{}))l[d]={configured:!!p,storage:c}}for(let a of Object.keys(T)){let d=q(F(a));if(f[a]){f[a].lanes=d;continue}let p=H(a);p&&(f[a]={loggedIn:!0,expiresAt:p.expiresAt,source:p.source,storage:"external-access-source",lanes:d})}return{storage:c,providers:f,apiKeys:l}}return Object.freeze({file:t,storage:c,get:se,set:je,remove:Pe,getApiKey:ae,setApiKey:Ce,removeApiKey:Re,status:Ue,withLock:m})}var me;function ge(){return me||=ft(),me}function Y(e){return Buffer.from(e).toString("base64url")}function ht(){let e=Y(Q(32));return{verifier:e,challenge:Y(st("sha256").update(e).digest()),state:Y(Q(24))}}function mt(e,t){let r=Buffer.from(String(e||"")),o=Buffer.from(String(t||""));return r.length===o.length&&at(r,o)}function yt(e){let t=String(e),r=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd.exe",["/d","/s","/c","start","",t]]:["xdg-open",[t]];try{return ut(r[0],r[1],{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function ee(e){return new URLSearchParams(e).toString()}async function j(e,t){if(!e?.ok){let o="";try{o=String((await e.json())?.error||"")}catch{}throw new Error(`${t} failed (HTTP ${e?.status||"unknown"}${o?`, ${o}`:""})`)}let r=await e.json();if(!r||typeof r!="object")throw new Error(`${t} returned invalid JSON`);return r}async function wt(e){if(e)return String(await e()).trim();let t=ct.createInterface({input:process.stdin,output:process.stdout});try{return String(await t.question("Authorization code: ")).trim()}finally{t.close()}}function te(e,t={}){let r=String(e.access_token||"").trim(),o=String(e.refresh_token||t.refreshToken||"").trim();if(!r)throw new Error("OAuth token response is missing access token");let n=Number(e.expires_in||3600);return $({accessToken:r,refreshToken:o,expiresAt:lt(t)+Math.max(1,n)*1e3,tokenType:e.token_type||"Bearer",idToken:e.id_token,source:"oracle",...t.discovery?{discovery:t.discovery}:{},...e.scope?{scope:e.scope}:{}})}async function gt(e){let t=T["anthropic-oauth"],r=e.pkce||ht(),o=new URLSearchParams({code:"true",client_id:t.clientId,response_type:"code",redirect_uri:t.redirectUri,scope:t.scope,code_challenge:r.challenge,code_challenge_method:"S256",state:r.state}),n=`${t.authorizeUrl}?${o}`;e.output(`Open: ${n}`),e.openFn(n);let i=await wt(e.inputFn),[s,c]=i.split("#",2);if(!s||!mt(c,r.state))throw new Error("Claude OAuth state mismatch");let u=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/json","user-agent":"axios/1.7.9"},body:JSON.stringify({grant_type:"authorization_code",client_id:t.clientId,code:s,state:c,redirect_uri:t.redirectUri,code_verifier:r.verifier})});return te(await j(u,"Claude OAuth token exchange"),e)}async function vt(e){let t=T["openai-codex"],r=await j(await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/usercode`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:t.clientId})}),"Codex device authorization");if(!r.user_code||!r.device_auth_id)throw new Error("Codex device authorization returned incomplete data");let o=`${t.issuer}/codex/device`;e.output(`Open: ${o}`),e.output(`Code: ${r.user_code}`),e.openFn(o);let n=Math.max(3,Number(r.interval||5)),i;for(let c=0;c<Math.ceil(900/n);c+=1){await e.sleepFn(n*1e3);let u=await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_auth_id:r.device_auth_id,user_code:r.user_code})});if(u.ok){i=await j(u,"Codex device authorization");break}if(![403,404].includes(u.status))throw new Error(`Codex device authorization failed (HTTP ${u.status})`)}if(!i)throw new Error("Codex device authorization timed out");let s=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:ee({grant_type:"authorization_code",code:i.authorization_code,redirect_uri:`${t.issuer}/deviceauth/callback`,client_id:t.clientId,code_verifier:i.code_verifier})});return te(await j(s,"Codex OAuth token exchange"),e)}function J(e){let t=new URL(String(e)),r=t.hostname.toLowerCase();if(t.protocol!=="https:"||r!=="x.ai"&&!r.endsWith(".x.ai"))throw new Error("xAI OAuth discovery returned an untrusted endpoint");return t.toString()}async function kt(e){let t=T["xai-oauth"],r=await j(await e.fetchFn(t.discoveryUrl,{headers:{accept:"application/json"}}),"xAI OAuth discovery");J(r.authorization_endpoint);let o=J(r.token_endpoint),n=await j(await e.fetchFn(t.deviceUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:ee({client_id:t.clientId,scope:t.scope})}),"xAI device authorization");if(!n.device_code||!n.user_code||!n.verification_uri)throw new Error("xAI device authorization returned incomplete data");let i=J(n.verification_uri_complete||n.verification_uri);e.output(`Open: ${i}`),e.output(`Code: ${n.user_code}`),e.openFn(i);let s=Math.max(1,Number(n.interval||5)),c=Math.ceil(Math.max(1,Number(n.expires_in||600))/s);for(let u=0;u<c;u+=1){let m=await e.fetchFn(o,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:ee({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:t.clientId,device_code:n.device_code})});if(m.ok){let D=await j(m,"xAI OAuth token exchange");return te(D,{...e,discovery:{authorization_endpoint:J(r.authorization_endpoint),token_endpoint:o}})}let w="";try{w=String((await m.json())?.error||"")}catch{}if(w==="slow_down")await e.sleepFn((s+1)*1e3);else if(w==="authorization_pending")await e.sleepFn(s*1e3);else throw new Error(`xAI OAuth token exchange failed (HTTP ${m.status}${w?`, ${w}`:""})`)}throw new Error("xAI device authorization timed out")}async function ve(e,t={}){let r=E(e),o={fetchFn:t.fetchFn||globalThis.fetch,inputFn:t.inputFn,sleepFn:t.sleepFn||(n=>new Promise(i=>setTimeout(i,n))),openFn:t.openFn||yt,output:t.output||(n=>process.stdout.write(`${n}
|
|
6
|
-
`)),now:t.now,pkce:t.pkce};return r==="anthropic-oauth"?gt(o):r==="openai-codex"?vt(o):
|
|
4
|
+
`,{mode:384}),O.renameSync(n,e),process.platform!=="win32"&&O.chmodSync(e,384),o}function G(e){let r=String(e||"").trim().split(".");if(r.length<2)return{};try{let o=JSON.parse(Buffer.from(r[1],"base64url").toString("utf8")),n=String(o.email||"").trim(),i=String(o.name||o.preferred_username||"").trim();return{...n?{email:n}:{},...i?{name:i}:{}}}catch{return{}}}function X(e,t={},r={}){let o=String(e||"").trim();if(!o)return null;let n=r.file||ot(r.configDir),i=nt(n),s=i.identities[o]&&typeof i.identities[o]=="object"?i.identities[o]:{};return i.identities[o]={...s,provider:o,source:String(t.source||s.source||"oracle"),loggedInAt:t.loggedInAt||new Date().toISOString(),...t.label?{label:String(t.label)}:{},...t.email?{email:String(t.email)}:{},...t.name?{name:String(t.name)}:{}},it(n,i)}var T=Object.freeze({"anthropic-oauth":{aliases:["anthropic-oauth","anthropic","claude","claude-oauth"],clientId:"9d1c250a-e61b-44d9-88ed-5944d1962f5e",authorizeUrl:"https://claude.ai/oauth/authorize",tokenUrl:"https://platform.claude.com/v1/oauth/token",redirectUri:"https://console.anthropic.com/oauth/code/callback",scope:"org:create_api_key user:profile user:inference",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},"openai-codex":{aliases:["openai-codex","openai-oauth","codex","codex-oauth"],clientId:"app_EMoamEEZ73f0CkXaXp7hrann",issuer:"https://auth.openai.com",tokenUrl:"https://auth.openai.com/oauth/token",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.6-sol",protocol:"responses"},"xai-oauth":{aliases:["xai-oauth","xai","grok","grok-oauth"],clientId:"b1a00492-073a-47ea-816f-4c329264a828",issuer:"https://auth.x.ai",discoveryUrl:"https://auth.x.ai/.well-known/openid-configuration",deviceUrl:"https://auth.x.ai/oauth2/device/code",scope:"openid profile email offline_access grok-cli:access api:access",baseUrl:"https://api.x.ai/v1",model:"grok-4.6",protocol:"responses"}}),he=12e4;function lt(e={}){return typeof e.now=="function"?Number(e.now()):Date.now()}function E(e){let t=String(e||"").trim().toLowerCase();for(let[r,o]of Object.entries(T))if(o.aliases.includes(t))return r;throw new Error(`unsupported OAuth provider: ${e||"(empty)"}`)}function ye(e){let t=E(e);return{id:t,...T[t]}}function g(e,t={}){if(!x.existsSync(e))return t;try{let r=JSON.parse(x.readFileSync(e,"utf8"));if(!r||typeof r!="object"||Array.isArray(r))throw new Error("invalid object");return r}catch{throw new Error(`credential store is unreadable or corrupt: ${w.basename(e)}`)}}function we(e){K(e),process.platform!=="win32"&&x.chmodSync(e,448)}function _(e,t){we(w.dirname(e));let r=`${e}.${process.pid}.${Q(4).toString("hex")}.tmp`;x.writeFileSync(r,`${JSON.stringify(t,null,2)}
|
|
5
|
+
`,{mode:384}),x.renameSync(r,e),process.platform!=="win32"&&x.chmodSync(e,384)}function pt(e){if(process.platform!=="linux")return!1;let t=e("secret-tool",["--version"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return!t.error&&t.status===0}function Z(e){let t=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(t))throw new Error(`invalid API-key provider: ${e||"(empty)"}`);return t}function $(e={}){let t=String(e.accessToken||e.access_token||"").trim(),r=String(e.refreshToken||e.refresh_token||"").trim(),o=e.expires_at_ms!=null,n;if(o){let i=e.expires_at_ms;if(n=Number(i),typeof i!="number"&&typeof i!="string"||typeof i=="string"&&!i.trim()||!Number.isFinite(n)||n<=0)throw new Error("OAuth credential has invalid expires_at_ms")}else n=Number(e.expiresAt||e.expires_at||0),Number.isFinite(n)&&n>=1e9&&n<1e12&&(n=n*1e3);if(!t)throw new Error("OAuth credential is missing access token");return{accessToken:t,refreshToken:r,expiresAt:Number.isFinite(n)?n:0,tokenType:String(e.tokenType||e.token_type||"Bearer"),source:String(e.source||"oracle"),...e.discovery?{discovery:e.discovery}:{},...e.scope?{scope:e.scope}:{},...e.idToken||e.id_token?{idToken:String(e.idToken||e.id_token)}:{}}}function ft(e={}){let t=e.file||w.join(A(),"oauth.json"),r=e.metadataFile||w.join(w.dirname(t),"oauth-meta.json"),o=e.linksFile||w.join(w.dirname(t),"oauth-links.json"),n=()=>typeof e.now=="function"?Number(e.now()):Date.now(),i=e.spawnFn||dt,s=e.keychain!==!1&&process.env.ORACLE_AUTH_FILE_STORE!=="1"&&pt(i),c=s?"linux-secret-service":"private-file",u=`${t}.lock`;async function m(f){we(w.dirname(u));let l;for(let a=0;a<400;a+=1)try{l=x.openSync(u,"wx",384);break}catch(d){if(d?.code!=="EEXIST")throw d;try{Date.now()-x.statSync(u).mtimeMs>3e5&&x.unlinkSync(u)}catch{}await new Promise(p=>setTimeout(p,25))}if(l===void 0)throw new Error("timed out waiting for OAuth credential lock");try{return await f()}finally{try{x.closeSync(l)}catch{}try{x.unlinkSync(u)}catch{}}}function y(f,l="oauth"){return["application","oracle","kind",l,"provider",f]}let D=!1;function ie(){if(D)return;D=!0;let f=w.join(A(),"oauth-links.json");if(w.resolve(o)===w.resolve(f))try{de({linksFile:o})}catch{}}function F(f){if(ie(),!x.existsSync(o))return[];let a=g(o,{providers:{}}).providers?.[f];if(!Array.isArray(a))return[];let d=[];for(let p of a)if(w.isAbsolute(String(p||"")))try{let h=g(p,{});if(f==="anthropic-oauth"&&h.claudeAiOauth){let S=$(h.claudeAiOauth);d.push({...S,refreshToken:"",source:"external-access-only",label:w.basename(w.dirname(p))||"claude-lane"});continue}let k=h.credential_pool&&typeof h.credential_pool=="object"?h.credential_pool:null;if(k){let S=k[f]||k[f.replace(/-oauth$/,"")]||[],$e=Array.isArray(S)?S:S?[S]:[];for(let I of $e)if(!(!I||typeof I!="object"))try{let Te=$(I);d.push({...Te,refreshToken:"",source:"external-access-only",label:String(I.label||I.id||w.basename(w.dirname(p))||f)})}catch{}}}catch{}return d}function H(f){let l=F(f);return l.length?l.find(a=>!a.expiresAt||a.expiresAt>n()+he)||l[0]:null}function q(f){return f.map(l=>({label:String(l.label||"lane"),source:"external-access-only",expiresAt:Number(l.expiresAt||0),healthy:!l.expiresAt||l.expiresAt>n()+he}))}function se(f){let l=E(f);if(s){let p=i("secret-tool",["lookup",...y(l)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(!p.error&&p.status===0&&String(p.stdout||"").trim())try{return $(JSON.parse(String(p.stdout).trim()))}catch{}return H(l)}let d=g(t,{providers:{}}).providers?.[l];if(d)try{return $(d)}catch{}return H(l)}function je(f,l){let a=E(f),d=$(l);if(s){let h=i("secret-tool",["store",`--label=Oracle ${a} OAuth`,...y(a)],{input:JSON.stringify(d),encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(h.error||h.status!==0)throw new Error("OS credential store rejected OAuth credential");let k=g(r,{providers:{}});k.providers||={},k.providers[a]={expiresAt:d.expiresAt,source:d.source},_(r,k);try{let S=G(d.idToken);X(a,{source:d.source,...S,label:S.name||S.email||a},{configDir:w.dirname(t)})}catch{}return d}let p=g(t,{providers:{}});p.providers||={},p.providers[a]=d,_(t,p);try{let h=G(d.idToken);X(a,{source:d.source,...h,label:h.name||h.email||a},{configDir:w.dirname(t)})}catch{}return d}function Pe(f){let l=E(f);if(s){let p=i("secret-tool",["clear",...y(l)],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),h=g(r,{providers:{}});return h.providers&&delete h.providers[l],_(r,h),!p.error&&p.status===0}let a=g(t,{providers:{}}),d=!!a.providers?.[l];return a.providers&&delete a.providers[l],_(t,a),d}function ae(f){let l=Z(f);if(s){let a=i("secret-tool",["lookup",...y(l,"api-key")],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return a.error||a.status!==0?"":String(a.stdout||"").trim()}return String(g(t,{apiKeys:{}}).apiKeys?.[l]||"").trim()}function Ce(f,l){let a=Z(f),d=String(l||"").trim();if(!d)throw new Error("API key is empty");if(s){let h=i("secret-tool",["store",`--label=Oracle ${a} API key`,...y(a,"api-key")],{input:d,encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(h.error||h.status!==0)throw new Error("OS credential store rejected API key");let k=g(r,{providers:{},apiKeys:{}});return k.apiKeys||={},k.apiKeys[a]={configured:!0},_(r,k),!0}let p=g(t,{providers:{},apiKeys:{}});return p.apiKeys||={},p.apiKeys[a]=d,_(t,p),!0}function Re(f){let l=Z(f);if(s){let p=i("secret-tool",["clear",...y(l,"api-key")],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),h=g(r,{providers:{},apiKeys:{}});return h.apiKeys&&delete h.apiKeys[l],_(r,h),!p.error&&p.status===0}let a=g(t,{providers:{},apiKeys:{}}),d=!!a.apiKeys?.[l];return a.apiKeys&&delete a.apiKeys[l],_(t,a),d}function Ue(){ie();let f={},l={};if(s){let a=g(r,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(a.providers||{}))f[d]={loggedIn:!!se(d),expiresAt:Number(p.expiresAt||0),source:String(p.source||"oracle"),storage:c,lanes:q(F(d))};for(let d of Object.keys(a.apiKeys||{}))l[d]={configured:!!ae(d),storage:c}}else{let a=g(t,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(a.providers||{}))f[d]={loggedIn:!!p?.accessToken,expiresAt:Number(p?.expiresAt||0),source:String(p?.source||"oracle"),storage:c,lanes:q(F(d))};for(let[d,p]of Object.entries(a.apiKeys||{}))l[d]={configured:!!p,storage:c}}for(let a of Object.keys(T)){let d=q(F(a));if(f[a]){f[a].lanes=d;continue}let p=H(a);p&&(f[a]={loggedIn:!0,expiresAt:p.expiresAt,source:p.source,storage:"external-access-source",lanes:d})}return{storage:c,providers:f,apiKeys:l}}return Object.freeze({file:t,storage:c,get:se,set:je,remove:Pe,getApiKey:ae,setApiKey:Ce,removeApiKey:Re,status:Ue,withLock:m})}var me;function ge(){return me||=ft(),me}function Y(e){return Buffer.from(e).toString("base64url")}function ht(){let e=Y(Q(32));return{verifier:e,challenge:Y(st("sha256").update(e).digest()),state:Y(Q(24))}}function mt(e,t){let r=Buffer.from(String(e||"")),o=Buffer.from(String(t||""));return r.length===o.length&&at(r,o)}function yt(e){let t=String(e),r=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd.exe",["/d","/s","/c","start","",t]]:["xdg-open",[t]];try{return ut(r[0],r[1],{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function ee(e){return new URLSearchParams(e).toString()}async function j(e,t){if(!e?.ok){let o="";try{o=String((await e.json())?.error||"")}catch{}throw new Error(`${t} failed (HTTP ${e?.status||"unknown"}${o?`, ${o}`:""})`)}let r=await e.json();if(!r||typeof r!="object")throw new Error(`${t} returned invalid JSON`);return r}async function wt(e){if(e)return String(await e()).trim();let t=ct.createInterface({input:process.stdin,output:process.stdout});try{return String(await t.question("Authorization code: ")).trim()}finally{t.close()}}function te(e,t={}){let r=String(e.access_token||"").trim(),o=String(e.refresh_token||t.refreshToken||"").trim();if(!r)throw new Error("OAuth token response is missing access token");let n=Number(e.expires_in||3600);return $({accessToken:r,refreshToken:o,expiresAt:lt(t)+Math.max(1,n)*1e3,tokenType:e.token_type||"Bearer",idToken:e.id_token,source:"oracle",...t.discovery?{discovery:t.discovery}:{},...e.scope?{scope:e.scope}:{}})}async function gt(e){let t=T["anthropic-oauth"],r=e.pkce||ht(),o=new URLSearchParams({code:"true",client_id:t.clientId,response_type:"code",redirect_uri:t.redirectUri,scope:t.scope,code_challenge:r.challenge,code_challenge_method:"S256",state:r.state}),n=`${t.authorizeUrl}?${o}`;e.output(`Open: ${n}`),e.openFn(n);let i=await wt(e.inputFn),[s,c]=i.split("#",2);if(!s||!mt(c,r.state))throw new Error("Claude OAuth state mismatch");let u=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/json","user-agent":"axios/1.7.9"},body:JSON.stringify({grant_type:"authorization_code",client_id:t.clientId,code:s,state:c,redirect_uri:t.redirectUri,code_verifier:r.verifier})});return te(await j(u,"Claude OAuth token exchange"),e)}async function vt(e){let t=T["openai-codex"],r=await j(await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/usercode`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:t.clientId})}),"Codex device authorization");if(!r.user_code||!r.device_auth_id)throw new Error("Codex device authorization returned incomplete data");let o=`${t.issuer}/codex/device`;e.output(`Open: ${o}`),e.output(`Code: ${r.user_code}`),e.openFn(o);let n=Math.max(3,Number(r.interval||5)),i;for(let c=0;c<Math.ceil(900/n);c+=1){await e.sleepFn(n*1e3);let u=await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_auth_id:r.device_auth_id,user_code:r.user_code})});if(u.ok){i=await j(u,"Codex device authorization");break}if(![403,404].includes(u.status))throw new Error(`Codex device authorization failed (HTTP ${u.status})`)}if(!i)throw new Error("Codex device authorization timed out");let s=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:ee({grant_type:"authorization_code",code:i.authorization_code,redirect_uri:`${t.issuer}/deviceauth/callback`,client_id:t.clientId,code_verifier:i.code_verifier})});return te(await j(s,"Codex OAuth token exchange"),e)}function J(e){let t=new URL(String(e)),r=t.hostname.toLowerCase();if(t.protocol!=="https:"||r!=="x.ai"&&!r.endsWith(".x.ai"))throw new Error("xAI OAuth discovery returned an untrusted endpoint");return t.toString()}async function xt(e){let t=T["xai-oauth"],r=await j(await e.fetchFn(t.discoveryUrl,{headers:{accept:"application/json"}}),"xAI OAuth discovery");J(r.authorization_endpoint);let o=J(r.token_endpoint),n=await j(await e.fetchFn(t.deviceUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:ee({client_id:t.clientId,scope:t.scope})}),"xAI device authorization");if(!n.device_code||!n.user_code||!n.verification_uri)throw new Error("xAI device authorization returned incomplete data");let i=J(n.verification_uri_complete||n.verification_uri);e.output(`Open: ${i}`),e.output(`Code: ${n.user_code}`),e.openFn(i);let s=Math.max(1,Number(n.interval||5)),c=Math.ceil(Math.max(1,Number(n.expires_in||600))/s);for(let u=0;u<c;u+=1){let m=await e.fetchFn(o,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:ee({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:t.clientId,device_code:n.device_code})});if(m.ok){let D=await j(m,"xAI OAuth token exchange");return te(D,{...e,discovery:{authorization_endpoint:J(r.authorization_endpoint),token_endpoint:o}})}let y="";try{y=String((await m.json())?.error||"")}catch{}if(y==="slow_down")await e.sleepFn((s+1)*1e3);else if(y==="authorization_pending")await e.sleepFn(s*1e3);else throw new Error(`xAI OAuth token exchange failed (HTTP ${m.status}${y?`, ${y}`:""})`)}throw new Error("xAI device authorization timed out")}async function ve(e,t={}){let r=E(e),o={fetchFn:t.fetchFn||globalThis.fetch,inputFn:t.inputFn,sleepFn:t.sleepFn||(n=>new Promise(i=>setTimeout(i,n))),openFn:t.openFn||yt,output:t.output||(n=>process.stdout.write(`${n}
|
|
6
|
+
`)),now:t.now,pkce:t.pkce};return r==="anthropic-oauth"?gt(o):r==="openai-codex"?vt(o):xt(o)}var Oe=Object.freeze({openrouter:{model:"openrouter/auto"},openai:{model:"gpt-4.1-mini"},anthropic:{model:"claude-sonnet-4-6"},xai:{model:"grok-4.6"},deepseek:{model:"deepseek-chat"},gemini:{model:"gemini-2.5-flash"},kimi:{model:"kimi-k3"},mistral:{model:"mistral-large-latest"},nous:{model:"moonshotai/kimi-k3"},qwen:{model:"qwen-plus"},glm:{model:"glm-4.5"},custom:{model:""}});function oe(e,t){let r=e.indexOf(t);return r>=0&&e[r+1]?e[r+1]:""}async function bt(){let e="";for await(let t of process.stdin)e+=t;return e.trim()}function _t(e="API key: "){if(!process.stdin.isTTY||!process.stdin.setRawMode)throw new Error("non-interactive API-key input requires --stdin");return process.stdout.write(e),new Promise((t,r)=>{let o="",n=()=>{process.stdin.off("data",i),process.stdin.setRawMode(!1),process.stdin.pause(),process.stdout.write(`
|
|
7
7
|
`)},i=s=>{let c=String(s);for(let u of c){if(u==="\r"||u===`
|
|
8
8
|
`){n(),t(o.trim());return}if(u===""){n(),r(new Error("cancelled"));return}u==="\x7F"||u==="\b"?o=o.slice(0,-1):o+=u}};process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on("data",i)})}function ne(e,t,{baseUrl:r=""}={}){if(e==="custom"&&!String(r||"").trim())throw new Error("custom provider requires --base-url");return{backend:"standalone",...N({provider:e,model:t,baseUrl:r},{requireModel:!0})}}function Ee(e,t,r={}){return ce(ne(e,t,r))}function Ot(e){process.stdout.write(`storage: ${e.storage}
|
|
9
9
|
`);let t=Object.entries(e.providers||{}),r=Object.entries(e.apiKeys||{});if(!t.length&&!r.length){process.stdout.write(`no credentials configured
|