@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
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawdstrike/openclaw - Receipt/Attestation Types
|
|
3
|
+
*
|
|
4
|
+
* TypeScript-side receipt types that mirror the Rust hush-core receipt
|
|
5
|
+
* infrastructure. These establish the API surface for structured (but
|
|
6
|
+
* unsigned) receipts until the WASM bridge to hush-core is ready.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* A signed attestation of a security decision.
|
|
10
|
+
*
|
|
11
|
+
* When the hush-wasm bridge is integrated, the `signature` and `keyId`
|
|
12
|
+
* fields will carry real Ed25519 values. Until then, they are `null`
|
|
13
|
+
* (unsigned stub receipts).
|
|
14
|
+
*/
|
|
15
|
+
export interface DecisionReceipt {
|
|
16
|
+
/** Unique receipt identifier */
|
|
17
|
+
id: string;
|
|
18
|
+
/** ISO 8601 timestamp of when the receipt was created */
|
|
19
|
+
timestamp: string;
|
|
20
|
+
/** SHA-256 hash of the applied policy configuration */
|
|
21
|
+
policyHash: string;
|
|
22
|
+
/** The decision that was made */
|
|
23
|
+
decision: {
|
|
24
|
+
status: 'allow' | 'warn' | 'deny';
|
|
25
|
+
guard?: string;
|
|
26
|
+
reason?: string;
|
|
27
|
+
};
|
|
28
|
+
/** Event that triggered the decision */
|
|
29
|
+
event: {
|
|
30
|
+
type: string;
|
|
31
|
+
toolName?: string;
|
|
32
|
+
resource?: string;
|
|
33
|
+
};
|
|
34
|
+
/** Ed25519 signature in JWS compact format (null when unsigned) */
|
|
35
|
+
signature: string | null;
|
|
36
|
+
/** Signing algorithm (always 'EdDSA' for Ed25519) */
|
|
37
|
+
algorithm: 'EdDSA';
|
|
38
|
+
/** Public key identifier (null when unsigned) */
|
|
39
|
+
keyId: string | null;
|
|
40
|
+
}
|
|
41
|
+
/** Configuration for receipt signing */
|
|
42
|
+
export interface ReceiptSignerConfig {
|
|
43
|
+
/** Whether to generate receipts (default: true) */
|
|
44
|
+
enabled?: boolean;
|
|
45
|
+
/** Whether to cryptographically sign receipts (default: false - requires WASM bridge) */
|
|
46
|
+
sign?: boolean;
|
|
47
|
+
/** Key ID for the signing key */
|
|
48
|
+
keyId?: string;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/receipt/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,wCAAwC;IACxC,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yFAAyF;IACzF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawdstrike/openclaw - Receipt/Attestation Types
|
|
3
|
+
*
|
|
4
|
+
* TypeScript-side receipt types that mirror the Rust hush-core receipt
|
|
5
|
+
* infrastructure. These establish the API surface for structured (but
|
|
6
|
+
* unsigned) receipts until the WASM bridge to hush-core is ready.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/receipt/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/security-prompt.js
CHANGED
|
@@ -44,7 +44,7 @@ You have access to the \`policy_check\` tool. Use it BEFORE attempting:
|
|
|
44
44
|
Example:
|
|
45
45
|
\`\`\`
|
|
46
46
|
policy_check({ action: "file_write", resource: "/etc/passwd" })
|
|
47
|
-
-> {
|
|
47
|
+
-> { status: "deny", guard: "forbidden_path", reason: "Forbidden path match: /etc/passwd" }
|
|
48
48
|
\`\`\``);
|
|
49
49
|
// Violation Handling section
|
|
50
50
|
const blockAction = policy.on_violation === 'cancel' ? 'BLOCKED' :
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Decision, ClawdstrikeConfig, ToolDefinition } from '../types.js';
|
|
2
2
|
import { PolicyEngine } from '../policy/engine.js';
|
|
3
3
|
export type PolicyCheckAction = 'file_read' | 'file_write' | 'network' | 'network_egress' | 'command' | 'command_exec' | 'tool_call';
|
|
4
|
-
export
|
|
4
|
+
export type PolicyCheckResult = Decision & {
|
|
5
5
|
message: string;
|
|
6
6
|
suggestion?: string;
|
|
7
|
-
}
|
|
7
|
+
};
|
|
8
8
|
export declare function checkPolicy(config: ClawdstrikeConfig, action: PolicyCheckAction, resource: string): Promise<PolicyCheckResult>;
|
|
9
9
|
export declare function policyCheckTool(engine: PolicyEngine): ToolDefinition;
|
|
10
10
|
//# sourceMappingURL=policy-check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/tools/policy-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,YAAY,GACZ,SAAS,GACT,gBAAgB,GAChB,SAAS,GACT,cAAc,GACd,WAAW,CAAC;AAEhB,MAAM,
|
|
1
|
+
{"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/tools/policy-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,YAAY,GACZ,SAAS,GACT,gBAAgB,GAChB,SAAS,GACT,cAAc,GACd,WAAW,CAAC;AAEhB,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAwFF,wBAAsB,WAAW,CAC/B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CAK5B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CA+BpE"}
|
|
@@ -68,14 +68,12 @@ function buildEvent(action, resource) {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
function formatDecision(decision) {
|
|
71
|
-
|
|
72
|
-
const isWarn = decision.status === 'warn' || decision.warn;
|
|
73
|
-
if (isDenied) {
|
|
71
|
+
if (decision.status === 'deny') {
|
|
74
72
|
const guard = decision.guard ? ` by ${decision.guard}` : '';
|
|
75
73
|
const reason = decision.reason ? `: ${decision.reason}` : '';
|
|
76
74
|
return `Denied${guard}${reason}`;
|
|
77
75
|
}
|
|
78
|
-
if (
|
|
76
|
+
if (decision.status === 'warn') {
|
|
79
77
|
const msg = decision.message ?? decision.reason ?? 'Policy warning';
|
|
80
78
|
return `Warning: ${msg}`;
|
|
81
79
|
}
|
|
@@ -85,8 +83,7 @@ export async function checkPolicy(config, action, resource) {
|
|
|
85
83
|
const engine = new PolicyEngine(config);
|
|
86
84
|
const event = buildEvent(action, resource);
|
|
87
85
|
const decision = await engine.evaluate(event);
|
|
88
|
-
|
|
89
|
-
return { ...decision, message: formatDecision(decision), suggestion: isDenied ? getSuggestion(action, resource) : undefined };
|
|
86
|
+
return { ...decision, message: formatDecision(decision), suggestion: decision.status === 'deny' ? getSuggestion(action, resource) : undefined };
|
|
90
87
|
}
|
|
91
88
|
export function policyCheckTool(engine) {
|
|
92
89
|
return {
|
|
@@ -115,7 +112,7 @@ export function policyCheckTool(engine) {
|
|
|
115
112
|
return {
|
|
116
113
|
...decision,
|
|
117
114
|
message: formatDecision(decision),
|
|
118
|
-
suggestion:
|
|
115
|
+
suggestion: decision.status === 'deny' ? getSuggestion(action, resource) : undefined,
|
|
119
116
|
};
|
|
120
117
|
},
|
|
121
118
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-check.js","sourceRoot":"","sources":["../../src/tools/policy-check.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"policy-check.js","sourceRoot":"","sources":["../../src/tools/policy-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawdstrike/openclaw - Tool Call Translator
|
|
3
|
+
*
|
|
4
|
+
* Maps OpenClaw tool calls to canonical PolicyEvent objects using the shared
|
|
5
|
+
* token-based classification system. This is the OpenClaw equivalent of the
|
|
6
|
+
* Claude adapter's `claudeCuaTranslator` — it normalizes framework-specific
|
|
7
|
+
* tool calls into the canonical event schema consumed by the policy engine.
|
|
8
|
+
*
|
|
9
|
+
* Design: returns `null` for tools that cannot be confidently classified,
|
|
10
|
+
* allowing the BaseToolInterceptor fallback to handle them.
|
|
11
|
+
*/
|
|
12
|
+
import type { AdapterConfig, ToolCallTranslator } from '@clawdstrike/adapter-core';
|
|
13
|
+
/**
|
|
14
|
+
* OpenClaw tool-call translator.
|
|
15
|
+
*
|
|
16
|
+
* Uses the shared token-based classification system from `classification.ts`
|
|
17
|
+
* to map tool calls to canonical PolicyEvent objects. CUA tool calls are
|
|
18
|
+
* delegated to the CUA bridge's event builder.
|
|
19
|
+
*
|
|
20
|
+
* Returns `null` when the tool cannot be confidently classified, allowing
|
|
21
|
+
* the BaseToolInterceptor to apply its own fallback logic.
|
|
22
|
+
*/
|
|
23
|
+
export declare const openclawTranslator: ToolCallTranslator;
|
|
24
|
+
/**
|
|
25
|
+
* Compose an AdapterConfig that chains the OpenClaw translator before
|
|
26
|
+
* any user-supplied translator. The OpenClaw translator runs first;
|
|
27
|
+
* if it returns a PolicyEvent, that result is used. Otherwise, the
|
|
28
|
+
* user-supplied translator (if any) gets a chance to translate.
|
|
29
|
+
*/
|
|
30
|
+
export declare function composeOpenClawConfig(config?: AdapterConfig): AdapterConfig;
|
|
31
|
+
//# sourceMappingURL=openclaw-translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-translator.d.ts","sourceRoot":"","sources":["../../src/translator/openclaw-translator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,aAAa,EAGb,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AA6InC;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,EAAE,kBAyKhC,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,aAAkB,GAAG,aAAa,CAU/E"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clawdstrike/openclaw - Tool Call Translator
|
|
3
|
+
*
|
|
4
|
+
* Maps OpenClaw tool calls to canonical PolicyEvent objects using the shared
|
|
5
|
+
* token-based classification system. This is the OpenClaw equivalent of the
|
|
6
|
+
* Claude adapter's `claudeCuaTranslator` — it normalizes framework-specific
|
|
7
|
+
* tool calls into the canonical event schema consumed by the policy engine.
|
|
8
|
+
*
|
|
9
|
+
* Design: returns `null` for tools that cannot be confidently classified,
|
|
10
|
+
* allowing the BaseToolInterceptor fallback to handle them.
|
|
11
|
+
*/
|
|
12
|
+
import { tokenize, classifyTool, inferEventTypeFromName, } from '../classification.js';
|
|
13
|
+
import { isCuaToolCall, buildCuaEvent, classifyCuaAction, extractActionToken, } from '../hooks/cua-bridge/handler.js';
|
|
14
|
+
import { extractPath } from '../hooks/approval-utils.js';
|
|
15
|
+
// ── Parameter Extraction Helpers ────────────────────────────────────
|
|
16
|
+
function extractFilePath(params) {
|
|
17
|
+
return extractPath(params) ?? '';
|
|
18
|
+
}
|
|
19
|
+
function extractCommand(params) {
|
|
20
|
+
const cmdLine = typeof params.command === 'string'
|
|
21
|
+
? params.command
|
|
22
|
+
: typeof params.cmd === 'string'
|
|
23
|
+
? params.cmd
|
|
24
|
+
: '';
|
|
25
|
+
const argv = Array.isArray(params.argv) && params.argv.every((a) => typeof a === 'string')
|
|
26
|
+
? params.argv
|
|
27
|
+
: Array.isArray(params.args) && params.args.every((a) => typeof a === 'string')
|
|
28
|
+
? params.args
|
|
29
|
+
: null;
|
|
30
|
+
let command = '';
|
|
31
|
+
let args = [];
|
|
32
|
+
if (cmdLine.trim()) {
|
|
33
|
+
const parts = cmdLine.trim().split(/\s+/).filter(Boolean);
|
|
34
|
+
command = parts[0] ?? '';
|
|
35
|
+
const inlineArgs = parts.slice(1);
|
|
36
|
+
if (inlineArgs.length > 0) {
|
|
37
|
+
args = inlineArgs;
|
|
38
|
+
}
|
|
39
|
+
else if (argv && argv.length > 0) {
|
|
40
|
+
args = argv[0] === command ? argv.slice(1) : argv;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (argv && argv.length > 0) {
|
|
44
|
+
[command, ...args] = argv;
|
|
45
|
+
}
|
|
46
|
+
return { command, args };
|
|
47
|
+
}
|
|
48
|
+
function extractNetworkInfo(params) {
|
|
49
|
+
const url = typeof params.url === 'string' ? params.url
|
|
50
|
+
: typeof params.endpoint === 'string' ? params.endpoint
|
|
51
|
+
: typeof params.href === 'string' ? params.href
|
|
52
|
+
: undefined;
|
|
53
|
+
if (url) {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = new URL(url);
|
|
56
|
+
return {
|
|
57
|
+
host: parsed.hostname,
|
|
58
|
+
port: parsed.port
|
|
59
|
+
? parseInt(parsed.port, 10)
|
|
60
|
+
: (parsed.protocol === 'https:' || parsed.protocol === 'wss:' ? 443 : 80),
|
|
61
|
+
url,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Not a valid URL; fall through.
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const host = typeof params.host === 'string' ? params.host
|
|
69
|
+
: typeof params.hostname === 'string' ? params.hostname
|
|
70
|
+
: 'unknown';
|
|
71
|
+
const port = typeof params.port === 'number' ? params.port : 80;
|
|
72
|
+
return { host, port, url };
|
|
73
|
+
}
|
|
74
|
+
function extractPatchInfo(params) {
|
|
75
|
+
const filePath = typeof params.filePath === 'string' ? params.filePath
|
|
76
|
+
: typeof params.path === 'string' ? params.path
|
|
77
|
+
: '';
|
|
78
|
+
const patchContent = typeof params.patch === 'string' ? params.patch
|
|
79
|
+
: typeof params.diff === 'string' ? params.diff
|
|
80
|
+
: typeof params.content === 'string' ? params.content
|
|
81
|
+
: '';
|
|
82
|
+
return { filePath, patchContent };
|
|
83
|
+
}
|
|
84
|
+
// ── Parameter-based fallback heuristics ─────────────────────────────
|
|
85
|
+
function looksLikePatchApply(params) {
|
|
86
|
+
return typeof params.patch === 'string'
|
|
87
|
+
|| typeof params.diff === 'string'
|
|
88
|
+
|| typeof params.patchContent === 'string';
|
|
89
|
+
}
|
|
90
|
+
function looksLikeCommandExec(params) {
|
|
91
|
+
if (typeof params.command === 'string' || typeof params.cmd === 'string')
|
|
92
|
+
return true;
|
|
93
|
+
if (Array.isArray(params.args) && params.args.every((a) => typeof a === 'string'))
|
|
94
|
+
return true;
|
|
95
|
+
if (Array.isArray(params.argv) && params.argv.every((a) => typeof a === 'string'))
|
|
96
|
+
return true;
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
function looksLikeNetworkEgress(params) {
|
|
100
|
+
if (typeof params.url === 'string' || typeof params.endpoint === 'string' || typeof params.href === 'string')
|
|
101
|
+
return true;
|
|
102
|
+
if (typeof params.host === 'string' || typeof params.hostname === 'string')
|
|
103
|
+
return true;
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
function looksLikeFileWrite(params) {
|
|
107
|
+
if (typeof params.content === 'string')
|
|
108
|
+
return true;
|
|
109
|
+
if (typeof params.text === 'string')
|
|
110
|
+
return true;
|
|
111
|
+
if (typeof params.contentBase64 === 'string')
|
|
112
|
+
return true;
|
|
113
|
+
if (typeof params.base64 === 'string')
|
|
114
|
+
return true;
|
|
115
|
+
if (typeof params.patch === 'string' || typeof params.diff === 'string')
|
|
116
|
+
return true;
|
|
117
|
+
if (typeof params.operation === 'string') {
|
|
118
|
+
const op = params.operation.toLowerCase();
|
|
119
|
+
if (op === 'write' || op === 'append' || op === 'delete' || op === 'remove' || op === 'truncate')
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
// ── Event ID ────────────────────────────────────────────────────────
|
|
125
|
+
function generateEventId() {
|
|
126
|
+
return `oclaw-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
127
|
+
}
|
|
128
|
+
// ── Core Translator ─────────────────────────────────────────────────
|
|
129
|
+
/**
|
|
130
|
+
* OpenClaw tool-call translator.
|
|
131
|
+
*
|
|
132
|
+
* Uses the shared token-based classification system from `classification.ts`
|
|
133
|
+
* to map tool calls to canonical PolicyEvent objects. CUA tool calls are
|
|
134
|
+
* delegated to the CUA bridge's event builder.
|
|
135
|
+
*
|
|
136
|
+
* Returns `null` when the tool cannot be confidently classified, allowing
|
|
137
|
+
* the BaseToolInterceptor to apply its own fallback logic.
|
|
138
|
+
*/
|
|
139
|
+
export const openclawTranslator = (input) => {
|
|
140
|
+
const { toolName, parameters, sessionId } = input;
|
|
141
|
+
// ── CUA Detection ───────────────────────────────────────────────
|
|
142
|
+
if (isCuaToolCall(toolName, parameters)) {
|
|
143
|
+
if (!sessionId)
|
|
144
|
+
return null;
|
|
145
|
+
const actionToken = extractActionToken(toolName, parameters);
|
|
146
|
+
if (!actionToken)
|
|
147
|
+
return null;
|
|
148
|
+
const kind = classifyCuaAction(actionToken);
|
|
149
|
+
if (!kind)
|
|
150
|
+
return null;
|
|
151
|
+
return buildCuaEvent(sessionId, kind, parameters);
|
|
152
|
+
}
|
|
153
|
+
// ── Token-based classification ──────────────────────────────────
|
|
154
|
+
const tokens = tokenize(toolName);
|
|
155
|
+
const classification = classifyTool(tokens);
|
|
156
|
+
const eventType = inferEventTypeFromName(toolName);
|
|
157
|
+
const timestamp = new Date().toISOString();
|
|
158
|
+
// Use the inferred event type from name tokens when available.
|
|
159
|
+
if (eventType) {
|
|
160
|
+
switch (eventType) {
|
|
161
|
+
case 'file_read': {
|
|
162
|
+
const path = extractFilePath(parameters);
|
|
163
|
+
return {
|
|
164
|
+
eventId: generateEventId(),
|
|
165
|
+
eventType: 'file_read',
|
|
166
|
+
timestamp,
|
|
167
|
+
sessionId,
|
|
168
|
+
data: { type: 'file', path, operation: 'read' },
|
|
169
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
case 'file_write': {
|
|
173
|
+
const path = extractFilePath(parameters);
|
|
174
|
+
return {
|
|
175
|
+
eventId: generateEventId(),
|
|
176
|
+
eventType: 'file_write',
|
|
177
|
+
timestamp,
|
|
178
|
+
sessionId,
|
|
179
|
+
data: {
|
|
180
|
+
type: 'file',
|
|
181
|
+
path,
|
|
182
|
+
operation: 'write',
|
|
183
|
+
...(typeof parameters.content === 'string' ? { content: parameters.content } : {}),
|
|
184
|
+
},
|
|
185
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
case 'command_exec': {
|
|
189
|
+
const { command, args } = extractCommand(parameters);
|
|
190
|
+
return {
|
|
191
|
+
eventId: generateEventId(),
|
|
192
|
+
eventType: 'command_exec',
|
|
193
|
+
timestamp,
|
|
194
|
+
sessionId,
|
|
195
|
+
data: {
|
|
196
|
+
type: 'command',
|
|
197
|
+
command,
|
|
198
|
+
args,
|
|
199
|
+
...(typeof parameters.cwd === 'string' ? { workingDir: parameters.cwd } : {}),
|
|
200
|
+
},
|
|
201
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
case 'network_egress': {
|
|
205
|
+
const { host, port, url } = extractNetworkInfo(parameters);
|
|
206
|
+
return {
|
|
207
|
+
eventId: generateEventId(),
|
|
208
|
+
eventType: 'network_egress',
|
|
209
|
+
timestamp,
|
|
210
|
+
sessionId,
|
|
211
|
+
data: { type: 'network', host, port, url },
|
|
212
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
case 'patch_apply': {
|
|
216
|
+
const { filePath, patchContent } = extractPatchInfo(parameters);
|
|
217
|
+
return {
|
|
218
|
+
eventId: generateEventId(),
|
|
219
|
+
eventType: 'patch_apply',
|
|
220
|
+
timestamp,
|
|
221
|
+
sessionId,
|
|
222
|
+
data: { type: 'patch', filePath, patchContent },
|
|
223
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
default:
|
|
227
|
+
// Other event types (e.g. CUA remote.* types) are already handled above.
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// ── Parameter-based fallback for unclassified tools ─────────────
|
|
232
|
+
// When token-based classification returns null (unknown), attempt
|
|
233
|
+
// parameter inspection — same heuristics as the preflight handler.
|
|
234
|
+
if (classification === 'unknown') {
|
|
235
|
+
if (looksLikePatchApply(parameters)) {
|
|
236
|
+
const { filePath, patchContent } = extractPatchInfo(parameters);
|
|
237
|
+
return {
|
|
238
|
+
eventId: generateEventId(),
|
|
239
|
+
eventType: 'patch_apply',
|
|
240
|
+
timestamp,
|
|
241
|
+
sessionId,
|
|
242
|
+
data: { type: 'patch', filePath, patchContent },
|
|
243
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
if (looksLikeCommandExec(parameters)) {
|
|
247
|
+
const { command, args } = extractCommand(parameters);
|
|
248
|
+
return {
|
|
249
|
+
eventId: generateEventId(),
|
|
250
|
+
eventType: 'command_exec',
|
|
251
|
+
timestamp,
|
|
252
|
+
sessionId,
|
|
253
|
+
data: {
|
|
254
|
+
type: 'command',
|
|
255
|
+
command,
|
|
256
|
+
args,
|
|
257
|
+
...(typeof parameters.cwd === 'string' ? { workingDir: parameters.cwd } : {}),
|
|
258
|
+
},
|
|
259
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
if (looksLikeNetworkEgress(parameters)) {
|
|
263
|
+
const { host, port, url } = extractNetworkInfo(parameters);
|
|
264
|
+
return {
|
|
265
|
+
eventId: generateEventId(),
|
|
266
|
+
eventType: 'network_egress',
|
|
267
|
+
timestamp,
|
|
268
|
+
sessionId,
|
|
269
|
+
data: { type: 'network', host, port, url },
|
|
270
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const path = extractFilePath(parameters);
|
|
274
|
+
if (path) {
|
|
275
|
+
const isWrite = looksLikeFileWrite(parameters);
|
|
276
|
+
return {
|
|
277
|
+
eventId: generateEventId(),
|
|
278
|
+
eventType: isWrite ? 'file_write' : 'file_read',
|
|
279
|
+
timestamp,
|
|
280
|
+
sessionId,
|
|
281
|
+
data: {
|
|
282
|
+
type: 'file',
|
|
283
|
+
path,
|
|
284
|
+
operation: isWrite ? 'write' : 'read',
|
|
285
|
+
...(isWrite && typeof parameters.content === 'string' ? { content: parameters.content } : {}),
|
|
286
|
+
},
|
|
287
|
+
metadata: { source: 'openclaw-translator', toolName },
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Cannot confidently classify — return null so BaseToolInterceptor
|
|
292
|
+
// can apply its own default handling.
|
|
293
|
+
return null;
|
|
294
|
+
};
|
|
295
|
+
// ── Config Composer ─────────────────────────────────────────────────
|
|
296
|
+
/**
|
|
297
|
+
* Compose an AdapterConfig that chains the OpenClaw translator before
|
|
298
|
+
* any user-supplied translator. The OpenClaw translator runs first;
|
|
299
|
+
* if it returns a PolicyEvent, that result is used. Otherwise, the
|
|
300
|
+
* user-supplied translator (if any) gets a chance to translate.
|
|
301
|
+
*/
|
|
302
|
+
export function composeOpenClawConfig(config = {}) {
|
|
303
|
+
const userTranslator = config.translateToolCall;
|
|
304
|
+
return {
|
|
305
|
+
...config,
|
|
306
|
+
translateToolCall: (input) => {
|
|
307
|
+
const translated = openclawTranslator(input);
|
|
308
|
+
if (translated)
|
|
309
|
+
return translated;
|
|
310
|
+
return userTranslator ? userTranslator(input) : null;
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=openclaw-translator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-translator.js","sourceRoot":"","sources":["../../src/translator/openclaw-translator.ts"],"names":[],"mappings":"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"}
|