@jafreck/lore 0.1.0 → 0.2.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 (93) hide show
  1. package/README.md +345 -196
  2. package/dist/cli.js +133 -12
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +3 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/indexer/db.d.ts.map +1 -1
  8. package/dist/indexer/db.js +96 -2
  9. package/dist/indexer/db.js.map +1 -1
  10. package/dist/indexer/docs.d.ts +42 -0
  11. package/dist/indexer/docs.d.ts.map +1 -0
  12. package/dist/indexer/docs.js +214 -0
  13. package/dist/indexer/docs.js.map +1 -0
  14. package/dist/indexer/embedder.d.ts +7 -0
  15. package/dist/indexer/embedder.d.ts.map +1 -1
  16. package/dist/indexer/embedder.js +10 -0
  17. package/dist/indexer/embedder.js.map +1 -1
  18. package/dist/indexer/extractors/types.d.ts +22 -0
  19. package/dist/indexer/extractors/types.d.ts.map +1 -1
  20. package/dist/indexer/extractors/types.js +12 -0
  21. package/dist/indexer/extractors/types.js.map +1 -1
  22. package/dist/indexer/extractors/typescript.d.ts +1 -1
  23. package/dist/indexer/extractors/typescript.d.ts.map +1 -1
  24. package/dist/indexer/extractors/typescript.js +38 -8
  25. package/dist/indexer/extractors/typescript.js.map +1 -1
  26. package/dist/indexer/git-hooks.d.ts +1 -0
  27. package/dist/indexer/git-hooks.d.ts.map +1 -1
  28. package/dist/indexer/git-hooks.js +3 -2
  29. package/dist/indexer/git-hooks.js.map +1 -1
  30. package/dist/indexer/index.d.ts +32 -7
  31. package/dist/indexer/index.d.ts.map +1 -1
  32. package/dist/indexer/index.js +427 -15
  33. package/dist/indexer/index.js.map +1 -1
  34. package/dist/indexer/lsp/client.d.ts +61 -0
  35. package/dist/indexer/lsp/client.d.ts.map +1 -0
  36. package/dist/indexer/lsp/client.js +217 -0
  37. package/dist/indexer/lsp/client.js.map +1 -0
  38. package/dist/indexer/lsp/config.d.ts +16 -0
  39. package/dist/indexer/lsp/config.d.ts.map +1 -0
  40. package/dist/indexer/lsp/config.js +78 -0
  41. package/dist/indexer/lsp/config.js.map +1 -0
  42. package/dist/indexer/lsp/enrichment.d.ts +55 -0
  43. package/dist/indexer/lsp/enrichment.d.ts.map +1 -0
  44. package/dist/indexer/lsp/enrichment.js +211 -0
  45. package/dist/indexer/lsp/enrichment.js.map +1 -0
  46. package/dist/indexer/lsp/registry.d.ts +19 -0
  47. package/dist/indexer/lsp/registry.d.ts.map +1 -0
  48. package/dist/indexer/lsp/registry.js +118 -0
  49. package/dist/indexer/lsp/registry.js.map +1 -0
  50. package/dist/indexer/parser.d.ts +7 -0
  51. package/dist/indexer/parser.d.ts.map +1 -1
  52. package/dist/indexer/parser.js +3 -1
  53. package/dist/indexer/parser.js.map +1 -1
  54. package/dist/indexer/poller.d.ts +7 -0
  55. package/dist/indexer/poller.d.ts.map +1 -1
  56. package/dist/indexer/poller.js +6 -0
  57. package/dist/indexer/poller.js.map +1 -1
  58. package/dist/indexer/walker.d.ts +22 -0
  59. package/dist/indexer/walker.d.ts.map +1 -1
  60. package/dist/indexer/walker.js +15 -0
  61. package/dist/indexer/walker.js.map +1 -1
  62. package/dist/indexer/watcher.d.ts +7 -0
  63. package/dist/indexer/watcher.d.ts.map +1 -1
  64. package/dist/indexer/watcher.js +6 -0
  65. package/dist/indexer/watcher.js.map +1 -1
  66. package/dist/kb-server/db.d.ts +82 -0
  67. package/dist/kb-server/db.d.ts.map +1 -1
  68. package/dist/kb-server/db.js +239 -0
  69. package/dist/kb-server/db.js.map +1 -1
  70. package/dist/kb-server/server.d.ts +11 -3
  71. package/dist/kb-server/server.d.ts.map +1 -1
  72. package/dist/kb-server/server.js +28 -6
  73. package/dist/kb-server/server.js.map +1 -1
  74. package/dist/kb-server/tools/architecture.d.ts +7 -0
  75. package/dist/kb-server/tools/architecture.d.ts.map +1 -1
  76. package/dist/kb-server/tools/architecture.js +35 -0
  77. package/dist/kb-server/tools/architecture.js.map +1 -1
  78. package/dist/kb-server/tools/docs.d.ts +78 -0
  79. package/dist/kb-server/tools/docs.d.ts.map +1 -0
  80. package/dist/kb-server/tools/docs.js +136 -0
  81. package/dist/kb-server/tools/docs.js.map +1 -0
  82. package/dist/kb-server/tools/lookup.d.ts.map +1 -1
  83. package/dist/kb-server/tools/lookup.js +5 -4
  84. package/dist/kb-server/tools/lookup.js.map +1 -1
  85. package/dist/kb-server/tools/notes.d.ts +1 -1
  86. package/dist/kb-server/tools/notes.d.ts.map +1 -1
  87. package/dist/kb-server/tools/notes.js +35 -0
  88. package/dist/kb-server/tools/notes.js.map +1 -1
  89. package/dist/kb-server/tools/search.d.ts +54 -11
  90. package/dist/kb-server/tools/search.d.ts.map +1 -1
  91. package/dist/kb-server/tools/search.js +138 -34
  92. package/dist/kb-server/tools/search.js.map +1 -1
  93. package/package.json +16 -7
