squish-memory 0.8.2 → 0.9.2
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.env.mcp +30 -0
- package/.mcp.json +2 -5
- package/CHANGELOG.md +111 -0
- package/QUICK-START.md +65 -0
- package/README.md +188 -530
- package/commands/managed-sync.ts +69 -0
- package/commands/mcp-server.ts +519 -0
- package/config/mcp-cli-fallback-policy.json +22 -0
- package/config/mcp-migration-map.json +22 -0
- package/config/mcp-mode-semantics.json +21 -0
- package/config/mcp-remote-auth.json +36 -0
- package/config/mcp-universal.schema.json +48 -0
- package/config/mcp.json +38 -0
- package/config/remote-memory-policy.json +32 -0
- package/dist/algorithms/merge/detection/hash-filters.js +2 -2
- package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
- package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
- package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
- package/dist/api/web/index.d.ts +3 -0
- package/dist/api/web/index.d.ts.map +1 -0
- package/dist/api/web/index.js +4 -0
- package/dist/api/web/index.js.map +1 -0
- package/dist/api/web/web-server.d.ts +3 -0
- package/dist/api/web/web-server.d.ts.map +1 -0
- package/dist/api/web/web-server.js +6 -0
- package/dist/api/web/web-server.js.map +1 -0
- package/dist/api/web/web.d.ts.map +1 -1
- package/dist/api/web/web.js +227 -78
- package/dist/api/web/web.js.map +1 -1
- package/dist/commands/managed-sync.d.ts +10 -0
- package/dist/commands/managed-sync.d.ts.map +1 -0
- package/dist/commands/managed-sync.js +64 -0
- package/dist/commands/managed-sync.js.map +1 -0
- package/dist/commands/mcp-server.d.ts +3 -0
- package/dist/commands/mcp-server.d.ts.map +1 -0
- package/dist/commands/mcp-server.js +389 -0
- package/dist/commands/mcp-server.js.map +1 -0
- package/dist/config.d.ts +24 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +32 -1
- package/dist/config.js.map +1 -1
- package/dist/core/associations.d.ts +1 -1
- package/dist/core/associations.d.ts.map +1 -1
- package/dist/core/consolidation.d.ts +31 -0
- package/dist/core/consolidation.d.ts.map +1 -1
- package/dist/core/consolidation.js +237 -29
- package/dist/core/consolidation.js.map +1 -1
- package/dist/core/embeddings/google-multimodal.d.ts +14 -0
- package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
- package/dist/core/embeddings/google-multimodal.js +142 -0
- package/dist/core/embeddings/google-multimodal.js.map +1 -0
- package/dist/core/embeddings.d.ts +3 -2
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +61 -39
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/mcp/client.d.ts +17 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +101 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/index.d.ts +6 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +6 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/server.d.ts +18 -0
- package/dist/core/mcp/server.d.ts.map +1 -0
- package/dist/core/mcp/server.js +131 -0
- package/dist/core/mcp/server.js.map +1 -0
- package/dist/core/mcp/standalone-server.d.ts +13 -0
- package/dist/core/mcp/standalone-server.d.ts.map +1 -0
- package/dist/core/mcp/standalone-server.js +46 -0
- package/dist/core/mcp/standalone-server.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +9 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +262 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/mcp/types.d.ts +315 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +48 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/memory/categorizer.d.ts +27 -0
- package/dist/core/memory/categorizer.d.ts.map +1 -0
- package/dist/core/memory/categorizer.js +304 -0
- package/dist/core/memory/categorizer.js.map +1 -0
- package/dist/core/memory/conflict-detector.d.ts +7 -0
- package/dist/core/memory/conflict-detector.d.ts.map +1 -0
- package/dist/core/memory/conflict-detector.js +43 -0
- package/dist/core/memory/conflict-detector.js.map +1 -0
- package/dist/core/memory/context-collector.d.ts +10 -0
- package/dist/core/memory/context-collector.d.ts.map +1 -0
- package/dist/core/memory/context-collector.js +55 -0
- package/dist/core/memory/context-collector.js.map +1 -0
- package/dist/core/memory/contradiction-resolver.d.ts +40 -0
- package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
- package/dist/core/memory/contradiction-resolver.js +368 -0
- package/dist/core/memory/contradiction-resolver.js.map +1 -0
- package/dist/core/memory/edit-workflow.d.ts +19 -0
- package/dist/core/memory/edit-workflow.d.ts.map +1 -0
- package/dist/core/memory/edit-workflow.js +120 -0
- package/dist/core/memory/edit-workflow.js.map +1 -0
- package/dist/core/memory/feedback-tracker.d.ts +12 -0
- package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
- package/dist/core/memory/feedback-tracker.js +151 -0
- package/dist/core/memory/feedback-tracker.js.map +1 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
- package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/core/memory/hybrid-retrieval.js +56 -28
- package/dist/core/memory/hybrid-retrieval.js.map +1 -1
- package/dist/core/memory/hybrid-scorer.d.ts +5 -16
- package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
- package/dist/core/memory/hybrid-scorer.js +161 -125
- package/dist/core/memory/hybrid-scorer.js.map +1 -1
- package/dist/core/memory/hybrid-search.js +64 -22
- package/dist/core/memory/hybrid-search.js.map +1 -1
- package/dist/core/memory/memories.d.ts +4 -0
- package/dist/core/memory/memories.d.ts.map +1 -1
- package/dist/core/memory/memories.js +138 -60
- package/dist/core/memory/memories.js.map +1 -1
- package/dist/core/memory/progressive-disclosure.d.ts +43 -0
- package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
- package/dist/core/memory/progressive-disclosure.js +280 -0
- package/dist/core/memory/progressive-disclosure.js.map +1 -0
- package/dist/core/memory/query-rewriter.d.ts +13 -0
- package/dist/core/memory/query-rewriter.d.ts.map +1 -0
- package/dist/core/memory/query-rewriter.js +118 -0
- package/dist/core/memory/query-rewriter.js.map +1 -0
- package/dist/core/memory/response-analyzer.d.ts +9 -0
- package/dist/core/memory/response-analyzer.d.ts.map +1 -0
- package/dist/core/memory/response-analyzer.js +61 -0
- package/dist/core/memory/response-analyzer.js.map +1 -0
- package/dist/core/memory/stats.d.ts +17 -0
- package/dist/core/memory/stats.d.ts.map +1 -0
- package/dist/core/memory/stats.js +87 -0
- package/dist/core/memory/stats.js.map +1 -0
- package/dist/core/memory/telemetry.d.ts +69 -0
- package/dist/core/memory/telemetry.d.ts.map +1 -0
- package/dist/core/memory/telemetry.js +313 -0
- package/dist/core/memory/telemetry.js.map +1 -0
- package/dist/core/memory/temporal-facts.d.ts +41 -0
- package/dist/core/memory/temporal-facts.d.ts.map +1 -0
- package/dist/core/memory/temporal-facts.js +262 -0
- package/dist/core/memory/temporal-facts.js.map +1 -0
- package/dist/core/memory/trigger-detector.d.ts +14 -0
- package/dist/core/memory/trigger-detector.d.ts.map +1 -0
- package/dist/core/memory/trigger-detector.js +42 -0
- package/dist/core/memory/trigger-detector.js.map +1 -0
- package/dist/core/memory/write-gate.d.ts +54 -0
- package/dist/core/memory/write-gate.d.ts.map +1 -0
- package/dist/core/memory/write-gate.js +210 -0
- package/dist/core/memory/write-gate.js.map +1 -0
- package/dist/core/observations.d.ts.map +1 -1
- package/dist/core/observations.js +1 -0
- package/dist/core/observations.js.map +1 -1
- package/dist/core/projects.d.ts +2 -0
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +33 -0
- package/dist/core/projects.js.map +1 -1
- package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
- package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/cron-scheduler.js +238 -0
- package/dist/core/scheduler/cron-scheduler.js.map +1 -0
- package/dist/core/scheduler/heartbeat.d.ts +11 -0
- package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
- package/dist/core/scheduler/heartbeat.js +73 -0
- package/dist/core/scheduler/heartbeat.js.map +1 -0
- package/dist/core/scheduler/index.d.ts +8 -0
- package/dist/core/scheduler/index.d.ts.map +1 -0
- package/dist/core/scheduler/index.js +8 -0
- package/dist/core/scheduler/index.js.map +1 -0
- package/dist/core/scheduler/job-runner.d.ts +11 -0
- package/dist/core/scheduler/job-runner.d.ts.map +1 -0
- package/dist/core/scheduler/job-runner.js +161 -0
- package/dist/core/scheduler/job-runner.js.map +1 -0
- package/dist/core/session/auto-load.d.ts +6 -0
- package/dist/core/session/auto-load.d.ts.map +1 -0
- package/dist/core/session/auto-load.js +119 -0
- package/dist/core/session/auto-load.js.map +1 -0
- package/dist/core/session/index.d.ts +7 -0
- package/dist/core/session/index.d.ts.map +1 -0
- package/dist/core/session/index.js +7 -0
- package/dist/core/session/index.js.map +1 -0
- package/dist/core/session/types.d.ts +26 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js +10 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/snapshots/comparison.d.ts.map +1 -1
- package/dist/core/snapshots/comparison.js +8 -2
- package/dist/core/snapshots/comparison.js.map +1 -1
- package/dist/core/utils/content-extraction.d.ts.map +1 -1
- package/dist/core/utils/content-extraction.js +11 -1
- package/dist/core/utils/content-extraction.js.map +1 -1
- package/dist/core/utils/memory-operations.d.ts.map +1 -1
- package/dist/core/utils/memory-operations.js +3 -1
- package/dist/core/utils/memory-operations.js.map +1 -1
- package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
- package/dist/core/utils/summarization-helpers.js +4 -1
- package/dist/core/utils/summarization-helpers.js.map +1 -1
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +26 -3
- package/dist/core/utils.js.map +1 -1
- package/dist/core/worker.d.ts +20 -0
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js +86 -0
- package/dist/core/worker.js.map +1 -1
- package/dist/db/adapter.d.ts +1 -5
- package/dist/db/adapter.d.ts.map +1 -1
- package/dist/db/adapter.js +137 -12
- package/dist/db/adapter.js.map +1 -1
- package/dist/db/bootstrap.d.ts.map +1 -1
- package/dist/db/bootstrap.js +178 -3
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +7 -4
- package/dist/db/index.js.map +1 -1
- package/dist/drizzle/schema-sqlite.d.ts +1953 -612
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
- package/dist/drizzle/schema-sqlite.js +134 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -1
- package/dist/drizzle/schema.d.ts +684 -3
- package/dist/drizzle/schema.d.ts.map +1 -1
- package/dist/drizzle/schema.js +81 -1
- package/dist/drizzle/schema.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +152 -13
- package/dist/index.js.map +1 -1
- package/package.json +126 -103
- package/scripts/build-release.sh +33 -0
- package/scripts/db/check-db.mjs +88 -0
- package/scripts/db/fix-all-columns.mjs +52 -0
- package/scripts/db/fix-schema-all.mjs +55 -0
- package/scripts/db/fix-schema-full.mjs +46 -0
- package/scripts/db/fix-schema.mjs +38 -0
- package/scripts/db/init-db.mjs +13 -0
- package/scripts/db/recreate-db.mjs +14 -0
- package/scripts/generate-mcp.mjs +264 -0
- package/scripts/github-release.sh +61 -0
- package/scripts/init-dirs.mjs +13 -0
- package/scripts/init-dirs.ts +15 -0
- package/scripts/install-mcp.mjs +116 -0
- package/scripts/install-web.sh +120 -0
- package/scripts/install.mjs +340 -0
- package/scripts/openclaw-bootstrap.mjs +127 -0
- package/scripts/package-release.sh +71 -0
- package/scripts/remote-preflight.mjs +62 -0
- package/scripts/squish-fallback.mjs +132 -0
- package/scripts/test/test-all-systems.mjs +139 -0
- package/scripts/test/test-memory-system.mjs +139 -0
- package/scripts/test/test-v0.5.0.mjs +210 -0
- package/scripts/verify-mcp.mjs +214 -0
- package/skills/memory-guide/SKILL.md +181 -123
- package/skills/squish-cli/SKILL.md +200 -0
- package/skills/squish-mcp/SKILL.md +311 -0
- package/skills/squish-memory/SKILL.md +100 -62
- package/skills/squish-memory/claude-desktop.json +12 -0
- package/skills/squish-memory/install.mjs +335 -0
- package/skills/squish-memory/install.sh +94 -62
- package/skills/squish-memory/openclaw.json +13 -0
- package/skills/squish-memory/opencode.json +14 -0
- package/skills/squish-memory/skill.json +32 -0
- package/dist/adapters/claude-code/capture.d.ts +0 -11
- package/dist/adapters/claude-code/capture.d.ts.map +0 -1
- package/dist/adapters/claude-code/capture.js +0 -100
- package/dist/adapters/claude-code/capture.js.map +0 -1
- package/dist/adapters/claude-code/index.d.ts +0 -5
- package/dist/adapters/claude-code/index.d.ts.map +0 -1
- package/dist/adapters/claude-code/index.js +0 -6
- package/dist/adapters/claude-code/index.js.map +0 -1
- package/dist/adapters/claude-code/injection.d.ts +0 -34
- package/dist/adapters/claude-code/injection.d.ts.map +0 -1
- package/dist/adapters/claude-code/injection.js +0 -127
- package/dist/adapters/claude-code/injection.js.map +0 -1
- package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
- package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
- package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
- package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
- package/dist/adapters/claude-code/types.d.ts +0 -46
- package/dist/adapters/claude-code/types.d.ts.map +0 -1
- package/dist/adapters/claude-code/types.js +0 -6
- package/dist/adapters/claude-code/types.js.map +0 -1
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Squish Memory v0.9.0 - OpenClaw Self-Install Script
|
|
5
|
+
*
|
|
6
|
+
* Usage: npx squish-memory install
|
|
7
|
+
* node install.mjs
|
|
8
|
+
* squish install
|
|
9
|
+
*
|
|
10
|
+
* This script:
|
|
11
|
+
* 1. Detects OpenClaw directory
|
|
12
|
+
* 2. Installs Squish CLI globally if needed
|
|
13
|
+
* 3. Configures MCP via mcporter
|
|
14
|
+
* 4. Creates .squish data directory
|
|
15
|
+
* 5. Runs health check
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import fs from "node:fs";
|
|
19
|
+
import os from "node:os";
|
|
20
|
+
import path from "node:path";
|
|
21
|
+
import { spawnSync } from "node:child_process";
|
|
22
|
+
|
|
23
|
+
const SQUISH_VERSION = "0.9.0";
|
|
24
|
+
const OPENCLAW_DEFAULT_DIR = path.join(os.homedir(), ".openclaw");
|
|
25
|
+
const SQUISH_DATA_DIR = path.join(os.homedir(), ".squish");
|
|
26
|
+
|
|
27
|
+
const colors = {
|
|
28
|
+
red: "\x1b[31m",
|
|
29
|
+
green: "\x1b[32m",
|
|
30
|
+
yellow: "\x1b[33m",
|
|
31
|
+
blue: "\x1b[34m",
|
|
32
|
+
cyan: "\x1b[36m",
|
|
33
|
+
reset: "\x1b[0m"
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
function log(color, message) {
|
|
37
|
+
console.log(`${colors[color]}${message}${colors.reset}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function detectOpenClawDir() {
|
|
41
|
+
if (process.env.OPENCLAW_HOME) {
|
|
42
|
+
return process.env.OPENCLAW_HOME;
|
|
43
|
+
}
|
|
44
|
+
return OPENCLAW_DEFAULT_DIR;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function checkCommandAvailable(cmd) {
|
|
48
|
+
const result = spawnSync(cmd, ["--version"], {
|
|
49
|
+
encoding: "utf8",
|
|
50
|
+
shell: process.platform === "win32"
|
|
51
|
+
});
|
|
52
|
+
return result.status === 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getSquishBinary() {
|
|
56
|
+
if (checkCommandAvailable("squish")) {
|
|
57
|
+
return "squish";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const candidates = [
|
|
61
|
+
path.join(os.homedir(), ".local", "bin", "squish"),
|
|
62
|
+
path.join(os.homedir(), "node_modules", ".bin", "squish"),
|
|
63
|
+
"/usr/local/bin/squish",
|
|
64
|
+
"/usr/bin/squish"
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
for (const candidate of candidates) {
|
|
68
|
+
if (fs.existsSync(candidate)) {
|
|
69
|
+
return candidate;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function installSquishGlobally() {
|
|
77
|
+
log("blue", "Installing squish-memory globally...");
|
|
78
|
+
|
|
79
|
+
let result = spawnSync("bun", ["add", "-g", "squish-memory"], {
|
|
80
|
+
encoding: "utf8",
|
|
81
|
+
shell: process.platform === "win32",
|
|
82
|
+
stdio: "inherit"
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if (result.status !== 0) {
|
|
86
|
+
log("yellow", "bun not available, trying npm...");
|
|
87
|
+
result = spawnSync("npm", ["install", "-g", "squish-memory"], {
|
|
88
|
+
encoding: "utf8",
|
|
89
|
+
shell: process.platform === "win32",
|
|
90
|
+
stdio: "inherit"
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return result.status === 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function ensureDir(dirPath) {
|
|
98
|
+
if (!fs.existsSync(dirPath)) {
|
|
99
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
100
|
+
log("green", `Created directory: ${dirPath}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function readJson(filePath) {
|
|
105
|
+
if (!fs.existsSync(filePath)) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
110
|
+
} catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function writeJson(filePath, data) {
|
|
116
|
+
fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function backupIfExists(filePath) {
|
|
120
|
+
if (fs.existsSync(filePath)) {
|
|
121
|
+
const backupPath = `${filePath}.bak.${Date.now()}`;
|
|
122
|
+
fs.copyFileSync(filePath, backupPath);
|
|
123
|
+
log("yellow", `Backed up: ${backupPath}`);
|
|
124
|
+
return backupPath;
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function configureMcporter(openclawDir) {
|
|
130
|
+
const mcporterPath = path.join(openclawDir, "mcporter.json");
|
|
131
|
+
|
|
132
|
+
const squishConfig = {
|
|
133
|
+
command: "squish",
|
|
134
|
+
args: [],
|
|
135
|
+
env: {
|
|
136
|
+
SQUISH_MODE: "local",
|
|
137
|
+
SQUISH_EMBEDDINGS_PROVIDER: "local"
|
|
138
|
+
},
|
|
139
|
+
transport: "stdio"
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
let config = readJson(mcporterPath) || { mcpServers: {} };
|
|
143
|
+
|
|
144
|
+
if (config.mcpServers?.squish) {
|
|
145
|
+
log("cyan", "Squish already configured in mcporter.json");
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
backupIfExists(mcporterPath);
|
|
150
|
+
|
|
151
|
+
if (!config.mcpServers) {
|
|
152
|
+
config.mcpServers = {};
|
|
153
|
+
}
|
|
154
|
+
config.mcpServers.squish = squishConfig;
|
|
155
|
+
|
|
156
|
+
writeJson(mcporterPath, config);
|
|
157
|
+
log("green", `Configured mcporter: ${mcporterPath}`);
|
|
158
|
+
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function runHealthCheck() {
|
|
163
|
+
const squishBin = getSquishBinary();
|
|
164
|
+
if (!squishBin) {
|
|
165
|
+
log("yellow", "Squish binary not found, skipping health check");
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
log("blue", "Running health check...");
|
|
170
|
+
const result = spawnSync(squishBin, ["health"], {
|
|
171
|
+
encoding: "utf8",
|
|
172
|
+
shell: process.platform === "win32",
|
|
173
|
+
stdio: "inherit"
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
return result.status === 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function printSuccess(openclawDir) {
|
|
180
|
+
console.log("");
|
|
181
|
+
log("green", "===========================================");
|
|
182
|
+
log("green", ` Squish Memory v${SQUISH_VERSION} Installed!`);
|
|
183
|
+
log("green", "===========================================");
|
|
184
|
+
console.log("");
|
|
185
|
+
log("cyan", "Configuration:");
|
|
186
|
+
console.log(` OpenClaw dir: ${openclawDir}`);
|
|
187
|
+
console.log(` Data dir: ${SQUISH_DATA_DIR}`);
|
|
188
|
+
console.log(` MCP config: ${path.join(openclawDir, "mcporter.json")}`);
|
|
189
|
+
console.log("");
|
|
190
|
+
log("cyan", "CLI Commands:");
|
|
191
|
+
console.log(" squish health - Check service health");
|
|
192
|
+
console.log(" squish remember \"text\" - Store a memory");
|
|
193
|
+
console.log(" squish search \"query\" - Search memories");
|
|
194
|
+
console.log(" squish stats - View statistics");
|
|
195
|
+
console.log("");
|
|
196
|
+
log("cyan", "MCP Tools (via mcporter):");
|
|
197
|
+
console.log(" remember, search, recall, observe");
|
|
198
|
+
console.log(" context, health, core_memory, forget");
|
|
199
|
+
console.log("");
|
|
200
|
+
log("blue", "Documentation: https://github.com/michielhdoteth/squish");
|
|
201
|
+
console.log("");
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function printDryRun(openclawDir) {
|
|
205
|
+
log("cyan", "=== DRY RUN MODE ===");
|
|
206
|
+
console.log("");
|
|
207
|
+
console.log("Would perform:");
|
|
208
|
+
console.log(` 1. Ensure OpenClaw dir: ${openclawDir}`);
|
|
209
|
+
console.log(` 2. Ensure data dir: ${SQUISH_DATA_DIR}`);
|
|
210
|
+
console.log(` 3. Configure mcporter: ${path.join(openclawDir, "mcporter.json")}`);
|
|
211
|
+
console.log(` 4. Run health check`);
|
|
212
|
+
console.log("");
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function parseArgs(argv) {
|
|
216
|
+
const args = {
|
|
217
|
+
dryRun: false,
|
|
218
|
+
openclawDir: null,
|
|
219
|
+
skipInstall: false
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
for (let i = 2; i < argv.length; i++) {
|
|
223
|
+
const token = argv[i];
|
|
224
|
+
if (token === "--dry-run" || token === "-n") {
|
|
225
|
+
args.dryRun = true;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (token === "--openclaw-dir" || token === "-o") {
|
|
229
|
+
args.openclawDir = path.resolve(argv[i + 1]);
|
|
230
|
+
i++;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (token === "--skip-install") {
|
|
234
|
+
args.skipInstall = true;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (token === "--help" || token === "-h") {
|
|
238
|
+
console.log(`
|
|
239
|
+
Squish Memory v${SQUISH_VERSION} - OpenClaw Self-Install
|
|
240
|
+
|
|
241
|
+
Usage: npx squish-memory install [options]
|
|
242
|
+
|
|
243
|
+
Options:
|
|
244
|
+
--dry-run, -n Show what would be done without making changes
|
|
245
|
+
--openclaw-dir, -o Specify OpenClaw directory (default: ~/.openclaw)
|
|
246
|
+
--skip-install Skip global npm install step
|
|
247
|
+
--help, -h Show this help message
|
|
248
|
+
`);
|
|
249
|
+
process.exit(0);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return args;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Run the installer programmatically (for CLI command)
|
|
258
|
+
*/
|
|
259
|
+
export async function runInstall(options = {}) {
|
|
260
|
+
const {
|
|
261
|
+
dryRun = false,
|
|
262
|
+
openclawDir: customOpenclawDir = null,
|
|
263
|
+
skipInstall = false
|
|
264
|
+
} = options;
|
|
265
|
+
|
|
266
|
+
log("blue", `Squish Memory v${SQUISH_VERSION} - OpenClaw Installer`);
|
|
267
|
+
log("blue", "===================================================");
|
|
268
|
+
console.log("");
|
|
269
|
+
|
|
270
|
+
const openclawDir = customOpenclawDir || detectOpenClawDir();
|
|
271
|
+
|
|
272
|
+
if (dryRun) {
|
|
273
|
+
printDryRun(openclawDir);
|
|
274
|
+
return { success: true, dryRun: true };
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Step 1: Check/install Squish globally
|
|
278
|
+
let squishBin = getSquishBinary();
|
|
279
|
+
if (!squishBin && !skipInstall) {
|
|
280
|
+
const installed = installSquishGlobally();
|
|
281
|
+
if (!installed) {
|
|
282
|
+
log("red", "Failed to install squish-memory globally");
|
|
283
|
+
log("yellow", "Please install manually: npm install -g squish-memory");
|
|
284
|
+
return { success: false, error: "Failed to install globally" };
|
|
285
|
+
}
|
|
286
|
+
squishBin = getSquishBinary();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (!squishBin) {
|
|
290
|
+
log("red", "Squish binary not found after installation");
|
|
291
|
+
return { success: false, error: "Squish binary not found" };
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
log("green", `Squish binary: ${squishBin}`);
|
|
295
|
+
|
|
296
|
+
// Step 2: Ensure OpenClaw directory exists
|
|
297
|
+
ensureDir(openclawDir);
|
|
298
|
+
|
|
299
|
+
// Step 3: Ensure .squish data directory exists
|
|
300
|
+
ensureDir(SQUISH_DATA_DIR);
|
|
301
|
+
|
|
302
|
+
// Step 4: Configure mcporter
|
|
303
|
+
configureMcporter(openclawDir);
|
|
304
|
+
|
|
305
|
+
// Step 5: Run health check
|
|
306
|
+
const healthOk = runHealthCheck();
|
|
307
|
+
|
|
308
|
+
if (!healthOk) {
|
|
309
|
+
log("yellow", "Health check failed, but installation completed");
|
|
310
|
+
log("yellow", "You may need to restart your shell or add squish to PATH");
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Print success message
|
|
314
|
+
printSuccess(openclawDir);
|
|
315
|
+
|
|
316
|
+
return { success: true };
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Main entry point when run directly
|
|
321
|
+
*/
|
|
322
|
+
async function main() {
|
|
323
|
+
const args = parseArgs(process.argv);
|
|
324
|
+
const result = await runInstall({
|
|
325
|
+
dryRun: args.dryRun,
|
|
326
|
+
openclawDir: args.openclawDir,
|
|
327
|
+
skipInstall: args.skipInstall
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
if (!result.success) {
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Run main if executed directly
|
|
336
|
+
main().catch((err) => {
|
|
337
|
+
log("red", `Installation failed: ${err.message}`);
|
|
338
|
+
console.error(err);
|
|
339
|
+
process.exit(1);
|
|
340
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
|
|
8
|
+
const root = process.cwd();
|
|
9
|
+
const defaultSourceDir = path.join(root, "generated", "mcp");
|
|
10
|
+
const defaultTargetDir = path.join(os.homedir(), ".openclaw");
|
|
11
|
+
|
|
12
|
+
function parseArgs(argv) {
|
|
13
|
+
const args = {
|
|
14
|
+
sourceDir: defaultSourceDir,
|
|
15
|
+
targetDir: defaultTargetDir,
|
|
16
|
+
dryRun: false,
|
|
17
|
+
skipToolCheck: false
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
for (let i = 2; i < argv.length; i += 1) {
|
|
21
|
+
const token = argv[i];
|
|
22
|
+
if (token === "--dry-run") {
|
|
23
|
+
args.dryRun = true;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (token === "--skip-tool-check") {
|
|
27
|
+
args.skipToolCheck = true;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (token === "--source") {
|
|
31
|
+
args.sourceDir = path.resolve(argv[i + 1]);
|
|
32
|
+
i += 1;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (token === "--target") {
|
|
36
|
+
args.targetDir = path.resolve(argv[i + 1]);
|
|
37
|
+
i += 1;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Unknown argument: ${token}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return args;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function ensureDir(dirPath) {
|
|
47
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function checkBinaryAvailable(binaryName) {
|
|
51
|
+
const run = spawnSync(binaryName, ["--version"], { encoding: "utf8" });
|
|
52
|
+
return run.status === 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function readJson(filePath) {
|
|
56
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function writeJson(filePath, data) {
|
|
60
|
+
fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function deepMerge(base, overlay) {
|
|
64
|
+
if (Array.isArray(base) || Array.isArray(overlay)) {
|
|
65
|
+
return overlay;
|
|
66
|
+
}
|
|
67
|
+
if (base && typeof base === "object" && overlay && typeof overlay === "object") {
|
|
68
|
+
const out = { ...base };
|
|
69
|
+
for (const [key, value] of Object.entries(overlay)) {
|
|
70
|
+
out[key] = key in out ? deepMerge(out[key], value) : value;
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
return overlay;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function backupIfExists(filePath) {
|
|
78
|
+
if (fs.existsSync(filePath)) {
|
|
79
|
+
fs.copyFileSync(filePath, `${filePath}.bak`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function requireSource(filePath) {
|
|
84
|
+
if (!fs.existsSync(filePath)) {
|
|
85
|
+
throw new Error(`Required source artifact not found: ${filePath}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function main() {
|
|
90
|
+
const args = parseArgs(process.argv);
|
|
91
|
+
|
|
92
|
+
if (!args.skipToolCheck) {
|
|
93
|
+
if (!checkBinaryAvailable("mcporter")) {
|
|
94
|
+
throw new Error("mcporter is not available on PATH");
|
|
95
|
+
}
|
|
96
|
+
if (!checkBinaryAvailable("qmd")) {
|
|
97
|
+
throw new Error("qmd is not available on PATH");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const mcporterSource = path.join(args.sourceDir, "mcporter.json");
|
|
102
|
+
const openclawSnippetSource = path.join(args.sourceDir, "openclaw-memory-qmd.json");
|
|
103
|
+
requireSource(mcporterSource);
|
|
104
|
+
requireSource(openclawSnippetSource);
|
|
105
|
+
|
|
106
|
+
ensureDir(args.targetDir);
|
|
107
|
+
|
|
108
|
+
const mcporterTarget = path.join(args.targetDir, "mcporter.json");
|
|
109
|
+
const memoryTarget = path.join(args.targetDir, "openclaw-memory.json");
|
|
110
|
+
|
|
111
|
+
if (!args.dryRun) {
|
|
112
|
+
backupIfExists(mcporterTarget);
|
|
113
|
+
fs.copyFileSync(mcporterSource, mcporterTarget);
|
|
114
|
+
|
|
115
|
+
const base = fs.existsSync(memoryTarget) ? readJson(memoryTarget) : {};
|
|
116
|
+
const snippet = readJson(openclawSnippetSource);
|
|
117
|
+
const merged = deepMerge(base, snippet);
|
|
118
|
+
backupIfExists(memoryTarget);
|
|
119
|
+
writeJson(memoryTarget, merged);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const prefix = args.dryRun ? "DRY_RUN" : "BOOTSTRAPPED";
|
|
123
|
+
console.log(`${prefix} mcporter config -> ${mcporterTarget}`);
|
|
124
|
+
console.log(`${prefix} memory config merge -> ${memoryTarget}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
main();
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Squish Release Packaging Script
|
|
4
|
+
# Creates platform-specific packages for distribution
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
VERSION=$(node -p "require('./package.json').version")
|
|
9
|
+
echo "Building Squish v$VERSION release packages..."
|
|
10
|
+
|
|
11
|
+
# Clean previous builds
|
|
12
|
+
rm -rf dist/ *.tar.gz *.zip
|
|
13
|
+
|
|
14
|
+
# Build production version
|
|
15
|
+
npm run build:prod
|
|
16
|
+
|
|
17
|
+
# Create platform-specific packages
|
|
18
|
+
create_package() {
|
|
19
|
+
local platform=$1
|
|
20
|
+
local arch=$2
|
|
21
|
+
local output_name="squish-${VERSION}-${platform}-${arch}"
|
|
22
|
+
|
|
23
|
+
echo "Creating $output_name..."
|
|
24
|
+
|
|
25
|
+
# Create package directory
|
|
26
|
+
mkdir -p "package/$output_name"
|
|
27
|
+
mkdir -p "package/$output_name/bin"
|
|
28
|
+
|
|
29
|
+
# Copy files
|
|
30
|
+
cp -r dist/prod/* "package/$output_name/"
|
|
31
|
+
cp install.sh "package/$output_name/"
|
|
32
|
+
cp README.md "package/$output_name/"
|
|
33
|
+
cp LICENSE "package/$output_name/"
|
|
34
|
+
|
|
35
|
+
# Create executable wrapper
|
|
36
|
+
cat > "package/$output_name/bin/squish" << 'EOF'
|
|
37
|
+
#!/bin/bash
|
|
38
|
+
# Squish wrapper script
|
|
39
|
+
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
40
|
+
exec node "$DIR/src/index.js" "$@"
|
|
41
|
+
EOF
|
|
42
|
+
chmod +x "package/$output_name/bin/squish"
|
|
43
|
+
|
|
44
|
+
# Create archive
|
|
45
|
+
cd package
|
|
46
|
+
if [[ "$platform" == "windows" ]]; then
|
|
47
|
+
zip -r "../${output_name}.zip" "$output_name"
|
|
48
|
+
else
|
|
49
|
+
tar -czf "../${output_name}.tar.gz" "$output_name"
|
|
50
|
+
fi
|
|
51
|
+
cd ..
|
|
52
|
+
|
|
53
|
+
echo "✓ Created ${output_name}.tar.gz"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Build for multiple platforms
|
|
57
|
+
create_package "linux" "x64"
|
|
58
|
+
create_package "linux" "arm64"
|
|
59
|
+
create_package "macos" "x64"
|
|
60
|
+
create_package "macos" "arm64"
|
|
61
|
+
create_package "windows" "x64"
|
|
62
|
+
|
|
63
|
+
# Clean up
|
|
64
|
+
rm -rf package/
|
|
65
|
+
|
|
66
|
+
echo ""
|
|
67
|
+
echo "🎉 Release packages created:"
|
|
68
|
+
ls -la *.tar.gz *.zip 2>/dev/null || true
|
|
69
|
+
echo ""
|
|
70
|
+
echo "Upload these to GitHub releases at:"
|
|
71
|
+
echo "https://github.com/michielhdoteth/squish/releases/tag/v$VERSION"
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
|
|
6
|
+
const root = process.cwd();
|
|
7
|
+
const policyPath = path.join(root, "config", "remote-memory-policy.json");
|
|
8
|
+
|
|
9
|
+
function fail(message) {
|
|
10
|
+
process.stderr.write(`${message}\n`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function warn(message) {
|
|
15
|
+
process.stderr.write(`[warn] ${message}\n`);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function readPolicy() {
|
|
19
|
+
if (!fs.existsSync(policyPath)) {
|
|
20
|
+
fail(`Missing policy file: ${policyPath}`);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(fs.readFileSync(policyPath, "utf8"));
|
|
24
|
+
} catch (error) {
|
|
25
|
+
fail(`Invalid policy JSON: ${String(error)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function main() {
|
|
30
|
+
const policy = readPolicy();
|
|
31
|
+
const required = Array.isArray(policy.requiredEnv) ? policy.requiredEnv : [];
|
|
32
|
+
|
|
33
|
+
const missing = required.filter((key) => {
|
|
34
|
+
const value = process.env[key];
|
|
35
|
+
return !value || value.trim().length === 0;
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (missing.length > 0) {
|
|
39
|
+
fail(`Remote preflight failed: missing required env vars: ${missing.join(", ")}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const provider = process.env.SQUISH_EMBEDDINGS_PROVIDER || "local";
|
|
43
|
+
if (!["local", "openai", "ollama", "none", "hybrid", "qmd"].includes(provider)) {
|
|
44
|
+
fail(`Remote preflight failed: invalid SQUISH_EMBEDDINGS_PROVIDER='${provider}'`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (provider === "openai" && !process.env.SQUISH_OPENAI_API_KEY) {
|
|
48
|
+
warn("SQUISH_EMBEDDINGS_PROVIDER=openai but SQUISH_OPENAI_API_KEY is missing");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
process.stdout.write(
|
|
52
|
+
`${JSON.stringify({
|
|
53
|
+
success: true,
|
|
54
|
+
mode: "remote",
|
|
55
|
+
requiredEnvChecked: required,
|
|
56
|
+
embeddingsProvider: provider,
|
|
57
|
+
memoryPolicyVersion: policy.version
|
|
58
|
+
})}\n`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
main();
|