@seanhogg/builderforce-memory 2026.7.12 → 2026.9.27

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 (223) hide show
  1. package/README.md +10 -0
  2. package/dist/bridges/AnthropicBridge.d.ts +9 -1
  3. package/dist/bridges/AnthropicBridge.d.ts.map +1 -1
  4. package/dist/bridges/AnthropicBridge.js +58 -2
  5. package/dist/bridges/AnthropicBridge.js.map +1 -1
  6. package/dist/bridges/CachingBridge.d.ts +9 -1
  7. package/dist/bridges/CachingBridge.d.ts.map +1 -1
  8. package/dist/bridges/CachingBridge.js +24 -1
  9. package/dist/bridges/CachingBridge.js.map +1 -1
  10. package/dist/bridges/OpenAIBridge.d.ts +4 -1
  11. package/dist/bridges/OpenAIBridge.d.ts.map +1 -1
  12. package/dist/bridges/OpenAIBridge.js +40 -2
  13. package/dist/bridges/OpenAIBridge.js.map +1 -1
  14. package/dist/bridges/SemanticCachingBridge.d.ts +8 -1
  15. package/dist/bridges/SemanticCachingBridge.d.ts.map +1 -1
  16. package/dist/bridges/SemanticCachingBridge.js +26 -1
  17. package/dist/bridges/SemanticCachingBridge.js.map +1 -1
  18. package/dist/bridges/TransformerBridge.d.ts +13 -0
  19. package/dist/bridges/TransformerBridge.d.ts.map +1 -1
  20. package/dist/bridges/VertexAIBridge.d.ts +102 -0
  21. package/dist/bridges/VertexAIBridge.d.ts.map +1 -0
  22. package/dist/bridges/VertexAIBridge.js +224 -0
  23. package/dist/bridges/VertexAIBridge.js.map +1 -0
  24. package/dist/bridges/index.d.ts +3 -1
  25. package/dist/bridges/index.d.ts.map +1 -1
  26. package/dist/bridges/index.js +1 -0
  27. package/dist/bridges/index.js.map +1 -1
  28. package/dist/eval/EvalHarness.d.ts +37 -0
  29. package/dist/eval/EvalHarness.d.ts.map +1 -0
  30. package/dist/eval/EvalHarness.js +178 -0
  31. package/dist/eval/EvalHarness.js.map +1 -0
  32. package/dist/eval/graders.d.ts +76 -0
  33. package/dist/eval/graders.d.ts.map +1 -0
  34. package/dist/eval/graders.js +168 -0
  35. package/dist/eval/graders.js.map +1 -0
  36. package/dist/eval/index.d.ts +26 -0
  37. package/dist/eval/index.d.ts.map +1 -0
  38. package/dist/eval/index.js +26 -0
  39. package/dist/eval/index.js.map +1 -0
  40. package/dist/eval/types.d.ts +97 -0
  41. package/dist/eval/types.d.ts.map +1 -0
  42. package/dist/eval/types.js +5 -0
  43. package/dist/eval/types.js.map +1 -0
  44. package/dist/evermind/contract.d.ts +40 -0
  45. package/dist/evermind/contract.d.ts.map +1 -0
  46. package/dist/evermind/contract.js +13 -0
  47. package/dist/evermind/contract.js.map +1 -0
  48. package/dist/evermind/index.d.ts +15 -0
  49. package/dist/evermind/index.d.ts.map +1 -0
  50. package/dist/evermind/index.js +4 -0
  51. package/dist/evermind/index.js.map +1 -0
  52. package/dist/evermind/memoryBlock.d.ts +7 -0
  53. package/dist/evermind/memoryBlock.d.ts.map +1 -0
  54. package/dist/evermind/memoryBlock.js +37 -0
  55. package/dist/evermind/memoryBlock.js.map +1 -0
  56. package/dist/evermind/recall.d.ts +55 -0
  57. package/dist/evermind/recall.d.ts.map +1 -0
  58. package/dist/evermind/recall.js +105 -0
  59. package/dist/evermind/recall.js.map +1 -0
  60. package/dist/index.d.ts +18 -3
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +14 -1
  63. package/dist/index.js.map +1 -1
  64. package/dist/ingest/IngestionPipeline.d.ts +95 -0
  65. package/dist/ingest/IngestionPipeline.d.ts.map +1 -0
  66. package/dist/ingest/IngestionPipeline.js +295 -0
  67. package/dist/ingest/IngestionPipeline.js.map +1 -0
  68. package/dist/ingest/index.d.ts +10 -0
  69. package/dist/ingest/index.d.ts.map +1 -0
  70. package/dist/ingest/index.js +8 -0
  71. package/dist/ingest/index.js.map +1 -0
  72. package/dist/ingest/parsers.d.ts +53 -0
  73. package/dist/ingest/parsers.d.ts.map +1 -0
  74. package/dist/ingest/parsers.js +306 -0
  75. package/dist/ingest/parsers.js.map +1 -0
  76. package/dist/ingest/types.d.ts +114 -0
  77. package/dist/ingest/types.d.ts.map +1 -0
  78. package/dist/ingest/types.js +19 -0
  79. package/dist/ingest/types.js.map +1 -0
  80. package/dist/memory/MemoryStore.d.ts +33 -0
  81. package/dist/memory/MemoryStore.d.ts.map +1 -1
  82. package/dist/memory/MemoryStore.js +29 -3
  83. package/dist/memory/MemoryStore.js.map +1 -1
  84. package/dist/memory/index.d.ts +1 -1
  85. package/dist/memory/index.d.ts.map +1 -1
  86. package/dist/orchestration/AgentGraph.d.ts +104 -0
  87. package/dist/orchestration/AgentGraph.d.ts.map +1 -0
  88. package/dist/orchestration/AgentGraph.js +364 -0
  89. package/dist/orchestration/AgentGraph.js.map +1 -0
  90. package/dist/orchestration/checkpoint.d.ts +58 -0
  91. package/dist/orchestration/checkpoint.d.ts.map +1 -0
  92. package/dist/orchestration/checkpoint.js +92 -0
  93. package/dist/orchestration/checkpoint.js.map +1 -0
  94. package/dist/orchestration/index.d.ts +14 -0
  95. package/dist/orchestration/index.d.ts.map +1 -0
  96. package/dist/orchestration/index.js +10 -0
  97. package/dist/orchestration/index.js.map +1 -0
  98. package/dist/orchestration/patterns.d.ts +159 -0
  99. package/dist/orchestration/patterns.d.ts.map +1 -0
  100. package/dist/orchestration/patterns.js +371 -0
  101. package/dist/orchestration/patterns.js.map +1 -0
  102. package/dist/orchestration/types.d.ts +146 -0
  103. package/dist/orchestration/types.d.ts.map +1 -0
  104. package/dist/orchestration/types.js +20 -0
  105. package/dist/orchestration/types.js.map +1 -0
  106. package/dist/rag/EnterpriseRetriever.d.ts +114 -0
  107. package/dist/rag/EnterpriseRetriever.d.ts.map +1 -0
  108. package/dist/rag/EnterpriseRetriever.js +240 -0
  109. package/dist/rag/EnterpriseRetriever.js.map +1 -0
  110. package/dist/rag/index.d.ts +6 -0
  111. package/dist/rag/index.d.ts.map +1 -0
  112. package/dist/rag/index.js +5 -0
  113. package/dist/rag/index.js.map +1 -0
  114. package/dist/retrieval/bm25.d.ts +48 -1
  115. package/dist/retrieval/bm25.d.ts.map +1 -1
  116. package/dist/retrieval/bm25.js +59 -13
  117. package/dist/retrieval/bm25.js.map +1 -1
  118. package/dist/retrieval/index.d.ts +2 -2
  119. package/dist/retrieval/index.d.ts.map +1 -1
  120. package/dist/retrieval/index.js +1 -1
  121. package/dist/retrieval/index.js.map +1 -1
  122. package/dist/telemetry/InstrumentedBridge.d.ts +62 -0
  123. package/dist/telemetry/InstrumentedBridge.d.ts.map +1 -0
  124. package/dist/telemetry/InstrumentedBridge.js +120 -0
  125. package/dist/telemetry/InstrumentedBridge.js.map +1 -0
  126. package/dist/telemetry/MetricsRegistry.d.ts +88 -0
  127. package/dist/telemetry/MetricsRegistry.d.ts.map +1 -0
  128. package/dist/telemetry/MetricsRegistry.js +167 -0
  129. package/dist/telemetry/MetricsRegistry.js.map +1 -0
  130. package/dist/telemetry/Tracer.d.ts +137 -0
  131. package/dist/telemetry/Tracer.d.ts.map +1 -0
  132. package/dist/telemetry/Tracer.js +244 -0
  133. package/dist/telemetry/Tracer.js.map +1 -0
  134. package/dist/telemetry/exporters.d.ts +68 -0
  135. package/dist/telemetry/exporters.d.ts.map +1 -0
  136. package/dist/telemetry/exporters.js +145 -0
  137. package/dist/telemetry/exporters.js.map +1 -0
  138. package/dist/telemetry/index.d.ts +19 -0
  139. package/dist/telemetry/index.d.ts.map +1 -0
  140. package/dist/telemetry/index.js +12 -0
  141. package/dist/telemetry/index.js.map +1 -0
  142. package/dist/telemetry/pricing.d.ts +74 -0
  143. package/dist/telemetry/pricing.d.ts.map +1 -0
  144. package/dist/telemetry/pricing.js +98 -0
  145. package/dist/telemetry/pricing.js.map +1 -0
  146. package/dist/telemetry/traceparent.d.ts +50 -0
  147. package/dist/telemetry/traceparent.d.ts.map +1 -0
  148. package/dist/telemetry/traceparent.js +77 -0
  149. package/dist/telemetry/traceparent.js.map +1 -0
  150. package/dist/telemetry/types.d.ts +90 -0
  151. package/dist/telemetry/types.d.ts.map +1 -0
  152. package/dist/telemetry/types.js +17 -0
  153. package/dist/telemetry/types.js.map +1 -0
  154. package/dist/vectorstore/MemoryVectorStore.d.ts +72 -0
  155. package/dist/vectorstore/MemoryVectorStore.d.ts.map +1 -0
  156. package/dist/vectorstore/MemoryVectorStore.js +205 -0
  157. package/dist/vectorstore/MemoryVectorStore.js.map +1 -0
  158. package/dist/vectorstore/RestVectorStore.d.ts +79 -0
  159. package/dist/vectorstore/RestVectorStore.d.ts.map +1 -0
  160. package/dist/vectorstore/RestVectorStore.js +170 -0
  161. package/dist/vectorstore/RestVectorStore.js.map +1 -0
  162. package/dist/vectorstore/dialects.d.ts +101 -0
  163. package/dist/vectorstore/dialects.d.ts.map +1 -0
  164. package/dist/vectorstore/dialects.js +618 -0
  165. package/dist/vectorstore/dialects.js.map +1 -0
  166. package/dist/vectorstore/filter.d.ts +42 -0
  167. package/dist/vectorstore/filter.d.ts.map +1 -0
  168. package/dist/vectorstore/filter.js +132 -0
  169. package/dist/vectorstore/filter.js.map +1 -0
  170. package/dist/vectorstore/index.d.ts +15 -0
  171. package/dist/vectorstore/index.d.ts.map +1 -0
  172. package/dist/vectorstore/index.js +11 -0
  173. package/dist/vectorstore/index.js.map +1 -0
  174. package/dist/vectorstore/types.d.ts +151 -0
  175. package/dist/vectorstore/types.d.ts.map +1 -0
  176. package/dist/vectorstore/types.js +30 -0
  177. package/dist/vectorstore/types.js.map +1 -0
  178. package/package.json +39 -5
  179. package/src/bridges/AnthropicBridge.ts +68 -3
  180. package/src/bridges/CachingBridge.ts +28 -2
  181. package/src/bridges/OpenAIBridge.ts +48 -3
  182. package/src/bridges/SemanticCachingBridge.ts +29 -2
  183. package/src/bridges/TransformerBridge.ts +16 -0
  184. package/src/bridges/VertexAIBridge.ts +297 -0
  185. package/src/bridges/index.ts +3 -1
  186. package/src/eval/EvalHarness.ts +214 -0
  187. package/src/eval/graders.ts +218 -0
  188. package/src/eval/index.ts +26 -0
  189. package/src/eval/types.ts +107 -0
  190. package/src/evermind/contract.ts +39 -0
  191. package/src/evermind/index.ts +21 -0
  192. package/src/evermind/memoryBlock.ts +38 -0
  193. package/src/evermind/recall.ts +122 -0
  194. package/src/index.ts +232 -0
  195. package/src/ingest/IngestionPipeline.ts +378 -0
  196. package/src/ingest/index.ts +46 -0
  197. package/src/ingest/parsers.ts +318 -0
  198. package/src/ingest/types.ts +116 -0
  199. package/src/memory/MemoryStore.ts +55 -3
  200. package/src/memory/index.ts +1 -1
  201. package/src/orchestration/AgentGraph.ts +462 -0
  202. package/src/orchestration/checkpoint.ts +129 -0
  203. package/src/orchestration/index.ts +63 -0
  204. package/src/orchestration/patterns.ts +532 -0
  205. package/src/orchestration/types.ts +128 -0
  206. package/src/rag/EnterpriseRetriever.ts +348 -0
  207. package/src/rag/index.ts +18 -0
  208. package/src/retrieval/bm25.ts +71 -13
  209. package/src/retrieval/index.ts +2 -2
  210. package/src/telemetry/InstrumentedBridge.ts +152 -0
  211. package/src/telemetry/MetricsRegistry.ts +263 -0
  212. package/src/telemetry/Tracer.ts +310 -0
  213. package/src/telemetry/exporters.ts +187 -0
  214. package/src/telemetry/index.ts +56 -0
  215. package/src/telemetry/pricing.ts +129 -0
  216. package/src/telemetry/traceparent.ts +89 -0
  217. package/src/telemetry/types.ts +105 -0
  218. package/src/vectorstore/MemoryVectorStore.ts +250 -0
  219. package/src/vectorstore/RestVectorStore.ts +236 -0
  220. package/src/vectorstore/dialects.ts +702 -0
  221. package/src/vectorstore/filter.ts +148 -0
  222. package/src/vectorstore/index.ts +53 -0
  223. package/src/vectorstore/types.ts +149 -0
