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,219 +0,0 @@
1
- import fs from "node:fs";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import readline from "node:readline/promises";
5
- import { stdin as input, stdout as output } from "node:process";
6
- const CONFIG_DIR = path.join(os.homedir(), ".config", "toolnet-memory");
7
- const ENV_FILE = path.join(CONFIG_DIR, ".env");
8
- function parseEnv(text) {
9
- const values = new Map();
10
- for (const raw of text.split(/\r?\n/)) {
11
- const line = raw.trim();
12
- if (!line || line.startsWith("#"))
13
- continue;
14
- const i = line.indexOf("=");
15
- if (i === -1)
16
- continue;
17
- values.set(line.slice(0, i).trim(), line.slice(i + 1).trim());
18
- }
19
- return values;
20
- }
21
- function saveEnv(values) {
22
- fs.mkdirSync(CONFIG_DIR, {
23
- recursive: true,
24
- mode: 0o700
25
- });
26
- const content = `# ==========================================================
27
- # TOOLNET MEMORY
28
- # ==========================================================
29
-
30
- MEMORY_STORAGE_PROVIDER=huggingface
31
-
32
- # Hugging Face
33
- HF_NAMESPACE=${values.get("HF_NAMESPACE") ?? ""}
34
- HF_BUCKET=${values.get("HF_BUCKET") ?? "toolnet-memory"}
35
- HF_S3_ACCESS_KEY_ID=${values.get("HF_S3_ACCESS_KEY_ID") ?? ""}
36
- HF_S3_SECRET_ACCESS_KEY=${values.get("HF_S3_SECRET_ACCESS_KEY") ?? ""}
37
-
38
- # Local cache
39
- MEMORY_LOCAL_STORAGE_PATH=${values.get("MEMORY_LOCAL_STORAGE_PATH") ?? ""}
40
- MEMORY_LOCAL_CACHE_MB=${values.get("MEMORY_LOCAL_CACHE_MB") ?? "200"}
41
-
42
- # Automation
43
- MEMORY_AUTO_CAPTURE=${values.get("MEMORY_AUTO_CAPTURE") ?? "true"}
44
- MEMORY_AUTO_RETRIEVE=${values.get("MEMORY_AUTO_RETRIEVE") ?? "true"}
45
- MEMORY_AUTO_SUMMARIZE=${values.get("MEMORY_AUTO_SUMMARIZE") ?? "true"}
46
- MEMORY_AUTO_SYNC=${values.get("MEMORY_AUTO_SYNC") ?? "true"}
47
-
48
- # Retrieval
49
- MEMORY_MAX_CANDIDATES=${values.get("MEMORY_MAX_CANDIDATES") ?? "50"}
50
- MEMORY_RERANK_TOP=${values.get("MEMORY_RERANK_TOP") ?? "10"}
51
- MEMORY_FINAL_CONTEXT=${values.get("MEMORY_FINAL_CONTEXT") ?? "5"}
52
- MEMORY_TOKEN_BUDGET=${values.get("MEMORY_TOKEN_BUDGET") ?? "2000"}
53
- `;
54
- fs.writeFileSync(ENV_FILE, content, {
55
- encoding: "utf8",
56
- mode: 0o600
57
- });
58
- fs.chmodSync(CONFIG_DIR, 0o700);
59
- fs.chmodSync(ENV_FILE, 0o600);
60
- }
61
- function yes(answer, defaultYes = true) {
62
- const value = answer.trim().toLowerCase();
63
- if (!value)
64
- return defaultYes;
65
- return value === "y" || value === "yes";
66
- }
67
- async function hiddenQuestion(label) {
68
- if (!input.isTTY)
69
- return "";
70
- output.write(label);
71
- return new Promise(resolve => {
72
- let value = "";
73
- const finish = () => {
74
- input.off("data", onData);
75
- input.setRawMode?.(false);
76
- input.pause();
77
- output.write("\n");
78
- resolve(value);
79
- };
80
- const onData = (chunk) => {
81
- for (const ch of chunk.toString("utf8")) {
82
- if (ch === "\r" || ch === "\n") {
83
- finish();
84
- return;
85
- }
86
- if (ch === "\u0003") {
87
- input.setRawMode?.(false);
88
- output.write("\n");
89
- process.exit(130);
90
- }
91
- if (ch === "\u007f") {
92
- value = value.slice(0, -1);
93
- continue;
94
- }
95
- value += ch;
96
- }
97
- };
98
- input.resume();
99
- input.setRawMode?.(true);
100
- input.on("data", onData);
101
- });
102
- }
103
- async function main() {
104
- const exists = fs.existsSync(ENV_FILE);
105
- const values = exists
106
- ? parseEnv(fs.readFileSync(ENV_FILE, "utf8"))
107
- : new Map();
108
- const required = [
109
- "HF_NAMESPACE",
110
- "HF_BUCKET",
111
- "HF_S3_ACCESS_KEY_ID",
112
- "HF_S3_SECRET_ACCESS_KEY"
113
- ];
114
- const configured = required.every(key => Boolean(values.get(key)?.trim()));
115
- console.log("");
116
- console.log("TOOLNET MEMORY SETUP");
117
- console.log("====================");
118
- console.log("");
119
- console.log(`Config: ${ENV_FILE}`);
120
- console.log("");
121
- // curl | bash hoặc môi trường không interactive
122
- if (!input.isTTY || !output.isTTY) {
123
- if (!exists)
124
- saveEnv(values);
125
- if (configured) {
126
- console.log("✓ Hugging Face storage already configured");
127
- }
128
- else {
129
- console.log("Configuration pending.");
130
- console.log("Run:");
131
- console.log(" toolnet-memory setup");
132
- }
133
- return;
134
- }
135
- const rl = readline.createInterface({ input, output });
136
- if (configured) {
137
- console.log("✓ Hugging Face storage already configured");
138
- console.log("");
139
- const keep = await rl.question("Use existing configuration? (Y/n) [Y]: ");
140
- if (yes(keep)) {
141
- rl.close();
142
- console.log("");
143
- console.log("✓ Existing Hugging Face configuration kept");
144
- console.log("");
145
- console.log("Next:");
146
- console.log(" toolnet-memory doctor");
147
- return;
148
- }
149
- console.log("");
150
- }
151
- else {
152
- const configure = await rl.question("Configure Hugging Face storage now? (Y/n) [Y]: ");
153
- if (!yes(configure)) {
154
- rl.close();
155
- if (!exists)
156
- saveEnv(values);
157
- console.log("");
158
- console.log("Configuration pending.");
159
- console.log("Run later:");
160
- console.log(" toolnet-memory setup");
161
- return;
162
- }
163
- console.log("");
164
- }
165
- const oldNamespace = values.get("HF_NAMESPACE") || "";
166
- const oldBucket = values.get("HF_BUCKET") || "toolnet-memory";
167
- const namespace = await rl.question(oldNamespace
168
- ? `Hugging Face namespace [${oldNamespace}]: `
169
- : "Hugging Face namespace: ");
170
- const bucket = await rl.question(`Bucket [${oldBucket}]: `);
171
- const access = await rl.question(values.get("HF_S3_ACCESS_KEY_ID")
172
- ? "S3 Access Key ID [configured]: "
173
- : "S3 Access Key ID: ");
174
- rl.close();
175
- const secret = await hiddenQuestion(values.get("HF_S3_SECRET_ACCESS_KEY")
176
- ? "S3 Secret Access Key [configured]: "
177
- : "S3 Secret Access Key: ");
178
- if (namespace.trim()) {
179
- values.set("HF_NAMESPACE", namespace.trim());
180
- }
181
- if (bucket.trim()) {
182
- values.set("HF_BUCKET", bucket.trim());
183
- }
184
- else if (!values.get("HF_BUCKET")) {
185
- values.set("HF_BUCKET", "toolnet-memory");
186
- }
187
- if (access.trim()) {
188
- values.set("HF_S3_ACCESS_KEY_ID", access.trim());
189
- }
190
- if (secret.trim()) {
191
- values.set("HF_S3_SECRET_ACCESS_KEY", secret.trim());
192
- }
193
- saveEnv(values);
194
- const missing = required.filter(key => !values.get(key)?.trim());
195
- console.log("");
196
- console.log("✓ Configuration saved");
197
- console.log(` ${ENV_FILE}`);
198
- console.log("");
199
- if (missing.length) {
200
- console.log("Missing configuration:");
201
- for (const key of missing) {
202
- console.log(` - ${key}`);
203
- }
204
- console.log("");
205
- console.log("Run setup again:");
206
- console.log(" toolnet-memory setup");
207
- return;
208
- }
209
- console.log("✓ Hugging Face configuration complete");
210
- console.log("");
211
- console.log("Next:");
212
- console.log(" toolnet-memory doctor");
213
- }
214
- main().catch(error => {
215
- console.error(error instanceof Error
216
- ? error.message
217
- : String(error));
218
- process.exit(1);
219
- });
@@ -1,58 +0,0 @@
1
- import "dotenv/config";
2
- import { loadConfig, ProjectManager, } from "../core/index.js";
3
- import { createStorageProvider, withStorageRetry, ProjectScopedStorageProvider, } from "../storage/index.js";
4
- import { SnapshotManager, } from "../snapshot/index.js";
5
- import { restoreLatestSnapshot, } from "./recovery.js";
6
- async function main() {
7
- const command = process.argv[2];
8
- const config = loadConfig();
9
- const project = new ProjectManager()
10
- .detect();
11
- const rawStorage = withStorageRetry(createStorageProvider({
12
- provider: config.storage.provider,
13
- huggingface: config.storage.huggingface,
14
- localRoot: config.storage.localRoot,
15
- }), {
16
- attempts: 3,
17
- });
18
- const storage = new ProjectScopedStorageProvider(rawStorage, project.id, project.name, project.remote ?? project.name);
19
- const manager = new SnapshotManager(storage);
20
- if (command === "list") {
21
- const list = await manager.list(project.id);
22
- console.log(list.map((snapshot) => ({
23
- id: snapshot.id,
24
- createdAt: snapshot.createdAt,
25
- reason: snapshot.reason,
26
- })));
27
- return;
28
- }
29
- if (command === "create") {
30
- const reason = process.argv
31
- .slice(3)
32
- .join(" ") ||
33
- "manual-cli";
34
- console.log(await manager.create(project.id, reason));
35
- return;
36
- }
37
- if (command === "restore") {
38
- const id = process.argv[3];
39
- if (!id) {
40
- throw new Error("snapshot id required");
41
- }
42
- await manager.create(project.id, "before-cli-restore");
43
- console.log(await manager.restore(project.id, id));
44
- return;
45
- }
46
- if (command ===
47
- "recover-latest") {
48
- console.log(await restoreLatestSnapshot(storage, project.id));
49
- return;
50
- }
51
- throw new Error("Usage: snapshot-cli list|create|restore|recover-latest");
52
- }
53
- main().catch((error) => {
54
- console.error(error instanceof Error
55
- ? error.message
56
- : error);
57
- process.exit(1);
58
- });
@@ -1,77 +0,0 @@
1
- import { readFileSync, } from "node:fs";
2
- import { loadConfig, ProjectManager, } from "../core/index.js";
3
- import { createStorageProvider, ProjectScopedStorageProvider, withStorageRetry, } from "../storage/index.js";
4
- import { ensureProjectManual, loadProjectManual, syncProjectManual, } from "./manager.js";
5
- function after(args, flag) {
6
- const index = args.indexOf(flag);
7
- return index >=
8
- 0
9
- ? args[index + 1]
10
- : undefined;
11
- }
12
- function storageFor(project) {
13
- const config = loadConfig();
14
- const raw = withStorageRetry(createStorageProvider({
15
- provider: config.storage
16
- .provider,
17
- huggingface: config.storage
18
- .huggingface,
19
- localRoot: config.storage
20
- .localRoot,
21
- }), {
22
- attempts: 3,
23
- });
24
- return new ProjectScopedStorageProvider(raw, project.id, project.name, project.remote ??
25
- project.name);
26
- }
27
- async function main() {
28
- const [command = "help", ...args] = process.argv.slice(2);
29
- const project = new ProjectManager()
30
- .detect(after(args, "--project") ??
31
- process.cwd());
32
- if (command ===
33
- "init") {
34
- const file = ensureProjectManual(project);
35
- console.log(`✅ Project manual: ${file}`);
36
- return;
37
- }
38
- if (command ===
39
- "show") {
40
- const manual = loadProjectManual(project, false);
41
- if (!manual) {
42
- console.log("No .toolnet/PROJECT.md yet.");
43
- return;
44
- }
45
- process.stdout.write(readFileSync(manual.path, "utf8"));
46
- return;
47
- }
48
- if (command ===
49
- "sync") {
50
- const manual = await syncProjectManual(project, storageFor(project));
51
- console.log(JSON.stringify({
52
- project: project.name,
53
- path: manual.path,
54
- digest: manual.digest,
55
- bytes: manual.bytes,
56
- rules: manual.rules.length,
57
- enforce: manual.rules.filter(rule => rule.mode ===
58
- "enforce").length,
59
- advisory: manual.rules.filter(rule => rule.mode ===
60
- "advisory").length,
61
- }, null, 2));
62
- return;
63
- }
64
- console.log(`Project Manual
65
-
66
- Commands:
67
- init [--project PATH]
68
- show [--project PATH]
69
- sync [--project PATH]
70
- `);
71
- }
72
- main().catch(error => {
73
- console.error(error instanceof Error
74
- ? error.message
75
- : error);
76
- process.exit(1);
77
- });
@@ -1,2 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./manager.js";
@@ -1,147 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync, } from "node:fs";
2
- import { dirname, join, } from "node:path";
3
- import { sha256, } from "../session/utils.js";
4
- const MAX_MANUAL_BYTES = 64 * 1024;
5
- export const PROJECT_MANUAL_TEMPLATE = `# ToolNet Project Operating Manual
6
-
7
- This file contains persistent instructions for AI agents working on this project.
8
-
9
- ## Critical Rules
10
-
11
- <!--
12
- Examples:
13
-
14
- - [enforce] Never edit production files directly.
15
- - [enforce] Edit source only in /path/to/source.
16
- - [enforce] Deploy only with ./deploy.sh --apply
17
- -->
18
-
19
- ## Workflow
20
-
21
- <!--
22
- Describe the correct working process.
23
- -->
24
-
25
- ## Architecture
26
-
27
- <!--
28
- Important architecture conventions.
29
- -->
30
-
31
- ## Verification
32
-
33
- <!--
34
- Tests / QA required after changes.
35
- -->
36
-
37
- ## Known Gotchas
38
-
39
- <!--
40
- Things an AI agent should always remember.
41
- -->
42
-
43
- ## Preferences
44
-
45
- <!--
46
- - [advisory] Prefer small focused files.
47
- -->
48
- `;
49
- export function projectManualPath(project) {
50
- return join(project.rootPath, ".toolnet", "PROJECT.md");
51
- }
52
- function normalizeRuleText(value) {
53
- return value
54
- .normalize("NFKC")
55
- .replace(/\s+/g, " ")
56
- .trim();
57
- }
58
- function parseRules(content) {
59
- const rules = [];
60
- const seen = new Set();
61
- const pattern = /^\s*[-*]\s+\[(enforce|advisory)\]\s+(.+?)\s*$/gimu;
62
- let match;
63
- while ((match =
64
- pattern.exec(content))) {
65
- const mode = match[1]
66
- .toLowerCase();
67
- const text = normalizeRuleText(match[2]);
68
- if (!text) {
69
- continue;
70
- }
71
- const key = `${mode}:${text.toLowerCase()}`;
72
- if (seen.has(key)) {
73
- continue;
74
- }
75
- seen.add(key);
76
- rules.push({
77
- id: sha256(key).slice(0, 24),
78
- mode,
79
- text,
80
- source: "manual",
81
- });
82
- }
83
- return rules;
84
- }
85
- export function ensureProjectManual(project) {
86
- const file = projectManualPath(project);
87
- if (existsSync(file)) {
88
- return file;
89
- }
90
- mkdirSync(dirname(file), {
91
- recursive: true,
92
- });
93
- writeFileSync(file, PROJECT_MANUAL_TEMPLATE, {
94
- encoding: "utf8",
95
- mode: 0o600,
96
- });
97
- return file;
98
- }
99
- export function loadProjectManual(project, createIfMissing = false) {
100
- const file = createIfMissing
101
- ? ensureProjectManual(project)
102
- : projectManualPath(project);
103
- if (!existsSync(file)) {
104
- return null;
105
- }
106
- const size = statSync(file).size;
107
- if (size >
108
- MAX_MANUAL_BYTES) {
109
- throw new Error(`PROJECT.md exceeds ${MAX_MANUAL_BYTES} bytes`);
110
- }
111
- const content = readFileSync(file, "utf8");
112
- return {
113
- path: file,
114
- content,
115
- digest: sha256(content),
116
- rules: parseRules(content),
117
- bytes: Buffer.byteLength(content, "utf8"),
118
- updatedAt: new Date(statSync(file).mtimeMs).toISOString(),
119
- };
120
- }
121
- export async function syncProjectManual(project, storage) {
122
- const manual = loadProjectManual(project, true);
123
- if (!manual) {
124
- throw new Error("Project manual unavailable");
125
- }
126
- const prefix = `projects/${project.id}/project`;
127
- await storage.put(`${prefix}/manual.md`, manual.content, "text/markdown");
128
- await storage.put(`${prefix}/manual.json`, JSON.stringify({
129
- version: 1,
130
- projectId: project.id,
131
- projectName: project.name,
132
- digest: manual.digest,
133
- bytes: manual.bytes,
134
- ruleCount: manual.rules.length,
135
- enforceRules: manual.rules
136
- .filter(rule => rule.mode ===
137
- "enforce")
138
- .length,
139
- advisoryRules: manual.rules
140
- .filter(rule => rule.mode ===
141
- "advisory")
142
- .length,
143
- updatedAt: manual.updatedAt,
144
- }, null, 2) +
145
- "\n", "application/json");
146
- return manual;
147
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,30 +0,0 @@
1
- import { tokenize } from "./tokenizer.js";
2
- export class BM25Scorer {
3
- score(query, memory) {
4
- const queryTokens = tokenize(query);
5
- const documentTokens = tokenize([
6
- memory.content,
7
- ...(memory.tags ?? []),
8
- memory.type,
9
- ].join(" "));
10
- if (queryTokens.length === 0 ||
11
- documentTokens.length === 0) {
12
- return 0;
13
- }
14
- const frequencies = new Map();
15
- for (const token of documentTokens) {
16
- frequencies.set(token, (frequencies.get(token) ?? 0) + 1);
17
- }
18
- let score = 0;
19
- for (const token of queryTokens) {
20
- const tf = frequencies.get(token) ?? 0;
21
- if (tf === 0) {
22
- continue;
23
- }
24
- score +=
25
- 1 +
26
- Math.log(1 + tf);
27
- }
28
- return score / queryTokens.length;
29
- }
30
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,22 +0,0 @@
1
- export class ContextBuilder {
2
- build(results, maxCharacters = 6000) {
3
- const blocks = [];
4
- let used = 0;
5
- for (const result of results) {
6
- const memory = result.memory;
7
- const block = [
8
- `[${memory.type.toUpperCase()}]`,
9
- memory.content,
10
- ].join(" ");
11
- if (used +
12
- block.length >
13
- maxCharacters) {
14
- break;
15
- }
16
- blocks.push(block);
17
- used +=
18
- block.length;
19
- }
20
- return blocks.join("\n");
21
- }
22
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,68 +0,0 @@
1
- import { BM25Scorer, } from "./bm25.js";
2
- import { recencyScore, } from "./recency.js";
3
- import { memoryImportanceScore, } from "./importance.js";
4
- import { typePriority, } from "./type-priority.js";
5
- import { QueryAnalyzer, } from "./query-analyzer.js";
6
- export class HybridSearch {
7
- bm25 = new BM25Scorer();
8
- analyzer = new QueryAnalyzer();
9
- search(query, memories, options = {}) {
10
- const topK = options.topK ?? 8;
11
- const minScore = options.minScore ?? 0.05;
12
- const analysis = this.analyzer.analyze(query);
13
- const results = [];
14
- for (const memory of memories) {
15
- if (options.types?.length &&
16
- !options.types.includes(memory.type)) {
17
- continue;
18
- }
19
- const keyword = this.bm25.score(query, memory);
20
- const recency = recencyScore(memory);
21
- const importance = memoryImportanceScore(memory);
22
- let type = typePriority(memory.type);
23
- if (analysis.preferredTypes
24
- .includes(memory.type)) {
25
- type = Math.min(1, type + 0.25);
26
- }
27
- /*
28
- * Retrieval weighting:
29
- *
30
- * keyword 55%
31
- * importance 20%
32
- * recency 15%
33
- * type 10%
34
- */
35
- const score = keyword * 0.55 +
36
- importance * 0.20 +
37
- recency * 0.15 +
38
- type * 0.10;
39
- /*
40
- * Không cho memory hoàn toàn
41
- * không liên quan lọt vào chỉ
42
- * vì recency/importance cao.
43
- */
44
- // Keyword query phải có lexical match.
45
- // Type/recency/importance chỉ dùng để rerank,
46
- // không được tự kéo memory không liên quan vào Top-K.
47
- if (keyword <= 0) {
48
- continue;
49
- }
50
- if (score < minScore) {
51
- continue;
52
- }
53
- results.push({
54
- memory,
55
- score,
56
- scores: {
57
- keyword,
58
- recency,
59
- importance,
60
- type,
61
- },
62
- });
63
- }
64
- return results
65
- .sort((a, b) => b.score - a.score)
66
- .slice(0, topK);
67
- }
68
- }
@@ -1,16 +0,0 @@
1
- import { effectiveImportanceScore, } from "../memory/decay.js";
2
- const weights = {
3
- critical: 1,
4
- high: 0.8,
5
- normal: 0.5,
6
- temporary: 0.2,
7
- };
8
- export function importanceScore(importance) {
9
- if (!importance) {
10
- return 0.3;
11
- }
12
- return weights[importance] ?? 0.3;
13
- }
14
- export function memoryImportanceScore(memory) {
15
- return (effectiveImportanceScore(memory) / 100);
16
- }
@@ -1,12 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./tokenizer.js";
3
- export * from "./bm25.js";
4
- export * from "./recency.js";
5
- export * from "./importance.js";
6
- export * from "./type-priority.js";
7
- export * from "./query-analyzer.js";
8
- export * from "./hybrid-search.js";
9
- export * from "./context-builder.js";
10
- export * from "./retrieval-engine.js";
11
- export * from "./vector/index.js";
12
- export * from "./vector-hybrid-engine.js";