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,309 @@
1
+ import { getDbClient } from '../lib/db-client.js';
2
+ import { getRecent } from '../memory/memories.js';
3
+ import { getMemoryStats } from '../memory/stats.js';
4
+ import { explainMemory } from '../memory/explain.js';
5
+ import { getLatestProjectWorkingSetSummary, getProjectSignalStats } from '../session/working-set.js';
6
+ import { getGraphStats } from '../graph/index.js';
7
+ import { getAllProjects, getProjectByPath, ensureProject } from '../projects.js';
8
+ import { getProjectPlaces } from '../places/places.js';
9
+ import { getMemoryPlace } from '../places/memory-places.js';
10
+ import { getPlace } from '../places/places.js';
11
+ import { config } from '../../config.js';
12
+ import { getBeliefsForMemory } from '../beliefs/store.js';
13
+ function isLegacyPlaceholderProject(project, currentWorkspacePath) {
14
+ const normalizedPath = project.path.trim();
15
+ if (normalizedPath === '.')
16
+ return true;
17
+ if (!currentWorkspacePath)
18
+ return false;
19
+ return normalizedPath === currentWorkspacePath && String(project.metadata?.source ?? '') === 'mcp';
20
+ }
21
+ function filterNormalOtherProjects(projects, currentProjectId, currentWorkspacePath) {
22
+ return projects.filter((candidate) => {
23
+ if (candidate.id === currentProjectId)
24
+ return false;
25
+ return !isLegacyPlaceholderProject(candidate, currentWorkspacePath);
26
+ });
27
+ }
28
+ function inferResolution(project, mode) {
29
+ if (mode !== 'inferred')
30
+ return mode;
31
+ const source = String(project.metadata?.source ?? '');
32
+ return source === 'mcp' ? 'auto-created' : 'inferred';
33
+ }
34
+ function toProjectSummary(project, mode) {
35
+ return {
36
+ id: project.id,
37
+ name: project.name,
38
+ path: project.path,
39
+ resolution: inferResolution(project, mode),
40
+ };
41
+ }
42
+ export async function resolveProjectScope(projectPath) {
43
+ const projects = await getAllProjects();
44
+ const explicitPath = projectPath?.trim();
45
+ if (explicitPath) {
46
+ let project = await getProjectByPath(explicitPath);
47
+ let resolution = 'explicit';
48
+ if (!project) {
49
+ project = await ensureProject(explicitPath);
50
+ resolution = 'auto-created';
51
+ }
52
+ if (!project) {
53
+ throw new Error(`Unable to resolve project: ${explicitPath}`);
54
+ }
55
+ return {
56
+ currentProject: toProjectSummary(project, resolution),
57
+ otherProjects: filterNormalOtherProjects(projects, project.id, explicitPath)
58
+ .map((candidate) => toProjectSummary(candidate, 'inferred')),
59
+ nextStep: null,
60
+ };
61
+ }
62
+ const cwd = process.cwd();
63
+ const cwdProject = await getProjectByPath(cwd);
64
+ if (cwdProject) {
65
+ return {
66
+ currentProject: toProjectSummary(cwdProject, 'inferred'),
67
+ otherProjects: filterNormalOtherProjects(projects, cwdProject.id, cwd)
68
+ .map((candidate) => toProjectSummary(candidate, 'inferred')),
69
+ nextStep: null,
70
+ };
71
+ }
72
+ if (projects.length === 1) {
73
+ return {
74
+ currentProject: toProjectSummary(projects[0], 'inferred'),
75
+ otherProjects: [],
76
+ nextStep: null,
77
+ };
78
+ }
79
+ const autoProject = await ensureProject(cwd);
80
+ if (!autoProject) {
81
+ throw new Error(`Unable to create project for current workspace: ${cwd}`);
82
+ }
83
+ const otherProjects = projects
84
+ .filter((candidate) => candidate.id !== autoProject.id)
85
+ .filter((candidate) => !isLegacyPlaceholderProject(candidate, cwd))
86
+ .map((candidate) => toProjectSummary(candidate, 'inferred'));
87
+ return {
88
+ currentProject: toProjectSummary(autoProject, 'auto-created'),
89
+ otherProjects,
90
+ nextStep: otherProjects.length > 0
91
+ ? 'Pass --project with the intended workspace path if this is not the project you meant.'
92
+ : null,
93
+ };
94
+ }
95
+ async function getMemoryPlaceName(memoryId) {
96
+ const placeId = await getMemoryPlace(memoryId);
97
+ if (!placeId)
98
+ return null;
99
+ const place = await getPlace(placeId);
100
+ return place?.name ?? null;
101
+ }
102
+ export async function buildContextState(projectPath, limit = 10) {
103
+ const scope = await resolveProjectScope(projectPath);
104
+ const projectPathResolved = scope.currentProject.path;
105
+ const [sessionSummary, signalSummary, graphStats, memories] = await Promise.all([
106
+ getLatestProjectWorkingSetSummary(projectPathResolved),
107
+ getProjectSignalStats(projectPathResolved),
108
+ getGraphStats(projectPathResolved),
109
+ getRecent(projectPathResolved, limit),
110
+ ]);
111
+ const project = await getProjectByPath(projectPathResolved);
112
+ const places = project ? await getProjectPlaces(project.id) : [];
113
+ const activePlaces = places.filter((place) => place.memoryCount > 0).map((place) => place.name);
114
+ const durableMemories = await Promise.all(memories.map(async (memory) => ({
115
+ id: memory.id,
116
+ type: memory.type,
117
+ content: memory.content,
118
+ place: await getMemoryPlaceName(memory.id),
119
+ })));
120
+ const beliefRows = await Promise.all(memories.map((memory) => getBeliefsForMemory(memory.id)));
121
+ const beliefs = beliefRows.flat().slice(0, 6).map((belief) => ({
122
+ type: belief.type,
123
+ statement: belief.statement,
124
+ status: belief.status,
125
+ }));
126
+ return {
127
+ currentProject: scope.currentProject,
128
+ otherProjects: scope.otherProjects,
129
+ runtime: {
130
+ sessionSummary,
131
+ activePlaces,
132
+ signalSummary: {
133
+ captured: signalSummary.captured,
134
+ suppressed: signalSummary.suppressed,
135
+ sessionOnly: signalSummary.sessionOnly,
136
+ durable: signalSummary.durable,
137
+ durableWithRaw: signalSummary.durableWithRaw,
138
+ },
139
+ graphSummary: graphStats.entityCount > 0 || graphStats.relationCount > 0
140
+ ? `enabled; ${graphStats.entityCount} entities, ${graphStats.relationCount} relations`
141
+ : 'enabled; no graph enrichments yet',
142
+ },
143
+ durableMemories,
144
+ beliefs,
145
+ nextStep: scope.nextStep,
146
+ };
147
+ }
148
+ export async function buildStatsState(projectPath) {
149
+ const scope = await resolveProjectScope(projectPath);
150
+ const projectPathResolved = scope.currentProject.path;
151
+ const [stats, graphStats, sessionSummary] = await Promise.all([
152
+ getMemoryStats(projectPathResolved),
153
+ getGraphStats(projectPathResolved),
154
+ getLatestProjectWorkingSetSummary(projectPathResolved),
155
+ ]);
156
+ const project = await getProjectByPath(projectPathResolved);
157
+ const places = project ? await getProjectPlaces(project.id) : [];
158
+ return {
159
+ currentProject: `${scope.currentProject.name} (${scope.currentProject.path})`,
160
+ totals: {
161
+ memories: stats.totalMemories,
162
+ durable: Math.max(stats.totalMemories, (stats.signal?.durable ?? 0) + (stats.signal?.durableWithRaw ?? 0)),
163
+ sessionLocal: stats.signal?.sessionOnly ?? 0,
164
+ },
165
+ signal: {
166
+ captured: stats.signal?.captured ?? 0,
167
+ suppressed: stats.signal?.suppressed ?? 0,
168
+ sessionOnly: stats.signal?.sessionOnly ?? 0,
169
+ durable: stats.signal?.durable ?? 0,
170
+ durableWithRaw: stats.signal?.durableWithRaw ?? 0,
171
+ tokensSaved: stats.signal?.tokensSaved ?? 0,
172
+ placeRouted: stats.signal?.placeRouted ?? 0,
173
+ graphEnriched: stats.signal?.graphEnriched ?? 0,
174
+ },
175
+ places: {
176
+ active: places.filter((place) => place.memoryCount > 0).length,
177
+ named: places.filter((place) => place.memoryCount > 0).map((place) => place.name),
178
+ },
179
+ graph: {
180
+ status: graphStats.entityCount > 0 || graphStats.relationCount > 0 ? 'enabled' : 'enabled (idle)',
181
+ enrichments: stats.signal?.graphEnriched ?? 0,
182
+ },
183
+ wakeUp: sessionSummary || 'No working set yet',
184
+ signalNote: stats.totalMemories > 0 && (stats.signal?.captured ?? 0) === 0
185
+ ? 'Signal counts cover capture-era writes only. Legacy durable memories may exist without signal telemetry.'
186
+ : 'Signal counts cover capture-era writes only.',
187
+ };
188
+ }
189
+ export async function buildHealthState(projectPath) {
190
+ const scope = await resolveProjectScope(projectPath);
191
+ const checks = [];
192
+ let severity = 'ok';
193
+ let nextStep = scope.nextStep;
194
+ try {
195
+ await getDbClient();
196
+ checks.push({ name: 'database', status: 'ok', detail: 'Database connection succeeded.' });
197
+ }
198
+ catch (error) {
199
+ severity = 'broken';
200
+ nextStep = 'Fix database initialization before relying on memory reads or writes.';
201
+ checks.push({
202
+ name: 'database',
203
+ status: 'broken',
204
+ detail: error?.message ?? 'Database initialization failed.',
205
+ });
206
+ }
207
+ checks.push({
208
+ name: 'project resolution',
209
+ status: 'ok',
210
+ detail: `${scope.currentProject.name} at ${scope.currentProject.path} (${scope.currentProject.resolution})`,
211
+ });
212
+ try {
213
+ await getRecent(scope.currentProject.path, 1);
214
+ checks.push({ name: 'memory write path', status: 'ok', detail: 'Memory store is readable for this project.' });
215
+ }
216
+ catch (error) {
217
+ severity = severity === 'broken' ? 'broken' : 'degraded';
218
+ nextStep = nextStep ?? 'Run `squish doctor` to repair local storage before writing memories.';
219
+ checks.push({
220
+ name: 'memory write path',
221
+ status: 'degraded',
222
+ detail: error?.message ?? 'Memory store could not be read.',
223
+ });
224
+ }
225
+ try {
226
+ const sessionSummary = await getLatestProjectWorkingSetSummary(scope.currentProject.path);
227
+ checks.push({
228
+ name: 'session working set',
229
+ status: sessionSummary ? 'ok' : 'degraded',
230
+ detail: sessionSummary || 'No compact working set has been captured yet.',
231
+ });
232
+ if (!sessionSummary && severity === 'ok') {
233
+ severity = 'degraded';
234
+ nextStep = nextStep ?? 'Run a normal session or memory write so Squish can build a working-set wake-up summary.';
235
+ }
236
+ }
237
+ catch (error) {
238
+ severity = severity === 'broken' ? 'broken' : 'degraded';
239
+ checks.push({
240
+ name: 'session working set',
241
+ status: 'degraded',
242
+ detail: error?.message ?? 'Working-set state could not be loaded.',
243
+ });
244
+ }
245
+ const project = await getProjectByPath(scope.currentProject.path);
246
+ const places = project ? await getProjectPlaces(project.id) : [];
247
+ const activePlaces = places.filter((place) => place.memoryCount > 0);
248
+ checks.push({
249
+ name: 'places',
250
+ status: activePlaces.length > 0 ? 'ok' : 'degraded',
251
+ detail: activePlaces.length > 0
252
+ ? `${activePlaces.length} active places: ${activePlaces.map((place) => place.name).join(', ')}`
253
+ : 'No populated places yet.',
254
+ });
255
+ if (activePlaces.length === 0 && severity === 'ok') {
256
+ severity = 'degraded';
257
+ nextStep = nextStep ?? 'Store or recall project memories to populate place routing.';
258
+ }
259
+ const graphStats = await getGraphStats(scope.currentProject.path);
260
+ checks.push({
261
+ name: 'graph',
262
+ status: graphStats.entityCount > 0 || graphStats.relationCount > 0 ? 'ok' : 'degraded',
263
+ detail: graphStats.entityCount > 0 || graphStats.relationCount > 0
264
+ ? `${graphStats.entityCount} entities and ${graphStats.relationCount} relations available.`
265
+ : 'Graph is enabled but has no extracted entities yet.',
266
+ });
267
+ if (graphStats.entityCount === 0 && graphStats.relationCount === 0 && severity === 'ok') {
268
+ severity = 'degraded';
269
+ nextStep = nextStep ?? 'Write or recall durable memories so graph enrichment has material to process.';
270
+ }
271
+ checks.push({
272
+ name: 'mode',
273
+ status: 'ok',
274
+ detail: `${config.isManagedMode ? 'managed' : 'local'} mode; embeddings ${config.embeddingsProvider}`,
275
+ });
276
+ return {
277
+ severity,
278
+ currentProject: `${scope.currentProject.name} (${scope.currentProject.path})`,
279
+ checks,
280
+ nextStep,
281
+ };
282
+ }
283
+ export async function buildInspectState(id) {
284
+ const inspection = await explainMemory(id);
285
+ if (!inspection)
286
+ return null;
287
+ return {
288
+ id: inspection.id,
289
+ classification: inspection.classification,
290
+ storageReason: inspection.reasons.join('; ') || 'Stored as durable memory.',
291
+ durability: inspection.classification === 'session-only' ? 'session-only' : 'durable',
292
+ place: inspection.place ?? null,
293
+ placeType: inspection.placeType ?? null,
294
+ graphStatus: inspection.graphStatus ?? null,
295
+ rawFallback: inspection.rawFallbackSnapshotId ?? null,
296
+ wakeUpPriority: inspection.nuanceSuppressed ? 'high' : 'normal',
297
+ metadataAvailability: inspection.legacyMetadata
298
+ ? 'Legacy durable record; signal-era metadata is unavailable.'
299
+ : 'Signal metadata available.',
300
+ beliefs: (inspection.beliefs ?? []).map((belief) => ({
301
+ id: belief.id,
302
+ type: belief.type,
303
+ statement: belief.statement,
304
+ status: belief.status,
305
+ confidence: belief.confidence,
306
+ })),
307
+ };
308
+ }
309
+ //# sourceMappingURL=trust-state.js.map
@@ -1,5 +1,5 @@
1
1
  /** Cron Scheduler - Persistent cron-based job scheduling with fallback support */
