@oracle-agent/oracle 0.22.2 → 0.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import Y from"node:os";import S from"node:path";import{fileURLToPath as H}from"node:url";import u from"node:fs";import a from"node:path";import{randomBytes as C}from"node:crypto";import{createRequire as N}from"node:module";var k="oracle-profile-upgrade/v1";function p(e){try{return u.accessSync(e),!0}catch{return!1}}function M(e){return p(e)?u.readdirSync(e,{recursive:!0,withFileTypes:!0}).filter(n=>n.isFile()).map(n=>a.join(n.parentPath||n.path,n.name)).sort().map(n=>[a.relative(e,n),u.readFileSync(n)]):[]}function T(e){let n=M(e);return n.push([".oracle-upgrade-version",Buffer.from(`${k}
3
- `)]),n.sort(([c],[o])=>c.localeCompare(o))}function W(e,n){let c=M(e);return c.length===n.length&&c.every(([o,s],r)=>o===n[r][0]&&s.equals(n[r][1]))}function P(e){return`${e}.tmp-oracle-upgrade-${process.pid}-${C(6).toString("hex")}`}function O(e){let n=`${e}.bak-oracle-upgrade`;for(let c=1;p(n);c+=1)n=`${e}.bak-oracle-upgrade-${c}`;return n}function F(e,n,c,o){if(!p(e)||!u.statSync(e).isDirectory())return;let s=T(e);if(W(n,s)){o.unchanged.push(n);return}let r=p(n);if((r?o.updated:o.created).push(n),!c)return;u.mkdirSync(a.dirname(n),{recursive:!0});let t=P(n),i=null;u.mkdirSync(t);try{for(let[l,h]of s){let d=a.join(t,l);u.mkdirSync(a.dirname(d),{recursive:!0}),u.writeFileSync(d,h)}r&&(i=O(n),u.renameSync(n,i),o.backups.push({path:i,original:n})),u.renameSync(t,n)}catch(l){throw p(t)&&u.rmSync(t,{recursive:!0,force:!0}),i&&!p(n)&&p(i)&&u.renameSync(i,n),l}}function A(e,n){if(/^mcp_servers:[ \t]*(?!\{\}[ \t]*(?:#.*)?$)\S+/m.test(e))throw new Error(`${n}: mcp_servers must be a block mapping`);let c=[],o=new Map,s=e.split(/\r?\n/),r=0;for(let t=0;t<s.length;t+=1){let i=s[t];if(/^\s*#/.test(i))continue;if(/^\s*\t|^ +\t/.test(i))throw new Error(`${n}:${t+1}: tabs are not supported in YAML indentation`);let l=i.replace(/\s+#.*$/,"");if(!l.trim()||/^\s*(?:---|\.\.\.)\s*$/.test(l))continue;let h=l.replace(/'(?:[^']|'')*'|"(?:[^"\\]|\\.)*"/g,"");for(let d of h)if("[{".includes(d)&&(r+=1),"]}".includes(d)&&(r-=1),r<0)throw new Error(`${n}:${t+1}: unbalanced flow collection`);if(/^\s*[^#\-][^:]*:\s*(?:.*)?$/.test(l)){let d=l.match(/^ */)[0].length,g=l.trimStart().match(/^([^:]+):/)[1].trim();for(;c.length&&c.at(-1).indent>=d;)c.pop();let m=`${c.map($=>$.key).join("/")}|${d}|${g}`;if(o.has(m))throw new Error(`${n}:${t+1}: duplicate mapping key ${g}`);o.set(m,!0),/^[^:]+:\s*(?:#.*)?$/.test(l.trimStart())&&c.push({indent:d,key:g})}else if(!/^\s*-\s+/.test(l)&&r===0)throw new Error(`${n}:${t+1}: unsupported or malformed YAML`)}if(r!==0)throw new Error(`${n}: unbalanced flow collection`);if(/^\s*[^#\n]*:\s*[>|][+-]?\s*$/m.test(e)){let t=E(e,"mcp_servers");if(t&&/:\s*[>|][+-]?\s*$/m.test(t.body))throw new Error(`${n}: block scalars inside mcp_servers are unsupported`)}}function E(e,n){let o=new RegExp(`^${n}:[^\\S\\r\\n]*(?:#.*)?$`,"m").exec(e);if(!o)return null;let s=o.index,r=e.indexOf(`
4
- `,s)+1;if(!r)return{start:s,end:e.length,bodyStart:e.length,body:""};let t=e.slice(r),i=/^(?=\S[^\r\n]*:)/m.exec(t),l=i?r+i.index:e.length;return{start:s,bodyStart:r,end:l,body:e.slice(r,l)}}function w(e){return JSON.stringify(e)}function _(e,n){let c=n.command==="node"?[n.script]:n.args,o=[` ${e}:`,` command: ${w(n.command)}`];return c?.length&&o.push(" args:",...c.map(s=>` - ${w(s)}`)),o.push(" enabled: true",` # ${k}`),`${o.join(`
2
+ import B from"node:os";import g from"node:path";import{fileURLToPath as L}from"node:url";import a from"node:fs";import u from"node:path";import{randomBytes as O}from"node:crypto";var w="oracle-profile-upgrade/v1";function m(e){try{return a.accessSync(e),!0}catch{return!1}}function v(e){return m(e)?a.readdirSync(e,{recursive:!0,withFileTypes:!0}).filter(r=>r.isFile()).map(r=>u.join(r.parentPath||r.path,r.name)).sort().map(r=>[u.relative(e,r),a.readFileSync(r)]):[]}function P(e){let r=v(e);return r.push([".oracle-upgrade-version",Buffer.from(`${w}
3
+ `)]),r.sort(([t],[n])=>t.localeCompare(n))}function R(e,r){let t=v(e);return t.length===r.length&&t.every(([n,s],c)=>n===r[c][0]&&s.equals(r[c][1]))}function E(e){return`${e}.tmp-oracle-upgrade-${process.pid}-${O(6).toString("hex")}`}function j(e){let r=`${e}.bak-oracle-upgrade`;for(let t=1;m(r);t+=1)r=`${e}.bak-oracle-upgrade-${t}`;return r}function N(e,r,t,n){if(!m(e)||!a.statSync(e).isDirectory())return;let s=P(e);if(R(r,s)){n.unchanged.push(r);return}let c=m(r);if((c?n.updated:n.created).push(r),!t)return;a.mkdirSync(u.dirname(r),{recursive:!0});let o=E(r),l=null;a.mkdirSync(o);try{for(let[p,h]of s){let i=u.join(o,p);a.mkdirSync(u.dirname(i),{recursive:!0}),a.writeFileSync(i,h)}c&&(l=j(r),a.renameSync(r,l),n.backups.push({path:l,original:r})),a.renameSync(o,r)}catch(p){throw m(o)&&a.rmSync(o,{recursive:!0,force:!0}),l&&!m(r)&&m(l)&&a.renameSync(l,r),p}}function T(e,r){if(/^mcp_servers:[ \t]*(?!\{\}[ \t]*(?:#.*)?$)\S+/m.test(e))throw new Error(`${r}: mcp_servers must be a block mapping`);let t=[],n=new Map,s=e.split(/\r?\n/),c=0;for(let o=0;o<s.length;o+=1){let l=s[o];if(/^\s*#/.test(l))continue;if(/^\s*\t|^ +\t/.test(l))throw new Error(`${r}:${o+1}: tabs are not supported in YAML indentation`);let p=l.replace(/\s+#.*$/,"");if(!p.trim()||/^\s*(?:---|\.\.\.)\s*$/.test(p))continue;let h=p.replace(/'(?:[^']|'')*'|"(?:[^"\\]|\\.)*"/g,"");for(let i of h)if("[{".includes(i)&&(c+=1),"]}".includes(i)&&(c-=1),c<0)throw new Error(`${r}:${o+1}: unbalanced flow collection`);if(/^\s*[^#\-][^:]*:\s*(?:.*)?$/.test(p)){let i=p.match(/^ */)[0].length,d=p.trimStart().match(/^([^:]+):/)[1].trim();for(;t.length&&t.at(-1).indent>=i;)t.pop();let y=`${t.map(_=>_.key).join("/")}|${i}|${d}`;if(n.has(y))throw new Error(`${r}:${o+1}: duplicate mapping key ${d}`);n.set(y,!0),/^[^:]+:\s*(?:#.*)?$/.test(p.trimStart())&&t.push({indent:i,key:d})}else if(!/^\s*-\s+/.test(p)&&c===0)throw new Error(`${r}:${o+1}: unsupported or malformed YAML`)}if(c!==0)throw new Error(`${r}: unbalanced flow collection`);if(/^\s*[^#\n]*:\s*[>|][+-]?\s*$/m.test(e)){let o=F(e,"mcp_servers");if(o&&/:\s*[>|][+-]?\s*$/m.test(o.body))throw new Error(`${r}: block scalars inside mcp_servers are unsupported`)}}function F(e,r){let n=new RegExp(`^${r}:[^\\S\\r\\n]*(?:#.*)?$`,"m").exec(e);if(!n)return null;let s=n.index,c=e.indexOf(`
4
+ `,s)+1;if(!c)return{start:s,end:e.length,bodyStart:e.length,body:""};let o=e.slice(c),l=/^(?=\S[^\r\n]*:)/m.exec(o),p=l?c+l.index:e.length;return{start:s,bodyStart:c,end:p,body:e.slice(c,p)}}function k(e){return JSON.stringify(e)}function b(e,r){let t=r.command==="node"?[r.script]:r.args,n=[` ${e}:`,` command: ${k(r.command)}`];return t?.length&&n.push(" args:",...t.map(s=>` - ${k(s)}`)),n.push(" enabled: true",` # ${w}`),`${n.join(`
5
5
  `)}
6
- `}function B(e,n){e=e.replace(/^(mcp_servers:)\s*\{\}\s*(#.*)?$/m,(s,r,t)=>`${r}${t?` ${t}`:""}`);let c=E(e,"mcp_servers");if(!c){let s=e.length&&!e.endsWith(`
6
+ `}function q(e,r){e=e.replace(/^(mcp_servers:)\s*\{\}\s*(#.*)?$/m,(s,c,o)=>`${c}${o?` ${o}`:""}`);let t=F(e,"mcp_servers");if(!t){let s=e.length&&!e.endsWith(`
7
7
  `)?`
8
8
  `:"";return`${e}${s}mcp_servers:
9
- ${[...n].map(([r,t])=>_(r,t)).join("")}`}let o=c.body;for(let[s,r]of n){let t=new RegExp(`^ ${s}:[^\\S\\r\\n]*(?:#.*)?\\r?\\n(?:^(?: {3,}|\\s*$).*\\r?\\n?)*`,"m"),i=_(s,r);o=t.test(o)?o.replace(t,i):`${o}${o&&!o.endsWith(`
9
+ ${[...r].map(([c,o])=>b(c,o)).join("")}`}let n=t.body;for(let[s,c]of r){let o=new RegExp(`^ ${s}:[^\\S\\r\\n]*(?:#.*)?\\r?\\n(?:^(?: {3,}|\\s*$).*\\r?\\n?)*`,"m"),l=b(s,c);n=o.test(n)?n.replace(o,l):`${n}${n&&!n.endsWith(`
10
10
  `)?`
11
- `:""}${i}`}return`${e.slice(0,c.bodyStart)}${o}${e.slice(c.end)}`}function L(e,n){e=e.replace(/^(plugins:)\s*\{\}\s*(#.*)?$/m,(t,i,l)=>`${i}${l?` ${l}`:""}`);let c=` - ${w(n)}
12
- `,o=E(e,"plugins");if(!o){let t=e.length&&!e.endsWith(`
13
- `)?`
14
- `:"";return`${e}${t}plugins:
15
- enabled:
16
- ${c}`}let s=o.body,r=/^ enabled:\s*\[([^\]]*)\](.*)$/m.exec(s);if(r){if(!r[1].split(",").map(i=>i.trim().replace(/^["']|["']$/g,"")).includes(n)){let i=r[1].trim()?`${r[1].trimEnd()}, ${w(n)}`:w(n);s=s.replace(r[0],` enabled: [${i}]${r[2]}`)}}else{let t=/^ enabled:\s*(?:#.*)?\r?\n((?:^ {4}-.*\r?\n?)*)/m.exec(s);t?t[1].split(/\r?\n/).map(l=>l.replace(/^\s*-\s*/,"").trim().replace(/^["']|["']$/g,"")).includes(n)||(s=s.replace(t[0],`${t[0]}${c}`)):s=`${s}${s&&!s.endsWith(`
17
- `)?`
18
- `:""} enabled:
19
- ${c}`}return`${e.slice(0,o.bodyStart)}${s}${e.slice(o.end)}`}function D(e,n,c){let o=p(e);if((o?u.readFileSync(e,"utf8"):null)===n){c.unchanged.push(e);return}if((o?c.updated:c.created).push(e),!c.applied)return;if(u.mkdirSync(a.dirname(e),{recursive:!0}),o){let t=O(e);u.copyFileSync(e,t),c.backups.push({path:t,original:e})}let r=P(e);try{u.writeFileSync(r,n,{mode:o?u.statSync(e).mode:384}),u.renameSync(r,e)}catch(t){throw p(r)&&u.rmSync(r,{force:!0}),t}}function J(e,n){if(n){let[o,...s]=n;return{command:o,args:s}}let c=[a.join(e,"bin","oracle-control-mcp.mjs"),a.join(e,"plugins","oracle-owner-gate","bin","oracle-control-mcp.mjs"),a.join(e,"plugins","oracle-owner-gate","oracle-control-mcp.mjs"),a.join(e,"..","@oracle-agent","operator","bin","oracle-control-mcp.mjs"),a.join(e,"..","..","@oracle-agent","operator","bin","oracle-control-mcp.mjs")];for(let o of c)if(p(o)&&u.statSync(o).isFile())return{command:"node",script:a.resolve(o)};try{let o=N(a.join(e,"package.json")),s=a.dirname(o.resolve("@oracle-agent/operator/package.json")),r=a.join(s,"bin","oracle-control-mcp.mjs");if(p(r)&&u.statSync(r).isFile())return{command:"node",script:a.resolve(r)}}catch{}return null}function q({hermesHome:e,packageRoot:n,only:c=null,apply:o=!1,controlCommand:s=null}){let r=a.join(e,"profiles"),t={ok:!0,applied:o,version:k,hermesHome:e,packageRoot:n,profiles:[],created:[],updated:[],unchanged:[],backups:[]},i=p(r)?u.readdirSync(r,{withFileTypes:!0}).filter(m=>m.isDirectory()).map(m=>m.name).sort():[];if(c&&(i=i.filter(m=>m===c)),c&&i.length===0)throw new Error(`profile not found: ${c}`);t.profiles=i;let l=new Map;for(let m of i){let $=a.join(r,m,"config.yaml"),y=p($)?u.readFileSync($,"utf8"):"";A(y,$),l.set(m,y)}let h=a.join(n,"skills","oracle-action-semantics");if(!p(h))throw new Error(`required Oracle skill is missing: ${h}`);let d=a.join(n,"plugins","oracle-owner-gate"),g=J(n,s),b=a.join(n,"bin","oracle-data-mcp.mjs");if(!p(b))throw new Error(`oracle-data MCP command is missing: ${b}`);for(let m of i){let $=a.join(r,m);F(h,a.join($,"skills","oracle-action-semantics"),o,t),p(d)&&F(d,a.join($,"plugins","oracle-owner-gate"),o,t);let y=new Map([["oracle-data",{command:"node",script:b}]]);g&&y.set("oracle-control",g);let v=B(l.get(m),y);p(d)&&(v=L(v,"oracle-owner-gate")),D(a.join($,"config.yaml"),v,t)}return t}var f=process.argv.slice(2),j=e=>{let n=f.indexOf(e);if(n<0)return null;if(!f[n+1]||f[n+1].startsWith("--"))throw new Error(`${e} requires a value`);return f[n+1]};try{let e=new Set(["--apply","--json","--only","--hermes-home","--package-root","--control-command"]);for(let r=0;r<f.length;r+=1){if(!e.has(f[r]))throw new Error(`unknown option: ${f[r]}`);["--only","--hermes-home","--package-root","--control-command"].includes(f[r])&&(r+=1)}let n=S.resolve(j("--package-root")||S.join(S.dirname(H(import.meta.url)),"..")),c=S.resolve(j("--hermes-home")||process.env.HERMES_HOME||S.join(Y.homedir(),".hermes")),o=j("--control-command"),s=q({hermesHome:c,packageRoot:n,only:j("--only"),apply:f.includes("--apply"),controlCommand:o?o.trim().split(/\s+/):null});if(f.includes("--json"))process.stdout.write(`${JSON.stringify(s,null,2)}
20
- `);else{console.log(`oracle-upgrade ${s.applied?"applied":"dry run"}: ${s.profiles.length} profile(s)`);for(let r of["created","updated","unchanged","backups"])console.log(`${r}: ${s[r].length}`);s.applied||console.log("Re-run with --apply to make these changes.")}}catch(e){let n={ok:!1,error:e.message};f.includes("--json")?process.stdout.write(`${JSON.stringify(n,null,2)}
11
+ `:""}${l}`}return`${e.slice(0,t.bodyStart)}${n}${e.slice(t.end)}`}function A(e,r,t){let n=m(e);if((n?a.readFileSync(e,"utf8"):null)===r){t.unchanged.push(e);return}if((n?t.updated:t.created).push(e),!t.applied)return;if(a.mkdirSync(u.dirname(e),{recursive:!0}),n){let o=j(e);a.copyFileSync(e,o),t.backups.push({path:o,original:e})}let c=E(e);try{a.writeFileSync(c,r,{mode:n?a.statSync(e).mode:384}),a.renameSync(c,e)}catch(o){throw m(c)&&a.rmSync(c,{force:!0}),o}}function M({hermesHome:e,packageRoot:r,only:t=null,apply:n=!1}){let s=u.join(e,"profiles"),c={ok:!0,applied:n,version:w,hermesHome:e,packageRoot:r,profiles:[],created:[],updated:[],unchanged:[],backups:[]},o=m(s)?a.readdirSync(s,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name).sort():[];if(t&&(o=o.filter(i=>i===t)),t&&o.length===0)throw new Error(`profile not found: ${t}`);c.profiles=o;let l=new Map;for(let i of o){let d=u.join(s,i,"config.yaml"),$=m(d)?a.readFileSync(d,"utf8"):"";T($,d),l.set(i,$)}let p=u.join(r,"skills","oracle-action-semantics");if(!m(p))throw new Error(`required Oracle skill is missing: ${p}`);let h=u.join(r,"bin","oracle-data-mcp.mjs");if(!m(h))throw new Error(`oracle-data MCP command is missing: ${h}`);for(let i of o){let d=u.join(s,i);N(p,u.join(d,"skills","oracle-action-semantics"),n,c);let $=new Map([["oracle-data",{command:"node",script:h}]]),y=q(l.get(i),$);A(u.join(d,"config.yaml"),y,c)}return c}var f=process.argv.slice(2),S=e=>{let r=f.indexOf(e);if(r<0)return null;if(!f[r+1]||f[r+1].startsWith("--"))throw new Error(`${e} requires a value`);return f[r+1]};try{let e=new Set(["--apply","--json","--only","--hermes-home","--package-root"]);for(let s=0;s<f.length;s+=1){if(!e.has(f[s]))throw new Error(`unknown option: ${f[s]}`);["--only","--hermes-home","--package-root"].includes(f[s])&&(s+=1)}let r=g.resolve(S("--package-root")||g.join(g.dirname(L(import.meta.url)),"..")),t=g.resolve(S("--hermes-home")||process.env.HERMES_HOME||g.join(B.homedir(),".hermes")),n=M({hermesHome:t,packageRoot:r,only:S("--only"),apply:f.includes("--apply")});if(f.includes("--json"))process.stdout.write(`${JSON.stringify(n,null,2)}
12
+ `);else{console.log(`oracle-upgrade ${n.applied?"applied":"dry run"}: ${n.profiles.length} profile(s)`);for(let s of["created","updated","unchanged","backups"])console.log(`${s}: ${n[s].length}`);n.applied||console.log("Re-run with --apply to make these changes.")}}catch(e){let r={ok:!1,error:e.message};f.includes("--json")?process.stdout.write(`${JSON.stringify(r,null,2)}
21
13
  `):console.error(`oracle-upgrade: ${e.message}`),process.exitCode=1}
@@ -1,21 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import{realpathSync as K}from"node:fs";import{fileURLToPath as je}from"node:url";import O from"node:fs";import b from"node:path";import{pathToFileURL as ge}from"node:url";import g from"node:fs";import B from"node:os";import i from"node:path";import{fileURLToPath as J}from"node:url";var V=i.dirname(J(import.meta.url)),p=i.resolve(V,"../..");function d(){return process.env.ORACLE_FAKE_HOME||B.homedir()}function S(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function y(){return S()?process.env.ORACLE_CONFIG_DIR||i.join(d(),".config","oracle"):i.join(d(),".config","oracle")}function W(){return i.join(y(),"exec.env")}function C(){return i.join(y(),"desk.json")}function L(){return i.join(y(),"env")}function h({force:e=!1}={}){if(h._done&&!e)return h._result||null;h._done=!0;let n={},r=(a,t)=>{if(t==null)return;let o=String(t).trim();o&&(process.env[a]!=null&&String(process.env[a]).trim()!==""||(process.env[a]=o,n[a]=o))};try{let a=L();if(g.existsSync(a))for(let t of g.readFileSync(a,"utf8").split(/\r?\n/)){let o=t.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!o||o[2].startsWith("#"))continue;let c=o[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(o[1],c)}}catch{}try{let a=C();if(g.existsSync(a)){let t=JSON.parse(g.readFileSync(a,"utf8"));t&&typeof t=="object"&&(r("ORACLE_DESK_URL",t.deskUrl||t.dataUrl||t.url),r("ORACLE_DATA_URL",t.dataUrl||t.deskUrl||t.url),r("ORACLE_API_URL",t.apiUrl||t.dataUrl||t.deskUrl),r("ORACLE_PUBLIC_URL",t.publicUrl||t.deskUrl||t.dataUrl),r("ORACLE_EXEC_URL",t.execUrl),r("MAD_DESK_URL",t.deskUrl||t.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)),h._result=Object.keys(n).length?n:null,h._result}try{h()}catch{}function z(){return process.env.HERMES_HOME?i.resolve(process.env.HERMES_HOME):i.join(d(),".hermes")}function Y(){return i.join(d(),".claude.json")}function Q(e=process.cwd()){return i.join(e,".mcp.json")}function X(){return process.platform==="darwin"?i.join(d(),"Library","Application Support","Claude","claude_desktop_config.json"):i.join(d(),".config","Claude","claude_desktop_config.json")}function Z(){return i.join(d(),".codex","config.toml")}function P(){return i.join(y(),"connectors")}function ee(){return i.join(P(),"chatgpt-openapi.json")}function re(){return i.join(y(),"active-chain.json")}function _(e){let n=[i.join(p,"bin",e),i.join(p,"dist","bin",e),i.join(p,"..","bin",e)];return n.find(r=>g.existsSync(r))||n[0]}function te(e){return g.mkdirSync(e,{recursive:!0}),e}var U={homeDir:d,isPublicDesktop:S,oracleConfigDir:y,oracleExecEnvPath:W,oracleDeskJsonPath:C,oracleEnvFilePath:L,loadDeskRouting:h,hermesRoot:z,activeChainPath:re,claudeCodeUserConfigPath:Y,claudeCodeProjectMcpPath:Q,claudeDesktopConfigPath:X,codexConfigPath:Z,chatgptConnectorDir:P,chatgptOpenApiPath:ee,packageBin:_,ensureDir:te,PACKAGE_ROOT:p};import{execFile as ne}from"node:child_process";import{existsSync as Ue,mkdirSync as Te,readFileSync as oe,realpathSync as De,writeFileSync as $e}from"node:fs";import T from"node:path";import{promisify as se}from"node:util";var He=se(ne);var Me=1440*60*1e3;function D(e,n){let r=t=>String(t).replace(/^v/,"").split("-")[0].split(".").map(o=>Number.parseInt(o,10)||0),s=r(e),a=r(n);for(let t=0;t<Math.max(s.length,a.length);t+=1){let o=s[t]??0,c=a[t]??0;if(o>c)return 1;if(o<c)return-1}return 0}function ae(e){let n=e?.stateDir||T.join(process.env.HOME||".",".oracle");return T.join(n,"update-check.json")}function $(e){try{return JSON.parse(oe(ae(e),"utf8"))}catch{return null}}import f from"node:fs";import u from"node:path";import{spawnSync as ce}from"node:child_process";import{createRequire as ie}from"node:module";import{fileURLToPath as le}from"node:url";var ue=u.dirname(le(import.meta.url)),pe=u.resolve(ue,"../.."),de=Object.freeze(["oracle-vault","oracle-credential","oracle-signer","oracle-runner","oracle-agentic-init","oracle-agentic-doctor","oracle-control-mcp","oracle-operator-caps"]),R=Object.freeze(["vault","credential","signer","runner","sign"]),I=`oracle: signing is unavailable in the public package.
3
-
4
- The public 'oracle' package is prepare-only and never handles keys.
5
- Owner-operated signing is private infrastructure and has no public npm install.
6
- Review and sign prepared artifacts in your own wallet instead.
7
-
8
- Nothing about your read/research/prepare setup is affected.
9
- `,fe="hint: run 'oracle sign init' to provision keys, or 'oracle sign doctor --json' for detail.";function N(e){let n={};for(let r of de){let s=[u.join(e,r),u.join(e,`${r}.mjs`),u.join(e,`${r}.js`)];for(let a of s)if(f.existsSync(a)&&f.statSync(a).isFile()){n[r]=a;break}}return n}function me(e){let n=u.dirname(e);for(;n!==u.dirname(n);){let r=u.join(n,"package.json");if(f.existsSync(r))try{let s=JSON.parse(f.readFileSync(r,"utf8"));if(s.name==="@oracle-agent/operator")return{root:n,pkg:s}}catch{}n=u.dirname(n)}return null}function he(e){for(let n of e)try{let r=ie(u.join(n,"package.json")),s;try{let l=r.resolve("@oracle-agent/operator/package.json");s={root:u.dirname(l),pkg:JSON.parse(f.readFileSync(l,"utf8"))}}catch{let l=r.resolve("@oracle-agent/operator");s=me(l)}if(!s)continue;let{root:a,pkg:t}=s,o=t.bin||{},c={};for(let[l,m]of Object.entries(o))c[l]=u.resolve(a,m);let j=N(u.join(a,"bin"));for(let[l,m]of Object.entries(j))c[l]||(c[l]=m);return{ok:!0,binDir:u.join(a,"bin"),version:t.version||"unknown",bins:c,source:`require:${n}`}}catch{}return null}function k(){if(process.env.ORACLE_PUBLIC_DESKTOP==="1")return{ok:!1,source:"public-desktop"};let e=process.env.ORACLE_OPERATOR_BIN_DIR;if(e){let r=u.resolve(e);if(!f.existsSync(r))return{ok:!1};let s=N(r);if(!Object.keys(s).length)return{ok:!1};let a="unknown",t=u.resolve(r,"../package.json");if(f.existsSync(t))try{a=JSON.parse(f.readFileSync(t,"utf8")).version||a}catch{}return{ok:!0,binDir:r,version:a,bins:s,source:"env:ORACLE_OPERATOR_BIN_DIR"}}return he([process.cwd(),pe])||{ok:!1}}function E(e=process.stderr){e.write(I),I.endsWith(`
10
- `)||e.write(`
11
- `)}function H(e,n=[],r={}){let s=k();if(!s.ok)return E(r.stderr||process.stderr),3;let a=s.bins[e];if(!a)return(r.stderr||process.stderr).write(`oracle: operator bin '${e}' not found in resolved operator (${s.source})
12
- `),3;let t=r.stdio||"inherit",o=/\.(mjs|cjs|js)$/.test(a),c=o?process.execPath:a,j=o?[a,...n]:[...n],l=ce(c,j,{stdio:t,env:r.env||process.env,cwd:r.cwd||process.cwd(),encoding:t==="pipe"?"utf8":void 0});if(l.error)return(r.stderr||process.stderr).write(`oracle: failed to spawn ${e}: ${l.error.message}
13
- `),1;let m=typeof l.status=="number"?l.status:1;return m!==0&&r.appendHintOnError&&(r.stderr||process.stderr).write(fe+`
14
- `),t==="pipe"?{code:m,stdout:l.stdout||"",stderr:l.stderr||""}:m}var ye="oracle \u2014 self-custody multichain agent control plane",ke=`READ / RESEARCH (no keys, this package)
2
+ import{realpathSync as U}from"node:fs";import{fileURLToPath as re}from"node:url";import h from"node:fs";import g from"node:path";import{pathToFileURL as Y}from"node:url";import d from"node:fs";import P from"node:os";import i from"node:path";import{fileURLToPath as D}from"node:url";var T=i.dirname(D(import.meta.url)),l=i.resolve(T,"../..");function u(){return process.env.ORACLE_FAKE_HOME||P.homedir()}function _(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function f(){return _()?process.env.ORACLE_CONFIG_DIR||i.join(u(),".config","oracle"):i.join(u(),".config","oracle")}function $(){return i.join(f(),"exec.env")}function A(){return i.join(f(),"desk.json")}function C(){return i.join(f(),"env")}function p({force:e=!1}={}){if(p._done&&!e)return p._result||null;p._done=!0;let o={},r=(a,t)=>{if(t==null)return;let n=String(t).trim();n&&(process.env[a]!=null&&String(process.env[a]).trim()!==""||(process.env[a]=n,o[a]=n))};try{let a=C();if(d.existsSync(a))for(let t of d.readFileSync(a,"utf8").split(/\r?\n/)){let n=t.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!n||n[2].startsWith("#"))continue;let c=n[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(n[1],c)}}catch{}try{let a=A();if(d.existsSync(a)){let t=JSON.parse(d.readFileSync(a,"utf8"));t&&typeof t=="object"&&(r("ORACLE_DESK_URL",t.deskUrl||t.dataUrl||t.url),r("ORACLE_DATA_URL",t.dataUrl||t.deskUrl||t.url),r("ORACLE_API_URL",t.apiUrl||t.dataUrl||t.deskUrl),r("ORACLE_PUBLIC_URL",t.publicUrl||t.deskUrl||t.dataUrl),r("ORACLE_EXEC_URL",t.execUrl),r("MAD_DESK_URL",t.deskUrl||t.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)),p._result=Object.keys(o).length?o:null,p._result}try{p()}catch{}function H(){return process.env.HERMES_HOME?i.resolve(process.env.HERMES_HOME):i.join(u(),".hermes")}function I(){return i.join(u(),".claude.json")}function M(e=process.cwd()){return i.join(e,".mcp.json")}function F(){return process.platform==="darwin"?i.join(u(),"Library","Application Support","Claude","claude_desktop_config.json"):i.join(u(),".config","Claude","claude_desktop_config.json")}function N(){return i.join(u(),".codex","config.toml")}function v(){return i.join(f(),"connectors")}function q(){return i.join(v(),"chatgpt-openapi.json")}function K(){return i.join(f(),"active-chain.json")}function y(e){let o=[i.join(l,"bin",e),i.join(l,"dist","bin",e),i.join(l,"..","bin",e)];return o.find(r=>d.existsSync(r))||o[0]}function B(e){return d.mkdirSync(e,{recursive:!0}),e}var E={homeDir:u,isPublicDesktop:_,oracleConfigDir:f,oracleExecEnvPath:$,oracleDeskJsonPath:A,oracleEnvFilePath:C,loadDeskRouting:p,hermesRoot:H,activeChainPath:K,claudeCodeUserConfigPath:I,claudeCodeProjectMcpPath:M,claudeDesktopConfigPath:F,codexConfigPath:N,chatgptConnectorDir:v,chatgptOpenApiPath:q,packageBin:y,ensureDir:B,PACKAGE_ROOT:l};import{execFile as G}from"node:child_process";import{existsSync as de,mkdirSync as fe,readFileSync as V,realpathSync as me,writeFileSync as he}from"node:fs";import j from"node:path";import{promisify as J}from"node:util";var xe=J(G);var ke=1440*60*1e3;function R(e,o){let r=t=>String(t).replace(/^v/,"").split("-")[0].split(".").map(n=>Number.parseInt(n,10)||0),s=r(e),a=r(o);for(let t=0;t<Math.max(s.length,a.length);t+=1){let n=s[t]??0,c=a[t]??0;if(n>c)return 1;if(n<c)return-1}return 0}function W(e){let o=e?.stateDir||j.join(process.env.HOME||".",".oracle");return j.join(o,"update-check.json")}function b(e){try{return JSON.parse(V(W(e),"utf8"))}catch{return null}}var z="oracle \u2014 self-custody multichain agent control plane",Q=`READ / RESEARCH (no keys, this package)
15
3
  oracle open the native Oracle chat (TTY)
16
4
  oracle bootstrap optional: install an isolated Hermes compatibility runtime
17
5
  oracle init install agent lanes + read plane (dry-run by default)
18
- oracle doctor check read plane; checks signer too when installed
6
+ oracle doctor check the read plane
19
7
  oracle eval desk run desk harness eval (critical tests + parse smoke)
20
8
  oracle chat premium boxed oracle chat (multi-model)
21
9
  oracle model choose standalone/Hermes provider and any compatible model
@@ -42,26 +30,18 @@ import{realpathSync as K}from"node:fs";import{fileURLToPath as je}from"node:url"
42
30
  oracle fees status|check check Locals Only 0% fee eligibility
43
31
  oracle upgrade upgrade installed agent lanes
44
32
 
45
- SIGNING (dispatches to @oracle-agent/operator on THIS machine; never in this package)
46
- oracle sign init|doctor provision / check the local signer (opt-in)
47
- oracle vault ... encrypt local key files at rest
48
- oracle signer / runner loopback signer daemon / action runner
49
- oracle credential ... OS credential store glue
50
-
51
- oracle <noun> --help for details. Keys never leave your machine; this package
52
- cannot sign \u2014 signing commands run the locally installed operator package.
53
- `;function G(){try{return JSON.parse(O.readFileSync(b.join(p,"package.json"),"utf8")).version||"0.0.0"}catch{return"0.0.0"}}function ve(){let e=b.join(p,"src","cli","commands");return O.existsSync(e)?e:b.join(p,"dist","cli","commands")}async function v(){let e=ve(),n=new Map;if(!O.existsSync(e))return n;let r=O.readdirSync(e).filter(s=>s.endsWith(".mjs")).sort();for(let s of r){let a=b.join(e,s);try{let o=(await import(ge(a).href+`?t=${Date.now()}`)).default;if(!o||typeof o!="object"||typeof o.run!="function")continue;let c=o.name||s.replace(/\.mjs$/,"");n.set(c,{...o,name:c,__file:a})}catch(t){process.env.ORACLE_CLI_DEBUG&&console.error(`oracle: failed loading command ${s}: ${t.message}`)}}return n}function xe(e,n=$()){return!n?.latest||!e||D(n.latest,e)<=0?"":`
54
- Update available: ${e} \u2192 ${n.latest}. Run 'oracle update'.
55
- `}function w(e,n){let r=[];r.push(`${ye} (v${e})`),r.push(""),r.push(ke.trimEnd());let s=[];for(let a of n.values()){if(["help","version"].includes(a.name))continue;!new Set(["init","doctor","chat","model","auth","chain","setup","data","data-mcp","scan","route","prepare","swap","farm","follow","equities","strategy","public","mcp","plugins","harness","upgrade","bootstrap","eval","sign","vault","signer","runner","credential"]).has(a.name)&&a.summary&&s.push(` oracle ${a.name.padEnd(20)} ${a.summary}`)}return s.length&&(r.push(""),r.push("ADDITIONAL"),r.push(...s)),r.join(`
33
+ oracle <noun> --help for details. This package prepares unsigned actions and
34
+ never handles keys, signs, or broadcasts transactions.
35
+ `;function O(){try{return JSON.parse(h.readFileSync(g.join(l,"package.json"),"utf8")).version||"0.0.0"}catch{return"0.0.0"}}function X(){let e=g.join(l,"src","cli","commands");return h.existsSync(e)?e:g.join(l,"dist","cli","commands")}async function m(){let e=X(),o=new Map;if(!h.existsSync(e))return o;let r=h.readdirSync(e).filter(s=>s.endsWith(".mjs")).sort();for(let s of r){let a=g.join(e,s);try{let n=(await import(Y(a).href+`?t=${Date.now()}`)).default;if(!n||typeof n!="object"||typeof n.run!="function")continue;let c=n.name||s.replace(/\.mjs$/,"");o.set(c,{...n,name:c,__file:a})}catch(t){process.env.ORACLE_CLI_DEBUG&&console.error(`oracle: failed loading command ${s}: ${t.message}`)}}return o}function Z(e,o=b()){return!o?.latest||!e||R(o.latest,e)<=0?"":`
36
+ Update available: ${e} \u2192 ${o.latest}. Run 'oracle update'.
37
+ `}function x(e,o){let r=[];r.push(`${z} (v${e})`),r.push(""),r.push(Q.trimEnd());let s=[];for(let a of o.values()){if(["help","version"].includes(a.name))continue;!new Set(["init","doctor","chat","model","auth","chain","setup","data","data-mcp","scan","route","prepare","swap","farm","follow","equities","strategy","public","mcp","plugins","harness","upgrade","bootstrap","eval"]).has(a.name)&&a.summary&&s.push(` oracle ${a.name.padEnd(20)} ${a.summary}`)}return s.length&&(r.push(""),r.push("ADDITIONAL"),r.push(...s)),r.join(`
56
38
  `)+`
57
- `+xe(e)}function M(e,n){let r=[...n.keys()].sort(),s=r.length?r.join(", "):"(none loaded yet)";return`oracle: unknown command '${e}'. Known: ${s}
39
+ `+Z(e)}function w(e,o){let r=[...o.keys()].sort(),s=r.length?r.join(", "):"(none loaded yet)";return`oracle: unknown command '${e}'. Known: ${s}
58
40
  Try: oracle --help
59
- `}function x(e){return{argv:e,root:p,bin:_,paths:U,dispatchOperator:H,resolveOperator:k}}async function q(e=[]){let n=G();if(e.includes("--version")||e.includes("-V"))return F();if(e[0]==="--help"||e[0]==="-h"){let o=await v();return process.stdout.write(w(n,o)),0}if(e.length===0){let o=await v();if(Oe(e)){let c=o.get("chat");if(c)return c.run(x([]))}return process.stdout.write(w(n,o)),0}if(be(e[0])){let c=(await v()).get("chat");if(c)return c.run(x(e))}let r=e[0],s=e.slice(1);if(r==="version")return F();if(r==="help"){let o=await v();if(s[0]){let c=o.get(s[0]);return c?(process.stdout.write((c.usage||`oracle ${c.name}`)+`
41
+ `}function k(e){return{argv:e,root:l,bin:y,paths:E}}async function S(e=[]){let o=O();if(e.includes("--version")||e.includes("-V"))return L();if(e[0]==="--help"||e[0]==="-h"){let n=await m();return process.stdout.write(x(o,n)),0}if(e.length===0){let n=await m();if(ee(e)){let c=n.get("chat");if(c)return c.run(k([]))}return process.stdout.write(x(o,n)),0}if(te(e[0])){let c=(await m()).get("chat");if(c)return c.run(k(e))}let r=e[0],s=e.slice(1);if(r==="version")return L();if(r==="help"){let n=await m();if(s[0]){let c=n.get(s[0]);return c?(process.stdout.write((c.usage||`oracle ${c.name}`)+`
60
42
  `),c.summary&&process.stdout.write(c.summary+`
61
- `),0):(process.stderr.write(M(s[0],o)),1)}return process.stdout.write(w(n,o)),0}let a=await v(),t=a.get(r);if(t){if(s[0]==="--help"||s[0]==="-h")return process.stdout.write((t.usage||`oracle ${t.name}`)+`
43
+ `),0):(process.stderr.write(w(s[0],n)),1)}return process.stdout.write(x(o,n)),0}let a=await m(),t=a.get(r);if(t){if(s[0]==="--help"||s[0]==="-h")return process.stdout.write((t.usage||`oracle ${t.name}`)+`
62
44
  `),t.summary&&process.stdout.write(t.summary+`
63
- `),0;if(R.includes(r))try{let o=await t.run(x(s));return typeof o=="number"?o:0}catch(o){return process.stderr.write(`oracle ${r}: ${o?.message||o}
64
- `),1}try{let o=await t.run(x(s));return typeof o=="number"?o:0}catch(o){return process.stderr.write(`oracle ${r}: ${o?.message||o}
65
- `),1}}return R.includes(r)?k().ok?(process.stderr.write(`oracle: sign-plane command '${r}' is not available in this build (operator is installed).
66
- `),1):(E(process.stderr),3):(process.stderr.write(M(r,a)),1)}async function F(){let n=`oracle ${G()}`,r=k();return r.ok&&(n+=` operator ${r.version}`),process.stdout.write(n+`
67
- `),0}function Oe(e=[],n={stdin:process.stdin,stdout:process.stdout}){return e.length!==0?!1:process.env.ORACLE_FORCE_CHAT==="1"?!0:n.stdin?.isTTY===!0&&n.stdout?.isTTY===!0}function be(e){return["-m","--model","--provider","-q","--query","-Q","--quiet","-c","--continue","-r","--resume","-s","--skills","-t","--toolsets","--reasoning","--tui","--cli","--yolo","--checkpoints","--source","--max-turns"].includes(String(e||""))}var or=Object.freeze({data:"./desk-server.mjs",public:"./oracle-public-server.mjs","data-mcp":"./oracle-data-mcp.mjs",init:"./oracle-init.mjs",upgrade:"./oracle-upgrade.mjs",scan:"./oracle-scan.mjs",route:"./oracle-route.mjs",equities:"./oracle-equities.mjs"});function _e(){if(!process.argv[1])return!1;try{return K(je(import.meta.url))===K(process.argv[1])}catch{return!1}}async function Re(e=process.argv.slice(2)){return q(e)}if(_e()){let e=await Re();process.exit(typeof e=="number"?e:0)}export{or as COMMANDS,Re as main};
45
+ `),0;try{let n=await t.run(k(s));return typeof n=="number"?n:0}catch(n){return process.stderr.write(`oracle ${r}: ${n?.message||n}
46
+ `),1}}return process.stderr.write(w(r,a)),1}async function L(){let e=O();return process.stdout.write(`oracle ${e}
47
+ `),0}function ee(e=[],o={stdin:process.stdin,stdout:process.stdout}){return e.length!==0?!1:process.env.ORACLE_FORCE_CHAT==="1"?!0:o.stdin?.isTTY===!0&&o.stdout?.isTTY===!0}function te(e){return["-m","--model","--provider","-q","--query","-Q","--quiet","-c","--continue","-r","--resume","-s","--skills","-t","--toolsets","--reasoning","--tui","--cli","--yolo","--checkpoints","--source","--max-turns"].includes(String(e||""))}var Oe=Object.freeze({data:"./desk-server.mjs",public:"./oracle-public-server.mjs","data-mcp":"./oracle-data-mcp.mjs",init:"./oracle-init.mjs",upgrade:"./oracle-upgrade.mjs",scan:"./oracle-scan.mjs",route:"./oracle-route.mjs",equities:"./oracle-equities.mjs"});function ne(){if(!process.argv[1])return!1;try{return U(re(import.meta.url))===U(process.argv[1])}catch{return!1}}async function oe(e=process.argv.slice(2)){return S(e)}if(ne()){let e=await oe();process.exit(typeof e=="number"?e:0)}export{Oe as COMMANDS,oe as main};
@@ -1,5 +1,4 @@
1
- import y from"node:fs";import G 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 Y(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=Y(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=G.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};
1
+ import m from"node:fs";import V from"node:path";import C from"node:fs";import f from"node:path";import v from"node:fs";import g from"node:os";import l from"node:path";import{fileURLToPath as T}from"node:url";var j=l.dirname(T(import.meta.url)),X=l.resolve(j,"../..");function x(){return process.env.ORACLE_FAKE_HOME||g.homedir()}function P(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function _(){return P()?process.env.ORACLE_CONFIG_DIR||l.join(x(),".config","oracle"):l.join(x(),".config","oracle")}function w(){return l.join(_(),"desk.json")}function D(){return l.join(_(),"env")}function u({force:t=!1}={}){if(u._done&&!t)return u._result||null;u._done=!0;let o={},e=(r,n)=>{if(n==null)return;let i=String(n).trim();i&&(process.env[r]!=null&&String(process.env[r]).trim()!==""||(process.env[r]=i,o[r]=i))};try{let r=D();if(v.existsSync(r))for(let n of v.readFileSync(r,"utf8").split(/\r?\n/)){let i=n.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)),e(i[1],c)}}catch{}try{let r=w();if(v.existsSync(r)){let n=JSON.parse(v.readFileSync(r,"utf8"));n&&typeof n=="object"&&(e("ORACLE_DESK_URL",n.deskUrl||n.dataUrl||n.url),e("ORACLE_DATA_URL",n.dataUrl||n.deskUrl||n.url),e("ORACLE_API_URL",n.apiUrl||n.dataUrl||n.deskUrl),e("ORACLE_PUBLIC_URL",n.publicUrl||n.deskUrl||n.dataUrl),e("ORACLE_EXEC_URL",n.execUrl),e("MAD_DESK_URL",n.deskUrl||n.dataUrl))}}catch{}let s=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return s&&(e("ORACLE_DESK_URL",s),e("ORACLE_DATA_URL",s),e("ORACLE_API_URL",s),e("ORACLE_PUBLIC_URL",s),e("MAD_DESK_URL",s)),u._result=Object.keys(o).length?o:null,u._result}try{u()}catch{}var $="0.19.0",ne=`hermes-agent==${$}`;var y="0.12.1",te=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${y}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${y}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function I(){return f.join(_(),"runtime")}function N(){return f.join(I(),"venv")}function H(t){let o=process.platform==="win32"?"Scripts":"bin",e=process.platform==="win32"?`${t}.exe`:t;return f.join(N(),o,e)}function M(){return H("hermes")}function B(t){let o=process.platform==="win32"&&!f.extname(t)?["",".exe",".cmd",".bat"]:[""];for(let e of(process.env.PATH||"").split(f.delimiter))if(e)for(let s of o){let r=f.join(e,`${t}${s}`);try{if(C.existsSync(r))return r}catch{}}return null}function L(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let t=B("hermes");if(t)return{ok:!0,bin:t,source:"path"};let o=M();return C.existsSync(o)?{ok:!0,bin:o,source:"managed"}:{ok:!1,bin:null,source:null}}function O(){let[t,o]=process.versions.node.split(".").map(Number);return t>20||t===20&&o>=19}function F(t){if(!m.existsSync(t))return{};let o={};for(let e of m.readFileSync(t,"utf8").split(/\r?\n/)){let s=e.match(/^([A-Z0-9_]+)=(.*)$/);s&&(o[s[1]]=s[2])}return o}async function K(t){let o=t.replace(/\/$/,"");for(let e of["/health","/public/health"])try{if((await fetch(o+e)).ok)return!0}catch{}return!1}var ce={name:"doctor",summary:"check the read plane",group:"read",usage:"oracle doctor [--json]",async run(t){let o=t.argv.includes("--json"),e=[],s=!1,r=(a,S,b,U=null)=>{e.push({id:a,status:S,detail:b,fix:U}),S==="fail"&&(s=!0)};r("node",O()?"ok":"fail",`node ${process.versions.node}`,O()?null:"install node >= 20.19");let n=t.paths.oracleExecEnvPath(),i=F(n),c=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||i.ORACLE_ROUTE_ATTESTATION_SECRET||i.MAD_ROUTE_ATTESTATION_SECRET||i.ORACLE_ATTESTATION_SECRET||i.ORACLE_STAMP_HMAC_SECRET;r("attestation_secret",c?"ok":"warn",c?"present":"missing",c?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let p=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",E=await K(p),R=t.paths.loadDeskRouting&&(process.env.ORACLE_DESK_URL||process.env.ORACLE_PUBLIC_URL)?`desk ${process.env.ORACLE_DESK_URL||process.env.ORACLE_PUBLIC_URL}`:null;r("data_server",E?"ok":"warn",E?`reachable ${p}${R?` (${R})`:""}`:`down ${p}`,E?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 d=L();r("agent_runtime",d.ok?"ok":"warn",d.ok?`present ${d.bin} (${d.source})`:"not installed",d.ok?null:"oracle bootstrap");let A=V.join(t.paths.hermesRoot(),"profiles"),h=0;m.existsSync(A)&&(h=m.readdirSync(A,{withFileTypes:!0}).filter(a=>a.isDirectory()).length),r("hermes_lanes",h>0?"ok":"warn",h>0?`${h} profile dir(s)`:"no lane profiles found",h>0?null:"oracle init --apply");let k={ok:!s,checks:e};if(o)process.stdout.write(JSON.stringify(k,null,2)+`
2
+ `);else for(let a of e)process.stdout.write(`${a.status.toUpperCase().padEnd(4)} ${a.id}: ${a.detail}
3
+ `),a.fix&&process.stdout.write(` fix: ${a.fix}
4
+ `);return s?1:0}};export{ce as default};
@@ -1,3 +1,3 @@
1
- import{spawnSync as i}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","# optional, explicit second step \u2014 signing stays a separate local package:","npm i -g @oracle-agent/operator","oracle sign init"];function a(){return["","Next:",...n.map(o=>" "+o),""].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(o){let r=[...o.argv];r.includes("--yes")&&!r.includes("--apply")&&r.push("--apply");let s=o.bin("oracle-init.mjs"),e=i(process.execPath,[s,...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 t=typeof e.status=="number"?e.status:1;return t===0&&r.includes("--apply")&&!r.includes("--json")&&process.stdout.write(a()),t}};export{d as default};
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 Ft}from"node:util";import q from"node:path";import{fileURLToPath as ft}from"node:url";var dt=q.dirname(ft(import.meta.url)),Wt=q.resolve(dt,"../.."),Gt=Object.freeze(["oracle-vault","oracle-credential","oracle-signer","oracle-runner","oracle-agentic-init","oracle-agentic-doctor","oracle-control-mcp","oracle-operator-caps"]),Bt=Object.freeze(["vault","credential","signer","runner","sign"]),K=`oracle: signing is unavailable in the public package.
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 At(t){return t.replace(new RegExp(`${ot}[\\s\\S]*?${st}\\n?`,"g"),"")}async function J({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=Rt(n.specs),s=Et();if(i)return{ok:!0,printText:o,path:s};rt.mkdirSync(nt.dirname(s),{recursive:!0});let c=rt.existsSync(s)?$(s,""):"";if(c.includes(o.trim()))return{ok:!0,...m("present",{path:s,backup:null})};let l=(At(c).trimEnd()+`
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
- `+o).replace(/^\n+/,"");if(c.trim()===l.trim())return{ok:!0,...m("present",{path:s,backup:null})};let a=c?S(s):null;return E(s,l.endsWith(`
16
- `)?l:l+`
17
- `),{ok:!0,...m("written",{path:s,backup:a})}}import Lt from"node:fs";import it from"node:path";var M="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 Nt(){return{openapi:"3.1.0",info:{title:"Oracle Public (read/prepare)",version:"1.0.0",description:"Secret-free public surface for hosted clients. "+M},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 H({printOnly:t=!1}={}){let r=Nt(),e=it.join(g(),".config","oracle","connectors","chatgpt-openapi.json"),i=JSON.stringify(r,null,2)+`
18
- `;t||(Lt.mkdirSync(it.dirname(e),{recursive:!0}),E(e,i));let n=[M,"","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: ${e}`].filter(Boolean).join(`
19
- `);return{ok:!0,...m(t?"printed":"written",{path:e,print:r,instructions:n,cannotSign:M})}}import W from"node:path";import ct from"node:os";function Ut(){return process.platform==="darwin"?W.join(ct.homedir(),"Library","Application Support","Cursor","User","globalStorage","mcp.json"):process.platform==="win32"?W.join(ct.homedir(),"AppData","Roaming","Cursor","User","globalStorage","mcp.json"):W.join(g(),".config","cursor","mcp.json")}async function G({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,printText:['Add this to your Cursor MCP config (Cmd+Shift+P \u2192 "MCP: Open Configuration"):',JSON.stringify({mcpServers:s.specs},null,2)].join(`
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 c=Ut(),d=b(c,s.specs);return{ok:!0,...m(d.status,{path:c,backup:d.backup})}}import A from"node:path";import at from"node:os";function Pt(){return process.platform==="darwin"?A.join(at.homedir(),"Library","Application Support","Code","User","globalStorage","mcp.json"):process.platform==="win32"?A.join(at.homedir(),"AppData","Roaming","Code","User","globalStorage","mcp.json"):A.join(g(),".config","Code","User","globalStorage","mcp.json")}function $t(t){return A.join(t||process.cwd(),".vscode","mcp.json")}async function B({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,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?$t(o):Pt(),d=b(c,s.specs);return{ok:!0,...m(d.status,{path:c,backup:d.backup})}}import{readFileSync as N,existsSync as O,writeFileSync as L,mkdirSync as ut}from"node:fs";import{join as y,dirname as Tt}from"node:path";import{homedir as pt}from"node:os";var Dt=y(Tt(new URL(import.meta.url).pathname),"..","..","..","profiles","oracle","SOUL.md");function It(){let t=[Dt,y(pt(),".config","oracle","SOUL.md")];for(let r of t)if(O(r))return N(r,"utf8");throw new Error("SOUL.md not found \u2014 run 'oracle bootstrap' first")}async function lt(t,{cwd:r=process.cwd(),printOnly:e=!1}={}){let i=It();if(t==="claude-code"||t==="claude"){let n=y(r,"CLAUDE.md"),o=O(n)?N(n,"utf8"):"",s=`# Oracle Agent Instructions
23
- ${i}
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(e)return{ok:!0,printText:`# Would write to ${n}:
16
+ ${o}`;if(r)return{ok:!0,printText:`# Would write to ${e}:
26
17
 
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(t==="cursor"){let n=y(r,".cursorrules"),o=O(n)?N(n,"utf8"):"",s=`# Oracle Agent Instructions
28
- ${i}
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(e)return{ok:!0,printText:`# Would write to ${n}:
21
+ ${o}`;if(r)return{ok:!0,printText:`# Would write to ${e}:
31
22
 
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(t==="claude-desktop"){let n=y(pt(),"Library","Application Support","Claude","claude_desktop_config.json");if(!O(n))return{ok:!1,reason:"Claude Desktop config not found. Open Claude Desktop once first, then retry."};let o=T(n);if(e)return{ok:!0,printText:`# Would add Oracle SOUL to Claude Desktop custom instructions
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
- ${i.slice(0,500)}...`,status:"printed"};let s=S(n);return o.customInstructions=o.customInstructions||"",o.customInstructions=`# Oracle Agent Instructions
35
- ${i}
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}`,D(n,o),{ok:!0,path:n,backup:s,status:"installed"}}if(t==="codex"||t==="copilot"){let n=y(r,".github"),o=y(n,"copilot-instructions.md"),s=O(o)?N(o,"utf8"):"";if(e)return{ok:!0,printText:`# Would write to ${o}:
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
- ${i.slice(0,500)}...`,status:"printed"};O(n)||ut(n,{recursive:!0});let c=S(o);return L(o,`${i}
30
+ ${s.slice(0,500)}...`,status:"printed"};b(e)||ot(e,{recursive:!0});let c=k(o);return E(o,`${s}
40
31
  ---
41
- ${s}`,"utf8"),{ok:!0,path:o,backup:c,status:"installed"}}if(t==="vscode"||t==="vs-code"){let n=y(r,".vscode"),o=y(n,"instructions.md");if(e)return{ok:!0,printText:`# Would write to ${o}:
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
- ${i.slice(0,500)}...`,status:"printed"};O(n)||ut(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 '${t}'`}}function U(){process.stderr.write(`usage: oracle mcp <install|print> [target] [flags]
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-control --with-soul --project --print --json
47
- `)}function x(t,{json:r=!1}={}){if(t.print&&!t.instructions?process.stdout.write(JSON.stringify(t.print,null,2)+`
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&&r&&process.stdout.write(JSON.stringify(t.print,null,2)+`
50
- `)),!t.print&&!t.printText&&!t.instructions){let e={status:t.status,path:t.path||null,backup:t.backup||null,method:t.method||null};process.stdout.write((r?JSON.stringify(e,null,2):`${e.status}${e.path?" "+e.path:""}`)+`
51
- `)}}var Be={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(t){let r=t.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=t.argv.includes("--once"),w=f.join(t.root,"bin","oracle-mcp-watchdog.mjs");return a(process.execPath,[w,...p?["--once"]:[]],{stdio:"inherit",detached:!0}).unref(),0}let e,i;try{({values:e,positionals:i}=Ft({args:t.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=!!e["with-control"],o=!!e["with-soul"],s=!!e.project,c=!!e.json,d=t.resolveOperator?t.resolveOperator():{ok:!1};if(n&&(!d||!d.ok))return C(process.stderr),3;let l={oracleRoot:t.root,operator:d,withControl:n,project:s,cwd:process.cwd()};if(r==="print"){let a=e.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):(C(process.stderr),3)}if(a==="chatgpt"){let f=await H({printOnly:!0});return x(f,{json:c}),0}return a==="codex"||a==="copilot"?(x(await J({...l,printOnly:!0}),{json:c}),0):a==="claude-desktop"?(x(await F({...l,printOnly:!0}),{json:c}),0):a==="cursor"?(x(await G({...l,printOnly:!0}),{json:c}),0):a==="vscode"||a==="vs-code"?(x(await B({...l,printOnly:!0}),{json:c}),0):(process.stderr.write(`oracle mcp: unknown target '${a}'
54
- `),1)}if(r==="install"){let a=i[0]||e.target;if(!a)return U(),1;let f=!!e.print,p;if(a==="claude-code")p=await et({...l,printOnly:f});else if(a==="claude-desktop")p=await F({...l,printOnly:f});else if(a==="codex"||a==="copilot")p=await J({...l,printOnly:f});else if(a==="chatgpt")p=await H({printOnly:f});else if(a==="cursor")p=await G({...l,printOnly:f});else if(a==="vscode"||a==="vs-code")p=await B({...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):(C(process.stderr),3)}else return process.stderr.write(`oracle mcp: unknown target '${a}'
56
- `),1;if(!p.ok)return p.code===3?C(process.stderr):process.stderr.write(`oracle mcp: ${p.reason||"failed"}
57
- `),p.code||1;if(x(p,{json:c}),o){let w=await lt(a,{cwd:process.cwd(),printOnly:f});w.ok?process.stderr.write(` soul \u2192 ${w.path||"injected"}
58
- `):process.stderr.write(` soul: ${w.reason||"failed"}
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 U(),1}};export{Be as default};
51
+ `),0}return R(),1}};export{Le as default};