@oracle-agent/oracle 0.13.1 → 0.14.1

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 (449) hide show
  1. package/CONTRIBUTING.md +99 -0
  2. package/README.md +20 -14
  3. package/SECURITY.md +6 -8
  4. package/SETUP.md +25 -27
  5. package/bin/desk-server.mjs +473 -0
  6. package/bin/oracle-data-mcp.mjs +1252 -0
  7. package/bin/oracle-equities.mjs +168 -0
  8. package/bin/oracle-init.mjs +525 -0
  9. package/bin/oracle-public-server.mjs +36 -0
  10. package/bin/oracle-route.mjs +254 -0
  11. package/bin/oracle-scan.mjs +192 -0
  12. package/bin/oracle-upgrade.mjs +42 -0
  13. package/bin/oracle.mjs +34 -0
  14. package/docs/adding-a-chain.md +229 -0
  15. package/docs/architecture.md +139 -0
  16. package/docs/buzz-integration.md +115 -0
  17. package/docs/cli.md +143 -0
  18. package/docs/connectors.md +13 -0
  19. package/docs/hyperliquid-builder-code.md +50 -0
  20. package/docs/locals-only-fee-waiver.md +34 -0
  21. package/docs/oracle-pack-standard.md +29 -0
  22. package/docs/profiles.md +151 -0
  23. package/docs/public-surface.md +206 -0
  24. package/examples/add-a-chain.mjs +65 -0
  25. package/examples/oracle-pack-template.mjs +38 -0
  26. package/examples/research-a-token.mjs +70 -0
  27. package/package.json +78 -32
  28. package/plugins/oracle-owner-gate/__init__.py +288 -0
  29. package/plugins/oracle-owner-gate/plugin.yaml +9 -0
  30. package/{dist/assets/profiles → profiles}/oracle/SOUL.md +0 -14
  31. package/protocols/templates/safe-erc20/SECURITY.md +16 -0
  32. package/protocols/templates/safe-erc20/foundry.toml +12 -0
  33. package/protocols/templates/safe-erc20/remappings.txt +2 -0
  34. package/protocols/templates/safe-erc20/src/SafeERC20.sol +53 -0
  35. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +72 -0
  36. package/public/oracle-splash/_variants/ice.html +3 -3
  37. package/public/oracle-splash/_variants/ivory.html +3 -3
  38. package/public/oracle-splash/downloads/index.html +34 -223
  39. package/public/oracle-splash/index.html +11 -11
  40. package/scripts/adversarial-bench.mjs +114 -0
  41. package/scripts/build-dist.mjs +119 -0
  42. package/scripts/build-inscription.py +230 -0
  43. package/scripts/check-doc-drift.mjs +123 -0
  44. package/scripts/check-test-count.mjs +105 -0
  45. package/scripts/e2e-hl-markets.mjs +21 -0
  46. package/scripts/e2e-hl-perps.mjs +48 -0
  47. package/scripts/e2e-hypercore-staking.mjs +128 -0
  48. package/scripts/e2e-solana-bitcoin.mjs +183 -0
  49. package/scripts/guard-publish.mjs +22 -0
  50. package/scripts/protocol-template-gate.mjs +15 -0
  51. package/scripts/public-api-scan.mjs +23 -0
  52. package/scripts/publish-dist.mjs +67 -0
  53. package/scripts/record-hero-cli.sh +80 -0
  54. package/scripts/secret-scan.mjs +169 -0
  55. package/scripts/smoke-dist-bins.mjs +89 -0
  56. package/scripts/verify-dist.mjs +29 -0
  57. package/scripts/verify-v3-venues.mjs +233 -0
  58. package/skins/oracle.yaml +56 -0
  59. package/src/action-receipts.mjs +265 -0
  60. package/src/action-semantics.mjs +62 -0
  61. package/src/address-book.mjs +208 -0
  62. package/src/agent-auth.mjs +206 -0
  63. package/src/approval-guard.mjs +282 -0
  64. package/src/attestation-secret.mjs +94 -0
  65. package/src/audit-log.mjs +196 -0
  66. package/src/auth/oauth.mjs +672 -0
  67. package/src/auto-slippage.mjs +378 -0
  68. package/src/capability-posture.mjs +125 -0
  69. package/src/cards.mjs +422 -0
  70. package/src/chains.mjs +62 -0
  71. package/src/cli/chain-catalog.mjs +215 -0
  72. package/src/cli/chain-state.mjs +74 -0
  73. package/src/cli/commands/auth.mjs +193 -0
  74. package/src/cli/commands/bootstrap.mjs +87 -0
  75. package/src/cli/commands/chain.mjs +143 -0
  76. package/src/cli/commands/chat.mjs +465 -0
  77. package/src/cli/commands/credential.mjs +9 -0
  78. package/src/cli/commands/data-mcp.mjs +18 -0
  79. package/src/cli/commands/data.mjs +75 -0
  80. package/src/cli/commands/doctor.mjs +136 -0
  81. package/src/cli/commands/equities.mjs +41 -0
  82. package/src/cli/commands/farm.mjs +129 -0
  83. package/src/cli/commands/fees.mjs +109 -0
  84. package/src/cli/commands/follow.mjs +130 -0
  85. package/src/cli/commands/harness.mjs +63 -0
  86. package/src/cli/commands/help.mjs +7 -0
  87. package/src/cli/commands/init.mjs +27 -0
  88. package/src/cli/commands/mcp.mjs +154 -0
  89. package/src/cli/commands/model.mjs +106 -0
  90. package/src/cli/commands/plugins.mjs +275 -0
  91. package/src/cli/commands/prepare.mjs +12 -0
  92. package/src/cli/commands/public.mjs +20 -0
  93. package/src/cli/commands/resolve.mjs +64 -0
  94. package/src/cli/commands/route.mjs +12 -0
  95. package/src/cli/commands/runner.mjs +9 -0
  96. package/src/cli/commands/scan.mjs +12 -0
  97. package/src/cli/commands/setup.mjs +294 -0
  98. package/src/cli/commands/sign.mjs +21 -0
  99. package/src/cli/commands/signer.mjs +9 -0
  100. package/src/cli/commands/swap.mjs +102 -0
  101. package/src/cli/commands/upgrade.mjs +12 -0
  102. package/src/cli/commands/vault.mjs +9 -0
  103. package/src/cli/commands/version.mjs +22 -0
  104. package/src/cli/first-run.mjs +23 -0
  105. package/src/cli/kernel.mjs +262 -0
  106. package/src/cli/mcp-targets/chatgpt.mjs +51 -0
  107. package/src/cli/mcp-targets/claude-code.mjs +39 -0
  108. package/src/cli/mcp-targets/claude-desktop.mjs +24 -0
  109. package/src/cli/mcp-targets/codex.mjs +41 -0
  110. package/src/cli/mcp-targets/cursor.mjs +32 -0
  111. package/src/cli/mcp-targets/shared.mjs +71 -0
  112. package/src/cli/mcp-targets/vscode.mjs +39 -0
  113. package/src/cli/messaging-platforms.mjs +217 -0
  114. package/src/cli/model-config.mjs +78 -0
  115. package/src/cli/operator-dispatch.mjs +194 -0
  116. package/src/cli/oracle-harness.py +415 -0
  117. package/src/cli/paths.mjs +107 -0
  118. package/src/cli/runtime.mjs +351 -0
  119. package/src/cli/setup-state.mjs +168 -0
  120. package/src/cli/spawn-child.mjs +43 -0
  121. package/src/data/catalog.mjs +858 -0
  122. package/src/data/desk-data.mjs +877 -0
  123. package/src/data/http.mjs +253 -0
  124. package/src/data/names.mjs +188 -0
  125. package/src/data/provider-endpoint.mjs +94 -0
  126. package/src/data/providers/aave-v3.mjs +139 -0
  127. package/src/data/providers/across-bridge.mjs +41 -0
  128. package/src/data/providers/aerodrome.mjs +245 -0
  129. package/src/data/providers/aevo.mjs +33 -0
  130. package/src/data/providers/approval-indexer.mjs +133 -0
  131. package/src/data/providers/approvals.mjs +594 -0
  132. package/src/data/providers/babylon-staking.mjs +149 -0
  133. package/src/data/providers/balancer.mjs +209 -0
  134. package/src/data/providers/beefy-yields.mjs +45 -0
  135. package/src/data/providers/birdeye-tokens.mjs +33 -0
  136. package/src/data/providers/bisq-markets.mjs +145 -0
  137. package/src/data/providers/bitcoin-esplora.mjs +216 -0
  138. package/src/data/providers/bitcoin-meta.mjs +378 -0
  139. package/src/data/providers/blockscout.mjs +14 -0
  140. package/src/data/providers/bob-rootstock.mjs +198 -0
  141. package/src/data/providers/braiins-insights.mjs +103 -0
  142. package/src/data/providers/bridge-aggregator.mjs +259 -0
  143. package/src/data/providers/bridges.mjs +242 -0
  144. package/src/data/providers/bungee.mjs +29 -0
  145. package/src/data/providers/celestia-da.mjs +38 -0
  146. package/src/data/providers/changenow.mjs +135 -0
  147. package/src/data/providers/compound.mjs +32 -0
  148. package/src/data/providers/connext.mjs +28 -0
  149. package/src/data/providers/convex.mjs +30 -0
  150. package/src/data/providers/cow-protocol.mjs +110 -0
  151. package/src/data/providers/cowswap.mjs +415 -0
  152. package/src/data/providers/curve.mjs +201 -0
  153. package/src/data/providers/das-assets.mjs +59 -0
  154. package/src/data/providers/debridge.mjs +109 -0
  155. package/src/data/providers/defillama.mjs +88 -0
  156. package/src/data/providers/dexscreener.mjs +43 -0
  157. package/src/data/providers/drift.mjs +32 -0
  158. package/src/data/providers/dydx.mjs +41 -0
  159. package/src/data/providers/evm-rpc.mjs +225 -0
  160. package/src/data/providers/farming.mjs +291 -0
  161. package/src/data/providers/geckoterminal.mjs +34 -0
  162. package/src/data/providers/gmx.mjs +496 -0
  163. package/src/data/providers/hiro-stacks.mjs +150 -0
  164. package/src/data/providers/hl-assets.mjs +165 -0
  165. package/src/data/providers/hl-info.mjs +108 -0
  166. package/src/data/providers/hl-markets.mjs +210 -0
  167. package/src/data/providers/hl-outcome.mjs +61 -0
  168. package/src/data/providers/hl-perps.mjs +419 -0
  169. package/src/data/providers/hl-staking.mjs +353 -0
  170. package/src/data/providers/hl-ws.mjs +119 -0
  171. package/src/data/providers/hyperevm-dex.mjs +49 -0
  172. package/src/data/providers/jito-mev.mjs +117 -0
  173. package/src/data/providers/jupiter-venues.mjs +119 -0
  174. package/src/data/providers/jupiter.mjs +315 -0
  175. package/src/data/providers/kamino-strategies.mjs +143 -0
  176. package/src/data/providers/l2beat-tvl.mjs +42 -0
  177. package/src/data/providers/lifi.mjs +166 -0
  178. package/src/data/providers/liquid-esplora.mjs +152 -0
  179. package/src/data/providers/magiceden-ordinals.mjs +141 -0
  180. package/src/data/providers/magiceden-sol.mjs +406 -0
  181. package/src/data/providers/mempool-lightning.mjs +144 -0
  182. package/src/data/providers/mempool-mining.mjs +142 -0
  183. package/src/data/providers/meteora-dlmm.mjs +168 -0
  184. package/src/data/providers/morpho.mjs +177 -0
  185. package/src/data/providers/nft-gallery.mjs +163 -0
  186. package/src/data/providers/nft-portfolio.mjs +494 -0
  187. package/src/data/providers/odos.mjs +156 -0
  188. package/src/data/providers/ondo.mjs +31 -0
  189. package/src/data/providers/oneinch.mjs +174 -0
  190. package/src/data/providers/opensea-multichain.mjs +136 -0
  191. package/src/data/providers/opensea-nft.mjs +371 -0
  192. package/src/data/providers/orca.mjs +29 -0
  193. package/src/data/providers/ordinals-runes.mjs +180 -0
  194. package/src/data/providers/pancakeswap.mjs +28 -0
  195. package/src/data/providers/paraswap.mjs +125 -0
  196. package/src/data/providers/pendle.mjs +188 -0
  197. package/src/data/providers/poly-clob.mjs +283 -0
  198. package/src/data/providers/poly-public.mjs +96 -0
  199. package/src/data/providers/poly-ws.mjs +103 -0
  200. package/src/data/providers/polygon-staking.mjs +227 -0
  201. package/src/data/providers/portfolio-history.mjs +394 -0
  202. package/src/data/providers/portfolio.mjs +600 -0
  203. package/src/data/providers/pyth-price-feeds.mjs +172 -0
  204. package/src/data/providers/raydium.mjs +35 -0
  205. package/src/data/providers/relayscan-mev.mjs +72 -0
  206. package/src/data/providers/rfq.mjs +15 -0
  207. package/src/data/providers/rh-agent.mjs +59 -0
  208. package/src/data/providers/sanctum-lst.mjs +180 -0
  209. package/src/data/providers/satflow.mjs +341 -0
  210. package/src/data/providers/signed-material-guard.mjs +108 -0
  211. package/src/data/providers/solana-rpc.mjs +197 -0
  212. package/src/data/providers/solend-lending.mjs +166 -0
  213. package/src/data/providers/spark-lend.mjs +42 -0
  214. package/src/data/providers/squid-router.mjs +29 -0
  215. package/src/data/providers/stargate.mjs +29 -0
  216. package/src/data/providers/sushiswap.mjs +30 -0
  217. package/src/data/providers/symbiotic-restaking.mjs +41 -0
  218. package/src/data/providers/thorchain.mjs +36 -0
  219. package/src/data/providers/traderjoe.mjs +28 -0
  220. package/src/data/providers/twap.mjs +152 -0
  221. package/src/data/providers/uniswap-v3.mjs +457 -0
  222. package/src/data/providers/uniswap-v4.mjs +414 -0
  223. package/src/data/providers/vertex.mjs +41 -0
  224. package/src/data/providers/wallet-watch.mjs +264 -0
  225. package/src/data/providers/wormhole.mjs +28 -0
  226. package/src/data/providers/yearn.mjs +31 -0
  227. package/src/data/providers/zerox.mjs +167 -0
  228. package/src/data/public-api-scan.mjs +61 -0
  229. package/src/data/quote-placeholder.mjs +31 -0
  230. package/src/desk/swap-prepare.mjs +194 -0
  231. package/src/equities/bridge.mjs +388 -0
  232. package/src/equities/fixtures/bridge_routes.json +159 -0
  233. package/src/equities/fixtures/dst_transitions.json +29 -0
  234. package/src/equities/fixtures/equity_dex_pools.json +154 -0
  235. package/src/equities/fixtures/hip3_l2books.json +2711 -0
  236. package/src/equities/fixtures/nyse_holidays.json +1 -0
  237. package/src/equities/fixtures/oracles.json +100 -0
  238. package/src/equities/fixtures/rh_pool_state.json +244 -0
  239. package/src/equities/fixtures/solana_xstocks.json +704 -0
  240. package/src/equities/fixtures/ton_xstocks.json +35 -0
  241. package/src/equities/fixtures/universe.json +411 -0
  242. package/src/equities/fixtures/venues.json +3542 -0
  243. package/src/equities/fixtures.mjs +405 -0
  244. package/src/equities/funding.mjs +142 -0
  245. package/src/equities/index.mjs +166 -0
  246. package/src/equities/liveness.mjs +148 -0
  247. package/src/equities/marketHours.mjs +249 -0
  248. package/src/equities/normalize.mjs +295 -0
  249. package/src/equities/num.mjs +146 -0
  250. package/src/equities/prepare.mjs +95 -0
  251. package/src/equities/rank.mjs +260 -0
  252. package/src/equities/sourceNum.mjs +69 -0
  253. package/src/equities/types.mjs +220 -0
  254. package/src/equities/venues/arcus-perp.mjs +84 -0
  255. package/src/equities/venues/arcus-spot.mjs +105 -0
  256. package/src/equities/venues/hyperliquid-hip3.mjs +224 -0
  257. package/src/equities/venues/rh-uniswap.mjs +216 -0
  258. package/src/equities/venues/solana-xstocks.mjs +139 -0
  259. package/src/equities/venues/ton-stonfi.mjs +139 -0
  260. package/src/exact-integer.mjs +72 -0
  261. package/src/exec-policy.mjs +419 -0
  262. package/src/flags.mjs +15 -0
  263. package/src/fresh-window.mjs +76 -0
  264. package/src/gmx-attestation.mjs +176 -0
  265. package/src/index.mjs +107 -0
  266. package/src/licensing/locals-only.mjs +25 -0
  267. package/src/nft-gas-war-guard.mjs +139 -0
  268. package/src/onboarding/agent-keys.mjs +161 -0
  269. package/src/onboarding/harness-configs.mjs +102 -0
  270. package/src/onboarding/index.mjs +18 -0
  271. package/src/onboarding/tiers.mjs +139 -0
  272. package/src/oracle-env.mjs +55 -0
  273. package/src/package-manifest.mjs +42 -0
  274. package/src/plugins/agent-plugin-loader.mjs +225 -0
  275. package/src/portfolio-risk.mjs +170 -0
  276. package/src/prepare-envelope.mjs +204 -0
  277. package/src/profile-upgrade.mjs +277 -0
  278. package/src/protocol-execution.mjs +84 -0
  279. package/src/protocol-templates/gate.mjs +179 -0
  280. package/src/protocol-templates/prepare-deploy.mjs +81 -0
  281. package/src/public-api/agent-grants.mjs +57 -0
  282. package/src/public-api/buzz-integration.mjs +267 -0
  283. package/src/public-api/connect-agent.mjs +424 -0
  284. package/src/public-api/grants.mjs +142 -0
  285. package/src/public-api/http.mjs +707 -0
  286. package/src/public-api/metering.mjs +111 -0
  287. package/src/public-control/aa-adapter.mjs +402 -0
  288. package/src/public-control/build-registry.mjs +227 -0
  289. package/src/public-control/bundler-client.mjs +357 -0
  290. package/src/public-control/grant-indexer.mjs +296 -0
  291. package/src/public-control/policy-render.mjs +69 -0
  292. package/src/public-control/policy-schema.mjs +322 -0
  293. package/src/public-control/runtime-config.mjs +275 -0
  294. package/src/public-control/session-key-model.mjs +379 -0
  295. package/src/public-control/session-orchestrator.mjs +418 -0
  296. package/src/rfq/intent.mjs +180 -0
  297. package/src/rfq/sources.mjs +181 -0
  298. package/src/route-attestation.mjs +132 -0
  299. package/src/router/best-execution.mjs +326 -0
  300. package/src/router/index.mjs +250 -0
  301. package/src/router/integrator-fee.mjs +135 -0
  302. package/src/router/prepare-bridge.mjs +293 -0
  303. package/src/router/prepare-route.mjs +398 -0
  304. package/src/router/proposal.mjs +311 -0
  305. package/src/router/risk-classifier.mjs +119 -0
  306. package/src/router/route-sources.mjs +364 -0
  307. package/src/scanner/chains.config.mjs +543 -0
  308. package/src/scanner/contract.mjs +270 -0
  309. package/src/scanner/evm-scanner.mjs +394 -0
  310. package/src/scanner/index.mjs +9 -0
  311. package/src/scanner/v2-venue.mjs +351 -0
  312. package/src/scanner/v3-venue.mjs +308 -0
  313. package/src/scopes.mjs +44 -0
  314. package/src/sell-simulation.mjs +167 -0
  315. package/src/signals/engine.mjs +146 -0
  316. package/src/signals/index.mjs +1 -0
  317. package/src/token-transfer-guard.mjs +188 -0
  318. package/src/tui/app.mjs +438 -0
  319. package/src/tui/backend.mjs +215 -0
  320. package/src/tui/format.mjs +272 -0
  321. package/src/tui/gateway-client.mjs +177 -0
  322. package/src/tui/input.mjs +501 -0
  323. package/src/tui/memory.mjs +105 -0
  324. package/src/tui/meta-learn.mjs +85 -0
  325. package/src/tui/renderer.mjs +443 -0
  326. package/src/tui/scheduler.mjs +205 -0
  327. package/src/tui/skills-loader.mjs +140 -0
  328. package/src/tui/standalone-client.mjs +752 -0
  329. package/src/tui/theme.mjs +81 -0
  330. package/src/vault-attestation.mjs +146 -0
  331. package/src/venues.mjs +206 -0
  332. package/src/watch-preferences.mjs +85 -0
  333. package/dist/action-receipts.mjs +0 -1
  334. package/dist/action-semantics.mjs +0 -1
  335. package/dist/address-book.mjs +0 -2
  336. package/dist/bin/desk-server.mjs +0 -59
  337. package/dist/bin/oracle-data-mcp.mjs +0 -8
  338. package/dist/bin/oracle-equities.mjs +0 -20
  339. package/dist/bin/oracle-init.mjs +0 -24
  340. package/dist/bin/oracle-public-server.mjs +0 -5
  341. package/dist/bin/oracle-route.mjs +0 -22
  342. package/dist/bin/oracle-scan.mjs +0 -18
  343. package/dist/bin/oracle-upgrade.mjs +0 -21
  344. package/dist/bin/oracle.mjs +0 -76
  345. package/dist/chains.mjs +0 -1
  346. package/dist/cli/commands/auth.mjs +0 -16
  347. package/dist/cli/commands/bootstrap.mjs +0 -18
  348. package/dist/cli/commands/chain.mjs +0 -21
  349. package/dist/cli/commands/chat.mjs +0 -45
  350. package/dist/cli/commands/credential.mjs +0 -1
  351. package/dist/cli/commands/data-mcp.mjs +0 -2
  352. package/dist/cli/commands/data.mjs +0 -12
  353. package/dist/cli/commands/doctor.mjs +0 -5
  354. package/dist/cli/commands/equities.mjs +0 -15
  355. package/dist/cli/commands/farm.mjs +0 -59
  356. package/dist/cli/commands/follow.mjs +0 -28
  357. package/dist/cli/commands/gate.mjs +0 -13
  358. package/dist/cli/commands/harness.mjs +0 -15
  359. package/dist/cli/commands/help.mjs +0 -1
  360. package/dist/cli/commands/init.mjs +0 -3
  361. package/dist/cli/commands/mcp.mjs +0 -60
  362. package/dist/cli/commands/model.mjs +0 -54
  363. package/dist/cli/commands/plugins.mjs +0 -38
  364. package/dist/cli/commands/prepare.mjs +0 -2
  365. package/dist/cli/commands/public.mjs +0 -3
  366. package/dist/cli/commands/resolve.mjs +0 -23
  367. package/dist/cli/commands/route.mjs +0 -2
  368. package/dist/cli/commands/runner.mjs +0 -1
  369. package/dist/cli/commands/scan.mjs +0 -2
  370. package/dist/cli/commands/setup.mjs +0 -34
  371. package/dist/cli/commands/sign.mjs +0 -21
  372. package/dist/cli/commands/signer.mjs +0 -1
  373. package/dist/cli/commands/swap.mjs +0 -36
  374. package/dist/cli/commands/upgrade.mjs +0 -2
  375. package/dist/cli/commands/vault.mjs +0 -1
  376. package/dist/cli/commands/version.mjs +0 -2
  377. package/dist/data/desk-data.mjs +0 -55
  378. package/dist/data/names.mjs +0 -2
  379. package/dist/data/providers/farming.mjs +0 -2
  380. package/dist/equities/index.mjs +0 -1
  381. package/dist/index.mjs +0 -60
  382. package/dist/nft-gas-war-guard.mjs +0 -1
  383. package/dist/onboarding/harness-configs.mjs +0 -4
  384. package/dist/portfolio-risk.mjs +0 -1
  385. package/dist/prepare-envelope.mjs +0 -1
  386. package/dist/public-api/agent-grants.mjs +0 -3
  387. package/dist/public-control/policy-schema.mjs +0 -1
  388. package/dist/router/index.mjs +0 -2
  389. package/dist/scanner/index.mjs +0 -4
  390. package/dist/signals/index.mjs +0 -1
  391. package/dist/watch-preferences.mjs +0 -1
  392. /package/{dist/assets/profiles → profiles}/_template/SOUL.md +0 -0
  393. /package/{dist/assets/profiles → profiles}/_template/profile.json +0 -0
  394. /package/{dist/assets/profiles → profiles}/bitcoin-agent/SOUL.md +0 -0
  395. /package/{dist/assets/profiles → profiles}/bitcoin-agent/profile.json +0 -0
  396. /package/{dist/assets/profiles → profiles}/hyperliquid-agent/SOUL.md +0 -0
  397. /package/{dist/assets/profiles → profiles}/hyperliquid-agent/profile.json +0 -0
  398. /package/{dist/assets/profiles → profiles}/oracle/profile.json +0 -0
  399. /package/{dist/assets/profiles → profiles}/polymarket-agent/SOUL.md +0 -0
  400. /package/{dist/assets/profiles → profiles}/polymarket-agent/profile.json +0 -0
  401. /package/{dist/assets/profiles → profiles}/profile.schema.json +0 -0
  402. /package/{dist/assets/profiles → profiles}/protocol-builder/SOUL.md +0 -0
  403. /package/{dist/assets/profiles → profiles}/protocol-builder/profile.json +0 -0
  404. /package/{dist/assets/profiles → profiles}/robinhood-agent/SOUL.md +0 -0
  405. /package/{dist/assets/profiles → profiles}/robinhood-agent/profile.json +0 -0
  406. /package/{dist/assets/profiles → profiles}/solana-agent/SOUL.md +0 -0
  407. /package/{dist/assets/profiles → profiles}/solana-agent/profile.json +0 -0
  408. /package/{dist/assets/profiles → profiles}/stable-agent/SOUL.md +0 -0
  409. /package/{dist/assets/profiles → profiles}/stable-agent/profile.json +0 -0
  410. /package/{dist/assets/skills → skills}/balance/SKILL.md +0 -0
  411. /package/{dist/assets/skills → skills}/bitcoin-l1.md +0 -0
  412. /package/{dist/assets/skills → skills}/chain-defi-ecosystem-profiling.md +0 -0
  413. /package/{dist/assets/skills → skills}/evm-contract-research.md +0 -0
  414. /package/{dist/assets/skills → skills}/hyperliquid.md +0 -0
  415. /package/{dist/assets/skills → skills}/multichain-exec-desk.md +0 -0
  416. /package/{dist/assets/skills → skills}/oracle-action-semantics/SKILL.md +0 -0
  417. /package/{dist/assets/skills → skills}/oracle-best-execution/SKILL.md +0 -0
  418. /package/{dist/assets/skills → skills}/oracle-best-execution.md +0 -0
  419. /package/{dist/assets/skills → skills}/oracle-bitcoin/SKILL.md +0 -0
  420. /package/{dist/assets/skills → skills}/oracle-chain-graphs-telegram-cards/SKILL.md +0 -0
  421. /package/{dist/assets/skills → skills}/oracle-chat/SKILL.md +0 -0
  422. /package/{dist/assets/skills → skills}/oracle-chat/chain.SKILL.md +0 -0
  423. /package/{dist/assets/skills → skills}/oracle-chat/setup.SKILL.md +0 -0
  424. /package/{dist/assets/skills → skills}/oracle-circuit-breaker/SKILL.md +0 -0
  425. /package/{dist/assets/skills → skills}/oracle-contract-research/SKILL.md +0 -0
  426. /package/{dist/assets/skills → skills}/oracle-desk/SKILL.md +0 -0
  427. /package/{dist/assets/skills → skills}/oracle-desk.md +0 -0
  428. /package/{dist/assets/skills → skills}/oracle-dex-launch/SKILL.md +0 -0
  429. /package/{dist/assets/skills → skills}/oracle-equities/SKILL.md +0 -0
  430. /package/{dist/assets/skills → skills}/oracle-grants/SKILL.md +0 -0
  431. /package/{dist/assets/skills → skills}/oracle-hypercore-staking/SKILL.md +0 -0
  432. /package/{dist/assets/skills → skills}/oracle-hyperliquid/SKILL.md +0 -0
  433. /package/{dist/assets/skills → skills}/oracle-meme-token-sniper/SKILL.md +0 -0
  434. /package/{dist/assets/skills → skills}/oracle-multichain-nft-launch/SKILL.md +0 -0
  435. /package/{dist/assets/skills → skills}/oracle-multichain-token-launch/SKILL.md +0 -0
  436. /package/{dist/assets/skills → skills}/oracle-nft-gacha-launch/SKILL.md +0 -0
  437. /package/{dist/assets/skills → skills}/oracle-nft-mint-gas-war/SKILL.md +0 -0
  438. /package/{dist/assets/skills → skills}/oracle-polymarket/SKILL.md +0 -0
  439. /package/{dist/assets/skills → skills}/oracle-protocol-builder/SKILL.md +0 -0
  440. /package/{dist/assets/skills → skills}/oracle-protocol-security/SKILL.md +0 -0
  441. /package/{dist/assets/skills → skills}/oracle-public-product/SKILL.md +0 -0
  442. /package/{dist/assets/skills → skills}/oracle-receipts/SKILL.md +0 -0
  443. /package/{dist/assets/skills → skills}/oracle-receipts.md +0 -0
  444. /package/{dist/assets/skills → skills}/oracle-rfq-tokenized-assets/SKILL.md +0 -0
  445. /package/{dist/assets/skills → skills}/oracle-smart-wallet-scanner/SKILL.md +0 -0
  446. /package/{dist/assets/skills → skills}/oracle-solana/SKILL.md +0 -0
  447. /package/{dist/assets/skills → skills}/oracle-solana-nft/SKILL.md +0 -0
  448. /package/{dist/assets/skills → skills}/oracle-token-research/SKILL.md +0 -0
  449. /package/{dist/assets/skills → skills}/solana.md +0 -0
