@oracle-agent/oracle 0.22.15 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -267,7 +267,7 @@ Connection: close\r
267
267
  `)){let[i,a]=s.trim().split(/\s+/).map(Number);!i||!a||(r.has(a)||r.set(a,[]),r.get(a).push(i))}let n=[],o=s=>{for(let i of r.get(s)||[])o(i),n.push(i)};return o(e),[...n,e].map(s=>({pid:s,startTime:Ot(s)}))}function Gd(e,t){for(let r of e||[])if(!(!r.startTime||Ot(r.pid)!==r.startTime))try{process.kill(r.pid,t)}catch{}}function Tt(e,t="SIGTERM",r=!1){if(e){if(!r){try{e.kill(t)}catch{}return}if(process.platform==="win32"){try{st("taskkill",["/PID",String(e.pid),"/T",...t==="SIGKILL"?["/F"]:[]],{stdio:"ignore",windowsHide:!0})}catch{}ar(e,"cancel");return}if(!e._oracleKillTargets){if(!e._oracleStartTime||Ot(e.pid)!==e._oracleStartTime){ar(e,"cancel");return}e._oracleKillTargets=lr(e.pid)}if(ar(e,"cancel"),e._oracleProcessGroup&&Ot(e.pid)===e._oracleStartTime)try{process.kill(-e.pid,t)}catch{}Gd(e._oracleKillTargets,t)}}var wy=Object.freeze({spawn:Nn,kill:Tt});function zi(e,t){return!e||e.exitCode!=null||e.signalCode!=null?Promise.resolve(!0):new Promise(r=>{let n=!1,o=a=>{n||(n=!0,clearTimeout(i),e.removeListener?.("exit",s),e.removeListener?.("close",s),r(a))},s=()=>o(!0),i=setTimeout(()=>o(!1),t);e.once?.("exit",s),e.once?.("close",s)})}async function ae(e){let t=F.get(e);if(t){if(t.stopPromise)return t.stopPromise;t.stopPromise=(async()=>{t.idleTimer&&clearTimeout(t.idleTimer),t.proxyRelay?.close?.(),je(t.proxy);let r=zi(t.child,1e3);if(Tt(t.child,"SIGTERM",t.owned),!await r){let n=zi(t.child,3e3);if(Tt(t.child,"SIGKILL",t.owned),!await n)throw Object.assign(new Error("managed Chromium process tree did not reap"),{code:"EREAP"})}F.get(e)===t&&F.delete(e)})();try{await t.stopPromise}catch(r){throw F.get(e)===t&&(t.stopPromise=null),r}}}function Rn(e){let t=F.get(e);if(t){if(t.idleTimer&&clearTimeout(t.idleTimer),t.activeRuns>0){t.idleTimer=null;return}t.idleTimer=setTimeout(()=>{ae(e).catch(()=>{})},t.idleTimeoutMs||Yi),typeof t.idleTimer.unref=="function"&&t.idleTimer.unref()}}function Wd(){for(let e of ot.values())e.controller.abort();for(let e of[...F.keys()])ae(e).catch(()=>{})}async function ea(e){let t=[];for(let n of ot.values())n.ownerTaskId===e&&(n.controller.abort(),t.push(n.promise));await Promise.allSettled(t);let r=[];for(let[n,o]of F.entries())o.ownerTaskId===e&&r.push(ae(n));await Promise.all(r)}function Vd(e){let t=F.get(e);t&&(t.activeRuns=(t.activeRuns||0)+1,t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=null)}function Xd(e){let t=F.get(e);t&&(t.activeRuns=Math.max(0,(t.activeRuns||0)-1),Rn(e))}function ce(){return{ok:!1,error:"managed Chromium launch aborted"}}async function ta(e,t){if(t?.aborted)throw Object.assign(new Error("aborted"),{code:"ABORT_ERR"});await new Promise((r,n)=>{let o=!1,s=l=>{o||(o=!0,t?.removeEventListener("abort",a),l())},i=setTimeout(()=>s(r),e),a=()=>{clearTimeout(i),s(()=>n(Object.assign(new Error("aborted"),{code:"ABORT_ERR"})))};t?.addEventListener("abort",a,{once:!0}),i.unref?.()})}async function Yd(e,t,r,n){if(r.readDevToolsEndpointFn)return r.readDevToolsEndpointFn(e,t,n);let o=$.join(e,"DevToolsActivePort"),s=Date.now()+(Number(r.launchTimeoutMs)||15e3);for(;Date.now()<s;){if(n?.aborted||t.exitCode!=null||t.signalCode!=null||t.killed)return null;try{let[i,a]=M.readFileSync(o,"utf8").trim().split(/\r?\n/),l=Number(i);if(Number.isInteger(l)&&l>0&&l<=65535&&/^\/devtools\/browser\/[A-Za-z0-9-]+$/.test(a||""))return{port:l,wsPath:a}}catch{}try{await ta(50,n)}catch{return null}}return null}function qi(e,t){if(!e?.pid||process.platform!=="linux")return!0;try{let r=M.readFileSync(`/proc/${e.pid}/cmdline`,"utf8").split("\0");return lr(e.pid).some(({pid:o})=>{try{let s=M.readFileSync(`/proc/${o}/cmdline`,"utf8").split("\0");return s.includes("--remote-debugging-port=9224")&&s.includes(`--user-data-dir=${t}`)}catch{return!1}})}catch{return!1}}function Jd(e,t){if(!e?.pid||!Number.isInteger(t))return!1;if(process.platform==="linux")try{let r=t.toString(16).toUpperCase().padStart(4,"0"),n=new Set;for(let o of["/proc/net/tcp","/proc/net/tcp6"])for(let s of M.readFileSync(o,"utf8").split(`
268
268
  `).slice(1)){let i=s.trim().split(/\s+/);if(i.length<10||i[3]!=="0A")continue;let[a,l]=String(i[1]||"").split(":");(a==="0100007F"||a==="00000000000000000000000001000000")&&l===r&&n.add(i[9])}if(!n.size)return!1;for(let o of lr(e.pid)){let s=[];try{s=M.readdirSync(`/proc/${o.pid}/fd`)}catch{continue}for(let i of s)try{let a=M.readlinkSync(`/proc/${o.pid}/fd/${i}`),l=/^socket:\[(\d+)\]$/.exec(a);if(l&&n.has(l[1]))return!0}catch{}}return!1}catch{return!1}if(process.platform==="darwin"){let r=st("lsof",["-nP","-a","-p",String(e.pid),`-iTCP:${t}`,"-sTCP:LISTEN","-t"],{encoding:"utf8",timeout:2e3});return r.status===0&&String(r.stdout||"").trim().split(/\s+/).includes(String(e.pid))}if(process.platform==="win32"){let r=st("netstat.exe",["-ano","-p","tcp"],{encoding:"utf8",timeout:2e3,windowsHide:!0});return String(r.stdout||"").split(`
269
269
  `).some(n=>{let o=n.trim().split(/\s+/);return o[0]==="TCP"&&o[1]?.endsWith(`:${t}`)&&o[3]==="LISTENING"&&o[4]===String(e.pid)})}return!1}function Zd(e,t){if(process.platform!=="linux"||!e?.pid||!t)return!1;try{let r=lr(e.pid),n=`/sandbox/runtime/${$.basename(t)}`,o=new Set;for(let s of r){let i;try{i=M.readFileSync(`/proc/${s.pid}/net/unix`,"utf8")}catch{continue}for(let a of i.split(`
