@oracle-agent/oracle 0.13.0 → 0.14.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 (629) hide show
  1. package/CONTRIBUTING.md +99 -0
  2. package/README.md +531 -13
  3. package/SECURITY.md +112 -0
  4. package/SETUP.md +317 -0
  5. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  6. package/artifacts/inscription/oracle-was-here.svg +1 -0
  7. package/artifacts/specialist-packs/oracle-full-crypto.json +298 -0
  8. package/bin/desk-server.mjs +473 -0
  9. package/bin/oracle-data-mcp.mjs +1252 -0
  10. package/bin/oracle-equities.mjs +168 -0
  11. package/bin/oracle-init.mjs +525 -0
  12. package/bin/oracle-public-server.mjs +36 -0
  13. package/bin/oracle-route.mjs +254 -0
  14. package/bin/oracle-scan.mjs +192 -0
  15. package/bin/oracle-upgrade.mjs +42 -0
  16. package/bin/oracle.mjs +28 -19
  17. package/docs/adding-a-chain.md +229 -0
  18. package/docs/architecture.md +139 -0
  19. package/docs/buzz-integration.md +115 -0
  20. package/docs/cli.md +143 -0
  21. package/docs/connectors.md +13 -0
  22. package/docs/hyperliquid-builder-code.md +50 -0
  23. package/docs/locals-only-fee-waiver.md +34 -0
  24. package/docs/oracle-pack-standard.md +29 -0
  25. package/docs/profiles.md +151 -0
  26. package/docs/public-surface.md +206 -0
  27. package/examples/add-a-chain.mjs +65 -0
  28. package/examples/oracle-pack-template.mjs +38 -0
  29. package/examples/research-a-token.mjs +70 -0
  30. package/package.json +110 -14
  31. package/plugins/oracle-owner-gate/__init__.py +288 -0
  32. package/plugins/oracle-owner-gate/plugin.yaml +9 -0
  33. package/profiles/_template/SOUL.md +54 -0
  34. package/profiles/_template/profile.json +22 -0
  35. package/profiles/bitcoin-agent/SOUL.md +31 -0
  36. package/profiles/bitcoin-agent/profile.json +32 -0
  37. package/profiles/hyperliquid-agent/SOUL.md +34 -0
  38. package/profiles/hyperliquid-agent/profile.json +38 -0
  39. package/profiles/oracle/SOUL.md +120 -0
  40. package/profiles/oracle/profile.json +40 -0
  41. package/profiles/polymarket-agent/SOUL.md +35 -0
  42. package/profiles/polymarket-agent/profile.json +34 -0
  43. package/profiles/profile.schema.json +90 -0
  44. package/profiles/protocol-builder/SOUL.md +57 -0
  45. package/profiles/protocol-builder/profile.json +39 -0
  46. package/profiles/robinhood-agent/SOUL.md +53 -0
  47. package/profiles/robinhood-agent/profile.json +41 -0
  48. package/profiles/solana-agent/SOUL.md +37 -0
  49. package/profiles/solana-agent/profile.json +38 -0
  50. package/profiles/stable-agent/SOUL.md +43 -0
  51. package/profiles/stable-agent/profile.json +38 -0
  52. package/protocols/templates/safe-erc20/SECURITY.md +16 -0
  53. package/protocols/templates/safe-erc20/foundry.toml +12 -0
  54. package/protocols/templates/safe-erc20/remappings.txt +2 -0
  55. package/protocols/templates/safe-erc20/src/SafeERC20.sol +53 -0
  56. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +72 -0
  57. package/public/agent-connect/app.js +84 -0
  58. package/public/agent-connect/index.html +83 -0
  59. package/public/agent-connect/styles.css +70 -0
  60. package/public/index.html +12 -0
  61. package/public/oracle-console/app.js +272 -0
  62. package/public/oracle-console/bitcoin-wallets.js +206 -0
  63. package/public/oracle-console/index.html +91 -0
  64. package/public/oracle-console/styles.css +239 -0
  65. package/public/oracle-splash/_variants/ice.html +2073 -0
  66. package/public/oracle-splash/_variants/ivory.html +2075 -0
  67. package/public/oracle-splash/assets/agents/claude.png +0 -0
  68. package/public/oracle-splash/assets/agents/codex.png +0 -0
  69. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  70. package/public/oracle-splash/assets/desktop-app.jpg +0 -0
  71. package/public/oracle-splash/assets/hero/cli-session-poster.jpg +0 -0
  72. package/public/oracle-splash/assets/hero/cli-session.mp4 +0 -0
  73. package/public/oracle-splash/assets/hero/cli-session.webm +0 -0
  74. package/public/oracle-splash/assets/hero/orb-poster.jpg +0 -0
  75. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  76. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  77. package/public/oracle-splash/assets/hero/risk-session-poster.jpg +0 -0
  78. package/public/oracle-splash/assets/hero/risk-session.mp4 +0 -0
  79. package/public/oracle-splash/assets/hero/risk-session.webm +0 -0
  80. package/public/oracle-splash/assets/hero/route-session-poster.jpg +0 -0
  81. package/public/oracle-splash/assets/hero/route-session.mp4 +0 -0
  82. package/public/oracle-splash/assets/hero/route-session.webm +0 -0
  83. package/public/oracle-splash/assets/llms/claude.svg +1 -0
  84. package/public/oracle-splash/assets/llms/codex-icon.svg +1 -0
  85. package/public/oracle-splash/assets/llms/codex.svg +1 -0
  86. package/public/oracle-splash/assets/llms/cursor-icon.svg +12 -0
  87. package/public/oracle-splash/assets/llms/cursor.svg +17 -0
  88. package/public/oracle-splash/assets/llms/deepseek.svg +1 -0
  89. package/public/oracle-splash/assets/llms/gemini-icon.svg +1 -0
  90. package/public/oracle-splash/assets/llms/gemini.svg +1 -0
  91. package/public/oracle-splash/assets/llms/grok.svg +8 -0
  92. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  93. package/public/oracle-splash/assets/llms/kimi-icon.svg +1 -0
  94. package/public/oracle-splash/assets/llms/kimi.svg +1 -0
  95. package/public/oracle-splash/assets/llms/manus.svg +18 -0
  96. package/public/oracle-splash/assets/llms/openclaw.svg +22 -0
  97. package/public/oracle-splash/assets/llms/perplexity.svg +1 -0
  98. package/public/oracle-splash/assets/llms/qwen.svg +1 -0
  99. package/public/oracle-splash/assets/llms/windsurf.svg +1 -0
  100. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  101. package/public/oracle-splash/assets/protocols/across.png +0 -0
  102. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  103. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  104. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  105. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  106. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  107. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  108. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  109. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  110. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  111. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  112. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  113. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  114. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  115. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  116. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  117. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  118. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  119. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  120. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  121. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  122. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  123. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  124. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  125. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  126. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  127. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  128. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  129. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  130. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  131. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  132. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  133. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  134. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  135. package/public/oracle-splash/assets/wordmarks/across.svg +4 -0
  136. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +23 -0
  137. package/public/oracle-splash/assets/wordmarks/balancer.svg +3 -0
  138. package/public/oracle-splash/assets/wordmarks/cowswap.svg +1 -0
  139. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  140. package/public/oracle-splash/assets/wordmarks/gmx.svg +13 -0
  141. package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
  142. package/public/oracle-splash/assets/wordmarks/hyena.svg +7 -0
  143. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +21 -0
  144. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +13 -0
  145. package/public/oracle-splash/assets/wordmarks/jupiter.svg +35 -0
  146. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +1 -0
  147. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  148. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  149. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +1 -0
  150. package/public/oracle-splash/assets/wordmarks/markets.svg +1 -0
  151. package/public/oracle-splash/assets/wordmarks/morpho.svg +1 -0
  152. package/public/oracle-splash/assets/wordmarks/odos.svg +3 -0
  153. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  154. package/public/oracle-splash/assets/wordmarks/oneinch.svg +6 -0
  155. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +17 -0
  156. package/public/oracle-splash/assets/wordmarks/opensea.svg +1 -0
  157. package/public/oracle-splash/assets/wordmarks/outcome.svg +16 -0
  158. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +18 -0
  159. package/public/oracle-splash/assets/wordmarks/paragon.svg +9 -0
  160. package/public/oracle-splash/assets/wordmarks/paraswap.svg +16 -0
  161. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  162. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  163. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  164. package/public/oracle-splash/assets/wordmarks/relay.svg +8 -0
  165. package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
  166. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  167. package/public/oracle-splash/assets/wordmarks/stargate.svg +15 -0
  168. package/public/oracle-splash/assets/wordmarks/uniswap.svg +18 -0
  169. package/public/oracle-splash/assets/wordmarks/velodrome.svg +84 -0
  170. package/public/oracle-splash/assets/wordmarks/xyz.svg +12 -0
  171. package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
  172. package/public/oracle-splash/brand/aave.webp +0 -0
  173. package/public/oracle-splash/brand/aavev2.webp +0 -0
  174. package/public/oracle-splash/brand/aborean.webp +0 -0
  175. package/public/oracle-splash/brand/across.webp +0 -0
  176. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  177. package/public/oracle-splash/brand/afi.webp +0 -0
  178. package/public/oracle-splash/brand/arcus.webp +0 -0
  179. package/public/oracle-splash/brand/aster.webp +0 -0
  180. package/public/oracle-splash/brand/avant.webp +0 -0
  181. package/public/oracle-splash/brand/balancer.webp +0 -0
  182. package/public/oracle-splash/brand/beefy.webp +0 -0
  183. package/public/oracle-splash/brand/benqi.webp +0 -0
  184. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  185. package/public/oracle-splash/brand/bitfi.webp +0 -0
  186. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  187. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  188. package/public/oracle-splash/brand/camelot.webp +0 -0
  189. package/public/oracle-splash/brand/compound.webp +0 -0
  190. package/public/oracle-splash/brand/concrete.webp +0 -0
  191. package/public/oracle-splash/brand/cow.webp +0 -0
  192. package/public/oracle-splash/brand/curve.webp +0 -0
  193. package/public/oracle-splash/brand/derive.webp +0 -0
  194. package/public/oracle-splash/brand/dolomite.webp +0 -0
  195. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  196. package/public/oracle-splash/brand/ekubo.webp +0 -0
  197. package/public/oracle-splash/brand/ethena.webp +0 -0
  198. package/public/oracle-splash/brand/etherfi.webp +0 -0
  199. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  200. package/public/oracle-splash/brand/felix.webp +0 -0
  201. package/public/oracle-splash/brand/fluid.webp +0 -0
  202. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  203. package/public/oracle-splash/brand/folks.webp +0 -0
  204. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  205. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  206. package/public/oracle-splash/brand/gassss.webp +0 -0
  207. package/public/oracle-splash/brand/gmx.webp +0 -0
  208. package/public/oracle-splash/brand/harmonix.webp +0 -0
  209. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  210. package/public/oracle-splash/brand/hlp.webp +0 -0
  211. package/public/oracle-splash/brand/hop.webp +0 -0
  212. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  213. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  214. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  215. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  216. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  217. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  218. package/public/oracle-splash/brand/hypha.webp +0 -0
  219. package/public/oracle-splash/brand/joedex.webp +0 -0
  220. package/public/oracle-splash/brand/jupiter.webp +0 -0
  221. package/public/oracle-splash/brand/kelp.webp +0 -0
  222. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  223. package/public/oracle-splash/brand/kmhype.webp +0 -0
  224. package/public/oracle-splash/brand/kona.webp +0 -0
  225. package/public/oracle-splash/brand/konalend.webp +0 -0
  226. package/public/oracle-splash/brand/lfj.webp +0 -0
  227. package/public/oracle-splash/brand/lido.webp +0 -0
  228. package/public/oracle-splash/brand/lifi.webp +0 -0
  229. package/public/oracle-splash/brand/lighter.webp +0 -0
  230. package/public/oracle-splash/brand/lista.webp +0 -0
  231. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  232. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  233. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  234. package/public/oracle-splash/brand/magiceden.webp +0 -0
  235. package/public/oracle-splash/brand/mempool.png +0 -0
  236. package/public/oracle-splash/brand/meteora.webp +0 -0
  237. package/public/oracle-splash/brand/morpho.webp +0 -0
  238. package/public/oracle-splash/brand/myriad.webp +0 -0
  239. package/public/oracle-splash/brand/noxa.webp +0 -0
  240. package/public/oracle-splash/brand/odos.webp +0 -0
  241. package/public/oracle-splash/brand/oneinch.webp +0 -0
  242. package/public/oracle-splash/brand/openbook.webp +0 -0
  243. package/public/oracle-splash/brand/opensea.webp +0 -0
  244. package/public/oracle-splash/brand/orca.webp +0 -0
  245. package/public/oracle-splash/brand/ordinals.png +0 -0
  246. package/public/oracle-splash/brand/ostium.webp +0 -0
  247. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  248. package/public/oracle-splash/brand/pendle.webp +0 -0
  249. package/public/oracle-splash/brand/perena.webp +0 -0
  250. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  251. package/public/oracle-splash/brand/phoenix.webp +0 -0
  252. package/public/oracle-splash/brand/polymarket.webp +0 -0
  253. package/public/oracle-splash/brand/polynomial.webp +0 -0
  254. package/public/oracle-splash/brand/projectx.webp +0 -0
  255. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  256. package/public/oracle-splash/brand/quickswap.webp +0 -0
  257. package/public/oracle-splash/brand/rain.webp +0 -0
  258. package/public/oracle-splash/brand/raydium.webp +0 -0
  259. package/public/oracle-splash/brand/relay.webp +0 -0
  260. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  261. package/public/oracle-splash/brand/saber.webp +0 -0
  262. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  263. package/public/oracle-splash/brand/sanctum.webp +0 -0
  264. package/public/oracle-splash/brand/satflow.png +0 -0
  265. package/public/oracle-splash/brand/sierra.webp +0 -0
  266. package/public/oracle-splash/brand/sky.webp +0 -0
  267. package/public/oracle-splash/brand/solv.webp +0 -0
  268. package/public/oracle-splash/brand/spark.webp +0 -0
  269. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  270. package/public/oracle-splash/brand/sphere.webp +0 -0
  271. package/public/oracle-splash/brand/ssv.webp +0 -0
  272. package/public/oracle-splash/brand/stabble.webp +0 -0
  273. package/public/oracle-splash/brand/stableswap.webp +0 -0
  274. package/public/oracle-splash/brand/stakewise.webp +0 -0
  275. package/public/oracle-splash/brand/stargate.webp +0 -0
  276. package/public/oracle-splash/brand/sthype.webp +0 -0
  277. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  278. package/public/oracle-splash/brand/unisat.png +0 -0
  279. package/public/oracle-splash/brand/uniswap.webp +0 -0
  280. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  281. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  282. package/public/oracle-splash/brand/unit.webp +0 -0
  283. package/public/oracle-splash/brand/velodrome.webp +0 -0
  284. package/public/oracle-splash/brand/velora.webp +0 -0
  285. package/public/oracle-splash/brand/venus.webp +0 -0
  286. package/public/oracle-splash/brand/wbeth.webp +0 -0
  287. package/public/oracle-splash/brand/xsy.webp +0 -0
  288. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  289. package/public/oracle-splash/brand/zerobase.webp +0 -0
  290. package/public/oracle-splash/brand/zerox.webp +0 -0
  291. package/public/oracle-splash/downloads/index.html +52 -0
  292. package/public/oracle-splash/favicon.ico +0 -0
  293. package/public/oracle-splash/favicon.svg +6 -0
  294. package/public/oracle-splash/index.html +2537 -0
  295. package/public/oracle-splash/mesh-graph.png +0 -0
  296. package/public/oracle-splash/mesh-graph.svg +216 -0
  297. package/scripts/adversarial-bench.mjs +114 -0
  298. package/scripts/build-dist.mjs +119 -0
  299. package/scripts/build-inscription.py +230 -0
  300. package/scripts/check-doc-drift.mjs +123 -0
  301. package/scripts/check-test-count.mjs +105 -0
  302. package/scripts/e2e-hl-markets.mjs +21 -0
  303. package/scripts/e2e-hl-perps.mjs +48 -0
  304. package/scripts/e2e-hypercore-staking.mjs +128 -0
  305. package/scripts/e2e-solana-bitcoin.mjs +183 -0
  306. package/scripts/guard-publish.mjs +22 -0
  307. package/scripts/protocol-template-gate.mjs +15 -0
  308. package/scripts/public-api-scan.mjs +23 -0
  309. package/scripts/publish-dist.mjs +67 -0
  310. package/scripts/record-hero-cli.sh +80 -0
  311. package/scripts/secret-scan.mjs +168 -0
  312. package/scripts/smoke-dist-bins.mjs +89 -0
  313. package/scripts/verify-dist.mjs +29 -0
  314. package/scripts/verify-v3-venues.mjs +233 -0
  315. package/skills/balance/SKILL.md +176 -0
  316. package/skills/bitcoin-l1.md +33 -0
  317. package/skills/chain-defi-ecosystem-profiling.md +27 -0
  318. package/skills/evm-contract-research.md +27 -0
  319. package/skills/hyperliquid.md +26 -0
  320. package/skills/multichain-exec-desk.md +33 -0
  321. package/skills/oracle-action-semantics/SKILL.md +40 -0
  322. package/skills/oracle-best-execution/SKILL.md +127 -0
  323. package/skills/oracle-best-execution.md +27 -0
  324. package/skills/oracle-bitcoin/SKILL.md +53 -0
  325. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +59 -0
  326. package/skills/oracle-chat/SKILL.md +61 -0
  327. package/skills/oracle-chat/chain.SKILL.md +31 -0
  328. package/skills/oracle-chat/setup.SKILL.md +37 -0
  329. package/skills/oracle-circuit-breaker/SKILL.md +51 -0
  330. package/skills/oracle-contract-research/SKILL.md +55 -0
  331. package/skills/oracle-desk/SKILL.md +58 -0
  332. package/skills/oracle-desk.md +27 -0
  333. package/skills/oracle-dex-launch/SKILL.md +38 -0
  334. package/skills/oracle-equities/SKILL.md +62 -0
  335. package/skills/oracle-grants/SKILL.md +69 -0
  336. package/skills/oracle-hypercore-staking/SKILL.md +57 -0
  337. package/skills/oracle-hyperliquid/SKILL.md +56 -0
  338. package/skills/oracle-meme-token-sniper/SKILL.md +73 -0
  339. package/skills/oracle-multichain-nft-launch/SKILL.md +338 -0
  340. package/skills/oracle-multichain-token-launch/SKILL.md +300 -0
  341. package/skills/oracle-nft-gacha-launch/SKILL.md +48 -0
  342. package/skills/oracle-nft-mint-gas-war/SKILL.md +63 -0
  343. package/skills/oracle-polymarket/SKILL.md +60 -0
  344. package/skills/oracle-protocol-builder/SKILL.md +59 -0
  345. package/skills/oracle-protocol-security/SKILL.md +60 -0
  346. package/skills/oracle-public-product/SKILL.md +44 -0
  347. package/skills/oracle-receipts/SKILL.md +52 -0
  348. package/skills/oracle-receipts.md +29 -0
  349. package/skills/oracle-rfq-tokenized-assets/SKILL.md +69 -0
  350. package/skills/oracle-smart-wallet-scanner/SKILL.md +49 -0
  351. package/skills/oracle-solana/SKILL.md +65 -0
  352. package/skills/oracle-solana-nft/SKILL.md +54 -0
  353. package/skills/oracle-token-research/SKILL.md +67 -0
  354. package/skills/solana.md +22 -0
  355. package/skins/oracle.yaml +56 -0
  356. package/src/action-receipts.mjs +265 -0
  357. package/src/action-semantics.mjs +62 -0
  358. package/src/address-book.mjs +208 -0
  359. package/src/agent-auth.mjs +206 -0
  360. package/src/approval-guard.mjs +282 -0
  361. package/src/attestation-secret.mjs +94 -0
  362. package/src/audit-log.mjs +196 -0
  363. package/src/auth/oauth.mjs +672 -0
  364. package/src/auto-slippage.mjs +378 -0
  365. package/src/capability-posture.mjs +125 -0
  366. package/src/cards.mjs +422 -0
  367. package/src/chains.mjs +62 -0
  368. package/src/cli/chain-catalog.mjs +215 -0
  369. package/src/cli/chain-state.mjs +74 -0
  370. package/src/cli/commands/auth.mjs +193 -0
  371. package/src/cli/commands/bootstrap.mjs +87 -0
  372. package/src/cli/commands/chain.mjs +143 -0
  373. package/src/cli/commands/chat.mjs +465 -0
  374. package/src/cli/commands/credential.mjs +9 -0
  375. package/src/cli/commands/data-mcp.mjs +18 -0
  376. package/src/cli/commands/data.mjs +75 -0
  377. package/src/cli/commands/doctor.mjs +136 -0
  378. package/src/cli/commands/equities.mjs +41 -0
  379. package/src/cli/commands/farm.mjs +129 -0
  380. package/src/cli/commands/fees.mjs +109 -0
  381. package/src/cli/commands/follow.mjs +130 -0
  382. package/src/cli/commands/harness.mjs +63 -0
  383. package/src/cli/commands/help.mjs +7 -0
  384. package/src/cli/commands/init.mjs +27 -0
  385. package/src/cli/commands/mcp.mjs +154 -0
  386. package/src/cli/commands/model.mjs +106 -0
  387. package/src/cli/commands/plugins.mjs +241 -0
  388. package/src/cli/commands/prepare.mjs +12 -0
  389. package/src/cli/commands/public.mjs +20 -0
  390. package/src/cli/commands/resolve.mjs +64 -0
  391. package/src/cli/commands/route.mjs +12 -0
  392. package/src/cli/commands/runner.mjs +9 -0
  393. package/src/cli/commands/scan.mjs +12 -0
  394. package/src/cli/commands/setup.mjs +294 -0
  395. package/src/cli/commands/sign.mjs +21 -0
  396. package/src/cli/commands/signer.mjs +9 -0
  397. package/src/cli/commands/swap.mjs +102 -0
  398. package/src/cli/commands/upgrade.mjs +12 -0
  399. package/src/cli/commands/vault.mjs +9 -0
  400. package/src/cli/commands/version.mjs +22 -0
  401. package/src/cli/first-run.mjs +23 -0
  402. package/src/cli/kernel.mjs +262 -0
  403. package/src/cli/mcp-targets/chatgpt.mjs +51 -0
  404. package/src/cli/mcp-targets/claude-code.mjs +39 -0
  405. package/src/cli/mcp-targets/claude-desktop.mjs +24 -0
  406. package/src/cli/mcp-targets/codex.mjs +41 -0
  407. package/src/cli/mcp-targets/cursor.mjs +32 -0
  408. package/src/cli/mcp-targets/shared.mjs +71 -0
  409. package/src/cli/mcp-targets/vscode.mjs +39 -0
  410. package/src/cli/messaging-platforms.mjs +217 -0
  411. package/src/cli/model-config.mjs +78 -0
  412. package/src/cli/operator-dispatch.mjs +257 -0
  413. package/src/cli/oracle-harness.py +415 -0
  414. package/src/cli/paths.mjs +107 -0
  415. package/src/cli/runtime.mjs +351 -0
  416. package/src/cli/setup-state.mjs +168 -0
  417. package/src/cli/spawn-child.mjs +43 -0
  418. package/src/data/catalog.mjs +858 -0
  419. package/src/data/desk-data.mjs +877 -0
  420. package/src/data/http.mjs +253 -0
  421. package/src/data/names.mjs +188 -0
  422. package/src/data/provider-endpoint.mjs +94 -0
  423. package/src/data/providers/aave-v3.mjs +139 -0
  424. package/src/data/providers/across-bridge.mjs +41 -0
  425. package/src/data/providers/aerodrome.mjs +245 -0
  426. package/src/data/providers/aevo.mjs +33 -0
  427. package/src/data/providers/approval-indexer.mjs +133 -0
  428. package/src/data/providers/approvals.mjs +594 -0
  429. package/src/data/providers/babylon-staking.mjs +149 -0
  430. package/src/data/providers/balancer.mjs +209 -0
  431. package/src/data/providers/beefy-yields.mjs +45 -0
  432. package/src/data/providers/birdeye-tokens.mjs +33 -0
  433. package/src/data/providers/bisq-markets.mjs +145 -0
  434. package/src/data/providers/bitcoin-esplora.mjs +216 -0
  435. package/src/data/providers/bitcoin-meta.mjs +378 -0
  436. package/src/data/providers/blockscout.mjs +14 -0
  437. package/src/data/providers/bob-rootstock.mjs +198 -0
  438. package/src/data/providers/braiins-insights.mjs +103 -0
  439. package/src/data/providers/bridge-aggregator.mjs +259 -0
  440. package/src/data/providers/bridges.mjs +242 -0
  441. package/src/data/providers/bungee.mjs +29 -0
  442. package/src/data/providers/celestia-da.mjs +38 -0
  443. package/src/data/providers/changenow.mjs +135 -0
  444. package/src/data/providers/compound.mjs +32 -0
  445. package/src/data/providers/connext.mjs +28 -0
  446. package/src/data/providers/convex.mjs +30 -0
  447. package/src/data/providers/cow-protocol.mjs +110 -0
  448. package/src/data/providers/cowswap.mjs +415 -0
  449. package/src/data/providers/curve.mjs +201 -0
  450. package/src/data/providers/das-assets.mjs +59 -0
  451. package/src/data/providers/debridge.mjs +109 -0
  452. package/src/data/providers/defillama.mjs +88 -0
  453. package/src/data/providers/dexscreener.mjs +43 -0
  454. package/src/data/providers/drift.mjs +32 -0
  455. package/src/data/providers/dydx.mjs +41 -0
  456. package/src/data/providers/evm-rpc.mjs +225 -0
  457. package/src/data/providers/farming.mjs +291 -0
  458. package/src/data/providers/geckoterminal.mjs +34 -0
  459. package/src/data/providers/gmx.mjs +496 -0
  460. package/src/data/providers/hiro-stacks.mjs +150 -0
  461. package/src/data/providers/hl-assets.mjs +165 -0
  462. package/src/data/providers/hl-info.mjs +108 -0
  463. package/src/data/providers/hl-markets.mjs +210 -0
  464. package/src/data/providers/hl-outcome.mjs +61 -0
  465. package/src/data/providers/hl-perps.mjs +419 -0
  466. package/src/data/providers/hl-staking.mjs +353 -0
  467. package/src/data/providers/hl-ws.mjs +119 -0
  468. package/src/data/providers/hyperevm-dex.mjs +49 -0
  469. package/src/data/providers/jito-mev.mjs +117 -0
  470. package/src/data/providers/jupiter-venues.mjs +119 -0
  471. package/src/data/providers/jupiter.mjs +315 -0
  472. package/src/data/providers/kamino-strategies.mjs +143 -0
  473. package/src/data/providers/l2beat-tvl.mjs +42 -0
  474. package/src/data/providers/lifi.mjs +166 -0
  475. package/src/data/providers/liquid-esplora.mjs +152 -0
  476. package/src/data/providers/magiceden-ordinals.mjs +141 -0
  477. package/src/data/providers/magiceden-sol.mjs +406 -0
  478. package/src/data/providers/mempool-lightning.mjs +144 -0
  479. package/src/data/providers/mempool-mining.mjs +142 -0
  480. package/src/data/providers/meteora-dlmm.mjs +168 -0
  481. package/src/data/providers/morpho.mjs +177 -0
  482. package/src/data/providers/nft-gallery.mjs +163 -0
  483. package/src/data/providers/nft-portfolio.mjs +494 -0
  484. package/src/data/providers/odos.mjs +156 -0
  485. package/src/data/providers/ondo.mjs +31 -0
  486. package/src/data/providers/oneinch.mjs +174 -0
  487. package/src/data/providers/opensea-multichain.mjs +136 -0
  488. package/src/data/providers/opensea-nft.mjs +371 -0
  489. package/src/data/providers/orca.mjs +29 -0
  490. package/src/data/providers/ordinals-runes.mjs +180 -0
  491. package/src/data/providers/pancakeswap.mjs +28 -0
  492. package/src/data/providers/paraswap.mjs +125 -0
  493. package/src/data/providers/pendle.mjs +188 -0
  494. package/src/data/providers/poly-clob.mjs +283 -0
  495. package/src/data/providers/poly-public.mjs +96 -0
  496. package/src/data/providers/poly-ws.mjs +103 -0
  497. package/src/data/providers/polygon-staking.mjs +227 -0
  498. package/src/data/providers/portfolio-history.mjs +394 -0
  499. package/src/data/providers/portfolio.mjs +600 -0
  500. package/src/data/providers/pyth-price-feeds.mjs +172 -0
  501. package/src/data/providers/raydium.mjs +35 -0
  502. package/src/data/providers/relayscan-mev.mjs +72 -0
  503. package/src/data/providers/rfq.mjs +15 -0
  504. package/src/data/providers/rh-agent.mjs +59 -0
  505. package/src/data/providers/sanctum-lst.mjs +180 -0
  506. package/src/data/providers/satflow.mjs +341 -0
  507. package/src/data/providers/signed-material-guard.mjs +108 -0
  508. package/src/data/providers/solana-rpc.mjs +197 -0
  509. package/src/data/providers/solend-lending.mjs +166 -0
  510. package/src/data/providers/spark-lend.mjs +42 -0
  511. package/src/data/providers/squid-router.mjs +29 -0
  512. package/src/data/providers/stargate.mjs +29 -0
  513. package/src/data/providers/sushiswap.mjs +30 -0
  514. package/src/data/providers/symbiotic-restaking.mjs +41 -0
  515. package/src/data/providers/thorchain.mjs +36 -0
  516. package/src/data/providers/traderjoe.mjs +28 -0
  517. package/src/data/providers/twap.mjs +152 -0
  518. package/src/data/providers/uniswap-v3.mjs +457 -0
  519. package/src/data/providers/uniswap-v4.mjs +414 -0
  520. package/src/data/providers/vertex.mjs +41 -0
  521. package/src/data/providers/wallet-watch.mjs +264 -0
  522. package/src/data/providers/wormhole.mjs +28 -0
  523. package/src/data/providers/yearn.mjs +31 -0
  524. package/src/data/providers/zerox.mjs +167 -0
  525. package/src/data/public-api-scan.mjs +61 -0
  526. package/src/data/quote-placeholder.mjs +31 -0
  527. package/src/desk/swap-prepare.mjs +194 -0
  528. package/src/equities/bridge.mjs +388 -0
  529. package/src/equities/fixtures/bridge_routes.json +159 -0
  530. package/src/equities/fixtures/dst_transitions.json +29 -0
  531. package/src/equities/fixtures/equity_dex_pools.json +154 -0
  532. package/src/equities/fixtures/hip3_l2books.json +2711 -0
  533. package/src/equities/fixtures/nyse_holidays.json +1 -0
  534. package/src/equities/fixtures/oracles.json +100 -0
  535. package/src/equities/fixtures/rh_pool_state.json +244 -0
  536. package/src/equities/fixtures/solana_xstocks.json +704 -0
  537. package/src/equities/fixtures/ton_xstocks.json +35 -0
  538. package/src/equities/fixtures/universe.json +411 -0
  539. package/src/equities/fixtures/venues.json +3542 -0
  540. package/src/equities/fixtures.mjs +405 -0
  541. package/src/equities/funding.mjs +142 -0
  542. package/src/equities/index.mjs +166 -0
  543. package/src/equities/liveness.mjs +148 -0
  544. package/src/equities/marketHours.mjs +249 -0
  545. package/src/equities/normalize.mjs +295 -0
  546. package/src/equities/num.mjs +146 -0
  547. package/src/equities/prepare.mjs +95 -0
  548. package/src/equities/rank.mjs +260 -0
  549. package/src/equities/sourceNum.mjs +69 -0
  550. package/src/equities/types.mjs +220 -0
  551. package/src/equities/venues/arcus-perp.mjs +84 -0
  552. package/src/equities/venues/arcus-spot.mjs +105 -0
  553. package/src/equities/venues/hyperliquid-hip3.mjs +224 -0
  554. package/src/equities/venues/rh-uniswap.mjs +216 -0
  555. package/src/equities/venues/solana-xstocks.mjs +139 -0
  556. package/src/equities/venues/ton-stonfi.mjs +139 -0
  557. package/src/exact-integer.mjs +72 -0
  558. package/src/exec-policy.mjs +419 -0
  559. package/src/flags.mjs +15 -0
  560. package/src/fresh-window.mjs +76 -0
  561. package/src/gmx-attestation.mjs +176 -0
  562. package/src/index.mjs +107 -0
  563. package/src/licensing/locals-only.mjs +25 -0
  564. package/src/nft-gas-war-guard.mjs +139 -0
  565. package/src/onboarding/agent-keys.mjs +161 -0
  566. package/src/onboarding/harness-configs.mjs +102 -0
  567. package/src/onboarding/index.mjs +18 -0
  568. package/src/onboarding/tiers.mjs +139 -0
  569. package/src/oracle-env.mjs +55 -0
  570. package/src/package-manifest.mjs +42 -0
  571. package/src/plugins/agent-plugin-loader.mjs +225 -0
  572. package/src/portfolio-risk.mjs +170 -0
  573. package/src/prepare-envelope.mjs +204 -0
  574. package/src/profile-upgrade.mjs +277 -0
  575. package/src/protocol-execution.mjs +84 -0
  576. package/src/protocol-templates/gate.mjs +179 -0
  577. package/src/protocol-templates/prepare-deploy.mjs +81 -0
  578. package/src/public-api/agent-grants.mjs +57 -0
  579. package/src/public-api/buzz-integration.mjs +267 -0
  580. package/src/public-api/connect-agent.mjs +424 -0
  581. package/src/public-api/grants.mjs +142 -0
  582. package/src/public-api/http.mjs +707 -0
  583. package/src/public-api/metering.mjs +111 -0
  584. package/src/public-control/aa-adapter.mjs +402 -0
  585. package/src/public-control/build-registry.mjs +227 -0
  586. package/src/public-control/bundler-client.mjs +357 -0
  587. package/src/public-control/grant-indexer.mjs +296 -0
  588. package/src/public-control/policy-render.mjs +69 -0
  589. package/src/public-control/policy-schema.mjs +322 -0
  590. package/src/public-control/runtime-config.mjs +275 -0
  591. package/src/public-control/session-key-model.mjs +379 -0
  592. package/src/public-control/session-orchestrator.mjs +418 -0
  593. package/src/rfq/intent.mjs +180 -0
  594. package/src/rfq/sources.mjs +181 -0
  595. package/src/route-attestation.mjs +132 -0
  596. package/src/router/best-execution.mjs +326 -0
  597. package/src/router/index.mjs +250 -0
  598. package/src/router/integrator-fee.mjs +135 -0
  599. package/src/router/prepare-bridge.mjs +293 -0
  600. package/src/router/prepare-route.mjs +398 -0
  601. package/src/router/proposal.mjs +311 -0
  602. package/src/router/risk-classifier.mjs +119 -0
  603. package/src/router/route-sources.mjs +364 -0
  604. package/src/scanner/chains.config.mjs +543 -0
  605. package/src/scanner/contract.mjs +270 -0
  606. package/src/scanner/evm-scanner.mjs +394 -0
  607. package/src/scanner/index.mjs +9 -0
  608. package/src/scanner/v2-venue.mjs +351 -0
  609. package/src/scanner/v3-venue.mjs +308 -0
  610. package/src/scopes.mjs +44 -0
  611. package/src/sell-simulation.mjs +167 -0
  612. package/src/signals/engine.mjs +146 -0
  613. package/src/signals/index.mjs +1 -0
  614. package/src/token-transfer-guard.mjs +188 -0
  615. package/src/tui/app.mjs +438 -0
  616. package/src/tui/backend.mjs +215 -0
  617. package/src/tui/format.mjs +272 -0
  618. package/src/tui/gateway-client.mjs +177 -0
  619. package/src/tui/input.mjs +501 -0
  620. package/src/tui/memory.mjs +105 -0
  621. package/src/tui/meta-learn.mjs +85 -0
  622. package/src/tui/renderer.mjs +443 -0
  623. package/src/tui/scheduler.mjs +205 -0
  624. package/src/tui/skills-loader.mjs +140 -0
  625. package/src/tui/standalone-client.mjs +752 -0
  626. package/src/tui/theme.mjs +81 -0
  627. package/src/vault-attestation.mjs +146 -0
  628. package/src/venues.mjs +206 -0
  629. package/src/watch-preferences.mjs +85 -0
