squish-memory 1.0.0 → 1.0.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 (300) hide show
  1. package/.env.mcp.example +18 -11
  2. package/README.md +59 -24
  3. package/bin/squish-add.mjs +32 -0
  4. package/bin/squish-rm.mjs +21 -0
  5. package/config/plugin-manifest.json +1 -1
  6. package/config/settings.json +51 -0
  7. package/dist/api/web/web.js +479 -452
  8. package/dist/commands/mcp-server.js +7 -3
  9. package/dist/config.d.ts +10 -10
  10. package/dist/config.js +78 -23
  11. package/dist/core/embeddings.d.ts +1 -1
  12. package/dist/core/embeddings.js +10 -67
  13. package/dist/core/local-embeddings.d.ts +3 -11
  14. package/dist/core/local-embeddings.js +2 -76
  15. package/dist/core/mcp/server.js +27 -1
  16. package/dist/core/mcp/types.d.ts +4 -4
  17. package/dist/core/memory/context-collector.js +3 -2
  18. package/dist/core/memory/feedback-tracker.js +10 -6
  19. package/dist/core/memory/hybrid-search.js +32 -32
  20. package/dist/core/memory/memories.js +55 -52
  21. package/dist/core/memory/query-rewriter.js +9 -9
  22. package/dist/core/memory/stats.js +5 -5
  23. package/dist/core/namespaces/index.js +20 -11
  24. package/dist/core/scheduler/cron-scheduler.js +78 -20
  25. package/dist/core/scheduler/job-runner.js +8 -5
  26. package/dist/core/search/conversations.js +33 -33
  27. package/dist/core/session-hooks/self-iteration-job.js +43 -39
  28. package/dist/core/session-hooks/session-hooks.js +6 -3
  29. package/dist/core/tracing/collector.js +25 -13
  30. package/dist/db/adapter.d.ts +6 -1
  31. package/dist/db/adapter.js +122 -126
  32. package/dist/db/bootstrap.js +622 -548
  33. package/dist/db/index.d.ts +5 -1
  34. package/dist/index.d.ts +1 -1
  35. package/dist/index.js +195 -49
  36. package/generated/mcp/manifest.json +23 -23
  37. package/package.json +72 -59
  38. package/scripts/install-interactive.mjs +7 -4
  39. package/skills/memory-guide/SKILL.md +94 -18
  40. package/skills/squish-cli/SKILL.md +61 -21
  41. package/skills/squish-mcp/SKILL.md +46 -2
  42. package/skills/squish-memory/SKILL.md +30 -16
  43. package/dist/algorithms/analytics/token-estimator.d.ts.map +0 -1
  44. package/dist/algorithms/analytics/token-estimator.js.map +0 -1
  45. package/dist/algorithms/detection/hash-filters.d.ts.map +0 -1
  46. package/dist/algorithms/detection/hash-filters.js.map +0 -1
  47. package/dist/algorithms/detection/semantic-ranker.d.ts.map +0 -1
  48. package/dist/algorithms/detection/semantic-ranker.js.map +0 -1
  49. package/dist/algorithms/detection/two-stage-detector.d.ts.map +0 -1
  50. package/dist/algorithms/detection/two-stage-detector.js.map +0 -1
  51. package/dist/algorithms/handlers/approve-merge.d.ts.map +0 -1
  52. package/dist/algorithms/handlers/approve-merge.js.map +0 -1
  53. package/dist/algorithms/handlers/detect-duplicates.d.ts.map +0 -1
  54. package/dist/algorithms/handlers/detect-duplicates.js.map +0 -1
  55. package/dist/algorithms/handlers/get-stats.d.ts.map +0 -1
  56. package/dist/algorithms/handlers/get-stats.js.map +0 -1
  57. package/dist/algorithms/handlers/list-proposals.d.ts.map +0 -1
  58. package/dist/algorithms/handlers/list-proposals.js.map +0 -1
  59. package/dist/algorithms/handlers/preview-merge.d.ts.map +0 -1
  60. package/dist/algorithms/handlers/preview-merge.js.map +0 -1
  61. package/dist/algorithms/handlers/reject-merge.d.ts.map +0 -1
  62. package/dist/algorithms/handlers/reject-merge.js.map +0 -1
  63. package/dist/algorithms/handlers/reverse-merge.d.ts.map +0 -1
  64. package/dist/algorithms/handlers/reverse-merge.js.map +0 -1
  65. package/dist/algorithms/safety/safety-checks.d.ts.map +0 -1
  66. package/dist/algorithms/safety/safety-checks.js.map +0 -1
  67. package/dist/algorithms/strategies/merge-strategies.d.ts.map +0 -1
  68. package/dist/algorithms/strategies/merge-strategies.js.map +0 -1
  69. package/dist/algorithms/utils/response-builder.d.ts.map +0 -1
  70. package/dist/algorithms/utils/response-builder.js.map +0 -1
  71. package/dist/api/web/index.d.ts.map +0 -1
  72. package/dist/api/web/index.js.map +0 -1
  73. package/dist/api/web/web-server.d.ts.map +0 -1
  74. package/dist/api/web/web-server.js.map +0 -1
  75. package/dist/api/web/web.d.ts.map +0 -1
  76. package/dist/api/web/web.js.map +0 -1
  77. package/dist/commands/managed-sync.d.ts.map +0 -1
  78. package/dist/commands/managed-sync.js.map +0 -1
  79. package/dist/commands/mcp-server.d.ts.map +0 -1
  80. package/dist/commands/mcp-server.js.map +0 -1
  81. package/dist/config.d.ts.map +0 -1
  82. package/dist/config.js.map +0 -1
  83. package/dist/core/agent-memory.d.ts.map +0 -1
  84. package/dist/core/agent-memory.js.map +0 -1
  85. package/dist/core/associations.d.ts.map +0 -1
  86. package/dist/core/associations.js.map +0 -1
  87. package/dist/core/cache.d.ts.map +0 -1
  88. package/dist/core/cache.js.map +0 -1
  89. package/dist/core/consolidation.d.ts.map +0 -1
  90. package/dist/core/consolidation.js.map +0 -1
  91. package/dist/core/context-paging.d.ts.map +0 -1
  92. package/dist/core/context-paging.js.map +0 -1
  93. package/dist/core/context.d.ts.map +0 -1
  94. package/dist/core/context.js.map +0 -1
  95. package/dist/core/core-memory.d.ts.map +0 -1
  96. package/dist/core/core-memory.js.map +0 -1
  97. package/dist/core/database.d.ts.map +0 -1
  98. package/dist/core/database.js.map +0 -1
  99. package/dist/core/embeddings/google-multimodal.d.ts.map +0 -1
  100. package/dist/core/embeddings/google-multimodal.js.map +0 -1
  101. package/dist/core/embeddings/qmd-client.d.ts.map +0 -1
  102. package/dist/core/embeddings/qmd-client.js.map +0 -1
  103. package/dist/core/embeddings.d.ts.map +0 -1
  104. package/dist/core/embeddings.js.map +0 -1
  105. package/dist/core/governance.d.ts.map +0 -1
  106. package/dist/core/governance.js.map +0 -1
  107. package/dist/core/index.d.ts.map +0 -1
  108. package/dist/core/index.js.map +0 -1
  109. package/dist/core/layers/generator.d.ts.map +0 -1
  110. package/dist/core/layers/generator.js.map +0 -1
  111. package/dist/core/lifecycle.d.ts.map +0 -1
  112. package/dist/core/lifecycle.js.map +0 -1
  113. package/dist/core/local-embeddings.d.ts.map +0 -1
  114. package/dist/core/local-embeddings.js.map +0 -1
  115. package/dist/core/logger.d.ts.map +0 -1
  116. package/dist/core/logger.js.map +0 -1
  117. package/dist/core/mcp/client.d.ts.map +0 -1
  118. package/dist/core/mcp/client.js.map +0 -1
  119. package/dist/core/mcp/index.d.ts.map +0 -1
  120. package/dist/core/mcp/index.js.map +0 -1
  121. package/dist/core/mcp/server.d.ts.map +0 -1
  122. package/dist/core/mcp/server.js.map +0 -1
  123. package/dist/core/mcp/standalone-server.d.ts.map +0 -1
  124. package/dist/core/mcp/standalone-server.js.map +0 -1
  125. package/dist/core/mcp/tools.d.ts.map +0 -1
  126. package/dist/core/mcp/tools.js.map +0 -1
  127. package/dist/core/mcp/types.d.ts.map +0 -1
  128. package/dist/core/mcp/types.js.map +0 -1
  129. package/dist/core/memory/bridge-discovery.d.ts.map +0 -1
  130. package/dist/core/memory/bridge-discovery.js.map +0 -1
  131. package/dist/core/memory/categorizer.d.ts.map +0 -1
  132. package/dist/core/memory/categorizer.js.map +0 -1
  133. package/dist/core/memory/conflict-detector.d.ts.map +0 -1
  134. package/dist/core/memory/conflict-detector.js.map +0 -1
  135. package/dist/core/memory/consolidation.d.ts.map +0 -1
  136. package/dist/core/memory/consolidation.js.map +0 -1
  137. package/dist/core/memory/context-collector.d.ts.map +0 -1
  138. package/dist/core/memory/context-collector.js.map +0 -1
  139. package/dist/core/memory/contradiction-resolver.d.ts.map +0 -1
  140. package/dist/core/memory/contradiction-resolver.js.map +0 -1
  141. package/dist/core/memory/edit-workflow.d.ts.map +0 -1
  142. package/dist/core/memory/edit-workflow.js.map +0 -1
  143. package/dist/core/memory/entity-extractor.d.ts.map +0 -1
  144. package/dist/core/memory/entity-extractor.js.map +0 -1
  145. package/dist/core/memory/entity-resolver.d.ts.map +0 -1
  146. package/dist/core/memory/entity-resolver.js.map +0 -1
  147. package/dist/core/memory/fact-extractor.d.ts.map +0 -1
  148. package/dist/core/memory/fact-extractor.js.map +0 -1
  149. package/dist/core/memory/feedback-tracker.d.ts.map +0 -1
  150. package/dist/core/memory/feedback-tracker.js.map +0 -1
  151. package/dist/core/memory/hybrid-retrieval.d.ts.map +0 -1
  152. package/dist/core/memory/hybrid-retrieval.js.map +0 -1
  153. package/dist/core/memory/hybrid-scorer.d.ts.map +0 -1
  154. package/dist/core/memory/hybrid-scorer.js.map +0 -1
  155. package/dist/core/memory/hybrid-search.d.ts.map +0 -1
  156. package/dist/core/memory/hybrid-search.js.map +0 -1
  157. package/dist/core/memory/importance.d.ts.map +0 -1
  158. package/dist/core/memory/importance.js.map +0 -1
  159. package/dist/core/memory/index.d.ts.map +0 -1
  160. package/dist/core/memory/index.js.map +0 -1
  161. package/dist/core/memory/memories.d.ts.map +0 -1
  162. package/dist/core/memory/memories.js.map +0 -1
  163. package/dist/core/memory/memory-manager.d.ts.map +0 -1
  164. package/dist/core/memory/memory-manager.js.map +0 -1
  165. package/dist/core/memory/progressive-disclosure.d.ts.map +0 -1
  166. package/dist/core/memory/progressive-disclosure.js.map +0 -1
  167. package/dist/core/memory/query-processor.d.ts.map +0 -1
  168. package/dist/core/memory/query-processor.js.map +0 -1
  169. package/dist/core/memory/query-rewriter.d.ts.map +0 -1
  170. package/dist/core/memory/query-rewriter.js.map +0 -1
  171. package/dist/core/memory/response-analyzer.d.ts.map +0 -1
  172. package/dist/core/memory/response-analyzer.js.map +0 -1
  173. package/dist/core/memory/serialization.d.ts.map +0 -1
  174. package/dist/core/memory/serialization.js.map +0 -1
  175. package/dist/core/memory/stats.d.ts.map +0 -1
  176. package/dist/core/memory/stats.js.map +0 -1
  177. package/dist/core/memory/telemetry.d.ts.map +0 -1
  178. package/dist/core/memory/telemetry.js.map +0 -1
  179. package/dist/core/memory/temporal-facts.d.ts.map +0 -1
  180. package/dist/core/memory/temporal-facts.js.map +0 -1
  181. package/dist/core/memory/temporal-parser.d.ts.map +0 -1
  182. package/dist/core/memory/temporal-parser.js.map +0 -1
  183. package/dist/core/memory/trigger-detector.d.ts.map +0 -1
  184. package/dist/core/memory/trigger-detector.js.map +0 -1
  185. package/dist/core/memory/write-gate.d.ts.map +0 -1
  186. package/dist/core/memory/write-gate.js.map +0 -1
  187. package/dist/core/namespaces/index.d.ts.map +0 -1
  188. package/dist/core/namespaces/index.js.map +0 -1
  189. package/dist/core/namespaces/uri-parser.d.ts.map +0 -1
  190. package/dist/core/namespaces/uri-parser.js.map +0 -1
  191. package/dist/core/observations.d.ts.map +0 -1
  192. package/dist/core/observations.js.map +0 -1
  193. package/dist/core/privacy.d.ts.map +0 -1
  194. package/dist/core/privacy.js.map +0 -1
  195. package/dist/core/projects.d.ts.map +0 -1
  196. package/dist/core/projects.js.map +0 -1
  197. package/dist/core/redis.d.ts.map +0 -1
  198. package/dist/core/redis.js.map +0 -1
  199. package/dist/core/requirements.d.ts.map +0 -1
  200. package/dist/core/requirements.js.map +0 -1
  201. package/dist/core/scheduler/cron-scheduler.d.ts.map +0 -1
  202. package/dist/core/scheduler/cron-scheduler.js.map +0 -1
  203. package/dist/core/scheduler/heartbeat.d.ts.map +0 -1
  204. package/dist/core/scheduler/heartbeat.js.map +0 -1
  205. package/dist/core/scheduler/index.d.ts.map +0 -1
  206. package/dist/core/scheduler/index.js.map +0 -1
  207. package/dist/core/scheduler/job-runner.d.ts.map +0 -1
  208. package/dist/core/scheduler/job-runner.js.map +0 -1
  209. package/dist/core/search/conversations.d.ts.map +0 -1
  210. package/dist/core/search/conversations.js.map +0 -1
  211. package/dist/core/search/entities.d.ts.map +0 -1
  212. package/dist/core/search/entities.js.map +0 -1
  213. package/dist/core/search/folder-context.d.ts.map +0 -1
  214. package/dist/core/search/folder-context.js.map +0 -1
  215. package/dist/core/search/index.d.ts.map +0 -1
  216. package/dist/core/search/index.js.map +0 -1
  217. package/dist/core/search/qmd-search.d.ts.map +0 -1
  218. package/dist/core/search/qmd-search.js.map +0 -1
  219. package/dist/core/secret-detector.d.ts.map +0 -1
  220. package/dist/core/secret-detector.js.map +0 -1
  221. package/dist/core/session/auto-load.d.ts.map +0 -1
  222. package/dist/core/session/auto-load.js.map +0 -1
  223. package/dist/core/session/index.d.ts.map +0 -1
  224. package/dist/core/session/index.js.map +0 -1
  225. package/dist/core/session/types.d.ts.map +0 -1
  226. package/dist/core/session/types.js.map +0 -1
  227. package/dist/core/session-hooks/self-iteration-job.d.ts.map +0 -1
  228. package/dist/core/session-hooks/self-iteration-job.js.map +0 -1
  229. package/dist/core/session-hooks/session-hooks.d.ts.map +0 -1
  230. package/dist/core/session-hooks/session-hooks.js.map +0 -1
  231. package/dist/core/snapshots/cleanup.d.ts.map +0 -1
  232. package/dist/core/snapshots/cleanup.js.map +0 -1
  233. package/dist/core/snapshots/comparison.d.ts.map +0 -1
  234. package/dist/core/snapshots/comparison.js.map +0 -1
  235. package/dist/core/snapshots/creation.d.ts.map +0 -1
  236. package/dist/core/snapshots/creation.js.map +0 -1
  237. package/dist/core/snapshots/retrieval.d.ts.map +0 -1
  238. package/dist/core/snapshots/retrieval.js.map +0 -1
  239. package/dist/core/snapshots/stats.d.ts.map +0 -1
  240. package/dist/core/snapshots/stats.js.map +0 -1
  241. package/dist/core/snapshots.d.ts.map +0 -1
  242. package/dist/core/snapshots.js.map +0 -1
  243. package/dist/core/summarization/cleanup.d.ts.map +0 -1
  244. package/dist/core/summarization/cleanup.js.map +0 -1
  245. package/dist/core/summarization/queries.d.ts.map +0 -1
  246. package/dist/core/summarization/queries.js.map +0 -1
  247. package/dist/core/summarization/stats.d.ts.map +0 -1
  248. package/dist/core/summarization/stats.js.map +0 -1
  249. package/dist/core/summarization/strategies.d.ts.map +0 -1
  250. package/dist/core/summarization/strategies.js.map +0 -1
  251. package/dist/core/summarization.d.ts.map +0 -1
  252. package/dist/core/summarization.js.map +0 -1
  253. package/dist/core/sync/qmd-sync.d.ts.map +0 -1
  254. package/dist/core/sync/qmd-sync.js.map +0 -1
  255. package/dist/core/temporal-facts.d.ts.map +0 -1
  256. package/dist/core/temporal-facts.js.map +0 -1
  257. package/dist/core/tracing/collector.d.ts.map +0 -1
  258. package/dist/core/tracing/collector.js.map +0 -1
  259. package/dist/core/tracing/visualizer.d.ts.map +0 -1
  260. package/dist/core/tracing/visualizer.js.map +0 -1
  261. package/dist/core/utils/cleanup-operations.d.ts.map +0 -1
  262. package/dist/core/utils/cleanup-operations.js.map +0 -1
  263. package/dist/core/utils/content-extraction.d.ts.map +0 -1
  264. package/dist/core/utils/content-extraction.js.map +0 -1
  265. package/dist/core/utils/filter-builder.d.ts.map +0 -1
  266. package/dist/core/utils/filter-builder.js.map +0 -1
  267. package/dist/core/utils/history-traversal.d.ts.map +0 -1
  268. package/dist/core/utils/history-traversal.js.map +0 -1
  269. package/dist/core/utils/memory-operations.d.ts.map +0 -1
  270. package/dist/core/utils/memory-operations.js.map +0 -1
  271. package/dist/core/utils/query-operations.d.ts.map +0 -1
  272. package/dist/core/utils/query-operations.js.map +0 -1
  273. package/dist/core/utils/summarization-helpers.d.ts.map +0 -1
  274. package/dist/core/utils/summarization-helpers.js.map +0 -1
  275. package/dist/core/utils/temporal-queries.d.ts.map +0 -1
  276. package/dist/core/utils/temporal-queries.js.map +0 -1
  277. package/dist/core/utils/version-management.d.ts.map +0 -1
  278. package/dist/core/utils/version-management.js.map +0 -1
  279. package/dist/core/utils.d.ts.map +0 -1
  280. package/dist/core/utils.js.map +0 -1
  281. package/dist/core/worker.d.ts.map +0 -1
  282. package/dist/core/worker.js.map +0 -1
  283. package/dist/db/adapter.d.ts.map +0 -1
  284. package/dist/db/adapter.js.map +0 -1
  285. package/dist/db/bootstrap.d.ts.map +0 -1
  286. package/dist/db/bootstrap.js.map +0 -1
  287. package/dist/db/index.d.ts.map +0 -1
  288. package/dist/db/index.js.map +0 -1
  289. package/dist/db/schema.d.ts.map +0 -1
  290. package/dist/db/schema.js.map +0 -1
  291. package/dist/drizzle/schema-sqlite.d.ts.map +0 -1
  292. package/dist/drizzle/schema-sqlite.js.map +0 -1
  293. package/dist/drizzle/schema.d.ts.map +0 -1
  294. package/dist/drizzle/schema.js.map +0 -1
  295. package/dist/index.d.ts.map +0 -1
  296. package/dist/index.js.map +0 -1
  297. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts.map +0 -1
  298. package/packages/plugin-claude-code/dist/plugin-wrapper.js.map +0 -1
  299. package/packages/plugin-openclaw/dist/index.d.ts.map +0 -1
  300. package/packages/plugin-openclaw/dist/index.js.map +0 -1
