@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,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets filtering hook utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides hooks to detect and redact common secret patterns in inputs
|
|
5
|
+
* and outputs using the unified hook system.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Common secret patterns for automatic detection.
|
|
11
|
+
*
|
|
12
|
+
* @category Hooks
|
|
13
|
+
*/
|
|
14
|
+
export const COMMON_SECRET_PATTERNS = {
|
|
15
|
+
/** AWS access keys (AKIA...) */
|
|
16
|
+
AWS_ACCESS_KEY: /AKIA[0-9A-Z]{16}/g,
|
|
17
|
+
/** AWS secret keys (40 chars base64) */
|
|
18
|
+
AWS_SECRET_KEY: /[A-Za-z0-9/+=]{40}/g,
|
|
19
|
+
/** GitHub personal access tokens */
|
|
20
|
+
GITHUB_TOKEN: /ghp_[A-Za-z0-9]{36}/g,
|
|
21
|
+
/** GitHub OAuth tokens */
|
|
22
|
+
GITHUB_OAUTH: /gho_[A-Za-z0-9]{36}/g,
|
|
23
|
+
/** Generic API keys (common formats) */
|
|
24
|
+
API_KEY: /api[_-]?key[_-]?[=:]\s*['""]?[A-Za-z0-9_-]{20,}['""]?/gi,
|
|
25
|
+
/** Bearer tokens */
|
|
26
|
+
BEARER_TOKEN: /Bearer\s+[A-Za-z0-9_\-.]+/gi,
|
|
27
|
+
/** JWT tokens */
|
|
28
|
+
JWT: /eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*/g,
|
|
29
|
+
/** Private keys (PEM format headers) */
|
|
30
|
+
PRIVATE_KEY: /-----BEGIN\s+(?:RSA|EC|OPENSSH|DSA)?\s*PRIVATE KEY-----[\s\S]*?-----END\s+(?:RSA|EC|OPENSSH|DSA)?\s*PRIVATE KEY-----/g,
|
|
31
|
+
/** Generic passwords in common formats */
|
|
32
|
+
PASSWORD: /password[_-]?[=:]\s*['""]?[^\s'"",;]{6,}['""]?/gi,
|
|
33
|
+
/** Slack tokens */
|
|
34
|
+
SLACK_TOKEN: /xox[baprs]-[0-9a-zA-Z]{10,48}/g,
|
|
35
|
+
/** Stripe API keys */
|
|
36
|
+
STRIPE_KEY: /sk_(?:live|test)_[0-9a-zA-Z]{24,}/g,
|
|
37
|
+
/** Generic secrets in common formats */
|
|
38
|
+
GENERIC_SECRET: /secret[_-]?[=:]\s*['""]?[A-Za-z0-9_-]{20,}['""]?/gi,
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Redacts secrets in text using the provided patterns.
|
|
42
|
+
*/
|
|
43
|
+
function redactSecrets(text, patterns, redactionText, onDetected) {
|
|
44
|
+
let redacted = text;
|
|
45
|
+
for (const pattern of patterns) {
|
|
46
|
+
// Reset lastIndex for global patterns
|
|
47
|
+
pattern.lastIndex = 0;
|
|
48
|
+
// Find all matches first (for callback)
|
|
49
|
+
if (onDetected) {
|
|
50
|
+
const matches = text.match(pattern);
|
|
51
|
+
if (matches) {
|
|
52
|
+
for (const match of matches) {
|
|
53
|
+
onDetected(pattern, match);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Redact all matches
|
|
58
|
+
redacted = redacted.replace(pattern, redactionText);
|
|
59
|
+
}
|
|
60
|
+
return redacted;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extracts and redacts text from messages.
|
|
64
|
+
*/
|
|
65
|
+
function redactMessages(messages = [], patterns, redactionText, onDetected) {
|
|
66
|
+
return messages.map((msg) => {
|
|
67
|
+
if (typeof msg !== "object" || msg === null)
|
|
68
|
+
return msg;
|
|
69
|
+
const content = msg.content;
|
|
70
|
+
if (typeof content === "string") {
|
|
71
|
+
return {
|
|
72
|
+
...msg,
|
|
73
|
+
content: redactSecrets(content, patterns, redactionText, onDetected),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
else if (Array.isArray(content)) {
|
|
77
|
+
return {
|
|
78
|
+
...msg,
|
|
79
|
+
content: content.map((part) => {
|
|
80
|
+
if (typeof part === "object" &&
|
|
81
|
+
part !== null &&
|
|
82
|
+
"text" in part &&
|
|
83
|
+
typeof part.text === "string") {
|
|
84
|
+
return {
|
|
85
|
+
...part,
|
|
86
|
+
text: redactSecrets(part.text, patterns, redactionText, onDetected),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return part;
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return msg;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Creates secrets filtering hooks for input and output.
|
|
98
|
+
*
|
|
99
|
+
* The PreGenerate hook redacts secrets from input messages before sending
|
|
100
|
+
* to the model. The PostGenerate hook redacts secrets from model responses.
|
|
101
|
+
*
|
|
102
|
+
* This addresses the secrets redaction requirement from CODE_REVIEW.md
|
|
103
|
+
* using the unified hook system.
|
|
104
|
+
*
|
|
105
|
+
* @param options - Configuration options
|
|
106
|
+
* @returns Array of two hooks: [PreGenerate input filter, PostGenerate output filter]
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const [inputFilter, outputFilter] = createSecretsFilterHooks({
|
|
111
|
+
* redactionText: "***REDACTED***",
|
|
112
|
+
* });
|
|
113
|
+
*
|
|
114
|
+
* const agent = createAgent({
|
|
115
|
+
* model,
|
|
116
|
+
* hooks: {
|
|
117
|
+
* PreGenerate: [{ hooks: [inputFilter] }],
|
|
118
|
+
* PostGenerate: [{ hooks: [outputFilter] }],
|
|
119
|
+
* },
|
|
120
|
+
* });
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* // Custom patterns with alerting
|
|
126
|
+
* const hooks = createSecretsFilterHooks({
|
|
127
|
+
* customPatterns: [/my-secret-format-[A-Z0-9]{16}/g],
|
|
128
|
+
* onSecretDetected: (type, pattern, match) => {
|
|
129
|
+
* console.warn(`Secret detected in ${type}:`, pattern.source);
|
|
130
|
+
* alertSecurityTeam({ type, pattern: pattern.source });
|
|
131
|
+
* },
|
|
132
|
+
* });
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* // Only specific patterns
|
|
138
|
+
* const hooks = createSecretsFilterHooks({
|
|
139
|
+
* patterns: [
|
|
140
|
+
* COMMON_SECRET_PATTERNS.AWS_ACCESS_KEY,
|
|
141
|
+
* COMMON_SECRET_PATTERNS.GITHUB_TOKEN,
|
|
142
|
+
* ],
|
|
143
|
+
* });
|
|
144
|
+
* ```
|
|
145
|
+
*
|
|
146
|
+
* @category Hooks
|
|
147
|
+
*/
|
|
148
|
+
export function createSecretsFilterHooks(options = {}) {
|
|
149
|
+
const { customPatterns = [], patterns = Object.values(COMMON_SECRET_PATTERNS), redactionText = "[REDACTED]", filterInput = true, filterOutput = true, onSecretDetected, } = options;
|
|
150
|
+
const allPatterns = [...patterns, ...customPatterns];
|
|
151
|
+
// PreGenerate: Redact secrets from input
|
|
152
|
+
const inputFilter = async (input) => {
|
|
153
|
+
if (input.hook_event_name !== "PreGenerate")
|
|
154
|
+
return {};
|
|
155
|
+
if (!filterInput)
|
|
156
|
+
return {};
|
|
157
|
+
const preGenInput = input;
|
|
158
|
+
const messages = preGenInput.options.messages;
|
|
159
|
+
if (!messages || messages.length === 0)
|
|
160
|
+
return {};
|
|
161
|
+
const redactedMessages = redactMessages(messages, allPatterns, redactionText, onSecretDetected ? (pattern, match) => onSecretDetected("input", pattern, match) : undefined);
|
|
162
|
+
// Only return updatedInput if we actually changed something
|
|
163
|
+
if (JSON.stringify(redactedMessages) !== JSON.stringify(messages)) {
|
|
164
|
+
return {
|
|
165
|
+
hookSpecificOutput: {
|
|
166
|
+
hookEventName: "PreGenerate",
|
|
167
|
+
updatedInput: {
|
|
168
|
+
...preGenInput.options,
|
|
169
|
+
messages: redactedMessages,
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {};
|
|
175
|
+
};
|
|
176
|
+
// PostGenerate: Redact secrets from output
|
|
177
|
+
const outputFilter = async (input) => {
|
|
178
|
+
if (input.hook_event_name !== "PostGenerate")
|
|
179
|
+
return {};
|
|
180
|
+
if (!filterOutput)
|
|
181
|
+
return {};
|
|
182
|
+
const postGenInput = input;
|
|
183
|
+
const text = postGenInput.result.text || "";
|
|
184
|
+
const redactedText = redactSecrets(text, allPatterns, redactionText, onSecretDetected ? (pattern, match) => onSecretDetected("output", pattern, match) : undefined);
|
|
185
|
+
// Only return updatedResult if we actually changed something
|
|
186
|
+
if (redactedText !== text) {
|
|
187
|
+
return {
|
|
188
|
+
hookSpecificOutput: {
|
|
189
|
+
hookEventName: "PostGenerate",
|
|
190
|
+
updatedResult: {
|
|
191
|
+
...postGenInput.result,
|
|
192
|
+
text: redactedText,
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return {};
|
|
198
|
+
};
|
|
199
|
+
return [inputFilter, outputFilter];
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Creates managed secrets filter hooks with detection statistics.
|
|
203
|
+
*
|
|
204
|
+
* Returns hooks along with functions to get detection statistics.
|
|
205
|
+
*
|
|
206
|
+
* @param options - Configuration options
|
|
207
|
+
* @returns Object with hooks and statistics getter
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```typescript
|
|
211
|
+
* const { hooks, getStats, getDetections } = createManagedSecretsFilterHooks();
|
|
212
|
+
*
|
|
213
|
+
* const agent = createAgent({
|
|
214
|
+
* model,
|
|
215
|
+
* hooks: {
|
|
216
|
+
* PreGenerate: [{ hooks: [hooks[0]] }],
|
|
217
|
+
* PostGenerate: [{ hooks: [hooks[1]] }],
|
|
218
|
+
* },
|
|
219
|
+
* });
|
|
220
|
+
*
|
|
221
|
+
* // Check statistics
|
|
222
|
+
* const stats = getStats();
|
|
223
|
+
* console.log(`Secrets detected: ${stats.totalDetections} (${stats.inputDetections} input, ${stats.outputDetections} output)`);
|
|
224
|
+
*
|
|
225
|
+
* // Get detailed detections
|
|
226
|
+
* const detections = getDetections();
|
|
227
|
+
* console.log('Recent detections:', detections.slice(0, 10));
|
|
228
|
+
* ```
|
|
229
|
+
*
|
|
230
|
+
* @category Hooks
|
|
231
|
+
*/
|
|
232
|
+
export function createManagedSecretsFilterHooks(options = {}) {
|
|
233
|
+
const { customPatterns = [], patterns = Object.values(COMMON_SECRET_PATTERNS), redactionText = "[REDACTED]", filterInput = true, filterOutput = true, onSecretDetected, } = options;
|
|
234
|
+
const allPatterns = [...patterns, ...customPatterns];
|
|
235
|
+
let inputDetections = 0;
|
|
236
|
+
let outputDetections = 0;
|
|
237
|
+
const detections = [];
|
|
238
|
+
const trackDetection = (type, pattern, match) => {
|
|
239
|
+
if (type === "input")
|
|
240
|
+
inputDetections++;
|
|
241
|
+
else
|
|
242
|
+
outputDetections++;
|
|
243
|
+
detections.push({
|
|
244
|
+
type,
|
|
245
|
+
pattern: pattern.source,
|
|
246
|
+
timestamp: Date.now(),
|
|
247
|
+
});
|
|
248
|
+
if (onSecretDetected) {
|
|
249
|
+
onSecretDetected(type, pattern, match);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
const inputFilter = async (input) => {
|
|
253
|
+
if (input.hook_event_name !== "PreGenerate")
|
|
254
|
+
return {};
|
|
255
|
+
if (!filterInput)
|
|
256
|
+
return {};
|
|
257
|
+
const preGenInput = input;
|
|
258
|
+
const messages = preGenInput.options.messages;
|
|
259
|
+
if (!messages || messages.length === 0)
|
|
260
|
+
return {};
|
|
261
|
+
const redactedMessages = redactMessages(messages, allPatterns, redactionText, (pattern, match) => trackDetection("input", pattern, match));
|
|
262
|
+
if (JSON.stringify(redactedMessages) !== JSON.stringify(messages)) {
|
|
263
|
+
return {
|
|
264
|
+
hookSpecificOutput: {
|
|
265
|
+
hookEventName: "PreGenerate",
|
|
266
|
+
updatedInput: {
|
|
267
|
+
...preGenInput.options,
|
|
268
|
+
messages: redactedMessages,
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
return {};
|
|
274
|
+
};
|
|
275
|
+
const outputFilter = async (input) => {
|
|
276
|
+
if (input.hook_event_name !== "PostGenerate")
|
|
277
|
+
return {};
|
|
278
|
+
if (!filterOutput)
|
|
279
|
+
return {};
|
|
280
|
+
const postGenInput = input;
|
|
281
|
+
const text = postGenInput.result.text || "";
|
|
282
|
+
const redactedText = redactSecrets(text, allPatterns, redactionText, (pattern, match) => trackDetection("output", pattern, match));
|
|
283
|
+
if (redactedText !== text) {
|
|
284
|
+
return {
|
|
285
|
+
hookSpecificOutput: {
|
|
286
|
+
hookEventName: "PostGenerate",
|
|
287
|
+
updatedResult: {
|
|
288
|
+
...postGenInput.result,
|
|
289
|
+
text: redactedText,
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
return {};
|
|
295
|
+
};
|
|
296
|
+
return {
|
|
297
|
+
hooks: [inputFilter, outputFilter],
|
|
298
|
+
getStats: () => ({
|
|
299
|
+
inputDetections,
|
|
300
|
+
outputDetections,
|
|
301
|
+
totalDetections: inputDetections + outputDetections,
|
|
302
|
+
}),
|
|
303
|
+
getDetections: () => [...detections],
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/hooks/secrets.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook system for observing agent lifecycle events.
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
import type { Agent, HookCallback, HookInput, HookMatcher, HookOutput } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Checks if a tool name matches a HookMatcher pattern.
|
|
9
|
+
*
|
|
10
|
+
* @param toolName - The tool name to test
|
|
11
|
+
* @param matcher - The matcher pattern (undefined matches all)
|
|
12
|
+
* @returns true if the tool name matches the pattern
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export declare function matchesToolName(toolName: string, matcher: string | undefined): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Error thrown when a hook times out.
|
|
19
|
+
*
|
|
20
|
+
* @category Hooks
|
|
21
|
+
*/
|
|
22
|
+
export declare class HookTimeoutError extends Error {
|
|
23
|
+
constructor(timeout: number);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Invokes hook callbacks with timeout support.
|
|
27
|
+
*
|
|
28
|
+
* This function enforces a hard timeout using `Promise.race`. If a hook does not complete
|
|
29
|
+
* within the specified timeout, it will be treated as returning an empty result `{}`.
|
|
30
|
+
* The abort signal is also set when the timeout is reached, allowing cooperative hooks
|
|
31
|
+
* to clean up resources.
|
|
32
|
+
*
|
|
33
|
+
* @param hooks - Array of hook callbacks to invoke
|
|
34
|
+
* @param input - The hook input data
|
|
35
|
+
* @param toolUseId - The tool use ID (null for non-tool hooks)
|
|
36
|
+
* @param agent - The agent instance
|
|
37
|
+
* @param timeout - Timeout in milliseconds (default: 60000). Each hook must complete within this time.
|
|
38
|
+
* @param retryAttempt - Current retry attempt number (default: 0)
|
|
39
|
+
* @returns Array of hook outputs. Timed out hooks return empty objects `{}`.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* // Hook that respects the abort signal for cooperative cancellation
|
|
44
|
+
* const cooperativeHook: HookCallback = async (input, toolUseId, ctx) => {
|
|
45
|
+
* for (const item of items) {
|
|
46
|
+
* if (ctx.signal.aborted) {
|
|
47
|
+
* return {}; // Early exit on abort
|
|
48
|
+
* }
|
|
49
|
+
* await processItem(item);
|
|
50
|
+
* }
|
|
51
|
+
* return { hookSpecificOutput: { ... } };
|
|
52
|
+
* };
|
|
53
|
+
*
|
|
54
|
+
* // Even if a hook doesn't check the signal, it will be timed out
|
|
55
|
+
* const results = await invokeHooksWithTimeout(
|
|
56
|
+
* [cooperativeHook, slowHook],
|
|
57
|
+
* input,
|
|
58
|
+
* toolUseId,
|
|
59
|
+
* agent,
|
|
60
|
+
* 5000 // 5 second timeout
|
|
61
|
+
* );
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
export declare function invokeHooksWithTimeout(hooks: HookCallback[], input: HookInput, toolUseId: string | null, agent: Agent, timeout?: number, retryAttempt?: number): Promise<HookOutput[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Filters and invokes matching hooks for a tool use event.
|
|
69
|
+
*
|
|
70
|
+
* @param matchers - Array of HookMatcher configurations
|
|
71
|
+
* @param toolName - The name of the tool being used
|
|
72
|
+
* @param input - The hook input data
|
|
73
|
+
* @param toolUseId - The tool use ID
|
|
74
|
+
* @param agent - The agent instance
|
|
75
|
+
* @returns Array of hook outputs from all matching hooks
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const matchers: HookMatcher[] = [
|
|
80
|
+
* { matcher: 'Write|Edit', hooks: [protectFiles], timeout: 30000 },
|
|
81
|
+
* { hooks: [auditLogger] } // Matches all tools
|
|
82
|
+
* ];
|
|
83
|
+
*
|
|
84
|
+
* const outputs = await invokeMatchingHooks(
|
|
85
|
+
* matchers,
|
|
86
|
+
* 'Write',
|
|
87
|
+
* input,
|
|
88
|
+
* toolUseId,
|
|
89
|
+
* agent
|
|
90
|
+
* );
|
|
91
|
+
* ```
|
|
92
|
+
*
|
|
93
|
+
* @category Hooks
|
|
94
|
+
*/
|
|
95
|
+
export declare function invokeMatchingHooks(matchers: HookMatcher[], toolName: string, input: HookInput, toolUseId: string, agent: Agent): Promise<HookOutput[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Aggregates permission decisions from multiple hook outputs.
|
|
98
|
+
*
|
|
99
|
+
* Follows the hierarchy: deny > ask > allow > default
|
|
100
|
+
*
|
|
101
|
+
* @param hookOutputs - Array of hook outputs to aggregate
|
|
102
|
+
* @param defaultDecision - Default decision if no hooks provide one (default: 'allow')
|
|
103
|
+
* @returns The aggregated permission decision
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const outputs: HookOutput[] = [
|
|
108
|
+
* { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'allow' } },
|
|
109
|
+
* { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny' } },
|
|
110
|
+
* ];
|
|
111
|
+
*
|
|
112
|
+
* const decision = aggregatePermissionDecisions(outputs);
|
|
113
|
+
* // Returns 'deny' because deny wins over allow
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @category Hooks
|
|
117
|
+
*/
|
|
118
|
+
export declare function aggregatePermissionDecisions(hookOutputs: HookOutput[], defaultDecision?: "allow" | "deny" | "ask"): "allow" | "deny" | "ask";
|
|
119
|
+
/**
|
|
120
|
+
* Extracts a cached/mock result from hook outputs for short-circuit execution.
|
|
121
|
+
*
|
|
122
|
+
* Returns the first non-undefined `respondWith` value found in the hook outputs.
|
|
123
|
+
* This enables cache hooks to return cached results without executing the actual operation.
|
|
124
|
+
*
|
|
125
|
+
* @param hookOutputs - Array of hook outputs to scan
|
|
126
|
+
* @returns The cached result if found, undefined otherwise
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const outputs: HookOutput[] = [
|
|
131
|
+
* { hookSpecificOutput: { hookEventName: 'PreGenerate' } },
|
|
132
|
+
* { hookSpecificOutput: { hookEventName: 'PreGenerate', respondWith: cachedResult } },
|
|
133
|
+
* ];
|
|
134
|
+
*
|
|
135
|
+
* const result = extractRespondWith(outputs);
|
|
136
|
+
* // Returns cachedResult
|
|
137
|
+
* ```
|
|
138
|
+
*
|
|
139
|
+
* @category Hooks
|
|
140
|
+
*/
|
|
141
|
+
export declare function extractRespondWith<T = unknown>(hookOutputs: HookOutput[]): T | undefined;
|
|
142
|
+
/**
|
|
143
|
+
* Extracts transformed input from hook outputs.
|
|
144
|
+
*
|
|
145
|
+
* Returns the first non-undefined `updatedInput` value found in the hook outputs.
|
|
146
|
+
* This enables hooks to modify inputs before they are used (e.g., redirect file paths,
|
|
147
|
+
* add rate limit headers, sanitize user input).
|
|
148
|
+
*
|
|
149
|
+
* @param hookOutputs - Array of hook outputs to scan
|
|
150
|
+
* @returns The transformed input if found, undefined otherwise
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```typescript
|
|
154
|
+
* const outputs: HookOutput[] = [
|
|
155
|
+
* { hookSpecificOutput: { hookEventName: 'PreToolUse' } },
|
|
156
|
+
* { hookSpecificOutput: {
|
|
157
|
+
* hookEventName: 'PreToolUse',
|
|
158
|
+
* updatedInput: { file_path: '/sandbox/file.txt' }
|
|
159
|
+
* }
|
|
160
|
+
* },
|
|
161
|
+
* ];
|
|
162
|
+
*
|
|
163
|
+
* const transformed = extractUpdatedInput(outputs);
|
|
164
|
+
* // Returns { file_path: '/sandbox/file.txt' }
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* @category Hooks
|
|
168
|
+
*/
|
|
169
|
+
export declare function extractUpdatedInput<T = unknown>(hookOutputs: HookOutput[]): T | undefined;
|
|
170
|
+
/**
|
|
171
|
+
* Extracts transformed result from hook outputs.
|
|
172
|
+
*
|
|
173
|
+
* Returns the first non-undefined `updatedResult` value found in the hook outputs.
|
|
174
|
+
* This enables hooks to modify outputs after execution (e.g., filter sensitive data,
|
|
175
|
+
* add metadata, transform format, apply post-processing).
|
|
176
|
+
*
|
|
177
|
+
* @param hookOutputs - Array of hook outputs to scan
|
|
178
|
+
* @returns The transformed result if found, undefined otherwise
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* const outputs: HookOutput[] = [
|
|
183
|
+
* { hookSpecificOutput: { hookEventName: 'PostGenerate' } },
|
|
184
|
+
* { hookSpecificOutput: {
|
|
185
|
+
* hookEventName: 'PostGenerate',
|
|
186
|
+
* updatedResult: { ...originalResult, filtered: true }
|
|
187
|
+
* }
|
|
188
|
+
* },
|
|
189
|
+
* ];
|
|
190
|
+
*
|
|
191
|
+
* const transformed = extractUpdatedResult(outputs);
|
|
192
|
+
* // Returns { ...originalResult, filtered: true }
|
|
193
|
+
* ```
|
|
194
|
+
*
|
|
195
|
+
* @category Hooks
|
|
196
|
+
*/
|
|
197
|
+
export declare function extractUpdatedResult<T = unknown>(hookOutputs: HookOutput[]): T | undefined;
|
|
198
|
+
/**
|
|
199
|
+
* Extracts retry decision from PostGenerateFailure or PostToolUseFailure hook outputs.
|
|
200
|
+
*
|
|
201
|
+
* Returns the first retry decision found in the hook outputs. If any hook requests a retry,
|
|
202
|
+
* the operation will be retried after the specified delay (or 0ms if no delay specified).
|
|
203
|
+
*
|
|
204
|
+
* @param hookOutputs - Array of hook outputs to scan
|
|
205
|
+
* @returns Object with retry flag and delay, or undefined if no retry requested
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```typescript
|
|
209
|
+
* const outputs: HookOutput[] = [
|
|
210
|
+
* { hookSpecificOutput: { hookEventName: 'PostGenerateFailure' } },
|
|
211
|
+
* { hookSpecificOutput: {
|
|
212
|
+
* hookEventName: 'PostGenerateFailure',
|
|
213
|
+
* retry: true,
|
|
214
|
+
* retryDelayMs: 1000 // Wait 1s before retrying
|
|
215
|
+
* }
|
|
216
|
+
* },
|
|
217
|
+
* ];
|
|
218
|
+
*
|
|
219
|
+
* const retryDecision = extractRetryDecision(outputs);
|
|
220
|
+
* // Returns { retry: true, retryDelayMs: 1000 }
|
|
221
|
+
* ```
|
|
222
|
+
*
|
|
223
|
+
* @category Hooks
|
|
224
|
+
*/
|
|
225
|
+
export declare function extractRetryDecision(hookOutputs: HookOutput[]): {
|
|
226
|
+
retry: boolean;
|
|
227
|
+
retryDelayMs: number;
|
|
228
|
+
} | undefined;
|
|
229
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM1F;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAYtF;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,YAAY,EAAE,EACrB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,KAAK,EACZ,OAAO,SAAQ,EACf,YAAY,SAAI,GACf,OAAO,CAAC,UAAU,EAAE,CAAC,CA6CvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,UAAU,EAAE,CAAC,CAYvB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,UAAU,EAAE,EACzB,eAAe,GAAE,OAAO,GAAG,MAAM,GAAG,KAAe,GAClD,OAAO,GAAG,MAAM,GAAG,KAAK,CAsB1B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,CAQxF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,CAQzF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,CAQ1F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,UAAU,EAAE,GACxB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAStD"}
|