toolnet-memory 0.2.1 → 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 (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,31 +0,0 @@
1
- export function diffManifest(previous, current) {
2
- const oldFiles = previous?.files ?? {};
3
- const newFiles = current.files;
4
- const added = [];
5
- const modified = [];
6
- const deleted = [];
7
- const unchanged = [];
8
- for (const [path, entry] of Object.entries(newFiles)) {
9
- const old = oldFiles[path];
10
- if (!old) {
11
- added.push(path);
12
- }
13
- else if (old.hash !== entry.hash) {
14
- modified.push(path);
15
- }
16
- else {
17
- unchanged.push(path);
18
- }
19
- }
20
- for (const path of Object.keys(oldFiles)) {
21
- if (!newFiles[path]) {
22
- deleted.push(path);
23
- }
24
- }
25
- return {
26
- added: added.sort(),
27
- modified: modified.sort(),
28
- deleted: deleted.sort(),
29
- unchanged: unchanged.sort(),
30
- };
31
- }
@@ -1,23 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./indexer/repository-scanner.js";
3
- export * from "./indexer/repository-indexer.js";
4
- export * from "./parsers/typescript-parser.js";
5
- export * from "./graph/graph-store.js";
6
- export * from "./graph/graph-builder.js";
7
- export * from "./graph/architecture.js";
8
- export * from "./graph/trace.js";
9
- export * from "./symbols/reference-resolver.js";
10
- export * from "./impact/index.js";
11
- export * from "./incremental/file-hash.js";
12
- export * from "./incremental/manifest.js";
13
- export * from "./incremental/manifest-builder.js";
14
- export * from "./incremental/incremental-indexer.js";
15
- export * from "./chunks/index.js";
16
- export * from "./semantic/index.js";
17
- export * from "./git/index.js";
18
- export * from "./resolution/index.js";
19
- export * from "./rich/index.js";
20
- export * from "./architecture/index.js";
21
- export * from "./query/index.js";
22
- export * from "./analysis/index.js";
23
- export * from "./visualization/index.js";
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,31 +0,0 @@
1
- import { scanRepository, } from "./repository-scanner.js";
2
- import { parseTypeScriptFile, } from "../parsers/typescript-parser.js";
3
- import { GraphBuilder, } from "../graph/graph-builder.js";
4
- export class RepositoryIndexer {
5
- async index(projectId, rootPath) {
6
- const files = await scanRepository(rootPath);
7
- const parsed = [];
8
- for (const file of files) {
9
- try {
10
- parsed.push(await parseTypeScriptFile(projectId, rootPath, file));
11
- }
12
- catch (error) {
13
- console.warn(`[indexer] skipped ${file}:`, error instanceof Error
14
- ? error.message
15
- : error);
16
- }
17
- }
18
- const graph = new GraphBuilder()
19
- .build(projectId, parsed);
20
- return {
21
- files: parsed.length,
22
- symbols: graph
23
- .allSymbols(projectId)
24
- .length,
25
- edges: graph
26
- .allEdges(projectId)
27
- .length,
28
- graph,
29
- };
30
- }
31
- }
@@ -1,50 +0,0 @@
1
- import { readdir, } from "node:fs/promises";
2
- import { extname, join, relative, } from "node:path";
3
- import { isSensitiveFile } from "../../security/file-filter.js";
4
- const EXTENSIONS = new Set([
5
- ".ts",
6
- ".tsx",
7
- ".js",
8
- ".jsx",
9
- ".mjs",
10
- ".cjs",
11
- ".mts",
12
- ".cts",
13
- ]);
14
- const IGNORED = new Set([
15
- "node_modules",
16
- ".git",
17
- "dist",
18
- "build",
19
- "coverage",
20
- ".next",
21
- ".cache",
22
- ".toolnet-memory",
23
- ]);
24
- export async function scanRepository(rootPath) {
25
- const files = [];
26
- async function walk(dir) {
27
- const entries = await readdir(dir, {
28
- withFileTypes: true,
29
- });
30
- for (const entry of entries) {
31
- if (IGNORED.has(entry.name)) {
32
- continue;
33
- }
34
- const full = join(dir, entry.name);
35
- if (entry.isDirectory()) {
36
- await walk(full);
37
- continue;
38
- }
39
- if (!EXTENSIONS.has(extname(entry.name))) {
40
- continue;
41
- }
42
- if (isSensitiveFile(full)) {
43
- continue;
44
- }
45
- files.push(relative(rootPath, full));
46
- }
47
- }
48
- await walk(rootPath);
49
- return files.sort();
50
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,190 +0,0 @@
1
- import { readFile, } from "node:fs/promises";
2
- import { join, } from "node:path";
3
- import { createHash, } from "node:crypto";
4
- import ts from "typescript";
5
- function makeId(projectId, value) {
6
- return createHash("sha256")
7
- .update(`${projectId}:${value}`)
8
- .digest("hex")
9
- .slice(0, 24);
10
- }
11
- function lineOf(source, node) {
12
- return source
13
- .getLineAndCharacterOfPosition(node.getStart(source)).line + 1;
14
- }
15
- export async function parseTypeScriptFile(projectId, rootPath, filePath) {
16
- const absolute = join(rootPath, filePath);
17
- const text = await readFile(absolute, "utf8");
18
- const source = ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true, filePath.endsWith(".tsx") ||
19
- filePath.endsWith(".jsx")
20
- ? ts.ScriptKind.TSX
21
- : ts.ScriptKind.TS);
22
- const symbols = [];
23
- const imports = [];
24
- const calls = [];
25
- const heritage = [];
26
- const fileSymbol = {
27
- id: makeId(projectId, `file:${filePath}`),
28
- projectId,
29
- name: filePath,
30
- qualifiedName: filePath,
31
- type: "file",
32
- filePath,
33
- startLine: 1,
34
- endLine: source
35
- .getLineAndCharacterOfPosition(source.end).line + 1,
36
- };
37
- symbols.push(fileSymbol);
38
- const callableStack = [];
39
- const classStack = [];
40
- function addSymbol(node, name, type, qualifiedName) {
41
- const symbolId = makeId(projectId, `${filePath}:${type}:${qualifiedName ?? name}:${node.pos}`);
42
- symbols.push({
43
- id: symbolId,
44
- projectId,
45
- name,
46
- qualifiedName: qualifiedName ??
47
- name,
48
- type,
49
- filePath,
50
- startLine: lineOf(source, node),
51
- endLine: source
52
- .getLineAndCharacterOfPosition(node.end).line + 1,
53
- });
54
- return symbolId;
55
- }
56
- function parseImport(node) {
57
- if (!ts.isStringLiteral(node.moduleSpecifier)) {
58
- return;
59
- }
60
- const bindings = [];
61
- const clause = node.importClause;
62
- if (clause?.name) {
63
- bindings.push({
64
- localName: clause.name.text,
65
- importedName: "default",
66
- kind: "default",
67
- });
68
- }
69
- if (clause?.namedBindings &&
70
- ts.isNamedImports(clause.namedBindings)) {
71
- for (const element of clause.namedBindings.elements) {
72
- bindings.push({
73
- localName: element.name.text,
74
- importedName: element.propertyName
75
- ?.text ??
76
- element.name.text,
77
- kind: "named",
78
- });
79
- }
80
- }
81
- if (clause?.namedBindings &&
82
- ts.isNamespaceImport(clause.namedBindings)) {
83
- bindings.push({
84
- localName: clause.namedBindings
85
- .name.text,
86
- importedName: "*",
87
- kind: "namespace",
88
- });
89
- }
90
- imports.push({
91
- source: node.moduleSpecifier.text,
92
- bindings,
93
- });
94
- }
95
- function addHeritage(node, classId) {
96
- for (const clause of node.heritageClauses ?? []) {
97
- for (const type of clause.types) {
98
- const targetName = type.expression
99
- .getText(source)
100
- .split(".")
101
- .at(-1) ?? "";
102
- if (!targetName) {
103
- continue;
104
- }
105
- heritage.push({
106
- fromId: classId,
107
- targetName,
108
- type: clause.token ===
109
- ts.SyntaxKind.ExtendsKeyword
110
- ? "INHERITS"
111
- : "IMPLEMENTS",
112
- });
113
- }
114
- }
115
- }
116
- function visit(node) {
117
- let pushedCallable = false;
118
- let pushedClass = false;
119
- if (ts.isImportDeclaration(node)) {
120
- parseImport(node);
121
- }
122
- if (ts.isInterfaceDeclaration(node)) {
123
- addSymbol(node, node.name.text, "interface", node.name.text);
124
- }
125
- if (ts.isClassDeclaration(node) &&
126
- node.name) {
127
- const classId = addSymbol(node, node.name.text, "class", node.name.text);
128
- addHeritage(node, classId);
129
- classStack.push({
130
- id: classId,
131
- name: node.name.text,
132
- });
133
- pushedClass =
134
- true;
135
- }
136
- if (ts.isFunctionDeclaration(node) &&
137
- node.name) {
138
- const symbolId = addSymbol(node, node.name.text, "function", node.name.text);
139
- callableStack.push(symbolId);
140
- pushedCallable =
141
- true;
142
- }
143
- if (ts.isMethodDeclaration(node) &&
144
- node.name) {
145
- const name = node.name.getText(source);
146
- const owner = classStack.at(-1)
147
- ?.name;
148
- const symbolId = addSymbol(node, name, "method", owner
149
- ? `${owner}.${name}`
150
- : name);
151
- callableStack.push(symbolId);
152
- pushedCallable =
153
- true;
154
- }
155
- if (ts.isCallExpression(node)) {
156
- if (ts.isIdentifier(node.expression)) {
157
- calls.push({
158
- callerId: callableStack.at(-1),
159
- calleeName: node.expression.text,
160
- line: lineOf(source, node),
161
- });
162
- }
163
- if (ts.isPropertyAccessExpression(node.expression)) {
164
- const expression = node.expression;
165
- calls.push({
166
- callerId: callableStack.at(-1),
167
- qualifier: expression.expression
168
- .getText(source),
169
- calleeName: expression.name.text,
170
- line: lineOf(source, node),
171
- });
172
- }
173
- }
174
- ts.forEachChild(node, visit);
175
- if (pushedCallable) {
176
- callableStack.pop();
177
- }
178
- if (pushedClass) {
179
- classStack.pop();
180
- }
181
- }
182
- visit(source);
183
- return {
184
- filePath,
185
- symbols,
186
- imports,
187
- calls,
188
- heritage,
189
- };
190
- }
@@ -1,275 +0,0 @@
1
- const DEPENDENCY_EDGES = new Set([
2
- "CALLS",
3
- "CALL_REFERENCE",
4
- "IMPORTS",
5
- "USES_TYPE",
6
- "WRITES",
7
- "INHERITS",
8
- "IMPLEMENTS",
9
- "ROUTE",
10
- ]);
11
- const CALL_EDGES = new Set([
12
- "CALLS",
13
- "CALL_REFERENCE",
14
- ]);
15
- export class GraphQueryEngine {
16
- graph;
17
- constructor(graph) {
18
- this.graph = graph;
19
- }
20
- findSymbols(projectId, query) {
21
- const normalized = query
22
- .trim()
23
- .toLowerCase();
24
- if (!normalized) {
25
- return [];
26
- }
27
- return this.graph
28
- .allSymbols(projectId)
29
- .filter((symbol) => symbol.name
30
- .toLowerCase()
31
- .includes(normalized) ||
32
- (symbol.qualifiedName
33
- ?.toLowerCase()
34
- .includes(normalized) ??
35
- false) ||
36
- symbol.filePath
37
- .toLowerCase()
38
- .includes(normalized))
39
- .sort((a, b) => {
40
- const aExact = a.name
41
- .toLowerCase() ===
42
- normalized;
43
- const bExact = b.name
44
- .toLowerCase() ===
45
- normalized;
46
- if (aExact !==
47
- bExact) {
48
- return aExact
49
- ? -1
50
- : 1;
51
- }
52
- return (a.filePath
53
- .localeCompare(b.filePath));
54
- });
55
- }
56
- callers(projectId, symbolId) {
57
- return this.relatedIncoming(projectId, symbolId, CALL_EDGES);
58
- }
59
- callees(projectId, symbolId) {
60
- return this.relatedOutgoing(projectId, symbolId, CALL_EDGES);
61
- }
62
- dependents(projectId, symbolId) {
63
- return this.relatedIncoming(projectId, symbolId, DEPENDENCY_EDGES);
64
- }
65
- dependencies(projectId, symbolId) {
66
- return this.relatedOutgoing(projectId, symbolId, DEPENDENCY_EDGES);
67
- }
68
- neighborhood(projectId, symbolId, depth = 1) {
69
- const center = this.graph.getSymbol(symbolId);
70
- if (!center ||
71
- center.projectId !==
72
- projectId) {
73
- return null;
74
- }
75
- return {
76
- center,
77
- incoming: this.walk(projectId, symbolId, "incoming", depth),
78
- outgoing: this.walk(projectId, symbolId, "outgoing", depth),
79
- };
80
- }
81
- shortestPath(projectId, fromId, toId, maxDepth = 12) {
82
- const from = this.graph.getSymbol(fromId);
83
- const to = this.graph.getSymbol(toId);
84
- if (!from ||
85
- !to ||
86
- from.projectId !==
87
- projectId ||
88
- to.projectId !==
89
- projectId) {
90
- return {
91
- found: false,
92
- distance: -1,
93
- symbols: [],
94
- edges: [],
95
- };
96
- }
97
- if (fromId ===
98
- toId) {
99
- return {
100
- found: true,
101
- distance: 0,
102
- symbols: [from],
103
- edges: [],
104
- };
105
- }
106
- const edges = this.graph
107
- .allEdges(projectId)
108
- .filter((edge) => DEPENDENCY_EDGES.has(edge.type));
109
- const outgoing = new Map();
110
- for (const edge of edges) {
111
- const list = outgoing.get(edge.from) ?? [];
112
- list.push(edge);
113
- outgoing.set(edge.from, list);
114
- }
115
- const queue = [
116
- {
117
- id: fromId,
118
- depth: 0,
119
- },
120
- ];
121
- const visited = new Set([
122
- fromId,
123
- ]);
124
- const previous = new Map();
125
- while (queue.length > 0) {
126
- const current = queue.shift();
127
- if (current.depth >=
128
- maxDepth) {
129
- continue;
130
- }
131
- for (const edge of outgoing.get(current.id) ?? []) {
132
- if (visited.has(edge.to)) {
133
- continue;
134
- }
135
- visited.add(edge.to);
136
- previous.set(edge.to, {
137
- node: current.id,
138
- edge,
139
- });
140
- if (edge.to ===
141
- toId) {
142
- return this.buildPath(fromId, toId, previous);
143
- }
144
- queue.push({
145
- id: edge.to,
146
- depth: current.depth + 1,
147
- });
148
- }
149
- }
150
- return {
151
- found: false,
152
- distance: -1,
153
- symbols: [],
154
- edges: [],
155
- };
156
- }
157
- buildPath(fromId, toId, previous) {
158
- const symbolIds = [
159
- toId,
160
- ];
161
- const edges = [];
162
- let current = toId;
163
- while (current !==
164
- fromId) {
165
- const previousNode = previous.get(current);
166
- if (!previousNode) {
167
- return {
168
- found: false,
169
- distance: -1,
170
- symbols: [],
171
- edges: [],
172
- };
173
- }
174
- edges.push(previousNode.edge);
175
- current =
176
- previousNode.node;
177
- symbolIds.push(current);
178
- }
179
- symbolIds.reverse();
180
- edges.reverse();
181
- const symbols = symbolIds
182
- .map((id) => this.graph.getSymbol(id))
183
- .filter((symbol) => Boolean(symbol));
184
- return {
185
- found: true,
186
- distance: edges.length,
187
- symbols,
188
- edges,
189
- };
190
- }
191
- walk(projectId, symbolId, direction, maxDepth) {
192
- const edges = this.graph
193
- .allEdges(projectId)
194
- .filter((edge) => DEPENDENCY_EDGES.has(edge.type));
195
- const queue = [
196
- {
197
- id: symbolId,
198
- depth: 0,
199
- },
200
- ];
201
- const visited = new Set([
202
- symbolId,
203
- ]);
204
- const output = [];
205
- while (queue.length >
206
- 0) {
207
- const current = queue.shift();
208
- if (current.depth >=
209
- maxDepth) {
210
- continue;
211
- }
212
- for (const edge of edges) {
213
- const matches = direction ===
214
- "incoming"
215
- ? edge.to ===
216
- current.id
217
- : edge.from ===
218
- current.id;
219
- if (!matches) {
220
- continue;
221
- }
222
- const nextId = direction ===
223
- "incoming"
224
- ? edge.from
225
- : edge.to;
226
- if (visited.has(nextId)) {
227
- continue;
228
- }
229
- const symbol = this.graph.getSymbol(nextId);
230
- if (!symbol) {
231
- continue;
232
- }
233
- visited.add(nextId);
234
- output.push({
235
- symbol,
236
- depth: current.depth +
237
- 1,
238
- via: edge,
239
- });
240
- queue.push({
241
- id: nextId,
242
- depth: current.depth +
243
- 1,
244
- });
245
- }
246
- }
247
- return output;
248
- }
249
- relatedIncoming(projectId, symbolId, types) {
250
- const ids = new Set(this.graph
251
- .allEdges(projectId)
252
- .filter((edge) => edge.to ===
253
- symbolId &&
254
- types.has(edge.type))
255
- .map((edge) => edge.from));
256
- return [
257
- ...ids,
258
- ]
259
- .map((id) => this.graph.getSymbol(id))
260
- .filter((symbol) => Boolean(symbol));
261
- }
262
- relatedOutgoing(projectId, symbolId, types) {
263
- const ids = new Set(this.graph
264
- .allEdges(projectId)
265
- .filter((edge) => edge.from ===
266
- symbolId &&
267
- types.has(edge.type))
268
- .map((edge) => edge.to));
269
- return [
270
- ...ids,
271
- ]
272
- .map((id) => this.graph.getSymbol(id))
273
- .filter((symbol) => Boolean(symbol));
274
- }
275
- }
@@ -1,2 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./graph-query-engine.js";
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- export * from "./types.js";
2
- export * from "./typescript-resolver.js";
@@ -1 +0,0 @@
1
- export {};