@@ -1,6 +1,10 @@
1
1
  import { createDb } from './adapter.js';
2
2
  import { config } from '../config.js';
3
- export declare function getDb(): Promise<any>;
3
+ export declare function getDb(): Promise<(import("drizzle-orm/node-postgres").NodePgDatabase<typeof import("../drizzle/schema.js")> & {
4
+ $client: import("pg").Pool;
5
+ }) | (import("drizzle-orm/better-sqlite3").BetterSQLite3Database<typeof import("../drizzle/schema-sqlite.js")> & {
6
+ $client: import("better-sqlite3").Database;
7
+ }) | import("drizzle-orm/sql-js").SQLJsDatabase<typeof import("../drizzle/schema-sqlite.js")>>;
4
8
  export declare function checkDatabaseHealth(): Promise<boolean>;
5
9
  export { config };
6
10
  export { createDb };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Squish v1.0.0 - Universal Memory Plugin System
3
+ * Squish v1.0.2 - Universal Memory Plugin System
4
4
  *
5
5
  * Modes:
6
6
  * - CLI Mode: For any MCP client bash execution (e.g., `squish remember "text"`)
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Squish v1.0.0 - Universal Memory Plugin System
3
+ * Squish v1.0.2 - Universal Memory Plugin System
4
4
  *
