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
@@ -20,31 +20,31 @@ const DEFAULT_CONFIG = {
20
20
  */
21
21
  function buildFactExtractionPrompt(messages) {
22
22
  const messagesText = messages.map(m => `[${m.role}]: ${m.content}`).join('\n\n');
23
- return `Extract key facts, decisions, and user preferences from this conversation.
24
-
25
- Format your response as JSON:
26
- {
27
- "extractedFacts": [
28
- {
29
- "content": "specific fact text",
30
- "type": "fact|decision|preference|observation",
31
- "confidence": 0-100
32
- }
33
- ]
34
- }
35
-
36
- Only extract truly meaningful information that should be remembered:
37
- - Facts that are useful for future work or decisions
38
- - User preferences and choices
39
- - Important decisions made
40
- - Patterns or behaviors observed
41
-
42
- Do NOT extract:
43
- - Temporary conversational details
44
- - Greetings or pleasantries
45
- - Unless they indicate something significant
46
-
47
- Conversation messages:
23
+ return `Extract key facts, decisions, and user preferences from this conversation.
24
+
25
+ Format your response as JSON:
26
+ {
27
+ "extractedFacts": [
28
+ {
29
+ "content": "specific fact text",
30
+ "type": "fact|decision|preference|observation",
31
+ "confidence": 0-100
32
+ }
33
+ ]
34
+ }
35
+
36
+ Only extract truly meaningful information that should be remembered:
37
+ - Facts that are useful for future work or decisions
38
+ - User preferences and choices
39
+ - Important decisions made
40
+ - Patterns or behaviors observed
41
+
42
+ Do NOT extract:
43
+ - Temporary conversational details
44
+ - Greetings or pleasantries
45
+ - Unless they indicate something significant
46
+
47
+ Conversation messages:
48
48
  ${messagesText}`;
49
49
  }
50
50
  /**
@@ -52,14 +52,14 @@ ${messagesText}`;
52
52
  */
53
53
  function buildSummaryPrompt(messages) {
54
54
  const messagesText = messages.map(m => `[${m.role}]: ${m.content}`).join('\n\n');
55
- return `Generate a concise summary of this conversation (2-3 sentences, under 300 characters).
56
-
57
- Focus on:
58
- - What was accomplished
59
- - Key decisions made
60
- - Important context established
61
-
62
- Conversation messages:
55
+ return `Generate a concise summary of this conversation (2-3 sentences, under 300 characters).
56
+
57
+ Focus on:
58
+ - What was accomplished
59
+ - Key decisions made
60
+ - Important context established
61
+
62
+ Conversation messages:
63
63
  ${messagesText}`;
64
64
  }
65
65
  /**
@@ -93,8 +93,8 @@ async function getConversationsForIteration(maxMessages) {
93
93
  // 3. Have enough messages (messageCount >= minMessageCount)
94
94
  const conversations = await sqliteDb.select()
95
95
  .from(schema.conversations)
96
- .where(sql `${schema.conversations.endedAt} IS NOT NULL
97
- AND (${schema.conversations.metadata}->>'selfIterationProcessed') IS NULL
96
+ .where(sql `${schema.conversations.endedAt} IS NOT NULL
97
+ AND (${schema.conversations.metadata}->>'selfIterationProcessed') IS NULL
98
98
  AND ${schema.conversations.messageCount} >= ?`)
99
99
  .limit(10);
100
100
  return conversations;
@@ -1,5 +1,5 @@
1
- import { config } from '../config.js';
2
- import { logger } from './logger.js';
1
+ import { config } from '../../config.js';
2
+ import { logger } from '../logger.js';
3
3
  let redis = null;
4
4
  class LRUCache {
5
5
  cache = new Map();
@@ -1,18 +1,6 @@
1
1
  /**
2
2
  * QMD Memory Synchronization
3
- *
4
- * Syncs Squish memories to QMD collections for hybrid search.
5
- * Writes memories as markdown files to QMD collection directories.
6
- *
7
- * QMD automatically indexes files in collection directories, so we just
8
- * need to write files to the right location.
9
- *
10
- * Collection Structure:
11
- * - qmd-collections/squish-observations/ - Observation memories
12
- * - qmd-collections/squish-facts/ - Fact memories
13
- * - qmd-collections/squish-decisions/ - Decision memories
14
- * - qmd-collections/squish-context/ - Context memories
15
- * - qmd-collections/squish-preferences/ - Preference memories
3
+ * Syncs Squish memories to QMD collections for hybrid search
16
4
  */
17
5
  import type { MemoryRecord } from '../memory/memories.js';
18
6
  export interface CollectionMapping {
@@ -1,18 +1,6 @@
1
1
  /**
2
2
  * QMD Memory Synchronization
3
- *
4
- * Syncs Squish memories to QMD collections for hybrid search.
5
- * Writes memories as markdown files to QMD collection directories.
6
- *
7
- * QMD automatically indexes files in collection directories, so we just
8
- * need to write files to the right location.
9
- *
10
- * Collection Structure:
11
- * - qmd-collections/squish-observations/ - Observation memories
12
- * - qmd-collections/squish-facts/ - Fact memories
13
- * - qmd-collections/squish-decisions/ - Decision memories
14
- * - qmd-collections/squish-context/ - Context memories
15
- * - qmd-collections/squish-preferences/ - Preference memories
3
+ * Syncs Squish memories to QMD collections for hybrid search
16
4
  */
17
5
  import { mkdir, writeFile } from 'fs/promises';
18
6
  import { join } from 'path';
@@ -0,0 +1,43 @@
1
+ /**
2
+ * TOON Compression - Token-efficient memory format
3
+ *
4
+ * Compact format for memory context using abbreviated notation.
5
+ * Achieves efficient token usage for context injection.
6
+ *
7
+ * Format:
8
+ * {
9
+ * m:[type], // memory type (1-2 chars)
10
+ * c:"...", // content (truncated)
11
+ * t:[], // tags (array)
12
+ * d:123 // days ago
13
+ * }
14
+ */
15
+ /**
16
+ * Compress a memory to TOON format
17
+ */
18
+ export declare function compressForContext(content: string): string;
19
+ /**
20
+ * Decompress TOON back to readable format
21
+ */
22
+ export declare function decompressFromContext(toonString: string): string;
23
+ /**
24
+ * Estimate compression ratio
25
+ */
26
+ export declare function estimateCompressionRatio(content: string): number;
27
+ /**
28
+ * Check if content is JSON
29
+ */
30
+ export declare function isJson(content: string): boolean;
31
+ /**
32
+ * Check if content is TOON format
33
+ */
34
+ export declare function isToon(content: string): boolean;
35
+ /**
36
+ * Count tokens (rough estimate)
37
+ */
38
+ export declare function estimateTokens(text: string): number;
39
+ /**
40
+ * Truncate to token budget
41
+ */
42
+ export declare function truncateToTokenBudget(content: string, maxTokens: number): string;
43
+ //# sourceMappingURL=toon.d.ts.map
@@ -0,0 +1,160 @@
1
+ /**
2
+ * TOON Compression - Token-efficient memory format
3
+ *
4
+ * Compact format for memory context using abbreviated notation.
5
+ * Achieves efficient token usage for context injection.
6
+ *
7
+ * Format:
8
+ * {
9
+ * m:[type], // memory type (1-2 chars)
10
+ * c:"...", // content (truncated)
11
+ * t:[], // tags (array)
12
+ * d:123 // days ago
13
+ * }
14
+ */
15
+ const MAX_CONTENT_LENGTH = 80; // Max chars per content
16
+ const MAX_TAGS = 3; // Max tags to include
17
+ /**
18
+ * Compress a memory to TOON format
19
+ */
20
+ export function compressForContext(content) {
21
+ // If not JSON or already short, just return
22
+ if (!isJson(content) || content.length <= MAX_CONTENT_LENGTH) {
23
+ return content;
24
+ }
25
+ try {
26
+ const parsed = JSON.parse(content);
27
+ // Build compact TOON object
28
+ const toon = {
29
+ m: parsed.type?.substring(0, 2) || 'ob', // observation -> ob
30
+ };
31
+ // Truncate content
32
+ if (parsed.content) {
33
+ const truncated = parsed.content.substring(0, MAX_CONTENT_LENGTH);
34
+ toon.c = truncated.length < parsed.content.length ? truncated + '..' : truncated;
35
+ }
36
+ // Add tags (limited)
37
+ if (parsed.tags && Array.isArray(parsed.tags)) {
38
+ toon.t = parsed.tags.slice(0, MAX_TAGS);
39
+ }
40
+ // Add days ago if there's a date
41
+ if (parsed.createdAt) {
42
+ const days = Math.floor((Date.now() - new Date(parsed.createdAt).getTime()) / (1000 * 60 * 60 * 24));
43
+ if (days > 0) {
44
+ toon.d = days;
45
+ }
46
+ }
47
+ return JSON.stringify(toon);
48
+ }
49
+ catch {
50
+ // Not parseable JSON, return truncated content
51
+ return content.substring(0, MAX_CONTENT_LENGTH);
52
+ }
53
+ }
54
+ /**
55
+ * Decompress TOON back to readable format
56
+ */
57
+ export function decompressFromContext(toonString) {
58
+ // Check if it's TOON format
59
+ if (!isToon(toonString)) {
60
+ return toonString;
61
+ }
62
+ try {
63
+ const parsed = JSON.parse(toonString);
64
+ // If it has TOON markers, expand it
65
+ if (parsed.m || parsed.c || parsed.t) {
66
+ const typeMap = {
67
+ ob: 'observation',
68
+ su: 'success',
69
+ f: 'failure',
70
+ fx: 'fix',
71
+ i: 'insight',
72
+ };
73
+ const type = typeMap[parsed.m] || 'observation';
74
+ const parts = [`[${type}]`];
75
+ if (parsed.c) {
76
+ parts.push(parsed.c);
77
+ }
78
+ if (parsed.t && parsed.t.length > 0) {
79
+ parts.push(`#${parsed.t.join(' #')}`);
80
+ }
81
+ if (parsed.d) {
82
+ parts.push(`(${parsed.d}d ago)`);
83
+ }
84
+ return parts.join(' ');
85
+ }
86
+ return toonString;
87
+ }
88
+ catch {
89
+ // Not valid TOON, return as-is
90
+ return toonString;
91
+ }
92
+ }
93
+ /**
94
+ * Estimate compression ratio
95
+ */
96
+ export function estimateCompressionRatio(content) {
97
+ if (!isJson(content) || content.length <= MAX_CONTENT_LENGTH) {
98
+ return 1.0;
99
+ }
100
+ const compressed = compressForContext(content);
101
+ return compressed.length / content.length;
102
+ }
103
+ /**
104
+ * Check if content is JSON
105
+ */
106
+ export function isJson(content) {
107
+ try {
108
+ JSON.parse(content);
109
+ return true;
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
115
+ /**
116
+ * Check if content is TOON format
117
+ */
118
+ export function isToon(content) {
119
+ if (!content.startsWith('{') || !content.endsWith('}')) {
120
+ return false;
121
+ }
122
+ try {
123
+ const parsed = JSON.parse(content);
124
+ // Has TOON markers
125
+ return parsed.m !== undefined || parsed.c !== undefined;
126
+ }
127
+ catch {
128
+ return false;
129
+ }
130
+ }
131
+ /**
132
+ * Count tokens (rough estimate)
133
+ */
134
+ export function estimateTokens(text) {
135
+ return Math.ceil(text.length / 4);
136
+ }
137
+ /**
138
+ * Truncate to token budget
139
+ */
140
+ export function truncateToTokenBudget(content, maxTokens) {
141
+ const tokens = estimateTokens(content);
142
+ if (tokens <= maxTokens) {
143
+ return content;
144
+ }
145
+ // Binary search for the right length
146
+ let low = 0;
147
+ let high = content.length;
148
+ while (low < high) {
149
+ const mid = Math.floor((low + high) / 2);
150
+ const estimated = estimateTokens(content.substring(0, mid));
151
+ if (estimated <= maxTokens) {
152
+ low = mid + 1;
153
+ }
154
+ else {
155
+ high = mid;
156
+ }
157
+ }
158
+ return content.substring(0, low) + '...';
159
+ }
160
+ //# sourceMappingURL=toon.js.map
@@ -5,7 +5,7 @@
5
5
  import { eq } from 'drizzle-orm';
6
6
  import { getDb } from '../../db/index.js';
7
7
  import { getSchema } from '../../db/schema.js';
8
- import { createDatabaseClient } from '../database.js';
8
+ import { createDatabaseClient } from '../storage/database.js';
9
9
  import { config } from '../../config.js';
10
10
  import { logger } from '../logger.js';
11
11
  /**
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Vector Operations Utilities
3
+ *
4
+ * Provides mathematical operations for vector computations, primarily focused on
5
+ * cosine similarity calculations for embedding comparisons.
6
+ *
7
+ * All functions handle edge cases gracefully and are optimized for performance.
8
+ */
9
+ /**
10
+ * Calculates the cosine similarity between two vectors.
11
+ *
12
+ * Cosine similarity measures the cosine of the angle between two vectors,
13
+ * providing a normalized measure of similarity that ranges from -1 (opposite)
14
+ * to 1 (identical), with 0 indicating orthogonality (no similarity).
15
+ *
16
+ * The implementation uses the standard formula:
17
+ * cos(θ) = (A · B) / (||A|| * ||B||)
18
+ *
19
+ * Edge case handling:
20
+ * - Returns 0 if either vector is null/undefined
21
+ * - Returns 0 if vectors have different lengths
22
+ * - Returns 0 if either vector has zero magnitude (norm = 0)
23
+ *
24
+ * @param a - First vector as array of numbers
25
+ * @param b - Second vector as array of numbers
26
+ * @returns Cosine similarity value in range [-1, 1], or 0 for invalid inputs
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const vec1 = [1, 2, 3];
31
+ * const vec2 = [4, 5, 6];
32
+ * const similarity = cosineSimilarity(vec1, vec2); // ~0.974
33
+ * ```
34
+ *
35
+ * @performance
36
+ * - Time complexity: O(n) where n is vector length
37
+ * - Space complexity: O(1) - uses only accumulator variables
38
+ * - Optimized with single-pass computation of dot product and norms
39
+ */
40
+ export declare function cosineSimilarity(a: number[] | null | undefined, b: number[] | null | undefined): number;
41
+ /**
42
+ * Calculates the Euclidean distance between two vectors.
43
+ *
44
+ * @param a - First vector
45
+ * @param b - Second vector
46
+ * @returns Euclidean distance, or Infinity if vectors have different lengths
47
+ */
48
+ export declare function euclideanDistance(a: number[] | null | undefined, b: number[] | null | undefined): number;
49
+ /**
50
+ * Normalizes a vector to unit length (magnitude = 1).
51
+ *
52
+ * @param vec - Input vector
53
+ * @returns Normalized vector, or null if input is null or zero vector
54
+ */
55
+ export declare function normalizeVector(vec: number[] | null | undefined): number[] | null;
56
+ /**
57
+ * Computes the dot product of two vectors.
58
+ *
59
+ * @param a - First vector
60
+ * @param b - Second vector
61
+ * @returns Dot product, or 0 if vectors are invalid or different lengths
62
+ */
63
+ export declare function dotProduct(a: number[] | null | undefined, b: number[] | null | undefined): number;
64
+ /**
65
+ * Calculates the magnitude (L2 norm) of a vector.
66
+ *
67
+ * @param vec - Input vector
68
+ * @returns Magnitude of the vector, or 0 if input is null
69
+ */
70
+ export declare function magnitude(vec: number[] | null | undefined): number;
71
+ //# sourceMappingURL=vector-operations.d.ts.map
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Vector Operations Utilities
3
+ *
4
+ * Provides mathematical operations for vector computations, primarily focused on
5
+ * cosine similarity calculations for embedding comparisons.
6
+ *
7
+ * All functions handle edge cases gracefully and are optimized for performance.
8
+ */
9
+ /**
10
+ * Calculates the cosine similarity between two vectors.
11
+ *
12
+ * Cosine similarity measures the cosine of the angle between two vectors,
13
+ * providing a normalized measure of similarity that ranges from -1 (opposite)
14
+ * to 1 (identical), with 0 indicating orthogonality (no similarity).
15
+ *
16
+ * The implementation uses the standard formula:
17
+ * cos(θ) = (A · B) / (||A|| * ||B||)
18
+ *
19
+ * Edge case handling:
20
+ * - Returns 0 if either vector is null/undefined
21
+ * - Returns 0 if vectors have different lengths
22
+ * - Returns 0 if either vector has zero magnitude (norm = 0)
23
+ *
24
+ * @param a - First vector as array of numbers
25
+ * @param b - Second vector as array of numbers
26
+ * @returns Cosine similarity value in range [-1, 1], or 0 for invalid inputs
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const vec1 = [1, 2, 3];
31
+ * const vec2 = [4, 5, 6];
32
+ * const similarity = cosineSimilarity(vec1, vec2); // ~0.974
33
+ * ```
34
+ *
35
+ * @performance
36
+ * - Time complexity: O(n) where n is vector length
37
+ * - Space complexity: O(1) - uses only accumulator variables
38
+ * - Optimized with single-pass computation of dot product and norms
39
+ */
40
+ export function cosineSimilarity(a, b) {
41
+ // Guard against null/undefined inputs
42
+ if (!a || !b)
43
+ return 0;
44
+ // Vectors must have same dimensions
45
+ if (a.length !== b.length)
46
+ return 0;
47
+ let dotProduct = 0;
48
+ let normA = 0;
49
+ let normB = 0;
50
+ // Single pass to compute dot product and norms
51
+ for (let i = 0; i < a.length; i++) {
52
+ dotProduct += a[i] * b[i];
53
+ normA += a[i] * a[i];
54
+ normB += b[i] * b[i];
55
+ }
56
+ // Handle zero vectors (avoid division by zero)
57
+ if (normA === 0 || normB === 0)
58
+ return 0;
59
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
60
+ }
61
+ /**
62
+ * Calculates the Euclidean distance between two vectors.
63
+ *
64
+ * @param a - First vector
65
+ * @param b - Second vector
66
+ * @returns Euclidean distance, or Infinity if vectors have different lengths
67
+ */
68
+ export function euclideanDistance(a, b) {
69
+ if (!a || !b)
70
+ return Infinity;
71
+ if (a.length !== b.length)
72
+ return Infinity;
73
+ let sum = 0;
74
+ for (let i = 0; i < a.length; i++) {
75
+ const diff = a[i] - b[i];
76
+ sum += diff * diff;
77
+ }
78
+ return Math.sqrt(sum);
79
+ }
80
+ /**
81
+ * Normalizes a vector to unit length (magnitude = 1).
82
+ *
83
+ * @param vec - Input vector
84
+ * @returns Normalized vector, or null if input is null or zero vector
85
+ */
86
+ export function normalizeVector(vec) {
87
+ if (!vec)
88
+ return null;
89
+ let norm = 0;
90
+ for (let i = 0; i < vec.length; i++) {
91
+ norm += vec[i] * vec[i];
92
+ }
93
+ if (norm === 0)
94
+ return null;
95
+ const magnitude = Math.sqrt(norm);
96
+ return vec.map(val => val / magnitude);
97
+ }
98
+ /**
99
+ * Computes the dot product of two vectors.
100
+ *
101
+ * @param a - First vector
102
+ * @param b - Second vector
103
+ * @returns Dot product, or 0 if vectors are invalid or different lengths
104
+ */
105
+ export function dotProduct(a, b) {
106
+ if (!a || !b || a.length !== b.length)
107
+ return 0;
108
+ let result = 0;
109
+ for (let i = 0; i < a.length; i++) {
110
+ result += a[i] * b[i];
111
+ }
112
+ return result;
113
+ }
114
+ /**
115
+ * Calculates the magnitude (L2 norm) of a vector.
116
+ *
117
+ * @param vec - Input vector
118
+ * @returns Magnitude of the vector, or 0 if input is null
119
+ */
120
+ export function magnitude(vec) {
121
+ if (!vec)
122
+ return 0;
123
+ let sum = 0;
124
+ for (let i = 0; i < vec.length; i++) {
125
+ sum += vec[i] * vec[i];
126
+ }
127
+ return Math.sqrt(sum);
128
+ }
129
+ //# sourceMappingURL=vector-operations.js.map
@@ -1,7 +1,7 @@
1
- export declare function createDb(): Promise<(import("drizzle-orm/node-postgres").NodePgDatabase<typeof import("../drizzle/schema.js")> & {
1
+ export declare function createDb(): Promise<(import("drizzle-orm/node-postgres").NodePgDatabase<typeof import("./drizzle/schema.js")> & {
2
2
  $client: import("pg").Pool;
3
- }) | (import("drizzle-orm/better-sqlite3").BetterSQLite3Database<typeof import("../drizzle/schema-sqlite.js")> & {
3
+ }) | (import("drizzle-orm/better-sqlite3").BetterSQLite3Database<typeof import("./drizzle/schema-sqlite.js")> & {
4
4
  $client: import("better-sqlite3").Database;
5
- }) | import("drizzle-orm/sql-js").SQLJsDatabase<typeof import("../drizzle/schema-sqlite.js")>>;
5
+ }) | import("drizzle-orm/sql-js").SQLJsDatabase<typeof import("./drizzle/schema-sqlite.js")>>;
6
6
  export default createDb;
7
7
  //# sourceMappingURL=adapter.d.ts.map