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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +68 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/monitors/crash-android.d.ts +20 -0
  8. package/dist/monitors/crash-android.d.ts.map +1 -0
  9. package/dist/monitors/crash-android.js +134 -0
  10. package/dist/monitors/crash-android.js.map +1 -0
  11. package/dist/monitors/crash-ios.d.ts +17 -0
  12. package/dist/monitors/crash-ios.d.ts.map +1 -0
  13. package/dist/monitors/crash-ios.js +116 -0
  14. package/dist/monitors/crash-ios.js.map +1 -0
  15. package/dist/monitors/hermes.d.ts +26 -0
  16. package/dist/monitors/hermes.d.ts.map +1 -0
  17. package/dist/monitors/hermes.js +175 -0
  18. package/dist/monitors/hermes.js.map +1 -0
  19. package/dist/monitors/reactotron.d.ts +18 -0
  20. package/dist/monitors/reactotron.d.ts.map +1 -0
  21. package/dist/monitors/reactotron.js +106 -0
  22. package/dist/monitors/reactotron.js.map +1 -0
  23. package/dist/monitors/terminal.d.ts +25 -0
  24. package/dist/monitors/terminal.d.ts.map +1 -0
  25. package/dist/monitors/terminal.js +154 -0
  26. package/dist/monitors/terminal.js.map +1 -0
  27. package/dist/parsers/cdp-parser.d.ts +64 -0
  28. package/dist/parsers/cdp-parser.d.ts.map +1 -0
  29. package/dist/parsers/cdp-parser.js +115 -0
  30. package/dist/parsers/cdp-parser.js.map +1 -0
  31. package/dist/parsers/crash-parser.d.ts +5 -0
  32. package/dist/parsers/crash-parser.d.ts.map +1 -0
  33. package/dist/parsers/crash-parser.js +112 -0
  34. package/dist/parsers/crash-parser.js.map +1 -0
  35. package/dist/parsers/log-parser.d.ts +5 -0
  36. package/dist/parsers/log-parser.d.ts.map +1 -0
  37. package/dist/parsers/log-parser.js +141 -0
  38. package/dist/parsers/log-parser.js.map +1 -0
  39. package/dist/parsers/reactotron-parser.d.ts +17 -0
  40. package/dist/parsers/reactotron-parser.d.ts.map +1 -0
  41. package/dist/parsers/reactotron-parser.js +83 -0
  42. package/dist/parsers/reactotron-parser.js.map +1 -0
  43. package/dist/server.d.ts +19 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +224 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/storage/log-store.d.ts +41 -0
  48. package/dist/storage/log-store.d.ts.map +1 -0
  49. package/dist/storage/log-store.js +118 -0
  50. package/dist/storage/log-store.js.map +1 -0
  51. package/dist/storage/persistence.d.ts +26 -0
  52. package/dist/storage/persistence.d.ts.map +1 -0
  53. package/dist/storage/persistence.js +123 -0
  54. package/dist/storage/persistence.js.map +1 -0
  55. package/dist/tools/clear-logs.d.ts +8 -0
  56. package/dist/tools/clear-logs.d.ts.map +1 -0
  57. package/dist/tools/clear-logs.js +15 -0
  58. package/dist/tools/clear-logs.js.map +1 -0
  59. package/dist/tools/get-api-calls.d.ts +11 -0
  60. package/dist/tools/get-api-calls.d.ts.map +1 -0
  61. package/dist/tools/get-api-calls.js +26 -0
  62. package/dist/tools/get-api-calls.js.map +1 -0
  63. package/dist/tools/get-crashes.d.ts +11 -0
  64. package/dist/tools/get-crashes.d.ts.map +1 -0
  65. package/dist/tools/get-crashes.js +42 -0
  66. package/dist/tools/get-crashes.js.map +1 -0
  67. package/dist/tools/get-errors.d.ts +12 -0
  68. package/dist/tools/get-errors.d.ts.map +1 -0
  69. package/dist/tools/get-errors.js +52 -0
  70. package/dist/tools/get-errors.js.map +1 -0
  71. package/dist/tools/get-hermes-logs.d.ts +12 -0
  72. package/dist/tools/get-hermes-logs.d.ts.map +1 -0
  73. package/dist/tools/get-hermes-logs.js +33 -0
  74. package/dist/tools/get-hermes-logs.js.map +1 -0
  75. package/dist/tools/get-logs.d.ts +21 -0
  76. package/dist/tools/get-logs.d.ts.map +1 -0
  77. package/dist/tools/get-logs.js +50 -0
  78. package/dist/tools/get-logs.js.map +1 -0
  79. package/dist/tools/get-network.d.ts +12 -0
  80. package/dist/tools/get-network.d.ts.map +1 -0
  81. package/dist/tools/get-network.js +35 -0
  82. package/dist/tools/get-network.js.map +1 -0
  83. package/dist/tools/get-performance.d.ts +10 -0
  84. package/dist/tools/get-performance.d.ts.map +1 -0
  85. package/dist/tools/get-performance.js +32 -0
  86. package/dist/tools/get-performance.js.map +1 -0
  87. package/dist/tools/get-state.d.ts +11 -0
  88. package/dist/tools/get-state.d.ts.map +1 -0
  89. package/dist/tools/get-state.js +26 -0
  90. package/dist/tools/get-state.js.map +1 -0
  91. package/dist/tools/get-status.d.ts +20 -0
  92. package/dist/tools/get-status.d.ts.map +1 -0
  93. package/dist/tools/get-status.js +52 -0
  94. package/dist/tools/get-status.js.map +1 -0
  95. package/dist/tools/search-logs.d.ts +11 -0
  96. package/dist/tools/search-logs.d.ts.map +1 -0
  97. package/dist/tools/search-logs.js +68 -0
  98. package/dist/tools/search-logs.js.map +1 -0
  99. package/dist/types.d.ts +123 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +3 -0
  102. package/dist/types.js.map +1 -0
  103. package/package.json +65 -0
  104. package/scripts/install.sh +33 -0
  105. 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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"}
@@ -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"}