@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.
- package/LICENSE +21 -0
- package/README.md +2321 -0
- package/dist/agent.d.ts +52 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +2122 -0
- package/dist/agent.js.map +1 -0
- package/dist/backend.d.ts +378 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +71 -0
- package/dist/backend.js.map +1 -0
- package/dist/backends/composite.d.ts +258 -0
- package/dist/backends/composite.d.ts.map +1 -0
- package/dist/backends/composite.js +437 -0
- package/dist/backends/composite.js.map +1 -0
- package/dist/backends/filesystem.d.ts +268 -0
- package/dist/backends/filesystem.d.ts.map +1 -0
- package/dist/backends/filesystem.js +623 -0
- package/dist/backends/filesystem.js.map +1 -0
- package/dist/backends/index.d.ts +14 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +14 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/persistent.d.ts +312 -0
- package/dist/backends/persistent.d.ts.map +1 -0
- package/dist/backends/persistent.js +519 -0
- package/dist/backends/persistent.js.map +1 -0
- package/dist/backends/sandbox.d.ts +315 -0
- package/dist/backends/sandbox.d.ts.map +1 -0
- package/dist/backends/sandbox.js +490 -0
- package/dist/backends/sandbox.js.map +1 -0
- package/dist/backends/state.d.ts +225 -0
- package/dist/backends/state.d.ts.map +1 -0
- package/dist/backends/state.js +396 -0
- package/dist/backends/state.js.map +1 -0
- package/dist/checkpointer/file-saver.d.ts +182 -0
- package/dist/checkpointer/file-saver.d.ts.map +1 -0
- package/dist/checkpointer/file-saver.js +298 -0
- package/dist/checkpointer/file-saver.js.map +1 -0
- package/dist/checkpointer/index.d.ts +40 -0
- package/dist/checkpointer/index.d.ts.map +1 -0
- package/dist/checkpointer/index.js +40 -0
- package/dist/checkpointer/index.js.map +1 -0
- package/dist/checkpointer/kv-saver.d.ts +142 -0
- package/dist/checkpointer/kv-saver.d.ts.map +1 -0
- package/dist/checkpointer/kv-saver.js +176 -0
- package/dist/checkpointer/kv-saver.js.map +1 -0
- package/dist/checkpointer/memory-saver.d.ts +158 -0
- package/dist/checkpointer/memory-saver.d.ts.map +1 -0
- package/dist/checkpointer/memory-saver.js +222 -0
- package/dist/checkpointer/memory-saver.js.map +1 -0
- package/dist/checkpointer/types.d.ts +353 -0
- package/dist/checkpointer/types.d.ts.map +1 -0
- package/dist/checkpointer/types.js +159 -0
- package/dist/checkpointer/types.js.map +1 -0
- package/dist/context-manager.d.ts +627 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +1039 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/context.d.ts +57 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +76 -0
- package/dist/context.js.map +1 -0
- package/dist/errors/index.d.ts +611 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +1023 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/generation-helpers.d.ts +126 -0
- package/dist/generation-helpers.d.ts.map +1 -0
- package/dist/generation-helpers.js +181 -0
- package/dist/generation-helpers.js.map +1 -0
- package/dist/hooks/audit.d.ts +210 -0
- package/dist/hooks/audit.d.ts.map +1 -0
- package/dist/hooks/audit.js +305 -0
- package/dist/hooks/audit.js.map +1 -0
- package/dist/hooks/cache.d.ts +180 -0
- package/dist/hooks/cache.d.ts.map +1 -0
- package/dist/hooks/cache.js +273 -0
- package/dist/hooks/cache.js.map +1 -0
- package/dist/hooks/guardrails.d.ts +145 -0
- package/dist/hooks/guardrails.d.ts.map +1 -0
- package/dist/hooks/guardrails.js +326 -0
- package/dist/hooks/guardrails.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +32 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/logging.d.ts +193 -0
- package/dist/hooks/logging.d.ts.map +1 -0
- package/dist/hooks/logging.js +345 -0
- package/dist/hooks/logging.js.map +1 -0
- package/dist/hooks/parallel-guardrails.d.ts +268 -0
- package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
- package/dist/hooks/parallel-guardrails.js +416 -0
- package/dist/hooks/parallel-guardrails.js.map +1 -0
- package/dist/hooks/rate-limit.d.ts +305 -0
- package/dist/hooks/rate-limit.d.ts.map +1 -0
- package/dist/hooks/rate-limit.js +372 -0
- package/dist/hooks/rate-limit.js.map +1 -0
- package/dist/hooks/retry.d.ts +144 -0
- package/dist/hooks/retry.d.ts.map +1 -0
- package/dist/hooks/retry.js +210 -0
- package/dist/hooks/retry.js.map +1 -0
- package/dist/hooks/secrets.d.ts +174 -0
- package/dist/hooks/secrets.d.ts.map +1 -0
- package/dist/hooks/secrets.js +306 -0
- package/dist/hooks/secrets.js.map +1 -0
- package/dist/hooks.d.ts +229 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +352 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/env.d.ts +25 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +18 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/index.d.ts +16 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +184 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +446 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +58 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/validation.d.ts +119 -0
- package/dist/mcp/validation.d.ts.map +1 -0
- package/dist/mcp/validation.js +407 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/mcp/virtual-server.d.ts +78 -0
- package/dist/mcp/virtual-server.d.ts.map +1 -0
- package/dist/mcp/virtual-server.js +137 -0
- package/dist/mcp/virtual-server.js.map +1 -0
- package/dist/memory/filesystem-store.d.ts +217 -0
- package/dist/memory/filesystem-store.d.ts.map +1 -0
- package/dist/memory/filesystem-store.js +343 -0
- package/dist/memory/filesystem-store.js.map +1 -0
- package/dist/memory/index.d.ts +46 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +46 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/loader.d.ts +396 -0
- package/dist/memory/loader.d.ts.map +1 -0
- package/dist/memory/loader.js +419 -0
- package/dist/memory/loader.js.map +1 -0
- package/dist/memory/permissions.d.ts +282 -0
- package/dist/memory/permissions.d.ts.map +1 -0
- package/dist/memory/permissions.js +297 -0
- package/dist/memory/permissions.js.map +1 -0
- package/dist/memory/rules.d.ts +249 -0
- package/dist/memory/rules.d.ts.map +1 -0
- package/dist/memory/rules.js +362 -0
- package/dist/memory/rules.js.map +1 -0
- package/dist/memory/store.d.ts +286 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +263 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/middleware/apply.d.ts +73 -0
- package/dist/middleware/apply.d.ts.map +1 -0
- package/dist/middleware/apply.js +219 -0
- package/dist/middleware/apply.js.map +1 -0
- package/dist/middleware/context.d.ts +33 -0
- package/dist/middleware/context.d.ts.map +1 -0
- package/dist/middleware/context.js +176 -0
- package/dist/middleware/context.js.map +1 -0
- package/dist/middleware/index.d.ts +31 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +32 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logging.d.ts +137 -0
- package/dist/middleware/logging.d.ts.map +1 -0
- package/dist/middleware/logging.js +374 -0
- package/dist/middleware/logging.js.map +1 -0
- package/dist/middleware/types.d.ts +183 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +11 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/observability/events.d.ts +183 -0
- package/dist/observability/events.d.ts.map +1 -0
- package/dist/observability/events.js +305 -0
- package/dist/observability/events.js.map +1 -0
- package/dist/observability/index.d.ts +55 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +87 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +318 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +436 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +341 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +490 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/preset.d.ts +161 -0
- package/dist/observability/preset.d.ts.map +1 -0
- package/dist/observability/preset.js +133 -0
- package/dist/observability/preset.js.map +1 -0
- package/dist/observability/streaming.d.ts +113 -0
- package/dist/observability/streaming.d.ts.map +1 -0
- package/dist/observability/streaming.js +114 -0
- package/dist/observability/streaming.js.map +1 -0
- package/dist/observability/tracing.d.ts +378 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +539 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/plugins.d.ts +55 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +63 -0
- package/dist/plugins.js.map +1 -0
- package/dist/presets/index.d.ts +7 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +7 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/production.d.ts +262 -0
- package/dist/presets/production.d.ts.map +1 -0
- package/dist/presets/production.js +295 -0
- package/dist/presets/production.js.map +1 -0
- package/dist/security/index.d.ts +179 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +323 -0
- package/dist/security/index.js.map +1 -0
- package/dist/subagents/advanced.d.ts +413 -0
- package/dist/subagents/advanced.d.ts.map +1 -0
- package/dist/subagents/advanced.js +396 -0
- package/dist/subagents/advanced.js.map +1 -0
- package/dist/subagents/index.d.ts +14 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +15 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents.d.ts +73 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +213 -0
- package/dist/subagents.js.map +1 -0
- package/dist/task-store/file-store.d.ts +76 -0
- package/dist/task-store/file-store.d.ts.map +1 -0
- package/dist/task-store/file-store.js +190 -0
- package/dist/task-store/file-store.js.map +1 -0
- package/dist/task-store/index.d.ts +11 -0
- package/dist/task-store/index.d.ts.map +1 -0
- package/dist/task-store/index.js +10 -0
- package/dist/task-store/index.js.map +1 -0
- package/dist/task-store/kv-store.d.ts +140 -0
- package/dist/task-store/kv-store.d.ts.map +1 -0
- package/dist/task-store/kv-store.js +169 -0
- package/dist/task-store/kv-store.js.map +1 -0
- package/dist/task-store/memory-store.d.ts +66 -0
- package/dist/task-store/memory-store.d.ts.map +1 -0
- package/dist/task-store/memory-store.js +125 -0
- package/dist/task-store/memory-store.js.map +1 -0
- package/dist/task-store/types.d.ts +235 -0
- package/dist/task-store/types.d.ts.map +1 -0
- package/dist/task-store/types.js +110 -0
- package/dist/task-store/types.js.map +1 -0
- package/dist/testing/assertions.d.ts +401 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +630 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/index.d.ts +343 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +360 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-agent.d.ts +214 -0
- package/dist/testing/mock-agent.d.ts.map +1 -0
- package/dist/testing/mock-agent.js +448 -0
- package/dist/testing/mock-agent.js.map +1 -0
- package/dist/testing/recorder.d.ts +288 -0
- package/dist/testing/recorder.d.ts.map +1 -0
- package/dist/testing/recorder.js +499 -0
- package/dist/testing/recorder.js.map +1 -0
- package/dist/tools/execute.d.ts +104 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +191 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/factory.d.ts +260 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +241 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/filesystem.d.ts +215 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +311 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +59 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +94 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/skills.d.ts +354 -0
- package/dist/tools/skills.d.ts.map +1 -0
- package/dist/tools/skills.js +413 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/task.d.ts +272 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +521 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todos.d.ts +131 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +120 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +424 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +607 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/user-interaction.d.ts +116 -0
- package/dist/tools/user-interaction.d.ts.map +1 -0
- package/dist/tools/user-interaction.js +147 -0
- package/dist/tools/user-interaction.js.map +1 -0
- package/dist/tools/utils.d.ts +124 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +189 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools.d.ts +74 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +73 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +2421 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- 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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"}
|