@devilsdev/rag-pipeline-utils 2.4.4 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/.ragrc.schema.json +83 -192
  2. package/CHANGELOG.md +345 -0
  3. package/README.md +418 -117
  4. package/SECURITY.md +5 -5
  5. package/dist/experimental.cjs +2 -0
  6. package/dist/experimental.d.ts +1 -0
  7. package/dist/experimental.mjs +5 -0
  8. package/dist/index.cjs +4992 -1242
  9. package/dist/index.d.ts +80 -2
  10. package/dist/index.mjs +1 -1
  11. package/dist/types/agentic/agentic-pipeline.d.ts +103 -0
  12. package/dist/types/agentic/iterative-retriever.d.ts +85 -0
  13. package/dist/types/agentic/query-planner.d.ts +145 -0
  14. package/dist/types/agentic/self-critique.d.ts +45 -0
  15. package/dist/types/ai/adaptive-retrieval.d.ts +44 -0
  16. package/dist/types/ai/federation/federated-learning-coordinator.d.ts +62 -0
  17. package/dist/types/ai/multimodal-processing.d.ts +32 -0
  18. package/dist/types/ai/multimodal.d.ts +39 -0
  19. package/dist/types/ai/retrieval-engine.d.ts +37 -0
  20. package/dist/types/ai/training/model-training-orchestrator.d.ts +31 -0
  21. package/dist/types/chunking/chunking-engine.d.ts +70 -0
  22. package/dist/types/chunking/strategies/fixed-size.d.ts +17 -0
  23. package/dist/types/chunking/strategies/recursive.d.ts +20 -0
  24. package/dist/types/chunking/strategies/semantic.d.ts +19 -0
  25. package/dist/types/chunking/strategies/sentence.d.ts +13 -0
  26. package/dist/types/chunking/strategies/structure-aware.d.ts +19 -0
  27. package/dist/types/citation/citation-tracker.d.ts +64 -0
  28. package/dist/types/citation/hallucination-detector.d.ts +40 -0
  29. package/dist/types/citation/source-mapper.d.ts +37 -0
  30. package/dist/types/connectors/anthropic-connector.d.ts +92 -0
  31. package/dist/types/connectors/base-connector.d.ts +87 -0
  32. package/dist/types/connectors/cohere-connector.d.ts +89 -0
  33. package/dist/types/connectors/connector-utils.d.ts +110 -0
  34. package/dist/types/connectors/local-embedder.d.ts +86 -0
  35. package/dist/types/connectors/memory-retriever.d.ts +91 -0
  36. package/dist/types/connectors/ollama-connector.d.ts +110 -0
  37. package/dist/types/connectors/openai-connector.d.ts +114 -0
  38. package/dist/types/connectors/rag-prompt.d.ts +40 -0
  39. package/dist/types/cost/cost-calculator.d.ts +152 -0
  40. package/dist/types/cost/cost-tracker.d.ts +126 -0
  41. package/dist/types/cost/token-budget.d.ts +110 -0
  42. package/dist/types/dag/core/error-context.d.ts +239 -0
  43. package/dist/types/dag/core/execution-scheduler.d.ts +191 -0
  44. package/dist/types/dag/core/topology-validation.d.ts +226 -0
  45. package/dist/types/dag/dag-engine.d.ts +156 -0
  46. package/dist/types/dag/dag-node.d.ts +37 -0
  47. package/dist/types/dashboard/dashboard-generator.d.ts +127 -0
  48. package/dist/types/dashboard/metrics-aggregator.d.ts +218 -0
  49. package/dist/types/debug/execution-tracer.d.ts +57 -0
  50. package/dist/types/debug/trace-inspector.d.ts +31 -0
  51. package/dist/types/ecosystem/plugin-certification.d.ts +169 -0
  52. package/dist/types/enterprise/data-governance.d.ts +203 -0
  53. package/dist/types/enterprise/multi-tenancy.d.ts +137 -0
  54. package/dist/types/enterprise/sso-integration.d.ts +420 -0
  55. package/dist/types/evaluate/context-metrics.d.ts +55 -0
  56. package/dist/types/evaluate/faithfulness.d.ts +41 -0
  57. package/dist/types/evaluate/groundedness.d.ts +60 -0
  58. package/dist/types/evaluate/pipeline-evaluator.d.ts +88 -0
  59. package/dist/types/evaluate/relevance.d.ts +21 -0
  60. package/dist/types/evaluate/scoring.d.ts +123 -0
  61. package/dist/types/experimental.d.ts +15 -0
  62. package/dist/types/graph/entity-extractor.d.ts +84 -0
  63. package/dist/types/graph/graph-index.d.ts +49 -0
  64. package/dist/types/graph/graph-retriever.d.ts +81 -0
  65. package/dist/types/graph/knowledge-graph.d.ts +129 -0
  66. package/dist/types/guardrails/guardrails-pipeline.d.ts +63 -0
  67. package/dist/types/guardrails/injection-detector.d.ts +47 -0
  68. package/dist/types/guardrails/post-generation-guard.d.ts +61 -0
  69. package/dist/types/guardrails/pre-retrieval-guard.d.ts +64 -0
  70. package/dist/types/guardrails/retrieval-guard.d.ts +57 -0
  71. package/dist/types/mcp/mcp-server.d.ts +85 -0
  72. package/dist/types/mcp/mcp-tool-builder.d.ts +55 -0
  73. package/dist/types/reranker/cascade-reranker.d.ts +40 -0
  74. package/dist/types/reranker/embedding-reranker.d.ts +77 -0
  75. package/dist/types/reranker/scoring-reranker.d.ts +41 -0
  76. package/dist/types/retrieval/bm25-search.d.ts +43 -0
  77. package/dist/types/retrieval/file-vector-store.d.ts +87 -0
  78. package/dist/types/retrieval/hybrid-retriever.d.ts +35 -0
  79. package/dist/types/retrieval/rank-fusion.d.ts +10 -0
  80. package/dist/types/security/jwt-config.d.ts +80 -0
  81. package/dist/types/security/jwt-validator.d.ts +195 -0
  82. package/dist/types/security/plugin-sandbox.d.ts +158 -0
  83. package/dist/types/security/plugin-signature-verifier.d.ts +139 -0
  84. package/dist/types/security/validator.d.ts +5 -0
  85. package/dist/types/streaming/embedding-stream.d.ts +65 -0
  86. package/dist/types/streaming/sse-adapter.d.ts +59 -0
  87. package/dist/types/streaming/stream-router.d.ts +88 -0
  88. package/dist/types/streaming/streaming-embedder.d.ts +99 -0
  89. package/dist/types/streaming/websocket-adapter.d.ts +71 -0
  90. package/dist/types/templates/scaffold.d.ts +55 -0
  91. package/dist/types/templates/template-registry.d.ts +63 -0
  92. package/dist/types/utils/embed-query.d.ts +20 -0
  93. package/dist/types/utils/logger.d.ts +50 -0
  94. package/dist/types/utils/rate-limiter.d.ts +66 -0
  95. package/dist/types/utils/retry.d.ts +27 -0
  96. package/dist/types/utils/run-abort.d.ts +34 -0
  97. package/dist/types/utils/secure-logging.d.ts +51 -0
  98. package/dist/types/utils/structured-logger.d.ts +126 -0
  99. package/package.json +53 -29
  100. package/src/agentic/agentic-pipeline.js +75 -7
  101. package/src/agentic/iterative-retriever.js +47 -10
  102. package/src/agentic/query-planner.js +329 -78
  103. package/src/citation/citation-tracker.js +6 -4
  104. package/src/citation/hallucination-detector.js +2 -2
  105. package/src/citation/source-mapper.js +15 -28
  106. package/src/cli/commands/ai.js +101 -0
  107. package/src/cli/commands/plugin-hub/event-handlers.js +6 -0
  108. package/src/cli/commands/plugin-hub/hub-commands.js +0 -74
  109. package/src/cli/commands/plugin-hub/local-commands.js +143 -0
  110. package/src/cli/commands/plugin-hub.js +96 -36
  111. package/src/cli/diagnostics/config-checker.js +76 -63
  112. package/src/cli/diagnostics/environment-checker.js +62 -31
  113. package/src/cli/diagnostics/plugin-checker.js +36 -89
  114. package/src/cli/doctor-command.js +39 -5
  115. package/src/cli/enhanced-cli-commands.js +72 -217
  116. package/src/cli/handlers/ai-handler.js +364 -0
  117. package/src/cli/handlers/diagnostics-handler.js +78 -31
  118. package/src/cli/handlers/ingest-handler.js +28 -22
  119. package/src/cli/handlers/init-handler.js +148 -25
  120. package/src/cli/handlers/query-handler.js +41 -26
  121. package/src/cli/handlers/run-handler.js +16 -167
  122. package/src/cli/handlers/serve-handler.js +60 -0
  123. package/src/cli/services/bench-stats.js +54 -0
  124. package/src/cli/services/benchmark.js +161 -0
  125. package/src/cli/services/feedback.js +155 -0
  126. package/src/cli/services/rag-service.js +322 -0
  127. package/src/cli/shared/cli-utils.js +24 -7
  128. package/src/cli/shared/config-context.js +21 -0
  129. package/src/cli/wizard/config-builder.js +81 -0
  130. package/src/cli/wizard/init-wizard.js +617 -0
  131. package/src/config/component-factory.js +125 -0
  132. package/src/config/load-config.js +29 -10
  133. package/src/config/load-plugin-config.js +46 -2
  134. package/src/connectors/anthropic-connector.js +93 -55
  135. package/src/connectors/base-connector.js +74 -19
  136. package/src/connectors/cohere-connector.js +88 -32
  137. package/src/connectors/connector-utils.js +302 -0
  138. package/src/connectors/local-embedder.js +43 -5
  139. package/src/connectors/memory-retriever.js +108 -15
  140. package/src/connectors/ollama-connector.js +83 -49
  141. package/src/connectors/openai-connector.js +108 -44
  142. package/src/connectors/rag-prompt.js +88 -0
  143. package/src/core/create-pipeline.js +209 -60
  144. package/src/core/plugin-registry.js +87 -11
  145. package/src/cost/cost-calculator.js +205 -32
  146. package/src/dev/dev-server.js +166 -11
  147. package/src/dev/hot-reload.js +40 -1
  148. package/src/ecosystem/plugin-checks.js +181 -0
  149. package/src/ecosystem/plugin-hub.js +50 -125
  150. package/src/ecosystem/plugin-installer.js +298 -0
  151. package/src/ecosystem/plugin-probe.js +127 -0
  152. package/src/ecosystem/plugin-scanner.js +185 -0
  153. package/src/ecosystem/tar-extract.js +114 -0
  154. package/src/enterprise/audit-logging.js +158 -29
  155. package/src/enterprise/sso-integration.js +715 -228
  156. package/src/evaluate/context-metrics.js +28 -16
  157. package/src/evaluate/evaluator.js +3 -3
  158. package/src/evaluate/faithfulness.js +18 -14
  159. package/src/evaluate/groundedness.js +43 -12
  160. package/src/evaluate/pipeline-evaluator.js +35 -8
  161. package/src/evaluate/scoring.js +251 -3
  162. package/src/experimental.js +71 -0
  163. package/src/guardrails/guardrails-pipeline.js +69 -7
  164. package/src/guardrails/injection-detector.js +283 -0
  165. package/src/guardrails/post-generation-guard.js +19 -0
  166. package/src/guardrails/pre-retrieval-guard.js +36 -36
  167. package/src/guardrails/retrieval-guard.js +58 -8
  168. package/src/index.js +36 -1
  169. package/src/loader/document-reader.js +91 -0
  170. package/src/reranker/cascade-reranker.js +3 -0
  171. package/src/reranker/embedding-reranker.js +136 -21
  172. package/src/reranker/llm-reranker.js +79 -12
  173. package/src/reranker/scoring-reranker.js +3 -0
  174. package/src/retrieval/bm25-search.js +12 -6
  175. package/src/retrieval/file-vector-store.js +212 -0
  176. package/src/retrieval/hybrid-retriever.js +22 -19
  177. package/src/security/jwt-config.js +13 -2
  178. package/src/security/jwt-validator.js +134 -30
  179. package/src/security/plugin-sandbox.js +18 -1
  180. package/src/security/plugin-signature-verifier.js +245 -70
  181. package/src/utils/deprecate.js +69 -0
  182. package/src/utils/embed-query.js +33 -0
  183. package/src/utils/input-sanitizer.js +19 -4
  184. package/src/utils/logger.js +34 -4
  185. package/src/utils/run-abort.js +102 -0
  186. package/src/ai/federated-learning.js +0 -211
  187. package/src/ai/federation.js +0 -71
  188. package/src/ai/index.js +0 -22
  189. package/src/ai/model-trainer.js +0 -217
  190. package/src/ai/model-training.js +0 -202
  191. package/src/ai/multimodal/multi-modal-processor.js +0 -345
  192. package/src/ai/orchestrator.js +0 -65
  193. package/src/ai/retrieval/adaptive-retrieval-engine.js +0 -398
  194. package/src/cli/commands/ai-ml/adaptive-commands.js +0 -178
  195. package/src/cli/commands/ai-ml/federated-commands.js +0 -207
  196. package/src/cli/commands/ai-ml/index.js +0 -17
  197. package/src/cli/commands/ai-ml/multimodal-commands.js +0 -187
  198. package/src/cli/commands/ai-ml/shared.js +0 -51
  199. package/src/cli/commands/ai-ml/training-commands.js +0 -228
  200. package/src/cli/commands/ai-ml.js +0 -386
  201. package/src/cli/commands/docs.js +0 -228
  202. package/src/cli/commands/dx.js +0 -538
  203. package/src/cli/commands/wizard.js +0 -627
  204. package/src/cli/input-sanitization-middleware.js +0 -356
  205. package/src/cli/interactive-wizard.js +0 -373
  206. package/src/cli/templates/development.template.json +0 -64
  207. package/src/cli/templates/minimal.template.json +0 -33
  208. package/src/cli/templates/production.template.json +0 -104
  209. package/src/cli/templates/testing.template.json +0 -45
  210. package/src/cli/wizard/configuration.js +0 -148
  211. package/src/cli/wizard/observability.js +0 -79
  212. package/src/cli/wizard/performance.js +0 -76
  213. package/src/cli/wizard/plugin-selection.js +0 -297
  214. package/src/cli/wizard/preview-save.js +0 -172
  215. package/src/cli/wizard/project-setup.js +0 -66
  216. package/src/core/pipeline-factory.js +0 -59
  217. package/src/dag/enhanced-dag-engine.js +0 -894
  218. package/src/dx/index.js +0 -40
  219. package/src/dx/integration-templates.js +0 -662
  220. package/src/dx/performance-profiler.js +0 -968
  221. package/src/dx/realtime-debugger.js +0 -755
  222. package/src/dx/visual-pipeline-builder.js +0 -578
  223. package/src/ingest.js +0 -59
  224. package/src/pipeline/pipeline.js +0 -18
  225. package/src/query.js +0 -117
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Enterprise structured logger with correlation tracking
3
+ */
4
+ export class StructuredLogger {
5
+ constructor(options?: {});
6
+ serviceName: any;
7
+ environment: any;
8
+ logLevel: any;
9
+ enableCorrelation: boolean;
10
+ enableMetrics: boolean;
11
+ enableSecureLogging: boolean;
12
+ outputFormat: any;
13
+ metrics: {
14
+ logsWritten: number;
15
+ errorCount: number;
16
+ warnCount: number;
17
+ avgLatency: number;
18
+ };
19
+ /**
20
+ * Create correlation context for request tracking
21
+ * @param {string} correlationId - Optional correlation ID
22
+ * @param {Function} fn - Function to execute with context
23
+ * @returns {Promise} Result of function execution
24
+ */
25
+ withCorrelation(correlationId: string, fn: Function): Promise<any>;
26
+ /**
27
+ * Generate correlation ID
28
+ * @returns {string} Correlation ID
29
+ */
30
+ generateCorrelationId(): string;
31
+ /**
32
+ * Get current correlation context
33
+ * @returns {object|null} Current context
34
+ */
35
+ getContext(): object | null;
36
+ /**
37
+ * Create structured log entry
38
+ * @param {string} level - Log level
39
+ * @param {string} message - Log message
40
+ * @param {object} meta - Additional metadata
41
+ * @returns {object} Structured log entry
42
+ */
43
+ createLogEntry(level: string, message: string, meta?: object): object;
44
+ /**
45
+ * Check if log level should be written
46
+ * @param {string} level - Log level to check
47
+ * @returns {boolean} Whether to write log
48
+ */
49
+ shouldLog(level: string): boolean;
50
+ /**
51
+ * Write log entry to output
52
+ * @param {object} entry - Log entry
53
+ */
54
+ writeLog(entry: object): void;
55
+ /**
56
+ * Log error message
57
+ * @param {string} message - Error message
58
+ * @param {object} meta - Additional metadata
59
+ */
60
+ error(message: string, meta?: object): void;
61
+ /**
62
+ * Log warning message
63
+ * @param {string} message - Warning message
64
+ * @param {object} meta - Additional metadata
65
+ */
66
+ warn(message: string, meta?: object): void;
67
+ /**
68
+ * Log info message
69
+ * @param {string} message - Info message
70
+ * @param {object} meta - Additional metadata
71
+ */
72
+ info(message: string, meta?: object): void;
73
+ /**
74
+ * Log debug message
75
+ * @param {string} message - Debug message
76
+ * @param {object} meta - Additional metadata
77
+ */
78
+ debug(message: string, meta?: object): void;
79
+ /**
80
+ * Log trace message
81
+ * @param {string} message - Trace message
82
+ * @param {object} meta - Additional metadata
83
+ */
84
+ trace(message: string, meta?: object): void;
85
+ /**
86
+ * Create child logger with additional context
87
+ * @param {object} childMeta - Additional metadata for child logger
88
+ * @returns {ChildLogger} Child logger instance
89
+ */
90
+ child(childMeta?: object): ChildLogger;
91
+ /**
92
+ * Get logger metrics
93
+ * @returns {object} Logger performance metrics
94
+ */
95
+ getMetrics(): object;
96
+ /**
97
+ * Reset logger metrics
98
+ */
99
+ resetMetrics(): void;
100
+ }
101
+ /**
102
+ * Child logger with additional context
103
+ */
104
+ export class ChildLogger {
105
+ constructor(parent: any, childMeta: any);
106
+ parent: any;
107
+ childMeta: any;
108
+ error(message: any, meta?: {}): void;
109
+ warn(message: any, meta?: {}): void;
110
+ info(message: any, meta?: {}): void;
111
+ debug(message: any, meta?: {}): void;
112
+ trace(message: any, meta?: {}): void;
113
+ child(additionalMeta?: {}): ChildLogger;
114
+ withCorrelation(correlationId: any, fn: any): any;
115
+ getContext(): any;
116
+ getMetrics(): any;
117
+ }
118
+ /**
119
+ * Create structured logger instance
120
+ * @param {object} options - Logger configuration
121
+ * @returns {StructuredLogger} Logger instance
122
+ */
123
+ export function createLogger(options?: object): StructuredLogger;
124
+ declare const defaultLogger: StructuredLogger;
125
+ export declare let withCorrelation: any;
126
+ export { defaultLogger as logger };
package/package.json CHANGED
@@ -1,16 +1,28 @@
1
1
  {
2
2
  "name": "@devilsdev/rag-pipeline-utils",
3
- "version": "2.4.4",
4
- "description": "Composable RAG for Node.js — with built-in evaluation, citations, guardrails, and observability.",
3
+ "version": "2.5.0",
4
+ "description": "Composable retrieval-augmented generation (RAG) for Node.js: grounded citations, evaluation, guardrails, hybrid retrieval and a CLI.",
5
5
  "main": "dist/index.cjs",
6
6
  "type": "commonjs",
7
7
  "types": "dist/index.d.ts",
8
+ "typesVersions": {
9
+ "*": {
10
+ "experimental": [
11
+ "dist/experimental.d.ts"
12
+ ]
13
+ }
14
+ },
8
15
  "exports": {
9
16
  ".": {
10
17
  "types": "./dist/index.d.ts",
11
18
  "require": "./dist/index.cjs",
12
19
  "import": "./dist/index.mjs"
13
20
  },
21
+ "./experimental": {
22
+ "types": "./dist/experimental.d.ts",
23
+ "require": "./dist/experimental.cjs",
24
+ "import": "./dist/experimental.mjs"
25
+ },
14
26
  "./cli": "./bin/cli.js"
15
27
  },
16
28
  "bin": {
@@ -20,19 +32,21 @@
20
32
  "node": ">=18"
21
33
  },
22
34
  "scripts": {
23
- "build": "node scripts/build.js && node scripts/generate-types.js",
35
+ "build": "node scripts/build.js && node scripts/generate-types.js && node scripts/check-type-exports.js",
24
36
  "prepack": "npm run build",
25
37
  "docs:validate": "node scripts/validate-docs-examples.js",
26
38
  "verify:esm": "node scripts/verify-esm.mjs",
27
39
  "prepublishOnly": "npm run lint && npm test && npm run docs:validate && npm run verify:esm",
28
40
  "guard:cjs": "node scripts/guard-cjs.js",
29
41
  "pretest": "npm run guard:cjs && node scripts/setup.js",
30
- "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --config jest.config.js",
42
+ "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --maxWorkers=50% --config jest.config.js",
43
+ "test:serial": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --config jest.config.js",
31
44
  "test:ci": "jest --coverage",
32
45
  "test:open-handles": "jest --detectOpenHandles --runInBand",
33
46
  "test:report": "node scripts/test-reporter.js",
34
47
  "posttest": "node scripts/generate-test-reports.js",
35
- "format": "prettier --write \"src/**/*.{js,json}\"",
48
+ "format": "prettier --write --ignore-unknown \"{__tests__,scripts,bin,docs-site,examples,contracts}/**/*.{js,jsx,ts,tsx,mjs,cjs}\" \"*.{js,mjs,cjs}\" \"**/*.{json,md,mdx,yml,yaml,css,scss,html}\"",
49
+ "format:check": "prettier --check --ignore-unknown \"{__tests__,scripts,bin,docs-site,examples,contracts}/**/*.{js,jsx,ts,tsx,mjs,cjs}\" \"*.{js,mjs,cjs}\" \"**/*.{json,md,mdx,yml,yaml,css,scss,html}\"",
36
50
  "test:watch": "jest --watch",
37
51
  "lint": "eslint src --ext .js --ignore-path .gitignore",
38
52
  "lint:fix": "eslint . --ext .js,.jsx --ignore-path .gitignore --fix",
@@ -76,14 +90,8 @@
76
90
  "security:fix:force": "npm audit fix --force",
77
91
  "security:check": "npm audit --production && echo 'Production security check passed'",
78
92
  "security:report": "npm run security:audit:json && echo 'Security report generated: security-audit-report.json'",
79
- "ci:hardening": "node scripts/ci/harden-workflows.js",
80
93
  "ci:audit": "node scripts/audit/gha-audit.js",
81
- "ci:targeted-fixes": "node scripts/ci/targeted-security-fixes.js",
82
- "ci:comprehensive-hardening": "node scripts/ci/comprehensive-hardening.js",
83
- "ci:shell-security": "node scripts/ci/shell-security-hardening.js",
84
- "ci:final-fixes": "node scripts/ci/final-shell-injection-fixes.js",
85
94
  "ci:test-workflows": "node scripts/ci/test-workflows.js",
86
- "ci:fix-remaining": "node scripts/ci/fix-remaining-actions.js",
87
95
  "tests:categorize": "node scripts/test-categorizer.js",
88
96
  "tests:affected": "node scripts/run-affected.js",
89
97
  "tests:full": "jest --runInBand --reporters=default --json --outputFile=test-results-current.json",
@@ -92,6 +100,8 @@
92
100
  "test:integration": "jest __tests__/integration",
93
101
  "test:simple": "jest --maxWorkers=1 --no-coverage",
94
102
  "verify:pack": "node scripts/verify-npm-pack.js",
103
+ "smoke:pack": "node scripts/smoke-test-pack.js",
104
+ "demo:record": "vhs assets/demo.tape",
95
105
  "verify": "npm run lint && npm run typecheck --if-present && npm test",
96
106
  "sbom": "node scripts/generate-sbom.js",
97
107
  "observability:setup": "node scripts/setup-observability.js",
@@ -138,15 +148,12 @@
138
148
  "dist/",
139
149
  "src/",
140
150
  "!src/mocks/",
141
- "!src/ai/module-template.js",
142
- "!src/ai/index-fixed.js",
143
151
  "!src/dev/examples/",
144
152
  "!src/dev/README.md",
145
153
  "!src/utils/examples/",
146
154
  "!src/utils/ci/",
147
155
  "!src/ci/",
148
156
  "!src/scripts/",
149
- "!src/cli/plugin-marketplace-commands.js",
150
157
  "bin/",
151
158
  "contracts/",
152
159
  ".ragrc.schema.json",
@@ -162,13 +169,15 @@
162
169
  },
163
170
  "lint-staged": {
164
171
  "src/**/*.{js,ts,jsx,tsx}": "eslint --fix",
165
- "**/*.{js,ts,jsx,tsx,json,md,mdx,yml,yaml,css,scss,html}": "prettier --write --ignore-unknown"
172
+ "{__tests__,scripts,bin,docs-site,examples,contracts}/**/*.{js,jsx,ts,tsx,mjs,cjs}": "prettier --write --ignore-unknown",
173
+ "*.{js,mjs,cjs}": "prettier --write --ignore-unknown",
174
+ "**/*.{json,md,mdx,yml,yaml,css,scss,html}": "prettier --write --ignore-unknown"
166
175
  },
167
176
  "devDependencies": {
168
177
  "@babel/core": "^7.26.10",
169
178
  "@babel/preset-env": "^7.26.9",
170
- "@docusaurus/core": "3.5.2",
171
- "@docusaurus/preset-classic": "3.5.2",
179
+ "@docusaurus/core": "3.10.0",
180
+ "@docusaurus/preset-classic": "3.10.0",
172
181
  "@octokit/rest": "^21.1.1",
173
182
  "@opentelemetry/api": "^1.9.0",
174
183
  "@opentelemetry/auto-instrumentations-node": "^0.52.1",
@@ -180,17 +189,10 @@
180
189
  "@opentelemetry/sdk-node": "^0.53.0",
181
190
  "@opentelemetry/sdk-trace-base": "^1.26.0",
182
191
  "@opentelemetry/semantic-conventions": "^1.27.0",
183
- "@semantic-release/changelog": "^6.0.3",
184
- "@semantic-release/commit-analyzer": "^13.0.1",
185
- "@semantic-release/git": "^10.0.1",
186
- "@semantic-release/github": "^9.2.6",
187
- "@semantic-release/npm": "^11.0.3",
188
- "@semantic-release/release-notes-generator": "^14.0.3",
189
192
  "@types/jest": "^29.5.14",
193
+ "@types/node": "22.14.1",
190
194
  "acorn": "8.15.0",
191
195
  "babel-jest": "^29.7.0",
192
- "codecov": "3.6.2",
193
- "conventional-changelog-conventionalcommits": "^8.0.0",
194
196
  "cross-env": "7.0.3",
195
197
  "esbuild": "^0.25.2",
196
198
  "eslint": "^8.57.1",
@@ -207,24 +209,46 @@
207
209
  "prettier": "^3.5.3",
208
210
  "prop-types": "^15.8.1",
209
211
  "rimraf": "^6.0.1",
210
- "semantic-release": "^21.1.2",
211
212
  "sharp": "^0.34.1",
212
213
  "ts-jest": "^29.3.2",
214
+ "typescript": "5.8.3",
213
215
  "why-is-node-running": "^3.2.2"
214
216
  },
215
217
  "dependencies": {
216
218
  "ajv": "^8.17.1",
217
- "axios": "^1.8.4",
218
- "chalk": "^5.4.1",
219
+ "ajv-formats": "2.1.1",
220
+ "axios": "^1.21.0",
221
+ "chalk": "4.1.2",
219
222
  "chokidar": "^4.0.3",
223
+ "cli-table3": "0.6.5",
220
224
  "commander": "^13.1.0",
221
225
  "csv-parse": "^5.6.0",
222
- "dotenv": "^16.5.0",
223
226
  "fast-glob": "^3.3.3",
224
227
  "inquirer": "^8.2.5",
225
228
  "jsdom": "^26.1.0",
226
229
  "jsonwebtoken": "9.0.2",
230
+ "marked": "15.0.12",
227
231
  "openai": "^4.93.0",
232
+ "ora": "5.4.1",
228
233
  "pino": "^9.6.0"
234
+ },
235
+ "peerDependencies": {
236
+ "isolated-vm": ">=5.0.0",
237
+ "pino-pretty": ">=10.0.0"
238
+ },
239
+ "peerDependenciesMeta": {
240
+ "isolated-vm": {
241
+ "optional": true
242
+ },
243
+ "pino-pretty": {
244
+ "optional": true
245
+ }
246
+ },
247
+ "overrides": {
248
+ "fast-uri": "^3.1.9",
249
+ "follow-redirects": "^1.16.2",
250
+ "form-data": "^4.0.6",
251
+ "ws@^8.0.0": "^8.21.0",
252
+ "zod": "^4.6.7"
229
253
  }
230
254
  }
