@clawdstrike/openclaw 0.1.1 → 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.
- package/README.md +3 -1
- package/clawdstrike-security.js +1 -0
- package/dist/audit/adapter-logger.d.ts +24 -0
- package/dist/audit/adapter-logger.d.ts.map +1 -0
- package/dist/audit/adapter-logger.js +42 -0
- package/dist/audit/adapter-logger.js.map +1 -0
- package/dist/classification.d.ts +41 -0
- package/dist/classification.d.ts.map +1 -0
- package/dist/classification.js +102 -0
- package/dist/classification.js.map +1 -0
- package/dist/cli/commands/policy.js +1 -1
- package/dist/cli/commands/policy.js.map +1 -1
- package/dist/e2e/openclaw-e2e.js +3 -3
- package/dist/e2e/openclaw-e2e.js.map +1 -1
- package/dist/engine-holder.d.ts +28 -0
- package/dist/engine-holder.d.ts.map +1 -0
- package/dist/engine-holder.js +38 -0
- package/dist/engine-holder.js.map +1 -0
- package/dist/guards/egress.d.ts.map +1 -1
- package/dist/guards/egress.js +20 -1
- package/dist/guards/egress.js.map +1 -1
- package/dist/guards/forbidden-path.d.ts.map +1 -1
- package/dist/guards/forbidden-path.js +6 -0
- package/dist/guards/forbidden-path.js.map +1 -1
- package/dist/guards/secret-leak.d.ts.map +1 -1
- package/dist/guards/secret-leak.js +21 -0
- package/dist/guards/secret-leak.js.map +1 -1
- package/dist/hooks/agent-bootstrap/handler.d.ts +4 -0
- package/dist/hooks/agent-bootstrap/handler.d.ts.map +1 -1
- package/dist/hooks/agent-bootstrap/handler.js +7 -7
- package/dist/hooks/agent-bootstrap/handler.js.map +1 -1
- package/dist/hooks/approval-state.d.ts +31 -0
- package/dist/hooks/approval-state.d.ts.map +1 -0
- package/dist/hooks/approval-state.js +189 -0
- package/dist/hooks/approval-state.js.map +1 -0
- package/dist/hooks/approval-utils.d.ts +5 -0
- package/dist/hooks/approval-utils.d.ts.map +1 -0
- package/dist/hooks/approval-utils.js +77 -0
- package/dist/hooks/approval-utils.js.map +1 -0
- package/dist/hooks/audit-logger/handler.d.ts +4 -0
- package/dist/hooks/audit-logger/handler.d.ts.map +1 -1
- package/dist/hooks/audit-logger/handler.js +4 -0
- package/dist/hooks/audit-logger/handler.js.map +1 -1
- package/dist/hooks/cua-bridge/handler.d.ts +57 -0
- package/dist/hooks/cua-bridge/handler.d.ts.map +1 -0
- package/dist/hooks/cua-bridge/handler.js +369 -0
- package/dist/hooks/cua-bridge/handler.js.map +1 -0
- package/dist/hooks/tool-guard/handler.d.ts +17 -2
- package/dist/hooks/tool-guard/handler.d.ts.map +1 -1
- package/dist/hooks/tool-guard/handler.js +200 -75
- package/dist/hooks/tool-guard/handler.js.map +1 -1
- package/dist/hooks/tool-preflight/handler.d.ts +34 -0
- package/dist/hooks/tool-preflight/handler.d.ts.map +1 -0
- package/dist/hooks/tool-preflight/handler.js +426 -0
- package/dist/hooks/tool-preflight/handler.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/openclaw-adapter.d.ts +48 -0
- package/dist/openclaw-adapter.d.ts.map +1 -0
- package/dist/openclaw-adapter.js +81 -0
- package/dist/openclaw-adapter.js.map +1 -0
- package/dist/plugin.d.ts +40 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +125 -32
- package/dist/plugin.js.map +1 -1
- package/dist/policy/engine.d.ts +5 -0
- package/dist/policy/engine.d.ts.map +1 -1
- package/dist/policy/engine.js +580 -84
- package/dist/policy/engine.js.map +1 -1
- package/dist/policy/loader.js +57 -0
- package/dist/policy/loader.js.map +1 -1
- package/dist/policy/validator.d.ts.map +1 -1
- package/dist/policy/validator.js +97 -3
- package/dist/policy/validator.js.map +1 -1
- package/dist/receipt/signer.d.ts +42 -0
- package/dist/receipt/signer.d.ts.map +1 -0
- package/dist/receipt/signer.js +134 -0
- package/dist/receipt/signer.js.map +1 -0
- package/dist/receipt/types.d.ts +50 -0
- package/dist/receipt/types.d.ts.map +1 -0
- package/dist/receipt/types.js +9 -0
- package/dist/receipt/types.js.map +1 -0
- package/dist/security-prompt.js +1 -1
- package/dist/tools/policy-check.d.ts +2 -2
- package/dist/tools/policy-check.d.ts.map +1 -1
- package/dist/tools/policy-check.js +4 -7
- package/dist/tools/policy-check.js.map +1 -1
- package/dist/translator/openclaw-translator.d.ts +31 -0
- package/dist/translator/openclaw-translator.d.ts.map +1 -0
- package/dist/translator/openclaw-translator.js +314 -0
- package/dist/translator/openclaw-translator.js.map +1 -0
- package/dist/types.d.ts +86 -170
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -1
- package/package.json +5 -3
- package/rulesets/ai-agent-minimal.yaml +25 -0
- package/rulesets/ai-agent.yaml +25 -0
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Injects a SECURITY.md file into the agent bootstrap context.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { initializeEngine, getSharedEngine } from '../../engine-holder.js';
|
|
7
7
|
import { generateSecurityPrompt } from '../../security-prompt.js';
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the hook with configuration.
|
|
10
|
+
* Delegates to the shared engine holder so all hooks share one PolicyEngine.
|
|
11
|
+
*/
|
|
9
12
|
export function initialize(config) {
|
|
10
|
-
|
|
13
|
+
initializeEngine(config);
|
|
11
14
|
}
|
|
12
15
|
function getEngine(config) {
|
|
13
|
-
|
|
14
|
-
engine = new PolicyEngine(config ?? {});
|
|
15
|
-
}
|
|
16
|
-
return engine;
|
|
16
|
+
return getSharedEngine(config);
|
|
17
17
|
}
|
|
18
18
|
const handler = async (event) => {
|
|
19
19
|
if (event.type !== 'agent:bootstrap')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/hooks/agent-bootstrap/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/hooks/agent-bootstrap/handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,SAAS,CAAC,MAA0B;IAC3C,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,GAAgB,KAAK,EAAE,KAAgB,EAAiB,EAAE;IACrE,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO;IAE7C,MAAM,SAAS,GAAG,KAA4B,CAAC;IAC/C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;IAClC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAEnD,MAAM,cAAc,GAClB,sBAAsB,CAAC,MAAM,CAAC;QAC9B,yBAAyB;QACzB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhD,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC;QACpC,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawdstrike/openclaw - Shared Approval State
|
|
3
|
+
*
|
|
4
|
+
* Tracks user approval decisions from preflight so post-exec can honor them.
|
|
5
|
+
*
|
|
6
|
+
* Notes:
|
|
7
|
+
* - In-memory only (process lifetime). Not persisted to disk.
|
|
8
|
+
* - Keys are hashed to avoid embedding potentially sensitive resource strings.
|
|
9
|
+
* - TTL + LRU eviction prevents unbounded growth.
|
|
10
|
+
*/
|
|
11
|
+
export type ApprovalResolutionType = 'allow-once' | 'allow-session' | 'allow-always';
|
|
12
|
+
export interface ApprovalRecord {
|
|
13
|
+
resolution: ApprovalResolutionType;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
lastUsedAt: number;
|
|
16
|
+
expiresAt: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function recordApproval(sessionId: string, toolName: string, resource: string, resolution: ApprovalResolutionType): void;
|
|
19
|
+
/**
|
|
20
|
+
* Check if an approval exists for this (session, tool, resource) without consuming it.
|
|
21
|
+
* Only returns session/always approvals (allow-once is intentionally ignored here).
|
|
22
|
+
*/
|
|
23
|
+
export declare function peekApproval(sessionId: string, toolName: string, resource: string): ApprovalRecord | null;
|
|
24
|
+
/**
|
|
25
|
+
* Check and consume an approval for this (session, tool, resource).
|
|
26
|
+
* Consumes allow-once; keeps allow-session/allow-always.
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkAndConsumeApproval(sessionId: string, toolName: string, resource: string): ApprovalRecord | null;
|
|
29
|
+
export declare function clearSessionApprovals(sessionId: string): void;
|
|
30
|
+
export declare function clearAllApprovals(): void;
|
|
31
|
+
//# sourceMappingURL=approval-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-state.d.ts","sourceRoot":"","sources":["../../src/hooks/approval-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,eAAe,GAAG,cAAc,CAAC;AAErF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AA2CD,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,sBAAsB,GACjC,IAAI,CAuBN;AAsED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,cAAc,GAAG,IAAI,CAkBvB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,cAAc,GAAG,IAAI,CAwBvB;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawdstrike/openclaw - Shared Approval State
|
|
3
|
+
*
|
|
4
|
+
* Tracks user approval decisions from preflight so post-exec can honor them.
|
|
5
|
+
*
|
|
6
|
+
* Notes:
|
|
7
|
+
* - In-memory only (process lifetime). Not persisted to disk.
|
|
8
|
+
* - Keys are hashed to avoid embedding potentially sensitive resource strings.
|
|
9
|
+
* - TTL + LRU eviction prevents unbounded growth.
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
const MAX_SESSION_APPROVALS = 256;
|
|
13
|
+
const MAX_ALWAYS_APPROVALS = 256;
|
|
14
|
+
const TTL_ALLOW_ONCE_MS = 10 * 60 * 1000; // 10 minutes (covers slow tool runs)
|
|
15
|
+
const TTL_ALLOW_SESSION_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
16
|
+
const TTL_ALLOW_ALWAYS_MS = 7 * 24 * 60 * 60 * 1000; // 7 days (still memory-only)
|
|
17
|
+
/** Session-scoped approvals: sessionId -> (hashedKey -> record) */
|
|
18
|
+
const sessionApprovals = new Map();
|
|
19
|
+
/** Global approvals for "allow-always": hashedKey -> record */
|
|
20
|
+
const alwaysApprovals = new Map();
|
|
21
|
+
function normalizeToolName(toolName) {
|
|
22
|
+
return toolName.trim().toLowerCase();
|
|
23
|
+
}
|
|
24
|
+
function normalizeResource(resource) {
|
|
25
|
+
return resource.trim();
|
|
26
|
+
}
|
|
27
|
+
function hashKey(toolName, resource) {
|
|
28
|
+
// Avoid embedding raw resource strings in keys (resource may contain secrets).
|
|
29
|
+
// Include a separator that cannot appear in JS strings.
|
|
30
|
+
return createHash('sha256')
|
|
31
|
+
.update(normalizeToolName(toolName))
|
|
32
|
+
.update('\0')
|
|
33
|
+
.update(normalizeResource(resource))
|
|
34
|
+
.digest('hex');
|
|
35
|
+
}
|
|
36
|
+
function ttlFor(resolution) {
|
|
37
|
+
switch (resolution) {
|
|
38
|
+
case 'allow-once':
|
|
39
|
+
return TTL_ALLOW_ONCE_MS;
|
|
40
|
+
case 'allow-session':
|
|
41
|
+
return TTL_ALLOW_SESSION_MS;
|
|
42
|
+
case 'allow-always':
|
|
43
|
+
return TTL_ALLOW_ALWAYS_MS;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function recordApproval(sessionId, toolName, resource, resolution) {
|
|
47
|
+
const now = Date.now();
|
|
48
|
+
cleanupExpired(now);
|
|
49
|
+
const key = hashKey(toolName, resource);
|
|
50
|
+
const record = {
|
|
51
|
+
resolution,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
lastUsedAt: now,
|
|
54
|
+
expiresAt: now + ttlFor(resolution),
|
|
55
|
+
};
|
|
56
|
+
if (resolution === 'allow-always') {
|
|
57
|
+
setLru(alwaysApprovals, key, record, MAX_ALWAYS_APPROVALS);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let m = sessionApprovals.get(sessionId);
|
|
61
|
+
if (!m) {
|
|
62
|
+
m = new Map();
|
|
63
|
+
sessionApprovals.set(sessionId, m);
|
|
64
|
+
}
|
|
65
|
+
setLru(m, key, record, MAX_SESSION_APPROVALS);
|
|
66
|
+
}
|
|
67
|
+
function cleanupExpired(now) {
|
|
68
|
+
for (const [key, rec] of alwaysApprovals.entries()) {
|
|
69
|
+
if (now > rec.expiresAt)
|
|
70
|
+
alwaysApprovals.delete(key);
|
|
71
|
+
}
|
|
72
|
+
for (const [sid, m] of sessionApprovals.entries()) {
|
|
73
|
+
for (const [key, rec] of m.entries()) {
|
|
74
|
+
if (now > rec.expiresAt)
|
|
75
|
+
m.delete(key);
|
|
76
|
+
}
|
|
77
|
+
if (m.size === 0)
|
|
78
|
+
sessionApprovals.delete(sid);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function touch(m, key, rec, now) {
|
|
82
|
+
// LRU: delete+set moves to most-recently-used.
|
|
83
|
+
m.delete(key);
|
|
84
|
+
rec.lastUsedAt = now;
|
|
85
|
+
// Sliding expiration for session/always approvals.
|
|
86
|
+
if (rec.resolution === 'allow-session' || rec.resolution === 'allow-always') {
|
|
87
|
+
rec.expiresAt = now + ttlFor(rec.resolution);
|
|
88
|
+
}
|
|
89
|
+
m.set(key, rec);
|
|
90
|
+
}
|
|
91
|
+
function setLru(m, key, rec, maxSize) {
|
|
92
|
+
if (m.has(key))
|
|
93
|
+
m.delete(key);
|
|
94
|
+
m.set(key, rec);
|
|
95
|
+
while (m.size > maxSize) {
|
|
96
|
+
const oldest = m.keys().next().value;
|
|
97
|
+
if (oldest === undefined)
|
|
98
|
+
break;
|
|
99
|
+
m.delete(oldest);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function getRecord(sessionId, toolName, resource, now) {
|
|
103
|
+
const key = hashKey(toolName, resource);
|
|
104
|
+
const m = sessionApprovals.get(sessionId);
|
|
105
|
+
if (m) {
|
|
106
|
+
const rec = m.get(key);
|
|
107
|
+
if (rec) {
|
|
108
|
+
if (now > rec.expiresAt) {
|
|
109
|
+
m.delete(key);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
return { scope: 'session', key, record: rec };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (m.size === 0)
|
|
116
|
+
sessionApprovals.delete(sessionId);
|
|
117
|
+
}
|
|
118
|
+
const rec = alwaysApprovals.get(key);
|
|
119
|
+
if (rec) {
|
|
120
|
+
if (now > rec.expiresAt) {
|
|
121
|
+
alwaysApprovals.delete(key);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
return { scope: 'always', key, record: rec };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if an approval exists for this (session, tool, resource) without consuming it.
|
|
131
|
+
* Only returns session/always approvals (allow-once is intentionally ignored here).
|
|
132
|
+
*/
|
|
133
|
+
export function peekApproval(sessionId, toolName, resource) {
|
|
134
|
+
const now = Date.now();
|
|
135
|
+
cleanupExpired(now);
|
|
136
|
+
const found = getRecord(sessionId, toolName, resource, now);
|
|
137
|
+
if (!found)
|
|
138
|
+
return null;
|
|
139
|
+
const { scope, key, record } = found;
|
|
140
|
+
if (record.resolution === 'allow-once')
|
|
141
|
+
return null;
|
|
142
|
+
if (scope === 'session') {
|
|
143
|
+
const m = sessionApprovals.get(sessionId);
|
|
144
|
+
if (m)
|
|
145
|
+
touch(m, key, record, now);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
touch(alwaysApprovals, key, record, now);
|
|
149
|
+
}
|
|
150
|
+
return record;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check and consume an approval for this (session, tool, resource).
|
|
154
|
+
* Consumes allow-once; keeps allow-session/allow-always.
|
|
155
|
+
*/
|
|
156
|
+
export function checkAndConsumeApproval(sessionId, toolName, resource) {
|
|
157
|
+
const now = Date.now();
|
|
158
|
+
cleanupExpired(now);
|
|
159
|
+
const found = getRecord(sessionId, toolName, resource, now);
|
|
160
|
+
if (!found)
|
|
161
|
+
return null;
|
|
162
|
+
const { scope, key, record } = found;
|
|
163
|
+
if (scope === 'session') {
|
|
164
|
+
const m = sessionApprovals.get(sessionId);
|
|
165
|
+
if (m) {
|
|
166
|
+
if (record.resolution === 'allow-once') {
|
|
167
|
+
m.delete(key);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
touch(m, key, record, now);
|
|
171
|
+
}
|
|
172
|
+
if (m.size === 0)
|
|
173
|
+
sessionApprovals.delete(sessionId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// allow-always only
|
|
178
|
+
touch(alwaysApprovals, key, record, now);
|
|
179
|
+
}
|
|
180
|
+
return record;
|
|
181
|
+
}
|
|
182
|
+
export function clearSessionApprovals(sessionId) {
|
|
183
|
+
sessionApprovals.delete(sessionId);
|
|
184
|
+
}
|
|
185
|
+
export function clearAllApprovals() {
|
|
186
|
+
sessionApprovals.clear();
|
|
187
|
+
alwaysApprovals.clear();
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=approval-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-state.js","sourceRoot":"","sources":["../../src/hooks/approval-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PolicyEngine } from '../policy/engine.js';
|
|
2
|
+
export declare function extractPath(params: Record<string, unknown>): string | undefined;
|
|
3
|
+
export declare function extractNetworkTarget(params: Record<string, unknown>): string | undefined;
|
|
4
|
+
export declare function normalizeApprovalResource(policyEngine: PolicyEngine, toolName: string, params: Record<string, unknown>): string;
|
|
5
|
+
//# sourceMappingURL=approval-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-utils.d.ts","sourceRoot":"","sources":["../../src/hooks/approval-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAiB/E;AAiBD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAmCxF;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAU/H"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export function extractPath(params) {
|
|
2
|
+
const pathKeys = ['path', 'file', 'file_path', 'filepath', 'filename', 'target'];
|
|
3
|
+
for (const key of pathKeys) {
|
|
4
|
+
const value = params[key];
|
|
5
|
+
if (typeof value === 'string') {
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
// Best-effort extraction from a command string (e.g., "cat /path/to/file").
|
|
10
|
+
const cmdLine = typeof params.command === 'string' ? params.command : typeof params.cmd === 'string' ? params.cmd : undefined;
|
|
11
|
+
if (cmdLine) {
|
|
12
|
+
const match = cmdLine.match(/(?:cat|head|tail|less|more|vim|nano|read)\s+([^\s|><]+)/);
|
|
13
|
+
if (match)
|
|
14
|
+
return match[1];
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
function formatHostPort(hostRaw, port) {
|
|
19
|
+
const trimmed = hostRaw.trim();
|
|
20
|
+
if (!trimmed)
|
|
21
|
+
return '';
|
|
22
|
+
// If the host already looks like `host:port`, prefer leaving it as-is to avoid
|
|
23
|
+
// producing invalid forms like `[example.com:8080]:443`.
|
|
24
|
+
const unbracketed = trimmed.replace(/^\[|\]$/g, '');
|
|
25
|
+
const colonCount = (unbracketed.match(/:/g) ?? []).length;
|
|
26
|
+
if (colonCount === 1 && !trimmed.startsWith('[')) {
|
|
27
|
+
return trimmed;
|
|
28
|
+
}
|
|
29
|
+
return colonCount >= 2 ? `[${unbracketed}]:${port}` : `${unbracketed}:${port}`;
|
|
30
|
+
}
|
|
31
|
+
export function extractNetworkTarget(params) {
|
|
32
|
+
const url = typeof params.url === 'string' ? params.url
|
|
33
|
+
: typeof params.endpoint === 'string' ? params.endpoint
|
|
34
|
+
: typeof params.href === 'string' ? params.href
|
|
35
|
+
: undefined;
|
|
36
|
+
if (url) {
|
|
37
|
+
try {
|
|
38
|
+
const parsed = new URL(url);
|
|
39
|
+
const host = parsed.hostname;
|
|
40
|
+
if (host) {
|
|
41
|
+
const port = parsed.port
|
|
42
|
+
? parseInt(parsed.port, 10)
|
|
43
|
+
: parsed.protocol === 'https:' ? 443 : parsed.protocol === 'http:' ? 80 : undefined;
|
|
44
|
+
if (typeof port === 'number' && Number.isFinite(port)) {
|
|
45
|
+
return formatHostPort(host, port);
|
|
46
|
+
}
|
|
47
|
+
return host;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Not a valid URL; fall through to host/port keys.
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const host = typeof params.host === 'string' ? params.host
|
|
55
|
+
: typeof params.hostname === 'string' ? params.hostname
|
|
56
|
+
: undefined;
|
|
57
|
+
if (!host || !host.trim())
|
|
58
|
+
return undefined;
|
|
59
|
+
const portRaw = params.port;
|
|
60
|
+
const port = typeof portRaw === 'number' ? portRaw : typeof portRaw === 'string' ? parseInt(portRaw, 10) : undefined;
|
|
61
|
+
if (typeof port === 'number' && Number.isFinite(port)) {
|
|
62
|
+
return formatHostPort(host, port);
|
|
63
|
+
}
|
|
64
|
+
return host.trim();
|
|
65
|
+
}
|
|
66
|
+
export function normalizeApprovalResource(policyEngine, toolName, params) {
|
|
67
|
+
const raw = extractPath(params)
|
|
68
|
+
?? extractNetworkTarget(params)
|
|
69
|
+
?? (typeof params.command === 'string' ? params.command : typeof params.cmd === 'string' ? params.cmd : undefined)
|
|
70
|
+
?? toolName;
|
|
71
|
+
const redacted = policyEngine.redactSecrets(raw).trim();
|
|
72
|
+
const maxChars = 1024;
|
|
73
|
+
if (redacted.length <= maxChars)
|
|
74
|
+
return redacted;
|
|
75
|
+
return redacted.slice(0, maxChars) + '...[truncated]';
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=approval-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-utils.js","sourceRoot":"","sources":["../../src/hooks/approval-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* @clawdstrike/openclaw - Audit Logger Hook Handler
|
|
3
3
|
*
|
|
4
4
|
* Logs security events for audit and compliance.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: Not currently registered in plugin.ts. The audit logger needs to be
|
|
7
|
+
* redesigned to capture structured policy decisions (not just console output)
|
|
8
|
+
* before it can be connected end-to-end. See docs/audits/2026-02-25-openclaw-correctness-findings.md#C6.
|
|
5
9
|
*/
|
|
6
10
|
import type { HookHandler, ClawdstrikeConfig } from '../../types.js';
|
|
7
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/hooks/audit-logger/handler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/hooks/audit-logger/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EAGX,iBAAiB,EAElB,MAAM,gBAAgB,CAAC;AAMxB;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAG1D;AAED;;GAEG;AACH,QAAA,MAAM,OAAO,EAAE,WAyBd,CAAC;AAyBF,eAAe,OAAO,CAAC"}
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* @clawdstrike/openclaw - Audit Logger Hook Handler
|
|
3
3
|
*
|
|
4
4
|
* Logs security events for audit and compliance.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: Not currently registered in plugin.ts. The audit logger needs to be
|
|
7
|
+
* redesigned to capture structured policy decisions (not just console output)
|
|
8
|
+
* before it can be connected end-to-end. See docs/audits/2026-02-25-openclaw-correctness-findings.md#C6.
|
|
5
9
|
*/
|
|
6
10
|
import { mergeConfig } from '../../config.js';
|
|
7
11
|
/** Logger instance */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/hooks/audit-logger/handler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/hooks/audit-logger/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,sBAAsB;AACtB,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,GAAgB,KAAK,EAAE,KAAgB,EAAiB,EAAE;IACrE,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,KAA+B,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,UAAU,GAAG;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,SAAS;QACtC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ;QAC/C,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK;QAC9C,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;KACxC,CAAC;IAEF,uBAAuB;IACvB,IAAI,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,qCAAqC,EAAE,UAAU,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEvC,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACjB,IAAI,QAAQ,IAAI,CAAC;gBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YAChB,IAAI,QAAQ,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YAChB,IAAI,QAAQ,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACjB,IAAI,QAAQ,IAAI,CAAC;gBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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 { type PolicyEvent } from '@clawdstrike/adapter-core';
|
|
15
|
+
import type { HookHandler, ClawdstrikeConfig } from '../../types.js';
|
|
16
|
+
export declare const CUA_ERROR_CODES: {
|
|
17
|
+
readonly UNKNOWN_ACTION: "OCLAW_CUA_UNKNOWN_ACTION";
|
|
18
|
+
readonly MISSING_METADATA: "OCLAW_CUA_MISSING_METADATA";
|
|
19
|
+
readonly SESSION_MISSING: "OCLAW_CUA_SESSION_MISSING";
|
|
20
|
+
};
|
|
21
|
+
/** Maps recognized CUA action tokens to factory method selectors. */
|
|
22
|
+
type CuaActionKind = 'connect' | 'disconnect' | 'reconnect' | 'input_inject' | 'clipboard_read' | 'clipboard_write' | 'file_upload' | 'file_download' | 'session_share' | 'audio' | 'drive_mapping' | 'printing';
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the hook with configuration.
|
|
25
|
+
* Delegates to the shared engine holder so all hooks share one PolicyEngine.
|
|
26
|
+
*/
|
|
27
|
+
export declare function initialize(config: ClawdstrikeConfig): void;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a tool call is a CUA action (by prefix or explicit cua metadata).
|
|
30
|
+
*/
|
|
31
|
+
export declare function isCuaToolCall(toolName: string, params: Record<string, unknown>): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Extract the CUA action token from a tool name or params.
|
|
34
|
+
*/
|
|
35
|
+
declare function extractActionToken(toolName: string, params: Record<string, unknown>): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Classify a CUA action token into a known CuaActionKind.
|
|
38
|
+
* Returns null for unknown actions (fail-closed).
|
|
39
|
+
*/
|
|
40
|
+
declare function classifyCuaAction(token: string): CuaActionKind | null;
|
|
41
|
+
/**
|
|
42
|
+
* Build a canonical CUA PolicyEvent using the PolicyEventFactory.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildCuaEvent(sessionId: string, kind: CuaActionKind, params: Record<string, unknown>): PolicyEvent;
|
|
45
|
+
/**
|
|
46
|
+
* CUA bridge hook handler for tool_call (pre-execution) events.
|
|
47
|
+
*
|
|
48
|
+
* Only activates for CUA tool calls. Non-CUA tools pass through untouched
|
|
49
|
+
* so existing preflight behavior is preserved.
|
|
50
|
+
*
|
|
51
|
+
* Fail-closed: unknown CUA action types are denied with stable error code.
|
|
52
|
+
* Missing session ID or CUA metadata also fail closed.
|
|
53
|
+
*/
|
|
54
|
+
declare const handler: HookHandler;
|
|
55
|
+
export default handler;
|
|
56
|
+
export { classifyCuaAction, extractActionToken, type CuaActionKind, };
|
|
57
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/hooks/cua-bridge/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,WAAW,EAMX,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AAOxB,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAWX,qEAAqE;AACrE,KAAK,aAAa,GACd,SAAS,GACT,YAAY,GACZ,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,eAAe,GACf,OAAO,GACP,eAAe,GACf,UAAU,CAAC;AAqBf;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAE1D;AAeD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAYT;AAED;;GAEG;AACH,iBAAS,kBAAkB,CACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,GAAG,IAAI,CAsBf;AAED;;;GAGG;AACH,iBAAS,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAO9D;AAID;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,WAAW,CAqDb;AAkBD;;;;;;;;GAQG;AACH,QAAA,MAAM,OAAO,EAAE,WA6Hd,CAAC;AAEF,eAAe,OAAO,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,aAAa,GACnB,CAAC"}
|