@gendigital/sage-openclaw 0.5.4 → 0.7.0

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "sage-openclaw",
3
3
  "name": "Sage",
4
- "version": "0.5.3",
4
+ "version": "0.7.0",
5
5
  "description": "Safety for Agents — ADR layer that guards commands, files, and web requests",
6
6
  "skills": [
7
7
  "resources/skills/security-awareness"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gendigital/sage-openclaw",
3
3
  "license": "Apache-2.0",
4
- "version": "0.5.4",
4
+ "version": "0.7.0",
5
5
  "type": "module",
6
6
  "description": "Safety for Agents — ADR layer for OpenClaw",
7
7
  "main": "./dist/index.cjs",
@@ -13,26 +13,23 @@
13
13
  "README.md",
14
14
  "LICENSE"
15
15
  ],
16
- "scripts": {
17
- "build": "pnpm -C ../core build && pnpm run clean && pnpm run sync:assets && node esbuild.config.js",
18
- "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true});require('node:fs').rmSync('resources',{recursive:true,force:true})\"",
19
- "sync:assets": "node scripts/sync-assets.mjs",
20
- "test": "vitest run"
21
- },
22
16
  "optionalDependencies": {
23
17
  "koffi": "^2.9.0"
24
18
  },
25
19
  "devDependencies": {
26
- "@sage/core": "workspace:*",
27
20
  "@types/node": "^22.0.0",
28
21
  "esbuild": "^0.25.0",
29
22
  "typescript": "^5.9.0",
30
- "vitest": "^4.0.0"
23
+ "vitest": "^4.0.0",
24
+ "@gendigital/sage-core": "0.7.0"
31
25
  },
32
26
  "openclaw": {
33
27
  "extensions": [
34
28
  "./dist/index.cjs"
35
- ]
29
+ ],
30
+ "compat": {
31
+ "pluginApi": ">=2026.3.22"
32
+ }
36
33
  },
37
34
  "engines": {
38
35
  "node": ">=18"
@@ -50,5 +47,11 @@
50
47
  ],
51
48
  "publishConfig": {
52
49
  "access": "public"
50
+ },
51
+ "scripts": {
52
+ "build": "pnpm -C ../core build && pnpm run clean && pnpm run sync:assets && node esbuild.config.js",
53
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true});require('node:fs').rmSync('resources',{recursive:true,force:true})\"",
54
+ "sync:assets": "node scripts/sync-assets.mjs",
55
+ "test": "vitest run"
53
56
  }
54
- }
57
+ }
@@ -57,3 +57,12 @@ You are working in an environment protected by Sage, a security plugin. Be mindf
57
57
  ## Sage Flagged Actions
58
58
 
59
59
  When Sage flags a tool call (as opposed to blocking it outright), you **must** present the details to the user and wait for their explicit approval before calling `sage_approve`. Never auto-approve a flagged action on your own — the user must decide.
60
+
61
+ ## False Positive Reporting
62
+
63
+ If the user believes a Sage detection is incorrect (a wrong block, mistaken flag, or false alarm), you can report it using the MCP tools provided by Sage:
64
+
65
+ 1. **`sage_list_audit_entries`** — Lists recent Sage audit log entries for the current conversation. Use this to find the `entry_id`s of the detections the user considers incorrect.
66
+ 2. **`sage_report_false_positive`** — Submits a false positive report to the Sage backend. Requires a `description` (what was wrongly detected) and `reasoning` (why it is a false positive). Optionally accepts `entry_ids` to scope the report to specific entries.
67
+
68
+ When the user says a detection was wrong, a false positive, or asks to report/dispute a Sage verdict, use these tools to help them.
@@ -111,7 +111,7 @@
111
111
  severity: critical
112
112
  confidence: 0.90
113
113
  action: block
114
- pattern: "(curl|wget)\\s[^&]*&&\\s*chmod\\s+\\+x"
114
+ pattern: "(curl|wget)\\s[\\s\\S]*?(&&|;)\\s*chmod\\s+\\+x"
115
115
  match_on: command
116
116
  title: "Download and execute chain"
117
117
  expires_at: null
@@ -250,7 +250,7 @@
250
250
  severity: high
251
251
  confidence: 0.80
252
252
  action: block
253
- pattern: "\\b(while|for)\\b[^;]*;\\s*do[^;]*\\b(bash|sh|curl|wget)\\b"
253
+ pattern: "\\b(while|for)\\b[^;]*;\\s*do[^;]*(\\b(bash|sh)\\s+-c\\b|\\b(curl|wget)\\b[^;]*\\|\\s*(?:sudo\\s+)?(?:env\\s+)?(?:[^\\s\"']*[\\\\/])?(bash|sh|zsh|ksh|dash)\\b|\\b(curl|wget)\\b[^;]*(?:(-d|--data|--data-binary)\\s+['\\\"]?@\\S+|(--upload-file|-T)\\s+['\\\"]?\\S+))"
254
254
  match_on: command
255
255
  title: "Loop executing shell or download commands"
256
256
  expires_at: null
@@ -100,7 +100,7 @@
100
100
  severity: high
101
101
  confidence: 0.80
102
102
  action: require_approval
103
- pattern: "(rar(\\.exe)?.*[afu].*(-dw|-tb|-ta)|7z(\\.exe)?.*[au].*-sdel|Add-Exfiltration\\.ps1|Do-Exfiltration\\.ps1|Invoke-PostExfil\\.ps1)"
103
+ pattern: "(rar(\\.exe)?.*[afu].*\\s(-dw|-tb|-ta)|7z(\\.exe)?.*[au].*-sdel|Add-Exfiltration\\.ps1|Do-Exfiltration\\.ps1|Invoke-PostExfil\\.ps1)"
104
104
  case_insensitive: true
105
105
  match_on: command
106
106
  title: "MITRE ATT&CK T1020 - Automated Exfiltration"
@@ -737,7 +737,7 @@
737
737
  severity: high
738
738
  confidence: 0.80
739
739
  action: require_approval
740
- pattern: "tscon(\\.exe)?.*$"
740
+ pattern: "(^|\\s|[;&|])(?:\"[^\"]*\\btscon(?:\\.exe)?\\b\"|'[^']*\\btscon(?:\\.exe)?\\b'|(?:[^\\s\"']*[\\\\/])?\\btscon(?:\\.exe)?\\b)\\s+\\S+(\\s+/dest:[^\\s]+)?"
741
741
  case_insensitive: true
742
742
  match_on: command
743
743
  title: "MITRE ATT&CK T1563.002 - RDP Hijacking"
@@ -23,7 +23,7 @@
23
23
  severity: high
24
24
  confidence: 0.85
25
25
  action: require_approval
26
- pattern: "\\.sage[\\\\/](allowlist|config)\\.json"
26
+ pattern: "\\.sage[\\\\/](allowlist|config|exceptions|pending-exceptions)\\.json"
27
27
  match_on: file_path
28
28
  title: "Access Sage configuration files"
29
29
  expires_at: null
@@ -48,7 +48,7 @@
48
48
  severity: high
49
49
  confidence: 0.85
50
50
  action: require_approval
51
- pattern: "heuristics_enabled.*false|url_check.*enabled.*false"
51
+ pattern: "\"heuristics_enabled\"\\s*:\\s*false|\"url_check\"\\s*:\\s*\\{[^}]*\"enabled\"\\s*:\\s*false"
52
52
  match_on: content
53
53
  title: "Attempt to disable Sage security features via config"
54
54
  expires_at: null