@oracle-agent/oracle 0.35.9 → 0.35.10

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.
@@ -1,8 +1,11 @@
1
- var Wt=Object.defineProperty;var o=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};var Me=(e,r)=>{for(var t in r)Wt(e,t,{get:r[t],enumerable:!0})};import G from"node:fs";import Gt from"node:os";import N from"node:path";import{fileURLToPath as Jt}from"node:url";function ae(){return process.env.ORACLE_FAKE_HOME||Gt.homedir()}function Kt(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function R(){return Kt()?process.env.ORACLE_CONFIG_DIR||N.join(ae(),".config","oracle"):N.join(ae(),".config","oracle")}function Yt(){return N.join(R(),"desk.json")}function Xt(){return N.join(R(),"env")}function C({force:e=!1}={}){if(C._done&&!e)return C._result||null;C._done=!0;let r={},t=(i,s)=>{if(s==null)return;let a=String(s).trim();a&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=a,r[i]=a))};try{let i=Xt();if(G.existsSync(i))for(let s of G.readFileSync(i,"utf8").split(/\r?\n/)){let a=s.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let u=a[2];(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),t(a[1],u)}}catch{}try{let i=Yt();if(G.existsSync(i)){let s=JSON.parse(G.readFileSync(i,"utf8"));s&&typeof s=="object"&&(t("ORACLE_DESK_URL",s.deskUrl||s.dataUrl||s.url),t("ORACLE_DATA_URL",s.dataUrl||s.deskUrl||s.url),t("ORACLE_API_URL",s.apiUrl||s.dataUrl||s.deskUrl),t("ORACLE_PUBLIC_URL",s.publicUrl||s.deskUrl||s.dataUrl),t("ORACLE_EXEC_URL",s.execUrl),t("MAD_DESK_URL",s.deskUrl||s.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(t("ORACLE_DESK_URL",n),t("ORACLE_DATA_URL",n),t("ORACLE_API_URL",n),t("ORACLE_PUBLIC_URL",n),t("MAD_DESK_URL",n)),C._result=Object.keys(r).length?r:null,C._result}var Vt,l,J=o(()=>{Vt=N.dirname(Jt(import.meta.url)),l=N.resolve(Vt,"../..");try{C()}catch{}});var me,Yn,Ve=o(()=>{me={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}},Yn=new Map(Object.values(me).map(e=>[e.chainId,e]))});function j(e){let r=e?.transactionHash||e?.hash||e?.txid||null;return r?{happened:!0,hash:String(r),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var he=o(()=>{});var Ke=o(()=>{});var Ye=o(()=>{});var U=o(()=>{});var $=o(()=>{});var Y=o(()=>{U();$()});import{isAddress as ao}from"ethers";var ge=o(()=>{Y();U();$()});import{Interface as Ar,isAddress as mo}from"ethers";var yo,Xe=o(()=>{ge();U();$();yo=new Ar(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as vr,isAddress as xo}from"ethers";var ko,Io,Qe=o(()=>{ge();U();$();ko=new vr(["function approve(address spender,uint256 amount) returns (bool)"]),Io=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var _=o(()=>{});import{Interface as kr,MaxUint256 as Lo,isAddress as Po,keccak256 as $o,toUtf8Bytes as Bo}from"ethers";var Uo,B=o(()=>{Ye();Xe();Qe();_();$();Uo=new kr(["function approve(address spender,uint256 amount) returns (bool)"])});var Ho,Wo,X=o(()=>{Ho=300*1e3,Wo=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var Z=o(()=>{B()});import{Address as Yo,NETWORK as Xo,OutScript as Qo,RawTx as Zo,SigHash as ei,TEST_NETWORK as ti,Transaction as ri}from"@scure/btc-signer";var be=o(()=>{});import{createHash as Ir}from"node:crypto";import{base58 as si}from"@scure/base";import{getCompiledTransactionMessageDecoder as ci}from"@solana/transaction-messages";var et,ui,Ee=o(()=>{et=e=>Ir("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),ui=new Map([[et("route"),{name:"route",prefixBytes:0}],[et("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var tt=o(()=>{});var gi,xe=o(()=>{tt();gi=64*1024});var rt=o(()=>{xe()});var nt=o(()=>{rt()});var Oi,_i,Ae=o(()=>{_();nt();Oi=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"}),_i=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 Ri,ve=o(()=>{_();Ri="0x"+"00".repeat(32)});var Or,Di,ke=o(()=>{ve();_();Or=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Di=Object.freeze(Or.map(e=>e[0]))});var ee=o(()=>{_()});import{TypedDataEncoder as Ui,getAddress as zi,isAddress as Hi}from"ethers";var Cr,Nr,at=o(()=>{X();Cr=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Nr=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]})});var Ji,ct=o(()=>{Ji=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var ut=o(()=>{});import{TypedDataEncoder as ts,getAddress as rs,isAddress as ns}from"ethers";var Rr,ls,Lr,ds,lt=o(()=>{xe();Y();ct();ut();X();Rr=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),ls=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Lr=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),ds=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{TypedDataEncoder as ms,getAddress as hs}from"ethers";var ys,Ie=o(()=>{at();lt();ys=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"])});import{Interface as ft}from"ethers";var Fr,$s,qr,Bs,Ds,Ms,Fs,jr,qs,te=o(()=>{B();Y();X();Z();be();Ee();Ae();ke();ee();Ie();Fr=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]),$s=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),qr=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"}}),Bs=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Ds=new ft(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Ms=new ft(["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"]),Fs=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"}}),jr=Object.freeze([...Fr]),qs=Object.freeze({...qr})});import{encode as zs}from"@msgpack/msgpack";import{keccak256 as Ws,verifyTypedData as Gs}from"ethers";var Js,Vs,Te=o(()=>{Js=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Vs=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Oe=o(()=>{ee()});import{ed25519 as ra}from"@noble/curves/ed25519.js";import{base58 as oa}from"@scure/base";import{RawTx as sa,SigHash as aa,Transaction as ca}from"@scure/btc-signer";import{Transaction as la,keccak256 as da,verifyTypedData as fa}from"ethers";var _e=o(()=>{Te();Oe()});import{base58 as ba}from"@scure/base";var re=o(()=>{te();Z();B();_e()});var mt=o(()=>{re();te()});var Na,Ra,La,D=o(()=>{Na=Object.freeze({N:1<<17,r:8,p:1}),Ra=256*1024*1024,La=16*1024});var $a,ht=o(()=>{$a=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 Ce}from"node:os";import{join as Ne}from"node:path";var wt,Hr,Fa,gt=o(()=>{wt=process.env.ORACLE_PUBLIC_DESKTOP==="1",Hr=wt?process.env.ORACLE_CONFIG_DIR||Ne(Ce(),".config","oracle"):Ne(Ce(),".config","oracle"),Fa=wt?Hr:Ne(Ce(),".config","mad-desk")});var Ha,Wa,Ga,yt=o(()=>{gt();Ha="0".repeat(64),Wa=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"}),Ga=Promise.resolve()});var Re=o(()=>{yt();_();D();re()});var Et=o(()=>{});var xt=o(()=>{});var St=o(()=>{xt();B()});import{Wallet as ac}from"ethers";import{base58 as uc}from"@scure/base";import{ed25519 as dc}from"@noble/curves/ed25519.js";import{NETWORK as pc,TEST_NETWORK as mc,WIF as hc,p2wpkh as wc}from"@scure/btc-signer";import{pubECDSA as yc}from"@scure/btc-signer/utils.js";var At=o(()=>{});var xc,Sc,Ac,vc,kc,Ic,Tc,Oc,_c,Cc,Nc,vt=o(()=>{Re();xc=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),Sc=Object.freeze(["binance","bybit","okx","coinbase"]),Ac=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),vc=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),kc=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),Ic=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),Tc=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Oc=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),_c=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),Cc=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Nc=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"})});var kt=o(()=>{D()});var Jr,It,oe=o(()=>{Jr=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),It=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"})});var Tt=o(()=>{oe()});var jc,Ot=o(()=>{oe();Tt();jc=256*1024});var _t=o(()=>{oe();Ot()});var Ct=o(()=>{D()});import w from"node:path";import Vr from"node:os";import{createHash as Kr,randomBytes as Nu}from"node:crypto";import{Interface as Le,keccak256 as Lu}from"ethers";import{Transaction as $u}from"@scure/btc-signer";import{ed25519 as Du}from"@noble/curves/ed25519.js";function Nt(e){let r=process.env.ORACLE_SIGNER_STATE_DIR||w.join(process.env.XDG_STATE_HOME||w.join(Vr.homedir(),".local","state"),"oracle"),t=Kr("sha256").update(w.resolve(e)).digest("hex").slice(0,16);return{vault:w.join(e,"vault.json"),policy:w.join(e,"signer-policy.json"),policyKey:w.join(e,"policy-integrity-key"),policyAnchor:w.join(r,`signer-policy-${t}.high-water`),ledger:w.join(e,"signer-ledger.json"),ledgerAnchor:w.join(r,`signer-ledger-${t}.high-water`),cexOrders:w.join(e,"cex-orders.json"),cexOrdersAnchor:w.join(r,`cex-orders-${t}.high-water`),token:w.join(e,"signer-token"),lock:w.join(r,`signer-${t}.lock`)}}var dl,fl,pl,Rt=o(()=>{mt();re();D();ht();Re();Et();B();St();te();Z();_e();Ae();ke();ee();Oe();ve();Te();be();Ee();Ie();At();vt();kt();_t();Ct();dl=new Le(["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"]),fl=new Le(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),pl=new Le(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});import Pe from"node:fs";import Lt from"node:path";import{homedir as Yr}from"node:os";function Xr(){return process.env.ORACLE_CONFIG_DIR||Lt.join(Yr(),".config","oracle")}function z(){let e=Nt(Lt.join(Xr(),"signer")),r=Pe.existsSync(e.vault),t=Pe.existsSync(e.lock),n=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:Pe.existsSync(e.policy),armed:r&&!t,disarmed:t,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var vl,$e=o(()=>{he();Ke();Rt();D();vl=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}])});function ie(e){return String(e||"").trim()||void 0}function Zr(e,{required:r=!1}={}){let t=ie(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!Qr.has(t))throw new Error(`unsupported provider: ${t}`);return t}function en(e,{required:r=!1}={}){let t=ie(e);if(!t){if(r)throw new Error("model is required");return}if(t.includes("..")||t.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(t))throw new Error("invalid model id");return t}function tn(e){let r=ie(e);if(!r||r.length>2048)throw new Error("invalid custom base URL");let t;try{t=new URL(r)}catch{throw new Error("invalid custom base URL")}let n=t.hostname.toLowerCase().replace(/^\[|\]$/g,""),i=n==="localhost"||n==="127.0.0.1"||n==="::1";if(t.protocol!=="https:"&&!(t.protocol==="http:"&&i)||t.username||t.password||t.search||t.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return t.toString().replace(/\/+$/,"")}function Pt({provider:e,model:r,baseUrl:t}={},{requireModel:n=!1}={}){let i=Zr(e),s=en(r,{required:n});if(i==="custom")return{provider:i,...s?{model:s}:{},baseUrl:tn(t)};if(ie(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...s?{model:s}:{}}}var Qr,$t=o(()=>{Qr=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"])});import Bt from"node:fs";import rn from"node:path";function on(){return rn.join(R(),"model.json")}function M(e){return String(e||"").trim()||void 0}function sn(e={}){let r=M(e.backend)?.toLowerCase()||"auto",t=Pt({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),n=M(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),s=M(e.reasoningEffort),a=M(e.computeHost||e.remoteHost),u=M(e.computeUser||e.remoteUser),f=M(e.computePath||e.remotePath);if(!nn.has(r))throw new Error(`unsupported backend: ${r}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(r))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(r==="remote"&&!a)throw new Error("remote backend requires computeHost");return{backend:r,...t,...n?{apiKeyEnv:n}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...s?{reasoningEffort:s}:{},...a?{computeHost:a}:{},...u?{computeUser:u}:{},...f?{computePath:f}:{}}}function Dt(){let e=on();if(!Bt.existsSync(e))return null;try{return sn(JSON.parse(Bt.readFileSync(e,"utf8")))}catch{return null}}var nn,Mt=o(()=>{J();$t();nn=new Set(["auto","standalone","hermes","remote","arch"])});var Ft={};Me(Ft,{classifyReceipt:()=>j,configDir:()=>ln,firstHourReport:()=>Be,venueMap:()=>se});import an from"node:path";import{homedir as cn}from"node:os";function ln(e=process.env){return e.ORACLE_CONFIG_DIR||an.join(cn(),".config","oracle")}function se({env:e=process.env,vault:r=null}={}){let t=r||z(),n=[];for(let[i,s]of Object.entries(me)){let a=(s.rpcEnv||[]).some(f=>String(e[f]||"").trim()),u="prepare";s.evm?a&&(u="live"):u="unavailable",n.push({key:i,chainId:s.chainId,name:s.name,family:"evm",status:u,execute:!!(t.vaultExists&&t.armed&&!t.disarmed),note:a?"rpc configured":"public read/prepare; set RPC for live reads"})}return n.push({key:"solana",chainId:null,name:"Solana",family:"sol",status:"prepare",execute:!1,note:"Jupiter quote/prepare; local sol signer"},{key:"bitcoin",chainId:null,name:"Bitcoin",family:"btc",status:"prepare",execute:!1,note:"Esplora read; local btc signer"},{key:"hyperliquid-l1",chainId:null,name:"Hyperliquid L1",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not an EVM signer family"},{key:"polymarket",chainId:null,name:"Polymarket",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not a signer family"}),n}function Be({env:e=process.env,model:r=Dt(),vault:t=z(),signerReachable:n=!1,quote:i=null}={}){let s=[],a=(p,g,T,S=null)=>s.push({id:p,status:g,detail:T,fix:S}),u=(()=>{let[p,g]=process.versions.node.split(".").map(Number);return p>20||p===20&&g>=19})();a("node",u?"ok":"fail",`node ${process.versions.node}`,u?null:"install node >= 20.19"),r?r.backend==="hermes"?a("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):a("model","ok",`${r.backend||"auto"} ${r.provider||""} ${r.model||""}`.trim()):a("model","fail","no model.json","oracle setup model"),t.vaultExists?t.disarmed?a("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):a("vault",t.armed?"ok":"warn",t.armed?"present, armed":"present, not armed"):a("vault","fail","no local vault","oracle sign init");let f=e.ORACLE_SIGNER_HOST||"127.0.0.1";return un.has(f)?a("signer",n?"ok":"warn",n?`loopback ${f}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",n?null:"oracle signer"):a("signer","fail",`signer host ${f} is not loopback`,"unset ORACLE_SIGNER_HOST"),i?i.ok?a("quote","ok",i.detail||"net quote returned"):a("quote","warn",i.detail||"quote unavailable","check network / oracle data serve"):a("quote","warn","quote not probed",null),{ok:!s.some(p=>p.status==="fail"),checks:s,venues:se({env:e,vault:t})}}var un,De=o(()=>{Ve();$e();Mt();he();un=new Set(["127.0.0.1","::1","localhost"])});var qt={};Me(qt,{classifyReceipt:()=>j,default:()=>pn,firstHourReport:()=>Be,probeQuote:()=>fn,probeSigner:()=>dn,vaultStatus:()=>z});async function dn(e=process.env){let r=e.ORACLE_SIGNER_HOST||"127.0.0.1",t=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${r}:${t}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function fn(){try{let e=await fetch("https://api.dexscreener.com/latest/dex/search?q=WETH%20USDC",{signal:AbortSignal.timeout(4e3)});if(!e.ok)return{ok:!1,detail:`dexscreener ${e.status}`};let t=(await e.json())?.pairs?.[0];return!t?.chainId||!t?.priceUsd?{ok:!1,detail:"no pair"}:{ok:!0,detail:`${t.chainId} ${t.baseToken?.symbol}/${t.quoteToken?.symbol} $${t.priceUsd}`}}catch(e){return{ok:!1,detail:e instanceof Error?e.message:"quote failed"}}}var pn,jt=o(()=>{De();$e();pn={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let r=e.argv.includes("--json"),t=se();if(r)return process.stdout.write(`${JSON.stringify({venues:t},null,2)}
2
- `),0;for(let n of t)process.stdout.write(`${n.status.padEnd(12)} ${n.key.padEnd(16)} ${n.name} exec=${n.execute?"local":"no"}
3
- `);return 0}}});import F from"node:fs";import Ut from"node:path";import qe from"node:fs";import L from"node:path";J();var Zt="0.19.0",kn=`hermes-agent==${Zt}`;var Fe="0.12.1",In=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Fe}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Fe}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function er(){return L.join(R(),"runtime")}function tr(){return L.join(er(),"venv")}function rr(e){let r=process.platform==="win32"?"Scripts":"bin",t=process.platform==="win32"?`${e}.exe`:e;return L.join(tr(),r,t)}function nr(){return rr("hermes")}function or(e){let r=process.platform==="win32"&&!L.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let t of(process.env.PATH||"").split(L.delimiter))if(t)for(let n of r){let i=L.join(t,`${e}${n}`);try{if(qe.existsSync(i))return i}catch{}}return null}function je(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=nr();if(qe.existsSync(e))return{ok:!0,bin:e,source:"managed"};let r=or("hermes");return r?{ok:!0,bin:r,source:"path"}:{ok:!1,bin:null,source:null}}import O from"node:fs";import d from"node:path";J();import{existsSync as ze,readFileSync as ir}from"node:fs";import{dirname as Ue,join as ce}from"node:path";import{fileURLToPath as sr}from"node:url";function ar(e){let r=Ue(sr(e));for(let t=0;t<8;t+=1){let n=ce(r,"package.json");if(ze(n))try{let s=JSON.parse(ir(n,"utf8"));if(s&&typeof s.version=="string")return r}catch{}let i=Ue(r);if(i===r)break;r=i}throw new Error(`oracle: could not resolve package root from ${e}`)}function He(e,r){let t=ar(r),n=ce(t,e);return ze(n)?n:ce(t,"dist","assets",e)}var cr=Object.freeze([{id:"oracle",label:"Oracle Native",kind:"oracle",bins:["oracle"],website:!0,detect:!0},{id:"hermes",label:"Hermes Agent",kind:"mcp",bins:["hermes"],mcpTarget:"generic",configKey:"hermes",website:!0,detect:!0},{id:"claude",label:"Claude Code",kind:"mcp",bins:["claude"],mcpTarget:"claude-code",configKey:"claudeCode",website:!0,detect:!0},{id:"claude-desktop",label:"Claude Desktop",kind:"mcp",bins:[],mcpTarget:"claude-desktop",configKey:"claudeDesktop",website:!0,detect:!1},{id:"chatgpt",label:"ChatGPT",kind:"mcp",bins:[],mcpTarget:"chatgpt",configKey:"chatgpt",website:!0,detect:!1},{id:"codex",label:"OpenAI Codex",kind:"mcp",bins:["codex"],mcpTarget:"codex",configKey:"codex",website:!0,detect:!0},{id:"cursor",label:"Cursor",kind:"mcp",bins:["cursor","cursor-agent"],mcpTarget:"cursor",configKey:"cursor",website:!0,detect:!0},{id:"windsurf",label:"Windsurf",kind:"mcp",bins:["windsurf"],mcpTarget:"vscode",configKey:"windsurf",website:!0,detect:!0},{id:"vscode",label:"VS Code / Copilot",kind:"mcp",bins:["code","code-insiders"],mcpTarget:"vscode",configKey:"vscode",website:!0,detect:!0},{id:"openclaw",label:"OpenClaw",kind:"mcp",bins:["openclaw","claw"],mcpTarget:"generic",configKey:"openclaw",website:!0,detect:!0},{id:"perplexity",label:"Perplexity",kind:"mcp",bins:["perplexity","pplx"],mcpTarget:"generic",configKey:"perplexity",website:!0,detect:!0},{id:"manus",label:"Manus",kind:"mcp",bins:["manus"],mcpTarget:"generic",configKey:"manus",website:!0,detect:!0},{id:"prime",label:"Prime Intellect Agent",kind:"mcp",bins:["prime-agent","prime"],mcpTarget:"generic",configKey:"prime",website:!1,detect:!0},{id:"opencode",label:"OpenCode",kind:"mcp",bins:["opencode"],mcpTarget:"generic",configKey:"opencode",website:!1,detect:!0},{id:"aider",label:"Aider",kind:"mcp",bins:["aider"],mcpTarget:"generic",configKey:"aider",website:!1,detect:!0},{id:"continue",label:"Continue",kind:"mcp",bins:["continue"],mcpTarget:"vscode",configKey:"continue",website:!1,detect:!0},{id:"goose",label:"Goose",kind:"mcp",bins:["goose"],mcpTarget:"generic",configKey:"goose",website:!1,detect:!0},{id:"amp",label:"Amp",kind:"mcp",bins:["amp"],mcpTarget:"generic",configKey:"amp",website:!1,detect:!0},{id:"generic",label:"Generic MCP",kind:"mcp",bins:[],mcpTarget:"generic",configKey:"genericMcp",website:!0,detect:!1}]);function We(){return cr.filter(e=>e.website)}var ue=Object.freeze(["long_horizon","recursive_fanout","continual_learn","evidence_first","prepare_only"]);function le(e=process.env){let r=String(e?.ORACLE_RESEARCH_MODE??e?.ORACLE_RLM_MODE??"").trim().toLowerCase();return r==="1"||r==="true"||r==="yes"||r==="on"||r==="research"}var P=Object.freeze(["oracle_cli","memory_add","memory_remove","memory_search","skill_load","skill_create","skill_list","cron_add","cron_list","cron_remove","meta_analyze","web_fetch","web_search","file_read","file_write","mcp_list","mcp_call","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","learn_skill","workspace_artifact","research_artifact","portfolio_analyze","trade_lifecycle","signal_score","vault_status","signer_status","signer_execute","signer_disarm","receipt_report","watch_create","watch_list","portfolio_snapshot","vision_analyze","browser_exec","xurl","knowledge_search"]),ur="deny",Pn=256*1024;var $n=Object.freeze({version:1,source:"default",defaultDecision:ur,allow:P,deny:Object.freeze([])});var lr=Object.freeze(["oracle_cli","memory_search","skill_load","skill_list","web_fetch","web_search","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","research_artifact","portfolio_analyze","trade_lifecycle","signal_score","vault_status","signer_status","receipt_report","watch_list","portfolio_snapshot","vision_analyze","knowledge_search"]),Bn=new Set(lr);var de=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Mn=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),x=(e,r=0,t=1)=>Math.min(t,Math.max(r,e)),b=e=>Number.isFinite(Number(e))?Number(e):null,dr=e=>Math.round(e*1e4)/1e4;function E(e,r,t,n=!0){!n||t===null||!Number.isFinite(t)||e.push({feature:r,value:dr(t)})}function fr(e,r){let t=b(e.repeatBuys??e.repeat_buys??e.buyCount),n=b(e.walletWinRate??e.winRate);E(r,"repeat_buys",t===null?null:x((t-1)/4)*.38),E(r,"wallet_win_rate",n===null?null:(x(n)-.5)*.5)}function pr(e,r){let t=b(e.ageHours??e.poolAgeHours),n=b(e.liquidityUsd??e.liquidity),i=e.liquidityLocked??e.locked;E(r,"pool_age",t===null?null:t<24?-.42:x(t/720)*.12),E(r,"liquidity",n===null?null:(x(Math.log10(Math.max(1,n))/7)-.5)*.28),E(r,"liquidity_lock",i==null?null:i?.12:-.28)}function mr(e,r){let t=b(e.floorChange??e.floorChangePct),n=b(e.sales??e.saleCount);E(r,"floor_change",t===null?null:x(t,-1,1)*.35),E(r,"sales_depth",n===null?null:x(n/50)*.18)}function hr(e,r){let t=b(e.flowImbalance??e.imbalance),n=b(e.fundingRate??e.funding);E(r,"flow_imbalance",t===null?null:x(t,-1,1)*.42),E(r,"funding",n===null?null:-x(n*100,-1,1)*.12)}function wr(e,r){let t=b(e.marketProbability??e.marketPrice??e.probability),n=b(e.fairProbability??e.referenceProbability??e.fairValue);E(r,"probability_mispricing",t===null||n===null?null:x(n-t,-1,1)*.65);let i=b(e.liquidityUsd??e.liquidity);E(r,"market_liquidity",i===null?null:x(Math.log10(Math.max(1,i))/6)*.12)}var Fn=Object.freeze({wallet:fr,pool:pr,nft_floor:mr,hl_flow:hr,prediction_market:wr});function fe(e){try{return O.existsSync(e)}catch{return!1}}function V(e){for(let r of e)if(r&&fe(r))return r;return null}function pe(e){try{return He(e,import.meta.url)}catch{return null}}function gr(){let e=[d.join(l,"dist/data/desk-data.mjs"),d.join(l,"data/desk-data.mjs"),d.join(l,"src/data/desk-data.mjs")];for(let n of e)if(fe(n))try{let s=O.readFileSync(n,"utf8").match(/\bid\s*:\s*["'][a-z0-9-]+["']/gi)||[],a=new Set(s.map(u=>u.toLowerCase()));if(a.size>=20)return{count:a.size,detail:`${a.size} provider ids (bundled desk-data)`}}catch{}let r=[d.join(l,"src/data/providers"),d.join(l,"dist/data/providers"),d.join(l,"data/providers")],t=V(r);if(!t)return{count:0,detail:"providers dir missing"};try{let n=O.readdirSync(t).filter(i=>i.endsWith(".mjs"));return{count:n.length,detail:`${n.length} provider modules`}}catch(n){return{count:0,detail:n instanceof Error?n.message:String(n)}}}function Ge(){let e=V([pe("skills"),d.join(l,"skills"),d.join(l,"dist/assets/skills"),d.join(l,"assets/skills")]);if(!e)return{count:0,trading:[],building:[]};let r=O.readdirSync(e),t=r.filter(i=>/trade|swap|snipe|farm|hyperliquid|poly|best-exec|circuit|meme|token-research|rfq/i.test(i)),n=r.filter(i=>/launch|builder|protocol|nft|dex-launch|token-launch|security|contract/i.test(i));return{count:r.length,trading:t,building:n}}function yr(){let e=V([pe("protocols/templates"),d.join(l,"protocols/templates"),d.join(l,"dist/assets/protocols/templates"),d.join(l,"assets/protocols/templates")]);return e?O.readdirSync(e).filter(t=>!t.startsWith(".")):Ge().building.some(t=>/protocol-builder|dex-launch|token-launch/i.test(t))?["(via skills: protocol-builder / launch packs)"]:[]}function br(){let e=V([pe("profiles"),d.join(l,"profiles"),d.join(l,"dist/assets/profiles"),d.join(l,"assets/profiles")]);return e?O.readdirSync(e,{withFileTypes:!0}).filter(r=>r.isDirectory()&&!r.name.startsWith("_")).map(r=>r.name):[]}function Er(){try{if(P.includes("trade_lifecycle")&&!P.some(r=>/broadcast|wallet_sign/.test(r)))return!0}catch{}let e=[d.join(l,"src/capability-posture.mjs"),d.join(l,"dist/capability-posture.mjs"),d.join(l,"capability-posture.mjs"),d.join(l,"dist/public-control/policy-schema.mjs"),d.join(l,"README.md"),d.join(l,"package.json")];for(let r of e)if(fe(r))try{let t=O.readFileSync(r,"utf8");if(/prepare-only|never takes your key|never.*broadcast/i.test(t))return!0}catch{}return!1}function Je(e=process.env){let r=[],t=(c,h,v,q=1)=>{r.push({id:c,status:h,detail:v,weight:q})},[n,i]=process.versions.node.split(".").map(Number),s=n>20||n===20&&i>=19;t("node",s?"ok":"fail",`node ${process.versions.node}`,2);let u=["oracle_cli","research_delegate","trade_lifecycle","signal_score","skill_load","learn_skill","code_eval","cron_add","web_fetch"].filter(c=>!P.includes(c));t("agent_tools",u.length===0?"ok":"warn",u.length===0?`safe tools ${P.length}; signal_score present`:`missing tools: ${u.join(",")}`,3),t("research_attributes","ok",`attrs [${ue.join(", ")}]; mode=${le(e)?"ON":"off"}`,2);let f=gr();t("providers",f.count>=40?"ok":f.count>=10?"warn":"fail",f.detail,3);let y=Ge();t("skills_trading_build",y.trading.length>=5&&y.building.length>=4?"ok":y.count>=10?"warn":"fail",`${y.count} skills; trading=${y.trading.length} building=${y.building.length}`,3);let p=yr();t("protocol_templates",p.length>=2?"ok":"warn",p.length?p.join(", "):"none",2);let g=br();t("profiles",g.includes("protocol-builder")&&g.includes("oracle")?"ok":g.length>=1?"warn":"fail",g.join(", ")||"none",2),t("signals_engine",de.length>=4?"ok":"fail",`types: ${de.join(", ")} (cold / no hot exec)`,2);let T=We();t("harness_roster",T.length>=8?"ok":"warn",`${T.length} supported harnesses; Oracle native default; MCP inbound only`,2),t("custody_prepare_only",Er()?"ok":"fail","public plane prepare-only",4);let S=e.ORACLE_DATA_URL||"http://127.0.0.1:8787";t("data_url","ok",S,1);let k=0,I=0;for(let c of r)I+=c.weight,c.status==="ok"?k+=c.weight:c.status==="warn"&&(k+=c.weight*.5);let m=I?Math.round(k/I*100):0,A=!r.some(c=>c.status==="fail")&&m>=70,H=A?`AGENTIC READY ${m}% \u2014 Oracle is the crypto control plane (prepare-only); pair coding harnesses via MCP for build.`:`AGENTIC GAPS ${m}% \u2014 fix fail/warn checks before calling Oracle the default crypto harness.`;return{ok:A,score:k,max:I,pct:m,summary:H,researchMode:le(e),attributes:[...ue],packageRoot:l,checks:r}}function zt(){let[e,r]=process.versions.node.split(".").map(Number);return e>20||e===20&&r>=19}function mn(e){if(!F.existsSync(e))return{};let r={};for(let t of F.readFileSync(e,"utf8").split(/\r?\n/)){let n=t.match(/^([A-Z0-9_]+)=(.*)$/);n&&(r[n[1]]=n[2])}return r}async function hn(e){let r=e.replace(/\/$/,"");return(await Promise.all(["/health","/public/health"].map(async n=>{try{return(await fetch(r+n)).ok}catch{return!1}}))).some(Boolean)}var Hl={name:"doctor",summary:"check the read plane (+ optional --agentic readiness score)",group:"read",usage:"oracle doctor [--json] [--agentic] [--first-hour]",async run(e){let r=e.argv.includes("--json"),t=e.argv.includes("--agentic"),n=e.argv.includes("--first-hour"),i=[],s=!1,a=(c,h,v,q=null)=>{i.push({id:c,status:h,detail:v,fix:q}),h==="fail"&&(s=!0)};a("node",zt()?"ok":"fail",`node ${process.versions.node}`,zt()?null:"install node >= 20.19");let u=e.paths.oracleExecEnvPath(),f=mn(u),y=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||f.ORACLE_ROUTE_ATTESTATION_SECRET||f.MAD_ROUTE_ATTESTATION_SECRET||f.ORACLE_ATTESTATION_SECRET||f.ORACLE_STAMP_HMAC_SECRET;a("attestation_secret",y?"ok":"warn",y?"present":"missing",y?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let p=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",g=await hn(p),T=e.paths.loadDeskRouting&&(process.env.ORACLE_DESK_URL||process.env.ORACLE_PUBLIC_URL)?`desk ${process.env.ORACLE_DESK_URL||process.env.ORACLE_PUBLIC_URL}`:null;a("data_server",g?"ok":"warn",g?`reachable ${p}${T?` (${T})`:""}`:`down ${p}`,g?null:p.includes("127.0.0.1")||p.includes("localhost")?"oracle data serve OR set ~/.config/oracle/desk.json to YOUR_DESK_HOST":"check the desk URL in ~/.config/oracle/desk.json (/public/health)");let S=je();a("harness_model","ok","Oracle native harness is default; external harnesses are inbound MCP only (oracle harness detect)",null),a("hermes_opt_in","ok",S.ok?`detected ${S.bin} (${S.source}) \u2014 unused unless explicitly opted in`:"not detected \u2014 native-only OK",null);let k=Ut.join(e.paths.hermesRoot(),"profiles"),I=0;F.existsSync(k)&&(I=F.readdirSync(k,{withFileTypes:!0}).filter(c=>c.isDirectory()).length),a("hermes_lanes","ok",I>0?`${I} profile dir(s) (optional surface)`:"no Hermes lane profiles (native-only OK)",null);{let c=Ut.join(k,"oracle",".env"),h=[];if(F.existsSync(c)){let v=F.readFileSync(c,"utf8");/^TELEGRAM_BOT_TOKEN=.+/m.test(v)&&h.push("telegram"),/^DISCORD_BOT_TOKEN=.+/m.test(v)&&h.push("discord"),/^SLACK_BOT_TOKEN=.+/m.test(v)&&h.push("slack")}h.length?S.ok?a("messaging","ok",`${h.join("/")} configured \xB7 runtime ${S.source}`,null):a("messaging","warn",`${h.join("/")} token set but messaging runtime missing \u2014 bot cannot answer`,"oracle bootstrap, then oracle setup gateway restart"):a("messaging","ok","no channel tokens configured (optional \u2014 oracle setup)",null)}let m=null;if(t){m=Je(process.env);for(let c of m.checks)a(`agentic_${c.id}`,c.status,c.detail,null)}let A=null;if(n){let{firstHourReport:c}=await Promise.resolve().then(()=>(De(),Ft)),{probeSigner:h,probeQuote:v}=await Promise.resolve().then(()=>(jt(),qt)),[q,Ht]=await Promise.all([h(process.env),v()]);A=c({signerReachable:q,quote:Ht});for(let W of A.checks)a(`hour_${W.id}`,W.status,W.detail,W.fix)}let H={ok:!s&&(m?m.ok:!0)&&(A?A.ok:!0),checks:i,...A?{firstHour:A}:{},...m?{agentic:{pct:m.pct,summary:m.summary,attributes:m.attributes,researchMode:m.researchMode}}:{}};if(r)process.stdout.write(JSON.stringify(H,null,2)+`
4
- `);else{for(let c of i)process.stdout.write(`${c.status.toUpperCase().padEnd(4)} ${c.id}: ${c.detail}
5
- `),c.fix&&process.stdout.write(` fix: ${c.fix}
6
- `);m&&process.stdout.write(`
7
- ${m.summary}
8
- `)}return H.ok?0:1}};export{Hl as default};
1
+ var kn=Object.defineProperty;var l=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var ye=(e,t)=>{for(var r in t)kn(e,r,{get:t[r],enumerable:!0})};import be from"node:fs";import In from"node:os";import Y from"node:path";import{fileURLToPath as Tn}from"node:url";function Me(){return process.env.ORACLE_FAKE_HOME||In.homedir()}function _n(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function X(){return _n()?process.env.ORACLE_CONFIG_DIR||Y.join(Me(),".config","oracle"):Y.join(Me(),".config","oracle")}function Cn(){return Y.join(X(),"desk.json")}function Nn(){return Y.join(X(),"env")}function K({force:e=!1}={}){if(K._done&&!e)return K._result||null;K._done=!0;let t={},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,t[o]=s))};try{let o=Nn();if(be.existsSync(o))for(let i of be.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let d=s[2];(d.startsWith('"')&&d.endsWith('"')||d.startsWith("'")&&d.endsWith("'"))&&(d=d.slice(1,-1)),r(s[1],d)}}catch{}try{let o=Cn();if(be.existsSync(o)){let i=JSON.parse(be.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)),K._result=Object.keys(t).length?t:null,K._result}var On,S,Ee=l(()=>{On=Y.dirname(Tn(import.meta.url)),S=Y.resolve(On,"../..");try{K()}catch{}});function Vt(e){return to.get(Number(e))||null}function Kt(e,t=process.env){let r=Vt(e);if(!r)return null;for(let n of r.rpcEnv){let o=(t[n]||"").trim();if(o)return o}return null}var Se,to,Ge=l(()=>{Se={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}},to=new Map(Object.values(Se).map(e=>[e.chainId,e]))});function se(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var Je=l(()=>{});var Yt=l(()=>{});var Xt=l(()=>{});var ae=l(()=>{});var ee=l(()=>{});var ve=l(()=>{ae();ee()});import{isAddress as oa}from"ethers";var Ke=l(()=>{ve();ae();ee()});import{Interface as oo,isAddress as la}from"ethers";var ma,Qt=l(()=>{Ke();ae();ee();ma=new oo(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as io,isAddress as ga}from"ethers";var xa,Sa,Zt=l(()=>{Ke();ae();ee();xa=new io(["function approve(address spender,uint256 amount) returns (bool)"]),Sa=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var z=l(()=>{});import{Interface as so,MaxUint256 as _a,isAddress as Ca,keccak256 as Na,toUtf8Bytes as Ra}from"ethers";var Da,te=l(()=>{Xt();Qt();Zt();z();ee();Da=new so(["function approve(address spender,uint256 amount) returns (bool)"])});var ja,qa,ke=l(()=>{ja=300*1e3,qa=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});var Te=l(()=>{te()});import{Address as Ga,NETWORK as Ja,OutScript as Va,RawTx as Ka,SigHash as Ya,TEST_NETWORK as Xa,Transaction as Qa}from"@scure/btc-signer";var Xe=l(()=>{});import{createHash as ao}from"node:crypto";import{base58 as rc}from"@scure/base";import{getCompiledTransactionMessageDecoder as oc}from"@solana/transaction-messages";var tr,ic,Qe=l(()=>{tr=e=>ao("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),ic=new Map([[tr("route"),{name:"route",prefixBytes:0}],[tr("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});import H from"node:net";import co from"node:dns";function Oe(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=m=>{if(!m)return[];let c=m.split(":"),f=c.at(-1);if(f?.includes(".")){let u=f.split(".").map(Number);if(u.length!==4||u.some(b=>!Number.isInteger(b)||b<0||b>255))return null;c.splice(c.length-1,1,(u[0]<<8|u[1]).toString(16),(u[2]<<8|u[3]).toString(16))}return c.some(u=>!/^[0-9a-f]{1,4}$/.test(u))?null:c.map(u=>Number.parseInt(u,16))},[n,o]=t.split("::"),i=r(n),s=r(o);if(!i||!s)return null;let d=t.includes("::"),a=8-i.length-s.length;if(!d&&a!==0||d&&a<1)return null;let p=[...i,...Array(Math.max(0,a)).fill(0),...s];return p.length!==8?null:Uint8Array.from(p.flatMap(m=>[m>>8,m&255]))}function Ze(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function et(e){if(H.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(H.isIPv6(e)){let t=Oe(e);if(!t)return!1;let r=Oe("::ffff:0:0");return Ze(t,r,96)?et([...t.slice(12)].join(".")):Ze(t,Oe("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Ze(t,Oe(o),i)):!1}return!1}function lo(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(uo.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=H.isIP(r);return n!==0&&!et(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function tt(e,{lookupFn:t=co.promises.lookup}={}){let r=lo(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:H.isIPv6(r.host)?6:4}]};let n;try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!et(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}async function rt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n;try{let c=await t();r=c.Agent,n=c.fetch}catch(c){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${c?.message||c}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let o=c=>String(c).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),i=new Map,s=c=>(Array.isArray(c)?c:[c]).map(f=>typeof f=="string"?{address:f}:f).filter(f=>f&&f.address).map(f=>({address:f.address,family:f.family||(H.isIPv6(f.address)?6:4)})),d=(c,f,u)=>{i.set(o(c),s(typeof f=="string"?[{address:f,family:u}]:f))},a=c=>{let f=o(c);if(H.isIP(f))return[{address:f,family:H.isIPv6(f)?6:4}];let u=i.get(f);if(!u||!u.length)throw new Error(`refused: unpinned host ${c} during pinned fetch`);return u},p=new r({connect:{lookup(c,f,u){let b;try{b=a(c)}catch(w){return u(w)}return f?.all?u(null,b):u(null,b[0].address,b[0].family)}}}),m=fo((c,f={})=>n(c,{...f,dispatcher:p}),d);return{dispatcher:p,fetch:m,pin:d,resolve:a,async close(){try{await p.destroy()}catch{}}}}function fo(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[nt]=Object.freeze({pin:t}),e}function ot(e){return typeof e=="function"&&typeof e[nt]?.pin=="function"}function rr(e,t,r){if(!ot(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[nt].pin(t,r)}var uo,nt,nr=l(()=>{uo=new Set(["localhost","metadata.google.internal","metadata.goog"]);nt=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as or}from"node:crypto";function go(e){let t=String(e||"").toLowerCase();return dr.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function yo(e){let t={};for(let[r,n]of Object.entries(e||{}))go(r)||(t[r]=n);return t}function bo(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function Eo(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function cr(e){let t=String(e?.method||"");return t?!xo.test(t):!1}function Ao(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}return Array.isArray(r)?r.length>0&&r.every(cr):!r||typeof r!="object"?!1:r.jsonrpc&&r.method?cr(r):typeof r.type=="string"&&So.has(r.type)&&r.action==null&&r.signature==null&&r.nonce==null}function vo(e,t,r,n={},o=null){let i={};for(let[f,u]of Object.entries(r||{}))i[f.toLowerCase()]=u;let s=Object.keys(i).filter(f=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(f)),a=[...new Set([...dr,...s])].sort().map(f=>`${f}=${i[f]??""}`).join(`
2
+ `),p=or("sha256").update(a).digest("hex").slice(0,32),m=`${n.untrustedUrl?"untrusted":"trusted"}:${n.maxResponseBytes??"unbounded"}`,c=o==null?"-":or("sha256").update(String(o)).digest("hex").slice(0,32);return`${e} ${t} ${m} ${p} ${c}`}function ko(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,sr):Math.min(250*2**e,sr)+Math.floor(Math.random()*100)}function ce(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function st(e,t,r){return ce(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function ue(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function To(e){return e?e.byteLength??e.length??0:0}async function ur(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(ue(e),!n))throw st(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let c=await e.text(),f=Buffer.byteLength(c,"utf8");if(f>t){if(!n)throw st(r,`body ${f} bytes`,t);return Buffer.from(c,"utf8").subarray(0,t).toString("utf8")}return c}let d=[],a=0,p=!1;try{for(;;){let{value:c,done:f}=await s.read();if(f)break;if(c&&(d.push(Buffer.from(c)),a+=To(c),a>t)){p=!0;break}}}finally{if(p)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(p&&(typeof o=="function"&&o(),!n))throw st(r,`streamed ${a} bytes`,t);let m=Buffer.concat(d);return(p?m.subarray(0,t):m).toString("utf8")}function lr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function Oo(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:d,untrustedUrl:a=!1,maxResponseBytes:p=null,importUndici:m,validateResponse:c,signal:f}){let u=new AbortController,b=setTimeout(()=>u.abort(),i),w=f?typeof AbortSignal.any=="function"?AbortSignal.any([f,u.signal]):f:u.signal,h=null,I=t,O=s?{lookupFn:s}:{};if(a&&!d&&!ot(I))throw ce(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let g=async(y,{status:x=null}={})=>{let v=await tt(y,O);if(!v.ok)throw ce(x==null?`HTTP refused ${y}: ${v.error}`:`HTTP redirect to ${y} ${v.error}`,x==null?{}:{status:x});let E=new URL(y).hostname;if(d){if(h&&(await h.close(),h=null),!h)try{h=await rt({requireUndici:!0,...m?{importUndici:m}:{}})}catch(_){throw ce(x==null?`HTTP refused ${y}: ${_?.message||_}`:`HTTP redirect to ${y} refused: ${_?.message||_}`,x==null?{}:{status:x})}h.pin(E,v.addresses),I=h.fetch}else rr(I,E,v.addresses);return v};try{let y=String(e),x={...n||{}};a&&await g(y);for(let v=0;v<=ar;v+=1){let E=await I(y,{method:r,headers:x,body:o,signal:w,redirect:"manual"});if(ho.has(E.status)){if(r!=="GET"&&r!=="HEAD"){let $=await ur(E,p??wo,{url:y,truncate:!0}),M=new Error(`HTTP ${E.status} ${r} ${y} redirected non-idempotent request`);throw M.status=E.status,M.body=lr($)??$.slice(0,300),M}if(v===ar)throw ue(E),new Error(`HTTP redirect loop for ${e}`);let C=E.headers?.get?.("location"),B;try{B=bo(C,y)}catch($){throw ue(E),$}let F=!Eo(B,y);if(ue(E),F&&(x=yo(x)),a)await g(B,{status:E.status});else if(F){let $=await tt(B,O);if(!$.ok){let M=new Error(`HTTP redirect from ${y} ${$.error}`);throw M.status=E.status,M.retryable=!1,M}d&&$.addresses?.length&&(h||(h=await rt(m?{importUndici:m}:{})),h&&(h.pin(new URL(B).hostname,$.addresses),I=h.fetch))}y=B;continue}if(typeof c=="function")try{await c(E,{url:y})}catch(C){throw ue(E),ce(C?.message||String(C))}let _=await ur(E,p,{url:y,onOversize:()=>u.abort()}),V=lr(_);if(!E.ok){let C=new Error(`HTTP ${E.status} ${r} ${y}`);throw C.status=E.status,C.retryAfter=E.headers?.get?.("retry-after")??null,C.body=V??_.slice(0,300),C}return V??_}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(b),h&&await h.close()}}async function _e(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let n=t.timeoutMs??12e3,o=(t.method||"GET").toUpperCase(),i={Accept:"application/json",...t.headers||{}},s=t.body;s!=null&&typeof s!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",s=JSON.stringify(s));let d=Number.isInteger(t.retries)?Math.max(t.retries,0):mo,a=t.lookupFn,p=!t.fetchImpl,m=t.untrustedUrl===!0,c=t.importUndici,f=t.validateResponse,u=t.signal,b=Number(t.maxResponseBytes),w=Number.isFinite(b)&&b>0?Math.floor(b):null,h=async()=>{let x;for(let v=0;v<=d;v++){u?.throwIfAborted?.();try{return await Oo(e,{fetchImpl:r,method:o,headers:i,body:s,timeoutMs:n,lookupFn:a,realFetch:p,untrustedUrl:m,maxResponseBytes:w,importUndici:c,validateResponse:f,signal:u})}catch(E){x=E;let _=E?.status,V=E?.name==="AbortError"||E?.name==="TimeoutError"||u?.aborted,C=new Set([408,425,429]),B=E?.retryable===!1?!1:_!=null?C.has(_)||po.has(_)&&ir.has(o):!V&&ir.has(o);if(v===d||!B)throw E;let F=ko(v,E?.retryAfter);u?await new Promise(($,M)=>{let vn=setTimeout($,F);u.addEventListener("abort",()=>{clearTimeout(vn),M(u.reason||new DOMException("Aborted","AbortError"))},{once:!0})}):await Io(F)}}throw x};if(!(t.dedupe!==!1&&!u&&Ao(o,s)))return h();let O=vo(o,e,i,{untrustedUrl:m,maxResponseBytes:w},s),g=it.get(O);if(g)return g;let y=h().finally(()=>it.delete(O));return it.set(O,y),y}var po,ir,mo,sr,dr,ho,ar,wo,it,xo,So,Io,Ce=l(()=>{nr();po=new Set([408,425,429,500,502,503,504]),ir=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),mo=2,sr=4e3,dr=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],ho=new Set([301,302,303,307,308]),ar=3,wo=64*1024;it=new Map,xo=/(?:^|_)(send|submit|broadcast|sign|requestAirdrop)(?=[A-Z_]|$)/i,So=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Io=e=>new Promise(t=>setTimeout(t,e))});var fr=l(()=>{Ce()});var pr=l(()=>{fr()});var Sc,Ac,ct=l(()=>{z();pr();Sc=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"}),Ac=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 Ic,ut=l(()=>{z();Ic="0x"+"00".repeat(32)});var _o,Nc,lt=l(()=>{ut();z();_o=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Nc=Object.freeze(_o.map(e=>e[0]))});var Ne=l(()=>{z()});import{TypedDataEncoder as Bc,getAddress as Fc,isAddress as Dc}from"ethers";var No,Ro,gr=l(()=>{ke();No=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),Ro=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]})});var qc,yr=l(()=>{qc=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var br=l(()=>{});import{TypedDataEncoder as Kc,getAddress as Yc,isAddress as Xc}from"ethers";var $o,ou,Lo,iu,Er=l(()=>{Ce();ve();yr();br();ke();$o=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),ou=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),Lo=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),iu=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{TypedDataEncoder as cu,getAddress as uu}from"ethers";var fu,dt=l(()=>{gr();Er();fu=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"])});import{Interface as Sr}from"ethers";var jo,_u,qo,Cu,Nu,Ru,$u,Uo,Lu,Re=l(()=>{te();ve();ke();Te();Xe();Qe();ct();lt();Ne();dt();jo=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]),_u=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),qo=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"}}),Cu=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Nu=new Sr(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),Ru=new Sr(["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"]),$u=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"}}),Uo=Object.freeze([...jo]),Lu=Object.freeze({...qo})});import{encode as Fu}from"@msgpack/msgpack";import{keccak256 as Mu,verifyTypedData as ju}from"ethers";var qu,Uu,ft=l(()=>{qu=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Uu=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var pt=l(()=>{Ne()});import{ed25519 as Yu}from"@noble/curves/ed25519.js";import{base58 as Qu}from"@scure/base";import{RawTx as el,SigHash as tl,Transaction as rl}from"@scure/btc-signer";import{Transaction as ol,keccak256 as il,verifyTypedData as sl}from"ethers";var mt=l(()=>{ft();pt()});import{base58 as pl}from"@scure/base";var $e=l(()=>{Re();Te();te();mt()});var vr=l(()=>{$e();Re()});var kl,Il,Tl,re=l(()=>{kl=Object.freeze({N:1<<17,r:8,p:1}),Il=256*1024*1024,Tl=16*1024});var _l,kr=l(()=>{_l=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 ht}from"node:os";import{join as wt}from"node:path";var Ir,Wo,$l,Tr=l(()=>{Ir=process.env.ORACLE_PUBLIC_DESKTOP==="1",Wo=Ir?process.env.ORACLE_CONFIG_DIR||wt(ht(),".config","oracle"):wt(ht(),".config","oracle"),$l=Ir?Wo:wt(ht(),".config","mad-desk")});var Dl,Ml,jl,Or=l(()=>{Tr();Dl="0".repeat(64),Ml=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"}),jl=Promise.resolve()});var gt=l(()=>{Or();z();re();$e()});var Cr=l(()=>{});var $r={};ye($r,{SIGN_TIME_REVIEW_VERSION:()=>Go,SignTimeReviewSecretError:()=>le,createSignTimeReview:()=>Rr});function yt(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string"){let o=e.trim().split(/\s+/);if(Xo.test(e)||Qo.has(o.length)&&o.every(i=>/^[a-z]+$/i.test(i)))throw new le(t);return e}if(typeof e=="bigint")return e.toString();if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new TypeError(`sign-time review: safe integer required at ${t}`);return e}if(Array.isArray(e))return e.map((o,i)=>yt(o,`${t}[${i}]`,r));W(e,t);let n={};for(let o of Object.keys(e).sort()){let i=o.replace(/[^a-z0-9]/gi,"");if(Yo.test(i))throw new le(`${t}.${o}`);e[o]!==void 0&&(n[o]=yt(e[o],`${t}.${o}`,o))}return n}function W(e,t){if(e==null||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`sign-time review: ${t} must be a plain object`);return e}function de(e,t){if(e==null||e==="")throw new TypeError(`sign-time review: ${t} required`);return e}function ne(e,t){let r=String(de(e,t)).toLowerCase();if(!Jo.test(r))throw new TypeError(`sign-time review: ${t} must be an EVM address`);return r}function j(e,t,{positive:r=!1}={}){try{let n=BigInt(de(e,t));if(n<0n||r&&n===0n)throw new Error;return n.toString()}catch{throw new TypeError(`sign-time review: ${t} must be an unsigned integer`)}}function bt(e,t){if(typeof e!="string"||e.length===0||e.length>500||e!==e.trim())throw new TypeError(`sign-time review: ${t} must be non-empty text`);return e}function Nr(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Nr(t);Object.freeze(e)}return e}function Zo(e,t){if(typeof e=="boolean")return{passed:e,reason:e?"passed":"failed"};W(e,t);let r=e.passed??e.ok??e.allowed;if(typeof r!="boolean")throw new TypeError(`sign-time review: ${t} needs a boolean result`);let n=e.reason??e.message??e.name??(r?"passed":"failed");return{...e,passed:r,reason:bt(String(n),`${t}.reason`)}}function ei(e){if(!Array.isArray(e))throw new TypeError("sign-time review: policyChecks must be an array");let t=e.map((n,o)=>Zo(n,`policyChecks[${o}]`)),r=t.filter(n=>!n.passed);return{checks:t,passed:t.length-r.length,failed:r.length,reasons:r.map(n=>n.reason)}}function ti(e){if(e==null)return null;if(W(e,"simulation"),typeof e.status!="string"||!["ok","success","failed","error","unavailable","unknown"].includes(e.status))throw new TypeError("sign-time review: simulation.status is invalid");if(e.willRevert!==!0&&e.willRevert!==!1&&e.willRevert!==null)throw new TypeError("sign-time review: simulation.willRevert must be boolean or null");let t={status:e.status,willRevert:e.willRevert??null,summary:bt(String(e.summary??"simulation result recorded"),"simulation.summary")};return e.gasEstimate!=null&&(t.gasEstimate=j(e.gasEstimate,"simulation.gasEstimate")),e.gasLimit!=null&&(t.gasLimit=j(e.gasLimit,"simulation.gasLimit")),t}function ri(e){if(e==null)return null;if(!Array.isArray(e)||e.length===0)throw new TypeError("sign-time review: assetDeltas must be a non-empty array");return e.map((t,r)=>{W(t,`assetDeltas[${r}]`);let n=j(t.before,`assetDeltas[${r}].before`),o=j(t.after,`assetDeltas[${r}].after`),i=(BigInt(o)-BigInt(n)).toString(),s;try{s=t.delta==null?i:BigInt(t.delta).toString()}catch{throw new TypeError(`sign-time review: assetDeltas[${r}].delta must be an integer`)}if(s!==i)throw new TypeError(`sign-time review: assetDeltas[${r}].delta does not match before/after`);return{...t,asset:bt(String(de(t.asset??t.token,`assetDeltas[${r}].asset`)),`assetDeltas[${r}].asset`),before:n,after:o,delta:s}})}function ni(e){if(e==null)return[];if(!Array.isArray(e))throw new TypeError("sign-time review: approvalDeltas must be an array");return e.map((t,r)=>{W(t,`approvalDeltas[${r}]`);let n=j(t.amount??t.after,`approvalDeltas[${r}].amount`);if(t.revokeLike!=null&&typeof t.revokeLike!="boolean")throw new TypeError(`sign-time review: approvalDeltas[${r}].revokeLike must be boolean`);return{token:ne(t.token,`approvalDeltas[${r}].token`),spender:ne(t.spender,`approvalDeltas[${r}].spender`),owner:ne(t.owner,`approvalDeltas[${r}].owner`),amount:n,revokeLike:t.revokeLike??BigInt(n)===0n}})}function Rr(e={}){W(e,"input");let t=yt(e),r=t.tx==null?t:W(t.tx,"tx"),n=j(t.chainId??r.chainId,"chainId",{positive:!0}),o=ne(t.account??t.from??r.from,"account/from"),i=ne(t.destination??t.to??r.to,"destination/to"),s=String(de(t.prepareHash,"prepareHash")).toLowerCase();if(!Ko.test(s))throw new TypeError("sign-time review: prepareHash must be a 32-byte hash");let d=t.route??t.venue;if(d==null)throw new TypeError("sign-time review: route/venue required");let a=t.decodedCalldata??t.decodedAction;if(a==null)throw new TypeError("sign-time review: decodedCalldata or decodedAction required");let p=String(de(t.calldata??t.data??r.data,"calldata/data")).toLowerCase();if(!Vo.test(p))throw new TypeError("sign-time review: calldata/data must be even-length hex");let m=t.policyChecks!==void 0&&t.policyChecks!==null,c=ei(m?t.policyChecks:[]),f=ti(t.simulation),u=ri(t.assetDeltas),b=ni(t.approvalDeltas),w=t.allowlistHits??[];if(!Array.isArray(w))throw new TypeError("sign-time review: allowlistHits must be an array");let h=f?.willRevert===!0||["failed","error"].includes(f?.status),I=f!=null&&f.willRevert===!1&&["ok","success"].includes(f.status),O=h||c.failed>0?"BLOCKED":I&&m&&c.checks.length>0&&u!=null?"READY":"UNKNOWN",g=typeof a=="string"?a:a.method??a.action??a.type??"transaction",y=`${O}: review ${g} on chain ${n}; policy ${c.passed} passed, ${c.failed} failed; ${u?.length??0} asset delta${u?.length===1?"":"s"}; local signature required`,x={reviewVersion:1,status:O,requiresLocalSignature:!0,signingLocal:!0,custody:"none",execution:"review-only",chainId:n,account:o,from:o,route:d,venue:t.venue??(typeof d=="string"?d:d.venue??d.provider??null),destination:i,to:i,...t.spender==null?{}:{spender:ne(t.spender,"spender")},prepareHash:s,...t.decodedCalldata!==void 0?{decodedCalldata:t.decodedCalldata}:{decodedAction:t.decodedAction},calldata:p,data:p,selector:p.length>=10?p.slice(0,10):null,value:j(t.value??r.value??0,"value"),...(t.gasEstimate??r.gasEstimate)==null?{}:{gasEstimate:j(t.gasEstimate??r.gasEstimate,"gasEstimate")},...(t.gasLimit??r.gasLimit)==null?{}:{gasLimit:j(t.gasLimit??r.gasLimit,"gasLimit")},simulation:f,policyChecks:c,allowlistHits:w,assetDeltas:u,approvalDeltas:b,summary:y};return Nr(x)}var Go,Jo,Vo,Ko,Yo,Xo,Qo,le,Et=l(()=>{Go=1,Jo=/^0x[0-9a-f]{40}$/,Vo=/^0x(?:[0-9a-f]{2})*$/,Ko=/^(?:0x)?[0-9a-f]{64}$/,Yo=/(privatekey|privkey|secretkey|seedphrase|mnemonic|passphrase|password|keystore|keymaterial|wif|xprv|xpriv|bearer|authorization|signature|apikey|credential)/i,Xo=/\b(?:[5KL][1-9A-HJ-NP-Za-km-z]{50,51}|xprv[0-9A-Za-z]{50,})\b/,Qo=new Set([12,15,18,21,24]),le=class extends Error{constructor(t){super(`sign-time review refused: secret-bearing field at ${t}`),this.name="SignTimeReviewSecretError",this.code="SIGN_TIME_REVIEW_SECRET"}}});var Lr=l(()=>{Et();te()});import{Wallet as Zl}from"ethers";import{base58 as td}from"@scure/base";import{ed25519 as nd}from"@noble/curves/ed25519.js";import{NETWORK as id,TEST_NETWORK as sd,WIF as ad,p2wpkh as cd}from"@scure/btc-signer";import{pubECDSA as ld}from"@scure/btc-signer/utils.js";var Pr=l(()=>{});var pd,md,hd,wd,gd,yd,bd,Ed,xd,Sd,Ad,Br=l(()=>{gt();pd=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),md=Object.freeze(["binance","bybit","okx","coinbase"]),hd=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),wd=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),gd=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),yd=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),bd=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),Ed=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),xd=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),Sd=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),Ad=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"})});var Fr=l(()=>{re()});var si,Dr,Pe=l(()=>{si=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),Dr=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"})});var Mr=l(()=>{Pe()});var $d,jr=l(()=>{Pe();Mr();$d=256*1024});var qr=l(()=>{Pe();jr()});var Ur=l(()=>{re()});import N from"node:path";import ai from"node:os";import{createHash as ci,randomBytes as vf}from"node:crypto";import{Interface as xt,keccak256 as If}from"ethers";import{Transaction as Of}from"@scure/btc-signer";import{ed25519 as Cf}from"@noble/curves/ed25519.js";function zr(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||N.join(process.env.XDG_STATE_HOME||N.join(ai.homedir(),".local","state"),"oracle"),r=ci("sha256").update(N.resolve(e)).digest("hex").slice(0,16);return{vault:N.join(e,"vault.json"),policy:N.join(e,"signer-policy.json"),policyKey:N.join(e,"policy-integrity-key"),policyAnchor:N.join(t,`signer-policy-${r}.high-water`),ledger:N.join(e,"signer-ledger.json"),ledgerAnchor:N.join(t,`signer-ledger-${r}.high-water`),cexOrders:N.join(e,"cex-orders.json"),cexOrdersAnchor:N.join(t,`cex-orders-${r}.high-water`),token:N.join(e,"signer-token"),lock:N.join(t,`signer-${r}.lock`)}}var op,ip,sp,Hr=l(()=>{vr();$e();re();kr();gt();Cr();te();Lr();Re();Te();mt();ct();lt();Ne();pt();ut();ft();Xe();Qe();dt();Pr();Br();Fr();qr();Ur();op=new xt(["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"]),ip=new xt(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),sp=new xt(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});import St from"node:fs";import Wr from"node:path";import{homedir as ui}from"node:os";function li(){return process.env.ORACLE_CONFIG_DIR||Wr.join(ui(),".config","oracle")}function fe(){let e=zr(Wr.join(li(),"signer")),t=St.existsSync(e.vault),r=St.existsSync(e.lock),n=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:St.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var gp,At=l(()=>{Je();Yt();Hr();re();gp=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}])});function Be(e){return String(e||"").trim()||void 0}function fi(e,{required:t=!1}={}){let r=Be(e)?.toLowerCase();if(!r){if(t)throw new Error("model provider is required");return}if(!di.has(r))throw new Error(`unsupported provider: ${r}`);return r}function pi(e,{required:t=!1}={}){let r=Be(e);if(!r){if(t)throw new Error("model is required");return}if(r.includes("..")||r.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(r))throw new Error("invalid model id");return r}function mi(e){let t=Be(e);if(!t||t.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(t)}catch{throw new Error("invalid custom base URL")}let 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 Gr({provider:e,model:t,baseUrl:r}={},{requireModel:n=!1}={}){let o=fi(e),i=pi(t,{required:n});if(o==="custom")return{provider:o,...i?{model:i}:{},baseUrl:mi(r)};if(Be(r))throw new Error("baseUrl is only supported for the custom provider");return{...o?{provider:o}:{},...i?{model:i}:{}}}var di,Jr=l(()=>{di=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"])});import Vr from"node:fs";import hi from"node:path";function gi(){return hi.join(X(),"model.json")}function oe(e){return String(e||"").trim()||void 0}function yi(e={}){let t=oe(e.backend)?.toLowerCase()||"auto",r=Gr({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:t==="standalone"}),n=oe(e.apiKeyEnv),o=Number.parseInt(String(e.contextLength||""),10),i=oe(e.reasoningEffort),s=oe(e.computeHost||e.remoteHost),d=oe(e.computeUser||e.remoteUser),a=oe(e.computePath||e.remotePath);if(!wi.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(n&&!/^[A-Z][A-Z0-9_]*$/.test(n))throw new Error("api key env must be an uppercase environment variable name");if(t==="remote"&&!s)throw new Error("remote backend requires computeHost");return{backend:t,...r,...n?{apiKeyEnv:n}:{},...Number.isFinite(o)&&o>0?{contextLength:o}:{},...i?{reasoningEffort:i}:{},...s?{computeHost:s}:{},...d?{computeUser:d}:{},...a?{computePath:a}:{}}}function Kr(){let e=gi();if(!Vr.existsSync(e))return null;try{return yi(JSON.parse(Vr.readFileSync(e,"utf8")))}catch{return null}}var wi,Yr=l(()=>{Ee();Jr();wi=new Set(["auto","standalone","hermes","remote","arch"])});import{Interface as bi,getAddress as Ei}from"ethers";function vt(e,t){try{return Ei(e).toLowerCase()}catch{throw new Error(`${t} must be a valid EVM address`)}}function xi(e){let t=String(e||"").trim();if(!/^0x[0-9a-fA-F]{64}$/.test(t))throw new Error("txHash must be a 32-byte hex transaction hash");return t.toLowerCase()}function kt(e){return e==null?null:Number.parseInt(String(e),16)}function Ai(e,{rpcUrl:t,env:r=process.env}={}){if(t)return t;let n=Kt(e,r);return n||Si[Number(e)]||null}function ki(e){let t=String(e||""),r=t.toLowerCase();if(t!==t.trim()||!/^[a-zA-Z0-9_]+$/.test(t)||!vi.test(r))throw new Error(`evm-rpc: ${t} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return r}function Ii(e){let t=new Error(e?.message||JSON.stringify(e));return t.code=e?.code,t}function Ti(e){if(e?.error)throw Ii(e.error);return e?.result}function Oi(e,t,r){return`${e}
3
+ ${t}
4
+ ${JSON.stringify(r??[])}`}async function _i(e,t,r){return _e(e,{method:"POST",body:t,fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3,signal:r.signal})}async function It(e,t,r=[],n={}){let o=String(t||""),i=ki(o),s=Ai(e,n);if(!s)throw new Error(`No RPC URL for chainId ${e} (set env from chain registry rpcEnv or pass rpcUrl)`);if(i==="eth_chainid"&&n.cacheChainId!==!1){let m=Xr.get(s);if(m!=null)return m}let a=n.dedupe!==!1&&!n.signal?Oi(s,o,r):null;if(a&&pe.has(a))return pe.get(a);let p=(async()=>{let m=await _i(s,{jsonrpc:"2.0",id:1,method:t,params:r},n),c=Ti(m);return i==="eth_chainid"&&typeof c=="string"&&Xr.set(s,c),c})();return a&&(pe.set(a,p),p.finally(()=>{pe.get(a)===p&&pe.delete(a)}).catch(()=>{})),p}async function Qr(e={},t={}){let r=Number(e.chainId??t.chainId??1),n=xi(e.txHash||e.hash||e.transactionHash),o=await It(r,"eth_getTransactionReceipt",[n],t);if(!o)return{ok:!1,chainId:r,txHash:n,status:"pending",receipt:null,reason:"receipt pending"};let i=kt(o.status),s=i===1,d=i===1?"success":i===0?"reverted":"unknown",a=s?null:d==="reverted"?"transaction reverted":"unknown receipt status",p=e.expectedTo?vt(e.expectedTo,"expectedTo"):null,m=o.to?vt(o.to,"receipt.to"):null;return p&&m!==p&&(s=!1,a=`to mismatch: expected ${p}, got ${m||"null"}`),{ok:s,chainId:r,txHash:n,status:d,reason:a,statusCode:i,to:m,from:o.from?vt(o.from,"receipt.from"):null,blockNumber:kt(o.blockNumber),transactionIndex:kt(o.transactionIndex),logs:Array.isArray(o.logs)?o.logs:[],receipt:o}}var _p,Si,vi,pe,Xr,Zr=l(()=>{Ce();Ge();_p=new bi(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);Si={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};vi=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;pe=new Map,Xr=new Map});import{wordlists as Ci}from"ethers";function Li(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return $i.has(t.length)&&t.every(r=>Ci.en.getWordIndex(r)>=0)}function Di(e){let t=en(e);return Fi.has(t)||Bi.test(t)}function en(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Mi(e){let t=en(e);return[...Ni].some(r=>t.includes(r))}function ji(e,t,r){if(typeof t=="string"){if(Ri.some(n=>n.test(t))||Li(t))throw new me(r);if(Pi.test(t)&&!Di(e))throw new me(r)}}function Tt(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return ji(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>Tt(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(Mi(o))throw new me(i);e[o]!==void 0&&(n[o]=Tt(e[o],i,o))}return n}function tn(e){return Tt(e)}var Ni,Ri,$i,Pi,Bi,Fi,me,Ot=l(()=>{Ni=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Ri=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],$i=new Set([12,15,18,21,24]);Pi=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Bi=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Fi=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);me=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});var $p,Lp,Pp,rn=l(()=>{$p=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Lp=Object.freeze(["read","simulate"]),Pp=1440*60});function _t(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return qi.test(t)||Ui.includes(r)}function zi(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>on.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function sn(e){let t;try{t=JSON.stringify(e)}catch(o){throw new q("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=zi(t);for(let{rule:o,re:i}of nn)if(i.test(r))throw new q("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new q("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,i)=>{if(o&&_t(o))throw new q(`$<serialized>.${o}`,"forbidden-key-name");return i}),t}function G(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=on.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of nn)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new q(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&_t(o))throw new q(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");G(o,`${t}[key]`,r),G(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())G(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>G(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(_t(o))throw new q(`${t}.${o}`,"forbidden-key-name");G(i,`${t}.${o}`,r,o)}return e}var q,qi,Ui,nn,on,an=l(()=>{rn();q=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},qi=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Ui=Object.freeze(["privkey","wif","xprv","seed"]);nn=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),on=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});function Ct(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${t} must be a plain object`);return e}function Nt(e,t="control input"){try{G(e,t),sn(e)}catch(r){throw new TypeError(`${t} contains secret or custody material: ${r.message}`)}return e}function he(e,{required:t=[],optional:r=[]}={},n="object"){Ct(e,n);let o=new Set([...t,...r]),i=Object.keys(e).filter(s=>!o.has(s));if(i.length)throw new TypeError(`${n} has unknown field ${i[0]}`);for(let s of t)if(!Object.hasOwn(e,s))throw new TypeError(`${n}.${s} is required`);return e}function Rt(e,t,r=200,{lower:n=!1}={}){if(typeof e!="string"||!e.trim()||e.length>r||Hi.test(e))throw new TypeError(`${t} must be non-empty control-free text up to ${r} characters`);let o=e.trim();return n?o.toLowerCase():o}function we(e,t,r=80){let n=Rt(e,t,r,{lower:!0});if(!/^[a-z0-9][a-z0-9._:-]*$/.test(n))throw new TypeError(`${t} must be a lowercase identifier`);return n}function Fe(e,t,{positive:r=!1}={}){if(!Number.isSafeInteger(e)||e<0||r&&e===0)throw new TypeError(`${t} must be a ${r?"positive":"non-negative"} safe integer`);return e}function R(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))R(t);Object.freeze(e)}return e}var Hi,$t=l(()=>{Ot();an();Hi=/[\u0000-\u001f\u007f]/});function cn({family:e,chainId:t},r="chain"){let n=we(e,`${r}.family`,40),o;if(n==="evm"){if(typeof t=="number")o=String(Fe(t,`${r}.chainId`,{positive:!0}));else if(o=Rt(t,`${r}.chainId`,40),!/^[1-9][0-9]*$/.test(o))throw new TypeError(`${r}.chainId must be a positive decimal EVM chain id`)}else o=we(t,`${r}.chainId`,80);return{family:n,chainId:o}}function Ji(e,t="chain"){return he(e,{required:["family","chainId"]},t),R(cn(e,t))}function un(e,t="finality rule"){Nt(e,t),Ct(e,t);let r=e.rule;if(!Wi.includes(r))throw new TypeError(`${t}.rule must be confirmations, finalizedTag, or checkpoint`);let n=r==="confirmations"?"confirmations":r;he(e,{required:["family","chainId","rule",n]},t);let o=cn(e,t);return r==="confirmations"?{...o,rule:r,confirmations:Fe(e.confirmations,`${t}.confirmations`,{positive:!0})}:{...o,rule:r,[n]:we(e[n],`${t}.${n}`,80)}}function Lt(e){if(!Array.isArray(e))throw new TypeError("finality policy rules must be an array");let t=e.map((n,o)=>un(n,`finality policy rule ${o}`)),r=new Set;for(let n of t){let o=`${n.family}\0${n.chainId}`;if(r.has(o))throw new TypeError(`duplicate finality rule for ${n.family}:${n.chainId}`);r.add(o)}return R({policyVersion:1,rules:t})}function Vi(e){if(he(e,{required:["policyVersion","rules"]},"finality policy"),e.policyVersion!==1||!Array.isArray(e.rules))throw new TypeError("unsupported finality policy");return Lt(e.rules)}function ln(e,t){let r=Ji(t,"finality query"),o=Vi(e).rules.find(i=>i.family===r.family&&i.chainId===r.chainId);return o?R({status:"KNOWN",...r,rule:o}):R({status:J.UNKNOWN,reason:"MISSING_FINALITY_RULE",...r,rule:null})}function Ki(e,t){if(e==null)return null;Nt(e,"finality evidence");let r=t.rule==="confirmations"?"confirmations":t.rule;if(he(e,{required:["status"],optional:[r]},"finality evidence"),!Gi.includes(e.status))throw new TypeError("finality evidence.status is unknown");let n={status:e.status};return e[r]!=null&&(n[r]=t.rule==="confirmations"?Fe(e.confirmations,"finality evidence.confirmations",{positive:!0}):we(e[r],`finality evidence.${r}`,80)),n}function dn(e,t){if(!e||e.status===J.UNKNOWN||e.rule==null)return R({status:J.UNKNOWN,final:!1,reason:"MISSING_FINALITY_RULE"});let r=un(e.rule??e,"resolved finality rule"),n=Ki(t,r);if(n==null)return R({status:J.UNKNOWN,final:!1,reason:"MISSING_FINALITY_EVIDENCE"});if(n.status!=="LIVE")return R({status:J.UNKNOWN,final:!1,reason:`${n.status}_EVIDENCE`});let o=!1;return r.rule==="confirmations"?o=n.confirmations!=null&&n.confirmations>=r.confirmations:r.rule==="finalizedTag"?o=n.finalizedTag===r.finalizedTag:o=n.checkpoint===r.checkpoint,R({status:o?J.FINAL:J.INCLUDED,final:o,reason:o?"PINNED_RULE_SATISFIED":"PINNED_RULE_NOT_SATISFIED",rule:r})}var Wi,J,Gi,fn=l(()=>{$t();Wi=Object.freeze(["confirmations","finalizedTag","checkpoint"]),J=Object.freeze({UNKNOWN:"UNKNOWN",INCLUDED:"INCLUDED",FINAL:"FINAL"}),Gi=Object.freeze(["LIVE","STALE","UNKNOWN","UNAVAILABLE"])});function Xi(e){if(e===!0||e===1||e==="1")return"SUCCESS";if(e===!1||e===0||e==="0")return"FAIL";if(typeof e!="string")return"UNKNOWN";let t=e.trim().toUpperCase();return["SUCCESS","SUCCEEDED","OK","EXECUTED"].includes(t)?"SUCCESS":["FAIL","FAILED","FAILURE","REVERTED","REJECTED"].includes(t)?"FAIL":"UNKNOWN"}function pn(e){return typeof e=="string"&&["FAIL","FAILED","FAILURE","ORPHAN","ORPHANED","REVERTED"].includes(e.trim().toUpperCase())}function Bt(e){return e==null?e:Array.isArray(e)?e.map(Bt):ge(e)?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Bt(e[t])])):String(e)}function Qi(e,t,r,n){let o=A(e.finalityEvidence,n?.finality,e.evidence),i=A(e.finalityPolicy,e.policy);try{return i==null&&ge(e.finalityRule)&&(i=Lt([{family:t,chainId:r,...e.finalityRule}])),i==null||t==null||r==null?{status:"UNKNOWN",final:!1,reason:"MISSING_FINALITY_RULE"}:dn(ln(i,{family:t,chainId:r}),o)}catch{return{status:"UNKNOWN",final:!1,reason:"MALFORMED_FINALITY_EVIDENCE"}}}function T(e,t,r){r!=null&&(e[t]=r)}function Zi(e){return e==null?null:String(e).trim().toLowerCase()}function Pt(...e){let t=e.map(Zi).filter(Boolean);return t.length<=1||t.every(r=>r===t[0])}function mn(e={}){if(!ge(e))throw new TypeError("verified receipt: input object required");let t=tn(e),r=A(t.actionReceipt,t.receipt),n=ge(r)?r:t,o=A(t.observation,t.chainObservation,t.observedReceipt),i=ge(o),s=A(t.txHash,n.txHash,n.transactionHash,o?.txHash,o?.transactionHash),d=A(t.family,n.family,n.chain?.family,o?.family,o?.chain?.family),a=A(t.chainId,n.chainId,n.chain?.chainId,o?.chainId,o?.chain?.chainId),p=!Pt(t.txHash,n.txHash,n.transactionHash,o?.txHash,o?.transactionHash)||!Pt(t.family,n.family,n.chain?.family,o?.family,o?.chain?.family)||!Pt(t.chainId,n.chainId,n.chain?.chainId,o?.chainId,o?.chain?.chainId),m=Qi(t,d,a,i&&!p?o:null),c=Xi(A(o?.receiptStatus,o?.executionStatus,o?.status)),f=A(t.reconciliationStatus,t.reconciliation?.status,o?.reconciliationStatus),u=A(t.finalityState,t.finalityEvidence?.status,t.evidence?.status,o?.finalityState),b="UNKNOWN";pn(f)||!p&&(i&&c==="FAIL"||pn(u))?b="FAIL":!p&&s&&i&&c==="SUCCESS"&&["INCLUDED","FINAL"].includes(m.status)&&(b="SUCCESS");let w={verifiedReceiptVersion:Yi,status:b};p&&(w.reason="REFERENCE_MISMATCH"),T(w,"txHash",s),T(w,"chain",A(t.chain,n.chain,o?.chain)),T(w,"family",d),T(w,"chainId",a),T(w,"block",A(o?.block,t.block)),T(w,"blockState",A(o?.blockState,o?.inclusionState)),w.finalityState=m.status,T(w,"confirmations",A(o?.confirmations,o?.finality?.confirmations,t.finalityEvidence?.confirmations,t.evidence?.confirmations)),T(w,"observedAt",A(o?.observedAt,t.observedAt)),T(w,"route",A(t.route,n.route)),T(w,"prepareHash",A(t.prepareHash,n.prepareHash)),T(w,"policyOutcome",A(t.policyOutcome,n.policyOutcome,n.policyChecks));let h=A(t.balanceChanges,o?.balanceChanges,o?.balances,n.balanceChanges,n.balances);return h!=null&&(w.balanceChanges=Bt(h)),T(w,"createdAt",A(t.createdAt,n.createdAt)),T(w,"submittedAt",A(t.submittedAt,n.submittedAt)),T(w,"finalizedAt",A(t.finalizedAt,o?.finalizedAt)),T(w,"timestamps",A(t.timestamps,n.timestamps,o?.timestamps)),R(w)}var Yi,em,A,ge,hn=l(()=>{Ot();fn();$t();Yi=1,em=Object.freeze(["SUCCESS","FAIL","UNKNOWN"]),A=(...e)=>e.find(t=>t!=null),ge=e=>!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype});var gn={};ye(gn,{observeEvmReceipt:()=>wn,verifyEvmReceipt:()=>rs});function ts(e){if(e==null)return null;let t=typeof e=="number"?e:Number.parseInt(String(e),16);return Number.isSafeInteger(t)?t:null}async function wn({txHash:e,chainId:t,rpcUrl:r},n={}){let o=String(e||"").trim().toLowerCase();if(!es.test(o))throw new TypeError("observe receipt: txHash must be a 32-byte hash");let i=Number(t);if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("observe receipt: chainId required");let s=n.transactionReceipt||Qr,d=n.rpcCall||It,a={...n.rpcOptions||{},...r?{rpcUrl:r}:{}},p;try{p=await s({txHash:o,chainId:i},a)}catch(u){return{observation:null,reason:`RPC_UNAVAILABLE: ${u.message}`}}if(!p||p.receipt==null)return{observation:null,reason:p?.reason||"receipt pending"};let m=null,c=p.blockNumber;if(Number.isSafeInteger(c))try{let u=ts(await d(i,"eth_blockNumber",[],a));u!=null&&u>=c&&(m=u-c+1)}catch{}let f={txHash:o,family:"evm",chainId:String(i),receiptStatus:p.status==="success"?"SUCCESS":p.status==="reverted"?"FAIL":"UNKNOWN",block:c==null?void 0:String(c),observedAt:new Date().toISOString(),finality:{status:"LIVE",...m==null?{}:{confirmations:m}}};return m!=null&&(f.confirmations=m),{observation:f,reason:null}}async function rs({txHash:e,chainId:t,confirmations:r=1,rpcUrl:n},o={}){let{observation:i,reason:s}=await wn({txHash:e,chainId:t,rpcUrl:n},o),d=mn({txHash:String(e).trim().toLowerCase(),family:"evm",chainId:String(Number(t)),finalityRule:{rule:"confirmations",confirmations:r},...i?{observation:i}:{}});return{receipt:d,observed:!!i,final:d.finalityState==="FINAL",requiredConfirmations:r,reason:s}}var es,yn=l(()=>{Zr();hn();es=/^0x[0-9a-f]{64}$/});var bn={};ye(bn,{classifyReceipt:()=>se,configDir:()=>ss,firstHourReport:()=>Ft,probeReceiptModule:()=>cs,probeReviewModule:()=>as,venueMap:()=>De});import ns from"node:path";import{homedir as os}from"node:os";function ss(e=process.env){return e.ORACLE_CONFIG_DIR||ns.join(os(),".config","oracle")}function De({env:e=process.env,vault:t=null}={}){let r=t||fe(),n=[];for(let[o,i]of Object.entries(Se)){let s=(i.rpcEnv||[]).some(a=>String(e[a]||"").trim()),d="prepare";i.evm?s&&(d="live"):d="unavailable",n.push({key:o,chainId:i.chainId,name:i.name,family:"evm",status:d,execute:!!(r.vaultExists&&r.armed&&!r.disarmed),note:s?"rpc configured":"public read/prepare; set RPC for live reads"})}return n.push({key:"solana",chainId:null,name:"Solana",family:"sol",status:"prepare",execute:!1,note:"Jupiter quote/prepare; local sol signer"},{key:"bitcoin",chainId:null,name:"Bitcoin",family:"btc",status:"prepare",execute:!1,note:"Esplora read; local btc signer"},{key:"hyperliquid-l1",chainId:null,name:"Hyperliquid L1",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not an EVM signer family"},{key:"polymarket",chainId:null,name:"Polymarket",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not a signer family"}),n}function Ft({env:e=process.env,model:t=Kr(),vault:r=fe(),signerReachable:n=!1,quote:o=null,reviewAvailable:i=!1,receiptAvailable:s=!1}={}){let d=[],a=(u,b,w,h=null)=>d.push({id:u,status:b,detail:w,fix:h}),p=(()=>{let[u,b]=process.versions.node.split(".").map(Number);return u>20||u===20&&b>=19})();a("node",p?"ok":"fail",`node ${process.versions.node}`,p?null:"install node >= 20.19"),t?t.backend==="hermes"?a("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):a("model","ok",`${t.backend||"auto"} ${t.provider||""} ${t.model||""}`.trim()):a("model","fail","no model.json","oracle setup model"),r.vaultExists?r.disarmed?a("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):a("vault",r.armed?"ok":"warn",r.armed?"present, armed":"present, not armed"):a("vault","fail","no local vault","oracle sign init");let m=e.ORACLE_SIGNER_HOST||"127.0.0.1";if(is.has(m)?a("signer",n?"ok":"warn",n?`loopback ${m}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",n?null:"oracle signer"):a("signer","fail",`signer host ${m} is not loopback`,"unset ORACLE_SIGNER_HOST"),!o)a("quote","warn","quote not probed",null);else if(o.ok){let u=String(o.detail||"net quote returned");a("quote","ok",u.length>140?`${u.slice(0,140)}\u2026`:u)}else a("quote","warn",o.detail||"quote unavailable","check network / oracle data serve");a("review",i?"ok":"fail",i?"sign-time review renders decoded action, policy hits, approval deltas":"sign-time review module missing from this build",i?null:"reinstall @oracle-agent/oracle (src/control/sign-time-review.mjs)"),a("receipt",s?"ok":"fail",s?"oracle receipt verifies on-chain state (SUCCESS/FAIL/UNKNOWN, finality-pinned)":"verified-receipt observer missing from this build",s?null:"reinstall @oracle-agent/oracle (src/desk/observe-receipt.mjs)");let c=d.some(u=>u.status==="fail"),f=d.filter(u=>u.status==="ok").length;return{ok:!c,checks:d,firstRunScore:{ok:f,total:d.length,label:`${f}/${d.length} first-run hops green`},venues:De({env:e,vault:r})}}async function as(){try{return typeof(await Promise.resolve().then(()=>(Et(),$r))).createSignTimeReview=="function"}catch{return!1}}async function cs(){try{let e=await Promise.resolve().then(()=>(yn(),gn));return typeof e.observeReceipt=="function"||typeof e.default=="function"||Object.values(e).some(t=>typeof t=="function")}catch{return!1}}var is,Dt=l(()=>{Ge();At();Yr();Je();is=new Set(["127.0.0.1","::1","localhost"])});var En={};ye(En,{classifyReceipt:()=>se,default:()=>ds,firstHourReport:()=>Ft,probeQuote:()=>ls,probeSigner:()=>us,vaultStatus:()=>fe});async function us(e=process.env){let t=e.ORACLE_SIGNER_HOST||"127.0.0.1",r=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${t}:${r}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function ls(){try{let e=await fetch("https://api.dexscreener.com/latest/dex/search?q=WETH%20USDC",{signal:AbortSignal.timeout(4e3)});if(!e.ok)return{ok:!1,detail:`dexscreener ${e.status}`};let r=(await e.json())?.pairs?.[0];return!r?.chainId||!r?.priceUsd?{ok:!1,detail:"no pair"}:{ok:!0,detail:`${r.chainId} ${r.baseToken?.symbol}/${r.quoteToken?.symbol} $${r.priceUsd}`}}catch(e){return{ok:!1,detail:e instanceof Error?e.message:"quote failed"}}}var ds,xn=l(()=>{Dt();At();ds={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let t=e.argv.includes("--json"),r=De();if(t)return process.stdout.write(`${JSON.stringify({venues:r},null,2)}
5
+ `),0;for(let n of r)process.stdout.write(`${n.status.padEnd(12)} ${n.key.padEnd(16)} ${n.name} exec=${n.execute?"local":"no"}
6
+ `);return 0}}});import ie from"node:fs";import Sn from"node:path";import jt from"node:fs";import Q from"node:path";Ee();var $n="0.19.0",As=`hermes-agent==${$n}`;var Mt="0.12.1",vs=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Mt}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Mt}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function Ln(){return Q.join(X(),"runtime")}function Pn(){return Q.join(Ln(),"venv")}function Bn(e){let t=process.platform==="win32"?"Scripts":"bin",r=process.platform==="win32"?`${e}.exe`:e;return Q.join(Pn(),t,r)}function Fn(){return Bn("hermes")}function Dn(e){let t=process.platform==="win32"&&!Q.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let r of(process.env.PATH||"").split(Q.delimiter))if(r)for(let n of t){let o=Q.join(r,`${e}${n}`);try{if(jt.existsSync(o))return o}catch{}}return null}function qt(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=Fn();if(jt.existsSync(e))return{ok:!0,bin:e,source:"managed"};let t=Dn("hermes");return t?{ok:!0,bin:t,source:"path"}:{ok:!1,bin:null,source:null}}import U from"node:fs";import k from"node:path";Ee();import{existsSync as zt,readFileSync as Mn}from"node:fs";import{dirname as Ut,join as je}from"node:path";import{fileURLToPath as jn}from"node:url";function qn(e){let t=Ut(jn(e));for(let r=0;r<8;r+=1){let n=je(t,"package.json");if(zt(n))try{let i=JSON.parse(Mn(n,"utf8"));if(i&&typeof i.version=="string")return t}catch{}let o=Ut(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function Ht(e,t){let r=qn(t),n=je(r,e);return zt(n)?n:je(r,"dist","assets",e)}var Un=Object.freeze([{id:"oracle",label:"Oracle Native",kind:"oracle",bins:["oracle"],website:!0,detect:!0},{id:"hermes",label:"Hermes Agent",kind:"mcp",bins:["hermes"],mcpTarget:"generic",configKey:"hermes",website:!0,detect:!0},{id:"claude",label:"Claude Code",kind:"mcp",bins:["claude"],mcpTarget:"claude-code",configKey:"claudeCode",website:!0,detect:!0},{id:"claude-desktop",label:"Claude Desktop",kind:"mcp",bins:[],mcpTarget:"claude-desktop",configKey:"claudeDesktop",website:!0,detect:!1},{id:"chatgpt",label:"ChatGPT",kind:"mcp",bins:[],mcpTarget:"chatgpt",configKey:"chatgpt",website:!0,detect:!1},{id:"codex",label:"OpenAI Codex",kind:"mcp",bins:["codex"],mcpTarget:"codex",configKey:"codex",website:!0,detect:!0},{id:"cursor",label:"Cursor",kind:"mcp",bins:["cursor","cursor-agent"],mcpTarget:"cursor",configKey:"cursor",website:!0,detect:!0},{id:"windsurf",label:"Windsurf",kind:"mcp",bins:["windsurf"],mcpTarget:"vscode",configKey:"windsurf",website:!0,detect:!0},{id:"vscode",label:"VS Code / Copilot",kind:"mcp",bins:["code","code-insiders"],mcpTarget:"vscode",configKey:"vscode",website:!0,detect:!0},{id:"openclaw",label:"OpenClaw",kind:"mcp",bins:["openclaw","claw"],mcpTarget:"generic",configKey:"openclaw",website:!0,detect:!0},{id:"perplexity",label:"Perplexity",kind:"mcp",bins:["perplexity","pplx"],mcpTarget:"generic",configKey:"perplexity",website:!0,detect:!0},{id:"manus",label:"Manus",kind:"mcp",bins:["manus"],mcpTarget:"generic",configKey:"manus",website:!0,detect:!0},{id:"prime",label:"Prime Intellect Agent",kind:"mcp",bins:["prime-agent","prime"],mcpTarget:"generic",configKey:"prime",website:!1,detect:!0},{id:"opencode",label:"OpenCode",kind:"mcp",bins:["opencode"],mcpTarget:"generic",configKey:"opencode",website:!1,detect:!0},{id:"aider",label:"Aider",kind:"mcp",bins:["aider"],mcpTarget:"generic",configKey:"aider",website:!1,detect:!0},{id:"continue",label:"Continue",kind:"mcp",bins:["continue"],mcpTarget:"vscode",configKey:"continue",website:!1,detect:!0},{id:"goose",label:"Goose",kind:"mcp",bins:["goose"],mcpTarget:"generic",configKey:"goose",website:!1,detect:!0},{id:"amp",label:"Amp",kind:"mcp",bins:["amp"],mcpTarget:"generic",configKey:"amp",website:!1,detect:!0},{id:"generic",label:"Generic MCP",kind:"mcp",bins:[],mcpTarget:"generic",configKey:"genericMcp",website:!0,detect:!1}]);function Wt(){return Un.filter(e=>e.website)}var qe=Object.freeze(["long_horizon","recursive_fanout","continual_learn","evidence_first","prepare_only"]);function Ue(e=process.env){let t=String(e?.ORACLE_RESEARCH_MODE??e?.ORACLE_RLM_MODE??"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"||t==="research"}var Z=Object.freeze(["oracle_cli","memory_add","memory_remove","memory_search","skill_load","skill_create","skill_list","cron_add","cron_list","cron_remove","meta_analyze","web_fetch","web_search","file_read","file_write","mcp_list","mcp_call","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","learn_skill","workspace_artifact","research_artifact","portfolio_analyze","trade_lifecycle","signal_score","vault_status","signer_status","signer_execute","signer_disarm","receipt_report","watch_create","watch_list","portfolio_snapshot","vision_analyze","browser_exec","xurl","knowledge_search"]),zn="deny",Rs=256*1024;var $s=Object.freeze({version:1,source:"default",defaultDecision:zn,allow:Z,deny:Object.freeze([])});var Hn=Object.freeze(["oracle_cli","memory_search","skill_load","skill_list","web_fetch","web_search","todo_list","todo_set","session_search","research_delegate","rlm","deep_research","clarify","code_eval","research_artifact","portfolio_analyze","trade_lifecycle","signal_score","vault_status","signer_status","receipt_report","watch_list","portfolio_snapshot","vision_analyze","knowledge_search"]),Ls=new Set(Hn);var ze=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Bs=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),D=(e,t=0,r=1)=>Math.min(r,Math.max(t,e)),L=e=>Number.isFinite(Number(e))?Number(e):null,Wn=e=>Math.round(e*1e4)/1e4;function P(e,t,r,n=!0){!n||r===null||!Number.isFinite(r)||e.push({feature:t,value:Wn(r)})}function Gn(e,t){let r=L(e.repeatBuys??e.repeat_buys??e.buyCount),n=L(e.walletWinRate??e.winRate);P(t,"repeat_buys",r===null?null:D((r-1)/4)*.38),P(t,"wallet_win_rate",n===null?null:(D(n)-.5)*.5)}function Jn(e,t){let r=L(e.ageHours??e.poolAgeHours),n=L(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;P(t,"pool_age",r===null?null:r<24?-.42:D(r/720)*.12),P(t,"liquidity",n===null?null:(D(Math.log10(Math.max(1,n))/7)-.5)*.28),P(t,"liquidity_lock",o==null?null:o?.12:-.28)}function Vn(e,t){let r=L(e.floorChange??e.floorChangePct),n=L(e.sales??e.saleCount);P(t,"floor_change",r===null?null:D(r,-1,1)*.35),P(t,"sales_depth",n===null?null:D(n/50)*.18)}function Kn(e,t){let r=L(e.flowImbalance??e.imbalance),n=L(e.fundingRate??e.funding);P(t,"flow_imbalance",r===null?null:D(r,-1,1)*.42),P(t,"funding",n===null?null:-D(n*100,-1,1)*.12)}function Yn(e,t){let r=L(e.marketProbability??e.marketPrice??e.probability),n=L(e.fairProbability??e.referenceProbability??e.fairValue);P(t,"probability_mispricing",r===null||n===null?null:D(n-r,-1,1)*.65);let o=L(e.liquidityUsd??e.liquidity);P(t,"market_liquidity",o===null?null:D(Math.log10(Math.max(1,o))/6)*.12)}var Fs=Object.freeze({wallet:Gn,pool:Jn,nft_floor:Vn,hl_flow:Kn,prediction_market:Yn});function He(e){try{return U.existsSync(e)}catch{return!1}}function xe(e){for(let t of e)if(t&&He(t))return t;return null}function We(e){try{return Ht(e,import.meta.url)}catch{return null}}function Xn(){let e=[k.join(S,"dist/data/desk-data.mjs"),k.join(S,"data/desk-data.mjs"),k.join(S,"src/data/desk-data.mjs")];for(let n of e)if(He(n))try{let i=U.readFileSync(n,"utf8").match(/\bid\s*:\s*["'][a-z0-9-]+["']/gi)||[],s=new Set(i.map(d=>d.toLowerCase()));if(s.size>=20)return{count:s.size,detail:`${s.size} provider ids (bundled desk-data)`}}catch{}let t=[k.join(S,"src/data/providers"),k.join(S,"dist/data/providers"),k.join(S,"data/providers")],r=xe(t);if(!r)return{count:0,detail:"providers dir missing"};try{let n=U.readdirSync(r).filter(o=>o.endsWith(".mjs"));return{count:n.length,detail:`${n.length} provider modules`}}catch(n){return{count:0,detail:n instanceof Error?n.message:String(n)}}}function Gt(){let e=xe([We("skills"),k.join(S,"skills"),k.join(S,"dist/assets/skills"),k.join(S,"assets/skills")]);if(!e)return{count:0,trading:[],building:[]};let t=U.readdirSync(e),r=t.filter(o=>/trade|swap|snipe|farm|hyperliquid|poly|best-exec|circuit|meme|token-research|rfq/i.test(o)),n=t.filter(o=>/launch|builder|protocol|nft|dex-launch|token-launch|security|contract/i.test(o));return{count:t.length,trading:r,building:n}}function Qn(){let e=xe([We("protocols/templates"),k.join(S,"protocols/templates"),k.join(S,"dist/assets/protocols/templates"),k.join(S,"assets/protocols/templates")]);return e?U.readdirSync(e).filter(r=>!r.startsWith(".")):Gt().building.some(r=>/protocol-builder|dex-launch|token-launch/i.test(r))?["(via skills: protocol-builder / launch packs)"]:[]}function Zn(){let e=xe([We("profiles"),k.join(S,"profiles"),k.join(S,"dist/assets/profiles"),k.join(S,"assets/profiles")]);return e?U.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()&&!t.name.startsWith("_")).map(t=>t.name):[]}function eo(){try{if(Z.includes("trade_lifecycle")&&!Z.some(t=>/broadcast|wallet_sign/.test(t)))return!0}catch{}let e=[k.join(S,"src/capability-posture.mjs"),k.join(S,"dist/capability-posture.mjs"),k.join(S,"capability-posture.mjs"),k.join(S,"dist/public-control/policy-schema.mjs"),k.join(S,"README.md"),k.join(S,"package.json")];for(let t of e)if(He(t))try{let r=U.readFileSync(t,"utf8");if(/prepare-only|never takes your key|never.*broadcast/i.test(r))return!0}catch{}return!1}function Jt(e=process.env){let t=[],r=(g,y,x,v=1)=>{t.push({id:g,status:y,detail:x,weight:v})},[n,o]=process.versions.node.split(".").map(Number),i=n>20||n===20&&o>=19;r("node",i?"ok":"fail",`node ${process.versions.node}`,2);let d=["oracle_cli","research_delegate","trade_lifecycle","signal_score","skill_load","learn_skill","code_eval","cron_add","web_fetch"].filter(g=>!Z.includes(g));r("agent_tools",d.length===0?"ok":"warn",d.length===0?`safe tools ${Z.length}; signal_score present`:`missing tools: ${d.join(",")}`,3),r("research_attributes","ok",`attrs [${qe.join(", ")}]; mode=${Ue(e)?"ON":"off"}`,2);let a=Xn();r("providers",a.count>=40?"ok":a.count>=10?"warn":"fail",a.detail,3);let p=Gt();r("skills_trading_build",p.trading.length>=5&&p.building.length>=4?"ok":p.count>=10?"warn":"fail",`${p.count} skills; trading=${p.trading.length} building=${p.building.length}`,3);let m=Qn();r("protocol_templates",m.length>=2?"ok":"warn",m.length?m.join(", "):"none",2);let c=Zn();r("profiles",c.includes("protocol-builder")&&c.includes("oracle")?"ok":c.length>=1?"warn":"fail",c.join(", ")||"none",2),r("signals_engine",ze.length>=4?"ok":"fail",`types: ${ze.join(", ")} (cold / no hot exec)`,2);let f=Wt();r("harness_roster",f.length>=8?"ok":"warn",`${f.length} supported harnesses; Oracle native default; MCP inbound only`,2),r("custody_prepare_only",eo()?"ok":"fail","public plane prepare-only",4);let u=e.ORACLE_DATA_URL||"http://127.0.0.1:8787";r("data_url","ok",u,1);let b=0,w=0;for(let g of t)w+=g.weight,g.status==="ok"?b+=g.weight:g.status==="warn"&&(b+=g.weight*.5);let h=w?Math.round(b/w*100):0,I=!t.some(g=>g.status==="fail")&&h>=70,O=I?`AGENTIC READY ${h}% \u2014 Oracle is the crypto control plane (prepare-only); pair coding harnesses via MCP for build.`:`AGENTIC GAPS ${h}% \u2014 fix fail/warn checks before calling Oracle the default crypto harness.`;return{ok:I,score:b,max:w,pct:h,summary:O,researchMode:Ue(e),attributes:[...qe],packageRoot:S,checks:t}}function An(){let[e,t]=process.versions.node.split(".").map(Number);return e>20||e===20&&t>=19}function fs(e){if(!ie.existsSync(e))return{};let t={};for(let r of ie.readFileSync(e,"utf8").split(/\r?\n/)){let n=r.match(/^([A-Z0-9_]+)=(.*)$/);n&&(t[n[1]]=n[2])}return t}async function ps(e){let t=e.replace(/\/$/,"");return(await Promise.all(["/health","/public/health"].map(async n=>{try{return(await fetch(t+n)).ok}catch{return!1}}))).some(Boolean)}var wm={name:"doctor",summary:"check the read plane (+ optional --agentic readiness score)",group:"read",usage:"oracle doctor [--json] [--agentic] [--first-hour]",async run(e){let t=e.argv.includes("--json"),r=e.argv.includes("--agentic"),n=e.argv.includes("--first-hour"),o=[],i=!1,s=(g,y,x,v=null)=>{o.push({id:g,status:y,detail:x,fix:v}),y==="fail"&&(i=!0)};s("node",An()?"ok":"fail",`node ${process.versions.node}`,An()?null:"install node >= 20.19");let d=e.paths.oracleExecEnvPath(),a=fs(d),p=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||a.ORACLE_ROUTE_ATTESTATION_SECRET||a.MAD_ROUTE_ATTESTATION_SECRET||a.ORACLE_ATTESTATION_SECRET||a.ORACLE_STAMP_HMAC_SECRET;s("attestation_secret",p?"ok":"warn",p?"present":"missing",p?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let m=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",c=await ps(m),f=e.paths.loadDeskRouting&&(process.env.ORACLE_DESK_URL||process.env.ORACLE_PUBLIC_URL)?`desk ${process.env.ORACLE_DESK_URL||process.env.ORACLE_PUBLIC_URL}`:null;s("data_server",c?"ok":"warn",c?`reachable ${m}${f?` (${f})`:""}`:`down ${m}`,c?null:m.includes("127.0.0.1")||m.includes("localhost")?"oracle data serve OR set ~/.config/oracle/desk.json to YOUR_DESK_HOST":"check the desk URL in ~/.config/oracle/desk.json (/public/health)");let u=qt();s("harness_model","ok","Oracle native harness is default; external harnesses are inbound MCP only (oracle harness detect)",null),s("hermes_opt_in","ok",u.ok?`detected ${u.bin} (${u.source}) \u2014 unused unless explicitly opted in`:"not detected \u2014 native-only OK",null);let b=Sn.join(e.paths.hermesRoot(),"profiles"),w=0;ie.existsSync(b)&&(w=ie.readdirSync(b,{withFileTypes:!0}).filter(g=>g.isDirectory()).length),s("hermes_lanes","ok",w>0?`${w} profile dir(s) (optional surface)`:"no Hermes lane profiles (native-only OK)",null);{let g=Sn.join(b,"oracle",".env"),y=[];if(ie.existsSync(g)){let x=ie.readFileSync(g,"utf8");/^TELEGRAM_BOT_TOKEN=.+/m.test(x)&&y.push("telegram"),/^DISCORD_BOT_TOKEN=.+/m.test(x)&&y.push("discord"),/^SLACK_BOT_TOKEN=.+/m.test(x)&&y.push("slack")}y.length?u.ok?s("messaging","ok",`${y.join("/")} configured \xB7 runtime ${u.source}`,null):s("messaging","warn",`${y.join("/")} token set but messaging runtime missing \u2014 bot cannot answer`,"oracle bootstrap, then oracle setup gateway restart"):s("messaging","ok","no channel tokens configured (optional \u2014 oracle setup)",null)}let h=null;if(r){h=Jt(process.env);for(let g of h.checks)s(`agentic_${g.id}`,g.status,g.detail,null)}let I=null;if(n){let{firstHourReport:g,probeReviewModule:y,probeReceiptModule:x}=await Promise.resolve().then(()=>(Dt(),bn)),{probeSigner:v,probeQuote:E}=await Promise.resolve().then(()=>(xn(),En)),[_,V,C,B]=await Promise.all([v(process.env),E(),y(),x()]);I=g({signerReachable:_,quote:V,reviewAvailable:C,receiptAvailable:B});for(let F of I.checks)s(`hour_${F.id}`,F.status,F.detail,F.fix);s("hour_score",I.ok?"ok":"warn",I.firstRunScore.label,null)}let O={ok:!i&&(h?h.ok:!0)&&(I?I.ok:!0),checks:o,...I?{firstHour:I}:{},...h?{agentic:{pct:h.pct,summary:h.summary,attributes:h.attributes,researchMode:h.researchMode}}:{}};if(t)process.stdout.write(JSON.stringify(O,null,2)+`
7
+ `);else{for(let g of o)process.stdout.write(`${g.status.toUpperCase().padEnd(4)} ${g.id}: ${g.detail}
8
+ `),g.fix&&process.stdout.write(` fix: ${g.fix}
9
+ `);h&&process.stdout.write(`
10
+ ${h.summary}
11
+ `)}return O.ok?0:1}};export{wm as default};