squish-memory 1.1.5 → 1.2.1

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 (646) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  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 +44 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  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/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
  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/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  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/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
  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/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
  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/{dist/core/places/index.js → core/places/index.ts} +12 -12
  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 +590 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
  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/{dist/core/search/index.js → core/search/index.ts} +4 -5
  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/{dist/core/session/index.js → core/session/index.ts} +7 -7
  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/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
  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/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
  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/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +333 -0
  187. package/db/adapter.ts +215 -0
  188. package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
  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/mcp.json.example +8 -11
  220. package/package.json +140 -159
  221. package/packages/cli/package.json +22 -0
  222. package/packages/cli/src/commands/clean.ts +68 -0
  223. package/packages/cli/src/commands/context.ts +79 -0
  224. package/packages/cli/src/commands/doctor.ts +357 -0
  225. package/packages/cli/src/commands/forget.ts +72 -0
  226. package/packages/cli/src/commands/health.ts +36 -0
  227. package/packages/cli/src/commands/inspect.ts +41 -0
  228. package/packages/cli/src/commands/link.ts +50 -0
  229. package/packages/cli/src/commands/migrate.ts +93 -0
  230. package/packages/cli/src/commands/recall.ts +99 -0
  231. package/packages/cli/src/commands/recent.ts +57 -0
  232. package/packages/cli/src/commands/remember.ts +139 -0
  233. package/packages/cli/src/commands/run.ts +58 -0
  234. package/packages/cli/src/commands/stale.ts +43 -0
  235. package/packages/cli/src/commands/stats.ts +42 -0
  236. package/packages/cli/src/index.ts +57 -0
  237. package/packages/cli/tsconfig.json +24 -0
  238. package/packages/mcp/package.json +26 -0
  239. package/packages/mcp/src/index.ts +940 -0
  240. package/packages/mcp/tsconfig.json +20 -0
  241. package/skills/squish-memory/SKILL.md +38 -35
  242. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  243. package/skills/squish-memory/references/claude-desktop.json +12 -0
  244. package/skills/squish-memory/references/openclaw.json +13 -0
  245. package/skills/squish-memory/references/opencode.json +14 -0
  246. package/config/hooks/claude-code-hooks.json +0 -39
  247. package/config/hooks/cursor-hooks.json +0 -30
  248. package/config/hooks/opencode-hooks.json +0 -30
  249. package/config/hooks/windsurf-hooks.json +0 -30
  250. package/config/mcp-cli-fallback-policy.json +0 -22
  251. package/config/mcp.json +0 -38
  252. package/config/plugin-manifest.json +0 -101
  253. package/config/plugin-manifest.schema.json +0 -244
  254. package/config/plugin.json +0 -32
  255. package/config/remote-memory-policy.json +0 -32
  256. package/core/commands/context-paging.md +0 -51
  257. package/core/commands/context-status.md +0 -22
  258. package/core/commands/context.md +0 -5
  259. package/core/commands/core-memory.md +0 -56
  260. package/core/commands/health.md +0 -5
  261. package/core/commands/init.md +0 -39
  262. package/core/commands/merge.md +0 -113
  263. package/core/commands/recall.md +0 -5
  264. package/core/commands/remember.md +0 -11
  265. package/core/commands/search.md +0 -10
  266. package/dist/config.d.ts +0 -83
  267. package/dist/config.js +0 -242
  268. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  269. package/dist/core/adapters/config/claude-code.js +0 -113
  270. package/dist/core/adapters/config/cursor.d.ts +0 -26
  271. package/dist/core/adapters/config/cursor.js +0 -74
  272. package/dist/core/adapters/config/opencode.d.ts +0 -23
  273. package/dist/core/adapters/config/opencode.js +0 -73
  274. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  275. package/dist/core/adapters/config/windsurf.js +0 -74
  276. package/dist/core/adapters/index.d.ts +0 -45
  277. package/dist/core/adapters/index.js +0 -84
  278. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  279. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  280. package/dist/core/adapters/timeline.d.ts +0 -23
  281. package/dist/core/adapters/timeline.js +0 -88
  282. package/dist/core/adapters/types.d.ts +0 -157
  283. package/dist/core/adapters/types.js +0 -50
  284. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  285. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  286. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  287. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  288. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  289. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  290. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  291. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  292. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  293. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  294. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  295. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  296. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  297. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  298. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  299. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  300. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  301. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  302. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  303. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  304. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  305. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  306. package/dist/core/algorithms/index.d.ts +0 -21
  307. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  308. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  309. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
  310. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  311. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  312. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  313. package/dist/core/algorithms/types.d.ts +0 -133
  314. package/dist/core/algorithms/types.js +0 -5
  315. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  316. package/dist/core/algorithms/utils/response-builder.js +0 -37
  317. package/dist/core/associations.d.ts +0 -31
  318. package/dist/core/associations.js +0 -248
  319. package/dist/core/autosave.d.ts +0 -19
  320. package/dist/core/autosave.js +0 -16
  321. package/dist/core/commands/managed-sync.d.ts +0 -10
  322. package/dist/core/commands/managed-sync.js +0 -64
  323. package/dist/core/commands/mcp-server.d.ts +0 -3
  324. package/dist/core/commands/mcp-server.js +0 -739
  325. package/dist/core/consolidation.d.ts +0 -37
  326. package/dist/core/consolidation.js +0 -248
  327. package/dist/core/context/agent-context.d.ts +0 -106
  328. package/dist/core/context/agent-context.js +0 -274
  329. package/dist/core/context/context-paging.d.ts +0 -80
  330. package/dist/core/context/context-paging.js +0 -328
  331. package/dist/core/context/context-window.d.ts +0 -40
  332. package/dist/core/context/context-window.js +0 -177
  333. package/dist/core/context/context.d.ts +0 -7
  334. package/dist/core/context/context.js +0 -22
  335. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  336. package/dist/core/embeddings/google-multimodal.js +0 -142
  337. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  338. package/dist/core/embeddings/qmd-client.js +0 -403
  339. package/dist/core/embeddings.d.ts +0 -29
  340. package/dist/core/embeddings.js +0 -454
  341. package/dist/core/error-handling.d.ts +0 -63
  342. package/dist/core/error-handling.js +0 -173
  343. package/dist/core/external-folder/index.d.ts +0 -102
  344. package/dist/core/external-folder/index.js +0 -294
  345. package/dist/core/hooks/agent-hooks.d.ts +0 -74
  346. package/dist/core/hooks/agent-hooks.js +0 -244
  347. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  348. package/dist/core/hooks/auto-tagger.js +0 -155
  349. package/dist/core/hooks/capture-filter.d.ts +0 -41
  350. package/dist/core/hooks/capture-filter.js +0 -128
  351. package/dist/core/index.d.ts +0 -10
  352. package/dist/core/index.js +0 -14
  353. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  354. package/dist/core/ingestion/agent-memory.js +0 -109
  355. package/dist/core/ingestion/core-memory.d.ts +0 -78
  356. package/dist/core/ingestion/core-memory.js +0 -226
  357. package/dist/core/ingestion/learnings.d.ts +0 -57
  358. package/dist/core/ingestion/learnings.js +0 -202
  359. package/dist/core/layers/generator.d.ts +0 -25
  360. package/dist/core/layers/generator.js +0 -76
  361. package/dist/core/lib/db-client.js +0 -130
  362. package/dist/core/lib/schemas.d.ts +0 -129
  363. package/dist/core/lib/utils.d.ts +0 -14
  364. package/dist/core/lib/utils.js +0 -90
  365. package/dist/core/lib/validation.d.ts +0 -38
  366. package/dist/core/lib/validation.js +0 -151
  367. package/dist/core/lifecycle.d.ts +0 -26
  368. package/dist/core/lifecycle.js +0 -302
  369. package/dist/core/local-embeddings.d.ts +0 -11
  370. package/dist/core/logger.d.ts +0 -16
  371. package/dist/core/logger.js +0 -40
  372. package/dist/core/mcp/client.d.ts +0 -17
  373. package/dist/core/mcp/client.js +0 -101
  374. package/dist/core/mcp/index.d.ts +0 -6
  375. package/dist/core/mcp/index.js +0 -6
  376. package/dist/core/mcp/server.d.ts +0 -18
  377. package/dist/core/mcp/server.js +0 -157
  378. package/dist/core/mcp/standalone-server.d.ts +0 -13
  379. package/dist/core/mcp/standalone-server.js +0 -46
  380. package/dist/core/mcp/tools.d.ts +0 -9
  381. package/dist/core/mcp/tools.js +0 -365
  382. package/dist/core/mcp/types.d.ts +0 -315
  383. package/dist/core/mcp/types.js +0 -48
  384. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  385. package/dist/core/memory/bridge-discovery.js +0 -291
  386. package/dist/core/memory/categorizer.d.ts +0 -27
  387. package/dist/core/memory/categorizer.js +0 -305
  388. package/dist/core/memory/conflict-detector.d.ts +0 -7
  389. package/dist/core/memory/conflict-detector.js +0 -43
  390. package/dist/core/memory/consolidation.d.ts +0 -42
  391. package/dist/core/memory/consolidation.js +0 -303
  392. package/dist/core/memory/context-collector.d.ts +0 -10
  393. package/dist/core/memory/context-collector.js +0 -56
  394. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  395. package/dist/core/memory/contradiction-resolver.js +0 -368
  396. package/dist/core/memory/edit-workflow.d.ts +0 -19
  397. package/dist/core/memory/edit-workflow.js +0 -120
  398. package/dist/core/memory/entity-extractor.d.ts +0 -33
  399. package/dist/core/memory/entity-extractor.js +0 -336
  400. package/dist/core/memory/entity-resolver.d.ts +0 -23
  401. package/dist/core/memory/entity-resolver.js +0 -64
  402. package/dist/core/memory/fact-extractor.d.ts +0 -24
  403. package/dist/core/memory/fact-extractor.js +0 -89
  404. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  405. package/dist/core/memory/feedback-tracker.js +0 -155
  406. package/dist/core/memory/hooks.d.ts +0 -88
  407. package/dist/core/memory/hooks.js +0 -174
  408. package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
  409. package/dist/core/memory/hybrid-retrieval.js +0 -139
  410. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  411. package/dist/core/memory/hybrid-scorer.js +0 -284
  412. package/dist/core/memory/hybrid-search.d.ts +0 -20
  413. package/dist/core/memory/hybrid-search.js +0 -359
  414. package/dist/core/memory/importance.d.ts +0 -63
  415. package/dist/core/memory/importance.js +0 -298
  416. package/dist/core/memory/index.d.ts +0 -8
  417. package/dist/core/memory/loader.d.ts +0 -31
  418. package/dist/core/memory/loader.js +0 -141
  419. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  420. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  421. package/dist/core/memory/memories.d.ts +0 -47
  422. package/dist/core/memory/memories.js +0 -449
  423. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  424. package/dist/core/memory/memory-lifecycle.js +0 -55
  425. package/dist/core/memory/memory-manager.d.ts +0 -15
  426. package/dist/core/memory/memory-manager.js +0 -46
  427. package/dist/core/memory/migrate.d.ts +0 -21
  428. package/dist/core/memory/migrate.js +0 -134
  429. package/dist/core/memory/normalization.d.ts +0 -22
  430. package/dist/core/memory/normalization.js +0 -26
  431. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  432. package/dist/core/memory/progressive-disclosure.js +0 -280
  433. package/dist/core/memory/query-processor.d.ts +0 -21
  434. package/dist/core/memory/query-processor.js +0 -72
  435. package/dist/core/memory/query-rewriter.d.ts +0 -13
  436. package/dist/core/memory/query-rewriter.js +0 -118
  437. package/dist/core/memory/response-analyzer.d.ts +0 -9
  438. package/dist/core/memory/response-analyzer.js +0 -61
  439. package/dist/core/memory/serialization.d.ts +0 -10
  440. package/dist/core/memory/serialization.js +0 -84
  441. package/dist/core/memory/stats.d.ts +0 -22
  442. package/dist/core/memory/stats.js +0 -138
  443. package/dist/core/memory/telemetry.d.ts +0 -69
  444. package/dist/core/memory/telemetry.js +0 -313
  445. package/dist/core/memory/temporal-facts.d.ts +0 -41
  446. package/dist/core/memory/temporal-facts.js +0 -283
  447. package/dist/core/memory/temporal-parser.d.ts +0 -32
  448. package/dist/core/memory/temporal-parser.js +0 -385
  449. package/dist/core/memory/trigger-detector.d.ts +0 -14
  450. package/dist/core/memory/trigger-detector.js +0 -42
  451. package/dist/core/memory/write-gate.d.ts +0 -54
  452. package/dist/core/memory/write-gate.js +0 -210
  453. package/dist/core/namespaces/index.d.ts +0 -71
  454. package/dist/core/namespaces/index.js +0 -305
  455. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  456. package/dist/core/namespaces/uri-parser.js +0 -74
  457. package/dist/core/obsidian-vault.d.ts +0 -30
  458. package/dist/core/obsidian-vault.js +0 -94
  459. package/dist/core/places/index.d.ts +0 -14
  460. package/dist/core/places/memory-places.d.ts +0 -68
  461. package/dist/core/places/memory-places.js +0 -261
  462. package/dist/core/places/places.d.ts +0 -88
  463. package/dist/core/places/places.js +0 -314
  464. package/dist/core/places/rules.d.ts +0 -74
  465. package/dist/core/places/rules.js +0 -240
  466. package/dist/core/places/walking.d.ts +0 -56
  467. package/dist/core/places/walking.js +0 -121
  468. package/dist/core/projects.d.ts +0 -17
  469. package/dist/core/projects.js +0 -108
  470. package/dist/core/redis.d.ts +0 -11
  471. package/dist/core/redis.js +0 -69
  472. package/dist/core/responses.d.ts +0 -96
  473. package/dist/core/responses.js +0 -122
  474. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  475. package/dist/core/scheduler/cron-scheduler.js +0 -332
  476. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  477. package/dist/core/scheduler/heartbeat.js +0 -73
  478. package/dist/core/scheduler/index.d.ts +0 -8
  479. package/dist/core/scheduler/job-runner.d.ts +0 -11
  480. package/dist/core/scheduler/job-runner.js +0 -164
  481. package/dist/core/search/conversations.d.ts +0 -25
  482. package/dist/core/search/conversations.js +0 -110
  483. package/dist/core/search/entities.d.ts +0 -12
  484. package/dist/core/search/entities.js +0 -31
  485. package/dist/core/search/folder-context.d.ts +0 -25
  486. package/dist/core/search/folder-context.js +0 -119
  487. package/dist/core/search/graph-boost.d.ts +0 -7
  488. package/dist/core/search/graph-boost.js +0 -23
  489. package/dist/core/search/index.d.ts +0 -4
  490. package/dist/core/search/qmd-search.d.ts +0 -61
  491. package/dist/core/search/qmd-search.js +0 -178
  492. package/dist/core/security/encrypt.d.ts +0 -6
  493. package/dist/core/security/encrypt.js +0 -47
  494. package/dist/core/security/governance.d.ts +0 -26
  495. package/dist/core/security/governance.js +0 -79
  496. package/dist/core/security/privacy.d.ts +0 -23
  497. package/dist/core/security/privacy.js +0 -82
  498. package/dist/core/security/secret-detector.d.ts +0 -32
  499. package/dist/core/security/secret-detector.js +0 -88
  500. package/dist/core/session/auto-load.d.ts +0 -6
  501. package/dist/core/session/auto-load.js +0 -119
  502. package/dist/core/session/index.d.ts +0 -7
  503. package/dist/core/session/self-iteration-job.d.ts +0 -20
  504. package/dist/core/session/self-iteration-job.js +0 -282
  505. package/dist/core/session/session-hooks.d.ts +0 -18
  506. package/dist/core/session/session-hooks.js +0 -58
  507. package/dist/core/session/types.d.ts +0 -26
  508. package/dist/core/session/types.js +0 -10
  509. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  510. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  511. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  512. package/dist/core/session-hooks/session-hooks.js +0 -58
  513. package/dist/core/snapshots/cleanup.d.ts +0 -9
  514. package/dist/core/snapshots/comparison.d.ts +0 -19
  515. package/dist/core/snapshots/comparison.js +0 -43
  516. package/dist/core/snapshots/creation.d.ts +0 -19
  517. package/dist/core/snapshots/creation.js +0 -126
  518. package/dist/core/snapshots/retrieval.d.ts +0 -7
  519. package/dist/core/snapshots/retrieval.js +0 -41
  520. package/dist/core/snapshots/stats.d.ts +0 -11
  521. package/dist/core/snapshots/stats.js +0 -52
  522. package/dist/core/snapshots.d.ts +0 -29
  523. package/dist/core/snapshots.js +0 -220
  524. package/dist/core/storage/cache.d.ts +0 -13
  525. package/dist/core/storage/cache.js +0 -202
  526. package/dist/core/storage/database.d.ts +0 -12
  527. package/dist/core/storage/database.js +0 -12
  528. package/dist/core/summarization/cleanup.d.ts +0 -9
  529. package/dist/core/summarization/queries.d.ts +0 -9
  530. package/dist/core/summarization/queries.js +0 -28
  531. package/dist/core/summarization/stats.d.ts +0 -14
  532. package/dist/core/summarization/stats.js +0 -52
  533. package/dist/core/summarization/strategies.d.ts +0 -24
  534. package/dist/core/summarization/strategies.js +0 -28
  535. package/dist/core/summarization.d.ts +0 -37
  536. package/dist/core/summarization.js +0 -188
  537. package/dist/core/sync/qmd-sync.d.ts +0 -94
  538. package/dist/core/sync/qmd-sync.js +0 -201
  539. package/dist/core/temporal-facts.d.ts +0 -54
  540. package/dist/core/temporal-facts.js +0 -193
  541. package/dist/core/toon.d.ts +0 -43
  542. package/dist/core/toon.js +0 -160
  543. package/dist/core/tracing/collector.d.ts +0 -111
  544. package/dist/core/tracing/collector.js +0 -350
  545. package/dist/core/tracing/visualizer.d.ts +0 -32
  546. package/dist/core/tracing/visualizer.js +0 -165
  547. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  548. package/dist/core/utils/cleanup-operations.js +0 -44
  549. package/dist/core/utils/content-extraction.d.ts +0 -19
  550. package/dist/core/utils/content-extraction.js +0 -75
  551. package/dist/core/utils/filter-builder.d.ts +0 -13
  552. package/dist/core/utils/filter-builder.js +0 -44
  553. package/dist/core/utils/history-traversal.d.ts +0 -13
  554. package/dist/core/utils/history-traversal.js +0 -50
  555. package/dist/core/utils/memory-operations.d.ts +0 -17
  556. package/dist/core/utils/memory-operations.js +0 -43
  557. package/dist/core/utils/query-operations.d.ts +0 -18
  558. package/dist/core/utils/query-operations.js +0 -65
  559. package/dist/core/utils/summarization-helpers.d.ts +0 -21
  560. package/dist/core/utils/summarization-helpers.js +0 -38
  561. package/dist/core/utils/temporal-queries.d.ts +0 -13
  562. package/dist/core/utils/temporal-queries.js +0 -27
  563. package/dist/core/utils/vector-operations.d.ts +0 -71
  564. package/dist/core/utils/version-management.d.ts +0 -9
  565. package/dist/core/utils/version-management.js +0 -61
  566. package/dist/core/worker.d.ts +0 -82
  567. package/dist/core/worker.js +0 -272
  568. package/dist/db/adapter.d.ts +0 -7
  569. package/dist/db/adapter.js +0 -175
  570. package/dist/db/bootstrap.d.ts +0 -9
  571. package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
  572. package/dist/db/drizzle/schema-sqlite.js +0 -684
  573. package/dist/db/drizzle/schema.d.ts +0 -4082
  574. package/dist/db/drizzle/schema.js +0 -770
  575. package/dist/db/drizzle.config.d.ts +0 -3
  576. package/dist/db/drizzle.config.js +0 -12
  577. package/dist/db/index.d.ts +0 -7
  578. package/dist/db/index.js +0 -89
  579. package/dist/db/neon.d.ts +0 -8
  580. package/dist/db/neon.js +0 -20
  581. package/dist/db/schema/index.d.ts +0 -40
  582. package/dist/db/schema/index.js +0 -105
  583. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  584. package/dist/db/schema/tables/context-sessions.js +0 -37
  585. package/dist/db/schema/tables/conversations.d.ts +0 -9
  586. package/dist/db/schema/tables/conversations.js +0 -47
  587. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  588. package/dist/db/schema/tables/core-memory.js +0 -41
  589. package/dist/db/schema/tables/entities.d.ts +0 -9
  590. package/dist/db/schema/tables/entities.js +0 -39
  591. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  592. package/dist/db/schema/tables/entity-relations.js +0 -31
  593. package/dist/db/schema/tables/learnings.d.ts +0 -9
  594. package/dist/db/schema/tables/learnings.js +0 -66
  595. package/dist/db/schema/tables/memories.d.ts +0 -9
  596. package/dist/db/schema/tables/memories.js +0 -161
  597. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  598. package/dist/db/schema/tables/memory-associations.js +0 -39
  599. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  600. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  601. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  602. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  603. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  604. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  605. package/dist/db/schema/tables/messages.d.ts +0 -9
  606. package/dist/db/schema/tables/messages.js +0 -41
  607. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  608. package/dist/db/schema/tables/namespaces.js +0 -37
  609. package/dist/db/schema/tables/projects.d.ts +0 -9
  610. package/dist/db/schema/tables/projects.js +0 -31
  611. package/dist/db/schema/tables/users.d.ts +0 -9
  612. package/dist/db/schema/tables/users.js +0 -27
  613. package/dist/db/schema.d.ts +0 -3
  614. package/dist/db/schema.js +0 -11
  615. package/dist/db/supabase.d.ts +0 -9
  616. package/dist/db/supabase.js +0 -24
  617. package/dist/index.d.ts +0 -7
  618. package/dist/index.js +0 -1677
  619. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  620. package/dist/webui/server.d.ts +0 -5
  621. package/dist/webui/server.js +0 -642
  622. package/generated/mcp/manifest.json +0 -23
  623. package/generated/mcp/mcp-servers.json +0 -25
  624. package/generated/mcp/mcporter.json +0 -34
  625. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  626. package/generated/mcp/runtime.json +0 -12
  627. package/scripts/README.md +0 -60
  628. package/scripts/build-release.sh +0 -36
  629. package/scripts/check-secrets.js +0 -132
  630. package/scripts/copy-runtime-assets.mjs +0 -26
  631. package/scripts/generate-mcp.mjs +0 -264
  632. package/scripts/github-release.sh +0 -77
  633. package/scripts/init-dirs.mjs +0 -13
  634. package/scripts/install-claude-code.sh +0 -85
  635. package/scripts/install-cursor.sh +0 -56
  636. package/scripts/install-hooks.sh +0 -73
  637. package/scripts/install-interactive.mjs +0 -357
  638. package/scripts/install-opencode.sh +0 -75
  639. package/scripts/install-plugin.mjs +0 -415
  640. package/scripts/install-windsurf.sh +0 -67
  641. package/scripts/remote-preflight.mjs +0 -62
  642. package/scripts/squish-fallback.mjs +0 -132
  643. package/scripts/test-interactive.mjs +0 -131
  644. package/scripts/verify-mcp.mjs +0 -214
  645. package/skills/squish-memory/scripts/install.mjs +0 -335
  646. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,449 @@
