squish-memory 1.0.2 → 1.2.0

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 (704) hide show
  1. package/.env.example +146 -0
  2. package/CHANGELOG.md +202 -0
  3. package/README.md +192 -287
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +46 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +10 -12
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +78 -22
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/core/algorithms/index.ts +39 -0
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/core/embeddings/local-embeddings.ts +12 -0
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/core/memory/index.ts +11 -0
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/core/places/index.ts +14 -0
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/core/search/index.ts +4 -0
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/core/session/index.ts +7 -0
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/core/snapshots/cleanup.ts +13 -0
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/core/summarization/cleanup.ts +13 -0
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/dist/config.d.ts +61 -14
  220. package/dist/config.js +159 -139
  221. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  222. package/dist/core/adapters/config/claude-code.js +113 -0
  223. package/dist/core/adapters/config/cursor.d.ts +26 -0
  224. package/dist/core/adapters/config/cursor.js +74 -0
  225. package/dist/core/adapters/config/opencode.d.ts +23 -0
  226. package/dist/core/adapters/config/opencode.js +73 -0
  227. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  228. package/dist/core/adapters/config/windsurf.js +74 -0
  229. package/dist/core/adapters/index.d.ts +45 -0
  230. package/dist/core/adapters/index.js +84 -0
  231. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  232. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  233. package/dist/core/adapters/timeline.d.ts +23 -0
  234. package/dist/core/adapters/timeline.js +88 -0
  235. package/dist/core/adapters/types.d.ts +137 -0
  236. package/dist/core/adapters/types.js +50 -0
  237. package/dist/core/agent-preferences.d.ts +16 -0
  238. package/dist/core/agent-preferences.js +124 -0
  239. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  240. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  241. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  242. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  243. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  244. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  245. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  246. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  247. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  248. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  249. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  250. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  251. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  252. package/dist/core/algorithms/index.d.ts +21 -0
  253. package/dist/core/algorithms/index.js +26 -0
  254. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  255. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  256. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
  257. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  258. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  259. package/dist/core/algorithms/types.d.ts +125 -0
  260. package/dist/core/algorithms/types.js +5 -0
  261. package/dist/core/associations.d.ts +3 -2
  262. package/dist/core/associations.js +37 -2
  263. package/dist/core/autosave.d.ts +19 -0
  264. package/dist/core/autosave.js +16 -0
  265. package/dist/core/beliefs/decay.d.ts +27 -0
  266. package/dist/core/beliefs/decay.js +217 -0
  267. package/dist/core/beliefs/extractor.d.ts +9 -0
  268. package/dist/core/beliefs/extractor.js +113 -0
  269. package/dist/core/beliefs/store.d.ts +46 -0
  270. package/dist/core/beliefs/store.js +466 -0
  271. package/dist/core/beliefs/types.d.ts +28 -0
  272. package/dist/core/beliefs/types.js +2 -0
  273. package/dist/core/commands/mcp-server.d.ts +2 -0
  274. package/dist/core/commands/mcp-server.js +6 -0
  275. package/dist/core/commands/remember.d.ts +24 -0
  276. package/dist/core/commands/remember.js +144 -0
  277. package/dist/core/compression.d.ts +45 -0
  278. package/dist/core/compression.js +160 -0
  279. package/dist/core/context/agent-context.d.ts +106 -0
  280. package/dist/core/context/agent-context.js +274 -0
  281. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  282. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  283. package/dist/core/context/context-window.d.ts +40 -0
  284. package/dist/core/context/context-window.js +177 -0
  285. package/dist/core/context/context.js +22 -0
  286. package/dist/core/embeddings/embeddings.d.ts +29 -0
  287. package/dist/core/embeddings/embeddings.js +546 -0
  288. package/dist/core/embeddings/google-multimodal.js +6 -2
  289. package/dist/core/embeddings/local-embeddings.d.ts +11 -0
  290. package/dist/core/embeddings/local-embeddings.js +11 -0
  291. package/dist/core/embeddings/qmd-client.js +1 -1
  292. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  293. package/dist/core/embeddings/transformers-local.js +213 -0
  294. package/dist/core/embeddings.d.ts +1 -28
  295. package/dist/core/embeddings.js +2 -401
  296. package/dist/core/error-handling.d.ts +63 -0
  297. package/dist/core/error-handling.js +173 -0
  298. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  299. package/dist/core/graph/entity-deduplicator.js +183 -0
  300. package/dist/core/graph/graph-builder.d.ts +46 -0
  301. package/dist/core/graph/graph-builder.js +174 -0
  302. package/dist/core/graph/graph-traversal.d.ts +80 -0
  303. package/dist/core/graph/graph-traversal.js +315 -0
  304. package/dist/core/graph/index.d.ts +19 -0
  305. package/dist/core/graph/index.js +13 -0
  306. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  307. package/dist/core/graph/llm-entity-extractor.js +313 -0
  308. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  309. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  310. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  311. package/dist/core/graph/relationship-extractor.js +351 -0
  312. package/dist/core/hooks/agent-hooks.d.ts +83 -0
  313. package/dist/core/hooks/agent-hooks.js +521 -0
  314. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  315. package/dist/core/hooks/auto-tagger.js +155 -0
  316. package/dist/core/hooks/capture-filter.d.ts +41 -0
  317. package/dist/core/hooks/capture-filter.js +128 -0
  318. package/dist/core/hot-cache.d.ts +86 -0
  319. package/dist/core/hot-cache.js +285 -0
  320. package/dist/core/index.d.ts +9 -9
  321. package/dist/core/index.js +9 -12
  322. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  323. package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
  324. package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
  325. package/dist/core/ingestion/learnings.d.ts +57 -0
  326. package/dist/core/ingestion/learnings.js +205 -0
  327. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  328. package/dist/core/ingestion/signal-engine.js +201 -0
  329. package/dist/core/integrations/obsidian-vault.d.ts +31 -0
  330. package/dist/core/integrations/obsidian-vault.js +156 -0
  331. package/dist/core/lib/db-client.d.ts +114 -0
  332. package/dist/core/lib/db-client.js +130 -0
  333. package/dist/core/lib/parse-embedding.d.ts +9 -0
  334. package/dist/core/lib/parse-embedding.js +58 -0
  335. package/dist/core/lib/schemas.d.ts +132 -0
  336. package/dist/core/lib/schemas.js +87 -0
  337. package/dist/core/lib/types.d.ts +45 -0
  338. package/dist/core/lib/types.js +6 -0
  339. package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
  340. package/dist/core/lib/utils.js +145 -0
  341. package/dist/core/lib/validation.d.ts +38 -0
  342. package/dist/core/lib/validation.js +151 -0
  343. package/dist/core/lifecycle.d.ts +7 -1
  344. package/dist/core/lifecycle.js +152 -42
  345. package/dist/core/logger.d.ts +1 -0
  346. package/dist/core/logger.js +13 -1
  347. package/dist/core/mcp/tools.d.ts +0 -2
  348. package/dist/core/mcp/tools.js +35 -90
  349. package/dist/core/mcp/types.d.ts +25 -253
  350. package/dist/core/mcp/types.js +2 -2
  351. package/dist/core/memory/categorizer.js +2 -0
  352. package/dist/core/memory/conflict-detector.js +1 -1
  353. package/dist/core/memory/consolidation.d.ts +1 -10
  354. package/dist/core/memory/consolidation.js +4 -39
  355. package/dist/core/memory/context-collector.js +1 -1
  356. package/dist/core/memory/edit-workflow.js +1 -1
  357. package/dist/core/memory/entity-extractor.d.ts +4 -0
  358. package/dist/core/memory/entity-extractor.js +30 -16
  359. package/dist/core/memory/entity-resolver.js +7 -7
  360. package/dist/core/memory/explain.d.ts +18 -0
  361. package/dist/core/memory/explain.js +92 -0
  362. package/dist/core/memory/fact-deriver.d.ts +31 -0
  363. package/dist/core/memory/fact-deriver.js +236 -0
  364. package/dist/core/memory/fact-extractor.js +12 -12
  365. package/dist/core/memory/feedback-tracker.js +1 -1
  366. package/dist/core/memory/hooks.d.ts +88 -0
  367. package/dist/core/memory/hooks.js +174 -0
  368. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  369. package/dist/core/memory/hybrid-retrieval.js +25 -127
  370. package/dist/core/memory/hybrid-scorer.js +6 -23
  371. package/dist/core/memory/hybrid-search.d.ts +9 -11
  372. package/dist/core/memory/hybrid-search.js +496 -273
  373. package/dist/core/memory/importance.d.ts +2 -24
  374. package/dist/core/memory/importance.js +7 -91
  375. package/dist/core/memory/index.d.ts +1 -0
  376. package/dist/core/memory/index.js +1 -0
  377. package/dist/core/memory/loader.d.ts +31 -0
  378. package/dist/core/memory/loader.js +141 -0
  379. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  380. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  381. package/dist/core/memory/memories.d.ts +23 -19
  382. package/dist/core/memory/memories.js +243 -228
  383. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  384. package/dist/core/memory/memory-lifecycle.js +47 -0
  385. package/dist/core/memory/migrate.d.ts +21 -0
  386. package/dist/core/memory/migrate.js +134 -0
  387. package/dist/core/memory/normalization.d.ts +7 -0
  388. package/dist/core/memory/normalization.js +26 -0
  389. package/dist/core/memory/path-strengthener.d.ts +39 -0
  390. package/dist/core/memory/path-strengthener.js +150 -0
  391. package/dist/core/memory/progressive-disclosure.js +1 -1
  392. package/dist/core/memory/query-processor.js +37 -3
  393. package/dist/core/memory/query-rewriter.js +9 -9
  394. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  395. package/dist/core/memory/retrieval-feedback.js +213 -0
  396. package/dist/core/memory/serialization.d.ts +4 -0
  397. package/dist/core/memory/serialization.js +49 -0
  398. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  399. package/dist/core/memory/stale-cleaner.js +97 -0
  400. package/dist/core/memory/stats.d.ts +15 -0
  401. package/dist/core/memory/stats.js +69 -13
  402. package/dist/core/memory/temporal-facts.js +21 -0
  403. package/dist/core/memory/trigger-detector.d.ts +8 -1
  404. package/dist/core/memory/trigger-detector.js +42 -5
  405. package/dist/core/memory/write-gate.js +1 -1
  406. package/dist/core/places/index.d.ts +14 -0
  407. package/dist/core/places/index.js +14 -0
  408. package/dist/core/places/memory-places.d.ts +68 -0
  409. package/dist/core/places/memory-places.js +261 -0
  410. package/dist/core/places/places.d.ts +88 -0
  411. package/dist/core/places/places.js +314 -0
  412. package/dist/core/places/rules.d.ts +74 -0
  413. package/dist/core/places/rules.js +240 -0
  414. package/dist/core/places/walking.d.ts +56 -0
  415. package/dist/core/places/walking.js +121 -0
  416. package/dist/core/projects.d.ts +5 -0
  417. package/dist/core/projects.js +47 -18
  418. package/dist/core/responses.d.ts +96 -0
  419. package/dist/core/responses.js +122 -0
  420. package/dist/core/runtime/trust-report.d.ts +102 -0
  421. package/dist/core/runtime/trust-report.js +107 -0
  422. package/dist/core/runtime/trust-state.d.ts +12 -0
  423. package/dist/core/runtime/trust-state.js +309 -0
  424. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  425. package/dist/core/scheduler/cron-scheduler.js +193 -10
  426. package/dist/core/scheduler/index.d.ts +1 -1
  427. package/dist/core/scheduler/index.js +1 -1
  428. package/dist/core/scheduler/job-runner.js +2 -2
  429. package/dist/core/search/conversations.js +40 -42
  430. package/dist/core/search/entities.js +6 -9
  431. package/dist/core/search/graph-boost.d.ts +7 -0
  432. package/dist/core/search/graph-boost.js +23 -0
  433. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  434. package/dist/core/search/qmd-wrapper.js +58 -0
  435. package/dist/core/security/encrypt.d.ts +6 -0
  436. package/dist/core/security/encrypt.js +47 -0
  437. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  438. package/dist/core/security/governance.js +79 -0
  439. package/dist/core/session/auto-load.js +34 -9
  440. package/dist/core/session/entity-tracker.d.ts +62 -0
  441. package/dist/core/session/entity-tracker.js +287 -0
  442. package/dist/core/session/index.d.ts +1 -1
  443. package/dist/core/session/index.js +1 -1
  444. package/dist/core/session/reference-resolver.d.ts +26 -0
  445. package/dist/core/session/reference-resolver.js +121 -0
  446. package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
  447. package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
  448. package/dist/core/session/working-set.d.ts +50 -0
  449. package/dist/core/session/working-set.js +212 -0
  450. package/dist/core/snapshots/creation.d.ts +2 -8
  451. package/dist/core/snapshots/creation.js +3 -12
  452. package/dist/core/{cache.js → storage/cache.js} +2 -2
  453. package/dist/core/utils/memory-operations.js +1 -1
  454. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  455. package/dist/core/utils/summarization-helpers.js +1 -6
  456. package/dist/core/utils/vector-operations.d.ts +71 -0
  457. package/dist/core/utils/vector-operations.js +129 -0
  458. package/dist/db/adapter.d.ts +3 -3
  459. package/dist/db/adapter.js +99 -88
  460. package/dist/db/bootstrap.d.ts +2 -0
  461. package/dist/db/bootstrap.js +921 -674
  462. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
  463. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
  464. package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
  465. package/dist/{drizzle → db/drizzle}/schema.js +192 -32
  466. package/dist/db/drizzle.config.d.ts +3 -0
  467. package/dist/db/drizzle.config.js +12 -0
  468. package/dist/db/index.d.ts +1 -5
  469. package/dist/db/index.js +51 -8
  470. package/dist/db/migrations/associations.d.ts +6 -0
  471. package/dist/db/migrations/associations.js +29 -0
  472. package/dist/db/migrations/beliefs.d.ts +10 -0
  473. package/dist/db/migrations/beliefs.js +76 -0
  474. package/dist/db/migrations/core-memory.d.ts +6 -0
  475. package/dist/db/migrations/core-memory.js +29 -0
  476. package/dist/db/migrations/fts.d.ts +6 -0
  477. package/dist/db/migrations/fts.js +52 -0
  478. package/dist/db/migrations/index.d.ts +25 -0
  479. package/dist/db/migrations/index.js +51 -0
  480. package/dist/db/migrations/indexes.d.ts +6 -0
  481. package/dist/db/migrations/indexes.js +30 -0
  482. package/dist/db/migrations/learnings.d.ts +7 -0
  483. package/dist/db/migrations/learnings.js +26 -0
  484. package/dist/db/migrations/maintenance.d.ts +6 -0
  485. package/dist/db/migrations/maintenance.js +61 -0
  486. package/dist/db/migrations/memories.d.ts +7 -0
  487. package/dist/db/migrations/memories.js +16 -0
  488. package/dist/db/migrations/memory-places.d.ts +6 -0
  489. package/dist/db/migrations/memory-places.js +29 -0
  490. package/dist/db/migrations/places.d.ts +6 -0
  491. package/dist/db/migrations/places.js +43 -0
  492. package/dist/db/migrations/projects.d.ts +3 -0
  493. package/dist/db/migrations/projects.js +13 -0
  494. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  495. package/dist/db/migrations/tier-conversion.js +20 -0
  496. package/dist/db/neon.d.ts +8 -0
  497. package/dist/db/neon.js +20 -0
  498. package/dist/db/schema/beliefs.d.ts +9 -0
  499. package/dist/db/schema/beliefs.js +46 -0
  500. package/dist/db/schema/generator.d.ts +38 -0
  501. package/dist/db/schema/generator.js +108 -0
  502. package/dist/db/schema/index.d.ts +39 -0
  503. package/dist/db/schema/index.js +51 -0
  504. package/dist/db/schema/learnings.d.ts +7 -0
  505. package/dist/db/schema/learnings.js +30 -0
  506. package/dist/db/schema/memories.d.ts +7 -0
  507. package/dist/db/schema/memories.js +81 -0
  508. package/dist/db/schema/projects.d.ts +4 -0
  509. package/dist/db/schema/projects.js +31 -0
  510. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  511. package/dist/db/schema/tables/context-sessions.js +37 -0
  512. package/dist/db/schema/tables/conversations.d.ts +9 -0
  513. package/dist/db/schema/tables/conversations.js +47 -0
  514. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  515. package/dist/db/schema/tables/core-memory.js +41 -0
  516. package/dist/db/schema/tables/entities.d.ts +9 -0
  517. package/dist/db/schema/tables/entities.js +39 -0
  518. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  519. package/dist/db/schema/tables/entity-relations.js +31 -0
  520. package/dist/db/schema/tables/learnings.d.ts +9 -0
  521. package/dist/db/schema/tables/learnings.js +66 -0
  522. package/dist/db/schema/tables/memories.d.ts +9 -0
  523. package/dist/db/schema/tables/memories.js +161 -0
  524. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  525. package/dist/db/schema/tables/memory-associations.js +39 -0
  526. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  527. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  528. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  529. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  530. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  531. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  532. package/dist/db/schema/tables/messages.d.ts +9 -0
  533. package/dist/db/schema/tables/messages.js +41 -0
  534. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  535. package/dist/db/schema/tables/namespaces.js +37 -0
  536. package/dist/db/schema/tables/projects.d.ts +9 -0
  537. package/dist/db/schema/tables/projects.js +31 -0
  538. package/dist/db/schema/tables/users.d.ts +9 -0
  539. package/dist/db/schema/tables/users.js +27 -0
  540. package/dist/db/schema.d.ts +1 -1
  541. package/dist/db/schema.js +2 -2
  542. package/dist/db/supabase.d.ts +9 -0
  543. package/dist/db/supabase.js +24 -0
  544. package/dist/packages/mcp/src/index.d.ts +3 -0
  545. package/dist/packages/mcp/src/index.js +733 -0
  546. package/mcp.json.example +8 -0
  547. package/package.json +132 -173
  548. package/packages/cli/package.json +22 -0
  549. package/packages/cli/src/commands/clean.ts +68 -0
  550. package/packages/cli/src/commands/context.ts +79 -0
  551. package/packages/cli/src/commands/doctor.ts +357 -0
  552. package/packages/cli/src/commands/forget.ts +72 -0
  553. package/packages/cli/src/commands/health.ts +36 -0
  554. package/packages/cli/src/commands/inspect.ts +41 -0
  555. package/packages/cli/src/commands/link.ts +50 -0
  556. package/packages/cli/src/commands/migrate.ts +93 -0
  557. package/packages/cli/src/commands/recall.ts +99 -0
  558. package/packages/cli/src/commands/recent.ts +57 -0
  559. package/packages/cli/src/commands/remember.ts +139 -0
  560. package/packages/cli/src/commands/run.ts +58 -0
  561. package/packages/cli/src/commands/stale.ts +43 -0
  562. package/packages/cli/src/commands/stats.ts +42 -0
  563. package/packages/cli/src/index.ts +57 -0
  564. package/packages/cli/tsconfig.json +24 -0
  565. package/packages/mcp/package.json +26 -0
  566. package/packages/mcp/src/index.ts +877 -0
  567. package/packages/mcp/tsconfig.json +20 -0
  568. package/skills/squish-memory/SKILL.md +107 -114
  569. package/skills/squish-memory/install.sh +3 -3
  570. package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
  571. package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
  572. package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
  573. package/.claude-plugin/marketplace.json +0 -20
  574. package/.claude-plugin/plugin.json +0 -32
  575. package/.env.mcp.example +0 -60
  576. package/.mcp.json +0 -11
  577. package/QUICK-START.md +0 -71
  578. package/bin/squish-add.mjs +0 -32
  579. package/bin/squish-rm.mjs +0 -21
  580. package/commands/context-paging.md +0 -51
  581. package/commands/context-status.md +0 -22
  582. package/commands/context.md +0 -5
  583. package/commands/core-memory.md +0 -56
  584. package/commands/health.md +0 -5
  585. package/commands/init.md +0 -39
  586. package/commands/merge.md +0 -113
  587. package/commands/observe.md +0 -5
  588. package/commands/recall.md +0 -5
  589. package/commands/remember.md +0 -11
  590. package/commands/search.md +0 -10
  591. package/config/mcp-cli-fallback-policy.json +0 -22
  592. package/config/mcp.json +0 -38
  593. package/config/plugin-manifest.json +0 -152
  594. package/config/plugin-manifest.schema.json +0 -244
  595. package/config/remote-memory-policy.json +0 -32
  596. package/dist/api/web/index.d.ts +0 -3
  597. package/dist/api/web/index.js +0 -4
  598. package/dist/api/web/web-server.d.ts +0 -3
  599. package/dist/api/web/web-server.js +0 -6
  600. package/dist/api/web/web.d.ts +0 -4
  601. package/dist/api/web/web.js +0 -639
  602. package/dist/commands/managed-sync.d.ts +0 -10
  603. package/dist/commands/managed-sync.js +0 -64
  604. package/dist/commands/mcp-server.d.ts +0 -3
  605. package/dist/commands/mcp-server.js +0 -393
  606. package/dist/core/context.js +0 -24
  607. package/dist/core/governance.js +0 -64
  608. package/dist/core/local-embeddings.d.ts +0 -6
  609. package/dist/core/local-embeddings.js +0 -20
  610. package/dist/core/namespaces/index.d.ts +0 -71
  611. package/dist/core/namespaces/index.js +0 -305
  612. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  613. package/dist/core/namespaces/uri-parser.js +0 -74
  614. package/dist/core/observations.d.ts +0 -26
  615. package/dist/core/observations.js +0 -110
  616. package/dist/core/requirements.d.ts +0 -20
  617. package/dist/core/requirements.js +0 -35
  618. package/dist/core/search/qmd-search.d.ts +0 -61
  619. package/dist/core/search/qmd-search.js +0 -178
  620. package/dist/core/snapshots.d.ts +0 -29
  621. package/dist/core/snapshots.js +0 -220
  622. package/dist/core/sync/qmd-sync.d.ts +0 -106
  623. package/dist/core/sync/qmd-sync.js +0 -213
  624. package/dist/core/utils.js +0 -74
  625. package/dist/index.d.ts +0 -19
  626. package/dist/index.js +0 -997
  627. package/generated/mcp/manifest.json +0 -23
  628. package/generated/mcp/mcp-servers.json +0 -25
  629. package/generated/mcp/mcporter.json +0 -34
  630. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  631. package/generated/mcp/runtime.json +0 -12
  632. package/hooks/hooks.json +0 -52
  633. package/hooks/post-tool-use.js +0 -26
  634. package/hooks/session-end.js +0 -28
  635. package/hooks/session-start.js +0 -33
  636. package/hooks/user-prompt-submit.js +0 -26
  637. package/hooks/utils.js +0 -153
  638. package/npx-installer.js +0 -208
  639. package/packages/plugin-claude-code/README.md +0 -73
  640. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  641. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  642. package/packages/plugin-claude-code/package.json +0 -31
  643. package/packages/plugin-openclaw/README.md +0 -70
  644. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  645. package/packages/plugin-openclaw/dist/index.js +0 -262
  646. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  647. package/packages/plugin-openclaw/package.json +0 -31
  648. package/packages/plugin-opencode/install.mjs +0 -217
  649. package/packages/plugin-opencode/package.json +0 -21
  650. package/plugin.json +0 -32
  651. package/scripts/build-release.sh +0 -36
  652. package/scripts/check-secrets.js +0 -132
  653. package/scripts/db/check-db.mjs +0 -88
  654. package/scripts/db/fix-all-columns.mjs +0 -52
  655. package/scripts/db/fix-schema-all.mjs +0 -55
  656. package/scripts/db/fix-schema-full.mjs +0 -46
  657. package/scripts/db/fix-schema.mjs +0 -38
  658. package/scripts/db/init-db.mjs +0 -13
  659. package/scripts/db/recreate-db.mjs +0 -14
  660. package/scripts/generate-mcp.mjs +0 -264
  661. package/scripts/github-release.sh +0 -77
  662. package/scripts/init-dirs.mjs +0 -13
  663. package/scripts/install-interactive.mjs +0 -677
  664. package/scripts/install-mcp.mjs +0 -116
  665. package/scripts/install-plugin.mjs +0 -415
  666. package/scripts/install-web.sh +0 -120
  667. package/scripts/install.mjs +0 -340
  668. package/scripts/openclaw-bootstrap.mjs +0 -127
  669. package/scripts/package-release.sh +0 -71
  670. package/scripts/remote-preflight.mjs +0 -62
  671. package/scripts/squish-fallback.mjs +0 -132
  672. package/scripts/test/test-all-systems.mjs +0 -139
  673. package/scripts/test/test-memory-system.mjs +0 -139
  674. package/scripts/test/test-v0.5.0.mjs +0 -210
  675. package/scripts/test-interactive.mjs +0 -131
  676. package/scripts/verify-mcp.mjs +0 -214
  677. package/skills/memory-guide/SKILL.md +0 -332
  678. package/skills/squish-cli/SKILL.md +0 -240
  679. package/skills/squish-mcp/SKILL.md +0 -355
  680. package/skills/squish-memory/install.mjs +0 -335
  681. package/skills/squish-memory/skill.json +0 -32
  682. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  683. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  684. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  685. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  686. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  687. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  688. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  689. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  690. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  691. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  692. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  693. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  694. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  695. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  696. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  697. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  698. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  699. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  700. /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
  701. /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
  702. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  703. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  704. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Shared utility functions for the squish codebase
