@oracle-agent/oracle 0.10.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 (424) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +82 -91
  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/assets/cli-chain-hyperliquid.jpg +0 -0
  54. package/public/oracle-splash/brand/aave.webp +0 -0
  55. package/public/oracle-splash/brand/aavev2.webp +0 -0
  56. package/public/oracle-splash/brand/aborean.webp +0 -0
  57. package/public/oracle-splash/brand/across.webp +0 -0
  58. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  59. package/public/oracle-splash/brand/afi.webp +0 -0
  60. package/public/oracle-splash/brand/arcus.webp +0 -0
  61. package/public/oracle-splash/brand/aster.webp +0 -0
  62. package/public/oracle-splash/brand/avant.webp +0 -0
  63. package/public/oracle-splash/brand/balancer.webp +0 -0
  64. package/public/oracle-splash/brand/beefy.webp +0 -0
  65. package/public/oracle-splash/brand/benqi.webp +0 -0
  66. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  67. package/public/oracle-splash/brand/bitfi.webp +0 -0
  68. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  69. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  70. package/public/oracle-splash/brand/camelot.webp +0 -0
  71. package/public/oracle-splash/brand/compound.webp +0 -0
  72. package/public/oracle-splash/brand/concrete.webp +0 -0
  73. package/public/oracle-splash/brand/cow.webp +0 -0
  74. package/public/oracle-splash/brand/curve.webp +0 -0
  75. package/public/oracle-splash/brand/derive.webp +0 -0
  76. package/public/oracle-splash/brand/dolomite.webp +0 -0
  77. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  78. package/public/oracle-splash/brand/ekubo.webp +0 -0
  79. package/public/oracle-splash/brand/ethena.webp +0 -0
  80. package/public/oracle-splash/brand/etherfi.webp +0 -0
  81. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  82. package/public/oracle-splash/brand/felix.webp +0 -0
  83. package/public/oracle-splash/brand/fluid.webp +0 -0
  84. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  85. package/public/oracle-splash/brand/folks.webp +0 -0
  86. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  87. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  88. package/public/oracle-splash/brand/gassss.webp +0 -0
  89. package/public/oracle-splash/brand/gmx.webp +0 -0
  90. package/public/oracle-splash/brand/harmonix.webp +0 -0
  91. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  92. package/public/oracle-splash/brand/hlp.webp +0 -0
  93. package/public/oracle-splash/brand/hop.webp +0 -0
  94. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  95. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  96. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  97. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  98. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  99. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  100. package/public/oracle-splash/brand/hypha.webp +0 -0
  101. package/public/oracle-splash/brand/joedex.webp +0 -0
  102. package/public/oracle-splash/brand/jupiter.webp +0 -0
  103. package/public/oracle-splash/brand/kelp.webp +0 -0
  104. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  105. package/public/oracle-splash/brand/kmhype.webp +0 -0
  106. package/public/oracle-splash/brand/kona.webp +0 -0
  107. package/public/oracle-splash/brand/konalend.webp +0 -0
  108. package/public/oracle-splash/brand/lfj.webp +0 -0
  109. package/public/oracle-splash/brand/lido.webp +0 -0
  110. package/public/oracle-splash/brand/lifi.webp +0 -0
  111. package/public/oracle-splash/brand/lighter.webp +0 -0
  112. package/public/oracle-splash/brand/lista.webp +0 -0
  113. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  114. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  115. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  116. package/public/oracle-splash/brand/magiceden.webp +0 -0
  117. package/public/oracle-splash/brand/mempool.png +0 -0
  118. package/public/oracle-splash/brand/meteora.webp +0 -0
  119. package/public/oracle-splash/brand/morpho.webp +0 -0
  120. package/public/oracle-splash/brand/myriad.webp +0 -0
  121. package/public/oracle-splash/brand/noxa.webp +0 -0
  122. package/public/oracle-splash/brand/odos.webp +0 -0
  123. package/public/oracle-splash/brand/oneinch.webp +0 -0
  124. package/public/oracle-splash/brand/openbook.webp +0 -0
  125. package/public/oracle-splash/brand/opensea.webp +0 -0
  126. package/public/oracle-splash/brand/orca.webp +0 -0
  127. package/public/oracle-splash/brand/ordinals.png +0 -0
  128. package/public/oracle-splash/brand/ostium.webp +0 -0
  129. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  130. package/public/oracle-splash/brand/pendle.webp +0 -0
  131. package/public/oracle-splash/brand/perena.webp +0 -0
  132. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  133. package/public/oracle-splash/brand/phoenix.webp +0 -0
  134. package/public/oracle-splash/brand/polymarket.webp +0 -0
  135. package/public/oracle-splash/brand/polynomial.webp +0 -0
  136. package/public/oracle-splash/brand/projectx.webp +0 -0
  137. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  138. package/public/oracle-splash/brand/quickswap.webp +0 -0
  139. package/public/oracle-splash/brand/rain.webp +0 -0
  140. package/public/oracle-splash/brand/raydium.webp +0 -0
  141. package/public/oracle-splash/brand/relay.webp +0 -0
  142. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  143. package/public/oracle-splash/brand/saber.webp +0 -0
  144. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  145. package/public/oracle-splash/brand/sanctum.webp +0 -0
  146. package/public/oracle-splash/brand/satflow.png +0 -0
  147. package/public/oracle-splash/brand/sierra.webp +0 -0
  148. package/public/oracle-splash/brand/sky.webp +0 -0
  149. package/public/oracle-splash/brand/solv.webp +0 -0
  150. package/public/oracle-splash/brand/spark.webp +0 -0
  151. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  152. package/public/oracle-splash/brand/sphere.webp +0 -0
  153. package/public/oracle-splash/brand/ssv.webp +0 -0
  154. package/public/oracle-splash/brand/stabble.webp +0 -0
  155. package/public/oracle-splash/brand/stableswap.webp +0 -0
  156. package/public/oracle-splash/brand/stakewise.webp +0 -0
  157. package/public/oracle-splash/brand/stargate.webp +0 -0
  158. package/public/oracle-splash/brand/sthype.webp +0 -0
  159. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  160. package/public/oracle-splash/brand/unisat.png +0 -0
  161. package/public/oracle-splash/brand/uniswap.webp +0 -0
  162. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  163. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  164. package/public/oracle-splash/brand/unit.webp +0 -0
  165. package/public/oracle-splash/brand/velodrome.webp +0 -0
  166. package/public/oracle-splash/brand/velora.webp +0 -0
  167. package/public/oracle-splash/brand/venus.webp +0 -0
  168. package/public/oracle-splash/brand/wbeth.webp +0 -0
  169. package/public/oracle-splash/brand/xsy.webp +0 -0
  170. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  171. package/public/oracle-splash/brand/zerobase.webp +0 -0
  172. package/public/oracle-splash/brand/zerox.webp +0 -0
  173. package/public/oracle-splash/index.html +246 -169
  174. package/CONTRIBUTING.md +0 -98
  175. package/bin/desk-server.mjs +0 -440
  176. package/bin/oracle-data-mcp.mjs +0 -1010
  177. package/bin/oracle-init.mjs +0 -496
  178. package/bin/oracle-public-server.mjs +0 -36
  179. package/bin/oracle-route.mjs +0 -254
  180. package/bin/oracle-scan.mjs +0 -192
  181. package/bin/oracle-upgrade.mjs +0 -42
  182. package/bin/oracle.mjs +0 -33
  183. package/docs/adding-a-chain.md +0 -229
  184. package/docs/architecture.md +0 -136
  185. package/docs/cli.md +0 -47
  186. package/docs/connectors.md +0 -13
  187. package/docs/oracle-pack-standard.md +0 -29
  188. package/docs/profiles.md +0 -154
  189. package/examples/add-a-chain.mjs +0 -65
  190. package/examples/oracle-pack-template.mjs +0 -38
  191. package/examples/research-a-token.mjs +0 -70
  192. package/plugins/oracle-owner-gate/__init__.py +0 -227
  193. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  194. package/profiles/_template/SOUL.md +0 -54
  195. package/profiles/_template/profile.json +0 -22
  196. package/profiles/bitcoin-agent/SOUL.md +0 -31
  197. package/profiles/bitcoin-agent/profile.json +0 -32
  198. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  199. package/profiles/hyperliquid-agent/profile.json +0 -37
  200. package/profiles/oracle/SOUL.md +0 -107
  201. package/profiles/oracle/profile.json +0 -39
  202. package/profiles/polymarket-agent/SOUL.md +0 -35
  203. package/profiles/polymarket-agent/profile.json +0 -34
  204. package/profiles/profile.schema.json +0 -90
  205. package/profiles/protocol-builder/SOUL.md +0 -57
  206. package/profiles/protocol-builder/profile.json +0 -39
  207. package/profiles/robinhood-agent/SOUL.md +0 -53
  208. package/profiles/robinhood-agent/profile.json +0 -40
  209. package/profiles/solana-agent/SOUL.md +0 -37
  210. package/profiles/solana-agent/profile.json +0 -37
  211. package/profiles/stable-agent/SOUL.md +0 -43
  212. package/profiles/stable-agent/profile.json +0 -37
  213. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  214. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  215. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  216. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  217. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  218. package/scripts/adversarial-bench.mjs +0 -114
  219. package/scripts/build-inscription.py +0 -230
  220. package/scripts/check-doc-drift.mjs +0 -112
  221. package/scripts/check-test-count.mjs +0 -105
  222. package/scripts/e2e-hl-markets.mjs +0 -21
  223. package/scripts/e2e-hl-perps.mjs +0 -48
  224. package/scripts/e2e-hypercore-staking.mjs +0 -128
  225. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  226. package/scripts/protocol-template-gate.mjs +0 -15
  227. package/scripts/public-api-scan.mjs +0 -23
  228. package/scripts/secret-scan.mjs +0 -181
  229. package/scripts/verify-v3-venues.mjs +0 -192
  230. package/skills/balance/SKILL.md +0 -176
  231. package/skills/oracle-action-semantics/SKILL.md +0 -40
  232. package/skills/oracle-best-execution/SKILL.md +0 -127
  233. package/skills/oracle-bitcoin/SKILL.md +0 -53
  234. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  235. package/skills/oracle-chat/SKILL.md +0 -61
  236. package/skills/oracle-chat/chain.SKILL.md +0 -31
  237. package/skills/oracle-chat/setup.SKILL.md +0 -37
  238. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  239. package/skills/oracle-contract-research/SKILL.md +0 -55
  240. package/skills/oracle-desk/SKILL.md +0 -58
  241. package/skills/oracle-dex-launch/SKILL.md +0 -38
  242. package/skills/oracle-grants/SKILL.md +0 -69
  243. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  244. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  245. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  246. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  247. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  248. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  249. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  250. package/skills/oracle-polymarket/SKILL.md +0 -60
  251. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  252. package/skills/oracle-protocol-security/SKILL.md +0 -60
  253. package/skills/oracle-public-product/SKILL.md +0 -44
  254. package/skills/oracle-receipts/SKILL.md +0 -52
  255. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  256. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  257. package/skills/oracle-solana/SKILL.md +0 -65
  258. package/skills/oracle-solana-nft/SKILL.md +0 -54
  259. package/skills/oracle-token-research/SKILL.md +0 -67
  260. package/skins/oracle.yaml +0 -56
  261. package/src/action-receipts.mjs +0 -168
  262. package/src/action-semantics.mjs +0 -62
  263. package/src/address-book.mjs +0 -208
  264. package/src/agent-auth.mjs +0 -206
  265. package/src/approval-guard.mjs +0 -282
  266. package/src/attestation-secret.mjs +0 -88
  267. package/src/audit-log.mjs +0 -196
  268. package/src/auth/oauth.mjs +0 -672
  269. package/src/auto-slippage.mjs +0 -378
  270. package/src/capability-posture.mjs +0 -125
  271. package/src/chains.mjs +0 -62
  272. package/src/cli/chain-catalog.mjs +0 -215
  273. package/src/cli/chain-state.mjs +0 -74
  274. package/src/cli/commands/auth.mjs +0 -193
  275. package/src/cli/commands/bootstrap.mjs +0 -87
  276. package/src/cli/commands/chain.mjs +0 -143
  277. package/src/cli/commands/chat.mjs +0 -434
  278. package/src/cli/commands/credential.mjs +0 -9
  279. package/src/cli/commands/data-mcp.mjs +0 -18
  280. package/src/cli/commands/data.mjs +0 -73
  281. package/src/cli/commands/doctor.mjs +0 -126
  282. package/src/cli/commands/help.mjs +0 -7
  283. package/src/cli/commands/init.mjs +0 -27
  284. package/src/cli/commands/mcp.mjs +0 -142
  285. package/src/cli/commands/model.mjs +0 -99
  286. package/src/cli/commands/prepare.mjs +0 -12
  287. package/src/cli/commands/public.mjs +0 -20
  288. package/src/cli/commands/route.mjs +0 -12
  289. package/src/cli/commands/runner.mjs +0 -9
  290. package/src/cli/commands/scan.mjs +0 -12
  291. package/src/cli/commands/setup.mjs +0 -275
  292. package/src/cli/commands/sign.mjs +0 -21
  293. package/src/cli/commands/signer.mjs +0 -9
  294. package/src/cli/commands/upgrade.mjs +0 -12
  295. package/src/cli/commands/vault.mjs +0 -9
  296. package/src/cli/commands/version.mjs +0 -22
  297. package/src/cli/first-run.mjs +0 -23
  298. package/src/cli/kernel.mjs +0 -239
  299. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  300. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  301. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  302. package/src/cli/mcp-targets/codex.mjs +0 -41
  303. package/src/cli/mcp-targets/shared.mjs +0 -61
  304. package/src/cli/messaging-platforms.mjs +0 -209
  305. package/src/cli/model-config.mjs +0 -70
  306. package/src/cli/operator-dispatch.mjs +0 -258
  307. package/src/cli/oracle-harness.py +0 -415
  308. package/src/cli/paths.mjs +0 -83
  309. package/src/cli/runtime.mjs +0 -351
  310. package/src/cli/setup-state.mjs +0 -168
  311. package/src/cli/spawn-child.mjs +0 -43
  312. package/src/data/catalog.mjs +0 -554
  313. package/src/data/desk-data.mjs +0 -683
  314. package/src/data/http.mjs +0 -253
  315. package/src/data/provider-endpoint.mjs +0 -94
  316. package/src/data/providers/aerodrome.mjs +0 -245
  317. package/src/data/providers/balancer.mjs +0 -209
  318. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  319. package/src/data/providers/bitcoin-meta.mjs +0 -378
  320. package/src/data/providers/blockscout.mjs +0 -14
  321. package/src/data/providers/bridges.mjs +0 -242
  322. package/src/data/providers/cowswap.mjs +0 -415
  323. package/src/data/providers/curve.mjs +0 -201
  324. package/src/data/providers/defillama.mjs +0 -88
  325. package/src/data/providers/dexscreener.mjs +0 -43
  326. package/src/data/providers/evm-rpc.mjs +0 -222
  327. package/src/data/providers/geckoterminal.mjs +0 -34
  328. package/src/data/providers/gmx.mjs +0 -496
  329. package/src/data/providers/hl-assets.mjs +0 -165
  330. package/src/data/providers/hl-info.mjs +0 -108
  331. package/src/data/providers/hl-markets.mjs +0 -210
  332. package/src/data/providers/hl-outcome.mjs +0 -61
  333. package/src/data/providers/hl-perps.mjs +0 -387
  334. package/src/data/providers/hl-staking.mjs +0 -353
  335. package/src/data/providers/hl-ws.mjs +0 -119
  336. package/src/data/providers/hyperevm-dex.mjs +0 -49
  337. package/src/data/providers/jupiter.mjs +0 -183
  338. package/src/data/providers/lifi.mjs +0 -151
  339. package/src/data/providers/magiceden-sol.mjs +0 -393
  340. package/src/data/providers/morpho.mjs +0 -173
  341. package/src/data/providers/nft-gallery.mjs +0 -163
  342. package/src/data/providers/nft-portfolio.mjs +0 -494
  343. package/src/data/providers/odos.mjs +0 -156
  344. package/src/data/providers/oneinch.mjs +0 -174
  345. package/src/data/providers/opensea-multichain.mjs +0 -136
  346. package/src/data/providers/opensea-nft.mjs +0 -371
  347. package/src/data/providers/paraswap.mjs +0 -118
  348. package/src/data/providers/pendle.mjs +0 -187
  349. package/src/data/providers/poly-clob.mjs +0 -283
  350. package/src/data/providers/poly-public.mjs +0 -96
  351. package/src/data/providers/poly-ws.mjs +0 -103
  352. package/src/data/providers/portfolio-history.mjs +0 -394
  353. package/src/data/providers/portfolio.mjs +0 -594
  354. package/src/data/providers/rfq.mjs +0 -15
  355. package/src/data/providers/rh-agent.mjs +0 -59
  356. package/src/data/providers/satflow.mjs +0 -338
  357. package/src/data/providers/solana-rpc.mjs +0 -197
  358. package/src/data/providers/uniswap-v3.mjs +0 -320
  359. package/src/data/providers/zerox.mjs +0 -167
  360. package/src/data/public-api-scan.mjs +0 -61
  361. package/src/data/quote-placeholder.mjs +0 -31
  362. package/src/exact-integer.mjs +0 -72
  363. package/src/exec-policy.mjs +0 -455
  364. package/src/flags.mjs +0 -15
  365. package/src/fresh-window.mjs +0 -76
  366. package/src/gmx-attestation.mjs +0 -176
  367. package/src/index.mjs +0 -100
  368. package/src/nft-gas-war-guard.mjs +0 -139
  369. package/src/onboarding/agent-keys.mjs +0 -161
  370. package/src/onboarding/harness-configs.mjs +0 -102
  371. package/src/onboarding/index.mjs +0 -18
  372. package/src/onboarding/tiers.mjs +0 -139
  373. package/src/oracle-env.mjs +0 -47
  374. package/src/portfolio-risk.mjs +0 -170
  375. package/src/prepare-envelope.mjs +0 -186
  376. package/src/profile-upgrade.mjs +0 -277
  377. package/src/protocol-execution.mjs +0 -84
  378. package/src/protocol-templates/gate.mjs +0 -179
  379. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  380. package/src/public-api/buzz-integration.mjs +0 -256
  381. package/src/public-api/connect-agent.mjs +0 -416
  382. package/src/public-api/grants.mjs +0 -142
  383. package/src/public-api/http.mjs +0 -389
  384. package/src/public-control/aa-adapter.mjs +0 -402
  385. package/src/public-control/build-registry.mjs +0 -227
  386. package/src/public-control/bundler-client.mjs +0 -357
  387. package/src/public-control/grant-indexer.mjs +0 -296
  388. package/src/public-control/policy-render.mjs +0 -69
  389. package/src/public-control/policy-schema.mjs +0 -318
  390. package/src/public-control/runtime-config.mjs +0 -275
  391. package/src/public-control/session-key-model.mjs +0 -374
  392. package/src/public-control/session-orchestrator.mjs +0 -412
  393. package/src/rfq/intent.mjs +0 -180
  394. package/src/rfq/sources.mjs +0 -181
  395. package/src/route-attestation.mjs +0 -132
  396. package/src/router/best-execution.mjs +0 -326
  397. package/src/router/index.mjs +0 -226
  398. package/src/router/prepare-bridge.mjs +0 -289
  399. package/src/router/prepare-route.mjs +0 -381
  400. package/src/router/proposal.mjs +0 -311
  401. package/src/router/risk-classifier.mjs +0 -119
  402. package/src/router/route-sources.mjs +0 -329
  403. package/src/scanner/chains.config.mjs +0 -430
  404. package/src/scanner/contract.mjs +0 -270
  405. package/src/scanner/evm-scanner.mjs +0 -394
  406. package/src/scanner/index.mjs +0 -9
  407. package/src/scanner/v2-venue.mjs +0 -335
  408. package/src/scanner/v3-venue.mjs +0 -290
  409. package/src/scopes.mjs +0 -44
  410. package/src/sell-simulation.mjs +0 -167
  411. package/src/signals/engine.mjs +0 -146
  412. package/src/signals/index.mjs +0 -1
  413. package/src/token-transfer-guard.mjs +0 -188
  414. package/src/tui/app.mjs +0 -438
  415. package/src/tui/backend.mjs +0 -145
  416. package/src/tui/format.mjs +0 -272
  417. package/src/tui/gateway-client.mjs +0 -177
  418. package/src/tui/input.mjs +0 -501
  419. package/src/tui/renderer.mjs +0 -443
  420. package/src/tui/standalone-client.mjs +0 -666
  421. package/src/tui/theme.mjs +0 -81
  422. package/src/vault-attestation.mjs +0 -146
  423. package/src/venues.mjs +0 -206
  424. 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};