mstro-app 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/mstro.js +119 -40
- package/dist/server/cli/headless/claude-invoker-process.d.ts +11 -0
- package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-process.js +140 -0
- package/dist/server/cli/headless/claude-invoker-process.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stall.d.ts +40 -0
- package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stall.js +98 -0
- package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stream.d.ts +44 -0
- package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-stream.js +276 -0
- package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker-tools.d.ts +21 -0
- package/dist/server/cli/headless/claude-invoker-tools.d.ts.map +1 -0
- package/dist/server/cli/headless/claude-invoker-tools.js +137 -0
- package/dist/server/cli/headless/claude-invoker-tools.js.map +1 -0
- package/dist/server/cli/headless/claude-invoker.d.ts +6 -4
- package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +10 -804
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/haiku-assessments.d.ts +62 -0
- package/dist/server/cli/headless/haiku-assessments.d.ts.map +1 -0
- package/dist/server/cli/headless/haiku-assessments.js +281 -0
- package/dist/server/cli/headless/haiku-assessments.js.map +1 -0
- package/dist/server/cli/headless/headless-logger.d.ts +3 -2
- package/dist/server/cli/headless/headless-logger.d.ts.map +1 -1
- package/dist/server/cli/headless/headless-logger.js +28 -5
- package/dist/server/cli/headless/headless-logger.js.map +1 -1
- package/dist/server/cli/headless/native-timeout-detector.d.ts +44 -0
- package/dist/server/cli/headless/native-timeout-detector.d.ts.map +1 -0
- package/dist/server/cli/headless/native-timeout-detector.js +99 -0
- package/dist/server/cli/headless/native-timeout-detector.js.map +1 -0
- package/dist/server/cli/headless/stall-assessor.d.ts +2 -110
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +65 -457
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/headless/types.d.ts +4 -1
- package/dist/server/cli/headless/types.d.ts.map +1 -1
- package/dist/server/cli/improvisation-attachments.d.ts +21 -0
- package/dist/server/cli/improvisation-attachments.d.ts.map +1 -0
- package/dist/server/cli/improvisation-attachments.js +116 -0
- package/dist/server/cli/improvisation-attachments.js.map +1 -0
- package/dist/server/cli/improvisation-retry.d.ts +52 -0
- package/dist/server/cli/improvisation-retry.d.ts.map +1 -0
- package/dist/server/cli/improvisation-retry.js +434 -0
- package/dist/server/cli/improvisation-retry.js.map +1 -0
- package/dist/server/cli/improvisation-session-manager.d.ts +10 -266
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +117 -1079
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/improvisation-types.d.ts +86 -0
- package/dist/server/cli/improvisation-types.d.ts.map +1 -0
- package/dist/server/cli/improvisation-types.js +10 -0
- package/dist/server/cli/improvisation-types.js.map +1 -0
- package/dist/server/cli/prompt-builders.d.ts +68 -0
- package/dist/server/cli/prompt-builders.d.ts.map +1 -0
- package/dist/server/cli/prompt-builders.js +312 -0
- package/dist/server/cli/prompt-builders.js.map +1 -0
- package/dist/server/index.js +33 -212
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-haiku.d.ts +10 -0
- package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -0
- package/dist/server/mcp/bouncer-haiku.js +152 -0
- package/dist/server/mcp/bouncer-haiku.js.map +1 -0
- package/dist/server/mcp/bouncer-integration.d.ts +3 -4
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +50 -196
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/security-analysis.d.ts +38 -0
- package/dist/server/mcp/security-analysis.d.ts.map +1 -0
- package/dist/server/mcp/security-analysis.js +183 -0
- package/dist/server/mcp/security-analysis.js.map +1 -0
- package/dist/server/mcp/security-audit.d.ts +1 -1
- package/dist/server/mcp/security-audit.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.d.ts +1 -25
- package/dist/server/mcp/security-patterns.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.js +55 -260
- package/dist/server/mcp/security-patterns.js.map +1 -1
- package/dist/server/server-setup.d.ts +22 -0
- package/dist/server/server-setup.d.ts.map +1 -0
- package/dist/server/server-setup.js +101 -0
- package/dist/server/server-setup.js.map +1 -0
- package/dist/server/services/file-explorer-ops.d.ts +24 -0
- package/dist/server/services/file-explorer-ops.d.ts.map +1 -0
- package/dist/server/services/file-explorer-ops.js +211 -0
- package/dist/server/services/file-explorer-ops.js.map +1 -0
- package/dist/server/services/files.d.ts +2 -85
- package/dist/server/services/files.d.ts.map +1 -1
- package/dist/server/services/files.js +7 -427
- package/dist/server/services/files.js.map +1 -1
- package/dist/server/services/plan/composer.d.ts +1 -1
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +118 -32
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/config-installer.d.ts +25 -0
- package/dist/server/services/plan/config-installer.d.ts.map +1 -0
- package/dist/server/services/plan/config-installer.js +182 -0
- package/dist/server/services/plan/config-installer.js.map +1 -0
- package/dist/server/services/plan/dependency-resolver.d.ts +1 -1
- package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -1
- package/dist/server/services/plan/dependency-resolver.js +4 -1
- package/dist/server/services/plan/dependency-resolver.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts +38 -74
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +274 -460
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/front-matter.d.ts +18 -0
- package/dist/server/services/plan/front-matter.d.ts.map +1 -0
- package/dist/server/services/plan/front-matter.js +44 -0
- package/dist/server/services/plan/front-matter.js.map +1 -0
- package/dist/server/services/plan/output-manager.d.ts +22 -0
- package/dist/server/services/plan/output-manager.d.ts.map +1 -0
- package/dist/server/services/plan/output-manager.js +97 -0
- package/dist/server/services/plan/output-manager.js.map +1 -0
- package/dist/server/services/plan/parser-core.d.ts +20 -0
- package/dist/server/services/plan/parser-core.d.ts.map +1 -0
- package/dist/server/services/plan/parser-core.js +350 -0
- package/dist/server/services/plan/parser-core.js.map +1 -0
- package/dist/server/services/plan/parser-migration.d.ts +5 -0
- package/dist/server/services/plan/parser-migration.d.ts.map +1 -0
- package/dist/server/services/plan/parser-migration.js +124 -0
- package/dist/server/services/plan/parser-migration.js.map +1 -0
- package/dist/server/services/plan/parser.d.ts +11 -3
- package/dist/server/services/plan/parser.d.ts.map +1 -1
- package/dist/server/services/plan/parser.js +184 -369
- package/dist/server/services/plan/parser.js.map +1 -1
- package/dist/server/services/plan/prompt-builder.d.ts +17 -0
- package/dist/server/services/plan/prompt-builder.d.ts.map +1 -0
- package/dist/server/services/plan/prompt-builder.js +137 -0
- package/dist/server/services/plan/prompt-builder.js.map +1 -0
- package/dist/server/services/plan/review-gate.d.ts +28 -0
- package/dist/server/services/plan/review-gate.d.ts.map +1 -0
- package/dist/server/services/plan/review-gate.js +191 -0
- package/dist/server/services/plan/review-gate.js.map +1 -0
- package/dist/server/services/plan/state-reconciler.d.ts +1 -1
- package/dist/server/services/plan/state-reconciler.d.ts.map +1 -1
- package/dist/server/services/plan/state-reconciler.js +59 -7
- package/dist/server/services/plan/state-reconciler.js.map +1 -1
- package/dist/server/services/plan/types.d.ts +68 -0
- package/dist/server/services/plan/types.d.ts.map +1 -1
- package/dist/server/services/platform-credentials.d.ts +24 -0
- package/dist/server/services/platform-credentials.d.ts.map +1 -0
- package/dist/server/services/platform-credentials.js +68 -0
- package/dist/server/services/platform-credentials.js.map +1 -0
- package/dist/server/services/platform.d.ts +1 -31
- package/dist/server/services/platform.d.ts.map +1 -1
- package/dist/server/services/platform.js +11 -109
- package/dist/server/services/platform.js.map +1 -1
- package/dist/server/services/terminal/pty-manager.d.ts +7 -97
- package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
- package/dist/server/services/terminal/pty-manager.js +53 -266
- package/dist/server/services/terminal/pty-manager.js.map +1 -1
- package/dist/server/services/terminal/pty-utils.d.ts +57 -0
- package/dist/server/services/terminal/pty-utils.d.ts.map +1 -0
- package/dist/server/services/terminal/pty-utils.js +141 -0
- package/dist/server/services/terminal/pty-utils.js.map +1 -0
- package/dist/server/services/websocket/file-definition-handlers.d.ts +4 -0
- package/dist/server/services/websocket/file-definition-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/file-definition-handlers.js +153 -0
- package/dist/server/services/websocket/file-definition-handlers.js.map +1 -0
- package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/file-explorer-handlers.js +52 -391
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
- package/dist/server/services/websocket/file-search-handlers.d.ts +5 -0
- package/dist/server/services/websocket/file-search-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/file-search-handlers.js +238 -0
- package/dist/server/services/websocket/file-search-handlers.js.map +1 -0
- package/dist/server/services/websocket/file-utils.js +3 -3
- package/dist/server/services/websocket/file-utils.js.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.d.ts +7 -0
- package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-branch-handlers.js +110 -0
- package/dist/server/services/websocket/git-branch-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-diff-handlers.d.ts +6 -0
- package/dist/server/services/websocket/git-diff-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-diff-handlers.js +123 -0
- package/dist/server/services/websocket/git-diff-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-handlers.d.ts +2 -31
- package/dist/server/services/websocket/git-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-handlers.js +35 -541
- package/dist/server/services/websocket/git-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-log-handlers.d.ts +6 -0
- package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-log-handlers.js +128 -0
- package/dist/server/services/websocket/git-log-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-pr-handlers.js +13 -53
- package/dist/server/services/websocket/git-pr-handlers.js.map +1 -1
- package/dist/server/services/websocket/git-tag-handlers.d.ts +6 -0
- package/dist/server/services/websocket/git-tag-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/git-tag-handlers.js +76 -0
- package/dist/server/services/websocket/git-tag-handlers.js.map +1 -0
- package/dist/server/services/websocket/git-utils.d.ts +43 -0
- package/dist/server/services/websocket/git-utils.d.ts.map +1 -0
- package/dist/server/services/websocket/git-utils.js +201 -0
- package/dist/server/services/websocket/git-utils.js.map +1 -0
- package/dist/server/services/websocket/handler.d.ts +2 -0
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +37 -112
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/plan-board-handlers.d.ts +11 -0
- package/dist/server/services/websocket/plan-board-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-board-handlers.js +218 -0
- package/dist/server/services/websocket/plan-board-handlers.js.map +1 -0
- package/dist/server/services/websocket/plan-execution-handlers.d.ts +9 -0
- package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-execution-handlers.js +142 -0
- package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -0
- package/dist/server/services/websocket/plan-handlers.d.ts +7 -2
- package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/plan-handlers.js +21 -462
- package/dist/server/services/websocket/plan-handlers.js.map +1 -1
- package/dist/server/services/websocket/plan-helpers.d.ts +19 -0
- package/dist/server/services/websocket/plan-helpers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-helpers.js +199 -0
- package/dist/server/services/websocket/plan-helpers.js.map +1 -0
- package/dist/server/services/websocket/plan-issue-handlers.d.ts +12 -0
- package/dist/server/services/websocket/plan-issue-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-issue-handlers.js +162 -0
- package/dist/server/services/websocket/plan-issue-handlers.js.map +1 -0
- package/dist/server/services/websocket/plan-sprint-handlers.d.ts +7 -0
- package/dist/server/services/websocket/plan-sprint-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-sprint-handlers.js +206 -0
- package/dist/server/services/websocket/plan-sprint-handlers.js.map +1 -0
- package/dist/server/services/websocket/quality-complexity.d.ts +14 -0
- package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-complexity.js +262 -0
- package/dist/server/services/websocket/quality-complexity.js.map +1 -0
- package/dist/server/services/websocket/quality-fix-agent.d.ts +16 -0
- package/dist/server/services/websocket/quality-fix-agent.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-fix-agent.js +140 -0
- package/dist/server/services/websocket/quality-fix-agent.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-handlers.js +34 -346
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-linting.d.ts +9 -0
- package/dist/server/services/websocket/quality-linting.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-linting.js +178 -0
- package/dist/server/services/websocket/quality-linting.js.map +1 -0
- package/dist/server/services/websocket/quality-review-agent.d.ts +19 -0
- package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-review-agent.js +206 -0
- package/dist/server/services/websocket/quality-review-agent.js.map +1 -0
- package/dist/server/services/websocket/quality-service.d.ts +3 -51
- package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-service.js +9 -651
- package/dist/server/services/websocket/quality-service.js.map +1 -1
- package/dist/server/services/websocket/quality-tools.d.ts +23 -0
- package/dist/server/services/websocket/quality-tools.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-tools.js +208 -0
- package/dist/server/services/websocket/quality-tools.js.map +1 -0
- package/dist/server/services/websocket/quality-types.d.ts +59 -0
- package/dist/server/services/websocket/quality-types.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-types.js +101 -0
- package/dist/server/services/websocket/quality-types.js.map +1 -0
- package/dist/server/services/websocket/session-handlers.d.ts +3 -4
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +3 -378
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-history.d.ts +4 -0
- package/dist/server/services/websocket/session-history.d.ts.map +1 -0
- package/dist/server/services/websocket/session-history.js +208 -0
- package/dist/server/services/websocket/session-history.js.map +1 -0
- package/dist/server/services/websocket/session-initialization.d.ts +5 -0
- package/dist/server/services/websocket/session-initialization.d.ts.map +1 -0
- package/dist/server/services/websocket/session-initialization.js +163 -0
- package/dist/server/services/websocket/session-initialization.js.map +1 -0
- package/dist/server/services/websocket/types.d.ts +12 -2
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/package.json +1 -2
- package/server/cli/headless/claude-invoker-process.ts +204 -0
- package/server/cli/headless/claude-invoker-stall.ts +164 -0
- package/server/cli/headless/claude-invoker-stream.ts +353 -0
- package/server/cli/headless/claude-invoker-tools.ts +187 -0
- package/server/cli/headless/claude-invoker.ts +15 -1092
- package/server/cli/headless/haiku-assessments.ts +365 -0
- package/server/cli/headless/headless-logger.ts +26 -5
- package/server/cli/headless/native-timeout-detector.ts +117 -0
- package/server/cli/headless/stall-assessor.ts +65 -618
- package/server/cli/headless/types.ts +4 -1
- package/server/cli/improvisation-attachments.ts +148 -0
- package/server/cli/improvisation-retry.ts +602 -0
- package/server/cli/improvisation-session-manager.ts +140 -1349
- package/server/cli/improvisation-types.ts +98 -0
- package/server/cli/prompt-builders.ts +370 -0
- package/server/index.ts +35 -246
- package/server/mcp/bouncer-haiku.ts +182 -0
- package/server/mcp/bouncer-integration.ts +87 -248
- package/server/mcp/security-analysis.ts +217 -0
- package/server/mcp/security-audit.ts +1 -1
- package/server/mcp/security-patterns.ts +60 -283
- package/server/server-setup.ts +114 -0
- package/server/services/file-explorer-ops.ts +293 -0
- package/server/services/files.ts +20 -532
- package/server/services/plan/composer.ts +140 -35
- package/server/services/plan/config-installer.ts +187 -0
- package/server/services/plan/dependency-resolver.ts +4 -1
- package/server/services/plan/executor.ts +281 -488
- package/server/services/plan/front-matter.ts +48 -0
- package/server/services/plan/output-manager.ts +113 -0
- package/server/services/plan/parser-core.ts +406 -0
- package/server/services/plan/parser-migration.ts +128 -0
- package/server/services/plan/parser.ts +188 -394
- package/server/services/plan/prompt-builder.ts +161 -0
- package/server/services/plan/review-gate.ts +212 -0
- package/server/services/plan/state-reconciler.ts +68 -7
- package/server/services/plan/types.ts +101 -1
- package/server/services/platform-credentials.ts +83 -0
- package/server/services/platform.ts +16 -131
- package/server/services/terminal/pty-manager.ts +66 -313
- package/server/services/terminal/pty-utils.ts +176 -0
- package/server/services/websocket/file-definition-handlers.ts +165 -0
- package/server/services/websocket/file-explorer-handlers.ts +37 -452
- package/server/services/websocket/file-search-handlers.ts +291 -0
- package/server/services/websocket/file-utils.ts +3 -3
- package/server/services/websocket/git-branch-handlers.ts +130 -0
- package/server/services/websocket/git-diff-handlers.ts +140 -0
- package/server/services/websocket/git-handlers.ts +40 -625
- package/server/services/websocket/git-log-handlers.ts +149 -0
- package/server/services/websocket/git-pr-handlers.ts +17 -62
- package/server/services/websocket/git-tag-handlers.ts +91 -0
- package/server/services/websocket/git-utils.ts +230 -0
- package/server/services/websocket/handler.ts +39 -112
- package/server/services/websocket/plan-board-handlers.ts +277 -0
- package/server/services/websocket/plan-execution-handlers.ts +184 -0
- package/server/services/websocket/plan-handlers.ts +23 -544
- package/server/services/websocket/plan-helpers.ts +215 -0
- package/server/services/websocket/plan-issue-handlers.ts +204 -0
- package/server/services/websocket/plan-sprint-handlers.ts +252 -0
- package/server/services/websocket/quality-complexity.ts +294 -0
- package/server/services/websocket/quality-fix-agent.ts +181 -0
- package/server/services/websocket/quality-handlers.ts +36 -404
- package/server/services/websocket/quality-linting.ts +187 -0
- package/server/services/websocket/quality-review-agent.ts +246 -0
- package/server/services/websocket/quality-service.ts +11 -762
- package/server/services/websocket/quality-tools.ts +209 -0
- package/server/services/websocket/quality-types.ts +169 -0
- package/server/services/websocket/session-handlers.ts +5 -437
- package/server/services/websocket/session-history.ts +222 -0
- package/server/services/websocket/session-initialization.ts +209 -0
- package/server/services/websocket/types.ts +46 -2
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { classifyRisk, isSensitivePath, requiresAIReview } from './security-analysis.js';
|
|
1
2
|
export interface SecurityPattern {
|
|
2
3
|
pattern: RegExp;
|
|
3
4
|
reason?: string;
|
|
@@ -27,11 +28,6 @@ export declare const SAFE_OPERATIONS: SecurityPattern[];
|
|
|
27
28
|
/**
|
|
28
29
|
* Patterns that trigger AI context review
|
|
29
30
|
* These operations need context analysis to determine if they align with user intent
|
|
30
|
-
*
|
|
31
|
-
* The AI should consider:
|
|
32
|
-
* 1. Did the user explicitly request this operation?
|
|
33
|
-
* 2. Does it make sense given the task at hand?
|
|
34
|
-
* 3. Is the content/action appropriate for the target?
|
|
35
31
|
*/
|
|
36
32
|
export declare const NEEDS_AI_REVIEW: SecurityPattern[];
|
|
37
33
|
/**
|
|
@@ -44,24 +40,4 @@ export declare function matchesPattern(operation: string, patterns: SecurityPatt
|
|
|
44
40
|
* from matching safe home-directory patterns.
|
|
45
41
|
*/
|
|
46
42
|
export declare function normalizeOperation(operation: string): string;
|
|
47
|
-
export declare function requiresAIReview(operation: string): boolean;
|
|
48
|
-
/**
|
|
49
|
-
* Check if operation targets a sensitive path
|
|
50
|
-
* Used to provide additional context to AI reviewer
|
|
51
|
-
*/
|
|
52
|
-
export declare function isSensitivePath(operation: string): SecurityPattern | null;
|
|
53
|
-
/**
|
|
54
|
-
* Classify operation risk level for context-aware review
|
|
55
|
-
*
|
|
56
|
-
* Risk levels indicate how much scrutiny the AI should apply:
|
|
57
|
-
* - critical: Catastrophic if wrong (rm -rf /, fork bombs) - auto-deny
|
|
58
|
-
* - high: Needs clear user intent (sudo, sensitive paths, credentials)
|
|
59
|
-
* - medium: Normal file operations - verify matches user request
|
|
60
|
-
* - low: Safe operations - minimal review needed
|
|
61
|
-
*/
|
|
62
|
-
export declare function classifyRisk(operation: string): {
|
|
63
|
-
isDestructive: boolean;
|
|
64
|
-
riskLevel: 'low' | 'medium' | 'high' | 'critical';
|
|
65
|
-
reasons: string[];
|
|
66
|
-
};
|
|
67
43
|
//# sourceMappingURL=security-patterns.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-patterns.d.ts","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security-patterns.d.ts","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAiB5C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAqC7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EA2D5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAoE5C,CAAC;AAIF;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,GAAG,IAAI,CAOrG;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ5D"}
|
|
@@ -11,8 +11,13 @@
|
|
|
11
11
|
* - Only truly catastrophic operations (rm -rf /, fork bombs) are auto-denied
|
|
12
12
|
* - Sensitive operations (system paths, credentials) get AI review with context
|
|
13
13
|
* - The question is: "Does this operation make sense given user intent?"
|
|
14
|
+
*
|
|
15
|
+
* Analysis logic (requiresAIReview, classifyRisk) lives in security-analysis.ts
|
|
16
|
+
* and is re-exported here for backward compatibility.
|
|
14
17
|
*/
|
|
15
18
|
import { resolve } from 'node:path';
|
|
19
|
+
// Re-export analysis functions for backward compatibility
|
|
20
|
+
export { classifyRisk, isSensitivePath, requiresAIReview } from './security-analysis.js';
|
|
16
21
|
/**
|
|
17
22
|
* Sensitive paths that require AI context review
|
|
18
23
|
* These aren't auto-denied - they need context analysis to determine intent
|
|
@@ -45,8 +50,6 @@ export const SENSITIVE_PATHS = [
|
|
|
45
50
|
* for context review. Only truly never-legitimate commands are here.
|
|
46
51
|
*/
|
|
47
52
|
export const CRITICAL_THREATS = [
|
|
48
|
-
// Deleting root or home - no legitimate dev task requires this
|
|
49
|
-
// If user really wants this, they can run it manually outside Claude
|
|
50
53
|
{
|
|
51
54
|
pattern: /rm\s+-rf\s+(\/|~)($|\s)/i,
|
|
52
55
|
reason: 'Deleting root (/) or home (~) directory is never a legitimate dev task'
|
|
@@ -75,7 +78,6 @@ export const CRITICAL_THREATS = [
|
|
|
75
78
|
pattern: /chmod\s+000\s+\//i,
|
|
76
79
|
reason: 'Attempting to make system directories inaccessible'
|
|
77
80
|
},
|
|
78
|
-
// Reverse shells - never legitimate in a dev workflow
|
|
79
81
|
{
|
|
80
82
|
pattern: /\/dev\/tcp\//i,
|
|
81
83
|
reason: 'Reverse shell via /dev/tcp - classic backdoor technique'
|
|
@@ -84,8 +86,6 @@ export const CRITICAL_THREATS = [
|
|
|
84
86
|
pattern: /\bnc\b.*-[elp].*\b\d+\b/i,
|
|
85
87
|
reason: 'Netcat listener/reverse shell - common backdoor technique'
|
|
86
88
|
},
|
|
87
|
-
// NOTE: curl|bash is NOT here - it goes to Haiku for context review
|
|
88
|
-
// The question is "did a bad actor inject this?" not "is curl|bash dangerous?"
|
|
89
89
|
];
|
|
90
90
|
/**
|
|
91
91
|
* Safe operations that can be immediately allowed (confidence: 95%)
|
|
@@ -96,14 +96,12 @@ export const SAFE_OPERATIONS = [
|
|
|
96
96
|
{ pattern: /^Read:/i },
|
|
97
97
|
{ pattern: /^Glob:/i },
|
|
98
98
|
{ pattern: /^Grep:/i },
|
|
99
|
-
// Write/Edit to user home directory or subdirectories
|
|
100
|
-
|
|
101
|
-
{ pattern: /^
|
|
102
|
-
{ pattern: /^
|
|
103
|
-
{ pattern: /^
|
|
104
|
-
{ pattern: /^Edit:\s*\/home\/[^/]+\//i }, // Linux home dirs - Edit
|
|
99
|
+
// Write/Edit to user home directory or subdirectories
|
|
100
|
+
{ pattern: /^Write:\s*\/Users\/[^/]+\//i },
|
|
101
|
+
{ pattern: /^Edit:\s*\/Users\/[^/]+\//i },
|
|
102
|
+
{ pattern: /^Write:\s*\/home\/[^/]+\//i },
|
|
103
|
+
{ pattern: /^Edit:\s*\/home\/[^/]+\//i },
|
|
105
104
|
// Safe bash commands - common development workflows
|
|
106
|
-
// NOTE: curl|bash goes to Haiku for context review, not auto-allowed
|
|
107
105
|
{ pattern: /^Bash:\s*(npm|yarn|pnpm|bun)\s+(install|ci|run|test|build|dev|start|lint|format)($|\s)/i },
|
|
108
106
|
{ pattern: /^Bash:\s*git\s+(status|log|diff|show|branch|clone|pull|fetch|add|stash|checkout)($|\s)/i },
|
|
109
107
|
{ pattern: /^Bash:\s*docker\s+(build|run|ps|logs|compose|images)($|\s)/i },
|
|
@@ -117,20 +115,37 @@ export const SAFE_OPERATIONS = [
|
|
|
117
115
|
{ pattern: /^Bash:\s*rm\s+-rf\s+(\.\/)?\.next($|\s)/i },
|
|
118
116
|
{ pattern: /^Bash:\s*rm\s+-rf\s+(\.\/)?target($|\s)/i },
|
|
119
117
|
{ pattern: /^Bash:\s*rm\s+-rf\s+(\.\/)?__pycache__($|\s)/i },
|
|
120
|
-
// Write/Edit to temp directories
|
|
118
|
+
// Write/Edit to temp directories
|
|
121
119
|
{ pattern: /^(Write|Edit):\s*\/tmp\//i },
|
|
122
120
|
{ pattern: /^(Write|Edit):\s*\/var\/tmp\//i },
|
|
123
|
-
// Side-effect-free tools
|
|
121
|
+
// Side-effect-free tools
|
|
124
122
|
{ pattern: /^(ExitPlanMode|EnterPlanMode|TodoWrite|AskUserQuestion):/i },
|
|
123
|
+
// Additional common dev commands
|
|
124
|
+
{ pattern: /^Bash:\s*(tsc|tsx|node|bun|deno|npx|bunx)\s/i },
|
|
125
|
+
{ pattern: /^Bash:\s*(vitest|jest|mocha|tap)\s/i },
|
|
126
|
+
{ pattern: /^Bash:\s*(biome|eslint|prettier|tslint)\s+(check|lint|format)/i },
|
|
127
|
+
{ pattern: /^Bash:\s*(make|cmake|ninja|meson)($|\s)/i },
|
|
128
|
+
{ pattern: /^Bash:\s*git\s+(commit|push|tag|remote|rebase|merge|cherry-pick|reset|revert)($|\s)/i },
|
|
129
|
+
{ pattern: /^Bash:\s*git\s+(worktree|submodule|config|clean|gc)($|\s)/i },
|
|
130
|
+
{ pattern: /^Bash:\s*(uname|hostname|whoami|id|groups|uptime|df|du|free|top|ps|lsof|stat|file|readlink)($|\s)/i },
|
|
131
|
+
{ pattern: /^Bash:\s*(mv|cp|touch|ln|basename|dirname|realpath|mktemp|xargs|tee|tr|cut|paste|comm|diff|patch)($|\s)/i },
|
|
132
|
+
{ pattern: /^Bash:\s*(tar|gzip|gunzip|zip|unzip|bzip2)\s/i },
|
|
133
|
+
{ pattern: /^Bash:\s*(ruby|python3?|php|java|javac|scala|kotlinc|swift|rustc|gcc|g\+\+|clang)\s/i },
|
|
134
|
+
{ pattern: /^Bash:\s*(pip|pip3|gem|bundle|composer|maven|gradle|sbt|cargo|rustup)\s/i },
|
|
135
|
+
{ pattern: /^Bash:\s*(gh|hub)\s+(pr|issue|repo|release|run|api)\s/i },
|
|
136
|
+
{ pattern: /^Bash:\s*(flyctl|fly)\s+(status|logs|ssh|deploy|apps|machines|secrets)($|\s)/i },
|
|
137
|
+
{ pattern: /^Bash:\s*(terraform|tofu)\s+(init|plan|apply|validate|fmt|show|output)($|\s)/i },
|
|
138
|
+
{ pattern: /^Bash:\s*wc($|\s)/i },
|
|
139
|
+
// WebFetch/WebSearch are inherently read-only
|
|
140
|
+
{ pattern: /^WebFetch:/i },
|
|
141
|
+
{ pattern: /^WebSearch:/i },
|
|
142
|
+
// Agent and NotebookEdit are orchestration-only
|
|
143
|
+
{ pattern: /^Agent:/i },
|
|
144
|
+
{ pattern: /^NotebookEdit:/i },
|
|
125
145
|
];
|
|
126
146
|
/**
|
|
127
147
|
* Patterns that trigger AI context review
|
|
128
148
|
* These operations need context analysis to determine if they align with user intent
|
|
129
|
-
*
|
|
130
|
-
* The AI should consider:
|
|
131
|
-
* 1. Did the user explicitly request this operation?
|
|
132
|
-
* 2. Does it make sense given the task at hand?
|
|
133
|
-
* 3. Is the content/action appropriate for the target?
|
|
134
149
|
*/
|
|
135
150
|
export const NEEDS_AI_REVIEW = [
|
|
136
151
|
// Remote code execution patterns
|
|
@@ -139,106 +154,58 @@ export const NEEDS_AI_REVIEW = [
|
|
|
139
154
|
reason: 'Pipe to shell - verify source is trusted and user intended this'
|
|
140
155
|
},
|
|
141
156
|
// Elevated privileges
|
|
142
|
-
{
|
|
143
|
-
pattern: /sudo/i,
|
|
144
|
-
reason: 'Elevated privileges - verify user intended this action'
|
|
145
|
-
},
|
|
157
|
+
{ pattern: /sudo/i, reason: 'Elevated privileges - verify user intended this action' },
|
|
146
158
|
// Destructive operations (except safe build artifact cleanup)
|
|
147
|
-
{
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
{
|
|
153
|
-
pattern: /\|\s*(nc|netcat|ncat)\b/i,
|
|
154
|
-
reason: 'Pipe to netcat - potential data exfiltration'
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
pattern: /\bscp\b.*@/i,
|
|
158
|
-
reason: 'SCP to remote host - potential data exfiltration'
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
pattern: /\|\s*curl\b/i,
|
|
162
|
-
reason: 'Pipe to curl - potential data exfiltration'
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
pattern: /curl\b.*-d\s*@/i,
|
|
166
|
-
reason: 'Curl with file upload - potential data exfiltration'
|
|
167
|
-
},
|
|
159
|
+
{ pattern: /rm\s+-rf/i, reason: 'Recursive deletion - verify target matches user intent' },
|
|
160
|
+
// Data exfiltration patterns
|
|
161
|
+
{ pattern: /\|\s*(nc|netcat|ncat)\b/i, reason: 'Pipe to netcat - potential data exfiltration' },
|
|
162
|
+
{ pattern: /\bscp\b.*@/i, reason: 'SCP to remote host - potential data exfiltration' },
|
|
163
|
+
{ pattern: /\|\s*curl\b/i, reason: 'Pipe to curl - potential data exfiltration' },
|
|
164
|
+
{ pattern: /curl\b.*-d\s*@/i, reason: 'Curl with file upload - potential data exfiltration' },
|
|
168
165
|
// ALL Write/Edit operations that aren't to /tmp go through context review
|
|
169
|
-
// This is the key change: we review based on context, not blanket allow/deny
|
|
170
166
|
{
|
|
171
167
|
pattern: /^(Write|Edit):\s*(?!\/tmp\/|\/var\/tmp\/)/i,
|
|
172
168
|
reason: 'File modification - verify aligns with user request'
|
|
173
169
|
},
|
|
174
|
-
// Reverse shells and bind shells
|
|
175
|
-
{
|
|
176
|
-
|
|
177
|
-
reason: 'Potential reverse shell via /dev/tcp'
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
pattern: /\b(nc|netcat|ncat)\b.*-e\s/i,
|
|
181
|
-
reason: 'Netcat with -e flag - potential reverse shell'
|
|
182
|
-
},
|
|
170
|
+
// Reverse shells and bind shells
|
|
171
|
+
{ pattern: /\/dev\/tcp\//i, reason: 'Potential reverse shell via /dev/tcp' },
|
|
172
|
+
{ pattern: /\b(nc|netcat|ncat)\b.*-e\s/i, reason: 'Netcat with -e flag - potential reverse shell' },
|
|
183
173
|
{
|
|
184
174
|
pattern: /\bsocket\b.*\bconnect\b.*\b(dup2|subprocess|exec)\b/i,
|
|
185
175
|
reason: 'Programmatic reverse shell pattern (socket+connect+exec)'
|
|
186
176
|
},
|
|
187
|
-
{
|
|
188
|
-
pattern: /\bperl\b.*\bsocket\b.*\bexec\b/i,
|
|
189
|
-
reason: 'Perl reverse shell pattern'
|
|
190
|
-
},
|
|
177
|
+
{ pattern: /\bperl\b.*\bsocket\b.*\bexec\b/i, reason: 'Perl reverse shell pattern' },
|
|
191
178
|
// Encoded/obfuscated payloads piped to shell or eval
|
|
192
179
|
{
|
|
193
180
|
pattern: /\b(base64|base32)\b.*-d.*\|\s*(bash|sh)\b/i,
|
|
194
181
|
reason: 'Decoded payload piped to shell - obfuscated command execution'
|
|
195
182
|
},
|
|
196
|
-
{
|
|
197
|
-
|
|
198
|
-
reason: 'Hex-encoded payload piped to shell'
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
pattern: /\bexec\b.*\b(base64|b64decode)\b/i,
|
|
202
|
-
reason: 'Exec with base64 decoding - obfuscated code execution'
|
|
203
|
-
},
|
|
183
|
+
{ pattern: /\\x[0-9a-f]{2}.*\|\s*(bash|sh)\b/i, reason: 'Hex-encoded payload piped to shell' },
|
|
184
|
+
{ pattern: /\bexec\b.*\b(base64|b64decode)\b/i, reason: 'Exec with base64 decoding - obfuscated code execution' },
|
|
204
185
|
{
|
|
205
186
|
pattern: /\bprintf\b.*\\x[0-9a-f].*\|\s*(bash|sh)\b/i,
|
|
206
187
|
reason: 'Printf hex payload piped to shell'
|
|
207
188
|
},
|
|
208
|
-
// Cloud metadata / SSRF
|
|
209
|
-
{
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
pattern: /metadata\.google\.internal/i,
|
|
215
|
-
reason: 'GCP metadata access - potential credential theft'
|
|
216
|
-
},
|
|
217
|
-
// Persistence — writing to shell profiles, cron, authorized_keys via echo/append
|
|
189
|
+
// Cloud metadata / SSRF
|
|
190
|
+
{ pattern: /169\.254\.169\.254/i, reason: 'AWS/Azure IMDS access - potential credential theft' },
|
|
191
|
+
{ pattern: /metadata\.google\.internal/i, reason: 'GCP metadata access - potential credential theft' },
|
|
192
|
+
// Persistence mechanisms
|
|
218
193
|
{
|
|
219
194
|
pattern: />>\s*~?\/?.*\/(authorized_keys|\.bashrc|\.bash_profile|\.zshrc|\.profile)/i,
|
|
220
195
|
reason: 'Appending to sensitive file - potential persistence mechanism'
|
|
221
196
|
},
|
|
222
|
-
{
|
|
223
|
-
pattern: /\bld\.so\.preload\b/i,
|
|
224
|
-
reason: 'LD_PRELOAD injection - shared library hijacking'
|
|
225
|
-
},
|
|
197
|
+
{ pattern: /\bld\.so\.preload\b/i, reason: 'LD_PRELOAD injection - shared library hijacking' },
|
|
226
198
|
// wget with file upload
|
|
227
|
-
{
|
|
228
|
-
pattern: /wget\b.*--post-file/i,
|
|
229
|
-
reason: 'wget file upload - potential data exfiltration'
|
|
230
|
-
},
|
|
199
|
+
{ pattern: /wget\b.*--post-file/i, reason: 'wget file upload - potential data exfiltration' },
|
|
231
200
|
// pip install from custom index (supply chain attack)
|
|
232
201
|
{
|
|
233
202
|
pattern: /pip\b.*--index-url\s+https?:\/\/(?!pypi\.org)/i,
|
|
234
203
|
reason: 'pip install from non-PyPI index - potential supply chain attack'
|
|
235
204
|
},
|
|
236
205
|
// MCP server manipulation
|
|
237
|
-
{
|
|
238
|
-
pattern: /\bclaude\b.*\bmcp\b.*\badd\b/i,
|
|
239
|
-
reason: 'Adding MCP server - verify source is trusted'
|
|
240
|
-
},
|
|
206
|
+
{ pattern: /\bclaude\b.*\bmcp\b.*\badd\b/i, reason: 'Adding MCP server - verify source is trusted' },
|
|
241
207
|
];
|
|
208
|
+
// ── Utility functions ─────────────────────────────────────────
|
|
242
209
|
/**
|
|
243
210
|
* Check if operation matches any pattern in array
|
|
244
211
|
*/
|
|
@@ -264,176 +231,4 @@ export function normalizeOperation(operation) {
|
|
|
264
231
|
}
|
|
265
232
|
return operation;
|
|
266
233
|
}
|
|
267
|
-
/** Check if a Bash command contains chain operators that could hide dangerous ops after a safe prefix. */
|
|
268
|
-
function containsChainOperators(operation) {
|
|
269
|
-
const commandPart = operation.replace(/^Bash:\s*/i, '');
|
|
270
|
-
return /;|&&|\|\||\n/.test(commandPart);
|
|
271
|
-
}
|
|
272
|
-
/** Check if a Bash command pipes output to known exfiltration/network tools or shells. */
|
|
273
|
-
function containsDangerousPipe(operation) {
|
|
274
|
-
const commandPart = operation.replace(/^Bash:\s*/i, '');
|
|
275
|
-
return /\|\s*(nc|netcat|ncat|curl|wget|scp|bash|sh)\b/i.test(commandPart);
|
|
276
|
-
}
|
|
277
|
-
/** Check if a Bash command redirects output to sensitive paths (append or overwrite). */
|
|
278
|
-
function containsSensitiveRedirect(operation) {
|
|
279
|
-
const commandPart = operation.replace(/^Bash:\s*/i, '');
|
|
280
|
-
return />>?\s*~?\/?.*\/(authorized_keys|\.bashrc|\.bash_profile|\.zshrc|\.profile|\.ssh\/|\.aws\/|\.gnupg\/|ld\.so\.preload|crontab|sudoers)/i.test(commandPart)
|
|
281
|
-
|| />>?\s*\/etc\//i.test(commandPart);
|
|
282
|
-
}
|
|
283
|
-
/** Check if a Bash command contains subshell or backtick expansion (not simple ${VAR}). */
|
|
284
|
-
function containsBashExpansion(operation) {
|
|
285
|
-
const commandPart = operation.replace(/^Bash:\s*/i, '');
|
|
286
|
-
return /`[^`]+`/.test(commandPart) || /\$\([^)]+\)/.test(commandPart);
|
|
287
|
-
}
|
|
288
|
-
/** Check if a Bash command contains any form of shell expansion: ${VAR}, $(...), or backticks. */
|
|
289
|
-
function containsAnyExpansion(operation) {
|
|
290
|
-
const cmd = operation.replace(/^Bash:\s*/i, '');
|
|
291
|
-
return /\$\{[^}]+\}/.test(cmd) || /\$\([^)]+\)/.test(cmd) || /`[^`]+`/.test(cmd);
|
|
292
|
-
}
|
|
293
|
-
/** Check if expansion is safely used as an argument to a known-safe command prefix.
|
|
294
|
-
* e.g., "echo ${HOME}" or "cat ${FILE}" — the expansion can't change the command itself. */
|
|
295
|
-
function isSafeExpansionUse(operation) {
|
|
296
|
-
const cmd = operation.replace(/^Bash:\s*/i, '').trim();
|
|
297
|
-
// If the expansion IS the command (first token), it's never safe
|
|
298
|
-
if (/^(\$\{|\$\(|`)/.test(cmd))
|
|
299
|
-
return false;
|
|
300
|
-
// Safe command prefixes where expansion as an argument is harmless
|
|
301
|
-
const safePrefix = /^(echo|printf|cat|ls|pwd|whoami|date|env|printenv|test|true|false)\s/i;
|
|
302
|
-
return safePrefix.test(cmd);
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Determine if operation requires AI context review
|
|
306
|
-
*
|
|
307
|
-
* The philosophy here is:
|
|
308
|
-
* - SENSITIVE_PATHS: Always require review (credentials, system configs)
|
|
309
|
-
* - SAFE_OPERATIONS: No review needed, UNLESS the bash command contains
|
|
310
|
-
* chain operators, dangerous pipes, or subshell/backtick expansion
|
|
311
|
-
* - CRITICAL_THREATS: Auto-deny, no review (catastrophic operations)
|
|
312
|
-
* - Everything else: AI reviews context to determine if it matches user intent
|
|
313
|
-
*/
|
|
314
|
-
const SAFE_RM_PATTERNS = [
|
|
315
|
-
/rm\s+-rf\s+(\.\/)?node_modules($|\s)/i,
|
|
316
|
-
/rm\s+-rf\s+(\.\/)?dist($|\s)/i,
|
|
317
|
-
/rm\s+-rf\s+(\.\/)?build($|\s)/i,
|
|
318
|
-
/rm\s+-rf\s+(\.\/)?\.cache($|\s)/i,
|
|
319
|
-
/rm\s+-rf\s+(\.\/)?\.next($|\s)/i,
|
|
320
|
-
/rm\s+-rf\s+(\.\/)?target($|\s)/i,
|
|
321
|
-
/rm\s+-rf\s+(\.\/)?__pycache__($|\s)/i,
|
|
322
|
-
];
|
|
323
|
-
export function requiresAIReview(operation) {
|
|
324
|
-
// Normalize paths to prevent .. traversal bypass
|
|
325
|
-
const op = normalizeOperation(operation);
|
|
326
|
-
// Check sensitive paths BEFORE safe operations — prevents home-dir
|
|
327
|
-
// safe pattern from masking .ssh, .aws, .bashrc, etc.
|
|
328
|
-
if (matchesPattern(op, SENSITIVE_PATHS))
|
|
329
|
-
return true;
|
|
330
|
-
// Bash commands with any shell expansion (${VAR}, $(...), backticks) are
|
|
331
|
-
// opaque — the bouncer can't predict what they expand to at runtime.
|
|
332
|
-
// Route to AI review BEFORE checking CRITICAL_THREATS or SAFE_OPERATIONS,
|
|
333
|
-
// UNLESS the command is clearly safe (expansion is just an argument to a
|
|
334
|
-
// known-safe prefix like "echo ${HOME}").
|
|
335
|
-
if (/^Bash:/i.test(op) && containsAnyExpansion(op) && !isSafeExpansionUse(op)) {
|
|
336
|
-
return true;
|
|
337
|
-
}
|
|
338
|
-
if (matchesPattern(op, SAFE_OPERATIONS)) {
|
|
339
|
-
// Safe bash commands must not contain chain operators, dangerous pipes,
|
|
340
|
-
// or subshell/backtick expansion that could hide dangerous operations.
|
|
341
|
-
// A safe prefix (e.g., "git clone") with chain operators (&&, ;, ||)
|
|
342
|
-
// means the full command isn't necessarily safe — route to AI review.
|
|
343
|
-
if (/^Bash:/i.test(op) && (containsChainOperators(op) ||
|
|
344
|
-
containsDangerousPipe(op) ||
|
|
345
|
-
containsBashExpansion(op) ||
|
|
346
|
-
containsSensitiveRedirect(op))) {
|
|
347
|
-
return true;
|
|
348
|
-
}
|
|
349
|
-
return false;
|
|
350
|
-
}
|
|
351
|
-
if (matchesPattern(op, CRITICAL_THREATS))
|
|
352
|
-
return false;
|
|
353
|
-
if (matchesPattern(op, NEEDS_AI_REVIEW)) {
|
|
354
|
-
return !SAFE_RM_PATTERNS.some(p => p.test(op));
|
|
355
|
-
}
|
|
356
|
-
// Glob patterns and script execution are concerning in Bash commands
|
|
357
|
-
if (/^Bash:/.test(op)) {
|
|
358
|
-
if (/\*\*?/.test(op))
|
|
359
|
-
return true;
|
|
360
|
-
if (/^Bash:\s*\.\//.test(op))
|
|
361
|
-
return true;
|
|
362
|
-
}
|
|
363
|
-
return false;
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Check if operation targets a sensitive path
|
|
367
|
-
* Used to provide additional context to AI reviewer
|
|
368
|
-
*/
|
|
369
|
-
export function isSensitivePath(operation) {
|
|
370
|
-
return matchesPattern(operation, SENSITIVE_PATHS);
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Classify operation risk level for context-aware review
|
|
374
|
-
*
|
|
375
|
-
* Risk levels indicate how much scrutiny the AI should apply:
|
|
376
|
-
* - critical: Catastrophic if wrong (rm -rf /, fork bombs) - auto-deny
|
|
377
|
-
* - high: Needs clear user intent (sudo, sensitive paths, credentials)
|
|
378
|
-
* - medium: Normal file operations - verify matches user request
|
|
379
|
-
* - low: Safe operations - minimal review needed
|
|
380
|
-
*/
|
|
381
|
-
export function classifyRisk(operation) {
|
|
382
|
-
// Critical threats are auto-denied
|
|
383
|
-
const criticalThreat = matchesPattern(operation, CRITICAL_THREATS);
|
|
384
|
-
if (criticalThreat) {
|
|
385
|
-
return {
|
|
386
|
-
isDestructive: true,
|
|
387
|
-
riskLevel: 'critical',
|
|
388
|
-
reasons: [criticalThreat.reason || 'Critical threat detected']
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
// Sensitive paths need high scrutiny but aren't auto-denied
|
|
392
|
-
const sensitivePath = matchesPattern(operation, SENSITIVE_PATHS);
|
|
393
|
-
if (sensitivePath) {
|
|
394
|
-
return {
|
|
395
|
-
isDestructive: false, // Not inherently destructive, just sensitive
|
|
396
|
-
riskLevel: 'high',
|
|
397
|
-
reasons: [sensitivePath.reason || 'Sensitive path - requires clear user intent']
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
// Other patterns that need elevated review
|
|
401
|
-
const elevatedPatterns = [
|
|
402
|
-
{ pattern: /sudo/i, reason: 'Elevated privileges requested' },
|
|
403
|
-
{ pattern: /DROP\s+(TABLE|DATABASE)/i, reason: 'Database deletion' },
|
|
404
|
-
{ pattern: /chmod\s+777/i, reason: 'Dangerous permissions' },
|
|
405
|
-
{ pattern: /(curl|wget).*\|.*(bash|sh)/i, reason: 'Remote code execution' },
|
|
406
|
-
{ pattern: /pkill|killall/i, reason: 'Process termination' },
|
|
407
|
-
{ pattern: /\|\s*(nc|netcat|ncat)\b/i, reason: 'Data exfiltration via netcat' },
|
|
408
|
-
{ pattern: /\bscp\b.*@/i, reason: 'Data exfiltration via SCP' },
|
|
409
|
-
{ pattern: /curl\b.*-d\s*@/i, reason: 'Data exfiltration via curl file upload' },
|
|
410
|
-
];
|
|
411
|
-
for (const pattern of elevatedPatterns) {
|
|
412
|
-
if (pattern.pattern.test(operation)) {
|
|
413
|
-
return {
|
|
414
|
-
isDestructive: true,
|
|
415
|
-
riskLevel: 'high',
|
|
416
|
-
reasons: [pattern.reason || 'Elevated risk operation']
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
// Medium risk: only recursive deletions outside safe dirs
|
|
421
|
-
// NOTE: Write/Edit are NOT flagged as risky - they're normal dev operations
|
|
422
|
-
if (/rm\s+-rf/i.test(operation)) {
|
|
423
|
-
// Check if it's actually safe (build artifacts, temp)
|
|
424
|
-
if (matchesPattern(operation, SAFE_OPERATIONS)) {
|
|
425
|
-
return { isDestructive: false, riskLevel: 'low', reasons: [] };
|
|
426
|
-
}
|
|
427
|
-
return {
|
|
428
|
-
isDestructive: true,
|
|
429
|
-
riskLevel: 'medium',
|
|
430
|
-
reasons: ['Recursive deletion']
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
return {
|
|
434
|
-
isDestructive: false,
|
|
435
|
-
riskLevel: 'low',
|
|
436
|
-
reasons: []
|
|
437
|
-
};
|
|
438
|
-
}
|
|
439
234
|
//# sourceMappingURL=security-patterns.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-patterns.js","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAEhE
|
|
1
|
+
{"version":3,"file":"security-patterns.js","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WebSocket as NodeWebSocket } from 'ws';
|
|
2
|
+
import type { WSContext } from './services/websocket/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Set the terminal tab title
|
|
5
|
+
* Format: "mstro: directory_name"
|
|
6
|
+
*/
|
|
7
|
+
export declare function setTerminalTitle(directory: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Ensure .claude/settings.json exists with recommended settings
|
|
10
|
+
* for optimal Claude Code performance with Mstro
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureClaudeSettings(workingDir: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Wrap a ws WebSocket to match our WSContext interface
|
|
15
|
+
*/
|
|
16
|
+
export declare function wrapWebSocket(ws: NodeWebSocket, workingDir: string): WSContext;
|
|
17
|
+
/**
|
|
18
|
+
* Create a virtual WebSocket context that sends responses through the platform relay.
|
|
19
|
+
* This allows messages from the web (via platform) to be handled by the same wsHandler.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createPlatformRelayContext(platformSend: (message: unknown) => void, workingDir: string): WSContext;
|
|
22
|
+
//# sourceMappingURL=server-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-setup.d.ts","sourceRoot":"","sources":["../../server/server-setup.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,IAAI,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAE9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA6C7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAQ9E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EACxC,UAAU,EAAE,MAAM,GACjB,SAAS,CAiBX"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License. See LICENSE file for details.
|
|
3
|
+
/**
|
|
4
|
+
* Server Setup Utilities — Helpers for the main server entry point.
|
|
5
|
+
*
|
|
6
|
+
* - ensureClaudeSettings: Ensures .claude/settings.json has recommended defaults
|
|
7
|
+
* - wrapWebSocket / createPlatformRelayContext: WSContext adapters
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { basename, join } from 'node:path';
|
|
11
|
+
/**
|
|
12
|
+
* Set the terminal tab title
|
|
13
|
+
* Format: "mstro: directory_name"
|
|
14
|
+
*/
|
|
15
|
+
export function setTerminalTitle(directory) {
|
|
16
|
+
const dirName = basename(directory) || directory;
|
|
17
|
+
const title = `mstro: ${dirName}`;
|
|
18
|
+
process.stdout.write(`\x1b]0;${title}\x07`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Ensure .claude/settings.json exists with recommended settings
|
|
22
|
+
* for optimal Claude Code performance with Mstro
|
|
23
|
+
*/
|
|
24
|
+
export function ensureClaudeSettings(workingDir) {
|
|
25
|
+
const claudeDir = join(workingDir, '.claude');
|
|
26
|
+
const settingsPath = join(claudeDir, 'settings.json');
|
|
27
|
+
if (!existsSync(claudeDir)) {
|
|
28
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
const recommendedSettings = {
|
|
31
|
+
env: {
|
|
32
|
+
CLAUDE_CODE_MAX_OUTPUT_TOKENS: "64000",
|
|
33
|
+
DISABLE_NONESSENTIAL_TRAFFIC: "1"
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
if (!existsSync(settingsPath)) {
|
|
37
|
+
writeFileSync(settingsPath, JSON.stringify(recommendedSettings, null, 2));
|
|
38
|
+
console.log(`📝 Created .claude/settings.json with recommended settings`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
try {
|
|
42
|
+
const existingSettings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
43
|
+
let updated = false;
|
|
44
|
+
if (!existingSettings.env) {
|
|
45
|
+
existingSettings.env = {};
|
|
46
|
+
updated = true;
|
|
47
|
+
}
|
|
48
|
+
if (!existingSettings.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS) {
|
|
49
|
+
existingSettings.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS = "64000";
|
|
50
|
+
updated = true;
|
|
51
|
+
}
|
|
52
|
+
if (!existingSettings.env.DISABLE_NONESSENTIAL_TRAFFIC) {
|
|
53
|
+
existingSettings.env.DISABLE_NONESSENTIAL_TRAFFIC = "1";
|
|
54
|
+
updated = true;
|
|
55
|
+
}
|
|
56
|
+
if (updated) {
|
|
57
|
+
writeFileSync(settingsPath, JSON.stringify(existingSettings, null, 2));
|
|
58
|
+
console.log(`📝 Updated .claude/settings.json with recommended env settings`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (_e) {
|
|
62
|
+
console.warn(`⚠️ Could not parse existing .claude/settings.json, skipping update`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Wrap a ws WebSocket to match our WSContext interface
|
|
68
|
+
*/
|
|
69
|
+
export function wrapWebSocket(ws, workingDir) {
|
|
70
|
+
return {
|
|
71
|
+
send: (data) => ws.send(data),
|
|
72
|
+
close: () => ws.close(),
|
|
73
|
+
readyState: ws.readyState,
|
|
74
|
+
_workingDir: workingDir,
|
|
75
|
+
_ws: ws
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a virtual WebSocket context that sends responses through the platform relay.
|
|
80
|
+
* This allows messages from the web (via platform) to be handled by the same wsHandler.
|
|
81
|
+
*/
|
|
82
|
+
export function createPlatformRelayContext(platformSend, workingDir) {
|
|
83
|
+
return {
|
|
84
|
+
send: (data) => {
|
|
85
|
+
try {
|
|
86
|
+
const response = typeof data === 'string' ? JSON.parse(data) : JSON.parse(data.toString());
|
|
87
|
+
platformSend(response);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
console.error('[PlatformRelay] Failed to parse response:', e);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
close: () => {
|
|
94
|
+
// No-op for platform relay
|
|
95
|
+
},
|
|
96
|
+
readyState: 1, // WebSocket.OPEN
|
|
97
|
+
_workingDir: workingDir,
|
|
98
|
+
_isPlatformRelay: true
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=server-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-setup.js","sourceRoot":"","sources":["../../server/server-setup.ts"],"names":[],"mappings":"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"}
|