@oracle-agent/oracle 0.28.28 → 0.28.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +10 -3
  2. package/SETUP.md +3 -0
  3. package/dist/assets/skills/bankrbot/SKILL.md +24 -0
  4. package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +39 -0
  5. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  6. package/dist/assets/skills/oracle-uniswap-v4-hooks/SKILL.md +31 -0
  7. package/dist/assets/skills/oracle-x402/SKILL.md +30 -0
  8. package/dist/bin/desk-server.mjs +28 -26
  9. package/dist/bin/oracle-data-mcp.mjs +32 -12
  10. package/dist/bin/oracle-gateway.mjs +39 -27
  11. package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
  12. package/dist/bin/oracle-mev-shadow.mjs +5 -5
  13. package/dist/bin/oracle-public-server.mjs +4 -4
  14. package/dist/bin/oracle-route.mjs +15 -15
  15. package/dist/bin/oracle-scan.mjs +11 -11
  16. package/dist/bin/oracle.mjs +4 -3
  17. package/dist/cli/commands/auth.mjs +6 -6
  18. package/dist/cli/commands/chat.mjs +155 -155
  19. package/dist/cli/commands/doctor.mjs +1 -1
  20. package/dist/cli/commands/eval.mjs +77 -77
  21. package/dist/cli/commands/harness.mjs +4 -4
  22. package/dist/cli/commands/model.mjs +157 -157
  23. package/dist/cli/commands/receipt.mjs +1 -1
  24. package/dist/cli/commands/setup.mjs +23 -23
  25. package/dist/cli/commands/snipe.mjs +24 -0
  26. package/dist/cli/commands/swap.mjs +25 -25
  27. package/dist/cli/commands/venues.mjs +1 -1
  28. package/dist/control/approval-binding.mjs +1 -0
  29. package/dist/control/finality.mjs +1 -0
  30. package/dist/control-plane/index.mjs +6 -0
  31. package/dist/data/desk-data.mjs +26 -24
  32. package/dist/governance-prepare.mjs +2 -0
  33. package/dist/index.mjs +44 -31
  34. package/dist/local-marketplace.mjs +3 -0
  35. package/dist/local-pack-registry.mjs +3 -0
  36. package/dist/local-x402.mjs +3 -0
  37. package/dist/notifications/index.mjs +3 -0
  38. package/dist/position-health.mjs +2 -0
  39. package/dist/router/index.mjs +2 -2
  40. package/dist/router/prepare-bridge.mjs +2 -2
  41. package/dist/safety-intelligence.mjs +1 -0
  42. package/dist/scanner/index.mjs +3 -3
  43. package/dist/task.d.mts +130 -0
  44. package/dist/task.mjs +2 -0
  45. package/dist/tax-lots.mjs +5 -0
  46. package/dist/tenant-rbac.mjs +1 -0
  47. package/dist/workflow-telemetry.mjs +1 -0
  48. package/package.json +17 -2
  49. package/public/agent-connect/index.html +2 -2
  50. package/public/install.sh +2 -2
  51. package/public/oracle-splash/index.html +2 -2
  52. package/public/oracle-splash/install.sh +2 -2
@@ -1,38 +1,50 @@
1
1
  #!/usr/bin/env node
