@goplus/agentguard 1.0.2 → 1.0.4

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 (50) hide show
  1. package/README.md +126 -12
  2. package/dist/adapters/claude-code.d.ts +16 -0
  3. package/dist/adapters/claude-code.d.ts.map +1 -0
  4. package/dist/adapters/claude-code.js +128 -0
  5. package/dist/adapters/claude-code.js.map +1 -0
  6. package/dist/adapters/common.d.ts +40 -0
  7. package/dist/adapters/common.d.ts.map +1 -0
  8. package/dist/adapters/common.js +166 -0
  9. package/dist/adapters/common.js.map +1 -0
  10. package/dist/adapters/engine.d.ts +9 -0
  11. package/dist/adapters/engine.d.ts.map +1 -0
  12. package/dist/adapters/engine.js +93 -0
  13. package/dist/adapters/engine.js.map +1 -0
  14. package/dist/adapters/index.d.ts +7 -0
  15. package/dist/adapters/index.d.ts.map +1 -0
  16. package/dist/adapters/index.js +22 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/adapters/openclaw-plugin.d.ts +72 -0
  19. package/dist/adapters/openclaw-plugin.d.ts.map +1 -0
  20. package/dist/adapters/openclaw-plugin.js +369 -0
  21. package/dist/adapters/openclaw-plugin.js.map +1 -0
  22. package/dist/adapters/openclaw.d.ts +22 -0
  23. package/dist/adapters/openclaw.d.ts.map +1 -0
  24. package/dist/adapters/openclaw.js +118 -0
  25. package/dist/adapters/openclaw.js.map +1 -0
  26. package/dist/adapters/types.d.ts +81 -0
  27. package/dist/adapters/types.d.ts.map +1 -0
  28. package/dist/adapters/types.js +3 -0
  29. package/dist/adapters/types.js.map +1 -0
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +14 -7
  33. package/dist/index.js.map +1 -1
  34. package/dist/tests/adapter.test.d.ts +2 -0
  35. package/dist/tests/adapter.test.d.ts.map +1 -0
  36. package/dist/tests/adapter.test.js +396 -0
  37. package/dist/tests/adapter.test.js.map +1 -0
  38. package/dist/tests/helpers/test-utils.d.ts +23 -0
  39. package/dist/tests/helpers/test-utils.d.ts.map +1 -0
  40. package/dist/tests/helpers/test-utils.js +37 -0
  41. package/dist/tests/helpers/test-utils.js.map +1 -0
  42. package/dist/tests/integration.test.d.ts +2 -0
  43. package/dist/tests/integration.test.d.ts.map +1 -0
  44. package/dist/tests/integration.test.js +229 -0
  45. package/dist/tests/integration.test.js.map +1 -0
  46. package/dist/tests/smoke.test.d.ts +2 -0
  47. package/dist/tests/smoke.test.d.ts.map +1 -0
  48. package/dist/tests/smoke.test.js +94 -0
  49. package/dist/tests/smoke.test.js.map +1 -0
  50. package/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateHook = evaluateHook;
