@clawdstrike/openclaw 0.1.0 → 0.1.2

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 (100) hide show
  1. package/README.md +4 -2
  2. package/clawdstrike-security.js +1 -0
  3. package/dist/audit/adapter-logger.d.ts +24 -0
  4. package/dist/audit/adapter-logger.d.ts.map +1 -0
  5. package/dist/audit/adapter-logger.js +42 -0
  6. package/dist/audit/adapter-logger.js.map +1 -0
  7. package/dist/classification.d.ts +41 -0
  8. package/dist/classification.d.ts.map +1 -0
  9. package/dist/classification.js +102 -0
  10. package/dist/classification.js.map +1 -0
  11. package/dist/cli/commands/policy.js +1 -1
  12. package/dist/cli/commands/policy.js.map +1 -1
  13. package/dist/e2e/openclaw-e2e.js +3 -3
  14. package/dist/e2e/openclaw-e2e.js.map +1 -1
  15. package/dist/engine-holder.d.ts +28 -0
  16. package/dist/engine-holder.d.ts.map +1 -0
  17. package/dist/engine-holder.js +38 -0
  18. package/dist/engine-holder.js.map +1 -0
  19. package/dist/guards/egress.d.ts.map +1 -1
  20. package/dist/guards/egress.js +20 -1
  21. package/dist/guards/egress.js.map +1 -1
  22. package/dist/guards/forbidden-path.d.ts.map +1 -1
  23. package/dist/guards/forbidden-path.js +6 -0
  24. package/dist/guards/forbidden-path.js.map +1 -1
  25. package/dist/guards/secret-leak.d.ts.map +1 -1
  26. package/dist/guards/secret-leak.js +21 -0
  27. package/dist/guards/secret-leak.js.map +1 -1
  28. package/dist/hooks/agent-bootstrap/handler.d.ts +4 -0
  29. package/dist/hooks/agent-bootstrap/handler.d.ts.map +1 -1
  30. package/dist/hooks/agent-bootstrap/handler.js +7 -7
  31. package/dist/hooks/agent-bootstrap/handler.js.map +1 -1
  32. package/dist/hooks/approval-state.d.ts +31 -0
  33. package/dist/hooks/approval-state.d.ts.map +1 -0
  34. package/dist/hooks/approval-state.js +189 -0
  35. package/dist/hooks/approval-state.js.map +1 -0
  36. package/dist/hooks/approval-utils.d.ts +5 -0
  37. package/dist/hooks/approval-utils.d.ts.map +1 -0
  38. package/dist/hooks/approval-utils.js +77 -0
  39. package/dist/hooks/approval-utils.js.map +1 -0
  40. package/dist/hooks/audit-logger/handler.d.ts +4 -0
  41. package/dist/hooks/audit-logger/handler.d.ts.map +1 -1
  42. package/dist/hooks/audit-logger/handler.js +4 -0
  43. package/dist/hooks/audit-logger/handler.js.map +1 -1
  44. package/dist/hooks/cua-bridge/handler.d.ts +57 -0
  45. package/dist/hooks/cua-bridge/handler.d.ts.map +1 -0
  46. package/dist/hooks/cua-bridge/handler.js +369 -0
  47. package/dist/hooks/cua-bridge/handler.js.map +1 -0
  48. package/dist/hooks/tool-guard/handler.d.ts +17 -2
  49. package/dist/hooks/tool-guard/handler.d.ts.map +1 -1
  50. package/dist/hooks/tool-guard/handler.js +200 -75
  51. package/dist/hooks/tool-guard/handler.js.map +1 -1
  52. package/dist/hooks/tool-preflight/handler.d.ts +34 -0
  53. package/dist/hooks/tool-preflight/handler.d.ts.map +1 -0
  54. package/dist/hooks/tool-preflight/handler.js +426 -0
  55. package/dist/hooks/tool-preflight/handler.js.map +1 -0
  56. package/dist/index.d.ts +8 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +9 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/openclaw-adapter.d.ts +48 -0
  61. package/dist/openclaw-adapter.d.ts.map +1 -0
  62. package/dist/openclaw-adapter.js +81 -0
  63. package/dist/openclaw-adapter.js.map +1 -0
  64. package/dist/plugin.d.ts +40 -1
  65. package/dist/plugin.d.ts.map +1 -1
  66. package/dist/plugin.js +125 -32
  67. package/dist/plugin.js.map +1 -1
  68. package/dist/policy/engine.d.ts +5 -0
  69. package/dist/policy/engine.d.ts.map +1 -1
  70. package/dist/policy/engine.js +580 -84
  71. package/dist/policy/engine.js.map +1 -1
  72. package/dist/policy/loader.js +57 -0
  73. package/dist/policy/loader.js.map +1 -1
  74. package/dist/policy/validator.d.ts.map +1 -1
  75. package/dist/policy/validator.js +97 -3
  76. package/dist/policy/validator.js.map +1 -1
  77. package/dist/receipt/signer.d.ts +42 -0
  78. package/dist/receipt/signer.d.ts.map +1 -0
  79. package/dist/receipt/signer.js +134 -0
  80. package/dist/receipt/signer.js.map +1 -0
  81. package/dist/receipt/types.d.ts +50 -0
  82. package/dist/receipt/types.d.ts.map +1 -0
  83. package/dist/receipt/types.js +9 -0
  84. package/dist/receipt/types.js.map +1 -0
  85. package/dist/security-prompt.js +1 -1
  86. package/dist/tools/policy-check.d.ts +2 -2
  87. package/dist/tools/policy-check.d.ts.map +1 -1
  88. package/dist/tools/policy-check.js +4 -7
  89. package/dist/tools/policy-check.js.map +1 -1
  90. package/dist/translator/openclaw-translator.d.ts +31 -0
  91. package/dist/translator/openclaw-translator.d.ts.map +1 -0
  92. package/dist/translator/openclaw-translator.js +314 -0
  93. package/dist/translator/openclaw-translator.js.map +1 -0
  94. package/dist/types.d.ts +86 -170
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/types.js +4 -0
  97. package/dist/types.js.map +1 -1
  98. package/package.json +5 -3
  99. package/rulesets/ai-agent-minimal.yaml +25 -0
  100. package/rulesets/ai-agent.yaml +25 -0
