squish-memory 0.9.3 → 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 (192) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +58 -2
  3. package/config/plugin-manifest.json +152 -0
  4. package/config/plugin-manifest.schema.json +244 -0
  5. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.d.ts +1 -1
  6. package/dist/algorithms/analytics/token-estimator.d.ts.map +1 -0
  7. package/dist/algorithms/{merge/analytics → analytics}/token-estimator.js +3 -3
  8. package/dist/algorithms/analytics/token-estimator.js.map +1 -0
  9. package/dist/algorithms/detection/hash-filters.d.ts.map +1 -0
  10. package/dist/algorithms/detection/hash-filters.js.map +1 -0
  11. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.d.ts +1 -1
  12. package/dist/algorithms/detection/semantic-ranker.d.ts.map +1 -0
  13. package/dist/algorithms/{merge/detection → detection}/semantic-ranker.js +1 -1
  14. package/dist/algorithms/detection/semantic-ranker.js.map +1 -0
  15. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.d.ts +1 -1
  16. package/dist/algorithms/detection/two-stage-detector.d.ts.map +1 -0
  17. package/dist/algorithms/{merge/detection → detection}/two-stage-detector.js +4 -4
  18. package/dist/algorithms/detection/two-stage-detector.js.map +1 -0
  19. package/dist/algorithms/handlers/approve-merge.d.ts.map +1 -0
  20. package/dist/algorithms/{merge/handlers → handlers}/approve-merge.js +4 -4
  21. package/dist/algorithms/handlers/approve-merge.js.map +1 -0
  22. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.d.ts +1 -1
  23. package/dist/algorithms/handlers/detect-duplicates.d.ts.map +1 -0
  24. package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.js +55 -75
  25. package/dist/algorithms/handlers/detect-duplicates.js.map +1 -0
  26. package/dist/algorithms/handlers/get-stats.d.ts.map +1 -0
  27. package/dist/algorithms/{merge/handlers → handlers}/get-stats.js +3 -3
  28. package/dist/algorithms/handlers/get-stats.js.map +1 -0
  29. package/dist/algorithms/handlers/list-proposals.d.ts.map +1 -0
  30. package/dist/algorithms/{merge/handlers → handlers}/list-proposals.js +3 -3
  31. package/dist/algorithms/handlers/list-proposals.js.map +1 -0
  32. package/dist/algorithms/handlers/preview-merge.d.ts.map +1 -0
  33. package/dist/algorithms/{merge/handlers → handlers}/preview-merge.js +3 -3
  34. package/dist/algorithms/handlers/preview-merge.js.map +1 -0
  35. package/dist/algorithms/handlers/reject-merge.d.ts.map +1 -0
  36. package/dist/algorithms/{merge/handlers → handlers}/reject-merge.js +3 -3
  37. package/dist/algorithms/handlers/reject-merge.js.map +1 -0
  38. package/dist/algorithms/handlers/reverse-merge.d.ts.map +1 -0
  39. package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.js +3 -3
  40. package/dist/algorithms/handlers/reverse-merge.js.map +1 -0
  41. package/dist/algorithms/{merge/safety → safety}/safety-checks.d.ts +1 -1
  42. package/dist/algorithms/safety/safety-checks.d.ts.map +1 -0
  43. package/dist/algorithms/safety/safety-checks.js +179 -0
  44. package/dist/algorithms/safety/safety-checks.js.map +1 -0
  45. package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.d.ts +1 -1
  46. package/dist/algorithms/strategies/merge-strategies.d.ts.map +1 -0
  47. package/dist/algorithms/strategies/merge-strategies.js.map +1 -0
  48. package/dist/algorithms/utils/response-builder.d.ts +28 -0
  49. package/dist/algorithms/utils/response-builder.d.ts.map +1 -0
  50. package/dist/algorithms/utils/response-builder.js +37 -0
  51. package/dist/algorithms/utils/response-builder.js.map +1 -0
  52. package/dist/api/web/web.d.ts.map +1 -1
  53. package/dist/api/web/web.js +0 -21
  54. package/dist/api/web/web.js.map +1 -1
  55. package/dist/commands/mcp-server.js +1 -1
  56. package/dist/config.d.ts +1 -1
  57. package/dist/config.d.ts.map +1 -1
  58. package/dist/config.js +30 -38
  59. package/dist/config.js.map +1 -1
  60. package/dist/core/associations.js +2 -2
  61. package/dist/core/associations.js.map +1 -1
  62. package/dist/core/layers/generator.d.ts +25 -0
  63. package/dist/core/layers/generator.d.ts.map +1 -0
  64. package/dist/core/layers/generator.js +76 -0
  65. package/dist/core/layers/generator.js.map +1 -0
  66. package/dist/core/mcp/tools.d.ts.map +1 -1
  67. package/dist/core/mcp/tools.js +71 -0
  68. package/dist/core/mcp/tools.js.map +1 -1
  69. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  70. package/dist/core/memory/hybrid-retrieval.js +49 -1
  71. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  72. package/dist/core/memory/hybrid-search.d.ts.map +1 -1
  73. package/dist/core/memory/hybrid-search.js +0 -7
  74. package/dist/core/memory/hybrid-search.js.map +1 -1
  75. package/dist/core/memory/memories.d.ts.map +1 -1
  76. package/dist/core/memory/memories.js +47 -53
  77. package/dist/core/memory/memories.js.map +1 -1
  78. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -1
  79. package/dist/core/memory/progressive-disclosure.js.map +1 -1
  80. package/dist/core/namespaces/index.d.ts +71 -0
  81. package/dist/core/namespaces/index.d.ts.map +1 -0
  82. package/dist/core/namespaces/index.js +296 -0
  83. package/dist/core/namespaces/index.js.map +1 -0
  84. package/dist/core/namespaces/uri-parser.d.ts +31 -0
  85. package/dist/core/namespaces/uri-parser.d.ts.map +1 -0
  86. package/dist/core/namespaces/uri-parser.js +74 -0
  87. package/dist/core/namespaces/uri-parser.js.map +1 -0
  88. package/dist/core/observations.d.ts.map +1 -1
  89. package/dist/core/observations.js +3 -12
  90. package/dist/core/observations.js.map +1 -1
  91. package/dist/core/projects.d.ts.map +1 -1
  92. package/dist/core/projects.js +0 -12
  93. package/dist/core/projects.js.map +1 -1
  94. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -1
  95. package/dist/core/scheduler/cron-scheduler.js +14 -0
  96. package/dist/core/scheduler/cron-scheduler.js.map +1 -1
  97. package/dist/core/session-hooks/self-iteration-job.d.ts +20 -0
  98. package/dist/core/session-hooks/self-iteration-job.d.ts.map +1 -0
  99. package/dist/core/session-hooks/self-iteration-job.js +278 -0
  100. package/dist/core/session-hooks/self-iteration-job.js.map +1 -0
  101. package/dist/core/session-hooks/session-hooks.d.ts +18 -0
  102. package/dist/core/session-hooks/session-hooks.d.ts.map +1 -0
  103. package/dist/core/session-hooks/session-hooks.js +55 -0
  104. package/dist/core/session-hooks/session-hooks.js.map +1 -0
  105. package/dist/core/tracing/collector.d.ts +111 -0
  106. package/dist/core/tracing/collector.d.ts.map +1 -0
  107. package/dist/core/tracing/collector.js +338 -0
  108. package/dist/core/tracing/collector.js.map +1 -0
  109. package/dist/core/tracing/visualizer.d.ts +32 -0
  110. package/dist/core/tracing/visualizer.d.ts.map +1 -0
  111. package/dist/core/tracing/visualizer.js +165 -0
  112. package/dist/core/tracing/visualizer.js.map +1 -0
  113. package/dist/drizzle/schema-sqlite.d.ts +384 -0
  114. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  115. package/dist/drizzle/schema-sqlite.js +65 -0
  116. package/dist/drizzle/schema-sqlite.js.map +1 -1
  117. package/dist/drizzle/schema.d.ts +368 -0
  118. package/dist/drizzle/schema.d.ts.map +1 -1
  119. package/dist/drizzle/schema.js +63 -0
  120. package/dist/drizzle/schema.js.map +1 -1
  121. package/dist/index.d.ts +4 -4
  122. package/dist/index.js +101 -62
  123. package/dist/index.js.map +1 -1
  124. package/generated/mcp/manifest.json +23 -0
  125. package/generated/mcp/mcp-servers.json +25 -0
  126. package/generated/mcp/mcporter.json +34 -0
  127. package/generated/mcp/openclaw-memory-qmd.json +17 -0
  128. package/generated/mcp/runtime.json +12 -0
  129. package/package.json +50 -9
  130. package/packages/plugin-claude-code/README.md +73 -0
  131. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +35 -0
  132. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +1 -0
  133. package/packages/plugin-claude-code/dist/plugin-wrapper.js +191 -0
  134. package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +1 -0
  135. package/packages/plugin-claude-code/package.json +31 -0
  136. package/packages/plugin-openclaw/README.md +70 -0
  137. package/packages/plugin-openclaw/dist/index.d.ts +49 -0
  138. package/packages/plugin-openclaw/dist/index.d.ts.map +1 -0
  139. package/packages/plugin-openclaw/dist/index.js +262 -0
  140. package/packages/plugin-openclaw/dist/index.js.map +1 -0
  141. package/packages/plugin-openclaw/openclaw.plugin.json +94 -0
  142. package/packages/plugin-openclaw/package.json +31 -0
  143. package/packages/plugin-opencode/install.mjs +217 -0
  144. package/packages/plugin-opencode/package.json +21 -0
  145. package/scripts/dependency-manager.mjs +217 -0
  146. package/scripts/detect-clients.mjs +78 -0
  147. package/scripts/install-interactive.mjs +674 -0
  148. package/scripts/install-plugin.mjs +415 -0
  149. package/scripts/test-interactive.mjs +131 -0
  150. package/commands/managed-sync.ts +0 -69
  151. package/commands/mcp-server.ts +0 -519
  152. package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +0 -1
  153. package/dist/algorithms/merge/analytics/token-estimator.js.map +0 -1
  154. package/dist/algorithms/merge/detection/hash-filters.d.ts.map +0 -1
  155. package/dist/algorithms/merge/detection/hash-filters.js.map +0 -1
  156. package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +0 -1
  157. package/dist/algorithms/merge/detection/semantic-ranker.js.map +0 -1
  158. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +0 -1
  159. package/dist/algorithms/merge/detection/two-stage-detector.js.map +0 -1
  160. package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +0 -1
  161. package/dist/algorithms/merge/handlers/approve-merge.js.map +0 -1
  162. package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +0 -1
  163. package/dist/algorithms/merge/handlers/detect-duplicates.js.map +0 -1
  164. package/dist/algorithms/merge/handlers/get-stats.d.ts.map +0 -1
  165. package/dist/algorithms/merge/handlers/get-stats.js.map +0 -1
  166. package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +0 -1
  167. package/dist/algorithms/merge/handlers/list-proposals.js.map +0 -1
  168. package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +0 -1
  169. package/dist/algorithms/merge/handlers/preview-merge.js.map +0 -1
  170. package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +0 -1
  171. package/dist/algorithms/merge/handlers/reject-merge.js.map +0 -1
  172. package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +0 -1
  173. package/dist/algorithms/merge/handlers/reverse-merge.js.map +0 -1
  174. package/dist/algorithms/merge/safety/safety-checks.d.ts.map +0 -1
  175. package/dist/algorithms/merge/safety/safety-checks.js +0 -215
  176. package/dist/algorithms/merge/safety/safety-checks.js.map +0 -1
  177. package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +0 -1
  178. package/dist/algorithms/merge/strategies/merge-strategies.js.map +0 -1
  179. package/dist/core/embeddings/qmd-provider.d.ts +0 -65
  180. package/dist/core/embeddings/qmd-provider.d.ts.map +0 -1
  181. package/dist/core/embeddings/qmd-provider.js +0 -133
  182. package/dist/core/embeddings/qmd-provider.js.map +0 -1
  183. package/scripts/init-dirs.ts +0 -15
  184. /package/dist/algorithms/{merge/detection → detection}/hash-filters.d.ts +0 -0
  185. /package/dist/algorithms/{merge/detection → detection}/hash-filters.js +0 -0
  186. /package/dist/algorithms/{merge/handlers → handlers}/approve-merge.d.ts +0 -0
  187. /package/dist/algorithms/{merge/handlers → handlers}/get-stats.d.ts +0 -0
  188. /package/dist/algorithms/{merge/handlers → handlers}/list-proposals.d.ts +0 -0
  189. /package/dist/algorithms/{merge/handlers → handlers}/preview-merge.d.ts +0 -0
  190. /package/dist/algorithms/{merge/handlers → handlers}/reject-merge.d.ts +0 -0
  191. /package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.d.ts +0 -0
  192. /package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.js +0 -0
