@ai-agent-context/core 0.1.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 (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +285 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/adapters/filesystem/fs-adapter.d.ts +50 -0
  5. package/dist/adapters/filesystem/fs-adapter.d.ts.map +1 -0
  6. package/dist/adapters/filesystem/fs-adapter.js +168 -0
  7. package/dist/adapters/filesystem/fs-adapter.js.map +1 -0
  8. package/dist/adapters/filesystem/sensitive.d.ts +26 -0
  9. package/dist/adapters/filesystem/sensitive.d.ts.map +1 -0
  10. package/dist/adapters/filesystem/sensitive.js +67 -0
  11. package/dist/adapters/filesystem/sensitive.js.map +1 -0
  12. package/dist/adapters/git/git-adapter.d.ts +47 -0
  13. package/dist/adapters/git/git-adapter.d.ts.map +1 -0
  14. package/dist/adapters/git/git-adapter.js +109 -0
  15. package/dist/adapters/git/git-adapter.js.map +1 -0
  16. package/dist/adapters/language/json/adapter.d.ts +24 -0
  17. package/dist/adapters/language/json/adapter.d.ts.map +1 -0
  18. package/dist/adapters/language/json/adapter.js +54 -0
  19. package/dist/adapters/language/json/adapter.js.map +1 -0
  20. package/dist/adapters/language/markdown/adapter.d.ts +41 -0
  21. package/dist/adapters/language/markdown/adapter.d.ts.map +1 -0
  22. package/dist/adapters/language/markdown/adapter.js +124 -0
  23. package/dist/adapters/language/markdown/adapter.js.map +1 -0
  24. package/dist/adapters/language/package-json/adapter.d.ts +47 -0
  25. package/dist/adapters/language/package-json/adapter.d.ts.map +1 -0
  26. package/dist/adapters/language/package-json/adapter.js +153 -0
  27. package/dist/adapters/language/package-json/adapter.js.map +1 -0
  28. package/dist/adapters/language/registry.d.ts +35 -0
  29. package/dist/adapters/language/registry.d.ts.map +1 -0
  30. package/dist/adapters/language/registry.js +79 -0
  31. package/dist/adapters/language/registry.js.map +1 -0
  32. package/dist/adapters/language/ts-js/adapter.d.ts +14 -0
  33. package/dist/adapters/language/ts-js/adapter.d.ts.map +1 -0
  34. package/dist/adapters/language/ts-js/adapter.js +59 -0
  35. package/dist/adapters/language/ts-js/adapter.js.map +1 -0
  36. package/dist/adapters/language/ts-js/extractor.d.ts +21 -0
  37. package/dist/adapters/language/ts-js/extractor.d.ts.map +1 -0
  38. package/dist/adapters/language/ts-js/extractor.js +779 -0
  39. package/dist/adapters/language/ts-js/extractor.js.map +1 -0
  40. package/dist/adapters/language/ts-js/lexer.d.ts +30 -0
  41. package/dist/adapters/language/ts-js/lexer.d.ts.map +1 -0
  42. package/dist/adapters/language/ts-js/lexer.js +446 -0
  43. package/dist/adapters/language/ts-js/lexer.js.map +1 -0
  44. package/dist/adapters/language/ts-js/package-signals.d.ts +5 -0
  45. package/dist/adapters/language/ts-js/package-signals.d.ts.map +1 -0
  46. package/dist/adapters/language/ts-js/package-signals.js +113 -0
  47. package/dist/adapters/language/ts-js/package-signals.js.map +1 -0
  48. package/dist/adapters/language/tsconfig/adapter.d.ts +38 -0
  49. package/dist/adapters/language/tsconfig/adapter.d.ts.map +1 -0
  50. package/dist/adapters/language/tsconfig/adapter.js +130 -0
  51. package/dist/adapters/language/tsconfig/adapter.js.map +1 -0
  52. package/dist/adapters/language/types.d.ts +152 -0
  53. package/dist/adapters/language/types.d.ts.map +1 -0
  54. package/dist/adapters/language/types.js +51 -0
  55. package/dist/adapters/language/types.js.map +1 -0
  56. package/dist/agent-context.d.ts +122 -0
  57. package/dist/agent-context.d.ts.map +1 -0
  58. package/dist/agent-context.js +243 -0
  59. package/dist/agent-context.js.map +1 -0
  60. package/dist/config/defaults.d.ts +13 -0
  61. package/dist/config/defaults.d.ts.map +1 -0
  62. package/dist/config/defaults.js +98 -0
  63. package/dist/config/defaults.js.map +1 -0
  64. package/dist/config/load.d.ts +25 -0
  65. package/dist/config/load.d.ts.map +1 -0
  66. package/dist/config/load.js +106 -0
  67. package/dist/config/load.js.map +1 -0
  68. package/dist/config/types.d.ts +95 -0
  69. package/dist/config/types.d.ts.map +1 -0
  70. package/dist/config/types.js +8 -0
  71. package/dist/config/types.js.map +1 -0
  72. package/dist/config/validate.d.ts +15 -0
  73. package/dist/config/validate.d.ts.map +1 -0
  74. package/dist/config/validate.js +202 -0
  75. package/dist/config/validate.js.map +1 -0
  76. package/dist/core/architecture/detector.d.ts +10 -0
  77. package/dist/core/architecture/detector.d.ts.map +1 -0
  78. package/dist/core/architecture/detector.js +37 -0
  79. package/dist/core/architecture/detector.js.map +1 -0
  80. package/dist/core/architecture/entry-points.d.ts +20 -0
  81. package/dist/core/architecture/entry-points.d.ts.map +1 -0
  82. package/dist/core/architecture/entry-points.js +190 -0
  83. package/dist/core/architecture/entry-points.js.map +1 -0
  84. package/dist/core/architecture/role-detector.d.ts +32 -0
  85. package/dist/core/architecture/role-detector.d.ts.map +1 -0
  86. package/dist/core/architecture/role-detector.js +240 -0
  87. package/dist/core/architecture/role-detector.js.map +1 -0
  88. package/dist/core/context/explain.d.ts +36 -0
  89. package/dist/core/context/explain.d.ts.map +1 -0
  90. package/dist/core/context/explain.js +199 -0
  91. package/dist/core/context/explain.js.map +1 -0
  92. package/dist/core/context/repository-context.d.ts +16 -0
  93. package/dist/core/context/repository-context.d.ts.map +1 -0
  94. package/dist/core/context/repository-context.js +134 -0
  95. package/dist/core/context/repository-context.js.map +1 -0
  96. package/dist/core/context/types.d.ts +94 -0
  97. package/dist/core/context/types.d.ts.map +1 -0
  98. package/dist/core/context/types.js +2 -0
  99. package/dist/core/context/types.js.map +1 -0
  100. package/dist/core/conventions/detector.d.ts +55 -0
  101. package/dist/core/conventions/detector.d.ts.map +1 -0
  102. package/dist/core/conventions/detector.js +438 -0
  103. package/dist/core/conventions/detector.js.map +1 -0
  104. package/dist/core/conventions/renderer.d.ts +16 -0
  105. package/dist/core/conventions/renderer.d.ts.map +1 -0
  106. package/dist/core/conventions/renderer.js +42 -0
  107. package/dist/core/conventions/renderer.js.map +1 -0
  108. package/dist/core/decisions/detector.d.ts +45 -0
  109. package/dist/core/decisions/detector.d.ts.map +1 -0
  110. package/dist/core/decisions/detector.js +256 -0
  111. package/dist/core/decisions/detector.js.map +1 -0
  112. package/dist/core/diff/differ.d.ts +26 -0
  113. package/dist/core/diff/differ.d.ts.map +1 -0
  114. package/dist/core/diff/differ.js +159 -0
  115. package/dist/core/diff/differ.js.map +1 -0
  116. package/dist/core/git-analysis/activity.d.ts +35 -0
  117. package/dist/core/git-analysis/activity.d.ts.map +1 -0
  118. package/dist/core/git-analysis/activity.js +123 -0
  119. package/dist/core/git-analysis/activity.js.map +1 -0
  120. package/dist/core/graph/aliases.d.ts +20 -0
  121. package/dist/core/graph/aliases.d.ts.map +1 -0
  122. package/dist/core/graph/aliases.js +99 -0
  123. package/dist/core/graph/aliases.js.map +1 -0
  124. package/dist/core/graph/knowledge-graph.d.ts +91 -0
  125. package/dist/core/graph/knowledge-graph.d.ts.map +1 -0
  126. package/dist/core/graph/knowledge-graph.js +572 -0
  127. package/dist/core/graph/knowledge-graph.js.map +1 -0
  128. package/dist/core/graph/modules.d.ts +28 -0
  129. package/dist/core/graph/modules.d.ts.map +1 -0
  130. package/dist/core/graph/modules.js +139 -0
  131. package/dist/core/graph/modules.js.map +1 -0
  132. package/dist/core/graph/resolver.d.ts +50 -0
  133. package/dist/core/graph/resolver.d.ts.map +1 -0
  134. package/dist/core/graph/resolver.js +180 -0
  135. package/dist/core/graph/resolver.js.map +1 -0
  136. package/dist/core/scanner/cache.d.ts +49 -0
  137. package/dist/core/scanner/cache.d.ts.map +1 -0
  138. package/dist/core/scanner/cache.js +101 -0
  139. package/dist/core/scanner/cache.js.map +1 -0
  140. package/dist/core/scanner/scanner.d.ts +60 -0
  141. package/dist/core/scanner/scanner.d.ts.map +1 -0
  142. package/dist/core/scanner/scanner.js +304 -0
  143. package/dist/core/scanner/scanner.js.map +1 -0
  144. package/dist/core/scanner/types.d.ts +47 -0
  145. package/dist/core/scanner/types.d.ts.map +1 -0
  146. package/dist/core/scanner/types.js +18 -0
  147. package/dist/core/scanner/types.js.map +1 -0
  148. package/dist/core/search/analyzer.d.ts +16 -0
  149. package/dist/core/search/analyzer.d.ts.map +1 -0
  150. package/dist/core/search/analyzer.js +165 -0
  151. package/dist/core/search/analyzer.js.map +1 -0
  152. package/dist/core/search/bm25.d.ts +21 -0
  153. package/dist/core/search/bm25.d.ts.map +1 -0
  154. package/dist/core/search/bm25.js +108 -0
  155. package/dist/core/search/bm25.js.map +1 -0
  156. package/dist/core/search/documents.d.ts +20 -0
  157. package/dist/core/search/documents.d.ts.map +1 -0
  158. package/dist/core/search/documents.js +106 -0
  159. package/dist/core/search/documents.js.map +1 -0
  160. package/dist/core/search/service.d.ts +30 -0
  161. package/dist/core/search/service.d.ts.map +1 -0
  162. package/dist/core/search/service.js +54 -0
  163. package/dist/core/search/service.js.map +1 -0
  164. package/dist/core/search/types.d.ts +44 -0
  165. package/dist/core/search/types.d.ts.map +1 -0
  166. package/dist/core/search/types.js +2 -0
  167. package/dist/core/search/types.js.map +1 -0
  168. package/dist/core/serialization/documents.d.ts +26 -0
  169. package/dist/core/serialization/documents.d.ts.map +1 -0
  170. package/dist/core/serialization/documents.js +224 -0
  171. package/dist/core/serialization/documents.js.map +1 -0
  172. package/dist/core/serialization/reader.d.ts +22 -0
  173. package/dist/core/serialization/reader.d.ts.map +1 -0
  174. package/dist/core/serialization/reader.js +65 -0
  175. package/dist/core/serialization/reader.js.map +1 -0
  176. package/dist/core/serialization/types.d.ts +184 -0
  177. package/dist/core/serialization/types.d.ts.map +1 -0
  178. package/dist/core/serialization/types.js +2 -0
  179. package/dist/core/serialization/types.js.map +1 -0
  180. package/dist/core/serialization/writer.d.ts +17 -0
  181. package/dist/core/serialization/writer.d.ts.map +1 -0
  182. package/dist/core/serialization/writer.js +64 -0
  183. package/dist/core/serialization/writer.js.map +1 -0
  184. package/dist/core/workspace/package-facts.d.ts +12 -0
  185. package/dist/core/workspace/package-facts.d.ts.map +1 -0
  186. package/dist/core/workspace/package-facts.js +50 -0
  187. package/dist/core/workspace/package-facts.js.map +1 -0
  188. package/dist/core/workspace/workspace.d.ts +32 -0
  189. package/dist/core/workspace/workspace.d.ts.map +1 -0
  190. package/dist/core/workspace/workspace.js +167 -0
  191. package/dist/core/workspace/workspace.js.map +1 -0
  192. package/dist/errors.d.ts +50 -0
  193. package/dist/errors.d.ts.map +1 -0
  194. package/dist/errors.js +64 -0
  195. package/dist/errors.js.map +1 -0
  196. package/dist/index.d.ts +80 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +66 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/logging/diagnostics.d.ts +64 -0
  201. package/dist/logging/diagnostics.d.ts.map +1 -0
  202. package/dist/logging/diagnostics.js +92 -0
  203. package/dist/logging/diagnostics.js.map +1 -0
  204. package/dist/model/canonical.d.ts +24 -0
  205. package/dist/model/canonical.d.ts.map +1 -0
  206. package/dist/model/canonical.js +69 -0
  207. package/dist/model/canonical.js.map +1 -0
  208. package/dist/model/schema.d.ts +37 -0
  209. package/dist/model/schema.d.ts.map +1 -0
  210. package/dist/model/schema.js +42 -0
  211. package/dist/model/schema.js.map +1 -0
  212. package/dist/model/types.d.ts +402 -0
  213. package/dist/model/types.d.ts.map +1 -0
  214. package/dist/model/types.js +10 -0
  215. package/dist/model/types.js.map +1 -0
  216. package/dist/pipeline/scan-pipeline.d.ts +69 -0
  217. package/dist/pipeline/scan-pipeline.d.ts.map +1 -0
  218. package/dist/pipeline/scan-pipeline.js +270 -0
  219. package/dist/pipeline/scan-pipeline.js.map +1 -0
  220. package/dist/util/concurrency.d.ts +17 -0
  221. package/dist/util/concurrency.d.ts.map +1 -0
  222. package/dist/util/concurrency.js +46 -0
  223. package/dist/util/concurrency.js.map +1 -0
  224. package/dist/util/glob.d.ts +26 -0
  225. package/dist/util/glob.d.ts.map +1 -0
  226. package/dist/util/glob.js +198 -0
  227. package/dist/util/glob.js.map +1 -0
  228. package/dist/util/paths.d.ts +23 -0
  229. package/dist/util/paths.d.ts.map +1 -0
  230. package/dist/util/paths.js +115 -0
  231. package/dist/util/paths.js.map +1 -0
  232. package/dist/util/text.d.ts +22 -0
  233. package/dist/util/text.d.ts.map +1 -0
  234. package/dist/util/text.js +66 -0
  235. package/dist/util/text.js.map +1 -0
  236. package/package.json +52 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * BM25 ranking over repository context nodes.
3
+ *
4
+ * Deterministic: no randomness, no external services, no embeddings. Scoring uses
5
+ * field-weighted term frequencies (title ≫ keywords > body) and exact identifier
6
+ * boosts, so `payment idempotency` ranks `PaymentMustBeIdempotentError` above a
7
+ * file that merely mentions the words.
8
+ */
9
+ import { compareStrings } from "../../model/canonical.js";
10
+ import { analyze, expandQueryTerms, pathSegments, stem } from "./analyzer.js";
11
+ const FIELD_WEIGHT = { title: 3, keywords: 2, body: 1 };
12
+ export class Bm25Index {
13
+ name = 'bm25';
14
+ documents = [];
15
+ documentFrequency = new Map();
16
+ k1;
17
+ b;
18
+ titleBoost;
19
+ identifierBoost;
20
+ averageLength = 0;
21
+ constructor(documents, options = {}) {
22
+ this.k1 = options.k1 ?? 1.2;
23
+ this.b = options.b ?? 0.75;
24
+ this.titleBoost = options.titleBoost ?? 1.35;
25
+ this.identifierBoost = options.identifierBoost ?? 0.9;
26
+ for (const document of documents) {
27
+ const terms = new Map();
28
+ const add = (text, weight) => {
29
+ for (const term of analyze(text, { keepStopWords: true })) {
30
+ terms.set(term, (terms.get(term) ?? 0) + weight);
31
+ }
32
+ };
33
+ add(document.title, FIELD_WEIGHT.title);
34
+ for (const keyword of document.keywords)
35
+ add(keyword, FIELD_WEIGHT.keywords);
36
+ add(document.body, FIELD_WEIGHT.body);
37
+ let length = 0;
38
+ for (const count of terms.values())
39
+ length += count;
40
+ for (const term of terms.keys()) {
41
+ this.documentFrequency.set(term, (this.documentFrequency.get(term) ?? 0) + 1);
42
+ }
43
+ this.documents.push({
44
+ document,
45
+ terms,
46
+ length,
47
+ identifiers: new Set([...analyze(document.title, { keepStopWords: true }), ...pathSegments(document.title)]),
48
+ });
49
+ }
50
+ const total = this.documents.reduce((sum, entry) => sum + entry.length, 0);
51
+ this.averageLength = this.documents.length === 0 ? 1 : Math.max(1, total / this.documents.length);
52
+ }
53
+ get size() {
54
+ return this.documents.length;
55
+ }
56
+ query(query) {
57
+ const limit = query.limit ?? 10;
58
+ const terms = expandQueryTerms(analyze(query.text));
59
+ if (terms.size === 0)
60
+ return [];
61
+ const allowedTypes = query.types === undefined ? null : new Set(query.types);
62
+ const totalDocuments = Math.max(1, this.documents.length);
63
+ const results = [];
64
+ for (const entry of this.documents) {
65
+ if (allowedTypes !== null && !allowedTypes.has(entry.document.type))
66
+ continue;
67
+ let score = 0;
68
+ const matched = [];
69
+ for (const [term, weight] of terms) {
70
+ const frequency = entry.terms.get(term) ?? 0;
71
+ let termScore = 0;
72
+ if (frequency > 0) {
73
+ const documentFrequency = this.documentFrequency.get(term) ?? 0;
74
+ const idf = Math.log(1 + (totalDocuments - documentFrequency + 0.5) / (documentFrequency + 0.5));
75
+ const normalization = 1 - this.b + this.b * (entry.length / this.averageLength);
76
+ const saturation = frequency * (this.k1 + 1);
77
+ termScore = (idf * saturation) / (frequency + this.k1 * normalization);
78
+ matched.push(term);
79
+ }
80
+ else if (entry.identifiers.has(term) || entry.identifiers.has(stem(term))) {
81
+ // Identifier boost: the term appears verbatim in the node name/path.
82
+ termScore = 0.6 * (this.documentFrequency.get(term) === undefined ? 1 : 0.5);
83
+ matched.push(term);
84
+ }
85
+ score += termScore * weight;
86
+ }
87
+ if (score <= 0)
88
+ continue;
89
+ const titleTerms = new Set(analyze(entry.document.title, { keepStopWords: true }));
90
+ for (const term of matched) {
91
+ if (titleTerms.has(term))
92
+ score *= this.titleBoost;
93
+ }
94
+ const positional = matched.filter((term) => pathSegments(entry.document.title).includes(term)).length;
95
+ score += positional * this.identifierBoost;
96
+ const reasons = [];
97
+ if (titleTerms.size > 0)
98
+ reasons.push(`matched ${matched.length} of ${terms.size} query terms`);
99
+ results.push({ document: entry.document, score, matched, reasons });
100
+ }
101
+ results.sort((a, b) => a.score === b.score
102
+ ? compareStrings(a.document.id, b.document.id)
103
+ : b.score - a.score);
104
+ const minimum = query.minScore ?? 0;
105
+ return results.filter((result) => result.score >= minimum).slice(0, limit);
106
+ }
107
+ }
108
+ //# sourceMappingURL=bm25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../../src/core/search/bm25.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Search document construction.
3
+ *
4
+ * Nodes of the knowledge graph are flattened into documents with a title (what the
5
+ * node *is*), keywords (identity: paths, kinds, module ids) and a body (facts:
6
+ * signals, exports, responsibilities, evidence). The same node kinds are exposed
7
+ * by the CLI, the programmatic API and the MCP tools, so `search_context`
8
+ * returns results an agent can act on.
9
+ */
10
+ import type { SearchDocument } from './types.ts';
11
+ import type { KnowledgeGraph } from '../graph/knowledge-graph.ts';
12
+ import type { ParsedFile } from '../../adapters/language/types.ts';
13
+ export interface SearchDocumentInput {
14
+ graph: KnowledgeGraph;
15
+ parsed: Map<string, ParsedFile>;
16
+ }
17
+ export declare function buildSearchDocuments(input: SearchDocumentInput): SearchDocument[];
18
+ /** Compact snippet shown next to a search hit. */
19
+ export declare function snippetFor(document: SearchDocument, limit?: number): string;
20
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/core/search/documents.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAGnE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAyGjF;AAED,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,SAAM,GAAG,MAAM,CAGxE"}
@@ -0,0 +1,106 @@
1
+ import { compareStrings } from "../../model/canonical.js";
2
+ export function buildSearchDocuments(input) {
3
+ const { graph, parsed } = input;
4
+ const documents = [];
5
+ for (const file of graph.repository.files) {
6
+ const facts = parsed.get(file.path);
7
+ const exportedNames = (graph.symbolsByFile.get(file.path) ?? [])
8
+ .filter((symbol) => symbol.exported)
9
+ .map((symbol) => symbol.name)
10
+ .slice(0, 25);
11
+ const bodyParts = [
12
+ `kind: ${file.kind}`,
13
+ `language: ${file.language}`,
14
+ file.moduleId !== null ? `module: ${file.moduleId}` : '',
15
+ file.signals.length > 0 ? `signals: ${file.signals.join(', ')}` : '',
16
+ exportedNames.length > 0 ? `exports: ${exportedNames.join(', ')}` : '',
17
+ facts !== undefined && facts.routes.length > 0
18
+ ? `routes: ${facts.routes.map((route) => `${route.method} ${route.path}`).join(', ')}`
19
+ : '',
20
+ facts !== undefined && facts.imports.length > 0
21
+ ? `imports: ${[...new Set(facts.imports.map((record) => record.specifier))].slice(0, 20).join(', ')}`
22
+ : '',
23
+ ].filter((part) => part.length > 0);
24
+ documents.push({
25
+ id: `file:${file.path}`,
26
+ type: 'file',
27
+ title: file.path,
28
+ body: bodyParts.join('\n'),
29
+ keywords: [file.language, file.kind, file.moduleId ?? '', ...file.signals],
30
+ });
31
+ }
32
+ for (const module of graph.repository.modules) {
33
+ const bodyParts = [
34
+ `path: ${module.path}`,
35
+ `basis: ${module.basis}`,
36
+ module.roles.length > 0 ? `roles: ${module.roles.map((role) => `${role.value} (${role.confidence})`).join(', ')}` : '',
37
+ module.responsibilities.length > 0
38
+ ? `responsibilities: ${module.responsibilities.map((entry) => entry.value).join('; ')}`
39
+ : '',
40
+ module.dependsOn.length > 0 ? `depends on: ${module.dependsOn.join(', ')}` : '',
41
+ module.usedBy.length > 0 ? `used by: ${module.usedBy.join(', ')}` : '',
42
+ module.publicExports.length > 0
43
+ ? `public API: ${module.publicExports.map((entry) => entry.name).join(', ')}`
44
+ : '',
45
+ module.signals.length > 0 ? `signals: ${module.signals.join(', ')}` : '',
46
+ `files: ${module.files.length}`,
47
+ ].filter((part) => part.length > 0);
48
+ documents.push({
49
+ id: `module:${module.id}`,
50
+ type: 'module',
51
+ title: `${module.id} ${module.name}`,
52
+ body: bodyParts.join('\n'),
53
+ keywords: [module.path, module.packageName ?? '', module.basis, ...module.roles.map((role) => role.value)],
54
+ });
55
+ }
56
+ for (const symbol of graph.repository.symbols) {
57
+ const bodyParts = [
58
+ `${symbol.kind} in ${symbol.file} (line ${symbol.line})`,
59
+ symbol.exported ? 'exported' : 'internal',
60
+ symbol.extends.length > 0 ? `extends ${symbol.extends.join(', ')}` : '',
61
+ symbol.implements.length > 0 ? `implements ${symbol.implements.join(', ')}` : '',
62
+ symbol.moduleId !== null ? `module ${symbol.moduleId}` : '',
63
+ ].filter((part) => part.length > 0);
64
+ documents.push({
65
+ id: `symbol:${symbol.id}`,
66
+ type: 'symbol',
67
+ title: symbol.name,
68
+ body: bodyParts.join('\n'),
69
+ keywords: [symbol.file, symbol.kind, symbol.moduleId ?? ''],
70
+ });
71
+ }
72
+ for (const decision of graph.repository.decisions) {
73
+ documents.push({
74
+ id: `decision:${decision.id}`,
75
+ type: 'decision',
76
+ title: decision.title,
77
+ body: [decision.excerpt ?? '', `status: ${decision.status}`, `origin: ${decision.origin}`, decision.source].join('\n'),
78
+ keywords: [decision.id, decision.status, decision.kind],
79
+ });
80
+ }
81
+ for (const convention of graph.repository.conventions) {
82
+ documents.push({
83
+ id: `convention:${convention.id}`,
84
+ type: 'convention',
85
+ title: convention.statement,
86
+ body: [convention.category, ...convention.evidence.map((entry) => `${entry.source}: ${entry.detail}`)].join('\n'),
87
+ keywords: [convention.category, convention.origin],
88
+ });
89
+ }
90
+ for (const entry of graph.repository.entryPoints) {
91
+ documents.push({
92
+ id: `entry-point:${entry.path}:${entry.type}`,
93
+ type: 'entry-point',
94
+ title: `${entry.path} (${entry.type})`,
95
+ body: [entry.details ?? '', ...entry.evidence.map((item) => `${item.source}: ${item.detail}`)].join('\n'),
96
+ keywords: [entry.type, entry.moduleId ?? ''],
97
+ });
98
+ }
99
+ return documents.sort((a, b) => compareStrings(a.id, b.id));
100
+ }
101
+ /** Compact snippet shown next to a search hit. */
102
+ export function snippetFor(document, limit = 160) {
103
+ const text = document.body.replace(/\s+/g, ' ').trim();
104
+ return text.length <= limit ? text : `${text.slice(0, limit - 1).trimEnd()}\u2026`;
105
+ }
106
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/core/search/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Search service.
3
+ *
4
+ * Orchestrates the backend (BM25 by default) and the optional reranker, then
5
+ * projects the hits into `SearchResult` objects with a deterministic `reason`
6
+ * string — an agent must be able to see *why* a node was returned.
7
+ */
8
+ import type { SearchResult } from '../../model/types.ts';
9
+ import { type SearchDocumentInput } from './documents.ts';
10
+ import type { RankedDocument, Reranker, SearchBackend, SearchNodeType } from './types.ts';
11
+ export interface SearchOptions {
12
+ limit?: number;
13
+ types?: SearchNodeType[];
14
+ minScore?: number;
15
+ /** Optional semantic/LLM reranking hook; unused by default (local-first). */
16
+ reranker?: Reranker;
17
+ }
18
+ export declare class SearchService {
19
+ private readonly backend;
20
+ constructor(backend: SearchBackend);
21
+ get backendName(): string;
22
+ /** Builds a service over the knowledge graph with the default BM25 backend. */
23
+ static fromGraph(input: SearchDocumentInput): SearchService;
24
+ /** Builds a service over an explicit backend (embeddings, vector DB, ...). */
25
+ static withBackend(backend: SearchBackend): SearchService;
26
+ search(text: string, options?: SearchOptions): Promise<SearchResult[]>;
27
+ }
28
+ /** Maps a ranked document onto the public, agent-facing result shape. */
29
+ export declare function toSearchResult(ranked: RankedDocument, backendName: string): SearchResult;
30
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/search/service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAoC,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAEvG,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAE5B,OAAO,EAAE,aAAa;IAIlC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,+EAA+E;IAC/E,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,mBAAmB,GAAG,aAAa;IAI3D,8EAA8E;IAC9E,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa;IAInD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAWjF;AAID,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAiBxF"}
@@ -0,0 +1,54 @@
1
+ import { compareStrings } from "../../model/canonical.js";
2
+ import { Bm25Index } from "./bm25.js";
3
+ import { buildSearchDocuments, snippetFor } from "./documents.js";
4
+ export class SearchService {
5
+ backend;
6
+ constructor(backend) {
7
+ this.backend = backend;
8
+ }
9
+ get backendName() {
10
+ return this.backend.name;
11
+ }
12
+ /** Builds a service over the knowledge graph with the default BM25 backend. */
13
+ static fromGraph(input) {
14
+ return new SearchService(new Bm25Index(buildSearchDocuments(input)));
15
+ }
16
+ /** Builds a service over an explicit backend (embeddings, vector DB, ...). */
17
+ static withBackend(backend) {
18
+ return new SearchService(backend);
19
+ }
20
+ async search(text, options = {}) {
21
+ const query = { text, limit: options.limit ?? 10 };
22
+ if (options.types !== undefined)
23
+ query.types = options.types;
24
+ if (options.minScore !== undefined)
25
+ query.minScore = options.minScore;
26
+ let ranked = this.backend.query(query);
27
+ if (options.reranker !== undefined && ranked.length > 0) {
28
+ ranked = await options.reranker(query, ranked);
29
+ }
30
+ return ranked.map((entry) => toSearchResult(entry, this.backend.name));
31
+ }
32
+ }
33
+ const STOP_WORD_FILTER = new Set(['and', 'the', 'of', 'in', 'is', 'to', 'for', 'with']);
34
+ /** Maps a ranked document onto the public, agent-facing result shape. */
35
+ export function toSearchResult(ranked, backendName) {
36
+ const matched = ranked.matched.filter((term) => !STOP_WORD_FILTER.has(term)).sort(compareStrings);
37
+ const reasonParts = [
38
+ matched.length > 0 ? `matched terms: ${matched.join(', ')}` : 'matched by identifier',
39
+ ...ranked.reasons,
40
+ `ranked by ${backendName}`,
41
+ ];
42
+ const [type, ...idParts] = ranked.document.id.split(':');
43
+ const result = {
44
+ type: (type ?? 'file'),
45
+ id: idParts.join(':'),
46
+ score: Math.round(ranked.score * 10_000) / 10_000,
47
+ reason: reasonParts.filter((part) => part.length > 0).join('; '),
48
+ };
49
+ const snippet = snippetFor(ranked.document);
50
+ if (snippet.length > 0)
51
+ result.snippet = snippet;
52
+ return result;
53
+ }
54
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/core/search/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Deterministic lexical search.
3
+ *
4
+ * No embeddings, no LLM, no network: tokens are extracted with a small
5
+ * language-aware analyzer, expanded with a synonym map and scored with BM25 over
6
+ * per-node documents. An optional {@link Reranker} hook (LLM, embeddings, vector
7
+ * database) can be plugged in later without touching the index or the callers.
8
+ */
9
+ import type { SearchResult } from '../../model/types.ts';
10
+ export type SearchNodeType = SearchResult['type'];
11
+ export interface SearchDocument {
12
+ id: string;
13
+ type: SearchNodeType;
14
+ /** Primary text (path, symbol name, statement, ...). */
15
+ title: string;
16
+ /** Secondary text used for matching but not for identifier boosting. */
17
+ body: string;
18
+ /** Extra keywords: module ids, paths, kinds. */
19
+ keywords: string[];
20
+ }
21
+ export interface SearchQuery {
22
+ text: string;
23
+ limit?: number;
24
+ /** Restrict results to specific node types. */
25
+ types?: SearchNodeType[];
26
+ /** Minimum score below which results are dropped. */
27
+ minScore?: number;
28
+ }
29
+ export interface RankedDocument {
30
+ document: SearchDocument;
31
+ score: number;
32
+ /** Matched terms, sorted by weight contribution. */
33
+ matched: string[];
34
+ /** Reasons the ranking backend wants to surface. */
35
+ reasons: string[];
36
+ }
37
+ /** Pluggable ranking backend. `Bm25Index` is the deterministic default. */
38
+ export interface SearchBackend {
39
+ readonly name: string;
40
+ query(query: SearchQuery): RankedDocument[];
41
+ }
42
+ /** Optional post-processing hook (LLM reranking, vector search, ...). */
43
+ export type Reranker = (query: SearchQuery, results: RankedDocument[]) => Promise<RankedDocument[]>;
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/search/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oDAAoD;IACpD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,EAAE,CAAC;CAC7C;AAED,yEAAyE;AACzE,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/search/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Builders for the canonical `.agent/` documents.
3
+ *
4
+ * Determinism rules: arrays are sorted by stable keys, absolute paths never leak
5
+ * into the output, and timestamps are optional (`output.includeTimestamp`).
6
+ */
7
+ import type { KnowledgeGraph } from '../graph/knowledge-graph.ts';
8
+ import type { ParsedFile } from '../../adapters/language/types.ts';
9
+ import type { AgentContextConfig } from '../../config/types.ts';
10
+ import type { ArchitectureDocument, ContextDocuments, DecisionsDocument, DependenciesDocument, DocumentBuildOptions, IndexDocument, ConventionsDocument } from './types.ts';
11
+ /** Builds the `index.json` manifest. */
12
+ export declare function buildIndexDocument(graph: KnowledgeGraph, parsed: Map<string, ParsedFile>, config: AgentContextConfig, options: DocumentBuildOptions): IndexDocument;
13
+ /** Builds `architecture.json`. */
14
+ export declare function buildArchitectureDocument(graph: KnowledgeGraph, config: AgentContextConfig, options: DocumentBuildOptions): ArchitectureDocument;
15
+ /** Builds `dependencies.json` (module edges, external packages, per-file imports). */
16
+ export declare function buildDependenciesDocument(graph: KnowledgeGraph, config: AgentContextConfig, options: DocumentBuildOptions): DependenciesDocument;
17
+ /** Builds `conventions.json` and the human readable `conventions.md` projection. */
18
+ export declare function buildConventionsDocuments(graph: KnowledgeGraph, config: AgentContextConfig, options: DocumentBuildOptions): {
19
+ document: ConventionsDocument;
20
+ markdown: string;
21
+ };
22
+ /** Builds `decisions.json`. */
23
+ export declare function buildDecisionsDocument(graph: KnowledgeGraph, options: DocumentBuildOptions): DecisionsDocument;
24
+ /** Builds every canonical document in one pass. */
25
+ export declare function buildContextDocuments(graph: KnowledgeGraph, parsed: Map<string, ParsedFile>, config: AgentContextConfig, options: DocumentBuildOptions): ContextDocuments;
26
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/core/serialization/documents.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIhE,OAAO,KAAK,EACV,oBAAoB,EAEpB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAMpB,wCAAwC;AACxC,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC/B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAuDf;AAED,kCAAkC;AAClC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAuDtB;AAID,sFAAsF;AACtF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAmEtB;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,oBAAoB,GAC5B;IAAE,QAAQ,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAiBrD;AAED,+BAA+B;AAC/B,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,oBAAoB,GAC5B,iBAAiB,CASnB;AAED,mDAAmD;AACnD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC/B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,gBAAgB,CAUlB"}