@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.
- package/.ragrc.schema.json +83 -192
- package/CHANGELOG.md +345 -0
- package/README.md +418 -117
- package/SECURITY.md +5 -5
- package/dist/experimental.cjs +2 -0
- package/dist/experimental.d.ts +1 -0
- package/dist/experimental.mjs +5 -0
- package/dist/index.cjs +4992 -1242
- package/dist/index.d.ts +80 -2
- package/dist/index.mjs +1 -1
- package/dist/types/agentic/agentic-pipeline.d.ts +103 -0
- package/dist/types/agentic/iterative-retriever.d.ts +85 -0
- package/dist/types/agentic/query-planner.d.ts +145 -0
- package/dist/types/agentic/self-critique.d.ts +45 -0
- package/dist/types/ai/adaptive-retrieval.d.ts +44 -0
- package/dist/types/ai/federation/federated-learning-coordinator.d.ts +62 -0
- package/dist/types/ai/multimodal-processing.d.ts +32 -0
- package/dist/types/ai/multimodal.d.ts +39 -0
- package/dist/types/ai/retrieval-engine.d.ts +37 -0
- package/dist/types/ai/training/model-training-orchestrator.d.ts +31 -0
- package/dist/types/chunking/chunking-engine.d.ts +70 -0
- package/dist/types/chunking/strategies/fixed-size.d.ts +17 -0
- package/dist/types/chunking/strategies/recursive.d.ts +20 -0
- package/dist/types/chunking/strategies/semantic.d.ts +19 -0
- package/dist/types/chunking/strategies/sentence.d.ts +13 -0
- package/dist/types/chunking/strategies/structure-aware.d.ts +19 -0
- package/dist/types/citation/citation-tracker.d.ts +64 -0
- package/dist/types/citation/hallucination-detector.d.ts +40 -0
- package/dist/types/citation/source-mapper.d.ts +37 -0
- package/dist/types/connectors/anthropic-connector.d.ts +92 -0
- package/dist/types/connectors/base-connector.d.ts +87 -0
- package/dist/types/connectors/cohere-connector.d.ts +89 -0
- package/dist/types/connectors/connector-utils.d.ts +110 -0
- package/dist/types/connectors/local-embedder.d.ts +86 -0
- package/dist/types/connectors/memory-retriever.d.ts +91 -0
- package/dist/types/connectors/ollama-connector.d.ts +110 -0
- package/dist/types/connectors/openai-connector.d.ts +114 -0
- package/dist/types/connectors/rag-prompt.d.ts +40 -0
- package/dist/types/cost/cost-calculator.d.ts +152 -0
- package/dist/types/cost/cost-tracker.d.ts +126 -0
- package/dist/types/cost/token-budget.d.ts +110 -0
- package/dist/types/dag/core/error-context.d.ts +239 -0
- package/dist/types/dag/core/execution-scheduler.d.ts +191 -0
- package/dist/types/dag/core/topology-validation.d.ts +226 -0
- package/dist/types/dag/dag-engine.d.ts +156 -0
- package/dist/types/dag/dag-node.d.ts +37 -0
- package/dist/types/dashboard/dashboard-generator.d.ts +127 -0
- package/dist/types/dashboard/metrics-aggregator.d.ts +218 -0
- package/dist/types/debug/execution-tracer.d.ts +57 -0
- package/dist/types/debug/trace-inspector.d.ts +31 -0
- package/dist/types/ecosystem/plugin-certification.d.ts +169 -0
- package/dist/types/enterprise/data-governance.d.ts +203 -0
- package/dist/types/enterprise/multi-tenancy.d.ts +137 -0
- package/dist/types/enterprise/sso-integration.d.ts +420 -0
- package/dist/types/evaluate/context-metrics.d.ts +55 -0
- package/dist/types/evaluate/faithfulness.d.ts +41 -0
- package/dist/types/evaluate/groundedness.d.ts +60 -0
- package/dist/types/evaluate/pipeline-evaluator.d.ts +88 -0
- package/dist/types/evaluate/relevance.d.ts +21 -0
- package/dist/types/evaluate/scoring.d.ts +123 -0
- package/dist/types/experimental.d.ts +15 -0
- package/dist/types/graph/entity-extractor.d.ts +84 -0
- package/dist/types/graph/graph-index.d.ts +49 -0
- package/dist/types/graph/graph-retriever.d.ts +81 -0
- package/dist/types/graph/knowledge-graph.d.ts +129 -0
- package/dist/types/guardrails/guardrails-pipeline.d.ts +63 -0
- package/dist/types/guardrails/injection-detector.d.ts +47 -0
- package/dist/types/guardrails/post-generation-guard.d.ts +61 -0
- package/dist/types/guardrails/pre-retrieval-guard.d.ts +64 -0
- package/dist/types/guardrails/retrieval-guard.d.ts +57 -0
- package/dist/types/mcp/mcp-server.d.ts +85 -0
- package/dist/types/mcp/mcp-tool-builder.d.ts +55 -0
- package/dist/types/reranker/cascade-reranker.d.ts +40 -0
- package/dist/types/reranker/embedding-reranker.d.ts +77 -0
- package/dist/types/reranker/scoring-reranker.d.ts +41 -0
- package/dist/types/retrieval/bm25-search.d.ts +43 -0
- package/dist/types/retrieval/file-vector-store.d.ts +87 -0
- package/dist/types/retrieval/hybrid-retriever.d.ts +35 -0
- package/dist/types/retrieval/rank-fusion.d.ts +10 -0
- package/dist/types/security/jwt-config.d.ts +80 -0
- package/dist/types/security/jwt-validator.d.ts +195 -0
- package/dist/types/security/plugin-sandbox.d.ts +158 -0
- package/dist/types/security/plugin-signature-verifier.d.ts +139 -0
- package/dist/types/security/validator.d.ts +5 -0
- package/dist/types/streaming/embedding-stream.d.ts +65 -0
- package/dist/types/streaming/sse-adapter.d.ts +59 -0
- package/dist/types/streaming/stream-router.d.ts +88 -0
- package/dist/types/streaming/streaming-embedder.d.ts +99 -0
- package/dist/types/streaming/websocket-adapter.d.ts +71 -0
- package/dist/types/templates/scaffold.d.ts +55 -0
- package/dist/types/templates/template-registry.d.ts +63 -0
- package/dist/types/utils/embed-query.d.ts +20 -0
- package/dist/types/utils/logger.d.ts +50 -0
- package/dist/types/utils/rate-limiter.d.ts +66 -0
- package/dist/types/utils/retry.d.ts +27 -0
- package/dist/types/utils/run-abort.d.ts +34 -0
- package/dist/types/utils/secure-logging.d.ts +51 -0
- package/dist/types/utils/structured-logger.d.ts +126 -0
- package/package.json +53 -29
- package/src/agentic/agentic-pipeline.js +75 -7
- package/src/agentic/iterative-retriever.js +47 -10
- package/src/agentic/query-planner.js +329 -78
- package/src/citation/citation-tracker.js +6 -4
- package/src/citation/hallucination-detector.js +2 -2
- package/src/citation/source-mapper.js +15 -28
- package/src/cli/commands/ai.js +101 -0
- package/src/cli/commands/plugin-hub/event-handlers.js +6 -0
- package/src/cli/commands/plugin-hub/hub-commands.js +0 -74
- package/src/cli/commands/plugin-hub/local-commands.js +143 -0
- package/src/cli/commands/plugin-hub.js +96 -36
- package/src/cli/diagnostics/config-checker.js +76 -63
- package/src/cli/diagnostics/environment-checker.js +62 -31
- package/src/cli/diagnostics/plugin-checker.js +36 -89
- package/src/cli/doctor-command.js +39 -5
- package/src/cli/enhanced-cli-commands.js +72 -217
- package/src/cli/handlers/ai-handler.js +364 -0
- package/src/cli/handlers/diagnostics-handler.js +78 -31
- package/src/cli/handlers/ingest-handler.js +28 -22
- package/src/cli/handlers/init-handler.js +148 -25
- package/src/cli/handlers/query-handler.js +41 -26
- package/src/cli/handlers/run-handler.js +16 -167
- package/src/cli/handlers/serve-handler.js +60 -0
- package/src/cli/services/bench-stats.js +54 -0
- package/src/cli/services/benchmark.js +161 -0
- package/src/cli/services/feedback.js +155 -0
- package/src/cli/services/rag-service.js +322 -0
- package/src/cli/shared/cli-utils.js +24 -7
- package/src/cli/shared/config-context.js +21 -0
- package/src/cli/wizard/config-builder.js +81 -0
- package/src/cli/wizard/init-wizard.js +617 -0
- package/src/config/component-factory.js +125 -0
- package/src/config/load-config.js +29 -10
- package/src/config/load-plugin-config.js +46 -2
- package/src/connectors/anthropic-connector.js +93 -55
- package/src/connectors/base-connector.js +74 -19
- package/src/connectors/cohere-connector.js +88 -32
- package/src/connectors/connector-utils.js +302 -0
- package/src/connectors/local-embedder.js +43 -5
- package/src/connectors/memory-retriever.js +108 -15
- package/src/connectors/ollama-connector.js +83 -49
- package/src/connectors/openai-connector.js +108 -44
- package/src/connectors/rag-prompt.js +88 -0
- package/src/core/create-pipeline.js +209 -60
- package/src/core/plugin-registry.js +87 -11
- package/src/cost/cost-calculator.js +205 -32
- package/src/dev/dev-server.js +166 -11
- package/src/dev/hot-reload.js +40 -1
- package/src/ecosystem/plugin-checks.js +181 -0
- package/src/ecosystem/plugin-hub.js +50 -125
- package/src/ecosystem/plugin-installer.js +298 -0
- package/src/ecosystem/plugin-probe.js +127 -0
- package/src/ecosystem/plugin-scanner.js +185 -0
- package/src/ecosystem/tar-extract.js +114 -0
- package/src/enterprise/audit-logging.js +158 -29
- package/src/enterprise/sso-integration.js +715 -228
- package/src/evaluate/context-metrics.js +28 -16
- package/src/evaluate/evaluator.js +3 -3
- package/src/evaluate/faithfulness.js +18 -14
- package/src/evaluate/groundedness.js +43 -12
- package/src/evaluate/pipeline-evaluator.js +35 -8
- package/src/evaluate/scoring.js +251 -3
- package/src/experimental.js +71 -0
- package/src/guardrails/guardrails-pipeline.js +69 -7
- package/src/guardrails/injection-detector.js +283 -0
- package/src/guardrails/post-generation-guard.js +19 -0
- package/src/guardrails/pre-retrieval-guard.js +36 -36
- package/src/guardrails/retrieval-guard.js +58 -8
- package/src/index.js +36 -1
- package/src/loader/document-reader.js +91 -0
- package/src/reranker/cascade-reranker.js +3 -0
- package/src/reranker/embedding-reranker.js +136 -21
- package/src/reranker/llm-reranker.js +79 -12
- package/src/reranker/scoring-reranker.js +3 -0
- package/src/retrieval/bm25-search.js +12 -6
- package/src/retrieval/file-vector-store.js +212 -0
- package/src/retrieval/hybrid-retriever.js +22 -19
- package/src/security/jwt-config.js +13 -2
- package/src/security/jwt-validator.js +134 -30
- package/src/security/plugin-sandbox.js +18 -1
- package/src/security/plugin-signature-verifier.js +245 -70
- package/src/utils/deprecate.js +69 -0
- package/src/utils/embed-query.js +33 -0
- package/src/utils/input-sanitizer.js +19 -4
- package/src/utils/logger.js +34 -4
- package/src/utils/run-abort.js +102 -0
- package/src/ai/federated-learning.js +0 -211
- package/src/ai/federation.js +0 -71
- package/src/ai/index.js +0 -22
- package/src/ai/model-trainer.js +0 -217
- package/src/ai/model-training.js +0 -202
- package/src/ai/multimodal/multi-modal-processor.js +0 -345
- package/src/ai/orchestrator.js +0 -65
- package/src/ai/retrieval/adaptive-retrieval-engine.js +0 -398
- package/src/cli/commands/ai-ml/adaptive-commands.js +0 -178
- package/src/cli/commands/ai-ml/federated-commands.js +0 -207
- package/src/cli/commands/ai-ml/index.js +0 -17
- package/src/cli/commands/ai-ml/multimodal-commands.js +0 -187
- package/src/cli/commands/ai-ml/shared.js +0 -51
- package/src/cli/commands/ai-ml/training-commands.js +0 -228
- package/src/cli/commands/ai-ml.js +0 -386
- package/src/cli/commands/docs.js +0 -228
- package/src/cli/commands/dx.js +0 -538
- package/src/cli/commands/wizard.js +0 -627
- package/src/cli/input-sanitization-middleware.js +0 -356
- package/src/cli/interactive-wizard.js +0 -373
- package/src/cli/templates/development.template.json +0 -64
- package/src/cli/templates/minimal.template.json +0 -33
- package/src/cli/templates/production.template.json +0 -104
- package/src/cli/templates/testing.template.json +0 -45
- package/src/cli/wizard/configuration.js +0 -148
- package/src/cli/wizard/observability.js +0 -79
- package/src/cli/wizard/performance.js +0 -76
- package/src/cli/wizard/plugin-selection.js +0 -297
- package/src/cli/wizard/preview-save.js +0 -172
- package/src/cli/wizard/project-setup.js +0 -66
- package/src/core/pipeline-factory.js +0 -59
- package/src/dag/enhanced-dag-engine.js +0 -894
- package/src/dx/index.js +0 -40
- package/src/dx/integration-templates.js +0 -662
- package/src/dx/performance-profiler.js +0 -968
- package/src/dx/realtime-debugger.js +0 -755
- package/src/dx/visual-pipeline-builder.js +0 -578
- package/src/ingest.js +0 -59
- package/src/pipeline/pipeline.js +0 -18
- 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
|
-
"description": "Composable RAG for Node.js
|
|
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 --
|
|
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 \"
|
|
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
|
-
"
|
|
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.
|
|
171
|
-
"@docusaurus/preset-classic": "3.
|
|
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
|
-
"
|
|
218
|
-
"
|
|
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.
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
177
|
-
|
|
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
|
}
|