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,70 +0,0 @@
1
- import { existsSync, readFileSync, } from "node:fs";
2
- import { homedir, } from "node:os";
3
- import { join, } from "node:path";
4
- function decodeValue(input) {
5
- let value = input.trim();
6
- if (value.length >= 2 &&
7
- value.startsWith('"') &&
8
- value.endsWith('"')) {
9
- value =
10
- value.slice(1, -1);
11
- return value
12
- .replace(/\\n/g, "\n")
13
- .replace(/\\r/g, "\r")
14
- .replace(/\\t/g, "\t")
15
- .replace(/\\"/g, '"')
16
- .replace(/\\\\/g, "\\");
17
- }
18
- if (value.length >= 2 &&
19
- value.startsWith("'") &&
20
- value.endsWith("'")) {
21
- return value.slice(1, -1);
22
- }
23
- return value;
24
- }
25
- export function loadGlobalToolNetEnv() {
26
- const filePath = process.env
27
- .TOOLNET_GLOBAL_ENV ??
28
- join(homedir(), ".config", "toolnet-memory", ".env");
29
- if (!existsSync(filePath)) {
30
- return;
31
- }
32
- const content = readFileSync(filePath, "utf8");
33
- for (const rawLine of content.split(/\r?\n/)) {
34
- let line = rawLine.trim();
35
- if (!line ||
36
- line.startsWith("#")) {
37
- continue;
38
- }
39
- if (line.startsWith("export ")) {
40
- line =
41
- line.slice("export ".length);
42
- }
43
- const index = line.indexOf("=");
44
- if (index <= 0) {
45
- continue;
46
- }
47
- const key = line
48
- .slice(0, index)
49
- .trim();
50
- if (!/^[A-Za-z_][A-Za-z0-9_]*$/
51
- .test(key)) {
52
- continue;
53
- }
54
- /*
55
- * Shell ENV / project-specific config wins.
56
- *
57
- * Global config only fills missing values.
58
- */
59
- if (process.env[key] !==
60
- undefined) {
61
- continue;
62
- }
63
- process.env[key] =
64
- decodeValue(line.slice(index + 1));
65
- }
66
- }
67
- /*
68
- * Load immediately when imported by config.ts.
69
- */
70
- loadGlobalToolNetEnv();
@@ -1,30 +0,0 @@
1
- const BASE_SCORES = {
2
- critical: 100,
3
- high: 75,
4
- normal: 50,
5
- temporary: 20,
6
- };
7
- export function getImportanceScore(level) {
8
- return BASE_SCORES[level];
9
- }
10
- export function inferImportance(type, content) {
11
- const text = content.toLowerCase();
12
- if (text.includes("không được") ||
13
- text.includes("bắt buộc") ||
14
- text.includes("must not") ||
15
- text.includes("critical")) {
16
- return "critical";
17
- }
18
- if (type === "rule" ||
19
- type === "decision") {
20
- return "high";
21
- }
22
- if (type === "todo") {
23
- return "normal";
24
- }
25
- if (type === "activity" ||
26
- type === "summary") {
27
- return "temporary";
28
- }
29
- return "normal";
30
- }
@@ -1,5 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./config.js";
3
- export * from "./importance.js";
4
- export * from "./project-manager.js";
5
- export * from "./memory-engine.js";
@@ -1,183 +0,0 @@
1
- import { randomUUID, } from "node:crypto";
2
- import { getImportanceScore, inferImportance, } from "./importance.js";
3
- import { Sanitizer, } from "../security/sanitizer.js";
4
- import { ConflictDetector, } from "../memory/conflict-detector.js";
5
- import { defaultExpiry, effectiveImportanceScore, isExpired, isMemoryActive, } from "../memory/decay.js";
6
- export class MemoryEngine {
7
- memories = new Map();
8
- sanitizer = new Sanitizer();
9
- conflicts = new ConflictDetector();
10
- remember(input) {
11
- const now = new Date().toISOString();
12
- const content = this.sanitizer
13
- .sanitize(input.content.trim()).text;
14
- const importance = input.importance ??
15
- inferImportance(input.type, content);
16
- const memory = {
17
- id: randomUUID(),
18
- projectId: input.projectId,
19
- type: input.type,
20
- content,
21
- importance,
22
- importanceScore: getImportanceScore(importance),
23
- tags: input.tags ?? [],
24
- source: input.source ?? "agent",
25
- createdAt: now,
26
- updatedAt: now,
27
- expiresAt: input.expiresAt ??
28
- defaultExpiry(input.type, importance, new Date(now)),
29
- metadata: this.sanitizer
30
- .sanitizeValue(input.metadata),
31
- };
32
- const superseded = this.conflicts.findSuperseded(memory, this.list(input.projectId));
33
- if (superseded.length) {
34
- memory.metadata = {
35
- ...(memory.metadata ?? {}),
36
- supersedes: superseded.map((item) => item.id),
37
- };
38
- for (const old of superseded) {
39
- old.updatedAt = now;
40
- old.metadata = {
41
- ...(old.metadata ?? {}),
42
- supersededBy: memory.id,
43
- supersededAt: now,
44
- };
45
- this.memories.set(old.id, old);
46
- }
47
- }
48
- this.memories.set(memory.id, memory);
49
- return memory;
50
- }
51
- importRecords(records) {
52
- let imported = 0;
53
- for (const memory of records) {
54
- if (!memory?.id) {
55
- continue;
56
- }
57
- this.memories.set(memory.id, memory);
58
- imported++;
59
- }
60
- return imported;
61
- }
62
- exportProject(projectId) {
63
- return this.listAll(projectId);
64
- }
65
- get(id) {
66
- return this.memories.get(id);
67
- }
68
- delete(id) {
69
- return this.memories.delete(id);
70
- }
71
- listAll(projectId) {
72
- return [...this.memories.values()]
73
- .filter((memory) => memory.projectId ===
74
- projectId)
75
- .sort((a, b) => b.createdAt.localeCompare(a.createdAt));
76
- }
77
- list(projectId) {
78
- return this.listAll(projectId).filter((memory) => isMemoryActive(memory));
79
- }
80
- recent(projectId, limit = 10) {
81
- return this.list(projectId)
82
- .slice(0, limit);
83
- }
84
- byType(projectId, type) {
85
- return this.list(projectId)
86
- .filter((memory) => memory.type === type);
87
- }
88
- search(query) {
89
- const q = query.query
90
- .trim()
91
- .toLowerCase();
92
- const limit = query.limit ?? 10;
93
- const tokens = q.split(/\s+/)
94
- .filter(Boolean);
95
- return this.list(query.projectId)
96
- .filter((memory) => {
97
- if (query.types &&
98
- !query.types.includes(memory.type)) {
99
- return false;
100
- }
101
- const effective = effectiveImportanceScore(memory);
102
- if (query.minImportanceScore &&
103
- effective <
104
- query.minImportanceScore) {
105
- return false;
106
- }
107
- if (query.tags?.length) {
108
- const hasTag = query.tags.some((tag) => memory.tags.includes(tag));
109
- if (!hasTag) {
110
- return false;
111
- }
112
- }
113
- return true;
114
- })
115
- .map((memory) => {
116
- const content = memory.content
117
- .toLowerCase();
118
- const matches = tokens.filter((token) => content.includes(token)).length;
119
- const textScore = tokens.length === 0
120
- ? 0
121
- : matches /
122
- tokens.length;
123
- const importanceBoost = effectiveImportanceScore(memory) / 500;
124
- return {
125
- memory,
126
- score: textScore +
127
- importanceBoost,
128
- source: "memory",
129
- };
130
- })
131
- .filter((result) => q.length === 0 ||
132
- result.score > 0)
133
- .sort((a, b) => b.score - a.score)
134
- .slice(0, limit);
135
- }
136
- pruneExpired(projectId, now = Date.now()) {
137
- let removed = 0;
138
- for (const [id, memory] of this.memories) {
139
- if (memory.projectId ===
140
- projectId &&
141
- isExpired(memory, now)) {
142
- this.memories.delete(id);
143
- removed++;
144
- }
145
- }
146
- return removed;
147
- }
148
- pruneSuperseded(projectId, retentionDays = 30, now = Date.now()) {
149
- let removed = 0;
150
- const retentionMs = retentionDays *
151
- 86_400_000;
152
- for (const [id, memory] of this.memories) {
153
- if (memory.projectId !==
154
- projectId) {
155
- continue;
156
- }
157
- const supersededAt = memory.metadata
158
- ?.supersededAt;
159
- if (typeof supersededAt !==
160
- "string") {
161
- continue;
162
- }
163
- const age = now -
164
- new Date(supersededAt).getTime();
165
- if (age >= retentionMs) {
166
- this.memories.delete(id);
167
- removed++;
168
- }
169
- }
170
- return removed;
171
- }
172
- clearProject(projectId) {
173
- let deleted = 0;
174
- for (const [id, memory] of this.memories) {
175
- if (memory.projectId ===
176
- projectId) {
177
- this.memories.delete(id);
178
- deleted++;
179
- }
180
- }
181
- return deleted;
182
- }
183
- }
@@ -1,243 +0,0 @@
1
- import { createHash, } from "node:crypto";
2
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
3
- import { basename, dirname, join, parse, resolve, } from "node:path";
4
- const TOOLNET_DIRECTORY = ".toolnet";
5
- const PROJECT_FILE = "project.json";
6
- /**
7
- * Legacy ID algorithm.
8
- *
9
- * IMPORTANT:
10
- * Existing ToolNet projects already use this ID internally.
11
- * We keep it for the first local manifest creation so no
12
- * graph/memory/snapshot projectId is invalidated.
13
- *
14
- * Once stored in .toolnet/project.json, the ID no longer
15
- * depends on the path.
16
- */
17
- function legacyProjectIdFromPath(rootPath) {
18
- return createHash("sha256")
19
- .update(rootPath)
20
- .digest("hex")
21
- .slice(0, 16);
22
- }
23
- function manifestPath(rootPath) {
24
- return join(rootPath, TOOLNET_DIRECTORY, PROJECT_FILE);
25
- }
26
- function hasProjectManifest(rootPath) {
27
- return existsSync(manifestPath(rootPath));
28
- }
29
- /**
30
- * Search upwards for an existing ToolNet project identity.
31
- *
32
- * This means running ToolNet from:
33
- *
34
- * ~/mercedes/src/foo/
35
- *
36
- * still resolves:
37
- *
38
- * ~/mercedes/.toolnet/project.json
39
- */
40
- function findExistingProjectRoot(startPath) {
41
- let current = resolve(startPath);
42
- const filesystemRoot = parse(current).root;
43
- while (true) {
44
- if (hasProjectManifest(current)) {
45
- return current;
46
- }
47
- if (current ===
48
- filesystemRoot) {
49
- break;
50
- }
51
- const parent = dirname(current);
52
- if (parent ===
53
- current) {
54
- break;
55
- }
56
- current =
57
- parent;
58
- }
59
- return null;
60
- }
61
- /**
62
- * When a project has not been initialized yet, try to identify
63
- * its repository root instead of accidentally creating
64
- * .toolnet inside src/foo/.
65
- */
66
- function findRepositoryRoot(startPath) {
67
- let current = resolve(startPath);
68
- const filesystemRoot = parse(current).root;
69
- const markers = [
70
- ".git",
71
- "package.json",
72
- "pyproject.toml",
73
- "Cargo.toml",
74
- "go.mod",
75
- "composer.json",
76
- ];
77
- while (true) {
78
- if (markers.some((marker) => existsSync(join(current, marker)))) {
79
- return current;
80
- }
81
- if (current ===
82
- filesystemRoot) {
83
- break;
84
- }
85
- const parent = dirname(current);
86
- if (parent ===
87
- current) {
88
- break;
89
- }
90
- current =
91
- parent;
92
- }
93
- return resolve(startPath);
94
- }
95
- function parseManifest(filePath) {
96
- let value;
97
- try {
98
- value =
99
- JSON.parse(readFileSync(filePath, "utf8"));
100
- }
101
- catch (error) {
102
- throw new Error(`Invalid ToolNet project manifest: ${filePath}: ${error instanceof Error
103
- ? error.message
104
- : String(error)}`);
105
- }
106
- if (!value ||
107
- typeof value !==
108
- "object") {
109
- throw new Error(`Invalid ToolNet project manifest: ${filePath}`);
110
- }
111
- const data = value;
112
- if (typeof data.id !==
113
- "string" ||
114
- !data.id.trim()) {
115
- throw new Error(`ToolNet project manifest is missing id: ${filePath}`);
116
- }
117
- if (typeof data.name !==
118
- "string" ||
119
- !data.name.trim()) {
120
- throw new Error(`ToolNet project manifest is missing name: ${filePath}`);
121
- }
122
- const now = new Date()
123
- .toISOString();
124
- return {
125
- version: 1,
126
- id: data.id,
127
- name: data.name,
128
- remote: typeof data.remote ===
129
- "string" &&
130
- data.remote.trim()
131
- ? data.remote
132
- : data.name,
133
- rootPath: typeof data.rootPath ===
134
- "string"
135
- ? data.rootPath
136
- : dirname(dirname(filePath)),
137
- createdAt: typeof data.createdAt ===
138
- "string"
139
- ? data.createdAt
140
- : now,
141
- updatedAt: typeof data.updatedAt ===
142
- "string"
143
- ? data.updatedAt
144
- : now,
145
- graphVersion: typeof data.graphVersion ===
146
- "number"
147
- ? data.graphVersion
148
- : 0,
149
- memoryVersion: typeof data.memoryVersion ===
150
- "number"
151
- ? data.memoryVersion
152
- : 0,
153
- metadata: data.metadata &&
154
- typeof data.metadata ===
155
- "object"
156
- ? data.metadata
157
- : undefined,
158
- };
159
- }
160
- function writeManifest(rootPath, manifest) {
161
- const directory = join(rootPath, TOOLNET_DIRECTORY);
162
- mkdirSync(directory, {
163
- recursive: true,
164
- });
165
- const target = manifestPath(rootPath);
166
- const temporary = `${target}.tmp-${process.pid}`;
167
- writeFileSync(temporary, JSON.stringify(manifest, null, 2) + "\n", {
168
- encoding: "utf8",
169
- mode: 0o600,
170
- });
171
- renameSync(temporary, target);
172
- }
173
- function toProjectManifest(local, rootPath) {
174
- return {
175
- id: local.id,
176
- name: local.name,
177
- remote: local.remote,
178
- rootPath,
179
- createdAt: local.createdAt,
180
- updatedAt: local.updatedAt,
181
- graphVersion: local.graphVersion,
182
- memoryVersion: local.memoryVersion,
183
- metadata: local.metadata,
184
- };
185
- }
186
- export class ProjectManager {
187
- detect(rootPath = process.cwd()) {
188
- const requestedPath = resolve(rootPath);
189
- /*
190
- * Existing project identity always wins.
191
- */
192
- const existingRoot = findExistingProjectRoot(requestedPath);
193
- if (existingRoot) {
194
- const filePath = manifestPath(existingRoot);
195
- const local = parseManifest(filePath);
196
- /*
197
- * Project may have been moved or its folder renamed.
198
- *
199
- * Update only rootPath.
200
- * DO NOT change:
201
- * id
202
- * name
203
- * remote
204
- */
205
- if (local.rootPath !==
206
- existingRoot) {
207
- local.rootPath =
208
- existingRoot;
209
- local.updatedAt =
210
- new Date()
211
- .toISOString();
212
- writeManifest(existingRoot, local);
213
- }
214
- return toProjectManifest(local, existingRoot);
215
- }
216
- /*
217
- * First ToolNet initialization.
218
- */
219
- const projectRoot = findRepositoryRoot(requestedPath);
220
- const now = new Date()
221
- .toISOString();
222
- const name = basename(projectRoot);
223
- const local = {
224
- version: 1,
225
- /*
226
- * Preserve the legacy ID on first initialization.
227
- *
228
- * From now on this value lives in the manifest
229
- * and becomes path-independent.
230
- */
231
- id: legacyProjectIdFromPath(projectRoot),
232
- name,
233
- remote: name,
234
- rootPath: projectRoot,
235
- createdAt: now,
236
- updatedAt: now,
237
- graphVersion: 0,
238
- memoryVersion: 0,
239
- };
240
- writeManifest(projectRoot, local);
241
- return toProjectManifest(local, projectRoot);
242
- }
243
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,51 +0,0 @@
1
- import { HuggingFaceEmbeddingProvider, } from "./remote.js";
2
- import { HashEmbeddingProvider, } from "./local.js";
3
- export class ResilientEmbeddingProvider {
4
- primary;
5
- fallback;
6
- name = "resilient";
7
- constructor(primary, fallback = new HashEmbeddingProvider()) {
8
- this.primary = primary;
9
- this.fallback = fallback;
10
- }
11
- async embed(text) {
12
- if (this.primary) {
13
- try {
14
- return await this.primary.embed(text);
15
- }
16
- catch (error) {
17
- console.warn("[embedding] primary failed, fallback enabled:", error instanceof Error
18
- ? error.message
19
- : error);
20
- }
21
- }
22
- return this.fallback.embed(text);
23
- }
24
- async embedMany(texts) {
25
- if (this.primary) {
26
- try {
27
- return await this.primary
28
- .embedMany(texts);
29
- }
30
- catch (error) {
31
- console.warn("[embedding] primary failed, fallback enabled:", error instanceof Error
32
- ? error.message
33
- : error);
34
- }
35
- }
36
- return this.fallback
37
- .embedMany(texts);
38
- }
39
- }
40
- export function createEmbeddingProvider() {
41
- const token = process.env.HF_TOKEN;
42
- const model = process.env.HF_EMBEDDING_MODEL ??
43
- "sentence-transformers/all-MiniLM-L6-v2";
44
- const primary = token
45
- ? new HuggingFaceEmbeddingProvider({
46
- token,
47
- model,
48
- })
49
- : null;
50
- return new ResilientEmbeddingProvider(primary);
51
- }
@@ -1,4 +0,0 @@
1
- export * from "./provider.js";
2
- export * from "./embedder.js";
3
- export * from "./remote.js";
4
- export * from "./local.js";
@@ -1,37 +0,0 @@
1
- import { createHash, } from "node:crypto";
2
- /*
3
- * Fallback nhẹ để hệ thống không chết
4
- * khi HF API lỗi/quota.
5
- *
6
- * Không thay thế semantic embedding thật.
7
- */
8
- export class HashEmbeddingProvider {
9
- name = "hash-fallback";
10
- dimensions = 128;
11
- async embed(text) {
12
- const vector = new Array(this.dimensions).fill(0);
13
- const words = text
14
- .toLowerCase()
15
- .split(/\s+/)
16
- .filter(Boolean);
17
- for (const word of words) {
18
- const hash = createHash("sha256")
19
- .update(word)
20
- .digest();
21
- const index = hash.readUInt32BE(0) %
22
- this.dimensions;
23
- vector[index] += 1;
24
- }
25
- return normalize(vector);
26
- }
27
- async embedMany(texts) {
28
- return Promise.all(texts.map((text) => this.embed(text)));
29
- }
30
- }
31
- function normalize(vector) {
32
- const norm = Math.sqrt(vector.reduce((sum, value) => sum + value * value, 0));
33
- if (norm === 0) {
34
- return vector;
35
- }
36
- return vector.map((value) => value / norm);
37
- }
@@ -1 +0,0 @@
1
- export {};