@@ -1,59 +0,0 @@
1
- import{createHash as U}from"node:crypto";var j=new Set([408,425,429,500,502,503,504]),L=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),F=2,T=4e3,I=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],H=new Set([301,302,303,307,308]),M=3;function O(e){let t=String(e||"").toLowerCase();return I.includes(t)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(t)}function B(e){let t={};for(let[r,o]of Object.entries(e||{}))O(r)||(t[r]=o);return t}function V(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function W(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}var E=new Map;function q(e,t,r){let o={};for(let[a,l]of Object.entries(r||{}))o[a.toLowerCase()]=l;let n=Object.keys(o).filter(a=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(a)),i=[...new Set([...I,...n])].sort().map(a=>`${a}=${o[a]??""}`).join(`
2
- `),d=U("sha256").update(i).digest("hex").slice(0,32);return`${e} ${t} ${d}`}function z(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,T):Math.min(250*2**e,T)+Math.floor(Math.random()*100)}var G=e=>new Promise(t=>setTimeout(t,e));async function J(e,{fetchImpl:t,method:r,headers:o,body:n,timeoutMs:s}){let i=new AbortController,d=setTimeout(()=>i.abort(),s);try{let a=String(e),l={...o||{}};for(let u=0;u<=M;u+=1){let p=await t(a,{method:r,headers:l,body:n,signal:i.signal,redirect:"manual"}),h=await p.text(),m=null;if(h)try{m=JSON.parse(h)}catch{m=null}if(H.has(p.status)){if(r!=="GET"&&r!=="HEAD"){let f=new Error(`HTTP ${p.status} ${r} ${a} redirected non-idempotent request`);throw f.status=p.status,f.body=m??h.slice(0,300),f}if(u===M)throw new Error(`HTTP redirect loop for ${e}`);let c=V(p.headers?.get?.("location"),a);W(c,a)||(l=B(l)),a=c;continue}if(!p.ok){let c=new Error(`HTTP ${p.status} ${r} ${a}`);throw c.status=p.status,c.retryAfter=p.headers?.get?.("retry-after")??null,c.body=m??h.slice(0,300),c}return m??h}throw new Error(`HTTP redirect loop for ${e}`)}finally{clearTimeout(d)}}async function _(e,t={}){let r=t.fetchImpl||globalThis.fetch;if(typeof r!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let o=t.timeoutMs??12e3,n=(t.method||"GET").toUpperCase(),s={Accept:"application/json",...t.headers||{}},i=t.body;i!=null&&typeof i!="string"&&(s["Content-Type"]=s["Content-Type"]||"application/json",i=JSON.stringify(i));let d=Number.isInteger(t.retries)?Math.max(t.retries,0):F,a=async()=>{let m;for(let c=0;c<=d;c++)try{return await J(e,{fetchImpl:r,method:n,headers:s,body:i,timeoutMs:o})}catch(f){m=f;let k=f?.status,$=f?.name==="AbortError",v=new Set([408,425,429]),A=k!=null?v.has(k)||j.has(k)&&L.has(n):!$&&L.has(n);if(c===d||!A)throw f;await G(z(c,f?.retryAfter))}throw m};if(!(t.dedupe!==!1&&n==="GET"&&i==null))return a();let u=q(n,e,s),p=E.get(u);if(p)return p;let h=a().finally(()=>E.delete(u));return E.set(u,h),h}var Y="https://yields.llama.fi";async function R(e={},t={}){let r=(t.yieldsBaseUrl||process.env.DEFILLAMA_YIELDS_URL||Y).replace(/\/$/,""),o=await _(`${r}/pools`,{fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??3e4}),n=Array.isArray(o?.data)?o.data:[];e.chain&&(n=n.filter(i=>String(i.chain).toLowerCase()===String(e.chain).toLowerCase())),e.project&&(n=n.filter(i=>String(i.project).toLowerCase()===String(e.project).toLowerCase())),e.stablecoin!=null&&(n=n.filter(i=>!!i.stablecoin==!!e.stablecoin)),n.sort((i,d)=>Number(d.tvlUsd||0)-Number(i.tvlUsd||0));let s=Math.min(5e3,Math.max(1,Number(e.limit||n.length||1)));return{...o,data:n.slice(0,s)}}var x=Object.freeze([{id:"stable-loop",label:"Stablecoin loop",risk:"Conservative",targetDelta:"0.00",setup:"Supply USDC, borrow a second major stable, redeposit inside the same protocol or campaign.",exposure:"Borrow APR spike, depeg, collateral-factor change, protocol cap change.",hedge:"No perp hedge by default. Cap leverage, diversify stables, and keep unwind triggers explicit.",monitor:"Borrow APR, utilization, oracle health, depeg distance, reward dilution.",exit:"Unwind if borrow APR exceeds reward-adjusted APR or any stable trades outside the defined band."},{id:"collateral-hedge",label:"Collateral plus perp hedge",risk:"Balanced",targetDelta:"~0.00",setup:"Supply a volatile asset as collateral, borrow stables, and short the collateral notional on a liquid perp venue.",exposure:"Liquidation risk, funding cost, hedge slippage, borrow APR drift.",hedge:"Short collateral notional on a liquid perp venue; rebalance when delta drifts past the band.",monitor:"Health factor, funding, mark price, borrow APR, hedge margin.",exit:"Cut when funding turns persistently negative against the position or health factor nears the floor."},{id:"lp-hedge",label:"LP incentive hedge",risk:"Aggressive",targetDelta:"range-dependent",setup:"Provide concentrated liquidity for incentives and short the estimated volatile-token delta.",exposure:"Impermanent loss, range breaks, reward dilution, exit slippage.",hedge:"Short the estimated volatile-token delta and recompute after material price or range moves.",monitor:"Position delta, range utilization, fee APR, rewards, funding, exit slippage.",exit:"Withdraw when incentives dilute, liquidity caps fill, or expected reward no longer beats IL plus opportunity cost."},{id:"quest-farming",label:"Testnet and quest farming",risk:"Conservative",targetDelta:"n/a",setup:"Complete real protocol tasks with consistent, genuine usage from wallets you actually control.",exposure:"Eligibility rules change, sybil filters, unpaid effort, opportunity cost.",hedge:"No financial hedge. Diversify across campaigns so no single ruleset dominates the outcome.",monitor:"Campaign rules, snapshot windows, task eligibility evidence, wallet hygiene.",exit:"Stop once snapshot risk rises, campaign rules change, or the probability-adjusted expected value turns negative."},{id:"liquidity-usage",label:"Liquidity and route usage",risk:"Balanced",targetDelta:"varies",setup:"Route genuine volume and provide liquidity where usage is a stated eligibility signal.",exposure:"IL, slippage, gas burn, bridge fees, lockup discount.",hedge:"Size positions so IL and fees stay inside the modelled reward, and hedge volatile legs when material.",monitor:"Volume attribution, fee drag, reward accrual, lockup terms.",exit:"Withdraw when incentives dilute or expected reward no longer beats IL plus opportunity cost."},{id:"governance-usage",label:"Governance and ecosystem usage",risk:"Conservative",targetDelta:"n/a",setup:"Participate in governance and ecosystem surfaces where real contribution is the eligibility signal.",exposure:"Vanity activity with no eligibility weight, lock-up of governance assets.",hedge:"No financial hedge. Weight effort toward actions with documented eligibility evidence.",monitor:"Proposal participation, delegation terms, lock durations, published criteria.",exit:"Stop contributing effort once criteria change or the probability-adjusted value turns negative."}]),K={"stable-loop":"No default perp hedge. Bound leverage and monitor depeg plus borrow APR.","collateral-hedge":"Short the collateral notional on a liquid perp venue and rebalance when delta drifts.","lp-hedge":"Short the estimated volatile-token delta and recompute after material price or range moves."},X={"stable-loop":"Borrow APR, utilization, stable peg, reward dilution, health factor.","collateral-hedge":"Health factor, funding, mark price, borrow APR, hedge margin.","lp-hedge":"Position delta, range utilization, fee APR, rewards, funding, exit slippage."},Q={"stable-loop":["Prepare supply for the stable collateral leg.","Prepare borrow only after health factor and borrow APR pass the method limits.","Prepare redeposit or unwind steps as separate wallet-signed actions."],"collateral-hedge":["Prepare collateral supply after sizing liquidation buffer.","Prepare stable borrow if borrow APR remains inside the method limit.","Open or adjust the perp short on the selected hedge venue, then record hedge size."],"lp-hedge":["Prepare LP add only after checking pool depth, range, and expected position delta.","Short the estimated volatile-token delta on the selected hedge venue.","Prepare LP remove if the range breaks or net APR turns negative."]};function w(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:null}function y(e,t="unknown"){if(typeof e!="string")return t;let r=e.trim();return r===""?t:r.slice(0,96)}function Z(e){let t=y(e.symbol,"").toUpperCase(),r=y(e.exposure,"").toLowerCase(),o=w(e.apy)??0,n=w(e.tvlUsd)??0;return o<=0||n<=0?null:e.stablecoin===!0?"stable-loop":t.includes("-")||r.includes("multi")?"lp-hedge":/ETH|BTC|SOL|HYPE|BNB|AVAX|MATIC|OP|ARB/.test(t)?"collateral-hedge":null}function ee(e,t){let r=w(e.tvlUsd)??0,o=y(e.ilRisk,"").toLowerCase(),n=y(e.predictions?.predictedClass,"").toLowerCase(),s=t==="stable-loop"?3:t==="collateral-hedge"?6:9;return r<1e6?s+=6:r<1e7&&(s+=3),(o.includes("yes")||o.includes("high"))&&(s+=3),n.includes("down")&&(s+=2),Math.min(35,Math.max(0,s))}function te(e){let t=Z(e);if(!t)return null;let r=w(e.apy)??0,o=w(e.apyBase)??0,n=Math.max(0,w(e.apyReward)??Math.max(0,r-o)),s=Math.max(0,w(e.tvlUsd)??0),i=ee(e,t),d=t==="stable-loop"?4:t==="collateral-hedge"?6:0,a=t==="stable-loop"?0:t==="collateral-hedge"?4:5,l=s<5e6?1.2:.5,u=r-d-a-l-i,p=u<1?"Avoid":r>80||s<1e7?"Watchlist":u>=8?"Farmable":"Watchlist",h=y(e.project),m=y(e.symbol),c=y(e.chain);return{id:y(e.pool,`${c}:${h}:${m}`),recipe:t,label:`${h} ${m}`,chain:c,project:h,symbol:m,tvlUsd:s,rewardApr:n,nativeApr:o,estimatedBorrowApr:d,estimatedFundingApr:a,gasApr:l,riskHaircut:i,netApr:u,verdict:p,exposure:y(e.exposure,t==="stable-loop"?"stablecoin":t==="lp-hedge"?"multi-asset LP":"single-asset collateral"),hedge:K[t],monitor:X[t],prepareSteps:[`Verify ${h} contracts and reward terms on ${c}.`,"Set wallet grant with chain, protocol, max value, slippage, and TTL before preparing any transaction.",...Q[t]],source:"DeFiLlama yields"}}async function C(e={},t={}){let r=Math.min(24,Math.max(3,Number(e.limit??12)||12)),o=Number(e.minTvl??2e6),n=new Date().toISOString(),s="read-only discovery and prepare-plan design; no signing or broadcast";try{let i=await R({chain:e.chain&&e.chain!=="all"?e.chain:void 0,limit:5e3},t),d=Array.isArray(i?.data)?i.data:[],a=d.map(te).filter(l=>l!==null).filter(l=>l.tvlUsd>=o).filter(l=>l.rewardApr+l.nativeApr<=300).sort((l,u)=>u.netApr-l.netApr||u.tvlUsd-l.tvlUsd).slice(0,r);return{configured:!0,live:!0,source:"DeFiLlama yields",generatedAt:n,chain:e.chain??"all",considered:d.length,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",candidates:a,posture:s}}catch(i){return{configured:!1,live:!1,source:"DeFiLlama yields",generatedAt:n,chain:e.chain??"all",considered:0,consideredNote:"deepest pools by TVL from the DeFiLlama yields feed",error:String(i?.message||i),candidates:[],posture:s}}}function g(e,t,r,o){let n=typeof e=="number"?e:Number(e);return Number.isFinite(n)?Math.min(o,Math.max(r,n)):t}function D(e={}){let t=g(e.wallets,5,1,500),r=g(e.tasksWeekly,6,0,500),o=g(e.hoursWeekly,4,0,168),n=g(e.hourlyCost,25,0,1e4),s=g(e.gasPerTask,.4,0,1e4),i=g(e.bridgeMonthly,12,0,1e5),d=g(e.expectedReward,900,0,1e7),a=g(e.probability,22,0,100)/100,l=g(e.sybilHaircut,25,0,100)/100,u=g(e.lockupMonths,6,0,120),p=r*t*4.33,h=p*s,m=o*4.33*n,c=h+m+i,f=Math.max(0,1-u*.015),k=t*d*a,$=k*(1-l)*f,v=$-c,A=c>0?v/c*100:null,N=t*d>0?c/(t*d*(1-l)*(f||1))*100:null;return{inputs:{wallets:t,tasksWeekly:r,hoursWeekly:o,hourlyCost:n,gasPerTask:s,bridgeMonthly:i,expectedReward:d,probabilityPct:a*100,sybilHaircutPct:l*100,lockupMonths:u},monthlyTasks:p,monthlyGas:h,laborMonthly:m,monthlyCost:c,lockupDiscount:f,grossExpectedValue:k,adjustedExpectedValue:$,netExpectedValue:v,roiPct:A,breakevenProbabilityPct:N,verdict:v>0?"positive-ev":"negative-ev",posture:"estimate on your own inputs; not a payout promise and not financial advice"}}var P=`oracle farm <methods|discover|airdrop> [options]
3
-
4
- oracle farm methods list the delta-aware farming playbooks
5
- oracle farm methods --id stable-loop full setup/exposure/hedge/monitor/exit for one method
6
- oracle farm discover [--chain base] rank live pools by net APR after costs and risk haircut
7
- [--limit 12] [--min-tvl 2000000] [--json]
8
- oracle farm airdrop [--wallets 5] [--tasks-weekly 6] [--hours-weekly 4]
9
- [--hourly-cost 25] [--gas-per-task 0.4] [--bridge-monthly 12]
10
- [--expected-reward 900] [--probability 22]
11
- [--sybil-haircut 25] [--lockup-months 6] [--json]
12
-
13
- Read-only. Ranks opportunities and designs prepare plans; never signs or broadcasts.`;function re(e){let t={_:[]};for(let r=0;r<e.length;r+=1){let o=e[r];if(o==="--json"){t.json=!0;continue}if(o.startsWith("--")){let n=o.slice(2),s=e[r+1];if(s===void 0||s.startsWith("--")){t[n]=!0;continue}t[n]=s,r+=1;continue}t._.push(o)}return t}var b=e=>`$${Math.round(Number(e)||0).toLocaleString("en-US")}`,S=e=>`${(Number(e)||0).toFixed(1)}%`;function oe(e){let t=typeof e.id=="string"?e.id:null;if(t){let r=x.find(o=>o.id===t);if(!r)return process.stderr.write(`oracle farm: unknown method '${t}'. Known: ${x.map(o=>o.id).join(", ")}
14
- `),1;if(e.json)return process.stdout.write(JSON.stringify(r,null,2)+`
15
- `),0;process.stdout.write(`
16
- ${r.label} [${r.risk}] target delta ${r.targetDelta}
17
-
18
- `);for(let[o,n]of[["setup","setup"],["exposure","exposure"],["hedge","hedge"],["monitor","monitor"],["exit","exit"]])process.stdout.write(` ${o.padEnd(9)} ${r[n]}
19
- `);return process.stdout.write(`
20
- `),0}if(e.json)return process.stdout.write(JSON.stringify(x,null,2)+`
21
- `),0;process.stdout.write(`
22
- farming methods
23
-
24
- `);for(let r of x)process.stdout.write(` ${r.id.padEnd(18)} ${r.label.padEnd(30)} ${r.risk}
25
- `);return process.stdout.write(`
26
- oracle farm methods --id <id> for setup, exposure, hedge, monitor, and exit rules.
27
-
28
- `),0}async function ne(e){let t=await C({chain:typeof e.chain=="string"?e.chain:null,limit:e.limit,minTvl:e["min-tvl"]});if(e.json)return process.stdout.write(JSON.stringify(t,null,2)+`
29
- `),0;if(!t.live)return process.stderr.write(`oracle farm: discovery unavailable \u2014 ${t.error}
30
- `),1;process.stdout.write(`
31
- live farm discovery \u2014 ${t.source}, ${t.considered.toLocaleString("en-US")} pools considered (${t.consideredNote}), chain=${t.chain}
32
-
33
- `),process.stdout.write(` ${"verdict".padEnd(10)}${"net apr".padStart(9)} ${"tvl".padStart(12)} ${"chain".padEnd(12)}${"recipe".padEnd(18)}pool
34
- `);for(let r of t.candidates)process.stdout.write(` ${r.verdict.padEnd(10)}${S(r.netApr).padStart(9)} ${b(r.tvlUsd).padStart(12)} ${r.chain.slice(0,11).padEnd(12)}${r.recipe.padEnd(18)}${r.label}
35
- `);return process.stdout.write(`
36
- net apr = apy \u2212 borrow \u2212 funding \u2212 gas \u2212 risk haircut.
37
- ${t.posture}.
38
-
39
- `),0}function ie(e){let t=D({wallets:e.wallets,tasksWeekly:e["tasks-weekly"],hoursWeekly:e["hours-weekly"],hourlyCost:e["hourly-cost"],gasPerTask:e["gas-per-task"],bridgeMonthly:e["bridge-monthly"],expectedReward:e["expected-reward"],probability:e.probability,sybilHaircut:e["sybil-haircut"],lockupMonths:e["lockup-months"]});if(e.json)return process.stdout.write(JSON.stringify(t,null,2)+`
40
- `),0;let r=t.inputs;return process.stdout.write(`
41
- airdrop expected value
42
-
43
- `),process.stdout.write(` ${r.wallets} wallets \xB7 ${r.tasksWeekly} tasks/wk \xB7 ${r.hoursWeekly} hrs/wk @ ${b(r.hourlyCost)}/hr
44
- `),process.stdout.write(` ${S(r.probabilityPct)} eligibility \xB7 ${S(r.sybilHaircutPct)} sybil haircut \xB7 ${r.lockupMonths}mo lockup
45
-
46
- `),process.stdout.write(` monthly cost ${b(t.monthlyCost).padStart(12)} (gas ${b(t.monthlyGas)} + labor ${b(t.laborMonthly)} + bridges ${b(r.bridgeMonthly)})
47
- `),process.stdout.write(` gross EV ${b(t.grossExpectedValue).padStart(12)}
48
- `),process.stdout.write(` after haircuts ${b(t.adjustedExpectedValue).padStart(12)} (lockup discount ${(t.lockupDiscount*100).toFixed(0)}%)
49
- `),process.stdout.write(` net EV ${b(t.netExpectedValue).padStart(12)} ${t.verdict}
50
- `),t.roiPct!=null&&process.stdout.write(` ROI ${S(t.roiPct).padStart(12)}
51
- `),t.breakevenProbabilityPct!=null&&process.stdout.write(` breakeven odds ${S(t.breakevenProbabilityPct).padStart(12)} campaign must clear this to profit
52
- `),process.stdout.write(`
53
- ${t.posture}.
54
-
55
- `),0}var he={name:"farm",summary:"farming methods, live farm discovery, airdrop EV",group:"read",usage:P,async run(e){let t=re(e.argv),r=t._[0];return!r||r==="help"?(process.stdout.write(P+`
56
- `),0):r==="methods"?oe(t):r==="discover"?ne(t):r==="airdrop"?ie(t):(process.stderr.write(`oracle farm: unknown subcommand '${r}'
57
-
58
- ${P}
59
- `),1)}};export{he as default};
@@ -1,28 +0,0 @@
1
- var G="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",H={1:["https://mainnet.gateway.tenderly.co","https://eth.drpc.org","https://rpc.flashbots.net"],8453:["https://base.gateway.tenderly.co","https://mainnet.base.org","https://base.drpc.org"],42161:["https://arbitrum.gateway.tenderly.co","https://arb1.arbitrum.io/rpc","https://arbitrum.drpc.org"]},yt=1e4,gt=t=>new Promise(e=>setTimeout(e,t)),Y=t=>"0x"+BigInt(t).toString(16),Et=t=>"0x"+"0".repeat(24)+t.slice(2).toLowerCase(),J=t=>"0x"+t.slice(26).toLowerCase(),xt=/timeout|timed out|too many requests|rate.?limit|429|502|503|504|internal error|temporarily|aborted|fetch failed|ECONNRESET|socket hang up/i,St=/too many|exceeds|limited to|not supported on free plan|response too large|range must not exceed|narrow your filter/i,E=class extends Error{constructor(e,{transient:n=!1,tooBig:r=!1,http:s=0}={}){super(e),this.transient=n,this.tooBig=r,this.http=s}};async function kt(t,e,n,r){let s=new AbortController,i=setTimeout(()=>s.abort(),r),a,c;try{a=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:n}),signal:s.signal}),c=await a.text()}catch(l){throw new E(`${e} network: ${l.message}`,{transient:!0})}finally{clearTimeout(i)}let o;try{o=JSON.parse(c)}catch{throw new E(`${e} non-JSON http=${a.status}: ${c.slice(0,80)}`,{transient:a.status>=500||a.status===429,http:a.status})}if(o.error){let l=o.error.message||"rpc error";throw new E(`${e} rpc: ${l}`,{transient:xt.test(l),tooBig:St.test(l),http:a.status})}if(a.status!==200)throw new E(`${e} http=${a.status}: ${c.slice(0,80)}`,{transient:a.status>=500||a.status===429,http:a.status});return o.result}async function q(t,e,n,{retries:r,timeoutMs:s,onWarn:i}){let a;for(let c of t){for(let o=0;o<=r;o++)try{return{result:await kt(c,e,n,s),url:c}}catch(l){if(a=l,l.tooBig)throw l;if(!l.transient||o===r)break;let f=Math.min(2e3*2**o,8e3)+Math.random()*250;i?.(`retry ${c} (${l.message.slice(0,70)}) in ${Math.round(f)}ms`),await gt(f)}i?.(`endpoint exhausted: ${c} -> ${a?.message.slice(0,70)}`)}throw a??new E("no endpoints available")}async function P(t,e,n,r,s,i){let a=[{...e,fromBlock:Y(n),toBlock:Y(r)}];try{let{result:o}=await q(t,"eth_getLogs",a,s);Array.isArray(o)&&i.push(...o);return}catch(o){if(!o.tooBig||r<=n)throw o;s.onWarn?.(`splitting ${n}-${r} (${o.message.slice(0,60)})`)}let c=n+Math.floor((r-n)/2);await P(t,e,n,c,s,i),await P(t,e,c+1,r,s,i)}async function K(t,e={}){if(!/^0x[0-9a-fA-F]{40}$/.test(t||""))throw new Error(`invalid address: ${t}`);let{chains:n=[1,8453,42161],lookback:r=1e5,fromBlock:s,toBlock:i,chunkSize:a=yt,tokens:c,direction:o="both",retries:l=3,timeoutMs:f=2e4,concurrency:u=4,endpoints:m=H,onWarn:d}=e,p={retries:l,timeoutMs:f,onWarn:d},b=Et(t),y=[],k=[],T={},N=new Set;return await Promise.all(n.map(async w=>{let R=m[w];if(!R?.length){k.push({chainId:w,stage:"config",error:"no endpoints configured"});return}try{let _=i;if(_==null){let{result:h}=await q(R,"eth_blockNumber",[],p);_=parseInt(h,16)}let $=Math.max(0,s??_-r+1),v=Math.max($,_);T[w]={fromBlock:$,toBlock:v,blocks:v-$+1};let j=[];for(let h=$;h<=v;h+=a)j.push([h,Math.min(h+a-1,v)]);let B=[],V=c?.length?{address:c}:{};(o==="in"||o==="both")&&B.push({...V,topics:[G,null,b]}),(o==="out"||o==="both")&&B.push({...V,topics:[G,b,null]});let I=[];for(let h of B)for(let g of j)I.push([h,g]);let z=[],W=0,bt=Array.from({length:Math.min(u,I.length)},async()=>{for(;W<I.length;){let[h,[g,A]]=I[W++];try{await P(R,h,g,A,p,z)}catch(wt){k.push({chainId:w,stage:"getLogs",range:[g,A],error:wt.message})}}});await Promise.all(bt);for(let h of z){if(!h?.topics||h.topics.length<3)continue;let g=parseInt(h.logIndex,16),A=`${w}|${h.transactionHash}|${g}`;N.has(A)||(N.add(A),y.push({chainId:w,token:h.address.toLowerCase(),from:J(h.topics[1]),to:J(h.topics[2]),value:BigInt(h.data==="0x"?"0x0":h.data).toString(),blockNumber:parseInt(h.blockNumber,16),txHash:h.transactionHash,logIndex:g}))}}catch(_){k.push({chainId:w,stage:"range",error:_.message})}})),y.sort((w,R)=>R.blockNumber-w.blockNumber||R.logIndex-w.logIndex),{events:y,errors:k,ranges:T}}import{keccak_256 as M}from"@noble/hashes/sha3.js";import{createHash as Rt}from"node:crypto";var _t=new Set([408,425,429,500,502,503,504]),X=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),At=2,Z=4e3,tt=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Ct=new Set([301,302,303,307,308]),Q=3;function Tt(t){let e=String(t||"").toLowerCase();return tt.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function Nt(t){let e={};for(let[n,r]of Object.entries(t||{}))Tt(n)||(e[n]=r);return e}function $t(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let n=new URL(String(t),String(e));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${n.protocol}`);return n.toString()}function vt(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var O=new Map;function It(t,e,n){let r={};for(let[o,l]of Object.entries(n||{}))r[o.toLowerCase()]=l;let s=Object.keys(r).filter(o=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(o)),a=[...new Set([...tt,...s])].sort().map(o=>`${o}=${r[o]??""}`).join(`
2
- `),c=Rt("sha256").update(a).digest("hex").slice(0,32);return`${t} ${e} ${c}`}function Lt(t,e){let n=Number(e);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Z):Math.min(250*2**t,Z)+Math.floor(Math.random()*100)}var Bt=t=>new Promise(e=>setTimeout(e,t));async function Pt(t,{fetchImpl:e,method:n,headers:r,body:s,timeoutMs:i}){let a=new AbortController,c=setTimeout(()=>a.abort(),i);try{let o=String(t),l={...r||{}};for(let f=0;f<=Q;f+=1){let u=await e(o,{method:n,headers:l,body:s,signal:a.signal,redirect:"manual"}),m=await u.text(),d=null;if(m)try{d=JSON.parse(m)}catch{d=null}if(Ct.has(u.status)){if(n!=="GET"&&n!=="HEAD"){let b=new Error(`HTTP ${u.status} ${n} ${o} redirected non-idempotent request`);throw b.status=u.status,b.body=d??m.slice(0,300),b}if(f===Q)throw new Error(`HTTP redirect loop for ${t}`);let p=$t(u.headers?.get?.("location"),o);vt(p,o)||(l=Nt(l)),o=p;continue}if(!u.ok){let p=new Error(`HTTP ${u.status} ${n} ${o}`);throw p.status=u.status,p.retryAfter=u.headers?.get?.("retry-after")??null,p.body=d??m.slice(0,300),p}return d??m}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(c)}}async function et(t,e={}){let n=e.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=e.timeoutMs??12e3,s=(e.method||"GET").toUpperCase(),i={Accept:"application/json",...e.headers||{}},a=e.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let c=Number.isInteger(e.retries)?Math.max(e.retries,0):At,o=async()=>{let d;for(let p=0;p<=c;p++)try{return await Pt(t,{fetchImpl:n,method:s,headers:i,body:a,timeoutMs:r})}catch(b){d=b;let y=b?.status,k=b?.name==="AbortError",T=new Set([408,425,429]),N=y!=null?T.has(y)||_t.has(y)&&X.has(s):!k&&X.has(s);if(p===c||!N)throw b;await Bt(Lt(p,b?.retryAfter))}throw d};if(!(e.dedupe!==!1&&s==="GET"&&a==null))return o();let f=It(s,t,i),u=O.get(f);if(u)return u;let m=o().finally(()=>O.delete(f));return O.set(f,m),m}var nt={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Ht=new Map(Object.values(nt).map(t=>[t.chainId,t]));function rt(t){return Ht.get(Number(t))||null}function ot(t,e=process.env){let n=rt(t);if(!n)return null;for(let r of n.rpcEnv){let s=(e[r]||"").trim();if(s)return s}return null}import{Interface as Ot,getAddress as ue}from"ethers";var de=new Ot(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Mt={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function Ut(t,{rpcUrl:e,env:n=process.env}={}){if(e)return e;let r=ot(t,n);return r||Mt[Number(t)]||null}var Dt=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Ft(t){let e=String(t||""),n=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!Dt.test(n))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function st(t,e,n=[],r={}){let s=String(e||"");Ft(s);let i=Ut(t,r);if(!i)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let c=await et(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(c?.error){let o=new Error(c.error.message||JSON.stringify(c.error));throw o.code=c.error.code,o}return c.result}var D=999,U=1,jt=8453,at="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",Vt="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",ct="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",zt="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Wt=".80002105.reverse",it=/^0x[a-fA-F0-9]{40}$/,lt=new TextEncoder,ut=t=>"0x"+Buffer.from(t).toString("hex"),x=t=>ut(M(lt.encode(t))).slice(0,10),dt=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function L(t){let e=new Uint8Array(32);if(t)for(let n of String(t).split(".").reverse()){let r=M(lt.encode(n)),s=new Uint8Array(64);s.set(e,0),s.set(r,32),e=M(s)}return ut(e)}function F(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),n=parseInt(e.slice(0,64),16)*2,r=parseInt(e.slice(n,n+64),16);if(!Number.isFinite(r)||r<=0)return"";let s=e.slice(n+64,n+64+r*2);return Buffer.from(s,"hex").toString("utf8")}catch{return""}}async function S(t,e,n){try{return await st(t,"eth_call",[{to:e,data:n},"latest"])}catch{return null}}async function Gt(t){let e=await S(D,at,x("primaryName(address)")+dt(t)),n=F(e);return n?n.endsWith(".hl")?n:`${n}.hl`:null}async function Yt(t){let e=await S(D,Vt,x("getName(address)")+dt(t)),n=F(e);return n?n.endsWith(".hype")?n:`${n}.hype`:null}async function ht(t,e,n){let r=await S(t,n,x("name(bytes32)")+e.slice(2));return F(r)||null}async function Jt(t){let e=L(`${t.slice(2).toLowerCase()}.addr.reverse`),n=await S(U,ct,x("resolver(bytes32)")+e.slice(2));if(!n)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:ht(U,e,r)}async function qt(t){let e=L(t.slice(2).toLowerCase()+Wt);return ht(jt,e,zt)}var Kt=[{source:"hl",fn:Gt},{source:"hype",fn:Yt},{source:"ens",fn:Jt},{source:"basename",fn:qt}];async function Xt(t){let e=L(t),n=await S(D,at,x("ownerOf(uint256)")+e.slice(2));if(!n||n.length<66)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:r}async function Zt(t,e,n){let r=L(e),s=await S(t,n,x("resolver(bytes32)")+r.slice(2));if(!s)return null;let i="0x"+s.slice(-40);if(/^0x0+$/.test(i))return null;let a=await S(t,i,x("addr(bytes32)")+r.slice(2));if(!a)return null;let c="0x"+a.slice(-40);return/^0x0+$/.test(c)?null:c}async function pt(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let n=await Xt(e);return n?{address:n,source:"hl",name:e}:null}if(e.endsWith(".eth")){let n=await Zt(U,e,ct);return n?{address:n,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var me=Kt.map(t=>t.source);var C={1:"ethereum",8453:"base",42161:"arbitrum"},Qt=Object.fromEntries(Object.entries(C).map(([t,e])=>[e,Number(t)])),mt=`oracle follow <name-or-address> [--chain <name>] [--blocks <n>] [--json]
3
-
4
- oracle follow vitalik.eth
5
- oracle follow demi.hl --chain base
6
- oracle follow 0x4d47b6757afd42c3dbd9691b71b43d74afa4b6b2 --blocks 20000 --json
7
-
8
- Reads ERC20 transfer activity for a wallet. Read-only: this calls
9
- eth_getLogs and eth_blockNumber and nothing else, so it can never move funds.
10
-
11
- Chains: ${Object.values(C).join(", ")}. Default: ethereum.
12
- Lookback defaults to 40000 blocks. Endpoints are keyless.
13
-
14
- Note publicnode-class RPCs are deliberately excluded: they retain only ~128
15
- blocks, so they return an empty result instead of an error.`;function ft(t,e){let n=t.indexOf(e);return n>=0?t[n+1]:void 0}function te(t){let e=String(t??"");return e.length>22?`${e.slice(0,19)}...`:e}async function ee(t=[]){let e=t.includes("--json"),n=[];for(let o=0;o<t.length;o+=1){let l=t[o];if(l!=="--json"){if(l==="--chain"||l==="--blocks"){o+=1;continue}n.push(l)}}let r=(n[0]||"").trim();if(!r||r==="--help"||r==="-h")return process.stdout.write(`${mt}
16
- `),r?0:1;let s=(ft(t,"--chain")||"ethereum").toLowerCase(),i=Qt[s]??Number(s);if(!H[i])return process.stderr.write(`follow: unsupported chain "${s}". Supported: ${Object.values(C).join(", ")}
17
- `),1;let a=ft(t,"--blocks"),c=a?Number(a):4e4;if(!Number.isFinite(c)||c<=0)return process.stderr.write(`follow: --blocks must be a positive number, got "${a}"
18
- `),1;try{let o=r,l=null;if(!it.test(r)){let d=await pt(r);if(!d?.address)return process.stderr.write(`follow: could not resolve "${r}" to an address
19
- `),1;o=d.address,l=r}let f=await K(o,{chains:[i],lookback:c,onWarn:e?void 0:d=>process.stderr.write(` warn: ${d}
20
- `)}),u=f.events||[];if(e)return process.stdout.write(`${JSON.stringify({address:o,resolvedFrom:l,chain:C[i]||String(i),lookbackBlocks:c,count:u.length,errors:f.errors||[],events:u})}
21
- `),0;let m=l?`${l} ${o}`:o;process.stdout.write(`${m}
22
- `),process.stdout.write(` ${C[i]||i} \xB7 last ${c} blocks \xB7 ${u.length} transfer${u.length===1?"":"s"}
23
- `),u.length||process.stdout.write(` no ERC20 transfers in this window
24
- `);for(let d of u.slice(0,25)){let p=d.to?.toLowerCase()===o.toLowerCase()?"in ":"out";process.stdout.write(` ${p} blk ${d.blockNumber} token ${d.token} ${te(d.value)}
25
- `)}u.length>25&&process.stdout.write(` ... ${u.length-25} more (use --json for all)
26
- `);for(let d of f.errors||[])process.stderr.write(` error: ${d.stage||"rpc"}: ${d.error}
27
- `);return 0}catch(o){return process.stderr.write(`follow failed: ${o?.message||o}
28
- `),1}}var ge={name:"follow",summary:"read a wallet's recent ERC20 transfer activity",group:"read",usage:mt,async run(t){return ee(t.argv||[])}};export{ge as default};
@@ -1,13 +0,0 @@
1
- import{readFileSync as v,existsSync as D}from"node:fs";import{Contract as O,JsonRpcProvider as A,verifyMessage as R}from"ethers";var l="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",p=999,y="https://rpc.hyperliquid.xyz/evm",E=["function balanceOf(address owner) view returns (uint256)"],I=300*1e3,$=720*60*1e3,S=/^0x[a-fA-F0-9]{40}$/;function f(r){return S.test(String(r||""))}async function d(r,{contract:n=l,rpc:t=y,chainId:o=p}={}){let a=new A(t,o,{staticNetwork:!0}),s=new O(n,E,a);return BigInt(await s.balanceOf(r))}import w from"node:os";import i from"node:path";import{fileURLToPath as C}from"node:url";var L=i.dirname(C(import.meta.url)),H=i.resolve(L,"../..");function h(){return process.env.ORACLE_FAKE_HOME||w.homedir()}function _(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function b(){return _()?process.env.ORACLE_CONFIG_DIR||i.join(h(),".config","oracle"):i.join(h(),".config","oracle")}function g(){return i.join(b(),"exec.env")}var x=`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=g()){if(!D(r))return null;try{let n=v(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 a=o[1].trim().replace(/^["']|["']$/g,"");if(f(a))return a}}catch{return null}return null}function e(r,n){r.write(n+`
13
- `)}async function j(r=[],n={}){let t=n.out??process.stdout,o=n.err??process.stderr,a=n.balanceOf??d,s=r[0];if(!s||s==="--help"||s==="-h"||s==="help")return e(t,x),0;if(s==="info")return e(t,`contract: ${l}`),e(t,`chain: HyperEVM (${p})`),e(t,"token: Locals Only (LOCALS)"),0;let c;if(s==="status"){if(c=n.agentAddress?n.agentAddress():k(),!c)return e(o,"no agent wallet configured (ORACLE_EVM_ADDRESS not set)"),e(o,"run: oracle init"),1}else if(s==="check"){if(c=r[1],!f(c))return e(o,"usage: oracle gate check <0x address>"),2}else return e(o,`oracle gate: unknown subcommand '${s}'`),2;let u;try{u=await a(c)}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: ${c}`),0):(e(t,"holder: no"),e(t,`wallet: ${c}`),e(t,""),e(t,"Oracle access requires a Locals Only NFT on HyperEVM."),e(t,`contract: ${l}`),4)}var z="check Locals Only holder access for a wallet",J={name:"gate",summary:"check Locals Only holder access for a wallet",group:"read",usage:x,async run(r){return j(r.argv??[])}};export{k as agentAddress,J as default,z as help,j as run};
@@ -1,15 +0,0 @@
1
- import l from"node:fs";import i from"node:path";var E=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"}}),h=Object.freeze({"anthropic-oauth":{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-20250514",protocol:"anthropic-messages"},"openai-codex":{key:"OPENAI_API_KEY",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.4",protocol:"responses"},"xai-oauth":{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest",protocol:"responses"}});var u=Object.freeze([{name:"oracle",bin:"oracle",label:"Oracle Native (default)",kind:"oracle"},{name:"hermes",bin:"hermes",label:"Hermes Agent",kind:"hermes"},{name:"opencode",bin:"opencode",label:"OpenCode",kind:"mcp"},{name:"claude",bin:"claude",label:"Claude Code",kind:"mcp"},{name:"codex",bin:"codex",label:"OpenAI Codex CLI",kind:"mcp"},{name:"cursor",bin:"cursor",label:"Cursor IDE",kind:"mcp"},{name:"windsurf",bin:"windsurf",label:"Windsurf",kind:"mcp"},{name:"aider",bin:"aider",label:"Aider",kind:"mcp"},{name:"continue",bin:"continue",label:"Continue",kind:"mcp"}]);function d(n){for(let t of(process.env.PATH||"").split(i.delimiter)){let e=i.join(t,n);try{if(l.existsSync(e))return e}catch{}}return null}function c(){let n=[];for(let t of u){if(t.name==="oracle"){n.push({...t,path:process.argv[1]||"oracle"});continue}let e=d(t.bin);e&&n.push({...t,path:e})}return n}function s(){return["oracle harness \u2014 detect installed agent harnesses",""," oracle harness detect scan PATH for Agent Plugins-compatible clients","","Oracle runs natively. If you prefer a different harness,","set ORACLE_CHAT_BACKEND=<name>.","","Detected: opencode, claude, codex, cursor, windsurf, aider, continue, hermes"].join(`
2
- `)}var b={name:"harness",summary:"detect installed agent harnesses",usage:s,async main(n,t){let e=n[0];if(e==="help"||e==="--help"||e==="-h")return process.stdout.write(s()+`
3
- `),0;if(e&&e!=="detect"&&e!=="list")return process.stderr.write(`oracle harness: unknown subcommand '${e}'
4
- `),process.stderr.write(s()+`
5
- `),1;let o=c();if(o.length===0)return process.stderr.write(`No agent harnesses detected on PATH.
6
- `),process.stderr.write(`Oracle runs natively \u2014 no external agent required.
7
- `),0;let p=o.find(r=>r.kind==="oracle"),a=o.filter(r=>r.kind!=="oracle");process.stdout.write(`
8
- Oracle native chat: default
9
-
10
- `),process.stdout.write(`Installed harnesses:
11
- `);for(let r of a)process.stdout.write(` ${r.label.padEnd(22)} ${r.path}
12
- `);return a.length===0&&process.stdout.write(` (none \u2014 Oracle runs standalone)
13
- `),process.stdout.write(`
14
- Set ORACLE_CHAT_BACKEND=<name> to use a different harness.
15
- `),0}};export{b as default};
@@ -1 +0,0 @@
1
- var e={name:"help",summary:"show command help",group:"meta",usage:"oracle help [noun]",async run(){return 0}};export{e as default};
@@ -1,3 +0,0 @@
1
- import{spawnSync as i}from"node:child_process";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 o(){return["","Next:",...n.map(t=>" "+t),""].join(`
2
- `)}var d={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=t.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 a=typeof e.status=="number"?e.status:1;return a===0&&r.includes("--apply")&&!r.includes("--json")&&process.stdout.write(o()),a}};export{d as default};
@@ -1,60 +0,0 @@
1
- import{parseArgs as Oe}from"node:util";import G from"node:path";import{fileURLToPath as oe}from"node:url";var se=G.dirname(oe(import.meta.url)),Ae=G.resolve(se,"../.."),$e=Object.freeze(["oracle-vault","oracle-credential","oracle-signer","oracle-runner","oracle-agentic-init","oracle-agentic-doctor","oracle-control-mcp","oracle-operator-caps"]),Ne=Object.freeze(["vault","credential","signer","runner","sign"]),B=`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 O(e=process.stderr){e.write(B),B.endsWith(`
9
- `)||e.write(`
10
- `)}import{spawnSync as W}from"node:child_process";import q from"node:path";import k from"node:fs";import y from"node:path";import pe from"node:os";import ie from"node:fs";import C from"node:path";import{fileURLToPath as ce}from"node:url";var ae=C.dirname(ce(import.meta.url)),v=C.resolve(ae,"../..");function _(e){let t=[C.join(v,"bin",e),C.join(v,"dist","bin",e),C.join(v,"..","bin",e)];return t.find(n=>ie.existsSync(n))||t[0]}function m(){return process.env.ORACLE_FAKE_HOME||pe.homedir()}function g({oracleRoot:e=v,operator:t=null,withControl:n=!1}={}){let r={"oracle-data":{command:"node",args:[e===v?_("oracle-data-mcp.mjs"):[y.join(e,"bin","oracle-data-mcp.mjs"),y.join(e,"dist","bin","oracle-data-mcp.mjs")].find(s=>k.existsSync(s))||y.join(e,"bin","oracle-data-mcp.mjs")]}};if(n){if(!t||!t.ok)return{ok:!1,reason:"operator-missing"};let s=t.bins?.["oracle-control-mcp"]||t.controlMcp||null;if(!s)return{ok:!1,reason:"control-bin-missing"};r["oracle-control"]={command:"node",args:[s]};let o=e===v?_("oracle-exec-mcp.mjs"):[y.join(e,"bin","oracle-exec-mcp.mjs"),y.join(e,"dist","bin","oracle-exec-mcp.mjs")].find(a=>k.existsSync(a))||y.join(e,"bin","oracle-exec-mcp.mjs");k.existsSync(o)&&(r["oracle-exec"]={command:"node",args:[o]})}return{ok:!0,specs:r}}function h(e){if(!k.existsSync(e))return null;let t=`${e}.bak-oracle-${Math.floor(Date.now()/1e3)}`;return k.copyFileSync(e,t),t}function R(e,t={}){return k.existsSync(e)?JSON.parse(k.readFileSync(e,"utf8")):structuredClone(t)}function T(e,t){k.mkdirSync(y.dirname(e),{recursive:!0}),k.writeFileSync(e,JSON.stringify(t,null,2)+`
11
- `)}function b(e,t){let n=R(e,{});(!n.mcpServers||typeof n.mcpServers!="object")&&(n.mcpServers={});let i=!1;for(let[s,o]of Object.entries(t)){let a=n.mcpServers[s];a&&JSON.stringify(a)===JSON.stringify(o)||(n.mcpServers[s]=o,i=!0)}if(!i)return{status:"present",backup:null};let r=h(e);return T(e,n),{status:"written",backup:r}}function d(e,t={}){return{status:e,...t}}function ue(){return q.join(m(),".claude.json")}function le(e){return q.join(e||process.cwd(),".mcp.json")}function fe(e,t){let n=W("claude",["--version"],{encoding:"utf8",timeout:1e4});if(n.error||n.status!==0)return null;let i=W("claude",["mcp","add-json",e,JSON.stringify(t),"--scope","user"],{encoding:"utf8",timeout:3e4});return i.status!==0?{ok:!1,stderr:i.stderr||i.stdout||"failed"}:{ok:!0}}async function K({oracleRoot:e,operator:t,withControl:n=!1,project:i=!1,printOnly:r=!1,cwd:s=process.cwd()}){let o=g({oracleRoot:e,operator:t,withControl:n});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(r)return{ok:!0,print:{mcpServers:o.specs}};if(i){let c=le(s),l=b(c,o.specs);return{ok:!0,...d(l.status,{path:c,backup:l.backup})}}let a=!1;for(let[c,l]of Object.entries(o.specs)){let p=fe(c,l);if(p&&p.ok){a=!0;continue}break}if(a)return{ok:!0,...d("written",{method:"claude-cli"})};let f=ue(),u=b(f,o.specs);return{ok:!0,...d(u.status,{path:f,backup:u.backup})}}import de from"node:fs";import I from"node:path";function me(){return process.platform==="darwin"?I.join(m(),"Library","Application Support","Claude","claude_desktop_config.json"):I.join(m(),".config","Claude","claude_desktop_config.json")}async function J({oracleRoot:e,operator:t,withControl:n=!1,printOnly:i=!1}){let r=g({oracleRoot:e,operator:t,withControl:n});if(!r.ok)return{ok:!1,code:3,reason:r.reason};let s=me(),o={mcpServers:r.specs};if(i)return{ok:!0,print:o};let a=I.dirname(s);if(!de.existsSync(a))return{ok:!0,status:"printed (Claude Desktop not detected)",path:s,print:o};let f=b(s,r.specs);return{ok:!0,...d(f.status,{path:s,backup:f.backup})}}import E from"node:fs";import V from"node:path";var z="# oracle-mcp-install begin",Y="# oracle-mcp-install end";function ge(){return V.join(m(),".codex","config.toml")}function ke(e){let t=[z];for(let[n,i]of Object.entries(e))t.push(`[mcp_servers.${n}]`),t.push(`command = ${JSON.stringify(i.command)}`),t.push(`args = [${i.args.map(r=>JSON.stringify(r)).join(", ")}]`),t.push("");return t.push(Y),t.join(`
12
- `)+`
13
- `}function he(e){return e.replace(new RegExp(`${z}[\\s\\S]*?${Y}\\n?`,"g"),"")}async function D({oracleRoot:e,operator:t,withControl:n=!1,printOnly:i=!1}){let r=g({oracleRoot:e,operator:t,withControl:n});if(!r.ok)return{ok:!1,code:3,reason:r.reason};let s=ke(r.specs),o=ge();if(i)return{ok:!0,printText:s,path:o};E.mkdirSync(V.dirname(o),{recursive:!0});let a=E.existsSync(o)?E.readFileSync(o,"utf8"):"";if(a.includes(s.trim()))return{ok:!0,...d("present",{path:o,backup:null})};let u=(he(a).trimEnd()+`
14
-
15
- `+s).replace(/^\n+/,"");if(a.trim()===u.trim())return{ok:!0,...d("present",{path:o,backup:null})};let c=a?h(o):null;return E.writeFileSync(o,u.endsWith(`
16
- `)?u:u+`
17
- `),{ok:!0,...d("written",{path:o,backup:c})}}import Q from"node:fs";import X from"node:path";var L="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 be(){return{openapi:"3.1.0",info:{title:"Oracle Public (read/prepare)",version:"1.0.0",description:"Secret-free public surface for hosted clients. "+L},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 M({printOnly:e=!1}={}){let t=be(),n=X.join(m(),".config","oracle","connectors","chatgpt-openapi.json"),i=JSON.stringify(t,null,2)+`
18
- `;e||(Q.mkdirSync(X.dirname(n),{recursive:!0}),Q.writeFileSync(n,i));let r=[L,"","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: ${n}`].filter(Boolean).join(`
19
- `);return{ok:!0,...d(e?"printed":"written",{path:n,print:t,instructions:r,cannotSign:L})}}import H from"node:path";import Z from"node:os";function Se(){return process.platform==="darwin"?H.join(Z.homedir(),"Library","Application Support","Cursor","User","globalStorage","mcp.json"):process.platform==="win32"?H.join(Z.homedir(),"AppData","Roaming","Cursor","User","globalStorage","mcp.json"):H.join(m(),".config","cursor","mcp.json")}async function U({oracleRoot:e,operator:t,withControl:n=!1,project:i=!1,printOnly:r=!1,cwd:s=process.cwd()}){let o=g({oracleRoot:e,operator:t,withControl:n});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(r)return{ok:!0,printText:['Add this to your Cursor MCP config (Cmd+Shift+P \u2192 "MCP: Open Configuration"):',JSON.stringify({mcpServers:o.specs},null,2)].join(`
20
-
21
- `)};let a=Se(),f=b(a,o.specs);return{ok:!0,...d(f.status,{path:a,backup:f.backup})}}import P from"node:path";import ee from"node:os";function je(){return process.platform==="darwin"?P.join(ee.homedir(),"Library","Application Support","Code","User","globalStorage","mcp.json"):process.platform==="win32"?P.join(ee.homedir(),"AppData","Roaming","Code","User","globalStorage","mcp.json"):P.join(m(),".config","Code","User","globalStorage","mcp.json")}function ve(e){return P.join(e||process.cwd(),".vscode","mcp.json")}async function F({oracleRoot:e,operator:t,withControl:n=!1,project:i=!1,printOnly:r=!1,cwd:s=process.cwd()}){let o=g({oracleRoot:e,operator:t,withControl:n});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(r)return{ok:!0,printText:["Add this to your VS Code MCP config (.vscode/mcp.json):",JSON.stringify({mcpServers:o.specs},null,2),"","Alternatively, add to VS Code settings.json:",`"mcp.servers": ${JSON.stringify(o.specs,null,2)}`].join(`
22
- `)};let a=i?ve(s):je(),f=b(a,o.specs);return{ok:!0,...d(f.status,{path:a,backup:f.backup})}}import{readFileSync as $,existsSync as w,writeFileSync as A,mkdirSync as te}from"node:fs";import{join as S,dirname as ye}from"node:path";import{homedir as re}from"node:os";var we=S(ye(new URL(import.meta.url).pathname),"..","..","..","profiles","oracle","SOUL.md");function xe(){let e=[we,S(re(),".config","oracle","SOUL.md")];for(let t of e)if(w(t))return $(t,"utf8");throw new Error("SOUL.md not found \u2014 run 'oracle bootstrap' first")}async function ne(e,{cwd:t=process.cwd(),printOnly:n=!1}={}){let i=xe();if(e==="claude-code"||e==="claude"){let r=S(t,"CLAUDE.md"),s=w(r)?$(r,"utf8"):"",o=`# Oracle Agent Instructions
23
- ${i}
24
- ---
25
- ${s}`;if(n)return{ok:!0,printText:`# Would write to ${r}:
26
-
27
- ${o.slice(0,500)}...`,status:"printed"};let a=h(r);return A(r,o,"utf8"),{ok:!0,path:r,backup:a,status:"installed"}}if(e==="cursor"){let r=S(t,".cursorrules"),s=w(r)?$(r,"utf8"):"",o=`# Oracle Agent Instructions
28
- ${i}
29
- ---
30
- ${s}`;if(n)return{ok:!0,printText:`# Would write to ${r}:
31
-
32
- ${o.slice(0,500)}...`,status:"printed"};let a=h(r);return A(r,o,"utf8"),{ok:!0,path:r,backup:a,status:"installed"}}if(e==="claude-desktop"){let r=S(re(),"Library","Application Support","Claude","claude_desktop_config.json");if(!w(r))return{ok:!1,reason:"Claude Desktop config not found. Open Claude Desktop once first, then retry."};let s=R(r);if(n)return{ok:!0,printText:`# Would add Oracle SOUL to Claude Desktop custom instructions
33
-
34
- ${i.slice(0,500)}...`,status:"printed"};let o=h(r);return s.customInstructions=s.customInstructions||"",s.customInstructions=`# Oracle Agent Instructions
35
- ${i}
36
- ---
37
- ${s.customInstructions}`,T(r,s),{ok:!0,path:r,backup:o,status:"installed"}}if(e==="codex"||e==="copilot"){let r=S(t,".github"),s=S(r,"copilot-instructions.md"),o=w(s)?$(s,"utf8"):"";if(n)return{ok:!0,printText:`# Would write to ${s}:
38
-
39
- ${i.slice(0,500)}...`,status:"printed"};w(r)||te(r,{recursive:!0});let a=h(s);return A(s,`${i}
40
- ---
41
- ${o}`,"utf8"),{ok:!0,path:s,backup:a,status:"installed"}}if(e==="vscode"||e==="vs-code"){let r=S(t,".vscode"),s=S(r,"instructions.md");if(n)return{ok:!0,printText:`# Would write to ${s}:
42
-
43
- ${i.slice(0,500)}...`,status:"printed"};w(r)||te(r,{recursive:!0});let o=h(s);return A(s,`${i}
44
- `,"utf8"),{ok:!0,path:s,backup:o,status:"installed"}}return{ok:!1,reason:`--with-soul not supported for target '${e}'`}}function N(){process.stderr.write(`usage: oracle mcp <install|print> [target] [flags]
45
- targets: claude-code | claude-desktop | codex | copilot | chatgpt | cursor | vscode | generic
46
- flags: --with-control --with-soul --project --print --json
47
- `)}function x(e,{json:t=!1}={}){if(e.print&&!e.instructions?process.stdout.write(JSON.stringify(e.print,null,2)+`
48
- `):e.printText&&process.stdout.write(e.printText),e.instructions&&(process.stdout.write(e.instructions+`
49
- `),e.print&&t&&process.stdout.write(JSON.stringify(e.print,null,2)+`
50
- `)),!e.print&&!e.printText&&!e.instructions){let n={status:e.status,path:e.path||null,backup:e.backup||null,method:e.method||null};process.stdout.write((t?JSON.stringify(n,null,2):`${n.status}${n.path?" "+n.path:""}`)+`
51
- `)}}var $t={name:"mcp",summary:"wire Oracle into AI clients",group:"read",usage:"oracle mcp install <target> [--with-control] [--with-soul] | oracle mcp print [--target <t>] | oracle mcp watchdog [--once]",async run(e){let t=e.argv[0];if(!t||t==="--help"||t==="-h")return N(),t?0:1;if(t==="watchdog"){let{spawn:c}=await import("node:child_process"),l=await import("node:path"),p=e.argv.includes("--once"),j=l.join(e.root,"bin","oracle-mcp-watchdog.mjs");return c(process.execPath,[j,...p?["--once"]:[]],{stdio:"inherit",detached:!0}).unref(),0}let n,i;try{({values:n,positionals:i}=Oe({args:e.argv.slice(1),options:{"with-control":{type:"boolean",default:!1},"with-soul":{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(c){return process.stderr.write(`oracle mcp: ${c.message}
52
- `),N(),1}let r=!!n["with-control"],s=!!n["with-soul"],o=!!n.project,a=!!n.json,f=e.resolveOperator?e.resolveOperator():{ok:!1};if(r&&(!f||!f.ok))return O(process.stderr),3;let u={oracleRoot:e.root,operator:f,withControl:r,project:o,cwd:process.cwd()};if(t==="print"){let c=n.target||i[0]||"claude-code";if(c==="generic"||c==="claude-code"){let l=g(u);return l.ok?(process.stdout.write(JSON.stringify({mcpServers:l.specs},null,2)+`
53
- `),0):(O(process.stderr),3)}if(c==="chatgpt"){let l=await M({printOnly:!0});return x(l,{json:a}),0}return c==="codex"||c==="copilot"?(x(await D({...u,printOnly:!0}),{json:a}),0):c==="claude-desktop"?(x(await J({...u,printOnly:!0}),{json:a}),0):c==="cursor"?(x(await U({...u,printOnly:!0}),{json:a}),0):c==="vscode"||c==="vs-code"?(x(await F({...u,printOnly:!0}),{json:a}),0):(process.stderr.write(`oracle mcp: unknown target '${c}'
54
- `),1)}if(t==="install"){let c=i[0]||n.target;if(!c)return N(),1;let l=!!n.print,p;if(c==="claude-code")p=await K({...u,printOnly:l});else if(c==="claude-desktop")p=await J({...u,printOnly:l});else if(c==="codex"||c==="copilot")p=await D({...u,printOnly:l});else if(c==="chatgpt")p=await M({printOnly:l});else if(c==="cursor")p=await U({...u,printOnly:l});else if(c==="vscode"||c==="vs-code")p=await F({...u,printOnly:l});else if(c==="generic"){let j=g(u);return j.ok?(process.stdout.write(JSON.stringify({mcpServers:j.specs},null,2)+`
55
- `),0):(O(process.stderr),3)}else return process.stderr.write(`oracle mcp: unknown target '${c}'
56
- `),1;if(!p.ok)return p.code===3?O(process.stderr):process.stderr.write(`oracle mcp: ${p.reason||"failed"}
57
- `),p.code||1;if(x(p,{json:a}),s){let j=await ne(c,{cwd:process.cwd(),printOnly:l});j.ok?process.stderr.write(` soul \u2192 ${j.path||"injected"}
58
- `):process.stderr.write(` soul: ${j.reason||"failed"}
59
- `)}return p.status&&String(p.status).startsWith("printed")&&p.print&&process.stdout.write(JSON.stringify(p.print,null,2)+`
60
- `),0}return N(),1}};export{$t as default};
@@ -1,54 +0,0 @@
1
- var Bn=Object.defineProperty;var xt=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Kn=(e,t)=>{for(var n in t)Bn(e,n,{get:t[n],enumerable:!0})};import zn from"node:fs";import Yn from"node:os";import Q from"node:path";import{fileURLToPath as Wn}from"node:url";function ae(){return process.env.ORACLE_FAKE_HOME||Yn.homedir()}function Jn(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Y(){return Jn()?process.env.ORACLE_CONFIG_DIR||Q.join(ae(),".config","oracle"):Q.join(ae(),".config","oracle")}function U(){return process.env.HERMES_HOME?Q.resolve(process.env.HERMES_HOME):Q.join(ae(),".hermes")}function R(e){return zn.mkdirSync(e,{recursive:!0}),e}var Gn,F,G=xt(()=>{Gn=Q.dirname(Wn(import.meta.url)),F=Q.resolve(Gn,"../..")});var An={};Kn(An,{createOAuthStore:()=>ut,default:()=>Ao,getOAuthStore:()=>ie,hasOAuthCredentials:()=>kn,loginOAuth:()=>vn,oauthProviderConfig:()=>at,oauthProviderId:()=>H,oauthRuntimeConfig:()=>En,refreshOAuthCredentials:()=>lt,resolveOAuthCredentials:()=>Sn});import{createHash as po,randomBytes as st,timingSafeEqual as mo}from"node:crypto";import M from"node:fs";import re from"node:path";import ho from"node:readline/promises";import{spawn as xo,spawnSync as yo}from"node:child_process";function ct(e={}){return typeof e.now=="function"?Number(e.now()):Date.now()}function H(e){let t=String(e||"").trim().toLowerCase();for(let[n,r]of Object.entries(oe))if(r.aliases.includes(t))return n;throw new Error(`unsupported OAuth provider: ${e||"(empty)"}`)}function at(e){let t=H(e);return{id:t,...oe[t]}}function N(e,t={}){if(!M.existsSync(e))return t;try{let n=JSON.parse(M.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: ${re.basename(e)}`)}}function wn(e){R(e),process.platform!=="win32"&&M.chmodSync(e,448)}function W(e,t){wn(re.dirname(e));let n=`${e}.${process.pid}.${st(4).toString("hex")}.tmp`;M.writeFileSync(n,`${JSON.stringify(t,null,2)}
2
- `,{mode:384}),M.renameSync(n,e),process.platform!=="win32"&&M.chmodSync(e,384)}function go(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 ot(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 me(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 ut(e={}){let t=e.file||re.join(Y(),"oauth.json"),n=e.metadataFile||re.join(re.dirname(t),"oauth-meta.json"),r=e.spawnFn||yo,o=e.keychain!==!1&&process.env.ORACLE_AUTH_FILE_STORE!=="1"&&go(r),i=o?"linux-secret-service":"private-file",c=`${t}.lock`;async function a(b){wn(re.dirname(c));let m;for(let h=0;h<400;h+=1)try{m=M.openSync(c,"wx",384);break}catch(l){if(l?.code!=="EEXIST")throw l;try{Date.now()-M.statSync(c).mtimeMs>3e5&&M.unlinkSync(c)}catch{}await new Promise(d=>setTimeout(d,25))}if(m===void 0)throw new Error("timed out waiting for OAuth credential lock");try{return await b()}finally{try{M.closeSync(m)}catch{}try{M.unlinkSync(c)}catch{}}}function u(b,m="oauth"){return["application","oracle","kind",m,"provider",b]}function s(b){let m=H(b);if(o){let d=r("secret-tool",["lookup",...u(m)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(d.error||d.status!==0||!String(d.stdout||"").trim())return null;try{return me(JSON.parse(String(d.stdout).trim()))}catch{return null}}let l=N(t,{providers:{}}).providers?.[m];if(!l)return null;try{return me(l)}catch{return null}}function f(b,m){let h=H(b),l=me(m);if(o){let w=r("secret-tool",["store",`--label=Oracle ${h} OAuth`,...u(h)],{input:JSON.stringify(l),encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(w.error||w.status!==0)throw new Error("OS credential store rejected OAuth credential");let O=N(n,{providers:{}});return O.providers||={},O.providers[h]={expiresAt:l.expiresAt,source:l.source},W(n,O),l}let d=N(t,{providers:{}});return d.providers||={},d.providers[h]=l,W(t,d),l}function p(b){let m=H(b);if(o){let d=r("secret-tool",["clear",...u(m)],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),w=N(n,{providers:{}});return w.providers&&delete w.providers[m],W(n,w),!d.error&&d.status===0}let h=N(t,{providers:{}}),l=!!h.providers?.[m];return h.providers&&delete h.providers[m],W(t,h),l}function y(b){let m=ot(b);if(o){let h=r("secret-tool",["lookup",...u(m,"api-key")],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return h.error||h.status!==0?"":String(h.stdout||"").trim()}return String(N(t,{apiKeys:{}}).apiKeys?.[m]||"").trim()}function x(b,m){let h=ot(b),l=String(m||"").trim();if(!l)throw new Error("API key is empty");if(o){let w=r("secret-tool",["store",`--label=Oracle ${h} API key`,...u(h,"api-key")],{input:l,encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(w.error||w.status!==0)throw new Error("OS credential store rejected API key");let O=N(n,{providers:{},apiKeys:{}});return O.apiKeys||={},O.apiKeys[h]={configured:!0},W(n,O),!0}let d=N(t,{providers:{},apiKeys:{}});return d.apiKeys||={},d.apiKeys[h]=l,W(t,d),!0}function _(b){let m=ot(b);if(o){let d=r("secret-tool",["clear",...u(m,"api-key")],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),w=N(n,{providers:{},apiKeys:{}});return w.apiKeys&&delete w.apiKeys[m],W(n,w),!d.error&&d.status===0}let h=N(t,{providers:{},apiKeys:{}}),l=!!h.apiKeys?.[m];return h.apiKeys&&delete h.apiKeys[m],W(t,h),l}function v(){let b={},m={};if(o){let h=N(n,{providers:{},apiKeys:{}});for(let[l,d]of Object.entries(h.providers||{}))b[l]={loggedIn:!!s(l),expiresAt:Number(d.expiresAt||0),source:String(d.source||"oracle"),storage:i};for(let l of Object.keys(h.apiKeys||{}))m[l]={configured:!!y(l),storage:i}}else{let h=N(t,{providers:{},apiKeys:{}});for(let[l,d]of Object.entries(h.providers||{}))b[l]={loggedIn:!!d?.accessToken,expiresAt:Number(d?.expiresAt||0),source:String(d?.source||"oracle"),storage:i};for(let[l,d]of Object.entries(h.apiKeys||{}))m[l]={configured:!!d,storage:i}}return{storage:i,providers:b,apiKeys:m}}return Object.freeze({file:t,storage:i,get:s,set:f,remove:p,getApiKey:y,setApiKey:x,removeApiKey:_,status:v,withLock:a})}function ie(){return _n||=ut(),_n}function it(e){return Buffer.from(e).toString("base64url")}function bo(){let e=it(st(32));return{verifier:e,challenge:it(po("sha256").update(e).digest()),state:it(st(24))}}function _o(e,t){let n=Buffer.from(String(e||"")),r=Buffer.from(String(t||""));return n.length===r.length&&mo(n,r)}function wo(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 xo(n[0],n[1],{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function Ce(e){return new URLSearchParams(e).toString()}async function q(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 vo(e){if(e)return String(await e()).trim();let t=ho.createInterface({input:process.stdin,output:process.stdout});try{return String(await t.question("Authorization code: ")).trim()}finally{t.close()}}function Ie(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 me({accessToken:n,refreshToken:r,expiresAt:ct(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 So(e){let t=oe["anthropic-oauth"],n=e.pkce||bo(),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 i=await vo(e.inputFn),[c,a]=i.split("#",2);if(!c||!_o(a,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:c,state:a,redirect_uri:t.redirectUri,code_verifier:n.verifier})});return Ie(await q(u,"Claude OAuth token exchange"),e)}async function ko(e){let t=oe["openai-codex"],n=await q(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)),i;for(let a=0;a<Math.ceil(900/o);a+=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){i=await q(u,"Codex device authorization");break}if(![403,404].includes(u.status))throw new Error(`Codex device authorization failed (HTTP ${u.status})`)}if(!i)throw new Error("Codex device authorization timed out");let c=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:Ce({grant_type:"authorization_code",code:i.authorization_code,redirect_uri:`${t.issuer}/deviceauth/callback`,client_id:t.clientId,code_verifier:i.code_verifier})});return Ie(await q(c,"Codex OAuth token exchange"),e)}function J(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 Eo(e){let t=oe["xai-oauth"],n=await q(await e.fetchFn(t.discoveryUrl,{headers:{accept:"application/json"}}),"xAI OAuth discovery");J(n.authorization_endpoint);let r=J(n.token_endpoint),o=await q(await e.fetchFn(t.deviceUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:Ce({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 i=J(o.verification_uri_complete||o.verification_uri);e.output(`Open: ${i}`),e.output(`Code: ${o.user_code}`),e.openFn(i);let c=Math.max(1,Number(o.interval||5)),a=Math.ceil(Math.max(1,Number(o.expires_in||600))/c);for(let u=0;u<a;u+=1){let s=await e.fetchFn(r,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:Ce({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:t.clientId,device_code:o.device_code})});if(s.ok){let p=await q(s,"xAI OAuth token exchange");return Ie(p,{...e,discovery:{authorization_endpoint:J(n.authorization_endpoint),token_endpoint:r}})}let f="";try{f=String((await s.json())?.error||"")}catch{}if(f==="slow_down")await e.sleepFn((c+1)*1e3);else if(f==="authorization_pending")await e.sleepFn(c*1e3);else throw new Error(`xAI OAuth token exchange failed (HTTP ${s.status}${f?`, ${f}`:""})`)}throw new Error("xAI device authorization timed out")}async function vn(e,t={}){let n=H(e),r={fetchFn:t.fetchFn||globalThis.fetch,inputFn:t.inputFn,sleepFn:t.sleepFn||(o=>new Promise(i=>setTimeout(i,o))),openFn:t.openFn||wo,output:t.output||(o=>process.stdout.write(`${o}
3
- `)),now:t.now,pkce:t.pkce};return n==="anthropic-oauth"?So(r):n==="openai-codex"?ko(r):Eo(r)}async function lt(e,t,n={}){let r=H(e),o=oe[r],i=me(t);if(!i.refreshToken)throw new Error(`${r} OAuth credential cannot refresh; run oracle auth login`);let c=i.discovery,a,u=n.fetchFn||globalThis.fetch;if(r==="xai-oauth"){if(!c?.token_endpoint){let p=await u(o.discoveryUrl),y=await q(p,"xAI OAuth discovery");c={...y.authorization_endpoint?{authorization_endpoint:J(y.authorization_endpoint)}:{},token_endpoint:J(y.token_endpoint)}}a=J(c.token_endpoint)}else a=o.tokenUrl;let s=await u(a,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json",...r==="anthropic-oauth"?{"user-agent":"axios/1.7.9"}:{}},body:Ce({grant_type:"refresh_token",refresh_token:i.refreshToken,client_id:o.clientId})}),f=await q(s,`${r} OAuth refresh`);return Ie(f,{...n,refreshToken:i.refreshToken,discovery:c})}async function Sn(e,t={}){let n=H(e),r=t.store||ie(),o=r.get(n);if(!o)throw new Error(`${n} OAuth is not logged in; run oracle auth login ${e}`);let i=ct(t);if(!o.expiresAt||o.expiresAt>i+bn)return o;let c=async()=>{let a=r.get(n);if(!a)throw new Error(`${n} OAuth is not logged in; run oracle auth login ${e}`);let u=ct(t);if(!a.expiresAt||a.expiresAt>u+bn)return a;let s=await lt(n,a,t);return r.set(n,s),s};return typeof r.withLock=="function"?r.withLock(c):c()}function kn(e,t={}){try{return!!(t.store||ie()).get(e)?.accessToken}catch{return!1}}function En(e){let t=at(e);return{kind:"standalone",provider:t.id,model:t.model,baseUrl:t.baseUrl,authType:"oauth",protocol:t.protocol}}var oe,bn,_n,Ao,ft=xt(()=>{G();oe=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"}}),bn=12e4;Ao={createOAuthStore:ut,getOAuthStore:ie,hasOAuthCredentials:kn,loginOAuth:vn,oauthProviderConfig:at,oauthProviderId:H,oauthRuntimeConfig:En,refreshOAuthCredentials:lt,resolveOAuthCredentials:Sn}});import{spawn as Hn}from"node:child_process";var qn=["SIGINT","SIGTERM","SIGHUP"];function X(e,t=[],n={},r=e){return new Promise(o=>{let i=Hn(e,t,n),c=!1,a=null,u=new Map(qn.map(f=>[f,()=>{a||=f,i.exitCode===null&&i.signalCode===null&&i.kill(f)}]));for(let[f,p]of u)process.on(f,p);let s=()=>{for(let[f,p]of u)process.off(f,p)};i.once("error",f=>{c||(c=!0,s(),process.stderr.write(`oracle: could not start ${r}: ${f.message}
4
- `),o(1))}),i.once("exit",(f,p)=>{if(c)return;c=!0,s();let y=a||p;if(y){process.kill(process.pid,y);return}o(f??1)})})}import gt from"node:fs";import Z from"node:path";G();var Vn="0.19.0",Oi=`hermes-agent==${Vn}`;var yt="0.12.1",Ci=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${yt}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${yt}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function Xn(){return Z.join(Y(),"runtime")}function Qn(){return Z.join(Xn(),"venv")}function Zn(e){let t=process.platform==="win32"?"Scripts":"bin",n=process.platform==="win32"?`${e}.exe`:e;return Z.join(Qn(),t,n)}function er(){return Zn("hermes")}function tr(e){let t=process.platform==="win32"&&!Z.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let n of(process.env.PATH||"").split(Z.delimiter))if(n)for(let r of t){let o=Z.join(n,`${e}${r}`);try{if(gt.existsSync(o))return o}catch{}}return null}function ue(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=tr("hermes");if(e)return{ok:!0,bin:e,source:"path"};let t=er();return gt.existsSync(t)?{ok:!0,bin:t,source:"managed"}:{ok:!1,bin:null,source:null}}G();import ee from"node:fs";import Te from"node:path";var nr=new Set(["auto","standalone","hermes","remote","arch"]),rr=new Set(["openrouter","openai","xai","deepseek","gemini","custom","anthropic-oauth","openai-codex","xai-oauth"]);function bt(){return Te.join(Y(),"model.json")}function D(e){return String(e||"").trim()||void 0}function _t(e={}){let t=D(e.backend)?.toLowerCase()||"auto",n=D(e.provider)?.toLowerCase(),r=D(e.model),o=D(e.baseUrl)?.replace(/\/+$/,""),i=D(e.apiKeyEnv),c=Number.parseInt(String(e.contextLength||""),10),a=D(e.reasoningEffort),u=D(e.computeHost||e.remoteHost),s=D(e.computeUser||e.remoteUser),f=D(e.computePath||e.remotePath);if(!nr.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(n&&!rr.has(n))throw new Error(`unsupported provider: ${n}`);if(o&&n!=="custom")throw new Error("baseUrl is only supported for the custom provider");if(i&&!/^[A-Z][A-Z0-9_]*$/.test(i))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");if(t==="remote"&&!u)throw new Error("remote backend requires computeHost");return{backend:t,...n?{provider:n}:{},...r?{model:r}:{},...o?{baseUrl:o}:{},...i?{apiKeyEnv:i}:{},...Number.isFinite(c)&&c>0?{contextLength:c}:{},...a?{reasoningEffort:a}:{},...u?{computeHost:u}:{},...s?{computeUser:s}:{},...f?{computePath:f}:{}}}function le(){let e=bt();if(!ee.existsSync(e))return null;try{return _t(JSON.parse(ee.readFileSync(e,"utf8")))}catch{return null}}function wt(e){let t=_t(e),n=bt();R(Te.dirname(n)),process.platform!=="win32"&&ee.chmodSync(Te.dirname(n),448);let r=`${n}.${process.pid}.tmp`;return ee.writeFileSync(r,`${JSON.stringify(t,null,2)}
5
- `,{mode:384}),ee.renameSync(r,n),process.platform!=="win32"&&ee.chmodSync(n,384),t}G();import A from"node:fs";import S from"node:path";import{spawnSync as Qo}from"node:child_process";import St from"node:fs";import ir from"node:path";var or=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 Re(e){return String(e||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function vt(e){let t=Re(e);if(!t)return null;for(let n of or)if(n.key===t||String(n.chainId).toLowerCase()===t||(n.aliases||[]).map(Re).includes(t)||Re(n.name)===t)return n;return null}G();function sr(){return ir.join(Y(),"active-chain.json")}function cr(){let e=sr();if(!St.existsSync(e))return null;try{let t=JSON.parse(St.readFileSync(e,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let n=vt(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 ge(e={}){let t=cr(),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}import{EventEmitter as Dr}from"node:events";import{spawn as ar}from"node:child_process";import{EventEmitter as ur}from"node:events";import{createInterface as kt}from"node:readline";var lr=15e3,fr=12e4;function dr(e){let t=typeof e=="string"?e:e?.message||"Gateway request failed",n=new Error(t);return n.error=e,n}function pr(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 Et({python:e,pythonArgs:t=[],cwd:n,env:r,spawnFn:o=ar,startupTimeoutMs:i=lr,requestTimeoutMs:c=fr}={}){let a=new ur,u=new Map,s=null,f=1,p=null,y=null,x=!1;function _(d){a.listenerCount("error")>0&&a.emit("error",d)}function v(d){for(let w of u.values())clearTimeout(w.timer),w.reject(d);u.clear()}function b(d){if(!("id"in d)){a.emit("event",d);return}let w=u.get(d.id);w&&(u.delete(d.id),clearTimeout(w.timer),"error"in d?w.reject(dr(d.error)):w.resolve(d.result))}function m(){return p||(p=new Promise((d,w)=>{let O=!1,k,g=C=>{O||(O=!0,clearTimeout(k),C?w(C):d())};try{s=o(e,[...t,"-m","tui_gateway.entry"],{cwd:n,env:r})}catch(C){g(C),_(C);return}let I=kt({input:s.stdout}),z=kt({input:s.stderr});I.on("line",C=>{let j;try{j=JSON.parse(C)}catch{a.emit("log",C);return}g(),b(j)}),z.on("line",C=>a.emit("log",pr(C))),s.once("error",C=>{g(C),v(C),_(C)}),s.once("exit",(C,j)=>{x=!0;let se=new Error(`Gateway exited with code ${C} and signal ${j}`);g(se),v(se),a.emit("exit",{code:C,signal:j})}),k=setTimeout(()=>{g(new Error(`Gateway startup timed out after ${i} ms`))},i)}),p)}function h(d,w){if(!s||x)return Promise.reject(new Error("Gateway is not running"));let O=f++;return new Promise((k,g)=>{let I=setTimeout(()=>{u.delete(O),g(new Error(`Gateway request ${O} timed out after ${c} ms`))},c);u.set(O,{resolve:k,reject:g,timer:I});try{s.stdin.write(`${JSON.stringify({id:O,method:d,params:w})}
6
- `)}catch(z){clearTimeout(I),u.delete(O),g(z)}})}function l(){if(y)return y;if(!s||x)return Promise.resolve();let d=new Error("Gateway stopped while requests were pending");return v(d),y=new Promise(w=>{s.once("exit",w);try{s.kill()}catch{w()}}),y}return{start:m,request:h,stop:l,on(d,w){return a.on(d,w),this},off(d,w){return a.off(d,w),this}}}var fe=Buffer.alloc(0),mr=new Set(["return","backspace","tab","escape","up","down","left","right","home","end","delete","insert","pageup","pagedown","unknown"]),hr={A:"up",B:"down",C:"right",D:"left",H:"home",F:"end",P:"f1",Q:"f2",R:"f3",S:"f4"},xr={1:"home",2:"insert",3:"delete",4:"end",5:"pageup",6:"pagedown",7:"home",8:"end"};function P({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 It(e){return e<128?1:e>=240?4:e>=224?3:e>=192?2:1}function yr(e){return e>=64&&e<=126}function At(e){let t=e.toLowerCase();return P({name:t,shift:e!==t,sequence:e})}function gr(e){return e===13?P({name:"return",sequence:"\r"}):e===10?P({name:"return",sequence:`
7
- `}):e===9?P({name:"tab",sequence:" "}):e===127?P({name:"backspace",sequence:"\x7F"}):e===8?P({name:"backspace",sequence:"\b"}):e>=1&&e<=26?P({name:String.fromCharCode(e+96),ctrl:!0,sequence:String.fromCharCode(e)}):P({name:"unknown",sequence:String.fromCharCode(e)})}function br(e){let t=/^\u001b[\[O](\d*)(?:;(\d+))?(.)$/s.exec(e);if(!t)return P({name:"unknown",sequence:e});let n=t[1]===""?null:Number(t[1]),r=t[2]===void 0?null:Number(t[2]),o=t[3],i=null,c=r;if(o==="~"?i=xr[n]??null:(i=hr[o]??null,c===null&&n!==null&&n>1&&(c=n)),!i)return P({name:"unknown",sequence:e});let a=c===null?0:Math.max(0,c-1);return P({name:i,shift:(a&1)!==0,meta:(a&2)!==0,ctrl:(a&4)!==0,sequence:e})}function _r(e,t,n,r){let o=()=>(n.push(P({name:"escape",sequence:"\x1B"})),1);if(t+1>=e.length)return r?o():0;let i=e[t+1];if(i===91||i===79){let s=t+2;for(;s<e.length&&!yr(e[s]);)s+=1;return s>=e.length?r?o():0:(n.push(br(e.toString("utf8",t,s+1))),s+1-t)}if(i===27)return o();let c=It(i);if(t+1+c>e.length)return r?o():0;let a=e.toString("utf8",t+1,t+1+c),u=a.toLowerCase();return n.push(P({name:u,meta:!0,shift:a!==u,sequence:`\x1B${a}`})),1+c}function Ot(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r];if(o===27){let c=_r(e,r,n,t);if(c===0)return{keys:n,rest:Buffer.from(e.subarray(r))};r+=c;continue}if(o<32||o===127){n.push(gr(o)),r+=1;continue}let i=It(o);if(r+i>e.length)return t?(n.push(At(e.toString("utf8",r))),{keys:n,rest:fe}):{keys:n,rest:Buffer.from(e.subarray(r))};n.push(At(e.toString("utf8",r,r+i))),r+=i}return{keys:n,rest:fe}}function Ct(e){return Buffer.isBuffer(e)?e:e==null?fe:typeof e=="string"?Buffer.from(e,"utf8"):Buffer.from(e)}function wr(){let e=fe;return{push(t){let n=e.length===0?Ct(t):Buffer.concat([e,Ct(t)]),{keys:r,rest:o}=Ot(n,!1);return e=o,r},flush(){if(e.length===0)return[];let{keys:t}=Ot(e,!0);return e=fe,t},get pending(){return e.length}}}function vr({history:e=[]}={}){let t=[...e];return{buffer:"",cursor:0,history:t,historyIndex:t.length,draft:""}}function Pe(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 Ne(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 Lt(e,t){return E(e,{...t,historyIndex:e.history.length,draft:""})}function Sr(e){if(e.ctrl||e.meta||!e.sequence||mr.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 kr(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 Er(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 Ar(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 Or(e){let t=e.buffer.trim();if(t==="")return{state:Lt(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 Cr(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:Lt(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=kr(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:Pe(n,r)}),action:null};case"f":return{state:E(e,{cursor:Ne(n,r)}),action:null};default:return{state:E(e,{}),action:null}}switch(t.name){case"return":return Or(e);case"left":return{state:E(e,{cursor:Pe(n,r)}),action:null};case"right":return{state:E(e,{cursor:Ne(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 Er(e);case"down":return Ar(e);case"backspace":{if(r===0)return{state:E(e,{}),action:null};let o=Pe(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=Ne(n,r);return{state:E(e,{buffer:n.slice(0,r)+n.slice(o)}),action:null}}default:break}if(Sr(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 $t(e={}){let{stdin:t,stdout:n,history:r=[],onSubmit:o,onCancel:i,onEof:c,onClear:a,onRender:u}=e,s=t??process.stdin,f=n??process.stdout,p=wr(),y={submit:o,cancel:i,eof:c,clear:a},x=vr({history:r}),_=!1,v=!1,b=!1,m=l=>{if(!l)return;let d=y[l.type];typeof d=="function"&&d(l.value,x)},h=l=>{for(let d of p.push(l)){let w=Cr(x,d);x=w.state,m(w.action),typeof u=="function"&&u(x)}};return{start(){_||(_=!0,s.isTTY&&typeof s.setRawMode=="function"&&(b=s.isRaw===!0,s.setRawMode(!0),v=!0),typeof s.resume=="function"&&s.resume(),s.on("data",h),typeof u=="function"&&u(x))},stop(){_&&(_=!1,typeof s.off=="function"?s.off("data",h):typeof s.removeListener=="function"&&s.removeListener("data",h),v&&typeof s.setRawMode=="function"&&(s.setRawMode(b),v=!1),typeof s.pause=="function"&&s.pause())},getState(){return x},setState(l){return x=l,x},write(l){f&&typeof f.write=="function"&&f.write(l)},get isRunning(){return _}}}var je="\x1B[?25l",be="\x1B[?25h",Tt="\x1B[2K",_e="\x1B[0J";var Ir="\x1B\\[[0-9;?]*[a-zA-Z]";function Nt(){return new RegExp(Ir,"g")}function Lr(e){return String(e??"").replace(Nt(),"")}function Rt(e,t){return t.some(([n,r])=>e>=n&&e<=r)}function jt(e){return e===0||e<32||e>=127&&e<160||Rt(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:Rt(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 $r(e){let t=0;for(let n of Array.from(e))t+=jt(n.codePointAt(0));return t}function Tr(e){return $r(Lr(e))}function Rr(e){return/^\u001b\[0*m$/.test(e)}function Pt(e,t){let n="",r=0;for(let o of Array.from(e)){let i=jt(o.codePointAt(0));if(r+i>t)break;n+=o,r+=i}return{text:n,width:r}}function Pr(e,t){let n=String(e??"");if(t<=0)return"";if(Tr(n)<=t)return n;let r=Nt(),o="",i=0,c=!1,a=0,u=r.exec(n);for(;u!==null;){let f=Pt(n.slice(a,u.index),t-i);if(o+=f.text,i+=f.width,i>=t)return c?`${o}\x1B[0m`:o;o+=u[0],u[0].endsWith("m")&&(c=!Rr(u[0])),a=u.index+u[0].length,u=r.exec(n)}let s=Pt(n.slice(a),t-i);return o+=s.text,c?`${o}\x1B[0m`:o}function Nr(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 Mt({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,i=r??(Number.isFinite(e.rows)?Math.trunc(e.rows):24),c=o??(Number.isFinite(e.columns)?Math.trunc(e.columns):80),a=[],u=0,s=null,f=!1,p=!1,y=()=>{r===null&&(i=Number.isFinite(e.rows)?Math.trunc(e.rows):24),o===null&&(c=Number.isFinite(e.columns)?Math.trunc(e.columns):80),f=!0},x=typeof e.on=="function";x&&e.on("resize",y);function _(m){let h=m-u;return u=m,h===0?"":h<0?`\x1B[${-h}A`:`\x1B[${h}B`}function v(m){let l=(Array.isArray(m)?m:[]).map(d=>Pr(String(d??""),c));if(s!==null)for(l.length>s&&(l=l.slice(0,s));l.length<s;)l.push("");return l}function b(m){if(!f&&Nr(a,m))return;let h=[je];f&&a.length>0&&(h.push(_(0),"\r",_e),a=[],u=0),f=!1;let l=Math.min(a.length,m.length);for(let d=0;d<l;d+=1)a[d]!==m[d]&&h.push(_(d),"\r",Tt,m[d]);if(m.length>a.length){a.length>0&&h.push(_(a.length-1));for(let d=a.length;d<m.length;d+=1)d>0&&h.push(`
8
- `),h.push("\r",Tt,m[d]),u=d}else m.length<a.length&&h.push(_(m.length),"\r",_e);m.length>0&&h.push(_(m.length-1)),h.push(be),a=m,e.write(h.join(""))}return{render(m){p||b(v(m))},writeAbove(m){if(p)return;let h=String(m??""),l=je;a.length>0&&(l+=`${_(0)}\r${_e}`),l+=h.endsWith(`
9
- `)||h===""?h:`${h}
10
- `,e.write(l);let d=a;a=[],u=0,d.length>0?b(d):e.write(be)},clear(){if(p)return;let m=je;a.length>0&&(m+=`${_(0)}\r${_e}`),m+=be,e.write(m),a=[],u=0,f=!1},setLines(m){s=Number.isFinite(m)&&m>=0?Math.trunc(m):null},getLines(){return a.slice()},getSize(){return{rows:i,columns:c}},dispose(){if(!p){if(p=!0,x){let m=typeof e.off=="function"?e.off:e.removeListener;typeof m=="function"&&m.call(e,"resize",y)}e.write(be)}}}}var L=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 jr(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 Ft(e,t,n){let r=jr(t);return r?`\x1B[${e};2;${r.r};${r.g};${r.b}m${String(n)}\x1B[0m`:String(n)}function Me({color:e=!0}={}){return e&&!Object.hasOwn(process.env,"NO_COLOR")?Object.freeze({fg:(n,r)=>Ft(38,n,r),bg:(n,r)=>Ft(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 Yi=Me();function Ut(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 "]]),Fe="THE FUTURE IS AGENTIC / by DEMI",Ue=/\u001B\[[0-9;]*m/g;function Kt(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[...Ut(e)].reduce((t,n)=>t+Kt(n),0)}function Be(e,t){if(t<=0)return"";let n=String(e).split(/(\u001B\[[0-9;]*m)/g),r="",o=0,i=!1;for(let c of n)if(c){if(Ue.test(c)){Ue.lastIndex=0,r+=c,i=c!=="\x1B[0m";continue}Ue.lastIndex=0;for(let a of c){let u=Kt(a);if(o+u>t)return i?`${r}\x1B[0m`:r;r+=a,o+=u}}return r}function te(e,t,n="left"){let r=Math.max(0,Math.floor(Number(t)||0)),o=Be(String(e),r),i=Math.max(0,r-B(o));if(n==="right")return`${" ".repeat(i)}${o}`;if(n==="center"){let c=Math.floor(i/2);return`${" ".repeat(c)}${o}${" ".repeat(i-c)}`}return`${o}${" ".repeat(i)}`}function Ke(e,t){let n=Math.max(1,Math.floor(Number(t)||1)),r=[];for(let o of String(e??"").split(`
11
- `)){if(o===""){r.push("");continue}let i="",c=0;for(let a of o.split(" ")){let u=B(a);if(c>0&&c+1+u>n&&(r.push(i),i="",c=0),u>n){c>0&&(r.push(i),i="",c=0);let s=a;for(;B(s)>n;){let f=Be(s,n);r.push(f),s=s.slice(f.length)}i=s,c=B(s);continue}i=c===0?a:`${i} ${a}`,c=c===0?u:c+1+u}r.push(i)}return r}function Mr(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,i=Math.max(0,n-6);return{target:t,panelWidth:n,panelLeft:r,contentLeft:o,inner:i}}function Fr(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 Bt(e,t,n=0){let{target:r,contentLeft:o,inner:i}=e,a=Math.round((r-t)/2)-n-o,u=Math.max(0,i-t-n);return Math.max(0,Math.min(u,a))}function He({width:e,palette:t}){let n=Mr(e),{target:r,panelWidth:o,panelLeft:i,inner:c}=n;if(r<72||c<=0)return[te(t.bold(t.fg(L.accent,"oracle")),r,"center"),te(t.fg(L.banner_text,Fe),r,"center")];let a=Dt.map(([,l])=>l),{offset:u,width:s}=Fr(a),f=" ".repeat(Bt(n,s,u)),p=" ".repeat(Bt(n,B(Fe))),y=[];for(let[l,d]of Dt)y.push(t.bold(t.fg(l,`${f}${d.replace(/\s+$/,"")}`)));y.push(""),y.push(t.bold(t.fg(L.banner_text,`${p}${Fe}`)));let x=l=>t.fg(L.banner_border,l),_=" ".repeat(i),v="\u2500".repeat(Math.max(0,o-2)),b=l=>te(`${_}${l}`,r),m=[b(`${x("\u256D")}${x(v)}${x("\u256E")}`)],h=b(`${x("\u2502")}${" ".repeat(Math.max(0,o-2))}${x("\u2502")}`);m.push(h);for(let l of y)m.push(b(`${x("\u2502")} ${te(l,c)} ${x("\u2502")}`));return m.push(h),m.push(b(`${x("\u2570")}${x(v)}${x("\u256F")}`)),m}function Ht({lines:e,width:t,palette:n,title:r=""}){let o=Math.max(2,Math.floor(Number(t)||0)),i=Math.max(0,o-2),c=Be(String(r),Math.max(0,i-2)),a=c?` ${c} `:"",u=`${a}${"\u2500".repeat(Math.max(0,i-B(a)))}`,s=f=>n.fg(L.banner_border,f);return[`${s("\u256D")}${s(u)}${s("\u256E")}`,...e.map(f=>`${s("\u2502")}${te(f,i)}${s("\u2502")}`),`${s("\u2570")}${s("\u2500".repeat(i))}${s("\u256F")}`]}function De(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 Ur(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,i=Math.round(n*o/100);return`${"\u2588".repeat(i)}${"\u2591".repeat(n-i)}`}function we(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 qt({model:e,contextTokens:t,contextLength:n,percent:r,effort:o,thinking:i,chain:c,width:a,palette:u}){let s=Math.max(0,Math.floor(Number(a)||0)),f=u.fg(L.status_bar_dim," / "),p=s>=120?12:s>=60?8:4,y=Number(n)>0?`${De(t)}/${De(n)}`:De(t),x=Number.isFinite(Number(r))?`${Math.round(Number(r))}%`:"0%",_=[{text:String(e??""),strong:!0}];Number(n)>0&&_.push({text:`ctx ${Ur(r,p)} ${y} ${x}`}),o&&_.push({text:String(o)}),i&&_.push({text:String(i)}),typeof c=="string"&&c.length>0&&_.push({text:c});let v=_,b=h=>h.reduce((l,d,w)=>l+B(d.text)+(w>0?3:0),0);for(;v.length>1&&b(v)>s;)v=v.slice(0,-1);let m=v.map(h=>h.strong?u.fg(L.status_bar_strong,h.text):u.fg(L.status_bar_text,h.text)).join(f);return u.bg(L.status_bar_bg,te(m,s))}var Br=6;function Kr(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 qe(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 Hr(e){let t=e.width,n=`${e.promptLabel} `,r=Math.max(1,t-2-B(n)),o=e.buffer||"",i=Math.max(0,Math.min(e.cursor??o.length,o.length)),c=0;i>r&&(c=i-r);let a=o.slice(c,c+r),u=i-c,s=a.slice(0,u),f=a.slice(u,u+1)||" ",p=a.slice(u+1),y=e.palette;return[`${y.fg(L.accent,n)}${s}${y.bg(L.selection_bg,f)}${p}`]}function qr(e){let t=e.width,n=[];if(e.liveLines.length>0){for(let r of e.liveLines.slice(-Br))n.push(r);n.push("")}return n.push(...Ht({lines:Hr(e),width:t,palette:e.palette,title:"Ask Oracle \u203A"})),n.push(qt({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 zr(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 ve(e={}){return typeof e.text=="string"?e.text:typeof e.rendered=="string"?e.rendered:typeof e.message=="string"?e.message:""}function Yr(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||Me({color:t.isTTY!==!1}),i=e.renderer||Mt({stdout:t,rows:t.rows,columns:r}),c=e.client||Et({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}),a=new Dr,u=e.now||(()=>Date.now()),s={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,p=null,y={renderer:i,state:s};function x(){i.render(qr(s))}function _(k){i.writeAbove(`${k}
12
- `)}function v(){let k=s.assistantBuffer.split(`
13
- `),g=k[k.length-1]||"";s.liveLines=g?Ke(g,s.width):[]}function b({final:k=!1}={}){let g=s.assistantBuffer.split(`
14
- `),I=k?g.length:g.length-1,z=!1;for(;s.flushedLines<I;){let C=g[s.flushedLines];for(let j of Ke(C,s.width))_(j);s.flushedLines+=1,z=!0}return k?s.liveLines=[]:v(),z}function m(){p||(p=setInterval(()=>{s.busy&&(s.thinking=we(u()-s.startedAt),x())},250),typeof p.unref=="function"&&p.unref())}function h(){p&&(clearInterval(p),p=null)}async function l(k){let g=String(k||"").trim();if(g){if(g==="/exit"||g==="/quit"){await O();return}if(g==="/clear"){i.clear();for(let I of He({width:s.width,palette:o}))_(I);x();return}s.busy=!0,s.assistantBuffer="",s.flushedLines=0,s.liveLines=[],s.startedAt=u(),s.thinking="0s",_(`${o.bold(o.fg(L.prompt,"you"))} ${g}`),_(""),m(),x(),await c.request("prompt.submit",{session_id:s.sessionId,text:g})}}function d(k){let g=zr(k);if(g.type!=="gateway.ready"){if(g.type==="session.info"&&g.payload){g.payload.model&&(s.model=g.payload.model),g.payload.reasoning_effort&&(s.effort=g.payload.reasoning_effort),qe(s,g.payload.usage),x();return}if(g.type==="message.start"){s.busy=!0,s.cancelled=!1,s.assistantBuffer="",s.flushedLines=0,s.liveLines=[],_(o.bold(o.fg(L.accent,"oracle"))),x();return}if(g.type==="thinking.delta"||g.type==="reasoning.delta"){if(s.cancelled)return;ve(g.payload).trim()&&(s.thinking=`${we(u()-s.startedAt)}`),x();return}if(g.type==="message.delta"){if(s.cancelled)return;s.assistantBuffer+=ve(g.payload),b(),x();return}if(g.type==="message.complete"){if(s.cancelled){s.cancelled=!1;return}let I=ve(g.payload);I&&I.length>=s.assistantBuffer.length&&(s.assistantBuffer=I),b({final:!0}),_(""),s.busy=!1,h(),qe(s,g.payload?.usage||g.payload?.context),s.thinking=we(u()-s.startedAt),x();return}g.type==="error"&&(s.busy=!1,h(),_(o.fg(L.error,`error: ${ve(g.payload)||"unknown"}`)),x())}}async function w(){await c.start(),c.on("event",d),c.on("log",g=>a.emit("log",g)),c.on("error",g=>a.emit("error",g));let k=await c.request("session.create",{cols:s.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}:{}});s.sessionId=k.session_id,s.model=k.info?.model||s.model,k.info?.reasoning_effort&&(s.effort=k.info.reasoning_effort),qe(s,k.info?.usage);for(let g of He({width:s.width,palette:o}))_(g);_(""),x(),f=$t({stdin:n,stdout:t,onSubmit:g=>{l(g).catch(I=>a.emit("error",I))},onCancel:()=>{s.busy&&(s.busy=!1,s.cancelled=!0,h(),b({final:!0}),_(o.fg(L.warn,"interrupted")),_(""),x(),c.request("session.interrupt",{session_id:s.sessionId}).catch(g=>a.emit("error",g)))},onEof:()=>{O().catch(g=>a.emit("error",g))},onClear:()=>{i.clear(),x()},onRender:g=>{s.buffer=g.buffer||"",s.cursor=g.cursor??s.buffer.length,x()}}),f.start()}async function O(){h(),f&&f.stop(),i.dispose(),await c.stop(),a.emit("stop")}return Object.freeze({start:w,stop:O,on:a.on.bind(a),off:a.off.bind(a),state:s,handleEvent:d,submit:l})}async function ze({hermesPython:e,client:t,tuiFactory:n=Yr,args:r=[],env:o=process.env,cwd:i=process.cwd(),stdout:c=process.stdout,stdin:a=process.stdin}={}){let u=Kr(r);if(u.query)return{native:!1,pass:u.pass};if(!a.isTTY||!c.isTTY)return{native:!1,pass:u.pass};if(o.ORACLE_NATIVE_TUI==="0")return{native:!1,pass:u.pass};let s=e;if(!t&&!s)return{native:!1,pass:u.pass};let f=ge({...o,ORACLE_CHAT_SURFACE:"1",ORACLE_PROFILE:"oracle",ORACLE_NODE_BIN:process.execPath}),p=n({...t?{client:t}:{},...s?{python:s.command,pythonArgs:s.prefix||[]}:{},cwd:i,env:f,stdin:a,stdout:c,model:u.model,provider:u.provider,profile:"oracle"});return p.on("log",y=>{o.ORACLE_CLI_DEBUG&&process.stderr.write(`${y}
15
- `)}),p.on("error",y=>{process.stderr.write(`oracle chat: ${y.message}
16
- `)}),await p.start(),new Promise(y=>{let x=!1,_=async()=>{x||(x=!0,await p.stop(),y({native:!0,code:0}))};p.on("stop",()=>{x||(x=!0,y({native:!0,code:0}))}),process.once("SIGINT",_),process.once("SIGTERM",_)})}import Wr from"node:fs";import zt from"node:path";var Yt=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"}}),Gr=Object.freeze({"anthropic-oauth":{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-20250514",protocol:"anthropic-messages"},"openai-codex":{key:"OPENAI_API_KEY",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.4",protocol:"responses"},"xai-oauth":{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest",protocol:"responses"}});function Jr(e,t){let n=Number(e);return Number.isSafeInteger(n)&&n>0?n:t}function Vr(e,t){let n=String(e.ORACLE_PROVIDER||t.provider||"").trim().toLowerCase();if(n)return n;if(e.ORACLE_BASE_URL||t.baseUrl)return"custom";for(let[r,o]of Object.entries(Yt))if(e[o.key]||o.alternateKey&&e[o.alternateKey])return r;return null}function Xr(e=process.env,t={},n=()=>!1,r=()=>""){let o=Vr(e,t);if(!o)return null;let i=Gr[o],c=Yt[o]||i,a=String(e.ORACLE_API_KEY_ENV||t.apiKeyEnv||""),u=String(e.ORACLE_API_KEY||a&&e[a]||c&&(e[c.key]||c.alternateKey&&e[c.alternateKey])||r(o)||""),s=String(i?i.baseUrl:o==="custom"?e.ORACLE_BASE_URL||t.baseUrl||"":c?.baseUrl||"").replace(/\/+$/,""),f=String(e.ORACLE_MODEL||t.model||c?.model||"");if(!s||!f)return null;let p=!!(i&&n(o));return i&&!p||!i&&o!=="custom"&&!u?null:{kind:"standalone",provider:o,model:f,baseUrl:s,...p?{authType:"oauth",protocol:i.protocol}:{apiKey:u},contextLength:Jr(e.ORACLE_CONTEXT_LENGTH||t.contextLength,128e3),reasoningEffort:String(e.ORACLE_REASONING_EFFORT||t.reasoningEffort||"high")}}function ne(e=""){return["Oracle runs its own native chat \u2014 no Hermes or external agent required.","Set OPENROUTER_API_KEY, run `oracle auth login claude|codex|grok`, or configure a custom OpenAI-compatible endpoint.","`oracle harness detect` finds any Agent Plugins-compatible clients installed on this machine.",e].filter(Boolean).join(`
17
- `)}function Qr(e=process.env,t={}){if(e.ORACLE_PUBLIC_DESKTOP==="1"||e.ORACLE_REMOTE_COMPUTE_DISABLE==="1")return null;let n=String(e.ORACLE_CHAT_BACKEND||t.backend||"auto").trim().toLowerCase(),r=String(e.ORACLE_COMPUTE_HOST||t.computeHost||"").trim();if(!["remote","arch"].includes(n)&&!e.ORACLE_COMPUTE_HOST||!r)return null;let o=String(e.ORACLE_COMPUTE_USER||t.computeUser||"").trim(),i=String(e.ORACLE_COMPUTE_PATH||t.computePath||"$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin").trim();return{kind:"remote",host:r,user:o,path:i}}var Zr=Object.freeze([{name:"oracle",bin:"oracle",label:"Oracle Native (default)",kind:"oracle"},{name:"hermes",bin:"hermes",label:"Hermes Agent",kind:"hermes"},{name:"opencode",bin:"opencode",label:"OpenCode",kind:"mcp"},{name:"claude",bin:"claude",label:"Claude Code",kind:"mcp"},{name:"codex",bin:"codex",label:"OpenAI Codex CLI",kind:"mcp"},{name:"cursor",bin:"cursor",label:"Cursor IDE",kind:"mcp"},{name:"windsurf",bin:"windsurf",label:"Windsurf",kind:"mcp"},{name:"aider",bin:"aider",label:"Aider",kind:"mcp"},{name:"continue",bin:"continue",label:"Continue",kind:"mcp"}]);function eo(e){for(let t of(process.env.PATH||"").split(zt.delimiter)){let n=zt.join(t,e);try{if(Wr.existsSync(n))return n}catch{}}return null}function Wt({env:e=process.env,hermes:t={ok:!1},storedConfig:n=null,oauthAvailable:r=()=>!1,apiKeyResolver:o=()=>""}={}){let i=String(e.ORACLE_CHAT_BACKEND||n?.backend||"auto").trim().toLowerCase(),c=Qr(e,n||{});if(i==="remote"||i==="arch")return c?{kind:"remote",config:c}:{kind:"unconfigured",reason:ne(`${i} compute backend was requested, but no compute host is configured.`)};let a=Xr(e,n||{},r,o);if(i==="standalone")return a?{kind:"standalone",config:a}:{kind:"unconfigured",reason:ne("ORACLE_CHAT_BACKEND=standalone was requested, but no standalone model is configured.")};if(i==="hermes")return t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:ne("ORACLE_CHAT_BACKEND=hermes was requested, but Hermes was not found.")};if(i!=="auto"){for(let u of Zr)if(u.name===i){let s=eo(u.bin);return s?{kind:"harness",harness:{...u,path:s}}:{kind:"unconfigured",reason:ne(`ORACLE_CHAT_BACKEND=${i} was requested, but ${u.bin} was not found on PATH.`)}}return{kind:"unconfigured",reason:ne(`Unknown ORACLE_CHAT_BACKEND value: ${i}`)}}return c?{kind:"remote",config:c}:a?{kind:"standalone",config:a}:t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:ne()}}G();import Oo from"node:fs";import Ln from"node:path";import{randomUUID as On}from"node:crypto";import{EventEmitter as Co}from"node:events";import{spawnSync as Io}from"node:child_process";import Se from"node:fs";import Gt from"node:path";import{homedir as to}from"node:os";var We=process.env.ORACLE_CONFIG_DIR||Gt.join(to(),".config","oracle"),Jt=Gt.join(We,"memory.json"),Ye=2200;function Vt(e){Se.existsSync(e)||Se.mkdirSync(e,{recursive:!0})}function Ge(){Vt(We);try{let e=Se.readFileSync(Jt,"utf8");return JSON.parse(e)}catch{return{version:1,updatedAt:new Date().toISOString(),entries:[]}}}function Xt(e){Vt(We),e.updatedAt=new Date().toISOString(),Se.writeFileSync(Jt,JSON.stringify(e,null,2),{mode:384})}function Qt(e,t){let n=Ge(),r=n.entries.findIndex(o=>o.key===e);for(r>=0?n.entries[r]={key:e,content:t,addedAt:new Date().toISOString()}:n.entries.push({key:e,content:t,addedAt:new Date().toISOString()});JSON.stringify(n.entries).length>Ye&&n.entries.length>1;)n.entries.shift();Xt(n)}function Zt(e){let t=Ge(),n=t.entries.length;return t.entries=t.entries.filter(r=>r.key!==e),t.entries.length<n?(Xt(t),{ok:!0}):{ok:!1}}function en(){let e=Ge();if(e.entries.length===0)return"";let t=JSON.stringify(e.entries).length,n=Math.round(t/Ye*100),r=e.entries.map(o=>`${o.key}: ${o.content}`);return["\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",`MEMORY [${n}% \u2014 ${t}/${Ye} chars]`,"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",...r].join(`
18
- `)}var tn=[{type:"function",function:{name:"memory_add",description:"Save a durable fact to memory for future sessions.",parameters:{type:"object",properties:{key:{type:"string",description:"Short unique key"},content:{type:"string",description:"The fact to remember"}},required:["key","content"],additionalProperties:!1}}},{type:"function",function:{name:"memory_remove",description:"Remove a memory entry by key.",parameters:{type:"object",properties:{key:{type:"string",description:"The key to remove"}},required:["key"],additionalProperties:!1}}}];import K from"node:fs";import ke from"node:path";import{homedir as no}from"node:os";var ro=process.env.ORACLE_CONFIG_DIR||ke.join(no(),".config","oracle"),de=ke.join(ro,"skills"),oo=/^[a-z0-9][a-z0-9_-]{0,63}$/;function nn(e){K.existsSync(e)||K.mkdirSync(e,{recursive:!0})}function rn(e){let t=String(e??"").trim();if(!oo.test(t))throw new Error("invalid skill name");return ke.join(de,`${t}.md`)}function Je(){nn(de);let e=[];try{for(let t of K.readdirSync(de,{withFileTypes:!0})){if(!t.isFile()||!t.name.endsWith(".md"))continue;let n=ke.join(de,t.name),r=K.readFileSync(n,"utf8"),o=t.name.replace(/\.md$/,""),i="",c=r.match(/^description:\s*(.+)$/m);c?i=c[1].trim():i=r.split(`
19
- `)[0].replace(/^#+\s*/,"").trim()||o,e.push({name:o,description:i,path:n,size:r.length})}}catch{}return e}function Ve(e){try{let t=rn(e);return K.lstatSync(t).isFile()?K.readFileSync(t,"utf8"):null}catch{return null}}function on(e){let t=Je();if(t.length===0)return`## Skills
20
- No skills installed. Use skill_create to save a successful workflow.
21
- `;let n=t;if(e){let o=e.toLowerCase();n=[...t].sort((i,c)=>{let a=(i.name.toLowerCase().includes(o)?2:0)+(i.description.toLowerCase().includes(o)?1:0);return(c.name.toLowerCase().includes(o)?2:0)+(c.description.toLowerCase().includes(o)?1:0)-a})}return["## Skills","Available (use skill_load <name>):",...n.map(o=>`- **${o.name}**: ${o.description}`)].join(`
22
- `)}function sn(e,t){nn(de);let n=rn(e);if(K.existsSync(n)&&!K.lstatSync(n).isFile())throw new Error("skill path must be a regular file");K.writeFileSync(n,t,{mode:384})}var cn=[{type:"function",function:{name:"skill_load",description:"Load full content of a skill by name.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Skill name using lowercase letters, digits, hyphens, or underscores"}},required:["name"],additionalProperties:!1}}},{type:"function",function:{name:"skill_create",description:"Save a new skill from a workflow or pattern.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Lowercase letters, digits, hyphens, or underscores"},content:{type:"string",description:"Full SKILL.md content"}},required:["name","content"],additionalProperties:!1}}},{type:"function",function:{name:"skill_list",description:"List all installed skills.",parameters:{type:"object",properties:{},additionalProperties:!1}}}];import Ee from"node:fs";import un from"node:path";import{homedir as io}from"node:os";import{EventEmitter as so}from"node:events";var Xe=process.env.ORACLE_CONFIG_DIR||un.join(io(),".config","oracle"),ln=un.join(Xe,"cron.json");function fn(e){Ee.existsSync(e)||Ee.mkdirSync(e,{recursive:!0})}function pe(){fn(Xe);try{return JSON.parse(Ee.readFileSync(ln,"utf8"))}catch{return{version:1,jobs:[]}}}function Qe(e){fn(Xe),Ee.writeFileSync(ln,JSON.stringify(e,null,2),{mode:384})}function Ae(e){let t=String(e||"").toLowerCase().trim(),n=t.match(/^every\s+(\d+)\s*m/i);if(n)return parseInt(n[1])*6e4;let r=t.match(/^every\s+(\d+)\s*h/i);return r?parseInt(r[1])*36e5:t.includes("daily")?864e5:t.includes("hourly")?36e5:t.split(/\s+/).length===5?6e4:null}function Ze(){return pe().jobs}function et(e){let t=pe(),n=`cron_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`,r=Ae(e.schedule)||36e5,o={...e,id:n,createdAt:new Date().toISOString(),nextRunAt:new Date(Date.now()+r).toISOString()};return t.jobs.push(o),Qe(t),o}function tt(e){let t=pe(),n=t.jobs.length;return t.jobs=t.jobs.filter(r=>r.id!==e),t.jobs.length<n?(Qe(t),!0):!1}function an(e){let t=pe(),n=t.jobs.find(i=>i.id===e);if(!n)return;n.lastRunAt=new Date().toISOString();let r=Ae(n.schedule)||36e5,o=n.lastRunAt?new Date(n.lastRunAt).getTime():Date.now();n.nextRunAt=new Date(o+r).toISOString(),Qe(t)}function dn(e){let t=new so,n=new Map;function r(){let i=pe();for(let c of i.jobs){if(!c.enabled)continue;let a=Ae(c.schedule);if(!a)continue;let u=setInterval(async()=>{try{t.emit("run",{id:c.id,name:c.name}),await e(c.prompt,c.skills),an(c.id),t.emit("complete",{id:c.id,name:c.name})}catch(s){t.emit("error",{id:c.id,name:c.name,error:s})}},a);n.set(c.id,u)}t.emit("started",{count:n.size})}function o(){for(let[i,c]of n)clearInterval(c),n.delete(i);t.emit("stopped")}return{on:t.on.bind(t),off:t.off.bind(t),once:t.once.bind(t),emit:t.emit.bind(t),start:r,stop:o,add:i=>{let c=et(i);if(c.enabled){let a=Ae(c.schedule);if(a){let u=setInterval(async()=>{try{t.emit("run",{id:c.id,name:c.name}),await e(c.prompt,c.skills),an(c.id),t.emit("complete",{id:c.id,name:c.name})}catch(s){t.emit("error",{id:c.id,name:c.name,error:s})}},a);n.set(c.id,u)}}return c},remove:i=>{let c=n.get(i);return c&&(clearInterval(c),n.delete(i)),tt(i)},list:Ze}}var pn=[{type:"function",function:{name:"cron_add",description:"Schedule a recurring agent job.",parameters:{type:"object",properties:{name:{type:"string",description:"Human-readable name"},schedule:{type:"string",description:"'every 30m', 'daily', 'every 6h'"},prompt:{type:"string",description:"Agent prompt to run on schedule"},skills:{type:"array",items:{type:"string"},description:"Optional skill names"}},required:["name","schedule","prompt"],additionalProperties:!1}}},{type:"function",function:{name:"cron_list",description:"List all scheduled cron jobs.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"cron_remove",description:"Remove a cron job by id.",parameters:{type:"object",properties:{id:{type:"string",description:"Job id from cron_list"}},required:["id"],additionalProperties:!1}}}];var Oe=[],co=5,ao=1;function mn(e){Oe.push(e),Oe.length>20&&Oe.shift()}function hn(){let e=Oe.slice(-3);if(e.length<1)return null;let t=e[e.length-1];return t.toolCalls>=co&&t.errors===0?{shouldCreate:!0,suggestion:`You completed a ${t.toolCalls}-step workflow. Save it as a skill with skill_create.`}:e.filter(r=>r.errors>0&&r.recovered).length>=ao&&t.toolCalls>=3?{shouldCreate:!0,suggestion:"You recovered from errors. Save the corrected approach as a skill."}:{shouldCreate:!1,suggestion:"No skill suggestions yet."}}var xn=[{type:"function",function:{name:"meta_analyze",description:"Analyze recent interactions and suggest skills to create.",parameters:{type:"object",properties:{},additionalProperties:!1}}}];import{homedir as nt}from"node:os";import{join as rt}from"node:path";var yn=process.env.ORACLE_PUBLIC_DESKTOP==="1",uo=yn?process.env.ORACLE_CONFIG_DIR||rt(nt(),".config","oracle"):rt(nt(),".config","oracle"),As=yn?uo:rt(nt(),".config","mad-desk");function lo(e,t,n=""){let r=process.env[e];if(r!=null&&String(r).trim()!=="")return r;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:n}var fo=["0","false","off","no"];function gn(e,t,n=!0){let r=String(lo(e,t,"")).trim().toLowerCase();return r===""?n:!fo.includes(r)}var Lo=new Set(["chain","data","scan","route","prepare"]),$o=new Set(["list","show"]),To=new Set(["call","catalog","health"]),Ro=new Set(["swap","bridge","prepare","prepare-bridge"]),Po=Object.freeze({"anthropic-oauth":"https://api.anthropic.com/v1","openai-codex":"https://chatgpt.com/backend-api/codex","xai-oauth":"https://api.x.ai/v1"}),dt=2e4,Cn=6,No=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}}}),mt=Object.freeze([No,...tn,...cn,...pn,...xn]);function In(e){let t=String(e||"");return t.length<=dt?t:`${t.slice(0,dt)}
23
- [truncated ${t.length-dt} chars]`}async function jo(e,t,n){switch(e){case"oracle_cli":return n(t.argv);case"memory_add":return Qt(t.key,t.content),{ok:!0,stored:t.key};case"memory_remove":return Zt(t.key);case"skill_load":{let r=Ve(t.name);return r?{ok:!0,name:t.name,content:r}:{ok:!1,error:`skill not found: ${t.name}`}}case"skill_create":return sn(t.name,t.content),{ok:!0,created:t.name};case"skill_list":return{ok:!0,skills:Je().map(o=>({name:o.name,description:o.description}))};case"cron_add":return{ok:!0,job:et({name:t.name,schedule:t.schedule,prompt:t.prompt,skills:t.skills||[],enabled:!0})};case"cron_list":return{ok:!0,jobs:Ze()};case"cron_remove":return{ok:tt(t.id),removed:t.id};case"meta_analyze":return{ok:!0,...hn()||{shouldCreate:!1,suggestion:"No skill suggestions yet."}};default:return{ok:!1,error:`unknown tool: ${e}`}}}function Mo(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 Lo.has(t)?t==="chain"&&!$o.has(e[1]||"list")?`command not allowed: chain${e[1]?` ${e[1]}`:""}`:t==="data"&&!To.has(e[1]||"")?`command not allowed: data${e[1]?` ${e[1]}`:""}`:t==="route"&&!Ro.has(e[1]||"")?`command not allowed: route${e[1]?` ${e[1]}`:""}`:null:`command not allowed: ${t}`}async function Fo(e,t={}){let n=Mo(e);if(n)return{ok:!1,error:n};let r=t.spawnFn||Io,o=t.packageRoot||F,i=r(process.execPath,[Ln.join(o,"bin","oracle.mjs"),...e],{encoding:"utf8",timeout:t.timeoutMs||45e3,maxBuffer:1024*1024,env:{...process.env,ORACLE_CHAT_TOOL:"1"}});return i.error?{ok:!1,error:i.error.message}:{ok:i.status===0,status:typeof i.status=="number"?i.status:1,stdout:In(i.stdout),stderr:In(i.stderr)}}function Uo(){let e=Ln.join(F,"profiles","oracle","SOUL.md"),t=Oo.readFileSync(e,"utf8"),n=en(),r=on(),o=[t.trim()];return n&&o.push(n),o.push(r),o.push("You have tools for Oracle CLI commands, durable memory, skills, cron scheduling, and meta-learning.","Use memory_add to persist facts. Use skill_create to save successful workflows. Use cron_add to schedule recurring tasks."),o.join(`
24
-
25
- `)}function Do(e,t,n={}){return{method:"event",params:{type:e,session_id:t,payload:n}}}async function Bo(e){return new Error(`model request failed (HTTP ${e?.status||"unknown"})`)}async function*ht(e){if(!e?.ok)throw await Bo(e);if(!e.body)throw new Error("model response had no body");let t=e.body.getReader(),n=new TextDecoder,r="";for(;;){let{value:i,done:c}=await t.read();r+=n.decode(i||new Uint8Array,{stream:!c});let a=r.split(/\r?\n\r?\n/);r=a.pop()||"";for(let u of a){let s=u.split(/\r?\n/).filter(f=>f.startsWith("data:")).map(f=>f.slice(5).trimStart()).join(`
26
- `);!s||s==="[DONE]"||(yield JSON.parse(s))}if(c)break}let o=r.trim();if(o.startsWith("data:")){let i=o.slice(5).trim();i&&i!=="[DONE]"&&(yield JSON.parse(i))}}function Ko(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 Ho(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 qo(){return mt.map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters,strict:!1}))}function zo(){return mt.map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function pt(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 Yo(e){let t=[];for(let n of e)if(n.role!=="system"){if(n.role==="user"){pt(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 i={};try{i=JSON.parse(o.function?.arguments||"{}")}catch{}r.push({type:"tool_use",id:o.id,name:o.function?.name,input:i})}r.length&&pt(t,"assistant",r);continue}n.role==="tool"&&pt(t,"user",[{type:"tool_result",tool_use_id:n.tool_call_id,content:String(n.content||"")}])}return t}function Wo(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 Go(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 Jo({config:e,messages:t,fetchFn:n,signal:r,onText:o}){let i=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:mt,tool_choice:"auto",stream:!0,stream_options:{include_usage:!0}}),signal:r}),c=new Map,a="",u=null;for await(let s of ht(i)){s.usage&&(u=s.usage);let f=s.choices?.[0]?.delta||{};typeof f.content=="string"&&f.content&&(a+=f.content,o(f.content));for(let p of f.tool_calls||[])Ko(c,p)}return{text:a,usage:u,toolCalls:[...c.entries()].sort(([s],[f])=>s-f).map(([,s])=>s)}}async function Vo({config:e,messages:t,persona:n,credential:r,fetchFn:o,signal:i,onText:c}){let a=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:Yo(t),tools:zo(),tool_choice:{type:"auto"},stream:!0}),signal:i}),u=new Map,s="",f=null;for await(let p of ht(a)){if(p.type==="message_start"&&(f={...f||{},...p.message?.usage||{}}),p.type==="message_delta"&&(f={...f||{},...p.usage||{}}),p.type==="content_block_start"&&p.content_block?.type==="tool_use"){let y=p.content_block;u.set(Number(p.index||0),{id:y.id,type:"function",function:{name:y.name,arguments:y.input&&Object.keys(y.input).length?JSON.stringify(y.input):""}})}if(p.type==="content_block_delta"&&p.delta?.type==="text_delta"&&(s+=p.delta.text||"",p.delta.text&&c(p.delta.text)),p.type==="content_block_delta"&&p.delta?.type==="input_json_delta"){let y=Number(p.index||0),x=u.get(y);x&&(x.function.arguments+=p.delta.partial_json||"")}if(p.type==="error")throw new Error(p.error?.message||"Claude stream failed")}return{text:s,usage:f,toolCalls:[...u.entries()].sort(([p],[y])=>p-y).map(([,p])=>(p.function.arguments||(p.function.arguments="{}"),p))}}async function Xo({config:e,messages:t,persona:n,sessionId:r,credential:o,fetchFn:i,signal:c,onText:a}){let u=e.provider==="openai-codex",s=u?Go(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",...s?{"ChatGPT-Account-ID":s}:{},session_id:r,"x-client-request-id":r}:{"x-grok-conv-id":r}},p={model:e.model,instructions:n,input:Wo(t),tools:qo(),tool_choice:"auto",parallel_tool_calls:!0,store:!1,stream:!0,...u?{reasoning:{effort:e.reasoningEffort||"high",summary:"auto"}}:{}},y=await i(`${e.baseUrl}/responses`,{method:"POST",headers:f,body:JSON.stringify(p),signal:c}),x=new Map,_="",v=null;for await(let b of ht(y)){b.type==="response.output_text.delta"&&typeof b.delta=="string"&&(_+=b.delta,a(b.delta));let m=b.item;if((b.type==="response.output_item.added"||b.type==="response.output_item.done")&&m?.type==="function_call"){let h=String(m.call_id||m.id||b.output_index||x.size);x.set(h,{id:m.call_id||m.id,response_item_id:m.id,type:"function",function:{name:m.name,arguments:m.arguments||"{}"}})}if(b.type==="response.function_call_arguments.delta"){let h=String(b.call_id||b.item_id||b.output_index||""),l=x.get(h);l&&(l.function.arguments+=b.delta||"")}if(b.type==="response.completed"&&(v=b.response?.usage||v),b.type==="response.failed"||b.type==="error")throw new Error(b.response?.error?.message||b.error?.message||"Responses stream failed")}return{text:_,usage:v,toolCalls:[...x.values()]}}function $n(e={}){let t=e.config;if(!t?.baseUrl||!t?.model)throw new Error("standalone model configuration is incomplete");if(t.authType==="oauth"){let l=Po[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 Co,r=e.fetchFn||globalThis.fetch,o=e.toolRunner||(l=>Fo(l,e)),i=e.credentialProvider||(async l=>{let{resolveOAuthCredentials:d}=await Promise.resolve().then(()=>(ft(),An));return d(l)}),c=e.persona||Uo(),a=e.sessionId||`oracle-${On()}`,u=[],s=null,f=!1,p=!1,y=dn(async(l,d)=>{if(f)return;let w=(d||[]).map(k=>{let g=Ve(k);return g?`## Skill: ${k}
27
- ${g}`:null}).filter(Boolean),O=w.length>0?`
28
-
29
- ${w.join(`
30
-
31
- `)}`:"";await v(`${l}${O}`)});gn("ORACLE_CRON_ENABLED","MAD_CRON_ENABLED",!0)&&(y.on("run",l=>x("cron.run",l)),y.on("complete",l=>x("cron.complete",l)),y.on("error",l=>x("cron.error",l)),y.start());function x(l,d={}){n.emit("event",Do(l,a,d))}function _(l){x("error",{message:l?.message||String(l)}),n.listenerCount("error")>0&&n.emit("error",l)}async function v(l){p=!0,s=new AbortController;let d=[{role:"system",content:c},...u,{role:"user",content:l}],w="",O=null,k=!1;try{for(let g=0;g<Cn;g+=1){let I=t.authType==="oauth"?await i(t.provider):null,z=V=>{k||(x("message.start",{}),k=!0),w+=V,x("message.delta",{text:V})},C={config:t,messages:d,persona:c,sessionId:a,credential:I,fetchFn:r,signal:s.signal,onText:z},j=t.protocol==="anthropic-messages"?await Vo(C):t.protocol==="responses"?await Xo(C):await Jo(C),se=j.text,ce=j.toolCalls;if(O=j.usage||O,ce.length===0){d.push({role:"assistant",content:se}),u=d.slice(1),k||x("message.start",{}),x("message.complete",{text:w,usage:Ho(O,t.contextLength)});return}d.push({role:"assistant",content:se||null,tool_calls:ce});let Dn=ce.length,xe=0;for(let V of ce){let ye;try{let $e=JSON.parse(V.function.arguments||"{}");ye=await jo(V.function.name,$e,o)}catch($e){ye={ok:!1,error:`invalid tool arguments: ${$e.message}`},xe++}ye.ok||xe++,d.push({role:"tool",tool_call_id:V.id||`call_${On()}`,content:JSON.stringify(ye)})}mn({userMessage:l,toolCalls:Dn,errors:xe,recovered:xe>0?!!ce.length:!1,durationMs:0})}throw new Error(`agent exceeded ${Cn} tool steps`)}catch(g){g?.name!=="AbortError"&&_(g)}finally{p=!1,s=null}}async function b(){if(f)throw new Error("standalone client is stopped")}async function m(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:a,info:{model:d.model||t.model,reasoning_effort:t.reasoningEffort,usage:{context_max:t.contextLength},backend:"standalone"}};if(l==="prompt.submit"){if(p)throw new Error("a turn is already active");let w=String(d.text||"").trim();if(!w)throw new Error("prompt text is required");return queueMicrotask(()=>{v(w).catch(_)}),{accepted:!0}}if(l==="session.interrupt"){let w=!!(s&&p);return s?.abort(),{interrupted:w}}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,s?.abort(),y.stop())}return Object.freeze({start:b,request:m,stop:h,on:n.on.bind(n),off:n.off.bind(n)})}async function Tn({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"}),i="",c=!1;try{return await new Promise((a,u)=>{let s=f=>{let p=f?.params?.type,y=f?.params?.payload||{};if(p==="message.delta"&&typeof y.text=="string"){i+=y.text,n.write(y.text);return}if(p==="message.complete"){!i&&y.text&&n.write(String(y.text)),n.write(`
32
- `),c=!0,a(0);return}if(p==="error"){let x=y.message||y.text||"standalone chat failed";r.write(`oracle chat: ${x}
33
- `),c=!0,u(new Error(x))}};e.on("event",s),e.request("prompt.submit",{session_id:o.session_id,text:t}).catch(f=>{c||(c=!0,u(f))})})}finally{await e.stop()}}ft();var $="oracle",he="oracle";function Fn(e){if(e==="hermes"){let t=ue();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 Rn(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 Un(e){let t=Rn(e);if(t)return t;try{let r=A.readFileSync(e,"utf8").match(/["']([^"'\r\n]+\/bin\/hermes)["']/);if(r)return Rn(r[1])}catch{}return null}function Zo(){return S.join(F,"src","cli","oracle-harness.py")}function Le(e,t){let n=Zo(),r=process.env.ORACLE_PLAIN_HARNESS==="0"?null:Un(e);return r&&A.existsSync(n)?{command:r.command,args:[...r.prefix,n,...t]}:{command:e,args:t}}function ei(){return S.join(F,"skins","oracle.yaml")}function ti(e=$){let t=S.join(F,"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}:(R(S.dirname(n)),A.copyFileSync(t,n),{ok:!0,reused:!1})}function ni(e=$){let t=ei();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");R(n),R(r);let o=A.readFileSync(t,"utf8");return A.writeFileSync(S.join(n,`${he}.yaml`),o),A.writeFileSync(S.join(r,`${he}.yaml`),o),{ok:!0,skin:he}}function ri(e=$){let t=S.join(U(),"profiles",e,"config.yaml");if(!A.existsSync(t))return{ok:!1,reason:"profile config missing"};let n=Fn("oracle")||S.join(F,"bin","oracle.mjs"),r=S.join(U(),"profiles",e,"oracle");R(r);let o={profile:e,skin:he,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)+`
34
- `,{mode:384}),{ok:!0,marker:o}}function oi(e=$){let t=S.join(F,"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");R(n);for(let r of A.readdirSync(t)){let o=S.join(t,r),i=S.join(n,r);A.statSync(o).isFile()&&A.copyFileSync(o,i)}for(let r of["chain","setup"]){let o=S.join(U(),"profiles",e,"skills",r);R(o);let i=S.join(t,`${r}.SKILL.md`),c=S.join(t,"SKILL.md"),a=A.existsSync(i)?A.readFileSync(i,"utf8"):A.readFileSync(c,"utf8");A.writeFileSync(S.join(o,"SKILL.md"),a)}return{ok:!0}}function ii(e=$){let t=Fn("hermes");if(!t)return{ok:!1,reason:"hermes missing"};let n=Qo(t,["-p",e,"config","set","display.skin",he],{encoding:"utf8",timeout:3e4});return n.status!==0?{ok:!1,reason:(n.stderr||n.stdout||"config set failed").trim()}:{ok:!0}}function Pn(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 si(e=$){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(i=>new RegExp(`^${i}=.+`,"m").test(o)))return!0}return!1}function Nn(e=$){let t=U();return Pn(S.join(t,"config.yaml"))||Pn(S.join(t,"profiles",e,"config.yaml"))||si(e)}function jn(){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(`
35
- `)}function ci(){let e=Number(process.stdout?.columns||process.env.COLUMNS||80);return Number.isFinite(e)&&e>0?Math.floor(e):80}function ai(e){return Array.from(String(e)).length}function ui(e,t){let n=e.map(c=>c.trimEnd()),r=Math.max(0,...n.map(c=>ai(c))),o=Math.max(0,Math.floor((t-r)/2)),i=" ".repeat(o);return n.map(c=>c?`${i}${c}`:"")}function Mn(e){return`'${String(e).replace(/'/g,"'\\''")}'`}function li(e){return e.user?`${e.user}@${e.host}`:e.host}function fi(e,t){let n=e.path||"$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin",r=["oracle","chat",...t].map(Mn).join(" ");return[/^[A-Za-z0-9_:$/.~+-]+$/.test(n)?`export PATH=${n}`:`export PATH=${Mn(n)}`,"export ORACLE_REMOTE_COMPUTE_DISABLE=1","export ORACLE_CHAT_BACKEND=auto",r].join("; ")}function di(){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(ui(e,ci()).join(`
36
- `)+`
37
- `)}function pi(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 oc={name:"chat",summary:"open the one oracle chat surface (telegram-like, multi-model)",group:"read",usage:jn(),async run(e){let t=[...e.argv];if(t.includes("-h")||t.includes("--help"))return process.stdout.write(jn()+`
38
- `),0;if(t.includes("--print-banner"))return di(),0;let n=pi(t),r={...process.env,...n.model?{ORACLE_MODEL:n.model}:{},...n.provider?{ORACLE_PROVIDER:n.provider}:{}},o=ie(),i=Wt({env:r,hermes:ue(),storedConfig:le(),oauthAvailable:_=>!!o.get(_),apiKeyResolver:_=>o.getApiKey(_)});if(i.kind==="unconfigured")return process.stderr.write(`${i.reason}
39
- `),1;if(i.kind==="remote")return X("ssh",["-o","BatchMode=yes","-o","ConnectTimeout=12",li(i.config),fi(i.config,n.pass)],{stdio:"inherit",env:process.env},"oracle-remote-compute");let c=ge({ORACLE_CHAT_SURFACE:"1",ORACLE_PROFILE:$,ORACLE_NODE_BIN:process.execPath,ORACLE_CLI_ENTRY:S.join(F,"bin","oracle.mjs")});if(i.kind==="standalone"){let _=$n({config:{...i.config,...n.model?{model:n.model}:{}}});if(n.query)try{return await Tn({client:_,text:n.query,stdout:process.stdout,stderr:process.stderr})}catch{return 1}let v=await ze({client:_,args:t,env:c,cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});return v.native?v.code:(process.stderr.write(process.env.ORACLE_NATIVE_TUI==="0"?`oracle standalone chat requires the native TUI; remove ORACLE_NATIVE_TUI=0
40
- `:`oracle standalone chat requires an interactive TTY or -q <query>
41
- `),1)}let a=i.bin;ti($),ni($),oi($);let u=ii($);ri($),!u.ok&&process.env.ORACLE_CLI_DEBUG&&process.stderr.write(`oracle chat: skin note: ${u.reason}
42
- `);let s=!!(n.model||n.provider);if(!Nn($)&&!s){if(!process.stdin.isTTY||!process.stdout.isTTY)return process.stderr.write(`oracle chat needs a configured model
43
- run: oracle model
44
- `),1;process.stdout.write(`choose oracle's model before first chat
45
-
46
- `);let _=Le(a,["-p",$,"model"]),v=await X(_.command,_.args,{stdio:"inherit",env:process.env},"oracle-model");if(v!==0||!Nn($))return v||1}let f=["-p",$,"chat"],p=Un(a),y=await ze({hermesPython:p,args:t,env:c,cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});if(y.native)return y.code;let x=Le(a,[...f,...n.pass]);return X(x.command,x.args,{stdio:"inherit",env:c},"oracle-chat")}};function T(e,t){let n=e.indexOf(t);return n>=0&&e[n+1]?e[n+1]:null}function mi(e){let t=T(e,"--backend"),n=T(e,"--provider"),r=T(e,"--model")||T(e,"-m"),o=T(e,"--base-url"),i=T(e,"--api-key-env"),c=T(e,"--context-length"),a=T(e,"--reasoning-effort"),u=T(e,"--compute-host")||T(e,"--remote-host"),s=T(e,"--compute-user")||T(e,"--remote-user"),f=T(e,"--compute-path")||T(e,"--remote-path");if(!t&&!!!(n||r||o||i||c||a||u||s||f))return null;let y={...le()||{}};return n&&(delete y.apiKeyEnv,(n!=="custom"||n!==y.provider)&&delete y.baseUrl),{...y,backend:t||"standalone",...n?{provider:n}:{},...r?{model:r}:{},...o?{baseUrl:o}:{},...i?{apiKeyEnv:i}:{},...c?{contextLength:c}:{},...a?{reasoningEffort:a}:{},...u?{computeHost:u}:{},...s?{computeUser:s}:{},...f?{computePath:f}:{}}}function hi(){return["oracle model, choose standalone model settings or open Hermes' picker",""," oracle model"," oracle model --show"," oracle model --backend standalone --provider openrouter --model openrouter/auto"," oracle model --backend remote --compute-host <host>"," oracle model --backend auto","","standalone keys stay in environment variables, never model.json:"," OPENROUTER_API_KEY, OPENAI_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY"].join(`
47
- `)}var lc={name:"model",summary:"choose Oracle's standalone model or existing Hermes provider",group:"read",usage:hi(),async run(e){let t=[...e.argv];if(t.includes("--show"))return process.stdout.write(`${JSON.stringify(le()||{backend:"auto"},null,2)}
48
- `),0;let n=mi(t);if(n)try{let i=wt(n);return process.stdout.write(`oracle model: ${i.backend}`),i.provider&&process.stdout.write(` / ${i.provider}`),i.model&&process.stdout.write(` / ${i.model}`),process.stdout.write(`
49
- `),i.backend==="standalone"&&i.apiKeyEnv&&process.stdout.write(`key source: ${i.apiKeyEnv}
50
- `),0}catch(i){return process.stderr.write(`oracle model: ${i.message}
51
- `),1}let r=ue();if(!r.ok)return process.stderr.write(`Oracle standalone chat does not require Hermes.
52
- Configure a provider with: oracle model --backend standalone --provider openrouter --model openrouter/auto
53
- Then set OPENROUTER_API_KEY.
54
- `),1;let o=Le(r.bin,["-p","oracle","model",...t]);return X(o.command,o.args,{stdio:"inherit",env:process.env},"oracle-model")}};export{lc as default};