@kalera/munin-openclaw 1.1.3 → 1.1.5

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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @kalera/munin-openclaw@1.1.3 build /home/runner/work/munin-for-agents/munin-for-agents/adapters/openclaw
2
+ > @kalera/munin-openclaw@1.1.5 build /home/runner/work/munin-for-agents/munin-for-agents/adapters/openclaw
3
3
  > tsc -p tsconfig.json
4
4
 
package/README.md CHANGED
@@ -1,21 +1,25 @@
1
- # Munin Adapter for OpenClaw
1
+ # Munin Plugin for OpenClaw
2
2
 
3
3
  ## Install
4
4
 
5
5
  ```bash
6
- pnpm --filter munin/openclaw build
6
+ openclaw plugins install @kalera/munin-openclaw
7
7
  ```
8
8
 
9
- ## Run
9
+ ## Configure
10
10
 
11
- ```bash
12
- MUNIN_BASE_URL=http://localhost:4000 \
13
- MUNIN_PROJECT=default \
14
- munin-openclaw capabilities
15
- ```
11
+ Set your Munin API Key and Context Core ID:
16
12
 
17
13
  ```bash
18
- MUNIN_BASE_URL=http://localhost:4000 \
19
- MUNIN_PROJECT=default \
20
- munin-openclaw search '{"query":"munin"}'
14
+ openclaw config set plugins.entries.munin-openclaw.config.apiKey "YOUR_API_KEY_HERE"
15
+ openclaw config set plugins.entries.munin-openclaw.config.projectId "YOUR_CONTEXT_CORE_ID"
21
16
  ```
17
+
18
+ ## Usage
19
+
20
+ This plugin natively registers 3 tools inside the OpenClaw agent:
21
+ - `munin_store_memory`
22
+ - `munin_retrieve_memory`
23
+ - `munin_search_memories`
24
+
25
+ The agent will automatically use them to persist and retrieve long-term context.
package/SKILL.md CHANGED
@@ -11,6 +11,13 @@ metadata:
11
11
 
12
12
  # 🐦 Munin: Reliable Memory for Your OpenClaw Agent
13
13
 
14
+ <CRITICAL-INSTRUCTION>
15
+ **HOW TO USE THIS SKILL**:
16
+ The `munin_store_memory`, `munin_retrieve_memory`, and `munin_search_memories` actions are registered as native tools (MCP).
17
+ You MUST call them using your standard tool-calling interface (e.g. `callTool("munin_search_memories", {...})`).
18
+ **DO NOT under any circumstances try to run them as shell commands or bash scripts.**
19
+ </CRITICAL-INSTRUCTION>
20
+
14
21
  Your agent forgets everything the moment you close the tab. You've seen the "pro" solutions—Mem0, Zep, LangMem—and you've seen their **$20/month** price tags.
15
22
 
16
23
  We think that's insane.
@@ -50,14 +57,13 @@ If your Munin project has **E2EE with GraphRAG** enabled, standard E2EE rules ap
50
57
  ## 🚀 Setup (Fast & Honest)
51
58
 
