mstro-app 0.4.13 → 0.4.16

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 (77) hide show
  1. package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -1
  2. package/dist/server/cli/headless/claude-invoker-process.js +5 -1
  3. package/dist/server/cli/headless/claude-invoker-process.js.map +1 -1
  4. package/dist/server/services/file-explorer-ops.d.ts +1 -1
  5. package/dist/server/services/file-explorer-ops.d.ts.map +1 -1
  6. package/dist/server/services/file-explorer-ops.js +7 -2
  7. package/dist/server/services/file-explorer-ops.js.map +1 -1
  8. package/dist/server/services/plan/composer.d.ts +1 -1
  9. package/dist/server/services/plan/composer.d.ts.map +1 -1
  10. package/dist/server/services/plan/composer.js +3 -2
  11. package/dist/server/services/plan/composer.js.map +1 -1
  12. package/dist/server/services/plan/executor.d.ts +5 -0
  13. package/dist/server/services/plan/executor.d.ts.map +1 -1
  14. package/dist/server/services/plan/executor.js +32 -1
  15. package/dist/server/services/plan/executor.js.map +1 -1
  16. package/dist/server/services/plan/parser-core.d.ts.map +1 -1
  17. package/dist/server/services/plan/parser-core.js +1 -0
  18. package/dist/server/services/plan/parser-core.js.map +1 -1
  19. package/dist/server/services/plan/review-gate.d.ts +2 -0
  20. package/dist/server/services/plan/review-gate.d.ts.map +1 -1
  21. package/dist/server/services/plan/review-gate.js +25 -3
  22. package/dist/server/services/plan/review-gate.js.map +1 -1
  23. package/dist/server/services/plan/types.d.ts +2 -0
  24. package/dist/server/services/plan/types.d.ts.map +1 -1
  25. package/dist/server/services/sandbox-utils.d.ts +3 -1
  26. package/dist/server/services/sandbox-utils.d.ts.map +1 -1
  27. package/dist/server/services/sandbox-utils.js +6 -3
  28. package/dist/server/services/sandbox-utils.js.map +1 -1
  29. package/dist/server/services/websocket/file-explorer-handlers.js +2 -1
  30. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
  31. package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -1
  32. package/dist/server/services/websocket/git-log-handlers.js +29 -9
  33. package/dist/server/services/websocket/git-log-handlers.js.map +1 -1
  34. package/dist/server/services/websocket/git-worktree-handlers.js +8 -0
  35. package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -1
  36. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  37. package/dist/server/services/websocket/handler.js +5 -3
  38. package/dist/server/services/websocket/handler.js.map +1 -1
  39. package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -1
  40. package/dist/server/services/websocket/plan-execution-handlers.js +4 -1
  41. package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -1
  42. package/dist/server/services/websocket/plan-helpers.js +1 -1
  43. package/dist/server/services/websocket/plan-helpers.js.map +1 -1
  44. package/dist/server/services/websocket/quality-handlers.d.ts +1 -1
  45. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
  46. package/dist/server/services/websocket/quality-handlers.js +67 -14
  47. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  48. package/dist/server/services/websocket/quality-persistence.d.ts +2 -0
  49. package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
  50. package/dist/server/services/websocket/quality-persistence.js +33 -2
  51. package/dist/server/services/websocket/quality-persistence.js.map +1 -1
  52. package/dist/server/services/websocket/quality-review-agent.d.ts +33 -0
  53. package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
  54. package/dist/server/services/websocket/quality-review-agent.js +360 -72
  55. package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
  56. package/dist/server/services/websocket/quality-types.d.ts +3 -0
  57. package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
  58. package/dist/server/services/websocket/quality-types.js.map +1 -1
  59. package/package.json +1 -1
  60. package/server/cli/headless/claude-invoker-process.ts +6 -1
  61. package/server/services/file-explorer-ops.ts +7 -2
  62. package/server/services/plan/composer.ts +3 -1
  63. package/server/services/plan/executor.ts +32 -1
  64. package/server/services/plan/parser-core.ts +1 -0
  65. package/server/services/plan/review-gate.ts +28 -3
  66. package/server/services/plan/types.ts +2 -0
  67. package/server/services/sandbox-utils.ts +7 -3
  68. package/server/services/websocket/file-explorer-handlers.ts +2 -1
  69. package/server/services/websocket/git-log-handlers.ts +30 -9
  70. package/server/services/websocket/git-worktree-handlers.ts +9 -0
  71. package/server/services/websocket/handler.ts +6 -3
  72. package/server/services/websocket/plan-execution-handlers.ts +4 -1
  73. package/server/services/websocket/plan-helpers.ts +1 -1
  74. package/server/services/websocket/quality-handlers.ts +69 -9
  75. package/server/services/websocket/quality-persistence.ts +32 -2
  76. package/server/services/websocket/quality-review-agent.ts +427 -72
  77. package/server/services/websocket/quality-types.ts +3 -0
