@lleverage-ai/agent-sdk 0.0.1

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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2321 -0
  3. package/dist/agent.d.ts +52 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +2122 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/backend.d.ts +378 -0
  8. package/dist/backend.d.ts.map +1 -0
  9. package/dist/backend.js +71 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/backends/composite.d.ts +258 -0
  12. package/dist/backends/composite.d.ts.map +1 -0
  13. package/dist/backends/composite.js +437 -0
  14. package/dist/backends/composite.js.map +1 -0
  15. package/dist/backends/filesystem.d.ts +268 -0
  16. package/dist/backends/filesystem.d.ts.map +1 -0
  17. package/dist/backends/filesystem.js +623 -0
  18. package/dist/backends/filesystem.js.map +1 -0
  19. package/dist/backends/index.d.ts +14 -0
  20. package/dist/backends/index.d.ts.map +1 -0
  21. package/dist/backends/index.js +14 -0
  22. package/dist/backends/index.js.map +1 -0
  23. package/dist/backends/persistent.d.ts +312 -0
  24. package/dist/backends/persistent.d.ts.map +1 -0
  25. package/dist/backends/persistent.js +519 -0
  26. package/dist/backends/persistent.js.map +1 -0
  27. package/dist/backends/sandbox.d.ts +315 -0
  28. package/dist/backends/sandbox.d.ts.map +1 -0
  29. package/dist/backends/sandbox.js +490 -0
  30. package/dist/backends/sandbox.js.map +1 -0
  31. package/dist/backends/state.d.ts +225 -0
  32. package/dist/backends/state.d.ts.map +1 -0
  33. package/dist/backends/state.js +396 -0
  34. package/dist/backends/state.js.map +1 -0
  35. package/dist/checkpointer/file-saver.d.ts +182 -0
  36. package/dist/checkpointer/file-saver.d.ts.map +1 -0
  37. package/dist/checkpointer/file-saver.js +298 -0
  38. package/dist/checkpointer/file-saver.js.map +1 -0
  39. package/dist/checkpointer/index.d.ts +40 -0
  40. package/dist/checkpointer/index.d.ts.map +1 -0
  41. package/dist/checkpointer/index.js +40 -0
  42. package/dist/checkpointer/index.js.map +1 -0
  43. package/dist/checkpointer/kv-saver.d.ts +142 -0
  44. package/dist/checkpointer/kv-saver.d.ts.map +1 -0
  45. package/dist/checkpointer/kv-saver.js +176 -0
  46. package/dist/checkpointer/kv-saver.js.map +1 -0
  47. package/dist/checkpointer/memory-saver.d.ts +158 -0
  48. package/dist/checkpointer/memory-saver.d.ts.map +1 -0
  49. package/dist/checkpointer/memory-saver.js +222 -0
  50. package/dist/checkpointer/memory-saver.js.map +1 -0
  51. package/dist/checkpointer/types.d.ts +353 -0
  52. package/dist/checkpointer/types.d.ts.map +1 -0
  53. package/dist/checkpointer/types.js +159 -0
  54. package/dist/checkpointer/types.js.map +1 -0
  55. package/dist/context-manager.d.ts +627 -0
  56. package/dist/context-manager.d.ts.map +1 -0
  57. package/dist/context-manager.js +1039 -0
  58. package/dist/context-manager.js.map +1 -0
  59. package/dist/context.d.ts +57 -0
  60. package/dist/context.d.ts.map +1 -0
  61. package/dist/context.js +76 -0
  62. package/dist/context.js.map +1 -0
  63. package/dist/errors/index.d.ts +611 -0
  64. package/dist/errors/index.d.ts.map +1 -0
  65. package/dist/errors/index.js +1023 -0
  66. package/dist/errors/index.js.map +1 -0
  67. package/dist/generation-helpers.d.ts +126 -0
  68. package/dist/generation-helpers.d.ts.map +1 -0
  69. package/dist/generation-helpers.js +181 -0
  70. package/dist/generation-helpers.js.map +1 -0
  71. package/dist/hooks/audit.d.ts +210 -0
  72. package/dist/hooks/audit.d.ts.map +1 -0
  73. package/dist/hooks/audit.js +305 -0
  74. package/dist/hooks/audit.js.map +1 -0
  75. package/dist/hooks/cache.d.ts +180 -0
  76. package/dist/hooks/cache.d.ts.map +1 -0
  77. package/dist/hooks/cache.js +273 -0
  78. package/dist/hooks/cache.js.map +1 -0
  79. package/dist/hooks/guardrails.d.ts +145 -0
  80. package/dist/hooks/guardrails.d.ts.map +1 -0
  81. package/dist/hooks/guardrails.js +326 -0
  82. package/dist/hooks/guardrails.js.map +1 -0
  83. package/dist/hooks/index.d.ts +18 -0
  84. package/dist/hooks/index.d.ts.map +1 -0
  85. package/dist/hooks/index.js +32 -0
  86. package/dist/hooks/index.js.map +1 -0
  87. package/dist/hooks/logging.d.ts +193 -0
  88. package/dist/hooks/logging.d.ts.map +1 -0
  89. package/dist/hooks/logging.js +345 -0
  90. package/dist/hooks/logging.js.map +1 -0
  91. package/dist/hooks/parallel-guardrails.d.ts +268 -0
  92. package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
  93. package/dist/hooks/parallel-guardrails.js +416 -0
  94. package/dist/hooks/parallel-guardrails.js.map +1 -0
  95. package/dist/hooks/rate-limit.d.ts +305 -0
  96. package/dist/hooks/rate-limit.d.ts.map +1 -0
  97. package/dist/hooks/rate-limit.js +372 -0
  98. package/dist/hooks/rate-limit.js.map +1 -0
  99. package/dist/hooks/retry.d.ts +144 -0
  100. package/dist/hooks/retry.d.ts.map +1 -0
  101. package/dist/hooks/retry.js +210 -0
  102. package/dist/hooks/retry.js.map +1 -0
  103. package/dist/hooks/secrets.d.ts +174 -0
  104. package/dist/hooks/secrets.d.ts.map +1 -0
  105. package/dist/hooks/secrets.js +306 -0
  106. package/dist/hooks/secrets.js.map +1 -0
  107. package/dist/hooks.d.ts +229 -0
  108. package/dist/hooks.d.ts.map +1 -0
  109. package/dist/hooks.js +352 -0
  110. package/dist/hooks.js.map +1 -0
  111. package/dist/index.d.ts +97 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +182 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/mcp/env.d.ts +25 -0
  116. package/dist/mcp/env.d.ts.map +1 -0
  117. package/dist/mcp/env.js +18 -0
  118. package/dist/mcp/env.js.map +1 -0
  119. package/dist/mcp/index.d.ts +16 -0
  120. package/dist/mcp/index.d.ts.map +1 -0
  121. package/dist/mcp/index.js +17 -0
  122. package/dist/mcp/index.js.map +1 -0
  123. package/dist/mcp/manager.d.ts +184 -0
  124. package/dist/mcp/manager.d.ts.map +1 -0
  125. package/dist/mcp/manager.js +446 -0
  126. package/dist/mcp/manager.js.map +1 -0
  127. package/dist/mcp/types.d.ts +58 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +7 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/mcp/validation.d.ts +119 -0
  132. package/dist/mcp/validation.d.ts.map +1 -0
  133. package/dist/mcp/validation.js +407 -0
  134. package/dist/mcp/validation.js.map +1 -0
  135. package/dist/mcp/virtual-server.d.ts +78 -0
  136. package/dist/mcp/virtual-server.d.ts.map +1 -0
  137. package/dist/mcp/virtual-server.js +137 -0
  138. package/dist/mcp/virtual-server.js.map +1 -0
  139. package/dist/memory/filesystem-store.d.ts +217 -0
  140. package/dist/memory/filesystem-store.d.ts.map +1 -0
  141. package/dist/memory/filesystem-store.js +343 -0
  142. package/dist/memory/filesystem-store.js.map +1 -0
  143. package/dist/memory/index.d.ts +46 -0
  144. package/dist/memory/index.d.ts.map +1 -0
  145. package/dist/memory/index.js +46 -0
  146. package/dist/memory/index.js.map +1 -0
  147. package/dist/memory/loader.d.ts +396 -0
  148. package/dist/memory/loader.d.ts.map +1 -0
  149. package/dist/memory/loader.js +419 -0
  150. package/dist/memory/loader.js.map +1 -0
  151. package/dist/memory/permissions.d.ts +282 -0
  152. package/dist/memory/permissions.d.ts.map +1 -0
  153. package/dist/memory/permissions.js +297 -0
  154. package/dist/memory/permissions.js.map +1 -0
  155. package/dist/memory/rules.d.ts +249 -0
  156. package/dist/memory/rules.d.ts.map +1 -0
  157. package/dist/memory/rules.js +362 -0
  158. package/dist/memory/rules.js.map +1 -0
  159. package/dist/memory/store.d.ts +286 -0
  160. package/dist/memory/store.d.ts.map +1 -0
  161. package/dist/memory/store.js +263 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/middleware/apply.d.ts +73 -0
  164. package/dist/middleware/apply.d.ts.map +1 -0
  165. package/dist/middleware/apply.js +219 -0
  166. package/dist/middleware/apply.js.map +1 -0
  167. package/dist/middleware/context.d.ts +33 -0
  168. package/dist/middleware/context.d.ts.map +1 -0
  169. package/dist/middleware/context.js +176 -0
  170. package/dist/middleware/context.js.map +1 -0
  171. package/dist/middleware/index.d.ts +31 -0
  172. package/dist/middleware/index.d.ts.map +1 -0
  173. package/dist/middleware/index.js +32 -0
  174. package/dist/middleware/index.js.map +1 -0
  175. package/dist/middleware/logging.d.ts +137 -0
  176. package/dist/middleware/logging.d.ts.map +1 -0
  177. package/dist/middleware/logging.js +374 -0
  178. package/dist/middleware/logging.js.map +1 -0
  179. package/dist/middleware/types.d.ts +183 -0
  180. package/dist/middleware/types.d.ts.map +1 -0
  181. package/dist/middleware/types.js +11 -0
  182. package/dist/middleware/types.js.map +1 -0
  183. package/dist/observability/events.d.ts +183 -0
  184. package/dist/observability/events.d.ts.map +1 -0
  185. package/dist/observability/events.js +305 -0
  186. package/dist/observability/events.js.map +1 -0
  187. package/dist/observability/index.d.ts +55 -0
  188. package/dist/observability/index.d.ts.map +1 -0
  189. package/dist/observability/index.js +87 -0
  190. package/dist/observability/index.js.map +1 -0
  191. package/dist/observability/logger.d.ts +318 -0
  192. package/dist/observability/logger.d.ts.map +1 -0
  193. package/dist/observability/logger.js +436 -0
  194. package/dist/observability/logger.js.map +1 -0
  195. package/dist/observability/metrics.d.ts +341 -0
  196. package/dist/observability/metrics.d.ts.map +1 -0
  197. package/dist/observability/metrics.js +490 -0
  198. package/dist/observability/metrics.js.map +1 -0
  199. package/dist/observability/preset.d.ts +161 -0
  200. package/dist/observability/preset.d.ts.map +1 -0
  201. package/dist/observability/preset.js +133 -0
  202. package/dist/observability/preset.js.map +1 -0
  203. package/dist/observability/streaming.d.ts +113 -0
  204. package/dist/observability/streaming.d.ts.map +1 -0
  205. package/dist/observability/streaming.js +114 -0
  206. package/dist/observability/streaming.js.map +1 -0
  207. package/dist/observability/tracing.d.ts +378 -0
  208. package/dist/observability/tracing.d.ts.map +1 -0
  209. package/dist/observability/tracing.js +539 -0
  210. package/dist/observability/tracing.js.map +1 -0
  211. package/dist/plugins.d.ts +55 -0
  212. package/dist/plugins.d.ts.map +1 -0
  213. package/dist/plugins.js +63 -0
  214. package/dist/plugins.js.map +1 -0
  215. package/dist/presets/index.d.ts +7 -0
  216. package/dist/presets/index.d.ts.map +1 -0
  217. package/dist/presets/index.js +7 -0
  218. package/dist/presets/index.js.map +1 -0
  219. package/dist/presets/production.d.ts +262 -0
  220. package/dist/presets/production.d.ts.map +1 -0
  221. package/dist/presets/production.js +295 -0
  222. package/dist/presets/production.js.map +1 -0
  223. package/dist/security/index.d.ts +179 -0
  224. package/dist/security/index.d.ts.map +1 -0
  225. package/dist/security/index.js +323 -0
  226. package/dist/security/index.js.map +1 -0
  227. package/dist/subagents/advanced.d.ts +413 -0
  228. package/dist/subagents/advanced.d.ts.map +1 -0
  229. package/dist/subagents/advanced.js +396 -0
  230. package/dist/subagents/advanced.js.map +1 -0
  231. package/dist/subagents/index.d.ts +14 -0
  232. package/dist/subagents/index.d.ts.map +1 -0
  233. package/dist/subagents/index.js +15 -0
  234. package/dist/subagents/index.js.map +1 -0
  235. package/dist/subagents.d.ts +73 -0
  236. package/dist/subagents.d.ts.map +1 -0
  237. package/dist/subagents.js +213 -0
  238. package/dist/subagents.js.map +1 -0
  239. package/dist/task-store/file-store.d.ts +76 -0
  240. package/dist/task-store/file-store.d.ts.map +1 -0
  241. package/dist/task-store/file-store.js +190 -0
  242. package/dist/task-store/file-store.js.map +1 -0
  243. package/dist/task-store/index.d.ts +11 -0
  244. package/dist/task-store/index.d.ts.map +1 -0
  245. package/dist/task-store/index.js +10 -0
  246. package/dist/task-store/index.js.map +1 -0
  247. package/dist/task-store/kv-store.d.ts +140 -0
  248. package/dist/task-store/kv-store.d.ts.map +1 -0
  249. package/dist/task-store/kv-store.js +169 -0
  250. package/dist/task-store/kv-store.js.map +1 -0
  251. package/dist/task-store/memory-store.d.ts +66 -0
  252. package/dist/task-store/memory-store.d.ts.map +1 -0
  253. package/dist/task-store/memory-store.js +125 -0
  254. package/dist/task-store/memory-store.js.map +1 -0
  255. package/dist/task-store/types.d.ts +235 -0
  256. package/dist/task-store/types.d.ts.map +1 -0
  257. package/dist/task-store/types.js +110 -0
  258. package/dist/task-store/types.js.map +1 -0
  259. package/dist/testing/assertions.d.ts +401 -0
  260. package/dist/testing/assertions.d.ts.map +1 -0
  261. package/dist/testing/assertions.js +630 -0
  262. package/dist/testing/assertions.js.map +1 -0
  263. package/dist/testing/index.d.ts +343 -0
  264. package/dist/testing/index.d.ts.map +1 -0
  265. package/dist/testing/index.js +360 -0
  266. package/dist/testing/index.js.map +1 -0
  267. package/dist/testing/mock-agent.d.ts +214 -0
  268. package/dist/testing/mock-agent.d.ts.map +1 -0
  269. package/dist/testing/mock-agent.js +448 -0
  270. package/dist/testing/mock-agent.js.map +1 -0
  271. package/dist/testing/recorder.d.ts +288 -0
  272. package/dist/testing/recorder.d.ts.map +1 -0
  273. package/dist/testing/recorder.js +499 -0
  274. package/dist/testing/recorder.js.map +1 -0
  275. package/dist/tools/execute.d.ts +104 -0
  276. package/dist/tools/execute.d.ts.map +1 -0
  277. package/dist/tools/execute.js +191 -0
  278. package/dist/tools/execute.js.map +1 -0
  279. package/dist/tools/factory.d.ts +260 -0
  280. package/dist/tools/factory.d.ts.map +1 -0
  281. package/dist/tools/factory.js +241 -0
  282. package/dist/tools/factory.js.map +1 -0
  283. package/dist/tools/filesystem.d.ts +215 -0
  284. package/dist/tools/filesystem.d.ts.map +1 -0
  285. package/dist/tools/filesystem.js +311 -0
  286. package/dist/tools/filesystem.js.map +1 -0
  287. package/dist/tools/index.d.ts +33 -0
  288. package/dist/tools/index.d.ts.map +1 -0
  289. package/dist/tools/index.js +33 -0
  290. package/dist/tools/index.js.map +1 -0
  291. package/dist/tools/search.d.ts +59 -0
  292. package/dist/tools/search.d.ts.map +1 -0
  293. package/dist/tools/search.js +94 -0
  294. package/dist/tools/search.js.map +1 -0
  295. package/dist/tools/skills.d.ts +354 -0
  296. package/dist/tools/skills.d.ts.map +1 -0
  297. package/dist/tools/skills.js +413 -0
  298. package/dist/tools/skills.js.map +1 -0
  299. package/dist/tools/task.d.ts +272 -0
  300. package/dist/tools/task.d.ts.map +1 -0
  301. package/dist/tools/task.js +521 -0
  302. package/dist/tools/task.js.map +1 -0
  303. package/dist/tools/todos.d.ts +131 -0
  304. package/dist/tools/todos.d.ts.map +1 -0
  305. package/dist/tools/todos.js +120 -0
  306. package/dist/tools/todos.js.map +1 -0
  307. package/dist/tools/tool-registry.d.ts +424 -0
  308. package/dist/tools/tool-registry.d.ts.map +1 -0
  309. package/dist/tools/tool-registry.js +607 -0
  310. package/dist/tools/tool-registry.js.map +1 -0
  311. package/dist/tools/user-interaction.d.ts +116 -0
  312. package/dist/tools/user-interaction.d.ts.map +1 -0
  313. package/dist/tools/user-interaction.js +147 -0
  314. package/dist/tools/user-interaction.js.map +1 -0
  315. package/dist/tools/utils.d.ts +124 -0
  316. package/dist/tools/utils.d.ts.map +1 -0
  317. package/dist/tools/utils.js +189 -0
  318. package/dist/tools/utils.js.map +1 -0
  319. package/dist/tools.d.ts +74 -0
  320. package/dist/tools.d.ts.map +1 -0
  321. package/dist/tools.js +73 -0
  322. package/dist/tools.js.map +1 -0
  323. package/dist/types.d.ts +2421 -0
  324. package/dist/types.d.ts.map +1 -0
  325. package/dist/types.js +55 -0
  326. package/dist/types.js.map +1 -0
  327. package/package.json +81 -0