2
- export type JobType = 'nightly' | 'weekly' | 'hourly';
2
+ export type JobType = 'nightly' | 'weekly' | 'hourly' | 'daily';
3
3
  export type JobStatus = 'success' | 'failed' | 'skipped';
4
4
  export interface ScheduledJob {
5
5
  id: string;
@@ -1,19 +1,102 @@
1
1
  /** Cron Scheduler - Persistent cron-based job scheduling with fallback support */
2
2
  import cron from 'node-cron';
3
- import { selfIterationHandler } from '../session-hooks/self-iteration-job.js';
3
+ import { selfIterationHandler } from '../session/self-iteration-job.js';
4
+ import { runLifecycleMaintenance } from '../lifecycle.js';
4
5
  import { logger } from '../logger.js';
5
6
  import { config } from '../../config.js';
6
7
  import { getDb } from '../../db/index.js';
7
- import { maintenanceJobs, maintenanceJobHistory } from '../../drizzle/schema-sqlite.js';
8
+ import { maintenanceJobs, maintenanceJobHistory } from '../../db/drizzle/schema-sqlite.js';
8
9
  import { eq } from 'drizzle-orm';
9
10
  const jobHandlers = new Map();
10
- const activeTasks = new Map();
11
+ const activeTasks = new Map(); // node-cron ScheduledTask type
12
+ // Job interval by type (in ms) - used for catch-up detection
13
+ const JOB_INTERVALS = {
14
+ hourly: 60 * 60 * 1000, // 1 hour
15
+ daily: 24 * 60 * 60 * 1000, // 24 hours
16
+ nightly: 24 * 60 * 60 * 1000, // 24 hours (same as daily)
17
+ weekly: 7 * 24 * 60 * 60 * 1000, // 7 days
18
+ };
11
19
  export function registerJobHandler(jobName, handler) {
12
20
  jobHandlers.set(jobName, handler);
13
21
  logger.info(`[Scheduler] Registered handler for job: ${jobName}`);
14
22
  }
15
23
  // Register self-iteration job handler
16
24
  registerJobHandler('self_iteration', selfIterationHandler);
25
+ // Decay job handler - runs lifecycle maintenance (decay, tier updates, eviction)
26
+ const decayHandler = async (context) => {
27
+ const stats = await runLifecycleMaintenance();
28
+ return {
29
+ recordsProcessed: stats.decayed + stats.expired + stats.evicted,
30
+ summary: {
31
+ decayed: stats.decayed,
32
+ expired: stats.expired,
33
+ evicted: stats.evicted,
34
+ tierChanges: stats.tierChanges,
35
+ },
36
+ };
37
+ };
38
+ registerJobHandler('decay_maintenance', decayHandler);
39
+ // Belief decay handler - applies confidence decay to beliefs
40
+ const beliefDecayHandler = async (context) => {
41
+ const { applyBeliefDecay } = await import('../beliefs/decay.js');
42
+ const stats = await applyBeliefDecay();
43
+ return {
44
+ recordsProcessed: stats.decayed + stats.sourceCountUpdated,
45
+ summary: {
46
+ beliefDecayed: stats.decayed,
47
+ sourceCountUpdated: stats.sourceCountUpdated,
48
+ errors: stats.errors,
49
+ },
50
+ };
51
+ };
52
+ registerJobHandler('belief_decay', beliefDecayHandler);
53
+ // Auto-clean handler - deletes stale memories automatically
54
+ const autoCleanHandler = async (context) => {
55
+ const { getStaleMemories, deleteMemoryPermanently } = await import('../memory/stale-cleaner.js');
56
+ const { getAllProjects } = await import('../projects.js');
57
+ const jobConfig = context.config;
58
+ if (jobConfig.enabled === false) {
59
+ return { recordsProcessed: 0, summary: { skipped: true, reason: 'auto-clean disabled' } };
60
+ }
61
+ const olderThanDays = jobConfig.olderThanDays || 30;
62
+ const confidenceLevels = jobConfig.confidenceLevel || ['outdated', 'speculative'];
63
+ const minImportance = jobConfig.minImportance || 40;
64
+ const dryRun = jobConfig.dryRun !== undefined ? jobConfig.dryRun : false; // Default to actual delete for safety
65
+ const projects = await getAllProjects();
66
+ let totalStale = 0;
67
+ let totalDeleted = 0;
68
+ for (const project of projects) {
69
+ const stale = await getStaleMemories({
70
+ olderThanDays,
71
+ confidenceLevels,
72
+ minImportance,
73
+ projectId: project.id,
74
+ });
75
+ totalStale += stale.length;
76
+ if (dryRun) {
77
+ logger.info(`[AutoClean] Would delete ${stale.length} stale memories in ${project.path}`);
78
+ }
79
+ else {
80
+ for (const memory of stale) {
81
+ if (!memory.isPinned) {
82
+ await deleteMemoryPermanently(memory.id);
83
+ totalDeleted++;
84
+ }
85
+ }
86
+ logger.info(`[AutoClean] Deleted ${stale.length} stale memories in ${project.path}`);
87
+ }
88
+ }
89
+ return {
90
+ recordsProcessed: dryRun ? totalStale : totalDeleted,
91
+ summary: {
92
+ mode: dryRun ? 'dry-run' : 'deleted',
93
+ projectsScanned: projects.length,
94
+ memoriesAffected: dryRun ? totalStale : totalDeleted,
95
+ criteria: { olderThanDays, confidenceLevels, minImportance },
96
+ },
97
+ };
98
+ };
99
+ registerJobHandler('auto_clean', autoCleanHandler);
17
100
  export async function initializeScheduler() {
18
101
  if (!config.cronEnabled) {
19
102
  logger.info('[Scheduler] Cron scheduling disabled, using heartbeat fallback');
@@ -26,6 +109,8 @@ export async function initializeScheduler() {
26
109
  }
27
110
  try {
28
111
  await ensureDefaultJobs(db);
112
+ // Check for missed jobs (catch-up after machine wake from sleep)
113
+ await checkMissedJobs();
29
114
  const sqliteDb = db;
30
115
  const jobs = await sqliteDb
31
116
  .select()
@@ -40,8 +125,94 @@ export async function initializeScheduler() {
40
125
  logger.error('[Scheduler] Failed to initialize:', error);
41
126
  }
42
127
  }
128
+ /**
129
+ * Check for missed jobs and execute catch-up if needed
130
+ * Called on scheduler initialization (including after machine wake from sleep)
131
+ */
132
+ async function checkMissedJobs() {
133
+ try {
134
+ const db = await getDb();
135
+ if (!db)
136
+ return;
137
+ const sqliteDb = db;
138
+ const jobs = await sqliteDb
139
+ .select()
140
+ .from(maintenanceJobs)
141
+ .where(eq(maintenanceJobs.enabled, true));
142
+ const now = Date.now();
143
+ for (const job of jobs) {
144
+ const intervalMs = JOB_INTERVALS[job.jobType];
145
+ if (!intervalMs)
146
+ continue;
147
+ const lastRun = job.lastRunAt ? new Date(job.lastRunAt).getTime() : 0;
148
+ const elapsed = lastRun > 0 ? now - lastRun : intervalMs * 2; // If never run, treat as overdue
149
+ const gracePeriod = intervalMs * 1.5; // 1.5x interval grace
150
+ if (elapsed > gracePeriod) {
151
+ logger.info(`[Scheduler] Catch-up needed for ${job.jobName}, elapsed ${Math.round(elapsed / (60 * 60 * 1000))}h (grace: ${Math.round(gracePeriod / (60 * 60 * 1000))}h)`);
152
+ // Execute catch-up
153
+ const handler = jobHandlers.get(job.jobName);
154
+ if (handler) {
155
+ try {
156
+ const startedAt = new Date();
157
+ const context = {
158
+ jobId: job.id,
159
+ jobName: job.jobName,
160
+ jobType: job.jobType,
161
+ config: typeof job.jobConfig === 'string'
162
+ ? JSON.parse(job.jobConfig)
163
+ : job.jobConfig ?? {},
164
+ startedAt,
165
+ };
166
+ await handler(context);
167
+ // Record successful catch-up run
168
+ const completedAt = new Date();
169
+ await sqliteDb
170
+ .update(maintenanceJobs)
171
+ .set({
172
+ lastRunAt: completedAt,
173
+ lastRunStatus: 'success',
174
+ lastRunDuration: completedAt.getTime() - startedAt.getTime(),
175
+ })
176
+ .where(eq(maintenanceJobs.id, job.id));
177
+ logger.info(`[Scheduler] Catch-up completed for ${job.jobName}`);
178
+ }
179
+ catch (catchError) {
180
+ const msg = catchError instanceof Error ? catchError.message : String(catchError);
181
+ logger.error(`[Scheduler] Catch-up failed for ${job.jobName}:`, msg);
182
+ await sqliteDb
183
+ .update(maintenanceJobs)
184
+ .set({
185
+ lastRunAt: new Date(),
186
+ lastRunStatus: 'failed',
187
+ lastRunError: msg,
188
+ })
189
+ .where(eq(maintenanceJobs.id, job.id));
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ catch (error) {
196
+ const msg = error instanceof Error ? error.message : String(error);
197
+ logger.error('[Scheduler] Error checking missed jobs:', msg);
198
+ }
199
+ }
43
200
  async function ensureDefaultJobs(db) {
44
201
  const defaultJobs = [
202
+ {
203
+ jobName: 'decay_maintenance',
204
+ jobType: 'hourly',
205
+ cronExpression: '0 * * * *', // Run every hour at :00
206
+ enabled: true,
207
+ jobConfig: { applyDecay: true, updateTiers: true, evictOld: true },
208
+ },
209
+ {
210
+ jobName: 'belief_decay',
211
+ jobType: 'daily',
212
+ cronExpression: '0 4 * * *', // Run daily at 4 AM
213
+ enabled: true,
214
+ jobConfig: { applyBeliefDecay: true },
215
+ },
45
216
  {
46
217
  jobName: 'nightly_maintenance',
47
218
  jobType: 'nightly',
@@ -63,6 +234,19 @@ async function ensureDefaultJobs(db) {
63
234
  enabled: true,
64
235
  jobConfig: { minMessageCount: 5, maxMessagesToProcess: 50 },
65
236
  },
237
+ {
238
+ jobName: 'auto_clean',
239
+ jobType: 'daily',
240
+ cronExpression: '0 3 * * *', // Run daily at 3 AM
241
+ enabled: true,
242
+ jobConfig: {
243
+ enabled: true,
244
+ olderThanDays: 30,
245
+ confidenceLevel: ['outdated', 'speculative'],
246
+ minImportance: 40,
247
+ dryRun: true, // Start with dry-run for safety
248
+ },
249
+ },
66
250
  ];
67
251
  for (const job of defaultJobs) {
68
252
  let existing;
@@ -110,12 +294,12 @@ async function ensureDefaultJobs(db) {
110
294
  logger.warn(`[Scheduler] Drizzle insert failed, using raw SQL: ${insertError.message}`);
111
295
  const rawDb = db.$client;
112
296
  if (rawDb && typeof rawDb.prepare === 'function') {
113
- const stmt = rawDb.prepare(`
114
- INSERT INTO maintenance_jobs
115
- (id, job_name, job_type, cron_expression, enabled, job_config,
116
- total_runs, success_count, failure_count, last_run_at, next_run_at,
117
- last_run_duration, last_run_status, last_run_error)
118
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
297
+ const stmt = rawDb.prepare(`
298
+ INSERT INTO maintenance_jobs
299
+ (id, job_name, job_type, cron_expression, enabled, job_config,
300
+ total_runs, success_count, failure_count, last_run_at, next_run_at,
301
+ last_run_duration, last_run_status, last_run_error)
302
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
119
303
  `);
120
304
  stmt.run(crypto.randomUUID(), job.jobName, job.jobType, job.cronExpression, job.enabled ? 1 : 0, JSON.stringify(job.jobConfig), 0, 0, 0, null, null, null, null, null);
121
305
  }
@@ -145,7 +329,6 @@ export async function scheduleJob(job) {
145
329
  const task = cron.schedule(job.cronExpression, async () => {
146
330
  await executeJob(job);
147
331
  }, {
148
- scheduled: true,
149
332
  timezone: 'UTC',
150
333
  });
151
334
  activeTasks.set(job.jobName, task);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Scheduler Module
3
- * v0.10.0 - Cron-based job scheduling with heartbeat fallback
3
+ * Cron-based job scheduling with heartbeat fallback
4
4
  */
5
5
  export * from './cron-scheduler.js';
6
6
  export * from './heartbeat.js';
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Scheduler Module
3
- * v0.10.0 - Cron-based job scheduling with heartbeat fallback
3
+ * Cron-based job scheduling with heartbeat fallback
4
4
  */
5
5
  export * from './cron-scheduler.js';
6
6
  export * from './heartbeat.js';
@@ -5,7 +5,7 @@ import { runLifecycleMaintenance } from '../lifecycle.js';
5
5
  import { pruneWeakAssociations } from '../associations.js';
6
6
  import { pruneOldSummaries } from '../summarization.js';
7
7
  import { getDb } from '../../db/index.js';
8
- import { memories, memoryFeedback } from '../../drizzle/schema-sqlite.js';
8
+ import { memories, memoryFeedback } from '../../db/drizzle/schema-sqlite.js';
9
9
  import { eq, and, gt, lt } from 'drizzle-orm';
10
10
  export async function runNightlyJob(context) {
11
11
  const summary = {};
@@ -15,8 +15,8 @@ export async function runNightlyJob(context) {
15
15
  try {
16
16
  const lifecycleResult = await runLifecycleMaintenance();
17
17
  summary.decayApplied = lifecycleResult?.decayed || 0;
18
+ // Simplified: hot/cold only (warm removed)
18
19
  summary.tiersUpdated = (lifecycleResult?.tierChanges?.hot || 0) +
19
- (lifecycleResult?.tierChanges?.warm || 0) +
20
20
  (lifecycleResult?.tierChanges?.cold || 0);
21
21
  recordsProcessed += summary.decayApplied;
22
22
  recordsProcessed += summary.tiersUpdated;