@@ -5,6 +5,8 @@
5
5
  *
6
6
  * Builds the review prompt, runs the agent, parses findings, and persists results.
7
7
  */
8
+ import { existsSync, readFileSync } from 'node:fs';
9
+ import { isAbsolute, join } from 'node:path';
8
10
  import { runWithFileLogger } from '../../cli/headless/headless-logger.js';
9
11
  import { HeadlessRunner } from '../../cli/headless/index.js';
10
12
  import { recomputeWithAiReview } from './quality-service.js';
@@ -45,11 +47,35 @@ ${cliFindingsSection}
45
47
  ### Performance
46
48
  - N+1 queries, unnecessary re-renders, missing memoization, blocking I/O in hot paths, unbounded data structures, missing pagination
47
49
 
50
+ ## CRITICAL — Structured Evidence Requirement
51
+
52
+ For EACH finding, you MUST provide structured evidence that grounds the finding in actual code. This is required to prevent false positives.
53
+
54
+ For each finding, use this reasoning process:
55
+
56
+ 1. **PREMISE**: State the observable fact from the code. Quote the exact code you see.
57
+ 2. **CONTEXT**: What is the surrounding code doing? Are there guards, fixes, or patterns elsewhere that might handle this?
58
+ 3. **COUNTER-CHECK**: Actively look for evidence that CONTRADICTS your finding. Check for:
59
+ - Guards or validation earlier in the call chain
60
+ - Error handling wrapping the code
61
+ - Configuration that changes behavior (e.g., NODE_ENV checks)
62
+ - Comments explaining intentional design choices
63
+ 4. **CONCLUSION**: Only report the finding if you could not find contradicting evidence.
64
+
65
+ ### Common False Positive Patterns to AVOID
66
+
67
+ - Claiming a function uses API X when it actually uses API Y (e.g., claiming Math.random() when code uses crypto.randomInt()) — ALWAYS quote the actual function call
68
+ - Claiming a header/value is leaked when code already deletes/filters it — READ the full function
69
+ - Claiming there's no guard when a condition check exists nearby — READ surrounding lines
70
+ - Claiming N fields/methods when the actual count differs — COUNT explicitly
71
+ - Claiming a resource leaks when cleanup exists in a different handler — SEARCH for the cleanup code
72
+
48
73
  ## Rules
49
74
 
50
- - Only report findings you are >80% confident about. No speculative or low-confidence issues.
75
+ - Only report findings you are >90% confident about after completing the counter-check step.
51
76
  - Focus on architecture, SOLID violations, bugs, and security over style nits.
52
77
  - Each finding MUST reference a specific file and line number. Do not report vague or file-level issues.
78
+ - Each finding MUST include an "evidence" field with the exact code snippet (1-5 lines) proving the issue exists.
53
79
  - Limit to the 25 most important findings, ranked by severity.
54
80
  - Do NOT modify any files. This is a read-only review.
55
81
  - Be HONEST about the overall quality. A codebase with serious issues should score low.
@@ -82,7 +108,8 @@ After your analysis, output EXACTLY one JSON code block with your findings. No o
82
108
  "line": 42,
83
109
  "title": "Short title describing the issue",
84
110
  "description": "What the problem is and why it matters.",
85
- "suggestion": "How to fix it."
111
+ "suggestion": "How to fix it.",
112
+ "evidence": "const token = Math.random().toString(36) // exact code from file proving the issue"
86
113
  }
87
114
  ],
