squish-memory 1.0.2 → 1.1.5

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 (341) hide show
  1. package/.env.example +130 -0
  2. package/CHANGELOG.md +55 -0
  3. package/README.md +150 -287
  4. package/config/hooks/claude-code-hooks.json +39 -0
  5. package/config/hooks/cursor-hooks.json +30 -0
  6. package/config/hooks/opencode-hooks.json +30 -0
  7. package/config/hooks/windsurf-hooks.json +30 -0
  8. package/config/mcp-mode-semantics.json +23 -21
  9. package/config/plugin-manifest.json +101 -152
  10. package/{plugin.json → config/plugin.json} +2 -2
  11. package/config/settings.json +52 -51
  12. package/{commands → core/commands}/init.md +39 -39
  13. package/dist/config.d.ts +28 -4
  14. package/dist/config.js +97 -29
  15. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  16. package/dist/core/adapters/config/claude-code.js +113 -0
  17. package/dist/core/adapters/config/cursor.d.ts +26 -0
  18. package/dist/core/adapters/config/cursor.js +74 -0
  19. package/dist/core/adapters/config/opencode.d.ts +23 -0
  20. package/dist/core/adapters/config/opencode.js +73 -0
  21. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  22. package/dist/core/adapters/config/windsurf.js +74 -0
  23. package/dist/core/adapters/index.d.ts +45 -0
  24. package/dist/core/adapters/index.js +84 -0
  25. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  26. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  27. package/dist/core/adapters/timeline.d.ts +23 -0
  28. package/dist/core/adapters/timeline.js +88 -0
  29. package/dist/core/adapters/types.d.ts +157 -0
  30. package/dist/core/adapters/types.js +50 -0
  31. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  32. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  33. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  34. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  35. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  36. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  37. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  38. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  39. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  40. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  41. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  42. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  43. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  44. package/dist/core/algorithms/index.d.ts +21 -0
  45. package/dist/core/algorithms/index.js +26 -0
  46. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  47. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  48. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +1 -1
  49. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  50. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  51. package/dist/core/algorithms/types.d.ts +133 -0
  52. package/dist/core/algorithms/types.js +5 -0
  53. package/dist/core/associations.d.ts +1 -2
  54. package/dist/core/associations.js +1 -2
  55. package/dist/core/autosave.d.ts +19 -0
  56. package/dist/core/autosave.js +16 -0
  57. package/dist/{commands → core/commands}/managed-sync.js +5 -5
  58. package/dist/core/commands/mcp-server.js +739 -0
  59. package/dist/core/context/agent-context.d.ts +106 -0
  60. package/dist/core/context/agent-context.js +274 -0
  61. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  62. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  63. package/dist/core/context/context-window.d.ts +40 -0
  64. package/dist/core/context/context-window.js +177 -0
  65. package/dist/core/context/context.js +22 -0
  66. package/dist/core/embeddings.d.ts +1 -1
  67. package/dist/core/embeddings.js +54 -2
  68. package/dist/core/error-handling.d.ts +63 -0
  69. package/dist/core/error-handling.js +173 -0
  70. package/dist/core/external-folder/index.d.ts +102 -0
  71. package/dist/core/external-folder/index.js +294 -0
  72. package/dist/core/hooks/agent-hooks.d.ts +74 -0
  73. package/dist/core/hooks/agent-hooks.js +244 -0
  74. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  75. package/dist/core/hooks/auto-tagger.js +155 -0
  76. package/dist/core/hooks/capture-filter.d.ts +41 -0
  77. package/dist/core/hooks/capture-filter.js +128 -0
  78. package/dist/core/index.d.ts +6 -6
  79. package/dist/core/index.js +6 -6
  80. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  81. package/dist/core/{core-memory.js → ingestion/core-memory.js} +4 -4
  82. package/dist/core/ingestion/learnings.d.ts +57 -0
  83. package/dist/core/ingestion/learnings.js +202 -0
  84. package/dist/core/lib/db-client.d.ts +114 -0
  85. package/dist/core/lib/db-client.js +130 -0
  86. package/dist/core/lib/schemas.d.ts +129 -0
  87. package/dist/core/lib/schemas.js +87 -0
  88. package/dist/core/{utils.d.ts → lib/utils.d.ts} +1 -0
  89. package/dist/core/{utils.js → lib/utils.js} +31 -15
  90. package/dist/core/lib/validation.d.ts +38 -0
  91. package/dist/core/lib/validation.js +151 -0
  92. package/dist/core/lifecycle.d.ts +7 -0
  93. package/dist/core/lifecycle.js +140 -20
  94. package/dist/core/local-embeddings.d.ts +6 -1
  95. package/dist/core/local-embeddings.js +6 -15
  96. package/dist/core/logger.js +7 -1
  97. package/dist/core/mcp/tools.js +35 -3
  98. package/dist/core/memory/categorizer.js +1 -0
  99. package/dist/core/memory/conflict-detector.js +1 -1
  100. package/dist/core/memory/consolidation.d.ts +1 -10
  101. package/dist/core/memory/consolidation.js +2 -11
  102. package/dist/core/memory/context-collector.js +1 -1
  103. package/dist/core/memory/edit-workflow.js +1 -1
  104. package/dist/core/memory/entity-resolver.js +7 -7
  105. package/dist/core/memory/fact-extractor.js +12 -12
  106. package/dist/core/memory/feedback-tracker.js +1 -1
  107. package/dist/core/memory/hooks.d.ts +88 -0
  108. package/dist/core/memory/hooks.js +174 -0
  109. package/dist/core/memory/hybrid-retrieval.js +2 -2
  110. package/dist/core/memory/hybrid-search.d.ts +1 -6
  111. package/dist/core/memory/hybrid-search.js +70 -84
  112. package/dist/core/memory/importance.d.ts +8 -13
  113. package/dist/core/memory/importance.js +47 -74
  114. package/dist/core/memory/loader.d.ts +31 -0
  115. package/dist/core/memory/loader.js +141 -0
  116. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  117. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  118. package/dist/core/memory/memories.d.ts +12 -4
  119. package/dist/core/memory/memories.js +192 -180
  120. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  121. package/dist/core/memory/memory-lifecycle.js +55 -0
  122. package/dist/core/memory/migrate.d.ts +21 -0
  123. package/dist/core/memory/migrate.js +134 -0
  124. package/dist/core/memory/normalization.d.ts +22 -0
  125. package/dist/core/memory/normalization.js +26 -0
  126. package/dist/core/memory/progressive-disclosure.js +1 -1
  127. package/dist/core/memory/query-rewriter.js +9 -9
  128. package/dist/core/memory/serialization.d.ts +4 -0
  129. package/dist/core/memory/serialization.js +49 -0
  130. package/dist/core/memory/stats.d.ts +5 -0
  131. package/dist/core/memory/stats.js +63 -12
  132. package/dist/core/memory/temporal-facts.js +21 -0
  133. package/dist/core/memory/write-gate.js +1 -1
  134. package/dist/core/obsidian-vault.d.ts +30 -0
  135. package/dist/core/obsidian-vault.js +94 -0
  136. package/dist/core/places/index.d.ts +14 -0
  137. package/dist/core/places/index.js +14 -0
  138. package/dist/core/places/memory-places.d.ts +68 -0
  139. package/dist/core/places/memory-places.js +261 -0
  140. package/dist/core/places/places.d.ts +88 -0
  141. package/dist/core/places/places.js +314 -0
  142. package/dist/core/places/rules.d.ts +74 -0
  143. package/dist/core/places/rules.js +240 -0
  144. package/dist/core/places/walking.d.ts +56 -0
  145. package/dist/core/places/walking.js +121 -0
  146. package/dist/core/projects.d.ts +5 -0
  147. package/dist/core/projects.js +39 -18
  148. package/dist/core/responses.d.ts +96 -0
  149. package/dist/core/responses.js +122 -0
  150. package/dist/core/scheduler/cron-scheduler.js +29 -7
  151. package/dist/core/scheduler/index.d.ts +1 -1
  152. package/dist/core/scheduler/index.js +1 -1
  153. package/dist/core/scheduler/job-runner.js +1 -1
  154. package/dist/core/search/conversations.js +40 -42
  155. package/dist/core/search/entities.js +6 -9
  156. package/dist/core/search/graph-boost.d.ts +7 -0
  157. package/dist/core/search/graph-boost.js +23 -0
  158. package/dist/core/search/qmd-search.js +4 -4
  159. package/dist/core/security/encrypt.d.ts +6 -0
  160. package/dist/core/security/encrypt.js +47 -0
  161. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  162. package/dist/core/security/governance.js +79 -0
  163. package/dist/core/session/auto-load.js +6 -6
  164. package/dist/core/session/index.d.ts +1 -1
  165. package/dist/core/session/index.js +1 -1
  166. package/dist/core/session/self-iteration-job.d.ts +20 -0
  167. package/dist/core/session/self-iteration-job.js +282 -0
  168. package/dist/core/session/session-hooks.d.ts +18 -0
  169. package/dist/core/session/session-hooks.js +58 -0
  170. package/dist/core/session-hooks/self-iteration-job.js +35 -35
  171. package/dist/core/{cache.js → storage/cache.js} +2 -2
  172. package/dist/core/sync/qmd-sync.d.ts +1 -13
  173. package/dist/core/sync/qmd-sync.js +1 -13
  174. package/dist/core/toon.d.ts +43 -0
  175. package/dist/core/toon.js +160 -0
  176. package/dist/core/utils/memory-operations.js +1 -1
  177. package/dist/core/utils/vector-operations.d.ts +71 -0
  178. package/dist/core/utils/vector-operations.js +129 -0
  179. package/dist/db/adapter.d.ts +3 -3
  180. package/dist/db/adapter.js +99 -88
  181. package/dist/db/bootstrap.js +820 -522
  182. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +74 -25
  183. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +91 -24
  184. package/dist/{drizzle → db/drizzle}/schema.d.ts +79 -32
  185. package/dist/{drizzle → db/drizzle}/schema.js +106 -35
  186. package/dist/db/drizzle.config.d.ts +3 -0
  187. package/dist/db/drizzle.config.js +12 -0
  188. package/dist/db/index.d.ts +1 -5
  189. package/dist/db/index.js +51 -8
  190. package/dist/db/neon.d.ts +8 -0
  191. package/dist/db/neon.js +20 -0
  192. package/dist/db/schema/index.d.ts +40 -0
  193. package/dist/db/schema/index.js +105 -0
  194. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  195. package/dist/db/schema/tables/context-sessions.js +37 -0
  196. package/dist/db/schema/tables/conversations.d.ts +9 -0
  197. package/dist/db/schema/tables/conversations.js +47 -0
  198. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  199. package/dist/db/schema/tables/core-memory.js +41 -0
  200. package/dist/db/schema/tables/entities.d.ts +9 -0
  201. package/dist/db/schema/tables/entities.js +39 -0
  202. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  203. package/dist/db/schema/tables/entity-relations.js +31 -0
  204. package/dist/db/schema/tables/learnings.d.ts +9 -0
  205. package/dist/db/schema/tables/learnings.js +66 -0
  206. package/dist/db/schema/tables/memories.d.ts +9 -0
  207. package/dist/db/schema/tables/memories.js +161 -0
  208. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  209. package/dist/db/schema/tables/memory-associations.js +39 -0
  210. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  211. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  212. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  213. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  214. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  215. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  216. package/dist/db/schema/tables/messages.d.ts +9 -0
  217. package/dist/db/schema/tables/messages.js +41 -0
  218. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  219. package/dist/db/schema/tables/namespaces.js +37 -0
  220. package/dist/db/schema/tables/projects.d.ts +9 -0
  221. package/dist/db/schema/tables/projects.js +31 -0
  222. package/dist/db/schema/tables/users.d.ts +9 -0
  223. package/dist/db/schema/tables/users.js +27 -0
  224. package/dist/db/schema.d.ts +1 -1
  225. package/dist/db/schema.js +2 -2
  226. package/dist/db/supabase.d.ts +9 -0
  227. package/dist/db/supabase.js +24 -0
  228. package/dist/index.d.ts +2 -14
  229. package/dist/index.js +1320 -640
  230. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  231. package/dist/webui/server.d.ts +5 -0
  232. package/dist/{api/web/web.js → webui/server.js} +511 -508
  233. package/generated/mcp/manifest.json +1 -1
  234. package/{.mcp.json → mcp.json.example} +1 -1
  235. package/package.json +159 -181
  236. package/scripts/README.md +60 -0
  237. package/scripts/copy-runtime-assets.mjs +26 -0
  238. package/scripts/generate-mcp.mjs +264 -264
  239. package/scripts/github-release.sh +4 -4
  240. package/scripts/install-claude-code.sh +85 -0
  241. package/scripts/install-cursor.sh +56 -0
  242. package/scripts/install-hooks.sh +73 -0
  243. package/scripts/install-interactive.mjs +357 -677
  244. package/scripts/install-opencode.sh +75 -0
  245. package/scripts/install-windsurf.sh +67 -0
  246. package/skills/squish-memory/SKILL.md +104 -114
  247. package/skills/squish-memory/{install.mjs → scripts/install.mjs} +2 -2
  248. package/skills/squish-memory/{install.sh → scripts/install.sh} +2 -2
  249. package/skills/squish-memory/write_skill.js +2 -0
  250. package/.claude-plugin/marketplace.json +0 -20
  251. package/.claude-plugin/plugin.json +0 -32
  252. package/.env.mcp.example +0 -60
  253. package/QUICK-START.md +0 -71
  254. package/bin/squish-add.mjs +0 -32
  255. package/bin/squish-rm.mjs +0 -21
  256. package/commands/observe.md +0 -5
  257. package/dist/api/web/index.d.ts +0 -3
  258. package/dist/api/web/index.js +0 -4
  259. package/dist/api/web/web-server.d.ts +0 -3
  260. package/dist/api/web/web-server.js +0 -6
  261. package/dist/api/web/web.d.ts +0 -4
  262. package/dist/commands/mcp-server.js +0 -393
  263. package/dist/core/context.js +0 -24
  264. package/dist/core/governance.js +0 -64
  265. package/dist/core/observations.d.ts +0 -26
  266. package/dist/core/observations.js +0 -110
  267. package/dist/core/requirements.d.ts +0 -20
  268. package/dist/core/requirements.js +0 -35
  269. package/hooks/hooks.json +0 -52
  270. package/hooks/post-tool-use.js +0 -26
  271. package/hooks/session-end.js +0 -28
  272. package/hooks/session-start.js +0 -33
  273. package/hooks/user-prompt-submit.js +0 -26
  274. package/hooks/utils.js +0 -153
  275. package/npx-installer.js +0 -208
  276. package/packages/plugin-claude-code/README.md +0 -73
  277. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  278. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  279. package/packages/plugin-claude-code/package.json +0 -31
  280. package/packages/plugin-openclaw/README.md +0 -70
  281. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  282. package/packages/plugin-openclaw/dist/index.js +0 -262
  283. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  284. package/packages/plugin-openclaw/package.json +0 -31
  285. package/packages/plugin-opencode/install.mjs +0 -217
  286. package/packages/plugin-opencode/package.json +0 -21
  287. package/scripts/db/check-db.mjs +0 -88
  288. package/scripts/db/fix-all-columns.mjs +0 -52
  289. package/scripts/db/fix-schema-all.mjs +0 -55
  290. package/scripts/db/fix-schema-full.mjs +0 -46
  291. package/scripts/db/fix-schema.mjs +0 -38
  292. package/scripts/db/init-db.mjs +0 -13
  293. package/scripts/db/recreate-db.mjs +0 -14
  294. package/scripts/install-mcp.mjs +0 -116
  295. package/scripts/install-web.sh +0 -120
  296. package/scripts/install.mjs +0 -340
  297. package/scripts/openclaw-bootstrap.mjs +0 -127
  298. package/scripts/package-release.sh +0 -71
  299. package/scripts/test/test-all-systems.mjs +0 -139
  300. package/scripts/test/test-memory-system.mjs +0 -139
  301. package/scripts/test/test-v0.5.0.mjs +0 -210
  302. package/skills/memory-guide/SKILL.md +0 -332
  303. package/skills/squish-cli/SKILL.md +0 -240
  304. package/skills/squish-mcp/SKILL.md +0 -355
  305. package/skills/squish-memory/claude-desktop.json +0 -12
  306. package/skills/squish-memory/openclaw.json +0 -13
  307. package/skills/squish-memory/opencode.json +0 -14
  308. package/skills/squish-memory/skill.json +0 -32
  309. /package/{commands → core/commands}/context-paging.md +0 -0
  310. /package/{commands → core/commands}/context-status.md +0 -0
  311. /package/{commands → core/commands}/context.md +0 -0
  312. /package/{commands → core/commands}/core-memory.md +0 -0
  313. /package/{commands → core/commands}/health.md +0 -0
  314. /package/{commands → core/commands}/merge.md +0 -0
  315. /package/{commands → core/commands}/recall.md +0 -0
  316. /package/{commands → core/commands}/remember.md +0 -0
  317. /package/{commands → core/commands}/search.md +0 -0
  318. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  319. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  320. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  321. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  322. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  323. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  324. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  325. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  326. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  327. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  328. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  329. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  330. /package/dist/{commands → core/commands}/managed-sync.d.ts +0 -0
  331. /package/dist/{commands → core/commands}/mcp-server.d.ts +0 -0
  332. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  333. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  334. /package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +0 -0
  335. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  336. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  337. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  338. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  339. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  340. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  341. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Database Client & Schema Loading Abstraction
