@oracle-agent/oracle 0.14.1 → 0.15.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 (447) hide show
  1. package/README.md +2 -2
  2. package/SETUP.md +4 -4
  3. package/dist/action-receipts.mjs +1 -0
  4. package/dist/action-semantics.mjs +1 -0
  5. package/dist/address-book.mjs +2 -0
  6. package/dist/bin/desk-server.mjs +59 -0
  7. package/dist/bin/oracle-data-mcp.mjs +8 -0
  8. package/dist/bin/oracle-equities.mjs +20 -0
  9. package/dist/bin/oracle-init.mjs +24 -0
  10. package/dist/bin/oracle-public-server.mjs +5 -0
  11. package/dist/bin/oracle-route.mjs +22 -0
  12. package/dist/bin/oracle-scan.mjs +18 -0
  13. package/dist/bin/oracle-upgrade.mjs +21 -0
  14. package/dist/bin/oracle.mjs +61 -0
  15. package/dist/chains.mjs +1 -0
  16. package/dist/cli/commands/auth.mjs +16 -0
  17. package/dist/cli/commands/bootstrap.mjs +18 -0
  18. package/dist/cli/commands/chain.mjs +21 -0
  19. package/dist/cli/commands/chat.mjs +45 -0
  20. package/dist/cli/commands/credential.mjs +1 -0
  21. package/dist/cli/commands/data-mcp.mjs +2 -0
  22. package/dist/cli/commands/data.mjs +12 -0
  23. package/dist/cli/commands/doctor.mjs +5 -0
  24. package/dist/cli/commands/equities.mjs +15 -0
  25. package/dist/cli/commands/farm.mjs +59 -0
  26. package/dist/cli/commands/fees.mjs +10 -0
  27. package/dist/cli/commands/follow.mjs +28 -0
  28. package/dist/cli/commands/harness.mjs +15 -0
  29. package/dist/cli/commands/help.mjs +1 -0
  30. package/dist/cli/commands/init.mjs +3 -0
  31. package/dist/cli/commands/mcp.mjs +36 -0
  32. package/dist/cli/commands/model.mjs +54 -0
  33. package/dist/cli/commands/plugins.mjs +43 -0
  34. package/dist/cli/commands/prepare.mjs +2 -0
  35. package/dist/cli/commands/public.mjs +3 -0
  36. package/dist/cli/commands/resolve.mjs +23 -0
  37. package/dist/cli/commands/route.mjs +2 -0
  38. package/dist/cli/commands/runner.mjs +1 -0
  39. package/dist/cli/commands/scan.mjs +2 -0
  40. package/dist/cli/commands/setup.mjs +34 -0
  41. package/dist/cli/commands/sign.mjs +4 -0
  42. package/dist/cli/commands/signer.mjs +1 -0
  43. package/dist/cli/commands/swap.mjs +36 -0
  44. package/dist/cli/commands/upgrade.mjs +2 -0
  45. package/dist/cli/commands/vault.mjs +1 -0
  46. package/dist/cli/commands/version.mjs +2 -0
  47. package/dist/data/desk-data.mjs +55 -0
  48. package/dist/data/names.mjs +2 -0
  49. package/dist/data/providers/farming.mjs +2 -0
  50. package/dist/equities/index.mjs +1 -0
  51. package/dist/index.mjs +60 -0
  52. package/dist/nft-gas-war-guard.mjs +1 -0
  53. package/dist/onboarding/harness-configs.mjs +4 -0
  54. package/dist/portfolio-risk.mjs +1 -0
  55. package/dist/prepare-envelope.mjs +1 -0
  56. package/dist/public-api/agent-grants.mjs +3 -0
  57. package/dist/public-control/policy-schema.mjs +1 -0
  58. package/dist/router/index.mjs +2 -0
  59. package/dist/scanner/index.mjs +4 -0
  60. package/dist/signals/index.mjs +1 -0
  61. package/dist/watch-preferences.mjs +1 -0
  62. package/package.json +32 -78
  63. package/public/oracle-splash/_variants/ice.html +5 -18
  64. package/public/oracle-splash/_variants/ivory.html +5 -18
  65. package/public/oracle-splash/index.html +114 -34
  66. package/CONTRIBUTING.md +0 -99
  67. package/bin/desk-server.mjs +0 -473
  68. package/bin/oracle-data-mcp.mjs +0 -1252
  69. package/bin/oracle-equities.mjs +0 -168
  70. package/bin/oracle-init.mjs +0 -525
  71. package/bin/oracle-public-server.mjs +0 -36
  72. package/bin/oracle-route.mjs +0 -254
  73. package/bin/oracle-scan.mjs +0 -192
  74. package/bin/oracle-upgrade.mjs +0 -42
  75. package/bin/oracle.mjs +0 -34
  76. package/docs/adding-a-chain.md +0 -229
  77. package/docs/architecture.md +0 -139
  78. package/docs/buzz-integration.md +0 -115
  79. package/docs/cli.md +0 -143
  80. package/docs/connectors.md +0 -13
  81. package/docs/hyperliquid-builder-code.md +0 -50
  82. package/docs/locals-only-fee-waiver.md +0 -34
  83. package/docs/oracle-pack-standard.md +0 -29
  84. package/docs/profiles.md +0 -151
  85. package/docs/public-surface.md +0 -206
  86. package/examples/add-a-chain.mjs +0 -65
  87. package/examples/oracle-pack-template.mjs +0 -38
  88. package/examples/research-a-token.mjs +0 -70
  89. package/plugins/oracle-owner-gate/__init__.py +0 -288
  90. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  91. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  92. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  93. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  94. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  95. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  96. package/scripts/adversarial-bench.mjs +0 -114
  97. package/scripts/build-dist.mjs +0 -119
  98. package/scripts/build-inscription.py +0 -230
  99. package/scripts/check-doc-drift.mjs +0 -123
  100. package/scripts/check-test-count.mjs +0 -105
  101. package/scripts/e2e-hl-markets.mjs +0 -21
  102. package/scripts/e2e-hl-perps.mjs +0 -48
  103. package/scripts/e2e-hypercore-staking.mjs +0 -128
  104. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  105. package/scripts/guard-publish.mjs +0 -22
  106. package/scripts/protocol-template-gate.mjs +0 -15
  107. package/scripts/public-api-scan.mjs +0 -23
  108. package/scripts/publish-dist.mjs +0 -67
  109. package/scripts/record-hero-cli.sh +0 -80
  110. package/scripts/secret-scan.mjs +0 -169
  111. package/scripts/smoke-dist-bins.mjs +0 -89
  112. package/scripts/verify-dist.mjs +0 -29
  113. package/scripts/verify-v3-venues.mjs +0 -233
  114. package/skins/oracle.yaml +0 -56
  115. package/src/action-receipts.mjs +0 -265
  116. package/src/action-semantics.mjs +0 -62
  117. package/src/address-book.mjs +0 -208
  118. package/src/agent-auth.mjs +0 -206
  119. package/src/approval-guard.mjs +0 -282
  120. package/src/attestation-secret.mjs +0 -94
  121. package/src/audit-log.mjs +0 -196
  122. package/src/auth/oauth.mjs +0 -672
  123. package/src/auto-slippage.mjs +0 -378
  124. package/src/capability-posture.mjs +0 -125
  125. package/src/cards.mjs +0 -422
  126. package/src/chains.mjs +0 -62
  127. package/src/cli/chain-catalog.mjs +0 -215
  128. package/src/cli/chain-state.mjs +0 -74
  129. package/src/cli/commands/auth.mjs +0 -193
  130. package/src/cli/commands/bootstrap.mjs +0 -87
  131. package/src/cli/commands/chain.mjs +0 -143
  132. package/src/cli/commands/chat.mjs +0 -465
  133. package/src/cli/commands/credential.mjs +0 -9
  134. package/src/cli/commands/data-mcp.mjs +0 -18
  135. package/src/cli/commands/data.mjs +0 -75
  136. package/src/cli/commands/doctor.mjs +0 -136
  137. package/src/cli/commands/equities.mjs +0 -41
  138. package/src/cli/commands/farm.mjs +0 -129
  139. package/src/cli/commands/fees.mjs +0 -109
  140. package/src/cli/commands/follow.mjs +0 -130
  141. package/src/cli/commands/harness.mjs +0 -63
  142. package/src/cli/commands/help.mjs +0 -7
  143. package/src/cli/commands/init.mjs +0 -27
  144. package/src/cli/commands/mcp.mjs +0 -154
  145. package/src/cli/commands/model.mjs +0 -106
  146. package/src/cli/commands/plugins.mjs +0 -275
  147. package/src/cli/commands/prepare.mjs +0 -12
  148. package/src/cli/commands/public.mjs +0 -20
  149. package/src/cli/commands/resolve.mjs +0 -64
  150. package/src/cli/commands/route.mjs +0 -12
  151. package/src/cli/commands/runner.mjs +0 -9
  152. package/src/cli/commands/scan.mjs +0 -12
  153. package/src/cli/commands/setup.mjs +0 -294
  154. package/src/cli/commands/sign.mjs +0 -21
  155. package/src/cli/commands/signer.mjs +0 -9
  156. package/src/cli/commands/swap.mjs +0 -102
  157. package/src/cli/commands/upgrade.mjs +0 -12
  158. package/src/cli/commands/vault.mjs +0 -9
  159. package/src/cli/commands/version.mjs +0 -22
  160. package/src/cli/first-run.mjs +0 -23
  161. package/src/cli/kernel.mjs +0 -262
  162. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  163. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  164. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  165. package/src/cli/mcp-targets/codex.mjs +0 -41
  166. package/src/cli/mcp-targets/cursor.mjs +0 -32
  167. package/src/cli/mcp-targets/shared.mjs +0 -71
  168. package/src/cli/mcp-targets/vscode.mjs +0 -39
  169. package/src/cli/messaging-platforms.mjs +0 -217
  170. package/src/cli/model-config.mjs +0 -78
  171. package/src/cli/operator-dispatch.mjs +0 -194
  172. package/src/cli/oracle-harness.py +0 -415
  173. package/src/cli/paths.mjs +0 -107
  174. package/src/cli/runtime.mjs +0 -351
  175. package/src/cli/setup-state.mjs +0 -168
  176. package/src/cli/spawn-child.mjs +0 -43
  177. package/src/data/catalog.mjs +0 -858
  178. package/src/data/desk-data.mjs +0 -877
  179. package/src/data/http.mjs +0 -253
  180. package/src/data/names.mjs +0 -188
  181. package/src/data/provider-endpoint.mjs +0 -94
  182. package/src/data/providers/aave-v3.mjs +0 -139
  183. package/src/data/providers/across-bridge.mjs +0 -41
  184. package/src/data/providers/aerodrome.mjs +0 -245
  185. package/src/data/providers/aevo.mjs +0 -33
  186. package/src/data/providers/approval-indexer.mjs +0 -133
  187. package/src/data/providers/approvals.mjs +0 -594
  188. package/src/data/providers/babylon-staking.mjs +0 -149
  189. package/src/data/providers/balancer.mjs +0 -209
  190. package/src/data/providers/beefy-yields.mjs +0 -45
  191. package/src/data/providers/birdeye-tokens.mjs +0 -33
  192. package/src/data/providers/bisq-markets.mjs +0 -145
  193. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  194. package/src/data/providers/bitcoin-meta.mjs +0 -378
  195. package/src/data/providers/blockscout.mjs +0 -14
  196. package/src/data/providers/bob-rootstock.mjs +0 -198
  197. package/src/data/providers/braiins-insights.mjs +0 -103
  198. package/src/data/providers/bridge-aggregator.mjs +0 -259
  199. package/src/data/providers/bridges.mjs +0 -242
  200. package/src/data/providers/bungee.mjs +0 -29
  201. package/src/data/providers/celestia-da.mjs +0 -38
  202. package/src/data/providers/changenow.mjs +0 -135
  203. package/src/data/providers/compound.mjs +0 -32
  204. package/src/data/providers/connext.mjs +0 -28
  205. package/src/data/providers/convex.mjs +0 -30
  206. package/src/data/providers/cow-protocol.mjs +0 -110
  207. package/src/data/providers/cowswap.mjs +0 -415
  208. package/src/data/providers/curve.mjs +0 -201
  209. package/src/data/providers/das-assets.mjs +0 -59
  210. package/src/data/providers/debridge.mjs +0 -109
  211. package/src/data/providers/defillama.mjs +0 -88
  212. package/src/data/providers/dexscreener.mjs +0 -43
  213. package/src/data/providers/drift.mjs +0 -32
  214. package/src/data/providers/dydx.mjs +0 -41
  215. package/src/data/providers/evm-rpc.mjs +0 -225
  216. package/src/data/providers/farming.mjs +0 -291
  217. package/src/data/providers/geckoterminal.mjs +0 -34
  218. package/src/data/providers/gmx.mjs +0 -496
  219. package/src/data/providers/hiro-stacks.mjs +0 -150
  220. package/src/data/providers/hl-assets.mjs +0 -165
  221. package/src/data/providers/hl-info.mjs +0 -108
  222. package/src/data/providers/hl-markets.mjs +0 -210
  223. package/src/data/providers/hl-outcome.mjs +0 -61
  224. package/src/data/providers/hl-perps.mjs +0 -419
  225. package/src/data/providers/hl-staking.mjs +0 -353
  226. package/src/data/providers/hl-ws.mjs +0 -119
  227. package/src/data/providers/hyperevm-dex.mjs +0 -49
  228. package/src/data/providers/jito-mev.mjs +0 -117
  229. package/src/data/providers/jupiter-venues.mjs +0 -119
  230. package/src/data/providers/jupiter.mjs +0 -315
  231. package/src/data/providers/kamino-strategies.mjs +0 -143
  232. package/src/data/providers/l2beat-tvl.mjs +0 -42
  233. package/src/data/providers/lifi.mjs +0 -166
  234. package/src/data/providers/liquid-esplora.mjs +0 -152
  235. package/src/data/providers/magiceden-ordinals.mjs +0 -141
  236. package/src/data/providers/magiceden-sol.mjs +0 -406
  237. package/src/data/providers/mempool-lightning.mjs +0 -144
  238. package/src/data/providers/mempool-mining.mjs +0 -142
  239. package/src/data/providers/meteora-dlmm.mjs +0 -168
  240. package/src/data/providers/morpho.mjs +0 -177
  241. package/src/data/providers/nft-gallery.mjs +0 -163
  242. package/src/data/providers/nft-portfolio.mjs +0 -494
  243. package/src/data/providers/odos.mjs +0 -156
  244. package/src/data/providers/ondo.mjs +0 -31
  245. package/src/data/providers/oneinch.mjs +0 -174
  246. package/src/data/providers/opensea-multichain.mjs +0 -136
  247. package/src/data/providers/opensea-nft.mjs +0 -371
  248. package/src/data/providers/orca.mjs +0 -29
  249. package/src/data/providers/ordinals-runes.mjs +0 -180
  250. package/src/data/providers/pancakeswap.mjs +0 -28
  251. package/src/data/providers/paraswap.mjs +0 -125
  252. package/src/data/providers/pendle.mjs +0 -188
  253. package/src/data/providers/poly-clob.mjs +0 -283
  254. package/src/data/providers/poly-public.mjs +0 -96
  255. package/src/data/providers/poly-ws.mjs +0 -103
  256. package/src/data/providers/polygon-staking.mjs +0 -227
  257. package/src/data/providers/portfolio-history.mjs +0 -394
  258. package/src/data/providers/portfolio.mjs +0 -600
  259. package/src/data/providers/pyth-price-feeds.mjs +0 -172
  260. package/src/data/providers/raydium.mjs +0 -35
  261. package/src/data/providers/relayscan-mev.mjs +0 -72
  262. package/src/data/providers/rfq.mjs +0 -15
  263. package/src/data/providers/rh-agent.mjs +0 -59
  264. package/src/data/providers/sanctum-lst.mjs +0 -180
  265. package/src/data/providers/satflow.mjs +0 -341
  266. package/src/data/providers/signed-material-guard.mjs +0 -108
  267. package/src/data/providers/solana-rpc.mjs +0 -197
  268. package/src/data/providers/solend-lending.mjs +0 -166
  269. package/src/data/providers/spark-lend.mjs +0 -42
  270. package/src/data/providers/squid-router.mjs +0 -29
  271. package/src/data/providers/stargate.mjs +0 -29
  272. package/src/data/providers/sushiswap.mjs +0 -30
  273. package/src/data/providers/symbiotic-restaking.mjs +0 -41
  274. package/src/data/providers/thorchain.mjs +0 -36
  275. package/src/data/providers/traderjoe.mjs +0 -28
  276. package/src/data/providers/twap.mjs +0 -152
  277. package/src/data/providers/uniswap-v3.mjs +0 -457
  278. package/src/data/providers/uniswap-v4.mjs +0 -414
  279. package/src/data/providers/vertex.mjs +0 -41
  280. package/src/data/providers/wallet-watch.mjs +0 -264
  281. package/src/data/providers/wormhole.mjs +0 -28
  282. package/src/data/providers/yearn.mjs +0 -31
  283. package/src/data/providers/zerox.mjs +0 -167
  284. package/src/data/public-api-scan.mjs +0 -61
  285. package/src/data/quote-placeholder.mjs +0 -31
  286. package/src/desk/swap-prepare.mjs +0 -194
  287. package/src/equities/bridge.mjs +0 -388
  288. package/src/equities/fixtures/bridge_routes.json +0 -159
  289. package/src/equities/fixtures/dst_transitions.json +0 -29
  290. package/src/equities/fixtures/equity_dex_pools.json +0 -154
  291. package/src/equities/fixtures/hip3_l2books.json +0 -2711
  292. package/src/equities/fixtures/nyse_holidays.json +0 -1
  293. package/src/equities/fixtures/oracles.json +0 -100
  294. package/src/equities/fixtures/rh_pool_state.json +0 -244
  295. package/src/equities/fixtures/solana_xstocks.json +0 -704
  296. package/src/equities/fixtures/ton_xstocks.json +0 -35
  297. package/src/equities/fixtures/universe.json +0 -411
  298. package/src/equities/fixtures/venues.json +0 -3542
  299. package/src/equities/fixtures.mjs +0 -405
  300. package/src/equities/funding.mjs +0 -142
  301. package/src/equities/index.mjs +0 -166
  302. package/src/equities/liveness.mjs +0 -148
  303. package/src/equities/marketHours.mjs +0 -249
  304. package/src/equities/normalize.mjs +0 -295
  305. package/src/equities/num.mjs +0 -146
  306. package/src/equities/prepare.mjs +0 -95
  307. package/src/equities/rank.mjs +0 -260
  308. package/src/equities/sourceNum.mjs +0 -69
  309. package/src/equities/types.mjs +0 -220
  310. package/src/equities/venues/arcus-perp.mjs +0 -84
  311. package/src/equities/venues/arcus-spot.mjs +0 -105
  312. package/src/equities/venues/hyperliquid-hip3.mjs +0 -224
  313. package/src/equities/venues/rh-uniswap.mjs +0 -216
  314. package/src/equities/venues/solana-xstocks.mjs +0 -139
  315. package/src/equities/venues/ton-stonfi.mjs +0 -139
  316. package/src/exact-integer.mjs +0 -72
  317. package/src/exec-policy.mjs +0 -419
  318. package/src/flags.mjs +0 -15
  319. package/src/fresh-window.mjs +0 -76
  320. package/src/gmx-attestation.mjs +0 -176
  321. package/src/index.mjs +0 -107
  322. package/src/licensing/locals-only.mjs +0 -25
  323. package/src/nft-gas-war-guard.mjs +0 -139
  324. package/src/onboarding/agent-keys.mjs +0 -161
  325. package/src/onboarding/harness-configs.mjs +0 -102
  326. package/src/onboarding/index.mjs +0 -18
  327. package/src/onboarding/tiers.mjs +0 -139
  328. package/src/oracle-env.mjs +0 -55
  329. package/src/package-manifest.mjs +0 -42
  330. package/src/plugins/agent-plugin-loader.mjs +0 -225
  331. package/src/portfolio-risk.mjs +0 -170
  332. package/src/prepare-envelope.mjs +0 -204
  333. package/src/profile-upgrade.mjs +0 -277
  334. package/src/protocol-execution.mjs +0 -84
  335. package/src/protocol-templates/gate.mjs +0 -179
  336. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  337. package/src/public-api/agent-grants.mjs +0 -57
  338. package/src/public-api/buzz-integration.mjs +0 -267
  339. package/src/public-api/connect-agent.mjs +0 -424
  340. package/src/public-api/grants.mjs +0 -142
  341. package/src/public-api/http.mjs +0 -707
  342. package/src/public-api/metering.mjs +0 -111
  343. package/src/public-control/aa-adapter.mjs +0 -402
  344. package/src/public-control/build-registry.mjs +0 -227
  345. package/src/public-control/bundler-client.mjs +0 -357
  346. package/src/public-control/grant-indexer.mjs +0 -296
  347. package/src/public-control/policy-render.mjs +0 -69
  348. package/src/public-control/policy-schema.mjs +0 -322
  349. package/src/public-control/runtime-config.mjs +0 -275
  350. package/src/public-control/session-key-model.mjs +0 -379
  351. package/src/public-control/session-orchestrator.mjs +0 -418
  352. package/src/rfq/intent.mjs +0 -180
  353. package/src/rfq/sources.mjs +0 -181
  354. package/src/route-attestation.mjs +0 -132
  355. package/src/router/best-execution.mjs +0 -326
  356. package/src/router/index.mjs +0 -250
  357. package/src/router/integrator-fee.mjs +0 -135
  358. package/src/router/prepare-bridge.mjs +0 -293
  359. package/src/router/prepare-route.mjs +0 -398
  360. package/src/router/proposal.mjs +0 -311
  361. package/src/router/risk-classifier.mjs +0 -119
  362. package/src/router/route-sources.mjs +0 -364
  363. package/src/scanner/chains.config.mjs +0 -543
  364. package/src/scanner/contract.mjs +0 -270
  365. package/src/scanner/evm-scanner.mjs +0 -394
  366. package/src/scanner/index.mjs +0 -9
  367. package/src/scanner/v2-venue.mjs +0 -351
  368. package/src/scanner/v3-venue.mjs +0 -308
  369. package/src/scopes.mjs +0 -44
  370. package/src/sell-simulation.mjs +0 -167
  371. package/src/signals/engine.mjs +0 -146
  372. package/src/signals/index.mjs +0 -1
  373. package/src/token-transfer-guard.mjs +0 -188
  374. package/src/tui/app.mjs +0 -438
  375. package/src/tui/backend.mjs +0 -215
  376. package/src/tui/format.mjs +0 -272
  377. package/src/tui/gateway-client.mjs +0 -177
  378. package/src/tui/input.mjs +0 -501
  379. package/src/tui/memory.mjs +0 -105
  380. package/src/tui/meta-learn.mjs +0 -85
  381. package/src/tui/renderer.mjs +0 -443
  382. package/src/tui/scheduler.mjs +0 -205
  383. package/src/tui/skills-loader.mjs +0 -140
  384. package/src/tui/standalone-client.mjs +0 -752
  385. package/src/tui/theme.mjs +0 -81
  386. package/src/vault-attestation.mjs +0 -146
  387. package/src/venues.mjs +0 -206
  388. package/src/watch-preferences.mjs +0 -85
  389. /package/{profiles → dist/assets/profiles}/_template/SOUL.md +0 -0
  390. /package/{profiles → dist/assets/profiles}/_template/profile.json +0 -0
  391. /package/{profiles → dist/assets/profiles}/bitcoin-agent/SOUL.md +0 -0
  392. /package/{profiles → dist/assets/profiles}/bitcoin-agent/profile.json +0 -0
  393. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/SOUL.md +0 -0
  394. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/profile.json +0 -0
  395. /package/{profiles → dist/assets/profiles}/oracle/SOUL.md +0 -0
  396. /package/{profiles → dist/assets/profiles}/oracle/profile.json +0 -0
  397. /package/{profiles → dist/assets/profiles}/polymarket-agent/SOUL.md +0 -0
  398. /package/{profiles → dist/assets/profiles}/polymarket-agent/profile.json +0 -0
  399. /package/{profiles → dist/assets/profiles}/profile.schema.json +0 -0
  400. /package/{profiles → dist/assets/profiles}/protocol-builder/SOUL.md +0 -0
  401. /package/{profiles → dist/assets/profiles}/protocol-builder/profile.json +0 -0
  402. /package/{profiles → dist/assets/profiles}/robinhood-agent/SOUL.md +0 -0
  403. /package/{profiles → dist/assets/profiles}/robinhood-agent/profile.json +0 -0
  404. /package/{profiles → dist/assets/profiles}/solana-agent/SOUL.md +0 -0
  405. /package/{profiles → dist/assets/profiles}/solana-agent/profile.json +0 -0
  406. /package/{profiles → dist/assets/profiles}/stable-agent/SOUL.md +0 -0
  407. /package/{profiles → dist/assets/profiles}/stable-agent/profile.json +0 -0
  408. /package/{skills → dist/assets/skills}/balance/SKILL.md +0 -0
  409. /package/{skills → dist/assets/skills}/bitcoin-l1.md +0 -0
  410. /package/{skills → dist/assets/skills}/chain-defi-ecosystem-profiling.md +0 -0
  411. /package/{skills → dist/assets/skills}/evm-contract-research.md +0 -0
  412. /package/{skills → dist/assets/skills}/hyperliquid.md +0 -0
  413. /package/{skills → dist/assets/skills}/multichain-exec-desk.md +0 -0
  414. /package/{skills → dist/assets/skills}/oracle-action-semantics/SKILL.md +0 -0
  415. /package/{skills → dist/assets/skills}/oracle-best-execution/SKILL.md +0 -0
  416. /package/{skills → dist/assets/skills}/oracle-best-execution.md +0 -0
  417. /package/{skills → dist/assets/skills}/oracle-bitcoin/SKILL.md +0 -0
  418. /package/{skills → dist/assets/skills}/oracle-chain-graphs-telegram-cards/SKILL.md +0 -0
  419. /package/{skills → dist/assets/skills}/oracle-chat/SKILL.md +0 -0
  420. /package/{skills → dist/assets/skills}/oracle-chat/chain.SKILL.md +0 -0
  421. /package/{skills → dist/assets/skills}/oracle-chat/setup.SKILL.md +0 -0
  422. /package/{skills → dist/assets/skills}/oracle-circuit-breaker/SKILL.md +0 -0
  423. /package/{skills → dist/assets/skills}/oracle-contract-research/SKILL.md +0 -0
  424. /package/{skills → dist/assets/skills}/oracle-desk/SKILL.md +0 -0
  425. /package/{skills → dist/assets/skills}/oracle-desk.md +0 -0
  426. /package/{skills → dist/assets/skills}/oracle-dex-launch/SKILL.md +0 -0
  427. /package/{skills → dist/assets/skills}/oracle-equities/SKILL.md +0 -0
  428. /package/{skills → dist/assets/skills}/oracle-grants/SKILL.md +0 -0
  429. /package/{skills → dist/assets/skills}/oracle-hypercore-staking/SKILL.md +0 -0
  430. /package/{skills → dist/assets/skills}/oracle-hyperliquid/SKILL.md +0 -0
  431. /package/{skills → dist/assets/skills}/oracle-meme-token-sniper/SKILL.md +0 -0
  432. /package/{skills → dist/assets/skills}/oracle-multichain-nft-launch/SKILL.md +0 -0
  433. /package/{skills → dist/assets/skills}/oracle-multichain-token-launch/SKILL.md +0 -0
  434. /package/{skills → dist/assets/skills}/oracle-nft-gacha-launch/SKILL.md +0 -0
  435. /package/{skills → dist/assets/skills}/oracle-nft-mint-gas-war/SKILL.md +0 -0
  436. /package/{skills → dist/assets/skills}/oracle-polymarket/SKILL.md +0 -0
  437. /package/{skills → dist/assets/skills}/oracle-protocol-builder/SKILL.md +0 -0
  438. /package/{skills → dist/assets/skills}/oracle-protocol-security/SKILL.md +0 -0
  439. /package/{skills → dist/assets/skills}/oracle-public-product/SKILL.md +0 -0
  440. /package/{skills → dist/assets/skills}/oracle-receipts/SKILL.md +0 -0
  441. /package/{skills → dist/assets/skills}/oracle-receipts.md +0 -0
  442. /package/{skills → dist/assets/skills}/oracle-rfq-tokenized-assets/SKILL.md +0 -0
  443. /package/{skills → dist/assets/skills}/oracle-smart-wallet-scanner/SKILL.md +0 -0
  444. /package/{skills → dist/assets/skills}/oracle-solana/SKILL.md +0 -0
  445. /package/{skills → dist/assets/skills}/oracle-solana-nft/SKILL.md +0 -0
  446. /package/{skills → dist/assets/skills}/oracle-token-research/SKILL.md +0 -0
  447. /package/{skills → dist/assets/skills}/solana.md +0 -0
