toolnet-memory 0.2.0 → 0.2.2

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/README.md +443 -70
  2. package/bin/toolnet-memory +66 -53
  3. package/bundle/agy.js +88 -0
  4. package/bundle/codex.js +92 -0
  5. package/bundle/context-runtime.js +56 -0
  6. package/bundle/context.js +62 -0
  7. package/bundle/doctor.js +3 -0
  8. package/bundle/full-index.js +8 -0
  9. package/bundle/learner.js +8 -0
  10. package/bundle/mcp.js +7 -0
  11. package/bundle/opencode.js +314 -0
  12. package/bundle/project-manual.js +54 -0
  13. package/bundle/setup.js +31 -0
  14. package/bundle/snapshot.js +4 -0
  15. package/bundle/work-continuity.js +12 -0
  16. package/package.json +11 -5
  17. package/dist/packages/cli/commands.js +0 -1
  18. package/dist/packages/cli/index.js +0 -1
  19. package/dist/packages/sdk/client.js +0 -78
  20. package/dist/packages/sdk/index.js +0 -1
  21. package/dist/packages/sdk/types.js +0 -1
  22. package/dist/src/api/index.js +0 -1
  23. package/dist/src/api/routes/health.js +0 -1
  24. package/dist/src/api/routes/index.js +0 -1
  25. package/dist/src/api/routes/memory.js +0 -1
  26. package/dist/src/api/routes/projects.js +0 -1
  27. package/dist/src/api/routes/search.js +0 -1
  28. package/dist/src/api/server.js +0 -1
  29. package/dist/src/capture/activity-capture.js +0 -21
  30. package/dist/src/capture/command-capture.js +0 -12
  31. package/dist/src/capture/error-capture.js +0 -14
  32. package/dist/src/capture/event-deduplicator.js +0 -28
  33. package/dist/src/capture/event-queue.js +0 -20
  34. package/dist/src/capture/file-capture.js +0 -23
  35. package/dist/src/capture/index.js +0 -8
  36. package/dist/src/capture/session-capture.js +0 -18
  37. package/dist/src/capture/tool-capture.js +0 -13
  38. package/dist/src/code-intelligence/analysis/analysis-engine.js +0 -26
  39. package/dist/src/code-intelligence/analysis/dead-code-analyzer.js +0 -127
  40. package/dist/src/code-intelligence/analysis/dependency-analyzer.js +0 -66
  41. package/dist/src/code-intelligence/analysis/index.js +0 -4
  42. package/dist/src/code-intelligence/analysis/types.js +0 -1
  43. package/dist/src/code-intelligence/architecture/architecture-engine.js +0 -48
  44. package/dist/src/code-intelligence/architecture/clusters.js +0 -322
  45. package/dist/src/code-intelligence/architecture/entry-points.js +0 -150
  46. package/dist/src/code-intelligence/architecture/hotspots.js +0 -136
  47. package/dist/src/code-intelligence/architecture/index.js +0 -6
  48. package/dist/src/code-intelligence/architecture/layers.js +0 -197
  49. package/dist/src/code-intelligence/architecture/types.js +0 -1
  50. package/dist/src/code-intelligence/chunks/index.js +0 -2
  51. package/dist/src/code-intelligence/chunks/smart-chunker.js +0 -125
  52. package/dist/src/code-intelligence/chunks/types.js +0 -1
  53. package/dist/src/code-intelligence/git/git-diff.js +0 -109
  54. package/dist/src/code-intelligence/git/index.js +0 -1
  55. package/dist/src/code-intelligence/graph/architecture.js +0 -26
  56. package/dist/src/code-intelligence/graph/graph-builder.js +0 -213
  57. package/dist/src/code-intelligence/graph/graph-store.js +0 -57
  58. package/dist/src/code-intelligence/graph/index.js +0 -1
  59. package/dist/src/code-intelligence/graph/relationships.js +0 -1
  60. package/dist/src/code-intelligence/graph/trace.js +0 -65
  61. package/dist/src/code-intelligence/impact/blast-radius.js +0 -160
  62. package/dist/src/code-intelligence/impact/change-mapper.js +0 -69
  63. package/dist/src/code-intelligence/impact/edit-tool-detector.js +0 -92
  64. package/dist/src/code-intelligence/impact/impact-analyzer.js +0 -60
  65. package/dist/src/code-intelligence/impact/impact-guard.js +0 -33
  66. package/dist/src/code-intelligence/impact/index.js +0 -5
  67. package/dist/src/code-intelligence/incremental/file-hash.js +0 -8
  68. package/dist/src/code-intelligence/incremental/incremental-indexer.js +0 -106
  69. package/dist/src/code-intelligence/incremental/manifest-builder.js +0 -19
  70. package/dist/src/code-intelligence/incremental/manifest.js +0 -31
  71. package/dist/src/code-intelligence/index.js +0 -23
  72. package/dist/src/code-intelligence/indexer/file-watcher.js +0 -1
  73. package/dist/src/code-intelligence/indexer/incremental-indexer.js +0 -1
  74. package/dist/src/code-intelligence/indexer/index.js +0 -1
  75. package/dist/src/code-intelligence/indexer/repository-indexer.js +0 -31
  76. package/dist/src/code-intelligence/indexer/repository-scanner.js +0 -50
  77. package/dist/src/code-intelligence/parsers/index.js +0 -1
  78. package/dist/src/code-intelligence/parsers/tree-sitter/index.js +0 -1
  79. package/dist/src/code-intelligence/parsers/tree-sitter/languages.js +0 -1
  80. package/dist/src/code-intelligence/parsers/tree-sitter/parser.js +0 -1
  81. package/dist/src/code-intelligence/parsers/typescript-parser.js +0 -190
  82. package/dist/src/code-intelligence/query/graph-query-engine.js +0 -275
  83. package/dist/src/code-intelligence/query/index.js +0 -2
  84. package/dist/src/code-intelligence/query/types.js +0 -1
  85. package/dist/src/code-intelligence/resolution/index.js +0 -2
  86. package/dist/src/code-intelligence/resolution/types.js +0 -1
  87. package/dist/src/code-intelligence/resolution/typescript-resolver.js +0 -316
  88. package/dist/src/code-intelligence/rich/index.js +0 -1
  89. package/dist/src/code-intelligence/rich/rich-graph-enricher.js +0 -463
  90. package/dist/src/code-intelligence/semantic/index.js +0 -2
  91. package/dist/src/code-intelligence/semantic/semantic-code-engine.js +0 -213
  92. package/dist/src/code-intelligence/semantic/source-priority.js +0 -22
  93. package/dist/src/code-intelligence/symbols/index.js +0 -1
  94. package/dist/src/code-intelligence/symbols/reference-resolver.js +0 -21
  95. package/dist/src/code-intelligence/symbols/symbol-extractor.js +0 -1
  96. package/dist/src/code-intelligence/test-analysis.js +0 -72
  97. package/dist/src/code-intelligence/test-architecture.js +0 -67
  98. package/dist/src/code-intelligence/test-impact.js +0 -47
  99. package/dist/src/code-intelligence/test-incremental.js +0 -24
  100. package/dist/src/code-intelligence/test-index.js +0 -39
  101. package/dist/src/code-intelligence/test-resolution.js +0 -54
  102. package/dist/src/code-intelligence/test-rich-graph.js +0 -48
  103. package/dist/src/code-intelligence/test-semantic.js +0 -57
  104. package/dist/src/code-intelligence/test-visualization.js +0 -36
  105. package/dist/src/code-intelligence/types.js +0 -1
  106. package/dist/src/code-intelligence/visualization/index.js +0 -2
  107. package/dist/src/code-intelligence/visualization/types.js +0 -1
  108. package/dist/src/code-intelligence/visualization/visualization-builder.js +0 -104
  109. package/dist/src/core/config.js +0 -66
  110. package/dist/src/core/global-env.js +0 -70
  111. package/dist/src/core/importance.js +0 -30
  112. package/dist/src/core/index.js +0 -5
  113. package/dist/src/core/memory-engine.js +0 -183
  114. package/dist/src/core/project-manager.js +0 -243
  115. package/dist/src/core/types.js +0 -1
  116. package/dist/src/embeddings/batch-embedder.js +0 -1
  117. package/dist/src/embeddings/cache.js +0 -1
  118. package/dist/src/embeddings/embedder.js +0 -51
  119. package/dist/src/embeddings/index.js +0 -4
  120. package/dist/src/embeddings/local.js +0 -37
  121. package/dist/src/embeddings/provider.js +0 -1
  122. package/dist/src/embeddings/remote.js +0 -76
  123. package/dist/src/embeddings/test-connection.js +0 -16
  124. package/dist/src/hooks/after-edit.js +0 -3
  125. package/dist/src/hooks/after-tool.js +0 -3
  126. package/dist/src/hooks/auto-context.js +0 -68
  127. package/dist/src/hooks/auto-impact-guard.js +0 -94
  128. package/dist/src/hooks/auto-retrieval.js +0 -27
  129. package/dist/src/hooks/before-agent.js +0 -18
  130. package/dist/src/hooks/before-compact.js +0 -3
  131. package/dist/src/hooks/before-edit.js +0 -20
  132. package/dist/src/hooks/index.js +0 -11
  133. package/dist/src/hooks/runtime.js +0 -110
  134. package/dist/src/hooks/session-end.js +0 -3
  135. package/dist/src/hooks/session-start.js +0 -3
  136. package/dist/src/index.js +0 -22
  137. package/dist/src/mcp/bootstrap.js +0 -68
  138. package/dist/src/mcp/context.js +0 -1
  139. package/dist/src/mcp/index.js +0 -3
  140. package/dist/src/mcp/server.js +0 -45
  141. package/dist/src/mcp/tools/analyze-impact.js +0 -41
  142. package/dist/src/mcp/tools/dead-code.js +0 -55
  143. package/dist/src/mcp/tools/find-callers.js +0 -24
  144. package/dist/src/mcp/tools/find-dependencies.js +0 -57
  145. package/dist/src/mcp/tools/find-symbol.js +0 -7
  146. package/dist/src/mcp/tools/get-architecture.js +0 -11
  147. package/dist/src/mcp/tools/graph-dependents.js +0 -24
  148. package/dist/src/mcp/tools/graph-neighborhood.js +0 -58
  149. package/dist/src/mcp/tools/graph-path.js +0 -43
  150. package/dist/src/mcp/tools/graph-query-utils.js +0 -32
  151. package/dist/src/mcp/tools/impact-guard.js +0 -34
  152. package/dist/src/mcp/tools/index-repository.js +0 -1
  153. package/dist/src/mcp/tools/index.js +0 -20
  154. package/dist/src/mcp/tools/memory-decisions.js +0 -1
  155. package/dist/src/mcp/tools/memory-forget.js +0 -14
  156. package/dist/src/mcp/tools/memory-recent.js +0 -1
  157. package/dist/src/mcp/tools/memory-remember.js +0 -33
  158. package/dist/src/mcp/tools/memory-rules.js +0 -1
  159. package/dist/src/mcp/tools/memory-search.js +0 -18
  160. package/dist/src/mcp/tools/memory-todos.js +0 -1
  161. package/dist/src/mcp/tools/project-context.js +0 -25
  162. package/dist/src/mcp/tools/search-code.js +0 -21
  163. package/dist/src/mcp/tools/semantic-code-search.js +0 -33
  164. package/dist/src/mcp/tools/snapshot-create.js +0 -13
  165. package/dist/src/mcp/tools/snapshot-list.js +0 -7
  166. package/dist/src/mcp/tools/snapshot-restore.js +0 -13
  167. package/dist/src/mcp/tools/trace-calls.js +0 -37
  168. package/dist/src/memory/activity.js +0 -5
  169. package/dist/src/memory/conflict-detector.js +0 -105
  170. package/dist/src/memory/consolidator.js +0 -104
  171. package/dist/src/memory/decay.js +0 -59
  172. package/dist/src/memory/decisions.js +0 -3
  173. package/dist/src/memory/deduplicate.js +0 -25
  174. package/dist/src/memory/index.js +0 -11
  175. package/dist/src/memory/maintenance.js +0 -16
  176. package/dist/src/memory/remember.js +0 -3
  177. package/dist/src/memory/rules.js +0 -3
  178. package/dist/src/memory/search.js +0 -3
  179. package/dist/src/memory/summaries.js +0 -1
  180. package/dist/src/memory/todos.js +0 -3
  181. package/dist/src/processor/decision-extractor.js +0 -13
  182. package/dist/src/processor/importance-scorer.js +0 -22
  183. package/dist/src/processor/index.js +0 -7
  184. package/dist/src/processor/memory-extractor.js +0 -59
  185. package/dist/src/processor/memory-processor.js +0 -105
  186. package/dist/src/processor/rule-extractor.js +0 -13
  187. package/dist/src/processor/summarizer.js +0 -71
  188. package/dist/src/processor/todo-extractor.js +0 -12
  189. package/dist/src/production/config-check.js +0 -34
  190. package/dist/src/production/doctor.js +0 -58
  191. package/dist/src/production/full-index.js +0 -114
  192. package/dist/src/production/health.js +0 -58
  193. package/dist/src/production/index-pipeline.js +0 -151
  194. package/dist/src/production/index.js +0 -4
  195. package/dist/src/production/project-lock.js +0 -95
  196. package/dist/src/production/project-status.js +0 -16
  197. package/dist/src/production/recovery.js +0 -15
  198. package/dist/src/production/snapshot-cli.js +0 -58
  199. package/dist/src/project-manual/cli.js +0 -77
  200. package/dist/src/project-manual/index.js +0 -2
  201. package/dist/src/project-manual/manager.js +0 -147
  202. package/dist/src/project-manual/types.js +0 -1
  203. package/dist/src/retrieval/bm25/index.js +0 -1
  204. package/dist/src/retrieval/bm25/search.js +0 -1
  205. package/dist/src/retrieval/bm25.js +0 -30
  206. package/dist/src/retrieval/context-budget.js +0 -1
  207. package/dist/src/retrieval/context-builder.js +0 -22
  208. package/dist/src/retrieval/graph/index.js +0 -1
  209. package/dist/src/retrieval/graph/search.js +0 -1
  210. package/dist/src/retrieval/hybrid/hybrid-search.js +0 -1
  211. package/dist/src/retrieval/hybrid/index.js +0 -1
  212. package/dist/src/retrieval/hybrid-search.js +0 -68
  213. package/dist/src/retrieval/importance.js +0 -16
  214. package/dist/src/retrieval/index.js +0 -12
  215. package/dist/src/retrieval/query-analyzer.js +0 -32
  216. package/dist/src/retrieval/query-classifier.js +0 -1
  217. package/dist/src/retrieval/query-expansion.js +0 -1
  218. package/dist/src/retrieval/recency.js +0 -12
  219. package/dist/src/retrieval/reranker/index.js +0 -1
  220. package/dist/src/retrieval/reranker/reranker.js +0 -1
  221. package/dist/src/retrieval/retrieval-engine.js +0 -17
  222. package/dist/src/retrieval/tokenizer.js +0 -9
  223. package/dist/src/retrieval/type-priority.js +0 -10
  224. package/dist/src/retrieval/types.js +0 -1
  225. package/dist/src/retrieval/vector/index.js +0 -4
  226. package/dist/src/retrieval/vector/metadata-filter.js +0 -1
  227. package/dist/src/retrieval/vector/persistence.js +0 -67
  228. package/dist/src/retrieval/vector/search.js +0 -12
  229. package/dist/src/retrieval/vector/test-persistence.js +0 -36
  230. package/dist/src/retrieval/vector/upsert.js +0 -40
  231. package/dist/src/retrieval/vector/vector-store.js +0 -89
  232. package/dist/src/retrieval/vector-hybrid-engine.js +0 -91
  233. package/dist/src/runtime/bootstrap.js +0 -28
  234. package/dist/src/runtime/graceful.js +0 -17
  235. package/dist/src/runtime/index.js +0 -3
  236. package/dist/src/runtime/toolnet-memory-runtime.js +0 -156
  237. package/dist/src/security/encryption.js +0 -1
  238. package/dist/src/security/file-filter.js +0 -30
  239. package/dist/src/security/index.js +0 -3
  240. package/dist/src/security/sanitizer.js +0 -49
  241. package/dist/src/security/secret-scanner.js +0 -56
  242. package/dist/src/session/agy/adapter.js +0 -159
  243. package/dist/src/session/agy/cli.js +0 -87
  244. package/dist/src/session/agy/hook-installer.js +0 -62
  245. package/dist/src/session/agy/hook.js +0 -167
  246. package/dist/src/session/agy/index.js +0 -5
  247. package/dist/src/session/agy/project-resolver.js +0 -27
  248. package/dist/src/session/agy/recovery.js +0 -112
  249. package/dist/src/session/agy/transcript.js +0 -191
  250. package/dist/src/session/codex/adapter.js +0 -138
  251. package/dist/src/session/codex/cli.js +0 -236
  252. package/dist/src/session/codex/context-hook-installer.js +0 -70
  253. package/dist/src/session/codex/context-hook.js +0 -69
  254. package/dist/src/session/codex/discovery.js +0 -138
  255. package/dist/src/session/codex/index.js +0 -6
  256. package/dist/src/session/codex/notify-installer.js +0 -135
  257. package/dist/src/session/codex/project-resolver.js +0 -25
  258. package/dist/src/session/codex/recovery.js +0 -27
  259. package/dist/src/session/codex/rollout.js +0 -186
  260. package/dist/src/session/core.js +0 -239
  261. package/dist/src/session/identity.js +0 -57
  262. package/dist/src/session/index.js +0 -9
  263. package/dist/src/session/learner/cli.js +0 -62
  264. package/dist/src/session/learner/extractor.js +0 -461
  265. package/dist/src/session/learner/index.js +0 -4
  266. package/dist/src/session/learner/journal.js +0 -159
  267. package/dist/src/session/learner/learner.js +0 -124
  268. package/dist/src/session/learner/types.js +0 -1
  269. package/dist/src/session/opencode/adapter.js +0 -553
  270. package/dist/src/session/opencode/cli.js +0 -121
  271. package/dist/src/session/opencode/index.js +0 -2
  272. package/dist/src/session/opencode/plugin-installer.js +0 -230
  273. package/dist/src/session/store.js +0 -242
  274. package/dist/src/session/types.js +0 -1
  275. package/dist/src/session/utils.js +0 -47
  276. package/dist/src/session/wal.js +0 -303
  277. package/dist/src/snapshot/index.js +0 -2
  278. package/dist/src/snapshot/manager.js +0 -130
  279. package/dist/src/snapshot/test-snapshot.js +0 -28
  280. package/dist/src/snapshot/types.js +0 -1
  281. package/dist/src/storage/architecture-store.js +0 -37
  282. package/dist/src/storage/cleanup-health.js +0 -20
  283. package/dist/src/storage/code-analysis-store.js +0 -35
  284. package/dist/src/storage/code-chunk-store.js +0 -25
  285. package/dist/src/storage/code-graph-store.js +0 -24
  286. package/dist/src/storage/code-manifest-store.js +0 -24
  287. package/dist/src/storage/code-vector-store.js +0 -25
  288. package/dist/src/storage/github/client.js +0 -1
  289. package/dist/src/storage/github/index.js +0 -1
  290. package/dist/src/storage/google-drive/client.js +0 -1
  291. package/dist/src/storage/google-drive/index.js +0 -1
  292. package/dist/src/storage/huggingface/client.js +0 -116
  293. package/dist/src/storage/huggingface/index.js +0 -1
  294. package/dist/src/storage/index.js +0 -16
  295. package/dist/src/storage/list-bucket-raw.js +0 -14
  296. package/dist/src/storage/list-bucket-tree.js +0 -38
  297. package/dist/src/storage/local/client.js +0 -99
  298. package/dist/src/storage/local/index.js +0 -1
  299. package/dist/src/storage/memory-store.js +0 -30
  300. package/dist/src/storage/project/cleanup-layout-v1.js +0 -72
  301. package/dist/src/storage/project/folder.js +0 -15
  302. package/dist/src/storage/project/index.js +0 -3
  303. package/dist/src/storage/project/layout.js +0 -74
  304. package/dist/src/storage/project/migrate-layout-v2.js +0 -101
  305. package/dist/src/storage/project/migrate.js +0 -73
  306. package/dist/src/storage/project/scoped-provider.js +0 -165
  307. package/dist/src/storage/provider.js +0 -26
  308. package/dist/src/storage/retrying-provider.js +0 -23
  309. package/dist/src/storage/test-connection.js +0 -32
  310. package/dist/src/storage/type-resolution-store.js +0 -26
  311. package/dist/src/storage/types.js +0 -1
  312. package/dist/src/storage/vector-store.js +0 -30
  313. package/dist/src/storage/visualization-store.js +0 -25
  314. package/dist/src/sync/compressor.js +0 -1
  315. package/dist/src/sync/conflict-resolver.js +0 -1
  316. package/dist/src/sync/downloader.js +0 -1
  317. package/dist/src/sync/index.js +0 -1
  318. package/dist/src/sync/sync-engine.js +0 -1
  319. package/dist/src/sync/upload-queue.js +0 -1
  320. package/dist/src/utils/retry.js +0 -29
  321. package/dist/src/visualization/server.js +0 -270
  322. package/dist/src/work-continuity/brief-cache.js +0 -107
  323. package/dist/src/work-continuity/brief.js +0 -349
  324. package/dist/src/work-continuity/cli.js +0 -96
  325. package/dist/src/work-continuity/context-cli.js +0 -106
  326. package/dist/src/work-continuity/context-runtime-cli.js +0 -88
  327. package/dist/src/work-continuity/extractor.js +0 -339
  328. package/dist/src/work-continuity/handoff.js +0 -185
  329. package/dist/src/work-continuity/index.js +0 -14
  330. package/dist/src/work-continuity/injection.js +0 -84
  331. package/dist/src/work-continuity/journal.js +0 -49
  332. package/dist/src/work-continuity/learner.js +0 -127
  333. package/dist/src/work-continuity/reducer.js +0 -316
  334. package/dist/src/work-continuity/semantic-extractor.js +0 -360
  335. package/dist/src/work-continuity/semantic-journal.js +0 -55
  336. package/dist/src/work-continuity/semantic-learner.js +0 -125
  337. package/dist/src/work-continuity/semantic-reducer.js +0 -268
  338. package/dist/src/work-continuity/semantic-types.js +0 -1
  339. package/dist/src/work-continuity/types.js +0 -1
  340. package/dist/visualization/public/index.html +0 -2896
  341. package/dist/visualization/public/vendor/3d-force-graph.min.js +0 -5
