@oracle-agent/oracle 0.22.9 → 0.22.11
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 +9 -3
- package/SETUP.md +6 -6
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/eval.mjs +36 -36
- package/package.json +1 -1
- package/public/agent-connect/app.js +1 -1
- package/public/install.sh +300 -0
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/index.html +1 -1
- package/public/oracle-splash/install.sh +300 -0
package/README.md
CHANGED
|
@@ -271,14 +271,20 @@ capability-labeled per chain; unconfigured venues stay unavailable instead of fa
|
|
|
271
271
|
|
|
272
272
|
## Install
|
|
273
273
|
|
|
274
|
-
|
|
275
|
-
https://oracle.demi.la/
|
|
276
|
-
|
|
274
|
+
```bash
|
|
275
|
+
curl -fsSL https://oracle.demi.la/install.sh | bash
|
|
276
|
+
oracle setup model
|
|
277
|
+
oracle chat
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Requires Node `20.19.0` or newer (the curl installer checks). npm still works:
|
|
277
281
|
|
|
278
282
|
```bash
|
|
279
283
|
npm i -g @oracle-agent/oracle
|
|
280
284
|
```
|
|
281
285
|
|
|
286
|
+
Desktop betas: https://oracle.demi.la/downloads/
|
|
287
|
+
|
|
282
288
|
Or from source, if you want to run the suite:
|
|
283
289
|
|
|
284
290
|
```bash
|
package/SETUP.md
CHANGED
|
@@ -19,18 +19,18 @@ Linux, Windows, and macOS apps are in beta.
|
|
|
19
19
|
## 1. Install the standalone CLI
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
|
|
22
|
+
curl -fsSL https://oracle.demi.la/install.sh | bash
|
|
23
23
|
oracle --version
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
integrator fee.
|
|
26
|
+
This installs into `~/.local/share/oracle` and puts `oracle` on `~/.local/bin`
|
|
27
|
+
(no sudo, no global `npm -g`). Re-run the same command to upgrade.
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
npm still works if you prefer:
|
|
31
30
|
|
|
32
31
|
```bash
|
|
33
|
-
npm i @oracle-agent/oracle
|
|
32
|
+
npm i -g @oracle-agent/oracle
|
|
33
|
+
oracle --version
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
The package declares this floor through `engines`; `oracle doctor` treats an
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import P from"node:fs";import Oe from"node:path";import K from"node:fs";import x from"node:path";import C from"node:fs";import Q from"node:os";import w from"node:path";import{fileURLToPath as ee}from"node:url";var te=w.dirname(ee(import.meta.url)),i=w.resolve(te,"../..");function D(){return process.env.ORACLE_FAKE_HOME||Q.homedir()}function ne(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function j(){return ne()?process.env.ORACLE_CONFIG_DIR||w.join(D(),".config","oracle"):w.join(D(),".config","oracle")}function re(){return w.join(j(),"desk.json")}function oe(){return w.join(j(),"env")}function v({force:e=!1}={}){if(v._done&&!e)return v._result||null;v._done=!0;let t={},n=(s,o)=>{if(o==null)return;let p=String(o).trim();p&&(process.env[s]!=null&&String(process.env[s]).trim()!==""||(process.env[s]=p,t[s]=p))};try{let s=oe();if(C.existsSync(s))for(let o of C.readFileSync(s,"utf8").split(/\r?\n/)){let p=o.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!p||p[2].startsWith("#"))continue;let a=p[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(p[1],a)}}catch{}try{let s=re();if(C.existsSync(s)){let o=JSON.parse(C.readFileSync(s,"utf8"));o&&typeof o=="object"&&(n("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),n("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),n("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),n("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),n("ORACLE_EXEC_URL",o.execUrl),n("MAD_DESK_URL",o.deskUrl||o.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),v._result=Object.keys(t).length?t:null,v._result}try{v()}catch{}var se="0.19.0",Me=`hermes-agent==${se}`;var F="0.12.1",He=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${F}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${F}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function ie(){return x.join(j(),"runtime")}function ce(){return x.join(ie(),"venv")}function ae(e){let t=process.platform==="win32"?"Scripts":"bin",n=process.platform==="win32"?`${e}.exe`:e;return x.join(ce(),t,n)}function le(){return ae("hermes")}function ue(e){let t=process.platform==="win32"&&!x.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let n of(process.env.PATH||"").split(x.delimiter))if(n)for(let r of t){let s=x.join(n,`${e}${r}`);try{if(K.existsSync(s))return s}catch{}}return null}function B(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=ue("hermes");if(e)return{ok:!0,bin:e,source:"path"};let t=le();return K.existsSync(t)?{ok:!0,bin:t,source:"managed"}:{ok:!1,bin:null,source:null}}import O from"node:fs";import c from"node:path";import{existsSync as G,readFileSync as de}from"node:fs";import{dirname as z,join as N}from"node:path";import{fileURLToPath as fe}from"node:url";function pe(e){let t=z(fe(e));for(let n=0;n<8;n+=1){let r=N(t,"package.json");if(G(r))try{let o=JSON.parse(de(r,"utf8"));if(o&&typeof o.version=="string")return t}catch{}let s=z(t);if(s===t)break;t=s}throw new Error(`oracle: could not resolve package root from ${e}`)}function V(e,t){let n=pe(t),r=N(n,"dist","assets",e);return G(r)?r:N(n,e)}var me=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 Y(){return me.filter(e=>e.website)}var I=Object.freeze(["long_horizon","recursive_fanout","continual_learn","evidence_first","prepare_only"]);function $(e=process.env){let t=String(e?.ORACLE_RESEARCH_MODE??e?.ORACLE_RLM_MODE??"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"||t==="research"}var S=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","vision_analyze","browser_navigate","browser_snapshot","browser_click","browser_type","browser_press","browser_close","browser_exec","xurl"]),he="deny",We=256*1024;var qe=Object.freeze({version:1,source:"default",defaultDecision:he,allow:S,deny:Object.freeze([])});var M=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Je=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"}),_=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),m=e=>Number.isFinite(Number(e))?Number(e):null,_e=e=>Math.round(e*1e4)/1e4;function h(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:_e(n)})}function ge(e,t){let n=m(e.repeatBuys??e.repeat_buys??e.buyCount),r=m(e.walletWinRate??e.winRate);h(t,"repeat_buys",n===null?null:_((n-1)/4)*.38),h(t,"wallet_win_rate",r===null?null:(_(r)-.5)*.5)}function ye(e,t){let n=m(e.ageHours??e.poolAgeHours),r=m(e.liquidityUsd??e.liquidity),s=e.liquidityLocked??e.locked;h(t,"pool_age",n===null?null:n<24?-.42:_(n/720)*.12),h(t,"liquidity",r===null?null:(_(Math.log10(Math.max(1,r))/7)-.5)*.28),h(t,"liquidity_lock",s==null?null:s?.12:-.28)}function be(e,t){let n=m(e.floorChange??e.floorChangePct),r=m(e.sales??e.saleCount);h(t,"floor_change",n===null?null:_(n,-1,1)*.35),h(t,"sales_depth",r===null?null:_(r/50)*.18)}function Ee(e,t){let n=m(e.flowImbalance??e.imbalance),r=m(e.fundingRate??e.funding);h(t,"flow_imbalance",n===null?null:_(n,-1,1)*.42),h(t,"funding",r===null?null:-_(r*100,-1,1)*.12)}function ke(e,t){let n=m(e.marketProbability??e.marketPrice??e.probability),r=m(e.fairProbability??e.referenceProbability??e.fairValue);h(t,"probability_mispricing",n===null||r===null?null:_(r-n,-1,1)*.65);let s=m(e.liquidityUsd??e.liquidity);h(t,"market_liquidity",s===null?null:_(Math.log10(Math.max(1,s))/6)*.12)}var Ze=Object.freeze({wallet:ge,pool:ye,nft_floor:be,hl_flow:Ee,prediction_market:ke});function W(e){try{return O.existsSync(e)}catch{return!1}}function L(e){for(let t of e)if(t&&W(t))return t;return null}function H(e){try{return V(e,import.meta.url)}catch{return null}}function Ae(){let e=[c.join(i,"src/data/providers"),c.join(i,"dist/data/providers"),c.join(i,"data/providers")],t=L(e);if(!t)return{count:0,detail:"providers dir missing"};try{let n=O.readdirSync(t).filter(r=>r.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 ve(){let e=L([H("skills"),c.join(i,"skills"),c.join(i,"dist/assets/skills"),c.join(i,"assets/skills")]);if(!e)return{count:0,trading:[],building:[]};let t=O.readdirSync(e),n=t.filter(s=>/trade|swap|snipe|farm|hyperliquid|poly|best-exec|circuit|meme|token-research|rfq/i.test(s)),r=t.filter(s=>/launch|builder|protocol|nft|dex-launch|token-launch|security|contract/i.test(s));return{count:t.length,trading:n,building:r}}function we(){let e=L([H("protocols/templates"),c.join(i,"protocols/templates"),c.join(i,"dist/assets/protocols/templates"),c.join(i,"assets/protocols/templates")]);return e?O.readdirSync(e).filter(t=>!t.startsWith(".")):[]}function xe(){let e=L([H("profiles"),c.join(i,"profiles"),c.join(i,"dist/assets/profiles"),c.join(i,"assets/profiles")]);return e?O.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()&&!t.name.startsWith("_")).map(t=>t.name):[]}function Se(){try{if(S.includes("trade_lifecycle")&&!S.some(t=>/broadcast|wallet_sign/.test(t)))return!0}catch{}let e=[c.join(i,"src/capability-posture.mjs"),c.join(i,"dist/capability-posture.mjs"),c.join(i,"capability-posture.mjs"),c.join(i,"dist/public-control/policy-schema.mjs"),c.join(i,"README.md"),c.join(i,"package.json")];for(let t of e)if(W(t))try{let n=O.readFileSync(t,"utf8");if(/prepare-only|never takes your key|never.*broadcast/i.test(n))return!0}catch{}return!1}function q(e=process.env){let t=[],n=(d,U,J,Z=1)=>{t.push({id:d,status:U,detail:J,weight:Z})},[r,s]=process.versions.node.split(".").map(Number),o=r>20||r===20&&s>=19;n("node",o?"ok":"fail",`node ${process.versions.node}`,2);let a=["oracle_cli","research_delegate","trade_lifecycle","signal_score","skill_load","learn_skill","code_eval","cron_add","web_fetch"].filter(d=>!S.includes(d));n("agent_tools",a.length===0?"ok":"warn",a.length===0?`safe tools ${S.length}; signal_score present`:`missing tools: ${a.join(",")}`,3),n("research_attributes","ok",`attrs [${I.join(", ")}]; mode=${$(e)?"ON":"off"}`,2);let y=Ae();n("providers",y.count>=40?"ok":y.count>=10?"warn":"fail",y.detail,3);let f=ve();n("skills_trading_build",f.trading.length>=5&&f.building.length>=4?"ok":f.count>=10?"warn":"fail",`${f.count} skills; trading=${f.trading.length} building=${f.building.length}`,3);let b=we();n("protocol_templates",b.length>=2?"ok":"warn",b.length?b.join(", "):"none",2);let E=xe();n("profiles",E.includes("protocol-builder")&&E.includes("oracle")?"ok":E.length>=1?"warn":"fail",E.join(", ")||"none",2),n("signals_engine",M.length>=4?"ok":"fail",`types: ${M.join(", ")} (cold / no hot exec)`,2);let A=Y();n("harness_roster",A.length>=8?"ok":"warn",`${A.length} website harnesses; native default; MCP inbound only`,2),n("custody_prepare_only",Se()?"ok":"fail","public plane prepare-only",4);let R=e.ORACLE_DATA_URL||"http://127.0.0.1:8787";n("data_url","ok",R,1);let g=0,l=0;for(let d of t)l+=d.weight,d.status==="ok"?g+=d.weight:d.status==="warn"&&(g+=d.weight*.5);let k=l?Math.round(g/l*100):0,u=!t.some(d=>d.status==="fail")&&k>=70,T=u?`AGENTIC READY ${k}% \u2014 Oracle is the crypto control plane (prepare-only); pair coding harnesses via MCP for build.`:`AGENTIC GAPS ${k}% \u2014 fix fail/warn checks before calling Oracle the default crypto harness.`;return{ok:u,score:g,max:l,pct:k,summary:T,researchMode:$(e),attributes:[...I],packageRoot:i,checks:t}}function X(){let[e,t]=process.versions.node.split(".").map(Number);return e>20||e===20&&t>=19}function Re(e){if(!P.existsSync(e))return{};let t={};for(let n of P.readFileSync(e,"utf8").split(/\r?\n/)){let r=n.match(/^([A-Z0-9_]+)=(.*)$/);r&&(t[r[1]]=r[2])}return t}async function Te(e){let t=e.replace(/\/$/,"");for(let n of["/health","/public/health"])try{if((await fetch(t+n)).ok)return!0}catch{}return!1}var pt={name:"doctor",summary:"check the read plane (+ optional --agentic crypto harness score)",group:"read",usage:"oracle doctor [--json] [--agentic]",async run(e){let t=e.argv.includes("--json"),n=e.argv.includes("--agentic"),r=[],s=!1,o=(u,T,d,U=null)=>{r.push({id:u,status:T,detail:d,fix:U}),T==="fail"&&(s=!0)};o("node",X()?"ok":"fail",`node ${process.versions.node}`,X()?null:"install node >= 20.19");let p=e.paths.oracleExecEnvPath(),a=Re(p),y=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||a.ORACLE_ROUTE_ATTESTATION_SECRET||a.MAD_ROUTE_ATTESTATION_SECRET||a.ORACLE_ATTESTATION_SECRET||a.ORACLE_STAMP_HMAC_SECRET;o("attestation_secret",y?"ok":"warn",y?"present":"missing",y?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let f=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",b=await Te(f),E=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;o("data_server",b?"ok":"warn",b?`reachable ${f}${E?` (${E})`:""}`:`down ${f}`,b?null:f.includes("127.0.0.1")||f.includes("localhost")?"oracle data serve OR set ~/.config/oracle/desk.json \u2192 Arch :8799":"check Arch desk is up (curl $ORACLE_DESK_URL/public/health)");let A=B();o("harness_model","ok","Oracle native is default; external clients are inbound MCP only (oracle harness detect)",null),o("hermes_opt_in","ok",A.ok?`detected ${A.bin} (${A.source}) \u2014 unused unless explicitly opted in`:"not detected \u2014 native-only OK",null);let R=Oe.join(e.paths.hermesRoot(),"profiles"),g=0;P.existsSync(R)&&(g=P.readdirSync(R,{withFileTypes:!0}).filter(u=>u.isDirectory()).length),o("hermes_lanes","ok",g>0?`${g} profile dir(s) (optional surface)`:"no Hermes lane profiles (native-only OK)",null);let l=null;if(n){l=q(process.env);for(let u of l.checks)o(`agentic_${u.id}`,u.status,u.detail,null)}let k={ok:!s&&(l?l.ok:!0),checks:r,...l?{agentic:{pct:l.pct,summary:l.summary,attributes:l.attributes,researchMode:l.researchMode}}:{}};if(t)process.stdout.write(JSON.stringify(k,null,2)+`
|
|
1
|
+
import P from"node:fs";import Oe from"node:path";import z from"node:fs";import S from"node:path";import T from"node:fs";import ee from"node:os";import x from"node:path";import{fileURLToPath as te}from"node:url";var ne=x.dirname(te(import.meta.url)),i=x.resolve(ne,"../..");function D(){return process.env.ORACLE_FAKE_HOME||ee.homedir()}function re(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function j(){return re()?process.env.ORACLE_CONFIG_DIR||x.join(D(),".config","oracle"):x.join(D(),".config","oracle")}function oe(){return x.join(j(),"desk.json")}function se(){return x.join(j(),"env")}function w({force:e=!1}={}){if(w._done&&!e)return w._result||null;w._done=!0;let t={},n=(s,o)=>{if(o==null)return;let d=String(o).trim();d&&(process.env[s]!=null&&String(process.env[s]).trim()!==""||(process.env[s]=d,t[s]=d))};try{let s=se();if(T.existsSync(s))for(let o of T.readFileSync(s,"utf8").split(/\r?\n/)){let d=o.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!d||d[2].startsWith("#"))continue;let a=d[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n(d[1],a)}}catch{}try{let s=oe();if(T.existsSync(s)){let o=JSON.parse(T.readFileSync(s,"utf8"));o&&typeof o=="object"&&(n("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),n("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),n("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),n("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),n("ORACLE_EXEC_URL",o.execUrl),n("MAD_DESK_URL",o.deskUrl||o.dataUrl))}}catch{}let r=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return r&&(n("ORACLE_DESK_URL",r),n("ORACLE_DATA_URL",r),n("ORACLE_API_URL",r),n("ORACLE_PUBLIC_URL",r),n("MAD_DESK_URL",r)),w._result=Object.keys(t).length?t:null,w._result}try{w()}catch{}var ie="0.19.0",Me=`hermes-agent==${ie}`;var K="0.12.1",He=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${K}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${K}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function ce(){return S.join(j(),"runtime")}function ae(){return S.join(ce(),"venv")}function le(e){let t=process.platform==="win32"?"Scripts":"bin",n=process.platform==="win32"?`${e}.exe`:e;return S.join(ae(),t,n)}function ue(){return le("hermes")}function de(e){let t=process.platform==="win32"&&!S.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let n of(process.env.PATH||"").split(S.delimiter))if(n)for(let r of t){let s=S.join(n,`${e}${r}`);try{if(z.existsSync(s))return s}catch{}}return null}function B(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=de("hermes");if(e)return{ok:!0,bin:e,source:"path"};let t=ue();return z.existsSync(t)?{ok:!0,bin:t,source:"managed"}:{ok:!1,bin:null,source:null}}import A from"node:fs";import c from"node:path";import{existsSync as V,readFileSync as fe}from"node:fs";import{dirname as G,join as N}from"node:path";import{fileURLToPath as pe}from"node:url";function me(e){let t=G(pe(e));for(let n=0;n<8;n+=1){let r=N(t,"package.json");if(V(r))try{let o=JSON.parse(fe(r,"utf8"));if(o&&typeof o.version=="string")return t}catch{}let s=G(t);if(s===t)break;t=s}throw new Error(`oracle: could not resolve package root from ${e}`)}function Y(e,t){let n=me(t),r=N(n,"dist","assets",e);return V(r)?r:N(n,e)}var he=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 W(){return he.filter(e=>e.website)}var I=Object.freeze(["long_horizon","recursive_fanout","continual_learn","evidence_first","prepare_only"]);function $(e=process.env){let t=String(e?.ORACLE_RESEARCH_MODE??e?.ORACLE_RLM_MODE??"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"||t==="research"}var O=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","vision_analyze","browser_navigate","browser_snapshot","browser_click","browser_type","browser_press","browser_close","browser_exec","xurl"]),_e="deny",We=256*1024;var qe=Object.freeze({version:1,source:"default",defaultDecision:_e,allow:O,deny:Object.freeze([])});var M=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),Je=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"}),_=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),m=e=>Number.isFinite(Number(e))?Number(e):null,ge=e=>Math.round(e*1e4)/1e4;function h(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:ge(n)})}function ye(e,t){let n=m(e.repeatBuys??e.repeat_buys??e.buyCount),r=m(e.walletWinRate??e.winRate);h(t,"repeat_buys",n===null?null:_((n-1)/4)*.38),h(t,"wallet_win_rate",r===null?null:(_(r)-.5)*.5)}function be(e,t){let n=m(e.ageHours??e.poolAgeHours),r=m(e.liquidityUsd??e.liquidity),s=e.liquidityLocked??e.locked;h(t,"pool_age",n===null?null:n<24?-.42:_(n/720)*.12),h(t,"liquidity",r===null?null:(_(Math.log10(Math.max(1,r))/7)-.5)*.28),h(t,"liquidity_lock",s==null?null:s?.12:-.28)}function Ee(e,t){let n=m(e.floorChange??e.floorChangePct),r=m(e.sales??e.saleCount);h(t,"floor_change",n===null?null:_(n,-1,1)*.35),h(t,"sales_depth",r===null?null:_(r/50)*.18)}function ke(e,t){let n=m(e.flowImbalance??e.imbalance),r=m(e.fundingRate??e.funding);h(t,"flow_imbalance",n===null?null:_(n,-1,1)*.42),h(t,"funding",r===null?null:-_(r*100,-1,1)*.12)}function Ae(e,t){let n=m(e.marketProbability??e.marketPrice??e.probability),r=m(e.fairProbability??e.referenceProbability??e.fairValue);h(t,"probability_mispricing",n===null||r===null?null:_(r-n,-1,1)*.65);let s=m(e.liquidityUsd??e.liquidity);h(t,"market_liquidity",s===null?null:_(Math.log10(Math.max(1,s))/6)*.12)}var Ze=Object.freeze({wallet:ye,pool:be,nft_floor:Ee,hl_flow:ke,prediction_market:Ae});function H(e){try{return A.existsSync(e)}catch{return!1}}function L(e){for(let t of e)if(t&&H(t))return t;return null}function F(e){try{return Y(e,import.meta.url)}catch{return null}}function ve(){let e=[c.join(i,"dist/data/desk-data.mjs"),c.join(i,"data/desk-data.mjs"),c.join(i,"src/data/desk-data.mjs")];for(let r of e)if(H(r))try{let o=A.readFileSync(r,"utf8").match(/\bid\s*:\s*["'][a-z0-9-]+["']/gi)||[],d=new Set(o.map(a=>a.toLowerCase()));if(d.size>=20)return{count:d.size,detail:`${d.size} provider ids (bundled desk-data)`}}catch{}let t=[c.join(i,"src/data/providers"),c.join(i,"dist/data/providers"),c.join(i,"data/providers")],n=L(t);if(!n)return{count:0,detail:"providers dir missing"};try{let r=A.readdirSync(n).filter(s=>s.endsWith(".mjs"));return{count:r.length,detail:`${r.length} provider modules`}}catch(r){return{count:0,detail:r instanceof Error?r.message:String(r)}}}function q(){let e=L([F("skills"),c.join(i,"skills"),c.join(i,"dist/assets/skills"),c.join(i,"assets/skills")]);if(!e)return{count:0,trading:[],building:[]};let t=A.readdirSync(e),n=t.filter(s=>/trade|swap|snipe|farm|hyperliquid|poly|best-exec|circuit|meme|token-research|rfq/i.test(s)),r=t.filter(s=>/launch|builder|protocol|nft|dex-launch|token-launch|security|contract/i.test(s));return{count:t.length,trading:n,building:r}}function we(){let e=L([F("protocols/templates"),c.join(i,"protocols/templates"),c.join(i,"dist/assets/protocols/templates"),c.join(i,"assets/protocols/templates")]);return e?A.readdirSync(e).filter(n=>!n.startsWith(".")):q().building.some(n=>/protocol-builder|dex-launch|token-launch/i.test(n))?["(via skills: protocol-builder / launch packs)"]:[]}function xe(){let e=L([F("profiles"),c.join(i,"profiles"),c.join(i,"dist/assets/profiles"),c.join(i,"assets/profiles")]);return e?A.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()&&!t.name.startsWith("_")).map(t=>t.name):[]}function Se(){try{if(O.includes("trade_lifecycle")&&!O.some(t=>/broadcast|wallet_sign/.test(t)))return!0}catch{}let e=[c.join(i,"src/capability-posture.mjs"),c.join(i,"dist/capability-posture.mjs"),c.join(i,"capability-posture.mjs"),c.join(i,"dist/public-control/policy-schema.mjs"),c.join(i,"README.md"),c.join(i,"package.json")];for(let t of e)if(H(t))try{let n=A.readFileSync(t,"utf8");if(/prepare-only|never takes your key|never.*broadcast/i.test(n))return!0}catch{}return!1}function X(e=process.env){let t=[],n=(f,U,Z,Q=1)=>{t.push({id:f,status:U,detail:Z,weight:Q})},[r,s]=process.versions.node.split(".").map(Number),o=r>20||r===20&&s>=19;n("node",o?"ok":"fail",`node ${process.versions.node}`,2);let a=["oracle_cli","research_delegate","trade_lifecycle","signal_score","skill_load","learn_skill","code_eval","cron_add","web_fetch"].filter(f=>!O.includes(f));n("agent_tools",a.length===0?"ok":"warn",a.length===0?`safe tools ${O.length}; signal_score present`:`missing tools: ${a.join(",")}`,3),n("research_attributes","ok",`attrs [${I.join(", ")}]; mode=${$(e)?"ON":"off"}`,2);let y=ve();n("providers",y.count>=40?"ok":y.count>=10?"warn":"fail",y.detail,3);let p=q();n("skills_trading_build",p.trading.length>=5&&p.building.length>=4?"ok":p.count>=10?"warn":"fail",`${p.count} skills; trading=${p.trading.length} building=${p.building.length}`,3);let b=we();n("protocol_templates",b.length>=2?"ok":"warn",b.length?b.join(", "):"none",2);let E=xe();n("profiles",E.includes("protocol-builder")&&E.includes("oracle")?"ok":E.length>=1?"warn":"fail",E.join(", ")||"none",2),n("signals_engine",M.length>=4?"ok":"fail",`types: ${M.join(", ")} (cold / no hot exec)`,2);let v=W();n("harness_roster",v.length>=8?"ok":"warn",`${v.length} website harnesses; native default; MCP inbound only`,2),n("custody_prepare_only",Se()?"ok":"fail","public plane prepare-only",4);let R=e.ORACLE_DATA_URL||"http://127.0.0.1:8787";n("data_url","ok",R,1);let g=0,l=0;for(let f of t)l+=f.weight,f.status==="ok"?g+=f.weight:f.status==="warn"&&(g+=f.weight*.5);let k=l?Math.round(g/l*100):0,u=!t.some(f=>f.status==="fail")&&k>=70,C=u?`AGENTIC READY ${k}% \u2014 Oracle is the crypto control plane (prepare-only); pair coding harnesses via MCP for build.`:`AGENTIC GAPS ${k}% \u2014 fix fail/warn checks before calling Oracle the default crypto harness.`;return{ok:u,score:g,max:l,pct:k,summary:C,researchMode:$(e),attributes:[...I],packageRoot:i,checks:t}}function J(){let[e,t]=process.versions.node.split(".").map(Number);return e>20||e===20&&t>=19}function Re(e){if(!P.existsSync(e))return{};let t={};for(let n of P.readFileSync(e,"utf8").split(/\r?\n/)){let r=n.match(/^([A-Z0-9_]+)=(.*)$/);r&&(t[r[1]]=r[2])}return t}async function Ce(e){let t=e.replace(/\/$/,"");for(let n of["/health","/public/health"])try{if((await fetch(t+n)).ok)return!0}catch{}return!1}var pt={name:"doctor",summary:"check the read plane (+ optional --agentic crypto harness score)",group:"read",usage:"oracle doctor [--json] [--agentic]",async run(e){let t=e.argv.includes("--json"),n=e.argv.includes("--agentic"),r=[],s=!1,o=(u,C,f,U=null)=>{r.push({id:u,status:C,detail:f,fix:U}),C==="fail"&&(s=!0)};o("node",J()?"ok":"fail",`node ${process.versions.node}`,J()?null:"install node >= 20.19");let d=e.paths.oracleExecEnvPath(),a=Re(d),y=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||a.ORACLE_ROUTE_ATTESTATION_SECRET||a.MAD_ROUTE_ATTESTATION_SECRET||a.ORACLE_ATTESTATION_SECRET||a.ORACLE_STAMP_HMAC_SECRET;o("attestation_secret",y?"ok":"warn",y?"present":"missing",y?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let p=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",b=await Ce(p),E=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;o("data_server",b?"ok":"warn",b?`reachable ${p}${E?` (${E})`:""}`:`down ${p}`,b?null:p.includes("127.0.0.1")||p.includes("localhost")?"oracle data serve OR set ~/.config/oracle/desk.json \u2192 Arch :8799":"check Arch desk is up (curl $ORACLE_DESK_URL/public/health)");let v=B();o("harness_model","ok","Oracle native is default; external clients are inbound MCP only (oracle harness detect)",null),o("hermes_opt_in","ok",v.ok?`detected ${v.bin} (${v.source}) \u2014 unused unless explicitly opted in`:"not detected \u2014 native-only OK",null);let R=Oe.join(e.paths.hermesRoot(),"profiles"),g=0;P.existsSync(R)&&(g=P.readdirSync(R,{withFileTypes:!0}).filter(u=>u.isDirectory()).length),o("hermes_lanes","ok",g>0?`${g} profile dir(s) (optional surface)`:"no Hermes lane profiles (native-only OK)",null);let l=null;if(n){l=X(process.env);for(let u of l.checks)o(`agentic_${u.id}`,u.status,u.detail,null)}let k={ok:!s&&(l?l.ok:!0),checks:r,...l?{agentic:{pct:l.pct,summary:l.summary,attributes:l.attributes,researchMode:l.researchMode}}:{}};if(t)process.stdout.write(JSON.stringify(k,null,2)+`
|
|
2
2
|
`);else{for(let u of r)process.stdout.write(`${u.status.toUpperCase().padEnd(4)} ${u.id}: ${u.detail}
|
|
3
3
|
`),u.fix&&process.stdout.write(` fix: ${u.fix}
|
|
4
4
|
`);l&&process.stdout.write(`
|