@oracle-agent/oracle 0.24.4 → 0.24.6

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,3 +1,3 @@
1
- var E={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}},oe=new Map(Object.values(E).map(e=>[e.chainId,e]));import m from"node:fs";import C from"node:path";import{homedir as M}from"node:os";function x(e){let n=e?.transactionHash||e?.hash||e?.txid||null;return n?{happened:!0,hash:String(n),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}import l from"node:path";var U=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),ce=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var ue=Object.freeze([...U]);var ye=Object.freeze({N:1<<17,r:8,p:1}),Se=256*1024*1024,Ee=16*1024;import{homedir as v}from"node:os";import{join as A}from"node:path";var O=process.env.ORACLE_PUBLIC_DESKTOP==="1",D=O?process.env.ORACLE_CONFIG_DIR||A(v(),".config","oracle"):A(v(),".config","oracle"),_e=O?D:A(v(),".config","mad-desk");var ke="0".repeat(64),Le=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"});var Pe=Promise.resolve();function R(e){return{vault:l.join(e,"vault.json"),policy:l.join(e,"signer-policy.json"),policyKey:l.join(e,"policy-integrity-key"),ledger:l.join(e,"signer-ledger.json"),token:l.join(e,"signer-token"),lock:l.join(e,"signer.lock")}}function $(){return process.env.ORACLE_CONFIG_DIR||C.join(M(),".config","oracle")}function h(){let e=R(C.join($(),"signer"));return{vaultExists:m.existsSync(e.vault),policyConfigured:m.existsSync(e.policy),armed:m.existsSync(e.vault)&&!m.existsSync(e.lock),disarmed:m.existsSync(e.lock),note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var lr=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_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}}}]);import P from"node:fs";import Z from"node:path";import g from"node:fs";import F from"node:os";import f from"node:path";import{fileURLToPath as H}from"node:url";var q=f.dirname(H(import.meta.url)),gr=f.resolve(q,"../..");function k(){return process.env.ORACLE_FAKE_HOME||F.homedir()}function G(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function w(){return G()?process.env.ORACLE_CONFIG_DIR||f.join(k(),".config","oracle"):f.join(k(),".config","oracle")}function W(){return f.join(w(),"desk.json")}function J(){return f.join(w(),"env")}function p({force:e=!1}={}){if(p._done&&!e)return p._result||null;p._done=!0;let n={},r=(i,t)=>{if(t==null)return;let s=String(t).trim();s&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=s,n[i]=s))};try{let i=J();if(g.existsSync(i))for(let t of g.readFileSync(i,"utf8").split(/\r?\n/)){let s=t.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let a=s[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),r(s[1],a)}}catch{}try{let i=W();if(g.existsSync(i)){let t=JSON.parse(g.readFileSync(i,"utf8"));t&&typeof t=="object"&&(r("ORACLE_DESK_URL",t.deskUrl||t.dataUrl||t.url),r("ORACLE_DATA_URL",t.dataUrl||t.deskUrl||t.url),r("ORACLE_API_URL",t.apiUrl||t.dataUrl||t.deskUrl),r("ORACLE_PUBLIC_URL",t.publicUrl||t.deskUrl||t.dataUrl),r("ORACLE_EXEC_URL",t.execUrl),r("MAD_DESK_URL",t.deskUrl||t.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(r("ORACLE_DESK_URL",o),r("ORACLE_DATA_URL",o),r("ORACLE_API_URL",o),r("ORACLE_PUBLIC_URL",o),r("MAD_DESK_URL",o)),p._result=Object.keys(n).length?n:null,p._result}try{p()}catch{}var z=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","custom","anthropic-oauth","openai-codex","xai-oauth"]);function y(e){return String(e||"").trim()||void 0}function V(e,{required:n=!1}={}){let r=y(e)?.toLowerCase();if(!r){if(n)throw new Error("model provider is required");return}if(!z.has(r))throw new Error(`unsupported provider: ${r}`);return r}function K(e,{required:n=!1}={}){let r=y(e);if(!r){if(n)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 Y(e){let n=y(e);if(!n||n.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(n)}catch{throw new Error("invalid custom base URL")}let o=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),i=o==="localhost"||o==="127.0.0.1"||o==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&i)||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 L({provider:e,model:n,baseUrl:r}={},{requireModel:o=!1}={}){let i=V(e),t=K(n,{required:o});if(i==="custom")return{provider:i,...t?{model:t}:{},baseUrl:Y(r)};if(y(r))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...t?{model:t}:{}}}var X=new Set(["auto","standalone","hermes","remote","arch"]);function Q(){return Z.join(w(),"model.json")}function d(e){return String(e||"").trim()||void 0}function ee(e={}){let n=d(e.backend)?.toLowerCase()||"auto",r=L({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:n==="standalone"}),o=d(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),t=d(e.reasoningEffort),s=d(e.computeHost||e.remoteHost),a=d(e.computeUser||e.remoteUser),c=d(e.computePath||e.remotePath);if(!X.has(n))throw new Error(`unsupported backend: ${n}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(n))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(n==="remote"&&!s)throw new Error("remote backend requires computeHost");return{backend:n,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...t?{reasoningEffort:t}:{},...s?{computeHost:s}:{},...a?{computeUser:a}:{},...c?{computePath:c}:{}}}function I(){let e=Q();if(!P.existsSync(e))return null;try{return ee(JSON.parse(P.readFileSync(e,"utf8")))}catch{return null}}var re=new Set(["127.0.0.1","::1","localhost"]);function _({env:e=process.env,vault:n=null}={}){let r=n||h(),o=[];for(let[i,t]of Object.entries(E)){let s=(t.rpcEnv||[]).some(c=>String(e[c]||"").trim()),a="prepare";t.evm?s&&(a="live"):a="unavailable",o.push({key:i,chainId:t.chainId,name:t.name,family:"evm",status:a,execute:!!(r.vaultExists&&r.armed&&!r.disarmed),note:s?"rpc configured":"public read/prepare; set RPC for live reads"})}return o.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"}),o}function te({env:e=process.env,model:n=I(),vault:r=h(),signerReachable:o=!1,quote:i=null}={}){let t=[],s=(u,S,N,T=null)=>t.push({id:u,status:S,detail:N,fix:T}),a=(()=>{let[u,S]=process.versions.node.split(".").map(Number);return u>20||u===20&&S>=19})();s("node",a?"ok":"fail",`node ${process.versions.node}`,a?null:"install node >= 20.19"),n?n.backend==="hermes"?s("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):s("model","ok",`${n.backend||"auto"} ${n.provider||""} ${n.model||""}`.trim()):s("model","fail","no model.json","oracle setup model"),r.vaultExists?r.disarmed?s("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):s("vault",r.armed?"ok":"warn",r.armed?"present, armed":"present, not armed"):s("vault","fail","no local vault","oracle sign init");let c=e.ORACLE_SIGNER_HOST||"127.0.0.1";return re.has(c)?s("signer",o?"ok":"warn",o?`loopback ${c}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):s("signer","fail",`signer host ${c} is not loopback`,"unset ORACLE_SIGNER_HOST"),i?i.ok?s("quote","ok",i.detail||"net quote returned"):s("quote","warn",i.detail||"quote unavailable","check network / oracle data serve"):s("quote","warn","quote not probed",null),{ok:!t.some(u=>u.status==="fail"),checks:t,venues:_({env:e,vault:r})}}async function Ir(e=process.env){let n=e.ORACLE_SIGNER_HOST||"127.0.0.1",r=e.ORACLE_SIGNER_PORT||9462;try{return(await fetch(`http://${n}:${r}/status`,{signal:AbortSignal.timeout(1500)})).ok}catch{return!1}}async function Nr(){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 Tr={name:"venues",summary:"label every shipped venue live / prepare / unavailable",group:"read",usage:"oracle venues [--json]",async run(e){let n=e.argv.includes("--json"),r=_();if(n)return process.stdout.write(`${JSON.stringify({venues:r},null,2)}
2
- `),0;for(let o of r)process.stdout.write(`${o.status.padEnd(12)} ${o.key.padEnd(16)} ${o.name} exec=${o.execute?"local":"no"}
3
- `);return 0}};export{x as classifyReceipt,Tr as default,te as firstHourReport,Nr as probeQuote,Ir as probeSigner,h as vaultStatus};
1
+ var E={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}},le=new Map(Object.values(E).map(e=>[e.chainId,e]));import O from"node:fs";import k from"node:path";import{homedir as J}from"node:os";function S(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"}}import u from"node:path";import{Interface as q,MaxUint256 as Ke,isAddress as Ye,keccak256 as Xe,toUtf8Bytes as Ze}from"ethers";import{Interface as D,isAddress as Ie}from"ethers";import{isAddress as ye}from"ethers";var Le=new D(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as U,isAddress as Be}from"ethers";var Ue=new U(["function approve(address spender,uint256 amount) returns (bool)"]),qe=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var ot=new q(["function approve(address spender,uint256 amount) returns (bool)"]);var F=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),ut=Object.freeze({swap:5,bridge:5,perps:0,nft:0});var H=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"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}});var ft=Object.freeze([...F]),dt=Object.freeze({...H});var Ot=Object.freeze({N:1<<17,r:8,p:1}),_t=256*1024*1024,Nt=16*1024;import{homedir as y}from"node:os";import{join as A}from"node:path";var N=process.env.ORACLE_PUBLIC_DESKTOP==="1",V=N?process.env.ORACLE_CONFIG_DIR||A(y(),".config","oracle"):A(y(),".config","oracle"),Tt=N?V:A(y(),".config","mad-desk");var Bt="0".repeat(64),Mt=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"});var jt=Promise.resolve();function I(e){return{vault:u.join(e,"vault.json"),policy:u.join(e,"signer-policy.json"),policyKey:u.join(e,"policy-integrity-key"),triggerAuthorityPublicKey:u.join(e,"trigger-attestation-authority.pub"),ledger:u.join(e,"signer-ledger.json"),token:u.join(e,"signer-token"),lock:u.join(e,"signer.lock")}}function z(){return process.env.ORACLE_CONFIG_DIR||k.join(J(),".config","oracle")}function h(){let e=I(k.join(z(),"signer")),r=O.existsSync(e.vault),t=O.existsSync(e.lock),o=r?t?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:r,policyConfigured:O.existsSync(e.policy),armed:r&&!t,disarmed:t,capabilities:{swap:o,bridge:o},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var wr=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_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}}}]);import L from"node:fs";import ie from"node:path";import w from"node:fs";import K from"node:os";import l from"node:path";import{fileURLToPath as Y}from"node:url";var X=l.dirname(Y(import.meta.url)),vr=l.resolve(X,"../..");function T(){return process.env.ORACLE_FAKE_HOME||K.homedir()}function Z(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function g(){return Z()?process.env.ORACLE_CONFIG_DIR||l.join(T(),".config","oracle"):l.join(T(),".config","oracle")}function Q(){return l.join(g(),"desk.json")}function ee(){return l.join(g(),"env")}function d({force:e=!1}={}){if(d._done&&!e)return d._result||null;d._done=!0;let r={},t=(i,n)=>{if(n==null)return;let a=String(n).trim();a&&(process.env[i]!=null&&String(process.env[i]).trim()!==""||(process.env[i]=a,r[i]=a))};try{let i=ee();if(w.existsSync(i))for(let n of w.readFileSync(i,"utf8").split(/\r?\n/)){let a=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let s=a[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),t(a[1],s)}}catch{}try{let i=Q();if(w.existsSync(i)){let n=JSON.parse(w.readFileSync(i,"utf8"));n&&typeof n=="object"&&(t("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),t("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),t("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),t("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),t("ORACLE_EXEC_URL",n.execUrl),t("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(t("ORACLE_DESK_URL",o),t("ORACLE_DATA_URL",o),t("ORACLE_API_URL",o),t("ORACLE_PUBLIC_URL",o),t("MAD_DESK_URL",o)),d._result=Object.keys(r).length?r:null,d._result}try{d()}catch{}var te=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","custom","anthropic-oauth","openai-codex","xai-oauth"]);function b(e){return String(e||"").trim()||void 0}function re(e,{required:r=!1}={}){let t=b(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!te.has(t))throw new Error(`unsupported provider: ${t}`);return t}function ne(e,{required:r=!1}={}){let t=b(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 oe(e){let r=b(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 o=t.hostname.toLowerCase().replace(/^\[|\]$/g,""),i=o==="localhost"||o==="127.0.0.1"||o==="::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 R({provider:e,model:r,baseUrl:t}={},{requireModel:o=!1}={}){let i=re(e),n=ne(r,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:oe(t)};if(b(t))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var ae=new Set(["auto","standalone","hermes","remote","arch"]);function se(){return ie.join(g(),"model.json")}function p(e){return String(e||"").trim()||void 0}function ce(e={}){let r=p(e.backend)?.toLowerCase()||"auto",t=R({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),o=p(e.apiKeyEnv),i=Number.parseInt(String(e.contextLength||""),10),n=p(e.reasoningEffort),a=p(e.computeHost||e.remoteHost),s=p(e.computeUser||e.remoteUser),c=p(e.computePath||e.remotePath);if(!ae.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(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))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,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...n?{reasoningEffort:n}:{},...a?{computeHost:a}:{},...s?{computeUser:s}:{},...c?{computePath:c}:{}}}function $(){let e=se();if(!L.existsSync(e))return null;try{return ce(JSON.parse(L.readFileSync(e,"utf8")))}catch{return null}}var ue=new Set(["127.0.0.1","::1","localhost"]);function _({env:e=process.env,vault:r=null}={}){let t=r||h(),o=[];for(let[i,n]of Object.entries(E)){let a=(n.rpcEnv||[]).some(c=>String(e[c]||"").trim()),s="prepare";n.evm?a&&(s="live"):s="unavailable",o.push({key:i,chainId:n.chainId,name:n.name,family:"evm",status:s,execute:!!(t.vaultExists&&t.armed&&!t.disarmed),note:a?"rpc configured":"public read/prepare; set RPC for live reads"})}return o.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"}),o}function fe({env:e=process.env,model:r=$(),vault:t=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],a=(f,x,P,B=null)=>n.push({id:f,status:x,detail:P,fix:B}),s=(()=>{let[f,x]=process.versions.node.split(".").map(Number);return f>20||f===20&&x>=19})();a("node",s?"ok":"fail",`node ${process.versions.node}`,s?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 c=e.ORACLE_SIGNER_HOST||"127.0.0.1";return ue.has(c)?a("signer",o?"ok":"warn",o?`loopback ${c}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${c} 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:!n.some(f=>f.status==="fail"),checks:n,venues:_({env:e,vault:t})}}async function jr(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 Dr(){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 Ur={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=_();if(r)return process.stdout.write(`${JSON.stringify({venues:t},null,2)}
2
+ `),0;for(let o of t)process.stdout.write(`${o.status.padEnd(12)} ${o.key.padEnd(16)} ${o.name} exec=${o.execute?"local":"no"}
3
+ `);return 0}};export{S as classifyReceipt,Ur as default,fe as firstHourReport,Dr as probeQuote,jr as probeSigner,h as vaultStatus};