@@ -1,105 +0,0 @@
1
- const GENERIC_TAGS = new Set([
2
- "decision",
3
- "rule",
4
- "todo",
5
- "summary",
6
- "activity",
7
- "user",
8
- "error",
9
- "file",
10
- "write",
11
- "command",
12
- "learned",
13
- "session",
14
- "architecture",
15
- "fix",
16
- "context",
17
- "opencode",
18
- "agy",
19
- "codex",
20
- ]);
21
- const STOPWORDS = new Set([
22
- "dùng",
23
- "sử",
24
- "dụng",
25
- "use",
26
- "using",
27
- "the",
28
- "a",
29
- "an",
30
- "cho",
31
- "và",
32
- "là",
33
- "của",
34
- "to",
35
- "for",
36
- "with",
37
- "quyết",
38
- "định",
39
- ]);
40
- function words(text) {
41
- return new Set(text
42
- .toLowerCase()
43
- .normalize("NFKC")
44
- .replace(/[^\p{L}\p{N}_-]+/gu, " ")
45
- .split(/\s+/)
46
- .filter((word) => word.length > 2 &&
47
- !STOPWORDS.has(word)));
48
- }
49
- function similarity(a, b) {
50
- const aa = words(a);
51
- const bb = words(b);
52
- if (aa.size === 0 ||
53
- bb.size === 0) {
54
- return 0;
55
- }
56
- let intersection = 0;
57
- for (const word of aa) {
58
- if (bb.has(word)) {
59
- intersection++;
60
- }
61
- }
62
- const union = new Set([
63
- ...aa,
64
- ...bb,
65
- ]).size;
66
- return intersection / union;
67
- }
68
- function meaningfulTags(memory) {
69
- return new Set(memory.tags.filter((tag) => !GENERIC_TAGS.has(tag.toLowerCase())));
70
- }
71
- export class ConflictDetector {
72
- findSuperseded(next, existing) {
73
- if (next.type !== "rule" &&
74
- next.type !== "decision") {
75
- return [];
76
- }
77
- const nextTopic = typeof next.metadata?.topic === "string"
78
- ? next.metadata.topic
79
- : undefined;
80
- const nextTags = meaningfulTags(next);
81
- return existing.filter((old) => {
82
- if (old.id === next.id ||
83
- old.projectId !== next.projectId ||
84
- old.type !== next.type ||
85
- old.metadata?.supersededBy) {
86
- return false;
87
- }
88
- const oldTopic = typeof old.metadata?.topic === "string"
89
- ? old.metadata.topic
90
- : undefined;
91
- if (nextTopic &&
92
- oldTopic &&
93
- nextTopic === oldTopic) {
94
- return true;
95
- }
96
- const oldTags = meaningfulTags(old);
97
- for (const tag of nextTags) {
98
- if (oldTags.has(tag)) {
99
- return true;
100
- }
101
- }
102
- return (similarity(next.content, old.content) >= 0.6);
103
- });
104
- }
105
- }
@@ -1,104 +0,0 @@
1
- function unique(values) {
2
- return [...new Set(values.filter(Boolean))];
3
- }
4
- export class MemoryConsolidator {
5
- memory;
6
- constructor(memory) {
7
- this.memory = memory;
8
- }
9
- consolidate(projectId, options = {}) {
10
- const minItems = options.minItems ?? 4;
11
- const maxItems = options.maxItems ?? 50;
12
- const retentionDays = options.retentionDays ?? 90;
13
- const activities = this.memory
14
- .byType(projectId, "activity")
15
- .slice(0, maxItems);
16
- if (activities.length <
17
- minItems) {
18
- return {
19
- scanned: activities.length,
20
- consolidated: 0,
21
- summaryCreated: false,
22
- };
23
- }
24
- const content = this.buildSummary(activities);
25
- const now = new Date();
26
- const expiresAt = new Date(now.getTime() +
27
- retentionDays *
28
- 86_400_000).toISOString();
29
- const summary = this.memory.remember({
30
- projectId,
31
- type: "summary",
32
- content,
33
- importance: "normal",
34
- tags: [
35
- "consolidated",
36
- "activity-summary",
37
- ],
38
- source: "auto-consolidation",
39
- expiresAt,
40
- metadata: {
41
- consolidatedFrom: activities.map((item) => item.id),
42
- itemCount: activities.length,
43
- },
44
- });
45
- const supersededAt = now.toISOString();
46
- for (const activity of activities) {
47
- const source = this.memory.get(activity.id);
48
- if (!source) {
49
- continue;
50
- }
51
- source.updatedAt =
52
- supersededAt;
53
- source.metadata = {
54
- ...(source.metadata ?? {}),
55
- consolidated: true,
56
- supersededBy: summary.id,
57
- supersededAt,
58
- };
59
- }
60
- return {
61
- scanned: activities.length,
62
- consolidated: activities.length,
63
- summaryCreated: true,
64
- summaryId: summary.id,
65
- };
66
- }
67
- buildSummary(activities) {
68
- const files = unique(activities
69
- .filter((item) => item.content.startsWith("Modified file:"))
70
- .map((item) => item.content
71
- .replace("Modified file:", "")
72
- .trim()));
73
- const commands = unique(activities
74
- .filter((item) => item.content.startsWith("Command:"))
75
- .map((item) => item.content
76
- .replace("Command:", "")
77
- .trim()));
78
- const errors = unique(activities
79
- .filter((item) => item.content.startsWith("Error:"))
80
- .map((item) => item.content
81
- .replace("Error:", "")
82
- .trim()));
83
- const lines = [
84
- "Activity consolidation:",
85
- `- Activities: ${activities.length}`,
86
- ];
87
- if (files.length) {
88
- lines.push(`- Files changed: ${files
89
- .slice(0, 15)
90
- .join(", ")}`);
91
- }
92
- if (commands.length) {
93
- lines.push(`- Commands: ${commands
94
- .slice(0, 10)
95
- .join("; ")}`);
96
- }
97
- if (errors.length) {
98
- lines.push(`- Errors: ${errors
99
- .slice(0, 10)
100
- .join("; ")}`);
101
- }
102
- return lines.join("\n");
103
- }
104
- }
@@ -1,59 +0,0 @@
1
- const BASE_SCORE = {
2
- critical: 100,
3
- high: 75,
4
- normal: 50,
5
- temporary: 20,
6
- };
7
- const HALF_LIFE_DAYS = {
8
- activity: 14,
9
- summary: 30,
10
- todo: 90,
11
- decision: 365,
12
- rule: 730,
13
- code: 180,
14
- };
15
- export function defaultExpiry(type, importance, now = new Date()) {
16
- let days;
17
- if (importance === "temporary") {
18
- days = 30;
19
- }
20
- if (type === "activity") {
21
- days = Math.min(days ?? 14, 14);
22
- }
23
- if (type === "summary") {
24
- days = Math.min(days ?? 30, 30);
25
- }
26
- if (!days) {
27
- return undefined;
28
- }
29
- return new Date(now.getTime() +
30
- days * 86_400_000).toISOString();
31
- }
32
- export function isExpired(memory, now = Date.now()) {
33
- if (!memory.expiresAt) {
34
- return false;
35
- }
36
- return (new Date(memory.expiresAt).getTime() <= now);
37
- }
38
- export function isSuperseded(memory) {
39
- return Boolean(memory.metadata?.supersededBy);
40
- }
41
- export function isMemoryActive(memory, now = Date.now()) {
42
- return (!isExpired(memory, now) &&
43
- !isSuperseded(memory));
44
- }
45
- export function effectiveImportanceScore(memory, now = Date.now()) {
46
- if (!isMemoryActive(memory, now)) {
47
- return 0;
48
- }
49
- const base = BASE_SCORE[memory.importance];
50
- if (memory.importance === "critical") {
51
- return base;
52
- }
53
- const halfLife = HALF_LIFE_DAYS[memory.type] ?? 180;
54
- const ageMs = Math.max(0, now -
55
- new Date(memory.updatedAt).getTime());
56
- const ageDays = ageMs / 86_400_000;
57
- const decay = Math.pow(0.5, ageDays / halfLife);
58
- return base * decay;
59
- }
@@ -1,3 +0,0 @@
1
- export function getDecisions(engine, projectId) {
2
- return engine.byType(projectId, "decision");
3
- }
@@ -1,25 +0,0 @@
1
- import { createHash, } from "node:crypto";
2
- export function memoryFingerprint(memory) {
3
- return createHash("sha256")
4
- .update([
5
- memory.projectId,
6
- memory.type,
7
- memory.content
8
- .trim()
9
- .toLowerCase(),
10
- ].join("|"))
11
- .digest("hex");
12
- }
13
- export function deduplicateMemories(memories) {
14
- const seen = new Set();
15
- const result = [];
16
- for (const memory of memories) {
17
- const hash = memoryFingerprint(memory);
18
- if (seen.has(hash)) {
19
- continue;
20
- }
21
- seen.add(hash);
22
- result.push(memory);
23
- }
24
- return result;
25
- }
@@ -1,11 +0,0 @@
1
- export * from "./remember.js";
2
- export * from "./search.js";
3
- export * from "./rules.js";
4
- export * from "./decisions.js";
5
- export * from "./todos.js";
6
- export * from "./activity.js";
7
- export * from "./deduplicate.js";
8
- export * from "./decay.js";
9
- export * from "./conflict-detector.js";
10
- export * from "./maintenance.js";
11
- export * from "./consolidator.js";
@@ -1,16 +0,0 @@
1
- export class MemoryMaintenance {
2
- memory;
3
- constructor(memory) {
4
- this.memory = memory;
5
- }
6
- run(projectId) {
7
- const expiredRemoved = this.memory.pruneExpired(projectId);
8
- const supersededRemoved = this.memory.pruneSuperseded(projectId, 30);
9
- return {
10
- expiredRemoved,
11
- supersededRemoved,
12
- active: this.memory.list(projectId).length,
13
- total: this.memory.listAll(projectId).length,
14
- };
15
- }
16
- }
@@ -1,3 +0,0 @@
1
- export function rememberMemory(engine, input) {
2
- return engine.remember(input);
3
- }
@@ -1,3 +0,0 @@
1
- export function getRules(engine, projectId) {
2
- return engine.byType(projectId, "rule");
3
- }
@@ -1,3 +0,0 @@
1
- export function searchMemory(engine, query) {
2
- return engine.search(query);
3
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- export function getTodos(engine, projectId) {
2
- return engine.byType(projectId, "todo");
3
- }
@@ -1,13 +0,0 @@
1
- export function looksLikeDecision(text) {
2
- const value = text.toLowerCase();
3
- return [
4
- "quyết định",
5
- "chọn ",
6
- "sử dụng ",
7
- "dùng ",
8
- "decided",
9
- "decision",
10
- "we will use",
11
- "use ",
12
- ].some((pattern) => value.includes(pattern));
13
- }
@@ -1,22 +0,0 @@
1
- export function scoreImportance(type, content) {
2
- const text = content.toLowerCase();
3
- if (text.includes("không được") ||
4
- text.includes("tuyệt đối") ||
5
- text.includes("must not") ||
6
- text.includes("never ")) {
7
- return "critical";
8
- }
9
- if (type === "rule" ||
10
- type === "decision") {
11
- return "high";
12
- }
13
- if (type === "todo") {
14
- return "normal";
15
- }
16
- if (text.includes("error") ||
17
- text.includes("failed") ||
18
- text.includes("exception")) {
19
- return "normal";
20
- }
21
- return "temporary";
22
- }
@@ -1,7 +0,0 @@
1
- export * from "./memory-processor.js";
2
- export * from "./memory-extractor.js";
3
- export * from "./summarizer.js";
4
- export * from "./decision-extractor.js";
5
- export * from "./rule-extractor.js";
6
- export * from "./todo-extractor.js";
7
- export * from "./importance-scorer.js";
@@ -1,59 +0,0 @@
1
- export class MemoryExtractor {
2
- extract(event) {
3
- switch (event.type) {
4
- case "decision":
5
- return {
6
- type: "decision",
7
- content: String(event.data.content ??
8
- "Decision recorded"),
9
- tags: ["decision"],
10
- source: "auto-extractor",
11
- metadata: event.data,
12
- };
13
- case "todo":
14
- return {
15
- type: "todo",
16
- content: String(event.data.content ??
17
- "TODO recorded"),
18
- tags: ["todo"],
19
- source: "auto-extractor",
20
- metadata: event.data,
21
- };
22
- case "error":
23
- return {
24
- type: "activity",
25
- content: `Error: ${String(event.data.message ?? "")}`,
26
- tags: ["error"],
27
- source: "auto-extractor",
28
- metadata: event.data,
29
- };
30
- case "file_write":
31
- return {
32
- type: "activity",
33
- content: `Modified file: ${String(event.data.filePath ?? "")}`,
34
- tags: ["file", "write"],
35
- source: "auto-extractor",
36
- metadata: event.data,
37
- };
38
- case "command":
39
- return {
40
- type: "activity",
41
- content: `Command: ${String(event.data.command ?? "")}`,
42
- tags: ["command"],
43
- source: "auto-extractor",
44
- metadata: event.data,
45
- };
46
- case "session_start":
47
- case "session_end":
48
- case "file_read":
49
- case "tool_call":
50
- case "user_prompt":
51
- case "test":
52
- case "commit":
53
- case "deploy":
54
- return null;
55
- default:
56
- return null;
57
- }
58
- }
59
- }
@@ -1,105 +0,0 @@
1
- import { MemoryExtractor, } from "./memory-extractor.js";
2
- import { looksLikeRule, } from "./rule-extractor.js";
3
- import { looksLikeDecision, } from "./decision-extractor.js";
4
- import { looksLikeTodo, } from "./todo-extractor.js";
5
- import { scoreImportance, } from "./importance-scorer.js";
6
- import { Summarizer, } from "./summarizer.js";
7
- export class MemoryProcessor {
8
- memory;
9
- extractor = new MemoryExtractor();
10
- summarizer = new Summarizer();
11
- constructor(memory) {
12
- this.memory = memory;
13
- }
14
- process(events) {
15
- let created = 0;
16
- for (const event of events) {
17
- const extracted = this.extractor.extract(event);
18
- if (extracted) {
19
- const type = this.refineType(extracted.type, extracted.content);
20
- this.memory.remember({
21
- projectId: event.projectId,
22
- type,
23
- content: extracted.content,
24
- importance: scoreImportance(type, extracted.content),
25
- tags: extracted.tags,
26
- source: extracted.source,
27
- metadata: {
28
- eventId: event.id,
29
- timestamp: event.timestamp,
30
- ...extracted.metadata,
31
- },
32
- });
33
- created++;
34
- }
35
- if (event.type ===
36
- "user_prompt") {
37
- const content = String(event.data.content ??
38
- "");
39
- const type = this.detectPromptMemoryType(content);
40
- if (type) {
41
- this.memory.remember({
42
- projectId: event.projectId,
43
- type,
44
- content,
45
- importance: scoreImportance(type, content),
46
- tags: [
47
- "user",
48
- type,
49
- ],
50
- source: "auto-prompt-extractor",
51
- metadata: {
52
- eventId: event.id,
53
- timestamp: event.timestamp,
54
- },
55
- });
56
- created++;
57
- }
58
- }
59
- }
60
- const summary = this.summarizer
61
- .summarize(events);
62
- if (summary) {
63
- const projectId = events[0]?.projectId;
64
- if (projectId) {
65
- this.memory.remember({
66
- projectId,
67
- type: "summary",
68
- content: summary,
69
- importance: "temporary",
70
- tags: ["summary"],
71
- source: "auto-summary",
72
- metadata: {
73
- eventCount: events.length,
74
- },
75
- });
76
- created++;
77
- }
78
- }
79
- return created;
80
- }
81
- refineType(initial, content) {
82
- if (looksLikeRule(content)) {
83
- return "rule";
84
- }
85
- if (looksLikeTodo(content)) {
86
- return "todo";
87
- }
88
- if (looksLikeDecision(content)) {
89
- return "decision";
90
- }
91
- return initial;
92
- }
93
- detectPromptMemoryType(content) {
94
- if (looksLikeRule(content)) {
95
- return "rule";
96
- }
97
- if (looksLikeTodo(content)) {
98
- return "todo";
99
- }
100
- if (looksLikeDecision(content)) {
101
- return "decision";
102
- }
103
- return null;
104
- }
105
- }
@@ -1,13 +0,0 @@
1
- export function looksLikeRule(text) {
2
- const value = text.toLowerCase();
3
- return [
4
- "không được",
5
- "bắt buộc",
6
- "phải luôn",
7
- "tuyệt đối",
8
- "never ",
9
- "must ",
10
- "always ",
11
- "do not ",
12
- ].some((pattern) => value.includes(pattern));
13
- }
@@ -1,71 +0,0 @@
1
- function unique(values) {
2
- return [...new Set(values.filter(Boolean))];
3
- }
4
- function truncate(text, max = 120) {
5
- return text.length > max
6
- ? `${text.slice(0, max)}…`
7
- : text;
8
- }
9
- export class Summarizer {
10
- summarize(events) {
11
- if (events.length === 0) {
12
- return null;
13
- }
14
- const files = unique(events
15
- .filter((event) => event.type ===
16
- "file_write")
17
- .map((event) => String(event.data.filePath ?? "")));
18
- const commands = unique(events
19
- .filter((event) => event.type ===
20
- "command")
21
- .map((event) => truncate(String(event.data.command ?? ""))));
22
- const errors = unique(events
23
- .filter((event) => event.type ===
24
- "error")
25
- .map((event) => truncate(String(event.data.message ?? ""))));
26
- const decisions = unique(events
27
- .filter((event) => event.type ===
28
- "decision")
29
- .map((event) => truncate(String(event.data.content ?? ""))));
30
- const todos = unique(events
31
- .filter((event) => event.type ===
32
- "todo")
33
- .map((event) => truncate(String(event.data.content ?? ""))));
34
- if (files.length === 0 &&
35
- commands.length === 0 &&
36
- errors.length === 0 &&
37
- decisions.length === 0 &&
38
- todos.length === 0) {
39
- return null;
40
- }
41
- const lines = [
42
- "Session summary:",
43
- ];
44
- if (files.length) {
45
- lines.push(`- Files changed (${files.length}): ${files
46
- .slice(0, 10)
47
- .join(", ")}`);
48
- }
49
- if (commands.length) {
50
- lines.push(`- Commands (${commands.length}): ${commands
51
- .slice(0, 5)
52
- .join("; ")}`);
53
- }
54
- if (errors.length) {
55
- lines.push(`- Errors (${errors.length}): ${errors
56
- .slice(0, 5)
57
- .join("; ")}`);
58
- }
59
- if (decisions.length) {
60
- lines.push(`- Decisions: ${decisions
61
- .slice(0, 5)
62
- .join("; ")}`);
63
- }
64
- if (todos.length) {
65
- lines.push(`- TODO: ${todos
66
- .slice(0, 5)
67
- .join("; ")}`);
68
- }
69
- return lines.join("\n");
70
- }
71
- }
@@ -1,12 +0,0 @@
1
- export function looksLikeTodo(text) {
2
- const value = text.toLowerCase();
3
- return [
4
- "todo",
5
- "cần làm",
6
- "chưa xong",
7
- "còn phải",
8
- "next:",
9
- "next step",
10
- "pending",
11
- ].some((pattern) => value.includes(pattern));
12
- }