squish-memory 1.0.2 → 1.1.5

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 (341) hide show
  1. package/.env.example +130 -0
  2. package/CHANGELOG.md +55 -0
  3. package/README.md +150 -287
  4. package/config/hooks/claude-code-hooks.json +39 -0
  5. package/config/hooks/cursor-hooks.json +30 -0
  6. package/config/hooks/opencode-hooks.json +30 -0
  7. package/config/hooks/windsurf-hooks.json +30 -0
  8. package/config/mcp-mode-semantics.json +23 -21
  9. package/config/plugin-manifest.json +101 -152
  10. package/{plugin.json → config/plugin.json} +2 -2
  11. package/config/settings.json +52 -51
  12. package/{commands → core/commands}/init.md +39 -39
  13. package/dist/config.d.ts +28 -4
  14. package/dist/config.js +97 -29
  15. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  16. package/dist/core/adapters/config/claude-code.js +113 -0
  17. package/dist/core/adapters/config/cursor.d.ts +26 -0
  18. package/dist/core/adapters/config/cursor.js +74 -0
  19. package/dist/core/adapters/config/opencode.d.ts +23 -0
  20. package/dist/core/adapters/config/opencode.js +73 -0
  21. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  22. package/dist/core/adapters/config/windsurf.js +74 -0
  23. package/dist/core/adapters/index.d.ts +45 -0
  24. package/dist/core/adapters/index.js +84 -0
  25. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  26. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  27. package/dist/core/adapters/timeline.d.ts +23 -0
  28. package/dist/core/adapters/timeline.js +88 -0
  29. package/dist/core/adapters/types.d.ts +157 -0
  30. package/dist/core/adapters/types.js +50 -0
  31. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  32. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  33. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  34. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  35. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  36. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  37. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  38. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  39. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  40. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  41. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  42. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  43. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  44. package/dist/core/algorithms/index.d.ts +21 -0
  45. package/dist/core/algorithms/index.js +26 -0
  46. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  47. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  48. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +1 -1
  49. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  50. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  51. package/dist/core/algorithms/types.d.ts +133 -0
  52. package/dist/core/algorithms/types.js +5 -0
  53. package/dist/core/associations.d.ts +1 -2
  54. package/dist/core/associations.js +1 -2
  55. package/dist/core/autosave.d.ts +19 -0
  56. package/dist/core/autosave.js +16 -0
  57. package/dist/{commands → core/commands}/managed-sync.js +5 -5
  58. package/dist/core/commands/mcp-server.js +739 -0
  59. package/dist/core/context/agent-context.d.ts +106 -0
  60. package/dist/core/context/agent-context.js +274 -0
  61. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  62. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  63. package/dist/core/context/context-window.d.ts +40 -0
  64. package/dist/core/context/context-window.js +177 -0
  65. package/dist/core/context/context.js +22 -0
  66. package/dist/core/embeddings.d.ts +1 -1
  67. package/dist/core/embeddings.js +54 -2
  68. package/dist/core/error-handling.d.ts +63 -0
  69. package/dist/core/error-handling.js +173 -0
  70. package/dist/core/external-folder/index.d.ts +102 -0
  71. package/dist/core/external-folder/index.js +294 -0
  72. package/dist/core/hooks/agent-hooks.d.ts +74 -0
  73. package/dist/core/hooks/agent-hooks.js +244 -0
  74. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  75. package/dist/core/hooks/auto-tagger.js +155 -0
  76. package/dist/core/hooks/capture-filter.d.ts +41 -0
  77. package/dist/core/hooks/capture-filter.js +128 -0
  78. package/dist/core/index.d.ts +6 -6
  79. package/dist/core/index.js +6 -6
  80. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  81. package/dist/core/{core-memory.js → ingestion/core-memory.js} +4 -4
  82. package/dist/core/ingestion/learnings.d.ts +57 -0
  83. package/dist/core/ingestion/learnings.js +202 -0
  84. package/dist/core/lib/db-client.d.ts +114 -0
  85. package/dist/core/lib/db-client.js +130 -0
  86. package/dist/core/lib/schemas.d.ts +129 -0
  87. package/dist/core/lib/schemas.js +87 -0
  88. package/dist/core/{utils.d.ts → lib/utils.d.ts} +1 -0
  89. package/dist/core/{utils.js → lib/utils.js} +31 -15
  90. package/dist/core/lib/validation.d.ts +38 -0
  91. package/dist/core/lib/validation.js +151 -0
  92. package/dist/core/lifecycle.d.ts +7 -0
  93. package/dist/core/lifecycle.js +140 -20
  94. package/dist/core/local-embeddings.d.ts +6 -1
  95. package/dist/core/local-embeddings.js +6 -15
  96. package/dist/core/logger.js +7 -1
  97. package/dist/core/mcp/tools.js +35 -3
  98. package/dist/core/memory/categorizer.js +1 -0
  99. package/dist/core/memory/conflict-detector.js +1 -1
  100. package/dist/core/memory/consolidation.d.ts +1 -10
  101. package/dist/core/memory/consolidation.js +2 -11
  102. package/dist/core/memory/context-collector.js +1 -1
  103. package/dist/core/memory/edit-workflow.js +1 -1
  104. package/dist/core/memory/entity-resolver.js +7 -7
  105. package/dist/core/memory/fact-extractor.js +12 -12
  106. package/dist/core/memory/feedback-tracker.js +1 -1
  107. package/dist/core/memory/hooks.d.ts +88 -0
  108. package/dist/core/memory/hooks.js +174 -0
  109. package/dist/core/memory/hybrid-retrieval.js +2 -2
  110. package/dist/core/memory/hybrid-search.d.ts +1 -6
  111. package/dist/core/memory/hybrid-search.js +70 -84
  112. package/dist/core/memory/importance.d.ts +8 -13
  113. package/dist/core/memory/importance.js +47 -74
  114. package/dist/core/memory/loader.d.ts +31 -0
  115. package/dist/core/memory/loader.js +141 -0
  116. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  117. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  118. package/dist/core/memory/memories.d.ts +12 -4
  119. package/dist/core/memory/memories.js +192 -180
  120. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  121. package/dist/core/memory/memory-lifecycle.js +55 -0
  122. package/dist/core/memory/migrate.d.ts +21 -0
  123. package/dist/core/memory/migrate.js +134 -0
  124. package/dist/core/memory/normalization.d.ts +22 -0
  125. package/dist/core/memory/normalization.js +26 -0
  126. package/dist/core/memory/progressive-disclosure.js +1 -1
  127. package/dist/core/memory/query-rewriter.js +9 -9
  128. package/dist/core/memory/serialization.d.ts +4 -0
  129. package/dist/core/memory/serialization.js +49 -0
  130. package/dist/core/memory/stats.d.ts +5 -0
  131. package/dist/core/memory/stats.js +63 -12
  132. package/dist/core/memory/temporal-facts.js +21 -0
  133. package/dist/core/memory/write-gate.js +1 -1
  134. package/dist/core/obsidian-vault.d.ts +30 -0
  135. package/dist/core/obsidian-vault.js +94 -0
  136. package/dist/core/places/index.d.ts +14 -0
  137. package/dist/core/places/index.js +14 -0
  138. package/dist/core/places/memory-places.d.ts +68 -0
  139. package/dist/core/places/memory-places.js +261 -0
  140. package/dist/core/places/places.d.ts +88 -0
  141. package/dist/core/places/places.js +314 -0
  142. package/dist/core/places/rules.d.ts +74 -0
  143. package/dist/core/places/rules.js +240 -0
  144. package/dist/core/places/walking.d.ts +56 -0
  145. package/dist/core/places/walking.js +121 -0
  146. package/dist/core/projects.d.ts +5 -0
  147. package/dist/core/projects.js +39 -18
  148. package/dist/core/responses.d.ts +96 -0
  149. package/dist/core/responses.js +122 -0
  150. package/dist/core/scheduler/cron-scheduler.js +29 -7
  151. package/dist/core/scheduler/index.d.ts +1 -1
  152. package/dist/core/scheduler/index.js +1 -1
  153. package/dist/core/scheduler/job-runner.js +1 -1
  154. package/dist/core/search/conversations.js +40 -42
  155. package/dist/core/search/entities.js +6 -9
  156. package/dist/core/search/graph-boost.d.ts +7 -0
  157. package/dist/core/search/graph-boost.js +23 -0
  158. package/dist/core/search/qmd-search.js +4 -4
  159. package/dist/core/security/encrypt.d.ts +6 -0
  160. package/dist/core/security/encrypt.js +47 -0
  161. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  162. package/dist/core/security/governance.js +79 -0
  163. package/dist/core/session/auto-load.js +6 -6
  164. package/dist/core/session/index.d.ts +1 -1
  165. package/dist/core/session/index.js +1 -1
  166. package/dist/core/session/self-iteration-job.d.ts +20 -0
  167. package/dist/core/session/self-iteration-job.js +282 -0
  168. package/dist/core/session/session-hooks.d.ts +18 -0
  169. package/dist/core/session/session-hooks.js +58 -0
  170. package/dist/core/session-hooks/self-iteration-job.js +35 -35
  171. package/dist/core/{cache.js → storage/cache.js} +2 -2
  172. package/dist/core/sync/qmd-sync.d.ts +1 -13
  173. package/dist/core/sync/qmd-sync.js +1 -13
  174. package/dist/core/toon.d.ts +43 -0
  175. package/dist/core/toon.js +160 -0
  176. package/dist/core/utils/memory-operations.js +1 -1
  177. package/dist/core/utils/vector-operations.d.ts +71 -0
  178. package/dist/core/utils/vector-operations.js +129 -0
  179. package/dist/db/adapter.d.ts +3 -3
  180. package/dist/db/adapter.js +99 -88
  181. package/dist/db/bootstrap.js +820 -522
  182. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +74 -25
  183. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +91 -24
  184. package/dist/{drizzle → db/drizzle}/schema.d.ts +79 -32
  185. package/dist/{drizzle → db/drizzle}/schema.js +106 -35
  186. package/dist/db/drizzle.config.d.ts +3 -0
  187. package/dist/db/drizzle.config.js +12 -0
  188. package/dist/db/index.d.ts +1 -5
  189. package/dist/db/index.js +51 -8
  190. package/dist/db/neon.d.ts +8 -0
  191. package/dist/db/neon.js +20 -0
  192. package/dist/db/schema/index.d.ts +40 -0
  193. package/dist/db/schema/index.js +105 -0
  194. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  195. package/dist/db/schema/tables/context-sessions.js +37 -0
  196. package/dist/db/schema/tables/conversations.d.ts +9 -0
  197. package/dist/db/schema/tables/conversations.js +47 -0
  198. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  199. package/dist/db/schema/tables/core-memory.js +41 -0
  200. package/dist/db/schema/tables/entities.d.ts +9 -0
  201. package/dist/db/schema/tables/entities.js +39 -0
  202. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  203. package/dist/db/schema/tables/entity-relations.js +31 -0
  204. package/dist/db/schema/tables/learnings.d.ts +9 -0
  205. package/dist/db/schema/tables/learnings.js +66 -0
  206. package/dist/db/schema/tables/memories.d.ts +9 -0
  207. package/dist/db/schema/tables/memories.js +161 -0
  208. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  209. package/dist/db/schema/tables/memory-associations.js +39 -0
  210. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  211. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  212. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  213. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  214. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  215. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  216. package/dist/db/schema/tables/messages.d.ts +9 -0
  217. package/dist/db/schema/tables/messages.js +41 -0
  218. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  219. package/dist/db/schema/tables/namespaces.js +37 -0
  220. package/dist/db/schema/tables/projects.d.ts +9 -0
  221. package/dist/db/schema/tables/projects.js +31 -0
  222. package/dist/db/schema/tables/users.d.ts +9 -0
  223. package/dist/db/schema/tables/users.js +27 -0
  224. package/dist/db/schema.d.ts +1 -1
  225. package/dist/db/schema.js +2 -2
  226. package/dist/db/supabase.d.ts +9 -0
  227. package/dist/db/supabase.js +24 -0
  228. package/dist/index.d.ts +2 -14
  229. package/dist/index.js +1320 -640
  230. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  231. package/dist/webui/server.d.ts +5 -0
  232. package/dist/{api/web/web.js → webui/server.js} +511 -508
  233. package/generated/mcp/manifest.json +1 -1
  234. package/{.mcp.json → mcp.json.example} +1 -1
  235. package/package.json +159 -181
  236. package/scripts/README.md +60 -0
  237. package/scripts/copy-runtime-assets.mjs +26 -0
  238. package/scripts/generate-mcp.mjs +264 -264
  239. package/scripts/github-release.sh +4 -4
  240. package/scripts/install-claude-code.sh +85 -0
  241. package/scripts/install-cursor.sh +56 -0
  242. package/scripts/install-hooks.sh +73 -0
  243. package/scripts/install-interactive.mjs +357 -677
  244. package/scripts/install-opencode.sh +75 -0
  245. package/scripts/install-windsurf.sh +67 -0
  246. package/skills/squish-memory/SKILL.md +104 -114
  247. package/skills/squish-memory/{install.mjs → scripts/install.mjs} +2 -2
  248. package/skills/squish-memory/{install.sh → scripts/install.sh} +2 -2
  249. package/skills/squish-memory/write_skill.js +2 -0
  250. package/.claude-plugin/marketplace.json +0 -20
  251. package/.claude-plugin/plugin.json +0 -32
  252. package/.env.mcp.example +0 -60
  253. package/QUICK-START.md +0 -71
  254. package/bin/squish-add.mjs +0 -32
  255. package/bin/squish-rm.mjs +0 -21
  256. package/commands/observe.md +0 -5
  257. package/dist/api/web/index.d.ts +0 -3
  258. package/dist/api/web/index.js +0 -4
  259. package/dist/api/web/web-server.d.ts +0 -3
  260. package/dist/api/web/web-server.js +0 -6
  261. package/dist/api/web/web.d.ts +0 -4
  262. package/dist/commands/mcp-server.js +0 -393
  263. package/dist/core/context.js +0 -24
  264. package/dist/core/governance.js +0 -64
  265. package/dist/core/observations.d.ts +0 -26
  266. package/dist/core/observations.js +0 -110
  267. package/dist/core/requirements.d.ts +0 -20
  268. package/dist/core/requirements.js +0 -35
  269. package/hooks/hooks.json +0 -52
  270. package/hooks/post-tool-use.js +0 -26
  271. package/hooks/session-end.js +0 -28
  272. package/hooks/session-start.js +0 -33
  273. package/hooks/user-prompt-submit.js +0 -26
  274. package/hooks/utils.js +0 -153
  275. package/npx-installer.js +0 -208
  276. package/packages/plugin-claude-code/README.md +0 -73
  277. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  278. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  279. package/packages/plugin-claude-code/package.json +0 -31
  280. package/packages/plugin-openclaw/README.md +0 -70
  281. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  282. package/packages/plugin-openclaw/dist/index.js +0 -262
  283. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  284. package/packages/plugin-openclaw/package.json +0 -31
  285. package/packages/plugin-opencode/install.mjs +0 -217
  286. package/packages/plugin-opencode/package.json +0 -21
  287. package/scripts/db/check-db.mjs +0 -88
  288. package/scripts/db/fix-all-columns.mjs +0 -52
  289. package/scripts/db/fix-schema-all.mjs +0 -55
  290. package/scripts/db/fix-schema-full.mjs +0 -46
  291. package/scripts/db/fix-schema.mjs +0 -38
  292. package/scripts/db/init-db.mjs +0 -13
  293. package/scripts/db/recreate-db.mjs +0 -14
  294. package/scripts/install-mcp.mjs +0 -116
  295. package/scripts/install-web.sh +0 -120
  296. package/scripts/install.mjs +0 -340
  297. package/scripts/openclaw-bootstrap.mjs +0 -127
  298. package/scripts/package-release.sh +0 -71
  299. package/scripts/test/test-all-systems.mjs +0 -139
  300. package/scripts/test/test-memory-system.mjs +0 -139
  301. package/scripts/test/test-v0.5.0.mjs +0 -210
  302. package/skills/memory-guide/SKILL.md +0 -332
  303. package/skills/squish-cli/SKILL.md +0 -240
  304. package/skills/squish-mcp/SKILL.md +0 -355
  305. package/skills/squish-memory/claude-desktop.json +0 -12
  306. package/skills/squish-memory/openclaw.json +0 -13
  307. package/skills/squish-memory/opencode.json +0 -14
  308. package/skills/squish-memory/skill.json +0 -32
  309. /package/{commands → core/commands}/context-paging.md +0 -0
  310. /package/{commands → core/commands}/context-status.md +0 -0
  311. /package/{commands → core/commands}/context.md +0 -0
  312. /package/{commands → core/commands}/core-memory.md +0 -0
  313. /package/{commands → core/commands}/health.md +0 -0
  314. /package/{commands → core/commands}/merge.md +0 -0
  315. /package/{commands → core/commands}/recall.md +0 -0
  316. /package/{commands → core/commands}/remember.md +0 -0
  317. /package/{commands → core/commands}/search.md +0 -0
  318. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  319. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  320. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  321. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  322. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  323. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  324. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  325. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  326. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  327. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  328. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  329. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  330. /package/dist/{commands → core/commands}/managed-sync.d.ts +0 -0
  331. /package/dist/{commands → core/commands}/mcp-server.d.ts +0 -0
  332. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  333. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  334. /package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +0 -0
  335. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  336. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  337. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  338. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  339. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  340. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  341. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Auto-Tagger - Infer tags from context
