ds4-context-core 0.1.2 → 0.2.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +20 -4
  2. package/dist/adapter/conformance.d.ts +35 -0
  3. package/dist/adapter/conformance.d.ts.map +1 -0
  4. package/dist/adapter/conformance.js +260 -0
  5. package/dist/adapter/conformance.js.map +1 -0
  6. package/dist/adapter/local-kv.d.ts +125 -0
  7. package/dist/adapter/local-kv.d.ts.map +1 -0
  8. package/dist/adapter/local-kv.js +276 -0
  9. package/dist/adapter/local-kv.js.map +1 -0
  10. package/dist/adapter/runtime-adapter.d.ts +124 -0
  11. package/dist/adapter/runtime-adapter.d.ts.map +1 -0
  12. package/dist/adapter/runtime-adapter.js +289 -0
  13. package/dist/adapter/runtime-adapter.js.map +1 -0
  14. package/dist/config/config-loader.d.ts +1 -0
  15. package/dist/config/config-loader.d.ts.map +1 -1
  16. package/dist/config/config-loader.js +110 -1
  17. package/dist/config/config-loader.js.map +1 -1
  18. package/dist/config/config.d.ts +50 -0
  19. package/dist/config/config.d.ts.map +1 -1
  20. package/dist/config/config.js +31 -0
  21. package/dist/config/config.js.map +1 -1
  22. package/dist/core/canonical-message.d.ts +2 -1
  23. package/dist/core/canonical-message.d.ts.map +1 -1
  24. package/dist/index.d.ts +13 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +13 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/manifest/context-manifest.d.ts +12 -0
  29. package/dist/manifest/context-manifest.d.ts.map +1 -1
  30. package/dist/memory/memory-manager.d.ts +7 -1
  31. package/dist/memory/memory-manager.d.ts.map +1 -1
  32. package/dist/memory/memory-manager.js +100 -3
  33. package/dist/memory/memory-manager.js.map +1 -1
  34. package/dist/memory/memory-types.d.ts +43 -0
  35. package/dist/memory/memory-types.d.ts.map +1 -1
  36. package/dist/memory/memory-types.js.map +1 -1
  37. package/dist/persistence/migrations.d.ts +2 -1
  38. package/dist/persistence/migrations.d.ts.map +1 -1
  39. package/dist/persistence/migrations.js +155 -25
  40. package/dist/persistence/migrations.js.map +1 -1
  41. package/dist/persistence/repositories/artifact-repository.d.ts +3 -1
  42. package/dist/persistence/repositories/artifact-repository.d.ts.map +1 -1
  43. package/dist/persistence/repositories/artifact-repository.js +16 -27
  44. package/dist/persistence/repositories/artifact-repository.js.map +1 -1
  45. package/dist/persistence/repositories/context-manifest-repository.d.ts +3 -1
  46. package/dist/persistence/repositories/context-manifest-repository.d.ts.map +1 -1
  47. package/dist/persistence/repositories/context-manifest-repository.js +10 -18
  48. package/dist/persistence/repositories/context-manifest-repository.js.map +1 -1
  49. package/dist/persistence/repositories/context-quality-repository.d.ts +21 -0
  50. package/dist/persistence/repositories/context-quality-repository.d.ts.map +1 -0
  51. package/dist/persistence/repositories/context-quality-repository.js +83 -0
  52. package/dist/persistence/repositories/context-quality-repository.js.map +1 -0
  53. package/dist/persistence/repositories/embedding-repository.d.ts +37 -0
  54. package/dist/persistence/repositories/embedding-repository.d.ts.map +1 -0
  55. package/dist/persistence/repositories/embedding-repository.js +142 -0
  56. package/dist/persistence/repositories/embedding-repository.js.map +1 -0
  57. package/dist/persistence/repositories/lease-repository.d.ts +22 -0
  58. package/dist/persistence/repositories/lease-repository.d.ts.map +1 -0
  59. package/dist/persistence/repositories/lease-repository.js +113 -0
  60. package/dist/persistence/repositories/lease-repository.js.map +1 -0
  61. package/dist/persistence/repositories/memory-repository.d.ts +34 -3
  62. package/dist/persistence/repositories/memory-repository.d.ts.map +1 -1
  63. package/dist/persistence/repositories/memory-repository.js +426 -64
  64. package/dist/persistence/repositories/memory-repository.js.map +1 -1
  65. package/dist/persistence/repositories/project-knowledge-repository.d.ts +28 -5
  66. package/dist/persistence/repositories/project-knowledge-repository.d.ts.map +1 -1
  67. package/dist/persistence/repositories/project-knowledge-repository.js +123 -53
  68. package/dist/persistence/repositories/project-knowledge-repository.js.map +1 -1
  69. package/dist/persistence/repositories/session-index-repository.d.ts +9 -1
  70. package/dist/persistence/repositories/session-index-repository.d.ts.map +1 -1
  71. package/dist/persistence/repositories/session-index-repository.js +38 -17
  72. package/dist/persistence/repositories/session-index-repository.js.map +1 -1
  73. package/dist/persistence/repositories/summary-repository.d.ts +3 -1
  74. package/dist/persistence/repositories/summary-repository.d.ts.map +1 -1
  75. package/dist/persistence/repositories/summary-repository.js +35 -31
  76. package/dist/persistence/repositories/summary-repository.js.map +1 -1
  77. package/dist/persistence/sqlite.d.ts +10 -0
  78. package/dist/persistence/sqlite.d.ts.map +1 -1
  79. package/dist/persistence/sqlite.js +41 -12
  80. package/dist/persistence/sqlite.js.map +1 -1
  81. package/dist/persistence/write-coordinator.d.ts +37 -0
  82. package/dist/persistence/write-coordinator.d.ts.map +1 -0
  83. package/dist/persistence/write-coordinator.js +120 -0
  84. package/dist/persistence/write-coordinator.js.map +1 -0
  85. package/dist/planner/context-planner.d.ts +5 -0
  86. package/dist/planner/context-planner.d.ts.map +1 -1
  87. package/dist/planner/context-planner.js +41 -62
  88. package/dist/planner/context-planner.js.map +1 -1
  89. package/dist/project/file-indexer.d.ts +5 -3
  90. package/dist/project/file-indexer.d.ts.map +1 -1
  91. package/dist/project/file-indexer.js +83 -38
  92. package/dist/project/file-indexer.js.map +1 -1
  93. package/dist/project/project-knowledge.d.ts +15 -3
  94. package/dist/project/project-knowledge.d.ts.map +1 -1
  95. package/dist/project/project-knowledge.js +168 -42
  96. package/dist/project/project-knowledge.js.map +1 -1
  97. package/dist/project/symbol-parser.d.ts +48 -0
  98. package/dist/project/symbol-parser.d.ts.map +1 -0
  99. package/dist/project/symbol-parser.js +427 -0
  100. package/dist/project/symbol-parser.js.map +1 -0
  101. package/dist/quality/context-quality.d.ts +172 -0
  102. package/dist/quality/context-quality.d.ts.map +1 -0
  103. package/dist/quality/context-quality.js +624 -0
  104. package/dist/quality/context-quality.js.map +1 -0
  105. package/dist/ranking/learned-ranker.d.ts +174 -0
  106. package/dist/ranking/learned-ranker.d.ts.map +1 -0
  107. package/dist/ranking/learned-ranker.js +782 -0
  108. package/dist/ranking/learned-ranker.js.map +1 -0
  109. package/dist/retrieval/embedding.d.ts +92 -0
  110. package/dist/retrieval/embedding.d.ts.map +1 -0
  111. package/dist/retrieval/embedding.js +56 -0
  112. package/dist/retrieval/embedding.js.map +1 -0
  113. package/dist/retrieval/retrieval-engine.d.ts +9 -1
  114. package/dist/retrieval/retrieval-engine.d.ts.map +1 -1
  115. package/dist/retrieval/retrieval-engine.js +105 -7
  116. package/dist/retrieval/retrieval-engine.js.map +1 -1
  117. package/dist/retrieval/semantic-index.d.ts +30 -0
  118. package/dist/retrieval/semantic-index.d.ts.map +1 -0
  119. package/dist/retrieval/semantic-index.js +284 -0
  120. package/dist/retrieval/semantic-index.js.map +1 -0
  121. package/dist/retrieval/semantic-quality.d.ts +52 -0
  122. package/dist/retrieval/semantic-quality.d.ts.map +1 -0
  123. package/dist/retrieval/semantic-quality.js +117 -0
  124. package/dist/retrieval/semantic-quality.js.map +1 -0
  125. package/package.json +1 -1
