wiretap-mcp 2.0.0
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/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/monitors/crash-android.d.ts +20 -0
- package/dist/monitors/crash-android.d.ts.map +1 -0
- package/dist/monitors/crash-android.js +134 -0
- package/dist/monitors/crash-android.js.map +1 -0
- package/dist/monitors/crash-ios.d.ts +17 -0
- package/dist/monitors/crash-ios.d.ts.map +1 -0
- package/dist/monitors/crash-ios.js +116 -0
- package/dist/monitors/crash-ios.js.map +1 -0
- package/dist/monitors/hermes.d.ts +26 -0
- package/dist/monitors/hermes.d.ts.map +1 -0
- package/dist/monitors/hermes.js +175 -0
- package/dist/monitors/hermes.js.map +1 -0
- package/dist/monitors/reactotron.d.ts +18 -0
- package/dist/monitors/reactotron.d.ts.map +1 -0
- package/dist/monitors/reactotron.js +106 -0
- package/dist/monitors/reactotron.js.map +1 -0
- package/dist/monitors/terminal.d.ts +25 -0
- package/dist/monitors/terminal.d.ts.map +1 -0
- package/dist/monitors/terminal.js +154 -0
- package/dist/monitors/terminal.js.map +1 -0
- package/dist/parsers/cdp-parser.d.ts +64 -0
- package/dist/parsers/cdp-parser.d.ts.map +1 -0
- package/dist/parsers/cdp-parser.js +115 -0
- package/dist/parsers/cdp-parser.js.map +1 -0
- package/dist/parsers/crash-parser.d.ts +5 -0
- package/dist/parsers/crash-parser.d.ts.map +1 -0
- package/dist/parsers/crash-parser.js +112 -0
- package/dist/parsers/crash-parser.js.map +1 -0
- package/dist/parsers/log-parser.d.ts +5 -0
- package/dist/parsers/log-parser.d.ts.map +1 -0
- package/dist/parsers/log-parser.js +141 -0
- package/dist/parsers/log-parser.js.map +1 -0
- package/dist/parsers/reactotron-parser.d.ts +17 -0
- package/dist/parsers/reactotron-parser.d.ts.map +1 -0
- package/dist/parsers/reactotron-parser.js +83 -0
- package/dist/parsers/reactotron-parser.js.map +1 -0
- package/dist/server.d.ts +19 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +224 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/log-store.d.ts +41 -0
- package/dist/storage/log-store.d.ts.map +1 -0
- package/dist/storage/log-store.js +118 -0
- package/dist/storage/log-store.js.map +1 -0
- package/dist/storage/persistence.d.ts +26 -0
- package/dist/storage/persistence.d.ts.map +1 -0
- package/dist/storage/persistence.js +123 -0
- package/dist/storage/persistence.js.map +1 -0
- package/dist/tools/clear-logs.d.ts +8 -0
- package/dist/tools/clear-logs.d.ts.map +1 -0
- package/dist/tools/clear-logs.js +15 -0
- package/dist/tools/clear-logs.js.map +1 -0
- package/dist/tools/get-api-calls.d.ts +11 -0
- package/dist/tools/get-api-calls.d.ts.map +1 -0
- package/dist/tools/get-api-calls.js +26 -0
- package/dist/tools/get-api-calls.js.map +1 -0
- package/dist/tools/get-crashes.d.ts +11 -0
- package/dist/tools/get-crashes.d.ts.map +1 -0
- package/dist/tools/get-crashes.js +42 -0
- package/dist/tools/get-crashes.js.map +1 -0
- package/dist/tools/get-errors.d.ts +12 -0
- package/dist/tools/get-errors.d.ts.map +1 -0
- package/dist/tools/get-errors.js +52 -0
- package/dist/tools/get-errors.js.map +1 -0
- package/dist/tools/get-hermes-logs.d.ts +12 -0
- package/dist/tools/get-hermes-logs.d.ts.map +1 -0
- package/dist/tools/get-hermes-logs.js +33 -0
- package/dist/tools/get-hermes-logs.js.map +1 -0
- package/dist/tools/get-logs.d.ts +21 -0
- package/dist/tools/get-logs.d.ts.map +1 -0
- package/dist/tools/get-logs.js +50 -0
- package/dist/tools/get-logs.js.map +1 -0
- package/dist/tools/get-network.d.ts +12 -0
- package/dist/tools/get-network.d.ts.map +1 -0
- package/dist/tools/get-network.js +35 -0
- package/dist/tools/get-network.js.map +1 -0
- package/dist/tools/get-performance.d.ts +10 -0
- package/dist/tools/get-performance.d.ts.map +1 -0
- package/dist/tools/get-performance.js +32 -0
- package/dist/tools/get-performance.js.map +1 -0
- package/dist/tools/get-state.d.ts +11 -0
- package/dist/tools/get-state.d.ts.map +1 -0
- package/dist/tools/get-state.js +26 -0
- package/dist/tools/get-state.js.map +1 -0
- package/dist/tools/get-status.d.ts +20 -0
- package/dist/tools/get-status.d.ts.map +1 -0
- package/dist/tools/get-status.js +52 -0
- package/dist/tools/get-status.js.map +1 -0
- package/dist/tools/search-logs.d.ts +11 -0
- package/dist/tools/search-logs.d.ts.map +1 -0
- package/dist/tools/search-logs.js +68 -0
- package/dist/tools/search-logs.js.map +1 -0
- package/dist/types.d.ts +123 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +65 -0
- package/scripts/install.sh +33 -0
- package/wiretap.config.json +8 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCDPConsole = parseCDPConsole;
|
|
4
|
+
exports.parseCDPRequest = parseCDPRequest;
|
|
5
|
+
exports.parseCDPResponse = parseCDPResponse;
|
|
6
|
+
exports.isCDPConsoleEvent = isCDPConsoleEvent;
|
|
7
|
+
exports.isCDPRequestEvent = isCDPRequestEvent;
|
|
8
|
+
exports.isCDPResponseEvent = isCDPResponseEvent;
|
|
9
|
+
function mapConsoleLevel(type) {
|
|
10
|
+
switch (type) {
|
|
11
|
+
case "error":
|
|
12
|
+
return "error";
|
|
13
|
+
case "warning":
|
|
14
|
+
case "warn":
|
|
15
|
+
return "warn";
|
|
16
|
+
case "debug":
|
|
17
|
+
case "trace":
|
|
18
|
+
return "debug";
|
|
19
|
+
default:
|
|
20
|
+
return "info";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function stringifyArg(arg) {
|
|
24
|
+
if (arg.type === "string")
|
|
25
|
+
return String(arg.value ?? arg.description ?? "");
|
|
26
|
+
if (arg.type === "number" || arg.type === "boolean")
|
|
27
|
+
return String(arg.value);
|
|
28
|
+
if (arg.type === "undefined")
|
|
29
|
+
return "undefined";
|
|
30
|
+
if (arg.description !== undefined)
|
|
31
|
+
return String(arg.description);
|
|
32
|
+
if (arg.value !== undefined) {
|
|
33
|
+
if (typeof arg.value === "object" && arg.value !== null) {
|
|
34
|
+
try {
|
|
35
|
+
return JSON.stringify(arg.value);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return "[Circular]";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return String(arg.value);
|
|
42
|
+
}
|
|
43
|
+
return `[${arg.type}]`;
|
|
44
|
+
}
|
|
45
|
+
function serializeArgValue(arg) {
|
|
46
|
+
if (arg.value !== undefined) {
|
|
47
|
+
if (typeof arg.value === "object" && arg.value !== null)
|
|
48
|
+
return arg.value;
|
|
49
|
+
return arg.value;
|
|
50
|
+
}
|
|
51
|
+
if (arg.description !== undefined)
|
|
52
|
+
return arg.description;
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
function parseCDPConsole(event) {
|
|
56
|
+
const args = event.params.args || [];
|
|
57
|
+
const messageParts = args.map(stringifyArg);
|
|
58
|
+
const stackFrames = event.params.stackTrace?.callFrames;
|
|
59
|
+
let stackTrace;
|
|
60
|
+
let url;
|
|
61
|
+
let lineNumber;
|
|
62
|
+
if (stackFrames && stackFrames.length > 0) {
|
|
63
|
+
url = stackFrames[0].url;
|
|
64
|
+
lineNumber = stackFrames[0].lineNumber;
|
|
65
|
+
stackTrace = stackFrames
|
|
66
|
+
.map((f) => ` at ${f.functionName || "(anonymous)"} (${f.url}:${f.lineNumber}:${f.columnNumber})`)
|
|
67
|
+
.join("\n");
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
timestamp: new Date().toISOString(),
|
|
71
|
+
level: mapConsoleLevel(event.params.type),
|
|
72
|
+
message: messageParts.join(" "),
|
|
73
|
+
args: args.map(serializeArgValue),
|
|
74
|
+
stackTrace,
|
|
75
|
+
source: "hermes",
|
|
76
|
+
url,
|
|
77
|
+
lineNumber,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function parseCDPRequest(event) {
|
|
81
|
+
return {
|
|
82
|
+
requestId: event.params.requestId,
|
|
83
|
+
method: event.params.request.method,
|
|
84
|
+
url: event.params.request.url,
|
|
85
|
+
requestHeaders: event.params.request.headers,
|
|
86
|
+
startTime: event.params.timestamp,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function parseCDPResponse(event, pending) {
|
|
90
|
+
const duration = pending
|
|
91
|
+
? Math.round((event.params.timestamp - pending.startTime) * 1000)
|
|
92
|
+
: undefined;
|
|
93
|
+
return {
|
|
94
|
+
timestamp: new Date().toISOString(),
|
|
95
|
+
requestId: event.params.requestId,
|
|
96
|
+
method: pending?.method ?? "UNKNOWN",
|
|
97
|
+
url: event.params.response.url,
|
|
98
|
+
status: event.params.response.status,
|
|
99
|
+
mimeType: event.params.response.mimeType,
|
|
100
|
+
requestHeaders: pending?.requestHeaders,
|
|
101
|
+
responseHeaders: event.params.response.headers,
|
|
102
|
+
duration,
|
|
103
|
+
source: "cdp",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function isCDPConsoleEvent(msg) {
|
|
107
|
+
return msg.method === "Runtime.consoleAPICalled";
|
|
108
|
+
}
|
|
109
|
+
function isCDPRequestEvent(msg) {
|
|
110
|
+
return msg.method === "Network.requestWillBeSent";
|
|
111
|
+
}
|
|
112
|
+
function isCDPResponseEvent(msg) {
|
|
113
|
+
return msg.method === "Network.responseReceived";
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=cdp-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-parser.js","sourceRoot":"","sources":["../../src/parsers/cdp-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { CrashLogEntry } from "../types.js";
|
|
2
|
+
export declare function parseIOSCrashReport(content: string, filePath: string): Omit<CrashLogEntry, "id"> | null;
|
|
3
|
+
export declare function parseAndroidFatalException(lines: string[]): Omit<CrashLogEntry, "id"> | null;
|
|
4
|
+
export declare function parseAndroidNativeSignal(line: string): Omit<CrashLogEntry, "id"> | null;
|
|
5
|
+
//# sourceMappingURL=crash-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/crash-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAY5C,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,IAAI,CA+ClC;AAuBD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,IAAI,CA+B5F;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,IAAI,CAevF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseIOSCrashReport = parseIOSCrashReport;
|
|
4
|
+
exports.parseAndroidFatalException = parseAndroidFatalException;
|
|
5
|
+
exports.parseAndroidNativeSignal = parseAndroidNativeSignal;
|
|
6
|
+
// --- iOS crash report parsing ---
|
|
7
|
+
const RN_PROCESS_HINTS = [
|
|
8
|
+
"reactnative",
|
|
9
|
+
"expo",
|
|
10
|
+
"hermes",
|
|
11
|
+
"jsc",
|
|
12
|
+
// Common RN app bundle identifiers contain these
|
|
13
|
+
];
|
|
14
|
+
function parseIOSCrashReport(content, filePath) {
|
|
15
|
+
const processMatch = content.match(/^Process:\s+(.+?)(?:\s+\[|$)/m);
|
|
16
|
+
const processName = processMatch?.[1]?.trim() ?? "Unknown";
|
|
17
|
+
// Check if this is an RN-related crash (skip system processes)
|
|
18
|
+
const isRNRelated = RN_PROCESS_HINTS.some((hint) => content.toLowerCase().includes(hint)) ||
|
|
19
|
+
// .ips format may have different identifiers
|
|
20
|
+
content.includes("JavaScriptCore") ||
|
|
21
|
+
content.includes("libjsc") ||
|
|
22
|
+
// If we can't determine, include it (better to show than miss)
|
|
23
|
+
processMatch !== null;
|
|
24
|
+
if (!isRNRelated)
|
|
25
|
+
return null;
|
|
26
|
+
const exceptionMatch = content.match(/^Exception Type:\s+(.+)$/m);
|
|
27
|
+
const signalMatch = content.match(/^Exception Codes:\s+(.+)$/m);
|
|
28
|
+
const reasonMatch = content.match(/^Application Specific Information:\s*\n(.+)/m) ??
|
|
29
|
+
content.match(/^Termination Reason:\s+(.+)$/m) ??
|
|
30
|
+
content.match(/^Exception Type:\s+(.+)$/m);
|
|
31
|
+
// Extract the crashed thread's stack trace
|
|
32
|
+
const crashedThreadMatch = content.match(/^(Thread \d+ Crashed.*?:)\n([\s\S]*?)(?=\nThread \d+ |$|\nBinary Images)/m);
|
|
33
|
+
const stackTrace = crashedThreadMatch
|
|
34
|
+
? `${crashedThreadMatch[1]}\n${crashedThreadMatch[2].trim()}`
|
|
35
|
+
: extractFirstStackTrace(content);
|
|
36
|
+
// Try to get timestamp from file
|
|
37
|
+
const dateMatch = content.match(/^Date\/Time:\s+(.+)$/m) ??
|
|
38
|
+
content.match(/"timestamp"\s*:\s*"(.+?)"/);
|
|
39
|
+
return {
|
|
40
|
+
timestamp: dateMatch?.[1] ?? new Date().toISOString(),
|
|
41
|
+
platform: "ios",
|
|
42
|
+
processName,
|
|
43
|
+
crashReason: reasonMatch?.[1]?.trim() ?? "Unknown crash reason",
|
|
44
|
+
exceptionType: exceptionMatch?.[1]?.trim(),
|
|
45
|
+
signal: signalMatch?.[1]?.trim(),
|
|
46
|
+
stackTrace: stackTrace || "No stack trace available",
|
|
47
|
+
rawFilePath: filePath,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function extractFirstStackTrace(content) {
|
|
51
|
+
const lines = content.split("\n");
|
|
52
|
+
const stackLines = [];
|
|
53
|
+
let inStack = false;
|
|
54
|
+
for (const line of lines) {
|
|
55
|
+
if (/^\d+\s+\w/.test(line) || /^Thread \d+/.test(line)) {
|
|
56
|
+
inStack = true;
|
|
57
|
+
}
|
|
58
|
+
if (inStack) {
|
|
59
|
+
if (line.trim() === "" && stackLines.length > 0)
|
|
60
|
+
break;
|
|
61
|
+
stackLines.push(line);
|
|
62
|
+
if (stackLines.length >= 30)
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return stackLines.join("\n");
|
|
67
|
+
}
|
|
68
|
+
// --- Android crash parsing ---
|
|
69
|
+
function parseAndroidFatalException(lines) {
|
|
70
|
+
if (lines.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
const firstLine = lines[0];
|
|
73
|
+
// Typical: FATAL EXCEPTION: main
|
|
74
|
+
const threadMatch = firstLine.match(/FATAL EXCEPTION:\s+(.+)/);
|
|
75
|
+
// Find the exception line (usually line 2+)
|
|
76
|
+
let crashReason = "Unknown fatal exception";
|
|
77
|
+
let exceptionType;
|
|
78
|
+
const stackLines = [];
|
|
79
|
+
for (let i = 1; i < lines.length; i++) {
|
|
80
|
+
const line = lines[i];
|
|
81
|
+
// Exception lines look like: java.lang.NullPointerException: Attempt to invoke...
|
|
82
|
+
const exMatch = line.match(/^\s*([\w.]+Exception|[\w.]+Error):\s*(.*)/);
|
|
83
|
+
if (exMatch && !exceptionType) {
|
|
84
|
+
exceptionType = exMatch[1];
|
|
85
|
+
crashReason = exMatch[2] || exMatch[1];
|
|
86
|
+
}
|
|
87
|
+
stackLines.push(line);
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
platform: "android",
|
|
92
|
+
processName: threadMatch?.[1]?.trim() ?? "main",
|
|
93
|
+
crashReason,
|
|
94
|
+
exceptionType,
|
|
95
|
+
stackTrace: stackLines.join("\n"),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function parseAndroidNativeSignal(line) {
|
|
99
|
+
// Format: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 12345 (main)
|
|
100
|
+
const match = line.match(/Fatal signal \d+ \((\w+)\).*?(?:in tid \d+ \((.+?)\))?/);
|
|
101
|
+
if (!match)
|
|
102
|
+
return null;
|
|
103
|
+
return {
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
platform: "android",
|
|
106
|
+
processName: match[2] ?? "unknown",
|
|
107
|
+
crashReason: line.trim(),
|
|
108
|
+
signal: match[1],
|
|
109
|
+
stackTrace: line,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=crash-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-parser.js","sourceRoot":"","sources":["../../src/parsers/crash-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { TerminalLogEntry } from "../types.js";
|
|
2
|
+
export declare function parseTerminalLine(raw: string, detectedSource?: TerminalLogEntry["source"]): Omit<TerminalLogEntry, "id">;
|
|
3
|
+
export declare function shouldFilterLog(line: string, filterPatterns: string[]): boolean;
|
|
4
|
+
export declare function parseMultilineLog(chunk: string, detectedSource?: TerminalLogEntry["source"]): Omit<TerminalLogEntry, "id">[];
|
|
5
|
+
//# sourceMappingURL=log-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/log-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoD5D,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,cAAc,GAAE,gBAAgB,CAAC,QAAQ,CAAa,GACrD,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAoB9B;AA0CD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAS/E;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,gBAAgB,CAAC,QAAQ,CAAa,GACrD,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAqBhC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseTerminalLine = parseTerminalLine;
|
|
4
|
+
exports.shouldFilterLog = shouldFilterLog;
|
|
5
|
+
exports.parseMultilineLog = parseMultilineLog;
|
|
6
|
+
const ERROR_PATTERNS = [
|
|
7
|
+
/error/i,
|
|
8
|
+
/fatal/i,
|
|
9
|
+
/exception/i,
|
|
10
|
+
/crash/i,
|
|
11
|
+
/FAILURE/,
|
|
12
|
+
/BUILD FAILED/,
|
|
13
|
+
/Red ?Box/i,
|
|
14
|
+
/Cannot read propert/i,
|
|
15
|
+
/undefined is not/i,
|
|
16
|
+
/null is not/i,
|
|
17
|
+
/TypeError/,
|
|
18
|
+
/ReferenceError/,
|
|
19
|
+
/SyntaxError/,
|
|
20
|
+
/RangeError/,
|
|
21
|
+
/Invariant Violation/,
|
|
22
|
+
/Native crash/i,
|
|
23
|
+
/SIGABRT/,
|
|
24
|
+
/SIGSEGV/,
|
|
25
|
+
];
|
|
26
|
+
const WARN_PATTERNS = [
|
|
27
|
+
/warning/i,
|
|
28
|
+
/warn/i,
|
|
29
|
+
/deprecated/i,
|
|
30
|
+
/YellowBox/i,
|
|
31
|
+
/LogBox/i,
|
|
32
|
+
/WARN\s/,
|
|
33
|
+
];
|
|
34
|
+
const NATIVE_CRASH_PATTERNS = [
|
|
35
|
+
/Native crash/i,
|
|
36
|
+
/SIGABRT/,
|
|
37
|
+
/SIGSEGV/,
|
|
38
|
+
/signal \d+/,
|
|
39
|
+
/libc\+\+abi/,
|
|
40
|
+
/NSException/,
|
|
41
|
+
/java\.lang\.\w+Exception/,
|
|
42
|
+
/AndroidRuntime/,
|
|
43
|
+
/FATAL EXCEPTION/,
|
|
44
|
+
];
|
|
45
|
+
const STACK_TRACE_START = /^\s+at\s+|^\s+in\s+|^#\d+\s+/;
|
|
46
|
+
const SOURCE_PATTERNS = [
|
|
47
|
+
{ pattern: /metro/i, source: "metro" },
|
|
48
|
+
{ pattern: /expo/i, source: "expo" },
|
|
49
|
+
{ pattern: /react-native/i, source: "react-native" },
|
|
50
|
+
];
|
|
51
|
+
function parseTerminalLine(raw, detectedSource = "unknown") {
|
|
52
|
+
const timestamp = new Date().toISOString();
|
|
53
|
+
const trimmed = raw.trim();
|
|
54
|
+
const severity = detectSeverity(trimmed);
|
|
55
|
+
const isNativeCrash = NATIVE_CRASH_PATTERNS.some((p) => p.test(trimmed));
|
|
56
|
+
const source = detectSource(trimmed) ?? detectedSource;
|
|
57
|
+
const stackTrace = extractStackTrace(trimmed);
|
|
58
|
+
const message = cleanMessage(trimmed);
|
|
59
|
+
return {
|
|
60
|
+
timestamp,
|
|
61
|
+
severity,
|
|
62
|
+
message,
|
|
63
|
+
raw: trimmed,
|
|
64
|
+
source,
|
|
65
|
+
...(stackTrace && { stackTrace }),
|
|
66
|
+
...(isNativeCrash && { isNativeCrash }),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function detectSeverity(line) {
|
|
70
|
+
if (ERROR_PATTERNS.some((p) => p.test(line)))
|
|
71
|
+
return "error";
|
|
72
|
+
if (WARN_PATTERNS.some((p) => p.test(line)))
|
|
73
|
+
return "warn";
|
|
74
|
+
if (/^\s*(LOG|INFO|DEBUG)\s/i.test(line))
|
|
75
|
+
return line.match(/DEBUG/i) ? "debug" : "info";
|
|
76
|
+
return "info";
|
|
77
|
+
}
|
|
78
|
+
function detectSource(line) {
|
|
79
|
+
for (const { pattern, source } of SOURCE_PATTERNS) {
|
|
80
|
+
if (pattern.test(line))
|
|
81
|
+
return source;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
function extractStackTrace(line) {
|
|
86
|
+
const lines = line.split("\n");
|
|
87
|
+
const stackLines = [];
|
|
88
|
+
let inStack = false;
|
|
89
|
+
for (const l of lines) {
|
|
90
|
+
if (STACK_TRACE_START.test(l)) {
|
|
91
|
+
inStack = true;
|
|
92
|
+
stackLines.push(l.trim());
|
|
93
|
+
}
|
|
94
|
+
else if (inStack && l.trim() === "") {
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
else if (inStack) {
|
|
98
|
+
stackLines.push(l.trim());
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return stackLines.length > 0 ? stackLines.join("\n") : undefined;
|
|
102
|
+
}
|
|
103
|
+
function cleanMessage(line) {
|
|
104
|
+
return line
|
|
105
|
+
.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "") // strip ANSI codes
|
|
106
|
+
.replace(/^\s*\[?\d{2}:\d{2}:\d{2}\]?\s*/, "") // strip timestamps
|
|
107
|
+
.trim();
|
|
108
|
+
}
|
|
109
|
+
function shouldFilterLog(line, filterPatterns) {
|
|
110
|
+
if (!line.trim())
|
|
111
|
+
return true;
|
|
112
|
+
return filterPatterns.some((pattern) => {
|
|
113
|
+
try {
|
|
114
|
+
return new RegExp(pattern, "i").test(line);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return line.includes(pattern);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function parseMultilineLog(chunk, detectedSource = "unknown") {
|
|
122
|
+
const lines = chunk.split("\n");
|
|
123
|
+
const entries = [];
|
|
124
|
+
let currentBlock = [];
|
|
125
|
+
for (const line of lines) {
|
|
126
|
+
if (STACK_TRACE_START.test(line) && currentBlock.length > 0) {
|
|
127
|
+
currentBlock.push(line);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
if (currentBlock.length > 0) {
|
|
131
|
+
entries.push(parseTerminalLine(currentBlock.join("\n"), detectedSource));
|
|
132
|
+
}
|
|
133
|
+
currentBlock = [line];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (currentBlock.length > 0) {
|
|
137
|
+
entries.push(parseTerminalLine(currentBlock.join("\n"), detectedSource));
|
|
138
|
+
}
|
|
139
|
+
return entries;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=log-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-parser.js","sourceRoot":"","sources":["../../src/parsers/log-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactotronLogEntry, ApiCallEntry, StateChangeEntry, PerformanceEntry } from "../types.js";
|
|
2
|
+
interface ReactotronMessage {
|
|
3
|
+
type: string;
|
|
4
|
+
payload?: Record<string, unknown>;
|
|
5
|
+
important?: boolean;
|
|
6
|
+
date?: string;
|
|
7
|
+
deltaTime?: number;
|
|
8
|
+
name?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseReactotronMessage(msg: ReactotronMessage): {
|
|
11
|
+
logEntry: Omit<ReactotronLogEntry, "id">;
|
|
12
|
+
apiCall?: Omit<ApiCallEntry, "id">;
|
|
13
|
+
stateChange?: Omit<StateChangeEntry, "id">;
|
|
14
|
+
performanceEntry?: Omit<PerformanceEntry, "id">;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=reactotron-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactotron-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/reactotron-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,iBAAiB,GACrB;IACD,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;CACjD,CA8BA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseReactotronMessage = parseReactotronMessage;
|
|
4
|
+
function parseReactotronMessage(msg) {
|
|
5
|
+
const timestamp = msg.date ?? new Date().toISOString();
|
|
6
|
+
const type = mapReactotronType(msg.type);
|
|
7
|
+
const logEntry = {
|
|
8
|
+
timestamp,
|
|
9
|
+
type,
|
|
10
|
+
name: msg.name ?? msg.type,
|
|
11
|
+
payload: msg.payload ?? {},
|
|
12
|
+
important: msg.important,
|
|
13
|
+
duration: msg.deltaTime,
|
|
14
|
+
};
|
|
15
|
+
let apiCall;
|
|
16
|
+
let stateChange;
|
|
17
|
+
let performanceEntry;
|
|
18
|
+
if (type === "api" && msg.payload) {
|
|
19
|
+
apiCall = parseApiCall(msg.payload, timestamp);
|
|
20
|
+
}
|
|
21
|
+
if (type === "state" && msg.payload) {
|
|
22
|
+
stateChange = parseStateChange(msg.payload, timestamp, msg.name);
|
|
23
|
+
}
|
|
24
|
+
if (type === "benchmark" && msg.payload) {
|
|
25
|
+
performanceEntry = parseBenchmark(msg.payload, timestamp, msg.name);
|
|
26
|
+
}
|
|
27
|
+
return { logEntry, apiCall, stateChange, performanceEntry };
|
|
28
|
+
}
|
|
29
|
+
function mapReactotronType(type) {
|
|
30
|
+
const typeMap = {
|
|
31
|
+
"api.response": "api",
|
|
32
|
+
"api.request": "api",
|
|
33
|
+
"state.action.complete": "state",
|
|
34
|
+
"state.values.change": "state",
|
|
35
|
+
"state.values.response": "state",
|
|
36
|
+
"state.backup.response": "state",
|
|
37
|
+
"state.keys.response": "state",
|
|
38
|
+
"asyncStorage.values.change": "asyncStorage",
|
|
39
|
+
"asyncStorage.mutation": "asyncStorage",
|
|
40
|
+
"benchmark.report": "benchmark",
|
|
41
|
+
"display": "display",
|
|
42
|
+
"log": "log",
|
|
43
|
+
"client.intro": "log",
|
|
44
|
+
"image": "custom",
|
|
45
|
+
"custom": "custom",
|
|
46
|
+
};
|
|
47
|
+
return typeMap[type] ?? "log";
|
|
48
|
+
}
|
|
49
|
+
function parseApiCall(payload, timestamp) {
|
|
50
|
+
const request = (payload.request ?? payload);
|
|
51
|
+
const response = (payload.response ?? {});
|
|
52
|
+
return {
|
|
53
|
+
timestamp,
|
|
54
|
+
method: request.method ?? "GET",
|
|
55
|
+
url: request.url ?? "unknown",
|
|
56
|
+
status: response.status,
|
|
57
|
+
duration: payload.duration,
|
|
58
|
+
requestHeaders: request.headers,
|
|
59
|
+
requestBody: request.data ?? request.body,
|
|
60
|
+
responseHeaders: response.headers,
|
|
61
|
+
responseBody: response.body ?? response.data,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function parseStateChange(payload, timestamp, name) {
|
|
65
|
+
return {
|
|
66
|
+
timestamp,
|
|
67
|
+
store: payload.name ?? name ?? "unknown",
|
|
68
|
+
action: payload.action ?? payload.type ?? "unknown",
|
|
69
|
+
path: payload.path,
|
|
70
|
+
before: payload.before,
|
|
71
|
+
after: payload.after ?? payload.value,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function parseBenchmark(payload, timestamp, name) {
|
|
75
|
+
const steps = payload.steps;
|
|
76
|
+
return {
|
|
77
|
+
timestamp,
|
|
78
|
+
title: payload.title ?? name ?? "benchmark",
|
|
79
|
+
duration: payload.duration ?? 0,
|
|
80
|
+
steps,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=reactotron-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactotron-parser.js","sourceRoot":"","sources":["../../src/parsers/reactotron-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { LogStore } from "./storage/log-store.js";
|
|
3
|
+
import { TerminalMonitor } from "./monitors/terminal.js";
|
|
4
|
+
import { ReactotronMonitor } from "./monitors/reactotron.js";
|
|
5
|
+
import { HermesMonitor } from "./monitors/hermes.js";
|
|
6
|
+
import { IOSCrashMonitor } from "./monitors/crash-ios.js";
|
|
7
|
+
import { AndroidCrashMonitor } from "./monitors/crash-android.js";
|
|
8
|
+
import { CompanionConfig } from "./types.js";
|
|
9
|
+
export declare function createCompanionServer(config: CompanionConfig): {
|
|
10
|
+
server: McpServer;
|
|
11
|
+
store: LogStore;
|
|
12
|
+
terminalMonitor: TerminalMonitor;
|
|
13
|
+
reactotronMonitor: ReactotronMonitor;
|
|
14
|
+
hermesMonitor: HermesMonitor | null;
|
|
15
|
+
iosCrashMonitor: IOSCrashMonitor | null;
|
|
16
|
+
androidCrashMonitor: AndroidCrashMonitor | null;
|
|
17
|
+
shutdown: () => void;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa7C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe;;;;;;;;;EAkU5D"}
|