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.
Files changed (283) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.env.mcp +30 -0
  4. package/.mcp.json +2 -5
  5. package/CHANGELOG.md +111 -0
  6. package/QUICK-START.md +65 -0
  7. package/README.md +188 -530
  8. package/commands/managed-sync.ts +69 -0
  9. package/commands/mcp-server.ts +519 -0
  10. package/config/mcp-cli-fallback-policy.json +22 -0
  11. package/config/mcp-migration-map.json +22 -0
  12. package/config/mcp-mode-semantics.json +21 -0
  13. package/config/mcp-remote-auth.json +36 -0
  14. package/config/mcp-universal.schema.json +48 -0
  15. package/config/mcp.json +38 -0
  16. package/config/remote-memory-policy.json +32 -0
  17. package/dist/algorithms/merge/detection/hash-filters.js +2 -2
  18. package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
  19. package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
  20. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
  21. package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
  22. package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
  23. package/dist/api/web/index.d.ts +3 -0
  24. package/dist/api/web/index.d.ts.map +1 -0
  25. package/dist/api/web/index.js +4 -0
  26. package/dist/api/web/index.js.map +1 -0
  27. package/dist/api/web/web-server.d.ts +3 -0
  28. package/dist/api/web/web-server.d.ts.map +1 -0
  29. package/dist/api/web/web-server.js +6 -0
  30. package/dist/api/web/web-server.js.map +1 -0
  31. package/dist/api/web/web.d.ts.map +1 -1
  32. package/dist/api/web/web.js +227 -78
  33. package/dist/api/web/web.js.map +1 -1
  34. package/dist/commands/managed-sync.d.ts +10 -0
  35. package/dist/commands/managed-sync.d.ts.map +1 -0
  36. package/dist/commands/managed-sync.js +64 -0
  37. package/dist/commands/managed-sync.js.map +1 -0
  38. package/dist/commands/mcp-server.d.ts +3 -0
  39. package/dist/commands/mcp-server.d.ts.map +1 -0
  40. package/dist/commands/mcp-server.js +389 -0
  41. package/dist/commands/mcp-server.js.map +1 -0
  42. package/dist/config.d.ts +24 -1
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +32 -1
  45. package/dist/config.js.map +1 -1
  46. package/dist/core/associations.d.ts +1 -1
  47. package/dist/core/associations.d.ts.map +1 -1
  48. package/dist/core/consolidation.d.ts +31 -0
  49. package/dist/core/consolidation.d.ts.map +1 -1
  50. package/dist/core/consolidation.js +237 -29
  51. package/dist/core/consolidation.js.map +1 -1
  52. package/dist/core/embeddings/google-multimodal.d.ts +14 -0
  53. package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
  54. package/dist/core/embeddings/google-multimodal.js +142 -0
  55. package/dist/core/embeddings/google-multimodal.js.map +1 -0
  56. package/dist/core/embeddings.d.ts +3 -2
  57. package/dist/core/embeddings.d.ts.map +1 -1
  58. package/dist/core/embeddings.js +61 -39
  59. package/dist/core/embeddings.js.map +1 -1
  60. package/dist/core/mcp/client.d.ts +17 -0
  61. package/dist/core/mcp/client.d.ts.map +1 -0
  62. package/dist/core/mcp/client.js +101 -0
  63. package/dist/core/mcp/client.js.map +1 -0
  64. package/dist/core/mcp/index.d.ts +6 -0
  65. package/dist/core/mcp/index.d.ts.map +1 -0
  66. package/dist/core/mcp/index.js +6 -0
  67. package/dist/core/mcp/index.js.map +1 -0
  68. package/dist/core/mcp/server.d.ts +18 -0
  69. package/dist/core/mcp/server.d.ts.map +1 -0
  70. package/dist/core/mcp/server.js +131 -0
  71. package/dist/core/mcp/server.js.map +1 -0
  72. package/dist/core/mcp/standalone-server.d.ts +13 -0
  73. package/dist/core/mcp/standalone-server.d.ts.map +1 -0
  74. package/dist/core/mcp/standalone-server.js +46 -0
  75. package/dist/core/mcp/standalone-server.js.map +1 -0
  76. package/dist/core/mcp/tools.d.ts +9 -0
  77. package/dist/core/mcp/tools.d.ts.map +1 -0
  78. package/dist/core/mcp/tools.js +262 -0
  79. package/dist/core/mcp/tools.js.map +1 -0
  80. package/dist/core/mcp/types.d.ts +315 -0
  81. package/dist/core/mcp/types.d.ts.map +1 -0
  82. package/dist/core/mcp/types.js +48 -0
  83. package/dist/core/mcp/types.js.map +1 -0
  84. package/dist/core/memory/categorizer.d.ts +27 -0
  85. package/dist/core/memory/categorizer.d.ts.map +1 -0
  86. package/dist/core/memory/categorizer.js +304 -0
  87. package/dist/core/memory/categorizer.js.map +1 -0
  88. package/dist/core/memory/conflict-detector.d.ts +7 -0
  89. package/dist/core/memory/conflict-detector.d.ts.map +1 -0
  90. package/dist/core/memory/conflict-detector.js +43 -0
  91. package/dist/core/memory/conflict-detector.js.map +1 -0
  92. package/dist/core/memory/context-collector.d.ts +10 -0
  93. package/dist/core/memory/context-collector.d.ts.map +1 -0
  94. package/dist/core/memory/context-collector.js +55 -0
  95. package/dist/core/memory/context-collector.js.map +1 -0
  96. package/dist/core/memory/contradiction-resolver.d.ts +40 -0
  97. package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
  98. package/dist/core/memory/contradiction-resolver.js +368 -0
  99. package/dist/core/memory/contradiction-resolver.js.map +1 -0
  100. package/dist/core/memory/edit-workflow.d.ts +19 -0
  101. package/dist/core/memory/edit-workflow.d.ts.map +1 -0
  102. package/dist/core/memory/edit-workflow.js +120 -0
  103. package/dist/core/memory/edit-workflow.js.map +1 -0
  104. package/dist/core/memory/feedback-tracker.d.ts +12 -0
  105. package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
  106. package/dist/core/memory/feedback-tracker.js +151 -0
  107. package/dist/core/memory/feedback-tracker.js.map +1 -0
  108. package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
  109. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  110. package/dist/core/memory/hybrid-retrieval.js +56 -28
  111. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  112. package/dist/core/memory/hybrid-scorer.d.ts +5 -16
  113. package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
  114. package/dist/core/memory/hybrid-scorer.js +161 -125
  115. package/dist/core/memory/hybrid-scorer.js.map +1 -1
  116. package/dist/core/memory/hybrid-search.js +64 -22
  117. package/dist/core/memory/hybrid-search.js.map +1 -1
  118. package/dist/core/memory/memories.d.ts +4 -0
  119. package/dist/core/memory/memories.d.ts.map +1 -1
  120. package/dist/core/memory/memories.js +138 -60
  121. package/dist/core/memory/memories.js.map +1 -1
  122. package/dist/core/memory/progressive-disclosure.d.ts +43 -0
  123. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
  124. package/dist/core/memory/progressive-disclosure.js +280 -0
  125. package/dist/core/memory/progressive-disclosure.js.map +1 -0
  126. package/dist/core/memory/query-rewriter.d.ts +13 -0
  127. package/dist/core/memory/query-rewriter.d.ts.map +1 -0
  128. package/dist/core/memory/query-rewriter.js +118 -0
  129. package/dist/core/memory/query-rewriter.js.map +1 -0
  130. package/dist/core/memory/response-analyzer.d.ts +9 -0
  131. package/dist/core/memory/response-analyzer.d.ts.map +1 -0
  132. package/dist/core/memory/response-analyzer.js +61 -0
  133. package/dist/core/memory/response-analyzer.js.map +1 -0
  134. package/dist/core/memory/stats.d.ts +17 -0
  135. package/dist/core/memory/stats.d.ts.map +1 -0
  136. package/dist/core/memory/stats.js +87 -0
  137. package/dist/core/memory/stats.js.map +1 -0
  138. package/dist/core/memory/telemetry.d.ts +69 -0
  139. package/dist/core/memory/telemetry.d.ts.map +1 -0
  140. package/dist/core/memory/telemetry.js +313 -0
  141. package/dist/core/memory/telemetry.js.map +1 -0
  142. package/dist/core/memory/temporal-facts.d.ts +41 -0
  143. package/dist/core/memory/temporal-facts.d.ts.map +1 -0
  144. package/dist/core/memory/temporal-facts.js +262 -0
  145. package/dist/core/memory/temporal-facts.js.map +1 -0
  146. package/dist/core/memory/trigger-detector.d.ts +14 -0
  147. package/dist/core/memory/trigger-detector.d.ts.map +1 -0
  148. package/dist/core/memory/trigger-detector.js +42 -0
  149. package/dist/core/memory/trigger-detector.js.map +1 -0
  150. package/dist/core/memory/write-gate.d.ts +54 -0
  151. package/dist/core/memory/write-gate.d.ts.map +1 -0
  152. package/dist/core/memory/write-gate.js +210 -0
  153. package/dist/core/memory/write-gate.js.map +1 -0
  154. package/dist/core/observations.d.ts.map +1 -1
  155. package/dist/core/observations.js +1 -0
  156. package/dist/core/observations.js.map +1 -1
  157. package/dist/core/projects.d.ts +2 -0
  158. package/dist/core/projects.d.ts.map +1 -1
  159. package/dist/core/projects.js +33 -0
  160. package/dist/core/projects.js.map +1 -1
  161. package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
  162. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
  163. package/dist/core/scheduler/cron-scheduler.js +238 -0
  164. package/dist/core/scheduler/cron-scheduler.js.map +1 -0
  165. package/dist/core/scheduler/heartbeat.d.ts +11 -0
  166. package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
  167. package/dist/core/scheduler/heartbeat.js +73 -0
  168. package/dist/core/scheduler/heartbeat.js.map +1 -0
  169. package/dist/core/scheduler/index.d.ts +8 -0
  170. package/dist/core/scheduler/index.d.ts.map +1 -0
  171. package/dist/core/scheduler/index.js +8 -0
  172. package/dist/core/scheduler/index.js.map +1 -0
  173. package/dist/core/scheduler/job-runner.d.ts +11 -0
  174. package/dist/core/scheduler/job-runner.d.ts.map +1 -0
  175. package/dist/core/scheduler/job-runner.js +161 -0
  176. package/dist/core/scheduler/job-runner.js.map +1 -0
  177. package/dist/core/session/auto-load.d.ts +6 -0
  178. package/dist/core/session/auto-load.d.ts.map +1 -0
  179. package/dist/core/session/auto-load.js +119 -0
  180. package/dist/core/session/auto-load.js.map +1 -0
  181. package/dist/core/session/index.d.ts +7 -0
  182. package/dist/core/session/index.d.ts.map +1 -0
  183. package/dist/core/session/index.js +7 -0
  184. package/dist/core/session/index.js.map +1 -0
  185. package/dist/core/session/types.d.ts +26 -0
  186. package/dist/core/session/types.d.ts.map +1 -0
  187. package/dist/core/session/types.js +10 -0
  188. package/dist/core/session/types.js.map +1 -0
  189. package/dist/core/snapshots/comparison.d.ts.map +1 -1
  190. package/dist/core/snapshots/comparison.js +8 -2
  191. package/dist/core/snapshots/comparison.js.map +1 -1
  192. package/dist/core/utils/content-extraction.d.ts.map +1 -1
  193. package/dist/core/utils/content-extraction.js +11 -1
  194. package/dist/core/utils/content-extraction.js.map +1 -1
  195. package/dist/core/utils/memory-operations.d.ts.map +1 -1
  196. package/dist/core/utils/memory-operations.js +3 -1
  197. package/dist/core/utils/memory-operations.js.map +1 -1
  198. package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
  199. package/dist/core/utils/summarization-helpers.js +4 -1
  200. package/dist/core/utils/summarization-helpers.js.map +1 -1
  201. package/dist/core/utils.d.ts.map +1 -1
  202. package/dist/core/utils.js +26 -3
  203. package/dist/core/utils.js.map +1 -1
  204. package/dist/core/worker.d.ts +20 -0
  205. package/dist/core/worker.d.ts.map +1 -1
  206. package/dist/core/worker.js +86 -0
  207. package/dist/core/worker.js.map +1 -1
  208. package/dist/db/adapter.d.ts +1 -5
  209. package/dist/db/adapter.d.ts.map +1 -1
  210. package/dist/db/adapter.js +137 -12
  211. package/dist/db/adapter.js.map +1 -1
  212. package/dist/db/bootstrap.d.ts.map +1 -1
  213. package/dist/db/bootstrap.js +178 -3
  214. package/dist/db/bootstrap.js.map +1 -1
  215. package/dist/db/index.d.ts +1 -5
  216. package/dist/db/index.d.ts.map +1 -1
  217. package/dist/db/index.js +7 -4
  218. package/dist/db/index.js.map +1 -1
  219. package/dist/drizzle/schema-sqlite.d.ts +1953 -612
  220. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  221. package/dist/drizzle/schema-sqlite.js +134 -0
  222. package/dist/drizzle/schema-sqlite.js.map +1 -1
  223. package/dist/drizzle/schema.d.ts +684 -3
  224. package/dist/drizzle/schema.d.ts.map +1 -1
  225. package/dist/drizzle/schema.js +81 -1
  226. package/dist/drizzle/schema.js.map +1 -1
  227. package/dist/index.d.ts +3 -3
  228. package/dist/index.js +152 -13
  229. package/dist/index.js.map +1 -1
  230. package/package.json +126 -103
  231. package/scripts/build-release.sh +33 -0
  232. package/scripts/db/check-db.mjs +88 -0
  233. package/scripts/db/fix-all-columns.mjs +52 -0
  234. package/scripts/db/fix-schema-all.mjs +55 -0
  235. package/scripts/db/fix-schema-full.mjs +46 -0
  236. package/scripts/db/fix-schema.mjs +38 -0
  237. package/scripts/db/init-db.mjs +13 -0
  238. package/scripts/db/recreate-db.mjs +14 -0
  239. package/scripts/generate-mcp.mjs +264 -0
  240. package/scripts/github-release.sh +61 -0
  241. package/scripts/init-dirs.mjs +13 -0
  242. package/scripts/init-dirs.ts +15 -0
  243. package/scripts/install-mcp.mjs +116 -0
  244. package/scripts/install-web.sh +120 -0
  245. package/scripts/install.mjs +340 -0
  246. package/scripts/openclaw-bootstrap.mjs +127 -0
  247. package/scripts/package-release.sh +71 -0
  248. package/scripts/remote-preflight.mjs +62 -0
  249. package/scripts/squish-fallback.mjs +132 -0
  250. package/scripts/test/test-all-systems.mjs +139 -0
  251. package/scripts/test/test-memory-system.mjs +139 -0
  252. package/scripts/test/test-v0.5.0.mjs +210 -0
  253. package/scripts/verify-mcp.mjs +214 -0
  254. package/skills/memory-guide/SKILL.md +181 -123
  255. package/skills/squish-cli/SKILL.md +200 -0
  256. package/skills/squish-mcp/SKILL.md +311 -0
  257. package/skills/squish-memory/SKILL.md +100 -62
  258. package/skills/squish-memory/claude-desktop.json +12 -0
  259. package/skills/squish-memory/install.mjs +335 -0
  260. package/skills/squish-memory/install.sh +94 -62
  261. package/skills/squish-memory/openclaw.json +13 -0
  262. package/skills/squish-memory/opencode.json +14 -0
  263. package/skills/squish-memory/skill.json +32 -0
  264. package/dist/adapters/claude-code/capture.d.ts +0 -11
  265. package/dist/adapters/claude-code/capture.d.ts.map +0 -1
  266. package/dist/adapters/claude-code/capture.js +0 -100
  267. package/dist/adapters/claude-code/capture.js.map +0 -1
  268. package/dist/adapters/claude-code/index.d.ts +0 -5
  269. package/dist/adapters/claude-code/index.d.ts.map +0 -1
  270. package/dist/adapters/claude-code/index.js +0 -6
  271. package/dist/adapters/claude-code/index.js.map +0 -1
  272. package/dist/adapters/claude-code/injection.d.ts +0 -34
  273. package/dist/adapters/claude-code/injection.d.ts.map +0 -1
  274. package/dist/adapters/claude-code/injection.js +0 -127
  275. package/dist/adapters/claude-code/injection.js.map +0 -1
  276. package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
  277. package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
  278. package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
  279. package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
  280. package/dist/adapters/claude-code/types.d.ts +0 -46
  281. package/dist/adapters/claude-code/types.d.ts.map +0 -1
  282. package/dist/adapters/claude-code/types.js +0 -6
  283. 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();