4
+ const common_js_1 = require("./common.js");
5
+ /**
6
+ * Evaluate a hook event using the common AgentGuard decision engine.
7
+ *
8
+ * This is the platform-agnostic core — adapters handle I/O protocol,
9
+ * this function handles security logic.
10
+ */
11
+ async function evaluateHook(adapter, rawInput, options) {
12
+ const input = adapter.parseInput(rawInput);
13
+ // Post-tool events → audit only
14
+ if (input.eventType === 'post') {
15
+ const skill = await adapter.inferInitiatingSkill(input);
16
+ (0, common_js_1.writeAuditLog)(input, null, skill);
17
+ return { decision: 'allow' };
18
+ }
19
+ // Build envelope
20
+ const initiatingSkill = await adapter.inferInitiatingSkill(input);
21
+ const envelope = adapter.buildEnvelope(input, initiatingSkill);
22
+ if (!envelope) {
23
+ return { decision: 'allow' };
24
+ }
25
+ // Fast check: sensitive file paths (Write/Edit)
26
+ const actionType = adapter.mapToolToActionType(input.toolName);
27
+ if (actionType === 'write_file') {
28
+ const filePath = input.toolInput.file_path ||
29
+ input.toolInput.path || '';
30
+ if ((0, common_js_1.isSensitivePath)(filePath)) {
31
+ const skillTag = initiatingSkill ? ` (via skill: ${initiatingSkill})` : '';
32
+ const reason = `GoPlus AgentGuard: blocked write to sensitive path "${filePath}"${skillTag}`;
33
+ (0, common_js_1.writeAuditLog)(input, { decision: 'deny', risk_level: 'critical', risk_tags: ['SENSITIVE_PATH'] }, initiatingSkill);
34
+ // In permissive mode, ask for user-initiated writes
35
+ if (options.config.level === 'permissive' && !initiatingSkill) {
36
+ return { decision: 'ask', reason, riskLevel: 'critical', riskTags: ['SENSITIVE_PATH'], initiatingSkill };
37
+ }
38
+ return { decision: 'deny', reason, riskLevel: 'critical', riskTags: ['SENSITIVE_PATH'], initiatingSkill };
39
+ }
40
+ }
41
+ // Full ActionScanner evaluation
42
+ try {
43
+ const decision = await options.agentguard.actionScanner.decide(envelope);
44
+ // Skill trust policy enforcement
45
+ if (initiatingSkill) {
46
+ const policy = await (0, common_js_1.getSkillTrustPolicy)(initiatingSkill, options.agentguard.registry);
47
+ if (!policy.isKnown || policy.trustLevel === 'untrusted') {
48
+ if (!(0, common_js_1.isActionAllowedByCapabilities)(envelope.action.type, { can_exec: false, can_network: false, can_write: false, can_read: true, can_web3: false })) {
49
+ const reason = `GoPlus AgentGuard: untrusted skill "${initiatingSkill}" attempted ${envelope.action.type} — register it with /agentguard trust attest to allow`;
50
+ (0, common_js_1.writeAuditLog)(input, { decision: 'deny', risk_level: 'high', risk_tags: ['UNTRUSTED_SKILL', ...(decision.risk_tags || [])] }, initiatingSkill);
51
+ return { decision: 'ask', reason, riskLevel: 'high', riskTags: ['UNTRUSTED_SKILL'], initiatingSkill };
52
+ }
53
+ }
54
+ if (policy.isKnown && policy.capabilities) {
55
+ if (!(0, common_js_1.isActionAllowedByCapabilities)(envelope.action.type, policy.capabilities)) {
56
+ const reason = `GoPlus AgentGuard: skill "${initiatingSkill}" is not allowed to ${envelope.action.type} per its trust policy`;
57
+ (0, common_js_1.writeAuditLog)(input, { decision: 'deny', risk_level: 'high', risk_tags: ['CAPABILITY_EXCEEDED', ...(decision.risk_tags || [])] }, initiatingSkill);
58
+ return { decision: 'deny', reason, riskLevel: 'high', riskTags: ['CAPABILITY_EXCEEDED'], initiatingSkill };
59
+ }
60
+ }
61
+ }
62
+ // Write audit log
63
+ (0, common_js_1.writeAuditLog)(input, decision, initiatingSkill);
64
+ // Apply protection level thresholds
65
+ const skillTag = initiatingSkill ? ` (via skill: ${initiatingSkill})` : '';
66
+ const tags = (decision.risk_tags || []).join(', ');
67
+ if ((0, common_js_1.shouldDenyAtLevel)(decision, options.config)) {
68
+ return {
69
+ decision: 'deny',
70
+ reason: `GoPlus AgentGuard: ${decision.explanation || 'Action blocked'}${skillTag} [${tags}]`,
71
+ riskLevel: decision.risk_level,
72
+ riskTags: decision.risk_tags,
73
+ initiatingSkill,
74
+ };
75
+ }
76
+ if ((0, common_js_1.shouldAskAtLevel)(decision, options.config)) {
77
+ return {
78
+ decision: 'ask',
79
+ reason: `GoPlus AgentGuard: ${decision.explanation || 'Action requires confirmation'}${skillTag} [${tags}]`,
80
+ riskLevel: decision.risk_level,
81
+ riskTags: decision.risk_tags,
82
+ initiatingSkill,
83
+ };
84
+ }
85
+ return { decision: 'allow', initiatingSkill };
86
+ }
87
+ catch {
88
+ // Engine error → fail open
89
+ (0, common_js_1.writeAuditLog)(input, { decision: 'error', risk_level: 'low', risk_tags: ['ENGINE_ERROR'] }, initiatingSkill);
90
+ return { decision: 'allow' };
91
+ }
92
+ }
93
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/adapters/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { HookAdapter, HookInput, HookOutput, EngineOptions, AgentGuardInstance } from './types.js';
2
+ export { ClaudeCodeAdapter } from './claude-code.js';
3
+ export { OpenClawAdapter } from './openclaw.js';
4
+ export { evaluateHook } from './engine.js';
5
+ export { registerOpenClawPlugin, getPluginIdFromTool, getPluginScanResult, type OpenClawPluginOptions, } from './openclaw-plugin.js';
6
+ export { loadConfig, isSensitivePath, shouldDenyAtLevel, shouldAskAtLevel, writeAuditLog, getSkillTrustPolicy, isActionAllowedByCapabilities, } from './common.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isActionAllowedByCapabilities = exports.getSkillTrustPolicy = exports.writeAuditLog = exports.shouldAskAtLevel = exports.shouldDenyAtLevel = exports.isSensitivePath = exports.loadConfig = exports.getPluginScanResult = exports.getPluginIdFromTool = exports.registerOpenClawPlugin = exports.evaluateHook = exports.OpenClawAdapter = exports.ClaudeCodeAdapter = void 0;
4
+ var claude_code_js_1 = require("./claude-code.js");
5
+ Object.defineProperty(exports, "ClaudeCodeAdapter", { enumerable: true, get: function () { return claude_code_js_1.ClaudeCodeAdapter; } });
6
+ var openclaw_js_1 = require("./openclaw.js");
7
+ Object.defineProperty(exports, "OpenClawAdapter", { enumerable: true, get: function () { return openclaw_js_1.OpenClawAdapter; } });
8
+ var engine_js_1 = require("./engine.js");
9
+ Object.defineProperty(exports, "evaluateHook", { enumerable: true, get: function () { return engine_js_1.evaluateHook; } });
10
+ var openclaw_plugin_js_1 = require("./openclaw-plugin.js");
11
+ Object.defineProperty(exports, "registerOpenClawPlugin", { enumerable: true, get: function () { return openclaw_plugin_js_1.registerOpenClawPlugin; } });
12
+ Object.defineProperty(exports, "getPluginIdFromTool", { enumerable: true, get: function () { return openclaw_plugin_js_1.getPluginIdFromTool; } });
13
+ Object.defineProperty(exports, "getPluginScanResult", { enumerable: true, get: function () { return openclaw_plugin_js_1.getPluginScanResult; } });
14
+ var common_js_1 = require("./common.js");
15
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return common_js_1.loadConfig; } });
16
+ Object.defineProperty(exports, "isSensitivePath", { enumerable: true, get: function () { return common_js_1.isSensitivePath; } });
17
+ Object.defineProperty(exports, "shouldDenyAtLevel", { enumerable: true, get: function () { return common_js_1.shouldDenyAtLevel; } });
18
+ Object.defineProperty(exports, "shouldAskAtLevel", { enumerable: true, get: function () { return common_js_1.shouldAskAtLevel; } });
19
+ Object.defineProperty(exports, "writeAuditLog", { enumerable: true, get: function () { return common_js_1.writeAuditLog; } });
20
+ Object.defineProperty(exports, "getSkillTrustPolicy", { enumerable: true, get: function () { return common_js_1.getSkillTrustPolicy; } });
21
+ Object.defineProperty(exports, "isActionAllowedByCapabilities", { enumerable: true, get: function () { return common_js_1.isActionAllowedByCapabilities; } });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;AACA,mDAAqD;AAA5C,mHAAA,iBAAiB,OAAA;AAC1B,6CAAgD;AAAvC,8GAAA,eAAe,OAAA;AACxB,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AACrB,2DAK8B;AAJ5B,4HAAA,sBAAsB,OAAA;AACtB,yHAAA,mBAAmB,OAAA;AACnB,yHAAA,mBAAmB,OAAA;AAGrB,yCAQqB;AAPnB,uGAAA,UAAU,OAAA;AACV,4GAAA,eAAe,OAAA;AACf,8GAAA,iBAAiB,OAAA;AACjB,6GAAA,gBAAgB,OAAA;AAChB,0GAAA,aAAa,OAAA;AACb,gHAAA,mBAAmB,OAAA;AACnB,0HAAA,6BAA6B,OAAA"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * GoPlus AgentGuard — OpenClaw Plugin
3
+ *
4
+ * Registers before_tool_call, after_tool_call, and session_start hooks
5
+ * with the OpenClaw plugin API to evaluate tool safety at runtime and
6
+ * auto-scan installed skills on session startup.
7
+ *
8
+ * Features:
9
+ * - Auto-scan all loaded plugins on registration
10
+ * - Auto-scan skill directories (~/.openclaw/skills/, ~/.claude/skills/) on session_start
11
+ * - Auto-register plugins to AgentGuard trust registry
12
+ * - Build toolName → pluginId mapping for initiating skill inference
13
+ *
14
+ * Usage in OpenClaw plugin config:
15
+ * import agentguard from '@goplus/agentguard/openclaw';
16
+ * export default agentguard;
17
+ *
18
+ * Or register manually:
19
+ * import { registerOpenClawPlugin } from '@goplus/agentguard';
20
+ * registerOpenClawPlugin(api);
21
+ */
22
+ import type { AgentGuardInstance } from './types.js';
23
+ import { SkillScanner } from '../scanner/index.js';
24
+ import { SkillRegistry } from '../registry/index.js';
25
+ /**
26
+ * OpenClaw plugin API interface (subset we use)
27
+ */
28
+ interface OpenClawPluginApi {
29
+ id: string;
30
+ name: string;
31
+ source: string;
32
+ on(event: string, handler: (event: unknown, ctx?: unknown) => Promise<unknown>): void;
33
+ on(event: string, options: Record<string, unknown>, handler: (event: unknown, ctx?: unknown) => Promise<unknown>): void;
34
+ }
35
+ /**
36
+ * Plugin registration options
37
+ */
38
+ export interface OpenClawPluginOptions {
39
+ /** Protection level (strict/balanced/permissive) */
40
+ level?: string;
41
+ /** Enable auto-scanning of plugins (default: false — opt-in) */
42
+ skipAutoScan?: boolean;
43
+ /** Custom AgentGuard instance factory */
44
+ agentguardFactory?: () => AgentGuardInstance;
45
+ /** Custom scanner instance */
46
+ scanner?: SkillScanner;
47
+ /** Custom registry instance */
48
+ registry?: SkillRegistry;
49
+ }
50
+ /**
51
+ * Get plugin ID from tool name
52
+ */
53
+ export declare function getPluginIdFromTool(toolName: string): string | null;
54
+ /**
55
+ * Get scan result for a plugin
56
+ */
57
+ export declare function getPluginScanResult(pluginId: string): {
58
+ riskLevel: string;
59
+ riskTags: string[];
60
+ } | null;
61
+ /**
62
+ * Register AgentGuard hooks with OpenClaw plugin API
63
+ */
64
+ export declare function registerOpenClawPlugin(api: OpenClawPluginApi, options?: OpenClawPluginOptions): void;
65
+ /**
66
+ * Default export for OpenClaw plugin registration
67
+ *
68
+ * Usage: export default from '@goplus/agentguard/openclaw'
69
+ */
70
+ export default function register(api: OpenClawPluginApi): void;
71
+ export {};
72
+ //# sourceMappingURL=openclaw-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-plugin.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AASH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA0BrD;;GAEG;AACH,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACtF,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACzH;AAkGD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,kBAAkB,CAAC;IAC7C,8BAA8B;IAC9B,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AA6HD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAEtG;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,iBAAiB,EACtB,OAAO,GAAE,qBAA0B,GAClC,IAAI,CA8GN;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAE7D"}
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+ /**
3
+ * GoPlus AgentGuard — OpenClaw Plugin
4
+ *
5
+ * Registers before_tool_call, after_tool_call, and session_start hooks
6
+ * with the OpenClaw plugin API to evaluate tool safety at runtime and
7
+ * auto-scan installed skills on session startup.
8
+ *
9
+ * Features:
10
+ * - Auto-scan all loaded plugins on registration
11
+ * - Auto-scan skill directories (~/.openclaw/skills/, ~/.claude/skills/) on session_start
12
+ * - Auto-register plugins to AgentGuard trust registry
13
+ * - Build toolName → pluginId mapping for initiating skill inference
14
+ *
15
+ * Usage in OpenClaw plugin config:
16
+ * import agentguard from '@goplus/agentguard/openclaw';
17
+ * export default agentguard;
18
+ *
19
+ * Or register manually:
20
+ * import { registerOpenClawPlugin } from '@goplus/agentguard';
21
+ * registerOpenClawPlugin(api);
22
+ */
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || (function () {
40
+ var ownKeys = function(o) {
41
+ ownKeys = Object.getOwnPropertyNames || function (o) {
42
+ var ar = [];
43
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
44
+ return ar;
45
+ };
46
+ return ownKeys(o);
47
+ };
48
+ return function (mod) {
49
+ if (mod && mod.__esModule) return mod;
50
+ var result = {};
51
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
52
+ __setModuleDefault(result, mod);
53
+ return result;
54
+ };
55
+ })();
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.getPluginIdFromTool = getPluginIdFromTool;
58
+ exports.getPluginScanResult = getPluginScanResult;
59
+ exports.registerOpenClawPlugin = registerOpenClawPlugin;
60
+ exports.default = register;
61
+ const node_fs_1 = require("node:fs");
62
+ const node_path_1 = require("node:path");
63
+ const node_os_1 = require("node:os");
64
+ const path = __importStar(require("node:path"));
65
+ const openclaw_js_1 = require("./openclaw.js");
66
+ const engine_js_1 = require("./engine.js");
67
+ const common_js_1 = require("./common.js");
68
+ const index_js_1 = require("../scanner/index.js");
69
+ const index_js_2 = require("../registry/index.js");
70
+ // ---------------------------------------------------------------------------
71
+ // Auto-scan helpers (skill directories)
72
+ // ---------------------------------------------------------------------------
73
+ const OPENCLAW_SKILLS_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.openclaw', 'skills');
74
+ const CLAUDE_SKILLS_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.claude', 'skills');
75
+ const AGENTGUARD_DIR = process.env.AGENTGUARD_HOME || (0, node_path_1.join)((0, node_os_1.homedir)(), '.agentguard');
76
+ const AUDIT_PATH = (0, node_path_1.join)(AGENTGUARD_DIR, 'audit.jsonl');
77
+ function ensureAgentGuardDir() {
78
+ if (!(0, node_fs_1.existsSync)(AGENTGUARD_DIR)) {
79
+ (0, node_fs_1.mkdirSync)(AGENTGUARD_DIR, { recursive: true });
80
+ }
81
+ }
82
+ function writeScanAuditLog(entry) {
83
+ try {
84
+ ensureAgentGuardDir();
85
+ (0, node_fs_1.appendFileSync)(AUDIT_PATH, JSON.stringify(entry) + '\n');
86
+ }
87
+ catch {
88
+ // Non-critical
89
+ }
90
+ }
91
+ /**
92
+ * Discover skill directories (containing SKILL.md) under the given path.
93
+ */
94
+ function discoverSkillDirs(skillsDir) {
95
+ if (!(0, node_fs_1.existsSync)(skillsDir))
96
+ return [];
97
+ const skills = [];
98
+ try {
99
+ const entries = (0, node_fs_1.readdirSync)(skillsDir, { withFileTypes: true });
100
+ for (const entry of entries) {
101
+ if (!entry.isDirectory())
102
+ continue;
103
+ const skillDir = (0, node_path_1.join)(skillsDir, entry.name);
104
+ if ((0, node_fs_1.existsSync)((0, node_path_1.join)(skillDir, 'SKILL.md'))) {
105
+ skills.push({ name: entry.name, path: skillDir });
106
+ }
107
+ }
108
+ }
109
+ catch {
110
+ // Can't read skills dir
111
+ }
112
+ return skills;
113
+ }
114
+ /**
115
+ * Scan skill directories (~/.openclaw/skills/ and ~/.claude/skills/).
116
+ * Scan-only mode: reports results via logger, does NOT modify the trust registry.
117
+ * Users can register skills manually with /agentguard trust attest.
118
+ */
119
+ async function autoScanSkillDirs(scanner, _registry, logger) {
120
+ const skills = [
121
+ ...discoverSkillDirs(OPENCLAW_SKILLS_DIR),
122
+ ...discoverSkillDirs(CLAUDE_SKILLS_DIR),
123
+ ];
124
+ if (skills.length === 0)
125
+ return;
126
+ let scanned = 0;
127
+ for (const skill of skills) {
128
+ // Skip self
129
+ if (skill.name === 'agentguard')
130
+ continue;
131
+ try {
132
+ const result = await scanner.quickScan(skill.path);
133
+ scanned++;
134
+ // Audit log — only record skill name, risk level, and tag names (no code/evidence)
135
+ writeScanAuditLog({
136
+ timestamp: new Date().toISOString(),
137
+ event: 'auto_scan',
138
+ skill_name: skill.name,
139
+ risk_level: result.risk_level,
140
+ risk_tags: result.risk_tags,
141
+ });
142
+ logger(`[AgentGuard] Skill "${skill.name}": ${result.risk_level} risk [${result.risk_tags.join(', ')}]`);
143
+ }
144
+ catch {
145
+ // Skip skills that fail to scan
146
+ }
147
+ }
148
+ if (scanned > 0) {
149
+ logger(`[AgentGuard] Scanned ${scanned} skill dir(s). Use /agentguard trust attest to register.`);
150
+ }
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // Global State
154
+ // ---------------------------------------------------------------------------
155
+ /** Symbol to access OpenClaw's global registry */
156
+ const OPENCLAW_REGISTRY_STATE = Symbol.for('openclaw.pluginRegistryState');
157
+ /** Tool name → Plugin ID mapping */
158
+ const toolToPluginMap = new Map();
159
+ /** Plugin ID → Scan result cache */
160
+ const pluginScanCache = new Map();
161
+ // ---------------------------------------------------------------------------
162
+ // Helper Functions
163
+ // ---------------------------------------------------------------------------
164
+ /**
165
+ * Get OpenClaw's active plugin registry via global symbol
166
+ */
167
+ function getOpenClawRegistry() {
168
+ const globalState = globalThis;
169
+ const state = globalState[OPENCLAW_REGISTRY_STATE];
170
+ return state?.registry ?? null;
171
+ }
172
+ /**
173
+ * Get plugin directory from source path
174
+ */
175
+ function getPluginDir(source) {
176
+ // source is typically the entry file (e.g., /path/to/plugin/index.ts)
177
+ // We want the directory
178
+ return path.dirname(source);
179
+ }
180
+ /**
181
+ * Scan a plugin and cache its risk level. Scan-only: does NOT modify trust registry.
182
+ * Users can register plugins manually with /agentguard trust attest.
183
+ */
184
+ async function scanAndRegisterPlugin(plugin, scanner, _registry, logger) {
185
+ // Skip if already scanned
186
+ if (pluginScanCache.has(plugin.id)) {
187
+ return;
188
+ }
189
+ const pluginDir = getPluginDir(plugin.source);
190
+ try {
191
+ // Perform scan
192
+ const scanResult = await scanner.quickScan(pluginDir);
193
+ // Cache result (for runtime before_tool_call checks)
194
+ pluginScanCache.set(plugin.id, {
195
+ riskLevel: scanResult.risk_level,
196
+ riskTags: scanResult.risk_tags,
197
+ });
198
+ // Build tool → plugin mapping
199
+ for (const toolName of plugin.toolNames) {
200
+ toolToPluginMap.set(toolName, plugin.id);
201
+ }
202
+ logger(`[AgentGuard] Scanned plugin "${plugin.id}": ${scanResult.risk_level} risk [${scanResult.risk_tags.join(', ')}]`);
203
+ }
204
+ catch (err) {
205
+ // If scan fails, cache as unknown
206
+ pluginScanCache.set(plugin.id, {
207
+ riskLevel: 'unknown',
208
+ riskTags: ['SCAN_FAILED'],
209
+ });
210
+ // Still build tool mapping
211
+ for (const toolName of plugin.toolNames) {
212
+ toolToPluginMap.set(toolName, plugin.id);
213
+ }
214
+ logger(`[AgentGuard] Plugin "${plugin.id}" scan failed: ${String(err)}`);
215
+ }
216
+ }
217
+ /**
218
+ * Scan all loaded OpenClaw plugins
219
+ */
220
+ async function scanAllPlugins(scanner, registry, logger, selfPluginId) {
221
+ const openclawRegistry = getOpenClawRegistry();
222
+ if (!openclawRegistry) {
223
+ logger('[AgentGuard] OpenClaw registry not available, skipping plugin auto-scan');
224
+ return;
225
+ }
226
+ const plugins = openclawRegistry.plugins.filter(p => p.status === 'loaded' &&
227
+ p.enabled &&
228
+ p.id !== selfPluginId // Don't scan ourselves
229
+ );
230
+ logger(`[AgentGuard] Auto-scanning ${plugins.length} loaded plugins...`);
231
+ // Scan plugins in parallel (with concurrency limit)
232
+ const CONCURRENCY = 3;
233
+ for (let i = 0; i < plugins.length; i += CONCURRENCY) {
234
+ const batch = plugins.slice(i, i + CONCURRENCY);
235
+ await Promise.all(batch.map(plugin => scanAndRegisterPlugin(plugin, scanner, registry, logger)));
236
+ }
237
+ logger(`[AgentGuard] Plugin auto-scan complete. ${toolToPluginMap.size} tools mapped.`);
238
+ }
239
+ /**
240
+ * Get plugin ID from tool name
241
+ */
242
+ function getPluginIdFromTool(toolName) {
243
+ return toolToPluginMap.get(toolName) ?? null;
244
+ }
245
+ /**
246
+ * Get scan result for a plugin
247
+ */
248
+ function getPluginScanResult(pluginId) {
249
+ return pluginScanCache.get(pluginId) ?? null;
250
+ }
251
+ // ---------------------------------------------------------------------------
252
+ // Main Registration
253
+ // ---------------------------------------------------------------------------
254
+ /**
255
+ * Register AgentGuard hooks with OpenClaw plugin API
256
+ */
257
+ function registerOpenClawPlugin(api, options = {}) {
258
+ const adapter = new openclaw_js_1.OpenClawAdapter();
259
+ const config = options.level ? { level: options.level } : (0, common_js_1.loadConfig)();
260
+ const scanner = options.scanner ?? new index_js_1.SkillScanner({ useExternalScanner: false });
261
+ const trustRegistry = options.registry ?? new index_js_2.SkillRegistry();
262
+ // Simple logger
263
+ const logger = (msg) => console.log(msg);
264
+ // Lazy-initialize agentguard instance
265
+ let agentguard = null;
266
+ function getAgentGuard() {
267
+ if (!agentguard) {
268
+ if (options.agentguardFactory) {
269
+ agentguard = options.agentguardFactory();
270
+ }
271
+ else {
272
+ try {
273
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
274
+ const { createAgentGuard } = require('@goplus/agentguard');
275
+ agentguard = createAgentGuard();
276
+ }
277
+ catch {
278
+ throw new Error('AgentGuard: unable to load engine. Install @goplus/agentguard.');
279
+ }
280
+ }
281
+ }
282
+ return agentguard;
283
+ }
284
+ // Auto-scan plugins on registration (async, non-blocking, opt-in)
285
+ if (options.skipAutoScan === false) {
286
+ // Use setImmediate to allow plugin registration to complete first
287
+ setImmediate(async () => {
288
+ try {
289
+ await scanAllPlugins(scanner, trustRegistry, logger, api.id);
290
+ }
291
+ catch (err) {
292
+ logger(`[AgentGuard] Plugin auto-scan error: ${String(err)}`);
293
+ }
294
+ });
295
+ }
296
+ // session_start → auto-scan skill directories (only when opt-in)
297
+ if (options.skipAutoScan === false) {
298
+ api.on('session_start', async () => {
299
+ try {
300
+ await autoScanSkillDirs(scanner, trustRegistry, logger);
301
+ }
302
+ catch {
303
+ // Non-critical — never block session startup
304
+ }
305
+ });
306
+ }
307
+ // before_tool_call → evaluate and optionally block
308
+ api.on('before_tool_call', async (event) => {
309
+ try {
310
+ // Try to infer plugin from tool name
311
+ const toolEvent = event;
312
+ const pluginId = toolEvent.toolName ? getPluginIdFromTool(toolEvent.toolName) : null;
313
+ // Check if plugin is untrusted
314
+ if (pluginId) {
315
+ const scanResult = getPluginScanResult(pluginId);
316
+ if (scanResult?.riskLevel === 'critical') {
317
+ return {
318
+ block: true,
319
+ blockReason: `GoPlus AgentGuard: Plugin "${pluginId}" has critical security findings and is blocked. Run /agentguard trust attest to manually approve.`,
320
+ };
321
+ }
322
+ }
323
+ const result = await (0, engine_js_1.evaluateHook)(adapter, event, {
324
+ config,
325
+ agentguard: getAgentGuard(),
326
+ });
327
+ if (result.decision === 'deny') {
328
+ return {
329
+ block: true,
330
+ blockReason: result.reason || 'Blocked by GoPlus AgentGuard',
331
+ };
332
+ }
333
+ // OpenClaw has no 'ask' mode — block with explanation in strict/balanced
334
+ if (result.decision === 'ask') {
335
+ return {
336
+ block: true,
337
+ blockReason: result.reason || 'Requires confirmation (GoPlus AgentGuard)',
338
+ };
339
+ }
340
+ return undefined; // allow
341
+ }
342
+ catch {
343
+ // Fail open
344
+ return undefined;
345
+ }
346
+ });
347
+ // after_tool_call → audit log
348
+ api.on('after_tool_call', async (event) => {
349
+ try {
350
+ const input = adapter.parseInput(event);
351
+ const toolEvent = event;
352
+ const pluginId = toolEvent.toolName ? getPluginIdFromTool(toolEvent.toolName) : null;
353
+ (0, common_js_1.writeAuditLog)(input, null, pluginId);
354
+ }
355
+ catch {
356
+ // Non-critical
357
+ }
358
+ });
359
+ logger(`[AgentGuard] Registered with OpenClaw (protection level: ${config.level || 'balanced'})`);
360
+ }
361
+ /**
362
+ * Default export for OpenClaw plugin registration
363
+ *
364
+ * Usage: export default from '@goplus/agentguard/openclaw'
365
+ */
366
+ function register(api) {
367
+ registerOpenClawPlugin(api);
368
+ }
369
+ //# sourceMappingURL=openclaw-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-plugin.js","sourceRoot":"","sources":["../../src/adapters/openclaw-plugin.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8RH,kDAEC;AAKD,kDAEC;AASD,wDAiHC;AAOD,2BAEC;AAxaD,qCAA6E;AAC7E,yCAAiC;AACjC,qCAAkC;AAClC,gDAAkC;AAClC,+CAAgD;AAChD,2CAA2C;AAC3C,2CAAwD;AAExD,kDAAmD;AACnD,mDAAqD;AAqCrD,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnE,MAAM,iBAAiB,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,aAAa,CAAC,CAAC;AACrF,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AAEvD,SAAS,mBAAmB;IAC1B,IAAI,CAAC,IAAA,oBAAU,EAAC,cAAc,CAAC,EAAE,CAAC;QAChC,IAAA,mBAAS,EAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA8B;IACvD,IAAI,CAAC;QACH,mBAAmB,EAAE,CAAC;QACtB,IAAA,wBAAc,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC,IAAA,oBAAU,EAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,MAAM,GAAqC,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAqB,EACrB,SAAwB,EACxB,MAA6B;IAE7B,MAAM,MAAM,GAAG;QACb,GAAG,iBAAiB,CAAC,mBAAmB,CAAC;QACzC,GAAG,iBAAiB,CAAC,iBAAiB,CAAC;KACxC,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,YAAY;QACZ,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,SAAS;QAE1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;YAEV,mFAAmF;YACnF,iBAAiB,CAAC;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK,EAAE,WAAW;gBAClB,UAAU,EAAE,KAAK,CAAC,IAAI;gBACtB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;YAEH,MAAM,CAAC,uBAAuB,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3G,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,CAAC,wBAAwB,OAAO,0DAA0D,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAsBD,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,kDAAkD;AAClD,MAAM,uBAAuB,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAE3E,oCAAoC;AACpC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AAElD,oCAAoC;AACpC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAqD,CAAC;AAErF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;GAEG;AACH,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,UAEnB,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,uBAAuB,CAAC,CAAC;IACnD,OAAO,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAc;IAClC,sEAAsE;IACtE,wBAAwB;IACxB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAClC,MAA4B,EAC5B,OAAqB,EACrB,SAAwB,EACxB,MAA6B;IAE7B,0BAA0B;IAC1B,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,eAAe;QACf,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEtD,qDAAqD;QACrD,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE;YAC7B,SAAS,EAAE,UAAU,CAAC,UAAU;YAChC,QAAQ,EAAE,UAAU,CAAC,SAAS;SAC/B,CAAC,CAAC;QAEH,8BAA8B;QAC9B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,CAAC,gCAAgC,MAAM,CAAC,EAAE,MAAM,UAAU,CAAC,UAAU,UAAU,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3H,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kCAAkC;QAClC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE;YAC7B,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B,CAAC,CAAC;QAEH,2BAA2B;QAC3B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,CAAC,wBAAwB,MAAM,CAAC,EAAE,kBAAkB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,OAAqB,EACrB,QAAuB,EACvB,MAA6B,EAC7B,YAAqB;IAErB,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAE/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,CAAC,yEAAyE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClD,CAAC,CAAC,MAAM,KAAK,QAAQ;QACrB,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,uBAAuB;KAC9C,CAAC;IAEF,MAAM,CAAC,8BAA8B,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAEzE,oDAAoD;IACpD,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;QAChD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,2CAA2C,eAAe,CAAC,IAAI,gBAAgB,CAAC,CAAC;AAC1F,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAAgB;IAClD,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAAgB;IAClD,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;GAEG;AACH,SAAgB,sBAAsB,CACpC,GAAsB,EACtB,UAAiC,EAAE;IAEnC,MAAM,OAAO,GAAG,IAAI,6BAAe,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAA,sBAAU,GAAE,CAAC;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,uBAAY,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,wBAAa,EAAE,CAAC;IAE9D,gBAAgB;IAChB,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEjD,sCAAsC;IACtC,IAAI,UAAU,GAA8B,IAAI,CAAC;IAEjD,SAAS,aAAa;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC9B,UAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,iEAAiE;oBACjE,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;oBAC3D,UAAU,GAAG,gBAAgB,EAAE,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,UAAW,CAAC;IACrB,CAAC;IAED,kEAAkE;IAClE,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;QACnC,kEAAkE;QAClE,YAAY,CAAC,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,wCAAwC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;QACnC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mDAAmD;IACnD,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,SAAS,GAAG,KAA8B,CAAC;YACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAErF,+BAA+B;YAC/B,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBACjD,IAAI,UAAU,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;oBACzC,OAAO;wBACL,KAAK,EAAE,IAAI;wBACX,WAAW,EAAE,8BAA8B,QAAQ,oGAAoG;qBACxJ,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAY,EAAC,OAAO,EAAE,KAAK,EAAE;gBAChD,MAAM;gBACN,UAAU,EAAE,aAAa,EAAE;aAC5B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC/B,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,WAAW,EAAE,MAAM,CAAC,MAAM,IAAI,8BAA8B;iBAC7D,CAAC;YACJ,CAAC;YAED,yEAAyE;YACzE,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC9B,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,WAAW,EAAE,MAAM,CAAC,MAAM,IAAI,2CAA2C;iBAC1E,CAAC;YACJ,CAAC;YAED,OAAO,SAAS,CAAC,CAAC,QAAQ;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,KAA8B,CAAC;YACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrF,IAAA,yBAAa,EAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,4DAA4D,MAAM,CAAC,KAAK,IAAI,UAAU,GAAG,CAAC,CAAC;AACpG,CAAC;AAED;;;;GAIG;AACH,SAAwB,QAAQ,CAAC,GAAsB;IACrD,sBAAsB,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ActionEnvelope } from '../types/action.js';
2
+ import type { HookAdapter, HookInput } from './types.js';
3
+ /**
4
+ * OpenClaw hook adapter
5
+ *
6
+ * Bridges OpenClaw's before_tool_call / after_tool_call plugin hooks
7
+ * to the common AgentGuard decision engine.
8
+ *
9
+ * OpenClaw plugin hooks receive an event object:
10
+ * { toolName: string, params: Record<string, any>, toolCallId?: string }
11
+ *
12
+ * Blocking is done by returning { block: true, blockReason: "..." }
13
+ * from the before_tool_call handler.
14
+ */
15
+ export declare class OpenClawAdapter implements HookAdapter {
16
+ readonly name = "openclaw";
17
+ parseInput(raw: unknown): HookInput;
18
+ mapToolToActionType(toolName: string): string | null;
19
+ buildEnvelope(input: HookInput, initiatingSkill?: string | null): ActionEnvelope | null;
20
+ inferInitiatingSkill(input: HookInput): Promise<string | null>;
21
+ }
22
+ //# sourceMappingURL=openclaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAazD;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,cAAc;IAE3B,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS;IAUnC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAcpD,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI;IAgEjF,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAUrE"}