@jafreck/lore 0.2.4 → 0.3.0

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 (200) hide show
  1. package/README.md +63 -35
  2. package/dist/cli.js +41 -38
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.d.ts +24 -5
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +23 -4
  7. package/dist/index.js.map +1 -1
  8. package/dist/indexer/call-graph.d.ts +29 -8
  9. package/dist/indexer/call-graph.d.ts.map +1 -1
  10. package/dist/indexer/call-graph.js +232 -31
  11. package/dist/indexer/call-graph.js.map +1 -1
  12. package/dist/indexer/config-parser.js +6 -1
  13. package/dist/indexer/config-parser.js.map +1 -1
  14. package/dist/indexer/coverage.js +3 -1
  15. package/dist/indexer/coverage.js.map +1 -1
  16. package/dist/indexer/db.d.ts.map +1 -1
  17. package/dist/indexer/db.js +70 -1
  18. package/dist/indexer/db.js.map +1 -1
  19. package/dist/indexer/docs.d.ts.map +1 -1
  20. package/dist/indexer/docs.js +4 -0
  21. package/dist/indexer/docs.js.map +1 -1
  22. package/dist/indexer/embedder.d.ts.map +1 -1
  23. package/dist/indexer/embedder.js +5 -0
  24. package/dist/indexer/embedder.js.map +1 -1
  25. package/dist/indexer/extractors/bash.d.ts.map +1 -1
  26. package/dist/indexer/extractors/bash.js +29 -1
  27. package/dist/indexer/extractors/bash.js.map +1 -1
  28. package/dist/indexer/extractors/c.d.ts +5 -2
  29. package/dist/indexer/extractors/c.d.ts.map +1 -1
  30. package/dist/indexer/extractors/c.js +277 -8
  31. package/dist/indexer/extractors/c.js.map +1 -1
  32. package/dist/indexer/extractors/cpp.d.ts +5 -2
  33. package/dist/indexer/extractors/cpp.d.ts.map +1 -1
  34. package/dist/indexer/extractors/cpp.js +349 -3
  35. package/dist/indexer/extractors/cpp.js.map +1 -1
  36. package/dist/indexer/extractors/csharp.d.ts.map +1 -1
  37. package/dist/indexer/extractors/csharp.js +166 -1
  38. package/dist/indexer/extractors/csharp.js.map +1 -1
  39. package/dist/indexer/extractors/dart.d.ts.map +1 -1
  40. package/dist/indexer/extractors/dart.js +134 -1
  41. package/dist/indexer/extractors/dart.js.map +1 -1
  42. package/dist/indexer/extractors/elixir.d.ts.map +1 -1
  43. package/dist/indexer/extractors/elixir.js +45 -0
  44. package/dist/indexer/extractors/elixir.js.map +1 -1
  45. package/dist/indexer/extractors/elm.d.ts.map +1 -1
  46. package/dist/indexer/extractors/elm.js +33 -0
  47. package/dist/indexer/extractors/elm.js.map +1 -1
  48. package/dist/indexer/extractors/go.d.ts.map +1 -1
  49. package/dist/indexer/extractors/go.js +206 -1
  50. package/dist/indexer/extractors/go.js.map +1 -1
  51. package/dist/indexer/extractors/haskell.d.ts.map +1 -1
  52. package/dist/indexer/extractors/haskell.js +29 -0
  53. package/dist/indexer/extractors/haskell.js.map +1 -1
  54. package/dist/indexer/extractors/java.d.ts.map +1 -1
  55. package/dist/indexer/extractors/java.js +170 -1
  56. package/dist/indexer/extractors/java.js.map +1 -1
  57. package/dist/indexer/extractors/javascript.d.ts.map +1 -1
  58. package/dist/indexer/extractors/javascript.js +24 -2
  59. package/dist/indexer/extractors/javascript.js.map +1 -1
  60. package/dist/indexer/extractors/julia.d.ts.map +1 -1
  61. package/dist/indexer/extractors/julia.js +23 -1
  62. package/dist/indexer/extractors/julia.js.map +1 -1
  63. package/dist/indexer/extractors/kotlin.d.ts.map +1 -1
  64. package/dist/indexer/extractors/kotlin.js +122 -1
  65. package/dist/indexer/extractors/kotlin.js.map +1 -1
  66. package/dist/indexer/extractors/lua.d.ts.map +1 -1
  67. package/dist/indexer/extractors/lua.js +19 -1
  68. package/dist/indexer/extractors/lua.js.map +1 -1
  69. package/dist/indexer/extractors/objc.d.ts.map +1 -1
  70. package/dist/indexer/extractors/objc.js +171 -1
  71. package/dist/indexer/extractors/objc.js.map +1 -1
  72. package/dist/indexer/extractors/ocaml.d.ts.map +1 -1
  73. package/dist/indexer/extractors/ocaml.js +29 -0
  74. package/dist/indexer/extractors/ocaml.js.map +1 -1
  75. package/dist/indexer/extractors/php.d.ts.map +1 -1
  76. package/dist/indexer/extractors/php.js +137 -1
  77. package/dist/indexer/extractors/php.js.map +1 -1
  78. package/dist/indexer/extractors/python.d.ts.map +1 -1
  79. package/dist/indexer/extractors/python.js +24 -3
  80. package/dist/indexer/extractors/python.js.map +1 -1
  81. package/dist/indexer/extractors/ruby.d.ts.map +1 -1
  82. package/dist/indexer/extractors/ruby.js +23 -1
  83. package/dist/indexer/extractors/ruby.js.map +1 -1
  84. package/dist/indexer/extractors/rust.d.ts.map +1 -1
  85. package/dist/indexer/extractors/rust.js +139 -2
  86. package/dist/indexer/extractors/rust.js.map +1 -1
  87. package/dist/indexer/extractors/scala.d.ts.map +1 -1
  88. package/dist/indexer/extractors/scala.js +24 -1
  89. package/dist/indexer/extractors/scala.js.map +1 -1
  90. package/dist/indexer/extractors/swift.d.ts.map +1 -1
  91. package/dist/indexer/extractors/swift.js +129 -1
  92. package/dist/indexer/extractors/swift.js.map +1 -1
  93. package/dist/indexer/extractors/types.d.ts +78 -2
  94. package/dist/indexer/extractors/types.d.ts.map +1 -1
  95. package/dist/indexer/extractors/types.js +167 -8
  96. package/dist/indexer/extractors/types.js.map +1 -1
  97. package/dist/indexer/extractors/typescript.d.ts.map +1 -1
  98. package/dist/indexer/extractors/typescript.js +217 -1
  99. package/dist/indexer/extractors/typescript.js.map +1 -1
  100. package/dist/indexer/extractors/zig.d.ts.map +1 -1
  101. package/dist/indexer/extractors/zig.js +30 -0
  102. package/dist/indexer/extractors/zig.js.map +1 -1
  103. package/dist/indexer/git-history.d.ts.map +1 -1
  104. package/dist/indexer/git-history.js +4 -8
  105. package/dist/indexer/git-history.js.map +1 -1
  106. package/dist/indexer/git-hooks.js +1 -1
  107. package/dist/indexer/git-hooks.js.map +1 -1
  108. package/dist/indexer/index.d.ts +27 -52
  109. package/dist/indexer/index.d.ts.map +1 -1
  110. package/dist/indexer/index.js +146 -773
  111. package/dist/indexer/index.js.map +1 -1
  112. package/dist/indexer/lsp/client.d.ts.map +1 -1
  113. package/dist/indexer/lsp/client.js +40 -15
  114. package/dist/indexer/lsp/client.js.map +1 -1
  115. package/dist/indexer/lsp/config.d.ts.map +1 -1
  116. package/dist/indexer/lsp/config.js +18 -4
  117. package/dist/indexer/lsp/config.js.map +1 -1
  118. package/dist/indexer/lsp/enrichment.d.ts +2 -0
  119. package/dist/indexer/lsp/enrichment.d.ts.map +1 -1
  120. package/dist/indexer/lsp/enrichment.js +67 -33
  121. package/dist/indexer/lsp/enrichment.js.map +1 -1
  122. package/dist/indexer/pipeline.d.ts +137 -0
  123. package/dist/indexer/pipeline.d.ts.map +1 -0
  124. package/dist/indexer/pipeline.js +84 -0
  125. package/dist/indexer/pipeline.js.map +1 -0
  126. package/dist/indexer/poller.d.ts +8 -0
  127. package/dist/indexer/poller.d.ts.map +1 -1
  128. package/dist/indexer/poller.js +3 -1
  129. package/dist/indexer/poller.js.map +1 -1
  130. package/dist/indexer/resolution-method.d.ts +40 -0
  131. package/dist/indexer/resolution-method.d.ts.map +1 -0
  132. package/dist/indexer/resolution-method.js +53 -0
  133. package/dist/indexer/resolution-method.js.map +1 -0
  134. package/dist/indexer/resolver.d.ts.map +1 -1
  135. package/dist/indexer/resolver.js +8 -4
  136. package/dist/indexer/resolver.js.map +1 -1
  137. package/dist/indexer/stages/dependency-api.d.ts +18 -0
  138. package/dist/indexer/stages/dependency-api.d.ts.map +1 -0
  139. package/dist/indexer/stages/dependency-api.js +174 -0
  140. package/dist/indexer/stages/dependency-api.js.map +1 -0
  141. package/dist/indexer/stages/docs-index.d.ts +20 -0
  142. package/dist/indexer/stages/docs-index.d.ts.map +1 -0
  143. package/dist/indexer/stages/docs-index.js +144 -0
  144. package/dist/indexer/stages/docs-index.js.map +1 -0
  145. package/dist/indexer/stages/embedding.d.ts +17 -0
  146. package/dist/indexer/stages/embedding.d.ts.map +1 -0
  147. package/dist/indexer/stages/embedding.js +217 -0
  148. package/dist/indexer/stages/embedding.js.map +1 -0
  149. package/dist/indexer/stages/import-resolution.d.ts +17 -0
  150. package/dist/indexer/stages/import-resolution.d.ts.map +1 -0
  151. package/dist/indexer/stages/import-resolution.js +47 -0
  152. package/dist/indexer/stages/import-resolution.js.map +1 -0
  153. package/dist/indexer/stages/index.d.ts +12 -0
  154. package/dist/indexer/stages/index.d.ts.map +1 -0
  155. package/dist/indexer/stages/index.js +12 -0
  156. package/dist/indexer/stages/index.js.map +1 -0
  157. package/dist/indexer/stages/lsp-enrichment.d.ts +48 -0
  158. package/dist/indexer/stages/lsp-enrichment.d.ts.map +1 -0
  159. package/dist/indexer/stages/lsp-enrichment.js +158 -0
  160. package/dist/indexer/stages/lsp-enrichment.js.map +1 -0
  161. package/dist/indexer/stages/source-index.d.ts +31 -0
  162. package/dist/indexer/stages/source-index.d.ts.map +1 -0
  163. package/dist/indexer/stages/source-index.js +314 -0
  164. package/dist/indexer/stages/source-index.js.map +1 -0
  165. package/dist/indexer/watcher.d.ts +8 -0
  166. package/dist/indexer/watcher.d.ts.map +1 -1
  167. package/dist/indexer/watcher.js +18 -1
  168. package/dist/indexer/watcher.js.map +1 -1
  169. package/dist/lore-server/db.d.ts +51 -4
  170. package/dist/lore-server/db.d.ts.map +1 -1
  171. package/dist/lore-server/db.js +102 -93
  172. package/dist/lore-server/db.js.map +1 -1
  173. package/dist/lore-server/server.d.ts +5 -0
  174. package/dist/lore-server/server.d.ts.map +1 -1
  175. package/dist/lore-server/server.js +52 -273
  176. package/dist/lore-server/server.js.map +1 -1
  177. package/dist/lore-server/tool-registry.d.ts +101 -0
  178. package/dist/lore-server/tool-registry.d.ts.map +1 -0
  179. package/dist/lore-server/tool-registry.js +227 -0
  180. package/dist/lore-server/tool-registry.js.map +1 -0
  181. package/dist/lore-server/tools/graph.d.ts +11 -3
  182. package/dist/lore-server/tools/graph.d.ts.map +1 -1
  183. package/dist/lore-server/tools/graph.js +108 -13
  184. package/dist/lore-server/tools/graph.js.map +1 -1
  185. package/dist/lore-server/tools/lookup.d.ts +9 -3
  186. package/dist/lore-server/tools/lookup.d.ts.map +1 -1
  187. package/dist/lore-server/tools/lookup.js +9 -4
  188. package/dist/lore-server/tools/lookup.js.map +1 -1
  189. package/dist/lore-server/tools/notes.d.ts.map +1 -1
  190. package/dist/lore-server/tools/notes.js +6 -2
  191. package/dist/lore-server/tools/notes.js.map +1 -1
  192. package/dist/lore-server/tools/search.d.ts +4 -0
  193. package/dist/lore-server/tools/search.d.ts.map +1 -1
  194. package/dist/lore-server/tools/search.js +50 -14
  195. package/dist/lore-server/tools/search.js.map +1 -1
  196. package/dist/runtime.d.ts +88 -0
  197. package/dist/runtime.d.ts.map +1 -0
  198. package/dist/runtime.js +153 -0
  199. package/dist/runtime.js.map +1 -0
  200. package/package.json +12 -12