1
+ /**
2
+ * Context Paging Service - Agent-controlled memory loading
3
+ * Allows agents to load/evict memories from working set
4
+ */
5
+
6
+ import { eq, and, inArray } from 'drizzle-orm';
7
+ import { sql } from 'drizzle-orm';
8
+ import { getMemory } from '../memory/memories.js';
9
+ import { getDbClient } from '../lib/db-client.js';
10
+
11
+ interface LoadedMemory {
12
+ id: string;
13
+ type: string;
14
+ content: string;
15
+ contentPreview: string;
16
+ loadedAt: Date;
17
+ }
18
+
19
+ /**
20
+ * Initialize or get a context session
21
+ * Simplified - just tracks what's loaded, not tokens (Claude manages its own context)
22
+ */
23
+ export async function initializeContextSession(
24
+ sessionId: string,
25
+ projectId: string,
26
+ userId?: string
27
+ ): Promise<void> {
28
+ const { db, schema } = await getDbClient();
29
+ const { contextSessions } = schema;
30
+
31
+ // Check if session exists
32
+ const existing = await db
33
+ .select()
34
+ .from(contextSessions)
35
+ .where(eq(contextSessions.sessionId, sessionId))
36
+ .limit(1);
37
+
38
+ if (existing.length === 0) {
39
+ await db.insert(contextSessions).values({
40
+ sessionId,
41
+ projectId: projectId as any,
42
+ userId: userId || null,
43
+ loadedMemoryIds: JSON.stringify([]) as any,
44
+ tokenBudget: 8000,
45
+ tokensUsed: 0,
46
+ coreMemoryTokens: 0,
47
+ loadedMemoriesTokens: 0,
48
+ metadata: JSON.stringify({}) as any,
49
+ } as any);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Load a memory into working set
55
+ */
56
+ export async function loadMemoryToContext(
57
+ sessionId: string,
58
+ memoryId: string
59
+ ): Promise<{
60
+ success: boolean;
61
+ message?: string;
62
+ memory?: LoadedMemory;
63
+ }> {
64
+ const { db, schema } = await getDbClient();
65
+ const { contextSessions } = schema;
66
+
67
+ // Get session
68
+ const session = await db
69
+ .select()
70
+ .from(contextSessions)
71
+ .where(eq(contextSessions.sessionId, sessionId))
72
+ .limit(1);
73
+
74
+ if (session.length === 0) {
75
+ return {
76
+ success: false,
77
+ message: `Session "${sessionId}" not found. Initialize session first.`,
78
+ };
79
+ }
80
+
81
+ const currentSession = session[0];
82
+ const loadedIds = (currentSession.loadedMemoryIds as string[]) || [];
83
+
84
+ // Check if already loaded
85
+ if (loadedIds.includes(memoryId)) {
86
+ return {
87
+ success: false,
88
+ message: `Memory "${memoryId}" is already in working set`,
89
+ };
90
+ }
91
+
92
+ // Get memory
93
+ const memory = await getMemory(memoryId);
94
+ if (!memory) {
95
+ return {
96
+ success: false,
97
+ message: `Memory "${memoryId}" not found`,
98
+ };
99
+ }
100
+
101
+ // Update session
102
+ const newLoadedIds = [...loadedIds, memoryId];
103
+ await db
104
+ .update(contextSessions)
105
+ .set({
106
+ loadedMemoryIds: newLoadedIds as any,
107
+ updatedAt: new Date() as any,
108
+ } as any)
109
+ .where(eq(contextSessions.sessionId, sessionId));
110
+
111
+ // Also update memory's contextStatus to 'in-context'
112
+ await db
113
+ .update(schema.memories as any)
114
+ .set({
115
+ contextStatus: 'in-context' as any,
116
+ })
117
+ .where(eq((schema.memories as any).id, memoryId));
118
+
119
+ return {
120
+ success: true,
121
+ memory: {
122
+ id: memory.id,
123
+ type: memory.type,
124
+ content: memory.content,
125
+ contentPreview: memory.content.substring(0, 200) + (memory.content.length > 200 ? '...' : ''),
126
+ loadedAt: new Date(),
127
+ },
128
+ };
129
+ }
130
+
131
+ /**
132
+ * Evict a memory from working set
133
+ */
134
+ export async function evictMemoryFromContext(
135
+ sessionId: string,
136
+ memoryId: string
137
+ ): Promise<{
138
+ success: boolean;
139
+ message?: string;
140
+ }> {
141
+ const { db, schema } = await getDbClient();
142
+ const { contextSessions } = schema;
143
+
144
+ // Get session
145
+ const session = await db
146
+ .select()
147
+ .from(contextSessions)
148
+ .where(eq(contextSessions.sessionId, sessionId))
149
+ .limit(1);
150
+
151
+ if (session.length === 0) {
152
+ return {
153
+ success: false,
154
+ message: `Session "${sessionId}" not found`,
155
+ };
156
+ }
157
+
158
+ const currentSession = session[0];
159
+ const loadedIds = (currentSession.loadedMemoryIds as string[]) || [];
160
+
161
+ // Check if loaded
162
+ if (!loadedIds.includes(memoryId)) {
163
+ return {
164
+ success: false,
165
+ message: `Memory "${memoryId}" is not in working set`,
166
+ };
167
+ }
168
+
169
+ // Update session
170
+ const newLoadedIds = loadedIds.filter((id) => id !== memoryId);
171
+
172
+ await db
173
+ .update(contextSessions)
174
+ .set({
175
+ loadedMemoryIds: newLoadedIds as any,
176
+ updatedAt: new Date() as any,
177
+ } as any)
178
+ .where(eq(contextSessions.sessionId, sessionId));
179
+
180
+ // Also update memory's contextStatus to 'out-of-context'
181
+ await db
182
+ .update(schema.memories as any)
183
+ .set({
184
+ contextStatus: 'out-of-context' as any,
185
+ })
186
+ .where(eq((schema.memories as any).id, memoryId));
187
+
188
+ return {
189
+ success: true,
190
+ message: `Memory "${memoryId}" removed from working set`,
191
+ };
192
+ }
193
+
194
+ /**
195
+ * View all memories in working set
196
+ */
197
+ export async function viewLoadedMemories(
198
+ sessionId: string
199
+ ): Promise<{
200
+ success: boolean;
201
+ memories: LoadedMemory[];
202
+ count: number;
203
+ }> {
204
+ const { db, schema } = await getDbClient();
205
+ const { contextSessions } = schema;
206
+
207
+ // Get session
208
+ const session = await db
209
+ .select()
210
+ .from(contextSessions)
211
+ .where(eq(contextSessions.sessionId, sessionId))
212
+ .limit(1);
213
+
214
+ if (session.length === 0) {
215
+ return {
216
+ success: false,
217
+ memories: [],
218
+ count: 0,
219
+ };
220
+ }
221
+
222
+ const currentSession = session[0];
223
+ const loadedIds = (currentSession.loadedMemoryIds as string[]) || [];
224
+
225
+ if (loadedIds.length === 0) {
226
+ return {
227
+ success: true,
228
+ memories: [],
229
+ count: 0,
230
+ };
231
+ }
232
+
233
+ // Get all loaded memories
234
+ const memories: LoadedMemory[] = [];
235
+ for (const id of loadedIds) {
236
+ const memory = await getMemory(id);
237
+ if (memory) {
238
+ memories.push({
239
+ id: memory.id,
240
+ type: memory.type,
241
+ content: memory.content,
242
+ contentPreview: memory.content.substring(0, 200) + (memory.content.length > 200 ? '...' : ''),
243
+ loadedAt: currentSession.updatedAt,
244
+ });
245
+ }
246
+ }
247
+
248
+ return {
249
+ success: true,
250
+ memories,
251
+ count: memories.length,
252
+ };
253
+ }
254
+
255
+ /**
256
+ * Get context status - what's in your working set and what's available
257
+ */
258
+ export async function getContextStatus(
259
+ sessionId: string,
260
+ projectId: string
261
+ ): Promise<{
262
+ success: boolean;
263
+ coreMemory: {
264
+ sizeBytes: number;
265
+ maxBytes: number;
266
+ usagePercent: number;
267
+ };
268
+ workingSet: {
269
+ loadedCount: number;
270
+ loadedMemories: Array<{
271
+ id: string;
272
+ type: string;
273
+ contentLength: number;
274
+ }>;
275
+ };
276
+ available: {
277
+ totalMemories: number;
278
+ totalObservations: number;
279
+ };
280
+ note: string;
281
+ }> {
282
+ const { db, schema } = await getDbClient();
283
+ const { contextSessions, memories, learnings } = schema;
284
+
285
+ // Get session
286
+ const session = await db
287
+ .select()
288
+ .from(contextSessions)
289
+ .where(eq(contextSessions.sessionId, sessionId))
290
+ .limit(1);
291
+
292
+ if (session.length === 0) {
293
+ return {
294
+ success: false,
295
+ coreMemory: { sizeBytes: 0, maxBytes: 2048, usagePercent: 0 },
296
+ workingSet: { loadedCount: 0, loadedMemories: [] },
297
+ available: { totalMemories: 0, totalObservations: 0 },
298
+ note: "Session not found. Initialize session first.",
299
+ };
300
+ }
301
+
302
+ const currentSession = session[0];
303
+
304
+ // Get core memory stats
305
+ const { getCoreMemoryStats } = await import('../ingestion/core-memory.js');
306
+ const coreStats = await getCoreMemoryStats(projectId);
307
+
308
+ // Get loaded memories
309
+ const loadedIds = (currentSession.loadedMemoryIds as string[]) || [];
310
+ const loadedMemories = [];
311
+ for (const id of loadedIds) {
312
+ const memory = await getMemory(id);
313
+ if (memory) {
314
+ loadedMemories.push({
315
+ id: memory.id,
316
+ type: memory.type,
317
+ contentLength: memory.content.length,
318
+ });
319
+ }
320
+ }
321
+
322
+ // Get external context stats (counts)
323
+ const totalMemories = await db
324
+ .select()
325
+ .from(memories)
326
+ .where(eq(memories.projectId, projectId as any));
327
+
328
+ const totalObservations = await db
329
+ .select()
330
+ .from(learnings)
331
+ .where(eq(learnings.projectId, projectId as any));
332
+
333
+ return {
334
+ success: true,
335
+ coreMemory: {
336
+ sizeBytes: coreStats.totalBytes,
337
+ maxBytes: coreStats.maxBytes,
338
+ usagePercent: coreStats.usagePercent,
339
+ },
340
+ workingSet: {
341
+ loadedCount: loadedMemories.length,
342
+ loadedMemories,
343
+ },
344
+ available: {
345
+ totalMemories: totalMemories.length,
346
+ totalObservations: totalObservations.length,
347
+ },
348
+ note: "Claude manages its own context and token limits. This shows what memories you've loaded into your working set.",
349
+ };
350
+ }
351
+
352
+ /**
353
+ * Clear all loaded memories from working set
354
+ */
355
+ export async function clearLoadedMemories(sessionId: string): Promise<{
356
+ success: boolean;
357
+ message?: string;
358
+ }> {
359
+ const { db, schema } = await getDbClient();
360
+ const { contextSessions } = schema;
361
+
362
+ await db
363
+ .update(contextSessions)
364
+ .set({
365
+ loadedMemoryIds: [] as any,
366
+ updatedAt: new Date() as any,
367
+ } as any)
368
+ .where(eq(contextSessions.sessionId, sessionId));
369
+
370
+ return {
371
+ success: true,
372
+ message: 'All memories cleared from working set',
373
+ };
374
+ }
375
+
376
+ /**
377
+ * Get all memories currently marked as in-context for a session
378
+ */
379
+ export async function getInContextMemories(
380
+ sessionId: string
381
+ ): Promise<LoadedMemory[]> {
382
+ const { db, schema } = await getDbClient();
383
+ const { contextSessions } = schema;
384
+
385
+ // Get session to find project
386
+ const session = await db
387
+ .select()
388
+ .from(contextSessions)
389
+ .where(eq(contextSessions.sessionId, sessionId))
390
+ .limit(1);
391
+
392
+ if (session.length === 0) {
393
+ return [];
394
+ }
395
+
396
+ const { memories } = schema;
397
+ const projectId = session[0].projectId;
398
+
399
+ // Get all in-context memories
400
+ const inContextMemories = await db
401
+ .select()
402
+ .from(memories)
403
+ .where(
404
+ and(
405
+ eq(memories.projectId, projectId as any),
406
+ eq(memories.contextStatus, 'in-context' as any)
407
+ )
408
+ );
409
+
410
+ return inContextMemories.map((mem: any) => ({
411
+ id: mem.id,
412
+ type: mem.type,
413
+ content: mem.content,
414
+ contentPreview: mem.content.substring(0, 200) + (mem.content.length > 200 ? '...' : ''),
415
+ loadedAt: mem.updatedAt,
416
+ }));
417
+ }
418
+
419
+ /**
420
+ * Get out-of-context (archived) memories for a project
421
+ */
422
+ export async function getOutOfContextMemories(
423
+ projectId: string,
424
+ limit: number = 10
425
+ ): Promise<LoadedMemory[]> {
426
+ const { db, schema } = await getDbClient();
427
+ const { memories } = schema;
428
+
429
+ // Get out-of-context memories, ordered by last accessed
430
+ const outOfContextMemories = await db
431
+ .select()
432
+ .from(memories)
433
+ .where(
434
+ and(
435
+ eq(memories.projectId, projectId as any),
436
+ eq(memories.contextStatus, 'out-of-context' as any)
437
+ )
438
+ )
439
+ .orderBy(sql`COALESCE(${memories.lastAccessedAt}, ${memories.createdAt}) DESC`)
440
+ .limit(limit);
441
+
442
+ return outOfContextMemories.map((mem: any) => ({
443
+ id: mem.id,
444
+ type: mem.type,
445
+ content: mem.content,
446
+ contentPreview: mem.content.substring(0, 200) + (mem.content.length > 200 ? '...' : ''),
447
+ loadedAt: mem.lastAccessedAt || mem.createdAt,
448
+ }));
449
+ }
@@ -0,0 +1,234 @@
1
+ import { eq, and, sql } from 'drizzle-orm';
2
+ import { getDb } from '../../db/index.js';
3
+ import { getSchema } from '../../db/schema.js';
4
+ import { createDatabaseClient } from '../storage/database.js';
5
+ import { requireProject } from '../projects.js';
6
+
7
+ export interface ContextWindowConfig {
8
+ maxTokens: number;
9
+ warningThreshold: number;
10
+ criticalThreshold: number;
11
+ }
12
+
13
+ export const DEFAULT_CONTEXT_CONFIG: ContextWindowConfig = {
14
+ maxTokens: 128000,
15
+ warningThreshold: 0.80,
16
+ criticalThreshold: 0.95,
17
+ };
18
+
19
+ export interface TokenUsageStats {
20
+ coreMemoryTokens: number;
21
+ memoriesTokens: number;
22
+ totalTokens: number;
23
+ maxTokens: number;
24
+ usagePercent: number;
25
+ status: 'ok' | 'warning' | 'critical';
26
+ remainingTokens: number;
27
+ }
28
+
29
+ export interface OptimizationSuggestion {
30
+ type: 'drop' | 'summarize' | 'consolidate';
31
+ memoryId: string;
32
+ memoryType: string;
33
+ contentPreview: string;
34
+ tokens: number;
35
+ reason: string;
36
+ priority: number;
37
+ }
38
+
39
+ export function estimateTokens(content: string): number {
40
+ if (!content) return 0;
41
+ return Math.ceil(content.length / 4);
42
+ }
43
+
44
+ export async function getTokenUsage(projectPath: string): Promise<TokenUsageStats> {
45
+ const project = await requireProject(projectPath);
46
+ const projectId = project.id;
47
+ const db = createDatabaseClient(await getDb());
48
+ const schema = await getSchema();
49
+ const memories = schema.memories; const coreMemory = schema.coreMemory;
50
+
51
+ const coreMemoryRows = await db
52
+ .select()
53
+ .from(coreMemory)
54
+ .where(eq(coreMemory.projectId, projectId as any));
55
+
56
+ let coreMemoryTokens = 0;
57
+ for (const row of coreMemoryRows) {
58
+ coreMemoryTokens += (row as any).tokensEstimate || estimateTokens((row as any).content || '');
59
+ }
60
+
61
+ const memoryRows = await db
62
+ .select({
63
+ tokens: (memories as any).tokensEstimate,
64
+ content: memories.content,
65
+ })
66
+ .from(memories)
67
+ .where(eq(memories.projectId, projectId as any));
68
+
69
+ let memoriesTokens = 0;
70
+ for (const row of memoryRows) {
71
+ memoriesTokens += (row as any).tokens || estimateTokens((row as any).content || '');
72
+ }
73
+
74
+ const totalTokens = coreMemoryTokens + memoriesTokens;
75
+ const config = DEFAULT_CONTEXT_CONFIG;
76
+ const usagePercent = (totalTokens / config.maxTokens) * 100;
77
+ const remainingTokens = Math.max(0, config.maxTokens - totalTokens);
78
+
79
+ let status: 'ok' | 'warning' | 'critical' = 'ok';
80
+ if (usagePercent >= config.criticalThreshold * 100) {
81
+ status = 'critical';
82
+ } else if (usagePercent >= config.warningThreshold * 100) {
83
+ status = 'warning';
84
+ }
85
+
86
+ return {
87
+ coreMemoryTokens,
88
+ memoriesTokens,
89
+ totalTokens,
90
+ maxTokens: config.maxTokens,
91
+ usagePercent,
92
+ status,
93
+ remainingTokens,
94
+ };
95
+ }
96
+
97
+ export async function checkContextLimit(
98
+ projectPath: string,
99
+ additionalTokens: number
100
+ ): Promise<{ ok: boolean; warning?: string; stats: TokenUsageStats }> {
101
+ const stats = await getTokenUsage(projectPath);
102
+ const projectedTotal = stats.totalTokens + additionalTokens;
103
+ const projectedPercent = (projectedTotal / stats.maxTokens) * 100;
104
+
105
+ if (projectedPercent >= DEFAULT_CONTEXT_CONFIG.criticalThreshold * 100) {
106
+ return {
107
+ ok: false,
108
+ warning: `CRITICAL: Adding ${additionalTokens} tokens would exceed ${(DEFAULT_CONTEXT_CONFIG.criticalThreshold * 100).toFixed(0)}% of context limit (${projectedPercent.toFixed(1)}% projected). Consider optimizing first.`,
109
+ stats,
110
+ };
111
+ }
112
+
113
+ if (projectedPercent >= DEFAULT_CONTEXT_CONFIG.warningThreshold * 100) {
114
+ return {
115
+ ok: true,
116
+ warning: `WARNING: Adding ${additionalTokens} tokens would reach ${(projectedPercent.toFixed(1))}% of context limit. Consider optimizing soon.`,
117
+ stats,
118
+ };
119
+ }
120
+
121
+ return { ok: true, stats };
122
+ }
123
+
124
+ export async function getOptimizationSuggestions(
125
+ projectPath: string
126
+ ): Promise<OptimizationSuggestion[]> {
127
+ const project = await requireProject(projectPath);
128
+ const projectId = project.id;
129
+ const db = createDatabaseClient(await getDb());
130
+ const schema = await getSchema();
131
+ const memories = schema.memories;
132
+
133
+ const candidates = await db
134
+ .select({
135
+ id: memories.id,
136
+ type: memories.type,
137
+ content: memories.content,
138
+ tokens: (memories as any).tokensEstimate,
139
+ importanceScore: (memories as any).importanceScore,
140
+ accessCount: (memories as any).accessCount,
141
+ createdAt: memories.createdAt,
142
+ isPinned: (memories as any).isPinned,
143
+ isProtected: (memories as any).isProtected,
144
+ })
145
+ .from(memories)
146
+ .where(eq(memories.projectId, projectId as any))
147
+ .orderBy(sql`(importance_score * 0.4 + (100 - COALESCE(access_count, 0)) * 0.3 + (strftime('%s', 'now') - created_at / 1000) / 86400 * 0.3) ASC`)
148
+ .limit(20);
149
+
150
+ const suggestions: OptimizationSuggestion[] = [];
151
+
152
+ for (const mem of candidates) {
153
+ const tokens = (mem as any).tokens || estimateTokens((mem as any).content || '');
154
+ const contentPreview = (mem as any).content?.substring(0, 100) + '...';
155
+ const isPinned = (mem as any).isPinned === 1 || (mem as any).isPinned === true;
156
+ const isProtected = (mem as any).isProtected === 1 || (mem as any).isProtected === true;
157
+ const accessCount = (mem as any).accessCount || 0;
158
+ const importanceScore = (mem as any).importanceScore || 50;
159
+
160
+ if (isPinned || isProtected) {
161
+ continue;
162
+ }
163
+
164
+ if (importanceScore < 30 && accessCount < 3) {
165
+ suggestions.push({
166
+ type: 'drop',
167
+ memoryId: mem.id,
168
+ memoryType: mem.type,
169
+ contentPreview,
170
+ tokens,
171
+ reason: `Low importance (${importanceScore}) and rarely accessed (${accessCount} times)`,
172
+ priority: 1,
173
+ });
174
+ } else if (importanceScore < 50 && tokens > 500) {
175
+ suggestions.push({
176
+ type: 'summarize',
177
+ memoryId: mem.id,
178
+ memoryType: mem.type,
179
+ contentPreview,
180
+ tokens,
181
+ reason: `Large memory (${tokens} tokens) with moderate importance`,
182
+ priority: 2,
183
+ });
184
+ } else if (tokens > 1000) {
185
+ suggestions.push({
186
+ type: 'consolidate',
187
+ memoryId: mem.id,
188
+ memoryType: mem.type,
189
+ contentPreview,
190
+ tokens,
191
+ reason: `Very large memory (${tokens} tokens) - candidate for consolidation`,
192
+ priority: 3,
193
+ });
194
+ }
195
+ }
196
+
197
+ return suggestions.sort((a, b) => a.priority - b.priority).slice(0, 10);
198
+ }
199
+
200
+ export async function getContextWindowStatus(projectPath: string): Promise<{
201
+ config: ContextWindowConfig;
202
+ usage: TokenUsageStats;
203
+ suggestions: OptimizationSuggestion[];
204
+ memoryCount: number;
205
+ coreMemorySections: number;
206
+ }> {
207
+ const project = await requireProject(projectPath);
208
+ const projectId = project.id;
209
+ const db = createDatabaseClient(await getDb());
210
+ const schema = await getSchema();
211
+
212
+ const [usage, suggestions] = await Promise.all([
213
+ getTokenUsage(projectPath),
214
+ getOptimizationSuggestions(projectPath),
215
+ ]);
216
+
217
+ const memoryCount = await db
218
+ .select({ count: sql`COUNT(*)` })
219
+ .from(schema.memories)
220
+ .where(eq(schema.memories.projectId, projectId as any));
221
+
222
+ const coreMemorySections = await db
223
+ .select({ count: sql`COUNT(*)` })
224
+ .from(schema.coreMemory)
225
+ .where(eq(schema.coreMemory.projectId, projectId as any));
226
+
227
+ return {
228
+ config: DEFAULT_CONTEXT_CONFIG,
229
+ usage,
230
+ suggestions,
231
+ memoryCount: (memoryCount[0] as any)?.count || 0,
232
+ coreMemorySections: (coreMemorySections[0] as any)?.count || 0,
233
+ };
234
+ }
@@ -0,0 +1,35 @@
1
+ import { requireProject } from '../projects.js';
2
+ import { getRecent } from '../memory/memories.js';
3
+ import { getObservations } from '../ingestion/learnings.js';
4
+ import { getEntitiesForProject } from '../search/entities.js';
5
+ import { validateLimit } from '../lib/validation.js';
6
+
7
+ export interface ContextInput {
8
+ project: string;
9
+ include?: Array<'memories' | 'observations' | 'entities'>;
10
+ limit?: number;
11
+ }
12
+
13
+ export async function getProjectContext(input: ContextInput): Promise<Record<string, unknown>> {
14
+ const project = await requireProject(input.project);
15
+ const include = input.include ?? ['memories', 'observations'];
16
+ const limit = validateLimit(input.limit, 10, 1, 100);
17
+
18
+ const result: Record<string, unknown> = { project };
19
+
20
+ if (include.includes('memories')) {
21
+ result.memories = await getRecent(project.path, limit);
22
+ }
23
+
24
+ if (include.includes('observations')) {
25
+ result.observations = await getObservations(project.path, limit);
26
+ }
27
+
28
+ if (include.includes('entities')) {
29
+ result.entities = await getEntitiesForProject(project.path, limit);
30
+ }
31
+
32
+ return result;
33
+ }
34
+
35
+