silo-agent 1.0.2 → 1.0.3
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/README.md +85 -5
- package/build/defai-demo.d.ts +14 -0
- package/build/defai-demo.js +75 -0
- package/build/defai-demo.js.map +1 -0
- package/build/doctor.js +16 -4
- package/build/doctor.js.map +1 -1
- package/build/lib/defai.d.ts +51 -0
- package/build/lib/defai.js +163 -0
- package/build/lib/defai.js.map +1 -0
- package/build/mcp.d.ts +2 -0
- package/build/mcp.js +164 -10
- package/build/mcp.js.map +1 -1
- package/build/server.js +146 -1
- package/build/server.js.map +1 -1
- package/build/tests/defai.test.d.ts +1 -0
- package/build/tests/defai.test.js +114 -0
- package/build/tests/defai.test.js.map +1 -0
- package/build/tests/memory-coordinator.test.d.ts +1 -0
- package/build/tests/memory-coordinator.test.js +112 -0
- package/build/tests/memory-coordinator.test.js.map +1 -0
- package/build/tests/memory-index.test.d.ts +1 -0
- package/build/tests/memory-index.test.js +136 -0
- package/build/tests/memory-index.test.js.map +1 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -13,9 +13,10 @@ AI agents are accumulating sensitive personal data — medical records, financia
|
|
|
13
13
|
| **Encrypted Vault** | AES-256-GCM encryption with PBKDF2 key derivation. Data is encrypted in-memory and stored on 0G — never at rest in plaintext. |
|
|
14
14
|
| **Execution Attestation** | Every store/retrieve is hashed into a Merkle tree. Commit a session to publish a verifiable proof of agent behavior without revealing content. |
|
|
15
15
|
| **Multi-Agent Sharing** | Agents can securely share encrypted memories via `vault_share` and `vault_import` — enabling cross-agent collaboration with cryptographic accountability. |
|
|
16
|
-
| **MCP Server** |
|
|
16
|
+
| **MCP Server** | 21 tools for Claude Desktop, Cursor, or any MCP-compatible client (vault + DeFAI + shared memory + autonomy). |
|
|
17
17
|
| **Real-Time Dashboard** | Live WebSocket-powered UI showing stores, retrieves, Merkle tree visualization, and session attestation ceremonies. |
|
|
18
18
|
| **CLI Tools** | `verify` to prove data exists, `doctor` to validate setup, `demo` to run the full cycle. |
|
|
19
|
+
| **DeFAI Copilot** | Intent-to-plan API with guardrails, risk previews, explicit user approval, and optional 0G Compute rationale. |
|
|
19
20
|
|
|
20
21
|
---
|
|
21
22
|
|
|
@@ -24,7 +25,7 @@ AI agents are accumulating sensitive personal data — medical records, financia
|
|
|
24
25
|
```bash
|
|
25
26
|
# Clone and install
|
|
26
27
|
git clone https://github.com/rohanpotta/ethdenverhack.git
|
|
27
|
-
cd
|
|
28
|
+
cd ethdenverhack
|
|
28
29
|
|
|
29
30
|
# Install backend
|
|
30
31
|
cd 0g-agent-shield
|
|
@@ -49,6 +50,35 @@ npm run dev
|
|
|
49
50
|
|
|
50
51
|
Open `http://localhost:5173` to see the SILO dashboard.
|
|
51
52
|
|
|
53
|
+
## Common Failures (Fast Fixes)
|
|
54
|
+
|
|
55
|
+
- `EADDRINUSE: address already in use :::3000`
|
|
56
|
+
- Cause: another process already uses port `3000`.
|
|
57
|
+
- Fix:
|
|
58
|
+
```bash
|
|
59
|
+
lsof -i :3000
|
|
60
|
+
kill -9 <PID>
|
|
61
|
+
npm start
|
|
62
|
+
```
|
|
63
|
+
- `ngrok ERR_NGROK_334` endpoint already online
|
|
64
|
+
- Cause: previous tunnel is still active.
|
|
65
|
+
- Fix:
|
|
66
|
+
```bash
|
|
67
|
+
pkill -f ngrok
|
|
68
|
+
ngrok http 3000
|
|
69
|
+
```
|
|
70
|
+
- `MCP silo: ... is not valid JSON`
|
|
71
|
+
- Cause: non-protocol logs leaked to MCP stdout.
|
|
72
|
+
- Fix:
|
|
73
|
+
- Upgrade to latest `silo-agent`.
|
|
74
|
+
- Keep MCP as `npx silo-agent mcp` (do not wrap in extra shell logging).
|
|
75
|
+
- Restart Claude Desktop after config updates.
|
|
76
|
+
- `0 balance — get testnet tokens from https://faucet.0g.ai`
|
|
77
|
+
- Cause: wallet is unfunded.
|
|
78
|
+
- Fix:
|
|
79
|
+
- Fund the exact address in your MCP/backend `PRIVATE_KEY` via faucet.
|
|
80
|
+
- Re-run `npm run doctor`.
|
|
81
|
+
|
|
52
82
|
---
|
|
53
83
|
|
|
54
84
|
## Use With Claude Desktop / Cursor
|
|
@@ -79,7 +109,9 @@ No build step or absolute paths needed — `npx` resolves the package from npm.
|
|
|
79
109
|
|
|
80
110
|
---
|
|
81
111
|
|
|
82
|
-
## MCP Tools
|
|
112
|
+
## MCP Tools
|
|
113
|
+
|
|
114
|
+
SILO exposes 21 MCP tools. Core vault tools:
|
|
83
115
|
|
|
84
116
|
| Tool | Description |
|
|
85
117
|
|---|---|
|
|
@@ -92,6 +124,13 @@ No build step or absolute paths needed — `npx` resolves the package from npm.
|
|
|
92
124
|
| `vault_share` | Encrypt, store, and generate a share descriptor for another agent |
|
|
93
125
|
| `vault_import` | Retrieve and decrypt shared memory from another agent's descriptor |
|
|
94
126
|
|
|
127
|
+
DeFAI tools:
|
|
128
|
+
|
|
129
|
+
| Tool | Description |
|
|
130
|
+
|---|---|
|
|
131
|
+
| `defai_plan` | Generate a structured DeFi plan with guardrails + risk preview |
|
|
132
|
+
| `defai_approve` | Explicit user approval/rejection gate before execution |
|
|
133
|
+
|
|
95
134
|
---
|
|
96
135
|
|
|
97
136
|
## Multi-Agent Sharing
|
|
@@ -191,7 +230,7 @@ console.log(proof.merkleRoot); // public commitment
|
|
|
191
230
|
```
|
|
192
231
|
┌────────────────────────────────────────────────────────┐
|
|
193
232
|
│ MCP Server (mcp.ts) │
|
|
194
|
-
│
|
|
233
|
+
│ 21 tools for any AI client │
|
|
195
234
|
│ pushes events to dashboard via REST │
|
|
196
235
|
└────────────────────┬───────────────────────────────────┘
|
|
197
236
|
│
|
|
@@ -233,6 +272,9 @@ npm run doctor
|
|
|
233
272
|
# Run the full demo cycle
|
|
234
273
|
npm run demo
|
|
235
274
|
|
|
275
|
+
# Run the DeFAI safe-execution demo
|
|
276
|
+
npm run defai:demo
|
|
277
|
+
|
|
236
278
|
# Verify a specific stored memory
|
|
237
279
|
npm run verify -- <rootHash>
|
|
238
280
|
|
|
@@ -243,6 +285,44 @@ npm run verify -- <traceRootHash> --trace
|
|
|
243
285
|
npm run verify-flow
|
|
244
286
|
```
|
|
245
287
|
|
|
288
|
+
## DeFAI Endpoints
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
POST /api/defai/plan
|
|
292
|
+
POST /api/defai/approve
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
`/api/defai/plan` creates a structured swap plan with guardrails and simulation preview.
|
|
296
|
+
`/api/defai/approve` enforces explicit user control by requiring an approval/rejection action.
|
|
297
|
+
|
|
298
|
+
Set `OG_COMPUTE_URL` to route planning rationale through 0G Compute. If unavailable, SILO falls back to deterministic heuristics.
|
|
299
|
+
|
|
300
|
+
If you use the 0G starter-kit query API (`/api/services/query`), also set:
|
|
301
|
+
- `OG_COMPUTE_PROVIDER_ADDRESS`
|
|
302
|
+
- `OG_COMPUTE_FALLBACK_FEE` (default `0.01`)
|
|
303
|
+
|
|
304
|
+
### DeFAI Scenario Card (Judge-Ready)
|
|
305
|
+
|
|
306
|
+
- Intent: `Rebalance 500 USD from ETH to USDC`
|
|
307
|
+
- Guardrails: `maxSlippageBps=75`, `timeoutSec=90`, `maxNotionalUsd=1000`, allowlist=`ETH,USDC,DAI,WBTC`
|
|
308
|
+
- AI output: structured plan with route preview, risk rationale, and simulation (`expectedOutUsd`, `minOutUsd`)
|
|
309
|
+
- User control: explicit `defai_approve` / `defai_reject` gate before any execution
|
|
310
|
+
- Evidence: plan + approval artifacts encrypted to 0G with attestation trail
|
|
311
|
+
- Execution mode in this MVP: `dry_run_only` (no automatic transaction broadcast)
|
|
312
|
+
|
|
313
|
+
### DeFAI Safety Guarantees
|
|
314
|
+
|
|
315
|
+
- No transaction is auto-broadcast by SILO DeFAI MVP.
|
|
316
|
+
- Guardrail violations block planning before approval.
|
|
317
|
+
- User approval is mandatory and explicit for every plan.
|
|
318
|
+
- Rejection path is first-class (`defai_rejected`) and halts execution intent.
|
|
319
|
+
- Plan and approval artifacts are persisted on 0G for post-hoc auditability.
|
|
320
|
+
|
|
321
|
+
### DeFAI Scope Boundary (Honest MVP)
|
|
322
|
+
|
|
323
|
+
SILO currently stops at planning + safety + approval + dry-run execution payload.
|
|
324
|
+
Execution adapters are pluggable via `execute(plan)` style integration and intentionally out-of-scope for this MVP.
|
|
325
|
+
|
|
246
326
|
---
|
|
247
327
|
|
|
248
328
|
## Project Structure
|
|
@@ -256,7 +336,7 @@ silo/
|
|
|
256
336
|
│ │ │ ├── storage.ts # 0G Storage SDK wrapper + ABI fix
|
|
257
337
|
│ │ │ ├── attestation.ts # Merkle-based execution proofs
|
|
258
338
|
│ │ │ └── vault.ts # Unified public API (AgentVault)
|
|
259
|
-
│ │ ├── mcp.ts # MCP server (
|
|
339
|
+
│ │ ├── mcp.ts # MCP server (21 tools)
|
|
260
340
|
│ │ ├── server.ts # Express API + WebSocket server
|
|
261
341
|
│ │ ├── verify.ts # CLI: verify stored data
|
|
262
342
|
│ │ ├── doctor.ts # CLI: validate environment
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SILO DeFAI Demo
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates:
|
|
5
|
+
* 1) Intent -> structured DeFi plan
|
|
6
|
+
* 2) Guardrails + risk explanation
|
|
7
|
+
* 3) Simulation preview
|
|
8
|
+
* 4) Explicit user approval gate
|
|
9
|
+
* 5) Encrypted attestation artifacts on 0G
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* npm run defai:demo
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SILO DeFAI Demo
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates:
|
|
5
|
+
* 1) Intent -> structured DeFi plan
|
|
6
|
+
* 2) Guardrails + risk explanation
|
|
7
|
+
* 3) Simulation preview
|
|
8
|
+
* 4) Explicit user approval gate
|
|
9
|
+
* 5) Encrypted attestation artifacts on 0G
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* npm run defai:demo
|
|
13
|
+
*/
|
|
14
|
+
import dotenv from "dotenv";
|
|
15
|
+
import { AgentVault } from "./lib/vault.js";
|
|
16
|
+
import { buildStructuredPlan, guardrailViolations } from "./lib/defai.js";
|
|
17
|
+
dotenv.config();
|
|
18
|
+
async function run() {
|
|
19
|
+
const vault = new AgentVault({
|
|
20
|
+
privateKey: process.env.PRIVATE_KEY,
|
|
21
|
+
evmRpc: process.env.EVM_RPC,
|
|
22
|
+
indexerRpc: process.env.INDEXER_RPC,
|
|
23
|
+
vaultSecret: process.env.VAULT_SECRET,
|
|
24
|
+
});
|
|
25
|
+
await vault.init();
|
|
26
|
+
const input = {
|
|
27
|
+
intent: "Rebalance 500 USD from ETH to USDC with strict risk limits",
|
|
28
|
+
tokenIn: "ETH",
|
|
29
|
+
tokenOut: "USDC",
|
|
30
|
+
amountUsd: 500,
|
|
31
|
+
guardrails: {
|
|
32
|
+
maxSlippageBps: 75,
|
|
33
|
+
timeoutSec: 90,
|
|
34
|
+
tokenAllowlist: ["ETH", "USDC", "DAI", "WBTC"],
|
|
35
|
+
maxNotionalUsd: 1000,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
console.log("\n=== SILO DeFAI Demo ===");
|
|
39
|
+
console.log(`Agent: ${vault.address}`);
|
|
40
|
+
console.log(`Intent: ${input.intent}`);
|
|
41
|
+
const violations = guardrailViolations(input);
|
|
42
|
+
if (violations.length > 0) {
|
|
43
|
+
console.log("Guardrail violations:");
|
|
44
|
+
for (const v of violations)
|
|
45
|
+
console.log(` - ${v}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const plan = await buildStructuredPlan(input);
|
|
49
|
+
console.log(`\nPlan ID: ${plan.planId}`);
|
|
50
|
+
console.log(`Risk: ${plan.risk.level.toUpperCase()} — ${plan.risk.explanation}`);
|
|
51
|
+
console.log(`Preview: expectedOut=$${plan.preview.expectedOutUsd}, minOut=$${plan.preview.minOutUsd}, impact=${plan.preview.simulatedPriceImpactBps}bps`);
|
|
52
|
+
console.log(`Compute: ${plan.compute.provider} (${plan.compute.used ? "used" : "fallback"})`);
|
|
53
|
+
console.log(`Approval required: ${plan.userApprovalRequired ? "yes" : "no"}`);
|
|
54
|
+
const planStore = await vault.store(JSON.stringify(plan, null, 2), "defai_plan");
|
|
55
|
+
console.log(`Plan artifact rootHash: ${planStore.rootHash}`);
|
|
56
|
+
const approved = true; // Demo path: explicit user approval
|
|
57
|
+
const approval = {
|
|
58
|
+
planId: plan.planId,
|
|
59
|
+
approved,
|
|
60
|
+
reason: "User reviewed preview and accepted guardrails",
|
|
61
|
+
timestamp: Date.now(),
|
|
62
|
+
};
|
|
63
|
+
const approvalStore = await vault.store(JSON.stringify(approval, null, 2), "defai_user_approved");
|
|
64
|
+
console.log(`Approval artifact rootHash: ${approvalStore.rootHash}`);
|
|
65
|
+
const commit = await vault.commitSession();
|
|
66
|
+
console.log(`\nCommitted session ${commit.sessionId}`);
|
|
67
|
+
console.log(`Merkle root: ${commit.merkleRoot}`);
|
|
68
|
+
console.log(`Trace rootHash: ${commit.traceRootHash}`);
|
|
69
|
+
console.log("\nDeFAI flow complete: intent -> plan -> approval -> attestation.");
|
|
70
|
+
}
|
|
71
|
+
run().catch((err) => {
|
|
72
|
+
console.error("DeFAI demo failed:", err.message);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=defai-demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defai-demo.js","sourceRoot":"","sources":["../src/defai-demo.ts"],"names":[],"mappings":"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"}
|
package/build/doctor.js
CHANGED
|
@@ -55,13 +55,25 @@ const checks = [
|
|
|
55
55
|
{
|
|
56
56
|
name: "Indexer RPC reachable",
|
|
57
57
|
fn: async () => {
|
|
58
|
-
// Simple fetch to check the indexer is up
|
|
59
58
|
const url = process.env.INDEXER_RPC;
|
|
60
|
-
// The indexer doesn't have a simple health endpoint,
|
|
61
|
-
// so we just verify the URL is set and looks valid
|
|
62
59
|
if (!url.startsWith("http"))
|
|
63
60
|
throw new Error("Invalid URL");
|
|
64
|
-
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const timeout = setTimeout(() => controller.abort(), 5000);
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch(url, {
|
|
65
|
+
method: "GET",
|
|
66
|
+
signal: controller.signal,
|
|
67
|
+
});
|
|
68
|
+
return `${url} (HTTP ${response.status})`;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const message = error instanceof Error ? error.message : "Unknown indexer error";
|
|
72
|
+
throw new Error(message);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
clearTimeout(timeout);
|
|
76
|
+
}
|
|
65
77
|
},
|
|
66
78
|
},
|
|
67
79
|
{
|
package/build/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAOhB,MAAM,MAAM,GAAY;IACtB;QACE,IAAI,EAAE,iBAAiB;QACvB,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,uBAAuB;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACrG,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;QACrD,CAAC;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxC,2CAA2C;YAC3C,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,uDAAuD,CAAC,CAAC;YACzG,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,OAAO,GAAG,KAAK,eAAe,OAAO,GAAG,CAAC;QAC3C,CAAC;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAY,EAAE,QAAQ,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,GAAG,SAAS,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;QAC/D,CAAC;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface Guardrails {
|
|
2
|
+
maxSlippageBps: number;
|
|
3
|
+
timeoutSec: number;
|
|
4
|
+
tokenAllowlist: string[];
|
|
5
|
+
maxNotionalUsd: number;
|
|
6
|
+
}
|
|
7
|
+
export interface PlanInput {
|
|
8
|
+
intent: string;
|
|
9
|
+
tokenIn: string;
|
|
10
|
+
tokenOut: string;
|
|
11
|
+
amountUsd: number;
|
|
12
|
+
guardrails: Guardrails;
|
|
13
|
+
}
|
|
14
|
+
export interface PlanStep {
|
|
15
|
+
id: string;
|
|
16
|
+
action: "quote" | "approve" | "swap" | "confirm";
|
|
17
|
+
description: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RiskReport {
|
|
20
|
+
level: "low" | "medium" | "high";
|
|
21
|
+
reasons: string[];
|
|
22
|
+
explanation: string;
|
|
23
|
+
}
|
|
24
|
+
export interface PlanPreview {
|
|
25
|
+
expectedOutUsd: number;
|
|
26
|
+
minOutUsd: number;
|
|
27
|
+
simulatedPriceImpactBps: number;
|
|
28
|
+
route: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface StructuredPlan {
|
|
31
|
+
planId: string;
|
|
32
|
+
createdAt: number;
|
|
33
|
+
input: PlanInput;
|
|
34
|
+
steps: PlanStep[];
|
|
35
|
+
constraints: Guardrails;
|
|
36
|
+
risk: RiskReport;
|
|
37
|
+
preview: PlanPreview;
|
|
38
|
+
userApprovalRequired: true;
|
|
39
|
+
compute: {
|
|
40
|
+
used: boolean;
|
|
41
|
+
provider: "heuristic" | "0g-compute";
|
|
42
|
+
rationale: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export declare function maybeComputeRationale(input: PlanInput): Promise<{
|
|
46
|
+
used: boolean;
|
|
47
|
+
provider: "heuristic" | "0g-compute";
|
|
48
|
+
rationale: string;
|
|
49
|
+
}>;
|
|
50
|
+
export declare function buildStructuredPlan(input: PlanInput): Promise<StructuredPlan>;
|
|
51
|
+
export declare function guardrailViolations(input: PlanInput): string[];
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
function clamp(num, min, max) {
|
|
2
|
+
return Math.max(min, Math.min(max, num));
|
|
3
|
+
}
|
|
4
|
+
function estimateImpactBps(amountUsd) {
|
|
5
|
+
if (amountUsd <= 250)
|
|
6
|
+
return 15;
|
|
7
|
+
if (amountUsd <= 1000)
|
|
8
|
+
return 35;
|
|
9
|
+
if (amountUsd <= 5000)
|
|
10
|
+
return 85;
|
|
11
|
+
return 150;
|
|
12
|
+
}
|
|
13
|
+
function evaluateRisk(input, impactBps) {
|
|
14
|
+
const reasons = [];
|
|
15
|
+
if (impactBps > 100)
|
|
16
|
+
reasons.push("Estimated price impact is elevated for requested size.");
|
|
17
|
+
if (input.guardrails.maxSlippageBps > 150)
|
|
18
|
+
reasons.push("Max slippage setting is permissive.");
|
|
19
|
+
if (input.amountUsd > input.guardrails.maxNotionalUsd * 0.8)
|
|
20
|
+
reasons.push("Trade size is near your configured notional limit.");
|
|
21
|
+
const level = reasons.length >= 2 ? "high" : reasons.length === 1 ? "medium" : "low";
|
|
22
|
+
const explanation = level === "low"
|
|
23
|
+
? "Plan is within configured limits and expected impact is small."
|
|
24
|
+
: level === "medium"
|
|
25
|
+
? "Plan is executable but has one notable risk signal. Review before approval."
|
|
26
|
+
: "Plan crosses multiple risk signals. Consider reducing size or tightening guardrails.";
|
|
27
|
+
return { level, reasons, explanation };
|
|
28
|
+
}
|
|
29
|
+
export async function maybeComputeRationale(input) {
|
|
30
|
+
const computeUrl = process.env.OG_COMPUTE_URL?.trim();
|
|
31
|
+
if (!computeUrl) {
|
|
32
|
+
return {
|
|
33
|
+
used: false,
|
|
34
|
+
provider: "heuristic",
|
|
35
|
+
rationale: `Heuristic plan for ${input.intent.toLowerCase()} with strict user guardrails.`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const model = process.env.OG_COMPUTE_MODEL?.trim() || "qwen-2.5-7b-instruct";
|
|
40
|
+
const authToken = process.env.OG_COMPUTE_API_KEY?.trim();
|
|
41
|
+
const providerAddress = process.env.OG_COMPUTE_PROVIDER_ADDRESS?.trim();
|
|
42
|
+
const fallbackFee = Number(process.env.OG_COMPUTE_FALLBACK_FEE ?? "0.01");
|
|
43
|
+
const headers = { "Content-Type": "application/json" };
|
|
44
|
+
if (authToken)
|
|
45
|
+
headers.Authorization = `Bearer ${authToken}`;
|
|
46
|
+
// We support three request/response styles:
|
|
47
|
+
// 1) 0G starter kit query endpoint:
|
|
48
|
+
// POST /api/services/query
|
|
49
|
+
// { providerAddress, query, fallbackFee }
|
|
50
|
+
// -> { success: true, response: { content: "..." } }
|
|
51
|
+
// 1) Custom endpoint: { rationale: "..." }
|
|
52
|
+
// 2) OpenAI-compatible chat completions:
|
|
53
|
+
// { choices: [{ message: { content: "..." } }] }
|
|
54
|
+
const isStarterKitQuery = computeUrl.includes("/api/services/query") && !!providerAddress;
|
|
55
|
+
const starterKitQuery = JSON.stringify({
|
|
56
|
+
providerAddress,
|
|
57
|
+
query: [
|
|
58
|
+
`Intent: ${input.intent}`,
|
|
59
|
+
`Pair: ${input.tokenIn} -> ${input.tokenOut}`,
|
|
60
|
+
`Amount: ${input.amountUsd} USD`,
|
|
61
|
+
`Constraints: ${JSON.stringify(input.guardrails)}`,
|
|
62
|
+
`Return concise risk-aware rationale only.`,
|
|
63
|
+
].join("\n"),
|
|
64
|
+
fallbackFee,
|
|
65
|
+
});
|
|
66
|
+
const defaultQuery = JSON.stringify({
|
|
67
|
+
model,
|
|
68
|
+
task: "defi-planning-rationale",
|
|
69
|
+
messages: [
|
|
70
|
+
{
|
|
71
|
+
role: "system",
|
|
72
|
+
content: "You are a DeFi risk planner. Return concise rationale aligned to guardrails.",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
role: "user",
|
|
76
|
+
content: JSON.stringify({
|
|
77
|
+
intent: input.intent,
|
|
78
|
+
tokenIn: input.tokenIn,
|
|
79
|
+
tokenOut: input.tokenOut,
|
|
80
|
+
amountUsd: input.amountUsd,
|
|
81
|
+
constraints: input.guardrails,
|
|
82
|
+
}),
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
input: {
|
|
86
|
+
intent: input.intent,
|
|
87
|
+
tokenIn: input.tokenIn,
|
|
88
|
+
tokenOut: input.tokenOut,
|
|
89
|
+
amountUsd: input.amountUsd,
|
|
90
|
+
constraints: input.guardrails,
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const res = await fetch(computeUrl, {
|
|
94
|
+
method: "POST",
|
|
95
|
+
headers,
|
|
96
|
+
body: isStarterKitQuery ? starterKitQuery : defaultQuery,
|
|
97
|
+
});
|
|
98
|
+
if (!res.ok)
|
|
99
|
+
throw new Error(`status ${res.status}`);
|
|
100
|
+
const data = await res.json();
|
|
101
|
+
const rationale = data.response?.content?.trim()
|
|
102
|
+
|| data.rationale?.trim()
|
|
103
|
+
|| data.output_text?.trim()
|
|
104
|
+
|| data.text?.trim()
|
|
105
|
+
|| data.choices?.[0]?.message?.content?.trim();
|
|
106
|
+
if (!rationale)
|
|
107
|
+
throw new Error("missing rationale");
|
|
108
|
+
return {
|
|
109
|
+
used: true,
|
|
110
|
+
provider: "0g-compute",
|
|
111
|
+
rationale,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return {
|
|
116
|
+
used: false,
|
|
117
|
+
provider: "heuristic",
|
|
118
|
+
rationale: `Fallback heuristic plan for ${input.intent.toLowerCase()} (0G Compute unavailable).`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export async function buildStructuredPlan(input) {
|
|
123
|
+
const planId = `plan_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
124
|
+
const impactBps = estimateImpactBps(input.amountUsd);
|
|
125
|
+
const slippageCap = clamp(input.guardrails.maxSlippageBps, 5, 500);
|
|
126
|
+
const effectiveSlip = Math.max(impactBps, Math.min(slippageCap, impactBps + 20));
|
|
127
|
+
const expectedOutUsd = Number((input.amountUsd * (1 - impactBps / 10000)).toFixed(2));
|
|
128
|
+
const minOutUsd = Number((input.amountUsd * (1 - effectiveSlip / 10000)).toFixed(2));
|
|
129
|
+
const risk = evaluateRisk(input, impactBps);
|
|
130
|
+
const compute = await maybeComputeRationale(input);
|
|
131
|
+
return {
|
|
132
|
+
planId,
|
|
133
|
+
createdAt: Date.now(),
|
|
134
|
+
input,
|
|
135
|
+
steps: [
|
|
136
|
+
{ id: "s1", action: "quote", description: "Fetch route quote and verify token allowlist." },
|
|
137
|
+
{ id: "s2", action: "approve", description: `Set token approval cap to exact notional (${input.amountUsd} USD equivalent).` },
|
|
138
|
+
{ id: "s3", action: "swap", description: `Swap ${input.tokenIn} -> ${input.tokenOut} with max slippage ${input.guardrails.maxSlippageBps} bps.` },
|
|
139
|
+
{ id: "s4", action: "confirm", description: "Require explicit user confirmation before final transaction broadcast." },
|
|
140
|
+
],
|
|
141
|
+
constraints: input.guardrails,
|
|
142
|
+
risk,
|
|
143
|
+
preview: {
|
|
144
|
+
expectedOutUsd,
|
|
145
|
+
minOutUsd,
|
|
146
|
+
simulatedPriceImpactBps: impactBps,
|
|
147
|
+
route: [input.tokenIn, "USDC", input.tokenOut],
|
|
148
|
+
},
|
|
149
|
+
userApprovalRequired: true,
|
|
150
|
+
compute,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export function guardrailViolations(input) {
|
|
154
|
+
const violations = [];
|
|
155
|
+
if (!input.guardrails.tokenAllowlist.includes(input.tokenIn))
|
|
156
|
+
violations.push(`${input.tokenIn} is not in token allowlist.`);
|
|
157
|
+
if (!input.guardrails.tokenAllowlist.includes(input.tokenOut))
|
|
158
|
+
violations.push(`${input.tokenOut} is not in token allowlist.`);
|
|
159
|
+
if (input.amountUsd > input.guardrails.maxNotionalUsd)
|
|
160
|
+
violations.push(`Amount ${input.amountUsd} exceeds max notional ${input.guardrails.maxNotionalUsd}.`);
|
|
161
|
+
return violations;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=defai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defai.js","sourceRoot":"","sources":["../../src/lib/defai.ts"],"names":[],"mappings":"AAkDA,SAAS,KAAK,CAAC,GAAW,EAAE,GAAW,EAAE,GAAW;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,SAAS,IAAI,GAAG;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,KAAgB,EAAE,SAAiB;IACvD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,SAAS,GAAG,GAAG;QAAE,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IAC5F,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,GAAG,GAAG;QAAE,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC/F,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,GAAG,GAAG;QAAE,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAEhI,MAAM,KAAK,GACT,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAEzE,MAAM,WAAW,GACf,KAAK,KAAK,KAAK;QACb,CAAC,CAAC,gEAAgE;QAClE,CAAC,CAAC,KAAK,KAAK,QAAQ;YACpB,CAAC,CAAC,6EAA6E;YAC/E,CAAC,CAAC,sFAAsF,CAAC;IAE7F,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAgB;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,sBAAsB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,+BAA+B;SAC3F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,sBAAsB,CAAC;QAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;QACzD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC;QACxE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,MAAM,CAAC,CAAC;QAC1E,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAC/E,IAAI,SAAS;YAAE,OAAO,CAAC,aAAa,GAAG,UAAU,SAAS,EAAE,CAAC;QAE7D,4CAA4C;QAC5C,oCAAoC;QACpC,8BAA8B;QAC9B,6CAA6C;QAC7C,wDAAwD;QACxD,2CAA2C;QAC3C,yCAAyC;QACzC,oDAAoD;QACpD,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;QAC1F,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;YACrC,eAAe;YACf,KAAK,EAAE;gBACL,WAAW,KAAK,CAAC,MAAM,EAAE;gBACzB,SAAS,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,QAAQ,EAAE;gBAC7C,WAAW,KAAK,CAAC,SAAS,MAAM;gBAChC,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;gBAClD,2CAA2C;aAC5C,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;YAClC,KAAK;YACL,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,8EAA8E;iBACxF;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,WAAW,EAAE,KAAK,CAAC,UAAU;qBAC9B,CAAC;iBACH;aACF;YACD,KAAK,EAAE;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,WAAW,EAAE,KAAK,CAAC,UAAU;aAC9B;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;SACzD,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAO1B,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;eAC3C,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;eACtB,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;eACxB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;eACjB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAErD,OAAO;YACL,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,YAAY;YACtB,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,+BAA+B,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,4BAA4B;SACjG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAgB;IACxD,MAAM,MAAM,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC3F,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEnD,OAAO;QACL,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK;QACL,KAAK,EAAE;YACL,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,+CAA+C,EAAE;YAC3F,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,6CAA6C,KAAK,CAAC,SAAS,mBAAmB,EAAE;YAC7H,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,QAAQ,sBAAsB,KAAK,CAAC,UAAU,CAAC,cAAc,OAAO,EAAE;YACjJ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,wEAAwE,EAAE;SACvH;QACD,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,IAAI;QACJ,OAAO,EAAE;YACP,cAAc;YACd,SAAS;YACT,uBAAuB,EAAE,SAAS;YAClC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;SAC/C;QACD,oBAAoB,EAAE,IAAI;QAC1B,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAgB;IAClD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;IAC7H,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,6BAA6B,CAAC,CAAC;IAC/H,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc;QAAE,UAAU,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,SAAS,yBAAyB,KAAK,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,CAAC;IAC7J,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/build/mcp.d.ts
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* vault_status — Show vault status and session info
|
|
17
17
|
* vault_share — Store + generate share descriptor for another agent
|
|
18
18
|
* vault_import — Retrieve shared memory from another agent
|
|
19
|
+
* defai_plan — Intent -> structured DeFi plan with guardrails
|
|
20
|
+
* defai_approve — Explicit approval/rejection gate for a plan
|
|
19
21
|
*
|
|
20
22
|
* Tools (Shared Memory):
|
|
21
23
|
* memory_write — Write data to a named shared memory channel
|