@phuetz/code-buddy 0.1.13 → 0.1.15

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 (258) hide show
  1. package/README.md +228 -13
  2. package/dist/agent/architect-mode.d.ts +11 -0
  3. package/dist/agent/architect-mode.js +133 -25
  4. package/dist/agent/architect-mode.js.map +1 -1
  5. package/dist/agent/codebuddy-agent.d.ts +24 -0
  6. package/dist/agent/codebuddy-agent.js +118 -16
  7. package/dist/agent/codebuddy-agent.js.map +1 -1
  8. package/dist/agent/execution/agent-executor.d.ts +9 -0
  9. package/dist/agent/execution/agent-executor.js +61 -0
  10. package/dist/agent/execution/agent-executor.js.map +1 -1
  11. package/dist/agent/message-queue.d.ts +77 -0
  12. package/dist/agent/message-queue.js +116 -0
  13. package/dist/agent/message-queue.js.map +1 -0
  14. package/dist/agent/middleware/auto-observation.d.ts +37 -0
  15. package/dist/agent/middleware/auto-observation.js +231 -0
  16. package/dist/agent/middleware/auto-observation.js.map +1 -0
  17. package/dist/agent/middleware/index.d.ts +2 -0
  18. package/dist/agent/middleware/index.js +1 -0
  19. package/dist/agent/middleware/index.js.map +1 -1
  20. package/dist/agent/tool-handler.js +3 -2
  21. package/dist/agent/tool-handler.js.map +1 -1
  22. package/dist/agent/types.d.ts +7 -2
  23. package/dist/analytics/budget-alerts.d.ts +81 -0
  24. package/dist/analytics/budget-alerts.js +126 -0
  25. package/dist/analytics/budget-alerts.js.map +1 -0
  26. package/dist/analytics/cost-predictor.d.ts +79 -0
  27. package/dist/analytics/cost-predictor.js +150 -0
  28. package/dist/analytics/cost-predictor.js.map +1 -0
  29. package/dist/analytics/index.d.ts +2 -0
  30. package/dist/analytics/index.js +2 -0
  31. package/dist/analytics/index.js.map +1 -1
  32. package/dist/auth/profile-manager.d.ts +205 -0
  33. package/dist/auth/profile-manager.js +484 -0
  34. package/dist/auth/profile-manager.js.map +1 -0
  35. package/dist/browser-automation/browser-manager.d.ts +79 -1
  36. package/dist/browser-automation/browser-manager.js +265 -2
  37. package/dist/browser-automation/browser-manager.js.map +1 -1
  38. package/dist/browser-automation/profile-manager.d.ts +32 -0
  39. package/dist/browser-automation/profile-manager.js +83 -0
  40. package/dist/browser-automation/profile-manager.js.map +1 -0
  41. package/dist/browser-automation/route-interceptor.d.ts +29 -0
  42. package/dist/browser-automation/route-interceptor.js +103 -0
  43. package/dist/browser-automation/route-interceptor.js.map +1 -0
  44. package/dist/browser-automation/screenshot-annotator.d.ts +23 -0
  45. package/dist/browser-automation/screenshot-annotator.js +86 -0
  46. package/dist/browser-automation/screenshot-annotator.js.map +1 -0
  47. package/dist/browser-automation/types.d.ts +47 -0
  48. package/dist/channels/discord/client.d.ts +2 -1
  49. package/dist/channels/discord/client.js +28 -16
  50. package/dist/channels/discord/client.js.map +1 -1
  51. package/dist/channels/google-chat/index.d.ts +210 -0
  52. package/dist/channels/google-chat/index.js +505 -0
  53. package/dist/channels/google-chat/index.js.map +1 -0
  54. package/dist/channels/group-security.d.ts +182 -0
  55. package/dist/channels/group-security.js +407 -0
  56. package/dist/channels/group-security.js.map +1 -0
  57. package/dist/channels/index.d.ts +17 -1
  58. package/dist/channels/index.js +16 -0
  59. package/dist/channels/index.js.map +1 -1
  60. package/dist/channels/matrix/index.d.ts +181 -0
  61. package/dist/channels/matrix/index.js +643 -0
  62. package/dist/channels/matrix/index.js.map +1 -0
  63. package/dist/channels/offline-queue.d.ts +92 -0
  64. package/dist/channels/offline-queue.js +112 -0
  65. package/dist/channels/offline-queue.js.map +1 -0
  66. package/dist/channels/reconnection-manager.d.ts +117 -0
  67. package/dist/channels/reconnection-manager.js +179 -0
  68. package/dist/channels/reconnection-manager.js.map +1 -0
  69. package/dist/channels/signal/index.d.ts +184 -0
  70. package/dist/channels/signal/index.js +488 -0
  71. package/dist/channels/signal/index.js.map +1 -0
  72. package/dist/channels/slack/client.d.ts +2 -1
  73. package/dist/channels/slack/client.js +30 -20
  74. package/dist/channels/slack/client.js.map +1 -1
  75. package/dist/channels/teams/index.d.ts +196 -0
  76. package/dist/channels/teams/index.js +477 -0
  77. package/dist/channels/teams/index.js.map +1 -0
  78. package/dist/channels/telegram/client.d.ts +3 -1
  79. package/dist/channels/telegram/client.js +29 -2
  80. package/dist/channels/telegram/client.js.map +1 -1
  81. package/dist/channels/webchat/index.d.ts +103 -0
  82. package/dist/channels/webchat/index.js +697 -0
  83. package/dist/channels/webchat/index.js.map +1 -0
  84. package/dist/channels/whatsapp/index.d.ts +105 -0
  85. package/dist/channels/whatsapp/index.js +533 -0
  86. package/dist/channels/whatsapp/index.js.map +1 -0
  87. package/dist/codebuddy/client.js +6 -3
  88. package/dist/codebuddy/client.js.map +1 -1
  89. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
  90. package/dist/codebuddy/tool-definitions/advanced-tools.js +103 -3
  91. package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
  92. package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
  93. package/dist/codebuddy/tool-definitions/index.js +1 -1
  94. package/dist/codebuddy/tool-definitions/index.js.map +1 -1
  95. package/dist/codebuddy/tools.js +3 -1
  96. package/dist/codebuddy/tools.js.map +1 -1
  97. package/dist/commands/cli/config-command.d.ts +8 -0
  98. package/dist/commands/cli/config-command.js +90 -0
  99. package/dist/commands/cli/config-command.js.map +1 -0
  100. package/dist/commands/cli/openclaw-commands.d.ts +12 -0
  101. package/dist/commands/cli/openclaw-commands.js +446 -0
  102. package/dist/commands/cli/openclaw-commands.js.map +1 -0
  103. package/dist/commands/cli/utility-commands.js +30 -0
  104. package/dist/commands/cli/utility-commands.js.map +1 -1
  105. package/dist/commands/client-dispatcher.js +22 -2
  106. package/dist/commands/client-dispatcher.js.map +1 -1
  107. package/dist/commands/enhanced-command-handler.js +21 -2
  108. package/dist/commands/enhanced-command-handler.js.map +1 -1
  109. package/dist/commands/handlers/extra-handlers.d.ts +30 -0
  110. package/dist/commands/handlers/extra-handlers.js +547 -0
  111. package/dist/commands/handlers/extra-handlers.js.map +1 -0
  112. package/dist/commands/handlers/index.d.ts +1 -0
  113. package/dist/commands/handlers/index.js +2 -0
  114. package/dist/commands/handlers/index.js.map +1 -1
  115. package/dist/commands/slash/builtin-commands.js +41 -34
  116. package/dist/commands/slash/builtin-commands.js.map +1 -1
  117. package/dist/config/env-schema.d.ts +58 -0
  118. package/dist/config/env-schema.js +789 -0
  119. package/dist/config/env-schema.js.map +1 -0
  120. package/dist/config/feature-flags.js +2 -1
  121. package/dist/config/feature-flags.js.map +1 -1
  122. package/dist/context/bootstrap-loader.d.ts +48 -0
  123. package/dist/context/bootstrap-loader.js +123 -0
  124. package/dist/context/bootstrap-loader.js.map +1 -0
  125. package/dist/copilot/copilot-proxy.d.ts +15 -1
  126. package/dist/copilot/copilot-proxy.js +81 -22
  127. package/dist/copilot/copilot-proxy.js.map +1 -1
  128. package/dist/daemon/heartbeat.d.ts +112 -0
  129. package/dist/daemon/heartbeat.js +339 -0
  130. package/dist/daemon/heartbeat.js.map +1 -0
  131. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  132. package/dist/desktop-automation/smart-snapshot.js +28 -0
  133. package/dist/desktop-automation/smart-snapshot.js.map +1 -1
  134. package/dist/identity/identity-manager.d.ts +95 -0
  135. package/dist/identity/identity-manager.js +242 -0
  136. package/dist/identity/identity-manager.js.map +1 -0
  137. package/dist/index.js +147 -17
  138. package/dist/index.js.map +1 -1
  139. package/dist/integrations/github-integration.js +1 -1
  140. package/dist/integrations/github-integration.js.map +1 -1
  141. package/dist/persistence/conversation-branches.js +2 -1
  142. package/dist/persistence/conversation-branches.js.map +1 -1
  143. package/dist/persistence/session-store.d.ts +1 -1
  144. package/dist/persistence/session-store.js +1 -1
  145. package/dist/persistence/session-store.js.map +1 -1
  146. package/dist/sandbox/auto-sandbox.d.ts +59 -0
  147. package/dist/sandbox/auto-sandbox.js +145 -0
  148. package/dist/sandbox/auto-sandbox.js.map +1 -0
  149. package/dist/security/audit-logger.d.ts +127 -0
  150. package/dist/security/audit-logger.js +194 -0
  151. package/dist/security/audit-logger.js.map +1 -0
  152. package/dist/security/bash-allowlist/allowlist-store.js +3 -2
  153. package/dist/security/bash-allowlist/allowlist-store.js.map +1 -1
  154. package/dist/security/bash-parser.js +0 -2
  155. package/dist/security/bash-parser.js.map +1 -1
  156. package/dist/security/code-validator.d.ts +51 -0
  157. package/dist/security/code-validator.js +185 -0
  158. package/dist/security/code-validator.js.map +1 -0
  159. package/dist/security/dangerous-patterns.d.ts +68 -0
  160. package/dist/security/dangerous-patterns.js +218 -0
  161. package/dist/security/dangerous-patterns.js.map +1 -0
  162. package/dist/security/remote-approval.d.ts +65 -0
  163. package/dist/security/remote-approval.js +138 -0
  164. package/dist/security/remote-approval.js.map +1 -0
  165. package/dist/security/security-audit.d.ts +7 -0
  166. package/dist/security/security-audit.js +23 -0
  167. package/dist/security/security-audit.js.map +1 -1
  168. package/dist/security/syntax-validator.d.ts +17 -0
  169. package/dist/security/syntax-validator.js +292 -0
  170. package/dist/security/syntax-validator.js.map +1 -0
  171. package/dist/server/index.js +277 -2
  172. package/dist/server/index.js.map +1 -1
  173. package/dist/services/prompt-builder.js +16 -0
  174. package/dist/services/prompt-builder.js.map +1 -1
  175. package/dist/skills/hub.d.ts +231 -0
  176. package/dist/skills/hub.js +694 -0
  177. package/dist/skills/hub.js.map +1 -0
  178. package/dist/skills/skill-loader.js +1 -1
  179. package/dist/skills/skill-loader.js.map +1 -1
  180. package/dist/skills/skill-manager.js +2 -1
  181. package/dist/skills/skill-manager.js.map +1 -1
  182. package/dist/tools/apply-patch.d.ts +1 -0
  183. package/dist/tools/apply-patch.js +57 -10
  184. package/dist/tools/apply-patch.js.map +1 -1
  185. package/dist/tools/bash/bash-tool.d.ts +123 -0
  186. package/dist/tools/bash/bash-tool.js +549 -0
  187. package/dist/tools/bash/bash-tool.js.map +1 -0
  188. package/dist/tools/bash/command-validator.d.ts +49 -0
  189. package/dist/tools/bash/command-validator.js +223 -0
  190. package/dist/tools/bash/command-validator.js.map +1 -0
  191. package/dist/tools/bash/index.d.ts +7 -0
  192. package/dist/tools/bash/index.js +8 -0
  193. package/dist/tools/bash/index.js.map +1 -0
  194. package/dist/tools/bash/security-patterns.d.ts +44 -0
  195. package/dist/tools/bash/security-patterns.js +234 -0
  196. package/dist/tools/bash/security-patterns.js.map +1 -0
  197. package/dist/tools/bash/streaming-executor.d.ts +23 -0
  198. package/dist/tools/bash/streaming-executor.js +134 -0
  199. package/dist/tools/bash/streaming-executor.js.map +1 -0
  200. package/dist/tools/code-formatter.js +41 -27
  201. package/dist/tools/code-formatter.js.map +1 -1
  202. package/dist/tools/code-review.js +1 -1
  203. package/dist/tools/code-review.js.map +1 -1
  204. package/dist/tools/computer-control-tool.js +21 -0
  205. package/dist/tools/computer-control-tool.js.map +1 -1
  206. package/dist/tools/document-tool.js +3 -2
  207. package/dist/tools/document-tool.js.map +1 -1
  208. package/dist/tools/git-tool.d.ts +45 -0
  209. package/dist/tools/git-tool.js +222 -0
  210. package/dist/tools/git-tool.js.map +1 -1
  211. package/dist/tools/index.d.ts +1 -1
  212. package/dist/tools/index.js +1 -1
  213. package/dist/tools/index.js.map +1 -1
  214. package/dist/tools/multi-edit.js +31 -3
  215. package/dist/tools/multi-edit.js.map +1 -1
  216. package/dist/tools/process-tool.d.ts +69 -0
  217. package/dist/tools/process-tool.js +222 -0
  218. package/dist/tools/process-tool.js.map +1 -0
  219. package/dist/tools/registry/git-tools.d.ts +32 -0
  220. package/dist/tools/registry/git-tools.js +211 -0
  221. package/dist/tools/registry/git-tools.js.map +1 -0
  222. package/dist/tools/registry/index.d.ts +2 -0
  223. package/dist/tools/registry/index.js +8 -0
  224. package/dist/tools/registry/index.js.map +1 -1
  225. package/dist/tools/registry/misc-tools.d.ts +32 -4
  226. package/dist/tools/registry/misc-tools.js +230 -90
  227. package/dist/tools/registry/misc-tools.js.map +1 -1
  228. package/dist/tools/registry/process-tools.d.ts +20 -0
  229. package/dist/tools/registry/process-tools.js +141 -0
  230. package/dist/tools/registry/process-tools.js.map +1 -0
  231. package/dist/tools/registry/types.d.ts +2 -0
  232. package/dist/ui/components/ChatInterface.js +9 -0
  233. package/dist/ui/components/ChatInterface.js.map +1 -1
  234. package/dist/utils/autonomy-manager.js +3 -2
  235. package/dist/utils/autonomy-manager.js.map +1 -1
  236. package/dist/utils/config-validation/schema.d.ts +15 -15
  237. package/dist/utils/confirmation-service.d.ts +16 -0
  238. package/dist/utils/confirmation-service.js +37 -3
  239. package/dist/utils/confirmation-service.js.map +1 -1
  240. package/dist/utils/custom-instructions.js +2 -1
  241. package/dist/utils/custom-instructions.js.map +1 -1
  242. package/dist/utils/graceful-shutdown.js +9 -9
  243. package/dist/utils/graceful-shutdown.js.map +1 -1
  244. package/dist/utils/head-tail-truncation.d.ts +18 -0
  245. package/dist/utils/head-tail-truncation.js +127 -0
  246. package/dist/utils/head-tail-truncation.js.map +1 -1
  247. package/dist/utils/history-manager.js +3 -2
  248. package/dist/utils/history-manager.js.map +1 -1
  249. package/dist/utils/performance.js +16 -15
  250. package/dist/utils/performance.js.map +1 -1
  251. package/dist/utils/update-notifier.js +2 -1
  252. package/dist/utils/update-notifier.js.map +1 -1
  253. package/dist/workflows/pipeline.d.ts +54 -1
  254. package/dist/workflows/pipeline.js +128 -7
  255. package/dist/workflows/pipeline.js.map +1 -1
  256. package/dist/workflows/step-manager.js +2 -1
  257. package/dist/workflows/step-manager.js.map +1 -1
  258. package/package.json +6 -3
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Centralized Dangerous Patterns Registry
3
+ *
4
+ * Single source of truth for all dangerous pattern detection across:
5
+ * - Bash command validation (bash tool, command-validator)
6
+ * - Skill scanner (static analysis of SKILL.md files)
7
+ * - Input validators (validators.ts)
8
+ * - Bash parser (containsDangerousCommand)
9
+ * - Code validator (generated code checks)
10
+ *
11
+ * Consolidates patterns previously scattered across 4+ files.
12
+ */
13
+ export type PatternSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
14
+ export type PatternCategory = 'filesystem_destruction' | 'remote_code_execution' | 'command_injection' | 'privilege_escalation' | 'network_exfiltration' | 'encoding_bypass' | 'code_execution' | 'dynamic_import' | 'prototype_pollution' | 'secret_exposure' | 'shell_injection' | 'system_control' | 'credential_access';
15
+ export interface DangerousPattern {
16
+ /** Regex to match */
17
+ pattern: RegExp;
18
+ /** Severity level */
19
+ severity: PatternSeverity;
20
+ /** Human-readable description */
21
+ description: string;
22
+ /** Short identifier */
23
+ name: string;
24
+ /** Classification category */
25
+ category: PatternCategory;
26
+ /** Which subsystems use this pattern */
27
+ appliesTo: Array<'bash' | 'skill' | 'code' | 'command'>;
28
+ }
29
+ /**
30
+ * Commands that are always dangerous regardless of arguments.
31
+ * Used by bash-parser's containsDangerousCommand() and bash tool's BLOCKED_COMMANDS.
32
+ */
33
+ export declare const DANGEROUS_COMMANDS: ReadonlySet<string>;
34
+ /**
35
+ * Patterns that should block command execution.
36
+ * Merged from bash tool's BLOCKED_PATTERNS + validators DANGEROUS_COMMAND_PATTERNS.
37
+ */
38
+ export declare const DANGEROUS_BASH_PATTERNS: DangerousPattern[];
39
+ /**
40
+ * Patterns for scanning code content (skill files, LLM output).
41
+ * Merged from skill-scanner's DANGEROUS_PATTERNS + new additions.
42
+ */
43
+ export declare const DANGEROUS_CODE_PATTERNS: DangerousPattern[];
44
+ /**
45
+ * Get all patterns applicable to a specific subsystem.
46
+ */
47
+ export declare function getPatternsFor(subsystem: 'bash' | 'skill' | 'code' | 'command'): DangerousPattern[];
48
+ /**
49
+ * Get patterns at or above a given severity level.
50
+ */
51
+ export declare function getPatternsBySeverity(minSeverity: PatternSeverity, patterns?: DangerousPattern[]): DangerousPattern[];
52
+ /**
53
+ * Get patterns by category.
54
+ */
55
+ export declare function getPatternsByCategory(category: PatternCategory, patterns?: DangerousPattern[]): DangerousPattern[];
56
+ /**
57
+ * Check if a string matches any dangerous pattern for the given subsystem.
58
+ * Returns the first matching pattern or null.
59
+ */
60
+ export declare function matchDangerousPattern(text: string, subsystem: 'bash' | 'skill' | 'code' | 'command'): DangerousPattern | null;
61
+ /**
62
+ * Check if a string matches any dangerous patterns, returning all matches.
63
+ */
64
+ export declare function matchAllDangerousPatterns(text: string, subsystem: 'bash' | 'skill' | 'code' | 'command'): DangerousPattern[];
65
+ /**
66
+ * Check if a command name is in the dangerous commands set.
67
+ */
68
+ export declare function isDangerousCommand(commandName: string): boolean;
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Centralized Dangerous Patterns Registry
3
+ *
4
+ * Single source of truth for all dangerous pattern detection across:
5
+ * - Bash command validation (bash tool, command-validator)
6
+ * - Skill scanner (static analysis of SKILL.md files)
7
+ * - Input validators (validators.ts)
8
+ * - Bash parser (containsDangerousCommand)
9
+ * - Code validator (generated code checks)
10
+ *
11
+ * Consolidates patterns previously scattered across 4+ files.
12
+ */
13
+ // ============================================================================
14
+ // Dangerous Commands (for parsed command name matching)
15
+ // ============================================================================
16
+ /**
17
+ * Commands that are always dangerous regardless of arguments.
18
+ * Used by bash-parser's containsDangerousCommand() and bash tool's BLOCKED_COMMANDS.
19
+ */
20
+ export const DANGEROUS_COMMANDS = new Set([
21
+ // Destructive file operations
22
+ 'rm', 'shred', 'wipefs', 'rmdir',
23
+ // Disk operations
24
+ 'mkfs', 'fdisk', 'parted', 'dd',
25
+ // Permission changes
26
+ 'chmod', 'chown', 'chgrp',
27
+ // Privilege escalation
28
+ 'sudo', 'su', 'doas',
29
+ // Network tools (dangerous modes)
30
+ 'nc', 'netcat', 'ncat', 'socat',
31
+ // Insecure protocols
32
+ 'telnet', 'ftp',
33
+ // Port scanning / packet capture
34
+ 'nmap', 'masscan', 'tcpdump', 'wireshark', 'tshark',
35
+ // Process tracing / debugging
36
+ 'strace', 'ltrace', 'ptrace', 'gdb', 'lldb',
37
+ // System control
38
+ 'reboot', 'shutdown', 'poweroff', 'halt',
39
+ 'init', 'systemctl', 'service',
40
+ // Firewall
41
+ 'iptables', 'ip6tables', 'nft', 'firewall-cmd',
42
+ // Mount operations
43
+ 'mount', 'umount',
44
+ // Kernel modules
45
+ 'insmod', 'rmmod', 'modprobe', 'sysctl',
46
+ // Scheduled tasks
47
+ 'crontab', 'at',
48
+ // User management
49
+ 'useradd', 'userdel', 'usermod', 'groupadd',
50
+ 'passwd', 'chpasswd', 'visudo',
51
+ // SSH / GPG / certs
52
+ 'ssh-keygen', 'ssh-add', 'gpg', 'openssl',
53
+ // Kill (process control)
54
+ 'kill', 'killall', 'pkill',
55
+ ]);
56
+ // ============================================================================
57
+ // Dangerous Bash Patterns (regex-based, for full command strings)
58
+ // ============================================================================
59
+ /**
60
+ * Patterns that should block command execution.
61
+ * Merged from bash tool's BLOCKED_PATTERNS + validators DANGEROUS_COMMAND_PATTERNS.
62
+ */
63
+ export const DANGEROUS_BASH_PATTERNS = [
64
+ // --- Filesystem destruction ---
65
+ { pattern: /rm\s+(-rf?|--recursive)\s+[/~]/i, severity: 'critical', description: 'Recursive force delete from root or home', name: 'rm-rf-root', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
66
+ { pattern: /rm\s+.*\/\s*$/i, severity: 'high', description: 'Delete ending with directory path', name: 'rm-dir-path', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
67
+ { pattern: />\s*\/dev\/sd[a-z]/i, severity: 'critical', description: 'Write to disk device', name: 'write-disk-device', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
68
+ { pattern: /dd\s+.*if=.*of=\/dev/i, severity: 'critical', description: 'dd to disk device', name: 'dd-device', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
69
+ { pattern: /mkfs/i, severity: 'critical', description: 'Format filesystem', name: 'mkfs', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
70
+ { pattern: /:\(\)\s*\{\s*:\|:&\s*\};:/, severity: 'critical', description: 'Fork bomb', name: 'fork-bomb', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
71
+ { pattern: /chmod\s+-R\s+777\s+\//i, severity: 'critical', description: 'chmod 777 on root', name: 'chmod-777-root', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
72
+ { pattern: />\s*\/etc\/(passwd|shadow|sudoers)/i, severity: 'critical', description: 'Overwrite system files', name: 'overwrite-sys-files', category: 'filesystem_destruction', appliesTo: ['bash', 'command'] },
73
+ // --- Remote code execution via pipe to shell ---
74
+ { pattern: /wget.*\|\s*(ba)?sh/i, severity: 'critical', description: 'wget | sh (remote code execution)', name: 'wget-pipe-sh', category: 'remote_code_execution', appliesTo: ['bash', 'command'] },
75
+ { pattern: /curl.*\|\s*(ba)?sh/i, severity: 'critical', description: 'curl | sh (remote code execution)', name: 'curl-pipe-sh', category: 'remote_code_execution', appliesTo: ['bash', 'command'] },
76
+ { pattern: /sudo\s+(rm|dd|mkfs)/i, severity: 'critical', description: 'Sudo with dangerous command', name: 'sudo-dangerous', category: 'privilege_escalation', appliesTo: ['bash', 'command'] },
77
+ // --- Command injection via substitution ---
78
+ { pattern: /\$\([^)]*(?:rm|dd|mkfs|chmod|chown|curl|wget|nc|netcat|bash|sh|eval|exec)/i, severity: 'high', description: 'Dangerous command in $() substitution', name: 'subst-dangerous', category: 'command_injection', appliesTo: ['bash'] },
79
+ { pattern: /`[^`]*(?:rm|dd|mkfs|chmod|chown|curl|wget|nc|netcat|bash|sh|eval|exec)/i, severity: 'high', description: 'Dangerous command in backtick substitution', name: 'backtick-dangerous', category: 'command_injection', appliesTo: ['bash'] },
80
+ // --- Secret variable expansion ---
81
+ { pattern: /\$\{?(?:GROK_API_KEY|AWS_SECRET|AWS_ACCESS_KEY|AWS_SESSION_TOKEN|GITHUB_TOKEN|NPM_TOKEN|MORPH_API_KEY|DATABASE_URL|DB_PASSWORD|SECRET_KEY|PRIVATE_KEY|API_KEY|API_SECRET|AUTH_TOKEN|ACCESS_TOKEN|OPENAI_API_KEY|ANTHROPIC_API_KEY|SLACK_TOKEN|DISCORD_TOKEN)\}?/i, severity: 'high', description: 'Secret variable expansion', name: 'secret-var-expand', category: 'secret_exposure', appliesTo: ['bash'] },
82
+ // --- Eval and exec injection ---
83
+ { pattern: /\beval\s+.*\$/i, severity: 'high', description: 'eval with variable expansion', name: 'eval-var', category: 'code_execution', appliesTo: ['bash', 'command'] },
84
+ { pattern: /\bexec\s+\d*[<>]/i, severity: 'high', description: 'exec with redirections', name: 'exec-redirect', category: 'code_execution', appliesTo: ['bash', 'command'] },
85
+ // --- Encoding bypass attempts ---
86
+ { pattern: /\\x[0-9a-f]{2}/i, severity: 'high', description: 'Hex escape sequences', name: 'hex-escape', category: 'encoding_bypass', appliesTo: ['bash'] },
87
+ { pattern: /\\[0-7]{3}/, severity: 'high', description: 'Octal escape sequences', name: 'octal-escape', category: 'encoding_bypass', appliesTo: ['bash'] },
88
+ { pattern: /\$'\\x/i, severity: 'high', description: 'ANSI-C quoting with hex', name: 'ansi-c-hex', category: 'encoding_bypass', appliesTo: ['bash'] },
89
+ { pattern: /\$'\\[0-7]/, severity: 'high', description: 'ANSI-C quoting with octal', name: 'ansi-c-octal', category: 'encoding_bypass', appliesTo: ['bash'] },
90
+ { pattern: /\$'[^']*\\[nrtbfv]/i, severity: 'medium', description: 'ANSI-C with special escape sequences', name: 'ansi-c-special', category: 'encoding_bypass', appliesTo: ['bash'] },
91
+ { pattern: /base64\s+(-d|--decode).*\|\s*(ba)?sh/i, severity: 'critical', description: 'Base64 decode piped to shell', name: 'base64-pipe-sh', category: 'encoding_bypass', appliesTo: ['bash', 'command'] },
92
+ // --- Network exfiltration ---
93
+ { pattern: /\|\s*(nc|netcat|curl|wget)\s+[^|]*(>|>>)/i, severity: 'high', description: 'Pipe to network tool with redirect', name: 'net-redirect', category: 'network_exfiltration', appliesTo: ['bash'] },
94
+ { pattern: />\s*\/dev\/(tcp|udp)\//i, severity: 'critical', description: 'Bash network redirection', name: 'dev-tcp', category: 'network_exfiltration', appliesTo: ['bash'] },
95
+ { pattern: /\bnc\s+-[elp]/i, severity: 'high', description: 'Netcat listen/exec modes', name: 'nc-listen', category: 'network_exfiltration', appliesTo: ['bash'] },
96
+ { pattern: /\bbash\s+-i\s+>&?\s*\/dev\/(tcp|udp)/i, severity: 'critical', description: 'Bash reverse shell', name: 'bash-reverse-shell', category: 'network_exfiltration', appliesTo: ['bash'] },
97
+ { pattern: /nc\s+.*-e\s+.*sh/i, severity: 'critical', description: 'Netcat reverse shell', name: 'nc-reverse-shell', category: 'network_exfiltration', appliesTo: ['bash', 'command'] },
98
+ // --- Additional bypass patterns ---
99
+ { pattern: /\bprintf\s+['"]%b['"].*\\x/i, severity: 'high', description: 'printf %b with hex (bypass attempt)', name: 'printf-hex', category: 'encoding_bypass', appliesTo: ['bash'] },
100
+ { pattern: /\becho\s+-e\s+.*\\x/i, severity: 'high', description: 'echo -e with hex', name: 'echo-hex', category: 'encoding_bypass', appliesTo: ['bash'] },
101
+ { pattern: /\becho\s+\$'\\x/i, severity: 'high', description: 'echo with ANSI-C quoting', name: 'echo-ansi', category: 'encoding_bypass', appliesTo: ['bash'] },
102
+ { pattern: /\bxxd\s+-r.*\|\s*(ba)?sh/i, severity: 'critical', description: 'xxd decode to shell', name: 'xxd-pipe-sh', category: 'encoding_bypass', appliesTo: ['bash'] },
103
+ { pattern: /\bpython[23]?\s+-c\s+['"].*(?:exec|eval|os\.system|subprocess|__import__)/i, severity: 'high', description: 'Python code execution', name: 'python-exec', category: 'code_execution', appliesTo: ['bash'] },
104
+ { pattern: /\bperl\s+-e\s+['"].*(?:system|exec|`)/i, severity: 'high', description: 'Perl code execution', name: 'perl-exec', category: 'code_execution', appliesTo: ['bash'] },
105
+ { pattern: /\bruby\s+-e\s+['"].*(?:system|exec|`)/i, severity: 'high', description: 'Ruby code execution', name: 'ruby-exec', category: 'code_execution', appliesTo: ['bash'] },
106
+ { pattern: /\bnode\s+-e\s+['"].*(?:exec|spawn|child_process)/i, severity: 'high', description: 'Node.js code execution', name: 'node-exec', category: 'code_execution', appliesTo: ['bash'] },
107
+ { pattern: /\bawk\s+.*\bsystem\s*\(/i, severity: 'high', description: 'awk system() call', name: 'awk-system', category: 'code_execution', appliesTo: ['bash'] },
108
+ { pattern: /\bsed\s+.*e\b/i, severity: 'medium', description: 'sed with e flag (exec)', name: 'sed-exec', category: 'code_execution', appliesTo: ['bash'] },
109
+ ];
110
+ // ============================================================================
111
+ // Code Scanning Patterns (for skill files and generated code)
112
+ // ============================================================================
113
+ /**
114
+ * Patterns for scanning code content (skill files, LLM output).
115
+ * Merged from skill-scanner's DANGEROUS_PATTERNS + new additions.
116
+ */
117
+ export const DANGEROUS_CODE_PATTERNS = [
118
+ // --- Code execution ---
119
+ { pattern: /\beval\s*\(/, severity: 'critical', description: 'Dynamic code execution via eval()', name: 'eval', category: 'code_execution', appliesTo: ['skill', 'code'] },
120
+ { pattern: /\bnew\s+Function\s*\(/, severity: 'critical', description: 'Dynamic function creation', name: 'new-function', category: 'code_execution', appliesTo: ['skill', 'code'] },
121
+ { pattern: /\bchild_process\b/, severity: 'high', description: 'Child process module usage', name: 'child_process', category: 'code_execution', appliesTo: ['skill', 'code'] },
122
+ { pattern: /\bexecSync\s*\(/, severity: 'high', description: 'Synchronous command execution', name: 'execSync', category: 'code_execution', appliesTo: ['skill', 'code'] },
123
+ { pattern: /\bexecFile\s*\(/, severity: 'high', description: 'File execution', name: 'execFile', category: 'code_execution', appliesTo: ['skill', 'code'] },
124
+ { pattern: /\bspawn\s*\(/, severity: 'medium', description: 'Process spawning', name: 'spawn', category: 'code_execution', appliesTo: ['skill', 'code'] },
125
+ { pattern: /\bexec\s*\(/, severity: 'high', description: 'Command execution', name: 'exec', category: 'code_execution', appliesTo: ['skill', 'code'] },
126
+ // --- Filesystem dangers ---
127
+ { pattern: /\brm\s+-rf\b/, severity: 'critical', description: 'Recursive force delete', name: 'rm-rf', category: 'filesystem_destruction', appliesTo: ['skill', 'code'] },
128
+ { pattern: /\bunlinkSync\s*\(/, severity: 'medium', description: 'Synchronous file deletion', name: 'unlinkSync', category: 'filesystem_destruction', appliesTo: ['skill', 'code'] },
129
+ { pattern: /\bwriteFileSync\s*\(/, severity: 'low', description: 'Synchronous file write', name: 'writeFileSync', category: 'filesystem_destruction', appliesTo: ['skill'] },
130
+ { pattern: /\brmdirSync\s*\(/, severity: 'medium', description: 'Directory removal', name: 'rmdirSync', category: 'filesystem_destruction', appliesTo: ['skill', 'code'] },
131
+ // --- Network ---
132
+ { pattern: /\bfetch\s*\(\s*['"`]http/, severity: 'medium', description: 'External HTTP request', name: 'fetch-http', category: 'network_exfiltration', appliesTo: ['skill'] },
133
+ { pattern: /\baxios\b/, severity: 'low', description: 'HTTP client library usage', name: 'axios', category: 'network_exfiltration', appliesTo: ['skill'] },
134
+ { pattern: /\brequire\s*\(\s*['"`]https?['"`]\s*\)/, severity: 'medium', description: 'HTTP module import', name: 'http-require', category: 'network_exfiltration', appliesTo: ['skill'] },
135
+ { pattern: /\bWebSocket\b/, severity: 'medium', description: 'WebSocket usage', name: 'websocket', category: 'network_exfiltration', appliesTo: ['skill'] },
136
+ // --- Dynamic imports ---
137
+ { pattern: /\brequire\s*\(\s*[a-zA-Z_$\[]/, severity: 'high', description: 'Dynamic require with variable', name: 'dynamic-require', category: 'dynamic_import', appliesTo: ['skill', 'code'] },
138
+ { pattern: /\bimport\s*\(\s*[a-zA-Z_$\[]/, severity: 'high', description: 'Dynamic import with variable', name: 'dynamic-import', category: 'dynamic_import', appliesTo: ['skill', 'code'] },
139
+ // --- Environment/secrets ---
140
+ { pattern: /process\.env\[/, severity: 'low', description: 'Dynamic environment variable access', name: 'env-dynamic', category: 'secret_exposure', appliesTo: ['skill'] },
141
+ { pattern: /\b(API_KEY|SECRET|PASSWORD|TOKEN)\b/i, severity: 'info', description: 'Possible secret reference', name: 'secret-ref', category: 'secret_exposure', appliesTo: ['skill'] },
142
+ // --- Prototype pollution ---
143
+ { pattern: /__proto__/, severity: 'high', description: 'Prototype pollution risk', name: 'proto', category: 'prototype_pollution', appliesTo: ['skill', 'code'] },
144
+ { pattern: /\bconstructor\s*\[/, severity: 'high', description: 'Constructor access via bracket notation', name: 'constructor-bracket', category: 'prototype_pollution', appliesTo: ['skill', 'code'] },
145
+ // --- Shell injection in code ---
146
+ { pattern: /`\$\{.*\}`/, severity: 'medium', description: 'Template literal with interpolation (potential injection)', name: 'template-injection', category: 'shell_injection', appliesTo: ['skill', 'code'] },
147
+ { pattern: /\$\(.*\)/, severity: 'medium', description: 'Shell command substitution', name: 'shell-subst', category: 'shell_injection', appliesTo: ['skill'] },
148
+ // --- SQL injection patterns (for generated code) ---
149
+ { pattern: /['"`]\s*\+\s*\w+\s*\+\s*['"`].*(?:SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE)\b/i, severity: 'high', description: 'SQL string concatenation (injection risk)', name: 'sql-concat', category: 'command_injection', appliesTo: ['code'] },
150
+ { pattern: /\b(?:query|execute|exec)\s*\(\s*['"`].*\$\{/i, severity: 'high', description: 'SQL template literal interpolation', name: 'sql-template', category: 'command_injection', appliesTo: ['code'] },
151
+ { pattern: /\b(?:query|execute|exec)\s*\(\s*\w+\s*\+/i, severity: 'medium', description: 'SQL with string concatenation', name: 'sql-string-concat', category: 'command_injection', appliesTo: ['code'] },
152
+ // --- XSS patterns (for generated code) ---
153
+ { pattern: /\.innerHTML\s*=\s*(?!\s*['"`]\s*['"`])/, severity: 'high', description: 'innerHTML assignment (XSS risk)', name: 'innerHTML', category: 'command_injection', appliesTo: ['code'] },
154
+ { pattern: /document\.write\s*\(/, severity: 'high', description: 'document.write (XSS risk)', name: 'document-write', category: 'command_injection', appliesTo: ['code'] },
155
+ { pattern: /\bdangerouslySetInnerHTML\b/, severity: 'medium', description: 'React dangerouslySetInnerHTML', name: 'react-dangerous-html', category: 'command_injection', appliesTo: ['code'] },
156
+ // --- Hardcoded secrets ---
157
+ { pattern: /(?:password|passwd|pwd|secret|token|api_key|apikey)\s*[:=]\s*['"][^'"]{8,}['"]/i, severity: 'high', description: 'Hardcoded secret in code', name: 'hardcoded-secret', category: 'secret_exposure', appliesTo: ['code'] },
158
+ { pattern: /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/, severity: 'critical', description: 'Private key in code', name: 'private-key', category: 'secret_exposure', appliesTo: ['code', 'skill'] },
159
+ // --- Unsafe deserialization ---
160
+ { pattern: /\bpickle\.loads?\b/, severity: 'high', description: 'Python pickle deserialization', name: 'pickle-loads', category: 'code_execution', appliesTo: ['code'] },
161
+ { pattern: /\byaml\.load\s*\((?!.*Loader)/, severity: 'medium', description: 'Unsafe YAML load (no Loader specified)', name: 'yaml-unsafe-load', category: 'code_execution', appliesTo: ['code'] },
162
+ { pattern: /\bJSON\.parse\s*\(.*\bthen\b/, severity: 'low', description: 'JSON.parse in promise chain (may swallow errors)', name: 'json-parse-promise', category: 'code_execution', appliesTo: ['code'] },
163
+ ];
164
+ // ============================================================================
165
+ // Helper functions
166
+ // ============================================================================
167
+ /**
168
+ * Get all patterns applicable to a specific subsystem.
169
+ */
170
+ export function getPatternsFor(subsystem) {
171
+ return [
172
+ ...DANGEROUS_BASH_PATTERNS.filter(p => p.appliesTo.includes(subsystem)),
173
+ ...DANGEROUS_CODE_PATTERNS.filter(p => p.appliesTo.includes(subsystem)),
174
+ ];
175
+ }
176
+ /**
177
+ * Get patterns at or above a given severity level.
178
+ */
179
+ export function getPatternsBySeverity(minSeverity, patterns) {
180
+ const severityOrder = ['info', 'low', 'medium', 'high', 'critical'];
181
+ const minIndex = severityOrder.indexOf(minSeverity);
182
+ const source = patterns ?? [...DANGEROUS_BASH_PATTERNS, ...DANGEROUS_CODE_PATTERNS];
183
+ return source.filter(p => severityOrder.indexOf(p.severity) >= minIndex);
184
+ }
185
+ /**
186
+ * Get patterns by category.
187
+ */
188
+ export function getPatternsByCategory(category, patterns) {
189
+ const source = patterns ?? [...DANGEROUS_BASH_PATTERNS, ...DANGEROUS_CODE_PATTERNS];
190
+ return source.filter(p => p.category === category);
191
+ }
192
+ /**
193
+ * Check if a string matches any dangerous pattern for the given subsystem.
194
+ * Returns the first matching pattern or null.
195
+ */
196
+ export function matchDangerousPattern(text, subsystem) {
197
+ const patterns = getPatternsFor(subsystem);
198
+ for (const p of patterns) {
199
+ if (p.pattern.test(text)) {
200
+ return p;
201
+ }
202
+ }
203
+ return null;
204
+ }
205
+ /**
206
+ * Check if a string matches any dangerous patterns, returning all matches.
207
+ */
208
+ export function matchAllDangerousPatterns(text, subsystem) {
209
+ const patterns = getPatternsFor(subsystem);
210
+ return patterns.filter(p => p.pattern.test(text));
211
+ }
212
+ /**
213
+ * Check if a command name is in the dangerous commands set.
214
+ */
215
+ export function isDangerousCommand(commandName) {
216
+ return DANGEROUS_COMMANDS.has(commandName.toLowerCase());
217
+ }
218
+ //# sourceMappingURL=dangerous-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangerous-patterns.js","sourceRoot":"","sources":["../../src/security/dangerous-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Remote Approval Forwarding
3
+ *
4
+ * Forward tool execution approval requests to messaging channels
5
+ * (Telegram, Discord, Slack) for remote /approve or /deny.
6
+ * OpenClaw-inspired remote authorization flow.
7
+ */
8
+ import { EventEmitter } from 'events';
9
+ export interface ApprovalRequest {
10
+ /** Unique request ID */
11
+ id: string;
12
+ /** Tool name requiring approval */
13
+ toolName: string;
14
+ /** Human-readable summary of what's being approved */
15
+ summary: string;
16
+ /** When the request was created */
17
+ requestedAt: Date;
18
+ /** When the request expires */
19
+ expiresAt: Date;
20
+ /** Current status */
21
+ status: 'pending' | 'approved' | 'denied' | 'expired';
22
+ }
23
+ export type ChannelSendFn = (message: string) => Promise<void>;
24
+ export declare class RemoteApprovalService extends EventEmitter {
25
+ private pending;
26
+ private resolvers;
27
+ private channels;
28
+ private nextId;
29
+ private defaultTimeoutMs;
30
+ /**
31
+ * Register a messaging channel for forwarding approvals
32
+ */
33
+ registerChannel(channelType: string, sendFn: ChannelSendFn): void;
34
+ /**
35
+ * Unregister a channel
36
+ */
37
+ unregisterChannel(channelType: string): void;
38
+ /**
39
+ * Check if any channels are registered
40
+ */
41
+ hasChannels(): boolean;
42
+ /**
43
+ * Request approval via remote channels.
44
+ * Returns a promise that resolves to true (approved) or false (denied/expired).
45
+ */
46
+ requestApproval(req: {
47
+ toolName: string;
48
+ summary: string;
49
+ timeoutMs?: number;
50
+ }): Promise<boolean>;
51
+ /**
52
+ * Handle an approval response (called when user sends /approve or /deny)
53
+ */
54
+ handleResponse(requestId: string, approved: boolean): void;
55
+ /**
56
+ * Get all pending approval requests
57
+ */
58
+ getPending(): ApprovalRequest[];
59
+ /**
60
+ * Format the approval message for channels
61
+ */
62
+ private formatApprovalMessage;
63
+ }
64
+ export declare function getRemoteApprovalService(): RemoteApprovalService;
65
+ export declare function resetRemoteApprovalService(): void;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Remote Approval Forwarding
3
+ *
4
+ * Forward tool execution approval requests to messaging channels
5
+ * (Telegram, Discord, Slack) for remote /approve or /deny.
6
+ * OpenClaw-inspired remote authorization flow.
7
+ */
8
+ import { EventEmitter } from 'events';
9
+ import { logger } from '../utils/logger.js';
10
+ // ============================================================================
11
+ // Remote Approval Service
12
+ // ============================================================================
13
+ export class RemoteApprovalService extends EventEmitter {
14
+ pending = new Map();
15
+ resolvers = new Map();
16
+ channels = new Map();
17
+ nextId = 1;
18
+ defaultTimeoutMs = 120_000; // 2 minutes
19
+ /**
20
+ * Register a messaging channel for forwarding approvals
21
+ */
22
+ registerChannel(channelType, sendFn) {
23
+ this.channels.set(channelType, sendFn);
24
+ logger.debug(`Remote approval channel registered: ${channelType}`);
25
+ }
26
+ /**
27
+ * Unregister a channel
28
+ */
29
+ unregisterChannel(channelType) {
30
+ this.channels.delete(channelType);
31
+ }
32
+ /**
33
+ * Check if any channels are registered
34
+ */
35
+ hasChannels() {
36
+ return this.channels.size > 0;
37
+ }
38
+ /**
39
+ * Request approval via remote channels.
40
+ * Returns a promise that resolves to true (approved) or false (denied/expired).
41
+ */
42
+ async requestApproval(req) {
43
+ const id = `approval-${this.nextId++}`;
44
+ const timeoutMs = req.timeoutMs ?? this.defaultTimeoutMs;
45
+ const request = {
46
+ id,
47
+ toolName: req.toolName,
48
+ summary: req.summary,
49
+ requestedAt: new Date(),
50
+ expiresAt: new Date(Date.now() + timeoutMs),
51
+ status: 'pending',
52
+ };
53
+ this.pending.set(id, request);
54
+ // Broadcast to all registered channels
55
+ const message = this.formatApprovalMessage(request);
56
+ const sendPromises = Array.from(this.channels.entries()).map(async ([type, send]) => {
57
+ try {
58
+ await send(message);
59
+ }
60
+ catch (err) {
61
+ logger.warn(`Failed to send approval to ${type}`, { error: err });
62
+ }
63
+ });
64
+ await Promise.allSettled(sendPromises);
65
+ this.emit('approval-requested', request);
66
+ // Wait for response or timeout
67
+ return new Promise((resolve) => {
68
+ this.resolvers.set(id, resolve);
69
+ // Timeout handler
70
+ const timer = setTimeout(() => {
71
+ if (request.status === 'pending') {
72
+ request.status = 'expired';
73
+ this.resolvers.delete(id);
74
+ this.pending.delete(id);
75
+ this.emit('approval-expired', request);
76
+ resolve(false);
77
+ }
78
+ }, timeoutMs);
79
+ // Clean up timer if resolved early
80
+ const originalResolve = resolve;
81
+ this.resolvers.set(id, (approved) => {
82
+ clearTimeout(timer);
83
+ originalResolve(approved);
84
+ });
85
+ });
86
+ }
87
+ /**
88
+ * Handle an approval response (called when user sends /approve or /deny)
89
+ */
90
+ handleResponse(requestId, approved) {
91
+ const request = this.pending.get(requestId);
92
+ const resolver = this.resolvers.get(requestId);
93
+ if (!request || !resolver) {
94
+ logger.warn(`Unknown or expired approval request: ${requestId}`);
95
+ return;
96
+ }
97
+ request.status = approved ? 'approved' : 'denied';
98
+ this.pending.delete(requestId);
99
+ this.resolvers.delete(requestId);
100
+ this.emit(approved ? 'approval-approved' : 'approval-denied', request);
101
+ resolver(approved);
102
+ }
103
+ /**
104
+ * Get all pending approval requests
105
+ */
106
+ getPending() {
107
+ return Array.from(this.pending.values());
108
+ }
109
+ /**
110
+ * Format the approval message for channels
111
+ */
112
+ formatApprovalMessage(request) {
113
+ const expiresIn = Math.round((request.expiresAt.getTime() - Date.now()) / 1000);
114
+ return [
115
+ `🔐 **Approval Required**`,
116
+ `Tool: \`${request.toolName}\``,
117
+ `Summary: ${request.summary}`,
118
+ `Request ID: \`${request.id}\``,
119
+ `Expires in: ${expiresIn}s`,
120
+ ``,
121
+ `Reply with \`/approve ${request.id}\` or \`/deny ${request.id}\``,
122
+ ].join('\n');
123
+ }
124
+ }
125
+ // ============================================================================
126
+ // Singleton
127
+ // ============================================================================
128
+ let remoteApprovalInstance = null;
129
+ export function getRemoteApprovalService() {
130
+ if (!remoteApprovalInstance) {
131
+ remoteApprovalInstance = new RemoteApprovalService();
132
+ }
133
+ return remoteApprovalInstance;
134
+ }
135
+ export function resetRemoteApprovalService() {
136
+ remoteApprovalInstance = null;
137
+ }
138
+ //# sourceMappingURL=remote-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-approval.js","sourceRoot":"","sources":["../../src/security/remote-approval.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,13 @@ export declare class SecurityAuditor {
70
70
  private checkNetwork;
71
71
  private checkBrowser;
72
72
  private deepScan;
73
+ /**
74
+ * Auto-fix file permission findings (chmod 700/600 for sensitive paths)
75
+ */
76
+ fix(result: AuditResult): Promise<{
77
+ fixed: number;
78
+ errors: string[];
79
+ }>;
73
80
  private addFinding;
74
81
  /**
75
82
  * Format audit result for console output
@@ -546,6 +546,29 @@ export class SecurityAuditor {
546
546
  // ==========================================================================
547
547
  // Helpers
548
548
  // ==========================================================================
549
+ /**
550
+ * Auto-fix file permission findings (chmod 700/600 for sensitive paths)
551
+ */
552
+ async fix(result) {
553
+ let fixed = 0;
554
+ const errors = [];
555
+ for (const finding of result.findings) {
556
+ if ((finding.category === 'filesystem' || finding.category === 'credentials') &&
557
+ finding.details?.path &&
558
+ typeof finding.details.path === 'string' &&
559
+ finding.details.expected) {
560
+ try {
561
+ const targetMode = parseInt(finding.details.expected, 8);
562
+ await fs.chmod(finding.details.path, targetMode);
563
+ fixed++;
564
+ }
565
+ catch (err) {
566
+ errors.push(`Failed to fix ${finding.details.path}: ${err instanceof Error ? err.message : String(err)}`);
567
+ }
568
+ }
569
+ }
570
+ return { fixed, errors };
571
+ }
549
572
  addFinding(finding) {
550
573
  this.findings.push({
551
574
  ...finding,