88
115
  "summary": "Brief 1-2 sentence summary of overall code quality."
@@ -103,6 +130,7 @@ function normalizeFinding(f) {
103
130
  title: f.title,
104
131
  description: typeof f.description === 'string' ? f.description : '',
105
132
  suggestion: typeof f.suggestion === 'string' ? f.suggestion : undefined,
133
+ evidence: typeof f.evidence === 'string' ? f.evidence : undefined,
106
134
  };
107
135
  }
108
136
  function extractJson(response) {
@@ -133,6 +161,237 @@ export function parseCodeReviewResponse(response) {
133
161
  return { findings: [], summary: 'Failed to parse code review results.', score: null, grade: null, scoreRationale: null };
134
162
  }
135
163
  }
164
+ function resolveFilePath(dirPath, filePath) {
165
+ if (isAbsolute(filePath))
166
+ return filePath;
167
+ return join(dirPath, filePath);
168
+ }
169
+ /**
170
+ * Extract keywords/identifiers that the finding's description claims exist in the code.
171
+ * Looks for patterns like: "calls X()", "uses X", "X is called", "X at line N".
172
+ */
173
+ function extractClaimedIdentifiers(description, title) {
174
+ const identifiers = [];
175
+ const combined = `${title} ${description}`;
176
+ // Match function calls: functionName(), ClassName.method()
177
+ const callPatterns = combined.matchAll(/\b([a-zA-Z_$][\w.$]*)\s*\(/g);
178
+ for (const m of callPatterns) {
179
+ const name = m[1];
180
+ // Skip common English words that look like function calls
181
+ if (!['If', 'When', 'While', 'For', 'This', 'That', 'The', 'Each', 'Uses', 'Has', 'Does', 'Returns', 'Takes', 'Calls'].includes(name)) {
182
+ identifiers.push(name);
183
+ }
184
+ }
185
+ // Match backtick-quoted code: `someCode`
186
+ const backtickPatterns = combined.matchAll(/`([^`]+)`/g);
187
+ for (const m of backtickPatterns) {
188
+ // Extract identifiers from the backtick content
189
+ const inner = m[1].replace(/[()[\]{};,]/g, ' ').trim();
190
+ if (inner && inner.length < 60) {
191
+ identifiers.push(inner);
192
+ }
193
+ }
194
+ return identifiers;
195
+ }
196
+ /**
197
+ * Validate findings against the actual filesystem. Returns findings annotated
198
+ * with validation results. Does NOT remove findings — only marks them.
199
+ */
200
+ export function validateFindings(findings, dirPath) {
201
+ const validated = [];
202
+ const rejected = [];
203
+ for (const finding of findings) {
204
+ const result = validateSingleFinding(finding, dirPath);
205
+ if (result.valid) {
206
+ validated.push({ ...finding, verified: undefined }); // Don't mark yet — Phase 2 does that
207
+ }
208
+ else {
209
+ rejected.push({ ...finding, verified: false, verificationNote: result.reason });
210
+ }
211
+ }
212
+ return {
213
+ validated,
214
+ rejected,
215
+ stats: { total: findings.length, passed: validated.length, failed: rejected.length },
216
+ };
217
+ }
218
+ function readFileContent(filePath) {
219
+ try {
220
+ return readFileSync(filePath, 'utf-8');
221
+ }
222
+ catch {
223
+ return null;
224
+ }
225
+ }
226
+ const COMMON_KEYWORDS = /^(const|let|var|function|return|import|export|from|this|true|false|null|undefined|new|if|else|for|while|try|catch)$/;
227
+ function checkLineInRange(content, line) {
228
+ if (line === null || line <= 0)
229
+ return null;
230
+ const lineCount = content.split('\n').length;
231
+ if (line > lineCount)
232
+ return `Line ${line} exceeds file length (${lineCount} lines)`;
233
+ return null;
234
+ }
235
+ function checkEvidenceTokens(content, evidence) {
236
+ if (!evidence)
237
+ return null;
238
+ const evidenceTokens = evidence
239
+ .replace(/['"`;{}[\]()]/g, ' ')
240
+ .split(/\s+/)
241
+ .filter(t => t.length > 3 && !COMMON_KEYWORDS.test(t));
242
+ if (evidenceTokens.length === 0)
243
+ return null;
244
+ const matchCount = evidenceTokens.filter(token => content.includes(token)).length;
245
+ if (matchCount === 0)
246
+ return `Evidence tokens not found in file: ${evidenceTokens.slice(0, 3).join(', ')}`;
247
+ return null;
248
+ }
249
+ function checkClaimedIdentifiers(content, finding) {
250
+ const claimedIds = extractClaimedIdentifiers(finding.description, finding.title);
251
+ if (claimedIds.length < 2)
252
+ return null;
253
+ const foundAny = claimedIds.some(id => {
254
+ if (id.includes('.'))
255
+ return content.includes(id);
256
+ return new RegExp(`\\b${id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`).test(content);
257
+ });
258
+ if (!foundAny)
259
+ return `Claimed identifiers not found in file: ${claimedIds.slice(0, 3).join(', ')}`;
260
+ return null;
261
+ }
262
+ function validateSingleFinding(finding, dirPath) {
263
+ const filePath = resolveFilePath(dirPath, finding.file);
264
+ if (!existsSync(filePath)) {
265
+ return { finding, valid: false, reason: `File does not exist: ${finding.file}` };
266
+ }
267
+ const content = readFileContent(filePath);
268
+ if (!content)
269
+ return { finding, valid: true }; // Can't read — don't reject
270
+ const lineErr = checkLineInRange(content, finding.line);
271
+ if (lineErr)
272
+ return { finding, valid: false, reason: lineErr };
273
+ const evidenceErr = checkEvidenceTokens(content, finding.evidence);
274
+ if (evidenceErr)
275
+ return { finding, valid: false, reason: evidenceErr };
276
+ const idErr = checkClaimedIdentifiers(content, finding);
277
+ if (idErr)
278
+ return { finding, valid: false, reason: idErr };
279
+ return { finding, valid: true };
280
+ }
281
+ // ── Phase 2: LLM verification pass ──────────────────────────
282
+ //
283
+ // Runs a second headless Claude pass that independently verifies
284
+ // each finding against the actual code.
285
+ export function buildVerificationPrompt(dirPath, findings) {
286
+ const findingsJson = findings.map((f, i) => ({
287
+ id: i + 1,
288
+ severity: f.severity,
289
+ category: f.category,
290
+ file: f.file,
291
+ line: f.line,
292
+ title: f.title,
293
+ description: f.description,
294
+ evidence: f.evidence || '(none provided)',
295
+ }));
296
+ return `You are an independent code review VERIFIER. A separate reviewer produced the findings below. Your job is to VERIFY each finding against the actual code. You are a skeptic — do NOT trust the original reviewer's claims.
297
+
298
+ IMPORTANT: Your current working directory is "${dirPath}". Only read files within this directory.
299
+
300
+ ## Findings to Verify
301
+
302
+ ${JSON.stringify(findingsJson, null, 2)}
303
+
304
+ ## Verification Process
305
+
306
+ For EACH finding:
307
+
308
+ 1. **Read the cited file and line** using the Read tool. Read at least 20 lines around the cited line for context.
309
+ 2. **Check the specific claim** in the description. Does the code actually do what the finding claims?
310
+ 3. **Search for counter-evidence**:
311
+ - If the finding claims something is missing (no validation, no cleanup, no guard): search for it with Grep
312
+ - If the finding claims an API is used: verify the actual API call at that line
313
+ - If the finding claims a value is leaked/exposed: check if it's filtered/deleted elsewhere in the same function
314
+ 4. **Verdict**: Mark as "confirmed" or "rejected" with a brief explanation
315
+
316
+ ## Rules
317
+
318
+ - You MUST actually Read each cited file. Do not rely on memory or assumptions.
319
+ - Use Grep to search for patterns the finding claims exist (or don't exist).
320
+ - A finding is "rejected" if:
321
+ - The code does NOT match what the description claims
322
+ - There IS a guard/fix that the finding claims is missing
323
+ - The line number doesn't contain the relevant code
324
+ - The finding is about a different version of the code than what exists now
325
+ - A finding is "confirmed" if you can independently verify the issue exists in the current code.
326
+ - Be thorough but efficient — focus verification effort on high/critical severity findings.
327
+
328
+ ## Output
329
+
330
+ Output EXACTLY one JSON code block. No other text after the JSON block.
331
+
332
+ \`\`\`json
333
+ {
334
+ "verifications": [
335
+ {
336
+ "id": 1,
337
+ "verdict": "confirmed|rejected",
338
+ "confidence": 0.95,
339
+ "note": "Brief explanation of what you found when checking the code"
340
+ }
341
+ ]
342
+ }
343
+ \`\`\``;
344
+ }
345
+ export function parseVerificationResponse(response) {
346
+ const jsonStr = extractJson(response);
347
+ try {
348
+ const parsed = JSON.parse(jsonStr);
349
+ const raw = Array.isArray(parsed.verifications) ? parsed.verifications : [];
350
+ return raw
351
+ .filter((v) => typeof v.id === 'number' && typeof v.verdict === 'string')
352
+ .map(v => ({
353
+ id: v.id,
354
+ verdict: v.verdict === 'rejected' ? 'rejected' : 'confirmed',
355
+ confidence: typeof v.confidence === 'number' ? v.confidence : 0.5,
356
+ note: typeof v.note === 'string' ? v.note : '',
357
+ }));
358
+ }
359
+ catch {
360
+ return [];
361
+ }
362
+ }
363
+ /**
364
+ * Apply verification verdicts to findings.
365
+ * Confirmed findings get verified=true. Rejected findings are removed.
366
+ */
367
+ export function applyVerification(findings, verdicts) {
368
+ const verdictMap = new Map(verdicts.map(v => [v.id, v]));
369
+ const verified = [];
370
+ const rejected = [];
371
+ for (let i = 0; i < findings.length; i++) {
372
+ const verdict = verdictMap.get(i + 1);
373
+ if (!verdict) {
374
+ // No verdict — keep finding but mark unverified
375
+ verified.push({ ...findings[i], verified: undefined });
376
+ continue;
377
+ }
378
+ if (verdict.verdict === 'confirmed' && verdict.confidence >= 0.6) {
379
+ verified.push({
380
+ ...findings[i],
381
+ verified: true,
382
+ verificationNote: verdict.note || undefined,
383
+ });
384
+ }
385
+ else {
386
+ rejected.push({
387
+ ...findings[i],
388
+ verified: false,
389
+ verificationNote: verdict.note || undefined,
390
+ });
391
+ }
392
+ }
393
+ return { verified, rejected };
394
+ }
136
395
  // ── Progress tracking ─────────────────────────────────────────