@@ -0,0 +1,28 @@
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},w=Et(t),y=[],k=[],T={},N=new Set;return await Promise.all(n.map(async b=>{let R=m[b];if(!R?.length){k.push({chainId:b,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[b]={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,w]}),(o==="out"||o==="both")&&B.push({...V,topics:[G,w,null]});let I=[];for(let h of B)for(let g of j)I.push([h,g]);let z=[],W=0,wt=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(bt){k.push({chainId:b,stage:"getLogs",range:[g,A],error:bt.message})}}});await Promise.all(wt);for(let h of z){if(!h?.topics||h.topics.length<3)continue;let g=parseInt(h.logIndex,16),A=`${b}|${h.transactionHash}|${g}`;N.has(A)||(N.add(A),y.push({chainId:b,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:b,stage:"range",error:_.message})}})),y.sort((b,R)=>R.blockNumber-b.blockNumber||R.logIndex-b.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 w=new Error(`HTTP ${u.status} ${n} ${o} redirected non-idempotent request`);throw w.status=u.status,w.body=d??m.slice(0,300),w}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(w){d=w;let y=w?.status,k=w?.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 w;await Bt(Lt(p,w?.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 0x1111111111111111111111111111111111111111 --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};
@@ -0,0 +1,15 @@
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 run(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};
@@ -0,0 +1 @@
1
+ var e={name:"help",summary:"show command help",group:"meta",usage:"oracle help [noun]",async run(){return 0}};export{e as default};
@@ -0,0 +1,3 @@
1
+ import{spawnSync as i}from"node:child_process";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};
@@ -0,0 +1,36 @@
1
+ import{parseArgs as me}from"node:util";import M from"node:path";import{fileURLToPath as W}from"node:url";var z=M.dirname(W(import.meta.url)),he=M.resolve(z,"../.."),be=Object.freeze(["oracle-vault","oracle-credential","oracle-signer","oracle-runner","oracle-agentic-init","oracle-agentic-doctor","oracle-control-mcp","oracle-operator-caps"]),Se=Object.freeze(["vault","credential","signer","runner","sign"]),I=`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 y(e=process.stderr){e.write(I),I.endsWith(`
9
+ `)||e.write(`
10
+ `)}import{spawnSync as D}from"node:child_process";import H from"node:path";import k from"node:fs";import v from"node:path";import Z from"node:os";import Y from"node:fs";import j from"node:path";import{fileURLToPath as Q}from"node:url";var X=j.dirname(Q(import.meta.url)),h=j.resolve(X,"../..");function $(e){let r=[j.join(h,"bin",e),j.join(h,"dist","bin",e),j.join(h,"..","bin",e)];return r.find(t=>Y.existsSync(t))||r[0]}function d(){return process.env.ORACLE_FAKE_HOME||Z.homedir()}function m({oracleRoot:e=h,operator:r=null,withControl:t=!1}={}){let s={"oracle-data":{command:"node",args:[e===h?$("oracle-data-mcp.mjs"):[v.join(e,"bin","oracle-data-mcp.mjs"),v.join(e,"dist","bin","oracle-data-mcp.mjs")].find(a=>k.existsSync(a))||v.join(e,"bin","oracle-data-mcp.mjs")]}};if(t){if(!r||!r.ok)return{ok:!1,reason:"operator-missing"};let a=r.bins?.["oracle-control-mcp"]||r.controlMcp||null;if(!a)return{ok:!1,reason:"control-bin-missing"};s["oracle-control"]={command:"node",args:[a]}}return{ok:!0,specs:s}}function C(e){if(!k.existsSync(e))return null;let r=`${e}.bak-oracle-${Math.floor(Date.now()/1e3)}`;return k.copyFileSync(e,r),r}function ee(e,r={}){return k.existsSync(e)?JSON.parse(k.readFileSync(e,"utf8")):structuredClone(r)}function re(e,r){k.mkdirSync(v.dirname(e),{recursive:!0}),k.writeFileSync(e,JSON.stringify(r,null,2)+`
11
+ `)}function g(e,r){let t=ee(e,{});(!t.mcpServers||typeof t.mcpServers!="object")&&(t.mcpServers={});let i=!1;for(let[a,o]of Object.entries(r)){let p=t.mcpServers[a];p&&JSON.stringify(p)===JSON.stringify(o)||(t.mcpServers[a]=o,i=!0)}if(!i)return{status:"present",backup:null};let s=C(e);return re(e,t),{status:"written",backup:s}}function f(e,r={}){return{status:e,...r}}function te(){return H.join(d(),".claude.json")}function oe(e){return H.join(e||process.cwd(),".mcp.json")}function ne(e,r){let t=D("claude",["--version"],{encoding:"utf8",timeout:1e4});if(t.error||t.status!==0)return null;let i=D("claude",["mcp","add-json",e,JSON.stringify(r),"--scope","user"],{encoding:"utf8",timeout:3e4});return i.status!==0?{ok:!1,stderr:i.stderr||i.stdout||"failed"}:{ok:!0}}async function L({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:s=!1,cwd:a=process.cwd()}){let o=m({oracleRoot:e,operator:r,withControl:t});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(s)return{ok:!0,print:{mcpServers:o.specs}};if(i){let l=oe(a),u=g(l,o.specs);return{ok:!0,...f(u.status,{path:l,backup:u.backup})}}let p=!1;for(let[l,u]of Object.entries(o.specs)){let S=ne(l,u);if(S&&S.ok){p=!0;continue}break}if(p)return{ok:!0,...f("written",{method:"claude-cli"})};let c=te(),n=g(c,o.specs);return{ok:!0,...f(n.status,{path:c,backup:n.backup})}}import se from"node:fs";import E from"node:path";function ie(){return process.platform==="darwin"?E.join(d(),"Library","Application Support","Claude","claude_desktop_config.json"):E.join(d(),".config","Claude","claude_desktop_config.json")}async function P({oracleRoot:e,operator:r,withControl:t=!1,printOnly:i=!1}){let s=m({oracleRoot:e,operator:r,withControl:t});if(!s.ok)return{ok:!1,code:3,reason:s.reason};let a=ie(),o={mcpServers:s.specs};if(i)return{ok:!0,print:o};let p=E.dirname(a);if(!se.existsSync(p))return{ok:!0,status:"printed (Claude Desktop not detected)",path:a,print:o};let c=g(a,s.specs);return{ok:!0,...f(c.status,{path:a,backup:c.backup})}}import w from"node:fs";import F from"node:path";var G="# oracle-mcp-install begin",U="# oracle-mcp-install end";function ce(){return F.join(d(),".codex","config.toml")}function ae(e){let r=[G];for(let[t,i]of Object.entries(e))r.push(`[mcp_servers.${t}]`),r.push(`command = ${JSON.stringify(i.command)}`),r.push(`args = [${i.args.map(s=>JSON.stringify(s)).join(", ")}]`),r.push("");return r.push(U),r.join(`
12
+ `)+`
13
+ `}function pe(e){return e.replace(new RegExp(`${G}[\\s\\S]*?${U}\\n?`,"g"),"")}async function A({oracleRoot:e,operator:r,withControl:t=!1,printOnly:i=!1}){let s=m({oracleRoot:e,operator:r,withControl:t});if(!s.ok)return{ok:!1,code:3,reason:s.reason};let a=ae(s.specs),o=ce();if(i)return{ok:!0,printText:a,path:o};w.mkdirSync(F.dirname(o),{recursive:!0});let p=w.existsSync(o)?w.readFileSync(o,"utf8"):"";if(p.includes(a.trim()))return{ok:!0,...f("present",{path:o,backup:null})};let n=(pe(p).trimEnd()+`
14
+
15
+ `+a).replace(/^\n+/,"");if(p.trim()===n.trim())return{ok:!0,...f("present",{path:o,backup:null})};let l=p?C(o):null;return w.writeFileSync(o,n.endsWith(`
16
+ `)?n:n+`
17
+ `),{ok:!0,...f("written",{path:o,backup:l})}}import B from"node:fs";import q from"node:path";var N="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 ue(){return{openapi:"3.1.0",info:{title:"Oracle Public (read/prepare)",version:"1.0.0",description:"Secret-free public surface for hosted clients. "+N},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 R({printOnly:e=!1}={}){let r=ue(),t=q.join(d(),".config","oracle","connectors","chatgpt-openapi.json"),i=JSON.stringify(r,null,2)+`
18
+ `;e||(B.mkdirSync(q.dirname(t),{recursive:!0}),B.writeFileSync(t,i));let s=[N,"","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: ${t}`].filter(Boolean).join(`
19
+ `);return{ok:!0,...f(e?"printed":"written",{path:t,print:r,instructions:s,cannotSign:N})}}import _ from"node:path";import K from"node:os";function le(){return process.platform==="darwin"?_.join(K.homedir(),"Library","Application Support","Cursor","User","globalStorage","mcp.json"):process.platform==="win32"?_.join(K.homedir(),"AppData","Roaming","Cursor","User","globalStorage","mcp.json"):_.join(d(),".config","cursor","mcp.json")}async function T({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:s=!1,cwd:a=process.cwd()}){let o=m({oracleRoot:e,operator:r,withControl:t});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(s)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 p=le(),c=g(p,o.specs);return{ok:!0,...f(c.status,{path:p,backup:c.backup})}}import O from"node:path";import V from"node:os";function fe(){return process.platform==="darwin"?O.join(V.homedir(),"Library","Application Support","Code","User","globalStorage","mcp.json"):process.platform==="win32"?O.join(V.homedir(),"AppData","Roaming","Code","User","globalStorage","mcp.json"):O.join(d(),".config","Code","User","globalStorage","mcp.json")}function de(e){return O.join(e||process.cwd(),".vscode","mcp.json")}async function J({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:s=!1,cwd:a=process.cwd()}){let o=m({oracleRoot:e,operator:r,withControl:t});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(s)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 p=i?de(a):fe(),c=g(p,o.specs);return{ok:!0,...f(c.status,{path:p,backup:c.backup})}}function x(){process.stderr.write(`usage: oracle mcp <install|print> [target] [flags]
23
+ targets: claude-code | claude-desktop | codex | copilot | chatgpt | cursor | vscode | generic
24
+ flags: --with-control --project --print --json
25
+ `)}function b(e,{json:r=!1}={}){if(e.print&&!e.instructions?process.stdout.write(JSON.stringify(e.print,null,2)+`
26
+ `):e.printText&&process.stdout.write(e.printText),e.instructions&&(process.stdout.write(e.instructions+`
27
+ `),e.print&&r&&process.stdout.write(JSON.stringify(e.print,null,2)+`
28
+ `)),!e.print&&!e.printText&&!e.instructions){let t={status:e.status,path:e.path||null,backup:e.backup||null,method:e.method||null};process.stdout.write((r?JSON.stringify(t,null,2):`${t.status}${t.path?" "+t.path:""}`)+`
29
+ `)}}var fr={name:"mcp",summary:"wire Oracle into AI clients",group:"read",usage:"oracle mcp install <target> | oracle mcp print [--target <t>]",async run(e){let r=e.argv[0];if(!r||r==="--help"||r==="-h")return x(),r?0:1;let t,i;try{({values:t,positionals:i}=me({args:e.argv.slice(1),options:{"with-control":{type:"boolean",default:!1},project:{type:"boolean",default:!1},print:{type:"boolean",default:!1},json:{type:"boolean",default:!1},target:{type:"string"}},allowPositionals:!0,strict:!1}))}catch(n){return process.stderr.write(`oracle mcp: ${n.message}
30
+ `),x(),1}let s=!!t["with-control"],a=!!t.project,o=!!t.json,p=e.resolveOperator?e.resolveOperator():{ok:!1};if(s&&(!p||!p.ok))return y(process.stderr),3;let c={oracleRoot:e.root,operator:p,withControl:s,project:a,cwd:process.cwd()};if(r==="print"){let n=t.target||i[0]||"claude-code";if(n==="generic"||n==="claude-code"){let l=m(c);return l.ok?(process.stdout.write(JSON.stringify({mcpServers:l.specs},null,2)+`
31
+ `),0):(y(process.stderr),3)}if(n==="chatgpt"){let l=await R({printOnly:!0});return b(l,{json:o}),0}return n==="codex"||n==="copilot"?(b(await A({...c,printOnly:!0}),{json:o}),0):n==="claude-desktop"?(b(await P({...c,printOnly:!0}),{json:o}),0):n==="cursor"?(b(await T({...c,printOnly:!0}),{json:o}),0):n==="vscode"||n==="vs-code"?(b(await J({...c,printOnly:!0}),{json:o}),0):(process.stderr.write(`oracle mcp: unknown target '${n}'
32
+ `),1)}if(r==="install"){let n=i[0]||t.target;if(!n)return x(),1;let l=!!t.print,u;if(n==="claude-code")u=await L({...c,printOnly:l});else if(n==="claude-desktop")u=await P({...c,printOnly:l});else if(n==="codex"||n==="copilot")u=await A({...c,printOnly:l});else if(n==="chatgpt")u=await R({printOnly:l});else if(n==="cursor")u=await T({...c,printOnly:l});else if(n==="vscode"||n==="vs-code")u=await J({...c,printOnly:l});else if(n==="generic"){let S=m(c);return S.ok?(process.stdout.write(JSON.stringify({mcpServers:S.specs},null,2)+`
33
+ `),0):(y(process.stderr),3)}else return process.stderr.write(`oracle mcp: unknown target '${n}'
34
+ `),1;return u.ok?(b(u,{json:o}),u.status&&String(u.status).startsWith("printed")&&u.print&&process.stdout.write(JSON.stringify(u.print,null,2)+`
35
+ `),0):(u.code===3?y(process.stderr):process.stderr.write(`oracle mcp: ${u.reason||"failed"}
36
+ `),u.code||1)}return x(),1}};export{fr as default};
@@ -0,0 +1,54 @@
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};
@@ -0,0 +1,43 @@
1
+ import l from"node:fs";import c from"node:path";import{spawnSync as D}from"node:child_process";import j from"node:os";import g from"node:path";import{fileURLToPath as k}from"node:url";var x=g.dirname(k(import.meta.url)),H=g.resolve(x,"../..");function y(){return process.env.ORACLE_FAKE_HOME||j.homedir()}function b(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function $(){return b()?process.env.ORACLE_CONFIG_DIR||g.join(y(),".config","oracle"):g.join(y(),".config","oracle")}import a from"node:fs";import p from"node:path";var f="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",E=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function P(e){let t=[],r=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:r};e.$schema!==f&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${f})`):t.push("$schema is required \u2014 must be "+f)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):E.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&r.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&r.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&r.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||r.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&r.push("license must be a string");let s=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let n of Object.keys(e))s.has(n)||r.push(`unknown field "${n}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:r}}function A(e){let t=p.join(e,"skills"),r=[];if(!a.existsSync(t)||!a.statSync(t).isDirectory())return r;function s(n,i=""){for(let o of a.readdirSync(n,{withFileTypes:!0})){let u=p.join(n,o.name);if(o.isDirectory())s(u,i?`${i}/${o.name}`:o.name);else if(o.name.endsWith(".md")){let d=i?`${i}/${o.name.replace(/\.md$/,"")}`:o.name.replace(/\.md$/,"");r.push({name:d,path:u,relativePath:p.relative(t,u)})}}}return s(t),r}function C(e){let t=p.join(e,"mcp"),r=[];if(!a.existsSync(t)||!a.statSync(t).isDirectory())return r;for(let s of a.readdirSync(t,{withFileTypes:!0})){if(!s.isFile()||!s.name.endsWith(".json"))continue;let n=p.join(t,s.name);try{let i=JSON.parse(a.readFileSync(n,"utf8"));r.push({name:s.name.replace(/\.json$/,""),path:n,config:i})}catch(i){r.push({name:s.name.replace(/\.json$/,""),path:n,error:`invalid JSON: ${i.message}`})}}return r}function m(e){let t=p.resolve(e);if(!a.existsSync(t)||!a.statSync(t).isDirectory())return{ok:!1,error:`plugin directory not found: ${t}`};let r=p.join(t,"plugin.json");if(!a.existsSync(r))return{ok:!1,error:`missing plugin.json in ${t}`};let s;try{s=JSON.parse(a.readFileSync(r,"utf8"))}catch(u){return{ok:!1,error:`invalid plugin.json: ${u.message}`}}let n=P(s);if(!n.valid)return{ok:!1,error:"manifest validation failed",errors:n.errors};let i=A(t),o=C(t);return{ok:!0,plugin:{name:s.name,version:s.version||"0.0.0",description:s.description||"",author:s.author||{},license:s.license||"UNLICENSED",root:t,manifest:s,skills:i,mcpServers:o,warnings:[...n.warnings]}}}function S(e){let t=[];if(!a.existsSync(e))return t;for(let r of a.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let s=p.join(e,r.name),n=m(s);n.ok&&t.push(n.plugin)}return t}var _=/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/;function h(){let e=c.join($(),"plugins");return l.existsSync(e)||l.mkdirSync(e,{recursive:!0}),e}function v(){return["oracle plugins \u2014 manage Agent Plugins (https://agent-plugins.org/)",""," oracle plugins install <path> install from a local directory"," oracle plugins install <git-url> clone a repo and install"," oracle plugins list show installed plugins"," oracle plugins remove <name> uninstall a plugin"," oracle plugins scan <path> validate without installing"," oracle plugins setup interactive setup wizard","","plugins are installed to ~/.config/oracle/plugins/<name>/",`schema: ${f}`].join(`
2
+ `)}function w(e,{name:t}={}){let r=c.resolve(e);if(!l.existsSync(r)||!l.statSync(r).isDirectory())return process.stderr.write(`error: ${e} is not a directory
3
+ `),1;let s=m(r);if(!s.ok){if(process.stderr.write(`error: invalid plugin at ${r}
4
+ `),s.errors)for(let u of s.errors)process.stderr.write(` - ${u}
5
+ `);return 1}let n=s.plugin,i=t||n.name.replace(/\//g,"-"),o=c.join(h(),i);if(l.existsSync(o))return process.stderr.write(`plugin "${i}" already installed. use oracle plugins remove first.
6
+ `),1;if(l.cpSync(r,o,{recursive:!0}),process.stdout.write(`installed ${n.name} (v${n.version}) to ${o}
7
+ `),process.stdout.write(` ${n.skills.length} skills, ${n.mcpServers.length} MCP servers
8
+ `),n.warnings.length)for(let u of n.warnings)process.stdout.write(` warning: ${u}
9
+ `);return 0}function R(e){let t=c.join(h(),".tmp-"+Date.now());try{let r=D("git",["clone","--depth","1",e,t],{stdio:"pipe",timeout:6e4});return r.status!==0?(process.stderr.write(`error: git clone failed: ${String(r.stderr).slice(0,200)}
10
+ `),1):w(t)}finally{try{l.rmSync(t,{recursive:!0,force:!0})}catch{}}}function O(){let e=S(h());if(!e.length)return process.stdout.write(`no plugins installed
11
+ `),process.stdout.write(`install with: oracle plugins install <path|url>
12
+ `),0;process.stdout.write(`${e.length} plugin(s) installed
13
+
14
+ `);for(let t of e){let r=c.basename(t.root);process.stdout.write(` ${t.name} (v${t.version})
15
+ `),process.stdout.write(` path: ${t.root}
16
+ `),t.description&&process.stdout.write(` desc: ${t.description}
17
+ `),process.stdout.write(` ${t.skills.length} skills, ${t.mcpServers.length} MCP servers
18
+ `),t.license!=="UNLICENSED"&&process.stdout.write(` license: ${t.license}
19
+ `),process.stdout.write(`
20
+ `)}return 0}function M(e){if(!e)return process.stderr.write(`usage: oracle plugins remove <name>
21
+ `),1;if(!_.test(e)||c.basename(e)!==e||c.isAbsolute(e))return process.stderr.write(`invalid plugin name "${e}"
22
+ `),1;let t=h(),r=l.lstatSync(t);if(r.isSymbolicLink()||!r.isDirectory())return process.stderr.write(`refusing to remove plugin: plugin root is not a regular directory
23
+ `),1;let s=c.resolve(t,e),n=c.relative(t,s);if(!n||n===".."||n.startsWith(`..${c.sep}`)||c.isAbsolute(n))return process.stderr.write(`invalid plugin name "${e}"
24
+ `),1;if(!l.existsSync(s))return process.stderr.write(`plugin "${e}" not found
25
+ `),1;let i=l.lstatSync(s);if(i.isSymbolicLink()||!i.isDirectory())return process.stderr.write(`refusing to remove plugin "${e}": path is not a regular plugin directory
26
+ `),1;let o=l.realpathSync(t),u=l.realpathSync(s),d=c.relative(o,u);return!d||d===".."||d.startsWith(`..${c.sep}`)||c.isAbsolute(d)?(process.stderr.write(`refusing to remove plugin "${e}": path escapes the plugin directory
27
+ `),1):(l.rmSync(s,{recursive:!0,force:!0}),process.stdout.write(`removed plugin "${e}"
28
+ `),0)}function N(e){let t=c.resolve(e),r=m(t);if(!r.ok){if(process.stderr.write(`invalid plugin: ${r.error}
29
+ `),r.errors)for(let n of r.errors)process.stderr.write(` error: ${n}
30
+ `);return 1}let s=r.plugin;process.stdout.write(`valid plugin: ${s.name} (v${s.version})
31
+ `),process.stdout.write(` schema: ${s.manifest.$schema}
32
+ `),process.stdout.write(` skills: ${s.skills.length} found
33
+ `);for(let n of s.skills)process.stdout.write(` - ${n.name} (${n.relativePath})
34
+ `);process.stdout.write(` mcp servers: ${s.mcpServers.length} found
35
+ `);for(let n of s.mcpServers){let i=n.error?`ERROR: ${n.error}`:"ok";process.stdout.write(` - ${n.name}: ${i}
36
+ `)}if(s.warnings.length){process.stdout.write(` warnings:
37
+ `);for(let n of s.warnings)process.stdout.write(` - ${n}
38
+ `)}return 0}function L(){return process.stdout.write(["oracle plugins setup","","Agent Plugins (https://agent-plugins.org/) is an open standard for","portable AI agent tooling. Plugins ship skills and MCP servers in a","standard package format that works across compatible clients.","","To create a plugin:"," 1. Create a directory with a plugin.json manifest"," 2. Add skills as .md files in skills/"," 3. Add MCP server configs as .json files in mcp/"," 4. Validate: oracle plugins scan <dir>"," 5. Install: oracle plugins install <dir>","","To install an existing plugin:"," oracle plugins install <path> local directory"," oracle plugins install <git-url> git repository","",`schema: ${f}`,""].join(`
39
+ `)),0}var Q={name:"plugins",summary:"manage Agent Plugins (open-standard portable agent tooling)",group:"read",usage:v(),async run(e){let t=[...e.argv],r=(t[0]||"help").toLowerCase(),s=t.slice(1);if(r==="-h"||r==="--help"||r==="help")return process.stdout.write(v()+`
40
+ `),0;if(r==="list"||r==="ls")return O();if(r==="install"||r==="add"){let n=s[0];return n?n.startsWith("http://")||n.startsWith("https://")||n.startsWith("git@")?R(n):w(n):(process.stderr.write(`usage: oracle plugins install <path|url>
41
+ `),1)}return r==="remove"||r==="rm"||r==="uninstall"?M(s[0]):r==="scan"||r==="validate"?N(s[0]||"."):r==="setup"?L():(process.stderr.write(`oracle plugins: unknown verb '${r}'
42
+ ${v()}
43
+ `),1)}};export{Q as default};
@@ -0,0 +1,2 @@
1
+ import{spawnSync as t}from"node:child_process";var s={name:"prepare",summary:"build an unsigned swap (alias of route prepare)",group:"read",usage:"oracle prepare <chain> <tokenIn> <tokenOut> <taker> [amt]",async run(e){let a=e.bin("oracle-route.mjs"),r=t(process.execPath,[a,"prepare",...e.argv],{stdio:"inherit"});return r.error?(process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}
2
+ `),1):typeof r.status=="number"?r.status:1}};export{s as default};
@@ -0,0 +1,3 @@
1
+ import{parseArgs as v}from"node:util";import{spawn as g}from"node:child_process";var m=["SIGINT","SIGTERM","SIGHUP"];function d(s,c=[],o={},n=s){return new Promise(l=>{let e=g(s,c,o),i=!1,a=null,p=new Map(m.map(r=>[r,()=>{a||=r,e.exitCode===null&&e.signalCode===null&&e.kill(r)}]));for(let[r,t]of p)process.on(r,t);let u=()=>{for(let[r,t]of p)process.off(r,t)};e.once("error",r=>{i||(i=!0,u(),process.stderr.write(`oracle: could not start ${n}: ${r.message}
2
+ `),l(1))}),e.once("exit",(r,t)=>{if(i)return;i=!0,u();let f=a||t;if(f){process.kill(process.pid,f);return}l(r??1)})})}var S={name:"public",summary:"secret-free public HTTP surface",group:"read",usage:"oracle public serve [--port N]",async run(s){if((s.argv[0]||"serve")!=="serve")return process.stderr.write(`usage: oracle public serve [--port N]
3
+ `),1;let o=null;try{let{values:e}=v({args:s.argv.slice(1),options:{port:{type:"string"}},allowPositionals:!0,strict:!1});o=e.port||null}catch{}let n={...process.env};o&&(n.ORACLE_PUBLIC_PORT=String(o));let l=s.bin("oracle-public-server.mjs");return d(process.execPath,[l],{stdio:"inherit",env:n},"oracle-public-server")}};export{S as default};
@@ -0,0 +1,23 @@
1
+ import{keccak_256 as S}from"@noble/hashes/sha3.js";import{createHash as q}from"node:crypto";var X=new Set([408,425,429,500,502,503,504]),v=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),K=2,C=4e3,T=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Z=new Set([301,302,303,307,308]),I=3;function Q(t){let e=String(t||"").toLowerCase();return T.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function ee(t){let e={};for(let[n,r]of Object.entries(t||{}))Q(n)||(e[n]=r);return e}function te(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 ne(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var R=new Map;function re(t,e,n){let r={};for(let[c,b]of Object.entries(n||{}))r[c.toLowerCase()]=b;let o=Object.keys(r).filter(c=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(c)),a=[...new Set([...T,...o])].sort().map(c=>`${c}=${r[c]??""}`).join(`
2
+ `),i=q("sha256").update(a).digest("hex").slice(0,32);return`${t} ${e} ${i}`}function oe(t,e){let n=Number(e);return Number.isFinite(n)&&n>0?Math.min(n*1e3,C):Math.min(250*2**t,C)+Math.floor(Math.random()*100)}var se=t=>new Promise(e=>setTimeout(e,t));async function ce(t,{fetchImpl:e,method:n,headers:r,body:o,timeoutMs:s}){let a=new AbortController,i=setTimeout(()=>a.abort(),s);try{let c=String(t),b={...r||{}};for(let h=0;h<=I;h+=1){let u=await e(c,{method:n,headers:b,body:o,signal:a.signal,redirect:"manual"}),p=await u.text(),f=null;if(p)try{f=JSON.parse(p)}catch{f=null}if(Z.has(u.status)){if(n!=="GET"&&n!=="HEAD"){let d=new Error(`HTTP ${u.status} ${n} ${c} redirected non-idempotent request`);throw d.status=u.status,d.body=f??p.slice(0,300),d}if(h===I)throw new Error(`HTTP redirect loop for ${t}`);let l=te(u.headers?.get?.("location"),c);ne(l,c)||(b=ee(b)),c=l;continue}if(!u.ok){let l=new Error(`HTTP ${u.status} ${n} ${c}`);throw l.status=u.status,l.retryAfter=u.headers?.get?.("retry-after")??null,l.body=f??p.slice(0,300),l}return f??p}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(i)}}async function N(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,o=(e.method||"GET").toUpperCase(),s={Accept:"application/json",...e.headers||{}},a=e.body;a!=null&&typeof a!="string"&&(s["Content-Type"]=s["Content-Type"]||"application/json",a=JSON.stringify(a));let i=Number.isInteger(e.retries)?Math.max(e.retries,0):K,c=async()=>{let f;for(let l=0;l<=i;l++)try{return await ce(t,{fetchImpl:n,method:o,headers:s,body:a,timeoutMs:r})}catch(d){f=d;let E=d?.status,G=d?.name==="AbortError",J=new Set([408,425,429]),W=E!=null?J.has(E)||X.has(E)&&v.has(o):!G&&v.has(o);if(l===i||!W)throw d;await se(oe(l,d?.retryAfter))}throw f};if(!(e.dedupe!==!1&&o==="GET"&&a==null))return c();let h=re(o,t,s),u=R.get(h);if(u)return u;let p=c().finally(()=>R.delete(h));return R.set(h,p),p}var k={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}},ae=new Map(Object.values(k).map(t=>[t.chainId,t]));function L(t){return ae.get(Number(t))||null}function P(t,e=process.env){let n=L(t);if(!n)return null;for(let r of n.rpcEnv){let o=(e[r]||"").trim();if(o)return o}return null}import{Interface as ie,getAddress as ke}from"ethers";var Le=new ie(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var ue={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 le(t,{rpcUrl:e,env:n=process.env}={}){if(e)return e;let r=P(t,n);return r||ue[Number(t)]||null}var de=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function pe(t){let e=String(t||""),n=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!de.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 $(t,e,n=[],r={}){let o=String(e||"");pe(o);let s=le(t,r);if(!s)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let i=await N(s,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(i?.error){let c=new Error(i.error.message||JSON.stringify(i.error));throw c.code=i.error.code,c}return i.result}var g=999,x=1,fe=8453,H="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",he="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",B="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",me="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",we=".80002105.reverse",_=/^0x[a-fA-F0-9]{40}$/,U=new TextEncoder,M=t=>"0x"+Buffer.from(t).toString("hex"),m=t=>M(S(U.encode(t))).slice(0,10),O=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function y(t){let e=new Uint8Array(32);if(t)for(let n of String(t).split(".").reverse()){let r=S(U.encode(n)),o=new Uint8Array(64);o.set(e,0),o.set(r,32),e=S(o)}return M(e)}function A(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 o=e.slice(n+64,n+64+r*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function w(t,e,n){try{return await $(t,"eth_call",[{to:e,data:n},"latest"])}catch{return null}}async function be(t){let e=await w(g,H,m("primaryName(address)")+O(t)),n=A(e);return n?n.endsWith(".hl")?n:`${n}.hl`:null}async function ye(t){let e=await w(g,he,m("getName(address)")+O(t)),n=A(e);return n?n.endsWith(".hype")?n:`${n}.hype`:null}async function D(t,e,n){let r=await w(t,n,m("name(bytes32)")+e.slice(2));return A(r)||null}async function Ee(t){let e=y(`${t.slice(2).toLowerCase()}.addr.reverse`),n=await w(x,B,m("resolver(bytes32)")+e.slice(2));if(!n)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:D(x,e,r)}async function Re(t){let e=y(t.slice(2).toLowerCase()+we);return D(fe,e,me)}var F=[{source:"hl",fn:be},{source:"hype",fn:ye},{source:"ens",fn:Ee},{source:"basename",fn:Re}];async function j(t){if(!_.test(String(t||"").trim()))return null;let e=String(t).trim();for(let{source:n,fn:r}of F){let o=await r(e);if(o)return{name:o,source:n,address:e}}return null}async function Se(t){let e=y(t),n=await w(g,H,m("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 xe(t,e,n){let r=y(e),o=await w(t,n,m("resolver(bytes32)")+r.slice(2));if(!o)return null;let s="0x"+o.slice(-40);if(/^0x0+$/.test(s))return null;let a=await w(t,s,m("addr(bytes32)")+r.slice(2));if(!a)return null;let i="0x"+a.slice(-40);return/^0x0+$/.test(i)?null:i}async function V(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let n=await Se(e);return n?{address:n,source:"hl",name:e}:null}if(e.endsWith(".eth")){let n=await xe(x,e,B);return n?{address:n,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var z=F.map(t=>t.source);var Y=`oracle resolve <name-or-address> [--json]
3
+
4
+ oracle resolve demi.hl
5
+ oracle resolve vitalik.eth
6
+ oracle resolve 0x1111111111111111111111111111111111111111
7
+
8
+ Reads on-chain name records. No API key: HL Names publishes a paid REST API,
9
+ but the contract answers primaryName(address) for free.
10
+
11
+ Sources, in priority order: ${z.join(", ")}.`;async function ge(t=[]){let e=t.filter(o=>o!=="--json"),n=t.includes("--json"),r=(e[0]||"").trim();if(!r||r==="--help"||r==="-h")return process.stdout.write(Y+`
12
+ `),r?0:1;try{if(_.test(r)){let s=await j(r);return n?(process.stdout.write(JSON.stringify({address:r,name:s?.name??null,source:s?.source??null})+`
13
+ `),0):s?(process.stdout.write(`${r}
14
+ ${s.name} [${s.source}]
15
+ `),0):(process.stdout.write(`${r}
16
+ no name record found
17
+ `),0)}let o=await V(r);return n?(process.stdout.write(JSON.stringify({name:r,address:o?.address??null,source:o?.source??null})+`
18
+ `),0):o?(process.stdout.write(`${r}
19
+ ${o.address} [${o.source}]
20
+ `),0):(process.stdout.write(`${r}
21
+ unresolved (no owner record)
22
+ `),0)}catch(o){return process.stderr.write(`resolve failed: ${o?.message||o}
23
+ `),1}}var Me={name:"resolve",summary:"resolve .hl/.hype/.eth names to addresses and back",usage:Y,async run(t){return ge(t.argv||[])}};export{Me as default};
@@ -0,0 +1,2 @@
1
+ import{spawnSync as o}from"node:child_process";var t={name:"route",summary:"swap/bridge prepare helpers",group:"read",usage:"oracle route <swap|bridge|prepare|prepare-bridge> ...",async run(e){let a=e.bin("oracle-route.mjs"),r=o(process.execPath,[a,...e.argv],{stdio:"inherit"});return r.error?(process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}
2
+ `),1):typeof r.status=="number"?r.status:1}};export{t as default};
@@ -0,0 +1 @@
1
+ var n={name:"runner",summary:"action runner daemon",group:"sign",usage:"oracle runner [--interval-ms N ...]",async run(r){return r.dispatchOperator("oracle-runner",r.argv,{appendHintOnError:!0})}};export{n as default};
@@ -0,0 +1,2 @@
1
+ import{spawnSync as a}from"node:child_process";var o={name:"scan",summary:"chain scanner",group:"read",usage:"oracle scan <chains|head|token|pools|risk|quote|sell> ...",async run(e){let s=e.bin("oracle-scan.mjs"),r=a(process.execPath,[s,...e.argv],{stdio:"inherit"});return r.error?(process.stderr.write(`oracle: failed to spawn oracle-scan: ${r.error.message}
2
+ `),1):typeof r.status=="number"?r.status:1}};export{o as default};