clawsec 0.0.1 → 0.0.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/dist/src/actions/block.js +2 -2
- package/dist/src/actions/block.js.map +1 -1
- package/dist/src/actions/confirm.d.ts +1 -1
- package/dist/src/actions/confirm.d.ts.map +1 -1
- package/dist/src/actions/confirm.js +57 -26
- package/dist/src/actions/confirm.js.map +1 -1
- package/dist/src/actions/executor.d.ts +3 -1
- package/dist/src/actions/executor.d.ts.map +1 -1
- package/dist/src/actions/executor.js +48 -11
- package/dist/src/actions/executor.js.map +1 -1
- package/dist/src/actions/warn.js +2 -2
- package/dist/src/actions/warn.js.map +1 -1
- package/dist/src/approval/agent-confirm.d.ts +4 -0
- package/dist/src/approval/agent-confirm.d.ts.map +1 -1
- package/dist/src/approval/agent-confirm.js +14 -0
- package/dist/src/approval/agent-confirm.js.map +1 -1
- package/dist/src/approval/store.d.ts +4 -0
- package/dist/src/approval/store.d.ts.map +1 -1
- package/dist/src/approval/store.js +19 -0
- package/dist/src/approval/store.js.map +1 -1
- package/dist/src/config/loader.d.ts +7 -4
- package/dist/src/config/loader.d.ts.map +1 -1
- package/dist/src/config/loader.js +58 -27
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/schema.d.ts +60 -41
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +12 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/template-loader.d.ts +34 -0
- package/dist/src/config/template-loader.d.ts.map +1 -0
- package/dist/src/config/template-loader.js +127 -0
- package/dist/src/config/template-loader.js.map +1 -0
- package/dist/src/detectors/destructive/cloud-detector.d.ts +10 -3
- package/dist/src/detectors/destructive/cloud-detector.d.ts.map +1 -1
- package/dist/src/detectors/destructive/cloud-detector.js +45 -5
- package/dist/src/detectors/destructive/cloud-detector.js.map +1 -1
- package/dist/src/detectors/destructive/code-detector.d.ts +9 -2
- package/dist/src/detectors/destructive/code-detector.d.ts.map +1 -1
- package/dist/src/detectors/destructive/code-detector.js +43 -4
- package/dist/src/detectors/destructive/code-detector.js.map +1 -1
- package/dist/src/detectors/destructive/index.d.ts +5 -3
- package/dist/src/detectors/destructive/index.d.ts.map +1 -1
- package/dist/src/detectors/destructive/index.js +42 -10
- package/dist/src/detectors/destructive/index.js.map +1 -1
- package/dist/src/detectors/destructive/shell-detector.d.ts +10 -3
- package/dist/src/detectors/destructive/shell-detector.d.ts.map +1 -1
- package/dist/src/detectors/destructive/shell-detector.js +44 -5
- package/dist/src/detectors/destructive/shell-detector.js.map +1 -1
- package/dist/src/detectors/destructive/types.d.ts +6 -0
- package/dist/src/detectors/destructive/types.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/cloud-detector.d.ts +3 -2
- package/dist/src/detectors/exfiltration/cloud-detector.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/cloud-detector.js +21 -3
- package/dist/src/detectors/exfiltration/cloud-detector.js.map +1 -1
- package/dist/src/detectors/exfiltration/http-detector.d.ts +3 -2
- package/dist/src/detectors/exfiltration/http-detector.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/http-detector.js +21 -3
- package/dist/src/detectors/exfiltration/http-detector.js.map +1 -1
- package/dist/src/detectors/exfiltration/index.d.ts +5 -3
- package/dist/src/detectors/exfiltration/index.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/index.js +44 -11
- package/dist/src/detectors/exfiltration/index.js.map +1 -1
- package/dist/src/detectors/exfiltration/network-detector.d.ts +3 -2
- package/dist/src/detectors/exfiltration/network-detector.d.ts.map +1 -1
- package/dist/src/detectors/exfiltration/network-detector.js +26 -8
- package/dist/src/detectors/exfiltration/network-detector.js.map +1 -1
- package/dist/src/detectors/exfiltration/types.d.ts +2 -0
- package/dist/src/detectors/exfiltration/types.d.ts.map +1 -1
- package/dist/src/detectors/purchase/domain-detector.d.ts +1 -1
- package/dist/src/detectors/purchase/domain-detector.d.ts.map +1 -1
- package/dist/src/detectors/purchase/domain-detector.js +1 -1
- package/dist/src/detectors/purchase/domain-detector.js.map +1 -1
- package/dist/src/detectors/purchase/form-detector.d.ts +2 -2
- package/dist/src/detectors/purchase/form-detector.d.ts.map +1 -1
- package/dist/src/detectors/purchase/form-detector.js +7 -4
- package/dist/src/detectors/purchase/form-detector.js.map +1 -1
- package/dist/src/detectors/purchase/index.d.ts +5 -3
- package/dist/src/detectors/purchase/index.d.ts.map +1 -1
- package/dist/src/detectors/purchase/index.js +35 -6
- package/dist/src/detectors/purchase/index.js.map +1 -1
- package/dist/src/detectors/purchase/spend-tracker.d.ts +6 -2
- package/dist/src/detectors/purchase/spend-tracker.d.ts.map +1 -1
- package/dist/src/detectors/purchase/spend-tracker.js +19 -3
- package/dist/src/detectors/purchase/spend-tracker.js.map +1 -1
- package/dist/src/detectors/purchase/url-detector.d.ts +2 -2
- package/dist/src/detectors/purchase/url-detector.d.ts.map +1 -1
- package/dist/src/detectors/purchase/url-detector.js +3 -3
- package/dist/src/detectors/purchase/url-detector.js.map +1 -1
- package/dist/src/detectors/secrets/api-key-detector.d.ts +6 -6
- package/dist/src/detectors/secrets/api-key-detector.d.ts.map +1 -1
- package/dist/src/detectors/secrets/api-key-detector.js +33 -7
- package/dist/src/detectors/secrets/api-key-detector.js.map +1 -1
- package/dist/src/detectors/secrets/index.d.ts +5 -3
- package/dist/src/detectors/secrets/index.d.ts.map +1 -1
- package/dist/src/detectors/secrets/index.js +52 -11
- package/dist/src/detectors/secrets/index.js.map +1 -1
- package/dist/src/detectors/secrets/pii-detector.d.ts +2 -2
- package/dist/src/detectors/secrets/pii-detector.d.ts.map +1 -1
- package/dist/src/detectors/secrets/pii-detector.js +3 -3
- package/dist/src/detectors/secrets/pii-detector.js.map +1 -1
- package/dist/src/detectors/secrets/token-detector.d.ts +2 -2
- package/dist/src/detectors/secrets/token-detector.d.ts.map +1 -1
- package/dist/src/detectors/secrets/token-detector.js +3 -3
- package/dist/src/detectors/secrets/token-detector.js.map +1 -1
- package/dist/src/detectors/secrets/types.d.ts +5 -3
- package/dist/src/detectors/secrets/types.d.ts.map +1 -1
- package/dist/src/detectors/website/index.d.ts +5 -3
- package/dist/src/detectors/website/index.d.ts.map +1 -1
- package/dist/src/detectors/website/index.js +21 -6
- package/dist/src/detectors/website/index.js.map +1 -1
- package/dist/src/engine/analyzer.d.ts +3 -1
- package/dist/src/engine/analyzer.d.ts.map +1 -1
- package/dist/src/engine/analyzer.js +66 -10
- package/dist/src/engine/analyzer.js.map +1 -1
- package/dist/src/engine/types.d.ts +4 -1
- package/dist/src/engine/types.d.ts.map +1 -1
- package/dist/src/engine/types.js.map +1 -1
- package/dist/src/hooks/before-agent-start/handler.d.ts +3 -1
- package/dist/src/hooks/before-agent-start/handler.d.ts.map +1 -1
- package/dist/src/hooks/before-agent-start/handler.js +59 -12
- package/dist/src/hooks/before-agent-start/handler.js.map +1 -1
- package/dist/src/hooks/before-tool-call/handler.d.ts +3 -1
- package/dist/src/hooks/before-tool-call/handler.d.ts.map +1 -1
- package/dist/src/hooks/before-tool-call/handler.js +86 -54
- package/dist/src/hooks/before-tool-call/handler.js.map +1 -1
- package/dist/src/hooks/tool-result-persist/handler.d.ts +3 -1
- package/dist/src/hooks/tool-result-persist/handler.d.ts.map +1 -1
- package/dist/src/hooks/tool-result-persist/handler.js +36 -34
- package/dist/src/hooks/tool-result-persist/handler.js.map +1 -1
- package/dist/src/index.d.ts +45 -47
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +120 -96
- package/dist/src/index.js.map +1 -1
- package/dist/src/notifications/index.d.ts.map +1 -1
- package/dist/src/notifications/index.js +2 -1
- package/dist/src/notifications/index.js.map +1 -1
- package/dist/src/notifications/telegram.js +1 -1
- package/dist/src/notifications/telegram.js.map +1 -1
- package/dist/src/notifications/types.d.ts +1 -1
- package/dist/src/notifications/types.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +26 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +76 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/openclaw.plugin.json +7 -22
- package/package.json +8 -2
|
@@ -29,12 +29,12 @@ export function generateBlockMessage(context) {
|
|
|
29
29
|
const { analysis, toolCall } = context;
|
|
30
30
|
const { primaryDetection, detections } = analysis;
|
|
31
31
|
if (!primaryDetection) {
|
|
32
|
-
return `
|
|
32
|
+
return `Blocked by ClawSec: ${toolCall.toolName} was blocked by security policy.`;
|
|
33
33
|
}
|
|
34
34
|
const category = formatCategory(primaryDetection.category);
|
|
35
35
|
const severity = formatSeverity(primaryDetection.severity);
|
|
36
36
|
const reason = primaryDetection.reason;
|
|
37
|
-
let message = `[${severity}] ${category} detected
|
|
37
|
+
let message = `Blocked by ClawSec: [${severity}] ${category} detected\n`;
|
|
38
38
|
message += `Tool: ${toolCall.toolName}\n`;
|
|
39
39
|
message += `Reason: ${reason}`;
|
|
40
40
|
// Include additional detections if any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block.js","sourceRoot":"","sources":["../../../src/actions/block.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,aAAa,GAA2B;QAC5C,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,sBAAsB;QAC/B,YAAY,EAAE,mBAAmB;KAClC,CAAC;IACF,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAsB;IACzD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IAElD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"block.js","sourceRoot":"","sources":["../../../src/actions/block.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,aAAa,GAA2B;QAC5C,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,sBAAsB;QAC/B,YAAY,EAAE,mBAAmB;KAClC,CAAC;IACF,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAsB;IACzD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IAElD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,uBAAuB,QAAQ,CAAC,QAAQ,kCAAkC,CAAC;IACpF,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAEvC,IAAI,OAAO,GAAG,wBAAwB,QAAQ,KAAK,QAAQ,aAAa,CAAC;IACzE,OAAO,IAAI,SAAS,QAAQ,CAAC,QAAQ,IAAI,CAAC;IAC1C,OAAO,IAAI,WAAW,MAAM,EAAE,CAAC;IAE/B,uCAAuC;IACvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,8BAA8B,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC;QACnE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;gBACnC,OAAO,IAAI,OAAO,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,CAAe;IAE7B,YAAY,SAAuB,UAAU;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAsB;QAClC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACvC,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE9C,sBAAsB;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ;YAC7C,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ;YAC7C,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM;YACzC,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM;SAC3C,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO;YACP,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Confirm Action Handler
|
|
3
3
|
* Handles requesting approval for potentially risky tool calls
|
|
4
4
|
*/
|
|
5
|
-
import type { ActionContext, ActionHandler, ActionResult, ActionLogger, ApprovalMethod, PendingApproval } from
|
|
5
|
+
import type { ActionContext, ActionHandler, ActionResult, ActionLogger, ApprovalMethod, PendingApproval } from "./types.js";
|
|
6
6
|
/**
|
|
7
7
|
* Generate a UUID v4
|
|
8
8
|
* Uses crypto.randomUUID if available, falls back to manual implementation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../src/actions/confirm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../src/actions/confirm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,aAAa,GACrB,cAAc,EAAE,CAoBlB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAKjE;AAoDD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,eAAe,GACxB,MAAM,CA2BR;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,GAAE,YAAyB;IAIvC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAoE7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,cAAc,CAE1E"}
|
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
* Confirm Action Handler
|
|
3
3
|
* Handles requesting approval for potentially risky tool calls
|
|
4
4
|
*/
|
|
5
|
-
import { noOpLogger } from
|
|
5
|
+
import { noOpLogger } from "./types.js";
|
|
6
|
+
import { getDefaultApprovalStore } from "../approval/store.js";
|
|
6
7
|
/**
|
|
7
8
|
* Generate a UUID v4
|
|
8
9
|
* Uses crypto.randomUUID if available, falls back to manual implementation
|
|
9
10
|
*/
|
|
10
11
|
export function generateApprovalId() {
|
|
11
12
|
// Use native crypto if available (Node.js 16+, modern browsers)
|
|
12
|
-
if (typeof crypto !==
|
|
13
|
+
if (typeof crypto !== "undefined" && crypto.randomUUID) {
|
|
13
14
|
return crypto.randomUUID();
|
|
14
15
|
}
|
|
15
16
|
// Fallback implementation
|
|
16
|
-
return
|
|
17
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
17
18
|
const r = (Math.random() * 16) | 0;
|
|
18
|
-
const v = c ===
|
|
19
|
+
const v = c === "x" ? r : (r & 0x3) | 0x8;
|
|
19
20
|
return v.toString(16);
|
|
20
21
|
});
|
|
21
22
|
}
|
|
@@ -27,15 +28,15 @@ export function getEnabledApprovalMethods(context) {
|
|
|
27
28
|
const methods = [];
|
|
28
29
|
// Check native approval
|
|
29
30
|
if (config.approval?.native?.enabled !== false) {
|
|
30
|
-
methods.push(
|
|
31
|
+
methods.push("native");
|
|
31
32
|
}
|
|
32
33
|
// Check agent-confirm
|
|
33
34
|
if (config.approval?.agentConfirm?.enabled !== false) {
|
|
34
|
-
methods.push(
|
|
35
|
+
methods.push("agent-confirm");
|
|
35
36
|
}
|
|
36
37
|
// Check webhook (only if URL is configured)
|
|
37
38
|
if (config.approval?.webhook?.enabled && config.approval.webhook.url) {
|
|
38
|
-
methods.push(
|
|
39
|
+
methods.push("webhook");
|
|
39
40
|
}
|
|
40
41
|
return methods;
|
|
41
42
|
}
|
|
@@ -58,11 +59,12 @@ function formatSeverity(severity) {
|
|
|
58
59
|
*/
|
|
59
60
|
function formatCategory(category) {
|
|
60
61
|
const categoryNames = {
|
|
61
|
-
purchase:
|
|
62
|
-
website:
|
|
63
|
-
destructive:
|
|
64
|
-
secrets:
|
|
65
|
-
exfiltration:
|
|
62
|
+
purchase: "Purchase/Payment",
|
|
63
|
+
website: "Website Access",
|
|
64
|
+
destructive: "Destructive Command",
|
|
65
|
+
secrets: "Secrets/PII",
|
|
66
|
+
exfiltration: "Data Transfer",
|
|
67
|
+
unknown: "Manual Approval",
|
|
66
68
|
};
|
|
67
69
|
return categoryNames[category] || category;
|
|
68
70
|
}
|
|
@@ -71,17 +73,18 @@ function formatCategory(category) {
|
|
|
71
73
|
*/
|
|
72
74
|
function generateApprovalInstructions(methods, approvalId, context) {
|
|
73
75
|
const instructions = [];
|
|
74
|
-
if (methods.includes('native')) {
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
if (methods.includes(
|
|
78
|
-
const paramName = context.config.approval?.agentConfirm?.parameterName ??
|
|
76
|
+
// if (methods.includes('native')) {
|
|
77
|
+
// instructions.push(` - Type: /approve ${approvalId}`);
|
|
78
|
+
// }
|
|
79
|
+
if (methods.includes("agent-confirm")) {
|
|
80
|
+
const paramName = context.config.approval?.agentConfirm?.parameterName ??
|
|
81
|
+
"_clawsec_confirm";
|
|
79
82
|
instructions.push(` - Retry with parameter: ${paramName}="${approvalId}"`);
|
|
80
83
|
}
|
|
81
|
-
if (methods.includes('webhook')) {
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
return instructions.join(
|
|
84
|
+
// if (methods.includes('webhook')) {
|
|
85
|
+
// instructions.push(` - Webhook approval is enabled (external system will be notified)`);
|
|
86
|
+
// }
|
|
87
|
+
return instructions.join("\n");
|
|
85
88
|
}
|
|
86
89
|
/**
|
|
87
90
|
* Generate a message explaining the confirmation requirement
|
|
@@ -89,21 +92,21 @@ function generateApprovalInstructions(methods, approvalId, context) {
|
|
|
89
92
|
export function generateConfirmMessage(context, approval) {
|
|
90
93
|
const { analysis, toolCall } = context;
|
|
91
94
|
const { primaryDetection } = analysis;
|
|
92
|
-
let message =
|
|
95
|
+
let message = "";
|
|
93
96
|
if (primaryDetection) {
|
|
94
97
|
const category = formatCategory(primaryDetection.category);
|
|
95
98
|
const severity = formatSeverity(primaryDetection.severity);
|
|
96
|
-
message = `[${severity}] ${category} requires approval\n`;
|
|
99
|
+
message = `ClawSec Protection: [${severity}] ${category} requires approval\n`;
|
|
97
100
|
message += `Tool: ${toolCall.toolName}\n`;
|
|
98
101
|
message += `Reason: ${primaryDetection.reason}\n\n`;
|
|
99
102
|
}
|
|
100
103
|
else {
|
|
101
|
-
message = `Action requires approval\n`;
|
|
104
|
+
message = `ClawSec Protection: Action requires approval\n`;
|
|
102
105
|
message += `Tool: ${toolCall.toolName}\n\n`;
|
|
103
106
|
}
|
|
104
107
|
message += `Approval ID: ${approval.id}\n`;
|
|
105
108
|
message += `Timeout: ${approval.timeout} seconds\n\n`;
|
|
106
|
-
message += `To approve
|
|
109
|
+
message += `To approve:\n`;
|
|
107
110
|
message += generateApprovalInstructions(approval.methods, approval.id, context);
|
|
108
111
|
return message;
|
|
109
112
|
}
|
|
@@ -123,6 +126,34 @@ export class ConfirmHandler {
|
|
|
123
126
|
const methods = getEnabledApprovalMethods(context);
|
|
124
127
|
// Get timeout
|
|
125
128
|
const timeout = getApprovalTimeout(context);
|
|
129
|
+
// Create full approval record for storage
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
const approvalInput = {
|
|
132
|
+
id: approvalId,
|
|
133
|
+
createdAt: now,
|
|
134
|
+
expiresAt: now + timeout * 1000,
|
|
135
|
+
detection: analysis.primaryDetection
|
|
136
|
+
? {
|
|
137
|
+
category: analysis.primaryDetection.category,
|
|
138
|
+
severity: analysis.primaryDetection.severity,
|
|
139
|
+
confidence: analysis.primaryDetection.confidence,
|
|
140
|
+
reason: analysis.primaryDetection.reason,
|
|
141
|
+
}
|
|
142
|
+
: {
|
|
143
|
+
category: "unknown", // No specific threat detected - manual approval
|
|
144
|
+
severity: "medium",
|
|
145
|
+
confidence: 0.5,
|
|
146
|
+
reason: "Manual approval required",
|
|
147
|
+
},
|
|
148
|
+
toolCall: {
|
|
149
|
+
toolName: toolCall.toolName,
|
|
150
|
+
toolInput: toolCall.toolInput || {},
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
// Store the approval record
|
|
154
|
+
const store = getDefaultApprovalStore();
|
|
155
|
+
store.add(approvalInput);
|
|
156
|
+
// Create lightweight object for ActionResult
|
|
126
157
|
const pendingApproval = {
|
|
127
158
|
id: approvalId,
|
|
128
159
|
timeout,
|
|
@@ -130,7 +161,7 @@ export class ConfirmHandler {
|
|
|
130
161
|
};
|
|
131
162
|
const message = generateConfirmMessage(context, pendingApproval);
|
|
132
163
|
// Log the confirmation request
|
|
133
|
-
this.logger.info(
|
|
164
|
+
this.logger.info("Action requires approval", {
|
|
134
165
|
toolName: toolCall.toolName,
|
|
135
166
|
approvalId,
|
|
136
167
|
category: analysis.primaryDetection?.category,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../../src/actions/confirm.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../../src/actions/confirm.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
* Main executor that routes to appropriate action handlers based on analysis results
|
|
4
4
|
*/
|
|
5
5
|
import type { ActionContext, ActionExecutor, ActionResult, ActionLogger, ActionHandler } from './types.js';
|
|
6
|
+
import { type Logger } from '../utils/logger.js';
|
|
6
7
|
/**
|
|
7
8
|
* Configuration for the action executor
|
|
8
9
|
*/
|
|
9
10
|
export interface ExecutorConfig {
|
|
10
11
|
/** Logger to use for action logging */
|
|
11
|
-
logger?: ActionLogger;
|
|
12
|
+
logger?: ActionLogger | Logger;
|
|
12
13
|
/** Custom block handler */
|
|
13
14
|
blockHandler?: ActionHandler;
|
|
14
15
|
/** Custom confirm handler */
|
|
@@ -23,6 +24,7 @@ export interface ExecutorConfig {
|
|
|
23
24
|
*/
|
|
24
25
|
export declare class DefaultActionExecutor implements ActionExecutor {
|
|
25
26
|
private logger;
|
|
27
|
+
private actionLogger;
|
|
26
28
|
private blockHandler;
|
|
27
29
|
private confirmHandler;
|
|
28
30
|
private warnHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/actions/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/actions/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM3G,OAAO,EAAoC,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC/B,2BAA2B;IAC3B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,6BAA6B;IAC7B,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,yBAAyB;IACzB,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,UAAU,CAAgB;gBAEtB,MAAM,GAAE,cAAmB;IAiCvC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAoD5D;;OAEG;YACW,WAAW;IAWzB;;OAEG;YACW,WAAW;IAIzB;;OAEG;YACW,aAAa;IAI3B;;OAEG;YACW,UAAU;IAIxB;;OAEG;YACW,SAAS;CAGxB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,cAAc,CAE5E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,GAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAgB,GAAG,cAAc,CAGlH"}
|
|
@@ -7,21 +7,47 @@ import { createBlockHandler } from './block.js';
|
|
|
7
7
|
import { createConfirmHandler } from './confirm.js';
|
|
8
8
|
import { createWarnHandler } from './warn.js';
|
|
9
9
|
import { createLogHandler } from './log.js';
|
|
10
|
+
import { createLogger as createUtilLogger } from '../utils/logger.js';
|
|
10
11
|
/**
|
|
11
12
|
* Default action executor implementation
|
|
12
13
|
*/
|
|
13
14
|
export class DefaultActionExecutor {
|
|
14
15
|
logger;
|
|
16
|
+
actionLogger;
|
|
15
17
|
blockHandler;
|
|
16
18
|
confirmHandler;
|
|
17
19
|
warnHandler;
|
|
18
20
|
logHandler;
|
|
19
21
|
constructor(config = {}) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
this.
|
|
24
|
-
|
|
22
|
+
// Accept both Logger and ActionLogger types
|
|
23
|
+
const providedLogger = config.logger;
|
|
24
|
+
// If logger is provided and has the Logger interface, use it for internal logging
|
|
25
|
+
this.logger = providedLogger && 'debug' in providedLogger
|
|
26
|
+
? providedLogger
|
|
27
|
+
: createUtilLogger(null, null);
|
|
28
|
+
// For action handlers, adapt Logger to ActionLogger if needed
|
|
29
|
+
if (providedLogger && 'debug' in providedLogger) {
|
|
30
|
+
// It's a Logger - create ActionLogger adapter
|
|
31
|
+
const logger = providedLogger;
|
|
32
|
+
this.actionLogger = {
|
|
33
|
+
debug: (msg, context) => logger.debug(msg, context),
|
|
34
|
+
warn: (msg, context) => logger.warn(msg, context),
|
|
35
|
+
info: (msg, context) => logger.info(msg, context),
|
|
36
|
+
error: (msg, context) => logger.error(msg, context),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
else if (providedLogger) {
|
|
40
|
+
// It's already an ActionLogger
|
|
41
|
+
this.actionLogger = providedLogger;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// No logger provided
|
|
45
|
+
this.actionLogger = noOpLogger;
|
|
46
|
+
}
|
|
47
|
+
this.blockHandler = config.blockHandler ?? createBlockHandler(this.actionLogger);
|
|
48
|
+
this.confirmHandler = config.confirmHandler ?? createConfirmHandler(this.actionLogger);
|
|
49
|
+
this.warnHandler = config.warnHandler ?? createWarnHandler(this.actionLogger);
|
|
50
|
+
this.logHandler = config.logHandler ?? createLogHandler(this.actionLogger);
|
|
25
51
|
}
|
|
26
52
|
/**
|
|
27
53
|
* Execute the appropriate action based on analysis result
|
|
@@ -29,37 +55,48 @@ export class DefaultActionExecutor {
|
|
|
29
55
|
async execute(context) {
|
|
30
56
|
const { analysis, config } = context;
|
|
31
57
|
const action = analysis.action;
|
|
58
|
+
this.logger.debug(`[Executor] Entry: action=${action}, detections=${analysis.detections.length}`);
|
|
32
59
|
// Check if the plugin is disabled
|
|
33
60
|
if (config.global?.enabled === false) {
|
|
34
61
|
this.logger.debug('Plugin disabled, allowing action');
|
|
62
|
+
this.logger.debug(`[Executor] Exit: plugin disabled, allowing`);
|
|
35
63
|
return {
|
|
36
64
|
allowed: true,
|
|
37
65
|
logged: false,
|
|
38
66
|
};
|
|
39
67
|
}
|
|
40
68
|
// Route to appropriate handler based on action
|
|
69
|
+
this.logger.debug(`[Executor] Routing to ${action} handler`);
|
|
70
|
+
let result;
|
|
41
71
|
switch (action) {
|
|
42
72
|
case 'allow':
|
|
43
|
-
|
|
73
|
+
result = await this.handleAllow(context);
|
|
74
|
+
break;
|
|
44
75
|
case 'block':
|
|
45
|
-
|
|
76
|
+
result = await this.handleBlock(context);
|
|
77
|
+
break;
|
|
46
78
|
case 'confirm':
|
|
47
|
-
|
|
79
|
+
result = await this.handleConfirm(context);
|
|
80
|
+
break;
|
|
48
81
|
case 'warn':
|
|
49
|
-
|
|
82
|
+
result = await this.handleWarn(context);
|
|
83
|
+
break;
|
|
50
84
|
case 'log':
|
|
51
|
-
|
|
85
|
+
result = await this.handleLog(context);
|
|
86
|
+
break;
|
|
52
87
|
default:
|
|
53
88
|
// Unknown action, log and allow as a safety measure
|
|
54
89
|
this.logger.warn('Unknown action type, defaulting to allow', {
|
|
55
90
|
action: action,
|
|
56
91
|
});
|
|
57
|
-
|
|
92
|
+
result = {
|
|
58
93
|
allowed: true,
|
|
59
94
|
message: `Unknown action type: ${action}`,
|
|
60
95
|
logged: true,
|
|
61
96
|
};
|
|
62
97
|
}
|
|
98
|
+
this.logger.debug(`[Executor] Exit: action=${action}, allowed=${result.allowed}`);
|
|
99
|
+
return result;
|
|
63
100
|
}
|
|
64
101
|
/**
|
|
65
102
|
* Handle allow action - no detection, pass through
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/actions/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/actions/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/src/actions/warn.js
CHANGED
|
@@ -29,12 +29,12 @@ export function generateWarnMessage(context) {
|
|
|
29
29
|
const { analysis, toolCall } = context;
|
|
30
30
|
const { primaryDetection, detections } = analysis;
|
|
31
31
|
if (!primaryDetection) {
|
|
32
|
-
return `Warning: ${toolCall.toolName} executed with security notice.`;
|
|
32
|
+
return `ClawSec Warning: ${toolCall.toolName} executed with security notice.`;
|
|
33
33
|
}
|
|
34
34
|
const category = formatCategory(primaryDetection.category);
|
|
35
35
|
const severity = formatSeverity(primaryDetection.severity);
|
|
36
36
|
const reason = primaryDetection.reason;
|
|
37
|
-
let message = `[${severity}]
|
|
37
|
+
let message = `ClawSec Warning: [${severity}] ${category} detected\n`;
|
|
38
38
|
message += `Tool: ${toolCall.toolName}\n`;
|
|
39
39
|
message += `Reason: ${reason}\n`;
|
|
40
40
|
message += `\nAction allowed but logged for audit.`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warn.js","sourceRoot":"","sources":["../../../src/actions/warn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,aAAa,GAA2B;QAC5C,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,gBAAgB;QACzB,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,aAAa;QACtB,YAAY,EAAE,eAAe;KAC9B,CAAC;IACF,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IAElD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"warn.js","sourceRoot":"","sources":["../../../src/actions/warn.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,aAAa,GAA2B;QAC5C,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,gBAAgB;QACzB,WAAW,EAAE,qBAAqB;QAClC,OAAO,EAAE,aAAa;QACtB,YAAY,EAAE,eAAe;KAC9B,CAAC;IACF,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;IAElD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,oBAAoB,QAAQ,CAAC,QAAQ,iCAAiC,CAAC;IAChF,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAEvC,IAAI,OAAO,GAAG,qBAAqB,QAAQ,KAAK,QAAQ,aAAa,CAAC;IACtE,OAAO,IAAI,SAAS,QAAQ,CAAC,QAAQ,IAAI,CAAC;IAC1C,OAAO,IAAI,WAAW,MAAM,IAAI,CAAC;IACjC,OAAO,IAAI,wCAAwC,CAAC;IAEpD,uCAAuC;IACvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,4BAA4B,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC;QACjE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;gBACnC,OAAO,IAAI,OAAO,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,MAAM,CAAe;IAE7B,YAAY,SAAuB,UAAU;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAsB;QAClC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACvC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE7C,kBAAkB;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC/C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ;YAC7C,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ;YAC7C,MAAM,EAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM;YACzC,cAAc,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM;SAC3C,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO;YACP,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* the approval ID.
|
|
8
8
|
*/
|
|
9
9
|
import type { ApprovalStore } from './types.js';
|
|
10
|
+
import { type Logger } from '../utils/logger.js';
|
|
10
11
|
/** Default parameter name for agent confirmation */
|
|
11
12
|
export declare const DEFAULT_CONFIRM_PARAMETER = "_clawsec_confirm";
|
|
12
13
|
/**
|
|
@@ -58,6 +59,8 @@ export interface AgentConfirmHandlerConfig {
|
|
|
58
59
|
enabled?: boolean;
|
|
59
60
|
/** Custom parameter name for confirmation */
|
|
60
61
|
parameterName?: string;
|
|
62
|
+
/** Optional logger instance */
|
|
63
|
+
logger?: Logger;
|
|
61
64
|
}
|
|
62
65
|
/**
|
|
63
66
|
* Default implementation of the agent confirm handler
|
|
@@ -66,6 +69,7 @@ export declare class DefaultAgentConfirmHandler implements AgentConfirmHandler {
|
|
|
66
69
|
private store;
|
|
67
70
|
private enabled;
|
|
68
71
|
private defaultParameterName;
|
|
72
|
+
private logger;
|
|
69
73
|
constructor(config?: AgentConfirmHandlerConfig);
|
|
70
74
|
/**
|
|
71
75
|
* Check if tool input contains a valid confirmation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-confirm.d.ts","sourceRoot":"","sources":["../../../src/approval/agent-confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-confirm.d.ts","sourceRoot":"","sources":["../../../src/approval/agent-confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE/D,oDAAoD;AACpD,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,CAAC,EAAE,MAAM,GACrB,kBAAkB,CAAC;IAEtB;;;;;OAKG;IACH,qBAAqB,CACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3B;;;;;OAKG;IACH,mBAAmB,CACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,CAAC,EAAE,MAAM,GACrB,kBAAkB,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,0BAA2B,YAAW,mBAAmB;IACpE,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,yBAA8B;IAOlD;;OAEG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,CAAC,EAAE,MAAM,GACrB,kBAAkB;IA4FrB;;OAEG;IACH,qBAAqB,CACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAa1B;;;OAGG;IACH,mBAAmB,CACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,aAAa,CAAC,EAAE,MAAM,GACrB,kBAAkB;IA4BrB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,gBAAgB,IAAI,MAAM;CAG3B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,CAAC,EAAE,yBAAyB,GACjC,0BAA0B,CAE5B;AAOD;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,0BAA0B,CAK1E;AAED;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* the approval ID.
|
|
8
8
|
*/
|
|
9
9
|
import { getDefaultApprovalStore } from './store.js';
|
|
10
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
11
|
/** Default parameter name for agent confirmation */
|
|
11
12
|
export const DEFAULT_CONFIRM_PARAMETER = '_clawsec_confirm';
|
|
12
13
|
/**
|
|
@@ -16,18 +17,22 @@ export class DefaultAgentConfirmHandler {
|
|
|
16
17
|
store;
|
|
17
18
|
enabled;
|
|
18
19
|
defaultParameterName;
|
|
20
|
+
logger;
|
|
19
21
|
constructor(config = {}) {
|
|
20
22
|
this.store = config.store ?? getDefaultApprovalStore();
|
|
21
23
|
this.enabled = config.enabled ?? true;
|
|
22
24
|
this.defaultParameterName = config.parameterName ?? DEFAULT_CONFIRM_PARAMETER;
|
|
25
|
+
this.logger = config.logger ?? createLogger(null, null);
|
|
23
26
|
}
|
|
24
27
|
/**
|
|
25
28
|
* Check if tool input contains a valid confirmation
|
|
26
29
|
*/
|
|
27
30
|
checkConfirmation(toolInput, parameterName) {
|
|
28
31
|
const paramName = parameterName ?? this.defaultParameterName;
|
|
32
|
+
this.logger.debug(`[AgentConfirm] Checking for confirmation parameter: ${paramName}`);
|
|
29
33
|
// Check if confirmation is disabled
|
|
30
34
|
if (!this.enabled) {
|
|
35
|
+
this.logger.debug(`[AgentConfirm] Agent confirmation is disabled`);
|
|
31
36
|
return {
|
|
32
37
|
confirmed: false,
|
|
33
38
|
valid: false,
|
|
@@ -36,14 +41,17 @@ export class DefaultAgentConfirmHandler {
|
|
|
36
41
|
}
|
|
37
42
|
// Check if parameter exists
|
|
38
43
|
if (!(paramName in toolInput)) {
|
|
44
|
+
this.logger.debug(`[AgentConfirm] Confirmation parameter not found`);
|
|
39
45
|
return {
|
|
40
46
|
confirmed: false,
|
|
41
47
|
valid: false,
|
|
42
48
|
};
|
|
43
49
|
}
|
|
44
50
|
const approvalId = toolInput[paramName];
|
|
51
|
+
this.logger.debug(`[AgentConfirm] Confirmation parameter found: ${paramName}=${approvalId}`);
|
|
45
52
|
// Validate the approval ID is a non-empty string
|
|
46
53
|
if (typeof approvalId !== 'string' || approvalId.trim() === '') {
|
|
54
|
+
this.logger.warn(`[AgentConfirm] Invalid approval ID format`);
|
|
47
55
|
return {
|
|
48
56
|
confirmed: true,
|
|
49
57
|
valid: false,
|
|
@@ -54,6 +62,7 @@ export class DefaultAgentConfirmHandler {
|
|
|
54
62
|
// Look up the approval record
|
|
55
63
|
const record = this.store.get(trimmedId);
|
|
56
64
|
if (!record) {
|
|
65
|
+
this.logger.warn(`[AgentConfirm] Approval not found: id=${trimmedId}`);
|
|
57
66
|
return {
|
|
58
67
|
confirmed: true,
|
|
59
68
|
approvalId: trimmedId,
|
|
@@ -63,6 +72,7 @@ export class DefaultAgentConfirmHandler {
|
|
|
63
72
|
}
|
|
64
73
|
// Check the record status
|
|
65
74
|
if (record.status === 'expired') {
|
|
75
|
+
this.logger.warn(`[AgentConfirm] Approval expired: id=${trimmedId}`);
|
|
66
76
|
return {
|
|
67
77
|
confirmed: true,
|
|
68
78
|
approvalId: trimmedId,
|
|
@@ -71,6 +81,7 @@ export class DefaultAgentConfirmHandler {
|
|
|
71
81
|
};
|
|
72
82
|
}
|
|
73
83
|
if (record.status === 'approved') {
|
|
84
|
+
this.logger.warn(`[AgentConfirm] Approval already used: id=${trimmedId}`);
|
|
74
85
|
return {
|
|
75
86
|
confirmed: true,
|
|
76
87
|
approvalId: trimmedId,
|
|
@@ -79,6 +90,7 @@ export class DefaultAgentConfirmHandler {
|
|
|
79
90
|
};
|
|
80
91
|
}
|
|
81
92
|
if (record.status === 'denied') {
|
|
93
|
+
this.logger.warn(`[AgentConfirm] Approval was denied: id=${trimmedId}`);
|
|
82
94
|
return {
|
|
83
95
|
confirmed: true,
|
|
84
96
|
approvalId: trimmedId,
|
|
@@ -87,6 +99,7 @@ export class DefaultAgentConfirmHandler {
|
|
|
87
99
|
};
|
|
88
100
|
}
|
|
89
101
|
// Valid pending approval
|
|
102
|
+
this.logger.info(`[AgentConfirm] Approval validated: id=${trimmedId}, allowing tool call`);
|
|
90
103
|
return {
|
|
91
104
|
confirmed: true,
|
|
92
105
|
approvalId: trimmedId,
|
|
@@ -102,6 +115,7 @@ export class DefaultAgentConfirmHandler {
|
|
|
102
115
|
return toolInput;
|
|
103
116
|
}
|
|
104
117
|
// Create a shallow copy without the confirm parameter
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
105
119
|
const { [paramName]: _, ...cleanedInput } = toolInput;
|
|
106
120
|
return cleanedInput;
|
|
107
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-confirm.js","sourceRoot":"","sources":["../../../src/approval/agent-confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-confirm.js","sourceRoot":"","sources":["../../../src/approval/agent-confirm.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Stores and manages pending approval records with TTL and auto-cleanup
|
|
4
4
|
*/
|
|
5
5
|
import type { ApprovalStore, PendingApprovalRecord, PendingApprovalInput } from './types.js';
|
|
6
|
+
import { type Logger } from '../utils/logger.js';
|
|
6
7
|
/**
|
|
7
8
|
* Configuration options for the approval store
|
|
8
9
|
*/
|
|
@@ -11,6 +12,8 @@ export interface ApprovalStoreConfig {
|
|
|
11
12
|
cleanupIntervalMs?: number;
|
|
12
13
|
/** Whether to remove expired entries on cleanup (vs just marking them expired) */
|
|
13
14
|
removeOnExpiry?: boolean;
|
|
15
|
+
/** Optional logger instance */
|
|
16
|
+
logger?: Logger;
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* In-memory implementation of the approval store
|
|
@@ -19,6 +22,7 @@ export declare class InMemoryApprovalStore implements ApprovalStore {
|
|
|
19
22
|
private records;
|
|
20
23
|
private cleanupTimer;
|
|
21
24
|
private removeOnExpiry;
|
|
25
|
+
private logger;
|
|
22
26
|
constructor(config?: ApprovalStoreConfig);
|
|
23
27
|
/**
|
|
24
28
|
* Start the periodic cleanup timer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/approval/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/approval/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD;;GAEG;AACH,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,YAAY,CAA+C;IACnE,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,GAAE,mBAAwB;IAU5C;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACI,gBAAgB,IAAI,IAAI;IAO/B;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAUvC;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAkBlD;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO;IAqBjD;;;OAGG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAmBzB;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIxB;;;OAGG;IACH,OAAO,IAAI,IAAI;IA2Bf;;;OAGG;IACH,UAAU,IAAI,qBAAqB,EAAE;IAkBrC;;;OAGG;IACH,IAAI,IAAI,MAAM;IAId;;;OAGG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,qBAAqB,CAEvF;AAQD;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,qBAAqB,CAK/D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAMhD"}
|