@oracle-agent/oracle 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +82 -91
  3. package/SECURITY.md +37 -12
  4. package/SETUP.md +207 -272
  5. package/dist/action-receipts.mjs +1 -0
  6. package/dist/action-semantics.mjs +1 -0
  7. package/dist/address-book.mjs +2 -0
  8. package/dist/bin/desk-server.mjs +14 -0
  9. package/dist/bin/oracle-data-mcp.mjs +8 -0
  10. package/dist/bin/oracle-init.mjs +24 -0
  11. package/dist/bin/oracle-public-server.mjs +5 -0
  12. package/dist/bin/oracle-route.mjs +22 -0
  13. package/dist/bin/oracle-scan.mjs +18 -0
  14. package/dist/bin/oracle-upgrade.mjs +21 -0
  15. package/dist/bin/oracle.mjs +68 -0
  16. package/dist/chains.mjs +1 -0
  17. package/dist/cli/commands/auth.mjs +16 -0
  18. package/dist/cli/commands/bootstrap.mjs +18 -0
  19. package/dist/cli/commands/chain.mjs +21 -0
  20. package/dist/cli/commands/chat.mjs +35 -0
  21. package/dist/cli/commands/credential.mjs +1 -0
  22. package/dist/cli/commands/data-mcp.mjs +2 -0
  23. package/dist/cli/commands/data.mjs +12 -0
  24. package/dist/cli/commands/doctor.mjs +5 -0
  25. package/dist/cli/commands/gate.mjs +13 -0
  26. package/dist/cli/commands/help.mjs +1 -0
  27. package/dist/cli/commands/init.mjs +3 -0
  28. package/dist/cli/commands/mcp.mjs +33 -0
  29. package/dist/cli/commands/model.mjs +44 -0
  30. package/dist/cli/commands/prepare.mjs +2 -0
  31. package/dist/cli/commands/public.mjs +3 -0
  32. package/dist/cli/commands/route.mjs +2 -0
  33. package/dist/cli/commands/runner.mjs +1 -0
  34. package/dist/cli/commands/scan.mjs +2 -0
  35. package/dist/cli/commands/setup.mjs +34 -0
  36. package/dist/cli/commands/sign.mjs +4 -0
  37. package/dist/cli/commands/signer.mjs +1 -0
  38. package/dist/cli/commands/upgrade.mjs +2 -0
  39. package/dist/cli/commands/vault.mjs +1 -0
  40. package/dist/cli/commands/version.mjs +2 -0
  41. package/dist/data/desk-data.mjs +12 -0
  42. package/dist/index.mjs +17 -0
  43. package/dist/nft-gas-war-guard.mjs +1 -0
  44. package/dist/onboarding/harness-configs.mjs +4 -0
  45. package/dist/portfolio-risk.mjs +1 -0
  46. package/dist/prepare-envelope.mjs +1 -0
  47. package/dist/public-control/policy-schema.mjs +1 -0
  48. package/dist/router/index.mjs +2 -0
  49. package/dist/scanner/index.mjs +4 -0
  50. package/dist/signals/index.mjs +1 -0
  51. package/dist/watch-preferences.mjs +1 -0
  52. package/package.json +27 -65
  53. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  54. package/public/oracle-splash/brand/aave.webp +0 -0
  55. package/public/oracle-splash/brand/aavev2.webp +0 -0
  56. package/public/oracle-splash/brand/aborean.webp +0 -0
  57. package/public/oracle-splash/brand/across.webp +0 -0
  58. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  59. package/public/oracle-splash/brand/afi.webp +0 -0
  60. package/public/oracle-splash/brand/arcus.webp +0 -0
  61. package/public/oracle-splash/brand/aster.webp +0 -0
  62. package/public/oracle-splash/brand/avant.webp +0 -0
  63. package/public/oracle-splash/brand/balancer.webp +0 -0
  64. package/public/oracle-splash/brand/beefy.webp +0 -0
  65. package/public/oracle-splash/brand/benqi.webp +0 -0
  66. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  67. package/public/oracle-splash/brand/bitfi.webp +0 -0
  68. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  69. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  70. package/public/oracle-splash/brand/camelot.webp +0 -0
  71. package/public/oracle-splash/brand/compound.webp +0 -0
  72. package/public/oracle-splash/brand/concrete.webp +0 -0
  73. package/public/oracle-splash/brand/cow.webp +0 -0
  74. package/public/oracle-splash/brand/curve.webp +0 -0
  75. package/public/oracle-splash/brand/derive.webp +0 -0
  76. package/public/oracle-splash/brand/dolomite.webp +0 -0
  77. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  78. package/public/oracle-splash/brand/ekubo.webp +0 -0
  79. package/public/oracle-splash/brand/ethena.webp +0 -0
  80. package/public/oracle-splash/brand/etherfi.webp +0 -0
  81. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  82. package/public/oracle-splash/brand/felix.webp +0 -0
  83. package/public/oracle-splash/brand/fluid.webp +0 -0
  84. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  85. package/public/oracle-splash/brand/folks.webp +0 -0
  86. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  87. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  88. package/public/oracle-splash/brand/gassss.webp +0 -0
  89. package/public/oracle-splash/brand/gmx.webp +0 -0
  90. package/public/oracle-splash/brand/harmonix.webp +0 -0
  91. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  92. package/public/oracle-splash/brand/hlp.webp +0 -0
  93. package/public/oracle-splash/brand/hop.webp +0 -0
  94. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  95. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  96. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  97. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  98. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  99. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  100. package/public/oracle-splash/brand/hypha.webp +0 -0
  101. package/public/oracle-splash/brand/joedex.webp +0 -0
  102. package/public/oracle-splash/brand/jupiter.webp +0 -0
  103. package/public/oracle-splash/brand/kelp.webp +0 -0
  104. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  105. package/public/oracle-splash/brand/kmhype.webp +0 -0
  106. package/public/oracle-splash/brand/kona.webp +0 -0
  107. package/public/oracle-splash/brand/konalend.webp +0 -0
  108. package/public/oracle-splash/brand/lfj.webp +0 -0
  109. package/public/oracle-splash/brand/lido.webp +0 -0
  110. package/public/oracle-splash/brand/lifi.webp +0 -0
  111. package/public/oracle-splash/brand/lighter.webp +0 -0
  112. package/public/oracle-splash/brand/lista.webp +0 -0
  113. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  114. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  115. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  116. package/public/oracle-splash/brand/magiceden.webp +0 -0
  117. package/public/oracle-splash/brand/mempool.png +0 -0
  118. package/public/oracle-splash/brand/meteora.webp +0 -0
  119. package/public/oracle-splash/brand/morpho.webp +0 -0
  120. package/public/oracle-splash/brand/myriad.webp +0 -0
  121. package/public/oracle-splash/brand/noxa.webp +0 -0
  122. package/public/oracle-splash/brand/odos.webp +0 -0
  123. package/public/oracle-splash/brand/oneinch.webp +0 -0
  124. package/public/oracle-splash/brand/openbook.webp +0 -0
  125. package/public/oracle-splash/brand/opensea.webp +0 -0
  126. package/public/oracle-splash/brand/orca.webp +0 -0
  127. package/public/oracle-splash/brand/ordinals.png +0 -0
  128. package/public/oracle-splash/brand/ostium.webp +0 -0
  129. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  130. package/public/oracle-splash/brand/pendle.webp +0 -0
  131. package/public/oracle-splash/brand/perena.webp +0 -0
  132. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  133. package/public/oracle-splash/brand/phoenix.webp +0 -0
  134. package/public/oracle-splash/brand/polymarket.webp +0 -0
  135. package/public/oracle-splash/brand/polynomial.webp +0 -0
  136. package/public/oracle-splash/brand/projectx.webp +0 -0
  137. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  138. package/public/oracle-splash/brand/quickswap.webp +0 -0
  139. package/public/oracle-splash/brand/rain.webp +0 -0
  140. package/public/oracle-splash/brand/raydium.webp +0 -0
  141. package/public/oracle-splash/brand/relay.webp +0 -0
  142. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  143. package/public/oracle-splash/brand/saber.webp +0 -0
  144. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  145. package/public/oracle-splash/brand/sanctum.webp +0 -0
  146. package/public/oracle-splash/brand/satflow.png +0 -0
  147. package/public/oracle-splash/brand/sierra.webp +0 -0
  148. package/public/oracle-splash/brand/sky.webp +0 -0
  149. package/public/oracle-splash/brand/solv.webp +0 -0
  150. package/public/oracle-splash/brand/spark.webp +0 -0
  151. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  152. package/public/oracle-splash/brand/sphere.webp +0 -0
  153. package/public/oracle-splash/brand/ssv.webp +0 -0
  154. package/public/oracle-splash/brand/stabble.webp +0 -0
  155. package/public/oracle-splash/brand/stableswap.webp +0 -0
  156. package/public/oracle-splash/brand/stakewise.webp +0 -0
  157. package/public/oracle-splash/brand/stargate.webp +0 -0
  158. package/public/oracle-splash/brand/sthype.webp +0 -0
  159. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  160. package/public/oracle-splash/brand/unisat.png +0 -0
  161. package/public/oracle-splash/brand/uniswap.webp +0 -0
  162. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  163. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  164. package/public/oracle-splash/brand/unit.webp +0 -0
  165. package/public/oracle-splash/brand/velodrome.webp +0 -0
  166. package/public/oracle-splash/brand/velora.webp +0 -0
  167. package/public/oracle-splash/brand/venus.webp +0 -0
  168. package/public/oracle-splash/brand/wbeth.webp +0 -0
  169. package/public/oracle-splash/brand/xsy.webp +0 -0
  170. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  171. package/public/oracle-splash/brand/zerobase.webp +0 -0
  172. package/public/oracle-splash/brand/zerox.webp +0 -0
  173. package/public/oracle-splash/index.html +246 -169
  174. package/CONTRIBUTING.md +0 -98
  175. package/bin/desk-server.mjs +0 -440
  176. package/bin/oracle-data-mcp.mjs +0 -1010
  177. package/bin/oracle-init.mjs +0 -496
  178. package/bin/oracle-public-server.mjs +0 -36
  179. package/bin/oracle-route.mjs +0 -254
  180. package/bin/oracle-scan.mjs +0 -192
  181. package/bin/oracle-upgrade.mjs +0 -42
  182. package/bin/oracle.mjs +0 -33
  183. package/docs/adding-a-chain.md +0 -229
  184. package/docs/architecture.md +0 -136
  185. package/docs/cli.md +0 -47
  186. package/docs/connectors.md +0 -13
  187. package/docs/oracle-pack-standard.md +0 -29
  188. package/docs/profiles.md +0 -154
  189. package/examples/add-a-chain.mjs +0 -65
  190. package/examples/oracle-pack-template.mjs +0 -38
  191. package/examples/research-a-token.mjs +0 -70
  192. package/plugins/oracle-owner-gate/__init__.py +0 -227
  193. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  194. package/profiles/_template/SOUL.md +0 -54
  195. package/profiles/_template/profile.json +0 -22
  196. package/profiles/bitcoin-agent/SOUL.md +0 -31
  197. package/profiles/bitcoin-agent/profile.json +0 -32
  198. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  199. package/profiles/hyperliquid-agent/profile.json +0 -37
  200. package/profiles/oracle/SOUL.md +0 -107
  201. package/profiles/oracle/profile.json +0 -39
  202. package/profiles/polymarket-agent/SOUL.md +0 -35
  203. package/profiles/polymarket-agent/profile.json +0 -34
  204. package/profiles/profile.schema.json +0 -90
  205. package/profiles/protocol-builder/SOUL.md +0 -57
  206. package/profiles/protocol-builder/profile.json +0 -39
  207. package/profiles/robinhood-agent/SOUL.md +0 -53
  208. package/profiles/robinhood-agent/profile.json +0 -40
  209. package/profiles/solana-agent/SOUL.md +0 -37
  210. package/profiles/solana-agent/profile.json +0 -37
  211. package/profiles/stable-agent/SOUL.md +0 -43
  212. package/profiles/stable-agent/profile.json +0 -37
  213. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  214. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  215. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  216. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  217. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  218. package/scripts/adversarial-bench.mjs +0 -114
  219. package/scripts/build-inscription.py +0 -230
  220. package/scripts/check-doc-drift.mjs +0 -112
  221. package/scripts/check-test-count.mjs +0 -105
  222. package/scripts/e2e-hl-markets.mjs +0 -21
  223. package/scripts/e2e-hl-perps.mjs +0 -48
  224. package/scripts/e2e-hypercore-staking.mjs +0 -128
  225. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  226. package/scripts/protocol-template-gate.mjs +0 -15
  227. package/scripts/public-api-scan.mjs +0 -23
  228. package/scripts/secret-scan.mjs +0 -181
  229. package/scripts/verify-v3-venues.mjs +0 -192
  230. package/skills/balance/SKILL.md +0 -176
  231. package/skills/oracle-action-semantics/SKILL.md +0 -40
  232. package/skills/oracle-best-execution/SKILL.md +0 -127
  233. package/skills/oracle-bitcoin/SKILL.md +0 -53
  234. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  235. package/skills/oracle-chat/SKILL.md +0 -61
  236. package/skills/oracle-chat/chain.SKILL.md +0 -31
  237. package/skills/oracle-chat/setup.SKILL.md +0 -37
  238. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  239. package/skills/oracle-contract-research/SKILL.md +0 -55
  240. package/skills/oracle-desk/SKILL.md +0 -58
  241. package/skills/oracle-dex-launch/SKILL.md +0 -38
  242. package/skills/oracle-grants/SKILL.md +0 -69
  243. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  244. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  245. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  246. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  247. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  248. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  249. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  250. package/skills/oracle-polymarket/SKILL.md +0 -60
  251. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  252. package/skills/oracle-protocol-security/SKILL.md +0 -60
  253. package/skills/oracle-public-product/SKILL.md +0 -44
  254. package/skills/oracle-receipts/SKILL.md +0 -52
  255. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  256. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  257. package/skills/oracle-solana/SKILL.md +0 -65
  258. package/skills/oracle-solana-nft/SKILL.md +0 -54
  259. package/skills/oracle-token-research/SKILL.md +0 -67
  260. package/skins/oracle.yaml +0 -56
  261. package/src/action-receipts.mjs +0 -168
  262. package/src/action-semantics.mjs +0 -62
  263. package/src/address-book.mjs +0 -208
  264. package/src/agent-auth.mjs +0 -206
  265. package/src/approval-guard.mjs +0 -282
  266. package/src/attestation-secret.mjs +0 -88
  267. package/src/audit-log.mjs +0 -196
  268. package/src/auth/oauth.mjs +0 -672
  269. package/src/auto-slippage.mjs +0 -378
  270. package/src/capability-posture.mjs +0 -125
  271. package/src/chains.mjs +0 -62
  272. package/src/cli/chain-catalog.mjs +0 -215
  273. package/src/cli/chain-state.mjs +0 -74
  274. package/src/cli/commands/auth.mjs +0 -193
  275. package/src/cli/commands/bootstrap.mjs +0 -87
  276. package/src/cli/commands/chain.mjs +0 -143
  277. package/src/cli/commands/chat.mjs +0 -434
  278. package/src/cli/commands/credential.mjs +0 -9
  279. package/src/cli/commands/data-mcp.mjs +0 -18
  280. package/src/cli/commands/data.mjs +0 -73
  281. package/src/cli/commands/doctor.mjs +0 -126
  282. package/src/cli/commands/help.mjs +0 -7
  283. package/src/cli/commands/init.mjs +0 -27
  284. package/src/cli/commands/mcp.mjs +0 -142
  285. package/src/cli/commands/model.mjs +0 -99
  286. package/src/cli/commands/prepare.mjs +0 -12
  287. package/src/cli/commands/public.mjs +0 -20
  288. package/src/cli/commands/route.mjs +0 -12
  289. package/src/cli/commands/runner.mjs +0 -9
  290. package/src/cli/commands/scan.mjs +0 -12
  291. package/src/cli/commands/setup.mjs +0 -275
  292. package/src/cli/commands/sign.mjs +0 -21
  293. package/src/cli/commands/signer.mjs +0 -9
  294. package/src/cli/commands/upgrade.mjs +0 -12
  295. package/src/cli/commands/vault.mjs +0 -9
  296. package/src/cli/commands/version.mjs +0 -22
  297. package/src/cli/first-run.mjs +0 -23
  298. package/src/cli/kernel.mjs +0 -239
  299. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  300. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  301. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  302. package/src/cli/mcp-targets/codex.mjs +0 -41
  303. package/src/cli/mcp-targets/shared.mjs +0 -61
  304. package/src/cli/messaging-platforms.mjs +0 -209
  305. package/src/cli/model-config.mjs +0 -70
  306. package/src/cli/operator-dispatch.mjs +0 -258
  307. package/src/cli/oracle-harness.py +0 -415
  308. package/src/cli/paths.mjs +0 -83
  309. package/src/cli/runtime.mjs +0 -351
  310. package/src/cli/setup-state.mjs +0 -168
  311. package/src/cli/spawn-child.mjs +0 -43
  312. package/src/data/catalog.mjs +0 -554
  313. package/src/data/desk-data.mjs +0 -683
  314. package/src/data/http.mjs +0 -253
  315. package/src/data/provider-endpoint.mjs +0 -94
  316. package/src/data/providers/aerodrome.mjs +0 -245
  317. package/src/data/providers/balancer.mjs +0 -209
  318. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  319. package/src/data/providers/bitcoin-meta.mjs +0 -378
  320. package/src/data/providers/blockscout.mjs +0 -14
  321. package/src/data/providers/bridges.mjs +0 -242
  322. package/src/data/providers/cowswap.mjs +0 -415
  323. package/src/data/providers/curve.mjs +0 -201
  324. package/src/data/providers/defillama.mjs +0 -88
  325. package/src/data/providers/dexscreener.mjs +0 -43
  326. package/src/data/providers/evm-rpc.mjs +0 -222
  327. package/src/data/providers/geckoterminal.mjs +0 -34
  328. package/src/data/providers/gmx.mjs +0 -496
  329. package/src/data/providers/hl-assets.mjs +0 -165
  330. package/src/data/providers/hl-info.mjs +0 -108
  331. package/src/data/providers/hl-markets.mjs +0 -210
  332. package/src/data/providers/hl-outcome.mjs +0 -61
  333. package/src/data/providers/hl-perps.mjs +0 -387
  334. package/src/data/providers/hl-staking.mjs +0 -353
  335. package/src/data/providers/hl-ws.mjs +0 -119
  336. package/src/data/providers/hyperevm-dex.mjs +0 -49
  337. package/src/data/providers/jupiter.mjs +0 -183
  338. package/src/data/providers/lifi.mjs +0 -151
  339. package/src/data/providers/magiceden-sol.mjs +0 -393
  340. package/src/data/providers/morpho.mjs +0 -173
  341. package/src/data/providers/nft-gallery.mjs +0 -163
  342. package/src/data/providers/nft-portfolio.mjs +0 -494
  343. package/src/data/providers/odos.mjs +0 -156
  344. package/src/data/providers/oneinch.mjs +0 -174
  345. package/src/data/providers/opensea-multichain.mjs +0 -136
  346. package/src/data/providers/opensea-nft.mjs +0 -371
  347. package/src/data/providers/paraswap.mjs +0 -118
  348. package/src/data/providers/pendle.mjs +0 -187
  349. package/src/data/providers/poly-clob.mjs +0 -283
  350. package/src/data/providers/poly-public.mjs +0 -96
  351. package/src/data/providers/poly-ws.mjs +0 -103
  352. package/src/data/providers/portfolio-history.mjs +0 -394
  353. package/src/data/providers/portfolio.mjs +0 -594
  354. package/src/data/providers/rfq.mjs +0 -15
  355. package/src/data/providers/rh-agent.mjs +0 -59
  356. package/src/data/providers/satflow.mjs +0 -338
  357. package/src/data/providers/solana-rpc.mjs +0 -197
  358. package/src/data/providers/uniswap-v3.mjs +0 -320
  359. package/src/data/providers/zerox.mjs +0 -167
  360. package/src/data/public-api-scan.mjs +0 -61
  361. package/src/data/quote-placeholder.mjs +0 -31
  362. package/src/exact-integer.mjs +0 -72
  363. package/src/exec-policy.mjs +0 -455
  364. package/src/flags.mjs +0 -15
  365. package/src/fresh-window.mjs +0 -76
  366. package/src/gmx-attestation.mjs +0 -176
  367. package/src/index.mjs +0 -100
  368. package/src/nft-gas-war-guard.mjs +0 -139
  369. package/src/onboarding/agent-keys.mjs +0 -161
  370. package/src/onboarding/harness-configs.mjs +0 -102
  371. package/src/onboarding/index.mjs +0 -18
  372. package/src/onboarding/tiers.mjs +0 -139
  373. package/src/oracle-env.mjs +0 -47
  374. package/src/portfolio-risk.mjs +0 -170
  375. package/src/prepare-envelope.mjs +0 -186
  376. package/src/profile-upgrade.mjs +0 -277
  377. package/src/protocol-execution.mjs +0 -84
  378. package/src/protocol-templates/gate.mjs +0 -179
  379. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  380. package/src/public-api/buzz-integration.mjs +0 -256
  381. package/src/public-api/connect-agent.mjs +0 -416
  382. package/src/public-api/grants.mjs +0 -142
  383. package/src/public-api/http.mjs +0 -389
  384. package/src/public-control/aa-adapter.mjs +0 -402
  385. package/src/public-control/build-registry.mjs +0 -227
  386. package/src/public-control/bundler-client.mjs +0 -357
  387. package/src/public-control/grant-indexer.mjs +0 -296
  388. package/src/public-control/policy-render.mjs +0 -69
  389. package/src/public-control/policy-schema.mjs +0 -318
  390. package/src/public-control/runtime-config.mjs +0 -275
  391. package/src/public-control/session-key-model.mjs +0 -374
  392. package/src/public-control/session-orchestrator.mjs +0 -412
  393. package/src/rfq/intent.mjs +0 -180
  394. package/src/rfq/sources.mjs +0 -181
  395. package/src/route-attestation.mjs +0 -132
  396. package/src/router/best-execution.mjs +0 -326
  397. package/src/router/index.mjs +0 -226
  398. package/src/router/prepare-bridge.mjs +0 -289
  399. package/src/router/prepare-route.mjs +0 -381
  400. package/src/router/proposal.mjs +0 -311
  401. package/src/router/risk-classifier.mjs +0 -119
  402. package/src/router/route-sources.mjs +0 -329
  403. package/src/scanner/chains.config.mjs +0 -430
  404. package/src/scanner/contract.mjs +0 -270
  405. package/src/scanner/evm-scanner.mjs +0 -394
  406. package/src/scanner/index.mjs +0 -9
  407. package/src/scanner/v2-venue.mjs +0 -335
  408. package/src/scanner/v3-venue.mjs +0 -290
  409. package/src/scopes.mjs +0 -44
  410. package/src/sell-simulation.mjs +0 -167
  411. package/src/signals/engine.mjs +0 -146
  412. package/src/signals/index.mjs +0 -1
  413. package/src/token-transfer-guard.mjs +0 -188
  414. package/src/tui/app.mjs +0 -438
  415. package/src/tui/backend.mjs +0 -145
  416. package/src/tui/format.mjs +0 -272
  417. package/src/tui/gateway-client.mjs +0 -177
  418. package/src/tui/input.mjs +0 -501
  419. package/src/tui/renderer.mjs +0 -443
  420. package/src/tui/standalone-client.mjs +0 -666
  421. package/src/tui/theme.mjs +0 -81
  422. package/src/vault-attestation.mjs +0 -146
  423. package/src/venues.mjs +0 -206
  424. package/src/watch-preferences.mjs +0 -85