@@ -13,6 +13,30 @@
13
13
  */
14
14
  import type { Database } from '../db.js';
15
15
  import type { EmbeddingProvider } from '../../indexer/embedder.js';
16
+ /**
17
+ * Observation emitted after every `kb_search` invocation.
18
+ * Consumers can use this to log, collect metrics, or detect search-quality issues.
19
+ */
20
+ export interface SearchObservation {
21
+ /** ISO-8601 timestamp when the search completed. */
22
+ timestamp: string;
23
+ /** The raw query string sent by the caller. */
24
+ query: string;
25
+ /** The mode the caller requested (defaults to 'structural'). */
26
+ requestedMode: 'structural' | 'semantic' | 'fused';
27
+ /** The mode that was actually used (may differ due to fallback). */
28
+ modeUsed: string;
29
+ /** Number of results returned. */
30
+ resultCount: number;
31
+ /** Best (lowest distance / highest BM25) score among results, or `null` if empty. */
32
+ topScore: number | null;
33
+ /** Wall-clock milliseconds for the entire handler call. */
34
+ latencyMs: number;
35
+ /** Branch filter applied, if any. */
36
+ branch?: string;
37
+ }
38
+ /** Callback invoked after each search completes. Fire-and-forget — errors are swallowed. */
39
+ export type SearchObserver = (observation: SearchObservation) => void;
16
40
  export declare const toolDef: {
17
41
  readonly name: "kb_search";
18
42
  readonly description: string;
@@ -43,18 +67,37 @@ export interface SearchArgs {
43
67
  branch?: string;
44
68
  }
45
69
  export interface SearchResult {
46
- results: Array<{
47
- symbol_id: number;
48
- name: string;
49
- kind: string;
50
- file_path: string;
51
- start_line: number;
52
- end_line: number;
53
- score: number;
54
- branch: string;
55
- }>;
70
+ results: SearchResultItem[];
56
71
  mode_used: string;
57
72
  }
73
+ export interface SearchSymbolResult {
74
+ result_type: 'symbol';
75
+ symbol_id: number;
76
+ name: string;
77
+ kind: string;
78
+ file_path: string;
79
+ start_line: number;
80
+ end_line: number;
81
+ score: number;
82
+ branch: string;
83
+ }
84
+ export interface SearchDocSectionResult {
85
+ result_type: 'doc_section';
86
+ doc_section_id: number;
87
+ doc_id: number;
88
+ doc_kind: string;
89
+ doc_title: string;
90
+ section_index: number;
91
+ heading_path: string;
92
+ name: string;
93
+ kind: string;
94
+ file_path: string;
95
+ start_line: number;
96
+ end_line: number;
97
+ score: number;
98
+ branch: string;
99
+ }
100
+ export type SearchResultItem = SearchSymbolResult | SearchDocSectionResult;
58
101
  /** Execute a knowledge-base search in the requested mode. */
59
- export declare function handler(db: Database.Database, args: SearchArgs, embedder?: EmbeddingProvider): Promise<SearchResult>;
102
+ export declare function handler(db: Database.Database, args: SearchArgs, embedder?: EmbeddingProvider, observer?: SearchObserver): Promise<SearchResult>;
60
103
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/kb-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;AAInE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;CA0BV,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;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AA8HD,6DAA6D;AAC7D,wBAAsB,OAAO,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/kb-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;;;;;;;;;;;;;;;;;;;;;;CA0BV,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;CACjB;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"}
@@ -11,6 +11,7 @@
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
17
  name: 'kb_search',
@@ -50,13 +51,33 @@ function sanitizeFts5Query(query) {
50
51
  // Escape interior double-quotes, then wrap in double-quotes for a phrase query.
51
52
  return `"${query.replace(/"/g, '""')}"`;
52
53
  }
54
+ function symbolEnrichmentProjection(db) {
55
+ let columns = new Set();
56
+ try {
57
+ const rows = db.prepare('PRAGMA table_info(symbols)').all();
58
+ columns = new Set(rows.map((row) => row.name));
59
+ }
60
+ catch {
61
+ columns = new Set();
62
+ }
63
+ const column = (name) => (columns.has(name) ? `s.${name} AS ${name}` : `NULL AS ${name}`);
64
+ return [
65
+ column('resolved_type_signature'),
66
+ column('resolved_return_type'),
67
+ column('definition_uri'),
68
+ column('definition_path'),
69
+ ].join(',\n ');
70
+ }
53
71
  /** Run a structural BM25 FTS5 search and return ranked rows. */
54
72
  function structuralSearch(db, query, limit, branch) {
55
73
  const safeQuery = sanitizeFts5Query(query);
56
74
  const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
75
+ const enrichmentProjection = symbolEnrichmentProjection(db);
57
76
  try {
58
- const sql = `SELECT s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
77
+ const sql = `SELECT 'symbol' AS result_type,
78
+ s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
59
79
  s.start_line, s.end_line,
80
+ ${enrichmentProjection},
60
81
  bm25(symbols_fts) AS score,
61
82
  f.branch AS branch
62
83
  FROM symbols_fts
@@ -64,7 +85,7 @@ function structuralSearch(db, query, limit, branch) {
64
85
  JOIN files f ON f.id = s.file_id
65
86
  WHERE symbols_fts MATCH ?${branchClause}
66
87
  ORDER BY score
67
- LIMIT ?`;
88
+ LIMIT ?`;
68
89
  const params = branch !== undefined ? [safeQuery, branch, limit] : [safeQuery, limit];
69
90
  const rows = db.prepare(sql).all(...params);
70
91
  return rows;
@@ -72,18 +93,85 @@ function structuralSearch(db, query, limit, branch) {
72
93
  catch {
73
94
  // FTS5 parse error — fall back to LIKE-based search.
74
95
  const likeQuery = `%${query}%`;
75
- const sql = `SELECT s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
96
+ const sql = `SELECT 'symbol' AS result_type,
97
+ s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
76
98
  s.start_line, s.end_line,
99
+ ${enrichmentProjection},
77
100
  0.0 AS score,
78
101
  f.branch AS branch
79
102
  FROM symbols s
80
103
  JOIN files f ON f.id = s.file_id
81
104
  WHERE s.name LIKE ?${branchClause}
82
- LIMIT ?`;
105
+ LIMIT ?`;
83
106
  const params = branch !== undefined ? [likeQuery, branch, limit] : [likeQuery, limit];
84
107
  return db.prepare(sql).all(...params);
85
108
  }
86
109
  }
110
+ function hasVirtualTable(db, name) {
111
+ const row = db
112
+ .prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = ? LIMIT 1")
113
+ .get(name);
114
+ return row?.present === 1;
115
+ }
116
+ function semanticSymbolSearch(db, queryVector, limit, branch) {
117
+ if (!hasVirtualTable(db, 'symbol_embeddings')) {
118
+ return [];
119
+ }
120
+ const branchClause = branch !== undefined ? ' AND f.branch = ?' : '';
121
+ const enrichment = symbolEnrichmentProjection(db);
122
+ const sql = `SELECT 'symbol' AS result_type,
123
+ s.id AS symbol_id, s.name, s.kind, f.path AS file_path,
124
+ s.start_line, s.end_line,
125
+ ${enrichment},
126
+ distance AS score,
127
+ f.branch AS branch
128
+ FROM symbol_embeddings
129
+ JOIN symbols s ON s.rowid = symbol_embeddings.rowid
130
+ JOIN files f ON f.id = s.file_id
131
+ WHERE embedding MATCH ?${branchClause}
132
+ ORDER BY distance
133
+ LIMIT ?`;
134
+ const params = branch !== undefined
135
+ ? [JSON.stringify(queryVector), branch, limit]
136
+ : [JSON.stringify(queryVector), limit];
137
+ try {
138
+ return db.prepare(sql).all(...params);
139
+ }
140
+ catch {
141
+ return [];
142
+ }
143
+ }
144
+ function semanticDocSectionSearch(db, queryVector, limit, branch) {
145
+ if (!hasVirtualTable(db, 'doc_section_embeddings')) {
146
+ return [];
147
+ }
148
+ try {
149
+ const rows = semanticSearchDocSections(db, {
150
+ queryVector,
151
+ branch,
152
+ limit,
153
+ });
154
+ return rows.map((row) => ({
155
+ result_type: 'doc_section',
156
+ doc_section_id: row.id,
157
+ doc_id: row.doc_id,
158
+ doc_kind: row.doc_kind,
159
+ doc_title: row.doc_title,
160
+ section_index: row.section_index,
161
+ heading_path: row.heading_path,
162
+ name: row.title || row.doc_title,
163
+ kind: 'doc_section',
164
+ file_path: row.doc_path,
165
+ start_line: row.line_start,
166
+ end_line: row.line_end,
167
+ score: row.score,
168
+ branch: row.doc_branch,
169
+ }));
170
+ }
171
+ catch {
172
+ return [];
173
+ }
174
+ }
87
175
  /**
88
176
  * Attempt a semantic (cosine) search via the vec0 virtual table.
89
177
  * Returns `null` when no embedder is available or the table has no rows.
@@ -93,21 +181,11 @@ async function semanticSearch(db, query, limit, embedder, branch) {
93
181
  const [queryVec] = await embedder.embed([query]);
94
182
  if (!queryVec)
95
183
  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);
184
+ const symbolRows = semanticSymbolSearch(db, queryVec, limit, branch);
185
+ const docRows = semanticDocSectionSearch(db, queryVec, limit, branch);
186
+ const rows = [...symbolRows, ...docRows]
187
+ .sort((a, b) => a.score - b.score)
188
+ .slice(0, limit);
111
189
  return rows.length > 0 ? rows : null;
112
190
  }
113
191
  catch {
@@ -123,15 +201,17 @@ async function semanticSearch(db, query, limit, embedder, branch) {
123
201
  function rrfFuse(structural, semantic, limit) {
124
202
  const k = 60;
125
203
  const scores = new Map();
204
+ const resultKey = (item) => item.result_type === 'symbol' ? `symbol:${item.symbol_id}` : `doc:${item.doc_section_id}`;
126
205
  const addList = (list) => {
127
206
  list.forEach((item, idx) => {
128
- const existing = scores.get(item.symbol_id);
207
+ const key = resultKey(item);
208
+ const existing = scores.get(key);
129
209
  const contrib = 1 / (k + idx + 1);
130
210
  if (existing) {
131
211
  existing.score += contrib;
132
212
  }
133
213
  else {
134
- scores.set(item.symbol_id, { item, score: contrib });
214
+ scores.set(key, { item, score: contrib });
135
215
  }
136
216
  });
137
217
  };
@@ -144,27 +224,51 @@ function rrfFuse(structural, semantic, limit) {
144
224
  .map(({ item, score }) => ({ ...item, score }));
145
225
  }
146
226
  /** Execute a knowledge-base search in the requested mode. */
147
- export async function handler(db, args, embedder) {
227
+ export async function handler(db, args, embedder, observer) {
228
+ const start = Date.now();
148
229
  const limit = args.limit ?? 20;
149
230
  const mode = args.mode ?? 'structural';
150
231
  const structural = structuralSearch(db, args.query, limit, args.branch);
232
+ let result;
151
233
  if (mode === 'structural') {
152
- return { results: structural, mode_used: 'structural' };
234
+ result = { results: structural, mode_used: 'structural' };
153
235
  }
154
- if (!embedder) {
236
+ else if (!embedder) {
155
237
  // No query-time embedder available — callers can detect this degradation.
156
- return { results: structural, mode_used: 'structural (no query-time embedder)' };
238
+ result = { results: structural, mode_used: 'structural (no query-time embedder)' };
157
239
  }
158
- const semantic = await semanticSearch(db, args.query, limit, embedder, args.branch);
159
- if (mode === 'semantic') {
160
- if (semantic) {
161
- return { results: semantic, mode_used: 'semantic' };
240
+ else {
241
+ const semantic = await semanticSearch(db, args.query, limit, embedder, args.branch);
242
+ if (mode === 'semantic') {
243
+ result = semantic
244
+ ? { results: semantic, mode_used: 'semantic' }
245
+ : { results: structural, mode_used: 'structural (fallback: no embeddings)' };
246
+ }
247
+ else {
248
+ // mode === 'fused'
249
+ const fused = rrfFuse(structural, semantic, limit);
250
+ const modeUsed = semantic ? 'fused' : 'structural (fallback: no embeddings)';
251
+ result = { results: fused, mode_used: modeUsed };
252
+ }
253
+ }
254
+ // ── Emit observation ─────────────────────────────────────────────────────
255
+ if (observer) {
256
+ try {
257
+ observer({
258
+ timestamp: new Date().toISOString(),
259
+ query: args.query,
260
+ requestedMode: mode,
261
+ modeUsed: result.mode_used,
262
+ resultCount: result.results.length,
263
+ topScore: result.results.length > 0 ? result.results[0].score : null,
264
+ latencyMs: Date.now() - start,
265
+ branch: args.branch,
266
+ });
267
+ }
268
+ catch {
269
+ // Observer errors must never break search.
162
270
  }
163
- return { results: structural, mode_used: 'structural (fallback: no embeddings)' };
164
271
  }
165
- // mode === 'fused'
166
- const fused = rrfFuse(structural, semantic, limit);
167
- const modeUsed = semantic ? 'fused' : 'structural (fallback: no embeddings)';
168
- return { results: fused, mode_used: modeUsed };
272
+ return result;
169
273
  }
170
274
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/kb-server/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,iFAAiF;AAEjF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,yFAAyF;QACzF,sDAAsD;QACtD,+FAA+F;QAC/F,oEAAoE;IACtE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC;gBACzC,WAAW,EAAE,sCAAsC;aACpD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACO,CAAC;AAyBX;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,gFAAgF;IAChF,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,gEAAgE;AAChE,SAAS,gBAAgB,CACvB,EAAqB,EACrB,KAAa,EACb,KAAa,EACb,MAAe;IAEf,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG;;;;;;;qCAOqB,YAAY;;kBAE/B,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA4B,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;QACrD,MAAM,SAAS,GAAG,IAAI,KAAK,GAAG,CAAC;QAC/B,MAAM,GAAG,GAAG;;;;;;+BAMe,YAAY;kBACzB,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtF,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA4B,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,EAAqB,EACrB,KAAa,EACb,KAAa,EACb,QAA2B,EAC3B,MAAe;IAEf,IAAI,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,GAAG,GAAG;;;;;;;mCAOmB,YAAY;;kBAE7B,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS;YACjC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC;YAC3C,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA4B,CAAC;QAEvE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CACd,UAAmC,EACnC,QAAwC,EACxC,KAAa;IAEb,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoE,CAAC;IAE3F,MAAM,OAAO,GAAG,CAAC,IAA6B,EAAQ,EAAE;QACtD,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CAAC,UAAU,CAAC,CAAC;IACpB,IAAI,QAAQ;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEhC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,EAAqB,EACrB,IAAgB,EAChB,QAA4B;IAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC;IAEvC,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAExE,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,0EAA0E;QAC1E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qCAAqC,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpF,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,sCAAsC,EAAE,CAAC;IACpF,CAAC;IAED,mBAAmB;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC;IAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/kb-server/tools/search.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jafreck/lore",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Language-aware codebase indexer — tree-sitter parsing, symbol extraction, call-graph construction, and optional embeddings for semantic search",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,6 +12,14 @@
12
12
  },
13
13
  "./mcp": {
14
14
  "default": "./dist/kb-server/server.js"
15
+ },
16
+ "./kb-server/db": {
17
+ "types": "./dist/kb-server/db.d.ts",
18
+ "default": "./dist/kb-server/db.js"
19
+ },
20
+ "./kb-server/tools/*": {
21
+ "types": "./dist/kb-server/tools/*.d.ts",
22
+ "default": "./dist/kb-server/tools/*.js"
15
23
  }
16
24
  },
17
25
  "bin": {
@@ -24,6 +32,7 @@
24
32
  "build": "tsc",
25
33
  "clean": "rm -rf dist",
26
34
  "lint": "tsc --noEmit",
35
+ "prepare": "npm run build",
27
36
  "prepublishOnly": "npm run clean && npm run build",
28
37
  "test": "vitest run",
29
38
  "coverage": "vitest run --coverage"
@@ -52,13 +61,13 @@
52
61
  "fast-glob": "^3.3.3",
53
62
  "simple-git": "^3.32.3",
54
63
  "sqlite-vec": "^0.1.6",
55
- "tree-sitter": "0.21.1",
64
+ "tree-sitter": "0.22.4",
56
65
  "tree-sitter-bash": "^0.25.1",
57
- "tree-sitter-c": "0.23.2",
66
+ "tree-sitter-c": "0.24.1",
58
67
  "tree-sitter-c-sharp": "0.23.1",
59
68
  "tree-sitter-cpp": "0.23.4",
60
69
  "tree-sitter-dart": "^1.0.0",
61
- "tree-sitter-elixir": "^0.3.4",
70
+ "tree-sitter-elixir": "^0.3.5",
62
71
  "tree-sitter-elm": "^4.5.0",
63
72
  "tree-sitter-go": "0.23.4",
64
73
  "tree-sitter-haskell": "^0.23.1",
@@ -70,9 +79,9 @@
70
79
  "tree-sitter-objc": "^3.0.2",
71
80
  "tree-sitter-ocaml": "^0.24.2",
72
81
  "tree-sitter-php": "^0.24.2",
73
- "tree-sitter-python": "0.23.4",
82
+ "tree-sitter-python": "0.23.6",
74
83
  "tree-sitter-ruby": "^0.23.1",
75
- "tree-sitter-rust": "0.23.1",
84
+ "tree-sitter-rust": "0.24.0",
76
85
  "tree-sitter-scala": "^0.24.0",
77
86
  "tree-sitter-swift": "^0.7.1",
78
87
  "tree-sitter-typescript": "0.23.2",
@@ -81,7 +90,7 @@
81
90
  },
82
91
  "devDependencies": {
83
92
  "@types/better-sqlite3": "^7.6.13",
84
- "@types/node": "^22",
93
+ "@types/node": "^25",
85
94
  "@vitest/coverage-v8": "^4.0",
86
95
  "typescript": "^5.9",
87
96
  "vitest": "^4.0"