@@ -5,6 +5,8 @@ const { DAG } = require('../dag/dag-engine');
5
5
  const { QueryPlanner } = require('./query-planner');
6
6
  const { IterativeRetriever } = require('./iterative-retriever');
7
7
  const { SelfCritiqueChecker } = require('./self-critique');
8
+ const { embedQuery, canEmbed } = require('../utils/embed-query');
9
+ const { createRunAbort } = require('../utils/run-abort');
8
10
 
9
11
  /**
10
12
  * Default configuration for the AgenticPipeline.
@@ -14,6 +16,7 @@ const DEFAULT_CONFIG = {
14
16
  maxConcurrency: 3,
15
17
  timeout: 60000,
16
18
  enablePlanning: true,
19
+ enableLlmPlanning: false,
17
20
  enableCritique: true,
18
21
  enableIterativeRetrieval: false,
19
22
  maxIterations: 3,
@@ -33,6 +36,9 @@ class AgenticPipeline extends EventEmitter {
33
36
  * @param {number} [options.maxConcurrency=3] - Max concurrent DAG node execution
34
37
  * @param {number} [options.timeout=60000] - Global timeout in ms
35
38
  * @param {boolean} [options.enablePlanning=true] - Whether to decompose queries
39
+ * @param {boolean} [options.enableLlmPlanning=false] - Ask the llm for the
40
+ * sub-queries (strictly validated, heuristic fallback); costs one extra
41
+ * llm.generate() call per run
36
42
  * @param {boolean} [options.enableCritique=true] - Whether to self-critique answers
37
43
  * @param {boolean} [options.enableIterativeRetrieval=false] - Whether to use iterative retrieval
38
44
  * @param {number} [options.maxIterations=3] - Max iterations for iterative retrieval
@@ -62,7 +68,16 @@ class AgenticPipeline extends EventEmitter {
62
68
  * @param {object} params.retriever - Retriever instance with .retrieve() method
63
69
  * @param {object} params.llm - LLM instance with .generate() method
64
70
  * @param {Array<number>} [params.queryVector] - Optional pre-computed query vector
71
+ * @param {object} [params.embedder] - Optional embedder; when given, each
72
+ * sub-query is embedded on its own instead of reusing queryVector
65
73
  * @param {object} [params.options={}] - Extra options passed to llm.generate()
74
+ * @param {AbortSignal} [params.options.signal] - Cancels the run. The run
75
+ * has its own AbortController (also aborted after `timeout`); its signal
76
+ * is passed to retriever.retrieve({ ..., signal }), embedder.embedQuery /
77
+ * embed(text, { signal }) and llm.generate(query, docs, { ...options,
78
+ * signal }), and no later stage starts once it aborts. The returned
79
+ * promise then rejects with Error('Execution timeout') or
80
+ * Error('Execution aborted').
66
81
  * @returns {Promise<{
67
82
  * success: boolean,
68
83
  * query: string,
@@ -74,7 +89,7 @@ class AgenticPipeline extends EventEmitter {
74
89
  * }>}
75
90
  * @throws {Error} If retriever or llm is missing
76
91
  */