@@ -0,0 +1,369 @@
1
+ /**
2
+ * @clawdstrike/openclaw - CUA Bridge Hook Handler
3
+ *
4
+ * Detects CUA (Computer Use Agent) actions from OpenClaw tool calls and emits
5
+ * canonical CUA policy events via PolicyEventFactory from adapter-core.
6
+ *
7
+ * CUA actions are identified by toolName prefix or explicit metadata. When
8
+ * detected, the bridge creates the appropriate canonical CUA event, evaluates
9
+ * it through the policy engine, and applies the decision (allow/warn/deny).
10
+ *
11
+ * Design: fail-closed on unknown CUA action types. Non-CUA tool calls are
12
+ * passed through unchanged (no regression on existing behavior).
13
+ */
14
+ import { parseNetworkTarget, PolicyEventFactory, } from '@clawdstrike/adapter-core';
15
+ import { initializeEngine, getSharedEngine } from '../../engine-holder.js';
16
+ import { peekApproval } from '../approval-state.js';
17
+ import { normalizeApprovalResource } from '../approval-utils.js';
18
+ // ── Stable Error Codes ──────────────────────────────────────────────
19
+ export const CUA_ERROR_CODES = {
20
+ UNKNOWN_ACTION: 'OCLAW_CUA_UNKNOWN_ACTION',
21
+ MISSING_METADATA: 'OCLAW_CUA_MISSING_METADATA',
22
+ SESSION_MISSING: 'OCLAW_CUA_SESSION_MISSING',
23
+ };
24
+ // ── CUA Action Classification ───────────────────────────────────────
25
+ /** CUA tool name prefixes that trigger CUA bridge routing. */
26
+ const CUA_TOOL_PREFIXES = [
27
+ 'cua_', 'cua.', 'computer_use_', 'computer_use.',
28
+ 'remote_desktop_', 'remote_desktop.', 'rdp_', 'rdp.',
29
+ ];
30
+ const CUA_TOOL_NAMES = new Set(['computer', 'computer_use', 'computer.use', 'computer-use']);
31
+ const ACTION_TOKEN_MAP = [
32
+ { tokens: ['connect', 'session_start', 'open', 'launch'], kind: 'connect' },
33
+ { tokens: ['disconnect', 'session_end', 'close', 'terminate'], kind: 'disconnect' },
34
+ { tokens: ['reconnect', 'session_resume', 'resume'], kind: 'reconnect' },
35
+ { tokens: ['click', 'type', 'key', 'mouse', 'keyboard', 'input', 'scroll', 'drag', 'move_mouse'], kind: 'input_inject' },
36
+ { tokens: ['clipboard_read', 'clipboard_get', 'paste_from', 'copy_from_remote'], kind: 'clipboard_read' },
37
+ { tokens: ['clipboard_write', 'clipboard_set', 'copy_to', 'paste_to_remote'], kind: 'clipboard_write' },
38
+ { tokens: ['file_upload', 'upload', 'send_file'], kind: 'file_upload' },
39
+ { tokens: ['file_download', 'download', 'receive_file', 'get_file'], kind: 'file_download' },
40
+ { tokens: ['session_share', 'share_session', 'share'], kind: 'session_share' },
41
+ { tokens: ['audio', 'audio_stream', 'stream_audio'], kind: 'audio' },
42
+ { tokens: ['drive_mapping', 'map_drive', 'mount_drive'], kind: 'drive_mapping' },
43
+ { tokens: ['printing', 'print', 'remote_print'], kind: 'printing' },
44
+ ];
45
+ // ── Module State ────────────────────────────────────────────────────
46
+ const factory = new PolicyEventFactory();
47
+ /**
48
+ * Initialize the hook with configuration.
49
+ * Delegates to the shared engine holder so all hooks share one PolicyEngine.
50
+ */
51
+ export function initialize(config) {
52
+ initializeEngine(config);
53
+ }
54
+ /**
55
+ * Get or create the policy engine.
56
+ * Delegates to the shared engine holder.
57
+ */
58
+ function getEngine(config) {
59
+ return getSharedEngine(config);
60
+ }
61
+ // ── CUA Detection ───────────────────────────────────────────────────
62
+ /**
63
+ * Check if a tool call is a CUA action (by prefix or explicit cua metadata).
64
+ */
65
+ export function isCuaToolCall(toolName, params) {
66
+ const lower = toolName.toLowerCase();
67
+ if (CUA_TOOL_NAMES.has(lower)) {
68
+ return true;
69
+ }
70
+ if (CUA_TOOL_PREFIXES.some((p) => lower.startsWith(p))) {
71
+ return true;
72
+ }
73
+ if (params.__cua === true || params.cua_action !== undefined) {
74
+ return true;
75
+ }
76
+ return false;
77
+ }
78
+ /**
79
+ * Extract the CUA action token from a tool name or params.
80
+ */
81
+ function extractActionToken(toolName, params) {
82
+ // Explicit action from params takes precedence
83
+ if (typeof params.cua_action === 'string' && params.cua_action.trim()) {
84
+ return params.cua_action.trim().toLowerCase();
85
+ }
86
+ if (CUA_TOOL_NAMES.has(toolName.toLowerCase())) {
87
+ if (typeof params.action === 'string' && params.action.trim()) {
88
+ return params.action.trim().toLowerCase();
89
+ }
90
+ }
91
+ // Strip known CUA prefix and use remaining as action token
92
+ const lower = toolName.toLowerCase();
93
+ for (const prefix of CUA_TOOL_PREFIXES) {
94
+ if (lower.startsWith(prefix)) {
95
+ const remainder = lower.slice(prefix.length);
96
+ if (remainder)
97
+ return remainder;
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Classify a CUA action token into a known CuaActionKind.
104
+ * Returns null for unknown actions (fail-closed).
105
+ */
106
+ function classifyCuaAction(token) {
107
+ for (const { tokens, kind } of ACTION_TOKEN_MAP) {
108
+ if (tokens.includes(token)) {
109
+ return kind;
110
+ }
111
+ }
112
+ return null;
113
+ }
114
+ // ── Event Building ──────────────────────────────────────────────────
115
+ /**
116
+ * Build a canonical CUA PolicyEvent using the PolicyEventFactory.
117
+ */
118
+ export function buildCuaEvent(sessionId, kind, params) {
119
+ const extraData = {};
120
+ if (typeof params.continuityPrevSessionHash === 'string') {
121
+ extraData.continuityPrevSessionHash = params.continuityPrevSessionHash;
122
+ }
123
+ if (typeof params.postconditionProbeHash === 'string') {
124
+ extraData.postconditionProbeHash = params.postconditionProbeHash;
125
+ }
126
+ // Preserve input_type so the InputInjectionCapabilityGuard (fail-closed on
127
+ // missing input_type) receives it through the canonical CUA event data.
128
+ const inputType = typeof params.input_type === 'string'
129
+ ? params.input_type
130
+ : typeof params.inputType === 'string'
131
+ ? params.inputType
132
+ : undefined;
133
+ if (typeof inputType === 'string') {
134
+ extraData.input_type = inputType;
135
+ }
136
+ const transferSize = coerceTransferSize(params.transfer_size ?? params.transferSize);
137
+ if (transferSize !== null) {
138
+ extraData.transfer_size = transferSize;
139
+ }
140
+ switch (kind) {
141
+ case 'connect': {
142
+ const connectMeta = extractConnectMetadata(params);
143
+ return factory.createCuaConnectEvent(sessionId, { ...extraData, ...connectMeta });
144
+ }
145
+ case 'disconnect':
146
+ return factory.createCuaDisconnectEvent(sessionId, extraData);
147
+ case 'reconnect':
148
+ return factory.createCuaReconnectEvent(sessionId, extraData);
149
+ case 'input_inject':
150
+ return factory.createCuaInputInjectEvent(sessionId, extraData);
151
+ case 'clipboard_read':
152
+ return factory.createCuaClipboardEvent(sessionId, 'read', extraData);
153
+ case 'clipboard_write':
154
+ return factory.createCuaClipboardEvent(sessionId, 'write', extraData);
155
+ case 'file_upload':
156
+ return factory.createCuaFileTransferEvent(sessionId, 'upload', extraData);
157
+ case 'file_download':
158
+ return factory.createCuaFileTransferEvent(sessionId, 'download', extraData);
159
+ case 'session_share':
160
+ return factory.createCuaSessionShareEvent(sessionId, extraData);
161
+ case 'audio':
162
+ return factory.createCuaAudioEvent(sessionId, extraData);
163
+ case 'drive_mapping':
164
+ return factory.createCuaDriveMappingEvent(sessionId, extraData);
165
+ case 'printing':
166
+ return factory.createCuaPrintingEvent(sessionId, extraData);
167
+ }
168
+ }
169
+ // ── Hook Handler ────────────────────────────────────────────────────
170
+ function beforeToolCallBlockResult(toolEvent, blockReason) {
171
+ if (toolEvent.type !== 'before_tool_call') {
172
+ return;
173
+ }
174
+ return {
175
+ block: true,
176
+ blockReason,
177
+ params: toolEvent.context.toolCall.params,
178
+ };
179
+ }
180
+ /**
181
+ * CUA bridge hook handler for tool_call (pre-execution) events.
182
+ *
183
+ * Only activates for CUA tool calls. Non-CUA tools pass through untouched
184
+ * so existing preflight behavior is preserved.
185
+ *
186
+ * Fail-closed: unknown CUA action types are denied with stable error code.
187
+ * Missing session ID or CUA metadata also fail closed.
188
+ */
189
+ const handler = async (event, hookCtx) => {
190
+ const isModernBeforeToolCallEvent = (value) => {
191
+ if (value && typeof value === 'object' && 'type' in value)
192
+ return false;
193
+ return Boolean(value &&
194
+ typeof value === 'object' &&
195
+ typeof value.toolName === 'string' &&
196
+ typeof value.params === 'object' &&
197
+ value.params !== null);
198
+ };
199
+ const isModern = isModernBeforeToolCallEvent(event);
200
+ if (!isModern) {
201
+ if (event.type !== 'tool_call' && event.type !== 'before_tool_call') {
202
+ return;
203
+ }
204
+ }
205
+ const legacyToolEvent = isModern ? null : event;
206
+ // Skip if already handled by another hook registration (e.g. before_tool_call + tool_call dual registration)
207
+ if (!isModern && legacyToolEvent.preventDefault)
208
+ return;
209
+ const toolName = isModern ? event.toolName : legacyToolEvent.context.toolCall.toolName;
210
+ const params = isModern ? event.params : legacyToolEvent.context.toolCall.params;
211
+ const sessionId = isModern
212
+ ? (hookCtx?.sessionKey ?? hookCtx?.agentId ?? '')
213
+ : legacyToolEvent.context.sessionId;
214
+ // Only intercept CUA tool calls
215
+ if (!isCuaToolCall(toolName, params)) {
216
+ return;
217
+ }
218
+ // Mark this event as evaluated by the CUA bridge so the general preflight
219
+ // handler skips it (avoids double policy evaluation). Set this early —
220
+ // before any fail-closed exits — because even a CUA denial here means the
221
+ // tool was already handled and the preflight handler should not re-evaluate.
222
+ event.__cuaBridgeEvaluated = true;
223
+ // Fail closed: session ID required for CUA actions
224
+ if (!sessionId) {
225
+ const blockReason = `Denied ${toolName}: missing session ID (${CUA_ERROR_CODES.SESSION_MISSING})`;
226
+ if (isModern) {
227
+ return { block: true, blockReason, params };
228
+ }
229
+ legacyToolEvent.preventDefault = true;
230
+ legacyToolEvent.messages.push(`[clawdstrike:cua-bridge] ${blockReason}`);
231
+ return beforeToolCallBlockResult(legacyToolEvent, blockReason);
232
+ }
233
+ // Extract and classify the CUA action
234
+ const actionToken = extractActionToken(toolName, params);
235
+ if (!actionToken) {
236
+ const blockReason = `Denied ${toolName}: unable to extract CUA action from tool name or params (${CUA_ERROR_CODES.MISSING_METADATA})`;
237
+ if (isModern) {
238
+ return { block: true, blockReason, params };
239
+ }
240
+ legacyToolEvent.preventDefault = true;
241
+ legacyToolEvent.messages.push(`[clawdstrike:cua-bridge] ${blockReason}`);
242
+ return beforeToolCallBlockResult(legacyToolEvent, blockReason);
243
+ }
244
+ const kind = classifyCuaAction(actionToken);
245
+ if (!kind) {
246
+ // Fail closed on unknown CUA action type
247
+ const blockReason = `Denied ${toolName}: unknown CUA action '${actionToken}' (${CUA_ERROR_CODES.UNKNOWN_ACTION})`;
248
+ if (isModern) {
249
+ return { block: true, blockReason, params };
250
+ }
251
+ legacyToolEvent.preventDefault = true;
252
+ legacyToolEvent.messages.push(`[clawdstrike:cua-bridge] ${blockReason}`);
253
+ return beforeToolCallBlockResult(legacyToolEvent, blockReason);
254
+ }
255
+ // Build canonical CUA event via PolicyEventFactory
256
+ const cuaEvent = buildCuaEvent(sessionId, kind, params);
257
+ // Evaluate through policy engine first to get severity before consulting prior approvals.
258
+ const policyEngine = getEngine();
259
+ const decision = await policyEngine.evaluate(cuaEvent);
260
+ // Check prior approvals for non-critical denials only.
261
+ // Critical denials must always be re-evaluated and never short-circuited.
262
+ if (decision.status === 'deny' && decision.severity !== 'critical') {
263
+ const resource = normalizeApprovalResource(policyEngine, toolName, params);
264
+ const prior = peekApproval(sessionId, toolName, resource);
265
+ if (prior) {
266
+ if (!isModern) {
267
+ legacyToolEvent.messages.push(`[clawdstrike:cua-bridge] CUA ${kind}: using prior ${prior.resolution} approval for ${toolName}`);
268
+ }
269
+ return;
270
+ }
271
+ }
272
+ if (decision.status === 'deny') {
273
+ const blockReason = `CUA ${kind} denied${decision.guard ? ` by ${decision.guard}` : ''}${decision.reason ? `: ${decision.reason}` : ''} (${toolName})`;
274
+ if (isModern) {
275
+ return { block: true, blockReason, params };
276
+ }
277
+ legacyToolEvent.preventDefault = true;
278
+ legacyToolEvent.messages.push(`[clawdstrike:cua-bridge] ${blockReason}`);
279
+ return beforeToolCallBlockResult(legacyToolEvent, blockReason);
280
+ }
281
+ if (!isModern && decision.status === 'warn') {
282
+ legacyToolEvent.messages.push(`[clawdstrike:cua-bridge] CUA ${kind} warning: ${decision.message ?? decision.reason ?? 'Policy warning'} (${toolName})`);
283
+ }
284
+ // Allow: record for potential post-exec parity
285
+ if (!isModern && decision.status === 'allow') {
286
+ legacyToolEvent.messages.push(`[clawdstrike:cua-bridge] CUA ${kind} allowed (${toolName})`);
287
+ }
288
+ };
289
+ export default handler;
290
+ // Re-export for testing
291
+ export { classifyCuaAction, extractActionToken, };
292
+ function coerceTransferSize(value) {
293
+ if (typeof value === 'number' && Number.isFinite(value) && value >= 0) {
294
+ return Math.trunc(value);
295
+ }
296
+ if (typeof value === 'string') {
297
+ const parsed = Number.parseInt(value, 10);
298
+ if (Number.isFinite(parsed) && parsed >= 0) {
299
+ return parsed;
300
+ }
301
+ }
302
+ return null;
303
+ }
304
+ function coercePort(value) {
305
+ if (typeof value === 'number' && Number.isFinite(value)) {
306
+ const port = Math.trunc(value);
307
+ if (port > 0 && port <= 65535)
308
+ return port;
309
+ }
310
+ if (typeof value === 'string') {
311
+ const trimmed = value.trim();
312
+ if (/^[0-9]+$/.test(trimmed)) {
313
+ const parsed = Number.parseInt(trimmed, 10);
314
+ if (Number.isFinite(parsed) && parsed > 0 && parsed <= 65535)
315
+ return parsed;
316
+ }
317
+ }
318
+ return null;
319
+ }
320
+ function firstNonEmptyString(values) {
321
+ for (const value of values) {
322
+ if (typeof value !== 'string')
323
+ continue;
324
+ const trimmed = value.trim();
325
+ if (trimmed.length > 0)
326
+ return trimmed;
327
+ }
328
+ return null;
329
+ }
330
+ function extractConnectMetadata(params) {
331
+ const url = firstNonEmptyString([
332
+ params.url,
333
+ params.endpoint,
334
+ params.href,
335
+ params.target_url,
336
+ params.targetUrl,
337
+ ]);
338
+ const parsed = parseNetworkTarget(url ?? '', { emptyPort: 'default' });
339
+ const host = firstNonEmptyString([
340
+ params.host,
341
+ params.hostname,
342
+ params.remote_host,
343
+ params.remoteHost,
344
+ params.destination_host,
345
+ params.destinationHost,
346
+ parsed.host,
347
+ ])?.toLowerCase();
348
+ const protocol = firstNonEmptyString([params.protocol, params.scheme])?.toLowerCase();
349
+ const explicitPort = coercePort(params.port
350
+ ?? params.remote_port
351
+ ?? params.remotePort
352
+ ?? params.destination_port
353
+ ?? params.destinationPort);
354
+ const out = {};
355
+ if (host)
356
+ out.host = host;
357
+ if (explicitPort !== null) {
358
+ out.port = explicitPort;
359
+ }
360
+ else if (parsed.host) {
361
+ out.port = parsed.port;
362
+ }
363
+ if (url)
364
+ out.url = url;
365
+ if (protocol)
366
+ out.protocol = protocol;
367
+ return out;
368
+ }
369
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/hooks/cua-bridge/handler.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,24 @@
3
3
  *
4
4
  * Intercepts tool results and enforces security policy.
5
5
  */
6
- import type { HookHandler, ClawdstrikeConfig } from '../../types.js';
6
+ import type { HookHandler, ClawdstrikeConfig, Decision } from '../../types.js';
7
+ export declare class DecisionCache {
8
+ private readonly maxSize;
9
+ private readonly ttlMs;
10
+ private readonly map;
11
+ constructor(maxSize?: number, ttlMs?: number);
12
+ /** Build a cache key from event type + resource identifier + policy fingerprint. */
13
+ static key(eventType: string, resource: string, policyKey: string): string;
14
+ get(key: string): Decision | undefined;
15
+ set(key: string, decision: Decision): void;
16
+ clear(): void;
17
+ get size(): number;
18
+ }
19
+ /** Shared decision cache (reset on initialize) */
20
+ export declare let decisionCache: DecisionCache;
7
21
  /**
8
- * Initialize the hook with configuration
22
+ * Initialize the hook with configuration.
23
+ * Delegates to the shared engine holder so all hooks share one PolicyEngine.
9
24
  */
10
25
  export declare function initialize(config: ClawdstrikeConfig): void;
11
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/hooks/tool-guard/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EAGX,iBAAiB,EAOlB,MAAM,gBAAgB,CAAC;AAMxB;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE1D;AAYD;;GAEG;AACH,QAAA,MAAM,OAAO,EAAE,WA6Gd,CAAC;AAsSF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/hooks/tool-guard/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,WAAW,EAGX,iBAAiB,EACjB,QAAQ,EAET,MAAM,gBAAgB,CAAC;AAoFxB,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;gBAEzC,OAAO,SAAoB,EAAE,KAAK,SAAuB;IAKrE,oFAAoF;IACpF,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAI1E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAatC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAS1C,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAOD,kDAAkD;AAClD,eAAO,IAAI,aAAa,eAAsB,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAK1D;AAyCD;;GAEG;AACH,QAAA,MAAM,OAAO,EAAE,WA8Hd,CAAC;AAyPF,eAAe,OAAO,CAAC"}