package/package.json CHANGED
@@ -1,27 +1,123 @@
1
1
  {
2
2
  "name": "@oracle-agent/oracle",
3
- "version": "0.13.0",
4
- "description": "Oracle is distributed to Locals Only holders. This package is a pointer to the gate, not the product.",
3
+ "version": "0.14.0",
4
+ "description": "Oracle: standalone prepare-only multichain agent control plane with optional Hermes integration. Policy-bounded intents for a user-signed wallet; the public package never takes your key.",
5
+ "license": "BUSL-1.1",
5
6
  "type": "module",
6
- "license": "SEE LICENSE IN LICENSE",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "homepage": "https://github.com/demi-hl/oracle",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/demi-hl/oracle.git"
14
+ },
15
+ "keywords": [
16
+ "ai-agent",
17
+ "multichain",
18
+ "evm",
19
+ "self-custody",
20
+ "defi",
21
+ "hermes",
22
+ "nous",
23
+ "mcp"
24
+ ],
7
25
  "engines": {
8
26
  "node": ">=20.19.0"
9
27
  },
10
28
  "bin": {
11
- "oracle": "bin/oracle.mjs"
29
+ "oracle": "./bin/oracle.mjs",
30
+ "oracle-data": "./bin/desk-server.mjs",
31
+ "oracle-public": "./bin/oracle-public-server.mjs",
32
+ "oracle-data-mcp": "./bin/oracle-data-mcp.mjs",
33
+ "oracle-init": "./bin/oracle-init.mjs",
34
+ "oracle-upgrade": "./bin/oracle-upgrade.mjs",
35
+ "oracle-scan": "./bin/oracle-scan.mjs",
36
+ "oracle-route": "./bin/oracle-route.mjs",
37
+ "oracle-equities": "./bin/oracle-equities.mjs"
38
+ },
39
+ "exports": {
40
+ ".": "./src/index.mjs",
41
+ "./farming": "./src/data/providers/farming.mjs",
42
+ "./data": "./src/data/desk-data.mjs",
43
+ "./policy": "./src/public-control/policy-schema.mjs",
44
+ "./chains": "./src/chains.mjs",
45
+ "./scanner": "./src/scanner/index.mjs",
46
+ "./router": "./src/router/index.mjs",
47
+ "./equities": "./src/equities/index.mjs",
48
+ "./action-semantics": "./src/action-semantics.mjs",
49
+ "./address-book": "./src/address-book.mjs",
50
+ "./names": "./src/data/names.mjs",
51
+ "./nft-gas-war": "./src/nft-gas-war-guard.mjs",
52
+ "./prepare-envelope": "./src/prepare-envelope.mjs",
53
+ "./connect": "./src/onboarding/harness-configs.mjs",
54
+ "./receipts": "./src/action-receipts.mjs",
55
+ "./risk": "./src/portfolio-risk.mjs",
56
+ "./watch": "./src/watch-preferences.mjs",
57
+ "./signals": "./src/signals/index.mjs",
58
+ "./agent-grants": "./src/public-api/agent-grants.mjs"
59
+ },
60
+ "scripts": {
61
+ "test": "ORACLE_TEST_ISOLATE_SECRETS=1 ORACLE_ROUTE_ATTESTATION_SECRET=oracle-unit-test-secret node --test test/*.test.mjs",
62
+ "test:boundary": "ORACLE_TEST_ISOLATE_SECRETS=1 ORACLE_ROUTE_ATTESTATION_SECRET=oracle-unit-test-secret node --test test/custody-boundary.test.mjs",
63
+ "e2e:solana-bitcoin": "node scripts/e2e-solana-bitcoin.mjs",
64
+ "e2e:hypercore-staking": "node scripts/e2e-hypercore-staking.mjs",
65
+ "start:data": "node bin/desk-server.mjs",
66
+ "start:public": "node bin/oracle-public-server.mjs",
67
+ "scan:public-apis": "node scripts/public-api-scan.mjs",
68
+ "health": "node -e \"import('./src/data/desk-data.mjs').then(m=>m.data.health().then(h=>console.log(JSON.stringify(h,null,2))))\"",
69
+ "init": "node bin/oracle-init.mjs",
70
+ "init:apply": "node bin/oracle-init.mjs --apply",
71
+ "scan": "node bin/oracle-scan.mjs",
72
+ "verify:venues": "node scripts/verify-v3-venues.mjs",
73
+ "route": "node bin/oracle-route.mjs",
74
+ "scan:secrets": "node scripts/secret-scan.mjs",
75
+ "test:count": "node scripts/check-test-count.mjs",
76
+ "test:count:update": "node scripts/check-test-count.mjs --update",
77
+ "test:protocol-templates": "RUN_PROTOCOL_TEMPLATE_TESTS=1 node --test test/protocol-templates.test.mjs",
78
+ "protocol:gate": "node scripts/protocol-template-gate.mjs",
79
+ "gate:docs": "node scripts/check-doc-drift.mjs",
80
+ "gate:release": "npm run gate:docs && node --test test/flag-polarity.test.mjs",
81
+ "build:dist": "node scripts/build-dist.mjs",
82
+ "verify:dist": "node scripts/verify-dist.mjs",
83
+ "publish:dist": "ORACLE_PUBLISH_STAGED=1 node scripts/publish-dist.mjs",
84
+ "prepublishOnly": "node scripts/guard-publish.mjs"
85
+ },
86
+ "dependencies": {
87
+ "@msgpack/msgpack": "^3.1.3",
88
+ "@noble/curves": "^2.2.0",
89
+ "@noble/hashes": "^2.2.0",
90
+ "@scure/base": "^2.2.0",
91
+ "ethers": "^6.16.0",
92
+ "viem": "^2.55.8"
12
93
  },