77
- async run({ query, retriever, llm, queryVector, options = {} }) {
92
+ async run({ query, retriever, llm, queryVector, embedder, options = {} }) {
78
93
  // 1. Validate inputs
79
94
  if (!retriever || typeof retriever.retrieve !== 'function') {
80
95
  throw new Error(
@@ -92,10 +107,44 @@ class AgenticPipeline extends EventEmitter {
92
107
  );
93
108
  }
94
109
 
110
+ // One AbortController per run: aborted on timeout or when the caller's
111
+ // options.signal aborts. Its signal goes to every component call.
112
+ const runAbort = createRunAbort({
113
+ timeout: this.config.timeout,
114
+ signal: options && options.signal,
115
+ });
116
+ try {
117
+ return await runAbort.race(
118
+ this._execute(
119
+ { query, retriever, llm, queryVector, embedder, options },
120
+ runAbort,
121
+ ),
122
+ );
123
+ } finally {
124
+ runAbort.cleanup();
125
+ }
126
+ }
127
+
128
+ /**
129
+ * @param {object} params - Validated run() parameters
130
+ * @param {object} runAbort - Per-run cancellation (see utils/run-abort)
131
+ * @returns {Promise<object>}
132
+ * @private
133
+ */
134
+ async _execute(
135
+ { query, retriever, llm, queryVector, embedder, options },
136
+ runAbort,
137
+ ) {
138
+ const { signal } = runAbort;
139
+ const llmOptions = { ...(options || {}), signal };
140
+
95
141
  // Phase 1: Plan
96
142
  let subQueries;
97
143
  if (this.config.enablePlanning) {
98
- const plan = this.planner.plan(query);
144
+ const plan = this.config.enableLlmPlanning
145
+ ? await this.planner.plan(query, { llm, signal })
146
+ : this.planner.plan(query);
147
+ runAbort.throwIfAborted();
99
148
  subQueries = plan.subQueries;
100
149
  this.emit('planned', plan);
101
150
  } else {
@@ -111,19 +160,31 @@ class AgenticPipeline extends EventEmitter {
111
160
  dag.addNode(
112
161
  `retrieve-${i}`,
113
162
  async () => {
163
+ runAbort.throwIfAborted();
164
+ // queryVector belongs to the original query; a decomposed
165
+ // sub-query needs its own embedding when an embedder is available.
166
+ const needsOwnVector =
167
+ canEmbed(embedder) && (sq.subQuery !== query || !queryVector);
168
+ const subQueryVector = needsOwnVector
169
+ ? await embedQuery(embedder, sq.subQuery, { signal })
170
+ : queryVector;
171
+ runAbort.throwIfAborted();
114
172
  if (this.iterativeRetriever) {
115
173
  const result = await this.iterativeRetriever.retrieve({
116
174
  query: sq.subQuery,
117
175
  retriever,
118
176
  llm,
119
- queryVector,
177
+ queryVector: subQueryVector,
178
+ embedder,
179
+ signal,
120
180
  });
121
181
  return result.results;
122
182
  }
123
183
  return await retriever.retrieve({
124
184
  query: sq.subQuery,
125
- queryVector,
185
+ queryVector: subQueryVector,
126
186
  topK: 10,
187
+ signal,
127
188
  });
128
189
  },
129
190
  { timeout: this.config.timeout / 2, priority: sq.priority },
@@ -132,6 +193,7 @@ class AgenticPipeline extends EventEmitter {
132
193
 
133
194
  // Add merge node
134
195
  dag.addNode('merge', async (inputs) => {
196
+ runAbort.throwIfAborted();
135
197
  const allResults = Array.isArray(inputs)
136
198
  ? inputs.flat()
137
199
  : [inputs].flat();
@@ -155,8 +217,10 @@ class AgenticPipeline extends EventEmitter {
155
217
  // Add critique + generate nodes
156
218
  if (this.config.enableCritique) {
157
219
  dag.addNode('pre-generate', async (mergedResults) => {
220
+ runAbort.throwIfAborted();
158
221
  // Generate initial answer for critique
159
- const answer = await llm.generate(query, mergedResults, options);
222
+ const answer = await llm.generate(query, mergedResults, llmOptions);
223
+ runAbort.throwIfAborted();
160
224
  const critique = this.critiqueChecker.check(
161
225
  String(answer),
162
226
  mergedResults,
@@ -167,6 +231,7 @@ class AgenticPipeline extends EventEmitter {
167
231
  dag.connect('merge', 'pre-generate');
168
232
 
169
233
  dag.addNode('generate', async ({ answer, mergedResults, critique }) => {
234
+ runAbort.throwIfAborted();
170
235
  if (critique.approved) {
171
236
  return { answer, results: mergedResults, critique };
172
237
  }
@@ -178,7 +243,7 @@ class AgenticPipeline extends EventEmitter {
178
243
  const refinedAnswer = await llm.generate(
179
244
  refinedPrompt,
180
245
  mergedResults,
181
- options,
246
+ llmOptions,
182
247
  );
183
248
  return {
184
249
  answer: String(refinedAnswer),
@@ -189,7 +254,8 @@ class AgenticPipeline extends EventEmitter {
189
254
  dag.connect('pre-generate', 'generate');
190
255
  } else {
191
256
  dag.addNode('generate', async (mergedResults) => {
192
- const answer = await llm.generate(query, mergedResults, options);
257
+ runAbort.throwIfAborted();
258
+ const answer = await llm.generate(query, mergedResults, llmOptions);
193
259
  return { answer: String(answer), results: mergedResults };
194
260
  });
195
261
  dag.connect('merge', 'generate');
@@ -206,6 +272,8 @@ class AgenticPipeline extends EventEmitter {
206
272
  continueOnError: true,
207
273
  gracefulDegradation: true,
208
274
  });
275
+ // continueOnError lets nodes degrade; an abort must not look like success.
276
+ runAbort.throwIfAborted();
209
277
 
210
278
  // Extract final result from generate node
211
279
  const output = dagResult?.answer
@@ -3,6 +3,7 @@
3
3
  const { EventEmitter } = require('events');
4
4
  const { retry } = require('../utils/retry');
5
5
  const { tokenize, computeJaccardSimilarity } = require('../evaluate/scoring');
6
+ const { embedQuery, canEmbed } = require('../utils/embed-query');
6
7
 
7
8
  /**
8
9
  * Default configuration for the IterativeRetriever.
@@ -110,10 +111,26 @@ class IterativeRetriever extends EventEmitter {
110
111
  * @param {object} params.retriever - Retriever instance with .retrieve() method
111
112
  * @param {object} [params.llm] - Optional LLM for query refinement
112
113
  * @param {Array<number>} [params.queryVector] - Optional pre-computed query vector
114
+ * @param {object} [params.embedder] - Optional embedder; when given, each
115
+ * refined query is re-embedded instead of reusing queryVector
116
+ * @param {AbortSignal} [params.signal] - Cancels the loop: passed to
117
+ * retriever.retrieve({ ..., signal }), the embedder and llm.generate(...,
118
+ * { signal }); no further iteration, retry or refinement starts once it
119
+ * has aborted, and the call rejects with the signal's reason
113
120
  * @returns {Promise<{results: Array<object>, iterations: number, converged: boolean, coverage: number}>}
114
121
  * @throws {Error} If query or retriever is missing
115
122
  */
116
- async retrieve({ query, retriever, llm, queryVector }) {
123
+ async retrieve({ query, retriever, llm, queryVector, embedder, signal }) {
124
+ const throwIfAborted = () => {
125
+ if (signal && signal.aborted) {
126
+ throw signal.reason instanceof Error
127
+ ? signal.reason
128
+ : new Error('Execution aborted');
129
+ }
130
+ };
131
+ // Only add the signal when there is one, so components keep the
132
+ // argument shapes they had before.
133
+ const withSignal = (obj) => (signal ? { ...obj, signal } : obj);
117
134
  // 1. Validate inputs
118
135
  if (!query || typeof query !== 'string' || !query.trim()) {
119
136
  throw new Error(
@@ -135,13 +152,31 @@ class IterativeRetriever extends EventEmitter {
135
152
 
136
153
  // 3. Retrieval loop
137
154
  while (iterations < this.config.maxIterations) {
155
+ throwIfAborted();
138
156
  // a. Retrieve with retry
139
157
  const retrieveQuery = currentQuery;
140
- const newResults = await retry(
141
- () =>
142
- retriever.retrieve({ query: retrieveQuery, queryVector, topK: 10 }),
143
- this.config.retryOptions,
144
- );
158
+ // Without an embedder the caller's vector is all we have; it only
159
+ // matches the original query, so refined queries need re-embedding.
160
+ const retrieveVector =
161
+ canEmbed(embedder) && (retrieveQuery !== query || !queryVector)
162
+ ? await embedQuery(
163
+ embedder,
164
+ retrieveQuery,
165
+ signal ? { signal } : undefined,
166
+ )
167
+ : queryVector;
168
+ const newResults = await retry(() => {
169
+ // Do not retry (or start) a retrieval after an abort.
170
+ throwIfAborted();
171
+ return retriever.retrieve(
172
+ withSignal({
173
+ query: retrieveQuery,
174
+ queryVector: retrieveVector,
175
+ topK: 10,
176
+ }),
177
+ );
178
+ }, this.config.retryOptions);
179
+ throwIfAborted();
145
180
 
146
181
  // b. Merge and deduplicate
147
182
  const resultsArray = Array.isArray(newResults) ? newResults : [];
@@ -173,16 +208,18 @@ class IterativeRetriever extends EventEmitter {
173
208
  // Try LLM-based refinement first
174
209
  if (llm && typeof llm.generate === 'function') {
175
210
  try {
176
- refined = await llm.generate(
177
- `Given the query "${query}" and that current results don't fully cover the topic, generate a refined search query to find missing information.`,
178
- accumulatedResults,
179
- );
211
+ const prompt = `Given the query "${query}" and that current results don't fully cover the topic, generate a refined search query to find missing information.`;
212
+ refined = signal
213
+ ? await llm.generate(prompt, accumulatedResults, { signal })
214
+ : await llm.generate(prompt, accumulatedResults);
180
215
  if (refined && typeof refined === 'string' && refined.trim()) {
181
216
  refined = refined.trim();
182
217
  } else {
183
218
  refined = null;
184
219
  }
185
220
  } catch (_err) {
221
+ // An abort is not an LLM failure: stop instead of falling back.
222
+ throwIfAborted();
186
223
  // LLM failed -- fall through to heuristic
187
224
  refined = null;
188
225
  }