@@ -0,0 +1,284 @@
1
+ import { sha256 } from "../shared/hash.js";
2
+ import { disabledSemanticQueryDiagnostics, embeddingProfileKey, validEmbeddingVector, } from "./embedding.js";
3
+ function uniqueWarnings(values) {
4
+ return [...new Set(values)].slice(0, 20);
5
+ }
6
+ function identityFields(identity) {
7
+ return {
8
+ provider: identity.provider,
9
+ model: identity.model,
10
+ dimensions: identity.dimensions,
11
+ destination: identity.destination,
12
+ };
13
+ }
14
+ export class SemanticEmbeddingIndex {
15
+ repository;
16
+ port;
17
+ options;
18
+ gate;
19
+ now;
20
+ indexedAt;
21
+ queryCache = new Map();
22
+ syncByScope = new Map();
23
+ constructor(repository, port, options, gate = (text) => text, now = () => performance.now(), indexedAt = Date.now) {
24
+ this.repository = repository;
25
+ this.port = port;
26
+ this.options = options;
27
+ this.gate = gate;
28
+ this.now = now;
29
+ this.indexedAt = indexedAt;
30
+ }
31
+ get identity() {
32
+ return this.port.identity;
33
+ }
34
+ get sourceLimit() {
35
+ return this.options.maxSources;
36
+ }
37
+ syncSources(kind, scopeId, inputSources, complete) {
38
+ const startedAt = this.now();
39
+ const warnings = [];
40
+ const seen = new Set();
41
+ const sources = [];
42
+ for (const source of inputSources) {
43
+ if (source.kind !== kind || source.scopeId !== scopeId || !source.text.trim())
44
+ continue;
45
+ const key = `${source.sourceKey}\0${source.sourceHash}\0${source.chunkingVersion}`;
46
+ if (seen.has(key))
47
+ continue;
48
+ seen.add(key);
49
+ sources.push(source);
50
+ }
51
+ sources.sort((left, right) => left.sourceKey.localeCompare(right.sourceKey)
52
+ || left.sourceHash.localeCompare(right.sourceHash)
53
+ || left.chunkingVersion.localeCompare(right.chunkingVersion));
54
+ const sourceLimitExceeded = sources.length > this.options.maxSources;
55
+ sources.splice(this.options.maxSources);
56
+ let cachedVectors = 0;
57
+ let indexedVectors = 0;
58
+ let skippedByPrivacy = 0;
59
+ let embeddingCalls = 0;
60
+ let corruptVectors = 0;
61
+ let failed = false;
62
+ let fallbackReason;
63
+ try {
64
+ if (complete && !sourceLimitExceeded) {
65
+ this.repository.pruneSources(kind, scopeId, sources);
66
+ }
67
+ const pending = [];
68
+ for (const source of sources) {
69
+ const existing = this.repository.getVector(kind, scopeId, source.sourceKey, source.sourceHash, source.chunkingVersion, this.port.identity);
70
+ if (existing) {
71
+ cachedVectors++;
72
+ continue;
73
+ }
74
+ const text = this.gate(source.text, {
75
+ purpose: "source",
76
+ kind,
77
+ scopeId,
78
+ sourceKey: source.sourceKey,
79
+ destination: this.port.identity.destination,
80
+ provider: this.port.identity.provider,
81
+ model: this.port.identity.model,
82
+ });
83
+ if (text === undefined) {
84
+ skippedByPrivacy++;
85
+ continue;
86
+ }
87
+ pending.push({ source, text });
88
+ }
89
+ for (let offset = 0; offset < pending.length; offset += this.options.batchSize) {
90
+ const batch = pending.slice(offset, offset + this.options.batchSize);
91
+ const callStartedAt = this.now();
92
+ let vectors;
93
+ try {
94
+ embeddingCalls++;
95
+ vectors = this.port.embed(batch.map((item) => item.text));
96
+ }
97
+ catch (error) {
98
+ failed = true;
99
+ fallbackReason = `embedding provider failure: ${error instanceof Error ? error.message : String(error)}`;
100
+ break;
101
+ }
102
+ const elapsed = Math.max(0, this.now() - callStartedAt);
103
+ if (elapsed > this.options.timeoutMs) {
104
+ failed = true;
105
+ fallbackReason = `embedding timeout after ${Math.round(elapsed)} ms`;
106
+ break;
107
+ }
108
+ if (vectors.length !== batch.length) {
109
+ failed = true;
110
+ fallbackReason = "embedding provider returned an unexpected batch size";
111
+ break;
112
+ }
113
+ const rows = [];
114
+ for (let index = 0; index < batch.length; index++) {
115
+ const item = batch[index];
116
+ const vector = vectors[index];
117
+ if (!item || !vector || !validEmbeddingVector(vector, this.port.identity.dimensions)) {
118
+ corruptVectors++;
119
+ continue;
120
+ }
121
+ rows.push({
122
+ sourceKind: kind,
123
+ scopeId,
124
+ sourceKey: item.source.sourceKey,
125
+ sourceGroup: item.source.sourceGroup,
126
+ sourceHash: item.source.sourceHash,
127
+ chunkingVersion: item.source.chunkingVersion,
128
+ provider: this.port.identity.provider,
129
+ model: this.port.identity.model,
130
+ dimensions: this.port.identity.dimensions,
131
+ vector,
132
+ indexedAt: this.indexedAt(),
133
+ });
134
+ }
135
+ this.repository.upsert(rows);
136
+ indexedVectors += rows.length;
137
+ }
138
+ }
139
+ catch (error) {
140
+ failed = true;
141
+ fallbackReason = `embedding index failure: ${error instanceof Error ? error.message : String(error)}`;
142
+ }
143
+ if (fallbackReason)
144
+ warnings.push(fallbackReason);
145
+ const diagnostics = {
146
+ enabled: true,
147
+ ...identityFields(this.port.identity),
148
+ sourceKind: kind,
149
+ scopeId,
150
+ sourceCount: sources.length,
151
+ cachedVectors,
152
+ indexedVectors,
153
+ skippedByPrivacy,
154
+ embeddingCalls,
155
+ corruptVectors,
156
+ indexFresh: complete && !failed && corruptVectors === 0,
157
+ durationMs: Math.max(0, this.now() - startedAt),
158
+ warnings: uniqueWarnings(warnings),
159
+ ...(fallbackReason ? { fallbackReason } : {}),
160
+ };
161
+ this.syncByScope.set(`${kind}\0${scopeId}`, diagnostics);
162
+ return diagnostics;
163
+ }
164
+ query(kind, scopeId, text, lexicalCandidates) {
165
+ const startedAt = this.now();
166
+ const sync = this.syncByScope.get(`${kind}\0${scopeId}`);
167
+ const base = {
168
+ ...disabledSemanticQueryDiagnostics(true),
169
+ ...identityFields(this.port.identity),
170
+ lexicalCandidates,
171
+ sourceEmbeddingCalls: sync?.embeddingCalls ?? 0,
172
+ indexedVectors: (sync?.cachedVectors ?? 0) + (sync?.indexedVectors ?? 0),
173
+ skippedByPrivacy: sync?.skippedByPrivacy ?? 0,
174
+ corruptVectors: sync?.corruptVectors ?? 0,
175
+ indexFresh: sync?.indexFresh ?? false,
176
+ warnings: [...(sync?.warnings ?? [])],
177
+ };
178
+ const prepared = this.gate(text, {
179
+ purpose: "query",
180
+ kind,
181
+ scopeId,
182
+ destination: this.port.identity.destination,
183
+ provider: this.port.identity.provider,
184
+ model: this.port.identity.model,
185
+ });
186
+ if (prepared === undefined) {
187
+ const fallbackReason = "embedding query excluded by privacy policy";
188
+ return {
189
+ hits: [],
190
+ diagnostics: {
191
+ ...base,
192
+ durationMs: Math.max(0, this.now() - startedAt),
193
+ fallbackReason,
194
+ warnings: uniqueWarnings([...base.warnings, fallbackReason]),
195
+ },
196
+ };
197
+ }
198
+ const cacheKey = sha256(`${embeddingProfileKey(this.port.identity)}\0${prepared}`);
199
+ let vector = this.queryCache.get(cacheKey);
200
+ let queryCacheHit = Boolean(vector);
201
+ let queryEmbeddingCalls = 0;
202
+ let fallbackReason;
203
+ if (!vector) {
204
+ const callStartedAt = this.now();
205
+ try {
206
+ queryEmbeddingCalls = 1;
207
+ const vectors = this.port.embed([prepared]);
208
+ const elapsed = Math.max(0, this.now() - callStartedAt);
209
+ if (elapsed > this.options.timeoutMs) {
210
+ fallbackReason = `embedding timeout after ${Math.round(elapsed)} ms`;
211
+ }
212
+ else if (vectors.length !== 1 || !vectors[0]
213
+ || !validEmbeddingVector(vectors[0], this.port.identity.dimensions)) {
214
+ fallbackReason = "embedding provider returned a corrupt query vector";
215
+ }
216
+ else {
217
+ vector = vectors[0];
218
+ this.queryCache.set(cacheKey, vector);
219
+ while (this.queryCache.size > this.options.queryCacheSize) {
220
+ const oldest = this.queryCache.keys().next().value;
221
+ if (!oldest)
222
+ break;
223
+ this.queryCache.delete(oldest);
224
+ }
225
+ }
226
+ }
227
+ catch (error) {
228
+ fallbackReason = `embedding provider failure: ${error instanceof Error ? error.message : String(error)}`;
229
+ }
230
+ }
231
+ if (!vector) {
232
+ return {
233
+ hits: [],
234
+ diagnostics: {
235
+ ...base,
236
+ queryCacheHit,
237
+ queryEmbeddingCalls,
238
+ durationMs: Math.max(0, this.now() - startedAt),
239
+ ...(fallbackReason ? { fallbackReason } : {}),
240
+ warnings: uniqueWarnings([...base.warnings, ...(fallbackReason ? [fallbackReason] : [])]),
241
+ },
242
+ };
243
+ }
244
+ try {
245
+ const searched = this.repository.searchSimilar(kind, scopeId, this.port.identity, vector, this.options.candidatePool, this.options.maxSources);
246
+ const minimumSimilarity = this.options.minimumSimilarity ?? 0.1;
247
+ const hits = searched.hits.filter((hit) => hit.similarity >= minimumSimilarity);
248
+ if (searched.corruptVectors > 0 && hits.length === 0) {
249
+ fallbackReason = "all matching embedding vectors were corrupt";
250
+ }
251
+ return {
252
+ hits,
253
+ diagnostics: {
254
+ ...base,
255
+ vectorCandidates: hits.length,
256
+ queryCacheHit,
257
+ queryEmbeddingCalls,
258
+ corruptVectors: searched.corruptVectors,
259
+ durationMs: Math.max(0, this.now() - startedAt),
260
+ ...(fallbackReason ? { fallbackReason } : {}),
261
+ warnings: uniqueWarnings([
262
+ ...base.warnings,
263
+ ...(searched.corruptVectors > 0 ? [`${searched.corruptVectors} corrupt embedding vector(s) ignored`] : []),
264
+ ]),
265
+ },
266
+ };
267
+ }
268
+ catch (error) {
269
+ fallbackReason = `vector search failure: ${error instanceof Error ? error.message : String(error)}`;
270
+ return {
271
+ hits: [],
272
+ diagnostics: {
273
+ ...base,
274
+ queryCacheHit,
275
+ queryEmbeddingCalls,
276
+ durationMs: Math.max(0, this.now() - startedAt),
277
+ fallbackReason,
278
+ warnings: uniqueWarnings([...base.warnings, fallbackReason]),
279
+ },
280
+ };
281
+ }
282
+ }
283
+ }
284
+ //# sourceMappingURL=semantic-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-index.js","sourceRoot":"","sources":["../../src/retrieval/semantic-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type EmbeddingPort } from "./embedding.ts";
2
+ export declare const HYBRID_RETRIEVAL_QUALITY_VERSION = "hybrid-retrieval-quality-v1";
3
+ export interface SemanticQualityCandidate {
4
+ id: string;
5
+ text: string;
6
+ tokens: number;
7
+ }
8
+ export interface SemanticQualityFixture {
9
+ id: string;
10
+ query: string;
11
+ exactIdentifiers: string[];
12
+ expectedEvidenceIds: string[];
13
+ maxResults: number;
14
+ candidates: SemanticQualityCandidate[];
15
+ }
16
+ export interface SemanticQualityCorpus {
17
+ corpusVersion: string;
18
+ fixtures: SemanticQualityFixture[];
19
+ }
20
+ export interface SemanticStrategyQuality {
21
+ strategy: "lexical-only" | "hybrid";
22
+ evidenceRecall: number;
23
+ irrelevantTokenRatio: number;
24
+ selectedEvidenceIds: string[];
25
+ fallback: boolean;
26
+ }
27
+ export interface SemanticFixtureQuality {
28
+ fixtureId: string;
29
+ lexical: SemanticStrategyQuality;
30
+ hybrid: SemanticStrategyQuality;
31
+ }
32
+ export interface SemanticQualityReport {
33
+ metricsVersion: typeof HYBRID_RETRIEVAL_QUALITY_VERSION;
34
+ corpusVersion: string;
35
+ model: {
36
+ provider: string;
37
+ model: string;
38
+ dimensions: number;
39
+ };
40
+ fixtures: SemanticFixtureQuality[];
41
+ aggregate: {
42
+ lexicalEvidenceRecall: number;
43
+ hybridEvidenceRecall: number;
44
+ evidenceRecallDelta: number;
45
+ lexicalIrrelevantTokenRatio: number;
46
+ hybridIrrelevantTokenRatio: number;
47
+ irrelevantTokenRatioDelta: number;
48
+ fallbackCount: number;
49
+ };
50
+ }
51
+ export declare function compareHybridRetrievalCorpus(corpus: SemanticQualityCorpus, port: EmbeddingPort): SemanticQualityReport;
52
+ //# sourceMappingURL=semantic-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-quality.d.ts","sourceRoot":"","sources":["../../src/retrieval/semantic-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,gCAAgC,gCAAgC,CAAC;AAE9E,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,wBAAwB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,cAAc,GAAG,QAAQ,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,uBAAuB,CAAC;IACjC,MAAM,EAAE,uBAAuB,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,OAAO,gCAAgC,CAAC;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,SAAS,EAAE;QACT,qBAAqB,EAAE,MAAM,CAAC;QAC9B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,2BAA2B,EAAE,MAAM,CAAC;QACpC,0BAA0B,EAAE,MAAM,CAAC;QACnC,yBAAyB,EAAE,MAAM,CAAC;QAClC,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AA8DD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,aAAa,GAClB,qBAAqB,CAyEvB"}
@@ -0,0 +1,117 @@
1
+ import { cosineSimilarity, reciprocalRankFusion, validEmbeddingVector, } from "./embedding.js";
2
+ export const HYBRID_RETRIEVAL_QUALITY_VERSION = "hybrid-retrieval-quality-v1";
3
+ function rounded(value) {
4
+ return Math.round(value * 1_000_000) / 1_000_000;
5
+ }
6
+ const QUALITY_STOPWORDS = new Set([
7
+ "and", "are", "before", "for", "from", "into", "local", "the", "this", "with",
8
+ ]);
9
+ function terms(value) {
10
+ return new Set([...value.toLocaleLowerCase("en-US").matchAll(/[\p{L}\p{N}_-]{3,}/gu)]
11
+ .map((match) => match[0])
12
+ .filter((term) => !QUALITY_STOPWORDS.has(term)));
13
+ }
14
+ function exactPriority(fixture, candidate) {
15
+ const lower = candidate.text.toLocaleLowerCase("en-US");
16
+ return fixture.exactIdentifiers.some((identifier) => lower.includes(identifier.toLocaleLowerCase("en-US"))) ? 1 : 0;
17
+ }
18
+ function quality(fixture, strategy, selectedIds, fallback) {
19
+ const expected = new Set(fixture.expectedEvidenceIds);
20
+ const selected = new Set(selectedIds);
21
+ const recalled = fixture.expectedEvidenceIds.filter((id) => selected.has(id)).length;
22
+ const selectedCandidates = fixture.candidates.filter((candidate) => selected.has(candidate.id));
23
+ const selectedTokens = selectedCandidates.reduce((total, candidate) => total + candidate.tokens, 0);
24
+ const irrelevantTokens = selectedCandidates
25
+ .filter((candidate) => !expected.has(candidate.id))
26
+ .reduce((total, candidate) => total + candidate.tokens, 0);
27
+ return {
28
+ strategy,
29
+ evidenceRecall: expected.size > 0 ? rounded(recalled / expected.size) : 1,
30
+ irrelevantTokenRatio: selectedTokens > 0 ? rounded(irrelevantTokens / selectedTokens) : 0,
31
+ selectedEvidenceIds: [...selectedIds],
32
+ fallback,
33
+ };
34
+ }
35
+ function lexicalRanking(fixture) {
36
+ const queryTerms = terms(fixture.query);
37
+ return fixture.candidates.map((candidate) => {
38
+ const candidateTerms = terms(candidate.text);
39
+ const overlap = [...queryTerms].filter((term) => candidateTerms.has(term)).length;
40
+ return {
41
+ id: candidate.id,
42
+ score: exactPriority(fixture, candidate) * 1_000 + overlap,
43
+ };
44
+ }).filter((candidate) => candidate.score > 0).sort((left, right) => right.score - left.score || left.id.localeCompare(right.id));
45
+ }
46
+ export function compareHybridRetrievalCorpus(corpus, port) {
47
+ const fixtures = corpus.fixtures.map((fixture) => {
48
+ const lexical = lexicalRanking(fixture);
49
+ const lexicalIds = lexical.slice(0, fixture.maxResults).map((candidate) => candidate.id);
50
+ let hybridIds = lexicalIds;
51
+ let fallback = false;
52
+ try {
53
+ const vectors = port.embed([fixture.query, ...fixture.candidates.map((candidate) => candidate.text)]);
54
+ const queryVector = vectors[0];
55
+ if (!queryVector || vectors.length !== fixture.candidates.length + 1
56
+ || !validEmbeddingVector(queryVector, port.identity.dimensions)) {
57
+ throw new Error("invalid embedding batch");
58
+ }
59
+ const lexicalOrder = new Map(lexical.map((candidate, rank) => [candidate.id, rank]));
60
+ const vectorCandidates = fixture.candidates.flatMap((candidate, index) => {
61
+ const vector = vectors[index + 1];
62
+ if (!vector || !validEmbeddingVector(vector, port.identity.dimensions))
63
+ return [];
64
+ const similarity = cosineSimilarity(queryVector, vector);
65
+ return similarity === undefined || similarity < 0.1 ? [] : [{ candidate, similarity }];
66
+ }).sort((left, right) => right.similarity - left.similarity || left.candidate.id.localeCompare(right.candidate.id));
67
+ const vectorOrder = new Map(vectorCandidates.map((item, rank) => [item.candidate.id, rank]));
68
+ const similarityById = new Map(vectorCandidates.map((item) => [item.candidate.id, item.similarity]));
69
+ const hybrid = fixture.candidates.filter((candidate) => lexicalOrder.has(candidate.id) || vectorOrder.has(candidate.id)).map((candidate) => {
70
+ const similarity = similarityById.get(candidate.id) ?? 0;
71
+ const score = exactPriority(fixture, candidate) * 1_000_000
72
+ + Math.max(0, similarity) * 80
73
+ + reciprocalRankFusion([
74
+ { rank: lexicalOrder.get(candidate.id), weight: 1 },
75
+ { rank: vectorOrder.get(candidate.id), weight: 1 },
76
+ ]) * 1_500;
77
+ return { id: candidate.id, score };
78
+ }).sort((left, right) => right.score - left.score || left.id.localeCompare(right.id));
79
+ hybridIds = hybrid.slice(0, fixture.maxResults).map((candidate) => candidate.id);
80
+ }
81
+ catch {
82
+ fallback = true;
83
+ }
84
+ return {
85
+ fixtureId: fixture.id,
86
+ lexical: quality(fixture, "lexical-only", lexicalIds, false),
87
+ hybrid: quality(fixture, "hybrid", hybridIds, fallback),
88
+ };
89
+ });
90
+ const average = (values) => values.length > 0
91
+ ? rounded(values.reduce((total, value) => total + value, 0) / values.length)
92
+ : 0;
93
+ const lexicalEvidenceRecall = average(fixtures.map((fixture) => fixture.lexical.evidenceRecall));
94
+ const hybridEvidenceRecall = average(fixtures.map((fixture) => fixture.hybrid.evidenceRecall));
95
+ const lexicalIrrelevantTokenRatio = average(fixtures.map((fixture) => fixture.lexical.irrelevantTokenRatio));
96
+ const hybridIrrelevantTokenRatio = average(fixtures.map((fixture) => fixture.hybrid.irrelevantTokenRatio));
97
+ return {
98
+ metricsVersion: HYBRID_RETRIEVAL_QUALITY_VERSION,
99
+ corpusVersion: corpus.corpusVersion,
100
+ model: {
101
+ provider: port.identity.provider,
102
+ model: port.identity.model,
103
+ dimensions: port.identity.dimensions,
104
+ },
105
+ fixtures,
106
+ aggregate: {
107
+ lexicalEvidenceRecall,
108
+ hybridEvidenceRecall,
109
+ evidenceRecallDelta: rounded(hybridEvidenceRecall - lexicalEvidenceRecall),
110
+ lexicalIrrelevantTokenRatio,
111
+ hybridIrrelevantTokenRatio,
112
+ irrelevantTokenRatioDelta: rounded(hybridIrrelevantTokenRatio - lexicalIrrelevantTokenRatio),
113
+ fallbackCount: fixtures.filter((fixture) => fixture.hybrid.fallback).length,
114
+ },
115
+ };
116
+ }
117
+ //# sourceMappingURL=semantic-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-quality.js","sourceRoot":"","sources":["../../src/retrieval/semantic-quality.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ds4-context-core",
3
- "version": "0.1.2",
3
+ "version": "0.2.0-beta.2",
4
4
  "description": "Runtime-neutral context planning, retrieval, compaction, memory, and privacy for agent runtimes.",
5
5
  "type": "module",
6
6
  "license": "MIT",