@oracle-agent/oracle 0.24.2 → 0.24.3

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,6 +1,6 @@
1
1
  var Be=Object.defineProperty;var f=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};var le=(e,r)=>{for(var t in r)Be(e,t,{get:r[t],enumerable:!0})};import B from"node:fs";import Fe from"node:os";import C from"node:path";import{fileURLToPath as He}from"node:url";function V(){return process.env.ORACLE_FAKE_HOME||Fe.homedir()}function qe(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function T(){return qe()?process.env.ORACLE_CONFIG_DIR||C.join(V(),".config","oracle"):C.join(V(),".config","oracle")}function ze(){return C.join(T(),"desk.json")}function Ke(){return C.join(T(),"env")}function R({force:e=!1}={}){if(R._done&&!e)return R._result||null;R._done=!0;let r={},t=(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,r[o]=s))};try{let o=Ke();if(B.existsSync(o))for(let i of B.readFileSync(o,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let c=s[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),t(s[1],c)}}catch{}try{let o=ze();if(B.existsSync(o)){let i=JSON.parse(B.readFileSync(o,"utf8"));i&&typeof i=="object"&&(t("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),t("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),t("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),t("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),t("ORACLE_EXEC_URL",i.execUrl),t("MAD_DESK_URL",i.deskUrl||i.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)),R._result=Object.keys(r).length?r:null,R._result}var Ge,l,F=f(()=>{Ge=C.dirname(He(import.meta.url)),l=C.resolve(Ge,"../..");try{R()}catch{}});var ee,wr,Se=f(()=>{ee={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}},wr=new Map(Object.values(ee).map(e=>[e.chainId,e]))});function U(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 te=f(()=>{});var _e=f(()=>{});var ht,br,vr,re=f(()=>{ht=new Set(["evm","evm-swap","evm-bridge","btc","sol"]),br=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),vr=Object.freeze([...ht])});var ne=f(()=>{re()});var Ee=f(()=>{ne()});var Pr,Nr,jr,G=f(()=>{Pr=Object.freeze({N:1<<17,r:8,p:1}),Nr=256*1024*1024,jr=16*1024});import{homedir as oe}from"node:os";import{join as ie}from"node:path";var be,yt,$r,ve=f(()=>{be=process.env.ORACLE_PUBLIC_DESKTOP==="1",yt=be?process.env.ORACLE_CONFIG_DIR||ie(oe(),".config","oracle"):ie(oe(),".config","oracle"),$r=be?yt:ie(oe(),".config","mad-desk")});var Gr,qr,zr,xe=f(()=>{ve();Gr="0".repeat(64),qr=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"}),zr=Promise.resolve()});var ke=f(()=>{xe();G();ne()});var Oe=f(()=>{});import N from"node:path";function Re(e){return{vault:N.join(e,"vault.json"),policy:N.join(e,"signer-policy.json"),policyKey:N.join(e,"policy-integrity-key"),ledger:N.join(e,"signer-ledger.json"),token:N.join(e,"signer-token"),lock:N.join(e,"signer.lock")}}var Ce=f(()=>{Ee();G();ke();Oe();re()});import D from"node:fs";import Te from"node:path";import{homedir as St}from"node:os";function _t(){return process.env.ORACLE_CONFIG_DIR||Te.join(St(),".config","oracle")}function $(){let e=Re(Te.join(_t(),"signer"));return{vaultExists:D.existsSync(e.vault),policyConfigured:D.existsSync(e.policy),armed:D.existsSync(e.vault)&&!D.existsSync(e.lock),disarmed:D.existsSync(e.lock),note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}var An,se=f(()=>{te();_e();Ce();G();An=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}}}])});function q(e){return String(e||"").trim()||void 0}function bt(e,{required:r=!1}={}){let t=q(e)?.toLowerCase();if(!t){if(r)throw new Error("model provider is required");return}if(!Et.has(t))throw new Error(`unsupported provider: ${t}`);return t}function vt(e,{required:r=!1}={}){let t=q(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 xt(e){let r=q(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,""),o=n==="localhost"||n==="127.0.0.1"||n==="::1";if(t.protocol!=="https:"&&!(t.protocol==="http:"&&o)||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 Le({provider:e,model:r,baseUrl:t}={},{requireModel:n=!1}={}){let o=bt(e),i=vt(r,{required:n});if(o==="custom")return{provider:o,...i?{model:i}:{},baseUrl:xt(t)};if(q(t))throw new Error("baseUrl is only supported for the custom provider");return{...o?{provider:o}:{},...i?{model:i}:{}}}var Et,Pe=f(()=>{Et=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","custom","anthropic-oauth","openai-codex","xai-oauth"])});import Ne from"node:fs";import At from"node:path";function Ot(){return At.join(T(),"model.json")}function j(e){return String(e||"").trim()||void 0}function Rt(e={}){let r=j(e.backend)?.toLowerCase()||"auto",t=Le({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:r==="standalone"}),n=j(e.apiKeyEnv),o=Number.parseInt(String(e.contextLength||""),10),i=j(e.reasoningEffort),s=j(e.computeHost||e.remoteHost),c=j(e.computeUser||e.remoteUser),d=j(e.computePath||e.remotePath);if(!kt.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"&&!s)throw new Error("remote backend requires computeHost");return{backend:r,...t,...n?{apiKeyEnv:n}:{},...Number.isFinite(o)&&o>0?{contextLength:o}:{},...i?{reasoningEffort:i}:{},...s?{computeHost:s}:{},...c?{computeUser:c}:{},...d?{computePath:d}:{}}}function je(){let e=Ot();if(!Ne.existsSync(e))return null;try{return Rt(JSON.parse(Ne.readFileSync(e,"utf8")))}catch{return null}}var kt,Ie=f(()=>{F();Pe();kt=new Set(["auto","standalone","hermes","remote","arch"])});var Ue={};le(Ue,{classifyReceipt:()=>U,configDir:()=>Pt,firstHourReport:()=>ae,venueMap:()=>z});import Ct from"node:path";import{homedir as Tt}from"node:os";function Pt(e=process.env){return e.ORACLE_CONFIG_DIR||Ct.join(Tt(),".config","oracle")}function z({env:e=process.env,vault:r=null}={}){let t=r||$(),n=[];for(let[o,i]of Object.entries(ee)){let s=(i.rpcEnv||[]).some(d=>String(e[d]||"").trim()),c="prepare";i.evm?s&&(c="live"):c="unavailable",n.push({key:o,chainId:i.chainId,name:i.name,family:"evm",status:c,execute:!!(t.vaultExists&&t.armed&&!t.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 ae({env:e=process.env,model:r=je(),vault:t=$(),signerReachable:n=!1,quote:o=null}={}){let i=[],s=(p,h,v,x=null)=>i.push({id:p,status:h,detail:v,fix:x}),c=(()=>{let[p,h]=process.versions.node.split(".").map(Number);return p>20||p===20&&h>=19})();s("node",c?"ok":"fail",`node ${process.versions.node}`,c?null:"install node >= 20.19"),r?r.backend==="hermes"?s("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):s("model","ok",`${r.backend||"auto"} ${r.provider||""} ${r.model||""}`.trim()):s("model","fail","no model.json","oracle setup model"),t.vaultExists?t.disarmed?s("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):s("vault",t.armed?"ok":"warn",t.armed?"present, armed":"present, not armed"):s("vault","fail","no local vault","oracle sign init");let d=e.ORACLE_SIGNER_HOST||"127.0.0.1";return Lt.has(d)?s("signer",n?"ok":"warn",n?`loopback ${d}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",n?null:"oracle signer"):s("signer","fail",`signer host ${d} is not loopback`,"unset ORACLE_SIGNER_HOST"),o?o.ok?s("quote","ok",o.detail||"net quote returned"):s("quote","warn",o.detail||"quote unavailable","check network / oracle data serve"):s("quote","warn","quote not probed",null),{ok:!i.some(p=>p.status==="fail"),checks:i,venues:z({env:e,vault:t})}}var Lt,ce=f(()=>{Se();se();Ie();te();Lt=new Set(["127.0.0.1","::1","localhost"])});var De={};le(De,{classifyReceipt:()=>U,default:()=>It,firstHourReport:()=>ae,probeQuote:()=>jt,probeSigner:()=>Nt,vaultStatus:()=>$});async function Nt(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 jt(){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 It,$e=f(()=>{ce();se();It={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=z();if(r)return process.stdout.write(`${JSON.stringify({venues:t},null,2)}
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 K from"node:fs";import Ut from"node:path";import fe from"node:fs";import L from"node:path";F();var We="0.19.0",Wt=`hermes-agent==${We}`;var ue="0.12.1",Yt=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${ue}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${ue}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function Ye(){return L.join(T(),"runtime")}function Je(){return L.join(Ye(),"venv")}function Xe(e){let r=process.platform==="win32"?"Scripts":"bin",t=process.platform==="win32"?`${e}.exe`:e;return L.join(Je(),r,t)}function Ze(){return Xe("hermes")}function Qe(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 o=L.join(t,`${e}${n}`);try{if(fe.existsSync(o))return o}catch{}}return null}function de(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=Ze();if(fe.existsSync(e))return{ok:!0,bin:e,source:"managed"};let r=Qe("hermes");return r?{ok:!0,bin:r,source:"path"}:{ok:!1,bin:null,source:null}}import k from"node:fs";import u from"node:path";F();import{existsSync as me,readFileSync as et}from"node:fs";import{dirname as pe,join as W}from"node:path";import{fileURLToPath as tt}from"node:url";function rt(e){let r=pe(tt(e));for(let t=0;t<8;t+=1){let n=W(r,"package.json");if(me(n))try{let i=JSON.parse(et(n,"utf8"));if(i&&typeof i.version=="string")return r}catch{}let o=pe(r);if(o===r)break;r=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function he(e,r){let t=rt(r),n=W(t,e);return me(n)?n:W(t,"dist","assets",e)}var nt=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 ge(){return nt.filter(e=>e.website)}var Y=Object.freeze(["long_horizon","recursive_fanout","continual_learn","evidence_first","prepare_only"]);function J(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","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","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"]),ot="deny",nr=256*1024;var or=Object.freeze({version:1,source:"default",defaultDecision:ot,allow:P,deny:Object.freeze([])});var X=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),sr=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"}),S=(e,r=0,t=1)=>Math.min(t,Math.max(r,e)),y=e=>Number.isFinite(Number(e))?Number(e):null,it=e=>Math.round(e*1e4)/1e4;function w(e,r,t,n=!0){!n||t===null||!Number.isFinite(t)||e.push({feature:r,value:it(t)})}function st(e,r){let t=y(e.repeatBuys??e.repeat_buys??e.buyCount),n=y(e.walletWinRate??e.winRate);w(r,"repeat_buys",t===null?null:S((t-1)/4)*.38),w(r,"wallet_win_rate",n===null?null:(S(n)-.5)*.5)}function at(e,r){let t=y(e.ageHours??e.poolAgeHours),n=y(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;w(r,"pool_age",t===null?null:t<24?-.42:S(t/720)*.12),w(r,"liquidity",n===null?null:(S(Math.log10(Math.max(1,n))/7)-.5)*.28),w(r,"liquidity_lock",o==null?null:o?.12:-.28)}function ct(e,r){let t=y(e.floorChange??e.floorChangePct),n=y(e.sales??e.saleCount);w(r,"floor_change",t===null?null:S(t,-1,1)*.35),w(r,"sales_depth",n===null?null:S(n/50)*.18)}function lt(e,r){let t=y(e.flowImbalance??e.imbalance),n=y(e.fundingRate??e.funding);w(r,"flow_imbalance",t===null?null:S(t,-1,1)*.42),w(r,"funding",n===null?null:-S(n*100,-1,1)*.12)}function ut(e,r){let t=y(e.marketProbability??e.marketPrice??e.probability),n=y(e.fairProbability??e.referenceProbability??e.fairValue);w(r,"probability_mispricing",t===null||n===null?null:S(n-t,-1,1)*.65);let o=y(e.liquidityUsd??e.liquidity);w(r,"market_liquidity",o===null?null:S(Math.log10(Math.max(1,o))/6)*.12)}var ar=Object.freeze({wallet:st,pool:at,nft_floor:ct,hl_flow:lt,prediction_market:ut});function Z(e){try{return k.existsSync(e)}catch{return!1}}function H(e){for(let r of e)if(r&&Z(r))return r;return null}function Q(e){try{return he(e,import.meta.url)}catch{return null}}function ft(){let e=[u.join(l,"dist/data/desk-data.mjs"),u.join(l,"data/desk-data.mjs"),u.join(l,"src/data/desk-data.mjs")];for(let n of e)if(Z(n))try{let i=k.readFileSync(n,"utf8").match(/\bid\s*:\s*["'][a-z0-9-]+["']/gi)||[],s=new Set(i.map(c=>c.toLowerCase()));if(s.size>=20)return{count:s.size,detail:`${s.size} provider ids (bundled desk-data)`}}catch{}let r=[u.join(l,"src/data/providers"),u.join(l,"dist/data/providers"),u.join(l,"data/providers")],t=H(r);if(!t)return{count:0,detail:"providers dir missing"};try{let n=k.readdirSync(t).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 ye(){let e=H([Q("skills"),u.join(l,"skills"),u.join(l,"dist/assets/skills"),u.join(l,"assets/skills")]);if(!e)return{count:0,trading:[],building:[]};let r=k.readdirSync(e),t=r.filter(o=>/trade|swap|snipe|farm|hyperliquid|poly|best-exec|circuit|meme|token-research|rfq/i.test(o)),n=r.filter(o=>/launch|builder|protocol|nft|dex-launch|token-launch|security|contract/i.test(o));return{count:r.length,trading:t,building:n}}function dt(){let e=H([Q("protocols/templates"),u.join(l,"protocols/templates"),u.join(l,"dist/assets/protocols/templates"),u.join(l,"assets/protocols/templates")]);return e?k.readdirSync(e).filter(t=>!t.startsWith(".")):ye().building.some(t=>/protocol-builder|dex-launch|token-launch/i.test(t))?["(via skills: protocol-builder / launch packs)"]:[]}function pt(){let e=H([Q("profiles"),u.join(l,"profiles"),u.join(l,"dist/assets/profiles"),u.join(l,"assets/profiles")]);return e?k.readdirSync(e,{withFileTypes:!0}).filter(r=>r.isDirectory()&&!r.name.startsWith("_")).map(r=>r.name):[]}function mt(){try{if(P.includes("trade_lifecycle")&&!P.some(r=>/broadcast|wallet_sign/.test(r)))return!0}catch{}let e=[u.join(l,"src/capability-posture.mjs"),u.join(l,"dist/capability-posture.mjs"),u.join(l,"capability-posture.mjs"),u.join(l,"dist/public-control/policy-schema.mjs"),u.join(l,"README.md"),u.join(l,"package.json")];for(let r of e)if(Z(r))try{let t=k.readFileSync(r,"utf8");if(/prepare-only|never takes your key|never.*broadcast/i.test(t))return!0}catch{}return!1}function we(e=process.env){let r=[],t=(a,O,I,b=1)=>{r.push({id:a,status:O,detail:I,weight:b})},[n,o]=process.versions.node.split(".").map(Number),i=n>20||n===20&&o>=19;t("node",i?"ok":"fail",`node ${process.versions.node}`,2);let c=["oracle_cli","research_delegate","trade_lifecycle","signal_score","skill_load","learn_skill","code_eval","cron_add","web_fetch"].filter(a=>!P.includes(a));t("agent_tools",c.length===0?"ok":"warn",c.length===0?`safe tools ${P.length}; signal_score present`:`missing tools: ${c.join(",")}`,3),t("research_attributes","ok",`attrs [${Y.join(", ")}]; mode=${J(e)?"ON":"off"}`,2);let d=ft();t("providers",d.count>=40?"ok":d.count>=10?"warn":"fail",d.detail,3);let g=ye();t("skills_trading_build",g.trading.length>=5&&g.building.length>=4?"ok":g.count>=10?"warn":"fail",`${g.count} skills; trading=${g.trading.length} building=${g.building.length}`,3);let p=dt();t("protocol_templates",p.length>=2?"ok":"warn",p.length?p.join(", "):"none",2);let h=pt();t("profiles",h.includes("protocol-builder")&&h.includes("oracle")?"ok":h.length>=1?"warn":"fail",h.join(", ")||"none",2),t("signals_engine",X.length>=4?"ok":"fail",`types: ${X.join(", ")} (cold / no hot exec)`,2);let v=ge();t("harness_roster",v.length>=8?"ok":"warn",`${v.length} website harnesses; native default; MCP inbound only`,2),t("custody_prepare_only",mt()?"ok":"fail","public plane prepare-only",4);let x=e.ORACLE_DATA_URL||"http://127.0.0.1:8787";t("data_url","ok",x,1);let A=0,E=0;for(let a of r)E+=a.weight,a.status==="ok"?A+=a.weight:a.status==="warn"&&(A+=a.weight*.5);let m=E?Math.round(A/E*100):0,_=!r.some(a=>a.status==="fail")&&m>=70,M=_?`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:_,score:A,max:E,pct:m,summary:M,researchMode:J(e),attributes:[...Y],packageRoot:l,checks:r}}function Me(){let[e,r]=process.versions.node.split(".").map(Number);return e>20||e===20&&r>=19}function Dt(e){if(!K.existsSync(e))return{};let r={};for(let t of K.readFileSync(e,"utf8").split(/\r?\n/)){let n=t.match(/^([A-Z0-9_]+)=(.*)$/);n&&(r[n[1]]=n[2])}return r}async function $t(e){let r=e.replace(/\/$/,"");for(let t of["/health","/public/health"])try{if((await fetch(r+t)).ok)return!0}catch{}return!1}var zn={name:"doctor",summary:"check the read plane (+ optional --agentic crypto harness 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"),o=[],i=!1,s=(a,O,I,b=null)=>{o.push({id:a,status:O,detail:I,fix:b}),O==="fail"&&(i=!0)};s("node",Me()?"ok":"fail",`node ${process.versions.node}`,Me()?null:"install node >= 20.19");let c=e.paths.oracleExecEnvPath(),d=Dt(c),g=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||d.ORACLE_ROUTE_ATTESTATION_SECRET||d.MAD_ROUTE_ATTESTATION_SECRET||d.ORACLE_ATTESTATION_SECRET||d.ORACLE_STAMP_HMAC_SECRET;s("attestation_secret",g?"ok":"warn",g?"present":"missing",g?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let p=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",h=await $t(p),v=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",h?"ok":"warn",h?`reachable ${p}${v?` (${v})`:""}`:`down ${p}`,h?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 x=de();s("harness_model","ok","Oracle native is default; external clients are inbound MCP only (oracle harness detect)",null),s("hermes_opt_in","ok",x.ok?`detected ${x.bin} (${x.source}) \u2014 unused unless explicitly opted in`:"not detected \u2014 native-only OK",null);let A=Ut.join(e.paths.hermesRoot(),"profiles"),E=0;K.existsSync(A)&&(E=K.readdirSync(A,{withFileTypes:!0}).filter(a=>a.isDirectory()).length),s("hermes_lanes","ok",E>0?`${E} profile dir(s) (optional surface)`:"no Hermes lane profiles (native-only OK)",null);let m=null;if(t){m=we(process.env);for(let a of m.checks)s(`agentic_${a.id}`,a.status,a.detail,null)}let _=null;if(n){let{firstHourReport:a}=await Promise.resolve().then(()=>(ce(),Ue)),{probeSigner:O,probeQuote:I}=await Promise.resolve().then(()=>($e(),De));_=a({signerReachable:await O(process.env),quote:await I()});for(let b of _.checks)s(`hour_${b.id}`,b.status,b.detail,b.fix)}let M={ok:!i&&(m?m.ok:!0)&&(_?_.ok:!0),checks:o,..._?{firstHour:_}:{},...m?{agentic:{pct:m.pct,summary:m.summary,attributes:m.attributes,researchMode:m.researchMode}}:{}};if(r)process.stdout.write(JSON.stringify(M,null,2)+`
3
+ `);return 0}}});import K from"node:fs";import Ut from"node:path";import fe from"node:fs";import L from"node:path";F();var We="0.19.0",Wt=`hermes-agent==${We}`;var ue="0.12.1",Yt=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${ue}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${ue}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function Ye(){return L.join(T(),"runtime")}function Je(){return L.join(Ye(),"venv")}function Xe(e){let r=process.platform==="win32"?"Scripts":"bin",t=process.platform==="win32"?`${e}.exe`:e;return L.join(Je(),r,t)}function Ze(){return Xe("hermes")}function Qe(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 o=L.join(t,`${e}${n}`);try{if(fe.existsSync(o))return o}catch{}}return null}function de(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=Ze();if(fe.existsSync(e))return{ok:!0,bin:e,source:"managed"};let r=Qe("hermes");return r?{ok:!0,bin:r,source:"path"}:{ok:!1,bin:null,source:null}}import k from"node:fs";import u from"node:path";F();import{existsSync as me,readFileSync as et}from"node:fs";import{dirname as pe,join as W}from"node:path";import{fileURLToPath as tt}from"node:url";function rt(e){let r=pe(tt(e));for(let t=0;t<8;t+=1){let n=W(r,"package.json");if(me(n))try{let i=JSON.parse(et(n,"utf8"));if(i&&typeof i.version=="string")return r}catch{}let o=pe(r);if(o===r)break;r=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function he(e,r){let t=rt(r),n=W(t,e);return me(n)?n:W(t,"dist","assets",e)}var nt=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 ge(){return nt.filter(e=>e.website)}var Y=Object.freeze(["long_horizon","recursive_fanout","continual_learn","evidence_first","prepare_only"]);function J(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"]),ot="deny",nr=256*1024;var or=Object.freeze({version:1,source:"default",defaultDecision:ot,allow:P,deny:Object.freeze([])});var X=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),sr=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"}),S=(e,r=0,t=1)=>Math.min(t,Math.max(r,e)),y=e=>Number.isFinite(Number(e))?Number(e):null,it=e=>Math.round(e*1e4)/1e4;function w(e,r,t,n=!0){!n||t===null||!Number.isFinite(t)||e.push({feature:r,value:it(t)})}function st(e,r){let t=y(e.repeatBuys??e.repeat_buys??e.buyCount),n=y(e.walletWinRate??e.winRate);w(r,"repeat_buys",t===null?null:S((t-1)/4)*.38),w(r,"wallet_win_rate",n===null?null:(S(n)-.5)*.5)}function at(e,r){let t=y(e.ageHours??e.poolAgeHours),n=y(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;w(r,"pool_age",t===null?null:t<24?-.42:S(t/720)*.12),w(r,"liquidity",n===null?null:(S(Math.log10(Math.max(1,n))/7)-.5)*.28),w(r,"liquidity_lock",o==null?null:o?.12:-.28)}function ct(e,r){let t=y(e.floorChange??e.floorChangePct),n=y(e.sales??e.saleCount);w(r,"floor_change",t===null?null:S(t,-1,1)*.35),w(r,"sales_depth",n===null?null:S(n/50)*.18)}function lt(e,r){let t=y(e.flowImbalance??e.imbalance),n=y(e.fundingRate??e.funding);w(r,"flow_imbalance",t===null?null:S(t,-1,1)*.42),w(r,"funding",n===null?null:-S(n*100,-1,1)*.12)}function ut(e,r){let t=y(e.marketProbability??e.marketPrice??e.probability),n=y(e.fairProbability??e.referenceProbability??e.fairValue);w(r,"probability_mispricing",t===null||n===null?null:S(n-t,-1,1)*.65);let o=y(e.liquidityUsd??e.liquidity);w(r,"market_liquidity",o===null?null:S(Math.log10(Math.max(1,o))/6)*.12)}var ar=Object.freeze({wallet:st,pool:at,nft_floor:ct,hl_flow:lt,prediction_market:ut});function Z(e){try{return k.existsSync(e)}catch{return!1}}function H(e){for(let r of e)if(r&&Z(r))return r;return null}function Q(e){try{return he(e,import.meta.url)}catch{return null}}function ft(){let e=[u.join(l,"dist/data/desk-data.mjs"),u.join(l,"data/desk-data.mjs"),u.join(l,"src/data/desk-data.mjs")];for(let n of e)if(Z(n))try{let i=k.readFileSync(n,"utf8").match(/\bid\s*:\s*["'][a-z0-9-]+["']/gi)||[],s=new Set(i.map(c=>c.toLowerCase()));if(s.size>=20)return{count:s.size,detail:`${s.size} provider ids (bundled desk-data)`}}catch{}let r=[u.join(l,"src/data/providers"),u.join(l,"dist/data/providers"),u.join(l,"data/providers")],t=H(r);if(!t)return{count:0,detail:"providers dir missing"};try{let n=k.readdirSync(t).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 ye(){let e=H([Q("skills"),u.join(l,"skills"),u.join(l,"dist/assets/skills"),u.join(l,"assets/skills")]);if(!e)return{count:0,trading:[],building:[]};let r=k.readdirSync(e),t=r.filter(o=>/trade|swap|snipe|farm|hyperliquid|poly|best-exec|circuit|meme|token-research|rfq/i.test(o)),n=r.filter(o=>/launch|builder|protocol|nft|dex-launch|token-launch|security|contract/i.test(o));return{count:r.length,trading:t,building:n}}function dt(){let e=H([Q("protocols/templates"),u.join(l,"protocols/templates"),u.join(l,"dist/assets/protocols/templates"),u.join(l,"assets/protocols/templates")]);return e?k.readdirSync(e).filter(t=>!t.startsWith(".")):ye().building.some(t=>/protocol-builder|dex-launch|token-launch/i.test(t))?["(via skills: protocol-builder / launch packs)"]:[]}function pt(){let e=H([Q("profiles"),u.join(l,"profiles"),u.join(l,"dist/assets/profiles"),u.join(l,"assets/profiles")]);return e?k.readdirSync(e,{withFileTypes:!0}).filter(r=>r.isDirectory()&&!r.name.startsWith("_")).map(r=>r.name):[]}function mt(){try{if(P.includes("trade_lifecycle")&&!P.some(r=>/broadcast|wallet_sign/.test(r)))return!0}catch{}let e=[u.join(l,"src/capability-posture.mjs"),u.join(l,"dist/capability-posture.mjs"),u.join(l,"capability-posture.mjs"),u.join(l,"dist/public-control/policy-schema.mjs"),u.join(l,"README.md"),u.join(l,"package.json")];for(let r of e)if(Z(r))try{let t=k.readFileSync(r,"utf8");if(/prepare-only|never takes your key|never.*broadcast/i.test(t))return!0}catch{}return!1}function we(e=process.env){let r=[],t=(a,O,I,b=1)=>{r.push({id:a,status:O,detail:I,weight:b})},[n,o]=process.versions.node.split(".").map(Number),i=n>20||n===20&&o>=19;t("node",i?"ok":"fail",`node ${process.versions.node}`,2);let c=["oracle_cli","research_delegate","trade_lifecycle","signal_score","skill_load","learn_skill","code_eval","cron_add","web_fetch"].filter(a=>!P.includes(a));t("agent_tools",c.length===0?"ok":"warn",c.length===0?`safe tools ${P.length}; signal_score present`:`missing tools: ${c.join(",")}`,3),t("research_attributes","ok",`attrs [${Y.join(", ")}]; mode=${J(e)?"ON":"off"}`,2);let d=ft();t("providers",d.count>=40?"ok":d.count>=10?"warn":"fail",d.detail,3);let g=ye();t("skills_trading_build",g.trading.length>=5&&g.building.length>=4?"ok":g.count>=10?"warn":"fail",`${g.count} skills; trading=${g.trading.length} building=${g.building.length}`,3);let p=dt();t("protocol_templates",p.length>=2?"ok":"warn",p.length?p.join(", "):"none",2);let h=pt();t("profiles",h.includes("protocol-builder")&&h.includes("oracle")?"ok":h.length>=1?"warn":"fail",h.join(", ")||"none",2),t("signals_engine",X.length>=4?"ok":"fail",`types: ${X.join(", ")} (cold / no hot exec)`,2);let v=ge();t("harness_roster",v.length>=8?"ok":"warn",`${v.length} website harnesses; native default; MCP inbound only`,2),t("custody_prepare_only",mt()?"ok":"fail","public plane prepare-only",4);let x=e.ORACLE_DATA_URL||"http://127.0.0.1:8787";t("data_url","ok",x,1);let A=0,E=0;for(let a of r)E+=a.weight,a.status==="ok"?A+=a.weight:a.status==="warn"&&(A+=a.weight*.5);let m=E?Math.round(A/E*100):0,_=!r.some(a=>a.status==="fail")&&m>=70,M=_?`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:_,score:A,max:E,pct:m,summary:M,researchMode:J(e),attributes:[...Y],packageRoot:l,checks:r}}function Me(){let[e,r]=process.versions.node.split(".").map(Number);return e>20||e===20&&r>=19}function Dt(e){if(!K.existsSync(e))return{};let r={};for(let t of K.readFileSync(e,"utf8").split(/\r?\n/)){let n=t.match(/^([A-Z0-9_]+)=(.*)$/);n&&(r[n[1]]=n[2])}return r}async function $t(e){let r=e.replace(/\/$/,"");for(let t of["/health","/public/health"])try{if((await fetch(r+t)).ok)return!0}catch{}return!1}var zn={name:"doctor",summary:"check the read plane (+ optional --agentic crypto harness 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"),o=[],i=!1,s=(a,O,I,b=null)=>{o.push({id:a,status:O,detail:I,fix:b}),O==="fail"&&(i=!0)};s("node",Me()?"ok":"fail",`node ${process.versions.node}`,Me()?null:"install node >= 20.19");let c=e.paths.oracleExecEnvPath(),d=Dt(c),g=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||d.ORACLE_ROUTE_ATTESTATION_SECRET||d.MAD_ROUTE_ATTESTATION_SECRET||d.ORACLE_ATTESTATION_SECRET||d.ORACLE_STAMP_HMAC_SECRET;s("attestation_secret",g?"ok":"warn",g?"present":"missing",g?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let p=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",h=await $t(p),v=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",h?"ok":"warn",h?`reachable ${p}${v?` (${v})`:""}`:`down ${p}`,h?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 x=de();s("harness_model","ok","Oracle native is default; external clients are inbound MCP only (oracle harness detect)",null),s("hermes_opt_in","ok",x.ok?`detected ${x.bin} (${x.source}) \u2014 unused unless explicitly opted in`:"not detected \u2014 native-only OK",null);let A=Ut.join(e.paths.hermesRoot(),"profiles"),E=0;K.existsSync(A)&&(E=K.readdirSync(A,{withFileTypes:!0}).filter(a=>a.isDirectory()).length),s("hermes_lanes","ok",E>0?`${E} profile dir(s) (optional surface)`:"no Hermes lane profiles (native-only OK)",null);let m=null;if(t){m=we(process.env);for(let a of m.checks)s(`agentic_${a.id}`,a.status,a.detail,null)}let _=null;if(n){let{firstHourReport:a}=await Promise.resolve().then(()=>(ce(),Ue)),{probeSigner:O,probeQuote:I}=await Promise.resolve().then(()=>($e(),De));_=a({signerReachable:await O(process.env),quote:await I()});for(let b of _.checks)s(`hour_${b.id}`,b.status,b.detail,b.fix)}let M={ok:!i&&(m?m.ok:!0)&&(_?_.ok:!0),checks:o,..._?{firstHour:_}:{},...m?{agentic:{pct:m.pct,summary:m.summary,attributes:m.attributes,researchMode:m.researchMode}}:{}};if(r)process.stdout.write(JSON.stringify(M,null,2)+`
4
4
  `);else{for(let a of o)process.stdout.write(`${a.status.toUpperCase().padEnd(4)} ${a.id}: ${a.detail}
5
5
  `),a.fix&&process.stdout.write(` fix: ${a.fix}
6
6
  `);m&&process.stdout.write(`