270
- `)){let l=a.trim().split(/\s+/),u=l.at(-1);if(u!==t&&u!==n)continue;let c=l[6];/^\d+$/.test(c||"")&&o.add(c)}}if(!o.size)return!1;for(let s of r){let i=[];try{i=M.readdirSync(`/proc/${s.pid}/fd`)}catch{continue}for(let a of i)try{let l=/^socket:\[(\d+)\]$/.exec(M.readlinkSync(`/proc/${s.pid}/fd/${a}`));if(l&&o.has(l[1]))return!0}catch{}}}catch{}return!1}function Qd(e,t,r){return new Promise((n,o)=>{let s=vn.request({socketPath:e,path:t,method:"GET",signal:r,headers:{host:"127.0.0.1:9224"}},i=>{let a="";i.setEncoding("utf8"),i.on("data",l=>{a.length<64e3&&(a+=l)}),i.on("end",()=>{if((i.statusCode||500)>=400)return o(new Error(`CDP returned ${i.statusCode}`));try{n(JSON.parse(a))}catch(l){o(l)}})});s.once("error",o),s.end()})}async function ep(e,t,r,n=15e3){let o=Date.now()+n;for(;Date.now()<o;){if(r?.aborted||t.exitCode!=null||t.signalCode!=null||t.killed)return null;try{if(!Zd(t,e))throw new Error("CDP socket is not owned");let s=await Qd(e,"/json/version",r);if(/^ws:\/\/(?:127\.0\.0\.1|0\.0\.0\.0|localhost):9224\/devtools\/browser\/[A-Za-z0-9-]+$/.test(s?.webSocketDebuggerUrl||""))return s}catch{}try{await ta(50,r)}catch{return null}}return null}async function tp(e,t,r={}){if(String(e.ORACLE_BROWSER_CDP_URL||"").trim())return{ok:!1,error:"ORACLE_BROWSER_CDP_URL is unsupported: Oracle must launch Chromium with its mandatory SSRF proxy"};let o=Zi(r.taskId||"default"),s=ot.get(o);if(s)return s.promise;let i=F.get(o);if(i?.child&&i.child.exitCode==null&&i.child.signalCode==null&&!i.child.killed)return Rn(o),{ok:!0,cdpUrl:i.cdpUrl,cdpSocket:i.cdpSocket,managed:!0,key:o};let a=new AbortController,l=r.ownerTaskId||r.taskId||"default",u=()=>a.abort();r.signal?.addEventListener("abort",u,{once:!0}),r.signal?.aborted&&a.abort();let c={controller:a,ownerTaskId:l,promise:null};c.promise=(async()=>{let d=String(r.executablePath||e.ORACLE_CHROMIUM_PATH||"").trim()||Ui(e);if(!d||!$.isAbsolute(d)||!cr(d))return{ok:!1,error:"Browser Use needs Chromium. Set ORACLE_CHROMIUM_PATH to an absolute executable path."};let p;try{p=await(r.startProxyFn||Kd)(r.proxyOptions)}catch{return a.signal.aborted?ce():{ok:!1,error:"mandatory Oracle browser SSRF proxy failed to start"}}if(a.signal.aborted)return je(p),ce();let f;try{f=await(r.startProxyRelayFn||((S,v)=>Ji(S,v,"proxy")))(p.url,t.BH_RUNTIME_DIR)}catch{return je(p),a.signal.aborted?ce():{ok:!1,error:"isolated Chromium proxy relay failed to start"}}if(a.signal.aborted)return f.close(),je(p),ce();let m=M.mkdtempSync($.join(t.HOME,"chromium-profile-"));M.chmodSync(m,448);let h=$.join(t.BH_RUNTIME_DIR,`chromium-cdp-${Gi(12).toString("hex")}.sock`);try{M.rmSync(h,{force:!0})}catch{}let E=["--headless=new","--remote-debugging-port=9224","--remote-debugging-address=0.0.0.0",`--user-data-dir=${m}`,"--disable-dev-shm-usage","--disable-extensions","--disable-background-networking","--disable-sync","--disable-translate","--proxy-server=http://0.0.0.0:9223","--proxy-bypass-list=<-loopback>","--mute-audio","--no-first-run","--no-default-browser-check","about:blank"],y=Ud(d,m,t,E,f.socketPath,h,e);if(!y.ok)return f.close(),je(p),y;let w=Nn(y.command,y.argv,{env:t,cwd:t.BH_AGENT_WORKSPACE,mode:"ignore",processGroup:!0,spawnFn:r.browserSpawnFn,spawnOptions:{env:t,stdio:"ignore",detached:!1,windowsHide:!0}}),b=w.child;if(!b||typeof b.once!="function")return f.close(),je(p),{ok:!1,error:"failed to create managed Chromium process"};let g={child:b,cdpUrl:null,cdpSocket:h,proxy:p,proxyRelay:f,owned:w.owned,activeRuns:0,idleTimeoutMs:Number(r.idleTimeoutMs)||Yi,ownerTaskId:l,launching:!0};F.set(o,g),Bi||(Bi=!0,process.once("exit",Wd)),b.once("exit",()=>{F.get(o)?.child===b&&ae(o).catch(()=>{})});let _=null;if(r.readDevToolsEndpointFn){let S=await Yd(m,b,r,a.signal);if(!S||a.signal.aborted||F.get(o)!==g||!qi(b,y.profileArg))return F.get(o)===g?await ae(o):(Tt(b,"SIGTERM",w.owned),f.close(),je(p)),a.signal.aborted?ce():{ok:!1,error:"managed Chromium did not expose an owned CDP endpoint"};if(!(r.verifyCdpOwnerFn||Jd)(b,S.port))return F.get(o)===g&&await ae(o),{ok:!1,error:"managed Chromium CDP listener is not owned by the launched process tree"};_=`http://127.0.0.1:${S.port}`;try{let C=await(r.fetchImpl||fetch)(`${_}/json/version`,{signal:AbortSignal.timeout(1e3)});if((C?.ok&&typeof C.json=="function"?await C.json():null)?.webSocketDebuggerUrl!==`ws://127.0.0.1:${S.port}${S.wsPath}`)throw new Error("CDP identity mismatch")}catch{return F.get(o)===g&&await ae(o),{ok:!1,error:"managed Chromium CDP identity verification failed"}}}else{if(!await ep(h,b,a.signal,Number(r.launchTimeoutMs)||15e3))return F.get(o)===g&&await ae(o),a.signal.aborted?ce():{ok:!1,error:"managed Chromium did not expose an owned private CDP socket"};if(a.signal.aborted||F.get(o)!==g)return F.get(o)===g&&await ae(o),ce();if(!qi(b,y.profileArg))return F.get(o)===g&&await ae(o),{ok:!1,error:"private CDP socket is not bound to the launched Chromium process tree"}}return a.signal.aborted||F.get(o)!==g?(F.get(o)===g&&await ae(o),ce()):(g.cdpUrl=_,g.launching=!1,Rn(o),{ok:!0,cdpUrl:_,cdpSocket:h,managed:!0,key:o})})(),ot.set(o,c);try{return await c.promise}finally{r.signal?.removeEventListener("abort",u),ot.get(o)===c&&ot.delete(o)}}function Ki(e){let t=Number(e),r=Number.isFinite(t)?Math.trunc(t):Cn;return Math.max(Rd,Math.min(Xi,r))*1e3}function rp(e,t,r={}){return new Promise(n=>{if(r.signal?.aborted){n({error:Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"})});return}let o,s=!1;try{let h=Nn(e,t,{cwd:r.cwd,env:r.env,mode:"pipe",input:r.input,spawnFn:r.spawnFn,spawnOptions:{cwd:r.cwd,env:r.env,windowsHide:!0,stdio:["pipe","pipe","pipe"]}});o=h.child,s=h.owned}catch(h){n({error:h});return}if(!o||typeof o.once!="function"){n({error:new Error("CLI spawn did not return a ChildProcess")});return}let i="",a="",l=!1,u,c,d=null,p=h=>{l||(l=!0,u&&clearTimeout(u),c&&clearTimeout(c),r.signal?.removeEventListener("abort",m),n(h))},f=h=>{d||(d=h,Tt(o,"SIGKILL",s),c=setTimeout(()=>p({error:Object.assign(new Error("browser_exec process tree did not reap"),{code:"EREAP"}),stdout:i,stderr:a}),3e3),c.unref?.())},m=()=>f(Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"}));o.stdout?.on("data",h=>{i.length<On&&(i+=String(h).slice(0,On-i.length))}),o.stderr?.on("data",h=>{a.length<Tn&&(a+=String(h).slice(0,Tn-a.length))}),o.once("error",h=>p({error:h,stdout:i,stderr:a})),o.once("close",(h,E)=>p(d?{error:d,stdout:i,stderr:a}:{status:h,signal:E,stdout:i,stderr:a})),u=setTimeout(()=>f(Object.assign(new Error("timed out"),{code:"ETIMEDOUT"})),r.timeout),u.unref?.(),r.signal?.aborted?m():r.signal?.addEventListener("abort",m,{once:!0}),o.stdin?.end(r.input)})}async function ra(e={},t={}){let r=t.env||process.env;if(!In(r))return{ok:!1,error:"browser_exec is disabled. Set ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use. Oracle runs an AST-bounded browser-helper subset, not terminal-equivalent Python."};if(t.signal?.aborted)return ce();let n=String(e.code||""),o=String(e.session||"").trim();if(o&&!Td.test(o))return{ok:!1,error:"session must be 1-64 letters, digits, dashes, or underscores"};let s=Bd(n,{env:r,python:t.python,spawnFn:t.validatorSpawnFn});if(!s.ok)return s;let i=Pd(r);if(!i.ok)return i;let a=`${t.taskId||"default"}--${o||"default"}`,l=qd(r,a);l.BU_NAME=`oracle-${Ln("sha256").update(a).digest("hex").slice(0,12)}`;let u={...t,taskId:a,ownerTaskId:t.taskId||"default",cli:i},c=t.ensureBrowserFn?await t.ensureBrowserFn(r,l,u):await tp(r,l,u);if(!c?.ok)return c||{ok:!1,error:"Browser Use backend failed to initialize"};if(t.signal?.aborted)return ce();l.BU_CDP_URL="http://0.0.0.0:9222";let d;if(c.cdpSocket)d={socketPath:c.cdpSocket,close(){}};else try{d=await(t.startCdpRelayFn||jd)(c.cdpUrl,l.BH_RUNTIME_DIR)}catch{return{ok:!1,error:"isolated CDP relay failed to start"}}if(t.signal?.aborted)return d.close(),ce();let p=Md(i,l,d.socketPath,r);if(!p.ok)return d.close(),p;c.key&&Vd(c.key);let f;try{f=await rp(p.command,p.argv,{spawnFn:t.cliSpawnFn,input:n,timeout:Ki(e.timeout_s),cwd:l.BH_AGENT_WORKSPACE,env:l,signal:t.signal})}finally{d.close(),c.key&&Xd(c.key)}if(f.error){let y=f.error.code==="ETIMEDOUT"?`browser_exec timed out after ${Ki(e.timeout_s)/1e3}s`:`browser_exec failed to launch: ${f.error.message||f.error}`;return{ok:!1,error:L(y,{force:!0})}}let m=typeof f.status=="number"?f.status:1,h=L(String(f.stdout||"").slice(0,On),{force:!0}),E=L(String(f.stderr||"").slice(0,Tn),{force:!0});return{ok:m===0,status:m,stdout:h,stderr:E||void 0,workspace:l.BH_AGENT_WORKSPACE,session:o||void 0}}var na=Object.freeze([{type:"function",function:{name:"browser_exec",description:"Drive Browser Use CLI 3.0 with several browser actions in one persistent call. Oracle accepts only AST-bounded helper Python: literal-public-URL new_tab/goto_url, wait_for_load, page_info, literal fill_input, literal click_at_xy, ensure_real_tab, and print. No variables, imports, attributes, filesystem, subprocess, arbitrary JavaScript, raw CDP, or dynamic URLs. Requires ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use.",parameters:{type:"object",properties:{code:{type:"string",description:"Bounded Python using approved pre-imported Browser Use helpers. Begin with a short comment describing the step."},session:{type:"string",description:"Optional persistent session name: 1-64 letters, digits, dashes, or underscores."},timeout_s:{type:"integer",description:`Timeout in seconds (default ${Cn}, maximum ${Xi}).`,default:Cn}},required:["code"],additionalProperties:!1}}}]);import{spawnSync as np}from"node:child_process";import oa from"node:fs";import $n from"node:path";var sa=45e3,op=4e4,sp=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),ip=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),ia=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);function ap(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function aa(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function cp(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return $n.isAbsolute(t)?oa.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split($n.delimiter)){if(!n)continue;let o=$n.join(n,"xurl");try{if(oa.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function lp(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function up(e){for(let t of e){let r=String(t);if(ia.includes(r))return r;if(ia.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function fp(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(l=>String(l));else{let l=String(e.command||e.cmd||"").trim();if(!l)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(c=>String(c)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];l==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(l==="timeline"||l==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[l,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let l of r)if(String(l).length>4e3)return{ok:!1,error:"argument too long"};let n=up(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(l=>String(l).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!aa(t)&&r.some(l=>/^-X$/.test(l)||/^--request$/.test(l))){let l=r.findIndex(c=>c==="-X"||c==="--request"),u=String(r[l+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!sp.includes(o))if(ip.includes(o)){if(!aa(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let s=[...r],i=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(i&&!s.includes("--app")&&s.unshift("--app",i),a&&!s.includes("--username")&&!s.includes("-u")){let l=0;s[0]==="--app"&&(l=2),l<s.length&&s.splice(l+1,0,"-u",a)}return{ok:!0,argv:s,command:o}}async function ca(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!ap(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=fp(t,n);if(!o.ok)return o;let s=cp(n);if(!s.ok)return s;let a=(r.spawnFn||np)(s.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||sa,maxBuffer:1024*1024,env:lp(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||sa}ms`:String(a.error.message||a.error);return{ok:!1,error:L(d,{force:!0})}}let l=L(String(a.stdout||"").slice(0,op),{force:!0}),u=L(String(a.stderr||"").slice(0,2e3),{force:!0}),c=typeof a.status=="number"?a.status:1;return{ok:c===0,status:c,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:l,stderr:u||void 0}}var la=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}]);import dp from"node:fs";import pp from"node:path";var mp="knowledge",hp="corpus.json",Bn=["canonical","historical","methodology","live-required"],fa=new Set(Bn),Mn=200,jn=1,Un=10,da=5,ua=240,ve={idExact:100,titleExact:60,titleSubstring:30,titleToken:12,taxonomyToken:8,keywordToken:6,summaryToken:2,summarySubstring:3},De=null;function gp(){return pp.join(we(mp,import.meta.url),hp)}function it(e){return typeof e=="string"&&e.trim().length>0}function Pn(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function yp(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let{id:t,title:r,kind:n,taxonomyIds:o,keywords:s,summary:i,canonicalUrls:a,sourceTier:l,updateCadence:u,liveDataRequired:c}=e;if(!it(t)||!it(r)||!fa.has(n)||!Pn(o)||!Pn(s)||!it(i)||!Pn(a)||a.length===0||!Number.isInteger(l)||l<0||l>4||!it(u)||typeof c!="boolean"||n==="live-required"!==c)return null;try{if(a.some(d=>new URL(d).protocol!=="https:"))return null}catch{return null}return{id:t.trim(),title:r.trim(),kind:n,taxonomyIds:o.map(d=>d.trim()).filter(Boolean),keywords:s.map(d=>d.trim()).filter(Boolean),summary:i.trim(),canonicalUrls:a.map(d=>d.trim()),sourceTier:l,updateCadence:u.trim(),liveDataRequired:c}}function bp(e){if(Array.isArray(e))return e;if(e&&typeof e=="object"){if(Array.isArray(e.records))return e.records;if(Array.isArray(e.corpus))return e.corpus}return null}function xp(e={}){let t=e&&typeof e=="object"?e:{},r=it(t.corpusPath)?t.corpusPath:gp();if(!t.forceReload&&De&&De.path===r)return De.result;let n;try{n=dp.readFileSync(r,"utf8")}catch(c){let d={ok:!1,error:`could not read knowledge corpus: ${c.code||c.message}`,records:[]};return De={path:r,result:d},d}let o;try{o=JSON.parse(n)}catch(c){let d={ok:!1,error:`knowledge corpus is not valid JSON: ${c.message}`,records:[]};return De={path:r,result:d},d}let s=bp(o);if(!s){let c={ok:!1,error:"knowledge corpus must be an array of records, or an object with a records[] array",records:[]};return De={path:r,result:c},c}let i=[],a=new Set,l=0;for(let c of s){let d=yp(c);if(!d||a.has(d.id)){l+=1;continue}a.add(d.id),i.push(d)}i.sort((c,d)=>c.id<d.id?-1:c.id>d.id?1:0);let u={ok:!0,records:i,skipped:l,path:r};return De={path:r,result:u},u}function Dn(e){return String(e||"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function Fn(e){return String(e||"").split(".").map(t=>t.trim().toLowerCase()).filter(Boolean)}function _p(e,t){let r=Fn(t);return r.length===0?!0:e.some(n=>{let o=Fn(n);return o.length<r.length?!1:r.every((s,i)=>o[i]===s)})}function wp(e,t,r){let n=0,o=e.id.toLowerCase(),s=e.title.toLowerCase(),i=e.summary.toLowerCase();o===t&&(n+=ve.idExact),s===t?n+=ve.titleExact:t&&s.includes(t)&&(n+=ve.titleSubstring),t&&i.includes(t)&&(n+=ve.summarySubstring);let a=new Set(Dn(e.title)),l=new Set(e.taxonomyIds.flatMap(c=>Fn(c))),u=new Set(e.keywords.flatMap(c=>Dn(c)));for(let c of r)a.has(c)&&(n+=ve.titleToken),l.has(c)&&(n+=ve.taxonomyToken),u.has(c)&&(n+=ve.keywordToken),i.includes(c)&&(n+=ve.summaryToken);return n}function Sp(e){return e.length<=ua?e:`${e.slice(0,ua)}\u2026`}function kp(e={},t={}){let r=e&&typeof e=="object"?e:{},n=new Set(["query","topK","taxonomyPrefix","kinds"]);if(Object.keys(r).some(m=>!n.has(m)))return{ok:!1,error:"unexpected knowledge_search argument"};if(!it(r.query))return{ok:!1,error:"query is required"};let o=r.query.trim().replace(/\s+/g," ");if(!o)return{ok:!1,error:"query is required"};if(o.length>Mn)return{ok:!1,error:`query length must not exceed ${Mn} characters`};let s=da;if(r.topK!==void 0&&r.topK!==null){let m=r.topK;if(typeof m!="number"||!Number.isInteger(m)||m<jn||m>Un)return{ok:!1,error:`topK must be an integer between ${jn} and ${Un}`};s=m}let i=null;if(r.kinds!==void 0&&r.kinds!==null){if(!Array.isArray(r.kinds)||r.kinds.length===0||r.kinds.some(m=>!fa.has(m)))return{ok:!1,error:`kinds must be a non-empty array drawn from ${Bn.join(", ")}`};i=new Set(r.kinds)}let a="";if(r.taxonomyPrefix!==void 0&&r.taxonomyPrefix!==null){if(typeof r.taxonomyPrefix!="string")return{ok:!1,error:"taxonomyPrefix must be a string"};a=r.taxonomyPrefix.trim()}let l=xp(t);if(!l.ok)return{ok:!1,error:l.error};let u=o.toLowerCase(),c=[...new Set(Dn(o))],d=[];for(let m of l.records){if(i&&!i.has(m.kind)||a&&!_p(m.taxonomyIds,a))continue;let h=wp(m,u,c);h<=0||d.push({record:m,score:h})}d.sort((m,h)=>h.score!==m.score?h.score-m.score:m.record.id<h.record.id?-1:m.record.id>h.record.id?1:0);let p=d.slice(0,s).map(({record:m,score:h})=>({id:m.id,title:m.title,kind:m.kind,taxonomyIds:m.taxonomyIds,summary:Sp(m.summary),canonicalUrls:m.canonicalUrls,sourceTier:m.sourceTier,updateCadence:m.updateCadence,liveDataRequired:m.liveDataRequired,score:h})),f={ok:!0,query:o,results:p,count:p.length};return p.some(m=>m.liveDataRequired)&&(f.warning="one or more results require live data; treat their content as potentially stale until confirmed with a live lookup"),f}function pa(e,t={},r={}){return e==="knowledge_search"?kp(t,r):{ok:!1,error:`unknown tool: ${e}`}}var ma=[{type:"function",function:{name:"knowledge_search",description:"Read-only search over the local, offline knowledge corpus by keyword or topic. Deterministic lexical search over canonical, historical, methodology, and live-required records. Results of kind live-required need a live lookup to confirm current state before being relied on.",parameters:{type:"object",properties:{query:{type:"string",description:`Search text (max ${Mn} chars)`},topK:{type:"integer",minimum:jn,maximum:Un,description:`Maximum results to return (default ${da})`},taxonomyPrefix:{type:"string",description:"Restrict results to records whose taxonomy ids fall under this dot-separated prefix"},kinds:{type:"array",items:{type:"string",enum:Bn},description:"Restrict results to these record kinds"}},required:["query"],additionalProperties:!1}}}];import Ep from"node:fs";import ha from"node:path";import{homedir as Ap}from"node:os";var vp=64*1024,Op=64;function Tp(e=process.env.ORACLE_CONFIG_DIR||ha.join(Ap(),".config","oracle")){return ha.join(e,"hooks.json")}function Hn(e={}){let t=e.path||Tp(e.configDir),r;try{r=Ep.readFileSync(t,"utf8")}catch{return{source:"missing",pre_tool:[]}}if(r.length>vp)return{source:"oversized",pre_tool:[],error:"hooks.json too large"};try{let n=JSON.parse(r),o=Array.isArray(n?.pre_tool)?n.pre_tool.slice(0,Op):[],s=[];for(let i of o){if(!i||typeof i!="object")continue;let a=typeof i.match=="string"?i.match.trim():"";!a||a.length>128||i.decision==="deny"&&s.push({match:a,decision:"deny",reason:typeof i.reason=="string"?i.reason.slice(0,200):"denied by operator hook",server:typeof i.server=="string"?i.server.trim().slice(0,128):void 0})}return{source:"file",path:t,pre_tool:s}}catch(n){return{source:"invalid",pre_tool:[],error:n instanceof Error?n.message:String(n)}}}function ga(e={},t=Hn()){try{if(t?.error&&t.source==="invalid")return{allow:!1,reason:`hooks.json invalid: ${t.error}`};if(t?.error&&t.source==="oversized")return{allow:!1,reason:"hooks.json oversized"};let r=typeof e.name=="string"?e.name:"";if(!r)return{allow:!1,reason:"hook check missing tool name"};let n=Array.isArray(t?.pre_tool)?t.pre_tool:[];for(let o of n)if(!(o.match!=="*"&&o.match!==r)&&!(o.server&&e?.args?.server!==o.server))return{allow:!1,reason:o.reason||`denied by hook (${o.match})`};return{allow:!0}}catch(r){return{allow:!1,reason:`hook engine failure: ${r instanceof Error?r.message:String(r)}`.slice(0,200)}}}import{homedir as zn}from"node:os";import{join as qn}from"node:path";var ya=process.env.ORACLE_PUBLIC_DESKTOP==="1",Cp=ya?process.env.ORACLE_CONFIG_DIR||qn(zn(),".config","oracle"):qn(zn(),".config","oracle"),Uy=ya?Cp:qn(zn(),".config","mad-desk");function Rp(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}var Lp=["0","false","off","no"];function ba(e,t,r=!0){let n=String(Rp(e,t,"")).trim().toLowerCase();return n===""?r:!Lp.includes(n)}import{mkdir as zp,chmod as ur,readFile as qp,rename as Kp,writeFile as Gp}from"node:fs/promises";import{homedir as Wp}from"node:os";import{dirname as _a,join as Gn}from"node:path";import Vp from"sql.js";import{wordlists as Ip}from"ethers";var Np=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),$p=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Pp=new Set([12,15,18,21,24]);function Mp(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Pp.has(t.length)&&t.every(r=>Ip.en.getWordIndex(r)>=0)}var jp=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Up=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Dp=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function Fp(e){let t=xa(e);return Dp.has(t)||Up.test(t)}var Ct=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function xa(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Bp(e){let t=xa(e);return[...Np].some(r=>t.includes(r))}function Hp(e,t,r){if(typeof t=="string"){if($p.some(n=>n.test(t))||Mp(t))throw new Ct(r);if(jp.test(t)&&!Fp(e))throw new Ct(r)}}function Kn(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Hp(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,s)=>Kn(o,`${t}[${s}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let s=`${t}.${o}`;if(Bp(o))throw new Ct(s);e[o]!==void 0&&(n[o]=Kn(e[o],s,o))}return n}function at(e){return Kn(e)}var Wn=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),Xp=new Set(Wn),Yp=new Set(Wn.slice(0,-1).map((e,t)=>`${e}:${Wn[t+1]}`)),Jp=Gn(process.env.ORACLE_CONFIG_DIR||Gn(Wp(),".config","oracle"),"workspace"),Zp=Gn(Jp,"artifacts.sqlite");function pr(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(pr).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${pr(e[t])}`).join(",")}}`}function wa(e){if(!Xp.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function fr(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function dr(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Sa(e={}){let t=e.path||Zp;await zp(_a(t),{recursive:!0,mode:448}),await ur(_a(t),448);let r;try{r=await qp(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Vp(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
270
+ `)){let l=a.trim().split(/\s+/),u=l.at(-1);if(u!==t&&u!==n)continue;let c=l[6];/^\d+$/.test(c||"")&&o.add(c)}}if(!o.size)return!1;for(let s of r){let i=[];try{i=M.readdirSync(`/proc/${s.pid}/fd`)}catch{continue}for(let a of i)try{let l=/^socket:\[(\d+)\]$/.exec(M.readlinkSync(`/proc/${s.pid}/fd/${a}`));if(l&&o.has(l[1]))return!0}catch{}}}catch{}return!1}function Qd(e,t,r){return new Promise((n,o)=>{let s=vn.request({socketPath:e,path:t,method:"GET",signal:r,headers:{host:"127.0.0.1:9224"}},i=>{let a="";i.setEncoding("utf8"),i.on("data",l=>{a.length<64e3&&(a+=l)}),i.on("end",()=>{if((i.statusCode||500)>=400)return o(new Error(`CDP returned ${i.statusCode}`));try{n(JSON.parse(a))}catch(l){o(l)}})});s.once("error",o),s.end()})}async function ep(e,t,r,n=15e3){let o=Date.now()+n;for(;Date.now()<o;){if(r?.aborted||t.exitCode!=null||t.signalCode!=null||t.killed)return null;try{if(!Zd(t,e))throw new Error("CDP socket is not owned");let s=await Qd(e,"/json/version",r);if(/^ws:\/\/(?:127\.0\.0\.1|0\.0\.0\.0|localhost):9224\/devtools\/browser\/[A-Za-z0-9-]+$/.test(s?.webSocketDebuggerUrl||""))return s}catch{}try{await ta(50,r)}catch{return null}}return null}async function tp(e,t,r={}){if(String(e.ORACLE_BROWSER_CDP_URL||"").trim())return{ok:!1,error:"ORACLE_BROWSER_CDP_URL is unsupported: Oracle must launch Chromium with its mandatory SSRF proxy"};let o=Zi(r.taskId||"default"),s=ot.get(o);if(s)return s.promise;let i=F.get(o);if(i?.child&&i.child.exitCode==null&&i.child.signalCode==null&&!i.child.killed)return Rn(o),{ok:!0,cdpUrl:i.cdpUrl,cdpSocket:i.cdpSocket,managed:!0,key:o};let a=new AbortController,l=r.ownerTaskId||r.taskId||"default",u=()=>a.abort();r.signal?.addEventListener("abort",u,{once:!0}),r.signal?.aborted&&a.abort();let c={controller:a,ownerTaskId:l,promise:null};c.promise=(async()=>{let d=String(r.executablePath||e.ORACLE_CHROMIUM_PATH||"").trim()||Ui(e);if(!d||!$.isAbsolute(d)||!cr(d))return{ok:!1,error:"Browser Use needs Chromium. Set ORACLE_CHROMIUM_PATH to an absolute executable path."};let p;try{p=await(r.startProxyFn||Kd)(r.proxyOptions)}catch{return a.signal.aborted?ce():{ok:!1,error:"mandatory Oracle browser SSRF proxy failed to start"}}if(a.signal.aborted)return je(p),ce();let f;try{f=await(r.startProxyRelayFn||((S,v)=>Ji(S,v,"proxy")))(p.url,t.BH_RUNTIME_DIR)}catch{return je(p),a.signal.aborted?ce():{ok:!1,error:"isolated Chromium proxy relay failed to start"}}if(a.signal.aborted)return f.close(),je(p),ce();let m=M.mkdtempSync($.join(t.HOME,"chromium-profile-"));M.chmodSync(m,448);let h=$.join(t.BH_RUNTIME_DIR,`chromium-cdp-${Gi(12).toString("hex")}.sock`);try{M.rmSync(h,{force:!0})}catch{}let E=["--headless=new","--remote-debugging-port=9224","--remote-debugging-address=0.0.0.0",`--user-data-dir=${m}`,"--disable-dev-shm-usage","--disable-extensions","--disable-background-networking","--disable-sync","--disable-translate","--proxy-server=http://0.0.0.0:9223","--proxy-bypass-list=<-loopback>","--mute-audio","--no-first-run","--no-default-browser-check","about:blank"],y=Ud(d,m,t,E,f.socketPath,h,e);if(!y.ok)return f.close(),je(p),y;let w=Nn(y.command,y.argv,{env:t,cwd:t.BH_AGENT_WORKSPACE,mode:"ignore",processGroup:!0,spawnFn:r.browserSpawnFn,spawnOptions:{env:t,stdio:"ignore",detached:!1,windowsHide:!0}}),b=w.child;if(!b||typeof b.once!="function")return f.close(),je(p),{ok:!1,error:"failed to create managed Chromium process"};let g={child:b,cdpUrl:null,cdpSocket:h,proxy:p,proxyRelay:f,owned:w.owned,activeRuns:0,idleTimeoutMs:Number(r.idleTimeoutMs)||Yi,ownerTaskId:l,launching:!0};F.set(o,g),Bi||(Bi=!0,process.once("exit",Wd)),b.once("exit",()=>{F.get(o)?.child===b&&ae(o).catch(()=>{})});let _=null;if(r.readDevToolsEndpointFn){let S=await Yd(m,b,r,a.signal);if(!S||a.signal.aborted||F.get(o)!==g||!qi(b,y.profileArg))return F.get(o)===g?await ae(o):(Tt(b,"SIGTERM",w.owned),f.close(),je(p)),a.signal.aborted?ce():{ok:!1,error:"managed Chromium did not expose an owned CDP endpoint"};if(!(r.verifyCdpOwnerFn||Jd)(b,S.port))return F.get(o)===g&&await ae(o),{ok:!1,error:"managed Chromium CDP listener is not owned by the launched process tree"};_=`http://127.0.0.1:${S.port}`;try{let C=await(r.fetchImpl||fetch)(`${_}/json/version`,{signal:AbortSignal.timeout(1e3)});if((C?.ok&&typeof C.json=="function"?await C.json():null)?.webSocketDebuggerUrl!==`ws://127.0.0.1:${S.port}${S.wsPath}`)throw new Error("CDP identity mismatch")}catch{return F.get(o)===g&&await ae(o),{ok:!1,error:"managed Chromium CDP identity verification failed"}}}else{if(!await ep(h,b,a.signal,Number(r.launchTimeoutMs)||15e3))return F.get(o)===g&&await ae(o),a.signal.aborted?ce():{ok:!1,error:"managed Chromium did not expose an owned private CDP socket"};if(a.signal.aborted||F.get(o)!==g)return F.get(o)===g&&await ae(o),ce();if(!qi(b,y.profileArg))return F.get(o)===g&&await ae(o),{ok:!1,error:"private CDP socket is not bound to the launched Chromium process tree"}}return a.signal.aborted||F.get(o)!==g?(F.get(o)===g&&await ae(o),ce()):(g.cdpUrl=_,g.launching=!1,Rn(o),{ok:!0,cdpUrl:_,cdpSocket:h,managed:!0,key:o})})(),ot.set(o,c);try{return await c.promise}finally{r.signal?.removeEventListener("abort",u),ot.get(o)===c&&ot.delete(o)}}function Ki(e){let t=Number(e),r=Number.isFinite(t)?Math.trunc(t):Cn;return Math.max(Rd,Math.min(Xi,r))*1e3}function rp(e,t,r={}){return new Promise(n=>{if(r.signal?.aborted){n({error:Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"})});return}let o,s=!1;try{let h=Nn(e,t,{cwd:r.cwd,env:r.env,mode:"pipe",input:r.input,spawnFn:r.spawnFn,spawnOptions:{cwd:r.cwd,env:r.env,windowsHide:!0,stdio:["pipe","pipe","pipe"]}});o=h.child,s=h.owned}catch(h){n({error:h});return}if(!o||typeof o.once!="function"){n({error:new Error("CLI spawn did not return a ChildProcess")});return}let i="",a="",l=!1,u,c,d=null,p=h=>{l||(l=!0,u&&clearTimeout(u),c&&clearTimeout(c),r.signal?.removeEventListener("abort",m),n(h))},f=h=>{d||(d=h,Tt(o,"SIGKILL",s),c=setTimeout(()=>p({error:Object.assign(new Error("browser_exec process tree did not reap"),{code:"EREAP"}),stdout:i,stderr:a}),3e3),c.unref?.())},m=()=>f(Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"}));o.stdout?.on("data",h=>{i.length<On&&(i+=String(h).slice(0,On-i.length))}),o.stderr?.on("data",h=>{a.length<Tn&&(a+=String(h).slice(0,Tn-a.length))}),o.once("error",h=>p({error:h,stdout:i,stderr:a})),o.once("close",(h,E)=>p(d?{error:d,stdout:i,stderr:a}:{status:h,signal:E,stdout:i,stderr:a})),u=setTimeout(()=>f(Object.assign(new Error("timed out"),{code:"ETIMEDOUT"})),r.timeout),u.unref?.(),r.signal?.aborted?m():r.signal?.addEventListener("abort",m,{once:!0}),o.stdin&&(o.stdin.on?.("error",h=>{l||h?.code==="EPIPE"||h?.code==="ECONNRESET"||p({error:h,stdout:i,stderr:a})}),o.stdin.end(r.input))})}async function ra(e={},t={}){let r=t.env||process.env;if(!In(r))return{ok:!1,error:"browser_exec is disabled. Set ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use. Oracle runs an AST-bounded browser-helper subset, not terminal-equivalent Python."};if(t.signal?.aborted)return ce();let n=String(e.code||""),o=String(e.session||"").trim();if(o&&!Td.test(o))return{ok:!1,error:"session must be 1-64 letters, digits, dashes, or underscores"};let s=Bd(n,{env:r,python:t.python,spawnFn:t.validatorSpawnFn});if(!s.ok)return s;let i=Pd(r);if(!i.ok)return i;let a=`${t.taskId||"default"}--${o||"default"}`,l=qd(r,a);l.BU_NAME=`oracle-${Ln("sha256").update(a).digest("hex").slice(0,12)}`;let u={...t,taskId:a,ownerTaskId:t.taskId||"default",cli:i},c=t.ensureBrowserFn?await t.ensureBrowserFn(r,l,u):await tp(r,l,u);if(!c?.ok)return c||{ok:!1,error:"Browser Use backend failed to initialize"};if(t.signal?.aborted)return ce();l.BU_CDP_URL="http://0.0.0.0:9222";let d;if(c.cdpSocket)d={socketPath:c.cdpSocket,close(){}};else try{d=await(t.startCdpRelayFn||jd)(c.cdpUrl,l.BH_RUNTIME_DIR)}catch{return{ok:!1,error:"isolated CDP relay failed to start"}}if(t.signal?.aborted)return d.close(),ce();let p=Md(i,l,d.socketPath,r);if(!p.ok)return d.close(),p;c.key&&Vd(c.key);let f;try{f=await rp(p.command,p.argv,{spawnFn:t.cliSpawnFn,input:n,timeout:Ki(e.timeout_s),cwd:l.BH_AGENT_WORKSPACE,env:l,signal:t.signal})}finally{d.close(),c.key&&Xd(c.key)}if(f.error){let y=f.error.code==="ETIMEDOUT"?`browser_exec timed out after ${Ki(e.timeout_s)/1e3}s`:`browser_exec failed to launch: ${f.error.message||f.error}`;return{ok:!1,error:L(y,{force:!0})}}let m=typeof f.status=="number"?f.status:1,h=L(String(f.stdout||"").slice(0,On),{force:!0}),E=L(String(f.stderr||"").slice(0,Tn),{force:!0});return{ok:m===0,status:m,stdout:h,stderr:E||void 0,workspace:l.BH_AGENT_WORKSPACE,session:o||void 0}}var na=Object.freeze([{type:"function",function:{name:"browser_exec",description:"Drive Browser Use CLI 3.0 with several browser actions in one persistent call. Oracle accepts only AST-bounded helper Python: literal-public-URL new_tab/goto_url, wait_for_load, page_info, literal fill_input, literal click_at_xy, ensure_real_tab, and print. No variables, imports, attributes, filesystem, subprocess, arbitrary JavaScript, raw CDP, or dynamic URLs. Requires ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use.",parameters:{type:"object",properties:{code:{type:"string",description:"Bounded Python using approved pre-imported Browser Use helpers. Begin with a short comment describing the step."},session:{type:"string",description:"Optional persistent session name: 1-64 letters, digits, dashes, or underscores."},timeout_s:{type:"integer",description:`Timeout in seconds (default ${Cn}, maximum ${Xi}).`,default:Cn}},required:["code"],additionalProperties:!1}}}]);import{spawnSync as np}from"node:child_process";import oa from"node:fs";import $n from"node:path";var sa=45e3,op=4e4,sp=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),ip=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),ia=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);function ap(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function aa(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function cp(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return $n.isAbsolute(t)?oa.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split($n.delimiter)){if(!n)continue;let o=$n.join(n,"xurl");try{if(oa.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function lp(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function up(e){for(let t of e){let r=String(t);if(ia.includes(r))return r;if(ia.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function fp(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(l=>String(l));else{let l=String(e.command||e.cmd||"").trim();if(!l)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(c=>String(c)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];l==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(l==="timeline"||l==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[l,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let l of r)if(String(l).length>4e3)return{ok:!1,error:"argument too long"};let n=up(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(l=>String(l).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!aa(t)&&r.some(l=>/^-X$/.test(l)||/^--request$/.test(l))){let l=r.findIndex(c=>c==="-X"||c==="--request"),u=String(r[l+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!sp.includes(o))if(ip.includes(o)){if(!aa(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let s=[...r],i=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(i&&!s.includes("--app")&&s.unshift("--app",i),a&&!s.includes("--username")&&!s.includes("-u")){let l=0;s[0]==="--app"&&(l=2),l<s.length&&s.splice(l+1,0,"-u",a)}return{ok:!0,argv:s,command:o}}async function ca(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!ap(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=fp(t,n);if(!o.ok)return o;let s=cp(n);if(!s.ok)return s;let a=(r.spawnFn||np)(s.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||sa,maxBuffer:1024*1024,env:lp(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||sa}ms`:String(a.error.message||a.error);return{ok:!1,error:L(d,{force:!0})}}let l=L(String(a.stdout||"").slice(0,op),{force:!0}),u=L(String(a.stderr||"").slice(0,2e3),{force:!0}),c=typeof a.status=="number"?a.status:1;return{ok:c===0,status:c,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:l,stderr:u||void 0}}var la=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}]);import dp from"node:fs";import pp from"node:path";var mp="knowledge",hp="corpus.json",Bn=["canonical","historical","methodology","live-required"],fa=new Set(Bn),Mn=200,jn=1,Un=10,da=5,ua=240,ve={idExact:100,titleExact:60,titleSubstring:30,titleToken:12,taxonomyToken:8,keywordToken:6,summaryToken:2,summarySubstring:3},De=null;function gp(){return pp.join(we(mp,import.meta.url),hp)}function it(e){return typeof e=="string"&&e.trim().length>0}function Pn(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function yp(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let{id:t,title:r,kind:n,taxonomyIds:o,keywords:s,summary:i,canonicalUrls:a,sourceTier:l,updateCadence:u,liveDataRequired:c}=e;if(!it(t)||!it(r)||!fa.has(n)||!Pn(o)||!Pn(s)||!it(i)||!Pn(a)||a.length===0||!Number.isInteger(l)||l<0||l>4||!it(u)||typeof c!="boolean"||n==="live-required"!==c)return null;try{if(a.some(d=>new URL(d).protocol!=="https:"))return null}catch{return null}return{id:t.trim(),title:r.trim(),kind:n,taxonomyIds:o.map(d=>d.trim()).filter(Boolean),keywords:s.map(d=>d.trim()).filter(Boolean),summary:i.trim(),canonicalUrls:a.map(d=>d.trim()),sourceTier:l,updateCadence:u.trim(),liveDataRequired:c}}function bp(e){if(Array.isArray(e))return e;if(e&&typeof e=="object"){if(Array.isArray(e.records))return e.records;if(Array.isArray(e.corpus))return e.corpus}return null}function xp(e={}){let t=e&&typeof e=="object"?e:{},r=it(t.corpusPath)?t.corpusPath:gp();if(!t.forceReload&&De&&De.path===r)return De.result;let n;try{n=dp.readFileSync(r,"utf8")}catch(c){let d={ok:!1,error:`could not read knowledge corpus: ${c.code||c.message}`,records:[]};return De={path:r,result:d},d}let o;try{o=JSON.parse(n)}catch(c){let d={ok:!1,error:`knowledge corpus is not valid JSON: ${c.message}`,records:[]};return De={path:r,result:d},d}let s=bp(o);if(!s){let c={ok:!1,error:"knowledge corpus must be an array of records, or an object with a records[] array",records:[]};return De={path:r,result:c},c}let i=[],a=new Set,l=0;for(let c of s){let d=yp(c);if(!d||a.has(d.id)){l+=1;continue}a.add(d.id),i.push(d)}i.sort((c,d)=>c.id<d.id?-1:c.id>d.id?1:0);let u={ok:!0,records:i,skipped:l,path:r};return De={path:r,result:u},u}function Dn(e){return String(e||"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function Fn(e){return String(e||"").split(".").map(t=>t.trim().toLowerCase()).filter(Boolean)}function _p(e,t){let r=Fn(t);return r.length===0?!0:e.some(n=>{let o=Fn(n);return o.length<r.length?!1:r.every((s,i)=>o[i]===s)})}function wp(e,t,r){let n=0,o=e.id.toLowerCase(),s=e.title.toLowerCase(),i=e.summary.toLowerCase();o===t&&(n+=ve.idExact),s===t?n+=ve.titleExact:t&&s.includes(t)&&(n+=ve.titleSubstring),t&&i.includes(t)&&(n+=ve.summarySubstring);let a=new Set(Dn(e.title)),l=new Set(e.taxonomyIds.flatMap(c=>Fn(c))),u=new Set(e.keywords.flatMap(c=>Dn(c)));for(let c of r)a.has(c)&&(n+=ve.titleToken),l.has(c)&&(n+=ve.taxonomyToken),u.has(c)&&(n+=ve.keywordToken),i.includes(c)&&(n+=ve.summaryToken);return n}function Sp(e){return e.length<=ua?e:`${e.slice(0,ua)}\u2026`}function kp(e={},t={}){let r=e&&typeof e=="object"?e:{},n=new Set(["query","topK","taxonomyPrefix","kinds"]);if(Object.keys(r).some(m=>!n.has(m)))return{ok:!1,error:"unexpected knowledge_search argument"};if(!it(r.query))return{ok:!1,error:"query is required"};let o=r.query.trim().replace(/\s+/g," ");if(!o)return{ok:!1,error:"query is required"};if(o.length>Mn)return{ok:!1,error:`query length must not exceed ${Mn} characters`};let s=da;if(r.topK!==void 0&&r.topK!==null){let m=r.topK;if(typeof m!="number"||!Number.isInteger(m)||m<jn||m>Un)return{ok:!1,error:`topK must be an integer between ${jn} and ${Un}`};s=m}let i=null;if(r.kinds!==void 0&&r.kinds!==null){if(!Array.isArray(r.kinds)||r.kinds.length===0||r.kinds.some(m=>!fa.has(m)))return{ok:!1,error:`kinds must be a non-empty array drawn from ${Bn.join(", ")}`};i=new Set(r.kinds)}let a="";if(r.taxonomyPrefix!==void 0&&r.taxonomyPrefix!==null){if(typeof r.taxonomyPrefix!="string")return{ok:!1,error:"taxonomyPrefix must be a string"};a=r.taxonomyPrefix.trim()}let l=xp(t);if(!l.ok)return{ok:!1,error:l.error};let u=o.toLowerCase(),c=[...new Set(Dn(o))],d=[];for(let m of l.records){if(i&&!i.has(m.kind)||a&&!_p(m.taxonomyIds,a))continue;let h=wp(m,u,c);h<=0||d.push({record:m,score:h})}d.sort((m,h)=>h.score!==m.score?h.score-m.score:m.record.id<h.record.id?-1:m.record.id>h.record.id?1:0);let p=d.slice(0,s).map(({record:m,score:h})=>({id:m.id,title:m.title,kind:m.kind,taxonomyIds:m.taxonomyIds,summary:Sp(m.summary),canonicalUrls:m.canonicalUrls,sourceTier:m.sourceTier,updateCadence:m.updateCadence,liveDataRequired:m.liveDataRequired,score:h})),f={ok:!0,query:o,results:p,count:p.length};return p.some(m=>m.liveDataRequired)&&(f.warning="one or more results require live data; treat their content as potentially stale until confirmed with a live lookup"),f}function pa(e,t={},r={}){return e==="knowledge_search"?kp(t,r):{ok:!1,error:`unknown tool: ${e}`}}var ma=[{type:"function",function:{name:"knowledge_search",description:"Read-only search over the local, offline knowledge corpus by keyword or topic. Deterministic lexical search over canonical, historical, methodology, and live-required records. Results of kind live-required need a live lookup to confirm current state before being relied on.",parameters:{type:"object",properties:{query:{type:"string",description:`Search text (max ${Mn} chars)`},topK:{type:"integer",minimum:jn,maximum:Un,description:`Maximum results to return (default ${da})`},taxonomyPrefix:{type:"string",description:"Restrict results to records whose taxonomy ids fall under this dot-separated prefix"},kinds:{type:"array",items:{type:"string",enum:Bn},description:"Restrict results to these record kinds"}},required:["query"],additionalProperties:!1}}}];import Ep from"node:fs";import ha from"node:path";import{homedir as Ap}from"node:os";var vp=64*1024,Op=64;function Tp(e=process.env.ORACLE_CONFIG_DIR||ha.join(Ap(),".config","oracle")){return ha.join(e,"hooks.json")}function Hn(e={}){let t=e.path||Tp(e.configDir),r;try{r=Ep.readFileSync(t,"utf8")}catch{return{source:"missing",pre_tool:[]}}if(r.length>vp)return{source:"oversized",pre_tool:[],error:"hooks.json too large"};try{let n=JSON.parse(r),o=Array.isArray(n?.pre_tool)?n.pre_tool.slice(0,Op):[],s=[];for(let i of o){if(!i||typeof i!="object")continue;let a=typeof i.match=="string"?i.match.trim():"";!a||a.length>128||i.decision==="deny"&&s.push({match:a,decision:"deny",reason:typeof i.reason=="string"?i.reason.slice(0,200):"denied by operator hook",server:typeof i.server=="string"?i.server.trim().slice(0,128):void 0})}return{source:"file",path:t,pre_tool:s}}catch(n){return{source:"invalid",pre_tool:[],error:n instanceof Error?n.message:String(n)}}}function ga(e={},t=Hn()){try{if(t?.error&&t.source==="invalid")return{allow:!1,reason:`hooks.json invalid: ${t.error}`};if(t?.error&&t.source==="oversized")return{allow:!1,reason:"hooks.json oversized"};let r=typeof e.name=="string"?e.name:"";if(!r)return{allow:!1,reason:"hook check missing tool name"};let n=Array.isArray(t?.pre_tool)?t.pre_tool:[];for(let o of n)if(!(o.match!=="*"&&o.match!==r)&&!(o.server&&e?.args?.server!==o.server))return{allow:!1,reason:o.reason||`denied by hook (${o.match})`};return{allow:!0}}catch(r){return{allow:!1,reason:`hook engine failure: ${r instanceof Error?r.message:String(r)}`.slice(0,200)}}}import{homedir as zn}from"node:os";import{join as qn}from"node:path";var ya=process.env.ORACLE_PUBLIC_DESKTOP==="1",Cp=ya?process.env.ORACLE_CONFIG_DIR||qn(zn(),".config","oracle"):qn(zn(),".config","oracle"),Uy=ya?Cp:qn(zn(),".config","mad-desk");function Rp(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}var Lp=["0","false","off","no"];function ba(e,t,r=!0){let n=String(Rp(e,t,"")).trim().toLowerCase();return n===""?r:!Lp.includes(n)}import{mkdir as zp,chmod as ur,readFile as qp,rename as Kp,writeFile as Gp}from"node:fs/promises";import{homedir as Wp}from"node:os";import{dirname as _a,join as Gn}from"node:path";import Vp from"sql.js";import{wordlists as Ip}from"ethers";var Np=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),$p=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Pp=new Set([12,15,18,21,24]);function Mp(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return Pp.has(t.length)&&t.every(r=>Ip.en.getWordIndex(r)>=0)}var jp=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Up=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Dp=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function Fp(e){let t=xa(e);return Dp.has(t)||Up.test(t)}var Ct=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function xa(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Bp(e){let t=xa(e);return[...Np].some(r=>t.includes(r))}function Hp(e,t,r){if(typeof t=="string"){if($p.some(n=>n.test(t))||Mp(t))throw new Ct(r);if(jp.test(t)&&!Fp(e))throw new Ct(r)}}function Kn(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Hp(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,s)=>Kn(o,`${t}[${s}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let s=`${t}.${o}`;if(Bp(o))throw new Ct(s);e[o]!==void 0&&(n[o]=Kn(e[o],s,o))}return n}function at(e){return Kn(e)}var Wn=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),Xp=new Set(Wn),Yp=new Set(Wn.slice(0,-1).map((e,t)=>`${e}:${Wn[t+1]}`)),Jp=Gn(process.env.ORACLE_CONFIG_DIR||Gn(Wp(),".config","oracle"),"workspace"),Zp=Gn(Jp,"artifacts.sqlite");function pr(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(pr).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${pr(e[t])}`).join(",")}}`}function wa(e){if(!Xp.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function fr(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function dr(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Sa(e={}){let t=e.path||Zp;await zp(_a(t),{recursive:!0,mode:448}),await ur(_a(t),448);let r;try{r=await qp(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Vp(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
271
271
  PRAGMA foreign_keys=ON;
