mstro-app 0.5.1 → 0.5.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.
- package/PRIVACY.md +9 -9
- package/README.md +71 -28
- package/bin/commands/config.js +1 -1
- package/bin/mstro.js +55 -4
- package/dist/server/cli/eta-estimator.d.ts +55 -0
- package/dist/server/cli/eta-estimator.d.ts.map +1 -0
- package/dist/server/cli/eta-estimator.js +222 -0
- package/dist/server/cli/eta-estimator.js.map +1 -0
- package/dist/server/cli/headless/stall-assessor.d.ts +50 -0
- package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
- package/dist/server/cli/headless/stall-assessor.js +64 -9
- package/dist/server/cli/headless/stall-assessor.js.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.d.ts +21 -0
- package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
- package/dist/server/cli/headless/tool-watchdog.js +19 -12
- package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
- package/dist/server/cli/improvisation-history-store.d.ts.map +1 -1
- package/dist/server/cli/improvisation-history-store.js +5 -1
- package/dist/server/cli/improvisation-history-store.js.map +1 -1
- package/dist/server/cli/improvisation-output-queue.d.ts +5 -1
- package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -1
- package/dist/server/cli/improvisation-output-queue.js +30 -7
- package/dist/server/cli/improvisation-output-queue.js.map +1 -1
- package/dist/server/cli/improvisation-session-manager.d.ts +29 -0
- package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
- package/dist/server/cli/improvisation-session-manager.js +50 -1
- package/dist/server/cli/improvisation-session-manager.js.map +1 -1
- package/dist/server/cli/improvisation-types.d.ts +2 -0
- package/dist/server/cli/improvisation-types.d.ts.map +1 -1
- package/dist/server/cli/improvisation-types.js.map +1 -1
- package/dist/server/engines/EngineEvent.d.ts +126 -0
- package/dist/server/engines/EngineEvent.d.ts.map +1 -0
- package/dist/server/engines/EngineEvent.js +11 -0
- package/dist/server/engines/EngineEvent.js.map +1 -0
- package/dist/server/engines/claude/ClaudeCodeEngine.d.ts +47 -0
- package/dist/server/engines/claude/ClaudeCodeEngine.d.ts.map +1 -0
- package/dist/server/engines/claude/ClaudeCodeEngine.js +338 -0
- package/dist/server/engines/claude/ClaudeCodeEngine.js.map +1 -0
- package/dist/server/engines/factory.d.ts +21 -0
- package/dist/server/engines/factory.d.ts.map +1 -0
- package/dist/server/engines/factory.js +152 -0
- package/dist/server/engines/factory.js.map +1 -0
- package/dist/server/engines/opencode/OpenCodeEngine.d.ts +148 -0
- package/dist/server/engines/opencode/OpenCodeEngine.d.ts.map +1 -0
- package/dist/server/engines/opencode/OpenCodeEngine.js +630 -0
- package/dist/server/engines/opencode/OpenCodeEngine.js.map +1 -0
- package/dist/server/engines/opencode/OpenCodeServerManager.d.ts +172 -0
- package/dist/server/engines/opencode/OpenCodeServerManager.d.ts.map +1 -0
- package/dist/server/engines/opencode/OpenCodeServerManager.js +390 -0
- package/dist/server/engines/opencode/OpenCodeServerManager.js.map +1 -0
- package/dist/server/engines/opencode/model-catalog.d.ts +94 -0
- package/dist/server/engines/opencode/model-catalog.d.ts.map +1 -0
- package/dist/server/engines/opencode/model-catalog.js +141 -0
- package/dist/server/engines/opencode/model-catalog.js.map +1 -0
- package/dist/server/engines/types.d.ts +146 -0
- package/dist/server/engines/types.d.ts.map +1 -0
- package/dist/server/engines/types.js +4 -0
- package/dist/server/engines/types.js.map +1 -0
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/mcp/bouncer-haiku.d.ts +17 -4
- package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-haiku.js +8 -124
- package/dist/server/mcp/bouncer-haiku.js.map +1 -1
- package/dist/server/mcp/bouncer-integration.d.ts +45 -0
- package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
- package/dist/server/mcp/bouncer-integration.js +69 -5
- package/dist/server/mcp/bouncer-integration.js.map +1 -1
- package/dist/server/mcp/classifier/BouncerClassifier.d.ts +34 -0
- package/dist/server/mcp/classifier/BouncerClassifier.d.ts.map +1 -0
- package/dist/server/mcp/classifier/BouncerClassifier.js +4 -0
- package/dist/server/mcp/classifier/BouncerClassifier.js.map +1 -0
- package/dist/server/mcp/classifier/ClaudeBouncerClassifier.d.ts +17 -0
- package/dist/server/mcp/classifier/ClaudeBouncerClassifier.d.ts.map +1 -0
- package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js +142 -0
- package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js.map +1 -0
- package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.d.ts +68 -0
- package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.d.ts.map +1 -0
- package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.js +182 -0
- package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.js.map +1 -0
- package/dist/server/mcp/classifier/factory.d.ts +70 -0
- package/dist/server/mcp/classifier/factory.d.ts.map +1 -0
- package/dist/server/mcp/classifier/factory.js +155 -0
- package/dist/server/mcp/classifier/factory.js.map +1 -0
- package/dist/server/services/plan/agent-resolver.d.ts +26 -0
- package/dist/server/services/plan/agent-resolver.d.ts.map +1 -0
- package/dist/server/services/plan/agent-resolver.js +102 -0
- package/dist/server/services/plan/agent-resolver.js.map +1 -0
- package/dist/server/services/plan/composer.d.ts.map +1 -1
- package/dist/server/services/plan/composer.js +59 -11
- package/dist/server/services/plan/composer.js.map +1 -1
- package/dist/server/services/plan/executor.d.ts.map +1 -1
- package/dist/server/services/plan/executor.js +3 -1
- package/dist/server/services/plan/executor.js.map +1 -1
- package/dist/server/services/plan/issue-prompt-builder.d.ts.map +1 -1
- package/dist/server/services/plan/issue-prompt-builder.js +33 -1
- package/dist/server/services/plan/issue-prompt-builder.js.map +1 -1
- package/dist/server/services/plan/parser-core.d.ts.map +1 -1
- package/dist/server/services/plan/parser-core.js +1 -0
- package/dist/server/services/plan/parser-core.js.map +1 -1
- package/dist/server/services/plan/types.d.ts +1 -0
- package/dist/server/services/plan/types.d.ts.map +1 -1
- package/dist/server/services/settings.d.ts +76 -2
- package/dist/server/services/settings.d.ts.map +1 -1
- package/dist/server/services/settings.js +127 -4
- package/dist/server/services/settings.js.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/git-branch-handlers.js +19 -6
- package/dist/server/services/websocket/git-branch-handlers.js.map +1 -1
- package/dist/server/services/websocket/handler.d.ts +17 -1
- package/dist/server/services/websocket/handler.d.ts.map +1 -1
- package/dist/server/services/websocket/handler.js +54 -2
- package/dist/server/services/websocket/handler.js.map +1 -1
- package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-complexity.js +78 -26
- package/dist/server/services/websocket/quality-complexity.js.map +1 -1
- package/dist/server/services/websocket/quality-eta.d.ts +47 -0
- package/dist/server/services/websocket/quality-eta.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-eta.js +110 -0
- package/dist/server/services/websocket/quality-eta.js.map +1 -0
- package/dist/server/services/websocket/quality-grading.d.ts +27 -4
- package/dist/server/services/websocket/quality-grading.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-grading.js +369 -201
- package/dist/server/services/websocket/quality-grading.js.map +1 -1
- package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-handlers.js +145 -7
- package/dist/server/services/websocket/quality-handlers.js.map +1 -1
- package/dist/server/services/websocket/quality-operations.d.ts +34 -0
- package/dist/server/services/websocket/quality-operations.d.ts.map +1 -0
- package/dist/server/services/websocket/quality-operations.js +47 -0
- package/dist/server/services/websocket/quality-operations.js.map +1 -0
- package/dist/server/services/websocket/quality-persistence.d.ts +9 -0
- package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-persistence.js +10 -0
- package/dist/server/services/websocket/quality-persistence.js.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.d.ts +1 -1
- package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-review-agent.js +105 -56
- package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
- package/dist/server/services/websocket/quality-service.d.ts +9 -1
- package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-service.js +334 -14
- package/dist/server/services/websocket/quality-service.js.map +1 -1
- package/dist/server/services/websocket/quality-tools.d.ts +21 -0
- package/dist/server/services/websocket/quality-tools.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-tools.js +49 -0
- package/dist/server/services/websocket/quality-tools.js.map +1 -1
- package/dist/server/services/websocket/quality-types.d.ts +35 -2
- package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
- package/dist/server/services/websocket/quality-types.js +1 -1
- package/dist/server/services/websocket/quality-types.js.map +1 -1
- package/dist/server/services/websocket/session-handlers.d.ts +3 -1
- package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/session-handlers.js +57 -9
- package/dist/server/services/websocket/session-handlers.js.map +1 -1
- package/dist/server/services/websocket/session-history.js +3 -0
- package/dist/server/services/websocket/session-history.js.map +1 -1
- package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
- package/dist/server/services/websocket/session-initialization.js +158 -42
- package/dist/server/services/websocket/session-initialization.js.map +1 -1
- package/dist/server/services/websocket/session-registry.d.ts +25 -0
- package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
- package/dist/server/services/websocket/session-registry.js +19 -0
- package/dist/server/services/websocket/session-registry.js.map +1 -1
- package/dist/server/services/websocket/settings-handlers.d.ts +1 -1
- package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/settings-handlers.js +35 -4
- package/dist/server/services/websocket/settings-handlers.js.map +1 -1
- package/dist/server/services/websocket/tab-broadcast.d.ts +7 -2
- package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-broadcast.js +10 -2
- package/dist/server/services/websocket/tab-broadcast.js.map +1 -1
- package/dist/server/services/websocket/tab-event-buffer.d.ts +97 -8
- package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-event-buffer.js +138 -12
- package/dist/server/services/websocket/tab-event-buffer.js.map +1 -1
- package/dist/server/services/websocket/tab-event-replay.d.ts +29 -13
- package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-event-replay.js +55 -2
- package/dist/server/services/websocket/tab-event-replay.js.map +1 -1
- package/dist/server/services/websocket/tab-handlers.d.ts +9 -1
- package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
- package/dist/server/services/websocket/tab-handlers.js +47 -2
- package/dist/server/services/websocket/tab-handlers.js.map +1 -1
- package/dist/server/services/websocket/types.d.ts +28 -5
- package/dist/server/services/websocket/types.d.ts.map +1 -1
- package/dist/server/services/websocket/types.js +10 -4
- package/dist/server/services/websocket/types.js.map +1 -1
- package/package.json +5 -3
- package/server/cli/eta-estimator.ts +249 -0
- package/server/cli/headless/stall-assessor.ts +93 -0
- package/server/cli/headless/tool-watchdog.ts +21 -0
- package/server/cli/improvisation-history-store.ts +4 -1
- package/server/cli/improvisation-output-queue.ts +29 -7
- package/server/cli/improvisation-session-manager.ts +54 -1
- package/server/cli/improvisation-types.ts +2 -0
- package/server/engines/EngineEvent.ts +156 -0
- package/server/engines/claude/ClaudeCodeEngine.ts +404 -0
- package/server/engines/factory.ts +176 -0
- package/server/engines/opencode/OpenCodeEngine.ts +786 -0
- package/server/engines/opencode/OpenCodeServerManager.ts +577 -0
- package/server/engines/opencode/model-catalog.ts +217 -0
- package/server/engines/types.ts +173 -0
- package/server/index.ts +1 -1
- package/server/mcp/bouncer-haiku.ts +21 -145
- package/server/mcp/bouncer-integration.ts +107 -5
- package/server/mcp/classifier/BouncerClassifier.ts +40 -0
- package/server/mcp/classifier/ClaudeBouncerClassifier.ts +189 -0
- package/server/mcp/classifier/OpenCodeBouncerClassifier.ts +305 -0
- package/server/mcp/classifier/factory.ts +195 -0
- package/server/services/plan/agent-resolver.ts +115 -0
- package/server/services/plan/agents/code-review.md +38 -8
- package/server/services/plan/composer.ts +63 -11
- package/server/services/plan/executor.ts +3 -1
- package/server/services/plan/issue-prompt-builder.ts +39 -1
- package/server/services/plan/parser-core.ts +1 -0
- package/server/services/plan/types.ts +4 -0
- package/server/services/settings.ts +161 -4
- package/server/services/websocket/git-branch-handlers.ts +20 -6
- package/server/services/websocket/handler.ts +59 -2
- package/server/services/websocket/quality-complexity.ts +80 -26
- package/server/services/websocket/quality-eta.ts +155 -0
- package/server/services/websocket/quality-grading.ts +445 -222
- package/server/services/websocket/quality-handlers.ts +153 -7
- package/server/services/websocket/quality-operations.ts +72 -0
- package/server/services/websocket/quality-persistence.ts +17 -0
- package/server/services/websocket/quality-review-agent.ts +154 -64
- package/server/services/websocket/quality-service.ts +361 -13
- package/server/services/websocket/quality-tools.ts +51 -0
- package/server/services/websocket/quality-types.ts +41 -2
- package/server/services/websocket/session-handlers.ts +64 -10
- package/server/services/websocket/session-history.ts +3 -0
- package/server/services/websocket/session-initialization.ts +189 -46
- package/server/services/websocket/session-registry.ts +37 -0
- package/server/services/websocket/settings-handlers.ts +41 -4
- package/server/services/websocket/tab-broadcast.ts +10 -2
- package/server/services/websocket/tab-event-buffer.ts +143 -11
- package/server/services/websocket/tab-event-replay.ts +70 -3
- package/server/services/websocket/tab-handlers.ts +53 -5
- package/server/services/websocket/types.ts +37 -5
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
2
|
import { extname, relative } from 'node:path';
|
|
3
|
-
import { chunkFileList, filesByExt, runCommand } from './quality-tools.js';
|
|
3
|
+
import { chunkFileList, filesByExt, isTestFile, runCommand } from './quality-tools.js';
|
|
4
4
|
import { biomeDiagToFinding, FUNCTION_LENGTH_THRESHOLD, isBiomeComplexityDiagnostic, isEslintComplexityRule } from './quality-types.js';
|
|
5
5
|
const NODE_COMPLEXITY_EXTS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
|
|
6
6
|
const PY_COMPLEXITY_EXTS = ['.py', '.pyi'];
|
|
7
|
+
/**
|
|
8
|
+
* Decision-point keywords that approximate cyclomatic complexity. We count
|
|
9
|
+
* occurrences as a cheap proxy — McCabe's exact metric requires AST parsing,
|
|
10
|
+
* but the keyword count is highly correlated and good enough to distinguish
|
|
11
|
+
* "long but linear" (a flat sequence of statements) from "long and branchy"
|
|
12
|
+
* (deeply nested control flow).
|
|
13
|
+
*
|
|
14
|
+
* The user's task 2 requirement: "a 1000 line file might be just fine, not
|
|
15
|
+
* a violation at all, while another 1000 line file might be a severe mix of
|
|
16
|
+
* concerns" — same applies to functions. A long config-builder with one
|
|
17
|
+
* return statement is fine; a long monster with 40 if-branches is not.
|
|
18
|
+
*/
|
|
19
|
+
const BRANCH_KEYWORDS = /\b(?:if|else if|elif|for|while|case|catch|\?\s*\w|&&|\|\||\?\?)\b/g;
|
|
20
|
+
function countBranches(body) {
|
|
21
|
+
return (body.match(BRANCH_KEYWORDS) || []).length;
|
|
22
|
+
}
|
|
7
23
|
const JS_FUNC_PATTERN = /^(\s*)(export\s+)?(async\s+)?function\s+(\w+)|^(\s*)(export\s+)?(const|let|var)\s+(\w+)\s*=\s*(async\s+)?\(|^(\s*)(public|private|protected)?\s*(async\s+)?(\w+)\s*\(/;
|
|
8
24
|
function countBraceDeltas(line) {
|
|
9
25
|
let delta = 0;
|
|
@@ -39,11 +55,15 @@ function extractJsFunctions(file) {
|
|
|
39
55
|
}
|
|
40
56
|
braceDepth += countBraceDeltas(lines[i]);
|
|
41
57
|
if (currentFunc && braceDepth <= funcStartBraceDepth && i > currentFunc.startLine - 1) {
|
|
58
|
+
const startLine = currentFunc.startLine;
|
|
59
|
+
const endLine = i + 1;
|
|
60
|
+
const body = lines.slice(startLine - 1, endLine).join('\n');
|
|
42
61
|
functions.push({
|
|
43
62
|
name: currentFunc.name,
|
|
44
63
|
file: file.relativePath,
|
|
45
|
-
startLine
|
|
46
|
-
lines:
|
|
64
|
+
startLine,
|
|
65
|
+
lines: endLine - startLine + 1,
|
|
66
|
+
branches: countBranches(body),
|
|
47
67
|
});
|
|
48
68
|
currentFunc = null;
|
|
49
69
|
}
|
|
@@ -55,36 +75,30 @@ function extractPyFunctions(file) {
|
|
|
55
75
|
const lines = file.content.split('\n');
|
|
56
76
|
const defPattern = /^(\s*)(async\s+)?def\s+(\w+)/;
|
|
57
77
|
let currentFunc = null;
|
|
78
|
+
const recordFunction = (name, startLine, endLine) => {
|
|
79
|
+
const body = lines.slice(startLine - 1, endLine).join('\n');
|
|
80
|
+
functions.push({
|
|
81
|
+
name,
|
|
82
|
+
file: file.relativePath,
|
|
83
|
+
startLine,
|
|
84
|
+
lines: endLine - startLine + 1,
|
|
85
|
+
branches: countBranches(body),
|
|
86
|
+
});
|
|
87
|
+
};
|
|
58
88
|
for (let i = 0; i < lines.length; i++) {
|
|
59
89
|
const match = defPattern.exec(lines[i]);
|
|
60
90
|
if (match) {
|
|
61
|
-
if (currentFunc)
|
|
62
|
-
|
|
63
|
-
name: currentFunc.name,
|
|
64
|
-
file: file.relativePath,
|
|
65
|
-
startLine: currentFunc.startLine,
|
|
66
|
-
lines: i - currentFunc.startLine + 1,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
91
|
+
if (currentFunc)
|
|
92
|
+
recordFunction(currentFunc.name, currentFunc.startLine, i);
|
|
69
93
|
currentFunc = { name: match[3], startLine: i + 1, indent: match[1].length };
|
|
70
94
|
}
|
|
71
95
|
else if (currentFunc && lines[i].trim() && !lines[i].startsWith(' '.repeat(currentFunc.indent + 1)) && !lines[i].startsWith('\t')) {
|
|
72
|
-
|
|
73
|
-
name: currentFunc.name,
|
|
74
|
-
file: file.relativePath,
|
|
75
|
-
startLine: currentFunc.startLine,
|
|
76
|
-
lines: i - currentFunc.startLine + 1,
|
|
77
|
-
});
|
|
96
|
+
recordFunction(currentFunc.name, currentFunc.startLine, i);
|
|
78
97
|
currentFunc = null;
|
|
79
98
|
}
|
|
80
99
|
}
|
|
81
100
|
if (currentFunc) {
|
|
82
|
-
|
|
83
|
-
name: currentFunc.name,
|
|
84
|
-
file: file.relativePath,
|
|
85
|
-
startLine: currentFunc.startLine,
|
|
86
|
-
lines: lines.length - currentFunc.startLine + 1,
|
|
87
|
-
});
|
|
101
|
+
recordFunction(currentFunc.name, currentFunc.startLine, lines.length);
|
|
88
102
|
}
|
|
89
103
|
return functions;
|
|
90
104
|
}
|
|
@@ -96,9 +110,40 @@ function extractFunctions(file) {
|
|
|
96
110
|
return extractPyFunctions(file);
|
|
97
111
|
return [];
|
|
98
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Map a function's branch density (decision points per N lines) to a
|
|
115
|
+
* severity level for the function-length finding. Returns `null` to suppress
|
|
116
|
+
* the finding for a long but linear function — e.g., a config-builder with
|
|
117
|
+
* one return statement and 200 lines of property assignments.
|
|
118
|
+
*
|
|
119
|
+
* Heuristic: McCabe's cyclomatic complexity threshold is ~10. Above that,
|
|
120
|
+
* functions are hard to test. We grade severity by branches-per-50-lines so
|
|
121
|
+
* a 100-line function with 5 branches looks the same as a 50-line function
|
|
122
|
+
* with 5 branches (both ~industry "consider refactoring" zone).
|
|
123
|
+
*
|
|
124
|
+
* Functions absurdly long (>5x threshold) emit a finding regardless of
|
|
125
|
+
* branchiness — a 250-line function is too much to read in one sitting even
|
|
126
|
+
* if it's "linear."
|
|
127
|
+
*/
|
|
128
|
+
function severityFromBranchiness(branches, lines) {
|
|
129
|
+
const branchesPer50 = (branches * 50) / Math.max(1, lines);
|
|
130
|
+
const isAbsurd = lines > FUNCTION_LENGTH_THRESHOLD * 5;
|
|
131
|
+
if (branchesPer50 < 3 && !isAbsurd)
|
|
132
|
+
return null; // Long but linear — not really a violation.
|
|
133
|
+
if (branchesPer50 < 6)
|
|
134
|
+
return 'low';
|
|
135
|
+
if (branchesPer50 < 10)
|
|
136
|
+
return 'medium';
|
|
137
|
+
return 'high';
|
|
138
|
+
}
|
|
99
139
|
export function analyzeFunctionLength(files) {
|
|
100
140
|
const allFunctions = [];
|
|
101
141
|
for (const file of files) {
|
|
142
|
+
// Test files are exempt: a long `it()`/`describe()` body is normal and
|
|
143
|
+
// splitting it produces churn without improving readability. Linting
|
|
144
|
+
// and other quality checks still apply — only structural-length defers.
|
|
145
|
+
if (isTestFile(file.relativePath))
|
|
146
|
+
continue;
|
|
102
147
|
allFunctions.push(...extractFunctions(file));
|
|
103
148
|
}
|
|
104
149
|
if (allFunctions.length === 0)
|
|
@@ -110,13 +155,20 @@ export function analyzeFunctionLength(files) {
|
|
|
110
155
|
const funcScore = 100 / ratio ** 1.5;
|
|
111
156
|
totalScore += funcScore;
|
|
112
157
|
if (func.lines > FUNCTION_LENGTH_THRESHOLD) {
|
|
158
|
+
const severity = severityFromBranchiness(func.branches, func.lines);
|
|
159
|
+
if (!severity)
|
|
160
|
+
continue; // Long but linear — not flagged.
|
|
113
161
|
findings.push({
|
|
114
|
-
severity
|
|
162
|
+
severity,
|
|
115
163
|
category: 'function-length',
|
|
116
164
|
file: func.file,
|
|
117
165
|
line: func.startLine,
|
|
118
|
-
title: `${func.name}() has ${func.lines} lines
|
|
119
|
-
description: `Function "${func.name}" exceeds the
|
|
166
|
+
title: `${func.name}() has ${func.lines} lines, ~${func.branches} branches`,
|
|
167
|
+
description: `Function "${func.name}" exceeds the ${FUNCTION_LENGTH_THRESHOLD}-line threshold by ${func.lines - FUNCTION_LENGTH_THRESHOLD} lines ` +
|
|
168
|
+
`with approximately ${func.branches} decision points (cyclomatic complexity proxy). ` +
|
|
169
|
+
(severity === 'high'
|
|
170
|
+
? 'High branchiness makes this hard to test and review — extract sub-functions or simplify control flow.'
|
|
171
|
+
: 'Long but with manageable branching — consider extracting helpers if the function does multiple things.'),
|
|
120
172
|
});
|
|
121
173
|
}
|
|
122
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-complexity.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-complexity.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quality-complexity.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-complexity.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAkB,yBAAyB,EAAE,2BAA2B,EAAE,sBAAsB,EAAuB,MAAM,oBAAoB,CAAC;AAE7K,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5E,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAe3C;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAAG,oEAAoE,CAAC;AAE7F,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AACpD,CAAC;AAED,MAAM,eAAe,GAAG,uKAAuK,CAAC;AAEhM,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACnB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC;IAC9D,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB;IAC1C,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAA+D,IAAI,CAAC;IACnF,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;gBACnF,mBAAmB,GAAG,UAAU,CAAC;YACnC,CAAC;QACH,CAAC;QAED,UAAU,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,IAAI,WAAW,IAAI,UAAU,IAAI,mBAAmB,IAAI,CAAC,GAAG,WAAW,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACtF,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;YACxC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,IAAI,EAAE,IAAI,CAAC,YAAY;gBACvB,SAAS;gBACT,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC;gBAC9B,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC;aAC9B,CAAC,CAAC;YACH,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB;IAC1C,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,8BAA8B,CAAC;IAClD,IAAI,WAAW,GAA+D,IAAI,CAAC;IAEnF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAe,EAAE,EAAE;QAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,SAAS,CAAC,IAAI,CAAC;YACb,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,YAAY;YACvB,SAAS;YACT,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC;YAC9B,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,WAAW;gBAAE,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC5E,WAAW,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9E,CAAC;aAAM,IAAI,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpI,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC3D,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAgB;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,uBAAuB,CAAC,QAAgB,EAAE,KAAa;IAC9D,MAAM,aAAa,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,KAAK,GAAG,yBAAyB,GAAG,CAAC,CAAC;IACvD,IAAI,aAAa,GAAG,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,4CAA4C;IAC7F,IAAI,aAAa,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,aAAa,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAmB;IACvD,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,uEAAuE;QACvE,qEAAqE;QACrE,wEAAwE;QACxE,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,SAAS;QAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAElF,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,yBAAyB,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC;QACrC,UAAU,IAAI,SAAS,CAAC;QAExB,IAAI,IAAI,CAAC,KAAK,GAAG,yBAAyB,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ;gBAAE,SAAS,CAAC,iCAAiC;YAE1D,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ;gBACR,QAAQ,EAAE,iBAAiB;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,QAAQ,WAAW;gBAC3E,WAAW,EACT,aAAa,IAAI,CAAC,IAAI,iBAAiB,yBAAyB,sBAAsB,IAAI,CAAC,KAAK,GAAG,yBAAyB,SAAS;oBACrI,sBAAsB,IAAI,CAAC,QAAQ,kDAAkD;oBACrF,CAAC,QAAQ,KAAK,MAAM;wBAClB,CAAC,CAAC,uGAAuG;wBACzG,CAAC,CAAC,wGAAwG,CAAC;aAChH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3D,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AACvG,CAAC;AAED,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAE/E,SAAS,sBAAsB,CAAC,QAA0B;IACxD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC,CAAC;aAChE,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,CAAC;;YAC1C,OAAO,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,KAAmB;IACrE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACzG,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,WAAW;gBAAE,SAAS;YAClC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACnC,IAAI,2BAA2B,CAAC,CAAC,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,8BAA8B,CACrC,IAAqE,EACrE,OAAe;IAEf,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAgB,CAAC;YAAE,SAAS;QAC5D,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YAChD,QAAQ,EAAE,YAAY;YACtB,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;YACtC,IAAI,EAAG,GAAG,CAAC,IAAe,IAAI,IAAI;YAClC,KAAK,EAAG,GAAG,CAAC,MAAiB,IAAI,YAAY;YAC7C,WAAW,EAAE,GAAG,CAAC,OAAiB;SACnC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,KAAmB;IACtE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACvF,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,8BAA8B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,IAA6B;IACzE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAoB,CAAC;IACrC,IAAI,EAAE,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO;QACL,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;QACvD,QAAQ,EAAE,YAAY;QACtB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAG,IAAI,CAAC,MAAiB,IAAI,IAAI;QACrC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,gCAAgC,EAAE,EAAE;QACvD,WAAW,EAAE,iBAAiB,EAAE,mCAAmC,IAAI,CAAC,IAAI,yBAAyB;KACtG,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAuD;IACrF,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACnD,IAAI,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,KAAmB;IACrE,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAmD,CAAC;YAC3F,QAAQ,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAAe,EACf,SAA6B,EAC7B,KAAmB;IAEnB,MAAM,cAAc,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvF,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,4DAA4D;IAC5D,uEAAuE;IACvE,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IACD,OAAO,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,OAAe,EACf,SAA6B,EAC7B,KAAmB;IAEnB,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,UAAuB,EACvB,KAAmB,EACnB,kBAA6B;IAE7B,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;QACvH,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,GAAG,IAAI,CAAC;YAClB,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACrE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG;QACzE,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,EAAE,WAAW,CAAC,MAAM;QAC9B,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality ETA — duration estimation for scan + AI review operations.
|
|
3
|
+
*
|
|
4
|
+
* Uses persisted history when available (most accurate), falls back to a
|
|
5
|
+
* simple heuristic derived from file count + line count when there is no
|
|
6
|
+
* history yet (cold start).
|
|
7
|
+
*
|
|
8
|
+
* Estimates are intentionally conservative: better to over-estimate by a bit
|
|
9
|
+
* and have the bar finish "early" than to under-estimate and have the bar
|
|
10
|
+
* sit at 100% while work continues — the latter destroys trust in the ETA.
|
|
11
|
+
*/
|
|
12
|
+
import type { QualityHistoryEntry } from './quality-persistence.js';
|
|
13
|
+
interface HistoryEntryWithTimings extends QualityHistoryEntry {
|
|
14
|
+
scanDurationMs?: number;
|
|
15
|
+
reviewDurationMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface CodebaseSize {
|
|
18
|
+
/** Number of source files the scan/review will analyse. */
|
|
19
|
+
files: number;
|
|
20
|
+
/** Total lines across those files. */
|
|
21
|
+
lines: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Heuristic estimate for a CLI scan when we have no history. Combines a fixed
|
|
25
|
+
* floor with per-file + per-KLOC components — `tsc --noEmit` and lint scale
|
|
26
|
+
* with codebase size, so scaling on both files and lines maps reality better
|
|
27
|
+
* than scaling on either alone.
|
|
28
|
+
*/
|
|
29
|
+
export declare function heuristicScanMs({ files, lines }: CodebaseSize): number;
|
|
30
|
+
/** Heuristic estimate for the AI review agent when we have no history. */
|
|
31
|
+
export declare function heuristicReviewMs({ files, lines }: CodebaseSize): number;
|
|
32
|
+
/**
|
|
33
|
+
* Best-available ETA for a CLI scan. Prefers a weighted average of recent
|
|
34
|
+
* durations for this exact directory; falls back to the heuristic when no
|
|
35
|
+
* timing history exists.
|
|
36
|
+
*/
|
|
37
|
+
export declare function estimateScanMs(size: CodebaseSize, history: HistoryEntryWithTimings[], dirPath: string): number;
|
|
38
|
+
/** Best-available ETA for the AI code-review agent. Same fallback shape as `estimateScanMs`. */
|
|
39
|
+
export declare function estimateReviewMs(size: CodebaseSize, history: HistoryEntryWithTimings[], dirPath: string): number;
|
|
40
|
+
/**
|
|
41
|
+
* Estimate codebase size from a directory using the same fast traversal the
|
|
42
|
+
* scan itself uses. Pulled out as a thin wrapper so the handler can call it
|
|
43
|
+
* before kicking off the scan to compute an initial ETA.
|
|
44
|
+
*/
|
|
45
|
+
export declare function estimateCodebaseSize(dirPath: string): Promise<CodebaseSize>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=quality-eta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-eta.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-eta.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAmCpE,UAAU,uBAAwB,SAAQ,mBAAmB;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAsCD,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,GAAG,MAAM,CAItE;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,GAAG,MAAM,CAIxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,uBAAuB,EAAE,EAClC,OAAO,EAAE,MAAM,GACd,MAAM,CAKR;AAED,gGAAgG;AAChG,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,uBAAuB,EAAE,EAClC,OAAO,EAAE,MAAM,GACd,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAKjF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Mstro, Inc. All rights reserved.
|
|
2
|
+
// ── Heuristic constants ──────────────────────────────────────
|
|
3
|
+
//
|
|
4
|
+
// Numbers tuned against typical TypeScript codebases (mstro cli/server/web)
|
|
5
|
+
// observed in the wild — see history.json for the corpus. Treat them as
|
|
6
|
+
// reasonable defaults that the history-based path will quickly correct once
|
|
7
|
+
// real durations land in storage.
|
|
8
|
+
/** Per-file overhead for a CLI scan (linting, formatting, file/function-length checks). */
|
|
9
|
+
const SCAN_PER_FILE_MS = 250;
|
|
10
|
+
/** Per-1000-LOC overhead for a CLI scan, dominated by `tsc --noEmit` on TS projects. */
|
|
11
|
+
const SCAN_PER_KLOC_MS = 800;
|
|
12
|
+
/** Fixed overhead per scan: tool detection, file collection, score computation. */
|
|
13
|
+
const SCAN_FIXED_MS = 8_000;
|
|
14
|
+
/** Floor — the smallest "I'm doing something" we should ever show. */
|
|
15
|
+
const SCAN_MIN_MS = 5_000;
|
|
16
|
+
/** Per-file overhead for the AI code-review agent (Claude Read calls, validation). */
|
|
17
|
+
const REVIEW_PER_FILE_MS = 1_200;
|
|
18
|
+
/** Per-1000-LOC overhead for the AI code-review agent. */
|
|
19
|
+
const REVIEW_PER_KLOC_MS = 2_500;
|
|
20
|
+
/** Fixed overhead per review: Claude spawn, prompt building, persistence. */
|
|
21
|
+
const REVIEW_FIXED_MS = 25_000;
|
|
22
|
+
/** Floor for the review estimate. */
|
|
23
|
+
const REVIEW_MIN_MS = 30_000;
|
|
24
|
+
// ── History smoothing ────────────────────────────────────────
|
|
25
|
+
//
|
|
26
|
+
// Use the last few real durations for the same directory and weight them by
|
|
27
|
+
// recency. A single one-off slow run shouldn't dominate the estimate, but
|
|
28
|
+
// fresh data should outweigh stale data (codebase grew, machine got faster,
|
|
29
|
+
// etc.).
|
|
30
|
+
const MAX_HISTORY_SAMPLES = 5;
|
|
31
|
+
function recentDurations(history, dirPath, field) {
|
|
32
|
+
const values = [];
|
|
33
|
+
// Walk newest → oldest; only consider entries that actually touched this directory.
|
|
34
|
+
for (let i = history.length - 1; i >= 0 && values.length < MAX_HISTORY_SAMPLES; i--) {
|
|
35
|
+
const entry = history[i];
|
|
36
|
+
if (!entry.directories.some((d) => d.path === dirPath))
|
|
37
|
+
continue;
|
|
38
|
+
const v = entry[field];
|
|
39
|
+
if (typeof v === 'number' && v > 0)
|
|
40
|
+
values.push(v);
|
|
41
|
+
}
|
|
42
|
+
return values;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Weighted average favouring newer samples. Weights are 1, 2, 3, 4, 5 for the
|
|
46
|
+
* 5 most-recent runs (newest first → highest weight) — a "this run mostly
|
|
47
|
+
* matters" curve that still smooths over a single anomaly.
|
|
48
|
+
*/
|
|
49
|
+
function weightedRecentAverage(values) {
|
|
50
|
+
if (values.length === 0)
|
|
51
|
+
return null;
|
|
52
|
+
let weightSum = 0;
|
|
53
|
+
let valueSum = 0;
|
|
54
|
+
// values[0] is newest, so its weight is `values.length`.
|
|
55
|
+
for (let i = 0; i < values.length; i++) {
|
|
56
|
+
const w = values.length - i;
|
|
57
|
+
valueSum += values[i] * w;
|
|
58
|
+
weightSum += w;
|
|
59
|
+
}
|
|
60
|
+
return weightSum > 0 ? valueSum / weightSum : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Heuristic estimate for a CLI scan when we have no history. Combines a fixed
|
|
64
|
+
* floor with per-file + per-KLOC components — `tsc --noEmit` and lint scale
|
|
65
|
+
* with codebase size, so scaling on both files and lines maps reality better
|
|
66
|
+
* than scaling on either alone.
|
|
67
|
+
*/
|
|
68
|
+
export function heuristicScanMs({ files, lines }) {
|
|
69
|
+
const kloc = Math.max(0, lines) / 1_000;
|
|
70
|
+
const raw = SCAN_FIXED_MS + files * SCAN_PER_FILE_MS + kloc * SCAN_PER_KLOC_MS;
|
|
71
|
+
return Math.max(SCAN_MIN_MS, Math.round(raw));
|
|
72
|
+
}
|
|
73
|
+
/** Heuristic estimate for the AI review agent when we have no history. */
|
|
74
|
+
export function heuristicReviewMs({ files, lines }) {
|
|
75
|
+
const kloc = Math.max(0, lines) / 1_000;
|
|
76
|
+
const raw = REVIEW_FIXED_MS + files * REVIEW_PER_FILE_MS + kloc * REVIEW_PER_KLOC_MS;
|
|
77
|
+
return Math.max(REVIEW_MIN_MS, Math.round(raw));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Best-available ETA for a CLI scan. Prefers a weighted average of recent
|
|
81
|
+
* durations for this exact directory; falls back to the heuristic when no
|
|
82
|
+
* timing history exists.
|
|
83
|
+
*/
|
|
84
|
+
export function estimateScanMs(size, history, dirPath) {
|
|
85
|
+
const recent = recentDurations(history, dirPath, 'scanDurationMs');
|
|
86
|
+
const fromHistory = weightedRecentAverage(recent);
|
|
87
|
+
if (fromHistory !== null)
|
|
88
|
+
return Math.max(SCAN_MIN_MS, Math.round(fromHistory));
|
|
89
|
+
return heuristicScanMs(size);
|
|
90
|
+
}
|
|
91
|
+
/** Best-available ETA for the AI code-review agent. Same fallback shape as `estimateScanMs`. */
|
|
92
|
+
export function estimateReviewMs(size, history, dirPath) {
|
|
93
|
+
const recent = recentDurations(history, dirPath, 'reviewDurationMs');
|
|
94
|
+
const fromHistory = weightedRecentAverage(recent);
|
|
95
|
+
if (fromHistory !== null)
|
|
96
|
+
return Math.max(REVIEW_MIN_MS, Math.round(fromHistory));
|
|
97
|
+
return heuristicReviewMs(size);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Estimate codebase size from a directory using the same fast traversal the
|
|
101
|
+
* scan itself uses. Pulled out as a thin wrapper so the handler can call it
|
|
102
|
+
* before kicking off the scan to compute an initial ETA.
|
|
103
|
+
*/
|
|
104
|
+
export async function estimateCodebaseSize(dirPath) {
|
|
105
|
+
const { collectSourceFiles } = await import('./quality-tools.js');
|
|
106
|
+
const files = await collectSourceFiles(dirPath, dirPath);
|
|
107
|
+
const lines = files.reduce((sum, f) => sum + f.lines, 0);
|
|
108
|
+
return { files: files.length, lines };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=quality-eta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-eta.js","sourceRoot":"","sources":["../../../../server/services/websocket/quality-eta.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export type DimensionName = 'security' | 'reliability' | 'maintainability';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Letter grades. New code emits all variants except `'D'` (kept only for
|
|
4
|
+
* legacy reports persisted before the +/- rollout). See quality-types.ts for
|
|
5
|
+
* the score-band reference.
|
|
6
|
+
*/
|
|
7
|
+
export type Grade = 'A+' | 'A' | 'A-' | 'B+' | 'B' | 'B-' | 'C+' | 'C' | 'C-' | 'D' | 'F+' | 'F' | 'F-' | 'N/A';
|
|
3
8
|
type Severity = 'critical' | 'high' | 'medium' | 'low';
|
|
4
9
|
export interface DimensionScore {
|
|
5
10
|
name: DimensionName;
|
|
@@ -30,9 +35,27 @@ export interface QualityRating {
|
|
|
30
35
|
*/
|
|
31
36
|
export declare function categoryToDimension(category: string): DimensionName;
|
|
32
37
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
38
|
+
* Convert a 0-100 score to the full letter grade including +/- modifier.
|
|
39
|
+
*
|
|
40
|
+
* Within an A/B/C band, the band is split into thirds:
|
|
41
|
+
* X- bottom third (e.g., A-: 90-92)
|
|
42
|
+
* X middle third (e.g., A : 93-96)
|
|
43
|
+
* X+ top third (e.g., A+: 97-100)
|
|
44
|
+
*
|
|
45
|
+
* The F band uses two slices instead of three because there is no academic
|
|
46
|
+
* "F0" anchor and the user wanted F+/F/F-:
|
|
47
|
+
* F- 0-55 "critically broken"
|
|
48
|
+
* F 56-64 "broken"
|
|
49
|
+
* F+ 65-69 "barely failing"
|
|
50
|
+
*
|
|
51
|
+
* Compile/critical-severity hard caps are applied separately, not by score.
|
|
52
|
+
*/
|
|
53
|
+
export declare function scoreToGrade(score: number): Grade;
|
|
54
|
+
/**
|
|
55
|
+
* Legacy single-letter conversion. Returns the *base* grade only (no
|
|
56
|
+
* modifier) for compatibility with callers that pre-date the +/- rollout
|
|
57
|
+
* (`scoreBreakdown.categoryPenalties[].grade`, etc.). New surfaces should
|
|
58
|
+
* call `scoreToGrade()` instead.
|
|
36
59
|
*/
|
|
37
60
|
export declare function gradeFromScore(score: number): Grade;
|
|
38
61
|
export declare function computeQualityRating(allFindings: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-grading.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-grading.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quality-grading.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-grading.ts"],"names":[],"mappings":"AAqCA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAE3E;;;;GAIG;AACH,MAAM,MAAM,KAAK,GACb,IAAI,GAAG,GAAG,GAAG,IAAI,GACjB,IAAI,GAAG,GAAG,GAAG,IAAI,GACjB,IAAI,GAAG,GAAG,GAAG,IAAI,GACjB,GAAG,GACH,IAAI,GAAG,GAAG,GAAG,IAAI,GACjB,KAAK,CAAC;AAKV,KAAK,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,QAAQ,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IACzC,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAmBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAKnE;AA2BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAajD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAInD;AAgiBD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1D,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,mBAAmB,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAA;CAAE,GACnF,aAAa,CAiCf"}
|