@@ -0,0 +1,174 @@
1
+ /**
2
+ * @module indexer/stages/dependency-api
3
+ *
4
+ * Pipeline stage: index declaration-surface symbols from direct dependencies
5
+ * (.d.ts files for npm, etc.). Populates `external_symbols`.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import { ParserPool } from '../parser.js';
10
+ import { LspEnrichmentCoordinator } from '../lsp/enrichment.js';
11
+ import { isPublicDeclarationSurfaceSymbol, } from '../extractors/types.js';
12
+ import { TypeScriptExtractor } from '../extractors/typescript.js';
13
+ // ─── Stage ────────────────────────────────────────────────────────────────────
14
+ /**
15
+ * Index exported declarations from direct npm dependencies (.d.ts files).
16
+ * Stores results in `external_symbols`.
17
+ */
18
+ export class DependencyApiStage {
19
+ name = 'dependency-api';
20
+ pool = null;
21
+ async execute(context, _mode) {
22
+ const { db, walkerConfig, lsp } = context;
23
+ // Always clear external symbols — when indexDependencies is false, this
24
+ // ensures stale data from a previous deps-enabled build is removed.
25
+ db.prepare('DELETE FROM external_symbols').run();
26
+ if (!context.indexDependencies)
27
+ return;
28
+ this.pool = new ParserPool();
29
+ const directDependencies = loadDirectDependencies(walkerConfig.rootDir);
30
+ if (directDependencies.size === 0)
31
+ return;
32
+ const extractor = new TypeScriptExtractor();
33
+ // Optional LSP coordinator for enriching external symbols.
34
+ let lspCoordinator = null;
35
+ if (lsp?.enabled) {
36
+ lspCoordinator = new LspEnrichmentCoordinator(lsp, walkerConfig.rootDir);
37
+ await lspCoordinator.start(new Set(['typescript']));
38
+ }
39
+ try {
40
+ const insertExternalSymbol = db.prepare(`INSERT OR IGNORE INTO external_symbols
41
+ (
42
+ package_name,
43
+ package_version,
44
+ source_ref,
45
+ symbol_name,
46
+ symbol_kind,
47
+ signature,
48
+ doc_comment,
49
+ resolved_type_signature,
50
+ resolved_return_type,
51
+ definition_uri,
52
+ definition_path
53
+ )
54
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
55
+ for (const [packageName, declaredVersion] of directDependencies) {
56
+ const packageDir = path.join(walkerConfig.rootDir, 'node_modules', packageName);
57
+ if (!fs.existsSync(packageDir) || !fs.statSync(packageDir).isDirectory())
58
+ continue;
59
+ const packageVersion = readInstalledPackageVersion(packageDir) ?? declaredVersion ?? null;
60
+ const declarationFiles = collectDeclarationFiles(packageDir);
61
+ for (const declarationFile of declarationFiles) {
62
+ const source = fs.readFileSync(declarationFile, 'utf8');
63
+ const tree = this.pool.parse('typescript', source);
64
+ if (!tree)
65
+ continue;
66
+ const result = extractor.extract(tree, source, declarationFile);
67
+ const declarationSymbols = result.symbols.filter((symbol) => shouldIndexDependencySymbol(symbol));
68
+ const enrichmentRows = lspCoordinator
69
+ ? await lspCoordinator.enrich({
70
+ filePath: declarationFile,
71
+ language: 'typescript',
72
+ source,
73
+ targets: declarationSymbols.map((symbol) => ({
74
+ line: symbol.startLine,
75
+ character: symbol.startCharacter ?? 0,
76
+ })),
77
+ })
78
+ : declarationSymbols.map(() => null);
79
+ for (let i = 0; i < declarationSymbols.length; i++) {
80
+ const symbol = declarationSymbols[i];
81
+ if (!symbol)
82
+ continue;
83
+ const metadata = enrichmentRows[i];
84
+ insertExternalSymbol.run(packageName, packageVersion, declarationFile, symbol.name, symbol.kind, symbol.signature, symbol.docComment ?? null, metadata?.resolvedTypeSignature ?? null, metadata?.resolvedReturnType ?? null, metadata?.definitionUri ?? null, metadata?.definitionPath ?? null);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ finally {
90
+ if (lspCoordinator) {
91
+ await lspCoordinator.dispose();
92
+ }
93
+ }
94
+ }
95
+ async dispose() {
96
+ this.pool = null;
97
+ }
98
+ }
99
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
100
+ function loadDirectDependencies(rootDir) {
101
+ const packageJsonPath = path.join(rootDir, 'package.json');
102
+ if (!fs.existsSync(packageJsonPath))
103
+ return new Map();
104
+ const raw = fs.readFileSync(packageJsonPath, 'utf8');
105
+ const pkg = JSON.parse(raw);
106
+ const deps = new Map();
107
+ for (const section of [pkg.dependencies, pkg.devDependencies, pkg.peerDependencies]) {
108
+ if (!section)
109
+ continue;
110
+ for (const [name, version] of Object.entries(section)) {
111
+ if (!deps.has(name))
112
+ deps.set(name, version);
113
+ }
114
+ }
115
+ return deps;
116
+ }
117
+ function readInstalledPackageVersion(packageDir) {
118
+ const packageJsonPath = path.join(packageDir, 'package.json');
119
+ if (!fs.existsSync(packageJsonPath))
120
+ return undefined;
121
+ const raw = fs.readFileSync(packageJsonPath, 'utf8');
122
+ const pkg = JSON.parse(raw);
123
+ return pkg.version;
124
+ }
125
+ function collectDeclarationFiles(packageDir) {
126
+ const declarations = [];
127
+ const stack = [packageDir];
128
+ while (stack.length > 0) {
129
+ const currentDir = stack.pop();
130
+ if (!currentDir)
131
+ continue;
132
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
133
+ for (const entry of entries) {
134
+ if (entry.name === 'node_modules')
135
+ continue;
136
+ const fullPath = path.join(currentDir, entry.name);
137
+ if (entry.isDirectory()) {
138
+ stack.push(fullPath);
139
+ continue;
140
+ }
141
+ if (entry.isFile() && fullPath.endsWith('.d.ts')) {
142
+ declarations.push(fullPath);
143
+ }
144
+ }
145
+ }
146
+ return declarations;
147
+ }
148
+ function shouldIndexDependencySymbol(symbol) {
149
+ if (!isPublicDeclarationSurfaceSymbol(symbol))
150
+ return false;
151
+ if (symbol.declarationSurface)
152
+ return true;
153
+ return !hasImplementationBody(symbol);
154
+ }
155
+ function hasImplementationBody(symbol) {
156
+ const node = symbol.astNode;
157
+ if (!node)
158
+ return false;
159
+ if (node.type === 'arrow_function' ||
160
+ node.type === 'function_expression' ||
161
+ node.type === 'generator_function') {
162
+ return true;
163
+ }
164
+ if (node.type === 'class_declaration' ||
165
+ node.type === 'interface_declaration' ||
166
+ node.type === 'type_alias_declaration') {
167
+ return false;
168
+ }
169
+ const bodyNode = node.childForFieldName('body');
170
+ if (!bodyNode)
171
+ return false;
172
+ return bodyNode.namedChildCount > 0 || bodyNode.text.trim() !== '';
173
+ }
174
+ //# sourceMappingURL=dependency-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-api.js","sourceRoot":"","sources":["../../../src/indexer/stages/dependency-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @module indexer/stages/docs-index
3
+ *
4
+ * Pipeline stage: walk documentation files, chunk by headings, insert into
5
+ * the database, and optionally seed notes from documentation content.
6
+ */
7
+ import type { PipelineContext, PipelineStage } from '../pipeline.js';
8
+ import type { Database } from '../db.js';
9
+ import type { DocumentationFile } from '../docs.js';
10
+ /**
11
+ * Walk documentation files, chunk by headings, and persist to the database.
12
+ * Optionally seeds notes from documentation content.
13
+ */
14
+ export declare class DocsIndexStage implements PipelineStage {
15
+ readonly name = "docs-index";
16
+ execute(context: PipelineContext, mode: 'build' | 'update'): Promise<void>;
17
+ }
18
+ export declare function processDocumentationFile(db: Database.Database, doc: DocumentationFile, branch: string): void;
19
+ export declare function upsertSeededDocumentationNote(db: Database.Database, doc: DocumentationFile, branch: string): void;
20
+ //# sourceMappingURL=docs-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-index.d.ts","sourceRoot":"","sources":["../../../src/indexer/stages/docs-index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAiBpD;;;GAGG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,gBAAgB;IAEvB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAsCjF;AAID,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,MAAM,GACb,IAAI,CAsEN;AAED,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,MAAM,GACb,IAAI,CAsBN"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @module indexer/stages/docs-index
3
+ *
4
+ * Pipeline stage: walk documentation files, chunk by headings, insert into
5
+ * the database, and optionally seed notes from documentation content.
6
+ */
7
+ import { walkDocumentationFiles } from '../walker.js';
8
+ import { inferSeededDocNoteKey, buildDocNoteScope } from '../docs.js';
9
+ // ─── Stage ────────────────────────────────────────────────────────────────────
10
+ /**
11
+ * Walk documentation files, chunk by headings, and persist to the database.
12
+ * Optionally seeds notes from documentation content.
13
+ */
14
+ export class DocsIndexStage {
15
+ name = 'docs-index';
16
+ async execute(context, mode) {
17
+ const docs = await walkDocumentationFiles(context.walkerConfig);
18
+ context.log.indexing('docs walk complete', { docCount: docs.length });
19
+ const { db, branch } = context;
20
+ if (mode === 'build') {
21
+ db.transaction(() => {
22
+ const seenDocPaths = new Set();
23
+ for (const doc of docs) {
24
+ seenDocPaths.add(doc.path);
25
+ processDocumentationFile(db, doc, branch);
26
+ if (context.docsAutoNotes) {
27
+ upsertSeededDocumentationNote(db, doc, branch);
28
+ }
29
+ }
30
+ removeStaleDocumentation(db, branch, seenDocPaths);
31
+ })();
32
+ }
33
+ else {
34
+ // Update mode: only process docs that are in the changed-file list
35
+ const changedFiles = context.changedFiles ?? [];
36
+ const changedSet = new Set(changedFiles);
37
+ const docsByPath = new Map(docs.map(doc => [doc.path, doc]));
38
+ db.transaction(() => {
39
+ for (const filePath of changedFiles) {
40
+ const changedDoc = docsByPath.get(filePath);
41
+ if (changedDoc) {
42
+ processDocumentationFile(db, changedDoc, branch);
43
+ if (context.docsAutoNotes)
44
+ upsertSeededDocumentationNote(db, changedDoc, branch);
45
+ context.changedDocPaths.push(filePath);
46
+ }
47
+ else {
48
+ deleteDocumentationByPath(db, filePath, branch);
49
+ }
50
+ }
51
+ })();
52
+ }
53
+ }
54
+ }
55
+ // ─── Documentation file processing ───────────────────────────────────────────
56
+ export function processDocumentationFile(db, doc, branch) {
57
+ const existing = db.prepare('SELECT id, content_hash FROM docs WHERE path = ? AND branch = ?').get(doc.path, branch);
58
+ if (existing?.content_hash === doc.hash) {
59
+ return;
60
+ }
61
+ let docId;
62
+ if (existing) {
63
+ db.prepare(`UPDATE docs
64
+ SET kind = ?, title = ?, content = ?, content_hash = ?, indexed_at = unixepoch()
65
+ WHERE id = ?`).run(doc.kind, doc.title, doc.content, doc.hash, existing.id);
66
+ docId = existing.id;
67
+ }
68
+ else {
69
+ const info = db.prepare(`INSERT INTO docs (path, branch, kind, title, content, content_hash)
70
+ VALUES (?, ?, ?, ?, ?, ?)`).run(doc.path, branch, doc.kind, doc.title, doc.content, doc.hash);
71
+ docId = Number(info.lastInsertRowid);
72
+ }
73
+ const existingSections = db.prepare('SELECT id, section_index FROM doc_sections WHERE doc_id = ?').all(docId);
74
+ const insertSection = db.prepare(`INSERT INTO doc_sections (
75
+ doc_id, section_index, title, depth, heading_path, line_start, line_end, content, content_hash
76
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
77
+ ON CONFLICT(doc_id, section_index) DO UPDATE SET
78
+ title = excluded.title,
79
+ depth = excluded.depth,
80
+ heading_path = excluded.heading_path,
81
+ line_start = excluded.line_start,
82
+ line_end = excluded.line_end,
83
+ content = excluded.content,
84
+ content_hash = excluded.content_hash`);
85
+ const activeSectionIndexes = new Set();
86
+ for (const chunk of doc.chunks) {
87
+ activeSectionIndexes.add(chunk.sectionIndex);
88
+ insertSection.run(docId, chunk.sectionIndex, chunk.title, chunk.depth, JSON.stringify(chunk.headingPath), chunk.lineStart, chunk.lineEnd, chunk.content, chunk.hash);
89
+ }
90
+ const staleSectionIds = existingSections
91
+ .filter(section => !activeSectionIndexes.has(section.section_index))
92
+ .map(section => section.id);
93
+ deleteDocSectionEmbeddings(db, staleSectionIds);
94
+ if (staleSectionIds.length > 0) {
95
+ db.prepare(`DELETE FROM doc_sections
96
+ WHERE id IN (${staleSectionIds.map(() => '?').join(', ')})`).run(...staleSectionIds);
97
+ }
98
+ }
99
+ export function upsertSeededDocumentationNote(db, doc, branch) {
100
+ const key = inferSeededDocNoteKey(doc);
101
+ if (!key)
102
+ return;
103
+ const scope = buildDocNoteScope(doc.path, branch);
104
+ const existing = db.prepare('SELECT content, source_hash FROM notes WHERE key = ? AND scope = ?').get(key, scope);
105
+ if (existing?.content === doc.content && existing.source_hash === doc.hash) {
106
+ return;
107
+ }
108
+ db.prepare(`INSERT INTO notes (key, scope, content, model, source_hash, created_at, updated_at)
109
+ VALUES (?, ?, ?, ?, ?, unixepoch(), unixepoch())
110
+ ON CONFLICT(key, scope) DO UPDATE SET
111
+ content = excluded.content,
112
+ model = excluded.model,
113
+ source_hash = excluded.source_hash,
114
+ updated_at = unixepoch()`).run(key, scope, doc.content, 'system:auto-doc-seed', doc.hash);
115
+ }
116
+ function deleteDocumentationByPath(db, docPath, branch) {
117
+ const row = db.prepare('SELECT id FROM docs WHERE path = ? AND branch = ?')
118
+ .get(docPath, branch);
119
+ if (!row)
120
+ return;
121
+ deleteDocumentationById(db, row.id);
122
+ }
123
+ function removeStaleDocumentation(db, branch, retainedPaths) {
124
+ const docs = db.prepare('SELECT id, path FROM docs WHERE branch = ?').all(branch);
125
+ for (const doc of docs) {
126
+ if (!retainedPaths.has(doc.path)) {
127
+ deleteDocumentationById(db, doc.id);
128
+ }
129
+ }
130
+ }
131
+ function deleteDocumentationById(db, docId) {
132
+ const sectionIds = db.prepare('SELECT id FROM doc_sections WHERE doc_id = ?').all(docId);
133
+ deleteDocSectionEmbeddings(db, sectionIds.map(row => row.id));
134
+ db.prepare('DELETE FROM docs WHERE id = ?').run(docId);
135
+ }
136
+ function deleteDocSectionEmbeddings(db, sectionIds) {
137
+ if (sectionIds.length === 0)
138
+ return;
139
+ const hasEmbeddingsTable = db.prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = 'doc_section_embeddings'").get();
140
+ if (!hasEmbeddingsTable)
141
+ return;
142
+ db.prepare(`DELETE FROM doc_section_embeddings WHERE rowid IN (${sectionIds.map(() => '?').join(', ')})`).run(...sectionIds);
143
+ }
144
+ //# sourceMappingURL=docs-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-index.js","sourceRoot":"","sources":["../../../src/indexer/stages/docs-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module indexer/stages/embedding
3
+ *
4
+ * Pipeline stage: embed symbol signatures, documentation sections, and
5
+ * commit messages into vec0 virtual tables for semantic search.
6
+ */
7
+ import type { PipelineContext, PipelineStage } from '../pipeline.js';
8
+ /**
9
+ * Embed symbol signatures, documentation sections, and commit messages.
10
+ *
11
+ * Skips entirely when no `EmbeddingProvider` is configured in the context.
12
+ */
13
+ export declare class EmbeddingStage implements PipelineStage {
14
+ readonly name = "embedding";
15
+ execute(context: PipelineContext, mode: 'build' | 'update'): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../../src/indexer/stages/embedding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AASrE;;;;GAIG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,eAAe;IAEtB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BjF"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * @module indexer/stages/embedding
3
+ *
4
+ * Pipeline stage: embed symbol signatures, documentation sections, and
5
+ * commit messages into vec0 virtual tables for semantic search.
6
+ */
7
+ import { setLoreMeta, createVec0Tables } from '../db.js';
8
+ import { buildStructuralEmbeddingText } from '../embedder.js';
9
+ /** Number of items to embed per batch. */
10
+ const EMBED_BATCH_SIZE = 64;
11
+ /**
12
+ * Embed symbol signatures, documentation sections, and commit messages.
13
+ *
14
+ * Skips entirely when no `EmbeddingProvider` is configured in the context.
15
+ */
16
+ export class EmbeddingStage {
17
+ name = 'embedding';
18
+ async execute(context, mode) {
19
+ if (!context.embedder)
20
+ return;
21
+ const { db, embedder } = context;
22
+ context.log.indexing('embedding started', { model: embedder.modelName });
23
+ await embedder.init();
24
+ if (mode === 'update') {
25
+ // Clean up orphaned symbol embeddings for symbols that were deleted/replaced.
26
+ deleteSymbolEmbeddings(db, context.staleSymbolIds);
27
+ // Resolve scoped file/doc IDs for incremental embedding.
28
+ const changedFileIds = resolveFileIds(db, context.changedSourcePaths, context.branch);
29
+ const changedDocIds = resolveDocIds(db, context.changedDocPaths, context.branch);
30
+ await embedStructural(db, embedder, changedFileIds);
31
+ await embedDocumentation(db, embedder, changedDocIds);
32
+ }
33
+ else {
34
+ await embedStructural(db, embedder);
35
+ await embedDocumentation(db, embedder);
36
+ }
37
+ if (context.history) {
38
+ await embedCommitMessages(db, embedder);
39
+ }
40
+ context.log.indexing('embedding complete');
41
+ }
42
+ }
43
+ // ─── Structural symbol embeddings ─────────────────────────────────────────────
44
+ async function embedStructural(db, embedder, fileIds) {
45
+ setLoreMeta(db, 'embedding_model', embedder.modelName);
46
+ setLoreMeta(db, 'embedding_dims', String(embedder.dims));
47
+ createVec0Tables(db, embedder.dims);
48
+ const baseQuery = `SELECT id, name, signature, resolved_type_signature, resolved_return_type
49
+ FROM symbols
50
+ WHERE (signature IS NOT NULL
51
+ OR resolved_type_signature IS NOT NULL
52
+ OR resolved_return_type IS NOT NULL)`;
53
+ let symbols;
54
+ if (fileIds && fileIds.length > 0) {
55
+ symbols = db
56
+ .prepare(`${baseQuery} AND file_id IN (${fileIds.map(() => '?').join(', ')})`)
57
+ .all(...fileIds);
58
+ }
59
+ else {
60
+ symbols = db.prepare(baseQuery).all();
61
+ }
62
+ const insertEmbed = db.prepare('INSERT OR REPLACE INTO symbol_embeddings(rowid, embedding) VALUES (CAST(? AS INTEGER), json(?))');
63
+ // P4: Pipeline — start embedding the next batch while writing the current one.
64
+ let pendingEmbed = null;
65
+ let pendingBatch = [];
66
+ for (let i = 0; i < symbols.length; i += EMBED_BATCH_SIZE) {
67
+ const batch = symbols.slice(i, i + EMBED_BATCH_SIZE);
68
+ const texts = batch.map((symbol) => buildStructuralEmbeddingText({
69
+ name: symbol.name,
70
+ signature: symbol.signature,
71
+ resolvedTypeSignature: symbol.resolved_type_signature,
72
+ resolvedReturnType: symbol.resolved_return_type,
73
+ }));
74
+ if (pendingEmbed) {
75
+ const embeddings = await pendingEmbed;
76
+ db.transaction(() => {
77
+ for (let j = 0; j < pendingBatch.length; j++) {
78
+ const sym = pendingBatch[j];
79
+ if (sym)
80
+ insertEmbed.run(sym.id, JSON.stringify(embeddings[j]));
81
+ }
82
+ })();
83
+ }
84
+ pendingEmbed = embedder.embed(texts);
85
+ pendingBatch = batch;
86
+ }
87
+ if (pendingEmbed) {
88
+ const embeddings = await pendingEmbed;
89
+ db.transaction(() => {
90
+ for (let j = 0; j < pendingBatch.length; j++) {
91
+ const sym = pendingBatch[j];
92
+ if (sym)
93
+ insertEmbed.run(sym.id, JSON.stringify(embeddings[j]));
94
+ }
95
+ })();
96
+ }
97
+ }
98
+ // ─── Documentation section embeddings ─────────────────────────────────────────
99
+ async function embedDocumentation(db, embedder, docIds) {
100
+ db.exec(`
101
+ CREATE VIRTUAL TABLE IF NOT EXISTS doc_section_embeddings USING vec0(
102
+ embedding FLOAT[${embedder.dims}]
103
+ );
104
+ `);
105
+ let sections;
106
+ if (docIds && docIds.length > 0) {
107
+ sections = db.prepare(`SELECT id, title, content
108
+ FROM doc_sections
109
+ WHERE doc_id IN (${docIds.map(() => '?').join(', ')})
110
+ ORDER BY id`).all(...docIds);
111
+ }
112
+ else {
113
+ sections = db.prepare(`SELECT id, title, content
114
+ FROM doc_sections
115
+ ORDER BY id`).all();
116
+ }
117
+ if (sections.length === 0)
118
+ return;
119
+ const insertEmbed = db.prepare('INSERT OR REPLACE INTO doc_section_embeddings(rowid, embedding) VALUES (CAST(? AS INTEGER), json(?))');
120
+ // P4: Pipeline — start embedding the next batch while writing the current one.
121
+ let pendingEmbed = null;
122
+ let pendingBatch = [];
123
+ for (let i = 0; i < sections.length; i += EMBED_BATCH_SIZE) {
124
+ const batch = sections.slice(i, i + EMBED_BATCH_SIZE);
125
+ const texts = batch.map(section => section.content || section.title);
126
+ if (pendingEmbed) {
127
+ const embeddings = await pendingEmbed;
128
+ db.transaction(() => {
129
+ for (let j = 0; j < pendingBatch.length; j++) {
130
+ const section = pendingBatch[j];
131
+ if (section)
132
+ insertEmbed.run(section.id, JSON.stringify(embeddings[j]));
133
+ }
134
+ })();
135
+ }
136
+ pendingEmbed = embedder.embed(texts);
137
+ pendingBatch = batch;
138
+ }
139
+ if (pendingEmbed) {
140
+ const embeddings = await pendingEmbed;
141
+ db.transaction(() => {
142
+ for (let j = 0; j < pendingBatch.length; j++) {
143
+ const section = pendingBatch[j];
144
+ if (section)
145
+ insertEmbed.run(section.id, JSON.stringify(embeddings[j]));
146
+ }
147
+ })();
148
+ }
149
+ }
150
+ // ─── Commit message embeddings ────────────────────────────────────────────────
151
+ async function embedCommitMessages(db, embedder) {
152
+ const commits = db.prepare(`SELECT c.rowid, c.message
153
+ FROM commits c
154
+ LEFT JOIN commit_embeddings ce ON ce.rowid = c.rowid
155
+ WHERE length(trim(c.message)) > 0
156
+ AND ce.rowid IS NULL
157
+ ORDER BY c.rowid`).all();
158
+ if (commits.length === 0)
159
+ return;
160
+ const insertEmbed = db.prepare('INSERT OR REPLACE INTO commit_embeddings(rowid, embedding) VALUES (CAST(? AS INTEGER), json(?))');
161
+ // P4: Pipeline — start embedding the next batch while writing the current one.
162
+ let pendingEmbed = null;
163
+ let pendingBatch = [];
164
+ for (let i = 0; i < commits.length; i += EMBED_BATCH_SIZE) {
165
+ const batch = commits.slice(i, i + EMBED_BATCH_SIZE);
166
+ if (pendingEmbed) {
167
+ const embeddings = await pendingEmbed;
168
+ db.transaction(() => {
169
+ for (let j = 0; j < pendingBatch.length; j++) {
170
+ const commit = pendingBatch[j];
171
+ if (commit)
172
+ insertEmbed.run(commit.rowid, JSON.stringify(embeddings[j]));
173
+ }
174
+ })();
175
+ }
176
+ pendingEmbed = embedder.embed(batch.map((commit) => commit.message));
177
+ pendingBatch = batch;
178
+ }
179
+ if (pendingEmbed) {
180
+ const embeddings = await pendingEmbed;
181
+ db.transaction(() => {
182
+ for (let j = 0; j < pendingBatch.length; j++) {
183
+ const commit = pendingBatch[j];
184
+ if (commit)
185
+ insertEmbed.run(commit.rowid, JSON.stringify(embeddings[j]));
186
+ }
187
+ })();
188
+ }
189
+ }
190
+ // ─── Update-mode helpers ──────────────────────────────────────────────────────
191
+ function deleteSymbolEmbeddings(db, symbolIds) {
192
+ if (symbolIds.length === 0)
193
+ return;
194
+ const hasTable = db.prepare("SELECT 1 AS present FROM sqlite_master WHERE type IN ('table', 'virtual table') AND name = 'symbol_embeddings'").get();
195
+ if (!hasTable)
196
+ return;
197
+ db.prepare(`DELETE FROM symbol_embeddings WHERE rowid IN (${symbolIds.map(() => '?').join(', ')})`).run(...symbolIds);
198
+ }
199
+ function resolveFileIds(db, paths, branch) {
200
+ const ids = [];
201
+ for (const p of paths) {
202
+ const row = db.prepare('SELECT id FROM files WHERE path = ? AND branch = ?').get(p, branch);
203
+ if (row)
204
+ ids.push(row.id);
205
+ }
206
+ return ids;
207
+ }
208
+ function resolveDocIds(db, paths, branch) {
209
+ const ids = [];
210
+ for (const p of paths) {
211
+ const row = db.prepare('SELECT id FROM docs WHERE path = ? AND branch = ?').get(p, branch);
212
+ if (row)
213
+ ids.push(row.id);
214
+ }
215
+ return ids;
216
+ }
217
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../../src/indexer/stages/embedding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAE9D,0CAA0C;AAC1C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,WAAW,CAAC;IAE5B,KAAK,CAAC,OAAO,CAAC,OAAwB,EAAE,IAAwB;QAC9D,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAO;QAE9B,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAEzE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,8EAA8E;YAC9E,sBAAsB,CAAC,EAAE,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;YAEnD,yDAAyD;YACzD,MAAM,cAAc,GAAG,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAEjF,MAAM,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;YACpD,MAAM,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACpC,MAAM,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,iFAAiF;AAEjF,KAAK,UAAU,eAAe,CAC5B,EAAqB,EACrB,QAA2B,EAC3B,OAAkB;IAElB,WAAW,CAAC,EAAE,EAAE,iBAAiB,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvD,WAAW,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,SAAS,GACb;;;;6CAIyC,CAAC;IAE5C,IAAI,OAMF,CAAC;IAEH,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,EAAE;aACT,OAAO,CACN,GAAG,SAAS,oBAAoB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACrE;aACA,GAAG,CAAC,GAAG,OAAO,CAAmB,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,EAAoB,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,iGAAiG,CAClG,CAAC;IAEF,+EAA+E;IAC/E,IAAI,YAAY,GAA+B,IAAI,CAAC;IACpD,IAAI,YAAY,GAAmB,EAAE,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACjC,4BAA4B,CAAC;YAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,qBAAqB,EAAE,MAAM,CAAC,uBAAuB;YACrD,kBAAkB,EAAE,MAAM,CAAC,oBAAoB;SAChD,CAAC,CACH,CAAC;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;YACtC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,GAAG;wBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QAED,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;QACtC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,GAAG;oBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,kBAAkB,CAC/B,EAAqB,EACrB,QAA2B,EAC3B,MAAiB;IAEjB,EAAE,CAAC,IAAI,CAAC;;wBAEc,QAAQ,CAAC,IAAI;;GAElC,CAAC,CAAC;IAEH,IAAI,QAA+D,CAAC;IACpE,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,QAAQ,GAAG,EAAE,CAAC,OAAO,CACnB;;0BAEoB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;mBACvC,CACd,CAAC,GAAG,CAAC,GAAG,MAAM,CAAoB,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,EAAE,CAAC,OAAO,CACnB;;mBAEa,CACd,CAAC,GAAG,EAAqB,CAAC;IAC7B,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,sGAAsG,CACvG,CAAC;IAEF,+EAA+E;IAC/E,IAAI,YAAY,GAA+B,IAAI,CAAC;IACpD,IAAI,YAAY,GAAoB,EAAE,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAErE,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;YACtC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAChC,IAAI,OAAO;wBAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QAED,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;QACtC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,OAAO;oBAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,mBAAmB,CAChC,EAAqB,EACrB,QAA2B;IAE3B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB;;;;;sBAKkB,CACnB,CAAC,GAAG,EAA+C,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,iGAAiG,CAClG,CAAC;IAEF,+EAA+E;IAC/E,IAAI,YAAY,GAA+B,IAAI,CAAC;IACpD,IAAI,YAAY,GAAmB,EAAE,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAErD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;YACtC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC/B,IAAI,MAAM;wBAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QAED,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;QACtC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,MAAM;oBAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,sBAAsB,CAAC,EAAqB,EAAE,SAAmB;IACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,gHAAgH,CACjH,CAAC,GAAG,EAAqC,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,EAAE,CAAC,OAAO,CACR,iDAAiD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxF,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,cAAc,CAAC,EAAqB,EAAE,KAAe,EAAE,MAAc;IAC5E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAA+B,CAAC;QAC1H,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB,EAAE,KAAe,EAAE,MAAc;IAC3E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAA+B,CAAC;QACzH,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module indexer/stages/import-resolution
3
+ *
4
+ * Pipeline stage: resolve raw import strings to file IDs (internal) or
5
+ * external package names. Populates `file_imports.resolved_id` and
6
+ * `external_deps` rows.
7
+ */
8
+ import type { PipelineContext, PipelineStage } from '../pipeline.js';
9
+ /**
10
+ * Resolves raw imports in `file_imports` to internal file IDs (`resolved_id`)
11
+ * or external package names (`external_deps`).
12
+ */
13
+ export declare class ImportResolutionStage implements PipelineStage {
14
+ readonly name = "import-resolution";
15
+ execute(context: PipelineContext, _mode: 'build' | 'update'): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=import-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-resolution.d.ts","sourceRoot":"","sources":["../../../src/indexer/stages/import-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAKrE;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,aAAa;IACzD,QAAQ,CAAC,IAAI,uBAAuB;IAE9B,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAsDlF"}