@vpxa/kb 0.1.1 → 0.1.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 (138) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/packages/analyzers/dist/blast-radius-analyzer.js +13 -114
  4. package/packages/analyzers/dist/dependency-analyzer.js +11 -425
  5. package/packages/analyzers/dist/diagram-generator.js +4 -86
  6. package/packages/analyzers/dist/entry-point-analyzer.js +5 -239
  7. package/packages/analyzers/dist/index.js +1 -23
  8. package/packages/analyzers/dist/knowledge-producer.js +24 -113
  9. package/packages/analyzers/dist/pattern-analyzer.js +5 -359
  10. package/packages/analyzers/dist/regex-call-graph.js +1 -428
  11. package/packages/analyzers/dist/structure-analyzer.js +4 -258
  12. package/packages/analyzers/dist/symbol-analyzer.js +13 -442
  13. package/packages/analyzers/dist/ts-call-graph.js +1 -160
  14. package/packages/analyzers/dist/types.js +0 -1
  15. package/packages/chunker/dist/call-graph-extractor.js +1 -90
  16. package/packages/chunker/dist/chunker-factory.js +1 -36
  17. package/packages/chunker/dist/chunker.interface.js +0 -1
  18. package/packages/chunker/dist/code-chunker.js +14 -134
  19. package/packages/chunker/dist/generic-chunker.js +5 -72
  20. package/packages/chunker/dist/index.js +1 -21
  21. package/packages/chunker/dist/markdown-chunker.js +7 -119
  22. package/packages/chunker/dist/treesitter-chunker.js +8 -234
  23. package/packages/cli/dist/commands/analyze.js +3 -112
  24. package/packages/cli/dist/commands/context-cmds.js +1 -155
  25. package/packages/cli/dist/commands/environment.js +2 -204
  26. package/packages/cli/dist/commands/execution.js +1 -137
  27. package/packages/cli/dist/commands/graph.js +7 -81
  28. package/packages/cli/dist/commands/init.js +9 -87
  29. package/packages/cli/dist/commands/knowledge.js +1 -139
  30. package/packages/cli/dist/commands/search.js +8 -267
  31. package/packages/cli/dist/commands/system.js +4 -241
  32. package/packages/cli/dist/commands/workspace.js +2 -388
  33. package/packages/cli/dist/context.js +1 -14
  34. package/packages/cli/dist/helpers.js +3 -458
  35. package/packages/cli/dist/index.d.ts +1 -1
  36. package/packages/cli/dist/index.js +3 -69
  37. package/packages/cli/dist/kb-init.js +1 -82
  38. package/packages/cli/dist/types.js +0 -1
  39. package/packages/core/dist/constants.js +1 -43
  40. package/packages/core/dist/content-detector.js +1 -79
  41. package/packages/core/dist/errors.js +1 -40
  42. package/packages/core/dist/index.js +1 -9
  43. package/packages/core/dist/logger.js +1 -34
  44. package/packages/core/dist/types.js +0 -1
  45. package/packages/embeddings/dist/embedder.interface.js +0 -1
  46. package/packages/embeddings/dist/index.js +1 -5
  47. package/packages/embeddings/dist/onnx-embedder.js +1 -82
  48. package/packages/indexer/dist/file-hasher.js +1 -13
  49. package/packages/indexer/dist/filesystem-crawler.js +1 -125
  50. package/packages/indexer/dist/graph-extractor.js +1 -111
  51. package/packages/indexer/dist/incremental-indexer.js +1 -278
  52. package/packages/indexer/dist/index.js +1 -14
  53. package/packages/server/dist/api.js +1 -9
  54. package/packages/server/dist/config.js +1 -75
  55. package/packages/server/dist/curated-manager.js +9 -356
  56. package/packages/server/dist/index.js +1 -134
  57. package/packages/server/dist/replay-interceptor.js +1 -38
  58. package/packages/server/dist/resources/resources.js +2 -40
  59. package/packages/server/dist/server.js +1 -247
  60. package/packages/server/dist/tools/analyze.tools.js +1 -288
  61. package/packages/server/dist/tools/forge.tools.js +11 -499
  62. package/packages/server/dist/tools/forget.tool.js +3 -39
  63. package/packages/server/dist/tools/graph.tool.js +5 -110
  64. package/packages/server/dist/tools/list.tool.js +5 -53
  65. package/packages/server/dist/tools/lookup.tool.js +8 -51
  66. package/packages/server/dist/tools/onboard.tool.js +2 -112
  67. package/packages/server/dist/tools/produce.tool.js +4 -74
  68. package/packages/server/dist/tools/read.tool.js +4 -47
  69. package/packages/server/dist/tools/reindex.tool.js +2 -70
  70. package/packages/server/dist/tools/remember.tool.js +3 -42
  71. package/packages/server/dist/tools/replay.tool.js +6 -88
  72. package/packages/server/dist/tools/search.tool.js +17 -327
  73. package/packages/server/dist/tools/status.tool.js +3 -68
  74. package/packages/server/dist/tools/toolkit.tools.js +20 -1673
  75. package/packages/server/dist/tools/update.tool.js +3 -39
  76. package/packages/server/dist/tools/utility.tools.js +19 -456
  77. package/packages/store/dist/graph-store.interface.js +0 -1
  78. package/packages/store/dist/index.js +1 -9
  79. package/packages/store/dist/lance-store.js +1 -258
  80. package/packages/store/dist/sqlite-graph-store.js +8 -309
  81. package/packages/store/dist/store-factory.js +1 -14
  82. package/packages/store/dist/store.interface.js +0 -1
  83. package/packages/tools/dist/batch.js +1 -45
  84. package/packages/tools/dist/changelog.js +2 -112
  85. package/packages/tools/dist/check.js +2 -59
  86. package/packages/tools/dist/checkpoint.js +2 -43
  87. package/packages/tools/dist/codemod.js +2 -69
  88. package/packages/tools/dist/compact.js +3 -60
  89. package/packages/tools/dist/data-transform.js +1 -124
  90. package/packages/tools/dist/dead-symbols.js +2 -71
  91. package/packages/tools/dist/delegate.js +3 -128
  92. package/packages/tools/dist/diff-parse.js +3 -153
  93. package/packages/tools/dist/digest.js +7 -242
  94. package/packages/tools/dist/encode.js +1 -46
  95. package/packages/tools/dist/env-info.js +1 -58
  96. package/packages/tools/dist/eval.js +3 -79
  97. package/packages/tools/dist/evidence-map.js +3 -203
  98. package/packages/tools/dist/file-summary.js +2 -106
  99. package/packages/tools/dist/file-walk.js +1 -75
  100. package/packages/tools/dist/find-examples.js +3 -48
  101. package/packages/tools/dist/find.js +1 -120
  102. package/packages/tools/dist/forge-classify.js +2 -319
  103. package/packages/tools/dist/forge-ground.js +1 -184
  104. package/packages/tools/dist/git-context.js +3 -46
  105. package/packages/tools/dist/graph-query.js +1 -194
  106. package/packages/tools/dist/health.js +1 -118
  107. package/packages/tools/dist/http-request.js +1 -58
  108. package/packages/tools/dist/index.js +1 -273
  109. package/packages/tools/dist/lane.js +7 -227
  110. package/packages/tools/dist/measure.js +2 -119
  111. package/packages/tools/dist/onboard.js +42 -1136
  112. package/packages/tools/dist/parse-output.js +2 -158
  113. package/packages/tools/dist/process-manager.js +1 -69
  114. package/packages/tools/dist/queue.js +2 -126
  115. package/packages/tools/dist/regex-test.js +1 -39
  116. package/packages/tools/dist/rename.js +2 -70
  117. package/packages/tools/dist/replay.js +6 -108
  118. package/packages/tools/dist/schema-validate.js +1 -141
  119. package/packages/tools/dist/scope-map.js +1 -72
  120. package/packages/tools/dist/snippet.js +1 -80
  121. package/packages/tools/dist/stash.js +2 -60
  122. package/packages/tools/dist/stratum-card.js +5 -238
  123. package/packages/tools/dist/symbol.js +3 -87
  124. package/packages/tools/dist/test-run.js +2 -55
  125. package/packages/tools/dist/text-utils.js +2 -31
  126. package/packages/tools/dist/time-utils.js +1 -135
  127. package/packages/tools/dist/trace.js +2 -114
  128. package/packages/tools/dist/truncation.js +10 -41
  129. package/packages/tools/dist/watch.js +1 -61
  130. package/packages/tools/dist/web-fetch.js +9 -244
  131. package/packages/tools/dist/web-search.js +1 -46
  132. package/packages/tools/dist/workset.js +2 -77
  133. package/packages/tui/dist/App.js +260 -52468
  134. package/packages/tui/dist/index.js +286 -54551
  135. package/packages/tui/dist/panels/CuratedPanel.js +211 -34291
  136. package/packages/tui/dist/panels/LogPanel.js +259 -51703
  137. package/packages/tui/dist/panels/SearchPanel.js +212 -34824
  138. package/packages/tui/dist/panels/StatusPanel.js +211 -34304
