@oracle-agent/oracle 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +13 -516
  3. package/bin/oracle.mjs +19 -27
  4. package/package.json +15 -98
  5. package/CONTRIBUTING.md +0 -98
  6. package/SECURITY.md +0 -89
  7. package/SETUP.md +0 -381
  8. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  9. package/artifacts/inscription/oracle-was-here.svg +0 -1
  10. package/artifacts/specialist-packs/oracle-full-crypto.json +0 -295
  11. package/bin/desk-server.mjs +0 -440
  12. package/bin/oracle-data-mcp.mjs +0 -1019
  13. package/bin/oracle-init.mjs +0 -496
  14. package/bin/oracle-public-server.mjs +0 -36
  15. package/bin/oracle-route.mjs +0 -254
  16. package/bin/oracle-scan.mjs +0 -192
  17. package/bin/oracle-upgrade.mjs +0 -42
  18. package/docs/adding-a-chain.md +0 -229
  19. package/docs/architecture.md +0 -138
  20. package/docs/cli.md +0 -47
  21. package/docs/connectors.md +0 -13
  22. package/docs/oracle-pack-standard.md +0 -29
  23. package/docs/profiles.md +0 -151
  24. package/docs/public-surface.md +0 -133
  25. package/examples/add-a-chain.mjs +0 -65
  26. package/examples/oracle-pack-template.mjs +0 -38
  27. package/examples/research-a-token.mjs +0 -70
  28. package/plugins/oracle-owner-gate/__init__.py +0 -227
  29. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  30. package/profiles/_template/SOUL.md +0 -54
  31. package/profiles/_template/profile.json +0 -22
  32. package/profiles/bitcoin-agent/SOUL.md +0 -31
  33. package/profiles/bitcoin-agent/profile.json +0 -32
  34. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  35. package/profiles/hyperliquid-agent/profile.json +0 -37
  36. package/profiles/oracle/SOUL.md +0 -107
  37. package/profiles/oracle/profile.json +0 -39
  38. package/profiles/polymarket-agent/SOUL.md +0 -35
  39. package/profiles/polymarket-agent/profile.json +0 -34
  40. package/profiles/profile.schema.json +0 -90
  41. package/profiles/protocol-builder/SOUL.md +0 -57
  42. package/profiles/protocol-builder/profile.json +0 -39
  43. package/profiles/robinhood-agent/SOUL.md +0 -53
  44. package/profiles/robinhood-agent/profile.json +0 -40
  45. package/profiles/solana-agent/SOUL.md +0 -37
  46. package/profiles/solana-agent/profile.json +0 -37
  47. package/profiles/stable-agent/SOUL.md +0 -43
  48. package/profiles/stable-agent/profile.json +0 -37
  49. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  50. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  51. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  52. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  53. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  54. package/public/agent-connect/app.js +0 -84
  55. package/public/agent-connect/index.html +0 -83
  56. package/public/agent-connect/styles.css +0 -70
  57. package/public/index.html +0 -12
  58. package/public/oracle-console/app.js +0 -272
  59. package/public/oracle-console/bitcoin-wallets.js +0 -206
  60. package/public/oracle-console/index.html +0 -91
  61. package/public/oracle-console/styles.css +0 -239
  62. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  63. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  64. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  65. package/public/oracle-splash/assets/llms/claude.svg +0 -1
  66. package/public/oracle-splash/assets/llms/codex-icon.svg +0 -1
  67. package/public/oracle-splash/assets/llms/codex.svg +0 -1
  68. package/public/oracle-splash/assets/llms/cursor-icon.svg +0 -12
  69. package/public/oracle-splash/assets/llms/cursor.svg +0 -17
  70. package/public/oracle-splash/assets/llms/deepseek.svg +0 -1
  71. package/public/oracle-splash/assets/llms/gemini-icon.svg +0 -1
  72. package/public/oracle-splash/assets/llms/gemini.svg +0 -1
  73. package/public/oracle-splash/assets/llms/grok.svg +0 -8
  74. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  75. package/public/oracle-splash/assets/llms/kimi-icon.svg +0 -1
  76. package/public/oracle-splash/assets/llms/kimi.svg +0 -1
  77. package/public/oracle-splash/assets/llms/manus.svg +0 -18
  78. package/public/oracle-splash/assets/llms/openclaw.svg +0 -22
  79. package/public/oracle-splash/assets/llms/perplexity.svg +0 -1
  80. package/public/oracle-splash/assets/llms/qwen.svg +0 -1
  81. package/public/oracle-splash/assets/llms/windsurf.svg +0 -1
  82. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  83. package/public/oracle-splash/assets/protocols/across.png +0 -0
  84. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  85. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  86. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  87. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  88. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  89. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  90. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  91. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  92. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  93. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  94. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  95. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  96. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  97. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  98. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  99. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  100. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  101. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  102. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  103. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  104. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  105. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  106. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  107. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  108. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  109. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  110. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  111. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  112. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  113. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  114. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  115. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  116. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  117. package/public/oracle-splash/assets/wordmarks/across.svg +0 -4
  118. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +0 -23
  119. package/public/oracle-splash/assets/wordmarks/balancer.svg +0 -3
  120. package/public/oracle-splash/assets/wordmarks/cowswap.svg +0 -1
  121. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  122. package/public/oracle-splash/assets/wordmarks/gmx.svg +0 -13
  123. package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
  124. package/public/oracle-splash/assets/wordmarks/hyena.svg +0 -7
  125. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +0 -21
  126. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +0 -13
  127. package/public/oracle-splash/assets/wordmarks/jupiter.svg +0 -35
  128. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +0 -1
  129. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  130. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  131. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +0 -1
  132. package/public/oracle-splash/assets/wordmarks/markets.svg +0 -1
  133. package/public/oracle-splash/assets/wordmarks/morpho.svg +0 -1
  134. package/public/oracle-splash/assets/wordmarks/odos.svg +0 -3
  135. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  136. package/public/oracle-splash/assets/wordmarks/oneinch.svg +0 -6
  137. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +0 -17
  138. package/public/oracle-splash/assets/wordmarks/opensea.svg +0 -1
  139. package/public/oracle-splash/assets/wordmarks/outcome.svg +0 -16
  140. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +0 -18
  141. package/public/oracle-splash/assets/wordmarks/paragon.svg +0 -9
  142. package/public/oracle-splash/assets/wordmarks/paraswap.svg +0 -16
  143. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  144. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  145. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  146. package/public/oracle-splash/assets/wordmarks/relay.svg +0 -8
  147. package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
  148. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  149. package/public/oracle-splash/assets/wordmarks/stargate.svg +0 -15
  150. package/public/oracle-splash/assets/wordmarks/uniswap.svg +0 -18
  151. package/public/oracle-splash/assets/wordmarks/velodrome.svg +0 -84
  152. package/public/oracle-splash/assets/wordmarks/xyz.svg +0 -12
  153. package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
  154. package/public/oracle-splash/brand/aave.webp +0 -0
  155. package/public/oracle-splash/brand/aavev2.webp +0 -0
  156. package/public/oracle-splash/brand/aborean.webp +0 -0
  157. package/public/oracle-splash/brand/across.webp +0 -0
  158. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  159. package/public/oracle-splash/brand/afi.webp +0 -0
  160. package/public/oracle-splash/brand/arcus.webp +0 -0
  161. package/public/oracle-splash/brand/aster.webp +0 -0
  162. package/public/oracle-splash/brand/avant.webp +0 -0
  163. package/public/oracle-splash/brand/balancer.webp +0 -0
  164. package/public/oracle-splash/brand/beefy.webp +0 -0
  165. package/public/oracle-splash/brand/benqi.webp +0 -0
  166. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  167. package/public/oracle-splash/brand/bitfi.webp +0 -0
  168. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  169. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  170. package/public/oracle-splash/brand/camelot.webp +0 -0
  171. package/public/oracle-splash/brand/compound.webp +0 -0
  172. package/public/oracle-splash/brand/concrete.webp +0 -0
  173. package/public/oracle-splash/brand/cow.webp +0 -0
  174. package/public/oracle-splash/brand/curve.webp +0 -0
  175. package/public/oracle-splash/brand/derive.webp +0 -0
  176. package/public/oracle-splash/brand/dolomite.webp +0 -0
  177. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  178. package/public/oracle-splash/brand/ekubo.webp +0 -0
  179. package/public/oracle-splash/brand/ethena.webp +0 -0
  180. package/public/oracle-splash/brand/etherfi.webp +0 -0
  181. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  182. package/public/oracle-splash/brand/felix.webp +0 -0
  183. package/public/oracle-splash/brand/fluid.webp +0 -0
  184. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  185. package/public/oracle-splash/brand/folks.webp +0 -0
  186. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  187. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  188. package/public/oracle-splash/brand/gassss.webp +0 -0
  189. package/public/oracle-splash/brand/gmx.webp +0 -0
  190. package/public/oracle-splash/brand/harmonix.webp +0 -0
  191. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  192. package/public/oracle-splash/brand/hlp.webp +0 -0
  193. package/public/oracle-splash/brand/hop.webp +0 -0
  194. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  195. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  196. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  197. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  198. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  199. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  200. package/public/oracle-splash/brand/hypha.webp +0 -0
  201. package/public/oracle-splash/brand/joedex.webp +0 -0
  202. package/public/oracle-splash/brand/jupiter.webp +0 -0
  203. package/public/oracle-splash/brand/kelp.webp +0 -0
  204. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  205. package/public/oracle-splash/brand/kmhype.webp +0 -0
  206. package/public/oracle-splash/brand/kona.webp +0 -0
  207. package/public/oracle-splash/brand/konalend.webp +0 -0
  208. package/public/oracle-splash/brand/lfj.webp +0 -0
  209. package/public/oracle-splash/brand/lido.webp +0 -0
  210. package/public/oracle-splash/brand/lifi.webp +0 -0
  211. package/public/oracle-splash/brand/lighter.webp +0 -0
  212. package/public/oracle-splash/brand/lista.webp +0 -0
  213. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  214. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  215. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  216. package/public/oracle-splash/brand/magiceden.webp +0 -0
  217. package/public/oracle-splash/brand/mempool.png +0 -0
  218. package/public/oracle-splash/brand/meteora.webp +0 -0
  219. package/public/oracle-splash/brand/morpho.webp +0 -0
  220. package/public/oracle-splash/brand/myriad.webp +0 -0
  221. package/public/oracle-splash/brand/noxa.webp +0 -0
  222. package/public/oracle-splash/brand/odos.webp +0 -0
  223. package/public/oracle-splash/brand/oneinch.webp +0 -0
  224. package/public/oracle-splash/brand/openbook.webp +0 -0
  225. package/public/oracle-splash/brand/opensea.webp +0 -0
  226. package/public/oracle-splash/brand/orca.webp +0 -0
  227. package/public/oracle-splash/brand/ordinals.png +0 -0
  228. package/public/oracle-splash/brand/ostium.webp +0 -0
  229. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  230. package/public/oracle-splash/brand/pendle.webp +0 -0
  231. package/public/oracle-splash/brand/perena.webp +0 -0
  232. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  233. package/public/oracle-splash/brand/phoenix.webp +0 -0
  234. package/public/oracle-splash/brand/polymarket.webp +0 -0
  235. package/public/oracle-splash/brand/polynomial.webp +0 -0
  236. package/public/oracle-splash/brand/projectx.webp +0 -0
  237. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  238. package/public/oracle-splash/brand/quickswap.webp +0 -0
  239. package/public/oracle-splash/brand/rain.webp +0 -0
  240. package/public/oracle-splash/brand/raydium.webp +0 -0
  241. package/public/oracle-splash/brand/relay.webp +0 -0
  242. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  243. package/public/oracle-splash/brand/saber.webp +0 -0
  244. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  245. package/public/oracle-splash/brand/sanctum.webp +0 -0
  246. package/public/oracle-splash/brand/satflow.png +0 -0
  247. package/public/oracle-splash/brand/sierra.webp +0 -0
  248. package/public/oracle-splash/brand/sky.webp +0 -0
  249. package/public/oracle-splash/brand/solv.webp +0 -0
  250. package/public/oracle-splash/brand/spark.webp +0 -0
  251. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  252. package/public/oracle-splash/brand/sphere.webp +0 -0
  253. package/public/oracle-splash/brand/ssv.webp +0 -0
  254. package/public/oracle-splash/brand/stabble.webp +0 -0
  255. package/public/oracle-splash/brand/stableswap.webp +0 -0
  256. package/public/oracle-splash/brand/stakewise.webp +0 -0
  257. package/public/oracle-splash/brand/stargate.webp +0 -0
  258. package/public/oracle-splash/brand/sthype.webp +0 -0
  259. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  260. package/public/oracle-splash/brand/unisat.png +0 -0
  261. package/public/oracle-splash/brand/uniswap.webp +0 -0
  262. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  263. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  264. package/public/oracle-splash/brand/unit.webp +0 -0
  265. package/public/oracle-splash/brand/velodrome.webp +0 -0
  266. package/public/oracle-splash/brand/velora.webp +0 -0
  267. package/public/oracle-splash/brand/venus.webp +0 -0
  268. package/public/oracle-splash/brand/wbeth.webp +0 -0
  269. package/public/oracle-splash/brand/xsy.webp +0 -0
  270. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  271. package/public/oracle-splash/brand/zerobase.webp +0 -0
  272. package/public/oracle-splash/brand/zerox.webp +0 -0
  273. package/public/oracle-splash/favicon.ico +0 -0
  274. package/public/oracle-splash/favicon.svg +0 -6
  275. package/public/oracle-splash/index.html +0 -1558
  276. package/public/oracle-splash/mesh-graph.png +0 -0
  277. package/public/oracle-splash/mesh-graph.svg +0 -216
  278. package/scripts/adversarial-bench.mjs +0 -114
  279. package/scripts/build-inscription.py +0 -230
  280. package/scripts/check-doc-drift.mjs +0 -123
  281. package/scripts/check-test-count.mjs +0 -105
  282. package/scripts/e2e-hl-markets.mjs +0 -21
  283. package/scripts/e2e-hl-perps.mjs +0 -48
  284. package/scripts/e2e-hypercore-staking.mjs +0 -128
  285. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  286. package/scripts/protocol-template-gate.mjs +0 -15
  287. package/scripts/public-api-scan.mjs +0 -23
  288. package/scripts/secret-scan.mjs +0 -181
  289. package/scripts/verify-v3-venues.mjs +0 -192
  290. package/skills/balance/SKILL.md +0 -176
  291. package/skills/oracle-action-semantics/SKILL.md +0 -40
  292. package/skills/oracle-best-execution/SKILL.md +0 -127
  293. package/skills/oracle-bitcoin/SKILL.md +0 -53
  294. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  295. package/skills/oracle-chat/SKILL.md +0 -61
  296. package/skills/oracle-chat/chain.SKILL.md +0 -31
  297. package/skills/oracle-chat/setup.SKILL.md +0 -37
  298. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  299. package/skills/oracle-contract-research/SKILL.md +0 -55
  300. package/skills/oracle-desk/SKILL.md +0 -58
  301. package/skills/oracle-dex-launch/SKILL.md +0 -38
  302. package/skills/oracle-grants/SKILL.md +0 -69
  303. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  304. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  305. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  306. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  307. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  308. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  309. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  310. package/skills/oracle-polymarket/SKILL.md +0 -60
  311. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  312. package/skills/oracle-protocol-security/SKILL.md +0 -60
  313. package/skills/oracle-public-product/SKILL.md +0 -44
  314. package/skills/oracle-receipts/SKILL.md +0 -52
  315. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  316. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  317. package/skills/oracle-solana/SKILL.md +0 -65
  318. package/skills/oracle-solana-nft/SKILL.md +0 -54
  319. package/skills/oracle-token-research/SKILL.md +0 -67
  320. package/skins/oracle.yaml +0 -56
  321. package/src/action-receipts.mjs +0 -265
  322. package/src/action-semantics.mjs +0 -62
  323. package/src/address-book.mjs +0 -208
  324. package/src/agent-auth.mjs +0 -206
  325. package/src/approval-guard.mjs +0 -282
  326. package/src/attestation-secret.mjs +0 -88
  327. package/src/audit-log.mjs +0 -196
  328. package/src/auth/oauth.mjs +0 -672
  329. package/src/auto-slippage.mjs +0 -378
  330. package/src/capability-posture.mjs +0 -125
  331. package/src/chains.mjs +0 -62
  332. package/src/cli/chain-catalog.mjs +0 -215
  333. package/src/cli/chain-state.mjs +0 -74
  334. package/src/cli/commands/auth.mjs +0 -193
  335. package/src/cli/commands/bootstrap.mjs +0 -87
  336. package/src/cli/commands/chain.mjs +0 -143
  337. package/src/cli/commands/chat.mjs +0 -434
  338. package/src/cli/commands/credential.mjs +0 -9
  339. package/src/cli/commands/data-mcp.mjs +0 -18
  340. package/src/cli/commands/data.mjs +0 -75
  341. package/src/cli/commands/doctor.mjs +0 -136
  342. package/src/cli/commands/help.mjs +0 -7
  343. package/src/cli/commands/init.mjs +0 -27
  344. package/src/cli/commands/mcp.mjs +0 -142
  345. package/src/cli/commands/model.mjs +0 -99
  346. package/src/cli/commands/prepare.mjs +0 -12
  347. package/src/cli/commands/public.mjs +0 -20
  348. package/src/cli/commands/route.mjs +0 -12
  349. package/src/cli/commands/runner.mjs +0 -9
  350. package/src/cli/commands/scan.mjs +0 -12
  351. package/src/cli/commands/setup.mjs +0 -275
  352. package/src/cli/commands/sign.mjs +0 -21
  353. package/src/cli/commands/signer.mjs +0 -9
  354. package/src/cli/commands/upgrade.mjs +0 -12
  355. package/src/cli/commands/vault.mjs +0 -9
  356. package/src/cli/commands/version.mjs +0 -22
  357. package/src/cli/first-run.mjs +0 -23
  358. package/src/cli/kernel.mjs +0 -239
  359. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  360. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  361. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  362. package/src/cli/mcp-targets/codex.mjs +0 -41
  363. package/src/cli/mcp-targets/shared.mjs +0 -61
  364. package/src/cli/messaging-platforms.mjs +0 -209
  365. package/src/cli/model-config.mjs +0 -70
  366. package/src/cli/operator-dispatch.mjs +0 -258
  367. package/src/cli/oracle-harness.py +0 -415
  368. package/src/cli/paths.mjs +0 -83
  369. package/src/cli/runtime.mjs +0 -351
  370. package/src/cli/setup-state.mjs +0 -168
  371. package/src/cli/spawn-child.mjs +0 -43
  372. package/src/data/catalog.mjs +0 -585
  373. package/src/data/desk-data.mjs +0 -695
  374. package/src/data/http.mjs +0 -253
  375. package/src/data/provider-endpoint.mjs +0 -94
  376. package/src/data/providers/aerodrome.mjs +0 -245
  377. package/src/data/providers/balancer.mjs +0 -209
  378. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  379. package/src/data/providers/bitcoin-meta.mjs +0 -378
  380. package/src/data/providers/blockscout.mjs +0 -14
  381. package/src/data/providers/bridges.mjs +0 -242
  382. package/src/data/providers/cowswap.mjs +0 -415
  383. package/src/data/providers/curve.mjs +0 -201
  384. package/src/data/providers/defillama.mjs +0 -88
  385. package/src/data/providers/dexscreener.mjs +0 -43
  386. package/src/data/providers/evm-rpc.mjs +0 -225
  387. package/src/data/providers/geckoterminal.mjs +0 -34
  388. package/src/data/providers/gmx.mjs +0 -496
  389. package/src/data/providers/hl-assets.mjs +0 -165
  390. package/src/data/providers/hl-info.mjs +0 -108
  391. package/src/data/providers/hl-markets.mjs +0 -210
  392. package/src/data/providers/hl-outcome.mjs +0 -61
  393. package/src/data/providers/hl-perps.mjs +0 -387
  394. package/src/data/providers/hl-staking.mjs +0 -353
  395. package/src/data/providers/hl-ws.mjs +0 -119
  396. package/src/data/providers/hyperevm-dex.mjs +0 -49
  397. package/src/data/providers/jupiter-venues.mjs +0 -119
  398. package/src/data/providers/jupiter.mjs +0 -315
  399. package/src/data/providers/lifi.mjs +0 -151
  400. package/src/data/providers/magiceden-sol.mjs +0 -406
  401. package/src/data/providers/morpho.mjs +0 -177
  402. package/src/data/providers/nft-gallery.mjs +0 -163
  403. package/src/data/providers/nft-portfolio.mjs +0 -494
  404. package/src/data/providers/odos.mjs +0 -156
  405. package/src/data/providers/oneinch.mjs +0 -174
  406. package/src/data/providers/opensea-multichain.mjs +0 -136
  407. package/src/data/providers/opensea-nft.mjs +0 -371
  408. package/src/data/providers/paraswap.mjs +0 -118
  409. package/src/data/providers/pendle.mjs +0 -188
  410. package/src/data/providers/poly-clob.mjs +0 -283
  411. package/src/data/providers/poly-public.mjs +0 -96
  412. package/src/data/providers/poly-ws.mjs +0 -103
  413. package/src/data/providers/portfolio-history.mjs +0 -394
  414. package/src/data/providers/portfolio.mjs +0 -594
  415. package/src/data/providers/rfq.mjs +0 -15
  416. package/src/data/providers/rh-agent.mjs +0 -59
  417. package/src/data/providers/satflow.mjs +0 -341
  418. package/src/data/providers/signed-material-guard.mjs +0 -108
  419. package/src/data/providers/solana-rpc.mjs +0 -197
  420. package/src/data/providers/uniswap-v3.mjs +0 -349
  421. package/src/data/providers/uniswap-v4.mjs +0 -414
  422. package/src/data/providers/zerox.mjs +0 -167
  423. package/src/data/public-api-scan.mjs +0 -61
  424. package/src/data/quote-placeholder.mjs +0 -31
  425. package/src/exact-integer.mjs +0 -72
  426. package/src/exec-policy.mjs +0 -455
  427. package/src/flags.mjs +0 -15
  428. package/src/fresh-window.mjs +0 -76
  429. package/src/gmx-attestation.mjs +0 -176
  430. package/src/index.mjs +0 -100
  431. package/src/nft-gas-war-guard.mjs +0 -139
  432. package/src/onboarding/agent-keys.mjs +0 -161
  433. package/src/onboarding/harness-configs.mjs +0 -102
  434. package/src/onboarding/index.mjs +0 -18
  435. package/src/onboarding/tiers.mjs +0 -139
  436. package/src/oracle-env.mjs +0 -47
  437. package/src/portfolio-risk.mjs +0 -170
  438. package/src/prepare-envelope.mjs +0 -204
  439. package/src/profile-upgrade.mjs +0 -277
  440. package/src/protocol-execution.mjs +0 -84
  441. package/src/protocol-templates/gate.mjs +0 -179
  442. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  443. package/src/public-api/buzz-integration.mjs +0 -256
  444. package/src/public-api/connect-agent.mjs +0 -416
  445. package/src/public-api/grants.mjs +0 -142
  446. package/src/public-api/http.mjs +0 -389
  447. package/src/public-control/aa-adapter.mjs +0 -402
  448. package/src/public-control/build-registry.mjs +0 -227
  449. package/src/public-control/bundler-client.mjs +0 -357
  450. package/src/public-control/grant-indexer.mjs +0 -296
  451. package/src/public-control/policy-render.mjs +0 -69
  452. package/src/public-control/policy-schema.mjs +0 -318
  453. package/src/public-control/runtime-config.mjs +0 -275
  454. package/src/public-control/session-key-model.mjs +0 -374
  455. package/src/public-control/session-orchestrator.mjs +0 -412
  456. package/src/rfq/intent.mjs +0 -180
  457. package/src/rfq/sources.mjs +0 -181
  458. package/src/route-attestation.mjs +0 -132
  459. package/src/router/best-execution.mjs +0 -326
  460. package/src/router/index.mjs +0 -226
  461. package/src/router/prepare-bridge.mjs +0 -289
  462. package/src/router/prepare-route.mjs +0 -398
  463. package/src/router/proposal.mjs +0 -311
  464. package/src/router/risk-classifier.mjs +0 -119
  465. package/src/router/route-sources.mjs +0 -364
  466. package/src/scanner/chains.config.mjs +0 -430
  467. package/src/scanner/contract.mjs +0 -270
  468. package/src/scanner/evm-scanner.mjs +0 -394
  469. package/src/scanner/index.mjs +0 -9
  470. package/src/scanner/v2-venue.mjs +0 -335
  471. package/src/scanner/v3-venue.mjs +0 -290
  472. package/src/scopes.mjs +0 -44
  473. package/src/sell-simulation.mjs +0 -167
  474. package/src/signals/engine.mjs +0 -146
  475. package/src/signals/index.mjs +0 -1
  476. package/src/token-transfer-guard.mjs +0 -188
  477. package/src/tui/app.mjs +0 -438
  478. package/src/tui/backend.mjs +0 -145
  479. package/src/tui/format.mjs +0 -272
  480. package/src/tui/gateway-client.mjs +0 -177
  481. package/src/tui/input.mjs +0 -501
  482. package/src/tui/renderer.mjs +0 -443
  483. package/src/tui/standalone-client.mjs +0 -666
  484. package/src/tui/theme.mjs +0 -81
  485. package/src/vault-attestation.mjs +0 -146
  486. package/src/venues.mjs +0 -206
  487. package/src/watch-preferences.mjs +0 -85
