@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.
- package/LICENSE +21 -0
- package/README.md +285 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/adapters/filesystem/fs-adapter.d.ts +50 -0
- package/dist/adapters/filesystem/fs-adapter.d.ts.map +1 -0
- package/dist/adapters/filesystem/fs-adapter.js +168 -0
- package/dist/adapters/filesystem/fs-adapter.js.map +1 -0
- package/dist/adapters/filesystem/sensitive.d.ts +26 -0
- package/dist/adapters/filesystem/sensitive.d.ts.map +1 -0
- package/dist/adapters/filesystem/sensitive.js +67 -0
- package/dist/adapters/filesystem/sensitive.js.map +1 -0
- package/dist/adapters/git/git-adapter.d.ts +47 -0
- package/dist/adapters/git/git-adapter.d.ts.map +1 -0
- package/dist/adapters/git/git-adapter.js +109 -0
- package/dist/adapters/git/git-adapter.js.map +1 -0
- package/dist/adapters/language/json/adapter.d.ts +24 -0
- package/dist/adapters/language/json/adapter.d.ts.map +1 -0
- package/dist/adapters/language/json/adapter.js +54 -0
- package/dist/adapters/language/json/adapter.js.map +1 -0
- package/dist/adapters/language/markdown/adapter.d.ts +41 -0
- package/dist/adapters/language/markdown/adapter.d.ts.map +1 -0
- package/dist/adapters/language/markdown/adapter.js +124 -0
- package/dist/adapters/language/markdown/adapter.js.map +1 -0
- package/dist/adapters/language/package-json/adapter.d.ts +47 -0
- package/dist/adapters/language/package-json/adapter.d.ts.map +1 -0
- package/dist/adapters/language/package-json/adapter.js +153 -0
- package/dist/adapters/language/package-json/adapter.js.map +1 -0
- package/dist/adapters/language/registry.d.ts +35 -0
- package/dist/adapters/language/registry.d.ts.map +1 -0
- package/dist/adapters/language/registry.js +79 -0
- package/dist/adapters/language/registry.js.map +1 -0
- package/dist/adapters/language/ts-js/adapter.d.ts +14 -0
- package/dist/adapters/language/ts-js/adapter.d.ts.map +1 -0
- package/dist/adapters/language/ts-js/adapter.js +59 -0
- package/dist/adapters/language/ts-js/adapter.js.map +1 -0
- package/dist/adapters/language/ts-js/extractor.d.ts +21 -0
- package/dist/adapters/language/ts-js/extractor.d.ts.map +1 -0
- package/dist/adapters/language/ts-js/extractor.js +779 -0
- package/dist/adapters/language/ts-js/extractor.js.map +1 -0
- package/dist/adapters/language/ts-js/lexer.d.ts +30 -0
- package/dist/adapters/language/ts-js/lexer.d.ts.map +1 -0
- package/dist/adapters/language/ts-js/lexer.js +446 -0
- package/dist/adapters/language/ts-js/lexer.js.map +1 -0
- package/dist/adapters/language/ts-js/package-signals.d.ts +5 -0
- package/dist/adapters/language/ts-js/package-signals.d.ts.map +1 -0
- package/dist/adapters/language/ts-js/package-signals.js +113 -0
- package/dist/adapters/language/ts-js/package-signals.js.map +1 -0
- package/dist/adapters/language/tsconfig/adapter.d.ts +38 -0
- package/dist/adapters/language/tsconfig/adapter.d.ts.map +1 -0
- package/dist/adapters/language/tsconfig/adapter.js +130 -0
- package/dist/adapters/language/tsconfig/adapter.js.map +1 -0
- package/dist/adapters/language/types.d.ts +152 -0
- package/dist/adapters/language/types.d.ts.map +1 -0
- package/dist/adapters/language/types.js +51 -0
- package/dist/adapters/language/types.js.map +1 -0
- package/dist/agent-context.d.ts +122 -0
- package/dist/agent-context.d.ts.map +1 -0
- package/dist/agent-context.js +243 -0
- package/dist/agent-context.js.map +1 -0
- package/dist/config/defaults.d.ts +13 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +98 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/load.d.ts +25 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +106 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +95 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +8 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validate.d.ts +15 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +202 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/core/architecture/detector.d.ts +10 -0
- package/dist/core/architecture/detector.d.ts.map +1 -0
- package/dist/core/architecture/detector.js +37 -0
- package/dist/core/architecture/detector.js.map +1 -0
- package/dist/core/architecture/entry-points.d.ts +20 -0
- package/dist/core/architecture/entry-points.d.ts.map +1 -0
- package/dist/core/architecture/entry-points.js +190 -0
- package/dist/core/architecture/entry-points.js.map +1 -0
- package/dist/core/architecture/role-detector.d.ts +32 -0
- package/dist/core/architecture/role-detector.d.ts.map +1 -0
- package/dist/core/architecture/role-detector.js +240 -0
- package/dist/core/architecture/role-detector.js.map +1 -0
- package/dist/core/context/explain.d.ts +36 -0
- package/dist/core/context/explain.d.ts.map +1 -0
- package/dist/core/context/explain.js +199 -0
- package/dist/core/context/explain.js.map +1 -0
- package/dist/core/context/repository-context.d.ts +16 -0
- package/dist/core/context/repository-context.d.ts.map +1 -0
- package/dist/core/context/repository-context.js +134 -0
- package/dist/core/context/repository-context.js.map +1 -0
- package/dist/core/context/types.d.ts +94 -0
- package/dist/core/context/types.d.ts.map +1 -0
- package/dist/core/context/types.js +2 -0
- package/dist/core/context/types.js.map +1 -0
- package/dist/core/conventions/detector.d.ts +55 -0
- package/dist/core/conventions/detector.d.ts.map +1 -0
- package/dist/core/conventions/detector.js +438 -0
- package/dist/core/conventions/detector.js.map +1 -0
- package/dist/core/conventions/renderer.d.ts +16 -0
- package/dist/core/conventions/renderer.d.ts.map +1 -0
- package/dist/core/conventions/renderer.js +42 -0
- package/dist/core/conventions/renderer.js.map +1 -0
- package/dist/core/decisions/detector.d.ts +45 -0
- package/dist/core/decisions/detector.d.ts.map +1 -0
- package/dist/core/decisions/detector.js +256 -0
- package/dist/core/decisions/detector.js.map +1 -0
- package/dist/core/diff/differ.d.ts +26 -0
- package/dist/core/diff/differ.d.ts.map +1 -0
- package/dist/core/diff/differ.js +159 -0
- package/dist/core/diff/differ.js.map +1 -0
- package/dist/core/git-analysis/activity.d.ts +35 -0
- package/dist/core/git-analysis/activity.d.ts.map +1 -0
- package/dist/core/git-analysis/activity.js +123 -0
- package/dist/core/git-analysis/activity.js.map +1 -0
- package/dist/core/graph/aliases.d.ts +20 -0
- package/dist/core/graph/aliases.d.ts.map +1 -0
- package/dist/core/graph/aliases.js +99 -0
- package/dist/core/graph/aliases.js.map +1 -0
- package/dist/core/graph/knowledge-graph.d.ts +91 -0
- package/dist/core/graph/knowledge-graph.d.ts.map +1 -0
- package/dist/core/graph/knowledge-graph.js +572 -0
- package/dist/core/graph/knowledge-graph.js.map +1 -0
- package/dist/core/graph/modules.d.ts +28 -0
- package/dist/core/graph/modules.d.ts.map +1 -0
- package/dist/core/graph/modules.js +139 -0
- package/dist/core/graph/modules.js.map +1 -0
- package/dist/core/graph/resolver.d.ts +50 -0
- package/dist/core/graph/resolver.d.ts.map +1 -0
- package/dist/core/graph/resolver.js +180 -0
- package/dist/core/graph/resolver.js.map +1 -0
- package/dist/core/scanner/cache.d.ts +49 -0
- package/dist/core/scanner/cache.d.ts.map +1 -0
- package/dist/core/scanner/cache.js +101 -0
- package/dist/core/scanner/cache.js.map +1 -0
- package/dist/core/scanner/scanner.d.ts +60 -0
- package/dist/core/scanner/scanner.d.ts.map +1 -0
- package/dist/core/scanner/scanner.js +304 -0
- package/dist/core/scanner/scanner.js.map +1 -0
- package/dist/core/scanner/types.d.ts +47 -0
- package/dist/core/scanner/types.d.ts.map +1 -0
- package/dist/core/scanner/types.js +18 -0
- package/dist/core/scanner/types.js.map +1 -0
- package/dist/core/search/analyzer.d.ts +16 -0
- package/dist/core/search/analyzer.d.ts.map +1 -0
- package/dist/core/search/analyzer.js +165 -0
- package/dist/core/search/analyzer.js.map +1 -0
- package/dist/core/search/bm25.d.ts +21 -0
- package/dist/core/search/bm25.d.ts.map +1 -0
- package/dist/core/search/bm25.js +108 -0
- package/dist/core/search/bm25.js.map +1 -0
- package/dist/core/search/documents.d.ts +20 -0
- package/dist/core/search/documents.d.ts.map +1 -0
- package/dist/core/search/documents.js +106 -0
- package/dist/core/search/documents.js.map +1 -0
- package/dist/core/search/service.d.ts +30 -0
- package/dist/core/search/service.d.ts.map +1 -0
- package/dist/core/search/service.js +54 -0
- package/dist/core/search/service.js.map +1 -0
- package/dist/core/search/types.d.ts +44 -0
- package/dist/core/search/types.d.ts.map +1 -0
- package/dist/core/search/types.js +2 -0
- package/dist/core/search/types.js.map +1 -0
- package/dist/core/serialization/documents.d.ts +26 -0
- package/dist/core/serialization/documents.d.ts.map +1 -0
- package/dist/core/serialization/documents.js +224 -0
- package/dist/core/serialization/documents.js.map +1 -0
- package/dist/core/serialization/reader.d.ts +22 -0
- package/dist/core/serialization/reader.d.ts.map +1 -0
- package/dist/core/serialization/reader.js +65 -0
- package/dist/core/serialization/reader.js.map +1 -0
- package/dist/core/serialization/types.d.ts +184 -0
- package/dist/core/serialization/types.d.ts.map +1 -0
- package/dist/core/serialization/types.js +2 -0
- package/dist/core/serialization/types.js.map +1 -0
- package/dist/core/serialization/writer.d.ts +17 -0
- package/dist/core/serialization/writer.d.ts.map +1 -0
- package/dist/core/serialization/writer.js +64 -0
- package/dist/core/serialization/writer.js.map +1 -0
- package/dist/core/workspace/package-facts.d.ts +12 -0
- package/dist/core/workspace/package-facts.d.ts.map +1 -0
- package/dist/core/workspace/package-facts.js +50 -0
- package/dist/core/workspace/package-facts.js.map +1 -0
- package/dist/core/workspace/workspace.d.ts +32 -0
- package/dist/core/workspace/workspace.d.ts.map +1 -0
- package/dist/core/workspace/workspace.js +167 -0
- package/dist/core/workspace/workspace.js.map +1 -0
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +64 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/diagnostics.d.ts +64 -0
- package/dist/logging/diagnostics.d.ts.map +1 -0
- package/dist/logging/diagnostics.js +92 -0
- package/dist/logging/diagnostics.js.map +1 -0
- package/dist/model/canonical.d.ts +24 -0
- package/dist/model/canonical.d.ts.map +1 -0
- package/dist/model/canonical.js +69 -0
- package/dist/model/canonical.js.map +1 -0
- package/dist/model/schema.d.ts +37 -0
- package/dist/model/schema.d.ts.map +1 -0
- package/dist/model/schema.js +42 -0
- package/dist/model/schema.js.map +1 -0
- package/dist/model/types.d.ts +402 -0
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +10 -0
- package/dist/model/types.js.map +1 -0
- package/dist/pipeline/scan-pipeline.d.ts +69 -0
- package/dist/pipeline/scan-pipeline.d.ts.map +1 -0
- package/dist/pipeline/scan-pipeline.js +270 -0
- package/dist/pipeline/scan-pipeline.js.map +1 -0
- package/dist/util/concurrency.d.ts +17 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +46 -0
- package/dist/util/concurrency.js.map +1 -0
- package/dist/util/glob.d.ts +26 -0
- package/dist/util/glob.d.ts.map +1 -0
- package/dist/util/glob.js +198 -0
- package/dist/util/glob.js.map +1 -0
- package/dist/util/paths.d.ts +23 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +115 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/text.d.ts +22 -0
- package/dist/util/text.d.ts.map +1 -0
- package/dist/util/text.js +66 -0
- package/dist/util/text.js.map +1 -0
- 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 @@
|
|
|
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"}
|