137
396
  const TOOL_START_MESSAGES = {
138
397
  Glob: 'Discovering project files...',
@@ -166,102 +425,131 @@ function createCodeReviewProgressTracker() {
166
425
  return null;
167
426
  };
168
427
  }
428
+ function makeProgressSender(ctx, ws, reportPath) {
429
+ return (message) => {
430
+ ctx.send(ws, { type: 'qualityCodeReviewProgress', data: { path: reportPath, message } });
431
+ };
432
+ }
433
+ function makeToolCallback(send, prefix) {
434
+ const getProgressMessage = createCodeReviewProgressTracker();
435
+ return (event) => {
436
+ const message = getProgressMessage(event);
437
+ if (message)
438
+ send(prefix ? `${prefix}${message}` : message);
439
+ };
440
+ }
441
+ function loadCliFindings(getPersistence, workingDir, reportPath) {
442
+ try {
443
+ const persistence = getPersistence(workingDir);
444
+ const existingReport = persistence.loadReport(reportPath);
445
+ return existingReport?.findings;
446
+ }
447
+ catch {
448
+ return undefined;
449
+ }
450
+ }
451
+ async function runVerificationPass(dirPath, findings, send) {
452
+ send(`Verifying ${findings.length} findings against actual code...`);
453
+ const verificationRunner = new HeadlessRunner({
454
+ workingDir: dirPath,
455
+ directPrompt: buildVerificationPrompt(dirPath, findings),
456
+ stallWarningMs: 120_000,
457
+ stallKillMs: 300_000,
458
+ stallHardCapMs: 600_000,
459
+ toolUseCallback: makeToolCallback(send, 'Verifying: '),
460
+ });
461
+ const verifyResult = await runWithFileLogger('code-review-verify', () => verificationRunner.run());
462
+ const verdicts = parseVerificationResponse(verifyResult.assistantResponse || '');
463
+ if (verdicts.length === 0)
464
+ return findings; // No verdicts — keep all as-is
465
+ const { verified, rejected } = applyVerification(findings, verdicts);
466
+ if (rejected.length > 0) {
467
+ send(`Verification rejected ${rejected.length} inaccurate finding(s)`);
468
+ }
469
+ return verified;
470
+ }
471
+ function persistReviewResults(reviewResult, reportPath, getPersistence, workingDir) {
472
+ const persistence = getPersistence(workingDir);
473
+ const existingReport = persistence.loadReport(reportPath);
474
+ if (!existingReport) {
475
+ persistence.saveCodeReview(reportPath, reviewResult.findings, reviewResult.summary);
476
+ return null;
477
+ }
478
+ let updatedResults;
479
+ if (reviewResult.score !== null && reviewResult.grade !== null) {
480
+ updatedResults = {
481
+ ...existingReport,
482
+ overall: reviewResult.score,
483
+ grade: reviewResult.grade,
484
+ codeReview: reviewResult.findings,
485
+ scoreRationale: reviewResult.scoreRationale ?? undefined,
486
+ };
487
+ }
488
+ else {
489
+ updatedResults = recomputeWithAiReview(existingReport, reviewResult.findings);
490
+ updatedResults = { ...updatedResults, codeReview: reviewResult.findings };
491
+ }
492
+ persistence.saveReport(reportPath, updatedResults);
493
+ persistence.appendHistory(updatedResults, reportPath);
494
+ persistence.saveCodeReview(reportPath, reviewResult.findings, reviewResult.summary);
495
+ return updatedResults;
496
+ }
169
497
  // ── Handler ───────────────────────────────────────────────────