3
+ *
4
+ * Analyzes tool input/output to automatically infer relevant tags.
5
+ * Uses pattern matching to classify actions.
6
+ */
7
+ /**
8
+ * Infer tags based on tool, input, and content
9
+ */
10
+ export function inferTags(toolName, toolInput, content) {
11
+ const tags = ['hook', 'autocapture']; // Always add these
12
+ const tool = toolName.toLowerCase();
13
+ const inputStr = JSON.stringify(toolInput).toLowerCase();
14
+ const contentLower = content.toLowerCase();
15
+ // File type tags
16
+ if (tool === 'write' || tool === 'edit') {
17
+ const filePath = String(toolInput.filePath || toolInput.path || '');
18
+ if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
19
+ tags.push('typescript');
20
+ }
21
+ else if (filePath.endsWith('.js') || filePath.endsWith('.jsx')) {
22
+ tags.push('javascript');
23
+ }
24
+ else if (filePath.endsWith('.json')) {
25
+ tags.push('config');
26
+ }
27
+ else if (filePath.endsWith('.md')) {
28
+ tags.push('documentation');
29
+ }
30
+ else if (filePath.endsWith('.test.ts') || filePath.endsWith('.spec.ts')) {
31
+ tags.push('test');
32
+ }
33
+ // Feature/fix detection
34
+ if (contentLower.includes('fix') || contentLower.includes('bug')) {
35
+ tags.push('bugfix');
36
+ }
37
+ else if (contentLower.includes('refactor')) {
38
+ tags.push('refactor');
39
+ }
40
+ else if (contentLower.includes('feature') || contentLower.includes('add')) {
41
+ tags.push('feature');
42
+ }
43
+ else if (contentLower.includes('test')) {
44
+ tags.push('testing');
45
+ }
46
+ }
47
+ // Bash command tags
48
+ if (tool === 'bash') {
49
+ const cmd = String(toolInput.command || toolInput.cmd || '');
50
+ if (cmd.includes('git commit')) {
51
+ tags.push('commit', 'version-control');
52
+ }
53
+ else if (cmd.includes('test') || cmd.includes('jest') || cmd.includes('vitest')) {
54
+ tags.push('testing', 'test');
55
+ }
56
+ else if (cmd.includes('build') || cmd.includes('compile')) {
57
+ tags.push('build');
58
+ }
59
+ else if (cmd.includes('install')) {
60
+ tags.push('dependencies');
61
+ }
62
+ else if (cmd.includes('lint') || cmd.includes('format')) {
63
+ tags.push('linting');
64
+ }
65
+ }
66
+ // Task tags
67
+ if (tool === 'task' || tool === 'todowrite') {
68
+ tags.push('task', 'planning');
69
+ if (contentLower.includes('fix') || contentLower.includes('bug')) {
70
+ tags.push('bugfix');
71
+ }
72
+ else if (contentLower.includes('feature')) {
73
+ tags.push('feature');
74
+ }
75
+ else if (contentLower.includes('refactor')) {
76
+ tags.push('refactor');
77
+ }
78
+ }
79
+ // Deduplicate
80
+ return [...new Set(tags)];
81
+ }
82
+ /**
83
+ * Extract tags from commit message
84
+ */
85
+ export function extractCommitTags(commitMessage) {
86
+ const tags = ['commit'];
87
+ const msg = commitMessage.toLowerCase();
88
+ // Conventional commits
89
+ if (msg.startsWith('feat:') || msg.includes('feature')) {
90
+ tags.push('feature', 'conventional-commit');
91
+ }
92
+ else if (msg.startsWith('fix:') || msg.includes('bugfix')) {
93
+ tags.push('bugfix', 'conventional-commit');
94
+ }
95
+ else if (msg.startsWith('refactor:')) {
96
+ tags.push('refactor', 'conventional-commit');
97
+ }
98
+ else if (msg.startsWith('docs:')) {
99
+ tags.push('documentation', 'conventional-commit');
100
+ }
101
+ else if (msg.startsWith('test:')) {
102
+ tags.push('testing', 'conventional-commit');
103
+ }
104
+ else if (msg.startsWith('chore:')) {
105
+ tags.push('chore', 'conventional-commit');
106
+ }
107
+ return tags;
108
+ }
109
+ /**
110
+ * Extract tags from file path
111
+ */
112
+ export function extractFileTags(filePath) {
113
+ const tags = [];
114
+ const path = filePath.toLowerCase();
115
+ // By extension
116
+ if (path.endsWith('.ts') || path.endsWith('.tsx')) {
117
+ tags.push('typescript');
118
+ }
119
+ else if (path.endsWith('.js') || path.endsWith('.jsx')) {
120
+ tags.push('javascript');
121
+ }
122
+ else if (path.endsWith('.py')) {
123
+ tags.push('python');
124
+ }
125
+ else if (path.endsWith('.go')) {
126
+ tags.push('golang');
127
+ }
128
+ else if (path.endsWith('.rs')) {
129
+ tags.push('rust');
130
+ }
131
+ else if (path.endsWith('.java')) {
132
+ tags.push('java');
133
+ }
134
+ else if (path.endsWith('.json')) {
135
+ tags.push('config');
136
+ }
137
+ else if (path.endsWith('.md')) {
138
+ tags.push('documentation');
139
+ }
140
+ // By directory pattern
141
+ if (path.includes('/test') || path.includes('/tests') || path.includes('__tests__')) {
142
+ tags.push('test');
143
+ }
144
+ else if (path.includes('/src/')) {
145
+ tags.push('source');
146
+ }
147
+ else if (path.includes('/lib/') || path.includes('/utils/')) {
148
+ tags.push('library');
149
+ }
150
+ else if (path.includes('/config/') || path.includes('/scripts/')) {
151
+ tags.push('config');
152
+ }
153
+ return tags;
154
+ }
155
+ //# sourceMappingURL=auto-tagger.js.map
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Capture Filter - Smart filtering of tool usage
3
+ *
4
+ * Don't capture everything - filter out noise.
5
+ * Only capture meaningful actions that warrant memory.
6
+ */
7
+ /** Tool categories for capture */
8
+ export type ToolCategory = 'reading' | 'modification' | 'command' | 'commit' | 'testing' | 'search' | 'planning' | 'other';
9
+ /** Capture decision */
10
+ export interface CaptureDecision {
11
+ shouldCapture: boolean;
12
+ reason?: string;
13
+ priority: 'high' | 'medium' | 'low';
14
+ }
15
+ /**
16
+ * Check if a tool should be captured
17
+ *
18
+ * Rules:
19
+ * - Write, Edit, MultiEdit → capture (modification)
20
+ * - Bash with commit → capture (commit)
21
+ * - Bash with test → capture (testing)
22
+ * - Task → capture (planning)
23
+ * - Read, Glob, grep → skip (reading - too noisy)
24
+ */
25
+ export declare function shouldCaptureTool(toolName: string): boolean;
26
+ /**
27
+ * Get detailed capture decision
28
+ */
29
+ export declare function getCaptureDecision(toolName: string): CaptureDecision;
30
+ /**
31
+ * Check if Bash command should be captured based on content
32
+ */
33
+ export declare function shouldCaptureBashCommand(command: string): {
34
+ capture: boolean;
35
+ reason: string;
36
+ };
37
+ /**
38
+ * Categorize tool for tagging
39
+ */
40
+ export declare function categorizeTool(toolName: string): ToolCategory;
41
+ //# sourceMappingURL=capture-filter.d.ts.map
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Capture Filter - Smart filtering of tool usage
3
+ *
4
+ * Don't capture everything - filter out noise.
5
+ * Only capture meaningful actions that warrant memory.
6
+ */
7
+ /**
8
+ * Check if a tool should be captured
9
+ *
10
+ * Rules:
11
+ * - Write, Edit, MultiEdit → capture (modification)
12
+ * - Bash with commit → capture (commit)
13
+ * - Bash with test → capture (testing)
14
+ * - Task → capture (planning)
15
+ * - Read, Glob, grep → skip (reading - too noisy)
16
+ */
17
+ export function shouldCaptureTool(toolName) {
18
+ const decision = getCaptureDecision(toolName);
19
+ return decision.shouldCapture;
20
+ }
21
+ /**
22
+ * Get detailed capture decision
23
+ */
24
+ export function getCaptureDecision(toolName) {
25
+ const tool = toolName.toLowerCase();
26
+ // High priority - always capture
27
+ if (['write', 'edit', 'multiedit'].includes(tool)) {
28
+ return {
29
+ shouldCapture: true,
30
+ reason: 'File modification',
31
+ priority: 'high',
32
+ };
33
+ }
34
+ // Command with specific patterns
35
+ if (tool === 'bash') {
36
+ // Let the caller check the command for commit/test patterns
37
+ return {
38
+ shouldCapture: true, // Will be filtered by content check
39
+ reason: 'Command execution',
40
+ priority: 'medium',
41
+ };
42
+ }
43
+ // Task operations
44
+ if (['task', 'todowrite'].includes(tool)) {
45
+ return {
46
+ shouldCapture: true,
47
+ reason: 'Task/planning activity',
48
+ priority: 'high',
49
+ };
50
+ }
51
+ // Skip noisy tools
52
+ if (['read', 'glob', 'grep', 'websearch', 'webfetch', 'codesearch'].includes(tool)) {
53
+ return {
54
+ shouldCapture: false,
55
+ reason: 'Reading/search tool - too noisy',
56
+ priority: 'low',
57
+ };
58
+ }
59
+ // Skip other common noise
60
+ if (['bash'].includes(tool)) {
61
+ return {
62
+ shouldCapture: false, // Too noisy without filtering
63
+ reason: 'General command - filtered',
64
+ priority: 'low',
65
+ };
66
+ }
67
+ // Default: don't capture unknown tools
68
+ return {
69
+ shouldCapture: false,
70
+ reason: 'Unknown tool',
71
+ priority: 'low',
72
+ };
73
+ }
74
+ /**
75
+ * Check if Bash command should be captured based on content
76
+ */
77
+ export function shouldCaptureBashCommand(command) {
78
+ const cmd = command.toLowerCase();
79
+ // Git commits - HIGH priority
80
+ if (cmd.includes('git commit') || cmd.includes('git add') && cmd.includes('git commit')) {
81
+ return { capture: true, reason: 'Git commit' };
82
+ }
83
+ // Tests - HIGH priority
84
+ if (cmd.includes('test') || cmd.includes('jest') || cmd.includes('vitest') ||
85
+ cmd.includes('pytest') || cmd.includes('bun test')) {
86
+ return { capture: true, reason: 'Test execution' };
87
+ }
88
+ // Build/compile - MEDIUM priority
89
+ if (cmd.includes('build') || cmd.includes('compile') || cmd.includes('tsc') ||
90
+ cmd.includes('bun build') || cmd.includes('npm run build')) {
91
+ return { capture: true, reason: 'Build/compile' };
92
+ }
93
+ // Installation - LOW priority
94
+ if (cmd.includes('npm install') || cmd.includes('bun install') ||
95
+ cmd.includes('pip install') || cmd.includes('yarn add')) {
96
+ return { capture: false, reason: 'Package installation - too noisy' };
97
+ }
98
+ // Git operations (non-commit) - LOW priority
99
+ if (cmd.includes('git') && !cmd.includes('commit')) {
100
+ return { capture: false, reason: 'Git operations - not commits' };
101
+ }
102
+ // File operations - MEDIUM priority
103
+ if (cmd.includes('mkdir') || cmd.includes('touch') || cmd.includes('rm ')) {
104
+ return { capture: true, reason: 'File operation' };
105
+ }
106
+ // Default - don't capture
107
+ return { capture: false, reason: 'General command' };
108
+ }
109
+ /**
110
+ * Categorize tool for tagging
111
+ */
112
+ export function categorizeTool(toolName) {
113
+ const tool = toolName.toLowerCase();
114
+ if (['write', 'edit', 'multiedit'].includes(tool)) {
115
+ return 'modification';
116
+ }
117
+ if (tool === 'bash') {
118
+ return 'command';
119
+ }
120
+ if (['read', 'glob', 'grep', 'websearch', 'webfetch'].includes(tool)) {
121
+ return 'reading';
122
+ }
123
+ if (['task', 'todowrite', 'todo-read'].includes(tool)) {
124
+ return 'planning';
125
+ }
126
+ return 'other';
127
+ }
128
+ //# sourceMappingURL=capture-filter.js.map
@@ -1,10 +1,10 @@
1
- export * from './cache.js';
2
- export * from './context.js';
3
- export * from './database.js';
1
+ export * from './storage/cache.js';
2
+ export * from './context/context.js';
3
+ export * from './storage/database.js';
4
4
  export * from './embeddings.js';
