squish-memory 0.9.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/{.env.mcp → .env.mcp.example} +23 -0
  2. package/CHANGELOG.md +102 -0
  3. package/QUICK-START.md +10 -4
  4. package/README.md +73 -4
  5. package/config/plugin-manifest.json +152 -0
  6. package/config/plugin-manifest.schema.json +244 -0
  7. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.d.ts +1 -1
  8. package/dist/algorithms/analytics/token-estimator.d.ts.map +1 -0
  9. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.js +3 -3
  10. package/dist/algorithms/analytics/token-estimator.js.map +1 -0
  11. package/dist/algorithms/detection/hash-filters.d.ts.map +1 -0
  12. package/dist/algorithms/detection/hash-filters.js.map +1 -0
  13. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.d.ts +1 -1
  14. package/dist/algorithms/detection/semantic-ranker.d.ts.map +1 -0
  15. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.js +1 -1
  16. package/dist/algorithms/detection/semantic-ranker.js.map +1 -0
  17. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.d.ts +1 -1
  18. package/dist/algorithms/detection/two-stage-detector.d.ts.map +1 -0
  19. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.js +4 -4
  20. package/dist/algorithms/detection/two-stage-detector.js.map +1 -0
  21. package/dist/algorithms/handlers/approve-merge.d.ts.map +1 -0
  22. package/dist/algorithms/{merge/handlers → handlers}/approve-merge.js +4 -4
  23. package/dist/algorithms/handlers/approve-merge.js.map +1 -0
  24. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.d.ts +1 -1
  25. package/dist/algorithms/handlers/detect-duplicates.d.ts.map +1 -0
  26. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.js +55 -75
  27. package/dist/algorithms/handlers/detect-duplicates.js.map +1 -0
  28. package/dist/algorithms/handlers/get-stats.d.ts.map +1 -0
  29. package/dist/algorithms/{merge/handlers → handlers}/get-stats.js +3 -3
  30. package/dist/algorithms/handlers/get-stats.js.map +1 -0
  31. package/dist/algorithms/handlers/list-proposals.d.ts.map +1 -0
  32. package/dist/algorithms/{merge/handlers → handlers}/list-proposals.js +3 -3
  33. package/dist/algorithms/handlers/list-proposals.js.map +1 -0
  34. package/dist/algorithms/handlers/preview-merge.d.ts.map +1 -0
  35. package/dist/algorithms/{merge/handlers → handlers}/preview-merge.js +3 -3
  36. package/dist/algorithms/handlers/preview-merge.js.map +1 -0
  37. package/dist/algorithms/handlers/reject-merge.d.ts.map +1 -0
  38. package/dist/algorithms/{merge/handlers → handlers}/reject-merge.js +3 -3
  39. package/dist/algorithms/handlers/reject-merge.js.map +1 -0
  40. package/dist/algorithms/handlers/reverse-merge.d.ts.map +1 -0
  41. package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.js +3 -3
  42. package/dist/algorithms/handlers/reverse-merge.js.map +1 -0
  43. package/dist/algorithms/{merge/safety → safety}/safety-checks.d.ts +1 -1
  44. package/dist/algorithms/safety/safety-checks.d.ts.map +1 -0
  45. package/dist/algorithms/safety/safety-checks.js +179 -0
  46. package/dist/algorithms/safety/safety-checks.js.map +1 -0
  47. package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.d.ts +1 -1
  48. package/dist/algorithms/strategies/merge-strategies.d.ts.map +1 -0
  49. package/dist/algorithms/strategies/merge-strategies.js.map +1 -0
  50. package/dist/algorithms/utils/response-builder.d.ts +28 -0
  51. package/dist/algorithms/utils/response-builder.d.ts.map +1 -0
  52. package/dist/algorithms/utils/response-builder.js +37 -0
  53. package/dist/algorithms/utils/response-builder.js.map +1 -0
  54. package/dist/api/web/web.d.ts.map +1 -1
  55. package/dist/api/web/web.js +0 -21
  56. package/dist/api/web/web.js.map +1 -1
  57. package/dist/commands/mcp-server.js +1 -1
  58. package/dist/config.d.ts +9 -1
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +35 -32
  61. package/dist/config.js.map +1 -1
  62. package/dist/core/associations.js +2 -2
  63. package/dist/core/associations.js.map +1 -1
  64. package/dist/core/core-memory.d.ts +5 -0
  65. package/dist/core/core-memory.d.ts.map +1 -1
  66. package/dist/core/core-memory.js +17 -5
  67. package/dist/core/core-memory.js.map +1 -1
  68. package/dist/core/embeddings.d.ts +9 -0
  69. package/dist/core/embeddings.d.ts.map +1 -1
  70. package/dist/core/embeddings.js +153 -16
  71. package/dist/core/embeddings.js.map +1 -1
  72. package/dist/core/layers/generator.d.ts +25 -0
  73. package/dist/core/layers/generator.d.ts.map +1 -0
  74. package/dist/core/layers/generator.js +76 -0
  75. package/dist/core/layers/generator.js.map +1 -0
  76. package/dist/core/mcp/tools.d.ts.map +1 -1
  77. package/dist/core/mcp/tools.js +71 -0
  78. package/dist/core/mcp/tools.js.map +1 -1
  79. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  80. package/dist/core/memory/hybrid-retrieval.js +49 -1
  81. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  82. package/dist/core/memory/hybrid-search.d.ts.map +1 -1
  83. package/dist/core/memory/hybrid-search.js +0 -7
  84. package/dist/core/memory/hybrid-search.js.map +1 -1
  85. package/dist/core/memory/memories.d.ts.map +1 -1
  86. package/dist/core/memory/memories.js +47 -53
  87. package/dist/core/memory/memories.js.map +1 -1
  88. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -1
  89. package/dist/core/memory/progressive-disclosure.js.map +1 -1
  90. package/dist/core/namespaces/index.d.ts +71 -0
  91. package/dist/core/namespaces/index.d.ts.map +1 -0
  92. package/dist/core/namespaces/index.js +296 -0
  93. package/dist/core/namespaces/index.js.map +1 -0
  94. package/dist/core/namespaces/uri-parser.d.ts +31 -0
  95. package/dist/core/namespaces/uri-parser.d.ts.map +1 -0
  96. package/dist/core/namespaces/uri-parser.js +74 -0
  97. package/dist/core/namespaces/uri-parser.js.map +1 -0
  98. package/dist/core/observations.d.ts.map +1 -1
  99. package/dist/core/observations.js +3 -12
  100. package/dist/core/observations.js.map +1 -1
  101. package/dist/core/projects.d.ts.map +1 -1
  102. package/dist/core/projects.js +0 -12
  103. package/dist/core/projects.js.map +1 -1
  104. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -1
  105. package/dist/core/scheduler/cron-scheduler.js +14 -0
  106. package/dist/core/scheduler/cron-scheduler.js.map +1 -1
  107. package/dist/core/session-hooks/self-iteration-job.d.ts +20 -0
  108. package/dist/core/session-hooks/self-iteration-job.d.ts.map +1 -0
  109. package/dist/core/session-hooks/self-iteration-job.js +278 -0
  110. package/dist/core/session-hooks/self-iteration-job.js.map +1 -0
  111. package/dist/core/session-hooks/session-hooks.d.ts +18 -0
  112. package/dist/core/session-hooks/session-hooks.d.ts.map +1 -0
  113. package/dist/core/session-hooks/session-hooks.js +55 -0
  114. package/dist/core/session-hooks/session-hooks.js.map +1 -0
  115. package/dist/core/tracing/collector.d.ts +111 -0
  116. package/dist/core/tracing/collector.d.ts.map +1 -0
  117. package/dist/core/tracing/collector.js +338 -0
  118. package/dist/core/tracing/collector.js.map +1 -0
  119. package/dist/core/tracing/visualizer.d.ts +32 -0
  120. package/dist/core/tracing/visualizer.d.ts.map +1 -0
  121. package/dist/core/tracing/visualizer.js +165 -0
  122. package/dist/core/tracing/visualizer.js.map +1 -0
  123. package/dist/db/bootstrap.d.ts.map +1 -1
  124. package/dist/db/bootstrap.js +33 -6
  125. package/dist/db/bootstrap.js.map +1 -1
  126. package/dist/drizzle/schema-sqlite.d.ts +401 -0
  127. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  128. package/dist/drizzle/schema-sqlite.js +66 -0
  129. package/dist/drizzle/schema-sqlite.js.map +1 -1
  130. package/dist/drizzle/schema.d.ts +385 -0
  131. package/dist/drizzle/schema.d.ts.map +1 -1
  132. package/dist/drizzle/schema.js +64 -0
  133. package/dist/drizzle/schema.js.map +1 -1
  134. package/dist/index.d.ts +4 -4
  135. package/dist/index.js +101 -62
  136. package/dist/index.js.map +1 -1
  137. package/generated/mcp/manifest.json +23 -0
  138. package/generated/mcp/mcp-servers.json +25 -0
  139. package/generated/mcp/mcporter.json +34 -0
  140. package/generated/mcp/openclaw-memory-qmd.json +17 -0
  141. package/generated/mcp/runtime.json +12 -0
  142. package/package.json +68 -26
  143. package/packages/plugin-claude-code/README.md +73 -0
  144. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +35 -0
  145. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +1 -0
  146. package/packages/plugin-claude-code/dist/plugin-wrapper.js +191 -0
  147. package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +1 -0
  148. package/packages/plugin-claude-code/package.json +31 -0
  149. package/packages/plugin-openclaw/README.md +70 -0
  150. package/packages/plugin-openclaw/dist/index.d.ts +49 -0
  151. package/packages/plugin-openclaw/dist/index.d.ts.map +1 -0
  152. package/packages/plugin-openclaw/dist/index.js +262 -0
  153. package/packages/plugin-openclaw/dist/index.js.map +1 -0
  154. package/packages/plugin-openclaw/openclaw.plugin.json +94 -0
  155. package/packages/plugin-openclaw/package.json +31 -0
  156. package/packages/plugin-opencode/install.mjs +217 -0
  157. package/packages/plugin-opencode/package.json +21 -0
  158. package/scripts/build-release.sh +20 -17
  159. package/scripts/check-secrets.js +132 -0
  160. package/scripts/dependency-manager.mjs +217 -0
  161. package/scripts/detect-clients.mjs +78 -0
  162. package/scripts/github-release.sh +43 -27
  163. package/scripts/install-interactive.mjs +674 -0
  164. package/scripts/install-plugin.mjs +415 -0
  165. package/scripts/test-interactive.mjs +131 -0
  166. package/commands/managed-sync.ts +0 -69
  167. package/commands/mcp-server.ts +0 -519
  168. package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +0 -1
  169. package/dist/algorithms/merge/analytics/token-estimator.js.map +0 -1
  170. package/dist/algorithms/merge/detection/hash-filters.d.ts.map +0 -1
  171. package/dist/algorithms/merge/detection/hash-filters.js.map +0 -1
  172. package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +0 -1
  173. package/dist/algorithms/merge/detection/semantic-ranker.js.map +0 -1
  174. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +0 -1
  175. package/dist/algorithms/merge/detection/two-stage-detector.js.map +0 -1
  176. package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +0 -1
  177. package/dist/algorithms/merge/handlers/approve-merge.js.map +0 -1
  178. package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +0 -1
  179. package/dist/algorithms/merge/handlers/detect-duplicates.js.map +0 -1
  180. package/dist/algorithms/merge/handlers/get-stats.d.ts.map +0 -1
  181. package/dist/algorithms/merge/handlers/get-stats.js.map +0 -1
  182. package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +0 -1
  183. package/dist/algorithms/merge/handlers/list-proposals.js.map +0 -1
  184. package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +0 -1
  185. package/dist/algorithms/merge/handlers/preview-merge.js.map +0 -1
  186. package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +0 -1
  187. package/dist/algorithms/merge/handlers/reject-merge.js.map +0 -1
  188. package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +0 -1
  189. package/dist/algorithms/merge/handlers/reverse-merge.js.map +0 -1
  190. package/dist/algorithms/merge/safety/safety-checks.d.ts.map +0 -1
  191. package/dist/algorithms/merge/safety/safety-checks.js +0 -215
  192. package/dist/algorithms/merge/safety/safety-checks.js.map +0 -1
  193. package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +0 -1
  194. package/dist/algorithms/merge/strategies/merge-strategies.js.map +0 -1
  195. package/dist/core/embeddings/qmd-provider.d.ts +0 -65
  196. package/dist/core/embeddings/qmd-provider.d.ts.map +0 -1
  197. package/dist/core/embeddings/qmd-provider.js +0 -133
  198. package/dist/core/embeddings/qmd-provider.js.map +0 -1
  199. package/scripts/init-dirs.ts +0 -15
  200. /package/dist/algorithms/{merge/detection → detection}/hash-filters.d.ts +0 -0
  201. /package/dist/algorithms/{merge/detection → detection}/hash-filters.js +0 -0
  202. /package/dist/algorithms/{merge/handlers → handlers}/approve-merge.d.ts +0 -0
  203. /package/dist/algorithms/{merge/handlers → handlers}/get-stats.d.ts +0 -0
  204. /package/dist/algorithms/{merge/handlers → handlers}/list-proposals.d.ts +0 -0
  205. /package/dist/algorithms/{merge/handlers → handlers}/preview-merge.d.ts +0 -0
  206. /package/dist/algorithms/{merge/handlers → handlers}/reject-merge.d.ts +0 -0
  207. /package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.d.ts +0 -0
  208. /package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.js +0 -0
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code Plugin: Squish Memory Integration
4
+ *
5
+ * Hooks:
6
+ * - SessionStart: Initialize memory session
7
+ * - UserPromptSubmit: Capture user input as memory
8
+ * - PostToolUse: Capture tool usage as observations
9
+ * - SessionEnd: Summarize session
10
+ */
11
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
12
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
13
+ import path from "node:path";
14
+ import os from "node:os";
15
+ import { pathToFileURL } from "node:url";
16
+ class ClaudeCodeSquishPlugin {
17
+ client = null;
18
+ sessionId = "";
19
+ workspaceDir;
20
+ debounceTimer = null;
21
+ recentMemories = [];
22
+ constructor() {
23
+ this.workspaceDir = process.env.CLAUDE_WORKING_DIRECTORY || process.cwd();
24
+ }
25
+ async initialize() {
26
+ console.log("[SquishPlugin] Claude Code plugin initializing...");
27
+ // Connect to Squish MCP (assumes Squish is running)
28
+ await this.connectToSquish();
29
+ // Register hooks
30
+ this.registerHooks();
31
+ console.log("[SquishPlugin] ✓ Plugin ready");
32
+ }
33
+ async connectToSquish() {
34
+ // Check if Squish is running as MCP server (stdio mode expected)
35
+ // In Claude Code plugin mode, Squish should already be running
36
+ // We'll spawn a separate connection or use existing if available
37
+ this.client = new Client({ name: "claude-squish-plugin", version: "1.0.0" }, { capabilities: {} });
38
+ // Connect via stdio to Squish MCP server
39
+ // Squish should be running: squish-mcp --stdio
40
+ const transport = new StdioClientTransport({
41
+ command: process.env.SQUISH_COMMAND || "squish-mcp",
42
+ args: ["--stdio"],
43
+ env: {
44
+ ...process.env,
45
+ SQUISH_MODE: "local",
46
+ SQUISH_DATA_DIR: process.env.SQUISH_DATA_DIR || path.join(os.homedir(), ".squish", "claude")
47
+ }
48
+ });
49
+ try {
50
+ await this.client.connect(transport);
51
+ console.log("[SquishPlugin] Connected to Squish MCP");
52
+ }
53
+ catch (error) {
54
+ console.error("[SquishPlugin] Failed to connect to Squish:", error?.message || error);
55
+ throw error;
56
+ }
57
+ }
58
+ registerHooks() {
59
+ // Hook: SessionStart
60
+ this.onSessionStart();
61
+ // Hook: UserPromptSubmit (via environment or stdin monitoring)
62
+ this.onUserPromptSubmit();
63
+ // Hook: PostToolUse
64
+ this.onPostToolUse();
65
+ // Hook: SessionEnd
66
+ this.onSessionEnd();
67
+ }
68
+ async onSessionStart() {
69
+ this.sessionId = `session-${Date.now()}-${Math.random().toString(36).substring(7)}`;
70
+ console.log("[SquishPlugin] Session started:", this.sessionId);
71
+ // Store session start observation
72
+ await this.observe("session_start", "Claude Code session started", {
73
+ sessionId: this.sessionId,
74
+ workspace: this.workspaceDir,
75
+ timestamp: new Date().toISOString()
76
+ });
77
+ }
78
+ async onUserPromptSubmit() {
79
+ // In Claude Code plugin system, we receive prompts via stdin
80
+ // For this plugin implementation, we'll use a wrapper approach
81
+ // Capture stdin lines as user input
82
+ process.stdin?.on("data", async (data) => {
83
+ const prompt = data.toString().trim();
84
+ if (!prompt)
85
+ return;
86
+ // Debounce to avoid capturing intermediate states
87
+ if (this.debounceTimer)
88
+ clearTimeout(this.debounceTimer);
89
+ this.debounceTimer = setTimeout(async () => {
90
+ await this.captureUserPrompt(prompt);
91
+ }, 2000); // 2 second debounce
92
+ });
93
+ }
94
+ async captureUserPrompt(prompt) {
95
+ try {
96
+ console.log("[SquishPlugin] Capturing user prompt...");
97
+ // Store as memory
98
+ const result = await this.callTool("squish_remember", {
99
+ content: prompt,
100
+ type: "observation",
101
+ tags: ["user-prompt", "claude-code"],
102
+ project: this.workspaceDir,
103
+ metadata: {
104
+ source: "claude-plugin",
105
+ sessionId: this.sessionId,
106
+ capturedAt: new Date().toISOString()
107
+ }
108
+ });
109
+ const memoryId = JSON.parse(result).id;
110
+ this.recentMemories.push(memoryId);
111
+ if (this.recentMemories.length > 50)
112
+ this.recentMemories.shift();
113
+ console.log("[SquishPlugin] ✓ Captured user prompt as memory:", memoryId);
114
+ }
115
+ catch (error) {
116
+ console.error("[SquishPlugin] Failed to capture prompt:", error?.message || error);
117
+ }
118
+ }
119
+ async onPostToolUse() {
120
+ // Capture tool usage from Claude Code output
121
+ // This would need integration with Claude Code's tool result streaming
122
+ // Simplified: we'll rely on users to call observe manually or via prompts
123
+ }
124
+ async onSessionEnd() {
125
+ console.log("[SquishPlugin] Session ending:", this.sessionId);
126
+ try {
127
+ // Generate session summary
128
+ const summary = await this.summarizeSession();
129
+ // Store summary observation
130
+ await this.observe("session_summary", summary, {
131
+ sessionId: this.sessionId,
132
+ memoryCount: this.recentMemories.length,
133
+ endedAt: new Date().toISOString()
134
+ });
135
+ console.log("[SquishPlugin] ✓ Session summary stored");
136
+ }
137
+ catch (error) {
138
+ console.error("[SquishPlugin] Session end error:", error?.message || error);
139
+ }
140
+ }
141
+ async summarizeSession() {
142
+ // Generate a brief summary of this session's memories
143
+ if (this.recentMemories.length === 0) {
144
+ return "Empty session - no memories captured.";
145
+ }
146
+ return `Session ${this.sessionId}: Captured ${this.recentMemories.length} memories from user prompts and interactions.`;
147
+ }
148
+ async observe(type, summary, details) {
149
+ return this.callTool("squish_observe", {
150
+ type,
151
+ action: "claude_code_event",
152
+ summary,
153
+ details,
154
+ project: this.workspaceDir
155
+ });
156
+ }
157
+ async callTool(name, args) {
158
+ if (!this.client) {
159
+ throw new Error("MCP client not connected");
160
+ }
161
+ const result = await this.client.callTool({ name, arguments: args });
162
+ const content = result?.content?.find((c) => c.type === "text")?.text || "{}";
163
+ return content;
164
+ }
165
+ async shutdown() {
166
+ if (this.debounceTimer)
167
+ clearTimeout(this.debounceTimer);
168
+ if (this.client)
169
+ await this.client.close();
170
+ console.log("[SquishPlugin] Shutdown complete");
171
+ }
172
+ }
173
+ // Plugin entry point for Claude Code hook system
174
+ export async function onSessionStart() {
175
+ const plugin = new ClaudeCodeSquishPlugin();
176
+ await plugin.initialize();
177
+ return plugin;
178
+ }
179
+ export async function onUserPromptSubmit(prompt) {
180
+ // This will be called by Claude Code hook system
181
+ // For now, the instance manages its own stdin listener
182
+ }
183
+ export async function onSessionEnd() {
184
+ // Cleanup handled by plugin instance
185
+ }
186
+ // Standalone test mode
187
+ if (process.argv[1] === pathToFileURL(__filename).pathname) {
188
+ const plugin = new ClaudeCodeSquishPlugin();
189
+ plugin.initialize().catch(console.error);
190
+ }
191
+ //# sourceMappingURL=plugin-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-wrapper.js","sourceRoot":"","sources":["../src/plugin-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@squish/memory-claude-code",
3
+ "version": "1.0.0",
4
+ "description": "Claude Code plugin for Squish - automatic memory capture and context injection",
5
+ "main": "dist/plugin-wrapper.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "bun --hot src/plugin-wrapper.ts",
10
+ "prepublishOnly": "npm run clean && npm run build",
11
+ "prepare": "npm run build",
12
+ "clean": "rm -rf dist"
13
+ },
14
+ "keywords": ["claude-code", "plugin", "memory", "mcp", "squish"],
15
+ "author": "michielhdoteth",
16
+ "license": "MIT",
17
+ "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.27.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^22.0.0",
22
+ "typescript": "^5.7.0",
23
+ "vitest": "^4.0.17"
24
+ },
25
+ "peerDependencies": {
26
+ "squish-memory": ">=1.0.0"
27
+ },
28
+ "engines": {
29
+ "node": ">=18.0.0"
30
+ }
31
+ }
@@ -0,0 +1,70 @@
1
+ # Squish Memory for OpenClaw
2
+
3
+ OpenClaw plugin that connects to Squish memory system via MCP protocol.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @squish/memory-openclaw
9
+ ```
10
+
11
+ ## Configuration
12
+
13
+ In your OpenClaw config (`~/.openclaw/agents.json` or similar):
14
+
15
+ ```json
16
+ {
17
+ "plugins": {
18
+ "enabled": true,
19
+ "slots": {
20
+ "memory": "squish-memory-openclaw"
21
+ },
22
+ "entries": {
23
+ "squish-memory-openclaw": {
24
+ "enabled": true,
25
+ "config": {
26
+ "baseUrl": "http://127.0.0.1:8767",
27
+ "autoStart": false,
28
+ "sync": {
29
+ "enabled": true,
30
+ "interval": "5m",
31
+ "extraPaths": ["notes", "docs/memory"]
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## Requirements
41
+
42
+ - Squish memory server running (either via `squish-mcp --stdio` or HTTP at `baseUrl`)
43
+ - mcporter (if using OpenClaw's MCP mode)
44
+ - qmd (for fast markdown search)
45
+
46
+ These are auto-installed by the Squish installer when you run:
47
+ ```bash
48
+ npx squish-memory install-plugin --client=openclaw
49
+ ```
50
+
51
+ ## How It Works
52
+
53
+ 1. The plugin registers in the `memory` slot of OpenClaw
54
+ 2. It connects to Squish MCP server (spawns one if autoStart=true)
55
+ 3. Periodic sync monitors workspace files and stores them as memories
56
+ 4. Tool calls from OpenClaw:
57
+ - `memory_search(query, maxResults)` → Squish hybrid search
58
+ - `memory_get(uri, lineRange, overview)` → Retrieve memory content
59
+
60
+ ## Development
61
+
62
+ ```bash
63
+ cd packages/plugin-openclaw
64
+ npm install
65
+ npm run build
66
+ ```
67
+
68
+ ## License
69
+
70
+ MIT
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * OpenClaw Plugin: Squish Memory Integration
4
+ *
5
+ * This plugin connects OpenClaw to Squish memory system:
6
+ * - Tools: memory_search, memory_get
7
+ * - Sync: Monitors workspace and stores memories
8
+ * - Server: Can auto-start Squish MCP or connect to existing
9
+ */
10
+ interface PluginConfig {
11
+ baseUrl?: string;
12
+ autoStart?: boolean;
13
+ sync?: {
14
+ enabled: boolean;
15
+ interval?: string;
16
+ extraPaths?: string[];
17
+ };
18
+ }
19
+ declare class OpenClawSquishPlugin {
20
+ private config;
21
+ private client;
22
+ private syncInterval;
23
+ private workspaceDir;
24
+ private agentId;
25
+ constructor(config: PluginConfig);
26
+ initialize(): Promise<void>;
27
+ private connect;
28
+ private connectViaStdio;
29
+ private connectViaHTTP;
30
+ private startSync;
31
+ private parseInterval;
32
+ private performSync;
33
+ private collectMarkdownFiles;
34
+ private syncFile;
35
+ memory_search(params: {
36
+ query: string;
37
+ maxResults?: number;
38
+ project?: string;
39
+ }): Promise<any>;
40
+ memory_get(params: {
41
+ uri: string;
42
+ lineRange?: number[];
43
+ overview?: boolean;
44
+ }): Promise<any>;
45
+ private extractMemoryId;
46
+ shutdown(): Promise<void>;
47
+ }
48
+ export { OpenClawSquishPlugin };
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAaH,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,YAAY;IAc1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAUnB,OAAO;YAoBP,eAAe;YAuBf,cAAc;IAK5B,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,aAAa;YAWP,WAAW;IAkBzB,OAAO,CAAC,oBAAoB;YAyBd,QAAQ;IA4BhB,aAAa,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IA0B7F,UAAU,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAuCjG,OAAO,CAAC,eAAe;IAWV,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAavC;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,262 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * OpenClaw Plugin: Squish Memory Integration
4
+ *
5
+ * This plugin connects OpenClaw to Squish memory system:
6
+ * - Tools: memory_search, memory_get
7
+ * - Sync: Monitors workspace and stores memories
8
+ * - Server: Can auto-start Squish MCP or connect to existing
9
+ */
10
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
11
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
12
+ import fs from "node:fs";
13
+ import path from "node:path";
14
+ import os from "node:os";
15
+ import { fileURLToPath } from "node:url";
16
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
+ class OpenClawSquishPlugin {
18
+ config;
19
+ client = null;
20
+ syncInterval = null;
21
+ workspaceDir;
22
+ agentId;
23
+ constructor(config) {
24
+ this.config = {
25
+ baseUrl: "http://127.0.0.1:8767",
26
+ autoStart: false,
27
+ sync: { enabled: true, interval: "5m", extraPaths: [] },
28
+ ...config
29
+ };
30
+ this.workspaceDir = process.env.OPENCLAW_WORKSPACE || process.cwd();
31
+ this.agentId = process.env.OPENCLAW_AGENT_ID || "default";
32
+ console.log("[SquishPlugin] Initializing with workspace:", this.workspaceDir);
33
+ }
34
+ async initialize() {
35
+ // Connect to Squish MCP
36
+ await this.connect();
37
+ // Start sync if enabled
38
+ if (this.config.sync?.enabled) {
39
+ this.startSync();
40
+ }
41
+ }
42
+ async connect() {
43
+ try {
44
+ // If baseUrl is set, try HTTP connection
45
+ if (this.config.baseUrl && this.config.baseUrl.startsWith("http")) {
46
+ console.log("[SquishPlugin] Connecting via HTTP to", this.config.baseUrl);
47
+ // TODO: Implement HTTP client
48
+ await this.connectViaHTTP(this.config.baseUrl);
49
+ }
50
+ else {
51
+ // Use stdio for local spawn or existing Squish
52
+ console.log("[SquishPlugin] Connecting via stdio");
53
+ await this.connectViaStdio();
54
+ }
55
+ console.log("[SquishPlugin] ✓ Connected to Squish");
56
+ }
57
+ catch (error) {
58
+ console.error("[SquishPlugin] ✗ Connection failed:", error?.message || error);
59
+ throw error;
60
+ }
61
+ }
62
+ async connectViaStdio() {
63
+ this.client = new Client({ name: "openclaw-squish-plugin", version: "1.0.0" }, { capabilities: {} });
64
+ const transport = new StdioClientTransport({
65
+ command: "node",
66
+ args: [path.join(__dirname, "..", "..", "..", "dist", "commands", "mcp-server.cjs"), "--stdio"],
67
+ env: {
68
+ ...process.env,
69
+ SQUISH_MODE: "local",
70
+ SQUISH_DATA_DIR: path.join(os.homedir(), ".squish", "openclaw")
71
+ }
72
+ });
73
+ await this.client.connect(transport);
74
+ // Verify connection with health check
75
+ const result = await this.client.callTool({ name: "squish_health", arguments: {} });
76
+ console.log("[SquishPlugin] Health:", result.content);
77
+ }
78
+ async connectViaHTTP(url) {
79
+ // Implement HTTP connection using fetch to /mcp endpoints
80
+ throw new Error("HTTP mode not yet implemented - use stdio");
81
+ }
82
+ startSync() {
83
+ if (this.config.sync?.interval) {
84
+ const ms = this.parseInterval(this.config.sync.interval);
85
+ this.syncInterval = setInterval(() => this.performSync(), ms);
86
+ }
87
+ // Initial sync
88
+ setTimeout(() => this.performSync(), 1000);
89
+ }
90
+ parseInterval(interval) {
91
+ const match = interval.match(/^(\d+)([smhd])$/);
92
+ if (!match)
93
+ throw new Error(`Invalid interval: ${interval}`);
94
+ const value = parseInt(match[1], 10);
95
+ const unit = match[2];
96
+ const multipliers = { s: 1000, m: 60000, h: 3600000, d: 86400000 };
97
+ return value * (multipliers[unit]);
98
+ }
99
+ async performSync() {
100
+ try {
101
+ console.log("[SquishPlugin] Starting workspace sync...");
102
+ // Find markdown files in workspace
103
+ const files = this.collectMarkdownFiles();
104
+ console.log(`[SquishPlugin] Found ${files.length} files to sync`);
105
+ for (const file of files) {
106
+ await this.syncFile(file);
107
+ }
108
+ console.log("[SquishPlugin] Sync complete");
109
+ }
110
+ catch (error) {
111
+ console.error("[SquishPlugin] Sync error:", error?.message || error);
112
+ }
113
+ }
114
+ collectMarkdownFiles() {
115
+ const files = [];
116
+ const extraPaths = this.config.sync?.extraPaths || [];
117
+ const searchPaths = [this.workspaceDir, ...extraPaths.map(p => path.join(this.workspaceDir, p))];
118
+ for (const searchPath of searchPaths) {
119
+ if (!fs.existsSync(searchPath))
120
+ continue;
121
+ const walk = (dir) => {
122
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
123
+ for (const entry of entries) {
124
+ const fullPath = path.join(dir, entry.name);
125
+ if (entry.isDirectory()) {
126
+ walk(fullPath);
127
+ }
128
+ else if (entry.name.endsWith(".md")) {
129
+ files.push(fullPath);
130
+ }
131
+ }
132
+ };
133
+ walk(searchPath);
134
+ }
135
+ return files;
136
+ }
137
+ async syncFile(filePath) {
138
+ try {
139
+ const content = fs.readFileSync(filePath, "utf8");
140
+ const relativePath = path.relative(this.workspaceDir, filePath);
141
+ // Store as memory with metadata
142
+ await this.client?.callTool({
143
+ name: "squish_remember",
144
+ arguments: {
145
+ content: content,
146
+ type: "context",
147
+ tags: ["openclaw-sync", relativePath],
148
+ metadata: {
149
+ source: "openclaw-plugin",
150
+ filePath: relativePath,
151
+ agentId: this.agentId,
152
+ syncedAt: new Date().toISOString()
153
+ }
154
+ }
155
+ });
156
+ console.log(`[SquishPlugin] Synced: ${relativePath}`);
157
+ }
158
+ catch (error) {
159
+ console.error(`[SquishPlugin] Failed to sync ${filePath}:`, error?.message || error);
160
+ }
161
+ }
162
+ // Tool implementation for OpenClaw to call
163
+ async memory_search(params) {
164
+ if (!this.client) {
165
+ throw new Error("MCP client not connected");
166
+ }
167
+ const result = await this.client.callTool({
168
+ name: "squish_search",
169
+ arguments: {
170
+ query: params.query,
171
+ limit: params.maxResults || 6,
172
+ project: params.project || this.workspaceDir,
173
+ mode: "hybrid"
174
+ }
175
+ });
176
+ // Parse result
177
+ const text = (result.content?.find((c) => c.type === "text")?.text || "{}");
178
+ const parsed = JSON.parse(text);
179
+ return {
180
+ results: parsed.results || [],
181
+ count: parsed.results?.length || 0,
182
+ query: params.query
183
+ };
184
+ }
185
+ async memory_get(params) {
186
+ if (!this.client) {
187
+ throw new Error("MCP client not connected");
188
+ }
189
+ // Extract memory ID from URI
190
+ const memoryId = this.extractMemoryId(params.uri);
191
+ const result = await this.client.callTool({
192
+ name: "squish_recall",
193
+ arguments: { memoryId }
194
+ });
195
+ const text = (result.content?.find((c) => c.type === "text")?.text || "{}");
196
+ const memory = JSON.parse(text);
197
+ if (!memory) {
198
+ throw new Error(`Memory not found: ${params.uri}`);
199
+ }
200
+ // Handle lineRange or overview
201
+ let content = memory.content || "";
202
+ if (params.lineRange && Array.isArray(params.lineRange)) {
203
+ const lines = content.split("\n");
204
+ const [start, end] = params.lineRange;
205
+ content = lines.slice(start, end).join("\n");
206
+ }
207
+ if (params.overview) {
208
+ content = content.substring(0, 500) + "...";
209
+ }
210
+ return {
211
+ uri: params.uri,
212
+ content,
213
+ metadata: memory
214
+ };
215
+ }
216
+ extractMemoryId(uri) {
217
+ // Handle squish://memory/<id> format
218
+ const match = uri.match(/^squish:\/\/memory\/([a-f0-9-]+)$/);
219
+ if (match)
220
+ return match[1];
221
+ // Handle direct UUID
222
+ if (/^[a-f0-9-]{36}$/.test(uri))
223
+ return uri;
224
+ throw new Error(`Invalid memory URI: ${uri}`);
225
+ }
226
+ async shutdown() {
227
+ if (this.syncInterval) {
228
+ clearInterval(this.syncInterval);
229
+ this.syncInterval = null;
230
+ }
231
+ if (this.client) {
232
+ await this.client.close();
233
+ this.client = null;
234
+ }
235
+ console.log("[SquishPlugin] Shutdown complete");
236
+ }
237
+ }
238
+ // Export for OpenClaw
239
+ export { OpenClawSquishPlugin };
240
+ // If run directly (testing), start plugin server
241
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
242
+ const config = {
243
+ baseUrl: process.env.SQUISH_BASE_URL,
244
+ autoStart: process.env.SQUISH_AUTO_START === "true",
245
+ sync: {
246
+ enabled: true,
247
+ interval: process.env.SQUISH_SYNC_INTERVAL || "5m"
248
+ }
249
+ };
250
+ const plugin = new OpenClawSquishPlugin(config);
251
+ process.on("SIGINT", () => plugin.shutdown());
252
+ process.on("SIGTERM", () => plugin.shutdown());
253
+ plugin.initialize().then(() => {
254
+ console.log("[SquishPlugin] Ready");
255
+ // Keep process alive
256
+ process.stdin?.resume();
257
+ }).catch((err) => {
258
+ console.error("[SquishPlugin] Failed to start:", err);
259
+ process.exit(1);
260
+ });
261
+ }
262
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}