@oracle-agent/oracle 0.22.4 → 0.22.6

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.
@@ -107,12 +107,6 @@ venue, check `address_book_lookup` / `address_book_list` instead of asking them
107
107
  paste it again. Labels only — never private keys, seeds, or passphrases, and a
108
108
  remembered label is a convenience, not an authorization.
109
109
 
110
- ## RLM / Prime research (optional)
111
-
112
- Long-horizon research can use `oracle prime` (Prime Intellect) or native chat.
113
- That lane is public read/prepare only: signer env is stripped, and research GO
114
- is never release GO. Money-path walls in this SOUL still apply.
115
-
116
110
  ## Confidence
117
111
 
118
112
  State it explicitly: `high` / `moderate` / `low` / `unknown`. A confident wrong
@@ -126,6 +120,7 @@ evidence. When something failed, say what failed and what you tried.
126
120
  ## Self-host
127
121
 
128
122
  Oracle ships its own agent runtime — direct OAuth to Claude, Codex, and Grok.
129
- Hermes is optional. `oracle chat` auto-detects Hermes on PATH and uses it if
130
- available; otherwise it runs standalone with the built-in agent loop, tools,
131
- memory, skills, and cron scheduler.
123
+ Native standalone is the only default. Hermes is optional and never auto-selected:
124
+ `oracle harness detect` can show it on PATH, and you opt in only with
125
+ `ORACLE_CHAT_BACKEND=hermes`. Otherwise `oracle chat` runs the built-in agent
126
+ loop, tools, memory, skills, and cron scheduler.
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env node
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 v(){return i.join(f(),"desk.json")}function A(){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=A();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=v();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 C(){return i.join(f(),"connectors")}function q(){return i.join(C(),"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:v,oracleEnvFilePath:A,loadDeskRouting:p,hermesRoot:H,activeChainPath:K,claudeCodeUserConfigPath:I,claudeCodeProjectMcpPath:M,claudeDesktopConfigPath:F,codexConfigPath:N,chatgptConnectorDir:C,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 R from"node:path";import{promisify as J}from"node:util";var xe=J(G);var ke=1440*60*1e3;function j(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||R.join(process.env.HOME||".",".oracle");return R.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)
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 v(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function f(){return v()?process.env.ORACLE_CONFIG_DIR||i.join(u(),".config","oracle"):i.join(u(),".config","oracle")}function $(){return i.join(f(),"exec.env")}function _(){return i.join(f(),"desk.json")}function A(){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=A();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=_();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 C(){return i.join(f(),"connectors")}function q(){return i.join(C(),"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:v,oracleConfigDir:f,oracleExecEnvPath:$,oracleDeskJsonPath:_,oracleEnvFilePath:A,loadDeskRouting:p,hermesRoot:H,activeChainPath:K,claudeCodeUserConfigPath:I,claudeCodeProjectMcpPath:M,claudeDesktopConfigPath:F,codexConfigPath:N,chatgptConnectorDir:C,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 ke=J(G);var xe=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)
3
3
  oracle open the native Oracle chat (TTY)
4
- oracle bootstrap optional: install an isolated Hermes compatibility runtime
5
- oracle init install agent lanes + read plane (dry-run by default)
4
+ oracle bootstrap optional Hermes install only (never required; never auto-selected)
5
+ oracle init optional Hermes lane install (dry-run by default)
6
6
  oracle doctor check the read plane
7
7
  oracle eval desk run desk harness eval (critical tests + parse smoke)
8
8
  oracle chat premium boxed oracle chat (multi-model)
9
- oracle model choose standalone/Hermes provider and any compatible model
9
+ oracle model choose standalone provider and any compatible model
10
10
  oracle auth Claude/Codex/Grok OAuth or securely stored provider API keys
11
11
  oracle chain list/select working chains (hyperliquid, base, ...)
12
12
  oracle setup model choose Claude/Codex/Grok standalone OAuth
13
- oracle setup standalone model + messaging menu
13
+ oracle setup standalone model + optional Hermes messaging menu
14
+ oracle harness detect detect installed clients (capability only; no backend change)
14
15
  oracle data serve|call|catalog|health
15
16
  oracle data-mcp start the read-only MCP server
16
17
  oracle scan chains|head|token|pools|risk|quote|sell
@@ -28,23 +29,22 @@ import{realpathSync as U}from"node:fs";import{fileURLToPath as re}from"node:url"
28
29
  manage Agent Plugins (open-standard portable agent tooling)
29
30
  oracle harness detect|list scan PATH for installed agent harnesses (opencode, claude, codex, cursor\u2026)
30
31
  oracle fees status|check check Locals Only 0% fee eligibility
31
- oracle prime doctor|-p Prime Intellect RLM research lane (public only)
32
- oracle eval desk|fidelity|hybrid|guards|prime|all
33
- harness eval battery (unsigned / research only)
32
+ oracle eval desk|fidelity|hybrid|guards|all
33
+ native harness eval battery (unsigned / research only)
34
34
  oracle upgrade upgrade installed agent lanes
35
35
 
36
36
  oracle <noun> --help for details. This package prepares unsigned actions and
37
37
  never handles keys, signs, or broadcasts transactions.
38
- `;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||j(o.latest,e)<=0?"":`
38
+ `;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?"":`
39
39
  Update available: ${e} \u2192 ${o.latest}. Run 'oracle update'.
40
- `}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","prime","fees"]).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(`
40
+ `}function k(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","fees"]).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(`
41
41
  `)+`
42
42
  `+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}
43
43
  Try: oracle --help
44
- `}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}`)+`
44
+ `}function x(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(k(o,n)),0}if(e.length===0){let n=await m();if(ee(e)){let c=n.get("chat");if(c)return c.run(x([]))}return process.stdout.write(k(o,n)),0}if(te(e[0])){let c=(await m()).get("chat");if(c)return c.run(x(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}`)+`
45
45
  `),c.summary&&process.stdout.write(c.summary+`
46
- `),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}`)+`
46
+ `),0):(process.stderr.write(w(s[0],n)),1)}return process.stdout.write(k(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}`)+`
47
47
  `),t.summary&&process.stdout.write(t.summary+`
48
- `),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}
48
+ `),0;try{let n=await t.run(x(s));return typeof n=="number"?n:0}catch(n){return process.stderr.write(`oracle ${r}: ${n?.message||n}
49
49
  `),1}}return process.stderr.write(w(r,a)),1}async function L(){let e=O();return process.stdout.write(`oracle ${e}
