@mcp-abap-adt/llm-agent-libs 12.0.2 → 12.0.4
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/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/llm-adapter.d.ts +24 -0
- package/dist/adapters/llm-adapter.d.ts.map +1 -0
- package/dist/adapters/llm-adapter.js +345 -0
- package/dist/adapters/llm-adapter.js.map +1 -0
- package/dist/adapters/llm-provider-bridge.d.ts +30 -0
- package/dist/adapters/llm-provider-bridge.d.ts.map +1 -0
- package/dist/adapters/llm-provider-bridge.js +122 -0
- package/dist/adapters/llm-provider-bridge.js.map +1 -0
- package/dist/adapters/non-streaming-llm.d.ts +18 -0
- package/dist/adapters/non-streaming-llm.d.ts.map +1 -0
- package/dist/adapters/non-streaming-llm.js +44 -0
- package/dist/adapters/non-streaming-llm.js.map +1 -0
- package/dist/agent.d.ts +227 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +1534 -0
- package/dist/agent.js.map +1 -0
- package/dist/builder.d.ts +260 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +949 -0
- package/dist/builder.js.map +1 -0
- package/dist/classifier/index.d.ts +3 -0
- package/dist/classifier/index.d.ts.map +1 -0
- package/dist/classifier/index.js +2 -0
- package/dist/classifier/index.js.map +1 -0
- package/dist/classifier/llm-classifier.d.ts +20 -0
- package/dist/classifier/llm-classifier.d.ts.map +1 -0
- package/dist/classifier/llm-classifier.js +128 -0
- package/dist/classifier/llm-classifier.js.map +1 -0
- package/dist/config/config-watcher.d.ts +54 -0
- package/dist/config/config-watcher.d.ts.map +1 -0
- package/dist/config/config-watcher.js +107 -0
- package/dist/config/config-watcher.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/context/context-assembler.d.ts +49 -0
- package/dist/context/context-assembler.d.ts.map +1 -0
- package/dist/context/context-assembler.js +184 -0
- package/dist/context/context-assembler.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/health/health-checker.d.ts +21 -0
- package/dist/health/health-checker.d.ts.map +1 -0
- package/dist/health/health-checker.js +52 -0
- package/dist/health/health-checker.js.map +1 -0
- package/dist/health/index.d.ts +3 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +2 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/types.d.ts +2 -0
- package/dist/health/types.d.ts.map +1 -0
- package/dist/health/types.js +2 -0
- package/dist/health/types.js.map +1 -0
- package/dist/history/history-memory.d.ts +12 -0
- package/dist/history/history-memory.d.ts.map +1 -0
- package/dist/history/history-memory.js +26 -0
- package/dist/history/history-memory.js.map +1 -0
- package/dist/history/history-summarizer.d.ts +10 -0
- package/dist/history/history-summarizer.d.ts.map +1 -0
- package/dist/history/history-summarizer.js +27 -0
- package/dist/history/history-summarizer.js.map +1 -0
- package/dist/history/index.d.ts +3 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +3 -0
- package/dist/history/index.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/mcp-connection-strategy.d.ts +2 -0
- package/dist/interfaces/mcp-connection-strategy.d.ts.map +1 -0
- package/dist/interfaces/mcp-connection-strategy.js +2 -0
- package/dist/interfaces/mcp-connection-strategy.js.map +1 -0
- package/dist/interfaces/model-resolver.d.ts +2 -0
- package/dist/interfaces/model-resolver.d.ts.map +1 -0
- package/dist/interfaces/model-resolver.js +2 -0
- package/dist/interfaces/model-resolver.js.map +1 -0
- package/dist/interfaces/pipeline.d.ts +123 -0
- package/dist/interfaces/pipeline.d.ts.map +1 -0
- package/dist/interfaces/pipeline.js +13 -0
- package/dist/interfaces/pipeline.js.map +1 -0
- package/dist/logger/console-logger.d.ts +7 -0
- package/dist/logger/console-logger.d.ts.map +1 -0
- package/dist/logger/console-logger.js +12 -0
- package/dist/logger/console-logger.js.map +1 -0
- package/dist/logger/default-request-logger.d.ts +17 -0
- package/dist/logger/default-request-logger.d.ts.map +1 -0
- package/dist/logger/default-request-logger.js +86 -0
- package/dist/logger/default-request-logger.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +2 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/noop-request-logger.d.ts +11 -0
- package/dist/logger/noop-request-logger.d.ts.map +1 -0
- package/dist/logger/noop-request-logger.js +20 -0
- package/dist/logger/noop-request-logger.js.map +1 -0
- package/dist/logger/session-logger.d.ts +10 -0
- package/dist/logger/session-logger.d.ts.map +1 -0
- package/dist/logger/session-logger.js +40 -0
- package/dist/logger/session-logger.js.map +1 -0
- package/dist/metrics/in-memory-metrics.d.ts +36 -0
- package/dist/metrics/in-memory-metrics.d.ts.map +1 -0
- package/dist/metrics/in-memory-metrics.js +87 -0
- package/dist/metrics/in-memory-metrics.js.map +1 -0
- package/dist/metrics/index.d.ts +4 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/noop-metrics.d.ts +17 -0
- package/dist/metrics/noop-metrics.d.ts.map +1 -0
- package/dist/metrics/noop-metrics.js +22 -0
- package/dist/metrics/noop-metrics.js.map +1 -0
- package/dist/metrics/types.d.ts +2 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +2 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/otel/index.d.ts +2 -0
- package/dist/otel/index.d.ts.map +1 -0
- package/dist/otel/index.js +2 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/otel/otel-tracer-adapter.d.ts +15 -0
- package/dist/otel/otel-tracer-adapter.d.ts.map +1 -0
- package/dist/otel/otel-tracer-adapter.js +62 -0
- package/dist/otel/otel-tracer-adapter.js.map +1 -0
- package/dist/pipeline/condition-evaluator.d.ts +35 -0
- package/dist/pipeline/condition-evaluator.d.ts.map +1 -0
- package/dist/pipeline/condition-evaluator.js +143 -0
- package/dist/pipeline/condition-evaluator.js.map +1 -0
- package/dist/pipeline/context.d.ts +119 -0
- package/dist/pipeline/context.d.ts.map +1 -0
- package/dist/pipeline/context.js +19 -0
- package/dist/pipeline/context.js.map +1 -0
- package/dist/pipeline/default-pipeline.d.ts +69 -0
- package/dist/pipeline/default-pipeline.d.ts.map +1 -0
- package/dist/pipeline/default-pipeline.js +276 -0
- package/dist/pipeline/default-pipeline.js.map +1 -0
- package/dist/pipeline/executor.d.ts +54 -0
- package/dist/pipeline/executor.d.ts.map +1 -0
- package/dist/pipeline/executor.js +133 -0
- package/dist/pipeline/executor.js.map +1 -0
- package/dist/pipeline/handlers/assemble.d.ts +16 -0
- package/dist/pipeline/handlers/assemble.d.ts.map +1 -0
- package/dist/pipeline/handlers/assemble.js +72 -0
- package/dist/pipeline/handlers/assemble.js.map +1 -0
- package/dist/pipeline/handlers/build-tool-query.d.ts +30 -0
- package/dist/pipeline/handlers/build-tool-query.d.ts.map +1 -0
- package/dist/pipeline/handlers/build-tool-query.js +80 -0
- package/dist/pipeline/handlers/build-tool-query.js.map +1 -0
- package/dist/pipeline/handlers/classify.d.ts +21 -0
- package/dist/pipeline/handlers/classify.d.ts.map +1 -0
- package/dist/pipeline/handlers/classify.js +60 -0
- package/dist/pipeline/handlers/classify.js.map +1 -0
- package/dist/pipeline/handlers/expand.d.ts +16 -0
- package/dist/pipeline/handlers/expand.d.ts.map +1 -0
- package/dist/pipeline/handlers/expand.js +24 -0
- package/dist/pipeline/handlers/expand.js.map +1 -0
- package/dist/pipeline/handlers/history-upsert.d.ts +29 -0
- package/dist/pipeline/handlers/history-upsert.d.ts.map +1 -0
- package/dist/pipeline/handlers/history-upsert.js +75 -0
- package/dist/pipeline/handlers/history-upsert.js.map +1 -0
- package/dist/pipeline/handlers/index.d.ts +31 -0
- package/dist/pipeline/handlers/index.d.ts.map +1 -0
- package/dist/pipeline/handlers/index.js +44 -0
- package/dist/pipeline/handlers/index.js.map +1 -0
- package/dist/pipeline/handlers/rag-query.d.ts +27 -0
- package/dist/pipeline/handlers/rag-query.d.ts.map +1 -0
- package/dist/pipeline/handlers/rag-query.js +117 -0
- package/dist/pipeline/handlers/rag-query.js.map +1 -0
- package/dist/pipeline/handlers/rerank.d.ts +16 -0
- package/dist/pipeline/handlers/rerank.d.ts.map +1 -0
- package/dist/pipeline/handlers/rerank.js +27 -0
- package/dist/pipeline/handlers/rerank.js.map +1 -0
- package/dist/pipeline/handlers/skill-select.d.ts +18 -0
- package/dist/pipeline/handlers/skill-select.d.ts.map +1 -0
- package/dist/pipeline/handlers/skill-select.js +88 -0
- package/dist/pipeline/handlers/skill-select.js.map +1 -0
- package/dist/pipeline/handlers/summarize.d.ts +17 -0
- package/dist/pipeline/handlers/summarize.d.ts.map +1 -0
- package/dist/pipeline/handlers/summarize.js +56 -0
- package/dist/pipeline/handlers/summarize.js.map +1 -0
- package/dist/pipeline/handlers/tool-loop.d.ts +32 -0
- package/dist/pipeline/handlers/tool-loop.d.ts.map +1 -0
- package/dist/pipeline/handlers/tool-loop.js +734 -0
- package/dist/pipeline/handlers/tool-loop.js.map +1 -0
- package/dist/pipeline/handlers/tool-select.d.ts +21 -0
- package/dist/pipeline/handlers/tool-select.d.ts.map +1 -0
- package/dist/pipeline/handlers/tool-select.js +109 -0
- package/dist/pipeline/handlers/tool-select.js.map +1 -0
- package/dist/pipeline/handlers/translate.d.ts +17 -0
- package/dist/pipeline/handlers/translate.d.ts.map +1 -0
- package/dist/pipeline/handlers/translate.js +42 -0
- package/dist/pipeline/handlers/translate.js.map +1 -0
- package/dist/pipeline/index.d.ts +14 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +16 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/stage-handler.d.ts +27 -0
- package/dist/pipeline/stage-handler.d.ts.map +1 -0
- package/dist/pipeline/stage-handler.js +25 -0
- package/dist/pipeline/stage-handler.js.map +1 -0
- package/dist/pipeline/types.d.ts +5 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +2 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +67 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +114 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +24 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +86 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/policy/heuristic-injection-detector.d.ts +5 -0
- package/dist/policy/heuristic-injection-detector.d.ts.map +1 -0
- package/dist/policy/heuristic-injection-detector.js +36 -0
- package/dist/policy/heuristic-injection-detector.js.map +1 -0
- package/dist/policy/index.d.ts +6 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +5 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/mixed-tool-call-handler.d.ts +15 -0
- package/dist/policy/mixed-tool-call-handler.d.ts.map +1 -0
- package/dist/policy/mixed-tool-call-handler.js +49 -0
- package/dist/policy/mixed-tool-call-handler.js.map +1 -0
- package/dist/policy/pending-tool-results-registry.d.ts +25 -0
- package/dist/policy/pending-tool-results-registry.d.ts.map +1 -0
- package/dist/policy/pending-tool-results-registry.js +50 -0
- package/dist/policy/pending-tool-results-registry.js.map +1 -0
- package/dist/policy/tool-availability-registry.d.ts +21 -0
- package/dist/policy/tool-availability-registry.d.ts.map +1 -0
- package/dist/policy/tool-availability-registry.js +77 -0
- package/dist/policy/tool-availability-registry.js.map +1 -0
- package/dist/policy/tool-policy-guard.d.ts +8 -0
- package/dist/policy/tool-policy-guard.d.ts.map +1 -0
- package/dist/policy/tool-policy-guard.js +40 -0
- package/dist/policy/tool-policy-guard.js.map +1 -0
- package/dist/policy/types.d.ts +51 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +17 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/providers.d.ts +48 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +192 -0
- package/dist/providers.js.map +1 -0
- package/dist/reranker/index.d.ts +4 -0
- package/dist/reranker/index.d.ts.map +1 -0
- package/dist/reranker/index.js +3 -0
- package/dist/reranker/index.js.map +1 -0
- package/dist/reranker/llm-reranker.d.ts +10 -0
- package/dist/reranker/llm-reranker.d.ts.map +1 -0
- package/dist/reranker/llm-reranker.js +55 -0
- package/dist/reranker/llm-reranker.js.map +1 -0
- package/dist/reranker/noop-reranker.d.ts +6 -0
- package/dist/reranker/noop-reranker.d.ts.map +1 -0
- package/dist/reranker/noop-reranker.js +6 -0
- package/dist/reranker/noop-reranker.js.map +1 -0
- package/dist/reranker/types.d.ts +2 -0
- package/dist/reranker/types.d.ts.map +1 -0
- package/dist/reranker/types.js +2 -0
- package/dist/reranker/types.js.map +1 -0
- package/dist/resilience/rate-limiter-llm.d.ts +17 -0
- package/dist/resilience/rate-limiter-llm.d.ts.map +1 -0
- package/dist/resilience/rate-limiter-llm.js +30 -0
- package/dist/resilience/rate-limiter-llm.js.map +1 -0
- package/dist/resilience/retry-llm.d.ts +32 -0
- package/dist/resilience/retry-llm.d.ts.map +1 -0
- package/dist/resilience/retry-llm.js +103 -0
- package/dist/resilience/retry-llm.js.map +1 -0
- package/dist/resilience/token-bucket-rate-limiter.d.ts +21 -0
- package/dist/resilience/token-bucket-rate-limiter.d.ts.map +1 -0
- package/dist/resilience/token-bucket-rate-limiter.js +32 -0
- package/dist/resilience/token-bucket-rate-limiter.js.map +1 -0
- package/dist/session/index.d.ts +4 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +3 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/noop-session-manager.d.ts +8 -0
- package/dist/session/noop-session-manager.d.ts.map +1 -0
- package/dist/session/noop-session-manager.js +11 -0
- package/dist/session/noop-session-manager.js.map +1 -0
- package/dist/session/session-manager.d.ts +13 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +20 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/types.d.ts +2 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/skills/claude-skill-manager.d.ts +24 -0
- package/dist/skills/claude-skill-manager.d.ts.map +1 -0
- package/dist/skills/claude-skill-manager.js +81 -0
- package/dist/skills/claude-skill-manager.js.map +1 -0
- package/dist/skills/codex-skill-manager.d.ts +20 -0
- package/dist/skills/codex-skill-manager.d.ts.map +1 -0
- package/dist/skills/codex-skill-manager.js +75 -0
- package/dist/skills/codex-skill-manager.js.map +1 -0
- package/dist/skills/filesystem-skill-manager.d.ts +17 -0
- package/dist/skills/filesystem-skill-manager.d.ts.map +1 -0
- package/dist/skills/filesystem-skill-manager.js +48 -0
- package/dist/skills/filesystem-skill-manager.js.map +1 -0
- package/dist/skills/filesystem-skill.d.ts +25 -0
- package/dist/skills/filesystem-skill.d.ts.map +1 -0
- package/dist/skills/filesystem-skill.js +110 -0
- package/dist/skills/filesystem-skill.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +9 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-utils.d.ts +15 -0
- package/dist/skills/skill-utils.d.ts.map +1 -0
- package/dist/skills/skill-utils.js +46 -0
- package/dist/skills/skill-utils.js.map +1 -0
- package/dist/testing/index.d.ts +118 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +351 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tracer/index.d.ts +3 -0
- package/dist/tracer/index.d.ts.map +1 -0
- package/dist/tracer/index.js +2 -0
- package/dist/tracer/index.js.map +1 -0
- package/dist/tracer/noop-tracer.d.ts +5 -0
- package/dist/tracer/noop-tracer.d.ts.map +1 -0
- package/dist/tracer/noop-tracer.js +16 -0
- package/dist/tracer/noop-tracer.js.map +1 -0
- package/dist/tracer/types.d.ts +2 -0
- package/dist/tracer/types.d.ts.map +1 -0
- package/dist/tracer/types.js +2 -0
- package/dist/tracer/types.js.map +1 -0
- package/dist/utils/lazy.d.ts +51 -0
- package/dist/utils/lazy.d.ts.map +1 -0
- package/dist/utils/lazy.js +127 -0
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/parse-frontmatter.d.ts +15 -0
- package/dist/utils/parse-frontmatter.d.ts.map +1 -0
- package/dist/utils/parse-frontmatter.js +22 -0
- package/dist/utils/parse-frontmatter.js.map +1 -0
- package/dist/validator/index.d.ts +3 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +2 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/noop-validator.d.ts +6 -0
- package/dist/validator/noop-validator.d.ts.map +1 -0
- package/dist/validator/noop-validator.js +6 -0
- package/dist/validator/noop-validator.js.map +1 -0
- package/dist/validator/types.d.ts +3 -0
- package/dist/validator/types.d.ts.map +1 -0
- package/dist/validator/types.js +2 -0
- package/dist/validator/types.js.map +1 -0
- package/package.json +14 -11
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BuildToolQueryHandler — composes an enriched query text for tool/skill retrieval.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.ragText`, `ctx.ragResults`, `ctx.selectedSkills`
|
|
5
|
+
* Writes: `ctx.toolQueryText`
|
|
6
|
+
*
|
|
7
|
+
* The resulting text combines the user-facing RAG query with top-K snippets
|
|
8
|
+
* already retrieved from non-tool RAG stores plus descriptions of skills
|
|
9
|
+
* selected for this request. Downstream stages configured with
|
|
10
|
+
* `queryText: 'toolQueryText'` use this to drive tool discovery, so consumers
|
|
11
|
+
* can steer tool selection by seeding domain knowledge into other RAG stores
|
|
12
|
+
* or skills.
|
|
13
|
+
*
|
|
14
|
+
* ## Config
|
|
15
|
+
*
|
|
16
|
+
* | Field | Type | Default | Description |
|
|
17
|
+
* |---------------------|---------|---------|------------------------------------------------------|
|
|
18
|
+
* | `topK` | number | 5 | Max RAG snippets (per store, top-scored) to include |
|
|
19
|
+
* | `maxChars` | number | 2000 | Hard cap on the composed text length |
|
|
20
|
+
* | `includeRagSnippets`| boolean | true | Append RAG snippets (excluding `tool:*` IDs) |
|
|
21
|
+
* | `includeSkills` | boolean | true | Append selected skill names + descriptions |
|
|
22
|
+
* | `skipStores` | string[]| [] | RAG store names to exclude from snippet source |
|
|
23
|
+
*/
|
|
24
|
+
export class BuildToolQueryHandler {
|
|
25
|
+
async execute(ctx, config, span) {
|
|
26
|
+
const topK = config.topK ?? 5;
|
|
27
|
+
const maxChars = config.maxChars ?? 2000;
|
|
28
|
+
const includeRagSnippets = config.includeRagSnippets !== false;
|
|
29
|
+
const includeSkills = config.includeSkills !== false;
|
|
30
|
+
const skipStores = new Set(config.skipStores ?? []);
|
|
31
|
+
const parts = [];
|
|
32
|
+
const base = ctx.ragText || ctx.inputText;
|
|
33
|
+
if (base)
|
|
34
|
+
parts.push(base);
|
|
35
|
+
if (includeRagSnippets) {
|
|
36
|
+
const snippets = [];
|
|
37
|
+
for (const [storeName, results] of Object.entries(ctx.ragResults)) {
|
|
38
|
+
if (skipStores.has(storeName))
|
|
39
|
+
continue;
|
|
40
|
+
const top = results
|
|
41
|
+
.filter((r) => {
|
|
42
|
+
const id = r.metadata?.id;
|
|
43
|
+
return !id?.startsWith('tool:');
|
|
44
|
+
})
|
|
45
|
+
.slice(0, topK);
|
|
46
|
+
for (const r of top) {
|
|
47
|
+
const text = r.text?.trim();
|
|
48
|
+
if (text)
|
|
49
|
+
snippets.push(text);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (snippets.length > 0) {
|
|
53
|
+
parts.push(`Context:\n${snippets.join('\n')}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (includeSkills && ctx.selectedSkills.length > 0) {
|
|
57
|
+
const lines = ctx.selectedSkills.map((s) => {
|
|
58
|
+
const desc = s.description?.trim();
|
|
59
|
+
return desc ? `${s.name}: ${desc}` : s.name;
|
|
60
|
+
});
|
|
61
|
+
parts.push(`Active skills:\n${lines.join('\n')}`);
|
|
62
|
+
}
|
|
63
|
+
let composed = parts.join('\n\n');
|
|
64
|
+
if (composed.length > maxChars) {
|
|
65
|
+
composed = `${composed.slice(0, maxChars)}…`;
|
|
66
|
+
}
|
|
67
|
+
ctx.toolQueryText = composed;
|
|
68
|
+
span.setAttribute('length', composed.length);
|
|
69
|
+
span.setAttribute('base_length', base.length);
|
|
70
|
+
span.setAttribute('snippets_included', includeRagSnippets ? 'true' : 'false');
|
|
71
|
+
span.setAttribute('skills_included', includeSkills ? 'true' : 'false');
|
|
72
|
+
ctx.options?.sessionLogger?.logStep('tool_query_built', {
|
|
73
|
+
length: composed.length,
|
|
74
|
+
preview: composed.slice(0, 300),
|
|
75
|
+
skillCount: ctx.selectedSkills.length,
|
|
76
|
+
});
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=build-tool-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-tool-query.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/build-tool-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClassifyHandler — decomposes user input into typed subprompts.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.inputText`
|
|
5
|
+
* Writes: `ctx.subprompts`, `ctx.isSapRequired`, `ctx.shouldRetrieve`
|
|
6
|
+
*
|
|
7
|
+
* When classification is disabled (`config.classificationEnabled === false`),
|
|
8
|
+
* the input is treated as a single action subprompt.
|
|
9
|
+
*/
|
|
10
|
+
import type { ISpan } from '../../tracer/types.js';
|
|
11
|
+
import type { PipelineContext } from '../context.js';
|
|
12
|
+
import type { IStageHandler } from '../stage-handler.js';
|
|
13
|
+
export declare class ClassifyHandler implements IStageHandler {
|
|
14
|
+
execute(ctx: PipelineContext, _config: Record<string, unknown>, span: ISpan): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Update control flags based on classified subprompts.
|
|
17
|
+
* These flags are used by `when` conditions on downstream stages.
|
|
18
|
+
*/
|
|
19
|
+
private _updateControlFlags;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/pipeline/handlers/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,eAAgB,YAAW,aAAa;IAC7C,OAAO,CACX,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;IAmCnB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAmB5B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClassifyHandler — decomposes user input into typed subprompts.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.inputText`
|
|
5
|
+
* Writes: `ctx.subprompts`, `ctx.isSapRequired`, `ctx.shouldRetrieve`
|
|
6
|
+
*
|
|
7
|
+
* When classification is disabled (`config.classificationEnabled === false`),
|
|
8
|
+
* the input is treated as a single action subprompt.
|
|
9
|
+
*/
|
|
10
|
+
import { OrchestratorError } from '../../agent.js';
|
|
11
|
+
export class ClassifyHandler {
|
|
12
|
+
async execute(ctx, _config, span) {
|
|
13
|
+
if (ctx.config.classificationEnabled === false) {
|
|
14
|
+
ctx.subprompts = [
|
|
15
|
+
{ type: 'action', text: ctx.inputText, dependency: 'independent' },
|
|
16
|
+
];
|
|
17
|
+
ctx.options?.sessionLogger?.logStep('classification_skipped', {
|
|
18
|
+
text: ctx.inputText,
|
|
19
|
+
});
|
|
20
|
+
span.setAttribute('skipped', true);
|
|
21
|
+
this._updateControlFlags(ctx);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
const result = await ctx.classifier.classify(ctx.inputText, ctx.options);
|
|
25
|
+
if (!result.ok) {
|
|
26
|
+
ctx.error = new OrchestratorError(result.error.message, 'CLASSIFIER_ERROR');
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
ctx.subprompts = result.value;
|
|
30
|
+
ctx.options?.sessionLogger?.logStep('classifier_response', {
|
|
31
|
+
subprompts: result.value,
|
|
32
|
+
});
|
|
33
|
+
for (const sp of ctx.subprompts) {
|
|
34
|
+
ctx.metrics.classifierIntentCount.add(1, { intent: sp.type });
|
|
35
|
+
}
|
|
36
|
+
this._updateControlFlags(ctx);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Update control flags based on classified subprompts.
|
|
41
|
+
* These flags are used by `when` conditions on downstream stages.
|
|
42
|
+
*/
|
|
43
|
+
_updateControlFlags(ctx) {
|
|
44
|
+
const actions = ctx.subprompts.filter((sp) => sp.type === 'action');
|
|
45
|
+
const mode = ctx.config.mode || 'smart';
|
|
46
|
+
const hasRagStores = Object.keys(ctx.ragStores).length > 0;
|
|
47
|
+
const hasMcpClients = ctx.mcpClients.length > 0;
|
|
48
|
+
ctx.isSapRequired =
|
|
49
|
+
actions.some((a) => a.context === 'sap-abap') || mode === 'hard';
|
|
50
|
+
// Populate ragText from action texts — downstream stages (translate, expand,
|
|
51
|
+
// rag-query) all read from ctx.ragText.
|
|
52
|
+
ctx.ragText = actions.map((a) => a.text).join(' ');
|
|
53
|
+
// Retrieve when there are actions and stores/tools to search,
|
|
54
|
+
// or when mode is 'hard' (always retrieve).
|
|
55
|
+
ctx.shouldRetrieve =
|
|
56
|
+
mode === 'hard' ||
|
|
57
|
+
(actions.length > 0 && (hasMcpClients || hasRagStores));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKnD,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,OAAO,CACX,GAAoB,EACpB,OAAgC,EAChC,IAAW;QAEX,IAAI,GAAG,CAAC,MAAM,CAAC,qBAAqB,KAAK,KAAK,EAAE,CAAC;YAC/C,GAAG,CAAC,UAAU,GAAG;gBACf,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE;aACnE,CAAC;YACF,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,wBAAwB,EAAE;gBAC5D,IAAI,EAAE,GAAG,CAAC,SAAS;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAC/B,MAAM,CAAC,KAAK,CAAC,OAAO,EACpB,kBAAkB,CACnB,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9B,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,qBAAqB,EAAE;YACzD,UAAU,EAAE,MAAM,CAAC,KAAK;SACzB,CAAC,CAAC;QAEH,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YAChC,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,mBAAmB,CAAC,GAAoB;QAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC;QACxC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhD,GAAG,CAAC,aAAa;YACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC;QAEnE,6EAA6E;QAC7E,wCAAwC;QACxC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnD,8DAA8D;QAC9D,4CAA4C;QAC5C,GAAG,CAAC,cAAc;YAChB,IAAI,KAAK,MAAM;gBACf,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExpandHandler — expands RAG query with synonyms and related terms.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.ragText`, `ctx.queryExpander`
|
|
5
|
+
* Writes: `ctx.ragText`
|
|
6
|
+
*
|
|
7
|
+
* Uses the injected IQueryExpander to broaden RAG queries.
|
|
8
|
+
* Skipped when `queryExpansionEnabled` is false.
|
|
9
|
+
*/
|
|
10
|
+
import type { ISpan } from '../../tracer/types.js';
|
|
11
|
+
import type { PipelineContext } from '../context.js';
|
|
12
|
+
import type { IStageHandler } from '../stage-handler.js';
|
|
13
|
+
export declare class ExpandHandler implements IStageHandler {
|
|
14
|
+
execute(ctx: PipelineContext, _config: Record<string, unknown>, span: ISpan): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=expand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../../src/pipeline/handlers/expand.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,aAAc,YAAW,aAAa;IAC3C,OAAO,CACX,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;CAcpB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExpandHandler — expands RAG query with synonyms and related terms.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.ragText`, `ctx.queryExpander`
|
|
5
|
+
* Writes: `ctx.ragText`
|
|
6
|
+
*
|
|
7
|
+
* Uses the injected IQueryExpander to broaden RAG queries.
|
|
8
|
+
* Skipped when `queryExpansionEnabled` is false.
|
|
9
|
+
*/
|
|
10
|
+
export class ExpandHandler {
|
|
11
|
+
async execute(ctx, _config, span) {
|
|
12
|
+
if (!ctx.config.queryExpansionEnabled) {
|
|
13
|
+
span.setAttribute('skipped', true);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const result = await ctx.queryExpander.expand(ctx.ragText, ctx.options);
|
|
17
|
+
if (result.ok) {
|
|
18
|
+
ctx.ragText = result.value;
|
|
19
|
+
span.setAttribute('expanded', true);
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=expand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/expand.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,OAAO,CACX,GAAoB,EACpB,OAAgC,EAChC,IAAW;QAEX,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HistoryUpsertHandler — post-tool-loop pipeline stage.
|
|
3
|
+
*
|
|
4
|
+
* After tool-loop completes, this stage:
|
|
5
|
+
* 1. Calls IHistorySummarizer to produce a compact turn summary.
|
|
6
|
+
* 2. Upserts the summary to the history RAG store.
|
|
7
|
+
* 3. Pushes the summary to the recency memory buffer.
|
|
8
|
+
*
|
|
9
|
+
* All operations are best-effort — failures are logged but never block the
|
|
10
|
+
* response. The `summarizeAndStore` helper is exported for unit testing.
|
|
11
|
+
*/
|
|
12
|
+
import type { CallOptions, HistoryTurn, IHistoryMemory, IHistorySummarizer, IRag } from '@mcp-abap-adt/llm-agent';
|
|
13
|
+
import type { ISpan } from '../../tracer/types.js';
|
|
14
|
+
import type { PipelineContext } from '../context.js';
|
|
15
|
+
import type { IStageHandler } from '../stage-handler.js';
|
|
16
|
+
export interface SummarizeAndStoreArgs {
|
|
17
|
+
turn: HistoryTurn;
|
|
18
|
+
summarizer: IHistorySummarizer;
|
|
19
|
+
memory: IHistoryMemory;
|
|
20
|
+
rag: IRag;
|
|
21
|
+
sessionId: string;
|
|
22
|
+
options?: CallOptions;
|
|
23
|
+
log?: (msg: string, data?: unknown) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare function summarizeAndStore(args: SummarizeAndStoreArgs): Promise<void>;
|
|
26
|
+
export declare class HistoryUpsertHandler implements IStageHandler {
|
|
27
|
+
execute(ctx: PipelineContext, _config: Record<string, unknown>, span: ISpan): Promise<boolean>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=history-upsert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-upsert.d.ts","sourceRoot":"","sources":["../../../src/pipeline/handlers/history-upsert.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,IAAI,EACL,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,IAAI,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,qBAAa,oBAAqB,YAAW,aAAa;IAClD,OAAO,CACX,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;CAgDpB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HistoryUpsertHandler — post-tool-loop pipeline stage.
|
|
3
|
+
*
|
|
4
|
+
* After tool-loop completes, this stage:
|
|
5
|
+
* 1. Calls IHistorySummarizer to produce a compact turn summary.
|
|
6
|
+
* 2. Upserts the summary to the history RAG store.
|
|
7
|
+
* 3. Pushes the summary to the recency memory buffer.
|
|
8
|
+
*
|
|
9
|
+
* All operations are best-effort — failures are logged but never block the
|
|
10
|
+
* response. The `summarizeAndStore` helper is exported for unit testing.
|
|
11
|
+
*/
|
|
12
|
+
export async function summarizeAndStore(args) {
|
|
13
|
+
const { turn, summarizer, memory, rag, sessionId, options, log } = args;
|
|
14
|
+
const result = await summarizer.summarize(turn, options);
|
|
15
|
+
const summary = result.ok
|
|
16
|
+
? result.value
|
|
17
|
+
: `${turn.userText} → ${turn.assistantText}`;
|
|
18
|
+
if (!result.ok) {
|
|
19
|
+
log?.('history_summarize_failed', { error: result.error.message });
|
|
20
|
+
}
|
|
21
|
+
const ragWriter = rag.writer?.();
|
|
22
|
+
if (!ragWriter) {
|
|
23
|
+
log?.('history_upsert_failed', { error: 'RAG writer not available' });
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const upsertResult = await ragWriter.upsertRaw(`turn:${sessionId}:${turn.turnIndex}`, summary, {}, options);
|
|
27
|
+
if (!upsertResult.ok) {
|
|
28
|
+
log?.('history_upsert_failed', { error: upsertResult.error.message });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
memory.pushRecent(sessionId, summary);
|
|
32
|
+
}
|
|
33
|
+
export class HistoryUpsertHandler {
|
|
34
|
+
async execute(ctx, _config, span) {
|
|
35
|
+
if (!ctx.historySummarizer || !ctx.historyMemory) {
|
|
36
|
+
span.setAttribute('skipped', true);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
if (!ctx.config.semanticHistoryEnabled) {
|
|
40
|
+
span.setAttribute('skipped', true);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
const historyRag = ctx.ragStores.history;
|
|
44
|
+
if (!historyRag) {
|
|
45
|
+
span.setAttribute('skipped', true);
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const turn = {
|
|
50
|
+
sessionId: ctx.sessionId,
|
|
51
|
+
turnIndex: Date.now(),
|
|
52
|
+
userText: ctx.inputText,
|
|
53
|
+
assistantText: '',
|
|
54
|
+
toolCalls: [],
|
|
55
|
+
toolResults: [],
|
|
56
|
+
timestamp: Date.now(),
|
|
57
|
+
};
|
|
58
|
+
await summarizeAndStore({
|
|
59
|
+
turn,
|
|
60
|
+
summarizer: ctx.historySummarizer,
|
|
61
|
+
memory: ctx.historyMemory,
|
|
62
|
+
rag: historyRag,
|
|
63
|
+
sessionId: ctx.sessionId,
|
|
64
|
+
options: ctx.options,
|
|
65
|
+
log: (msg, data) => ctx.options?.sessionLogger?.logStep(msg, data),
|
|
66
|
+
});
|
|
67
|
+
span.setStatus('ok');
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
span.setStatus('error', 'history upsert failed');
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=history-upsert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-upsert.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/history-upsert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default stage handler registry.
|
|
3
|
+
*
|
|
4
|
+
* Maps built-in stage type names to their handler implementations.
|
|
5
|
+
* Custom handlers can be registered by supplying a custom `IPipeline` implementation.
|
|
6
|
+
*/
|
|
7
|
+
import type { IStageHandler } from '../stage-handler.js';
|
|
8
|
+
import { AssembleHandler } from './assemble.js';
|
|
9
|
+
import { BuildToolQueryHandler } from './build-tool-query.js';
|
|
10
|
+
import { ClassifyHandler } from './classify.js';
|
|
11
|
+
import { ExpandHandler } from './expand.js';
|
|
12
|
+
import { HistoryUpsertHandler } from './history-upsert.js';
|
|
13
|
+
import { RagQueryHandler } from './rag-query.js';
|
|
14
|
+
import { RerankHandler } from './rerank.js';
|
|
15
|
+
import { SkillSelectHandler } from './skill-select.js';
|
|
16
|
+
import { SummarizeHandler } from './summarize.js';
|
|
17
|
+
import { ToolLoopHandler } from './tool-loop.js';
|
|
18
|
+
import { ToolSelectHandler } from './tool-select.js';
|
|
19
|
+
import { TranslateHandler } from './translate.js';
|
|
20
|
+
export type StageHandlerRegistry = Map<string, IStageHandler>;
|
|
21
|
+
/**
|
|
22
|
+
* Build the default handler registry with all built-in stage handlers.
|
|
23
|
+
*
|
|
24
|
+
* The registry maps stage type names (as used in YAML) to their handler
|
|
25
|
+
* instances. All handlers are stateless — they read/write through the
|
|
26
|
+
* {@link PipelineContext}.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildDefaultHandlerRegistry(): StageHandlerRegistry;
|
|
29
|
+
export { summarizeAndStore } from './history-upsert.js';
|
|
30
|
+
export { AssembleHandler, BuildToolQueryHandler, ClassifyHandler, ExpandHandler, HistoryUpsertHandler, RagQueryHandler, RerankHandler, SkillSelectHandler, SummarizeHandler, ToolLoopHandler, ToolSelectHandler, TranslateHandler, };
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pipeline/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,2BAA2B,IAAI,oBAAoB,CAelE;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default stage handler registry.
|
|
3
|
+
*
|
|
4
|
+
* Maps built-in stage type names to their handler implementations.
|
|
5
|
+
* Custom handlers can be registered by supplying a custom `IPipeline` implementation.
|
|
6
|
+
*/
|
|
7
|
+
import { AssembleHandler } from './assemble.js';
|
|
8
|
+
import { BuildToolQueryHandler } from './build-tool-query.js';
|
|
9
|
+
import { ClassifyHandler } from './classify.js';
|
|
10
|
+
import { ExpandHandler } from './expand.js';
|
|
11
|
+
import { HistoryUpsertHandler } from './history-upsert.js';
|
|
12
|
+
import { RagQueryHandler } from './rag-query.js';
|
|
13
|
+
import { RerankHandler } from './rerank.js';
|
|
14
|
+
import { SkillSelectHandler } from './skill-select.js';
|
|
15
|
+
import { SummarizeHandler } from './summarize.js';
|
|
16
|
+
import { ToolLoopHandler } from './tool-loop.js';
|
|
17
|
+
import { ToolSelectHandler } from './tool-select.js';
|
|
18
|
+
import { TranslateHandler } from './translate.js';
|
|
19
|
+
/**
|
|
20
|
+
* Build the default handler registry with all built-in stage handlers.
|
|
21
|
+
*
|
|
22
|
+
* The registry maps stage type names (as used in YAML) to their handler
|
|
23
|
+
* instances. All handlers are stateless — they read/write through the
|
|
24
|
+
* {@link PipelineContext}.
|
|
25
|
+
*/
|
|
26
|
+
export function buildDefaultHandlerRegistry() {
|
|
27
|
+
return new Map([
|
|
28
|
+
['classify', new ClassifyHandler()],
|
|
29
|
+
['summarize', new SummarizeHandler()],
|
|
30
|
+
['translate', new TranslateHandler()],
|
|
31
|
+
['expand', new ExpandHandler()],
|
|
32
|
+
['rag-query', new RagQueryHandler()],
|
|
33
|
+
['rerank', new RerankHandler()],
|
|
34
|
+
['skill-select', new SkillSelectHandler()],
|
|
35
|
+
['build-tool-query', new BuildToolQueryHandler()],
|
|
36
|
+
['tool-select', new ToolSelectHandler()],
|
|
37
|
+
['assemble', new AssembleHandler()],
|
|
38
|
+
['tool-loop', new ToolLoopHandler()],
|
|
39
|
+
['history-upsert', new HistoryUpsertHandler()],
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
42
|
+
export { summarizeAndStore } from './history-upsert.js';
|
|
43
|
+
export { AssembleHandler, BuildToolQueryHandler, ClassifyHandler, ExpandHandler, HistoryUpsertHandler, RagQueryHandler, RerankHandler, SkillSelectHandler, SummarizeHandler, ToolLoopHandler, ToolSelectHandler, TranslateHandler, };
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIlD;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO,IAAI,GAAG,CAAwB;QACpC,CAAC,UAAU,EAAE,IAAI,eAAe,EAAE,CAAC;QACnC,CAAC,WAAW,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACrC,CAAC,WAAW,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACrC,CAAC,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,CAAC,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC;QACpC,CAAC,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,CAAC,cAAc,EAAE,IAAI,kBAAkB,EAAE,CAAC;QAC1C,CAAC,kBAAkB,EAAE,IAAI,qBAAqB,EAAE,CAAC;QACjD,CAAC,aAAa,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACxC,CAAC,UAAU,EAAE,IAAI,eAAe,EAAE,CAAC;QACnC,CAAC,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC;QACpC,CAAC,gBAAgB,EAAE,IAAI,oBAAoB,EAAE,CAAC;KAC/C,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RagQueryHandler — queries a single RAG store.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.ragText`, `ctx.ragStores`
|
|
5
|
+
* Writes: `ctx.ragResults[store]` where `store` is from config
|
|
6
|
+
*
|
|
7
|
+
* ## Config
|
|
8
|
+
*
|
|
9
|
+
* | Field | Type | Default | Description |
|
|
10
|
+
* |---------|--------------------------------|----------|--------------------------------------|
|
|
11
|
+
* | `store` | string | required | Store key (must exist in `ctx.ragStores`) |
|
|
12
|
+
* | `k` | number | from ctx | Number of results to retrieve |
|
|
13
|
+
* | `scope` | `global` \| `user` \| `session` | — | Scope filter: `user` adds userId filter, `session` adds sessionId filter, `global` adds no filter |
|
|
14
|
+
* | `queryText` | `'toolQueryText'` \| string | — | Overrides the query text for this call. `'toolQueryText'` reads the enriched text from `ctx.toolQueryText` (falls back to `ragText`). Any other string is used literally. When set, a one-off embedding is built for this call without touching the cached `ctx.queryEmbedding`. |
|
|
15
|
+
*
|
|
16
|
+
* ## Parallel safety
|
|
17
|
+
*
|
|
18
|
+
* Each instance writes to a different slot in `ctx.ragResults`, so
|
|
19
|
+
* multiple rag-query stages can safely run in parallel.
|
|
20
|
+
*/
|
|
21
|
+
import type { ISpan } from '../../tracer/types.js';
|
|
22
|
+
import type { PipelineContext } from '../context.js';
|
|
23
|
+
import type { IStageHandler } from '../stage-handler.js';
|
|
24
|
+
export declare class RagQueryHandler implements IStageHandler {
|
|
25
|
+
execute(ctx: PipelineContext, config: Record<string, unknown>, span: ISpan): Promise<boolean>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=rag-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-query.d.ts","sourceRoot":"","sources":["../../../src/pipeline/handlers/rag-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,eAAgB,YAAW,aAAa;IAC7C,OAAO,CACX,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;CAyGpB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RagQueryHandler — queries a single RAG store.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.ragText`, `ctx.ragStores`
|
|
5
|
+
* Writes: `ctx.ragResults[store]` where `store` is from config
|
|
6
|
+
*
|
|
7
|
+
* ## Config
|
|
8
|
+
*
|
|
9
|
+
* | Field | Type | Default | Description |
|
|
10
|
+
* |---------|--------------------------------|----------|--------------------------------------|
|
|
11
|
+
* | `store` | string | required | Store key (must exist in `ctx.ragStores`) |
|
|
12
|
+
* | `k` | number | from ctx | Number of results to retrieve |
|
|
13
|
+
* | `scope` | `global` \| `user` \| `session` | — | Scope filter: `user` adds userId filter, `session` adds sessionId filter, `global` adds no filter |
|
|
14
|
+
* | `queryText` | `'toolQueryText'` \| string | — | Overrides the query text for this call. `'toolQueryText'` reads the enriched text from `ctx.toolQueryText` (falls back to `ragText`). Any other string is used literally. When set, a one-off embedding is built for this call without touching the cached `ctx.queryEmbedding`. |
|
|
15
|
+
*
|
|
16
|
+
* ## Parallel safety
|
|
17
|
+
*
|
|
18
|
+
* Each instance writes to a different slot in `ctx.ragResults`, so
|
|
19
|
+
* multiple rag-query stages can safely run in parallel.
|
|
20
|
+
*/
|
|
21
|
+
import { QueryEmbedding, TextOnlyEmbedding } from '@mcp-abap-adt/llm-agent';
|
|
22
|
+
export class RagQueryHandler {
|
|
23
|
+
async execute(ctx, config, span) {
|
|
24
|
+
const storeName = config.store;
|
|
25
|
+
if (!storeName || !ctx.ragStores[storeName]) {
|
|
26
|
+
span.setAttribute('error', `Invalid store: ${storeName}`);
|
|
27
|
+
return true; // non-fatal, skip
|
|
28
|
+
}
|
|
29
|
+
const k = config.k ?? ctx.config.ragQueryK ?? 10;
|
|
30
|
+
const store = ctx.ragStores[storeName];
|
|
31
|
+
span.setAttribute('store', storeName);
|
|
32
|
+
span.setAttribute('k', k);
|
|
33
|
+
// Resolve the query text for this call. Optional `queryText` override
|
|
34
|
+
// bypasses the shared cache so enriched-context searches don't pollute
|
|
35
|
+
// subsequent ragText-based queries.
|
|
36
|
+
const queryTextOverride = typeof config.queryText === 'string'
|
|
37
|
+
? config.queryText === 'toolQueryText'
|
|
38
|
+
? (ctx.toolQueryText ?? ctx.ragText)
|
|
39
|
+
: config.queryText
|
|
40
|
+
: undefined;
|
|
41
|
+
const queryText = queryTextOverride ?? ctx.ragText;
|
|
42
|
+
let embedding;
|
|
43
|
+
if (queryTextOverride !== undefined) {
|
|
44
|
+
embedding = ctx.embedder
|
|
45
|
+
? new QueryEmbedding(queryText, ctx.embedder, ctx.options)
|
|
46
|
+
: new TextOnlyEmbedding(queryText);
|
|
47
|
+
span.setAttribute('query_text_override', true);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Lazily create and cache a shared query embedding for all rag-query stages
|
|
51
|
+
if (!ctx.queryEmbedding) {
|
|
52
|
+
ctx.queryEmbedding = ctx.embedder
|
|
53
|
+
? new QueryEmbedding(ctx.ragText, ctx.embedder, ctx.options)
|
|
54
|
+
: new TextOnlyEmbedding(ctx.ragText);
|
|
55
|
+
}
|
|
56
|
+
embedding = ctx.queryEmbedding;
|
|
57
|
+
}
|
|
58
|
+
// Build scope filter based on config
|
|
59
|
+
const scope = config.scope;
|
|
60
|
+
const scopeFilter = {};
|
|
61
|
+
if (scope === 'user' && ctx.options?.userId) {
|
|
62
|
+
scopeFilter.userId = ctx.options.userId;
|
|
63
|
+
}
|
|
64
|
+
if (scope === 'session') {
|
|
65
|
+
scopeFilter.sessionId = ctx.sessionId;
|
|
66
|
+
}
|
|
67
|
+
const queryOptions = {
|
|
68
|
+
...ctx.options,
|
|
69
|
+
ragFilter: { ...ctx.options?.ragFilter, ...scopeFilter },
|
|
70
|
+
};
|
|
71
|
+
const ragStart = Date.now();
|
|
72
|
+
const result = await store.query(embedding, k, queryOptions);
|
|
73
|
+
ctx.requestLogger.logRagQuery({
|
|
74
|
+
store: storeName,
|
|
75
|
+
query: queryText.slice(0, 200),
|
|
76
|
+
resultCount: result.ok ? result.value.length : 0,
|
|
77
|
+
durationMs: Date.now() - ragStart,
|
|
78
|
+
});
|
|
79
|
+
// Log embedding usage once (first rag-query stage that uses the embedding)
|
|
80
|
+
if (!ctx.embeddingUsageLogged && embedding?.getUsage) {
|
|
81
|
+
const usage = await embedding.getUsage();
|
|
82
|
+
if (usage) {
|
|
83
|
+
ctx.requestLogger.logLlmCall({
|
|
84
|
+
component: 'embedding',
|
|
85
|
+
model: 'embedder',
|
|
86
|
+
promptTokens: usage.promptTokens,
|
|
87
|
+
completionTokens: 0,
|
|
88
|
+
totalTokens: usage.totalTokens,
|
|
89
|
+
durationMs: 0, // embed completed before store.query(); not separately measurable here
|
|
90
|
+
scope: 'request',
|
|
91
|
+
});
|
|
92
|
+
ctx.embeddingUsageLogged = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
ctx.metrics.ragQueryCount.add(1, {
|
|
96
|
+
store: storeName,
|
|
97
|
+
hit: String(result.ok && result.value.length > 0),
|
|
98
|
+
});
|
|
99
|
+
if (result.ok) {
|
|
100
|
+
ctx.ragResults[storeName] = result.value;
|
|
101
|
+
span.setAttribute('results', result.value.length);
|
|
102
|
+
// Log RAG results with scores for diagnostics
|
|
103
|
+
ctx.options?.sessionLogger?.logStep(`rag_query_${storeName}`, {
|
|
104
|
+
query: queryText.slice(0, 200),
|
|
105
|
+
k,
|
|
106
|
+
resultCount: result.value.length,
|
|
107
|
+
results: result.value.map((r) => ({
|
|
108
|
+
id: r.metadata.id,
|
|
109
|
+
score: r.score,
|
|
110
|
+
text: r.text.slice(0, 120),
|
|
111
|
+
})),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=rag-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-query.js","sourceRoot":"","sources":["../../../src/pipeline/handlers/rag-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RerankHandler — re-scores RAG results using the injected reranker.
|
|
3
|
+
*
|
|
4
|
+
* Reads: `ctx.ragText`, `ctx.ragResults`
|
|
5
|
+
* Writes: `ctx.ragResults` (replaces with re-scored versions)
|
|
6
|
+
*
|
|
7
|
+
* Runs reranking on all stores in parallel. Falls back to original
|
|
8
|
+
* results if reranking fails for a store.
|
|
9
|
+
*/
|
|
10
|
+
import type { ISpan } from '../../tracer/types.js';
|
|
11
|
+
import type { PipelineContext } from '../context.js';
|
|
12
|
+
import type { IStageHandler } from '../stage-handler.js';
|
|
13
|
+
export declare class RerankHandler implements IStageHandler {
|
|
14
|
+
execute(ctx: PipelineContext, _config: Record<string, unknown>, span: ISpan): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=rerank.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rerank.d.ts","sourceRoot":"","sources":["../../../src/pipeline/handlers/rerank.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,aAAc,YAAW,aAAa;IAC3C,OAAO,CACX,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;CAwBpB"}
|