5
- export * from './observations.js';
6
- export * from './privacy.js';
5
+ export * from './ingestion/learnings.js';
6
+ export * from './security/privacy.js';
7
7
  export * from './projects.js';
8
- export * from './secret-detector.js';
8
+ export * from './security/secret-detector.js';
9
9
  export * from './worker.js';
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1,14 +1,14 @@
1
1
  // Shared services - Core utilities and services
2
- export * from './cache.js';
3
- export * from './context.js';
4
- export * from './database.js';
2
+ export * from './storage/cache.js';
3
+ export * from './context/context.js';
4
+ export * from './storage/database.js';
5
5
  export * from './embeddings.js';
6
6
  // Note: local-embeddings exports duplicate of embeddings, import directly when needed
7
7
  // export * from './local-embeddings.js';
8
- export * from './observations.js';
9
- export * from './privacy.js';
8
+ export * from './ingestion/learnings.js';
9
+ export * from './security/privacy.js';
10
10
  export * from './projects.js';
11
11
  // Note: redis exports duplicates of cache, import directly when needed
12
- export * from './secret-detector.js';
12
+ export * from './security/secret-detector.js';
13
13
  export * from './worker.js';
14
14
  //# sourceMappingURL=index.js.map
@@ -4,11 +4,11 @@
4
4
  */