@@ -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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"}
@@ -0,0 +1,94 @@
1
+ {
2
+ "id": "squish-memory-openclaw",
3
+ "name": "Squish Memory for OpenClaw",
4
+ "description": "Connect OpenClaw to Squish memory system via MCP",
5
+ "version": "1.0.0",
6
+ "pluginApiVersion": "1.0.0",
7
+ "author": "michielhdoteth",
8
+ "license": "MIT",
9
+ "homepage": "https://github.com/michielhdoteth/squish",
10
+ "slot": "memory",
11
+ "tools": [
12
+ {
13
+ "name": "memory_search",
14
+ "description": "Search memories using Squish hybrid search",
15
+ "parameters": {
16
+ "type": "object",
17
+ "properties": {
18
+ "query": {
19
+ "type": "string",
20
+ "description": "Search query"
21
+ },
22
+ "maxResults": {
23
+ "type": "number",
24
+ "description": "Maximum results to return",
25
+ "default": 6
26
+ },
27
+ "project": {
28
+ "type": "string",
29
+ "description": "Project path to scope search"
30
+ }
31
+ },
32
+ "required": ["query"]
33
+ }
34
+ },
35
+ {
36
+ "name": "memory_get",
37
+ "description": "Get memory content by URI or ID",
38
+ "parameters": {
39
+ "type": "object",
40
+ "properties": {
41
+ "uri": {
42
+ "type": "string",
43
+ "description": "Memory URI (e.g., squish://memory/<id>) or file path"
44
+ },
45
+ "lineRange": {
46
+ "type": "array",
47
+ "items": { "type": "number" },
48
+ "minItems": 2,
49
+ "maxItems": 2,
50
+ "description": "Line range [start, end]"
51
+ },
52
+ "overview": {
53
+ "type": "boolean",
54
+ "description": "Get overview instead of full content",
55
+ "default": false
56
+ }
57
+ },
58
+ "required": ["uri"]
59
+ }
60
+ }
61
+ ],
62
+ "config": {
63
+ "baseUrl": {
64
+ "type": "string",
65
+ "default": "http://127.0.0.1:8767",
66
+ "description": "Squish MCP server URL"
67
+ },
68
+ "autoStart": {
69
+ "type": "boolean",
70
+ "default": false,
71
+ "description": "Auto-start Squish MCP server if not running"
72
+ },
73
+ "sync": {
74
+ "type": "object",
75
+ "properties": {
76
+ "enabled": {
77
+ "type": "boolean",
78
+ "default": true
79
+ },
80
+ "interval": {
81
+ "type": "string",
82
+ "default": "5m",
83
+ "description": "Sync interval (e.g., 5m, 1h)"
84
+ },
85
+ "extraPaths": {
86
+ "type": "array",
87
+ "items": { "type": "string" },
88
+ "default": ["notes", "docs/memory"],
89
+ "description": "Extra directories to sync"
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@squish/memory-openclaw",
3
+ "version": "1.0.0",
4
+ "description": "OpenClaw memory plugin for Squish - provides memory_search and memory_get tools via Squish MCP",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "bun --hot src/index.ts",
10
+ "prepublishOnly": "npm run clean && npm run build",
11
+ "prepare": "npm run build",
12
+ "clean": "rm -rf dist"
13
+ },
14
+ "keywords": ["openclaw", "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,217 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * OpenCode Plugin Installer for Squish
5
+ * Auto-installs CLI + configures OpenCode to use Squish as MCP server
6
+ */
7
+
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import os from "node:os";
11
+ import { spawnSync } from "node:child_process";
12
+
13
+ const CONFIG_DIR = path.join(os.homedir(), ".config", "opencode");
14
+ const CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
15
+
16
+ const OPENCODE_SCHEMA = "https://opencode.ai/config.json";
17
+
18
+ function ensureDir(dirPath) {
19
+ if (!fs.existsSync(dirPath)) {
20
+ fs.mkdirSync(dirPath, { recursive: true });
21
+ }
22
+ }
23
+
24
+ function getSquishMcpConfig() {
25
+ return {
26
+ type: "local",
27
+ command: ["squish-mcp"],
28
+ enabled: true,
29
+ environment: {}
30
+ };
31
+ }
32
+
33
+ function loadOpenCodeConfig() {
34
+ if (!fs.existsSync(CONFIG_PATH)) {
35
+ return null;
36
+ }
37
+
38
+ try {
39
+ const content = fs.readFileSync(CONFIG_PATH, "utf8");
40
+ return JSON.parse(content);
41
+ } catch (error) {
42
+ console.error(`[ERROR] Failed to parse OpenCode config: ${error.message}`);
43
+ return null;
44
+ }
45
+ }
46
+
47
+ function saveOpenCodeConfig(config) {
48
+ ensureDir(CONFIG_DIR);
49
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
50
+ }
51
+
52
+ function createNewConfig() {
53
+ return {
54
+ $schema: OPENCODE_SCHEMA,
55
+ mcp: {
56
+ squish: getSquishMcpConfig()
57
+ }
58
+ };
59
+ }
60
+
61
+ function installForOpenCode(options = {}) {
62
+ console.log("[INSTALL] Installing Squish for OpenCode...");
63
+
64
+ let config = loadOpenCodeConfig();
65
+ let created = false;
66
+
67
+ if (!config) {
68
+ if (options.dryRun) {
69
+ console.log("[DRY-RUN] Would create new OpenCode config at:", CONFIG_PATH);
70
+ return true;
71
+ }
72
+
73
+ config = createNewConfig();
74
+ created = true;
75
+ console.log("[INSTALL] Created new OpenCode config");
76
+ } else {
77
+ if (options.dryRun) {
78
+ console.log("[DRY-RUN] Would update existing OpenCode config at:", CONFIG_PATH);
79
+ return true;
80
+ }
81
+
82
+ // Ensure mcp section exists
83
+ if (!config.mcp) {
84
+ config.mcp = {};
85
+ }
86
+
87
+ // Add or update squish MCP config
88
+ config.mcp.squish = getSquishMcpConfig();
89
+ console.log("[INSTALL] Updated existing OpenCode config");
90
+ }
91
+
92
+ saveOpenCodeConfig(config);
93
+ console.log(`[INSTALL] ${created ? 'Created' : 'Updated'}: ${CONFIG_PATH}`);
94
+
95
+ return true;
96
+ }
97
+
98
+ function uninstallForOpenCode(options = {}) {
99
+ console.log("[UNINSTALL] Removing Squish from OpenCode...");
100
+
101
+ const config = loadOpenCodeConfig();
102
+ if (!config) {
103
+ console.log("[UNINSTALL] No OpenCode config found");
104
+ return true;
105
+ }
106
+
107
+ if (!config.mcp || !config.mcp.squish) {
108
+ console.log("[UNINSTALL] Squish not found in OpenCode config");
109
+ return true;
110
+ }
111
+
112
+ if (options.dryRun) {
113
+ console.log("[DRY-RUN] Would remove Squish from OpenCode config");
114
+ return true;
115
+ }
116
+
117
+ delete config.mcp.squish;
118
+
119
+ // Clean up empty mcp section
120
+ if (Object.keys(config.mcp).length === 0) {
121
+ delete config.mcp;
122
+ }
123
+
124
+ saveOpenCodeConfig(config);
125
+ console.log("[UNINSTALL] Removed Squish from OpenCode config");
126
+
127
+ return true;
128
+ }
129
+
130
+ function verifyOpenCodeInstallation() {
131
+ console.log("[VERIFY] Checking OpenCode installation...");
132
+
133
+ const config = loadOpenCodeConfig();
134
+ if (!config) {
135
+ return { ok: false, error: "OpenCode config not found" };
136
+ }
137
+
138
+ if (!config.mcp || !config.mcp.squish) {
139
+ return { ok: false, error: "Squish MCP not configured" };
140
+ }
141
+
142
+ const squishConfig = config.mcp.squish;
143
+
144
+ if (squishConfig.type !== "local") {
145
+ return { ok: false, error: `Expected type 'local', got '${squishConfig.type}'` };
146
+ }
147
+
148
+ if (!squishConfig.enabled) {
149
+ return { ok: false, error: "Squish MCP is disabled" };
150
+ }
151
+
152
+ // Check if squish-mcp command is available
153
+ const result = spawnSync("which", ["squish-mcp"], { encoding: "utf8", shell: true });
154
+ if (result.status !== 0) {
155
+ return { ok: false, error: "squish-mcp command not found in PATH" };
156
+ }
157
+
158
+ console.log("[VERIFY] OpenCode config:", CONFIG_PATH);
159
+ console.log("[VERIFY] Squish MCP configured:", squishConfig.command.join(" "));
160
+ console.log("[VERIFY] Status: enabled");
161
+
162
+ return { ok: true, message: "OpenCode installation verified" };
163
+ }
164
+
165
+ function main() {
166
+ const args = process.argv.slice(2);
167
+ const options = {
168
+ dryRun: args.includes("--dry-run") || args.includes("-d"),
169
+ uninstall: args.includes("--uninstall") || args.includes("-u"),
170
+ verify: args.includes("--verify") || args.includes("-v")
171
+ };
172
+
173
+ console.log("[OpenCode Plugin for Squish]");
174
+ console.log();
175
+
176
+ try {
177
+ if (options.verify) {
178
+ const result = verifyOpenCodeInstallation();
179
+ if (result.ok) {
180
+ console.log("\n[VERIFY] " + result.message);
181
+ process.exit(0);
182
+ } else {
183
+ console.error("\n[VERIFY] Failed:", result.error);
184
+ process.exit(1);
185
+ }
186
+ }
187
+
188
+ if (options.uninstall) {
189
+ const success = uninstallForOpenCode(options);
190
+ process.exit(success ? 0 : 1);
191
+ }
192
+
193
+ const success = installForOpenCode(options);
194
+
195
+ if (success && !options.dryRun) {
196
+ const verify = verifyOpenCodeInstallation();
197
+ if (verify.ok) {
198
+ console.log("\n[SUCCESS] OpenCode plugin installed successfully!");
199
+ console.log("\nTo use Squish in OpenCode:");
200
+ console.log(" 1. Restart OpenCode if it's running");
201
+ console.log(" 2. Start a conversation and ask about memories");
202
+ console.log(" 3. Or explicitly: 'use the squish tool to search for...'");
203
+ } else {
204
+ console.error("\n[WARNING] Installation succeeded but verification failed:");
205
+ console.error(" ", verify.error);
206
+ }
207
+ }
208
+
209
+ process.exit(success ? 0 : 1);
210
+
211
+ } catch (error) {
212
+ console.error("[ERROR]", error.message);
213
+ process.exit(1);
214
+ }
215
+ }
216
+
217
+ main();
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@squish/plugin-opencode",
3
+ "version": "1.0.0",
4
+ "description": "OpenCode plugin for Squish - auto-installs CLI and configures OpenCode to use Squish as MCP server",
5
+ "main": "install.mjs",
6
+ "type": "module",
7
+ "scripts": {
8
+ "install": "node install.mjs",
9
+ "verify": "node install.mjs --verify",
10
+ "uninstall": "node install.mjs --uninstall"
11
+ },
12
+ "keywords": ["opencode", "plugin", "memory", "mcp", "squish"],
13
+ "author": "michielhdoteth",
14
+ "license": "MIT",
15
+ "peerDependencies": {
16
+ "squish-memory": ">=1.0.0"
17
+ },
18
+ "engines": {
19
+ "node": ">=18.0.0"
20
+ }
21
+ }