squish-memory 0.8.2 → 0.9.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 (266) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.env.mcp +30 -0
  4. package/.mcp.json +2 -5
  5. package/CHANGELOG.md +111 -0
  6. package/QUICK-START.md +65 -0
  7. package/README.md +188 -530
  8. package/commands/managed-sync.ts +69 -0
  9. package/commands/mcp-server.ts +519 -0
  10. package/config/mcp-cli-fallback-policy.json +22 -0
  11. package/config/mcp-migration-map.json +22 -0
  12. package/config/mcp-mode-semantics.json +21 -0
  13. package/config/mcp-remote-auth.json +36 -0
  14. package/config/mcp-universal.schema.json +48 -0
  15. package/config/mcp.json +38 -0
  16. package/config/remote-memory-policy.json +32 -0
  17. package/dist/algorithms/merge/detection/hash-filters.js +2 -2
  18. package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
  19. package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
  20. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
  21. package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
  22. package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
  23. package/dist/commands/managed-sync.d.ts +10 -0
  24. package/dist/commands/managed-sync.d.ts.map +1 -0
  25. package/dist/commands/managed-sync.js +64 -0
  26. package/dist/commands/managed-sync.js.map +1 -0
  27. package/dist/commands/mcp-server.d.ts +3 -0
  28. package/dist/commands/mcp-server.d.ts.map +1 -0
  29. package/dist/commands/mcp-server.js +389 -0
  30. package/dist/commands/mcp-server.js.map +1 -0
  31. package/dist/config.d.ts +24 -1
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +32 -1
  34. package/dist/config.js.map +1 -1
  35. package/dist/core/associations.d.ts +1 -1
  36. package/dist/core/associations.d.ts.map +1 -1
  37. package/dist/core/consolidation.d.ts +31 -0
  38. package/dist/core/consolidation.d.ts.map +1 -1
  39. package/dist/core/consolidation.js +237 -29
  40. package/dist/core/consolidation.js.map +1 -1
  41. package/dist/core/embeddings/google-multimodal.d.ts +14 -0
  42. package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
  43. package/dist/core/embeddings/google-multimodal.js +142 -0
  44. package/dist/core/embeddings/google-multimodal.js.map +1 -0
  45. package/dist/core/embeddings.d.ts +3 -2
  46. package/dist/core/embeddings.d.ts.map +1 -1
  47. package/dist/core/embeddings.js +61 -39
  48. package/dist/core/embeddings.js.map +1 -1
  49. package/dist/core/mcp/client.d.ts +17 -0
  50. package/dist/core/mcp/client.d.ts.map +1 -0
  51. package/dist/core/mcp/client.js +101 -0
  52. package/dist/core/mcp/client.js.map +1 -0
  53. package/dist/core/mcp/index.d.ts +6 -0
  54. package/dist/core/mcp/index.d.ts.map +1 -0
  55. package/dist/core/mcp/index.js +6 -0
  56. package/dist/core/mcp/index.js.map +1 -0
  57. package/dist/core/mcp/server.d.ts +18 -0
  58. package/dist/core/mcp/server.d.ts.map +1 -0
  59. package/dist/core/mcp/server.js +131 -0
  60. package/dist/core/mcp/server.js.map +1 -0
  61. package/dist/core/mcp/standalone-server.d.ts +13 -0
  62. package/dist/core/mcp/standalone-server.d.ts.map +1 -0
  63. package/dist/core/mcp/standalone-server.js +46 -0
  64. package/dist/core/mcp/standalone-server.js.map +1 -0
  65. package/dist/core/mcp/tools.d.ts +9 -0
  66. package/dist/core/mcp/tools.d.ts.map +1 -0
  67. package/dist/core/mcp/tools.js +262 -0
  68. package/dist/core/mcp/tools.js.map +1 -0
  69. package/dist/core/mcp/types.d.ts +315 -0
  70. package/dist/core/mcp/types.d.ts.map +1 -0
  71. package/dist/core/mcp/types.js +48 -0
  72. package/dist/core/mcp/types.js.map +1 -0
  73. package/dist/core/memory/categorizer.d.ts +27 -0
  74. package/dist/core/memory/categorizer.d.ts.map +1 -0
  75. package/dist/core/memory/categorizer.js +304 -0
  76. package/dist/core/memory/categorizer.js.map +1 -0
  77. package/dist/core/memory/conflict-detector.d.ts +7 -0
  78. package/dist/core/memory/conflict-detector.d.ts.map +1 -0
  79. package/dist/core/memory/conflict-detector.js +43 -0
  80. package/dist/core/memory/conflict-detector.js.map +1 -0
  81. package/dist/core/memory/context-collector.d.ts +10 -0
  82. package/dist/core/memory/context-collector.d.ts.map +1 -0
  83. package/dist/core/memory/context-collector.js +55 -0
  84. package/dist/core/memory/context-collector.js.map +1 -0
  85. package/dist/core/memory/contradiction-resolver.d.ts +40 -0
  86. package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
  87. package/dist/core/memory/contradiction-resolver.js +368 -0
  88. package/dist/core/memory/contradiction-resolver.js.map +1 -0
  89. package/dist/core/memory/edit-workflow.d.ts +19 -0
  90. package/dist/core/memory/edit-workflow.d.ts.map +1 -0
  91. package/dist/core/memory/edit-workflow.js +120 -0
  92. package/dist/core/memory/edit-workflow.js.map +1 -0
  93. package/dist/core/memory/feedback-tracker.d.ts +12 -0
  94. package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
  95. package/dist/core/memory/feedback-tracker.js +151 -0
  96. package/dist/core/memory/feedback-tracker.js.map +1 -0
  97. package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
  98. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  99. package/dist/core/memory/hybrid-retrieval.js +56 -28
  100. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  101. package/dist/core/memory/hybrid-scorer.d.ts +5 -16
  102. package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
  103. package/dist/core/memory/hybrid-scorer.js +161 -125
  104. package/dist/core/memory/hybrid-scorer.js.map +1 -1
  105. package/dist/core/memory/hybrid-search.js +53 -19
  106. package/dist/core/memory/hybrid-search.js.map +1 -1
  107. package/dist/core/memory/memories.d.ts +4 -0
  108. package/dist/core/memory/memories.d.ts.map +1 -1
  109. package/dist/core/memory/memories.js +133 -60
  110. package/dist/core/memory/memories.js.map +1 -1
  111. package/dist/core/memory/progressive-disclosure.d.ts +43 -0
  112. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
  113. package/dist/core/memory/progressive-disclosure.js +280 -0
  114. package/dist/core/memory/progressive-disclosure.js.map +1 -0
  115. package/dist/core/memory/query-rewriter.d.ts +13 -0
  116. package/dist/core/memory/query-rewriter.d.ts.map +1 -0
  117. package/dist/core/memory/query-rewriter.js +118 -0
  118. package/dist/core/memory/query-rewriter.js.map +1 -0
  119. package/dist/core/memory/response-analyzer.d.ts +9 -0
  120. package/dist/core/memory/response-analyzer.d.ts.map +1 -0
  121. package/dist/core/memory/response-analyzer.js +61 -0
  122. package/dist/core/memory/response-analyzer.js.map +1 -0
  123. package/dist/core/memory/stats.d.ts +17 -0
  124. package/dist/core/memory/stats.d.ts.map +1 -0
  125. package/dist/core/memory/stats.js +87 -0
  126. package/dist/core/memory/stats.js.map +1 -0
  127. package/dist/core/memory/telemetry.d.ts +69 -0
  128. package/dist/core/memory/telemetry.d.ts.map +1 -0
  129. package/dist/core/memory/telemetry.js +313 -0
  130. package/dist/core/memory/telemetry.js.map +1 -0
  131. package/dist/core/memory/temporal-facts.d.ts +41 -0
  132. package/dist/core/memory/temporal-facts.d.ts.map +1 -0
  133. package/dist/core/memory/temporal-facts.js +262 -0
  134. package/dist/core/memory/temporal-facts.js.map +1 -0
  135. package/dist/core/memory/trigger-detector.d.ts +14 -0
  136. package/dist/core/memory/trigger-detector.d.ts.map +1 -0
  137. package/dist/core/memory/trigger-detector.js +42 -0
  138. package/dist/core/memory/trigger-detector.js.map +1 -0
  139. package/dist/core/memory/write-gate.d.ts +54 -0
  140. package/dist/core/memory/write-gate.d.ts.map +1 -0
  141. package/dist/core/memory/write-gate.js +210 -0
  142. package/dist/core/memory/write-gate.js.map +1 -0
  143. package/dist/core/projects.d.ts +2 -0
  144. package/dist/core/projects.d.ts.map +1 -1
  145. package/dist/core/projects.js +33 -0
  146. package/dist/core/projects.js.map +1 -1
  147. package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
  148. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
  149. package/dist/core/scheduler/cron-scheduler.js +238 -0
  150. package/dist/core/scheduler/cron-scheduler.js.map +1 -0
  151. package/dist/core/scheduler/heartbeat.d.ts +11 -0
  152. package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
  153. package/dist/core/scheduler/heartbeat.js +73 -0
  154. package/dist/core/scheduler/heartbeat.js.map +1 -0
  155. package/dist/core/scheduler/index.d.ts +8 -0
  156. package/dist/core/scheduler/index.d.ts.map +1 -0
  157. package/dist/core/scheduler/index.js +8 -0
  158. package/dist/core/scheduler/index.js.map +1 -0
  159. package/dist/core/scheduler/job-runner.d.ts +11 -0
  160. package/dist/core/scheduler/job-runner.d.ts.map +1 -0
  161. package/dist/core/scheduler/job-runner.js +161 -0
  162. package/dist/core/scheduler/job-runner.js.map +1 -0
  163. package/dist/core/session/auto-load.d.ts +6 -0
  164. package/dist/core/session/auto-load.d.ts.map +1 -0
  165. package/dist/core/session/auto-load.js +119 -0
  166. package/dist/core/session/auto-load.js.map +1 -0
  167. package/dist/core/session/index.d.ts +7 -0
  168. package/dist/core/session/index.d.ts.map +1 -0
  169. package/dist/core/session/index.js +7 -0
  170. package/dist/core/session/index.js.map +1 -0
  171. package/dist/core/session/types.d.ts +26 -0
  172. package/dist/core/session/types.d.ts.map +1 -0
  173. package/dist/core/session/types.js +10 -0
  174. package/dist/core/session/types.js.map +1 -0
  175. package/dist/core/snapshots/comparison.d.ts.map +1 -1
  176. package/dist/core/snapshots/comparison.js +8 -2
  177. package/dist/core/snapshots/comparison.js.map +1 -1
  178. package/dist/core/utils/content-extraction.d.ts.map +1 -1
  179. package/dist/core/utils/content-extraction.js +11 -1
  180. package/dist/core/utils/content-extraction.js.map +1 -1
  181. package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
  182. package/dist/core/utils/summarization-helpers.js +4 -1
  183. package/dist/core/utils/summarization-helpers.js.map +1 -1
  184. package/dist/core/utils.d.ts.map +1 -1
  185. package/dist/core/utils.js +26 -3
  186. package/dist/core/utils.js.map +1 -1
  187. package/dist/core/worker.d.ts +20 -0
  188. package/dist/core/worker.d.ts.map +1 -1
  189. package/dist/core/worker.js +86 -0
  190. package/dist/core/worker.js.map +1 -1
  191. package/dist/db/adapter.d.ts +1 -5
  192. package/dist/db/adapter.d.ts.map +1 -1
  193. package/dist/db/adapter.js +125 -12
  194. package/dist/db/adapter.js.map +1 -1
  195. package/dist/db/bootstrap.d.ts.map +1 -1
  196. package/dist/db/bootstrap.js +178 -3
  197. package/dist/db/bootstrap.js.map +1 -1
  198. package/dist/db/index.d.ts +1 -5
  199. package/dist/db/index.d.ts.map +1 -1
  200. package/dist/db/index.js +7 -4
  201. package/dist/db/index.js.map +1 -1
  202. package/dist/drizzle/schema-sqlite.d.ts +1953 -612
  203. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  204. package/dist/drizzle/schema-sqlite.js +134 -0
  205. package/dist/drizzle/schema-sqlite.js.map +1 -1
  206. package/dist/drizzle/schema.d.ts +684 -3
  207. package/dist/drizzle/schema.d.ts.map +1 -1
  208. package/dist/drizzle/schema.js +81 -1
  209. package/dist/drizzle/schema.js.map +1 -1
  210. package/dist/index.d.ts +3 -3
  211. package/dist/index.js +152 -13
  212. package/dist/index.js.map +1 -1
  213. package/package.json +125 -103
  214. package/scripts/build-release.sh +33 -0
  215. package/scripts/db/check-db.mjs +88 -0
  216. package/scripts/db/fix-all-columns.mjs +52 -0
  217. package/scripts/db/fix-schema-all.mjs +55 -0
  218. package/scripts/db/fix-schema-full.mjs +46 -0
  219. package/scripts/db/fix-schema.mjs +38 -0
  220. package/scripts/db/init-db.mjs +13 -0
  221. package/scripts/db/recreate-db.mjs +14 -0
  222. package/scripts/generate-mcp.mjs +264 -0
  223. package/scripts/github-release.sh +61 -0
  224. package/scripts/init-dirs.mjs +13 -0
  225. package/scripts/init-dirs.ts +15 -0
  226. package/scripts/install-mcp.mjs +116 -0
  227. package/scripts/install-web.sh +120 -0
  228. package/scripts/install.mjs +340 -0
  229. package/scripts/openclaw-bootstrap.mjs +127 -0
  230. package/scripts/package-release.sh +71 -0
  231. package/scripts/remote-preflight.mjs +62 -0
  232. package/scripts/squish-fallback.mjs +132 -0
  233. package/scripts/test/test-all-systems.mjs +139 -0
  234. package/scripts/test/test-memory-system.mjs +139 -0
  235. package/scripts/test/test-v0.5.0.mjs +210 -0
  236. package/scripts/verify-mcp.mjs +214 -0
  237. package/skills/memory-guide/SKILL.md +181 -123
  238. package/skills/squish-cli/SKILL.md +200 -0
  239. package/skills/squish-mcp/SKILL.md +311 -0
  240. package/skills/squish-memory/SKILL.md +100 -62
  241. package/skills/squish-memory/claude-desktop.json +12 -0
  242. package/skills/squish-memory/install.mjs +335 -0
  243. package/skills/squish-memory/install.sh +94 -62
  244. package/skills/squish-memory/openclaw.json +13 -0
  245. package/skills/squish-memory/opencode.json +14 -0
  246. package/skills/squish-memory/skill.json +32 -0
  247. package/dist/adapters/claude-code/capture.d.ts +0 -11
  248. package/dist/adapters/claude-code/capture.d.ts.map +0 -1
  249. package/dist/adapters/claude-code/capture.js +0 -100
  250. package/dist/adapters/claude-code/capture.js.map +0 -1
  251. package/dist/adapters/claude-code/index.d.ts +0 -5
  252. package/dist/adapters/claude-code/index.d.ts.map +0 -1
  253. package/dist/adapters/claude-code/index.js +0 -6
  254. package/dist/adapters/claude-code/index.js.map +0 -1
  255. package/dist/adapters/claude-code/injection.d.ts +0 -34
  256. package/dist/adapters/claude-code/injection.d.ts.map +0 -1
  257. package/dist/adapters/claude-code/injection.js +0 -127
  258. package/dist/adapters/claude-code/injection.js.map +0 -1
  259. package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
  260. package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
  261. package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
  262. package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
  263. package/dist/adapters/claude-code/types.d.ts +0 -46
  264. package/dist/adapters/claude-code/types.d.ts.map +0 -1
  265. package/dist/adapters/claude-code/types.js +0 -6
  266. package/dist/adapters/claude-code/types.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ const EXPLICIT_TRIGGER_PATTERNS = [
2
+ { label: 'remember', regex: /\bremember\b/i },
3
+ { label: 'dont-forget', regex: /\b(?:don'?t\s+forget|do\s+not\s+forget)\b/i },
4
+ { label: 'keep-in-mind', regex: /\bkeep\s+in\s+mind\b/i },
5
+ { label: 'note-that', regex: /\bnote\s+that\b/i },
6
+ { label: 'from-now-on', regex: /\bfrom\s+now\s+on\b/i },
7
+ { label: 'going-forward', regex: /\bgoing\s+forward\b/i },
8
+ { label: 'save-this', regex: /\bsave\s+this\b/i },
9
+ { label: 'log-this', regex: /\blog\s+this\b/i },
10
+ { label: 'important', regex: /\bimportant\s*:/i },
11
+ ];
12
+ export function detectMemorySignals(content) {
13
+ const text = content.trim();
14
+ const explicitTriggers = EXPLICIT_TRIGGER_PATTERNS.filter((p) => p.regex.test(text)).map((p) => p.label);
15
+ const implicit = {
16
+ decision: /\b(?:decided|choose|chose|going with|picked|selected|final decision)\b/i.test(text) ||
17
+ /\b(?:x over y|option\s+[a-z0-9]+\s+over)\b/i.test(text),
18
+ correction: /\b(?:no,?\s+i\s+meant|actually,?\s+that'?s\s+not|correction:|i\s+meant)\b/i.test(text),
19
+ preference: /\b(?:i\s+like|i\s+don'?t\s+like|i\s+hate|my\s+preference\s+is|prefer)\b/i.test(text) ||
20
+ /\b(?:always|never)\b/i.test(text),
21
+ workflowRule: /\b(?:let'?s\s+always\s+do\s+it\s+this\s+way|standard\s+workflow|runbook)\b/i.test(text),
22
+ lesson: /\b(?:failed\s+because|lesson\s+learned|next\s+time|do\s+not\s+repeat|root\s+cause)\b/i.test(text),
23
+ };
24
+ let suggestedType = 'observation';
25
+ if (implicit.preference)
26
+ suggestedType = 'preference';
27
+ if (implicit.decision)
28
+ suggestedType = 'decision';
29
+ if (implicit.workflowRule || implicit.lesson)
30
+ suggestedType = 'context';
31
+ if (!implicit.decision && !implicit.preference && /\b(?:is|are|was|were|uses|has|have)\b/i.test(text)) {
32
+ suggestedType = 'fact';
33
+ }
34
+ const priority = explicitTriggers.length > 0 || implicit.correction ? 'high' : 'normal';
35
+ return {
36
+ explicitTriggers,
37
+ implicit,
38
+ suggestedType,
39
+ priority,
40
+ };
41
+ }
42
+ //# sourceMappingURL=trigger-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger-detector.js","sourceRoot":"","sources":["../../../core/memory/trigger-detector.ts"],"names":[],"mappings":"AAaA,MAAM,yBAAyB,GAA4C;IACzE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE;IAC7C,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,4CAA4C,EAAE;IAC7E,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,uBAAuB,EAAE;IACzD,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE;IACjD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,sBAAsB,EAAE;IACvD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,sBAAsB,EAAE;IACzD,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE;IACjD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAC/C,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE;CAClD,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzG,MAAM,QAAQ,GAAG;QACf,QAAQ,EACN,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC;YACpF,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1D,UAAU,EAAE,4EAA4E,CAAC,IAAI,CAAC,IAAI,CAAC;QACnG,UAAU,EACR,0EAA0E,CAAC,IAAI,CAAC,IAAI,CAAC;YACrF,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,YAAY,EAAE,6EAA6E,CAAC,IAAI,CAAC,IAAI,CAAC;QACtG,MAAM,EACJ,uFAAuF,CAAC,IAAI,CAAC,IAAI,CAAC;KACrG,CAAC;IAEF,IAAI,aAAa,GAAmC,aAAa,CAAC;IAClE,IAAI,QAAQ,CAAC,UAAU;QAAE,aAAa,GAAG,YAAY,CAAC;IACtD,IAAI,QAAQ,CAAC,QAAQ;QAAE,aAAa,GAAG,UAAU,CAAC;IAClD,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM;QAAE,aAAa,GAAG,SAAS,CAAC;IACxE,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtG,aAAa,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAA8B,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEnH,OAAO;QACL,gBAAgB;QAChB,QAAQ;QACR,aAAa;QACb,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Write Gate Enforcement
3
+ * Validates memories before writing to ensure quality, security, and consistency
4
+ * Integrates secret detection, trigger detection, and content validation
5
+ */
6
+ import { MemorySignals } from './trigger-detector.js';
7
+ export interface WriteGateResult {
8
+ allowed: boolean;
9
+ sanitized: boolean;
10
+ warnings: string[];
11
+ errors: string[];
12
+ metadata: {
13
+ secretsDetected: number;
14
+ signals: MemorySignals | null;
15
+ contradictions: {
16
+ found: boolean;
17
+ count: number;
18
+ };
19
+ temporalSupersession: {
20
+ count: number;
21
+ };
22
+ };
23
+ sanitizedContent?: string;
24
+ }
25
+ export interface WriteGateOptions {
26
+ allowSecrets?: boolean;
27
+ minContentLength?: number;
28
+ maxContentLength?: number;
29
+ projectId?: string;
30
+ skipContradictionCheck?: boolean;
31
+ skipTemporalSupersession?: boolean;
32
+ }
33
+ /**
34
+ * Main write gate function - validates and sanitizes content before write
35
+ */
36
+ export declare function enforceWriteGate(content: string, type: string, options?: WriteGateOptions): Promise<WriteGateResult>;
37
+ /**
38
+ * Quick validation without async operations
39
+ * Use for fast pre-check before full validation
40
+ */
41
+ export declare function quickValidate(content: string): {
42
+ valid: boolean;
43
+ errors: string[];
44
+ };
45
+ /**
46
+ * Sanitize content for storage
47
+ * Redacts secrets and normalizes whitespace
48
+ */
49
+ export declare function sanitizeForStorage(content: string): string;
50
+ /**
51
+ * Calculate a quality score for content (0-100)
52
+ */
53
+ export declare function calculateContentQualityScore(content: string): number;
54
+ //# sourceMappingURL=write-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-gate.d.ts","sourceRoot":"","sources":["../../../core/memory/write-gate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAuB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3E,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE;QACR,eAAe,EAAE,MAAM,CAAC;QACxB,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;QAC9B,cAAc,EAAE;YACd,KAAK,EAAE,OAAO,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;QACF,oBAAoB,EAAE;YACpB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAUD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAwG1B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAC9C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAqBA;AA2CD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY1D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkCpE"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Write Gate Enforcement
3
+ * Validates memories before writing to ensure quality, security, and consistency
4
+ * Integrates secret detection, trigger detection, and content validation
5
+ */
6
+ import { detectSecrets, redactSecrets } from '../secret-detector.js';
7
+ import { detectMemorySignals } from './trigger-detector.js';
8
+ import { resolveContradictions } from './contradiction-resolver.js';
9
+ import { logger } from '../logger.js';
10
+ const DEFAULT_OPTIONS = {
11
+ allowSecrets: false,
12
+ minContentLength: 5,
13
+ maxContentLength: 50000,
14
+ skipContradictionCheck: false,
15
+ skipTemporalSupersession: false,
16
+ };
17
+ /**
18
+ * Main write gate function - validates and sanitizes content before write
19
+ */
20
+ export async function enforceWriteGate(content, type, options = {}) {
21
+ const opts = { ...DEFAULT_OPTIONS, ...options };
22
+ const result = {
23
+ allowed: true,
24
+ sanitized: false,
25
+ warnings: [],
26
+ errors: [],
27
+ metadata: {
28
+ secretsDetected: 0,
29
+ signals: null,
30
+ contradictions: { found: false, count: 0 },
31
+ temporalSupersession: { count: 0 },
32
+ },
33
+ };
34
+ let processedContent = content;
35
+ // 1. Content length validation
36
+ if (content.length < opts.minContentLength) {
37
+ result.errors.push(`Content too short (min ${opts.minContentLength} characters)`);
38
+ result.allowed = false;
39
+ return result;
40
+ }
41
+ if (content.length > opts.maxContentLength) {
42
+ result.errors.push(`Content too long (max ${opts.maxContentLength} characters)`);
43
+ result.allowed = false;
44
+ return result;
45
+ }
46
+ // 2. Secret detection
47
+ const secrets = detectSecrets(content, 'high');
48
+ result.metadata.secretsDetected = secrets.length;
49
+ if (secrets.length > 0) {
50
+ const secretTypes = [...new Set(secrets.map(s => s.type))];
51
+ if (!opts.allowSecrets) {
52
+ result.errors.push(`Potential secrets detected: ${secretTypes.join(', ')}`);
53
+ result.warnings.push('Content contains sensitive data that must be redacted');
54
+ result.allowed = false;
55
+ return result;
56
+ }
57
+ else {
58
+ // Redact secrets but allow write
59
+ processedContent = redactSecrets(content);
60
+ result.sanitized = true;
61
+ result.sanitizedContent = processedContent;
62
+ result.warnings.push(`Redacted ${secrets.length} potential secrets: ${secretTypes.join(', ')}`);
63
+ }
64
+ }
65
+ // 3. Memory signals detection
66
+ const signals = detectMemorySignals(content);
67
+ result.metadata.signals = signals;
68
+ // Add warnings for high-priority signals
69
+ if (signals.priority === 'high') {
70
+ result.warnings.push('High-priority memory signal detected');
71
+ }
72
+ if (signals.implicit.correction) {
73
+ result.warnings.push('Content appears to be a correction - contradiction check recommended');
74
+ }
75
+ // 4. Contradiction detection (async, non-blocking for write)
76
+ if (!opts.skipContradictionCheck && signals.implicit.correction) {
77
+ try {
78
+ const contradictionResult = await resolveContradictions(processedContent, type, opts.projectId);
79
+ result.metadata.contradictions = {
80
+ found: contradictionResult.supersededIds.length > 0,
81
+ count: contradictionResult.supersededIds.length,
82
+ };
83
+ if (contradictionResult.supersededIds.length > 0) {
84
+ result.warnings.push(`This memory supersedes ${contradictionResult.supersededIds.length} older memories`);
85
+ }
86
+ }
87
+ catch (error) {
88
+ logger.error('Contradiction check failed', error);
89
+ result.warnings.push('Contradiction check failed - proceeding with write');
90
+ }
91
+ }
92
+ // 5. Temporal fact handling
93
+ if (!opts.skipTemporalSupersession) {
94
+ try {
95
+ // This would be done after the memory is actually written, but we note it here
96
+ result.metadata.temporalSupersession = { count: 0 };
97
+ }
98
+ catch (error) {
99
+ logger.error('Temporal check failed', error);
100
+ }
101
+ }
102
+ // 6. Content quality checks
103
+ const qualityIssues = checkContentQuality(processedContent);
104
+ result.warnings.push(...qualityIssues);
105
+ return result;
106
+ }
107
+ /**
108
+ * Quick validation without async operations
109
+ * Use for fast pre-check before full validation
110
+ */
111
+ export function quickValidate(content) {
112
+ const errors = [];
113
+ // Check for empty or whitespace-only content
114
+ if (!content || content.trim().length === 0) {
115
+ errors.push('Content is empty');
116
+ return { valid: false, errors };
117
+ }
118
+ // Check for minimum length
119
+ if (content.trim().length < 5) {
120
+ errors.push('Content is too short');
121
+ }
122
+ // Check for obvious secrets (high confidence only)
123
+ const secrets = detectSecrets(content, 'high');
124
+ if (secrets.length > 0) {
125
+ errors.push(`Content contains ${secrets.length} potential secrets`);
126
+ }
127
+ return { valid: errors.length === 0, errors };
128
+ }
129
+ /**
130
+ * Check content quality and return warnings
131
+ */
132
+ function checkContentQuality(content) {
133
+ const warnings = [];
134
+ // Check for excessive repetition
135
+ const words = content.toLowerCase().split(/\s+/);
136
+ const wordCounts = new Map();
137
+ for (const word of words) {
138
+ if (word.length > 3) { // Only check meaningful words
139
+ wordCounts.set(word, (wordCounts.get(word) || 0) + 1);
140
+ }
141
+ }
142
+ for (const [word, count] of wordCounts.entries()) {
143
+ if (count > 10) {
144
+ warnings.push(`Excessive repetition detected: "${word}" appears ${count} times`);
145
+ break; // Only report one
146
+ }
147
+ }
148
+ // Check for very long lines (might be code or minified content)
149
+ const lines = content.split('\n');
150
+ for (const line of lines) {
151
+ if (line.length > 1000) {
152
+ warnings.push('Content contains very long lines - may not be human-readable');
153
+ break;
154
+ }
155
+ }
156
+ // Check for binary-like content
157
+ const binaryPattern = /[\x00-\x08\x0E-\x1F]/;
158
+ if (binaryPattern.test(content)) {
159
+ warnings.push('Content may contain binary data');
160
+ }
161
+ return warnings;
162
+ }
163
+ /**
164
+ * Sanitize content for storage
165
+ * Redacts secrets and normalizes whitespace
166
+ */
167
+ export function sanitizeForStorage(content) {
168
+ // Redact secrets
169
+ let sanitized = redactSecrets(content);
170
+ // Normalize excessive whitespace
171
+ sanitized = sanitized.replace(/\n{3,}/g, '\n\n');
172
+ sanitized = sanitized.replace(/ {2,}/g, ' ');
173
+ // Trim
174
+ sanitized = sanitized.trim();
175
+ return sanitized;
176
+ }
177
+ /**
178
+ * Calculate a quality score for content (0-100)
179
+ */
180
+ export function calculateContentQualityScore(content) {
181
+ let score = 100;
182
+ // Deduct for short content
183
+ if (content.length < 20) {
184
+ score -= 30;
185
+ }
186
+ else if (content.length < 50) {
187
+ score -= 15;
188
+ }
189
+ // Deduct for secrets
190
+ const secrets = detectSecrets(content, 'high');
191
+ score -= secrets.length * 20;
192
+ // Deduct for repetition
193
+ const words = content.toLowerCase().split(/\s+/);
194
+ const uniqueWords = new Set(words.filter(w => w.length > 3));
195
+ const repetitionRatio = uniqueWords.size / Math.max(1, words.length);
196
+ if (repetitionRatio < 0.3) {
197
+ score -= 20;
198
+ }
199
+ // Bonus for structure (sentences, punctuation)
200
+ const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 0);
201
+ if (sentences.length > 1) {
202
+ score += 10;
203
+ }
204
+ // Bonus for reasonable length
205
+ if (content.length >= 50 && content.length <= 2000) {
206
+ score += 5;
207
+ }
208
+ return Math.max(0, Math.min(100, score));
209
+ }
210
+ //# sourceMappingURL=write-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-gate.js","sourceRoot":"","sources":["../../../core/memory/write-gate.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,6 @@ export interface ProjectRecord {
7
7
  }
8
8
  export declare function getProjectByPath(path: string): Promise<ProjectRecord | null>;
9
9
  export declare function ensureProject(path?: string): Promise<ProjectRecord | null>;
10
+ export declare function getAllProjects(): Promise<ProjectRecord[]>;
11
+ export declare function getProjectById(id: string): Promise<ProjectRecord | null>;
10
12
  //# sourceMappingURL=projects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../core/projects.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAelF;AAED,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA4BhF"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../core/projects.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAelF;AAED,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA4BhF;AAcD,wBAAsB,cAAc,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAa/D;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAe9E"}
@@ -63,4 +63,37 @@ function normalizeProject(row) {
63
63
  metadata,
64
64
  };
65
65
  }
66
+ export async function getAllProjects() {
67
+ try {
68
+ const db = createDatabaseClient(await getDb());
69
+ const schema = await getSchema();
70
+ const rows = await db.select().from(schema.projects);
71
+ return rows.map(normalizeProject);
72
+ }
73
+ catch (error) {
74
+ if (error.message?.includes('Database unavailable') ||
75
+ error.message?.includes('not a valid Win32 application')) {
76
+ return []; // Graceful degradation - database unavailable
77
+ }
78
+ throw error;
79
+ }
80
+ }
81
+ export async function getProjectById(id) {
82
+ try {
83
+ const db = createDatabaseClient(await getDb());
84
+ const schema = await getSchema();
85
+ const rows = await db.select().from(schema.projects).where(eq(schema.projects.id, id)).limit(1);
86
+ const row = rows[0];
87
+ if (!row)
88
+ return null;
89
+ return normalizeProject(row);
90
+ }
91
+ catch (error) {
92
+ if (error.message?.includes('Database unavailable') ||
93
+ error.message?.includes('not a valid Win32 application')) {
94
+ return null; // Graceful degradation - database unavailable
95
+ }
96
+ throw error;
97
+ }
98
+ }
66
99
  //# sourceMappingURL=projects.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../core/projects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../core/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** Cron Scheduler - Persistent cron-based job scheduling with fallback support */
2
+ export type JobType = 'nightly' | 'weekly' | 'hourly';
3
+ export type JobStatus = 'success' | 'failed' | 'skipped';
4
+ export interface ScheduledJob {
5
+ id: string;
6
+ jobName: string;
7
+ jobType: JobType;
8
+ cronExpression: string;
9
+ enabled: boolean;
10
+ lastRunAt: Date | null;
11
+ nextRunAt: Date | null;
12
+ jobConfig: Record<string, unknown>;
13
+ }
14
+ export interface JobExecutionContext {
15
+ jobId: string;
16
+ jobName: string;
17
+ jobType: JobType;
18
+ config: Record<string, unknown>;
19
+ startedAt: Date;
20
+ }
21
+ export type JobHandler = (context: JobExecutionContext) => Promise<{
22
+ recordsProcessed: number;
23
+ summary: Record<string, unknown>;
24
+ }>;
25
+ export declare function registerJobHandler(jobName: string, handler: JobHandler): void;
26
+ export declare function initializeScheduler(): Promise<void>;
27
+ export declare function scheduleJob(job: ScheduledJob): Promise<void>;
28
+ export declare function executeJob(job: ScheduledJob): Promise<void>;
29
+ export declare function getScheduledJobs(): Promise<ScheduledJob[]>;
30
+ export declare function getOverdueJobs(): Promise<ScheduledJob[]>;
31
+ export declare function stopAllJobs(): void;
32
+ //# sourceMappingURL=cron-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-scheduler.d.ts","sourceRoot":"","sources":["../../../core/scheduler/cron-scheduler.ts"],"names":[],"mappings":"AAAA,kFAAkF;AASlF,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC;AAKnI,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAG7E;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BzD;AAuCD,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoClE;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEjE;AA6BD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAehE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAuB9D;AAED,wBAAgB,WAAW,IAAI,IAAI,CAMlC"}