@devilsdev/rag-core 3.8.0 → 3.8.1

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/dist/index.cjs CHANGED
@@ -302,6 +302,19 @@ var require_plugin_signature_verifier = __commonJS({
302
302
  format: "jwk"
303
303
  });
304
304
  }
305
+ function rejectReservedKeys(value) {
306
+ if (value === null || typeof value !== "object") return;
307
+ if (Array.isArray(value)) {
308
+ value.forEach(rejectReservedKeys);
309
+ return;
310
+ }
311
+ for (const key of Object.keys(value)) {
312
+ if (key === "__proto__") {
313
+ throw new Error(`Invalid manifest: reserved key "${key}"`);
314
+ }
315
+ rejectReservedKeys(value[key]);
316
+ }
317
+ }
305
318
  function computeContentDigest({ files = [], baseDir, contents = {} } = {}) {
306
319
  const root = path.resolve(baseDir || process.cwd());
307
320
  const entries = /* @__PURE__ */ new Map();
@@ -465,7 +478,7 @@ var require_plugin_signature_verifier = __commonJS({
465
478
  * @private
466
479
  */
467
480
  _verifyContentDigest(canonicalManifest, content) {
468
- const declared = canonicalManifest.contentDigest;
481
+ const declared = Object.hasOwn(canonicalManifest, "contentDigest") ? canonicalManifest.contentDigest : void 0;
469
482
  const hasContent = content && (Array.isArray(content.files) && content.files.length > 0 || content.contents && Object.keys(content.contents).length > 0);
470
483
  if (declared === void 0 || declared === null) {
471
484
  if (this.requireContentDigest) {
@@ -514,6 +527,7 @@ var require_plugin_signature_verifier = __commonJS({
514
527
  */
515
528
  _canonicalizeManifest(manifest) {
516
529
  const canonical = JSON.parse(JSON.stringify(manifest));
530
+ rejectReservedKeys(canonical);
517
531
  delete canonical.signature;
518
532
  delete canonical.signerId;
519
533
  delete canonical.signedAt;
@@ -1370,7 +1384,7 @@ var require_package = __commonJS({
1370
1384
  "package.json"(exports2, module2) {
1371
1385
  module2.exports = {
1372
1386
  name: "@devilsdev/rag-pipeline-utils",
1373
- version: "3.8.0",
1387
+ version: "3.8.1",
1374
1388
  description: "Composable retrieval-augmented generation (RAG) for Node.js: grounded citations, evaluation, guardrails, hybrid retrieval and a CLI.",
1375
1389
  main: "dist/index.cjs",
1376
1390
  type: "commonjs",
@@ -1629,10 +1643,10 @@ var require_package = __commonJS({
1629
1643
  "why-is-node-running": "^3.2.2"
1630
1644
  },
1631
1645
  dependencies: {
1632
- "@devilsdev/rag-connectors": "3.8.0",
1633
- "@devilsdev/rag-core": "3.8.0",
1634
- "@devilsdev/rag-eval": "3.8.0",
1635
- "@devilsdev/rag-guardrails": "3.8.0",
1646
+ "@devilsdev/rag-connectors": "3.8.1",
1647
+ "@devilsdev/rag-core": "3.8.1",
1648
+ "@devilsdev/rag-eval": "3.8.1",
1649
+ "@devilsdev/rag-guardrails": "3.8.1",
1636
1650
  ajv: "^8.17.1",
1637
1651
  axios: "^1.21.0",
1638
1652
  chokidar: "^4.0.3",
@@ -5227,11 +5241,26 @@ var require_chunking_engine = __commonJS({
5227
5241
  }
5228
5242
  });
5229
5243
 
5244
+ // src/retrieval/access-fields.js
5245
+ var require_access_fields = __commonJS({
5246
+ "src/retrieval/access-fields.js"(exports2, module2) {
5247
+ "use strict";
5248
+ function accessFields(doc) {
5249
+ const fields = {};
5250
+ if (doc.acl !== void 0) fields.acl = doc.acl;
5251
+ if (doc.requiredRole !== void 0) fields.requiredRole = doc.requiredRole;
5252
+ return fields;
5253
+ }
5254
+ module2.exports = { accessFields };
5255
+ }
5256
+ });
5257
+
5230
5258
  // src/retrieval/bm25-search.js
5231
5259
  var require_bm25_search = __commonJS({
5232
5260
  "src/retrieval/bm25-search.js"(exports2, module2) {
5233
5261
  "use strict";
5234
5262
  var { EventEmitter } = require("events");
5263
+ var { accessFields } = require_access_fields();
5235
5264
  var scoring = require_scoring();
5236
5265
  var DEFAULT_CONFIG = { k1: 1.2, b: 0.75 };
5237
5266
  var BM25Search = class extends EventEmitter {
@@ -5320,7 +5349,8 @@ var require_bm25_search = __commonJS({
5320
5349
  id: doc.id,
5321
5350
  score,
5322
5351
  content: doc.content || doc.text || "",
5323
- metadata: doc.metadata || {}
5352
+ metadata: doc.metadata || {},
5353
+ ...accessFields(doc)
5324
5354
  });
5325
5355
  }
5326
5356
  results.sort((a, b2) => b2.score - a.score);
@@ -7285,6 +7315,7 @@ var require_memory_retriever = __commonJS({
7285
7315
  var { randomBytes } = require("crypto");
7286
7316
  var { BaseConnector } = require_base_connector();
7287
7317
  var { throwIfAborted } = require_connector_utils();
7318
+ var { accessFields } = require_access_fields();
7288
7319
  var DEFAULT_CONFIG = {
7289
7320
  maxDocuments: 1e5,
7290
7321
  // 'error' rejects a store() that would exceed maxDocuments; 'fifo' evicts
@@ -7366,7 +7397,8 @@ var require_memory_retriever = __commonJS({
7366
7397
  this.documents.set(doc.id, {
7367
7398
  vector: doc.vector,
7368
7399
  metadata: doc.metadata || {},
7369
- content: doc.content || ""
7400
+ content: doc.content || "",
7401
+ ...accessFields(doc)
7370
7402
  });
7371
7403
  }
7372
7404
  if (vectors.length > 0) this.dimensions = dimensions;
@@ -7424,7 +7456,8 @@ var require_memory_retriever = __commonJS({
7424
7456
  id,
7425
7457
  score,
7426
7458
  metadata: doc.metadata,
7427
- content: doc.content
7459
+ content: doc.content,
7460
+ ...accessFields(doc)
7428
7461
  });
7429
7462
  }
7430
7463
  results.sort((a, b) => b.score - a.score);
@@ -7592,6 +7625,7 @@ var modules = {
7592
7625
  "reranker/cascade-reranker.js": () => require_cascade_reranker(),
7593
7626
  "reranker/embedding-reranker.js": () => require_embedding_reranker(),
7594
7627
  "reranker/scoring-reranker.js": () => require_scoring_reranker(),
7628
+ "retrieval/access-fields.js": () => require_access_fields(),
7595
7629
  "retrieval/bm25-search.js": () => require_bm25_search(),
7596
7630
  "retrieval/hybrid-retriever.js": () => require_hybrid_retriever(),
7597
7631
  "retrieval/rank-fusion.js": () => require_rank_fusion(),
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The access fields (`acl`, `requiredRole`) set on a document's top level.
3
+ * Stores keep them on each result, as well as whatever metadata holds, so
4
+ * RetrievalGuard sees a restriction wherever it was set.
5
+ * @param {object} doc
6
+ * @returns {object}
7
+ */
8
+ export function accessFields(doc: object): object;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devilsdev/rag-core",
3
- "version": "3.8.0",
3
+ "version": "3.8.1",
4
4
  "description": "createRagPipeline and its building blocks: retrieval, reranking, caching, cost tracking and model routing.",
5
5
  "keywords": [
6
6
  "rag",