mstro-app 0.3.6 → 0.3.8

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 (74) hide show
  1. package/README.md +4 -8
  2. package/bin/mstro.js +54 -15
  3. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  4. package/dist/server/cli/headless/claude-invoker.js +10 -6
  5. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  6. package/dist/server/cli/headless/runner.d.ts +6 -1
  7. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  8. package/dist/server/cli/headless/runner.js +20 -10
  9. package/dist/server/cli/headless/runner.js.map +1 -1
  10. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  11. package/dist/server/cli/headless/stall-assessor.js +4 -1
  12. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  13. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
  14. package/dist/server/cli/headless/tool-watchdog.js +8 -0
  15. package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
  16. package/dist/server/cli/improvisation-session-manager.d.ts +8 -1
  17. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  18. package/dist/server/cli/improvisation-session-manager.js +45 -3
  19. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  20. package/dist/server/index.js +0 -4
  21. package/dist/server/index.js.map +1 -1
  22. package/dist/server/mcp/bouncer-integration.d.ts +2 -0
  23. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  24. package/dist/server/mcp/bouncer-integration.js +55 -39
  25. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  26. package/dist/server/mcp/bouncer-sandbox.d.ts +60 -0
  27. package/dist/server/mcp/bouncer-sandbox.d.ts.map +1 -0
  28. package/dist/server/mcp/bouncer-sandbox.js +182 -0
  29. package/dist/server/mcp/bouncer-sandbox.js.map +1 -0
  30. package/dist/server/mcp/security-patterns.d.ts +6 -12
  31. package/dist/server/mcp/security-patterns.d.ts.map +1 -1
  32. package/dist/server/mcp/security-patterns.js +197 -10
  33. package/dist/server/mcp/security-patterns.js.map +1 -1
  34. package/dist/server/services/platform.d.ts +6 -4
  35. package/dist/server/services/platform.d.ts.map +1 -1
  36. package/dist/server/services/platform.js +30 -11
  37. package/dist/server/services/platform.js.map +1 -1
  38. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  39. package/dist/server/services/terminal/pty-manager.js +3 -1
  40. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  41. package/dist/server/services/websocket/handler.d.ts +0 -1
  42. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  43. package/dist/server/services/websocket/handler.js +7 -2
  44. package/dist/server/services/websocket/handler.js.map +1 -1
  45. package/dist/server/services/websocket/quality-handlers.d.ts +4 -0
  46. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -0
  47. package/dist/server/services/websocket/quality-handlers.js +106 -0
  48. package/dist/server/services/websocket/quality-handlers.js.map +1 -0
  49. package/dist/server/services/websocket/quality-service.d.ts +54 -0
  50. package/dist/server/services/websocket/quality-service.d.ts.map +1 -0
  51. package/dist/server/services/websocket/quality-service.js +766 -0
  52. package/dist/server/services/websocket/quality-service.js.map +1 -0
  53. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  54. package/dist/server/services/websocket/session-handlers.js +23 -0
  55. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  56. package/dist/server/services/websocket/types.d.ts +2 -2
  57. package/dist/server/services/websocket/types.d.ts.map +1 -1
  58. package/package.json +2 -1
  59. package/server/cli/headless/claude-invoker.ts +7 -5
  60. package/server/cli/headless/runner.ts +17 -4
  61. package/server/cli/headless/stall-assessor.ts +4 -1
  62. package/server/cli/headless/tool-watchdog.ts +8 -0
  63. package/server/cli/improvisation-session-manager.ts +50 -3
  64. package/server/index.ts +0 -4
  65. package/server/mcp/bouncer-integration.ts +66 -44
  66. package/server/mcp/bouncer-sandbox.ts +214 -0
  67. package/server/mcp/security-patterns.ts +206 -10
  68. package/server/services/platform.ts +29 -11
  69. package/server/services/terminal/pty-manager.ts +3 -1
  70. package/server/services/websocket/handler.ts +7 -2
  71. package/server/services/websocket/quality-handlers.ts +140 -0
  72. package/server/services/websocket/quality-service.ts +922 -0
  73. package/server/services/websocket/session-handlers.ts +26 -0
  74. package/server/services/websocket/types.ts +14 -0
