toolnet-memory 0.2.1 → 0.2.3

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 (342) hide show
  1. package/README.md +55 -28
  2. package/bin/toolnet-memory +55 -55
  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 +9 -6
  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/setup.js +0 -219
  199. package/dist/src/production/snapshot-cli.js +0 -58
  200. package/dist/src/project-manual/cli.js +0 -77
  201. package/dist/src/project-manual/index.js +0 -2
  202. package/dist/src/project-manual/manager.js +0 -147
  203. package/dist/src/project-manual/types.js +0 -1
  204. package/dist/src/retrieval/bm25/index.js +0 -1
  205. package/dist/src/retrieval/bm25/search.js +0 -1
  206. package/dist/src/retrieval/bm25.js +0 -30
  207. package/dist/src/retrieval/context-budget.js +0 -1
  208. package/dist/src/retrieval/context-builder.js +0 -22
  209. package/dist/src/retrieval/graph/index.js +0 -1
  210. package/dist/src/retrieval/graph/search.js +0 -1
  211. package/dist/src/retrieval/hybrid/hybrid-search.js +0 -1
  212. package/dist/src/retrieval/hybrid/index.js +0 -1
  213. package/dist/src/retrieval/hybrid-search.js +0 -68
  214. package/dist/src/retrieval/importance.js +0 -16
  215. package/dist/src/retrieval/index.js +0 -12
  216. package/dist/src/retrieval/query-analyzer.js +0 -32
  217. package/dist/src/retrieval/query-classifier.js +0 -1
  218. package/dist/src/retrieval/query-expansion.js +0 -1
  219. package/dist/src/retrieval/recency.js +0 -12
  220. package/dist/src/retrieval/reranker/index.js +0 -1
  221. package/dist/src/retrieval/reranker/reranker.js +0 -1
  222. package/dist/src/retrieval/retrieval-engine.js +0 -17
  223. package/dist/src/retrieval/tokenizer.js +0 -9
  224. package/dist/src/retrieval/type-priority.js +0 -10
  225. package/dist/src/retrieval/types.js +0 -1
  226. package/dist/src/retrieval/vector/index.js +0 -4
  227. package/dist/src/retrieval/vector/metadata-filter.js +0 -1
  228. package/dist/src/retrieval/vector/persistence.js +0 -67
  229. package/dist/src/retrieval/vector/search.js +0 -12
  230. package/dist/src/retrieval/vector/test-persistence.js +0 -36
  231. package/dist/src/retrieval/vector/upsert.js +0 -40
  232. package/dist/src/retrieval/vector/vector-store.js +0 -89
  233. package/dist/src/retrieval/vector-hybrid-engine.js +0 -91
  234. package/dist/src/runtime/bootstrap.js +0 -28
  235. package/dist/src/runtime/graceful.js +0 -17
  236. package/dist/src/runtime/index.js +0 -3
  237. package/dist/src/runtime/toolnet-memory-runtime.js +0 -156
  238. package/dist/src/security/encryption.js +0 -1
  239. package/dist/src/security/file-filter.js +0 -30
  240. package/dist/src/security/index.js +0 -3
  241. package/dist/src/security/sanitizer.js +0 -49
  242. package/dist/src/security/secret-scanner.js +0 -56
  243. package/dist/src/session/agy/adapter.js +0 -159
  244. package/dist/src/session/agy/cli.js +0 -87
  245. package/dist/src/session/agy/hook-installer.js +0 -62
  246. package/dist/src/session/agy/hook.js +0 -167
  247. package/dist/src/session/agy/index.js +0 -5
  248. package/dist/src/session/agy/project-resolver.js +0 -27
  249. package/dist/src/session/agy/recovery.js +0 -112
  250. package/dist/src/session/agy/transcript.js +0 -191
  251. package/dist/src/session/codex/adapter.js +0 -138
  252. package/dist/src/session/codex/cli.js +0 -236
  253. package/dist/src/session/codex/context-hook-installer.js +0 -70
  254. package/dist/src/session/codex/context-hook.js +0 -69
  255. package/dist/src/session/codex/discovery.js +0 -138
  256. package/dist/src/session/codex/index.js +0 -6
  257. package/dist/src/session/codex/notify-installer.js +0 -135
  258. package/dist/src/session/codex/project-resolver.js +0 -25
  259. package/dist/src/session/codex/recovery.js +0 -27
  260. package/dist/src/session/codex/rollout.js +0 -186
  261. package/dist/src/session/core.js +0 -239
  262. package/dist/src/session/identity.js +0 -57
  263. package/dist/src/session/index.js +0 -9
  264. package/dist/src/session/learner/cli.js +0 -62
  265. package/dist/src/session/learner/extractor.js +0 -461
  266. package/dist/src/session/learner/index.js +0 -4
  267. package/dist/src/session/learner/journal.js +0 -159
  268. package/dist/src/session/learner/learner.js +0 -124
  269. package/dist/src/session/learner/types.js +0 -1
  270. package/dist/src/session/opencode/adapter.js +0 -553
  271. package/dist/src/session/opencode/cli.js +0 -121
  272. package/dist/src/session/opencode/index.js +0 -2
  273. package/dist/src/session/opencode/plugin-installer.js +0 -230
  274. package/dist/src/session/store.js +0 -242
  275. package/dist/src/session/types.js +0 -1
  276. package/dist/src/session/utils.js +0 -47
  277. package/dist/src/session/wal.js +0 -303
  278. package/dist/src/snapshot/index.js +0 -2
  279. package/dist/src/snapshot/manager.js +0 -130
  280. package/dist/src/snapshot/test-snapshot.js +0 -28
  281. package/dist/src/snapshot/types.js +0 -1
  282. package/dist/src/storage/architecture-store.js +0 -37
  283. package/dist/src/storage/cleanup-health.js +0 -20
  284. package/dist/src/storage/code-analysis-store.js +0 -35
  285. package/dist/src/storage/code-chunk-store.js +0 -25
  286. package/dist/src/storage/code-graph-store.js +0 -24
  287. package/dist/src/storage/code-manifest-store.js +0 -24
  288. package/dist/src/storage/code-vector-store.js +0 -25
  289. package/dist/src/storage/github/client.js +0 -1
  290. package/dist/src/storage/github/index.js +0 -1
  291. package/dist/src/storage/google-drive/client.js +0 -1
  292. package/dist/src/storage/google-drive/index.js +0 -1
  293. package/dist/src/storage/huggingface/client.js +0 -116
  294. package/dist/src/storage/huggingface/index.js +0 -1
  295. package/dist/src/storage/index.js +0 -16
  296. package/dist/src/storage/list-bucket-raw.js +0 -14
  297. package/dist/src/storage/list-bucket-tree.js +0 -38
  298. package/dist/src/storage/local/client.js +0 -99
  299. package/dist/src/storage/local/index.js +0 -1
  300. package/dist/src/storage/memory-store.js +0 -30
  301. package/dist/src/storage/project/cleanup-layout-v1.js +0 -72
  302. package/dist/src/storage/project/folder.js +0 -15
  303. package/dist/src/storage/project/index.js +0 -3
  304. package/dist/src/storage/project/layout.js +0 -74
  305. package/dist/src/storage/project/migrate-layout-v2.js +0 -101
  306. package/dist/src/storage/project/migrate.js +0 -73
  307. package/dist/src/storage/project/scoped-provider.js +0 -165
  308. package/dist/src/storage/provider.js +0 -26
  309. package/dist/src/storage/retrying-provider.js +0 -23
  310. package/dist/src/storage/test-connection.js +0 -32
  311. package/dist/src/storage/type-resolution-store.js +0 -26
  312. package/dist/src/storage/types.js +0 -1
  313. package/dist/src/storage/vector-store.js +0 -30
  314. package/dist/src/storage/visualization-store.js +0 -25
  315. package/dist/src/sync/compressor.js +0 -1
  316. package/dist/src/sync/conflict-resolver.js +0 -1
  317. package/dist/src/sync/downloader.js +0 -1
  318. package/dist/src/sync/index.js +0 -1
  319. package/dist/src/sync/sync-engine.js +0 -1
  320. package/dist/src/sync/upload-queue.js +0 -1
  321. package/dist/src/utils/retry.js +0 -29
  322. package/dist/src/visualization/server.js +0 -270
  323. package/dist/src/work-continuity/brief-cache.js +0 -107
  324. package/dist/src/work-continuity/brief.js +0 -349
  325. package/dist/src/work-continuity/cli.js +0 -96
  326. package/dist/src/work-continuity/context-cli.js +0 -106
  327. package/dist/src/work-continuity/context-runtime-cli.js +0 -88
  328. package/dist/src/work-continuity/extractor.js +0 -339
  329. package/dist/src/work-continuity/handoff.js +0 -185
  330. package/dist/src/work-continuity/index.js +0 -14
  331. package/dist/src/work-continuity/injection.js +0 -84
  332. package/dist/src/work-continuity/journal.js +0 -49
  333. package/dist/src/work-continuity/learner.js +0 -127
  334. package/dist/src/work-continuity/reducer.js +0 -316
  335. package/dist/src/work-continuity/semantic-extractor.js +0 -360
  336. package/dist/src/work-continuity/semantic-journal.js +0 -55
  337. package/dist/src/work-continuity/semantic-learner.js +0 -125
  338. package/dist/src/work-continuity/semantic-reducer.js +0 -268
  339. package/dist/src/work-continuity/semantic-types.js +0 -1
  340. package/dist/src/work-continuity/types.js +0 -1
  341. package/dist/visualization/public/index.html +0 -2896
  342. package/dist/visualization/public/vendor/3d-force-graph.min.js +0 -5
