@od-oneapp/ai-platform 0.1.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/README.md +235 -0
- package/dist/agents-base.d.mts +12 -0
- package/dist/agents-base.d.mts.map +1 -0
- package/dist/agents-base.mjs +20 -0
- package/dist/agents-base.mjs.map +1 -0
- package/dist/agents-control-flow.d.mts +115 -0
- package/dist/agents-control-flow.d.mts.map +1 -0
- package/dist/agents-control-flow.mjs +514 -0
- package/dist/agents-control-flow.mjs.map +1 -0
- package/dist/agents-coordinator.d.mts +11 -0
- package/dist/agents-coordinator.d.mts.map +1 -0
- package/dist/agents-coordinator.mjs +12 -0
- package/dist/agents-coordinator.mjs.map +1 -0
- package/dist/agents-experimental.d.mts +153 -0
- package/dist/agents-experimental.d.mts.map +1 -0
- package/dist/agents-experimental.mjs +580 -0
- package/dist/agents-experimental.mjs.map +1 -0
- package/dist/agents-fallback.d.mts +10 -0
- package/dist/agents-fallback.d.mts.map +1 -0
- package/dist/agents-fallback.mjs +15 -0
- package/dist/agents-fallback.mjs.map +1 -0
- package/dist/agents-multi-swarm.d.mts +9 -0
- package/dist/agents-multi-swarm.d.mts.map +1 -0
- package/dist/agents-multi-swarm.mjs +44 -0
- package/dist/agents-multi-swarm.mjs.map +1 -0
- package/dist/agents-multi.d.mts +10 -0
- package/dist/agents-multi.d.mts.map +1 -0
- package/dist/agents-multi.mjs +44 -0
- package/dist/agents-multi.mjs.map +1 -0
- package/dist/agents-observability.d.mts +161 -0
- package/dist/agents-observability.d.mts.map +1 -0
- package/dist/agents-observability.mjs +550 -0
- package/dist/agents-observability.mjs.map +1 -0
- package/dist/agents-patterns.d.mts +9 -0
- package/dist/agents-patterns.d.mts.map +1 -0
- package/dist/agents-patterns.mjs +18 -0
- package/dist/agents-patterns.mjs.map +1 -0
- package/dist/agents-persistence.d.mts +234 -0
- package/dist/agents-persistence.d.mts.map +1 -0
- package/dist/agents-persistence.mjs +447 -0
- package/dist/agents-persistence.mjs.map +1 -0
- package/dist/agents-triage.d.mts +11 -0
- package/dist/agents-triage.d.mts.map +1 -0
- package/dist/agents-triage.mjs +13 -0
- package/dist/agents-triage.mjs.map +1 -0
- package/dist/agents-workflows.d.mts +9 -0
- package/dist/agents-workflows.d.mts.map +1 -0
- package/dist/agents-workflows.mjs +9 -0
- package/dist/agents-workflows.mjs.map +1 -0
- package/dist/agents.d.mts +30 -0
- package/dist/agents.d.mts.map +1 -0
- package/dist/agents.mjs +50 -0
- package/dist/agents.mjs.map +1 -0
- package/dist/aggregation-8KJF1uzp.d.mts +276 -0
- package/dist/aggregation-8KJF1uzp.d.mts.map +1 -0
- package/dist/aggregation-BDop87kL.mjs +1180 -0
- package/dist/aggregation-BDop87kL.mjs.map +1 -0
- package/dist/ai-runtime-CDzQztTt.mjs +85 -0
- package/dist/ai-runtime-CDzQztTt.mjs.map +1 -0
- package/dist/ai-runtime-DIwOEc6g.d.mts +56 -0
- package/dist/ai-runtime-DIwOEc6g.d.mts.map +1 -0
- package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts +553 -0
- package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts.map +1 -0
- package/dist/approval-queue-BcDDQ4oQ.mjs +104 -0
- package/dist/approval-queue-BcDDQ4oQ.mjs.map +1 -0
- package/dist/approval-queue-CiKiFT9z.d.mts +21 -0
- package/dist/approval-queue-CiKiFT9z.d.mts.map +1 -0
- package/dist/audio-BzvN7r10.d.mts +79 -0
- package/dist/audio-BzvN7r10.d.mts.map +1 -0
- package/dist/audio-vBG_62ME.mjs +226 -0
- package/dist/audio-vBG_62ME.mjs.map +1 -0
- package/dist/audit-logger-Bb2JIcIk.d.mts +12 -0
- package/dist/audit-logger-Bb2JIcIk.d.mts.map +1 -0
- package/dist/audit-logger-CHIP8bRO.mjs +596 -0
- package/dist/audit-logger-CHIP8bRO.mjs.map +1 -0
- package/dist/auto-resume-BpUNbPtp.d.mts +160 -0
- package/dist/auto-resume-BpUNbPtp.d.mts.map +1 -0
- package/dist/auto-resume-BuFRNvAX.mjs +638 -0
- package/dist/auto-resume-BuFRNvAX.mjs.map +1 -0
- package/dist/budget-guard-C83KCH9V.d.mts +52 -0
- package/dist/budget-guard-C83KCH9V.d.mts.map +1 -0
- package/dist/budget-guard-d_b5rq4u.mjs +158 -0
- package/dist/budget-guard-d_b5rq4u.mjs.map +1 -0
- package/dist/budget-guard-gyhJS00s.mjs +234 -0
- package/dist/budget-guard-gyhJS00s.mjs.map +1 -0
- package/dist/buffer-BC8mvXHE.d.mts +98 -0
- package/dist/buffer-BC8mvXHE.d.mts.map +1 -0
- package/dist/buffer-CefJGbRy.mjs +289 -0
- package/dist/buffer-CefJGbRy.mjs.map +1 -0
- package/dist/caching-adapters.d.mts +5 -0
- package/dist/caching-adapters.mjs +3 -0
- package/dist/caching-strategies.d.mts +52 -0
- package/dist/caching-strategies.d.mts.map +1 -0
- package/dist/caching-strategies.mjs +703 -0
- package/dist/caching-strategies.mjs.map +1 -0
- package/dist/caching.d.mts +14 -0
- package/dist/caching.d.mts.map +1 -0
- package/dist/caching.mjs +15 -0
- package/dist/caching.mjs.map +1 -0
- package/dist/catalog.d.mts +19 -0
- package/dist/catalog.d.mts.map +1 -0
- package/dist/catalog.mjs +1114 -0
- package/dist/catalog.mjs.map +1 -0
- package/dist/chunk-CkzbjWQW.mjs +20 -0
- package/dist/circuit-breaker-DoKWPORd.mjs +262 -0
- package/dist/circuit-breaker-DoKWPORd.mjs.map +1 -0
- package/dist/circuit-breaker-Mey3E7tW.d.mts +64 -0
- package/dist/circuit-breaker-Mey3E7tW.d.mts.map +1 -0
- package/dist/citation-generator-C-9RpbHq.mjs +103 -0
- package/dist/citation-generator-C-9RpbHq.mjs.map +1 -0
- package/dist/citation-generator-CDSymDs_.d.mts +18 -0
- package/dist/citation-generator-CDSymDs_.d.mts.map +1 -0
- package/dist/client-CpacYDIE.mjs +882 -0
- package/dist/client-CpacYDIE.mjs.map +1 -0
- package/dist/client.d.mts +103 -0
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +470 -0
- package/dist/client.mjs.map +1 -0
- package/dist/compliance-approval-queue-DQGLojAm.mjs +172 -0
- package/dist/compliance-approval-queue-DQGLojAm.mjs.map +1 -0
- package/dist/compliance-approval-queue-IrMxFfSJ.d.mts +99 -0
- package/dist/compliance-approval-queue-IrMxFfSJ.d.mts.map +1 -0
- package/dist/compliance-wrapper-CrOMHhHN.mjs +528 -0
- package/dist/compliance-wrapper-CrOMHhHN.mjs.map +1 -0
- package/dist/conditions-DmQ6Y1Wt.mjs +179 -0
- package/dist/conditions-DmQ6Y1Wt.mjs.map +1 -0
- package/dist/conditions-zDrKfrc3.d.mts +42 -0
- package/dist/conditions-zDrKfrc3.d.mts.map +1 -0
- package/dist/console-BGMxxPZN.mjs +181 -0
- package/dist/console-BGMxxPZN.mjs.map +1 -0
- package/dist/console-DqEqZd4A.d.mts +76 -0
- package/dist/console-DqEqZd4A.d.mts.map +1 -0
- package/dist/controller-BOy3-xbC.mjs +501 -0
- package/dist/controller-BOy3-xbC.mjs.map +1 -0
- package/dist/controller-Y0NGosbJ.d.mts +104 -0
- package/dist/controller-Y0NGosbJ.d.mts.map +1 -0
- package/dist/coordinator-agent-BglqZLwo.d.mts +54 -0
- package/dist/coordinator-agent-BglqZLwo.d.mts.map +1 -0
- package/dist/coordinator-agent-WFWBRL-G.mjs +236 -0
- package/dist/coordinator-agent-WFWBRL-G.mjs.map +1 -0
- package/dist/crypto-8ABhc3TD.mjs +40 -0
- package/dist/crypto-8ABhc3TD.mjs.map +1 -0
- package/dist/environment-CSoJb0SW.mjs +255 -0
- package/dist/environment-CSoJb0SW.mjs.map +1 -0
- package/dist/error-handling-DNVkm6RY.mjs +1334 -0
- package/dist/error-handling-DNVkm6RY.mjs.map +1 -0
- package/dist/errors-CQ8tF4dP.mjs +985 -0
- package/dist/errors-CQ8tF4dP.mjs.map +1 -0
- package/dist/errors-CfYdVeum.d.mts +212 -0
- package/dist/errors-CfYdVeum.d.mts.map +1 -0
- package/dist/errors-Dtn-UeRi.mjs +61 -0
- package/dist/errors-Dtn-UeRi.mjs.map +1 -0
- package/dist/evaluator-Cs84qkr8.mjs +91 -0
- package/dist/evaluator-Cs84qkr8.mjs.map +1 -0
- package/dist/evaluator-optimizer-De67_mJC.mjs +1086 -0
- package/dist/evaluator-optimizer-De67_mJC.mjs.map +1 -0
- package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs +367 -0
- package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs.map +1 -0
- package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts +72 -0
- package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts.map +1 -0
- package/dist/factory-DP6VSl8C.mjs +307 -0
- package/dist/factory-DP6VSl8C.mjs.map +1 -0
- package/dist/generative-ui-catalog.d.mts +8 -0
- package/dist/generative-ui-catalog.d.mts.map +1 -0
- package/dist/generative-ui-catalog.mjs +679 -0
- package/dist/generative-ui-catalog.mjs.map +1 -0
- package/dist/generative-ui-registry.d.mts +195 -0
- package/dist/generative-ui-registry.d.mts.map +1 -0
- package/dist/generative-ui-registry.mjs +250 -0
- package/dist/generative-ui-registry.mjs.map +1 -0
- package/dist/generative-ui-stream.d.mts +23 -0
- package/dist/generative-ui-stream.d.mts.map +1 -0
- package/dist/generative-ui-stream.mjs +219 -0
- package/dist/generative-ui-stream.mjs.map +1 -0
- package/dist/generative-ui-types.d.mts +123 -0
- package/dist/generative-ui-types.d.mts.map +1 -0
- package/dist/generative-ui-types.mjs +1 -0
- package/dist/generative-ui.d.mts +13 -0
- package/dist/generative-ui.d.mts.map +1 -0
- package/dist/generative-ui.mjs +21 -0
- package/dist/generative-ui.mjs.map +1 -0
- package/dist/governance-audit.d.mts +3 -0
- package/dist/governance-audit.mjs +3 -0
- package/dist/governance-compliance.d.mts +5 -0
- package/dist/governance-compliance.mjs +4 -0
- package/dist/governance-policies.d.mts +4 -0
- package/dist/governance-policies.mjs +4 -0
- package/dist/governance-tenancy.d.mts +3 -0
- package/dist/governance-tenancy.mjs +3 -0
- package/dist/governance.d.mts +88 -0
- package/dist/governance.d.mts.map +1 -0
- package/dist/governance.mjs +432 -0
- package/dist/governance.mjs.map +1 -0
- package/dist/grounding-attribution.d.mts +63 -0
- package/dist/grounding-attribution.d.mts.map +1 -0
- package/dist/grounding-attribution.mjs +259 -0
- package/dist/grounding-attribution.mjs.map +1 -0
- package/dist/grounding-citation.d.mts +2 -0
- package/dist/grounding-citation.mjs +3 -0
- package/dist/grounding-context.d.mts +9 -0
- package/dist/grounding-context.d.mts.map +1 -0
- package/dist/grounding-context.mjs +19 -0
- package/dist/grounding-context.mjs.map +1 -0
- package/dist/grounding-embed.d.mts +102 -0
- package/dist/grounding-embed.d.mts.map +1 -0
- package/dist/grounding-embed.mjs +417 -0
- package/dist/grounding-embed.mjs.map +1 -0
- package/dist/grounding-hallucination.d.mts +44 -0
- package/dist/grounding-hallucination.d.mts.map +1 -0
- package/dist/grounding-hallucination.mjs +115 -0
- package/dist/grounding-hallucination.mjs.map +1 -0
- package/dist/grounding-proof-map.d.mts +9 -0
- package/dist/grounding-proof-map.d.mts.map +1 -0
- package/dist/grounding-proof-map.mjs +26 -0
- package/dist/grounding-proof-map.mjs.map +1 -0
- package/dist/grounding-rag.d.mts +10 -0
- package/dist/grounding-rag.d.mts.map +1 -0
- package/dist/grounding-rag.mjs +27 -0
- package/dist/grounding-rag.mjs.map +1 -0
- package/dist/grounding-verification.d.mts +48 -0
- package/dist/grounding-verification.d.mts.map +1 -0
- package/dist/grounding-verification.mjs +224 -0
- package/dist/grounding-verification.mjs.map +1 -0
- package/dist/grounding.d.mts +24 -0
- package/dist/grounding.d.mts.map +1 -0
- package/dist/grounding.mjs +77 -0
- package/dist/grounding.mjs.map +1 -0
- package/dist/hitl-active-learning.d.mts +41 -0
- package/dist/hitl-active-learning.d.mts.map +1 -0
- package/dist/hitl-active-learning.mjs +178 -0
- package/dist/hitl-active-learning.mjs.map +1 -0
- package/dist/hitl-annotation.d.mts +74 -0
- package/dist/hitl-annotation.d.mts.map +1 -0
- package/dist/hitl-annotation.mjs +170 -0
- package/dist/hitl-annotation.mjs.map +1 -0
- package/dist/hitl-approval.d.mts +2 -0
- package/dist/hitl-approval.mjs +3 -0
- package/dist/hitl-feedback.d.mts +59 -0
- package/dist/hitl-feedback.d.mts.map +1 -0
- package/dist/hitl-feedback.mjs +137 -0
- package/dist/hitl-feedback.mjs.map +1 -0
- package/dist/hitl-review.d.mts +2 -0
- package/dist/hitl-review.mjs +3 -0
- package/dist/hitl.d.mts +14 -0
- package/dist/hitl.d.mts.map +1 -0
- package/dist/hitl.mjs +22 -0
- package/dist/hitl.mjs.map +1 -0
- package/dist/index-B17HT-VL.d.mts +285 -0
- package/dist/index-B17HT-VL.d.mts.map +1 -0
- package/dist/index-BDwgsK9B.d.mts +101 -0
- package/dist/index-BDwgsK9B.d.mts.map +1 -0
- package/dist/index-BGgMn_Ev.d.mts +2615 -0
- package/dist/index-BGgMn_Ev.d.mts.map +1 -0
- package/dist/index-DOqe5r9G.d.mts +318 -0
- package/dist/index-DOqe5r9G.d.mts.map +1 -0
- package/dist/index-DotINT7o.d.mts +1004 -0
- package/dist/index-DotINT7o.d.mts.map +1 -0
- package/dist/index-URlW7aD1.d.mts +67 -0
- package/dist/index-URlW7aD1.d.mts.map +1 -0
- package/dist/index.d.mts +64 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +46 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integrations-blob-storage.d.mts +25 -0
- package/dist/integrations-blob-storage.d.mts.map +1 -0
- package/dist/integrations-blob-storage.mjs +3 -0
- package/dist/integrations-notifications.d.mts +2 -0
- package/dist/integrations-notifications.mjs +3 -0
- package/dist/integrations-rate-limit.d.mts +27 -0
- package/dist/integrations-rate-limit.d.mts.map +1 -0
- package/dist/integrations-rate-limit.mjs +30 -0
- package/dist/integrations-rate-limit.mjs.map +1 -0
- package/dist/integrations-redis.d.mts +3 -0
- package/dist/integrations-redis.mjs +3 -0
- package/dist/integrations-stream.d.mts +14 -0
- package/dist/integrations-stream.d.mts.map +1 -0
- package/dist/integrations-stream.mjs +3 -0
- package/dist/integrations.d.mts +7 -0
- package/dist/integrations.mjs +7 -0
- package/dist/log-adapter-BLegSZtz.d.mts +16 -0
- package/dist/log-adapter-BLegSZtz.d.mts.map +1 -0
- package/dist/log-adapter-PPe_2Pwv.mjs +28 -0
- package/dist/log-adapter-PPe_2Pwv.mjs.map +1 -0
- package/dist/loop-BOYEtr2g.mjs +520 -0
- package/dist/loop-BOYEtr2g.mjs.map +1 -0
- package/dist/loop-C-tBBOqi.d.mts +219 -0
- package/dist/loop-C-tBBOqi.d.mts.map +1 -0
- package/dist/middleware-5wQ9bANW.mjs +306 -0
- package/dist/middleware-5wQ9bANW.mjs.map +1 -0
- package/dist/middleware-C1apSrj0.mjs +613 -0
- package/dist/middleware-C1apSrj0.mjs.map +1 -0
- package/dist/middleware-C7k0uItW.d.mts +9 -0
- package/dist/middleware-C7k0uItW.d.mts.map +1 -0
- package/dist/middleware-CZQCTHfl.mjs +366 -0
- package/dist/middleware-CZQCTHfl.mjs.map +1 -0
- package/dist/models.d.mts +11 -0
- package/dist/models.d.mts.map +1 -0
- package/dist/models.mjs +32 -0
- package/dist/models.mjs.map +1 -0
- package/dist/observability-analytics.d.mts +107 -0
- package/dist/observability-analytics.d.mts.map +1 -0
- package/dist/observability-analytics.mjs +409 -0
- package/dist/observability-analytics.mjs.map +1 -0
- package/dist/observability-cost.d.mts +10 -0
- package/dist/observability-cost.d.mts.map +1 -0
- package/dist/observability-cost.mjs +15 -0
- package/dist/observability-cost.mjs.map +1 -0
- package/dist/observability-telemetry.d.mts +111 -0
- package/dist/observability-telemetry.d.mts.map +1 -0
- package/dist/observability-telemetry.mjs +343 -0
- package/dist/observability-telemetry.mjs.map +1 -0
- package/dist/observability-tracing.d.mts +10 -0
- package/dist/observability-tracing.d.mts.map +1 -0
- package/dist/observability-tracing.mjs +17 -0
- package/dist/observability-tracing.mjs.map +1 -0
- package/dist/observability.d.mts +15 -0
- package/dist/observability.d.mts.map +1 -0
- package/dist/observability.mjs +17 -0
- package/dist/observability.mjs.map +1 -0
- package/dist/optimizer-DhXXpci6.mjs +97 -0
- package/dist/optimizer-DhXXpci6.mjs.map +1 -0
- package/dist/output-multimodal.d.mts +9 -0
- package/dist/output-multimodal.d.mts.map +1 -0
- package/dist/output-multimodal.mjs +18 -0
- package/dist/output-multimodal.mjs.map +1 -0
- package/dist/output.d.mts +11 -0
- package/dist/output.d.mts.map +1 -0
- package/dist/output.mjs +40 -0
- package/dist/output.mjs.map +1 -0
- package/dist/pii-filter-3AxmYSiu.d.mts +23 -0
- package/dist/pii-filter-3AxmYSiu.d.mts.map +1 -0
- package/dist/pipelines.d.mts +448 -0
- package/dist/pipelines.d.mts.map +1 -0
- package/dist/pipelines.mjs +1534 -0
- package/dist/pipelines.mjs.map +1 -0
- package/dist/prompt-injection-DQXchzsV.d.mts +8 -0
- package/dist/prompt-injection-DQXchzsV.d.mts.map +1 -0
- package/dist/prompt-injection-RpoLPwSa.mjs +52 -0
- package/dist/prompt-injection-RpoLPwSa.mjs.map +1 -0
- package/dist/prompts.d.mts +192 -0
- package/dist/prompts.d.mts.map +1 -0
- package/dist/prompts.mjs +732 -0
- package/dist/prompts.mjs.map +1 -0
- package/dist/protocol-DfBiEsnl.d.mts +112 -0
- package/dist/protocol-DfBiEsnl.d.mts.map +1 -0
- package/dist/quota-manager-0iPMkQWN.d.mts +62 -0
- package/dist/quota-manager-0iPMkQWN.d.mts.map +1 -0
- package/dist/quota-manager-D_N7FuQ2.mjs +180 -0
- package/dist/quota-manager-D_N7FuQ2.mjs.map +1 -0
- package/dist/redaction-utils-DcQwsiNh.mjs +438 -0
- package/dist/redaction-utils-DcQwsiNh.mjs.map +1 -0
- package/dist/redis-CpsSrF8K.mjs +102 -0
- package/dist/redis-CpsSrF8K.mjs.map +1 -0
- package/dist/redis-CwguYFGh.d.mts +33 -0
- package/dist/redis-CwguYFGh.d.mts.map +1 -0
- package/dist/registry-CsD3iTIx.mjs +190 -0
- package/dist/registry-CsD3iTIx.mjs.map +1 -0
- package/dist/registry-DVPWzkXR.d.mts +36 -0
- package/dist/registry-DVPWzkXR.d.mts.map +1 -0
- package/dist/reranking-BpWYhYzl.d.mts +72 -0
- package/dist/reranking-BpWYhYzl.d.mts.map +1 -0
- package/dist/reranking-Ck8aKZW7.mjs +331 -0
- package/dist/reranking-Ck8aKZW7.mjs.map +1 -0
- package/dist/resumable-adapter-CO1HtsgJ.mjs +21 -0
- package/dist/resumable-adapter-CO1HtsgJ.mjs.map +1 -0
- package/dist/review-trigger-DmAsiQlM.d.mts +24 -0
- package/dist/review-trigger-DmAsiQlM.d.mts.map +1 -0
- package/dist/review-trigger-DwXfpww9.mjs +112 -0
- package/dist/review-trigger-DwXfpww9.mjs.map +1 -0
- package/dist/safe-context-BynhkTKR.d.mts +54 -0
- package/dist/safe-context-BynhkTKR.d.mts.map +1 -0
- package/dist/safe-context-C5A3Wv3b.mjs +143 -0
- package/dist/safe-context-C5A3Wv3b.mjs.map +1 -0
- package/dist/schema-Bu2noOZ4.mjs +27 -0
- package/dist/schema-Bu2noOZ4.mjs.map +1 -0
- package/dist/schema-CwFvuCnA.mjs +97 -0
- package/dist/schema-CwFvuCnA.mjs.map +1 -0
- package/dist/schema-Wz-1-ro9.d.mts +37 -0
- package/dist/schema-Wz-1-ro9.d.mts.map +1 -0
- package/dist/schemas-CxQtxIga.mjs +62 -0
- package/dist/schemas-CxQtxIga.mjs.map +1 -0
- package/dist/schemas-DBOhxgW7.d.mts +32 -0
- package/dist/schemas-DBOhxgW7.d.mts.map +1 -0
- package/dist/schemas-Dp_OCqBt.d.mts +63 -0
- package/dist/schemas-Dp_OCqBt.d.mts.map +1 -0
- package/dist/schemas-SwCsnT0z.mjs +83 -0
- package/dist/schemas-SwCsnT0z.mjs.map +1 -0
- package/dist/sdk-errors.d.mts +2 -0
- package/dist/sdk-errors.mjs +3 -0
- package/dist/sdk-experimental.d.mts +59 -0
- package/dist/sdk-experimental.d.mts.map +1 -0
- package/dist/sdk-experimental.mjs +193 -0
- package/dist/sdk-experimental.mjs.map +1 -0
- package/dist/sdk-stop-conditions.d.mts +3 -0
- package/dist/sdk-stop-conditions.mjs +3 -0
- package/dist/sdk.d.mts +15 -0
- package/dist/sdk.d.mts.map +1 -0
- package/dist/sdk.mjs +50 -0
- package/dist/sdk.mjs.map +1 -0
- package/dist/security-guardrails.d.mts +3 -0
- package/dist/security-guardrails.mjs +3 -0
- package/dist/security-injection.d.mts +2 -0
- package/dist/security-injection.mjs +3 -0
- package/dist/security.d.mts +12 -0
- package/dist/security.d.mts.map +1 -0
- package/dist/security.mjs +18 -0
- package/dist/security.mjs.map +1 -0
- package/dist/server.d.mts +420 -0
- package/dist/server.d.mts.map +1 -0
- package/dist/server.mjs +2225 -0
- package/dist/server.mjs.map +1 -0
- package/dist/shared.d.mts +2 -0
- package/dist/shared.mjs +3 -0
- package/dist/streaming-control.d.mts +2 -0
- package/dist/streaming-control.mjs +4 -0
- package/dist/streaming-core.d.mts +4 -0
- package/dist/streaming-core.mjs +3 -0
- package/dist/streaming-infra-resilience.d.mts +120 -0
- package/dist/streaming-infra-resilience.d.mts.map +1 -0
- package/dist/streaming-infra-resilience.mjs +358 -0
- package/dist/streaming-infra-resilience.mjs.map +1 -0
- package/dist/streaming-infra-transport.d.mts +57 -0
- package/dist/streaming-infra-transport.d.mts.map +1 -0
- package/dist/streaming-infra-transport.mjs +488 -0
- package/dist/streaming-infra-transport.mjs.map +1 -0
- package/dist/streaming-infra.d.mts +5 -0
- package/dist/streaming-infra.mjs +5 -0
- package/dist/streaming.d.mts +17 -0
- package/dist/streaming.d.mts.map +1 -0
- package/dist/streaming.mjs +71 -0
- package/dist/streaming.mjs.map +1 -0
- package/dist/telemetry-2eKMojIb.mjs +1046 -0
- package/dist/telemetry-2eKMojIb.mjs.map +1 -0
- package/dist/telemetry-C2t03dwD.d.mts +59 -0
- package/dist/telemetry-C2t03dwD.d.mts.map +1 -0
- package/dist/tool-Btbththq.d.mts +253 -0
- package/dist/tool-Btbththq.d.mts.map +1 -0
- package/dist/tool-JSf8JXZ8.mjs +1150 -0
- package/dist/tool-JSf8JXZ8.mjs.map +1 -0
- package/dist/tool-safety-CZO8a4D4.d.mts +60 -0
- package/dist/tool-safety-CZO8a4D4.d.mts.map +1 -0
- package/dist/tool-safety-DXtYDXod.mjs +319 -0
- package/dist/tool-safety-DXtYDXod.mjs.map +1 -0
- package/dist/tools-BuS2Uv0q.mjs +1708 -0
- package/dist/tools-BuS2Uv0q.mjs.map +1 -0
- package/dist/tools-approval.d.mts +99 -0
- package/dist/tools-approval.d.mts.map +1 -0
- package/dist/tools-approval.mjs +395 -0
- package/dist/tools-approval.mjs.map +1 -0
- package/dist/tools-compliance.d.mts +67 -0
- package/dist/tools-compliance.d.mts.map +1 -0
- package/dist/tools-compliance.mjs +330 -0
- package/dist/tools-compliance.mjs.map +1 -0
- package/dist/tools-computer.d.mts +25 -0
- package/dist/tools-computer.d.mts.map +1 -0
- package/dist/tools-computer.mjs +64 -0
- package/dist/tools-computer.mjs.map +1 -0
- package/dist/tools-core.d.mts +3 -0
- package/dist/tools-core.mjs +3 -0
- package/dist/tools-mcp.d.mts +3 -0
- package/dist/tools-mcp.mjs +5 -0
- package/dist/tools-superpowers.d.mts +2 -0
- package/dist/tools-superpowers.mjs +3 -0
- package/dist/tools.d.mts +401 -0
- package/dist/tools.d.mts.map +1 -0
- package/dist/tools.mjs +1921 -0
- package/dist/tools.mjs.map +1 -0
- package/dist/transport-selector-D-Ib05X1.mjs +1936 -0
- package/dist/transport-selector-D-Ib05X1.mjs.map +1 -0
- package/dist/triage-agent-BEsXg5sw.d.mts +63 -0
- package/dist/triage-agent-BEsXg5sw.d.mts.map +1 -0
- package/dist/triage-agent-CBsfX-HW.mjs +167 -0
- package/dist/triage-agent-CBsfX-HW.mjs.map +1 -0
- package/dist/types-BPnq3GQo.d.mts +23 -0
- package/dist/types-BPnq3GQo.d.mts.map +1 -0
- package/dist/types-BjWgimpY.d.mts +16 -0
- package/dist/types-BjWgimpY.d.mts.map +1 -0
- package/dist/types-BxD-5btB.d.mts +41 -0
- package/dist/types-BxD-5btB.d.mts.map +1 -0
- package/dist/types-By-r93bE.d.mts +36 -0
- package/dist/types-By-r93bE.d.mts.map +1 -0
- package/dist/types-CLBWFRZN.d.mts +69 -0
- package/dist/types-CLBWFRZN.d.mts.map +1 -0
- package/dist/types-CQ0HFd0u.d.mts +62 -0
- package/dist/types-CQ0HFd0u.d.mts.map +1 -0
- package/dist/types-D3zJb59_.d.mts +47 -0
- package/dist/types-D3zJb59_.d.mts.map +1 -0
- package/dist/types-DJnugQX0.d.mts +80 -0
- package/dist/types-DJnugQX0.d.mts.map +1 -0
- package/dist/types-DbUfMCnT.d.mts +70 -0
- package/dist/types-DbUfMCnT.d.mts.map +1 -0
- package/dist/upstash-adapter-D96Caq2O.mjs +22 -0
- package/dist/upstash-adapter-D96Caq2O.mjs.map +1 -0
- package/dist/upstash-adapter-DD4433dx.d.mts +8 -0
- package/dist/upstash-adapter-DD4433dx.d.mts.map +1 -0
- package/dist/utils-BlYhcD6M.mjs +319 -0
- package/dist/utils-BlYhcD6M.mjs.map +1 -0
- package/dist/utils-DpJGOb3y.d.mts +120 -0
- package/dist/utils-DpJGOb3y.d.mts.map +1 -0
- package/dist/vercel-blob-adapter-CkOXLT2D.mjs +25 -0
- package/dist/vercel-blob-adapter-CkOXLT2D.mjs.map +1 -0
- package/dist/xai-CbV_dCnP.mjs +1600 -0
- package/dist/xai-CbV_dCnP.mjs.map +1 -0
- package/package.json +479 -0
- package/src/agents/base/factory.ts +382 -0
- package/src/agents/base/index.ts +8 -0
- package/src/agents/base/schemas.ts +117 -0
- package/src/agents/base/types.ts +192 -0
- package/src/agents/control-flow/index.ts +683 -0
- package/src/agents/coordinator/coordinator-agent.ts +381 -0
- package/src/agents/coordinator/index.ts +6 -0
- package/src/agents/default-agent.ts +211 -0
- package/src/agents/evaluator-optimizer/README.md +612 -0
- package/src/agents/evaluator-optimizer/evaluator-optimizer.example.ts +437 -0
- package/src/agents/evaluator-optimizer/evaluator.ts +282 -0
- package/src/agents/evaluator-optimizer/index.test.ts +416 -0
- package/src/agents/evaluator-optimizer/index.ts +519 -0
- package/src/agents/evaluator-optimizer/optimizer.ts +322 -0
- package/src/agents/evaluator-optimizer/schema.ts +302 -0
- package/src/agents/evaluator-optimizer/utils.ts +42 -0
- package/src/agents/experimental/index.ts +1095 -0
- package/src/agents/experimental/types.ts +212 -0
- package/src/agents/fallback/index.ts +18 -0
- package/src/agents/fallback/recovery/circuit-breaker.ts +166 -0
- package/src/agents/fallback/strategies/model-fallback.ts +192 -0
- package/src/agents/fallback/types.ts +87 -0
- package/src/agents/governance-agent.ts +446 -0
- package/src/agents/index.ts +79 -0
- package/src/agents/multi/coordination/index.ts +6 -0
- package/src/agents/multi/coordination/message-bus.ts +144 -0
- package/src/agents/multi/index.ts +6 -0
- package/src/agents/multi/state/index.ts +162 -0
- package/src/agents/multi/supervisor/index.ts +7 -0
- package/src/agents/multi/supervisor/supervisor.ts +254 -0
- package/src/agents/multi/swarm/aggregation.ts +466 -0
- package/src/agents/multi/swarm/communication.ts +388 -0
- package/src/agents/multi/swarm/coordination.ts +380 -0
- package/src/agents/multi/swarm/index.ts +73 -0
- package/src/agents/multi/swarm/swarm-executor.ts +479 -0
- package/src/agents/multi/types.ts +181 -0
- package/src/agents/observability/index.ts +914 -0
- package/src/agents/orchestrator.ts +218 -0
- package/src/agents/patterns/README.md +512 -0
- package/src/agents/patterns/evaluator-optimizer-pattern.example.ts +455 -0
- package/src/agents/patterns/evaluator-optimizer-pattern.ts +653 -0
- package/src/agents/patterns/index.ts +26 -0
- package/src/agents/persistence/index.ts +726 -0
- package/src/agents/tools/index.ts +291 -0
- package/src/agents/tools/mcp.ts +188 -0
- package/src/agents/triage/index.ts +6 -0
- package/src/agents/triage/triage-agent.ts +280 -0
- package/src/agents/workflows/index.ts +6 -0
- package/src/agents/workflows/interfaces.ts +36 -0
- package/src/agents/workflows/schema.ts +20 -0
- package/src/caching/adapters/index.ts +7 -0
- package/src/caching/adapters/memory.ts +77 -0
- package/src/caching/adapters/redis.ts +60 -0
- package/src/caching/index.ts +17 -0
- package/src/caching/middleware.ts +452 -0
- package/src/caching/strategies/index.ts +1008 -0
- package/src/caching/types.ts +47 -0
- package/src/catalog.ts +921 -0
- package/src/client/chat-usage.ts +53 -0
- package/src/client/hooks.ts +343 -0
- package/src/client/index.ts +36 -0
- package/src/client/message-utils.ts +29 -0
- package/src/client/use-generative-ui.ts +174 -0
- package/src/client/utils.ts +66 -0
- package/src/generative-ui/catalog.ts +653 -0
- package/src/generative-ui/index.ts +82 -0
- package/src/generative-ui/registry.ts +273 -0
- package/src/generative-ui/stream.ts +324 -0
- package/src/generative-ui/types.ts +376 -0
- package/src/governance/audit/audit-logger.ts +239 -0
- package/src/governance/audit/audit-schema.ts +82 -0
- package/src/governance/audit/index.ts +6 -0
- package/src/governance/compliance/abac/policy-engine.ts +175 -0
- package/src/governance/compliance/abac/types.ts +40 -0
- package/src/governance/compliance/approval/compliance-approval-queue.ts +217 -0
- package/src/governance/compliance/index.ts +16 -0
- package/src/governance/compliance/schemas.ts +68 -0
- package/src/governance/compliance/types.ts +143 -0
- package/src/governance/compliance/validators/phi-detector.ts +145 -0
- package/src/governance/compliance/validators/redaction-utils.ts +176 -0
- package/src/governance/compliance/validators/safe-harbor.ts +135 -0
- package/src/governance/entitlements/index.ts +585 -0
- package/src/governance/entitlements/middleware.ts +651 -0
- package/src/governance/entitlements/rate-limiter.ts +711 -0
- package/src/governance/index.ts +32 -0
- package/src/governance/policies/guardrails.ts +1121 -0
- package/src/governance/policies/index.ts +42 -0
- package/src/governance/policies/loop-controls.ts +136 -0
- package/src/governance/policies/telemetry.ts +63 -0
- package/src/governance/tenancy/index.ts +30 -0
- package/src/governance/tenancy/isolation/context.ts +92 -0
- package/src/governance/tenancy/isolation/index.ts +13 -0
- package/src/governance/tenancy/quotas/index.ts +11 -0
- package/src/governance/tenancy/quotas/quota-manager.ts +180 -0
- package/src/governance/tenancy/types.ts +66 -0
- package/src/governance/types.ts +16 -0
- package/src/governance/versioning/index.ts +573 -0
- package/src/grounding/attribution/index.ts +424 -0
- package/src/grounding/citation/citation-generator.ts +174 -0
- package/src/grounding/citation/index.ts +12 -0
- package/src/grounding/context/index.ts +32 -0
- package/src/grounding/context/safe-context.ts +116 -0
- package/src/grounding/context/types.ts +62 -0
- package/src/grounding/context-engineering/error-handling.ts +359 -0
- package/src/grounding/context-engineering/index.ts +23 -0
- package/src/grounding/context-engineering/memory.ts +559 -0
- package/src/grounding/context-engineering/tool-masking.ts +338 -0
- package/src/grounding/embed/index.ts +704 -0
- package/src/grounding/embed/reranking.ts +604 -0
- package/src/grounding/hallucination/index.ts +223 -0
- package/src/grounding/index.ts +82 -0
- package/src/grounding/proof-map/applyPatch.ts +172 -0
- package/src/grounding/proof-map/index.ts +41 -0
- package/src/grounding/proof-map/loop.ts +275 -0
- package/src/grounding/proof-map/schema.ts +217 -0
- package/src/grounding/rag/__tests__/pipeline.test.ts +274 -0
- package/src/grounding/rag/__tests__/tool.test.ts +202 -0
- package/src/grounding/rag/__tests__/trace.test.ts +229 -0
- package/src/grounding/rag/circuit-breaker.ts +152 -0
- package/src/grounding/rag/index.ts +64 -0
- package/src/grounding/rag/pipeline.ts +602 -0
- package/src/grounding/rag/tool.ts +281 -0
- package/src/grounding/rag/trace.ts +503 -0
- package/src/grounding/rag/types.ts +284 -0
- package/src/grounding/retrieval/in-memory-store.ts +107 -0
- package/src/grounding/sources/index.ts +943 -0
- package/src/grounding/tests/applyPatch.test.ts +194 -0
- package/src/grounding/tests/loop.test.ts +141 -0
- package/src/grounding/tests/schema.test.ts +160 -0
- package/src/grounding/types.ts +100 -0
- package/src/grounding/verification/index.ts +419 -0
- package/src/hitl/active-learning/index.ts +332 -0
- package/src/hitl/annotation/index.ts +362 -0
- package/src/hitl/approval/approval-queue.ts +132 -0
- package/src/hitl/approval/index.ts +5 -0
- package/src/hitl/feedback/index.ts +284 -0
- package/src/hitl/index.ts +69 -0
- package/src/hitl/review/index.ts +6 -0
- package/src/hitl/review/review-trigger.ts +162 -0
- package/src/hitl/types.ts +126 -0
- package/src/index.ts +125 -0
- package/src/integrations/blob-storage/index.ts +7 -0
- package/src/integrations/blob-storage/types.ts +28 -0
- package/src/integrations/blob-storage/vercel-blob-adapter.ts +35 -0
- package/src/integrations/index.ts +15 -0
- package/src/integrations/notifications/index.ts +7 -0
- package/src/integrations/notifications/log-adapter.ts +30 -0
- package/src/integrations/notifications/types.ts +27 -0
- package/src/integrations/rate-limit/index.ts +7 -0
- package/src/integrations/rate-limit/types.ts +26 -0
- package/src/integrations/rate-limit/upstash-adapter.ts +45 -0
- package/src/integrations/redis/index.ts +7 -0
- package/src/integrations/redis/types.ts +67 -0
- package/src/integrations/redis/upstash-adapter.ts +18 -0
- package/src/integrations/stream/index.ts +7 -0
- package/src/integrations/stream/resumable-adapter.ts +20 -0
- package/src/integrations/stream/types.ts +21 -0
- package/src/internal/__tests__/hallucination.test.ts +162 -0
- package/src/internal/__tests__/models.test.ts +104 -0
- package/src/internal/__tests__/sdk-errors.test.ts +201 -0
- package/src/internal/__tests__/stop-conditions.test.ts +210 -0
- package/src/internal/shared/ai-types.ts +942 -0
- package/src/internal/testing/evaluators.ts +575 -0
- package/src/internal/testing/index.ts +960 -0
- package/src/internal/ui/data-parts.ts +511 -0
- package/src/internal/ui/type-guards.ts +344 -0
- package/src/internal/ui-factories/__tests__/ui-factories.test.ts +548 -0
- package/src/internal/ui-factories/artifact-factory.ts +667 -0
- package/src/internal/ui-factories/index.ts +82 -0
- package/src/internal/ui-factories/shimmer-manager.ts +220 -0
- package/src/internal/ui-factories/status-helpers.ts +149 -0
- package/src/internal/ui-factories/tool-renderer.ts +167 -0
- package/src/internal/ui-factories/types.ts +235 -0
- package/src/models/capabilities.ts +88 -0
- package/src/models/index.ts +16 -0
- package/src/models/provider-factory.ts +229 -0
- package/src/models/providers/anthropic.ts +539 -0
- package/src/models/providers/google.ts +354 -0
- package/src/models/providers/index.ts +21 -0
- package/src/models/providers/openai.ts +346 -0
- package/src/models/providers/perplexity.ts +276 -0
- package/src/models/providers/shared.ts +90 -0
- package/src/models/providers/xai.ts +269 -0
- package/src/models/registry.ts +208 -0
- package/src/models/routing/index.ts +45 -0
- package/src/models/routing/intent-router.ts +143 -0
- package/src/models/routing/model-router.ts +300 -0
- package/src/models/routing/types.ts +106 -0
- package/src/models/types.ts +23 -0
- package/src/observability/analytics/index.ts +593 -0
- package/src/observability/cost/index.ts +16 -0
- package/src/observability/cost/tracking/budget-guard.ts +110 -0
- package/src/observability/cost/tracking/usage-tracker.ts +120 -0
- package/src/observability/cost/types.ts +85 -0
- package/src/observability/index.ts +17 -0
- package/src/observability/telemetry/index.ts +508 -0
- package/src/observability/tracing/index.ts +30 -0
- package/src/observability/tracing/otel/ai-instrumentation.ts +193 -0
- package/src/observability/tracing/otel/exporters/console.ts +58 -0
- package/src/observability/tracing/otel/exporters/index.ts +6 -0
- package/src/observability/tracing/provenance.ts +769 -0
- package/src/observability/tracing/types.ts +92 -0
- package/src/output/__tests__/output.test.ts +737 -0
- package/src/output/element-stream.ts +678 -0
- package/src/output/errors.ts +108 -0
- package/src/output/factories.ts +392 -0
- package/src/output/index.ts +98 -0
- package/src/output/multimodal/EXPORTS.md +306 -0
- package/src/output/multimodal/IMPLEMENTATION_SUMMARY.md +421 -0
- package/src/output/multimodal/README.md +349 -0
- package/src/output/multimodal/SETUP_GUIDE.md +472 -0
- package/src/output/multimodal/audio.ts +650 -0
- package/src/output/multimodal/image.ts +22 -0
- package/src/output/multimodal/index.ts +32 -0
- package/src/output/multimodal/providers.example.ts +375 -0
- package/src/output/validator.ts +495 -0
- package/src/pipelines/adapters/trace-storage-blob.ts +458 -0
- package/src/pipelines/adapters/trace-storage-memory.ts +319 -0
- package/src/pipelines/defaults.ts +109 -0
- package/src/pipelines/index.ts +24 -0
- package/src/pipelines/message-transforms.ts +107 -0
- package/src/pipelines/multi-step-wrapper.ts +433 -0
- package/src/pipelines/pipeline-presets.ts +339 -0
- package/src/pipelines/step-executor.ts +257 -0
- package/src/pipelines/storage-factory.ts +85 -0
- package/src/pipelines/trace-storage-interface.ts +216 -0
- package/src/pipelines/types.ts +255 -0
- package/src/pipelines/validation.ts +323 -0
- package/src/prompts/index.ts +271 -0
- package/src/prompts/model-variants.ts +410 -0
- package/src/prompts/templates.ts +327 -0
- package/src/sdk/errors/base.ts +296 -0
- package/src/sdk/errors/index.ts +31 -0
- package/src/sdk/errors/utils.ts +148 -0
- package/src/sdk/experimental/index.ts +286 -0
- package/src/sdk/index.ts +25 -0
- package/src/sdk/middleware/ai-middleware.ts +95 -0
- package/src/sdk/middleware/cache.ts +154 -0
- package/src/sdk/middleware/circuit-breaker.ts +388 -0
- package/src/sdk/middleware/compose.ts +81 -0
- package/src/sdk/middleware/deduplication.ts +307 -0
- package/src/sdk/middleware/index.ts +660 -0
- package/src/sdk/middleware/model-middleware.ts +200 -0
- package/src/sdk/stop-conditions/conditions.ts +209 -0
- package/src/sdk/stop-conditions/index.ts +35 -0
- package/src/sdk/stop-conditions/types.ts +59 -0
- package/src/security/guardrails/index.ts +6 -0
- package/src/security/guardrails/middleware.ts +465 -0
- package/src/security/guardrails/pii-filter.ts +396 -0
- package/src/security/index.ts +33 -0
- package/src/security/injection/index.ts +5 -0
- package/src/security/injection/prompt-injection.ts +64 -0
- package/src/security/types.ts +85 -0
- package/src/server/cache/crypto.ts +47 -0
- package/src/server/cache/performance.ts +79 -0
- package/src/server/error-handler.ts +93 -0
- package/src/server/errors.ts +73 -0
- package/src/server/helpers.ts +944 -0
- package/src/server/http.ts +156 -0
- package/src/server/index.ts +12 -0
- package/src/server/messages/__tests__/messages.test.ts +720 -0
- package/src/server/messages/converter.ts +245 -0
- package/src/server/messages/data-parts.ts +338 -0
- package/src/server/messages/extraction.ts +328 -0
- package/src/server/messages/index.ts +126 -0
- package/src/server/messages/types.ts +355 -0
- package/src/server/messages/window.ts +450 -0
- package/src/server/rate-limit/env.ts +8 -0
- package/src/server/rate-limit/rate-limit.ts +165 -0
- package/src/server/routes/HEALTH_CHECK.md +502 -0
- package/src/server/routes/IMPLEMENTATION_SUMMARY.md +432 -0
- package/src/server/routes/QUICK_START.md +327 -0
- package/src/server/routes/README.md +357 -0
- package/src/server/routes/__tests__/routes.test.ts +628 -0
- package/src/server/routes/agent-route.ts +224 -0
- package/src/server/routes/agent-routes.ts +191 -0
- package/src/server/routes/embed-config.ts +181 -0
- package/src/server/routes/health-check.example.ts +507 -0
- package/src/server/routes/health-check.test.ts +533 -0
- package/src/server/routes/health-check.ts +639 -0
- package/src/server/routes/health-check.types.ts +217 -0
- package/src/server/routes/index.ts +32 -0
- package/src/server/routes/types.ts +274 -0
- package/src/shared/__tests__/schemas.test.ts +317 -0
- package/src/shared/ai-runtime.ts +139 -0
- package/src/shared/ai-types.ts +133 -0
- package/src/shared/index.ts +30 -0
- package/src/shared/sdk-runtime.ts +198 -0
- package/src/shared/sdk-types.ts +301 -0
- package/src/streaming/control/__tests__/streaming-control.test.ts +708 -0
- package/src/streaming/control/budget-guard.ts +264 -0
- package/src/streaming/control/controller.ts +255 -0
- package/src/streaming/control/index.ts +105 -0
- package/src/streaming/control/smoothing.ts +201 -0
- package/src/streaming/control/step-limit.ts +215 -0
- package/src/streaming/control/types.ts +234 -0
- package/src/streaming/core/auto-resume.ts +276 -0
- package/src/streaming/core/index.ts +85 -0
- package/src/streaming/core/multi-step.ts +471 -0
- package/src/streaming/core/protocol.ts +194 -0
- package/src/streaming/core/types.ts +182 -0
- package/src/streaming/index.ts +97 -0
- package/src/streaming/infra/backpressure/buffer.ts +210 -0
- package/src/streaming/infra/backpressure/index.ts +6 -0
- package/src/streaming/infra/index.ts +75 -0
- package/src/streaming/infra/multiplexing/index.ts +311 -0
- package/src/streaming/infra/resilience/index.ts +684 -0
- package/src/streaming/infra/transform/index.ts +15 -0
- package/src/streaming/infra/transform/stream-transforms.ts +166 -0
- package/src/streaming/infra/transport/index.ts +774 -0
- package/src/streaming/infra/types.ts +118 -0
- package/src/streaming/infra-extra/types.ts +118 -0
- package/src/tools/advanced/caching.ts +299 -0
- package/src/tools/advanced/generator.ts +267 -0
- package/src/tools/advanced/hitl.ts +251 -0
- package/src/tools/advanced/index.ts +9 -0
- package/src/tools/advanced/llm-tool.ts +208 -0
- package/src/tools/approval/FILES.md +449 -0
- package/src/tools/approval/IMPLEMENTATION_SUMMARY.md +567 -0
- package/src/tools/approval/QUICK_START.md +362 -0
- package/src/tools/approval/README.md +514 -0
- package/src/tools/approval/advanced-approval-queue.ts +7 -0
- package/src/tools/approval/approval.example.ts +571 -0
- package/src/tools/approval/in-memory-queue.ts +405 -0
- package/src/tools/approval/index.ts +737 -0
- package/src/tools/approval/middleware.ts +590 -0
- package/src/tools/approval/queue-factory.ts +162 -0
- package/src/tools/approval/redis-queue.ts +327 -0
- package/src/tools/approval/testing.ts +493 -0
- package/src/tools/approval/types.ts +221 -0
- package/src/tools/approval/with-approval.ts +366 -0
- package/src/tools/artifacts/artifact-tools.ts +273 -0
- package/src/tools/artifacts/index.ts +6 -0
- package/src/tools/compliance/compliance-wrapper.ts +789 -0
- package/src/tools/compliance/create-compliant-stream.ts +226 -0
- package/src/tools/compliance/index.ts +8 -0
- package/src/tools/compliance/phi-redaction.ts +406 -0
- package/src/tools/compliance/tool-wrapper.ts +306 -0
- package/src/tools/computer/index.ts +99 -0
- package/src/tools/computer/types.ts +41 -0
- package/src/tools/core/abort.ts +202 -0
- package/src/tools/core/factory.ts +197 -0
- package/src/tools/core/index.ts +8 -0
- package/src/tools/core/tool-safety.ts +112 -0
- package/src/tools/generic/index.ts +9 -0
- package/src/tools/generic/json-schema-tool.ts +301 -0
- package/src/tools/generic/tiptap-context.ts +619 -0
- package/src/tools/generic/web-search-tool.ts +82 -0
- package/src/tools/generic/web-search.ts +142 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/mcp/ai-sdk-error-integration.ts +401 -0
- package/src/tools/mcp/client.ts +988 -0
- package/src/tools/mcp/connection-manager.ts +380 -0
- package/src/tools/mcp/connection-pool.ts +408 -0
- package/src/tools/mcp/edge-runtime.ts +318 -0
- package/src/tools/mcp/environment.ts +310 -0
- package/src/tools/mcp/index.ts +20 -0
- package/src/tools/mcp/next-pattern.ts +401 -0
- package/src/tools/mcp/stream-lifecycle-integration.ts +617 -0
- package/src/tools/mcp/tool-cache.ts +359 -0
- package/src/tools/mcp/transport-selector.ts +492 -0
- package/src/tools/mcp/transports.ts +99 -0
- package/src/tools/simple-factory.ts +55 -0
- package/src/tools/superpowers/index.ts +122 -0
- package/src/tools/superpowers/prompts/index.ts +533 -0
- package/src/tools/superpowers/schemas/index.ts +701 -0
- package/src/tools/superpowers/tools/index.ts +721 -0
- package/src/tools/validation-wrapper.ts +97 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-JSf8JXZ8.mjs","names":["fs"],"sources":["../src/grounding/rag/circuit-breaker.ts","../src/grounding/rag/pipeline.ts","../src/grounding/rag/trace.ts","../src/grounding/rag/tool.ts"],"sourcesContent":["export type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitMetrics {\n name: string;\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailureAt?: number;\n lastSuccessAt?: number;\n openUntil?: number;\n}\n\nexport interface CircuitBreakerConfig {\n name: string;\n failureThreshold: number;\n resetTimeout: number;\n halfOpenRequests: number;\n fallbackBehavior?: 'error' | 'allow';\n onStateChange?: (from: CircuitState, to: CircuitState) => void;\n}\n\ninterface CircuitStateSnapshot {\n state: CircuitState;\n failures: number;\n successes: number;\n lastFailureAt?: number;\n lastSuccessAt?: number;\n openUntil?: number;\n halfOpenAttempts: number;\n}\n\nexport class CircuitBreaker {\n private readonly config: CircuitBreakerConfig;\n private state: CircuitStateSnapshot;\n\n constructor(config: CircuitBreakerConfig) {\n this.config = config;\n this.state = {\n state: 'closed',\n failures: 0,\n successes: 0,\n halfOpenAttempts: 0,\n };\n }\n\n getMetrics(): CircuitMetrics {\n return {\n name: this.config.name,\n state: this.state.state,\n failures: this.state.failures,\n successes: this.state.successes,\n lastFailureAt: this.state.lastFailureAt,\n lastSuccessAt: this.state.lastSuccessAt,\n openUntil: this.state.openUntil,\n };\n }\n\n reset(): void {\n this.state = {\n state: 'closed',\n failures: 0,\n successes: 0,\n halfOpenAttempts: 0,\n };\n }\n\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n const now = Date.now();\n\n if (this.state.state === 'open') {\n const openUntil = this.state.openUntil ?? 0;\n if (now >= openUntil) {\n this.transitionTo('half-open');\n } else if (this.config.fallbackBehavior !== 'allow') {\n throw new Error(`[CircuitBreaker] ${this.config.name} is open`);\n }\n }\n\n if (this.state.state === 'half-open') {\n if (this.state.halfOpenAttempts >= this.config.halfOpenRequests) {\n if (this.config.fallbackBehavior !== 'allow') {\n throw new Error(`[CircuitBreaker] ${this.config.name} half-open limit reached`);\n }\n } else {\n this.state.halfOpenAttempts += 1;\n }\n }\n\n try {\n const result = await fn();\n this.recordSuccess();\n return result;\n } catch (error) {\n this.recordFailure();\n throw error;\n }\n }\n\n private recordSuccess(): void {\n const now = Date.now();\n this.state.lastSuccessAt = now;\n this.state.failures = 0;\n\n if (this.state.state === 'half-open') {\n this.state.successes += 1;\n if (this.state.successes >= this.config.halfOpenRequests) {\n this.transitionTo('closed');\n }\n } else {\n this.state.successes += 1;\n }\n }\n\n private recordFailure(): void {\n const now = Date.now();\n this.state.lastFailureAt = now;\n this.state.failures += 1;\n this.state.successes = 0;\n\n if (this.state.state === 'half-open' || this.state.failures >= this.config.failureThreshold) {\n this.transitionTo('open');\n }\n }\n\n private transitionTo(next: CircuitState): void {\n if (this.state.state === next) {\n return;\n }\n\n const prev = this.state.state;\n this.state.state = next;\n\n if (next === 'open') {\n this.state.openUntil = Date.now() + this.config.resetTimeout;\n this.state.halfOpenAttempts = 0;\n }\n\n if (next === 'half-open') {\n this.state.halfOpenAttempts = 0;\n this.state.successes = 0;\n this.state.openUntil = undefined;\n }\n\n if (next === 'closed') {\n this.state.failures = 0;\n this.state.halfOpenAttempts = 0;\n this.state.openUntil = undefined;\n }\n\n this.config.onStateChange?.(prev, next);\n }\n}\n","/**\n * @fileoverview Multi-model research pipeline\n *\n * Three-stage research pipeline for high-quality, verified research:\n * 1. Perplexity: Context expansion (grounded notes + citations)\n * 2. Sonnet 4.5: Structured reasoning (claims, assumptions, gaps)\n * 3. GPT-5: Verification (fact-check, tighten citations)\n *\n * Benefits:\n * - Cuts hallucinations via grounded notes\n * - Readable traces (notes → reasoning → verification)\n * - Tunable research depth (fast/balanced/deep)\n * - Circuit breaker protection for fault tolerance\n *\n * @module @od-oneapp/ai-platform/research/pipeline\n */\n\nimport { logError, logWarn } from '@repo/shared/logs';\nimport { z } from 'zod';\n\nimport { anthropic, openai, generateText } from '../../shared';\n\nimport { CircuitBreaker, type CircuitMetrics, type CircuitState } from './circuit-breaker';\n\nimport type {\n PerplexityResponse,\n ReasoningOutput,\n ResearchConfig,\n ResearchPipelineResult,\n ResearchTier,\n VerificationOutput,\n} from './types';\n\n\n/**\n * Circuit breaker instances for each pipeline stage.\n * @internal\n */\nconst pipelineCircuits = {\n perplexity: new CircuitBreaker({\n name: 'research-perplexity',\n failureThreshold: 3,\n resetTimeout: 60000, // 1 minute\n halfOpenRequests: 1,\n fallbackBehavior: 'error',\n onStateChange: (from: CircuitState, to: CircuitState) => {\n if (to === 'open') {\n logError('[Pipeline] Perplexity circuit opened - requests will fail until reset');\n }\n },\n }),\n sonnet: new CircuitBreaker({\n name: 'research-sonnet',\n failureThreshold: 3,\n resetTimeout: 45000, // 45 seconds\n halfOpenRequests: 1,\n fallbackBehavior: 'error',\n }),\n verification: new CircuitBreaker({\n name: 'research-verification',\n failureThreshold: 3,\n resetTimeout: 45000, // 45 seconds\n halfOpenRequests: 1,\n fallbackBehavior: 'error',\n }),\n};\n\n/**\n * Gets circuit breaker metrics for monitoring.\n *\n * @returns Array of circuit metrics for all pipeline stages.\n * @example\n * ```ts\n * const metrics = getPipelineCircuitMetrics();\n * console.log(metrics.map(m => `${m.name}: ${m.state}`));\n * ```\n */\nexport function getPipelineCircuitMetrics(): CircuitMetrics[] {\n return [\n pipelineCircuits.perplexity.getMetrics(),\n pipelineCircuits.sonnet.getMetrics(),\n pipelineCircuits.verification.getMetrics(),\n ];\n}\n\n/**\n * Resets all pipeline circuit breakers.\n * Use for testing or manual recovery.\n */\nexport function resetPipelineCircuits(): void {\n pipelineCircuits.perplexity.reset();\n pipelineCircuits.sonnet.reset();\n pipelineCircuits.verification.reset();\n}\n\n/**\n * Tier configurations for research depth.\n * Defines token limits and modes for each tier.\n * @internal\n */\nconst TIER_CONFIGS: Record<ResearchTier, { maxTokens: number; mode: string }> = {\n fast: { maxTokens: 400, mode: 'concise-notes' },\n balanced: { maxTokens: 800, mode: 'concise-notes' },\n deep: { maxTokens: 1600, mode: 'deep-notes' },\n};\n\n/**\n * Gets verification model from environment variable.\n * Supports: gpt-4-turbo, o1-preview, o1-pro, gpt-5\n * @returns Model identifier (defaults to 'gpt-4-turbo').\n * @internal\n */\nfunction getVerificationModel(): string {\n return process.env.NEXT_AI_VERIFICATION_MODEL ?? 'gpt-4-turbo';\n}\n\n/**\n * Step 1: Perplexity - Context expansion.\n * Returns crisp notes + URLs only (no long prose).\n * Bounded context keeps costs predictable.\n * Protected by circuit breaker for fault tolerance.\n *\n * @param query - Research question or query.\n * @param tier - Research depth tier (defaults to 'balanced').\n * @returns Perplexity response with notes, citations, and usage stats.\n * @throws {Error} If Perplexity API fails and GPT-4 Turbo fallback also fails.\n * @throws {CircuitOpenError} If circuit breaker is open after repeated failures.\n * @remarks Falls back to GPT-4 Turbo if Perplexity API is unavailable or times out (30s timeout).\n * Extracts citations from both API response and inline [Source: URL] markers.\n * Limits citations to maximum of 7 URLs.\n * Circuit breaker opens after 3 failures and resets after 60 seconds.\n * @example\n * ```ts\n * const result = await researchWithPerplexity('What is quantum computing?', 'balanced');\n * console.log(result.notes, result.cites);\n * ```\n */\nexport async function researchWithPerplexity(\n query: string,\n tier: ResearchTier = 'balanced',\n): Promise<PerplexityResponse> {\n // Wrap the entire function in circuit breaker protection\n return pipelineCircuits.perplexity.execute(async () => {\n return researchWithPerplexityInternal(query, tier);\n });\n}\n\n/**\n * Internal implementation of Perplexity research.\n * @internal\n */\nasync function researchWithPerplexityInternal(\n query: string,\n tier: ResearchTier,\n): Promise<PerplexityResponse> {\n const config = TIER_CONFIGS[tier];\n\n // Try real Perplexity API first\n if (process.env.PPLX_API_KEY) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30s timeout\n\n try {\n const response = await fetch('https://api.perplexity.ai/chat/completions', {\n method: 'POST',\n signal: controller.signal,\n headers: {\n Authorization: `Bearer ${process.env.PPLX_API_KEY}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: 'llama-3.1-sonar-large-128k-online',\n messages: [\n {\n role: 'system',\n content: `You are a research assistant. Provide concise, citation-dense notes.\nFormat:\n- Use bullet points\n- Include specific facts and figures\n- Cite sources as [Source: URL]\n- Keep to ${config.maxTokens} tokens max\n- ${config.mode === 'deep-notes' ? 'Provide comprehensive coverage' : 'Be concise'}`,\n },\n { role: 'user', content: query },\n ],\n max_tokens: config.maxTokens,\n return_citations: true,\n temperature: 0.3,\n }),\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => 'Unable to read error body');\n throw new Error(\n `Perplexity API error: ${response.status} ${response.statusText} - ${errorBody}`,\n );\n }\n\n const data = (await response.json()) as {\n citations?: string[];\n choices?: Array<{ message?: { content?: string } }>;\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n };\n\n // Extract citations from response\n const cites: string[] = data.citations ?? [];\n\n // Also extract inline citations from content\n const content = data.choices?.[0]?.message?.content ?? '';\n const citationRegex = /\\[Source: (https?:\\/\\/[^\\]]+)\\]/g;\n let match;\n while ((match = citationRegex.exec(content)) !== null) {\n const url = match[1];\n if (url && !cites.includes(url)) {\n cites.push(url);\n }\n }\n\n return {\n notes: content,\n cites: cites.slice(0, 7), // Max 7 citations\n usage: {\n inputTokens: data.usage?.prompt_tokens ?? 0,\n outputTokens: data.usage?.completion_tokens ?? 0,\n },\n };\n } catch (error) {\n clearTimeout(timeoutId); // Cleanup timeout to prevent memory leak\n // Handle specific error types\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n logWarn('[Perplexity] Request timed out after 30s, falling back to GPT-4 Turbo');\n } else {\n logWarn('[Perplexity] API call failed, falling back to GPT-4 Turbo', {\n error: error.message,\n });\n }\n } else {\n logWarn('[Perplexity] Unknown error, falling back to GPT-4 Turbo', {\n error: String(error),\n });\n }\n // Fall through to simulation\n }\n }\n\n // Fallback: Simulate with GPT-4 Turbo\n const result = await generateText({\n model: openai('gpt-4-turbo'),\n prompt: `You are a research assistant. Provide concise, citation-dense notes for: \"${query}\"\n\nFormat:\n- Use bullet points\n- Include specific facts and figures\n- Cite sources as [Source: URL]\n- Keep to ${config.maxTokens} tokens max\n- ${config.mode === 'deep-notes' ? 'Provide comprehensive coverage' : 'Be concise'}\n\nReturn only the notes with citations.`,\n maxRetries: 2,\n });\n\n // Extract citations from notes\n const citationRegex = /\\[Source: (https?:\\/\\/[^\\]]+)\\]/g;\n const cites: string[] = [];\n let match;\n while ((match = citationRegex.exec(result.text)) !== null) {\n const url = match[1];\n if (url && !cites.includes(url)) {\n cites.push(url);\n }\n }\n\n return {\n notes: result.text,\n cites: cites.slice(0, 7), // Max 7 citations\n usage: {\n inputTokens: result.usage.inputTokens ?? 0,\n outputTokens: result.usage.outputTokens ?? 0,\n },\n };\n}\n\n/**\n * Schema for Sonnet reasoning output.\n * @internal\n */\nconst reasoningSchema = z.object({\n claims: z.array(\n z.object({\n statement: z.string(),\n supportedBy: z.array(z.string()).describe('Citation URLs'),\n confidence: z.enum(['high', 'medium', 'low']),\n }),\n ),\n assumptions: z.array(z.string()).describe('Underlying assumptions made'),\n gaps: z\n .array(\n z.object({\n description: z.string(),\n sources: z.array(z.string()).describe('Conflicting sources if any'),\n }),\n )\n .describe('Knowledge gaps or conflicts'),\n answerDraft: z.string().describe('Draft answer based on notes'),\n});\n\n/**\n * Step 2: Sonnet 4.5 - Structured reasoning.\n * Reasons over ONLY the provided notes.\n * Outputs: claims[], assumptions[], gaps[], answerDraft.\n * Protected by circuit breaker for fault tolerance.\n *\n * @param input - Reasoning input containing question, notes, and citations.\n * @param input.question - Research question.\n * @param input.notes - Research notes from Perplexity.\n * @param input.cites - Citation URLs.\n * @returns Reasoning output with claims, assumptions, gaps, and draft answer.\n * @throws {Error} If JSON extraction or parsing fails, or if model call fails.\n * @throws {CircuitOpenError} If circuit breaker is open after repeated failures.\n * @remarks Uses Claude 3.5 Sonnet with temperature 0.3 for consistent reasoning.\n * Strictly enforces using only provided notes (no external knowledge).\n * Returns structured JSON matching the reasoning schema.\n * Circuit breaker opens after 3 failures and resets after 45 seconds.\n * @example\n * ```ts\n * const reasoning = await reasonWithSonnet({\n * question: 'What is quantum computing?',\n * notes: perplexityResult.notes,\n * cites: perplexityResult.cites\n * });\n * ```\n */\nexport async function reasonWithSonnet(input: {\n question: string;\n notes: string;\n cites: string[];\n}): Promise<ReasoningOutput> {\n return pipelineCircuits.sonnet.execute(async () => {\n return reasonWithSonnetInternal(input);\n });\n}\n\n/**\n * Internal implementation of Sonnet reasoning.\n * @internal\n */\nasync function reasonWithSonnetInternal(input: {\n question: string;\n notes: string;\n cites: string[];\n}): Promise<ReasoningOutput> {\n const systemPrompt = `You are a rigorous analyst.\n\nCRITICAL RULES:\n1. Use ONLY the provided notes and citations\n2. Do not add external knowledge\n3. Explicitly mark any assumptions\n4. Flag gaps where citations conflict or are insufficient\n5. Output structured JSON matching the schema\n\nYour goal is to produce verifiable, citation-backed reasoning.`;\n\n const scratchpad = `## QUESTION\n${input.question}\n\n## NOTES\n${input.notes}\n\n## CITATIONS\n${input.cites.map((c, i) => `[${i + 1}] ${c}`).join('\\n')}\n\n## TASK\nAnalyze the notes and produce structured reasoning. Return JSON only.`;\n\n const result = await generateText({\n model: anthropic('claude-3-5-sonnet-20241022'),\n system: systemPrompt,\n prompt: scratchpad,\n temperature: 0.3,\n maxRetries: 2,\n });\n\n // Extract JSON from response\n const jsonMatch = result.text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('Failed to extract JSON from Sonnet response');\n }\n\n let parsed;\n try {\n parsed = JSON.parse(jsonMatch[0]);\n } catch (parseError) {\n throw new Error(\n `Failed to parse JSON from Sonnet: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`,\n );\n }\n\n const validated = reasoningSchema.parse(parsed);\n\n return {\n ...validated,\n usage: {\n inputTokens: result.usage.inputTokens ?? 0,\n outputTokens: result.usage.outputTokens ?? 0,\n },\n };\n}\n\n/**\n * Schema for GPT-5 verification output.\n * @internal\n */\nconst verificationSchema = z.object({\n finalAnswer: z.string().describe('Verified, tightened answer'),\n flags: z\n .array(\n z.object({\n claim: z.string(),\n issue: z.enum(['unverifiable', 'weak-citation', 'conflicting-sources']),\n details: z.string(),\n }),\n )\n .describe('Issues found during verification'),\n trace: z\n .array(\n z.object({\n claim: z.string(),\n citationCheck: z.enum(['verified', 'partial', 'failed']),\n notes: z.string().optional(),\n }),\n )\n .describe('Per-claim verification trace'),\n confidence: z.enum(['high', 'medium', 'low']).describe('Overall confidence in answer'),\n});\n\n/**\n * Step 3: GPT-5 - Verification.\n * Fact-checks each claim against citations.\n * Flags unverifiable items.\n * Returns final answer with trace.\n * Protected by circuit breaker for fault tolerance.\n *\n * @param draft - Reasoning output from Sonnet stage.\n * @param cites - Citation URLs to verify against.\n * @returns Verification output with final answer, flags, trace, and confidence.\n * @throws {Error} If JSON extraction or parsing fails, or if model call fails.\n * @throws {CircuitOpenError} If circuit breaker is open after repeated failures.\n * @remarks Uses verification model from NEXT_AI_VERIFICATION_MODEL env var (defaults to 'gpt-4-turbo').\n * Supports: gpt-4-turbo, o1-preview, o1-pro, gpt-5.\n * Uses temperature 0.2 for strict verification.\n * Returns verification trace for each claim with citation check results.\n * Circuit breaker opens after 3 failures and resets after 45 seconds.\n * @example\n * ```ts\n * const verification = await verifyWithGPT5(reasoning, cites);\n * console.log(verification.finalAnswer, verification.confidence);\n * ```\n */\nexport async function verifyWithGPT5(\n draft: ReasoningOutput,\n cites: string[],\n): Promise<VerificationOutput> {\n return pipelineCircuits.verification.execute(async () => {\n return verifyWithGPT5Internal(draft, cites);\n });\n}\n\n/**\n * Internal implementation of GPT-5 verification.\n * @internal\n */\nasync function verifyWithGPT5Internal(\n draft: ReasoningOutput,\n cites: string[],\n): Promise<VerificationOutput> {\n const verificationModel = getVerificationModel();\n\n const systemPrompt = `You are ${verificationModel}, a verification model.\n\nTASKS:\n1. Check each claim against the provided citations\n2. Flag claims that lack strong citation support\n3. Identify conflicting sources\n4. Produce a tightened final answer\n5. Return structured JSON with verification trace\n\nVERIFICATION RULES:\n- \"verified\": Claim directly supported by citation\n- \"partial\": Citation provides weak or indirect support\n- \"failed\": No citation support found\n\nBe strict but fair. Better to flag uncertainty than claim certainty.`;\n\n const verificationInput = {\n draft: {\n claims: draft.claims,\n assumptions: draft.assumptions,\n gaps: draft.gaps,\n answerDraft: draft.answerDraft,\n },\n citations: cites.map((c, i) => ({ id: i + 1, url: c })),\n };\n\n const result = await generateText({\n model: openai(verificationModel),\n system: systemPrompt,\n prompt: `Verify this reasoning:\\n\\n${JSON.stringify(verificationInput, null, 2)}\\n\\nReturn JSON only.`,\n temperature: 0.2,\n maxRetries: 2,\n });\n\n // Extract JSON from response\n const jsonMatch = result.text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('Failed to extract JSON from verification response');\n }\n\n let parsed;\n try {\n parsed = JSON.parse(jsonMatch[0]);\n } catch (parseError) {\n throw new Error(\n `Failed to parse JSON from verification: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`,\n );\n }\n\n const validated = verificationSchema.parse(parsed);\n\n return {\n ...validated,\n usage: {\n inputTokens: result.usage.inputTokens ?? 0,\n outputTokens: result.usage.outputTokens ?? 0,\n },\n };\n}\n\n/**\n * Orchestrator: Full research pipeline.\n * Executes all three steps in sequence (Perplexity → Sonnet → GPT-5).\n * Returns final answer with full trace.\n *\n * @param question - Research question to answer.\n * @param config - Research configuration (defaults to { tier: 'balanced' }).\n * @returns Complete research pipeline result with answer, confidence, flags, and trace.\n * @throws {Error} If any pipeline stage fails (propagates errors from individual stages).\n * @remarks Executes stages sequentially. Each stage's output feeds into the next.\n * Full trace includes token usage and results from all three stages.\n * Confidence level reflects overall verification quality.\n * @example\n * ```ts\n * const result = await executeResearchPipeline(\n * 'What are the latest developments in quantum computing?',\n * { tier: 'deep' }\n * );\n * console.log(result.answer, result.confidence);\n * ```\n */\nexport async function executeResearchPipeline(\n question: string,\n config: ResearchConfig = { tier: 'balanced' },\n): Promise<ResearchPipelineResult> {\n // Step 1: Context expansion\n const {\n notes,\n cites,\n usage: perplexityUsage,\n } = await researchWithPerplexity(question, config.tier);\n\n // Step 2: Structured reasoning\n const reasoning = await reasonWithSonnet({ question, notes, cites });\n\n // Step 3: Verification\n const verification = await verifyWithGPT5(reasoning, cites);\n\n return {\n answer: verification.finalAnswer,\n confidence: verification.confidence,\n flags: verification.flags,\n trace: {\n contextExpansion: {\n notes,\n cites,\n usage: perplexityUsage,\n },\n reasoning: {\n claims: reasoning.claims,\n assumptions: reasoning.assumptions,\n gaps: reasoning.gaps,\n usage: reasoning.usage,\n },\n verification: {\n trace: verification.trace,\n flags: verification.flags,\n usage: verification.usage,\n },\n },\n };\n}\n","/**\n * @fileoverview Research trace storage with cost & latency tracking\n *\n * Extends the artifact pattern for multi-model research runs:\n * - Per-step artifact storage (context expansion → reasoning → verification)\n * - Cost tracking per model (configurable via PipelineModelConfig.costRates)\n * - Latency profiling\n * - Fast indexing for dashboard queries\n *\n * Storage pattern:\n * - File-based for prototype (like artifacts.ts)\n * - Production: Neon Postgres + Upstash Redis + R2\n *\n * @module @od-oneapp/ai-platform/research/trace\n */\n\nimport { createHash, randomUUID } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { logError } from '@repo/shared/logs';\n\nimport type { ResearchTier } from './types';\n\n/** Directory for storing research traces. */\nconst TRACES_DIR = process.env.NEXT_AI_TRACES_PATH ?? '/tmp/next-ai-traces';\n\n/**\n * Validates run ID to prevent path traversal attacks.\n * Format: {timestamp}-{12-char-hex}\n * Example: 1733875200000-a1b2c3d4e5f6\n *\n * @param runId - Run ID to validate.\n * @returns `true` if run ID is valid, `false` otherwise.\n * @internal\n */\nfunction validateRunId(runId: string): boolean {\n // runId format: timestamp-hash (e.g., 1733875200000-a1b2c3d4e5f6)\n const runIdRegex = /^[0-9]+-[0-9a-f]{12}$/i;\n return runIdRegex.test(runId);\n}\n\n/**\n * Safely constructs run path with validation.\n * Prevents path traversal attacks by ensuring paths stay within TRACES_DIR.\n *\n * @param runId - Run ID (validated).\n * @param filename - Optional filename to append.\n * @returns Resolved path or `null` if validation fails.\n * @internal\n */\nfunction getRunPath(runId: string, filename?: string): string | null {\n if (!validateRunId(runId)) {\n logError('Invalid run ID format', { runId });\n return null;\n }\n\n const runPath = filename\n ? resolve(join(TRACES_DIR, runId, filename))\n : resolve(join(TRACES_DIR, runId));\n const baseDir = resolve(TRACES_DIR);\n\n // Ensure path is within TRACES_DIR\n if (!runPath.startsWith(baseDir)) {\n logError('Path traversal attempt detected', { runId });\n return null;\n }\n\n return runPath;\n}\n\n/**\n * Pipeline stage kind for trace tracking.\n * Uses role-based names instead of provider-specific names.\n */\nexport type TraceStepKind = 'context-expansion' | 'reasoning' | 'verification';\n\nexport interface TraceStep {\n /** Step identifier. */\n id: string;\n /** Pipeline stage kind. */\n kind: TraceStepKind;\n /** Timestamp when step started (Unix epoch milliseconds). */\n startAt: number;\n /** Timestamp when step ended (Unix epoch milliseconds). */\n endAt: number;\n /** Step latency in milliseconds. */\n latencyMs: number;\n /** Model used for this step. */\n model?: string;\n /** Input tokens consumed. */\n inputTokens?: number;\n /** Output tokens generated. */\n outputTokens?: number;\n /** Estimated cost in USD. */\n costUSD?: number;\n /** Step artifacts (in-memory). */\n artifacts: Record<string, unknown>;\n /** Artifact keys (file paths or R2 keys). */\n artifactKeys: string[];\n}\n\n/**\n * Complete research run trace information.\n * Tracks full pipeline execution with all steps, cost, and latency.\n */\nexport interface TraceRun {\n /** Unique run identifier. */\n runId: string;\n /** Application/client identifier. */\n app: string;\n /** Research question. */\n question: string;\n /** Research tier used. */\n tier: ResearchTier;\n /** Timestamp when run started (Unix epoch milliseconds). */\n startedAt: number;\n /** Timestamp when run ended (Unix epoch milliseconds). */\n endedAt?: number;\n /** Total latency in milliseconds. */\n totalLatencyMs?: number;\n /** Total cost in USD. */\n totalCostUSD?: number;\n /** Array of flag strings. */\n flags?: string[];\n /** Array of research steps. */\n steps: TraceStep[];\n /** Optional metadata. */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Default token-based cost rates ($/1k tokens).\n * Override via `PipelineModelConfig.costRates` or the `customRates` param on `estimateCost`.\n */\nexport const DEFAULT_COST_RATES: Record<\n string,\n { input?: number; output?: number; flat?: number }\n> = {\n 'perplexity-latest': { flat: 0.002 },\n 'llama-3.1-sonar-large-128k-online': { flat: 0.002 },\n 'gpt-4-turbo': { input: 0.01, output: 0.03 },\n 'gpt-5': { input: 0.01, output: 0.03 },\n 'claude-3-5-sonnet-20241022': { input: 0.003, output: 0.015 },\n};\n\n/**\n * Estimates cost for a model call based on token usage.\n *\n * @param model - Model identifier.\n * @param inputTokens - Input tokens consumed (defaults to 0).\n * @param outputTokens - Output tokens generated (defaults to 0).\n * @returns Estimated cost in USD.\n * @remarks Cost rates ($/1k tokens):\n * - Perplexity: $0.002 flat per call\n * - Claude 3.5 Sonnet: $0.003 input, $0.015 output\n * - GPT-4 Turbo: $0.01 input, $0.03 output\n * Returns 0 if model is not in cost rates table.\n * @example\n * ```ts\n * const cost = estimateCost('claude-3-5-sonnet-20241022', 1000, 500);\n * // Returns: (1000/1000 * 0.003) + (500/1000 * 0.015) = 0.0105\n * ```\n */\nexport function estimateCost(\n model: string,\n inputTokens = 0,\n outputTokens = 0,\n customRates?: Record<string, { input?: number; output?: number; flat?: number }>,\n): number {\n const rates = customRates ? { ...DEFAULT_COST_RATES, ...customRates } : DEFAULT_COST_RATES;\n const rate = rates[model];\n if (!rate) return 0;\n\n if (rate.flat) return rate.flat;\n\n return (inputTokens / 1000) * (rate.input ?? 0) + (outputTokens / 1000) * (rate.output ?? 0);\n}\n\n/**\n * Ensures traces directory exists.\n * Creates directory recursively if it doesn't exist.\n * @internal\n */\nasync function ensureTracesDir(): Promise<void> {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- TRACES_DIR is validated via environment variable with safe default\n await fs.mkdir(TRACES_DIR, { recursive: true });\n } catch (error) {\n logError('Failed to create traces directory', { error });\n }\n}\n\n/**\n * Starts a new research run trace.\n * Creates a new TraceRun with generated runId and initial timestamp.\n *\n * @param question - Research question.\n * @param tier - Research tier.\n * @param app - Application/client identifier (defaults to 'research-agent').\n * @returns New TraceRun object.\n * @example\n * ```ts\n * const run = startRun('What is quantum computing?', 'balanced', 'my-app');\n * ```\n */\nexport function startRun(question: string, tier: ResearchTier, app = 'research-agent'): TraceRun {\n const timestamp = Date.now();\n const hash = createHash('sha256').update(`${timestamp}-${question}`).digest('hex').slice(0, 12);\n\n return {\n runId: `${timestamp}-${hash}`,\n app,\n question,\n tier,\n startedAt: timestamp,\n steps: [],\n };\n}\n\n/**\n * Starts a new research step trace.\n * Creates a new TraceStep with generated ID and start timestamp.\n *\n * @param kind - Pipeline stage kind ('context-expansion', 'reasoning', or 'verification').\n * @param model - Optional model identifier.\n * @returns New TraceStep object.\n * @example\n * ```ts\n * const step = startStep('context-expansion', 'llama-3.1-sonar-large-128k-online');\n * ```\n */\nexport function startStep(kind: TraceStepKind, model?: string): TraceStep {\n return {\n id: randomUUID(),\n kind,\n startAt: Date.now(),\n endAt: 0,\n latencyMs: 0,\n model,\n artifacts: {},\n artifactKeys: [],\n };\n}\n\n/**\n * Ends a research step with usage metrics.\n * Calculates latency and cost, updates step with token usage.\n *\n * @param step - Step to end.\n * @param usage - Optional usage metrics (inputTokens, outputTokens, costUSD).\n * @returns Updated step with end timestamp, latency, and cost.\n * @example\n * ```ts\n * const completedStep = endStep(step, {\n * inputTokens: 1000,\n * outputTokens: 500\n * });\n * ```\n */\nexport function endStep(\n step: TraceStep,\n usage?: { inputTokens?: number; outputTokens?: number; costUSD?: number },\n): TraceStep {\n step.endAt = Date.now();\n step.latencyMs = step.endAt - step.startAt;\n\n if (usage?.inputTokens) step.inputTokens = usage.inputTokens;\n if (usage?.outputTokens) step.outputTokens = usage.outputTokens;\n if (usage?.costUSD !== undefined) {\n step.costUSD = usage.costUSD;\n } else if (step.model) {\n step.costUSD = estimateCost(step.model, step.inputTokens ?? 0, step.outputTokens ?? 0);\n }\n\n return step;\n}\n\n/**\n * Ends a research run and calculates totals.\n * Computes total latency and cost from all steps.\n *\n * @param run - Run to end.\n * @returns Updated run with end timestamp, total latency, and total cost.\n * @example\n * ```ts\n * const completedRun = endRun(run);\n * console.log(`Total cost: $${completedRun.totalCostUSD}`);\n * ```\n */\nexport function endRun(run: TraceRun): TraceRun {\n run.endedAt = Date.now();\n run.totalLatencyMs = run.endedAt - run.startedAt;\n run.totalCostUSD = run.steps.reduce((acc, s) => acc + (s.costUSD ?? 0), 0);\n return run;\n}\n\n/**\n * Persists step artifacts to storage.\n * Writes step artifacts as JSON files in the run directory.\n *\n * @param run - Research run.\n * @param step - Research step.\n * @param payloads - Artifact payloads keyed by name.\n * @throws {Error} If run ID is invalid or file write fails.\n * @remarks Production: Replace with R2 writes.\n * Artifact keys are added to step.artifactKeys array for reference.\n * Files are named as: `{step.kind}-{step.id}.{name}.json`\n * @example\n * ```ts\n * await persistStep(run, step, {\n * p_notes: { notes: '...', cites: [...] },\n * p_index: { sources: [...], fetchedAt: '...' }\n * });\n * ```\n */\nexport async function persistStep(\n run: TraceRun,\n step: TraceStep,\n payloads: Record<string, unknown>,\n): Promise<void> {\n await ensureTracesDir();\n\n const runDir = getRunPath(run.runId);\n if (!runDir) {\n throw new Error(`Invalid run ID: ${run.runId}`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- runDir is validated by getRunPath which checks for path traversal\n await fs.mkdir(runDir, { recursive: true });\n\n for (const [name, body] of Object.entries(payloads)) {\n const filename = `${step.kind}-${step.id}.${name}.json`;\n const filepath = join(runDir, filename);\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- filepath is validated via getRunPath and filename sanitization\n await fs.writeFile(filepath, JSON.stringify(body, null, 2), 'utf-8');\n step.artifactKeys.push(filename);\n }\n}\n\n/**\n * Persists run index for fast listing.\n * Creates an index file with run metadata for quick queries.\n *\n * @param run - Research run to index.\n * @remarks Production: Write to Upstash Redis ZSET.\n * @example\n * ```ts\n * await persistRunIndex(run);\n * ```\n */\nexport async function persistRunIndex(run: TraceRun): Promise<void> {\n await ensureTracesDir();\n\n const indexPath = join(TRACES_DIR, `${run.runId}.index.json`);\n const index = {\n runId: run.runId,\n app: run.app,\n question: run.question,\n tier: run.tier,\n startedAt: run.startedAt,\n endedAt: run.endedAt ?? 0,\n totalLatencyMs: run.totalLatencyMs ?? 0,\n totalCostUSD: run.totalCostUSD ?? 0,\n flags: run.flags ?? [],\n };\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- indexPath uses validated runId format\n await fs.writeFile(indexPath, JSON.stringify(index, null, 2), 'utf-8');\n}\n\n/**\n * Persists full run metadata.\n * Writes complete run object as JSON file.\n *\n * @param run - Research run to persist.\n * @throws {Error} If run ID is invalid or file write fails.\n * @remarks Writes to `{runId}/run.meta.json` in traces directory.\n * Contains complete run state including all steps and metadata.\n * @example\n * ```ts\n * await persistRunMeta(run);\n * ```\n */\nexport async function persistRunMeta(run: TraceRun): Promise<void> {\n await ensureTracesDir();\n\n const runDir = getRunPath(run.runId);\n if (!runDir) {\n throw new Error(`Invalid run ID: ${run.runId}`);\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- runDir is validated by getRunPath which checks for path traversal\n await fs.mkdir(runDir, { recursive: true });\n\n const metaPath = join(runDir, 'run.meta.json');\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- metaPath uses validated runDir\n await fs.writeFile(metaPath, JSON.stringify(run, null, 2), 'utf-8');\n}\n\n/**\n * Lists recent research runs.\n * Returns runs sorted by start time (most recent first).\n *\n * @param limit - Maximum number of runs to return (defaults to 100).\n * @returns Array of TraceRun objects sorted by startedAt descending.\n * @remarks Production: Query from Redis ZSET.\n * Reads index files from traces directory and parses JSON.\n * Returns empty array on error (logs error to console).\n * @example\n * ```ts\n * const runs = await listRuns(50);\n * ```\n */\nexport async function listRuns(limit = 100): Promise<TraceRun[]> {\n await ensureTracesDir();\n\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- TRACES_DIR is validated via environment variable with safe default\n const files = await fs.readdir(TRACES_DIR);\n const indexFiles = files.filter(f => f.endsWith('.index.json'));\n\n const indices = await Promise.all(\n indexFiles.map(async file => {\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- file is filtered to .index.json files only\n const content = await fs.readFile(join(TRACES_DIR, file), 'utf-8');\n return JSON.parse(content);\n }),\n );\n\n // Sort by startedAt desc\n return indices.sort((a, b) => b.startedAt - a.startedAt).slice(0, limit);\n } catch (error) {\n logError('Failed to list runs', { error });\n return [];\n }\n}\n\n/**\n * Loads full run metadata from storage.\n *\n * @param runId - Run identifier.\n * @returns TraceRun object or `null` if not found or invalid.\n * @remarks Reads from `{runId}/run.meta.json` file.\n * Returns `null` if file doesn't exist, runId is invalid, or parse fails.\n * Logs errors to console.\n * @example\n * ```ts\n * const run = await loadRun('1733875200000-a1b2c3d4e5f6');\n * ```\n */\nexport async function loadRun(runId: string): Promise<TraceRun | null> {\n try {\n const metaPath = getRunPath(runId, 'run.meta.json');\n if (!metaPath) {\n return null;\n }\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- metaPath is validated by getRunPath which checks for path traversal\n const content = await fs.readFile(metaPath, 'utf-8');\n return JSON.parse(content) as TraceRun;\n } catch (error) {\n logError('Failed to load run', { error, runId });\n return null;\n }\n}\n\n/**\n * Loads a step artifact from storage.\n * Validates artifact key to prevent path traversal attacks.\n *\n * @param runId - Run identifier.\n * @param artifactKey - Artifact key (filename).\n * @returns Artifact data or `null` if not found or validation fails.\n * @remarks Rejects artifact keys containing '..' or '/' to prevent path traversal.\n * Returns `null` on any error (file not found, invalid key, parse error).\n * @example\n * ```ts\n * const artifact = await loadStepArtifact(runId, 'perplexity-123.p_notes.json');\n * ```\n */\nexport async function loadStepArtifact(\n runId: string,\n artifactKey: string,\n): Promise<unknown | null> {\n try {\n // Validate artifactKey doesn't contain path traversal\n if (artifactKey.includes('..') || artifactKey.includes('/')) {\n logError('Invalid artifact key', { artifactKey });\n return null;\n }\n\n const artifactPath = getRunPath(runId, artifactKey);\n if (!artifactPath) {\n return null;\n }\n // eslint-disable-next-line security/detect-non-literal-fs-filename -- artifactPath is validated by getRunPath and artifactKey sanitization\n const content = await fs.readFile(artifactPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n logError('Failed to load artifact', { error, artifactKey, runId });\n return null;\n }\n}\n","/**\n * @fileoverview Research tool for agent integration\n *\n * Wraps the three-stage research pipeline as an AI SDK tool\n * that can be used by any agent (canvas, chat, etc.)\n *\n * Features:\n * - Configurable models per stage via PipelineModelConfig\n * - Tier-based research (fast/balanced/deep)\n * - Full trace with cost/latency\n * - Compliance signal integration\n * - Artifact storage for research results\n *\n * @module @od-oneapp/ai-platform/research/tool\n */\n\nimport { z } from 'zod';\n\nimport { tool } from '../../shared';\n\n\nimport { reasonWithSonnet, researchWithPerplexity, verifyWithGPT5 } from './pipeline';\nimport {\n endRun,\n endStep,\n persistRunIndex,\n persistRunMeta,\n persistStep,\n startRun,\n startStep,\n} from './trace';\n\nimport type { PipelineModelConfig, ResearchTier } from './types';\nimport type { ComplianceSignal } from '../../governance/compliance/schemas';\n\n/**\n * Schema for research tool input.\n */\nexport const researchInputSchema = z.object({\n /** Research question or query. */\n question: z.string().min(1).describe('Research question or query'),\n /** Research depth: fast (400 tokens), balanced (800 tokens), deep (1600 tokens). */\n tier: z\n .enum(['fast', 'balanced', 'deep'])\n .optional()\n .default('balanced')\n .describe('Research depth: fast (400 tokens), balanced (800 tokens), deep (1600 tokens)'),\n});\n\n/** Research tool input type. */\nexport type ResearchInput = z.infer<typeof researchInputSchema>;\n\n/**\n * Creates a research tool for AI SDK agents.\n * Wraps the multi-model research pipeline with trace storage and compliance signals.\n *\n * @param options - Optional tool configuration:\n * - `onSignal` - Callback for compliance signal emission\n * - `onTrace` - Callback for trace step completion (receives runId, step kind, latency, cost)\n * @returns AI SDK tool ready for agent integration.\n * @remarks Tool executes full three-stage research pipeline (context expansion → reasoning → verification).\n * Persists step artifacts and run metadata for traceability.\n * Emits compliance signals at start and completion.\n * Returns structured result with answer, confidence, citations, flags, and trace.\n * On error, returns failure result with error message and emits guardrail.blocked signal.\n * @example\n * ```ts\n * const researchTool = createResearchTool({\n * onSignal: (signal) => persistSignal(signal),\n * onTrace: (runId, step) => console.log(`Step ${step.kind} completed`)\n * });\n *\n * const agent = createAgent({\n * tools: { research: researchTool }\n * });\n * ```\n */\nexport function createResearchTool(options?: {\n onSignal?: (signal: ComplianceSignal) => void;\n onTrace?: (runId: string, step: { kind: string; latencyMs: number; costUSD: number }) => void;\n /** Optional model configuration overrides for the three-stage pipeline. */\n modelConfig?: PipelineModelConfig;\n}) {\n return tool({\n description: `Perform multi-model research using a three-stage pipeline: context expansion → structured reasoning → verification.\n\nThis tool provides grounded, verified research with:\n- Context expansion (notes + citations)\n- Structured reasoning (claims, assumptions, gaps)\n- Verification (fact-checking, confidence scoring)\n\nUse this tool when you need factual, citation-backed answers to complex questions.\n\nTiers:\n- fast: Quick research (400 tokens, ~2-3 citations)\n- balanced: Standard research (800 tokens, ~5 citations)\n- deep: Comprehensive research (1600 tokens, ~7 citations)`,\n inputSchema: researchInputSchema,\n execute: async (input: ResearchInput) => {\n const { question, tier } = input;\n\n try {\n // Start run trace\n const run = startRun(question, tier as ResearchTier, 'next-ai');\n\n // Emit start signal\n options?.onSignal?.({\n id: crypto.randomUUID(),\n type: 'tool.executed',\n message: `Starting multi-model research (tier: ${tier})`,\n runId: run.runId,\n timestamp: new Date().toISOString(),\n metadata: { question, tier },\n });\n\n const mc = options?.modelConfig;\n\n // STEP 1: Context expansion\n const expansionModel = mc?.contextExpansion?.model ?? 'llama-3.1-sonar-large-128k-online';\n const expansionStep = startStep('context-expansion', expansionModel);\n const {\n notes,\n cites,\n usage: expansionUsage,\n } = await researchWithPerplexity(question, tier as ResearchTier);\n endStep(expansionStep, {\n inputTokens: expansionUsage.inputTokens,\n outputTokens: expansionUsage.outputTokens,\n });\n\n await persistStep(run, expansionStep, {\n expansion_notes: { notes, cites },\n expansion_index: {\n sources: cites,\n fetchedAt: new Date().toISOString(),\n tier,\n },\n });\n run.steps.push(expansionStep);\n\n options?.onTrace?.(run.runId, {\n kind: 'context-expansion',\n latencyMs: expansionStep.latencyMs,\n costUSD: expansionStep.costUSD ?? 0,\n });\n\n // STEP 2: Structured reasoning\n const reasoningModel = mc?.reasoning?.model ?? 'claude-3-5-sonnet-20241022';\n const reasoningStep = startStep('reasoning', reasoningModel);\n const reasoning = await reasonWithSonnet({ question, notes, cites });\n endStep(reasoningStep, {\n inputTokens: reasoning.usage.inputTokens,\n outputTokens: reasoning.usage.outputTokens,\n });\n\n await persistStep(run, reasoningStep, {\n reasoning_output: {\n claims: reasoning.claims,\n assumptions: reasoning.assumptions,\n gaps: reasoning.gaps,\n answerDraft: reasoning.answerDraft,\n meta: {\n model: reasoningStep.model,\n timestamp: new Date().toISOString(),\n },\n },\n });\n run.steps.push(reasoningStep);\n\n options?.onTrace?.(run.runId, {\n kind: 'reasoning',\n latencyMs: reasoningStep.latencyMs,\n costUSD: reasoningStep.costUSD ?? 0,\n });\n\n // STEP 3: Verification\n const verificationModel =\n mc?.verification?.model ?? process.env.NEXT_AI_VERIFICATION_MODEL ?? 'gpt-4-turbo';\n const verificationStep = startStep('verification', verificationModel);\n const verification = await verifyWithGPT5(reasoning, cites);\n endStep(verificationStep, {\n inputTokens: verification.usage.inputTokens,\n outputTokens: verification.usage.outputTokens,\n });\n\n await persistStep(run, verificationStep, {\n verification_output: {\n finalAnswer: verification.finalAnswer,\n flags: verification.flags,\n trace: verification.trace,\n confidence: verification.confidence,\n meta: {\n model: verificationStep.model,\n timestamp: new Date().toISOString(),\n },\n },\n });\n run.steps.push(verificationStep);\n\n options?.onTrace?.(run.runId, {\n kind: 'verification',\n latencyMs: verificationStep.latencyMs,\n costUSD: verificationStep.costUSD ?? 0,\n });\n\n // Finalize run\n run.flags = verification.flags.map((f: { issue: string }) => f.issue);\n endRun(run);\n\n // Persist metadata\n await persistRunMeta(run);\n await persistRunIndex(run);\n\n // Emit completion signal\n options?.onSignal?.({\n id: crypto.randomUUID(),\n type: 'tool.executed',\n message: `Research completed (confidence: ${verification.confidence}, ${verification.flags.length} flags)`,\n runId: run.runId,\n timestamp: new Date().toISOString(),\n metadata: {\n runId: run.runId,\n latencyMs: run.totalLatencyMs,\n costUSD: run.totalCostUSD,\n confidence: verification.confidence,\n flagCount: verification.flags.length,\n },\n });\n\n // Return formatted result\n return {\n success: true,\n answer: verification.finalAnswer,\n confidence: verification.confidence,\n citations: cites.map((url, i) => `[${i + 1}] ${url}`).join('\\n'),\n flags:\n verification.flags.length > 0\n ? verification.flags\n .map(\n (f: { claim: string; issue: string; details: string }) =>\n `⚠️ ${f.claim}: ${f.issue} (${f.details})`,\n )\n .join('\\n')\n : 'No verification issues',\n reasoning: {\n claims: reasoning.claims.length,\n assumptions: reasoning.assumptions.length,\n gaps: reasoning.gaps.length,\n },\n trace: {\n runId: run.runId,\n latencyMs: run.totalLatencyMs,\n costUSD: `$${run.totalCostUSD?.toFixed(4)}`,\n steps: run.steps.map(s => ({\n kind: s.kind,\n latencyMs: s.latencyMs,\n costUSD: `$${s.costUSD?.toFixed(4)}`,\n })),\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n options?.onSignal?.({\n id: crypto.randomUUID(),\n type: 'guardrail.blocked',\n message: `Research failed: ${errorMessage}`,\n runId: crypto.randomUUID(),\n timestamp: new Date().toISOString(),\n metadata: { error: errorMessage },\n });\n\n return {\n success: false,\n error: errorMessage,\n answer: 'Research pipeline failed. Please try again or rephrase your question.',\n };\n }\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { qi as SDKTool } from "./ai-runtime-DIwOEc6g.mjs";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/core/factory.d.ts
|
|
5
|
+
interface ToolExecutionContext {
|
|
6
|
+
userId?: string;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
abortSignal?: AbortSignal;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
type ToolHandler<TInput, TOutput> = (input: TInput, context: ToolExecutionContext) => Promise<TOutput>;
|
|
12
|
+
interface ToolFactoryConfig<TSchema extends z.ZodObject<z.ZodRawShape>> {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
parameters: TSchema;
|
|
16
|
+
handler: ToolHandler<z.infer<TSchema>, unknown>;
|
|
17
|
+
}
|
|
18
|
+
declare function createToolWithContext<TSchema extends z.ZodObject<z.ZodRawShape>>(config: ToolFactoryConfig<TSchema>, context: ToolExecutionContext): SDKTool;
|
|
19
|
+
declare function createToolFactory<TSchema extends z.ZodObject<z.ZodRawShape>>(config: {
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
parameters: TSchema;
|
|
23
|
+
}): (handler: ToolHandler<z.infer<TSchema>, unknown>, context?: ToolExecutionContext) => SDKTool;
|
|
24
|
+
declare function wrapToolHandler<TInput, TOutput>(handler: ToolHandler<TInput, TOutput>, options: {
|
|
25
|
+
name: string;
|
|
26
|
+
onError?: (error: Error, input: TInput) => TOutput | Promise<TOutput>;
|
|
27
|
+
onBefore?: (input: TInput, context: ToolExecutionContext) => void | Promise<void>;
|
|
28
|
+
onAfter?: (input: TInput, output: TOutput, context: ToolExecutionContext) => void | Promise<void>;
|
|
29
|
+
}): ToolHandler<TInput, TOutput>;
|
|
30
|
+
declare function createTools(configs: Record<string, ToolFactoryConfig<z.ZodObject<z.ZodRawShape>>>, context?: ToolExecutionContext): Record<string, SDKTool>;
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/tools/core/abort.d.ts
|
|
33
|
+
declare class ToolAbortError extends Error {
|
|
34
|
+
readonly name = "ToolAbortError";
|
|
35
|
+
readonly toolName: string;
|
|
36
|
+
constructor(toolName: string, message?: string);
|
|
37
|
+
}
|
|
38
|
+
interface AbortOptions {
|
|
39
|
+
timeoutMs?: number;
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
throwOnAbort?: boolean;
|
|
42
|
+
fallbackValue?: unknown;
|
|
43
|
+
}
|
|
44
|
+
declare function withAbortHandling<TInput, TOutput>(handler: ToolHandler<TInput, TOutput>, toolName: string, options?: AbortOptions): ToolHandler<TInput, TOutput>;
|
|
45
|
+
declare function combineAbortSignals(signals: AbortSignal[]): AbortSignal;
|
|
46
|
+
declare function createTimeoutAbort(timeoutMs: number): AbortController;
|
|
47
|
+
declare function isAbortError(error: unknown): error is ToolAbortError | DOMException;
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/tools/core/tool-safety.d.ts
|
|
50
|
+
declare function executeToolSafely<T>(toolFn: () => Promise<T>, options?: {
|
|
51
|
+
retries?: number;
|
|
52
|
+
delay?: number;
|
|
53
|
+
onRetry?: (attempt: number, error: unknown) => void;
|
|
54
|
+
onError?: (error: unknown) => void;
|
|
55
|
+
fallback?: T;
|
|
56
|
+
}): Promise<T>;
|
|
57
|
+
declare function executeWithFallback<T>(primaryFn: () => Promise<T>, fallbackFn: () => Promise<T>): Promise<T>;
|
|
58
|
+
//#endregion
|
|
59
|
+
export { combineAbortSignals as a, withAbortHandling as c, ToolHandler as d, createToolFactory as f, wrapToolHandler as h, ToolAbortError as i, ToolExecutionContext as l, createTools as m, executeWithFallback as n, createTimeoutAbort as o, createToolWithContext as p, AbortOptions as r, isAbortError as s, executeToolSafely as t, ToolFactoryConfig as u };
|
|
60
|
+
//# sourceMappingURL=tool-safety-CZO8a4D4.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-safety-CZO8a4D4.d.mts","names":[],"sources":["../src/tools/core/factory.ts","../src/tools/core/abort.ts","../src/tools/core/tool-safety.ts"],"mappings":";;;;UAciB,oBAAA;EAEf,MAAA;EAEA,SAAA;EAEA,WAAA,GAAc,WAAA;EAEd,QAAA,GAAW,MAAA;AAAA;AAAA,KAMD,WAAA,qBACV,KAAA,EAAO,MAAA,EACP,OAAA,EAAS,oBAAA,KACN,OAAA,CAAQ,OAAA;AAAA,UAKI,iBAAA,iBAAkC,CAAA,CAAE,SAAA,CAAU,CAAA,CAAE,WAAA;EAE/D,IAAA;EAEA,WAAA;EAEA,UAAA,EAAY,OAAA;EAEZ,OAAA,EAAS,WAAA,CAAY,CAAA,CAAE,KAAA,CAAM,OAAA;AAAA;AAAA,iBAsBf,qBAAA,iBAAsC,CAAA,CAAE,SAAA,CAAU,CAAA,CAAE,WAAA,EAAA,CAClE,MAAA,EAAQ,iBAAA,CAAkB,OAAA,GAC1B,OAAA,EAAS,oBAAA,GACR,OAAA;AAAA,iBA8Ba,iBAAA,iBAAkC,CAAA,CAAE,SAAA,CAAU,CAAA,CAAE,WAAA,EAAA,CAAc,MAAA;EAC5E,IAAA;EACA,WAAA;EACA,UAAA,EAAY,OAAA;AAAA,KAGV,OAAA,EAAS,WAAA,CAAY,CAAA,CAAE,KAAA,CAAM,OAAA,aAC7B,OAAA,GAAS,oBAAA,KACR,OAAA;AAAA,iBAYW,eAAA,iBAAA,CACd,OAAA,EAAS,WAAA,CAAY,MAAA,EAAQ,OAAA,GAC7B,OAAA;EAEE,IAAA;EAEA,OAAA,IAAW,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,OAAA,CAAQ,OAAA;EAE7D,QAAA,IAAY,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,oBAAA,YAAgC,OAAA;EAEpE,OAAA,IACE,KAAA,EAAO,MAAA,EACP,MAAA,EAAQ,OAAA,EACR,OAAA,EAAS,oBAAA,YACC,OAAA;AAAA,IAEb,WAAA,CAAY,MAAA,EAAQ,OAAA;AAAA,iBAkDP,WAAA,CACd,OAAA,EAAS,MAAA,SAAe,iBAAA,CAAkB,CAAA,CAAE,SAAA,CAAU,CAAA,CAAE,WAAA,KACxD,OAAA,GAAS,oBAAA,GACR,MAAA,SAAe,OAAA;;;cClLL,cAAA,SAAuB,KAAA;EAAA,SACzB,IAAA;EAAA,SACA,QAAA;cAEG,QAAA,UAAkB,OAAA;AAAA;AAAA,UASf,YAAA;EAEf,SAAA;EAEA,MAAA,GAAS,WAAA;EAET,YAAA;EAEA,aAAA;AAAA;AAAA,iBAoBc,iBAAA,iBAAA,CACd,OAAA,EAAS,WAAA,CAAY,MAAA,EAAQ,OAAA,GAC7B,QAAA,UACA,OAAA,GAAS,YAAA,GACR,WAAA,CAAY,MAAA,EAAQ,OAAA;AAAA,iBAyDP,mBAAA,CAAoB,OAAA,EAAS,WAAA,KAAgB,WAAA;AAAA,iBA4E7C,kBAAA,CAAmB,SAAA,WAAoB,eAAA;AAAA,iBASvC,YAAA,CAAa,KAAA,YAAiB,KAAA,IAAS,cAAA,GAAiB,YAAA;;;iBC/KlD,iBAAA,GAAA,CACpB,MAAA,QAAc,OAAA,CAAQ,CAAA,GACtB,OAAA;EACE,OAAA;EACA,KAAA;EACA,OAAA,IAAW,OAAA,UAAiB,KAAA;EAC5B,OAAA,IAAW,KAAA;EACX,QAAA,GAAW,CAAA;AAAA,IAEZ,OAAA,CAAQ,CAAA;AAAA,iBAmEW,mBAAA,GAAA,CACpB,SAAA,QAAiB,OAAA,CAAQ,CAAA,GACzB,UAAA,QAAkB,OAAA,CAAQ,CAAA,IACzB,OAAA,CAAQ,CAAA"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { Ft as tool } from "./ai-runtime-CDzQztTt.mjs";
|
|
2
|
+
import "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/core/factory.ts
|
|
5
|
+
/**
|
|
6
|
+
* Creates a tool with dependency-injected context.
|
|
7
|
+
*
|
|
8
|
+
* @param config - Tool configuration
|
|
9
|
+
* @param context - Execution context to inject
|
|
10
|
+
* @returns AI SDK tool
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const searchTool = createToolWithContext({
|
|
15
|
+
* name: 'search',
|
|
16
|
+
* description: 'Search documents',
|
|
17
|
+
* parameters: z.object({ query: z.string() }),
|
|
18
|
+
* handler: async ({ query }, ctx) => {
|
|
19
|
+
* return searchDocs(query, ctx.userId);
|
|
20
|
+
* },
|
|
21
|
+
* }, { userId: 'user-123' });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
function createToolWithContext(config, context) {
|
|
25
|
+
return tool({
|
|
26
|
+
description: config.description,
|
|
27
|
+
inputSchema: config.parameters,
|
|
28
|
+
execute: async (input) => {
|
|
29
|
+
return config.handler(input, context);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Creates a tool factory that returns tools with injected context.
|
|
35
|
+
*
|
|
36
|
+
* @param config - Tool configuration without handler
|
|
37
|
+
* @returns Factory function that accepts handler and context
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const createSearchTool = createToolFactory({
|
|
42
|
+
* name: 'search',
|
|
43
|
+
* description: 'Search documents',
|
|
44
|
+
* parameters: z.object({ query: z.string() }),
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* const searchTool = createSearchTool(
|
|
48
|
+
* async ({ query }, ctx) => searchDocs(query, ctx.userId),
|
|
49
|
+
* { userId: 'user-123' }
|
|
50
|
+
* );
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
function createToolFactory(config) {
|
|
54
|
+
return function(handler, context = {}) {
|
|
55
|
+
return createToolWithContext({
|
|
56
|
+
...config,
|
|
57
|
+
handler
|
|
58
|
+
}, context);
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Wraps a tool handler with error handling and logging.
|
|
63
|
+
*
|
|
64
|
+
* @param handler - Original handler function
|
|
65
|
+
* @param options - Wrapper options
|
|
66
|
+
* @returns Wrapped handler
|
|
67
|
+
*/
|
|
68
|
+
function wrapToolHandler(handler, options) {
|
|
69
|
+
return async (input, context) => {
|
|
70
|
+
try {
|
|
71
|
+
if (options.onBefore) await options.onBefore(input, context);
|
|
72
|
+
const result = await handler(input, context);
|
|
73
|
+
if (options.onAfter) await options.onAfter(input, result, context);
|
|
74
|
+
return result;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
77
|
+
if (options.onError) return options.onError(err, input);
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Creates multiple tools from a configuration object.
|
|
84
|
+
*
|
|
85
|
+
* @param configs - Map of tool names to configurations
|
|
86
|
+
* @param context - Shared execution context
|
|
87
|
+
* @returns Record of tools
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* const tools = createTools({
|
|
92
|
+
* search: {
|
|
93
|
+
* description: 'Search documents',
|
|
94
|
+
* parameters: z.object({ query: z.string() }),
|
|
95
|
+
* handler: async ({ query }) => searchDocs(query),
|
|
96
|
+
* },
|
|
97
|
+
* create: {
|
|
98
|
+
* description: 'Create document',
|
|
99
|
+
* parameters: z.object({ title: z.string() }),
|
|
100
|
+
* handler: async ({ title }) => createDoc(title),
|
|
101
|
+
* },
|
|
102
|
+
* }, { userId: 'user-123' });
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
function createTools(configs, context = {}) {
|
|
106
|
+
const tools = {};
|
|
107
|
+
for (const [name, config] of Object.entries(configs)) tools[name] = createToolWithContext(config, context);
|
|
108
|
+
return tools;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
//#endregion
|
|
112
|
+
//#region src/tools/core/abort.ts
|
|
113
|
+
/**
|
|
114
|
+
* Error thrown when a tool execution is aborted.
|
|
115
|
+
*/
|
|
116
|
+
var ToolAbortError = class extends Error {
|
|
117
|
+
name = "ToolAbortError";
|
|
118
|
+
toolName;
|
|
119
|
+
constructor(toolName, message = "Tool execution aborted") {
|
|
120
|
+
super(message);
|
|
121
|
+
this.toolName = toolName;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Wraps a tool handler with abort signal support.
|
|
126
|
+
*
|
|
127
|
+
* @param handler - Original handler
|
|
128
|
+
* @param toolName - Tool name for error reporting
|
|
129
|
+
* @param options - Abort options
|
|
130
|
+
* @returns Abort-aware handler
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* const abortableSearch = withAbortHandling(
|
|
135
|
+
* async ({ query }, ctx) => searchDocs(query),
|
|
136
|
+
* 'search',
|
|
137
|
+
* { timeoutMs: 5000 }
|
|
138
|
+
* );
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
function withAbortHandling(handler, toolName, options = {}) {
|
|
142
|
+
return async (input, context) => {
|
|
143
|
+
const { timeoutMs, signal, throwOnAbort = true, fallbackValue } = options;
|
|
144
|
+
const signals = [];
|
|
145
|
+
if (context.abortSignal) signals.push(context.abortSignal);
|
|
146
|
+
if (signal) signals.push(signal);
|
|
147
|
+
let timeoutId;
|
|
148
|
+
if (timeoutMs) {
|
|
149
|
+
const controller = new AbortController();
|
|
150
|
+
timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
151
|
+
signals.push(controller.signal);
|
|
152
|
+
}
|
|
153
|
+
const combinedSignal = signals.length > 0 ? combineAbortSignals(signals) : void 0;
|
|
154
|
+
if (combinedSignal?.aborted) {
|
|
155
|
+
if (throwOnAbort) throw new ToolAbortError(toolName);
|
|
156
|
+
return fallbackValue;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
return await raceWithAbort(handler(input, {
|
|
160
|
+
...context,
|
|
161
|
+
abortSignal: combinedSignal
|
|
162
|
+
}), combinedSignal, toolName, throwOnAbort, fallbackValue);
|
|
163
|
+
} finally {
|
|
164
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Combines multiple abort signals into one.
|
|
170
|
+
*
|
|
171
|
+
* @param signals - Array of abort signals
|
|
172
|
+
* @returns Combined abort signal
|
|
173
|
+
*/
|
|
174
|
+
function combineAbortSignals(signals) {
|
|
175
|
+
const controller = new AbortController();
|
|
176
|
+
for (const signal of signals) {
|
|
177
|
+
if (signal.aborted) {
|
|
178
|
+
controller.abort(signal.reason);
|
|
179
|
+
return controller.signal;
|
|
180
|
+
}
|
|
181
|
+
signal.addEventListener("abort", () => {
|
|
182
|
+
controller.abort(signal.reason);
|
|
183
|
+
}, { once: true });
|
|
184
|
+
}
|
|
185
|
+
return controller.signal;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Races a promise against an abort signal.
|
|
189
|
+
*/
|
|
190
|
+
async function raceWithAbort(promise, signal, toolName, throwOnAbort, fallbackValue) {
|
|
191
|
+
if (!signal) return promise;
|
|
192
|
+
return new Promise((resolve, reject) => {
|
|
193
|
+
const abortHandler = () => {
|
|
194
|
+
if (throwOnAbort) reject(new ToolAbortError(toolName));
|
|
195
|
+
else resolve(fallbackValue);
|
|
196
|
+
};
|
|
197
|
+
if (signal.aborted) {
|
|
198
|
+
abortHandler();
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
signal.addEventListener("abort", abortHandler, { once: true });
|
|
202
|
+
(async () => {
|
|
203
|
+
try {
|
|
204
|
+
const result = await promise;
|
|
205
|
+
signal.removeEventListener("abort", abortHandler);
|
|
206
|
+
resolve(result);
|
|
207
|
+
} catch (error) {
|
|
208
|
+
signal.removeEventListener("abort", abortHandler);
|
|
209
|
+
reject(error);
|
|
210
|
+
}
|
|
211
|
+
})();
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Creates an abort controller that triggers after a timeout.
|
|
216
|
+
*
|
|
217
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
218
|
+
* @returns Abort controller
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```ts
|
|
222
|
+
* const controller = createTimeoutAbort(5000);
|
|
223
|
+
* await generateText({ ..., abortSignal: controller.signal });
|
|
224
|
+
* ```
|
|
225
|
+
*/
|
|
226
|
+
function createTimeoutAbort(timeoutMs) {
|
|
227
|
+
const controller = new AbortController();
|
|
228
|
+
setTimeout(() => controller.abort("Timeout"), timeoutMs);
|
|
229
|
+
return controller;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Checks if an error is an abort error.
|
|
233
|
+
*/
|
|
234
|
+
function isAbortError(error) {
|
|
235
|
+
if (error instanceof ToolAbortError) return true;
|
|
236
|
+
if (error instanceof DOMException && error.name === "AbortError") return true;
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
//#endregion
|
|
241
|
+
//#region src/tools/core/tool-safety.ts
|
|
242
|
+
/**
|
|
243
|
+
* @fileoverview Tool safety utilities — retry logic and fallback patterns.
|
|
244
|
+
* @module @od-oneapp/ai-platform/tools/core/tool-safety
|
|
245
|
+
*/
|
|
246
|
+
/**
|
|
247
|
+
* Execute a tool safely with basic retry logic.
|
|
248
|
+
* Simple wrapper that reduces error handling boilerplate across monorepo.
|
|
249
|
+
*
|
|
250
|
+
* @template T - Return type of the tool function
|
|
251
|
+
* @param toolFn - Async function to execute
|
|
252
|
+
* @param options - Retry and error handling options
|
|
253
|
+
* @returns Promise resolving to the tool function result
|
|
254
|
+
*
|
|
255
|
+
* @example
|
|
256
|
+
* ```typescript
|
|
257
|
+
* const response = await executeToolSafely(() => myTool.invoke(), {
|
|
258
|
+
* retries: 2,
|
|
259
|
+
* onRetry: (attempt) => console.info(`Retrying attempt ${attempt}`),
|
|
260
|
+
* });
|
|
261
|
+
* ```
|
|
262
|
+
*/
|
|
263
|
+
async function executeToolSafely(toolFn, options = {}) {
|
|
264
|
+
const { retries = 3, delay = 1e3, onRetry, onError, fallback } = options;
|
|
265
|
+
let lastError;
|
|
266
|
+
for (let attempt = 1; attempt <= retries; attempt++) try {
|
|
267
|
+
return await toolFn();
|
|
268
|
+
} catch (error) {
|
|
269
|
+
lastError = error;
|
|
270
|
+
if (attempt === retries) {
|
|
271
|
+
console.error("[Tools] Tool execution failed after all retries", {
|
|
272
|
+
attempts: retries,
|
|
273
|
+
error: error instanceof Error ? error.message : String(error)
|
|
274
|
+
});
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
if (onRetry) onRetry(attempt, error);
|
|
278
|
+
console.warn("[Tools] Tool execution failed, retrying", {
|
|
279
|
+
attempt,
|
|
280
|
+
retries,
|
|
281
|
+
error: error instanceof Error ? error.message : String(error)
|
|
282
|
+
});
|
|
283
|
+
if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));
|
|
284
|
+
}
|
|
285
|
+
if (fallback !== void 0) {
|
|
286
|
+
console.warn("[Tools] Returning fallback value after all retries failed");
|
|
287
|
+
if (onError) onError(lastError);
|
|
288
|
+
return fallback;
|
|
289
|
+
}
|
|
290
|
+
throw lastError;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Execute tool with fallback function.
|
|
294
|
+
* Simple DRY helper for common fallback pattern.
|
|
295
|
+
*
|
|
296
|
+
* @template T - Return type of the tool functions
|
|
297
|
+
* @param primaryFn - Primary async function to execute
|
|
298
|
+
* @param fallbackFn - Fallback async function to execute on failure
|
|
299
|
+
* @returns Promise resolving to the result of either primary or fallback
|
|
300
|
+
*
|
|
301
|
+
* @example
|
|
302
|
+
* ```typescript
|
|
303
|
+
* const primary = () => aiTool.invoke();
|
|
304
|
+
* const fallback = () => cachedResult();
|
|
305
|
+
* const result = await executeWithFallback(primary, fallback);
|
|
306
|
+
* ```
|
|
307
|
+
*/
|
|
308
|
+
async function executeWithFallback(primaryFn, fallbackFn) {
|
|
309
|
+
try {
|
|
310
|
+
return await primaryFn();
|
|
311
|
+
} catch (error) {
|
|
312
|
+
console.warn("[Tools] Primary execution failed, using fallback", { error: error instanceof Error ? error.message : String(error) });
|
|
313
|
+
return await fallbackFn();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
//#endregion
|
|
318
|
+
export { createTimeoutAbort as a, createToolFactory as c, wrapToolHandler as d, combineAbortSignals as i, createToolWithContext as l, executeWithFallback as n, isAbortError as o, ToolAbortError as r, withAbortHandling as s, executeToolSafely as t, createTools as u };
|
|
319
|
+
//# sourceMappingURL=tool-safety-DXtYDXod.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-safety-DXtYDXod.mjs","names":[],"sources":["../src/tools/core/factory.ts","../src/tools/core/abort.ts","../src/tools/core/tool-safety.ts"],"sourcesContent":["/**\n * @fileoverview Tool factory utilities with dependency injection pattern.\n * @module @od-oneapp/ai-platform/tools/core\n */\n\nimport { type z } from 'zod';\n\nimport { tool } from '../../shared';\n\nimport type { SDKTool as Tool } from '../../shared';\n\n/**\n * Tool execution context passed to tool handlers.\n */\nexport interface ToolExecutionContext {\n /** User ID making the request */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal;\n /** Additional context data */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Handler function signature for tool execution.\n */\nexport type ToolHandler<TInput, TOutput> = (\n input: TInput,\n context: ToolExecutionContext,\n) => Promise<TOutput>;\n\n/**\n * Configuration for creating a tool with dependency injection.\n */\nexport interface ToolFactoryConfig<TSchema extends z.ZodObject<z.ZodRawShape>> {\n /** Tool name */\n name: string;\n /** Tool description for the LLM */\n description: string;\n /** Zod schema for input parameters */\n parameters: TSchema;\n /** Handler function */\n handler: ToolHandler<z.infer<TSchema>, unknown>;\n}\n\n/**\n * Creates a tool with dependency-injected context.\n *\n * @param config - Tool configuration\n * @param context - Execution context to inject\n * @returns AI SDK tool\n *\n * @example\n * ```ts\n * const searchTool = createToolWithContext({\n * name: 'search',\n * description: 'Search documents',\n * parameters: z.object({ query: z.string() }),\n * handler: async ({ query }, ctx) => {\n * return searchDocs(query, ctx.userId);\n * },\n * }, { userId: 'user-123' });\n * ```\n */\nexport function createToolWithContext<TSchema extends z.ZodObject<z.ZodRawShape>>(\n config: ToolFactoryConfig<TSchema>,\n context: ToolExecutionContext,\n): Tool {\n return tool({\n description: config.description,\n inputSchema: config.parameters,\n execute: async input => {\n return config.handler(input as z.infer<TSchema>, context);\n },\n });\n}\n\n/**\n * Creates a tool factory that returns tools with injected context.\n *\n * @param config - Tool configuration without handler\n * @returns Factory function that accepts handler and context\n *\n * @example\n * ```ts\n * const createSearchTool = createToolFactory({\n * name: 'search',\n * description: 'Search documents',\n * parameters: z.object({ query: z.string() }),\n * });\n *\n * const searchTool = createSearchTool(\n * async ({ query }, ctx) => searchDocs(query, ctx.userId),\n * { userId: 'user-123' }\n * );\n * ```\n */\nexport function createToolFactory<TSchema extends z.ZodObject<z.ZodRawShape>>(config: {\n name: string;\n description: string;\n parameters: TSchema;\n}) {\n return function (\n handler: ToolHandler<z.infer<TSchema>, unknown>,\n context: ToolExecutionContext = {},\n ): Tool {\n return createToolWithContext({ ...config, handler }, context);\n };\n}\n\n/**\n * Wraps a tool handler with error handling and logging.\n *\n * @param handler - Original handler function\n * @param options - Wrapper options\n * @returns Wrapped handler\n */\nexport function wrapToolHandler<TInput, TOutput>(\n handler: ToolHandler<TInput, TOutput>,\n options: {\n /** Tool name for logging */\n name: string;\n /** Custom error handler */\n onError?: (error: Error, input: TInput) => TOutput | Promise<TOutput>;\n /** Pre-execution hook */\n onBefore?: (input: TInput, context: ToolExecutionContext) => void | Promise<void>;\n /** Post-execution hook */\n onAfter?: (\n input: TInput,\n output: TOutput,\n context: ToolExecutionContext,\n ) => void | Promise<void>;\n },\n): ToolHandler<TInput, TOutput> {\n return async (input, context) => {\n try {\n if (options.onBefore) {\n await options.onBefore(input, context);\n }\n\n const result = await handler(input, context);\n\n if (options.onAfter) {\n await options.onAfter(input, result, context);\n }\n\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Tool execution failed\n\n if (options.onError) {\n return options.onError(err, input);\n }\n\n throw err;\n }\n };\n}\n\n/**\n * Creates multiple tools from a configuration object.\n *\n * @param configs - Map of tool names to configurations\n * @param context - Shared execution context\n * @returns Record of tools\n *\n * @example\n * ```ts\n * const tools = createTools({\n * search: {\n * description: 'Search documents',\n * parameters: z.object({ query: z.string() }),\n * handler: async ({ query }) => searchDocs(query),\n * },\n * create: {\n * description: 'Create document',\n * parameters: z.object({ title: z.string() }),\n * handler: async ({ title }) => createDoc(title),\n * },\n * }, { userId: 'user-123' });\n * ```\n */\nexport function createTools(\n configs: Record<string, ToolFactoryConfig<z.ZodObject<z.ZodRawShape>>>,\n context: ToolExecutionContext = {},\n): Record<string, Tool> {\n const tools: Record<string, Tool> = {};\n\n for (const [name, config] of Object.entries(configs)) {\n tools[name] = createToolWithContext(config, context);\n }\n\n return tools;\n}\n","/**\n * @fileoverview Tool abort handling with AbortSignal support.\n * @module @od-oneapp/ai-platform/tools/core\n */\n\nimport type { ToolHandler, ToolExecutionContext } from './factory';\n\n/**\n * Error thrown when a tool execution is aborted.\n */\nexport class ToolAbortError extends Error {\n readonly name = 'ToolAbortError';\n readonly toolName: string;\n\n constructor(toolName: string, message = 'Tool execution aborted') {\n super(message);\n this.toolName = toolName;\n }\n}\n\n/**\n * Options for abort-aware tool execution.\n */\nexport interface AbortOptions {\n /** Timeout in milliseconds */\n timeoutMs?: number;\n /** Custom abort signal to combine with context signal */\n signal?: AbortSignal;\n /** Whether to throw on abort (default: true) */\n throwOnAbort?: boolean;\n /** Fallback value to return on abort (requires throwOnAbort: false) */\n fallbackValue?: unknown;\n}\n\n/**\n * Wraps a tool handler with abort signal support.\n *\n * @param handler - Original handler\n * @param toolName - Tool name for error reporting\n * @param options - Abort options\n * @returns Abort-aware handler\n *\n * @example\n * ```ts\n * const abortableSearch = withAbortHandling(\n * async ({ query }, ctx) => searchDocs(query),\n * 'search',\n * { timeoutMs: 5000 }\n * );\n * ```\n */\nexport function withAbortHandling<TInput, TOutput>(\n handler: ToolHandler<TInput, TOutput>,\n toolName: string,\n options: AbortOptions = {},\n): ToolHandler<TInput, TOutput> {\n return async (input, context) => {\n const { timeoutMs, signal, throwOnAbort = true, fallbackValue } = options;\n\n // Combine signals\n const signals: AbortSignal[] = [];\n if (context.abortSignal) signals.push(context.abortSignal);\n if (signal) signals.push(signal);\n\n // Create timeout signal if specified\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (timeoutMs) {\n const controller = new AbortController();\n timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n signals.push(controller.signal);\n }\n\n // Create combined signal\n const combinedSignal = signals.length > 0 ? combineAbortSignals(signals) : undefined;\n\n // Check if already aborted\n if (combinedSignal?.aborted) {\n if (throwOnAbort) {\n throw new ToolAbortError(toolName);\n }\n return fallbackValue as TOutput;\n }\n\n try {\n // Create context with combined signal\n const abortContext: ToolExecutionContext = {\n ...context,\n abortSignal: combinedSignal,\n };\n\n // Execute with abort race\n return await raceWithAbort(\n handler(input, abortContext),\n combinedSignal,\n toolName,\n throwOnAbort,\n fallbackValue as TOutput,\n );\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n };\n}\n\n/**\n * Combines multiple abort signals into one.\n *\n * @param signals - Array of abort signals\n * @returns Combined abort signal\n */\nexport function combineAbortSignals(signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n\n signal.addEventListener(\n 'abort',\n () => {\n controller.abort(signal.reason);\n },\n { once: true },\n );\n }\n\n return controller.signal;\n}\n\n/**\n * Races a promise against an abort signal.\n */\nasync function raceWithAbort<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n toolName: string,\n throwOnAbort: boolean,\n fallbackValue: T,\n): Promise<T> {\n if (!signal) {\n return promise;\n }\n\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n if (throwOnAbort) {\n reject(new ToolAbortError(toolName));\n } else {\n resolve(fallbackValue);\n }\n };\n\n if (signal.aborted) {\n abortHandler();\n return;\n }\n\n signal.addEventListener('abort', abortHandler, { once: true });\n\n void (async () => {\n try {\n const result = await promise;\n signal.removeEventListener('abort', abortHandler);\n resolve(result);\n } catch (error) {\n signal.removeEventListener('abort', abortHandler);\n reject(error);\n }\n })();\n });\n}\n\n/**\n * Creates an abort controller that triggers after a timeout.\n *\n * @param timeoutMs - Timeout in milliseconds\n * @returns Abort controller\n *\n * @example\n * ```ts\n * const controller = createTimeoutAbort(5000);\n * await generateText({ ..., abortSignal: controller.signal });\n * ```\n */\nexport function createTimeoutAbort(timeoutMs: number): AbortController {\n const controller = new AbortController();\n setTimeout(() => controller.abort('Timeout'), timeoutMs);\n return controller;\n}\n\n/**\n * Checks if an error is an abort error.\n */\nexport function isAbortError(error: unknown): error is ToolAbortError | DOMException {\n if (error instanceof ToolAbortError) return true;\n if (error instanceof DOMException && error.name === 'AbortError') return true;\n return false;\n}\n","/**\n * @fileoverview Tool safety utilities — retry logic and fallback patterns.\n * @module @od-oneapp/ai-platform/tools/core/tool-safety\n */\n\n/**\n * Execute a tool safely with basic retry logic.\n * Simple wrapper that reduces error handling boilerplate across monorepo.\n *\n * @template T - Return type of the tool function\n * @param toolFn - Async function to execute\n * @param options - Retry and error handling options\n * @returns Promise resolving to the tool function result\n *\n * @example\n * ```typescript\n * const response = await executeToolSafely(() => myTool.invoke(), {\n * retries: 2,\n * onRetry: (attempt) => console.info(`Retrying attempt ${attempt}`),\n * });\n * ```\n */\nexport async function executeToolSafely<T>(\n toolFn: () => Promise<T>,\n options: {\n retries?: number;\n delay?: number;\n onRetry?: (attempt: number, error: unknown) => void;\n onError?: (error: unknown) => void;\n fallback?: T;\n } = {},\n): Promise<T> {\n const { retries = 3, delay = 1000, onRetry, onError, fallback } = options;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n return await toolFn();\n } catch (error) {\n lastError = error;\n\n if (attempt === retries) {\n // eslint-disable-next-line no-console -- intentional tool execution error logging\n console.error('[Tools] Tool execution failed after all retries', {\n attempts: retries,\n error: error instanceof Error ? error.message : String(error),\n });\n break;\n }\n\n if (onRetry) {\n onRetry(attempt, error);\n }\n\n // eslint-disable-next-line no-console -- intentional tool retry logging\n console.warn('[Tools] Tool execution failed, retrying', {\n attempt,\n retries,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Simple delay before retry\n if (delay > 0) {\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n // Return fallback if provided, otherwise throw\n if (fallback !== undefined) {\n // eslint-disable-next-line no-console -- intentional fallback logging\n console.warn('[Tools] Returning fallback value after all retries failed');\n if (onError) {\n onError(lastError);\n }\n return fallback;\n }\n\n throw lastError;\n}\n\n/**\n * Execute tool with fallback function.\n * Simple DRY helper for common fallback pattern.\n *\n * @template T - Return type of the tool functions\n * @param primaryFn - Primary async function to execute\n * @param fallbackFn - Fallback async function to execute on failure\n * @returns Promise resolving to the result of either primary or fallback\n *\n * @example\n * ```typescript\n * const primary = () => aiTool.invoke();\n * const fallback = () => cachedResult();\n * const result = await executeWithFallback(primary, fallback);\n * ```\n */\nexport async function executeWithFallback<T>(\n primaryFn: () => Promise<T>,\n fallbackFn: () => Promise<T>,\n): Promise<T> {\n try {\n return await primaryFn();\n } catch (error) {\n // eslint-disable-next-line no-console -- intentional fallback logging\n console.warn('[Tools] Primary execution failed, using fallback', {\n error: error instanceof Error ? error.message : String(error),\n });\n return await fallbackFn();\n }\n}\n"],"mappings":"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"}
|