@jafreck/lore 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +399 -199
  2. package/dist/cli.js +139 -18
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +7 -6
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +3 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/indexer/db.d.ts +12 -11
  9. package/dist/indexer/db.d.ts.map +1 -1
  10. package/dist/indexer/db.js +118 -18
  11. package/dist/indexer/db.js.map +1 -1
  12. package/dist/indexer/docs.d.ts +42 -0
  13. package/dist/indexer/docs.d.ts.map +1 -0
  14. package/dist/indexer/docs.js +214 -0
  15. package/dist/indexer/docs.js.map +1 -0
  16. package/dist/indexer/embedder.d.ts +7 -0
  17. package/dist/indexer/embedder.d.ts.map +1 -1
  18. package/dist/indexer/embedder.js +10 -0
  19. package/dist/indexer/embedder.js.map +1 -1
  20. package/dist/indexer/ensure-python-deps.d.ts +1 -1
  21. package/dist/indexer/ensure-python-deps.js +1 -1
  22. package/dist/indexer/extractors/types.d.ts +22 -0
  23. package/dist/indexer/extractors/types.d.ts.map +1 -1
  24. package/dist/indexer/extractors/types.js +12 -0
  25. package/dist/indexer/extractors/types.js.map +1 -1
  26. package/dist/indexer/extractors/typescript.d.ts +1 -1
  27. package/dist/indexer/extractors/typescript.d.ts.map +1 -1
  28. package/dist/indexer/extractors/typescript.js +38 -8
  29. package/dist/indexer/extractors/typescript.js.map +1 -1
  30. package/dist/indexer/git-history.d.ts.map +1 -1
  31. package/dist/indexer/git-history.js +4 -4
  32. package/dist/indexer/git-history.js.map +1 -1
  33. package/dist/indexer/git-hooks.d.ts +1 -0
  34. package/dist/indexer/git-hooks.d.ts.map +1 -1
  35. package/dist/indexer/git-hooks.js +3 -2
  36. package/dist/indexer/git-hooks.js.map +1 -1
  37. package/dist/indexer/index.d.ts +35 -9
  38. package/dist/indexer/index.d.ts.map +1 -1
  39. package/dist/indexer/index.js +470 -30
  40. package/dist/indexer/index.js.map +1 -1
  41. package/dist/indexer/lsp/client.d.ts +61 -0
  42. package/dist/indexer/lsp/client.d.ts.map +1 -0
  43. package/dist/indexer/lsp/client.js +217 -0
  44. package/dist/indexer/lsp/client.js.map +1 -0
  45. package/dist/indexer/lsp/config.d.ts +16 -0
  46. package/dist/indexer/lsp/config.d.ts.map +1 -0
  47. package/dist/indexer/lsp/config.js +78 -0
  48. package/dist/indexer/lsp/config.js.map +1 -0
  49. package/dist/indexer/lsp/enrichment.d.ts +55 -0
  50. package/dist/indexer/lsp/enrichment.d.ts.map +1 -0
  51. package/dist/indexer/lsp/enrichment.js +211 -0
  52. package/dist/indexer/lsp/enrichment.js.map +1 -0
  53. package/dist/indexer/lsp/registry.d.ts +19 -0
  54. package/dist/indexer/lsp/registry.d.ts.map +1 -0
  55. package/dist/indexer/lsp/registry.js +118 -0
  56. package/dist/indexer/lsp/registry.js.map +1 -0
  57. package/dist/indexer/parser.d.ts +7 -0
  58. package/dist/indexer/parser.d.ts.map +1 -1
  59. package/dist/indexer/parser.js +3 -1
  60. package/dist/indexer/parser.js.map +1 -1
  61. package/dist/indexer/poller.d.ts +8 -1
  62. package/dist/indexer/poller.d.ts.map +1 -1
  63. package/dist/indexer/poller.js +7 -1
  64. package/dist/indexer/poller.js.map +1 -1
  65. package/dist/indexer/walker.d.ts +22 -0
  66. package/dist/indexer/walker.d.ts.map +1 -1
  67. package/dist/indexer/walker.js +15 -0
  68. package/dist/indexer/walker.js.map +1 -1
  69. package/dist/indexer/watcher.d.ts +8 -1
  70. package/dist/indexer/watcher.d.ts.map +1 -1
  71. package/dist/indexer/watcher.js +7 -1
  72. package/dist/indexer/watcher.js.map +1 -1
  73. package/dist/{kb-server → lore-server}/db.d.ts +158 -4
  74. package/dist/lore-server/db.d.ts.map +1 -0
  75. package/dist/{kb-server → lore-server}/db.js +457 -26
  76. package/dist/lore-server/db.js.map +1 -0
  77. package/dist/lore-server/server.d.ts +43 -0
  78. package/dist/lore-server/server.d.ts.map +1 -0
  79. package/dist/lore-server/server.js +385 -0
  80. package/dist/lore-server/server.js.map +1 -0
  81. package/dist/{kb-server → lore-server}/tools/annotations.d.ts +2 -2
  82. package/dist/lore-server/tools/annotations.d.ts.map +1 -0
  83. package/dist/{kb-server → lore-server}/tools/annotations.js +2 -2
  84. package/dist/lore-server/tools/annotations.js.map +1 -0
  85. package/dist/{kb-server → lore-server}/tools/architecture.d.ts +9 -2
  86. package/dist/lore-server/tools/architecture.d.ts.map +1 -0
  87. package/dist/{kb-server → lore-server}/tools/architecture.js +37 -2
  88. package/dist/lore-server/tools/architecture.js.map +1 -0
  89. package/dist/lore-server/tools/blame.d.ts +159 -0
  90. package/dist/lore-server/tools/blame.d.ts.map +1 -0
  91. package/dist/lore-server/tools/blame.js +595 -0
  92. package/dist/lore-server/tools/blame.js.map +1 -0
  93. package/dist/{kb-server → lore-server}/tools/coverage.d.ts +2 -2
  94. package/dist/lore-server/tools/coverage.d.ts.map +1 -0
  95. package/dist/{kb-server → lore-server}/tools/coverage.js +2 -2
  96. package/dist/lore-server/tools/coverage.js.map +1 -0
  97. package/dist/lore-server/tools/docs.d.ts +86 -0
  98. package/dist/lore-server/tools/docs.d.ts.map +1 -0
  99. package/dist/lore-server/tools/docs.js +243 -0
  100. package/dist/lore-server/tools/docs.js.map +1 -0
  101. package/dist/{kb-server → lore-server}/tools/graph.d.ts +40 -3
  102. package/dist/lore-server/tools/graph.d.ts.map +1 -0
  103. package/dist/{kb-server → lore-server}/tools/graph.js +122 -11
  104. package/dist/lore-server/tools/graph.js.map +1 -0
  105. package/dist/{kb-server → lore-server}/tools/history.d.ts +13 -6
  106. package/dist/lore-server/tools/history.d.ts.map +1 -0
  107. package/dist/{kb-server → lore-server}/tools/history.js +43 -10
  108. package/dist/lore-server/tools/history.js.map +1 -0
  109. package/dist/lore-server/tools/lookup.d.ts +75 -0
  110. package/dist/lore-server/tools/lookup.d.ts.map +1 -0
  111. package/dist/lore-server/tools/lookup.js +148 -0
  112. package/dist/lore-server/tools/lookup.js.map +1 -0
  113. package/dist/{kb-server → lore-server}/tools/metrics.d.ts +3 -3
  114. package/dist/lore-server/tools/metrics.d.ts.map +1 -0
  115. package/dist/{kb-server → lore-server}/tools/metrics.js +3 -3
  116. package/dist/lore-server/tools/metrics.js.map +1 -0
  117. package/dist/{kb-server → lore-server}/tools/notes.d.ts +16 -16
  118. package/dist/lore-server/tools/notes.d.ts.map +1 -0
  119. package/dist/{kb-server → lore-server}/tools/notes.js +55 -20
  120. package/dist/lore-server/tools/notes.js.map +1 -0
  121. package/dist/{kb-server → lore-server}/tools/routes.d.ts +2 -2
  122. package/dist/lore-server/tools/routes.d.ts.map +1 -0
  123. package/dist/{kb-server → lore-server}/tools/routes.js +2 -2
  124. package/dist/lore-server/tools/routes.js.map +1 -0
  125. package/dist/{kb-server → lore-server}/tools/search.d.ts +57 -13
  126. package/dist/lore-server/tools/search.d.ts.map +1 -0
  127. package/dist/{kb-server → lore-server}/tools/search.js +123 -23
  128. package/dist/lore-server/tools/search.js.map +1 -0
  129. package/dist/{kb-server → lore-server}/tools/snippet.d.ts +20 -4
  130. package/dist/lore-server/tools/snippet.d.ts.map +1 -0
  131. package/dist/lore-server/tools/snippet.js +116 -0
  132. package/dist/lore-server/tools/snippet.js.map +1 -0
  133. package/dist/{kb-server → lore-server}/tools/test-map.d.ts +2 -2
  134. package/dist/lore-server/tools/test-map.d.ts.map +1 -0
  135. package/dist/{kb-server → lore-server}/tools/test-map.js +2 -2
  136. package/dist/lore-server/tools/test-map.js.map +1 -0
  137. package/dist/{kb-server → lore-server}/tools/writeback.d.ts +2 -2
  138. package/dist/lore-server/tools/writeback.d.ts.map +1 -0
  139. package/dist/{kb-server → lore-server}/tools/writeback.js +3 -3
  140. package/dist/lore-server/tools/writeback.js.map +1 -0
  141. package/package.json +14 -14
  142. package/dist/kb-server/db.d.ts.map +0 -1
  143. package/dist/kb-server/db.js.map +0 -1
  144. package/dist/kb-server/server.d.ts +0 -42
  145. package/dist/kb-server/server.d.ts.map +0 -1
  146. package/dist/kb-server/server.js +0 -241
  147. package/dist/kb-server/server.js.map +0 -1
  148. package/dist/kb-server/tools/annotations.d.ts.map +0 -1
  149. package/dist/kb-server/tools/annotations.js.map +0 -1
  150. package/dist/kb-server/tools/architecture.d.ts.map +0 -1
  151. package/dist/kb-server/tools/architecture.js.map +0 -1
  152. package/dist/kb-server/tools/blame.d.ts +0 -67
  153. package/dist/kb-server/tools/blame.d.ts.map +0 -1
  154. package/dist/kb-server/tools/blame.js +0 -162
  155. package/dist/kb-server/tools/blame.js.map +0 -1
  156. package/dist/kb-server/tools/coverage.d.ts.map +0 -1
  157. package/dist/kb-server/tools/coverage.js.map +0 -1
  158. package/dist/kb-server/tools/graph.d.ts.map +0 -1
  159. package/dist/kb-server/tools/graph.js.map +0 -1
  160. package/dist/kb-server/tools/history.d.ts.map +0 -1
  161. package/dist/kb-server/tools/history.js.map +0 -1
  162. package/dist/kb-server/tools/lookup.d.ts +0 -36
  163. package/dist/kb-server/tools/lookup.d.ts.map +0 -1
  164. package/dist/kb-server/tools/lookup.js +0 -45
  165. package/dist/kb-server/tools/lookup.js.map +0 -1
  166. package/dist/kb-server/tools/metrics.d.ts.map +0 -1
  167. package/dist/kb-server/tools/metrics.js.map +0 -1
  168. package/dist/kb-server/tools/notes.d.ts.map +0 -1
  169. package/dist/kb-server/tools/notes.js.map +0 -1
  170. package/dist/kb-server/tools/routes.d.ts.map +0 -1
  171. package/dist/kb-server/tools/routes.js.map +0 -1
  172. package/dist/kb-server/tools/search.d.ts.map +0 -1
  173. package/dist/kb-server/tools/search.js.map +0 -1
  174. package/dist/kb-server/tools/snippet.d.ts.map +0 -1
  175. package/dist/kb-server/tools/snippet.js +0 -49
  176. package/dist/kb-server/tools/snippet.js.map +0 -1
  177. package/dist/kb-server/tools/test-map.d.ts.map +0 -1
  178. package/dist/kb-server/tools/test-map.js.map +0 -1
  179. package/dist/kb-server/tools/writeback.d.ts.map +0 -1
  180. package/dist/kb-server/tools/writeback.js.map +0 -1