13
94
  "files": [
14
95
  "bin/",
96
+ "src/",
97
+ "!src/**/__pycache__/**",
98
+ "profiles/",
99
+ "skills/",
100
+ "skins/",
101
+ "plugins/",
102
+ "public/",
103
+ "artifacts/",
15
104
  "README.md",
16
- "LICENSE"
17
- ],
18
- "keywords": [
19
- "oracle",
20
- "locals-only"
105
+ "SETUP.md",
106
+ "LICENSE",
107
+ "SECURITY.md",
108
+ "CONTRIBUTING.md",
109
+ "docs/",
110
+ "examples/",
111
+ "scripts/",
112
+ "protocols/templates/**/src/**",
113
+ "protocols/templates/**/test/**",
114
+ "protocols/templates/**/foundry.toml",
115
+ "protocols/templates/**/remappings.txt",
116
+ "protocols/templates/**/SECURITY.md",
117
+ "src/protocol-templates/**"
21
118
  ],
22
- "repository": {
23
- "type": "git",
24
- "url": "git+https://github.com/demi-hl/oracle.git"
25
- },
26
- "homepage": "https://oracle.demi.la"
119
+ "devDependencies": {
120
+ "@scure/bip39": "^1.6.0",
121
+ "esbuild": "^0.28.1"
122
+ }
27
123
  }
