execbro 1.10.22 → 1.10.24
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 +2 -1
- package/build/__tests__/unit/componentSource.test.d.ts +2 -0
- package/build/__tests__/unit/componentSource.test.d.ts.map +1 -0
- package/build/__tests__/unit/componentSource.test.js +67 -0
- package/build/__tests__/unit/componentSource.test.js.map +1 -0
- package/build/__tests__/unit/componentSourceResolve.test.d.ts +2 -0
- package/build/__tests__/unit/componentSourceResolve.test.d.ts.map +1 -0
- package/build/__tests__/unit/componentSourceResolve.test.js +91 -0
- package/build/__tests__/unit/componentSourceResolve.test.js.map +1 -0
- package/build/__tests__/unit/inspectorHarvest.test.d.ts +2 -0
- package/build/__tests__/unit/inspectorHarvest.test.d.ts.map +1 -0
- package/build/__tests__/unit/inspectorHarvest.test.js +61 -0
- package/build/__tests__/unit/inspectorHarvest.test.js.map +1 -0
- package/build/__tests__/unit/inspectorSource.test.d.ts +2 -0
- package/build/__tests__/unit/inspectorSource.test.d.ts.map +1 -0
- package/build/__tests__/unit/inspectorSource.test.js +74 -0
- package/build/__tests__/unit/inspectorSource.test.js.map +1 -0
- package/build/__tests__/unit/selectionBuffer.test.d.ts +2 -0
- package/build/__tests__/unit/selectionBuffer.test.d.ts.map +1 -0
- package/build/__tests__/unit/selectionBuffer.test.js +86 -0
- package/build/__tests__/unit/selectionBuffer.test.js.map +1 -0
- package/build/__tests__/unit/selectionPoller.test.d.ts +2 -0
- package/build/__tests__/unit/selectionPoller.test.d.ts.map +1 -0
- package/build/__tests__/unit/selectionPoller.test.js +109 -0
- package/build/__tests__/unit/selectionPoller.test.js.map +1 -0
- package/build/__tests__/unit/symbolicate.test.d.ts +2 -0
- package/build/__tests__/unit/symbolicate.test.d.ts.map +1 -0
- package/build/__tests__/unit/symbolicate.test.js +154 -0
- package/build/__tests__/unit/symbolicate.test.js.map +1 -0
- package/build/__tests__/unit/toolsJson.test.d.ts +2 -0
- package/build/__tests__/unit/toolsJson.test.d.ts.map +1 -0
- package/build/__tests__/unit/toolsJson.test.js +24 -0
- package/build/__tests__/unit/toolsJson.test.js.map +1 -0
- package/build/core/componentSource.d.ts +62 -0
- package/build/core/componentSource.d.ts.map +1 -0
- package/build/core/componentSource.js +268 -0
- package/build/core/componentSource.js.map +1 -0
- package/build/core/connection.d.ts.map +1 -1
- package/build/core/connection.js +4 -0
- package/build/core/connection.js.map +1 -1
- package/build/core/debugGlobals.d.ts.map +1 -1
- package/build/core/debugGlobals.js +3 -1
- package/build/core/debugGlobals.js.map +1 -1
- package/build/core/guides.js +1 -1
- package/build/core/index.d.ts +4 -1
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +4 -1
- package/build/core/index.js.map +1 -1
- package/build/core/inspector.d.ts +24 -0
- package/build/core/inspector.d.ts.map +1 -1
- package/build/core/inspector.js +58 -0
- package/build/core/inspector.js.map +1 -1
- package/build/core/sdkBridge.d.ts +8 -8
- package/build/core/sdkBridge.d.ts.map +1 -1
- package/build/core/sdkBridge.js +20 -20
- package/build/core/sdkBridge.js.map +1 -1
- package/build/core/selectionBuffer.d.ts +42 -0
- package/build/core/selectionBuffer.d.ts.map +1 -0
- package/build/core/selectionBuffer.js +51 -0
- package/build/core/selectionBuffer.js.map +1 -0
- package/build/core/selectionPoller.d.ts +13 -0
- package/build/core/selectionPoller.d.ts.map +1 -0
- package/build/core/selectionPoller.js +102 -0
- package/build/core/selectionPoller.js.map +1 -0
- package/build/core/symbolicate.d.ts +18 -0
- package/build/core/symbolicate.d.ts.map +1 -0
- package/build/core/symbolicate.js +119 -0
- package/build/core/symbolicate.js.map +1 -0
- package/build/tools/componentTools.d.ts.map +1 -1
- package/build/tools/componentTools.js +78 -9
- package/build/tools/componentTools.js.map +1 -1
- package/build/tools/connectionTools.d.ts.map +1 -1
- package/build/tools/connectionTools.js +3 -1
- package/build/tools/connectionTools.js.map +1 -1
- package/build/tools/interactionTools.d.ts.map +1 -1
- package/build/tools/interactionTools.js +1 -0
- package/build/tools/interactionTools.js.map +1 -1
- package/build/tools/logTools.d.ts.map +1 -1
- package/build/tools/logTools.js +26 -17
- package/build/tools/logTools.js.map +1 -1
- package/build/tools/networkTools.d.ts.map +1 -1
- package/build/tools/networkTools.js +15 -20
- package/build/tools/networkTools.js.map +1 -1
- package/build/tools/screenshotTools.d.ts.map +1 -1
- package/build/tools/screenshotTools.js +3 -0
- package/build/tools/screenshotTools.js.map +1 -1
- package/package.json +65 -64
package/build/core/sdkBridge.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { executeInApp } from "./executor.js";
|
|
2
2
|
import { connectedApps } from "./state.js";
|
|
3
3
|
// ── Detection ──
|
|
4
|
-
export async function isSDKInstalled() {
|
|
4
|
+
export async function isSDKInstalled(device) {
|
|
5
5
|
if (connectedApps.size === 0)
|
|
6
6
|
return false;
|
|
7
|
-
const result = await executeInApp('typeof (globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__)?.getNetworkEntries === "function"', false, { timeoutMs: 3000, originatingToolName: "_sdk_bridge" });
|
|
7
|
+
const result = await executeInApp('typeof (globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__)?.getNetworkEntries === "function"', false, { timeoutMs: 3000, originatingToolName: "_sdk_bridge" }, device);
|
|
8
8
|
return result.success && result.result === "true";
|
|
9
9
|
}
|
|
10
10
|
// ── Raw readers ──
|
|
11
|
-
async function readRawNetwork() {
|
|
12
|
-
const result = await executeInApp("JSON.stringify((globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).getNetworkEntries())", false, { timeoutMs: 5000, originatingToolName: "_sdk_bridge" });
|
|
11
|
+
async function readRawNetwork(device) {
|
|
12
|
+
const result = await executeInApp("JSON.stringify((globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).getNetworkEntries())", false, { timeoutMs: 5000, originatingToolName: "_sdk_bridge" }, device);
|
|
13
13
|
if (!result.success)
|
|
14
14
|
return { success: false, error: result.error || "executeInApp failed" };
|
|
15
15
|
try {
|
|
@@ -19,8 +19,8 @@ async function readRawNetwork() {
|
|
|
19
19
|
return { success: false, error: "Failed to parse SDK response" };
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
async function readRawConsole() {
|
|
23
|
-
const result = await executeInApp("JSON.stringify((globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).getConsoleEntries())", false, { timeoutMs: 5000, originatingToolName: "_sdk_bridge" });
|
|
22
|
+
async function readRawConsole(device) {
|
|
23
|
+
const result = await executeInApp("JSON.stringify((globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).getConsoleEntries())", false, { timeoutMs: 5000, originatingToolName: "_sdk_bridge" }, device);
|
|
24
24
|
if (!result.success)
|
|
25
25
|
return { success: false, error: result.error || "executeInApp failed" };
|
|
26
26
|
try {
|
|
@@ -31,8 +31,8 @@ async function readRawConsole() {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
// ── Server-side network queries ──
|
|
34
|
-
export async function querySDKNetwork(options = {}) {
|
|
35
|
-
const raw = await readRawNetwork();
|
|
34
|
+
export async function querySDKNetwork(options = {}, device) {
|
|
35
|
+
const raw = await readRawNetwork(device);
|
|
36
36
|
if (!raw.success)
|
|
37
37
|
return raw;
|
|
38
38
|
let entries = raw.data;
|
|
@@ -54,15 +54,15 @@ export async function querySDKNetwork(options = {}) {
|
|
|
54
54
|
}
|
|
55
55
|
return { success: true, data: entries };
|
|
56
56
|
}
|
|
57
|
-
export async function getSDKNetworkEntry(id) {
|
|
58
|
-
const raw = await readRawNetwork();
|
|
57
|
+
export async function getSDKNetworkEntry(id, device) {
|
|
58
|
+
const raw = await readRawNetwork(device);
|
|
59
59
|
if (!raw.success)
|
|
60
60
|
return raw;
|
|
61
61
|
const entry = raw.data.find(e => e.id === id) ?? null;
|
|
62
62
|
return { success: true, data: entry };
|
|
63
63
|
}
|
|
64
|
-
export async function getSDKNetworkStats() {
|
|
65
|
-
const raw = await readRawNetwork();
|
|
64
|
+
export async function getSDKNetworkStats(device) {
|
|
65
|
+
const raw = await readRawNetwork(device);
|
|
66
66
|
if (!raw.success)
|
|
67
67
|
return raw;
|
|
68
68
|
const all = raw.data;
|
|
@@ -101,8 +101,8 @@ export async function getSDKNetworkStats() {
|
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
103
|
// ── Server-side console queries ──
|
|
104
|
-
export async function querySDKConsole(options = {}) {
|
|
105
|
-
const raw = await readRawConsole();
|
|
104
|
+
export async function querySDKConsole(options = {}, device) {
|
|
105
|
+
const raw = await readRawConsole(device);
|
|
106
106
|
if (!raw.success)
|
|
107
107
|
return raw;
|
|
108
108
|
let entries = raw.data;
|
|
@@ -120,8 +120,8 @@ export async function querySDKConsole(options = {}) {
|
|
|
120
120
|
}
|
|
121
121
|
return { success: true, data: entries };
|
|
122
122
|
}
|
|
123
|
-
export async function getSDKConsoleStats() {
|
|
124
|
-
const raw = await readRawConsole();
|
|
123
|
+
export async function getSDKConsoleStats(device) {
|
|
124
|
+
const raw = await readRawConsole(device);
|
|
125
125
|
if (!raw.success)
|
|
126
126
|
return raw;
|
|
127
127
|
const byLevel = {};
|
|
@@ -131,15 +131,15 @@ export async function getSDKConsoleStats() {
|
|
|
131
131
|
return { success: true, data: { total: raw.data.length, byLevel } };
|
|
132
132
|
}
|
|
133
133
|
// ── Mutations ──
|
|
134
|
-
export async function clearSDKNetwork() {
|
|
135
|
-
const result = await executeInApp("(globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).clearNetwork()", false, { timeoutMs: 3000, originatingToolName: "_sdk_bridge" });
|
|
134
|
+
export async function clearSDKNetwork(device) {
|
|
135
|
+
const result = await executeInApp("(globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).clearNetwork()", false, { timeoutMs: 3000, originatingToolName: "_sdk_bridge" }, device);
|
|
136
136
|
if (!result.success)
|
|
137
137
|
return { success: false, error: result.error };
|
|
138
138
|
const count = parseInt(result.result || "0", 10);
|
|
139
139
|
return { success: true, count: isNaN(count) ? 0 : count };
|
|
140
140
|
}
|
|
141
|
-
export async function clearSDKConsole() {
|
|
142
|
-
const result = await executeInApp("(globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).clearConsole()", false, { timeoutMs: 3000, originatingToolName: "_sdk_bridge" });
|
|
141
|
+
export async function clearSDKConsole(device) {
|
|
142
|
+
const result = await executeInApp("(globalThis.__EXECBRO__ ?? globalThis.__RN_AI_DEVTOOLS__).clearConsole()", false, { timeoutMs: 3000, originatingToolName: "_sdk_bridge" }, device);
|
|
143
143
|
if (!result.success)
|
|
144
144
|
return { success: false, error: result.error };
|
|
145
145
|
const count = parseInt(result.result || "0", 10);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkBridge.js","sourceRoot":"","sources":["../../src/core/sdkBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA8B3C,kBAAkB;AAElB,MAAM,CAAC,KAAK,UAAU,cAAc;
|
|
1
|
+
{"version":3,"file":"sdkBridge.js","sourceRoot":"","sources":["../../src/core/sdkBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface SelectionFrame {
|
|
2
|
+
left: number;
|
|
3
|
+
top: number;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ComponentStack {
|
|
8
|
+
component: string;
|
|
9
|
+
stack: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SelectionEntry {
|
|
12
|
+
id: string;
|
|
13
|
+
device: string;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
element: string;
|
|
16
|
+
path: string;
|
|
17
|
+
hierarchy: string[];
|
|
18
|
+
frame: SelectionFrame | null;
|
|
19
|
+
style: Record<string, unknown> | null;
|
|
20
|
+
/** Raw fiber _debugStack strings, harvested at tap time. Symbolicated lazily on read. */
|
|
21
|
+
stacks: ComponentStack[];
|
|
22
|
+
}
|
|
23
|
+
export declare class SelectionBuffer {
|
|
24
|
+
private entries;
|
|
25
|
+
private maxSize;
|
|
26
|
+
constructor(maxSize?: number);
|
|
27
|
+
/**
|
|
28
|
+
* Appends unless it duplicates the most recent entry for the same device.
|
|
29
|
+
* Returns whether the entry was accepted, so the poller can tell a genuine
|
|
30
|
+
* new tap from a re-read of the same selection.
|
|
31
|
+
*/
|
|
32
|
+
add(entry: SelectionEntry): boolean;
|
|
33
|
+
list(options?: {
|
|
34
|
+
device?: string;
|
|
35
|
+
limit?: number;
|
|
36
|
+
}): SelectionEntry[];
|
|
37
|
+
latest(device?: string): SelectionEntry | undefined;
|
|
38
|
+
clear(): void;
|
|
39
|
+
get size(): number;
|
|
40
|
+
}
|
|
41
|
+
export declare const selectionBuffer: SelectionBuffer;
|
|
42
|
+
//# sourceMappingURL=selectionBuffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionBuffer.d.ts","sourceRoot":"","sources":["../../src/core/selectionBuffer.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtC,yFAAyF;IACzF,MAAM,EAAE,cAAc,EAAE,CAAC;CAC5B;AAQD,qBAAa,eAAe;IACxB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAY;IAIjC;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO;IAYnC,IAAI,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,cAAc,EAAE;IASzE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAOnD,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACJ;AAED,eAAO,MAAM,eAAe,iBAA2B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
function signature(entry) {
|
|
2
|
+
const f = entry.frame;
|
|
3
|
+
const frameSig = f ? `${f.left},${f.top},${f.width},${f.height}` : "none";
|
|
4
|
+
return `${entry.device}|${entry.path}|${frameSig}`;
|
|
5
|
+
}
|
|
6
|
+
export class SelectionBuffer {
|
|
7
|
+
entries = [];
|
|
8
|
+
maxSize;
|
|
9
|
+
constructor(maxSize = 100) {
|
|
10
|
+
this.maxSize = maxSize;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Appends unless it duplicates the most recent entry for the same device.
|
|
14
|
+
* Returns whether the entry was accepted, so the poller can tell a genuine
|
|
15
|
+
* new tap from a re-read of the same selection.
|
|
16
|
+
*/
|
|
17
|
+
add(entry) {
|
|
18
|
+
const previous = this.latest(entry.device);
|
|
19
|
+
if (previous && signature(previous) === signature(entry)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
this.entries.push(entry);
|
|
23
|
+
while (this.entries.length > this.maxSize) {
|
|
24
|
+
this.entries.shift();
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
list(options = {}) {
|
|
29
|
+
let filtered = this.entries;
|
|
30
|
+
if (options.device) {
|
|
31
|
+
filtered = filtered.filter((e) => e.device === options.device);
|
|
32
|
+
}
|
|
33
|
+
const newestFirst = [...filtered].reverse();
|
|
34
|
+
return options.limit !== undefined ? newestFirst.slice(0, options.limit) : newestFirst;
|
|
35
|
+
}
|
|
36
|
+
latest(device) {
|
|
37
|
+
for (let i = this.entries.length - 1; i >= 0; i--) {
|
|
38
|
+
if (!device || this.entries[i].device === device)
|
|
39
|
+
return this.entries[i];
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
clear() {
|
|
44
|
+
this.entries = [];
|
|
45
|
+
}
|
|
46
|
+
get size() {
|
|
47
|
+
return this.entries.length;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export const selectionBuffer = new SelectionBuffer(100);
|
|
51
|
+
//# sourceMappingURL=selectionBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionBuffer.js","sourceRoot":"","sources":["../../src/core/selectionBuffer.ts"],"names":[],"mappings":"AAyBA,SAAS,SAAS,CAAC,KAAqB;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1E,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,OAAO,eAAe;IAChB,OAAO,GAAqB,EAAE,CAAC;IAC/B,OAAO,CAAS;IAExB,YAAY,UAAkB,GAAG;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,KAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,UAA+C,EAAE;QAClD,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAC3F,CAAC;IAED,MAAM,CAAC,MAAe;QAClB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const IDLE_INTERVAL_MS = 2000;
|
|
2
|
+
export declare const ACTIVE_INTERVAL_MS = 500;
|
|
3
|
+
/**
|
|
4
|
+
* One poll cycle. The probe is cheap and runs every tick; the harvest measures
|
|
5
|
+
* host fibers and runs only when the probe reports a change - once per tap.
|
|
6
|
+
* Returns whether an entry was buffered.
|
|
7
|
+
*/
|
|
8
|
+
export declare function pollOnce(device: string): Promise<boolean>;
|
|
9
|
+
export declare function isSelectionPollerRunning(device: string): boolean;
|
|
10
|
+
export declare function startSelectionPoller(device: string): void;
|
|
11
|
+
export declare function stopSelectionPoller(device: string): void;
|
|
12
|
+
export declare function stopAllSelectionPollers(): void;
|
|
13
|
+
//# sourceMappingURL=selectionPoller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionPoller.d.ts","sourceRoot":"","sources":["../../src/core/selectionPoller.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAStC;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2D/D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBzD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIxD;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { executeInApp } from "./jsExecute.js";
|
|
2
|
+
import { buildSelectionProbeExpression, buildDebugStackHarvestExpression, } from "./componentSource.js";
|
|
3
|
+
import { selectionBuffer } from "./selectionBuffer.js";
|
|
4
|
+
export const IDLE_INTERVAL_MS = 2000;
|
|
5
|
+
export const ACTIVE_INTERVAL_MS = 500;
|
|
6
|
+
const timers = new Map();
|
|
7
|
+
let entryCounter = 0;
|
|
8
|
+
function pollingDisabled() {
|
|
9
|
+
return process.env.EXECBRO_DISABLE_SELECTION_POLL === "1";
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* One poll cycle. The probe is cheap and runs every tick; the harvest measures
|
|
13
|
+
* host fibers and runs only when the probe reports a change - once per tap.
|
|
14
|
+
* Returns whether an entry was buffered.
|
|
15
|
+
*/
|
|
16
|
+
export async function pollOnce(device) {
|
|
17
|
+
let probe;
|
|
18
|
+
try {
|
|
19
|
+
const raw = await executeInApp(buildSelectionProbeExpression(), false, {
|
|
20
|
+
maxRetries: 0,
|
|
21
|
+
autoReconnect: false,
|
|
22
|
+
timeoutMs: 3000,
|
|
23
|
+
originatingToolName: "selection_poll",
|
|
24
|
+
}, device);
|
|
25
|
+
if (!raw.success || !raw.result)
|
|
26
|
+
return false;
|
|
27
|
+
probe = JSON.parse(raw.result);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (!probe.changed || !probe.selected)
|
|
33
|
+
return false;
|
|
34
|
+
let stacks = [];
|
|
35
|
+
if (probe.frame) {
|
|
36
|
+
const centreX = probe.frame.left + probe.frame.width / 2;
|
|
37
|
+
const centreY = probe.frame.top + probe.frame.height / 2;
|
|
38
|
+
try {
|
|
39
|
+
const harvest = await executeInApp(buildDebugStackHarvestExpression(centreX, centreY), true, {
|
|
40
|
+
maxRetries: 0,
|
|
41
|
+
autoReconnect: false,
|
|
42
|
+
timeoutMs: 3000,
|
|
43
|
+
originatingToolName: "selection_poll",
|
|
44
|
+
}, device);
|
|
45
|
+
if (harvest.success && harvest.result) {
|
|
46
|
+
const parsed = JSON.parse(harvest.result);
|
|
47
|
+
stacks = parsed.stacks ?? [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
stacks = [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
entryCounter += 1;
|
|
55
|
+
return selectionBuffer.add({
|
|
56
|
+
id: `sel-${Date.now()}-${entryCounter}`,
|
|
57
|
+
device,
|
|
58
|
+
timestamp: Date.now(),
|
|
59
|
+
element: probe.element ?? "Unknown",
|
|
60
|
+
path: probe.path ?? "",
|
|
61
|
+
hierarchy: probe.hierarchy ?? [],
|
|
62
|
+
frame: probe.frame ?? null,
|
|
63
|
+
style: probe.style ?? null,
|
|
64
|
+
stacks,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function isSelectionPollerRunning(device) {
|
|
68
|
+
return timers.has(device);
|
|
69
|
+
}
|
|
70
|
+
export function startSelectionPoller(device) {
|
|
71
|
+
if (pollingDisabled() || timers.has(device))
|
|
72
|
+
return;
|
|
73
|
+
const schedule = (delay) => {
|
|
74
|
+
const timer = setTimeout(async () => {
|
|
75
|
+
let active = false;
|
|
76
|
+
try {
|
|
77
|
+
active = await pollOnce(device);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
active = false;
|
|
81
|
+
}
|
|
82
|
+
if (timers.has(device)) {
|
|
83
|
+
schedule(active ? ACTIVE_INTERVAL_MS : IDLE_INTERVAL_MS);
|
|
84
|
+
}
|
|
85
|
+
}, delay);
|
|
86
|
+
timer.unref?.();
|
|
87
|
+
timers.set(device, timer);
|
|
88
|
+
};
|
|
89
|
+
schedule(IDLE_INTERVAL_MS);
|
|
90
|
+
}
|
|
91
|
+
export function stopSelectionPoller(device) {
|
|
92
|
+
const timer = timers.get(device);
|
|
93
|
+
if (timer)
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
timers.delete(device);
|
|
96
|
+
}
|
|
97
|
+
export function stopAllSelectionPollers() {
|
|
98
|
+
for (const device of [...timers.keys()]) {
|
|
99
|
+
stopSelectionPoller(device);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=selectionPoller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectionPoller.js","sourceRoot":"","sources":["../../src/core/selectionPoller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface StackFrame {
|
|
2
|
+
file: string;
|
|
3
|
+
lineNumber: number;
|
|
4
|
+
column: number;
|
|
5
|
+
methodName: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface SymbolicatedFrame {
|
|
8
|
+
file: string;
|
|
9
|
+
lineNumber: number;
|
|
10
|
+
column: number;
|
|
11
|
+
methodName: string | null;
|
|
12
|
+
collapse: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function clearSymbolicateCache(): void;
|
|
15
|
+
export declare function parseStackString(stack: string, limit?: number): StackFrame[];
|
|
16
|
+
export declare function firstUserFrame(frames: SymbolicatedFrame[]): SymbolicatedFrame | null;
|
|
17
|
+
export declare function symbolicateFrames(frames: StackFrame[], timeoutMs?: number): Promise<SymbolicatedFrame[] | null>;
|
|
18
|
+
//# sourceMappingURL=symbolicate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbolicate.d.ts","sourceRoot":"","sources":["../../src/core/symbolicate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACrB;AAgBD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,UAAU,EAAE,CAevE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,GAAG,IAAI,CAKpF;AAkBD,wBAAsB,iBAAiB,CACnC,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,SAAQ,GAClB,OAAO,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CA0DrC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Matches Hermes/V8 frames:
|
|
2
|
+
// " at HomeScreen (http://host:8081/bundle?a=b:342013:64)"
|
|
3
|
+
// " at http://host:8081/bundle:100:5"
|
|
4
|
+
// The file group is greedy so the trailing ":line:col" anchors the match at the
|
|
5
|
+
// end — a lazy group would split on the colon inside "http://".
|
|
6
|
+
const FRAME_RE = /^\s*at\s+(?:(.+?)\s+\()?(.*):(\d+):(\d+)\)?\s*$/;
|
|
7
|
+
const MAX_CACHE_ENTRIES = 500;
|
|
8
|
+
const cache = new Map();
|
|
9
|
+
function cacheKey(frame) {
|
|
10
|
+
return `${frame.file}|${frame.lineNumber}|${frame.column}`;
|
|
11
|
+
}
|
|
12
|
+
export function clearSymbolicateCache() {
|
|
13
|
+
cache.clear();
|
|
14
|
+
}
|
|
15
|
+
export function parseStackString(stack, limit = 5) {
|
|
16
|
+
if (!stack)
|
|
17
|
+
return [];
|
|
18
|
+
const out = [];
|
|
19
|
+
for (const line of stack.split("\n")) {
|
|
20
|
+
if (out.length >= limit)
|
|
21
|
+
break;
|
|
22
|
+
const m = FRAME_RE.exec(line);
|
|
23
|
+
if (!m)
|
|
24
|
+
continue;
|
|
25
|
+
out.push({
|
|
26
|
+
methodName: m[1] ?? null,
|
|
27
|
+
file: m[2],
|
|
28
|
+
lineNumber: Number(m[3]),
|
|
29
|
+
column: Number(m[4]),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
export function firstUserFrame(frames) {
|
|
35
|
+
for (const frame of frames) {
|
|
36
|
+
if (!frame.collapse)
|
|
37
|
+
return frame;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Metro's /symbolicate endpoint. The `file` values are sent verbatim because
|
|
43
|
+
* Metro matches them against its own bundle registry — rewriting them breaks
|
|
44
|
+
* the lookup. Only the POST target is rewritten: the frames carry the LAN
|
|
45
|
+
* address the device used, while execbro reaches Metro on loopback.
|
|
46
|
+
*/
|
|
47
|
+
function symbolicateEndpoint(file) {
|
|
48
|
+
try {
|
|
49
|
+
const url = new URL(file);
|
|
50
|
+
if (url.port)
|
|
51
|
+
return `http://127.0.0.1:${url.port}/symbolicate`;
|
|
52
|
+
return `${url.origin}/symbolicate`;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return "http://127.0.0.1:8081/symbolicate";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function symbolicateFrames(frames, timeoutMs = 10000) {
|
|
59
|
+
if (frames.length === 0)
|
|
60
|
+
return [];
|
|
61
|
+
const results = frames.map((f) => cache.get(cacheKey(f)) ?? null);
|
|
62
|
+
const missingIndexes = [];
|
|
63
|
+
results.forEach((r, i) => {
|
|
64
|
+
if (r === null)
|
|
65
|
+
missingIndexes.push(i);
|
|
66
|
+
});
|
|
67
|
+
if (missingIndexes.length === 0)
|
|
68
|
+
return results;
|
|
69
|
+
const endpoint = symbolicateEndpoint(frames[missingIndexes[0]].file);
|
|
70
|
+
const payload = {
|
|
71
|
+
stack: missingIndexes.map((i) => ({
|
|
72
|
+
file: frames[i].file,
|
|
73
|
+
lineNumber: frames[i].lineNumber,
|
|
74
|
+
column: frames[i].column,
|
|
75
|
+
methodName: frames[i].methodName,
|
|
76
|
+
})),
|
|
77
|
+
};
|
|
78
|
+
const controller = new AbortController();
|
|
79
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
80
|
+
try {
|
|
81
|
+
const res = await fetch(endpoint, {
|
|
82
|
+
method: "POST",
|
|
83
|
+
headers: { "Content-Type": "application/json" },
|
|
84
|
+
body: JSON.stringify(payload),
|
|
85
|
+
signal: controller.signal,
|
|
86
|
+
});
|
|
87
|
+
if (!res.ok)
|
|
88
|
+
return null;
|
|
89
|
+
const body = (await res.json());
|
|
90
|
+
const returned = Array.isArray(body.stack) ? body.stack : [];
|
|
91
|
+
missingIndexes.forEach((target, i) => {
|
|
92
|
+
const raw = returned[i];
|
|
93
|
+
if (!raw)
|
|
94
|
+
return;
|
|
95
|
+
const resolved = {
|
|
96
|
+
file: String(raw.file ?? frames[target].file),
|
|
97
|
+
lineNumber: Number(raw.lineNumber ?? frames[target].lineNumber),
|
|
98
|
+
column: Number(raw.column ?? frames[target].column),
|
|
99
|
+
methodName: raw.methodName ?? null,
|
|
100
|
+
collapse: raw.collapse === true,
|
|
101
|
+
};
|
|
102
|
+
results[target] = resolved;
|
|
103
|
+
if (cache.size >= MAX_CACHE_ENTRIES) {
|
|
104
|
+
const oldest = cache.keys().next().value;
|
|
105
|
+
if (oldest !== undefined)
|
|
106
|
+
cache.delete(oldest);
|
|
107
|
+
}
|
|
108
|
+
cache.set(cacheKey(frames[target]), resolved);
|
|
109
|
+
});
|
|
110
|
+
return results.filter((r) => r !== null);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=symbolicate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbolicate.js","sourceRoot":"","sources":["../../src/core/symbolicate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentTools.d.ts","sourceRoot":"","sources":["../../src/tools/componentTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"componentTools.d.ts","sourceRoot":"","sources":["../../src/tools/componentTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgDzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAq7B9D"}
|