@oracle-agent/oracle 0.11.0 → 0.12.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.
Files changed (308) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +66 -84
  3. package/SECURITY.md +37 -12
  4. package/SETUP.md +207 -272
  5. package/dist/action-receipts.mjs +1 -0
  6. package/dist/action-semantics.mjs +1 -0
  7. package/dist/address-book.mjs +2 -0
  8. package/dist/bin/desk-server.mjs +14 -0
  9. package/dist/bin/oracle-data-mcp.mjs +8 -0
  10. package/dist/bin/oracle-init.mjs +24 -0
  11. package/dist/bin/oracle-public-server.mjs +5 -0
  12. package/dist/bin/oracle-route.mjs +22 -0
  13. package/dist/bin/oracle-scan.mjs +18 -0
  14. package/dist/bin/oracle-upgrade.mjs +21 -0
  15. package/dist/bin/oracle.mjs +68 -0
  16. package/dist/chains.mjs +1 -0
  17. package/dist/cli/commands/auth.mjs +16 -0
  18. package/dist/cli/commands/bootstrap.mjs +18 -0
  19. package/dist/cli/commands/chain.mjs +21 -0
  20. package/dist/cli/commands/chat.mjs +35 -0
  21. package/dist/cli/commands/credential.mjs +1 -0
  22. package/dist/cli/commands/data-mcp.mjs +2 -0
  23. package/dist/cli/commands/data.mjs +12 -0
  24. package/dist/cli/commands/doctor.mjs +5 -0
  25. package/dist/cli/commands/gate.mjs +13 -0
  26. package/dist/cli/commands/help.mjs +1 -0
  27. package/dist/cli/commands/init.mjs +3 -0
  28. package/dist/cli/commands/mcp.mjs +33 -0
  29. package/dist/cli/commands/model.mjs +44 -0
  30. package/dist/cli/commands/prepare.mjs +2 -0
  31. package/dist/cli/commands/public.mjs +3 -0
  32. package/dist/cli/commands/route.mjs +2 -0
  33. package/dist/cli/commands/runner.mjs +1 -0
  34. package/dist/cli/commands/scan.mjs +2 -0
  35. package/dist/cli/commands/setup.mjs +34 -0
  36. package/dist/cli/commands/sign.mjs +4 -0
  37. package/dist/cli/commands/signer.mjs +1 -0
  38. package/dist/cli/commands/upgrade.mjs +2 -0
  39. package/dist/cli/commands/vault.mjs +1 -0
  40. package/dist/cli/commands/version.mjs +2 -0
  41. package/dist/data/desk-data.mjs +12 -0
  42. package/dist/index.mjs +17 -0
  43. package/dist/nft-gas-war-guard.mjs +1 -0
  44. package/dist/onboarding/harness-configs.mjs +4 -0
  45. package/dist/portfolio-risk.mjs +1 -0
  46. package/dist/prepare-envelope.mjs +1 -0
  47. package/dist/public-control/policy-schema.mjs +1 -0
  48. package/dist/router/index.mjs +2 -0
  49. package/dist/scanner/index.mjs +4 -0
  50. package/dist/signals/index.mjs +1 -0
  51. package/dist/watch-preferences.mjs +1 -0
  52. package/package.json +27 -65
  53. package/public/oracle-splash/index.html +11 -1
  54. package/CONTRIBUTING.md +0 -98
  55. package/bin/desk-server.mjs +0 -440
  56. package/bin/oracle-data-mcp.mjs +0 -1019
  57. package/bin/oracle-init.mjs +0 -496
  58. package/bin/oracle-public-server.mjs +0 -36
  59. package/bin/oracle-route.mjs +0 -254
  60. package/bin/oracle-scan.mjs +0 -192
  61. package/bin/oracle-upgrade.mjs +0 -42
  62. package/bin/oracle.mjs +0 -33
  63. package/docs/adding-a-chain.md +0 -229
  64. package/docs/architecture.md +0 -138
  65. package/docs/cli.md +0 -47
  66. package/docs/connectors.md +0 -13
  67. package/docs/oracle-pack-standard.md +0 -29
  68. package/docs/profiles.md +0 -151
  69. package/docs/public-surface.md +0 -133
  70. package/examples/add-a-chain.mjs +0 -65
  71. package/examples/oracle-pack-template.mjs +0 -38
  72. package/examples/research-a-token.mjs +0 -70
  73. package/plugins/oracle-owner-gate/__init__.py +0 -227
  74. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  75. package/profiles/_template/SOUL.md +0 -54
  76. package/profiles/_template/profile.json +0 -22
  77. package/profiles/bitcoin-agent/SOUL.md +0 -31
  78. package/profiles/bitcoin-agent/profile.json +0 -32
  79. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  80. package/profiles/hyperliquid-agent/profile.json +0 -37
  81. package/profiles/oracle/SOUL.md +0 -107
  82. package/profiles/oracle/profile.json +0 -39
  83. package/profiles/polymarket-agent/SOUL.md +0 -35
  84. package/profiles/polymarket-agent/profile.json +0 -34
  85. package/profiles/profile.schema.json +0 -90
  86. package/profiles/protocol-builder/SOUL.md +0 -57
  87. package/profiles/protocol-builder/profile.json +0 -39
  88. package/profiles/robinhood-agent/SOUL.md +0 -53
  89. package/profiles/robinhood-agent/profile.json +0 -40
  90. package/profiles/solana-agent/SOUL.md +0 -37
  91. package/profiles/solana-agent/profile.json +0 -37
  92. package/profiles/stable-agent/SOUL.md +0 -43
  93. package/profiles/stable-agent/profile.json +0 -37
  94. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  95. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  96. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  97. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  98. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  99. package/scripts/adversarial-bench.mjs +0 -114
  100. package/scripts/build-inscription.py +0 -230
  101. package/scripts/check-doc-drift.mjs +0 -123
  102. package/scripts/check-test-count.mjs +0 -105
  103. package/scripts/e2e-hl-markets.mjs +0 -21
  104. package/scripts/e2e-hl-perps.mjs +0 -48
  105. package/scripts/e2e-hypercore-staking.mjs +0 -128
  106. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  107. package/scripts/protocol-template-gate.mjs +0 -15
  108. package/scripts/public-api-scan.mjs +0 -23
  109. package/scripts/secret-scan.mjs +0 -181
  110. package/scripts/verify-v3-venues.mjs +0 -192
  111. package/skills/balance/SKILL.md +0 -176
  112. package/skills/oracle-action-semantics/SKILL.md +0 -40
  113. package/skills/oracle-best-execution/SKILL.md +0 -127
  114. package/skills/oracle-bitcoin/SKILL.md +0 -53
  115. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  116. package/skills/oracle-chat/SKILL.md +0 -61
  117. package/skills/oracle-chat/chain.SKILL.md +0 -31
  118. package/skills/oracle-chat/setup.SKILL.md +0 -37
  119. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  120. package/skills/oracle-contract-research/SKILL.md +0 -55
  121. package/skills/oracle-desk/SKILL.md +0 -58
  122. package/skills/oracle-dex-launch/SKILL.md +0 -38
  123. package/skills/oracle-grants/SKILL.md +0 -69
  124. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  125. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  126. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  127. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  128. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  129. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  130. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  131. package/skills/oracle-polymarket/SKILL.md +0 -60
  132. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  133. package/skills/oracle-protocol-security/SKILL.md +0 -60
  134. package/skills/oracle-public-product/SKILL.md +0 -44
  135. package/skills/oracle-receipts/SKILL.md +0 -52
  136. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  137. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  138. package/skills/oracle-solana/SKILL.md +0 -65
  139. package/skills/oracle-solana-nft/SKILL.md +0 -54
  140. package/skills/oracle-token-research/SKILL.md +0 -67
  141. package/skins/oracle.yaml +0 -56
  142. package/src/action-receipts.mjs +0 -265
  143. package/src/action-semantics.mjs +0 -62
  144. package/src/address-book.mjs +0 -208
  145. package/src/agent-auth.mjs +0 -206
  146. package/src/approval-guard.mjs +0 -282
  147. package/src/attestation-secret.mjs +0 -88
  148. package/src/audit-log.mjs +0 -196
  149. package/src/auth/oauth.mjs +0 -672
  150. package/src/auto-slippage.mjs +0 -378
  151. package/src/capability-posture.mjs +0 -125
  152. package/src/chains.mjs +0 -62
  153. package/src/cli/chain-catalog.mjs +0 -215
  154. package/src/cli/chain-state.mjs +0 -74
  155. package/src/cli/commands/auth.mjs +0 -193
  156. package/src/cli/commands/bootstrap.mjs +0 -87
  157. package/src/cli/commands/chain.mjs +0 -143
  158. package/src/cli/commands/chat.mjs +0 -434
  159. package/src/cli/commands/credential.mjs +0 -9
  160. package/src/cli/commands/data-mcp.mjs +0 -18
  161. package/src/cli/commands/data.mjs +0 -75
  162. package/src/cli/commands/doctor.mjs +0 -136
  163. package/src/cli/commands/help.mjs +0 -7
  164. package/src/cli/commands/init.mjs +0 -27
  165. package/src/cli/commands/mcp.mjs +0 -142
  166. package/src/cli/commands/model.mjs +0 -99
  167. package/src/cli/commands/prepare.mjs +0 -12
  168. package/src/cli/commands/public.mjs +0 -20
  169. package/src/cli/commands/route.mjs +0 -12
  170. package/src/cli/commands/runner.mjs +0 -9
  171. package/src/cli/commands/scan.mjs +0 -12
  172. package/src/cli/commands/setup.mjs +0 -275
  173. package/src/cli/commands/sign.mjs +0 -21
  174. package/src/cli/commands/signer.mjs +0 -9
  175. package/src/cli/commands/upgrade.mjs +0 -12
  176. package/src/cli/commands/vault.mjs +0 -9
  177. package/src/cli/commands/version.mjs +0 -22
  178. package/src/cli/first-run.mjs +0 -23
  179. package/src/cli/kernel.mjs +0 -239
  180. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  181. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  182. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  183. package/src/cli/mcp-targets/codex.mjs +0 -41
  184. package/src/cli/mcp-targets/shared.mjs +0 -61
  185. package/src/cli/messaging-platforms.mjs +0 -209
  186. package/src/cli/model-config.mjs +0 -70
  187. package/src/cli/operator-dispatch.mjs +0 -258
  188. package/src/cli/oracle-harness.py +0 -415
  189. package/src/cli/paths.mjs +0 -83
  190. package/src/cli/runtime.mjs +0 -351
  191. package/src/cli/setup-state.mjs +0 -168
  192. package/src/cli/spawn-child.mjs +0 -43
  193. package/src/data/catalog.mjs +0 -585
  194. package/src/data/desk-data.mjs +0 -695
  195. package/src/data/http.mjs +0 -253
  196. package/src/data/provider-endpoint.mjs +0 -94
  197. package/src/data/providers/aerodrome.mjs +0 -245
  198. package/src/data/providers/balancer.mjs +0 -209
  199. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  200. package/src/data/providers/bitcoin-meta.mjs +0 -378
  201. package/src/data/providers/blockscout.mjs +0 -14
  202. package/src/data/providers/bridges.mjs +0 -242
  203. package/src/data/providers/cowswap.mjs +0 -415
  204. package/src/data/providers/curve.mjs +0 -201
  205. package/src/data/providers/defillama.mjs +0 -88
  206. package/src/data/providers/dexscreener.mjs +0 -43
  207. package/src/data/providers/evm-rpc.mjs +0 -225
  208. package/src/data/providers/geckoterminal.mjs +0 -34
  209. package/src/data/providers/gmx.mjs +0 -496
  210. package/src/data/providers/hl-assets.mjs +0 -165
  211. package/src/data/providers/hl-info.mjs +0 -108
  212. package/src/data/providers/hl-markets.mjs +0 -210
  213. package/src/data/providers/hl-outcome.mjs +0 -61
  214. package/src/data/providers/hl-perps.mjs +0 -387
  215. package/src/data/providers/hl-staking.mjs +0 -353
  216. package/src/data/providers/hl-ws.mjs +0 -119
  217. package/src/data/providers/hyperevm-dex.mjs +0 -49
  218. package/src/data/providers/jupiter-venues.mjs +0 -119
  219. package/src/data/providers/jupiter.mjs +0 -315
  220. package/src/data/providers/lifi.mjs +0 -151
  221. package/src/data/providers/magiceden-sol.mjs +0 -406
  222. package/src/data/providers/morpho.mjs +0 -177
  223. package/src/data/providers/nft-gallery.mjs +0 -163
  224. package/src/data/providers/nft-portfolio.mjs +0 -494
  225. package/src/data/providers/odos.mjs +0 -156
  226. package/src/data/providers/oneinch.mjs +0 -174
  227. package/src/data/providers/opensea-multichain.mjs +0 -136
  228. package/src/data/providers/opensea-nft.mjs +0 -371
  229. package/src/data/providers/paraswap.mjs +0 -118
  230. package/src/data/providers/pendle.mjs +0 -188
  231. package/src/data/providers/poly-clob.mjs +0 -283
  232. package/src/data/providers/poly-public.mjs +0 -96
  233. package/src/data/providers/poly-ws.mjs +0 -103
  234. package/src/data/providers/portfolio-history.mjs +0 -394
  235. package/src/data/providers/portfolio.mjs +0 -594
  236. package/src/data/providers/rfq.mjs +0 -15
  237. package/src/data/providers/rh-agent.mjs +0 -59
  238. package/src/data/providers/satflow.mjs +0 -341
  239. package/src/data/providers/signed-material-guard.mjs +0 -108
  240. package/src/data/providers/solana-rpc.mjs +0 -197
  241. package/src/data/providers/uniswap-v3.mjs +0 -349
  242. package/src/data/providers/uniswap-v4.mjs +0 -414
  243. package/src/data/providers/zerox.mjs +0 -167
  244. package/src/data/public-api-scan.mjs +0 -61
  245. package/src/data/quote-placeholder.mjs +0 -31
  246. package/src/exact-integer.mjs +0 -72
  247. package/src/exec-policy.mjs +0 -455
  248. package/src/flags.mjs +0 -15
  249. package/src/fresh-window.mjs +0 -76
  250. package/src/gmx-attestation.mjs +0 -176
  251. package/src/index.mjs +0 -100
  252. package/src/nft-gas-war-guard.mjs +0 -139
  253. package/src/onboarding/agent-keys.mjs +0 -161
  254. package/src/onboarding/harness-configs.mjs +0 -102
  255. package/src/onboarding/index.mjs +0 -18
  256. package/src/onboarding/tiers.mjs +0 -139
  257. package/src/oracle-env.mjs +0 -47
  258. package/src/portfolio-risk.mjs +0 -170
  259. package/src/prepare-envelope.mjs +0 -204
  260. package/src/profile-upgrade.mjs +0 -277
  261. package/src/protocol-execution.mjs +0 -84
  262. package/src/protocol-templates/gate.mjs +0 -179
  263. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  264. package/src/public-api/buzz-integration.mjs +0 -256
  265. package/src/public-api/connect-agent.mjs +0 -416
  266. package/src/public-api/grants.mjs +0 -142
  267. package/src/public-api/http.mjs +0 -389
  268. package/src/public-control/aa-adapter.mjs +0 -402
  269. package/src/public-control/build-registry.mjs +0 -227
  270. package/src/public-control/bundler-client.mjs +0 -357
  271. package/src/public-control/grant-indexer.mjs +0 -296
  272. package/src/public-control/policy-render.mjs +0 -69
  273. package/src/public-control/policy-schema.mjs +0 -318
  274. package/src/public-control/runtime-config.mjs +0 -275
  275. package/src/public-control/session-key-model.mjs +0 -374
  276. package/src/public-control/session-orchestrator.mjs +0 -412
  277. package/src/rfq/intent.mjs +0 -180
  278. package/src/rfq/sources.mjs +0 -181
  279. package/src/route-attestation.mjs +0 -132
  280. package/src/router/best-execution.mjs +0 -326
  281. package/src/router/index.mjs +0 -226
  282. package/src/router/prepare-bridge.mjs +0 -289
  283. package/src/router/prepare-route.mjs +0 -398
  284. package/src/router/proposal.mjs +0 -311
  285. package/src/router/risk-classifier.mjs +0 -119
  286. package/src/router/route-sources.mjs +0 -364
  287. package/src/scanner/chains.config.mjs +0 -430
  288. package/src/scanner/contract.mjs +0 -270
  289. package/src/scanner/evm-scanner.mjs +0 -394
  290. package/src/scanner/index.mjs +0 -9
  291. package/src/scanner/v2-venue.mjs +0 -335
  292. package/src/scanner/v3-venue.mjs +0 -290
  293. package/src/scopes.mjs +0 -44
  294. package/src/sell-simulation.mjs +0 -167
  295. package/src/signals/engine.mjs +0 -146
  296. package/src/signals/index.mjs +0 -1
  297. package/src/token-transfer-guard.mjs +0 -188
  298. package/src/tui/app.mjs +0 -438
  299. package/src/tui/backend.mjs +0 -145
  300. package/src/tui/format.mjs +0 -272
  301. package/src/tui/gateway-client.mjs +0 -177
  302. package/src/tui/input.mjs +0 -501
  303. package/src/tui/renderer.mjs +0 -443
  304. package/src/tui/standalone-client.mjs +0 -666
  305. package/src/tui/theme.mjs +0 -81
  306. package/src/vault-attestation.mjs +0 -146
  307. package/src/venues.mjs +0 -206
  308. package/src/watch-preferences.mjs +0 -85