5
5
  import { and, eq } from 'drizzle-orm';
6
6
  import { randomUUID } from 'crypto';
7
- import { getDb } from '../db/index.js';
8
- import { getSchema } from '../db/schema.js';
9
- import { config } from '../config.js';
10
- import { getEmbedding } from './embeddings.js';
11
- import { logger } from './logger.js';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+ import { config } from '../../config.js';
10
+ import { getEmbedding } from '../embeddings.js';
11
+ import { logger } from '../logger.js';
12
12
  /**
13
13
  * Store a memory with agent context
14
14
  */
@@ -53,9 +53,7 @@ export async function storeAgentMemory(content, context, options = {}) {
53
53
  throw error;
54
54
  }
55
55
  }
56
- // ============================================================================
57
56
  // Helper Functions
58
- // ============================================================================
59
57
  function calculateReadScope(context, visibility) {
60
58
  switch (visibility) {
61
59
  case 'private':
@@ -5,10 +5,10 @@
5
5
  * This memory is automatically injected into every agent interaction.
6
6
  */
7
7
  import { eq, and, sql } from 'drizzle-orm';
8
- import { getDb } from '../db/index.js';
9
- import { getSchema } from '../db/schema.js';
10
- import { createDatabaseClient } from './database.js';
11
- import config from '../config.js';
8
+ import { getDb } from '../../db/index.js';
9
+ import { getSchema } from '../../db/schema.js';
10
+ import { createDatabaseClient } from '../storage/database.js';
11
+ import config from '../../config.js';
12
12
  // Use configurable limits from environment
13
13
  const MAX_TOTAL_SIZE_BYTES = config.coreMemoryTotalBytes;
14
14
  const MAX_SECTION_SIZE_BYTES = config.coreMemorySectionBytes;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Learnings Module
3
+ * Agent learnings: success, failure, fix, insight
4
+ * With auto-linking to similar memories and learnings
5
+ */
6
+ export type LearningType = 'success' | 'failure' | 'fix' | 'insight';
7
+ export interface LearningInput {
8
+ type: LearningType;
9
+ content: string;
10
+ context?: string;
11
+ action?: string;
12
+ target?: string;
13
+ project?: string;
14
+ memoryId?: string;
15
+ autoLink?: boolean;
16
+ }
17
+ export interface LearningRecord {
18
+ id: string;
19
+ projectId?: string | null;
20
+ conversationId?: string | null;
21
+ type: LearningType;
22
+ action: string;
23
+ target?: string | null;
24
+ summary: string;
25
+ details?: Record<string, unknown> | null;
26
+ memoryId?: string | null;
27
+ isImported?: boolean;
28
+ createdAt?: string | null;
29
+ }
30
+ /**
31
+ * Create a learning and optionally auto-link to similar memories/learnings
32
+ */
33
+ export declare function createLearning(input: LearningInput): Promise<LearningRecord>;
34
+ /**
35
+ * Get learnings for a project
36
+ */
37
+ export declare function getLearnings(projectPath: string, limit: number): Promise<LearningRecord[]>;
38
+ /**
39
+ * Get recent learnings
40
+ */
41
+ export declare function getRecentLearnings(projectPath: string, limit?: number): Promise<LearningRecord[]>;
42
+ /**
43
+ * Get learning by ID
44
+ */
45
+ export declare function getLearningById(learningId: string): Promise<LearningRecord | null>;
46
+ /**
47
+ * Get learnings linked to a specific memory
48
+ */
49
+ export declare function getLearningsForMemory(memoryId: string): Promise<LearningRecord[]>;
50
+ /**
51
+ * Delete a learning
52
+ */
53
+ export declare function deleteLearning(learningId: string): Promise<boolean>;
54
+ export declare const getObservations: typeof getLearnings;
55
+ export declare const getRecentObservations: typeof getRecentLearnings;
56
+ export declare const getObservationById: typeof getLearningById;
57
+ //# sourceMappingURL=learnings.d.ts.map
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Learnings Module
3
+ * Agent learnings: success, failure, fix, insight
4
+ * With auto-linking to similar memories and learnings
5
+ */
6
+ import { randomUUID } from 'crypto';
7
+ import { desc, eq } from 'drizzle-orm';
8
+ import { getEmbedding } from '../embeddings.js';
9
+ import { getOrCreateProject, requireProject } from '../projects.js';
10
+ import { serializeMetadata, deserializeMetadata } from '../memory/serialization.js';
11
+ import { normalizeTimestamp, prepareEmbedding } from '../lib/utils.js';
12
+ import { logger } from '../logger.js';
13
+ import { getDbClient } from '../lib/db-client.js';
14
+ import { createAssociation } from '../associations.js';
15
+ import { search } from '../memory/memories.js';
16
+ /**
17
+ * Create a learning and optionally auto-link to similar memories/learnings
18
+ */
19
+ export async function createLearning(input) {
20
+ const { db, schema } = await getDbClient();
21
+ const project = await getOrCreateProject(input.project);
22
+ const embedding = await getEmbedding(input.content);
23
+ const id = randomUUID();
24
+ const learningType = input.type;
25
+ const autoLink = input.autoLink !== false; // default true
26
+ // Build details with learning metadata
27
+ const details = serializeMetadata({
28
+ learningType: learningType,
29
+ learningContent: input.content,
30
+ learningContext: input.context,
31
+ });
32
+ const embeddingValues = prepareEmbedding(embedding);
33
+ // Insert the learning
34
+ await db.insert(schema.learnings).values({
35
+ id,
36
+ projectId: project?.id ?? null,
37
+ type: learningType,
38
+ action: input.action ?? input.content,
39
+ summary: input.context || input.content,
40
+ target: input.target ?? null,
41
+ details,
42
+ memoryId: input.memoryId ?? null,
43
+ ...embeddingValues,
44
+ createdAt: new Date(),
45
+ });
46
+ // If memoryId provided, create bidirectional link
47
+ if (input.memoryId) {
48
+ await createAssociation(input.memoryId, // from memory
49
+ id, // to learning
50
+ 'relates_to', 1);
51
+ }
52
+ // Auto-link to similar memories and learnings (if enabled)
53
+ if (autoLink) {
54
+ await autoLinkLearning(id, input.content, project?.id ?? null);
55
+ }
56
+ return {
57
+ id,
58
+ projectId: project?.id ?? null,
59
+ conversationId: null,
60
+ type: learningType,
61
+ action: input.action ?? input.content,
62
+ target: input.target ?? null,
63
+ summary: input.context || input.content,
64
+ details: { learningType: learningType, learningContent: input.content, learningContext: input.context },
65
+ memoryId: input.memoryId ?? null,
66
+ createdAt: new Date().toISOString(),
67
+ };
68
+ }
69
+ /**
70
+ * Auto-link a learning to similar memories above threshold
71
+ */
72
+ async function autoLinkLearning(learningId, content, projectId) {
73
+ const SIMILARITY_THRESHOLD = 0.85;
74
+ const MAX_LINKS = 5;
75
+ if (!projectId)
76
+ return;
77
+ try {
78
+ // Search for similar memories using the search function
79
+ const similarMemories = await search({
80
+ query: content,
81
+ limit: MAX_LINKS,
82
+ });
83
+ // Filter by similarity threshold
84
+ const relevantMemories = similarMemories.filter((m) => (m.similarity ?? 0) >= SIMILARITY_THRESHOLD);
85
+ // Create associations with memories
86
+ for (const mem of relevantMemories) {
87
+ await createAssociation(learningId, // from learning
88
+ mem.id, // to memory
89
+ 'relates_to', mem.similarity ?? 0.9);
90
+ }
91
+ logger.info(`Auto-linked learning ${learningId} to ${relevantMemories.length} memories`);
92
+ }
93
+ catch (error) {
94
+ logger.error('Error in auto-linking:', error);
95
+ // Don't fail learning creation if auto-link fails
96
+ }
97
+ }
98
+ /**
99
+ * Get learnings for a project
100
+ */
101
+ export async function getLearnings(projectPath, limit) {
102
+ try {
103
+ const { db, schema } = await getDbClient();
104
+ const project = await requireProject(projectPath);
105
+ const rows = await db.select().from(schema.learnings)
106
+ .where(eq(schema.learnings.projectId, project.id))
107
+ .orderBy(desc(schema.learnings.createdAt))
108
+ .limit(limit);
109
+ return rows.map((row) => normalizeLearning(row));
110
+ }
111
+ catch (error) {
112
+ throw error;
113
+ }
114
+ }
115
+ /**
116
+ * Get recent learnings
117
+ */
118
+ export async function getRecentLearnings(projectPath, limit = 10) {
119
+ try {
120
+ const { db, schema } = await getDbClient();
121
+ const project = await requireProject(projectPath);
122
+ const rows = await db.select().from(schema.learnings)
123
+ .where(eq(schema.learnings.projectId, project.id))
124
+ .orderBy(desc(schema.learnings.createdAt))
125
+ .limit(limit);
126
+ return rows.map((row) => normalizeLearning(row));
127
+ }
128
+ catch (error) {
129
+ logger.error('Error getting recent learnings', error);
130
+ throw error;
131
+ }
132
+ }
133
+ /**
134
+ * Get learning by ID
135
+ */
136
+ export async function getLearningById(learningId) {
137
+ try {
138
+ const { db, schema } = await getDbClient();
139
+ const rows = await db.select().from(schema.learnings)
140
+ .where(eq(schema.learnings.id, learningId))
141
+ .limit(1);
142
+ if (rows.length === 0)
143
+ return null;
144
+ return normalizeLearning(rows[0]);
145
+ }
146
+ catch (error) {
147
+ logger.error('Error getting learning', error);
148
+ throw error;
149
+ }
150
+ }
151
+ /**
152
+ * Get learnings linked to a specific memory
153
+ */
154
+ export async function getLearningsForMemory(memoryId) {
155
+ try {
156
+ const { db, schema } = await getDbClient();
157
+ const rows = await db.select().from(schema.learnings)
158
+ .where(eq(schema.learnings.memoryId, memoryId))
159
+ .orderBy(desc(schema.learnings.createdAt));
160
+ return rows.map((row) => normalizeLearning(row));
161
+ }
162
+ catch (error) {
163
+ logger.error('Error getting learnings for memory', error);
164
+ throw error;
165
+ }
166
+ }
167
+ /**
168
+ * Delete a learning
169
+ */
170
+ export async function deleteLearning(learningId) {
171
+ try {
172
+ const { db, schema } = await getDbClient();
173
+ await db.delete(schema.learnings)
174
+ .where(eq(schema.learnings.id, learningId));
175
+ return true;
176
+ }
177
+ catch (error) {
178
+ logger.error('Error deleting learning', error);
179
+ return false;
180
+ }
181
+ }
182
+ function normalizeLearning(row) {
183
+ const details = deserializeMetadata(row.details ?? null);
184
+ return {
185
+ id: row.id,
186
+ projectId: row.projectId ?? row.project_id ?? null,
187
+ conversationId: row.conversationId ?? row.conversation_id ?? null,
188
+ type: row.type,
189
+ action: row.action,
190
+ target: row.target ?? null,
191
+ summary: row.summary,
192
+ details,
193
+ memoryId: row.memoryId ?? row.memory_id ?? null,
194
+ isImported: row.isImported ?? row.is_imported ?? false,
195
+ createdAt: normalizeTimestamp(row.createdAt ?? row.created_at),
196
+ };
197
+ }
198
+ // Backwards compatibility aliases
199
+ export const getObservations = getLearnings;
200
+ export const getRecentObservations = getRecentLearnings;
201
+ export const getObservationById = getLearningById;
202
+ //# sourceMappingURL=learnings.js.map