3
+ *
4
+ * Provides a unified interface for accessing both the database client and schema
5
+ * in a single call, eliminating repetitive patterns of:
6
+ * `const db = createDatabaseClient(await getDb()); const schema = await getSchema();`
7
+ *
8
+ * Features:
9
+ * - Single async call to get both db and schema
10
+ * - Consistent error handling with clear messages
11
+ * - Preserves schema caching
12
+ * - Provides raw connection for special cases
13
+ * - Helper `withDbClient` for functional programming patterns
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Old pattern (repetitive)
18
+ * const db = createDatabaseClient(await getDb());
19
+ * const schema = await getSchema();
20
+ *
21
+ * // New pattern (unified)
22
+ * const { db, schema } = await getDbClient();
23
+ *
24
+ * // With helper
25
+ * const result = await withDbClient(async (client) => {
26
+ * return await client.db.select().from(client.schema.memories);
27
+ * });
28
+ * ```
29
+ */
30
+ import type { DatabaseClient } from '../storage/database.js';
31
+ import type { SchemaModule } from '../../db/schema.js';
32
+ /**
33
+ * Unified database client interface combining:
34
+ * - `db`: Wrapped database client with select/insert/update/delete methods
35
+ * - `schema`: Drizzle schema module with table definitions
36
+ * - `raw`: Raw underlying connection for special cases (mcp-server, index, etc.)
37
+ */
38
+ export interface DbClient {
39
+ /**
40
+ * Wrapped database client with unified API
41
+ * Provides select(), insert(), update(), delete() methods
42
+ */
43
+ db: DatabaseClient;
44
+ /**
45
+ * Schema module containing table definitions
46
+ * Access tables via schema.tableName (e.g., schema.memories, schema.users)
47
+ */
48
+ schema: SchemaModule;
49
+ /**
50
+ * Raw underlying database connection
51
+ * Use for special cases that require direct access to the native driver
52
+ * (e.g., raw SQL queries, specific driver features)
53
+ */
54
+ raw: any;
55
+ }
56
+ /**
57
+ * Get a unified database client with both db and schema.
58
+ *
59
+ * This function:
60
+ * 1. Calls getDb() to initialize/retrieve the database connection
61
+ * 2. Calls getSchema() to get the appropriate schema (with caching)
62
+ * 3. Wraps the db with createDatabaseClient() for unified API
63
+ * 4. Returns all three as a single DbClient object
64
+ *
65
+ * Error handling:
66
+ * - Wraps any database initialization errors with a clear message
67
+ * - Preserves the original error as `cause` property
68
+ *
69
+ * Schema caching:
70
+ * - Uses the same caching mechanism as getSchema()
71
+ * - Multiple calls to getDbClient() will return the same schema reference
72
+ *
73
+ * @returns Promise<DbClient> Unified client with db, schema, and raw
74
+ * @throws {Error} When database initialization fails, with cause attached
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const { db, schema, raw } = await getDbClient();
79
+ *
80
+ * // Use db for queries
81
+ * const memories = await db.select().from(schema.memories).limit(10);
82
+ *
83
+ * // Use raw for special cases
84
+ * const client = (raw as any).$client;
85
+ * if (client && typeof client.exec === 'function') {
86
+ * client.exec('VACUUM');
87
+ * }
88
+ * ```
89
+ */
90
+ export declare function getDbClient(): Promise<DbClient>;
91
+ /**
92
+ * Execute an operation with a unified database client.
93
+ *
94
+ * Convenience wrapper that:
95
+ * 1. Calls getDbClient() to obtain client
96
+ * 2. Executes the provided operation
97
+ * 3. Ensures proper cleanup if needed (no-op currently, for future extension)
98
+ *
99
+ * @param operation - Async function that receives the DbClient and returns a result
100
+ * @returns Promise<T> The result returned by the operation
101
+ * @throws {Error} When database initialization or operation fails
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * const count = await withDbClient(async (client) => {
106
+ * const result = await client.db
107
+ * .select({ count: sql`count(*)` })
108
+ * .from(client.schema.memories);
109
+ * return result[0].count;
110
+ * });
111
+ * ```
112
+ */
113
+ export declare function withDbClient<T>(operation: (client: DbClient) => Promise<T>): Promise<T>;
114
+ //# sourceMappingURL=db-client.d.ts.map
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Database Client & Schema Loading Abstraction
3
+ *
4
+ * Provides a unified interface for accessing both the database client and schema
5
+ * in a single call, eliminating repetitive patterns of:
6
+ * `const db = createDatabaseClient(await getDb()); const schema = await getSchema();`
7
+ *
8
+ * Features:
9
+ * - Single async call to get both db and schema
10
+ * - Consistent error handling with clear messages
11
+ * - Preserves schema caching
12
+ * - Provides raw connection for special cases
13
+ * - Helper `withDbClient` for functional programming patterns
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Old pattern (repetitive)
18
+ * const db = createDatabaseClient(await getDb());
19
+ * const schema = await getSchema();
20
+ *
21
+ * // New pattern (unified)
22
+ * const { db, schema } = await getDbClient();
23
+ *
24
+ * // With helper
25
+ * const result = await withDbClient(async (client) => {
26
+ * return await client.db.select().from(client.schema.memories);
27
+ * });
28
+ * ```
29
+ */
30
+ import { getDb } from '../../db/index.js';
31
+ import { getSchema } from '../../db/schema.js';
32
+ import { createDatabaseClient } from '../storage/database.js';
33
+ /**
34
+ * Internal cached schema to preserve getSchema() caching behavior
35
+ */
36
+ let cachedSchema = null;
37
+ /**
38
+ * Get a unified database client with both db and schema.
39
+ *
40
+ * This function:
41
+ * 1. Calls getDb() to initialize/retrieve the database connection
42
+ * 2. Calls getSchema() to get the appropriate schema (with caching)
43
+ * 3. Wraps the db with createDatabaseClient() for unified API
44
+ * 4. Returns all three as a single DbClient object
45
+ *
46
+ * Error handling:
47
+ * - Wraps any database initialization errors with a clear message
48
+ * - Preserves the original error as `cause` property
49
+ *
50
+ * Schema caching:
51
+ * - Uses the same caching mechanism as getSchema()
52
+ * - Multiple calls to getDbClient() will return the same schema reference
53
+ *
54
+ * @returns Promise<DbClient> Unified client with db, schema, and raw
55
+ * @throws {Error} When database initialization fails, with cause attached
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const { db, schema, raw } = await getDbClient();
60
+ *
61
+ * // Use db for queries
62
+ * const memories = await db.select().from(schema.memories).limit(10);
63
+ *
64
+ * // Use raw for special cases
65
+ * const client = (raw as any).$client;
66
+ * if (client && typeof client.exec === 'function') {
67
+ * client.exec('VACUUM');
68
+ * }
69
+ * ```
70
+ */
71
+ export async function getDbClient() {
72
+ try {
73
+ // Get raw database connection
74
+ const rawDb = await getDb();
75
+ // Get schema (with caching)
76
+ if (!cachedSchema) {
77
+ cachedSchema = await getSchema();
78
+ }
79
+ // Create wrapped database client
80
+ const db = createDatabaseClient(rawDb);
81
+ return {
82
+ db,
83
+ schema: cachedSchema,
84
+ raw: rawDb,
85
+ };
86
+ }
87
+ catch (error) {
88
+ const message = error instanceof Error
89
+ ? `Database initialization failed: ${error.message}`
90
+ : 'Database initialization failed';
91
+ // Wrap error with clear message while preserving cause
92
+ const wrappedError = new Error(message);
93
+ // @ts-ignore - TypeScript doesn't allow 'cause' on Error, but it's valid
94
+ wrappedError.cause = error;
95
+ throw wrappedError;
96
+ }
97
+ }
98
+ /**
99
+ * Execute an operation with a unified database client.
100
+ *
101
+ * Convenience wrapper that:
102
+ * 1. Calls getDbClient() to obtain client
103
+ * 2. Executes the provided operation
104
+ * 3. Ensures proper cleanup if needed (no-op currently, for future extension)
105
+ *
106
+ * @param operation - Async function that receives the DbClient and returns a result
107
+ * @returns Promise<T> The result returned by the operation
108
+ * @throws {Error} When database initialization or operation fails
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const count = await withDbClient(async (client) => {
113
+ * const result = await client.db
114
+ * .select({ count: sql`count(*)` })
115
+ * .from(client.schema.memories);
116
+ * return result[0].count;
117
+ * });
118
+ * ```
119
+ */
120
+ export async function withDbClient(operation) {
121
+ const client = await getDbClient();
122
+ try {
123
+ return await operation(client);
124
+ }
125
+ finally {
126
+ // Future: Add cleanup logic if needed (connection pooling, etc.)
127
+ // Currently getDb() handles connection pooling and reuse
128
+ }
129
+ }
130
+ //# sourceMappingURL=db-client.js.map
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Shared Zod schemas for input validation across Squish
3
+ * Provides consistent validation for common input types
4
+ */
5
+ import { z } from 'zod';
6
+ /**
7
+ * Limit schema: integer between 1 and 100, default 20
8
+ */
9
+ export declare const limitSchema: z.ZodDefault<z.ZodNumber>;
10
+ /**
11
+ * Offset schema: integer >= 0, default 0
12
+ */
13
+ export declare const offsetSchema: z.ZodDefault<z.ZodNumber>;
14
+ /**
15
+ * Project ID/path schema: non-empty string
16
+ */
17
+ export declare const projectIdSchema: z.ZodString;
18
+ /**
19
+ * Memory ID schema: valid UUID
20
+ */
21
+ export declare const memoryIdSchema: z.ZodString;
22
+ /**
23
+ * Pagination schema combining limit and offset
24
+ */
25
+ export declare const paginationSchema: z.ZodObject<{
26
+ limit: z.ZodDefault<z.ZodNumber>;
27
+ offset: z.ZodDefault<z.ZodNumber>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ limit: number;
30
+ offset: number;
31
+ }, {
32
+ limit?: number | undefined;
33
+ offset?: number | undefined;
34
+ }>;
35
+ /**
36
+ * Search query schema: non-empty string
37
+ */
38
+ export declare const searchQuerySchema: z.ZodString;
39
+ /**
40
+ * Memory type schema
41
+ */
42
+ export declare const memoryTypeSchema: z.ZodEnum<["observation", "fact", "decision", "context", "preference", "note"]>;
43
+ /**
44
+ * Association type schema
45
+ */
46
+ export declare const associationTypeSchema: z.ZodEnum<["relates_to", "supports", "contradicts", "supersedes", "duplicate"]>;
47
+ /**
48
+ * Weight schema: number between 0 and 1
49
+ */
50
+ export declare const weightSchema: z.ZodNumber;
51
+ /**
52
+ * Learning type schema
53
+ */
54
+ export declare const learningTypeSchema: z.ZodEnum<["success", "failure", "fix", "observation"]>;
55
+ /**
56
+ * Observation type schema
57
+ */
58
+ export declare const observationTypeSchema: z.ZodEnum<["tool_use", "file_change", "error", "pattern", "insight"]>;
59
+ /**
60
+ * Confidence level schema
61
+ */
62
+ export declare const confidenceLevelSchema: z.ZodEnum<["certain", "speculative", "outdated"]>;
63
+ /**
64
+ * Search input schema (common for search operations)
65
+ */
66
+ export declare const searchInputSchema: z.ZodObject<{
67
+ query: z.ZodString;
68
+ limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
69
+ offset: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
70
+ project: z.ZodOptional<z.ZodString>;
71
+ type: z.ZodOptional<z.ZodEnum<["observation", "fact", "decision", "context", "preference", "note"]>>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ query: string;
74
+ project?: string | undefined;
75
+ type?: "observation" | "fact" | "decision" | "context" | "preference" | "note" | undefined;
76
+ limit?: number | undefined;
77
+ offset?: number | undefined;
78
+ }, {
79
+ query: string;
80
+ project?: string | undefined;
81
+ type?: "observation" | "fact" | "decision" | "context" | "preference" | "note" | undefined;
82
+ limit?: number | undefined;
83
+ offset?: number | undefined;
84
+ }>;
85
+ /**
86
+ * Memory recall schema
87
+ */
88
+ export declare const recallInputSchema: z.ZodObject<{
89
+ memoryId: z.ZodString;
90
+ limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
91
+ project: z.ZodOptional<z.ZodString>;
92
+ }, "strip", z.ZodTypeAny, {
93
+ memoryId: string;
94
+ project?: string | undefined;
95
+ limit?: number | undefined;
96
+ }, {
97
+ memoryId: string;
98
+ project?: string | undefined;
99
+ limit?: number | undefined;
100
+ }>;
101
+ /**
102
+ * Tag operation schema
103
+ */
104
+ export declare const tagOperationSchema: z.ZodObject<{
105
+ action: z.ZodEnum<["add", "remove"]>;
106
+ tag: z.ZodString;
107
+ search: z.ZodOptional<z.ZodString>;
108
+ olderThan: z.ZodOptional<z.ZodString>;
109
+ type: z.ZodOptional<z.ZodEnum<["observation", "fact", "decision", "context", "preference", "note"]>>;
110
+ limit: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
111
+ project: z.ZodOptional<z.ZodString>;
112
+ }, "strip", z.ZodTypeAny, {
113
+ action: "add" | "remove";
114
+ tag: string;
115
+ search?: string | undefined;
116
+ project?: string | undefined;
117
+ type?: "observation" | "fact" | "decision" | "context" | "preference" | "note" | undefined;
118
+ limit?: number | undefined;
119
+ olderThan?: string | undefined;
120
+ }, {
121
+ action: "add" | "remove";
122
+ tag: string;
123
+ search?: string | undefined;
124
+ project?: string | undefined;
125
+ type?: "observation" | "fact" | "decision" | "context" | "preference" | "note" | undefined;
126
+ limit?: number | undefined;
127
+ olderThan?: string | undefined;
128
+ }>;
129
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Shared Zod schemas for input validation across Squish
3
+ * Provides consistent validation for common input types
4
+ */
5
+ import { z } from 'zod';
6
+ /**
7
+ * Limit schema: integer between 1 and 100, default 20
8
+ */
9
+ export const limitSchema = z.number().int().min(1).max(100).default(20);
10
+ /**
11
+ * Offset schema: integer >= 0, default 0
12
+ */
13
+ export const offsetSchema = z.number().int().min(0).default(0);
14
+ /**
15
+ * Project ID/path schema: non-empty string
16
+ */
17
+ export const projectIdSchema = z.string().min(1);
18
+ /**
19
+ * Memory ID schema: valid UUID
20
+ */
21
+ export const memoryIdSchema = z.string().uuid();
22
+ /**
23
+ * Pagination schema combining limit and offset
24
+ */
25
+ export const paginationSchema = z.object({
26
+ limit: limitSchema,
27
+ offset: offsetSchema,
28
+ });
29
+ /**
30
+ * Search query schema: non-empty string
31
+ */
32
+ export const searchQuerySchema = z.string().min(1).trim();
33
+ /**
34
+ * Memory type schema
35
+ */
36
+ export const memoryTypeSchema = z.enum(['observation', 'fact', 'decision', 'context', 'preference', 'note']);
37
+ /**
38
+ * Association type schema
39
+ */
40
+ export const associationTypeSchema = z.enum(['relates_to', 'supports', 'contradicts', 'supersedes', 'duplicate']);
41
+ /**
42
+ * Weight schema: number between 0 and 1
43
+ */
44
+ export const weightSchema = z.number().min(0).max(1);
45
+ /**
46
+ * Learning type schema
47
+ */
48
+ export const learningTypeSchema = z.enum(['success', 'failure', 'fix', 'observation']);
49
+ /**
50
+ * Observation type schema
51
+ */
52
+ export const observationTypeSchema = z.enum(['tool_use', 'file_change', 'error', 'pattern', 'insight']);
53
+ /**
54
+ * Confidence level schema
55
+ */
56
+ export const confidenceLevelSchema = z.enum(['certain', 'speculative', 'outdated']);
57
+ /**
58
+ * Search input schema (common for search operations)
59
+ */
60
+ export const searchInputSchema = z.object({
61
+ query: searchQuerySchema,
62
+ limit: limitSchema.optional(),
63
+ offset: offsetSchema.optional(),
64
+ project: projectIdSchema.optional(),
65
+ type: memoryTypeSchema.optional(),
66
+ });
67
+ /**
68
+ * Memory recall schema
69
+ */
70
+ export const recallInputSchema = z.object({
71
+ memoryId: memoryIdSchema,
72
+ limit: limitSchema.optional(),
73
+ project: projectIdSchema.optional(),
74
+ });
75
+ /**
76
+ * Tag operation schema
77
+ */
78
+ export const tagOperationSchema = z.object({
79
+ action: z.enum(['add', 'remove']),
80
+ tag: z.string().min(1),
81
+ search: z.string().optional(),
82
+ olderThan: z.string().optional(),
83
+ type: memoryTypeSchema.optional(),
84
+ limit: limitSchema.optional(),
85
+ project: projectIdSchema.optional(),
86
+ });
87
+ //# sourceMappingURL=schemas.js.map
@@ -2,6 +2,7 @@
2
2
  * Shared utility functions for the squish codebase
