@oracle-agent/oracle 0.24.1 → 0.24.2
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.
- package/dist/assets/skills/chain/SKILL.md +34 -0
- package/dist/assets/skills/chain-defi-ecosystem-analysis/SKILL.md +181 -0
- package/dist/assets/skills/chain-ecosystem-gap-analysis/SKILL.md +162 -0
- package/dist/assets/skills/cross-chain-twap-execution/SKILL.md +125 -0
- package/dist/assets/skills/defi-protocol-pmf-assessment/SKILL.md +332 -0
- package/dist/assets/skills/evm-contract-research.md +8 -3
- package/dist/assets/skills/multi-venue-prepare-only-ranking/SKILL.md +93 -0
- package/dist/assets/skills/oracle-access-control/SKILL.md +71 -0
- package/dist/assets/skills/oracle-action-arming/SKILL.md +99 -0
- package/dist/assets/skills/oracle-airdrop-calculator/SKILL.md +111 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +341 -0
- package/dist/assets/skills/oracle-evm/SKILL.md +55 -0
- package/dist/assets/skills/oracle-harness/SKILL.md +41 -0
- package/dist/assets/skills/oracle-mcp-install/SKILL.md +140 -0
- package/dist/assets/skills/oracle-multichain-convert/SKILL.md +87 -0
- package/dist/assets/skills/oracle-native-harness/SKILL.md +32 -0
- package/dist/assets/skills/oracle-ownership-gate/SKILL.md +42 -0
- package/dist/assets/skills/oracle-public-product-ux/SKILL.md +114 -0
- package/dist/assets/skills/oracle-tailscale/SKILL.md +32 -0
- package/dist/assets/skills/oracle-thin-client/SKILL.md +47 -0
- package/dist/assets/skills/perp-venue-funding-research/SKILL.md +161 -0
- package/dist/assets/skills/polymarket/SKILL.md +160 -0
- package/dist/assets/skills/protocol-api-key-integration/SKILL.md +141 -0
- package/dist/assets/skills/self-custodial-onchain-execution/SKILL.md +1284 -0
- package/dist/assets/skills/setup/SKILL.md +40 -0
- package/dist/assets/skills/stable-launch-ops/SKILL.md +89 -0
- package/dist/assets/skills/trade-loop-circuit-breaker/SKILL.md +441 -0
- package/dist/assets/skills/venue-capability-boundaries/SKILL.md +32 -0
- package/dist/bin/desk-server.mjs +16 -16
- package/dist/bin/oracle-data-mcp.mjs +1 -1
- package/dist/bin/oracle-equities.mjs +1 -1
- package/dist/bin/oracle-init.mjs +9 -9
- package/dist/cli/commands/bootstrap.mjs +1 -1
- package/dist/cli/commands/chat.mjs +78 -77
- package/dist/cli/commands/doctor.mjs +8 -6
- package/dist/cli/commands/eval.mjs +1 -1
- package/dist/cli/commands/harness.mjs +6 -6
- package/dist/cli/commands/model.mjs +82 -81
- package/dist/cli/commands/receipt.mjs +5 -0
- package/dist/cli/commands/setup.mjs +1 -1
- package/dist/cli/commands/venues.mjs +3 -0
- package/dist/cli/commands/watch.mjs +16 -0
- package/dist/equities/index.mjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-mcp-install
|
|
3
|
+
description: Use when installing Oracle as an MCP server in AI clients.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Oracle MCP install
|
|
10
|
+
|
|
11
|
+
## Quick start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
oracle bootstrap
|
|
15
|
+
oracle init --apply # generates wallet, starts services
|
|
16
|
+
oracle mcp install claude-code --with-soul
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Public MCP is **data + prepare** only:
|
|
20
|
+
|
|
21
|
+
| Server | Purpose |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `oracle-data` | Read prices, quotes, routes, prepare unsigned tx |
|
|
24
|
+
|
|
25
|
+
Signing stays on the user's machine (`oracle sign` / loopback signer). Do not wire a remote control/exec MCP from this public skill.
|
|
26
|
+
|
|
27
|
+
`--with-soul` injects the Oracle SOUL.md as system instructions so Claude/Cursor/etc.
|
|
28
|
+
think like Oracle — same routing logic, chain laws, safety gates.
|
|
29
|
+
|
|
30
|
+
**Target-specific behavior:**
|
|
31
|
+
|
|
32
|
+
| Target | Method | File written |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `claude-code` | Prepends SOUL before existing CLAUDE.md | `./CLAUDE.md` |
|
|
35
|
+
| `claude-desktop` | Prepends SOUL to customInstructions in config | `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
36
|
+
| `cursor` | Prepends SOUL before existing .cursorrules | `./.cursorrules` |
|
|
37
|
+
| `vscode` | Writes SOUL to Copilot instructions | `./.vscode/instructions.md` |
|
|
38
|
+
| `codex` / `copilot` | Writes SOUL to Copilot instructions | `./.github/copilot-instructions.md` |
|
|
39
|
+
| `chatgpt` | Not supported (returns ok:false) | — |
|
|
40
|
+
|
|
41
|
+
All paths prepend the SOUL before existing content (preserves user's existing rules).
|
|
42
|
+
On dry-run (`--print`), shows the first 500 chars of what would be written.
|
|
43
|
+
|
|
44
|
+
## Standalone gateway (no Hermes)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
oracle setup telegram # bot token → Grammy poller
|
|
48
|
+
oracle setup discord # bot token → discord.js
|
|
49
|
+
oracle setup whatsapp # QR code scan → whatsapp-web.js (auto-installs deps)
|
|
50
|
+
oracle setup signal # signal-cli (stub)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Oracle polls messaging APIs directly — no Hermes gateway required. All platforms
|
|
54
|
+
share one process (`oracle gateway` on port 9270), using Oracle's own agent runtime.
|
|
55
|
+
Auto-detects Hermes/OpenClaw and uses whichever is available; falls back to
|
|
56
|
+
Oracle standalone polling if neither is present.
|
|
57
|
+
|
|
58
|
+
For WhatsApp: first run auto-installs `whatsapp-web.js` + `qrcode-terminal`,
|
|
59
|
+
shows a QR code for pairing. Session persists in `~/.config/oracle/.wwebjs_auth`.
|
|
60
|
+
|
|
61
|
+
## Supported targets
|
|
62
|
+
|
|
63
|
+
| Command | Target config | Method |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `oracle mcp install claude-code` | `~/.claude.json` | `claude mcp add-json` CLI, fallback: mergeMcpServers |
|
|
66
|
+
| `oracle mcp install claude-desktop` | Claude Desktop config | mergeMcpServers |
|
|
67
|
+
| `oracle mcp install chatgpt` | ChatGPT connector | Custom installer |
|
|
68
|
+
| `oracle mcp install codex` | OpenAI Codex CLI | Config file merge |
|
|
69
|
+
| `oracle mcp install copilot` | *(alias for codex)* | Same as codex |
|
|
70
|
+
| `oracle mcp install cursor` | `~/.config/cursor/mcp.json` | mergeMcpServers (Linux), platform-aware path |
|
|
71
|
+
| `oracle mcp install vscode` | `.vscode/mcp.json` or global | mergeMcpServers (`--project` for workspace) |
|
|
72
|
+
|
|
73
|
+
## Flags
|
|
74
|
+
|
|
75
|
+
| Flag | Effect |
|
|
76
|
+
|---|---|
|
|
77
|
+
| `--with-soul` | Injects Oracle SOUL.md into the harness as system instructions |
|
|
78
|
+
| `--project` | VS Code: writes to workspace `.vscode/mcp.json` instead of global |
|
|
79
|
+
| `--print` | Dry-run: shows what would be written, makes no changes |
|
|
80
|
+
| `--json` | Machine-readable output for install results |
|
|
81
|
+
|
|
82
|
+
## Watchdog
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
oracle mcp watchdog # background: checks every 2m, warns if MCP servers down
|
|
86
|
+
oracle mcp watchdog --once # one-shot health check
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Wallet setup
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
oracle init --apply # generates fresh wallet at ~/.config/oracle/keys/evm.json (0600)
|
|
93
|
+
oracle sign import # interactive: paste existing private key (hidden input)
|
|
94
|
+
oracle sign import --keyfile <path> # import from file (auto-shreds temp file after import)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Both `oracle sign import` paths **auto-arm** — importing a key sets `ORACLE_EXEC_ENABLED=1`
|
|
98
|
+
in `~/.config/oracle/exec.env`. No separate `oracle exec arm` step needed.
|
|
99
|
+
The intent is the signal: pasting a private key means the user wants to trade immediately.
|
|
100
|
+
|
|
101
|
+
**Rationale:** The user explicitly chose to import their private key and wire the exec MCP.
|
|
102
|
+
Adding a mandatory \"arm\" step on top is unnecessary friction. Import = armed.
|
|
103
|
+
|
|
104
|
+
**Safety boundary:** The key never leaves the local machine. Oracle's wallet is like a
|
|
105
|
+
CLI-native MetaMask — key on disk at 0600, MCP process local to the machine, same trust model.
|
|
106
|
+
|
|
107
|
+
The interactive prompt reassures users:
|
|
108
|
+
```
|
|
109
|
+
Your key stays local — Oracle never sends it anywhere.
|
|
110
|
+
Paste your EVM private key (0x...):
|
|
111
|
+
>
|
|
112
|
+
```
|
|
113
|
+
Key goes to stdin, never to shell history. Saved at 0600 permissions.
|
|
114
|
+
|
|
115
|
+
Never use `echo "0xKEY"` or `--key 0x...` — private keys must never hit shell history.
|
|
116
|
+
|
|
117
|
+
## Print mode
|
|
118
|
+
```
|
|
119
|
+
oracle mcp print claude-code → shows JSON without writing
|
|
120
|
+
oracle mcp print --target cursor → same for any target
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Autofill behavior
|
|
124
|
+
Every target auto-detects the user's config, merges Oracle's MCP server specs
|
|
125
|
+
(`oracle-data`), backs up the original with
|
|
126
|
+
`.bak-oracle-<timestamp>`, and reports the result. No manual JSON required.
|
|
127
|
+
|
|
128
|
+
## Adding a new target
|
|
129
|
+
1. Create `src/cli/mcp-targets/<name>.mjs`
|
|
130
|
+
2. Export `install<Name>({ oracleRoot, operator, withControl, project, printOnly, cwd })`
|
|
131
|
+
3. Import `buildServerSpecs`, `mergeMcpServers`, `report` from `./shared.mjs`
|
|
132
|
+
4. Import in `src/cli/commands/mcp.mjs`
|
|
133
|
+
5. Add to the install switch and `usage()` text
|
|
134
|
+
|
|
135
|
+
## Pitfalls
|
|
136
|
+
- `ORACLE_DESK_URL` is not used for MCP — the spec points at the local binary
|
|
137
|
+
- Cursor/VS Code paths differ by OS
|
|
138
|
+
- VS Code `--project` writes workspace `.vscode/mcp.json`, not global
|
|
139
|
+
- After adding a target, verify `oracle mcp print --target <name>` on the installed binary
|
|
140
|
+
- Signing is local. Do not document a remote control/exec MCP in the public pack
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-multichain-convert
|
|
3
|
+
description: "Use for Oracle any-asset convert (ChangeNOW/deBridge)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Oracle multichain convert
|
|
10
|
+
|
|
11
|
+
User-facing and desk convert across **any asset** without agent custody.
|
|
12
|
+
|
|
13
|
+
## When to load
|
|
14
|
+
- BTC → ETH / any CEXy pair
|
|
15
|
+
- SOL ↔ EVM
|
|
16
|
+
- “Is there an alternative to ChangeNOW?”
|
|
17
|
+
- Public Oracle convert product
|
|
18
|
+
- Wiring `CHANGENOW_API_KEY` or deBridge prepare
|
|
19
|
+
|
|
20
|
+
## Rails (shipped in multiagent-desk)
|
|
21
|
+
|
|
22
|
+
| Rail | Best for | Key | User action |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| **deBridge DLN** | SOL↔EVM, EVM↔EVM | None | Sign unsigned tx |
|
|
25
|
+
| **ChangeNOW** | BTC L1, long-tail (~1.3k tickers) | Free partner key | Send to deposit address |
|
|
26
|
+
| **Desk DEX/bridges** | EVM already covered | Usually none | Sign/prepare per venue |
|
|
27
|
+
|
|
28
|
+
## Convert router (single entry)
|
|
29
|
+
- Code: `src/router/convert-route.mjs`
|
|
30
|
+
- Desk: `data.oracle.routing.convert` / `convertQuote` / `convertPrepare`
|
|
31
|
+
- Prefer: BTC/long-tail → ChangeNOW; EVM/Sol → **deBridge**
|
|
32
|
+
- Always `executionReady: false`, public-safe
|
|
33
|
+
- Docs: `docs/CONVERT_ROUTER.md`
|
|
34
|
+
- Tests: `test/convert-route.test.mjs`
|
|
35
|
+
|
|
36
|
+
```js
|
|
37
|
+
await data.oracle.routing.convertQuote({
|
|
38
|
+
from: { currency: "sol" },
|
|
39
|
+
to: { chainId: 8453, currency: "eth" },
|
|
40
|
+
amountBase: "100000000",
|
|
41
|
+
senderAddress: "<sol>",
|
|
42
|
+
toAddress: "0x...",
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## deBridge notes
|
|
47
|
+
- Provider `debridge`; API `https://api.dln.trade/v1.0`
|
|
48
|
+
- Solana DLN chainId **`7565164`**; SOL mint `11111111111111111111111111111111`
|
|
49
|
+
- EVM native `0x0000…0000`
|
|
50
|
+
- create-tx: EVM `{to,data,value}` or Solana serialized `tx.data`
|
|
51
|
+
- Send real User-Agent (bare urllib may 403)
|
|
52
|
+
- Docs: `docs/DEBRIDGE_CONVERT.md`
|
|
53
|
+
|
|
54
|
+
## ChangeNOW notes
|
|
55
|
+
- Provider `changenow`; prepare-only deposit exchange
|
|
56
|
+
- Currencies public; estimate/create need `CHANGENOW_API_KEY` header `x-changenow-api-key`
|
|
57
|
+
- **API key free** (partner signup, no monthly fee); fee in rate; optional ~0.4% partner cut
|
|
58
|
+
- Agent **cannot** create the key for DEMI — he must sign up and install env (0600)
|
|
59
|
+
- Never auto-fund deposit from agent without separate GO
|
|
60
|
+
- Docs: `docs/CHANGENOW_CONVERT.md`
|
|
61
|
+
|
|
62
|
+
## Public product rules
|
|
63
|
+
- Server holds ChangeNOW key only
|
|
64
|
+
- No public agent/exec hot path for convert spend
|
|
65
|
+
- UI uses convert router, not a single hard-coded venue
|
|
66
|
+
- Copy: user sends/signs — Oracle does not hold bags
|
|
67
|
+
|
|
68
|
+
## Not this skill
|
|
69
|
+
- Flash-loan MEV (Base/Arb shadows) → `oracle-mev-flashloan-plane`
|
|
70
|
+
- Executor gas hops (Arb→Base Relay) → `cross-chain-executor-funding`
|
|
71
|
+
- RH Chain 4663 trades → rhbot / RH skills
|
|
72
|
+
|
|
73
|
+
## Pitfalls
|
|
74
|
+
- Claiming ChangeNOW is BTC-only — it includes SOL and long-tail
|
|
75
|
+
- Treating deBridge as BTC L1 solution — weak; use ChangeNOW
|
|
76
|
+
- Pasting API keys in chat
|
|
77
|
+
- Agent inventing a free anonymous key (estimate/create always 401 without partner key)
|
|
78
|
+
- Auto-broadcasting deBridge txs from agent without GO
|
|
79
|
+
- Confusing MEV “0 qualified opps” with convert product funding needs
|
|
80
|
+
|
|
81
|
+
## Related
|
|
82
|
+
- Desk ops: `multichain-exec-desk`
|
|
83
|
+
- Keys: `protocol-api-key-integration`
|
|
84
|
+
- Public UX: `oracle-public-product`
|
|
85
|
+
|
|
86
|
+
## References
|
|
87
|
+
- `references/pair-routing.md` — preference table and amounts
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-native-harness
|
|
3
|
+
description: Use for Oracle's own agent loop. Crypto desk tools + skills, not Hermes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Oracle native harness
|
|
7
|
+
|
|
8
|
+
Oracle is its own agent. Chat runs this loop, not `hermes -p oracle`.
|
|
9
|
+
|
|
10
|
+
## Tools that exist here
|
|
11
|
+
|
|
12
|
+
| Tool | Job |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `oracle_cli` | Live read + prepare (`data`, `scan`, `route`, `prepare`) |
|
|
15
|
+
| `skill_load` / `skill_list` | Packaged + `~/.config/oracle/skills/<name>/SKILL.md` |
|
|
16
|
+
| `vault_status` | Local vault readiness. No key material. |
|
|
17
|
+
| `signer_status` | Loopback signer ping |
|
|
18
|
+
| `signer_execute` | One already-confirmed artifact. Needs human `confirmationNonce`. |
|
|
19
|
+
| `trade_lifecycle` | Prepare-only fact chain |
|
|
20
|
+
| `web_fetch` / `web_search` | Docs and announcements |
|
|
21
|
+
|
|
22
|
+
No `terminal`. No fleet SSH. No computer-use.
|
|
23
|
+
|
|
24
|
+
## Skills that belong here
|
|
25
|
+
|
|
26
|
+
Crypto desk only: any shipped EVM chain (ETH, Base, Arb, OP, Polygon, BSC, Avalanche, HyperEVM, Abstract, Stable, RH), plus Sol/BTC, HL/Poly data, grants, RFQ, launches, circuit breaker, venue bounds.
|
|
27
|
+
|
|
28
|
+
Not here: Hermes admin, fleet boxes, RH private ops, Kanban.
|
|
29
|
+
|
|
30
|
+
## Confirm / arm
|
|
31
|
+
|
|
32
|
+
Quote first. Human confirms on the local signer. Then `signer_execute`. Disarm kills everything. Autonomous needs `ORACLE_AUTONOMOUS_TRADING=1`.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-ownership-gate
|
|
3
|
+
description: Use when sender identity matters for access control.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Oracle ownership gate
|
|
10
|
+
|
|
11
|
+
## The rule
|
|
12
|
+
|
|
13
|
+
**DEMI's instance is private.** Owner: Telegram ID `1426127634`. All other senders denied.
|
|
14
|
+
No read access. No prepare access. No execution.
|
|
15
|
+
|
|
16
|
+
## Refusal
|
|
17
|
+
|
|
18
|
+
"Oracle is self-hostable. Install your own instance: npm install -g @oracle-agent/oracle"
|
|
19
|
+
|
|
20
|
+
No exceptions. No negotiation. Do not explain the gate.
|
|
21
|
+
|
|
22
|
+
## What non-owners get
|
|
23
|
+
|
|
24
|
+
Nothing. Full stop. They must self-host.
|
|
25
|
+
|
|
26
|
+
## How self-hosting works
|
|
27
|
+
|
|
28
|
+
`@oracle-agent/oracle` ships an owner-agnostic SOUL. Self-hosters are their own owners.
|
|
29
|
+
They bring their own wallet, keys, models, and Hermes (optional). Full capabilities.
|
|
30
|
+
|
|
31
|
+
## Two SOUL model
|
|
32
|
+
|
|
33
|
+
| SOUL | Location | Audience |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| Shipped | `packages/oracle/profiles/oracle/SOUL.md` | Self-hosters — "You are the owner" |
|
|
36
|
+
| DEMI instance | `~/.hermes/profiles/oracle/SOUL.md` | DEMI only — hardcoded Telegram ID `1426127634` |
|
|
37
|
+
|
|
38
|
+
## Pitfalls
|
|
39
|
+
|
|
40
|
+
- Do NOT let non-owners read or prepare through DEMI's instance.
|
|
41
|
+
- The self-host path (`npm install -g @oracle-agent/oracle`) must always be in the refusal message.
|
|
42
|
+
- Sender display name/username is not authorization. Only numeric Telegram ID matters.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-public-product-ux
|
|
3
|
+
description: Use for Oracle onboarding, self-host C+B agent, desk, themes, NL swap UX.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Oracle public product UX
|
|
10
|
+
|
|
11
|
+
Class rules for how Oracle is presented and operated for DEMI + self-host downloaders.
|
|
12
|
+
|
|
13
|
+
## Product law: C + B (decided 2026-08)
|
|
14
|
+
|
|
15
|
+
**Downloaders interact like the Hermes desk — self-hosted and local.**
|
|
16
|
+
|
|
17
|
+
| Layer | Meaning |
|
|
18
|
+
|---|---|
|
|
19
|
+
| **C · Custody** | Local agent key on **their** disk (`oracle sign init`). Never house cloud. **Never paste seed into app UI.** |
|
|
20
|
+
| **B · Rails** | `~/.config/oracle/agent-policy.json` — max $/trade, $/day, chains, slippage bps, session TTL, arm/disarm, **noLimits** (armed + all EVM + no caps; Disarm is the only block; DEMI's Mac runs this) |
|
|
21
|
+
|
|
22
|
+
- Chat: `swap 0.1 ETH to USDC on base` → quote → Confirm · agent (if policy ok) or Sign in wallet.
|
|
23
|
+
- APIs: `/api/oracle/trade/quote`, `/api/oracle/agent/policy`, `/api/oracle/selfhost/{status,init}`.
|
|
24
|
+
- Policy **before** agent sign. Block codes: `per_trade_cap`, `daily_cap`, `chain_blocked`, `disarmed`, `session_expired`.
|
|
25
|
+
- Settings: `AgentPolicySettings`. Desk/exec default copy = `127.0.0.1` for downloaders.
|
|
26
|
+
- Refs: `references/selfhost-c-plus-b-agent-policy.md`, `references/session-2026-08-c-plus-b-ship.md`.
|
|
27
|
+
|
|
28
|
+
### Custody honesty (user correction)
|
|
29
|
+
|
|
30
|
+
- Never ask users to paste private key/seed into the Oracle **app UI**.
|
|
31
|
+
- Wallet path: injected provider → public address only → wallet popup signs.
|
|
32
|
+
- Agent path: CLI `oracle sign init` on **their** machine (self-custody operator).
|
|
33
|
+
- “Give Oracle your key” language is wrong for public product.
|
|
34
|
+
|
|
35
|
+
## Onboarding (self-host local)
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
npm i -g @oracle-agent/oracle
|
|
39
|
+
oracle sign init # key ON THIS MACHINE only
|
|
40
|
+
oracle sign doctor
|
|
41
|
+
# app: POST /api/oracle/selfhost/init → 127.0.0.1 desk/data/exec
|
|
42
|
+
oracle data serve && oracle signer
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- App first-run `OnboardingGate`: checklist + local desk write + CLI steps + start with agent.
|
|
46
|
+
- Prompt: **Your machine. Your agent. Your keys.**
|
|
47
|
+
- Bare `oracle` opens the same chat as `oracle chat`.
|
|
48
|
+
- Optional wallet connect for view / Sign in wallet — not the primary agentic path.
|
|
49
|
+
|
|
50
|
+
## Demo ≠ arm
|
|
51
|
+
|
|
52
|
+
| User says | Do |
|
|
53
|
+
|---|---|
|
|
54
|
+
| demo / show / prepare / what would this look like | Live reads + formatted card only |
|
|
55
|
+
| arm | `oracle_control_arm` for exact legs **and/or** policy Arm in Settings |
|
|
56
|
+
| confirm / execute / go | confirm pending ids / Confirm · agent inside policy |
|
|
57
|
+
|
|
58
|
+
If armed and they say “demo only / don’t arm” → **cancel every pending action**. Never leave execute arms after a demo correction.
|
|
59
|
+
|
|
60
|
+
## One Oracle — two attach modes
|
|
61
|
+
|
|
62
|
+
| Who | Desk |
|
|
63
|
+
|---|---|
|
|
64
|
+
| **Downloaders (product default)** | Self-host `127.0.0.1` desk/data/exec on **their** machine |
|
|
65
|
+
| **DEMI thin-client (ops)** | Mac → Arch Tailscale `:8799`/`:8792` — not the public default |
|
|
66
|
+
|
|
67
|
+
Do not ship downloader copy that assumes Arch. DEMI fleet detail: `oracle-fleet-desk-wiring/references/mac-desktop-arch-desk.md`.
|
|
68
|
+
|
|
69
|
+
After desktop code change: rebuild, stage runtime, install `/Applications/Oracle.app`.
|
|
70
|
+
|
|
71
|
+
## App chrome / themes
|
|
72
|
+
|
|
73
|
+
- Status chip: **Available** / **Unavailable** — never “Oracle available” next to the wordmark.
|
|
74
|
+
- Themes: **Oracle** + **Signal** only.
|
|
75
|
+
- **No CLI tab. No dedicated HL nav tab** — HL is a chain pick, not primary chrome.
|
|
76
|
+
- Composer **one flush line**: model · effort · chain · context · compress. Chain = **box menu** with logos; default = **unset**. HL≡HEVM; no chainId labels. `references/flush-composer-chain-default.md`.
|
|
77
|
+
- Shell: `references/chat-first-app-shell.md`. Config: `references/cli-app-config-sync.md`.
|
|
78
|
+
- Older session notes: `references/session-2026-08-product-ship.md`.
|
|
79
|
+
|
|
80
|
+
## Portfolio + coin list
|
|
81
|
+
|
|
82
|
+
- Book headline = coins + NFT floors; **Partial total** when incomplete (`references/portfolio-unified-total.md`).
|
|
83
|
+
- **Your coins** list is primary: USD sort; **Swap/Send** prefills Prepare (`references/portfolio-coin-list-actions.md`).
|
|
84
|
+
- Stable ERC-20 (FEFER) often missing from native-only indexers — probe `watchTokens` + DexScreener (`references/stable-erc20-watch-probe.md`).
|
|
85
|
+
- Agent wallet from `exec.env`; Electron must set `ORACLE_REAL_HOME` so fake-home does not hide config (`references/agent-wallet-balance-and-tx.md`).
|
|
86
|
+
|
|
87
|
+
## NL swap (desktop = desk)
|
|
88
|
+
|
|
89
|
+
- Unified `/api/oracle/trade/quote` (any taker). Agent execute: policy → prepare → sign → broadcast → spend ledger.
|
|
90
|
+
- `references/owner-chat-swap-agent-wallet.md`, `references/selfhost-c-plus-b-agent-policy.md`.
|
|
91
|
+
|
|
92
|
+
## Hyperliquid
|
|
93
|
+
|
|
94
|
+
- Charts OK as evidence — not required primary tab. Not authorization.
|
|
95
|
+
|
|
96
|
+
## Shipped / open
|
|
97
|
+
|
|
98
|
+
Shipped ✅: coin list Swap/Send · flush composer · chain logos + unset default · no HL tab · FEFER watch-probe · trade NL · **C+B agent policy (incl. noLimits preset)** · self-host init/status · onboarding · agent balance path · **conversational confirm/arm** (quote → reply confirm|arm|cancel; new quote supersedes) · **`oracle eval desk`** harness · **obsidian-glass premium chrome** (`px-*` CSS layer → superseded by Fable 5) · **Fable 5 engraved-ledger** (warm bone ink, bronze accents, physical depth, signal discipline) · **swap celebration** (particle burst + checkmark) · token logos on balances.
|
|
99
|
+
|
|
100
|
+
New refs: `references/agent-policy-rails-and-eval.md` (policy schema, enforcement point, eval command, parse grammar) · `references/premium-obsidian-glass.md` (px-* classes, deploy loop — superseded by Fable 5) · `references/fable-5-design-system.md` (CSS token system, color remap, theme triple-layer, celebration animation, chain logo sources, "looks like a website" fixes).
|
|
101
|
+
|
|
102
|
+
Still open: gas-from-USDC (Gelato/top-up) · WalletConnect mobile · app-spawn local signer/data · Settings OAuth · ensure desktop self-host does not force `ORACLE_EXECUTE_ENABLED=0` via fake-home.
|
|
103
|
+
|
|
104
|
+
## HIP-4 / multi-venue honesty
|
|
105
|
+
|
|
106
|
+
- HIP-4 mainnet: price binaries live; multi-outcome stubs only.
|
|
107
|
+
- Geopolitics → Polymarket until HIP-4 lists events.
|
|
108
|
+
- `xyz:NVDA` = perp on TradeXYZ/HL HIP-3, not spot equity.
|
|
109
|
+
|
|
110
|
+
## Related
|
|
111
|
+
|
|
112
|
+
- `oracle-fleet-desk-wiring` — Tailscale desk (DEMI ops)
|
|
113
|
+
- `oracle-agent-dev` — MCP install, publish
|
|
114
|
+
- `oracle-action-semantics` — arm/watch vocabulary (if user-owned, recommend `hermes curator adopt`)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-tailscale
|
|
3
|
+
description: Use when exposing an Oracle desk across the user's own Tailscale tailnet.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> Oracle native tools: `oracle_cli`, `vault_status`, `signer_status`, `signer_execute`. Use YOUR tailnet only.
|
|
7
|
+
|
|
8
|
+
# Tailscale (your tailnet)
|
|
9
|
+
|
|
10
|
+
Use Tailscale so **your** machines reach **your** Oracle desk. Do not publish the desk to the public internet. Do not bind exec/signer to `0.0.0.0`.
|
|
11
|
+
|
|
12
|
+
## Rules
|
|
13
|
+
|
|
14
|
+
1. Use a MagicDNS name or the 100.x address of **this install's** node. Never paste a third-party 100.x.
|
|
15
|
+
2. Data/public plane may listen on the tailnet IP if you want remote `oracle` reads.
|
|
16
|
+
3. Local signer stays `127.0.0.1`. Vault keys do not ride the tailnet.
|
|
17
|
+
4. Confirm `tailscale status` shows only nodes you own before opening ports.
|
|
18
|
+
|
|
19
|
+
## Client env (placeholders)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# ~/.config/oracle/env (0600)
|
|
23
|
+
ORACLE_DESK_URL=http://YOUR_NODE:8799
|
|
24
|
+
ORACLE_DATA_URL=http://YOUR_NODE:8799
|
|
25
|
+
ORACLE_PUBLIC_URL=http://YOUR_NODE:8799
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Replace `YOUR_NODE` with your MagicDNS hostname. Verify with `oracle doctor` / `oracle scan chains`.
|
|
29
|
+
|
|
30
|
+
## Not this skill
|
|
31
|
+
|
|
32
|
+
Fleet boxes, someone else's Arch, shared operator wallets, GitHub admin packs.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oracle-thin-client
|
|
3
|
+
description: Use when a laptop or desktop should attach to an Oracle desk the user hosts on their own network.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> Oracle native tools: `oracle_cli`, `vault_status`, `signer_status`, `signer_execute`. No fleet SSH. No one else's box.
|
|
7
|
+
|
|
8
|
+
# Thin client (your desk, your machines)
|
|
9
|
+
|
|
10
|
+
A thin client is **your** laptop talking to **your** Oracle desk. It is not a shared house server and not someone else's Tailnet.
|
|
11
|
+
|
|
12
|
+
## Default (no thin client)
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
oracle setup model
|
|
16
|
+
oracle chat
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Desk, vault, and signer stay on this machine (`127.0.0.1`).
|
|
20
|
+
|
|
21
|
+
## Optional: desk on machine A, chat on machine B
|
|
22
|
+
|
|
23
|
+
Both machines must be yours. Keys stay on the signer host.
|
|
24
|
+
|
|
25
|
+
On the desk host, bind data/public only as far as you intend (loopback, LAN, or your tailnet). Never `0.0.0.0` for exec/signer.
|
|
26
|
+
|
|
27
|
+
On the client, point at **your** desk URLs — placeholders only:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"deskUrl": "http://YOUR_DESK_HOST:8799",
|
|
32
|
+
"dataUrl": "http://YOUR_DESK_HOST:8799",
|
|
33
|
+
"publicUrl": "http://YOUR_DESK_HOST:8799"
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Write that to `~/.config/oracle/desk.json` (mode 0600). Do not commit it. Do not copy another person's file.
|
|
38
|
+
|
|
39
|
+
`oracle doctor` must probe `/health` and `/public/health` on those URLs.
|
|
40
|
+
|
|
41
|
+
## Signer
|
|
42
|
+
|
|
43
|
+
The loopback signer (`oracle signer`) stays on `127.0.0.1` on the machine that holds the vault. A thin client does not get a remote private key.
|
|
44
|
+
|
|
45
|
+
## Related
|
|
46
|
+
|
|
47
|
+
`oracle-tailscale` · `oracle-native-harness` · `setup`
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: perp-venue-funding-research
|
|
3
|
+
description: Validate a perp venue's funding before sizing a carry trade.
|
|
4
|
+
category: research
|
|
5
|
+
triggers:
|
|
6
|
+
- "funding rate"
|
|
7
|
+
- "funding arb"
|
|
8
|
+
- "basis trade"
|
|
9
|
+
- "carry vault"
|
|
10
|
+
- "new perp venue"
|
|
11
|
+
- "what's funding on"
|
|
12
|
+
- "perp market list"
|
|
13
|
+
- "is this strategy viable"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
> Oracle native tools: `oracle_cli` (read/prepare), `vault_status`, `signer_status`, `signer_execute` (needs human confirmationNonce), `skill_load`. No generic shell. No fleet SSH.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Perp venue funding research
|
|
20
|
+
|
|
21
|
+
Task class: a venue (often brand new, often barely documented) is proposed as the home for a
|
|
22
|
+
carry / funding-basis / cash-and-carry strategy. Discover its public API from scratch, pull the
|
|
23
|
+
**real** market list with funding, and answer whether the edge actually exists.
|
|
24
|
+
|
|
25
|
+
The deliverable is never "here are the markets." It is **does the money-making mechanism the
|
|
26
|
+
thesis assumes actually operate on this venue.** Those are different questions, and the second
|
|
27
|
+
one is the one that protects capital.
|
|
28
|
+
|
|
29
|
+
## When NOT to use
|
|
30
|
+
- Hyperliquid specifically → `hyperliquid` (its keyless recipes are already written)
|
|
31
|
+
- Chain-wide TVL / protocol census → `chain-defi-ecosystem-profiling`
|
|
32
|
+
- Enumerating a read-only analytics dashboard → `analytics-dashboard-recon`
|
|
33
|
+
- Actually executing/sizing once validated → `trade-loop-circuit-breaker`, `oracle-best-execution`
|
|
34
|
+
|
|
35
|
+
## Step 1 — Find the real API (do not trust the given domain)
|
|
36
|
+
|
|
37
|
+
**Verify the domain resolves before anything else.** Task briefs routinely carry a wrong or dead
|
|
38
|
+
domain. A `curl` status of `000` means DNS failure, not a bad path — no amount of path-guessing fixes it.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
for h in example.com api.example.com indexer.example.com app.example.com; do
|
|
42
|
+
echo "=== $h"; getent hosts $h || echo "DNS FAIL"; done
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Then, cheapest-probe-first:
|
|
46
|
+
|
|
47
|
+
1. `curl -s https://api.<domain>/` — a bare root often returns `{"status":"running","docs":...}` and
|
|
48
|
+
confirms the gateway exists even when every guessed path 404s.
|
|
49
|
+
2. **`docs.<domain>/llms.txt`** — Mintlify/Docusaurus ship this by default. Flat machine-readable
|
|
50
|
+
index of every doc page with descriptions; for API-reference sites it names every endpoint family
|
|
51
|
+
in ONE fetch. Also `<docpage>.md` — Mintlify serves a clean markdown twin of any HTML page, far
|
|
52
|
+
cheaper to grep than a 250KB rendered SPA. Fetching `.md` concept pages is how you get the funding
|
|
53
|
+
formula without rendering anything.
|
|
54
|
+
3. `/openapi.json`, `/swagger.json`, `/docs`, `/health`.
|
|
55
|
+
4. **Grep the app JS bundle — the highest-yield probe.** Marketing sites are usually Framer/Webflow
|
|
56
|
+
with zero API references; the *app* subdomain has everything:
|
|
57
|
+
```bash
|
|
58
|
+
curl -s https://app.example.com/ -o app.html
|
|
59
|
+
grep -oE '(src|href)="[^"]*\.js"' app.html # bundle chunks
|
|
60
|
+
curl -s https://app.example.com/assets/index-XXXX.js -o idx.js
|
|
61
|
+
grep -oE 'https://[a-zA-Z0-9.-]*example[a-zA-Z0-9.-]*' idx.js | sort -u # every API host
|
|
62
|
+
grep -oE '/v1/[a-zA-Z][a-zA-Z0-9/_-]*' idx.js | sort -u # every route path
|
|
63
|
+
```
|
|
64
|
+
Surfaces hosts nothing links to — separate spot indexers, routers, staging/testnet — plus routes
|
|
65
|
+
absent from the docs.
|
|
66
|
+
|
|
67
|
+
**Do not assume the dYdX v4 scheme.** "Built by the dYdX team" does NOT mean `/v4/perpetualMarkets`.
|
|
68
|
+
Teams reuse people, not URL schemes. Probe, then read the bundle.
|
|
69
|
+
|
|
70
|
+
## Step 2 — Pull the data
|
|
71
|
+
|
|
72
|
+
Prefer the one endpoint returning full per-market state (prices + funding + OI + volume + trading-hours
|
|
73
|
+
config) over stitching several. Note which params are mandatory — history endpoints commonly require an
|
|
74
|
+
explicit market and 400 without it, which reads like "broken" if you only tried the bare path.
|
|
75
|
+
|
|
76
|
+
Report raw strings from the response alongside derived figures. Never silently round a rate.
|
|
77
|
+
|
|
78
|
+
## Step 3 — Nail the funding interval BEFORE quoting any APR
|
|
79
|
+
|
|
80
|
+
**Highest-consequence detail in the task.** An 8x error either way turns a dead trade into a great
|
|
81
|
+
one on paper.
|
|
82
|
+
|
|
83
|
+
Confirm the interval **three independent ways** and say so in the writeup:
|
|
84
|
+
1. The schema/spec field description (`"Hourly funding rate"`).
|
|
85
|
+
2. The prose docs ("funding is charged once an hour").
|
|
86
|
+
3. **Empirically** — diff consecutive timestamps in the funding history. 3600s apart = hourly. The
|
|
87
|
+
only check that cannot be stale or wrong.
|
|
88
|
+
|
|
89
|
+
Beware the amortization convention: many venues quote an **hourly** rate that is 1/8th of a premium
|
|
90
|
+
"paid off over 8 hours." The quoted number is still hourly. Annualize `rate * 24 * 365`.
|
|
91
|
+
|
|
92
|
+
Sanity-check the base rate by reverse-solving it. If RWA funding sits at a constant, `rate * 360 * 24`
|
|
93
|
+
(ACT/360, the TradFi money-market daycount) should land on a recognizable benchmark + spread — that
|
|
94
|
+
confirms you understood the formula rather than pattern-matched a number.
|
|
95
|
+
|
|
96
|
+
## Step 4 — Test the funding REGIME, not just the current spread ⚠️
|
|
97
|
+
|
|
98
|
+
**The load-bearing step. A snapshot of current funding cannot validate a carry thesis.**
|
|
99
|
+
|
|
100
|
+
Most carry theses assume funding *floats freely* and dislocates under some condition (weekends,
|
|
101
|
+
off-hours, volatility). Many venues explicitly engineer that away. Read the funding concept page for
|
|
102
|
+
regime language: *locked*, *fixed at the close*, *base rate*, *suspended*, *off-hours*, *dead-band*, *clamp*.
|
|
103
|
+
|
|
104
|
+
Then **prove the regime from history** — do not stop at the docs:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# pull enough history to span the condition (a weekend, an overnight), then count distinct rates
|
|
108
|
+
curl -s "https://api.example.com/v1/fundingRates?market=NVDA-USD&limit=200"
|
|
109
|
+
```
|
|
110
|
+
Bucket rows by the condition and count **distinct** values. Constant rate across the window = locked
|
|
111
|
+
regime = **no dislocation to harvest**.
|
|
112
|
+
|
|
113
|
+
**Always run a control.** Test crypto perps (or any market without the regime) over the *same* window.
|
|
114
|
+
If crypto varies and RWA is flat, the flatness is a real mechanism. If *everything* is flat, suspect
|
|
115
|
+
your query, the window, or a stale endpoint. Without the control you cannot distinguish "locked market"
|
|
116
|
+
from "broken pull" — and that mistake runs in both directions.
|
|
117
|
+
|
|
118
|
+
Run it across **all** markets in the class, not one sample — then you can state "28 of 28" rather than
|
|
119
|
+
"NVDA looked flat."
|
|
120
|
+
|
|
121
|
+
## Step 5 — Report so it can kill the trade
|
|
122
|
+
|
|
123
|
+
Lead with the mechanism finding, not the market table. If the thesis is dead, say so in the first lines
|
|
124
|
+
and show the evidence that killed it.
|
|
125
|
+
|
|
126
|
+
Cover explicitly:
|
|
127
|
+
- **Funding sign + interval**, with the annualization arithmetic shown.
|
|
128
|
+
- **Regime**: when funding is live vs locked/fixed, with exact hours.
|
|
129
|
+
- **What's left**: if the assumed window is dead, name the window where variance *does* exist.
|
|
130
|
+
- **The other side of the trade**: locked funding usually coincides with *wider price bands and higher
|
|
131
|
+
margin requirements*. Directional gap risk with no funding compensation is strictly worse than the
|
|
132
|
+
thesis assumed — say that plainly.
|
|
133
|
+
- **Capacity**: OI notional and trades/24h per market. A venue can have a real edge and still be
|
|
134
|
+
untradeable at size. Flag markets with single-digit daily trades.
|
|
135
|
+
- **TVL ≠ OI.** Deposited collateral and position notional are different numbers; reconcile them
|
|
136
|
+
explicitly rather than letting a big TVL headline imply depth.
|
|
137
|
+
|
|
138
|
+
## Pitfalls
|
|
139
|
+
|
|
140
|
+
- **The brief's domain may not exist.** Check DNS first; `curl` `000` = DNS, not routing.
|
|
141
|
+
- **Pedigree ≠ API shape.** Don't infer endpoints from who built it.
|
|
142
|
+
- **Marketing root has no API strings** — it's a site builder. Go to `app.`.
|
|
143
|
+
- **Bare history endpoints 400 without a required param.** Read the error body; it names the missing field.
|
|
144
|
+
- **A snapshot cannot prove a regime.** Only bucketed history plus a control can.
|
|
145
|
+
- **Fixed-rate off-hours is a *feature* venues advertise** as removing overnight/weekend funding
|
|
146
|
+
uncertainty. It is deliberately anti-dislocation. Assume it exists until history says otherwise.
|
|
147
|
+
- **Zero-fee claims are checkable** — asset/fee endpoints often expose `maker_fee`/`taker_fee` literally.
|
|
148
|
+
Verify rather than repeating marketing.
|
|
149
|
+
- **Markets listed but OFFLINE** return all-zero prices/OI. Filter on status before aggregating or your
|
|
150
|
+
totals and averages are silently wrong.
|
|
151
|
+
- Report `null`/zero marks as-is; a market quoting mark `0` against a live oracle is a real state worth
|
|
152
|
+
flagging, not a number to clean up.
|
|
153
|
+
|
|
154
|
+
## Worked example
|
|
155
|
+
Arcus DEX on Robinhood Chain (4663) — full endpoint map, the RWA funding-lock finding that killed a
|
|
156
|
+
weekend funding-arb thesis, and the base-rate arithmetic: `references/arcus-robinhood-chain.md`
|
|
157
|
+
|
|
158
|
+
## Cross-skill
|
|
159
|
+
- `hyperliquid` — equivalent recipes for HL, already keyless and written
|
|
160
|
+
- `analytics-dashboard-recon` — schema/bundle discovery for read-only dashboards
|
|
161
|
+
- `trade-loop-circuit-breaker` — guardrails before any of this touches capital
|