mstro-app 0.3.1 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +3 -19
  2. package/bin/mstro.js +15 -177
  3. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  4. package/dist/server/mcp/bouncer-integration.js +43 -135
  5. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  6. package/dist/server/services/platform.d.ts.map +1 -1
  7. package/dist/server/services/platform.js +2 -13
  8. package/dist/server/services/platform.js.map +1 -1
  9. package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
  10. package/dist/server/services/websocket/file-explorer-handlers.js +17 -1
  11. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
  12. package/dist/server/services/websocket/file-utils.d.ts.map +1 -1
  13. package/dist/server/services/websocket/file-utils.js +26 -20
  14. package/dist/server/services/websocket/file-utils.js.map +1 -1
  15. package/dist/server/services/websocket/types.d.ts +1 -1
  16. package/dist/server/services/websocket/types.d.ts.map +1 -1
  17. package/dist/server/utils/paths.d.ts +0 -12
  18. package/dist/server/utils/paths.d.ts.map +1 -1
  19. package/dist/server/utils/paths.js +0 -12
  20. package/dist/server/utils/paths.js.map +1 -1
  21. package/package.json +1 -2
  22. package/server/README.md +0 -1
  23. package/server/mcp/README.md +0 -5
  24. package/server/mcp/bouncer-integration.ts +55 -210
  25. package/server/services/platform.ts +2 -12
  26. package/server/services/websocket/file-explorer-handlers.ts +16 -1
  27. package/server/services/websocket/file-utils.ts +29 -24
  28. package/server/services/websocket/types.ts +1 -0
  29. package/server/utils/paths.ts +0 -14
  30. package/bin/configure-claude.js +0 -298
  31. package/dist/server/mcp/bouncer-cli.d.ts +0 -3
  32. package/dist/server/mcp/bouncer-cli.d.ts.map +0 -1
  33. package/dist/server/mcp/bouncer-cli.js +0 -138
  34. package/dist/server/mcp/bouncer-cli.js.map +0 -1
  35. package/hooks/bouncer.sh +0 -159
  36. package/server/mcp/bouncer-cli.ts +0 -180
package/README.md CHANGED
@@ -42,32 +42,19 @@ npx mstro-app # Same thing — login + launch in one command
42
42
 
43
43
  On first run, mstro will:
44
44
  1. Open your browser to authenticate with your mstro.app account
45
- 2. Offer to set up the **Security Bouncer** — say yes
46
- 3. Connect to the platform
45
+ 2. Connect to the platform
47
46
 
