@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.
Files changed (872) hide show
  1. package/README.md +235 -0
  2. package/dist/agents-base.d.mts +12 -0
  3. package/dist/agents-base.d.mts.map +1 -0
  4. package/dist/agents-base.mjs +20 -0
  5. package/dist/agents-base.mjs.map +1 -0
  6. package/dist/agents-control-flow.d.mts +115 -0
  7. package/dist/agents-control-flow.d.mts.map +1 -0
  8. package/dist/agents-control-flow.mjs +514 -0
  9. package/dist/agents-control-flow.mjs.map +1 -0
  10. package/dist/agents-coordinator.d.mts +11 -0
  11. package/dist/agents-coordinator.d.mts.map +1 -0
  12. package/dist/agents-coordinator.mjs +12 -0
  13. package/dist/agents-coordinator.mjs.map +1 -0
  14. package/dist/agents-experimental.d.mts +153 -0
  15. package/dist/agents-experimental.d.mts.map +1 -0
  16. package/dist/agents-experimental.mjs +580 -0
  17. package/dist/agents-experimental.mjs.map +1 -0
  18. package/dist/agents-fallback.d.mts +10 -0
  19. package/dist/agents-fallback.d.mts.map +1 -0
  20. package/dist/agents-fallback.mjs +15 -0
  21. package/dist/agents-fallback.mjs.map +1 -0
  22. package/dist/agents-multi-swarm.d.mts +9 -0
  23. package/dist/agents-multi-swarm.d.mts.map +1 -0
  24. package/dist/agents-multi-swarm.mjs +44 -0
  25. package/dist/agents-multi-swarm.mjs.map +1 -0
  26. package/dist/agents-multi.d.mts +10 -0
  27. package/dist/agents-multi.d.mts.map +1 -0
  28. package/dist/agents-multi.mjs +44 -0
  29. package/dist/agents-multi.mjs.map +1 -0
  30. package/dist/agents-observability.d.mts +161 -0
  31. package/dist/agents-observability.d.mts.map +1 -0
  32. package/dist/agents-observability.mjs +550 -0
  33. package/dist/agents-observability.mjs.map +1 -0
  34. package/dist/agents-patterns.d.mts +9 -0
  35. package/dist/agents-patterns.d.mts.map +1 -0
  36. package/dist/agents-patterns.mjs +18 -0
  37. package/dist/agents-patterns.mjs.map +1 -0
  38. package/dist/agents-persistence.d.mts +234 -0
  39. package/dist/agents-persistence.d.mts.map +1 -0
  40. package/dist/agents-persistence.mjs +447 -0
  41. package/dist/agents-persistence.mjs.map +1 -0
  42. package/dist/agents-triage.d.mts +11 -0
  43. package/dist/agents-triage.d.mts.map +1 -0
  44. package/dist/agents-triage.mjs +13 -0
  45. package/dist/agents-triage.mjs.map +1 -0
  46. package/dist/agents-workflows.d.mts +9 -0
  47. package/dist/agents-workflows.d.mts.map +1 -0
  48. package/dist/agents-workflows.mjs +9 -0
  49. package/dist/agents-workflows.mjs.map +1 -0
  50. package/dist/agents.d.mts +30 -0
  51. package/dist/agents.d.mts.map +1 -0
  52. package/dist/agents.mjs +50 -0
  53. package/dist/agents.mjs.map +1 -0
  54. package/dist/aggregation-8KJF1uzp.d.mts +276 -0
  55. package/dist/aggregation-8KJF1uzp.d.mts.map +1 -0
  56. package/dist/aggregation-BDop87kL.mjs +1180 -0
  57. package/dist/aggregation-BDop87kL.mjs.map +1 -0
  58. package/dist/ai-runtime-CDzQztTt.mjs +85 -0
  59. package/dist/ai-runtime-CDzQztTt.mjs.map +1 -0
  60. package/dist/ai-runtime-DIwOEc6g.d.mts +56 -0
  61. package/dist/ai-runtime-DIwOEc6g.d.mts.map +1 -0
  62. package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts +553 -0
  63. package/dist/ai-sdk-error-integration-D0GDqrM0.d.mts.map +1 -0
  64. package/dist/approval-queue-BcDDQ4oQ.mjs +104 -0
  65. package/dist/approval-queue-BcDDQ4oQ.mjs.map +1 -0
  66. package/dist/approval-queue-CiKiFT9z.d.mts +21 -0
  67. package/dist/approval-queue-CiKiFT9z.d.mts.map +1 -0
  68. package/dist/audio-BzvN7r10.d.mts +79 -0
  69. package/dist/audio-BzvN7r10.d.mts.map +1 -0
  70. package/dist/audio-vBG_62ME.mjs +226 -0
  71. package/dist/audio-vBG_62ME.mjs.map +1 -0
  72. package/dist/audit-logger-Bb2JIcIk.d.mts +12 -0
  73. package/dist/audit-logger-Bb2JIcIk.d.mts.map +1 -0
  74. package/dist/audit-logger-CHIP8bRO.mjs +596 -0
  75. package/dist/audit-logger-CHIP8bRO.mjs.map +1 -0
  76. package/dist/auto-resume-BpUNbPtp.d.mts +160 -0
  77. package/dist/auto-resume-BpUNbPtp.d.mts.map +1 -0
  78. package/dist/auto-resume-BuFRNvAX.mjs +638 -0
  79. package/dist/auto-resume-BuFRNvAX.mjs.map +1 -0
  80. package/dist/budget-guard-C83KCH9V.d.mts +52 -0
  81. package/dist/budget-guard-C83KCH9V.d.mts.map +1 -0
  82. package/dist/budget-guard-d_b5rq4u.mjs +158 -0
  83. package/dist/budget-guard-d_b5rq4u.mjs.map +1 -0
  84. package/dist/budget-guard-gyhJS00s.mjs +234 -0
  85. package/dist/budget-guard-gyhJS00s.mjs.map +1 -0
  86. package/dist/buffer-BC8mvXHE.d.mts +98 -0
  87. package/dist/buffer-BC8mvXHE.d.mts.map +1 -0
  88. package/dist/buffer-CefJGbRy.mjs +289 -0
  89. package/dist/buffer-CefJGbRy.mjs.map +1 -0
  90. package/dist/caching-adapters.d.mts +5 -0
  91. package/dist/caching-adapters.mjs +3 -0
  92. package/dist/caching-strategies.d.mts +52 -0
  93. package/dist/caching-strategies.d.mts.map +1 -0
  94. package/dist/caching-strategies.mjs +703 -0
  95. package/dist/caching-strategies.mjs.map +1 -0
  96. package/dist/caching.d.mts +14 -0
  97. package/dist/caching.d.mts.map +1 -0
  98. package/dist/caching.mjs +15 -0
  99. package/dist/caching.mjs.map +1 -0
  100. package/dist/catalog.d.mts +19 -0
  101. package/dist/catalog.d.mts.map +1 -0
  102. package/dist/catalog.mjs +1114 -0
  103. package/dist/catalog.mjs.map +1 -0
  104. package/dist/chunk-CkzbjWQW.mjs +20 -0
  105. package/dist/circuit-breaker-DoKWPORd.mjs +262 -0
  106. package/dist/circuit-breaker-DoKWPORd.mjs.map +1 -0
  107. package/dist/circuit-breaker-Mey3E7tW.d.mts +64 -0
  108. package/dist/circuit-breaker-Mey3E7tW.d.mts.map +1 -0
  109. package/dist/citation-generator-C-9RpbHq.mjs +103 -0
  110. package/dist/citation-generator-C-9RpbHq.mjs.map +1 -0
  111. package/dist/citation-generator-CDSymDs_.d.mts +18 -0
  112. package/dist/citation-generator-CDSymDs_.d.mts.map +1 -0
  113. package/dist/client-CpacYDIE.mjs +882 -0
  114. package/dist/client-CpacYDIE.mjs.map +1 -0
  115. package/dist/client.d.mts +103 -0
  116. package/dist/client.d.mts.map +1 -0
  117. package/dist/client.mjs +470 -0
  118. package/dist/client.mjs.map +1 -0
  119. package/dist/compliance-approval-queue-DQGLojAm.mjs +172 -0
  120. package/dist/compliance-approval-queue-DQGLojAm.mjs.map +1 -0
  121. package/dist/compliance-approval-queue-IrMxFfSJ.d.mts +99 -0
  122. package/dist/compliance-approval-queue-IrMxFfSJ.d.mts.map +1 -0
  123. package/dist/compliance-wrapper-CrOMHhHN.mjs +528 -0
  124. package/dist/compliance-wrapper-CrOMHhHN.mjs.map +1 -0
  125. package/dist/conditions-DmQ6Y1Wt.mjs +179 -0
  126. package/dist/conditions-DmQ6Y1Wt.mjs.map +1 -0
  127. package/dist/conditions-zDrKfrc3.d.mts +42 -0
  128. package/dist/conditions-zDrKfrc3.d.mts.map +1 -0
  129. package/dist/console-BGMxxPZN.mjs +181 -0
  130. package/dist/console-BGMxxPZN.mjs.map +1 -0
  131. package/dist/console-DqEqZd4A.d.mts +76 -0
  132. package/dist/console-DqEqZd4A.d.mts.map +1 -0
  133. package/dist/controller-BOy3-xbC.mjs +501 -0
  134. package/dist/controller-BOy3-xbC.mjs.map +1 -0
  135. package/dist/controller-Y0NGosbJ.d.mts +104 -0
  136. package/dist/controller-Y0NGosbJ.d.mts.map +1 -0
  137. package/dist/coordinator-agent-BglqZLwo.d.mts +54 -0
  138. package/dist/coordinator-agent-BglqZLwo.d.mts.map +1 -0
  139. package/dist/coordinator-agent-WFWBRL-G.mjs +236 -0
  140. package/dist/coordinator-agent-WFWBRL-G.mjs.map +1 -0
  141. package/dist/crypto-8ABhc3TD.mjs +40 -0
  142. package/dist/crypto-8ABhc3TD.mjs.map +1 -0
  143. package/dist/environment-CSoJb0SW.mjs +255 -0
  144. package/dist/environment-CSoJb0SW.mjs.map +1 -0
  145. package/dist/error-handling-DNVkm6RY.mjs +1334 -0
  146. package/dist/error-handling-DNVkm6RY.mjs.map +1 -0
  147. package/dist/errors-CQ8tF4dP.mjs +985 -0
  148. package/dist/errors-CQ8tF4dP.mjs.map +1 -0
  149. package/dist/errors-CfYdVeum.d.mts +212 -0
  150. package/dist/errors-CfYdVeum.d.mts.map +1 -0
  151. package/dist/errors-Dtn-UeRi.mjs +61 -0
  152. package/dist/errors-Dtn-UeRi.mjs.map +1 -0
  153. package/dist/evaluator-Cs84qkr8.mjs +91 -0
  154. package/dist/evaluator-Cs84qkr8.mjs.map +1 -0
  155. package/dist/evaluator-optimizer-De67_mJC.mjs +1086 -0
  156. package/dist/evaluator-optimizer-De67_mJC.mjs.map +1 -0
  157. package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs +367 -0
  158. package/dist/evaluator-optimizer-pattern-B5939s2Z.mjs.map +1 -0
  159. package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts +72 -0
  160. package/dist/evaluator-optimizer-pattern-D1AJrzBD.d.mts.map +1 -0
  161. package/dist/factory-DP6VSl8C.mjs +307 -0
  162. package/dist/factory-DP6VSl8C.mjs.map +1 -0
  163. package/dist/generative-ui-catalog.d.mts +8 -0
  164. package/dist/generative-ui-catalog.d.mts.map +1 -0
  165. package/dist/generative-ui-catalog.mjs +679 -0
  166. package/dist/generative-ui-catalog.mjs.map +1 -0
  167. package/dist/generative-ui-registry.d.mts +195 -0
  168. package/dist/generative-ui-registry.d.mts.map +1 -0
  169. package/dist/generative-ui-registry.mjs +250 -0
  170. package/dist/generative-ui-registry.mjs.map +1 -0
  171. package/dist/generative-ui-stream.d.mts +23 -0
  172. package/dist/generative-ui-stream.d.mts.map +1 -0
  173. package/dist/generative-ui-stream.mjs +219 -0
  174. package/dist/generative-ui-stream.mjs.map +1 -0
  175. package/dist/generative-ui-types.d.mts +123 -0
  176. package/dist/generative-ui-types.d.mts.map +1 -0
  177. package/dist/generative-ui-types.mjs +1 -0
  178. package/dist/generative-ui.d.mts +13 -0
  179. package/dist/generative-ui.d.mts.map +1 -0
  180. package/dist/generative-ui.mjs +21 -0
  181. package/dist/generative-ui.mjs.map +1 -0
  182. package/dist/governance-audit.d.mts +3 -0
  183. package/dist/governance-audit.mjs +3 -0
  184. package/dist/governance-compliance.d.mts +5 -0
  185. package/dist/governance-compliance.mjs +4 -0
  186. package/dist/governance-policies.d.mts +4 -0
  187. package/dist/governance-policies.mjs +4 -0
  188. package/dist/governance-tenancy.d.mts +3 -0
  189. package/dist/governance-tenancy.mjs +3 -0
  190. package/dist/governance.d.mts +88 -0
  191. package/dist/governance.d.mts.map +1 -0
  192. package/dist/governance.mjs +432 -0
  193. package/dist/governance.mjs.map +1 -0
  194. package/dist/grounding-attribution.d.mts +63 -0
  195. package/dist/grounding-attribution.d.mts.map +1 -0
  196. package/dist/grounding-attribution.mjs +259 -0
  197. package/dist/grounding-attribution.mjs.map +1 -0
  198. package/dist/grounding-citation.d.mts +2 -0
  199. package/dist/grounding-citation.mjs +3 -0
  200. package/dist/grounding-context.d.mts +9 -0
  201. package/dist/grounding-context.d.mts.map +1 -0
  202. package/dist/grounding-context.mjs +19 -0
  203. package/dist/grounding-context.mjs.map +1 -0
  204. package/dist/grounding-embed.d.mts +102 -0
  205. package/dist/grounding-embed.d.mts.map +1 -0
  206. package/dist/grounding-embed.mjs +417 -0
  207. package/dist/grounding-embed.mjs.map +1 -0
  208. package/dist/grounding-hallucination.d.mts +44 -0
  209. package/dist/grounding-hallucination.d.mts.map +1 -0
  210. package/dist/grounding-hallucination.mjs +115 -0
  211. package/dist/grounding-hallucination.mjs.map +1 -0
  212. package/dist/grounding-proof-map.d.mts +9 -0
  213. package/dist/grounding-proof-map.d.mts.map +1 -0
  214. package/dist/grounding-proof-map.mjs +26 -0
  215. package/dist/grounding-proof-map.mjs.map +1 -0
  216. package/dist/grounding-rag.d.mts +10 -0
  217. package/dist/grounding-rag.d.mts.map +1 -0
  218. package/dist/grounding-rag.mjs +27 -0
  219. package/dist/grounding-rag.mjs.map +1 -0
  220. package/dist/grounding-verification.d.mts +48 -0
  221. package/dist/grounding-verification.d.mts.map +1 -0
  222. package/dist/grounding-verification.mjs +224 -0
  223. package/dist/grounding-verification.mjs.map +1 -0
  224. package/dist/grounding.d.mts +24 -0
  225. package/dist/grounding.d.mts.map +1 -0
  226. package/dist/grounding.mjs +77 -0
  227. package/dist/grounding.mjs.map +1 -0
  228. package/dist/hitl-active-learning.d.mts +41 -0
  229. package/dist/hitl-active-learning.d.mts.map +1 -0
  230. package/dist/hitl-active-learning.mjs +178 -0
  231. package/dist/hitl-active-learning.mjs.map +1 -0
  232. package/dist/hitl-annotation.d.mts +74 -0
  233. package/dist/hitl-annotation.d.mts.map +1 -0
  234. package/dist/hitl-annotation.mjs +170 -0
  235. package/dist/hitl-annotation.mjs.map +1 -0
  236. package/dist/hitl-approval.d.mts +2 -0
  237. package/dist/hitl-approval.mjs +3 -0
  238. package/dist/hitl-feedback.d.mts +59 -0
  239. package/dist/hitl-feedback.d.mts.map +1 -0
  240. package/dist/hitl-feedback.mjs +137 -0
  241. package/dist/hitl-feedback.mjs.map +1 -0
  242. package/dist/hitl-review.d.mts +2 -0
  243. package/dist/hitl-review.mjs +3 -0
  244. package/dist/hitl.d.mts +14 -0
  245. package/dist/hitl.d.mts.map +1 -0
  246. package/dist/hitl.mjs +22 -0
  247. package/dist/hitl.mjs.map +1 -0
  248. package/dist/index-B17HT-VL.d.mts +285 -0
  249. package/dist/index-B17HT-VL.d.mts.map +1 -0
  250. package/dist/index-BDwgsK9B.d.mts +101 -0
  251. package/dist/index-BDwgsK9B.d.mts.map +1 -0
  252. package/dist/index-BGgMn_Ev.d.mts +2615 -0
  253. package/dist/index-BGgMn_Ev.d.mts.map +1 -0
  254. package/dist/index-DOqe5r9G.d.mts +318 -0
  255. package/dist/index-DOqe5r9G.d.mts.map +1 -0
  256. package/dist/index-DotINT7o.d.mts +1004 -0
  257. package/dist/index-DotINT7o.d.mts.map +1 -0
  258. package/dist/index-URlW7aD1.d.mts +67 -0
  259. package/dist/index-URlW7aD1.d.mts.map +1 -0
  260. package/dist/index.d.mts +64 -0
  261. package/dist/index.d.mts.map +1 -0
  262. package/dist/index.mjs +46 -0
  263. package/dist/index.mjs.map +1 -0
  264. package/dist/integrations-blob-storage.d.mts +25 -0
  265. package/dist/integrations-blob-storage.d.mts.map +1 -0
  266. package/dist/integrations-blob-storage.mjs +3 -0
  267. package/dist/integrations-notifications.d.mts +2 -0
  268. package/dist/integrations-notifications.mjs +3 -0
  269. package/dist/integrations-rate-limit.d.mts +27 -0
  270. package/dist/integrations-rate-limit.d.mts.map +1 -0
  271. package/dist/integrations-rate-limit.mjs +30 -0
  272. package/dist/integrations-rate-limit.mjs.map +1 -0
  273. package/dist/integrations-redis.d.mts +3 -0
  274. package/dist/integrations-redis.mjs +3 -0
  275. package/dist/integrations-stream.d.mts +14 -0
  276. package/dist/integrations-stream.d.mts.map +1 -0
  277. package/dist/integrations-stream.mjs +3 -0
  278. package/dist/integrations.d.mts +7 -0
  279. package/dist/integrations.mjs +7 -0
  280. package/dist/log-adapter-BLegSZtz.d.mts +16 -0
  281. package/dist/log-adapter-BLegSZtz.d.mts.map +1 -0
  282. package/dist/log-adapter-PPe_2Pwv.mjs +28 -0
  283. package/dist/log-adapter-PPe_2Pwv.mjs.map +1 -0
  284. package/dist/loop-BOYEtr2g.mjs +520 -0
  285. package/dist/loop-BOYEtr2g.mjs.map +1 -0
  286. package/dist/loop-C-tBBOqi.d.mts +219 -0
  287. package/dist/loop-C-tBBOqi.d.mts.map +1 -0
  288. package/dist/middleware-5wQ9bANW.mjs +306 -0
  289. package/dist/middleware-5wQ9bANW.mjs.map +1 -0
  290. package/dist/middleware-C1apSrj0.mjs +613 -0
  291. package/dist/middleware-C1apSrj0.mjs.map +1 -0
  292. package/dist/middleware-C7k0uItW.d.mts +9 -0
  293. package/dist/middleware-C7k0uItW.d.mts.map +1 -0
  294. package/dist/middleware-CZQCTHfl.mjs +366 -0
  295. package/dist/middleware-CZQCTHfl.mjs.map +1 -0
  296. package/dist/models.d.mts +11 -0
  297. package/dist/models.d.mts.map +1 -0
  298. package/dist/models.mjs +32 -0
  299. package/dist/models.mjs.map +1 -0
  300. package/dist/observability-analytics.d.mts +107 -0
  301. package/dist/observability-analytics.d.mts.map +1 -0
  302. package/dist/observability-analytics.mjs +409 -0
  303. package/dist/observability-analytics.mjs.map +1 -0
  304. package/dist/observability-cost.d.mts +10 -0
  305. package/dist/observability-cost.d.mts.map +1 -0
  306. package/dist/observability-cost.mjs +15 -0
  307. package/dist/observability-cost.mjs.map +1 -0
  308. package/dist/observability-telemetry.d.mts +111 -0
  309. package/dist/observability-telemetry.d.mts.map +1 -0
  310. package/dist/observability-telemetry.mjs +343 -0
  311. package/dist/observability-telemetry.mjs.map +1 -0
  312. package/dist/observability-tracing.d.mts +10 -0
  313. package/dist/observability-tracing.d.mts.map +1 -0
  314. package/dist/observability-tracing.mjs +17 -0
  315. package/dist/observability-tracing.mjs.map +1 -0
  316. package/dist/observability.d.mts +15 -0
  317. package/dist/observability.d.mts.map +1 -0
  318. package/dist/observability.mjs +17 -0
  319. package/dist/observability.mjs.map +1 -0
  320. package/dist/optimizer-DhXXpci6.mjs +97 -0
  321. package/dist/optimizer-DhXXpci6.mjs.map +1 -0
  322. package/dist/output-multimodal.d.mts +9 -0
  323. package/dist/output-multimodal.d.mts.map +1 -0
  324. package/dist/output-multimodal.mjs +18 -0
  325. package/dist/output-multimodal.mjs.map +1 -0
  326. package/dist/output.d.mts +11 -0
  327. package/dist/output.d.mts.map +1 -0
  328. package/dist/output.mjs +40 -0
  329. package/dist/output.mjs.map +1 -0
  330. package/dist/pii-filter-3AxmYSiu.d.mts +23 -0
  331. package/dist/pii-filter-3AxmYSiu.d.mts.map +1 -0
  332. package/dist/pipelines.d.mts +448 -0
  333. package/dist/pipelines.d.mts.map +1 -0
  334. package/dist/pipelines.mjs +1534 -0
  335. package/dist/pipelines.mjs.map +1 -0
  336. package/dist/prompt-injection-DQXchzsV.d.mts +8 -0
  337. package/dist/prompt-injection-DQXchzsV.d.mts.map +1 -0
  338. package/dist/prompt-injection-RpoLPwSa.mjs +52 -0
  339. package/dist/prompt-injection-RpoLPwSa.mjs.map +1 -0
  340. package/dist/prompts.d.mts +192 -0
  341. package/dist/prompts.d.mts.map +1 -0
  342. package/dist/prompts.mjs +732 -0
  343. package/dist/prompts.mjs.map +1 -0
  344. package/dist/protocol-DfBiEsnl.d.mts +112 -0
  345. package/dist/protocol-DfBiEsnl.d.mts.map +1 -0
  346. package/dist/quota-manager-0iPMkQWN.d.mts +62 -0
  347. package/dist/quota-manager-0iPMkQWN.d.mts.map +1 -0
  348. package/dist/quota-manager-D_N7FuQ2.mjs +180 -0
  349. package/dist/quota-manager-D_N7FuQ2.mjs.map +1 -0
  350. package/dist/redaction-utils-DcQwsiNh.mjs +438 -0
  351. package/dist/redaction-utils-DcQwsiNh.mjs.map +1 -0
  352. package/dist/redis-CpsSrF8K.mjs +102 -0
  353. package/dist/redis-CpsSrF8K.mjs.map +1 -0
  354. package/dist/redis-CwguYFGh.d.mts +33 -0
  355. package/dist/redis-CwguYFGh.d.mts.map +1 -0
  356. package/dist/registry-CsD3iTIx.mjs +190 -0
  357. package/dist/registry-CsD3iTIx.mjs.map +1 -0
  358. package/dist/registry-DVPWzkXR.d.mts +36 -0
  359. package/dist/registry-DVPWzkXR.d.mts.map +1 -0
  360. package/dist/reranking-BpWYhYzl.d.mts +72 -0
  361. package/dist/reranking-BpWYhYzl.d.mts.map +1 -0
  362. package/dist/reranking-Ck8aKZW7.mjs +331 -0
  363. package/dist/reranking-Ck8aKZW7.mjs.map +1 -0
  364. package/dist/resumable-adapter-CO1HtsgJ.mjs +21 -0
  365. package/dist/resumable-adapter-CO1HtsgJ.mjs.map +1 -0
  366. package/dist/review-trigger-DmAsiQlM.d.mts +24 -0
  367. package/dist/review-trigger-DmAsiQlM.d.mts.map +1 -0
  368. package/dist/review-trigger-DwXfpww9.mjs +112 -0
  369. package/dist/review-trigger-DwXfpww9.mjs.map +1 -0
  370. package/dist/safe-context-BynhkTKR.d.mts +54 -0
  371. package/dist/safe-context-BynhkTKR.d.mts.map +1 -0
  372. package/dist/safe-context-C5A3Wv3b.mjs +143 -0
  373. package/dist/safe-context-C5A3Wv3b.mjs.map +1 -0
  374. package/dist/schema-Bu2noOZ4.mjs +27 -0
  375. package/dist/schema-Bu2noOZ4.mjs.map +1 -0
  376. package/dist/schema-CwFvuCnA.mjs +97 -0
  377. package/dist/schema-CwFvuCnA.mjs.map +1 -0
  378. package/dist/schema-Wz-1-ro9.d.mts +37 -0
  379. package/dist/schema-Wz-1-ro9.d.mts.map +1 -0
  380. package/dist/schemas-CxQtxIga.mjs +62 -0
  381. package/dist/schemas-CxQtxIga.mjs.map +1 -0
  382. package/dist/schemas-DBOhxgW7.d.mts +32 -0
  383. package/dist/schemas-DBOhxgW7.d.mts.map +1 -0
  384. package/dist/schemas-Dp_OCqBt.d.mts +63 -0
  385. package/dist/schemas-Dp_OCqBt.d.mts.map +1 -0
  386. package/dist/schemas-SwCsnT0z.mjs +83 -0
  387. package/dist/schemas-SwCsnT0z.mjs.map +1 -0
  388. package/dist/sdk-errors.d.mts +2 -0
  389. package/dist/sdk-errors.mjs +3 -0
  390. package/dist/sdk-experimental.d.mts +59 -0
  391. package/dist/sdk-experimental.d.mts.map +1 -0
  392. package/dist/sdk-experimental.mjs +193 -0
  393. package/dist/sdk-experimental.mjs.map +1 -0
  394. package/dist/sdk-stop-conditions.d.mts +3 -0
  395. package/dist/sdk-stop-conditions.mjs +3 -0
  396. package/dist/sdk.d.mts +15 -0
  397. package/dist/sdk.d.mts.map +1 -0
  398. package/dist/sdk.mjs +50 -0
  399. package/dist/sdk.mjs.map +1 -0
  400. package/dist/security-guardrails.d.mts +3 -0
  401. package/dist/security-guardrails.mjs +3 -0
  402. package/dist/security-injection.d.mts +2 -0
  403. package/dist/security-injection.mjs +3 -0
  404. package/dist/security.d.mts +12 -0
  405. package/dist/security.d.mts.map +1 -0
  406. package/dist/security.mjs +18 -0
  407. package/dist/security.mjs.map +1 -0
  408. package/dist/server.d.mts +420 -0
  409. package/dist/server.d.mts.map +1 -0
  410. package/dist/server.mjs +2225 -0
  411. package/dist/server.mjs.map +1 -0
  412. package/dist/shared.d.mts +2 -0
  413. package/dist/shared.mjs +3 -0
  414. package/dist/streaming-control.d.mts +2 -0
  415. package/dist/streaming-control.mjs +4 -0
  416. package/dist/streaming-core.d.mts +4 -0
  417. package/dist/streaming-core.mjs +3 -0
  418. package/dist/streaming-infra-resilience.d.mts +120 -0
  419. package/dist/streaming-infra-resilience.d.mts.map +1 -0
  420. package/dist/streaming-infra-resilience.mjs +358 -0
  421. package/dist/streaming-infra-resilience.mjs.map +1 -0
  422. package/dist/streaming-infra-transport.d.mts +57 -0
  423. package/dist/streaming-infra-transport.d.mts.map +1 -0
  424. package/dist/streaming-infra-transport.mjs +488 -0
  425. package/dist/streaming-infra-transport.mjs.map +1 -0
  426. package/dist/streaming-infra.d.mts +5 -0
  427. package/dist/streaming-infra.mjs +5 -0
  428. package/dist/streaming.d.mts +17 -0
  429. package/dist/streaming.d.mts.map +1 -0
  430. package/dist/streaming.mjs +71 -0
  431. package/dist/streaming.mjs.map +1 -0
  432. package/dist/telemetry-2eKMojIb.mjs +1046 -0
  433. package/dist/telemetry-2eKMojIb.mjs.map +1 -0
  434. package/dist/telemetry-C2t03dwD.d.mts +59 -0
  435. package/dist/telemetry-C2t03dwD.d.mts.map +1 -0
  436. package/dist/tool-Btbththq.d.mts +253 -0
  437. package/dist/tool-Btbththq.d.mts.map +1 -0
  438. package/dist/tool-JSf8JXZ8.mjs +1150 -0
  439. package/dist/tool-JSf8JXZ8.mjs.map +1 -0
  440. package/dist/tool-safety-CZO8a4D4.d.mts +60 -0
  441. package/dist/tool-safety-CZO8a4D4.d.mts.map +1 -0
  442. package/dist/tool-safety-DXtYDXod.mjs +319 -0
  443. package/dist/tool-safety-DXtYDXod.mjs.map +1 -0
  444. package/dist/tools-BuS2Uv0q.mjs +1708 -0
  445. package/dist/tools-BuS2Uv0q.mjs.map +1 -0
  446. package/dist/tools-approval.d.mts +99 -0
  447. package/dist/tools-approval.d.mts.map +1 -0
  448. package/dist/tools-approval.mjs +395 -0
  449. package/dist/tools-approval.mjs.map +1 -0
  450. package/dist/tools-compliance.d.mts +67 -0
  451. package/dist/tools-compliance.d.mts.map +1 -0
  452. package/dist/tools-compliance.mjs +330 -0
  453. package/dist/tools-compliance.mjs.map +1 -0
  454. package/dist/tools-computer.d.mts +25 -0
  455. package/dist/tools-computer.d.mts.map +1 -0
  456. package/dist/tools-computer.mjs +64 -0
  457. package/dist/tools-computer.mjs.map +1 -0
  458. package/dist/tools-core.d.mts +3 -0
  459. package/dist/tools-core.mjs +3 -0
  460. package/dist/tools-mcp.d.mts +3 -0
  461. package/dist/tools-mcp.mjs +5 -0
  462. package/dist/tools-superpowers.d.mts +2 -0
  463. package/dist/tools-superpowers.mjs +3 -0
  464. package/dist/tools.d.mts +401 -0
  465. package/dist/tools.d.mts.map +1 -0
  466. package/dist/tools.mjs +1921 -0
  467. package/dist/tools.mjs.map +1 -0
  468. package/dist/transport-selector-D-Ib05X1.mjs +1936 -0
  469. package/dist/transport-selector-D-Ib05X1.mjs.map +1 -0
  470. package/dist/triage-agent-BEsXg5sw.d.mts +63 -0
  471. package/dist/triage-agent-BEsXg5sw.d.mts.map +1 -0
  472. package/dist/triage-agent-CBsfX-HW.mjs +167 -0
  473. package/dist/triage-agent-CBsfX-HW.mjs.map +1 -0
  474. package/dist/types-BPnq3GQo.d.mts +23 -0
  475. package/dist/types-BPnq3GQo.d.mts.map +1 -0
  476. package/dist/types-BjWgimpY.d.mts +16 -0
  477. package/dist/types-BjWgimpY.d.mts.map +1 -0
  478. package/dist/types-BxD-5btB.d.mts +41 -0
  479. package/dist/types-BxD-5btB.d.mts.map +1 -0
  480. package/dist/types-By-r93bE.d.mts +36 -0
  481. package/dist/types-By-r93bE.d.mts.map +1 -0
  482. package/dist/types-CLBWFRZN.d.mts +69 -0
  483. package/dist/types-CLBWFRZN.d.mts.map +1 -0
  484. package/dist/types-CQ0HFd0u.d.mts +62 -0
  485. package/dist/types-CQ0HFd0u.d.mts.map +1 -0
  486. package/dist/types-D3zJb59_.d.mts +47 -0
  487. package/dist/types-D3zJb59_.d.mts.map +1 -0
  488. package/dist/types-DJnugQX0.d.mts +80 -0
  489. package/dist/types-DJnugQX0.d.mts.map +1 -0
  490. package/dist/types-DbUfMCnT.d.mts +70 -0
  491. package/dist/types-DbUfMCnT.d.mts.map +1 -0
  492. package/dist/upstash-adapter-D96Caq2O.mjs +22 -0
  493. package/dist/upstash-adapter-D96Caq2O.mjs.map +1 -0
  494. package/dist/upstash-adapter-DD4433dx.d.mts +8 -0
  495. package/dist/upstash-adapter-DD4433dx.d.mts.map +1 -0
  496. package/dist/utils-BlYhcD6M.mjs +319 -0
  497. package/dist/utils-BlYhcD6M.mjs.map +1 -0
  498. package/dist/utils-DpJGOb3y.d.mts +120 -0
  499. package/dist/utils-DpJGOb3y.d.mts.map +1 -0
  500. package/dist/vercel-blob-adapter-CkOXLT2D.mjs +25 -0
  501. package/dist/vercel-blob-adapter-CkOXLT2D.mjs.map +1 -0
  502. package/dist/xai-CbV_dCnP.mjs +1600 -0
  503. package/dist/xai-CbV_dCnP.mjs.map +1 -0
  504. package/package.json +479 -0
  505. package/src/agents/base/factory.ts +382 -0
  506. package/src/agents/base/index.ts +8 -0
  507. package/src/agents/base/schemas.ts +117 -0
  508. package/src/agents/base/types.ts +192 -0
  509. package/src/agents/control-flow/index.ts +683 -0
  510. package/src/agents/coordinator/coordinator-agent.ts +381 -0
  511. package/src/agents/coordinator/index.ts +6 -0
  512. package/src/agents/default-agent.ts +211 -0
  513. package/src/agents/evaluator-optimizer/README.md +612 -0
  514. package/src/agents/evaluator-optimizer/evaluator-optimizer.example.ts +437 -0
  515. package/src/agents/evaluator-optimizer/evaluator.ts +282 -0
  516. package/src/agents/evaluator-optimizer/index.test.ts +416 -0
  517. package/src/agents/evaluator-optimizer/index.ts +519 -0
  518. package/src/agents/evaluator-optimizer/optimizer.ts +322 -0
  519. package/src/agents/evaluator-optimizer/schema.ts +302 -0
  520. package/src/agents/evaluator-optimizer/utils.ts +42 -0
  521. package/src/agents/experimental/index.ts +1095 -0
  522. package/src/agents/experimental/types.ts +212 -0
  523. package/src/agents/fallback/index.ts +18 -0
  524. package/src/agents/fallback/recovery/circuit-breaker.ts +166 -0
  525. package/src/agents/fallback/strategies/model-fallback.ts +192 -0
  526. package/src/agents/fallback/types.ts +87 -0
  527. package/src/agents/governance-agent.ts +446 -0
  528. package/src/agents/index.ts +79 -0
  529. package/src/agents/multi/coordination/index.ts +6 -0
  530. package/src/agents/multi/coordination/message-bus.ts +144 -0
  531. package/src/agents/multi/index.ts +6 -0
  532. package/src/agents/multi/state/index.ts +162 -0
  533. package/src/agents/multi/supervisor/index.ts +7 -0
  534. package/src/agents/multi/supervisor/supervisor.ts +254 -0
  535. package/src/agents/multi/swarm/aggregation.ts +466 -0
  536. package/src/agents/multi/swarm/communication.ts +388 -0
  537. package/src/agents/multi/swarm/coordination.ts +380 -0
  538. package/src/agents/multi/swarm/index.ts +73 -0
  539. package/src/agents/multi/swarm/swarm-executor.ts +479 -0
  540. package/src/agents/multi/types.ts +181 -0
  541. package/src/agents/observability/index.ts +914 -0
  542. package/src/agents/orchestrator.ts +218 -0
  543. package/src/agents/patterns/README.md +512 -0
  544. package/src/agents/patterns/evaluator-optimizer-pattern.example.ts +455 -0
  545. package/src/agents/patterns/evaluator-optimizer-pattern.ts +653 -0
  546. package/src/agents/patterns/index.ts +26 -0
  547. package/src/agents/persistence/index.ts +726 -0
  548. package/src/agents/tools/index.ts +291 -0
  549. package/src/agents/tools/mcp.ts +188 -0
  550. package/src/agents/triage/index.ts +6 -0
  551. package/src/agents/triage/triage-agent.ts +280 -0
  552. package/src/agents/workflows/index.ts +6 -0
  553. package/src/agents/workflows/interfaces.ts +36 -0
  554. package/src/agents/workflows/schema.ts +20 -0
  555. package/src/caching/adapters/index.ts +7 -0
  556. package/src/caching/adapters/memory.ts +77 -0
  557. package/src/caching/adapters/redis.ts +60 -0
  558. package/src/caching/index.ts +17 -0
  559. package/src/caching/middleware.ts +452 -0
  560. package/src/caching/strategies/index.ts +1008 -0
  561. package/src/caching/types.ts +47 -0
  562. package/src/catalog.ts +921 -0
  563. package/src/client/chat-usage.ts +53 -0
  564. package/src/client/hooks.ts +343 -0
  565. package/src/client/index.ts +36 -0
  566. package/src/client/message-utils.ts +29 -0
  567. package/src/client/use-generative-ui.ts +174 -0
  568. package/src/client/utils.ts +66 -0
  569. package/src/generative-ui/catalog.ts +653 -0
  570. package/src/generative-ui/index.ts +82 -0
  571. package/src/generative-ui/registry.ts +273 -0
  572. package/src/generative-ui/stream.ts +324 -0
  573. package/src/generative-ui/types.ts +376 -0
  574. package/src/governance/audit/audit-logger.ts +239 -0
  575. package/src/governance/audit/audit-schema.ts +82 -0
  576. package/src/governance/audit/index.ts +6 -0
  577. package/src/governance/compliance/abac/policy-engine.ts +175 -0
  578. package/src/governance/compliance/abac/types.ts +40 -0
  579. package/src/governance/compliance/approval/compliance-approval-queue.ts +217 -0
  580. package/src/governance/compliance/index.ts +16 -0
  581. package/src/governance/compliance/schemas.ts +68 -0
  582. package/src/governance/compliance/types.ts +143 -0
  583. package/src/governance/compliance/validators/phi-detector.ts +145 -0
  584. package/src/governance/compliance/validators/redaction-utils.ts +176 -0
  585. package/src/governance/compliance/validators/safe-harbor.ts +135 -0
  586. package/src/governance/entitlements/index.ts +585 -0
  587. package/src/governance/entitlements/middleware.ts +651 -0
  588. package/src/governance/entitlements/rate-limiter.ts +711 -0
  589. package/src/governance/index.ts +32 -0
  590. package/src/governance/policies/guardrails.ts +1121 -0
  591. package/src/governance/policies/index.ts +42 -0
  592. package/src/governance/policies/loop-controls.ts +136 -0
  593. package/src/governance/policies/telemetry.ts +63 -0
  594. package/src/governance/tenancy/index.ts +30 -0
  595. package/src/governance/tenancy/isolation/context.ts +92 -0
  596. package/src/governance/tenancy/isolation/index.ts +13 -0
  597. package/src/governance/tenancy/quotas/index.ts +11 -0
  598. package/src/governance/tenancy/quotas/quota-manager.ts +180 -0
  599. package/src/governance/tenancy/types.ts +66 -0
  600. package/src/governance/types.ts +16 -0
  601. package/src/governance/versioning/index.ts +573 -0
  602. package/src/grounding/attribution/index.ts +424 -0
  603. package/src/grounding/citation/citation-generator.ts +174 -0
  604. package/src/grounding/citation/index.ts +12 -0
  605. package/src/grounding/context/index.ts +32 -0
  606. package/src/grounding/context/safe-context.ts +116 -0
  607. package/src/grounding/context/types.ts +62 -0
  608. package/src/grounding/context-engineering/error-handling.ts +359 -0
  609. package/src/grounding/context-engineering/index.ts +23 -0
  610. package/src/grounding/context-engineering/memory.ts +559 -0
  611. package/src/grounding/context-engineering/tool-masking.ts +338 -0
  612. package/src/grounding/embed/index.ts +704 -0
  613. package/src/grounding/embed/reranking.ts +604 -0
  614. package/src/grounding/hallucination/index.ts +223 -0
  615. package/src/grounding/index.ts +82 -0
  616. package/src/grounding/proof-map/applyPatch.ts +172 -0
  617. package/src/grounding/proof-map/index.ts +41 -0
  618. package/src/grounding/proof-map/loop.ts +275 -0
  619. package/src/grounding/proof-map/schema.ts +217 -0
  620. package/src/grounding/rag/__tests__/pipeline.test.ts +274 -0
  621. package/src/grounding/rag/__tests__/tool.test.ts +202 -0
  622. package/src/grounding/rag/__tests__/trace.test.ts +229 -0
  623. package/src/grounding/rag/circuit-breaker.ts +152 -0
  624. package/src/grounding/rag/index.ts +64 -0
  625. package/src/grounding/rag/pipeline.ts +602 -0
  626. package/src/grounding/rag/tool.ts +281 -0
  627. package/src/grounding/rag/trace.ts +503 -0
  628. package/src/grounding/rag/types.ts +284 -0
  629. package/src/grounding/retrieval/in-memory-store.ts +107 -0
  630. package/src/grounding/sources/index.ts +943 -0
  631. package/src/grounding/tests/applyPatch.test.ts +194 -0
  632. package/src/grounding/tests/loop.test.ts +141 -0
  633. package/src/grounding/tests/schema.test.ts +160 -0
  634. package/src/grounding/types.ts +100 -0
  635. package/src/grounding/verification/index.ts +419 -0
  636. package/src/hitl/active-learning/index.ts +332 -0
  637. package/src/hitl/annotation/index.ts +362 -0
  638. package/src/hitl/approval/approval-queue.ts +132 -0
  639. package/src/hitl/approval/index.ts +5 -0
  640. package/src/hitl/feedback/index.ts +284 -0
  641. package/src/hitl/index.ts +69 -0
  642. package/src/hitl/review/index.ts +6 -0
  643. package/src/hitl/review/review-trigger.ts +162 -0
  644. package/src/hitl/types.ts +126 -0
  645. package/src/index.ts +125 -0
  646. package/src/integrations/blob-storage/index.ts +7 -0
  647. package/src/integrations/blob-storage/types.ts +28 -0
  648. package/src/integrations/blob-storage/vercel-blob-adapter.ts +35 -0
  649. package/src/integrations/index.ts +15 -0
  650. package/src/integrations/notifications/index.ts +7 -0
  651. package/src/integrations/notifications/log-adapter.ts +30 -0
  652. package/src/integrations/notifications/types.ts +27 -0
  653. package/src/integrations/rate-limit/index.ts +7 -0
  654. package/src/integrations/rate-limit/types.ts +26 -0
  655. package/src/integrations/rate-limit/upstash-adapter.ts +45 -0
  656. package/src/integrations/redis/index.ts +7 -0
  657. package/src/integrations/redis/types.ts +67 -0
  658. package/src/integrations/redis/upstash-adapter.ts +18 -0
  659. package/src/integrations/stream/index.ts +7 -0
  660. package/src/integrations/stream/resumable-adapter.ts +20 -0
  661. package/src/integrations/stream/types.ts +21 -0
  662. package/src/internal/__tests__/hallucination.test.ts +162 -0
  663. package/src/internal/__tests__/models.test.ts +104 -0
  664. package/src/internal/__tests__/sdk-errors.test.ts +201 -0
  665. package/src/internal/__tests__/stop-conditions.test.ts +210 -0
  666. package/src/internal/shared/ai-types.ts +942 -0
  667. package/src/internal/testing/evaluators.ts +575 -0
  668. package/src/internal/testing/index.ts +960 -0
  669. package/src/internal/ui/data-parts.ts +511 -0
  670. package/src/internal/ui/type-guards.ts +344 -0
  671. package/src/internal/ui-factories/__tests__/ui-factories.test.ts +548 -0
  672. package/src/internal/ui-factories/artifact-factory.ts +667 -0
  673. package/src/internal/ui-factories/index.ts +82 -0
  674. package/src/internal/ui-factories/shimmer-manager.ts +220 -0
  675. package/src/internal/ui-factories/status-helpers.ts +149 -0
  676. package/src/internal/ui-factories/tool-renderer.ts +167 -0
  677. package/src/internal/ui-factories/types.ts +235 -0
  678. package/src/models/capabilities.ts +88 -0
  679. package/src/models/index.ts +16 -0
  680. package/src/models/provider-factory.ts +229 -0
  681. package/src/models/providers/anthropic.ts +539 -0
  682. package/src/models/providers/google.ts +354 -0
  683. package/src/models/providers/index.ts +21 -0
  684. package/src/models/providers/openai.ts +346 -0
  685. package/src/models/providers/perplexity.ts +276 -0
  686. package/src/models/providers/shared.ts +90 -0
  687. package/src/models/providers/xai.ts +269 -0
  688. package/src/models/registry.ts +208 -0
  689. package/src/models/routing/index.ts +45 -0
  690. package/src/models/routing/intent-router.ts +143 -0
  691. package/src/models/routing/model-router.ts +300 -0
  692. package/src/models/routing/types.ts +106 -0
  693. package/src/models/types.ts +23 -0
  694. package/src/observability/analytics/index.ts +593 -0
  695. package/src/observability/cost/index.ts +16 -0
  696. package/src/observability/cost/tracking/budget-guard.ts +110 -0
  697. package/src/observability/cost/tracking/usage-tracker.ts +120 -0
  698. package/src/observability/cost/types.ts +85 -0
  699. package/src/observability/index.ts +17 -0
  700. package/src/observability/telemetry/index.ts +508 -0
  701. package/src/observability/tracing/index.ts +30 -0
  702. package/src/observability/tracing/otel/ai-instrumentation.ts +193 -0
  703. package/src/observability/tracing/otel/exporters/console.ts +58 -0
  704. package/src/observability/tracing/otel/exporters/index.ts +6 -0
  705. package/src/observability/tracing/provenance.ts +769 -0
  706. package/src/observability/tracing/types.ts +92 -0
  707. package/src/output/__tests__/output.test.ts +737 -0
  708. package/src/output/element-stream.ts +678 -0
  709. package/src/output/errors.ts +108 -0
  710. package/src/output/factories.ts +392 -0
  711. package/src/output/index.ts +98 -0
  712. package/src/output/multimodal/EXPORTS.md +306 -0
  713. package/src/output/multimodal/IMPLEMENTATION_SUMMARY.md +421 -0
  714. package/src/output/multimodal/README.md +349 -0
  715. package/src/output/multimodal/SETUP_GUIDE.md +472 -0
  716. package/src/output/multimodal/audio.ts +650 -0
  717. package/src/output/multimodal/image.ts +22 -0
  718. package/src/output/multimodal/index.ts +32 -0
  719. package/src/output/multimodal/providers.example.ts +375 -0
  720. package/src/output/validator.ts +495 -0
  721. package/src/pipelines/adapters/trace-storage-blob.ts +458 -0
  722. package/src/pipelines/adapters/trace-storage-memory.ts +319 -0
  723. package/src/pipelines/defaults.ts +109 -0
  724. package/src/pipelines/index.ts +24 -0
  725. package/src/pipelines/message-transforms.ts +107 -0
  726. package/src/pipelines/multi-step-wrapper.ts +433 -0
  727. package/src/pipelines/pipeline-presets.ts +339 -0
  728. package/src/pipelines/step-executor.ts +257 -0
  729. package/src/pipelines/storage-factory.ts +85 -0
  730. package/src/pipelines/trace-storage-interface.ts +216 -0
  731. package/src/pipelines/types.ts +255 -0
  732. package/src/pipelines/validation.ts +323 -0
  733. package/src/prompts/index.ts +271 -0
  734. package/src/prompts/model-variants.ts +410 -0
  735. package/src/prompts/templates.ts +327 -0
  736. package/src/sdk/errors/base.ts +296 -0
  737. package/src/sdk/errors/index.ts +31 -0
  738. package/src/sdk/errors/utils.ts +148 -0
  739. package/src/sdk/experimental/index.ts +286 -0
  740. package/src/sdk/index.ts +25 -0
  741. package/src/sdk/middleware/ai-middleware.ts +95 -0
  742. package/src/sdk/middleware/cache.ts +154 -0
  743. package/src/sdk/middleware/circuit-breaker.ts +388 -0
  744. package/src/sdk/middleware/compose.ts +81 -0
  745. package/src/sdk/middleware/deduplication.ts +307 -0
  746. package/src/sdk/middleware/index.ts +660 -0
  747. package/src/sdk/middleware/model-middleware.ts +200 -0
  748. package/src/sdk/stop-conditions/conditions.ts +209 -0
  749. package/src/sdk/stop-conditions/index.ts +35 -0
  750. package/src/sdk/stop-conditions/types.ts +59 -0
  751. package/src/security/guardrails/index.ts +6 -0
  752. package/src/security/guardrails/middleware.ts +465 -0
  753. package/src/security/guardrails/pii-filter.ts +396 -0
  754. package/src/security/index.ts +33 -0
  755. package/src/security/injection/index.ts +5 -0
  756. package/src/security/injection/prompt-injection.ts +64 -0
  757. package/src/security/types.ts +85 -0
  758. package/src/server/cache/crypto.ts +47 -0
  759. package/src/server/cache/performance.ts +79 -0
  760. package/src/server/error-handler.ts +93 -0
  761. package/src/server/errors.ts +73 -0
  762. package/src/server/helpers.ts +944 -0
  763. package/src/server/http.ts +156 -0
  764. package/src/server/index.ts +12 -0
  765. package/src/server/messages/__tests__/messages.test.ts +720 -0
  766. package/src/server/messages/converter.ts +245 -0
  767. package/src/server/messages/data-parts.ts +338 -0
  768. package/src/server/messages/extraction.ts +328 -0
  769. package/src/server/messages/index.ts +126 -0
  770. package/src/server/messages/types.ts +355 -0
  771. package/src/server/messages/window.ts +450 -0
  772. package/src/server/rate-limit/env.ts +8 -0
  773. package/src/server/rate-limit/rate-limit.ts +165 -0
  774. package/src/server/routes/HEALTH_CHECK.md +502 -0
  775. package/src/server/routes/IMPLEMENTATION_SUMMARY.md +432 -0
  776. package/src/server/routes/QUICK_START.md +327 -0
  777. package/src/server/routes/README.md +357 -0
  778. package/src/server/routes/__tests__/routes.test.ts +628 -0
  779. package/src/server/routes/agent-route.ts +224 -0
  780. package/src/server/routes/agent-routes.ts +191 -0
  781. package/src/server/routes/embed-config.ts +181 -0
  782. package/src/server/routes/health-check.example.ts +507 -0
  783. package/src/server/routes/health-check.test.ts +533 -0
  784. package/src/server/routes/health-check.ts +639 -0
  785. package/src/server/routes/health-check.types.ts +217 -0
  786. package/src/server/routes/index.ts +32 -0
  787. package/src/server/routes/types.ts +274 -0
  788. package/src/shared/__tests__/schemas.test.ts +317 -0
  789. package/src/shared/ai-runtime.ts +139 -0
  790. package/src/shared/ai-types.ts +133 -0
  791. package/src/shared/index.ts +30 -0
  792. package/src/shared/sdk-runtime.ts +198 -0
  793. package/src/shared/sdk-types.ts +301 -0
  794. package/src/streaming/control/__tests__/streaming-control.test.ts +708 -0
  795. package/src/streaming/control/budget-guard.ts +264 -0
  796. package/src/streaming/control/controller.ts +255 -0
  797. package/src/streaming/control/index.ts +105 -0
  798. package/src/streaming/control/smoothing.ts +201 -0
  799. package/src/streaming/control/step-limit.ts +215 -0
  800. package/src/streaming/control/types.ts +234 -0
  801. package/src/streaming/core/auto-resume.ts +276 -0
  802. package/src/streaming/core/index.ts +85 -0
  803. package/src/streaming/core/multi-step.ts +471 -0
  804. package/src/streaming/core/protocol.ts +194 -0
  805. package/src/streaming/core/types.ts +182 -0
  806. package/src/streaming/index.ts +97 -0
  807. package/src/streaming/infra/backpressure/buffer.ts +210 -0
  808. package/src/streaming/infra/backpressure/index.ts +6 -0
  809. package/src/streaming/infra/index.ts +75 -0
  810. package/src/streaming/infra/multiplexing/index.ts +311 -0
  811. package/src/streaming/infra/resilience/index.ts +684 -0
  812. package/src/streaming/infra/transform/index.ts +15 -0
  813. package/src/streaming/infra/transform/stream-transforms.ts +166 -0
  814. package/src/streaming/infra/transport/index.ts +774 -0
  815. package/src/streaming/infra/types.ts +118 -0
  816. package/src/streaming/infra-extra/types.ts +118 -0
  817. package/src/tools/advanced/caching.ts +299 -0
  818. package/src/tools/advanced/generator.ts +267 -0
  819. package/src/tools/advanced/hitl.ts +251 -0
  820. package/src/tools/advanced/index.ts +9 -0
  821. package/src/tools/advanced/llm-tool.ts +208 -0
  822. package/src/tools/approval/FILES.md +449 -0
  823. package/src/tools/approval/IMPLEMENTATION_SUMMARY.md +567 -0
  824. package/src/tools/approval/QUICK_START.md +362 -0
  825. package/src/tools/approval/README.md +514 -0
  826. package/src/tools/approval/advanced-approval-queue.ts +7 -0
  827. package/src/tools/approval/approval.example.ts +571 -0
  828. package/src/tools/approval/in-memory-queue.ts +405 -0
  829. package/src/tools/approval/index.ts +737 -0
  830. package/src/tools/approval/middleware.ts +590 -0
  831. package/src/tools/approval/queue-factory.ts +162 -0
  832. package/src/tools/approval/redis-queue.ts +327 -0
  833. package/src/tools/approval/testing.ts +493 -0
  834. package/src/tools/approval/types.ts +221 -0
  835. package/src/tools/approval/with-approval.ts +366 -0
  836. package/src/tools/artifacts/artifact-tools.ts +273 -0
  837. package/src/tools/artifacts/index.ts +6 -0
  838. package/src/tools/compliance/compliance-wrapper.ts +789 -0
  839. package/src/tools/compliance/create-compliant-stream.ts +226 -0
  840. package/src/tools/compliance/index.ts +8 -0
  841. package/src/tools/compliance/phi-redaction.ts +406 -0
  842. package/src/tools/compliance/tool-wrapper.ts +306 -0
  843. package/src/tools/computer/index.ts +99 -0
  844. package/src/tools/computer/types.ts +41 -0
  845. package/src/tools/core/abort.ts +202 -0
  846. package/src/tools/core/factory.ts +197 -0
  847. package/src/tools/core/index.ts +8 -0
  848. package/src/tools/core/tool-safety.ts +112 -0
  849. package/src/tools/generic/index.ts +9 -0
  850. package/src/tools/generic/json-schema-tool.ts +301 -0
  851. package/src/tools/generic/tiptap-context.ts +619 -0
  852. package/src/tools/generic/web-search-tool.ts +82 -0
  853. package/src/tools/generic/web-search.ts +142 -0
  854. package/src/tools/index.ts +36 -0
  855. package/src/tools/mcp/ai-sdk-error-integration.ts +401 -0
  856. package/src/tools/mcp/client.ts +988 -0
  857. package/src/tools/mcp/connection-manager.ts +380 -0
  858. package/src/tools/mcp/connection-pool.ts +408 -0
  859. package/src/tools/mcp/edge-runtime.ts +318 -0
  860. package/src/tools/mcp/environment.ts +310 -0
  861. package/src/tools/mcp/index.ts +20 -0
  862. package/src/tools/mcp/next-pattern.ts +401 -0
  863. package/src/tools/mcp/stream-lifecycle-integration.ts +617 -0
  864. package/src/tools/mcp/tool-cache.ts +359 -0
  865. package/src/tools/mcp/transport-selector.ts +492 -0
  866. package/src/tools/mcp/transports.ts +99 -0
  867. package/src/tools/simple-factory.ts +55 -0
  868. package/src/tools/superpowers/index.ts +122 -0
  869. package/src/tools/superpowers/prompts/index.ts +533 -0
  870. package/src/tools/superpowers/schemas/index.ts +701 -0
  871. package/src/tools/superpowers/tools/index.ts +721 -0
  872. 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
+ };