execbro 1.10.25 → 1.11.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/README.md +1 -1
- package/build/__tests__/integration/native-logs.test.d.ts +2 -0
- package/build/__tests__/integration/native-logs.test.d.ts.map +1 -0
- package/build/__tests__/integration/native-logs.test.js +39 -0
- package/build/__tests__/integration/native-logs.test.js.map +1 -0
- package/build/__tests__/unit/clearLogsNative.test.d.ts +2 -0
- package/build/__tests__/unit/clearLogsNative.test.d.ts.map +1 -0
- package/build/__tests__/unit/clearLogsNative.test.js +43 -0
- package/build/__tests__/unit/clearLogsNative.test.js.map +1 -0
- package/build/__tests__/unit/componentFormatNaming.test.d.ts +2 -0
- package/build/__tests__/unit/componentFormatNaming.test.d.ts.map +1 -0
- package/build/__tests__/unit/componentFormatNaming.test.js +32 -0
- package/build/__tests__/unit/componentFormatNaming.test.js.map +1 -0
- package/build/__tests__/unit/getLogsEmptyContract.test.js +20 -7
- package/build/__tests__/unit/getLogsEmptyContract.test.js.map +1 -1
- package/build/__tests__/unit/getLogsNativeSource.test.d.ts +2 -0
- package/build/__tests__/unit/getLogsNativeSource.test.d.ts.map +1 -0
- package/build/__tests__/unit/getLogsNativeSource.test.js +138 -0
- package/build/__tests__/unit/getLogsNativeSource.test.js.map +1 -0
- package/build/__tests__/unit/jsLogEvents.test.d.ts +2 -0
- package/build/__tests__/unit/jsLogEvents.test.d.ts.map +1 -0
- package/build/__tests__/unit/jsLogEvents.test.js +58 -0
- package/build/__tests__/unit/jsLogEvents.test.js.map +1 -0
- package/build/__tests__/unit/logEventFormat.test.d.ts +2 -0
- package/build/__tests__/unit/logEventFormat.test.d.ts.map +1 -0
- package/build/__tests__/unit/logEventFormat.test.js +210 -0
- package/build/__tests__/unit/logEventFormat.test.js.map +1 -0
- package/build/__tests__/unit/logEvents.test.d.ts +2 -0
- package/build/__tests__/unit/logEvents.test.d.ts.map +1 -0
- package/build/__tests__/unit/logEvents.test.js +118 -0
- package/build/__tests__/unit/logEvents.test.js.map +1 -0
- package/build/__tests__/unit/logGrouping.test.d.ts +2 -0
- package/build/__tests__/unit/logGrouping.test.d.ts.map +1 -0
- package/build/__tests__/unit/logGrouping.test.js +104 -0
- package/build/__tests__/unit/logGrouping.test.js.map +1 -0
- package/build/__tests__/unit/logOwnership.test.d.ts +2 -0
- package/build/__tests__/unit/logOwnership.test.d.ts.map +1 -0
- package/build/__tests__/unit/logOwnership.test.js +118 -0
- package/build/__tests__/unit/logOwnership.test.js.map +1 -0
- package/build/__tests__/unit/logRelevance.test.d.ts +2 -0
- package/build/__tests__/unit/logRelevance.test.d.ts.map +1 -0
- package/build/__tests__/unit/logRelevance.test.js +30 -0
- package/build/__tests__/unit/logRelevance.test.js.map +1 -0
- package/build/__tests__/unit/logSourceAndroid.test.d.ts +2 -0
- package/build/__tests__/unit/logSourceAndroid.test.d.ts.map +1 -0
- package/build/__tests__/unit/logSourceAndroid.test.js +61 -0
- package/build/__tests__/unit/logSourceAndroid.test.js.map +1 -0
- package/build/__tests__/unit/logSourceIos.test.d.ts +2 -0
- package/build/__tests__/unit/logSourceIos.test.d.ts.map +1 -0
- package/build/__tests__/unit/logSourceIos.test.js +64 -0
- package/build/__tests__/unit/logSourceIos.test.js.map +1 -0
- package/build/__tests__/unit/logs.test.js +23 -0
- package/build/__tests__/unit/logs.test.js.map +1 -1
- package/build/__tests__/unit/nativeLogs.test.d.ts +2 -0
- package/build/__tests__/unit/nativeLogs.test.d.ts.map +1 -0
- package/build/__tests__/unit/nativeLogs.test.js +230 -0
- package/build/__tests__/unit/nativeLogs.test.js.map +1 -0
- package/build/__tests__/unit/toolsJson.test.js +11 -0
- package/build/__tests__/unit/toolsJson.test.js.map +1 -1
- package/build/core/componentSearch.d.ts +1 -1
- package/build/core/componentSearch.d.ts.map +1 -1
- package/build/core/componentSearch.js +8 -8
- package/build/core/componentSearch.js.map +1 -1
- package/build/core/componentTree.d.ts +1 -1
- package/build/core/componentTree.d.ts.map +1 -1
- package/build/core/componentTree.js +8 -8
- package/build/core/componentTree.js.map +1 -1
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +25 -0
- package/build/core/guides.js.map +1 -1
- package/build/core/index.d.ts +0 -2
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +0 -2
- package/build/core/index.js.map +1 -1
- package/build/core/jsLogEvents.d.ts +13 -0
- package/build/core/jsLogEvents.d.ts.map +1 -0
- package/build/core/jsLogEvents.js +65 -0
- package/build/core/jsLogEvents.js.map +1 -0
- package/build/core/logEventFormat.d.ts +14 -0
- package/build/core/logEventFormat.d.ts.map +1 -0
- package/build/core/logEventFormat.js +85 -0
- package/build/core/logEventFormat.js.map +1 -0
- package/build/core/logEvents.d.ts +115 -0
- package/build/core/logEvents.d.ts.map +1 -0
- package/build/core/logEvents.js +146 -0
- package/build/core/logEvents.js.map +1 -0
- package/build/core/logGrouping.d.ts +17 -0
- package/build/core/logGrouping.d.ts.map +1 -0
- package/build/core/logGrouping.js +134 -0
- package/build/core/logGrouping.js.map +1 -0
- package/build/core/logOwnership.d.ts +29 -0
- package/build/core/logOwnership.d.ts.map +1 -0
- package/build/core/logOwnership.js +83 -0
- package/build/core/logOwnership.js.map +1 -0
- package/build/core/logRelevance.d.ts +13 -0
- package/build/core/logRelevance.d.ts.map +1 -0
- package/build/core/logRelevance.js +23 -0
- package/build/core/logRelevance.js.map +1 -0
- package/build/core/logSourceAndroid.d.ts +27 -0
- package/build/core/logSourceAndroid.d.ts.map +1 -0
- package/build/core/logSourceAndroid.js +89 -0
- package/build/core/logSourceAndroid.js.map +1 -0
- package/build/core/logSourceIos.d.ts +26 -0
- package/build/core/logSourceIos.d.ts.map +1 -0
- package/build/core/logSourceIos.js +119 -0
- package/build/core/logSourceIos.js.map +1 -0
- package/build/core/logs.d.ts +5 -1
- package/build/core/logs.d.ts.map +1 -1
- package/build/core/logs.js +8 -1
- package/build/core/logs.js.map +1 -1
- package/build/core/nativeLogs.d.ts +75 -0
- package/build/core/nativeLogs.d.ts.map +1 -0
- package/build/core/nativeLogs.js +260 -0
- package/build/core/nativeLogs.js.map +1 -0
- package/build/core/screenLayout.d.ts +1 -1
- package/build/core/screenLayout.d.ts.map +1 -1
- package/build/core/screenLayout.js +3 -3
- package/build/core/screenLayout.js.map +1 -1
- package/build/core/types.d.ts +3 -2
- package/build/core/types.d.ts.map +1 -1
- package/build/tools/componentTools.js +6 -6
- package/build/tools/componentTools.js.map +1 -1
- package/build/tools/logTools.d.ts +25 -0
- package/build/tools/logTools.d.ts.map +1 -1
- package/build/tools/logTools.js +246 -70
- package/build/tools/logTools.js.map +1 -1
- package/build/tools/networkTools.d.ts.map +1 -1
- package/build/tools/networkTools.js +5 -44
- package/build/tools/networkTools.js.map +1 -1
- package/package.json +5 -4
- package/tools.json +447 -0
- package/build/core/format.d.ts +0 -8
- package/build/core/format.d.ts.map +0 -1
- package/build/core/format.js +0 -34
- package/build/core/format.js.map +0 -1
package/README.md
CHANGED
|
@@ -156,7 +156,7 @@ See the [full tool reference](docs/tools.md) for all tools with descriptions. Ke
|
|
|
156
156
|
| ---------------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
157
157
|
| [Setup](docs/setup.md) | Per-client MCP config (Claude, Codex, Cursor, VS Code, …), Android & iOS setup |
|
|
158
158
|
| [SDK Setup](docs/sdk.md) | Install & `init()` the in-app SDK to wire stores + network layer into the agent |
|
|
159
|
-
| [Console Logging](docs/logging.md) | `get_logs` parameters, filtering, summary mode,
|
|
159
|
+
| [Console Logging](docs/logging.md) | `get_logs` parameters, filtering, summary mode, token optimization |
|
|
160
160
|
| [Network Tracking](docs/network.md) | SDK setup for full capture, filtering, request details, statistics |
|
|
161
161
|
| [App Inspection](docs/app-inspection.md) | Debug globals (Apollo, Redux, Expo Router), `execute_in_app`, limitations |
|
|
162
162
|
| [Layout & Component Inspection](docs/layout-inspection.md) | `get_screen_layout`, component tree, `inspect_at_point`, `find_components` |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-logs.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/native-logs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Device-gated: skips cleanly when no emulator/simulator is attached, matching
|
|
2
|
+
// the pattern in connection-health.test.ts. CI has no device, and a real
|
|
3
|
+
// tombstone cannot be provoked there — the parsing and filtering logic is
|
|
4
|
+
// covered by the unit fixtures instead.
|
|
5
|
+
import { describe, it, expect } from "@jest/globals";
|
|
6
|
+
import { execSync } from "node:child_process";
|
|
7
|
+
import { fetchAndroidLines, buildLogcatArgs } from "../../core/logSourceAndroid.js";
|
|
8
|
+
function hasAndroidDevice() {
|
|
9
|
+
try {
|
|
10
|
+
const out = execSync("adb devices", { encoding: "utf8", timeout: 5000 });
|
|
11
|
+
return out.split("\n").slice(1).some((l) => l.trim().endsWith("device"));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const maybe = hasAndroidDevice() ? describe : describe.skip;
|
|
18
|
+
maybe("android native log acquisition (live device)", () => {
|
|
19
|
+
it("fetches and parses real logcat output", async () => {
|
|
20
|
+
const lines = await fetchAndroidLines({ sinceTs: new Date(Date.now() - 60_000) });
|
|
21
|
+
expect(Array.isArray(lines)).toBe(true);
|
|
22
|
+
for (const line of lines.slice(0, 20)) {
|
|
23
|
+
expect(line.ts.getTime()).toBeGreaterThan(0);
|
|
24
|
+
expect(typeof line.tag).toBe("string");
|
|
25
|
+
expect(typeof line.message).toBe("string");
|
|
26
|
+
}
|
|
27
|
+
}, 30_000);
|
|
28
|
+
it("does not blow the exec buffer on an unwindowed read", async () => {
|
|
29
|
+
// A full dump is ~13.8MB against node's 1MiB default.
|
|
30
|
+
const lines = await fetchAndroidLines({});
|
|
31
|
+
expect(lines.length).toBeGreaterThan(0);
|
|
32
|
+
}, 30_000);
|
|
33
|
+
it("builds a command that adb accepts", () => {
|
|
34
|
+
const cmd = buildLogcatArgs({ sinceTs: new Date(Date.now() - 10_000) });
|
|
35
|
+
const out = execSync(`${cmd} | head -5`, { encoding: "utf8", timeout: 10_000 });
|
|
36
|
+
expect(typeof out).toBe("string");
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=native-logs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-logs.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/native-logs.test.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yEAAyE;AACzE,0EAA0E;AAC1E,wCAAwC;AAExC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAa,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEpF,SAAS,gBAAgB;IACrB,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAE5D,KAAK,CAAC,8CAA8C,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACjE,sDAAsD;QACtD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearLogsNative.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/clearLogsNative.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Source-level contract, matching the style of getLogsEmptyContract: the
|
|
2
|
+
// targeted clear_logs(device=...) branch must clear that device's native
|
|
3
|
+
// (logcat/os_log) buffer too, or a repro done right after a targeted clear
|
|
4
|
+
// still shows pre-repro native events with no indication why.
|
|
5
|
+
import { describe, it, expect } from "@jest/globals";
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
const SOURCE = readFileSync(join(process.cwd(), "src/tools/logTools.ts"), "utf8");
|
|
9
|
+
function clearLogsHandlerSource() {
|
|
10
|
+
const start = SOURCE.indexOf('"clear_logs"');
|
|
11
|
+
const end = SOURCE.indexOf("Get full payload for one log event");
|
|
12
|
+
expect(start).toBeGreaterThan(-1);
|
|
13
|
+
expect(end).toBeGreaterThan(start);
|
|
14
|
+
return SOURCE.slice(start, end);
|
|
15
|
+
}
|
|
16
|
+
/** Just the `if (device) { ... }` targeted branch, not the all-devices branch. */
|
|
17
|
+
function targetedBranchSource() {
|
|
18
|
+
const src = clearLogsHandlerSource();
|
|
19
|
+
const start = src.indexOf("if (device) {");
|
|
20
|
+
const end = src.indexOf("// Clear all");
|
|
21
|
+
expect(start).toBeGreaterThan(-1);
|
|
22
|
+
expect(end).toBeGreaterThan(start);
|
|
23
|
+
return src.slice(start, end);
|
|
24
|
+
}
|
|
25
|
+
describe("clear_logs(device=...) native buffer", () => {
|
|
26
|
+
it("clears that device's native buffer via getNativeLogBuffer(deviceKey).clear()", () => {
|
|
27
|
+
const targeted = targetedBranchSource();
|
|
28
|
+
expect(targeted).toContain("getNativeLogBuffer(");
|
|
29
|
+
expect(targeted).toContain(".clear()");
|
|
30
|
+
});
|
|
31
|
+
it("folds the native clear count into the reported total", () => {
|
|
32
|
+
const targeted = targetedBranchSource();
|
|
33
|
+
expect(targeted).toMatch(/count\s*\+=\s*getNativeLogBuffer\([\s\S]*?\)\.clear\(\)/);
|
|
34
|
+
});
|
|
35
|
+
it("does not touch the native buffer's watermark reset logic (that lives only in the all-devices branch)", () => {
|
|
36
|
+
// The all-devices branch clears via nativeLogBuffers.values(); the
|
|
37
|
+
// targeted branch must key by this device's own deviceKey instead of
|
|
38
|
+
// iterating every device's native buffer.
|
|
39
|
+
const targeted = targetedBranchSource();
|
|
40
|
+
expect(targeted).not.toContain("nativeLogBuffers.values()");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=clearLogsNative.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearLogsNative.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/clearLogsNative.test.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,8DAA8D;AAE9D,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,EAAE,MAAM,CAAC,CAAC;AAElF,SAAS,sBAAsB;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,kFAAkF;AAClF,SAAS,oBAAoB;IACzB,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACpF,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sGAAsG,EAAE,GAAG,EAAE;QAC5G,mEAAmE;QACnE,qEAAqE;QACrE,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentFormatNaming.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/componentFormatNaming.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// The word "tonl" named two unrelated things: an npm package that made log
|
|
2
|
+
// output larger, and these hand-written formatters that make component output
|
|
3
|
+
// 5-6x smaller. The package is gone; this pins the survivors' new name so the
|
|
4
|
+
// ambiguity cannot creep back.
|
|
5
|
+
import { describe, it, expect } from "@jest/globals";
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { execSync } from "node:child_process";
|
|
9
|
+
describe("component formatter naming", () => {
|
|
10
|
+
it("no production source, docs, or skill file mentions tonl", () => {
|
|
11
|
+
// Case-SENSITIVE on purpose. A case-insensitive match also hits
|
|
12
|
+
// unrelated identifiers that merely contain the letters t-o-n-l --
|
|
13
|
+
// e.g. isEvalTimeoutOnLiveSocket ("tOnL") -- and would force renaming
|
|
14
|
+
// code that has nothing to do with this format.
|
|
15
|
+
// __tests__ is excluded because this very file contains the string
|
|
16
|
+
// in its own pattern and comments, which would be self-defeating.
|
|
17
|
+
// Scope covers src/, skills/, docs/, and README.md -- the original
|
|
18
|
+
// src/-only scope is why the doc/skill references to the removed
|
|
19
|
+
// "tonl" log/network format survived the earlier commits unnoticed.
|
|
20
|
+
const hits = execSync("grep -rlE 'tonl|Tonl|TONL' src/ skills/ docs/ README.md --exclude-dir=__tests__ || true", { cwd: process.cwd(), encoding: "utf8" }).trim();
|
|
21
|
+
expect(hits).toBe("");
|
|
22
|
+
});
|
|
23
|
+
it("exposes the compact formatters under their new names", () => {
|
|
24
|
+
const tree = readFileSync(join(process.cwd(), "src/core/componentTree.ts"), "utf8");
|
|
25
|
+
const search = readFileSync(join(process.cwd(), "src/core/componentSearch.ts"), "utf8");
|
|
26
|
+
const layout = readFileSync(join(process.cwd(), "src/core/screenLayout.ts"), "utf8");
|
|
27
|
+
expect(tree).toContain("formatTreeCompact");
|
|
28
|
+
expect(search).toContain("formatFoundComponentsCompact");
|
|
29
|
+
expect(layout).toContain("formatSummaryCompact");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=componentFormatNaming.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentFormatNaming.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/componentFormatNaming.test.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,+BAA+B;AAE/B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAC/D,gEAAgE;QAChE,mEAAmE;QACnE,sEAAsE;QACtE,gDAAgD;QAChD,mEAAmE;QACnE,kEAAkE;QAClE,mEAAmE;QACnE,iEAAiE;QACjE,oEAAoE;QACpE,MAAM,IAAI,GAAG,QAAQ,CACjB,yFAAyF,EACzF,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAC3C,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,EAAE,MAAM,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,6BAA6B,CAAC,EAAE,MAAM,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,EAAE,MAAM,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
// Guards the get_logs empty-result contract at the source level.
|
|
2
2
|
//
|
|
3
3
|
// The original bug was not bad logic — it was a return path that forgot to
|
|
4
|
-
// report. `get_logs`
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// unattributed in telemetry. A unit test of the diagnosis logic cannot catch
|
|
8
|
-
// that; only checking every exit can.
|
|
4
|
+
// report. Every `get_logs` exit must set `_emptyResult`. Removing the TONL
|
|
5
|
+
// format halved the exits (each format branch was a duplicated return);
|
|
6
|
+
// this test pins the remaining count so a new silent path is noticed.
|
|
9
7
|
import { describe, it, expect } from "@jest/globals";
|
|
10
8
|
import { readFileSync } from "node:fs";
|
|
11
9
|
import { join } from "node:path";
|
|
@@ -59,8 +57,8 @@ function toolResponseReturns(src) {
|
|
|
59
57
|
describe("get_logs empty-result contract", () => {
|
|
60
58
|
const returns = toolResponseReturns(getLogsHandlerSource());
|
|
61
59
|
it("finds every tool response return path", () => {
|
|
62
|
-
// SDK summary, SDK
|
|
63
|
-
//
|
|
60
|
+
// SDK summary, SDK entries, buffer summary, recovered retry,
|
|
61
|
+
// native-only, native-crash escalation, final.
|
|
64
62
|
expect(returns.length).toBe(7);
|
|
65
63
|
});
|
|
66
64
|
it("reports _emptyResult on every return path", () => {
|
|
@@ -95,5 +93,20 @@ describe("get_logs empty-result contract", () => {
|
|
|
95
93
|
it("does not emit the ambiguous legacy no_logs label", () => {
|
|
96
94
|
expect(getLogsBodySource()).not.toMatch(/"no_logs"/);
|
|
97
95
|
});
|
|
96
|
+
it("routes the pipeline-recovered path through the event pipeline, not legacy formatLogs text", () => {
|
|
97
|
+
// Regression guard: retryResult.formatted is legacy text with no
|
|
98
|
+
// [jN] ids, which left get_log_details unusable for whatever this
|
|
99
|
+
// path surfaced. The recovered branch must build events the same
|
|
100
|
+
// way the final JS return does.
|
|
101
|
+
const handler = getLogsBodySource();
|
|
102
|
+
const recoveredAt = handler.indexOf("diagnosis.recovered");
|
|
103
|
+
expect(recoveredAt).toBeGreaterThan(-1);
|
|
104
|
+
const nextReturnEnd = handler.indexOf("_emptyReason: \"pipeline_recovered\"");
|
|
105
|
+
expect(nextReturnEnd).toBeGreaterThan(recoveredAt);
|
|
106
|
+
const recoveredBlock = handler.slice(recoveredAt, nextReturnEnd + 200);
|
|
107
|
+
expect(recoveredBlock).toContain("jsEventsFromEntries(retryResult.logs");
|
|
108
|
+
expect(recoveredBlock).toContain("formatEventList(");
|
|
109
|
+
expect(recoveredBlock).not.toContain("${retryResult.formatted}");
|
|
110
|
+
});
|
|
98
111
|
});
|
|
99
112
|
//# sourceMappingURL=getLogsEmptyContract.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLogsEmptyContract.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/getLogsEmptyContract.test.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,2EAA2E;AAC3E,
|
|
1
|
+
{"version":3,"file":"getLogsEmptyContract.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/getLogsEmptyContract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getLogsNativeSource.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/getLogsNativeSource.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Source-level contract, matching the style of getLogsEmptyContract: the
|
|
2
|
+
// escalation path is about WHEN a subprocess runs, which a pure unit test of
|
|
3
|
+
// the handler cannot observe without a device.
|
|
4
|
+
import { describe, it, expect, beforeEach } from "@jest/globals";
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { __escalationCooldownTestHooks, capEventsForDisplay } from "../../tools/logTools.js";
|
|
8
|
+
const SOURCE = readFileSync(join(process.cwd(), "src/tools/logTools.ts"), "utf8");
|
|
9
|
+
function getLogsSource() {
|
|
10
|
+
const start = SOURCE.indexOf('"get_logs"');
|
|
11
|
+
const end = SOURCE.indexOf('"search_logs"');
|
|
12
|
+
return SOURCE.slice(start, end);
|
|
13
|
+
}
|
|
14
|
+
describe("get_logs native source", () => {
|
|
15
|
+
const src = getLogsSource();
|
|
16
|
+
it("declares source, kind, minLevel and since params", () => {
|
|
17
|
+
for (const param of ["source:", "kind:", "minLevel:", "since:"]) {
|
|
18
|
+
expect(src).toContain(param);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
it("defaults source to js so the common path stays subprocess-free", () => {
|
|
22
|
+
expect(src).toMatch(/source[\s\S]{0,200}?\.default\("js"\)/);
|
|
23
|
+
});
|
|
24
|
+
it("only escalates to native when the buffer is empty AND disconnected", () => {
|
|
25
|
+
// Native acquisition costs ~1-1.5s; it must never run on the hot path.
|
|
26
|
+
expect(src).toContain("shouldEscalateToNative");
|
|
27
|
+
});
|
|
28
|
+
it("never calls collectNativeEvents unconditionally", () => {
|
|
29
|
+
const calls = src.match(/collectNativeEvents\(/g) ?? [];
|
|
30
|
+
expect(calls.length).toBeGreaterThan(0);
|
|
31
|
+
// Every call site must be inside a guard.
|
|
32
|
+
expect(src).not.toMatch(/^\s*const .* = await collectNativeEvents\(\{[\s\S]*?\}\);\s*$/m);
|
|
33
|
+
});
|
|
34
|
+
it("computes the native block before every early return that must carry it", () => {
|
|
35
|
+
// source==="all" must be able to prepend nativePrefix to the SDK
|
|
36
|
+
// summary/entries and buffer-summary returns, so the native fetch has
|
|
37
|
+
// to run before those branches, not after.
|
|
38
|
+
const nativeBlockAt = src.indexOf('source === "native" || source === "all"');
|
|
39
|
+
const sdkSummaryAt = src.indexOf("Log Summary (SDK)");
|
|
40
|
+
const bufferSummaryAt = src.indexOf("Log Summary:");
|
|
41
|
+
expect(nativeBlockAt).toBeGreaterThan(-1);
|
|
42
|
+
expect(nativeBlockAt).toBeLessThan(sdkSummaryAt);
|
|
43
|
+
expect(nativeBlockAt).toBeLessThan(bufferSummaryAt);
|
|
44
|
+
});
|
|
45
|
+
it("prepends nativePrefix on every return path, not just the final one", () => {
|
|
46
|
+
// Regression guard for the source:"all" double-pay bug: computing the
|
|
47
|
+
// native block and then dropping it on every early return.
|
|
48
|
+
const prefixSites = src.match(/\$\{nativePrefix\}/g) ?? [];
|
|
49
|
+
// SDK summary, SDK entries, buffer summary, pipeline-recovered,
|
|
50
|
+
// escalation, final.
|
|
51
|
+
expect(prefixSites.length).toBeGreaterThanOrEqual(6);
|
|
52
|
+
});
|
|
53
|
+
it("reuses the native fetch already paid for instead of re-running it in the escalation guard", () => {
|
|
54
|
+
expect(src).toContain("nativeEventsForEscalation");
|
|
55
|
+
});
|
|
56
|
+
it("bounds repeated empty-and-disconnected escalation with a cooldown", () => {
|
|
57
|
+
expect(src).toContain("isEscalationCoolingDown");
|
|
58
|
+
});
|
|
59
|
+
it("flags an unparseable since instead of silently using the default window", () => {
|
|
60
|
+
expect(src).toMatch(/parseSince/);
|
|
61
|
+
expect(SOURCE).toMatch(/not recognized/);
|
|
62
|
+
});
|
|
63
|
+
it("bounds the native/merged event list to maxLogs", () => {
|
|
64
|
+
// Live verification returned 420 events / 87k characters for a
|
|
65
|
+
// maxLogs:12 call — the native branch filtered by kind but never
|
|
66
|
+
// capped. `capped`/`cappedNote` are computed once via
|
|
67
|
+
// capEventsForDisplay and shared by both the native-only return and
|
|
68
|
+
// the source:"all" nativePrefix assignment.
|
|
69
|
+
expect(src).toContain("capEventsForDisplay(filtered, maxLogs)");
|
|
70
|
+
const cappedUses = src.match(/\bcapped\b/g) ?? [];
|
|
71
|
+
// At least: the destructure, and one use in each of the two renders.
|
|
72
|
+
expect(cappedUses.length).toBeGreaterThanOrEqual(3);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
function nativeEvent(id, tsMs) {
|
|
76
|
+
return {
|
|
77
|
+
id,
|
|
78
|
+
source: "native",
|
|
79
|
+
deviceKey: "emulator-5554",
|
|
80
|
+
deviceName: "Pixel",
|
|
81
|
+
ts: new Date(tsMs),
|
|
82
|
+
level: "warn",
|
|
83
|
+
kind: "message",
|
|
84
|
+
title: `event ${id}`,
|
|
85
|
+
lineCount: 1,
|
|
86
|
+
byteSize: 20,
|
|
87
|
+
fingerprint: id,
|
|
88
|
+
lines: [{ ts: new Date(tsMs), level: "warn", pid: 0, tag: "t", message: id, raw: id }],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
describe("capEventsForDisplay", () => {
|
|
92
|
+
it("returns everything, uncapped, when under the limit", () => {
|
|
93
|
+
const events = [nativeEvent("a", 1), nativeEvent("b", 2)];
|
|
94
|
+
const { capped, note } = capEventsForDisplay(events, 50);
|
|
95
|
+
expect(capped).toEqual(events);
|
|
96
|
+
expect(note).toBe("");
|
|
97
|
+
});
|
|
98
|
+
it("caps to maxLogs and keeps the newest events", () => {
|
|
99
|
+
const events = Array.from({ length: 20 }, (_, i) => nativeEvent(`e${i}`, i));
|
|
100
|
+
const { capped } = capEventsForDisplay(events, 12);
|
|
101
|
+
expect(capped).toHaveLength(12);
|
|
102
|
+
// Newest = highest timestamp = last 12 of the (ascending) input.
|
|
103
|
+
expect(capped.map((e) => e.id)).toEqual(events.slice(-12).map((e) => e.id));
|
|
104
|
+
});
|
|
105
|
+
it("mentions the omitted count and how to see more", () => {
|
|
106
|
+
const events = Array.from({ length: 20 }, (_, i) => nativeEvent(`e${i}`, i));
|
|
107
|
+
const { note } = capEventsForDisplay(events, 12);
|
|
108
|
+
expect(note).toContain("8 older events not shown");
|
|
109
|
+
expect(note).toMatch(/maxLogs/);
|
|
110
|
+
});
|
|
111
|
+
it("treats maxLogs:0 as unlimited, matching the rest of get_logs", () => {
|
|
112
|
+
const events = Array.from({ length: 5 }, (_, i) => nativeEvent(`e${i}`, i));
|
|
113
|
+
const { capped, note } = capEventsForDisplay(events, 0);
|
|
114
|
+
expect(capped).toHaveLength(5);
|
|
115
|
+
expect(note).toBe("");
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe("escalation cooldown — per-device keying", () => {
|
|
119
|
+
beforeEach(() => {
|
|
120
|
+
__escalationCooldownTestHooks.reset();
|
|
121
|
+
});
|
|
122
|
+
it("does not let one device's empty escalation suppress another's", () => {
|
|
123
|
+
// A process-wide cooldown would hide a real crash on device B behind an
|
|
124
|
+
// unrelated quiet period on device A.
|
|
125
|
+
__escalationCooldownTestHooks.recordMiss("iPhone A");
|
|
126
|
+
expect(__escalationCooldownTestHooks.isEscalationCoolingDown("iPhone A")).toBe(true);
|
|
127
|
+
expect(__escalationCooldownTestHooks.isEscalationCoolingDown("iPhone B")).toBe(false);
|
|
128
|
+
});
|
|
129
|
+
it("treats the undefined (all-devices) device as its own key", () => {
|
|
130
|
+
__escalationCooldownTestHooks.recordMiss(undefined);
|
|
131
|
+
expect(__escalationCooldownTestHooks.isEscalationCoolingDown(undefined)).toBe(true);
|
|
132
|
+
expect(__escalationCooldownTestHooks.isEscalationCoolingDown("iPhone A")).toBe(false);
|
|
133
|
+
__escalationCooldownTestHooks.reset();
|
|
134
|
+
__escalationCooldownTestHooks.recordMiss("iPhone A");
|
|
135
|
+
expect(__escalationCooldownTestHooks.isEscalationCoolingDown(undefined)).toBe(false);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=getLogsNativeSource.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getLogsNativeSource.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/getLogsNativeSource.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsLogEvents.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/jsLogEvents.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { jsEventsFromEntries, findJsEvent } from "../../core/jsLogEvents.js";
|
|
3
|
+
function entry(over) {
|
|
4
|
+
return {
|
|
5
|
+
timestamp: new Date("2026-07-29T19:10:39.000Z"),
|
|
6
|
+
level: "log",
|
|
7
|
+
message: "Cart updated",
|
|
8
|
+
seq: 12,
|
|
9
|
+
...over,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
describe("jsEventsFromEntries", () => {
|
|
13
|
+
it("gives every event a j-prefixed id derived from seq", () => {
|
|
14
|
+
const [event] = jsEventsFromEntries([entry({ seq: 12 })], "iPhone Air");
|
|
15
|
+
expect(event.id).toBe("j12");
|
|
16
|
+
expect(event.source).toBe("js");
|
|
17
|
+
});
|
|
18
|
+
it("classifies an error carrying a stack as an exception", () => {
|
|
19
|
+
const stack = [
|
|
20
|
+
"TypeError: undefined is not an object (evaluating 'user.name')",
|
|
21
|
+
" at HomeScreen (app/index.tsx:24:11)",
|
|
22
|
+
" at renderWithHooks (react-dom.js:1234:5)",
|
|
23
|
+
].join("\n");
|
|
24
|
+
const [event] = jsEventsFromEntries([entry({ level: "error", message: stack })], "iPhone Air");
|
|
25
|
+
expect(event.kind).toBe("exception");
|
|
26
|
+
expect(event.title).toContain("TypeError");
|
|
27
|
+
expect(event.title).toContain("2 frames");
|
|
28
|
+
});
|
|
29
|
+
it("keeps a plain log as a message event", () => {
|
|
30
|
+
const [event] = jsEventsFromEntries([entry({})], "iPhone Air");
|
|
31
|
+
expect(event.kind).toBe("message");
|
|
32
|
+
expect(event.title).toBe("Cart updated");
|
|
33
|
+
});
|
|
34
|
+
it("records byteSize so oversized payloads get a size hint", () => {
|
|
35
|
+
const big = JSON.stringify({ cart: Array.from({ length: 500 }, (_, i) => ({ id: i })) });
|
|
36
|
+
const [event] = jsEventsFromEntries([entry({ message: big })], "iPhone Air");
|
|
37
|
+
expect(event.byteSize).toBe(big.length);
|
|
38
|
+
expect(event.lineCount).toBe(1);
|
|
39
|
+
});
|
|
40
|
+
it("truncates a long single-line title but keeps the payload intact", () => {
|
|
41
|
+
const big = "x".repeat(5000);
|
|
42
|
+
const [event] = jsEventsFromEntries([entry({ message: big })], "iPhone Air");
|
|
43
|
+
expect(event.title.length).toBeLessThan(200);
|
|
44
|
+
expect(event.lines[0].raw).toHaveLength(5000);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("findJsEvent", () => {
|
|
48
|
+
it("returns undefined for a bare 'j' id instead of resolving to seq 0", () => {
|
|
49
|
+
// Number("") === 0, which passes Number.isFinite and used to search
|
|
50
|
+
// for seq === 0 — harmless only because nextSeq starts at 1, so this
|
|
51
|
+
// was a latent bug masked by an unrelated detail.
|
|
52
|
+
expect(findJsEvent("j")).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
it("still returns undefined for a non-numeric id", () => {
|
|
55
|
+
expect(findJsEvent("jabc")).toBeUndefined();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=jsLogEvents.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsLogEvents.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/jsLogEvents.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logEventFormat.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/logEventFormat.test.ts"],"names":[],"mappings":""}
|