@oracle-agent/oracle 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +66 -84
  3. package/SECURITY.md +37 -12
  4. package/SETUP.md +207 -272
  5. package/dist/action-receipts.mjs +1 -0
  6. package/dist/action-semantics.mjs +1 -0
  7. package/dist/address-book.mjs +2 -0
  8. package/dist/bin/desk-server.mjs +14 -0
  9. package/dist/bin/oracle-data-mcp.mjs +8 -0
  10. package/dist/bin/oracle-init.mjs +24 -0
  11. package/dist/bin/oracle-public-server.mjs +5 -0
  12. package/dist/bin/oracle-route.mjs +22 -0
  13. package/dist/bin/oracle-scan.mjs +18 -0
  14. package/dist/bin/oracle-upgrade.mjs +21 -0
  15. package/dist/bin/oracle.mjs +68 -0
  16. package/dist/chains.mjs +1 -0
  17. package/dist/cli/commands/auth.mjs +16 -0
  18. package/dist/cli/commands/bootstrap.mjs +18 -0
  19. package/dist/cli/commands/chain.mjs +21 -0
  20. package/dist/cli/commands/chat.mjs +35 -0
  21. package/dist/cli/commands/credential.mjs +1 -0
  22. package/dist/cli/commands/data-mcp.mjs +2 -0
  23. package/dist/cli/commands/data.mjs +12 -0
  24. package/dist/cli/commands/doctor.mjs +5 -0
  25. package/dist/cli/commands/gate.mjs +13 -0
  26. package/dist/cli/commands/help.mjs +1 -0
  27. package/dist/cli/commands/init.mjs +3 -0
  28. package/dist/cli/commands/mcp.mjs +33 -0
  29. package/dist/cli/commands/model.mjs +44 -0
  30. package/dist/cli/commands/prepare.mjs +2 -0
  31. package/dist/cli/commands/public.mjs +3 -0
  32. package/dist/cli/commands/route.mjs +2 -0
  33. package/dist/cli/commands/runner.mjs +1 -0
  34. package/dist/cli/commands/scan.mjs +2 -0
  35. package/dist/cli/commands/setup.mjs +34 -0
  36. package/dist/cli/commands/sign.mjs +4 -0
  37. package/dist/cli/commands/signer.mjs +1 -0
  38. package/dist/cli/commands/upgrade.mjs +2 -0
  39. package/dist/cli/commands/vault.mjs +1 -0
  40. package/dist/cli/commands/version.mjs +2 -0
  41. package/dist/data/desk-data.mjs +12 -0
  42. package/dist/index.mjs +17 -0
  43. package/dist/nft-gas-war-guard.mjs +1 -0
  44. package/dist/onboarding/harness-configs.mjs +4 -0
  45. package/dist/portfolio-risk.mjs +1 -0
  46. package/dist/prepare-envelope.mjs +1 -0
  47. package/dist/public-control/policy-schema.mjs +1 -0
  48. package/dist/router/index.mjs +2 -0
  49. package/dist/scanner/index.mjs +4 -0
  50. package/dist/signals/index.mjs +1 -0
  51. package/dist/watch-preferences.mjs +1 -0
  52. package/package.json +27 -65
  53. package/public/oracle-splash/index.html +11 -1
  54. package/CONTRIBUTING.md +0 -98
  55. package/bin/desk-server.mjs +0 -440
  56. package/bin/oracle-data-mcp.mjs +0 -1019
  57. package/bin/oracle-init.mjs +0 -496
  58. package/bin/oracle-public-server.mjs +0 -36
  59. package/bin/oracle-route.mjs +0 -254
  60. package/bin/oracle-scan.mjs +0 -192
  61. package/bin/oracle-upgrade.mjs +0 -42
  62. package/bin/oracle.mjs +0 -33
  63. package/docs/adding-a-chain.md +0 -229
  64. package/docs/architecture.md +0 -138
  65. package/docs/cli.md +0 -47
  66. package/docs/connectors.md +0 -13
  67. package/docs/oracle-pack-standard.md +0 -29
  68. package/docs/profiles.md +0 -151
  69. package/docs/public-surface.md +0 -133
  70. package/examples/add-a-chain.mjs +0 -65
  71. package/examples/oracle-pack-template.mjs +0 -38
  72. package/examples/research-a-token.mjs +0 -70
  73. package/plugins/oracle-owner-gate/__init__.py +0 -227
  74. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  75. package/profiles/_template/SOUL.md +0 -54
  76. package/profiles/_template/profile.json +0 -22
  77. package/profiles/bitcoin-agent/SOUL.md +0 -31
  78. package/profiles/bitcoin-agent/profile.json +0 -32
  79. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  80. package/profiles/hyperliquid-agent/profile.json +0 -37
  81. package/profiles/oracle/SOUL.md +0 -107
  82. package/profiles/oracle/profile.json +0 -39
  83. package/profiles/polymarket-agent/SOUL.md +0 -35
  84. package/profiles/polymarket-agent/profile.json +0 -34
  85. package/profiles/profile.schema.json +0 -90
  86. package/profiles/protocol-builder/SOUL.md +0 -57
  87. package/profiles/protocol-builder/profile.json +0 -39
  88. package/profiles/robinhood-agent/SOUL.md +0 -53
  89. package/profiles/robinhood-agent/profile.json +0 -40
  90. package/profiles/solana-agent/SOUL.md +0 -37
  91. package/profiles/solana-agent/profile.json +0 -37
  92. package/profiles/stable-agent/SOUL.md +0 -43
  93. package/profiles/stable-agent/profile.json +0 -37
  94. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  95. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  96. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  97. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  98. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  99. package/scripts/adversarial-bench.mjs +0 -114
  100. package/scripts/build-inscription.py +0 -230
  101. package/scripts/check-doc-drift.mjs +0 -123
  102. package/scripts/check-test-count.mjs +0 -105
  103. package/scripts/e2e-hl-markets.mjs +0 -21
  104. package/scripts/e2e-hl-perps.mjs +0 -48
  105. package/scripts/e2e-hypercore-staking.mjs +0 -128
  106. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  107. package/scripts/protocol-template-gate.mjs +0 -15
  108. package/scripts/public-api-scan.mjs +0 -23
  109. package/scripts/secret-scan.mjs +0 -181
  110. package/scripts/verify-v3-venues.mjs +0 -192
  111. package/skills/balance/SKILL.md +0 -176
  112. package/skills/oracle-action-semantics/SKILL.md +0 -40
  113. package/skills/oracle-best-execution/SKILL.md +0 -127
  114. package/skills/oracle-bitcoin/SKILL.md +0 -53
  115. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  116. package/skills/oracle-chat/SKILL.md +0 -61
  117. package/skills/oracle-chat/chain.SKILL.md +0 -31
  118. package/skills/oracle-chat/setup.SKILL.md +0 -37
  119. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  120. package/skills/oracle-contract-research/SKILL.md +0 -55
  121. package/skills/oracle-desk/SKILL.md +0 -58
  122. package/skills/oracle-dex-launch/SKILL.md +0 -38
  123. package/skills/oracle-grants/SKILL.md +0 -69
  124. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  125. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  126. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  127. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  128. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  129. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  130. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  131. package/skills/oracle-polymarket/SKILL.md +0 -60
  132. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  133. package/skills/oracle-protocol-security/SKILL.md +0 -60
  134. package/skills/oracle-public-product/SKILL.md +0 -44
  135. package/skills/oracle-receipts/SKILL.md +0 -52
  136. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  137. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  138. package/skills/oracle-solana/SKILL.md +0 -65
  139. package/skills/oracle-solana-nft/SKILL.md +0 -54
  140. package/skills/oracle-token-research/SKILL.md +0 -67
  141. package/skins/oracle.yaml +0 -56
  142. package/src/action-receipts.mjs +0 -265
  143. package/src/action-semantics.mjs +0 -62
  144. package/src/address-book.mjs +0 -208
  145. package/src/agent-auth.mjs +0 -206
  146. package/src/approval-guard.mjs +0 -282
  147. package/src/attestation-secret.mjs +0 -88
  148. package/src/audit-log.mjs +0 -196
  149. package/src/auth/oauth.mjs +0 -672
  150. package/src/auto-slippage.mjs +0 -378
  151. package/src/capability-posture.mjs +0 -125
  152. package/src/chains.mjs +0 -62
  153. package/src/cli/chain-catalog.mjs +0 -215
  154. package/src/cli/chain-state.mjs +0 -74
  155. package/src/cli/commands/auth.mjs +0 -193
  156. package/src/cli/commands/bootstrap.mjs +0 -87
  157. package/src/cli/commands/chain.mjs +0 -143
  158. package/src/cli/commands/chat.mjs +0 -434
  159. package/src/cli/commands/credential.mjs +0 -9
  160. package/src/cli/commands/data-mcp.mjs +0 -18
  161. package/src/cli/commands/data.mjs +0 -75
  162. package/src/cli/commands/doctor.mjs +0 -136
  163. package/src/cli/commands/help.mjs +0 -7
  164. package/src/cli/commands/init.mjs +0 -27
  165. package/src/cli/commands/mcp.mjs +0 -142
  166. package/src/cli/commands/model.mjs +0 -99
  167. package/src/cli/commands/prepare.mjs +0 -12
  168. package/src/cli/commands/public.mjs +0 -20
  169. package/src/cli/commands/route.mjs +0 -12
  170. package/src/cli/commands/runner.mjs +0 -9
  171. package/src/cli/commands/scan.mjs +0 -12
  172. package/src/cli/commands/setup.mjs +0 -275
  173. package/src/cli/commands/sign.mjs +0 -21
  174. package/src/cli/commands/signer.mjs +0 -9
  175. package/src/cli/commands/upgrade.mjs +0 -12
  176. package/src/cli/commands/vault.mjs +0 -9
  177. package/src/cli/commands/version.mjs +0 -22
  178. package/src/cli/first-run.mjs +0 -23
  179. package/src/cli/kernel.mjs +0 -239
  180. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  181. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  182. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  183. package/src/cli/mcp-targets/codex.mjs +0 -41
  184. package/src/cli/mcp-targets/shared.mjs +0 -61
  185. package/src/cli/messaging-platforms.mjs +0 -209
  186. package/src/cli/model-config.mjs +0 -70
  187. package/src/cli/operator-dispatch.mjs +0 -258
  188. package/src/cli/oracle-harness.py +0 -415
  189. package/src/cli/paths.mjs +0 -83
  190. package/src/cli/runtime.mjs +0 -351
  191. package/src/cli/setup-state.mjs +0 -168
  192. package/src/cli/spawn-child.mjs +0 -43
  193. package/src/data/catalog.mjs +0 -585
  194. package/src/data/desk-data.mjs +0 -695
  195. package/src/data/http.mjs +0 -253
  196. package/src/data/provider-endpoint.mjs +0 -94
  197. package/src/data/providers/aerodrome.mjs +0 -245
  198. package/src/data/providers/balancer.mjs +0 -209
  199. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  200. package/src/data/providers/bitcoin-meta.mjs +0 -378
  201. package/src/data/providers/blockscout.mjs +0 -14
  202. package/src/data/providers/bridges.mjs +0 -242
  203. package/src/data/providers/cowswap.mjs +0 -415
  204. package/src/data/providers/curve.mjs +0 -201
  205. package/src/data/providers/defillama.mjs +0 -88
  206. package/src/data/providers/dexscreener.mjs +0 -43
  207. package/src/data/providers/evm-rpc.mjs +0 -225
  208. package/src/data/providers/geckoterminal.mjs +0 -34
  209. package/src/data/providers/gmx.mjs +0 -496
  210. package/src/data/providers/hl-assets.mjs +0 -165
  211. package/src/data/providers/hl-info.mjs +0 -108
  212. package/src/data/providers/hl-markets.mjs +0 -210
  213. package/src/data/providers/hl-outcome.mjs +0 -61
  214. package/src/data/providers/hl-perps.mjs +0 -387
  215. package/src/data/providers/hl-staking.mjs +0 -353
  216. package/src/data/providers/hl-ws.mjs +0 -119
  217. package/src/data/providers/hyperevm-dex.mjs +0 -49
  218. package/src/data/providers/jupiter-venues.mjs +0 -119
  219. package/src/data/providers/jupiter.mjs +0 -315
  220. package/src/data/providers/lifi.mjs +0 -151
  221. package/src/data/providers/magiceden-sol.mjs +0 -406
  222. package/src/data/providers/morpho.mjs +0 -177
  223. package/src/data/providers/nft-gallery.mjs +0 -163
  224. package/src/data/providers/nft-portfolio.mjs +0 -494
  225. package/src/data/providers/odos.mjs +0 -156
  226. package/src/data/providers/oneinch.mjs +0 -174
  227. package/src/data/providers/opensea-multichain.mjs +0 -136
  228. package/src/data/providers/opensea-nft.mjs +0 -371
  229. package/src/data/providers/paraswap.mjs +0 -118
  230. package/src/data/providers/pendle.mjs +0 -188
  231. package/src/data/providers/poly-clob.mjs +0 -283
  232. package/src/data/providers/poly-public.mjs +0 -96
  233. package/src/data/providers/poly-ws.mjs +0 -103
  234. package/src/data/providers/portfolio-history.mjs +0 -394
  235. package/src/data/providers/portfolio.mjs +0 -594
  236. package/src/data/providers/rfq.mjs +0 -15
  237. package/src/data/providers/rh-agent.mjs +0 -59
  238. package/src/data/providers/satflow.mjs +0 -341
  239. package/src/data/providers/signed-material-guard.mjs +0 -108
  240. package/src/data/providers/solana-rpc.mjs +0 -197
  241. package/src/data/providers/uniswap-v3.mjs +0 -349
  242. package/src/data/providers/uniswap-v4.mjs +0 -414
  243. package/src/data/providers/zerox.mjs +0 -167
  244. package/src/data/public-api-scan.mjs +0 -61
  245. package/src/data/quote-placeholder.mjs +0 -31
  246. package/src/exact-integer.mjs +0 -72
  247. package/src/exec-policy.mjs +0 -455
  248. package/src/flags.mjs +0 -15
  249. package/src/fresh-window.mjs +0 -76
  250. package/src/gmx-attestation.mjs +0 -176
  251. package/src/index.mjs +0 -100
  252. package/src/nft-gas-war-guard.mjs +0 -139
  253. package/src/onboarding/agent-keys.mjs +0 -161
  254. package/src/onboarding/harness-configs.mjs +0 -102
  255. package/src/onboarding/index.mjs +0 -18
  256. package/src/onboarding/tiers.mjs +0 -139
  257. package/src/oracle-env.mjs +0 -47
  258. package/src/portfolio-risk.mjs +0 -170
  259. package/src/prepare-envelope.mjs +0 -204
  260. package/src/profile-upgrade.mjs +0 -277
  261. package/src/protocol-execution.mjs +0 -84
  262. package/src/protocol-templates/gate.mjs +0 -179
  263. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  264. package/src/public-api/buzz-integration.mjs +0 -256
  265. package/src/public-api/connect-agent.mjs +0 -416
  266. package/src/public-api/grants.mjs +0 -142
  267. package/src/public-api/http.mjs +0 -389
  268. package/src/public-control/aa-adapter.mjs +0 -402
  269. package/src/public-control/build-registry.mjs +0 -227
  270. package/src/public-control/bundler-client.mjs +0 -357
  271. package/src/public-control/grant-indexer.mjs +0 -296
  272. package/src/public-control/policy-render.mjs +0 -69
  273. package/src/public-control/policy-schema.mjs +0 -318
  274. package/src/public-control/runtime-config.mjs +0 -275
  275. package/src/public-control/session-key-model.mjs +0 -374
  276. package/src/public-control/session-orchestrator.mjs +0 -412
  277. package/src/rfq/intent.mjs +0 -180
  278. package/src/rfq/sources.mjs +0 -181
  279. package/src/route-attestation.mjs +0 -132
  280. package/src/router/best-execution.mjs +0 -326
  281. package/src/router/index.mjs +0 -226
  282. package/src/router/prepare-bridge.mjs +0 -289
  283. package/src/router/prepare-route.mjs +0 -398
  284. package/src/router/proposal.mjs +0 -311
  285. package/src/router/risk-classifier.mjs +0 -119
  286. package/src/router/route-sources.mjs +0 -364
  287. package/src/scanner/chains.config.mjs +0 -430
  288. package/src/scanner/contract.mjs +0 -270
  289. package/src/scanner/evm-scanner.mjs +0 -394
  290. package/src/scanner/index.mjs +0 -9
  291. package/src/scanner/v2-venue.mjs +0 -335
  292. package/src/scanner/v3-venue.mjs +0 -290
  293. package/src/scopes.mjs +0 -44
  294. package/src/sell-simulation.mjs +0 -167
  295. package/src/signals/engine.mjs +0 -146
  296. package/src/signals/index.mjs +0 -1
  297. package/src/token-transfer-guard.mjs +0 -188
  298. package/src/tui/app.mjs +0 -438
  299. package/src/tui/backend.mjs +0 -145
  300. package/src/tui/format.mjs +0 -272
  301. package/src/tui/gateway-client.mjs +0 -177
  302. package/src/tui/input.mjs +0 -501
  303. package/src/tui/renderer.mjs +0 -443
  304. package/src/tui/standalone-client.mjs +0 -666
  305. package/src/tui/theme.mjs +0 -81
  306. package/src/vault-attestation.mjs +0 -146
  307. package/src/venues.mjs +0 -206
  308. package/src/watch-preferences.mjs +0 -85