@@ -1,76 +0,0 @@
1
- export class HuggingFaceEmbeddingProvider {
2
- options;
3
- name = "huggingface";
4
- dimensions = 384;
5
- constructor(options) {
6
- this.options = options;
7
- }
8
- async embed(text) {
9
- const [vector] = await this.embedMany([text]);
10
- return vector;
11
- }
12
- async embedMany(texts) {
13
- if (texts.length === 0) {
14
- return [];
15
- }
16
- const url = `https://router.huggingface.co/hf-inference/models/${this.options.model}/pipeline/feature-extraction`;
17
- const response = await fetch(url, {
18
- method: "POST",
19
- headers: {
20
- Authorization: `Bearer ${this.options.token}`,
21
- "Content-Type": "application/json",
22
- },
23
- body: JSON.stringify({
24
- inputs: texts,
25
- options: {
26
- wait_for_model: true,
27
- },
28
- }),
29
- });
30
- if (!response.ok) {
31
- throw new Error(`HF embedding failed: ${response.status} ${await response.text()}`);
32
- }
33
- const data = await response.json();
34
- if (!Array.isArray(data)) {
35
- throw new Error("HF embedding returned invalid response");
36
- }
37
- /*
38
- * API có thể trả:
39
- * [vector]
40
- * hoặc [[token vectors]]
41
- *
42
- * Normalize về sentence vector.
43
- */
44
- return data.map((item) => normalizeEmbedding(item));
45
- }
46
- }
47
- function normalizeEmbedding(value) {
48
- if (!Array.isArray(value)) {
49
- throw new Error("Invalid embedding");
50
- }
51
- if (value.length > 0 &&
52
- typeof value[0] === "number") {
53
- return value;
54
- }
55
- if (value.length > 0 &&
56
- Array.isArray(value[0])) {
57
- const rows = value;
58
- if (rows.length === 0) {
59
- return [];
60
- }
61
- const dimensions = rows[0].length;
62
- const output = new Array(dimensions).fill(0);
63
- for (const row of rows) {
64
- for (let i = 0; i < dimensions; i++) {
65
- output[i] +=
66
- row[i] ?? 0;
67
- }
68
- }
69
- for (let i = 0; i < dimensions; i++) {
70
- output[i] /=
71
- rows.length;
72
- }
73
- return output;
74
- }
75
- throw new Error("Unsupported embedding shape");
76
- }
@@ -1,16 +0,0 @@
1
- import "dotenv/config";
2
- import { createEmbeddingProvider, } from "./embedder.js";
3
- async function main() {
4
- const provider = createEmbeddingProvider();
5
- const vector = await provider.embed("ToolNet Memory semantic search");
6
- console.log({
7
- ok: vector.length > 0,
8
- provider: provider.name,
9
- dimensions: vector.length,
10
- sample: vector.slice(0, 5),
11
- });
12
- }
13
- main().catch((error) => {
14
- console.error(error);
15
- process.exit(1);
16
- });
@@ -1,3 +0,0 @@
1
- export async function afterEdit(runtime, filePath) {
2
- await runtime.fileWrite(filePath);
3
- }
@@ -1,3 +0,0 @@
1
- export async function afterTool(runtime, tool, output) {
2
- await runtime.afterTool(tool, output);
3
- }
@@ -1,68 +0,0 @@
1
- import { getArchitecture } from "../code-intelligence/graph/architecture.js";
2
- export class AutoContextBuilder {
3
- memory;
4
- retrieval;
5
- graph;
6
- constructor(memory, retrieval, graph) {
7
- this.memory = memory;
8
- this.retrieval = retrieval;
9
- this.graph = graph;
10
- }
11
- build(projectId, query, options = {}) {
12
- const maxRules = options.maxRules ?? 3;
13
- const maxTodos = options.maxTodos ?? 3;
14
- const maxDecisions = options.maxDecisions ?? 3;
15
- const maxRelevant = options.maxRelevant ?? 5;
16
- const maxCharacters = options.maxCharacters ?? 7000;
17
- const rules = this.memory
18
- .byType(projectId, "rule")
19
- .slice(0, maxRules);
20
- const todos = this.memory
21
- .byType(projectId, "todo")
22
- .slice(0, maxTodos);
23
- const decisions = this.memory
24
- .byType(projectId, "decision")
25
- .slice(0, maxDecisions);
26
- const relevant = this.retrieval.search(projectId, query, {
27
- topK: maxRelevant,
28
- });
29
- const architecture = getArchitecture(this.graph, projectId);
30
- const blocks = [];
31
- blocks.push([
32
- "[PROJECT]",
33
- `files=${architecture.files}`,
34
- `classes=${architecture.classes}`,
35
- `functions=${architecture.functions}`,
36
- `methods=${architecture.methods}`,
37
- `calls=${architecture.calls}`,
38
- ].join(" "));
39
- for (const item of rules) {
40
- blocks.push(`[RULE] ${item.content}`);
41
- }
42
- for (const item of decisions) {
43
- blocks.push(`[DECISION] ${item.content}`);
44
- }
45
- for (const item of todos) {
46
- blocks.push(`[TODO] ${item.content}`);
47
- }
48
- for (const item of relevant) {
49
- const prefix = item.memory.type.toUpperCase();
50
- const block = `[${prefix}] ${item.memory.content}`;
51
- if (!blocks.includes(block)) {
52
- blocks.push(block);
53
- }
54
- }
55
- let output = "";
56
- for (const block of blocks) {
57
- const next = output.length === 0
58
- ? block
59
- : `${output}\n${block}`;
60
- if (next.length >
61
- maxCharacters) {
62
- break;
63
- }
64
- output = next;
65
- }
66
- return output;
67
- }
68
- }
@@ -1,94 +0,0 @@
1
- import { extractEditedFiles, } from "../code-intelligence/impact/edit-tool-detector.js";
2
- const RISK_ORDER = {
3
- LOW: 0,
4
- MEDIUM: 1,
5
- HIGH: 2,
6
- CRITICAL: 3,
7
- };
8
- export class AutoImpactGuard {
9
- guard;
10
- projectId;
11
- constructor(guard, projectId) {
12
- this.guard = guard;
13
- this.projectId = projectId;
14
- }
15
- async beforeTool(tool, input) {
16
- const paths = extractEditedFiles(tool, input);
17
- if (paths.length === 0) {
18
- return {
19
- triggered: false,
20
- tool,
21
- highestRisk: "LOW",
22
- totalRiskScore: 0,
23
- files: [],
24
- impactedFiles: [],
25
- suggestedTests: [],
26
- requiresVerification: false,
27
- context: "",
28
- };
29
- }
30
- const files = [];
31
- for (const filePath of paths) {
32
- const result = this.guard.analyzeFile(this.projectId, filePath);
33
- files.push({
34
- filePath,
35
- risk: result.risk,
36
- riskScore: result.riskScore,
37
- impactedFiles: result.impactedFiles,
38
- suggestedTests: result.suggestedTests,
39
- impactedCount: result.impacted.length,
40
- });
41
- }
42
- let highestRisk = "LOW";
43
- for (const file of files) {
44
- if (RISK_ORDER[file.risk] >
45
- RISK_ORDER[highestRisk]) {
46
- highestRisk =
47
- file.risk;
48
- }
49
- }
50
- const impactedFiles = [
51
- ...new Set(files.flatMap((file) => file.impactedFiles)),
52
- ];
53
- const suggestedTests = [
54
- ...new Set(files.flatMap((file) => file.suggestedTests)),
55
- ];
56
- const totalRiskScore = files.reduce((total, file) => total +
57
- file.riskScore, 0);
58
- const requiresVerification = highestRisk ===
59
- "HIGH" ||
60
- highestRisk ===
61
- "CRITICAL";
62
- const lines = [
63
- "[TOOLNET IMPACT GUARD]",
64
- `Risk: ${highestRisk}`,
65
- `Risk score: ${totalRiskScore}`,
66
- `Files being changed: ${paths.join(", ")}`,
67
- `Impacted files: ${impactedFiles.length}`,
68
- ];
69
- if (impactedFiles.length) {
70
- lines.push("Blast radius:", ...impactedFiles
71
- .slice(0, 20)
72
- .map((path) => `- ${path}`));
73
- }
74
- if (suggestedTests.length) {
75
- lines.push("Verify/tests:", ...suggestedTests
76
- .slice(0, 15)
77
- .map((path) => `- ${path}`));
78
- }
79
- if (requiresVerification) {
80
- lines.push("IMPORTANT: High blast radius. Inspect affected dependencies and run relevant tests after the edit.");
81
- }
82
- return {
83
- triggered: true,
84
- tool,
85
- highestRisk,
86
- totalRiskScore,
87
- files,
88
- impactedFiles,
89
- suggestedTests,
90
- requiresVerification,
91
- context: lines.join("\n"),
92
- };
93
- }
94
- }
@@ -1,27 +0,0 @@
1
- export class AutoRetrieval {
2
- runtime;
3
- builder;
4
- projectId;
5
- constructor(runtime, builder, projectId) {
6
- this.runtime = runtime;
7
- this.builder = builder;
8
- this.projectId = projectId;
9
- }
10
- async prepare(prompt) {
11
- await this.runtime.userPrompt(prompt);
12
- const context = this.builder.build(this.projectId, prompt);
13
- return {
14
- originalPrompt: prompt,
15
- context,
16
- augmentedPrompt: context
17
- ? [
18
- "<toolnet_memory>",
19
- context,
20
- "</toolnet_memory>",
21
- "",
22
- prompt,
23
- ].join("\n")
24
- : prompt,
25
- };
26
- }
27
- }
@@ -1,18 +0,0 @@
1
- export async function beforeAgent(runtime, contextBuilder, projectId, prompt) {
2
- await runtime.userPrompt(prompt);
3
- const memoryContext = contextBuilder.build(projectId, prompt);
4
- const augmentedPrompt = memoryContext
5
- ? [
6
- "<toolnet_memory>",
7
- memoryContext,
8
- "</toolnet_memory>",
9
- "",
10
- prompt,
11
- ].join("\n")
12
- : prompt;
13
- return {
14
- prompt,
15
- memoryContext,
16
- augmentedPrompt,
17
- };
18
- }
@@ -1,3 +0,0 @@
1
- export async function beforeCompact(runtime) {
2
- await runtime.flush();
3
- }
@@ -1,20 +0,0 @@
1
- export async function beforeEdit(impactGuard, projectId, filePath) {
2
- const result = impactGuard.analyzeFile(projectId, filePath);
3
- /*
4
- * Không block cứng AI.
5
- * Guard cảnh báo và yêu cầu verify.
6
- */
7
- return {
8
- allowed: true,
9
- risk: result.risk,
10
- riskScore: result.riskScore,
11
- impactedFiles: result.impactedFiles,
12
- suggestedTests: result.suggestedTests,
13
- warning: result.risk ===
14
- "CRITICAL" ||
15
- result.risk ===
16
- "HIGH"
17
- ? `High blast radius: verify ${result.impactedFiles.length} impacted files before finalizing edit.`
18
- : undefined,
19
- };
20
- }
@@ -1,11 +0,0 @@
1
- export * from "./runtime.js";
2
- export * from "./auto-context.js";
3
- export * from "./auto-retrieval.js";
4
- export * from "./session-start.js";
5
- export * from "./session-end.js";
6
- export * from "./before-agent.js";
7
- export * from "./after-tool.js";
8
- export * from "./after-edit.js";
9
- export * from "./before-compact.js";
10
- export * from "./before-edit.js";
11
- export * from "./auto-impact-guard.js";
@@ -1,110 +0,0 @@
1
- import { ActivityCapture, EventDeduplicator, EventQueue, SessionCapture, } from "../capture/index.js";
2
- import { MemoryProcessor } from "../processor/memory-processor.js";
3
- import { deduplicateMemories } from "../memory/deduplicate.js";
4
- export class HookRuntime {
5
- projectId;
6
- memory;
7
- memoryStore;
8
- queue = new EventQueue();
9
- capture = new ActivityCapture(this.queue);
10
- session = new SessionCapture(this.capture);
11
- processor;
12
- dedup = new EventDeduplicator();
13
- maxEventsBeforeFlush;
14
- constructor(options) {
15
- this.projectId = options.projectId;
16
- this.memory = options.memory;
17
- this.memoryStore = options.memoryStore;
18
- this.maxEventsBeforeFlush =
19
- options.maxEventsBeforeFlush ?? 100;
20
- this.processor = new MemoryProcessor(this.memory);
21
- }
22
- async sessionStart() {
23
- this.session.start(this.projectId);
24
- await this.flushIfNeeded();
25
- }
26
- async sessionEnd() {
27
- this.session.end(this.projectId);
28
- await this.flush();
29
- }
30
- async userPrompt(content) {
31
- this.capture.capture(this.projectId, "user_prompt", { content });
32
- await this.flushIfNeeded();
33
- }
34
- async beforeTool(tool, input) {
35
- this.capture.capture(this.projectId, "tool_call", {
36
- phase: "before",
37
- tool,
38
- input,
39
- });
40
- await this.flushIfNeeded();
41
- }
42
- async afterTool(tool, output) {
43
- this.capture.capture(this.projectId, "tool_call", {
44
- phase: "after",
45
- tool,
46
- output,
47
- });
48
- await this.flushIfNeeded();
49
- }
50
- async fileRead(filePath) {
51
- this.capture.capture(this.projectId, "file_read", { filePath });
52
- await this.flushIfNeeded();
53
- }
54
- async fileWrite(filePath) {
55
- this.capture.capture(this.projectId, "file_write", { filePath });
56
- await this.flushIfNeeded();
57
- }
58
- async command(command, exitCode) {
59
- this.capture.capture(this.projectId, "command", {
60
- command,
61
- exitCode,
62
- });
63
- await this.flushIfNeeded();
64
- }
65
- async error(error) {
66
- const message = error instanceof Error
67
- ? error.message
68
- : String(error);
69
- this.capture.capture(this.projectId, "error", { message });
70
- await this.flushIfNeeded();
71
- }
72
- async decision(content, metadata = {}) {
73
- this.capture.capture(this.projectId, "decision", {
74
- content,
75
- ...metadata,
76
- });
77
- await this.flushIfNeeded();
78
- }
79
- async todo(content, metadata = {}) {
80
- this.capture.capture(this.projectId, "todo", {
81
- content,
82
- ...metadata,
83
- });
84
- await this.flushIfNeeded();
85
- }
86
- async flushIfNeeded() {
87
- if (this.queue.shouldFlush(this.maxEventsBeforeFlush)) {
88
- await this.flush();
89
- }
90
- }
91
- async flush() {
92
- const events = this.queue.drain();
93
- if (events.length === 0) {
94
- return 0;
95
- }
96
- const uniqueEvents = this.dedup.filter(events);
97
- if (uniqueEvents.length === 0) {
98
- return 0;
99
- }
100
- const created = this.processor.process(uniqueEvents);
101
- const records = deduplicateMemories(this.memory.exportProject(this.projectId));
102
- this.memory.clearProject(this.projectId);
103
- this.memory.importRecords(records);
104
- await this.memoryStore.save(this.projectId, records);
105
- return created;
106
- }
107
- pendingEvents() {
108
- return this.queue.size();
109
- }
110
- }
@@ -1,3 +0,0 @@
1
- export async function onSessionEnd(runtime) {
2
- await runtime.sessionEnd();
3
- }
@@ -1,3 +0,0 @@
1
- export async function onSessionStart(runtime) {
2
- await runtime.sessionStart();
3
- }
package/dist/src/index.js DELETED
@@ -1,22 +0,0 @@
1
- import { createToolNetMemoryRuntime, } from "./runtime/index.js";
2
- async function main() {
3
- const runtime = createToolNetMemoryRuntime();
4
- const startup = await runtime.start();
5
- const prepared = await runtime.preparePrompt("Tiếp tục công việc hiện tại");
6
- console.log({
7
- started: true,
8
- ...startup,
9
- contextCharacters: prepared.context.length,
10
- });
11
- const shutdown = await runtime.stop();
12
- console.log({
13
- stopped: true,
14
- memories: shutdown.memories,
15
- codeParsed: shutdown.code.parsed,
16
- vectorsIndexed: shutdown.vectors.indexed,
17
- });
18
- }
19
- main().catch((error) => {
20
- console.error(error);
21
- process.exit(1);
22
- });
@@ -1,68 +0,0 @@
1
- import "dotenv/config";
2
- import { loadConfig, MemoryEngine, ProjectManager, } from "../core/index.js";
3
- import { RetrievalEngine, } from "../retrieval/retrieval-engine.js";
4
- import { createEmbeddingProvider, } from "../embeddings/index.js";
5
- import { CodeGraphStore, ReferenceResolver, SemanticCodeEngine, } from "../code-intelligence/index.js";
6
- import { createStorageProvider, withStorageRetry, ProjectScopedStorageProvider, MemoryStore, PersistentCodeGraphStore, } from "../storage/index.js";
7
- import { startMCPServer, } from "./server.js";
8
- import { ProjectLock, } from "../production/project-lock.js";
9
- async function main() {
10
- const config = loadConfig();
11
- const project = new ProjectManager()
12
- .detect();
13
- const rawStorage = createStorageProvider({
14
- provider: config.storage.provider,
15
- huggingface: config.storage.huggingface,
16
- localRoot: config.storage.localRoot,
17
- });
18
- const retryStorage = withStorageRetry(rawStorage, {
19
- attempts: Number(process.env
20
- .TOOLNET_STORAGE_RETRIES ??
21
- 3),
22
- });
23
- const storage = new ProjectScopedStorageProvider(retryStorage, project.id, project.name, project.remote ?? project.name);
24
- const processLock = new ProjectLock(project.id);
25
- await processLock.acquire();
26
- const stop = () => {
27
- void processLock
28
- .release()
29
- .finally(() => process.exit(0));
30
- };
31
- process.once("SIGINT", stop);
32
- process.once("SIGTERM", stop);
33
- const memory = new MemoryEngine();
34
- const memoryStore = new MemoryStore(storage);
35
- memory.importRecords(await memoryStore.load(project.id));
36
- const retrieval = new RetrievalEngine(memory);
37
- const graph = new CodeGraphStore();
38
- const graphSnapshot = await new PersistentCodeGraphStore(storage).load(project.id);
39
- if (graphSnapshot) {
40
- graph.import(graphSnapshot.symbols, graphSnapshot.edges);
41
- }
42
- const references = new ReferenceResolver(graph);
43
- const codeSemantic = new SemanticCodeEngine({
44
- projectId: project.id,
45
- rootPath: project.rootPath,
46
- model: process.env
47
- .HF_EMBEDDING_MODEL ??
48
- "sentence-transformers/all-MiniLM-L6-v2",
49
- storage,
50
- embeddings: createEmbeddingProvider(),
51
- graph,
52
- });
53
- await codeSemantic.initialize();
54
- await startMCPServer({
55
- project,
56
- memory,
57
- retrieval,
58
- graph,
59
- references,
60
- codeSemantic,
61
- memoryStore,
62
- storage,
63
- });
64
- }
65
- main().catch((error) => {
66
- console.error(error);
67
- process.exit(1);
68
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- export * from "./context.js";
2
- export * from "./server.js";
3
- export * from "./tools/index.js";
@@ -1,45 +0,0 @@
1
- import { McpServer, } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- import { StdioServerTransport, } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { memorySearch, memorySearchSchema, memoryRemember, memoryRememberSchema, memoryForget, memoryForgetSchema, findSymbol, findSymbolSchema, findCallers, findCallersSchema, searchCode, searchCodeSchema, projectContext, projectContextSchema, traceCalls, traceCallsSchema, analyzeImpact, analyzeImpactSchema, getProjectArchitecture, findDependencies, findDependenciesSchema, semanticCodeSearch, semanticCodeSearchSchema, snapshotCreate, snapshotCreateSchema, snapshotList, snapshotRestore, snapshotRestoreSchema, impactGuard, impactGuardSchema, graphDependents, graphDependentsSchema, graphPath, graphPathSchema, graphNeighborhood, graphNeighborhoodSchema, deadCode, deadCodeSchema, } from "./tools/index.js";
4
- function jsonText(value) {
5
- return {
6
- content: [
7
- {
8
- type: "text",
9
- text: JSON.stringify(value, null, 2),
10
- },
11
- ],
12
- };
13
- }
14
- export function createMCPServer(ctx) {
15
- const server = new McpServer({
16
- name: "toolnet-memory",
17
- version: "0.1.0",
18
- });
19
- server.tool("memory_search", "Search relevant long-term memory for the current project.", memorySearchSchema, async (input) => jsonText(await memorySearch(ctx, input)));
20
- server.tool("memory_save", "Save an important memory, decision, rule, TODO or summary.", memoryRememberSchema, async (input) => jsonText(await memoryRemember(ctx, input)));
21
- server.tool("memory_forget", "Delete a memory by id.", memoryForgetSchema, async (input) => jsonText(await memoryForget(ctx, input)));
22
- server.tool("find_symbol", "Find code symbols by exact name.", findSymbolSchema, async (input) => jsonText(await findSymbol(ctx, input)));
23
- server.tool("find_callers", "Find functions or methods calling a symbol.", findCallersSchema, async (input) => jsonText(await findCallers(ctx, input)));
24
- server.tool("code_search", "Search indexed code symbols and files.", searchCodeSchema, async (input) => jsonText(await searchCode(ctx, input)));
25
- server.tool("project_context", "Get compact project architecture, recent memory and relevant context.", projectContextSchema, async (input) => jsonText(await projectContext(ctx, input)));
26
- server.tool("trace_calls", "Trace callers or callees through the code call graph.", traceCallsSchema, async (input) => jsonText(await traceCalls(ctx, input)));
27
- server.tool("analyze_impact", "Analyze what code can be affected if a symbol changes.", analyzeImpactSchema, async (input) => jsonText(await analyzeImpact(ctx, input)));
28
- server.tool("get_architecture", "Get compact architecture statistics for the indexed project.", {}, async () => jsonText(await getProjectArchitecture(ctx)));
29
- server.tool("find_dependencies", "Find direct file dependencies and reverse dependents.", findDependenciesSchema, async (input) => jsonText(await findDependencies(ctx, input)));
30
- server.tool("semantic_code_search", "Search source code by semantic meaning, not only exact symbol names.", semanticCodeSearchSchema, async (input) => jsonText(await semanticCodeSearch(ctx, input)));
31
- server.tool("snapshot_create", "Create a safe versioned snapshot of project memory, vectors and graph.", snapshotCreateSchema, async (input) => jsonText(await snapshotCreate(ctx, input)));
32
- server.tool("snapshot_list", "List available ToolNet Memory snapshots.", {}, async () => jsonText(await snapshotList(ctx)));
33
- server.tool("snapshot_restore", "Restore a previous ToolNet Memory snapshot. A safety snapshot is created first.", snapshotRestoreSchema, async (input) => jsonText(await snapshotRestore(ctx, input)));
34
- server.tool("impact_guard", "Analyze blast radius before or after code changes. Maps changed files/lines to symbols, follows reverse dependencies, assigns risk and suggests verification targets.", impactGuardSchema, async (input) => jsonText(await impactGuard(ctx, input)));
35
- server.tool("graph_dependents", "Find code symbols that depend on a symbol through calls, imports, type usage, writes, inheritance or implementation relationships.", graphDependentsSchema, async (input) => jsonText(await graphDependents(ctx, input)));
36
- server.tool("graph_path", "Find the shortest dependency path between two code symbols.", graphPathSchema, async (input) => jsonText(await graphPath(ctx, input)));
37
- server.tool("graph_neighborhood", "Explore incoming and outgoing dependency relationships around a code symbol.", graphNeighborhoodSchema, async (input) => jsonText(await graphNeighborhood(ctx, input)));
38
- server.tool("dead_code", "Find likely unused code. Results are candidates and must be verified before deletion.", deadCodeSchema, async (input) => jsonText(await deadCode(ctx, input)));
39
- return server;
40
- }
41
- export async function startMCPServer(ctx) {
42
- const server = createMCPServer(ctx);
43
- const transport = new StdioServerTransport();
44
- await server.connect(transport);
45
- }
@@ -1,41 +0,0 @@
1
- import { z, } from "zod";
2
- import { ImpactAnalyzer, } from "../../code-intelligence/impact/impact-analyzer.js";
3
- export const analyzeImpactSchema = {
4
- symbolId: z.string().min(1),
5
- depth: z.number()
6
- .int()
7
- .min(1)
8
- .max(10)
9
- .optional(),
10
- };
11
- export async function analyzeImpact(ctx, input) {
12
- const symbol = ctx.graph.getSymbol(input.symbolId);
13
- if (!symbol) {
14
- return {
15
- found: false,
16
- impacts: [],
17
- };
18
- }
19
- const analyzer = new ImpactAnalyzer(ctx.graph);
20
- const impacts = analyzer.analyze(ctx.project.id, symbol.id, input.depth ?? 4);
21
- return {
22
- found: true,
23
- target: {
24
- id: symbol.id,
25
- name: symbol.name,
26
- qualifiedName: symbol.qualifiedName,
27
- filePath: symbol.filePath,
28
- type: symbol.type,
29
- },
30
- impacts: impacts.map((item) => ({
31
- id: item.symbol.id,
32
- name: item.symbol.name,
33
- qualifiedName: item.symbol
34
- .qualifiedName,
35
- filePath: item.symbol.filePath,
36
- type: item.symbol.type,
37
- relation: item.relation,
38
- depth: item.depth,
39
- })),
40
- };
41
- }