5
5
  * Modes:
6
6
  * - CLI Mode: For any MCP client bash execution (e.g., `squish remember "text"`)
@@ -17,6 +17,7 @@
17
17
  */
18
18
  import 'dotenv/config';
19
19
  import fs from 'node:fs';
20
+ import { existsSync } from 'node:fs';
20
21
  import os from 'node:os';
21
22
  import path from 'node:path';
22
23
  import { fileURLToPath } from 'node:url';
@@ -48,11 +49,12 @@ import { searchWithQMD, isQMDAvailable } from './core/search/qmd-search.js';
48
49
  import { initializeCoreMemory, getCoreMemory, editCoreMemorySection, appendCoreMemorySection, getCoreMemoryStats, } from './core/core-memory.js';
49
50
  import { loadMemoryToContext, evictMemoryFromContext, viewLoadedMemories, getContextStatus, } from './core/context-paging.js';
50
51
  import { ensureDataDirectory } from './db/bootstrap.js';
52
+ import { getDataDir } from './config.js';
51
53
  import { performAutoLoad, shouldAutoLoad, getAutoLoadConfig } from './core/session/auto-load.js';
52
54
  import { initializeScheduler, registerJobHandler } from './core/scheduler/cron-scheduler.js';
53
55
  import { startHeartbeatChecking, heartbeat } from './core/scheduler/heartbeat.js';