2
- var tr=Object.defineProperty;var l=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var L=(t,e)=>{for(var r in e)tr(t,r,{get:e[r],enumerable:!0})};var Re={};L(Re,{A2ABus:()=>re,normalizeName:()=>W});function W(t){return String(t||"").trim().toLowerCase().replace(/^@/,"")}var re,Pe=l(()=>{re=class{constructor({maxHops:e=4,historyCap:r=200}={}){this.maxHops=e,this.historyCap=r,this.agents=new Map,this.history=[],this.seq=0}register(e,{role:r="",chains:n=[],handler:o}={}){let i=W(e);if(!i)throw new Error("a2a: agent name required");if(this.agents.has(i))throw new Error(`a2a: agent '${i}' already registered`);if(typeof o!="function")throw new Error(`a2a: agent '${i}' needs a handler`);return this.agents.set(i,{name:i,role:String(r),chains:n.map(String),handler:o}),this.agents.get(i)}unregister(e){this.agents.delete(W(e))}roster(){return[...this.agents.values()].map(({name:e,role:r,chains:n})=>({name:e,role:r,chains:n}))}async send({from:e,to:r,text:n,kind:o="consult",hops:i=0}={}){let s=W(e),a=W(r);if(!s||!this.agents.has(s))return{ok:!1,error:`a2a: unknown sender '${e}'`};if(!a||!this.agents.has(a))return{ok:!1,error:`a2a: unknown recipient '${r}' (roster: ${[...this.agents.keys()].join(", ")||"empty"})`};if(a===s)return{ok:!1,error:"a2a: self-send refused"};let u=String(n||"").trim().slice(0,8e3);if(!u)return{ok:!1,error:"a2a: empty message"};let f=Number(i)+1;if(f>this.maxHops)return this.record({from:s,to:a,kind:o,dropped:"hop-limit"}),{ok:!1,error:`a2a: hop limit ${this.maxHops} reached \u2014 dropped`};let d={id:`a2a-${Date.now()}-${++this.seq}`,from:s,to:a,kind:String(o),text:u,hops:f,ts:new Date().toISOString()};this.record(d);try{let m=await this.agents.get(a).handler(d);return m&&this.record({id:`${d.id}-reply`,from:a,to:s,kind:"reply",text:String(m).slice(0,8e3),hops:f,ts:new Date().toISOString()}),{ok:!0,reply:m||null,id:d.id}}catch(m){return{ok:!1,error:`a2a: '${a}' handler failed: ${m.message}`}}}record(e){this.history.push(e),this.history.length>this.historyCap&&this.history.splice(0,this.history.length-this.historyCap)}recent(e=20){return this.history.slice(-e)}}});import z from"node:fs";import rr from"node:os";import R from"node:path";import{fileURLToPath as nr}from"node:url";function Be(){return process.env.ORACLE_FAKE_HOME||rr.homedir()}function ir(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function P(){return ir()?process.env.ORACLE_CONFIG_DIR||R.join(Be(),".config","oracle"):R.join(Be(),".config","oracle")}function ar(){return R.join(P(),"desk.json")}function sr(){return R.join(P(),"env")}function _({force:t=!1}={}){if(_._done&&!t)return _._result||null;_._done=!0;let e={},r=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,e[o]=s))};try{let o=sr();if(z.existsSync(o))for(let i of z.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(s[1],a)}}catch{}try{let o=ar();if(z.existsSync(o)){let i=JSON.parse(z.readFileSync(o,"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 n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),_._result=Object.keys(e).length?e:null,_._result}var or,ro,ne=l(()=>{or=R.dirname(nr(import.meta.url)),ro=R.resolve(or,"../..");try{_()}catch{}});function V(t){return String(t||"").trim()||void 0}function ur(t,{required:e=!1}={}){let r=V(t)?.toLowerCase();if(!r){if(e)throw new Error("model provider is required");return}if(!cr.has(r))throw new Error(`unsupported provider: ${r}`);return r}function lr(t,{required:e=!1}={}){let r=V(t);if(!r){if(e)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 dr(t){let e=V(t);if(!e||e.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(e)}catch{throw new Error("invalid custom base URL")}let n=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),o=n==="localhost"||n==="127.0.0.1"||n==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&o)||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 Fe({provider:t,model:e,baseUrl:r}={},{requireModel:n=!1}={}){let o=ur(t),i=lr(e,{required:n});if(o==="custom")return{provider:o,...i?{model:i}:{},baseUrl:dr(r)};if(V(r))throw new Error("baseUrl is only supported for the custom provider");return{...o?{provider:o}:{},...i?{model:i}:{}}}var cr,Me=l(()=>{cr=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","custom","anthropic-oauth","openai-codex","xai-oauth"])});import qe from"node:fs";import fr from"node:path";function mr(){return fr.join(P(),"model.json")}function B(t){return String(t||"").trim()||void 0}function hr(t={}){let e=B(t.backend)?.toLowerCase()||"auto",r=Fe({provider:t.provider,model:t.model,baseUrl:t.baseUrl},{requireModel:e==="standalone"}),n=B(t.apiKeyEnv),o=Number.parseInt(String(t.contextLength||""),10),i=B(t.reasoningEffort),s=B(t.computeHost||t.remoteHost),a=B(t.computeUser||t.remoteUser),u=B(t.computePath||t.remotePath);if(!pr.has(e))throw new Error(`unsupported backend: ${e}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(e))throw new Error("remote compute backends are disabled in the public desktop");if(n&&!/^[A-Z][A-Z0-9_]*$/.test(n))throw new Error("api key env must be an uppercase environment variable name");if(e==="remote"&&!s)throw new Error("remote backend requires computeHost");return{backend:e,...r,...n?{apiKeyEnv:n}:{},...Number.isFinite(o)&&o>0?{contextLength:o}:{},...i?{reasoningEffort:i}:{},...s?{computeHost:s}:{},...a?{computeUser:a}:{},...u?{computePath:u}:{}}}function De(){let t=mr();if(!qe.existsSync(t))return null;try{return hr(JSON.parse(qe.readFileSync(t,"utf8")))}catch{return null}}var pr,Ue=l(()=>{ne();Me();pr=new Set(["auto","standalone","hermes","remote","arch"])});var je=l(()=>{});var H=l(()=>{});var F=l(()=>{});var ie=l(()=>{H();F()});import{isAddress as bo}from"ethers";var ae=l(()=>{ie();H();F()});import{Interface as yr,isAddress as ko}from"ethers";var No,We=l(()=>{ae();H();F();No=new yr(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as br,isAddress as Lo}from"ethers";var Bo,Fo,He=l(()=>{ae();H();F();Bo=new br(["function approve(address spender,uint256 amount) returns (bool)"]),Fo=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var N=l(()=>{});import{Interface as Er,MaxUint256 as Ho,isAddress as Jo,keccak256 as Go,toUtf8Bytes as zo}from"ethers";var Zo,J=l(()=>{je();We();He();N();F();Zo=new Er(["function approve(address spender,uint256 amount) returns (bool)"])});var ti,ri,Je=l(()=>{ti=300*1e3,ri=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})()});var Y=l(()=>{J()});import{Address as si,NETWORK as ci,OutScript as ui,RawTx as li,SigHash as di,TEST_NETWORK as fi,Transaction as pi}from"@scure/btc-signer";var ue=l(()=>{});import{createHash as Sr}from"node:crypto";import{base58 as gi}from"@scure/base";import{getCompiledTransactionMessageDecoder as bi}from"@solana/transaction-messages";var Ge,Ei,le=l(()=>{Ge=t=>Sr("sha256").update(`global:${t}`).digest().subarray(0,8).toString("hex"),Ei=new Map([[Ge("route"),{name:"route",prefixBytes:0}],[Ge("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var ze=l(()=>{});var Oi,Ve=l(()=>{ze();Oi=64*1024});var Ke=l(()=>{Ve()});var Ye=l(()=>{Ke()});var Di,Ui,fe=l(()=>{N();Ye();Di=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),Ui=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var Hi,pe=l(()=>{N();Hi="0x"+"00".repeat(32)});var Ar,Ki,me=l(()=>{pe();N();Ar=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Ki=Object.freeze(Ar.map(t=>t[0]))});var X=l(()=>{N()});import{Interface as tt}from"ethers";var Or,pa,Nr,ma,ha,wa,ga,Cr,ya,Q=l(()=>{J();ie();Je();Y();ue();le();fe();me();X();Or=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]),pa=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0}),Nr=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),ma=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),ha=new tt(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),wa=new tt(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),ga=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),Cr=Object.freeze([...Or]),ya=Object.freeze({...Nr})});import{encode as xa}from"@msgpack/msgpack";import{keccak256 as Aa,verifyTypedData as va}from"ethers";var ka,Ia,he=l(()=>{ka=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Ia=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var we=l(()=>{X()});import{ed25519 as Ra}from"@noble/curves/ed25519.js";import{base58 as Ba}from"@scure/base";import{RawTx as Ma,SigHash as qa,Transaction as Da}from"@scure/btc-signer";import{Transaction as ja,keccak256 as Wa,verifyTypedData as Ha}from"ethers";var ge=l(()=>{he();we()});import{base58 as Xa}from"@scure/base";var Z=l(()=>{Q();Y();J();ge()});var nt=l(()=>{Z();Q()});var us,ls,ds,ye=l(()=>{us=Object.freeze({N:1<<17,r:8,p:1}),ls=256*1024*1024,ds=16*1024});var ps,ot=l(()=>{ps=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});import{homedir as be}from"node:os";import{join as Ee}from"node:path";var it,_r,gs,at=l(()=>{it=process.env.ORACLE_PUBLIC_DESKTOP==="1",_r=it?process.env.ORACLE_CONFIG_DIR||Ee(be(),".config","oracle"):Ee(be(),".config","oracle"),gs=it?_r:Ee(be(),".config","mad-desk")});var Ss,As,vs,st=l(()=>{at();Ss="0".repeat(64),As=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),vs=Promise.resolve()});var ct=l(()=>{st();N();ye();Z()});var ut=l(()=>{});import{Wallet as Rs}from"ethers";import{base58 as Bs}from"@scure/base";import{ed25519 as Ms}from"@noble/curves/ed25519.js";import{NETWORK as Ds,TEST_NETWORK as Us,WIF as js,p2wpkh as Ws}from"@scure/btc-signer";import{pubECDSA as Js}from"@scure/btc-signer/utils.js";var lt=l(()=>{});import x from"node:path";import Br from"node:os";import{createHash as Fr,randomBytes as Ac}from"node:crypto";import{Interface as xe,keccak256 as kc}from"ethers";import{Transaction as Tc}from"@scure/btc-signer";import{ed25519 as Nc}from"@noble/curves/ed25519.js";function dt(t){let e=process.env.ORACLE_SIGNER_STATE_DIR||x.join(process.env.XDG_STATE_HOME||x.join(Br.homedir(),".local","state"),"oracle"),r=Fr("sha256").update(x.resolve(t)).digest("hex").slice(0,16);return{vault:x.join(t,"vault.json"),policy:x.join(t,"signer-policy.json"),policyKey:x.join(t,"policy-integrity-key"),policyAnchor:x.join(e,`signer-policy-${r}.high-water`),ledger:x.join(t,"signer-ledger.json"),ledgerAnchor:x.join(e,`signer-ledger-${r}.high-water`),token:x.join(t,"signer-token"),lock:x.join(e,`signer-${r}.lock`)}}var Xc,Qc,Zc,ft=l(()=>{nt();Z();ye();ot();ct();ut();J();Q();Y();ge();fe();me();X();we();pe();he();ue();le();lt();Xc=new xe(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Qc=new xe(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),Zc=new xe(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});function pt(t){return qr.get(Number(t))||null}var Mr,qr,mt=l(()=>{Mr={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},qr=new Map(Object.values(Mr).map(t=>[t.chainId,t]))});function c(t){return h(t)?String(t).replace(Dr,e=>`\\${e}`):p}function h(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function S(t){if(!h(t))return p;let e=String(t).replace(/`/g,"");return e===""?p:`\`${e}\``}function C(t,{decimals:e=2}={}){if(!h(t))return p;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):p}function w(t,{decimals:e=2}={}){let r=C(t,{decimals:e});return r===p?p:`${r} USD`}function Se(t,{decimals:e=2}={}){let r=C(t,{decimals:e});return r===p?p:`${r}%`}function ee(t){let e=C(t,{decimals:0});return e===p?p:`${e} bps`}function $(t,e){if(!h(t))return p;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return p;let n;try{n=BigInt(typeof t=="string"?t.trim():t)}catch{return p}let o=n<0n,i=o?-n:n,s=10n**BigInt(r),a=(i/s).toString(),u=(i%s).toString().padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${a}${u?`.${u}`:""}`}function Ur(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?p:t>=.75?"HIGH":t>=.4?"MEDIUM":"LOW";if(typeof t=="string"){let e=t.trim().toUpperCase();if(e==="HIGH"||e==="MEDIUM"||e==="LOW")return e}return p}function k(t={}){let e=t.chainId;if(!h(e)||!Number.isFinite(Number(e)))return h(t.chain)?c(t.chain):p;let n=pt(e)?.name||(h(t.chain)?String(t.chain):p);return`${c(n)} (chainId ${Number(e)})`}function ht(t={}){return c(t.venue??t.dex??t.pool?.venue)}function jr(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?S(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${h(t.error)?` \u2014 ${c(t.error)}`:""} (text card stands)`:h(t.url)?S(t.url):"NONE (text card only)"}function Ae(t={},{now:e=Date.now()}={}){let r=t.grant??t.session??null;if(!r||typeof r!="object")return{allowed:!1,reason:"no local grant/session",actions:[]};if(r.local===!1)return{allowed:!1,reason:"grant is not local",actions:[]};if(r.revoked===!0)return{allowed:!1,reason:"grant revoked",actions:[]};let n=r.expiresAt??r.expiry;if(h(n)){let i=typeof n=="number"?n:Date.parse(n);if(!Number.isFinite(i))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(i<=e)return{allowed:!1,reason:"grant expired",actions:[]}}return{allowed:!0,reason:"valid local grant",actions:Array.isArray(r.actions)&&r.actions.length?r.actions.slice():["BUY","SELL"]}}function Wr(t){let e=Ae(t);return e.allowed?`${e.actions.map(r=>c(r)).join(" / ")} (${c(e.reason)})`:`prepare-only \u2014 ${c(e.reason)}`}function A(t,e,r={}){let n=[`*${t}*`];for(let[o,i]of e)n.push(`${o}: ${i==null||i===""?p:i}`);return n.push(`Chart: ${jr(r.chart)}`),n.push(`Actions: ${Wr(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&n.push(`Warnings: ${r.warnings.map(o=>c(o)).join("; ")}`),(h(r.source)||h(r.fetchedAt))&&n.push(`Source: ${c(r.source)} at ${c(r.fetchedAt)}`),n.join(`
3
- `)}function v(t){return["Confidence",Ur(t.confidence)]}function Hr(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=h(e.decimals)?$(e.amountOutRaw??e.out??e.raw,e.decimals):p;return[["Quote out (raw)",S(e.amountOutRaw??e.out??e.raw)],["Quote out",r===p?p:`${c(r)} ${c(e.symbol??"")}`.trim()]]}function wt(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",p];let r=ee(e.selectedBps),n=ee(e.capBps);return["Auto-slippage",r===p&&n===p?p:`${r} selected, cap ${n}`]}function Jr(t={}){let e=t||{};return A(`ORACLE TOKEN \u2014 ${c(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",ht(e)],["Name",c(e.name)],["Address",S(e.address??e.mint??e.contract)],["Price",w(e.priceUsd,{decimals:8})],["Market cap",w(e.marketCapUsd)],["Liquidity",w(e.liquidityUsd)],["Volume 24h",w(e.volume24hUsd)],["Change 24h",Se(e.priceChange24h)],["Fee tier",h(e.feeTier)?`${ee(Number(e.feeTier)/100)} (${C(e.feeTier,{decimals:0})})`:p],["Age",c(e.age)],...Hr(e),wt(e),v(e)],e)}function Gr(t={}){let e=t||{};return A(`ORACLE LAUNCH \u2014 ${c(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",ht(e)],["Address",S(e.address??e.mint??e.contract)],["Pool",S(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",w(e.liquidityUsd)],["Route ready",c(e.routeReady)],["Sellable",c(e.sellable)],["Sell sim",c(e.sellSimulation??e.sellSim)],["Smart wallets",c(e.smartWalletOverlap)],["Risk",c(e.risk??e.riskStatus)],["Prepared ticket",c(e.preparedTicket??e.ticketStatus)],wt(e),v(e)],e)}function zr(t={}){let e=t||{};return A(`ORACLE HIP-3 \u2014 ${c(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${c(e.dex)}`],["Market",c(e.market??e.coin)],["Mark",w(e.markPx,{decimals:6})],["Oracle",w(e.oraclePx,{decimals:6})],["Funding",Se(e.funding,{decimals:6})],["Open interest",w(e.openInterestUsd)],["Depth",c(e.depth)],["Liquidation notes",c(e.liquidationNotes??e.riskNotes)],["Account context",c(e.accountContext)],v(e)],e)}function Vr(t={}){let e=t||{};return A(`ORACLE HIP-4 \u2014 ${c(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${c(e.dex??"outcome")}`],["Event",c(e.event)],["Outcome",c(e.outcome)],["Market id",S(e.marketId??e.market)],["Bid",w(e.bid,{decimals:6})],["Ask",w(e.ask,{decimals:6})],["Depth",c(e.depth)],["Edge",Se(e.edge)],["Position",c(e.position)],v(e)],e)}function Kr(t={}){let e=t||{};return A(`ORACLE POLYMARKET \u2014 ${c(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",c(e.event)],["Market",c(e.market)],["Market id",S(e.marketId??e.conditionId??e.tokenId)],["Yes",w(e.yesPrice,{decimals:4})],["No",w(e.noPrice,{decimals:4})],["Best bid / ask",`${w(e.bestBid,{decimals:4})} / ${w(e.bestAsk,{decimals:4})}`],["Volume",w(e.volumeUsd)],["Resolution risk",c(e.resolutionRisk)],["Order intent",c(e.orderIntent)],v(e)],e)}function Yr(t={}){let e=t||{},r=h(e.completedSplits)&&h(e.totalSplits)?`${C(e.completedSplits,{decimals:0})} / ${C(e.totalSplits,{decimals:0})}`:p;return A(`ORACLE TWAP \u2014 ${c(e.pair??e.symbol??e.name)}`,[["Chain",k(e)],["Side",c(e.side??e.direction)],["Amount",`${c($(e.amountTotal??e.amount,e.decimals??18))} ${c(e.symbol??"")}`.trim()],["Splits",`${C(e.totalSplits,{decimals:0})} over ${c(e.window)}`],["Progress",r],["Avg price",w(e.averagePrice,{decimals:6})],["Next split",c(e.nextSplitAt)],["Slippage cap",ee(e.slippageBps)],["Status",c(e.status)],v(e)],e)}function Xr(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},n=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${c(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return A(`ORACLE BRIDGE \u2014 ${c(e.pair??e.fromSymbol)} \u2192 ${c(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",k({chainId:e.fromChainId,chain:e.fromChain})],["To chain",k({chainId:e.toChainId,chain:e.toChain})],["Amount",`${c($(e.amount,e.fromDecimals??18))} ${c(e.fromSymbol??"")}`.trim()],["Best route",c(e.bestRoute??e.winner)],["Est. received",`${c($(e.amountOut,e.toDecimals??18))} ${c(e.toSymbol??"")}`.trim()],["Fee",w(e.feeUsd)],["Est. time",c(e.estimatedTime)],["Revoke check",n],["All providers",c(e.providers?.join(", "))],["Preparable",c(e.preparable)],v(e)],e)}function Qr(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(n=>{let o=c(n.source??n.venue??n.name),i=n.improvementBps==null&&n.deltaBps==null?null:Number(n.improvementBps??n.deltaBps),s=Number.isFinite(i)?`${Math.abs(i).toFixed(0)} bps behind`:"spread UNKNOWN";return`${o} (${s})`});return r.length?r.join("; "):p}function Zr(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return h(e)?c(e):p}function en(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,n=e.bridge&&typeof e.bridge=="object"?e.bridge:null,o=r.best??r.winner??{},i=`${c(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${c(e.tokenOutSymbol??e.toSymbol??"OUT")}`,s=[["Intent",c(e.intent??"swap")],["Chain",k({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",i],["Amount in",`${c($(e.amountIn??r.amountIn,e.decimalsIn??18))} ${c(e.tokenInSymbol??"")}`.trim()],["Best swap",c(o.source??o.venue??r.bestRoute??e.bestRoute)],["Net out",`${c($(o.netOut??o.amountOut??r.amountOut,e.decimalsOut??18))} ${c(e.tokenOutSymbol??"")}`.trim()],["Ranked on",Zr(r)],["Gas accounted",c(o.costAccounted===!0?"yes":o.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",h(r.improvementBps)?`${c(r.improvementBps)} bps`:p],["Runners-up",Qr(r.routes??e.routes)]];if(n){let a=n.best??n.winner??{};s.push(["Best bridge",c(a.source??n.bestRoute??e.bestBridge)],["Bridge out",`${c($(a.netOut??a.amountOut??n.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${c(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",k({chainId:n.toChainId??e.toChainId,chain:n.toChain??e.toChain})],["Est. time",c(n.estimatedTime??a.meta?.durationSeconds)])}else s.push(["Best bridge","same-chain \u2014 use Best swap"]);return s.push(["Preparable",c(e.preparable??o.executionReady)],v(e)),A(`ORACLE SWAP \u2014 ${i}`,s,e)}function ve(t={}){let e=t||{};return A("ORACLE APPROVE \u2014 local signer",[["Pending id",S(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",c(e.surface)],["Action",c(e.action)],["Chain",k({chainId:e.chain??e.chainId,chain:e.chainName})],["To",S(e.to??e.destination)],["Value",h(e.value)?c(e.value):p],["Signer",c(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],v({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}function ke({platform:t="telegram",id:e,digest:r,hasGrant:n=!1}={}){let o=String(e||(typeof r=="string"?r.slice(0,8):"")||"").trim();return n?o?String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[[{text:"Allow",callback_data:`oracle:approve:${o}`},{text:"Deny",callback_data:`oracle:deny:${o}`}]]},cancelHint:"Allow signs with the local signer. Deny drops the pending artifact."}:{kind:"text_menu",text:["1. Allow \u2014 reply /approve "+o,"2. Deny \u2014 reply /deny "+o].join(`
4
- `),cancelHint:"Cards are not available on this chat. Use /approve or /deny."}:{kind:"text_menu",text:"nothing to approve",cancelHint:""}:String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[]},cancelHint:"prepare-only \u2014 no local grant/session"}:{kind:"text_menu",text:"prepare-only \u2014 no local grant/session",cancelHint:""}}var p,nu,Dr,ou,gt=l(()=>{mt();p="UNKNOWN",nu=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),Dr=/[_*[\]`]/g;ou=Object.freeze({token:Jr,launch:Gr,hip3:zr,hip4:Vr,polymarket:Kr,twap:Yr,bridge:Xr,swap:en,approve:ve})});import{readFileSync as tn,existsSync as rn}from"node:fs";import{request as nn}from"node:http";function an(t=process.env){let e=String(t.ORACLE_SIGNER_URL||on).replace(/\/$/,""),r;try{r=new URL(e)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function sn(t=process.env){if(t.ORACLE_SIGNER_TOKEN)return String(t.ORACLE_SIGNER_TOKEN);let e=dt(`${P()}/signer`).token;return rn(e)?tn(e,"utf8").trim():null}function yt(t,{method:e="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=an(n),s=sn(n);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let u=new URL(t,i),f=r?Buffer.from(JSON.stringify(r)):null,d=nn({hostname:u.hostname,port:u.port||80,path:u.pathname,method:e,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...f?{"content-type":"application/json","content-length":f.length}:{}}},m=>{let y=[];m.on("data",b=>y.push(b)),m.on("end",()=>{let b=Buffer.concat(y).toString("utf8"),g={};try{g=b?JSON.parse(b):{}}catch{g={error:"signer refused"}}a({httpStatus:m.statusCode,...g})})});d.on("timeout",()=>{d.destroy(),a({ok:!1,error:"local signer timed out"})}),d.on("error",()=>a({ok:!1,error:"local signer is not running"})),f&&d.write(f),d.end()})}function Ie(t){let r=String(t||"").trim().match(/^\/(approve|deny|pending)(?:@[\w_]+)?(?:\s+([0-9a-fA-F]{4,64}))?\s*$/i);return r?{verb:r[1].toLowerCase(),id:r[2]?r[2].toLowerCase():null}:null}function cn(t,{platform:e,grant:r,armed:n}){if(!t.length)return{text:"No pending local-signer artifacts.",buttons:ke({platform:e,hasGrant:!1})};let o=t[0];return{text:t.map(s=>ve({...s,armed:n,grant:r,confidence:n?"high":"medium"})).join(`
2
+ var Fr=Object.defineProperty;var l=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var _=(t,e)=>{for(var r in e)Fr(t,r,{get:e[r],enumerable:!0})};var Ze={};_(Ze,{A2ABus:()=>fe,normalizeName:()=>z});function z(t){return String(t||"").trim().toLowerCase().replace(/^@/,"")}var fe,et=l(()=>{fe=class{constructor({maxHops:e=4,historyCap:r=200}={}){this.maxHops=e,this.historyCap=r,this.agents=new Map,this.history=[],this.seq=0}register(e,{role:r="",chains:n=[],handler:o}={}){let i=z(e);if(!i)throw new Error("a2a: agent name required");if(this.agents.has(i))throw new Error(`a2a: agent '${i}' already registered`);if(typeof o!="function")throw new Error(`a2a: agent '${i}' needs a handler`);return this.agents.set(i,{name:i,role:String(r),chains:n.map(String),handler:o}),this.agents.get(i)}unregister(e){this.agents.delete(z(e))}roster(){return[...this.agents.values()].map(({name:e,role:r,chains:n})=>({name:e,role:r,chains:n}))}async send({from:e,to:r,text:n,kind:o="consult",hops:i=0}={}){let s=z(e),a=z(r);if(!s||!this.agents.has(s))return{ok:!1,error:`a2a: unknown sender '${e}'`};if(!a||!this.agents.has(a))return{ok:!1,error:`a2a: unknown recipient '${r}' (roster: ${[...this.agents.keys()].join(", ")||"empty"})`};if(a===s)return{ok:!1,error:"a2a: self-send refused"};let u=String(n||"").trim().slice(0,8e3);if(!u)return{ok:!1,error:"a2a: empty message"};let f=Number(i)+1;if(f>this.maxHops)return this.record({from:s,to:a,kind:o,dropped:"hop-limit"}),{ok:!1,error:`a2a: hop limit ${this.maxHops} reached \u2014 dropped`};let d={id:`a2a-${Date.now()}-${++this.seq}`,from:s,to:a,kind:String(o),text:u,hops:f,ts:new Date().toISOString()};this.record(d);try{let p=await this.agents.get(a).handler(d);return p&&this.record({id:`${d.id}-reply`,from:a,to:s,kind:"reply",text:String(p).slice(0,8e3),hops:f,ts:new Date().toISOString()}),{ok:!0,reply:p||null,id:d.id}}catch(p){return{ok:!1,error:`a2a: '${a}' handler failed: ${p.message}`}}}record(e){this.history.push(e),this.history.length>this.historyCap&&this.history.splice(0,this.history.length-this.historyCap)}recent(e=20){return this.history.slice(-e)}}});import V from"node:fs";import Mr from"node:os";import P from"node:path";import{fileURLToPath as qr}from"node:url";function pe(){return process.env.ORACLE_FAKE_HOME||Mr.homedir()}function Ur(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function A(){return Ur()?process.env.ORACLE_CONFIG_DIR||P.join(pe(),".config","oracle"):P.join(pe(),".config","oracle")}function jr(){return P.join(A(),"desk.json")}function Hr(){return P.join(A(),"env")}function R({force:t=!1}={}){if(R._done&&!t)return R._result||null;R._done=!0;let e={},r=(o,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=s,e[o]=s))};try{let o=Hr();if(V.existsSync(o))for(let i of V.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(s[1],a)}}catch{}try{let o=jr();if(V.existsSync(o)){let i=JSON.parse(V.readFileSync(o,"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 n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),R._result=Object.keys(e).length?e:null,R._result}function te(t){return V.mkdirSync(t,{recursive:!0}),t}var Dr,ni,re=l(()=>{Dr=P.dirname(qr(import.meta.url)),ni=P.resolve(Dr,"../..");try{R()}catch{}});function ne(t){return String(t||"").trim()||void 0}function Jr(t,{required:e=!1}={}){let r=ne(t)?.toLowerCase();if(!r){if(e)throw new Error("model provider is required");return}if(!Wr.has(r))throw new Error(`unsupported provider: ${r}`);return r}function Gr(t,{required:e=!1}={}){let r=ne(t);if(!r){if(e)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 zr(t){let e=ne(t);if(!e||e.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(e)}catch{throw new Error("invalid custom base URL")}let n=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),o=n==="localhost"||n==="127.0.0.1"||n==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&o)||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 tt({provider:t,model:e,baseUrl:r}={},{requireModel:n=!1}={}){let o=Jr(t),i=Gr(e,{required:n});if(o==="custom")return{provider:o,...i?{model:i}:{},baseUrl:zr(r)};if(ne(r))throw new Error("baseUrl is only supported for the custom provider");return{...o?{provider:o}:{},...i?{model:i}:{}}}var Wr,rt=l(()=>{Wr=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","custom","anthropic-oauth","openai-codex","xai-oauth"])});import F from"node:fs";import me from"node:path";function nt(){return me.join(A(),"model.json")}function B(t){return String(t||"").trim()||void 0}function ot(t={}){let e=B(t.backend)?.toLowerCase()||"auto",r=tt({provider:t.provider,model:t.model,baseUrl:t.baseUrl},{requireModel:e==="standalone"}),n=B(t.apiKeyEnv),o=Number.parseInt(String(t.contextLength||""),10),i=B(t.reasoningEffort),s=B(t.computeHost||t.remoteHost),a=B(t.computeUser||t.remoteUser),u=B(t.computePath||t.remotePath);if(!Vr.has(e))throw new Error(`unsupported backend: ${e}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(e))throw new Error("remote compute backends are disabled in the public desktop");if(n&&!/^[A-Z][A-Z0-9_]*$/.test(n))throw new Error("api key env must be an uppercase environment variable name");if(e==="remote"&&!s)throw new Error("remote backend requires computeHost");return{backend:e,...r,...n?{apiKeyEnv:n}:{},...Number.isFinite(o)&&o>0?{contextLength:o}:{},...i?{reasoningEffort:i}:{},...s?{computeHost:s}:{},...a?{computeUser:a}:{},...u?{computePath:u}:{}}}function M(){let t=nt();if(!F.existsSync(t))return null;try{return ot(JSON.parse(F.readFileSync(t,"utf8")))}catch{return null}}function he(t){let e=ot(t),r=nt();te(me.dirname(r)),process.platform!=="win32"&&F.chmodSync(me.dirname(r),448);let n=`${r}.${process.pid}.tmp`;return F.writeFileSync(n,`${JSON.stringify(e,null,2)}
3
+ `,{mode:384}),F.renameSync(n,r),process.platform!=="win32"&&F.chmodSync(r,384),e}var Vr,it=l(()=>{re();rt();Vr=new Set(["auto","standalone","hermes","remote","arch"])});var at=l(()=>{});var K=l(()=>{});var q=l(()=>{});var ge=l(()=>{K();q()});import{isAddress as yi}from"ethers";var ye=l(()=>{ge();K();q()});import{Interface as Xr,isAddress as vi}from"ethers";var Ci,st=l(()=>{ye();K();q();Ci=new Xr(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as Qr,isAddress as $i}from"ethers";var Pi,Bi,ct=l(()=>{ye();K();q();Pi=new Qr(["function approve(address spender,uint256 amount) returns (bool)"]),Bi=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var N=l(()=>{});import{Interface as Zr,MaxUint256 as Hi,isAddress as Wi,keccak256 as Ji,toUtf8Bytes as Gi}from"ethers";var Qi,Y=l(()=>{at();st();ct();N();q();Qi=new Zr(["function approve(address spender,uint256 amount) returns (bool)"])});var ea,ta,ut=l(()=>{ea=300*1e3,ta=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})()});var ie=l(()=>{Y()});import{Address as aa,NETWORK as sa,OutScript as ca,RawTx as ua,SigHash as la,TEST_NETWORK as da,Transaction as fa}from"@scure/btc-signer";var xe=l(()=>{});import{createHash as tn}from"node:crypto";import{base58 as wa}from"@scure/base";import{getCompiledTransactionMessageDecoder as ya}from"@solana/transaction-messages";var lt,ba,Se=l(()=>{lt=t=>tn("sha256").update(`global:${t}`).digest().subarray(0,8).toString("hex"),ba=new Map([[lt("route"),{name:"route",prefixBytes:0}],[lt("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var dt=l(()=>{});var Ta,ft=l(()=>{dt();Ta=64*1024});var pt=l(()=>{ft()});var mt=l(()=>{pt()});var qa,Da,ve=l(()=>{N();mt();qa=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),Da=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var Ha,ke=l(()=>{N();Ha="0x"+"00".repeat(32)});var rn,Va,Ie=l(()=>{ke();N();rn=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Va=Object.freeze(rn.map(t=>t[0]))});var ae=l(()=>{N()});import{Interface as bt}from"ethers";var cn,fs,un,ps,ms,hs,ws,ln,gs,se=l(()=>{Y();ge();ut();ie();xe();Se();ve();Ie();ae();cn=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]),fs=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0}),un=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),ps=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),ms=new bt(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),hs=new bt(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),ws=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),ln=Object.freeze([...cn]),gs=Object.freeze({...un})});import{encode as Es}from"@msgpack/msgpack";import{keccak256 as Ss,verifyTypedData as As}from"ethers";var vs,ks,Te=l(()=>{vs=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),ks=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Ce=l(()=>{ae()});import{ed25519 as _s}from"@noble/curves/ed25519.js";import{base58 as Ps}from"@scure/base";import{RawTx as Fs,SigHash as Ms,Transaction as qs}from"@scure/btc-signer";import{Transaction as Us,keccak256 as js,verifyTypedData as Hs}from"ethers";var Oe=l(()=>{Te();Ce()});import{base58 as Ys}from"@scure/base";var ce=l(()=>{se();ie();Y();Oe()});var xt=l(()=>{ce();se()});var cc,uc,lc,Ne=l(()=>{cc=Object.freeze({N:1<<17,r:8,p:1}),uc=256*1024*1024,lc=16*1024});var fc,St=l(()=>{fc=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});import{homedir as $e}from"node:os";import{join as Le}from"node:path";var At,pn,wc,vt=l(()=>{At=process.env.ORACLE_PUBLIC_DESKTOP==="1",pn=At?process.env.ORACLE_CONFIG_DIR||Le($e(),".config","oracle"):Le($e(),".config","oracle"),wc=At?pn:Le($e(),".config","mad-desk")});var xc,Sc,Ac,kt=l(()=>{vt();xc="0".repeat(64),Sc=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),Ac=Promise.resolve()});var It=l(()=>{kt();N();Ne();ce()});var Tt=l(()=>{});import{Wallet as _c}from"ethers";import{base58 as Pc}from"@scure/base";import{ed25519 as Fc}from"@noble/curves/ed25519.js";import{NETWORK as qc,TEST_NETWORK as Dc,WIF as Uc,p2wpkh as jc}from"@scure/btc-signer";import{pubECDSA as Wc}from"@scure/btc-signer/utils.js";var Ct=l(()=>{});import x from"node:path";import wn from"node:os";import{createHash as gn,randomBytes as Su}from"node:crypto";import{Interface as _e,keccak256 as vu}from"ethers";import{Transaction as Iu}from"@scure/btc-signer";import{ed25519 as Cu}from"@noble/curves/ed25519.js";function Ot(t){let e=process.env.ORACLE_SIGNER_STATE_DIR||x.join(process.env.XDG_STATE_HOME||x.join(wn.homedir(),".local","state"),"oracle"),r=gn("sha256").update(x.resolve(t)).digest("hex").slice(0,16);return{vault:x.join(t,"vault.json"),policy:x.join(t,"signer-policy.json"),policyKey:x.join(t,"policy-integrity-key"),policyAnchor:x.join(e,`signer-policy-${r}.high-water`),ledger:x.join(t,"signer-ledger.json"),ledgerAnchor:x.join(e,`signer-ledger-${r}.high-water`),token:x.join(t,"signer-token"),lock:x.join(e,`signer-${r}.lock`)}}var Yu,Xu,Qu,Nt=l(()=>{xt();ce();Ne();St();It();Tt();Y();se();ie();Oe();ve();Ie();ae();Ce();ke();Te();xe();Se();Ct();Yu=new _e(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Xu=new _e(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),Qu=new _e(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});function $t(t){return bn.get(Number(t))||null}var yn,bn,Lt=l(()=>{yn={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},bn=new Map(Object.values(yn).map(t=>[t.chainId,t]))});function c(t){return g(t)?String(t).replace(En,e=>`\\${e}`):m}function g(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function S(t){if(!g(t))return m;let e=String(t).replace(/`/g,"");return e===""?m:`\`${e}\``}function $(t,{decimals:e=2}={}){if(!g(t))return m;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):m}function y(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===m?m:`${r} USD`}function Re(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===m?m:`${r}%`}function ue(t){let e=$(t,{decimals:0});return e===m?m:`${e} bps`}function L(t,e){if(!g(t))return m;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return m;let n;try{n=BigInt(typeof t=="string"?t.trim():t)}catch{return m}let o=n<0n,i=o?-n:n,s=10n**BigInt(r),a=(i/s).toString(),u=(i%s).toString().padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${a}${u?`.${u}`:""}`}function xn(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?m:t>=.75?"HIGH":t>=.4?"MEDIUM":"LOW";if(typeof t=="string"){let e=t.trim().toUpperCase();if(e==="HIGH"||e==="MEDIUM"||e==="LOW")return e}return m}function I(t={}){let e=t.chainId;if(!g(e)||!Number.isFinite(Number(e)))return g(t.chain)?c(t.chain):m;let n=$t(e)?.name||(g(t.chain)?String(t.chain):m);return`${c(n)} (chainId ${Number(e)})`}function _t(t={}){return c(t.venue??t.dex??t.pool?.venue)}function Sn(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?S(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${g(t.error)?` \u2014 ${c(t.error)}`:""} (text card stands)`:g(t.url)?S(t.url):"NONE (text card only)"}function Pe(t={},{now:e=Date.now()}={}){let r=t.grant??t.session??null;if(!r||typeof r!="object")return{allowed:!1,reason:"no local grant/session",actions:[]};if(r.local===!1)return{allowed:!1,reason:"grant is not local",actions:[]};if(r.revoked===!0)return{allowed:!1,reason:"grant revoked",actions:[]};let n=r.expiresAt??r.expiry;if(g(n)){let i=typeof n=="number"?n:Date.parse(n);if(!Number.isFinite(i))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(i<=e)return{allowed:!1,reason:"grant expired",actions:[]}}return{allowed:!0,reason:"valid local grant",actions:Array.isArray(r.actions)&&r.actions.length?r.actions.slice():["BUY","SELL"]}}function An(t){let e=Pe(t);return e.allowed?`${e.actions.map(r=>c(r)).join(" / ")} (${c(e.reason)})`:`prepare-only \u2014 ${c(e.reason)}`}function v(t,e,r={}){let n=[`*${t}*`];for(let[o,i]of e)n.push(`${o}: ${i==null||i===""?m:i}`);return n.push(`Chart: ${Sn(r.chart)}`),n.push(`Actions: ${An(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&n.push(`Warnings: ${r.warnings.map(o=>c(o)).join("; ")}`),(g(r.source)||g(r.fetchedAt))&&n.push(`Source: ${c(r.source)} at ${c(r.fetchedAt)}`),n.join(`
4
+ `)}function k(t){return["Confidence",xn(t.confidence)]}function vn(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=g(e.decimals)?L(e.amountOutRaw??e.out??e.raw,e.decimals):m;return[["Quote out (raw)",S(e.amountOutRaw??e.out??e.raw)],["Quote out",r===m?m:`${c(r)} ${c(e.symbol??"")}`.trim()]]}function Rt(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",m];let r=ue(e.selectedBps),n=ue(e.capBps);return["Auto-slippage",r===m&&n===m?m:`${r} selected, cap ${n}`]}function kn(t={}){let e=t||{};return v(`ORACLE TOKEN \u2014 ${c(e.symbol??e.token??e.name)}`,[["Chain",I(e)],["Venue",_t(e)],["Name",c(e.name)],["Address",S(e.address??e.mint??e.contract)],["Price",y(e.priceUsd,{decimals:8})],["Market cap",y(e.marketCapUsd)],["Liquidity",y(e.liquidityUsd)],["Volume 24h",y(e.volume24hUsd)],["Change 24h",Re(e.priceChange24h)],["Fee tier",g(e.feeTier)?`${ue(Number(e.feeTier)/100)} (${$(e.feeTier,{decimals:0})})`:m],["Age",c(e.age)],...vn(e),Rt(e),k(e)],e)}function In(t={}){let e=t||{};return v(`ORACLE LAUNCH \u2014 ${c(e.symbol??e.token??e.name)}`,[["Chain",I(e)],["Venue",_t(e)],["Address",S(e.address??e.mint??e.contract)],["Pool",S(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",y(e.liquidityUsd)],["Route ready",c(e.routeReady)],["Sellable",c(e.sellable)],["Sell sim",c(e.sellSimulation??e.sellSim)],["Smart wallets",c(e.smartWalletOverlap)],["Risk",c(e.risk??e.riskStatus)],["Prepared ticket",c(e.preparedTicket??e.ticketStatus)],Rt(e),k(e)],e)}function Tn(t={}){let e=t||{};return v(`ORACLE HIP-3 \u2014 ${c(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${c(e.dex)}`],["Market",c(e.market??e.coin)],["Mark",y(e.markPx,{decimals:6})],["Oracle",y(e.oraclePx,{decimals:6})],["Funding",Re(e.funding,{decimals:6})],["Open interest",y(e.openInterestUsd)],["Depth",c(e.depth)],["Liquidation notes",c(e.liquidationNotes??e.riskNotes)],["Account context",c(e.accountContext)],k(e)],e)}function Cn(t={}){let e=t||{};return v(`ORACLE HIP-4 \u2014 ${c(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${c(e.dex??"outcome")}`],["Event",c(e.event)],["Outcome",c(e.outcome)],["Market id",S(e.marketId??e.market)],["Bid",y(e.bid,{decimals:6})],["Ask",y(e.ask,{decimals:6})],["Depth",c(e.depth)],["Edge",Re(e.edge)],["Position",c(e.position)],k(e)],e)}function On(t={}){let e=t||{};return v(`ORACLE POLYMARKET \u2014 ${c(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",c(e.event)],["Market",c(e.market)],["Market id",S(e.marketId??e.conditionId??e.tokenId)],["Yes",y(e.yesPrice,{decimals:4})],["No",y(e.noPrice,{decimals:4})],["Best bid / ask",`${y(e.bestBid,{decimals:4})} / ${y(e.bestAsk,{decimals:4})}`],["Volume",y(e.volumeUsd)],["Resolution risk",c(e.resolutionRisk)],["Order intent",c(e.orderIntent)],k(e)],e)}function Nn(t={}){let e=t||{},r=g(e.completedSplits)&&g(e.totalSplits)?`${$(e.completedSplits,{decimals:0})} / ${$(e.totalSplits,{decimals:0})}`:m;return v(`ORACLE TWAP \u2014 ${c(e.pair??e.symbol??e.name)}`,[["Chain",I(e)],["Side",c(e.side??e.direction)],["Amount",`${c(L(e.amountTotal??e.amount,e.decimals??18))} ${c(e.symbol??"")}`.trim()],["Splits",`${$(e.totalSplits,{decimals:0})} over ${c(e.window)}`],["Progress",r],["Avg price",y(e.averagePrice,{decimals:6})],["Next split",c(e.nextSplitAt)],["Slippage cap",ue(e.slippageBps)],["Status",c(e.status)],k(e)],e)}function $n(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},n=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${c(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return v(`ORACLE BRIDGE \u2014 ${c(e.pair??e.fromSymbol)} \u2192 ${c(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",I({chainId:e.fromChainId,chain:e.fromChain})],["To chain",I({chainId:e.toChainId,chain:e.toChain})],["Amount",`${c(L(e.amount,e.fromDecimals??18))} ${c(e.fromSymbol??"")}`.trim()],["Best route",c(e.bestRoute??e.winner)],["Est. received",`${c(L(e.amountOut,e.toDecimals??18))} ${c(e.toSymbol??"")}`.trim()],["Fee",y(e.feeUsd)],["Est. time",c(e.estimatedTime)],["Revoke check",n],["All providers",c(e.providers?.join(", "))],["Preparable",c(e.preparable)],k(e)],e)}function Ln(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(n=>{let o=c(n.source??n.venue??n.name),i=n.improvementBps==null&&n.deltaBps==null?null:Number(n.improvementBps??n.deltaBps),s=Number.isFinite(i)?`${Math.abs(i).toFixed(0)} bps behind`:"spread UNKNOWN";return`${o} (${s})`});return r.length?r.join("; "):m}function _n(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return g(e)?c(e):m}function Rn(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,n=e.bridge&&typeof e.bridge=="object"?e.bridge:null,o=r.best??r.winner??{},i=`${c(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${c(e.tokenOutSymbol??e.toSymbol??"OUT")}`,s=[["Intent",c(e.intent??"swap")],["Chain",I({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",i],["Amount in",`${c(L(e.amountIn??r.amountIn,e.decimalsIn??18))} ${c(e.tokenInSymbol??"")}`.trim()],["Best swap",c(o.source??o.venue??r.bestRoute??e.bestRoute)],["Net out",`${c(L(o.netOut??o.amountOut??r.amountOut,e.decimalsOut??18))} ${c(e.tokenOutSymbol??"")}`.trim()],["Ranked on",_n(r)],["Gas accounted",c(o.costAccounted===!0?"yes":o.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",g(r.improvementBps)?`${c(r.improvementBps)} bps`:m],["Runners-up",Ln(r.routes??e.routes)]];if(n){let a=n.best??n.winner??{};s.push(["Best bridge",c(a.source??n.bestRoute??e.bestBridge)],["Bridge out",`${c(L(a.netOut??a.amountOut??n.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${c(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",I({chainId:n.toChainId??e.toChainId,chain:n.toChain??e.toChain})],["Est. time",c(n.estimatedTime??a.meta?.durationSeconds)])}else s.push(["Best bridge","same-chain \u2014 use Best swap"]);return s.push(["Preparable",c(e.preparable??o.executionReady)],k(e)),v(`ORACLE SWAP \u2014 ${i}`,s,e)}function Be(t={}){let e=t||{};return v("ORACLE APPROVE \u2014 local signer",[["Pending id",S(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",c(e.surface)],["Action",c(e.action)],["Chain",I({chainId:e.chain??e.chainId,chain:e.chainName})],["To",S(e.to??e.destination)],["Value",g(e.value)?c(e.value):m],["Signer",c(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],k({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}function Fe({platform:t="telegram",id:e,digest:r,hasGrant:n=!1}={}){let o=String(e||(typeof r=="string"?r.slice(0,8):"")||"").trim();return n?o?String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[[{text:"Allow",callback_data:`oracle:approve:${o}`},{text:"Deny",callback_data:`oracle:deny:${o}`}]]},cancelHint:"Allow signs with the local signer. Deny drops the pending artifact."}:{kind:"text_menu",text:["1. Allow \u2014 reply /approve "+o,"2. Deny \u2014 reply /deny "+o].join(`
5
+ `),cancelHint:"Cards are not available on this chat. Use /approve or /deny."}:{kind:"text_menu",text:"nothing to approve",cancelHint:""}:String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[]},cancelHint:"prepare-only \u2014 no local grant/session"}:{kind:"text_menu",text:"prepare-only \u2014 no local grant/session",cancelHint:""}}var m,rl,En,nl,Pt=l(()=>{Lt();m="UNKNOWN",rl=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),En=/[_*[\]`]/g;nl=Object.freeze({token:kn,launch:In,hip3:Tn,hip4:Cn,polymarket:On,twap:Nn,bridge:$n,swap:Rn,approve:Be})});import{readFileSync as Pn,existsSync as Bn}from"node:fs";import{request as Fn}from"node:http";function qn(t=process.env){let e=String(t.ORACLE_SIGNER_URL||Mn).replace(/\/$/,""),r;try{r=new URL(e)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function Dn(t=process.env){if(t.ORACLE_SIGNER_TOKEN)return String(t.ORACLE_SIGNER_TOKEN);let e=Ot(`${A()}/signer`).token;return Bn(e)?Pn(e,"utf8").trim():null}function Bt(t,{method:e="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let i=qn(n),s=Dn(n);return!i||!s?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(a=>{let u=new URL(t,i),f=r?Buffer.from(JSON.stringify(r)):null,d=Fn({hostname:u.hostname,port:u.port||80,path:u.pathname,method:e,timeout:o,headers:{authorization:`Bearer ${s}`,origin:i,...f?{"content-type":"application/json","content-length":f.length}:{}}},p=>{let b=[];p.on("data",E=>b.push(E)),p.on("end",()=>{let E=Buffer.concat(b).toString("utf8"),w={};try{w=E?JSON.parse(E):{}}catch{w={error:"signer refused"}}a({httpStatus:p.statusCode,...w})})});d.on("timeout",()=>{d.destroy(),a({ok:!1,error:"local signer timed out"})}),d.on("error",()=>a({ok:!1,error:"local signer is not running"})),f&&d.write(f),d.end()})}function Me(t){let r=String(t||"").trim().match(/^\/(approve|deny|pending)(?:@[\w_]+)?(?:\s+([0-9a-fA-F]{4,64}))?\s*$/i);return r?{verb:r[1].toLowerCase(),id:r[2]?r[2].toLowerCase():null}:null}function Un(t,{platform:e,grant:r,armed:n}){if(!t.length)return{text:"No pending local-signer artifacts.",buttons:Fe({platform:e,hasGrant:!1})};let o=t[0];return{text:t.map(s=>Be({...s,armed:n,grant:r,confidence:n?"high":"medium"})).join(`
5
6
 
6
- `),buttons:ke({platform:e,id:o.id,digest:o.digest,hasGrant:Ae({grant:r}).allowed})}}async function Te({platform:t,text:e,grant:r={local:!0},env:n=process.env}={}){let o=Ie(e);if(!o)return null;let i=String(t)==="telegram";if(i&&o.verb!=="pending"&&!o.id)return{text:"On Telegram, tap Allow or Deny on the approve card. /approve is only for chats without cards.",buttons:null};if(o.verb==="pending"){let d=await yt("/pending",{env:n});if(d.ok===!1||d.error)return{text:`Local signer: ${d.error||"not running"}. Start \`oracle signer\` on this machine first.`,buttons:null};let m=Array.isArray(d.items)?d.items:[],y=cn(m,{platform:t,grant:r,armed:d.armed===!0});if(i)return y;if(!m.length)return{text:"No pending local-signer artifacts. /approve is only needed when cards are unavailable.",buttons:null};let b=m.map(g=>`\u2022 ${g.id} ${g.surface}/${g.action} to ${g.to||"n/a"}`);return b.push("Cards are not available here. Reply /approve <id> or /deny <id>."),{text:b.join(`
7
- `),buttons:null}}let s=o.verb==="approve"?"/ack":"/deny";if(!o.id)return{text:"Usage: /approve <id> (only when approve cards are not available)",buttons:null};let a=await yt(s,{method:"POST",body:{id:o.id},env:n});if(a.httpStatus===404||a.error==="no pending artifact")return{text:"Nothing pending with that id. It may have expired or already been decided.",buttons:null};if(a.ok===!1||a.httpStatus&&a.httpStatus>=400)return{text:`Local signer refused: ${a.error||"not running"}`,buttons:null};if(o.verb==="deny")return{text:`Denied ${a.id||o.id}. Artifact dropped. Nothing signed.`,buttons:null};let u=a.result?.hash||a.result?.txHash||a.result?.transactionHash||a.hash,f=a.id||o.id;return u?{text:`Bought. Local signer executed ${f}.
8
- Tx: \`${u}\``,buttons:null,executed:!0,hash:u}:{text:`Local signer executed ${f}. Check the signer receipt if no hash was returned.`,buttons:null,executed:!0,result:a.result||null}}async function bt({platform:t,data:e,grant:r={local:!0},env:n=process.env}={}){let i=String(e||"").match(/^oracle:(approve|deny):([0-9a-fA-F]{4,64})$/i);if(!i)return null;let s=i[1].toLowerCase()==="approve"?"approve":"deny";return Te({platform:t,text:`/${s} ${i[2]}`,grant:r,env:n})}var on,Oe=l(()=>{ne();ft();gt();on="http://127.0.0.1:9462"});import{execFile as un}from"node:child_process";import{existsSync as ln,mkdirSync as dn,readFileSync as Et,realpathSync as fn,writeFileSync as pn}from"node:fs";import I from"node:path";import{promisify as mn}from"node:util";import{fileURLToPath as xt}from"node:url";function yn(t=import.meta.url){try{let e=fn(xt(t)),r=`${I.sep}node_modules${I.sep}`,n=e.lastIndexOf(r);if(n>0)return{root:e.slice(0,n),managed:!0}}catch{}return{root:null,managed:!1}}function Ce(t=import.meta.url){try{let e=I.dirname(xt(t));for(let r=0;r<8;r+=1){let n=I.join(e,"package.json");if(ln(n)){let i=JSON.parse(Et(n,"utf8"));if(i?.name===Ne&&i.version)return i.version}let o=I.dirname(e);if(o===e)break;e=o}}catch{return null}return null}function bn(t,e){let r=i=>String(i).replace(/^v/,"").split("-")[0].split(".").map(s=>Number.parseInt(s,10)||0),n=r(t),o=r(e);for(let i=0;i<Math.max(n.length,o.length);i+=1){let s=n[i]??0,a=o[i]??0;if(s>a)return 1;if(s<a)return-1}return 0}function St(t){let e=t?.stateDir||I.join(process.env.HOME||".",".oracle");return I.join(e,"update-check.json")}function En(t){try{return JSON.parse(Et(St(t),"utf8"))}catch{return null}}function xn(t,e){try{let r=St(t);dn(I.dirname(r),{recursive:!0}),pn(r,`${JSON.stringify(e,null,2)}
9
- `)}catch{}}async function Sn({timeoutMs:t=4e3}={}){try{let e=new AbortController,r=setTimeout(()=>e.abort(),t),n=await fetch(`${wn}/${encodeURIComponent(Ne)}/latest`,{signal:e.signal});return clearTimeout(r),n.ok&&(await n.json())?.version||null}catch{return null}}async function At({paths:t,force:e=!1,timeoutMs:r=4e3}={}){let n=Ce(),o=e?null:En(t),s=o&&Date.now()-(o.checkedAt||0)<gn?o.latest:null;return s||(s=await Sn({timeoutMs:r}),s&&xn(t,{latest:s,checkedAt:Date.now()})),!n||!s?{current:n,latest:s,updateAvailable:!1,checked:!!s}:{current:n,latest:s,updateAvailable:bn(s,n)>0,checked:!0}}async function vt({version:t="latest",dryRun:e=!1}={}){let{root:r,managed:n}=yn();if(!n||!r)return{ok:!1,reason:"unmanaged",message:`oracle is not running from a resolvable node_modules tree (source checkout or linked dev install).
10
- Update it the same way you installed it \u2014 git pull, or npm install -g @oracle-agent/oracle@latest.`};let o=`${Ne}@${t}`,i=["install","--prefix",r,"--no-audit","--no-fund",o];if(e)return{ok:!0,dryRun:!0,root:r,command:`npm ${i.join(" ")}`};try{let{stdout:s,stderr:a}=await hn("npm",i,{timeout:3e5,maxBuffer:16777216});return{ok:!0,root:r,stdout:s,stderr:a}}catch(s){return{ok:!1,reason:"npm-failed",root:r,message:s?.stderr||s?.message||"npm install failed"}}}var hn,Ne,wn,gn,kt=l(()=>{hn=mn(un),Ne="@oracle-agent/oracle",wn="https://registry.npmjs.org",gn=1440*60*1e3});var Mt={};L(Mt,{NON_OWNER_REPLY:()=>q,buildPersona:()=>D,handleSelfUpdate:()=>$t,isForwarded:()=>Lt,isOwnerSender:()=>M,ownerIdsFor:()=>Nt,parsePeerAsk:()=>Rt,parseSelfUpdate:()=>Ct,resolveBackendArgv:()=>Pt,resolveGatewayModel:()=>_t,routePeerConsult:()=>G,routeToAgent:()=>T});import{spawn as It}from"node:child_process";import{join as Tt}from"node:path";import{homedir as Ot}from"node:os";function Nt(t,e=process.env){let r=String(e[`ORACLE_OWNER_${String(t).toUpperCase()}`]||""),n=String(e.ORACLE_OWNER_IDS||"");return new Set(`${r},${n}`.split(",").map(o=>o.trim()).filter(Boolean))}function M({platform:t,senderId:e,extraOwners:r},n=process.env){let o=String(e||"").trim();return o?Nt(t,n).has(o)?!0:Array.isArray(r)?r.map(i=>String(i).trim()).filter(Boolean).includes(o):!1:!1}function Ct(t){let e=String(t||"").trim();if(!e)return null;let r=e.replace(/^\/update(?:@[\w_]+)?\b/i,"update");return/^(?:oracle\s+)?update\s+--check\s*$/i.test(r)?{checkOnly:!0}:/^(?:oracle\s+)?update\s*$/i.test(r)?{checkOnly:!1}:null}async function $t(t,{check:e=At,update:r=vt,versionOf:n=Ce}={}){let o=await e({force:!0});if(t.checkOnly)return o.checked?o.updateAvailable?`oracle ${o.current} \u2192 ${o.latest} available. Send /update to install.`:`oracle ${o.current} is up to date`:`oracle ${o.current||"?"} \u2014 could not reach npm`;if(o.checked&&!o.updateAvailable)return`oracle ${o.current} is already up to date`;let i=o.latest||"latest",s=await r({version:i==="latest"?"latest":i});if(!s.ok)return`oracle update failed: ${s.message}`;let a=n();return[`oracle ${o.current||"?"} \u2192 ${a||i}`,"Restart the gateway to load it: oracle gateway"].join(`
11
- `)}function Lt(t={}){return!!(t.forwarded||t.forward_from||t.forward_from_chat||t.forward_origin||t.forward_sender_name||t.forward_date)}function _t({readConfig:t=De}={}){let e=t();return e?e.backend==="hermes"?{ok:!1,error:"model config delegates to hermes; the gateway runs Oracle's native loop. Set a standalone backend: oracle model --backend standalone"}:e.model?{ok:!0,provider:e.provider,model:e.model}:{ok:!1,error:"model config has no model \u2014 run: oracle model --backend standalone --provider <p> --model <m>"}:{ok:!1,error:"gateway has no model configured \u2014 run: oracle model --backend standalone --provider <p> --model <m>"}}function Rt(t){let e=String(t||"").trim();if(!e)return null;let r=e.match(/^\/ask(?:@[\w_]+)?\s+([\w-]+)\s+([\s\S]+)$/i);return r||(r=e.match(/^@([\w-]+)\s+([\s\S]+)$/)),r?{peer:r[1].toLowerCase(),text:r[2].trim()}:null}function D(t={}){let e=[];return t.role&&e.push(String(t.role)),Array.isArray(t.chains)&&t.chains.length&&e.push(`chains: ${t.chains.join(", ")}`),t.persona&&e.push(String(t.persona)),e.join(" \xB7 ")}function Pt(t,e,{profile:r}={}){let n=String(t||"oracle").toLowerCase(),o=String(e||"");if(n==="oracle")return{ok:!0,bin:null,args:["chat","-q",o]};if(n==="grok")return{ok:!0,bin:"grok",args:["-p",o]};if(n==="hermes"){let i=[];return r&&i.push("-p",String(r)),i.push("-z",o),{ok:!0,bin:"hermes",args:i}}return n==="claude"?{ok:!0,bin:"claude",args:["-p",o]}:{ok:!1,error:`unknown backend '${t}' (allowed: oracle, grok, hermes, claude)`}}async function G({from:t,text:e,persona:r="",backend:n,profile:o}={}){let i=[`[a2a consult from agent '${t}' \u2014 answer with information only; do not prepare, arm, or execute anything]`,r?`[your role: ${r}]`:"",String(e||"").trim()].filter(Boolean).join(`
12
- `);return Ft({text:i,backend:n,profile:o,unconfiguredPrefix:"unconfigured: "})}async function T({platform:t,chatId:e,senderId:r,text:n,userName:o,meta:i={},updater:s,extraOwners:a,bus:u,agentName:f,persona:d,backend:m,profile:y}={}){if(!M({platform:t,senderId:r,extraOwners:a}))return process.stderr.write(`gateway: denied non-owner sender ${t}:${String(r||"unknown")}
13
- `),q;if(Lt(i))return process.stderr.write(`gateway: dropped forwarded message on ${t}
14
- `),null;let b=Ct(n);if(b)return $t(b,s);if(Ie(n)){let E=await Te({platform:t,text:n,grant:{local:!0}});return E?E.buttons?.kind==="inline_keyboard"?{text:E.text,replyMarkup:E.buttons.replyMarkup}:E.text:null}if(u){let E=Rt(n);if(E){let O=await u.send({from:f||"oracle",to:E.peer,text:E.text,kind:"consult"});return O.ok?O.reply?`[${E.peer}] ${O.reply}`:`[${E.peer}] (no reply)`:O.error}if(/^\/(agents|roster)\b/i.test(String(n||"").trim())){let O=u.roster().map(j=>`\u2022 ${j.name}${j.role?` \u2014 ${j.role}`:""}${j.chains.length?` (${j.chains.join(", ")})`:""}`);return O.length?`Agents on the bus:
7
+ `),buttons:Fe({platform:e,id:o.id,digest:o.digest,hasGrant:Pe({grant:r}).allowed})}}async function qe({platform:t,text:e,grant:r={local:!0},env:n=process.env}={}){let o=Me(e);if(!o)return null;let i=String(t)==="telegram";if(i&&o.verb!=="pending"&&!o.id)return{text:"On Telegram, tap Allow or Deny on the approve card. /approve is only for chats without cards.",buttons:null};if(o.verb==="pending"){let d=await Bt("/pending",{env:n});if(d.ok===!1||d.error)return{text:`Local signer: ${d.error||"not running"}. Start \`oracle signer\` on this machine first.`,buttons:null};let p=Array.isArray(d.items)?d.items:[],b=Un(p,{platform:t,grant:r,armed:d.armed===!0});if(i)return b;if(!p.length)return{text:"No pending local-signer artifacts. /approve is only needed when cards are unavailable.",buttons:null};let E=p.map(w=>`\u2022 ${w.id} ${w.surface}/${w.action} to ${w.to||"n/a"}`);return E.push("Cards are not available here. Reply /approve <id> or /deny <id>."),{text:E.join(`
8
+ `),buttons:null}}let s=o.verb==="approve"?"/ack":"/deny";if(!o.id)return{text:"Usage: /approve <id> (only when approve cards are not available)",buttons:null};let a=await Bt(s,{method:"POST",body:{id:o.id},env:n});if(a.httpStatus===404||a.error==="no pending artifact")return{text:"Nothing pending with that id. It may have expired or already been decided.",buttons:null};if(a.ok===!1||a.httpStatus&&a.httpStatus>=400)return{text:`Local signer refused: ${a.error||"not running"}`,buttons:null};if(o.verb==="deny")return{text:`Denied ${a.id||o.id}. Artifact dropped. Nothing signed.`,buttons:null};let u=a.result?.hash||a.result?.txHash||a.result?.transactionHash||a.hash,f=a.id||o.id;return u?{text:`Bought. Local signer executed ${f}.
9
+ Tx: \`${u}\``,buttons:null,executed:!0,hash:u}:{text:`Local signer executed ${f}. Check the signer receipt if no hash was returned.`,buttons:null,executed:!0,result:a.result||null}}async function Ft({platform:t,data:e,grant:r={local:!0},env:n=process.env}={}){let i=String(e||"").match(/^oracle:(approve|deny):([0-9a-fA-F]{4,64})$/i);if(!i)return null;let s=i[1].toLowerCase()==="approve"?"approve":"deny";return qe({platform:t,text:`/${s} ${i[2]}`,grant:r,env:n})}var Mn,De=l(()=>{re();Nt();Pt();Mn="http://127.0.0.1:9462"});import{execFile as jn}from"node:child_process";import{existsSync as Hn,mkdirSync as Wn,readFileSync as Mt,realpathSync as Jn,writeFileSync as Gn}from"node:fs";import T from"node:path";import{promisify as zn}from"node:util";import{fileURLToPath as qt}from"node:url";function Xn(t=import.meta.url){try{let e=Jn(qt(t)),r=`${T.sep}node_modules${T.sep}`,n=e.lastIndexOf(r);if(n>0)return{root:e.slice(0,n),managed:!0}}catch{}return{root:null,managed:!1}}function je(t=import.meta.url){try{let e=T.dirname(qt(t));for(let r=0;r<8;r+=1){let n=T.join(e,"package.json");if(Hn(n)){let i=JSON.parse(Mt(n,"utf8"));if(i?.name===Ue&&i.version)return i.version}let o=T.dirname(e);if(o===e)break;e=o}}catch{return null}return null}function Qn(t,e){let r=i=>String(i).replace(/^v/,"").split("-")[0].split(".").map(s=>Number.parseInt(s,10)||0),n=r(t),o=r(e);for(let i=0;i<Math.max(n.length,o.length);i+=1){let s=n[i]??0,a=o[i]??0;if(s>a)return 1;if(s<a)return-1}return 0}function Dt(t){let e=t?.stateDir||T.join(process.env.HOME||".",".oracle");return T.join(e,"update-check.json")}function Zn(t){try{return JSON.parse(Mt(Dt(t),"utf8"))}catch{return null}}function eo(t,e){try{let r=Dt(t);Wn(T.dirname(r),{recursive:!0}),Gn(r,`${JSON.stringify(e,null,2)}
10
+ `)}catch{}}async function to({timeoutMs:t=4e3}={}){try{let e=new AbortController,r=setTimeout(()=>e.abort(),t),n=await fetch(`${Kn}/${encodeURIComponent(Ue)}/latest`,{signal:e.signal});return clearTimeout(r),n.ok&&(await n.json())?.version||null}catch{return null}}async function Ut({paths:t,force:e=!1,timeoutMs:r=4e3}={}){let n=je(),o=e?null:Zn(t),s=o&&Date.now()-(o.checkedAt||0)<Yn?o.latest:null;return s||(s=await to({timeoutMs:r}),s&&eo(t,{latest:s,checkedAt:Date.now()})),!n||!s?{current:n,latest:s,updateAvailable:!1,checked:!!s}:{current:n,latest:s,updateAvailable:Qn(s,n)>0,checked:!0}}async function jt({version:t="latest",dryRun:e=!1}={}){let{root:r,managed:n}=Xn();if(!n||!r)return{ok:!1,reason:"unmanaged",message:`oracle is not running from a resolvable node_modules tree (source checkout or linked dev install).
11
+ Update it the same way you installed it \u2014 git pull, or npm install -g @oracle-agent/oracle@latest.`};let o=`${Ue}@${t}`,i=["install","--prefix",r,"--no-audit","--no-fund",o];if(e)return{ok:!0,dryRun:!0,root:r,command:`npm ${i.join(" ")}`};try{let{stdout:s,stderr:a}=await Vn("npm",i,{timeout:3e5,maxBuffer:16777216});return{ok:!0,root:r,stdout:s,stderr:a}}catch(s){return{ok:!1,reason:"npm-failed",root:r,message:s?.stderr||s?.message||"npm install failed"}}}var Vn,Ue,Kn,Yn,Ht=l(()=>{Vn=zn(jn),Ue="@oracle-agent/oracle",Kn="https://registry.npmjs.org",Yn=1440*60*1e3});import ro from"node:fs";import no from"node:os";import Wt from"node:path";function D(t){return String(t||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function oo(){let t=process.env.ORACLE_CONFIG_DIR||Wt.join(no.homedir(),".config","oracle");return Wt.join(t,"chains.json")}function io(t){if(!t||typeof t!="object")return null;let e=String(t.key??"").trim();if(!e||/[/\\.]/.test(e))return null;let r=D(e);if(!Gt.test(r))return null;let n=typeof t.chainId=="string"?t.chainId.trim():Number(t.chainId);if(n===""||n===null||n===void 0||typeof n=="number"&&!Number.isFinite(n))return null;let o=typeof t.agent=="string"&&Gt.test(t.agent.trim())?t.agent.trim():"oracle";return{key:r,aliases:Array.isArray(t.aliases)?t.aliases.map(D).filter(Boolean).slice(0,8):[],chainId:n,name:String(t.name||r).slice(0,60),kind:["evm","svm","utxo","venue"].includes(t.kind)?t.kind:"evm",family:D(t.family)||r,agent:o,note:String(t.note||"user-defined").slice(0,80),build:t.build!==!1,source:"user"}}function ao(t=ro.readFileSync){try{let e=JSON.parse(t(oo(),"utf8")),r=Array.isArray(e?.chains)?e.chains:[],n=[],o=new Set;for(let i of r){let s=io(i);!s||o.has(s.key)||(o.add(s.key),n.push(s))}return n}catch{return[]}}function zt(){let t=ao();if(t.length===0)return Jt;let e=new Map(Jt.map(r=>[r.key,r]));for(let r of t)e.set(r.key,r);return[...e.values()]}function so({buildOnly:t=!1}={}){return zt().filter(e=>t?e.build:!0)}function X(t){let e=D(t);if(!e)return null;for(let r of zt())if(r.key===e||String(r.chainId).toLowerCase()===e||(r.aliases||[]).map(D).includes(e)||D(r.name)===e)return r;return null}function Vt({selectedKey:t=null,buildOnly:e=!1}={}){let r=so({buildOnly:e}),n=["oracle chains","","pick a build/trade surface:",""];for(let o of r){let i=t&&t===o.key?"*":" ",s=String(o.chainId).padEnd(6),a=o.key.padEnd(12);n.push(`${i} ${a} ${s} ${o.note}`)}return n.push(""),n.push("usage:"),n.push(" /chain list"),n.push(" /chain hyperliquid select"),n.push(" /chain show current"),n.push(" /chain clear unset"),n.push(" oracle chain use base same from shell"),t&&n.push("",`active: ${t}`),n.join(`
12
+ `)+`
13
+ `}var Jt,Gt,He=l(()=>{Jt=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);Gt=/^[a-z0-9][a-z0-9-]*$/});import We from"node:fs";import co from"node:path";function Kt(){return co.join(A(),"active-chain.json")}function Je(){let t=Kt();if(!We.existsSync(t))return null;try{let e=JSON.parse(We.readFileSync(t,"utf8"));if(!e||typeof e!="object"||!e.key)return null;let r=X(e.key);return r?{key:r.key,chainId:r.chainId,name:r.name,agent:r.agent,selectedAt:e.selectedAt||null}:null}catch{return null}}function Yt(t){let e=X(t);if(!e){let n=new Error(`unknown chain '${t}'`);throw n.code="UNKNOWN_CHAIN",n}te(A());let r={key:e.key,chainId:e.chainId,name:e.name,agent:e.agent,selectedAt:new Date().toISOString()};return We.writeFileSync(Kt(),JSON.stringify(r,null,2)+`
14
+ `,{mode:384}),r}var Xt=l(()=>{He();re()});var Er={};_(Er,{NON_OWNER_REPLY:()=>j,buildPersona:()=>H,handleSelfUpdate:()=>or,isForwarded:()=>ir,isOwnerSender:()=>U,ownerIdsFor:()=>rr,parseGatewayChainCommand:()=>mr,parseGatewayCompactCommand:()=>pr,parseGatewayEffortCommand:()=>ur,parseGatewayGoalCommand:()=>fr,parseGatewayHelpCommand:()=>lr,parseGatewayModelCommand:()=>cr,parseGatewaySetupModelCommand:()=>xo,parseGatewayStatusCommand:()=>dr,parsePeerAsk:()=>wr,parseSelfUpdate:()=>nr,resolveBackendArgv:()=>gr,resolveGatewayModel:()=>ar,resolveOracleBin:()=>tr,routePeerConsult:()=>Q,routeToAgent:()=>C});import{spawn as er}from"node:child_process";import{dirname as uo,join as ze}from"node:path";import{homedir as lo}from"node:os";import{mkdirSync as fo,readFileSync as po,writeFileSync as mo,unlinkSync as ho}from"node:fs";import{fileURLToPath as wo}from"node:url";function tr({env:t=process.env,moduleUrl:e=import.meta.url}={}){return t.ORACLE_CLI_ENTRY||ze(uo(wo(e)),"oracle.mjs")}function rr(t,e=process.env){let r=String(e[`ORACLE_OWNER_${String(t).toUpperCase()}`]||""),n=String(e.ORACLE_OWNER_IDS||"");return new Set(`${r},${n}`.split(",").map(o=>o.trim()).filter(Boolean))}function U({platform:t,senderId:e,extraOwners:r},n=process.env){let o=String(e||"").trim();return o?rr(t,n).has(o)?!0:Array.isArray(r)?r.map(i=>String(i).trim()).filter(Boolean).includes(o):!1:!1}function nr(t){let e=String(t||"").trim();if(!e)return null;let r=e.replace(/^\/update(?:@[\w_]+)?\b/i,"update");return/^(?:oracle\s+)?update\s+--check\s*$/i.test(r)?{checkOnly:!0}:/^(?:oracle\s+)?update\s*$/i.test(r)?{checkOnly:!1}:null}async function or(t,{check:e=Ut,update:r=jt,versionOf:n=je}={}){let o=await e({force:!0});if(t.checkOnly)return o.checked?o.updateAvailable?`oracle ${o.current} \u2192 ${o.latest} available. Send /update to install.`:`oracle ${o.current} is up to date`:`oracle ${o.current||"?"} \u2014 could not reach npm`;if(o.checked&&!o.updateAvailable)return`oracle ${o.current} is already up to date`;let i=o.latest||"latest",s=await r({version:i==="latest"?"latest":i});if(!s.ok)return`oracle update failed: ${s.message}`;let a=n();return[`oracle ${o.current||"?"} \u2192 ${a||i}`,"Restart the gateway to load it: oracle gateway"].join(`
15
+ `)}function ir(t={}){return!!(t.forwarded||t.forward_from||t.forward_from_chat||t.forward_origin||t.forward_sender_name||t.forward_date)}function ar({readConfig:t=M}={}){let e=t();return e?e.backend==="hermes"?{ok:!1,error:"model config delegates to hermes; the gateway runs Oracle's native loop. Set a standalone backend: oracle model --backend standalone"}:e.model?{ok:!0,provider:e.provider,model:e.model,reasoningEffort:e.reasoningEffort||null}:{ok:!1,error:"model config has no model \u2014 run: oracle model --backend standalone --provider <p> --model <m>"}:{ok:!1,error:"gateway has no model configured \u2014 run: oracle model --backend standalone --provider <p> --model <m>"}}function cr(t){let r=String(t||"").trim().match(/^\/model(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim();if(!n)return{action:"list"};if(n.toLowerCase()==="show"||n==="?")return{action:"show"};if(n.toLowerCase()==="list")return{action:"list"};let o=n.split(/\s+/),i=sr[o[0].toLowerCase()];if(i&&o.length===1)return{action:"set",provider:i.provider,model:i.model};if(i&&o.length>=2)return{action:"set",provider:i.provider,model:o.slice(1).join(" ")};if(o.length>=2)return{action:"set",provider:o[0],model:o.slice(1).join(" ")};if(o[0]?.includes(":")){let[s,a]=o[0].split(":");if(s&&a)return{action:"set",provider:s,model:a}}return{action:"usage"}}function ur(t){let r=String(t||"").trim().match(/^\/(?:effort|reasoning)(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim().toLowerCase();return!n||n==="show"||n==="?"?{action:"show"}:yo.includes(n)?{action:"set",reasoningEffort:n}:{action:"usage"}}function bo({provider:t,model:e}){let r=M()||{},n=he({...r,backend:r.backend&&r.backend!=="auto"?r.backend:"standalone",provider:t,model:e});return`model ${n.provider} / ${n.model}
16
+ Oracle persona unchanged. Native harness only \u2014 Hermes Telegram uses its own /model.`}function Eo(t){let e=M();if(!e)throw new Error("no model configured \u2014 run /model first");return`effort ${he({...e,reasoningEffort:t}).reasoningEffort||t}
17
+ Native harness only.`}function Qt(){let t=M(),e=["Oracle native models (tap /model <id> to switch):"];for(let[r,n]of Object.entries(sr)){let o=t?.provider===n.provider&&t?.model===n.model?" \u2190 current":"";e.push(`/model ${r} ${n.provider} / ${n.model}${o}`)}return e.push(""),e.push("Add another provider: /setup model"),e.push("Or set exact id: /model <provider> <model-id>"),e.push("/effort low|medium|high"),t?.provider&&(e.push(""),e.push(`current ${t.provider} / ${t.model||"unset"} \xB7 effort ${t.reasoningEffort||"default"}`)),e.join(`
18
+ `)}function Ge(){let t=M();return t?[`backend ${t.backend||"auto"}`,`provider ${t.provider||"unset"}`,`model ${t.model||"unset"}`,`effort ${t.reasoningEffort||"default"}`,"Aliases: claude, codex, grok, openrouter, nous, qwen, glm, deepseek, gemini, kimi, mistral","/effort low|medium|high"].join(`
19
+ `):["No standalone model configured.","Use /model openrouter","or /model qwen","or /model glm","or /model nous","or /model <provider> <model-id>"].join(`
20
+ `)}function xo(t){let r=String(t||"").trim().match(/^\/setup(?:\s+model(?:\s+(.+))?)?$/i);if(!r)return null;let n=String(r[1]||"").trim();return n?{action:"hint",provider:n.split(/\s+/)[0]}:{action:"menu"}}function lr(t){let e=String(t||"").trim();return/^\/(?:help|commands|\?)$/i.test(e)?{action:"help"}:null}function dr(t){let e=String(t||"").trim();return/^\/(?:status|usage)$/i.test(e)?{action:"status"}:null}function fr(t){let r=String(t||"").trim().match(/^\/goal(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim();return!n||n.toLowerCase()==="show"?{action:"show"}:/^(clear|done|complete)$/i.test(n)?{action:"clear"}:{action:"set",goal:n}}function pr(t){let r=String(t||"").trim().match(/^\/(?:compact|compress)(?:\s+(.+))?$/i);return r?{action:"compact",focus:String(r[1]||"").trim()}:null}function mr(t){let r=String(t||"").trim().match(/^\/chain(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim();return!n||n.toLowerCase()==="list"?{action:"list"}:{action:"set",chain:n}}function Ke(){return ze(Ve,"gateway-goal.json")}function hr(){try{let t=JSON.parse(po(Ke(),"utf8"));return t&&typeof t.goal=="string"?t:null}catch{return null}}function So(t){fo(Ve,{recursive:!0,mode:448});let e={schemaVersion:1,goal:String(t),updatedAt:new Date().toISOString()};return mo(Ke(),`${JSON.stringify(e,null,2)}
21
+ `,{mode:384}),e}function Ao(){try{ho(Ke())}catch{}}function vo(){return["Oracle native Telegram \u2014 owner commands","","Start here","/help this list","/commands same as /help","/status model, effort, chain, goal","","Models (like TUI /model)","/model list models you can use now","/model <id> switch: openrouter, nous, qwen, glm, claude, codex, grok, deepseek, gemini, kimi, mistral","/model <provider> <id> set an exact model id","/setup model how to add OpenRouter, Nous Portal, Qwen, GLM, ...","/setup model <id> TTY command to add that provider (never paste keys here)","/effort show current reasoning effort","/effort low|medium|high set effort like Hermes","","Session (like TUI / Hermes)","/goal show pinned objective","/goal <text> pin the session objective","/goal clear clear the objective","/compact [focus] compact context","/compress [focus] alias for /compact","/chain list working chains","/chain <name> switch chain","","Trading / signer","/update install latest Oracle","/approve Allow pending local-signer action","/deny Deny pending local-signer action","","Do not paste API keys into Telegram. Hermes Telegram keeps its own /model."].join(`
22
+ `)}function ko(){let t=Ge(),e=Je(),r=hr();return[t,`chain ${e?.key||e?.name||"default"}`,`goal ${r?.goal||"unset"}`].join(`
23
+ `)}function wr(t){let e=String(t||"").trim();if(!e)return null;let r=e.match(/^\/ask(?:@[\w_]+)?\s+([\w-]+)\s+([\s\S]+)$/i);return r||(r=e.match(/^@([\w-]+)\s+([\s\S]+)$/)),r?{peer:r[1].toLowerCase(),text:r[2].trim()}:null}function H(t={}){let e=[];return t.role&&e.push(String(t.role)),Array.isArray(t.chains)&&t.chains.length&&e.push(`chains: ${t.chains.join(", ")}`),t.persona&&e.push(String(t.persona)),e.join(" \xB7 ")}function gr(t,e,{profile:r}={}){let n=String(t||"oracle").toLowerCase(),o=String(e||"");if(n==="oracle")return{ok:!0,bin:null,args:["chat","-q",o]};if(n==="grok")return{ok:!0,bin:"grok",args:["-p",o]};if(n==="hermes"){let i=[];return r&&i.push("-p",String(r)),i.push("-z",o),{ok:!0,bin:"hermes",args:i}}return n==="claude"?{ok:!0,bin:"claude",args:["-p",o]}:{ok:!1,error:`unknown backend '${t}' (allowed: oracle, grok, hermes, claude)`}}async function Q({from:t,text:e,persona:r="",backend:n,profile:o}={}){let i=[`[a2a consult from agent '${t}' \u2014 answer with information only; do not prepare, arm, or execute anything]`,r?`[your role: ${r}]`:"",String(e||"").trim()].filter(Boolean).join(`
24
+ `);return br({text:i,backend:n,profile:o,unconfiguredPrefix:"unconfigured: "})}async function C({platform:t,chatId:e,senderId:r,text:n,userName:o,meta:i={},updater:s,extraOwners:a,bus:u,agentName:f,persona:d,backend:p,profile:b}={}){if(!U({platform:t,senderId:r,extraOwners:a}))return process.stderr.write(`gateway: denied non-owner sender ${t}:${String(r||"unknown")}
25
+ `),j;if(ir(i))return process.stderr.write(`gateway: dropped forwarded message on ${t}
26
+ `),null;let E=nr(n);if(E)return or(E,s);let w=cr(n);if(w)try{return w.action==="list"?Qt():w.action==="show"?Ge():w.action==="usage"?Qt():bo(w)}catch(h){return`model not saved: ${h.message}`}let Z=ur(n);if(Z)try{return Z.action==="show"?Ge():Z.action==="usage"?"usage: /effort low|medium|high":Eo(Z.reasoningEffort)}catch(h){return`effort not saved: ${h.message}`}if(lr(n))return vo();if(dr(n))return ko();let J=fr(n);if(J){if(J.action==="show"){let h=hr();return h?.goal?`goal ${h.goal}`:"goal unset \u2014 /goal <objective>"}return J.action==="clear"?(Ao(),"goal cleared"):(So(J.goal),`goal pinned: ${J.goal}`)}let de=pr(n);if(de){let h=de.focus?` Focus: ${de.focus}.`:"";return Zt({platform:t,chatId:e,senderId:r,text:`Compact this session context now.${h} Summarize older turns, keep the current goal, model, chain, and any pending unsigned prepare artifacts. Do not sign or broadcast.`,userName:o,persona:d,backend:p,profile:b})}let ee=mr(n);if(ee){if(ee.action==="list")return Vt({selectedKey:Je()?.key||null});let h=X(ee.chain);return h?(Yt(h.key),`chain ${h.key}`):`unknown chain '${ee.chain}' \u2014 /chain list`}if(Me(n)){let h=await qe({platform:t,text:n,grant:{local:!0}});return h?h.buttons?.kind==="inline_keyboard"?{text:h.text,replyMarkup:h.buttons.replyMarkup}:h.text:null}if(u){let h=wr(n);if(h){let O=await u.send({from:f||"oracle",to:h.peer,text:h.text,kind:"consult"});return O.ok?O.reply?`[${h.peer}] ${O.reply}`:`[${h.peer}] (no reply)`:O.error}if(/^\/(agents|roster)\b/i.test(String(n||"").trim())){let O=u.roster().map(G=>`\u2022 ${G.name}${G.role?` \u2014 ${G.role}`:""}${G.chains.length?` (${G.chains.join(", ")})`:""}`);return O.length?`Agents on the bus:
15
27
  ${O.join(`
16
- `)}`:"No peer agents registered."}}let er=n.toLowerCase().trim();return/\b(buy|sell|swap|bridge|send|transfer|balance|portfolio|watch|quote|price)\b/.test(er)?In({platform:t,chatId:e,senderId:r,text:n,userName:o}):Tn({platform:t,chatId:e,senderId:r,text:n,userName:o,persona:d,backend:m,profile:y})}function Bt(t,{timeout:e=12e4}={}){return new Promise(r=>{let n=It(process.execPath,[vn,...t],{stdio:["ignore","pipe","pipe"],timeout:e,env:{...process.env,ORACLE_CONFIG_DIR:An}}),o="",i="";n.stdout.on("data",s=>o+=s.toString()),n.stderr.on("data",s=>i+=s.toString()),n.on("close",s=>r({code:s,out:o.trim(),err:i.trim()}))})}function kn(t,e,{timeout:r=18e4}={}){return new Promise(n=>{let o=It(t,e,{stdio:["ignore","pipe","pipe"],timeout:r,env:{...process.env}}),i="",s="";o.on("error",a=>n({code:127,out:"",err:String(a.message)})),o.stdout.on("data",a=>i+=a.toString()),o.stderr.on("data",a=>s+=a.toString()),o.on("close",a=>n({code:a,out:i.trim(),err:s.trim()}))})}async function In({text:t}){let e=await Bt(["route","swap","--text",t],{timeout:3e4});if(e.code===0&&e.out)try{return On(JSON.parse(e.out))}catch{return e.out}return`Trade routing failed. Try: \`${t}\` again.`}async function Tn({text:t,persona:e,backend:r,profile:n}){let o=e?`[your role: ${e}]
17
- ${t}`:t;return Ft({text:o,backend:r,profile:n,unconfiguredPrefix:"Oracle is not configured yet: "})}async function Ft({text:t,backend:e,profile:r,unconfiguredPrefix:n}){let o=Pt(e,t,{profile:r});if(!o.ok)return`${n}${o.error}`;if(!o.bin){let s=_t();if(!s.ok)return`${n}${s.error}`;let a=await Bt(o.args);return a.code===0&&a.out?a.out:a.err||"Oracle could not answer that. Try again."}let i=await kn(o.bin,o.args);return i.code===0&&i.out?i.out:/ENOENT/.test(i.err)?`${n}backend '${o.bin}' is not installed on this machine`:i.err||`${o.bin} could not answer that. Try again.`}function On(t){return t.error?`\u274C ${t.error}`:t.tx?`\u2705 Trade prepared: \`${t.tx.slice(0,20)}...\`
18
- Sign and broadcast from your own wallet.`:t.quote?`\u{1F4B1} ${t.quote}`:t.portfolio?`\u{1F4CA} ${t.portfolio}`:JSON.stringify(t,null,2)}var An,vn,q,U=l(()=>{Ue();Oe();kt();An=process.env.ORACLE_CONFIG_DIR||Tt(Ot(),".config","oracle"),vn=process.env.ORACLE_CLI_ENTRY||Tt(Ot(),".local","share","oracle-stable","node_modules","@oracle-agent","oracle","bin","oracle.mjs");q="Oracle is self-hostable. Install your own instance: npm install -g @oracle-agent/oracle"});var Dt={};L(Dt,{buildPersona:()=>D,telegram:()=>Nn});function qt(t,e){if(!e)return;if(typeof e=="string")return t.reply(e,{parse_mode:"Markdown"});let r=e.replyMarkup?{reply_markup:e.replyMarkup}:{};return t.reply(e.text,{parse_mode:"Markdown",...r})}async function Nn(t){let{Bot:e}=await import("grammy"),r=new e(t.token),n=String(t.name||"oracle").toLowerCase(),o=D(t),i=Array.isArray(t.owners)?t.owners:void 0,s=t.bus;return s&&s.register(n,{role:t.role||"",chains:t.chains||[],handler:a=>G({from:a.from,text:a.text,persona:o,backend:t.backend,profile:t.hermesProfile})}),r.command("start",a=>{let u=String(a.from?.id||a.chat.id);return M({platform:"telegram",senderId:u,extraOwners:i})?a.reply(`${n} ready. Ask me anything \u2014 swap, bridge, portfolio, watch. /update installs latest.${s?" /agents lists peers.":""}`):a.reply(q)}),r.command("update",async a=>{let u=String(a.from?.id||a.chat.id),f=String(a.chat.id);if(!M({platform:"telegram",senderId:u,extraOwners:i}))return a.reply(q);if(a.message.forward_origin||a.message.forward_from||a.message.forward_date)return;a.replyWithChatAction("typing").catch(()=>{});let d=await T({platform:"telegram",chatId:f,senderId:u,text:a.match?`update ${a.match}`.trim():"update",userName:a.from?.username||a.from?.first_name||"user"});if(d)return qt(a,d)}),r.on("message:text",async a=>{let u=String(a.chat.id),f=String(a.from?.id||u),d=a.message.text;try{a.replyWithChatAction("typing").catch(()=>{});let m=await T({platform:"telegram",chatId:u,senderId:f,text:d,userName:a.from?.username||a.from?.first_name||"user",extraOwners:i,bus:s,agentName:n,persona:o,backend:t.backend,profile:t.hermesProfile,meta:{forward_origin:a.message.forward_origin,forward_from:a.message.forward_from,forward_from_chat:a.message.forward_from_chat,forward_sender_name:a.message.forward_sender_name,forward_date:a.message.forward_date}});m&&await qt(a,m)}catch(m){process.stderr.write(`telegram-gateway[${n}]: ${m.message}
19
- `),await a.reply("Something went wrong. Try again.").catch(()=>{})}}),r.on("callback_query:data",async a=>{let u=String(a.from?.id||"");if(!M({platform:"telegram",senderId:u,extraOwners:i})){await a.answerCallbackQuery({text:q.slice(0,180),show_alert:!0}).catch(()=>{});return}let f=String(a.callbackQuery?.data||""),d=await bt({platform:"telegram",data:f,grant:{local:!0}});if(!d){await a.answerCallbackQuery().catch(()=>{});return}await a.answerCallbackQuery({text:"ok"}).catch(()=>{}),d.text&&await a.reply(d.text,{parse_mode:"Markdown"}).catch(()=>{})}),r.start(),{platform:"telegram",name:n,bot:r}}var Ut=l(()=>{U();Oe()});var jt={};L(jt,{discord:()=>Cn});async function Cn(t){let{Client:e,GatewayIntentBits:r}=await import("discord.js"),n=new e({intents:[r.Guilds,r.GuildMessages,r.MessageContent,r.DirectMessages]}),o=String(t.name||"oracle").toLowerCase(),i=D(t),s=Array.isArray(t.owners)?t.owners:void 0,a=t.bus;return a&&a.register(o,{role:t.role||"",chains:t.chains||[],handler:u=>G({from:u.from,text:u.text,persona:i,backend:t.backend,profile:t.hermesProfile})}),n.on("messageCreate",async u=>{if(u.author.bot)return;let f=u.channel.id,d=u.author.id,m=u.content;try{let y=!u.guild,b=u.mentions.has(n.user.id);if(!y&&!b)return;u.channel.sendTyping().catch(()=>{});let g=await T({platform:"discord",chatId:f,senderId:d,text:m.replace(`<@${n.user.id}>`,"").trim(),userName:u.author.username,extraOwners:s,bus:a,agentName:o,persona:i,backend:t.backend,profile:t.hermesProfile,meta:{forwarded:u.reference?.type===1||Array.isArray(u.messageSnapshots)&&u.messageSnapshots.length>0}});g&&await u.reply(typeof g=="string"?g:g.text).catch(()=>{})}catch(y){process.stderr.write(`discord-gateway[${o}]: ${y.message}
20
- `)}}),await n.login(t.token),{platform:"discord",name:o,client:n}}var Wt=l(()=>{U()});var Jt={};L(Jt,{whatsapp:()=>_n});import{join as Ht}from"node:path";import{homedir as $n}from"node:os";async function _n(t){let[{Client:e,LocalAuth:r},{generate:n}]=await Promise.all([import("whatsapp-web.js"),import("qrcode-terminal")]),o=new e({authStrategy:new r({dataPath:Ht(Ln,".wwebjs_auth")}),puppeteer:{headless:!0,args:["--no-sandbox"]}});return o.on("qr",i=>{process.stderr.write(`
28
+ `)}`:"No peer agents registered."}}let Br=n.toLowerCase().trim();return/\b(buy|sell|swap|bridge|send|transfer|balance|portfolio|watch|quote|price)\b/.test(Br)?To({platform:t,chatId:e,senderId:r,text:n,userName:o}):Zt({platform:t,chatId:e,senderId:r,text:n,userName:o,persona:d,backend:p,profile:b})}function yr(t,{timeout:e=12e4}={}){return new Promise(r=>{let n=er(process.execPath,[go,...t],{stdio:["ignore","pipe","pipe"],timeout:e,env:{...process.env,ORACLE_CONFIG_DIR:Ve}}),o="",i="";n.stdout.on("data",s=>o+=s.toString()),n.stderr.on("data",s=>i+=s.toString()),n.on("close",s=>r({code:s,out:o.trim(),err:i.trim()}))})}function Io(t,e,{timeout:r=18e4}={}){return new Promise(n=>{let o=er(t,e,{stdio:["ignore","pipe","pipe"],timeout:r,env:{...process.env}}),i="",s="";o.on("error",a=>n({code:127,out:"",err:String(a.message)})),o.stdout.on("data",a=>i+=a.toString()),o.stderr.on("data",a=>s+=a.toString()),o.on("close",a=>n({code:a,out:i.trim(),err:s.trim()}))})}async function To({text:t}){let e=await yr(["route","swap","--text",t],{timeout:3e4});if(e.code===0&&e.out)try{return Co(JSON.parse(e.out))}catch{return e.out}return`Trade routing failed. Try: \`${t}\` again.`}async function Zt({text:t,persona:e,backend:r,profile:n}){let o=e?`[your role: ${e}]
29
+ ${t}`:t;return br({text:o,backend:r,profile:n,unconfiguredPrefix:"Oracle is not configured yet: "})}async function br({text:t,backend:e,profile:r,unconfiguredPrefix:n}){let o=gr(e,t,{profile:r});if(!o.ok)return`${n}${o.error}`;if(!o.bin){let s=ar();if(!s.ok)return`${n}${s.error}`;let a=await yr(o.args);return a.code===0&&a.out?a.out:a.err||"Oracle could not answer that. Try again."}let i=await Io(o.bin,o.args);return i.code===0&&i.out?i.out:/ENOENT/.test(i.err)?`${n}backend '${o.bin}' is not installed on this machine`:i.err||`${o.bin} could not answer that. Try again.`}function Co(t){return t.error?`\u274C ${t.error}`:t.tx?`\u2705 Trade prepared: \`${t.tx.slice(0,20)}...\`
30
+ Sign and broadcast from your own wallet.`:t.quote?`\u{1F4B1} ${t.quote}`:t.portfolio?`\u{1F4CA} ${t.portfolio}`:JSON.stringify(t,null,2)}var Ve,go,j,sr,yo,W=l(()=>{it();De();Ht();He();Xt();Ve=process.env.ORACLE_CONFIG_DIR||ze(lo(),".config","oracle");go=tr();j="Oracle is self-hostable. Install your own instance: npm install -g @oracle-agent/oracle";sr=Object.freeze({claude:{provider:"anthropic-oauth",model:"claude-sonnet-4-20250514"},anthropic:{provider:"anthropic",model:"claude-sonnet-4-6"},codex:{provider:"openai-codex",model:"gpt-5.4"},openai:{provider:"openai",model:"gpt-4.1-mini"},grok:{provider:"xai-oauth",model:"grok-4.6"},xai:{provider:"xai",model:"grok-4.6"},openrouter:{provider:"openrouter",model:"openrouter/auto"},nous:{provider:"nous",model:"moonshotai/kimi-k3"},deepseek:{provider:"deepseek",model:"deepseek-chat"},gemini:{provider:"gemini",model:"gemini-2.5-flash"},kimi:{provider:"kimi",model:"kimi-k3"},mistral:{provider:"mistral",model:"mistral-large-latest"},qwen:{provider:"qwen",model:"qwen-plus"},glm:{provider:"glm",model:"glm-4.5"}}),yo=Object.freeze(["low","medium","high"])});var Sr={};_(Sr,{buildPersona:()=>H,telegram:()=>Oo});function xr(t,e){if(!e)return;if(typeof e=="string")return t.reply(e,{parse_mode:"Markdown"});let r=e.replyMarkup?{reply_markup:e.replyMarkup}:{};return t.reply(e.text,{parse_mode:"Markdown",...r})}async function Oo(t){let{Bot:e}=await import("grammy"),r=new e(t.token),n=String(t.name||"oracle").toLowerCase(),o=H(t),i=Array.isArray(t.owners)?t.owners:void 0,s=t.bus;return s&&s.register(n,{role:t.role||"",chains:t.chains||[],handler:a=>Q({from:a.from,text:a.text,persona:o,backend:t.backend,profile:t.hermesProfile})}),r.command("start",a=>{let u=String(a.from?.id||a.chat.id);return U({platform:"telegram",senderId:u,extraOwners:i})?a.reply(`${n} ready. /help lists every native command. /model lists models. /setup model adds OpenRouter, Nous Portal, Qwen, GLM. /effort sets reasoning. /update installs latest.${s?" /agents lists peers.":""}`):a.reply(j)}),r.command("update",async a=>{let u=String(a.from?.id||a.chat.id),f=String(a.chat.id);if(!U({platform:"telegram",senderId:u,extraOwners:i}))return a.reply(j);if(a.message.forward_origin||a.message.forward_from||a.message.forward_date)return;a.replyWithChatAction("typing").catch(()=>{});let d=await C({platform:"telegram",chatId:f,senderId:u,text:a.match?`update ${a.match}`.trim():"update",userName:a.from?.username||a.from?.first_name||"user"});if(d)return xr(a,d)}),r.on("message:text",async a=>{let u=String(a.chat.id),f=String(a.from?.id||u),d=a.message.text;try{a.replyWithChatAction("typing").catch(()=>{});let p=await C({platform:"telegram",chatId:u,senderId:f,text:d,userName:a.from?.username||a.from?.first_name||"user",extraOwners:i,bus:s,agentName:n,persona:o,backend:t.backend,profile:t.hermesProfile,meta:{forward_origin:a.message.forward_origin,forward_from:a.message.forward_from,forward_from_chat:a.message.forward_from_chat,forward_sender_name:a.message.forward_sender_name,forward_date:a.message.forward_date}});p&&await xr(a,p)}catch(p){process.stderr.write(`telegram-gateway[${n}]: ${p.message}
31
+ `),await a.reply("Something went wrong. Try again.").catch(()=>{})}}),r.on("callback_query:data",async a=>{let u=String(a.from?.id||"");if(!U({platform:"telegram",senderId:u,extraOwners:i})){await a.answerCallbackQuery({text:j.slice(0,180),show_alert:!0}).catch(()=>{});return}let f=String(a.callbackQuery?.data||""),d=await Ft({platform:"telegram",data:f,grant:{local:!0}});if(!d){await a.answerCallbackQuery().catch(()=>{});return}await a.answerCallbackQuery({text:"ok"}).catch(()=>{}),d.text&&await a.reply(d.text,{parse_mode:"Markdown"}).catch(()=>{})}),r.start(),{platform:"telegram",name:n,bot:r}}var Ar=l(()=>{W();De()});var vr={};_(vr,{discord:()=>No});async function No(t){let{Client:e,GatewayIntentBits:r}=await import("discord.js"),n=new e({intents:[r.Guilds,r.GuildMessages,r.MessageContent,r.DirectMessages]}),o=String(t.name||"oracle").toLowerCase(),i=H(t),s=Array.isArray(t.owners)?t.owners:void 0,a=t.bus;return a&&a.register(o,{role:t.role||"",chains:t.chains||[],handler:u=>Q({from:u.from,text:u.text,persona:i,backend:t.backend,profile:t.hermesProfile})}),n.on("messageCreate",async u=>{if(u.author.bot)return;let f=u.channel.id,d=u.author.id,p=u.content;try{let b=!u.guild,E=u.mentions.has(n.user.id);if(!b&&!E)return;u.channel.sendTyping().catch(()=>{});let w=await C({platform:"discord",chatId:f,senderId:d,text:p.replace(`<@${n.user.id}>`,"").trim(),userName:u.author.username,extraOwners:s,bus:a,agentName:o,persona:i,backend:t.backend,profile:t.hermesProfile,meta:{forwarded:u.reference?.type===1||Array.isArray(u.messageSnapshots)&&u.messageSnapshots.length>0}});w&&await u.reply(typeof w=="string"?w:w.text).catch(()=>{})}catch(b){process.stderr.write(`discord-gateway[${o}]: ${b.message}
32
+ `)}}),await n.login(t.token),{platform:"discord",name:o,client:n}}var kr=l(()=>{W()});var Tr={};_(Tr,{whatsapp:()=>_o});import{join as Ir}from"node:path";import{homedir as $o}from"node:os";async function _o(t){let[{Client:e,LocalAuth:r},{generate:n}]=await Promise.all([import("whatsapp-web.js"),import("qrcode-terminal")]),o=new e({authStrategy:new r({dataPath:Ir(Lo,".wwebjs_auth")}),puppeteer:{headless:!0,args:["--no-sandbox"]}});return o.on("qr",i=>{process.stderr.write(`
21
33
  WhatsApp: scan this QR code in WhatsApp \u2192 Linked Devices:
22
34
 
23
35
  `),n(i,{small:!0}),process.stderr.write(`
24
36
  `)}),o.on("ready",()=>{process.stderr.write(`whatsapp-gateway: connected
25
- `)}),o.on("message",async i=>{if(i.fromMe)return;let s=i.from,a=i.author||i.from,u=i.body;try{let f=await T({platform:"whatsapp",chatId:s,senderId:a,text:u,userName:i._data?.notifyName||"user",meta:{forwarded:i.isForwarded||i._data?.isForwarded,forward_date:i._data?.forwardingScore?!0:void 0}});if(f){let m=(typeof f=="string"?f:f.text).replace(/\*\*/g,"*").replace(/```[\s\S]*?```/g,"[code]").replace(/`/g,"");await i.reply(m)}}catch(f){process.stderr.write(`whatsapp-gateway: ${f.message}
26
- `)}}),await o.initialize(),{platform:"whatsapp",client:o}}var Ln,Gt=l(()=>{U();Ln=process.env.ORACLE_CONFIG_DIR||Ht($n(),".config","oracle")});var zt={};L(zt,{signal_:()=>Rn});async function Rn(t){return process.stderr.write(`signal-gateway: requires signal-cli binary
37
+ `)}),o.on("message",async i=>{if(i.fromMe)return;let s=i.from,a=i.author||i.from,u=i.body;try{let f=await C({platform:"whatsapp",chatId:s,senderId:a,text:u,userName:i._data?.notifyName||"user",meta:{forwarded:i.isForwarded||i._data?.isForwarded,forward_date:i._data?.forwardingScore?!0:void 0}});if(f){let p=(typeof f=="string"?f:f.text).replace(/\*\*/g,"*").replace(/```[\s\S]*?```/g,"[code]").replace(/`/g,"");await i.reply(p)}}catch(f){process.stderr.write(`whatsapp-gateway: ${f.message}
38
+ `)}}),await o.initialize(),{platform:"whatsapp",client:o}}var Lo,Cr=l(()=>{W();Lo=process.env.ORACLE_CONFIG_DIR||Ir($o(),".config","oracle")});var Or={};_(Or,{signal_:()=>Ro});async function Ro(t){return process.stderr.write(`signal-gateway: requires signal-cli binary
27
39
  `),process.stderr.write(`signal-gateway: not built yet \u2014 use Telegram or Discord for now
28
- `),{platform:"signal",status:"stub"}}var Vt=l(()=>{U()});import{createServer as Pn}from"node:http";import{env as Xt}from"node:process";import{join as _e}from"node:path";import{homedir as Bn}from"node:os";import{readFileSync as Qt,existsSync as Fn,mkdirSync as Mn,writeFileSync as qn}from"node:fs";import{randomBytes as Dn}from"node:crypto";var Zt=Xt.ORACLE_CONFIG_DIR||_e(Bn(),".config","oracle"),Kt=_e(Zt,"gateway.json");function Un(){return Fn(Kt)?JSON.parse(Qt(Kt,"utf8")):{platforms:{}}}function $e(t){return t?Array.isArray(t)?t.filter(Boolean):[t]:[]}var jn=Object.freeze({telegram:"grammy",discord:"discord.js",whatsapp:"whatsapp-web.js"});async function te(t,e,r,n){try{n.push(await e(r))}catch(o){let i=jn[t];if(i&&/Cannot find (module|package)|ERR_MODULE_NOT_FOUND/.test(String(o.message))){process.stderr.write(`oracle-gateway: ${t} needs an optional dependency. Install it first:
40
+ `),{platform:"signal",status:"stub"}}var Nr=l(()=>{W()});import{createServer as Po}from"node:http";import{env as _r}from"node:process";import{join as Qe}from"node:path";import{homedir as Bo}from"node:os";import{readFileSync as Rr,existsSync as Fo,mkdirSync as Mo,writeFileSync as qo}from"node:fs";import{randomBytes as Do}from"node:crypto";var Pr=_r.ORACLE_CONFIG_DIR||Qe(Bo(),".config","oracle"),$r=Qe(Pr,"gateway.json");function Uo(){return Fo($r)?JSON.parse(Rr($r,"utf8")):{platforms:{}}}function Ye(t){return t?Array.isArray(t)?t.filter(Boolean):[t]:[]}var jo=Object.freeze({telegram:"grammy",discord:"discord.js",whatsapp:"whatsapp-web.js"});async function le(t,e,r,n){try{n.push(await e(r))}catch(o){let i=jo[t];if(i&&/Cannot find (module|package)|ERR_MODULE_NOT_FOUND/.test(String(o.message))){process.stderr.write(`oracle-gateway: ${t} needs an optional dependency. Install it first:
29
41
  npm install -g ${i}
30
42
  `);return}process.stderr.write(`oracle-gateway: ${t} failed to start: ${o.message}
31
- `)}}async function Wn(){let t=Un(),e=[],r=$e(t.platforms?.telegram),n=$e(t.platforms?.discord),o=$e(t.agents),s=r.length+n.length+o.length>1?new(await Promise.resolve().then(()=>(Pe(),Re))).A2ABus:null;if(s&&o.length){let{routePeerConsult:u,buildPersona:f}=await Promise.resolve().then(()=>(U(),Mt));for(let d of o)try{let m=f(d);s.register(d.name,{role:d.role||"",chains:d.chains||[],handler:y=>u({from:y.from,text:y.text,persona:m,backend:d.backend,profile:d.hermesProfile})}),process.stderr.write(`oracle-gateway: headless agent '${d.name}' on bus (backend: ${d.backend||"oracle"})
32
- `)}catch(m){process.stderr.write(`oracle-gateway: headless agent '${d.name||"?"}' skipped: ${m.message}
33
- `)}}for(let u of r)await te("telegram",async()=>(await Promise.resolve().then(()=>(Ut(),Dt))).telegram({...u,bus:s}),t,e);for(let u of n)await te("discord",async()=>(await Promise.resolve().then(()=>(Wt(),jt))).discord({...u,bus:s}),t,e);t.platforms?.whatsapp&&await te("whatsapp",async u=>(await Promise.resolve().then(()=>(Gt(),Jt))).whatsapp(u.platforms.whatsapp),t,e),t.platforms?.signal&&await te("signal",async u=>(await Promise.resolve().then(()=>(Vt(),zt))).signal_(u.platforms.signal),t,e),e.length===0&&process.stderr.write(`oracle-gateway: no platforms configured. Run 'oracle setup telegram' first.
43
+ `)}}async function Ho(){let t=Uo(),e=[],r=Ye(t.platforms?.telegram),n=Ye(t.platforms?.discord),o=Ye(t.agents),s=r.length+n.length+o.length>1?new(await Promise.resolve().then(()=>(et(),Ze))).A2ABus:null;if(s&&o.length){let{routePeerConsult:u,buildPersona:f}=await Promise.resolve().then(()=>(W(),Er));for(let d of o)try{let p=f(d);s.register(d.name,{role:d.role||"",chains:d.chains||[],handler:b=>u({from:b.from,text:b.text,persona:p,backend:d.backend,profile:d.hermesProfile})}),process.stderr.write(`oracle-gateway: headless agent '${d.name}' on bus (backend: ${d.backend||"oracle"})
44
+ `)}catch(p){process.stderr.write(`oracle-gateway: headless agent '${d.name||"?"}' skipped: ${p.message}
45
+ `)}}for(let u of r)await le("telegram",async()=>(await Promise.resolve().then(()=>(Ar(),Sr))).telegram({...u,bus:s}),t,e);for(let u of n)await le("discord",async()=>(await Promise.resolve().then(()=>(kr(),vr))).discord({...u,bus:s}),t,e);t.platforms?.whatsapp&&await le("whatsapp",async u=>(await Promise.resolve().then(()=>(Cr(),Tr))).whatsapp(u.platforms.whatsapp),t,e),t.platforms?.signal&&await le("signal",async u=>(await Promise.resolve().then(()=>(Nr(),Or))).signal_(u.platforms.signal),t,e),e.length===0&&process.stderr.write(`oracle-gateway: no platforms configured. Run 'oracle setup telegram' first.
34
46
  `),process.stderr.write(`oracle-gateway: ${e.length} platform(s) connected
35
- `);let a=s?zn():null;Pn((u,f)=>Jn(u,f,{config:t,bus:s,a2aToken:a})).listen(Xt.ORACLE_GATEWAY_PORT||9270,"127.0.0.1"),s&&process.stderr.write(`oracle-gateway: a2a loopback contract at GET /a2a (token: a2a-token in config dir)
36
- `)}var Hn=16384;async function Jn(t,e,{config:r,bus:n,a2aToken:o}){let i=new URL(t.url||"/","http://127.0.0.1"),s=(u,f)=>{e.writeHead(u,{"Content-Type":"application/json"}),e.end(JSON.stringify(f))};if(t.method==="GET"&&(i.pathname==="/"||i.pathname==="/health"))return s(200,{status:"ok",platforms:Object.keys(r.platforms||{}),a2a:!!n});if(!i.pathname.startsWith("/a2a"))return s(404,{error:"not found"});if(!n)return s(404,{error:"a2a bus not running (fewer than 2 agents configured)"});if(t.method==="GET"&&i.pathname==="/a2a")return s(200,{contract:"oracle-a2a/1",auth:"Authorization: Bearer <contents of a2a-token in the oracle config dir>",endpoints:["GET /a2a","GET /a2a/agents","POST /a2a/ask {to,text,from?}"],note:"consult-only; loopback-only; peers answer with information, never actions"});let a=String(t.headers.authorization||"");if(!o||a!==`Bearer ${o}`)return s(401,{error:"bad or missing bearer token (read a2a-token in the oracle config dir)"});if(t.method==="GET"&&i.pathname==="/a2a/agents")return s(200,{agents:n.roster()});if(t.method==="POST"&&i.pathname==="/a2a/ask"){let u="";t.on("data",f=>{u+=f,u.length>Hn&&t.destroy()}),t.on("end",async()=>{try{let f=JSON.parse(u||"{}"),d=Gn(f.from);n.agents.has(d)||n.register(d,{role:"loopback client",handler:async()=>null});let m=await n.send({from:d,to:f.to,text:f.text,kind:"consult"});return s(m.ok?200:400,m)}catch(f){return s(400,{ok:!1,error:`bad request: ${f.message}`})}});return}return s(404,{error:"not found"})}function Gn(t){return String(t||"local").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"").slice(0,32)||"local"}function zn(t=Zt){let e=_e(t,"a2a-token");try{let n=Qt(e,"utf8").trim();if(n)return n}catch{}let r=Dn(24).toString("hex");return Mn(t,{recursive:!0}),qn(e,`${r}
37
- `,{mode:384}),r}var{pathToFileURL:Vn}=await import("node:url"),{realpathSync:Kn}=await import("node:fs"),Yt=process.argv[1],Le=!1;if(Yt)try{Le=import.meta.url===Vn(Kn(Yt)).href}catch{Le=!1}Le&&Wn().catch(t=>{process.stderr.write(`oracle-gateway: ${t.message}
38
- `),process.exit(1)});export{zn as ensureA2AToken,Jn as serveHttp,$e as toEntries};
47
+ `);let a=s?zo():null;Po((u,f)=>Jo(u,f,{config:t,bus:s,a2aToken:a})).listen(_r.ORACLE_GATEWAY_PORT||9270,"127.0.0.1"),s&&process.stderr.write(`oracle-gateway: a2a loopback contract at GET /a2a (token: a2a-token in config dir)
48
+ `)}var Wo=16384;async function Jo(t,e,{config:r,bus:n,a2aToken:o}){let i=new URL(t.url||"/","http://127.0.0.1"),s=(u,f)=>{e.writeHead(u,{"Content-Type":"application/json"}),e.end(JSON.stringify(f))};if(t.method==="GET"&&(i.pathname==="/"||i.pathname==="/health"))return s(200,{status:"ok",platforms:Object.keys(r.platforms||{}),a2a:!!n});if(!i.pathname.startsWith("/a2a"))return s(404,{error:"not found"});if(!n)return s(404,{error:"a2a bus not running (fewer than 2 agents configured)"});if(t.method==="GET"&&i.pathname==="/a2a")return s(200,{contract:"oracle-a2a/1",auth:"Authorization: Bearer <contents of a2a-token in the oracle config dir>",endpoints:["GET /a2a","GET /a2a/agents","POST /a2a/ask {to,text,from?}"],note:"consult-only; loopback-only; peers answer with information, never actions"});let a=String(t.headers.authorization||"");if(!o||a!==`Bearer ${o}`)return s(401,{error:"bad or missing bearer token (read a2a-token in the oracle config dir)"});if(t.method==="GET"&&i.pathname==="/a2a/agents")return s(200,{agents:n.roster()});if(t.method==="POST"&&i.pathname==="/a2a/ask"){let u="";t.on("data",f=>{u+=f,u.length>Wo&&t.destroy()}),t.on("end",async()=>{try{let f=JSON.parse(u||"{}"),d=Go(f.from);n.agents.has(d)||n.register(d,{role:"loopback client",handler:async()=>null});let p=await n.send({from:d,to:f.to,text:f.text,kind:"consult"});return s(p.ok?200:400,p)}catch(f){return s(400,{ok:!1,error:`bad request: ${f.message}`})}});return}return s(404,{error:"not found"})}function Go(t){return String(t||"local").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"").slice(0,32)||"local"}function zo(t=Pr){let e=Qe(t,"a2a-token");try{let n=Rr(e,"utf8").trim();if(n)return n}catch{}let r=Do(24).toString("hex");return Mo(t,{recursive:!0}),qo(e,`${r}
49
+ `,{mode:384}),r}var{pathToFileURL:Vo}=await import("node:url"),{realpathSync:Ko}=await import("node:fs"),Lr=process.argv[1],Xe=!1;if(Lr)try{Xe=import.meta.url===Vo(Ko(Lr)).href}catch{Xe=!1}Xe&&Ho().catch(t=>{process.stderr.write(`oracle-gateway: ${t.message}
50
+ `),process.exit(1)});export{zo as ensureA2AToken,Jo as serveHttp,Ye as toEntries};