@oracle-agent/oracle 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +13 -516
  3. package/bin/oracle.mjs +19 -27
  4. package/package.json +15 -98
  5. package/CONTRIBUTING.md +0 -98
  6. package/SECURITY.md +0 -89
  7. package/SETUP.md +0 -381
  8. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  9. package/artifacts/inscription/oracle-was-here.svg +0 -1
  10. package/artifacts/specialist-packs/oracle-full-crypto.json +0 -295
  11. package/bin/desk-server.mjs +0 -440
  12. package/bin/oracle-data-mcp.mjs +0 -1019
  13. package/bin/oracle-init.mjs +0 -496
  14. package/bin/oracle-public-server.mjs +0 -36
  15. package/bin/oracle-route.mjs +0 -254
  16. package/bin/oracle-scan.mjs +0 -192
  17. package/bin/oracle-upgrade.mjs +0 -42
  18. package/docs/adding-a-chain.md +0 -229
  19. package/docs/architecture.md +0 -138
  20. package/docs/cli.md +0 -47
  21. package/docs/connectors.md +0 -13
  22. package/docs/oracle-pack-standard.md +0 -29
  23. package/docs/profiles.md +0 -151
  24. package/docs/public-surface.md +0 -133
  25. package/examples/add-a-chain.mjs +0 -65
  26. package/examples/oracle-pack-template.mjs +0 -38
  27. package/examples/research-a-token.mjs +0 -70
  28. package/plugins/oracle-owner-gate/__init__.py +0 -227
  29. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  30. package/profiles/_template/SOUL.md +0 -54
  31. package/profiles/_template/profile.json +0 -22
  32. package/profiles/bitcoin-agent/SOUL.md +0 -31
  33. package/profiles/bitcoin-agent/profile.json +0 -32
  34. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  35. package/profiles/hyperliquid-agent/profile.json +0 -37
  36. package/profiles/oracle/SOUL.md +0 -107
  37. package/profiles/oracle/profile.json +0 -39
  38. package/profiles/polymarket-agent/SOUL.md +0 -35
  39. package/profiles/polymarket-agent/profile.json +0 -34
  40. package/profiles/profile.schema.json +0 -90
  41. package/profiles/protocol-builder/SOUL.md +0 -57
  42. package/profiles/protocol-builder/profile.json +0 -39
  43. package/profiles/robinhood-agent/SOUL.md +0 -53
  44. package/profiles/robinhood-agent/profile.json +0 -40
  45. package/profiles/solana-agent/SOUL.md +0 -37
  46. package/profiles/solana-agent/profile.json +0 -37
  47. package/profiles/stable-agent/SOUL.md +0 -43
  48. package/profiles/stable-agent/profile.json +0 -37
  49. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  50. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  51. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  52. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  53. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  54. package/public/agent-connect/app.js +0 -84
  55. package/public/agent-connect/index.html +0 -83
  56. package/public/agent-connect/styles.css +0 -70
  57. package/public/index.html +0 -12
  58. package/public/oracle-console/app.js +0 -272
  59. package/public/oracle-console/bitcoin-wallets.js +0 -206
  60. package/public/oracle-console/index.html +0 -91
  61. package/public/oracle-console/styles.css +0 -239
  62. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  63. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  64. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  65. package/public/oracle-splash/assets/llms/claude.svg +0 -1
  66. package/public/oracle-splash/assets/llms/codex-icon.svg +0 -1
  67. package/public/oracle-splash/assets/llms/codex.svg +0 -1
  68. package/public/oracle-splash/assets/llms/cursor-icon.svg +0 -12
  69. package/public/oracle-splash/assets/llms/cursor.svg +0 -17
  70. package/public/oracle-splash/assets/llms/deepseek.svg +0 -1
  71. package/public/oracle-splash/assets/llms/gemini-icon.svg +0 -1
  72. package/public/oracle-splash/assets/llms/gemini.svg +0 -1
  73. package/public/oracle-splash/assets/llms/grok.svg +0 -8
  74. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  75. package/public/oracle-splash/assets/llms/kimi-icon.svg +0 -1
  76. package/public/oracle-splash/assets/llms/kimi.svg +0 -1
  77. package/public/oracle-splash/assets/llms/manus.svg +0 -18
  78. package/public/oracle-splash/assets/llms/openclaw.svg +0 -22
  79. package/public/oracle-splash/assets/llms/perplexity.svg +0 -1
  80. package/public/oracle-splash/assets/llms/qwen.svg +0 -1
  81. package/public/oracle-splash/assets/llms/windsurf.svg +0 -1
  82. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  83. package/public/oracle-splash/assets/protocols/across.png +0 -0
  84. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  85. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  86. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  87. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  88. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  89. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  90. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  91. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  92. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  93. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  94. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  95. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  96. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  97. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  98. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  99. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  100. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  101. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  102. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  103. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  104. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  105. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  106. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  107. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  108. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  109. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  110. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  111. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  112. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  113. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  114. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  115. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  116. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  117. package/public/oracle-splash/assets/wordmarks/across.svg +0 -4
  118. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +0 -23
  119. package/public/oracle-splash/assets/wordmarks/balancer.svg +0 -3
  120. package/public/oracle-splash/assets/wordmarks/cowswap.svg +0 -1
  121. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  122. package/public/oracle-splash/assets/wordmarks/gmx.svg +0 -13
  123. package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
  124. package/public/oracle-splash/assets/wordmarks/hyena.svg +0 -7
  125. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +0 -21
  126. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +0 -13
  127. package/public/oracle-splash/assets/wordmarks/jupiter.svg +0 -35
  128. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +0 -1
  129. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  130. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  131. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +0 -1
  132. package/public/oracle-splash/assets/wordmarks/markets.svg +0 -1
  133. package/public/oracle-splash/assets/wordmarks/morpho.svg +0 -1
  134. package/public/oracle-splash/assets/wordmarks/odos.svg +0 -3
  135. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  136. package/public/oracle-splash/assets/wordmarks/oneinch.svg +0 -6
  137. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +0 -17
  138. package/public/oracle-splash/assets/wordmarks/opensea.svg +0 -1
  139. package/public/oracle-splash/assets/wordmarks/outcome.svg +0 -16
  140. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +0 -18
  141. package/public/oracle-splash/assets/wordmarks/paragon.svg +0 -9
  142. package/public/oracle-splash/assets/wordmarks/paraswap.svg +0 -16
  143. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  144. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  145. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  146. package/public/oracle-splash/assets/wordmarks/relay.svg +0 -8
  147. package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
  148. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  149. package/public/oracle-splash/assets/wordmarks/stargate.svg +0 -15
  150. package/public/oracle-splash/assets/wordmarks/uniswap.svg +0 -18
  151. package/public/oracle-splash/assets/wordmarks/velodrome.svg +0 -84
  152. package/public/oracle-splash/assets/wordmarks/xyz.svg +0 -12
  153. package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
  154. package/public/oracle-splash/brand/aave.webp +0 -0
  155. package/public/oracle-splash/brand/aavev2.webp +0 -0
  156. package/public/oracle-splash/brand/aborean.webp +0 -0
  157. package/public/oracle-splash/brand/across.webp +0 -0
  158. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  159. package/public/oracle-splash/brand/afi.webp +0 -0
  160. package/public/oracle-splash/brand/arcus.webp +0 -0
  161. package/public/oracle-splash/brand/aster.webp +0 -0
  162. package/public/oracle-splash/brand/avant.webp +0 -0
  163. package/public/oracle-splash/brand/balancer.webp +0 -0
  164. package/public/oracle-splash/brand/beefy.webp +0 -0
  165. package/public/oracle-splash/brand/benqi.webp +0 -0
  166. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  167. package/public/oracle-splash/brand/bitfi.webp +0 -0
  168. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  169. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  170. package/public/oracle-splash/brand/camelot.webp +0 -0
  171. package/public/oracle-splash/brand/compound.webp +0 -0
  172. package/public/oracle-splash/brand/concrete.webp +0 -0
  173. package/public/oracle-splash/brand/cow.webp +0 -0
  174. package/public/oracle-splash/brand/curve.webp +0 -0
  175. package/public/oracle-splash/brand/derive.webp +0 -0
  176. package/public/oracle-splash/brand/dolomite.webp +0 -0
  177. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  178. package/public/oracle-splash/brand/ekubo.webp +0 -0
  179. package/public/oracle-splash/brand/ethena.webp +0 -0
  180. package/public/oracle-splash/brand/etherfi.webp +0 -0
  181. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  182. package/public/oracle-splash/brand/felix.webp +0 -0
  183. package/public/oracle-splash/brand/fluid.webp +0 -0
  184. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  185. package/public/oracle-splash/brand/folks.webp +0 -0
  186. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  187. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  188. package/public/oracle-splash/brand/gassss.webp +0 -0
  189. package/public/oracle-splash/brand/gmx.webp +0 -0
  190. package/public/oracle-splash/brand/harmonix.webp +0 -0
  191. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  192. package/public/oracle-splash/brand/hlp.webp +0 -0
  193. package/public/oracle-splash/brand/hop.webp +0 -0
  194. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  195. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  196. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  197. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  198. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  199. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  200. package/public/oracle-splash/brand/hypha.webp +0 -0
  201. package/public/oracle-splash/brand/joedex.webp +0 -0
  202. package/public/oracle-splash/brand/jupiter.webp +0 -0
  203. package/public/oracle-splash/brand/kelp.webp +0 -0
  204. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  205. package/public/oracle-splash/brand/kmhype.webp +0 -0
  206. package/public/oracle-splash/brand/kona.webp +0 -0
  207. package/public/oracle-splash/brand/konalend.webp +0 -0
  208. package/public/oracle-splash/brand/lfj.webp +0 -0
  209. package/public/oracle-splash/brand/lido.webp +0 -0
  210. package/public/oracle-splash/brand/lifi.webp +0 -0
  211. package/public/oracle-splash/brand/lighter.webp +0 -0
  212. package/public/oracle-splash/brand/lista.webp +0 -0
  213. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  214. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  215. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  216. package/public/oracle-splash/brand/magiceden.webp +0 -0
  217. package/public/oracle-splash/brand/mempool.png +0 -0
  218. package/public/oracle-splash/brand/meteora.webp +0 -0
  219. package/public/oracle-splash/brand/morpho.webp +0 -0
  220. package/public/oracle-splash/brand/myriad.webp +0 -0
  221. package/public/oracle-splash/brand/noxa.webp +0 -0
  222. package/public/oracle-splash/brand/odos.webp +0 -0
  223. package/public/oracle-splash/brand/oneinch.webp +0 -0
  224. package/public/oracle-splash/brand/openbook.webp +0 -0
  225. package/public/oracle-splash/brand/opensea.webp +0 -0
  226. package/public/oracle-splash/brand/orca.webp +0 -0
  227. package/public/oracle-splash/brand/ordinals.png +0 -0
  228. package/public/oracle-splash/brand/ostium.webp +0 -0
  229. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  230. package/public/oracle-splash/brand/pendle.webp +0 -0
  231. package/public/oracle-splash/brand/perena.webp +0 -0
  232. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  233. package/public/oracle-splash/brand/phoenix.webp +0 -0
  234. package/public/oracle-splash/brand/polymarket.webp +0 -0
  235. package/public/oracle-splash/brand/polynomial.webp +0 -0
  236. package/public/oracle-splash/brand/projectx.webp +0 -0
  237. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  238. package/public/oracle-splash/brand/quickswap.webp +0 -0
  239. package/public/oracle-splash/brand/rain.webp +0 -0
  240. package/public/oracle-splash/brand/raydium.webp +0 -0
  241. package/public/oracle-splash/brand/relay.webp +0 -0
  242. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  243. package/public/oracle-splash/brand/saber.webp +0 -0
  244. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  245. package/public/oracle-splash/brand/sanctum.webp +0 -0
  246. package/public/oracle-splash/brand/satflow.png +0 -0
  247. package/public/oracle-splash/brand/sierra.webp +0 -0
  248. package/public/oracle-splash/brand/sky.webp +0 -0
  249. package/public/oracle-splash/brand/solv.webp +0 -0
  250. package/public/oracle-splash/brand/spark.webp +0 -0
  251. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  252. package/public/oracle-splash/brand/sphere.webp +0 -0
  253. package/public/oracle-splash/brand/ssv.webp +0 -0
  254. package/public/oracle-splash/brand/stabble.webp +0 -0
  255. package/public/oracle-splash/brand/stableswap.webp +0 -0
  256. package/public/oracle-splash/brand/stakewise.webp +0 -0
  257. package/public/oracle-splash/brand/stargate.webp +0 -0
  258. package/public/oracle-splash/brand/sthype.webp +0 -0
  259. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  260. package/public/oracle-splash/brand/unisat.png +0 -0
  261. package/public/oracle-splash/brand/uniswap.webp +0 -0
  262. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  263. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  264. package/public/oracle-splash/brand/unit.webp +0 -0
  265. package/public/oracle-splash/brand/velodrome.webp +0 -0
  266. package/public/oracle-splash/brand/velora.webp +0 -0
  267. package/public/oracle-splash/brand/venus.webp +0 -0
  268. package/public/oracle-splash/brand/wbeth.webp +0 -0
  269. package/public/oracle-splash/brand/xsy.webp +0 -0
  270. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  271. package/public/oracle-splash/brand/zerobase.webp +0 -0
  272. package/public/oracle-splash/brand/zerox.webp +0 -0
  273. package/public/oracle-splash/favicon.ico +0 -0
  274. package/public/oracle-splash/favicon.svg +0 -6
  275. package/public/oracle-splash/index.html +0 -1558
  276. package/public/oracle-splash/mesh-graph.png +0 -0
  277. package/public/oracle-splash/mesh-graph.svg +0 -216
  278. package/scripts/adversarial-bench.mjs +0 -114
  279. package/scripts/build-inscription.py +0 -230
  280. package/scripts/check-doc-drift.mjs +0 -123
  281. package/scripts/check-test-count.mjs +0 -105
  282. package/scripts/e2e-hl-markets.mjs +0 -21
  283. package/scripts/e2e-hl-perps.mjs +0 -48
  284. package/scripts/e2e-hypercore-staking.mjs +0 -128
  285. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  286. package/scripts/protocol-template-gate.mjs +0 -15
  287. package/scripts/public-api-scan.mjs +0 -23
  288. package/scripts/secret-scan.mjs +0 -181
  289. package/scripts/verify-v3-venues.mjs +0 -192
  290. package/skills/balance/SKILL.md +0 -176
  291. package/skills/oracle-action-semantics/SKILL.md +0 -40
  292. package/skills/oracle-best-execution/SKILL.md +0 -127
  293. package/skills/oracle-bitcoin/SKILL.md +0 -53
  294. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  295. package/skills/oracle-chat/SKILL.md +0 -61
  296. package/skills/oracle-chat/chain.SKILL.md +0 -31
  297. package/skills/oracle-chat/setup.SKILL.md +0 -37
  298. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  299. package/skills/oracle-contract-research/SKILL.md +0 -55
  300. package/skills/oracle-desk/SKILL.md +0 -58
  301. package/skills/oracle-dex-launch/SKILL.md +0 -38
  302. package/skills/oracle-grants/SKILL.md +0 -69
  303. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  304. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  305. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  306. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  307. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  308. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  309. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  310. package/skills/oracle-polymarket/SKILL.md +0 -60
  311. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  312. package/skills/oracle-protocol-security/SKILL.md +0 -60
  313. package/skills/oracle-public-product/SKILL.md +0 -44
  314. package/skills/oracle-receipts/SKILL.md +0 -52
  315. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  316. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  317. package/skills/oracle-solana/SKILL.md +0 -65
  318. package/skills/oracle-solana-nft/SKILL.md +0 -54
  319. package/skills/oracle-token-research/SKILL.md +0 -67
  320. package/skins/oracle.yaml +0 -56
  321. package/src/action-receipts.mjs +0 -265
  322. package/src/action-semantics.mjs +0 -62
  323. package/src/address-book.mjs +0 -208
  324. package/src/agent-auth.mjs +0 -206
  325. package/src/approval-guard.mjs +0 -282
  326. package/src/attestation-secret.mjs +0 -88
  327. package/src/audit-log.mjs +0 -196
  328. package/src/auth/oauth.mjs +0 -672
  329. package/src/auto-slippage.mjs +0 -378
  330. package/src/capability-posture.mjs +0 -125
  331. package/src/chains.mjs +0 -62
  332. package/src/cli/chain-catalog.mjs +0 -215
  333. package/src/cli/chain-state.mjs +0 -74
  334. package/src/cli/commands/auth.mjs +0 -193
  335. package/src/cli/commands/bootstrap.mjs +0 -87
  336. package/src/cli/commands/chain.mjs +0 -143
  337. package/src/cli/commands/chat.mjs +0 -434
  338. package/src/cli/commands/credential.mjs +0 -9
  339. package/src/cli/commands/data-mcp.mjs +0 -18
  340. package/src/cli/commands/data.mjs +0 -75
  341. package/src/cli/commands/doctor.mjs +0 -136
  342. package/src/cli/commands/help.mjs +0 -7
  343. package/src/cli/commands/init.mjs +0 -27
  344. package/src/cli/commands/mcp.mjs +0 -142
  345. package/src/cli/commands/model.mjs +0 -99
  346. package/src/cli/commands/prepare.mjs +0 -12
  347. package/src/cli/commands/public.mjs +0 -20
  348. package/src/cli/commands/route.mjs +0 -12
  349. package/src/cli/commands/runner.mjs +0 -9
  350. package/src/cli/commands/scan.mjs +0 -12
  351. package/src/cli/commands/setup.mjs +0 -275
  352. package/src/cli/commands/sign.mjs +0 -21
  353. package/src/cli/commands/signer.mjs +0 -9
  354. package/src/cli/commands/upgrade.mjs +0 -12
  355. package/src/cli/commands/vault.mjs +0 -9
  356. package/src/cli/commands/version.mjs +0 -22
  357. package/src/cli/first-run.mjs +0 -23
  358. package/src/cli/kernel.mjs +0 -239
  359. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  360. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  361. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  362. package/src/cli/mcp-targets/codex.mjs +0 -41
  363. package/src/cli/mcp-targets/shared.mjs +0 -61
  364. package/src/cli/messaging-platforms.mjs +0 -209
  365. package/src/cli/model-config.mjs +0 -70
  366. package/src/cli/operator-dispatch.mjs +0 -258
  367. package/src/cli/oracle-harness.py +0 -415
  368. package/src/cli/paths.mjs +0 -83
  369. package/src/cli/runtime.mjs +0 -351
  370. package/src/cli/setup-state.mjs +0 -168
  371. package/src/cli/spawn-child.mjs +0 -43
  372. package/src/data/catalog.mjs +0 -585
  373. package/src/data/desk-data.mjs +0 -695
  374. package/src/data/http.mjs +0 -253
  375. package/src/data/provider-endpoint.mjs +0 -94
  376. package/src/data/providers/aerodrome.mjs +0 -245
  377. package/src/data/providers/balancer.mjs +0 -209
  378. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  379. package/src/data/providers/bitcoin-meta.mjs +0 -378
  380. package/src/data/providers/blockscout.mjs +0 -14
  381. package/src/data/providers/bridges.mjs +0 -242
  382. package/src/data/providers/cowswap.mjs +0 -415
  383. package/src/data/providers/curve.mjs +0 -201
  384. package/src/data/providers/defillama.mjs +0 -88
  385. package/src/data/providers/dexscreener.mjs +0 -43
  386. package/src/data/providers/evm-rpc.mjs +0 -225
  387. package/src/data/providers/geckoterminal.mjs +0 -34
  388. package/src/data/providers/gmx.mjs +0 -496
  389. package/src/data/providers/hl-assets.mjs +0 -165
  390. package/src/data/providers/hl-info.mjs +0 -108
  391. package/src/data/providers/hl-markets.mjs +0 -210
  392. package/src/data/providers/hl-outcome.mjs +0 -61
  393. package/src/data/providers/hl-perps.mjs +0 -387
  394. package/src/data/providers/hl-staking.mjs +0 -353
  395. package/src/data/providers/hl-ws.mjs +0 -119
  396. package/src/data/providers/hyperevm-dex.mjs +0 -49
  397. package/src/data/providers/jupiter-venues.mjs +0 -119
  398. package/src/data/providers/jupiter.mjs +0 -315
  399. package/src/data/providers/lifi.mjs +0 -151
  400. package/src/data/providers/magiceden-sol.mjs +0 -406
  401. package/src/data/providers/morpho.mjs +0 -177
  402. package/src/data/providers/nft-gallery.mjs +0 -163
  403. package/src/data/providers/nft-portfolio.mjs +0 -494
  404. package/src/data/providers/odos.mjs +0 -156
  405. package/src/data/providers/oneinch.mjs +0 -174
  406. package/src/data/providers/opensea-multichain.mjs +0 -136
  407. package/src/data/providers/opensea-nft.mjs +0 -371
  408. package/src/data/providers/paraswap.mjs +0 -118
  409. package/src/data/providers/pendle.mjs +0 -188
  410. package/src/data/providers/poly-clob.mjs +0 -283
  411. package/src/data/providers/poly-public.mjs +0 -96
  412. package/src/data/providers/poly-ws.mjs +0 -103
  413. package/src/data/providers/portfolio-history.mjs +0 -394
  414. package/src/data/providers/portfolio.mjs +0 -594
  415. package/src/data/providers/rfq.mjs +0 -15
  416. package/src/data/providers/rh-agent.mjs +0 -59
  417. package/src/data/providers/satflow.mjs +0 -341
  418. package/src/data/providers/signed-material-guard.mjs +0 -108
  419. package/src/data/providers/solana-rpc.mjs +0 -197
  420. package/src/data/providers/uniswap-v3.mjs +0 -349
  421. package/src/data/providers/uniswap-v4.mjs +0 -414
  422. package/src/data/providers/zerox.mjs +0 -167
  423. package/src/data/public-api-scan.mjs +0 -61
  424. package/src/data/quote-placeholder.mjs +0 -31
  425. package/src/exact-integer.mjs +0 -72
  426. package/src/exec-policy.mjs +0 -455
  427. package/src/flags.mjs +0 -15
  428. package/src/fresh-window.mjs +0 -76
  429. package/src/gmx-attestation.mjs +0 -176
  430. package/src/index.mjs +0 -100
  431. package/src/nft-gas-war-guard.mjs +0 -139
  432. package/src/onboarding/agent-keys.mjs +0 -161
  433. package/src/onboarding/harness-configs.mjs +0 -102
  434. package/src/onboarding/index.mjs +0 -18
  435. package/src/onboarding/tiers.mjs +0 -139
  436. package/src/oracle-env.mjs +0 -47
  437. package/src/portfolio-risk.mjs +0 -170
  438. package/src/prepare-envelope.mjs +0 -204
  439. package/src/profile-upgrade.mjs +0 -277
  440. package/src/protocol-execution.mjs +0 -84
  441. package/src/protocol-templates/gate.mjs +0 -179
  442. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  443. package/src/public-api/buzz-integration.mjs +0 -256
  444. package/src/public-api/connect-agent.mjs +0 -416
  445. package/src/public-api/grants.mjs +0 -142
  446. package/src/public-api/http.mjs +0 -389
  447. package/src/public-control/aa-adapter.mjs +0 -402
  448. package/src/public-control/build-registry.mjs +0 -227
  449. package/src/public-control/bundler-client.mjs +0 -357
  450. package/src/public-control/grant-indexer.mjs +0 -296
  451. package/src/public-control/policy-render.mjs +0 -69
  452. package/src/public-control/policy-schema.mjs +0 -318
  453. package/src/public-control/runtime-config.mjs +0 -275
  454. package/src/public-control/session-key-model.mjs +0 -374
  455. package/src/public-control/session-orchestrator.mjs +0 -412
  456. package/src/rfq/intent.mjs +0 -180
  457. package/src/rfq/sources.mjs +0 -181
  458. package/src/route-attestation.mjs +0 -132
  459. package/src/router/best-execution.mjs +0 -326
  460. package/src/router/index.mjs +0 -226
  461. package/src/router/prepare-bridge.mjs +0 -289
  462. package/src/router/prepare-route.mjs +0 -398
  463. package/src/router/proposal.mjs +0 -311
  464. package/src/router/risk-classifier.mjs +0 -119
  465. package/src/router/route-sources.mjs +0 -364
  466. package/src/scanner/chains.config.mjs +0 -430
  467. package/src/scanner/contract.mjs +0 -270
  468. package/src/scanner/evm-scanner.mjs +0 -394
  469. package/src/scanner/index.mjs +0 -9
  470. package/src/scanner/v2-venue.mjs +0 -335
  471. package/src/scanner/v3-venue.mjs +0 -290
  472. package/src/scopes.mjs +0 -44
  473. package/src/sell-simulation.mjs +0 -167
  474. package/src/signals/engine.mjs +0 -146
  475. package/src/signals/index.mjs +0 -1
  476. package/src/token-transfer-guard.mjs +0 -188
  477. package/src/tui/app.mjs +0 -438
  478. package/src/tui/backend.mjs +0 -145
  479. package/src/tui/format.mjs +0 -272
  480. package/src/tui/gateway-client.mjs +0 -177
  481. package/src/tui/input.mjs +0 -501
  482. package/src/tui/renderer.mjs +0 -443
  483. package/src/tui/standalone-client.mjs +0 -666
  484. package/src/tui/theme.mjs +0 -81
  485. package/src/vault-attestation.mjs +0 -146
  486. package/src/venues.mjs +0 -206
  487. package/src/watch-preferences.mjs +0 -85
