@vpxa/kb 0.1.1

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 (275) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1140 -0
  3. package/bin/kb.mjs +10 -0
  4. package/package.json +67 -0
  5. package/packages/analyzers/dist/blast-radius-analyzer.d.ts +23 -0
  6. package/packages/analyzers/dist/blast-radius-analyzer.js +114 -0
  7. package/packages/analyzers/dist/dependency-analyzer.d.ts +29 -0
  8. package/packages/analyzers/dist/dependency-analyzer.js +425 -0
  9. package/packages/analyzers/dist/diagram-generator.d.ts +13 -0
  10. package/packages/analyzers/dist/diagram-generator.js +86 -0
  11. package/packages/analyzers/dist/entry-point-analyzer.d.ts +19 -0
  12. package/packages/analyzers/dist/entry-point-analyzer.js +239 -0
  13. package/packages/analyzers/dist/index.d.ts +14 -0
  14. package/packages/analyzers/dist/index.js +23 -0
  15. package/packages/analyzers/dist/knowledge-producer.d.ts +32 -0
  16. package/packages/analyzers/dist/knowledge-producer.js +113 -0
  17. package/packages/analyzers/dist/pattern-analyzer.d.ts +12 -0
  18. package/packages/analyzers/dist/pattern-analyzer.js +359 -0
  19. package/packages/analyzers/dist/regex-call-graph.d.ts +17 -0
  20. package/packages/analyzers/dist/regex-call-graph.js +428 -0
  21. package/packages/analyzers/dist/structure-analyzer.d.ts +11 -0
  22. package/packages/analyzers/dist/structure-analyzer.js +258 -0
  23. package/packages/analyzers/dist/symbol-analyzer.d.ts +10 -0
  24. package/packages/analyzers/dist/symbol-analyzer.js +442 -0
  25. package/packages/analyzers/dist/ts-call-graph.d.ts +27 -0
  26. package/packages/analyzers/dist/ts-call-graph.js +160 -0
  27. package/packages/analyzers/dist/types.d.ts +98 -0
  28. package/packages/analyzers/dist/types.js +1 -0
  29. package/packages/chunker/dist/call-graph-extractor.d.ts +22 -0
  30. package/packages/chunker/dist/call-graph-extractor.js +90 -0
  31. package/packages/chunker/dist/chunker-factory.d.ts +7 -0
  32. package/packages/chunker/dist/chunker-factory.js +36 -0
  33. package/packages/chunker/dist/chunker.interface.d.ts +10 -0
  34. package/packages/chunker/dist/chunker.interface.js +1 -0
  35. package/packages/chunker/dist/code-chunker.d.ts +14 -0
  36. package/packages/chunker/dist/code-chunker.js +134 -0
  37. package/packages/chunker/dist/generic-chunker.d.ts +12 -0
  38. package/packages/chunker/dist/generic-chunker.js +72 -0
  39. package/packages/chunker/dist/index.d.ts +8 -0
  40. package/packages/chunker/dist/index.js +21 -0
  41. package/packages/chunker/dist/markdown-chunker.d.ts +14 -0
  42. package/packages/chunker/dist/markdown-chunker.js +122 -0
  43. package/packages/chunker/dist/treesitter-chunker.d.ts +47 -0
  44. package/packages/chunker/dist/treesitter-chunker.js +234 -0
  45. package/packages/cli/dist/commands/analyze.d.ts +3 -0
  46. package/packages/cli/dist/commands/analyze.js +112 -0
  47. package/packages/cli/dist/commands/context-cmds.d.ts +3 -0
  48. package/packages/cli/dist/commands/context-cmds.js +155 -0
  49. package/packages/cli/dist/commands/environment.d.ts +3 -0
  50. package/packages/cli/dist/commands/environment.js +204 -0
  51. package/packages/cli/dist/commands/execution.d.ts +3 -0
  52. package/packages/cli/dist/commands/execution.js +137 -0
  53. package/packages/cli/dist/commands/graph.d.ts +3 -0
  54. package/packages/cli/dist/commands/graph.js +81 -0
  55. package/packages/cli/dist/commands/init.d.ts +8 -0
  56. package/packages/cli/dist/commands/init.js +87 -0
  57. package/packages/cli/dist/commands/knowledge.d.ts +3 -0
  58. package/packages/cli/dist/commands/knowledge.js +139 -0
  59. package/packages/cli/dist/commands/search.d.ts +3 -0
  60. package/packages/cli/dist/commands/search.js +267 -0
  61. package/packages/cli/dist/commands/system.d.ts +3 -0
  62. package/packages/cli/dist/commands/system.js +241 -0
  63. package/packages/cli/dist/commands/workspace.d.ts +3 -0
  64. package/packages/cli/dist/commands/workspace.js +388 -0
  65. package/packages/cli/dist/context.d.ts +5 -0
  66. package/packages/cli/dist/context.js +14 -0
  67. package/packages/cli/dist/helpers.d.ts +52 -0
  68. package/packages/cli/dist/helpers.js +458 -0
  69. package/packages/cli/dist/index.d.ts +8 -0
  70. package/packages/cli/dist/index.js +69 -0
  71. package/packages/cli/dist/kb-init.d.ts +57 -0
  72. package/packages/cli/dist/kb-init.js +82 -0
  73. package/packages/cli/dist/types.d.ts +7 -0
  74. package/packages/cli/dist/types.js +1 -0
  75. package/packages/core/dist/constants.d.ts +49 -0
  76. package/packages/core/dist/constants.js +43 -0
  77. package/packages/core/dist/content-detector.d.ts +9 -0
  78. package/packages/core/dist/content-detector.js +79 -0
  79. package/packages/core/dist/errors.d.ts +18 -0
  80. package/packages/core/dist/errors.js +40 -0
  81. package/packages/core/dist/index.d.ts +6 -0
  82. package/packages/core/dist/index.js +9 -0
  83. package/packages/core/dist/logger.d.ts +9 -0
  84. package/packages/core/dist/logger.js +34 -0
  85. package/packages/core/dist/types.d.ts +108 -0
  86. package/packages/core/dist/types.js +1 -0
  87. package/packages/embeddings/dist/embedder.interface.d.ts +24 -0
  88. package/packages/embeddings/dist/embedder.interface.js +1 -0
  89. package/packages/embeddings/dist/index.d.ts +3 -0
  90. package/packages/embeddings/dist/index.js +5 -0
  91. package/packages/embeddings/dist/onnx-embedder.d.ts +24 -0
  92. package/packages/embeddings/dist/onnx-embedder.js +82 -0
  93. package/packages/indexer/dist/file-hasher.d.ts +11 -0
  94. package/packages/indexer/dist/file-hasher.js +13 -0
  95. package/packages/indexer/dist/filesystem-crawler.d.ts +27 -0
  96. package/packages/indexer/dist/filesystem-crawler.js +125 -0
  97. package/packages/indexer/dist/graph-extractor.d.ts +22 -0
  98. package/packages/indexer/dist/graph-extractor.js +111 -0
  99. package/packages/indexer/dist/incremental-indexer.d.ts +47 -0
  100. package/packages/indexer/dist/incremental-indexer.js +278 -0
  101. package/packages/indexer/dist/index.d.ts +5 -0
  102. package/packages/indexer/dist/index.js +14 -0
  103. package/packages/server/dist/api.d.ts +8 -0
  104. package/packages/server/dist/api.js +9 -0
  105. package/packages/server/dist/config.d.ts +3 -0
  106. package/packages/server/dist/config.js +75 -0
  107. package/packages/server/dist/curated-manager.d.ts +86 -0
  108. package/packages/server/dist/curated-manager.js +357 -0
  109. package/packages/server/dist/index.d.ts +2 -0
  110. package/packages/server/dist/index.js +134 -0
  111. package/packages/server/dist/replay-interceptor.d.ts +11 -0
  112. package/packages/server/dist/replay-interceptor.js +38 -0
  113. package/packages/server/dist/resources/resources.d.ts +4 -0
  114. package/packages/server/dist/resources/resources.js +40 -0
  115. package/packages/server/dist/server.d.ts +21 -0
  116. package/packages/server/dist/server.js +247 -0
  117. package/packages/server/dist/tools/analyze.tools.d.ts +11 -0
  118. package/packages/server/dist/tools/analyze.tools.js +288 -0
  119. package/packages/server/dist/tools/forge.tools.d.ts +12 -0
  120. package/packages/server/dist/tools/forge.tools.js +501 -0
  121. package/packages/server/dist/tools/forget.tool.d.ts +4 -0
  122. package/packages/server/dist/tools/forget.tool.js +43 -0
  123. package/packages/server/dist/tools/graph.tool.d.ts +4 -0
  124. package/packages/server/dist/tools/graph.tool.js +110 -0
  125. package/packages/server/dist/tools/list.tool.d.ts +4 -0
  126. package/packages/server/dist/tools/list.tool.js +56 -0
  127. package/packages/server/dist/tools/lookup.tool.d.ts +4 -0
  128. package/packages/server/dist/tools/lookup.tool.js +53 -0
  129. package/packages/server/dist/tools/onboard.tool.d.ts +5 -0
  130. package/packages/server/dist/tools/onboard.tool.js +112 -0
  131. package/packages/server/dist/tools/produce.tool.d.ts +3 -0
  132. package/packages/server/dist/tools/produce.tool.js +74 -0
  133. package/packages/server/dist/tools/read.tool.d.ts +4 -0
  134. package/packages/server/dist/tools/read.tool.js +49 -0
  135. package/packages/server/dist/tools/reindex.tool.d.ts +7 -0
  136. package/packages/server/dist/tools/reindex.tool.js +70 -0
  137. package/packages/server/dist/tools/remember.tool.d.ts +4 -0
  138. package/packages/server/dist/tools/remember.tool.js +45 -0
  139. package/packages/server/dist/tools/replay.tool.d.ts +3 -0
  140. package/packages/server/dist/tools/replay.tool.js +89 -0
  141. package/packages/server/dist/tools/search.tool.d.ts +5 -0
  142. package/packages/server/dist/tools/search.tool.js +331 -0
  143. package/packages/server/dist/tools/status.tool.d.ts +4 -0
  144. package/packages/server/dist/tools/status.tool.js +68 -0
  145. package/packages/server/dist/tools/toolkit.tools.d.ts +35 -0
  146. package/packages/server/dist/tools/toolkit.tools.js +1674 -0
  147. package/packages/server/dist/tools/update.tool.d.ts +4 -0
  148. package/packages/server/dist/tools/update.tool.js +42 -0
  149. package/packages/server/dist/tools/utility.tools.d.ts +15 -0
  150. package/packages/server/dist/tools/utility.tools.js +461 -0
  151. package/packages/store/dist/graph-store.interface.d.ts +104 -0
  152. package/packages/store/dist/graph-store.interface.js +1 -0
  153. package/packages/store/dist/index.d.ts +6 -0
  154. package/packages/store/dist/index.js +9 -0
  155. package/packages/store/dist/lance-store.d.ts +32 -0
  156. package/packages/store/dist/lance-store.js +258 -0
  157. package/packages/store/dist/sqlite-graph-store.d.ts +43 -0
  158. package/packages/store/dist/sqlite-graph-store.js +374 -0
  159. package/packages/store/dist/store-factory.d.ts +9 -0
  160. package/packages/store/dist/store-factory.js +14 -0
  161. package/packages/store/dist/store.interface.d.ts +48 -0
  162. package/packages/store/dist/store.interface.js +1 -0
  163. package/packages/tools/dist/batch.d.ts +21 -0
  164. package/packages/tools/dist/batch.js +45 -0
  165. package/packages/tools/dist/changelog.d.ts +34 -0
  166. package/packages/tools/dist/changelog.js +112 -0
  167. package/packages/tools/dist/check.d.ts +26 -0
  168. package/packages/tools/dist/check.js +59 -0
  169. package/packages/tools/dist/checkpoint.d.ts +17 -0
  170. package/packages/tools/dist/checkpoint.js +43 -0
  171. package/packages/tools/dist/codemod.d.ts +37 -0
  172. package/packages/tools/dist/codemod.js +69 -0
  173. package/packages/tools/dist/compact.d.ts +41 -0
  174. package/packages/tools/dist/compact.js +60 -0
  175. package/packages/tools/dist/data-transform.d.ts +10 -0
  176. package/packages/tools/dist/data-transform.js +124 -0
  177. package/packages/tools/dist/dead-symbols.d.ts +21 -0
  178. package/packages/tools/dist/dead-symbols.js +71 -0
  179. package/packages/tools/dist/delegate.d.ts +34 -0
  180. package/packages/tools/dist/delegate.js +130 -0
  181. package/packages/tools/dist/diff-parse.d.ts +26 -0
  182. package/packages/tools/dist/diff-parse.js +153 -0
  183. package/packages/tools/dist/digest.d.ts +53 -0
  184. package/packages/tools/dist/digest.js +242 -0
  185. package/packages/tools/dist/encode.d.ts +14 -0
  186. package/packages/tools/dist/encode.js +46 -0
  187. package/packages/tools/dist/env-info.d.ts +28 -0
  188. package/packages/tools/dist/env-info.js +58 -0
  189. package/packages/tools/dist/eval.d.ts +13 -0
  190. package/packages/tools/dist/eval.js +79 -0
  191. package/packages/tools/dist/evidence-map.d.ts +79 -0
  192. package/packages/tools/dist/evidence-map.js +203 -0
  193. package/packages/tools/dist/file-summary.d.ts +32 -0
  194. package/packages/tools/dist/file-summary.js +106 -0
  195. package/packages/tools/dist/file-walk.d.ts +4 -0
  196. package/packages/tools/dist/file-walk.js +75 -0
  197. package/packages/tools/dist/find-examples.d.ts +25 -0
  198. package/packages/tools/dist/find-examples.js +48 -0
  199. package/packages/tools/dist/find.d.ts +47 -0
  200. package/packages/tools/dist/find.js +120 -0
  201. package/packages/tools/dist/forge-classify.d.ts +44 -0
  202. package/packages/tools/dist/forge-classify.js +319 -0
  203. package/packages/tools/dist/forge-ground.d.ts +64 -0
  204. package/packages/tools/dist/forge-ground.js +184 -0
  205. package/packages/tools/dist/git-context.d.ts +22 -0
  206. package/packages/tools/dist/git-context.js +46 -0
  207. package/packages/tools/dist/graph-query.d.ts +89 -0
  208. package/packages/tools/dist/graph-query.js +194 -0
  209. package/packages/tools/dist/health.d.ts +14 -0
  210. package/packages/tools/dist/health.js +118 -0
  211. package/packages/tools/dist/http-request.d.ts +23 -0
  212. package/packages/tools/dist/http-request.js +58 -0
  213. package/packages/tools/dist/index.d.ts +49 -0
  214. package/packages/tools/dist/index.js +273 -0
  215. package/packages/tools/dist/lane.d.ts +39 -0
  216. package/packages/tools/dist/lane.js +227 -0
  217. package/packages/tools/dist/measure.d.ts +38 -0
  218. package/packages/tools/dist/measure.js +119 -0
  219. package/packages/tools/dist/onboard.d.ts +41 -0
  220. package/packages/tools/dist/onboard.js +1139 -0
  221. package/packages/tools/dist/parse-output.d.ts +80 -0
  222. package/packages/tools/dist/parse-output.js +158 -0
  223. package/packages/tools/dist/process-manager.d.ts +18 -0
  224. package/packages/tools/dist/process-manager.js +69 -0
  225. package/packages/tools/dist/queue.d.ts +38 -0
  226. package/packages/tools/dist/queue.js +126 -0
  227. package/packages/tools/dist/regex-test.d.ts +31 -0
  228. package/packages/tools/dist/regex-test.js +39 -0
  229. package/packages/tools/dist/rename.d.ts +29 -0
  230. package/packages/tools/dist/rename.js +70 -0
  231. package/packages/tools/dist/replay.d.ts +56 -0
  232. package/packages/tools/dist/replay.js +108 -0
  233. package/packages/tools/dist/schema-validate.d.ts +23 -0
  234. package/packages/tools/dist/schema-validate.js +141 -0
  235. package/packages/tools/dist/scope-map.d.ts +52 -0
  236. package/packages/tools/dist/scope-map.js +72 -0
  237. package/packages/tools/dist/snippet.d.ts +34 -0
  238. package/packages/tools/dist/snippet.js +80 -0
  239. package/packages/tools/dist/stash.d.ts +12 -0
  240. package/packages/tools/dist/stash.js +60 -0
  241. package/packages/tools/dist/stratum-card.d.ts +31 -0
  242. package/packages/tools/dist/stratum-card.js +239 -0
  243. package/packages/tools/dist/symbol.d.ts +28 -0
  244. package/packages/tools/dist/symbol.js +87 -0
  245. package/packages/tools/dist/test-run.d.ts +23 -0
  246. package/packages/tools/dist/test-run.js +55 -0
  247. package/packages/tools/dist/text-utils.d.ts +16 -0
  248. package/packages/tools/dist/text-utils.js +31 -0
  249. package/packages/tools/dist/time-utils.d.ts +18 -0
  250. package/packages/tools/dist/time-utils.js +135 -0
  251. package/packages/tools/dist/trace.d.ts +24 -0
  252. package/packages/tools/dist/trace.js +114 -0
  253. package/packages/tools/dist/truncation.d.ts +22 -0
  254. package/packages/tools/dist/truncation.js +45 -0
  255. package/packages/tools/dist/watch.d.ts +30 -0
  256. package/packages/tools/dist/watch.js +61 -0
  257. package/packages/tools/dist/web-fetch.d.ts +45 -0
  258. package/packages/tools/dist/web-fetch.js +249 -0
  259. package/packages/tools/dist/web-search.d.ts +23 -0
  260. package/packages/tools/dist/web-search.js +46 -0
  261. package/packages/tools/dist/workset.d.ts +45 -0
  262. package/packages/tools/dist/workset.js +77 -0
  263. package/packages/tui/dist/App.d.ts +8 -0
  264. package/packages/tui/dist/App.js +52659 -0
  265. package/packages/tui/dist/index.d.ts +19 -0
  266. package/packages/tui/dist/index.js +54742 -0
  267. package/packages/tui/dist/panels/CuratedPanel.d.ts +8 -0
  268. package/packages/tui/dist/panels/CuratedPanel.js +34452 -0
  269. package/packages/tui/dist/panels/LogPanel.d.ts +3 -0
  270. package/packages/tui/dist/panels/LogPanel.js +51894 -0
  271. package/packages/tui/dist/panels/SearchPanel.d.ts +10 -0
  272. package/packages/tui/dist/panels/SearchPanel.js +34985 -0
  273. package/packages/tui/dist/panels/StatusPanel.d.ts +8 -0
  274. package/packages/tui/dist/panels/StatusPanel.js +34465 -0
  275. package/skills/knowledge-base/SKILL.md +316 -0
