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,288 @@
1
+ /**
2
+ * Write Gate Enforcement
3
+ * Validates memories before writing to ensure quality, security, and consistency
4
+ * Integrates secret detection, trigger detection, and content validation
5
+ */
6
+
7
+ import { detectSecrets, redactSecrets, SecretMatch } from '../security/secret-detector.js';
8
+ import { detectMemorySignals, MemorySignals } from './trigger-detector.js';
9
+ import { resolveContradictions } from './contradiction-resolver.js';
10
+ import { supersedeOldTemporalFacts } from './temporal-facts.js';
11
+ import { logger } from '../logger.js';
12
+
13
+ export interface WriteGateResult {
14
+ allowed: boolean;
15
+ sanitized: boolean;
16
+ warnings: string[];
17
+ errors: string[];
18
+ metadata: {
19
+ secretsDetected: number;
20
+ signals: MemorySignals | null;
21
+ contradictions: {
22
+ found: boolean;
23
+ count: number;
24
+ };
25
+ temporalSupersession: {
26
+ count: number;
27
+ };
28
+ };
29
+ sanitizedContent?: string;
30
+ }
31
+
32
+ export interface WriteGateOptions {
33
+ allowSecrets?: boolean; // If true, redact but allow write
34
+ minContentLength?: number;
35
+ maxContentLength?: number;
36
+ projectId?: string;
37
+ skipContradictionCheck?: boolean;
38
+ skipTemporalSupersession?: boolean;
39
+ }
40
+
41
+ const DEFAULT_OPTIONS: WriteGateOptions = {
42
+ allowSecrets: false,
43
+ minContentLength: 5,
44
+ maxContentLength: 50000,
45
+ skipContradictionCheck: false,
46
+ skipTemporalSupersession: false,
47
+ };
48
+
49
+ /**
50
+ * Main write gate function - validates and sanitizes content before write
51
+ */
52
+ export async function enforceWriteGate(
53
+ content: string,
54
+ type: string,
55
+ options: WriteGateOptions = {}
56
+ ): Promise<WriteGateResult> {
57
+ const opts = { ...DEFAULT_OPTIONS, ...options };
58
+ const result: WriteGateResult = {
59
+ allowed: true,
60
+ sanitized: false,
61
+ warnings: [],
62
+ errors: [],
63
+ metadata: {
64
+ secretsDetected: 0,
65
+ signals: null,
66
+ contradictions: { found: false, count: 0 },
67
+ temporalSupersession: { count: 0 },
68
+ },
69
+ };
70
+
71
+ let processedContent = content;
72
+
73
+ // 1. Content length validation
74
+ if (content.length < opts.minContentLength!) {
75
+ result.errors.push(`Content too short (min ${opts.minContentLength} characters)`);
76
+ result.allowed = false;
77
+ return result;
78
+ }
79
+
80
+ if (content.length > opts.maxContentLength!) {
81
+ result.errors.push(`Content too long (max ${opts.maxContentLength} characters)`);
82
+ result.allowed = false;
83
+ return result;
84
+ }
85
+
86
+ // 2. Secret detection
87
+ const secrets = detectSecrets(content, 'high');
88
+ result.metadata.secretsDetected = secrets.length;
89
+
90
+ if (secrets.length > 0) {
91
+ const secretTypes = [...new Set(secrets.map(s => s.type))];
92
+
93
+ if (!opts.allowSecrets) {
94
+ result.errors.push(`Potential secrets detected: ${secretTypes.join(', ')}`);
95
+ result.warnings.push('Content contains sensitive data that must be redacted');
96
+ result.allowed = false;
97
+ return result;
98
+ } else {
99
+ // Redact secrets but allow write
100
+ processedContent = redactSecrets(content);
101
+ result.sanitized = true;
102
+ result.sanitizedContent = processedContent;
103
+ result.warnings.push(`Redacted ${secrets.length} potential secrets: ${secretTypes.join(', ')}`);
104
+ }
105
+ }
106
+
107
+ // 3. Memory signals detection
108
+ const signals = detectMemorySignals(content);
109
+ result.metadata.signals = signals;
110
+
111
+ // Add warnings for high-priority signals
112
+ if (signals.priority === 'high') {
113
+ result.warnings.push('High-priority memory signal detected');
114
+ }
115
+
116
+ if (signals.implicit.correction) {
117
+ result.warnings.push('Content appears to be a correction - contradiction check recommended');
118
+ }
119
+
120
+ // 4. Contradiction detection (async, non-blocking for write)
121
+ if (!opts.skipContradictionCheck && signals.implicit.correction) {
122
+ try {
123
+ const contradictionResult = await resolveContradictions(
124
+ processedContent,
125
+ type,
126
+ opts.projectId
127
+ );
128
+
129
+ result.metadata.contradictions = {
130
+ found: contradictionResult.supersededIds.length > 0,
131
+ count: contradictionResult.supersededIds.length,
132
+ };
133
+
134
+ if (contradictionResult.supersededIds.length > 0) {
135
+ result.warnings.push(
136
+ `This memory supersedes ${contradictionResult.supersededIds.length} older memories`
137
+ );
138
+ }
139
+ } catch (error) {
140
+ logger.error('Contradiction check failed', error);
141
+ result.warnings.push('Contradiction check failed - proceeding with write');
142
+ }
143
+ }
144
+
145
+ // 5. Temporal fact handling
146
+ if (!opts.skipTemporalSupersession) {
147
+ try {
148
+ // This would be done after the memory is actually written, but we note it here
149
+ result.metadata.temporalSupersession = { count: 0 };
150
+ } catch (error) {
151
+ logger.error('Temporal check failed', error);
152
+ }
153
+ }
154
+
155
+ // 6. Content quality checks
156
+ const qualityIssues = checkContentQuality(processedContent);
157
+ result.warnings.push(...qualityIssues);
158
+
159
+ return result;
160
+ }
161
+
162
+ /**
163
+ * Quick validation without async operations
164
+ * Use for fast pre-check before full validation
165
+ */
166
+ export function quickValidate(content: string): {
167
+ valid: boolean;
168
+ errors: string[];
169
+ } {
170
+ const errors: string[] = [];
171
+
172
+ // Check for empty or whitespace-only content
173
+ if (!content || content.trim().length === 0) {
174
+ errors.push('Content is empty');
175
+ return { valid: false, errors };
176
+ }
177
+
178
+ // Check for minimum length
179
+ if (content.trim().length < 5) {
180
+ errors.push('Content is too short');
181
+ }
182
+
183
+ // Check for obvious secrets (high confidence only)
184
+ const secrets = detectSecrets(content, 'high');
185
+ if (secrets.length > 0) {
186
+ errors.push(`Content contains ${secrets.length} potential secrets`);
187
+ }
188
+
189
+ return { valid: errors.length === 0, errors };
190
+ }
191
+
192
+ /**
193
+ * Check content quality and return warnings
194
+ */
195
+ function checkContentQuality(content: string): string[] {
196
+ const warnings: string[] = [];
197
+
198
+ // Check for excessive repetition
199
+ const words = content.toLowerCase().split(/\s+/);
200
+ const wordCounts = new Map<string, number>();
201
+
202
+ for (const word of words) {
203
+ if (word.length > 3) { // Only check meaningful words
204
+ wordCounts.set(word, (wordCounts.get(word) || 0) + 1);
205
+ }
206
+ }
207
+
208
+ for (const [word, count] of wordCounts.entries()) {
209
+ if (count > 10) {
210
+ warnings.push(`Excessive repetition detected: "${word}" appears ${count} times`);
211
+ break; // Only report one
212
+ }
213
+ }
214
+
215
+ // Check for very long lines (might be code or minified content)
216
+ const lines = content.split('\n');
217
+ for (const line of lines) {
218
+ if (line.length > 1000) {
219
+ warnings.push('Content contains very long lines - may not be human-readable');
220
+ break;
221
+ }
222
+ }
223
+
224
+ // Check for binary-like content
225
+ const binaryPattern = /[\x00-\x08\x0E-\x1F]/;
226
+ if (binaryPattern.test(content)) {
227
+ warnings.push('Content may contain binary data');
228
+ }
229
+
230
+ return warnings;
231
+ }
232
+
233
+ /**
234
+ * Sanitize content for storage
235
+ * Redacts secrets and normalizes whitespace
236
+ */
237
+ export function sanitizeForStorage(content: string): string {
238
+ // Redact secrets
239
+ let sanitized = redactSecrets(content);
240
+
241
+ // Normalize excessive whitespace
242
+ sanitized = sanitized.replace(/\n{3,}/g, '\n\n');
243
+ sanitized = sanitized.replace(/ {2,}/g, ' ');
244
+
245
+ // Trim
246
+ sanitized = sanitized.trim();
247
+
248
+ return sanitized;
249
+ }
250
+
251
+ /**
252
+ * Calculate a quality score for content (0-100)
253
+ */
254
+ export function calculateContentQualityScore(content: string): number {
255
+ let score = 100;
256
+
257
+ // Deduct for short content
258
+ if (content.length < 20) {
259
+ score -= 30;
260
+ } else if (content.length < 50) {
261
+ score -= 15;
262
+ }
263
+
264
+ // Deduct for secrets
265
+ const secrets = detectSecrets(content, 'high');
266
+ score -= secrets.length * 20;
267
+
268
+ // Deduct for repetition
269
+ const words = content.toLowerCase().split(/\s+/);
270
+ const uniqueWords = new Set(words.filter(w => w.length > 3));
271
+ const repetitionRatio = uniqueWords.size / Math.max(1, words.length);
272
+ if (repetitionRatio < 0.3) {
273
+ score -= 20;
274
+ }
275
+
276
+ // Bonus for structure (sentences, punctuation)
277
+ const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 0);
278
+ if (sentences.length > 1) {
279
+ score += 10;
280
+ }
281
+
282
+ // Bonus for reasonable length
283
+ if (content.length >= 50 && content.length <= 2000) {
284
+ score += 5;
285
+ }
286
+
287
+ return Math.max(0, Math.min(100, score));
288
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Places Module - Spatial memory organization
3
+ *
4
+ * Exports:
5
+ * - places.ts: CRUD operations for places
6
+ * - rules.ts: Auto-assignment rules engine
7
+ * - memory-places.ts: Memory-to-place assignments
8
+ * - walking.ts: Sequential walking through places
9
+ */
10
+
11
+ export * from './places.js';
12
+ export * from './rules.js';
13
+ export * from './memory-places.js';
14
+ export * from './walking.js';
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Memory-Place Assignments - Assign memories to places
3
+ *
4
+ * Handles the assignment of memories to places, both:
5
+ * - Auto-assignment via rules
6
+ * - Manual assignment by users
7
+ */
8
+
9
+ import { randomUUID } from 'crypto';
10
+ import { eq, and } from 'drizzle-orm';
11
+ import { getDb } from '../../db/index.js';
12
+ import { getSchema } from '../../db/schema.js';
13
+ import { logger } from '../logger.js';
14
+ import { getPlaceByType, updatePlaceMemoryCount } from './places.js';
15
+ import { findMatchingPlace } from './rules.js';
16
+ import type { PlaceType } from './places.js';
17
+
18
+ /**
19
+ * Assign a memory to a place (auto or manual)
20
+ */
21
+ export async function assignMemoryToPlace(params: {
22
+ memoryId: string;
23
+ placeId: string;
24
+ isManual?: boolean;
25
+ ruleId?: string;
26
+ }): Promise<boolean> {
27
+ const db = await getDb();
28
+ if (!db) return false;
29
+
30
+ const schema = await getSchema();
31
+ const sqliteDb = db as any;
32
+ const id = randomUUID();
33
+
34
+ // Check if already assigned
35
+ const existing = await sqliteDb.select()
36
+ .from(schema.memoryPlaces)
37
+ .where(eq(schema.memoryPlaces.memoryId, params.memoryId))
38
+ .limit(1);
39
+
40
+ if (existing.length > 0) {
41
+ // Update existing
42
+ await sqliteDb.update(schema.memoryPlaces)
43
+ .set({
44
+ placeId: params.placeId,
45
+ isManual: params.isManual ? 1 : 0,
46
+ ruleId: params.ruleId || null,
47
+ })
48
+ .where(eq(schema.memoryPlaces.memoryId, params.memoryId));
49
+ } else {
50
+ // Insert new
51
+ await sqliteDb.insert(schema.memoryPlaces).values({
52
+ id,
53
+ memoryId: params.memoryId,
54
+ placeId: params.placeId,
55
+ isManual: params.isManual ? 1 : 0,
56
+ ruleId: params.ruleId || null,
57
+ });
58
+ }
59
+
60
+ // Update memory's place reference
61
+ await sqliteDb.update(schema.memories)
62
+ .set({ placeId: params.placeId })
63
+ .where(eq(schema.memories.id, params.memoryId));
64
+
65
+ // Update place memory count
66
+ await updatePlaceMemoryCount(params.placeId);
67
+
68
+ logger.info(`[MemoryPlaces] Assigned memory ${params.memoryId} to place ${params.placeId}`);
69
+ return true;
70
+ }
71
+
72
+ /**
73
+ * Auto-assign a memory based on rules
74
+ */
75
+ export async function autoAssignMemory(params: {
76
+ memoryId: string;
77
+ projectId: string;
78
+ toolName?: string;
79
+ content?: string;
80
+ tags?: string[];
81
+ memoryType?: string;
82
+ }): Promise<{ assigned: boolean; placeId?: string; placeType?: PlaceType }> {
83
+ const { memoryId, projectId, toolName, content, tags, memoryType } = params;
84
+
85
+ // Find matching place via rules
86
+ const placeType = await findMatchingPlace(projectId, {
87
+ toolName,
88
+ content,
89
+ tags,
90
+ memoryType,
91
+ });
92
+
93
+ if (!placeType) {
94
+ logger.info(`[MemoryPlaces] No matching rule for memory ${memoryId}`);
95
+ return { assigned: false };
96
+ }
97
+
98
+ // Get the place
99
+ const place = await getPlaceByType(projectId, placeType);
100
+ if (!place) {
101
+ logger.warn(`[MemoryPlaces] Place not found: ${placeType}`);
102
+ return { assigned: false };
103
+ }
104
+
105
+ // Assign
106
+ const success = await assignMemoryToPlace({
107
+ memoryId,
108
+ placeId: place.id,
109
+ isManual: false,
110
+ });
111
+
112
+ return {
113
+ assigned: success,
114
+ placeId: place.id,
115
+ placeType,
116
+ };
117
+ }
118
+
119
+ /**
120
+ * Manually assign a memory to a place
121
+ */
122
+ export async function manualAssignMemory(params: {
123
+ memoryId: string;
124
+ projectId: string;
125
+ placeType: PlaceType;
126
+ }): Promise<boolean> {
127
+ const { memoryId, projectId, placeType } = params;
128
+
129
+ // Get the place by type
130
+ const place = await getPlaceByType(projectId, placeType);
131
+ if (!place) {
132
+ logger.warn(`[MemoryPlaces] Place not found: ${placeType}`);
133
+ return false;
134
+ }
135
+
136
+ return assignMemoryToPlace({
137
+ memoryId,
138
+ placeId: place.id,
139
+ isManual: true,
140
+ });
141
+ }
142
+
143
+ /**
144
+ * Get place for a memory
145
+ */
146
+ export async function getMemoryPlace(memoryId: string): Promise<string | null> {
147
+ const db = await getDb();
148
+ if (!db) return null;
149
+
150
+ const schema = await getSchema();
151
+ const sqliteDb = db as any;
152
+
153
+ const result = await sqliteDb.select()
154
+ .from(schema.memoryPlaces)
155
+ .where(eq(schema.memoryPlaces.memoryId, memoryId))
156
+ .limit(1);
157
+
158
+ return result.length > 0 ? result[0].place_id : null;
159
+ }
160
+
161
+ /**
162
+ * Get memories for a place
163
+ */
164
+ export async function getPlaceMemories(placeId: string, limit: number = 50): Promise<string[]> {
165
+ const db = await getDb();
166
+ if (!db) return [];
167
+
168
+ const schema = await getSchema();
169
+ const sqliteDb = db as any;
170
+
171
+ const results = await sqliteDb.select({ memoryId: schema.memoryPlaces.memoryId })
172
+ .from(schema.memoryPlaces)
173
+ .where(eq(schema.memoryPlaces.placeId, placeId))
174
+ .limit(limit);
175
+
176
+ return results.map((r: any) => r.memoryId);
177
+ }
178
+
179
+ /**
180
+ * Remove memory from place
181
+ */
182
+ export async function removeMemoryFromPlace(memoryId: string): Promise<boolean> {
183
+ const db = await getDb();
184
+ if (!db) return false;
185
+
186
+ const schema = await getSchema();
187
+ const sqliteDb = db as any;
188
+
189
+ // Get the place before deleting
190
+ const existing = await sqliteDb.select()
191
+ .from(schema.memoryPlaces)
192
+ .where(eq(schema.memoryPlaces.memoryId, memoryId))
193
+ .limit(1);
194
+
195
+ if (existing.length > 0) {
196
+ const oldPlaceId = existing[0].place_id;
197
+
198
+ // Delete assignment
199
+ await sqliteDb.delete(schema.memoryPlaces)
200
+ .where(eq(schema.memoryPlaces.memoryId, memoryId));
201
+
202
+ // Clear memory's place reference
203
+ await sqliteDb.update(schema.memories)
204
+ .set({ placeId: null })
205
+ .where(eq(schema.memories.id, memoryId));
206
+
207
+ // Update old place memory count
208
+ await updatePlaceMemoryCount(oldPlaceId);
209
+
210
+ logger.info(`[MemoryPlaces] Removed memory ${memoryId} from place ${oldPlaceId}`);
211
+ }
212
+
213
+ return true;
214
+ }
215
+
216
+ /**
217
+ * Initialize memory-place for a project (ensures all memories without places get assigned)
218
+ */
219
+ export async function initializeProjectPlaces(projectId: string): Promise<{
220
+ initialized: number;
221
+ assigned: number;
222
+ }> {
223
+ const db = await getDb();
224
+ if (!db) return { initialized: 0, assigned: 0 };
225
+
226
+ const schema = await getSchema();
227
+ const sqliteDb = db as any;
228
+
229
+ // Get all memories without a place_id
230
+ const memoriesWithoutPlace = await sqliteDb.select({ id: schema.memories.id })
231
+ .from(schema.memories)
232
+ .where(and(
233
+ eq(schema.memories.projectId, projectId),
234
+ ));
235
+
236
+ let assigned = 0;
237
+
238
+ for (const mem of memoriesWithoutPlace) {
239
+ const result = await autoAssignMemory({
240
+ memoryId: mem.id,
241
+ projectId,
242
+ memoryType: 'observation',
243
+ });
244
+
245
+ if (result.assigned) assigned++;
246
+ }
247
+
248
+ logger.info(`[MemoryPlaces] Initialized places for project ${projectId}: ${assigned} assigned`);
249
+ return { initialized: memoriesWithoutPlace.length, assigned };
250
+ }
251
+
252
+ /**
253
+ * Auto-archive old memories - move memories > 30 days from active places to Archive
254
+ * Keeps active places lean and organized
255
+ */
256
+ export async function autoArchiveOldMemories(projectId: string, daysOld: number = 30): Promise<{
257
+ archived: number;
258
+ failed: number;
259
+ }> {
260
+ const db = await getDb();
261
+ if (!db) return { archived: 0, failed: 0 };
262
+
263
+ const schema = await getSchema();
264
+ const sqliteDb = db as any;
265
+
266
+ // Get the Archive place
267
+ const archivePlace = await getPlaceByType(projectId, 'archive');
268
+ if (!archivePlace) {
269
+ logger.warn(`[MemoryPlaces] Archive place not found for project ${projectId}`);
270
+ return { archived: 0, failed: 0 };
271
+ }
272
+
273
+ // Calculate cutoff date (Unix timestamp for SQLite)
274
+ const cutoffDate = new Date();
275
+ cutoffDate.setDate(cutoffDate.getDate() - daysOld);
276
+ const cutoffTimestamp = Math.floor(cutoffDate.getTime() / 1000);
277
+
278
+ // Get all active place IDs (not archive)
279
+ const allPlaces = await sqliteDb.select()
280
+ .from(schema.places)
281
+ .where(eq(schema.places.projectId, projectId));
282
+
283
+ const activePlaceIds = allPlaces
284
+ .filter((p: any) => p.place_type !== 'archive')
285
+ .map((p: any) => p.id);
286
+
287
+ if (activePlaceIds.length === 0) {
288
+ return { archived: 0, failed: 0 };
289
+ }
290
+
291
+ // Find memories in active places that are older than cutoff
292
+ // Use raw SQL for complex date comparison
293
+ const oldMemories = await sqliteDb.select({
294
+ memoryId: schema.memories.id,
295
+ placeId: schema.memoryPlaces.placeId,
296
+ createdAt: schema.memories.createdAt,
297
+ })
298
+ .from(schema.memories)
299
+ .innerJoin(schema.memoryPlaces, eq(schema.memories.id, schema.memoryPlaces.memoryId))
300
+ .where(
301
+ and(
302
+ eq(schema.memories.projectId, projectId),
303
+ // Memories in active places (not archive)
304
+ )
305
+ );
306
+
307
+ // Actually filter in JS for simplicity
308
+ const memoriesToArchive = oldMemories.filter((m: any) =>
309
+ activePlaceIds.includes(m.placeId) && m.createdAt < cutoffTimestamp
310
+ );
311
+
312
+ let archived = 0;
313
+ let failed = 0;
314
+
315
+ for (const mem of memoriesToArchive) {
316
+ try {
317
+ // Move to archive place
318
+ await sqliteDb.update(schema.memoryPlaces)
319
+ .set({ placeId: archivePlace.id })
320
+ .where(eq(schema.memoryPlaces.memoryId, mem.memoryId));
321
+
322
+ // Update the old place's memory count
323
+ await updatePlaceMemoryCount(mem.placeId);
324
+
325
+ archived++;
326
+ } catch (e) {
327
+ logger.warn(`[MemoryPlaces] Failed to archive memory ${mem.memoryId}: ${e}`);
328
+ failed++;
329
+ }
330
+ }
331
+
332
+ // Update archive place memory count
333
+ if (archived > 0) {
334
+ await updatePlaceMemoryCount(archivePlace.id);
335
+ logger.info(`[MemoryPlaces] Archived ${archived} old memories to Archive place`);
336
+ }
337
+
338
+ return { archived, failed };
339
+ }