dev3000 0.0.186 → 0.0.188
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 +101 -13
- package/bin/dev3000 +1 -2
- package/dist/cdp-monitor.d.ts +7 -12
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +86 -170
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -1369
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/portless.d.ts +3 -0
- package/dist/portless.d.ts.map +1 -1
- package/dist/portless.js +10 -0
- package/dist/portless.js.map +1 -1
- package/dist/runtime/bridge.d.ts +26 -0
- package/dist/runtime/bridge.d.ts.map +1 -0
- package/dist/runtime/bridge.js +340 -0
- package/dist/runtime/bridge.js.map +1 -0
- package/dist/runtime/chrome-isolation.d.ts +16 -0
- package/dist/runtime/chrome-isolation.d.ts.map +1 -0
- package/dist/runtime/chrome-isolation.js +119 -0
- package/dist/runtime/chrome-isolation.js.map +1 -0
- package/dist/runtime/cli.js +116 -26
- package/dist/runtime/cli.js.map +1 -1
- package/dist/runtime/event-views.d.ts +21 -0
- package/dist/runtime/event-views.d.ts.map +1 -0
- package/dist/runtime/event-views.js +53 -0
- package/dist/runtime/event-views.js.map +1 -0
- package/dist/runtime/harness.d.ts +16 -0
- package/dist/runtime/harness.d.ts.map +1 -0
- package/dist/runtime/harness.js +68 -0
- package/dist/runtime/harness.js.map +1 -0
- package/dist/runtime/local-proxy.d.ts +12 -0
- package/dist/runtime/local-proxy.d.ts.map +1 -0
- package/dist/runtime/local-proxy.js +114 -0
- package/dist/runtime/local-proxy.js.map +1 -0
- package/dist/runtime/runtime.d.ts +14 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +80 -19
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/sandbox-agent.d.ts +6 -0
- package/dist/runtime/sandbox-agent.d.ts.map +1 -0
- package/dist/runtime/sandbox-agent.js +35 -0
- package/dist/runtime/sandbox-agent.js.map +1 -0
- package/dist/runtime/sandbox-command.d.ts +9 -0
- package/dist/runtime/sandbox-command.d.ts.map +1 -0
- package/dist/runtime/sandbox-command.js +101 -0
- package/dist/runtime/sandbox-command.js.map +1 -0
- package/dist/runtime/sandbox-proxy.d.ts +11 -0
- package/dist/runtime/sandbox-proxy.d.ts.map +1 -0
- package/dist/runtime/sandbox-proxy.js +123 -0
- package/dist/runtime/sandbox-proxy.js.map +1 -0
- package/dist/runtime/sandbox-sessions.d.ts +31 -0
- package/dist/runtime/sandbox-sessions.d.ts.map +1 -0
- package/dist/runtime/sandbox-sessions.js +102 -0
- package/dist/runtime/sandbox-sessions.js.map +1 -0
- package/dist/runtime/sandbox.d.ts +21 -0
- package/dist/runtime/sandbox.d.ts.map +1 -0
- package/dist/runtime/sandbox.js +481 -0
- package/dist/runtime/sandbox.js.map +1 -0
- package/dist/utils/agent-browser.d.ts +2 -120
- package/dist/utils/agent-browser.d.ts.map +1 -1
- package/dist/utils/agent-browser.js +13 -376
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/project-name.d.ts +2 -2
- package/dist/utils/project-name.js +2 -2
- package/package.json +13 -22
- package/skills/d3k/SKILL.md +23 -1
- package/dist/commands/crawl.d.ts +0 -12
- package/dist/commands/crawl.d.ts.map +0 -1
- package/dist/commands/crawl.js +0 -101
- package/dist/commands/crawl.js.map +0 -1
- package/dist/commands/errors.d.ts +0 -14
- package/dist/commands/errors.d.ts.map +0 -1
- package/dist/commands/errors.js +0 -246
- package/dist/commands/errors.js.map +0 -1
- package/dist/commands/fix.d.ts +0 -13
- package/dist/commands/fix.d.ts.map +0 -1
- package/dist/commands/fix.js +0 -219
- package/dist/commands/fix.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -13
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -146
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/resume.d.ts +0 -11
- package/dist/commands/resume.d.ts.map +0 -1
- package/dist/commands/resume.js +0 -75
- package/dist/commands/resume.js.map +0 -1
- package/dist/commands/status.d.ts +0 -21
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -44
- package/dist/commands/status.js.map +0 -1
- package/dist/components/AgentSelector.d.ts +0 -12
- package/dist/components/AgentSelector.d.ts.map +0 -1
- package/dist/components/AgentSelector.js +0 -99
- package/dist/components/AgentSelector.js.map +0 -1
- package/dist/components/PackageSelector.d.ts +0 -13
- package/dist/components/PackageSelector.d.ts.map +0 -1
- package/dist/components/PackageSelector.js +0 -79
- package/dist/components/PackageSelector.js.map +0 -1
- package/dist/constants/log-colors.d.ts +0 -43
- package/dist/constants/log-colors.d.ts.map +0 -1
- package/dist/constants/log-colors.js +0 -59
- package/dist/constants/log-colors.js.map +0 -1
- package/dist/dev-environment.d.ts +0 -187
- package/dist/dev-environment.d.ts.map +0 -1
- package/dist/dev-environment.js +0 -2248
- package/dist/dev-environment.js.map +0 -1
- package/dist/screencast-manager.d.ts +0 -78
- package/dist/screencast-manager.d.ts.map +0 -1
- package/dist/screencast-manager.js +0 -529
- package/dist/screencast-manager.js.map +0 -1
- package/dist/services/parsers/error-detectors/base.d.ts +0 -24
- package/dist/services/parsers/error-detectors/base.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/base.js +0 -44
- package/dist/services/parsers/error-detectors/base.js.map +0 -1
- package/dist/services/parsers/error-detectors/index.d.ts +0 -6
- package/dist/services/parsers/error-detectors/index.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/index.js +0 -6
- package/dist/services/parsers/error-detectors/index.js.map +0 -1
- package/dist/services/parsers/error-detectors/nextjs.d.ts +0 -9
- package/dist/services/parsers/error-detectors/nextjs.d.ts.map +0 -1
- package/dist/services/parsers/error-detectors/nextjs.js +0 -52
- package/dist/services/parsers/error-detectors/nextjs.js.map +0 -1
- package/dist/services/parsers/index.d.ts +0 -9
- package/dist/services/parsers/index.d.ts.map +0 -1
- package/dist/services/parsers/index.js +0 -10
- package/dist/services/parsers/index.js.map +0 -1
- package/dist/services/parsers/log-parsers/base.d.ts +0 -26
- package/dist/services/parsers/log-parsers/base.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/base.js +0 -6
- package/dist/services/parsers/log-parsers/base.js.map +0 -1
- package/dist/services/parsers/log-parsers/index.d.ts +0 -6
- package/dist/services/parsers/log-parsers/index.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/index.js +0 -5
- package/dist/services/parsers/log-parsers/index.js.map +0 -1
- package/dist/services/parsers/log-parsers/standard.d.ts +0 -9
- package/dist/services/parsers/log-parsers/standard.d.ts.map +0 -1
- package/dist/services/parsers/log-parsers/standard.js +0 -17
- package/dist/services/parsers/log-parsers/standard.js.map +0 -1
- package/dist/services/parsers/output-processor.d.ts +0 -39
- package/dist/services/parsers/output-processor.d.ts.map +0 -1
- package/dist/services/parsers/output-processor.js +0 -54
- package/dist/services/parsers/output-processor.js.map +0 -1
- package/dist/skills/d3k/internal-skill.md +0 -32
- package/dist/skills/index.d.ts +0 -54
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -214
- package/dist/skills/index.js.map +0 -1
- package/dist/src/tui-interface-impl.tsx +0 -644
- package/dist/tui-interface-impl.d.ts +0 -30
- package/dist/tui-interface-impl.d.ts.map +0 -1
- package/dist/tui-interface-impl.js +0 -403
- package/dist/tui-interface-impl.js.map +0 -1
- package/dist/tui-interface-opentui.d.ts +0 -33
- package/dist/tui-interface-opentui.d.ts.map +0 -1
- package/dist/tui-interface-opentui.js +0 -1128
- package/dist/tui-interface-opentui.js.map +0 -1
- package/dist/tui-interface.d.ts +0 -38
- package/dist/tui-interface.d.ts.map +0 -1
- package/dist/tui-interface.js +0 -84
- package/dist/tui-interface.js.map +0 -1
- package/dist/utils/agent-detection.d.ts +0 -17
- package/dist/utils/agent-detection.d.ts.map +0 -1
- package/dist/utils/agent-detection.js +0 -81
- package/dist/utils/agent-detection.js.map +0 -1
- package/dist/utils/agent-selection.d.ts +0 -25
- package/dist/utils/agent-selection.d.ts.map +0 -1
- package/dist/utils/agent-selection.js +0 -73
- package/dist/utils/agent-selection.js.map +0 -1
- package/dist/utils/browser-command-argv.d.ts +0 -19
- package/dist/utils/browser-command-argv.d.ts.map +0 -1
- package/dist/utils/browser-command-argv.js +0 -149
- package/dist/utils/browser-command-argv.js.map +0 -1
- package/dist/utils/build-version.d.ts +0 -2
- package/dist/utils/build-version.d.ts.map +0 -1
- package/dist/utils/build-version.js +0 -8
- package/dist/utils/build-version.js.map +0 -1
- package/dist/utils/cli-options.d.ts +0 -5
- package/dist/utils/cli-options.d.ts.map +0 -1
- package/dist/utils/cli-options.js +0 -36
- package/dist/utils/cli-options.js.map +0 -1
- package/dist/utils/d3k-dir.d.ts +0 -3
- package/dist/utils/d3k-dir.d.ts.map +0 -1
- package/dist/utils/d3k-dir.js +0 -12
- package/dist/utils/d3k-dir.js.map +0 -1
- package/dist/utils/d3k-skill-installer.d.ts +0 -4
- package/dist/utils/d3k-skill-installer.d.ts.map +0 -1
- package/dist/utils/d3k-skill-installer.js +0 -30
- package/dist/utils/d3k-skill-installer.js.map +0 -1
- package/dist/utils/log-filename.d.ts +0 -30
- package/dist/utils/log-filename.d.ts.map +0 -1
- package/dist/utils/log-filename.js +0 -60
- package/dist/utils/log-filename.js.map +0 -1
- package/dist/utils/project-detector.d.ts +0 -25
- package/dist/utils/project-detector.d.ts.map +0 -1
- package/dist/utils/project-detector.js +0 -153
- package/dist/utils/project-detector.js.map +0 -1
- package/dist/utils/project-metadata.d.ts +0 -4
- package/dist/utils/project-metadata.d.ts.map +0 -1
- package/dist/utils/project-metadata.js +0 -48
- package/dist/utils/project-metadata.js.map +0 -1
- package/dist/utils/repo-validate.d.ts +0 -2
- package/dist/utils/repo-validate.d.ts.map +0 -1
- package/dist/utils/repo-validate.js +0 -10
- package/dist/utils/repo-validate.js.map +0 -1
- package/dist/utils/session.d.ts +0 -19
- package/dist/utils/session.d.ts.map +0 -1
- package/dist/utils/session.js +0 -65
- package/dist/utils/session.js.map +0 -1
- package/dist/utils/skill-installer.d.ts +0 -65
- package/dist/utils/skill-installer.d.ts.map +0 -1
- package/dist/utils/skill-installer.js +0 -265
- package/dist/utils/skill-installer.js.map +0 -1
- package/dist/utils/timestamp.d.ts +0 -20
- package/dist/utils/timestamp.d.ts.map +0 -1
- package/dist/utils/timestamp.js +0 -57
- package/dist/utils/timestamp.js.map +0 -1
- package/dist/utils/tmux-helpers.d.ts +0 -36
- package/dist/utils/tmux-helpers.d.ts.map +0 -1
- package/dist/utils/tmux-helpers.js +0 -118
- package/dist/utils/tmux-helpers.js.map +0 -1
- package/dist/utils/user-config.d.ts +0 -12
- package/dist/utils/user-config.d.ts.map +0 -1
- package/dist/utils/user-config.js +0 -46
- package/dist/utils/user-config.js.map +0 -1
- package/dist/utils/version-check.d.ts +0 -52
- package/dist/utils/version-check.d.ts.map +0 -1
- package/dist/utils/version-check.js +0 -304
- package/dist/utils/version-check.js.map +0 -1
- package/src/tui-interface-impl.tsx +0 -644
|
@@ -1,529 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { WebSocket } from "ws";
|
|
5
|
-
/**
|
|
6
|
-
* ScreencastManager - Passive screencast capture for navigation events
|
|
7
|
-
*
|
|
8
|
-
* Listens for Page.frameStartedLoading and automatically captures 5 seconds
|
|
9
|
-
* of screencast frames for jank detection. No artificial page reloads needed!
|
|
10
|
-
*/
|
|
11
|
-
export class ScreencastManager {
|
|
12
|
-
cdpUrl;
|
|
13
|
-
logFn;
|
|
14
|
-
debug;
|
|
15
|
-
ws = null;
|
|
16
|
-
buffer = [];
|
|
17
|
-
isCapturing = false;
|
|
18
|
-
navigationStartTime = 0;
|
|
19
|
-
currentSessionId = "";
|
|
20
|
-
screenshotDir;
|
|
21
|
-
messageId = 1000; // Start high to avoid conflicts
|
|
22
|
-
appPort;
|
|
23
|
-
allowedUrlMatches = [];
|
|
24
|
-
layoutShifts = [];
|
|
25
|
-
viewportInfo = {};
|
|
26
|
-
captureTrigger = "load";
|
|
27
|
-
constructor(cdpUrl, logFn, appPort, debug = false, appUrl) {
|
|
28
|
-
this.cdpUrl = cdpUrl;
|
|
29
|
-
this.logFn = logFn;
|
|
30
|
-
this.debug = debug;
|
|
31
|
-
this.screenshotDir = process.env.SCREENSHOT_DIR || join(tmpdir(), "dev3000-mcp-deps", "public", "screenshots");
|
|
32
|
-
this.appPort = appPort || process.env.APP_PORT || "3000";
|
|
33
|
-
this.allowedUrlMatches = [`localhost:${this.appPort}`];
|
|
34
|
-
if (appUrl) {
|
|
35
|
-
try {
|
|
36
|
-
this.allowedUrlMatches.push(new URL(appUrl).origin);
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
// Ignore invalid URLs and keep localhost matching.
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (!existsSync(this.screenshotDir)) {
|
|
43
|
-
mkdirSync(this.screenshotDir, { recursive: true });
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Start listening for navigation events and capturing screencasts
|
|
48
|
-
*/
|
|
49
|
-
async start() {
|
|
50
|
-
if (this.ws) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
return new Promise((resolve, reject) => {
|
|
54
|
-
try {
|
|
55
|
-
this.ws = new WebSocket(this.cdpUrl);
|
|
56
|
-
let pageEnableId;
|
|
57
|
-
let runtimeEnableId;
|
|
58
|
-
let pageEnabled = false;
|
|
59
|
-
let runtimeEnabled = false;
|
|
60
|
-
const checkReady = () => {
|
|
61
|
-
if (pageEnabled && runtimeEnabled) {
|
|
62
|
-
resolve();
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
this.ws.on("open", () => {
|
|
66
|
-
// Enable Page domain to receive navigation events
|
|
67
|
-
pageEnableId = this.messageId++;
|
|
68
|
-
this.send("Page.enable", {}, pageEnableId);
|
|
69
|
-
// Enable Runtime domain for URL checking
|
|
70
|
-
runtimeEnableId = this.messageId++;
|
|
71
|
-
this.send("Runtime.enable", {}, runtimeEnableId);
|
|
72
|
-
});
|
|
73
|
-
this.ws.on("message", (data) => {
|
|
74
|
-
const message = JSON.parse(data.toString());
|
|
75
|
-
// Check for enable confirmations
|
|
76
|
-
if (message.id === pageEnableId) {
|
|
77
|
-
pageEnabled = true;
|
|
78
|
-
checkReady();
|
|
79
|
-
}
|
|
80
|
-
else if (message.id === runtimeEnableId) {
|
|
81
|
-
runtimeEnabled = true;
|
|
82
|
-
checkReady();
|
|
83
|
-
}
|
|
84
|
-
this.handleMessage(message);
|
|
85
|
-
});
|
|
86
|
-
this.ws.on("error", () => {
|
|
87
|
-
// Silently handle errors
|
|
88
|
-
reject(new Error("WebSocket error"));
|
|
89
|
-
});
|
|
90
|
-
this.ws.on("close", () => {
|
|
91
|
-
this.ws = null;
|
|
92
|
-
});
|
|
93
|
-
// Timeout after 5 seconds
|
|
94
|
-
setTimeout(() => {
|
|
95
|
-
if (!pageEnabled || !runtimeEnabled) {
|
|
96
|
-
resolve(); // Resolve anyway to not block startup
|
|
97
|
-
}
|
|
98
|
-
}, 5000);
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
// Silently handle errors
|
|
102
|
-
reject(error);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Stop capturing and cleanup
|
|
108
|
-
*/
|
|
109
|
-
async stop() {
|
|
110
|
-
if (this.isCapturing) {
|
|
111
|
-
await this.stopScreencast();
|
|
112
|
-
}
|
|
113
|
-
if (this.ws) {
|
|
114
|
-
this.ws.close();
|
|
115
|
-
this.ws = null;
|
|
116
|
-
}
|
|
117
|
-
// this.logFn("[CDP] Stopped")
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Handle CDP messages
|
|
121
|
-
*/
|
|
122
|
-
handleMessage(message) {
|
|
123
|
-
// Uncomment for CDP event debugging:
|
|
124
|
-
// if (message.method && (message.method.startsWith("Page.") || message.method.startsWith("Network."))) {
|
|
125
|
-
// this.logFn(`[CDP] Received CDP event: ${message.method}`)
|
|
126
|
-
// }
|
|
127
|
-
// Navigation started - check URL before capturing
|
|
128
|
-
// Page.frameStartedLoading fires at the start of navigation
|
|
129
|
-
// Page.frameNavigated fires after the frame navigates (including reloads)
|
|
130
|
-
if (message.method === "Page.frameStartedLoading") {
|
|
131
|
-
this.captureTrigger = "load";
|
|
132
|
-
this.checkUrlAndStartCapture();
|
|
133
|
-
}
|
|
134
|
-
else if (message.method === "Page.frameNavigated") {
|
|
135
|
-
// Page.frameNavigated fires for both navigations and reloads
|
|
136
|
-
// This is essential for capturing CLS after Page.reload()
|
|
137
|
-
this.captureTrigger = "navigation";
|
|
138
|
-
this.checkUrlAndStartCapture();
|
|
139
|
-
}
|
|
140
|
-
// Navigation finished - save and stop
|
|
141
|
-
else if (message.method === "Page.loadEventFired") {
|
|
142
|
-
this.onNavigationComplete();
|
|
143
|
-
}
|
|
144
|
-
// Screencast frame received
|
|
145
|
-
else if (message.method === "Page.screencastFrame" && message.params) {
|
|
146
|
-
this.onScreencastFrame(message.params);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Check URL before starting capture - only capture the active app origin.
|
|
151
|
-
*/
|
|
152
|
-
async checkUrlAndStartCapture() {
|
|
153
|
-
try {
|
|
154
|
-
// Query current page URL using Runtime.evaluate
|
|
155
|
-
const evalId = this.messageId++;
|
|
156
|
-
this.send("Runtime.evaluate", {
|
|
157
|
-
expression: "window.location.href",
|
|
158
|
-
returnByValue: true
|
|
159
|
-
}, evalId);
|
|
160
|
-
// Wait for response (hacky but works for now)
|
|
161
|
-
let handled = false;
|
|
162
|
-
const checkResponse = (message) => {
|
|
163
|
-
if (handled)
|
|
164
|
-
return;
|
|
165
|
-
if (message.id === evalId && message.result?.result?.value) {
|
|
166
|
-
handled = true;
|
|
167
|
-
const url = message.result.result.value;
|
|
168
|
-
// this.logFn(`[CDP] Current URL: ${url}`)
|
|
169
|
-
if (this.allowedUrlMatches.some((match) => url.includes(match))) {
|
|
170
|
-
// this.logFn("[CDP] URL matches app, starting capture")
|
|
171
|
-
this.onNavigationStart();
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
// this.logFn("[CDP] Skipping capture - URL does not match tracked app origins")
|
|
175
|
-
}
|
|
176
|
-
// Remove listener after handling
|
|
177
|
-
if (this.ws) {
|
|
178
|
-
this.ws.off("message", responseHandler);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
const responseHandler = (data) => {
|
|
183
|
-
checkResponse(JSON.parse(data.toString()));
|
|
184
|
-
};
|
|
185
|
-
if (this.ws) {
|
|
186
|
-
this.ws.on("message", responseHandler);
|
|
187
|
-
// Timeout after 500ms - fall back to capturing anyway
|
|
188
|
-
setTimeout(() => {
|
|
189
|
-
if (this.ws) {
|
|
190
|
-
this.ws.off("message", responseHandler);
|
|
191
|
-
// IMPORTANT: If URL check times out (e.g., during page reload when context is destroyed),
|
|
192
|
-
// start capture anyway to ensure we don't miss CLS measurements
|
|
193
|
-
if (!handled) {
|
|
194
|
-
handled = true;
|
|
195
|
-
this.onNavigationStart();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}, 500);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
catch (error) {
|
|
202
|
-
this.logFn(`[CDP] Failed to check URL - ${error}`);
|
|
203
|
-
// Fall back to capturing anyway
|
|
204
|
-
this.onNavigationStart();
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Navigation started - begin capturing screencast
|
|
209
|
-
*/
|
|
210
|
-
onNavigationStart() {
|
|
211
|
-
// this.logFn("[CDP] Navigation started, beginning screencast capture")
|
|
212
|
-
// Stop any existing capture first
|
|
213
|
-
if (this.isCapturing) {
|
|
214
|
-
this.send("Page.stopScreencast", {});
|
|
215
|
-
}
|
|
216
|
-
this.navigationStartTime = Date.now();
|
|
217
|
-
this.currentSessionId = new Date()
|
|
218
|
-
.toISOString()
|
|
219
|
-
.replace(/:/g, "-")
|
|
220
|
-
.replace(/\.\d{3}Z$/, "Z");
|
|
221
|
-
this.buffer = [];
|
|
222
|
-
this.layoutShifts = [];
|
|
223
|
-
this.isCapturing = true;
|
|
224
|
-
// Install CLS observer if not already present
|
|
225
|
-
this.installCLSObserver();
|
|
226
|
-
// Start screencast at 15fps with good quality
|
|
227
|
-
this.send("Page.startScreencast", {
|
|
228
|
-
format: "png",
|
|
229
|
-
quality: 80,
|
|
230
|
-
maxWidth: 1920,
|
|
231
|
-
maxHeight: 1080,
|
|
232
|
-
everyNthFrame: 1
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Navigation completed - save frames and stop (after delay to catch hydration)
|
|
237
|
-
*/
|
|
238
|
-
async onNavigationComplete() {
|
|
239
|
-
if (!this.isCapturing)
|
|
240
|
-
return;
|
|
241
|
-
// this.logFn(`[CDP] Page loaded, capturing 2 more seconds for hydration jank...`)
|
|
242
|
-
// Continue capturing for 2 more seconds to catch hydration issues
|
|
243
|
-
// Hydration often happens right after page load completes
|
|
244
|
-
setTimeout(async () => {
|
|
245
|
-
if (!this.isCapturing)
|
|
246
|
-
return;
|
|
247
|
-
// this.logFn(`[CDP] Navigation complete, saving ${this.buffer.length} frames`)
|
|
248
|
-
// Save all buffered frames
|
|
249
|
-
for (const frame of this.buffer) {
|
|
250
|
-
const screenshotPath = join(this.screenshotDir, `${this.currentSessionId}-jank-${frame.timestamp}ms.png`);
|
|
251
|
-
try {
|
|
252
|
-
const buffer = Buffer.from(frame.data, "base64");
|
|
253
|
-
writeFileSync(screenshotPath, buffer);
|
|
254
|
-
}
|
|
255
|
-
catch (error) {
|
|
256
|
-
this.logFn(`[CDP] Failed to save frame - ${error}`);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
// this.logFn(`[CDP] Saved ${this.buffer.length} frames for session ${this.currentSessionId}`)
|
|
260
|
-
// Save session metadata with CLS data
|
|
261
|
-
const metadataPath = join(this.screenshotDir, `${this.currentSessionId}-metadata.json`);
|
|
262
|
-
const totalCLS = this.layoutShifts.reduce((sum, shift) => sum + shift.score, 0);
|
|
263
|
-
const metadata = {
|
|
264
|
-
sessionId: this.currentSessionId,
|
|
265
|
-
frameCount: this.buffer.length,
|
|
266
|
-
navigationStartTime: this.navigationStartTime,
|
|
267
|
-
captureEndTime: Date.now(),
|
|
268
|
-
appPort: this.appPort,
|
|
269
|
-
cssViewport: this.viewportInfo, // CSS viewport dimensions from window.innerWidth
|
|
270
|
-
captureTrigger: this.captureTrigger, // "navigation" or "load"
|
|
271
|
-
layoutShifts: this.layoutShifts,
|
|
272
|
-
totalCLS,
|
|
273
|
-
clsGrade: totalCLS <= 0.1 ? "good" : totalCLS <= 0.25 ? "needs-improvement" : "poor"
|
|
274
|
-
};
|
|
275
|
-
try {
|
|
276
|
-
writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
|
|
277
|
-
if (totalCLS > 0) {
|
|
278
|
-
this.logFn(`[CDP] Detected ${this.layoutShifts.length} layout shifts (CLS: ${totalCLS.toFixed(4)})`);
|
|
279
|
-
// Generate detailed CLS analysis for each shift
|
|
280
|
-
this.layoutShifts.forEach((shift, index) => {
|
|
281
|
-
// Find frames immediately before and after the shift timestamp
|
|
282
|
-
// Sort frames by timestamp
|
|
283
|
-
const sortedFrames = [...this.buffer].sort((a, b) => a.timestamp - b.timestamp);
|
|
284
|
-
// Find the frame immediately before the shift
|
|
285
|
-
const beforeFrames = sortedFrames.filter((f) => f.timestamp < shift.timestamp);
|
|
286
|
-
const previousFrame = beforeFrames.length >= 2 ? beforeFrames[beforeFrames.length - 2] : beforeFrames[beforeFrames.length - 1];
|
|
287
|
-
// Find the frame immediately after the previous frame
|
|
288
|
-
const shiftFrame = beforeFrames[beforeFrames.length - 1];
|
|
289
|
-
if (previousFrame && shiftFrame && shift.sources && shift.sources.length > 0) {
|
|
290
|
-
const previousFilename = `${this.currentSessionId}-jank-${previousFrame.timestamp}ms.png`;
|
|
291
|
-
const shiftFilename = `${this.currentSessionId}-jank-${shiftFrame.timestamp}ms.png`;
|
|
292
|
-
// Generate human-readable description of the shift
|
|
293
|
-
const descriptions = [];
|
|
294
|
-
for (const source of shift.sources) {
|
|
295
|
-
if (source.node && source.previousRect && source.currentRect) {
|
|
296
|
-
const deltaX = source.currentRect.x - source.previousRect.x;
|
|
297
|
-
const deltaY = source.currentRect.y - source.previousRect.y;
|
|
298
|
-
const direction = deltaY > 0 ? "down" : deltaY < 0 ? "up" : deltaX > 0 ? "right" : "left";
|
|
299
|
-
const distance = Math.abs(deltaY || deltaX);
|
|
300
|
-
descriptions.push(`<${source.node}> shifted ${direction} by ${distance.toFixed(0)}px`);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
this.logFn(`[CDP] CLS #${index + 1} (score: ${shift.score.toFixed(4)}, time: ${shift.timestamp.toFixed(0)}ms):`);
|
|
304
|
-
for (const desc of descriptions) {
|
|
305
|
-
this.logFn(`[CDP] - ${desc}`);
|
|
306
|
-
}
|
|
307
|
-
this.logFn(`[CDP] Before: ${join(this.screenshotDir, previousFilename)}`);
|
|
308
|
-
this.logFn(`[CDP] After: ${join(this.screenshotDir, shiftFilename)}`);
|
|
309
|
-
this.logFn(`[CDP] 💡 Analyze both images to identify visual differences causing the layout shift`);
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
catch (error) {
|
|
315
|
-
this.logFn(`[CDP] Failed to save metadata - ${error}`);
|
|
316
|
-
}
|
|
317
|
-
this.logFn(`[SCREENCAST] Frames saved to: ${this.screenshotDir}`);
|
|
318
|
-
await this.stopScreencast();
|
|
319
|
-
}, 2000);
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Received a screencast frame - add to buffer
|
|
323
|
-
*/
|
|
324
|
-
onScreencastFrame(params) {
|
|
325
|
-
if (!this.isCapturing)
|
|
326
|
-
return;
|
|
327
|
-
const frameTimestamp = Date.now() - this.navigationStartTime;
|
|
328
|
-
const frameData = params.data;
|
|
329
|
-
const sessionId = params.sessionId;
|
|
330
|
-
// Acknowledge frame so we get more
|
|
331
|
-
this.send("Page.screencastFrameAck", { sessionId });
|
|
332
|
-
// Buffer frames (no time limit, onNavigationComplete handles stopping)
|
|
333
|
-
this.buffer.push({
|
|
334
|
-
timestamp: frameTimestamp,
|
|
335
|
-
data: frameData,
|
|
336
|
-
absoluteTime: Date.now()
|
|
337
|
-
});
|
|
338
|
-
// Keep buffer trimmed to prevent memory issues (max 10 seconds of frames)
|
|
339
|
-
const now = Date.now();
|
|
340
|
-
this.buffer = this.buffer.filter((f) => now - f.absoluteTime < 10000);
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Stop screencast capture
|
|
344
|
-
*/
|
|
345
|
-
async stopScreencast() {
|
|
346
|
-
if (!this.isCapturing)
|
|
347
|
-
return;
|
|
348
|
-
this.send("Page.stopScreencast", {});
|
|
349
|
-
this.isCapturing = false;
|
|
350
|
-
this.buffer = [];
|
|
351
|
-
// this.logFn("[CDP] Stopped screencast capture")
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Install PerformanceObserver for layout shifts (passive, no reload needed)
|
|
355
|
-
*/
|
|
356
|
-
installCLSObserver() {
|
|
357
|
-
const observerScript = `
|
|
358
|
-
(function() {
|
|
359
|
-
// Reset layout shifts array for new navigation
|
|
360
|
-
window.__dev3000_layout_shifts__ = [];
|
|
361
|
-
|
|
362
|
-
// Update viewport info for current navigation
|
|
363
|
-
window.__dev3000_viewport__ = {
|
|
364
|
-
width: window.innerWidth,
|
|
365
|
-
height: window.innerHeight,
|
|
366
|
-
devicePixelRatio: window.devicePixelRatio || 1
|
|
367
|
-
};
|
|
368
|
-
|
|
369
|
-
// Install observer if not already present
|
|
370
|
-
if (window.__dev3000_cls_observer__) return;
|
|
371
|
-
window.__dev3000_cls_observer__ = true;
|
|
372
|
-
|
|
373
|
-
try {
|
|
374
|
-
const observer = new PerformanceObserver((list) => {
|
|
375
|
-
for (const entry of list.getEntries()) {
|
|
376
|
-
if (entry.entryType === 'layout-shift' && !entry.hadRecentInput) {
|
|
377
|
-
// For each shift, try to get the actual current bounding box and position style
|
|
378
|
-
const sources = entry.sources ? entry.sources.map(s => {
|
|
379
|
-
let actualRect = null;
|
|
380
|
-
let positionStyle = null;
|
|
381
|
-
if (s.node && s.node.nodeName) {
|
|
382
|
-
try {
|
|
383
|
-
// Query the first matching element (nav, header, etc.)
|
|
384
|
-
const element = document.querySelector(s.node.nodeName.toLowerCase());
|
|
385
|
-
if (element) {
|
|
386
|
-
const rect = element.getBoundingClientRect();
|
|
387
|
-
actualRect = {
|
|
388
|
-
x: rect.x,
|
|
389
|
-
y: rect.y,
|
|
390
|
-
width: rect.width,
|
|
391
|
-
height: rect.height
|
|
392
|
-
};
|
|
393
|
-
|
|
394
|
-
// Get computed position style to detect fixed/absolute elements
|
|
395
|
-
const computed = window.getComputedStyle(element);
|
|
396
|
-
positionStyle = computed.position;
|
|
397
|
-
}
|
|
398
|
-
} catch (e) {
|
|
399
|
-
// Ignore errors
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
return {
|
|
404
|
-
node: s.node ? s.node.nodeName : undefined,
|
|
405
|
-
position: positionStyle,
|
|
406
|
-
previousRect: s.previousRect ? {
|
|
407
|
-
x: s.previousRect.x,
|
|
408
|
-
y: s.previousRect.y,
|
|
409
|
-
width: s.previousRect.width,
|
|
410
|
-
height: s.previousRect.height
|
|
411
|
-
} : {},
|
|
412
|
-
currentRect: s.currentRect ? {
|
|
413
|
-
x: s.currentRect.x,
|
|
414
|
-
y: s.currentRect.y,
|
|
415
|
-
width: s.currentRect.width,
|
|
416
|
-
height: s.currentRect.height
|
|
417
|
-
} : {},
|
|
418
|
-
actualRect: actualRect
|
|
419
|
-
};
|
|
420
|
-
}) : [];
|
|
421
|
-
|
|
422
|
-
window.__dev3000_layout_shifts__.push({
|
|
423
|
-
score: entry.value,
|
|
424
|
-
timestamp: entry.startTime,
|
|
425
|
-
sources: sources
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
observer.observe({ type: 'layout-shift', buffered: true });
|
|
432
|
-
console.log('CLS observer installed');
|
|
433
|
-
} catch (e) {
|
|
434
|
-
console.error('Failed to install CLS observer:', e);
|
|
435
|
-
}
|
|
436
|
-
})();
|
|
437
|
-
`;
|
|
438
|
-
// Inject observer via Runtime.evaluate (reinstall on each navigation to reset)
|
|
439
|
-
const evalId = this.messageId++;
|
|
440
|
-
this.send("Runtime.evaluate", { expression: observerScript, returnByValue: false }, evalId);
|
|
441
|
-
// Set up periodic polling to retrieve layout shift data
|
|
442
|
-
this.pollLayoutShifts();
|
|
443
|
-
// this.logFn("Installed CLS observer")
|
|
444
|
-
}
|
|
445
|
-
/**
|
|
446
|
-
* Poll for layout shift data from the injected observer
|
|
447
|
-
*/
|
|
448
|
-
pollLayoutShifts() {
|
|
449
|
-
if (!this.isCapturing)
|
|
450
|
-
return;
|
|
451
|
-
const pollId = this.messageId++;
|
|
452
|
-
const viewportId = this.messageId++;
|
|
453
|
-
this.send("Runtime.evaluate", {
|
|
454
|
-
expression: "window.__dev3000_layout_shifts__ || []",
|
|
455
|
-
returnByValue: true
|
|
456
|
-
}, pollId);
|
|
457
|
-
// Also get viewport info
|
|
458
|
-
this.send("Runtime.evaluate", {
|
|
459
|
-
expression: "window.__dev3000_viewport__ || {}",
|
|
460
|
-
returnByValue: true
|
|
461
|
-
}, viewportId);
|
|
462
|
-
// Listen for response
|
|
463
|
-
const handlePollResponse = (message) => {
|
|
464
|
-
if (message.id === pollId && message.result?.result?.value) {
|
|
465
|
-
const shifts = message.result.result.value;
|
|
466
|
-
if (shifts.length > this.layoutShifts.length) {
|
|
467
|
-
// New shifts detected
|
|
468
|
-
const newShifts = shifts.slice(this.layoutShifts.length);
|
|
469
|
-
this.layoutShifts.push(...newShifts);
|
|
470
|
-
newShifts.forEach((shift) => {
|
|
471
|
-
const element = shift.sources?.[0]?.node || "unidentified";
|
|
472
|
-
const position = shift.sources?.[0]?.position;
|
|
473
|
-
// Only log verbose CDP diagnostics when debug mode is enabled
|
|
474
|
-
if (this.debug) {
|
|
475
|
-
// Log with context about whether we can verify this shift
|
|
476
|
-
if (!shift.sources?.[0] || element === "unidentified" || position === null || position === undefined) {
|
|
477
|
-
this.logFn(`[CDP] Unverified shift detected (score: ${shift.score.toFixed(4)}, time: ${shift.timestamp.toFixed(0)}ms) - element could not be identified, likely fixed overlay noise`);
|
|
478
|
-
}
|
|
479
|
-
else if (position === "fixed" || position === "absolute") {
|
|
480
|
-
this.logFn(`[CDP] Fixed/absolute element shift detected (${element}, position: ${position}, score: ${shift.score.toFixed(4)}) - will be filtered as overlay noise`);
|
|
481
|
-
}
|
|
482
|
-
else {
|
|
483
|
-
this.logFn(`[CDP] Layout shift detected (element: ${element}, position: ${position}, score: ${shift.score.toFixed(4)}, time: ${shift.timestamp.toFixed(0)}ms)`);
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
if (message.id === viewportId && message.result?.result?.value) {
|
|
490
|
-
this.viewportInfo = message.result.result.value;
|
|
491
|
-
}
|
|
492
|
-
};
|
|
493
|
-
const responseHandler = (data) => {
|
|
494
|
-
handlePollResponse(JSON.parse(data.toString()));
|
|
495
|
-
};
|
|
496
|
-
if (this.ws) {
|
|
497
|
-
this.ws.on("message", responseHandler);
|
|
498
|
-
// Timeout after 500ms
|
|
499
|
-
setTimeout(() => {
|
|
500
|
-
if (this.ws) {
|
|
501
|
-
this.ws.off("message", responseHandler);
|
|
502
|
-
}
|
|
503
|
-
}, 500);
|
|
504
|
-
}
|
|
505
|
-
// Poll every 500ms while capturing
|
|
506
|
-
if (this.isCapturing) {
|
|
507
|
-
setTimeout(() => this.pollLayoutShifts(), 500);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Send CDP command
|
|
512
|
-
*/
|
|
513
|
-
send(method, params, id) {
|
|
514
|
-
if (!this.ws)
|
|
515
|
-
return;
|
|
516
|
-
this.ws.send(JSON.stringify({
|
|
517
|
-
id: id ?? this.messageId++,
|
|
518
|
-
method,
|
|
519
|
-
params
|
|
520
|
-
}));
|
|
521
|
-
}
|
|
522
|
-
/**
|
|
523
|
-
* Get the most recent session ID (for fix_my_app to reference)
|
|
524
|
-
*/
|
|
525
|
-
getLatestSessionId() {
|
|
526
|
-
return this.currentSessionId;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
//# sourceMappingURL=screencast-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"screencast-manager.js","sourceRoot":"","sources":["../src/screencast-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base interfaces and types for error detectors
|
|
3
|
-
* Responsible for identifying critical errors in server output
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Base interface for error detectors
|
|
7
|
-
* Responsible for determining if a message indicates a critical error
|
|
8
|
-
*/
|
|
9
|
-
export interface ErrorDetector {
|
|
10
|
-
/**
|
|
11
|
-
* Check if a message indicates a critical error
|
|
12
|
-
* @param message The raw message to check
|
|
13
|
-
* @returns true if the message indicates a critical error
|
|
14
|
-
*/
|
|
15
|
-
isCritical(message: string): boolean;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Base error detector with common error patterns
|
|
19
|
-
* Provides a foundation that specific framework detectors can extend
|
|
20
|
-
*/
|
|
21
|
-
export declare class BaseErrorDetector implements ErrorDetector {
|
|
22
|
-
isCritical(message: string): boolean;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/services/parsers/error-detectors/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;CACrC;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAsCnC;CACF"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base interfaces and types for error detectors
|
|
3
|
-
* Responsible for identifying critical errors in server output
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Base error detector with common error patterns
|
|
7
|
-
* Provides a foundation that specific framework detectors can extend
|
|
8
|
-
*/
|
|
9
|
-
export class BaseErrorDetector {
|
|
10
|
-
isCritical(message) {
|
|
11
|
-
// Common critical error patterns across all frameworks
|
|
12
|
-
const criticalPatterns = [
|
|
13
|
-
// Connection and port errors
|
|
14
|
-
/EADDRINUSE/, // Port already in use
|
|
15
|
-
/EACCES/, // Permission denied
|
|
16
|
-
/ENOENT/, // File not found
|
|
17
|
-
/ECONNREFUSED/, // Connection refused
|
|
18
|
-
// System-level errors
|
|
19
|
-
/out of memory/i, // Memory issues
|
|
20
|
-
/segmentation fault/i, // Segfaults
|
|
21
|
-
/stack overflow/i, // Stack overflows
|
|
22
|
-
// Generic fatal errors
|
|
23
|
-
/FATAL/, // Fatal errors
|
|
24
|
-
/PANIC/, // Panic conditions
|
|
25
|
-
/SIGKILL/, // Process killed
|
|
26
|
-
/SIGTERM/, // Process terminated
|
|
27
|
-
// Module/dependency errors (but exclude warnings)
|
|
28
|
-
/^(?!.*warning).*Cannot find module/i, // Missing modules (exclude warnings)
|
|
29
|
-
/^(?!.*warning).*Module not found/i, // Missing modules (exclude warnings)
|
|
30
|
-
/^(?!.*warning).*Package not found/i, // Missing packages (exclude warnings)
|
|
31
|
-
// Syntax and parsing errors (but exclude warnings)
|
|
32
|
-
/^(?!.*warning).*SyntaxError/i, // Syntax errors (exclude warnings)
|
|
33
|
-
/^(?!.*warning).*Parse error/i, // Parse errors (exclude warnings)
|
|
34
|
-
/^(?!.*warning).*Unexpected token/i // Parsing issues (exclude warnings)
|
|
35
|
-
];
|
|
36
|
-
// Early return false for obvious non-critical patterns to avoid regex overhead
|
|
37
|
-
if (/warning/i.test(message) || /WARN/.test(message) || /deprecated/i.test(message)) {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
// Check for critical patterns
|
|
41
|
-
return criticalPatterns.some((pattern) => pattern.test(message));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=base.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/services/parsers/error-detectors/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAC5B,UAAU,CAAC,OAAe;QACxB,uDAAuD;QACvD,MAAM,gBAAgB,GAAG;YACvB,6BAA6B;YAC7B,YAAY,EAAE,sBAAsB;YACpC,QAAQ,EAAE,oBAAoB;YAC9B,QAAQ,EAAE,iBAAiB;YAC3B,cAAc,EAAE,qBAAqB;YAErC,sBAAsB;YACtB,gBAAgB,EAAE,gBAAgB;YAClC,qBAAqB,EAAE,YAAY;YACnC,iBAAiB,EAAE,kBAAkB;YAErC,uBAAuB;YACvB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,mBAAmB;YAC5B,SAAS,EAAE,iBAAiB;YAC5B,SAAS,EAAE,qBAAqB;YAEhC,kDAAkD;YAClD,qCAAqC,EAAE,qCAAqC;YAC5E,mCAAmC,EAAE,qCAAqC;YAC1E,oCAAoC,EAAE,sCAAsC;YAE5E,mDAAmD;YACnD,8BAA8B,EAAE,mCAAmC;YACnE,8BAA8B,EAAE,kCAAkC;YAClE,mCAAmC,CAAC,oCAAoC;SACzE,CAAA;QAED,+EAA+E;QAC/E,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpF,OAAO,KAAK,CAAA;QACd,CAAC;QAED,8BAA8B;QAC9B,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAClE,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/parsers/error-detectors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/parsers/error-detectors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAiB,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Next.js error detector for Next.js applications
|
|
3
|
-
* Extends base detector with Next.js-specific error patterns
|
|
4
|
-
*/
|
|
5
|
-
import { BaseErrorDetector } from "./base.js";
|
|
6
|
-
export declare class NextJsErrorDetector extends BaseErrorDetector {
|
|
7
|
-
isCritical(message: string): boolean;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=nextjs.d.ts.map
|