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,51 @@
1
+ import { randomBytes, pbkdf2Sync, createCipheriv, createDecipheriv } from 'crypto';
2
+ import { config } from '../../config.js';
3
+
4
+ const ITERATIONS = 100_000;
5
+ const KEY_LEN = 32; // 256-bit
6
+ const DIGEST = 'sha256';
7
+ const ALGO = 'aes-256-gcm';
8
+ const NONCE_LEN = 12;
9
+
10
+ /**
11
+ * Derive a symmetric key from the passphrase and a salt.
12
+ * The salt is stored in `.squish/salt` (plain text) and is generated once.
13
+ */
14
+ function getSalt(): Buffer {
15
+ const fs = require('fs');
16
+ const path = require('path');
17
+ const saltPath = path.join(config.dataDir, 'salt');
18
+ if (!fs.existsSync(saltPath)) {
19
+ const salt = randomBytes(16).toString('hex');
20
+ fs.writeFileSync(saltPath, salt);
21
+ return Buffer.from(salt, 'hex');
22
+ }
23
+ return Buffer.from(fs.readFileSync(saltPath, 'utf-8'), 'hex');
24
+ }
25
+
26
+ function deriveKey(passphrase: string): Buffer {
27
+ const salt = getSalt();
28
+ return pbkdf2Sync(passphrase, salt, ITERATIONS, KEY_LEN, DIGEST);
29
+ }
30
+
31
+ export function encrypt(plain: string, passphrase?: string): { ciphertext: string; nonce: string } {
32
+ const key = deriveKey(passphrase || config.encryptionPassphrase);
33
+ const nonce = randomBytes(NONCE_LEN);
34
+ const cipher = createCipheriv(ALGO, key, nonce);
35
+ const encrypted = Buffer.concat([cipher.update(plain, 'utf8'), cipher.final()]);
36
+ const tag = cipher.getAuthTag();
37
+ const ciphertext = Buffer.concat([encrypted, tag]).toString('base64');
38
+ return { ciphertext, nonce: nonce.toString('base64') };
39
+ }
40
+
41
+ export function decrypt(ciphertext: string, nonceB64: string, passphrase?: string): string {
42
+ const key = deriveKey(passphrase || config.encryptionPassphrase);
43
+ const nonce = Buffer.from(nonceB64, 'base64');
44
+ const data = Buffer.from(ciphertext, 'base64');
45
+ const tag = data.slice(data.length - 16);
46
+ const encrypted = data.slice(0, data.length - 16);
47
+ const decipher = createDecipheriv(ALGO, key, nonce);
48
+ decipher.setAuthTag(tag);
49
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
50
+ return decrypted.toString('utf8');
51
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Memory Governance
3
+ * Implements protection, pinning, and immutability rules
4
+ */
5
+
6
+ import { eq } from 'drizzle-orm';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+ import { config } from '../../config.js';
10
+ import { performMemoryOperation } from '../utils/memory-operations.js';
11
+ import { logger } from '../logger.js';
12
+ import { createDatabaseClient } from '../storage/database.js';
13
+
14
+ /**
15
+ * Mark a memory as protected (cannot be evicted)
16
+ */
17
+ export async function protectMemory(memoryId: string, reason: string): Promise<void> {
18
+ await performMemoryOperation(memoryId, {
19
+ name: 'protecting memory',
20
+ updates: {
21
+ isProtected: true,
22
+ metadata: { protectionReason: reason, protectedAt: new Date().toISOString() },
23
+ },
24
+ });
25
+ }
26
+
27
+ /**
28
+ * Pin a memory for automatic injection into context
29
+ */
30
+ export async function pinMemory(memoryId: string): Promise<void> {
31
+ const db = createDatabaseClient(await getDb());
32
+ const schema = await getSchema();
33
+
34
+ await db
35
+ .update(schema.memories)
36
+ .set({
37
+ isPinned: true,
38
+ importanceScore: 100,
39
+ lastImportanceRecalc: new Date(),
40
+ })
41
+ .where(eq(schema.memories.id, memoryId));
42
+ }
43
+
44
+ /**
45
+ * Unpin a memory
46
+ */
47
+ export async function unpinMemory(memoryId: string): Promise<void> {
48
+ const db = createDatabaseClient(await getDb());
49
+ const schema = await getSchema();
50
+
51
+ await db
52
+ .update(schema.memories)
53
+ .set({
54
+ isPinned: false,
55
+ lastImportanceRecalc: new Date(),
56
+ })
57
+ .where(eq(schema.memories.id, memoryId));
58
+ }
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+ /**
73
+ * Get all pinned memories for auto-injection into context
74
+ * Works regardless of governance settings - pinned memories should always be accessible
75
+ */
76
+ export async function getPinnedMemories(projectId?: string): Promise<any[]> {
77
+ try {
78
+ const db = await getDb();
79
+ const schema = await getSchema();
80
+
81
+ let query = (db as any)
82
+ .select()
83
+ .from(schema.memories)
84
+ .where(eq(schema.memories.isPinned, true))
85
+ .limit(50);
86
+
87
+ return await query;
88
+ } catch (error) {
89
+ logger.error('Error retrieving pinned memories', error);
90
+ return [];
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Get pinned memories formatted for context injection
96
+ */
97
+ export async function getPinnedMemoriesForContext(projectId?: string): Promise<string[]> {
98
+ const pinned = await getPinnedMemories(projectId);
99
+ return pinned.map(m =>
100
+ `[Pinned] ${m.content?.substring(0, 500) || '(no content)'}`
101
+ );
102
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Privacy System
3
+ * Handles private tag filtering, secret detection, and path-based exclusions
4
+ */
5
+
6
+ import { detectSecrets } from './secret-detector.js';
7
+
8
+ type PrivacyMode = 'strict' | 'moderate' | 'off';
9
+
10
+ const DENY_PATTERNS = [
11
+ '.env', '.env.local', '.env.*.local',
12
+ '*.key', '*.pem',
13
+ 'secrets.json', 'credentials.json',
14
+ '.aws', '.ssh', 'node_modules/.env'
15
+ ];
16
+
17
+ const PRIVATE_TAG_REGEX = /<(private|secret)>[\s\S]*?<\/\1>/gi;
18
+
19
+ export function hasPrivateTags(content: string): boolean {
20
+ return PRIVATE_TAG_REGEX.test(content);
21
+ }
22
+
23
+ export function stripPrivateTags(content: string): string {
24
+ return content.replace(/<private>[\s\S]*?<\/private>/gi, '[PRIVATE]')
25
+ .replace(/<secret>[\s\S]*?<\/secret>/gi, '[SECRET]');
26
+ }
27
+
28
+ function isInDenyList(filePath: string): boolean {
29
+ const normalized = filePath.toLowerCase().replace(/\\/g, '/');
30
+
31
+ for (const pattern of DENY_PATTERNS) {
32
+ if (normalized === pattern) return true;
33
+ if (pattern.startsWith('*.') && normalized.endsWith(pattern.substring(1))) return true;
34
+ if (pattern.endsWith('/*')) {
35
+ const dir = pattern.slice(0, -2);
36
+ if (normalized.includes(`/${dir}/`) || normalized.startsWith(`${dir}/`)) return true;
37
+ }
38
+ if (normalized.includes(pattern)) return true;
39
+ }
40
+
41
+ return false;
42
+ }
43
+
44
+ export async function shouldStore(
45
+ content: string,
46
+ filePath?: string,
47
+ privacyMode: PrivacyMode = 'moderate'
48
+ ): Promise<boolean> {
49
+ if (privacyMode === 'off') return true;
50
+ if (hasPrivateTags(content)) return false;
51
+ if (filePath && isInDenyList(filePath)) return false;
52
+ if (detectSecrets(content).length > 0) return false;
53
+
54
+ return true;
55
+ }
56
+
57
+ export async function applyPrivacyFilters<T extends { content?: string; details?: Record<string, unknown> }>(
58
+ items: T[]
59
+ ): Promise<T[]> {
60
+ const results: T[] = [];
61
+
62
+ for (const item of items) {
63
+ const content = item.content || JSON.stringify(item.details || '');
64
+ if (await shouldStore(content)) {
65
+ results.push(item);
66
+ }
67
+ }
68
+
69
+ return results;
70
+ }
71
+
72
+ export function sanitizeForStorage(content: string, privacyMode: PrivacyMode): string {
73
+ let sanitized = stripPrivateTags(content);
74
+
75
+ if (privacyMode !== 'off') {
76
+ const secrets = detectSecrets(sanitized);
77
+ for (let i = secrets.length - 1; i >= 0; i--) {
78
+ const secret = secrets[i];
79
+ sanitized = sanitized.substring(0, secret.start) + '[REDACTED]' + sanitized.substring(secret.end);
80
+ }
81
+
82
+ sanitized = sanitized
83
+ .replace(/([a-zA-Z0-9_-]*[Aa]pi[_-]?[Kk]ey|Bearer\s+[^\s]+)/g, '[API_KEY]')
84
+ .replace(/(token|jwt|bearer)[\s=:]+[^\s,]+/gi, '[TOKEN]');
85
+ }
86
+
87
+ return sanitized;
88
+ }
89
+
90
+ export interface PrivacyReport {
91
+ isPrivate: boolean;
92
+ hasSecrets: boolean;
93
+ secretCount: number;
94
+ secretTypes: string[];
95
+ shouldStore: boolean;
96
+ }
97
+
98
+ export async function analyzePrivacy(content: string, filePath?: string): Promise<PrivacyReport> {
99
+ const secrets = detectSecrets(content);
100
+
101
+ return {
102
+ isPrivate: hasPrivateTags(content),
103
+ hasSecrets: secrets.length > 0,
104
+ secretCount: secrets.length,
105
+ secretTypes: [...new Set(secrets.map(s => s.type))],
106
+ shouldStore: await shouldStore(content, filePath)
107
+ };
108
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Secret Detector
3
+ * Pattern-based detection of API keys, tokens, and credentials
4
+ */
5
+
6
+ export interface SecretMatch {
7
+ type: string;
8
+ pattern: string;
9
+ value: string;
10
+ start: number;
11
+ end: number;
12
+ confidence: 'high' | 'medium' | 'low';
13
+ }
14
+
15
+ type Confidence = SecretMatch['confidence'];
16
+
17
+ interface PatternConfig {
18
+ pattern: RegExp;
19
+ type: string;
20
+ confidence: Confidence;
21
+ }
22
+
23
+ const HIGH_CONFIDENCE_PATTERNS: PatternConfig[] = [
24
+ { pattern: /(?:AKIA|ASIA)[0-9A-Z]{16}/g, type: 'aws_access_key', confidence: 'high' },
25
+ { pattern: /aws_secret_access_key\s*=\s*[^\s]+/gi, type: 'aws_secret_key', confidence: 'high' },
26
+ { pattern: /-----BEGIN (?:RSA|OPENSSH|PRIVATE) KEY-----/g, type: 'ssh_private_key', confidence: 'high' },
27
+ { pattern: /-----BEGIN PGP PRIVATE KEY BLOCK-----/g, type: 'gpg_private_key', confidence: 'high' },
28
+ { pattern: /AIza[0-9A-Za-z\-_]{35}/g, type: 'google_api_key', confidence: 'high' },
29
+ { pattern: /gh[pousr]_[A-Za-z0-9_]{36,255}/g, type: 'github_token', confidence: 'high' },
30
+ { pattern: /xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[A-Za-z0-9_-]{24,34}/g, type: 'slack_token', confidence: 'high' },
31
+ { pattern: /sk_live_[0-9a-zA-Z]{20,}/g, type: 'stripe_api_key', confidence: 'high' },
32
+ { pattern: /(mongodb|postgres|mysql|redis|cassandra):\/\/[^\s]+@[^\s]+/gi, type: 'database_url', confidence: 'high' }
33
+ ];
34
+
35
+ const MEDIUM_CONFIDENCE_PATTERNS: PatternConfig[] = [
36
+ { pattern: /(?:api[_-]?key|apikey|api_secret|secret_key)\s*[:=]\s*['""`]?[A-Za-z0-9_-]{20,}['""`]?/gi, type: 'api_key', confidence: 'medium' },
37
+ { pattern: /bearer\s+[A-Za-z0-9._-]+/gi, type: 'bearer_token', confidence: 'medium' },
38
+ { pattern: /eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g, type: 'jwt_token', confidence: 'medium' },
39
+ { pattern: /basic\s+[A-Za-z0-9+/=]+/gi, type: 'basic_auth', confidence: 'medium' },
40
+ { pattern: /(?:password|passwd|pwd)\s*[:=]\s*['""`]?[^\s'""`]+['""`]?/gi, type: 'password', confidence: 'medium' },
41
+ { pattern: /(?:connection_string|connstr|conn_string)\s*[:=]\s*['""`][^'""`]+['""`]/gi, type: 'connection_string', confidence: 'medium' }
42
+ ];
43
+
44
+ const LOW_CONFIDENCE_PATTERNS: PatternConfig[] = [
45
+ { pattern: /\b(?:token|auth_token|access_token|refresh_token)\b/gi, type: 'token_reference', confidence: 'low' },
46
+ { pattern: /\b(?:secret|secret_key|api_secret|client_secret)\b/gi, type: 'secret_reference', confidence: 'low' },
47
+ { pattern: /\b(?:credential|cred|credentials)\b/gi, type: 'credential_reference', confidence: 'low' }
48
+ ];
49
+
50
+ const CONFIDENCE_LEVELS: Record<Confidence, number> = { high: 3, medium: 2, low: 1 };
51
+
52
+ function findMatches(text: string, config: PatternConfig): SecretMatch[] {
53
+ const regex = new RegExp(config.pattern.source, config.pattern.flags);
54
+ const matches: SecretMatch[] = [];
55
+ let match;
56
+
57
+ while ((match = regex.exec(text)) !== null) {
58
+ matches.push({
59
+ type: config.type,
60
+ pattern: config.pattern.source,
61
+ value: match[0],
62
+ start: match.index,
63
+ end: match.index + match[0].length,
64
+ confidence: config.confidence
65
+ });
66
+ }
67
+
68
+ return matches;
69
+ }
70
+
71
+ export function detectSecrets(text: string, minConfidence: Confidence = 'medium'): SecretMatch[] {
72
+ const minLevel = CONFIDENCE_LEVELS[minConfidence];
73
+ const matches: SecretMatch[] = [];
74
+
75
+ for (const config of HIGH_CONFIDENCE_PATTERNS) {
76
+ matches.push(...findMatches(text, config));
77
+ }
78
+
79
+ if (minLevel <= 2) {
80
+ for (const config of MEDIUM_CONFIDENCE_PATTERNS) {
81
+ matches.push(...findMatches(text, config));
82
+ }
83
+ }
84
+
85
+ if (minLevel <= 1) {
86
+ for (const config of LOW_CONFIDENCE_PATTERNS) {
87
+ matches.push(...findMatches(text, config));
88
+ }
89
+ }
90
+
91
+ return matches;
92
+ }
93
+
94
+ export function likelyContainsSecrets(text: string): boolean {
95
+ return detectSecrets(text, 'high').length > 0;
96
+ }
97
+
98
+ export function getSecretSummary(text: string): { count: number; types: string[] } {
99
+ const secrets = detectSecrets(text);
100
+ return {
101
+ count: secrets.length,
102
+ types: [...new Set(secrets.map(s => s.type))]
103
+ };
104
+ }
105
+
106
+ export function redactSecrets(text: string, replacement = '[REDACTED]'): string {
107
+ const secrets = detectSecrets(text, 'high');
108
+ let result = text;
109
+
110
+ const sorted = [...secrets].sort((a, b) => b.start - a.start);
111
+ for (const secret of sorted) {
112
+ result = result.substring(0, secret.start) + replacement + result.substring(secret.end);
113
+ }
114
+
115
+ return result;
116
+ }
117
+
118
+ export const SECRET_PATTERNS = {
119
+ high: HIGH_CONFIDENCE_PATTERNS,
120
+ medium: MEDIUM_CONFIDENCE_PATTERNS,
121
+ low: LOW_CONFIDENCE_PATTERNS
122
+ };
@@ -0,0 +1,160 @@
1
+ /** Session Auto-Load - Automatically load context when MCP session initializes */
2
+
3
+ import { logger } from '../logger.js';
4
+ import { config } from '../../config.js';
5
+ import { initializeCoreMemory, getCoreMemory } from '../ingestion/core-memory.js';
6
+ import { search } from '../memory/memories.js';
7
+ import { getProjectContext } from '../context/context.js';
8
+ import { getOrCreateProject } from '../projects.js';
9
+ import { AutoLoadConfig, AutoLoadResult, DEFAULT_AUTO_LOAD_CONFIG } from './types.js';
10
+ import { estimateTokens } from '../context/context-window.js';
11
+ import { getLatestProjectWorkingSetSummary } from './working-set.js';
12
+ import { loadHotCache, getHotCacheSummary } from '../hot-cache.js';
13
+
14
+ export async function performAutoLoad(
15
+ projectPath: string,
16
+ customConfig?: Partial<AutoLoadConfig>
17
+ ): Promise<AutoLoadResult> {
18
+ const startTime = Date.now();
19
+ const cfg: AutoLoadConfig = { ...DEFAULT_AUTO_LOAD_CONFIG, ...customConfig };
20
+ const result: AutoLoadResult = {
21
+ coreMemoryLoaded: false,
22
+ memoriesLoaded: 0,
23
+ projectContextLoaded: false,
24
+ tokensUsed: 0,
25
+ duration: 0,
26
+ warnings: [],
27
+ };
28
+
29
+ if (!cfg.enabled) {
30
+ result.warnings.push('Auto-load disabled by configuration');
31
+ result.duration = Date.now() - startTime;
32
+ return result;
33
+ }
34
+
35
+ try {
36
+ const project = await getOrCreateProject(projectPath);
37
+ if (!project) {
38
+ result.warnings.push(`Failed to create/find project: ${projectPath}`);
39
+ result.duration = Date.now() - startTime;
40
+ return result;
41
+ }
42
+ const projectId = project.id;
43
+
44
+ try {
45
+ const workingSetSummary = await getLatestProjectWorkingSetSummary(projectPath);
46
+ if (workingSetSummary) {
47
+ result.tokensUsed += estimateTokens(workingSetSummary);
48
+ }
49
+ } catch (error) {
50
+ const msg = error instanceof Error ? error.message : String(error);
51
+ result.warnings.push(`Failed to load session working set: ${msg}`);
52
+ }
53
+
54
+ // NEW: Load persistent hot cache (Karpathy-style, survives restart)
55
+ if (cfg.includeCoreMemory) {
56
+ try {
57
+ const hotCacheSummary = await getHotCacheSummary({ projectPath, maxEntries: 5 });
58
+ if (hotCacheSummary) {
59
+ result.tokensUsed += estimateTokens(hotCacheSummary);
60
+ logger.info('[AutoLoad] Hot cache loaded from persistent storage');
61
+ }
62
+ } catch (error) {
63
+ const msg = error instanceof Error ? error.message : String(error);
64
+ result.warnings.push(`Failed to load hot cache: ${msg}`);
65
+ logger.warn(`[AutoLoad] Failed to load hot cache: ${msg}`);
66
+ }
67
+ }
68
+
69
+ if (cfg.includeCoreMemory) {
70
+ try {
71
+ await initializeCoreMemory(projectId);
72
+ const coreMemory = await getCoreMemory(projectId);
73
+ if (coreMemory) {
74
+ result.coreMemoryLoaded = true;
75
+ const coreMemoryText = Object.values(coreMemory).join('\n');
76
+ result.tokensUsed += estimateTokens(coreMemoryText);
77
+ logger.info(`[AutoLoad] Core memory loaded for project ${projectId}`);
78
+ }
79
+ } catch (error) {
80
+ const msg = error instanceof Error ? error.message : String(error);
81
+ result.warnings.push(`Failed to load core memory: ${msg}`);
82
+ logger.warn(`[AutoLoad] Failed to load core memory: ${msg}`);
83
+ }
84
+ }
85
+
86
+ if (cfg.includeRecentMemories && cfg.recentMemoryCount > 0) {
87
+ try {
88
+ const recentMemories = await search({
89
+ query: '',
90
+ project: projectPath,
91
+ limit: cfg.recentMemoryCount,
92
+ });
93
+
94
+ if (recentMemories && recentMemories.length > 0) {
95
+ const importantMemories = recentMemories.filter(
96
+ (m: any) => (m.importanceScore ?? 50) >= cfg.importanceThreshold
97
+ );
98
+
99
+ result.memoriesLoaded = importantMemories.length;
100
+
101
+ for (const memory of importantMemories) {
102
+ result.tokensUsed += estimateTokens(memory.content || '');
103
+ }
104
+
105
+ logger.info(`[AutoLoad] Loaded ${result.memoriesLoaded} high-importance memories`);
106
+ }
107
+ } catch (error) {
108
+ const msg = error instanceof Error ? error.message : String(error);
109
+ result.warnings.push(`Failed to load recent memories: ${msg}`);
110
+ logger.warn(`[AutoLoad] Failed to load recent memories: ${msg}`);
111
+ }
112
+ }
113
+
114
+ if (cfg.includeProjectContext) {
115
+ try {
116
+ const context = await getProjectContext({
117
+ project: projectPath,
118
+ include: ['memories', 'observations'],
119
+ limit: 5,
120
+ });
121
+
122
+ if (context) {
123
+ result.projectContextLoaded = true;
124
+ result.tokensUsed += estimateTokens(JSON.stringify(context));
125
+ logger.info('[AutoLoad] Project context loaded');
126
+ }
127
+ } catch (error) {
128
+ const msg = error instanceof Error ? error.message : String(error);
129
+ result.warnings.push(`Failed to load project context: ${msg}`);
130
+ logger.warn(`[AutoLoad] Failed to load project context: ${msg}`);
131
+ }
132
+ }
133
+
134
+ result.duration = Date.now() - startTime;
135
+ logger.info(`[AutoLoad] Complete: ${result.memoriesLoaded} memories, ${result.tokensUsed} tokens, ${result.duration}ms`);
136
+
137
+ return result;
138
+ } catch (error) {
139
+ const msg = error instanceof Error ? error.message : String(error);
140
+ result.warnings.push(`Auto-load failed: ${msg}`);
141
+ result.duration = Date.now() - startTime;
142
+ logger.error(`[AutoLoad] Failed: ${msg}`);
143
+ return result;
144
+ }
145
+ }
146
+
147
+ export function getAutoLoadConfig(): AutoLoadConfig {
148
+ return {
149
+ enabled: config.sessionAutoLoadEnabled,
150
+ includeCoreMemory: true,
151
+ includeRecentMemories: true,
152
+ recentMemoryCount: config.sessionAutoLoadRecentCount,
153
+ importanceThreshold: config.sessionAutoLoadImportanceThreshold,
154
+ includeProjectContext: true,
155
+ };
156
+ }
157
+
158
+ export function shouldAutoLoad(): boolean {
159
+ return config.sessionAutoLoadEnabled;
160
+ }