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.
- package/{.env.mcp → .env.mcp.example} +23 -0
- package/CHANGELOG.md +102 -0
- package/QUICK-START.md +10 -4
- package/README.md +73 -4
- package/config/plugin-manifest.json +152 -0
- package/config/plugin-manifest.schema.json +244 -0
- package/dist/algorithms/{merge/analytics → analytics}/token-estimator.d.ts +1 -1
- package/dist/algorithms/analytics/token-estimator.d.ts.map +1 -0
- package/dist/algorithms/{merge/analytics → analytics}/token-estimator.js +3 -3
- package/dist/algorithms/analytics/token-estimator.js.map +1 -0
- package/dist/algorithms/detection/hash-filters.d.ts.map +1 -0
- package/dist/algorithms/detection/hash-filters.js.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/semantic-ranker.d.ts +1 -1
- package/dist/algorithms/detection/semantic-ranker.d.ts.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/semantic-ranker.js +1 -1
- package/dist/algorithms/detection/semantic-ranker.js.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/two-stage-detector.d.ts +1 -1
- package/dist/algorithms/detection/two-stage-detector.d.ts.map +1 -0
- package/dist/algorithms/{merge/detection → detection}/two-stage-detector.js +4 -4
- package/dist/algorithms/detection/two-stage-detector.js.map +1 -0
- package/dist/algorithms/handlers/approve-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/approve-merge.js +4 -4
- package/dist/algorithms/handlers/approve-merge.js.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.d.ts +1 -1
- package/dist/algorithms/handlers/detect-duplicates.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/detect-duplicates.js +55 -75
- package/dist/algorithms/handlers/detect-duplicates.js.map +1 -0
- package/dist/algorithms/handlers/get-stats.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/get-stats.js +3 -3
- package/dist/algorithms/handlers/get-stats.js.map +1 -0
- package/dist/algorithms/handlers/list-proposals.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/list-proposals.js +3 -3
- package/dist/algorithms/handlers/list-proposals.js.map +1 -0
- package/dist/algorithms/handlers/preview-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/preview-merge.js +3 -3
- package/dist/algorithms/handlers/preview-merge.js.map +1 -0
- package/dist/algorithms/handlers/reject-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/reject-merge.js +3 -3
- package/dist/algorithms/handlers/reject-merge.js.map +1 -0
- package/dist/algorithms/handlers/reverse-merge.d.ts.map +1 -0
- package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.js +3 -3
- package/dist/algorithms/handlers/reverse-merge.js.map +1 -0
- package/dist/algorithms/{merge/safety → safety}/safety-checks.d.ts +1 -1
- package/dist/algorithms/safety/safety-checks.d.ts.map +1 -0
- package/dist/algorithms/safety/safety-checks.js +179 -0
- package/dist/algorithms/safety/safety-checks.js.map +1 -0
- package/dist/algorithms/{merge/strategies → strategies}/merge-strategies.d.ts +1 -1
- package/dist/algorithms/strategies/merge-strategies.d.ts.map +1 -0
- package/dist/algorithms/strategies/merge-strategies.js.map +1 -0
- package/dist/algorithms/utils/response-builder.d.ts +28 -0
- package/dist/algorithms/utils/response-builder.d.ts.map +1 -0
- package/dist/algorithms/utils/response-builder.js +37 -0
- package/dist/algorithms/utils/response-builder.js.map +1 -0
- package/dist/api/web/web.d.ts.map +1 -1
- package/dist/api/web/web.js +0 -21
- package/dist/api/web/web.js.map +1 -1
- package/dist/commands/mcp-server.js +1 -1
- package/dist/config.d.ts +9 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +35 -32
- package/dist/config.js.map +1 -1
- package/dist/core/associations.js +2 -2
- package/dist/core/associations.js.map +1 -1
- package/dist/core/core-memory.d.ts +5 -0
- package/dist/core/core-memory.d.ts.map +1 -1
- package/dist/core/core-memory.js +17 -5
- package/dist/core/core-memory.js.map +1 -1
- package/dist/core/embeddings.d.ts +9 -0
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +153 -16
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/layers/generator.d.ts +25 -0
- package/dist/core/layers/generator.d.ts.map +1 -0
- package/dist/core/layers/generator.js +76 -0
- package/dist/core/layers/generator.js.map +1 -0
- package/dist/core/mcp/tools.d.ts.map +1 -1
- package/dist/core/mcp/tools.js +71 -0
- package/dist/core/mcp/tools.js.map +1 -1
- package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/core/memory/hybrid-retrieval.js +49 -1
- package/dist/core/memory/hybrid-retrieval.js.map +1 -1
- package/dist/core/memory/hybrid-search.d.ts.map +1 -1
- package/dist/core/memory/hybrid-search.js +0 -7
- package/dist/core/memory/hybrid-search.js.map +1 -1
- package/dist/core/memory/memories.d.ts.map +1 -1
- package/dist/core/memory/memories.js +47 -53
- package/dist/core/memory/memories.js.map +1 -1
- package/dist/core/memory/progressive-disclosure.d.ts.map +1 -1
- package/dist/core/memory/progressive-disclosure.js.map +1 -1
- package/dist/core/namespaces/index.d.ts +71 -0
- package/dist/core/namespaces/index.d.ts.map +1 -0
- package/dist/core/namespaces/index.js +296 -0
- package/dist/core/namespaces/index.js.map +1 -0
- package/dist/core/namespaces/uri-parser.d.ts +31 -0
- package/dist/core/namespaces/uri-parser.d.ts.map +1 -0
- package/dist/core/namespaces/uri-parser.js +74 -0
- package/dist/core/namespaces/uri-parser.js.map +1 -0
- package/dist/core/observations.d.ts.map +1 -1
- package/dist/core/observations.js +3 -12
- package/dist/core/observations.js.map +1 -1
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +0 -12
- package/dist/core/projects.js.map +1 -1
- package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -1
- package/dist/core/scheduler/cron-scheduler.js +14 -0
- package/dist/core/scheduler/cron-scheduler.js.map +1 -1
- package/dist/core/session-hooks/self-iteration-job.d.ts +20 -0
- package/dist/core/session-hooks/self-iteration-job.d.ts.map +1 -0
- package/dist/core/session-hooks/self-iteration-job.js +278 -0
- package/dist/core/session-hooks/self-iteration-job.js.map +1 -0
- package/dist/core/session-hooks/session-hooks.d.ts +18 -0
- package/dist/core/session-hooks/session-hooks.d.ts.map +1 -0
- package/dist/core/session-hooks/session-hooks.js +55 -0
- package/dist/core/session-hooks/session-hooks.js.map +1 -0
- package/dist/core/tracing/collector.d.ts +111 -0
- package/dist/core/tracing/collector.d.ts.map +1 -0
- package/dist/core/tracing/collector.js +338 -0
- package/dist/core/tracing/collector.js.map +1 -0
- package/dist/core/tracing/visualizer.d.ts +32 -0
- package/dist/core/tracing/visualizer.d.ts.map +1 -0
- package/dist/core/tracing/visualizer.js +165 -0
- package/dist/core/tracing/visualizer.js.map +1 -0
- package/dist/db/bootstrap.d.ts.map +1 -1
- package/dist/db/bootstrap.js +33 -6
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/drizzle/schema-sqlite.d.ts +401 -0
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
- package/dist/drizzle/schema-sqlite.js +66 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -1
- package/dist/drizzle/schema.d.ts +385 -0
- package/dist/drizzle/schema.d.ts.map +1 -1
- package/dist/drizzle/schema.js +64 -0
- package/dist/drizzle/schema.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +101 -62
- package/dist/index.js.map +1 -1
- package/generated/mcp/manifest.json +23 -0
- package/generated/mcp/mcp-servers.json +25 -0
- package/generated/mcp/mcporter.json +34 -0
- package/generated/mcp/openclaw-memory-qmd.json +17 -0
- package/generated/mcp/runtime.json +12 -0
- package/package.json +68 -26
- package/packages/plugin-claude-code/README.md +73 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +35 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +1 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +191 -0
- package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +1 -0
- package/packages/plugin-claude-code/package.json +31 -0
- package/packages/plugin-openclaw/README.md +70 -0
- package/packages/plugin-openclaw/dist/index.d.ts +49 -0
- package/packages/plugin-openclaw/dist/index.d.ts.map +1 -0
- package/packages/plugin-openclaw/dist/index.js +262 -0
- package/packages/plugin-openclaw/dist/index.js.map +1 -0
- package/packages/plugin-openclaw/openclaw.plugin.json +94 -0
- package/packages/plugin-openclaw/package.json +31 -0
- package/packages/plugin-opencode/install.mjs +217 -0
- package/packages/plugin-opencode/package.json +21 -0
- package/scripts/build-release.sh +20 -17
- package/scripts/check-secrets.js +132 -0
- package/scripts/dependency-manager.mjs +217 -0
- package/scripts/detect-clients.mjs +78 -0
- package/scripts/github-release.sh +43 -27
- package/scripts/install-interactive.mjs +674 -0
- package/scripts/install-plugin.mjs +415 -0
- package/scripts/test-interactive.mjs +131 -0
- package/commands/managed-sync.ts +0 -69
- package/commands/mcp-server.ts +0 -519
- package/dist/algorithms/merge/analytics/token-estimator.d.ts.map +0 -1
- package/dist/algorithms/merge/analytics/token-estimator.js.map +0 -1
- package/dist/algorithms/merge/detection/hash-filters.d.ts.map +0 -1
- package/dist/algorithms/merge/detection/hash-filters.js.map +0 -1
- package/dist/algorithms/merge/detection/semantic-ranker.d.ts.map +0 -1
- package/dist/algorithms/merge/detection/semantic-ranker.js.map +0 -1
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +0 -1
- package/dist/algorithms/merge/detection/two-stage-detector.js.map +0 -1
- package/dist/algorithms/merge/handlers/approve-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/approve-merge.js.map +0 -1
- package/dist/algorithms/merge/handlers/detect-duplicates.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/detect-duplicates.js.map +0 -1
- package/dist/algorithms/merge/handlers/get-stats.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/get-stats.js.map +0 -1
- package/dist/algorithms/merge/handlers/list-proposals.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/list-proposals.js.map +0 -1
- package/dist/algorithms/merge/handlers/preview-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/preview-merge.js.map +0 -1
- package/dist/algorithms/merge/handlers/reject-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/reject-merge.js.map +0 -1
- package/dist/algorithms/merge/handlers/reverse-merge.d.ts.map +0 -1
- package/dist/algorithms/merge/handlers/reverse-merge.js.map +0 -1
- package/dist/algorithms/merge/safety/safety-checks.d.ts.map +0 -1
- package/dist/algorithms/merge/safety/safety-checks.js +0 -215
- package/dist/algorithms/merge/safety/safety-checks.js.map +0 -1
- package/dist/algorithms/merge/strategies/merge-strategies.d.ts.map +0 -1
- package/dist/algorithms/merge/strategies/merge-strategies.js.map +0 -1
- package/dist/core/embeddings/qmd-provider.d.ts +0 -65
- package/dist/core/embeddings/qmd-provider.d.ts.map +0 -1
- package/dist/core/embeddings/qmd-provider.js +0 -133
- package/dist/core/embeddings/qmd-provider.js.map +0 -1
- package/scripts/init-dirs.ts +0 -15
- /package/dist/algorithms/{merge/detection → detection}/hash-filters.d.ts +0 -0
- /package/dist/algorithms/{merge/detection → detection}/hash-filters.js +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/approve-merge.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/get-stats.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/list-proposals.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/preview-merge.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/reject-merge.d.ts +0 -0
- /package/dist/algorithms/{merge/handlers → handlers}/reverse-merge.d.ts +0 -0
- /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":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAiB,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,sBAAsB;IAClB,MAAM,GAAkB,IAAI,CAAC;IAC7B,SAAS,GAAW,EAAE,CAAC;IACvB,YAAY,CAAS;IACrB,aAAa,GAA0B,IAAI,CAAC;IAC5C,cAAc,GAAa,EAAE,CAAC;IAEtC;QACE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAEjE,oDAAoD;QACpD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE7B,iBAAiB;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,iEAAiE;QACjE,+DAA+D;QAC/D,iEAAiE;QAEjE,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,EAClD,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QAEF,yCAAyC;QACzC,+CAA+C;QAC/C,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACzC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,YAAY;YACnD,IAAI,EAAE,CAAC,SAAS,CAAC;YACjB,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,WAAW,EAAE,OAAO;gBACpB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;aAC7F;SACF,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;YACtF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,qBAAqB;QACrB,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,+DAA+D;QAC/D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,oBAAoB;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,mBAAmB;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,SAAS,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE/D,kCAAkC;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,6BAA6B,EAAE;YACjE,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,YAAY;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,6DAA6D;QAC7D,+DAA+D;QAE/D,oCAAoC;QACpC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,kDAAkD;YAClD,IAAI,IAAI,CAAC,aAAa;gBAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;gBACzC,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,oBAAoB;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAC5C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YAEvD,kBAAkB;YAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;gBACpD,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;gBACpC,OAAO,EAAE,IAAI,CAAC,YAAY;gBAC1B,QAAQ,EAAE;oBACR,MAAM,EAAE,eAAe;oBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrC;aACF,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,EAAE;gBAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAEjE,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE,QAAQ,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,6CAA6C;QAC7C,uEAAuE;QACvE,0EAA0E;IAC5E,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAE9C,4BAA4B;YAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,EAAE;gBAC7C,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM;gBACvC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,sDAAsD;QACtD,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,uCAAuC,CAAC;QACjD,CAAC;QAED,OAAO,WAAW,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,cAAc,CAAC,MAAM,+CAA+C,CAAC;IAC1H,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,OAA6B;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE;YACrC,IAAI;YACJ,MAAM,EAAE,mBAAmB;YAC3B,OAAO;YACP,OAAO;YACP,OAAO,EAAE,IAAI,CAAC,YAAY;SAC3B,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAyB;QAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAQ,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;QACnF,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,IAAI,IAAI,CAAC,aAAa;YAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;CACF;AAED,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC5C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,iDAAiD;IACjD,uDAAuD;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,qCAAqC;AACvC,CAAC;AAED,uBAAuB;AACvB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC5C,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -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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"}
|