@oracle-agent/oracle 0.24.10 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/SETUP.md +22 -0
- package/dist/assets/graphics/assets/arbitrum-lockup.png +0 -0
- package/dist/assets/graphics/assets/avalanche-lockup.png +0 -0
- package/dist/assets/graphics/assets/base-lockup.png +0 -0
- package/dist/assets/graphics/assets/bitcoin-lockup.png +0 -0
- package/dist/assets/graphics/assets/bnb-lockup.png +0 -0
- package/dist/assets/graphics/assets/ethereum-lockup.png +0 -0
- package/dist/assets/graphics/assets/hyperliquid-lockup.png +0 -0
- package/dist/assets/graphics/assets/optimism-lockup.png +0 -0
- package/dist/assets/graphics/assets/oracle-globe.png +0 -0
- package/dist/assets/graphics/assets/polygon-lockup.png +0 -0
- package/dist/assets/graphics/assets/polymarket-lockup.png +0 -0
- package/dist/assets/graphics/assets/polymarket.png +0 -0
- package/dist/assets/graphics/assets/robinhood-lockup.png +0 -0
- package/dist/assets/graphics/assets/solana-lockup.png +0 -0
- package/dist/assets/graphics/assets/stable-lockup.png +0 -0
- package/dist/assets/graphics/oracle_card.py +962 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +45 -44
- package/dist/bin/oracle-data-mcp.mjs +74 -33
- package/dist/bin/oracle.mjs +1 -1
- package/dist/cli/commands/chat.mjs +111 -111
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/eval.mjs +180 -42
- package/dist/cli/commands/farm.mjs +73 -60
- package/dist/cli/commands/model.mjs +118 -118
- package/dist/cli/commands/receipt.mjs +3 -3
- package/dist/cli/commands/sign.mjs +11 -11
- package/dist/cli/commands/signer.mjs +13 -13
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/data/desk-data.mjs +47 -46
- package/dist/index.mjs +48 -47
- package/dist/local-signer/index.mjs +3 -3
- package/package.json +2 -2
- package/public/oracle-splash/downloads/index.html +4 -4
- package/public/oracle-splash/index.html +1 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var y={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}},be=new Map(Object.values(y).map(e=>[e.chainId,e]));import T from"node:fs";import C from"node:path";import{homedir as ne}from"node:os";function x(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"}}import c from"node:path";import re from"node:os";import{createHash as te,randomBytes as kn}from"node:crypto";import{Transaction as Nn}from"@scure/btc-signer";import{ed25519 as Cn}from"@noble/curves/ed25519.js";import{base58 as dt}from"@scure/base";import{Interface as J,MaxUint256 as ir,isAddress as ar,keccak256 as sr,toUtf8Bytes as cr}from"ethers";import{Interface as D,isAddress as qe}from"ethers";import{isAddress as Ce}from"ethers";var We=new D(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as W,isAddress as He}from"ethers";var Ze=new W(["function approve(address spender,uint256 amount) returns (bool)"]),Xe=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var mr=new J(["function approve(address spender,uint256 amount) returns (bool)"]);var wr=300*1e3,gr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as br,NETWORK as vr,OutScript as Ar,RawTx as Or,SigHash as Tr,TEST_NETWORK as Ir,Transaction as _r}from"@scure/btc-signer";import{createHash as H}from"node:crypto";import{base58 as Rr}from"@scure/base";import{getCompiledTransactionMessageDecoder as Br}from"@solana/transaction-messages";var _=e=>H("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),Pr=new Map([[_("route"),{name:"route",prefixBytes:0}],[_("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var z=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol"]);var Gr=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0});var K=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"}}),zr=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"}}),Kr=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"}});var Z=Object.freeze([...z]),Zr=Object.freeze({...K});import{ed25519 as Qr}from"@noble/curves/ed25519.js";import{base58 as rt}from"@scure/base";import{RawTx as nt,SigHash as ot,Transaction as it}from"@scure/btc-signer";import{Transaction as st}from"ethers";var At=Object.freeze({N:1<<17,r:8,p:1}),Ot=256*1024*1024,Tt=16*1024;import{homedir as A}from"node:os";import{join as O}from"node:path";var L=process.env.ORACLE_PUBLIC_DESKTOP==="1",Q=L?process.env.ORACLE_CONFIG_DIR||O(A(),".config","oracle"):O(A(),".config","oracle"),Lt=L?Q:O(A(),".config","mad-desk");var Pt="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 $t=Promise.resolve();import{Wallet as Ht}from"ethers";import{base58 as zt}from"@scure/base";import{ed25519 as Zt}from"@noble/curves/ed25519.js";import{NETWORK as Yt,TEST_NETWORK as Qt,WIF as en,p2wpkh as rn}from"@scure/btc-signer";import{pubECDSA as nn}from"@scure/btc-signer/utils.js";function R(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||c.join(process.env.XDG_STATE_HOME||c.join(re.homedir(),".local","state"),"oracle"),r=te("sha256").update(c.resolve(e)).digest("hex").slice(0,16);return{vault:c.join(e,"vault.json"),policy:c.join(e,"signer-policy.json"),policyKey:c.join(e,"policy-integrity-key"),policyAnchor:c.join(t,`signer-policy-${r}.high-water`),ledger:c.join(e,"signer-ledger.json"),ledgerAnchor:c.join(t,`signer-ledger-${r}.high-water`),token:c.join(e,"signer-token"),lock:c.join(t,`signer-${r}.lock`)}}function oe(){return process.env.ORACLE_CONFIG_DIR||C.join(ne(),".config","oracle")}function h(){let e=R(C.join(oe(),"signer")),t=T.existsSync(e.vault),r=T.existsSync(e.lock),o=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:T.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:o,bridge:o},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var to=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 M from"node:fs";import he from"node:path";import w from"node:fs";import ie from"node:os";import d from"node:path";import{fileURLToPath as ae}from"node:url";var se=d.dirname(ae(import.meta.url)),co=d.resolve(se,"../..");function B(){return process.env.ORACLE_FAKE_HOME||ie.homedir()}function ce(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function g(){return ce()?process.env.ORACLE_CONFIG_DIR||d.join(B(),".config","oracle"):d.join(B(),".config","oracle")}function ue(){return d.join(g(),"desk.json")}function le(){return d.join(g(),"env")}function f({force:e=!1}={}){if(f._done&&!e)return f._result||null;f._done=!0;let t={},r=(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,t[i]=a))};try{let i=le();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)),r(a[1],s)}}catch{}try{let i=ue();if(w.existsSync(i)){let n=JSON.parse(w.readFileSync(i,"utf8"));n&&typeof n=="object"&&(r("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),r("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),r("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),r("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),r("ORACLE_EXEC_URL",n.execUrl),r("MAD_DESK_URL",n.deskUrl||n.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)),f._result=Object.keys(t).length?t:null,f._result}try{f()}catch{}var fe=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","custom","anthropic-oauth","openai-codex","xai-oauth"]);function E(e){return String(e||"").trim()||void 0}function de(e,{required:t=!1}={}){let r=E(e)?.toLowerCase();if(!r){if(t)throw new Error("model provider is required");return}if(!fe.has(r))throw new Error(`unsupported provider: ${r}`);return r}function pe(e,{required:t=!1}={}){let r=E(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 me(e){let t=E(e);if(!t||t.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(t)}catch{throw new Error("invalid custom base URL")}let o=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),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 P({provider:e,model:t,baseUrl:r}={},{requireModel:o=!1}={}){let i=de(e),n=pe(t,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:me(r)};if(E(r))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var we=new Set(["auto","standalone","hermes","remote","arch"]);function ge(){return he.join(g(),"model.json")}function p(e){return String(e||"").trim()||void 0}function Ee(e={}){let t=p(e.backend)?.toLowerCase()||"auto",r=P({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:t==="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),u=p(e.computePath||e.remotePath);if(!we.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(t==="remote"&&!a)throw new Error("remote backend requires computeHost");return{backend:t,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...n?{reasoningEffort:n}:{},...a?{computeHost:a}:{},...s?{computeUser:s}:{},...u?{computePath:u}:{}}}function $(){let e=ge();if(!M.existsSync(e))return null;try{return Ee(JSON.parse(M.readFileSync(e,"utf8")))}catch{return null}}var Se=new Set(["127.0.0.1","::1","localhost"]);function I({env:e=process.env,vault:t=null}={}){let r=t||h(),o=[];for(let[i,n]of Object.entries(y)){let a=(n.rpcEnv||[]).some(u=>String(e[u]||"").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:!!(r.vaultExists&&r.armed&&!r.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 ye({env:e=process.env,model:t=$(),vault:r=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],a=(l,S,F,q=null)=>n.push({id:l,status:S,detail:F,fix:q}),s=(()=>{let[l,S]=process.versions.node.split(".").map(Number);return l>20||l===20&&S>=19})();a("node",s?"ok":"fail",`node ${process.versions.node}`,s?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 u=e.ORACLE_SIGNER_HOST||"127.0.0.1";return Se.has(u)?a("signer",o?"ok":"warn",o?`loopback ${u}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${u} 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(l=>l.status==="fail"),checks:n,venues:I({env:e,vault:r})}}async function Oo(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 To(){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 Io={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=I();if(t)return process.stdout.write(`${JSON.stringify({venues:r},null,2)}
|
|
1
|
+
var b={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}},ke=new Map(Object.values(b).map(e=>[e.chainId,e]));import I from"node:fs";import R from"node:path";import{homedir as ce}from"node:os";function S(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"}}import c from"node:path";import ae from"node:os";import{createHash as se,randomBytes as go}from"node:crypto";import{Transaction as Eo}from"@scure/btc-signer";import{ed25519 as So}from"@noble/curves/ed25519.js";import{base58 as Vt}from"@scure/base";import{Interface as H,MaxUint256 as lr,isAddress as dr,keccak256 as fr,toUtf8Bytes as pr}from"ethers";import{Interface as D,isAddress as He}from"ethers";import{isAddress as qe}from"ethers";var ze=new D(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as W,isAddress as Xe}from"ethers";var rr=new W(["function approve(address spender,uint256 amount) returns (bool)"]),tr=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});var Er=new H(["function approve(address spender,uint256 amount) returns (bool)"]);var Sr=300*1e3,xr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();import{Address as kr,NETWORK as Or,OutScript as Lr,RawTx as _r,SigHash as Nr,TEST_NETWORK as Cr,Transaction as Rr}from"@scure/btc-signer";import{createHash as G}from"node:crypto";import{base58 as $r}from"@scure/base";import{getCompiledTransactionMessageDecoder as Fr}from"@solana/transaction-messages";var O=e=>G("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),Ur=new Map([[O("route"),{name:"route",prefixBytes:0}],[O("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]);var Dr=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-stake-delegate":"delegate"}),Wr=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-stake-delegate":"tokenDelegate"});var Jr="0x"+"00".repeat(32);var V=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Kr=Object.freeze(V.map(e=>e[0]));var Z=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]);var dt=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0});var Q=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"}}),ft=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"}}),pt=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"}});var ee=Object.freeze([...Z]),mt=Object.freeze({...Q});import{ed25519 as _t}from"@noble/curves/ed25519.js";import{base58 as Ct}from"@scure/base";import{RawTx as Bt,SigHash as Pt,Transaction as Mt}from"@scure/btc-signer";import{Transaction as qt,keccak256 as Ft,verifyTypedData as Ut}from"ethers";import{encode as gt}from"@msgpack/msgpack";import{keccak256 as Et,verifyTypedData as bt}from"ethers";var St=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),xt=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var an=Object.freeze({N:1<<17,r:8,p:1}),sn=256*1024*1024,cn=16*1024;import{homedir as v}from"node:os";import{join as T}from"node:path";var _=process.env.ORACLE_PUBLIC_DESKTOP==="1",oe=_?process.env.ORACLE_CONFIG_DIR||T(v(),".config","oracle"):T(v(),".config","oracle"),fn=_?oe:T(v(),".config","mad-desk");var gn="0".repeat(64),yn=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 En=Promise.resolve();import{Wallet as On}from"ethers";import{base58 as _n}from"@scure/base";import{ed25519 as Cn}from"@noble/curves/ed25519.js";import{NETWORK as Bn,TEST_NETWORK as Pn,WIF as Mn,p2wpkh as $n}from"@scure/btc-signer";import{pubECDSA as Fn}from"@scure/btc-signer/utils.js";function C(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||c.join(process.env.XDG_STATE_HOME||c.join(ae.homedir(),".local","state"),"oracle"),r=se("sha256").update(c.resolve(e)).digest("hex").slice(0,16);return{vault:c.join(e,"vault.json"),policy:c.join(e,"signer-policy.json"),policyKey:c.join(e,"policy-integrity-key"),policyAnchor:c.join(t,`signer-policy-${r}.high-water`),ledger:c.join(e,"signer-ledger.json"),ledgerAnchor:c.join(t,`signer-ledger-${r}.high-water`),token:c.join(e,"signer-token"),lock:c.join(t,`signer-${r}.lock`)}}function ue(){return process.env.ORACLE_CONFIG_DIR||R.join(ce(),".config","oracle")}function h(){let e=C(R.join(ue(),"signer")),t=I.existsSync(e.vault),r=I.existsSync(e.lock),o=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:I.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:o,bridge:o},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var Xo=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 M from"node:fs";import be from"node:path";import w from"node:fs";import le from"node:os";import f from"node:path";import{fileURLToPath as de}from"node:url";var fe=f.dirname(de(import.meta.url)),ni=f.resolve(fe,"../..");function B(){return process.env.ORACLE_FAKE_HOME||le.homedir()}function pe(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function g(){return pe()?process.env.ORACLE_CONFIG_DIR||f.join(B(),".config","oracle"):f.join(B(),".config","oracle")}function me(){return f.join(g(),"desk.json")}function he(){return f.join(g(),"env")}function d({force:e=!1}={}){if(d._done&&!e)return d._result||null;d._done=!0;let t={},r=(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,t[i]=a))};try{let i=he();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)),r(a[1],s)}}catch{}try{let i=me();if(w.existsSync(i)){let n=JSON.parse(w.readFileSync(i,"utf8"));n&&typeof n=="object"&&(r("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),r("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),r("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),r("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),r("ORACLE_EXEC_URL",n.execUrl),r("MAD_DESK_URL",n.deskUrl||n.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)),d._result=Object.keys(t).length?t:null,d._result}try{d()}catch{}var we=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 ge(e,{required:t=!1}={}){let r=y(e)?.toLowerCase();if(!r){if(t)throw new Error("model provider is required");return}if(!we.has(r))throw new Error(`unsupported provider: ${r}`);return r}function ye(e,{required:t=!1}={}){let r=y(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 Ee(e){let t=y(e);if(!t||t.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(t)}catch{throw new Error("invalid custom base URL")}let o=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),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 P({provider:e,model:t,baseUrl:r}={},{requireModel:o=!1}={}){let i=ge(e),n=ye(t,{required:o});if(i==="custom")return{provider:i,...n?{model:n}:{},baseUrl:Ee(r)};if(y(r))throw new Error("baseUrl is only supported for the custom provider");return{...i?{provider:i}:{},...n?{model:n}:{}}}var Se=new Set(["auto","standalone","hermes","remote","arch"]);function xe(){return be.join(g(),"model.json")}function p(e){return String(e||"").trim()||void 0}function Ae(e={}){let t=p(e.backend)?.toLowerCase()||"auto",r=P({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:t==="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),u=p(e.computePath||e.remotePath);if(!Se.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(t==="remote"&&!a)throw new Error("remote backend requires computeHost");return{backend:t,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(i)&&i>0?{contextLength:i}:{},...n?{reasoningEffort:n}:{},...a?{computeHost:a}:{},...s?{computeUser:s}:{},...u?{computePath:u}:{}}}function $(){let e=xe();if(!M.existsSync(e))return null;try{return Ae(JSON.parse(M.readFileSync(e,"utf8")))}catch{return null}}var ve=new Set(["127.0.0.1","::1","localhost"]);function k({env:e=process.env,vault:t=null}={}){let r=t||h(),o=[];for(let[i,n]of Object.entries(b)){let a=(n.rpcEnv||[]).some(u=>String(e[u]||"").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:!!(r.vaultExists&&r.armed&&!r.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 Te({env:e=process.env,model:t=$(),vault:r=h(),signerReachable:o=!1,quote:i=null}={}){let n=[],a=(l,E,q,F=null)=>n.push({id:l,status:E,detail:q,fix:F}),s=(()=>{let[l,E]=process.versions.node.split(".").map(Number);return l>20||l===20&&E>=19})();a("node",s?"ok":"fail",`node ${process.versions.node}`,s?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 u=e.ORACLE_SIGNER_HOST||"127.0.0.1";return ve.has(u)?a("signer",o?"ok":"warn",o?`loopback ${u}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",o?null:"oracle signer"):a("signer","fail",`signer host ${u} 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(l=>l.status==="fail"),checks:n,venues:k({env:e,vault:r})}}async function Ei(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 bi(){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 Si={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=k();if(t)return process.stdout.write(`${JSON.stringify({venues:r},null,2)}
|
|
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{
|
|
3
|
+
`);return 0}};export{S as classifyReceipt,Si as default,Te as firstHourReport,bi as probeQuote,Ei as probeSigner,h as vaultStatus};
|