52
59
  1. **Get your Munin key:** Grab a **free** cloud key at [munin.kalera.dev](https://munin.kalera.dev).
53
- 2. **Configure OpenClaw:** Once installed via `openclaw plugins install @kalera/munin-openclaw`, you can set your API key directly via the OpenClaw CLI without manually editing any config files:
60
+ 2. **Configure OpenClaw:** Once installed via `openclaw plugins install @kalera/munin-openclaw`, you can set your API key and Context Core ID directly via the OpenClaw CLI without manually editing any config files:
54
61
 
55
62
  ```bash
56
63
  openclaw config set plugins.entries.munin-openclaw.config.apiKey "your-api-key-here"
64
+ openclaw config set plugins.entries.munin-openclaw.config.projectId "your-context-core-id"
57
65
  ```
58
- *(Alternatively, you can just set `MUNIN_BASE_URL` and `MUNIN_API_KEY` environment variables).*
59
-
60
- *(Note: Provide your agent with the `Context Core ID` in its system prompt so it knows which project to use when making tool calls).*
66
+ *(Alternatively, you can just set `MUNIN_BASE_URL`, `MUNIN_API_KEY`, and `MUNIN_PROJECT` environment variables).*
61
67
 
62
68
  3. **Profit:** Your agent now has long-term memory. No more repeating yourself.
63
69
 
package/dist/index.js CHANGED
@@ -3,41 +3,39 @@ import { Type } from "@sinclair/typebox";
3
3
  import { z } from "zod";
4
4
  export default {
5
5
  id: "munin-openclaw",
6
- name: "Munin ContextKeep",
6
+ name: "Munin",
7
7
  description: "Persistent memory tools for OpenClaw agents.",
8
8
  kind: "memory",
9
9
  configSchema: z.object({
10
10
  baseUrl: z
11
11
  .string()
12
12
  .default("https://munin.kalera.dev")
13
- .describe("The base URL for your Munin ContextKeep server."),
13
+ .describe("The base URL for your Munin server."),
14
14
  apiKey: z.string().optional().describe("Your API key for Munin."),
15
+ projectId: z.string().optional().describe("Your Context Core ID (e.g. proj_xxx)."),
15
16
  }),
16
17
  register(api) {
17
18
  const baseUrl = api.pluginConfig?.baseUrl ||
18
19
  process.env.MUNIN_BASE_URL ||
19
20
  "https://munin.kalera.dev";
20
21
  const apiKey = api.pluginConfig?.apiKey || process.env.MUNIN_API_KEY;
21
- if (!apiKey) {
22
- api.logger.warn("Munin API key is missing. ContextKeep tools will not be registered.");
22
+ const projectId = api.pluginConfig?.projectId || process.env.MUNIN_PROJECT;
23
+ if (!apiKey || !projectId) {
24
+ api.logger.warn("Munin apiKey or projectId is missing. Munin tools will not be registered.");
23
25
  return;
24
26
  }
25
27
  const client = new MuninClient({ baseUrl, apiKey });
26
28
  api.registerTool({
27
29
  name: "munin_store_memory",
28
30
  label: "Store Munin Memory",
29
- description: "Store a new memory or update an existing one in ContextKeep.",
31
+ description: "Store a new memory or update an existing one in Munin.",
30
32
  parameters: Type.Object({
31
- projectId: Type.String({
32
- description: "The Context Core ID for isolation.",
33
- }),
34
33
  key: Type.String({ description: "Unique identifier for the memory." }),
35
34
  content: Type.String({ description: "The content of the memory." }),
36
35
  tags: Type.Optional(Type.String({ description: "Comma-separated list of tags." })),
37
36
  title: Type.Optional(Type.String({ description: "Human-readable title." })),
38
37
  }),
39
- async execute(_toolCallId, params) {
40
- const { projectId, ...payload } = params;
38
+ async execute(_toolCallId, payload) {
41
39
  const res = await client.invoke(projectId, "store", payload);
42
40
  return {
43
41
  content: [
@@ -53,15 +51,14 @@ export default {
53
51
  api.registerTool({
54
52
  name: "munin_retrieve_memory",
55
53
  label: "Retrieve Munin Memory",
56
- description: "Retrieve a memory by its key from ContextKeep.",
54
+ description: "Retrieve a memory by its key from Munin.",
57
55
  parameters: Type.Object({
58
- projectId: Type.String({ description: "The Context Core ID." }),
59
56
  key: Type.String({
60
57
  description: "The unique identifier of the memory.",
61
58
  }),
62
59
  }),
63
60
  async execute(_toolCallId, params) {
64
- const { projectId, key } = params;
61
+ const { key } = params;
65
62
  const res = await client.invoke(projectId, "retrieve", { key });
66
63
  return {
67
64
  content: [
@@ -77,13 +74,12 @@ export default {
77
74
  api.registerTool({
78
75
  name: "munin_search_memories",
79
76
  label: "Search Munin Memories",
80
- description: "Search for memories by key, title, or content in ContextKeep.",
77
+ description: "Search for memories by key, title, or content in Munin.",
81
78
  parameters: Type.Object({
82
- projectId: Type.String({ description: "The Context Core ID." }),
83
79
  query: Type.String({ description: "The search term." }),
84
80
  }),
85
81
  async execute(_toolCallId, params) {
86
- const { projectId, query } = params;
82
+ const { query } = params;
87
83
  const res = await client.invoke(projectId, "search", { query });
88
84
  return {
89
85
  content: [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "munin-openclaw",
3
- "name": "Munin ContextKeep",
3
+ "name": "Munin",
4
4
  "description": "Persistent memory and Context Core for OpenClaw agents.",
5
5
  "kind": "memory",
6
6
  "configSchema": {
@@ -10,11 +10,15 @@
10
10
  "baseUrl": {
11
11
  "type": "string",
12
12
  "default": "https://munin.kalera.dev",
13
- "description": "The base URL for your Munin ContextKeep server."
13
+ "description": "The base URL for your Munin server."
14
14
  },
15
15
  "apiKey": {
16
16
  "type": "string",
17
17
  "description": "Your API key for Munin."
18
+ },
19
+ "projectId": {
20
+ "type": "string",
21
+ "description": "Your Context Core ID (e.g. proj_xxx)."
18
22
  }
19
23
  }
20
24
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kalera/munin-openclaw",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "type": "module",
5
5
  "openclaw": {
6
6
  "extensions": [
@@ -16,8 +16,8 @@
16
16
  "dependencies": {
17
17
  "@sinclair/typebox": "^0.34.49",
18
18
  "zod": "^4.3.6",
19
- "@kalera/munin-sdk": "1.0.0",
20
- "@kalera/munin-runtime": "1.0.0"
19
+ "@kalera/munin-sdk": "1.0.1",
20
+ "@kalera/munin-runtime": "1.0.1"
21
21
  },
22
22
  "devDependencies": {
23
23
  "openclaw": "^2026.3.28",
package/postinstall.js CHANGED
@@ -1,6 +1,7 @@
1
1
  console.log('\n\x1b[36m=================================================================\x1b[0m');
2
- console.log('\x1b[36m\x1b[1m🐦 Munin ContextKeep successfully installed for OpenClaw!\x1b[0m');
2
+ console.log('\x1b[36m\x1b[1m🐦 Munin successfully installed for OpenClaw!\x1b[0m');
3
3
  console.log('\x1b[36m=================================================================\x1b[0m\n');
4
4
  console.log('To activate your Munin Memory plugin, set your API key by running:\n');
5
- console.log('\x1b[33m openclaw config set plugins.entries.munin-openclaw.config.apiKey "YOUR_API_KEY_HERE"\x1b[0m\n');
5
+ console.log('\x1b[33m openclaw config set plugins.entries.munin-openclaw.config.apiKey "YOUR_API_KEY_HERE"\x1b[0m');
6
+ console.log('\x1b[33m openclaw config set plugins.entries.munin-openclaw.config.projectId "YOUR_CONTEXT_CORE_ID"\x1b[0m\n');
6
7
  console.log('Get your free API key at: \x1b[32mhttps://munin.kalera.dev\x1b[0m\n');
package/src/index.ts CHANGED
@@ -4,15 +4,16 @@ import { z } from "zod";
4
4
 
5
5
  export default {
6
6
  id: "munin-openclaw",
7
- name: "Munin ContextKeep",
7
+ name: "Munin",
8
8
  description: "Persistent memory tools for OpenClaw agents.",
9
9
  kind: "memory",
10
10
  configSchema: z.object({
11
11
  baseUrl: z
12
12
  .string()
13
13
  .default("https://munin.kalera.dev")
14
- .describe("The base URL for your Munin ContextKeep server."),
14
+ .describe("The base URL for your Munin server."),
15
15
  apiKey: z.string().optional().describe("Your API key for Munin."),
16
+ projectId: z.string().optional().describe("Your Context Core ID (e.g. proj_xxx)."),
16
17
  }) as any,
17
18
  register(api: any) {
18
19
  const baseUrl =
@@ -21,10 +22,12 @@ export default {
21
22
  "https://munin.kalera.dev";
22
23
  const apiKey =
23
24
  (api.pluginConfig?.apiKey as string) || process.env.MUNIN_API_KEY;
25
+ const projectId =
26
+ (api.pluginConfig?.projectId as string) || process.env.MUNIN_PROJECT;
24
27
 
25
- if (!apiKey) {
28
+ if (!apiKey || !projectId) {
26
29
  api.logger.warn(
27
- "Munin API key is missing. ContextKeep tools will not be registered.",
30
+ "Munin apiKey or projectId is missing. Munin tools will not be registered.",
28
31
  );
29
32
  return;
30
33
  }
@@ -34,11 +37,8 @@ export default {
34
37
  api.registerTool({
35
38
  name: "munin_store_memory",
36
39
  label: "Store Munin Memory",
37
- description: "Store a new memory or update an existing one in ContextKeep.",
40
+ description: "Store a new memory or update an existing one in Munin.",
38
41
  parameters: Type.Object({
39
- projectId: Type.String({
40
- description: "The Context Core ID for isolation.",
41
- }),
42
42
  key: Type.String({ description: "Unique identifier for the memory." }),
43
43
  content: Type.String({ description: "The content of the memory." }),
44
44
  tags: Type.Optional(
@@ -48,8 +48,7 @@ export default {
48
48
  Type.String({ description: "Human-readable title." }),
49
49
  ),
50
50
  }),
51
- async execute(_toolCallId: string, params: any) {
52
- const { projectId, ...payload } = params;
51
+ async execute(_toolCallId: string, payload: any) {
53
52
  const res = await client.invoke(projectId, "store", payload);
54
53
  return {
55
54
  content: [
@@ -66,15 +65,14 @@ export default {
66
65
  api.registerTool({
67
66
  name: "munin_retrieve_memory",
68
67
  label: "Retrieve Munin Memory",
69
- description: "Retrieve a memory by its key from ContextKeep.",
68
+ description: "Retrieve a memory by its key from Munin.",
70
69
  parameters: Type.Object({
71
- projectId: Type.String({ description: "The Context Core ID." }),
72
70
  key: Type.String({
73
71
  description: "The unique identifier of the memory.",
74
72
  }),
75
73
  }),
76
74
  async execute(_toolCallId: string, params: any) {
77
- const { projectId, key } = params;
75
+ const { key } = params;
78
76
  const res = await client.invoke(projectId, "retrieve", { key });
79
77
  return {
80
78
  content: [
@@ -91,13 +89,12 @@ export default {
91
89
  api.registerTool({
92
90
  name: "munin_search_memories",
93
91
  label: "Search Munin Memories",
94
- description: "Search for memories by key, title, or content in ContextKeep.",
92
+ description: "Search for memories by key, title, or content in Munin.",
95
93
  parameters: Type.Object({
96
- projectId: Type.String({ description: "The Context Core ID." }),
97
94
  query: Type.String({ description: "The search term." }),
98
95
  }),
99
96
  async execute(_toolCallId: string, params: any) {
100
- const { projectId, query } = params;
97
+ const { query } = params;
101
98
  const res = await client.invoke(projectId, "search", { query });
102
99
  return {
103
100
  content: [