48
47
  Then open [mstro.app](https://mstro.app) in your browser. Your machine appears as a connected workspace. Start prompting.
49
48
 
50
49
  ## Security Bouncer
51
50
 
52
- The Bouncer automatically approves or blocks Claude Code tool calls so you don't have to. It installs as a hook at `~/.claude/hooks/bouncer.sh` and applies to all Claude Code sessions.
51
+ The Bouncer automatically approves or blocks tool calls during mstro sessions. It is not active for standalone Claude Code.
53
52
 
54
- **Mstro sessions (headless)** get the full 2-layer system:
53
+ **Mstro sessions (headless)** get the full 2-layer system via MCP:
55
54
 
56
55
  1. **Pattern matching** (<5ms): Known-safe operations are allowed instantly. Known-dangerous patterns (destructive commands, fork bombs) are blocked instantly.
57
56
  2. **AI analysis** (~200-500ms): Ambiguous operations are reviewed by a fast AI model to determine if they look like legitimate development work or prompt injection.
58
57
 
59
- **Claude Code terminal REPL** (`claude`) gets 1-layer protection:
60
-
61
- 1. **Pattern matching only**: Blocks critical threats (fork bombs, `rm -rf /`, disk overwrites). Allows everything else. The AI analysis layer requires a running mstro server.
62
-
63
- ### Configure
64
-
65
- The bouncer is set up automatically on first run. To reconfigure or install manually:
66
-
67
- ```bash
68
- mstro configure-hooks
69
- ```
70
-
71
58
  ## CLI Reference
72
59
 
73
60
  ### Commands
@@ -79,7 +66,6 @@ mstro logout # Sign out
79
66
  mstro whoami # Show current user and device info
80
67
  mstro status # Show connection and auth status
81
68
  mstro setup-terminal # Enable web terminal (compiles native module)
82
- mstro configure-hooks # Install/reconfigure Security Bouncer
83
69
  mstro telemetry [on|off] # Show/toggle anonymous telemetry
84
70
  ```
85
71
 
@@ -120,8 +106,6 @@ mstro stores config in `~/.mstro/`:
120
106
  | File | Purpose |
121
107
  |------|---------|
122
108
  | `~/.mstro/credentials.json` | Device auth token (created by `mstro login`) |
123
- | `~/.claude/hooks/bouncer.sh` | Security Bouncer hook |
124
- | `~/.claude/logs/bouncer.log` | Bouncer audit log |
125
109
 
126
110
  ## Requirements
127
111
 
package/bin/mstro.js CHANGED
@@ -14,7 +14,6 @@
14
14
  * mstro whoami # Show current user
15
15
  * mstro status # Show connection status
16
16
  * mstro -p 4105 # Start on specific port (overrides auto port)
17
- * mstro configure-hooks # Configure Claude Code security hooks
18
17
  * mstro --help # Show help
19
18
  */
20
19
 
@@ -62,24 +61,8 @@ const USER_CWD = process.cwd();
62
61
 
63
62
  // First-run detection paths
64
63
  const MSTRO_CONFIG_DIR = join(homedir(), '.mstro');
65
- const MSTRO_FIRST_RUN_FLAG = join(MSTRO_CONFIG_DIR, '.configured');
66
- const CLAUDE_SETTINGS_FILE = join(homedir(), '.claude', 'settings.json');
67
- const CLAUDE_HOOKS_DIR = join(homedir(), '.claude', 'hooks');
68
- const BOUNCER_HOOK_FILE = join(CLAUDE_HOOKS_DIR, 'bouncer.sh');
69
64
  const PTY_SETUP_DISMISSED_FLAG = join(MSTRO_CONFIG_DIR, '.pty-setup-dismissed');
70
65
 
71
- /**
72
- * Mark Mstro as configured by writing the first-run flag file
73
- */
74
- function markConfigured() {
75
- try {
76
- mkdirSync(MSTRO_CONFIG_DIR, { recursive: true, mode: 0o700 });
77
- writeFileSync(MSTRO_FIRST_RUN_FLAG, new Date().toISOString());
78
- } catch (_) {
79
- // Ignore errors — non-critical
80
- }
81
- }
82
-
83
66
  /**
84
67
  * Set the terminal tab title
85
68
  * Format: "mstro: directory_name"
@@ -121,96 +104,6 @@ function prompt(question) {
121
104
  });
122
105
  }
123
106
 
124
- /**
125
- * Check if bouncer hooks are properly configured
126
- * Returns true if both settings.json has the hook AND the hook file exists
127
- */
128
- function isBouncerConfigured() {
129
- if (!existsSync(BOUNCER_HOOK_FILE) || !existsSync(CLAUDE_SETTINGS_FILE)) {
130
- return false;
131
- }
132
-
133
- try {
134
- const settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_FILE, 'utf-8'));
135
- const preToolUseHooks = settings.hooks?.PreToolUse;
136
- return Array.isArray(preToolUseHooks) &&
137
- preToolUseHooks.some(matcher =>
138
- Array.isArray(matcher.hooks) &&
139
- matcher.hooks.some(hook => hook.command?.includes('bouncer.sh'))
140
- );
141
- } catch {
142
- return false;
143
- }
144
- }
145
-
146
- /**
147
- * Check if user has dismissed the bouncer setup prompt
148
- */
149
- function hasUserDismissedSetup() {
150
- return existsSync(MSTRO_FIRST_RUN_FLAG);
151
- }
152
-
153
- /**
154
- * Mark bouncer setup as dismissed by user
155
- */
156
- function markSetupDismissed() {
157
- if (!existsSync(MSTRO_CONFIG_DIR)) {
158
- mkdirSync(MSTRO_CONFIG_DIR, { recursive: true, mode: 0o700 });
159
- }
160
- writeFileSync(MSTRO_FIRST_RUN_FLAG, new Date().toISOString());
161
- }
162
-
163
- /**
164
- * Show a one-line warning that bouncer is not configured
165
- */
166
- function showBouncerWarning() {
167
- log(' Security Bouncer not configured. Run: mstro configure-hooks', colors.dim);
168
- }
169
-
170
- /**
171
- * Prompt user to configure hooks
172
- * Returns: 'configure' | 'skip' | 'never'
173
- */
174
- async function promptBouncerSetup() {
175
- log('\n Welcome to Mstro!\n', colors.bold + colors.cyan);
176
- log(' Mstro includes a Security Bouncer that automatically manages', colors.dim);
177
- log(' tool permissions for Claude Code - keeping you safe while you work.\n', colors.dim);
178
-
179
- log(' The Security Bouncer:', colors.bold);
180
- log(' - Blocks dangerous commands automatically', colors.dim);
181
- log(' - Allows normal development work without interruption', colors.dim);
182
- log(' - Uses AI to analyze ambiguous operations\n', colors.dim);
183
-
184
- const isInteractive = process.stdin.isTTY;
185
-
186
- if (!isInteractive) {
187
- log(' Non-interactive mode: skipping bouncer setup.', colors.yellow);
188
- log(' Run "mstro configure-hooks" to set up the Security Bouncer.\n', colors.dim);
189
- return 'skip';
190
- }
191
-
192
- log(' Configure Security Bouncer now?', colors.bold);
193
- log(' [Y] Yes, configure now', colors.dim);
194
- log(' [n] Not now (ask again next time)', colors.dim);
195
- log(' [d] Don\'t show this again\n', colors.dim);
196
-
197
- const answer = await prompt(' Your choice [Y/n/d]: ');
198
- const choice = answer.toLowerCase();
199
-
200
- if (choice === '' || choice === 'y' || choice === 'yes') {
201
- log('');
202
- return 'configure';
203
- } else if (choice === 'd' || choice === 'dont' || choice === "don't") {
204
- log('\n Got it! You can configure later with: mstro configure-hooks\n', colors.dim);
205
- markSetupDismissed(); // Don't show full prompt again
206
- return 'never';
207
- } else {
208
- log('\n Skipping for now. Will ask again next time.', colors.yellow);
209
- log(' You can also configure with: mstro configure-hooks\n', colors.dim);
210
- return 'skip';
211
- }
212
- }
213
-
214
107
  /**
215
108
  * Check if node-pty native module is loadable
216
109
  */
@@ -424,7 +317,6 @@ function showHelp() {
424
317
  log(' mstro status Show connection and auth status', colors.dim);
425
318
  log(' mstro telemetry [on|off] Enable/disable anonymous telemetry', colors.dim);
426
319
  log(' mstro -p 4105 Start on specific port (overrides auto port)', colors.dim);
427
- log(' mstro configure-hooks Configure Claude Code security hooks', colors.dim);
428
320
  log(' mstro setup-terminal Enable web terminal (compiles native module)', colors.dim);
429
321
  log(' mstro --version Show version number', colors.dim);
430
322
  log(' mstro --help Show this help message', colors.dim);
@@ -438,11 +330,6 @@ function showHelp() {
438
330
  log(' Running "mstro" will prompt you to log in automatically if needed.', colors.dim);
439
331
  log(' Once logged in, machines sync automatically with your web dashboard.', colors.dim);
440
332
  log('');
441
- log(' Security:', colors.bold);
442
- log(' Mstro includes a Security Bouncer that automatically manages', colors.dim);
443
- log(' tool permissions for Claude Code. It blocks dangerous operations', colors.dim);
444
- log(' while allowing normal development work to proceed smoothly.', colors.dim);
445
- log('');
446
333
  }
447
334
 
448
335
  function runNpmScript(script, args = [], envOverrides = {}) {
@@ -486,42 +373,6 @@ function runNpmScript(script, args = [], envOverrides = {}) {
486
373
  });
487
374
  }
488
375
 
489
- function runConfigureHooks(andThenStart = false) {
490
- const configScript = join(__dirname, 'configure-claude.js');
491
- const child = spawn('node', [configScript, ...process.argv.slice(3)], {
492
- cwd: CLIENT_ROOT,
493
- stdio: 'inherit',
494
- });
495
-
496
- // Handle Ctrl+C: kill child process and exit immediately
497
- process.on('SIGINT', () => {
498
- child.kill('SIGTERM');
499
- process.exit(0);
500
- });
501
-
502
- child.on('error', (err) => {
503
- log(`Error: ${err.message}`, colors.red);
504
- process.exit(1);
505
- });
506
-
507
- child.on('exit', async (code) => {
508
- if (code === 0) {
509
- markConfigured();
510
- if (andThenStart) {
511
- // After configuring bouncer, prompt for terminal setup before starting
512
- await ensurePtySetup();
513
- const requestedPort = parsePort(process.argv.slice(2));
514
- const envOverrides = requestedPort ? { PORT: String(requestedPort) } : {};
515
- runNpmScript('start', [], envOverrides);
516
- } else {
517
- process.exit(0);
518
- }
519
- } else {
520
- process.exit(code || 0);
521
- }
522
- });
523
- }
524
-
525
376
  // Parse arguments
526
377
  const args = process.argv.slice(2);
527
378
 
@@ -539,6 +390,19 @@ function parsePort(args) {
539
390
  return null;
540
391
  }
541
392
 
393
+ // Extract --server / -s value (platform server URL, for local dev/testing)
394
+ // --dev is a shorthand for --server http://localhost:4102
395
+ function parseServerUrl(args) {
396
+ const serverIndex = args.findIndex(a => a === '--server' || a === '-s');
397
+ if (serverIndex !== -1 && args[serverIndex + 1]) {
398
+ return args[serverIndex + 1];
399
+ }
400
+ if (args.includes('--dev')) {
401
+ return 'http://localhost:4102';
402
+ }
403
+ return null;
404
+ }
405
+
542
406
  /**
543
407
  * Show update notification if available
544
408
  */
@@ -590,24 +454,6 @@ async function ensureLoggedIn() {
590
454
  }
591
455
  }
592
456
 
593
- /**
594
- * Prompt for bouncer setup if not configured
595
- * Returns true if runConfigureHooks was called (async exit path)
596
- */
597
- async function ensureBouncerSetup() {
598
- if (isBouncerConfigured()) return false;
599
- if (hasUserDismissedSetup()) {
600
- showBouncerWarning();
601
- return false;
602
- }
603
- const choice = await promptBouncerSetup();
604
- if (choice === 'configure') {
605
- runConfigureHooks(true);
606
- return true;
607
- }
608
- return false;
609
- }
610
-
611
457
  /**
612
458
  * Prompt for node-pty setup if not available
613
459
  */
@@ -627,8 +473,6 @@ async function ensurePtySetup() {
627
473
  async function startServer(envOverrides) {
628
474
  await ensureLoggedIn();
629
475
 
630
- if (await ensureBouncerSetup()) return;
631
-
632
476
  await ensurePtySetup();
633
477
 
634
478
  showUpdateNotification();
@@ -637,10 +481,10 @@ async function startServer(envOverrides) {
637
481
 
638
482
  async function main() {
639
483
  const requestedPort = parsePort(args);
640
- const isDevMode = args.includes('--dev');
484
+ const serverUrl = parseServerUrl(args);
641
485
  const envOverrides = {
642
486
  ...(requestedPort ? { PORT: String(requestedPort) } : {}),
643
- ...(isDevMode ? { PLATFORM_URL: 'http://localhost:4102' } : {}),
487
+ ...(serverUrl ? { PLATFORM_URL: serverUrl } : {}),
644
488
  };
645
489
 
646
490
  const subcommand = args.find(arg => !arg.startsWith('-') && !arg.startsWith('--'));
@@ -667,7 +511,6 @@ async function main() {
667
511
  const { telemetry } = await import('./commands/config.js');
668
512
  await telemetry(args.slice(args.indexOf('telemetry') + 1));
669
513
  }],
670
- ['configure-hooks', () => runConfigureHooks(false)],
671
514
  ['setup-terminal', async () => {
672
515
  log('\n Mstro Terminal Setup\n', colors.bold + colors.cyan);
673
516
  const alreadyAvailable = await isNodePtyAvailable();
@@ -697,11 +540,6 @@ async function main() {
697
540
  return;
698
541
  }
699
542
 
700
- if (args.includes('--configure-hooks') || args.includes('-c')) {
701
- runConfigureHooks(false);
702
- return;
703
- }
704
-
705
543
  // Subcommand dispatch
706
544
  const handler = subcommand ? commands.get(subcommand) : undefined;
707
545
  if (handler) {
@@ -1 +1 @@
1
- {"version":3,"file":"bouncer-integration.d.ts","sourceRoot":"","sources":["../../../server/mcp/bouncer-integration.ts"],"names":[],"mappings":"AAiFA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAyKD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiR7F;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,IAAI,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/E;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,GAAE,OAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CAS1B"}
1
+ {"version":3,"file":"bouncer-integration.d.ts","sourceRoot":"","sources":["../../../server/mcp/bouncer-integration.ts"],"names":[],"mappings":"AAiFA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QAEtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA0MD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqF7F;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,IAAI,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/E;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,GAAE,OAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CAS1B"}
@@ -204,15 +204,37 @@ or
204
204
  });
205
205
  });
206
206
  }
207
+ /**
208
+ * Finalize a bouncer decision: log, track analytics, cache, and return.
209
+ */
210
+ function finalizeDecision(operation, decision, layer, startTime, context, logFn, opts) {
211
+ const latencyMs = Math.round(performance.now() - startTime);
212
+ logFn(operation, decision.decision, decision.confidence, decision.reasoning, {
213
+ context, threatLevel: decision.threatLevel, layer, latencyMs, ...(opts?.error && { error: opts.error }),
214
+ });
215
+ if (!opts?.skipAnalytics) {
216
+ const event = decision.decision === 'deny' ? AnalyticsEvents.BOUNCER_TOOL_DENIED : AnalyticsEvents.BOUNCER_TOOL_ALLOWED;
217
+ trackEvent(event, {
218
+ layer,
219
+ operation_length: operation.length,
220
+ threat_level: decision.threatLevel,
221
+ confidence: decision.confidence,
222
+ latency_ms: latencyMs,
223
+ });
224
+ }
225
+ if (!opts?.skipCache)
226
+ cacheDecision(operation, decision);
227
+ return decision;
228
+ }
207
229
  /**
208
230
  * Main bouncer review function - 2-layer hybrid system
209
231
  */
210
232
  export async function reviewOperation(request) {
211
- // Import audit logger
212
233
  const { logBouncerDecision } = await import('./security-audit.js');
213
234
  const startTime = performance.now();
214
235
  const { operation } = request;
215
- // Check cache first (pattern-layer decisions and prior Haiku results)
236
+ const fin = (d, layer, opts) => finalizeDecision(operation, d, layer, startTime, request.context, logBouncerDecision, opts);
237
+ // Check cache first
216
238
  const cached = getCachedDecision(operation);
217
239
  if (cached) {
218
240
  console.error(`[Bouncer] ⚡ Cache hit: ${cached.decision} (${cached.confidence}%)`);
@@ -223,174 +245,60 @@ export async function reviewOperation(request) {
223
245
  if (request.context?.userRequest) {
224
246
  console.error(`[Bouncer] User request: ${request.context.userRequest}`);
225
247
  }
226
- // ========================================
227
- // PRE-CHECK: Malformed/empty tool calls
228
- // ========================================
229
- // Empty-param Edit/Write calls are no-ops that will fail validation anyway.
230
- // Allow immediately instead of wasting ~8s on Haiku analysis.
248
+ // PRE-CHECK: Empty-param Edit/Write calls are no-ops — allow immediately
231
249
  const toolInput = request.context?.toolInput;
232
250
  if (toolInput && typeof toolInput === 'object' && Object.keys(toolInput).length === 0) {
233
251
  console.error('[Bouncer] ⚡ Fast path: Empty tool parameters (no-op)');
234
- const latencyMs = Math.round(performance.now() - startTime);
235
- const decision = {
236
- decision: 'allow',
237
- confidence: 95,
238
- reasoning: 'Empty tool parameters - operation is a no-op with no side effects.',
239
- threatLevel: 'low'
240
- };
241
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'pattern-noop', latencyMs });
242
- cacheDecision(operation, decision);
243
- return decision;
252
+ return fin({ decision: 'allow', confidence: 95, reasoning: 'Empty tool parameters - operation is a no-op with no side effects.', threatLevel: 'low' }, 'pattern-noop', { skipAnalytics: true });
244
253
  }
245
- // ========================================
246
254
  // LAYER 1: Pattern-Based Fast Path (< 5ms)
247
- // ========================================
248
- // Check safe operations FIRST - allows trusted sources (e.g., brew, rustup)
255
+ // Check safe operations FIRST — allows trusted sources (e.g., brew, rustup)
249
256
  // to pass before hitting critical threat patterns like curl|bash
250
257
  const safeOperation = matchesPattern(operation, SAFE_OPERATIONS);
251
258
  if (safeOperation) {
252
259
  console.error('[Bouncer] ⚡ Fast path: Safe operation approved');
253
- const latencyMs = Math.round(performance.now() - startTime);
254
- const decision = {
255
- decision: 'allow',
256
- confidence: 95,
257
- reasoning: 'Operation matches known-safe patterns. No security concerns detected.',
258
- threatLevel: 'low'
259
- };
260
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'pattern-safe', latencyMs });
261
- trackEvent(AnalyticsEvents.BOUNCER_TOOL_ALLOWED, {
262
- layer: 'pattern-safe',
263
- operation_length: operation.length,
264
- threat_level: 'low',
265
- confidence: 95,
266
- latency_ms: latencyMs,
267
- });
268
- cacheDecision(operation, decision);
269
- return decision;
260
+ return fin({ decision: 'allow', confidence: 95, reasoning: 'Operation matches known-safe patterns. No security concerns detected.', threatLevel: 'low' }, 'pattern-safe');
270
261
  }
271
- // Check critical threats (catastrophic operations like rm -rf /, fork bombs)
272
- // These are ALWAYS denied - no context can justify them
262
+ // Critical threats (rm -rf /, fork bombs) — ALWAYS denied
273
263
  const criticalThreat = matchesPattern(operation, CRITICAL_THREATS);
274
264
  if (criticalThreat) {
275
265
  console.error('[Bouncer] ⚡ Fast path: CRITICAL THREAT detected');
276
- const latencyMs = Math.round(performance.now() - startTime);
277
- const decision = {
278
- decision: 'deny',
279
- confidence: 99,
280
- reasoning: `🚨 CRITICAL THREAT: ${criticalThreat.reason}`,
281
- threatLevel: 'critical',
266
+ return fin({
267
+ decision: 'deny', confidence: 99, reasoning: `🚨 CRITICAL THREAT: ${criticalThreat.reason}`, threatLevel: 'critical',
282
268
  alternative: 'This operation should never be performed. If you need to accomplish a specific task, please describe your goal and I can suggest safe alternatives.',
283
- enforceable: true
284
- };
285
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'pattern-critical', latencyMs });
286
- trackEvent(AnalyticsEvents.BOUNCER_TOOL_DENIED, {
287
- layer: 'pattern-critical',
288
- operation_length: operation.length,
289
- threat_level: 'critical',
290
- confidence: 99,
291
- latency_ms: latencyMs,
292
- });
293
- cacheDecision(operation, decision);
294
- return decision;
269
+ enforceable: true,
270
+ }, 'pattern-critical');
295
271
  }
296
- // ========================================
297
272
  // LAYER 2: Haiku AI Analysis (~200-500ms)
298
- // ========================================
299
- // Only invoke AI for operations that truly need context
273
+ // Default allow for operations that don't need AI review
300
274
  if (!requiresAIReview(operation)) {
301
- // Default allow for operations that don't match any pattern
302
275
  console.error('[Bouncer] ⚡ Fast path: No concerning patterns, allowing');
303
- const latencyMs = Math.round(performance.now() - startTime);
304
- const decision = {
305
- decision: 'allow',
306
- confidence: 80,
307
- reasoning: 'Operation appears safe based on pattern analysis. No obvious threats detected.',
308
- threatLevel: 'low'
309
- };
310
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'pattern-default', latencyMs });
311
- trackEvent(AnalyticsEvents.BOUNCER_TOOL_ALLOWED, {
312
- layer: 'pattern-default',
313
- operation_length: operation.length,
314
- threat_level: 'low',
315
- confidence: 80,
316
- latency_ms: latencyMs,
317
- });
318
- cacheDecision(operation, decision);
319
- return decision;
276
+ return fin({ decision: 'allow', confidence: 80, reasoning: 'Operation appears safe based on pattern analysis. No obvious threats detected.', threatLevel: 'low' }, 'pattern-default');
320
277
  }
321
- // Check if AI analysis is enabled
322
- const useAI = process.env.BOUNCER_USE_AI !== 'false';
323
- if (!useAI) {
278
+ if (process.env.BOUNCER_USE_AI === 'false') {
324
279
  console.error('[Bouncer] AI analysis disabled (BOUNCER_USE_AI=false)');
325
- const latencyMs = Math.round(performance.now() - startTime);
326
- const decision = {
327
- decision: 'warn_allow',
328
- confidence: 60,
329
- reasoning: 'Operation requires review but AI analysis is disabled. Proceeding with caution.',
330
- threatLevel: 'medium'
331
- };
332
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'ai-disabled', latencyMs });
333
- return decision;
280
+ return fin({ decision: 'warn_allow', confidence: 60, reasoning: 'Operation requires review but AI analysis is disabled. Proceeding with caution.', threatLevel: 'medium' }, 'ai-disabled', { skipCache: true, skipAnalytics: true });
334
281
  }
335
282
  console.error('[Bouncer] 🤖 Invoking Haiku for AI analysis...');
336
- trackEvent(AnalyticsEvents.BOUNCER_HAIKU_REVIEW, {
337
- operation_length: operation.length,
338
- });
339
- // Get Claude command and working directory from context or use defaults
283
+ trackEvent(AnalyticsEvents.BOUNCER_HAIKU_REVIEW, { operation_length: operation.length });
340
284
  const claudeCommand = process.env.CLAUDE_COMMAND || 'claude';
341
285
  const workingDir = request.context?.workingDirectory || process.cwd();
342
286
  try {
343
287
  const decision = await analyzeWithHaiku(request, claudeCommand, workingDir);
344
- const latencyMs = Math.round(performance.now() - startTime);
345
- console.error(`[Bouncer] ✓ Haiku decision: ${decision.decision} (${decision.confidence}% confidence) [${latencyMs}ms]`);
288
+ console.error(`[Bouncer] Haiku decision: ${decision.decision} (${decision.confidence}% confidence) [${Math.round(performance.now() - startTime)}ms]`);
346
289
  console.error(`[Bouncer] Reasoning: ${decision.reasoning}`);
347
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'haiku-ai', latencyMs });
348
- trackEvent(decision.decision === 'deny' ? AnalyticsEvents.BOUNCER_TOOL_DENIED : AnalyticsEvents.BOUNCER_TOOL_ALLOWED, {
349
- layer: 'haiku-ai',
350
- operation_length: operation.length,
351
- threat_level: decision.threatLevel,
352
- confidence: decision.confidence,
353
- latency_ms: latencyMs,
354
- });
355
- cacheDecision(operation, decision);
356
- return decision;
290
+ return fin(decision, 'haiku-ai');
357
291
  }
358
292
  catch (error) {
359
- const latencyMs = Math.round(performance.now() - startTime);
360
293
  const errorMessage = error instanceof Error ? error.message : String(error);
361
- const isTimeout = errorMessage.includes('timed out');
362
- if (isTimeout) {
363
- // Timeout: default to ALLOW — prefer availability over security stall,
364
- // since the user drove the interaction
294
+ if (errorMessage.includes('timed out')) {
365
295
  console.error(`[Bouncer] ⚠️ Haiku analysis timed out after ${HAIKU_TIMEOUT_MS}ms — defaulting to ALLOW`);
366
296
  captureException(error, { context: 'bouncer.haiku_timeout', operation });
367
- const decision = {
368
- decision: 'allow',
369
- confidence: 50,
370
- reasoning: `Security analysis timed out after ${HAIKU_TIMEOUT_MS}ms. Defaulting to allow — user initiated the action.`,
371
- threatLevel: 'medium'
372
- };
373
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'haiku-timeout', latencyMs, error: errorMessage });
374
- trackEvent(AnalyticsEvents.BOUNCER_TOOL_ALLOWED, {
375
- layer: 'haiku-timeout',
376
- operation_length: operation.length,
377
- threat_level: 'medium',
378
- confidence: 50,
379
- latency_ms: latencyMs,
380
- });
381
- return decision;
297
+ return fin({ decision: 'allow', confidence: 50, reasoning: `Security analysis timed out after ${HAIKU_TIMEOUT_MS}ms. Defaulting to allow — user initiated the action.`, threatLevel: 'medium' }, 'haiku-timeout', { skipCache: true });
382
298
  }
383
299
  console.error(`[Bouncer] ⚠️ Haiku analysis failed: ${errorMessage}`);
384
300
  captureException(error, { context: 'bouncer.haiku_analysis', operation });
385
- // Fail-safe: deny on non-timeout AI failure
386
- const decision = {
387
- decision: 'deny',
388
- confidence: 0,
389
- reasoning: `Security analysis failed: ${errorMessage}. Denying for safety.`,
390
- threatLevel: 'critical'
391
- };
392
- logBouncerDecision(operation, decision.decision, decision.confidence, decision.reasoning, { context: request.context, threatLevel: decision.threatLevel, layer: 'ai-error', latencyMs, error: errorMessage });
393
- return decision;
301
+ return fin({ decision: 'deny', confidence: 0, reasoning: `Security analysis failed: ${errorMessage}. Denying for safety.`, threatLevel: 'critical' }, 'ai-error', { skipCache: true, skipAnalytics: true, error: errorMessage });
394
302
  }
395
303
  }
396
304
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bouncer-integration.js","sourceRoot":"","sources":["../../../server/mcp/bouncer-integration.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bouncer-integration.js","sourceRoot":"","sources":["../../../server/mcp/bouncer-integration.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../server/services/platform.ts"],"names":[],"mappings":"AAkFA;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAwBD,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,OAAO,CAAC,iBAAiB,CAA8C;gBAGrE,gBAAgB,EAAE,MAAM,EACxB,SAAS,GAAE,mBAAwB,EACnC,WAAW,CAAC,EAAE,MAAM;IAOtB;;OAEG;YACW,iBAAiB;IA6B/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAuHf,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAM5B;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,UAAU,IAAI,IAAI;CAoBnB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../server/services/platform.ts"],"names":[],"mappings":"AAkFA;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAM7C;AAcD,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9C;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAA8C;IAC1E,OAAO,CAAC,iBAAiB,CAA8C;gBAGrE,gBAAgB,EAAE,MAAM,EACxB,SAAS,GAAE,mBAAwB,EACnC,WAAW,CAAC,EAAE,MAAM;IAOtB;;OAEG;YACW,iBAAiB;IA6B/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAuHf,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAM5B;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,UAAU,IAAI,IAAI;CAoBnB"}
@@ -84,19 +84,8 @@ else {
84
84
  const { default: WS } = await import('ws');
85
85
  WebSocketImpl = WS;
86
86
  }
87
- // Read SERVER_URL from ~/.mstro/.env if it exists (for local dev)
88
- function getServerUrl() {
89
- try {
90
- const envPath = join(MSTRO_DIR, '.env');
91
- const content = readFileSync(envPath, 'utf-8');
92
- const match = content.match(/^SERVER_URL=(.+)$/m);
93
- if (match)
94
- return match[1].trim();
95
- }
96
- catch { }
97
- return 'https://api.mstro.app';
98
- }
99
- const DEFAULT_PLATFORM_URL = process.env.PLATFORM_URL || getServerUrl();
87
+ // PLATFORM_URL is set via --server / --dev flag in mstro.js
88
+ const DEFAULT_PLATFORM_URL = process.env.PLATFORM_URL || 'https://api.mstro.app';
100
89
  /**
101
90
  * Platform WebSocket connection with token-based authentication
102
91
  */