@@ -1,133 +0,0 @@
1
- # Public surface
2
-
3
- Every supported import subpath, executable, and runtime environment variable in
4
- `@oracle-agent/oracle`. If something is in `exports`/`bin` it is a public
5
- contract and belongs here; if it is not meant to be public it should be removed
6
- from the manifest rather than left undocumented.
7
-
8
- Generated counts are asserted by `test/public-surface-doc.test.mjs`, so this
9
- file cannot silently drift from `package.json`.
10
-
11
- ## Import subpaths
12
-
13
- | Subpath | What it gives you |
14
- |---|---|
15
- | `@oracle-agent/oracle` | package root — re-exports the common surface |
16
- | `@oracle-agent/oracle/data` | provider catalog + `dataCall` read plane |
17
- | `@oracle-agent/oracle/policy` | transaction policy: caps, allowlists, `enforceTxPolicy` |
18
- | `@oracle-agent/oracle/chains` | chain registry and per-chain metadata |
19
- | `@oracle-agent/oracle/scanner` | token/contract scanner capabilities |
20
- | `@oracle-agent/oracle/router` | route sources and quote routing |
21
- | `@oracle-agent/oracle/action-semantics` | decoded-action semantics for review |
22
- | `@oracle-agent/oracle/address-book` | label store — refuses key material |
23
- | `@oracle-agent/oracle/nft-gas-war` | NFT mint/gas-war helpers |
24
- | `@oracle-agent/oracle/prepare-envelope` | `stampPrepared` / `assertPreparedEnvelope` |
25
- | `@oracle-agent/oracle/connect` | wallet-connect request/assemble surface |
26
- | `@oracle-agent/oracle/receipts` | action receipts — refuses secret-bearing fields |
27
- | `@oracle-agent/oracle/risk` | risk scoring helpers |
28
- | `@oracle-agent/oracle/watch` | watch/alert subscriptions |
29
- | `@oracle-agent/oracle/signals` | signal feed helpers |
30
-
31
- `./package.json` is deliberately **not** exported. Do not derive internal paths
32
- with `require.resolve('@oracle-agent/oracle/package.json')` — it throws
33
- `ERR_PACKAGE_PATH_NOT_EXPORTED`. Invoke the shipped bins by name instead.
34
-
35
- ## Executables
36
-
37
- | Bin | Purpose |
38
- |---|---|
39
- | `oracle` | main CLI |
40
- | `oracle-data` | local read-plane server (`oracle data serve`) |
41
- | `oracle-public` | public-plane server (`oracle public serve`) |
42
- | `oracle-data-mcp` | MCP stdio server for agent lanes |
43
- | `oracle-init` | write config + attestation secret (`oracle init --apply`) |
44
- | `oracle-upgrade` | in-place upgrade helper (`oracle upgrade`) |
45
- | `oracle-scan` | scanner entrypoint |
46
- | `oracle-route` | route/quote entrypoint |
47
-
48
- ## Environment variables
49
-
50
- ### Arming flags — default OFF, enable only on literal `1`
51
-
52
- These are the gates that decide whether anything can ever be signed or
53
- broadcast. `envFlag` is strict: `true`, `yes`, `on`, or any other value leaves
54
- them OFF. Setting them is not sufficient to move funds — the signer's own
55
- policy and custody wall still apply.
56
-
57
- | Name | Default | Meaning |
58
- |---|---|---|
59
- | `ORACLE_EXECUTE_ENABLED` | off | allow the signing surface to arm at all |
60
- | `ORACLE_DEPLOY_ENABLED` | off | allow contract deployment paths to arm |
61
- | `ORACLE_ONBOARD_HTTP` | off | expose onboarding routes over HTTP |
62
- | `ORACLE_PUBLIC_API_MODE` | off | run the server in public-plane mode |
63
- | `ORACLE_ALLOW_CREATE` | off | allow create/deploy-shaped actions |
64
- | `ORACLE_ALLOW_EPHEMERAL_CAPS` | off | allow ephemeral cap grants |
65
-
66
- ### Guard rails — default ON, honor disable words
67
-
68
- | Name | Default | Meaning |
69
- |---|---|---|
70
- | `ORACLE_VALUE_CAPS_ENABLED` | on | per-transaction value caps. Uses strict `!== "0"` so a stray `false` leaves the cap wall standing |
71
-
72
- ### Integrity and attestation
73
-
74
- | Name | Meaning |
75
- |---|---|
76
- | `ORACLE_ROUTE_ATTESTATION_SECRET` | keyed route attestation HMAC. Written by `oracle init --apply` |
77
- | `MAD_ROUTE_ATTESTATION_SECRET` | legacy alias for the above |
78
- | `ORACLE_ATTESTATION_SECRET` | alternate attestation secret name |
79
- | `ORACLE_STAMP_HMAC_SECRET` | keyed MAC over prepared envelopes. A verifier holding this secret **requires** a valid MAC — an envelope with the MAC stripped is refused, so the keyed mode cannot be silently downgraded to the unkeyed checksum |
80
- | `ORACLE_STAMP_REQUIRE_MAC` | set `1` to require a MAC even when the verifier has no secret configured. With a secret set this is already implied |
81
- | `ORACLE_PREPARE_HARD_MAX_AGE_MS` | hard ceiling on prepared-envelope age |
82
-
83
- ### Servers and endpoints
84
-
85
- | Name | Default | Meaning |
86
- |---|---|---|
87
- | `ORACLE_DATA_HOST` | `127.0.0.1` | read-plane bind host (loopback enforced) |
88
- | `ORACLE_DATA_PORT` | `8787` | read-plane port |
89
- | `ORACLE_DATA_URL` | `http://127.0.0.1:8787` | where the CLI looks for the data server |
90
- | `ORACLE_PUBLIC_HOST` | `127.0.0.1` | public-plane bind host (loopback enforced) |
91
- | `ORACLE_PUBLIC_PORT` | — | public-plane port |
92
-
93
- The data server serves `/health`; `/` intentionally returns 404 with a route
94
- list.
95
-
96
- ### Paths and config
97
-
98
- | Name | Meaning |
99
- |---|---|
100
- | `ORACLE_CONFIG_DIR` | config directory (default `~/.config/oracle`) |
101
- | `ORACLE_EXEC_ENV_FILE` | path to `exec.env` |
102
- | `ORACLE_AGENT_KEYS_PATH` | agent key store path |
103
- | `ORACLE_AUTH_FILE_STORE` | auth file store path |
104
- | `ORACLE_ADDRESS_BOOK` | address-book path |
105
- | `ORACLE_OPERATOR_BIN_DIR` | operator binary directory |
106
- | `ORACLE_AUDIT_STREAM` | audit stream destination |
107
-
108
- ### Routing and defaults
109
-
110
- | Name | Meaning |
111
- |---|---|
112
- | `ORACLE_ALLOWED_CHAINS` | restrict routing to a chain allowlist |
113
- | `ORACLE_DEFAULT_ADDRESS` | default address for reads |
114
- | `ORACLE_PROFILE` | active profile name |
115
- | `ORACLE_PRIVY_APP_ID` | Privy app id for connect flows |
116
-
117
- ### Runtime integration
118
-
119
- | Name | Meaning |
120
- |---|---|
121
- | `ORACLE_HERMES_BIN` | path to the agent runtime binary |
122
- | `ORACLE_CLAUDE_CODE_VERSION` | pinned agent runtime version |
123
- | `ORACLE_PYTHON` / `ORACLE_UV_BIN` | interpreter overrides |
124
- | `ORACLE_NATIVE_TUI` / `ORACLE_FORCE_CHAT` / `ORACLE_PLAIN_HARNESS` | CLI presentation modes |
125
- | `ORACLE_NO_BOOTSTRAP` | skip bootstrap on start |
126
- | `ORACLE_CLI_DEBUG` | verbose CLI diagnostics |
127
-
128
- ### Test-only
129
-
130
- | Name | Meaning |
131
- |---|---|
132
- | `ORACLE_TEST_ISOLATE_SECRETS` | isolate secrets during tests |
133
- | `ORACLE_FAKE_HOME` | redirect `$HOME` during tests |
@@ -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}`);
@@ -1,38 +0,0 @@
1
- import assert from "node:assert/strict";
2
-
3
- // Minimal Oracle protocol pack. It prepares unsigned actions; it never receives
4
- // keys, signs, broadcasts, or claims that untrusted metadata is an instruction.
5
-
6
- export const provider = Object.freeze({
7
- id: "example-protocol",
8
- version: "1.0.0",
9
- chains: [8453],
10
- metadata: { source: "on-chain", trust: "untrusted-data" },
11
- });
12
-
13
- export function prepare(intent) {
14
- assert.ok(intent && provider.chains.includes(intent.chainId), "unsupported chain");
15
- return {
16
- kind: "unsigned-transaction",
17
- chainId: intent.chainId,
18
- transaction: { to: intent.to, data: intent.data ?? "0x", value: intent.value ?? "0" },
19
- receiptGate: { required: true, confirmations: 1, match: ["chainId", "transaction.to"] },
20
- };
21
- }
22
-
23
- export function decode(receipt) {
24
- assert.ok(receipt && typeof receipt.status !== "undefined", "receipt required");
25
- return { success: receipt.status === 1 || receipt.status === "0x1", transactionHash: receipt.transactionHash };
26
- }
27
-
28
- export const riskRules = Object.freeze([
29
- { id: "explicit-recipient", field: "transaction.to", required: true },
30
- { id: "receipt-before-success", field: "receiptGate.required", equals: true },
31
- ]);
32
-
33
- export const tests = Object.freeze({
34
- command: "node --test test/oracle-pack-standard.test.mjs",
35
- covers: ["prepare-is-unsigned", "decode-requires-receipt", "metadata-is-untrusted"],
36
- });
37
-
38
- export default Object.freeze({ provider, prepare, decode, riskRules, tests });
@@ -1,70 +0,0 @@
1
- // Example: research a token end to end, honestly.
2
- //
3
- // Run: node examples/research-a-token.mjs
4
- // node examples/research-a-token.mjs base 0x<address>
5
- //
6
- // Demonstrates the discipline the desk is built around: read the identity off the
7
- // chain, find pools with real liquidity, and report UNKNOWN where a check could not
8
- // run rather than letting silence read as approval.
9
-
10
- import { registerBuiltinScanners } from "../src/scanner/chains.config.mjs";
11
- import { getScanner, listScanners, EVIDENCE, RISK } from "../src/scanner/contract.mjs";
12
-
13
- registerBuiltinScanners();
14
-
15
- const chainRef = process.argv[2] || "base";
16
- // Base USDC by default -- a token whose answers are easy to sanity-check.
17
- const token = process.argv[3] || "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
18
-
19
- const scanner =
20
- listScanners().find((s) => s.key === chainRef) || getScanner(Number(chainRef));
21
- if (!scanner) {
22
- console.error(`unknown chain "${chainRef}"`);
23
- process.exit(1);
24
- }
25
-
26
- console.log(`chain: ${scanner.name} (${scanner.chainId})`);
27
- console.log(`token: ${token}\n`);
28
-
29
- // 1. Identity from the CONTRACT, not a token list. A list can be stale or omit a
30
- // two-hour-old launch, and the on-chain answer is what governs a transfer.
31
- const meta = await scanner.resolveToken(token);
32
- if (meta.evidence !== EVIDENCE.LIVE) {
33
- console.log(`identity: ${meta.evidence} -- ${meta.warning ?? meta.error}`);
34
- console.log("stopping: without ERC-20 metadata there is nothing to price.");
35
- process.exit(0);
36
- }
37
- console.log(`identity: ${meta.symbol} (${meta.name}), ${meta.decimals} decimals`);
38
-
39
- // 2. Pools, ranked by liquidity. Depth is what determines your fill; the headline
40
- // price is a fiction for anything but the smallest clip.
41
- const pools = await scanner.resolvePools(token);
42
- console.log(`\npools: ${pools.evidence}`);
43
- if (pools.reason) console.log(` ${pools.reason}`);
44
- for (const p of pools.pools.slice(0, 5)) {
45
- const liq = p.liquidityUsd == null ? "unknown" : `$${Math.round(p.liquidityUsd).toLocaleString()}`;
46
- console.log(` ${p.dex.padEnd(14)} ${liq.padStart(14)} ${p.pair}`);
47
- }
48
-
49
- // 3. Structural risk. Read the verdict AND the individual checks -- an overall
50
- // UNKNOWN often hides several passes plus one unprovable item, and which item is
51
- // unprovable is the decision-relevant part.
52
- const risk = await scanner.scoreRisk(token);
53
- console.log(`\nrisk verdict: ${risk.verdict}`);
54
- for (const c of risk.checks) {
55
- console.log(` ${c.result.padEnd(8)} ${c.check.padEnd(16)} ${c.detail ?? ""}`);
56
- }
57
-
58
- // 4. The honest close. UNKNOWN is not PASS, and a buy path is not an exit path.
59
- console.log("");
60
- if (risk.verdict === RISK.FAIL) {
61
- console.log("FAIL: disqualifying finding above. Do not trade.");
62
- } else if (risk.verdict === RISK.UNKNOWN) {
63
- console.log(
64
- "UNKNOWN is not PASS. Structural checks looked fine, but sellability is\n" +
65
- "unproven without a verified router on this chain. Until a round-trip sell\n" +
66
- "simulation succeeds, treat this token as not exitable.",
67
- );
68
- } else {
69
- console.log(`${risk.verdict}: structural checks only -- still not a recommendation.`);
70
- }
@@ -1,227 +0,0 @@
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
- # The address book is durable state a later send can be routed against, so
34
- # writes are owner-only. Reads stay open to the owner's own sessions.
35
- "address_book_remember": "owner_write",
36
- "address_book_forget": "owner_write",
37
- "address_book_list": "owner_read",
38
- "address_book_lookup": "owner_read",
39
- }
40
-
41
- _LEADING_INTENT = re.compile(
42
- r"^\s*(watch|ping|arm\s+confirm|arm|cancel|disarm|sign|send|execute)(?=$|[\s:,.!?;\-])",
43
- re.IGNORECASE,
44
- )
45
-
46
-
47
- def _config_path() -> Path:
48
- override = os.environ.get("ORACLE_CONFIG_DIR")
49
- root = Path(override).expanduser() if override else Path.home() / ".config" / "oracle"
50
- return root / "owner.json"
51
-
52
-
53
- def _read_config() -> Optional[Dict[str, Any]]:
54
- path = _config_path()
55
- try:
56
- if path.stat().st_mode & 0o077:
57
- return None
58
- value = json.loads(path.read_text(encoding="utf-8"))
59
- except (OSError, ValueError, TypeError):
60
- return None
61
- return value if isinstance(value, dict) else None
62
-
63
-
64
- def _strings(value: Any) -> set[str]:
65
- if isinstance(value, str):
66
- return {value.strip()} if value.strip() else set()
67
- if isinstance(value, (list, tuple, set)):
68
- return {str(item).strip() for item in value if str(item).strip()}
69
- return set()
70
-
71
-
72
- def _owner_ids(config: Dict[str, Any], platform: str) -> set[str]:
73
- """Accept the public flat form plus convenient per-platform mappings."""
74
- result = set()
75
- canonical = config.get("owner")
76
- if isinstance(canonical, str) and ":" in canonical:
77
- owner_platform, owner_id = canonical.split(":", 1)
78
- if owner_platform.strip().lower() == platform and owner_id.strip():
79
- result.add(owner_id.strip())
80
- for key in ("owner_ids", "ownerIds", "owners"):
81
- value = config.get(key)
82
- if isinstance(value, dict):
83
- result |= _strings(value.get(platform))
84
- result |= _strings(value.get("*"))
85
- else:
86
- result |= _strings(value)
87
- platforms = config.get("platforms")
88
- if isinstance(platforms, dict):
89
- entry = platforms.get(platform)
90
- if isinstance(entry, dict):
91
- result |= _strings(entry.get("owner_ids"))
92
- result |= _strings(entry.get("owners"))
93
- else:
94
- result |= _strings(entry)
95
- return result
96
-
97
-
98
- def _local_cli_allowed(config: Dict[str, Any]) -> bool:
99
- value = config.get("local_cli", config.get("localCli", config.get("allow_local_cli", False)))
100
- if isinstance(value, dict):
101
- value = value.get("allow", value.get("owner", value.get("enabled", False)))
102
- return value is True or (isinstance(value, str) and value.lower() in {"allow", "owner", "enabled", "true"})
103
-
104
-
105
- def _intent(raw_message: Any) -> str:
106
- if not isinstance(raw_message, str):
107
- return "none"
108
- match = _LEADING_INTENT.match(raw_message)
109
- if not match:
110
- return "none"
111
- command = " ".join(match.group(1).lower().split())
112
- if command in {"watch", "ping"}:
113
- return "alert_only"
114
- if command in {"arm", "arm confirm"}:
115
- return "execute"
116
- if command in {"cancel", "disarm"}:
117
- return "cancel"
118
- if command == "sign":
119
- return "sign"
120
- return "send"
121
-
122
-
123
- def _tool_class(tool_name: Any) -> Optional[str]:
124
- # MCP adapters use several separators. Collapsing all non-alphanumerics
125
- # lets us compare the authoritative suffix without trusting the prefix.
126
- normalized = re.sub(r"[^a-z0-9]+", "_", str(tool_name or "").lower()).strip("_")
127
- for suffix, tool_class in _PROTECTED.items():
128
- if normalized == suffix or normalized.endswith("_" + suffix):
129
- return tool_class
130
- return None
131
-
132
-
133
- def _identity(config: Optional[Dict[str, Any]], platform: str, sender_id: str) -> Tuple[bool, str]:
134
- if config is None:
135
- return False, "owner configuration is unavailable"
136
- platform = platform.strip().lower()
137
- sender_id = sender_id.strip()
138
- if platform in {"cli", "local", "terminal"}:
139
- if _local_cli_allowed(config):
140
- return True, ""
141
- return False, "local CLI is not authorized by owner policy"
142
- if not sender_id:
143
- return False, "gateway sender identity is missing"
144
- if sender_id not in _owner_ids(config, platform):
145
- return False, "sender is not an owner"
146
- return True, ""
147
-
148
-
149
- def _block(reason: str) -> Dict[str, str]:
150
- return {"action": "block", "message": "Oracle owner gate: " + reason + "."}
151
-
152
-
153
- def _on_pre_llm_call(
154
- session_id: str = "",
155
- sender_id: str = "",
156
- platform: str = "",
157
- user_message: Any = "",
158
- parent_session_id: str = "",
159
- **_: Any,
160
- ) -> None:
161
- """Snapshot only Hermes-trusted turn metadata and the original user input."""
162
- session_id = str(session_id or "").strip()
163
- if not session_id:
164
- return None
165
- _TURNS[session_id] = {
166
- "session_id": session_id,
167
- "parent_session_id": str(parent_session_id or "").strip(),
168
- "sender_id": str(sender_id or "").strip(),
169
- "platform": str(platform or "").strip().lower(),
170
- "raw_message": user_message if isinstance(user_message, str) else "",
171
- "intent": _intent(user_message),
172
- }
173
- _TURNS.move_to_end(session_id)
174
- while len(_TURNS) > _MAX_SESSIONS:
175
- _TURNS.popitem(last=False)
176
- return None
177
-
178
-
179
- def _on_pre_tool_call(tool_name: str = "", session_id: str = "", **_: Any) -> Optional[Dict[str, str]]:
180
- required = _tool_class(tool_name)
181
- if required is None:
182
- return None
183
- session_id = str(session_id or "").strip()
184
- turn = _TURNS.get(session_id)
185
- if turn is None:
186
- return _block("no trusted current-turn owner message exists for this session")
187
- if turn["parent_session_id"]:
188
- return _block("delegated and background sessions cannot execute or sign")
189
- allowed, reason = _identity(_read_config(), turn["platform"], turn["sender_id"])
190
- if not allowed:
191
- return _block(reason)
192
- if required == "owner_read":
193
- return None
194
- if required == "owner_write":
195
- # Owner-authenticated bookkeeping. It records a label; it does not move
196
- # value and does not need a leading execution verb like `arm`.
197
- return None
198
- intent = turn["intent"]
199
- if intent != required:
200
- labels = {
201
- "alert_only": "watch or ping",
202
- "execute": "arm",
203
- "cancel": "cancel or disarm",
204
- "sign": "sign",
205
- "send": "send or execute",
206
- }
207
- return _block(f"raw owner intent does not authorize {required}; start the message with {labels[required]}")
208
- return None
209
-
210
-
211
- def _on_session_end(session_id: str = "", **_: Any) -> None:
212
- _TURNS.pop(str(session_id or "").strip(), None)
213
-
214
-
215
- def _on_session_reset(session_id: str = "", **_: Any) -> None:
216
- session_id = str(session_id or "").strip()
217
- if session_id:
218
- _TURNS.pop(session_id, None)
219
- else:
220
- _TURNS.clear()
221
-
222
-
223
- def register(ctx: Any) -> None:
224
- ctx.register_hook("pre_llm_call", _on_pre_llm_call)
225
- ctx.register_hook("pre_tool_call", _on_pre_tool_call)
226
- ctx.register_hook("on_session_end", _on_session_end)
227
- ctx.register_hook("on_session_reset", _on_session_reset)
@@ -1,9 +0,0 @@
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
@@ -1,54 +0,0 @@
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.
@@ -1,22 +0,0 @@
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
- }
@@ -1,31 +0,0 @@
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.