54
56
  import { runNightlyJob, runWeeklyJob } from './core/scheduler/job-runner.js';
55
- const VERSION = '1.0.0';
57
+ const VERSION = '1.0.2';
56
58
  // Load plugin manifest for self-verification
57
59
  function loadPluginManifest() {
58
60
  try {
@@ -89,21 +91,197 @@ function verifyManifest(manifest) {
89
91
  return { ok: errors.length === 0, errors };
90
92
  }
91
93
  // ============================================================================
92
- // CLI MODE DETECTION
94
+ // HELPER FUNCTIONS
93
95
  // ============================================================================
94
- const args = process.argv.slice(2);
95
- const hasCliArgs = args.length > 0 && args[0] !== '--mcp';
96
- if (hasCliArgs) {
97
- // === CLI MODE (for OpenClaw) ===
98
- runCliMode().catch((e) => {
99
- console.error(JSON.stringify({ error: e.message }, null, 2));
96
+ function showHelp() {
97
+ console.log(`
98
+ Squish Memory v${VERSION} - Universal Memory Plugin System
99
+
100
+ Usage:
101
+ squish Start interactive wizard
102
+ squish run mcp Start MCP server
103
+ squish run web Start Web UI only
104
+ squish <command> [options] Run CLI commands for agents
105
+
106
+ CLI Commands (for agents):
107
+ squish remember <content> Store a memory
108
+ squish search <query> Search memories
109
+ squish health Check system health
110
+ squish stats View statistics
111
+ squish core_memory Manage core memory
112
+
113
+ Examples:
114
+ squish run mcp # Start MCP server (for Claude Code)
115
+ squish run web # Start Web UI only
116
+ squish remember "Hello" # Store memory via CLI
117
+ squish search "query" # Search memories via CLI
118
+
119
+ For more info: https://github.com/michielhdoteth/squish
120
+ `);
121
+ }
122
+ async function runInteractiveInstaller() {
123
+ const { select } = await import('@clack/prompts');
124
+ const { isCancel } = await import('@clack/prompts');
125
+ const { log } = await import('@clack/prompts');
126
+ const { intro, outro } = await import('@clack/prompts');
127
+ intro(`Squish Memory v${VERSION}`);
128
+ const options = [
129
+ { value: 'mcp', label: 'Start MCP Server (for AI Assistants: Claude Code, OpenCode, etc.)' },
130
+ { value: 'web', label: 'Start Web UI Only' },
131
+ { value: 'health', label: 'Health & Stats' },
132
+ { value: 'help', label: 'Show Help' },
133
+ { value: 'exit', label: 'Exit' }
134
+ ];
135
+ const selected = await select({
136
+ message: 'What would you like to do?',
137
+ options: options,
138
+ });
139
+ if (isCancel(selected)) {
140
+ outro('Cancelled');
141
+ process.exit(0);
142
+ return;
143
+ }
144
+ switch (selected) {
145
+ case 'mcp':
146
+ log.step('Starting MCP server...');
147
+ await runMcpMode();
148
+ break;
149
+ case 'web':
150
+ log.step('Starting Web UI...');
151
+ await runWebOnly();
152
+ break;
153
+ case 'health':
154
+ log.step('Checking health...');
155
+ await runCliCommand('health');
156
+ await runCliCommand('stats');
157
+ break;
158
+ case 'help':
159
+ showHelp();
160
+ process.exit(0);
161
+ break;
162
+ case 'exit':
163
+ outro('Goodbye! 👋');
164
+ process.exit(0);
165
+ break;
166
+ }
167
+ }
168
+ async function runCliCommand(command) {
169
+ // Run CLI command programmatically
170
+ const program = new Command();
171
+ program.hook('preAction', async () => {
172
+ await ensureDataDirectory();
173
+ });
174
+ if (command === 'health') {
175
+ const dbHealth = await checkDatabaseHealth();
176
+ const redisHealth = await checkRedisHealth();
177
+ const dataDir = process.env.SQUISH_DATA_DIR || path.join(os.homedir(), '.squish');
178
+ const dirExists = fs.existsSync(dataDir);
179
+ console.log(`\n Squish Memory v${VERSION}`);
180
+ console.log(` ====================`);
181
+ console.log(` Mode: ${config.isTeamMode ? 'team' : 'local'}`);
182
+ console.log(` Database: ${dbHealth ? 'ok' : 'error'}`);
183
+ console.log(` Cache: ${redisHealth ? 'ok' : 'unavailable'}`);
184
+ console.log(` Data Dir: ${dataDir}`);
185
+ console.log(` Status: ${dbHealth ? 'HEALTHY' : 'UNHEALTHY'}\n`);
186
+ }
187
+ else if (command === 'stats') {
188
+ const stats = await getMemoryStats(process.cwd());
189
+ console.log(JSON.stringify({ ok: true, ...stats }, null, 2));
190
+ }
191
+ }
192
+ async function spawnInstallerWizard() {
193
+ const distDir = path.dirname(fileURLToPath(import.meta.url));
194
+ const packageDir = path.dirname(distDir);
195
+ const installScript = path.join(packageDir, 'scripts', 'install-interactive.mjs');
196
+ if (!fs.existsSync(installScript)) {
197
+ console.error('Installer not found at:', installScript);
100
198
  process.exit(1);
199
+ }
200
+ console.log('\nLaunching full installer wizard...\n');
201
+ const result = spawnSync('node', [`"${installScript}"`], {
202
+ stdio: 'inherit',
203
+ shell: true,
204
+ cwd: packageDir
101
205
  });
206
+ process.exit(result.status || 0);
207
+ }
208
+ function isDatabaseInitialized() {
209
+ try {
210
+ const dataDir = getDataDir();
211
+ const dbPath = path.join(dataDir, 'squish.db');
212
+ return existsSync(dataDir) && existsSync(dbPath);
213
+ }
214
+ catch (error) {
215
+ return false;
216
+ }
217
+ }
218
+ async function runWebOnly() {
219
+ console.log(`[squish] Starting Web UI only...`);
220
+ await ensureDataDirectory();
221
+ startWebServer();
222
+ }
223
+ // ============================================================================
224
+ // CLI MODE DETECTION
225
+ // ============================================================================
226
+ const args = process.argv.slice(2);
227
+ const firstArg = args[0];
228
+ // Detect command type
229
+ const isNoArgs = args.length === 0;
230
+ const isRunCommand = firstArg === 'run';
231
+ const isHelpCommand = firstArg === '--help' || firstArg === '-h' || firstArg === 'help';
232
+ if (isNoArgs) {
233
+ // Check if database exists - if not, run installer automatically
234
+ if (!isDatabaseInitialized()) {
235
+ console.log(`[squish] No existing database found. Launching installer wizard...\n`);
236
+ await spawnInstallerWizard();
237
+ }
238
+ else {
239
+ // === INTERACTIVE WIZARD (default when no args) ===
240
+ runInteractiveInstaller().catch((e) => {
241
+ console.error('Installer error:', e.message);
242
+ process.exit(1);
243
+ });
244
+ }
245
+ }
246
+ else if (isRunCommand) {
247
+ // === RUN SUBCOMMAND ===
248
+ const subcommand = args[1];
249
+ if (subcommand === 'mcp') {
250
+ runMcpMode().catch((e) => {
251
+ logger.error('Fatal error', e);
252
+ process.exit(1);
253
+ });
254
+ }
255
+ else if (subcommand === 'web') {
256
+ runWebOnly().catch((e) => {
257
+ logger.error('Web server error', e);
258
+ process.exit(1);
259
+ });
260
+ }
261
+ else {
262
+ console.log(`
263
+ Usage: squish run <command>
264
+
265
+ Commands:
266
+ mcp Start MCP server
267
+ web Start Web UI only
268
+
269
+ Examples:
270
+ squish run mcp # Start MCP server with web UI
271
+ squish run web # Start Web UI only
272
+ `);
273
+ process.exit(subcommand ? 1 : 0);
274
+ }
275
+ }
276
+ else if (isHelpCommand) {
277
+ // === SHOW HELP ===
278
+ showHelp();
279
+ process.exit(0);
102
280
  }
103
281
  else {
104
- // === MCP MODE (for Claude Code) - DEFAULT ===
105
- runMcpMode().catch((e) => {
106
- logger.error('Fatal error', e);
282
+ // === CLI MODE (for agents/OpenClaw) ===
283
+ runCliMode().catch((e) => {
284
+ console.error(JSON.stringify({ error: e.message }, null, 2));
107
285
  process.exit(1);
108
286
  });
109
287
  }
@@ -365,7 +543,7 @@ async function runCliMode() {
365
543
  // squish stats
366
544
  program
367
545
  .command('stats')
368
- .description('Get memory statistics')
546
+ .description('View statistics')
369
547
  .option('-p, --project <project>', 'Project path', process.cwd())
370
548
  .action(async (options) => {
371
549
  try {
@@ -377,44 +555,12 @@ async function runCliMode() {
377
555
  process.exit(1);
378
556
  }
379
557
  });
380
- // squish install (for OpenClaw self-install)
558
+ // squish install
381
559
  program
382
560
  .command('install')
383
- .description('Install Squish for OpenClaw (self-configure MCP)')
384
- .option('-o, --openclaw-dir <dir>', 'OpenClaw directory')
385
- .option('-n, --dry-run', 'Show what would be done without making changes', false)
386
- .option('--skip-install', 'Skip global npm install step', false)
387
- .action(async (options) => {
388
- // Find the install script - it's in scripts/ relative to the package root
389
- // When running from dist/index.js, scripts is at ../scripts/
390
- const distDir = path.dirname(fileURLToPath(import.meta.url));
391
- const packageDir = path.dirname(distDir);
392
- const installScript = path.join(packageDir, 'scripts', 'install.mjs');
393
- // Check if the script exists
394
- if (!fs.existsSync(installScript)) {
395
- console.log(JSON.stringify({
396
- ok: false,
397
- error: `Install script not found at: ${installScript}`,
398
- hint: 'Please ensure squish-memory is installed correctly'
399
- }, null, 2));
400
- process.exit(1);
401
- }
402
- // Build command with quoted path for Windows compatibility
403
- const args = [`"${installScript}"`];
404
- if (options.dryRun)
405
- args.push('--dry-run');
406
- if (options.openclawDir)
407
- args.push('--openclaw-dir', `"${options.openclawDir}"`);
408
- if (options.skipInstall)
409
- args.push('--skip-install');
410
- const result = spawnSync('node', args, {
411
- stdio: 'inherit',
412
- shell: true,
413
- cwd: packageDir
414
- });
415
- if (result.status !== 0) {
416
- process.exit(result.status || 1);
417
- }
561
+ .description('Run the interactive installer wizard')
562
+ .action(async () => {
563
+ await spawnInstallerWizard();
418
564
  });
419
565
  await program.parseAsync(process.argv);
420
566
  }
@@ -1,23 +1,23 @@
1
- {
2
- "mode": "universal",
3
- "generatedAt": "2026-03-14T16:50:48.822Z",
4
- "source": "config/mcp.json",
5
- "files": [
6
- {
7
- "file": "mcp-servers.json",
8
- "sha256": "2c90cc52893f55bc92cc4f29c77bfeeb635c1c73fa46038d287548caeb35ca6a"
9
- },
10
- {
11
- "file": "mcporter.json",
12
- "sha256": "af42e1c03d44f66fcbe2a9b7694f1d3a126527147c66b760236e72348e1e4573"
13
- },
14
- {
15
- "file": "openclaw-memory-qmd.json",
16
- "sha256": "8a158ff45e98e0db7a7aff41dba7be76652b72aea82443773f9efc7fb056d615"
17
- },
18
- {
19
- "file": "runtime.json",
20
- "sha256": "4afbdec03de92c6a29fc24df32f01305c2e9cf69ed2d02866a01e361492d14b6"
21
- }
22
- ]
23
- }
1
+ {
2
+ "mode": "universal",
3
+ "generatedAt": "2026-03-18T18:13:29.152Z",
4
+ "source": "config/mcp.json",
5
+ "files": [
6
+ {
7
+ "file": "mcp-servers.json",
8
+ "sha256": "2c90cc52893f55bc92cc4f29c77bfeeb635c1c73fa46038d287548caeb35ca6a"
9
+ },
10
+ {
11
+ "file": "mcporter.json",
12
+ "sha256": "af42e1c03d44f66fcbe2a9b7694f1d3a126527147c66b760236e72348e1e4573"
13
+ },
14
+ {
15
+ "file": "openclaw-memory-qmd.json",
16
+ "sha256": "8a158ff45e98e0db7a7aff41dba7be76652b72aea82443773f9efc7fb056d615"
17
+ },
18
+ {
19
+ "file": "runtime.json",
20
+ "sha256": "4afbdec03de92c6a29fc24df32f01305c2e9cf69ed2d02866a01e361492d14b6"
21
+ }
22
+ ]
23
+ }
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "squish-memory",
3
- "version": "1.0.0",
4
- "description": "Universal plugin architecture memory system - works as plugin across Claude Code, OpenClaw, OpenCode, Codex, Cursor, VSCode, Windsurf. MCP server with CLI fallback, QMD search, and two-tier storage.",
3
+ "version": "1.0.2",
4
+ "description": "Two-tier memory for AI agents: QMD-based fast file search (short-term) + SQLite/Postgres (long-term). Works out-of-the-box, no setup required.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "squish": "dist/index.js",
9
9
  "squish-mcp": "dist/commands/mcp-server.js",
10
+ "squish-add": "bin/squish-add.mjs",
11
+ "squish-rm": "bin/squish-rm.mjs",
10
12
  "squish-install": "npx-installer.js",
11
13
  "squish-install-plugin": "scripts/install-plugin.mjs"
12
14
  },
@@ -15,14 +17,12 @@
15
17
  "build:plugins": "npm run build && npm run build:claude && npm run build:openclaw",
16
18
  "build:claude": "cp -r .claude-plugin packages/plugin-claude-code/",
17
19
  "build:openclaw": "mkdir -p packages/plugin-openclaw/dist && cp -r plugins/openclaw/* packages/plugin-openclaw/ && (cd packages/plugin-openclaw && npm run build 2>/dev/null || true)",
18
- "build:mcp": "tsc commands/mcp-server.ts --outDir dist/commands --module ES2022 --moduleResolution node --esModuleInterop --target ES2022 --skipLibCheck",
19
- "mcp:cjs": "esbuild commands/mcp-server.ts --bundle --platform=node --outfile=dist/commands/mcp-server.cjs --format=cjs --external:better-sqlite3 --external:pg --external:drizzle-orm/*",
20
20
  "start": "node dist/index.js",
21
- "mcp": "node dist/commands/mcp-server.cjs",
21
+ "mcp": "node dist/commands/mcp-server.js",
22
22
  "web": "node dist/api/web/web-server.js",
23
23
  "web:bun": "bun run dist/api/web/web-server.js",
24
- "dev": "bun --hot src/index.ts",
25
- "dev:mcp": "bun --hot src/commands/mcp-server.ts",
24
+ "dev": "bun --hot index.ts",
25
+ "dev:mcp": "bun --hot commands/mcp-server.ts",
26
26
  "verify:mcp": "node scripts/verify-mcp.mjs",
27
27
  "preflight:remote": "node scripts/remote-preflight.mjs",
28
28
  "fallback:dry": "node scripts/squish-fallback.mjs --op health --simulate-mcp-failure --dry-run",
@@ -75,8 +75,6 @@
75
75
  "vscode",
76
76
  "plugin",
77
77
  "plugin-architecture",
78
- "openclaw-plugin",
79
- "claude-code-plugin",
80
78
  "qmd",
81
79
  "sqlite",
82
80
  "postgres",
@@ -86,83 +84,98 @@
86
84
  "local-first",
87
85
  "privacy",
88
86
  "agent-framework",
89
- "agent-memory"
87
+ "agent-memory",
88
+ "ai-memory",
89
+ "agentic",
90
+ "context-window",
91
+ "long-term-memory",
92
+ "rag",
93
+ "vector-embeddings",
94
+ "session-persistence"
90
95
  ],
91
- "files": [
92
- "dist",
93
- "scripts",
94
- "!scripts/init-dirs.ts",
95
- "skills",
96
- "hooks",
97
- "config",
98
- "bin",
99
- "generated",
100
- "packages/plugin-claude-code/dist",
101
- "packages/plugin-claude-code/package.json",
102
- "packages/plugin-claude-code/README.md",
103
- "packages/plugin-openclaw/dist",
104
- "packages/plugin-openclaw/package.json",
105
- "packages/plugin-openclaw/README.md",
106
- "packages/plugin-openclaw/openclaw.plugin.json",
107
- "packages/plugin-opencode/package.json",
108
- "packages/plugin-opencode/install.mjs",
109
- "plugin.json",
110
- ".claude-plugin",
111
- ".mcp.json",
112
- ".env.mcp.example",
113
- "LICENSE",
114
- "README.md",
115
- "CHANGELOG.md",
116
- "QUICK-START.md",
117
- "commands/context-paging.md",
118
- "commands/context-status.md",
119
- "commands/context.md",
120
- "commands/core-memory.md",
121
- "commands/health.md",
122
- "commands/init.md",
123
- "commands/merge.md",
124
- "commands/observe.md",
125
- "commands/recall.md",
126
- "commands/remember.md",
127
- "commands/search.md"
128
- ],
129
- "author": "michielhdoteth",
96
+ "files": [
97
+ "dist/**/*.js",
98
+ "dist/**/*.d.ts",
99
+ "dist/**/*.cjs",
100
+ "scripts",
101
+ "!scripts/init-dirs.ts",
102
+ "skills",
103
+ "hooks",
104
+ "config",
105
+ "bin",
106
+ "generated",
107
+ "packages/plugin-claude-code/dist/*.js",
108
+ "packages/plugin-claude-code/dist/*.d.ts",
109
+ "packages/plugin-claude-code/package.json",
110
+ "packages/plugin-claude-code/README.md",
111
+ "packages/plugin-openclaw/dist/*.js",
112
+ "packages/plugin-openclaw/dist/*.d.ts",
113
+ "packages/plugin-openclaw/package.json",
114
+ "packages/plugin-openclaw/README.md",
115
+ "packages/plugin-openclaw/openclaw.plugin.json",
116
+ "packages/plugin-opencode/package.json",
117
+ "packages/plugin-opencode/install.mjs",
118
+ "plugin.json",
119
+ ".claude-plugin",
120
+ ".mcp.json",
121
+ ".env.mcp.example",
122
+ "LICENSE",
123
+ "README.md",
124
+ "CHANGELOG.md",
125
+ "QUICK-START.md",
126
+ "commands/context-paging.md",
127
+ "commands/context-status.md",
128
+ "commands/context.md",
129
+ "commands/core-memory.md",
130
+ "commands/health.md",
131
+ "commands/init.md",
132
+ "commands/merge.md",
133
+ "commands/observe.md",
134
+ "commands/recall.md",
135
+ "commands/remember.md",
136
+ "commands/search.md"
137
+ ],
138
+ "author": "michielhdoteth <michiel@4mlabs.io>",
130
139
  "license": "MIT",
131
140
  "engines": {
132
141
  "node": ">=18.0.0"
133
142
  },
134
143
  "dependencies": {
135
- "@modelcontextprotocol/sdk": "1.27.1",
144
+ "@clack/prompts": "^0.7.0",
145
+ "@modelcontextprotocol/sdk": "^1.27.1",
136
146
  "better-sqlite3": "12.6.2",
137
147
  "bull": "^4.16.0",
138
148
  "commander": "^12.0.0",
139
149
  "cors": "2.8.6",
140
150
  "dotenv": "^16.4.0",
141
151
  "drizzle-orm": "^0.38.0",
142
- "express": "^4.21.0",
143
- "pg": "8.19.0",
152
+ "express": "^5.2.1",
153
+ "express-rate-limit": "^8.3.1",
154
+ "hono": "^4.12.8",
155
+ "node-cron": "^3.0.0",
156
+ "pg": "^8.20.0",
144
157
  "pgvector": "^0.2.0",
145
- "redis": "^4.7.0",
158
+ "picocolors": "^1.0.0",
159
+ "redis": "^5.11.0",
160
+ "sql.js": "^1.14.1",
146
161
  "tree-sitter": "^0.22.0",
147
162
  "tree-sitter-javascript": "^0.23.0",
148
163
  "tree-sitter-python": "^0.23.0",
149
164
  "tree-sitter-typescript": "^0.23.0",
150
- "uuid": "^9.0.1",
165
+ "uuid": "^13.0.0",
151
166
  "ws": "^8.18.0",
152
- "zod": "^3.24.0",
153
- "node-cron": "^3.0.0"
167
+ "zod": "^3.24.0"
154
168
  },
155
169
  "devDependencies": {
156
170
  "@types/better-sqlite3": "^7.6.13",
157
171
  "@types/cors": "^2.8.17",
158
172
  "@types/express": "^5.0.0",
159
173
  "@types/node": "^22.0.0",
160
- "@types/pg": "^8.11.10",
161
174
  "@types/node-cron": "^3.0.11",
175
+ "@types/pg": "^8.11.10",
162
176
  "@types/ws": "^8.5.13",
163
177
  "drizzle-kit": "^0.30.0",
164
178
  "pkg": "^5.8.1",
165
- "typescript": "^5.7.0",
166
- "vitest": "^4.0.17"
179
+ "typescript": "^5.7.0"
167
180
  }
168
181
  }
@@ -116,7 +116,8 @@ function parseArgs(argv) {
116
116
  dryRun: false,
117
117
  help: false,
118
118
  verbose: false,
119
- quick: false
119
+ quick: false,
120
+ interactive: false
120
121
  };
121
122
 
122
123
  for (let i = 2; i < argv.length; i++) {
@@ -136,6 +137,8 @@ function parseArgs(argv) {
136
137
  flags.help = true;
137
138
  } else if (token === "--quick" || token === "-q") {
138
139
  flags.quick = true;
140
+ } else if (token === "--interactive" || token === "-i") {
141
+ flags.interactive = true;
139
142
  } else if (token.startsWith("--select=")) {
140
143
  flags.select = token.slice(9).split(",").map(s => s.trim());
141
144
  } else if (token === "--select") {
@@ -647,13 +650,13 @@ async function main() {
647
650
  verbose: flags.verbose
648
651
  };
649
652
 
650
- // Non-interactive mode
651
- if (flags.auto || flags.quick || flags.select.length > 0 || shouldUseNonInteractive()) {
653
+ // Non-interactive mode (only if explicitly requested and not in interactive mode)
654
+ if (!flags.interactive && (flags.auto || flags.quick || flags.select.length > 0 || shouldUseNonInteractive())) {
652
655
  await handleNonInteractive(flags, options);
653
656
  return;
654
657
  }
655
658
 
656
- // Interactive wizard mode
659
+ // Interactive wizard mode (default when no flags, or when --interactive is passed)
657
660
  await runWizard(options);
658
661
  }
659
662