@kalera/munin-openclaw 0.1.0 → 1.0.1
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/.turbo/turbo-build.log +1 -1
- package/SKILL.md +19 -11
- package/dist/cli.js +4 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -1
- package/package.json +4 -4
- package/src/cli.ts +2 -2
- package/src/index.ts +3 -3
package/.turbo/turbo-build.log
CHANGED
package/SKILL.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "@kalera/munin-openclaw"
|
|
3
|
-
description: "Munin - The $1.6/mo Persistent Memory for OpenClaw. Stop your agent from having Alzheimer's."
|
|
4
|
-
version: "
|
|
3
|
+
description: "Munin - The Free (or $1.6/mo) Persistent Memory for OpenClaw. Stop your agent from having Alzheimer's."
|
|
4
|
+
version: "1.0.0"
|
|
5
5
|
metadata:
|
|
6
6
|
clawdbot:
|
|
7
7
|
type: "plugin"
|
|
8
8
|
permissions:
|
|
9
|
-
env: ["MUNIN_BASE_URL", "
|
|
9
|
+
env: ["MUNIN_BASE_URL", "MUNIN_API_KEY"]
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# 🐦 Munin: Reliable Memory for Your OpenClaw Agent
|
|
@@ -15,15 +15,15 @@ Your agent forgets everything the moment you close the tab. You've seen the "pro
|
|
|
15
15
|
|
|
16
16
|
We think that's insane.
|
|
17
17
|
|
|
18
|
-
**Munin
|
|
18
|
+
**Munin** is the pragmatic alternative. It’s the "Reliable Friend" that sits on your agent’s shoulder and whispers: *"Hey, remember when pa Kal said he preferred Python over Node last week?"*
|
|
19
19
|
|
|
20
20
|
### 💰 Why Munin? (The "No-Brainer" Math)
|
|
21
21
|
|
|
22
22
|
| Feature | Mem0 / Zep | **Munin** |
|
|
23
23
|
| :--- | :--- | :--- |
|
|
24
|
-
| **Monthly Cost** | $19.00 - $249.00 |
|
|
24
|
+
| **Monthly Cost** | $19.00 - $249.00 | **Free** (or $1.60 Pro) |
|
|
25
25
|
| **MCP Support** | Mixed | **Native / First-class** |
|
|
26
|
-
| **
|
|
26
|
+
| **Zero-Knowledge E2EE** | Optional / Complex | **Built-in (Client-side)** |
|
|
27
27
|
| **Bullshit Factor** | High (Enterprise-synergy) | **Zero (Developer-first)** |
|
|
28
28
|
|
|
29
29
|
**That’s a 10x - 150x price gap.** We aren't building "Enterprise Synergy Platforms". We're building a notebook for your AI.
|
|
@@ -33,22 +33,30 @@ We think that's insane.
|
|
|
33
33
|
## 🔒 Security & Privacy
|
|
34
34
|
|
|
35
35
|
**Trust Statement:**
|
|
36
|
-
Data stays where you tell it to stay.
|
|
36
|
+
Data stays where you tell it to stay. All data is encrypted locally (if E2EE is enabled) and isolated by your Context Core. We are completely blind to your plaintext.
|
|
37
37
|
|
|
38
38
|
**External Endpoints:**
|
|
39
39
|
Data is sent ONLY to your `MUNIN_BASE_URL`. We don't phone home. We don't sell your "memories" to train models.
|
|
40
40
|
|
|
41
|
+
## 💎 E2EE with GraphRAG (Elite Tier)
|
|
42
|
+
|
|
43
|
+
If your Munin project has **E2EE with GraphRAG** enabled, standard E2EE rules apply PLUS:
|
|
44
|
+
- You **MUST** generate a vector embedding of the plaintext content locally before encrypting.
|
|
45
|
+
- You **MUST** include the embedding array in the `store` payload: `{ "content": "encrypted...", "embedding": [0.1, -0.02, ...], "encryptionMeta": {...} }`.
|
|
46
|
+
- Munin will use this vector for zero-knowledge semantic search. It will reject the request if the embedding is missing.
|
|
47
|
+
|
|
41
48
|
---
|
|
42
49
|
|
|
43
50
|
## 🚀 Setup (Fast & Honest)
|
|
44
51
|
|
|
45
|
-
1. **Get your Munin
|
|
52
|
+
1. **Get your Munin key:** Grab a **free** cloud key at [munin.kalera.dev](https://munin.kalera.dev).
|
|
46
53
|
2. **Configure OpenClaw:** Add these to your `.env` or agent config:
|
|
47
|
-
- `MUNIN_BASE_URL`: Where your Munin lives (e.g., `https://
|
|
48
|
-
- `MUNIN_PROJECT`: Your project name (e.g., `research-agent`).
|
|
54
|
+
- `MUNIN_BASE_URL`: Where your Munin lives (e.g., `https://munin.kalera.dev`).
|
|
49
55
|
- `MUNIN_API_KEY`: Your key to the kingdom.
|
|
50
56
|
|
|
57
|
+
*(Note: Provide your agent with the `Context Core ID` in its system prompt so it knows which project to use when making tool calls).*
|
|
58
|
+
|
|
51
59
|
3. **Profit:** Your agent now has long-term memory. No more repeating yourself.
|
|
52
60
|
|
|
53
61
|
---
|
|
54
|
-
*Built with ❤️ by Kalera for the OpenClaw Ecosystem.*
|
|
62
|
+
*Built with ❤️ by Kalera for the OpenClaw Ecosystem.*
|
package/dist/cli.js
CHANGED
|
@@ -13,14 +13,16 @@ async function main() {
|
|
|
13
13
|
const adapter = createOpenClawMuninAdapter({
|
|
14
14
|
baseUrl: env.baseUrl,
|
|
15
15
|
apiKey: env.apiKey,
|
|
16
|
-
project: env.project,
|
|
17
16
|
timeoutMs: env.timeoutMs,
|
|
18
17
|
});
|
|
19
18
|
const result = await executeWithRetry(async () => {
|
|
20
19
|
if (action === "capabilities") {
|
|
21
20
|
return { ok: true, data: await adapter.capabilities() };
|
|
22
21
|
}
|
|
23
|
-
|
|
22
|
+
const { projectId, ...p } = payload;
|
|
23
|
+
if (!projectId)
|
|
24
|
+
throw new Error("projectId required in payload");
|
|
25
|
+
return adapter.execute(projectId, action, p);
|
|
24
26
|
}, env.retries, env.backoffMs);
|
|
25
27
|
console.log(JSON.stringify(result, null, 2));
|
|
26
28
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
export declare function createOpenClawMuninAdapter(config: {
|
|
2
2
|
baseUrl: string;
|
|
3
3
|
apiKey?: string;
|
|
4
|
-
project: string;
|
|
5
4
|
timeoutMs?: number;
|
|
6
5
|
}): {
|
|
7
|
-
execute: (action: string, payload: Record<string, unknown>) => Promise<import("@kalera/munin-sdk").MuninResponse<unknown>>;
|
|
6
|
+
execute: (projectId: string, action: string, payload: Record<string, unknown>) => Promise<import("@kalera/munin-sdk").MuninResponse<unknown>>;
|
|
8
7
|
capabilities: () => Promise<import("@kalera/munin-sdk").MuninCapabilities>;
|
|
9
8
|
};
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { MuninClient } from "@kalera/munin-sdk";
|
|
|
2
2
|
export function createOpenClawMuninAdapter(config) {
|
|
3
3
|
const client = new MuninClient(config);
|
|
4
4
|
return {
|
|
5
|
-
execute: (action, payload) => client.invoke(action, payload, { ensureCapability: true }),
|
|
5
|
+
execute: (projectId, action, payload) => client.invoke(projectId, action, payload, { ensureCapability: true }),
|
|
6
6
|
capabilities: () => client.capabilities(),
|
|
7
7
|
};
|
|
8
8
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kalera/munin-openclaw",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"openclaw": {
|
|
6
6
|
"extensions": [
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"requires": {
|
|
10
10
|
"env": [
|
|
11
11
|
"MUNIN_BASE_URL",
|
|
12
|
-
"
|
|
12
|
+
"MUNIN_API_KEY"
|
|
13
13
|
]
|
|
14
14
|
}
|
|
15
15
|
},
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"munin-openclaw": "dist/cli.js"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@kalera/munin-sdk": "
|
|
21
|
-
"@kalera/munin-runtime": "
|
|
20
|
+
"@kalera/munin-sdk": "1.0.0",
|
|
21
|
+
"@kalera/munin-runtime": "1.0.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"typescript": "^5.9.2"
|
package/src/cli.ts
CHANGED
|
@@ -26,7 +26,7 @@ async function main() {
|
|
|
26
26
|
const adapter = createOpenClawMuninAdapter({
|
|
27
27
|
baseUrl: env.baseUrl,
|
|
28
28
|
apiKey: env.apiKey,
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
timeoutMs: env.timeoutMs,
|
|
31
31
|
});
|
|
32
32
|
|
|
@@ -34,7 +34,7 @@ async function main() {
|
|
|
34
34
|
if (action === "capabilities") {
|
|
35
35
|
return { ok: true, data: await adapter.capabilities() };
|
|
36
36
|
}
|
|
37
|
-
return adapter.execute(action,
|
|
37
|
+
const { projectId, ...p } = payload; if (!projectId) throw new Error("projectId required in payload"); return adapter.execute(projectId as string, action, p);
|
|
38
38
|
}, env.retries, env.backoffMs);
|
|
39
39
|
|
|
40
40
|
console.log(JSON.stringify(result, null, 2));
|
package/src/index.ts
CHANGED
|
@@ -3,14 +3,14 @@ import { MuninClient } from "@kalera/munin-sdk";
|
|
|
3
3
|
export function createOpenClawMuninAdapter(config: {
|
|
4
4
|
baseUrl: string;
|
|
5
5
|
apiKey?: string;
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
timeoutMs?: number;
|
|
8
8
|
}) {
|
|
9
9
|
const client = new MuninClient(config);
|
|
10
10
|
|
|
11
11
|
return {
|
|
12
|
-
execute: (action: string, payload: Record<string, unknown>) =>
|
|
13
|
-
client.invoke(action as any, payload, { ensureCapability: true }),
|
|
12
|
+
execute: (projectId: string, action: string, payload: Record<string, unknown>) =>
|
|
13
|
+
client.invoke(projectId, action as any, payload, { ensureCapability: true }),
|
|
14
14
|
capabilities: () => client.capabilities(),
|
|
15
15
|
};
|
|
16
16
|
}
|