@oracle-agent/oracle 0.4.2 → 0.6.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 (129) hide show
  1. package/README.md +76 -18
  2. package/SETUP.md +13 -0
  3. package/bin/oracle-data-mcp.mjs +1 -1
  4. package/bin/oracle.mjs +33 -0
  5. package/docs/cli.md +47 -0
  6. package/docs/connectors.md +13 -0
  7. package/package.json +6 -2
  8. package/profiles/oracle/SOUL.md +10 -4
  9. package/profiles/robinhood-agent/SOUL.md +5 -3
  10. package/protocols/templates/safe-erc20/README.md +9 -0
  11. package/public/agent-connect/app.js +16 -13
  12. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  13. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  14. package/public/oracle-splash/assets/llms/claude.svg +1 -0
  15. package/public/oracle-splash/assets/llms/codex.svg +1 -0
  16. package/public/oracle-splash/assets/llms/cursor.svg +17 -0
  17. package/public/oracle-splash/assets/llms/deepseek.svg +1 -0
  18. package/public/oracle-splash/assets/llms/gemini.svg +1 -0
  19. package/public/oracle-splash/assets/llms/grok.svg +8 -0
  20. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  21. package/public/oracle-splash/assets/llms/kimi.svg +1 -0
  22. package/public/oracle-splash/assets/llms/manus.svg +18 -0
  23. package/public/oracle-splash/assets/llms/openclaw.svg +22 -0
  24. package/public/oracle-splash/assets/llms/perplexity.svg +1 -0
  25. package/public/oracle-splash/assets/llms/qwen.svg +1 -0
  26. package/public/oracle-splash/assets/llms/windsurf.svg +1 -0
  27. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  28. package/public/oracle-splash/assets/protocols/across.png +0 -0
  29. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  30. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  31. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  32. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  33. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  34. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  35. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  36. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  37. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  38. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  39. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  40. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  41. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  42. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  43. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  44. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  45. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  46. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  47. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  48. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  49. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  50. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  51. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  52. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  53. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  54. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  55. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  56. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  57. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  58. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  59. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  60. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  61. package/public/oracle-splash/assets/wordmarks/across.svg +4 -0
  62. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +23 -0
  63. package/public/oracle-splash/assets/wordmarks/balancer.svg +3 -0
  64. package/public/oracle-splash/assets/wordmarks/cowswap.svg +1 -0
  65. package/public/oracle-splash/assets/wordmarks/gmx.svg +13 -0
  66. package/public/oracle-splash/assets/wordmarks/hyena.svg +7 -0
  67. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +21 -0
  68. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +13 -0
  69. package/public/oracle-splash/assets/wordmarks/jupiter.svg +35 -0
  70. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  71. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +1 -0
  72. package/public/oracle-splash/assets/wordmarks/morpho.svg +1 -0
  73. package/public/oracle-splash/assets/wordmarks/odos.svg +3 -0
  74. package/public/oracle-splash/assets/wordmarks/oneinch.svg +6 -0
  75. package/public/oracle-splash/assets/wordmarks/opensea.svg +1 -0
  76. package/public/oracle-splash/assets/wordmarks/outcome.svg +16 -0
  77. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +18 -0
  78. package/public/oracle-splash/assets/wordmarks/paraswap.svg +16 -0
  79. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  80. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  81. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  82. package/public/oracle-splash/assets/wordmarks/relay.svg +8 -0
  83. package/public/oracle-splash/assets/wordmarks/stargate.svg +15 -0
  84. package/public/oracle-splash/assets/wordmarks/uniswap.svg +18 -0
  85. package/public/oracle-splash/assets/wordmarks/velodrome.svg +84 -0
  86. package/public/oracle-splash/assets/wordmarks/xyz.svg +12 -0
  87. package/public/oracle-splash/index.html +784 -498
  88. package/scripts/check-doc-drift.mjs +111 -0
  89. package/skills/oracle-chat/SKILL.md +61 -0
  90. package/skills/oracle-chat/chain.SKILL.md +31 -0
  91. package/skills/oracle-chat/setup.SKILL.md +37 -0
  92. package/skins/oracle.yaml +52 -0
  93. package/src/cli/chain-catalog.mjs +215 -0
  94. package/src/cli/chain-state.mjs +74 -0
  95. package/src/cli/commands/chain.mjs +143 -0
  96. package/src/cli/commands/chat.mjs +268 -0
  97. package/src/cli/commands/credential.mjs +9 -0
  98. package/src/cli/commands/data-mcp.mjs +18 -0
  99. package/src/cli/commands/data.mjs +73 -0
  100. package/src/cli/commands/doctor.mjs +131 -0
  101. package/src/cli/commands/help.mjs +7 -0
  102. package/src/cli/commands/init.mjs +27 -0
  103. package/src/cli/commands/mcp.mjs +142 -0
  104. package/src/cli/commands/model.mjs +37 -0
  105. package/src/cli/commands/prepare.mjs +12 -0
  106. package/src/cli/commands/public.mjs +20 -0
  107. package/src/cli/commands/route.mjs +12 -0
  108. package/src/cli/commands/runner.mjs +9 -0
  109. package/src/cli/commands/scan.mjs +12 -0
  110. package/src/cli/commands/setup.mjs +283 -0
  111. package/src/cli/commands/sign.mjs +21 -0
  112. package/src/cli/commands/signer.mjs +9 -0
  113. package/src/cli/commands/upgrade.mjs +12 -0
  114. package/src/cli/commands/vault.mjs +9 -0
  115. package/src/cli/commands/version.mjs +22 -0
  116. package/src/cli/first-run.mjs +23 -0
  117. package/src/cli/kernel.mjs +237 -0
  118. package/src/cli/mcp-targets/chatgpt.mjs +51 -0
  119. package/src/cli/mcp-targets/claude-code.mjs +39 -0
  120. package/src/cli/mcp-targets/claude-desktop.mjs +24 -0
  121. package/src/cli/mcp-targets/codex.mjs +41 -0
  122. package/src/cli/mcp-targets/shared.mjs +61 -0
  123. package/src/cli/messaging-platforms.mjs +209 -0
  124. package/src/cli/operator-dispatch.mjs +258 -0
  125. package/src/cli/oracle-harness.py +148 -0
  126. package/src/cli/paths.mjs +83 -0
  127. package/src/cli/setup-state.mjs +168 -0
  128. package/src/cli/spawn-child.mjs +43 -0
  129. package/src/public-api/connect-agent.mjs +29 -10