@@ -0,0 +1,35 @@
1
+ var Bt=Object.defineProperty;var qe=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Dt=(e,t)=>{for(var n in t)Bt(e,n,{get:t[n],enumerable:!0})};import Kt from"node:fs";import qt from"node:os";import ne from"node:path";import{fileURLToPath as Ht}from"node:url";function se(){return process.env.ORACLE_FAKE_HOME||qt.homedir()}function q(){return ne.join(se(),".config","oracle")}function U(){return process.env.HERMES_HOME?ne.resolve(process.env.HERMES_HOME):ne.join(se(),".hermes")}function N(e){return Kt.mkdirSync(e,{recursive:!0}),e}var zt,M,W=qe(()=>{zt=ne.dirname(Ht(import.meta.url)),M=ne.resolve(zt,"../..")});var At={};Dt(At,{createOAuthStore:()=>je,default:()=>dr,getOAuthStore:()=>te,hasOAuthCredentials:()=>kt,loginOAuth:()=>_t,oauthProviderConfig:()=>Fe,oauthProviderId:()=>D,oauthRuntimeConfig:()=>Et,refreshOAuthCredentials:()=>Me,resolveOAuthCredentials:()=>St});import{createHash as Zn,randomBytes as Pe,timingSafeEqual as er}from"node:crypto";import R from"node:fs";import Z from"node:path";import tr from"node:readline/promises";import{spawn as nr,spawnSync as rr}from"node:child_process";function Re(e={}){return typeof e.now=="function"?Number(e.now()):Date.now()}function D(e){let t=String(e||"").trim().toLowerCase();for(let[n,r]of Object.entries(ee))if(r.aliases.includes(t))return n;throw new Error(`unsupported OAuth provider: ${e||"(empty)"}`)}function Fe(e){let t=D(e);return{id:t,...ee[t]}}function P(e,t={}){if(!R.existsSync(e))return t;try{let n=JSON.parse(R.readFileSync(e,"utf8"));if(!n||typeof n!="object"||Array.isArray(n))throw new Error("invalid object");return n}catch{throw new Error(`credential store is unreadable or corrupt: ${Z.basename(e)}`)}}function vt(e){N(e),process.platform!=="win32"&&R.chmodSync(e,448)}function H(e,t){vt(Z.dirname(e));let n=`${e}.${process.pid}.${Pe(4).toString("hex")}.tmp`;R.writeFileSync(n,`${JSON.stringify(t,null,2)}
2
+ `,{mode:384}),R.renameSync(n,e),process.platform!=="win32"&&R.chmodSync(e,384)}function or(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 Le(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 oe(e={}){let t=String(e.accessToken||e.access_token||"").trim(),n=String(e.refreshToken||e.refresh_token||"").trim(),r=Number(e.expiresAt||e.expires_at||0);if(!t)throw new Error("OAuth credential is missing access token");return{accessToken:t,refreshToken:n,expiresAt:Number.isFinite(r)?r: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 je(e={}){let t=e.file||Z.join(q(),"oauth.json"),n=e.metadataFile||Z.join(Z.dirname(t),"oauth-meta.json"),r=e.spawnFn||rr,o=e.keychain!==!1&&process.env.ORACLE_AUTH_FILE_STORE!=="1"&&or(r),s=o?"linux-secret-service":"private-file",a=`${t}.lock`;async function c(b){vt(Z.dirname(a));let h;for(let l=0;l<400;l+=1)try{h=R.openSync(a,"wx",384);break}catch(d){if(d?.code!=="EEXIST")throw d;try{Date.now()-R.statSync(a).mtimeMs>3e5&&R.unlinkSync(a)}catch{}await new Promise(p=>setTimeout(p,25))}if(h===void 0)throw new Error("timed out waiting for OAuth credential lock");try{return await b()}finally{try{R.closeSync(h)}catch{}try{R.unlinkSync(a)}catch{}}}function u(b,h="oauth"){return["application","oracle","kind",h,"provider",b]}function i(b){let h=D(b);if(o){let p=r("secret-tool",["lookup",...u(h)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(p.error||p.status!==0||!String(p.stdout||"").trim())return null;try{return oe(JSON.parse(String(p.stdout).trim()))}catch{return null}}let d=P(t,{providers:{}}).providers?.[h];if(!d)return null;try{return oe(d)}catch{return null}}function f(b,h){let l=D(b),d=oe(h);if(o){let v=r("secret-tool",["store",`--label=Oracle ${l} OAuth`,...u(l)],{input:JSON.stringify(d),encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(v.error||v.status!==0)throw new Error("OS credential store rejected OAuth credential");let O=P(n,{providers:{}});return O.providers||={},O.providers[l]={expiresAt:d.expiresAt,source:d.source},H(n,O),d}let p=P(t,{providers:{}});return p.providers||={},p.providers[l]=d,H(t,p),d}function m(b){let h=D(b);if(o){let p=r("secret-tool",["clear",...u(h)],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),v=P(n,{providers:{}});return v.providers&&delete v.providers[h],H(n,v),!p.error&&p.status===0}let l=P(t,{providers:{}}),d=!!l.providers?.[h];return l.providers&&delete l.providers[h],H(t,l),d}function x(b){let h=Le(b);if(o){let l=r("secret-tool",["lookup",...u(h,"api-key")],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return l.error||l.status!==0?"":String(l.stdout||"").trim()}return String(P(t,{apiKeys:{}}).apiKeys?.[h]||"").trim()}function g(b,h){let l=Le(b),d=String(h||"").trim();if(!d)throw new Error("API key is empty");if(o){let v=r("secret-tool",["store",`--label=Oracle ${l} API key`,...u(l,"api-key")],{input:d,encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(v.error||v.status!==0)throw new Error("OS credential store rejected API key");let O=P(n,{providers:{},apiKeys:{}});return O.apiKeys||={},O.apiKeys[l]={configured:!0},H(n,O),!0}let p=P(t,{providers:{},apiKeys:{}});return p.apiKeys||={},p.apiKeys[l]=d,H(t,p),!0}function w(b){let h=Le(b);if(o){let p=r("secret-tool",["clear",...u(h,"api-key")],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),v=P(n,{providers:{},apiKeys:{}});return v.apiKeys&&delete v.apiKeys[h],H(n,v),!p.error&&p.status===0}let l=P(t,{providers:{},apiKeys:{}}),d=!!l.apiKeys?.[h];return l.apiKeys&&delete l.apiKeys[h],H(t,l),d}function _(){let b={},h={};if(o){let l=P(n,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(l.providers||{}))b[d]={loggedIn:!!i(d),expiresAt:Number(p.expiresAt||0),source:String(p.source||"oracle"),storage:s};for(let d of Object.keys(l.apiKeys||{}))h[d]={configured:!!x(d),storage:s}}else{let l=P(t,{providers:{},apiKeys:{}});for(let[d,p]of Object.entries(l.providers||{}))b[d]={loggedIn:!!p?.accessToken,expiresAt:Number(p?.expiresAt||0),source:String(p?.source||"oracle"),storage:s};for(let[d,p]of Object.entries(l.apiKeys||{}))h[d]={configured:!!p,storage:s}}return{storage:s,providers:b,apiKeys:h}}return Object.freeze({file:t,storage:s,get:i,set:f,remove:m,getApiKey:x,setApiKey:g,removeApiKey:w,status:_,withLock:c})}function te(){return wt||=je(),wt}function Ne(e){return Buffer.from(e).toString("base64url")}function ir(){let e=Ne(Pe(32));return{verifier:e,challenge:Ne(Zn("sha256").update(e).digest()),state:Ne(Pe(24))}}function sr(e,t){let n=Buffer.from(String(e||"")),r=Buffer.from(String(t||""));return n.length===r.length&&er(n,r)}function ar(e){let t=String(e),n=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd.exe",["/d","/s","/c","start","",t]]:["xdg-open",[t]];try{return nr(n[0],n[1],{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function pe(e){return new URLSearchParams(e).toString()}async function K(e,t){if(!e?.ok){let r="";try{r=String((await e.json())?.error||"")}catch{}throw new Error(`${t} failed (HTTP ${e?.status||"unknown"}${r?`, ${r}`:""})`)}let n=await e.json();if(!n||typeof n!="object")throw new Error(`${t} returned invalid JSON`);return n}async function cr(e){if(e)return String(await e()).trim();let t=tr.createInterface({input:process.stdin,output:process.stdout});try{return String(await t.question("Authorization code: ")).trim()}finally{t.close()}}function me(e,t={}){let n=String(e.access_token||"").trim(),r=String(e.refresh_token||t.refreshToken||"").trim();if(!n)throw new Error("OAuth token response is missing access token");let o=Number(e.expires_in||3600);return oe({accessToken:n,refreshToken:r,expiresAt:Re(t)+Math.max(1,o)*1e3,tokenType:e.token_type||"Bearer",idToken:e.id_token,source:"oracle",...t.discovery?{discovery:t.discovery}:{},...e.scope?{scope:e.scope}:{}})}async function ur(e){let t=ee["anthropic-oauth"],n=e.pkce||ir(),r=new URLSearchParams({code:"true",client_id:t.clientId,response_type:"code",redirect_uri:t.redirectUri,scope:t.scope,code_challenge:n.challenge,code_challenge_method:"S256",state:n.state}),o=`${t.authorizeUrl}?${r}`;e.output(`Open: ${o}`),e.openFn(o);let s=await cr(e.inputFn),[a,c]=s.split("#",2);if(!a||!sr(c,n.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:a,state:c,redirect_uri:t.redirectUri,code_verifier:n.verifier})});return me(await K(u,"Claude OAuth token exchange"),e)}async function lr(e){let t=ee["openai-codex"],n=await K(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(!n.user_code||!n.device_auth_id)throw new Error("Codex device authorization returned incomplete data");let r=`${t.issuer}/codex/device`;e.output(`Open: ${r}`),e.output(`Code: ${n.user_code}`),e.openFn(r);let o=Math.max(3,Number(n.interval||5)),s;for(let c=0;c<Math.ceil(900/o);c+=1){await e.sleepFn(o*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:n.device_auth_id,user_code:n.user_code})});if(u.ok){s=await K(u,"Codex device authorization");break}if(![403,404].includes(u.status))throw new Error(`Codex device authorization failed (HTTP ${u.status})`)}if(!s)throw new Error("Codex device authorization timed out");let a=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:pe({grant_type:"authorization_code",code:s.authorization_code,redirect_uri:`${t.issuer}/deviceauth/callback`,client_id:t.clientId,code_verifier:s.code_verifier})});return me(await K(a,"Codex OAuth token exchange"),e)}function Y(e){let t=new URL(String(e)),n=t.hostname.toLowerCase();if(t.protocol!=="https:"||n!=="x.ai"&&!n.endsWith(".x.ai"))throw new Error("xAI OAuth discovery returned an untrusted endpoint");return t.toString()}async function fr(e){let t=ee["xai-oauth"],n=await K(await e.fetchFn(t.discoveryUrl,{headers:{accept:"application/json"}}),"xAI OAuth discovery");Y(n.authorization_endpoint);let r=Y(n.token_endpoint),o=await K(await e.fetchFn(t.deviceUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:pe({client_id:t.clientId,scope:t.scope})}),"xAI device authorization");if(!o.device_code||!o.user_code||!o.verification_uri)throw new Error("xAI device authorization returned incomplete data");let s=Y(o.verification_uri_complete||o.verification_uri);e.output(`Open: ${s}`),e.output(`Code: ${o.user_code}`),e.openFn(s);let a=Math.max(1,Number(o.interval||5)),c=Math.ceil(Math.max(1,Number(o.expires_in||600))/a);for(let u=0;u<c;u+=1){let i=await e.fetchFn(r,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:pe({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:t.clientId,device_code:o.device_code})});if(i.ok){let m=await K(i,"xAI OAuth token exchange");return me(m,{...e,discovery:{authorization_endpoint:Y(n.authorization_endpoint),token_endpoint:r}})}let f="";try{f=String((await i.json())?.error||"")}catch{}if(f==="slow_down")await e.sleepFn((a+1)*1e3);else if(f==="authorization_pending")await e.sleepFn(a*1e3);else throw new Error(`xAI OAuth token exchange failed (HTTP ${i.status}${f?`, ${f}`:""})`)}throw new Error("xAI device authorization timed out")}async function _t(e,t={}){let n=D(e),r={fetchFn:t.fetchFn||globalThis.fetch,inputFn:t.inputFn,sleepFn:t.sleepFn||(o=>new Promise(s=>setTimeout(s,o))),openFn:t.openFn||ar,output:t.output||(o=>process.stdout.write(`${o}
3
+ `)),now:t.now,pkce:t.pkce};return n==="anthropic-oauth"?ur(r):n==="openai-codex"?lr(r):fr(r)}async function Me(e,t,n={}){let r=D(e),o=ee[r],s=oe(t);if(!s.refreshToken)throw new Error(`${r} OAuth credential cannot refresh; run oracle auth login`);let a=s.discovery,c,u=n.fetchFn||globalThis.fetch;if(r==="xai-oauth"){if(!a?.token_endpoint){let m=await u(o.discoveryUrl),x=await K(m,"xAI OAuth discovery");a={...x.authorization_endpoint?{authorization_endpoint:Y(x.authorization_endpoint)}:{},token_endpoint:Y(x.token_endpoint)}}c=Y(a.token_endpoint)}else c=o.tokenUrl;let i=await u(c,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json",...r==="anthropic-oauth"?{"user-agent":"axios/1.7.9"}:{}},body:pe({grant_type:"refresh_token",refresh_token:s.refreshToken,client_id:o.clientId})}),f=await K(i,`${r} OAuth refresh`);return me(f,{...n,refreshToken:s.refreshToken,discovery:a})}async function St(e,t={}){let n=D(e),r=t.store||te(),o=r.get(n);if(!o)throw new Error(`${n} OAuth is not logged in; run oracle auth login ${e}`);let s=Re(t);if(!o.expiresAt||o.expiresAt>s+bt)return o;let a=async()=>{let c=r.get(n);if(!c)throw new Error(`${n} OAuth is not logged in; run oracle auth login ${e}`);let u=Re(t);if(!c.expiresAt||c.expiresAt>u+bt)return c;let i=await Me(n,c,t);return r.set(n,i),i};return typeof r.withLock=="function"?r.withLock(a):a()}function kt(e,t={}){try{return!!(t.store||te()).get(e)?.accessToken}catch{return!1}}function Et(e){let t=Fe(e);return{kind:"standalone",provider:t.id,model:t.model,baseUrl:t.baseUrl,authType:"oauth",protocol:t.protocol}}var ee,bt,wt,dr,Ue=qe(()=>{W();ee=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.5",protocol:"responses"}}),bt=12e4;dr={createOAuthStore:je,getOAuthStore:te,hasOAuthCredentials:kt,loginOAuth:_t,oauthProviderConfig:Fe,oauthProviderId:D,oauthRuntimeConfig:Et,refreshOAuthCredentials:Me,resolveOAuthCredentials:St}});W();import A from"node:fs";import S from"node:path";import{spawnSync as Fr}from"node:child_process";import ze from"node:fs";import Yt from"node:path";var Wt=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:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);function ge(e){return String(e||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function He(e){let t=ge(e);if(!t)return null;for(let n of Wt)if(n.key===t||String(n.chainId).toLowerCase()===t||(n.aliases||[]).map(ge).includes(t)||ge(n.name)===t)return n;return null}W();function Gt(){return Yt.join(q(),"active-chain.json")}function Jt(){let e=Gt();if(!ze.existsSync(e))return null;try{let t=JSON.parse(ze.readFileSync(e,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let n=He(t.key);return n?{key:n.key,chainId:n.chainId,name:n.name,agent:n.agent,selectedAt:t.selectedAt||null}:null}catch{return null}}function ae(e={}){let t=Jt(),n={...process.env,...e};return t&&(n.ORACLE_ACTIVE_CHAIN=t.key,n.ORACLE_ACTIVE_CHAIN_ID=String(t.chainId),n.ORACLE_ACTIVE_AGENT=t.agent||"oracle"),n}W();import We from"node:fs";import Vt from"node:path";var Xt=new Set(["auto","standalone","hermes"]),Qt=new Set(["openrouter","openai","xai","deepseek","gemini","custom","anthropic-oauth","openai-codex","xai-oauth"]);function Zt(){return Vt.join(q(),"model.json")}function V(e){return String(e||"").trim()||void 0}function en(e={}){let t=V(e.backend)?.toLowerCase()||"auto",n=V(e.provider)?.toLowerCase(),r=V(e.model),o=V(e.baseUrl)?.replace(/\/+$/,""),s=V(e.apiKeyEnv),a=Number.parseInt(String(e.contextLength||""),10),c=V(e.reasoningEffort);if(!Xt.has(t))throw new Error(`unsupported backend: ${t}`);if(n&&!Qt.has(n))throw new Error(`unsupported provider: ${n}`);if(o&&n!=="custom")throw new Error("baseUrl is only supported for the custom provider");if(s&&!/^[A-Z][A-Z0-9_]*$/.test(s))throw new Error("api key env must be an uppercase environment variable name");if(n==="custom"&&!o)throw new Error("custom provider requires baseUrl");if(t==="standalone"&&!r)throw new Error("standalone backend requires a model");return{backend:t,...n?{provider:n}:{},...r?{model:r}:{},...o?{baseUrl:o}:{},...s?{apiKeyEnv:s}:{},...Number.isFinite(a)&&a>0?{contextLength:a}:{},...c?{reasoningEffort:c}:{}}}function Ye(){let e=Zt();if(!We.existsSync(e))return null;try{return en(JSON.parse(We.readFileSync(e,"utf8")))}catch{return null}}import{spawn as tn}from"node:child_process";var nn=["SIGINT","SIGTERM","SIGHUP"];function ye(e,t=[],n={},r=e){return new Promise(o=>{let s=tn(e,t,n),a=!1,c=null,u=new Map(nn.map(f=>[f,()=>{c||=f,s.exitCode===null&&s.signalCode===null&&s.kill(f)}]));for(let[f,m]of u)process.on(f,m);let i=()=>{for(let[f,m]of u)process.off(f,m)};s.once("error",f=>{a||(a=!0,i(),process.stderr.write(`oracle: could not start ${r}: ${f.message}
4
+ `),o(1))}),s.once("exit",(f,m)=>{if(a)return;a=!0,i();let x=c||m;if(x){process.kill(process.pid,x);return}o(f??1)})})}import Je from"node:fs";import X from"node:path";W();var rn="0.19.0",yo=`hermes-agent==${rn}`;var Ge="0.12.1",bo=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Ge}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${Ge}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function on(){return X.join(q(),"runtime")}function sn(){return X.join(on(),"venv")}function an(e){let t=process.platform==="win32"?"Scripts":"bin",n=process.platform==="win32"?`${e}.exe`:e;return X.join(sn(),t,n)}function cn(){return an("hermes")}function un(e){let t=process.platform==="win32"&&!X.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let n of(process.env.PATH||"").split(X.delimiter))if(n)for(let r of t){let o=X.join(n,`${e}${r}`);try{if(Je.existsSync(o))return o}catch{}}return null}function be(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=un("hermes");if(e)return{ok:!0,bin:e,source:"path"};let t=cn();return Je.existsSync(t)?{ok:!0,bin:t,source:"managed"}:{ok:!1,bin:null,source:null}}import{EventEmitter as Kn}from"node:events";import{spawn as ln}from"node:child_process";import{EventEmitter as fn}from"node:events";import{createInterface as Ve}from"node:readline";var dn=15e3,pn=12e4;function mn(e){let t=typeof e=="string"?e:e?.message||"Gateway request failed",n=new Error(t);return n.error=e,n}function hn(e){let t=Buffer.from(e);if(t.length<=4096)return e;let n=t.length-4096;return`${t.subarray(0,4096).toString("utf8")} ... [truncated ${n} bytes]`}function Xe({python:e,pythonArgs:t=[],cwd:n,env:r,spawnFn:o=ln,startupTimeoutMs:s=dn,requestTimeoutMs:a=pn}={}){let c=new fn,u=new Map,i=null,f=1,m=null,x=null,g=!1;function w(p){c.listenerCount("error")>0&&c.emit("error",p)}function _(p){for(let v of u.values())clearTimeout(v.timer),v.reject(p);u.clear()}function b(p){if(!("id"in p)){c.emit("event",p);return}let v=u.get(p.id);v&&(u.delete(p.id),clearTimeout(v.timer),"error"in p?v.reject(mn(p.error)):v.resolve(p.result))}function h(){return m||(m=new Promise((p,v)=>{let O=!1,k,y=C=>{O||(O=!0,clearTimeout(k),C?v(C):p())};try{i=o(e,[...t,"-m","tui_gateway.entry"],{cwd:n,env:r})}catch(C){y(C),w(C);return}let I=Ve({input:i.stdout}),F=Ve({input:i.stderr});I.on("line",C=>{let j;try{j=JSON.parse(C)}catch{c.emit("log",C);return}y(),b(j)}),F.on("line",C=>c.emit("log",hn(C))),i.once("error",C=>{y(C),_(C),w(C)}),i.once("exit",(C,j)=>{g=!0;let J=new Error(`Gateway exited with code ${C} and signal ${j}`);y(J),_(J),c.emit("exit",{code:C,signal:j})}),k=setTimeout(()=>{y(new Error(`Gateway startup timed out after ${s} ms`))},s)}),m)}function l(p,v){if(!i||g)return Promise.reject(new Error("Gateway is not running"));let O=f++;return new Promise((k,y)=>{let I=setTimeout(()=>{u.delete(O),y(new Error(`Gateway request ${O} timed out after ${a} ms`))},a);u.set(O,{resolve:k,reject:y,timer:I});try{i.stdin.write(`${JSON.stringify({id:O,method:p,params:v})}
5
+ `)}catch(F){clearTimeout(I),u.delete(O),y(F)}})}function d(){if(x)return x;if(!i||g)return Promise.resolve();let p=new Error("Gateway stopped while requests were pending");return _(p),x=new Promise(v=>{i.once("exit",v);try{i.kill()}catch{v()}}),x}return{start:h,request:l,stop:d,on(p,v){return c.on(p,v),this},off(p,v){return c.off(p,v),this}}}var re=Buffer.alloc(0),xn=new Set(["return","backspace","tab","escape","up","down","left","right","home","end","delete","insert","pageup","pagedown","unknown"]),gn={A:"up",B:"down",C:"right",D:"left",H:"home",F:"end",P:"f1",Q:"f2",R:"f3",S:"f4"},yn={1:"home",2:"insert",3:"delete",4:"end",5:"pageup",6:"pagedown",7:"home",8:"end"};function L({name:e=null,ctrl:t=!1,meta:n=!1,shift:r=!1,sequence:o=""}){return{name:e,ctrl:t,meta:n,shift:r,sequence:o}}function tt(e){return e<128?1:e>=240?4:e>=224?3:e>=192?2:1}function bn(e){return e>=64&&e<=126}function Qe(e){let t=e.toLowerCase();return L({name:t,shift:e!==t,sequence:e})}function wn(e){return e===13?L({name:"return",sequence:"\r"}):e===10?L({name:"return",sequence:`
6
+ `}):e===9?L({name:"tab",sequence:" "}):e===127?L({name:"backspace",sequence:"\x7F"}):e===8?L({name:"backspace",sequence:"\b"}):e>=1&&e<=26?L({name:String.fromCharCode(e+96),ctrl:!0,sequence:String.fromCharCode(e)}):L({name:"unknown",sequence:String.fromCharCode(e)})}function vn(e){let t=/^\u001b[\[O](\d*)(?:;(\d+))?(.)$/s.exec(e);if(!t)return L({name:"unknown",sequence:e});let n=t[1]===""?null:Number(t[1]),r=t[2]===void 0?null:Number(t[2]),o=t[3],s=null,a=r;if(o==="~"?s=yn[n]??null:(s=gn[o]??null,a===null&&n!==null&&n>1&&(a=n)),!s)return L({name:"unknown",sequence:e});let c=a===null?0:Math.max(0,a-1);return L({name:s,shift:(c&1)!==0,meta:(c&2)!==0,ctrl:(c&4)!==0,sequence:e})}function _n(e,t,n,r){let o=()=>(n.push(L({name:"escape",sequence:"\x1B"})),1);if(t+1>=e.length)return r?o():0;let s=e[t+1];if(s===91||s===79){let i=t+2;for(;i<e.length&&!bn(e[i]);)i+=1;return i>=e.length?r?o():0:(n.push(vn(e.toString("utf8",t,i+1))),i+1-t)}if(s===27)return o();let a=tt(s);if(t+1+a>e.length)return r?o():0;let c=e.toString("utf8",t+1,t+1+a),u=c.toLowerCase();return n.push(L({name:u,meta:!0,shift:c!==u,sequence:`\x1B${c}`})),1+a}function Ze(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r];if(o===27){let a=_n(e,r,n,t);if(a===0)return{keys:n,rest:Buffer.from(e.subarray(r))};r+=a;continue}if(o<32||o===127){n.push(wn(o)),r+=1;continue}let s=tt(o);if(r+s>e.length)return t?(n.push(Qe(e.toString("utf8",r))),{keys:n,rest:re}):{keys:n,rest:Buffer.from(e.subarray(r))};n.push(Qe(e.toString("utf8",r,r+s))),r+=s}return{keys:n,rest:re}}function et(e){return Buffer.isBuffer(e)?e:e==null?re:typeof e=="string"?Buffer.from(e,"utf8"):Buffer.from(e)}function Sn(){let e=re;return{push(t){let n=e.length===0?et(t):Buffer.concat([e,et(t)]),{keys:r,rest:o}=Ze(n,!1);return e=o,r},flush(){if(e.length===0)return[];let{keys:t}=Ze(e,!0);return e=re,t},get pending(){return e.length}}}function kn({history:e=[]}={}){let t=[...e];return{buffer:"",cursor:0,history:t,historyIndex:t.length,draft:""}}function we(e,t){if(t<=0)return 0;let n=t-1,r=e.charCodeAt(n);if(r>=56320&&r<=57343&&n>0){let o=e.charCodeAt(n-1);if(o>=55296&&o<=56319)return n-1}return n}function ve(e,t){if(t>=e.length)return e.length;let n=e.charCodeAt(t);return n>=55296&&n<=56319&&t+1<e.length?t+2:t+1}function E(e,t){return{...e,...t}}function nt(e,t){return E(e,{...t,historyIndex:e.history.length,draft:""})}function En(e){if(e.ctrl||e.meta||!e.sequence||xn.has(e.name))return!1;for(let t of e.sequence){let n=t.codePointAt(0);if(n<32||n===127)return!1}return!0}function An(e,t){let n=t;for(;n>0&&/\s/.test(e[n-1]);)n-=1;for(;n>0&&!/\s/.test(e[n-1]);)n-=1;return n}function On(e){if(e.historyIndex<=0)return{state:E(e,{}),action:null};let t=e.historyIndex>=e.history.length,n=e.historyIndex-1,r=e.history[n]??"";return{state:E(e,{buffer:r,cursor:r.length,historyIndex:n,draft:t?e.buffer:e.draft}),action:null}}function Cn(e){if(e.historyIndex>=e.history.length)return{state:E(e,{}),action:null};let t=e.historyIndex+1,n=t>=e.history.length,r=n?e.draft:e.history[t]??"";return{state:E(e,{buffer:r,cursor:r.length,historyIndex:t,draft:n?"":e.draft}),action:null}}function In(e){let t=e.buffer.trim();if(t==="")return{state:nt(e,{buffer:"",cursor:0}),action:null};let n=e.history[e.history.length-1]===t?[...e.history]:[...e.history,t];return{state:E(e,{buffer:"",cursor:0,history:n,historyIndex:n.length,draft:""}),action:{type:"submit",value:t}}}function $n(e,t){if(!t)return{state:E(e,{}),action:null};let{buffer:n,cursor:r}=e;if(t.ctrl&&!t.meta)switch(t.name){case"c":return{state:nt(e,{buffer:"",cursor:0}),action:{type:"cancel"}};case"d":return n===""?{state:E(e,{}),action:{type:"eof"}}:{state:E(e,{}),action:null};case"l":return{state:E(e,{}),action:{type:"clear"}};case"a":return{state:E(e,{cursor:0}),action:null};case"e":return{state:E(e,{cursor:n.length}),action:null};case"u":return{state:E(e,{buffer:n.slice(r),cursor:0}),action:null};case"k":return{state:E(e,{buffer:n.slice(0,r)}),action:null};case"w":{let o=An(n,r);return{state:E(e,{buffer:n.slice(0,o)+n.slice(r),cursor:o}),action:null}}case"b":return{state:E(e,{cursor:we(n,r)}),action:null};case"f":return{state:E(e,{cursor:ve(n,r)}),action:null};default:return{state:E(e,{}),action:null}}switch(t.name){case"return":return In(e);case"left":return{state:E(e,{cursor:we(n,r)}),action:null};case"right":return{state:E(e,{cursor:ve(n,r)}),action:null};case"home":return{state:E(e,{cursor:0}),action:null};case"end":return{state:E(e,{cursor:n.length}),action:null};case"up":return On(e);case"down":return Cn(e);case"backspace":{if(r===0)return{state:E(e,{}),action:null};let o=we(n,r);return{state:E(e,{buffer:n.slice(0,o)+n.slice(r),cursor:o}),action:null}}case"delete":{if(r>=n.length)return{state:E(e,{}),action:null};let o=ve(n,r);return{state:E(e,{buffer:n.slice(0,r)+n.slice(o)}),action:null}}default:break}if(En(t)){let o=t.sequence;return{state:E(e,{buffer:n.slice(0,r)+o+n.slice(r),cursor:r+o.length}),action:null}}return{state:E(e,{}),action:null}}function rt(e={}){let{stdin:t,stdout:n,history:r=[],onSubmit:o,onCancel:s,onEof:a,onClear:c,onRender:u}=e,i=t??process.stdin,f=n??process.stdout,m=Sn(),x={submit:o,cancel:s,eof:a,clear:c},g=kn({history:r}),w=!1,_=!1,b=!1,h=d=>{if(!d)return;let p=x[d.type];typeof p=="function"&&p(d.value,g)},l=d=>{for(let p of m.push(d)){let v=$n(g,p);g=v.state,h(v.action),typeof u=="function"&&u(g)}};return{start(){w||(w=!0,i.isTTY&&typeof i.setRawMode=="function"&&(b=i.isRaw===!0,i.setRawMode(!0),_=!0),typeof i.resume=="function"&&i.resume(),i.on("data",l),typeof u=="function"&&u(g))},stop(){w&&(w=!1,typeof i.off=="function"?i.off("data",l):typeof i.removeListener=="function"&&i.removeListener("data",l),_&&typeof i.setRawMode=="function"&&(i.setRawMode(b),_=!1),typeof i.pause=="function"&&i.pause())},getState(){return g},setState(d){return g=d,g},write(d){f&&typeof f.write=="function"&&f.write(d)},get isRunning(){return w}}}var _e="\x1B[?25l",ce="\x1B[?25h",ot="\x1B[2K",ue="\x1B[0J";var Tn="\x1B\\[[0-9;?]*[a-zA-Z]";function at(){return new RegExp(Tn,"g")}function Ln(e){return String(e??"").replace(at(),"")}function it(e,t){return t.some(([n,r])=>e>=n&&e<=r)}function ct(e){return e===0||e<32||e>=127&&e<160||it(e,[[768,879],[1155,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1552,1562],[1611,1631],[1648,1648],[1750,1757],[1759,1764],[1767,1768],[1770,1773],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2070,2073],[2075,2083],[2085,2087],[2089,2093],[2137,2139],[2259,2273],[2275,2307],[2362,2364],[2369,2376],[2381,2381],[2385,2391],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2641,2641],[2672,2673],[2677,2677],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2884],[2893,2893],[2902,2902],[2914,2915],[2946,2946],[3008,3008],[3021,3021],[3072,3072],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3170,3171],[3201,3201],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3329,3329],[3393,3396],[3405,3405],[3426,3427],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3981,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4151],[4153,4154],[4157,4158],[4184,4185],[4190,4192],[4209,4212],[4226,4226],[4229,4230],[4237,4237],[4253,4253],[4957,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6277,6278],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6683,6683],[6742,6742],[6744,6750],[6752,6752],[6754,6754],[6757,6764],[6771,6780],[6783,6783],[6832,6911],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7040,7041],[7074,7077],[7080,7081],[7083,7085],[7142,7142],[7144,7145],[7149,7149],[7151,7153],[7212,7219],[7222,7223],[7376,7378],[7380,7392],[7394,7400],[7405,7405],[7412,7412],[7416,7417],[7616,7679],[8203,8207],[8234,8238],[8288,8292],[8294,8303],[8400,8447],[65024,65039],[65056,65071],[917760,917999]])?0:it(e,[[4352,4447],[8986,8987],[9001,9002],[9193,9196],[9200,9200],[9203,9203],[9725,9726],[9748,9749],[9800,9811],[9855,9855],[9875,9875],[9889,9889],[9898,9899],[9917,9918],[9924,9925],[9934,9934],[9940,9940],[9962,9962],[9970,9971],[9973,9973],[9978,9978],[9981,9981],[9989,9989],[9994,9995],[10024,10024],[10060,10060],[10062,10062],[10067,10069],[10071,10071],[10133,10135],[10160,10160],[10175,10175],[11035,11036],[11088,11088],[11093,11093],[11904,12350],[12352,42191],[44032,55203],[63744,64255],[65040,65049],[65072,65135],[65280,65376],[65504,65510],[127744,128591],[129280,129535],[131072,262141]])?2:1}function Nn(e){let t=0;for(let n of Array.from(e))t+=ct(n.codePointAt(0));return t}function Pn(e){return Nn(Ln(e))}function Rn(e){return/^\u001b\[0*m$/.test(e)}function st(e,t){let n="",r=0;for(let o of Array.from(e)){let s=ct(o.codePointAt(0));if(r+s>t)break;n+=o,r+=s}return{text:n,width:r}}function Fn(e,t){let n=String(e??"");if(t<=0)return"";if(Pn(n)<=t)return n;let r=at(),o="",s=0,a=!1,c=0,u=r.exec(n);for(;u!==null;){let f=st(n.slice(c,u.index),t-s);if(o+=f.text,s+=f.width,s>=t)return a?`${o}\x1B[0m`:o;o+=u[0],u[0].endsWith("m")&&(a=!Rn(u[0])),c=u.index+u[0].length,u=r.exec(n)}let i=st(n.slice(c),t-s);return o+=i.text,a?`${o}\x1B[0m`:o}function jn(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0}function ut({stdout:e,rows:t,columns:n}={}){if(!e||typeof e.write!="function")throw new TypeError("createRenderer requires a stdout with a write(string) method");let r=Number.isFinite(t)?Math.trunc(t):null,o=Number.isFinite(n)?Math.trunc(n):null,s=r??(Number.isFinite(e.rows)?Math.trunc(e.rows):24),a=o??(Number.isFinite(e.columns)?Math.trunc(e.columns):80),c=[],u=0,i=null,f=!1,m=!1,x=()=>{r===null&&(s=Number.isFinite(e.rows)?Math.trunc(e.rows):24),o===null&&(a=Number.isFinite(e.columns)?Math.trunc(e.columns):80),f=!0},g=typeof e.on=="function";g&&e.on("resize",x);function w(h){let l=h-u;return u=h,l===0?"":l<0?`\x1B[${-l}A`:`\x1B[${l}B`}function _(h){let d=(Array.isArray(h)?h:[]).map(p=>Fn(String(p??""),a));if(i!==null)for(d.length>i&&(d=d.slice(0,i));d.length<i;)d.push("");return d}function b(h){if(!f&&jn(c,h))return;let l=[_e];f&&c.length>0&&(l.push(w(0),"\r",ue),c=[],u=0),f=!1;let d=Math.min(c.length,h.length);for(let p=0;p<d;p+=1)c[p]!==h[p]&&l.push(w(p),"\r",ot,h[p]);if(h.length>c.length){c.length>0&&l.push(w(c.length-1));for(let p=c.length;p<h.length;p+=1)p>0&&l.push(`
7
+ `),l.push("\r",ot,h[p]),u=p}else h.length<c.length&&l.push(w(h.length),"\r",ue);h.length>0&&l.push(w(h.length-1)),l.push(ce),c=h,e.write(l.join(""))}return{render(h){m||b(_(h))},writeAbove(h){if(m)return;let l=String(h??""),d=_e;c.length>0&&(d+=`${w(0)}\r${ue}`),d+=l.endsWith(`
8
+ `)||l===""?l:`${l}
9
+ `,e.write(d);let p=c;c=[],u=0,p.length>0?b(p):e.write(ce)},clear(){if(m)return;let h=_e;c.length>0&&(h+=`${w(0)}\r${ue}`),h+=ce,e.write(h),c=[],u=0,f=!1},setLines(h){i=Number.isFinite(h)&&h>=0?Math.trunc(h):null},getLines(){return c.slice()},getSize(){return{rows:s,columns:a}},dispose(){if(!m){if(m=!0,g){let h=typeof e.off=="function"?e.off:e.removeListener;typeof h=="function"&&h.call(e,"resize",x)}e.write(ce)}}}}var $=Object.freeze({accent:"#B8F0FF",prompt:"#B8F0FF",banner_title:"#B8F0FF",banner_accent:"#91C2D7",ui_label:"#A5D9EB",banner_text:"#EAF2F8",status_bar_strong:"#EAF2F8",banner_border:"#455867",input_rule:"#455867",session_border:"#455867",banner_dim:"#60717F",status_bar_dim:"#60717F",status_bar_bg:"#11161B",status_bar_text:"#91A2B1",ok:"#7EE7B5",error:"#FF7B7B",warn:"#F0C674",bad:"#FF9B71",selection_bg:"#23313B"});function Mn(e){if(typeof e!="string")return null;let t=e.startsWith("#")?e.slice(1):e;if(!/^(?:[\da-f]{3}|[\da-f]{6})$/i.test(t))return null;let n=t.length===3?[...t].map(r=>r.repeat(2)).join(""):t;return{r:Number.parseInt(n.slice(0,2),16),g:Number.parseInt(n.slice(2,4),16),b:Number.parseInt(n.slice(4,6),16)}}function lt(e,t,n){let r=Mn(t);return r?`\x1B[${e};2;${r.r};${r.g};${r.b}m${String(n)}\x1B[0m`:String(n)}function Se({color:e=!0}={}){return e&&!Object.hasOwn(process.env,"NO_COLOR")?Object.freeze({fg:(n,r)=>lt(38,n,r),bg:(n,r)=>lt(48,n,r),bold:n=>`\x1B[1m${String(n)}\x1B[0m`,dim:n=>`\x1B[2m${String(n)}\x1B[0m`}):Object.freeze({fg:(n,r)=>String(r),bg:(n,r)=>String(r),bold:n=>String(n),dim:n=>String(n)})}var Oo=Se();function ft(e){return String(e).replace(/\u001B\[[0-9;]*m/g,"")}var dt=Object.freeze([["#B8F0FF"," \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 "],["#B8F0FF"," \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 "],["#ACDEEF"," \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588 "],["#A5D9EB"," \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591 "],["#9FCBDD"," \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 "],["#B8F0FF"," \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591 "]]),ke="THE FUTURE IS AGENTIC / by DEMI",Ee=/\u001B\[[0-9;]*m/g;function mt(e){if(new RegExp("\\p{Mark}","u").test(e))return 0;let t=e.codePointAt(0);return t===8205||t===65039?0:t>=4352&&(t<=4447||t===9001||t===9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510||t>=127744&&t<=129791||t>=131072&&t<=262141)?2:t<32||t>=127&&t<160?0:1}function B(e){return[...ft(e)].reduce((t,n)=>t+mt(n),0)}function Oe(e,t){if(t<=0)return"";let n=String(e).split(/(\u001B\[[0-9;]*m)/g),r="",o=0,s=!1;for(let a of n)if(a){if(Ee.test(a)){Ee.lastIndex=0,r+=a,s=a!=="\x1B[0m";continue}Ee.lastIndex=0;for(let c of a){let u=mt(c);if(o+u>t)return s?`${r}\x1B[0m`:r;r+=c,o+=u}}return r}function Q(e,t,n="left"){let r=Math.max(0,Math.floor(Number(t)||0)),o=Oe(String(e),r),s=Math.max(0,r-B(o));if(n==="right")return`${" ".repeat(s)}${o}`;if(n==="center"){let a=Math.floor(s/2);return`${" ".repeat(a)}${o}${" ".repeat(s-a)}`}return`${o}${" ".repeat(s)}`}function Ce(e,t){let n=Math.max(1,Math.floor(Number(t)||1)),r=[];for(let o of String(e??"").split(`
10
+ `)){if(o===""){r.push("");continue}let s="",a=0;for(let c of o.split(" ")){let u=B(c);if(a>0&&a+1+u>n&&(r.push(s),s="",a=0),u>n){a>0&&(r.push(s),s="",a=0);let i=c;for(;B(i)>n;){let f=Oe(i,n);r.push(f),i=i.slice(f.length)}s=i,a=B(i);continue}s=a===0?c:`${s} ${c}`,a=a===0?u:a+1+u}r.push(s)}return r}function Un(e){let t=Math.max(0,Math.floor(Number(e)||0)),n=Math.max(36,Math.min(t-4,76)),r=Math.max(0,Math.floor((t-n)/2)),o=r+3,s=Math.max(0,n-6);return{target:t,panelWidth:n,panelLeft:r,contentLeft:o,inner:s}}function Bn(e){let t=1/0,n=-1;for(let r of e)for(let o=0;o<r.length;o+=1)r[o]!==" "&&(o<t&&(t=o),o>n&&(n=o));return n<0?{offset:0,width:0}:{offset:t,width:n-t+1}}function pt(e,t,n=0){let{target:r,contentLeft:o,inner:s}=e,c=Math.round((r-t)/2)-n-o,u=Math.max(0,s-t-n);return Math.max(0,Math.min(u,c))}function Ie({width:e,palette:t}){let n=Un(e),{target:r,panelWidth:o,panelLeft:s,inner:a}=n;if(r<72||a<=0)return[Q(t.bold(t.fg($.accent,"oracle")),r,"center"),Q(t.fg($.banner_text,ke),r,"center")];let c=dt.map(([,d])=>d),{offset:u,width:i}=Bn(c),f=" ".repeat(pt(n,i,u)),m=" ".repeat(pt(n,B(ke))),x=[];for(let[d,p]of dt)x.push(t.bold(t.fg(d,`${f}${p.replace(/\s+$/,"")}`)));x.push(""),x.push(t.bold(t.fg($.banner_text,`${m}${ke}`)));let g=d=>t.fg($.banner_border,d),w=" ".repeat(s),_="\u2500".repeat(Math.max(0,o-2)),b=d=>Q(`${w}${d}`,r),h=[b(`${g("\u256D")}${g(_)}${g("\u256E")}`)],l=b(`${g("\u2502")}${" ".repeat(Math.max(0,o-2))}${g("\u2502")}`);h.push(l);for(let d of x)h.push(b(`${g("\u2502")} ${Q(d,a)} ${g("\u2502")}`));return h.push(l),h.push(b(`${g("\u2570")}${g(_)}${g("\u256F")}`)),h}function ht({lines:e,width:t,palette:n,title:r=""}){let o=Math.max(2,Math.floor(Number(t)||0)),s=Math.max(0,o-2),a=Oe(String(r),Math.max(0,s-2)),c=a?` ${a} `:"",u=`${c}${"\u2500".repeat(Math.max(0,s-B(c)))}`,i=f=>n.fg($.banner_border,f);return[`${i("\u256D")}${i(u)}${i("\u256E")}`,...e.map(f=>`${i("\u2502")}${Q(f,s)}${i("\u2502")}`),`${i("\u2570")}${i("\u2500".repeat(s))}${i("\u256F")}`]}function Ae(e){let t=Number(e);return Number.isFinite(t)?t>=1e6?`${(t/1e6).toFixed(1).replace(/\.0$/,"")}M`:t>=1e3?`${(t/1e3).toFixed(0)}K`:String(Math.round(t)):"0"}function Dn(e,t){let n=Math.max(0,Math.floor(Number(t)||0)),r=Number(e),o=Number.isFinite(r)?Math.min(100,Math.max(0,r)):0,s=Math.round(n*o/100);return`${"\u2588".repeat(s)}${"\u2591".repeat(n-s)}`}function le(e){let t=Number(e);if(!Number.isFinite(t)||t<0)return"0s";let n=Math.floor(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60),o=n%60;return r<60?`${r}m${String(o).padStart(2,"0")}s`:`${Math.floor(r/60)}h${String(r%60).padStart(2,"0")}m`}function xt({model:e,contextTokens:t,contextLength:n,percent:r,effort:o,thinking:s,chain:a,width:c,palette:u}){let i=Math.max(0,Math.floor(Number(c)||0)),f=u.fg($.status_bar_dim," / "),m=i>=120?12:i>=60?8:4,x=Number(n)>0?`${Ae(t)}/${Ae(n)}`:Ae(t),g=Number.isFinite(Number(r))?`${Math.round(Number(r))}%`:"0%",w=[{text:String(e??""),strong:!0}];Number(n)>0&&w.push({text:`ctx ${Dn(r,m)} ${x} ${g}`}),o&&w.push({text:String(o)}),s&&w.push({text:String(s)}),typeof a=="string"&&a.length>0&&w.push({text:a});let _=w,b=l=>l.reduce((d,p,v)=>d+B(p.text)+(v>0?3:0),0);for(;_.length>1&&b(_)>i;)_=_.slice(0,-1);let h=_.map(l=>l.strong?u.fg($.status_bar_strong,l.text):u.fg($.status_bar_text,l.text)).join(f);return u.bg($.status_bar_bg,Q(h,i))}var qn=6;function Hn(e=[]){let t={pass:[],query:null,model:null,provider:null,quiet:!1,cont:!1};for(let n=0;n<e.length;n+=1){let r=e[n];if((r==="-q"||r==="--query")&&e[n+1]){t.query=e[++n],t.pass.push("-q",t.query);continue}if((r==="--model"||r==="-m")&&e[n+1]){t.model=e[++n],t.pass.push("--model",t.model);continue}if(r==="--provider"&&e[n+1]){t.provider=e[++n],t.pass.push("--provider",t.provider);continue}if(r==="--quiet"||r==="-Q"){t.quiet=!0,t.pass.push(r);continue}if(r==="--continue"||r==="-c"){t.cont=!0,t.pass.push("--continue");continue}t.pass.push(r)}return t}function $e(e,t){if(!t||typeof t!="object")return;let n=Number(t.context_used??t.context_tokens??t.input??t.prompt),r=Number(t.context_max??t.context_length);Number.isFinite(n)&&n>0&&(e.contextTokens=n),Number.isFinite(r)&&r>0&&(e.contextLength=r);let o=Number(t.context_percent);Number.isFinite(o)?e.contextPercent=o:e.contextLength>0&&(e.contextPercent=Math.round(e.contextTokens/e.contextLength*100))}function zn(e){let t=e.width,n=`${e.promptLabel} `,r=Math.max(1,t-2-B(n)),o=e.buffer||"",s=Math.max(0,Math.min(e.cursor??o.length,o.length)),a=0;s>r&&(a=s-r);let c=o.slice(a,a+r),u=s-a,i=c.slice(0,u),f=c.slice(u,u+1)||" ",m=c.slice(u+1),x=e.palette;return[`${x.fg($.accent,n)}${i}${x.bg($.selection_bg,f)}${m}`]}function Wn(e){let t=e.width,n=[];if(e.liveLines.length>0){for(let r of e.liveLines.slice(-qn))n.push(r);n.push("")}return n.push(...ht({lines:zn(e),width:t,palette:e.palette,title:"Ask Oracle \u203A"})),n.push(xt({model:e.model,contextTokens:e.contextTokens,contextLength:e.contextLength,percent:e.contextPercent,effort:e.effort,thinking:e.thinking,chain:e.chain,width:t,palette:e.palette})),n}function Yn(e){let t=e?.params||e||{};return{type:t.type||e?.type||"",sessionId:t.session_id||e?.session_id||"",payload:t.payload||e?.payload||{}}}function fe(e={}){return typeof e.text=="string"?e.text:typeof e.rendered=="string"?e.rendered:typeof e.message=="string"?e.message:""}function Gn(e={}){let t=e.stdout||process.stdout,n=e.stdin||process.stdin,r=Math.max(20,Number(t.columns||e.columns||80)),o=e.palette||Se({color:t.isTTY!==!1}),s=e.renderer||ut({stdout:t,rows:t.rows,columns:r}),a=e.client||Xe({python:e.python,pythonArgs:e.pythonArgs||[],cwd:e.cwd||process.cwd(),env:e.env||process.env,spawnFn:e.spawnFn,startupTimeoutMs:e.startupTimeoutMs,requestTimeoutMs:e.requestTimeoutMs}),c=new Kn,u=e.now||(()=>Date.now()),i={palette:o,width:r,promptLabel:"oracle \u203A",buffer:"",cursor:0,model:e.model||"model",contextTokens:0,contextLength:0,contextPercent:0,effort:e.effort||"",thinking:"0s",chain:(e.env||process.env).ORACLE_ACTIVE_CHAIN||"",busy:!1,cancelled:!1,sessionId:null,assistantBuffer:"",flushedLines:0,liveLines:[],startedAt:0},f=null,m=null,x={renderer:s,state:i};function g(){s.render(Wn(i))}function w(k){s.writeAbove(`${k}
11
+ `)}function _(){let k=i.assistantBuffer.split(`
12
+ `),y=k[k.length-1]||"";i.liveLines=y?Ce(y,i.width):[]}function b({final:k=!1}={}){let y=i.assistantBuffer.split(`
13
+ `),I=k?y.length:y.length-1,F=!1;for(;i.flushedLines<I;){let C=y[i.flushedLines];for(let j of Ce(C,i.width))w(j);i.flushedLines+=1,F=!0}return k?i.liveLines=[]:_(),F}function h(){m||(m=setInterval(()=>{i.busy&&(i.thinking=le(u()-i.startedAt),g())},250),typeof m.unref=="function"&&m.unref())}function l(){m&&(clearInterval(m),m=null)}async function d(k){let y=String(k||"").trim();if(y){if(y==="/exit"||y==="/quit"){await O();return}if(y==="/clear"){s.clear();for(let I of Ie({width:i.width,palette:o}))w(I);g();return}i.busy=!0,i.assistantBuffer="",i.flushedLines=0,i.liveLines=[],i.startedAt=u(),i.thinking="0s",w(`${o.bold(o.fg($.prompt,"you"))} ${y}`),w(""),h(),g(),await a.request("prompt.submit",{session_id:i.sessionId,text:y})}}function p(k){let y=Yn(k);if(y.type!=="gateway.ready"){if(y.type==="session.info"&&y.payload){y.payload.model&&(i.model=y.payload.model),y.payload.reasoning_effort&&(i.effort=y.payload.reasoning_effort),$e(i,y.payload.usage),g();return}if(y.type==="message.start"){i.busy=!0,i.cancelled=!1,i.assistantBuffer="",i.flushedLines=0,i.liveLines=[],w(o.bold(o.fg($.accent,"oracle"))),g();return}if(y.type==="thinking.delta"||y.type==="reasoning.delta"){if(i.cancelled)return;fe(y.payload).trim()&&(i.thinking=`${le(u()-i.startedAt)}`),g();return}if(y.type==="message.delta"){if(i.cancelled)return;i.assistantBuffer+=fe(y.payload),b(),g();return}if(y.type==="message.complete"){if(i.cancelled){i.cancelled=!1;return}let I=fe(y.payload);I&&I.length>=i.assistantBuffer.length&&(i.assistantBuffer=I),b({final:!0}),w(""),i.busy=!1,l(),$e(i,y.payload?.usage||y.payload?.context),i.thinking=le(u()-i.startedAt),g();return}y.type==="error"&&(i.busy=!1,l(),w(o.fg($.error,`error: ${fe(y.payload)||"unknown"}`)),g())}}async function v(){await a.start(),a.on("event",p),a.on("log",y=>c.emit("log",y)),a.on("error",y=>c.emit("error",y));let k=await a.request("session.create",{cols:i.width,cwd:e.cwd||process.cwd(),source:"cli",profile:e.profile||"oracle",close_on_disconnect:!0,...e.model?{model:e.model}:{},...e.provider?{provider:e.provider}:{}});i.sessionId=k.session_id,i.model=k.info?.model||i.model,k.info?.reasoning_effort&&(i.effort=k.info.reasoning_effort),$e(i,k.info?.usage);for(let y of Ie({width:i.width,palette:o}))w(y);w(""),g(),f=rt({stdin:n,stdout:t,onSubmit:y=>{d(y).catch(I=>c.emit("error",I))},onCancel:()=>{i.busy&&(i.busy=!1,i.cancelled=!0,l(),b({final:!0}),w(o.fg($.warn,"interrupted")),w(""),g(),a.request("session.interrupt",{session_id:i.sessionId}).catch(y=>c.emit("error",y)))},onEof:()=>{O().catch(y=>c.emit("error",y))},onClear:()=>{s.clear(),g()},onRender:y=>{i.buffer=y.buffer||"",i.cursor=y.cursor??i.buffer.length,g()}}),f.start()}async function O(){l(),f&&f.stop(),s.dispose(),await a.stop(),c.emit("stop")}return Object.freeze({start:v,stop:O,on:c.on.bind(c),off:c.off.bind(c),state:i,handleEvent:p,submit:d})}async function Te({hermesPython:e,client:t,tuiFactory:n=Gn,args:r=[],env:o=process.env,cwd:s=process.cwd(),stdout:a=process.stdout,stdin:c=process.stdin}={}){let u=Hn(r);if(u.query)return{native:!1,pass:u.pass};if(!c.isTTY||!a.isTTY)return{native:!1,pass:u.pass};if(o.ORACLE_NATIVE_TUI==="0")return{native:!1,pass:u.pass};let i=e;if(!t&&!i)return{native:!1,pass:u.pass};let f=ae({...o,ORACLE_CHAT_SURFACE:"1",ORACLE_PROFILE:"oracle",ORACLE_NODE_BIN:process.execPath}),m=n({...t?{client:t}:{},...i?{python:i.command,pythonArgs:i.prefix||[]}:{},cwd:s,env:f,stdin:c,stdout:a,model:u.model,provider:u.provider,profile:"oracle"});return m.on("log",x=>{o.ORACLE_CLI_DEBUG&&process.stderr.write(`${x}
14
+ `)}),m.on("error",x=>{process.stderr.write(`oracle chat: ${x.message}
15
+ `)}),await m.start(),new Promise(x=>{let g=!1,w=async()=>{g||(g=!0,await m.stop(),x({native:!0,code:0}))};m.on("stop",()=>{g||(g=!0,x({native:!0,code:0}))}),process.once("SIGINT",w),process.once("SIGTERM",w)})}var gt=Object.freeze({openrouter:{key:"OPENROUTER_API_KEY",baseUrl:"https://openrouter.ai/api/v1",model:"openrouter/auto"},openai:{key:"OPENAI_API_KEY",baseUrl:"https://api.openai.com/v1",model:"gpt-4.1-mini"},xai:{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest"},deepseek:{key:"DEEPSEEK_API_KEY",baseUrl:"https://api.deepseek.com/v1",model:"deepseek-chat"},gemini:{key:"GEMINI_API_KEY",alternateKey:"GOOGLE_API_KEY",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",model:"gemini-2.5-flash"}}),Jn=Object.freeze({"anthropic-oauth":{baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},"openai-codex":{baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.6-sol",protocol:"responses"},"xai-oauth":{baseUrl:"https://api.x.ai/v1",model:"grok-4.5",protocol:"responses"}});function Vn(e,t){let n=Number.parseInt(String(e||""),10);return Number.isFinite(n)&&n>0?n:t}function Xn(e,t={}){let n=String(e.ORACLE_PROVIDER||t.provider||"").trim().toLowerCase();if(n)return n;if(e.ORACLE_BASE_URL)return"custom";for(let[r,o]of Object.entries(gt))if(e[o.key]||o.alternateKey&&e[o.alternateKey])return r;return null}function Qn(e=process.env,t={},n=()=>!1,r=()=>""){let o=Xn(e,t);if(!o)return null;let s=Jn[o],a=gt[o]||s,c=String(e.ORACLE_API_KEY_ENV||t.apiKeyEnv||""),u=String(e.ORACLE_API_KEY||c&&e[c]||a&&(e[a.key]||a.alternateKey&&e[a.alternateKey])||r(o)||""),i=String(s?s.baseUrl:o==="custom"?e.ORACLE_BASE_URL||t.baseUrl||"":a?.baseUrl||"").replace(/\/+$/,""),f=String(e.ORACLE_MODEL||t.model||a?.model||"");if(!i||!f)return null;let m=!!(s&&n(o));return s&&!m||!s&&o!=="custom"&&!u?null:{kind:"standalone",provider:o,model:f,baseUrl:i,...m?{authType:"oauth",protocol:s.protocol}:{apiKey:u},contextLength:Vn(e.ORACLE_CONTEXT_LENGTH||t.contextLength,128e3),reasoningEffort:String(e.ORACLE_REASONING_EFFORT||t.reasoningEffort||"high")}}function de(e=""){return["Oracle standalone chat does not require Hermes.","Set OPENROUTER_API_KEY, run `oracle auth login claude|codex|grok`, or configure a custom OpenAI-compatible endpoint.","If Hermes is installed, Oracle will reuse it automatically.",e].filter(Boolean).join(`
16
+ `)}function yt({env:e=process.env,hermes:t={ok:!1},storedConfig:n=null,oauthAvailable:r=()=>!1,apiKeyResolver:o=()=>""}={}){let s=String(e.ORACLE_CHAT_BACKEND||n?.backend||"auto").trim().toLowerCase(),a=Qn(e,n||{},r,o);return s==="standalone"?a?{kind:"standalone",config:a}:{kind:"unconfigured",reason:de("ORACLE_CHAT_BACKEND=standalone was requested, but no standalone model is configured.")}:s==="hermes"?t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:de("ORACLE_CHAT_BACKEND=hermes was requested, but Hermes was not found.")}:s!=="auto"?{kind:"unconfigured",reason:de(`Unknown ORACLE_CHAT_BACKEND value: ${s}`)}:t?.ok?{kind:"hermes",bin:t.bin}:a?{kind:"standalone",config:a}:{kind:"unconfigured",reason:de()}}W();import pr from"node:fs";import $t from"node:path";import{randomUUID as Ot}from"node:crypto";import{EventEmitter as mr}from"node:events";import{spawnSync as hr}from"node:child_process";var xr=new Set(["chain","data","scan","route","prepare"]),gr=new Set(["list","show"]),yr=new Set(["call","catalog","health"]),br=new Set(["swap","bridge","prepare","prepare-bridge"]),wr=Object.freeze({"anthropic-oauth":"https://api.anthropic.com/v1","openai-codex":"https://chatgpt.com/backend-api/codex","xai-oauth":"https://api.x.ai/v1"}),Be=2e4,Ct=6,G=Object.freeze({type:"function",function:{name:"oracle_cli",description:"Run a bounded read or prepare-only Oracle CLI command. It cannot sign or broadcast transactions.",parameters:{type:"object",properties:{argv:{type:"array",items:{type:"string"},minItems:1,maxItems:24,description:'Arguments after the oracle executable, for example ["scan","chains"] or ["data","health"].'}},required:["argv"],additionalProperties:!1}}});function It(e){let t=String(e||"");return t.length<=Be?t:`${t.slice(0,Be)}
17
+ [truncated ${t.length-Be} chars]`}function vr(e){if(!Array.isArray(e)||e.length===0||e.length>24)return"argv must contain 1 to 24 arguments";if(e.some(n=>typeof n!="string"||n.length>1e3))return"every argument must be a string no longer than 1000 characters";let t=e[0];return xr.has(t)?t==="chain"&&!gr.has(e[1]||"list")?`command not allowed: chain${e[1]?` ${e[1]}`:""}`:t==="data"&&!yr.has(e[1]||"")?`command not allowed: data${e[1]?` ${e[1]}`:""}`:t==="route"&&!br.has(e[1]||"")?`command not allowed: route${e[1]?` ${e[1]}`:""}`:null:`command not allowed: ${t}`}async function _r(e,t={}){let n=vr(e);if(n)return{ok:!1,error:n};let r=t.spawnFn||hr,o=t.packageRoot||M,s=r(process.execPath,[$t.join(o,"bin","oracle.mjs"),...e],{encoding:"utf8",timeout:t.timeoutMs||45e3,maxBuffer:1024*1024,env:{...process.env,ORACLE_CHAT_TOOL:"1"}});return s.error?{ok:!1,error:s.error.message}:{ok:s.status===0,status:typeof s.status=="number"?s.status:1,stdout:It(s.stdout),stderr:It(s.stderr)}}function Sr(){let e=$t.join(M,"profiles","oracle","SOUL.md");return`${pr.readFileSync(e,"utf8").trim()}
18
+
19
+ You have one bounded tool named oracle_cli. Use it for live chain facts, scans, route comparison, and unsigned preparation. Never claim a tool action succeeded unless its returned output proves it.`}function kr(e,t,n={}){return{method:"event",params:{type:e,session_id:t,payload:n}}}async function Er(e){return new Error(`model request failed (HTTP ${e?.status||"unknown"})`)}async function*Ke(e){if(!e?.ok)throw await Er(e);if(!e.body)throw new Error("model response had no body");let t=e.body.getReader(),n=new TextDecoder,r="";for(;;){let{value:s,done:a}=await t.read();r+=n.decode(s||new Uint8Array,{stream:!a});let c=r.split(/\r?\n\r?\n/);r=c.pop()||"";for(let u of c){let i=u.split(/\r?\n/).filter(f=>f.startsWith("data:")).map(f=>f.slice(5).trimStart()).join(`
20
+ `);!i||i==="[DONE]"||(yield JSON.parse(i))}if(a)break}let o=r.trim();if(o.startsWith("data:")){let s=o.slice(5).trim();s&&s!=="[DONE]"&&(yield JSON.parse(s))}}function Ar(e,t){let n=Number(t.index||0),r=e.get(n)||{id:"",type:"function",function:{name:"",arguments:""}};t.id&&(r.id+=t.id),t.type&&(r.type=t.type),t.function?.name&&(r.function.name+=t.function.name),t.function?.arguments&&(r.function.arguments+=t.function.arguments),e.set(n,r)}function Or(e,t){let n=Number(e?.prompt_tokens||e?.input_tokens||0),r=Number(e?.completion_tokens||e?.output_tokens||0);return{context_used:n,context_max:t,context_percent:t>0?Math.round(n/t*100):0,input:n,output:r}}function Cr(){return{type:"function",name:G.function.name,description:G.function.description,parameters:G.function.parameters,strict:!1}}function Ir(){return{name:G.function.name,description:G.function.description,input_schema:G.function.parameters}}function De(e,t,n){let r=Array.isArray(n)?n:[{type:"text",text:String(n||"")}],o=e.at(-1);o?.role===t?o.content.push(...r):e.push({role:t,content:r})}function $r(e){let t=[];for(let n of e)if(n.role!=="system"){if(n.role==="user"){De(t,"user",[{type:"text",text:String(n.content||"")}]);continue}if(n.role==="assistant"){let r=[];n.content&&r.push({type:"text",text:String(n.content)});for(let o of n.tool_calls||[]){let s={};try{s=JSON.parse(o.function?.arguments||"{}")}catch{}r.push({type:"tool_use",id:o.id,name:o.function?.name,input:s})}r.length&&De(t,"assistant",r);continue}n.role==="tool"&&De(t,"user",[{type:"tool_result",tool_use_id:n.tool_call_id,content:String(n.content||"")}])}return t}function Tr(e){let t=[];for(let n of e)if(n.role!=="system"){if(n.role==="user"){t.push({role:"user",content:[{type:"input_text",text:String(n.content||"")}]});continue}if(n.role==="assistant"){n.content&&t.push({role:"assistant",status:"completed",content:[{type:"output_text",text:String(n.content)}]});for(let r of n.tool_calls||[])t.push({type:"function_call",id:r.response_item_id||void 0,call_id:r.id,name:r.function?.name,arguments:r.function?.arguments||"{}"});continue}n.role==="tool"&&t.push({type:"function_call_output",call_id:n.tool_call_id,output:String(n.content||"")})}return t.map(n=>Object.fromEntries(Object.entries(n).filter(([,r])=>r!==void 0)))}function Lr(e){try{let t=JSON.parse(Buffer.from(String(e).split(".")[1],"base64url").toString("utf8"));return String(t?.["https://api.openai.com/auth"]?.chatgpt_account_id||"")}catch{return""}}async function Nr({config:e,messages:t,fetchFn:n,signal:r,onText:o}){let s=await n(`${e.baseUrl}/chat/completions`,{method:"POST",headers:{"content-type":"application/json",...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.provider==="openrouter"?{"HTTP-Referer":"https://oracle-agent.dev","X-Title":"Oracle CLI"}:{}},body:JSON.stringify({model:e.model,messages:t,tools:[G],tool_choice:"auto",stream:!0,stream_options:{include_usage:!0}}),signal:r}),a=new Map,c="",u=null;for await(let i of Ke(s)){i.usage&&(u=i.usage);let f=i.choices?.[0]?.delta||{};typeof f.content=="string"&&f.content&&(c+=f.content,o(f.content));for(let m of f.tool_calls||[])Ar(a,m)}return{text:c,usage:u,toolCalls:[...a.entries()].sort(([i],[f])=>i-f).map(([,i])=>i)}}async function Pr({config:e,messages:t,persona:n,credential:r,fetchFn:o,signal:s,onText:a}){let c=await o(`${e.baseUrl}/messages`,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream",Authorization:`Bearer ${r.accessToken}`,"anthropic-version":"2023-06-01","anthropic-beta":"interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,claude-code-20250219,oauth-2025-04-20","user-agent":`claude-code/${process.env.ORACLE_CLAUDE_CODE_VERSION||"2.1.220"} (external, cli)`,"x-app":"cli"},body:JSON.stringify({model:e.model,max_tokens:Number(e.maxOutputTokens||8192),system:[{type:"text",text:"You are Claude Code, Anthropic's official CLI for Claude."},{type:"text",text:n}],messages:$r(t),tools:[Ir()],tool_choice:{type:"auto"},stream:!0}),signal:s}),u=new Map,i="",f=null;for await(let m of Ke(c)){if(m.type==="message_start"&&(f={...f||{},...m.message?.usage||{}}),m.type==="message_delta"&&(f={...f||{},...m.usage||{}}),m.type==="content_block_start"&&m.content_block?.type==="tool_use"){let x=m.content_block;u.set(Number(m.index||0),{id:x.id,type:"function",function:{name:x.name,arguments:x.input&&Object.keys(x.input).length?JSON.stringify(x.input):""}})}if(m.type==="content_block_delta"&&m.delta?.type==="text_delta"&&(i+=m.delta.text||"",m.delta.text&&a(m.delta.text)),m.type==="content_block_delta"&&m.delta?.type==="input_json_delta"){let x=Number(m.index||0),g=u.get(x);g&&(g.function.arguments+=m.delta.partial_json||"")}if(m.type==="error")throw new Error(m.error?.message||"Claude stream failed")}return{text:i,usage:f,toolCalls:[...u.entries()].sort(([m],[x])=>m-x).map(([,m])=>(m.function.arguments||(m.function.arguments="{}"),m))}}async function Rr({config:e,messages:t,persona:n,sessionId:r,credential:o,fetchFn:s,signal:a,onText:c}){let u=e.provider==="openai-codex",i=u?Lr(o.accessToken):"",f={"content-type":"application/json",accept:"text/event-stream",Authorization:`Bearer ${o.accessToken}`,...u?{"user-agent":"codex_cli_rs/0.0.0 (Oracle CLI)",originator:"codex_cli_rs",...i?{"ChatGPT-Account-ID":i}:{},session_id:r,"x-client-request-id":r}:{"x-grok-conv-id":r}},m={model:e.model,instructions:n,input:Tr(t),tools:[Cr()],tool_choice:"auto",parallel_tool_calls:!0,store:!1,stream:!0,...u?{reasoning:{effort:e.reasoningEffort||"high",summary:"auto"}}:{}},x=await s(`${e.baseUrl}/responses`,{method:"POST",headers:f,body:JSON.stringify(m),signal:a}),g=new Map,w="",_=null;for await(let b of Ke(x)){b.type==="response.output_text.delta"&&typeof b.delta=="string"&&(w+=b.delta,c(b.delta));let h=b.item;if((b.type==="response.output_item.added"||b.type==="response.output_item.done")&&h?.type==="function_call"){let l=String(h.call_id||h.id||b.output_index||g.size);g.set(l,{id:h.call_id||h.id,response_item_id:h.id,type:"function",function:{name:h.name,arguments:h.arguments||"{}"}})}if(b.type==="response.function_call_arguments.delta"){let l=String(b.call_id||b.item_id||b.output_index||""),d=g.get(l);d&&(d.function.arguments+=b.delta||"")}if(b.type==="response.completed"&&(_=b.response?.usage||_),b.type==="response.failed"||b.type==="error")throw new Error(b.response?.error?.message||b.error?.message||"Responses stream failed")}return{text:w,usage:_,toolCalls:[...g.values()]}}function Tt(e={}){let t=e.config;if(!t?.baseUrl||!t?.model)throw new Error("standalone model configuration is incomplete");if(t.authType==="oauth"){let l=wr[t.provider],d=String(t.baseUrl).replace(/\/+$/,"");if(!l||d!==l)throw new Error(`${t.provider||"unknown"} OAuth endpoint is not trusted`)}let n=new mr,r=e.fetchFn||globalThis.fetch,o=e.toolRunner||(l=>_r(l,e)),s=e.credentialProvider||(async l=>{let{resolveOAuthCredentials:d}=await Promise.resolve().then(()=>(Ue(),At));return d(l)}),a=e.persona||Sr(),c=e.sessionId||`oracle-${Ot()}`,u=[],i=null,f=!1,m=!1;function x(l,d={}){n.emit("event",kr(l,c,d))}function g(l){x("error",{message:l?.message||String(l)}),n.listenerCount("error")>0&&n.emit("error",l)}async function w(l){m=!0,i=new AbortController;let d=[{role:"system",content:a},...u,{role:"user",content:l}],p="",v=null,O=!1;try{for(let k=0;k<Ct;k+=1){let y=t.authType==="oauth"?await s(t.provider):null,I=z=>{O||(x("message.start",{}),O=!0),p+=z,x("message.delta",{text:z})},F={config:t,messages:d,persona:a,sessionId:c,credential:y,fetchFn:r,signal:i.signal,onText:I},C=t.protocol==="anthropic-messages"?await Pr(F):t.protocol==="responses"?await Rr(F):await Nr(F),j=C.text,J=C.toolCalls;if(v=C.usage||v,J.length===0){d.push({role:"assistant",content:j}),u=d.slice(1),O||x("message.start",{}),x("message.complete",{text:p,usage:Or(v,t.contextLength)});return}d.push({role:"assistant",content:j||null,tool_calls:J});for(let z of J){let he;try{let xe=JSON.parse(z.function.arguments||"{}");he=z.function.name==="oracle_cli"?await o(xe.argv):{ok:!1,error:`unknown tool: ${z.function.name}`}}catch(xe){he={ok:!1,error:`invalid tool arguments: ${xe.message}`}}d.push({role:"tool",tool_call_id:z.id||`call_${Ot()}`,content:JSON.stringify(he)})}}throw new Error(`agent exceeded ${Ct} tool steps`)}catch(k){k?.name!=="AbortError"&&g(k)}finally{m=!1,i=null}}async function _(){if(f)throw new Error("standalone client is stopped")}async function b(l,d={}){if(f)throw new Error("standalone client is stopped");if(l==="session.create")return x("session.info",{model:d.model||t.model,reasoning_effort:t.reasoningEffort,usage:{context_max:t.contextLength},backend:"standalone"}),{session_id:c,info:{model:d.model||t.model,reasoning_effort:t.reasoningEffort,usage:{context_max:t.contextLength},backend:"standalone"}};if(l==="prompt.submit"){if(m)throw new Error("a turn is already active");let p=String(d.text||"").trim();if(!p)throw new Error("prompt text is required");return queueMicrotask(()=>{w(p).catch(g)}),{accepted:!0}}if(l==="session.interrupt"){let p=!!(i&&m);return i?.abort(),{interrupted:p}}if(l==="session.usage")return{calls:0,input:0,output:0,total:0};throw new Error(`unsupported standalone method: ${l}`)}async function h(){f||(f=!0,i?.abort())}return Object.freeze({start:_,request:b,stop:h,on:n.on.bind(n),off:n.off.bind(n)})}async function Lt({client:e,text:t,stdout:n=process.stdout,stderr:r=process.stderr}={}){if(!e)throw new Error("standalone client is required");await e.start();let o=await e.request("session.create",{source:"cli"}),s="",a=!1;try{return await new Promise((c,u)=>{let i=f=>{let m=f?.params?.type,x=f?.params?.payload||{};if(m==="message.delta"&&typeof x.text=="string"){s+=x.text,n.write(x.text);return}if(m==="message.complete"){!s&&x.text&&n.write(String(x.text)),n.write(`
21
+ `),a=!0,c(0);return}if(m==="error"){let g=x.message||x.text||"standalone chat failed";r.write(`oracle chat: ${g}
22
+ `),a=!0,u(new Error(g))}};e.on("event",i),e.request("prompt.submit",{session_id:o.session_id,text:t}).catch(f=>{a||(a=!0,u(f))})})}finally{await e.stop()}}Ue();var T="oracle",ie="oracle";function Mt(e){if(e==="hermes"){let t=be();return t.ok?t.bin:null}for(let t of(process.env.PATH||"").split(S.delimiter)){let n=S.join(t,e);try{if(A.existsSync(n))return n}catch{}}return null}function Nt(e){try{let t=A.readFileSync(e,"utf8").split(/\r?\n/,1)[0];if(!t.startsWith("#!"))return null;let n=t.slice(2).trim().split(/\s+/);if(n[0]?.endsWith("/env")&&n[1]?.startsWith("python"))return{command:n[0],prefix:[n[1]]};if(S.basename(n[0]||"").startsWith("python"))return{command:n[0],prefix:n.slice(1)}}catch{}return null}function Ut(e){let t=Nt(e);if(t)return t;try{let r=A.readFileSync(e,"utf8").match(/["']([^"'\r\n]+\/bin\/hermes)["']/);if(r)return Nt(r[1])}catch{}return null}function jr(){return S.join(M,"src","cli","oracle-harness.py")}function Pt(e,t){let n=jr(),r=process.env.ORACLE_PLAIN_HARNESS==="0"?null:Ut(e);return r&&A.existsSync(n)?{command:r.command,args:[...r.prefix,n,...t]}:{command:e,args:t}}function Mr(){return S.join(M,"skins","oracle.yaml")}function Ur(e=T){let t=S.join(M,"profiles","oracle","SOUL.md");if(!A.existsSync(t))return{ok:!1,reason:"oracle persona missing from package"};let n=S.join(U(),"profiles",e,"SOUL.md");return A.existsSync(n)&&!A.readFileSync(n,"utf8").startsWith("You are Hermes Agent, an intelligent AI assistant created by Nous Research.")?{ok:!0,reused:!0}:(N(S.dirname(n)),A.copyFileSync(t,n),{ok:!0,reused:!1})}function Br(e=T){let t=Mr();if(!A.existsSync(t))return{ok:!1,reason:"skin missing from package"};let n=S.join(U(),"skins"),r=S.join(U(),"profiles",e,"skins");N(n),N(r);let o=A.readFileSync(t,"utf8");return A.writeFileSync(S.join(n,`${ie}.yaml`),o),A.writeFileSync(S.join(r,`${ie}.yaml`),o),{ok:!0,skin:ie}}function Dr(e=T){let t=S.join(U(),"profiles",e,"config.yaml");if(!A.existsSync(t))return{ok:!1,reason:"profile config missing"};let n=Mt("oracle")||S.join(M,"bin","oracle.mjs"),r=S.join(U(),"profiles",e,"oracle");N(r);let o={profile:e,skin:ie,oracleBin:n,commands:{chain:[n,"chain"],setup:[n,"setup"]},updatedAt:new Date().toISOString()};return A.writeFileSync(S.join(r,"chat-surface.json"),JSON.stringify(o,null,2)+`
23
+ `,{mode:384}),{ok:!0,marker:o}}function Kr(e=T){let t=S.join(M,"skills","oracle-chat");if(!A.existsSync(t))return{ok:!1,reason:"oracle-chat skill missing"};let n=S.join(U(),"profiles",e,"skills","oracle-chat");N(n);for(let r of A.readdirSync(t)){let o=S.join(t,r),s=S.join(n,r);A.statSync(o).isFile()&&A.copyFileSync(o,s)}for(let r of["chain","setup"]){let o=S.join(U(),"profiles",e,"skills",r);N(o);let s=S.join(t,`${r}.SKILL.md`),a=S.join(t,"SKILL.md"),c=A.existsSync(s)?A.readFileSync(s,"utf8"):A.readFileSync(a,"utf8");A.writeFileSync(S.join(o,"SKILL.md"),c)}return{ok:!0}}function qr(e=T){let t=Mt("hermes");if(!t)return{ok:!1,reason:"hermes missing"};let n=Fr(t,["-p",e,"config","set","display.skin",ie],{encoding:"utf8",timeout:3e4});return n.status!==0?{ok:!1,reason:(n.stderr||n.stdout||"config set failed").trim()}:{ok:!0}}function Rt(e){if(!A.existsSync(e))return!1;let t=A.readFileSync(e,"utf8");if(/^model:\s*\S+/m.test(t))return!0;let n=t.match(/^model:\s*\n((?:[ \t]+.*(?:\n|$))*)/m)?.[1]||"";return/^\s+(?:default|provider):\s*\S+/m.test(n)}function Hr(e=T){let t=U();if(A.existsSync(S.join(t,"auth.json"))||A.existsSync(S.join(t,"profiles",e,"auth.json")))return!0;let n=["OPENROUTER_API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY","XAI_API_KEY","GOOGLE_API_KEY","GEMINI_API_KEY","DEEPSEEK_API_KEY","HF_TOKEN","GLM_API_KEY","KIMI_API_KEY","MINIMAX_API_KEY"];if(n.some(r=>process.env[r]))return!0;for(let r of[S.join(t,".env"),S.join(t,"profiles",e,".env")]){if(!A.existsSync(r))continue;let o=A.readFileSync(r,"utf8");if(n.some(s=>new RegExp(`^${s}=.+`,"m").test(o)))return!0}return!1}function Ft(e=T){let t=U();return Rt(S.join(t,"config.yaml"))||Rt(S.join(t,"profiles",e,"config.yaml"))||Hr(e)}function jt(){return["oracle chat, filled lowercase oracle chat",""," oracle chat open interactive oracle chat",' oracle chat -q "..." one-shot query'," oracle chat --model <m> use a model for this session"," oracle chat --print-banner show filled oracle banner only","","inside chat:"," /chain list/select chains"," /setup messaging setup menu"," /model switch models (still one oracle persona)","","brand: filled lowercase oracle / classic boxed layout"].join(`
24
+ `)}function zr(){let e=Number(process.stdout?.columns||process.env.COLUMNS||80);return Number.isFinite(e)&&e>0?Math.floor(e):80}function Wr(e){return Array.from(String(e)).length}function Yr(e,t){let n=e.map(a=>a.trimEnd()),r=Math.max(0,...n.map(a=>Wr(a))),o=Math.max(0,Math.floor((t-r)/2)),s=" ".repeat(o);return n.map(a=>a?`${s}${a}`:"")}function Gr(){let e=[""," \u2588\u2588\u2588\u2588"," \u2591\u2591\u2588\u2588\u2588"," \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588"," \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588","\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588","\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591","\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588"," \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591",""];process.stdout.write(Yr(e,zr()).join(`
25
+ `)+`
26
+ `)}function Jr(e){let t={pass:[],query:null,model:null,provider:null};for(let n=0;n<e.length;n+=1){let r=e[n];if((r==="--model"||r==="-m")&&e[n+1]){t.model=e[++n],t.pass.push("--model",t.model);continue}if(r==="--provider"&&e[n+1]){t.provider=e[++n],t.pass.push("--provider",t.provider);continue}if((r==="-q"||r==="--query")&&e[n+1]){t.query=e[++n],t.pass.push("-q",t.query);continue}if(r==="--quiet"||r==="-Q"){t.pass.push("--quiet");continue}if(r==="--continue"||r==="-c"){t.pass.push("--continue");continue}t.pass.push(r)}return t}var fi={name:"chat",summary:"open the one oracle chat surface (telegram-like, multi-model)",group:"read",usage:jt(),async run(e){let t=[...e.argv];if(t.includes("-h")||t.includes("--help"))return process.stdout.write(jt()+`
27
+ `),0;if(t.includes("--print-banner"))return Gr(),0;let n=Jr(t),r={...process.env,...n.model?{ORACLE_MODEL:n.model}:{},...n.provider?{ORACLE_PROVIDER:n.provider}:{}},o=te(),s=yt({env:r,hermes:be(),storedConfig:Ye(),oauthAvailable:w=>!!o.get(w),apiKeyResolver:w=>o.getApiKey(w)});if(s.kind==="unconfigured")return process.stderr.write(`${s.reason}
28
+ `),1;let a=ae({ORACLE_CHAT_SURFACE:"1",ORACLE_PROFILE:T,ORACLE_NODE_BIN:process.execPath,ORACLE_CLI_ENTRY:S.join(M,"bin","oracle.mjs")});if(s.kind==="standalone"){let w=Tt({config:{...s.config,...n.model?{model:n.model}:{}}});if(n.query)try{return await Lt({client:w,text:n.query,stdout:process.stdout,stderr:process.stderr})}catch{return 1}let _=await Te({client:w,args:t,env:a,cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});return _.native?_.code:(process.stderr.write(process.env.ORACLE_NATIVE_TUI==="0"?`oracle standalone chat requires the native TUI; remove ORACLE_NATIVE_TUI=0
29
+ `:`oracle standalone chat requires an interactive TTY or -q <query>
30
+ `),1)}let c=s.bin;Ur(T),Br(T),Kr(T);let u=qr(T);Dr(T),!u.ok&&process.env.ORACLE_CLI_DEBUG&&process.stderr.write(`oracle chat: skin note: ${u.reason}
31
+ `);let i=!!(n.model||n.provider);if(!Ft(T)&&!i){if(!process.stdin.isTTY||!process.stdout.isTTY)return process.stderr.write(`oracle chat needs a configured model
32
+ run: oracle model
33
+ `),1;process.stdout.write(`choose oracle's model before first chat
34
+
35
+ `);let w=Pt(c,["-p",T,"model"]),_=await ye(w.command,w.args,{stdio:"inherit",env:process.env},"oracle-model");if(_!==0||!Ft(T))return _||1}let f=["-p",T,"chat"],m=Ut(c),x=await Te({hermesPython:m,args:t,env:a,cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});if(x.native)return x.code;let g=Pt(c,[...f,...n.pass]);return ye(g.command,g.args,{stdio:"inherit",env:a},"oracle-chat")}};export{fi as default,jr as harnessSourcePath,Pt as oracleHarnessInvocation,Ut as resolveHermesPython};
@@ -0,0 +1 @@
1
+ var r={name:"credential",summary:"OS credential store glue",group:"sign",usage:"oracle credential <get|set|delete> ...",async run(e){return e.dispatchOperator("oracle-credential",e.argv,{appendHintOnError:!0})}};export{r as default};
@@ -0,0 +1,2 @@
1
+ import g from"node:path";import{spawn as m}from"node:child_process";var h=["SIGINT","SIGTERM","SIGHUP"];function d(e,a=[],u={},f=e){return new Promise(s=>{let o=m(e,a,u),n=!1,c=null,l=new Map(h.map(r=>[r,()=>{c||=r,o.exitCode===null&&o.signalCode===null&&o.kill(r)}]));for(let[r,t]of l)process.on(r,t);let p=()=>{for(let[r,t]of l)process.off(r,t)};o.once("error",r=>{n||(n=!0,p(),process.stderr.write(`oracle: could not start ${f}: ${r.message}
2
+ `),s(1))}),o.once("exit",(r,t)=>{if(n)return;n=!0,p();let i=c||t;if(i){process.kill(process.pid,i);return}s(r??1)})})}var x={name:"data-mcp",summary:"start the read-only data MCP server",group:"read",usage:"oracle data-mcp",async run(e){let a=g.join(e.root,"bin","oracle-data-mcp.mjs");return d(process.execPath,[a,...e.argv],{stdio:"inherit",env:process.env},"oracle-data-mcp")}};export{x as default};
@@ -0,0 +1,12 @@
1
+ import w from"node:path";import{parseArgs as S}from"node:util";import{spawn as v}from"node:child_process";var m=["SIGINT","SIGTERM","SIGHUP"];function h(r,t=[],a={},l=r){return new Promise(o=>{let e=v(r,t,a),n=!1,p=null,u=new Map(m.map(s=>[s,()=>{p||=s,e.exitCode===null&&e.signalCode===null&&e.kill(s)}]));for(let[s,c]of u)process.on(s,c);let f=()=>{for(let[s,c]of u)process.off(s,c)};e.once("error",s=>{n||(n=!0,f(),process.stderr.write(`oracle: could not start ${l}: ${s.message}
2
+ `),o(1))}),e.once("exit",(s,c)=>{if(n)return;n=!0,f();let g=p||c;if(g){process.kill(process.pid,g);return}o(s??1)})})}var A="http://127.0.0.1:8787";function i(){process.stderr.write(`usage: oracle data <serve|call|catalog|health> [args]
3
+ oracle data serve [--port N]
4
+ oracle data call <provider> <op> [--args '<json>']
5
+ oracle data catalog
6
+ oracle data health
7
+ `)}async function d(r,{method:t="GET",body:a}={}){let o=(process.env.ORACLE_DATA_URL||A).replace(/\/$/,"")+r;try{let e=await fetch(o,{method:t,headers:a?{"content-type":"application/json"}:void 0,body:a?JSON.stringify(a):void 0}),n=await e.text();return process.stdout.write(n.endsWith(`
8
+ `)?n:n+`
9
+ `),e.ok?0:1}catch(e){return e&&(e.code==="ECONNREFUSED"||/fetch failed|ECONNREFUSED/i.test(String(e)))?(process.stderr.write(`oracle: data server not running \u2014 start it with 'oracle data serve'
10
+ `),4):(process.stderr.write(`oracle data: ${e.message||e}
11
+ `),1)}}var T={name:"data",summary:"desk data plane",group:"read",usage:"oracle data serve|call|catalog|health",async run(r){let t=r.argv[0];if(!t||t==="--help"||t==="-h")return i(),t?0:1;if(t==="serve"){let a=null;try{let{values:e}=S({args:r.argv.slice(1),options:{port:{type:"string"}},allowPositionals:!0,strict:!1});a=e.port||null}catch{}let l={...process.env};a&&(l.ORACLE_DATA_PORT=String(a));let o=w.join(r.root,"bin","desk-server.mjs");return h(process.execPath,[o],{stdio:"inherit",env:l},"desk-server")}if(t==="health")return d("/health");if(t==="catalog")return d("/data/catalog");if(t==="call"){let a=r.argv[1],l=r.argv[2];if(!a||!l)return i(),1;let o={},e=r.argv.indexOf("--args");if(e>=0)try{o=JSON.parse(r.argv[e+1]||"{}")}catch(n){return process.stderr.write(`oracle data call: invalid --args JSON: ${n.message}
12
+ `),1}return d("/data/call",{method:"POST",body:{provider:a,op:l,args:o}})}return i(),1}};export{T as default};
@@ -0,0 +1,5 @@
1
+ import h from"node:fs";import D from"node:path";var _="signing: not installed (optional) \u2014 npm i -g @oracle-agent/operator";import k from"node:fs";import u from"node:path";import j from"node:os";import y from"node:path";import{fileURLToPath as C}from"node:url";var P=y.dirname(C(import.meta.url)),K=y.resolve(P,"../..");function S(){return process.env.ORACLE_FAKE_HOME||j.homedir()}function b(){return y.join(S(),".config","oracle")}var $="0.19.0",W=`hermes-agent==${$}`;var T="0.12.1",q=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${T}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${T}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function N(){return u.join(b(),"runtime")}function I(){return u.join(N(),"venv")}function U(e){let t=process.platform==="win32"?"Scripts":"bin",o=process.platform==="win32"?`${e}.exe`:e;return u.join(I(),t,o)}function H(){return U("hermes")}function L(e){let t=process.platform==="win32"&&!u.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let o of(process.env.PATH||"").split(u.delimiter))if(o)for(let r of t){let s=u.join(o,`${e}${r}`);try{if(k.existsSync(s))return s}catch{}}return null}function R(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=L("hermes");if(e)return{ok:!0,bin:e,source:"path"};let t=H();return k.existsSync(t)?{ok:!0,bin:t,source:"managed"}:{ok:!1,bin:null,source:null}}function O(){let[e,t]=process.versions.node.split(".").map(Number);return e>20||e===20&&t>=19}function M(e){if(!h.existsSync(e))return{};let t={};for(let o of h.readFileSync(e,"utf8").split(/\r?\n/)){let r=o.match(/^([A-Z0-9_]+)=(.*)$/);r&&(t[r[1]]=r[2])}return t}async function V(e){try{return(await fetch(e.replace(/\/$/,"")+"/health")).ok}catch{return!1}}var se={name:"doctor",summary:"check read plane; checks signer too when installed",group:"read",usage:"oracle doctor [--json]",async run(e){let t=e.argv.includes("--json"),o=[],r=!1,s=(n,a,f,c=null)=>{o.push({id:n,status:a,detail:f,fix:c}),a==="fail"&&(r=!0)};s("node",O()?"ok":"fail",`node ${process.versions.node}`,O()?null:"install node >= 20.19");let A=e.paths.oracleExecEnvPath(),d=M(A),m=process.env.ORACLE_ROUTE_ATTESTATION_SECRET||process.env.MAD_ROUTE_ATTESTATION_SECRET||process.env.ORACLE_ATTESTATION_SECRET||process.env.ORACLE_STAMP_HMAC_SECRET||d.ORACLE_ROUTE_ATTESTATION_SECRET||d.MAD_ROUTE_ATTESTATION_SECRET||d.ORACLE_ATTESTATION_SECRET||d.ORACLE_STAMP_HMAC_SECRET;s("attestation_secret",m?"ok":"warn",m?"present":"missing",m?null:"run oracle init --apply (writes ~/.config/oracle/exec.env)");let v=process.env.ORACLE_DATA_URL||"http://127.0.0.1:8787",x=await V(v);s("data_server",x?"ok":"warn",x?`reachable ${v}`:`down ${v}`,x?null:"oracle data serve");let l=R();s("agent_runtime",l.ok?"ok":"warn",l.ok?`present ${l.bin} (${l.source})`:"not installed",l.ok?null:"oracle bootstrap");let g=D.join(e.paths.hermesRoot(),"profiles"),p=0;h.existsSync(g)&&(p=h.readdirSync(g,{withFileTypes:!0}).filter(n=>n.isDirectory()).length),s("hermes_lanes",p>0?"ok":"warn",p>0?`${p} profile dir(s)`:"no lane profiles found",p>0?null:"oracle init --apply");let i=e.resolveOperator(),E={installed:!1};if(i.ok){let n=e.dispatchOperator("oracle-agentic-doctor",["--json"],{stdio:"pipe"}),a={installed:!0,version:i.version,source:i.source};if(n&&typeof n=="object"&&n.stdout)try{let c=JSON.parse(n.stdout);a={installed:!0,version:i.version,source:i.source,signingReady:c.signingReady,broadcastReady:c.broadcastReady,executionReady:c.executionReady,masterKillSwitch:c.masterKillSwitch,raw:c}}catch{a.doctorParseError=!0,a.doctorExit=n.code}else typeof n=="number"&&(a.doctorExit=n);E=a;let f=a.signingReady===!0;s("signing",f?"ok":"warn",f?`operator ${i.version} ready via ${i.source}`:`operator ${i.version} installed but signing is not ready`,f?null:"oracle sign doctor --json")}let w={ok:!r,checks:o,operator:E};if(t)process.stdout.write(JSON.stringify(w,null,2)+`
2
+ `);else{for(let n of o)process.stdout.write(`${n.status.toUpperCase().padEnd(4)} ${n.id}: ${n.detail}
3
+ `),n.fix&&process.stdout.write(` fix: ${n.fix}
4
+ `);i.ok||process.stdout.write(`INFO ${_}
5
+ `)}return r?1:0}};export{se as default};
@@ -0,0 +1,13 @@
1
+ import{readFileSync as b,existsSync as v}from"node:fs";import{Contract as x,JsonRpcProvider as A,verifyMessage as j}from"ethers";var i="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",p=999,O="https://rpc.hyperliquid.xyz/evm",w=["function balanceOf(address owner) view returns (uint256)"],R=300*1e3,$=720*60*1e3,y=/^0x[a-fA-F0-9]{40}$/;function f(r){return y.test(String(r||""))}async function d(r,{contract:n=i,rpc:t=O,chainId:o=p}={}){let c=new A(t,o,{staticNetwork:!0}),a=new x(n,w,c);return BigInt(await a.balanceOf(r))}import S from"node:os";import l from"node:path";import{fileURLToPath as E}from"node:url";var C=l.dirname(E(import.meta.url)),T=l.resolve(C,"../..");function L(){return process.env.ORACLE_FAKE_HOME||S.homedir()}function _(){return l.join(L(),".config","oracle")}function h(){return l.join(_(),"exec.env")}var g=`oracle gate \u2014 Locals Only holder check
2
+
3
+ oracle gate status check the configured agent wallet
4
+ oracle gate check <address> check any address
5
+ oracle gate info show the gate contract
6
+
7
+ Access to Oracle is granted by holding a Locals Only NFT. This command reads a
8
+ public balanceOf on HyperEVM; it does not sign, and it never sees a key.
9
+
10
+ This is a local convenience check. Enforcement happens at distribution, where a
11
+ signature proves you control the wallet before an install is issued.`;function k(r=h()){if(!v(r))return null;try{let n=b(r,"utf8");for(let t of n.split(`
12
+ `)){let o=t.match(/^\s*(?:export\s+)?ORACLE_EVM_ADDRESS\s*=\s*(.+)\s*$/);if(!o)continue;let c=o[1].trim().replace(/^["']|["']$/g,"");if(f(c))return c}}catch{return null}return null}function e(r,n){r.write(n+`
13
+ `)}async function D(r=[],n={}){let t=n.out??process.stdout,o=n.err??process.stderr,c=n.balanceOf??d,a=r[0];if(!a||a==="--help"||a==="-h"||a==="help")return e(t,g),0;if(a==="info")return e(t,`contract: ${i}`),e(t,`chain: HyperEVM (${p})`),e(t,"token: Locals Only (LOCALS)"),0;let s;if(a==="status"){if(s=n.agentAddress?n.agentAddress():k(),!s)return e(o,"no agent wallet configured (ORACLE_EVM_ADDRESS not set)"),e(o,"run: oracle init"),1}else if(a==="check"){if(s=r[1],!f(s))return e(o,"usage: oracle gate check <0x address>"),2}else return e(o,`oracle gate: unknown subcommand '${a}'`),2;let u;try{u=await c(s)}catch(m){return e(o,`could not reach HyperEVM to check the gate: ${m.message}`),3}return BigInt(u)>0n?(e(t,`holder: yes (${u})`),e(t,`wallet: ${s}`),0):(e(t,"holder: no"),e(t,`wallet: ${s}`),e(t,""),e(t,"Oracle access requires a Locals Only NFT on HyperEVM."),e(t,`contract: ${i}`),4)}var q="check Locals Only holder access for a wallet",z={name:"gate",summary:"check Locals Only holder access for a wallet",group:"read",usage:g,async run(r){return D(r.argv??[])}};export{k as agentAddress,z as default,q as help,D as run};
@@ -0,0 +1 @@
1
+ var e={name:"help",summary:"show command help",group:"meta",usage:"oracle help [noun]",async run(){return 0}};export{e as default};
@@ -0,0 +1,3 @@
1
+ import{spawnSync as i}from"node:child_process";import c from"node:path";var n=["oracle data serve # loopback read/prepare plane on 127.0.0.1:8787","oracle doctor # verify","oracle chat # premium oracle chat surface","oracle chain list # pick hyperliquid/base/solana/...","oracle setup # telegram/discord/slack messaging","oracle mcp install claude-code","# optional, explicit second step \u2014 signing stays a separate local package:","npm i -g @oracle-agent/operator","oracle sign init"];function a(){return["","Next:",...n.map(t=>" "+t),""].join(`
2
+ `)}var g={name:"init",summary:"install agent lanes + read plane (dry-run by default)",group:"read",usage:"oracle init [--apply --force --only <lane> --json --yes]",async run(t){let r=[...t.argv];r.includes("--yes")&&!r.includes("--apply")&&r.push("--apply");let s=c.join(t.root,"bin","oracle-init.mjs"),e=i(process.execPath,[s,...r],{encoding:"utf8",env:process.env});if(e.error)return process.stderr.write(`oracle: failed to spawn oracle-init: ${e.error.message}
3
+ `),1;e.stdout&&process.stdout.write(e.stdout),e.stderr&&process.stderr.write(e.stderr);let o=typeof e.status=="number"?e.status:1;return o===0&&r.includes("--apply")&&!r.includes("--json")&&process.stdout.write(a()),o}};export{g as default};
@@ -0,0 +1,33 @@
1
+ import{parseArgs as ne}from"node:util";import P from"node:path";import{fileURLToPath as L}from"node:url";var G=P.dirname(L(import.meta.url)),ie=P.resolve(G,"../.."),ce=Object.freeze(["oracle-vault","oracle-credential","oracle-signer","oracle-runner","oracle-agentic-init","oracle-agentic-doctor","oracle-control-mcp","oracle-operator-caps"]),ae=Object.freeze(["vault","credential","signer","runner","sign"]),N=`oracle: signing is unavailable in the public package.
2
+
3
+ The public 'oracle' package is prepare-only and never handles keys.
4
+ Owner-operated signing is private infrastructure and has no public npm install.
5
+ Review and sign prepared artifacts in your own wallet instead.
6
+
7
+ Nothing about your read/research/prepare setup is affected.
8
+ `;function h(e=process.stderr){e.write(N),N.endsWith(`
9
+ `)||e.write(`
10
+ `)}import{spawnSync as T}from"node:child_process";import J from"node:path";import g from"node:fs";import _ from"node:path";import q from"node:os";import R from"node:path";import{fileURLToPath as B}from"node:url";var U=R.dirname(B(import.meta.url)),A=R.resolve(U,"../..");function d(){return process.env.ORACLE_FAKE_HOME||q.homedir()}function m({oracleRoot:e=A,operator:t=null,withControl:r=!1}={}){let o={"oracle-data":{command:"node",args:[_.join(e,"bin","oracle-data-mcp.mjs")]}};if(r){if(!t||!t.ok)return{ok:!1,reason:"operator-missing"};let i=t.bins?.["oracle-control-mcp"]||t.controlMcp||null;if(!i)return{ok:!1,reason:"control-bin-missing"};o["oracle-control"]={command:"node",args:[i]}}return{ok:!0,specs:o}}function j(e){if(!g.existsSync(e))return null;let t=`${e}.bak-oracle-${Math.floor(Date.now()/1e3)}`;return g.copyFileSync(e,t),t}function K(e,t={}){return g.existsSync(e)?JSON.parse(g.readFileSync(e,"utf8")):structuredClone(t)}function W(e,t){g.mkdirSync(_.dirname(e),{recursive:!0}),g.writeFileSync(e,JSON.stringify(t,null,2)+`
11
+ `)}function b(e,t){let r=K(e,{});(!r.mcpServers||typeof r.mcpServers!="object")&&(r.mcpServers={});let o=!1;for(let[u,n]of Object.entries(t)){let a=r.mcpServers[u];a&&JSON.stringify(a)===JSON.stringify(n)||(r.mcpServers[u]=n,o=!0)}if(!o)return{status:"present",backup:null};let i=j(e);return W(e,r),{status:"written",backup:i}}function f(e,t={}){return{status:e,...t}}function z(){return J.join(d(),".claude.json")}function Y(e){return J.join(e||process.cwd(),".mcp.json")}function V(e,t){let r=T("claude",["--version"],{encoding:"utf8",timeout:1e4});if(r.error||r.status!==0)return null;let o=T("claude",["mcp","add-json",e,JSON.stringify(t),"--scope","user"],{encoding:"utf8",timeout:3e4});return o.status!==0?{ok:!1,stderr:o.stderr||o.stdout||"failed"}:{ok:!0}}async function I({oracleRoot:e,operator:t,withControl:r=!1,project:o=!1,printOnly:i=!1,cwd:u=process.cwd()}){let n=m({oracleRoot:e,operator:t,withControl:r});if(!n.ok)return{ok:!1,code:3,reason:n.reason};if(i)return{ok:!0,print:{mcpServers:n.specs}};if(o){let p=Y(u),c=b(p,n.specs);return{ok:!0,...f(c.status,{path:p,backup:c.backup})}}let a=!1;for(let[p,c]of Object.entries(n.specs)){let k=V(p,c);if(k&&k.ok){a=!0;continue}break}if(a)return{ok:!0,...f("written",{method:"claude-cli"})};let l=z(),s=b(l,n.specs);return{ok:!0,...f(s.status,{path:l,backup:s.backup})}}import Q from"node:fs";import O from"node:path";function X(){return process.platform==="darwin"?O.join(d(),"Library","Application Support","Claude","claude_desktop_config.json"):O.join(d(),".config","Claude","claude_desktop_config.json")}async function w({oracleRoot:e,operator:t,withControl:r=!1,printOnly:o=!1}){let i=m({oracleRoot:e,operator:t,withControl:r});if(!i.ok)return{ok:!1,code:3,reason:i.reason};let u=X(),n={mcpServers:i.specs};if(o)return{ok:!0,print:n};let a=O.dirname(u);if(!Q.existsSync(a))return{ok:!0,status:"printed (Claude Desktop not detected)",path:u,print:n};let l=b(u,i.specs);return{ok:!0,...f(l.status,{path:u,backup:l.backup})}}import y from"node:fs";import $ from"node:path";var H="# oracle-mcp-install begin",D="# oracle-mcp-install end";function Z(){return $.join(d(),".codex","config.toml")}function ee(e){let t=[H];for(let[r,o]of Object.entries(e))t.push(`[mcp_servers.${r}]`),t.push(`command = ${JSON.stringify(o.command)}`),t.push(`args = [${o.args.map(i=>JSON.stringify(i)).join(", ")}]`),t.push("");return t.push(D),t.join(`
12
+ `)+`
13
+ `}function te(e){return e.replace(new RegExp(`${H}[\\s\\S]*?${D}\\n?`,"g"),"")}async function x({oracleRoot:e,operator:t,withControl:r=!1,printOnly:o=!1}){let i=m({oracleRoot:e,operator:t,withControl:r});if(!i.ok)return{ok:!1,code:3,reason:i.reason};let u=ee(i.specs),n=Z();if(o)return{ok:!0,printText:u,path:n};y.mkdirSync($.dirname(n),{recursive:!0});let a=y.existsSync(n)?y.readFileSync(n,"utf8"):"";if(a.includes(u.trim()))return{ok:!0,...f("present",{path:n,backup:null})};let s=(te(a).trimEnd()+`
14
+
15
+ `+u).replace(/^\n+/,"");if(a.trim()===s.trim())return{ok:!0,...f("present",{path:n,backup:null})};let p=a?j(n):null;return y.writeFileSync(n,s.endsWith(`
16
+ `)?s:s+`
17
+ `),{ok:!0,...f("written",{path:n,backup:p})}}import M from"node:fs";import F from"node:path";var E="ChatGPT is hosted and can NEVER sign or reach your keys. This connector is read/prepare only; anything it prepares is unsigned until you sign it locally.";function re(){return{openapi:"3.1.0",info:{title:"Oracle Public (read/prepare)",version:"1.0.0",description:"Secret-free public surface for hosted clients. "+E},servers:[{url:"https://REPLACE-WITH-YOUR-TUNNEL"}],paths:{"/public/health":{get:{operationId:"publicHealth",summary:"Health check",responses:{200:{description:"ok"}}}},"/public/config":{get:{operationId:"publicConfig",summary:"Public config",responses:{200:{description:"ok"}}}},"/public/connect/request":{post:{operationId:"connectRequest",summary:"Build a connect request (unsigned)",responses:{200:{description:"unsigned request artifact"}}}},"/public/connect/assemble":{post:{operationId:"connectAssemble",summary:"Assemble an unsigned grant artifact",responses:{200:{description:"unsigned grant artifact"}}}},"/public/grants/active":{post:{operationId:"grantsActive",summary:"List active grants (read)",responses:{200:{description:"ok"}}}},"/public/grants/get":{post:{operationId:"grantsGet",summary:"Get a grant by id (read)",responses:{200:{description:"ok"}}}}}}}async function C({printOnly:e=!1}={}){let t=re(),r=F.join(d(),".config","oracle","connectors","chatgpt-openapi.json"),o=JSON.stringify(t,null,2)+`
18
+ `;e||(M.mkdirSync(F.dirname(r),{recursive:!0}),M.writeFileSync(r,o));let i=[E,"","Next steps:"," 1. oracle public serve"," 2. Expose 127.0.0.1:8799 through YOUR HTTPS tunnel (cloudflared, tailscale funnel, etc.)."," Oracle will not create tunnels for you."," 3. Paste the OpenAPI spec into a GPT Action, or add the tunnel URL as a developer-mode MCP connector.",e?"":` Spec written to: ${r}`].filter(Boolean).join(`
19
+ `);return{ok:!0,...f(e?"printed":"written",{path:r,print:t,instructions:i,cannotSign:E})}}function v(){process.stderr.write(`usage: oracle mcp <install|print> [target] [flags]
20
+ targets: claude-code | claude-desktop | codex | chatgpt | generic
21
+ flags: --with-control --project --print --json
22
+ `)}function S(e,{json:t=!1}={}){if(e.print&&!e.instructions?process.stdout.write(JSON.stringify(e.print,null,2)+`
23
+ `):e.printText&&process.stdout.write(e.printText),e.instructions&&(process.stdout.write(e.instructions+`
24
+ `),e.print&&t&&process.stdout.write(JSON.stringify(e.print,null,2)+`
25
+ `)),!e.print&&!e.printText&&!e.instructions){let r={status:e.status,path:e.path||null,backup:e.backup||null,method:e.method||null};process.stdout.write((t?JSON.stringify(r,null,2):`${r.status}${r.path?" "+r.path:""}`)+`
26
+ `)}}var Le={name:"mcp",summary:"wire Oracle into AI clients",group:"read",usage:"oracle mcp install <target> | oracle mcp print [--target <t>]",async run(e){let t=e.argv[0];if(!t||t==="--help"||t==="-h")return v(),t?0:1;let r,o;try{({values:r,positionals:o}=ne({args:e.argv.slice(1),options:{"with-control":{type:"boolean",default:!1},project:{type:"boolean",default:!1},print:{type:"boolean",default:!1},json:{type:"boolean",default:!1},target:{type:"string"}},allowPositionals:!0,strict:!1}))}catch(s){return process.stderr.write(`oracle mcp: ${s.message}
27
+ `),v(),1}let i=!!r["with-control"],u=!!r.project,n=!!r.json,a=e.resolveOperator?e.resolveOperator():{ok:!1};if(i&&(!a||!a.ok))return h(process.stderr),3;let l={oracleRoot:e.root,operator:a,withControl:i,project:u,cwd:process.cwd()};if(t==="print"){let s=r.target||o[0]||"claude-code";if(s==="generic"||s==="claude-code"){let p=m(l);return p.ok?(process.stdout.write(JSON.stringify({mcpServers:p.specs},null,2)+`
28
+ `),0):(h(process.stderr),3)}if(s==="chatgpt"){let p=await C({printOnly:!0});return S(p,{json:n}),0}return s==="codex"?(S(await x({...l,printOnly:!0}),{json:n}),0):s==="claude-desktop"?(S(await w({...l,printOnly:!0}),{json:n}),0):(process.stderr.write(`oracle mcp: unknown target '${s}'
29
+ `),1)}if(t==="install"){let s=o[0]||r.target;if(!s)return v(),1;let p=!!r.print,c;if(s==="claude-code")c=await I({...l,printOnly:p});else if(s==="claude-desktop")c=await w({...l,printOnly:p});else if(s==="codex")c=await x({...l,printOnly:p});else if(s==="chatgpt")c=await C({printOnly:p});else if(s==="generic"){let k=m(l);return k.ok?(process.stdout.write(JSON.stringify({mcpServers:k.specs},null,2)+`
30
+ `),0):(h(process.stderr),3)}else return process.stderr.write(`oracle mcp: unknown target '${s}'
31
+ `),1;return c.ok?(S(c,{json:n}),c.status&&String(c.status).startsWith("printed")&&c.print&&process.stdout.write(JSON.stringify(c.print,null,2)+`
32
+ `),0):(c.code===3?h(process.stderr):process.stderr.write(`oracle mcp: ${c.reason||"failed"}
33
+ `),c.code||1)}return v(),1}};export{Le as default};