272
272
  CREATE TABLE IF NOT EXISTS artifacts (
273
273
  id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL
@@ -268,7 +268,7 @@ Connection: close\r
268
268
  `)){let[i,a]=s.trim().split(/\s+/).map(Number);!i||!a||(r.has(a)||r.set(a,[]),r.get(a).push(i))}let n=[],o=s=>{for(let i of r.get(s)||[])o(i),n.push(i)};return o(e),[...n,e].map(s=>({pid:s,startTime:It(s)}))}function Vd(e,t){for(let r of e||[])if(!(!r.startTime||It(r.pid)!==r.startTime))try{process.kill(r.pid,t)}catch{}}function Nt(e,t="SIGTERM",r=!1){if(e){if(!r){try{e.kill(t)}catch{}return}if(process.platform==="win32"){try{ct("taskkill",["/PID",String(e.pid),"/T",...t==="SIGKILL"?["/F"]:[]],{stdio:"ignore",windowsHide:!0})}catch{}fr(e,"cancel");return}if(!e._oracleKillTargets){if(!e._oracleStartTime||It(e.pid)!==e._oracleStartTime){fr(e,"cancel");return}e._oracleKillTargets=pr(e.pid)}if(fr(e,"cancel"),e._oracleProcessGroup&&It(e.pid)===e._oracleStartTime)try{process.kill(-e.pid,t)}catch{}Vd(e._oracleKillTargets,t)}}var Ay=Object.freeze({spawn:Un,kill:Nt});function Xi(e,t){return!e||e.exitCode!=null||e.signalCode!=null?Promise.resolve(!0):new Promise(r=>{let n=!1,o=a=>{n||(n=!0,clearTimeout(i),e.removeListener?.("exit",s),e.removeListener?.("close",s),r(a))},s=()=>o(!0),i=setTimeout(()=>o(!1),t);e.once?.("exit",s),e.once?.("close",s)})}async function ce(e){let t=F.get(e);if(t){if(t.stopPromise)return t.stopPromise;t.stopPromise=(async()=>{t.idleTimer&&clearTimeout(t.idleTimer),t.proxyRelay?.close?.(),Ue(t.proxy);let r=Xi(t.child,1e3);if(Nt(t.child,"SIGTERM",t.owned),!await r){let n=Xi(t.child,3e3);if(Nt(t.child,"SIGKILL",t.owned),!await n)throw Object.assign(new Error("managed Chromium process tree did not reap"),{code:"EREAP"})}F.get(e)===t&&F.delete(e)})();try{await t.stopPromise}catch(r){throw F.get(e)===t&&(t.stopPromise=null),r}}}function Pn(e){let t=F.get(e);if(t){if(t.idleTimer&&clearTimeout(t.idleTimer),t.activeRuns>0){t.idleTimer=null;return}t.idleTimer=setTimeout(()=>{ce(e).catch(()=>{})},t.idleTimeoutMs||ra),typeof t.idleTimer.unref=="function"&&t.idleTimer.unref()}}function Xd(){for(let e of at.values())e.controller.abort();for(let e of[...F.keys()])ce(e).catch(()=>{})}async function ia(e){let t=[];for(let n of at.values())n.ownerTaskId===e&&(n.controller.abort(),t.push(n.promise));await Promise.allSettled(t);let r=[];for(let[n,o]of F.entries())o.ownerTaskId===e&&r.push(ce(n));await Promise.all(r)}function Yd(e){let t=F.get(e);t&&(t.activeRuns=(t.activeRuns||0)+1,t.idleTimer&&clearTimeout(t.idleTimer),t.idleTimer=null)}function Jd(e){let t=F.get(e);t&&(t.activeRuns=Math.max(0,(t.activeRuns||0)-1),Pn(e))}function le(){return{ok:!1,error:"managed Chromium launch aborted"}}async function aa(e,t){if(t?.aborted)throw Object.assign(new Error("aborted"),{code:"ABORT_ERR"});await new Promise((r,n)=>{let o=!1,s=l=>{o||(o=!0,t?.removeEventListener("abort",a),l())},i=setTimeout(()=>s(r),e),a=()=>{clearTimeout(i),s(()=>n(Object.assign(new Error("aborted"),{code:"ABORT_ERR"})))};t?.addEventListener("abort",a,{once:!0}),i.unref?.()})}async function Zd(e,t,r,n){if(r.readDevToolsEndpointFn)return r.readDevToolsEndpointFn(e,t,n);let o=$.join(e,"DevToolsActivePort"),s=Date.now()+(Number(r.launchTimeoutMs)||15e3);for(;Date.now()<s;){if(n?.aborted||t.exitCode!=null||t.signalCode!=null||t.killed)return null;try{let[i,a]=M.readFileSync(o,"utf8").trim().split(/\r?\n/),l=Number(i);if(Number.isInteger(l)&&l>0&&l<=65535&&/^\/devtools\/browser\/[A-Za-z0-9-]+$/.test(a||""))return{port:l,wsPath:a}}catch{}try{await aa(50,n)}catch{return null}}return null}function Yi(e,t){if(!e?.pid||process.platform!=="linux")return!0;try{let r=M.readFileSync(`/proc/${e.pid}/cmdline`,"utf8").split("\0");return pr(e.pid).some(({pid:o})=>{try{let s=M.readFileSync(`/proc/${o}/cmdline`,"utf8").split("\0");return s.includes("--remote-debugging-port=9224")&&s.includes(`--user-data-dir=${t}`)}catch{return!1}})}catch{return!1}}function Qd(e,t){if(!e?.pid||!Number.isInteger(t))return!1;if(process.platform==="linux")try{let r=t.toString(16).toUpperCase().padStart(4,"0"),n=new Set;for(let o of["/proc/net/tcp","/proc/net/tcp6"])for(let s of M.readFileSync(o,"utf8").split(`
269
269
  `).slice(1)){let i=s.trim().split(/\s+/);if(i.length<10||i[3]!=="0A")continue;let[a,l]=String(i[1]||"").split(":");(a==="0100007F"||a==="00000000000000000000000001000000")&&l===r&&n.add(i[9])}if(!n.size)return!1;for(let o of pr(e.pid)){let s=[];try{s=M.readdirSync(`/proc/${o.pid}/fd`)}catch{continue}for(let i of s)try{let a=M.readlinkSync(`/proc/${o.pid}/fd/${i}`),l=/^socket:\[(\d+)\]$/.exec(a);if(l&&n.has(l[1]))return!0}catch{}}return!1}catch{return!1}if(process.platform==="darwin"){let r=ct("lsof",["-nP","-a","-p",String(e.pid),`-iTCP:${t}`,"-sTCP:LISTEN","-t"],{encoding:"utf8",timeout:2e3});return r.status===0&&String(r.stdout||"").trim().split(/\s+/).includes(String(e.pid))}if(process.platform==="win32"){let r=ct("netstat.exe",["-ano","-p","tcp"],{encoding:"utf8",timeout:2e3,windowsHide:!0});return String(r.stdout||"").split(`
270
270
  `).some(n=>{let o=n.trim().split(/\s+/);return o[0]==="TCP"&&o[1]?.endsWith(`:${t}`)&&o[3]==="LISTENING"&&o[4]===String(e.pid)})}return!1}function ep(e,t){if(process.platform!=="linux"||!e?.pid||!t)return!1;try{let r=pr(e.pid),n=`/sandbox/runtime/${$.basename(t)}`,o=new Set;for(let s of r){let i;try{i=M.readFileSync(`/proc/${s.pid}/net/unix`,"utf8")}catch{continue}for(let a of i.split(`
271
- `)){let l=a.trim().split(/\s+/),u=l.at(-1);if(u!==t&&u!==n)continue;let c=l[6];/^\d+$/.test(c||"")&&o.add(c)}}if(!o.size)return!1;for(let s of r){let i=[];try{i=M.readdirSync(`/proc/${s.pid}/fd`)}catch{continue}for(let a of i)try{let l=/^socket:\[(\d+)\]$/.exec(M.readlinkSync(`/proc/${s.pid}/fd/${a}`));if(l&&o.has(l[1]))return!0}catch{}}}catch{}return!1}function tp(e,t,r){return new Promise((n,o)=>{let s=Ln.request({socketPath:e,path:t,method:"GET",signal:r,headers:{host:"127.0.0.1:9224"}},i=>{let a="";i.setEncoding("utf8"),i.on("data",l=>{a.length<64e3&&(a+=l)}),i.on("end",()=>{if((i.statusCode||500)>=400)return o(new Error(`CDP returned ${i.statusCode}`));try{n(JSON.parse(a))}catch(l){o(l)}})});s.once("error",o),s.end()})}async function rp(e,t,r,n=15e3){let o=Date.now()+n;for(;Date.now()<o;){if(r?.aborted||t.exitCode!=null||t.signalCode!=null||t.killed)return null;try{if(!ep(t,e))throw new Error("CDP socket is not owned");let s=await tp(e,"/json/version",r);if(/^ws:\/\/(?:127\.0\.0\.1|0\.0\.0\.0|localhost):9224\/devtools\/browser\/[A-Za-z0-9-]+$/.test(s?.webSocketDebuggerUrl||""))return s}catch{}try{await aa(50,r)}catch{return null}}return null}async function np(e,t,r={}){if(String(e.ORACLE_BROWSER_CDP_URL||"").trim())return{ok:!1,error:"ORACLE_BROWSER_CDP_URL is unsupported: Oracle must launch Chromium with its mandatory SSRF proxy"};let o=oa(r.taskId||"default"),s=at.get(o);if(s)return s.promise;let i=F.get(o);if(i?.child&&i.child.exitCode==null&&i.child.signalCode==null&&!i.child.killed)return Pn(o),{ok:!0,cdpUrl:i.cdpUrl,cdpSocket:i.cdpSocket,managed:!0,key:o};let a=new AbortController,l=r.ownerTaskId||r.taskId||"default",u=()=>a.abort();r.signal?.addEventListener("abort",u,{once:!0}),r.signal?.aborted&&a.abort();let c={controller:a,ownerTaskId:l,promise:null};c.promise=(async()=>{let d=String(r.executablePath||e.ORACLE_CHROMIUM_PATH||"").trim()||qi(e);if(!d||!$.isAbsolute(d)||!dr(d))return{ok:!1,error:"Browser Use needs Chromium. Set ORACLE_CHROMIUM_PATH to an absolute executable path."};let p;try{p=await(r.startProxyFn||Wd)(r.proxyOptions)}catch{return a.signal.aborted?le():{ok:!1,error:"mandatory Oracle browser SSRF proxy failed to start"}}if(a.signal.aborted)return Ue(p),le();let f;try{f=await(r.startProxyRelayFn||((S,v)=>na(S,v,"proxy")))(p.url,t.BH_RUNTIME_DIR)}catch{return Ue(p),a.signal.aborted?le():{ok:!1,error:"isolated Chromium proxy relay failed to start"}}if(a.signal.aborted)return f.close(),Ue(p),le();let m=M.mkdtempSync($.join(t.HOME,"chromium-profile-"));M.chmodSync(m,448);let h=$.join(t.BH_RUNTIME_DIR,`chromium-cdp-${Zi(12).toString("hex")}.sock`);try{M.rmSync(h,{force:!0})}catch{}let E=["--headless=new","--remote-debugging-port=9224","--remote-debugging-address=0.0.0.0",`--user-data-dir=${m}`,"--disable-dev-shm-usage","--disable-extensions","--disable-background-networking","--disable-sync","--disable-translate","--proxy-server=http://0.0.0.0:9223","--proxy-bypass-list=<-loopback>","--mute-audio","--no-first-run","--no-default-browser-check","about:blank"],y=Fd(d,m,t,E,f.socketPath,h,e);if(!y.ok)return f.close(),Ue(p),y;let w=Un(y.command,y.argv,{env:t,cwd:t.BH_AGENT_WORKSPACE,mode:"ignore",processGroup:!0,spawnFn:r.browserSpawnFn,spawnOptions:{env:t,stdio:"ignore",detached:!1,windowsHide:!0}}),b=w.child;if(!b||typeof b.once!="function")return f.close(),Ue(p),{ok:!1,error:"failed to create managed Chromium process"};let g={child:b,cdpUrl:null,cdpSocket:h,proxy:p,proxyRelay:f,owned:w.owned,activeRuns:0,idleTimeoutMs:Number(r.idleTimeoutMs)||ra,ownerTaskId:l,launching:!0};F.set(o,g),Wi||(Wi=!0,process.once("exit",Xd)),b.once("exit",()=>{F.get(o)?.child===b&&ce(o).catch(()=>{})});let _=null;if(r.readDevToolsEndpointFn){let S=await Zd(m,b,r,a.signal);if(!S||a.signal.aborted||F.get(o)!==g||!Yi(b,y.profileArg))return F.get(o)===g?await ce(o):(Nt(b,"SIGTERM",w.owned),f.close(),Ue(p)),a.signal.aborted?le():{ok:!1,error:"managed Chromium did not expose an owned CDP endpoint"};if(!(r.verifyCdpOwnerFn||Qd)(b,S.port))return F.get(o)===g&&await ce(o),{ok:!1,error:"managed Chromium CDP listener is not owned by the launched process tree"};_=`http://127.0.0.1:${S.port}`;try{let C=await(r.fetchImpl||fetch)(`${_}/json/version`,{signal:AbortSignal.timeout(1e3)});if((C?.ok&&typeof C.json=="function"?await C.json():null)?.webSocketDebuggerUrl!==`ws://127.0.0.1:${S.port}${S.wsPath}`)throw new Error("CDP identity mismatch")}catch{return F.get(o)===g&&await ce(o),{ok:!1,error:"managed Chromium CDP identity verification failed"}}}else{if(!await rp(h,b,a.signal,Number(r.launchTimeoutMs)||15e3))return F.get(o)===g&&await ce(o),a.signal.aborted?le():{ok:!1,error:"managed Chromium did not expose an owned private CDP socket"};if(a.signal.aborted||F.get(o)!==g)return F.get(o)===g&&await ce(o),le();if(!Yi(b,y.profileArg))return F.get(o)===g&&await ce(o),{ok:!1,error:"private CDP socket is not bound to the launched Chromium process tree"}}return a.signal.aborted||F.get(o)!==g?(F.get(o)===g&&await ce(o),le()):(g.cdpUrl=_,g.launching=!1,Pn(o),{ok:!0,cdpUrl:_,cdpSocket:h,managed:!0,key:o})})(),at.set(o,c);try{return await c.promise}finally{r.signal?.removeEventListener("abort",u),at.get(o)===c&&at.delete(o)}}function Ji(e){let t=Number(e),r=Number.isFinite(t)?Math.trunc(t):$n;return Math.max(Id,Math.min(ta,r))*1e3}function op(e,t,r={}){return new Promise(n=>{if(r.signal?.aborted){n({error:Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"})});return}let o,s=!1;try{let h=Un(e,t,{cwd:r.cwd,env:r.env,mode:"pipe",input:r.input,spawnFn:r.spawnFn,spawnOptions:{cwd:r.cwd,env:r.env,windowsHide:!0,stdio:["pipe","pipe","pipe"]}});o=h.child,s=h.owned}catch(h){n({error:h});return}if(!o||typeof o.once!="function"){n({error:new Error("CLI spawn did not return a ChildProcess")});return}let i="",a="",l=!1,u,c,d=null,p=h=>{l||(l=!0,u&&clearTimeout(u),c&&clearTimeout(c),r.signal?.removeEventListener("abort",m),n(h))},f=h=>{d||(d=h,Nt(o,"SIGKILL",s),c=setTimeout(()=>p({error:Object.assign(new Error("browser_exec process tree did not reap"),{code:"EREAP"}),stdout:i,stderr:a}),3e3),c.unref?.())},m=()=>f(Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"}));o.stdout?.on("data",h=>{i.length<In&&(i+=String(h).slice(0,In-i.length))}),o.stderr?.on("data",h=>{a.length<Nn&&(a+=String(h).slice(0,Nn-a.length))}),o.once("error",h=>p({error:h,stdout:i,stderr:a})),o.once("close",(h,E)=>p(d?{error:d,stdout:i,stderr:a}:{status:h,signal:E,stdout:i,stderr:a})),u=setTimeout(()=>f(Object.assign(new Error("timed out"),{code:"ETIMEDOUT"})),r.timeout),u.unref?.(),r.signal?.aborted?m():r.signal?.addEventListener("abort",m,{once:!0}),o.stdin?.end(r.input)})}async function ca(e={},t={}){let r=t.env||process.env;if(!jn(r))return{ok:!1,error:"browser_exec is disabled. Set ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use. Oracle runs an AST-bounded browser-helper subset, not terminal-equivalent Python."};if(t.signal?.aborted)return le();let n=String(e.code||""),o=String(e.session||"").trim();if(o&&!Rd.test(o))return{ok:!1,error:"session must be 1-64 letters, digits, dashes, or underscores"};let s=zd(n,{env:r,python:t.python,spawnFn:t.validatorSpawnFn});if(!s.ok)return s;let i=jd(r);if(!i.ok)return i;let a=`${t.taskId||"default"}--${o||"default"}`,l=Gd(r,a);l.BU_NAME=`oracle-${Mn("sha256").update(a).digest("hex").slice(0,12)}`;let u={...t,taskId:a,ownerTaskId:t.taskId||"default",cli:i},c=t.ensureBrowserFn?await t.ensureBrowserFn(r,l,u):await np(r,l,u);if(!c?.ok)return c||{ok:!1,error:"Browser Use backend failed to initialize"};if(t.signal?.aborted)return le();l.BU_CDP_URL="http://0.0.0.0:9222";let d;if(c.cdpSocket)d={socketPath:c.cdpSocket,close(){}};else try{d=await(t.startCdpRelayFn||Dd)(c.cdpUrl,l.BH_RUNTIME_DIR)}catch{return{ok:!1,error:"isolated CDP relay failed to start"}}if(t.signal?.aborted)return d.close(),le();let p=Ud(i,l,d.socketPath,r);if(!p.ok)return d.close(),p;c.key&&Yd(c.key);let f;try{f=await op(p.command,p.argv,{spawnFn:t.cliSpawnFn,input:n,timeout:Ji(e.timeout_s),cwd:l.BH_AGENT_WORKSPACE,env:l,signal:t.signal})}finally{d.close(),c.key&&Jd(c.key)}if(f.error){let y=f.error.code==="ETIMEDOUT"?`browser_exec timed out after ${Ji(e.timeout_s)/1e3}s`:`browser_exec failed to launch: ${f.error.message||f.error}`;return{ok:!1,error:L(y,{force:!0})}}let m=typeof f.status=="number"?f.status:1,h=L(String(f.stdout||"").slice(0,In),{force:!0}),E=L(String(f.stderr||"").slice(0,Nn),{force:!0});return{ok:m===0,status:m,stdout:h,stderr:E||void 0,workspace:l.BH_AGENT_WORKSPACE,session:o||void 0}}var la=Object.freeze([{type:"function",function:{name:"browser_exec",description:"Drive Browser Use CLI 3.0 with several browser actions in one persistent call. Oracle accepts only AST-bounded helper Python: literal-public-URL new_tab/goto_url, wait_for_load, page_info, literal fill_input, literal click_at_xy, ensure_real_tab, and print. No variables, imports, attributes, filesystem, subprocess, arbitrary JavaScript, raw CDP, or dynamic URLs. Requires ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use.",parameters:{type:"object",properties:{code:{type:"string",description:"Bounded Python using approved pre-imported Browser Use helpers. Begin with a short comment describing the step."},session:{type:"string",description:"Optional persistent session name: 1-64 letters, digits, dashes, or underscores."},timeout_s:{type:"integer",description:`Timeout in seconds (default ${$n}, maximum ${ta}).`,default:$n}},required:["code"],additionalProperties:!1}}}]);import{spawnSync as sp}from"node:child_process";import ua from"node:fs";import Dn from"node:path";var fa=45e3,ip=4e4,ap=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),cp=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),da=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);function lp(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function pa(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function up(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return Dn.isAbsolute(t)?ua.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split(Dn.delimiter)){if(!n)continue;let o=Dn.join(n,"xurl");try{if(ua.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function fp(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function dp(e){for(let t of e){let r=String(t);if(da.includes(r))return r;if(da.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function pp(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(l=>String(l));else{let l=String(e.command||e.cmd||"").trim();if(!l)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(c=>String(c)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];l==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(l==="timeline"||l==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[l,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let l of r)if(String(l).length>4e3)return{ok:!1,error:"argument too long"};let n=dp(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(l=>String(l).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!pa(t)&&r.some(l=>/^-X$/.test(l)||/^--request$/.test(l))){let l=r.findIndex(c=>c==="-X"||c==="--request"),u=String(r[l+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!ap.includes(o))if(cp.includes(o)){if(!pa(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let s=[...r],i=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(i&&!s.includes("--app")&&s.unshift("--app",i),a&&!s.includes("--username")&&!s.includes("-u")){let l=0;s[0]==="--app"&&(l=2),l<s.length&&s.splice(l+1,0,"-u",a)}return{ok:!0,argv:s,command:o}}async function ma(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!lp(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=pp(t,n);if(!o.ok)return o;let s=up(n);if(!s.ok)return s;let a=(r.spawnFn||sp)(s.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||fa,maxBuffer:1024*1024,env:fp(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||fa}ms`:String(a.error.message||a.error);return{ok:!1,error:L(d,{force:!0})}}let l=L(String(a.stdout||"").slice(0,ip),{force:!0}),u=L(String(a.stderr||"").slice(0,2e3),{force:!0}),c=typeof a.status=="number"?a.status:1;return{ok:c===0,status:c,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:l,stderr:u||void 0}}var ha=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}]);import mp from"node:fs";import hp from"node:path";var gp="knowledge",yp="corpus.json",Gn=["canonical","historical","methodology","live-required"],ya=new Set(Gn),Bn=200,Hn=1,zn=10,ba=5,ga=240,Oe={idExact:100,titleExact:60,titleSubstring:30,titleToken:12,taxonomyToken:8,keywordToken:6,summaryToken:2,summarySubstring:3},Fe=null;function bp(){return hp.join(Se(gp,import.meta.url),yp)}function lt(e){return typeof e=="string"&&e.trim().length>0}function Fn(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function xp(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let{id:t,title:r,kind:n,taxonomyIds:o,keywords:s,summary:i,canonicalUrls:a,sourceTier:l,updateCadence:u,liveDataRequired:c}=e;if(!lt(t)||!lt(r)||!ya.has(n)||!Fn(o)||!Fn(s)||!lt(i)||!Fn(a)||a.length===0||!Number.isInteger(l)||l<0||l>4||!lt(u)||typeof c!="boolean"||n==="live-required"!==c)return null;try{if(a.some(d=>new URL(d).protocol!=="https:"))return null}catch{return null}return{id:t.trim(),title:r.trim(),kind:n,taxonomyIds:o.map(d=>d.trim()).filter(Boolean),keywords:s.map(d=>d.trim()).filter(Boolean),summary:i.trim(),canonicalUrls:a.map(d=>d.trim()),sourceTier:l,updateCadence:u.trim(),liveDataRequired:c}}function _p(e){if(Array.isArray(e))return e;if(e&&typeof e=="object"){if(Array.isArray(e.records))return e.records;if(Array.isArray(e.corpus))return e.corpus}return null}function wp(e={}){let t=e&&typeof e=="object"?e:{},r=lt(t.corpusPath)?t.corpusPath:bp();if(!t.forceReload&&Fe&&Fe.path===r)return Fe.result;let n;try{n=mp.readFileSync(r,"utf8")}catch(c){let d={ok:!1,error:`could not read knowledge corpus: ${c.code||c.message}`,records:[]};return Fe={path:r,result:d},d}let o;try{o=JSON.parse(n)}catch(c){let d={ok:!1,error:`knowledge corpus is not valid JSON: ${c.message}`,records:[]};return Fe={path:r,result:d},d}let s=_p(o);if(!s){let c={ok:!1,error:"knowledge corpus must be an array of records, or an object with a records[] array",records:[]};return Fe={path:r,result:c},c}let i=[],a=new Set,l=0;for(let c of s){let d=xp(c);if(!d||a.has(d.id)){l+=1;continue}a.add(d.id),i.push(d)}i.sort((c,d)=>c.id<d.id?-1:c.id>d.id?1:0);let u={ok:!0,records:i,skipped:l,path:r};return Fe={path:r,result:u},u}function qn(e){return String(e||"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function Kn(e){return String(e||"").split(".").map(t=>t.trim().toLowerCase()).filter(Boolean)}function Sp(e,t){let r=Kn(t);return r.length===0?!0:e.some(n=>{let o=Kn(n);return o.length<r.length?!1:r.every((s,i)=>o[i]===s)})}function kp(e,t,r){let n=0,o=e.id.toLowerCase(),s=e.title.toLowerCase(),i=e.summary.toLowerCase();o===t&&(n+=Oe.idExact),s===t?n+=Oe.titleExact:t&&s.includes(t)&&(n+=Oe.titleSubstring),t&&i.includes(t)&&(n+=Oe.summarySubstring);let a=new Set(qn(e.title)),l=new Set(e.taxonomyIds.flatMap(c=>Kn(c))),u=new Set(e.keywords.flatMap(c=>qn(c)));for(let c of r)a.has(c)&&(n+=Oe.titleToken),l.has(c)&&(n+=Oe.taxonomyToken),u.has(c)&&(n+=Oe.keywordToken),i.includes(c)&&(n+=Oe.summaryToken);return n}function Ep(e){return e.length<=ga?e:`${e.slice(0,ga)}\u2026`}function Ap(e={},t={}){let r=e&&typeof e=="object"?e:{},n=new Set(["query","topK","taxonomyPrefix","kinds"]);if(Object.keys(r).some(m=>!n.has(m)))return{ok:!1,error:"unexpected knowledge_search argument"};if(!lt(r.query))return{ok:!1,error:"query is required"};let o=r.query.trim().replace(/\s+/g," ");if(!o)return{ok:!1,error:"query is required"};if(o.length>Bn)return{ok:!1,error:`query length must not exceed ${Bn} characters`};let s=ba;if(r.topK!==void 0&&r.topK!==null){let m=r.topK;if(typeof m!="number"||!Number.isInteger(m)||m<Hn||m>zn)return{ok:!1,error:`topK must be an integer between ${Hn} and ${zn}`};s=m}let i=null;if(r.kinds!==void 0&&r.kinds!==null){if(!Array.isArray(r.kinds)||r.kinds.length===0||r.kinds.some(m=>!ya.has(m)))return{ok:!1,error:`kinds must be a non-empty array drawn from ${Gn.join(", ")}`};i=new Set(r.kinds)}let a="";if(r.taxonomyPrefix!==void 0&&r.taxonomyPrefix!==null){if(typeof r.taxonomyPrefix!="string")return{ok:!1,error:"taxonomyPrefix must be a string"};a=r.taxonomyPrefix.trim()}let l=wp(t);if(!l.ok)return{ok:!1,error:l.error};let u=o.toLowerCase(),c=[...new Set(qn(o))],d=[];for(let m of l.records){if(i&&!i.has(m.kind)||a&&!Sp(m.taxonomyIds,a))continue;let h=kp(m,u,c);h<=0||d.push({record:m,score:h})}d.sort((m,h)=>h.score!==m.score?h.score-m.score:m.record.id<h.record.id?-1:m.record.id>h.record.id?1:0);let p=d.slice(0,s).map(({record:m,score:h})=>({id:m.id,title:m.title,kind:m.kind,taxonomyIds:m.taxonomyIds,summary:Ep(m.summary),canonicalUrls:m.canonicalUrls,sourceTier:m.sourceTier,updateCadence:m.updateCadence,liveDataRequired:m.liveDataRequired,score:h})),f={ok:!0,query:o,results:p,count:p.length};return p.some(m=>m.liveDataRequired)&&(f.warning="one or more results require live data; treat their content as potentially stale until confirmed with a live lookup"),f}function xa(e,t={},r={}){return e==="knowledge_search"?Ap(t,r):{ok:!1,error:`unknown tool: ${e}`}}var _a=[{type:"function",function:{name:"knowledge_search",description:"Read-only search over the local, offline knowledge corpus by keyword or topic. Deterministic lexical search over canonical, historical, methodology, and live-required records. Results of kind live-required need a live lookup to confirm current state before being relied on.",parameters:{type:"object",properties:{query:{type:"string",description:`Search text (max ${Bn} chars)`},topK:{type:"integer",minimum:Hn,maximum:zn,description:`Maximum results to return (default ${ba})`},taxonomyPrefix:{type:"string",description:"Restrict results to records whose taxonomy ids fall under this dot-separated prefix"},kinds:{type:"array",items:{type:"string",enum:Gn},description:"Restrict results to these record kinds"}},required:["query"],additionalProperties:!1}}}];import vp from"node:fs";import wa from"node:path";import{homedir as Op}from"node:os";var Tp=64*1024,Cp=64;function Rp(e=process.env.ORACLE_CONFIG_DIR||wa.join(Op(),".config","oracle")){return wa.join(e,"hooks.json")}function Wn(e={}){let t=e.path||Rp(e.configDir),r;try{r=vp.readFileSync(t,"utf8")}catch{return{source:"missing",pre_tool:[]}}if(r.length>Tp)return{source:"oversized",pre_tool:[],error:"hooks.json too large"};try{let n=JSON.parse(r),o=Array.isArray(n?.pre_tool)?n.pre_tool.slice(0,Cp):[],s=[];for(let i of o){if(!i||typeof i!="object")continue;let a=typeof i.match=="string"?i.match.trim():"";!a||a.length>128||i.decision==="deny"&&s.push({match:a,decision:"deny",reason:typeof i.reason=="string"?i.reason.slice(0,200):"denied by operator hook",server:typeof i.server=="string"?i.server.trim().slice(0,128):void 0})}return{source:"file",path:t,pre_tool:s}}catch(n){return{source:"invalid",pre_tool:[],error:n instanceof Error?n.message:String(n)}}}function Sa(e={},t=Wn()){try{if(t?.error&&t.source==="invalid")return{allow:!1,reason:`hooks.json invalid: ${t.error}`};if(t?.error&&t.source==="oversized")return{allow:!1,reason:"hooks.json oversized"};let r=typeof e.name=="string"?e.name:"";if(!r)return{allow:!1,reason:"hook check missing tool name"};let n=Array.isArray(t?.pre_tool)?t.pre_tool:[];for(let o of n)if(!(o.match!=="*"&&o.match!==r)&&!(o.server&&e?.args?.server!==o.server))return{allow:!1,reason:o.reason||`denied by hook (${o.match})`};return{allow:!0}}catch(r){return{allow:!1,reason:`hook engine failure: ${r instanceof Error?r.message:String(r)}`.slice(0,200)}}}import{homedir as Vn}from"node:os";import{join as Xn}from"node:path";var ka=process.env.ORACLE_PUBLIC_DESKTOP==="1",Lp=ka?process.env.ORACLE_CONFIG_DIR||Xn(Vn(),".config","oracle"):Xn(Vn(),".config","oracle"),Hy=ka?Lp:Xn(Vn(),".config","mad-desk");function Ip(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}var Np=["0","false","off","no"];function Ea(e,t,r=!0){let n=String(Ip(e,t,"")).trim().toLowerCase();return n===""?r:!Np.includes(n)}import{mkdir as Kp,chmod as mr,readFile as Gp,rename as Wp,writeFile as Vp}from"node:fs/promises";import{homedir as Xp}from"node:os";import{dirname as va,join as Jn}from"node:path";import Yp from"sql.js";import{wordlists as $p}from"ethers";var Pp=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Mp=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],jp=new Set([12,15,18,21,24]);function Up(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return jp.has(t.length)&&t.every(r=>$p.en.getWordIndex(r)>=0)}var Dp=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Fp=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Bp=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function Hp(e){let t=Aa(e);return Bp.has(t)||Fp.test(t)}var $t=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Aa(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function zp(e){let t=Aa(e);return[...Pp].some(r=>t.includes(r))}function qp(e,t,r){if(typeof t=="string"){if(Mp.some(n=>n.test(t))||Up(t))throw new $t(r);if(Dp.test(t)&&!Hp(e))throw new $t(r)}}function Yn(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return qp(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,s)=>Yn(o,`${t}[${s}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let s=`${t}.${o}`;if(zp(o))throw new $t(s);e[o]!==void 0&&(n[o]=Yn(e[o],s,o))}return n}function ut(e){return Yn(e)}var Zn=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),Jp=new Set(Zn),Zp=new Set(Zn.slice(0,-1).map((e,t)=>`${e}:${Zn[t+1]}`)),Qp=Jn(process.env.ORACLE_CONFIG_DIR||Jn(Xp(),".config","oracle"),"workspace"),em=Jn(Qp,"artifacts.sqlite");function yr(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(yr).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${yr(e[t])}`).join(",")}}`}function Oa(e){if(!Jp.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function hr(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function gr(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Ta(e={}){let t=e.path||em;await Kp(va(t),{recursive:!0,mode:448}),await mr(va(t),448);let r;try{r=await Gp(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Yp(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
271
+ `)){let l=a.trim().split(/\s+/),u=l.at(-1);if(u!==t&&u!==n)continue;let c=l[6];/^\d+$/.test(c||"")&&o.add(c)}}if(!o.size)return!1;for(let s of r){let i=[];try{i=M.readdirSync(`/proc/${s.pid}/fd`)}catch{continue}for(let a of i)try{let l=/^socket:\[(\d+)\]$/.exec(M.readlinkSync(`/proc/${s.pid}/fd/${a}`));if(l&&o.has(l[1]))return!0}catch{}}}catch{}return!1}function tp(e,t,r){return new Promise((n,o)=>{let s=Ln.request({socketPath:e,path:t,method:"GET",signal:r,headers:{host:"127.0.0.1:9224"}},i=>{let a="";i.setEncoding("utf8"),i.on("data",l=>{a.length<64e3&&(a+=l)}),i.on("end",()=>{if((i.statusCode||500)>=400)return o(new Error(`CDP returned ${i.statusCode}`));try{n(JSON.parse(a))}catch(l){o(l)}})});s.once("error",o),s.end()})}async function rp(e,t,r,n=15e3){let o=Date.now()+n;for(;Date.now()<o;){if(r?.aborted||t.exitCode!=null||t.signalCode!=null||t.killed)return null;try{if(!ep(t,e))throw new Error("CDP socket is not owned");let s=await tp(e,"/json/version",r);if(/^ws:\/\/(?:127\.0\.0\.1|0\.0\.0\.0|localhost):9224\/devtools\/browser\/[A-Za-z0-9-]+$/.test(s?.webSocketDebuggerUrl||""))return s}catch{}try{await aa(50,r)}catch{return null}}return null}async function np(e,t,r={}){if(String(e.ORACLE_BROWSER_CDP_URL||"").trim())return{ok:!1,error:"ORACLE_BROWSER_CDP_URL is unsupported: Oracle must launch Chromium with its mandatory SSRF proxy"};let o=oa(r.taskId||"default"),s=at.get(o);if(s)return s.promise;let i=F.get(o);if(i?.child&&i.child.exitCode==null&&i.child.signalCode==null&&!i.child.killed)return Pn(o),{ok:!0,cdpUrl:i.cdpUrl,cdpSocket:i.cdpSocket,managed:!0,key:o};let a=new AbortController,l=r.ownerTaskId||r.taskId||"default",u=()=>a.abort();r.signal?.addEventListener("abort",u,{once:!0}),r.signal?.aborted&&a.abort();let c={controller:a,ownerTaskId:l,promise:null};c.promise=(async()=>{let d=String(r.executablePath||e.ORACLE_CHROMIUM_PATH||"").trim()||qi(e);if(!d||!$.isAbsolute(d)||!dr(d))return{ok:!1,error:"Browser Use needs Chromium. Set ORACLE_CHROMIUM_PATH to an absolute executable path."};let p;try{p=await(r.startProxyFn||Wd)(r.proxyOptions)}catch{return a.signal.aborted?le():{ok:!1,error:"mandatory Oracle browser SSRF proxy failed to start"}}if(a.signal.aborted)return Ue(p),le();let f;try{f=await(r.startProxyRelayFn||((S,v)=>na(S,v,"proxy")))(p.url,t.BH_RUNTIME_DIR)}catch{return Ue(p),a.signal.aborted?le():{ok:!1,error:"isolated Chromium proxy relay failed to start"}}if(a.signal.aborted)return f.close(),Ue(p),le();let m=M.mkdtempSync($.join(t.HOME,"chromium-profile-"));M.chmodSync(m,448);let h=$.join(t.BH_RUNTIME_DIR,`chromium-cdp-${Zi(12).toString("hex")}.sock`);try{M.rmSync(h,{force:!0})}catch{}let E=["--headless=new","--remote-debugging-port=9224","--remote-debugging-address=0.0.0.0",`--user-data-dir=${m}`,"--disable-dev-shm-usage","--disable-extensions","--disable-background-networking","--disable-sync","--disable-translate","--proxy-server=http://0.0.0.0:9223","--proxy-bypass-list=<-loopback>","--mute-audio","--no-first-run","--no-default-browser-check","about:blank"],y=Fd(d,m,t,E,f.socketPath,h,e);if(!y.ok)return f.close(),Ue(p),y;let w=Un(y.command,y.argv,{env:t,cwd:t.BH_AGENT_WORKSPACE,mode:"ignore",processGroup:!0,spawnFn:r.browserSpawnFn,spawnOptions:{env:t,stdio:"ignore",detached:!1,windowsHide:!0}}),b=w.child;if(!b||typeof b.once!="function")return f.close(),Ue(p),{ok:!1,error:"failed to create managed Chromium process"};let g={child:b,cdpUrl:null,cdpSocket:h,proxy:p,proxyRelay:f,owned:w.owned,activeRuns:0,idleTimeoutMs:Number(r.idleTimeoutMs)||ra,ownerTaskId:l,launching:!0};F.set(o,g),Wi||(Wi=!0,process.once("exit",Xd)),b.once("exit",()=>{F.get(o)?.child===b&&ce(o).catch(()=>{})});let _=null;if(r.readDevToolsEndpointFn){let S=await Zd(m,b,r,a.signal);if(!S||a.signal.aborted||F.get(o)!==g||!Yi(b,y.profileArg))return F.get(o)===g?await ce(o):(Nt(b,"SIGTERM",w.owned),f.close(),Ue(p)),a.signal.aborted?le():{ok:!1,error:"managed Chromium did not expose an owned CDP endpoint"};if(!(r.verifyCdpOwnerFn||Qd)(b,S.port))return F.get(o)===g&&await ce(o),{ok:!1,error:"managed Chromium CDP listener is not owned by the launched process tree"};_=`http://127.0.0.1:${S.port}`;try{let C=await(r.fetchImpl||fetch)(`${_}/json/version`,{signal:AbortSignal.timeout(1e3)});if((C?.ok&&typeof C.json=="function"?await C.json():null)?.webSocketDebuggerUrl!==`ws://127.0.0.1:${S.port}${S.wsPath}`)throw new Error("CDP identity mismatch")}catch{return F.get(o)===g&&await ce(o),{ok:!1,error:"managed Chromium CDP identity verification failed"}}}else{if(!await rp(h,b,a.signal,Number(r.launchTimeoutMs)||15e3))return F.get(o)===g&&await ce(o),a.signal.aborted?le():{ok:!1,error:"managed Chromium did not expose an owned private CDP socket"};if(a.signal.aborted||F.get(o)!==g)return F.get(o)===g&&await ce(o),le();if(!Yi(b,y.profileArg))return F.get(o)===g&&await ce(o),{ok:!1,error:"private CDP socket is not bound to the launched Chromium process tree"}}return a.signal.aborted||F.get(o)!==g?(F.get(o)===g&&await ce(o),le()):(g.cdpUrl=_,g.launching=!1,Pn(o),{ok:!0,cdpUrl:_,cdpSocket:h,managed:!0,key:o})})(),at.set(o,c);try{return await c.promise}finally{r.signal?.removeEventListener("abort",u),at.get(o)===c&&at.delete(o)}}function Ji(e){let t=Number(e),r=Number.isFinite(t)?Math.trunc(t):$n;return Math.max(Id,Math.min(ta,r))*1e3}function op(e,t,r={}){return new Promise(n=>{if(r.signal?.aborted){n({error:Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"})});return}let o,s=!1;try{let h=Un(e,t,{cwd:r.cwd,env:r.env,mode:"pipe",input:r.input,spawnFn:r.spawnFn,spawnOptions:{cwd:r.cwd,env:r.env,windowsHide:!0,stdio:["pipe","pipe","pipe"]}});o=h.child,s=h.owned}catch(h){n({error:h});return}if(!o||typeof o.once!="function"){n({error:new Error("CLI spawn did not return a ChildProcess")});return}let i="",a="",l=!1,u,c,d=null,p=h=>{l||(l=!0,u&&clearTimeout(u),c&&clearTimeout(c),r.signal?.removeEventListener("abort",m),n(h))},f=h=>{d||(d=h,Nt(o,"SIGKILL",s),c=setTimeout(()=>p({error:Object.assign(new Error("browser_exec process tree did not reap"),{code:"EREAP"}),stdout:i,stderr:a}),3e3),c.unref?.())},m=()=>f(Object.assign(new Error("browser_exec aborted"),{code:"ABORT_ERR"}));o.stdout?.on("data",h=>{i.length<In&&(i+=String(h).slice(0,In-i.length))}),o.stderr?.on("data",h=>{a.length<Nn&&(a+=String(h).slice(0,Nn-a.length))}),o.once("error",h=>p({error:h,stdout:i,stderr:a})),o.once("close",(h,E)=>p(d?{error:d,stdout:i,stderr:a}:{status:h,signal:E,stdout:i,stderr:a})),u=setTimeout(()=>f(Object.assign(new Error("timed out"),{code:"ETIMEDOUT"})),r.timeout),u.unref?.(),r.signal?.aborted?m():r.signal?.addEventListener("abort",m,{once:!0}),o.stdin&&(o.stdin.on?.("error",h=>{l||h?.code==="EPIPE"||h?.code==="ECONNRESET"||p({error:h,stdout:i,stderr:a})}),o.stdin.end(r.input))})}async function ca(e={},t={}){let r=t.env||process.env;if(!jn(r))return{ok:!1,error:"browser_exec is disabled. Set ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use. Oracle runs an AST-bounded browser-helper subset, not terminal-equivalent Python."};if(t.signal?.aborted)return le();let n=String(e.code||""),o=String(e.session||"").trim();if(o&&!Rd.test(o))return{ok:!1,error:"session must be 1-64 letters, digits, dashes, or underscores"};let s=zd(n,{env:r,python:t.python,spawnFn:t.validatorSpawnFn});if(!s.ok)return s;let i=jd(r);if(!i.ok)return i;let a=`${t.taskId||"default"}--${o||"default"}`,l=Gd(r,a);l.BU_NAME=`oracle-${Mn("sha256").update(a).digest("hex").slice(0,12)}`;let u={...t,taskId:a,ownerTaskId:t.taskId||"default",cli:i},c=t.ensureBrowserFn?await t.ensureBrowserFn(r,l,u):await np(r,l,u);if(!c?.ok)return c||{ok:!1,error:"Browser Use backend failed to initialize"};if(t.signal?.aborted)return le();l.BU_CDP_URL="http://0.0.0.0:9222";let d;if(c.cdpSocket)d={socketPath:c.cdpSocket,close(){}};else try{d=await(t.startCdpRelayFn||Dd)(c.cdpUrl,l.BH_RUNTIME_DIR)}catch{return{ok:!1,error:"isolated CDP relay failed to start"}}if(t.signal?.aborted)return d.close(),le();let p=Ud(i,l,d.socketPath,r);if(!p.ok)return d.close(),p;c.key&&Yd(c.key);let f;try{f=await op(p.command,p.argv,{spawnFn:t.cliSpawnFn,input:n,timeout:Ji(e.timeout_s),cwd:l.BH_AGENT_WORKSPACE,env:l,signal:t.signal})}finally{d.close(),c.key&&Jd(c.key)}if(f.error){let y=f.error.code==="ETIMEDOUT"?`browser_exec timed out after ${Ji(e.timeout_s)/1e3}s`:`browser_exec failed to launch: ${f.error.message||f.error}`;return{ok:!1,error:L(y,{force:!0})}}let m=typeof f.status=="number"?f.status:1,h=L(String(f.stdout||"").slice(0,In),{force:!0}),E=L(String(f.stderr||"").slice(0,Nn),{force:!0});return{ok:m===0,status:m,stdout:h,stderr:E||void 0,workspace:l.BH_AGENT_WORKSPACE,session:o||void 0}}var la=Object.freeze([{type:"function",function:{name:"browser_exec",description:"Drive Browser Use CLI 3.0 with several browser actions in one persistent call. Oracle accepts only AST-bounded helper Python: literal-public-URL new_tab/goto_url, wait_for_load, page_info, literal fill_input, literal click_at_xy, ensure_real_tab, and print. No variables, imports, attributes, filesystem, subprocess, arbitrary JavaScript, raw CDP, or dynamic URLs. Requires ORACLE_BROWSER_ENABLED=true and ORACLE_BROWSER_BACKEND=browser-use.",parameters:{type:"object",properties:{code:{type:"string",description:"Bounded Python using approved pre-imported Browser Use helpers. Begin with a short comment describing the step."},session:{type:"string",description:"Optional persistent session name: 1-64 letters, digits, dashes, or underscores."},timeout_s:{type:"integer",description:`Timeout in seconds (default ${$n}, maximum ${ta}).`,default:$n}},required:["code"],additionalProperties:!1}}}]);import{spawnSync as sp}from"node:child_process";import ua from"node:fs";import Dn from"node:path";var fa=45e3,ip=4e4,ap=Object.freeze(["whoami","user","read","search","timeline","mentions","bookmarks","likes","following","followers","dms","auth"]),cp=Object.freeze(["post","reply","quote","delete","like","unlike","repost","unrepost","bookmark","unbookmark","follow","unfollow","block","unblock","mute","unmute","dm"]),da=Object.freeze(["--verbose","-v","--trace","-t","--bearer-token","--consumer-key","--consumer-secret","--access-token","--token-secret","--client-id","--client-secret"]);function lp(e=process.env){let t=String(e.ORACLE_XURL_ENABLED||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function pa(e=process.env){let t=String(e.ORACLE_XURL_ALLOW_WRITE||"").trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function up(e=process.env){let t=String(e.ORACLE_XURL_BIN||"").trim();if(t)return Dn.isAbsolute(t)?ua.existsSync(t)?{ok:!0,bin:t}:{ok:!1,error:`ORACLE_XURL_BIN not found: ${t}`}:{ok:!1,error:"ORACLE_XURL_BIN must be absolute"};let r=String(e.PATH||process.env.PATH||"");for(let n of r.split(Dn.delimiter)){if(!n)continue;let o=Dn.join(n,"xurl");try{if(ua.existsSync(o))return{ok:!0,bin:o}}catch{}}return{ok:!1,error:"xurl binary not found on PATH. Install: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash"}}function fp(e=process.env){let t=e.HOME||process.env.HOME||"";return{PATH:e.PATH||process.env.PATH||"/usr/bin:/bin",HOME:t,USER:e.USER||process.env.USER||"",LANG:e.LANG||process.env.LANG||"C.UTF-8",LC_ALL:e.LC_ALL||process.env.LC_ALL||"C.UTF-8",XDG_CONFIG_HOME:e.XDG_CONFIG_HOME||process.env.XDG_CONFIG_HOME||"",XDG_DATA_HOME:e.XDG_DATA_HOME||process.env.XDG_DATA_HOME||"",NO_COLOR:"1"}}function dp(e){for(let t of e){let r=String(t);if(da.includes(r))return r;if(da.some(n=>n.startsWith("--")&&r.startsWith(`${n}=`)))return r.split("=")[0]}return null}function pp(e={},t=process.env){let r;if(Array.isArray(e.argv))r=e.argv.map(l=>String(l));else{let l=String(e.command||e.cmd||"").trim();if(!l)return{ok:!1,error:"command is required (e.g. whoami, search, read, post)"};let u=Array.isArray(e.args)?e.args.map(c=>String(c)):typeof e.query=="string"?[e.query]:typeof e.text=="string"?[e.text]:typeof e.id=="string"?[e.id]:typeof e.handle=="string"?[e.handle]:[];l==="search"&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),(l==="timeline"||l==="mentions")&&e.limit!=null&&u.push("-n",String(Math.min(50,Math.max(1,Number(e.limit)||10)))),r=[l,...u]}if(r.length===0)return{ok:!1,error:"empty argv"};if(r.length>24)return{ok:!1,error:"too many arguments"};for(let l of r)if(String(l).length>4e3)return{ok:!1,error:"argument too long"};let n=dp(r);if(n)return{ok:!1,error:`forbidden flag: ${n}`};if(r.some(l=>String(l).includes("\0")))return{ok:!1,error:"nul byte in argv"};let o=String(r[0]||"").replace(/^\//,"");if(o.startsWith("2/")||r[0].startsWith("/2/")||r[0].startsWith("https://api.x.com/")){if(!pa(t)&&r.some(l=>/^-X$/.test(l)||/^--request$/.test(l))){let l=r.findIndex(c=>c==="-X"||c==="--request"),u=String(r[l+1]||"GET").toUpperCase();if(u!=="GET"&&u!=="HEAD")return{ok:!1,error:"raw non-GET requires ORACLE_XURL_ALLOW_WRITE=true"}}}else if(o==="auth"){if(String(r[1]||"")!=="status")return{ok:!1,error:"only `auth status` is allowed (no apps add / oauth2 from the agent)"}}else if(!ap.includes(o))if(cp.includes(o)){if(!pa(t))return{ok:!1,error:`write command '${o}' requires ORACLE_XURL_ALLOW_WRITE=true`}}else return o==="media"?{ok:!1,error:"media upload is disabled in the agent tool (run xurl media outside the agent)"}:{ok:!1,error:`command not allowlisted: ${o}`};let s=[...r],i=String(t.ORACLE_XURL_APP||"").trim(),a=String(t.ORACLE_XURL_USER||"").trim();if(i&&!s.includes("--app")&&s.unshift("--app",i),a&&!s.includes("--username")&&!s.includes("-u")){let l=0;s[0]==="--app"&&(l=2),l<s.length&&s.splice(l+1,0,"-u",a)}return{ok:!0,argv:s,command:o}}async function ma(e,t={},r={}){if(e!=="xurl")return{ok:!1,error:`unknown tool: ${e}`};let n=r.env||process.env;if(!lp(n))return{ok:!1,error:"xurl is disabled. Set ORACLE_XURL_ENABLED=true after `xurl auth status` succeeds. Writes stay off until ORACLE_XURL_ALLOW_WRITE=true."};let o=pp(t,n);if(!o.ok)return o;let s=up(n);if(!s.ok)return s;let a=(r.spawnFn||sp)(s.bin,o.argv,{encoding:"utf8",timeout:r.timeoutMs||fa,maxBuffer:1024*1024,env:fp(n)});if(a.error){let d=a.error.code==="ETIMEDOUT"?`xurl timed out after ${r.timeoutMs||fa}ms`:String(a.error.message||a.error);return{ok:!1,error:L(d,{force:!0})}}let l=L(String(a.stdout||"").slice(0,ip),{force:!0}),u=L(String(a.stderr||"").slice(0,2e3),{force:!0}),c=typeof a.status=="number"?a.status:1;return{ok:c===0,status:c,command:o.command,argv:o.argv.map(d=>/=/.test(d)&&/token|secret|key|bearer/i.test(d)?"[redacted-arg]":d),stdout:l,stderr:u||void 0}}var ha=Object.freeze([{type:"function",function:{name:"xurl",description:"Call the official xurl CLI against the X API with an allowlisted command. Reads (whoami/user/read/search/timeline/mentions/...) work when ORACLE_XURL_ENABLED=true. Writes (post/reply/like/follow/dm/...) also need ORACLE_XURL_ALLOW_WRITE=true. Never pass secrets or --verbose. Auth is whatever the operator configured in ~/.xurl.",parameters:{type:"object",properties:{command:{type:"string",description:"xurl subcommand: whoami, user, read, search, timeline, mentions, post, reply, ..."},args:{type:"array",items:{type:"string"},description:"Positional args after the command (query, id, handle, text)."},query:{type:"string",description:"Convenience for search query."},text:{type:"string",description:"Convenience for post/reply/dm text."},id:{type:"string",description:"Convenience for read/like/reply target id or URL."},handle:{type:"string",description:"Convenience for user/follow/dm handle."},limit:{type:"integer",description:"Result limit for search/timeline/mentions (1-50)."},argv:{type:"array",items:{type:"string"},description:"Raw argv alternative (still allowlisted + flag-filtered)."}},additionalProperties:!1}}}]);import mp from"node:fs";import hp from"node:path";var gp="knowledge",yp="corpus.json",Gn=["canonical","historical","methodology","live-required"],ya=new Set(Gn),Bn=200,Hn=1,zn=10,ba=5,ga=240,Oe={idExact:100,titleExact:60,titleSubstring:30,titleToken:12,taxonomyToken:8,keywordToken:6,summaryToken:2,summarySubstring:3},Fe=null;function bp(){return hp.join(Se(gp,import.meta.url),yp)}function lt(e){return typeof e=="string"&&e.trim().length>0}function Fn(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function xp(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let{id:t,title:r,kind:n,taxonomyIds:o,keywords:s,summary:i,canonicalUrls:a,sourceTier:l,updateCadence:u,liveDataRequired:c}=e;if(!lt(t)||!lt(r)||!ya.has(n)||!Fn(o)||!Fn(s)||!lt(i)||!Fn(a)||a.length===0||!Number.isInteger(l)||l<0||l>4||!lt(u)||typeof c!="boolean"||n==="live-required"!==c)return null;try{if(a.some(d=>new URL(d).protocol!=="https:"))return null}catch{return null}return{id:t.trim(),title:r.trim(),kind:n,taxonomyIds:o.map(d=>d.trim()).filter(Boolean),keywords:s.map(d=>d.trim()).filter(Boolean),summary:i.trim(),canonicalUrls:a.map(d=>d.trim()),sourceTier:l,updateCadence:u.trim(),liveDataRequired:c}}function _p(e){if(Array.isArray(e))return e;if(e&&typeof e=="object"){if(Array.isArray(e.records))return e.records;if(Array.isArray(e.corpus))return e.corpus}return null}function wp(e={}){let t=e&&typeof e=="object"?e:{},r=lt(t.corpusPath)?t.corpusPath:bp();if(!t.forceReload&&Fe&&Fe.path===r)return Fe.result;let n;try{n=mp.readFileSync(r,"utf8")}catch(c){let d={ok:!1,error:`could not read knowledge corpus: ${c.code||c.message}`,records:[]};return Fe={path:r,result:d},d}let o;try{o=JSON.parse(n)}catch(c){let d={ok:!1,error:`knowledge corpus is not valid JSON: ${c.message}`,records:[]};return Fe={path:r,result:d},d}let s=_p(o);if(!s){let c={ok:!1,error:"knowledge corpus must be an array of records, or an object with a records[] array",records:[]};return Fe={path:r,result:c},c}let i=[],a=new Set,l=0;for(let c of s){let d=xp(c);if(!d||a.has(d.id)){l+=1;continue}a.add(d.id),i.push(d)}i.sort((c,d)=>c.id<d.id?-1:c.id>d.id?1:0);let u={ok:!0,records:i,skipped:l,path:r};return Fe={path:r,result:u},u}function qn(e){return String(e||"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function Kn(e){return String(e||"").split(".").map(t=>t.trim().toLowerCase()).filter(Boolean)}function Sp(e,t){let r=Kn(t);return r.length===0?!0:e.some(n=>{let o=Kn(n);return o.length<r.length?!1:r.every((s,i)=>o[i]===s)})}function kp(e,t,r){let n=0,o=e.id.toLowerCase(),s=e.title.toLowerCase(),i=e.summary.toLowerCase();o===t&&(n+=Oe.idExact),s===t?n+=Oe.titleExact:t&&s.includes(t)&&(n+=Oe.titleSubstring),t&&i.includes(t)&&(n+=Oe.summarySubstring);let a=new Set(qn(e.title)),l=new Set(e.taxonomyIds.flatMap(c=>Kn(c))),u=new Set(e.keywords.flatMap(c=>qn(c)));for(let c of r)a.has(c)&&(n+=Oe.titleToken),l.has(c)&&(n+=Oe.taxonomyToken),u.has(c)&&(n+=Oe.keywordToken),i.includes(c)&&(n+=Oe.summaryToken);return n}function Ep(e){return e.length<=ga?e:`${e.slice(0,ga)}\u2026`}function Ap(e={},t={}){let r=e&&typeof e=="object"?e:{},n=new Set(["query","topK","taxonomyPrefix","kinds"]);if(Object.keys(r).some(m=>!n.has(m)))return{ok:!1,error:"unexpected knowledge_search argument"};if(!lt(r.query))return{ok:!1,error:"query is required"};let o=r.query.trim().replace(/\s+/g," ");if(!o)return{ok:!1,error:"query is required"};if(o.length>Bn)return{ok:!1,error:`query length must not exceed ${Bn} characters`};let s=ba;if(r.topK!==void 0&&r.topK!==null){let m=r.topK;if(typeof m!="number"||!Number.isInteger(m)||m<Hn||m>zn)return{ok:!1,error:`topK must be an integer between ${Hn} and ${zn}`};s=m}let i=null;if(r.kinds!==void 0&&r.kinds!==null){if(!Array.isArray(r.kinds)||r.kinds.length===0||r.kinds.some(m=>!ya.has(m)))return{ok:!1,error:`kinds must be a non-empty array drawn from ${Gn.join(", ")}`};i=new Set(r.kinds)}let a="";if(r.taxonomyPrefix!==void 0&&r.taxonomyPrefix!==null){if(typeof r.taxonomyPrefix!="string")return{ok:!1,error:"taxonomyPrefix must be a string"};a=r.taxonomyPrefix.trim()}let l=wp(t);if(!l.ok)return{ok:!1,error:l.error};let u=o.toLowerCase(),c=[...new Set(qn(o))],d=[];for(let m of l.records){if(i&&!i.has(m.kind)||a&&!Sp(m.taxonomyIds,a))continue;let h=kp(m,u,c);h<=0||d.push({record:m,score:h})}d.sort((m,h)=>h.score!==m.score?h.score-m.score:m.record.id<h.record.id?-1:m.record.id>h.record.id?1:0);let p=d.slice(0,s).map(({record:m,score:h})=>({id:m.id,title:m.title,kind:m.kind,taxonomyIds:m.taxonomyIds,summary:Ep(m.summary),canonicalUrls:m.canonicalUrls,sourceTier:m.sourceTier,updateCadence:m.updateCadence,liveDataRequired:m.liveDataRequired,score:h})),f={ok:!0,query:o,results:p,count:p.length};return p.some(m=>m.liveDataRequired)&&(f.warning="one or more results require live data; treat their content as potentially stale until confirmed with a live lookup"),f}function xa(e,t={},r={}){return e==="knowledge_search"?Ap(t,r):{ok:!1,error:`unknown tool: ${e}`}}var _a=[{type:"function",function:{name:"knowledge_search",description:"Read-only search over the local, offline knowledge corpus by keyword or topic. Deterministic lexical search over canonical, historical, methodology, and live-required records. Results of kind live-required need a live lookup to confirm current state before being relied on.",parameters:{type:"object",properties:{query:{type:"string",description:`Search text (max ${Bn} chars)`},topK:{type:"integer",minimum:Hn,maximum:zn,description:`Maximum results to return (default ${ba})`},taxonomyPrefix:{type:"string",description:"Restrict results to records whose taxonomy ids fall under this dot-separated prefix"},kinds:{type:"array",items:{type:"string",enum:Gn},description:"Restrict results to these record kinds"}},required:["query"],additionalProperties:!1}}}];import vp from"node:fs";import wa from"node:path";import{homedir as Op}from"node:os";var Tp=64*1024,Cp=64;function Rp(e=process.env.ORACLE_CONFIG_DIR||wa.join(Op(),".config","oracle")){return wa.join(e,"hooks.json")}function Wn(e={}){let t=e.path||Rp(e.configDir),r;try{r=vp.readFileSync(t,"utf8")}catch{return{source:"missing",pre_tool:[]}}if(r.length>Tp)return{source:"oversized",pre_tool:[],error:"hooks.json too large"};try{let n=JSON.parse(r),o=Array.isArray(n?.pre_tool)?n.pre_tool.slice(0,Cp):[],s=[];for(let i of o){if(!i||typeof i!="object")continue;let a=typeof i.match=="string"?i.match.trim():"";!a||a.length>128||i.decision==="deny"&&s.push({match:a,decision:"deny",reason:typeof i.reason=="string"?i.reason.slice(0,200):"denied by operator hook",server:typeof i.server=="string"?i.server.trim().slice(0,128):void 0})}return{source:"file",path:t,pre_tool:s}}catch(n){return{source:"invalid",pre_tool:[],error:n instanceof Error?n.message:String(n)}}}function Sa(e={},t=Wn()){try{if(t?.error&&t.source==="invalid")return{allow:!1,reason:`hooks.json invalid: ${t.error}`};if(t?.error&&t.source==="oversized")return{allow:!1,reason:"hooks.json oversized"};let r=typeof e.name=="string"?e.name:"";if(!r)return{allow:!1,reason:"hook check missing tool name"};let n=Array.isArray(t?.pre_tool)?t.pre_tool:[];for(let o of n)if(!(o.match!=="*"&&o.match!==r)&&!(o.server&&e?.args?.server!==o.server))return{allow:!1,reason:o.reason||`denied by hook (${o.match})`};return{allow:!0}}catch(r){return{allow:!1,reason:`hook engine failure: ${r instanceof Error?r.message:String(r)}`.slice(0,200)}}}import{homedir as Vn}from"node:os";import{join as Xn}from"node:path";var ka=process.env.ORACLE_PUBLIC_DESKTOP==="1",Lp=ka?process.env.ORACLE_CONFIG_DIR||Xn(Vn(),".config","oracle"):Xn(Vn(),".config","oracle"),Hy=ka?Lp:Xn(Vn(),".config","mad-desk");function Ip(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}var Np=["0","false","off","no"];function Ea(e,t,r=!0){let n=String(Ip(e,t,"")).trim().toLowerCase();return n===""?r:!Np.includes(n)}import{mkdir as Kp,chmod as mr,readFile as Gp,rename as Wp,writeFile as Vp}from"node:fs/promises";import{homedir as Xp}from"node:os";import{dirname as va,join as Jn}from"node:path";import Yp from"sql.js";import{wordlists as $p}from"ethers";var Pp=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Mp=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],jp=new Set([12,15,18,21,24]);function Up(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return jp.has(t.length)&&t.every(r=>$p.en.getWordIndex(r)>=0)}var Dp=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,Fp=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Bp=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function Hp(e){let t=Aa(e);return Bp.has(t)||Fp.test(t)}var $t=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function Aa(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function zp(e){let t=Aa(e);return[...Pp].some(r=>t.includes(r))}function qp(e,t,r){if(typeof t=="string"){if(Mp.some(n=>n.test(t))||Up(t))throw new $t(r);if(Dp.test(t)&&!Hp(e))throw new $t(r)}}function Yn(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return qp(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,s)=>Yn(o,`${t}[${s}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let s=`${t}.${o}`;if(zp(o))throw new $t(s);e[o]!==void 0&&(n[o]=Yn(e[o],s,o))}return n}function ut(e){return Yn(e)}var Zn=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),Jp=new Set(Zn),Zp=new Set(Zn.slice(0,-1).map((e,t)=>`${e}:${Zn[t+1]}`)),Qp=Jn(process.env.ORACLE_CONFIG_DIR||Jn(Xp(),".config","oracle"),"workspace"),em=Jn(Qp,"artifacts.sqlite");function yr(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(yr).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${yr(e[t])}`).join(",")}}`}function Oa(e){if(!Jp.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function hr(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function gr(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function Ta(e={}){let t=e.path||em;await Kp(va(t),{recursive:!0,mode:448}),await mr(va(t),448);let r;try{r=await Gp(t)}catch(u){if(u.code!=="ENOENT")throw u}let n=await Yp(e.sqlJs||{}),o=r?new n.Database(r):new n.Database;o.run(`
272
272
  PRAGMA foreign_keys=ON;
273
273
  CREATE TABLE IF NOT EXISTS artifacts (
274
274
  id TEXT PRIMARY KEY, type TEXT NOT NULL, created_at TEXT NOT NULL, data_json TEXT NOT NULL