@oracle-agent/oracle 0.35.48 → 0.35.50

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.
Files changed (84) hide show
  1. package/README.md +3 -2
  2. package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
  3. package/dist/agent-sessions.mjs +23 -23
  4. package/dist/artifacts/token-dashboard.mjs +1 -1
  5. package/dist/assets/profiles/near-agent/SOUL.md +46 -0
  6. package/dist/assets/profiles/near-agent/profile.json +30 -0
  7. package/dist/assets/profiles/oracle/SOUL.md +1 -0
  8. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  9. package/dist/assets/skills/oracle-near/SKILL.md +66 -0
  10. package/dist/automation-plan.mjs +1 -1
  11. package/dist/bin/desk-server.mjs +33 -33
  12. package/dist/bin/oracle-data-mcp.mjs +16 -16
  13. package/dist/bin/oracle-gateway.mjs +3 -3
  14. package/dist/bin/oracle-investigate.mjs +1 -1
  15. package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
  16. package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
  17. package/dist/bin/oracle-mev-shadow.mjs +4 -4
  18. package/dist/bin/oracle-public-server.mjs +5 -5
  19. package/dist/bin/oracle-route.mjs +27 -27
  20. package/dist/bin/oracle-scan.mjs +3 -3
  21. package/dist/bin/oracle-telegram-mcp.mjs +1 -1
  22. package/dist/chains.mjs +1 -1
  23. package/dist/cli/commands/account.mjs +26 -26
  24. package/dist/cli/commands/agent-session.mjs +23 -23
  25. package/dist/cli/commands/auth.mjs +16 -15
  26. package/dist/cli/commands/chain.mjs +5 -5
  27. package/dist/cli/commands/chat.mjs +309 -227
  28. package/dist/cli/commands/data.mjs +37 -37
  29. package/dist/cli/commands/doctor.mjs +5 -5
  30. package/dist/cli/commands/eval.mjs +237 -155
  31. package/dist/cli/commands/extension-policy.mjs +1 -1
  32. package/dist/cli/commands/farm.mjs +1 -1
  33. package/dist/cli/commands/follow.mjs +4 -4
  34. package/dist/cli/commands/harness.mjs +6 -6
  35. package/dist/cli/commands/mint.mjs +11 -11
  36. package/dist/cli/commands/model.mjs +313 -231
  37. package/dist/cli/commands/project.mjs +8 -7
  38. package/dist/cli/commands/quickstart.mjs +2 -2
  39. package/dist/cli/commands/receipt.mjs +2 -2
  40. package/dist/cli/commands/resolve.mjs +4 -4
  41. package/dist/cli/commands/session-vault.mjs +4 -4
  42. package/dist/cli/commands/setup.mjs +53 -52
  43. package/dist/cli/commands/snipe.mjs +13 -13
  44. package/dist/cli/commands/strategy.mjs +5 -5
  45. package/dist/cli/commands/swap.mjs +11 -11
  46. package/dist/cli/commands/telegram.mjs +7 -7
  47. package/dist/cli/commands/venues.mjs +1 -1
  48. package/dist/cli/project-access.mjs +4 -3
  49. package/dist/data/desk-data.mjs +31 -31
  50. package/dist/data/holder-table.mjs +2 -2
  51. package/dist/data/market-tape.mjs +1 -1
  52. package/dist/data/names.mjs +3 -3
  53. package/dist/data/providers/farming.mjs +2 -2
  54. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  55. package/dist/index.mjs +49 -49
  56. package/dist/investigator/index.mjs +1 -1
  57. package/dist/launch-radar/index.mjs +5 -5
  58. package/dist/lp/index.mjs +4 -4
  59. package/dist/nft/universal-mint-router.mjs +4 -4
  60. package/dist/notifications/index.mjs +1 -1
  61. package/dist/router/index.mjs +3 -3
  62. package/dist/router/prepare-bridge.mjs +2 -2
  63. package/dist/router/prepare-route.mjs +3 -3
  64. package/dist/scanner/index.mjs +3 -3
  65. package/dist/strategy/index.mjs +4 -4
  66. package/dist/task.mjs +1 -1
  67. package/dist/teams/index.mjs +6 -6
  68. package/dist/telegram/chart-card.mjs +5 -5
  69. package/dist/telegram/market-commands.mjs +1 -1
  70. package/dist/tui/standalone-client.mjs +176 -93
  71. package/package.json +2 -2
  72. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  73. package/public/oracle-splash/docs/connectors/index.html +2 -2
  74. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  75. package/public/oracle-splash/docs/index.html +3 -3
  76. package/public/oracle-splash/docs/reference/index.html +2 -2
  77. package/public/oracle-splash/docs/security/index.html +2 -2
  78. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  79. package/public/oracle-splash/download/index.html +3 -3
  80. package/public/oracle-splash/downloads/index.html +1 -1
  81. package/public/oracle-splash/eval/index.html +19 -19
  82. package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
  83. package/public/oracle-splash/index.html +9 -9
  84. package/server.json +2 -2