3
+ */
4
+ import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
5
+ import { config } from '../../config.js';
6
+ import { toSqliteJson } from '../memory/serialization.js';
7
+ export function normalizeTimestamp(value) {
8
+ if (!value)
9
+ return null;
10
+ if (value instanceof Date)
11
+ return value.toISOString();
12
+ if (typeof value === 'number') {
13
+ try {
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;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ if (typeof value === 'string') {
34
+ try {
35
+ const parsed = new Date(value);
36
+ if (!isNaN(parsed.getTime()))
37
+ return parsed.toISOString();
38
+ return null;
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ export function now() {
47
+ return new Date().toISOString();
48
+ }
49
+ export function isDatabaseUnavailableError(error) {
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));
60
+ }
61
+ export async function withDatabaseErrorHandling(operation, errorMessage) {
62
+ try {
63
+ return await operation();
64
+ }
65
+ catch (dbError) {
66
+ if (isDatabaseUnavailableError(dbError)) {
67
+ throw new McpError(ErrorCode.InternalError, errorMessage);
68
+ }
69
+ throw dbError;
70
+ }
71
+ }
72
+ export function clampLimit(value, defaultValue, min = 1, max = 100) {
73
+ return Math.min(Math.max(value ?? defaultValue, min), max);
74
+ }
75
+ export function prepareEmbedding(embedding) {
76
+ if (config.isTeamMode) {
77
+ return { embedding: embedding ?? null };
78
+ }
79
+ return { embeddingJson: toSqliteJson(embedding ?? null) };
80
+ }
81
+ export function determineOverallStatus(dbStatus, redisOk) {
82
+ if ((dbStatus === 'ok' || dbStatus === 'unavailable') && redisOk) {
83
+ return 'ok';
84
+ }
85
+ if (dbStatus === 'unavailable') {
86
+ return 'degraded';
87
+ }
88
+ return 'error';
89
+ }
90
+ // Date parsing utilities - shared between CLI and MCP
91
+ // ============================================================================
92
+ export function parseDate(input) {
93
+ if (!input)
94
+ return null;
95
+ const now = new Date();
96
+ const lower = input.toLowerCase().trim();
97
+ // Direct date parse
98
+ const parsed = new Date(input);
99
+ if (!isNaN(parsed.getTime()))
100
+ return parsed;
101
+ // Relative parsing
102
+ const dayMatch = lower.match(/(\d+)\s*day/i);
103
+ const weekMatch = lower.match(/(\d+)\s*week/i);
104
+ const monthMatch = lower.match(/(\d+)\s*month/i);
105
+ if (lower === 'today') {
106
+ const d = new Date(now);
107
+ d.setHours(0, 0, 0, 0);
108
+ return d;
109
+ }
110
+ if (lower === 'yesterday')
111
+ return new Date(now.getTime() - 86400000);
112
+ if (lower === 'thisweek' || lower === 'this week') {
113
+ const d = new Date(now);
114
+ d.setDate(d.getDate() - d.getDay());
115
+ d.setHours(0, 0, 0, 0);
116
+ return d;
117
+ }
118
+ if (lower === 'lastweek' || lower === 'last week') {
119
+ const d = new Date(now);
120
+ d.setDate(d.getDate() - d.getDay() - 7);
121
+ return d;
122
+ }
123
+ if (dayMatch)
124
+ return new Date(now.getTime() - parseInt(dayMatch[1]) * 86400000);
125
+ if (weekMatch)
126
+ return new Date(now.getTime() - parseInt(weekMatch[1]) * 604800000);
127
+ if (monthMatch)
128
+ return new Date(now.getTime() - parseInt(monthMatch[1]) * 2592000000);
129
+ return null;
130
+ }
131
+ export function filterByDateRange(items, since, until) {
132
+ const sinceDate = parseDate(since || '');
133
+ const untilDate = parseDate(until || '');
134
+ return items.filter(item => {
135
+ if (!item.createdAt)
136
+ return true;
137
+ const created = new Date(item.createdAt);
138
+ if (sinceDate && created < sinceDate)
139
+ return false;
140
+ if (untilDate && created > untilDate)
141
+ return false;
142
+ return true;
143
+ });
144
+ }
145
+ //# sourceMappingURL=utils.js.map
@@ -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
@@ -0,0 +1,151 @@
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 function validateLimit(value, defaultValue = 20, min = 1, max = 100) {
10
+ // Handle undefined, null, empty string
11
+ if (value === undefined || value === null || value === '') {
12
+ return defaultValue;
13
+ }
14
+ // Convert string to number, truncate decimals
15
+ let num;
16
+ if (typeof value === 'string') {
17
+ const parsed = parseInt(value, 10);
18
+ if (isNaN(parsed)) {
19
+ return NaN;
20
+ }
21
+ num = parsed;
22
+ }
23
+ else {
24
+ // Truncate decimals for numbers
25
+ num = Math.trunc(value);
26
+ }
27
+ // Handle NaN
28
+ if (isNaN(num)) {
29
+ return NaN;
30
+ }
31
+ // Clamp to bounds
32
+ return Math.min(Math.max(num, min), max);
33
+ }
34
+ /**
35
+ * Parse an integer with bounds checking
36
+ */
37
+ export function parseIntBounded(value, defaultValue, min, max) {
38
+ return validateLimit(value, defaultValue, min, max);
39
+ }
40
+ /**
41
+ * Validate a project path
42
+ */
43
+ export async function validateProjectPath(path, options) {
44
+ const { createIfMissing = false, require: requireProject = false } = options || {};
45
+ // If path is undefined, throw if required or return current directory
46
+ if (path === undefined || path === '') {
47
+ if (requireProject) {
48
+ throw new Error('Project path is required');
49
+ }
50
+ return process.cwd();
51
+ }
52
+ // Resolve to absolute path
53
+ const absolutePath = path.startsWith('/') || /^[a-zA-Z]:\\/.test(path)
54
+ ? path
55
+ : path.startsWith('~')
56
+ ? path.replace(/^~/, process.env.HOME || process.env.USERPROFILE || '')
57
+ : path.startsWith('.')
58
+ ? path
59
+ : path;
60
+ // Check if project exists in database
61
+ const { getProjectByPath } = await import('../projects.js');
62
+ const existingProject = await getProjectByPath(absolutePath);
63
+ if (existingProject) {
64
+ return absolutePath;
65
+ }
66
+ // Project doesn't exist
67
+ if (requireProject) {
68
+ throw new Error(`Project not found: ${absolutePath}`);
69
+ }
70
+ if (createIfMissing) {
71
+ const { ensureProject } = await import('../projects.js');
72
+ await ensureProject(absolutePath);
73
+ return absolutePath;
74
+ }
75
+ // Return the path even if it doesn't exist in database (for non-db validation)
76
+ return absolutePath;
77
+ }
78
+ /**
79
+ * Validate a UUID
80
+ */
81
+ export function validateUuid(id) {
82
+ if (typeof id !== 'string' || !id) {
83
+ return false;
84
+ }
85
+ // UUID v4/v5 regex pattern (8-4-4-4-12 hex digits)
86
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
87
+ return uuidRegex.test(id);
88
+ }
89
+ /**
90
+ * Require a valid UUID, throws if invalid
91
+ */
92
+ export function requireUuid(id) {
93
+ if (!validateUuid(id)) {
94
+ throw new Error('Invalid UUID');
95
+ }
96
+ return id;
97
+ }
98
+ /**
99
+ * Validate a date value
100
+ *
101
+ * @param value - The date to validate (string, Date, number, or undefined)
102
+ * @returns Date object if valid, null otherwise
103
+ */
104
+ export function validateDate(value) {
105
+ if (!value) {
106
+ return null;
107
+ }
108
+ try {
109
+ let date;
110
+ if (value instanceof Date) {
111
+ date = value;
112
+ }
113
+ else if (typeof value === 'number') {
114
+ // Handle both milliseconds and seconds timestamps
115
+ if (value > 100000000000000) {
116
+ // Microseconds, convert to milliseconds
117
+ date = new Date(value / 1000);
118
+ }
119
+ else if (value > 1000000000000) {
120
+ // Milliseconds
121
+ date = new Date(value);
122
+ }
123
+ else if (value >= 0) {
124
+ // Seconds
125
+ date = new Date(value * 1000);
126
+ }
127
+ else {
128
+ return null;
129
+ }
130
+ }
131
+ else if (typeof value === 'string') {
132
+ date = new Date(value);
133
+ }
134
+ else {
135
+ return null;
136
+ }
137
+ // Check if date is valid
138
+ if (isNaN(date.getTime())) {
139
+ return null;
140
+ }
141
+ return date;
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ // Re-export normalizeTags for tag validation
148
+ export { normalizeTags };
149
+ // Re-export clampLimit for backward compatibility
150
+ export { clampLimit } from './utils.js';
151
+ //# sourceMappingURL=validation.js.map
@@ -1,6 +1,12 @@
1
1
  /**
2
2
  * Memory Lifecycle Management
3
3
  * Implements sector-based decay, tier classification, and eviction policies
4
+ *
5
+ * Decay Formula: newScore = importanceScore * (1 - decayRate/100)^days
6
+ * - decayRate: per-memory integer (e.g., 30 = 30% decay per decay cycle)
7
+ * - days: days since lastDecayAt
8
+ * - Tier demotion occurs when score drops below decayThreshold
9
+ * - Cold memories below threshold get status = 'expired'
4
10
  */
5
11
  export interface LifecycleStats {
6
12
  decayed: number;
@@ -8,9 +14,9 @@ export interface LifecycleStats {
8
14
  promoted: number;
9
15
  tierChanges: {
10
16
  hot: number;
11
- warm: number;
12
17
  cold: number;
13
18
  };
19
+ expired: number;
14
20
  }
15
21
  /**
16
22
  * Run full lifecycle maintenance on all memories
@@ -1,22 +1,46 @@
1
1
  /**
2
2
  * Memory Lifecycle Management
3
3
  * Implements sector-based decay, tier classification, and eviction policies
4
+ *
5
+ * Decay Formula: newScore = importanceScore * (1 - decayRate/100)^days
6
+ * - decayRate: per-memory integer (e.g., 30 = 30% decay per decay cycle)
7
+ * - days: days since lastDecayAt
8
+ * - Tier demotion occurs when score drops below decayThreshold
9
+ * - Cold memories below threshold get status = 'expired'
4
10
  */
5
11
  import { and, eq, lt, inArray } from 'drizzle-orm';
6
12
  import { getDb } from '../db/index.js';
7
13
  import { getSchema } from '../db/schema.js';
8
14
  import { config } from '../config.js';
9
15
  import { logger } from './logger.js';
10
- const SECTOR_DECAY_RATES = {
11
- episodic: 30,
12
- semantic: 90,
13
- procedural: 180,
14
- autobiographical: 365,
15
- working: 7,
16
+ import { triggerTierChange, triggerDecayApplied } from './memory/hooks.js';
17
+ /**
18
+ * Default decay intervals by sector (days until decay check)
19
+ * These determine how often memories in each sector are evaluated for decay
20
+ * Can be configured via config.sectorDecayIntervals
21
+ */
22
+ const SECTOR_DECAY_INTERVAL_DAYS = {
23
+ episodic: config.sectorDecayIntervals?.episodic || 30,
24
+ semantic: config.sectorDecayIntervals?.semantic || 90,
25
+ procedural: config.sectorDecayIntervals?.procedural || 180,
26
+ autobiographical: config.sectorDecayIntervals?.autobiographical || 365,
27
+ working: config.sectorDecayIntervals?.working || 7,
28
+ };
29
+ /**
30
+ * Default decay rates by memory type (percentage per decay cycle)
31
+ * Used as fallback when memory.decayRate is not set
32
+ */
33
+ const DEFAULT_DECAY_RATES = {
34
+ observation: 5,
35
+ fact: 3,
36
+ decision: 2,
37
+ context: 4,
38
+ preference: 3,
39
+ note: 5,
40
+ reflection: 2,
16
41
  };
17
42
  const TIER_THRESHOLDS = {
18
43
  hot: { recency: 7, coactivation: 10, salience: 70 },
19
- warm: { recency: 30, coactivation: 5, salience: 50 },
20
44
  cold: { recency: Infinity, coactivation: 0, salience: 0 },
21
45
  };
22
46
  /**
@@ -24,13 +48,14 @@ const TIER_THRESHOLDS = {
24
48
  */
25
49
  export async function runLifecycleMaintenance(projectId) {
26
50
  if (!config.lifecycleEnabled) {
27
- return { decayed: 0, evicted: 0, promoted: 0, tierChanges: { hot: 0, warm: 0, cold: 0 } };
51
+ return { decayed: 0, evicted: 0, promoted: 0, tierChanges: { hot: 0, cold: 0 }, expired: 0 };
28
52
  }
29
53
  const stats = {
30
54
  decayed: 0,
31
55
  evicted: 0,
32
56
  promoted: 0,
33
- tierChanges: { hot: 0, warm: 0, cold: 0 },
57
+ tierChanges: { hot: 0, cold: 0 },
58
+ expired: 0,
34
59
  };
35
60
  try {
36
61
  await applyDecay(projectId, stats);
@@ -43,34 +68,105 @@ export async function runLifecycleMaintenance(projectId) {
43
68
  return stats;
44
69
  }
45
70
  /**
46
- * Apply decay to memories based on sector
71
+ * Apply decay to memories using per-memory decay rate formula
72
+ *
73
+ * Formula: newScore = importanceScore * (1 - decayRate/100)^days
74
+ * - Uses per-memory decayRate (stored as integer percentage, e.g., 30 = 30%)
75
+ * - Calculates days since lastDecayAt
76
+ * - Demotes tier when score drops below decayThreshold
77
+ * - Sets status = 'expired' for cold memories below threshold
47
78
  */
48
79
  async function applyDecay(projectId, stats) {
49
80
  try {
50
81
  const db = await getDb();
51
82
  const schema = await getSchema();
52
83
  const now = new Date();
53
- // For each sector, apply decay
54
- for (const [sector, decayDays] of Object.entries(SECTOR_DECAY_RATES)) {
55
- const decayThreshold = new Date(now.getTime() - decayDays * 24 * 60 * 60 * 1000);
56
- // Build where clause
57
- let where;
58
- if (projectId) {
59
- where = and(eq(schema.memories.sector, sector), eq(schema.memories.projectId, projectId), lt(schema.memories.lastDecayAt, decayThreshold), eq(schema.memories.isProtected, false));
84
+ const decayThreshold = config.decayThreshold || 0.1;
85
+ // Fetch memories that need decay processing (not protected, not expired)
86
+ let whereClause;
87
+ const conditions = [
88
+ eq(schema.memories.isProtected, false),
89
+ eq(schema.memories.status, 'active'),
90
+ ];
91
+ if (projectId) {
92
+ conditions.push(eq(schema.memories.projectId, projectId));
93
+ }
94
+ whereClause = and(...conditions);
95
+ const memories = await db
96
+ .select()
97
+ .from(schema.memories)
98
+ .where(whereClause)
99
+ .limit(10000);
100
+ let decayed = 0;
101
+ let expired = 0;
102
+ const expiredIds = [];
103
+ for (const memory of memories) {
104
+ // Get decay rate for this memory (fallback to type-based default)
105
+ const decayRate = memory.decayRate || DEFAULT_DECAY_RATES[memory.type] || 5;
106
+ // Calculate days since last decay
107
+ const lastDecayAt = memory.lastDecayAt ? new Date(memory.lastDecayAt) : new Date(memory.createdAt);
108
+ const daysSinceDecay = Math.max(0, (now.getTime() - lastDecayAt.getTime()) / (24 * 60 * 60 * 1000));
109
+ // Skip if not enough time has passed for this sector
110
+ const sectorInterval = SECTOR_DECAY_INTERVAL_DAYS[memory.sector] || 30;
111
+ if (daysSinceDecay < sectorInterval) {
112
+ continue;
113
+ }
114
+ // Apply decay formula: newScore = oldScore * (1 - decayRate/100)^days
115
+ const currentScore = memory.importanceScore || memory.relevanceScore || 50;
116
+ const decayMultiplier = Math.pow(1 - decayRate / 100, daysSinceDecay / sectorInterval);
117
+ const newScore = Math.max(0, Math.round(currentScore * decayMultiplier));
118
+ // Check if memory should expire (cold tier + below threshold)
119
+ const shouldExpire = memory.tier === 'cold' && newScore < (decayThreshold * 100);
120
+ if (shouldExpire) {
121
+ expiredIds.push(memory.id);
122
+ expired++;
123
+ logger.debug('Memory expiring', { id: memory.id, score: newScore, tier: memory.tier });
60
124
  }
61
- else {
62
- where = and(eq(schema.memories.sector, sector), lt(schema.memories.lastDecayAt, decayThreshold), eq(schema.memories.isProtected, false));
125
+ else if (newScore !== currentScore) {
126
+ // Only update if score changed
127
+ await db
128
+ .update(schema.memories)
129
+ .set({
130
+ importanceScore: newScore,
131
+ relevanceScore: newScore,
132
+ lastDecayAt: now,
133
+ updatedAt: now,
134
+ })
135
+ .where(eq(schema.memories.id, memory.id));
136
+ decayed++;
137
+ // Trigger decay applied hook
138
+ try {
139
+ await triggerDecayApplied({
140
+ memoryId: memory.id,
141
+ content: memory.content,
142
+ type: memory.type,
143
+ tags: typeof memory.tags === 'string' ? memory.tags.split(',') : [],
144
+ project: memory.projectId || undefined,
145
+ source: memory.source || undefined,
146
+ tier: memory.tier,
147
+ importance: newScore,
148
+ oldScore: currentScore,
149
+ newScore: newScore,
150
+ });
151
+ }
152
+ catch (hookError) {
153
+ logger.error('Error triggering decayApplied hook', hookError);
154
+ }
63
155
  }
64
- // Decay: reduce relevance score by 10%
65
- const result = await db.update(schema.memories)
156
+ }
157
+ // Batch expire memories
158
+ if (expiredIds.length > 0) {
159
+ await db
160
+ .update(schema.memories)
66
161
  .set({
67
- relevanceScore: Math.max(0, schema.memories.relevanceScore * 0.9),
68
- lastDecayAt: now,
162
+ status: 'expired',
163
+ updatedAt: now,
69
164
  })
70
- .where(where);
71
- const rowCount = result?.rowCount || 0;
72
- stats.decayed += rowCount;
165
+ .where(inArray(schema.memories.id, expiredIds));
73
166
  }
167
+ stats.decayed += decayed;
168
+ stats.expired += expired;
169
+ logger.info('Decay applied', { decayed, expired, total: memories.length });
74
170
  }
75
171
  catch (error) {
76
172
  logger.error('Error applying decay', error);
@@ -78,7 +174,6 @@ async function applyDecay(projectId, stats) {
78
174
  }
79
175
  /**
80
176
  * Update memory tiers based on recency, coactivation, and salience
81
- * OPTIMIZED: Uses batched updates instead of individual UPDATE queries
82
177
  */
83
178
  async function updateTiers(projectId, stats) {
84
179
  try {
@@ -92,9 +187,9 @@ async function updateTiers(projectId, stats) {
92
187
  .from(schema.memories)
93
188
  .where(where)
94
189
  .limit(10000); // Process larger batches now
95
- // Calculate tiers in memory
190
+ // Calculate tiers in memory (simplified: hot or cold only)
96
191
  const tierAssignments = new Map();
97
- const tierCounts = { hot: 0, warm: 0, cold: 0 };
192
+ const tierCounts = { hot: 0, cold: 0 };
98
193
  for (const memory of memories) {
99
194
  const recencyDays = (now.getTime() - new Date(memory.createdAt).getTime()) / (24 * 60 * 60 * 1000);
100
195
  const coactivation = memory.coactivationScore || 0;
@@ -105,11 +200,6 @@ async function updateTiers(projectId, stats) {
105
200
  salience >= TIER_THRESHOLDS.hot.salience) {
106
201
  newTier = 'hot';
107
202
  }
108
- else if (recencyDays <= TIER_THRESHOLDS.warm.recency &&
109
- coactivation >= TIER_THRESHOLDS.warm.coactivation &&
110
- salience >= TIER_THRESHOLDS.warm.salience) {
111
- newTier = 'warm';
112
- }
113
203
  if (newTier !== memory.tier) {
114
204
  tierAssignments.set(memory.id, newTier);
115
205
  tierCounts[newTier]++;
@@ -121,9 +211,6 @@ async function updateTiers(projectId, stats) {
121
211
  const hotIds = Array.from(tierAssignments.entries())
122
212
  .filter(([_, tier]) => tier === 'hot')
123
213
  .map(([id]) => id);
124
- const warmIds = Array.from(tierAssignments.entries())
125
- .filter(([_, tier]) => tier === 'warm')
126
- .map(([id]) => id);
127
214
  const coldIds = Array.from(tierAssignments.entries())
128
215
  .filter(([_, tier]) => tier === 'cold')
129
216
  .map(([id]) => id);
@@ -134,11 +221,11 @@ async function updateTiers(projectId, stats) {
134
221
  .set({ tier: 'hot', updatedAt: now })
135
222
  .where(inArray(schema.memories.id, hotIds));
136
223
  }
137
- if (warmIds.length > 0) {
224
+ if (coldIds.length > 0) {
138
225
  await db
139
226
  .update(schema.memories)
140
- .set({ tier: 'warm', updatedAt: now })
141
- .where(inArray(schema.memories.id, warmIds));
227
+ .set({ tier: 'cold', updatedAt: now })
228
+ .where(inArray(schema.memories.id, coldIds));
142
229
  }
143
230
  if (coldIds.length > 0) {
144
231
  await db
@@ -146,13 +233,36 @@ async function updateTiers(projectId, stats) {
146
233
  .set({ tier: 'cold', updatedAt: now })
147
234
  .where(inArray(schema.memories.id, coldIds));
148
235
  }
236
+ // Trigger tier change hooks for each memory that changed tier
237
+ if (tierAssignments.size > 0) {
238
+ for (const memory of memories) {
239
+ const newTier = tierAssignments.get(memory.id);
240
+ if (newTier && newTier !== memory.tier) {
241
+ try {
242
+ await triggerTierChange({
243
+ memoryId: memory.id,
244
+ content: memory.content,
245
+ type: memory.type,
246
+ tags: typeof memory.tags === 'string' ? memory.tags.split(',') : [],
247
+ project: memory.projectId || undefined,
248
+ source: memory.source || undefined,
249
+ tier: newTier,
250
+ importance: memory.importanceScore || memory.relevanceScore || 50,
251
+ oldTier: memory.tier,
252
+ newTier: newTier,
253
+ });
254
+ }
255
+ catch (hookError) {
256
+ logger.error('Error triggering tierChange hook', hookError);
257
+ }
258
+ }
259
+ }
260
+ }
149
261
  // Update stats
150
262
  stats.tierChanges.hot = tierCounts.hot;
151
- stats.tierChanges.warm = tierCounts.warm;
152
263
  stats.tierChanges.cold = tierCounts.cold;
153
264
  logger.debug('Tier updates complete', {
154
265
  hot: tierCounts.hot,
155
- warm: tierCounts.warm,
156
266
  cold: tierCounts.cold,
157
267
  });
158
268
  }
@@ -6,6 +6,7 @@ declare class Logger {
6
6
  private debugEnabled;
7
7
  constructor(prefix?: string);
8
8
  private format;
9
+ private isQuiet;
9
10
  info(message: string, context?: LogContext): void;
10
11
  warn(message: string, context?: LogContext): void;
11
12
  error(message: string, error?: Error | any, context?: LogContext): void;
@@ -10,13 +10,25 @@ class Logger {
10
10
  const ctx = context ? ` ${JSON.stringify(context)}` : '';
11
11
  return `[${this.prefix}:${level}] ${message}${ctx}`;
12
12
  }
13
+ isQuiet() {
14
+ return process.env.SQUISH_QUIET === 'true' || process.env.SQUISH_QUIET === '1';
15
+ }
13
16
  info(message, context) {
17
+ if (this.isQuiet()) {
18
+ return;
19
+ }
14
20
  console.error(this.format('info', message, context));
15
21
  }
16
22
  warn(message, context) {
23
+ if (this.isQuiet()) {
24
+ return;
25
+ }
17
26
  console.error(this.format('warn', message, context));
18
27
  }
19
28
  error(message, error, context) {
29
+ if (this.isQuiet()) {
30
+ return;
31
+ }
20
32
  const errorMsg = error instanceof Error ? error.message : error;
21
33
  const ctx = { ...context, error: errorMsg };
22
34
  console.error(this.format('error', message, ctx));
@@ -25,7 +37,7 @@ class Logger {
25
37
  }
26
38
  }
27
39
  debug(message, context) {
28
- if (this.debugEnabled) {
40
+ if (this.debugEnabled && !this.isQuiet()) {
29
41
  console.error(this.format('debug', message, context));
30
42
  }
31
43
  }