3
3
  */
4
4
  export declare function normalizeTimestamp(value: any): string | null;
5
+ export declare function now(): string;
5
6
  export declare function isDatabaseUnavailableError(error: any): boolean;
6
7
  export declare function withDatabaseErrorHandling<T>(operation: () => Promise<T>, errorMessage: string): Promise<T>;
7
8
  export declare function clampLimit(value: number | undefined, defaultValue: number, min?: number, max?: number): number;
@@ -2,8 +2,8 @@
2
2
  * Shared utility functions for the squish codebase
3
3
  */
4
4
  import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
5
- import { config } from '../config.js';
6
- import { toSqliteJson } from './memory/serialization.js';
5
+ import { config } from '../../config.js';
6
+ import { toSqliteJson } from '../memory/serialization.js';
7
7
  export function normalizeTimestamp(value) {
8
8
  if (!value)
9
9
  return null;
@@ -11,15 +11,20 @@ export function normalizeTimestamp(value) {
11
11
  return value.toISOString();
12
12
  if (typeof value === 'number') {
13
13
  try {
14
- const date = new Date(value);
15
- if (!isNaN(date.getTime()))
16
- return date.toISOString();
17
- const dateSec = new Date(value * 1000);
18
- if (!isNaN(dateSec.getTime()))
19
- return dateSec.toISOString();
20
- const dateMs = new Date(value / 1000);
21
- if (!isNaN(dateMs.getTime()))
22
- return dateMs.toISOString();
14
+ // Handle different timestamp formats using magnitude thresholds
15
+ // Microseconds: > 100000000000000 (e.g., 1700000000000000)
16
+ // Milliseconds: > 1000000000000 (e.g., 1700000000000)
17
+ // Seconds: <= 1000000000000 (e.g., 1700000000)
18
+ if (value > 100000000000000) {
19
+ return new Date(value / 1000).toISOString();
20
+ }
21
+ else if (value > 1000000000000) {
22
+ return new Date(value).toISOString();
23
+ }
24
+ else if (value >= 0) {
25
+ return new Date(value * 1000).toISOString();
26
+ }
27
+ return null;
23
28
  }
24
29
  catch {
25
30
  return null;
@@ -30,17 +35,28 @@ export function normalizeTimestamp(value) {
30
35
  const parsed = new Date(value);
31
36
  if (!isNaN(parsed.getTime()))
32
37
  return parsed.toISOString();
38
+ return null;
33
39
  }
34
40
  catch {
35
- return value;
41
+ return null;
36
42
  }
37
- return value;
38
43
  }
39
44
  return null;
40
45
  }
46
+ export function now() {
47
+ return new Date().toISOString();
48
+ }
41
49
  export function isDatabaseUnavailableError(error) {
42
- return error.message?.includes('Database unavailable') ||
43
- error.message?.includes('not a valid Win32 application');
50
+ const message = error?.message || '';
51
+ return [
52
+ 'Database unavailable',
53
+ 'not a valid Win32 application',
54
+ 'invalid ELF header',
55
+ 'bun:',
56
+ 'sql.js wasm asset not found',
57
+ 'SQLite database initialization failed',
58
+ 'working local SQLite driver',
59
+ ].some((pattern) => message.includes(pattern));
44
60
  }
45
61
  export async function withDatabaseErrorHandling(operation, errorMessage) {
46
62
  try {
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Input validation utilities for Squish
3
+ * Consolidates scattered validation patterns into a unified module
4
+ */
5
+ import { normalizeTags } from '../memory/serialization.js';
6
+ /**
7
+ * Validate and normalize a limit value with bounds checking
8
+ */
9
+ export declare function validateLimit(value: number | string | undefined, defaultValue?: number, min?: number, max?: number): number;
10
+ /**
11
+ * Parse an integer with bounds checking
12
+ */
13
+ export declare function parseIntBounded(value: number | string | undefined, defaultValue: number, min: number, max: number): number;
14
+ /**
15
+ * Validate a project path
16
+ */
17
+ export declare function validateProjectPath(path: string | undefined, options?: {
18
+ createIfMissing?: boolean;
19
+ require?: boolean;
20
+ }): Promise<string>;
21
+ /**
22
+ * Validate a UUID
23
+ */
24
+ export declare function validateUuid(id: string): boolean;
25
+ /**
26
+ * Require a valid UUID, throws if invalid
27
+ */
28
+ export declare function requireUuid(id: string): string;
29
+ /**
30
+ * Validate a date value
31
+ *
32
+ * @param value - The date to validate (string, Date, number, or undefined)
33
+ * @returns Date object if valid, null otherwise
34
+ */
35
+ export declare function validateDate(value: string | Date | number | undefined): Date | null;
36
+ export { normalizeTags };
37
+ export { clampLimit } from './utils.js';
38
+ //# sourceMappingURL=validation.d.ts.map