@@ -6,9 +6,29 @@ import { join } from 'node:path';
6
6
  import { type FileAttachment, ImprovisationSessionManager } from '../../cli/improvisation-session-manager.js';
7
7
  import { getModel } from '../settings.js';
8
8
  import type { HandlerContext } from './handler-context.js';
9
+ import { runQualityScan } from './quality-service.js';
9
10
  import type { SessionRegistry } from './session-registry.js';
10
11
  import type { WebSocketMessage, WSContext } from './types.js';
11
12
 
13
+ const WRITE_TOOL_NAMES = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit']);
14
+
15
+ function movementHadWrites(movement: Record<string, unknown>): boolean {
16
+ const history = movement.toolUseHistory as Array<{ toolName: string; result?: string; isError?: boolean }> | undefined;
17
+ if (!history) return false;
18
+ return history.some((t) => WRITE_TOOL_NAMES.has(t.toolName) && t.result !== undefined && !t.isError);
19
+ }
20
+
21
+ function triggerPostSessionQualityScan(ctx: HandlerContext, workingDir: string): void {
22
+ runQualityScan(workingDir).then((results) => {
23
+ ctx.broadcastToAll({
24
+ type: 'qualityPostSession',
25
+ data: { path: '.', results },
26
+ });
27
+ }).catch(() => {
28
+ // Quality scan failure should not affect session flow
29
+ });
30
+ }
31
+
12
32
  /** Convert tool history entries into OutputLine-compatible lines */
13
33
  function convertToolHistoryToLines(tools: Array<{ toolName: string; toolInput?: Record<string, unknown>; result?: string; isError?: boolean }>, ts: number): Array<Record<string, unknown>> {
14
34
  const lines: Array<Record<string, unknown>> = [];
@@ -104,6 +124,12 @@ export function setupSessionListeners(ctx: HandlerContext, session: Improvisatio
104
124
  movementId: `${movement.sequenceNumber}`
105
125
  });
106
126
  }
127
+
128
+ // Post-session quality gate: if the session wrote/edited files, re-scan
129
+ if (movementHadWrites(movement)) {
130
+ const scanDir = ctx.gitDirectories.get(tabId) || session.getSessionInfo().workingDir;
131
+ triggerPostSessionQualityScan(ctx, scanDir);
132
+ }
107
133
  });
108
134
 
109
135
  session.on('onMovementError', (error: Error) => {
@@ -107,6 +107,11 @@ export interface WebSocketMessage {
107
107
  // Settings message types
108
108
  | 'getSettings'
109
109
  | 'updateSettings'
110
+ // Quality message types
111
+ | 'qualityDetectTools'
112
+ | 'qualityScan'
113
+ | 'qualityInstallTools'
114
+ | 'qualityCodeReview'
110
115
  // File upload message types (chunked remote uploads)
111
116
  | 'fileUploadStart'
112
117
  | 'fileUploadChunk'
@@ -219,6 +224,15 @@ export interface WebSocketResponse {
219
224
  // Settings response types
220
225
  | 'settings'
221
226
  | 'settingsUpdated'
227
+ // Quality response types
228
+ | 'qualityToolsDetected'
229
+ | 'qualityScanProgress'
230
+ | 'qualityScanResults'
231
+ | 'qualityInstallProgress'
232
+ | 'qualityInstallComplete'
233
+ | 'qualityCodeReview'
234
+ | 'qualityPostSession'
235
+ | 'qualityError'
222
236
  // File upload response types
223
237
  | 'fileUploadAck'
224
238
  | 'fileUploadReady'