@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,1121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Guardrails and content filtering policies
|
|
3
|
+
*
|
|
4
|
+
* Provides multi-layer defense for AI agent inputs and outputs including:
|
|
5
|
+
* - Pattern blocking (SQL injection, destructive commands, privilege escalation)
|
|
6
|
+
* - PII sanitization (email, SSN, phone, credit card, addresses, etc.)
|
|
7
|
+
* - Stream monitoring (real-time output validation)
|
|
8
|
+
*
|
|
9
|
+
* @module @od-oneapp/ai-platform/policies/guardrails
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { randomUUID } from 'node:crypto';
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
complianceSignalSchema,
|
|
16
|
+
type ComplianceSignal,
|
|
17
|
+
type RiskLevel,
|
|
18
|
+
} from '../compliance/schemas';
|
|
19
|
+
|
|
20
|
+
import type { SDKLanguageModelV3 } from '../../shared';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Banned patterns for content filtering.
|
|
24
|
+
* Detects dangerous SQL commands, injection attempts, and privilege escalation.
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
const BANNED_PATTERNS: Array<{ pattern: RegExp; reason: string; risk: RiskLevel }> = [
|
|
28
|
+
// Destructive SQL commands
|
|
29
|
+
{
|
|
30
|
+
pattern: /drop\s+(table|database|schema|index)/gi,
|
|
31
|
+
reason: 'Destructive SQL command detected (DROP)',
|
|
32
|
+
risk: 'high',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
pattern: /truncate\s+table/gi,
|
|
36
|
+
reason: 'Destructive SQL command detected (TRUNCATE)',
|
|
37
|
+
risk: 'high',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
pattern: /delete\s+from\s+\w+\s+(where\s+1\s*=\s*1|without\s+where)/gi,
|
|
41
|
+
reason: 'Dangerous DELETE operation without proper WHERE clause',
|
|
42
|
+
risk: 'high',
|
|
43
|
+
},
|
|
44
|
+
// Sensitive data access
|
|
45
|
+
{
|
|
46
|
+
pattern: /select\s+\*\s+from\s+(users|passwords|credentials|secrets|tokens)/gi,
|
|
47
|
+
reason: 'Direct sensitive data extraction requires manual approval',
|
|
48
|
+
risk: 'high',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
pattern: /update\s+(users|accounts)\s+set\s+(role|permissions|is_admin)/gi,
|
|
52
|
+
reason: 'Privilege escalation attempt detected',
|
|
53
|
+
risk: 'high',
|
|
54
|
+
},
|
|
55
|
+
// SQL injection patterns
|
|
56
|
+
{
|
|
57
|
+
pattern: /;\s*(drop|delete|update|insert)/gi,
|
|
58
|
+
reason: 'Potential SQL injection with chained commands',
|
|
59
|
+
risk: 'high',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
pattern: /(union\s+select|union\s+all\s+select)/gi,
|
|
63
|
+
reason: 'Potential SQL injection with UNION',
|
|
64
|
+
risk: 'high',
|
|
65
|
+
},
|
|
66
|
+
// System commands
|
|
67
|
+
{
|
|
68
|
+
pattern: /(exec|execute)\s+(xp_|sp_)/gi,
|
|
69
|
+
reason: 'Potential system stored procedure execution',
|
|
70
|
+
risk: 'high',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
pattern: /into\s+outfile|load_file\(/gi,
|
|
74
|
+
reason: 'File system access attempt detected',
|
|
75
|
+
risk: 'high',
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Enterprise-grade PII pattern configuration.
|
|
81
|
+
* Uses context-aware detection to reduce false positives while maintaining security.
|
|
82
|
+
* @internal
|
|
83
|
+
*/
|
|
84
|
+
interface PiiPatternConfig {
|
|
85
|
+
/** Primary regex pattern for detection */
|
|
86
|
+
regex: RegExp;
|
|
87
|
+
/** Replacement placeholder text */
|
|
88
|
+
placeholder: string;
|
|
89
|
+
/** Signal type for compliance tracking */
|
|
90
|
+
type: ComplianceSignal['type'];
|
|
91
|
+
/** Optional context keywords - pattern only matches if text contains these keywords nearby */
|
|
92
|
+
contextKeywords?: string[];
|
|
93
|
+
/** Window size (chars) to look for context keywords (default: 50) */
|
|
94
|
+
contextWindow?: number;
|
|
95
|
+
/** Luhn checksum validation for card numbers */
|
|
96
|
+
luhnValidation?: boolean;
|
|
97
|
+
/** Custom validator function for additional validation */
|
|
98
|
+
validator?: (match: string, text: string) => boolean;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Validates credit card number using Luhn algorithm.
|
|
103
|
+
* @param num - Numeric string to validate
|
|
104
|
+
* @returns True if valid Luhn checksum
|
|
105
|
+
* @internal
|
|
106
|
+
*/
|
|
107
|
+
const isValidLuhn = (num: string): boolean => {
|
|
108
|
+
const digits = num.replace(/\D/g, '');
|
|
109
|
+
if (digits.length < 13 || digits.length > 19) return false;
|
|
110
|
+
|
|
111
|
+
let sum = 0;
|
|
112
|
+
let isEven = false;
|
|
113
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
114
|
+
let digit = parseInt(digits[i] ?? '0', 10);
|
|
115
|
+
if (isEven) {
|
|
116
|
+
digit *= 2;
|
|
117
|
+
if (digit > 9) digit -= 9;
|
|
118
|
+
}
|
|
119
|
+
sum += digit;
|
|
120
|
+
isEven = !isEven;
|
|
121
|
+
}
|
|
122
|
+
return sum % 10 === 0;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Checks if context keywords exist within a window around a match position.
|
|
127
|
+
* @param text - Full text to search
|
|
128
|
+
* @param matchStart - Start position of the match
|
|
129
|
+
* @param matchEnd - End position of the match
|
|
130
|
+
* @param keywords - Keywords to search for
|
|
131
|
+
* @param windowSize - Character window to search
|
|
132
|
+
* @returns True if any keyword is found within the window
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
const hasContextKeyword = (
|
|
136
|
+
text: string,
|
|
137
|
+
matchStart: number,
|
|
138
|
+
matchEnd: number,
|
|
139
|
+
keywords: string[],
|
|
140
|
+
windowSize: number,
|
|
141
|
+
): boolean => {
|
|
142
|
+
const windowStart = Math.max(0, matchStart - windowSize);
|
|
143
|
+
const windowEnd = Math.min(text.length, matchEnd + windowSize);
|
|
144
|
+
const contextText = text.slice(windowStart, windowEnd).toLowerCase();
|
|
145
|
+
return keywords.some(keyword => contextText.includes(keyword.toLowerCase()));
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Enterprise-grade PII patterns with context-aware detection.
|
|
150
|
+
* Reduces false positives by requiring context keywords for ambiguous patterns.
|
|
151
|
+
* @internal
|
|
152
|
+
*/
|
|
153
|
+
const PII_PATTERNS: PiiPatternConfig[] = [
|
|
154
|
+
// Email addresses - high confidence, no context needed
|
|
155
|
+
{
|
|
156
|
+
regex: /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi,
|
|
157
|
+
placeholder: '[redacted-email]',
|
|
158
|
+
type: 'guardrail.sanitized',
|
|
159
|
+
},
|
|
160
|
+
// US Social Security Numbers (SSN) - formatted SSNs are high confidence
|
|
161
|
+
{
|
|
162
|
+
regex: /\b\d{3}-\d{2}-\d{4}\b/g,
|
|
163
|
+
placeholder: '[redacted-ssn]',
|
|
164
|
+
type: 'guardrail.sanitized',
|
|
165
|
+
},
|
|
166
|
+
// SSN without dashes - requires context to avoid false positives
|
|
167
|
+
{
|
|
168
|
+
regex: /\b\d{9}\b/g,
|
|
169
|
+
placeholder: '[redacted-ssn]',
|
|
170
|
+
type: 'guardrail.sanitized',
|
|
171
|
+
contextKeywords: ['ssn', 'social security', 'social-security', 'tax id', 'taxpayer'],
|
|
172
|
+
contextWindow: 50,
|
|
173
|
+
},
|
|
174
|
+
// US Phone numbers (various formats)
|
|
175
|
+
{
|
|
176
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded pattern with limited quantifiers
|
|
177
|
+
regex: /\b(?:\+1[-.\s]?)?(?:\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}\b/g,
|
|
178
|
+
placeholder: '[redacted-phone]',
|
|
179
|
+
type: 'guardrail.sanitized',
|
|
180
|
+
contextKeywords: ['phone', 'call', 'tel', 'mobile', 'cell', 'contact', 'fax', 'number'],
|
|
181
|
+
contextWindow: 30,
|
|
182
|
+
},
|
|
183
|
+
// Credit card numbers with Luhn validation - high confidence
|
|
184
|
+
{
|
|
185
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded pattern for credit cards
|
|
186
|
+
regex: /\b(?:\d{4}[-\s]?){3}\d{4,7}\b/g,
|
|
187
|
+
placeholder: '[redacted-card]',
|
|
188
|
+
type: 'guardrail.sanitized',
|
|
189
|
+
luhnValidation: true,
|
|
190
|
+
},
|
|
191
|
+
// Credit card with context keywords (for non-Luhn passing numbers)
|
|
192
|
+
{
|
|
193
|
+
regex: /\b\d{13,19}\b/g,
|
|
194
|
+
placeholder: '[redacted-card]',
|
|
195
|
+
type: 'guardrail.sanitized',
|
|
196
|
+
contextKeywords: [
|
|
197
|
+
'card',
|
|
198
|
+
'credit',
|
|
199
|
+
'debit',
|
|
200
|
+
'visa',
|
|
201
|
+
'mastercard',
|
|
202
|
+
'amex',
|
|
203
|
+
'discover',
|
|
204
|
+
'payment',
|
|
205
|
+
],
|
|
206
|
+
contextWindow: 40,
|
|
207
|
+
luhnValidation: true,
|
|
208
|
+
},
|
|
209
|
+
// IPv4 addresses - no context needed (high specificity)
|
|
210
|
+
{
|
|
211
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded IPv4 pattern
|
|
212
|
+
regex: /\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\b/g,
|
|
213
|
+
placeholder: '[redacted-ip]',
|
|
214
|
+
type: 'guardrail.sanitized',
|
|
215
|
+
// Exclude common non-PII IPs (localhost, version numbers)
|
|
216
|
+
validator: (match: string) => {
|
|
217
|
+
const nonPiiPatterns = ['127.0.0.1', '0.0.0.0', '255.255.255.255'];
|
|
218
|
+
if (nonPiiPatterns.includes(match)) return false;
|
|
219
|
+
// Exclude version-like patterns (e.g., 1.2.3.4 where first octet is single digit)
|
|
220
|
+
const octets = match.split('.').map(Number);
|
|
221
|
+
// Valid IP octets are 0-255
|
|
222
|
+
return octets.every(o => o >= 0 && o <= 255);
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
// US Passport numbers - REQUIRES context (9-digit is too common)
|
|
226
|
+
{
|
|
227
|
+
regex: /\b[A-Z]?\d{8,9}\b/g,
|
|
228
|
+
placeholder: '[redacted-passport]',
|
|
229
|
+
type: 'guardrail.sanitized',
|
|
230
|
+
contextKeywords: ['passport', 'travel document', 'travel doc', 'passport number', 'passport#'],
|
|
231
|
+
contextWindow: 60,
|
|
232
|
+
},
|
|
233
|
+
// Date of birth patterns - requires context
|
|
234
|
+
{
|
|
235
|
+
regex: /\b(0?[1-9]|1[0-2])[\/\-](0?[1-9]|[12]\d|3[01])[\/\-](19|20)\d{2}\b/g,
|
|
236
|
+
placeholder: '[redacted-dob]',
|
|
237
|
+
type: 'guardrail.sanitized',
|
|
238
|
+
contextKeywords: [
|
|
239
|
+
'dob',
|
|
240
|
+
'birth',
|
|
241
|
+
'birthday',
|
|
242
|
+
'born',
|
|
243
|
+
'date of birth',
|
|
244
|
+
'birthdate',
|
|
245
|
+
'd.o.b',
|
|
246
|
+
'age',
|
|
247
|
+
],
|
|
248
|
+
contextWindow: 40,
|
|
249
|
+
},
|
|
250
|
+
// Street addresses (basic pattern for US addresses)
|
|
251
|
+
{
|
|
252
|
+
regex:
|
|
253
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded US address pattern
|
|
254
|
+
/\b\d+\s+[A-Za-z]+(?:\s+[A-Za-z]+)?\s+(?:Street|St|Avenue|Ave|Road|Rd|Drive|Dr|Lane|Ln|Court|Ct|Boulevard|Blvd|Way|Place|Pl|Circle|Cir)\.?\b/gi,
|
|
255
|
+
placeholder: '[redacted-address]',
|
|
256
|
+
type: 'guardrail.sanitized',
|
|
257
|
+
},
|
|
258
|
+
// ZIP codes (US 5 or 9 digit) - requires address context
|
|
259
|
+
{
|
|
260
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded pattern, optional group is safe
|
|
261
|
+
regex: /\b\d{5}(?:-\d{4})?\b/g,
|
|
262
|
+
placeholder: '[redacted-zip]',
|
|
263
|
+
type: 'guardrail.sanitized',
|
|
264
|
+
contextKeywords: ['zip', 'postal', 'address', 'city', 'state', 'mail', 'ship'],
|
|
265
|
+
contextWindow: 50,
|
|
266
|
+
},
|
|
267
|
+
// Bank account numbers - REQUIRES context (8-17 digits is too common)
|
|
268
|
+
{
|
|
269
|
+
regex: /\b\d{8,17}\b/g,
|
|
270
|
+
placeholder: '[redacted-account]',
|
|
271
|
+
type: 'guardrail.sanitized',
|
|
272
|
+
contextKeywords: [
|
|
273
|
+
'account',
|
|
274
|
+
'acct',
|
|
275
|
+
'routing',
|
|
276
|
+
'bank',
|
|
277
|
+
'iban',
|
|
278
|
+
'aba',
|
|
279
|
+
'swift',
|
|
280
|
+
'wire',
|
|
281
|
+
'deposit',
|
|
282
|
+
'checking',
|
|
283
|
+
'savings',
|
|
284
|
+
],
|
|
285
|
+
contextWindow: 50,
|
|
286
|
+
},
|
|
287
|
+
// Driver's license numbers - requires context
|
|
288
|
+
{
|
|
289
|
+
regex: /\b[A-Z]{1,2}\d{5,8}\b/g,
|
|
290
|
+
placeholder: '[redacted-license]',
|
|
291
|
+
type: 'guardrail.sanitized',
|
|
292
|
+
contextKeywords: ['license', 'licence', 'dl', "driver's", 'drivers', 'dmv', 'driving'],
|
|
293
|
+
contextWindow: 40,
|
|
294
|
+
},
|
|
295
|
+
// AWS Access Keys (high confidence pattern)
|
|
296
|
+
{
|
|
297
|
+
regex: /\b(?:AKIA|ABIA|ACCA|ASIA)[A-Z0-9]{16}\b/g,
|
|
298
|
+
placeholder: '[redacted-aws-key]',
|
|
299
|
+
type: 'guardrail.sanitized',
|
|
300
|
+
},
|
|
301
|
+
// Generic API keys/tokens (requires context)
|
|
302
|
+
{
|
|
303
|
+
regex: /\b[a-zA-Z0-9_-]{32,64}\b/g,
|
|
304
|
+
placeholder: '[redacted-token]',
|
|
305
|
+
type: 'guardrail.sanitized',
|
|
306
|
+
contextKeywords: [
|
|
307
|
+
'api_key',
|
|
308
|
+
'apikey',
|
|
309
|
+
'api-key',
|
|
310
|
+
'token',
|
|
311
|
+
'secret',
|
|
312
|
+
'password',
|
|
313
|
+
'bearer',
|
|
314
|
+
'authorization',
|
|
315
|
+
'auth',
|
|
316
|
+
],
|
|
317
|
+
contextWindow: 30,
|
|
318
|
+
},
|
|
319
|
+
];
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Redacts PII (Personally Identifiable Information) from text.
|
|
323
|
+
* Uses enterprise-grade context-aware detection to minimize false positives
|
|
324
|
+
* while maintaining strong security coverage.
|
|
325
|
+
*
|
|
326
|
+
* Features:
|
|
327
|
+
* - Context-aware detection for ambiguous patterns (e.g., 9-digit numbers)
|
|
328
|
+
* - Luhn validation for credit card numbers
|
|
329
|
+
* - Custom validators for IP address filtering
|
|
330
|
+
* - AWS key and API token detection
|
|
331
|
+
*
|
|
332
|
+
* @param text - Text to sanitize.
|
|
333
|
+
* @returns Object containing redacted text and compliance signals.
|
|
334
|
+
* @internal
|
|
335
|
+
* @example
|
|
336
|
+
* ```ts
|
|
337
|
+
* const { redacted } = redactPii('Contact me at jane@example.com');
|
|
338
|
+
* // redacted === 'Contact me at [redacted-email]'
|
|
339
|
+
*
|
|
340
|
+
* // Context-aware: only redacts when context keywords present
|
|
341
|
+
* const { redacted: r1 } = redactPii('My passport number is 123456789');
|
|
342
|
+
* // r1 === 'My passport number is [redacted-passport]'
|
|
343
|
+
*
|
|
344
|
+
* const { redacted: r2 } = redactPii('Order 123456789 shipped');
|
|
345
|
+
* // r2 === 'Order 123456789 shipped' (no redaction - no context)
|
|
346
|
+
* ```
|
|
347
|
+
*/
|
|
348
|
+
const redactPii = (text: string): { redacted: string; signals: ComplianceSignal[] } => {
|
|
349
|
+
let result = text;
|
|
350
|
+
const signals: ComplianceSignal[] = [];
|
|
351
|
+
const processedRanges: Array<{ start: number; end: number }> = [];
|
|
352
|
+
|
|
353
|
+
for (const pattern of PII_PATTERNS) {
|
|
354
|
+
pattern.regex.lastIndex = 0;
|
|
355
|
+
let match: RegExpExecArray | null;
|
|
356
|
+
const matches: Array<{ match: string; start: number; end: number }> = [];
|
|
357
|
+
|
|
358
|
+
// Collect all matches from current result (not original text)
|
|
359
|
+
// This ensures offsets stay aligned as we modify the string
|
|
360
|
+
while ((match = pattern.regex.exec(result)) !== null) {
|
|
361
|
+
const matchStart = match.index;
|
|
362
|
+
const matchEnd = match.index + match[0].length;
|
|
363
|
+
|
|
364
|
+
// Skip if this range was already processed by a higher-priority pattern
|
|
365
|
+
const alreadyProcessed = processedRanges.some(
|
|
366
|
+
range =>
|
|
367
|
+
(matchStart >= range.start && matchStart < range.end) ||
|
|
368
|
+
(matchEnd > range.start && matchEnd <= range.end),
|
|
369
|
+
);
|
|
370
|
+
if (alreadyProcessed) continue;
|
|
371
|
+
|
|
372
|
+
// Check context keywords if required (use result for context check too)
|
|
373
|
+
if (pattern.contextKeywords && pattern.contextKeywords.length > 0) {
|
|
374
|
+
const windowSize = pattern.contextWindow ?? 50;
|
|
375
|
+
if (!hasContextKeyword(result, matchStart, matchEnd, pattern.contextKeywords, windowSize)) {
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Apply Luhn validation if required
|
|
381
|
+
if (pattern.luhnValidation) {
|
|
382
|
+
if (!isValidLuhn(match[0])) continue;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Apply custom validator if provided (use result for validation context)
|
|
386
|
+
if (pattern.validator && !pattern.validator(match[0], result)) {
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
matches.push({ match: match[0], start: matchStart, end: matchEnd });
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Process matches in reverse order to preserve string positions
|
|
394
|
+
for (let i = matches.length - 1; i >= 0; i--) {
|
|
395
|
+
const item = matches[i];
|
|
396
|
+
if (!item) continue;
|
|
397
|
+
const { start, end } = item;
|
|
398
|
+
result = result.slice(0, start) + pattern.placeholder + result.slice(end);
|
|
399
|
+
processedRanges.push({ start, end });
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Add signal if any matches were processed
|
|
403
|
+
if (matches.length > 0) {
|
|
404
|
+
signals.push(
|
|
405
|
+
complianceSignalSchema.parse({
|
|
406
|
+
id: randomUUID(),
|
|
407
|
+
type: pattern.type,
|
|
408
|
+
message: `Automatically sanitized ${matches.length} sensitive value(s) (${pattern.placeholder})`,
|
|
409
|
+
runId: 'guardrail',
|
|
410
|
+
timestamp: new Date().toISOString(),
|
|
411
|
+
metadata: { count: matches.length, pattern: pattern.placeholder },
|
|
412
|
+
}),
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
return { redacted: result, signals };
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Result of guardrail inspection.
|
|
422
|
+
* Contains sanitization status, blocking decision, compliance signals, and risk level.
|
|
423
|
+
*/
|
|
424
|
+
export type GuardrailResult = {
|
|
425
|
+
/** Sanitized prompt (null if blocked). */
|
|
426
|
+
sanitizedPrompt: string | null;
|
|
427
|
+
/** Whether the prompt was blocked. */
|
|
428
|
+
blocked: boolean;
|
|
429
|
+
/** Compliance signals generated during inspection. */
|
|
430
|
+
signals: ComplianceSignal[];
|
|
431
|
+
/** Risk level detected. */
|
|
432
|
+
risk: RiskLevel;
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Inspects a prompt for banned patterns and PII.
|
|
437
|
+
* Checks against banned patterns first, then sanitizes PII if not blocked.
|
|
438
|
+
*
|
|
439
|
+
* @param prompt - Prompt text to inspect.
|
|
440
|
+
* @returns Guardrail result with sanitization status and signals.
|
|
441
|
+
* @internal
|
|
442
|
+
* @example
|
|
443
|
+
* ```ts
|
|
444
|
+
* const result = inspectPrompt('drop table users;');
|
|
445
|
+
* // result.blocked === true
|
|
446
|
+
* ```
|
|
447
|
+
*/
|
|
448
|
+
const inspectPrompt = (prompt: string): GuardrailResult => {
|
|
449
|
+
const signals: ComplianceSignal[] = [];
|
|
450
|
+
let blocked = false;
|
|
451
|
+
let risk: RiskLevel = 'low';
|
|
452
|
+
|
|
453
|
+
for (const { pattern, reason, risk: patternRisk } of BANNED_PATTERNS) {
|
|
454
|
+
pattern.lastIndex = 0;
|
|
455
|
+
if (pattern.test(prompt)) {
|
|
456
|
+
blocked = true;
|
|
457
|
+
risk = patternRisk;
|
|
458
|
+
signals.push(
|
|
459
|
+
complianceSignalSchema.parse({
|
|
460
|
+
id: randomUUID(),
|
|
461
|
+
type: 'guardrail.blocked',
|
|
462
|
+
message: reason,
|
|
463
|
+
runId: 'guardrail',
|
|
464
|
+
riskLevel: patternRisk,
|
|
465
|
+
timestamp: new Date().toISOString(),
|
|
466
|
+
}),
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
if (blocked) {
|
|
472
|
+
return { blocked, sanitizedPrompt: null, signals, risk };
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
const { redacted, signals: piiSignals } = redactPii(prompt);
|
|
476
|
+
signals.push(...piiSignals);
|
|
477
|
+
|
|
478
|
+
return { blocked, sanitizedPrompt: redacted, signals, risk };
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Type for objects that can have guardrail signals attached.
|
|
483
|
+
* @internal
|
|
484
|
+
*/
|
|
485
|
+
type GuardrailAttachable = { guardrailSignals?: ComplianceSignal[] };
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Attaches guardrail signals to a target object.
|
|
489
|
+
* Used to propagate compliance signals through the request/response chain.
|
|
490
|
+
*
|
|
491
|
+
* @param target - Target object to attach signals to.
|
|
492
|
+
* @param signals - Compliance signals to attach.
|
|
493
|
+
* @internal
|
|
494
|
+
* @example
|
|
495
|
+
* ```ts
|
|
496
|
+
* const payload: any = {};
|
|
497
|
+
* attachGuardrailSignals(payload, [complianceSignalSchema.parse({ id: '1', type: 'guardrail.blocked', message: 'Blocked', runId: 'guardrail', timestamp: new Date().toISOString(), riskLevel: 'high' })]);
|
|
498
|
+
* ```
|
|
499
|
+
*/
|
|
500
|
+
const attachGuardrailSignals = (target: unknown, signals: ComplianceSignal[]) => {
|
|
501
|
+
if (!signals.length || !target || typeof target !== 'object') {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const container = target as GuardrailAttachable;
|
|
506
|
+
const existing = Array.isArray(container.guardrailSignals) ? container.guardrailSignals : [];
|
|
507
|
+
container.guardrailSignals = [...existing, ...signals];
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
/**
|
|
511
|
+
* Creates a guardrail error with attached signals.
|
|
512
|
+
*
|
|
513
|
+
* @param signals - Compliance signals explaining why the request was blocked.
|
|
514
|
+
* @returns Error object with guardrail signals attached.
|
|
515
|
+
* @internal
|
|
516
|
+
* @example
|
|
517
|
+
* ```ts
|
|
518
|
+
* const error = createGuardrailError([
|
|
519
|
+
* // signals
|
|
520
|
+
* ]);
|
|
521
|
+
* ```
|
|
522
|
+
*/
|
|
523
|
+
const createGuardrailError = (signals: ComplianceSignal[]) => {
|
|
524
|
+
const error = new Error('Request blocked by guardrails');
|
|
525
|
+
attachGuardrailSignals(error, signals);
|
|
526
|
+
return error;
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Request type that may contain prompt or messages to sanitize.
|
|
531
|
+
* @internal
|
|
532
|
+
*/
|
|
533
|
+
type GuardrailRequest = { prompt?: unknown; messages?: unknown } & Record<string, unknown>;
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Sanitizes a request by inspecting prompts/messages for banned patterns and PII.
|
|
537
|
+
* Handles both string prompts and message arrays with various content formats.
|
|
538
|
+
*
|
|
539
|
+
* @param request - Request object to sanitize.
|
|
540
|
+
* @returns Object containing sanitized request and aggregated signals.
|
|
541
|
+
* @throws {Error} If request contains banned patterns (with guardrail signals attached).
|
|
542
|
+
* @internal
|
|
543
|
+
* @example
|
|
544
|
+
* ```ts
|
|
545
|
+
* const outcome = sanitizeRequest({ prompt: 'My email is john@example.com' });
|
|
546
|
+
* // outcome.sanitizedRequest.prompt contains '[redacted-email]'
|
|
547
|
+
* ```
|
|
548
|
+
*/
|
|
549
|
+
const sanitizeRequest = <T extends GuardrailRequest>(request: T) => {
|
|
550
|
+
let sanitizedRequest = request;
|
|
551
|
+
let mutated = false;
|
|
552
|
+
const aggregatedSignals: ComplianceSignal[] = [];
|
|
553
|
+
|
|
554
|
+
if (typeof request.prompt === 'string') {
|
|
555
|
+
const outcome = inspectPrompt(request.prompt);
|
|
556
|
+
if (outcome.blocked) {
|
|
557
|
+
throw createGuardrailError(outcome.signals);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
const sanitizedPrompt = outcome.sanitizedPrompt ?? '';
|
|
561
|
+
if (sanitizedPrompt !== request.prompt) {
|
|
562
|
+
sanitizedRequest = { ...sanitizedRequest, prompt: sanitizedPrompt } as T;
|
|
563
|
+
mutated = true;
|
|
564
|
+
}
|
|
565
|
+
aggregatedSignals.push(...outcome.signals);
|
|
566
|
+
} else if (Array.isArray(request.prompt)) {
|
|
567
|
+
// Handle array prompt format: [{ role: 'user', content: [{ type: 'text', text: '...' }] }]
|
|
568
|
+
let promptChanged = false;
|
|
569
|
+
const updatedPrompt = request.prompt.map(message => {
|
|
570
|
+
if (
|
|
571
|
+
message &&
|
|
572
|
+
typeof message === 'object' &&
|
|
573
|
+
(message as { role?: unknown }).role === 'user'
|
|
574
|
+
) {
|
|
575
|
+
const { content } = message as { content?: unknown };
|
|
576
|
+
if (Array.isArray(content)) {
|
|
577
|
+
const updatedContent = content.map(part => {
|
|
578
|
+
if (
|
|
579
|
+
part &&
|
|
580
|
+
typeof part === 'object' &&
|
|
581
|
+
(part as { type?: unknown }).type === 'text' &&
|
|
582
|
+
typeof (part as { text?: unknown }).text === 'string'
|
|
583
|
+
) {
|
|
584
|
+
const { text } = part as { text: string };
|
|
585
|
+
const outcome = inspectPrompt(text);
|
|
586
|
+
if (outcome.blocked) {
|
|
587
|
+
throw createGuardrailError(outcome.signals);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
const sanitizedText = outcome.sanitizedPrompt ?? '';
|
|
591
|
+
aggregatedSignals.push(...outcome.signals);
|
|
592
|
+
if (sanitizedText !== text) {
|
|
593
|
+
return { ...part, text: sanitizedText };
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
return part;
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
// Check if content actually changed by comparing arrays
|
|
600
|
+
const hasChanges = updatedContent.some((part, index) => {
|
|
601
|
+
const original = content[index];
|
|
602
|
+
return (
|
|
603
|
+
part &&
|
|
604
|
+
typeof part === 'object' &&
|
|
605
|
+
original &&
|
|
606
|
+
typeof original === 'object' &&
|
|
607
|
+
(part as { text?: unknown }).text !== (original as { text?: unknown }).text
|
|
608
|
+
);
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
if (hasChanges) {
|
|
612
|
+
promptChanged = true;
|
|
613
|
+
return { ...message, content: updatedContent };
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return message;
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
if (promptChanged) {
|
|
621
|
+
sanitizedRequest = { ...sanitizedRequest, prompt: updatedPrompt } as T;
|
|
622
|
+
mutated = true;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
if (Array.isArray(request.messages)) {
|
|
627
|
+
const { messages } = request;
|
|
628
|
+
const updatedMessages = messages.map(message => {
|
|
629
|
+
if (
|
|
630
|
+
message &&
|
|
631
|
+
typeof message === 'object' &&
|
|
632
|
+
(message as { role?: unknown }).role === 'user'
|
|
633
|
+
) {
|
|
634
|
+
const { content } = message as { content?: unknown };
|
|
635
|
+
if (typeof content === 'string') {
|
|
636
|
+
const outcome = inspectPrompt(content);
|
|
637
|
+
if (outcome.blocked) {
|
|
638
|
+
throw createGuardrailError(outcome.signals);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
const sanitizedContent = outcome.sanitizedPrompt ?? '';
|
|
642
|
+
aggregatedSignals.push(...outcome.signals);
|
|
643
|
+
if (sanitizedContent !== content) {
|
|
644
|
+
return { ...message, content: sanitizedContent };
|
|
645
|
+
}
|
|
646
|
+
} else if (Array.isArray(content)) {
|
|
647
|
+
// Handle array content format: [{ type: 'text', text: '...' }]
|
|
648
|
+
const updatedContent = content.map(part => {
|
|
649
|
+
if (
|
|
650
|
+
part &&
|
|
651
|
+
typeof part === 'object' &&
|
|
652
|
+
(part as { type?: unknown }).type === 'text' &&
|
|
653
|
+
typeof (part as { text?: unknown }).text === 'string'
|
|
654
|
+
) {
|
|
655
|
+
const { text } = part as { text: string };
|
|
656
|
+
const outcome = inspectPrompt(text);
|
|
657
|
+
if (outcome.blocked) {
|
|
658
|
+
throw createGuardrailError(outcome.signals);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
const sanitizedText = outcome.sanitizedPrompt ?? '';
|
|
662
|
+
aggregatedSignals.push(...outcome.signals);
|
|
663
|
+
if (sanitizedText !== text) {
|
|
664
|
+
return { ...part, text: sanitizedText };
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
return part;
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
// Check if content actually changed by comparing arrays
|
|
671
|
+
const hasChanges = updatedContent.some((part, index) => {
|
|
672
|
+
const original = content[index];
|
|
673
|
+
return (
|
|
674
|
+
part &&
|
|
675
|
+
typeof part === 'object' &&
|
|
676
|
+
original &&
|
|
677
|
+
typeof original === 'object' &&
|
|
678
|
+
(part as { text?: unknown }).text !== (original as { text?: unknown }).text
|
|
679
|
+
);
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
if (hasChanges) {
|
|
683
|
+
return { ...message, content: updatedContent };
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
return message;
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
const changed = updatedMessages.some((msg, idx) => msg !== messages[idx]);
|
|
692
|
+
if (changed) {
|
|
693
|
+
sanitizedRequest = { ...sanitizedRequest, messages: updatedMessages } as T;
|
|
694
|
+
mutated = true;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
return {
|
|
699
|
+
sanitizedRequest: mutated ? sanitizedRequest : request,
|
|
700
|
+
signals: aggregatedSignals,
|
|
701
|
+
};
|
|
702
|
+
};
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* Sanitizes a single stream part for PII.
|
|
706
|
+
* Processes text-delta, reasoning-delta, tool-input-delta, and text parts.
|
|
707
|
+
*
|
|
708
|
+
* @param part - Stream part to sanitize.
|
|
709
|
+
* @returns Sanitized stream part.
|
|
710
|
+
* @internal
|
|
711
|
+
* @example
|
|
712
|
+
* ```ts
|
|
713
|
+
* const part = sanitizeStreamPart({ type: 'text-delta', delta: 'pii@example.com' });
|
|
714
|
+
* ```
|
|
715
|
+
*/
|
|
716
|
+
const sanitizeStreamPart = (part: unknown): unknown => {
|
|
717
|
+
if (!part || typeof part !== 'object') {
|
|
718
|
+
return part;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
const chunk = part as { type?: string; delta?: unknown; text?: unknown };
|
|
722
|
+
|
|
723
|
+
if (chunk.type === 'text-delta' && typeof chunk.delta === 'string') {
|
|
724
|
+
return { ...chunk, delta: redactPii(chunk.delta).redacted };
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
if (chunk.type === 'reasoning-delta' && typeof chunk.delta === 'string') {
|
|
728
|
+
return { ...chunk, delta: redactPii(chunk.delta).redacted };
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
if (chunk.type === 'tool-input-delta' && typeof chunk.delta === 'string') {
|
|
732
|
+
return { ...chunk, delta: redactPii(chunk.delta).redacted };
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
if (typeof chunk.text === 'string') {
|
|
736
|
+
return { ...chunk, text: redactPii(chunk.text).redacted };
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
return part;
|
|
740
|
+
};
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* Applies default guardrails to a language model.
|
|
744
|
+
* Wraps the model's doGenerate and doStream methods to add content filtering,
|
|
745
|
+
* PII redaction, and compliance signal generation.
|
|
746
|
+
*
|
|
747
|
+
* @param model - Language model to wrap with guardrails.
|
|
748
|
+
* @returns Wrapped model with guardrails applied.
|
|
749
|
+
* @throws {Error} If request contains banned patterns (with guardrail signals attached).
|
|
750
|
+
* @remarks Guardrails are applied to both input (prompt/messages) and output (content).
|
|
751
|
+
* Compliance signals are attached to responses and errors for audit purposes.
|
|
752
|
+
* Stream parts are sanitized in real-time for PII redaction.
|
|
753
|
+
* @example
|
|
754
|
+
* ```ts
|
|
755
|
+
* const guardedModel = applyDefaultGuardrails(anthropic('claude-sonnet-4'));
|
|
756
|
+
* const result = await guardedModel.doGenerate({ prompt: 'User input' });
|
|
757
|
+
* ```
|
|
758
|
+
*/
|
|
759
|
+
export const applyDefaultGuardrails = (model: SDKLanguageModelV3): SDKLanguageModelV3 =>
|
|
760
|
+
({
|
|
761
|
+
...model,
|
|
762
|
+
async doGenerate(request: Parameters<SDKLanguageModelV3['doGenerate']>[0]) {
|
|
763
|
+
const { sanitizedRequest, signals: requestSignals } = sanitizeRequest(request);
|
|
764
|
+
|
|
765
|
+
try {
|
|
766
|
+
const response = await model.doGenerate(sanitizedRequest);
|
|
767
|
+
|
|
768
|
+
const responseSignals: ComplianceSignal[] = [];
|
|
769
|
+
|
|
770
|
+
const processedContent = response.content.map(part => {
|
|
771
|
+
if (part.type === 'text' && typeof part.text === 'string') {
|
|
772
|
+
const { redacted, signals } = redactPii(part.text);
|
|
773
|
+
responseSignals.push(...signals);
|
|
774
|
+
return { ...part, text: redacted };
|
|
775
|
+
}
|
|
776
|
+
return part;
|
|
777
|
+
});
|
|
778
|
+
|
|
779
|
+
const combinedSignals = [...requestSignals, ...responseSignals];
|
|
780
|
+
|
|
781
|
+
const sanitizedResponse = {
|
|
782
|
+
...response,
|
|
783
|
+
content: processedContent,
|
|
784
|
+
};
|
|
785
|
+
attachGuardrailSignals(sanitizedResponse, combinedSignals);
|
|
786
|
+
return sanitizedResponse;
|
|
787
|
+
} catch (error) {
|
|
788
|
+
attachGuardrailSignals(error, requestSignals);
|
|
789
|
+
throw error;
|
|
790
|
+
}
|
|
791
|
+
},
|
|
792
|
+
async doStream(request: Parameters<SDKLanguageModelV3['doStream']>[0]) {
|
|
793
|
+
const { sanitizedRequest, signals: requestSignals } = sanitizeRequest(request);
|
|
794
|
+
const result = await model.doStream(sanitizedRequest);
|
|
795
|
+
|
|
796
|
+
const reader = result.stream.getReader();
|
|
797
|
+
const sanitizedStream = new ReadableStream({
|
|
798
|
+
async pull(controller) {
|
|
799
|
+
const { done, value } = await reader.read();
|
|
800
|
+
if (done) {
|
|
801
|
+
controller.close();
|
|
802
|
+
return;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
controller.enqueue(sanitizeStreamPart(value));
|
|
806
|
+
},
|
|
807
|
+
cancel(reason) {
|
|
808
|
+
return reader.cancel(reason);
|
|
809
|
+
},
|
|
810
|
+
});
|
|
811
|
+
|
|
812
|
+
const sanitizedResult = { ...result, stream: sanitizedStream };
|
|
813
|
+
attachGuardrailSignals(sanitizedResult, requestSignals);
|
|
814
|
+
return sanitizedResult;
|
|
815
|
+
},
|
|
816
|
+
}) satisfies SDKLanguageModelV3;
|
|
817
|
+
|
|
818
|
+
/**
|
|
819
|
+
* Prompt injection detection patterns.
|
|
820
|
+
* Detects common prompt injection, jailbreak, and manipulation attempts.
|
|
821
|
+
* @internal
|
|
822
|
+
*/
|
|
823
|
+
const PROMPT_INJECTION_PATTERNS: Array<{
|
|
824
|
+
pattern: RegExp;
|
|
825
|
+
category: 'jailbreak' | 'instruction_override' | 'role_play' | 'encoding_bypass' | 'data_exfil';
|
|
826
|
+
severity: RiskLevel;
|
|
827
|
+
description: string;
|
|
828
|
+
}> = [
|
|
829
|
+
// Jailbreak attempts
|
|
830
|
+
{
|
|
831
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded jailbreak pattern
|
|
832
|
+
pattern: /ignore\s+(all\s+)?(previous|prior|above)\s+(instructions?|prompts?|rules?)/gi,
|
|
833
|
+
category: 'jailbreak',
|
|
834
|
+
severity: 'high',
|
|
835
|
+
description: 'Instruction override attempt detected',
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded jailbreak pattern
|
|
839
|
+
pattern: /disregard\s+(all\s+)?(previous|prior|your)\s+(instructions?|guidelines?|rules?)/gi,
|
|
840
|
+
category: 'jailbreak',
|
|
841
|
+
severity: 'high',
|
|
842
|
+
description: 'Instruction override attempt detected',
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded jailbreak pattern
|
|
846
|
+
pattern: /forget\s+(everything|all|what)\s+(you\s+)?(know|learned|were told)/gi,
|
|
847
|
+
category: 'jailbreak',
|
|
848
|
+
severity: 'high',
|
|
849
|
+
description: 'Memory reset attempt detected',
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded jailbreak pattern
|
|
853
|
+
pattern: /pretend\s+(you\s+)?(are|have)\s+no\s+(restrictions?|limitations?|rules?)/gi,
|
|
854
|
+
category: 'jailbreak',
|
|
855
|
+
severity: 'high',
|
|
856
|
+
description: 'Restriction bypass attempt detected',
|
|
857
|
+
},
|
|
858
|
+
// Instruction override
|
|
859
|
+
{
|
|
860
|
+
pattern: /new\s+instructions?:?\s*$/gim,
|
|
861
|
+
category: 'instruction_override',
|
|
862
|
+
severity: 'high',
|
|
863
|
+
description: 'New instruction injection attempt',
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
pattern: /system\s*:\s*you\s+are/gi,
|
|
867
|
+
category: 'instruction_override',
|
|
868
|
+
severity: 'high',
|
|
869
|
+
description: 'System prompt injection attempt',
|
|
870
|
+
},
|
|
871
|
+
{
|
|
872
|
+
pattern: /\[system\]|\[INST\]|\[\/INST\]|<<SYS>>|<\|im_start\|>/gi,
|
|
873
|
+
category: 'instruction_override',
|
|
874
|
+
severity: 'high',
|
|
875
|
+
description: 'Chat template injection attempt',
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
pattern: /###\s*(instruction|system|human|assistant)\s*:/gi,
|
|
879
|
+
category: 'instruction_override',
|
|
880
|
+
severity: 'medium',
|
|
881
|
+
description: 'Markdown instruction injection attempt',
|
|
882
|
+
},
|
|
883
|
+
// Role play exploits
|
|
884
|
+
{
|
|
885
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded role-play pattern
|
|
886
|
+
pattern: /you\s+are\s+(now\s+)?(DAN|jailbroken|unrestricted|evil|uncensored)/gi,
|
|
887
|
+
category: 'role_play',
|
|
888
|
+
severity: 'high',
|
|
889
|
+
description: 'Malicious role-play attempt (DAN/jailbreak)',
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
pattern:
|
|
893
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded ethics bypass pattern
|
|
894
|
+
/act\s+as\s+(if\s+)?(you\s+)?(have|had|don't have)\s+no\s+(ethics|morals|guidelines)/gi,
|
|
895
|
+
category: 'role_play',
|
|
896
|
+
severity: 'high',
|
|
897
|
+
description: 'Ethics bypass role-play attempt',
|
|
898
|
+
},
|
|
899
|
+
{
|
|
900
|
+
pattern: /developer\s+mode|sudo\s+mode|god\s+mode|admin\s+mode/gi,
|
|
901
|
+
category: 'role_play',
|
|
902
|
+
severity: 'high',
|
|
903
|
+
description: 'Privilege escalation role-play attempt',
|
|
904
|
+
},
|
|
905
|
+
// Encoding bypass attempts
|
|
906
|
+
{
|
|
907
|
+
pattern: /base64\s*:\s*[A-Za-z0-9+\/=]{20,}/gi,
|
|
908
|
+
category: 'encoding_bypass',
|
|
909
|
+
severity: 'medium',
|
|
910
|
+
description: 'Base64 encoded payload detected',
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded unicode escape pattern
|
|
914
|
+
pattern: /\\u[0-9a-fA-F]{4}(?:\\u[0-9a-fA-F]{4}){5,}/g,
|
|
915
|
+
category: 'encoding_bypass',
|
|
916
|
+
severity: 'medium',
|
|
917
|
+
description: 'Unicode escape sequence payload detected',
|
|
918
|
+
},
|
|
919
|
+
{
|
|
920
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded HTML entity pattern
|
|
921
|
+
pattern: /&#x?[0-9a-fA-F]+;(?:&#x?[0-9a-fA-F]+;){5,}/g,
|
|
922
|
+
category: 'encoding_bypass',
|
|
923
|
+
severity: 'medium',
|
|
924
|
+
description: 'HTML entity encoded payload detected',
|
|
925
|
+
},
|
|
926
|
+
// Data exfiltration attempts
|
|
927
|
+
{
|
|
928
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded prompt extraction pattern
|
|
929
|
+
pattern: /repeat\s+(the\s+)?(system\s+)?prompt|show\s+(me\s+)?(the\s+)?(system\s+)?prompt/gi,
|
|
930
|
+
category: 'data_exfil',
|
|
931
|
+
severity: 'medium',
|
|
932
|
+
description: 'System prompt extraction attempt',
|
|
933
|
+
},
|
|
934
|
+
{
|
|
935
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded instruction extraction pattern
|
|
936
|
+
pattern: /what\s+(are\s+)?(your|the)\s+(original\s+)?instructions/gi,
|
|
937
|
+
category: 'data_exfil',
|
|
938
|
+
severity: 'medium',
|
|
939
|
+
description: 'Instruction extraction attempt',
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
// eslint-disable-next-line security/detect-unsafe-regex -- Safe: bounded context extraction pattern
|
|
943
|
+
pattern: /output\s+(your|the)\s+(entire\s+)?context/gi,
|
|
944
|
+
category: 'data_exfil',
|
|
945
|
+
severity: 'medium',
|
|
946
|
+
description: 'Context extraction attempt',
|
|
947
|
+
},
|
|
948
|
+
];
|
|
949
|
+
|
|
950
|
+
/**
|
|
951
|
+
* Result of prompt injection detection.
|
|
952
|
+
*/
|
|
953
|
+
export interface PromptInjectionResult {
|
|
954
|
+
/** Whether injection was detected */
|
|
955
|
+
detected: boolean;
|
|
956
|
+
/** Risk level if detected */
|
|
957
|
+
risk: RiskLevel;
|
|
958
|
+
/** Categories of injection detected */
|
|
959
|
+
categories: Array<
|
|
960
|
+
'jailbreak' | 'instruction_override' | 'role_play' | 'encoding_bypass' | 'data_exfil'
|
|
961
|
+
>;
|
|
962
|
+
/** Human-readable descriptions of detected patterns */
|
|
963
|
+
descriptions: string[];
|
|
964
|
+
/** Compliance signals for audit trail */
|
|
965
|
+
signals: ComplianceSignal[];
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
* Detects prompt injection attempts in text.
|
|
970
|
+
* Uses pattern matching to identify common injection, jailbreak, and manipulation techniques.
|
|
971
|
+
*
|
|
972
|
+
* @param text - Text to analyze for injection attempts.
|
|
973
|
+
* @returns Detection result with risk level and categorization.
|
|
974
|
+
* @example
|
|
975
|
+
* ```ts
|
|
976
|
+
* const result = detectPromptInjection('Ignore all previous instructions and...');
|
|
977
|
+
* // result.detected === true
|
|
978
|
+
* // result.risk === 'high'
|
|
979
|
+
* // result.categories === ['jailbreak']
|
|
980
|
+
* ```
|
|
981
|
+
*/
|
|
982
|
+
export const detectPromptInjection = (text: string): PromptInjectionResult => {
|
|
983
|
+
const detectedCategories = new Set<PromptInjectionResult['categories'][number]>();
|
|
984
|
+
const descriptions: string[] = [];
|
|
985
|
+
const signals: ComplianceSignal[] = [];
|
|
986
|
+
let maxRisk: RiskLevel = 'low';
|
|
987
|
+
|
|
988
|
+
for (const { pattern, category, severity, description } of PROMPT_INJECTION_PATTERNS) {
|
|
989
|
+
pattern.lastIndex = 0;
|
|
990
|
+
if (pattern.test(text)) {
|
|
991
|
+
detectedCategories.add(category);
|
|
992
|
+
descriptions.push(description);
|
|
993
|
+
|
|
994
|
+
// Update max risk
|
|
995
|
+
if (severity === 'high' || (severity === 'medium' && maxRisk === 'low')) {
|
|
996
|
+
maxRisk = severity;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
signals.push(
|
|
1000
|
+
complianceSignalSchema.parse({
|
|
1001
|
+
id: randomUUID(),
|
|
1002
|
+
type: 'guardrail.blocked',
|
|
1003
|
+
message: `Prompt injection detected: ${description}`,
|
|
1004
|
+
runId: 'guardrail',
|
|
1005
|
+
riskLevel: severity,
|
|
1006
|
+
timestamp: new Date().toISOString(),
|
|
1007
|
+
metadata: { category, pattern: pattern.source },
|
|
1008
|
+
}),
|
|
1009
|
+
);
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
return {
|
|
1014
|
+
detected: detectedCategories.size > 0,
|
|
1015
|
+
risk: maxRisk,
|
|
1016
|
+
categories: Array.from(detectedCategories),
|
|
1017
|
+
descriptions,
|
|
1018
|
+
signals,
|
|
1019
|
+
};
|
|
1020
|
+
};
|
|
1021
|
+
|
|
1022
|
+
/**
|
|
1023
|
+
* Token limit configuration per risk level.
|
|
1024
|
+
* Restricts output length based on detected risk to limit potential damage.
|
|
1025
|
+
*/
|
|
1026
|
+
export const TOKEN_LIMITS: Record<RiskLevel, number> = {
|
|
1027
|
+
low: 16384,
|
|
1028
|
+
medium: 8192,
|
|
1029
|
+
high: 2048,
|
|
1030
|
+
};
|
|
1031
|
+
|
|
1032
|
+
/**
|
|
1033
|
+
* Gets the appropriate token limit for a risk level.
|
|
1034
|
+
*
|
|
1035
|
+
* @param risk - Risk level to get limit for.
|
|
1036
|
+
* @returns Maximum output tokens allowed.
|
|
1037
|
+
* @example
|
|
1038
|
+
* ```ts
|
|
1039
|
+
* const limit = getTokenLimitForRisk('high');
|
|
1040
|
+
* // limit === 2048
|
|
1041
|
+
* ```
|
|
1042
|
+
*/
|
|
1043
|
+
export const getTokenLimitForRisk = (risk: RiskLevel): number => TOKEN_LIMITS[risk];
|
|
1044
|
+
|
|
1045
|
+
/**
|
|
1046
|
+
* Detects risk level from message content.
|
|
1047
|
+
* Analyzes user messages for high-risk keywords, patterns, and prompt injection attempts.
|
|
1048
|
+
* Enterprise-grade detection with multiple risk factors.
|
|
1049
|
+
*
|
|
1050
|
+
* @param messages - Array of messages to analyze.
|
|
1051
|
+
* @returns Detected risk level ('low', 'medium', or 'high').
|
|
1052
|
+
* @example
|
|
1053
|
+
* ```ts
|
|
1054
|
+
* const risk = detectRiskFromMessages([
|
|
1055
|
+
* { role: 'user', content: 'Delete my account' }
|
|
1056
|
+
* ]); // Returns 'high'
|
|
1057
|
+
* ```
|
|
1058
|
+
*/
|
|
1059
|
+
export const detectRiskFromMessages = (
|
|
1060
|
+
messages: Array<{ role: string; content?: string }>,
|
|
1061
|
+
): RiskLevel => {
|
|
1062
|
+
const joined = messages
|
|
1063
|
+
.filter(message => message.role === 'user')
|
|
1064
|
+
.map(message => message.content ?? '')
|
|
1065
|
+
.join('\n');
|
|
1066
|
+
|
|
1067
|
+
const joinedLower = joined.toLowerCase();
|
|
1068
|
+
|
|
1069
|
+
// Check for prompt injection first (highest priority)
|
|
1070
|
+
const injectionResult = detectPromptInjection(joined);
|
|
1071
|
+
if (injectionResult.detected && injectionResult.risk === 'high') {
|
|
1072
|
+
return 'high';
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
// High risk keywords and patterns
|
|
1076
|
+
const highRiskPatterns = [
|
|
1077
|
+
'delete account',
|
|
1078
|
+
'drop table',
|
|
1079
|
+
'rm -rf',
|
|
1080
|
+
'format disk',
|
|
1081
|
+
'delete all',
|
|
1082
|
+
'wipe data',
|
|
1083
|
+
'export all data',
|
|
1084
|
+
'bypass security',
|
|
1085
|
+
'admin access',
|
|
1086
|
+
'root access',
|
|
1087
|
+
'privilege escalation',
|
|
1088
|
+
];
|
|
1089
|
+
|
|
1090
|
+
for (const pattern of highRiskPatterns) {
|
|
1091
|
+
if (joinedLower.includes(pattern)) {
|
|
1092
|
+
return 'high';
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
// Medium risk from injection detection
|
|
1097
|
+
if (injectionResult.detected) {
|
|
1098
|
+
return 'medium';
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
// Medium risk keywords
|
|
1102
|
+
const mediumRiskPatterns = [
|
|
1103
|
+
'ssn',
|
|
1104
|
+
'pii',
|
|
1105
|
+
'password',
|
|
1106
|
+
'credit card',
|
|
1107
|
+
'social security',
|
|
1108
|
+
'api key',
|
|
1109
|
+
'secret key',
|
|
1110
|
+
'private key',
|
|
1111
|
+
'access token',
|
|
1112
|
+
];
|
|
1113
|
+
|
|
1114
|
+
for (const pattern of mediumRiskPatterns) {
|
|
1115
|
+
if (joinedLower.includes(pattern)) {
|
|
1116
|
+
return 'medium';
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
return 'low';
|
|
1121
|
+
};
|