@oracle-agent/oracle 0.22.2 → 0.22.4
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 +4 -4
- package/artifacts/specialist-packs/oracle-full-crypto.json +1 -1
- package/dist/assets/profiles/oracle/SOUL.md +18 -21
- package/dist/assets/skills/multichain-prepare-desk.md +29 -0
- package/dist/assets/skills/oracle-chat/SKILL.md +9 -13
- package/dist/assets/skills/oracle-desk.md +1 -1
- package/dist/assets/skills/oracle-prime-research/SKILL.md +40 -0
- package/dist/bin/desk-server.mjs +11 -11
- package/dist/bin/oracle-data-mcp.mjs +5 -5
- package/dist/bin/oracle-gateway.mjs +16 -16
- package/dist/bin/oracle-route.mjs +12 -12
- package/dist/bin/oracle-upgrade.mjs +7 -15
- package/dist/bin/oracle.mjs +16 -33
- package/dist/cli/commands/doctor.mjs +4 -5
- package/dist/cli/commands/eval.mjs +100 -16
- package/dist/cli/commands/init.mjs +3 -3
- package/dist/cli/commands/mcp.mjs +36 -45
- package/dist/cli/commands/prime.mjs +26 -0
- package/dist/cli/commands/swap.mjs +4 -4
- package/dist/cli/commands/version.mjs +2 -2
- package/dist/data/desk-data.mjs +5 -5
- package/dist/index.mjs +16 -16
- package/dist/router/index.mjs +1 -1
- package/dist/router/prepare-bridge.mjs +1 -1
- package/package.json +12 -5
- package/public/oracle-console/app.js +1 -1
- package/public/oracle-console/bitcoin-wallets.js +48 -111
- package/public/oracle-console/index.html +1 -1
- package/dist/assets/skills/multichain-exec-desk.md +0 -33
- package/dist/cli/commands/credential.mjs +0 -1
- package/dist/cli/commands/runner.mjs +0 -1
- package/dist/cli/commands/sign.mjs +0 -5
- package/dist/cli/commands/signer.mjs +0 -1
- package/dist/cli/commands/vault.mjs +0 -1
- package/dist/gateway/telegram-exact-action-callbacks.mjs +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{spawnSync as
|
|
2
|
-
`)}var d={name:"init",summary:"install agent lanes + read plane (dry-run by default)",group:"read",usage:"oracle init [--apply --force --only <lane> --json --yes]",async run(
|
|
3
|
-
`),1;e.stdout&&process.stdout.write(e.stdout),e.stderr&&process.stderr.write(e.stderr);let
|
|
1
|
+
import{spawnSync as c}from"node:child_process";var n=["oracle data serve # loopback read/prepare plane on 127.0.0.1:8787","oracle doctor # verify","oracle setup model # choose Claude, Codex, or Grok subscription OAuth","oracle chat # premium oracle chat surface","oracle chain list # pick hyperliquid/base/solana/...","oracle setup # telegram/discord/slack messaging","oracle mcp install claude-code"];function t(){return["","Next:",...n.map(s=>" "+s),""].join(`
|
|
2
|
+
`)}var d={name:"init",summary:"install agent lanes + read plane (dry-run by default)",group:"read",usage:"oracle init [--apply --force --only <lane> --json --yes]",async run(s){let r=[...s.argv];r.includes("--yes")&&!r.includes("--apply")&&r.push("--apply");let a=s.bin("oracle-init.mjs"),e=c(process.execPath,[a,...r],{encoding:"utf8",env:process.env});if(e.error)return process.stderr.write(`oracle: failed to spawn oracle-init: ${e.error.message}
|
|
3
|
+
`),1;e.stdout&&process.stdout.write(e.stdout),e.stderr&&process.stderr.write(e.stderr);let o=typeof e.status=="number"?e.status:1;return o===0&&r.includes("--apply")&&!r.includes("--json")&&process.stdout.write(t()),o}};export{d as default};
|
|
@@ -1,60 +1,51 @@
|
|
|
1
|
-
import{parseArgs as
|
|
2
|
-
|
|
3
|
-
The public 'oracle' package is prepare-only and never handles keys.
|
|
4
|
-
Owner-operated signing is private infrastructure and has no public npm install.
|
|
5
|
-
Review and sign prepared artifacts in your own wallet instead.
|
|
6
|
-
|
|
7
|
-
Nothing about your read/research/prepare setup is affected.
|
|
8
|
-
`;function C(t=process.stderr){t.write(K),K.endsWith(`
|
|
9
|
-
`)||t.write(`
|
|
10
|
-
`)}import{spawnSync as Q}from"node:child_process";import tt from"node:path";import u from"node:fs";import R from"node:path";import yt from"node:os";import _ from"node:fs";import mt from"node:os";import h from"node:path";import{fileURLToPath as gt}from"node:url";var kt=h.dirname(gt(import.meta.url)),j=h.resolve(kt,"../..");function Y(){return process.env.ORACLE_FAKE_HOME||mt.homedir()}function ht(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function V(){return ht()?process.env.ORACLE_CONFIG_DIR||h.join(Y(),".config","oracle"):h.join(Y(),".config","oracle")}function St(){return h.join(V(),"desk.json")}function bt(){return h.join(V(),"env")}function v({force:t=!1}={}){if(v._done&&!t)return v._result||null;v._done=!0;let r={},e=(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=bt();if(_.existsSync(n))for(let o of _.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)),e(s[1],c)}}catch{}try{let n=St();if(_.existsSync(n)){let o=JSON.parse(_.readFileSync(n,"utf8"));o&&typeof o=="object"&&(e("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),e("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),e("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),e("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),e("ORACLE_EXEC_URL",o.execUrl),e("MAD_DESK_URL",o.deskUrl||o.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)),v._result=Object.keys(r).length?r:null,v._result}try{v()}catch{}function z(t){let r=[h.join(j,"bin",t),h.join(j,"dist","bin",t),h.join(j,"..","bin",t)];return r.find(e=>_.existsSync(e))||r[0]}function g(){return process.env.ORACLE_FAKE_HOME||yt.homedir()}function k({oracleRoot:t=j,operator:r=null,withControl:e=!1}={}){let n={"oracle-data":{command:"node",args:[t===j?z("oracle-data-mcp.mjs"):[R.join(t,"bin","oracle-data-mcp.mjs"),R.join(t,"dist","bin","oracle-data-mcp.mjs")].find(o=>u.existsSync(o))||R.join(t,"bin","oracle-data-mcp.mjs")]}};if(e){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]}}return{ok:!0,specs:n}}function S(t){if(!u.existsSync(t))return null;let r=`${t}.bak-oracle-${Math.floor(Date.now()/1e3)}`,e=r;for(let n=1;u.existsSync(e);n+=1)e=`${r}-${n}`;let i=Z(t,"read");try{let n=wt(e);try{u.writeFileSync(n,u.readFileSync(i))}finally{u.closeSync(n)}}finally{u.closeSync(i)}return e}function P(){return u.constants.O_NOFOLLOW||0}function X(t){let r=u.lstatSync(t);if(r.isSymbolicLink()||!r.isFile())throw new Error(`refusing to use non-regular config path: ${t}`)}function Z(t,r){X(t);let e=(r==="read"?u.constants.O_RDONLY:u.constants.O_WRONLY)|P();return u.openSync(t,e)}function wt(t){return u.openSync(t,u.constants.O_WRONLY|u.constants.O_CREAT|u.constants.O_EXCL|P(),384)}function Ot(t,r){u.existsSync(t)&&X(t);let e=u.openSync(t,u.constants.O_WRONLY|u.constants.O_CREAT|u.constants.O_TRUNC|P(),384);try{u.writeFileSync(e,r)}finally{u.closeSync(e)}try{u.chmodSync(t,384)}catch{}}function $(t,r=""){if(!u.existsSync(t))return r;let e=Z(t,"read");try{return u.readFileSync(e,"utf8")}finally{u.closeSync(e)}}function E(t,r){u.mkdirSync(R.dirname(t),{recursive:!0}),Ot(t,r)}function T(t,r={}){return u.existsSync(t)?JSON.parse($(t,"{}")):structuredClone(r)}function D(t,r){E(t,JSON.stringify(r,null,2)+`
|
|
11
|
-
`)}function b(t,r){let e=T(t,{});(!e.mcpServers||typeof e.mcpServers!="object")&&(e.mcpServers={});let i=!1;for(let[o,s]of Object.entries(r)){let c=e.mcpServers[o];c&&JSON.stringify(c)===JSON.stringify(s)||(e.mcpServers[o]=s,i=!0)}if(!i)return{status:"present",backup:null};let n=S(t);return D(t,e),{status:"written",backup:n}}function m(t,r={}){return{status:t,...r}}function vt(){return tt.join(g(),".claude.json")}function jt(t){return tt.join(t||process.cwd(),".mcp.json")}function xt(t,r){let e=Q("claude",["--version"],{encoding:"utf8",timeout:1e4});if(e.error||e.status!==0)return null;let i=Q("claude",["mcp","add-json",t,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 et({oracleRoot:t,operator:r,withControl:e=!1,project:i=!1,printOnly:n=!1,cwd:o=process.cwd()}){let s=k({oracleRoot:t,operator:r,withControl:e});if(!s.ok)return{ok:!1,code:3,reason:s.reason};if(n)return{ok:!0,print:{mcpServers:s.specs}};if(i){let a=jt(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=xt(a,f);if(p&&p.ok){c=!0;continue}break}if(c)return{ok:!0,...m("written",{method:"claude-cli"})};let d=vt(),l=b(d,s.specs);return{ok:!0,...m(l.status,{path:d,backup:l.backup})}}import Ct from"node:fs";import I from"node:path";function _t(){return process.platform==="darwin"?I.join(g(),"Library","Application Support","Claude","claude_desktop_config.json"):I.join(g(),".config","Claude","claude_desktop_config.json")}async function F({oracleRoot:t,operator:r,withControl:e=!1,printOnly:i=!1}){let n=k({oracleRoot:t,operator:r,withControl:e});if(!n.ok)return{ok:!1,code:3,reason:n.reason};let o=_t(),s={mcpServers:n.specs};if(i)return{ok:!0,print:s};let c=I.dirname(o);if(!Ct.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 rt from"node:fs";import nt from"node:path";var ot="# oracle-mcp-install begin",st="# oracle-mcp-install end";function Et(){return nt.join(g(),".codex","config.toml")}function Rt(t){let r=[ot];for(let[e,i]of Object.entries(t))r.push(`[mcp_servers.${e}]`),r.push(`command = ${JSON.stringify(i.command)}`),r.push(`args = [${i.args.map(n=>JSON.stringify(n)).join(", ")}]`),r.push("");return r.push(st),r.join(`
|
|
1
|
+
import{parseArgs as Ut}from"node:util";import{spawnSync as V}from"node:child_process";import q from"node:path";import u from"node:fs";import v from"node:path";import dt from"node:os";import C from"node:fs";import ct from"node:os";import g from"node:path";import{fileURLToPath as at}from"node:url";var ut=g.dirname(at(import.meta.url)),x=g.resolve(ut,"../..");function W(){return process.env.ORACLE_FAKE_HOME||ct.homedir()}function pt(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function G(){return pt()?process.env.ORACLE_CONFIG_DIR||g.join(W(),".config","oracle"):g.join(W(),".config","oracle")}function lt(){return g.join(G(),"desk.json")}function ft(){return g.join(G(),"env")}function w({force:t=!1}={}){if(w._done&&!t)return w._result||null;w._done=!0;let n={},r=(e,o)=>{if(o==null)return;let i=String(o).trim();i&&(process.env[e]!=null&&String(process.env[e]).trim()!==""||(process.env[e]=i,n[e]=i))};try{let e=ft();if(C.existsSync(e))for(let o of C.readFileSync(e,"utf8").split(/\r?\n/)){let i=o.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let c=i[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(i[1],c)}}catch{}try{let e=lt();if(C.existsSync(e)){let o=JSON.parse(C.readFileSync(e,"utf8"));o&&typeof o=="object"&&(r("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),r("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),r("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),r("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),r("ORACLE_EXEC_URL",o.execUrl),r("MAD_DESK_URL",o.deskUrl||o.dataUrl))}}catch{}let s=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return s&&(r("ORACLE_DESK_URL",s),r("ORACLE_DATA_URL",s),r("ORACLE_API_URL",s),r("ORACLE_PUBLIC_URL",s),r("MAD_DESK_URL",s)),w._result=Object.keys(n).length?n:null,w._result}try{w()}catch{}function B(t){let n=[g.join(x,"bin",t),g.join(x,"dist","bin",t),g.join(x,"..","bin",t)];return n.find(r=>C.existsSync(r))||n[0]}function d(){return process.env.ORACLE_FAKE_HOME||dt.homedir()}function m({oracleRoot:t=x}={}){return{ok:!0,specs:{"oracle-data":{command:"node",args:[t===x?B("oracle-data-mcp.mjs"):[v.join(t,"bin","oracle-data-mcp.mjs"),v.join(t,"dist","bin","oracle-data-mcp.mjs")].find(s=>u.existsSync(s))||v.join(t,"bin","oracle-data-mcp.mjs")]}}}}function k(t){if(!u.existsSync(t))return null;let n=`${t}.bak-oracle-${Math.floor(Date.now()/1e3)}`,r=n;for(let e=1;u.existsSync(r);e+=1)r=`${n}-${e}`;let s=Y(t,"read");try{let e=mt(r);try{u.writeFileSync(e,u.readFileSync(s))}finally{u.closeSync(e)}}finally{u.closeSync(s)}return r}function L(){return u.constants.O_NOFOLLOW||0}function K(t){let n=u.lstatSync(t);if(n.isSymbolicLink()||!n.isFile())throw new Error(`refusing to use non-regular config path: ${t}`)}function Y(t,n){K(t);let r=(n==="read"?u.constants.O_RDONLY:u.constants.O_WRONLY)|L();return u.openSync(t,r)}function mt(t){return u.openSync(t,u.constants.O_WRONLY|u.constants.O_CREAT|u.constants.O_EXCL|L(),384)}function gt(t,n){u.existsSync(t)&&K(t);let r=u.openSync(t,u.constants.O_WRONLY|u.constants.O_CREAT|u.constants.O_TRUNC|L(),384);try{u.writeFileSync(r,n)}finally{u.closeSync(r)}try{u.chmodSync(t,384)}catch{}}function U(t,n=""){if(!u.existsSync(t))return n;let r=Y(t,"read");try{return u.readFileSync(r,"utf8")}finally{u.closeSync(r)}}function O(t,n){u.mkdirSync(v.dirname(t),{recursive:!0}),gt(t,n)}function $(t,n={}){return u.existsSync(t)?JSON.parse(U(t,"{}")):structuredClone(n)}function N(t,n){O(t,JSON.stringify(n,null,2)+`
|
|
2
|
+
`)}function h(t,n){let r=$(t,{});(!r.mcpServers||typeof r.mcpServers!="object")&&(r.mcpServers={});let s=!1;for(let[o,i]of Object.entries(n)){let c=r.mcpServers[o];c&&JSON.stringify(c)===JSON.stringify(i)||(r.mcpServers[o]=i,s=!0)}if(!s)return{status:"present",backup:null};let e=k(t);return N(t,r),{status:"written",backup:e}}function f(t,n={}){return{status:t,...n}}function kt(){return q.join(d(),".claude.json")}function ht(t){return q.join(t||process.cwd(),".mcp.json")}function St(t,n){let r=V("claude",["--version"],{encoding:"utf8",timeout:1e4});if(r.error||r.status!==0)return null;let s=V("claude",["mcp","add-json",t,JSON.stringify(n),"--scope","user"],{encoding:"utf8",timeout:3e4});return s.status!==0?{ok:!1,stderr:s.stderr||s.stdout||"failed"}:{ok:!0}}async function X({oracleRoot:t,project:n=!1,printOnly:r=!1,cwd:s=process.cwd()}){let e=m({oracleRoot:t});if(!e.ok)return{ok:!1,code:3,reason:e.reason};if(r)return{ok:!0,print:{mcpServers:e.specs}};if(n){let a=ht(s),l=h(a,e.specs);return{ok:!0,...f(l.status,{path:a,backup:l.backup})}}let o=!1;for(let[a,l]of Object.entries(e.specs)){let p=St(a,l);if(p&&p.ok){o=!0;continue}break}if(o)return{ok:!0,...f("written",{method:"claude-cli"})};let i=kt(),c=h(i,e.specs);return{ok:!0,...f(c.status,{path:i,backup:c.backup})}}import yt from"node:fs";import P from"node:path";function bt(){return process.platform==="darwin"?P.join(d(),"Library","Application Support","Claude","claude_desktop_config.json"):P.join(d(),".config","Claude","claude_desktop_config.json")}async function T({oracleRoot:t,printOnly:n=!1}){let r=m({oracleRoot:t});if(!r.ok)return{ok:!1,code:3,reason:r.reason};let s=bt(),e={mcpServers:r.specs};if(n)return{ok:!0,print:e};let o=P.dirname(s);if(!yt.existsSync(o))return{ok:!0,status:"printed (Claude Desktop not detected)",path:s,print:e};let i=h(s,r.specs);return{ok:!0,...f(i.status,{path:s,backup:i.backup})}}import Z from"node:fs";import z from"node:path";var Q="# oracle-mcp-install begin",tt="# oracle-mcp-install end";function wt(){return z.join(d(),".codex","config.toml")}function xt(t){let n=[Q];for(let[r,s]of Object.entries(t))n.push(`[mcp_servers.${r}]`),n.push(`command = ${JSON.stringify(s.command)}`),n.push(`args = [${s.args.map(e=>JSON.stringify(e)).join(", ")}]`),n.push("");return n.push(tt),n.join(`
|
|
12
3
|
`)+`
|
|
13
|
-
`}function
|
|
4
|
+
`}function jt(t){return t.replace(new RegExp(`${Q}[\\s\\S]*?${tt}\\n?`,"g"),"")}async function D({oracleRoot:t,printOnly:n=!1}){let r=m({oracleRoot:t});if(!r.ok)return{ok:!1,code:3,reason:r.reason};let s=xt(r.specs),e=wt();if(n)return{ok:!0,printText:s,path:e};Z.mkdirSync(z.dirname(e),{recursive:!0});let o=Z.existsSync(e)?U(e,""):"";if(o.includes(s.trim()))return{ok:!0,...f("present",{path:e,backup:null})};let c=(jt(o).trimEnd()+`
|
|
14
5
|
|
|
15
|
-
`+
|
|
16
|
-
`)?
|
|
17
|
-
`),{ok:!0,...
|
|
18
|
-
`;t||(
|
|
19
|
-
`);return{ok:!0,...
|
|
6
|
+
`+s).replace(/^\n+/,"");if(o.trim()===c.trim())return{ok:!0,...f("present",{path:e,backup:null})};let a=o?k(e):null;return O(e,c.endsWith(`
|
|
7
|
+
`)?c:c+`
|
|
8
|
+
`),{ok:!0,...f("written",{path:e,backup:a})}}import Ct from"node:fs";import et from"node:path";var F="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 Ot(){return{openapi:"3.1.0",info:{title:"Oracle Public (read/prepare)",version:"1.0.0",description:"Secret-free public surface for hosted clients. "+F},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 I({printOnly:t=!1}={}){let n=Ot(),r=et.join(d(),".config","oracle","connectors","chatgpt-openapi.json"),s=JSON.stringify(n,null,2)+`
|
|
9
|
+
`;t||(Ct.mkdirSync(et.dirname(r),{recursive:!0}),O(r,s));let e=[F,"","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.",t?"":` Spec written to: ${r}`].filter(Boolean).join(`
|
|
10
|
+
`);return{ok:!0,...f(t?"printed":"written",{path:r,print:n,instructions:e,cannotSign:F})}}import J from"node:path";import rt from"node:os";function vt(){return process.platform==="darwin"?J.join(rt.homedir(),"Library","Application Support","Cursor","User","globalStorage","mcp.json"):process.platform==="win32"?J.join(rt.homedir(),"AppData","Roaming","Cursor","User","globalStorage","mcp.json"):J.join(d(),".config","cursor","mcp.json")}async function M({oracleRoot:t,project:n=!1,printOnly:r=!1,cwd:s=process.cwd()}){let e=m({oracleRoot:t});if(!e.ok)return{ok:!1,code:3,reason:e.reason};if(r)return{ok:!0,printText:['Add this to your Cursor MCP config (Cmd+Shift+P \u2192 "MCP: Open Configuration"):',JSON.stringify({mcpServers:e.specs},null,2)].join(`
|
|
20
11
|
|
|
21
|
-
`)};let
|
|
22
|
-
`)};let
|
|
23
|
-
${
|
|
12
|
+
`)};let o=vt(),i=h(o,e.specs);return{ok:!0,...f(i.status,{path:o,backup:i.backup})}}import _ from"node:path";import nt from"node:os";function _t(){return process.platform==="darwin"?_.join(nt.homedir(),"Library","Application Support","Code","User","globalStorage","mcp.json"):process.platform==="win32"?_.join(nt.homedir(),"AppData","Roaming","Code","User","globalStorage","mcp.json"):_.join(d(),".config","Code","User","globalStorage","mcp.json")}function Et(t){return _.join(t||process.cwd(),".vscode","mcp.json")}async function H({oracleRoot:t,project:n=!1,printOnly:r=!1,cwd:s=process.cwd()}){let e=m({oracleRoot:t});if(!e.ok)return{ok:!1,code:3,reason:e.reason};if(r)return{ok:!0,printText:["Add this to your VS Code MCP config (.vscode/mcp.json):",JSON.stringify({mcpServers:e.specs},null,2),"","Alternatively, add to VS Code settings.json:",`"mcp.servers": ${JSON.stringify(e.specs,null,2)}`].join(`
|
|
13
|
+
`)};let o=n?Et(s):_t(),i=h(o,e.specs);return{ok:!0,...f(i.status,{path:o,backup:i.backup})}}import{readFileSync as A,existsSync as b,writeFileSync as E,mkdirSync as ot}from"node:fs";import{join as S,dirname as At}from"node:path";import{homedir as st}from"node:os";var Rt=S(At(new URL(import.meta.url).pathname),"..","..","..","profiles","oracle","SOUL.md");function Lt(){let t=[Rt,S(st(),".config","oracle","SOUL.md")];for(let n of t)if(b(n))return A(n,"utf8");throw new Error("SOUL.md not found \u2014 run 'oracle bootstrap' first")}async function it(t,{cwd:n=process.cwd(),printOnly:r=!1}={}){let s=Lt();if(t==="claude-code"||t==="claude"){let e=S(n,"CLAUDE.md"),o=b(e)?A(e,"utf8"):"",i=`# Oracle Agent Instructions
|
|
14
|
+
${s}
|
|
24
15
|
---
|
|
25
|
-
${o}`;if(
|
|
16
|
+
${o}`;if(r)return{ok:!0,printText:`# Would write to ${e}:
|
|
26
17
|
|
|
27
|
-
${
|
|
28
|
-
${
|
|
18
|
+
${i.slice(0,500)}...`,status:"printed"};let c=k(e);return E(e,i,"utf8"),{ok:!0,path:e,backup:c,status:"installed"}}if(t==="cursor"){let e=S(n,".cursorrules"),o=b(e)?A(e,"utf8"):"",i=`# Oracle Agent Instructions
|
|
19
|
+
${s}
|
|
29
20
|
---
|
|
30
|
-
${o}`;if(
|
|
21
|
+
${o}`;if(r)return{ok:!0,printText:`# Would write to ${e}:
|
|
31
22
|
|
|
32
|
-
${
|
|
23
|
+
${i.slice(0,500)}...`,status:"printed"};let c=k(e);return E(e,i,"utf8"),{ok:!0,path:e,backup:c,status:"installed"}}if(t==="claude-desktop"){let e=S(st(),"Library","Application Support","Claude","claude_desktop_config.json");if(!b(e))return{ok:!1,reason:"Claude Desktop config not found. Open Claude Desktop once first, then retry."};let o=$(e);if(r)return{ok:!0,printText:`# Would add Oracle SOUL to Claude Desktop custom instructions
|
|
33
24
|
|
|
34
|
-
${
|
|
35
|
-
${
|
|
25
|
+
${s.slice(0,500)}...`,status:"printed"};let i=k(e);return o.customInstructions=o.customInstructions||"",o.customInstructions=`# Oracle Agent Instructions
|
|
26
|
+
${s}
|
|
36
27
|
---
|
|
37
|
-
${o.customInstructions}`,
|
|
28
|
+
${o.customInstructions}`,N(e,o),{ok:!0,path:e,backup:i,status:"installed"}}if(t==="codex"||t==="copilot"){let e=S(n,".github"),o=S(e,"copilot-instructions.md"),i=b(o)?A(o,"utf8"):"";if(r)return{ok:!0,printText:`# Would write to ${o}:
|
|
38
29
|
|
|
39
|
-
${
|
|
30
|
+
${s.slice(0,500)}...`,status:"printed"};b(e)||ot(e,{recursive:!0});let c=k(o);return E(o,`${s}
|
|
40
31
|
---
|
|
41
|
-
${
|
|
32
|
+
${i}`,"utf8"),{ok:!0,path:o,backup:c,status:"installed"}}if(t==="vscode"||t==="vs-code"){let e=S(n,".vscode"),o=S(e,"instructions.md");if(r)return{ok:!0,printText:`# Would write to ${o}:
|
|
42
33
|
|
|
43
|
-
${
|
|
44
|
-
`,"utf8"),{ok:!0,path:o,backup:
|
|
34
|
+
${s.slice(0,500)}...`,status:"printed"};b(e)||ot(e,{recursive:!0});let i=k(o);return E(o,`${s}
|
|
35
|
+
`,"utf8"),{ok:!0,path:o,backup:i,status:"installed"}}return{ok:!1,reason:`--with-soul not supported for target '${t}'`}}function R(){process.stderr.write(`usage: oracle mcp <install|print> [target] [flags]
|
|
45
36
|
targets: claude-code | claude-desktop | codex | copilot | chatgpt | cursor | vscode | generic
|
|
46
|
-
flags: --with-
|
|
47
|
-
`)}function
|
|
37
|
+
flags: --with-soul --project --print --json
|
|
38
|
+
`)}function j(t,{json:n=!1}={}){if(t.print&&!t.instructions?process.stdout.write(JSON.stringify(t.print,null,2)+`
|
|
48
39
|
`):t.printText&&process.stdout.write(t.printText),t.instructions&&(process.stdout.write(t.instructions+`
|
|
49
|
-
`),t.print&&
|
|
50
|
-
`)),!t.print&&!t.printText&&!t.instructions){let
|
|
51
|
-
`)}}var
|
|
52
|
-
`),
|
|
53
|
-
`),0
|
|
54
|
-
`),1)}if(
|
|
55
|
-
`),0
|
|
56
|
-
`),1;if(!p.ok)return
|
|
57
|
-
`),p.code||1;if(
|
|
58
|
-
`):process.stderr.write(` soul: ${
|
|
40
|
+
`),t.print&&n&&process.stdout.write(JSON.stringify(t.print,null,2)+`
|
|
41
|
+
`)),!t.print&&!t.printText&&!t.instructions){let r={status:t.status,path:t.path||null,backup:t.backup||null,method:t.method||null};process.stdout.write((n?JSON.stringify(r,null,2):`${r.status}${r.path?" "+r.path:""}`)+`
|
|
42
|
+
`)}}var Le={name:"mcp",summary:"wire Oracle into AI clients",group:"read",usage:"oracle mcp install <target> [--with-soul] | oracle mcp print [--target <t>] | oracle mcp watchdog [--once]",async run(t){let n=t.argv[0];if(!n||n==="--help"||n==="-h")return R(),n?0:1;if(n==="watchdog"){let{spawn:a}=await import("node:child_process"),l=await import("node:path"),p=t.argv.includes("--once"),y=l.join(t.root,"bin","oracle-mcp-watchdog.mjs");return a(process.execPath,[y,...p?["--once"]:[]],{stdio:"inherit",detached:!0}).unref(),0}let r,s;try{({values:r,positionals:s}=Ut({args:t.argv.slice(1),options:{"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:!0}))}catch(a){return process.stderr.write(`oracle mcp: ${a.message}
|
|
43
|
+
`),R(),1}let e=!!r["with-soul"],o=!!r.project,i=!!r.json,c={oracleRoot:t.root,project:o,cwd:process.cwd()};if(n==="print"){let a=r.target||s[0]||"claude-code";if(a==="generic"||a==="claude-code"){let l=m(c);return process.stdout.write(JSON.stringify({mcpServers:l.specs},null,2)+`
|
|
44
|
+
`),0}if(a==="chatgpt"){let l=await I({printOnly:!0});return j(l,{json:i}),0}return a==="codex"||a==="copilot"?(j(await D({...c,printOnly:!0}),{json:i}),0):a==="claude-desktop"?(j(await T({...c,printOnly:!0}),{json:i}),0):a==="cursor"?(j(await M({...c,printOnly:!0}),{json:i}),0):a==="vscode"||a==="vs-code"?(j(await H({...c,printOnly:!0}),{json:i}),0):(process.stderr.write(`oracle mcp: unknown target '${a}'
|
|
45
|
+
`),1)}if(n==="install"){let a=s[0]||r.target;if(!a)return R(),1;let l=!!r.print,p;if(a==="claude-code")p=await X({...c,printOnly:l});else if(a==="claude-desktop")p=await T({...c,printOnly:l});else if(a==="codex"||a==="copilot")p=await D({...c,printOnly:l});else if(a==="chatgpt")p=await I({printOnly:l});else if(a==="cursor")p=await M({...c,printOnly:l});else if(a==="vscode"||a==="vs-code")p=await H({...c,printOnly:l});else if(a==="generic"){let y=m(c);return process.stdout.write(JSON.stringify({mcpServers:y.specs},null,2)+`
|
|
46
|
+
`),0}else return process.stderr.write(`oracle mcp: unknown target '${a}'
|
|
47
|
+
`),1;if(!p.ok)return process.stderr.write(`oracle mcp: ${p.reason||"failed"}
|
|
48
|
+
`),p.code||1;if(j(p,{json:i}),e){let y=await it(a,{cwd:process.cwd(),printOnly:l});y.ok?process.stderr.write(` soul \u2192 ${y.path||"injected"}
|
|
49
|
+
`):process.stderr.write(` soul: ${y.reason||"failed"}
|
|
59
50
|
`)}return p.status&&String(p.status).startsWith("printed")&&p.print&&process.stdout.write(JSON.stringify(p.print,null,2)+`
|
|
60
|
-
`),0}return
|
|
51
|
+
`),0}return R(),1}};export{Le as default};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import{spawn as w,spawnSync as I}from"node:child_process";import p from"node:fs";import L from"node:os";import d from"node:path";import{existsSync as P,readFileSync as y}from"node:fs";import{dirname as h,join as g}from"node:path";import{fileURLToPath as A}from"node:url";function M(e){let r=h(A(e));for(let t=0;t<8;t+=1){let o=g(r,"package.json");if(P(o))try{let a=JSON.parse(y(o,"utf8"));if(a&&typeof a.version=="string")return r}catch{}let n=h(r);if(n===r)break;r=n}throw new Error(`oracle: could not resolve package root from ${e}`)}function _(e,r){let t=M(r),o=g(t,"dist","assets",e);return P(o)?o:g(t,e)}var V=Object.freeze(["T1JBQ0xFX1NJR05FUl9VUkw=","T1JBQ0xFX1NJR05FUl9UT0tFTg==","T1JBQ0xFX1NJR05FUl9UT0tFTl9GSUxF","TUFEX1NJR05FUl9UT0tFTg==","TUFEX0VYRUNVVEVfRU5BQkxFRA==","T1JBQ0xFX0VYRUNfRU5BQkxFRA==","T1JBQ0xFX0VYRUNVVEVfRU5BQkxFRA==","RVZNX0tFWV9GSUxF","SExfS0VZX0ZJTEU=","T1JBQ0xFX1BSSVZBVEVfS0VZ","UFJJVkFURV9LRVk=","RVRIX1BSSVZBVEVfS0VZ"]);function F(e){return Buffer.from(String(e),"base64").toString("utf8")}function S(){return V.map(F)}var T=`# Oracle public-only walls (Prime / RLM research)
|
|
2
|
+
|
|
3
|
+
You may only run public Oracle read/prepare tools:
|
|
4
|
+
- oracle --version / --help / doctor / fees
|
|
5
|
+
- oracle data catalog|call|health
|
|
6
|
+
- oracle scan ...
|
|
7
|
+
- oracle route ... (quote/prepare unsigned only)
|
|
8
|
+
- oracle chain ...
|
|
9
|
+
|
|
10
|
+
Forbidden: arm, sign, broadcast, vault, credential paste, signer URLs, private keys.
|
|
11
|
+
Write findings under ./findings/ with command evidence.
|
|
12
|
+
Research GO is not release GO.
|
|
13
|
+
`;function s(e,r){return e&&typeof e=="object"?e[r]:void 0}function f(e=process.env){let r={...e,ORACLE_RLM_MODE:"research"};for(let t of S())delete r[t];return r}function x(e=process.env){let r=String(s(e,"ORACLE_PRIME_BIN")||"").trim();if(r&&p.existsSync(r))return r;let t=s(e,"HOME")||L.homedir(),o=[d.join(t,".local","bin","prime-agent"),d.join(t,"projects","prime-agent","prime-agent.sh"),"prime-agent"];for(let n of o){if(n==="prime-agent"){let a=I("bash",["-lc","command -v prime-agent"],{encoding:"utf8",env:e}),l=(a.stdout||"").trim();if(a.status===0&&l)return l;continue}if(p.existsSync(n))return n}return null}function E(e=process.env){let r=String(s(e,"ORACLE_PRIME_ROOT")||"").trim();return r||d.join(s(e,"HOME")||L.homedir(),"projects","oracle-prime-workspace")}function k(e){p.mkdirSync(d.join(e,"findings"),{recursive:!0}),p.mkdirSync(d.join(e,"evals"),{recursive:!0}),p.mkdirSync(d.join(e,"skills"),{recursive:!0});let r=d.join(e,"skills","oracle-public-only.md"),t=T;try{let o=d.join(_("skills",import.meta.url),"oracle-prime-research","SKILL.md");p.existsSync(o)&&(t=p.readFileSync(o,"utf8"))}catch{}return p.existsSync(r)||p.writeFileSync(r,t),{root:e,skillPath:r}}function R(e=process.env){return s(e,"ORACLE_PRIME_PROVIDER")?{provider:s(e,"ORACLE_PRIME_PROVIDER"),model:s(e,"ORACLE_PRIME_MODEL")}:s(e,"OPENAI_API_KEY")?{provider:"openai",model:s(e,"ORACLE_PRIME_MODEL")}:s(e,"DEEPSEEK_API_KEY")?{provider:"deepseek",model:s(e,"ORACLE_PRIME_MODEL")}:s(e,"OPENROUTER_API_KEY")?{provider:"openrouter",model:s(e,"ORACLE_PRIME_MODEL")}:s(e,"ANTHROPIC_API_KEY")?{provider:"anthropic",model:s(e,"ORACLE_PRIME_MODEL")}:{provider:null,model:s(e,"ORACLE_PRIME_MODEL")||null}}function O(e={}){let r=e.env||process.env,t=f(r),o=x(r);if(!o)return{ok:!1,skipped:!0,reason:"prime-agent-not-found",hint:"Install Prime Agent or set ORACLE_PRIME_BIN. Native oracle chat remains available."};let n=e.cwd||E(r),{skillPath:a}=k(n),l=R(t),c=["--cwd",n,"--skill",a];if(l.provider&&c.push("--provider",l.provider),l.model&&c.push("--model",l.model),e.print?(c.push("-p","--no-session"),e.mode&&c.push("--mode",e.mode),c.push(String(e.prompt||"oracle --version"))):e.args?.length&&c.push(...e.args),e.capture){let u=I(o,c,{env:t,encoding:"utf8",cwd:n,maxBuffer:8388608});return{ok:u.status===0,code:u.status??1,skipped:!1,bin:o,root:n,stdout:u.stdout||"",stderr:u.stderr||""}}let i=w(o,c,{env:t,cwd:n,stdio:"inherit"});return new Promise(u=>{i.on("error",m=>{u({ok:!1,code:1,skipped:!1,error:m.message,bin:o,root:n})}),i.on("exit",m=>{u({ok:m===0,code:m??1,skipped:!1,bin:o,root:n})})})}function v(e=process.env){let r=x(e),t=R(e),o=f(e),n=S().filter(a=>o[a]);return{primeAgent:r||null,provider:t.provider,model:t.model||null,workspace:E(e),rlmMode:o.ORACLE_RLM_MODE,executionLeaks:n,ok:!!r&&n.length===0}}function U(){return["oracle prime \u2014 Prime Intellect RLM research lane (public Oracle only)",""," oracle prime doctor check prime-agent + provider + wall strip"," oracle prime interactive research session (if prime-agent installed)",' oracle prime -p "prompt" one-shot print mode',' oracle prime --print "prompt" same as -p',"","Env:"," ORACLE_PRIME_BIN path to prime-agent"," ORACLE_PRIME_ROOT workspace (default ~/projects/oracle-prime-workspace)"," ORACLE_PRIME_PROVIDER openai|deepseek|openrouter|anthropic"," ORACLE_PRIME_MODEL optional model id","","Walls: signer/exec tokens stripped. Research GO is not release GO."].join(`
|
|
14
|
+
`)}var G={name:"prime",summary:"Prime Intellect RLM research lane (public Oracle only)",group:"read",usage:"oracle prime [doctor|-p <prompt>]",async run(e){let r=e.argv||[];if(r[0]==="--help"||r[0]==="-h")return process.stdout.write(U()+`
|
|
15
|
+
`),0;if(r[0]==="doctor"){let i=v(process.env);return process.stdout.write(JSON.stringify(i,null,2)+`
|
|
16
|
+
`),i.ok?0:1}let t=r.findIndex(i=>i==="-p"||i==="--print"),o=t!==-1,n=null;if(o&&(n=r.slice(t+1).join(" ").trim(),!n))return process.stderr.write(`oracle prime: -p requires a prompt
|
|
17
|
+
`),64;let a=E(process.env);if(k(a),f(process.env),o){let i=O({print:!0,prompt:n,mode:"text",capture:!0,cwd:a});return i.skipped?(process.stderr.write(`oracle prime: ${i.reason}
|
|
18
|
+
${i.hint||""}
|
|
19
|
+
Install Prime Agent, or use native: oracle chat
|
|
20
|
+
`),2):(i.stdout&&process.stdout.write(i.stdout),i.stderr&&process.stderr.write(i.stderr),i.ok?0:i.code||1)}if(!process.stdin.isTTY)return process.stderr.write(`oracle prime: interactive mode needs a TTY. Use: oracle prime -p "..."
|
|
21
|
+
`),64;if(!R(process.env).provider)return process.stderr.write(`oracle prime: no model key found (OPENAI/DEEPSEEK/OPENROUTER/ANTHROPIC).
|
|
22
|
+
Set a key or run prime-agent /login, then retry.
|
|
23
|
+
`),2;let c=await O({cwd:a});return c.skipped?(process.stderr.write(`oracle prime: ${c.reason}
|
|
24
|
+
${c.hint||""}
|
|
25
|
+
Fallback: oracle chat (native harness with Oracle SOUL)
|
|
26
|
+
`),2):c.ok?0:c.code||1}};export{G as default};
|