@oracle-agent/oracle 0.16.0 → 0.18.0
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/dist/assets/profiles/oracle/SOUL.md +14 -0
- package/dist/bin/desk-server.mjs +16 -16
- package/dist/bin/oracle-data-mcp.mjs +7 -7
- package/dist/bin/oracle-gateway.mjs +21 -0
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +9 -9
- package/dist/bin/oracle-scan.mjs +9 -9
- package/dist/bin/oracle.mjs +19 -18
- package/dist/cli/commands/auth.mjs +12 -12
- package/dist/cli/commands/bootstrap.mjs +7 -7
- package/dist/cli/commands/chain.mjs +15 -15
- package/dist/cli/commands/chat.mjs +36 -36
- package/dist/cli/commands/data.mjs +12 -7
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +18 -0
- package/dist/cli/commands/fees.mjs +4 -4
- package/dist/cli/commands/harness.mjs +6 -12
- package/dist/cli/commands/mcp.mjs +46 -22
- package/dist/cli/commands/model.mjs +42 -42
- package/dist/cli/commands/plugins.mjs +35 -35
- package/dist/cli/commands/setup.mjs +27 -27
- package/dist/cli/commands/sign.mjs +23 -2
- package/dist/cli/commands/swap.mjs +19 -19
- package/dist/data/desk-data.mjs +13 -13
- package/dist/index.mjs +18 -18
- package/dist/router/index.mjs +2 -2
- package/dist/scanner/index.mjs +4 -4
- package/package.json +26 -6
- package/public/oracle-splash/_variants/ice.html +3 -3
- package/public/oracle-splash/_variants/ivory.html +3 -3
- package/public/oracle-splash/index.html +3 -3
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import{parseArgs as
|
|
2
|
-
`),
|
|
1
|
+
import{parseArgs as k}from"node:util";import{spawn as m}from"node:child_process";var v=["SIGINT","SIGTERM","SIGHUP"];function h(t,a=[],r={},n=t){return new Promise(s=>{let e=m(t,a,r),o=!1,c=null,i=new Map(v.map(l=>[l,()=>{c||=l,e.exitCode===null&&e.signalCode===null&&e.kill(l)}]));for(let[l,p]of i)process.on(l,p);let u=()=>{for(let[l,p]of i)process.off(l,p)};e.once("error",l=>{o||(o=!0,u(),process.stderr.write(`oracle: could not start ${n}: ${l.message}
|
|
2
|
+
`),s(1))}),e.once("exit",(l,p)=>{if(o)return;o=!0,u();let f=c||p;if(f){process.kill(process.pid,f);return}s(l??1)})})}var w="http://127.0.0.1:8787";function g(){process.stderr.write(`usage: oracle data <serve|call|catalog|health> [args]
|
|
3
3
|
oracle data serve [--port N]
|
|
4
|
-
oracle data call <provider> <op> [--args '<json>']
|
|
4
|
+
oracle data call <provider> <op> [key=value ...] [--key value ...] [--args '<json>']
|
|
5
5
|
oracle data catalog
|
|
6
6
|
oracle data health
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
|
|
8
|
+
examples:
|
|
9
|
+
oracle data call bitcoin-esplora tipHeight
|
|
10
|
+
oracle data call poly-public markets slug=will-oscar-piastri-be-the-2026-f1-drivers-champion
|
|
11
|
+
oracle data call hl-markets coin coin=HYPE
|
|
12
|
+
`)}function y(t){let a=t[0],r=t[1];if(!a||!r)return{ok:!1,error:"provider and op are required"};let n={};for(let s=2;s<t.length;s+=1){let e=t[s];if(e==="--args"){try{Object.assign(n,JSON.parse(t[++s]||"{}"))}catch(c){return{ok:!1,error:`invalid --args JSON: ${c.message}`}}continue}if(e.startsWith("--")){let c=e.slice(2),i=t[s+1];if(i==null||i.startsWith("--")){n[c]=!0;continue}n[c]=i,s+=1;continue}let o=e.indexOf("=");if(o>0){n[e.slice(0,o)]=e.slice(o+1);continue}return{ok:!1,error:`unexpected positional argument '${e}'. Pass parameters as key=value (e.g. slug=${e}), as --key value, or as --args '{"slug":"${e}"}'.`}}return{ok:!0,provider:a,op:r,args:n}}async function d(t,{method:a="GET",body:r}={}){let s=(process.env.ORACLE_DATA_URL||w).replace(/\/$/,"")+t;try{let e=await fetch(s,{method:a,headers:r?{"content-type":"application/json"}:void 0,body:r?JSON.stringify(r):void 0}),o=await e.text();return process.stdout.write(o.endsWith(`
|
|
13
|
+
`)?o:o+`
|
|
9
14
|
`),e.ok?0:1}catch(e){return e&&(e.code==="ECONNREFUSED"||/fetch failed|ECONNREFUSED/i.test(String(e)))?(process.stderr.write(`oracle: data server not running \u2014 start it with 'oracle data serve'
|
|
10
15
|
`),4):(process.stderr.write(`oracle data: ${e.message||e}
|
|
11
|
-
`),1)}}var
|
|
12
|
-
`),1
|
|
16
|
+
`),1)}}var N={name:"data",summary:"desk data plane",group:"read",usage:"oracle data serve|call|catalog|health",async run(t){let a=t.argv[0];if(!a||a==="--help"||a==="-h")return g(),a?0:1;if(a==="serve"){let r=null;try{let{values:e}=k({args:t.argv.slice(1),options:{port:{type:"string"}},allowPositionals:!0,strict:!1});r=e.port||null}catch{}let n={...process.env};r&&(n.ORACLE_DATA_PORT=String(r));let s=t.bin("desk-server.mjs");return h(process.execPath,[s],{stdio:"inherit",env:n},"desk-server")}if(a==="health")return d("/health");if(a==="catalog")return d("/data/catalog");if(a==="call"){let r=y(t.argv.slice(1));return r.ok?d("/data/call",{method:"POST",body:{provider:r.provider,op:r.op,args:r.args}}):(process.stderr.write(`oracle data call: ${r.error}
|
|
17
|
+
`),1)}return g(),1}};export{N as default,y as parseDataCallArgs};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
`);else{for(let
|
|
3
|
-
`),
|
|
4
|
-
`);
|
|
5
|
-
`)}return
|
|
1
|
+
import y from"node:fs";import Y from"node:path";var b="signing: not installed (optional) \u2014 npm i -g @oracle-agent/operator";import L from"node:fs";import h from"node:path";import x from"node:fs";import P from"node:os";import d from"node:path";import{fileURLToPath as w}from"node:url";var I=d.dirname(w(import.meta.url)),q=d.resolve(I,"../..");function S(){return process.env.ORACLE_FAKE_HOME||P.homedir()}function $(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function R(){return $()?process.env.ORACLE_CONFIG_DIR||d.join(S(),".config","oracle"):d.join(S(),".config","oracle")}function D(){return d.join(R(),"desk.json")}function N(){return d.join(R(),"env")}function f({force:e=!1}={}){if(f._done&&!e)return f._result||null;f._done=!0;let r={},t=(o,n)=>{if(n==null)return;let c=String(n).trim();c&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=c,r[o]=c))};try{let o=N();if(x.existsSync(o))for(let n of x.readFileSync(o,"utf8").split(/\r?\n/)){let c=n.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!c||c[2].startsWith("#"))continue;let a=c[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),t(c[1],a)}}catch{}try{let o=D();if(x.existsSync(o)){let n=JSON.parse(x.readFileSync(o,"utf8"));n&&typeof n=="object"&&(t("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),t("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),t("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),t("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),t("ORACLE_EXEC_URL",n.execUrl),t("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let s=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return s&&(t("ORACLE_DESK_URL",s),t("ORACLE_DATA_URL",s),t("ORACLE_API_URL",s),t("ORACLE_PUBLIC_URL",s),t("MAD_DESK_URL",s)),f._result=Object.keys(r).length?r:null,f._result}try{f()}catch{}var H="0.19.0",se=`hermes-agent==${H}`;var C="0.12.1",ie=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${C}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${C}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function M(){return h.join(R(),"runtime")}function B(){return h.join(M(),"venv")}function V(e){let r=process.platform==="win32"?"Scripts":"bin",t=process.platform==="win32"?`${e}.exe`:e;return h.join(B(),r,t)}function F(){return V("hermes")}function K(e){let r=process.platform==="win32"&&!h.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let t of(process.env.PATH||"").split(h.delimiter))if(t)for(let s of r){let o=h.join(t,`${e}${s}`);try{if(L.existsSync(o))return o}catch{}}return null}function T(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=K("hermes");if(e)return{ok:!0,bin:e,source:"path"};let r=F();return L.existsSync(r)?{ok:!0,bin:r,source:"managed"}:{ok:!1,bin:null,source:null}}function U(){let[e,r]=process.versions.node.split(".").map(Number);return e>20||e===20&&r>=19}function G(e){if(!y.existsSync(e))return{};let r={};for(let t of y.readFileSync(e,"utf8").split(/\r?\n/)){let s=t.match(/^([A-Z0-9_]+)=(.*)$/);s&&(r[s[1]]=s[2])}return r}async function W(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 fe={name:"doctor",summary:"check read plane; checks signer too when installed",group:"read",usage:"oracle doctor [--json]",async run(e){let r=e.argv.includes("--json"),t=[],s=!1,o=(i,u,E,p=null)=>{t.push({id:i,status:u,detail:E,fix:p}),u==="fail"&&(s=!0)};o("node",U()?"ok":"fail",`node ${process.versions.node}`,U()?null:"install node >= 20.19");let n=e.paths.oracleExecEnvPath(),c=G(n),a=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||c.ORACLE_ROUTE_ATTESTATION_SECRET||c.MAD_ROUTE_ATTESTATION_SECRET||c.ORACLE_ATTESTATION_SECRET||c.ORACLE_STAMP_HMAC_SECRET;o("attestation_secret",a?"ok":"warn",a?"present":"missing",a?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let v=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",g=await W(v),A=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",g?"ok":"warn",g?`reachable ${v}${A?` (${A})`:""}`:`down ${v}`,g?null:v.includes("127.0.0.1")||v.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 m=T();o("agent_runtime",m.ok?"ok":"warn",m.ok?`present ${m.bin} (${m.source})`:"not installed",m.ok?null:"oracle bootstrap");let O=Y.join(e.paths.hermesRoot(),"profiles"),_=0;y.existsSync(O)&&(_=y.readdirSync(O,{withFileTypes:!0}).filter(i=>i.isDirectory()).length),o("hermes_lanes",_>0?"ok":"warn",_>0?`${_} profile dir(s)`:"no lane profiles found",_>0?null:"oracle init --apply");let l=e.resolveOperator(),k={installed:!1};if(l.ok){let i=e.dispatchOperator("oracle-agentic-doctor",["--json"],{stdio:"pipe"}),u={installed:!0,version:l.version,source:l.source};if(i&&typeof i=="object"&&i.stdout)try{let p=JSON.parse(i.stdout);u={installed:!0,version:l.version,source:l.source,signingReady:p.signingReady,broadcastReady:p.broadcastReady,executionReady:p.executionReady,masterKillSwitch:p.masterKillSwitch,raw:p}}catch{u.doctorParseError=!0,u.doctorExit=i.code}else typeof i=="number"&&(u.doctorExit=i);k=u;let E=u.signingReady===!0;o("signing",E?"ok":"warn",E?`operator ${l.version} ready via ${l.source}`:`operator ${l.version} installed but signing is not ready`,E?null:"oracle sign doctor --json")}let j={ok:!s,checks:t,operator:k};if(r)process.stdout.write(JSON.stringify(j,null,2)+`
|
|
2
|
+
`);else{for(let i of t)process.stdout.write(`${i.status.toUpperCase().padEnd(4)} ${i.id}: ${i.detail}
|
|
3
|
+
`),i.fix&&process.stdout.write(` fix: ${i.fix}
|
|
4
|
+
`);l.ok||process.stdout.write(`INFO ${b}
|
|
5
|
+
`)}return s?1:0}};export{fe as default};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{spawnSync as k}from"node:child_process";import T from"node:fs";import u from"node:path";import{fileURLToPath as E,pathToFileURL as S}from"node:url";var g=u.dirname(E(import.meta.url)),f=u.resolve(g,"../../.."),O=u.resolve(f,"../.."),h=u.join(O,"apps","oracle-app"),A=["test/best-execution.test.mjs","test/agent-grants.test.mjs","test/action-receipts.test.mjs","test/oracle-e2e-public-flow.test.mjs","test/auto-slippage.test.mjs","test/capability-posture.test.mjs","test/flag-polarity.test.mjs","test/cli-health-probe.test.mjs","test/public-surface-doc.test.mjs"];function R(c,{cwd:a,full:n=!1}={}){let e={...process.env,ORACLE_TEST_ISOLATE_SECRETS:"1",ORACLE_ROUTE_ATTESTATION_SECRET:process.env.ORACLE_ROUTE_ATTESTATION_SECRET||"oracle-unit-test-secret",ORACLE_GATE_BYPASS:"1"},o=n?["--test","test/*.test.mjs"]:["--test",...c];return n?k("bash",["-lc","ORACLE_TEST_ISOLATE_SECRETS=1 ORACLE_ROUTE_ATTESTATION_SECRET=oracle-unit-test-secret ORACLE_GATE_BYPASS=1 node --test test/*.test.mjs"],{cwd:a||f,encoding:"utf8",env:e,maxBuffer:20971520}):k(process.execPath,o,{cwd:a||f,encoding:"utf8",env:e,maxBuffer:20*1024*1024})}function _(c){let a=`${c.stdout||""}
|
|
3
|
+
${c.stderr||""}`,n=Number((a.match(/ℹ pass (\d+)/)||[])[1]||0),e=Number((a.match(/ℹ fail (\d+)/)||[])[1]||0),o=Number((a.match(/ℹ skipped (\d+)/)||[])[1]||0);return{total:Number((a.match(/ℹ tests (\d+)/)||[])[1]||n+e+o),pass:n,fail:e,skipped:o,code:c.status??1}}async function w(){let c=u.join(h,"lib/oracle/swap-intent.ts");if(!T.existsSync(c))return{ok:!1,skipped:!0,error:`app parse module missing at ${c}`,cases:[]};let a=await import(S(c).href),{parseSwapIntent:n,parseConfirmIntent:e}=a,o=[],s=(r,m,d)=>o.push({name:r,ok:!!m,detail:d}),i=n("swap .1 eth to base");s("parse .1 eth to base \u2192 USDC/base",i?.tokenOut==="USDC"&&i?.chainHint==="base"&&i?.amount===".1",JSON.stringify(i));let l=n("swap 0.1 ETH to USDC on arbitrum");s("parse explicit pair+chain",l?.tokenOut==="USDC"&&l?.chainHint==="arbitrum");let p=n("sell .05 ETH for USDC on base");s("parse sell form",p?.tokenIn==="ETH"&&p?.tokenOut==="USDC"),s("garbage null",n("hello world")===null),s("confirm arm",e("arm")==="confirm"),s("confirm yes",e("yes")==="confirm"),s("cancel",e("cancel")==="cancel"),s("not confirm",e("what is eth")===null);let t=o.filter(r=>!r.ok).length;return{ok:t===0,total:o.length,pass:o.length-t,fail:t,cases:o}}var C={name:"eval",summary:"run desk / package eval harness",group:"read",usage:"oracle eval desk [--full] [--json]",async run(c){let a=c.argv||[],n=a.includes("--json"),e=a.includes("--full"),o=a.find(t=>!t.startsWith("-"))||"desk";if(o!=="desk"&&o!=="package")return process.stderr.write(`usage: oracle eval desk [--full] [--json]
|
|
4
|
+
`),64;let s={suite:e?"oracle-eval-full":"oracle-eval-desk",at:new Date().toISOString(),packageRoot:f,slices:{}},i=A.filter(t=>T.existsSync(u.join(f,t))),l=R(i,{full:e}),p=_(l);s.slices.packageTests={...p,ok:p.fail===0&&p.code===0,mode:e?"full":"desk-critical",files:e?["test/*.test.mjs"]:i,tail:`${l.stdout||""}
|
|
5
|
+
${l.stderr||""}`.trim().split(`
|
|
6
|
+
`).slice(-30).join(`
|
|
7
|
+
`)};try{s.slices.parse=await w()}catch(t){s.slices.parse={ok:!1,error:t instanceof Error?t.message:String(t)}}if(s.ok=s.slices.packageTests?.ok===!0&&(s.slices.parse?.ok===!0||s.slices.parse?.skipped===!0),n)process.stdout.write(`${JSON.stringify(s,null,2)}
|
|
8
|
+
`);else{let t=s.slices.packageTests,r=s.slices.parse;if(process.stdout.write(`Oracle eval \xB7 ${s.suite}
|
|
9
|
+
`),process.stdout.write(` package tests (${t.mode}): ${t.pass}/${t.total} pass \xB7 fail ${t.fail} \xB7 skip ${t.skipped} \xB7 ${t.ok?"OK":"FAIL"}
|
|
10
|
+
`),r?.skipped)process.stdout.write(` parse eval: skipped (${r.error})
|
|
11
|
+
`);else if(r&&(process.stdout.write(` parse eval: ${r.pass}/${r.total} pass \xB7 ${r.ok?"OK":"FAIL"}
|
|
12
|
+
`),!r.ok&&r.cases))for(let m of r.cases.filter(d=>!d.ok))process.stdout.write(` \u2717 ${m.name} ${m.detail||""}
|
|
13
|
+
`);process.stdout.write(`
|
|
14
|
+
${s.ok?"PASS":"FAIL"} oracle eval desk
|
|
15
|
+
`),!t.ok&&t.tail&&process.stdout.write(`
|
|
16
|
+
--- package test tail ---
|
|
17
|
+
${t.tail}
|
|
18
|
+
`)}return s.ok?0:1}};export{C as default};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{readFileSync as
|
|
1
|
+
import{readFileSync as D,existsSync as w}from"node:fs";import{Contract as C,JsonRpcProvider as m}from"ethers";var d="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",_=999,x="https://rpc.hyperliquid.xyz/evm",R=["function balanceOf(address owner) view returns (uint256)"],g=/^0x[a-fA-F0-9]{40}$/;function f(o){return g.test(String(o||""))}async function O(o,{contract:s=d,rpc:e=x,chainId:i=_,balanceOf:n}={}){if(!f(o))throw new Error("invalid-address");if(n)return BigInt(await n(o));let r=new m(e,i,{staticNetwork:!0}),c=new C(s,R,r);return BigInt(await c.balanceOf(o))}import p from"node:fs";import y from"node:os";import l from"node:path";import{fileURLToPath as v}from"node:url";var U=l.dirname(v(import.meta.url)),M=l.resolve(U,"../..");function L(){return process.env.ORACLE_FAKE_HOME||y.homedir()}function S(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function h(){return S()?process.env.ORACLE_CONFIG_DIR||l.join(L(),".config","oracle"):l.join(L(),".config","oracle")}function A(){return l.join(h(),"exec.env")}function b(){return l.join(h(),"desk.json")}function j(){return l.join(h(),"env")}function u({force:o=!1}={}){if(u._done&&!o)return u._result||null;u._done=!0;let s={},e=(n,r)=>{if(r==null)return;let c=String(r).trim();c&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=c,s[n]=c))};try{let n=j();if(p.existsSync(n))for(let r of p.readFileSync(n,"utf8").split(/\r?\n/)){let c=r.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!c||c[2].startsWith("#"))continue;let a=c[2];(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),e(c[1],a)}}catch{}try{let n=b();if(p.existsSync(n)){let r=JSON.parse(p.readFileSync(n,"utf8"));r&&typeof r=="object"&&(e("ORACLE_DESK_URL",r.deskUrl||r.dataUrl||r.url),e("ORACLE_DATA_URL",r.dataUrl||r.deskUrl||r.url),e("ORACLE_API_URL",r.apiUrl||r.dataUrl||r.deskUrl),e("ORACLE_PUBLIC_URL",r.publicUrl||r.deskUrl||r.dataUrl),e("ORACLE_EXEC_URL",r.execUrl),e("MAD_DESK_URL",r.deskUrl||r.dataUrl))}}catch{}let i=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return i&&(e("ORACLE_DESK_URL",i),e("ORACLE_DATA_URL",i),e("ORACLE_API_URL",i),e("ORACLE_PUBLIC_URL",i),e("MAD_DESK_URL",i)),u._result=Object.keys(s).length?s:null,u._result}try{u()}catch{}var E=`oracle fees \u2014 Oracle fee-waiver status
|
|
2
2
|
|
|
3
3
|
oracle fees status check the configured agent wallet
|
|
4
4
|
oracle fees check <address> check any address
|
|
5
5
|
oracle fees info show the Locals Only collection
|
|
6
6
|
|
|
7
7
|
Oracle is public to everyone. A Locals Only NFT only waives Oracle's integrator
|
|
8
|
-
fee. This command reads balanceOf on HyperEVM; it does not sign or request keys.`;function
|
|
9
|
-
`)){let
|
|
10
|
-
`)}async function
|
|
8
|
+
fee. This command reads balanceOf on HyperEVM; it does not sign or request keys.`;function k(o=A()){if(!w(o))return null;try{let s=D(o,"utf8");for(let e of s.split(`
|
|
9
|
+
`)){let i=e.match(/^\s*(?:export\s+)?ORACLE_EVM_ADDRESS\s*=\s*(.+)\s*$/);if(!i)continue;let n=i[1].trim().replace(/^["']|["']$/g,"");if(f(n))return n}}catch{return null}return null}function t(o,s){o.write(s+`
|
|
10
|
+
`)}async function P(o=[],s={}){let e=s.out??process.stdout,i=s.err??process.stderr,n=s.balanceOf??O,r=o[0];if(!r||r==="--help"||r==="-h"||r==="help")return t(e,E),0;if(r==="info")return t(e,`contract: ${d}`),t(e,`chain: HyperEVM (${_})`),t(e,"benefit: 0% Oracle integrator fee"),t(e,"access: public to everyone"),0;let c;if(r==="status"){if(c=s.agentAddress?s.agentAddress():k(),!c)return t(e,"wallet: not configured"),t(e,"Locals Only fee-waiver status: unavailable"),t(e,"standard Oracle fee applies when configured"),t(e,"Oracle access remains public to everyone."),0}else if(r==="check"){if(c=o[1],!f(c))return t(i,"usage: oracle fees check <0x address>"),2}else return t(i,`oracle fees: unknown subcommand '${r}'`),2;try{let a=await n(c);return t(e,`wallet: ${c}`),BigInt(a)>0n?(t(e,`Locals Only balance: ${a}`),t(e,"Oracle integrator fee: 0%")):(t(e,"Locals Only balance: 0"),t(e,"standard Oracle fee applies when configured")),t(e,"Oracle access remains public to everyone."),0}catch{return t(e,"Locals Only fee-waiver status: unavailable"),t(e,"standard Oracle fee applies when configured"),t(e,"Oracle access remains public to everyone."),0}}var z="check Locals Only zero-fee eligibility",J={name:"fees",summary:"check Locals Only zero-fee eligibility",group:"read",usage:E,async run(o){return P(o.argv??[])}};export{k as agentAddress,J as default,z as help,P as run};
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
`)}
|
|
1
|
+
import u from"node:fs";import c from"node:path";var g=Object.freeze({openrouter:{key:"OPENROUTER_API_KEY",baseUrl:"https://openrouter.ai/api/v1",model:"openrouter/auto"},openai:{key:"OPENAI_API_KEY",baseUrl:"https://api.openai.com/v1",model:"gpt-4.1-mini"},xai:{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest"},deepseek:{key:"DEEPSEEK_API_KEY",baseUrl:"https://api.deepseek.com/v1",model:"deepseek-chat"},gemini:{key:"GEMINI_API_KEY",alternateKey:"GOOGLE_API_KEY",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",model:"gemini-2.5-flash"}}),O=Object.freeze({"anthropic-oauth":{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-20250514",protocol:"anthropic-messages"},"openai-codex":{key:"OPENAI_API_KEY",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.4",protocol:"responses"},"xai-oauth":{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest",protocol:"responses"}});var d=Object.freeze([{name:"oracle",bin:"oracle",label:"Oracle Native (default)",kind:"oracle"},{name:"hermes",bin:"hermes",label:"Hermes Agent",kind:"hermes"},{name:"opencode",bin:"opencode",label:"OpenCode",kind:"mcp"},{name:"claude",bin:"claude",label:"Claude Code",kind:"mcp"},{name:"codex",bin:"codex",label:"OpenAI Codex CLI",kind:"mcp"},{name:"cursor",bin:"cursor",label:"Cursor IDE",kind:"mcp"},{name:"windsurf",bin:"windsurf",label:"Windsurf",kind:"mcp"},{name:"aider",bin:"aider",label:"Aider",kind:"mcp"},{name:"continue",bin:"continue",label:"Continue",kind:"mcp"}]);function p(n){for(let o of(process.env.PATH||"").split(c.delimiter)){let e=c.join(o,n);try{if(u.existsSync(e))return e}catch{}}return null}function l(){let n=[];for(let o of d){if(o.name==="oracle"){n.push({...o,path:process.argv[1]||"oracle"});continue}let e=p(o.bin);e&&n.push({...o,path:e})}return n}var m=Object.freeze({claude:"claude-code",codex:"codex",cursor:"cursor",windsurf:"vscode",continue:"vscode",opencode:"generic",aider:"generic"});function h(n){if(n.kind==="oracle")return{...n,direction:"native",integrate:null,backendEnv:null,note:"Oracle's own agent loop. This is the default and needs no wiring."};let e=`oracle mcp install ${m[n.name]||"generic"}`;return n.kind==="hermes"?{...n,direction:"both",integrate:e,backendEnv:`ORACLE_CHAT_BACKEND=${n.name}`,note:"Legacy: this hands Oracle's native model loop to Hermes. Prefer the inbound MCP wiring above."}:{...n,direction:"inbound",integrate:e,backendEnv:null,note:"Calls Oracle as an MCP server. Oracle's native model loop stays in charge."}}function f(n){let o=n.map(h),e=o.find(r=>r.direction==="native"),a=o.filter(r=>r.direction==="inbound"||r.direction==="both"),i=o.filter(r=>r.backendEnv),t=[];if(t.push(""),t.push(`Oracle native chat: default${e?` (${e.path})`:""}`),t.push("Oracle runs its own agent loop, memory, skills, and scheduler."),t.push(""),t.push("Integrate Oracle INTO these clients (recommended \u2014 native loop stays):"),a.length===0)t.push(" (none detected \u2014 Oracle runs standalone, nothing else required)");else for(let r of a)t.push(` ${r.label.padEnd(22)} ${r.path}`),t.push(` ${" ".repeat(22)} ${r.integrate}`);if(t.push(""),i.length>0){t.push("Delegate Oracle's model loop to another harness (legacy, not recommended):");for(let r of i)t.push(` ${r.label.padEnd(22)} ${r.backendEnv}`),t.push(` ${" ".repeat(22)} ${r.note}`);t.push("")}return t.push("Detection is capability discovery only. It never changes the backend."),t.join(`
|
|
2
|
+
`)}function s(){return["oracle harness \u2014 detect installed agent harnesses",""," oracle harness detect scan PATH for Agent Plugins-compatible clients","","Two directions, do not confuse them:"," inbound \u2014 the client calls Oracle as an MCP server (oracle mcp install <target>)."," Oracle's native model loop stays in charge. This is integration."," outbound \u2014 Oracle hands its model loop to that harness (ORACLE_CHAT_BACKEND=<name>)."," This surrenders the native harness and is legacy only.","","Detected: opencode, claude, codex, cursor, windsurf, aider, continue, hermes"].join(`
|
|
3
|
+
`)}var C={name:"harness",summary:"detect installed agent harnesses",usage:s,async run(n,o){let e=n[0];if(e==="help"||e==="--help"||e==="-h")return process.stdout.write(s()+`
|
|
3
4
|
`),0;if(e&&e!=="detect"&&e!=="list")return process.stderr.write(`oracle harness: unknown subcommand '${e}'
|
|
4
5
|
`),process.stderr.write(s()+`
|
|
5
|
-
`),1;let
|
|
6
|
+
`),1;let a=l();return a.length===0?(process.stderr.write(`No agent harnesses detected on PATH.
|
|
6
7
|
`),process.stderr.write(`Oracle runs natively \u2014 no external agent required.
|
|
7
|
-
`),0
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
`),process.stdout.write(`Installed harnesses:
|
|
11
|
-
`);for(let r of a)process.stdout.write(` ${r.label.padEnd(22)} ${r.path}
|
|
12
|
-
`);return a.length===0&&process.stdout.write(` (none \u2014 Oracle runs standalone)
|
|
13
|
-
`),process.stdout.write(`
|
|
14
|
-
Set ORACLE_CHAT_BACKEND=<name> to use a different harness.
|
|
15
|
-
`),0}};export{b as default};
|
|
8
|
+
`),0):(process.stdout.write(f(a)+`
|
|
9
|
+
`),0)}};export{h as classifyHarness,C as default,f as renderHarnessReport};
|
|
@@ -1,36 +1,60 @@
|
|
|
1
|
-
import{parseArgs as
|
|
1
|
+
import{parseArgs as Fe}from"node:util";import Y from"node:path";import{fileURLToPath as fe}from"node:url";var de=Y.dirname(fe(import.meta.url)),We=Y.resolve(de,"../.."),Be=Object.freeze(["oracle-vault","oracle-credential","oracle-signer","oracle-runner","oracle-agentic-init","oracle-agentic-doctor","oracle-control-mcp","oracle-operator-caps"]),Ge=Object.freeze(["vault","credential","signer","runner","sign"]),q=`oracle: signing is unavailable in the public package.
|
|
2
2
|
|
|
3
3
|
The public 'oracle' package is prepare-only and never handles keys.
|
|
4
4
|
Owner-operated signing is private infrastructure and has no public npm install.
|
|
5
5
|
Review and sign prepared artifacts in your own wallet instead.
|
|
6
6
|
|
|
7
7
|
Nothing about your read/research/prepare setup is affected.
|
|
8
|
-
`;function
|
|
8
|
+
`;function _(e=process.stderr){e.write(q),q.endsWith(`
|
|
9
9
|
`)||e.write(`
|
|
10
|
-
`)}import{spawnSync as
|
|
11
|
-
`)}function
|
|
10
|
+
`)}import{spawnSync as Q}from"node:child_process";import ee from"node:path";import u from"node:fs";import j from"node:path";import ye from"node:os";import E from"node:fs";import me from"node:os";import h from"node:path";import{fileURLToPath as ge}from"node:url";var ke=h.dirname(ge(import.meta.url)),O=h.resolve(ke,"../..");function V(){return process.env.ORACLE_FAKE_HOME||me.homedir()}function he(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function z(){return he()?process.env.ORACLE_CONFIG_DIR||h.join(V(),".config","oracle"):h.join(V(),".config","oracle")}function Se(){return h.join(z(),"desk.json")}function be(){return h.join(z(),"env")}function x({force:e=!1}={}){if(x._done&&!e)return x._result||null;x._done=!0;let r={},t=(n,o)=>{if(o==null)return;let s=String(o).trim();s&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=s,r[n]=s))};try{let n=be();if(E.existsSync(n))for(let o of E.readFileSync(n,"utf8").split(/\r?\n/)){let s=o.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 n=Se();if(E.existsSync(n)){let o=JSON.parse(E.readFileSync(n,"utf8"));o&&typeof o=="object"&&(t("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),t("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),t("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),t("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),t("ORACLE_EXEC_URL",o.execUrl),t("MAD_DESK_URL",o.deskUrl||o.dataUrl))}}catch{}let i=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return i&&(t("ORACLE_DESK_URL",i),t("ORACLE_DATA_URL",i),t("ORACLE_API_URL",i),t("ORACLE_PUBLIC_URL",i),t("MAD_DESK_URL",i)),x._result=Object.keys(r).length?r:null,x._result}try{x()}catch{}function P(e){let r=[h.join(O,"bin",e),h.join(O,"dist","bin",e),h.join(O,"..","bin",e)];return r.find(t=>E.existsSync(t))||r[0]}function g(){return process.env.ORACLE_FAKE_HOME||ye.homedir()}function k({oracleRoot:e=O,operator:r=null,withControl:t=!1}={}){let n={"oracle-data":{command:"node",args:[e===O?P("oracle-data-mcp.mjs"):[j.join(e,"bin","oracle-data-mcp.mjs"),j.join(e,"dist","bin","oracle-data-mcp.mjs")].find(o=>u.existsSync(o))||j.join(e,"bin","oracle-data-mcp.mjs")]}};if(t){if(!r||!r.ok)return{ok:!1,reason:"operator-missing"};let o=r.bins?.["oracle-control-mcp"]||r.controlMcp||null;if(!o)return{ok:!1,reason:"control-bin-missing"};n["oracle-control"]={command:"node",args:[o]};let s=e===O?P("oracle-exec-mcp.mjs"):[j.join(e,"bin","oracle-exec-mcp.mjs"),j.join(e,"dist","bin","oracle-exec-mcp.mjs")].find(c=>u.existsSync(c))||j.join(e,"bin","oracle-exec-mcp.mjs");u.existsSync(s)&&(n["oracle-exec"]={command:"node",args:[s]})}return{ok:!0,specs:n}}function S(e){if(!u.existsSync(e))return null;let r=`${e}.bak-oracle-${Math.floor(Date.now()/1e3)}`,t=r;for(let n=1;u.existsSync(t);n+=1)t=`${r}-${n}`;let i=Z(e,"read");try{let n=we(t);try{u.writeFileSync(n,u.readFileSync(i))}finally{u.closeSync(n)}}finally{u.closeSync(i)}return t}function $(){return u.constants.O_NOFOLLOW||0}function X(e){let r=u.lstatSync(e);if(r.isSymbolicLink()||!r.isFile())throw new Error(`refusing to use non-regular config path: ${e}`)}function Z(e,r){X(e);let t=(r==="read"?u.constants.O_RDONLY:u.constants.O_WRONLY)|$();return u.openSync(e,t)}function we(e){return u.openSync(e,u.constants.O_WRONLY|u.constants.O_CREAT|u.constants.O_EXCL|$(),384)}function Oe(e,r){u.existsSync(e)&&X(e);let t=u.openSync(e,u.constants.O_WRONLY|u.constants.O_CREAT|u.constants.O_TRUNC|$(),384);try{u.writeFileSync(t,r)}finally{u.closeSync(t)}try{u.chmodSync(e,384)}catch{}}function T(e,r=""){if(!u.existsSync(e))return r;let t=Z(e,"read");try{return u.readFileSync(t,"utf8")}finally{u.closeSync(t)}}function R(e,r){u.mkdirSync(j.dirname(e),{recursive:!0}),Oe(e,r)}function D(e,r={}){return u.existsSync(e)?JSON.parse(T(e,"{}")):structuredClone(r)}function I(e,r){R(e,JSON.stringify(r,null,2)+`
|
|
11
|
+
`)}function b(e,r){let t=D(e,{});(!t.mcpServers||typeof t.mcpServers!="object")&&(t.mcpServers={});let i=!1;for(let[o,s]of Object.entries(r)){let c=t.mcpServers[o];c&&JSON.stringify(c)===JSON.stringify(s)||(t.mcpServers[o]=s,i=!0)}if(!i)return{status:"present",backup:null};let n=S(e);return I(e,t),{status:"written",backup:n}}function m(e,r={}){return{status:e,...r}}function je(){return ee.join(g(),".claude.json")}function ve(e){return ee.join(e||process.cwd(),".mcp.json")}function xe(e,r){let t=Q("claude",["--version"],{encoding:"utf8",timeout:1e4});if(t.error||t.status!==0)return null;let i=Q("claude",["mcp","add-json",e,JSON.stringify(r),"--scope","user"],{encoding:"utf8",timeout:3e4});return i.status!==0?{ok:!1,stderr:i.stderr||i.stdout||"failed"}:{ok:!0}}async function te({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:n=!1,cwd:o=process.cwd()}){let s=k({oracleRoot:e,operator:r,withControl:t});if(!s.ok)return{ok:!1,code:3,reason:s.reason};if(n)return{ok:!0,print:{mcpServers:s.specs}};if(i){let a=ve(o),f=b(a,s.specs);return{ok:!0,...m(f.status,{path:a,backup:f.backup})}}let c=!1;for(let[a,f]of Object.entries(s.specs)){let p=xe(a,f);if(p&&p.ok){c=!0;continue}break}if(c)return{ok:!0,...m("written",{method:"claude-cli"})};let d=je(),l=b(d,s.specs);return{ok:!0,...m(l.status,{path:d,backup:l.backup})}}import Ce from"node:fs";import F from"node:path";function _e(){return process.platform==="darwin"?F.join(g(),"Library","Application Support","Claude","claude_desktop_config.json"):F.join(g(),".config","Claude","claude_desktop_config.json")}async function J({oracleRoot:e,operator:r,withControl:t=!1,printOnly:i=!1}){let n=k({oracleRoot:e,operator:r,withControl:t});if(!n.ok)return{ok:!1,code:3,reason:n.reason};let o=_e(),s={mcpServers:n.specs};if(i)return{ok:!0,print:s};let c=F.dirname(o);if(!Ce.existsSync(c))return{ok:!0,status:"printed (Claude Desktop not detected)",path:o,print:s};let d=b(o,n.specs);return{ok:!0,...m(d.status,{path:o,backup:d.backup})}}import re from"node:fs";import ne from"node:path";var oe="# oracle-mcp-install begin",se="# oracle-mcp-install end";function Ee(){return ne.join(g(),".codex","config.toml")}function Re(e){let r=[oe];for(let[t,i]of Object.entries(e))r.push(`[mcp_servers.${t}]`),r.push(`command = ${JSON.stringify(i.command)}`),r.push(`args = [${i.args.map(n=>JSON.stringify(n)).join(", ")}]`),r.push("");return r.push(se),r.join(`
|
|
12
12
|
`)+`
|
|
13
|
-
`}function
|
|
13
|
+
`}function Ae(e){return e.replace(new RegExp(`${oe}[\\s\\S]*?${se}\\n?`,"g"),"")}async function M({oracleRoot:e,operator:r,withControl:t=!1,printOnly:i=!1}){let n=k({oracleRoot:e,operator:r,withControl:t});if(!n.ok)return{ok:!1,code:3,reason:n.reason};let o=Re(n.specs),s=Ee();if(i)return{ok:!0,printText:o,path:s};re.mkdirSync(ne.dirname(s),{recursive:!0});let c=re.existsSync(s)?T(s,""):"";if(c.includes(o.trim()))return{ok:!0,...m("present",{path:s,backup:null})};let l=(Ae(c).trimEnd()+`
|
|
14
14
|
|
|
15
|
-
`+
|
|
16
|
-
`)?
|
|
17
|
-
`),{ok:!0,...
|
|
18
|
-
`;e||(
|
|
19
|
-
`);return{ok:!0,...
|
|
15
|
+
`+o).replace(/^\n+/,"");if(c.trim()===l.trim())return{ok:!0,...m("present",{path:s,backup:null})};let a=c?S(s):null;return R(s,l.endsWith(`
|
|
16
|
+
`)?l:l+`
|
|
17
|
+
`),{ok:!0,...m("written",{path:s,backup:a})}}import Le from"node:fs";import ie from"node:path";var H="ChatGPT is hosted and can NEVER sign or reach your keys. This connector is read/prepare only; anything it prepares is unsigned until you sign it locally.";function Ne(){return{openapi:"3.1.0",info:{title:"Oracle Public (read/prepare)",version:"1.0.0",description:"Secret-free public surface for hosted clients. "+H},servers:[{url:"https://REPLACE-WITH-YOUR-TUNNEL"}],paths:{"/public/health":{get:{operationId:"publicHealth",summary:"Health check",responses:{200:{description:"ok"}}}},"/public/config":{get:{operationId:"publicConfig",summary:"Public config",responses:{200:{description:"ok"}}}},"/public/connect/request":{post:{operationId:"connectRequest",summary:"Build a connect request (unsigned)",responses:{200:{description:"unsigned request artifact"}}}},"/public/connect/assemble":{post:{operationId:"connectAssemble",summary:"Assemble an unsigned grant artifact",responses:{200:{description:"unsigned grant artifact"}}}},"/public/grants/active":{post:{operationId:"grantsActive",summary:"List active grants (read)",responses:{200:{description:"ok"}}}},"/public/grants/get":{post:{operationId:"grantsGet",summary:"Get a grant by id (read)",responses:{200:{description:"ok"}}}}}}}async function W({printOnly:e=!1}={}){let r=Ne(),t=ie.join(g(),".config","oracle","connectors","chatgpt-openapi.json"),i=JSON.stringify(r,null,2)+`
|
|
18
|
+
`;e||(Le.mkdirSync(ie.dirname(t),{recursive:!0}),R(t,i));let n=[H,"","Next steps:"," 1. oracle public serve"," 2. Expose 127.0.0.1:8799 through YOUR HTTPS tunnel (cloudflared, tailscale funnel, etc.)."," Oracle will not create tunnels for you."," 3. Paste the OpenAPI spec into a GPT Action, or add the tunnel URL as a developer-mode MCP connector.",e?"":` Spec written to: ${t}`].filter(Boolean).join(`
|
|
19
|
+
`);return{ok:!0,...m(e?"printed":"written",{path:t,print:r,instructions:n,cannotSign:H})}}import B from"node:path";import ce from"node:os";function Ue(){return process.platform==="darwin"?B.join(ce.homedir(),"Library","Application Support","Cursor","User","globalStorage","mcp.json"):process.platform==="win32"?B.join(ce.homedir(),"AppData","Roaming","Cursor","User","globalStorage","mcp.json"):B.join(g(),".config","cursor","mcp.json")}async function G({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:n=!1,cwd:o=process.cwd()}){let s=k({oracleRoot:e,operator:r,withControl:t});if(!s.ok)return{ok:!1,code:3,reason:s.reason};if(n)return{ok:!0,printText:['Add this to your Cursor MCP config (Cmd+Shift+P \u2192 "MCP: Open Configuration"):',JSON.stringify({mcpServers:s.specs},null,2)].join(`
|
|
20
20
|
|
|
21
|
-
`)};let
|
|
22
|
-
`)};let
|
|
21
|
+
`)};let c=Ue(),d=b(c,s.specs);return{ok:!0,...m(d.status,{path:c,backup:d.backup})}}import A from"node:path";import ae from"node:os";function Pe(){return process.platform==="darwin"?A.join(ae.homedir(),"Library","Application Support","Code","User","globalStorage","mcp.json"):process.platform==="win32"?A.join(ae.homedir(),"AppData","Roaming","Code","User","globalStorage","mcp.json"):A.join(g(),".config","Code","User","globalStorage","mcp.json")}function $e(e){return A.join(e||process.cwd(),".vscode","mcp.json")}async function K({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:n=!1,cwd:o=process.cwd()}){let s=k({oracleRoot:e,operator:r,withControl:t});if(!s.ok)return{ok:!1,code:3,reason:s.reason};if(n)return{ok:!0,printText:["Add this to your VS Code MCP config (.vscode/mcp.json):",JSON.stringify({mcpServers:s.specs},null,2),"","Alternatively, add to VS Code settings.json:",`"mcp.servers": ${JSON.stringify(s.specs,null,2)}`].join(`
|
|
22
|
+
`)};let c=i?$e(o):Pe(),d=b(c,s.specs);return{ok:!0,...m(d.status,{path:c,backup:d.backup})}}import{readFileSync as N,existsSync as v,writeFileSync as L,mkdirSync as ue}from"node:fs";import{join as y,dirname as Te}from"node:path";import{homedir as pe}from"node:os";var De=y(Te(new URL(import.meta.url).pathname),"..","..","..","profiles","oracle","SOUL.md");function Ie(){let e=[De,y(pe(),".config","oracle","SOUL.md")];for(let r of e)if(v(r))return N(r,"utf8");throw new Error("SOUL.md not found \u2014 run 'oracle bootstrap' first")}async function le(e,{cwd:r=process.cwd(),printOnly:t=!1}={}){let i=Ie();if(e==="claude-code"||e==="claude"){let n=y(r,"CLAUDE.md"),o=v(n)?N(n,"utf8"):"",s=`# Oracle Agent Instructions
|
|
23
|
+
${i}
|
|
24
|
+
---
|
|
25
|
+
${o}`;if(t)return{ok:!0,printText:`# Would write to ${n}:
|
|
26
|
+
|
|
27
|
+
${s.slice(0,500)}...`,status:"printed"};let c=S(n);return L(n,s,"utf8"),{ok:!0,path:n,backup:c,status:"installed"}}if(e==="cursor"){let n=y(r,".cursorrules"),o=v(n)?N(n,"utf8"):"",s=`# Oracle Agent Instructions
|
|
28
|
+
${i}
|
|
29
|
+
---
|
|
30
|
+
${o}`;if(t)return{ok:!0,printText:`# Would write to ${n}:
|
|
31
|
+
|
|
32
|
+
${s.slice(0,500)}...`,status:"printed"};let c=S(n);return L(n,s,"utf8"),{ok:!0,path:n,backup:c,status:"installed"}}if(e==="claude-desktop"){let n=y(pe(),"Library","Application Support","Claude","claude_desktop_config.json");if(!v(n))return{ok:!1,reason:"Claude Desktop config not found. Open Claude Desktop once first, then retry."};let o=D(n);if(t)return{ok:!0,printText:`# Would add Oracle SOUL to Claude Desktop custom instructions
|
|
33
|
+
|
|
34
|
+
${i.slice(0,500)}...`,status:"printed"};let s=S(n);return o.customInstructions=o.customInstructions||"",o.customInstructions=`# Oracle Agent Instructions
|
|
35
|
+
${i}
|
|
36
|
+
---
|
|
37
|
+
${o.customInstructions}`,I(n,o),{ok:!0,path:n,backup:s,status:"installed"}}if(e==="codex"||e==="copilot"){let n=y(r,".github"),o=y(n,"copilot-instructions.md"),s=v(o)?N(o,"utf8"):"";if(t)return{ok:!0,printText:`# Would write to ${o}:
|
|
38
|
+
|
|
39
|
+
${i.slice(0,500)}...`,status:"printed"};v(n)||ue(n,{recursive:!0});let c=S(o);return L(o,`${i}
|
|
40
|
+
---
|
|
41
|
+
${s}`,"utf8"),{ok:!0,path:o,backup:c,status:"installed"}}if(e==="vscode"||e==="vs-code"){let n=y(r,".vscode"),o=y(n,"instructions.md");if(t)return{ok:!0,printText:`# Would write to ${o}:
|
|
42
|
+
|
|
43
|
+
${i.slice(0,500)}...`,status:"printed"};v(n)||ue(n,{recursive:!0});let s=S(o);return L(o,`${i}
|
|
44
|
+
`,"utf8"),{ok:!0,path:o,backup:s,status:"installed"}}return{ok:!1,reason:`--with-soul not supported for target '${e}'`}}function U(){process.stderr.write(`usage: oracle mcp <install|print> [target] [flags]
|
|
23
45
|
targets: claude-code | claude-desktop | codex | copilot | chatgpt | cursor | vscode | generic
|
|
24
|
-
flags: --with-control --project --print --json
|
|
25
|
-
`)}function
|
|
46
|
+
flags: --with-control --with-soul --project --print --json
|
|
47
|
+
`)}function C(e,{json:r=!1}={}){if(e.print&&!e.instructions?process.stdout.write(JSON.stringify(e.print,null,2)+`
|
|
26
48
|
`):e.printText&&process.stdout.write(e.printText),e.instructions&&(process.stdout.write(e.instructions+`
|
|
27
49
|
`),e.print&&r&&process.stdout.write(JSON.stringify(e.print,null,2)+`
|
|
28
50
|
`)),!e.print&&!e.printText&&!e.instructions){let t={status:e.status,path:e.path||null,backup:e.backup||null,method:e.method||null};process.stdout.write((r?JSON.stringify(t,null,2):`${t.status}${t.path?" "+t.path:""}`)+`
|
|
29
|
-
`)}}var
|
|
30
|
-
`),
|
|
31
|
-
`),0):(
|
|
32
|
-
`),1)}if(r==="install"){let
|
|
33
|
-
`),0):(
|
|
34
|
-
`),1;return
|
|
35
|
-
`),
|
|
36
|
-
`)
|
|
51
|
+
`)}}var Gt={name:"mcp",summary:"wire Oracle into AI clients",group:"read",usage:"oracle mcp install <target> [--with-control] [--with-soul] | oracle mcp print [--target <t>] | oracle mcp watchdog [--once]",async run(e){let r=e.argv[0];if(!r||r==="--help"||r==="-h")return U(),r?0:1;if(r==="watchdog"){let{spawn:a}=await import("node:child_process"),f=await import("node:path"),p=e.argv.includes("--once"),w=f.join(e.root,"bin","oracle-mcp-watchdog.mjs");return a(process.execPath,[w,...p?["--once"]:[]],{stdio:"inherit",detached:!0}).unref(),0}let t,i;try{({values:t,positionals:i}=Fe({args:e.argv.slice(1),options:{"with-control":{type:"boolean",default:!1},"with-soul":{type:"boolean",default:!1},project:{type:"boolean",default:!1},print:{type:"boolean",default:!1},json:{type:"boolean",default:!1},target:{type:"string"}},allowPositionals:!0,strict:!1}))}catch(a){return process.stderr.write(`oracle mcp: ${a.message}
|
|
52
|
+
`),U(),1}let n=!!t["with-control"],o=!!t["with-soul"],s=!!t.project,c=!!t.json,d=e.resolveOperator?e.resolveOperator():{ok:!1};if(n&&(!d||!d.ok))return _(process.stderr),3;let l={oracleRoot:e.root,operator:d,withControl:n,project:s,cwd:process.cwd()};if(r==="print"){let a=t.target||i[0]||"claude-code";if(a==="generic"||a==="claude-code"){let f=k(l);return f.ok?(process.stdout.write(JSON.stringify({mcpServers:f.specs},null,2)+`
|
|
53
|
+
`),0):(_(process.stderr),3)}if(a==="chatgpt"){let f=await W({printOnly:!0});return C(f,{json:c}),0}return a==="codex"||a==="copilot"?(C(await M({...l,printOnly:!0}),{json:c}),0):a==="claude-desktop"?(C(await J({...l,printOnly:!0}),{json:c}),0):a==="cursor"?(C(await G({...l,printOnly:!0}),{json:c}),0):a==="vscode"||a==="vs-code"?(C(await K({...l,printOnly:!0}),{json:c}),0):(process.stderr.write(`oracle mcp: unknown target '${a}'
|
|
54
|
+
`),1)}if(r==="install"){let a=i[0]||t.target;if(!a)return U(),1;let f=!!t.print,p;if(a==="claude-code")p=await te({...l,printOnly:f});else if(a==="claude-desktop")p=await J({...l,printOnly:f});else if(a==="codex"||a==="copilot")p=await M({...l,printOnly:f});else if(a==="chatgpt")p=await W({printOnly:f});else if(a==="cursor")p=await G({...l,printOnly:f});else if(a==="vscode"||a==="vs-code")p=await K({...l,printOnly:f});else if(a==="generic"){let w=k(l);return w.ok?(process.stdout.write(JSON.stringify({mcpServers:w.specs},null,2)+`
|
|
55
|
+
`),0):(_(process.stderr),3)}else return process.stderr.write(`oracle mcp: unknown target '${a}'
|
|
56
|
+
`),1;if(!p.ok)return p.code===3?_(process.stderr):process.stderr.write(`oracle mcp: ${p.reason||"failed"}
|
|
57
|
+
`),p.code||1;if(C(p,{json:c}),o){let w=await le(a,{cwd:process.cwd(),printOnly:f});w.ok?process.stderr.write(` soul \u2192 ${w.path||"injected"}
|
|
58
|
+
`):process.stderr.write(` soul: ${w.reason||"failed"}
|
|
59
|
+
`)}return p.status&&String(p.status).startsWith("printed")&&p.print&&process.stdout.write(JSON.stringify(p.print,null,2)+`
|
|
60
|
+
`),0}return U(),1}};export{Gt as default};
|