@@ -1,229 +0,0 @@
1
- # Adding a chain
2
-
3
- Oracle treats a chain as **configuration**. You do not write an integration.
4
-
5
- ## The short version
6
-
7
- ```js
8
- import { registerCustomChain } from "@oracle-agent/oracle/scanner";
9
-
10
- registerCustomChain({
11
- key: "mychain",
12
- chainId: 7777,
13
- name: "My Chain",
14
- rpcEnv: ["MYCHAIN_RPC_URL"],
15
- nativeCurrency: { symbol: "MYC", decimals: 18 },
16
- });
17
- ```
18
-
19
- That chain now has block reads, native and ERC-20 balances, on-chain token
20
- resolution, log scanning, and structural risk checks. No code was written.
21
-
22
- ```bash
23
- export MYCHAIN_RPC_URL=https://rpc.mychain.example
24
- oracle-scan head mychain
25
- ```
26
-
27
- ## Config fields
28
-
29
- | Field | Required | Notes |
30
- |---|---|---|
31
- | `key` | yes | lowercase slug, used on the CLI |
32
- | `chainId` | yes | positive integer |
33
- | `name` | yes | display name |
34
- | `rpcEnv` | yes | env var names, `UPPER_SNAKE`. Never a literal URL |
35
- | `nativeCurrency` | no | `{ symbol, decimals }` |
36
- | `explorer` | no | base URL |
37
- | `dexscreenerSlug` | no | enables pool discovery — see below |
38
- | `venues` | no | verified routers/quoters — required for routing value |
39
-
40
- **RPC URLs live in the environment, never in config.** A repo carrying an endpoint
41
- is both a leak and a rate-limit problem for whoever else uses that key.
42
-
43
- ## Why `dexscreenerSlug` matters
44
-
45
- Pool discovery goes through market data rather than walking a factory. A factory
46
- walk finds pools that *exist*; a trader needs pools with *liquidity*.
47
-
48
- The slug is DexScreener's own chain identifier — not the chain id, and not always
49
- the obvious name. If you don't know it, **leave it out**. Pool discovery then
50
- reports `UNAVAILABLE`, which is honest. A wrong slug silently returns another
51
- chain's pools, which is worse than no answer.
52
-
53
- ## Adding venues (routing value)
54
-
55
- A chain with no verified venue is **fail-closed**: read and research work, routing
56
- value does not. That is a safe default, not a gap.
57
-
58
- To enable routing you must record *provenance*:
59
-
60
- ```js
61
- venues: [
62
- {
63
- kind: "router",
64
- address: "0x...",
65
- verified: {
66
- method: "eth_getCode + protocol /chains API",
67
- source: "https://li.quest/v1/chains",
68
- date: "2026-07-30",
69
- },
70
- },
71
- ]
72
- ```
73
-
74
- Validation **refuses** a venue without `verified`. This is not bureaucracy: the
75
- destination allowlist is the highest-leverage control in the system, and
76
- allowlisting a spoofed router makes every other guard irrelevant.
77
-
78
- ### How to actually verify
79
-
80
- 1. **Bytecode exists** — `eth_getCode` must return real code. `0x` means nothing is
81
- deployed at that address on that chain.
82
- 2. **The protocol's own API or docs** names that address, for that chain, today.
83
- Query the source (e.g. LI.FI's `/v1/chains` returns each chain's official
84
- `diamondAddress`) rather than trusting a blog post or a model's recollection.
85
- 3. **Constructor-bound addresses match** — read `factory()`, `WETH9()` back off the
86
- deployed contract and confirm they're what you expect.
87
- 4. **Per chain, separately.** An address verified on Arbitrum is not verified on
88
- Ethereum, even when the canonical deployment shares an address across chains.
89
-
90
- Record how and when. The audit trail has to outlive your session.
91
-
92
- ## Capabilities
93
-
94
- Ten capabilities exist. The generic EVM scanner provides seven out of the box:
95
-
96
- | Capability | Generic? | Why |
97
- |---|---|---|
98
- | `blockNumber` | yes | standard RPC |
99
- | `nativeBalance` | yes | standard RPC |
100
- | `tokenBalance` | yes | ERC-20 is ERC-20 |
101
- | `resolveToken` | yes | reads metadata off the contract |
102
- | `resolvePools` | yes* | needs `dexscreenerSlug` |
103
- | `scanBlocks` | yes | chunked `eth_getLogs` |
104
- | `scoreRisk` | yes | structural checks |
105
- | `quote` | venue | needs a verified router |
106
- | `sellSimulation` | venue | needs a verified router |
107
- | `prepareUnsignedTx` | venue | needs a verified router |
108
-
109
- Calling an unimplemented capability **throws**, naming what is supported. It never
110
- returns `undefined` that a caller could mistake for "no result."
111
-
112
- ## Enabling quote / sell / prepare
113
-
114
- Add a verified router plus two fields:
115
-
116
- ```js
117
- {
118
- key: "base",
119
- chainId: 8453,
120
- // ...
121
- venueKind: "uniswap-v2",
122
- wrappedNative: "0x4200000000000000000000000000000000000006",
123
- venues: [{ kind: "router", address: "0x...", verified: { /* ... */ } }],
124
- }
125
- ```
126
-
127
- `src/scanner/chains.config.mjs` ships **Base** wired this way as the reference. It
128
- gets all 10 capabilities; every other built-in stays at 7 and fail-closed until
129
- someone verifies a venue for it.
130
-
131
- What you get:
132
-
133
- - **`quote`** — live exact-input pricing via `getAmountsOut`
134
- - **`sellSimulation`** — a state-free round trip (buy then sell back) that catches
135
- the honeypot signature: buy leg quotes fine, sell leg fails. This is the single
136
- most valuable check on a low-cap venue, because most losses are not bad entries
137
- but tokens that cannot be exited
138
- - **`prepareUnsignedTx`** — an **unsigned** swap with a `minOut` computed from the
139
- live quote, a deadline, and an explicit `approve` step listed separately so
140
- "approved" and "swapped" are never collapsed into one claim
141
-
142
- `scoreRisk` also upgrades automatically: with a router it reports real sellability
143
- instead of `UNKNOWN`.
144
-
145
- ### The slippage ceiling is hard
146
-
147
- A supplied `slippageBps` is a **maximum**, capped at 100 bps. Above that,
148
- `prepareUnsignedTx` throws rather than widening:
149
-
150
- ```
151
- slippageBps 250 exceeds the 100 bps ceiling. Block and requote or split
152
- the order -- do not widen the guard to force a fill.
153
- ```
154
-
155
- A cap that yields under pressure is decoration.
156
-
157
- ### V3 / V4 / custom quoters
158
-
159
- Two adapters ship:
160
-
161
- | `venueKind` | Requires | Prices via |
162
- |---|---|---|
163
- | `uniswap-v2` | `router` | `getAmountsOut` on the router |
164
- | `uniswap-v3` | `quoter` **and** `router` | `quoteExactInputSingle` on QuoterV2 |
165
-
166
- V3 is **not** V2 with different addresses: it has no `getAmountsOut`, prices through
167
- a separate Quoter contract, and needs an explicit fee tier per hop. Encoding a V3
168
- swap with V2 assumptions yields a transaction that reverts, or worse routes through
169
- the wrong pool. That is why they are sibling adapters.
170
-
171
- The V3 adapter searches all four fee tiers (100 / 500 / 3000 / 10000) and keeps the
172
- best. This is necessary, not a nicety — liquidity concentrates in one tier and which
173
- tier varies by pair and chain. On Arbitrum WETH→USDC the 500 tier returns ~2.4% more
174
- than the 100 tier; defaulting to 0.3% because it is the common choice silently
175
- misprices stable and exotic pairs alike.
176
-
177
- A V3 chain needs **both** a quoter and a router. A router alone stays fail-closed:
178
- it could encode a swap, but with no priced expectation to guard against — exactly
179
- the state that produces an unbounded fill.
180
-
181
- **V4 and custom-quoter venues still need their own adapter.** Some forks require an
182
- off-chain signed quote you cannot produce locally. Write a sibling module rather
183
- than bending an existing one; silently mis-encoding a swap is far worse than
184
- declaring the capability unsupported.
185
-
186
- ### Verifying a venue: run the prober
187
-
188
- `scripts/verify-v3-venues.mjs` probes candidate addresses on every chain and prints
189
- a pass/fail with the live price it got:
190
-
191
- ```bash
192
- node scripts/verify-v3-venues.mjs
193
- ```
194
-
195
- **Codesize is not verification.** The canonical mainnet QuoterV2 address returns
196
- 2109 bytes of bytecode on Base — it is *some* contract, just not a working quoter
197
- for that chain. A codesize check waves it through; the functional probe caught it
198
- and pointed at Base's real quoter (8273 bytes, prices WETH→USDC correctly).
199
-
200
- The rule: **a contract that correctly prices a pair you can sanity-check IS the
201
- thing you think it is.** Anything less is a guess with an address attached.
202
-
203
- ## Honest evidence
204
-
205
- Every finding carries a label. Respect the distinction:
206
-
207
- - `LIVE` — read this call
208
- - `CACHED` — recent, within stated TTL
209
- - `STALE` — older than TTL; usable only with the caveat stated
210
- - `UNKNOWN` — we tried and could not determine it
211
- - `UNAVAILABLE` — this chain/provider cannot answer at all
212
-
213
- `UNKNOWN` and `UNAVAILABLE` are different facts. Collapsing them is how people end
214
- up sizing against stale reserves.
215
-
216
- Risk verdicts are coarse on purpose — `PASS` / `CAUTION` / `FAIL` / `UNKNOWN`. A
217
- score like "risk 62/100" invites trading a number nobody understands.
218
-
219
- **`UNKNOWN` is not `PASS`.** The generic scanner returns `UNKNOWN` for sellability
220
- because it cannot prove exitability without a verified router. A token is not
221
- tradeable until a round-trip sell simulation succeeds.
222
-
223
- ## Contributing a chain upstream
224
-
225
- Append to `CHAIN_CONFIGS` in `src/scanner/chains.config.mjs` and open a PR. Tests
226
- already assert every built-in config validates and that none embeds an RPC URL, so
227
- CI will catch a malformed entry.
228
-
229
- If you add venues, put the verification method and date in the PR body.
@@ -1,136 +0,0 @@
1
- # Architecture
2
-
3
- Three planes. The boundary between them is enforced by a test, not a convention.
4
-
5
- ```
6
- user's wallet
7
- ^
8
- | signs (only the user can)
9
- |
10
- +---------------------+---------------------+
11
- | unsigned artifacts |
12
- | |
13
- | PUBLIC (this repo) |
14
- | |
15
- | data plane read / quote |
16
- | policy plane allowlists, guards, |
17
- | attestations, grants |
18
- | control plane grant lifecycle, |
19
- | session keys, AA, router |
20
- +-------------------------------------------+
21
- |
22
- x no import may cross
23
- |
24
- +-------------------------------------------+
25
- | OWNER-LOCAL (companion package) |
26
- | @oracle-agent/operator |
27
- | key-vault / hl-exec / oracle-vault |
28
- +-------------------------------------------+
29
- ```
30
-
31
- ## Why three planes
32
-
33
- The design assumption is that **the model can be wrong or adversarially steered**.
34
- Everything follows from treating it as an untrusted proposer.
35
-
36
- If the model is untrusted, then authorization cannot come from the model. It comes
37
- from an owner signature over a bounded grant. And if authorization is separate from
38
- proposal, then the code that proposes must be unable to reach the code that signs —
39
- otherwise the separation is aspirational.
40
-
41
- That is why the boundary is a test (`test/custody-boundary.test.mjs`) rather than a
42
- paragraph in a README. It walks the import graph from every shipped entrypoint and
43
- fails on:
44
-
45
- - any public module importing signer or key material
46
- - a dangling local import that reaches a signer from a shipped entrypoint
47
- - a secret-shaped literal anywhere
48
- - a packed npm artifact that still contains signer/vault modules
49
-
50
- ## Data plane
51
-
52
- `src/data/` — 30+ providers, each declaring an honest tier.
53
-
54
- | Tier | Meaning |
55
- |---|---|
56
- | `read-only` | data only; no execution claim |
57
- | `quote-only` | can price a route; no reviewed transaction builder |
58
- | `prepare` | returns a policy-bound unsigned transaction |
59
- | `intent` | returns typed data to sign (CoW orders, GMX orders) |
60
-
61
- The tier is load-bearing. "We support protocol X" is ambiguous and has caused real
62
- confusion; the tier is not. **API coverage ≠ execution support.**
63
-
64
- `src/data/catalog.mjs` is the registry; `dataHealth()` probes liveness. Note the
65
- distinction in health output: a promise that resolved with `{ok: false}` is
66
- *degraded*, not healthy — and an HTTP 200 serving an explorer error page is not a
67
- successful read.
68
-
69
- ## Policy plane
70
-
71
- The moat. Holds no keys; constrains what a signer may be asked to do.
72
-
73
- - **Destination allowlist** (`src/venues.mjs`) — per chain, fail-closed. An empty
74
- allowlist refuses everything. It never means "allow anything."
75
- - **Auto-slippage** (`src/auto-slippage.mjs`) — a guard computed from live depth and
76
- volatility per leg, recomputed before each broadcast. A caller-supplied tolerance
77
- is a *maximum*, not the selected value. Hard ceiling 100 bps; over that, block and
78
- requote rather than widen.
79
- - **Attestations** (`route-`, `vault-`, `gmx-attestation.mjs`) — dynamic execution
80
- targets require an attestation minted inside the trusted boundary. Model-authored
81
- JSON is not authorization.
82
- - **Approval guard** — exact-amount approvals, never unlimited by default, with
83
- allowance read back after the approve lands.
84
-
85
- Guards are re-checked at **sign and broadcast** time. A stale minimum is not a
86
- minimum.
87
-
88
- ## Control plane
89
-
90
- `src/public-control/` — grant schema and rendering, session-key model, ERC-4337
91
- adapter, bundler client, grant indexer.
92
-
93
- `src/router/` — model routing with a custody firewall. `risk-classifier.mjs` scores
94
- an action's risk; `proposal.mjs` refuses to construct a proposal containing
95
- dangerous fields (private keys, mnemonics, bearer tokens) at any nesting depth. The
96
- router can propose, simulate, explain, and draft. It cannot authorize.
97
-
98
- ## Scanner framework
99
-
100
- `src/scanner/` — makes a chain data rather than an integration.
101
-
102
- - `contract.mjs` — 10 capabilities, a validator, a registry, coverage matrix
103
- - `evm-scanner.mjs` — one generic implementation for any EVM JSON-RPC chain
104
- - `chains.config.mjs` — the 11 built-ins as config, plus `registerCustomChain()`
105
-
106
- Unimplemented capabilities are **absent, not faked**: calling one throws a message
107
- naming what *is* supported. A caller can never mistake `undefined` for a negative
108
- result.
109
-
110
- Evidence labels (`LIVE` / `CACHED` / `STALE` / `UNKNOWN` / `UNAVAILABLE`) and risk
111
- verdicts (`PASS` / `CAUTION` / `FAIL` / `UNKNOWN`) exist to stop the collapse that
112
- causes losses: **`UNKNOWN` is not `PASS`**, and "we could not check" is a different
113
- fact from "there is nothing there."
114
-
115
- ## Agent mesh
116
-
117
- `profiles/` + `skills/` — seven installable Hermes lanes plus a template.
118
-
119
- A lane is narrow on purpose: smaller context is cheaper and more accurate, per-lane
120
- memory doesn't cross-contaminate, and a grant scoped to one lane can't be spent by
121
- another.
122
-
123
- Every lane ships DISARMED, and every grant action a lane may request is read,
124
- simulate, or prepare. No lane may request broadcast or signing — enforced in
125
- `test/profiles.test.mjs`, so widening custody cannot pass review quietly.
126
-
127
- No lane pins a model. `profile.json` carries a capability *class*
128
- (`strong-reasoner`, `fast-tool-caller`), so the installer never writes a vendor into
129
- a user's config.
130
-
131
- ## What is not in the public package
132
-
133
- House custody, an always-on exec server, and capability minting are not shipped.
134
- Owner-local signer modules (`key-vault`, `hl-exec`, `oracle-vault`) live in the
135
- companion package `@oracle-agent/operator` on the user's machine. This prepare
136
- package has nothing to steal: it never takes a key and never broadcasts.
package/docs/cli.md DELETED
@@ -1,47 +0,0 @@
1
- # Oracle unified CLI
2
-
3
- Root command: `oracle <noun> <verb> [args]`.
4
-
5
- The public `@oracle-agent/oracle` package is **prepare-only**. Signing commands
6
- dispatch to a separately installed `@oracle-agent/operator` process on the same
7
- machine. Oracle never imports operator signing modules.
8
-
9
- See also [connectors.md](./connectors.md).
10
-
11
- ## Exit codes
12
-
13
- | Code | Meaning |
14
- |---|---|
15
- | 0 | ok |
16
- | 1 | usage / general error |
17
- | 2 | operator self-reported error |
18
- | 3 | operator package not installed |
19
- | 4 | data server not running |
20
-
21
- ## Chat surface
22
-
23
- ```bash
24
- oracle # TTY: premium boxed oracle chat
25
- oracle --help # command help
26
- oracle model # interactive provider/model picker
27
- oracle -m <model> # launch this session on a selected model
28
- oracle chain list # working chains
29
- oracle chain use hyperliquid
30
- oracle setup # telegram/discord/slack messaging menu
31
- oracle setup telegram # writes TELEGRAM_BOT_TOKEN into profile .env
32
- oracle setup messaging # full hermes gateway setup wizard
33
- ```
34
-
35
- Inside chat:
36
-
37
- - `/chain` list or select build/trade chain
38
- - `/setup` configure messaging platforms
39
- - `/model` switch models; persona stays oracle
40
-
41
- Terminal and configured messaging channels are transports into the same Hermes
42
- profile. A configured local operator/MCP can execute an owner-confirmed action
43
- from either interface. The interface and selected model never bypass grants,
44
- allowlists, caps, MAC checks, simulation, or receipt verification.
45
-
46
- Hosted remote models stay read/prepare-only. Local hermes + operator remain the
47
- only signing path, and only via child process.
@@ -1,13 +0,0 @@
1
- # Oracle AI-client connectors
2
-
3
- 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.
4
-
5
- ```bash
6
- oracle mcp print --target claude-code
7
- oracle mcp install claude-code
8
- oracle mcp install codex
9
- oracle mcp install chatgpt
10
- oracle mcp install claude-code --with-control # requires local operator
11
- ```
12
-
13
- Oracle does not create tunnels for hosted clients.
@@ -1,29 +0,0 @@
1
- # Oracle protocol pack standard
2
-
3
- An Oracle protocol pack is a package-safe ESM module that turns an intent into an unsigned action and decodes independently obtained receipts. A pack is an adapter, not a wallet, signer, broadcaster, or authority. See `examples/oracle-pack-template.mjs` for the smallest complete shape.
4
-
5
- ## Required surface
6
-
7
- Every pack exports a default object with these members (named exports may mirror them):
8
-
9
- - `provider`: stable provider identity, semantic version, supported chain IDs, and provenance/trust metadata. Remote token names, symbols, descriptions, image fields, URLs, and NFT metadata remain untrusted data.
10
- - `prepare(intent)`: validates the intent and returns an unsigned transaction or typed action. It must not accept keys, sign, submit, broadcast, or report execution success.
11
- - `decode(receipt)`: validates and converts a chain/provider receipt into a documented result. Unknown or malformed receipts fail closed.
12
- - `riskRules`: an array or function describing enforceable limits and refusal conditions. Human-readable warnings alone are not rules.
13
- - `tests`: non-empty metadata naming the local test command and covered properties. Tests must be deterministic and require no credentials or network.
14
-
15
- ## Prompt-injection boundary
16
-
17
- Treat every provider response and token/NFT metadata string as inert data. Never concatenate metadata into system/developer instructions, interpret it as tool directions, or let it modify recipients, calldata, limits, and policy. Render or quote it through a data channel and retain its provenance. Packs should test adversarial values such as “ignore previous instructions,” requests for secrets, and demands to sign or invoke tools.
18
-
19
- ## Custody boundary
20
-
21
- Pack exports must not expose signers, wallets, private keys, seed phrases, signing functions, transaction submission, or broadcasting. `prepare` returns data to a separately authorized custody surface. Environment variables and provider credentials must not appear in prepared output, logs, errors, fixtures, or metadata. Imports should be side-effect free; merely loading a pack must not make network calls.
22
-
23
- ## Receipt gate
24
-
25
- Preparation is not execution. A prepared result declares a `receiptGate` and consumers must not mark an action successful until `decode` receives a receipt from an independent, trusted transport and verifies its chain, transaction identity, status, and required confirmations. Timeouts, pending receipts, mismatches, reverts, and undecodable responses are not success.
26
-
27
- ## Local adversarial benchmark
28
-
29
- Run `node scripts/adversarial-bench.mjs <pack.mjs> [...]`. It imports only the named local modules, invokes no pack functions, emits one deterministic JSON summary, and exits `1` when a gate fails (`2` for usage/load errors). It checks required surface fields, forbidden custody exports, missing test metadata, and prompt-injection strings nested in provider or pack metadata. This static public gate complements, rather than replaces, behavioral tests of preparation and receipt verification.
package/docs/profiles.md DELETED
@@ -1,154 +0,0 @@
1
- # Agent profiles
2
-
3
- Oracle is not one agent. It's a mesh of specialists with a router in front.
4
-
5
- ```
6
- you
7
- |
8
- Task
9
- |
10
- oracle <- routes, never authorizes custody
11
- |
12
- +------+------+------+------+------+------+------+
13
- | | | | | | | |
14
- poly hyper robin solana bitcoin stable protocol
15
- market liquid hood builder
16
- ```
17
-
18
- Each lane is a [Hermes](https://github.com/NousResearch/hermes-agent) **profile**:
19
- its own system prompt, skill set, memory, and session store. They share a wallet
20
- policy and a receipts discipline, nothing else.
21
-
22
- ## Why profiles instead of one big agent
23
-
24
- Three practical reasons, learned the hard way:
25
-
26
- 1. **Context stays small.** A Polymarket question shouldn't load Bitcoin
27
- ordinals knowledge. Smaller context is cheaper, faster, and more accurate.
28
- 2. **Memory doesn't cross-contaminate.** What the perps lane learned about
29
- funding rates should not leak into the NFT lane's judgment.
30
- 3. **Blast radius is bounded.** A grant scoped to one lane's venues can't be
31
- spent by another.
32
-
33
- ## The lanes
34
-
35
- | Profile | Owns | Typical grant |
36
- |---|---|---|
37
- | `oracle` | routing, synthesis, multi-chain comparison, `/balance` portfolio aggregation | read + simulate only |
38
- | `polymarket-agent` | prediction markets, event odds, CLOB cards/API-key order intents | read, quote, prepare |
39
- | `hyperliquid-agent` | perps, spot, HIP-3 builder dexs, HIP-4 outcomes | read, quote, prepare |
40
- | `robinhood-agent` | Robinhood Chain (4663) tokens, NFTs, tokenized Robinhood-style assets, capped NFT mints | read, quote, prepare |
41
- | `solana-agent` | Solana swaps, research, Jupiter routes | read, quote, prepare |
42
- | `bitcoin-agent` | Bitcoin L1, Ordinals/runes, inscriptions | read, prepare:inscription |
43
- | `stable-agent` | Stable (988), USDT-native gas quirks | read, quote, prepare |
44
- | `protocol-builder` | scaffold, review, prepare chain-family token/NFT collections, gacha, DEX, and protocol deploys | prepare:deploy, prepare:mint, simulate |
45
- | `_template` | your new lane | you decide |
46
-
47
- These grants describe the public prepare plane, not every capability an operator may install beside it. The generic unattended signer exposes six bounded surfaces (`hl`, `poly`, `evm-swap`, `evm-bridge`, `btc`, `sol`), each of which decodes its own envelope and refuses while its allowlists are empty. A separately installed, same-host, owner-gated EVM executor may expose one exact bounded action after explicit `arm`; profiles must verify it before claiming availability. `watch`, `watch this`, and `ping me` remain `alert_only` regardless of executor presence.
48
-
49
- `protocol-builder` classifies each launch by chain family, then designs and
50
- prepares unsigned token, NFT collection, protocol, or mint-bot transactions. It
51
- fails closed when no verified adapter exists, never house-signs, and keeps deploy,
52
- metadata, liquidity, mint, and authority actions as separate user approvals.
53
-
54
- The root `oracle` lane owns `/balance`, natural-language balance, and portfolio
55
- history requests. Its `balance` skill calls the read-only
56
- `portfolio_snapshot` MCP tool once, records a compact profile-local observation,
57
- reports partial coverage and unavailable providers, and labels `knownUsd` as
58
- incomplete instead of inventing a full portfolio total. `portfolio_history`
59
- reads those observations and `portfolio_value_graph` renders the known-value
60
- series while omitting unavailable values rather than plotting fake zeroes.
61
-
62
- ## Model choice is yours
63
-
64
- Oracle makes **no model calls**. It has no LLM client, no API key, no inference
65
- dependency — its runtime deps are `ethers`, `viem`, and three `@noble`/`@scure`
66
- crypto libraries. Every lane inherits whatever provider your Hermes is configured
67
- with.
68
-
69
- So there is nothing to sign up for. If Hermes already talks to a model, Oracle
70
- works.
71
-
72
- What profiles *do* give you is **per-lane** model choice, because each profile has
73
- its own `config.yaml`:
74
-
75
- ```yaml
76
- # ~/.hermes/profiles/<name>/config.yaml
77
- model:
78
- provider: anthropic # or openai-codex, nous, xai-oauth, a local model...
79
- default: claude-opus-5
80
- ```
81
-
82
- That lets you put a heavy reasoner on the router and something cheap and fast on
83
- a polling lane:
84
-
85
- | Lane | Wants | Why |
86
- |---|---|---|
87
- | `oracle` | strongest reasoner | routing and synthesis need judgment |
88
- | `protocol-builder` | strongest reasoner | contract review is unforgiving |
89
- | `hyperliquid-agent` | fast, numeric, tool-heavy | many small tool calls |
90
- | `polymarket-agent` | news-shaped reasoning | event pricing is narrative |
91
- | research fan-out | cheap and parallel | breadth over depth |
92
-
93
- Starting point, not doctrine. Benchmark on your own workload.
94
-
95
- ### If you want one login for many models
96
-
97
- Optional convenience, not a requirement: [Nous
98
- Portal](https://nousresearch.com) fronts the frontier set (Claude, GPT, Grok,
99
- DeepSeek, Qwen and more) behind a single Hermes credential, so each lane can pick
100
- a different model without five separate API keys and five bills.
101
-
102
- ```bash
103
- hermes auth add nous
104
- ```
105
-
106
- Any Hermes-supported provider works equally well. Oracle does not care.
107
-
108
- ## Creating a lane
109
-
110
- ```bash
111
- hermes profile create polymarket-agent
112
- ```
113
-
114
- Then give it a `SOUL.md` (who it is, what it owns, what it must refuse) and a
115
- `config.yaml` (model + provider). Point it at Oracle's MCP read plane.
116
-
117
- `oracle-init --apply` writes this for you. Manual form (Hermes wants command and
118
- args as separate tokens):
119
-
120
- ```bash
121
- # terminal 1 — local read plane the MCP tools call
122
- npx oracle-data
123
-
124
- # terminal 2 — wire MCP into a lane
125
- hermes -p polymarket-agent mcp add oracle-data \
126
- --command node \
127
- --args "$(node -p "require.resolve('@oracle-agent/oracle/package.json').replace(/package\\.json$/, 'bin/oracle-data-mcp.mjs')")"
128
- # or after npm link / PATH has the bin:
129
- # hermes -p polymarket-agent mcp add oracle-data --command oracle-data-mcp
130
- ```
131
-
132
- Now that lane can read 30+ providers across 11 chains, quote real routes, and
133
- prepare unsigned transactions — and it still cannot sign anything.
134
-
135
- ## Posture
136
-
137
- Every lane starts `DISARMED`. Arming is a deliberate, scoped, expiring act:
138
-
139
- ```
140
- grant:
141
- chain: 8453
142
- actions: [read:chain, simulate:tx, prepare:swap]
143
- targets: [<router address>]
144
- maxValueWei: <cap>
145
- expiresAt: <unix ts>
146
- ```
147
-
148
- An action outside the grant is refused, not negotiated. When the grant expires,
149
- the lane goes back to reading.
150
-
151
- ## A rule worth keeping
152
-
153
- Give a lane the narrowest grant that makes it useful, and let it expire. A
154
- permanent broad grant is just a hot wallet with extra steps.
@@ -1,65 +0,0 @@
1
- // Example: register a chain Oracle has never seen, then use it.
2
- //
3
- // Run: node examples/add-a-chain.mjs
4
- //
5
- // The point of this example is that there is no adapter to write. A chain is a
6
- // config object; the generic EVM scanner supplies the capabilities.
7
-
8
- import { registerCustomChain } from "../src/scanner/chains.config.mjs";
9
- import { scannerCoverage } from "../src/scanner/contract.mjs";
10
-
11
- // 1. Describe the chain. Note rpcEnv holds VARIABLE NAMES, not URLs -- endpoints
12
- // stay in the environment so nothing sensitive lands in source control.
13
- const scanner = registerCustomChain({
14
- key: "examplechain",
15
- chainId: 424242,
16
- name: "Example Chain",
17
- rpcEnv: ["EXAMPLECHAIN_RPC_URL"],
18
- nativeCurrency: { symbol: "EXC", decimals: 18 },
19
- explorer: "https://explorer.example",
20
-
21
- // Omitted deliberately: dexscreenerSlug. Without it, pool discovery reports
22
- // UNAVAILABLE rather than guessing -- a wrong slug would return another chain's
23
- // pools, which is worse than no answer.
24
-
25
- // Omitted deliberately: venues. With none, the chain is read/research capable and
26
- // fail-closed for routing value. Adding one requires recorded provenance; see
27
- // docs/adding-a-chain.md.
28
- });
29
-
30
- console.log(`registered: ${scanner.name} (chain ${scanner.chainId})`);
31
-
32
- // 2. Ask what it can actually do. The answer is honest -- unimplemented
33
- // capabilities are listed as unsupported, not silently absent.
34
- const caps = scanner.capabilities();
35
- console.log(`\nsupported (${caps.supported.length}): ${caps.supported.join(", ")}`);
36
- console.log(`unsupported (${caps.unsupported.length}): ${caps.unsupported.join(", ")}`);
37
-
38
- // 3. An unimplemented capability throws with an actionable message. It never
39
- // returns undefined, which a caller could mistake for "no result".
40
- try {
41
- await scanner.quote({ from: "0x", to: "0x", amount: "1" });
42
- } catch (err) {
43
- console.log(`\nquote() correctly refused:\n ${err.message.split("\n")[0]}`);
44
- }
45
-
46
- // 4. Pool discovery is UNAVAILABLE, and says why.
47
- const pools = await scanner.resolvePools("0x1111111111111111111111111111111111111111");
48
- console.log(`\nresolvePools evidence: ${pools.evidence}`);
49
- console.log(` reason: ${pools.reason}`);
50
-
51
- // 5. Live reads need an RPC. Show the exact variable to set rather than failing
52
- // with a generic network error.
53
- console.log(`\nto make live reads, set one of: ${scanner.rpcEnv.join(", ")}`);
54
- try {
55
- const head = await scanner.blockNumber();
56
- console.log(` head: ${head.blockNumber} (${head.evidence})`);
57
- } catch {
58
- console.log(" (no RPC configured -- expected for this example chain)");
59
- }
60
-
61
- // 6. The coverage matrix now includes it alongside the built-ins.
62
- const cov = scannerCoverage();
63
- console.log(`\ncoverage: ${cov.chainCount} chain(s) registered`);
64
- const mine = cov.chains[424242];
65
- console.log(` examplechain failClosed for routing: ${mine.failClosed}`);