@@ -1,20 +1,21 @@
1
- var Ie=Object.defineProperty;var Le=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var De=(e,t)=>{for(var r in t)Ie(e,r,{get:t[r],enumerable:!0})};var be={};De(be,{OAUTH_USAGE_PROVIDERS:()=>kt,collectOAuthUsage:()=>St,parseAnthropicUsage:()=>Ae,parseCodexUsage:()=>Se});function ke(e){let t=Number(e);return Number.isFinite(t)?t:null}function At(e){let t=ke(e);if(t==null)return null;let r=t<=1?t*100:t;return Math.max(0,Math.min(100,r))}function Ae(e){let t=[["five_hour","5h"],["seven_day","7d"],["seven_day_opus","Opus 7d"],["seven_day_sonnet","Sonnet 7d"]],r=[];for(let[o,n]of t){let i=e?.[o]||{},s=At(i.utilization);s!=null&&r.push({label:n,usedPercent:s,resetAt:i.resets_at||i.reset_at||null})}return{source:"oauth_usage_api",windows:r}}function Se(e){let t=e?.rate_limit||{},r=[["primary_window","5h"],["secondary_window","wk"]],o=[];for(let[n,i]of r){let s=t[n]||{},c=ke(s.used_percent);c!=null&&o.push({label:i,usedPercent:Math.max(0,Math.min(100,c)),resetAt:s.reset_at||s.resets_at||null})}return{source:"usage_api",windows:o}}function P({id:e,label:t,connected:r,windows:o=[],unavailable:n=null}){let i=o[0]||null;return{id:e,label:t,connected:r,usedPercent:i?i.usedPercent:null,windowLabel:i?i.label:null,resetAt:i?i.resetAt:null,windows:o,unavailable:n}}function re(e,t){try{return String(e?.get?.(t)?.accessToken||"").trim()}catch{return""}}async function xe(e,t,r){let o=await e(t,{headers:r});if(!o?.ok)throw new Error(`HTTP ${o?.status||0}`);return o.json()}async function St(e,{fetchFn:t=globalThis.fetch}={}){let r=new Date().toISOString(),o=[],n=re(e,"anthropic-oauth");if(!n)o.push(P({id:"anthropic-oauth",label:"Claude",connected:!1,unavailable:"not connected"}));else try{let c=await xe(t,"https://api.anthropic.com/api/oauth/usage",{Authorization:`Bearer ${n}`,Accept:"application/json","anthropic-beta":"oauth-2025-04-20","User-Agent":"claude-code/2.1.0"}),u=Ae(c);o.push(P({id:"anthropic-oauth",label:"Claude",connected:!0,windows:u.windows,unavailable:u.windows.length?null:"quota unavailable"}))}catch{o.push(P({id:"anthropic-oauth",label:"Claude",connected:!0,unavailable:"quota unavailable"}))}let i=re(e,"openai-codex");if(!i)o.push(P({id:"openai-codex",label:"Codex",connected:!1,unavailable:"not connected"}));else try{let c=await xe(t,"https://chatgpt.com/backend-api/wham/usage",{Authorization:`Bearer ${i}`,Accept:"application/json","User-Agent":"codex-cli"}),u=Se(c);o.push(P({id:"openai-codex",label:"Codex",connected:!0,windows:u.windows,unavailable:u.windows.length?null:"quota unavailable"}))}catch{o.push(P({id:"openai-codex",label:"Codex",connected:!0,unavailable:"quota unavailable"}))}let s=re(e,"xai-oauth");return o.push(P({id:"xai-oauth",label:"Grok",connected:!!s,unavailable:s?"quota not published":"not connected"})),{fetchedAt:r,providers:o}}var kt,_e=Le(()=>{kt=Object.freeze([{id:"anthropic-oauth",label:"Claude"},{id:"openai-codex",label:"Codex"},{id:"xai-oauth",label:"Grok"}])});import B from"node:fs";import W from"node:path";import L from"node:fs";import Fe from"node:os";import R from"node:path";import{fileURLToPath as ze}from"node:url";var Ke=R.dirname(ze(import.meta.url)),$t=R.resolve(Ke,"../..");function z(){return process.env.ORACLE_FAKE_HOME||Fe.homedir()}function Me(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function A(){return Me()?process.env.ORACLE_CONFIG_DIR||R.join(z(),".config","oracle"):R.join(z(),".config","oracle")}function Ne(){return R.join(A(),"desk.json")}function Be(){return R.join(A(),"env")}function C({force:e=!1}={}){if(C._done&&!e)return C._result||null;C._done=!0;let t={},r=(n,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=s,t[n]=s))};try{let n=Be();if(L.existsSync(n))for(let i of L.readFileSync(n,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let c=s[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(s[1],c)}}catch{}try{let n=Ne();if(L.existsSync(n)){let i=JSON.parse(L.readFileSync(n,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(r("ORACLE_DESK_URL",o),r("ORACLE_DATA_URL",o),r("ORACLE_API_URL",o),r("ORACLE_PUBLIC_URL",o),r("MAD_DESK_URL",o)),C._result=Object.keys(t).length?t:null,C._result}try{C()}catch{}function K(e){return L.mkdirSync(e,{recursive:!0}),e}var Je=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"]);function M(e){return String(e||"").trim()||void 0}function He(e,{required:t=!1}={}){let r=M(e)?.toLowerCase();if(!r){if(t)throw new Error("model provider is required");return}if(!Je.has(r))throw new Error(`unsupported provider: ${r}`);return r}function qe(e,{required:t=!1}={}){let r=M(e);if(!r){if(t)throw new Error("model is required");return}if(r.includes("..")||r.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(r))throw new Error("invalid model id");return r}function We(e){let t=M(e);if(!t||t.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(t)}catch{throw new Error("invalid custom base URL")}let o=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),n=o==="localhost"||o==="127.0.0.1"||o==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&n)||r.username||r.password||r.search||r.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return r.toString().replace(/\/+$/,"")}function N({provider:e,model:t,baseUrl:r}={},{requireModel:o=!1}={}){let n=He(e),i=qe(t,{required:o});if(n==="custom")return{provider:n,...i?{model:i}:{},baseUrl:We(r)};if(M(r))throw new Error("baseUrl is only supported for the custom provider");return{...n?{provider:n}:{},...i?{model:i}:{}}}var Ve=new Set(["auto","standalone","hermes","remote","arch"]);function Ge(){return W.join(A(),"model.json")}function U(e){return String(e||"").trim()||void 0}function Xe(e={}){let t=U(e.backend)?.toLowerCase()||"auto",r=N({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:t==="standalone"}),o=U(e.apiKeyEnv),n=Number.parseInt(String(e.contextLength||""),10),i=Object.fromEntries(Object.entries(e.contextByModel||{}).filter(([,y])=>Number.isSafeInteger(y)&&y>0)),s=U(e.reasoningEffort),c=U(e.computeHost||e.remoteHost),u=U(e.computeUser||e.remoteUser),m=U(e.computePath||e.remotePath);if(!Ve.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(t==="remote"&&!c)throw new Error("remote backend requires computeHost");return{backend:t,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(n)&&n>0?{contextLength:n}:{},...Object.keys(i).length?{contextByModel:i}:{},...s?{reasoningEffort:s}:{},...c?{computeHost:c}:{},...u?{computeUser:u}:{},...m?{computePath:m}:{}}}function ce(e){let t=Xe(e),r=Ge();K(W.dirname(r)),process.platform!=="win32"&&B.chmodSync(W.dirname(r),448);let o=`${r}.${process.pid}.tmp`;return B.writeFileSync(o,`${JSON.stringify(t,null,2)}
2
- `,{mode:384}),B.renameSync(o,r),process.platform!=="win32"&&B.chmodSync(r,384),t}import{createHash as st,randomBytes as Q,timingSafeEqual as at}from"node:crypto";import x from"node:fs";import w from"node:path";import ct from"node:readline/promises";import{spawn as ut,spawnSync as dt}from"node:child_process";import b from"node:fs";import v from"node:path";var V=Object.freeze(["anthropic-oauth","openai-codex","xai-oauth"]);function ue(e){let t=String(e||"").trim();if(!t||!v.isAbsolute(t))return"";try{return b.statSync(t).isFile()?t:""}catch{return""}}function Ze(e){try{return b.readdirSync(e,{withFileTypes:!0})}catch{return[]}}function Ye(e=process.env){return!(e.ORACLE_PUBLIC_DESKTOP==="1"&&e.ORACLE_OWNER_DESKTOP!=="1")}function Qe(e=process.env){let t=String(e.ORACLE_REAL_HOME||"").trim();return t&&v.isAbsolute(t)?t:z()}function et(e={}){let t=e.home||Qe(e.env),r={"anthropic-oauth":[],"openai-codex":[],"xai-oauth":[]},o=(i,s)=>{let c=ue(s);c&&(r[i].includes(c)||r[i].push(c))};o("anthropic-oauth",v.join(t,".claude",".credentials.json"));for(let i of Ze(v.join(t,".claude-lanes")))!i.isDirectory()||i.name.startsWith(".")||o("anthropic-oauth",v.join(t,".claude-lanes",i.name,".credentials.json"));let n=v.join(t,".hermes","auth.json");for(let i of V)o(i,n);return o("anthropic-oauth",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),o("openai-codex",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),o("xai-oauth",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),r}function tt(e){if(!b.existsSync(e))return{providers:{}};try{let t=JSON.parse(b.readFileSync(e,"utf8"));return!t||typeof t!="object"||Array.isArray(t)?{providers:{}}:{providers:t.providers&&typeof t.providers=="object"&&!Array.isArray(t.providers)?t.providers:{}}}catch{return{providers:{}}}}function rt(e,t){let r=[];for(let o of[...Array.isArray(e)?e:[],...t]){let n=ue(o)||(v.isAbsolute(String(o||""))?String(o):"");!n||r.includes(n)||r.push(n)}return r}function de(e={}){if(!Ye(e.env))return{wrote:!1,providers:{}};let t=e.linksFile||v.join(A(),"oauth-links.json"),r=et(e),n={providers:{...tt(t).providers||{}}},i=!1;for(let m of V){let y=rt(n.providers[m],r[m]);JSON.stringify(y)!==JSON.stringify(n.providers[m]||[])?(n.providers[m]=y,i=!0):y.length&&(n.providers[m]=y)}if(!V.some(m=>(n.providers[m]||[]).length))return{wrote:!1,providers:n.providers};if(!i&&b.existsSync(t))return{wrote:!1,providers:n.providers};let c=v.dirname(t);if(b.mkdirSync(c,{recursive:!0}),process.platform!=="win32")try{b.chmodSync(c,448)}catch{}let u=`${t}.${process.pid}.tmp`;return b.writeFileSync(u,`${JSON.stringify(n,null,2)}
3
- `,{mode:384}),b.renameSync(u,t),process.platform!=="win32"&&b.chmodSync(t,384),{wrote:!0,providers:n.providers}}import O from"node:fs";import fe from"node:path";var le=/access|refresh|idToken|id_token|token|secret|key|seed|mnemonic/i;function ot(e=A()){return fe.join(e,"user-profile.json")}function nt(e){if(!O.existsSync(e))return{identities:{},wallets:{}};try{let t=JSON.parse(O.readFileSync(e,"utf8"));return!t||typeof t!="object"||Array.isArray(t)?{identities:{},wallets:{}}:{identities:t.identities&&typeof t.identities=="object"?t.identities:{},wallets:t.wallets&&typeof t.wallets=="object"?t.wallets:{},updatedAt:t.updatedAt}}catch{return{identities:{},wallets:{}}}}function pe(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t={};for(let[r,o]of Object.entries(e))if(!le.test(r)){if(typeof o=="string"||typeof o=="number"||typeof o=="boolean"){t[r]=o;continue}if(o&&typeof o=="object"&&!Array.isArray(o)){let n={};for(let[i,s]of Object.entries(o))le.test(i)||(typeof s=="string"||typeof s=="number"||typeof s=="boolean")&&(n[i]=s);t[r]=n}}return t}function it(e,t){let r=fe.dirname(e);if(O.mkdirSync(r,{recursive:!0}),process.platform!=="win32")try{O.chmodSync(r,448)}catch{}let o={updatedAt:new Date().toISOString(),identities:pe(t.identities),wallets:pe(t.wallets)},n=`${e}.${process.pid}.tmp`;return O.writeFileSync(n,`${JSON.stringify(o,null,2)}
4
- `,{mode:384}),O.renameSync(n,e),process.platform!=="win32"&&O.chmodSync(e,384),o}function G(e){let r=String(e||"").trim().split(".");if(r.length<2)return{};try{let o=JSON.parse(Buffer.from(r[1],"base64url").toString("utf8")),n=String(o.email||"").trim(),i=String(o.name||o.preferred_username||"").trim();return{...n?{email:n}:{},...i?{name:i}:{}}}catch{return{}}}function X(e,t={},r={}){let o=String(e||"").trim();if(!o)return null;let n=r.file||ot(r.configDir),i=nt(n),s=i.identities[o]&&typeof i.identities[o]=="object"?i.identities[o]:{};return i.identities[o]={...s,provider:o,source:String(t.source||s.source||"oracle"),loggedInAt:t.loggedInAt||new Date().toISOString(),...t.label?{label:String(t.label)}:{},...t.email?{email:String(t.email)}:{},...t.name?{name:String(t.name)}:{}},it(n,i)}var T=Object.freeze({"anthropic-oauth":{aliases:["anthropic-oauth","anthropic","claude","claude-oauth"],clientId:"9d1c250a-e61b-44d9-88ed-5944d1962f5e",authorizeUrl:"https://claude.ai/oauth/authorize",tokenUrl:"https://platform.claude.com/v1/oauth/token",redirectUri:"https://console.anthropic.com/oauth/code/callback",scope:"org:create_api_key user:profile user:inference",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},"openai-codex":{aliases:["openai-codex","openai-oauth","codex","codex-oauth"],clientId:"app_EMoamEEZ73f0CkXaXp7hrann",issuer:"https://auth.openai.com",tokenUrl:"https://auth.openai.com/oauth/token",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.6-sol",protocol:"responses"},"xai-oauth":{aliases:["xai-oauth","xai","grok","grok-oauth"],clientId:"b1a00492-073a-47ea-816f-4c329264a828",issuer:"https://auth.x.ai",discoveryUrl:"https://auth.x.ai/.well-known/openid-configuration",deviceUrl:"https://auth.x.ai/oauth2/device/code",scope:"openid profile email offline_access grok-cli:access api:access",baseUrl:"https://api.x.ai/v1",model:"grok-4.6",protocol:"responses"}}),he=12e4;function lt(e={}){return typeof e.now=="function"?Number(e.now()):Date.now()}function E(e){let t=String(e||"").trim().toLowerCase();for(let[r,o]of Object.entries(T))if(o.aliases.includes(t))return r;throw new Error(`unsupported OAuth provider: ${e||"(empty)"}`)}function ye(e){let t=E(e);return{id:t,...T[t]}}function g(e,t={}){if(!x.existsSync(e))return t;try{let r=JSON.parse(x.readFileSync(e,"utf8"));if(!r||typeof r!="object"||Array.isArray(r))throw new Error("invalid object");return r}catch{throw new Error(`credential store is unreadable or corrupt: ${w.basename(e)}`)}}function we(e){K(e),process.platform!=="win32"&&x.chmodSync(e,448)}function _(e,t){we(w.dirname(e));let r=`${e}.${process.pid}.${Q(4).toString("hex")}.tmp`;x.writeFileSync(r,`${JSON.stringify(t,null,2)}
5
- `,{mode:384}),x.renameSync(r,e),process.platform!=="win32"&&x.chmodSync(e,384)}function pt(e){if(process.platform!=="linux")return!1;let t=e("secret-tool",["--version"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return!t.error&&t.status===0}function Z(e){let t=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(t))throw new Error(`invalid API-key provider: ${e||"(empty)"}`);return t}function $(e={}){let t=String(e.accessToken||e.access_token||"").trim(),r=String(e.refreshToken||e.refresh_token||"").trim(),o=e.expires_at_ms!=null,n;if(o){let i=e.expires_at_ms;if(n=Number(i),typeof i!="number"&&typeof i!="string"||typeof i=="string"&&!i.trim()||!Number.isFinite(n)||n<=0)throw new Error("OAuth credential has invalid expires_at_ms")}else n=Number(e.expiresAt||e.expires_at||0),Number.isFinite(n)&&n>=1e9&&n<1e12&&(n=n*1e3);if(!t)throw new Error("OAuth credential is missing access token");return{accessToken:t,refreshToken:r,expiresAt:Number.isFinite(n)?n:0,tokenType:String(e.tokenType||e.token_type||"Bearer"),source:String(e.source||"oracle"),...e.discovery?{discovery:e.discovery}:{},...e.scope?{scope:e.scope}:{},...e.idToken||e.id_token?{idToken:String(e.idToken||e.id_token)}:{}}}function ft(e={}){let t=e.file||w.join(A(),"oauth.json"),r=e.metadataFile||w.join(w.dirname(t),"oauth-meta.json"),o=e.linksFile||w.join(w.dirname(t),"oauth-links.json"),n=()=>typeof e.now=="function"?Number(e.now()):Date.now(),i=e.spawnFn||dt,s=e.keychain!==!1&&process.env.ORACLE_AUTH_FILE_STORE!=="1"&&pt(i),c=s?"linux-secret-service":"private-file",u=`${t}.lock`;async function m(f){we(w.dirname(u));let l;for(let a=0;a<400;a+=1)try{l=x.openSync(u,"wx",384);break}catch(d){if(d?.code!=="EEXIST")throw d;try{Date.now()-x.statSync(u).mtimeMs>3e5&&x.unlinkSync(u)}catch{}await new Promise(p=>setTimeout(p,25))}if(l===void 0)throw new Error("timed out waiting for OAuth credential lock");try{return await f()}finally{try{x.closeSync(l)}catch{}try{x.unlinkSync(u)}catch{}}}function y(f,l="oauth"){return["application","oracle","kind",l,"provider",f]}let D=!1;function ie(){if(D)return;D=!0;let f=w.join(A(),"oauth-links.json");if(w.resolve(o)===w.resolve(f))try{de({linksFile:o})}catch{}}function F(f){if(ie(),!x.existsSync(o))return[];let a=g(o,{providers:{}}).providers?.[f];if(!Array.isArray(a))return[];let d=[];for(let p of a)if(w.isAbsolute(String(p||"")))try{let h=g(p,{});if(f==="anthropic-oauth"&&h.claudeAiOauth){let S=$(h.claudeAiOauth);d.push({...S,refreshToken:"",source:"external-access-only",label:w.basename(w.dirname(p))||"claude-lane"});continue}let k=h.credential_pool&&typeof h.credential_pool=="object"?h.credential_pool:null;if(k){let S=k[f]||k[f.replace(/-oauth$/,"")]||[],$e=Array.isArray(S)?S:S?[S]:[];for(let I of $e)if(!(!I||typeof I!="object"))try{let Te=$(I);d.push({...Te,refreshToken:"",source:"external-access-only",label:String(I.label||I.id||w.basename(w.dirname(p))||f)})}catch{}}}catch{}return d}function H(f){let l=F(f);return l.length?l.find(a=>!a.expiresAt||a.expiresAt>n()+he)||l[0]:null}function q(f){return f.map(l=>({label:String(l.label||"lane"),source:"external-access-only",expiresAt:Number(l.expiresAt||0),healthy:!l.expiresAt||l.expiresAt>n()+he}))}function se(f){let l=E(f);if(s){let p=i("secret-tool",["lookup",...y(l)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(!p.error&&p.status===0&&String(p.stdout||"").trim())try{return $(JSON.parse(String(p.stdout).trim()))}catch{}return H(l)}let d=g(t,{providers:{}}).providers?.[l];if(d)try{return $(d)}catch{}return H(l)}function je(f,l){let a=E(f),d=$(l);if(s){let h=i("secret-tool",["store",`--label=Oracle ${a} OAuth`,...y(a)],{input:JSON.stringify(d),encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(h.error||h.status!==0)throw new Error("OS credential store rejected OAuth credential");let k=g(r,{providers:{}});k.providers||={},k.providers[a]={expiresAt:d.expiresAt,source:d.source},_(r,k);try{let S=G(d.idToken);X(a,{source:d.source,...S,label:S.name||S.email||a},{configDir:w.dirname(t)})}catch{}return d}let p=g(t,{providers:{}});p.providers||={},p.providers[a]=d,_(t,p);try{let h=G(d.idToken);X(a,{source:d.source,...h,label:h.name||h.email||a},{configDir:w.dirname(t)})}catch{}return d}function Pe(f){let l=E(f);if(s){let p=i("secret-tool",["clear",...y(l)],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),h=g(r,{providers:{}});return h.providers&&delete h.providers[l],_(r,h),!p.error&&p.status===0}let a=g(t,{providers:{}}),d=!!a.providers?.[l];return a.providers&&delete a.providers[l],_(t,a),d}function ae(f){let l=Z(f);if(s){let a=i("secret-tool",["lookup",...y(l,"api-key")],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return a.error||a.status!==0?"":String(a.stdout||"").trim()}return String(g(t,{apiKeys:{}}).apiKeys?.[l]||"").trim()}function Ce(f,l){let a=Z(f),d=String(l||"").trim();if(!d)throw new Error("API key is empty");if(s){let h=i("secret-tool",["store",`--label=Oracle ${a} API key`,...y(a,"api-key")],{input:d,encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(h.error||h.status!==0)throw new Error("OS credential store rejected API key");let k=g(r,{providers:{},apiKeys:{}});return k.apiKeys||={},k.apiKeys[a]={configured:!0},_(r,k),!0}let p=g(t,{providers:{},apiKeys:{}});return p.apiKeys||={},p.apiKeys[a]=d,_(t,p),!0}function Re(f){let l=Z(f);if(s){let p=i("secret-tool",["clear",...y(l,"api-key")],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),h=g(r,{providers:{},apiKeys:{}});return h.apiKeys&&delete h.apiKeys[l],_(r,h),!p.error&&p.status===0}let a=g(t,{providers:{},apiKeys:{}}),d=!!a.apiKeys?.[l];return a.apiKeys&&delete a.apiKeys[l],_(t,a),d}function Ue(){ie();let f={},l={};if(s){let a=g(r,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(a.providers||{}))f[d]={loggedIn:!!se(d),expiresAt:Number(p.expiresAt||0),source:String(p.source||"oracle"),storage:c,lanes:q(F(d))};for(let d of Object.keys(a.apiKeys||{}))l[d]={configured:!!ae(d),storage:c}}else{let a=g(t,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(a.providers||{}))f[d]={loggedIn:!!p?.accessToken,expiresAt:Number(p?.expiresAt||0),source:String(p?.source||"oracle"),storage:c,lanes:q(F(d))};for(let[d,p]of Object.entries(a.apiKeys||{}))l[d]={configured:!!p,storage:c}}for(let a of Object.keys(T)){let d=q(F(a));if(f[a]){f[a].lanes=d;continue}let p=H(a);p&&(f[a]={loggedIn:!0,expiresAt:p.expiresAt,source:p.source,storage:"external-access-source",lanes:d})}return{storage:c,providers:f,apiKeys:l}}return Object.freeze({file:t,storage:c,get:se,set:je,remove:Pe,getApiKey:ae,setApiKey:Ce,removeApiKey:Re,status:Ue,withLock:m})}var me;function ge(){return me||=ft(),me}function Y(e){return Buffer.from(e).toString("base64url")}function ht(){let e=Y(Q(32));return{verifier:e,challenge:Y(st("sha256").update(e).digest()),state:Y(Q(24))}}function mt(e,t){let r=Buffer.from(String(e||"")),o=Buffer.from(String(t||""));return r.length===o.length&&at(r,o)}function yt(e){let t=String(e),r=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd.exe",["/d","/s","/c","start","",t]]:["xdg-open",[t]];try{return ut(r[0],r[1],{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function ee(e){return new URLSearchParams(e).toString()}async function j(e,t){if(!e?.ok){let o="";try{o=String((await e.json())?.error||"")}catch{}throw new Error(`${t} failed (HTTP ${e?.status||"unknown"}${o?`, ${o}`:""})`)}let r=await e.json();if(!r||typeof r!="object")throw new Error(`${t} returned invalid JSON`);return r}async function wt(e){if(e)return String(await e()).trim();let t=ct.createInterface({input:process.stdin,output:process.stdout});try{return String(await t.question("Authorization code: ")).trim()}finally{t.close()}}function te(e,t={}){let r=String(e.access_token||"").trim(),o=String(e.refresh_token||t.refreshToken||"").trim();if(!r)throw new Error("OAuth token response is missing access token");let n=Number(e.expires_in||3600);return $({accessToken:r,refreshToken:o,expiresAt:lt(t)+Math.max(1,n)*1e3,tokenType:e.token_type||"Bearer",idToken:e.id_token,source:"oracle",...t.discovery?{discovery:t.discovery}:{},...e.scope?{scope:e.scope}:{}})}async function gt(e){let t=T["anthropic-oauth"],r=e.pkce||ht(),o=new URLSearchParams({code:"true",client_id:t.clientId,response_type:"code",redirect_uri:t.redirectUri,scope:t.scope,code_challenge:r.challenge,code_challenge_method:"S256",state:r.state}),n=`${t.authorizeUrl}?${o}`;e.output(`Open: ${n}`),e.openFn(n);let i=await wt(e.inputFn),[s,c]=i.split("#",2);if(!s||!mt(c,r.state))throw new Error("Claude OAuth state mismatch");let u=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/json","user-agent":"axios/1.7.9"},body:JSON.stringify({grant_type:"authorization_code",client_id:t.clientId,code:s,state:c,redirect_uri:t.redirectUri,code_verifier:r.verifier})});return te(await j(u,"Claude OAuth token exchange"),e)}async function vt(e){let t=T["openai-codex"],r=await j(await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/usercode`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:t.clientId})}),"Codex device authorization");if(!r.user_code||!r.device_auth_id)throw new Error("Codex device authorization returned incomplete data");let o=`${t.issuer}/codex/device`;e.output(`Open: ${o}`),e.output(`Code: ${r.user_code}`),e.openFn(o);let n=Math.max(3,Number(r.interval||5)),i;for(let c=0;c<Math.ceil(900/n);c+=1){await e.sleepFn(n*1e3);let u=await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_auth_id:r.device_auth_id,user_code:r.user_code})});if(u.ok){i=await j(u,"Codex device authorization");break}if(![403,404].includes(u.status))throw new Error(`Codex device authorization failed (HTTP ${u.status})`)}if(!i)throw new Error("Codex device authorization timed out");let s=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:ee({grant_type:"authorization_code",code:i.authorization_code,redirect_uri:`${t.issuer}/deviceauth/callback`,client_id:t.clientId,code_verifier:i.code_verifier})});return te(await j(s,"Codex OAuth token exchange"),e)}function J(e){let t=new URL(String(e)),r=t.hostname.toLowerCase();if(t.protocol!=="https:"||r!=="x.ai"&&!r.endsWith(".x.ai"))throw new Error("xAI OAuth discovery returned an untrusted endpoint");return t.toString()}async function xt(e){let t=T["xai-oauth"],r=await j(await e.fetchFn(t.discoveryUrl,{headers:{accept:"application/json"}}),"xAI OAuth discovery");J(r.authorization_endpoint);let o=J(r.token_endpoint),n=await j(await e.fetchFn(t.deviceUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:ee({client_id:t.clientId,scope:t.scope})}),"xAI device authorization");if(!n.device_code||!n.user_code||!n.verification_uri)throw new Error("xAI device authorization returned incomplete data");let i=J(n.verification_uri_complete||n.verification_uri);e.output(`Open: ${i}`),e.output(`Code: ${n.user_code}`),e.openFn(i);let s=Math.max(1,Number(n.interval||5)),c=Math.ceil(Math.max(1,Number(n.expires_in||600))/s);for(let u=0;u<c;u+=1){let m=await e.fetchFn(o,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:ee({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:t.clientId,device_code:n.device_code})});if(m.ok){let D=await j(m,"xAI OAuth token exchange");return te(D,{...e,discovery:{authorization_endpoint:J(r.authorization_endpoint),token_endpoint:o}})}let y="";try{y=String((await m.json())?.error||"")}catch{}if(y==="slow_down")await e.sleepFn((s+1)*1e3);else if(y==="authorization_pending")await e.sleepFn(s*1e3);else throw new Error(`xAI OAuth token exchange failed (HTTP ${m.status}${y?`, ${y}`:""})`)}throw new Error("xAI device authorization timed out")}async function ve(e,t={}){let r=E(e),o={fetchFn:t.fetchFn||globalThis.fetch,inputFn:t.inputFn,sleepFn:t.sleepFn||(n=>new Promise(i=>setTimeout(i,n))),openFn:t.openFn||yt,output:t.output||(n=>process.stdout.write(`${n}
6
- `)),now:t.now,pkce:t.pkce};return r==="anthropic-oauth"?gt(o):r==="openai-codex"?vt(o):xt(o)}var Oe=Object.freeze({openrouter:{model:"openrouter/auto"},openai:{model:"gpt-4.1-mini"},anthropic:{model:"claude-sonnet-4-6"},xai:{model:"grok-4.6"},deepseek:{model:"deepseek-chat"},gemini:{model:"gemini-2.5-flash"},kimi:{model:"kimi-k3"},mistral:{model:"mistral-large-latest"},nous:{model:"moonshotai/kimi-k3"},qwen:{model:"qwen-plus"},glm:{model:"glm-4.5"},custom:{model:""}});function oe(e,t){let r=e.indexOf(t);return r>=0&&e[r+1]?e[r+1]:""}async function bt(){let e="";for await(let t of process.stdin)e+=t;return e.trim()}function _t(e="API key: "){if(!process.stdin.isTTY||!process.stdin.setRawMode)throw new Error("non-interactive API-key input requires --stdin");return process.stdout.write(e),new Promise((t,r)=>{let o="",n=()=>{process.stdin.off("data",i),process.stdin.setRawMode(!1),process.stdin.pause(),process.stdout.write(`
7
- `)},i=s=>{let c=String(s);for(let u of c){if(u==="\r"||u===`
8
- `){n(),t(o.trim());return}if(u===""){n(),r(new Error("cancelled"));return}u==="\x7F"||u==="\b"?o=o.slice(0,-1):o+=u}};process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on("data",i)})}function ne(e,t,{baseUrl:r=""}={}){if(e==="custom"&&!String(r||"").trim())throw new Error("custom provider requires --base-url");return{backend:"standalone",...N({provider:e,model:t,baseUrl:r},{requireModel:!0})}}function Ee(e,t,r={}){return ce(ne(e,t,r))}function Ot(e){process.stdout.write(`storage: ${e.storage}
1
+ var Ke=Object.defineProperty;var Ne=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(o){throw r=[o],o}};var Me=(e,t)=>{for(var r in t)Ke(e,r,{get:t[r],enumerable:!0})};var je={};Me(je,{OAUTH_USAGE_PROVIDERS:()=>It,collectOAuthUsage:()=>Lt,parseAnthropicUsage:()=>be,parseCodexUsage:()=>Ee});function Oe(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ut(e){let t=Oe(e);if(t==null)return null;let r=t<=1?t*100:t;return Math.max(0,Math.min(100,r))}function be(e){let t=[["five_hour","5h"],["seven_day","7d"],["seven_day_opus","Opus 7d"],["seven_day_sonnet","Sonnet 7d"]],r=[];for(let[o,n]of t){let i=e?.[o]||{},s=Ut(i.utilization);s!=null&&r.push({label:n,usedPercent:s,resetAt:i.resets_at||i.reset_at||null})}return{source:"oauth_usage_api",windows:r}}function Ee(e){let t=e?.rate_limit||{},r=[["primary_window","5h"],["secondary_window","wk"]],o=[];for(let[n,i]of r){let s=t[n]||{},l=Oe(s.used_percent);l!=null&&o.push({label:i,usedPercent:Math.max(0,Math.min(100,l)),resetAt:s.reset_at||s.resets_at||null})}return{source:"usage_api",windows:o}}function $({id:e,label:t,connected:r,windows:o=[],unavailable:n=null}){let i=o[0]||null;return{id:e,label:t,connected:r,usedPercent:i?i.usedPercent:null,windowLabel:i?i.label:null,resetAt:i?i.resetAt:null,windows:o,unavailable:n}}function ie(e,t){try{return String(e?.get?.(t)?.accessToken||"").trim()}catch{return""}}async function _e(e,t,r){let o=await e(t,{headers:r});if(!o?.ok)throw new Error(`HTTP ${o?.status||0}`);return o.json()}async function Lt(e,{fetchFn:t=globalThis.fetch}={}){let r=new Date().toISOString(),o=[],n=ie(e,"anthropic-oauth");if(!n)o.push($({id:"anthropic-oauth",label:"Claude",connected:!1,unavailable:"not connected"}));else try{let l=await _e(t,"https://api.anthropic.com/api/oauth/usage",{Authorization:`Bearer ${n}`,Accept:"application/json","anthropic-beta":"oauth-2025-04-20","User-Agent":"claude-code/2.1.0"}),a=be(l);o.push($({id:"anthropic-oauth",label:"Claude",connected:!0,windows:a.windows,unavailable:a.windows.length?null:"quota unavailable"}))}catch{o.push($({id:"anthropic-oauth",label:"Claude",connected:!0,unavailable:"quota unavailable"}))}let i=ie(e,"openai-codex");if(!i)o.push($({id:"openai-codex",label:"Codex",connected:!1,unavailable:"not connected"}));else try{let l=await _e(t,"https://chatgpt.com/backend-api/wham/usage",{Authorization:`Bearer ${i}`,Accept:"application/json","User-Agent":"codex-cli"}),a=Ee(l);o.push($({id:"openai-codex",label:"Codex",connected:!0,windows:a.windows,unavailable:a.windows.length?null:"quota unavailable"}))}catch{o.push($({id:"openai-codex",label:"Codex",connected:!0,unavailable:"quota unavailable"}))}let s=ie(e,"xai-oauth");return o.push($({id:"xai-oauth",label:"Grok",connected:!!s,unavailable:s?"quota not published":"not connected"})),{fetchedAt:r,providers:o}}var It,Ce=Ne(()=>{It=Object.freeze([{id:"anthropic-oauth",label:"Claude"},{id:"openai-codex",label:"Codex"},{id:"xai-oauth",label:"Grok"}])});import H from"node:fs";import G from"node:path";import F from"node:fs";import Be from"node:os";import T from"node:path";import{fileURLToPath as He}from"node:url";var Je=T.dirname(He(import.meta.url)),Wt=T.resolve(Je,"../..");function K(){return process.env.ORACLE_FAKE_HOME||Be.homedir()}function We(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function x(){return We()?process.env.ORACLE_CONFIG_DIR||T.join(K(),".config","oracle"):T.join(K(),".config","oracle")}function qe(){return T.join(x(),"desk.json")}function Ve(){return T.join(x(),"env")}function R({force:e=!1}={}){if(R._done&&!e)return R._result||null;R._done=!0;let t={},r=(n,i)=>{if(i==null)return;let s=String(i).trim();s&&(process.env[n]!=null&&String(process.env[n]).trim()!==""||(process.env[n]=s,t[n]=s))};try{let n=Ve();if(F.existsSync(n))for(let i of F.readFileSync(n,"utf8").split(/\r?\n/)){let s=i.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!s||s[2].startsWith("#"))continue;let l=s[2];(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'"))&&(l=l.slice(1,-1)),r(s[1],l)}}catch{}try{let n=qe();if(F.existsSync(n)){let i=JSON.parse(F.readFileSync(n,"utf8"));i&&typeof i=="object"&&(r("ORACLE_DESK_URL",i.deskUrl||i.dataUrl||i.url),r("ORACLE_DATA_URL",i.dataUrl||i.deskUrl||i.url),r("ORACLE_API_URL",i.apiUrl||i.dataUrl||i.deskUrl),r("ORACLE_PUBLIC_URL",i.publicUrl||i.deskUrl||i.dataUrl),r("ORACLE_EXEC_URL",i.execUrl),r("MAD_DESK_URL",i.deskUrl||i.dataUrl))}}catch{}let o=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return o&&(r("ORACLE_DESK_URL",o),r("ORACLE_DATA_URL",o),r("ORACLE_API_URL",o),r("ORACLE_PUBLIC_URL",o),r("MAD_DESK_URL",o)),R._result=Object.keys(t).length?t:null,R._result}try{R()}catch{}function N(e){return F.mkdirSync(e,{recursive:!0}),e}var Ge=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","local","ollama","custom","anthropic-oauth","openai-codex","xai-oauth"]);function M(e){return String(e||"").trim()||void 0}function Ze(e,{required:t=!1}={}){let r=M(e)?.toLowerCase();if(!r){if(t)throw new Error("model provider is required");return}if(!Ge.has(r))throw new Error(`unsupported provider: ${r}`);return r}function Ye(e,{required:t=!1}={}){let r=M(e);if(!r){if(t)throw new Error("model is required");return}if(r.includes("..")||r.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(r))throw new Error("invalid model id");return r}function Xe(e){let t=M(e);if(!t||t.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(t)}catch{throw new Error("invalid custom base URL")}let o=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),n=o==="localhost"||o==="127.0.0.1"||o==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&n)||r.username||r.password||r.search||r.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return r.toString().replace(/\/+$/,"")}function B({provider:e,model:t,baseUrl:r}={},{requireModel:o=!1}={}){let n=Ze(e),i=Ye(t,{required:o});if(n==="custom")return{provider:n,...i?{model:i}:{},baseUrl:Xe(r)};if(M(r))throw new Error("baseUrl is only supported for the custom provider");return{...n?{provider:n}:{},...i?{model:i}:{}}}var Qe=new Set(["auto","standalone","hermes","remote","arch"]);function et(){return G.join(x(),"model.json")}function I(e){return String(e||"").trim()||void 0}function tt(e={}){let t=I(e.backend)?.toLowerCase()||"auto",r=B({provider:e.provider,model:e.model,baseUrl:e.baseUrl},{requireModel:t==="standalone"}),o=I(e.apiKeyEnv),n=Number.parseInt(String(e.contextLength||""),10),i=Object.fromEntries(Object.entries(e.contextByModel||{}).filter(([,w])=>Number.isSafeInteger(w)&&w>0)),s=I(e.reasoningEffort),l=I(e.computeHost||e.remoteHost),a=I(e.computeUser||e.remoteUser),h=I(e.computePath||e.remotePath);if(!Qe.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(o&&!/^[A-Z][A-Z0-9_]*$/.test(o))throw new Error("api key env must be an uppercase environment variable name");if(t==="remote"&&!l)throw new Error("remote backend requires computeHost");return{backend:t,...r,...o?{apiKeyEnv:o}:{},...Number.isFinite(n)&&n>0?{contextLength:n}:{},...Object.keys(i).length?{contextByModel:i}:{},...s?{reasoningEffort:s}:{},...l?{computeHost:l}:{},...a?{computeUser:a}:{},...h?{computePath:h}:{}}}function pe(e){let t=tt(e),r=et();N(G.dirname(r)),process.platform!=="win32"&&H.chmodSync(G.dirname(r),448);let o=`${r}.${process.pid}.tmp`;return H.writeFileSync(o,`${JSON.stringify(t,null,2)}
2
+ `,{mode:384}),H.renameSync(o,r),process.platform!=="win32"&&H.chmodSync(r,384),t}import{createHash as gt,randomBytes as te,timingSafeEqual as vt}from"node:crypto";import g from"node:fs";import y from"node:path";import St from"node:readline/promises";import{spawn as xt,spawnSync as At}from"node:child_process";import k from"node:fs";import v from"node:path";var Z=Object.freeze(["anthropic-oauth","openai-codex","xai-oauth"]);function fe(e){let t=String(e||"").trim();if(!t||!v.isAbsolute(t))return"";try{return k.statSync(t).isFile()?t:""}catch{return""}}function rt(e){try{return k.readdirSync(e,{withFileTypes:!0})}catch{return[]}}function ot(e=process.env){return!(e.ORACLE_PUBLIC_DESKTOP==="1"&&e.ORACLE_OWNER_DESKTOP!=="1")}function nt(e=process.env){let t=String(e.ORACLE_REAL_HOME||"").trim();return t&&v.isAbsolute(t)?t:K()}function it(e={}){let t=e.home||nt(e.env),r={"anthropic-oauth":[],"openai-codex":[],"xai-oauth":[]},o=(i,s)=>{let l=fe(s);l&&(r[i].includes(l)||r[i].push(l))};o("anthropic-oauth",v.join(t,".claude",".credentials.json"));for(let i of rt(v.join(t,".claude-lanes")))!i.isDirectory()||i.name.startsWith(".")||o("anthropic-oauth",v.join(t,".claude-lanes",i.name,".credentials.json"));let n=v.join(t,".hermes","auth.json");for(let i of Z)o(i,n);return o("anthropic-oauth",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),o("openai-codex",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),o("xai-oauth",v.join(t,".hermes","profiles","hermes-macbook","auth.json")),r}function st(e){if(!k.existsSync(e))return{providers:{}};try{let t=JSON.parse(k.readFileSync(e,"utf8"));return!t||typeof t!="object"||Array.isArray(t)?{providers:{}}:{providers:t.providers&&typeof t.providers=="object"&&!Array.isArray(t.providers)?t.providers:{}}}catch{return{providers:{}}}}function ct(e,t){let r=[];for(let o of[...Array.isArray(e)?e:[],...t]){let n=fe(o)||(v.isAbsolute(String(o||""))?String(o):"");!n||r.includes(n)||r.push(n)}return r}function he(e={}){if(!ot(e.env))return{wrote:!1,providers:{}};let t=e.linksFile||v.join(x(),"oauth-links.json"),r=it(e),n={providers:{...st(t).providers||{}}},i=!1;for(let h of Z){let w=ct(n.providers[h],r[h]);JSON.stringify(w)!==JSON.stringify(n.providers[h]||[])?(n.providers[h]=w,i=!0):w.length&&(n.providers[h]=w)}if(!Z.some(h=>(n.providers[h]||[]).length))return{wrote:!1,providers:n.providers};if(!i&&k.existsSync(t))return{wrote:!1,providers:n.providers};let l=v.dirname(t);if(k.mkdirSync(l,{recursive:!0}),process.platform!=="win32")try{k.chmodSync(l,448)}catch{}let a=`${t}.${process.pid}.tmp`;return k.writeFileSync(a,`${JSON.stringify(n,null,2)}
3
+ `,{mode:384}),k.renameSync(a,t),process.platform!=="win32"&&k.chmodSync(t,384),{wrote:!0,providers:n.providers}}import E from"node:fs";import we from"node:path";var me=/access|refresh|idToken|id_token|token|secret|key|seed|mnemonic/i;function at(e=x()){return we.join(e,"user-profile.json")}function ut(e){if(!E.existsSync(e))return{identities:{},wallets:{}};try{let t=JSON.parse(E.readFileSync(e,"utf8"));return!t||typeof t!="object"||Array.isArray(t)?{identities:{},wallets:{}}:{identities:t.identities&&typeof t.identities=="object"?t.identities:{},wallets:t.wallets&&typeof t.wallets=="object"?t.wallets:{},updatedAt:t.updatedAt}}catch{return{identities:{},wallets:{}}}}function ye(e){if(!e||typeof e!="object"||Array.isArray(e))return{};let t={};for(let[r,o]of Object.entries(e))if(!me.test(r)){if(typeof o=="string"||typeof o=="number"||typeof o=="boolean"){t[r]=o;continue}if(o&&typeof o=="object"&&!Array.isArray(o)){let n={};for(let[i,s]of Object.entries(o))me.test(i)||(typeof s=="string"||typeof s=="number"||typeof s=="boolean")&&(n[i]=s);t[r]=n}}return t}function lt(e,t){let r=we.dirname(e);if(E.mkdirSync(r,{recursive:!0}),process.platform!=="win32")try{E.chmodSync(r,448)}catch{}let o={updatedAt:new Date().toISOString(),identities:ye(t.identities),wallets:ye(t.wallets)},n=`${e}.${process.pid}.tmp`;return E.writeFileSync(n,`${JSON.stringify(o,null,2)}
4
+ `,{mode:384}),E.renameSync(n,e),process.platform!=="win32"&&E.chmodSync(e,384),o}function Y(e){let r=String(e||"").trim().split(".");if(r.length<2)return{};try{let o=JSON.parse(Buffer.from(r[1],"base64url").toString("utf8")),n=String(o.email||"").trim(),i=String(o.name||o.preferred_username||"").trim();return{...n?{email:n}:{},...i?{name:i}:{}}}catch{return{}}}function X(e,t={},r={}){let o=String(e||"").trim();if(!o)return null;let n=r.file||at(r.configDir),i=ut(n),s=i.identities[o]&&typeof i.identities[o]=="object"?i.identities[o]:{};return i.identities[o]={...s,provider:o,source:String(t.source||s.source||"oracle"),loggedInAt:t.loggedInAt||new Date().toISOString(),...t.label?{label:String(t.label)}:{},...t.email?{email:String(t.email)}:{},...t.name?{name:String(t.name)}:{}},lt(n,i)}import{spawnSync as dt}from"node:child_process";import pt from"node:path";var ft="S-1-5-18",ht="S-1-5-32-544",mt=["$ErrorActionPreference='Stop'","$sid=[Security.Principal.SecurityIdentifier]","$user=[Security.Principal.WindowsIdentity]::GetCurrent().User.Value","$items=foreach($p in ($env:ORACLE_ACL_PATHS -split [char]10)){if([IO.Directory]::Exists($p)){$a=[IO.Directory]::GetAccessControl($p,'Owner,Access')}else{$a=[IO.File]::GetAccessControl($p,'Owner,Access')};@{owner=$a.GetOwner($sid).Value;sddl=$a.GetSecurityDescriptorSddlForm('Owner,Access');aces=@($a.GetAccessRules($true,$true,$sid)|ForEach-Object{@{sid=$_.IdentityReference.Value;allow=($_.AccessControlType -eq 'Allow')}})}}","[Console]::Out.Write((ConvertTo-Json -Compress -Depth 5 @{user=$user;items=@($items)}))"].join(";");function yt(e){let t=process.env.SystemRoot||process.env.SYSTEMROOT||"C:\\Windows",r=pt.win32.join(t,"System32","WindowsPowerShell","v1.0","powershell.exe"),o=dt(r,["-NoLogo","-NoProfile","-NonInteractive","-Command",mt],{encoding:"utf8",env:{SystemRoot:t,ORACLE_ACL_PATHS:e.join(`
5
+ `)},timeout:3e4,windowsHide:!0});if(o.error||o.status!==0)throw new Error("Windows security descriptor is unreadable");let n=JSON.parse(o.stdout);if(!Array.isArray(n.items)||n.items.length!==e.length)throw new Error("Windows security descriptor is unreadable");return n}function wt(e){let t=String(e?.user||"");if(!/^S-1-\d+(?:-\d+)+$/.test(t))return"current user SID is unknown";let r=new Set([t,ft,ht]);for(let o of e.items||[]){if(!r.has(o?.owner))return"owned by another principal";let n=String(o.sddl||"");if(!/D:/.test(n)||/D:[A-Z]*NO_ACCESS_CONTROL/.test(n))return"no discretionary access control";let i=n.slice(n.indexOf("D:")+2).replace(/S:.*$/,"");for(let[,s]of i.matchAll(/\(([A-Z]+);/g))if(s!=="A"&&s!=="D")return"unsupported access control entry";if(!Array.isArray(o.aces))return"access rules are unreadable";for(let s of o.aces)if(s?.allow!==!1&&!r.has(s?.sid))return"grants access to another principal"}return null}function J(e,t=yt){try{let r=t(e);return!Array.isArray(r?.items)||r.items.length!==e.length?!1:wt(r)===null}catch{return!1}}var L=Object.freeze({"anthropic-oauth":{aliases:["anthropic-oauth","anthropic","claude","claude-oauth"],clientId:"9d1c250a-e61b-44d9-88ed-5944d1962f5e",authorizeUrl:"https://claude.ai/oauth/authorize",tokenUrl:"https://platform.claude.com/v1/oauth/token",redirectUri:"https://console.anthropic.com/oauth/code/callback",scope:"org:create_api_key user:profile user:inference",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},"openai-codex":{aliases:["openai-codex","openai-oauth","codex","codex-oauth"],clientId:"app_EMoamEEZ73f0CkXaXp7hrann",issuer:"https://auth.openai.com",tokenUrl:"https://auth.openai.com/oauth/token",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.6-sol",protocol:"responses"},"xai-oauth":{aliases:["xai-oauth","xai","grok","grok-oauth"],clientId:"b1a00492-073a-47ea-816f-4c329264a828",issuer:"https://auth.x.ai",discoveryUrl:"https://auth.x.ai/.well-known/openid-configuration",deviceUrl:"https://auth.x.ai/oauth2/device/code",scope:"openid profile email offline_access grok-cli:access api:access",baseUrl:"https://api.x.ai/v1",model:"grok-4.6",protocol:"responses"}}),ge=12e4;function kt(e={}){return typeof e.now=="function"?Number(e.now()):Date.now()}function j(e){let t=String(e||"").trim().toLowerCase();for(let[r,o]of Object.entries(L))if(o.aliases.includes(t))return r;throw new Error(`unsupported OAuth provider: ${e||"(empty)"}`)}function Se(e){let t=j(e);return{id:t,...L[t]}}function O(e,t={}){if(!g.existsSync(e))return t;try{let r=JSON.parse(g.readFileSync(e,"utf8"));if(!r||typeof r!="object"||Array.isArray(r))throw new Error("invalid object");return r}catch{throw new Error(`credential store is unreadable or corrupt: ${y.basename(e)}`)}}function xe(e,t=process.platform,r=void 0){if(N(e),t!=="win32")g.chmodSync(e,448);else if(!J([e],r))throw oe(e)}function _t(e,t,r=process.platform,o=void 0){xe(y.dirname(e),r,o);let n=`${e}.${process.pid}.${te(4).toString("hex")}.tmp`;if(g.writeFileSync(n,`${JSON.stringify(t,null,2)}
6
+ `,{mode:384}),r==="win32"&&!J([n],o)){try{g.unlinkSync(n)}catch{}throw oe(e)}g.renameSync(n,e),r!=="win32"&&g.chmodSync(e,384)}function oe(e){return new Error(`credential store is not owner-only (allow only the current user, SYSTEM and Administrators): ${y.basename(e)}`)}function Ot(e,t=process.platform){if(t!=="linux")return!1;let r=e("secret-tool",["--version"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return!r.error&&r.status===0}function Q(e){let t=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(t))throw new Error(`invalid API-key provider: ${e||"(empty)"}`);return t}function U(e={}){let t=String(e.accessToken||e.access_token||"").trim(),r=String(e.refreshToken||e.refresh_token||"").trim(),o=e.expires_at_ms!=null,n;if(o){let i=e.expires_at_ms;if(n=Number(i),typeof i!="number"&&typeof i!="string"||typeof i=="string"&&!i.trim()||!Number.isFinite(n)||n<=0)throw new Error("OAuth credential has invalid expires_at_ms")}else n=Number(e.expiresAt||e.expires_at||0),Number.isFinite(n)&&n>=1e9&&n<1e12&&(n=n*1e3);if(!t)throw new Error("OAuth credential is missing access token");return{accessToken:t,refreshToken:r,expiresAt:Number.isFinite(n)?n:0,tokenType:String(e.tokenType||e.token_type||"Bearer"),source:String(e.source||"oracle"),...e.discovery?{discovery:e.discovery}:{},...e.scope?{scope:e.scope}:{},...e.idToken||e.id_token?{idToken:String(e.idToken||e.id_token)}:{}}}function bt(e={}){let t=e.file||y.join(x(),"oauth.json"),r=e.metadataFile||y.join(y.dirname(t),"oauth-meta.json"),o=e.linksFile||y.join(y.dirname(t),"oauth-links.json"),n=()=>typeof e.now=="function"?Number(e.now()):Date.now(),i=e.spawnFn||At,s=e.platform||process.platform,l=e.windowsSecurity,a=e.keychain!==!1&&process.env.ORACLE_AUTH_FILE_STORE!=="1"&&Ot(i,s),h=a?"linux-secret-service":"private-file",w=`${t}.lock`;function _(d,u){if(s!=="win32")return O(d,u);if(!g.existsSync(d))return u;if(!J([y.dirname(d),d],l))throw oe(d);return O(d,u)}function b(d,u){_t(d,u,s,l)}async function Re(d){xe(y.dirname(w),s,l);let u;for(let c=0;c<400;c+=1)try{u=g.openSync(w,"wx",384);break}catch(p){if(p?.code!=="EEXIST")throw p;try{Date.now()-g.statSync(w).mtimeMs>3e5&&g.unlinkSync(w)}catch{}await new Promise(f=>setTimeout(f,25))}if(u===void 0)throw new Error("timed out waiting for OAuth credential lock");try{return await d()}finally{try{g.closeSync(u)}catch{}try{g.unlinkSync(w)}catch{}}}function P(d,u="oauth"){return["application","oracle","kind",u,"provider",d]}let ae=!1;function ue(){if(ae)return;ae=!0;let d=y.join(x(),"oauth-links.json");if(y.resolve(o)===y.resolve(d))try{he({linksFile:o})}catch{}}function z(d){if(ue(),!g.existsSync(o))return[];let c=O(o,{providers:{}}).providers?.[d];if(!Array.isArray(c))return[];let p=[];for(let f of c)if(y.isAbsolute(String(f||"")))try{let m=O(f,{});if(d==="anthropic-oauth"&&m.claudeAiOauth){let A=U(m.claudeAiOauth);p.push({...A,refreshToken:"",source:"external-access-only",label:y.basename(y.dirname(f))||"claude-lane"});continue}let S=m.credential_pool&&typeof m.credential_pool=="object"?m.credential_pool:null;if(S){let A=S[d]||S[d.replace(/-oauth$/,"")]||[],Fe=Array.isArray(A)?A:A?[A]:[];for(let D of Fe)if(!(!D||typeof D!="object"))try{let ze=U(D);p.push({...ze,refreshToken:"",source:"external-access-only",label:String(D.label||D.id||y.basename(y.dirname(f))||d)})}catch{}}}catch{}return p}function q(d){let u=z(d);return u.length?u.find(c=>!c.expiresAt||c.expiresAt>n()+ge)||u[0]:null}function V(d){return d.map(u=>({label:String(u.label||"lane"),source:"external-access-only",expiresAt:Number(u.expiresAt||0),healthy:!u.expiresAt||u.expiresAt>n()+ge}))}function le(d){let u=j(d);if(a){let f=i("secret-tool",["lookup",...P(u)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(!f.error&&f.status===0&&String(f.stdout||"").trim())try{return U(JSON.parse(String(f.stdout).trim()))}catch{}return q(u)}let p=_(t,{providers:{}}).providers?.[u];if(p)try{return U(p)}catch{}return q(u)}function Te(d,u){let c=j(d),p=U(u);if(a){let m=i("secret-tool",["store",`--label=Oracle ${c} OAuth`,...P(c)],{input:JSON.stringify(p),encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(m.error||m.status!==0)throw new Error("OS credential store rejected OAuth credential");let S=O(r,{providers:{}});S.providers||={},S.providers[c]={expiresAt:p.expiresAt,source:p.source},b(r,S);try{let A=Y(p.idToken);X(c,{source:p.source,...A,label:A.name||A.email||c},{configDir:y.dirname(t)})}catch{}return p}let f=_(t,{providers:{}});f.providers||={},f.providers[c]=p,b(t,f);try{let m=Y(p.idToken);X(c,{source:p.source,...m,label:m.name||m.email||c},{configDir:y.dirname(t)})}catch{}return p}function Ie(d){let u=j(d);if(a){let f=i("secret-tool",["clear",...P(u)],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),m=O(r,{providers:{}});return m.providers&&delete m.providers[u],b(r,m),!f.error&&f.status===0}let c=_(t,{providers:{}}),p=!!c.providers?.[u];return c.providers&&delete c.providers[u],b(t,c),p}function de(d){let u=Q(d);if(a){let c=i("secret-tool",["lookup",...P(u,"api-key")],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return c.error||c.status!==0?"":String(c.stdout||"").trim()}return String(_(t,{apiKeys:{}}).apiKeys?.[u]||"").trim()}function Ue(d,u){let c=Q(d),p=String(u||"").trim();if(!p)throw new Error("API key is empty");if(a){let m=i("secret-tool",["store",`--label=Oracle ${c} API key`,...P(c,"api-key")],{input:p,encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(m.error||m.status!==0)throw new Error("OS credential store rejected API key");let S=O(r,{providers:{},apiKeys:{}});return S.apiKeys||={},S.apiKeys[c]={configured:!0},b(r,S),!0}let f=_(t,{providers:{},apiKeys:{}});return f.apiKeys||={},f.apiKeys[c]=p,b(t,f),!0}function Le(d){let u=Q(d);if(a){let f=i("secret-tool",["clear",...P(u,"api-key")],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),m=O(r,{providers:{},apiKeys:{}});return m.apiKeys&&delete m.apiKeys[u],b(r,m),!f.error&&f.status===0}let c=_(t,{providers:{},apiKeys:{}}),p=!!c.apiKeys?.[u];return c.apiKeys&&delete c.apiKeys[u],b(t,c),p}function De(){ue();let d={},u={};if(a){let c=O(r,{providers:{},apiKeys:{}});for(let[p,f]of Object.entries(c.providers||{}))d[p]={loggedIn:!!le(p),expiresAt:Number(f.expiresAt||0),source:String(f.source||"oracle"),storage:h,lanes:V(z(p))};for(let p of Object.keys(c.apiKeys||{}))u[p]={configured:!!de(p),storage:h}}else{let c=_(t,{providers:{},apiKeys:{}});for(let[p,f]of Object.entries(c.providers||{}))d[p]={loggedIn:!!f?.accessToken,expiresAt:Number(f?.expiresAt||0),source:String(f?.source||"oracle"),storage:h,lanes:V(z(p))};for(let[p,f]of Object.entries(c.apiKeys||{}))u[p]={configured:!!f,storage:h}}for(let c of Object.keys(L)){let p=V(z(c));if(d[c]){d[c].lanes=p;continue}let f=q(c);f&&(d[c]={loggedIn:!0,expiresAt:f.expiresAt,source:f.source,storage:"external-access-source",lanes:p})}return{storage:h,providers:d,apiKeys:u}}return Object.freeze({file:t,storage:h,get:le,set:Te,remove:Ie,getApiKey:de,setApiKey:Ue,removeApiKey:Le,status:De,withLock:Re})}var ve;function Ae(){return ve||=bt(),ve}function ee(e){return Buffer.from(e).toString("base64url")}function Et(){let e=ee(te(32));return{verifier:e,challenge:ee(gt("sha256").update(e).digest()),state:ee(te(24))}}function jt(e,t){let r=Buffer.from(String(e||"")),o=Buffer.from(String(t||""));return r.length===o.length&&vt(r,o)}function Ct(e){let t=String(e),r=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd.exe",["/d","/s","/c","start","",t]]:["xdg-open",[t]];try{return xt(r[0],r[1],{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function re(e){return new URLSearchParams(e).toString()}async function C(e,t){if(!e?.ok){let o="";try{o=String((await e.json())?.error||"")}catch{}throw new Error(`${t} failed (HTTP ${e?.status||"unknown"}${o?`, ${o}`:""})`)}let r=await e.json();if(!r||typeof r!="object")throw new Error(`${t} returned invalid JSON`);return r}async function $t(e){if(e)return String(await e()).trim();let t=St.createInterface({input:process.stdin,output:process.stdout});try{return String(await t.question("Authorization code: ")).trim()}finally{t.close()}}function ne(e,t={}){let r=String(e.access_token||"").trim(),o=String(e.refresh_token||t.refreshToken||"").trim();if(!r)throw new Error("OAuth token response is missing access token");let n=Number(e.expires_in||3600);return U({accessToken:r,refreshToken:o,expiresAt:kt(t)+Math.max(1,n)*1e3,tokenType:e.token_type||"Bearer",idToken:e.id_token,source:"oracle",...t.discovery?{discovery:t.discovery}:{},...e.scope?{scope:e.scope}:{}})}async function Pt(e){let t=L["anthropic-oauth"],r=e.pkce||Et(),o=new URLSearchParams({code:"true",client_id:t.clientId,response_type:"code",redirect_uri:t.redirectUri,scope:t.scope,code_challenge:r.challenge,code_challenge_method:"S256",state:r.state}),n=`${t.authorizeUrl}?${o}`;e.output(`Open: ${n}`),e.openFn(n);let i=await $t(e.inputFn),[s,l]=i.split("#",2);if(!s||!jt(l,r.state))throw new Error("Claude OAuth state mismatch");let a=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/json","user-agent":"axios/1.7.9"},body:JSON.stringify({grant_type:"authorization_code",client_id:t.clientId,code:s,state:l,redirect_uri:t.redirectUri,code_verifier:r.verifier})});return ne(await C(a,"Claude OAuth token exchange"),e)}async function Rt(e){let t=L["openai-codex"],r=await C(await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/usercode`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:t.clientId})}),"Codex device authorization");if(!r.user_code||!r.device_auth_id)throw new Error("Codex device authorization returned incomplete data");let o=`${t.issuer}/codex/device`;e.output(`Open: ${o}`),e.output(`Code: ${r.user_code}`),e.openFn(o);let n=Math.max(3,Number(r.interval||5)),i;for(let l=0;l<Math.ceil(900/n);l+=1){await e.sleepFn(n*1e3);let a=await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_auth_id:r.device_auth_id,user_code:r.user_code})});if(a.ok){i=await C(a,"Codex device authorization");break}if(![403,404].includes(a.status))throw new Error(`Codex device authorization failed (HTTP ${a.status})`)}if(!i)throw new Error("Codex device authorization timed out");let s=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:re({grant_type:"authorization_code",code:i.authorization_code,redirect_uri:`${t.issuer}/deviceauth/callback`,client_id:t.clientId,code_verifier:i.code_verifier})});return ne(await C(s,"Codex OAuth token exchange"),e)}function W(e){let t=new URL(String(e)),r=t.hostname.toLowerCase();if(t.protocol!=="https:"||r!=="x.ai"&&!r.endsWith(".x.ai"))throw new Error("xAI OAuth discovery returned an untrusted endpoint");return t.toString()}async function Tt(e){let t=L["xai-oauth"],r=await C(await e.fetchFn(t.discoveryUrl,{headers:{accept:"application/json"}}),"xAI OAuth discovery");W(r.authorization_endpoint);let o=W(r.token_endpoint),n=await C(await e.fetchFn(t.deviceUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:re({client_id:t.clientId,scope:t.scope})}),"xAI device authorization");if(!n.device_code||!n.user_code||!n.verification_uri)throw new Error("xAI device authorization returned incomplete data");let i=W(n.verification_uri_complete||n.verification_uri);e.output(`Open: ${i}`),e.output(`Code: ${n.user_code}`),e.openFn(i);let s=Math.max(1,Number(n.interval||5)),l=Math.ceil(Math.max(1,Number(n.expires_in||600))/s);for(let a=0;a<l;a+=1){let h=await e.fetchFn(o,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:re({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:t.clientId,device_code:n.device_code})});if(h.ok){let _=await C(h,"xAI OAuth token exchange");return ne(_,{...e,discovery:{authorization_endpoint:W(r.authorization_endpoint),token_endpoint:o}})}let w="";try{w=String((await h.json())?.error||"")}catch{}if(w==="slow_down")await e.sleepFn((s+1)*1e3);else if(w==="authorization_pending")await e.sleepFn(s*1e3);else throw new Error(`xAI OAuth token exchange failed (HTTP ${h.status}${w?`, ${w}`:""})`)}throw new Error("xAI device authorization timed out")}async function ke(e,t={}){let r=j(e),o={fetchFn:t.fetchFn||globalThis.fetch,inputFn:t.inputFn,sleepFn:t.sleepFn||(n=>new Promise(i=>setTimeout(i,n))),openFn:t.openFn||Ct,output:t.output||(n=>process.stdout.write(`${n}
7
+ `)),now:t.now,pkce:t.pkce};return r==="anthropic-oauth"?Pt(o):r==="openai-codex"?Rt(o):Tt(o)}var $e=Object.freeze({openrouter:{model:"openrouter/auto"},openai:{model:"gpt-4.1-mini"},anthropic:{model:"claude-sonnet-4-6"},xai:{model:"grok-4.6"},deepseek:{model:"deepseek-chat"},gemini:{model:"gemini-2.5-flash"},kimi:{model:"kimi-k3"},mistral:{model:"mistral-large-latest"},nous:{model:"moonshotai/kimi-k3"},qwen:{model:"qwen-plus"},glm:{model:"glm-4.5"},custom:{model:""}});function se(e,t){let r=e.indexOf(t);return r>=0&&e[r+1]?e[r+1]:""}async function Dt(){let e="";for await(let t of process.stdin)e+=t;return e.trim()}function Ft(e="API key: "){if(!process.stdin.isTTY||!process.stdin.setRawMode)throw new Error("non-interactive API-key input requires --stdin");return process.stdout.write(e),new Promise((t,r)=>{let o="",n=()=>{process.stdin.off("data",i),process.stdin.setRawMode(!1),process.stdin.pause(),process.stdout.write(`
8
+ `)},i=s=>{let l=String(s);for(let a of l){if(a==="\r"||a===`
9
+ `){n(),t(o.trim());return}if(a===""){n(),r(new Error("cancelled"));return}a==="\x7F"||a==="\b"?o=o.slice(0,-1):o+=a}};process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on("data",i)})}function ce(e,t,{baseUrl:r=""}={}){if(e==="custom"&&!String(r||"").trim())throw new Error("custom provider requires --base-url");return{backend:"standalone",...B({provider:e,model:t,baseUrl:r},{requireModel:!0})}}function Pe(e,t,r={}){return pe(ce(e,t,r))}function zt(e){process.stdout.write(`storage: ${e.storage}
9
10
  `);let t=Object.entries(e.providers||{}),r=Object.entries(e.apiKeys||{});if(!t.length&&!r.length){process.stdout.write(`no credentials configured
10
11
  `);return}for(let[o,n]of t){let i=n.expiresAt?new Date(n.expiresAt).toISOString():"unknown";process.stdout.write(`${o}: ${n.loggedIn?"logged in":"missing"}, expires ${i}
11
12
  `);for(let s of n.lanes||[])process.stdout.write(` ${s.label}: ${s.healthy?"ready":"expired"}
12
13
  `)}for(let[o,n]of r)process.stdout.write(`${o}: API key ${n.configured?"configured":"missing"}
13
- `)}function Et(){return["oracle auth, configure OAuth or API-key authentication",""," oracle auth login claude|codex|grok [--model MODEL] [--no-browser]"," oracle auth api-key PROVIDER [--model MODEL] [--base-url URL]"," PROVIDER: openrouter|openai|anthropic|xai|deepseek|gemini|kimi|mistral|nous|qwen|glm|custom",` printf '%s\\n' "$KEY" | oracle auth api-key PROVIDER --stdin`," oracle auth status [--json]"," oracle auth usage [--json]"," oracle auth logout PROVIDER","","OAuth and API keys are additive. Select any compatible model with oracle model --provider PROVIDER --model MODEL."].join(`
14
- `)}var ar={name:"auth",summary:"login with Claude, Codex, or Grok OAuth; store provider API keys",group:"read",usage:Et(),async run(e){let t=[...e.argv],r=t.shift()||"status",o=ge();try{if(r==="status"){let n=o.status();return t.includes("--json")?process.stdout.write(`${JSON.stringify(n,null,2)}
15
- `):Ot(n),0}if(r==="usage"){let{collectOAuthUsage:n}=await Promise.resolve().then(()=>(_e(),be)),i=await n(o);return process.stdout.write(`${JSON.stringify(i)}
16
- `),0}if(r==="login"){let n=t.find(u=>!u.startsWith("-"));if(!n)throw new Error("usage: oracle auth login claude|codex|grok");let i=ye(n),s=oe(t,"--model")||i.model;ne(i.id,s);let c=await ve(i.id,{openFn:t.includes("--no-browser")?()=>!1:void 0});return await o.withLock(async()=>{let u=o.get(i.id);o.set(i.id,c);try{Ee(i.id,s)}catch(m){throw u?o.set(i.id,u):o.remove(i.id),m}}),process.stdout.write(`${i.id}: logged in, stored in ${o.storage}
17
- `),0}if(r==="api-key"){let n=String(t.find(u=>!u.startsWith("-"))||"").trim().toLowerCase();if(!n)throw new Error("usage: oracle auth api-key PROVIDER [--stdin]");if(!Object.hasOwn(Oe,n))throw new Error(`unsupported API-key provider: ${n}`);let i=oe(t,"--model")||Oe[n].model,s=oe(t,"--base-url");ne(n,i,{baseUrl:s});let c=t.includes("--stdin")?await bt():await _t();return await o.withLock(async()=>{let u=o.getApiKey(n);o.setApiKey(n,c);try{Ee(n,i,{baseUrl:s})}catch(m){throw u?o.setApiKey(n,u):o.removeApiKey(n),m}}),process.stdout.write(`${n}: API key configured in ${o.storage}
18
- `),0}if(r==="logout"){let n=String(t.find(c=>!c.startsWith("-"))||"").trim().toLowerCase();if(!n)throw new Error("usage: oracle auth logout PROVIDER");let i=!1;try{i=o.remove(E(n))}catch{}let s=o.removeApiKey(n);if(!i&&!s)throw new Error(`${n}: no local credential found`);return process.stdout.write(`${n}: local credential removed
14
+ `)}function Kt(){return["oracle auth, configure OAuth or API-key authentication",""," oracle auth login claude|codex|grok [--model MODEL] [--no-browser]"," oracle auth api-key PROVIDER [--model MODEL] [--base-url URL]"," PROVIDER: openrouter|openai|anthropic|xai|deepseek|gemini|kimi|mistral|nous|qwen|glm|custom",` printf '%s\\n' "$KEY" | oracle auth api-key PROVIDER --stdin`," oracle auth status [--json]"," oracle auth usage [--json]"," oracle auth logout PROVIDER","","OAuth and API keys are additive. Select any compatible model with oracle model --provider PROVIDER --model MODEL."].join(`
15
+ `)}var _r={name:"auth",summary:"login with Claude, Codex, or Grok OAuth; store provider API keys",group:"read",usage:Kt(),async run(e){let t=[...e.argv],r=t.shift()||"status",o=Ae();try{if(r==="status"){let n=o.status();return t.includes("--json")?process.stdout.write(`${JSON.stringify(n,null,2)}
16
+ `):zt(n),0}if(r==="usage"){let{collectOAuthUsage:n}=await Promise.resolve().then(()=>(Ce(),je)),i=await n(o);return process.stdout.write(`${JSON.stringify(i)}
17
+ `),0}if(r==="login"){let n=t.find(a=>!a.startsWith("-"));if(!n)throw new Error("usage: oracle auth login claude|codex|grok");let i=Se(n),s=se(t,"--model")||i.model;ce(i.id,s);let l=await ke(i.id,{openFn:t.includes("--no-browser")?()=>!1:void 0});return await o.withLock(async()=>{let a=o.get(i.id);o.set(i.id,l);try{Pe(i.id,s)}catch(h){throw a?o.set(i.id,a):o.remove(i.id),h}}),process.stdout.write(`${i.id}: logged in, stored in ${o.storage}
18
+ `),0}if(r==="api-key"){let n=String(t.find(a=>!a.startsWith("-"))||"").trim().toLowerCase();if(!n)throw new Error("usage: oracle auth api-key PROVIDER [--stdin]");if(!Object.hasOwn($e,n))throw new Error(`unsupported API-key provider: ${n}`);let i=se(t,"--model")||$e[n].model,s=se(t,"--base-url");ce(n,i,{baseUrl:s});let l=t.includes("--stdin")?await Dt():await Ft();return await o.withLock(async()=>{let a=o.getApiKey(n);o.setApiKey(n,l);try{Pe(n,i,{baseUrl:s})}catch(h){throw a?o.setApiKey(n,a):o.removeApiKey(n),h}}),process.stdout.write(`${n}: API key configured in ${o.storage}
19
+ `),0}if(r==="logout"){let n=String(t.find(l=>!l.startsWith("-"))||"").trim().toLowerCase();if(!n)throw new Error("usage: oracle auth logout PROVIDER");let i=!1;try{i=o.remove(j(n))}catch{}let s=o.removeApiKey(n);if(!i&&!s)throw new Error(`${n}: no local credential found`);return process.stdout.write(`${n}: local credential removed
19
20
  `),0}throw new Error(`unknown auth action: ${r}`)}catch(n){return process.stderr.write(`oracle auth: ${n.message}
20
- `),1}}};export{ar as default};
21
+ `),1}}};export{_r as default};
@@ -1,6 +1,6 @@
1
- import q from"node:readline/promises";import{stdin as F,stdout as M}from"node:process";import O from"node:fs";import R from"node:os";import A from"node:path";var I=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"canton",aliases:["cc","canton-network","canton-coin","amulet"],chainId:"CC",name:"canton",kind:"daml",family:"canton",agent:"canton-agent",note:"cc reads \xB7 not evm",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);function c(n){return String(n||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}var x=/^[a-z0-9][a-z0-9-]*$/;function U(){let n=process.env.ORACLE_CONFIG_DIR||A.join(R.homedir(),".config","oracle");return A.join(n,"chains.json")}function w(n){if(!n||typeof n!="object")return null;let t=String(n.key??"").trim();if(!t||/[/\\.]/.test(t))return null;let e=c(t);if(!x.test(e))return null;let i=typeof n.chainId=="string"?n.chainId.trim():Number(n.chainId);if(i===""||i===null||i===void 0||typeof i=="number"&&!Number.isFinite(i))return null;let r=typeof n.agent=="string"&&x.test(n.agent.trim())?n.agent.trim():"oracle";return{key:e,aliases:Array.isArray(n.aliases)?n.aliases.map(c).filter(Boolean).slice(0,8):[],chainId:i,name:String(n.name||e).slice(0,60),kind:["evm","svm","utxo","venue","daml"].includes(n.kind)?n.kind:"evm",family:c(n.family)||e,agent:r,note:String(n.note||"user-defined").slice(0,80),build:n.build!==!1,source:"user"}}function D(n=O.readFileSync){try{let t=JSON.parse(n(U(),"utf8")),e=Array.isArray(t?.chains)?t.chains:[],i=[],r=new Set;for(let o of e){let a=w(o);!a||r.has(a.key)||(r.add(a.key),i.push(a))}return i}catch{return[]}}function E(){let n=D();if(n.length===0)return I;let t=new Map(I.map(e=>[e.key,e]));for(let e of n)t.set(e.key,e);return[...t.values()]}function m({buildOnly:n=!1}={}){return E().filter(t=>n?t.build:!0)}function d(n){let t=c(n);if(!t)return null;for(let e of E())if(e.key===t||String(e.chainId).toLowerCase()===t||(e.aliases||[]).map(c).includes(t)||c(e.name)===t)return e;return null}function g({selectedKey:n=null,buildOnly:t=!1}={}){let e=m({buildOnly:t}),i=["oracle chains","","pick a build/trade surface:",""];for(let r of e){let o=n&&n===r.key?"*":" ",a=String(r.chainId).padEnd(6),s=r.key.padEnd(12);i.push(`${o} ${s} ${a} ${r.note}`)}return i.push(""),i.push("usage:"),i.push(" /chain list"),i.push(" /chain hyperliquid select"),i.push(" /chain show current"),i.push(" /chain clear unset"),i.push(" oracle chain use base same from shell"),n&&i.push("",`active: ${n}`),i.join(`
1
+ import q from"node:readline/promises";import{stdin as F,stdout as M}from"node:process";import R from"node:fs";import O from"node:os";import _ from"node:path";var I=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"elysium",aliases:["elysium-chain","pyr","1339"],chainId:1339,name:"elysium",kind:"evm",family:"evm",agent:"oracle",note:"pyr gas \xB7 read-only (no venue)",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"canton",aliases:["cc","canton-network","canton-coin","amulet"],chainId:"CC",name:"canton",kind:"daml",family:"canton",agent:"canton-agent",note:"cc reads \xB7 not evm",build:!0},{key:"near",aliases:["near-protocol","near-mainnet"],chainId:"NEAR",name:"near",kind:"near",family:"near",agent:"near-agent",note:"account + nep-141 reads \xB7 not evm",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);function c(n){return String(n||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}var E=/^[a-z0-9][a-z0-9-]*$/;function U(){let n=process.env.ORACLE_CONFIG_DIR||_.join(O.homedir(),".config","oracle");return _.join(n,"chains.json")}function w(n){if(!n||typeof n!="object")return null;let t=String(n.key??"").trim();if(!t||/[/\\.]/.test(t))return null;let e=c(t);if(!E.test(e))return null;let i=typeof n.chainId=="string"?n.chainId.trim():Number(n.chainId);if(i===""||i===null||i===void 0||typeof i=="number"&&!Number.isFinite(i))return null;let r=typeof n.agent=="string"&&E.test(n.agent.trim())?n.agent.trim():"oracle";return{key:e,aliases:Array.isArray(n.aliases)?n.aliases.map(c).filter(Boolean).slice(0,8):[],chainId:i,name:String(n.name||e).slice(0,60),kind:["evm","svm","utxo","venue","daml","near"].includes(n.kind)?n.kind:"evm",family:c(n.family)||e,agent:r,note:String(n.note||"user-defined").slice(0,80),build:n.build!==!1,source:"user"}}function D(n=R.readFileSync){try{let t=JSON.parse(n(U(),"utf8")),e=Array.isArray(t?.chains)?t.chains:[],i=[],r=new Set;for(let a of e){let o=w(a);!o||r.has(o.key)||(r.add(o.key),i.push(o))}return i}catch{return[]}}function x(){let n=D();if(n.length===0)return I;let t=new Map(I.map(e=>[e.key,e]));for(let e of n)t.set(e.key,e);return[...t.values()]}function m({buildOnly:n=!1}={}){return x().filter(t=>n?t.build:!0)}function d(n){let t=c(n);if(!t)return null;for(let e of x())if(e.key===t||String(e.chainId).toLowerCase()===t||(e.aliases||[]).map(c).includes(t)||c(e.name)===t)return e;return null}function g({selectedKey:n=null,buildOnly:t=!1}={}){let e=m({buildOnly:t}),i=["oracle chains","","pick a build/trade surface:",""];for(let r of e){let a=n&&n===r.key?"*":" ",o=String(r.chainId).padEnd(6),s=r.key.padEnd(12);i.push(`${a} ${s} ${o} ${r.note}`)}return i.push(""),i.push("usage:"),i.push(" /chain list"),i.push(" /chain hyperliquid select"),i.push(" /chain show current"),i.push(" /chain clear unset"),i.push(" oracle chain use base same from shell"),n&&i.push("",`active: ${n}`),i.join(`
2
2
  `)+`
3
- `}import f from"node:fs";import H from"node:path";import h from"node:fs";import N from"node:os";import u from"node:path";import{fileURLToPath as P}from"node:url";var $=u.dirname(P(import.meta.url)),ne=u.resolve($,"../..");function k(){return process.env.ORACLE_FAKE_HOME||N.homedir()}function K(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function p(){return K()?process.env.ORACLE_CONFIG_DIR||u.join(k(),".config","oracle"):u.join(k(),".config","oracle")}function T(){return u.join(p(),"desk.json")}function W(){return u.join(p(),"env")}function l({force:n=!1}={}){if(l._done&&!n)return l._result||null;l._done=!0;let t={},e=(r,o)=>{if(o==null)return;let a=String(o).trim();a&&(process.env[r]!=null&&String(process.env[r]).trim()!==""||(process.env[r]=a,t[r]=a))};try{let r=W();if(h.existsSync(r))for(let o of h.readFileSync(r,"utf8").split(/\r?\n/)){let a=o.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!a||a[2].startsWith("#"))continue;let s=a[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),e(a[1],s)}}catch{}try{let r=T();if(h.existsSync(r)){let o=JSON.parse(h.readFileSync(r,"utf8"));o&&typeof o=="object"&&(e("ORACLE_DESK_URL",o.deskUrl||o.dataUrl||o.url),e("ORACLE_DATA_URL",o.dataUrl||o.deskUrl||o.url),e("ORACLE_API_URL",o.apiUrl||o.dataUrl||o.deskUrl),e("ORACLE_PUBLIC_URL",o.publicUrl||o.deskUrl||o.dataUrl),e("ORACLE_EXEC_URL",o.execUrl),e("MAD_DESK_URL",o.deskUrl||o.dataUrl))}}catch{}let i=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return i&&(e("ORACLE_DESK_URL",i),e("ORACLE_DATA_URL",i),e("ORACLE_API_URL",i),e("ORACLE_PUBLIC_URL",i),e("MAD_DESK_URL",i)),l._result=Object.keys(t).length?t:null,l._result}try{l()}catch{}function j(n){return h.mkdirSync(n,{recursive:!0}),n}function v(){return H.join(p(),"active-chain.json")}function y(){let n=v();if(!f.existsSync(n))return null;try{let t=JSON.parse(f.readFileSync(n,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let e=d(t.key);return e?{key:e.key,chainId:e.chainId,name:e.name,agent:e.agent,selectedAt:t.selectedAt||null}:null}catch{return null}}function L(n){let t=d(n);if(!t){let i=new Error(`unknown chain '${n}'`);throw i.code="UNKNOWN_CHAIN",i}j(p());let e={key:t.key,chainId:t.chainId,name:t.name,agent:t.agent,selectedAt:new Date().toISOString()};return f.writeFileSync(v(),JSON.stringify(e,null,2)+`
3
+ `}import f from"node:fs";import H from"node:path";import h from"node:fs";import N from"node:os";import u from"node:path";import{fileURLToPath as P}from"node:url";var $=u.dirname(P(import.meta.url)),ne=u.resolve($,"../..");function k(){return process.env.ORACLE_FAKE_HOME||N.homedir()}function K(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function p(){return K()?process.env.ORACLE_CONFIG_DIR||u.join(k(),".config","oracle"):u.join(k(),".config","oracle")}function T(){return u.join(p(),"desk.json")}function W(){return u.join(p(),"env")}function l({force:n=!1}={}){if(l._done&&!n)return l._result||null;l._done=!0;let t={},e=(r,a)=>{if(a==null)return;let o=String(a).trim();o&&(process.env[r]!=null&&String(process.env[r]).trim()!==""||(process.env[r]=o,t[r]=o))};try{let r=W();if(h.existsSync(r))for(let a of h.readFileSync(r,"utf8").split(/\r?\n/)){let o=a.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!o||o[2].startsWith("#"))continue;let s=o[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),e(o[1],s)}}catch{}try{let r=T();if(h.existsSync(r)){let a=JSON.parse(h.readFileSync(r,"utf8"));a&&typeof a=="object"&&(e("ORACLE_DESK_URL",a.deskUrl||a.dataUrl||a.url),e("ORACLE_DATA_URL",a.dataUrl||a.deskUrl||a.url),e("ORACLE_API_URL",a.apiUrl||a.dataUrl||a.deskUrl),e("ORACLE_PUBLIC_URL",a.publicUrl||a.deskUrl||a.dataUrl),e("ORACLE_EXEC_URL",a.execUrl),e("MAD_DESK_URL",a.deskUrl||a.dataUrl))}}catch{}let i=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return i&&(e("ORACLE_DESK_URL",i),e("ORACLE_DATA_URL",i),e("ORACLE_API_URL",i),e("ORACLE_PUBLIC_URL",i),e("MAD_DESK_URL",i)),l._result=Object.keys(t).length?t:null,l._result}try{l()}catch{}function j(n){return h.mkdirSync(n,{recursive:!0}),n}function v(){return H.join(p(),"active-chain.json")}function y(){let n=v();if(!f.existsSync(n))return null;try{let t=JSON.parse(f.readFileSync(n,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let e=d(t.key);return e?{key:e.key,chainId:e.chainId,name:e.name,agent:e.agent,selectedAt:t.selectedAt||null}:null}catch{return null}}function L(n){let t=d(n);if(!t){let i=new Error(`unknown chain '${n}'`);throw i.code="UNKNOWN_CHAIN",i}j(p());let e={key:t.key,chainId:t.chainId,name:t.name,agent:t.agent,selectedAt:new Date().toISOString()};return f.writeFileSync(v(),JSON.stringify(e,null,2)+`
4
4
  `,{mode:384}),e}function S(){let n=v();return f.existsSync(n)&&f.unlinkSync(n),!0}function b(){return["oracle chain \u2014 pick the build/trade surface",""," oracle chain list working chains"," oracle chain list same"," oracle chain show show active chain"," oracle chain use <name> select (hyperliquid, base, solana, ...)"," oracle chain clear unset"," oracle chain --json machine output","","chat:"," /chain"," /chain hyperliquid"," /chain show"," /chain clear"].join(`
5
5
  `)}function J(n){let t=y();return n?(process.stdout.write(JSON.stringify({active:t,chains:m()},null,2)+`
6
6
  `),0):(process.stdout.write(g({selectedKey:t?.key||null})),0)}function B(n){let t=y();return n?(process.stdout.write(JSON.stringify({active:t},null,2)+`
@@ -12,10 +12,10 @@ run: oracle chain use hyperliquid
12
12
  build/trade context pinned for this machine
13
13
  `),0}catch(e){if(e?.code==="UNKNOWN_CHAIN")return process.stderr.write(`oracle chain: unknown '${n}'
14
14
  `),process.stderr.write(`try: oracle chain list
15
- `),1;throw e}}var he={name:"chain",summary:"list/select working chains (hyperliquid, base, solana, ...)",group:"read",usage:b(),async run(n){let t=[...n.argv],e=t.includes("--json"),i=t.filter(a=>a!=="--json"),r=(i[0]||"list").toLowerCase(),o=i.slice(1);if(["-h","--help","help"].includes(r))return process.stdout.write(b()+`
15
+ `),1;throw e}}var he={name:"chain",summary:"list/select working chains (hyperliquid, base, solana, ...)",group:"read",usage:b(),async run(n){let t=[...n.argv],e=t.includes("--json"),i=t.filter(o=>o!=="--json"),r=(i[0]||"list").toLowerCase(),a=i.slice(1);if(["-h","--help","help"].includes(r))return process.stdout.write(b()+`
16
16
  `),0;if(["list","ls"].includes(r))return J(e);if(["show","status","current"].includes(r))return B(e);if(["clear","unset","none"].includes(r))return S(),process.stdout.write(e?`{"ok":true,"active":null}
17
17
  `:`active chain cleared
18
- `),0;if(["use","set","select","pick"].includes(r)){let a=o.join(" ").trim();return a?C(a,e):(process.stderr.write(`usage: oracle chain use <name>
19
- `),1)}if(d(r))return C(r,e);if(!i.length&&process.stdin.isTTY){let a=m();process.stdout.write(g({selectedKey:y()?.key}));let s=q.createInterface({input:F,output:M});try{let _=(await s.question("chain> ")).trim();return _?C(_,!1):0}finally{s.close()}}return process.stderr.write(`oracle chain: unknown verb '${r}'
18
+ `),0;if(["use","set","select","pick"].includes(r)){let o=a.join(" ").trim();return o?C(o,e):(process.stderr.write(`usage: oracle chain use <name>
19
+ `),1)}if(d(r))return C(r,e);if(!i.length&&process.stdin.isTTY){let o=m();process.stdout.write(g({selectedKey:y()?.key}));let s=q.createInterface({input:F,output:M});try{let A=(await s.question("chain> ")).trim();return A?C(A,!1):0}finally{s.close()}}return process.stderr.write(`oracle chain: unknown verb '${r}'
20
20
  ${b()}
21
21
  `),1}};export{he as default};