@@ -0,0 +1,331 @@
1
+ import { graphAugmentSearch } from "@kb/tools";
2
+ import { z } from "zod";
3
+ function reciprocalRankFusion(vectorResults, ftsResults, k = 60) {
4
+ const merged = /* @__PURE__ */ new Map();
5
+ for (let i = 0; i < vectorResults.length; i++) {
6
+ const r = vectorResults[i];
7
+ merged.set(r.record.id, { record: r.record, score: 1 / (k + i + 1) });
8
+ }
9
+ for (let i = 0; i < ftsResults.length; i++) {
10
+ const r = ftsResults[i];
11
+ const existing = merged.get(r.record.id);
12
+ if (existing) {
13
+ existing.score += 1 / (k + i + 1);
14
+ } else {
15
+ merged.set(r.record.id, { record: r.record, score: 1 / (k + i + 1) });
16
+ }
17
+ }
18
+ return [...merged.values()].sort((a, b) => b.score - a.score).map(({ record, score }) => ({ record, score }));
19
+ }
20
+ function applyProximityReranking(results, query) {
21
+ const terms = query.toLowerCase().split(/\s+/).filter((t) => t.length >= 2);
22
+ if (terms.length < 2) return results;
23
+ return results.map((r) => {
24
+ const content = r.record.content.toLowerCase();
25
+ const positions = terms.map((term) => {
26
+ const pos = [];
27
+ let idx = content.indexOf(term);
28
+ while (idx !== -1) {
29
+ pos.push(idx);
30
+ idx = content.indexOf(term, idx + 1);
31
+ }
32
+ return pos;
33
+ });
34
+ if (positions.some((p) => p.length === 0)) return r;
35
+ let minSpan = content.length;
36
+ for (const startPos of positions[0]) {
37
+ let spanStart = startPos;
38
+ let spanEnd = startPos + terms[0].length;
39
+ for (let t = 1; t < positions.length; t++) {
40
+ let nearest = positions[t][0];
41
+ let nearestDist = Math.abs(nearest - startPos);
42
+ for (let pi = 1; pi < positions[t].length; pi++) {
43
+ const dist = Math.abs(positions[t][pi] - startPos);
44
+ if (dist < nearestDist) {
45
+ nearestDist = dist;
46
+ nearest = positions[t][pi];
47
+ }
48
+ }
49
+ spanStart = Math.min(spanStart, nearest);
50
+ spanEnd = Math.max(spanEnd, nearest + terms[t].length);
51
+ }
52
+ minSpan = Math.min(minSpan, spanEnd - spanStart);
53
+ }
54
+ const proximityBoost = 1 + 0.25 / (1 + minSpan / 200);
55
+ return { record: r.record, score: r.score * proximityBoost };
56
+ }).sort((a, b) => b.score - a.score);
57
+ }
58
+ function extractDistinctiveTerms(results, query, maxTerms = 8) {
59
+ const queryTerms = new Set(
60
+ query.toLowerCase().split(/\s+/).filter((t) => t.length >= 2)
61
+ );
62
+ const termCounts = /* @__PURE__ */ new Map();
63
+ const totalDocs = results.length;
64
+ for (const r of results) {
65
+ const origWords = new Set(
66
+ r.record.content.split(/[^a-zA-Z0-9_]+/).filter((w) => w.length >= 3 && !STOP_WORDS.has(w.toLowerCase()))
67
+ );
68
+ for (const w of origWords) {
69
+ const lower = w.toLowerCase();
70
+ if (/[_A-Z]/.test(w)) {
71
+ termCounts.set(`__id__${lower}`, 1);
72
+ }
73
+ }
74
+ const words = new Set(
75
+ r.record.content.toLowerCase().split(/[^a-zA-Z0-9_]+/).filter((w) => w.length >= 3 && !STOP_WORDS.has(w))
76
+ );
77
+ for (const w of words) {
78
+ termCounts.set(w, (termCounts.get(w) ?? 0) + 1);
79
+ }
80
+ }
81
+ const scored = [];
82
+ for (const [term, count] of termCounts) {
83
+ if (term.startsWith("__id__")) continue;
84
+ if (queryTerms.has(term)) continue;
85
+ if (count > totalDocs * 0.8) continue;
86
+ const idf = Math.log(totalDocs / count);
87
+ const identifierBonus = termCounts.has(`__id__${term}`) ? 1 : 0;
88
+ const lenBonus = term.length > 8 ? 0.5 : 0;
89
+ scored.push({ term, score: idf + identifierBonus + lenBonus });
90
+ }
91
+ return scored.sort((a, b) => b.score - a.score).slice(0, maxTerms).map((s) => s.term);
92
+ }
93
+ const STOP_WORDS = /* @__PURE__ */ new Set([
94
+ "the",
95
+ "and",
96
+ "for",
97
+ "are",
98
+ "but",
99
+ "not",
100
+ "you",
101
+ "all",
102
+ "can",
103
+ "had",
104
+ "her",
105
+ "was",
106
+ "one",
107
+ "our",
108
+ "out",
109
+ "has",
110
+ "have",
111
+ "from",
112
+ "this",
113
+ "that",
114
+ "with",
115
+ "they",
116
+ "been",
117
+ "said",
118
+ "each",
119
+ "which",
120
+ "their",
121
+ "will",
122
+ "other",
123
+ "about",
124
+ "many",
125
+ "then",
126
+ "them",
127
+ "these",
128
+ "some",
129
+ "would",
130
+ "make",
131
+ "like",
132
+ "into",
133
+ "could",
134
+ "time",
135
+ "very",
136
+ "when",
137
+ "come",
138
+ "just",
139
+ "know",
140
+ "take",
141
+ "people",
142
+ "also",
143
+ "back",
144
+ "after",
145
+ "only",
146
+ "more",
147
+ "than",
148
+ "over",
149
+ "such",
150
+ "import",
151
+ "export",
152
+ "const",
153
+ "function",
154
+ "return",
155
+ "true",
156
+ "false",
157
+ "null",
158
+ "undefined",
159
+ "string",
160
+ "number",
161
+ "boolean",
162
+ "void",
163
+ "type",
164
+ "interface"
165
+ ]);
166
+ function registerSearchTool(server, embedder, store, graphStore) {
167
+ server.registerTool(
168
+ "search",
169
+ {
170
+ description: "Search the knowledge base with hybrid vector + keyword matching (BM25 + RRF fusion). Best for finding code, docs, and prior decisions. Supports semantic, keyword, and hybrid modes.",
171
+ inputSchema: {
172
+ query: z.string().describe("Natural language search query"),
173
+ limit: z.number().min(1).max(20).default(5).describe("Maximum results to return"),
174
+ search_mode: z.enum(["hybrid", "semantic", "keyword"]).default("hybrid").describe(
175
+ "Search strategy: hybrid (vector + FTS + RRF fusion, default), semantic (vector only), keyword (FTS only)"
176
+ ),
177
+ content_type: z.enum([
178
+ "markdown",
179
+ "code-typescript",
180
+ "code-javascript",
181
+ "code-python",
182
+ "config-json",
183
+ "config-yaml",
184
+ "config-toml",
185
+ "config-dotenv",
186
+ "infrastructure",
187
+ "documentation",
188
+ "test",
189
+ "script",
190
+ "curated-knowledge",
191
+ "produced-knowledge",
192
+ "other"
193
+ ]).optional().describe("Filter by content type"),
194
+ origin: z.enum(["indexed", "curated", "produced"]).optional().describe("Filter by knowledge origin"),
195
+ category: z.string().optional().describe("Filter by category (e.g., decisions, patterns, conventions)"),
196
+ tags: z.array(z.string()).optional().describe("Filter by tags (returns results matching ANY of the specified tags)"),
197
+ min_score: z.number().min(0).max(1).default(0.25).describe("Minimum similarity score"),
198
+ graph_hops: z.number().min(0).max(3).default(0).describe(
199
+ "Number of graph hops to augment results with (0 = no graph context, 1-3 = enrich results with connected entities)"
200
+ )
201
+ }
202
+ },
203
+ async ({
204
+ query,
205
+ limit,
206
+ search_mode,
207
+ content_type,
208
+ origin,
209
+ category,
210
+ tags,
211
+ min_score,
212
+ graph_hops
213
+ }) => {
214
+ try {
215
+ const filterOpts = {
216
+ limit,
217
+ minScore: min_score,
218
+ contentType: content_type,
219
+ origin,
220
+ category,
221
+ tags
222
+ };
223
+ let results;
224
+ if (search_mode === "keyword") {
225
+ results = await store.ftsSearch(query, filterOpts);
226
+ results = results.slice(0, limit);
227
+ } else if (search_mode === "semantic") {
228
+ const vector = await embedder.embedQuery(query);
229
+ results = await store.search(vector, filterOpts);
230
+ } else {
231
+ const vector = await embedder.embedQuery(query);
232
+ const [vectorResults, ftsResults] = await Promise.all([
233
+ store.search(vector, { ...filterOpts, limit: limit * 2 }),
234
+ store.ftsSearch(query, { ...filterOpts, limit: limit * 2 }).catch(() => [])
235
+ ]);
236
+ results = reciprocalRankFusion(vectorResults, ftsResults).slice(0, limit);
237
+ }
238
+ if (results.length > 1) {
239
+ results = applyProximityReranking(results, query);
240
+ }
241
+ if (results.length === 0) {
242
+ return {
243
+ content: [{ type: "text", text: "No results found for the given query." }]
244
+ };
245
+ }
246
+ let graphSections;
247
+ let graphWarning;
248
+ if (graph_hops > 0 && !graphStore) {
249
+ graphWarning = "> **Note:** `graph_hops` was set but no graph store is available. Graph augmentation skipped.";
250
+ }
251
+ if (graph_hops > 0 && graphStore) {
252
+ try {
253
+ const hits = results.map((r) => ({
254
+ recordId: r.record.id,
255
+ score: r.score,
256
+ sourcePath: r.record.sourcePath
257
+ }));
258
+ const augmented = await graphAugmentSearch(graphStore, hits, {
259
+ hops: graph_hops,
260
+ maxPerHit: 5
261
+ });
262
+ graphSections = /* @__PURE__ */ new Map();
263
+ for (const aug of augmented) {
264
+ if (aug.graphContext.nodes.length > 0) {
265
+ const entities = aug.graphContext.nodes.slice(0, 5).map((n) => ` - **${n.name}** (${n.type})`).join("\n");
266
+ const rels = aug.graphContext.edges.slice(0, 5).map((e) => ` - ${e.fromId} \u2014[${e.type}]\u2192 ${e.toId}`).join("\n");
267
+ const parts = [
268
+ `- **Graph Context** (${graph_hops} hop${graph_hops > 1 ? "s" : ""}):`
269
+ ];
270
+ if (entities) parts.push(` Entities:
271
+ ${entities}`);
272
+ if (rels) parts.push(` Relationships:
273
+ ${rels}`);
274
+ graphSections.set(aug.recordId, parts.join("\n"));
275
+ }
276
+ }
277
+ } catch (err) {
278
+ console.error("[KB] Graph augmentation failed (non-fatal):", err);
279
+ graphWarning = "> **Note:** Graph augmentation failed. Results shown without graph context.";
280
+ }
281
+ }
282
+ const formatted = results.map((r, i) => {
283
+ const rec = r.record;
284
+ const header = `### Result ${i + 1} (score: ${r.score.toFixed(3)})`;
285
+ const meta = [
286
+ `- **Source**: ${rec.sourcePath}`,
287
+ rec.headingPath ? `- **Section**: ${rec.headingPath}` : null,
288
+ `- **Type**: ${rec.contentType}`,
289
+ rec.startLine ? `- **Lines**: ${rec.startLine}-${rec.endLine}` : null,
290
+ rec.origin !== "indexed" ? `- **Origin**: ${rec.origin}` : null,
291
+ rec.category ? `- **Category**: ${rec.category}` : null,
292
+ rec.tags?.length ? `- **Tags**: ${rec.tags.join(", ")}` : null,
293
+ graphSections?.get(rec.id) ?? null
294
+ ].filter(Boolean).join("\n");
295
+ return `${header}
296
+ ${meta}
297
+
298
+ ${rec.content}`;
299
+ }).join("\n\n---\n\n");
300
+ const modeLabel = search_mode === "hybrid" ? "hybrid (vector + keyword RRF)" : search_mode === "keyword" ? "keyword (FTS)" : "semantic (vector)";
301
+ const distinctiveTerms = extractDistinctiveTerms(results, query);
302
+ const termsHint = distinctiveTerms.length > 0 ? `
303
+ _Distinctive terms: ${distinctiveTerms.map((t) => `\`${t}\``).join(", ")}_` : "";
304
+ return {
305
+ content: [
306
+ {
307
+ type: "text",
308
+ text: `${graphWarning ? `${graphWarning}
309
+
310
+ ` : ""}${formatted}
311
+
312
+ ---
313
+ _Search mode: ${modeLabel} | ${results.length} results_${termsHint}
314
+ _Next: Use \`lookup\` to see all chunks from a specific file, or \`analyze_structure\` to understand the codebase layout._`
315
+ }
316
+ ]
317
+ };
318
+ } catch (err) {
319
+ console.error("[KB] Search failed:", err);
320
+ return {
321
+ content: [{ type: "text", text: `Search failed: ${err.message}` }],
322
+ isError: true
323
+ };
324
+ }
325
+ }
326
+ );
327
+ }
328
+ export {
329
+ registerSearchTool
330
+ };
331
+ //# sourceMappingURL=search.tool.js.map
@@ -0,0 +1,4 @@
1
+ import type { IGraphStore, IKnowledgeStore } from '@kb/store';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ export declare function registerStatusTool(server: McpServer, store: IKnowledgeStore, graphStore?: IGraphStore): void;
4
+ //# sourceMappingURL=status.tool.d.ts.map
@@ -0,0 +1,68 @@
1
+ function registerStatusTool(server, store, graphStore) {
2
+ server.registerTool(
3
+ "status",
4
+ {
5
+ description: "Get the current status and statistics of the knowledge base index."
6
+ },
7
+ async () => {
8
+ try {
9
+ const stats = await store.getStats();
10
+ const paths = await store.listSourcePaths();
11
+ const text = [
12
+ "## Knowledge Base Status",
13
+ "",
14
+ `- **Total Records**: ${stats.totalRecords}`,
15
+ `- **Total Files**: ${stats.totalFiles}`,
16
+ `- **Last Indexed**: ${stats.lastIndexedAt ?? "Never"}`,
17
+ "",
18
+ "### Content Types",
19
+ ...Object.entries(stats.contentTypeBreakdown).map(
20
+ ([type, count]) => `- ${type}: ${count}`
21
+ ),
22
+ "",
23
+ "### Indexed Files",
24
+ ...paths.slice(0, 50).map((p) => `- ${p}`),
25
+ paths.length > 50 ? `
26
+ ... and ${paths.length - 50} more files` : ""
27
+ ];
28
+ if (graphStore) {
29
+ try {
30
+ const graphStats = await graphStore.getStats();
31
+ text.push(
32
+ "",
33
+ "### Knowledge Graph",
34
+ `- **Nodes**: ${graphStats.nodeCount}`,
35
+ `- **Edges**: ${graphStats.edgeCount}`,
36
+ ...Object.entries(graphStats.nodeTypes).map(
37
+ ([type, count]) => ` - ${type}: ${count}`
38
+ )
39
+ );
40
+ } catch {
41
+ text.push("", "### Knowledge Graph", "- Graph store unavailable");
42
+ }
43
+ }
44
+ const output = text.join("\n");
45
+ return {
46
+ content: [
47
+ {
48
+ type: "text",
49
+ text: output + "\n\n---\n_Next: Use `search` to query indexed content, `graph(stats)` to explore the knowledge graph, or `reindex` to refresh the index._"
50
+ }
51
+ ]
52
+ };
53
+ } catch (err) {
54
+ console.error("[KB] Status failed:", err);
55
+ return {
56
+ content: [
57
+ { type: "text", text: `Status check failed: ${err.message}` }
58
+ ],
59
+ isError: true
60
+ };
61
+ }
62
+ }
63
+ );
64
+ }
65
+ export {
66
+ registerStatusTool
67
+ };
68
+ //# sourceMappingURL=status.tool.js.map
@@ -0,0 +1,35 @@
1
+ /**
2
+ * MCP tool registrations for @kb/tools capabilities.
3
+ */
4
+ import type { IEmbedder } from '@kb/embeddings';
5
+ import type { IKnowledgeStore } from '@kb/store';
6
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ export declare function registerCompactTool(server: McpServer, embedder: IEmbedder): void;
8
+ export declare function registerScopeMapTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
9
+ export declare function registerFindTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
10
+ export declare function registerParseOutputTool(server: McpServer): void;
11
+ export declare function registerWorksetTool(server: McpServer): void;
12
+ export declare function registerCheckTool(server: McpServer): void;
13
+ export declare function registerBatchTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
14
+ export declare function registerSymbolTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
15
+ export declare function registerEvalTool(server: McpServer): void;
16
+ export declare function registerTestRunTool(server: McpServer): void;
17
+ export declare function registerStashTool(server: McpServer): void;
18
+ export declare function registerGitContextTool(server: McpServer): void;
19
+ export declare function registerDiffParseTool(server: McpServer): void;
20
+ export declare function registerRenameTool(server: McpServer): void;
21
+ export declare function registerCodemodTool(server: McpServer): void;
22
+ export declare function registerFileSummaryTool(server: McpServer): void;
23
+ export declare function registerCheckpointTool(server: McpServer): void;
24
+ export declare function registerDataTransformTool(server: McpServer): void;
25
+ export declare function registerTraceTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
26
+ export declare function registerFindExamplesTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
27
+ export declare function registerProcessTool(server: McpServer): void;
28
+ export declare function registerWatchTool(server: McpServer): void;
29
+ export declare function registerDeadSymbolsTool(server: McpServer, embedder: IEmbedder, store: IKnowledgeStore): void;
30
+ export declare function registerDelegateTool(server: McpServer): void;
31
+ export declare function registerLaneTool(server: McpServer): void;
32
+ export declare function registerHealthTool(server: McpServer): void;
33
+ export declare function registerQueueTool(server: McpServer): void;
34
+ export declare function registerWebFetchTool(server: McpServer): void;
35
+ //# sourceMappingURL=toolkit.tools.d.ts.map