package/src/tui/app.mjs DELETED
@@ -1,438 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- import { activeChainEnv } from "../cli/chain-state.mjs";
3
- import { createGatewayClient } from "./gateway-client.mjs";
4
- import { createInput } from "./input.mjs";
5
- import { createRenderer } from "./renderer.mjs";
6
- import {
7
- formatElapsed,
8
- renderBanner,
9
- renderBox,
10
- renderStatusBar,
11
- visibleWidth,
12
- wrapText,
13
- } from "./format.mjs";
14
- import { createPalette, THEME } from "./theme.mjs";
15
-
16
- const LIVE_TAIL_LINES = 6;
17
-
18
- function parseChatArgs(args = []) {
19
- const out = { pass: [], query: null, model: null, provider: null, quiet: false, cont: false };
20
- for (let i = 0; i < args.length; i += 1) {
21
- const a = args[i];
22
- if ((a === "-q" || a === "--query") && args[i + 1]) {
23
- out.query = args[++i];
24
- out.pass.push("-q", out.query);
25
- continue;
26
- }
27
- if ((a === "--model" || a === "-m") && args[i + 1]) {
28
- out.model = args[++i];
29
- out.pass.push("--model", out.model);
30
- continue;
31
- }
32
- if (a === "--provider" && args[i + 1]) {
33
- out.provider = args[++i];
34
- out.pass.push("--provider", out.provider);
35
- continue;
36
- }
37
- if (a === "--quiet" || a === "-Q") {
38
- out.quiet = true;
39
- out.pass.push(a);
40
- continue;
41
- }
42
- if (a === "--continue" || a === "-c") {
43
- out.cont = true;
44
- out.pass.push("--continue");
45
- continue;
46
- }
47
- out.pass.push(a);
48
- }
49
- return out;
50
- }
51
-
52
- export function applyUsage(state, usage) {
53
- if (!usage || typeof usage !== "object") return;
54
- const used = Number(usage.context_used ?? usage.context_tokens ?? usage.input ?? usage.prompt);
55
- const max = Number(usage.context_max ?? usage.context_length);
56
- if (Number.isFinite(used) && used > 0) state.contextTokens = used;
57
- if (Number.isFinite(max) && max > 0) state.contextLength = max;
58
- const percent = Number(usage.context_percent);
59
- if (Number.isFinite(percent)) state.contextPercent = percent;
60
- else if (state.contextLength > 0) {
61
- state.contextPercent = Math.round((state.contextTokens / state.contextLength) * 100);
62
- }
63
- }
64
-
65
- export function composerLines(state) {
66
- const width = state.width;
67
- const label = `${state.promptLabel} `;
68
- const room = Math.max(1, width - 2 - visibleWidth(label));
69
- const buffer = state.buffer || "";
70
- const cursor = Math.max(0, Math.min(state.cursor ?? buffer.length, buffer.length));
71
- let start = 0;
72
- if (cursor > room) start = cursor - room;
73
- const view = buffer.slice(start, start + room);
74
- const rel = cursor - start;
75
- const head = view.slice(0, rel);
76
- const at = view.slice(rel, rel + 1) || " ";
77
- const tail = view.slice(rel + 1);
78
- const palette = state.palette;
79
- const painted = `${palette.fg(THEME.accent, label)}${head}${palette.bg(THEME.selection_bg, at)}${tail}`;
80
- return [painted];
81
- }
82
-
83
- export function fixedLines(state) {
84
- const width = state.width;
85
- const out = [];
86
-
87
- if (state.liveLines.length > 0) {
88
- for (const line of state.liveLines.slice(-LIVE_TAIL_LINES)) out.push(line);
89
- out.push("");
90
- }
91
-
92
- out.push(...renderBox({
93
- lines: composerLines(state),
94
- width,
95
- palette: state.palette,
96
- title: "Ask Oracle ›",
97
- }));
98
-
99
- out.push(renderStatusBar({
100
- model: state.model,
101
- contextTokens: state.contextTokens,
102
- contextLength: state.contextLength,
103
- percent: state.contextPercent,
104
- effort: state.effort,
105
- thinking: state.thinking,
106
- chain: state.chain,
107
- width,
108
- palette: state.palette,
109
- }));
110
- return out;
111
- }
112
-
113
- function eventShape(frame) {
114
- const params = frame?.params || frame || {};
115
- return {
116
- type: params.type || frame?.type || "",
117
- sessionId: params.session_id || frame?.session_id || "",
118
- payload: params.payload || frame?.payload || {},
119
- };
120
- }
121
-
122
- function textPayload(payload = {}) {
123
- if (typeof payload.text === "string") return payload.text;
124
- if (typeof payload.rendered === "string") return payload.rendered;
125
- if (typeof payload.message === "string") return payload.message;
126
- return "";
127
- }
128
-
129
- export function createOracleTui(options = {}) {
130
- const stdout = options.stdout || process.stdout;
131
- const stdin = options.stdin || process.stdin;
132
- const width = Math.max(20, Number(stdout.columns || options.columns || 80));
133
- const palette = options.palette || createPalette({ color: stdout.isTTY !== false });
134
- const renderer = options.renderer || createRenderer({ stdout, rows: stdout.rows, columns: width });
135
- const client = options.client || createGatewayClient({
136
- python: options.python,
137
- pythonArgs: options.pythonArgs || [],
138
- cwd: options.cwd || process.cwd(),
139
- env: options.env || process.env,
140
- spawnFn: options.spawnFn,
141
- startupTimeoutMs: options.startupTimeoutMs,
142
- requestTimeoutMs: options.requestTimeoutMs,
143
- });
144
- const emitter = new EventEmitter();
145
- const now = options.now || (() => Date.now());
146
- const state = {
147
- palette,
148
- width,
149
- promptLabel: "oracle ›",
150
- buffer: "",
151
- cursor: 0,
152
- model: options.model || "model",
153
- contextTokens: 0,
154
- contextLength: 0,
155
- contextPercent: 0,
156
- effort: options.effort || "",
157
- thinking: "0s",
158
- chain: (options.env || process.env).ORACLE_ACTIVE_CHAIN || "",
159
- busy: false,
160
- cancelled: false,
161
- sessionId: null,
162
- assistantBuffer: "",
163
- flushedLines: 0,
164
- liveLines: [],
165
- startedAt: 0,
166
- };
167
- let input = null;
168
- let ticker = null;
169
-
170
- const ui = { renderer, state };
171
-
172
- function renderNow() {
173
- renderer.render(fixedLines(state));
174
- }
175
-
176
- function emitLine(text) {
177
- renderer.writeAbove(`${text}\n`);
178
- }
179
-
180
- function recomputeLive() {
181
- const parts = state.assistantBuffer.split("\n");
182
- const partial = parts[parts.length - 1] || "";
183
- state.liveLines = partial ? wrapText(partial, state.width) : [];
184
- }
185
-
186
- function flushAssistant({ final = false } = {}) {
187
- const parts = state.assistantBuffer.split("\n");
188
- const ready = final ? parts.length : parts.length - 1;
189
- let wrote = false;
190
- while (state.flushedLines < ready) {
191
- const line = parts[state.flushedLines];
192
- for (const wrapped of wrapText(line, state.width)) emitLine(wrapped);
193
- state.flushedLines += 1;
194
- wrote = true;
195
- }
196
- if (final) state.liveLines = [];
197
- else recomputeLive();
198
- return wrote;
199
- }
200
-
201
- function startTicker() {
202
- if (ticker) return;
203
- ticker = setInterval(() => {
204
- if (!state.busy) return;
205
- state.thinking = formatElapsed(now() - state.startedAt);
206
- renderNow();
207
- }, 250);
208
- if (typeof ticker.unref === "function") ticker.unref();
209
- }
210
-
211
- function stopTicker() {
212
- if (!ticker) return;
213
- clearInterval(ticker);
214
- ticker = null;
215
- }
216
-
217
- async function submit(text) {
218
- const value = String(text || "").trim();
219
- if (!value) return;
220
- if (value === "/exit" || value === "/quit") {
221
- await stop();
222
- return;
223
- }
224
- if (value === "/clear") {
225
- renderer.clear();
226
- for (const line of renderBanner({ width: state.width, palette })) emitLine(line);
227
- renderNow();
228
- return;
229
- }
230
- state.busy = true;
231
- state.assistantBuffer = "";
232
- state.flushedLines = 0;
233
- state.liveLines = [];
234
- state.startedAt = now();
235
- state.thinking = "0s";
236
- emitLine(`${palette.bold(palette.fg(THEME.prompt, "you"))} ${value}`);
237
- emitLine("");
238
- startTicker();
239
- renderNow();
240
- await client.request("prompt.submit", { session_id: state.sessionId, text: value });
241
- }
242
-
243
- function handleEvent(frame) {
244
- const event = eventShape(frame);
245
- if (event.type === "gateway.ready") return;
246
-
247
- if (event.type === "session.info" && event.payload) {
248
- if (event.payload.model) state.model = event.payload.model;
249
- if (event.payload.reasoning_effort) state.effort = event.payload.reasoning_effort;
250
- applyUsage(state, event.payload.usage);
251
- renderNow();
252
- return;
253
- }
254
- if (event.type === "message.start") {
255
- state.busy = true;
256
- state.cancelled = false;
257
- state.assistantBuffer = "";
258
- state.flushedLines = 0;
259
- state.liveLines = [];
260
- emitLine(palette.bold(palette.fg(THEME.accent, "oracle")));
261
- renderNow();
262
- return;
263
- }
264
- if (event.type === "thinking.delta" || event.type === "reasoning.delta") {
265
- if (state.cancelled) return;
266
- const text = textPayload(event.payload).trim();
267
- if (text) state.thinking = `${formatElapsed(now() - state.startedAt)}`;
268
- renderNow();
269
- return;
270
- }
271
- if (event.type === "message.delta") {
272
- if (state.cancelled) return;
273
- state.assistantBuffer += textPayload(event.payload);
274
- flushAssistant();
275
- renderNow();
276
- return;
277
- }
278
- if (event.type === "message.complete") {
279
- if (state.cancelled) {
280
- state.cancelled = false;
281
- return;
282
- }
283
- const finalText = textPayload(event.payload);
284
- if (finalText && finalText.length >= state.assistantBuffer.length) {
285
- state.assistantBuffer = finalText;
286
- }
287
- flushAssistant({ final: true });
288
- emitLine("");
289
- state.busy = false;
290
- stopTicker();
291
- applyUsage(state, event.payload?.usage || event.payload?.context);
292
- state.thinking = formatElapsed(now() - state.startedAt);
293
- renderNow();
294
- return;
295
- }
296
- if (event.type === "error") {
297
- state.busy = false;
298
- stopTicker();
299
- emitLine(palette.fg(THEME.error, `error: ${textPayload(event.payload) || "unknown"}`));
300
- renderNow();
301
- }
302
- }
303
-
304
- async function start() {
305
- await client.start();
306
- client.on("event", handleEvent);
307
- client.on("log", (line) => emitter.emit("log", line));
308
- client.on("error", (error) => emitter.emit("error", error));
309
- const session = await client.request("session.create", {
310
- cols: state.width,
311
- cwd: options.cwd || process.cwd(),
312
- source: "cli",
313
- profile: options.profile || "oracle",
314
- close_on_disconnect: true,
315
- ...(options.model ? { model: options.model } : {}),
316
- ...(options.provider ? { provider: options.provider } : {}),
317
- });
318
- state.sessionId = session.session_id;
319
- state.model = session.info?.model || state.model;
320
- if (session.info?.reasoning_effort) state.effort = session.info.reasoning_effort;
321
- applyUsage(state, session.info?.usage);
322
- for (const line of renderBanner({ width: state.width, palette })) emitLine(line);
323
- emitLine("");
324
- renderNow();
325
- input = createInput({
326
- stdin,
327
- stdout,
328
- onSubmit: (value) => { submit(value).catch((error) => emitter.emit("error", error)); },
329
- onCancel: () => {
330
- if (!state.busy) return;
331
- state.busy = false;
332
- state.cancelled = true;
333
- stopTicker();
334
- flushAssistant({ final: true });
335
- emitLine(palette.fg(THEME.warn, "interrupted"));
336
- emitLine("");
337
- renderNow();
338
- client.request("session.interrupt", { session_id: state.sessionId })
339
- .catch((error) => emitter.emit("error", error));
340
- },
341
- onEof: () => { stop().catch((error) => emitter.emit("error", error)); },
342
- onClear: () => {
343
- renderer.clear();
344
- renderNow();
345
- },
346
- onRender: (editorState) => {
347
- state.buffer = editorState.buffer || "";
348
- state.cursor = editorState.cursor ?? state.buffer.length;
349
- renderNow();
350
- },
351
- });
352
- input.start();
353
- }
354
-
355
- async function stop() {
356
- stopTicker();
357
- if (input) input.stop();
358
- renderer.dispose();
359
- await client.stop();
360
- emitter.emit("stop");
361
- }
362
-
363
- return Object.freeze({
364
- start,
365
- stop,
366
- on: emitter.on.bind(emitter),
367
- off: emitter.off.bind(emitter),
368
- state,
369
- handleEvent,
370
- submit,
371
- });
372
- }
373
-
374
- export async function runOracleTui({
375
- hermesPython,
376
- client,
377
- tuiFactory = createOracleTui,
378
- args = [],
379
- env = process.env,
380
- cwd = process.cwd(),
381
- stdout = process.stdout,
382
- stdin = process.stdin,
383
- } = {}) {
384
- const parsed = parseChatArgs(args);
385
- if (parsed.query) return { native: false, pass: parsed.pass };
386
- if (!stdin.isTTY || !stdout.isTTY) return { native: false, pass: parsed.pass };
387
- if (env.ORACLE_NATIVE_TUI === "0") return { native: false, pass: parsed.pass };
388
- const invocation = hermesPython;
389
- if (!client && !invocation) return { native: false, pass: parsed.pass };
390
- const cleanEnv = activeChainEnv({
391
- ...env,
392
- ORACLE_CHAT_SURFACE: "1",
393
- ORACLE_PROFILE: "oracle",
394
- ORACLE_NODE_BIN: process.execPath,
395
- });
396
- const tui = tuiFactory({
397
- ...(client ? { client } : {}),
398
- ...(invocation ? {
399
- python: invocation.command,
400
- pythonArgs: invocation.prefix || [],
401
- } : {}),
402
- cwd,
403
- env: cleanEnv,
404
- stdin,
405
- stdout,
406
- model: parsed.model,
407
- provider: parsed.provider,
408
- profile: "oracle",
409
- });
410
- tui.on("log", (line) => {
411
- if (env.ORACLE_CLI_DEBUG) process.stderr.write(`${line}\n`);
412
- });
413
- tui.on("error", (error) => {
414
- process.stderr.write(`oracle chat: ${error.message}\n`);
415
- });
416
- await tui.start();
417
- return new Promise((resolve) => {
418
- let done = false;
419
- const finish = async () => {
420
- if (done) return;
421
- done = true;
422
- await tui.stop();
423
- resolve({ native: true, code: 0 });
424
- };
425
- tui.on("stop", () => {
426
- if (done) return;
427
- done = true;
428
- resolve({ native: true, code: 0 });
429
- });
430
- process.once("SIGINT", finish);
431
- process.once("SIGTERM", finish);
432
- });
433
- }
434
-
435
- export default {
436
- createOracleTui,
437
- runOracleTui,
438
- };
@@ -1,145 +0,0 @@
1
- const PROVIDERS = Object.freeze({
2
- openrouter: {
3
- key: "OPENROUTER_API_KEY",
4
- baseUrl: "https://openrouter.ai/api/v1",
5
- model: "openrouter/auto",
6
- },
7
- openai: {
8
- key: "OPENAI_API_KEY",
9
- baseUrl: "https://api.openai.com/v1",
10
- model: "gpt-4.1-mini",
11
- },
12
- xai: {
13
- key: "XAI_API_KEY",
14
- baseUrl: "https://api.x.ai/v1",
15
- model: "grok-4-latest",
16
- },
17
- deepseek: {
18
- key: "DEEPSEEK_API_KEY",
19
- baseUrl: "https://api.deepseek.com/v1",
20
- model: "deepseek-chat",
21
- },
22
- gemini: {
23
- key: "GEMINI_API_KEY",
24
- alternateKey: "GOOGLE_API_KEY",
25
- baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
26
- model: "gemini-2.5-flash",
27
- },
28
- });
29
-
30
- const OAUTH_PROVIDERS = Object.freeze({
31
- "anthropic-oauth": {
32
- baseUrl: "https://api.anthropic.com/v1",
33
- model: "claude-sonnet-4-6",
34
- protocol: "anthropic-messages",
35
- },
36
- "openai-codex": {
37
- baseUrl: "https://chatgpt.com/backend-api/codex",
38
- model: "gpt-5.6-sol",
39
- protocol: "responses",
40
- },
41
- "xai-oauth": {
42
- baseUrl: "https://api.x.ai/v1",
43
- model: "grok-4.5",
44
- protocol: "responses",
45
- },
46
- });
47
-
48
- function positiveInteger(value, fallback) {
49
- const parsed = Number.parseInt(String(value || ""), 10);
50
- return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
51
- }
52
-
53
- function providerFromEnv(env, stored = {}) {
54
- const explicit = String(env.ORACLE_PROVIDER || stored.provider || "").trim().toLowerCase();
55
- if (explicit) return explicit;
56
- if (env.ORACLE_BASE_URL) return "custom";
57
- for (const [name, preset] of Object.entries(PROVIDERS)) {
58
- if (env[preset.key] || (preset.alternateKey && env[preset.alternateKey])) return name;
59
- }
60
- return null;
61
- }
62
-
63
- export function standaloneConfigFromEnv(
64
- env = process.env,
65
- stored = {},
66
- oauthAvailable = () => false,
67
- apiKeyResolver = () => "",
68
- ) {
69
- const provider = providerFromEnv(env, stored);
70
- if (!provider) return null;
71
-
72
- const oauthPreset = OAUTH_PROVIDERS[provider];
73
- const preset = PROVIDERS[provider] || oauthPreset;
74
- const apiKeyEnv = String(env.ORACLE_API_KEY_ENV || stored.apiKeyEnv || "");
75
- const apiKey = String(
76
- env.ORACLE_API_KEY ||
77
- (apiKeyEnv && env[apiKeyEnv]) ||
78
- (preset && (env[preset.key] || (preset.alternateKey && env[preset.alternateKey]))) ||
79
- apiKeyResolver(provider) ||
80
- "",
81
- );
82
- const baseUrl = String(
83
- oauthPreset
84
- ? oauthPreset.baseUrl
85
- : provider === "custom"
86
- ? (env.ORACLE_BASE_URL || stored.baseUrl || "")
87
- : (preset?.baseUrl || ""),
88
- ).replace(/\/+$/, "");
89
- const model = String(env.ORACLE_MODEL || stored.model || preset?.model || "");
90
- if (!baseUrl || !model) return null;
91
- const hasOAuth = Boolean(oauthPreset && oauthAvailable(provider));
92
- if (oauthPreset && !hasOAuth) return null;
93
- if (!oauthPreset && provider !== "custom" && !apiKey) return null;
94
-
95
- return {
96
- kind: "standalone",
97
- provider,
98
- model,
99
- baseUrl,
100
- ...(hasOAuth ? { authType: "oauth", protocol: oauthPreset.protocol } : { apiKey }),
101
- contextLength: positiveInteger(env.ORACLE_CONTEXT_LENGTH || stored.contextLength, 128000),
102
- reasoningEffort: String(env.ORACLE_REASONING_EFFORT || stored.reasoningEffort || "high"),
103
- };
104
- }
105
-
106
- function setupReason(extra = "") {
107
- return [
108
- "Oracle standalone chat does not require Hermes.",
109
- "Set OPENROUTER_API_KEY, run `oracle auth login claude|codex|grok`, or configure a custom OpenAI-compatible endpoint.",
110
- "If Hermes is installed, Oracle will reuse it automatically.",
111
- extra,
112
- ].filter(Boolean).join("\n");
113
- }
114
-
115
- export function resolveChatBackend({
116
- env = process.env,
117
- hermes = { ok: false },
118
- storedConfig = null,
119
- oauthAvailable = () => false,
120
- apiKeyResolver = () => "",
121
- } = {}) {
122
- const requested = String(env.ORACLE_CHAT_BACKEND || storedConfig?.backend || "auto").trim().toLowerCase();
123
- const standalone = standaloneConfigFromEnv(env, storedConfig || {}, oauthAvailable, apiKeyResolver);
124
-
125
- if (requested === "standalone") {
126
- return standalone
127
- ? { kind: "standalone", config: standalone }
128
- : { kind: "unconfigured", reason: setupReason("ORACLE_CHAT_BACKEND=standalone was requested, but no standalone model is configured.") };
129
- }
130
-
131
- if (requested === "hermes") {
132
- return hermes?.ok
133
- ? { kind: "hermes", bin: hermes.bin }
134
- : { kind: "unconfigured", reason: setupReason("ORACLE_CHAT_BACKEND=hermes was requested, but Hermes was not found.") };
135
- }
136
-
137
- if (requested !== "auto") {
138
- return { kind: "unconfigured", reason: setupReason(`Unknown ORACLE_CHAT_BACKEND value: ${requested}`) };
139
- }
140
- if (hermes?.ok) return { kind: "hermes", bin: hermes.bin };
141
- if (standalone) return { kind: "standalone", config: standalone };
142
- return { kind: "unconfigured", reason: setupReason() };
143
- }
144
-
145
- export default { resolveChatBackend, standaloneConfigFromEnv };