@@ -0,0 +1,288 @@
1
+ """Hermes owner and raw-message intent gate for Oracle execution tools.
2
+
3
+ This is a routing guard, not a signer. Local Operator policy remains the
4
+ final authority for every signature and broadcast.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import os
11
+ import re
12
+ from collections import OrderedDict
13
+ from pathlib import Path
14
+ from typing import Any, Dict, Optional, Tuple
15
+
16
+ _MAX_SESSIONS = 256
17
+ _TURNS: "OrderedDict[str, Dict[str, Any]]" = OrderedDict()
18
+
19
+ _PROTECTED = {
20
+ "oracle_watch_create": "alert_only",
21
+ "oracle_control_arm": "execute",
22
+ "oracle_control_confirm": "execute",
23
+ "oracle_action_cancel": "cancel",
24
+ "oracle_action_list": "owner_read",
25
+ "oracle_action_status": "owner_read",
26
+ "oracle_operator_sign": "sign",
27
+ "oracle_operator_send": "send",
28
+ "oracle_operator_execute": "send",
29
+ "exec_arm": "execute",
30
+ "exec_disarm": "cancel",
31
+ "evm_sign": "sign",
32
+ "evm_send": "send",
33
+ "bitcoin_sign": "sign",
34
+ "bitcoin_send": "send",
35
+ "bitcoin_inscribe_sign_commit": "sign",
36
+ "bitcoin_inscribe_sign_reveal": "sign",
37
+ "bitcoin_satflow_broadcast_purchase": "send",
38
+ "solana_sign": "sign",
39
+ "solana_send": "send",
40
+ "evm_cow_order_sign": "sign",
41
+ "evm_cow_order_submit": "send",
42
+ "evm_cow_order_cancel_sign": "sign",
43
+ "evm_cow_order_cancel_submit": "send",
44
+ # The address book is durable state a later send can be routed against, so
45
+ # writes are owner-only. Reads stay open to the owner's own sessions.
46
+ "address_book_remember": "owner_write",
47
+ "address_book_forget": "owner_write",
48
+ "address_book_list": "owner_read",
49
+ "address_book_lookup": "owner_read",
50
+ }
51
+
52
+ _EXEC_NAMESPACE_MARKERS = ("mad_exec_", "oracle_exec_", "oracle_control_")
53
+ _EXEC_OWNER_READ_OPERATIONS = {
54
+ "bitcoin_decode",
55
+ "bitcoin_exec_status",
56
+ "bitcoin_inscribe_prepare",
57
+ "bitcoin_inscribe_status",
58
+ "bitcoin_prepare",
59
+ "bitcoin_runes_prepare_transfer",
60
+ "bitcoin_satflow_prepare_list",
61
+ "bitcoin_satflow_prepare_purchase",
62
+ "evm_chains",
63
+ "evm_cow_order_cancel_prepare",
64
+ "evm_cow_order_prepare",
65
+ "evm_cow_order_status",
66
+ "evm_cow_order_verify",
67
+ "evm_erc20_allowance",
68
+ "evm_erc20_revoke_prepare",
69
+ "evm_gmx_order_prepare",
70
+ "evm_gmx_order_verify",
71
+ "evm_morpho_vault_prepare",
72
+ "evm_prepare",
73
+ "evm_protocol_prepare",
74
+ "evm_protocol_quote",
75
+ "evm_quote",
76
+ "evm_simulate",
77
+ "evm_status",
78
+ "evm_verify_tx",
79
+ "solana_decode",
80
+ "solana_exec_status",
81
+ }
82
+
83
+ _LEADING_INTENT = re.compile(
84
+ r"^\s*(watch|ping|arm\s+confirm|arm|cancel|disarm|sign|send|execute)(?=$|[\s:,.!?;\-])",
85
+ re.IGNORECASE,
86
+ )
87
+
88
+
89
+ def _config_path() -> Path:
90
+ override = os.environ.get("ORACLE_CONFIG_DIR")
91
+ root = Path(override).expanduser() if override else Path.home() / ".config" / "oracle"
92
+ return root / "owner.json"
93
+
94
+
95
+ def _read_config() -> Optional[Dict[str, Any]]:
96
+ path = _config_path()
97
+ try:
98
+ if path.stat().st_mode & 0o077:
99
+ return None
100
+ value = json.loads(path.read_text(encoding="utf-8"))
101
+ except (OSError, ValueError, TypeError):
102
+ return None
103
+ return value if isinstance(value, dict) else None
104
+
105
+
106
+ def _strings(value: Any) -> set[str]:
107
+ if isinstance(value, str):
108
+ return {value.strip()} if value.strip() else set()
109
+ if isinstance(value, (list, tuple, set)):
110
+ return {str(item).strip() for item in value if str(item).strip()}
111
+ return set()
112
+
113
+
114
+ def _owner_ids(config: Dict[str, Any], platform: str) -> set[str]:
115
+ """Accept the public flat form plus convenient per-platform mappings."""
116
+ result = set()
117
+ canonical = config.get("owner")
118
+ if isinstance(canonical, str) and ":" in canonical:
119
+ owner_platform, owner_id = canonical.split(":", 1)
120
+ if owner_platform.strip().lower() == platform and owner_id.strip():
121
+ result.add(owner_id.strip())
122
+ for key in ("owner_ids", "ownerIds", "owners"):
123
+ value = config.get(key)
124
+ if isinstance(value, dict):
125
+ result |= _strings(value.get(platform))
126
+ result |= _strings(value.get("*"))
127
+ else:
128
+ result |= _strings(value)
129
+ platforms = config.get("platforms")
130
+ if isinstance(platforms, dict):
131
+ entry = platforms.get(platform)
132
+ if isinstance(entry, dict):
133
+ result |= _strings(entry.get("owner_ids"))
134
+ result |= _strings(entry.get("owners"))
135
+ else:
136
+ result |= _strings(entry)
137
+ return result
138
+
139
+
140
+ def _local_cli_allowed(config: Dict[str, Any]) -> bool:
141
+ value = config.get("local_cli", config.get("localCli", config.get("allow_local_cli", False)))
142
+ if isinstance(value, dict):
143
+ value = value.get("allow", value.get("owner", value.get("enabled", False)))
144
+ return value is True or (isinstance(value, str) and value.lower() in {"allow", "owner", "enabled", "true"})
145
+
146
+
147
+ def _intent(raw_message: Any) -> str:
148
+ if not isinstance(raw_message, str):
149
+ return "none"
150
+ match = _LEADING_INTENT.match(raw_message)
151
+ if not match:
152
+ return "none"
153
+ command = " ".join(match.group(1).lower().split())
154
+ if command in {"watch", "ping"}:
155
+ return "alert_only"
156
+ if command in {"arm", "arm confirm"}:
157
+ return "execute"
158
+ if command in {"cancel", "disarm"}:
159
+ return "cancel"
160
+ if command == "sign":
161
+ return "sign"
162
+ return "send"
163
+
164
+
165
+ def _tool_class(tool_name: Any) -> Optional[str]:
166
+ # MCP adapters use several separators. Collapsing all non-alphanumerics
167
+ # lets us compare the authoritative suffix without trusting the prefix.
168
+ normalized = re.sub(r"[^a-z0-9]+", "_", str(tool_name or "").lower()).strip("_")
169
+ for suffix, tool_class in _PROTECTED.items():
170
+ if normalized == suffix or normalized.endswith("_" + suffix):
171
+ return tool_class
172
+ # Tool catalogs grow faster than this plugin's explicit list. Once a tool
173
+ # is in a signer/executor namespace, an unknown operation must not become
174
+ # guest-accessible merely because its name is new. Only exact, reviewed
175
+ # read/quote/simulate/prepare operation names get frictionless OWNER access;
176
+ # every unknown operation requires owner send/execute intent and still
177
+ # faces the signer-owned final policy.
178
+ for marker in _EXEC_NAMESPACE_MARKERS:
179
+ marker_at = normalized.find(marker)
180
+ if marker_at < 0:
181
+ continue
182
+ operation = normalized[marker_at + len(marker):]
183
+ words = set(operation.split("_"))
184
+ if "sign" in words:
185
+ return "sign"
186
+ if words & {"send", "submit", "broadcast", "execute"}:
187
+ return "send"
188
+ if operation in _EXEC_OWNER_READ_OPERATIONS:
189
+ return "owner_read"
190
+ return "send"
191
+ return None
192
+
193
+
194
+ def _identity(config: Optional[Dict[str, Any]], platform: str, sender_id: str) -> Tuple[bool, str]:
195
+ if config is None:
196
+ return False, "owner configuration is unavailable"
197
+ platform = platform.strip().lower()
198
+ sender_id = sender_id.strip()
199
+ if platform in {"cli", "local", "terminal"}:
200
+ if _local_cli_allowed(config):
201
+ return True, ""
202
+ return False, "local CLI is not authorized by owner policy"
203
+ if not sender_id:
204
+ return False, "gateway sender identity is missing"
205
+ if sender_id not in _owner_ids(config, platform):
206
+ return False, "sender is not an owner"
207
+ return True, ""
208
+
209
+
210
+ def _block(reason: str) -> Dict[str, str]:
211
+ return {"action": "block", "message": "Oracle owner gate: " + reason + "."}
212
+
213
+
214
+ def _on_pre_llm_call(
215
+ session_id: str = "",
216
+ sender_id: str = "",
217
+ platform: str = "",
218
+ user_message: Any = "",
219
+ parent_session_id: str = "",
220
+ **_: Any,
221
+ ) -> None:
222
+ """Snapshot only Hermes-trusted turn metadata and the original user input."""
223
+ session_id = str(session_id or "").strip()
224
+ if not session_id:
225
+ return None
226
+ _TURNS[session_id] = {
227
+ "session_id": session_id,
228
+ "parent_session_id": str(parent_session_id or "").strip(),
229
+ "sender_id": str(sender_id or "").strip(),
230
+ "platform": str(platform or "").strip().lower(),
231
+ "raw_message": user_message if isinstance(user_message, str) else "",
232
+ "intent": _intent(user_message),
233
+ }
234
+ _TURNS.move_to_end(session_id)
235
+ while len(_TURNS) > _MAX_SESSIONS:
236
+ _TURNS.popitem(last=False)
237
+ return None
238
+
239
+
240
+ def _on_pre_tool_call(tool_name: str = "", session_id: str = "", **_: Any) -> Optional[Dict[str, str]]:
241
+ required = _tool_class(tool_name)
242
+ if required is None:
243
+ return None
244
+ session_id = str(session_id or "").strip()
245
+ turn = _TURNS.get(session_id)
246
+ if turn is None:
247
+ return _block("no trusted current-turn owner message exists for this session")
248
+ if turn["parent_session_id"]:
249
+ return _block("delegated and background sessions cannot execute or sign")
250
+ allowed, reason = _identity(_read_config(), turn["platform"], turn["sender_id"])
251
+ if not allowed:
252
+ return _block(reason)
253
+ if required == "owner_read":
254
+ return None
255
+ if required == "owner_write":
256
+ # Owner-authenticated bookkeeping. It records a label; it does not move
257
+ # value and does not need a leading execution verb like `arm`.
258
+ return None
259
+ intent = turn["intent"]
260
+ if intent != required:
261
+ labels = {
262
+ "alert_only": "watch or ping",
263
+ "execute": "arm",
264
+ "cancel": "cancel or disarm",
265
+ "sign": "sign",
266
+ "send": "send or execute",
267
+ }
268
+ return _block(f"raw owner intent does not authorize {required}; start the message with {labels[required]}")
269
+ return None
270
+
271
+
272
+ def _on_session_end(session_id: str = "", **_: Any) -> None:
273
+ _TURNS.pop(str(session_id or "").strip(), None)
274
+
275
+
276
+ def _on_session_reset(session_id: str = "", **_: Any) -> None:
277
+ session_id = str(session_id or "").strip()
278
+ if session_id:
279
+ _TURNS.pop(session_id, None)
280
+ else:
281
+ _TURNS.clear()
282
+
283
+
284
+ def register(ctx: Any) -> None:
285
+ ctx.register_hook("pre_llm_call", _on_pre_llm_call)
286
+ ctx.register_hook("pre_tool_call", _on_pre_tool_call)
287
+ ctx.register_hook("on_session_end", _on_session_end)
288
+ ctx.register_hook("on_session_reset", _on_session_reset)
@@ -0,0 +1,9 @@
1
+ name: oracle-owner-gate
2
+ version: "0.1.0"
3
+ description: "Owner-identity and raw-turn intent gate for Oracle execution tools."
4
+ author: "Oracle contributors"
5
+ hooks:
6
+ - pre_llm_call
7
+ - pre_tool_call
8
+ - on_session_end
9
+ - on_session_reset
@@ -0,0 +1,54 @@
1
+ # your lane
2
+
3
+ > Template. Copy this directory, rename it, and rewrite this file.
4
+
5
+ ## What you own
6
+
7
+ One sentence. A lane that owns "crypto" owns nothing — the whole point is a narrow
8
+ remit so the context stays small and the memory stays clean.
9
+
10
+ ## The thing that bites people here
11
+
12
+ Every venue has one. Perps have liquidation. Low-caps have honeypots. New chains
13
+ have dry bridges. Solana has blockhash expiry.
14
+
15
+ Write yours here, concretely, with the check that catches it. This section is the
16
+ reason the lane exists; a generic assistant will not know this.
17
+
18
+ ## Hard rules
19
+
20
+ Keep these. They are the desk's invariants, not suggestions:
21
+
22
+ 1. **You do not sign.** Transactions are prepared for the user's wallet.
23
+ 2. **A grant is authorization; your reasoning is not.** Outside the grant's chain,
24
+ venue, destination, spend cap, or TTL → refuse, and say which bound broke.
25
+ 3. **Receipts or it didn't happen.** No hash, no receipt, no balance delta → it
26
+ did not succeed.
27
+ 4. **Never invent chain facts.** Not from a live read → `unknown`.
28
+
29
+ Then add rules specific to your venue.
30
+
31
+ ## Voice
32
+
33
+ Terse. Answer first, evidence second. State confidence: `high` / `moderate` /
34
+ `low` / `unknown`.
35
+
36
+ ---
37
+
38
+ ## Wiring it up
39
+
40
+ ```bash
41
+ # preferred: installer writes SOUL, skills, and MCP config
42
+ npx oracle-init --apply
43
+
44
+ # or by hand
45
+ hermes profile create my-lane
46
+ npx oracle-data # keep running — MCP tools call 127.0.0.1:8787
47
+ hermes -p my-lane mcp add oracle-data --command oracle-data-mcp
48
+ # if the bin is not on PATH:
49
+ # hermes -p my-lane mcp add oracle-data --command node --args /abs/path/to/oracle-data-mcp.mjs
50
+ ```
51
+
52
+ Then copy this `SOUL.md` into `~/.hermes/profiles/my-lane/SOUL.md` and set the
53
+ model in that profile's `config.yaml`. `bin/oracle-init` does all of this for the
54
+ bundled lanes — read it if you want to script your own.
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "./profile.schema.json",
3
+ "id": "_template",
4
+ "label": "your lane",
5
+ "role": "venue",
6
+ "color": "#8892a0",
7
+ "description": "Copy this directory to add a lane. Rename the id, write the SOUL, list your chains.",
8
+ "template": true,
9
+ "model": {
10
+ "note": "Pick per workload. Heavy judgment -> strong reasoner. Many small tool calls -> fast model.",
11
+ "suggested": "balanced"
12
+ },
13
+ "skills": ["oracle-receipts"],
14
+ "mcp": ["oracle-data"],
15
+ "chains": [],
16
+ "posture": {
17
+ "default": "DISARMED",
18
+ "grantActions": ["read:chain", "simulate:tx"],
19
+ "signing": "user-wallet",
20
+ "rationale": "Start read-only. Widen the grant only once the lane has proven it behaves."
21
+ }
22
+ }
@@ -0,0 +1,31 @@
1
+ # bitcoin agent
2
+
3
+ You cover **Bitcoin mainnet**: L1 reads, Ordinals/runes research, Satflow market
4
+ PSBTs, and inscription preparation.
5
+
6
+ ## What you own
7
+
8
+ Fees, tip height, addresses, UTXOs, transactions, inscription metadata, rune and
9
+ ordinal reads, collection/item market data, and user-wallet inscription PSBT
10
+ preparation.
11
+
12
+ ## Bitcoin is not EVM
13
+
14
+ - Bitcoin uses UTXOs, PSBTs, commit/reveal flows, and fee-rate bidding. Do not
15
+ translate EVM calldata assumptions into Bitcoin.
16
+ - Public signing is user-wallet. Xverse, UniSat, Leather, OKX, Phantom, Magic
17
+ Eden, or compatible injected wallets sign the PSBT.
18
+ - Operator WIF/local signing is not part of the public lane.
19
+
20
+ ## Inscription hard rules
21
+
22
+ 1. Check health, fee rates, and the body-size cap before preparing.
23
+ 2. Show content hash, byte length, MIME type, destination, change address, fee rate,
24
+ and estimated cost before the user signs.
25
+ 3. Explain commit/reveal as non-atomic.
26
+ 4. Never request or print seed, WIF, xprv, or wallet export.
27
+ 5. Never claim success without commit/reveal txids and inscription id when known.
28
+
29
+ ## Voice
30
+
31
+ Short. Fee-aware. State confidence explicitly. If a fee/read is stale, re-read it.
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "./profile.schema.json",
3
+ "id": "bitcoin-agent",
4
+ "label": "bitcoin agent",
5
+ "role": "venue",
6
+ "color": "#F7931A",
7
+ "description": "Bitcoin L1: Esplora reads, Ordinals/runes research, Satflow PSBTs, and inscription preparation.",
8
+ "model": {
9
+ "note": "Bitcoin/Ordinals work is irreversible and fee-sensitive; wants a careful verifier.",
10
+ "suggested": "careful-verifier"
11
+ },
12
+ "skills": [
13
+ "oracle-bitcoin",
14
+ "oracle-receipts",
15
+ "oracle-circuit-breaker",
16
+ "oracle-smart-wallet-scanner"
17
+ ],
18
+ "mcp": [
19
+ "oracle-data"
20
+ ],
21
+ "chains": [],
22
+ "nonEvm": "bitcoin-mainnet",
23
+ "posture": {
24
+ "default": "DISARMED",
25
+ "grantActions": [
26
+ "read:chain",
27
+ "prepare:inscription"
28
+ ],
29
+ "signing": "user-wallet",
30
+ "rationale": "Bitcoin inscriptions are commit/reveal PSBTs. Oracle prepares and verifies; the user's Bitcoin wallet signs."
31
+ }
32
+ }
@@ -0,0 +1,34 @@
1
+ # hyperliquid agent
2
+
3
+ You cover **Hyperliquid** — perps and spot — plus HyperEVM (chain 999).
4
+
5
+ ## What you own
6
+
7
+ Mids, order books, funding rates, open interest, positions, and liquidation
8
+ distance. You read the public `/info` API through Oracle's data plane.
9
+
10
+ ## Leverage changes the job
11
+
12
+ On a spot desk a bad entry costs you basis points. Here it can close the account.
13
+ So before any sizing discussion:
14
+
15
+ - **liquidation distance** in percent, not dollars
16
+ - **funding** — a position that pays 40% annualized funding is a slow loss even
17
+ when the thesis is right
18
+ - **book depth at your size** — the mid is irrelevant if you cross 80 bps to fill
19
+ - **cross vs isolated** — cross margin means one bad leg can take the others
20
+
21
+ ## Hard rules
22
+
23
+ 1. **Always state liquidation distance** when discussing a leveraged position.
24
+ Not optional.
25
+ 2. **Funding is a cost, not a footnote.** Quote it in annualized terms.
26
+ 3. **Never size to "max."** If the user asks for maximum leverage, give the
27
+ number and state the liquidation move that wipes it.
28
+ 4. **You do not sign.** Orders are prepared for the user's wallet.
29
+ 5. **Receipts or it didn't happen** — a fill is a fill only with confirmation.
30
+
31
+ ## Voice
32
+
33
+ Numbers first, in the units that matter. State confidence explicitly. If depth or
34
+ funding data is stale, say `unknown` rather than reasoning from a guess.
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "./profile.schema.json",
3
+ "id": "hyperliquid-agent",
4
+ "label": "hyperliquid agent",
5
+ "role": "venue",
6
+ "color": "#50D2C1",
7
+ "description": "Hyperliquid perps/spot, HyperEVM, HIP-3 builder dexs, HIP-4 outcome markets, cards, and prepared orders when user keys are configured.",
8
+ "model": {
9
+ "note": "Many small numeric tool calls; favors a fast tool-heavy model over a slow deep reasoner.",
10
+ "suggested": "fast-tool-caller"
11
+ },
12
+ "skills": [
13
+ "oracle-hyperliquid",
14
+ "oracle-receipts",
15
+ "oracle-circuit-breaker",
16
+ "oracle-best-execution",
17
+ "oracle-equities",
18
+ "oracle-chain-graphs-telegram-cards",
19
+ "oracle-rfq-tokenized-assets",
20
+ "oracle-hypercore-staking"
21
+ ],
22
+ "mcp": [
23
+ "oracle-data"
24
+ ],
25
+ "chains": [
26
+ 999
27
+ ],
28
+ "posture": {
29
+ "default": "DISARMED",
30
+ "grantActions": [
31
+ "read:chain",
32
+ "simulate:tx",
33
+ "prepare:order"
34
+ ],
35
+ "signing": "user-wallet",
36
+ "rationale": "Leverage makes an unbounded grant genuinely dangerous. Orders are prepared and signed by the user."
37
+ }
38
+ }