50
50
  `),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,6 +1,6 @@
1
- import a from"node:fs";import c from"node:path";import{createHash as Y}from"node:crypto";import{spawnSync as y}from"node:child_process";import x from"node:fs";import M from"node:os";import m from"node:path";import{fileURLToPath as B}from"node:url";var V=m.dirname(B(import.meta.url)),oe=m.resolve(V,"../..");function _(){return process.env.ORACLE_FAKE_HOME||M.homedir()}function T(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function S(){return T()?process.env.ORACLE_CONFIG_DIR||m.join(_(),".config","oracle"):m.join(_(),".config","oracle")}function F(){return m.join(S(),"desk.json")}function K(){return m.join(S(),"env")}function h({force:t=!1}={}){if(h._done&&!t)return h._result||null;h._done=!0;let n={},e=(s,r)=>{if(r==null)return;let i=String(r).trim();i&&(process.env[s]!=null&&String(process.env[s]).trim()!==""||(process.env[s]=i,n[s]=i))};try{let s=K();if(x.existsSync(s))for(let r of x.readFileSync(s,"utf8").split(/\r?\n/)){let i=r.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let u=i[2];(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),e(i[1],u)}}catch{}try{let s=F();if(x.existsSync(s)){let r=JSON.parse(x.readFileSync(s,"utf8"));r&&typeof r=="object"&&(e("ORACLE_DESK_URL",r.deskUrl||r.dataUrl||r.url),e("ORACLE_DATA_URL",r.dataUrl||r.deskUrl||r.url),e("ORACLE_API_URL",r.apiUrl||r.dataUrl||r.deskUrl),e("ORACLE_PUBLIC_URL",r.publicUrl||r.deskUrl||r.dataUrl),e("ORACLE_EXEC_URL",r.execUrl),e("MAD_DESK_URL",r.deskUrl||r.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(e("ORACLE_DESK_URL",o),e("ORACLE_DATA_URL",o),e("ORACLE_API_URL",o),e("ORACLE_PUBLIC_URL",o),e("MAD_DESK_URL",o)),h._result=Object.keys(n).length?n:null,h._result}try{h()}catch{}function R(t){return x.mkdirSync(t,{recursive:!0}),t}var W="0.19.0",j=`hermes-agent==${W}`,A=[3,11],w=[3,14],b="3.13",k="0.12.1",U=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${k}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${k}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function z(t,{windows:n=process.platform==="win32"}={}){let e=Buffer.isBuffer(t)?t:Buffer.from(t),o=n?U.windows:U.posix,s=Y("sha256").update(e).digest("hex"),r=e.toString("utf8");return s===o.sha256&&r.length>=1e3&&r.includes(k)}function p(){return c.join(S(),"runtime")}function P(){return c.join(p(),"venv")}function $(t){let n=process.platform==="win32"?"Scripts":"bin",e=process.platform==="win32"?`${t}.exe`:t;return c.join(P(),n,e)}function g(){return $("hermes")}function J(){let t=$("python3");return a.existsSync(t)?t:$("python")}function E(){return c.join(p(),"uv",process.platform==="win32"?"uv.exe":"uv")}function v(t){let n=process.platform==="win32"&&!c.extname(t)?["",".exe",".cmd",".bat"]:[""];for(let e of(process.env.PATH||"").split(c.delimiter))if(e)for(let o of n){let s=c.join(e,`${t}${o}`);try{if(a.existsSync(s))return s}catch{}}return null}function X(t){let n=/Python (\d+)\.(\d+)\.(\d+)/.exec(t||"");return n?[Number(n[1]),Number(n[2]),Number(n[3])]:null}function G(t){if(!t)return!1;let[n,e]=t;return!(n<A[0]||n===A[0]&&e<A[1]||n>w[0]||n===w[0]&&e>=w[1])}function C(){let t=[process.env.ORACLE_PYTHON,"python3.13","python3.12","python3.11","python3","python"].filter(Boolean);for(let n of t){let e=c.isAbsolute(n)?a.existsSync(n)?n:null:v(n);if(!e)continue;let o=y(e,["--version"],{encoding:"utf8",timeout:15e3}),s=X(`${o.stdout||""}${o.stderr||""}`);if(G(s))return{bin:e,version:s.join("."),source:"host"}}return null}function D(){return process.env.ORACLE_UV_BIN||v("uv")||(a.existsSync(c.join(_(),".local","bin","uv"))?c.join(_(),".local","bin","uv"):null)||(a.existsSync(E())?E():null)}function Z(t,n){let e=["const fs=require('node:fs');","const [url,dest]=process.argv.slice(1);","fetch(url).then(r=>{if(!r.ok)throw new Error('http '+r.status);return r.arrayBuffer()})",".then(b=>fs.writeFileSync(dest,Buffer.from(b)))",".catch(e=>{console.error(e.message);process.exit(1)});"].join("");return y(process.execPath,["-e",e,t,n],{encoding:"utf8",timeout:2*6e4})}function Q({quiet:t=!1}={}){let n=D();if(n)return{ok:!0,bin:n,reused:!0};R(p());let e=process.platform==="win32",o=c.join(p(),e?"uv-install.ps1":"uv-install.sh"),s=e?U.windows:U.posix,r=Z(s.url,o);if(r.status!==0)return{ok:!1,reason:`could not download the uv installer (${r.status})`,stderr:(r.stderr||"").slice(-800)};let i=a.readFileSync(o);if(!z(i,{windows:e}))return{ok:!1,reason:`uv ${k} installer checksum mismatch`};let u=c.dirname(E());R(u);let d=e?v("powershell.exe")||v("powershell"):v("sh")||"/bin/sh";if(!d)return{ok:!1,reason:e?"PowerShell not found":"sh not found"};let f=y(d,e?["-NoProfile","-ExecutionPolicy","Bypass","-File",o]:[o],{stdio:t?"pipe":"inherit",encoding:"utf8",timeout:5*6e4,env:{...process.env,UV_INSTALL_DIR:u,UV_NO_MODIFY_PATH:"1"}});return f.status!==0||!a.existsSync(E())?{ok:!1,reason:`uv install failed (${f.status})`,stderr:(f.stderr||"").slice(-800)}:{ok:!0,bin:E(),reused:!1}}function O({quiet:t=!1}={}){let n=Q({quiet:t});if(!n.ok)return n;let e=n.bin,o={...process.env,UV_PYTHON_INSTALL_DIR:c.join(p(),"python"),UV_CACHE_DIR:c.join(p(),"cache")},s=y(e,["python","install","--no-bin",b],{stdio:t?"pipe":"inherit",encoding:"utf8",timeout:15*6e4,env:o});if(s.status!==0)return{ok:!1,reason:`uv python install ${b} failed (${s.status})`,stderr:(s.stderr||"").slice(-800)};let r=y(e,["python","find",b],{encoding:"utf8",timeout:6e4,env:o}),i=(r.stdout||"").trim().split(/\r?\n/)[0];return r.status!==0||!i||!a.existsSync(i)?{ok:!1,reason:`uv could not locate python ${b}`}:{ok:!0,bin:i,version:b,source:"uv"}}function q(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let t=v("hermes");if(t)return{ok:!0,bin:t,source:"path"};let n=g();return a.existsSync(n)?{ok:!0,bin:n,source:"managed"}:{ok:!1,bin:null,source:null}}function I(){let t=q(),n=C();return{hermes:t,managedVenv:P(),managedInstalled:a.existsSync(g()),hostPython:n,uv:D()}}function L(t,n,{quiet:e}){return y(t,n,{stdio:e?"pipe":"inherit",encoding:"utf8",timeout:20*6e4})}function H({quiet:t=!1,upgrade:n=!1}={}){let e=C();if(!e){let l=O({quiet:t});if(l.ok)e={bin:l.bin,version:l.version,source:"uv"};else return{ok:!1,reason:`no supported python found (need 3.11-3.13) and uv could not provide one: ${l.reason}. install uv (https://docs.astral.sh/uv) or python 3.13, then re-run 'oracle bootstrap'`}}R(p());let o=P();if(a.existsSync(g())&&!n)return{ok:!0,bin:g(),reused:!0};if(!a.existsSync(c.join(o,"pyvenv.cfg"))){let l=L(e.bin,["-m","venv",o],{quiet:t});if(l.status!==0&&e.source!=="uv"){a.rmSync(o,{recursive:!0,force:!0});let f=O({quiet:t});if(f.ok)e={bin:f.bin,version:f.version,source:"uv"},l=L(e.bin,["-m","venv",o],{quiet:t});else return{ok:!1,reason:`python -m venv failed (${l.status}) and uv fallback failed: ${f.reason}`,stderr:(l.stderr||"").slice(-800)}}if(l.status!==0)return{ok:!1,reason:`isolated python -m venv failed (${l.status})`,stderr:(l.stderr||"").slice(-800)}}let r=J();if(!a.existsSync(r))return{ok:!1,reason:`venv python missing at ${r}`};let i=["-m","pip","install","--disable-pip-version-check"];n&&i.push("--upgrade"),i.push(j);let u=L(r,i,{quiet:t});if(u.status!==0)return{ok:!1,reason:`pip install ${j} failed (${u.status})`,stderr:(u.stderr||"").slice(-1200)};let d=g();return a.existsSync(d)?{ok:!0,bin:d,reused:!1,python:e.version}:{ok:!1,reason:`hermes entrypoint not found after install (${d})`}}function N(){return["oracle bootstrap - optionally install an isolated Hermes compatibility runtime",""," oracle bootstrap install into ~/.config/oracle/runtime/venv"," oracle bootstrap --upgrade upgrade the managed runtime"," oracle bootstrap --status show what runtime oracle would use"," oracle bootstrap --json machine-readable status","","notes:"," a hermes on PATH always wins; bootstrap never touches system python"," read/prepare commands (chain, scan, route, data) never need this"].join(`
1
+ import a from"node:fs";import c from"node:path";import{createHash as Y}from"node:crypto";import{spawnSync as y}from"node:child_process";import x from"node:fs";import M from"node:os";import m from"node:path";import{fileURLToPath as B}from"node:url";var T=m.dirname(B(import.meta.url)),oe=m.resolve(T,"../..");function _(){return process.env.ORACLE_FAKE_HOME||M.homedir()}function V(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function S(){return V()?process.env.ORACLE_CONFIG_DIR||m.join(_(),".config","oracle"):m.join(_(),".config","oracle")}function F(){return m.join(S(),"desk.json")}function K(){return m.join(S(),"env")}function h({force:t=!1}={}){if(h._done&&!t)return h._result||null;h._done=!0;let n={},e=(s,r)=>{if(r==null)return;let i=String(r).trim();i&&(process.env[s]!=null&&String(process.env[s]).trim()!==""||(process.env[s]=i,n[s]=i))};try{let s=K();if(x.existsSync(s))for(let r of x.readFileSync(s,"utf8").split(/\r?\n/)){let i=r.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let u=i[2];(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),e(i[1],u)}}catch{}try{let s=F();if(x.existsSync(s)){let r=JSON.parse(x.readFileSync(s,"utf8"));r&&typeof r=="object"&&(e("ORACLE_DESK_URL",r.deskUrl||r.dataUrl||r.url),e("ORACLE_DATA_URL",r.dataUrl||r.deskUrl||r.url),e("ORACLE_API_URL",r.apiUrl||r.dataUrl||r.deskUrl),e("ORACLE_PUBLIC_URL",r.publicUrl||r.deskUrl||r.dataUrl),e("ORACLE_EXEC_URL",r.execUrl),e("MAD_DESK_URL",r.deskUrl||r.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(e("ORACLE_DESK_URL",o),e("ORACLE_DATA_URL",o),e("ORACLE_API_URL",o),e("ORACLE_PUBLIC_URL",o),e("MAD_DESK_URL",o)),h._result=Object.keys(n).length?n:null,h._result}try{h()}catch{}function R(t){return x.mkdirSync(t,{recursive:!0}),t}var W="0.19.0",j=`hermes-agent==${W}`,U=[3,11],L=[3,14],g="3.13",A="0.12.1",k=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${A}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${A}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function z(t,{windows:n=process.platform==="win32"}={}){let e=Buffer.isBuffer(t)?t:Buffer.from(t),o=n?k.windows:k.posix,s=Y("sha256").update(e).digest("hex"),r=e.toString("utf8");return s===o.sha256&&r.length>=1e3&&r.includes(A)}function p(){return c.join(S(),"runtime")}function P(){return c.join(p(),"venv")}function C(t){let n=process.platform==="win32"?"Scripts":"bin",e=process.platform==="win32"?`${t}.exe`:t;return c.join(P(),n,e)}function b(){return C("hermes")}function J(){let t=C("python3");return a.existsSync(t)?t:C("python")}function E(){return c.join(p(),"uv",process.platform==="win32"?"uv.exe":"uv")}function v(t){let n=process.platform==="win32"&&!c.extname(t)?["",".exe",".cmd",".bat"]:[""];for(let e of(process.env.PATH||"").split(c.delimiter))if(e)for(let o of n){let s=c.join(e,`${t}${o}`);try{if(a.existsSync(s))return s}catch{}}return null}function X(t){let n=/Python (\d+)\.(\d+)\.(\d+)/.exec(t||"");return n?[Number(n[1]),Number(n[2]),Number(n[3])]:null}function G(t){if(!t)return!1;let[n,e]=t;return!(n<U[0]||n===U[0]&&e<U[1]||n>L[0]||n===L[0]&&e>=L[1])}function $(){let t=[process.env.ORACLE_PYTHON,"python3.13","python3.12","python3.11","python3","python"].filter(Boolean);for(let n of t){let e=c.isAbsolute(n)?a.existsSync(n)?n:null:v(n);if(!e)continue;let o=y(e,["--version"],{encoding:"utf8",timeout:15e3}),s=X(`${o.stdout||""}${o.stderr||""}`);if(G(s))return{bin:e,version:s.join("."),source:"host"}}return null}function D(){return process.env.ORACLE_UV_BIN||v("uv")||(a.existsSync(c.join(_(),".local","bin","uv"))?c.join(_(),".local","bin","uv"):null)||(a.existsSync(E())?E():null)}function Z(t,n){let e=["const fs=require('node:fs');","const [url,dest]=process.argv.slice(1);","fetch(url).then(r=>{if(!r.ok)throw new Error('http '+r.status);return r.arrayBuffer()})",".then(b=>fs.writeFileSync(dest,Buffer.from(b)))",".catch(e=>{console.error(e.message);process.exit(1)});"].join("");return y(process.execPath,["-e",e,t,n],{encoding:"utf8",timeout:2*6e4})}function Q({quiet:t=!1}={}){let n=D();if(n)return{ok:!0,bin:n,reused:!0};R(p());let e=process.platform==="win32",o=c.join(p(),e?"uv-install.ps1":"uv-install.sh"),s=e?k.windows:k.posix,r=Z(s.url,o);if(r.status!==0)return{ok:!1,reason:`could not download the uv installer (${r.status})`,stderr:(r.stderr||"").slice(-800)};let i=a.readFileSync(o);if(!z(i,{windows:e}))return{ok:!1,reason:`uv ${A} installer checksum mismatch`};let u=c.dirname(E());R(u);let d=e?v("powershell.exe")||v("powershell"):v("sh")||"/bin/sh";if(!d)return{ok:!1,reason:e?"PowerShell not found":"sh not found"};let f=y(d,e?["-NoProfile","-ExecutionPolicy","Bypass","-File",o]:[o],{stdio:t?"pipe":"inherit",encoding:"utf8",timeout:5*6e4,env:{...process.env,UV_INSTALL_DIR:u,UV_NO_MODIFY_PATH:"1"}});return f.status!==0||!a.existsSync(E())?{ok:!1,reason:`uv install failed (${f.status})`,stderr:(f.stderr||"").slice(-800)}:{ok:!0,bin:E(),reused:!1}}function O({quiet:t=!1}={}){let n=Q({quiet:t});if(!n.ok)return n;let e=n.bin,o={...process.env,UV_PYTHON_INSTALL_DIR:c.join(p(),"python"),UV_CACHE_DIR:c.join(p(),"cache")},s=y(e,["python","install","--no-bin",g],{stdio:t?"pipe":"inherit",encoding:"utf8",timeout:15*6e4,env:o});if(s.status!==0)return{ok:!1,reason:`uv python install ${g} failed (${s.status})`,stderr:(s.stderr||"").slice(-800)};let r=y(e,["python","find",g],{encoding:"utf8",timeout:6e4,env:o}),i=(r.stdout||"").trim().split(/\r?\n/)[0];return r.status!==0||!i||!a.existsSync(i)?{ok:!1,reason:`uv could not locate python ${g}`}:{ok:!0,bin:i,version:g,source:"uv"}}function q(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let t=v("hermes");if(t)return{ok:!0,bin:t,source:"path"};let n=b();return a.existsSync(n)?{ok:!0,bin:n,source:"managed"}:{ok:!1,bin:null,source:null}}function H(){let t=q(),n=$();return{hermes:t,managedVenv:P(),managedInstalled:a.existsSync(b()),hostPython:n,uv:D()}}function w(t,n,{quiet:e}){return y(t,n,{stdio:e?"pipe":"inherit",encoding:"utf8",timeout:20*6e4})}function I({quiet:t=!1,upgrade:n=!1}={}){let e=$();if(!e){let l=O({quiet:t});if(l.ok)e={bin:l.bin,version:l.version,source:"uv"};else return{ok:!1,reason:`no supported python found (need 3.11-3.13) and uv could not provide one: ${l.reason}. install uv (https://docs.astral.sh/uv) or python 3.13, then re-run 'oracle bootstrap'`}}R(p());let o=P();if(a.existsSync(b())&&!n)return{ok:!0,bin:b(),reused:!0};if(!a.existsSync(c.join(o,"pyvenv.cfg"))){let l=w(e.bin,["-m","venv",o],{quiet:t});if(l.status!==0&&e.source!=="uv"){a.rmSync(o,{recursive:!0,force:!0});let f=O({quiet:t});if(f.ok)e={bin:f.bin,version:f.version,source:"uv"},l=w(e.bin,["-m","venv",o],{quiet:t});else return{ok:!1,reason:`python -m venv failed (${l.status}) and uv fallback failed: ${f.reason}`,stderr:(l.stderr||"").slice(-800)}}if(l.status!==0)return{ok:!1,reason:`isolated python -m venv failed (${l.status})`,stderr:(l.stderr||"").slice(-800)}}let r=J();if(!a.existsSync(r))return{ok:!1,reason:`venv python missing at ${r}`};let i=["-m","pip","install","--disable-pip-version-check"];n&&i.push("--upgrade"),i.push(j);let u=w(r,i,{quiet:t});if(u.status!==0)return{ok:!1,reason:`pip install ${j} failed (${u.status})`,stderr:(u.stderr||"").slice(-1200)};let d=b();return a.existsSync(d)?{ok:!0,bin:d,reused:!1,python:e.version}:{ok:!1,reason:`hermes entrypoint not found after install (${d})`}}function N(){return["oracle bootstrap - optional Hermes install (never required for native Oracle)",""," oracle bootstrap install into ~/.config/oracle/runtime/venv"," oracle bootstrap --upgrade upgrade the managed Hermes runtime"," oracle bootstrap --status show detected Hermes (if any)"," oracle bootstrap --json machine-readable status","","notes:"," native chat/model/auth never need this"," detection never selects Hermes; opt in with ORACLE_CHAT_BACKEND=hermes"," a hermes on PATH wins over managed install; bootstrap never touches system python"," read/prepare commands (chain, scan, route, data) never need this"].join(`
2
2
  `)}var de={name:"bootstrap",summary:"optionally install a Hermes compatibility runtime",group:"read",usage:N(),async run(t){let n=t.argv;if(n.includes("-h")||n.includes("--help"))return process.stdout.write(N()+`
3
- `),0;let e=n.includes("--json"),o=I();if(n.includes("--status")||e)return e?(process.stdout.write(JSON.stringify(o,null,2)+`
3
+ `),0;let e=n.includes("--json"),o=H();if(n.includes("--status")||e)return e?(process.stdout.write(JSON.stringify(o,null,2)+`
4
4
  `),0):(process.stdout.write([`hermes: ${o.hermes.ok?`${o.hermes.bin} (${o.hermes.source})`:"not installed"}`,`managed venv: ${o.managedVenv}`,`managed built: ${o.managedInstalled?"yes":"no"}`,`host python: ${o.hostPython?`${o.hostPython.bin} (${o.hostPython.version})`:"none supported (need 3.11-3.13)"}`,`uv: ${o.uv||"not installed (oracle will install it locally)"}`,""].join(`
5
5
  `)),0);let s=n.includes("--upgrade");if(o.hermes.ok&&o.hermes.source==="path"&&!s)return process.stdout.write(`hermes already on PATH: ${o.hermes.bin}
6
6
  nothing to do. run: oracle
@@ -9,7 +9,7 @@ nothing to do. run: oracle
9
9
  `:`provisioning an isolated python 3.13 with uv
10
10
  `)+`this takes a few minutes on first run
11
11
 
12
- `);let r=H({upgrade:s});return r.ok?(process.stdout.write(r.reused?`runtime already present: ${r.bin}
12
+ `);let r=I({upgrade:s});return r.ok?(process.stdout.write(r.reused?`runtime already present: ${r.bin}
13
13
  `:`
14
14
  runtime ready: ${r.bin}
15
15
  run: oracle
@@ -19,8 +19,8 @@ try: /chain list`,{error:!0}),!0)}function g(){let O=c.assistantBuffer.split(`
19
19
  `),x=O[O.length-1]||"";c.liveLines=x?pr(x,c.width):[]}function S({final:O=!1}={}){let x=c.assistantBuffer.split(`
20
20
  `),I=O?x.length:x.length-1,$=!1;for(;c.flushedLines<I;){let Y=x[c.flushedLines];for(let D of pr(Y,c.width))y(D);c.flushedLines+=1,$=!0}return O?c.liveLines=[]:g(),$}function k(){f||(f=setInterval(()=>{c.busy&&(c.thinking=vt(u()-c.startedAt),m())},250),typeof f.unref=="function"&&f.unref())}function A(){f&&(clearInterval(f),f=null)}async function T(O){let x=String(O||"").trim();if(x){if(x==="/exit"||x==="/quit"){await L();return}if(x==="/clear"){s.clear();for(let I of mr({width:c.width,palette:o}))y(I);m();return}if(l&&_(x)){m();return}c.busy=!0,c.assistantBuffer="",c.flushedLines=0,c.liveLines=[],c.startedAt=u(),c.thinking="0s",y(`${o.bold(o.fg(z.prompt,"you"))} ${x}`),y(""),k(),m(),await i.request("prompt.submit",{session_id:c.sessionId,text:x})}}function v(O){let x=Pc(O);if(x.type!=="gateway.ready"){if(x.type==="session.info"&&x.payload){x.payload.model&&(c.model=x.payload.model),x.payload.reasoning_effort&&(c.effort=x.payload.reasoning_effort),hr(c,x.payload.usage),m();return}if(x.type==="message.start"){c.busy=!0,c.cancelled=!1,c.assistantBuffer="",c.flushedLines=0,c.liveLines=[],y(o.bold(o.fg(z.accent,"oracle"))),m();return}if(x.type==="thinking.delta"||x.type==="reasoning.delta"){if(c.cancelled)return;Ot(x.payload).trim()&&(c.thinking=`${vt(u()-c.startedAt)}`),m();return}if(x.type==="message.delta"){if(c.cancelled)return;c.assistantBuffer+=Ot(x.payload),S(),m();return}if(x.type==="message.complete"){if(c.cancelled){c.cancelled=!1;return}let I=Ot(x.payload);I&&I.length>=c.assistantBuffer.length&&(c.assistantBuffer=I),S({final:!0}),y(""),c.busy=!1,A(),hr(c,x.payload?.usage||x.payload?.context),c.thinking=vt(u()-c.startedAt),m();return}x.type==="error"&&(c.busy=!1,A(),y(o.fg(z.error,`error: ${Ot(x.payload)||"unknown"}`)),m())}}async function w(){await i.start(),i.on("event",v),i.on("log",x=>a.emit("log",x)),i.on("error",x=>a.emit("error",x));let O=await i.request("session.create",{cols:c.width,cwd:e.cwd||process.cwd(),source:"cli",profile:e.profile||"oracle",close_on_disconnect:!0,...e.model?{model:e.model}:{},...e.provider?{provider:e.provider}:{}});c.sessionId=O.session_id,c.model=O.info?.model||c.model,O.info?.reasoning_effort&&(c.effort=O.info.reasoning_effort),hr(c,O.info?.usage);for(let x of mr({width:c.width,palette:o}))y(x);y(""),m(),p=no({stdin:r,stdout:t,onSubmit:x=>{T(x).catch(I=>a.emit("error",I))},onCancel:()=>{c.busy&&(c.busy=!1,c.cancelled=!0,A(),S({final:!0}),y(o.fg(z.warn,"interrupted")),y(""),m(),i.request("session.interrupt",{session_id:c.sessionId}).catch(x=>a.emit("error",x)))},onEof:()=>{L().catch(x=>a.emit("error",x))},onClear:()=>{s.clear(),m()},onRender:x=>{c.buffer=x.buffer||"",c.cursor=x.cursor??c.buffer.length,m()}}),p.start()}async function L(){A(),p&&p.stop(),s.dispose(),await i.stop(),a.emit("stop")}return Object.freeze({start:w,stop:L,on:a.on.bind(a),off:a.off.bind(a),state:c,handleEvent:v,submit:T})}async function yr({hermesPython:e,client:t,tuiFactory:r=jc,args:n=[],env:o=process.env,cwd:s=process.cwd(),stdout:i=process.stdout,stdin:a=process.stdin}={}){let u=Ic(n);if(u.query)return{native:!1,pass:u.pass};if(!a.isTTY||!i.isTTY)return{native:!1,pass:u.pass};if(o.ORACLE_NATIVE_TUI==="0")return{native:!1,pass:u.pass};let l=e;if(!t&&!l)return{native:!1,pass:u.pass};let c=wt({...o,ORACLE_CHAT_SURFACE:"1",ORACLE_PROFILE:"oracle",ORACLE_NODE_BIN:process.execPath}),p=r({...t?{client:t}:{},...l?{python:l.command,pythonArgs:l.prefix||[]}:{},cwd:s,env:c,stdin:a,stdout:i,model:u.model,provider:u.provider,profile:"oracle"});return p.on("log",f=>{o.ORACLE_CLI_DEBUG&&process.stderr.write(`${f}
21
21
  `)}),p.on("error",f=>{process.stderr.write(`oracle chat: ${f.message}
22
- `)}),await p.start(),new Promise(f=>{let d=!1,m=async()=>{d||(d=!0,await p.stop(),f({native:!0,code:0}))};p.on("stop",()=>{d||(d=!0,f({native:!0,code:0}))}),process.once("SIGINT",m),process.once("SIGTERM",m)})}import Mc from"node:fs";import xo from"node:path";var bo=Object.freeze({openrouter:{key:"OPENROUTER_API_KEY",baseUrl:"https://openrouter.ai/api/v1",model:"openrouter/auto"},openai:{key:"OPENAI_API_KEY",baseUrl:"https://api.openai.com/v1",model:"gpt-4.1-mini"},anthropic:{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},xai:{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4.5"},deepseek:{key:"DEEPSEEK_API_KEY",baseUrl:"https://api.deepseek.com/v1",model:"deepseek-chat"},gemini:{key:"GEMINI_API_KEY",alternateKey:"GOOGLE_API_KEY",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",model:"gemini-2.5-flash"},kimi:{key:"MOONSHOT_API_KEY",alternateKey:"KIMI_API_KEY",baseUrl:"https://api.moonshot.ai/v1",model:"kimi-k3",protocol:"openai-chat"},mistral:{key:"MISTRAL_API_KEY",baseUrl:"https://api.mistral.ai/v1",model:"mistral-large-latest",protocol:"openai-chat"}}),Uc=Object.freeze({"anthropic-oauth":{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-20250514",protocol:"anthropic-messages"},"openai-codex":{key:"OPENAI_API_KEY",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.4",protocol:"responses"},"xai-oauth":{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest",protocol:"responses"}});function Dc(e,t){let r=Number(e);return Number.isSafeInteger(r)&&r>0?r:t}function Fc(e,t){let r=String(e.ORACLE_PROVIDER||t.provider||"").trim().toLowerCase();if(r)return r;if(e.ORACLE_BASE_URL||t.baseUrl)return"custom";for(let[n,o]of Object.entries(bo))if(e[o.key]||o.alternateKey&&e[o.alternateKey])return n;return null}function Bc(e=process.env,t={},r=()=>!1,n=()=>""){let o=Fc(e,t);if(!o)return null;let s;try{s=tt(o,{required:!0})}catch{return null}let i=Uc[s],a=bo[s]||i,u=String(e.ORACLE_API_KEY_ENV||t.apiKeyEnv||""),l=String(e.ORACLE_API_KEY||u&&e[u]||a&&(e[a.key]||a.alternateKey&&e[a.alternateKey])||n(s)||""),c=String(i?i.baseUrl:s==="custom"?e.ORACLE_BASE_URL||t.baseUrl||"":a?.baseUrl||""),p,f;try{p=s==="custom"?nt(c):c.replace(/\/+$/,""),f=rt(e.ORACLE_MODEL||t.model||a?.model,{required:!0})}catch{return null}if(!p)return null;let d=!!(i&&r(s));return i&&!d||!i&&!l?null:{kind:"standalone",provider:s,model:f,baseUrl:p,...d?{authType:"oauth",protocol:i.protocol}:{apiKey:l},...!d&&a?.protocol?{protocol:a.protocol}:{},contextLength:Dc(e.ORACLE_CONTEXT_LENGTH||t.contextLength,128e3),reasoningEffort:String(e.ORACLE_REASONING_EFFORT||t.reasoningEffort||"high")}}function Pe(e=""){return["Oracle runs its own native chat \u2014 no Hermes or external agent required.","Run `oracle setup model` to choose OAuth or an API-key provider, or configure a custom OpenAI-compatible endpoint.","`oracle harness detect` finds any Agent Plugins-compatible clients installed on this machine.",e].filter(Boolean).join(`
23
- `)}function zc(e=process.env,t={}){if(e.ORACLE_PUBLIC_DESKTOP==="1"||e.ORACLE_REMOTE_COMPUTE_DISABLE==="1")return null;let r=String(e.ORACLE_CHAT_BACKEND||t.backend||"auto").trim().toLowerCase(),n=String(e.ORACLE_COMPUTE_HOST||t.computeHost||"").trim();if(!["remote","arch"].includes(r)&&!e.ORACLE_COMPUTE_HOST||!n)return null;let o=String(e.ORACLE_COMPUTE_USER||t.computeUser||"").trim(),s=String(e.ORACLE_COMPUTE_PATH||t.computePath||"$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin").trim();return{kind:"remote",host:n,user:o,path:s}}var Hc=Object.freeze([{name:"oracle",bin:"oracle",label:"Oracle Native (default)",kind:"oracle"},{name:"hermes",bin:"hermes",label:"Hermes Agent",kind:"hermes"},{name:"opencode",bin:"opencode",label:"OpenCode",kind:"mcp"},{name:"claude",bin:"claude",label:"Claude Code",kind:"mcp"},{name:"codex",bin:"codex",label:"OpenAI Codex CLI",kind:"mcp"},{name:"cursor",bin:"cursor",label:"Cursor IDE",kind:"mcp"},{name:"windsurf",bin:"windsurf",label:"Windsurf",kind:"mcp"},{name:"aider",bin:"aider",label:"Aider",kind:"mcp"},{name:"continue",bin:"continue",label:"Continue",kind:"mcp"}]);function qc(e){for(let t of(process.env.PATH||"").split(xo.delimiter)){let r=xo.join(t,e);try{if(Mc.existsSync(r))return r}catch{}}return null}function _o({env:e=process.env,hermes:t={ok:!1},storedConfig:r=null,oauthAvailable:n=()=>!1,apiKeyResolver:o=()=>""}={}){let s=String(e.ORACLE_CHAT_BACKEND||r?.backend||"auto").trim().toLowerCase(),i=zc(e,r||{});if(s==="remote"||s==="arch")return i?{kind:"remote",config:i}:{kind:"unconfigured",reason:Pe(`${s} compute backend was requested, but no compute host is configured.`)};let a=Bc(e,r||{},n,o);if(s==="standalone")return a?{kind:"standalone",config:a}:{kind:"unconfigured",reason:Pe("ORACLE_CHAT_BACKEND=standalone was requested, but no standalone model is configured.")};if(s==="hermes")return t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:Pe("ORACLE_CHAT_BACKEND=hermes was requested, but Hermes was not found.")};if(s!=="auto"){for(let u of Hc)if(u.name===s){let l=qc(u.bin);return l?{kind:"harness",harness:{...u,path:l}}:{kind:"unconfigured",reason:Pe(`ORACLE_CHAT_BACKEND=${s} was requested, but ${u.bin} was not found on PATH.`)}}return{kind:"unconfigured",reason:Pe(`Unknown ORACLE_CHAT_BACKEND value: ${s}`)}}return i?{kind:"remote",config:i}:a?{kind:"standalone",config:a}:t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:Pe()}}be();import Ln from"node:fs";import Le from"node:path";import{randomUUID as aa}from"node:crypto";import{EventEmitter as bp}from"node:events";import{spawnSync as _p}from"node:child_process";import{existsSync as So,readFileSync as Kc}from"node:fs";import{dirname as wo,join as gr}from"node:path";import{fileURLToPath as Gc}from"node:url";function Wc(e){let t=wo(Gc(e));for(let r=0;r<8;r+=1){let n=gr(t,"package.json");if(So(n))try{let s=JSON.parse(Kc(n,"utf8"));if(s&&typeof s.version=="string")return t}catch{}let o=wo(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function je(e,t){let r=Wc(t),n=gr(r,"dist","assets",e);return So(n)?n:gr(r,e)}import st from"node:fs";import _e from"node:path";import{homedir as Xc}from"node:os";var br=process.env.ORACLE_CONFIG_DIR||_e.join(Xc(),".config","oracle"),xr=2200,ko=/^[a-z0-9][a-z0-9-]*$/,Eo="oracle";function Vc(e,t=br){let r=typeof e=="string"?e.trim():"";if(!r||r===Eo||!ko.test(r))return _e.join(t,"memory.json");let n=_e.join(t,`memory.${r}.json`),o=_e.relative(t,n);return!o||o.startsWith("..")||_e.isAbsolute(o)?_e.join(t,"memory.json"):n}function Ao(){return Vc(process.env.ORACLE_ACTIVE_AGENT)}function vo(e){st.existsSync(e)||st.mkdirSync(e,{recursive:!0})}function _r(){vo(br);try{let e=st.readFileSync(Ao(),"utf8");return JSON.parse(e)}catch{return{version:1,updatedAt:new Date().toISOString(),entries:Yc()}}}function Yc(e=process.env.ORACLE_ACTIVE_AGENT){let t=typeof e=="string"?e.trim():"";if(!t||t===Eo||!ko.test(t))return[];try{let r=_e.join(je("profiles",import.meta.url),t,"memory.json"),n=JSON.parse(st.readFileSync(r,"utf8"));return Array.isArray(n?.entries)?n.entries.filter(o=>o&&typeof o.key=="string"&&typeof o.content=="string").map(o=>({key:o.key,content:o.content,addedAt:null,seeded:!0})):[]}catch{return[]}}function Oo(e){vo(br),e.updatedAt=new Date().toISOString(),st.writeFileSync(Ao(),JSON.stringify(e,null,2),{mode:384})}function To(e,t){let r=_r(),n=r.entries.findIndex(o=>o.key===e);for(n>=0?r.entries[n]={key:e,content:t,addedAt:new Date().toISOString()}:r.entries.push({key:e,content:t,addedAt:new Date().toISOString()});JSON.stringify(r.entries).length>xr&&r.entries.length>1;)r.entries.shift();Oo(r)}function Lo(e){let t=_r(),r=t.entries.length;return t.entries=t.entries.filter(n=>n.key!==e),t.entries.length<r?(Oo(t),{ok:!0}):{ok:!1}}function Co(){let e=_r();if(e.entries.length===0)return"";let t=JSON.stringify(e.entries).length,r=Math.round(t/xr*100),n=e.entries.map(o=>`${o.key}: ${o.content}`);return["\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",`MEMORY [${r}% \u2014 ${t}/${xr} chars]`,"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",...n].join(`
22
+ `)}),await p.start(),new Promise(f=>{let d=!1,m=async()=>{d||(d=!0,await p.stop(),f({native:!0,code:0}))};p.on("stop",()=>{d||(d=!0,f({native:!0,code:0}))}),process.once("SIGINT",m),process.once("SIGTERM",m)})}import Mc from"node:fs";import xo from"node:path";var bo=Object.freeze({openrouter:{key:"OPENROUTER_API_KEY",baseUrl:"https://openrouter.ai/api/v1",model:"openrouter/auto"},openai:{key:"OPENAI_API_KEY",baseUrl:"https://api.openai.com/v1",model:"gpt-4.1-mini"},anthropic:{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},xai:{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4.5"},deepseek:{key:"DEEPSEEK_API_KEY",baseUrl:"https://api.deepseek.com/v1",model:"deepseek-chat"},gemini:{key:"GEMINI_API_KEY",alternateKey:"GOOGLE_API_KEY",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",model:"gemini-2.5-flash"},kimi:{key:"MOONSHOT_API_KEY",alternateKey:"KIMI_API_KEY",baseUrl:"https://api.moonshot.ai/v1",model:"kimi-k3",protocol:"openai-chat"},mistral:{key:"MISTRAL_API_KEY",baseUrl:"https://api.mistral.ai/v1",model:"mistral-large-latest",protocol:"openai-chat"}}),Uc=Object.freeze({"anthropic-oauth":{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-20250514",protocol:"anthropic-messages"},"openai-codex":{key:"OPENAI_API_KEY",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.4",protocol:"responses"},"xai-oauth":{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest",protocol:"responses"}});function Dc(e,t){let r=Number(e);return Number.isSafeInteger(r)&&r>0?r:t}function Fc(e,t){let r=String(e.ORACLE_PROVIDER||t.provider||"").trim().toLowerCase();if(r)return r;if(e.ORACLE_BASE_URL||t.baseUrl)return"custom";for(let[n,o]of Object.entries(bo))if(e[o.key]||o.alternateKey&&e[o.alternateKey])return n;return null}function Bc(e=process.env,t={},r=()=>!1,n=()=>""){let o=Fc(e,t);if(!o)return null;let s;try{s=tt(o,{required:!0})}catch{return null}let i=Uc[s],a=bo[s]||i,u=String(e.ORACLE_API_KEY_ENV||t.apiKeyEnv||""),l=String(e.ORACLE_API_KEY||u&&e[u]||a&&(e[a.key]||a.alternateKey&&e[a.alternateKey])||n(s)||""),c=String(i?i.baseUrl:s==="custom"?e.ORACLE_BASE_URL||t.baseUrl||"":a?.baseUrl||""),p,f;try{p=s==="custom"?nt(c):c.replace(/\/+$/,""),f=rt(e.ORACLE_MODEL||t.model||a?.model,{required:!0})}catch{return null}if(!p)return null;let d=!!(i&&r(s));return i&&!d||!i&&!l?null:{kind:"standalone",provider:s,model:f,baseUrl:p,...d?{authType:"oauth",protocol:i.protocol}:{apiKey:l},...!d&&a?.protocol?{protocol:a.protocol}:{},contextLength:Dc(e.ORACLE_CONTEXT_LENGTH||t.contextLength,128e3),reasoningEffort:String(e.ORACLE_REASONING_EFFORT||t.reasoningEffort||"high")}}function Pe(e=""){return["Oracle runs its own native chat \u2014 no Hermes or external agent required.","Run `oracle setup model` to choose OAuth or an API-key provider, or configure a custom OpenAI-compatible endpoint.","`oracle harness detect` finds installed clients for optional inbound MCP wiring.","Hermes is never auto-selected. Opt in only with `ORACLE_CHAT_BACKEND=hermes` after detection.",e].filter(Boolean).join(`
23
+ `)}function zc(e=process.env,t={}){if(e.ORACLE_PUBLIC_DESKTOP==="1"||e.ORACLE_REMOTE_COMPUTE_DISABLE==="1")return null;let r=String(e.ORACLE_CHAT_BACKEND||t.backend||"auto").trim().toLowerCase(),n=String(e.ORACLE_COMPUTE_HOST||t.computeHost||"").trim();if(!["remote","arch"].includes(r)&&!e.ORACLE_COMPUTE_HOST||!n)return null;let o=String(e.ORACLE_COMPUTE_USER||t.computeUser||"").trim(),s=String(e.ORACLE_COMPUTE_PATH||t.computePath||"$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin").trim();return{kind:"remote",host:n,user:o,path:s}}var Hc=Object.freeze([{name:"oracle",bin:"oracle",label:"Oracle Native (default)",kind:"oracle"},{name:"hermes",bin:"hermes",label:"Hermes Agent",kind:"hermes"},{name:"opencode",bin:"opencode",label:"OpenCode",kind:"mcp"},{name:"claude",bin:"claude",label:"Claude Code",kind:"mcp"},{name:"codex",bin:"codex",label:"OpenAI Codex CLI",kind:"mcp"},{name:"cursor",bin:"cursor",label:"Cursor IDE",kind:"mcp"},{name:"windsurf",bin:"windsurf",label:"Windsurf",kind:"mcp"},{name:"aider",bin:"aider",label:"Aider",kind:"mcp"},{name:"continue",bin:"continue",label:"Continue",kind:"mcp"}]);function qc(e){for(let t of(process.env.PATH||"").split(xo.delimiter)){let r=xo.join(t,e);try{if(Mc.existsSync(r))return r}catch{}}return null}function _o({env:e=process.env,hermes:t={ok:!1},storedConfig:r=null,oauthAvailable:n=()=>!1,apiKeyResolver:o=()=>""}={}){let s=String(e.ORACLE_CHAT_BACKEND||r?.backend||"auto").trim().toLowerCase(),i=zc(e,r||{});if(s==="remote"||s==="arch")return i?{kind:"remote",config:i}:{kind:"unconfigured",reason:Pe(`${s} compute backend was requested, but no compute host is configured.`)};let a=Bc(e,r||{},n,o);if(s==="standalone")return a?{kind:"standalone",config:a}:{kind:"unconfigured",reason:Pe("ORACLE_CHAT_BACKEND=standalone was requested, but no standalone model is configured.")};if(s==="hermes")return t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:Pe("ORACLE_CHAT_BACKEND=hermes was requested, but Hermes was not found.")};if(s!=="auto"){for(let u of Hc)if(u.name===s){let l=qc(u.bin);return l?{kind:"harness",harness:{...u,path:l}}:{kind:"unconfigured",reason:Pe(`ORACLE_CHAT_BACKEND=${s} was requested, but ${u.bin} was not found on PATH.`)}}return{kind:"unconfigured",reason:Pe(`Unknown ORACLE_CHAT_BACKEND value: ${s}`)}}return i?{kind:"remote",config:i}:a?{kind:"standalone",config:a}:{kind:"unconfigured",reason:Pe()}}be();import Ln from"node:fs";import Le from"node:path";import{randomUUID as aa}from"node:crypto";import{EventEmitter as bp}from"node:events";import{spawnSync as _p}from"node:child_process";import{existsSync as So,readFileSync as Kc}from"node:fs";import{dirname as wo,join as gr}from"node:path";import{fileURLToPath as Gc}from"node:url";function Wc(e){let t=wo(Gc(e));for(let r=0;r<8;r+=1){let n=gr(t,"package.json");if(So(n))try{let s=JSON.parse(Kc(n,"utf8"));if(s&&typeof s.version=="string")return t}catch{}let o=wo(t);if(o===t)break;t=o}throw new Error(`oracle: could not resolve package root from ${e}`)}function je(e,t){let r=Wc(t),n=gr(r,"dist","assets",e);return So(n)?n:gr(r,e)}import st from"node:fs";import _e from"node:path";import{homedir as Xc}from"node:os";var br=process.env.ORACLE_CONFIG_DIR||_e.join(Xc(),".config","oracle"),xr=2200,ko=/^[a-z0-9][a-z0-9-]*$/,Eo="oracle";function Vc(e,t=br){let r=typeof e=="string"?e.trim():"";if(!r||r===Eo||!ko.test(r))return _e.join(t,"memory.json");let n=_e.join(t,`memory.${r}.json`),o=_e.relative(t,n);return!o||o.startsWith("..")||_e.isAbsolute(o)?_e.join(t,"memory.json"):n}function Ao(){return Vc(process.env.ORACLE_ACTIVE_AGENT)}function vo(e){st.existsSync(e)||st.mkdirSync(e,{recursive:!0})}function _r(){vo(br);try{let e=st.readFileSync(Ao(),"utf8");return JSON.parse(e)}catch{return{version:1,updatedAt:new Date().toISOString(),entries:Yc()}}}function Yc(e=process.env.ORACLE_ACTIVE_AGENT){let t=typeof e=="string"?e.trim():"";if(!t||t===Eo||!ko.test(t))return[];try{let r=_e.join(je("profiles",import.meta.url),t,"memory.json"),n=JSON.parse(st.readFileSync(r,"utf8"));return Array.isArray(n?.entries)?n.entries.filter(o=>o&&typeof o.key=="string"&&typeof o.content=="string").map(o=>({key:o.key,content:o.content,addedAt:null,seeded:!0})):[]}catch{return[]}}function Oo(e){vo(br),e.updatedAt=new Date().toISOString(),st.writeFileSync(Ao(),JSON.stringify(e,null,2),{mode:384})}function To(e,t){let r=_r(),n=r.entries.findIndex(o=>o.key===e);for(n>=0?r.entries[n]={key:e,content:t,addedAt:new Date().toISOString()}:r.entries.push({key:e,content:t,addedAt:new Date().toISOString()});JSON.stringify(r.entries).length>xr&&r.entries.length>1;)r.entries.shift();Oo(r)}function Lo(e){let t=_r(),r=t.entries.length;return t.entries=t.entries.filter(n=>n.key!==e),t.entries.length<r?(Oo(t),{ok:!0}):{ok:!1}}function Co(){let e=_r();if(e.entries.length===0)return"";let t=JSON.stringify(e.entries).length,r=Math.round(t/xr*100),n=e.entries.map(o=>`${o.key}: ${o.content}`);return["\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",`MEMORY [${r}% \u2014 ${t}/${xr} chars]`,"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",...n].join(`
24
24
  `)}var Ro=[{type:"function",function:{name:"memory_add",description:"Save a durable fact to memory for future sessions.",parameters:{type:"object",properties:{key:{type:"string",description:"Short unique key"},content:{type:"string",description:"The fact to remember"}},required:["key","content"],additionalProperties:!1}}},{type:"function",function:{name:"memory_remove",description:"Remove a memory entry by key.",parameters:{type:"object",properties:{key:{type:"string",description:"The key to remove"}},required:["key"],additionalProperties:!1}}}];import U from"node:fs";import de from"node:path";import{homedir as yl}from"node:os";import Me from"node:fs";import No from"node:path";import{homedir as nl}from"node:os";import Q from"node:fs";import fe from"node:path";var wr="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",Jc=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function it(e){try{let t=Q.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function Zc(){return Q.constants.O_NOFOLLOW||0}function Sr(e){try{let t=Q.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function Io(e){if(!Sr(e))return null;let t=Q.openSync(e,Q.constants.O_RDONLY|Zc());try{return Q.readFileSync(t,"utf8")}finally{Q.closeSync(t)}}function Qc(e){let t=[],r=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:r};e.$schema!==wr&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${wr})`):t.push("$schema is required \u2014 must be "+wr)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):Jc.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&r.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&r.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&r.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||r.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&r.push("license must be a string");let n=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let o of Object.keys(e))n.has(o)||r.push(`unknown field "${o}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:r}}function el(e){let t=fe.join(e,"skills"),r=[];if(!it(t))return r;function n(o,s=""){for(let i of Q.readdirSync(o,{withFileTypes:!0})){let a=fe.join(o,i.name);if(i.isDirectory()){if(!it(a))continue;n(a,s?`${s}/${i.name}`:i.name)}else if(i.name.endsWith(".md")){if(!Sr(a))continue;let u=s?`${s}/${i.name.replace(/\.md$/,"")}`:i.name.replace(/\.md$/,"");r.push({name:u,path:a,relativePath:fe.relative(t,a)})}}}return n(t),r}function tl(e){let t=fe.join(e,"mcp"),r=[];if(!it(t))return r;for(let n of Q.readdirSync(t,{withFileTypes:!0})){if(!n.isFile()||!n.name.endsWith(".json"))continue;let o=fe.join(t,n.name);if(Sr(o))try{let s=Io(o);if(s===null)continue;let i=JSON.parse(s);r.push({name:n.name.replace(/\.json$/,""),path:o,config:i})}catch(s){r.push({name:n.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${s.message}`})}}return r}function rl(e){let t=fe.resolve(e);if(!it(t))return{ok:!1,error:`plugin directory not found: ${t}`};let r=fe.join(t,"plugin.json");if(!Q.existsSync(r))return{ok:!1,error:`missing plugin.json in ${t}`};let n;try{let a=Io(r);if(a===null)return{ok:!1,error:`plugin.json must be a regular file in ${t}`};n=JSON.parse(a)}catch(a){return{ok:!1,error:`invalid plugin.json: ${a.message}`}}let o=Qc(n);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let s=el(t),i=tl(t);return{ok:!0,plugin:{name:n.name,version:n.version||"0.0.0",description:n.description||"",author:n.author||{},license:n.license||"UNLICENSED",root:t,manifest:n,skills:s,mcpServers:i,warnings:[...o.warnings]}}}function $o(e){let t=[];if(!it(e))return t;for(let r of Q.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let n=fe.join(e,r.name),o=rl(n);o.ok&&t.push(o.plugin)}return t}var ol=/^[a-z0-9][a-z0-9_-]{0,63}$/,sl=/^[a-z0-9][a-z0-9-]*$/,il=128,al=16,cl=64*1024;function ll(e=process.env){return e&&e.ORACLE_CONFIG_DIR||No.join(nl(),".config","oracle")}function ul(e=process.env){return No.join(ll(e),"plugins")}function fl(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),n=String(t||"").toLowerCase().replace(/\.md$/i,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,64);return ol.test(o)?o:null}function dl(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24),n=String(t||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,16);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,40);return sl.test(o)?o:null}function pl(e,t){let r=String(t||"").match(/^description:\s*(.+)$/m);return r?r[1].trim().slice(0,200):(String(t||"").split(`
25
25
  `)[0].replace(/^#+\s*/,"").trim()||e).slice(0,200)}function ml(e){try{let t=Me.lstatSync(e);if(t.isSymbolicLink()||!t.isFile()||t.size>cl)return null;let r=Me.openSync(e,Me.constants.O_RDONLY|(Me.constants.O_NOFOLLOW||0));try{return Me.readFileSync(r,"utf8")}finally{Me.closeSync(r)}}catch{return null}}function hl(e,t,r){if(!r||typeof r!="object"||Array.isArray(r)||r.error)return null;let n=dl(e,t);if(!n)return null;let o=typeof r.command=="string"?r.command.trim():"";if(!o)return null;let s=Array.isArray(r.args)?r.args.filter(a=>typeof a=="string"):[],i=r.env&&typeof r.env=="object"&&!Array.isArray(r.env)?Object.fromEntries(Object.entries(r.env).filter(([a,u])=>typeof a=="string"&&typeof u=="string")):{};return{name:n,command:o,args:s,env:i,enabled:r.enabled!==!1,source:`plugin:${e}`}}function Ue(e={}){let t=e.env||process.env,r=e.pluginsDir||ul(t),n=e.scan||$o,o=[];try{o=n(r)||[]}catch{return{pluginsDir:r,plugins:[],skills:[],mcpServers:[]}}let s=[],i=[],a=new Set,u=new Set,l=[];for(let c of o){if(!c||typeof c!="object")continue;let p=typeof c.name=="string"?c.name:"";if(!p)continue;l.push({name:p,version:c.version||"0.0.0",root:c.root,skillCount:0,mcpCount:0});let f=l[l.length-1];for(let d of c.skills||[]){if(s.length>=il)break;let m=fl(p,d?.name||d?.relativePath);if(!m||a.has(m))continue;let y=typeof d.content=="string"?d.content:ml(d?.path);y!=null&&(a.add(m),f.skillCount+=1,s.push({name:m,description:pl(m,y),path:d.path,size:y.length,content:y,source:`plugin:${p}`,plugin:p}))}for(let d of c.mcpServers||[]){if(i.length>=al)break;if(d?.error)continue;let m=hl(p,d?.name,d?.config||d);!m||u.has(m.name)||(u.add(m.name),f.mcpCount+=1,i.push(m))}}return{pluginsDir:r,plugins:l,skills:s,mcpServers:i}}var at=je("skills",import.meta.url),kr=/^[a-z0-9][a-z0-9_-]{0,63}$/;function gl(){return process.env.ORACLE_CONFIG_DIR||de.join(yl(),".config","oracle")}function De(){return de.join(gl(),"skills")}function Er(e){U.existsSync(e)||U.mkdirSync(e,{recursive:!0,mode:448});let t=U.lstatSync(e);if(t.isSymbolicLink()||!t.isDirectory())throw new Error("skills directory must be a real directory")}function Po(){return U.constants.O_NOFOLLOW||0}function Tt(e){let t=U.lstatSync(e);if(t.isSymbolicLink()||!t.isFile())return null;let r=U.openSync(e,U.constants.O_RDONLY|Po());try{return U.readFileSync(r,"utf8")}finally{U.closeSync(r)}}function xl(e,t){if(U.existsSync(e)){let n=U.lstatSync(e);if(n.isSymbolicLink()||!n.isFile())throw new Error("skill path must be a regular file")}let r=U.openSync(e,U.constants.O_WRONLY|U.constants.O_CREAT|U.constants.O_TRUNC|Po(),384);try{U.writeFileSync(r,t)}finally{U.closeSync(r)}try{U.chmodSync(e,384)}catch{}}function jo(e){let t=String(e??"").trim();if(!kr.test(t))throw new Error("invalid skill name");return de.join(De(),`${t}.md`)}function Mo(e,t){let r=t.match(/^description:\s*(.+)$/m);return r?r[1].trim():t.split(`
26
26
  `)[0].replace(/^#+\s*/,"").trim()||e}function bl(){let e=[];for(let t of U.readdirSync(at,{withFileTypes:!0})){let r,n;if(t.isFile()&&t.name.endsWith(".md"))r=t.name.replace(/\.md$/,""),n=de.join(at,t.name);else if(t.isDirectory()&&kr.test(t.name))r=t.name,n=de.join(at,t.name,"SKILL.md");else continue;if(!kr.test(r)||!U.existsSync(n))continue;let o=Tt(n);o!==null&&e.push({name:r,description:Mo(r,o),path:n,size:o.length})}return e}function Uo(){try{return(Ue().skills||[]).map(t=>({name:t.name,description:t.description,path:t.path,size:t.size,source:t.source,content:t.content}))}catch{return[]}}function ct(){try{Er(De());let e=new Map(bl().map(t=>[t.name,t]));for(let t of Uo())e.has(t.name)||e.set(t.name,t);for(let t of U.readdirSync(De(),{withFileTypes:!0})){if(!t.isFile()||!t.name.endsWith(".md"))continue;let r=de.join(De(),t.name),n=Tt(r);if(n===null)continue;let o=t.name.replace(/\.md$/,"");e.set(o,{name:o,description:Mo(o,n),path:r,size:n.length})}return[...e.values()].sort((t,r)=>t.name.localeCompare(r.name))}catch{return[]}}function Ar(e){try{Er(De());let t=jo(e);if(U.existsSync(t))return Tt(t);for(let r of Uo())if(r.name===e&&typeof r.content=="string")return r.content;for(let r of[de.join(at,e,"SKILL.md"),de.join(at,`${e}.md`)]){if(!U.existsSync(r))continue;let n=Tt(r);if(n!==null)return n}return null}catch{return null}}function Do(e){let t=ct();if(t.length===0)return`## Skills
@@ -1,4 +1,4 @@
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)+`
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 D(){return l.join(_(),"desk.json")}function w(){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=w();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=D();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 S="0.12.1",te=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${S}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${S}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function I(){return f.join(_(),"runtime")}function H(){return f.join(I(),"venv")}function N(t){let o=process.platform==="win32"?"Scripts":"bin",e=process.platform==="win32"?`${t}.exe`:t;return f.join(H(),o,e)}function M(){return N("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 O(){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 L(){let[t,o]=process.versions.node.split(".").map(Number);return t>20||t===20&&o>=19}function K(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 F(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,y,U,b=null)=>{e.push({id:a,status:y,detail:U,fix:b}),y==="fail"&&(s=!0)};r("node",L()?"ok":"fail",`node ${process.versions.node}`,L()?null:"install node >= 20.19");let n=t.paths.oracleExecEnvPath(),i=K(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 F(p),A=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}${A?` (${A})`:""}`:`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=O();r("hermes_opt_in","ok",d.ok?`detected ${d.bin} (${d.source}) \u2014 unused unless ORACLE_CHAT_BACKEND=hermes`:"not detected \u2014 native-only OK",d.ok?"detection only; opt in with ORACLE_CHAT_BACKEND=hermes or oracle harness detect":null);let R=V.join(t.paths.hermesRoot(),"profiles"),h=0;m.existsSync(R)&&(h=m.readdirSync(R,{withFileTypes:!0}).filter(a=>a.isDirectory()).length),r("hermes_lanes","ok",h>0?`${h} profile dir(s) (optional Hermes opt-in surface)`:"no Hermes lane profiles (native-only OK)",(h>0,null));let k={ok:!s,checks:e};if(o)process.stdout.write(JSON.stringify(k,null,2)+`
2
2
  `);else for(let a of e)process.stdout.write(`${a.status.toUpperCase().padEnd(4)} ${a.id}: ${a.detail}
3
3
  `),a.fix&&process.stdout.write(` fix: ${a.fix}
4
4
  `);return s?1:0}};export{ce as default};