@phuetz/code-buddy 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -13
- package/dist/agent/architect-mode.d.ts +11 -0
- package/dist/agent/architect-mode.js +133 -25
- package/dist/agent/architect-mode.js.map +1 -1
- package/dist/agent/codebuddy-agent.d.ts +24 -0
- package/dist/agent/codebuddy-agent.js +118 -16
- package/dist/agent/codebuddy-agent.js.map +1 -1
- package/dist/agent/execution/agent-executor.d.ts +9 -0
- package/dist/agent/execution/agent-executor.js +61 -0
- package/dist/agent/execution/agent-executor.js.map +1 -1
- package/dist/agent/message-queue.d.ts +77 -0
- package/dist/agent/message-queue.js +116 -0
- package/dist/agent/message-queue.js.map +1 -0
- package/dist/agent/middleware/auto-observation.d.ts +37 -0
- package/dist/agent/middleware/auto-observation.js +231 -0
- package/dist/agent/middleware/auto-observation.js.map +1 -0
- package/dist/agent/middleware/index.d.ts +2 -0
- package/dist/agent/middleware/index.js +1 -0
- package/dist/agent/middleware/index.js.map +1 -1
- package/dist/agent/tool-handler.js +3 -2
- package/dist/agent/tool-handler.js.map +1 -1
- package/dist/agent/types.d.ts +7 -2
- package/dist/analytics/budget-alerts.d.ts +81 -0
- package/dist/analytics/budget-alerts.js +126 -0
- package/dist/analytics/budget-alerts.js.map +1 -0
- package/dist/analytics/cost-predictor.d.ts +79 -0
- package/dist/analytics/cost-predictor.js +150 -0
- package/dist/analytics/cost-predictor.js.map +1 -0
- package/dist/analytics/index.d.ts +2 -0
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/auth/profile-manager.d.ts +205 -0
- package/dist/auth/profile-manager.js +484 -0
- package/dist/auth/profile-manager.js.map +1 -0
- package/dist/browser-automation/browser-manager.d.ts +79 -1
- package/dist/browser-automation/browser-manager.js +265 -2
- package/dist/browser-automation/browser-manager.js.map +1 -1
- package/dist/browser-automation/profile-manager.d.ts +32 -0
- package/dist/browser-automation/profile-manager.js +83 -0
- package/dist/browser-automation/profile-manager.js.map +1 -0
- package/dist/browser-automation/route-interceptor.d.ts +29 -0
- package/dist/browser-automation/route-interceptor.js +103 -0
- package/dist/browser-automation/route-interceptor.js.map +1 -0
- package/dist/browser-automation/screenshot-annotator.d.ts +23 -0
- package/dist/browser-automation/screenshot-annotator.js +86 -0
- package/dist/browser-automation/screenshot-annotator.js.map +1 -0
- package/dist/browser-automation/types.d.ts +47 -0
- package/dist/channels/discord/client.d.ts +2 -1
- package/dist/channels/discord/client.js +28 -16
- package/dist/channels/discord/client.js.map +1 -1
- package/dist/channels/google-chat/index.d.ts +210 -0
- package/dist/channels/google-chat/index.js +505 -0
- package/dist/channels/google-chat/index.js.map +1 -0
- package/dist/channels/group-security.d.ts +182 -0
- package/dist/channels/group-security.js +407 -0
- package/dist/channels/group-security.js.map +1 -0
- package/dist/channels/index.d.ts +17 -1
- package/dist/channels/index.js +16 -0
- package/dist/channels/index.js.map +1 -1
- package/dist/channels/matrix/index.d.ts +181 -0
- package/dist/channels/matrix/index.js +643 -0
- package/dist/channels/matrix/index.js.map +1 -0
- package/dist/channels/offline-queue.d.ts +92 -0
- package/dist/channels/offline-queue.js +112 -0
- package/dist/channels/offline-queue.js.map +1 -0
- package/dist/channels/reconnection-manager.d.ts +117 -0
- package/dist/channels/reconnection-manager.js +171 -0
- package/dist/channels/reconnection-manager.js.map +1 -0
- package/dist/channels/signal/index.d.ts +184 -0
- package/dist/channels/signal/index.js +488 -0
- package/dist/channels/signal/index.js.map +1 -0
- package/dist/channels/slack/client.d.ts +2 -1
- package/dist/channels/slack/client.js +30 -20
- package/dist/channels/slack/client.js.map +1 -1
- package/dist/channels/teams/index.d.ts +196 -0
- package/dist/channels/teams/index.js +477 -0
- package/dist/channels/teams/index.js.map +1 -0
- package/dist/channels/telegram/client.d.ts +3 -1
- package/dist/channels/telegram/client.js +29 -2
- package/dist/channels/telegram/client.js.map +1 -1
- package/dist/channels/webchat/index.d.ts +103 -0
- package/dist/channels/webchat/index.js +697 -0
- package/dist/channels/webchat/index.js.map +1 -0
- package/dist/channels/whatsapp/index.d.ts +105 -0
- package/dist/channels/whatsapp/index.js +533 -0
- package/dist/channels/whatsapp/index.js.map +1 -0
- package/dist/codebuddy/client.js +6 -3
- package/dist/codebuddy/client.js.map +1 -1
- package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +1 -0
- package/dist/codebuddy/tool-definitions/advanced-tools.js +103 -3
- package/dist/codebuddy/tool-definitions/advanced-tools.js.map +1 -1
- package/dist/codebuddy/tool-definitions/index.d.ts +1 -1
- package/dist/codebuddy/tool-definitions/index.js +1 -1
- package/dist/codebuddy/tool-definitions/index.js.map +1 -1
- package/dist/codebuddy/tools.js +3 -1
- package/dist/codebuddy/tools.js.map +1 -1
- package/dist/commands/cli/config-command.d.ts +8 -0
- package/dist/commands/cli/config-command.js +90 -0
- package/dist/commands/cli/config-command.js.map +1 -0
- package/dist/commands/cli/openclaw-commands.d.ts +12 -0
- package/dist/commands/cli/openclaw-commands.js +446 -0
- package/dist/commands/cli/openclaw-commands.js.map +1 -0
- package/dist/commands/cli/utility-commands.js +30 -0
- package/dist/commands/cli/utility-commands.js.map +1 -1
- package/dist/commands/client-dispatcher.js +22 -2
- package/dist/commands/client-dispatcher.js.map +1 -1
- package/dist/commands/enhanced-command-handler.js +21 -2
- package/dist/commands/enhanced-command-handler.js.map +1 -1
- package/dist/commands/handlers/extra-handlers.d.ts +30 -0
- package/dist/commands/handlers/extra-handlers.js +547 -0
- package/dist/commands/handlers/extra-handlers.js.map +1 -0
- package/dist/commands/handlers/index.d.ts +1 -0
- package/dist/commands/handlers/index.js +2 -0
- package/dist/commands/handlers/index.js.map +1 -1
- package/dist/commands/slash/builtin-commands.js +41 -34
- package/dist/commands/slash/builtin-commands.js.map +1 -1
- package/dist/config/env-schema.d.ts +58 -0
- package/dist/config/env-schema.js +789 -0
- package/dist/config/env-schema.js.map +1 -0
- package/dist/config/feature-flags.js +2 -1
- package/dist/config/feature-flags.js.map +1 -1
- package/dist/context/bootstrap-loader.d.ts +48 -0
- package/dist/context/bootstrap-loader.js +123 -0
- package/dist/context/bootstrap-loader.js.map +1 -0
- package/dist/copilot/copilot-proxy.d.ts +15 -1
- package/dist/copilot/copilot-proxy.js +81 -22
- package/dist/copilot/copilot-proxy.js.map +1 -1
- package/dist/daemon/heartbeat.d.ts +112 -0
- package/dist/daemon/heartbeat.js +339 -0
- package/dist/daemon/heartbeat.js.map +1 -0
- package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
- package/dist/desktop-automation/smart-snapshot.js +28 -0
- package/dist/desktop-automation/smart-snapshot.js.map +1 -1
- package/dist/identity/identity-manager.d.ts +95 -0
- package/dist/identity/identity-manager.js +242 -0
- package/dist/identity/identity-manager.js.map +1 -0
- package/dist/index.js +147 -17
- package/dist/index.js.map +1 -1
- package/dist/integrations/github-integration.js +1 -1
- package/dist/integrations/github-integration.js.map +1 -1
- package/dist/persistence/conversation-branches.js +2 -1
- package/dist/persistence/conversation-branches.js.map +1 -1
- package/dist/persistence/session-store.d.ts +1 -1
- package/dist/persistence/session-store.js +1 -1
- package/dist/persistence/session-store.js.map +1 -1
- package/dist/sandbox/auto-sandbox.d.ts +59 -0
- package/dist/sandbox/auto-sandbox.js +145 -0
- package/dist/sandbox/auto-sandbox.js.map +1 -0
- package/dist/security/audit-logger.d.ts +127 -0
- package/dist/security/audit-logger.js +194 -0
- package/dist/security/audit-logger.js.map +1 -0
- package/dist/security/bash-allowlist/allowlist-store.js +3 -2
- package/dist/security/bash-allowlist/allowlist-store.js.map +1 -1
- package/dist/security/bash-parser.js +0 -2
- package/dist/security/bash-parser.js.map +1 -1
- package/dist/security/code-validator.d.ts +51 -0
- package/dist/security/code-validator.js +185 -0
- package/dist/security/code-validator.js.map +1 -0
- package/dist/security/dangerous-patterns.d.ts +68 -0
- package/dist/security/dangerous-patterns.js +218 -0
- package/dist/security/dangerous-patterns.js.map +1 -0
- package/dist/security/remote-approval.d.ts +65 -0
- package/dist/security/remote-approval.js +138 -0
- package/dist/security/remote-approval.js.map +1 -0
- package/dist/security/security-audit.d.ts +7 -0
- package/dist/security/security-audit.js +23 -0
- package/dist/security/security-audit.js.map +1 -1
- package/dist/security/syntax-validator.d.ts +17 -0
- package/dist/security/syntax-validator.js +292 -0
- package/dist/security/syntax-validator.js.map +1 -0
- package/dist/server/index.js +277 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/prompt-builder.js +16 -0
- package/dist/services/prompt-builder.js.map +1 -1
- package/dist/skills/hub.d.ts +231 -0
- package/dist/skills/hub.js +694 -0
- package/dist/skills/hub.js.map +1 -0
- package/dist/skills/skill-loader.js +1 -1
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/skills/skill-manager.js +2 -1
- package/dist/skills/skill-manager.js.map +1 -1
- package/dist/tools/apply-patch.d.ts +1 -0
- package/dist/tools/apply-patch.js +57 -10
- package/dist/tools/apply-patch.js.map +1 -1
- package/dist/tools/bash/bash-tool.d.ts +123 -0
- package/dist/tools/bash/bash-tool.js +549 -0
- package/dist/tools/bash/bash-tool.js.map +1 -0
- package/dist/tools/bash/command-validator.d.ts +49 -0
- package/dist/tools/bash/command-validator.js +223 -0
- package/dist/tools/bash/command-validator.js.map +1 -0
- package/dist/tools/bash/index.d.ts +7 -0
- package/dist/tools/bash/index.js +8 -0
- package/dist/tools/bash/index.js.map +1 -0
- package/dist/tools/bash/security-patterns.d.ts +44 -0
- package/dist/tools/bash/security-patterns.js +234 -0
- package/dist/tools/bash/security-patterns.js.map +1 -0
- package/dist/tools/bash/streaming-executor.d.ts +23 -0
- package/dist/tools/bash/streaming-executor.js +134 -0
- package/dist/tools/bash/streaming-executor.js.map +1 -0
- package/dist/tools/code-formatter.js +41 -27
- package/dist/tools/code-formatter.js.map +1 -1
- package/dist/tools/code-review.js +1 -1
- package/dist/tools/code-review.js.map +1 -1
- package/dist/tools/computer-control-tool.js +21 -0
- package/dist/tools/computer-control-tool.js.map +1 -1
- package/dist/tools/document-tool.js +3 -2
- package/dist/tools/document-tool.js.map +1 -1
- package/dist/tools/git-tool.d.ts +45 -0
- package/dist/tools/git-tool.js +222 -0
- package/dist/tools/git-tool.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/multi-edit.js +31 -3
- package/dist/tools/multi-edit.js.map +1 -1
- package/dist/tools/process-tool.d.ts +69 -0
- package/dist/tools/process-tool.js +222 -0
- package/dist/tools/process-tool.js.map +1 -0
- package/dist/tools/registry/git-tools.d.ts +32 -0
- package/dist/tools/registry/git-tools.js +211 -0
- package/dist/tools/registry/git-tools.js.map +1 -0
- package/dist/tools/registry/index.d.ts +2 -0
- package/dist/tools/registry/index.js +8 -0
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/registry/misc-tools.d.ts +32 -4
- package/dist/tools/registry/misc-tools.js +230 -90
- package/dist/tools/registry/misc-tools.js.map +1 -1
- package/dist/tools/registry/process-tools.d.ts +20 -0
- package/dist/tools/registry/process-tools.js +141 -0
- package/dist/tools/registry/process-tools.js.map +1 -0
- package/dist/tools/registry/types.d.ts +2 -0
- package/dist/ui/components/ChatInterface.js +9 -0
- package/dist/ui/components/ChatInterface.js.map +1 -1
- package/dist/utils/autonomy-manager.js +3 -2
- package/dist/utils/autonomy-manager.js.map +1 -1
- package/dist/utils/config-validation/schema.d.ts +15 -15
- package/dist/utils/confirmation-service.d.ts +16 -0
- package/dist/utils/confirmation-service.js +37 -3
- package/dist/utils/confirmation-service.js.map +1 -1
- package/dist/utils/custom-instructions.js +2 -1
- package/dist/utils/custom-instructions.js.map +1 -1
- package/dist/utils/graceful-shutdown.js +9 -9
- package/dist/utils/graceful-shutdown.js.map +1 -1
- package/dist/utils/head-tail-truncation.d.ts +18 -0
- package/dist/utils/head-tail-truncation.js +127 -0
- package/dist/utils/head-tail-truncation.js.map +1 -1
- package/dist/utils/history-manager.js +3 -2
- package/dist/utils/history-manager.js.map +1 -1
- package/dist/utils/performance.js +16 -15
- package/dist/utils/performance.js.map +1 -1
- package/dist/utils/update-notifier.js +2 -1
- package/dist/utils/update-notifier.js.map +1 -1
- package/dist/workflows/pipeline.d.ts +54 -1
- package/dist/workflows/pipeline.js +128 -7
- package/dist/workflows/pipeline.js.map +1 -1
- package/dist/workflows/step-manager.js +2 -1
- package/dist/workflows/step-manager.js.map +1 -1
- 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,
|