@@ -0,0 +1,295 @@
1
+ /**
2
+ * ingest/IngestionPipeline.ts — source → parse → chunk → embed → upsert.
3
+ *
4
+ * The one-off script that loads a corpus into a vector database is easy. What
5
+ * makes a pipeline PRODUCTION-grade is everything that happens on the second run:
6
+ *
7
+ * • **Incremental sync.** Re-ingesting a 200k-document corpus must not re-embed
8
+ * 200k documents because three of them changed. Chunks carry a content hash;
9
+ * with a manifest, unchanged hashes are skipped and vanished chunks deleted.
10
+ * Embedding is the cost line, so this is the difference between a pipeline that
11
+ * runs nightly and one that runs once.
12
+ * • **Deterministic ids.** A chunk's id is derived from its source id and its
13
+ * ordinal, so a re-run overwrites rather than duplicating. Random ids are why
14
+ * corpora silently triple in size.
15
+ * • **Batching and bounded concurrency.** Embedders and vector databases both
16
+ * rate-limit; an unbounded `Promise.all` over a corpus is a self-inflicted 429.
17
+ * • **Per-document failure isolation.** One malformed file fails that document
18
+ * and is reported, rather than aborting the run.
19
+ * • **Governance by construction.** Tenant, ACL and sensitivity are written onto
20
+ * every chunk during ingest, because a retrieval-time ACL that depends on
21
+ * ingest-time diligence is not an ACL.
22
+ */
23
+ import { chunkText } from '../retrieval/chunk.js';
24
+ import { estimateTokens } from '../telemetry/pricing.js';
25
+ import { ACL_FIELD, ACL_PUBLIC, SENSITIVITY_FIELD, TENANT_FIELD, } from '../vectorstore/types.js';
26
+ import { ParserRegistry } from './parsers.js';
27
+ import { CHUNK_INDEX_FIELD, CONTENT_HASH_FIELD, PARSER_FIELD, SOURCE_ID_FIELD, TITLE_FIELD, URI_FIELD, } from './types.js';
28
+ export class IngestionPipeline {
29
+ _store;
30
+ _embed;
31
+ _chunkOpts;
32
+ _parsers;
33
+ _manifest;
34
+ _strategy;
35
+ _embedBatch;
36
+ _upsertBatch;
37
+ _concurrency;
38
+ _embeddingModel;
39
+ _tracer;
40
+ constructor(opts) {
41
+ this._store = opts.store;
42
+ this._embed = opts.embed;
43
+ this._chunkOpts = opts.chunk ?? {};
44
+ this._parsers = opts.parsers instanceof ParserRegistry
45
+ ? opts.parsers
46
+ : new ParserRegistry(opts.parsers);
47
+ this._manifest = opts.manifest;
48
+ this._strategy = opts.syncStrategy ?? (opts.manifest ? 'diff' : 'replace');
49
+ this._embedBatch = Math.max(1, opts.embedBatchSize ?? 64);
50
+ this._upsertBatch = Math.max(1, opts.upsertBatchSize ?? 100);
51
+ this._concurrency = Math.max(1, opts.concurrency ?? 4);
52
+ this._embeddingModel = opts.embeddingModel ?? 'embedding';
53
+ this._tracer = opts.tracer;
54
+ }
55
+ async ingest(sources) {
56
+ const started = Date.now();
57
+ const report = {
58
+ documents: 0, sections: 0, chunks: 0, embedded: 0, upserted: 0,
59
+ skippedUnchanged: 0, deletedStale: 0, failures: [], durationMs: 0,
60
+ };
61
+ const root = this._tracer?.startSpan('ingest.run', {
62
+ kind: 'ingest',
63
+ attributes: { 'ingest.sources': sources.length, 'ingest.strategy': this._strategy },
64
+ });
65
+ if (root)
66
+ report.traceId = root.traceId;
67
+ await mapWithConcurrency(sources, this._concurrency, async (source) => {
68
+ try {
69
+ const result = await this._ingestOne(source, root);
70
+ report.documents += 1;
71
+ report.sections += result.sections;
72
+ report.chunks += result.chunks;
73
+ report.embedded += result.embedded;
74
+ report.upserted += result.upserted;
75
+ report.skippedUnchanged += result.skippedUnchanged;
76
+ report.deletedStale += result.deletedStale;
77
+ }
78
+ catch (err) {
79
+ // One bad document must not abort a corpus-wide run; it is reported
80
+ // with its id so the operator can requeue exactly that source.
81
+ report.failures.push({
82
+ sourceId: source.id,
83
+ error: err instanceof Error ? err.message : String(err),
84
+ });
85
+ }
86
+ });
87
+ report.durationMs = Date.now() - started;
88
+ root?.setAttributes({
89
+ 'ingest.chunks': report.chunks,
90
+ 'ingest.embedded': report.embedded,
91
+ 'ingest.skipped_unchanged': report.skippedUnchanged,
92
+ 'ingest.failures': report.failures.length,
93
+ });
94
+ root?.end(report.failures.length > 0 && report.documents === 0 ? 'error' : 'ok');
95
+ await this._tracer?.flush();
96
+ return report;
97
+ }
98
+ /** Removes every chunk a source produced — a GDPR/right-to-erasure primitive. */
99
+ async forget(sourceId) {
100
+ const deleted = await this._store.deleteByFilter({
101
+ op: 'eq', field: SOURCE_ID_FIELD, value: sourceId,
102
+ });
103
+ await this._manifest?.delete(sourceId);
104
+ return deleted;
105
+ }
106
+ async _ingestOne(source, parent) {
107
+ const span = this._tracer?.startSpan('ingest.document', {
108
+ kind: 'ingest',
109
+ ...(parent ? { parent } : {}),
110
+ attributes: { 'ingest.source_id': source.id, 'ingest.tenant': source.tenantId },
111
+ });
112
+ try {
113
+ const parser = this._parsers.resolve(source);
114
+ if (!parser)
115
+ throw new Error(`No parser accepts source "${source.id}".`);
116
+ const sections = parser.parse(source);
117
+ const base = this._baseMetadata(source, parser.id);
118
+ // Chunk index is global across sections so ids stay stable and unique
119
+ // even when a section is added in the middle of a document.
120
+ const pending = [];
121
+ let index = 0;
122
+ for (const section of sections) {
123
+ for (const chunk of chunkText(section.text, this._chunkOpts)) {
124
+ const hash = hashText(chunk.text);
125
+ const metadata = {
126
+ ...base,
127
+ ...(section.metadata ?? {}),
128
+ [CHUNK_INDEX_FIELD]: index,
129
+ [CONTENT_HASH_FIELD]: hash,
130
+ };
131
+ pending.push({
132
+ record: { id: `${source.id}#${index}`, text: chunk.text, metadata },
133
+ hash,
134
+ });
135
+ index += 1;
136
+ }
137
+ }
138
+ const { toWrite, toDelete, skipped } = await this._planSync(source.id, pending);
139
+ let embedded = 0;
140
+ for (let i = 0; i < toWrite.length; i += this._embedBatch) {
141
+ const batch = toWrite.slice(i, i + this._embedBatch);
142
+ const vectors = await this._embedBatchTraced(batch.map((r) => r.text), span);
143
+ batch.forEach((record, j) => {
144
+ const vector = vectors[j];
145
+ if (vector)
146
+ record.vector = vector;
147
+ });
148
+ embedded += batch.length;
149
+ }
150
+ let upserted = 0;
151
+ for (let i = 0; i < toWrite.length; i += this._upsertBatch) {
152
+ const result = await this._store.upsert(toWrite.slice(i, i + this._upsertBatch));
153
+ upserted += result.upserted;
154
+ }
155
+ let deletedStale = 0;
156
+ if (toDelete.length > 0) {
157
+ await this._store.delete(toDelete);
158
+ deletedStale = toDelete.length;
159
+ }
160
+ await this._manifest?.set(source.id, pending.map(({ record, hash }) => ({ id: record.id, hash })));
161
+ span?.setAttributes({
162
+ 'ingest.sections': sections.length,
163
+ 'ingest.chunks': pending.length,
164
+ 'ingest.embedded': embedded,
165
+ 'ingest.skipped_unchanged': skipped,
166
+ 'ingest.parser': parser.id,
167
+ });
168
+ span?.end('ok');
169
+ return {
170
+ sections: sections.length,
171
+ chunks: pending.length,
172
+ embedded,
173
+ upserted,
174
+ skippedUnchanged: skipped,
175
+ deletedStale,
176
+ };
177
+ }
178
+ catch (err) {
179
+ span?.fail(err);
180
+ throw err;
181
+ }
182
+ }
183
+ /**
184
+ * Decides what actually has to be written and deleted.
185
+ *
186
+ * `diff` compares content hashes against the manifest; `replace` clears the
187
+ * source's chunks first (correct without a manifest, at the cost of re-embedding);
188
+ * `append` writes everything and deletes nothing.
189
+ */
190
+ async _planSync(sourceId, pending) {
191
+ if (this._strategy === 'diff' && this._manifest) {
192
+ const previous = (await this._manifest.get(sourceId)) ?? [];
193
+ const previousByHash = new Map(previous.map((f) => [f.id, f.hash]));
194
+ const currentIds = new Set(pending.map((p) => p.record.id));
195
+ const toWrite = [];
196
+ let skipped = 0;
197
+ for (const { record, hash } of pending) {
198
+ if (previousByHash.get(record.id) === hash)
199
+ skipped += 1;
200
+ else
201
+ toWrite.push(record);
202
+ }
203
+ const toDelete = previous.map((f) => f.id).filter((id) => !currentIds.has(id));
204
+ return { toWrite, toDelete, skipped };
205
+ }
206
+ if (this._strategy === 'replace') {
207
+ await this._store.deleteByFilter({ op: 'eq', field: SOURCE_ID_FIELD, value: sourceId });
208
+ }
209
+ return { toWrite: pending.map((p) => p.record), toDelete: [], skipped: 0 };
210
+ }
211
+ async _embedBatchTraced(texts, parent) {
212
+ if (!this._tracer)
213
+ return this._embed(texts);
214
+ const span = this._tracer.startSpan('embed.batch', {
215
+ kind: 'embedding',
216
+ ...(parent ? { parent } : {}),
217
+ attributes: { 'embedding.batch_size': texts.length },
218
+ });
219
+ try {
220
+ const vectors = await this._embed(texts);
221
+ span.recordUsage({
222
+ model: this._embeddingModel,
223
+ inputTokens: texts.reduce((sum, t) => sum + estimateTokens(t), 0),
224
+ outputTokens: 0,
225
+ estimated: true,
226
+ });
227
+ span.end('ok');
228
+ return vectors;
229
+ }
230
+ catch (err) {
231
+ span.fail(err);
232
+ throw err;
233
+ }
234
+ }
235
+ _baseMetadata(source, parserId) {
236
+ const metadata = {
237
+ ...(source.metadata ?? {}),
238
+ [TENANT_FIELD]: source.tenantId,
239
+ // Defaulting to tenant-public keeps the ACL array NON-EMPTY, which is
240
+ // what makes `accessFilter` fail closed: a record with no acl matches
241
+ // nothing rather than everything.
242
+ [ACL_FIELD]: source.acl?.length ? source.acl : [ACL_PUBLIC],
243
+ [SOURCE_ID_FIELD]: source.id,
244
+ [PARSER_FIELD]: parserId,
245
+ };
246
+ if (source.sensitivity !== undefined)
247
+ metadata[SENSITIVITY_FIELD] = source.sensitivity;
248
+ if (source.title)
249
+ metadata[TITLE_FIELD] = source.title;
250
+ if (source.uri)
251
+ metadata[URI_FIELD] = source.uri;
252
+ return metadata;
253
+ }
254
+ }
255
+ /** In-process manifest — the default for a single-process or test deployment. */
256
+ export class InMemoryIngestManifest {
257
+ _entries = new Map();
258
+ async get(sourceId) {
259
+ return this._entries.get(sourceId);
260
+ }
261
+ async set(sourceId, fingerprints) {
262
+ this._entries.set(sourceId, fingerprints);
263
+ }
264
+ async delete(sourceId) {
265
+ this._entries.delete(sourceId);
266
+ }
267
+ get size() { return this._entries.size; }
268
+ }
269
+ /**
270
+ * FNV-1a, 32-bit, rendered as hex.
271
+ *
272
+ * A content hash here answers "did this chunk change", not "was this chunk
273
+ * tampered with", so a fast non-cryptographic hash is the right tool — and it is
274
+ * synchronous, unlike WebCrypto, which keeps chunking a pure function.
275
+ */
276
+ export function hashText(text) {
277
+ let hash = 0x811c9dc5;
278
+ for (let i = 0; i < text.length; i++) {
279
+ hash ^= text.charCodeAt(i);
280
+ hash = Math.imul(hash, 0x01000193) >>> 0;
281
+ }
282
+ return hash.toString(16).padStart(8, '0');
283
+ }
284
+ /** Bounded-concurrency map — the reason a large corpus does not become a 429. */
285
+ export async function mapWithConcurrency(items, limit, fn) {
286
+ let cursor = 0;
287
+ const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
288
+ while (cursor < items.length) {
289
+ const index = cursor++;
290
+ await fn(items[index], index);
291
+ }
292
+ });
293
+ await Promise.all(workers);
294
+ }
295
+ //# sourceMappingURL=IngestionPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IngestionPipeline.js","sourceRoot":"","sources":["../../src/ingest/IngestionPipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ingest — one pipeline for structured and unstructured sources, with incremental
3
+ * sync so a nightly re-run re-embeds only what changed.
4
+ */
5
+ export { IngestionPipeline, InMemoryIngestManifest, hashText, mapWithConcurrency, } from './IngestionPipeline.js';
6
+ export type { IngestionPipelineOptions } from './IngestionPipeline.js';
7
+ export { ParserRegistry, BUILTIN_PARSERS, rowsParser, csvParser, jsonParser, markdownParser, htmlParser, plainTextParser, parseCsv, serializeRow, } from './parsers.js';
8
+ export { SOURCE_ID_FIELD, CHUNK_INDEX_FIELD, CONTENT_HASH_FIELD, TITLE_FIELD, URI_FIELD, PARSER_FIELD, } from './types.js';
9
+ export type { BatchEmbedder, ChunkFingerprint, DocumentParser, IngestManifest, IngestionReport, ParsedSection, SourceContent, SourceDocument, StructuredRow, SyncStrategy, } from './types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,iBAAiB,EACjB,sBAAsB,EACtB,QAAQ,EACR,kBAAkB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EACH,cAAc,EACd,eAAe,EACf,UAAU,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,QAAQ,EACR,YAAY,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,YAAY,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACR,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ingest — one pipeline for structured and unstructured sources, with incremental
3
+ * sync so a nightly re-run re-embeds only what changed.
4
+ */
5
+ export { IngestionPipeline, InMemoryIngestManifest, hashText, mapWithConcurrency, } from './IngestionPipeline.js';
6
+ export { ParserRegistry, BUILTIN_PARSERS, rowsParser, csvParser, jsonParser, markdownParser, htmlParser, plainTextParser, parseCsv, serializeRow, } from './parsers.js';
7
+ export { SOURCE_ID_FIELD, CHUNK_INDEX_FIELD, CONTENT_HASH_FIELD, TITLE_FIELD, URI_FIELD, PARSER_FIELD, } from './types.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ingest/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,iBAAiB,EACjB,sBAAsB,EACtB,QAAQ,EACR,kBAAkB,GACrB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACH,cAAc,EACd,eAAe,EACf,UAAU,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,QAAQ,EACR,YAAY,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,YAAY,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * ingest/parsers.ts — format handlers, as a registry.
3
+ *
4
+ * Each parser turns a source into sections and recovers whatever STRUCTURE the
5
+ * format carries, because structure that survives parsing becomes filterable
6
+ * metadata, and metadata is what makes retrieval precise:
7
+ *
8
+ * • Markdown keeps its heading path, so a chunk knows it lives under
9
+ * "Security › Data retention" and a citation can say so.
10
+ * • Rows keep every typed column, so `status = 'open'` is a database predicate
11
+ * rather than something the embedding has to imply.
12
+ * • JSON keeps its pointer, so a value can be traced back to its exact location.
13
+ *
14
+ * A parser that returned only text would throw all of that away and force the
15
+ * retriever to recover it statistically — the single most common reason a RAG
16
+ * pilot answers plausibly and cites nothing verifiable.
17
+ */
18
+ import type { DocumentParser, SourceDocument, StructuredRow } from './types.js';
19
+ /**
20
+ * Serialises a row as `field: value` lines.
21
+ *
22
+ * Field names are kept in the text on purpose: an embedding of `"status: open"`
23
+ * sits near a question about open items, whereas a bare `"open"` sits near
24
+ * nothing useful. The typed values are ALSO emitted as metadata, so the same fact
25
+ * is both semantically searchable and exactly filterable.
26
+ */
27
+ export declare function serializeRow(row: StructuredRow): string;
28
+ export declare const rowsParser: DocumentParser;
29
+ /**
30
+ * RFC 4180 subset: quoted fields, doubled quotes, embedded newlines and commas.
31
+ * Enough for the exports enterprises actually hand over, without a dependency.
32
+ */
33
+ export declare function parseCsv(text: string, delimiter?: string): StructuredRow[];
34
+ export declare const csvParser: DocumentParser;
35
+ /**
36
+ * An array of objects is treated as rows (the common export shape); anything else
37
+ * is flattened to leaf paths so a value keeps its JSON pointer.
38
+ */
39
+ export declare const jsonParser: DocumentParser;
40
+ export declare const markdownParser: DocumentParser;
41
+ export declare const htmlParser: DocumentParser;
42
+ export declare const plainTextParser: DocumentParser;
43
+ /** Order matters: the first parser that accepts a source handles it. */
44
+ export declare const BUILTIN_PARSERS: readonly DocumentParser[];
45
+ export declare class ParserRegistry {
46
+ private readonly _parsers;
47
+ constructor(parsers?: readonly DocumentParser[]);
48
+ /** Registers a parser at the FRONT, so it can override a builtin. */
49
+ register(parser: DocumentParser): this;
50
+ resolve(source: SourceDocument): DocumentParser | undefined;
51
+ list(): string[];
52
+ }
53
+ //# sourceMappingURL=parsers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/ingest/parsers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAiB,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAU/F;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAKvD;AAED,eAAO,MAAM,UAAU,EAAE,cAexB,CAAC;AAIF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,aAAa,EAAE,CA4CvE;AAmBD,eAAO,MAAM,SAAS,EAAE,cAWvB,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,cA2BxB,CAAC;AAmBF,eAAO,MAAM,cAAc,EAAE,cA4C5B,CAAC;AAIF,eAAO,MAAM,UAAU,EAAE,cA6BxB,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,cAO7B,CAAC;AAIF,wEAAwE;AACxE,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAOpD,CAAC;AAEF,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;gBAEhC,OAAO,GAAE,SAAS,cAAc,EAAoB;IAIhE,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAKtC,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS;IAI3D,IAAI,IAAI,MAAM,EAAE;CAGnB"}