@vpxa/kb 0.1.1 → 0.1.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 (136) hide show
  1. package/package.json +1 -1
  2. package/packages/analyzers/dist/blast-radius-analyzer.js +13 -114
  3. package/packages/analyzers/dist/dependency-analyzer.js +11 -425
  4. package/packages/analyzers/dist/diagram-generator.js +4 -86
  5. package/packages/analyzers/dist/entry-point-analyzer.js +5 -239
  6. package/packages/analyzers/dist/index.js +1 -23
  7. package/packages/analyzers/dist/knowledge-producer.js +24 -113
  8. package/packages/analyzers/dist/pattern-analyzer.js +5 -359
  9. package/packages/analyzers/dist/regex-call-graph.js +1 -428
  10. package/packages/analyzers/dist/structure-analyzer.js +4 -258
  11. package/packages/analyzers/dist/symbol-analyzer.js +13 -442
  12. package/packages/analyzers/dist/ts-call-graph.js +1 -160
  13. package/packages/analyzers/dist/types.js +0 -1
  14. package/packages/chunker/dist/call-graph-extractor.js +1 -90
  15. package/packages/chunker/dist/chunker-factory.js +1 -36
  16. package/packages/chunker/dist/chunker.interface.js +0 -1
  17. package/packages/chunker/dist/code-chunker.js +14 -134
  18. package/packages/chunker/dist/generic-chunker.js +5 -72
  19. package/packages/chunker/dist/index.js +1 -21
  20. package/packages/chunker/dist/markdown-chunker.js +7 -119
  21. package/packages/chunker/dist/treesitter-chunker.js +8 -234
  22. package/packages/cli/dist/commands/analyze.js +3 -112
  23. package/packages/cli/dist/commands/context-cmds.js +1 -155
  24. package/packages/cli/dist/commands/environment.js +2 -204
  25. package/packages/cli/dist/commands/execution.js +1 -137
  26. package/packages/cli/dist/commands/graph.js +7 -81
  27. package/packages/cli/dist/commands/init.js +9 -87
  28. package/packages/cli/dist/commands/knowledge.js +1 -139
  29. package/packages/cli/dist/commands/search.js +8 -267
  30. package/packages/cli/dist/commands/system.js +4 -241
  31. package/packages/cli/dist/commands/workspace.js +2 -388
  32. package/packages/cli/dist/context.js +1 -14
  33. package/packages/cli/dist/helpers.js +3 -458
  34. package/packages/cli/dist/index.js +3 -69
  35. package/packages/cli/dist/kb-init.js +1 -82
  36. package/packages/cli/dist/types.js +0 -1
  37. package/packages/core/dist/constants.js +1 -43
  38. package/packages/core/dist/content-detector.js +1 -79
  39. package/packages/core/dist/errors.js +1 -40
  40. package/packages/core/dist/index.js +1 -9
  41. package/packages/core/dist/logger.js +1 -34
  42. package/packages/core/dist/types.js +0 -1
  43. package/packages/embeddings/dist/embedder.interface.js +0 -1
  44. package/packages/embeddings/dist/index.js +1 -5
  45. package/packages/embeddings/dist/onnx-embedder.js +1 -82
  46. package/packages/indexer/dist/file-hasher.js +1 -13
  47. package/packages/indexer/dist/filesystem-crawler.js +1 -125
  48. package/packages/indexer/dist/graph-extractor.js +1 -111
  49. package/packages/indexer/dist/incremental-indexer.js +1 -278
  50. package/packages/indexer/dist/index.js +1 -14
  51. package/packages/server/dist/api.js +1 -9
  52. package/packages/server/dist/config.js +1 -75
  53. package/packages/server/dist/curated-manager.js +9 -356
  54. package/packages/server/dist/index.js +1 -134
  55. package/packages/server/dist/replay-interceptor.js +1 -38
  56. package/packages/server/dist/resources/resources.js +2 -40
  57. package/packages/server/dist/server.js +1 -247
  58. package/packages/server/dist/tools/analyze.tools.js +1 -288
  59. package/packages/server/dist/tools/forge.tools.js +11 -499
  60. package/packages/server/dist/tools/forget.tool.js +3 -39
  61. package/packages/server/dist/tools/graph.tool.js +5 -110
  62. package/packages/server/dist/tools/list.tool.js +5 -53
  63. package/packages/server/dist/tools/lookup.tool.js +8 -51
  64. package/packages/server/dist/tools/onboard.tool.js +2 -112
  65. package/packages/server/dist/tools/produce.tool.js +4 -74
  66. package/packages/server/dist/tools/read.tool.js +4 -47
  67. package/packages/server/dist/tools/reindex.tool.js +2 -70
  68. package/packages/server/dist/tools/remember.tool.js +3 -42
  69. package/packages/server/dist/tools/replay.tool.js +6 -88
  70. package/packages/server/dist/tools/search.tool.js +17 -327
  71. package/packages/server/dist/tools/status.tool.js +3 -68
  72. package/packages/server/dist/tools/toolkit.tools.js +20 -1673
  73. package/packages/server/dist/tools/update.tool.js +3 -39
  74. package/packages/server/dist/tools/utility.tools.js +19 -456
  75. package/packages/store/dist/graph-store.interface.js +0 -1
  76. package/packages/store/dist/index.js +1 -9
  77. package/packages/store/dist/lance-store.js +1 -258
  78. package/packages/store/dist/sqlite-graph-store.js +8 -309
  79. package/packages/store/dist/store-factory.js +1 -14
  80. package/packages/store/dist/store.interface.js +0 -1
  81. package/packages/tools/dist/batch.js +1 -45
  82. package/packages/tools/dist/changelog.js +2 -112
  83. package/packages/tools/dist/check.js +2 -59
  84. package/packages/tools/dist/checkpoint.js +2 -43
  85. package/packages/tools/dist/codemod.js +2 -69
  86. package/packages/tools/dist/compact.js +3 -60
  87. package/packages/tools/dist/data-transform.js +1 -124
  88. package/packages/tools/dist/dead-symbols.js +2 -71
  89. package/packages/tools/dist/delegate.js +3 -128
  90. package/packages/tools/dist/diff-parse.js +3 -153
  91. package/packages/tools/dist/digest.js +7 -242
  92. package/packages/tools/dist/encode.js +1 -46
  93. package/packages/tools/dist/env-info.js +1 -58
  94. package/packages/tools/dist/eval.js +3 -79
  95. package/packages/tools/dist/evidence-map.js +3 -203
  96. package/packages/tools/dist/file-summary.js +2 -106
  97. package/packages/tools/dist/file-walk.js +1 -75
  98. package/packages/tools/dist/find-examples.js +3 -48
  99. package/packages/tools/dist/find.js +1 -120
  100. package/packages/tools/dist/forge-classify.js +2 -319
  101. package/packages/tools/dist/forge-ground.js +1 -184
  102. package/packages/tools/dist/git-context.js +3 -46
  103. package/packages/tools/dist/graph-query.js +1 -194
  104. package/packages/tools/dist/health.js +1 -118
  105. package/packages/tools/dist/http-request.js +1 -58
  106. package/packages/tools/dist/index.js +1 -273
  107. package/packages/tools/dist/lane.js +7 -227
  108. package/packages/tools/dist/measure.js +2 -119
  109. package/packages/tools/dist/onboard.js +42 -1136
  110. package/packages/tools/dist/parse-output.js +2 -158
  111. package/packages/tools/dist/process-manager.js +1 -69
  112. package/packages/tools/dist/queue.js +2 -126
  113. package/packages/tools/dist/regex-test.js +1 -39
  114. package/packages/tools/dist/rename.js +2 -70
  115. package/packages/tools/dist/replay.js +6 -108
  116. package/packages/tools/dist/schema-validate.js +1 -141
  117. package/packages/tools/dist/scope-map.js +1 -72
  118. package/packages/tools/dist/snippet.js +1 -80
  119. package/packages/tools/dist/stash.js +2 -60
  120. package/packages/tools/dist/stratum-card.js +5 -238
  121. package/packages/tools/dist/symbol.js +3 -87
  122. package/packages/tools/dist/test-run.js +2 -55
  123. package/packages/tools/dist/text-utils.js +2 -31
  124. package/packages/tools/dist/time-utils.js +1 -135
  125. package/packages/tools/dist/trace.js +2 -114
  126. package/packages/tools/dist/truncation.js +10 -41
  127. package/packages/tools/dist/watch.js +1 -61
  128. package/packages/tools/dist/web-fetch.js +9 -244
  129. package/packages/tools/dist/web-search.js +1 -46
  130. package/packages/tools/dist/workset.js +2 -77
  131. package/packages/tui/dist/App.js +260 -52468
  132. package/packages/tui/dist/index.js +286 -54551
  133. package/packages/tui/dist/panels/CuratedPanel.js +211 -34291
  134. package/packages/tui/dist/panels/LogPanel.js +259 -51703
  135. package/packages/tui/dist/panels/SearchPanel.js +212 -34824
  136. 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"@kb/chunker";import{OnnxEmbedder as m}from"@kb/embeddings";import{IncrementalIndexer as g}from"@kb/indexer";import{createStore as p,SqliteGraphStore as T}from"@kb/store";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 L}from"./tools/remember.tool.js";import{registerReplayTool as H}from"./tools/replay.tool.js";import{registerSearchTool as j}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),j(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),L(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),H(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"@kb/analyzers";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 k(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 I(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 T(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{k as registerAnalyzeDependenciesTool,B as registerAnalyzeDiagramTool,$ as registerAnalyzeEntryPointsTool,T as registerAnalyzePatternsTool,K as registerAnalyzeStructureTool,I as registerAnalyzeSymbolsTool,R as registerBlastRadiusTool};