170
498
  export async function handleCodeReview(ctx, ws, reportPath, dirPath, workingDir, activeReviews, getPersistence) {
171
499
  if (activeReviews.has(dirPath)) {
172
- ctx.send(ws, {
173
- type: 'qualityError',
174
- data: { path: reportPath, error: 'A code review is already running for this directory.' },
175
- });
500
+ ctx.send(ws, { type: 'qualityError', data: { path: reportPath, error: 'A code review is already running for this directory.' } });
176
501
  return;
177
502
  }
178
503
  activeReviews.add(dirPath);
504
+ const send = makeProgressSender(ctx, ws, reportPath);
179
505
  try {
180
- ctx.send(ws, {
181
- type: 'qualityCodeReviewProgress',
182
- data: { path: reportPath, message: 'Starting AI code review...' },
183
- });
184
- // Load CLI findings from the existing report to pass to the AI reviewer
185
- let cliFindings;
186
- try {
187
- const persistence = getPersistence(workingDir);
188
- const existingReport = persistence.loadReport(reportPath);
189
- if (existingReport?.findings) {
190
- cliFindings = existingReport.findings;
191
- }
192
- }
193
- catch {
194
- // Continue without CLI findings if persistence fails
195
- }
506
+ send('Starting AI code review...');
507
+ const cliFindings = loadCliFindings(getPersistence, workingDir, reportPath);
508
+ // ── Pass 1: Initial AI code review ──────────────────────
196
509
  const runner = new HeadlessRunner({
197
510
  workingDir: dirPath,
198
511
  directPrompt: buildCodeReviewPrompt(dirPath, cliFindings),
199
512
  stallWarningMs: 120_000,
200
513
  stallKillMs: 600_000,
201
514
  stallHardCapMs: 900_000,
202
- toolUseCallback: (() => {
203
- const getProgressMessage = createCodeReviewProgressTracker();
204
- return (event) => {
205
- const message = getProgressMessage(event);
206
- if (message) {
207
- ctx.send(ws, {
208
- type: 'qualityCodeReviewProgress',
209
- data: { path: reportPath, message },
210
- });
211
- }
212
- };
213
- })(),
214
- });
215
- ctx.send(ws, {
216
- type: 'qualityCodeReviewProgress',
217
- data: { path: reportPath, message: 'Claude is analyzing your codebase...' },
515
+ toolUseCallback: makeToolCallback(send),
218
516
  });
517
+ send('Claude is analyzing your codebase...');
219
518
  const result = await runWithFileLogger('code-review', () => runner.run());
220
- ctx.send(ws, {
221
- type: 'qualityCodeReviewProgress',
222
- data: { path: reportPath, message: 'Generating review report...' },
223
- });
224
- const responseText = result.assistantResponse || '';
225
- const reviewResult = parseCodeReviewResponse(responseText);
226
- // Use AI-determined score if available, otherwise fall back to recomputation
519
+ const reviewResult = parseCodeReviewResponse(result.assistantResponse || '');
520
+ // ── Phase 3: Deterministic post-validation ──────────────
521
+ send(`Validating ${reviewResult.findings.length} findings against codebase...`);
522
+ const validation = validateFindings(reviewResult.findings, dirPath);
523
+ if (validation.stats.failed > 0) {
524
+ send(`Filtered ${validation.stats.failed} finding(s) with invalid references`);
525
+ }
526
+ // ── Phase 2: LLM verification pass ──────────────────────
527
+ let finalFindings = validation.validated;
528
+ if (finalFindings.length > 0) {
529
+ try {
530
+ finalFindings = await runVerificationPass(dirPath, finalFindings, send);
531
+ }
532
+ catch {
533
+ send('Verification pass skipped (timeout or error)');
534
+ }
535
+ }
536
+ // ── Persist and send results ─────────────────────────────
537
+ send('Generating review report...');
538
+ const verifiedReviewResult = { ...reviewResult, findings: finalFindings };
227
539
  let updatedResults = null;
228
540
  try {
229
- const persistence = getPersistence(workingDir);
230
- const existingReport = persistence.loadReport(reportPath);
231
- if (existingReport) {
232
- if (reviewResult.score !== null && reviewResult.grade !== null) {
233
- // Use the AI-determined score and grade directly
234
- updatedResults = {
235
- ...existingReport,
236
- overall: reviewResult.score,
237
- grade: reviewResult.grade,
238
- codeReview: reviewResult.findings,
239
- scoreRationale: reviewResult.scoreRationale ?? undefined,
240
- };
241
- }
242
- else {
243
- // Fallback: recompute with weighted formula
244
- updatedResults = recomputeWithAiReview(existingReport, reviewResult.findings);
245
- updatedResults = { ...updatedResults, codeReview: reviewResult.findings };
246
- }
247
- persistence.saveReport(reportPath, updatedResults);
248
- persistence.appendHistory(updatedResults, reportPath);
249
- }
250
- persistence.saveCodeReview(reportPath, reviewResult.findings, reviewResult.summary);
541
+ updatedResults = persistReviewResults(verifiedReviewResult, reportPath, getPersistence, workingDir);
251
542
  }
252
543
  catch {
253
544
  // Persistence failure should not break the review flow
254
545
  }
255
546
  ctx.send(ws, {
256
547
  type: 'qualityCodeReview',
257
- data: { path: reportPath, findings: reviewResult.findings, summary: reviewResult.summary, results: updatedResults },
548
+ data: { path: reportPath, findings: verifiedReviewResult.findings, summary: verifiedReviewResult.summary, results: updatedResults },
258
549
  });
259
550
  }
260
551
  catch (error) {
261
- ctx.send(ws, {
262
- type: 'qualityError',
263
- data: { path: reportPath, error: error instanceof Error ? error.message : String(error) },
264
- });
552
+ ctx.send(ws, { type: 'qualityError', data: { path: reportPath, error: error instanceof Error ? error.message : String(error) } });
265
553
  }
266
554
  finally {
267
555
  activeReviews.delete(dirPath);
@@ -1 +1 @@
1
- {"version":3,"file":"quality-review-agent.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-review-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quality-review-agent.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-review-agent.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,9 @@ export interface QualityFinding {
21
21
  title: string;
22
22
  description: string;
23
23
  suggestion?: string;
24
+ evidence?: string;
25
+ verified?: boolean;
26
+ verificationNote?: string;
24
27
  }
25
28
  export interface QualityResults {
26
29
  overall: number;
@@ -1 +1 @@
1
- {"version":3,"file":"quality-types.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quality-types.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quality-types.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quality-types.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-types.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAiEhE,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,uBAAuB,EAAE;QAClH,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,+BAA+B,EAAE;QACjI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,yBAAyB,EAAE;QAC3H,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,2BAA2B,EAAE;KACzH;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,0CAA0C,EAAE;QAC1H,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,4CAA4C,EAAE;QACjI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,4CAA4C,EAAE;KACnI;IACD,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,6BAA6B,EAAE;QAC1H,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,8BAA8B,EAAE;KACxH;IACD,EAAE,EAAE;QACF,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,4EAA4E,EAAE;QAC9K,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE;KACnG;IACD,KAAK,EAAE;QACL,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,wBAAwB,EAAE;QAClH,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,0BAA0B,EAAE;KAC5H;IACD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE;QACzG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE;KAC1G;IACD,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC5C,KAAK,EAAE,MAAM;IACb,KAAK;IACL,KAAK;IACL,OAAO,EAAE,KAAK;IACd,KAAK;IACL,KAAK;IACL,MAAM;IACN,QAAQ;IACR,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAC3B,CAAC,CAAC;AAEH,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACzC,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,UAAU;IACV,eAAe;IACf,cAAc;IACd,YAAY;IACZ,aAAa;IACb,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,MAAM,UAAU,0BAA0B,CACxC,YAAyB,EACzB,UAAuB,EACvB,QAAiC;IAEjC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,CAA0B;IACpE,OAAO,CAAE,CAAC,CAAC,QAAmB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiC;IACtE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAA0B,EAAE,QAAoC;IACjG,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,QAAkB,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAA+C,CAAC;IACnE,MAAM,IAAI,GAAI,QAAQ,EAAE,IAAgC,IAAI,EAAE,CAAC;IAC/D,MAAM,KAAK,GAAI,IAAI,CAAC,KAAiC,IAAI,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,CAAC,CAAC,OAAuD,CAAC;IAC1E,MAAM,IAAI,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAE,OAAO,EAAE,IAAe,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACvF,MAAM,QAAQ,GAAG,CAAE,CAAC,CAAC,QAAmB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;IAC5E,OAAO;QACL,QAAQ,EAAE,GAAG;QACb,QAAQ;QACR,IAAI,EAAG,QAAQ,EAAE,IAAe,IAAI,EAAE;QACtC,IAAI,EAAG,KAAK,CAAC,IAAe,IAAI,IAAI;QACpC,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mstro-app",
3
- "version": "0.4.13",
3
+ "version": "0.4.16",
4
4
  "description": "Run Claude Code from any browser - streams live sessions from your machine to mstro.app",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -95,6 +95,11 @@ export function buildClaudeArgs(
95
95
  // Reduce Edit-without-Read errors by reminding the model
96
96
  args.push('--append-system-prompt', 'IMPORTANT: Always use the Read tool to read a file before using Edit or Write on it. Never edit a file you have not read in this session.');
97
97
 
98
+ // Sandboxed sessions: restrict all file operations to the working directory
99
+ if (config.sandboxed) {
100
+ args.push('--append-system-prompt', `SECURITY: You are running in sandboxed mode for a shared user. You MUST NOT read, write, list, or access any files or directories outside the working directory (${config.workingDir}). This includes home directories, /etc, /tmp, /proc, and any path that does not start with ${config.workingDir}. If asked to access files outside this boundary, refuse the request and explain that access is restricted to the project directory.`);
101
+ }
102
+
98
103
  if (!hasImageAttachments) {
99
104
  // Strip null bytes — Node.js spawn rejects args containing \0
100
105
  args.push(prompt.replaceAll('\0', ''));
@@ -147,7 +152,7 @@ export function spawnAndRegister(
147
152
  );
148
153
 
149
154
  const baseEnv = config.sandboxed
150
- ? sanitizeEnvForSandbox(process.env, config.workingDir)
155
+ ? sanitizeEnvForSandbox(process.env, config.workingDir, { overrideHome: false })
151
156
  : { ...process.env };
152
157
  const spawnEnv = config.extraEnv
153
158
  ? { ...baseEnv, ...config.extraEnv }