mstro-app 0.3.7 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -8
- package/bin/mstro.js +54 -15
- package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
- package/dist/server/cli/headless/claude-invoker.js +18 -9
- package/dist/server/cli/headless/claude-invoker.js.map +1 -1
- package/dist/server/cli/headless/headless-logger.d.ts +10 -0
- package/dist/server/cli/headless/headless-logger.d.ts.map +1 -0
- package/dist/server/cli/headless/headless-logger.js +66 -0
- package/dist/server/cli/headless/headless-logger.js.map +1 -0
- package/dist/server/cli/headless/mcp-config.d.ts.map +1 -1
- package/dist/server/cli/headless/mcp-config.js +6 -5
- package/dist/server/cli/headless/mcp-config.js.map +1 -1
- package/dist/server/cli/headless/runner.d.ts.map +1 -1
- package/dist/server/cli/headless/runner.js +4 -0
- package/dist/server/cli/headless/runner.js.map +1 -1
- package/dist/server/cli/headless/stall-assessor.d.ts +21 -0
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +74 -20
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.d.ts +0 -12
- package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.js +30 -9
- package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
- package/dist/server/cli/headless/types.d.ts +8 -1
- package/dist/server/cli/headless/types.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +16 -0
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +94 -11
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/index.js +0 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-cli.d.ts +3 -0
- package/dist/server/mcp/bouncer-cli.d.ts.map +1 -0
- package/dist/server/mcp/bouncer-cli.js +54 -0
- package/dist/server/mcp/bouncer-cli.js.map +1 -0
- package/dist/server/mcp/bouncer-integration.d.ts +2 -0
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +55 -39
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/bouncer-sandbox.d.ts +60 -0
- package/dist/server/mcp/bouncer-sandbox.d.ts.map +1 -0
- package/dist/server/mcp/bouncer-sandbox.js +182 -0
- package/dist/server/mcp/bouncer-sandbox.js.map +1 -0
- package/dist/server/mcp/security-patterns.d.ts +6 -12
- package/dist/server/mcp/security-patterns.d.ts.map +1 -1
- package/dist/server/mcp/security-patterns.js +197 -10
- package/dist/server/mcp/security-patterns.js.map +1 -1
- package/dist/server/services/plan/composer.d.ts +4 -0
- package/dist/server/services/plan/composer.d.ts.map +1 -0
- package/dist/server/services/plan/composer.js +181 -0
- package/dist/server/services/plan/composer.js.map +1 -0
- package/dist/server/services/plan/dependency-resolver.d.ts +28 -0
- package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -0
- package/dist/server/services/plan/dependency-resolver.js +152 -0
- package/dist/server/services/plan/dependency-resolver.js.map +1 -0
- package/dist/server/services/plan/executor.d.ts +91 -0
- package/dist/server/services/plan/executor.d.ts.map +1 -0
- package/dist/server/services/plan/executor.js +545 -0
- package/dist/server/services/plan/executor.js.map +1 -0
- package/dist/server/services/plan/parser.d.ts +11 -0
- package/dist/server/services/plan/parser.d.ts.map +1 -0
- package/dist/server/services/plan/parser.js +415 -0
- package/dist/server/services/plan/parser.js.map +1 -0
- package/dist/server/services/plan/state-reconciler.d.ts +2 -0
- package/dist/server/services/plan/state-reconciler.d.ts.map +1 -0
- package/dist/server/services/plan/state-reconciler.js +105 -0
- package/dist/server/services/plan/state-reconciler.js.map +1 -0
- package/dist/server/services/plan/types.d.ts +120 -0
- package/dist/server/services/plan/types.d.ts.map +1 -0
- package/dist/server/services/plan/types.js +4 -0
- package/dist/server/services/plan/types.js.map +1 -0
- package/dist/server/services/plan/watcher.d.ts +14 -0
- package/dist/server/services/plan/watcher.d.ts.map +1 -0
- package/dist/server/services/plan/watcher.js +69 -0
- package/dist/server/services/plan/watcher.js.map +1 -0
- package/dist/server/services/websocket/file-explorer-handlers.js +20 -0
- package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler.d.ts +0 -1
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +28 -2
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/plan-handlers.d.ts +6 -0
- package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/plan-handlers.js +494 -0
- package/dist/server/services/websocket/plan-handlers.js.map +1 -0
- package/dist/server/services/websocket/quality-handlers.d.ts +4 -0
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-handlers.js +470 -0
- package/dist/server/services/websocket/quality-handlers.js.map +1 -0
- package/dist/server/services/websocket/quality-persistence.d.ts +45 -0
- package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-persistence.js +187 -0
- package/dist/server/services/websocket/quality-persistence.js.map +1 -0
- package/dist/server/services/websocket/quality-service.d.ts +54 -0
- package/dist/server/services/websocket/quality-service.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-service.js +816 -0
- package/dist/server/services/websocket/quality-service.js.map +1 -0
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +23 -0
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +2 -2
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/server/cli/headless/claude-invoker.ts +21 -9
- package/server/cli/headless/headless-logger.ts +78 -0
- package/server/cli/headless/mcp-config.ts +6 -5
- package/server/cli/headless/runner.ts +4 -0
- package/server/cli/headless/stall-assessor.ts +101 -20
- package/server/cli/headless/tool-watchdog.ts +18 -9
- package/server/cli/headless/types.ts +10 -1
- package/server/cli/improvisation-session-manager.ts +118 -11
- package/server/index.ts +0 -4
- package/server/mcp/bouncer-cli.ts +73 -0
- package/server/mcp/bouncer-integration.ts +66 -44
- package/server/mcp/bouncer-sandbox.ts +214 -0
- package/server/mcp/security-patterns.ts +206 -10
- package/server/services/plan/composer.ts +199 -0
- package/server/services/plan/dependency-resolver.ts +179 -0
- package/server/services/plan/executor.ts +604 -0
- package/server/services/plan/parser.ts +459 -0
- package/server/services/plan/state-reconciler.ts +132 -0
- package/server/services/plan/types.ts +164 -0
- package/server/services/plan/watcher.ts +73 -0
- package/server/services/websocket/file-explorer-handlers.ts +20 -0
- package/server/services/websocket/handler.ts +28 -2
- package/server/services/websocket/plan-handlers.ts +592 -0
- package/server/services/websocket/quality-handlers.ts +570 -0
- package/server/services/websocket/quality-persistence.ts +250 -0
- package/server/services/websocket/quality-service.ts +975 -0
- package/server/services/websocket/session-handlers.ts +26 -0
- package/server/services/websocket/types.ts +62 -2
|
@@ -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,11 +107,36 @@ 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'
|
|
115
|
+
| 'qualityFixIssues'
|
|
116
|
+
| 'qualityLoadState'
|
|
117
|
+
| 'qualitySaveDirectories'
|
|
110
118
|
// File upload message types (chunked remote uploads)
|
|
111
119
|
| 'fileUploadStart'
|
|
112
120
|
| 'fileUploadChunk'
|
|
113
121
|
| 'fileUploadComplete'
|
|
114
|
-
| 'fileUploadCancel'
|
|
122
|
+
| 'fileUploadCancel'
|
|
123
|
+
// Plan message types
|
|
124
|
+
| 'planInit'
|
|
125
|
+
| 'planGetState'
|
|
126
|
+
| 'planListIssues'
|
|
127
|
+
| 'planGetIssue'
|
|
128
|
+
| 'planGetSprint'
|
|
129
|
+
| 'planGetMilestone'
|
|
130
|
+
| 'planCreateIssue'
|
|
131
|
+
| 'planUpdateIssue'
|
|
132
|
+
| 'planDeleteIssue'
|
|
133
|
+
| 'planScaffold'
|
|
134
|
+
| 'planPrompt'
|
|
135
|
+
| 'planExecute'
|
|
136
|
+
| 'planExecuteEpic'
|
|
137
|
+
| 'planPause'
|
|
138
|
+
| 'planStop'
|
|
139
|
+
| 'planResume';
|
|
115
140
|
tabId?: string;
|
|
116
141
|
terminalId?: string;
|
|
117
142
|
// biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads
|
|
@@ -219,10 +244,45 @@ export interface WebSocketResponse {
|
|
|
219
244
|
// Settings response types
|
|
220
245
|
| 'settings'
|
|
221
246
|
| 'settingsUpdated'
|
|
247
|
+
// Quality response types
|
|
248
|
+
| 'qualityToolsDetected'
|
|
249
|
+
| 'qualityScanProgress'
|
|
250
|
+
| 'qualityScanResults'
|
|
251
|
+
| 'qualityInstallProgress'
|
|
252
|
+
| 'qualityInstallComplete'
|
|
253
|
+
| 'qualityCodeReview'
|
|
254
|
+
| 'qualityCodeReviewProgress'
|
|
255
|
+
| 'qualityPostSession'
|
|
256
|
+
| 'qualityFixProgress'
|
|
257
|
+
| 'qualityFixComplete'
|
|
258
|
+
| 'qualityError'
|
|
259
|
+
| 'qualityStateLoaded'
|
|
222
260
|
// File upload response types
|
|
223
261
|
| 'fileUploadAck'
|
|
224
262
|
| 'fileUploadReady'
|
|
225
|
-
| 'fileUploadError'
|
|
263
|
+
| 'fileUploadError'
|
|
264
|
+
// Plan response types
|
|
265
|
+
| 'planState'
|
|
266
|
+
| 'planIssueList'
|
|
267
|
+
| 'planIssue'
|
|
268
|
+
| 'planSprint'
|
|
269
|
+
| 'planMilestone'
|
|
270
|
+
| 'planNotFound'
|
|
271
|
+
| 'planStateUpdated'
|
|
272
|
+
| 'planIssueUpdated'
|
|
273
|
+
| 'planIssueCreated'
|
|
274
|
+
| 'planIssueDeleted'
|
|
275
|
+
| 'planScaffolded'
|
|
276
|
+
| 'planPromptStreaming'
|
|
277
|
+
| 'planPromptProgress'
|
|
278
|
+
| 'planPromptResponse'
|
|
279
|
+
| 'planExecutionStarted'
|
|
280
|
+
| 'planExecutionProgress'
|
|
281
|
+
| 'planExecutionOutput'
|
|
282
|
+
| 'planExecutionMetrics'
|
|
283
|
+
| 'planExecutionComplete'
|
|
284
|
+
| 'planExecutionError'
|
|
285
|
+
| 'planError';
|
|
226
286
|
tabId?: string;
|
|
227
287
|
terminalId?: string;
|
|
228
288
|
// biome-ignore lint/suspicious/noExplicitAny: message envelope carries heterogeneous payloads
|