@@ -1,247 +1 @@
1
- import { initializeTreeSitter } from "@kb/chunker";
2
- import { OnnxEmbedder } from "@kb/embeddings";
3
- import { IncrementalIndexer } from "@kb/indexer";
4
- import { createStore, SqliteGraphStore } from "@kb/store";
5
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
- import { CuratedKnowledgeManager } from "./curated-manager.js";
7
- import { installReplayInterceptor } from "./replay-interceptor.js";
8
- import { registerResources } from "./resources/resources.js";
9
- import {
10
- registerAnalyzeDependenciesTool,
11
- registerAnalyzeDiagramTool,
12
- registerAnalyzeEntryPointsTool,
13
- registerAnalyzePatternsTool,
14
- registerAnalyzeStructureTool,
15
- registerAnalyzeSymbolsTool,
16
- registerBlastRadiusTool
17
- } from "./tools/analyze.tools.js";
18
- import {
19
- registerDigestTool,
20
- registerEvidenceMapTool,
21
- registerForgeClassifyTool,
22
- registerForgeGroundTool,
23
- registerStratumCardTool
24
- } from "./tools/forge.tools.js";
25
- import { registerForgetTool } from "./tools/forget.tool.js";
26
- import { registerGraphTool } from "./tools/graph.tool.js";
27
- import { registerListTool } from "./tools/list.tool.js";
28
- import { registerLookupTool } from "./tools/lookup.tool.js";
29
- import { registerOnboardTool } from "./tools/onboard.tool.js";
30
- import { registerProduceKnowledgeTool } from "./tools/produce.tool.js";
31
- import { registerReadTool } from "./tools/read.tool.js";
32
- import { registerReindexTool } from "./tools/reindex.tool.js";
33
- import { registerRememberTool } from "./tools/remember.tool.js";
34
- import { registerReplayTool } from "./tools/replay.tool.js";
35
- import { registerSearchTool } from "./tools/search.tool.js";
36
- import { registerStatusTool } from "./tools/status.tool.js";
37
- import {
38
- registerBatchTool,
39
- registerCheckpointTool,
40
- registerCheckTool,
41
- registerCodemodTool,
42
- registerCompactTool,
43
- registerDataTransformTool,
44
- registerDeadSymbolsTool,
45
- registerDelegateTool,
46
- registerDiffParseTool,
47
- registerEvalTool,
48
- registerFileSummaryTool,
49
- registerFindExamplesTool,
50
- registerFindTool,
51
- registerGitContextTool,
52
- registerHealthTool,
53
- registerLaneTool,
54
- registerParseOutputTool,
55
- registerProcessTool,
56
- registerQueueTool,
57
- registerRenameTool,
58
- registerScopeMapTool,
59
- registerStashTool,
60
- registerSymbolTool,
61
- registerTestRunTool,
62
- registerTraceTool,
63
- registerWatchTool,
64
- registerWebFetchTool,
65
- registerWorksetTool
66
- } from "./tools/toolkit.tools.js";
67
- import { registerUpdateTool } from "./tools/update.tool.js";
68
- import {
69
- registerChangelogTool,
70
- registerEncodeTool,
71
- registerEnvTool,
72
- registerHttpTool,
73
- registerMeasureTool,
74
- registerRegexTestTool,
75
- registerSchemaValidateTool,
76
- registerSnippetTool,
77
- registerTimeTool,
78
- registerWebSearchTool
79
- } from "./tools/utility.tools.js";
80
- async function initializeKnowledgeBase(config) {
81
- console.error("[KB] Initializing knowledge base components...");
82
- const embedder = new OnnxEmbedder({
83
- model: config.embedding.model,
84
- dimensions: config.embedding.dimensions
85
- });
86
- await embedder.initialize();
87
- console.error(`[KB] Embedder loaded: ${embedder.modelId} (${embedder.dimensions}d)`);
88
- const store = await createStore({
89
- backend: config.store.backend,
90
- path: config.store.path
91
- });
92
- await store.initialize();
93
- console.error("[KB] Store initialized");
94
- const indexer = new IncrementalIndexer(embedder, store);
95
- const curatedDir = config.curated.path;
96
- const curated = new CuratedKnowledgeManager(curatedDir, store, embedder);
97
- const graphStore = new SqliteGraphStore({ path: config.store.path });
98
- await graphStore.initialize();
99
- console.error("[KB] Graph store initialized");
100
- indexer.setGraphStore(graphStore);
101
- const treeSitterAvailable = await initializeTreeSitter();
102
- if (treeSitterAvailable) {
103
- console.error("[KB] Tree-sitter chunking enabled");
104
- } else {
105
- console.error("[KB] Tree-sitter not available \u2014 using regex-based code chunking");
106
- }
107
- return { embedder, store, indexer, curated, graphStore };
108
- }
109
- function createMcpServer(kb, config) {
110
- const server = new McpServer({
111
- name: "kb",
112
- version: "0.1.0"
113
- });
114
- installReplayInterceptor(server);
115
- registerSearchTool(server, kb.embedder, kb.store, kb.graphStore);
116
- registerLookupTool(server, kb.store);
117
- registerStatusTool(server, kb.store, kb.graphStore);
118
- registerReindexTool(server, kb.indexer, config, kb.curated, kb.store);
119
- registerRememberTool(server, kb.curated);
120
- registerUpdateTool(server, kb.curated);
121
- registerForgetTool(server, kb.curated);
122
- registerReadTool(server, kb.curated);
123
- registerListTool(server, kb.curated);
124
- registerAnalyzeStructureTool(server, kb.store, kb.embedder);
125
- registerAnalyzeDependenciesTool(server, kb.store, kb.embedder);
126
- registerAnalyzeSymbolsTool(server, kb.store, kb.embedder);
127
- registerAnalyzePatternsTool(server, kb.store, kb.embedder);
128
- registerAnalyzeEntryPointsTool(server, kb.store, kb.embedder);
129
- registerAnalyzeDiagramTool(server, kb.store, kb.embedder);
130
- registerBlastRadiusTool(server, kb.store, kb.embedder);
131
- registerProduceKnowledgeTool(server);
132
- registerOnboardTool(server, kb.store, kb.embedder);
133
- registerGraphTool(server, kb.graphStore);
134
- registerCompactTool(server, kb.embedder);
135
- registerScopeMapTool(server, kb.embedder, kb.store);
136
- registerFindTool(server, kb.embedder, kb.store);
137
- registerParseOutputTool(server);
138
- registerWorksetTool(server);
139
- registerCheckTool(server);
140
- registerBatchTool(server, kb.embedder, kb.store);
141
- registerSymbolTool(server, kb.embedder, kb.store);
142
- registerEvalTool(server);
143
- registerTestRunTool(server);
144
- registerStashTool(server);
145
- registerGitContextTool(server);
146
- registerDiffParseTool(server);
147
- registerRenameTool(server);
148
- registerCodemodTool(server);
149
- registerFileSummaryTool(server);
150
- registerCheckpointTool(server);
151
- registerDataTransformTool(server);
152
- registerTraceTool(server, kb.embedder, kb.store);
153
- registerFindExamplesTool(server, kb.embedder, kb.store);
154
- registerProcessTool(server);
155
- registerWatchTool(server);
156
- registerDeadSymbolsTool(server, kb.embedder, kb.store);
157
- registerDelegateTool(server);
158
- registerHealthTool(server);
159
- registerLaneTool(server);
160
- registerQueueTool(server);
161
- registerWebFetchTool(server);
162
- registerEvidenceMapTool(server);
163
- registerDigestTool(server, kb.embedder);
164
- registerForgeClassifyTool(server);
165
- registerStratumCardTool(server, kb.embedder);
166
- registerForgeGroundTool(server, kb.embedder, kb.store);
167
- registerWebSearchTool(server);
168
- registerHttpTool(server);
169
- registerRegexTestTool(server);
170
- registerEncodeTool(server);
171
- registerMeasureTool(server);
172
- registerChangelogTool(server);
173
- registerSchemaValidateTool(server);
174
- registerSnippetTool(server);
175
- registerEnvTool(server);
176
- registerTimeTool(server);
177
- registerResources(server, kb.store);
178
- registerReplayTool(server);
179
- return server;
180
- }
181
- async function createServer(config) {
182
- const kb = await initializeKnowledgeBase(config);
183
- const server = createMcpServer(kb, config);
184
- console.error("[KB] MCP server configured with 64 tools and 2 resources");
185
- const runInitialIndex = async () => {
186
- try {
187
- const sourcePaths = config.sources.map((s) => s.path).join(", ");
188
- console.error(`[KB] Running initial index for sources: ${sourcePaths}`);
189
- const result = await kb.indexer.index(config, (p) => {
190
- if (p.phase === "crawling" || p.phase === "done") return;
191
- if (p.phase === "chunking" && p.currentFile) {
192
- console.error(`[KB] [${p.filesProcessed + 1}/${p.filesTotal}] ${p.currentFile}`);
193
- }
194
- if (p.phase === "cleanup") {
195
- console.error(
196
- `[KB] cleanup: removing ${p.filesTotal - p.filesProcessed} stale entries`
197
- );
198
- }
199
- });
200
- console.error(
201
- `[KB] Indexed ${result.filesProcessed} files (${result.filesSkipped} skipped, ${result.chunksCreated} chunks) in ${(result.durationMs / 1e3).toFixed(1)}s`
202
- );
203
- try {
204
- await kb.store.createFtsIndex();
205
- } catch (ftsErr) {
206
- console.error("[KB] FTS index creation failed (non-fatal):", ftsErr);
207
- }
208
- try {
209
- const curatedResult = await kb.curated.reindexAll();
210
- console.error(
211
- `[KB] Curated re-index: ${curatedResult.indexed} entries restored to vector store`
212
- );
213
- } catch (curatedErr) {
214
- console.error("[KB] Curated re-index failed:", curatedErr);
215
- }
216
- } catch (err) {
217
- console.error("[KB] Initial index failed (will retry on kb_reindex):", err);
218
- }
219
- };
220
- const shutdown = async () => {
221
- console.error("[KB] Shutting down...");
222
- await kb.graphStore.close().catch(() => {
223
- });
224
- await kb.store.close();
225
- process.exit(0);
226
- };
227
- process.on("SIGINT", shutdown);
228
- process.on("SIGTERM", shutdown);
229
- const originalPpid = process.ppid;
230
- const ppidCheck = setInterval(() => {
231
- try {
232
- process.kill(originalPpid, 0);
233
- } catch {
234
- console.error("[KB] Parent process died \u2014 orphan detected, shutting down...");
235
- clearInterval(ppidCheck);
236
- shutdown();
237
- }
238
- }, 5e3);
239
- ppidCheck.unref();
240
- return { server, runInitialIndex };
241
- }
242
- export {
243
- createMcpServer,
244
- createServer,
245
- initializeKnowledgeBase
246
- };
247
- //# sourceMappingURL=server.js.map
1
+ import{initializeTreeSitter as c}from"../../chunker/dist/index.js";import{OnnxEmbedder as m}from"../../embeddings/dist/index.js";import{IncrementalIndexer as g}from"../../indexer/dist/index.js";import{createStore as p,SqliteGraphStore as T}from"../../store/dist/index.js";import{McpServer as u}from"@modelcontextprotocol/sdk/server/mcp.js";import{CuratedKnowledgeManager as f}from"./curated-manager.js";import{installReplayInterceptor as h}from"./replay-interceptor.js";import{registerResources as S}from"./resources/resources.js";import{registerAnalyzeDependenciesTool as x,registerAnalyzeDiagramTool as w,registerAnalyzeEntryPointsTool as K,registerAnalyzePatternsTool as y,registerAnalyzeStructureTool as B,registerAnalyzeSymbolsTool as C,registerBlastRadiusTool as I}from"./tools/analyze.tools.js";import{registerDigestTool as v,registerEvidenceMapTool as P,registerForgeClassifyTool as z,registerForgeGroundTool as R,registerStratumCardTool as E}from"./tools/forge.tools.js";import{registerForgetTool as F}from"./tools/forget.tool.js";import{registerGraphTool as M}from"./tools/graph.tool.js";import{registerListTool as $}from"./tools/list.tool.js";import{registerLookupTool as G}from"./tools/lookup.tool.js";import{registerOnboardTool as A}from"./tools/onboard.tool.js";import{registerProduceKnowledgeTool as D}from"./tools/produce.tool.js";import{registerReadTool as O}from"./tools/read.tool.js";import{registerReindexTool as W}from"./tools/reindex.tool.js";import{registerRememberTool as j}from"./tools/remember.tool.js";import{registerReplayTool as L}from"./tools/replay.tool.js";import{registerSearchTool as H}from"./tools/search.tool.js";import{registerStatusTool as q}from"./tools/status.tool.js";import{registerBatchTool as N,registerCheckpointTool as Q,registerCheckTool as U,registerCodemodTool as V,registerCompactTool as _,registerDataTransformTool as J,registerDeadSymbolsTool as X,registerDelegateTool as Y,registerDiffParseTool as Z,registerEvalTool as b,registerFileSummaryTool as k,registerFindExamplesTool as ee,registerFindTool as re,registerGitContextTool as oe,registerHealthTool as te,registerLaneTool as se,registerParseOutputTool as ie,registerProcessTool as ne,registerQueueTool as ae,registerRenameTool as le,registerScopeMapTool as de,registerStashTool as ce,registerSymbolTool as me,registerTestRunTool as ge,registerTraceTool as pe,registerWatchTool as Te,registerWebFetchTool as ue,registerWorksetTool as fe}from"./tools/toolkit.tools.js";import{registerUpdateTool as he}from"./tools/update.tool.js";import{registerChangelogTool as Se,registerEncodeTool as xe,registerEnvTool as we,registerHttpTool as Ke,registerMeasureTool as ye,registerRegexTestTool as Be,registerSchemaValidateTool as Ce,registerSnippetTool as Ie,registerTimeTool as ve,registerWebSearchTool as Pe}from"./tools/utility.tools.js";async function ze(r){console.error("[KB] Initializing knowledge base components...");const t=new m({model:r.embedding.model,dimensions:r.embedding.dimensions});await t.initialize(),console.error(`[KB] Embedder loaded: ${t.modelId} (${t.dimensions}d)`);const e=await p({backend:r.store.backend,path:r.store.path});await e.initialize(),console.error("[KB] Store initialized");const a=new g(t,e),i=r.curated.path,d=new f(i,e,t),s=new T({path:r.store.path});await s.initialize(),console.error("[KB] Graph store initialized"),a.setGraphStore(s);const n=await c();return console.error(n?"[KB] Tree-sitter chunking enabled":"[KB] Tree-sitter not available \u2014 using regex-based code chunking"),{embedder:t,store:e,indexer:a,curated:d,graphStore:s}}function Re(r,t){const e=new u({name:"kb",version:"0.1.0"});return h(e),H(e,r.embedder,r.store,r.graphStore),G(e,r.store),q(e,r.store,r.graphStore),W(e,r.indexer,t,r.curated,r.store),j(e,r.curated),he(e,r.curated),F(e,r.curated),O(e,r.curated),$(e,r.curated),B(e,r.store,r.embedder),x(e,r.store,r.embedder),C(e,r.store,r.embedder),y(e,r.store,r.embedder),K(e,r.store,r.embedder),w(e,r.store,r.embedder),I(e,r.store,r.embedder),D(e),A(e,r.store,r.embedder),M(e,r.graphStore),_(e,r.embedder),de(e,r.embedder,r.store),re(e,r.embedder,r.store),ie(e),fe(e),U(e),N(e,r.embedder,r.store),me(e,r.embedder,r.store),b(e),ge(e),ce(e),oe(e),Z(e),le(e),V(e),k(e),Q(e),J(e),pe(e,r.embedder,r.store),ee(e,r.embedder,r.store),ne(e),Te(e),X(e,r.embedder,r.store),Y(e),te(e),se(e),ae(e),ue(e),P(e),v(e,r.embedder),z(e),E(e,r.embedder),R(e,r.embedder,r.store),Pe(e),Ke(e),Be(e),xe(e),ye(e),Se(e),Ce(e),Ie(e),we(e),ve(e),S(e,r.store),L(e),e}async function rr(r){const t=await ze(r),e=Re(t,r);console.error("[KB] MCP server configured with 64 tools and 2 resources");const a=async()=>{try{const n=r.sources.map(o=>o.path).join(", ");console.error(`[KB] Running initial index for sources: ${n}`);const l=await t.indexer.index(r,o=>{o.phase==="crawling"||o.phase==="done"||(o.phase==="chunking"&&o.currentFile&&console.error(`[KB] [${o.filesProcessed+1}/${o.filesTotal}] ${o.currentFile}`),o.phase==="cleanup"&&console.error(`[KB] cleanup: removing ${o.filesTotal-o.filesProcessed} stale entries`))});console.error(`[KB] Indexed ${l.filesProcessed} files (${l.filesSkipped} skipped, ${l.chunksCreated} chunks) in ${(l.durationMs/1e3).toFixed(1)}s`);try{await t.store.createFtsIndex()}catch(o){console.error("[KB] FTS index creation failed (non-fatal):",o)}try{const o=await t.curated.reindexAll();console.error(`[KB] Curated re-index: ${o.indexed} entries restored to vector store`)}catch(o){console.error("[KB] Curated re-index failed:",o)}}catch(n){console.error("[KB] Initial index failed (will retry on kb_reindex):",n)}},i=async()=>{console.error("[KB] Shutting down..."),await t.graphStore.close().catch(()=>{}),await t.store.close(),process.exit(0)};process.on("SIGINT",i),process.on("SIGTERM",i);const d=process.ppid,s=setInterval(()=>{try{process.kill(d,0)}catch{console.error("[KB] Parent process died \u2014 orphan detected, shutting down..."),clearInterval(s),i()}},5e3);return s.unref(),{server:e,runInitialIndex:a}}export{Re as createMcpServer,rr as createServer,ze as initializeKnowledgeBase};
@@ -1,288 +1 @@
1
- import { createHash } from "node:crypto";
2
- import {
3
- BlastRadiusAnalyzer,
4
- DependencyAnalyzer,
5
- DiagramGenerator,
6
- EntryPointAnalyzer,
7
- PatternAnalyzer,
8
- StructureAnalyzer,
9
- SymbolAnalyzer
10
- } from "@kb/analyzers";
11
- import { z } from "zod";
12
- async function persistAnalysisResult(store, embedder, analyzerName, rootPath, output) {
13
- try {
14
- const pathHash = createHash("sha256").update(rootPath).digest("hex").slice(0, 12);
15
- const sourcePath = `produced/analysis/${analyzerName}/${pathHash}.md`;
16
- const contentHash = createHash("sha256").update(output).digest("hex").slice(0, 16);
17
- const now = (/* @__PURE__ */ new Date()).toISOString();
18
- const sections = output.length > 2e3 ? output.split(/(?=^## )/m).filter((s) => s.trim().length > 0) : [output];
19
- const records = sections.map((text, i) => ({
20
- id: createHash("sha256").update(`${sourcePath}::${i}`).digest("hex").slice(0, 16),
21
- content: text.trim(),
22
- sourcePath,
23
- contentType: "produced-knowledge",
24
- chunkIndex: i,
25
- totalChunks: sections.length,
26
- startLine: 0,
27
- endLine: 0,
28
- fileHash: contentHash,
29
- indexedAt: now,
30
- origin: "produced",
31
- tags: ["analysis", analyzerName],
32
- category: "analysis",
33
- version: 1
34
- }));
35
- const vectors = await embedder.embedBatch(records.map((r) => r.content));
36
- await store.upsert(records, vectors);
37
- console.error(`[KB] Auto-persisted ${analyzerName} analysis (${records.length} chunks)`);
38
- } catch (err) {
39
- console.error(`[KB] Auto-persist ${analyzerName} failed:`, err);
40
- }
41
- }
42
- function registerAnalyzeStructureTool(server, store, embedder) {
43
- const analyzer = new StructureAnalyzer();
44
- server.registerTool(
45
- "analyze_structure",
46
- {
47
- description: "Analyze the file/directory structure of a codebase. Returns an annotated tree with language stats.",
48
- inputSchema: {
49
- path: z.string().describe("Root path to analyze"),
50
- max_depth: z.number().min(1).max(10).default(6).describe("Maximum directory depth"),
51
- format: z.enum(["json", "markdown"]).default("markdown").describe("Output format")
52
- }
53
- },
54
- async ({ path, max_depth, format }) => {
55
- try {
56
- const result = await analyzer.analyze(path, { format, maxDepth: max_depth });
57
- persistAnalysisResult(store, embedder, "structure", path, result.output);
58
- return {
59
- content: [
60
- {
61
- type: "text",
62
- text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` for import graphs, or `analyze_patterns` to detect architecture patterns._"
63
- }
64
- ]
65
- };
66
- } catch (err) {
67
- return {
68
- content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
69
- isError: true
70
- };
71
- }
72
- }
73
- );
74
- }
75
- function registerAnalyzeDependenciesTool(server, store, embedder) {
76
- const analyzer = new DependencyAnalyzer();
77
- server.registerTool(
78
- "analyze_dependencies",
79
- {
80
- description: "Analyze import/require dependencies across a codebase. Shows external packages and internal module graph.",
81
- inputSchema: {
82
- path: z.string().describe("Root path to analyze"),
83
- format: z.enum(["json", "markdown", "mermaid"]).default("markdown").describe("Output format")
84
- }
85
- },
86
- async ({ path, format }) => {
87
- try {
88
- const result = await analyzer.analyze(path, { format });
89
- persistAnalysisResult(store, embedder, "dependencies", path, result.output);
90
- return {
91
- content: [
92
- {
93
- type: "text",
94
- text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_symbols` to explore exported symbols, or `analyze_diagram` for visual representation._"
95
- }
96
- ]
97
- };
98
- } catch (err) {
99
- return {
100
- content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
101
- isError: true
102
- };
103
- }
104
- }
105
- );
106
- }
107
- function registerAnalyzeSymbolsTool(server, store, embedder) {
108
- const analyzer = new SymbolAnalyzer();
109
- server.registerTool(
110
- "analyze_symbols",
111
- {
112
- description: "Extract exported and local symbols (functions, classes, interfaces, types, constants) from a codebase.",
113
- inputSchema: {
114
- path: z.string().describe("Root path to analyze"),
115
- filter: z.string().optional().describe("Filter symbols by name substring"),
116
- format: z.enum(["json", "markdown"]).default("markdown").describe("Output format")
117
- }
118
- },
119
- async ({ path, filter, format }) => {
120
- try {
121
- const result = await analyzer.analyze(path, { format, filter });
122
- persistAnalysisResult(store, embedder, "symbols", path, result.output);
123
- return {
124
- content: [
125
- {
126
- type: "text",
127
- text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see import relationships, or `search` to find usage patterns._"
128
- }
129
- ]
130
- };
131
- } catch (err) {
132
- return {
133
- content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
134
- isError: true
135
- };
136
- }
137
- }
138
- );
139
- }
140
- function registerAnalyzePatternsTool(server, store, embedder) {
141
- const analyzer = new PatternAnalyzer();
142
- server.registerTool(
143
- "analyze_patterns",
144
- {
145
- description: "Detect architectural patterns, frameworks, and conventions in a codebase using directory structure and code heuristics.",
146
- inputSchema: {
147
- path: z.string().describe("Root path to analyze")
148
- }
149
- },
150
- async ({ path }) => {
151
- try {
152
- const result = await analyzer.analyze(path);
153
- persistAnalysisResult(store, embedder, "patterns", path, result.output);
154
- return {
155
- content: [
156
- {
157
- type: "text",
158
- text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_entry_points` to find Lambda handlers and main exports, or `produce_knowledge` for full analysis._"
159
- }
160
- ]
161
- };
162
- } catch (err) {
163
- return {
164
- content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
165
- isError: true
166
- };
167
- }
168
- }
169
- );
170
- }
171
- function registerAnalyzeEntryPointsTool(server, store, embedder) {
172
- const analyzer = new EntryPointAnalyzer();
173
- server.registerTool(
174
- "analyze_entry_points",
175
- {
176
- description: "Find entry points: Lambda handlers, main exports, CLI bins, and server start scripts.",
177
- inputSchema: {
178
- path: z.string().describe("Root path to analyze")
179
- }
180
- },
181
- async ({ path }) => {
182
- try {
183
- const result = await analyzer.analyze(path);
184
- persistAnalysisResult(store, embedder, "entry-points", path, result.output);
185
- return {
186
- content: [
187
- {
188
- type: "text",
189
- text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see what each entry point imports, or `produce_knowledge` for comprehensive analysis._"
190
- }
191
- ]
192
- };
193
- } catch (err) {
194
- return {
195
- content: [{ type: "text", text: `Analysis failed: ${err.message}` }],
196
- isError: true
197
- };
198
- }
199
- }
200
- );
201
- }
202
- function registerAnalyzeDiagramTool(server, store, embedder) {
203
- const generator = new DiagramGenerator();
204
- server.registerTool(
205
- "analyze_diagram",
206
- {
207
- description: "Generate a Mermaid diagram of the codebase architecture or dependency graph.",
208
- inputSchema: {
209
- path: z.string().describe("Root path to analyze"),
210
- diagram_type: z.enum(["architecture", "dependencies"]).default("architecture").describe("Type of diagram")
211
- }
212
- },
213
- async ({ path, diagram_type }) => {
214
- try {
215
- const result = await generator.analyze(path, { diagramType: diagram_type });
216
- persistAnalysisResult(store, embedder, "diagram", path, result.output);
217
- return {
218
- content: [
219
- {
220
- type: "text",
221
- text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_structure` for detailed file tree, or `produce_knowledge` for comprehensive analysis._"
222
- }
223
- ]
224
- };
225
- } catch (err) {
226
- return {
227
- content: [
228
- { type: "text", text: `Diagram generation failed: ${err.message}` }
229
- ],
230
- isError: true
231
- };
232
- }
233
- }
234
- );
235
- }
236
- function registerBlastRadiusTool(server, store, embedder) {
237
- const analyzer = new BlastRadiusAnalyzer();
238
- server.registerTool(
239
- "blast_radius",
240
- {
241
- description: "Given a list of changed files, trace the dependency graph to find all affected files (direct + transitive importers) and their tests. Useful for scoping code reviews and impact analysis.",
242
- inputSchema: {
243
- path: z.string().describe("Root path of the codebase"),
244
- files: z.array(z.string()).min(1).describe("Changed file paths (relative to root)"),
245
- max_depth: z.number().min(1).max(20).default(5).describe("Maximum transitive dependency depth"),
246
- format: z.enum(["json", "markdown"]).default("markdown").describe("Output format")
247
- }
248
- },
249
- async ({ path, files, max_depth, format }) => {
250
- try {
251
- const result = await analyzer.analyze(path, {
252
- files,
253
- maxDepth: max_depth,
254
- format
255
- });
256
- persistAnalysisResult(store, embedder, "blast-radius", path, result.output);
257
- return {
258
- content: [
259
- {
260
- type: "text",
261
- text: result.output + "\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see the full import graph, or `analyze_symbols` to inspect affected exports._"
262
- }
263
- ]
264
- };
265
- } catch (err) {
266
- return {
267
- content: [
268
- {
269
- type: "text",
270
- text: `Blast radius analysis failed: ${err.message}`
271
- }
272
- ],
273
- isError: true
274
- };
275
- }
276
- }
277
- );
278
- }
279
- export {
280
- registerAnalyzeDependenciesTool,
281
- registerAnalyzeDiagramTool,
282
- registerAnalyzeEntryPointsTool,
283
- registerAnalyzePatternsTool,
284
- registerAnalyzeStructureTool,
285
- registerAnalyzeSymbolsTool,
286
- registerBlastRadiusTool
287
- };
288
- //# sourceMappingURL=analyze.tools.js.map
1
+ import{createHash as y}from"node:crypto";import{BlastRadiusAnalyzer as f,DependencyAnalyzer as x,DiagramGenerator as b,EntryPointAnalyzer as w,PatternAnalyzer as z,StructureAnalyzer as _,SymbolAnalyzer as v}from"../../../analyzers/dist/index.js";import{z as a}from"zod";async function d(s,o,r,i,e){try{const t=y("sha256").update(i).digest("hex").slice(0,12),n=`produced/analysis/${r}/${t}.md`,c=y("sha256").update(e).digest("hex").slice(0,16),l=new Date().toISOString(),m=e.length>2e3?e.split(/(?=^## )/m).filter(p=>p.trim().length>0):[e],u=m.map((p,g)=>({id:y("sha256").update(`${n}::${g}`).digest("hex").slice(0,16),content:p.trim(),sourcePath:n,contentType:"produced-knowledge",chunkIndex:g,totalChunks:m.length,startLine:0,endLine:0,fileHash:c,indexedAt:l,origin:"produced",tags:["analysis",r],category:"analysis",version:1})),h=await o.embedBatch(u.map(p=>p.content));await s.upsert(u,h),console.error(`[KB] Auto-persisted ${r} analysis (${u.length} chunks)`)}catch(t){console.error(`[KB] Auto-persist ${r} failed:`,t)}}function K(s,o,r){const i=new _;s.registerTool("analyze_structure",{description:"Analyze the file/directory structure of a codebase. Returns an annotated tree with language stats.",inputSchema:{path:a.string().describe("Root path to analyze"),max_depth:a.number().min(1).max(10).default(6).describe("Maximum directory depth"),format:a.enum(["json","markdown"]).default("markdown").describe("Output format")}},async({path:e,max_depth:t,format:n})=>{try{const c=await i.analyze(e,{format:n,maxDepth:t});return d(o,r,"structure",e,c.output),{content:[{type:"text",text:c.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` for import graphs, or `analyze_patterns` to detect architecture patterns._"}]}}catch(c){return{content:[{type:"text",text:`Analysis failed: ${c.message}`}],isError:!0}}})}function I(s,o,r){const i=new x;s.registerTool("analyze_dependencies",{description:"Analyze import/require dependencies across a codebase. Shows external packages and internal module graph.",inputSchema:{path:a.string().describe("Root path to analyze"),format:a.enum(["json","markdown","mermaid"]).default("markdown").describe("Output format")}},async({path:e,format:t})=>{try{const n=await i.analyze(e,{format:t});return d(o,r,"dependencies",e,n.output),{content:[{type:"text",text:n.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_symbols` to explore exported symbols, or `analyze_diagram` for visual representation._"}]}}catch(n){return{content:[{type:"text",text:`Analysis failed: ${n.message}`}],isError:!0}}})}function T(s,o,r){const i=new v;s.registerTool("analyze_symbols",{description:"Extract exported and local symbols (functions, classes, interfaces, types, constants) from a codebase.",inputSchema:{path:a.string().describe("Root path to analyze"),filter:a.string().optional().describe("Filter symbols by name substring"),format:a.enum(["json","markdown"]).default("markdown").describe("Output format")}},async({path:e,filter:t,format:n})=>{try{const c=await i.analyze(e,{format:n,filter:t});return d(o,r,"symbols",e,c.output),{content:[{type:"text",text:c.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see import relationships, or `search` to find usage patterns._"}]}}catch(c){return{content:[{type:"text",text:`Analysis failed: ${c.message}`}],isError:!0}}})}function k(s,o,r){const i=new z;s.registerTool("analyze_patterns",{description:"Detect architectural patterns, frameworks, and conventions in a codebase using directory structure and code heuristics.",inputSchema:{path:a.string().describe("Root path to analyze")}},async({path:e})=>{try{const t=await i.analyze(e);return d(o,r,"patterns",e,t.output),{content:[{type:"text",text:t.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_entry_points` to find Lambda handlers and main exports, or `produce_knowledge` for full analysis._"}]}}catch(t){return{content:[{type:"text",text:`Analysis failed: ${t.message}`}],isError:!0}}})}function $(s,o,r){const i=new w;s.registerTool("analyze_entry_points",{description:"Find entry points: Lambda handlers, main exports, CLI bins, and server start scripts.",inputSchema:{path:a.string().describe("Root path to analyze")}},async({path:e})=>{try{const t=await i.analyze(e);return d(o,r,"entry-points",e,t.output),{content:[{type:"text",text:t.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see what each entry point imports, or `produce_knowledge` for comprehensive analysis._"}]}}catch(t){return{content:[{type:"text",text:`Analysis failed: ${t.message}`}],isError:!0}}})}function B(s,o,r){const i=new b;s.registerTool("analyze_diagram",{description:"Generate a Mermaid diagram of the codebase architecture or dependency graph.",inputSchema:{path:a.string().describe("Root path to analyze"),diagram_type:a.enum(["architecture","dependencies"]).default("architecture").describe("Type of diagram")}},async({path:e,diagram_type:t})=>{try{const n=await i.analyze(e,{diagramType:t});return d(o,r,"diagram",e,n.output),{content:[{type:"text",text:n.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_structure` for detailed file tree, or `produce_knowledge` for comprehensive analysis._"}]}}catch(n){return{content:[{type:"text",text:`Diagram generation failed: ${n.message}`}],isError:!0}}})}function R(s,o,r){const i=new f;s.registerTool("blast_radius",{description:"Given a list of changed files, trace the dependency graph to find all affected files (direct + transitive importers) and their tests. Useful for scoping code reviews and impact analysis.",inputSchema:{path:a.string().describe("Root path of the codebase"),files:a.array(a.string()).min(1).describe("Changed file paths (relative to root)"),max_depth:a.number().min(1).max(20).default(5).describe("Maximum transitive dependency depth"),format:a.enum(["json","markdown"]).default("markdown").describe("Output format")}},async({path:e,files:t,max_depth:n,format:c})=>{try{const l=await i.analyze(e,{files:t,maxDepth:n,format:c});return d(o,r,"blast-radius",e,l.output),{content:[{type:"text",text:l.output+"\n\n---\n_Analysis auto-saved to KB. Next: Use `analyze_dependencies` to see the full import graph, or `analyze_symbols` to inspect affected exports._"}]}}catch(l){return{content:[{type:"text",text:`Blast radius analysis failed: ${l.message}`}],isError:!0}}})}export{I as registerAnalyzeDependenciesTool,B as registerAnalyzeDiagramTool,$ as registerAnalyzeEntryPointsTool,k as registerAnalyzePatternsTool,K as registerAnalyzeStructureTool,T as registerAnalyzeSymbolsTool,R as registerBlastRadiusTool};