@@ -1,16 +1,16 @@
1
1
  /**
2
- * @module kb-server/tools/notes
2
+ * @module lore-server/tools/notes
3
3
  *
4
4
  * MCP tools:
5
- * - kb_notes_write: upsert notes by (key, scope)
6
- * - kb_notes_read: retrieve notes with staleness/recency metadata
5
+ * - lore_notes_write: upsert notes by (key, scope)
6
+ * - lore_notes_read: retrieve notes with staleness/recency metadata
7
7
  */
8
8
  import Database from 'better-sqlite3';
9
9
  const DEFAULT_SCOPE = 'global';
10
10
  const DEFAULT_LIMIT = 20;
11
11
  const MAX_LIMIT = 200;
12
- export const kbNotesWriteToolDef = {
13
- name: 'kb_notes_write',
12
+ export const loreNotesWriteToolDef = {
13
+ name: 'lore_notes_write',
14
14
  description: 'Upsert an LLM-authored note in the knowledge base by key and scope. ' +
15
15
  'Defaults scope to "global" and updates updated_at on existing notes.',
16
16
  inputSchema: {
@@ -31,8 +31,8 @@ export const kbNotesWriteToolDef = {
31
31
  required: ['key', 'content'],
32
32
  },
33
33
  };
34
- export const kbNotesReadToolDef = {
35
- name: 'kb_notes_read',
34
+ export const loreNotesReadToolDef = {
35
+ name: 'lore_notes_read',
36
36
  description: 'Read notes by exact key and/or key prefix, optionally filtered by scope. ' +
37
37
  'Returns staleness metadata for file-scoped notes and recency metadata for global notes.',
38
38
  inputSchema: {
@@ -55,7 +55,19 @@ function clampLimit(limit) {
55
55
  return DEFAULT_LIMIT;
56
56
  return Math.min(Math.max(1, Math.floor(limit)), MAX_LIMIT);
57
57
  }
58
- export function kbNotesWriteHandler(dbPath, args) {
58
+ function parseDocScope(scope) {
59
+ if (!scope.startsWith('doc:'))
60
+ return null;
61
+ const encoded = scope.slice('doc:'.length);
62
+ const branchSeparator = encoded.lastIndexOf('@');
63
+ if (branchSeparator <= 0)
64
+ return null;
65
+ return {
66
+ path: encoded.slice(0, branchSeparator),
67
+ branch: encoded.slice(branchSeparator + 1),
68
+ };
69
+ }
70
+ export function loreNotesWriteHandler(dbPath, args) {
59
71
  const db = new Database(dbPath);
60
72
  try {
61
73
  db.pragma('foreign_keys = ON');
@@ -83,7 +95,7 @@ export function kbNotesWriteHandler(dbPath, args) {
83
95
  db.close();
84
96
  }
85
97
  }
86
- export function kbNotesReadHandler(db, args) {
98
+ export function loreNotesReadHandler(db, args) {
87
99
  const limit = clampLimit(args.limit);
88
100
  const where = [];
89
101
  const params = [];
@@ -110,16 +122,39 @@ export function kbNotesReadHandler(db, args) {
110
122
  ORDER BY updated_at DESC, id DESC
111
123
  LIMIT ?`)
112
124
  .all(...params, limit);
113
- const kbIndexedAtRow = db
125
+ const loreIndexedAtRow = db
114
126
  .prepare('SELECT MAX(indexed_at) AS indexed_at FROM files')
115
127
  .get();
116
- const kbIndexedAt = kbIndexedAtRow.indexed_at;
128
+ const loreIndexedAt = loreIndexedAtRow.indexed_at;
117
129
  const getFileRecency = db.prepare(`SELECT last_hash, indexed_at
118
130
  FROM files
119
131
  WHERE path = ?
120
132
  ORDER BY indexed_at DESC
121
133
  LIMIT 1`);
134
+ const getDocRecency = db.prepare(`SELECT content_hash, indexed_at
135
+ FROM docs
136
+ WHERE path = ? AND branch = ?
137
+ ORDER BY indexed_at DESC
138
+ LIMIT 1`);
122
139
  const notes = rows.map((row) => {
140
+ const docScope = parseDocScope(row.scope);
141
+ if (docScope) {
142
+ const docRow = getDocRecency.get(docScope.path, docScope.branch);
143
+ const stale = !docRow || (row.source_hash != null && row.source_hash !== docRow.content_hash);
144
+ const staleReason = !docRow
145
+ ? 'doc_missing'
146
+ : stale
147
+ ? 'source_hash_mismatch'
148
+ : null;
149
+ return {
150
+ ...row,
151
+ stale,
152
+ stale_reason: staleReason,
153
+ file_last_hash: null,
154
+ file_indexed_at: null,
155
+ lore_indexed_at: null,
156
+ };
157
+ }
123
158
  if (row.scope.startsWith('file:')) {
124
159
  const filePath = row.scope.slice('file:'.length);
125
160
  const fileRow = getFileRecency.get(filePath);
@@ -143,18 +178,18 @@ export function kbNotesReadHandler(db, args) {
143
178
  stale_reason: staleReason,
144
179
  file_last_hash: fileRow?.last_hash ?? null,
145
180
  file_indexed_at: fileRow?.indexed_at ?? null,
146
- kb_indexed_at: null,
181
+ lore_indexed_at: null,
147
182
  };
148
183
  }
149
184
  if (row.scope === DEFAULT_SCOPE) {
150
- const stale = kbIndexedAt != null ? row.updated_at < kbIndexedAt : false;
185
+ const stale = loreIndexedAt != null ? row.updated_at < loreIndexedAt : false;
151
186
  return {
152
187
  ...row,
153
188
  stale,
154
- stale_reason: stale ? 'kb_reindexed_since_note' : null,
189
+ stale_reason: stale ? 'lore_reindexed_since_note' : null,
155
190
  file_last_hash: null,
156
191
  file_indexed_at: null,
157
- kb_indexed_at: kbIndexedAt,
192
+ lore_indexed_at: loreIndexedAt,
158
193
  };
159
194
  }
160
195
  return {
@@ -163,13 +198,13 @@ export function kbNotesReadHandler(db, args) {
163
198
  stale_reason: null,
164
199
  file_last_hash: null,
165
200
  file_indexed_at: null,
166
- kb_indexed_at: null,
201
+ lore_indexed_at: null,
167
202
  };
168
203
  });
169
204
  return { notes, count: notes.length };
170
205
  }
171
- export const writeToolDef = kbNotesWriteToolDef;
172
- export const readToolDef = kbNotesReadToolDef;
173
- export const writeHandler = kbNotesWriteHandler;
174
- export const readHandler = kbNotesReadHandler;
206
+ export const writeToolDef = loreNotesWriteToolDef;
207
+ export const readToolDef = loreNotesReadToolDef;
208
+ export const writeHandler = loreNotesWriteHandler;
209
+ export const readHandler = loreNotesReadHandler;
175
210
  //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../../../src/lore-server/tools/notes.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  /**
2
- * @module kb-server/tools/routes
2
+ * @module lore-server/tools/routes
3
3
  *
4
4
  * MCP tool: query extracted API routes/endpoints.
5
5
  */
6
6
  import type { Database } from '../db.js';
7
7
  import { type ApiRouteRow } from '../db.js';
8
8
  export declare const toolDef: {
9
- readonly name: "kb_routes";
9
+ readonly name: "lore_routes";
10
10
  readonly description: string;
11
11
  readonly inputSchema: {
12
12
  readonly type: "object";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;CAsBV,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,CAQ7E"}
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @module kb-server/tools/routes
2
+ * @module lore-server/tools/routes
3
3
  *
4
4
  * MCP tool: query extracted API routes/endpoints.
5
5
  */
6
6
  import { listApiRoutes } from '../db.js';
7
7
  export const toolDef = {
8
- name: 'kb_routes',
8
+ name: 'lore_routes',
9
9
  description: 'Query extracted API routes/endpoints from the knowledge-base index. ' +
10
10
  'Optional filters: `method`, `path_prefix`, and `framework`.',
11
11
  inputSchema: {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/lore-server/tools/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AAE3D,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,sEAAsE;QACtE,6DAA6D;IAC/D,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sDAAsD;aACpE;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gEAAgE;aAC9E;SACF;KACF;CACO,CAAC;AAYX,MAAM,UAAU,OAAO,CAAC,EAAqB,EAAE,IAAgB;IAC7D,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @module kb-server/tools/search
2
+ * @module lore-server/tools/search
3
3
  *
4
4
  * MCP tool: multi-modal knowledge-base search.
5
5
  *
@@ -14,7 +14,7 @@
14
14
  import type { Database } from '../db.js';
15
15
  import type { EmbeddingProvider } from '../../indexer/embedder.js';
16
16
  /**
17
- * Observation emitted after every `kb_search` invocation.
17
+ * Observation emitted after every `lore_search` invocation.
18
18
  * Consumers can use this to log, collect metrics, or detect search-quality issues.
19
19
  */
20
20
  export interface SearchObservation {
@@ -38,7 +38,7 @@ export interface SearchObservation {
38
38
  /** Callback invoked after each search completes. Fire-and-forget — errors are swallowed. */
39
39
  export type SearchObserver = (observation: SearchObservation) => void;
40
40
  export declare const toolDef: {
41
- readonly name: "kb_search";
41
+ readonly name: "lore_search";
42
42
  readonly description: string;
43
43
  readonly inputSchema: {
44
44
  readonly type: "object";
@@ -56,6 +56,26 @@ export declare const toolDef: {
56
56
  readonly type: "number";
57
57
  readonly description: "Maximum number of results to return (default 20).";
58
58
  };
59
+ readonly path_prefix: {
60
+ readonly type: "string";
61
+ readonly description: "Optional source file path prefix filter for symbol results.";
62
+ };
63
+ readonly language: {
64
+ readonly type: "string";
65
+ readonly description: "Optional source language filter for symbol results.";
66
+ };
67
+ readonly kind: {
68
+ readonly type: "string";
69
+ readonly description: "Optional symbol kind filter for symbol results.";
70
+ };
71
+ readonly doc_path_prefix: {
72
+ readonly type: "string";
73
+ readonly description: "Optional documentation path prefix filter for semantic/fused doc-section results.";
74
+ };
75
+ readonly doc_kind: {
76
+ readonly type: "string";
77
+ readonly description: "Optional documentation kind filter for semantic/fused doc-section results.";
78
+ };
59
79
  };
60
80
  readonly required: readonly ["query"];
61
81
  };
@@ -65,20 +85,44 @@ export interface SearchArgs {
65
85
  mode?: 'structural' | 'semantic' | 'fused';
66
86
  limit?: number;
67
87
  branch?: string;
88
+ path_prefix?: string;
89
+ language?: string;
90
+ kind?: string;
91
+ doc_path_prefix?: string;
92
+ doc_kind?: string;
68
93
  }
69
94
  export interface SearchResult {
70
- results: Array<{
71
- symbol_id: number;
72
- name: string;
73
- kind: string;
74
- file_path: string;
75
- start_line: number;
76
- end_line: number;
77
- score: number;
78
- branch: string;
79
- }>;
95
+ results: SearchResultItem[];
80
96
  mode_used: string;
81
97
  }
98
+ export interface SearchSymbolResult {
99
+ result_type: 'symbol';
100
+ symbol_id: number;
101
+ name: string;
102
+ kind: string;
103
+ file_path: string;
104
+ start_line: number;
105
+ end_line: number;
106
+ score: number;
107
+ branch: string;
108
+ }
109
+ export interface SearchDocSectionResult {
110
+ result_type: 'doc_section';
111
+ doc_section_id: number;
112
+ doc_id: number;
113
+ doc_kind: string;
114
+ doc_title: string;
115
+ section_index: number;
116
+ heading_path: string;
117
+ name: string;
118
+ kind: string;
119
+ file_path: string;
120
+ start_line: number;
121
+ end_line: number;
122
+ score: number;
123
+ branch: string;
124
+ }
125
+ export type SearchResultItem = SearchSymbolResult | SearchDocSectionResult;
82
126
  /** Execute a knowledge-base search in the requested mode. */
83
127
  export declare function handler(db: Database.Database, args: SearchArgs, embedder?: EmbeddingProvider, observer?: SearchObserver): Promise<SearchResult>;
84
128
  //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAKnE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,aAAa,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IACnD,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,4FAA4F;AAC5F,MAAM,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAItE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CV,CAAC;AAIX,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,QAAQ,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,aAAa,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAmO3E,6DAA6D;AAC7D,wBAAsB,OAAO,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,YAAY,CAAC,CAgDvB"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @module kb-server/tools/search
2
+ * @module lore-server/tools/search
3
3
  *
4
4
  * MCP tool: multi-modal knowledge-base search.
5
5
  *
@@ -11,9 +11,10 @@
11
11
  * Semantic and fused modes fall back to structural-only when no EmbeddingProvider
12
12
  * is supplied, clearly indicating the degradation in `mode_used`.
13
13
  */
14
+ import { semanticSearchDocSections } from '../db.js';
14
15
  // ─── Tool definition ──────────────────────────────────────────────────────────
15
16
  export const toolDef = {
16
- name: 'kb_search',
17
+ name: 'lore_search',
17
18
  description: 'Search the knowledge-base index for symbols matching a natural-language or code query. ' +
18
19
  'mode="structural" uses BM25 FTS5 (fast, exact-ish). ' +
19
20
  'mode="semantic" uses cosine similarity over embedding vectors (requires indexed embeddings). ' +
@@ -34,6 +35,26 @@ export const toolDef = {
34
35
  type: 'number',
35
36
  description: 'Maximum number of results to return (default 20).',
36
37
  },
38
+ path_prefix: {
39
+ type: 'string',
40
+ description: 'Optional source file path prefix filter for symbol results.',
41
+ },
42
+ language: {
43
+ type: 'string',
44
+ description: 'Optional source language filter for symbol results.',
45
+ },
46
+ kind: {
47
+ type: 'string',
48
+ description: 'Optional symbol kind filter for symbol results.',
49
+ },
50
+ doc_path_prefix: {
51
+ type: 'string',
52
+ description: 'Optional documentation path prefix filter for semantic/fused doc-section results.',
53
+ },
54
+ doc_kind: {
55
+ type: 'string',
56
+ description: 'Optional documentation kind filter for semantic/fused doc-section results.',
57
+ },
37
58
  },
38
59
  required: ['query'],
39
60
  },
@@ -50,13 +71,33 @@ function sanitizeFts5Query(query) {
50
71
  // Escape interior double-quotes, then wrap in double-quotes for a phrase query.
51
72
  return `"${query.replace(/"/g, '""')}"`;
52
73
  }
74
+ function symbolEnrichmentProjection(db) {
75
+ let columns = new Set();
76
+ try {
77
+ const rows = db.prepare('PRAGMA table_info(symbols)').all();
78
+ columns = new Set(rows.map((row) => row.name));
79
+ }
80
+ catch {
81
+ columns = new Set();
82
+ }
83
+ const column = (name) => (columns.has(name) ? `s.${name} AS ${name}` : `NULL AS ${name}`);
84
+ return [
85
+ column('resolved_type_signature'),
86
+ column('resolved_return_type'),
87
+ column('definition_uri'),
88
+ column('definition_path'),
89
+ ].join(',\n ');
90
+ }
53
91
  /** Run a structural BM25 FTS5 search and return ranked rows. */
54
92
  function structuralSearch(db, query, limit, branch) {
55
93
  const safeQuery = sanitizeFts5Query(query);
56
94
  const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
95
+ const enrichmentProjection = symbolEnrichmentProjection(db);
57
96
  try {
58
- const sql = `SELECT s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
97
+ const sql = `SELECT 'symbol' AS result_type,
98
+ s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
59
99
  s.start_line, s.end_line,
100
+ ${enrichmentProjection},
60
101
  bm25(symbols_fts) AS score,
61
102
  f.branch AS branch
62
103
  FROM symbols_fts
@@ -64,7 +105,7 @@ function structuralSearch(db, query, limit, branch) {
64
105
  JOIN files f ON f.id = s.file_id
65
106
  WHERE symbols_fts MATCH ?${branchClause}
66
107
  ORDER BY score
67
- LIMIT ?`;
108
+ LIMIT ?`;
68
109
  const params = branch !== undefined ? [safeQuery, branch, limit] : [safeQuery, limit];
69
110
  const rows = db.prepare(sql).all(...params);
70
111
  return rows;
@@ -72,18 +113,85 @@ function structuralSearch(db, query, limit, branch) {
72
113
  catch {
73
114
  // FTS5 parse error — fall back to LIKE-based search.
74
115
  const likeQuery = `%${query}%`;
75
- const sql = `SELECT s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
116
+ const sql = `SELECT 'symbol' AS result_type,
117
+ s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
76
118
  s.start_line, s.end_line,
119
+ ${enrichmentProjection},
77
120
  0.0 AS score,
78
121
  f.branch AS branch
79
122
  FROM symbols s
80
123
  JOIN files f ON f.id = s.file_id
81
124
  WHERE s.name LIKE ?${branchClause}
82
- LIMIT ?`;
125
+ LIMIT ?`;
83
126
  const params = branch !== undefined ? [likeQuery, branch, limit] : [likeQuery, limit];
84
127
  return db.prepare(sql).all(...params);
85
128
  }
86
129
  }
130
+ function hasVirtualTable(db, name) {
131
+ const row = db
132
+ .prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = ? LIMIT 1")
133
+ .get(name);
134
+ return row?.present === 1;
135
+ }
136
+ function semanticSymbolSearch(db, queryVector, limit, branch) {
137
+ if (!hasVirtualTable(db, 'symbol_embeddings')) {
138
+ return [];
139
+ }
140
+ const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
141
+ const enrichment = symbolEnrichmentProjection(db);
142
+ const sql = `SELECT 'symbol' AS result_type,
143
+ s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
144
+ s.start_line, s.end_line,
145
+ ${enrichment},
146
+ distance AS score,
147
+ f.branch AS branch
148
+ FROM symbol_embeddings
149
+ JOIN symbols s ON s.rowid = symbol_embeddings.rowid
150
+ JOIN files f ON f.id = s.file_id
151
+ WHERE embedding MATCH ?${branchClause}
152
+ ORDER BY distance
153
+ LIMIT ?`;
154
+ const params = branch !== undefined
155
+ ? [JSON.stringify(queryVector), branch, limit]
156
+ : [JSON.stringify(queryVector), limit];
157
+ try {
158
+ return db.prepare(sql).all(...params);
159
+ }
160
+ catch {
161
+ return [];
162
+ }
163
+ }
164
+ function semanticDocSectionSearch(db, queryVector, limit, branch) {
165
+ if (!hasVirtualTable(db, 'doc_section_embeddings')) {
166
+ return [];
167
+ }
168
+ try {
169
+ const rows = semanticSearchDocSections(db, {
170
+ queryVector,
171
+ branch,
172
+ limit,
173
+ });
174
+ return rows.map((row) => ({
175
+ result_type: 'doc_section',
176
+ doc_section_id: row.id,
177
+ doc_id: row.doc_id,
178
+ doc_kind: row.doc_kind,
179
+ doc_title: row.doc_title,
180
+ section_index: row.section_index,
181
+ heading_path: row.heading_path,
182
+ name: row.title || row.doc_title,
183
+ kind: 'doc_section',
184
+ file_path: row.doc_path,
185
+ start_line: row.line_start,
186
+ end_line: row.line_end,
187
+ score: row.score,
188
+ branch: row.doc_branch,
189
+ }));
190
+ }
191
+ catch {
192
+ return [];
193
+ }
194
+ }
87
195
  /**
88
196
  * Attempt a semantic (cosine) search via the vec0 virtual table.
89
197
  * Returns `null` when no embedder is available or the table has no rows.
@@ -93,21 +201,11 @@ async function semanticSearch(db, query, limit, embedder, branch) {
93
201
  const [queryVec] = await embedder.embed([query]);
94
202
  if (!queryVec)
95
203
  return null;
96
- const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
97
- const sql = `SELECT s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
98
- s.start_line, s.end_line,
99
- distance AS score,
100
- f.branch AS branch
101
- FROM symbol_embeddings
102
- JOIN symbols s ON s.rowid = symbol_embeddings.rowid
103
- JOIN files f ON f.id = s.file_id
104
- WHERE embedding MATCH ?${branchClause}
105
- ORDER BY distance
106
- LIMIT ?`;
107
- const params = branch !== undefined
108
- ? [JSON.stringify(queryVec), branch, limit]
109
- : [JSON.stringify(queryVec), limit];
110
- const rows = db.prepare(sql).all(...params);
204
+ const symbolRows = semanticSymbolSearch(db, queryVec, limit, branch);
205
+ const docRows = semanticDocSectionSearch(db, queryVec, limit, branch);
206
+ const rows = [...symbolRows, ...docRows]
207
+ .sort((a, b) => a.score - b.score)
208
+ .slice(0, limit);
111
209
  return rows.length > 0 ? rows : null;
112
210
  }
113
211
  catch {
@@ -123,15 +221,17 @@ async function semanticSearch(db, query, limit, embedder, branch) {
123
221
  function rrfFuse(structural, semantic, limit) {
124
222
  const k = 60;
125
223
  const scores = new Map();
224
+ const resultKey = (item) => item.result_type === 'symbol' ? `symbol:${item.symbol_id}` : `doc:${item.doc_section_id}`;
126
225
  const addList = (list) => {
127
226
  list.forEach((item, idx) => {
128
- const existing = scores.get(item.symbol_id);
227
+ const key = resultKey(item);
228
+ const existing = scores.get(key);
129
229
  const contrib = 1 / (k + idx + 1);
130
230
  if (existing) {
131
231
  existing.score += contrib;
132
232
  }
133
233
  else {
134
- scores.set(item.symbol_id, { item, score: contrib });
234
+ scores.set(key, { item, score: contrib });
135
235
  }
136
236
  });
137
237
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/lore-server/tools/search.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  /**
2
- * @module kb-server/tools/snippet
2
+ * @module lore-server/tools/snippet
3
3
  *
4
4
  * MCP tool: extract source-code snippets for a given file path and
5
- * optional line range directly from the filesystem.
5
+ * optional line range directly from indexed source snapshots.
6
6
  */
7
7
  import type { Database } from '../db.js';
8
8
  export declare const toolDef: {
9
- readonly name: "kb_snippet";
9
+ readonly name: "lore_snippet";
10
10
  readonly description: string;
11
11
  readonly inputSchema: {
12
12
  readonly type: "object";
@@ -23,6 +23,14 @@ export declare const toolDef: {
23
23
  readonly type: "number";
24
24
  readonly description: "Last line to include (1-based, inclusive). Defaults to end-of-file.";
25
25
  };
26
+ readonly symbol: {
27
+ readonly type: "string";
28
+ readonly description: "Optional symbol name to resolve snippet bounds from indexed symbol metadata.";
29
+ };
30
+ readonly branch: {
31
+ readonly type: "string";
32
+ readonly description: "Optional branch to disambiguate the file path.";
33
+ };
26
34
  };
27
35
  readonly required: readonly ["path"];
28
36
  };
@@ -31,14 +39,22 @@ export interface SnippetArgs {
31
39
  path: string;
32
40
  start_line?: number;
33
41
  end_line?: number;
42
+ symbol?: string;
34
43
  branch?: string;
35
44
  }
45
+ export interface SnippetContainingSymbol {
46
+ name: string;
47
+ kind: string;
48
+ start_line: number;
49
+ end_line: number;
50
+ }
36
51
  export interface SnippetResult {
37
52
  path: string;
38
53
  start_line: number;
39
54
  end_line: number;
40
55
  text: string;
56
+ containing_symbol?: SnippetContainingSymbol;
41
57
  }
42
- /** Read source lines from the filesystem for the given indexed file path. */
58
+ /** Read source lines from indexed source snapshots for the given indexed file path. */
43
59
  export declare function handler(db: Database.Database, args: SnippetArgs): SnippetResult;
44
60
  //# sourceMappingURL=snippet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippet.d.ts","sourceRoot":"","sources":["../../../src/lore-server/tools/snippet.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCV,CAAC;AAIX,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C;AA+DD,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,aAAa,CA6C/E"}