@@ -0,0 +1,416 @@
1
+ /**
2
+ * Guardrails - Content moderation utilities for AI generation.
3
+ *
4
+ * This module provides a simple, composable approach to content moderation:
5
+ * - Guardrails are just async functions that return pass/block results
6
+ * - Multiple guardrails can race against generation
7
+ * - First failure aborts everything via shared AbortSignal
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import { GeneratePermissionDeniedError } from "../errors/index.js";
12
+ // =============================================================================
13
+ // Core Utility
14
+ // =============================================================================
15
+ /**
16
+ * Race multiple guardrails - first failure blocks, all run in parallel.
17
+ *
18
+ * Returns a Promise that resolves when all guardrails pass, or rejects
19
+ * with GeneratePermissionDeniedError if any guardrail blocks.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const controller = new AbortController();
24
+ *
25
+ * // Start guardrails and generation in parallel
26
+ * const guardrailsPromise = raceGuardrails(
27
+ * text,
28
+ * [regexGuardrail, llmGuardrail],
29
+ * controller.signal,
30
+ * {
31
+ * blockedMessage: "Content blocked",
32
+ * onBlock: () => controller.abort(),
33
+ * }
34
+ * );
35
+ *
36
+ * const generation = agent.streamRaw({
37
+ * messages,
38
+ * signal: controller.signal,
39
+ * });
40
+ *
41
+ * // Wait for guardrails to pass (or throw)
42
+ * await guardrailsPromise;
43
+ * ```
44
+ */
45
+ export async function raceGuardrails(text, guardrails, signal, options = {}) {
46
+ if (guardrails.length === 0)
47
+ return;
48
+ // Run all guardrails in parallel
49
+ const results = await Promise.all(guardrails.map((guardrail) => guardrail(text, signal)));
50
+ // Check for any failures
51
+ const failed = results.find((r) => r.blocked);
52
+ if (failed) {
53
+ throw new GeneratePermissionDeniedError(options.blockedMessage || failed.reason || "Content blocked by guardrail", {
54
+ reason: failed.reason,
55
+ blockedMessageIds: failed.blockedMessageIds || options.blockedMessageIds,
56
+ });
57
+ }
58
+ }
59
+ /**
60
+ * Run guardrails in parallel with generation, aborting on first failure.
61
+ *
62
+ * This is a convenience wrapper that sets up the abort controller and
63
+ * coordinates guardrails with the generation function.
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const result = await runWithGuardrails(
68
+ * extractText(messages),
69
+ * [regexGuardrail, llmGuardrail],
70
+ * (signal) => agent.generate({ messages, signal })
71
+ * );
72
+ * ```
73
+ */
74
+ export async function runWithGuardrails(text, guardrails, generateFn, options = {}) {
75
+ const controller = new AbortController();
76
+ // Start guardrails check
77
+ const guardrailsPromise = raceGuardrails(text, guardrails, controller.signal, options).catch((error) => {
78
+ // On guardrail failure, abort generation
79
+ controller.abort();
80
+ throw error;
81
+ });
82
+ // Start generation in parallel
83
+ const generationPromise = generateFn(controller.signal);
84
+ // Wait for both - guardrails failure will abort generation
85
+ try {
86
+ const [, result] = await Promise.all([guardrailsPromise, generationPromise]);
87
+ return result;
88
+ }
89
+ catch (error) {
90
+ // If it's already a GeneratePermissionDeniedError, rethrow
91
+ if (error instanceof GeneratePermissionDeniedError) {
92
+ throw error;
93
+ }
94
+ // If generation was aborted due to guardrail, the guardrailsPromise
95
+ // will have the actual error
96
+ throw error;
97
+ }
98
+ }
99
+ // =============================================================================
100
+ // Helper Factories
101
+ // =============================================================================
102
+ /**
103
+ * Create a regex-based guardrail.
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * const noSecrets = createRegexGuardrail([
108
+ * /SECRET_API_KEY/i,
109
+ * /password\s*=\s*["'][^"']+["']/i,
110
+ * ], "Contains sensitive data");
111
+ * ```
112
+ */
113
+ export function createRegexGuardrail(patterns, reason) {
114
+ return async (text) => {
115
+ for (const pattern of patterns) {
116
+ if (pattern.test(text)) {
117
+ return {
118
+ blocked: true,
119
+ reason: reason || `Content matches blocked pattern: ${pattern}`,
120
+ };
121
+ }
122
+ }
123
+ return { blocked: false };
124
+ };
125
+ }
126
+ /**
127
+ * Create a guardrail with a timeout.
128
+ *
129
+ * If the guardrail doesn't complete within the timeout, it returns
130
+ * a non-blocking result (fail-open behavior).
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * const timedLLMGuardrail = withTimeout(llmGuardrail, 5000);
135
+ * ```
136
+ */
137
+ export function withTimeout(guardrail, timeoutMs, failOpen = true) {
138
+ return async (text, signal) => {
139
+ const timeoutPromise = new Promise((resolve) => {
140
+ setTimeout(() => {
141
+ if (failOpen) {
142
+ resolve({ blocked: false });
143
+ }
144
+ else {
145
+ resolve({ blocked: true, reason: "Guardrail check timed out" });
146
+ }
147
+ }, timeoutMs);
148
+ });
149
+ return Promise.race([guardrail(text, signal), timeoutPromise]);
150
+ };
151
+ }
152
+ // =============================================================================
153
+ // Text Extraction Utilities
154
+ // =============================================================================
155
+ /**
156
+ * Extract text content from UI messages.
157
+ */
158
+ export function extractTextFromMessages(messages) {
159
+ const texts = [];
160
+ for (const msg of messages) {
161
+ if (msg.parts) {
162
+ for (const part of msg.parts) {
163
+ if (part.type === "text" && part.text) {
164
+ texts.push(part.text);
165
+ }
166
+ }
167
+ }
168
+ }
169
+ return texts.join("\n");
170
+ }
171
+ /**
172
+ * Find the last user message ID from a list of messages.
173
+ */
174
+ export function findLastUserMessageId(messages) {
175
+ for (let i = messages.length - 1; i >= 0; i--) {
176
+ const msg = messages[i];
177
+ if (msg && msg.role === "user") {
178
+ return msg.id;
179
+ }
180
+ }
181
+ return undefined;
182
+ }
183
+ /**
184
+ * Controller for buffered output guardrails.
185
+ *
186
+ * Buffers output content and runs guardrail checks before releasing
187
+ * content to the client.
188
+ */
189
+ export class BufferedOutputGuardrail {
190
+ buffer = "";
191
+ chunks = [];
192
+ state = "buffering";
193
+ blockReason = null;
194
+ abortController;
195
+ checkPromise = null;
196
+ lastCheckTime = 0;
197
+ guardrails;
198
+ config;
199
+ constructor(config) {
200
+ this.abortController = new AbortController();
201
+ this.guardrails = Array.isArray(config.guardrails) ? config.guardrails : [config.guardrails];
202
+ this.config = {
203
+ minBufferSize: 100,
204
+ timeout: 30000,
205
+ blockedMessage: "Output blocked by guardrail",
206
+ ...config,
207
+ };
208
+ }
209
+ /** Get current state of the guardrail. */
210
+ get currentState() {
211
+ return this.state;
212
+ }
213
+ /** Get the block reason (if blocked). */
214
+ get reason() {
215
+ return this.blockReason;
216
+ }
217
+ /** Get the abort signal. */
218
+ get signal() {
219
+ return this.abortController.signal;
220
+ }
221
+ /** Check if guardrail is still buffering. */
222
+ isBuffering() {
223
+ return this.state === "buffering";
224
+ }
225
+ /** Check if guardrail has passed. */
226
+ hasPassed() {
227
+ return this.state === "passed";
228
+ }
229
+ /** Check if guardrail has blocked content. */
230
+ hasBlocked() {
231
+ return this.state === "blocked";
232
+ }
233
+ /**
234
+ * Add content to the buffer.
235
+ * Returns true if content should be forwarded, false if blocked.
236
+ */
237
+ addContent(text) {
238
+ if (this.state === "blocked") {
239
+ return false;
240
+ }
241
+ this.buffer += text;
242
+ // Check if we should run async check
243
+ const shouldCheck = this.buffer.length >= this.config.minBufferSize && !this.checkPromise;
244
+ // Check if periodic check is due
245
+ const periodicCheckDue = this.config.checkIntervalMs && Date.now() - this.lastCheckTime >= this.config.checkIntervalMs;
246
+ if (shouldCheck || periodicCheckDue) {
247
+ this.startCheck();
248
+ }
249
+ return true;
250
+ }
251
+ /**
252
+ * Add a chunk to the buffer for later flushing.
253
+ */
254
+ addChunk(chunk) {
255
+ if (this.state === "blocked") {
256
+ return false;
257
+ }
258
+ this.chunks.push(chunk);
259
+ return true;
260
+ }
261
+ startCheck() {
262
+ if (this.checkPromise)
263
+ return;
264
+ this.lastCheckTime = Date.now();
265
+ const timedGuardrails = this.guardrails.map((g) => withTimeout(g, this.config.timeout));
266
+ this.checkPromise = raceGuardrails(this.buffer, timedGuardrails, this.abortController.signal, {
267
+ blockedMessage: this.config.blockedMessage,
268
+ })
269
+ .catch((error) => {
270
+ if (error instanceof GeneratePermissionDeniedError) {
271
+ this.state = "blocked";
272
+ this.blockReason = error.reason || this.config.blockedMessage;
273
+ this.abortController.abort();
274
+ }
275
+ throw error;
276
+ })
277
+ .finally(() => {
278
+ this.checkPromise = null;
279
+ });
280
+ }
281
+ /**
282
+ * Finalize the guardrail check.
283
+ * Call this when output is complete to ensure final check passes.
284
+ */
285
+ async finalize() {
286
+ if (this.state === "blocked") {
287
+ throw new GeneratePermissionDeniedError(this.config.blockedMessage, {
288
+ reason: this.blockReason || this.config.blockedMessage,
289
+ });
290
+ }
291
+ // Wait for any pending check - if it failed, the error will propagate
292
+ if (this.checkPromise) {
293
+ await this.checkPromise;
294
+ }
295
+ // Run final check if we have content
296
+ if (this.buffer.length > 0) {
297
+ const timedGuardrails = this.guardrails.map((g) => withTimeout(g, this.config.timeout));
298
+ try {
299
+ await raceGuardrails(this.buffer, timedGuardrails, this.abortController.signal, {
300
+ blockedMessage: this.config.blockedMessage,
301
+ });
302
+ }
303
+ catch (error) {
304
+ if (error instanceof GeneratePermissionDeniedError) {
305
+ this.state = "blocked";
306
+ this.blockReason = error.reason || this.config.blockedMessage;
307
+ throw error;
308
+ }
309
+ throw error;
310
+ }
311
+ }
312
+ this.state = "passed";
313
+ }
314
+ /** Get the buffered content. */
315
+ getBuffer() {
316
+ return this.buffer;
317
+ }
318
+ /** Get the buffered chunks. */
319
+ getChunks() {
320
+ return this.chunks;
321
+ }
322
+ /** Clear the buffer and chunks. */
323
+ clear() {
324
+ this.buffer = "";
325
+ this.chunks = [];
326
+ }
327
+ /** Abort the guardrail. */
328
+ abort() {
329
+ this.abortController.abort();
330
+ this.state = "error";
331
+ }
332
+ }
333
+ /**
334
+ * Creates a buffered output guardrail.
335
+ *
336
+ * @example
337
+ * ```typescript
338
+ * const guardrail = createBufferedOutputGuardrail({
339
+ * guardrails: [noSecretsGuardrail, noPIIGuardrail],
340
+ * minBufferSize: 100,
341
+ * });
342
+ *
343
+ * for await (const chunk of stream) {
344
+ * if (chunk.type === 'text-delta') {
345
+ * if (!guardrail.addContent(chunk.delta)) break;
346
+ * }
347
+ * guardrail.addChunk(chunk);
348
+ * }
349
+ *
350
+ * await guardrail.finalize();
351
+ * for (const chunk of guardrail.getChunks()) {
352
+ * writer.write(chunk);
353
+ * }
354
+ * ```
355
+ */
356
+ export function createBufferedOutputGuardrail(config) {
357
+ return new BufferedOutputGuardrail(config);
358
+ }
359
+ /**
360
+ * Wraps a ReadableStream with buffered output guardrails.
361
+ *
362
+ * @example
363
+ * ```typescript
364
+ * const guardedStream = wrapStreamWithOutputGuardrail(sourceStream, {
365
+ * guardrails: noSecretsGuardrail,
366
+ * });
367
+ *
368
+ * for await (const chunk of guardedStream) {
369
+ * writer.write(chunk);
370
+ * }
371
+ * ```
372
+ */
373
+ export function wrapStreamWithOutputGuardrail(stream, config) {
374
+ const guardrail = createBufferedOutputGuardrail(config);
375
+ const chunks = [];
376
+ return new ReadableStream({
377
+ async start(controller) {
378
+ const reader = stream.getReader();
379
+ try {
380
+ while (true) {
381
+ const { done, value } = await reader.read();
382
+ if (done) {
383
+ await guardrail.finalize();
384
+ for (const chunk of chunks) {
385
+ controller.enqueue(chunk);
386
+ }
387
+ controller.close();
388
+ break;
389
+ }
390
+ if (value) {
391
+ let textContent;
392
+ if (value.type === "text-delta" && value.delta) {
393
+ textContent = value.delta;
394
+ }
395
+ else if (value.type === "text" && value.text) {
396
+ textContent = value.text;
397
+ }
398
+ if (textContent && !guardrail.addContent(textContent)) {
399
+ controller.error(new GeneratePermissionDeniedError(config.blockedMessage || "Output blocked by guardrail", { reason: guardrail.reason || undefined }));
400
+ return;
401
+ }
402
+ chunks.push(value);
403
+ }
404
+ }
405
+ }
406
+ catch (error) {
407
+ reader.releaseLock();
408
+ controller.error(error);
409
+ }
410
+ finally {
411
+ reader.releaseLock();
412
+ }
413
+ },
414
+ });
415
+ }
416
+ //# sourceMappingURL=parallel-guardrails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-guardrails.js","sourceRoot":"","sources":["../../src/hooks/parallel-guardrails.ts"],"names":[],"mappings":"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"}