@@ -53,6 +53,18 @@ export class SecretLeakError extends Error {
53
53
  const FORBIDDEN_KEY_RE =
54
54
  /(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i;
55
55
 
56
+ /** Short wallet-export aliases need exact normalized matching. Substring
57
+ * matching `wif`, for example, would incorrectly reject an unrelated key such
58
+ * as `swift`. Removing common separators catches snake/kebab/spaced variants
59
+ * without widening those short aliases into arbitrary words. */
60
+ const FORBIDDEN_KEY_ALIASES = Object.freeze(["privkey", "wif", "xprv", "seed"]);
61
+
62
+ function isForbiddenKeyName(key) {
63
+ const text = String(key);
64
+ const normalized = text.toLowerCase().replace(/[\s._-]+/g, "");
65
+ return FORBIDDEN_KEY_RE.test(text) || FORBIDDEN_KEY_ALIASES.includes(normalized);
66
+ }
67
+
56
68
  /** String-value shapes that must never appear in any object we return. */
57
69
  const FORBIDDEN_VALUE_RULES = Object.freeze([
58
70
  // 32-byte hex — the shape of a raw EVM private key / session secret. Public
@@ -69,8 +81,12 @@ const FORBIDDEN_VALUE_RULES = Object.freeze([
69
81
  // gets disabled. Smuggling a key inside a longer string is still caught at
70
82
  // the serialized layer for any non-allowlisted field.
71
83
  { rule: "raw-32-byte-hex-bare", re: /^[0-9a-fA-F]{64}$/ },
72
- // Bitcoin WIF (mainnet 5/K/L, testnet c) — base58, 51-52 chars.
73
- { rule: "bitcoin-wif", re: /\b[5KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/ },
84
+ // BIP-32 private extended keys. Public xpub/tpub/ypub/zpub identifiers are
85
+ // intentionally not matched; only their private-key counterparts fail.
86
+ { rule: "extended-private-key", re: /\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/ },
87
+ // Bitcoin WIF (mainnet 5/K/L, testnet uncompressed 9 or compressed c) —
88
+ // base58, 51-52 chars.
89
+ { rule: "bitcoin-wif", re: /\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/ },
74
90
  // BIP-39 mnemonic: 12/15/18/21/24 lowercase words. Detect a long run of
75
91
  // space-separated short alpha words rather than shipping the wordlist.
76
92
  { rule: "bip39-mnemonic", re: /\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/ },
@@ -169,12 +185,15 @@ export function assertSerializedNoSecrets(value) {
169
185
  if (embedded.test(scanned)) {
170
186
  throw new SecretLeakError("$<serialized>", "raw-32-byte-hex-embedded");
171
187
  }
172
- // Key names are checked against the serialized text too, so a key smuggled
173
- // in via toJSON or a getter is still caught.
174
- const keyHit = scanned.match(
175
- /"([^"]*(?:private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url)[^"]*)"\s*:/i
176
- );
177
- if (keyHit) throw new SecretLeakError(`$<serialized>.${keyHit[1]}`, "forbidden-key-name");
188
+ // Parse the exact serialized bytes with a reviver so escaped or toJSON-made
189
+ // key names receive the same normalization as real object properties. This
190
+ // avoids maintaining a second, inevitably drifting key-name regex.
191
+ JSON.parse(json, (key, item) => {
192
+ if (key && isForbiddenKeyName(key)) {
193
+ throw new SecretLeakError(`$<serialized>.${key}`, "forbidden-key-name");
194
+ }
195
+ return item;
196
+ });
178
197
  return json;
179
198
  }
180
199
 
@@ -207,7 +226,7 @@ export function assertNoSecretMaterial(value, path = "$", seen = new Set(), keyH
207
226
  if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) return value;
208
227
  if (value instanceof Map) {
209
228
  for (const [k, v] of value.entries()) {
210
- if (typeof k === "string" && FORBIDDEN_KEY_RE.test(k)) {
229
+ if (typeof k === "string" && isForbiddenKeyName(k)) {
211
230
  throw new SecretLeakError(`${path}[${JSON.stringify(k)}]`, "forbidden-key-name");
212
231
  }
213
232
  assertNoSecretMaterial(k, `${path}[key]`, seen);
@@ -225,7 +244,7 @@ export function assertNoSecretMaterial(value, path = "$", seen = new Set(), keyH
225
244
  return value;
226
245
  }
227
246
  for (const [k, v] of Object.entries(value)) {
228
- if (FORBIDDEN_KEY_RE.test(k)) {
247
+ if (isForbiddenKeyName(k)) {
229
248
  throw new SecretLeakError(`${path}.${k}`, "forbidden-key-name");
230
249
  }
231
250
  assertNoSecretMaterial(v, `${path}.${k}`, seen, k);