@@ -1,27 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import path from "node:path";
3
- import { renderNextSteps } from "../first-run.mjs";
4
-
5
- export default {
6
- name: "init",
7
- summary: "install agent lanes + read plane (dry-run by default)",
8
- group: "read",
9
- usage: "oracle init [--apply --force --only <lane> --json --yes]",
10
- async run(ctx) {
11
- const argv = [...ctx.argv];
12
- if (argv.includes("--yes") && !argv.includes("--apply")) argv.push("--apply");
13
- const bin = path.join(ctx.root, "bin", "oracle-init.mjs");
14
- const r = spawnSync(process.execPath, [bin, ...argv], { encoding: "utf8", env: process.env });
15
- if (r.error) {
16
- process.stderr.write(`oracle: failed to spawn oracle-init: ${r.error.message}\n`);
17
- return 1;
18
- }
19
- if (r.stdout) process.stdout.write(r.stdout);
20
- if (r.stderr) process.stderr.write(r.stderr);
21
- const code = typeof r.status === "number" ? r.status : 1;
22
- if (code === 0 && argv.includes("--apply") && !argv.includes("--json")) {
23
- process.stdout.write(renderNextSteps());
24
- }
25
- return code;
26
- },
27
- };
@@ -1,142 +0,0 @@
1
- import { parseArgs } from "node:util";
2
- import { printOperatorNotInstalled } from "../operator-dispatch.mjs";
3
- import { installClaudeCode } from "../mcp-targets/claude-code.mjs";
4
- import { installClaudeDesktop } from "../mcp-targets/claude-desktop.mjs";
5
- import { installCodex } from "../mcp-targets/codex.mjs";
6
- import { installChatgpt } from "../mcp-targets/chatgpt.mjs";
7
- import { buildServerSpecs } from "../mcp-targets/shared.mjs";
8
-
9
- function usage() {
10
- process.stderr.write(
11
- "usage: oracle mcp <install|print> [target] [flags]\n" +
12
- " targets: claude-code | claude-desktop | codex | chatgpt | generic\n" +
13
- " flags: --with-control --project --print --json\n",
14
- );
15
- }
16
-
17
- function emitResult(result, { json = false } = {}) {
18
- if (result.print && !result.instructions) {
19
- process.stdout.write(JSON.stringify(result.print, null, 2) + "\n");
20
- } else if (result.printText) {
21
- process.stdout.write(result.printText);
22
- }
23
- if (result.instructions) {
24
- process.stdout.write(result.instructions + "\n");
25
- if (result.print && json) process.stdout.write(JSON.stringify(result.print, null, 2) + "\n");
26
- }
27
- if (!result.print && !result.printText && !result.instructions) {
28
- const line = {
29
- status: result.status,
30
- path: result.path || null,
31
- backup: result.backup || null,
32
- method: result.method || null,
33
- };
34
- process.stdout.write(
35
- (json ? JSON.stringify(line, null, 2) : `${line.status}${line.path ? " " + line.path : ""}`) + "\n",
36
- );
37
- }
38
- }
39
-
40
- export default {
41
- name: "mcp",
42
- summary: "wire Oracle into AI clients",
43
- group: "read",
44
- usage: "oracle mcp install <target> | oracle mcp print [--target <t>]",
45
- async run(ctx) {
46
- const verb = ctx.argv[0];
47
- if (!verb || verb === "--help" || verb === "-h") {
48
- usage();
49
- return verb ? 0 : 1;
50
- }
51
-
52
- let values, positionals;
53
- try {
54
- ({ values, positionals } = parseArgs({
55
- args: ctx.argv.slice(1),
56
- options: {
57
- "with-control": { type: "boolean", default: false },
58
- project: { type: "boolean", default: false },
59
- print: { type: "boolean", default: false },
60
- json: { type: "boolean", default: false },
61
- target: { type: "string" },
62
- },
63
- allowPositionals: true,
64
- strict: false,
65
- }));
66
- } catch (err) {
67
- process.stderr.write(`oracle mcp: ${err.message}\n`);
68
- usage();
69
- return 1;
70
- }
71
-
72
- const withControl = !!values["with-control"];
73
- const project = !!values.project;
74
- const json = !!values.json;
75
- const operator = ctx.resolveOperator ? ctx.resolveOperator() : { ok: false };
76
-
77
- if (withControl && (!operator || !operator.ok)) {
78
- printOperatorNotInstalled(process.stderr);
79
- return 3;
80
- }
81
-
82
- const opts = { oracleRoot: ctx.root, operator, withControl, project, cwd: process.cwd() };
83
-
84
- if (verb === "print") {
85
- const target = values.target || positionals[0] || "claude-code";
86
- if (target === "generic" || target === "claude-code") {
87
- const built = buildServerSpecs(opts);
88
- if (!built.ok) { printOperatorNotInstalled(process.stderr); return 3; }
89
- process.stdout.write(JSON.stringify({ mcpServers: built.specs }, null, 2) + "\n");
90
- return 0;
91
- }
92
- if (target === "chatgpt") {
93
- const r = await installChatgpt({ printOnly: true });
94
- emitResult(r, { json });
95
- return 0;
96
- }
97
- if (target === "codex") {
98
- emitResult(await installCodex({ ...opts, printOnly: true }), { json });
99
- return 0;
100
- }
101
- if (target === "claude-desktop") {
102
- emitResult(await installClaudeDesktop({ ...opts, printOnly: true }), { json });
103
- return 0;
104
- }
105
- process.stderr.write(`oracle mcp: unknown target '${target}'\n`);
106
- return 1;
107
- }
108
-
109
- if (verb === "install") {
110
- const target = positionals[0] || values.target;
111
- if (!target) { usage(); return 1; }
112
- const printOnly = !!values.print;
113
- let result;
114
- if (target === "claude-code") result = await installClaudeCode({ ...opts, printOnly });
115
- else if (target === "claude-desktop") result = await installClaudeDesktop({ ...opts, printOnly });
116
- else if (target === "codex") result = await installCodex({ ...opts, printOnly });
117
- else if (target === "chatgpt") result = await installChatgpt({ printOnly });
118
- else if (target === "generic") {
119
- const built = buildServerSpecs(opts);
120
- if (!built.ok) { printOperatorNotInstalled(process.stderr); return 3; }
121
- process.stdout.write(JSON.stringify({ mcpServers: built.specs }, null, 2) + "\n");
122
- return 0;
123
- } else {
124
- process.stderr.write(`oracle mcp: unknown target '${target}'\n`);
125
- return 1;
126
- }
127
- if (!result.ok) {
128
- if (result.code === 3) printOperatorNotInstalled(process.stderr);
129
- else process.stderr.write(`oracle mcp: ${result.reason || "failed"}\n`);
130
- return result.code || 1;
131
- }
132
- emitResult(result, { json });
133
- if (result.status && String(result.status).startsWith("printed") && result.print) {
134
- process.stdout.write(JSON.stringify(result.print, null, 2) + "\n");
135
- }
136
- return 0;
137
- }
138
-
139
- usage();
140
- return 1;
141
- },
142
- };
@@ -1,99 +0,0 @@
1
- import { spawnChild } from "../spawn-child.mjs";
2
- import { resolveHermes } from "../runtime.mjs";
3
- import { readModelConfig, writeModelConfig } from "../model-config.mjs";
4
- import { oracleHarnessInvocation } from "./chat.mjs";
5
-
6
- function option(args, name) {
7
- const index = args.indexOf(name);
8
- return index >= 0 && args[index + 1] ? args[index + 1] : null;
9
- }
10
-
11
- function standalonePatch(args) {
12
- const backend = option(args, "--backend");
13
- const provider = option(args, "--provider");
14
- const model = option(args, "--model") || option(args, "-m");
15
- const baseUrl = option(args, "--base-url");
16
- const apiKeyEnv = option(args, "--api-key-env");
17
- const contextLength = option(args, "--context-length");
18
- const reasoningEffort = option(args, "--reasoning-effort");
19
- const hasStandaloneField = Boolean(provider || model || baseUrl || apiKeyEnv || contextLength || reasoningEffort);
20
- if (!backend && !hasStandaloneField) return null;
21
- const current = { ...(readModelConfig() || {}) };
22
- if (provider) {
23
- delete current.apiKeyEnv;
24
- if (provider !== "custom" || provider !== current.provider) delete current.baseUrl;
25
- }
26
- return {
27
- ...current,
28
- backend: backend || "standalone",
29
- ...(provider ? { provider } : {}),
30
- ...(model ? { model } : {}),
31
- ...(baseUrl ? { baseUrl } : {}),
32
- ...(apiKeyEnv ? { apiKeyEnv } : {}),
33
- ...(contextLength ? { contextLength } : {}),
34
- ...(reasoningEffort ? { reasoningEffort } : {}),
35
- };
36
- }
37
-
38
- function usage() {
39
- return [
40
- "oracle model, choose standalone model settings or open Hermes' picker",
41
- "",
42
- " oracle model",
43
- " oracle model --show",
44
- " oracle model --backend standalone --provider openrouter --model openrouter/auto",
45
- " oracle model --backend auto",
46
- "",
47
- "standalone keys stay in environment variables, never model.json:",
48
- " OPENROUTER_API_KEY, OPENAI_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY",
49
- ].join("\n");
50
- }
51
-
52
- export default {
53
- name: "model",
54
- summary: "choose Oracle's standalone model or existing Hermes provider",
55
- group: "read",
56
- usage: usage(),
57
- async run(ctx) {
58
- const args = [...ctx.argv];
59
- if (args.includes("--show")) {
60
- process.stdout.write(`${JSON.stringify(readModelConfig() || { backend: "auto" }, null, 2)}\n`);
61
- return 0;
62
- }
63
-
64
- const patch = standalonePatch(args);
65
- if (patch) {
66
- try {
67
- const saved = writeModelConfig(patch);
68
- process.stdout.write(`oracle model: ${saved.backend}`);
69
- if (saved.provider) process.stdout.write(` / ${saved.provider}`);
70
- if (saved.model) process.stdout.write(` / ${saved.model}`);
71
- process.stdout.write("\n");
72
- if (saved.backend === "standalone" && saved.apiKeyEnv) {
73
- process.stdout.write(`key source: ${saved.apiKeyEnv}\n`);
74
- }
75
- return 0;
76
- } catch (error) {
77
- process.stderr.write(`oracle model: ${error.message}\n`);
78
- return 1;
79
- }
80
- }
81
-
82
- const found = resolveHermes();
83
- if (!found.ok) {
84
- process.stderr.write(
85
- "Oracle standalone chat does not require Hermes.\n" +
86
- "Configure a provider with: oracle model --backend standalone --provider openrouter --model openrouter/auto\n" +
87
- "Then set OPENROUTER_API_KEY.\n",
88
- );
89
- return 1;
90
- }
91
- const launch = oracleHarnessInvocation(found.bin, ["-p", "oracle", "model", ...args]);
92
- return spawnChild(
93
- launch.command,
94
- launch.args,
95
- { stdio: "inherit", env: process.env },
96
- "oracle-model",
97
- );
98
- },
99
- };
@@ -1,12 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import path from "node:path";
3
- export default {
4
- name: "prepare", summary: "build an unsigned swap (alias of route prepare)", group: "read",
5
- usage: "oracle prepare <chain> <tokenIn> <tokenOut> <taker> [amt]",
6
- async run(ctx) {
7
- const bin = path.join(ctx.root, "bin", "oracle-route.mjs");
8
- const r = spawnSync(process.execPath, [bin, "prepare", ...ctx.argv], { stdio: "inherit" });
9
- if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}\n`); return 1; }
10
- return typeof r.status === "number" ? r.status : 1;
11
- },
12
- };
@@ -1,20 +0,0 @@
1
- import path from "node:path";
2
- import { parseArgs } from "node:util";
3
- import { spawnChild } from "../spawn-child.mjs";
4
- export default {
5
- name: "public", summary: "secret-free public HTTP surface", group: "read",
6
- usage: "oracle public serve [--port N]",
7
- async run(ctx) {
8
- const verb = ctx.argv[0] || "serve";
9
- if (verb !== "serve") { process.stderr.write("usage: oracle public serve [--port N]\n"); return 1; }
10
- let port = null;
11
- try {
12
- const { values } = parseArgs({ args: ctx.argv.slice(1), options: { port: { type: "string" } }, allowPositionals: true, strict: false });
13
- port = values.port || null;
14
- } catch {}
15
- const env = { ...process.env };
16
- if (port) env.ORACLE_PUBLIC_PORT = String(port);
17
- const bin = path.join(ctx.root, "bin", "oracle-public-server.mjs");
18
- return spawnChild(process.execPath, [bin], { stdio: "inherit", env }, "oracle-public-server");
19
- },
20
- };
@@ -1,12 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import path from "node:path";
3
- export default {
4
- name: "route", summary: "swap/bridge prepare helpers", group: "read",
5
- usage: "oracle route <swap|bridge|prepare|prepare-bridge> ...",
6
- async run(ctx) {
7
- const bin = path.join(ctx.root, "bin", "oracle-route.mjs");
8
- const r = spawnSync(process.execPath, [bin, ...ctx.argv], { stdio: "inherit" });
9
- if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}\n`); return 1; }
10
- return typeof r.status === "number" ? r.status : 1;
11
- },
12
- };
@@ -1,9 +0,0 @@
1
- export default {
2
- name: "runner",
3
- summary: "action runner daemon",
4
- group: "sign",
5
- usage: "oracle runner [--interval-ms N ...]",
6
- async run(ctx) {
7
- return ctx.dispatchOperator("oracle-runner", ctx.argv, { appendHintOnError: true });
8
- },
9
- };
@@ -1,12 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import path from "node:path";
3
- export default {
4
- name: "scan", summary: "chain scanner", group: "read",
5
- usage: "oracle scan <chains|head|token|pools|risk|quote|sell> ...",
6
- async run(ctx) {
7
- const bin = path.join(ctx.root, "bin", "oracle-scan.mjs");
8
- const r = spawnSync(process.execPath, [bin, ...ctx.argv], { stdio: "inherit" });
9
- if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-scan: ${r.error.message}\n`); return 1; }
10
- return typeof r.status === "number" ? r.status : 1;
11
- },
12
- };
@@ -1,275 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import readline from "node:readline/promises";
3
- import { stdin as input, stdout as output } from "node:process";
4
- import {
5
- findMessagingPlatform,
6
- listMessagingPlatforms,
7
- renderSetupMenu,
8
- } from "../messaging-platforms.mjs";
9
- import {
10
- platformStatus,
11
- renderStatus,
12
- setPlatformToken,
13
- touchSetupState,
14
- } from "../setup-state.mjs";
15
- import { hermesRoot } from "../paths.mjs";
16
- import { installManagedHermes, resolveHermes } from "../runtime.mjs";
17
-
18
- function usage() {
19
- return [
20
- "oracle setup — wire messaging + local agent surface",
21
- "",
22
- " oracle setup menu + platform status",
23
- " oracle setup status same, machine-friendly with --json",
24
- " oracle setup messaging open hermes gateway setup wizard",
25
- " oracle setup telegram set TELEGRAM_BOT_TOKEN for profile",
26
- " oracle setup discord set DISCORD_BOT_TOKEN for profile",
27
- " oracle setup slack set slack tokens",
28
- " oracle setup <platform> any supported hermes platform",
29
- " oracle setup gateway [status|restart|start|stop]",
30
- " oracle setup profile [name] default: oracle",
31
- "",
32
- "chat:",
33
- " /setup",
34
- " /setup telegram",
35
- " /setup status",
36
- "",
37
- "tokens stay local in ~/.hermes/profiles/<profile>/.env",
38
- "oracle never prints secrets.",
39
- ].join("\n");
40
- }
41
-
42
- function profileFromArgs(args) {
43
- const i = args.indexOf("--profile");
44
- if (i >= 0 && args[i + 1]) return args[i + 1];
45
- const j = args.indexOf("-p");
46
- if (j >= 0 && args[j + 1]) return args[j + 1];
47
- return process.env.ORACLE_PROFILE || "oracle";
48
- }
49
-
50
- function stripProfileArgs(args) {
51
- const out = [];
52
- for (let i = 0; i < args.length; i++) {
53
- if (args[i] === "--profile" || args[i] === "-p") {
54
- i += 1;
55
- continue;
56
- }
57
- out.push(args[i]);
58
- }
59
- return out;
60
- }
61
-
62
- function runHermes(argv, { inherit = true, env = process.env } = {}) {
63
- let resolved = resolveHermes();
64
- if (!resolved.ok && process.stdin.isTTY && process.stdout.isTTY && process.env.ORACLE_NO_BOOTSTRAP !== "1") {
65
- process.stdout.write("setting up oracle's local messaging runtime (one time)\n\n");
66
- const installed = installManagedHermes();
67
- if (installed.ok) resolved = { ok: true, bin: installed.bin };
68
- }
69
- if (!resolved.ok) {
70
- process.stderr.write("oracle setup needs the local runtime\nrun: oracle bootstrap\n");
71
- return 1;
72
- }
73
- const r = spawnSync(resolved.bin, argv, {
74
- stdio: inherit ? "inherit" : "pipe",
75
- encoding: "utf8",
76
- env,
77
- });
78
- if (r.error) {
79
- process.stderr.write(`oracle setup: failed to run hermes: ${r.error.message}\n`);
80
- return 1;
81
- }
82
- if (!inherit) {
83
- if (r.stdout) process.stdout.write(r.stdout);
84
- if (r.stderr) process.stderr.write(r.stderr);
85
- }
86
- return typeof r.status === "number" ? r.status : 1;
87
- }
88
-
89
- async function promptSecret(label) {
90
- if (!process.stdin.isTTY) {
91
- const err = new Error("interactive token entry requires a tty");
92
- err.code = "NO_TTY";
93
- throw err;
94
- }
95
- const rl = readline.createInterface({ input, output });
96
- try {
97
- // readline cannot hide input portably without raw mode; still avoid echo by
98
- // asking user to paste and not logging it ourselves.
99
- const value = (await rl.question(`${label}: `)).trim();
100
- return value;
101
- } finally {
102
- rl.close();
103
- }
104
- }
105
-
106
- async function configurePlatform(profile, platformKey, inlineArgs = []) {
107
- const platform = findMessagingPlatform(platformKey);
108
- if (!platform) {
109
- process.stderr.write(`oracle setup: unknown platform '${platformKey}'\n`);
110
- process.stderr.write(
111
- `known: ${listMessagingPlatforms()
112
- .map((p) => p.key)
113
- .join(", ")}\n`,
114
- );
115
- return 1;
116
- }
117
-
118
- // Platforms without simple token keys go through Hermes interactive setup.
119
- if (!platform.required.length) {
120
- process.stdout.write(
121
- `opening hermes setup for ${platform.key} (interactive)\n`,
122
- );
123
- touchSetupState({ lastPlatform: platform.key, profile });
124
- return runHermes(["-p", profile, ...(platform.hermes || ["gateway", "setup"])]);
125
- }
126
-
127
- const flags = {};
128
- const positionals = [];
129
- for (let i = 0; i < inlineArgs.length; i++) {
130
- const a = inlineArgs[i];
131
- if (a === "--token" && inlineArgs[i + 1]) {
132
- flags.token = inlineArgs[++i];
133
- continue;
134
- }
135
- if (a === "--allowed-users" && inlineArgs[i + 1]) {
136
- flags.allowedUsers = inlineArgs[++i];
137
- continue;
138
- }
139
- if (a === "--app-token" && inlineArgs[i + 1]) {
140
- flags.appToken = inlineArgs[++i];
141
- continue;
142
- }
143
- if (a.startsWith("-")) {
144
- process.stderr.write(`oracle setup: unknown flag ${a}\n`);
145
- return 1;
146
- }
147
- positionals.push(a);
148
- }
149
-
150
- let token = flags.token || positionals[0] || "";
151
- if (!token) {
152
- try {
153
- token = await promptSecret(`${platform.key} bot token`);
154
- } catch (err) {
155
- if (err?.code === "NO_TTY") {
156
- process.stderr.write(
157
- `oracle setup ${platform.key}: pass --token <value> in non-interactive mode\n`,
158
- );
159
- return 1;
160
- }
161
- throw err;
162
- }
163
- }
164
- if (!token) {
165
- process.stderr.write("aborted: empty token\n");
166
- return 1;
167
- }
168
-
169
- const extra = {};
170
- if (flags.allowedUsers) {
171
- if (platform.key === "telegram") extra.TELEGRAM_ALLOWED_USERS = flags.allowedUsers;
172
- if (platform.key === "discord") extra.DISCORD_ALLOWED_USERS = flags.allowedUsers;
173
- if (platform.key === "slack") extra.SLACK_ALLOWED_USERS = flags.allowedUsers;
174
- }
175
- if (flags.appToken && platform.key === "slack") {
176
- extra.SLACK_APP_TOKEN = flags.appToken;
177
- }
178
-
179
- // Slack needs two tokens.
180
- if (platform.key === "slack" && !extra.SLACK_APP_TOKEN) {
181
- let app = flags.appToken || positionals[1] || "";
182
- if (!app && process.stdin.isTTY) {
183
- app = await promptSecret("slack app token (xapp-...)");
184
- }
185
- if (!app) {
186
- process.stderr.write("slack needs bot token + app token\n");
187
- return 1;
188
- }
189
- extra.SLACK_APP_TOKEN = app;
190
- }
191
-
192
- try {
193
- const result = setPlatformToken(profile, platform.key, token, extra);
194
- touchSetupState({ lastPlatform: platform.key, profile, ready: true });
195
- process.stdout.write(
196
- `saved ${platform.key} credentials for profile '${profile}'\n` +
197
- `path: ${result.path}\n` +
198
- `next: oracle setup gateway restart\n`,
199
- );
200
- return 0;
201
- } catch (err) {
202
- process.stderr.write(`oracle setup: ${err.message}\n`);
203
- return 1;
204
- }
205
- }
206
-
207
- export default {
208
- name: "setup",
209
- summary: "configure telegram/discord/slack messaging platforms",
210
- group: "read",
211
- usage: usage(),
212
- async run(ctx) {
213
- const args = [...ctx.argv];
214
- const json = args.includes("--json");
215
- const profile = profileFromArgs(args);
216
- const clean = stripProfileArgs(args).filter((a) => a !== "--json");
217
- const verb = (clean[0] || "menu").toLowerCase();
218
- const rest = clean.slice(1);
219
-
220
- if (["-h", "--help", "help"].includes(verb)) {
221
- process.stdout.write(usage() + "\n");
222
- return 0;
223
- }
224
-
225
- if (["menu", "list", "ls"].includes(verb)) {
226
- if (json) {
227
- process.stdout.write(JSON.stringify(platformStatus(profile), null, 2) + "\n");
228
- } else {
229
- process.stdout.write(renderStatus(profile));
230
- }
231
- return 0;
232
- }
233
-
234
- if (["status", "show"].includes(verb)) {
235
- const st = platformStatus(profile);
236
- if (json) {
237
- process.stdout.write(JSON.stringify(st, null, 2) + "\n");
238
- } else {
239
- process.stdout.write(renderStatus(profile));
240
- process.stdout.write(`hermes root: ${hermesRoot()}\n`);
241
- }
242
- return 0;
243
- }
244
-
245
- if (["messaging", "gateway-setup", "platforms"].includes(verb)) {
246
- touchSetupState({ lastAction: "messaging", profile });
247
- process.stdout.write("opening hermes gateway setup wizard...\n");
248
- return runHermes(["-p", profile, "gateway", "setup"]);
249
- }
250
-
251
- if (verb === "gateway") {
252
- const action = (rest[0] || "status").toLowerCase();
253
- if (!["status", "start", "stop", "restart", "run", "install"].includes(action)) {
254
- process.stderr.write("usage: oracle setup gateway [status|start|stop|restart|run|install]\n");
255
- return 1;
256
- }
257
- return runHermes(["-p", profile, "gateway", action]);
258
- }
259
-
260
- if (verb === "profile") {
261
- const name = rest[0] || profile;
262
- process.stdout.write(`profile: ${name}\nhermes: ${hermesRoot()}/profiles/${name}\n`);
263
- process.stdout.write(renderStatus(name));
264
- return 0;
265
- }
266
-
267
- // oracle setup telegram|discord|...
268
- if (findMessagingPlatform(verb)) {
269
- return configurePlatform(profile, verb, rest);
270
- }
271
-
272
- process.stderr.write(`oracle setup: unknown verb '${verb}'\n${usage()}\n`);
273
- return 1;
274
- },
275
- };
@@ -1,21 +0,0 @@
1
- export default {
2
- name: "sign",
3
- summary: "provision / check the local signer (opt-in)",
4
- group: "sign",
5
- usage: "oracle sign <init|doctor> ...",
6
- async run(ctx) {
7
- const verb = ctx.argv[0];
8
- if (verb === "init") {
9
- return ctx.dispatchOperator("oracle-agentic-init", ctx.argv.slice(1), { appendHintOnError: true });
10
- }
11
- if (verb === "doctor") {
12
- return ctx.dispatchOperator("oracle-agentic-doctor", ctx.argv.slice(1), { appendHintOnError: true });
13
- }
14
- process.stderr.write(
15
- "usage: oracle sign <init|doctor> ...\n" +
16
- " oracle sign init provision keys + policy (interactive)\n" +
17
- " oracle sign doctor check local signer readiness\n",
18
- );
19
- return 1;
20
- },
21
- };
@@ -1,9 +0,0 @@
1
- export default {
2
- name: "signer",
3
- summary: "loopback signer daemon",
4
- group: "sign",
5
- usage: "oracle signer [--port N ...]",
6
- async run(ctx) {
7
- return ctx.dispatchOperator("oracle-signer", ctx.argv, { appendHintOnError: true });
8
- },
9
- };
@@ -1,12 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import path from "node:path";
3
- export default {
4
- name: "upgrade", summary: "upgrade installed Hermes lanes", group: "read",
5
- usage: "oracle upgrade [--apply ...]",
6
- async run(ctx) {
7
- const bin = path.join(ctx.root, "bin", "oracle-upgrade.mjs");
8
- const r = spawnSync(process.execPath, [bin, ...ctx.argv], { stdio: "inherit" });
9
- if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-upgrade: ${r.error.message}\n`); return 1; }
10
- return typeof r.status === "number" ? r.status : 1;
11
- },
12
- };
@@ -1,9 +0,0 @@
1
- export default {
2
- name: "vault",
3
- summary: "encrypt local key files at rest",
4
- group: "sign",
5
- usage: "oracle vault <encrypt|rekey|inspect|decrypt> ...",
6
- async run(ctx) {
7
- return ctx.dispatchOperator("oracle-vault", ctx.argv, { appendHintOnError: true });
8
- },
9
- };