react-native-ai-devtools 2.18.1 → 2.20.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 -0
- package/build/__tests__/unit/actionLog.test.d.ts +2 -0
- package/build/__tests__/unit/actionLog.test.d.ts.map +1 -0
- package/build/__tests__/unit/actionLog.test.js +116 -0
- package/build/__tests__/unit/actionLog.test.js.map +1 -0
- package/build/__tests__/unit/actionOutcome.test.d.ts +2 -0
- package/build/__tests__/unit/actionOutcome.test.d.ts.map +1 -0
- package/build/__tests__/unit/actionOutcome.test.js +166 -0
- package/build/__tests__/unit/actionOutcome.test.js.map +1 -0
- package/build/__tests__/unit/actionOutcomeCollect.test.d.ts +2 -0
- package/build/__tests__/unit/actionOutcomeCollect.test.d.ts.map +1 -0
- package/build/__tests__/unit/actionOutcomeCollect.test.js +110 -0
- package/build/__tests__/unit/actionOutcomeCollect.test.js.map +1 -0
- package/build/__tests__/unit/actionRender.test.d.ts +2 -0
- package/build/__tests__/unit/actionRender.test.d.ts.map +1 -0
- package/build/__tests__/unit/actionRender.test.js +163 -0
- package/build/__tests__/unit/actionRender.test.js.map +1 -0
- package/build/__tests__/unit/blankFrame.test.d.ts +2 -0
- package/build/__tests__/unit/blankFrame.test.d.ts.map +1 -0
- package/build/__tests__/unit/blankFrame.test.js +23 -0
- package/build/__tests__/unit/blankFrame.test.js.map +1 -0
- package/build/__tests__/unit/chromiumNavigation.test.d.ts +2 -0
- package/build/__tests__/unit/chromiumNavigation.test.d.ts.map +1 -0
- package/build/__tests__/unit/chromiumNavigation.test.js +36 -0
- package/build/__tests__/unit/chromiumNavigation.test.js.map +1 -0
- package/build/__tests__/unit/commitRecorder.test.d.ts +2 -0
- package/build/__tests__/unit/commitRecorder.test.d.ts.map +1 -0
- package/build/__tests__/unit/commitRecorder.test.js +141 -0
- package/build/__tests__/unit/commitRecorder.test.js.map +1 -0
- package/build/__tests__/unit/commitRecorderInjected.test.d.ts +2 -0
- package/build/__tests__/unit/commitRecorderInjected.test.d.ts.map +1 -0
- package/build/__tests__/unit/commitRecorderInjected.test.js +195 -0
- package/build/__tests__/unit/commitRecorderInjected.test.js.map +1 -0
- package/build/__tests__/unit/compactImageSrc.test.d.ts +2 -0
- package/build/__tests__/unit/compactImageSrc.test.d.ts.map +1 -0
- package/build/__tests__/unit/compactImageSrc.test.js +11 -0
- package/build/__tests__/unit/compactImageSrc.test.js.map +1 -0
- package/build/__tests__/unit/epochStarts.test.d.ts +2 -0
- package/build/__tests__/unit/epochStarts.test.d.ts.map +1 -0
- package/build/__tests__/unit/epochStarts.test.js +35 -0
- package/build/__tests__/unit/epochStarts.test.js.map +1 -0
- package/build/__tests__/unit/launchRecordsDevice.test.d.ts +2 -0
- package/build/__tests__/unit/launchRecordsDevice.test.d.ts.map +1 -0
- package/build/__tests__/unit/launchRecordsDevice.test.js +37 -0
- package/build/__tests__/unit/launchRecordsDevice.test.js.map +1 -0
- package/build/__tests__/unit/logOwnership.test.js +6 -6
- package/build/__tests__/unit/logOwnership.test.js.map +1 -1
- package/build/__tests__/unit/logSourceIos.test.js +2 -2
- package/build/__tests__/unit/logSourceIos.test.js.map +1 -1
- package/build/__tests__/unit/nativeLogs.test.js +10 -10
- package/build/__tests__/unit/nativeLogs.test.js.map +1 -1
- package/build/__tests__/unit/networkIdle.test.d.ts +2 -0
- package/build/__tests__/unit/networkIdle.test.d.ts.map +1 -0
- package/build/__tests__/unit/networkIdle.test.js +65 -0
- package/build/__tests__/unit/networkIdle.test.js.map +1 -0
- package/build/__tests__/unit/networkNotable.test.d.ts +2 -0
- package/build/__tests__/unit/networkNotable.test.d.ts.map +1 -0
- package/build/__tests__/unit/networkNotable.test.js +56 -0
- package/build/__tests__/unit/networkNotable.test.js.map +1 -0
- package/build/__tests__/unit/pressabilityAudit.test.js +16 -1
- package/build/__tests__/unit/pressabilityAudit.test.js.map +1 -1
- package/build/__tests__/unit/redact.test.js +2 -2
- package/build/__tests__/unit/redact.test.js.map +1 -1
- package/build/__tests__/unit/scrollClip.test.d.ts +2 -0
- package/build/__tests__/unit/scrollClip.test.d.ts.map +1 -0
- package/build/__tests__/unit/scrollClip.test.js +45 -0
- package/build/__tests__/unit/scrollClip.test.js.map +1 -0
- package/build/__tests__/unit/secureValue.test.d.ts +2 -0
- package/build/__tests__/unit/secureValue.test.d.ts.map +1 -0
- package/build/__tests__/unit/secureValue.test.js +51 -0
- package/build/__tests__/unit/secureValue.test.js.map +1 -0
- package/build/__tests__/unit/sessionOnce.test.d.ts +2 -0
- package/build/__tests__/unit/sessionOnce.test.d.ts.map +1 -0
- package/build/__tests__/unit/sessionOnce.test.js +17 -0
- package/build/__tests__/unit/sessionOnce.test.js.map +1 -0
- package/build/__tests__/unit/swipeProbeWithoutRn.test.js +28 -1
- package/build/__tests__/unit/swipeProbeWithoutRn.test.js.map +1 -1
- package/build/__tests__/unit/tap.test.js +1 -1
- package/build/__tests__/unit/tap.test.js.map +1 -1
- package/build/__tests__/unit/tapNativeScreenshot.test.d.ts +2 -0
- package/build/__tests__/unit/tapNativeScreenshot.test.d.ts.map +1 -0
- package/build/__tests__/unit/tapNativeScreenshot.test.js +99 -0
- package/build/__tests__/unit/tapNativeScreenshot.test.js.map +1 -0
- package/build/__tests__/unit/textSnapshot.test.d.ts +2 -0
- package/build/__tests__/unit/textSnapshot.test.d.ts.map +1 -0
- package/build/__tests__/unit/textSnapshot.test.js +49 -0
- package/build/__tests__/unit/textSnapshot.test.js.map +1 -0
- package/build/__tests__/unit/timeline.test.d.ts +2 -0
- package/build/__tests__/unit/timeline.test.d.ts.map +1 -0
- package/build/__tests__/unit/timeline.test.js +157 -0
- package/build/__tests__/unit/timeline.test.js.map +1 -0
- package/build/__tests__/unit/timelineReadBounds.test.d.ts +2 -0
- package/build/__tests__/unit/timelineReadBounds.test.d.ts.map +1 -0
- package/build/__tests__/unit/timelineReadBounds.test.js +21 -0
- package/build/__tests__/unit/timelineReadBounds.test.js.map +1 -0
- package/build/__tests__/unit/timelineSources.test.d.ts +2 -0
- package/build/__tests__/unit/timelineSources.test.d.ts.map +1 -0
- package/build/__tests__/unit/timelineSources.test.js +139 -0
- package/build/__tests__/unit/timelineSources.test.js.map +1 -0
- package/build/__tests__/unit/timelineTool.test.d.ts +2 -0
- package/build/__tests__/unit/timelineTool.test.d.ts.map +1 -0
- package/build/__tests__/unit/timelineTool.test.js +65 -0
- package/build/__tests__/unit/timelineTool.test.js.map +1 -0
- package/build/__tests__/unit/vaultTools.test.js +20 -6
- package/build/__tests__/unit/vaultTools.test.js.map +1 -1
- package/build/core/actionLog.d.ts +27 -0
- package/build/core/actionLog.d.ts.map +1 -0
- package/build/core/actionLog.js +144 -0
- package/build/core/actionLog.js.map +1 -0
- package/build/core/actionOutcome.d.ts +35 -0
- package/build/core/actionOutcome.d.ts.map +1 -0
- package/build/core/actionOutcome.js +184 -0
- package/build/core/actionOutcome.js.map +1 -0
- package/build/core/actionOutcomeCollect.d.ts +27 -0
- package/build/core/actionOutcomeCollect.d.ts.map +1 -0
- package/build/core/actionOutcomeCollect.js +102 -0
- package/build/core/actionOutcomeCollect.js.map +1 -0
- package/build/core/blankFrame.d.ts +3 -0
- package/build/core/blankFrame.d.ts.map +1 -0
- package/build/core/blankFrame.js +18 -0
- package/build/core/blankFrame.js.map +1 -0
- package/build/core/chromiumCapabilities.js +1 -1
- package/build/core/chromiumCapabilities.js.map +1 -1
- package/build/core/chromiumNavigation.d.ts +10 -0
- package/build/core/chromiumNavigation.d.ts.map +1 -0
- package/build/core/chromiumNavigation.js +31 -0
- package/build/core/chromiumNavigation.js.map +1 -0
- package/build/core/chromiumScreen.d.ts.map +1 -1
- package/build/core/chromiumScreen.js +6 -8
- package/build/core/chromiumScreen.js.map +1 -1
- package/build/core/commitRecorder.d.ts +35 -0
- package/build/core/commitRecorder.d.ts.map +1 -0
- package/build/core/commitRecorder.js +115 -0
- package/build/core/commitRecorder.js.map +1 -0
- package/build/core/componentSearch.d.ts.map +1 -1
- package/build/core/componentSearch.js +6 -1
- package/build/core/componentSearch.js.map +1 -1
- package/build/core/connection.d.ts.map +1 -1
- package/build/core/connection.js +13 -0
- package/build/core/connection.js.map +1 -1
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +14 -5
- package/build/core/guides.js.map +1 -1
- package/build/core/injected/commitRecorder.d.ts +2 -0
- package/build/core/injected/commitRecorder.d.ts.map +1 -0
- package/build/core/injected/commitRecorder.js +93 -0
- package/build/core/injected/commitRecorder.js.map +1 -0
- package/build/core/injected/scrollClip.d.ts +12 -0
- package/build/core/injected/scrollClip.d.ts.map +1 -0
- package/build/core/injected/scrollClip.js +46 -0
- package/build/core/injected/scrollClip.js.map +1 -0
- package/build/core/injected/secureValue.d.ts +3 -0
- package/build/core/injected/secureValue.d.ts.map +1 -0
- package/build/core/injected/secureValue.js +22 -0
- package/build/core/injected/secureValue.js.map +1 -0
- package/build/core/inputTarget.d.ts.map +1 -1
- package/build/core/inputTarget.js +3 -1
- package/build/core/inputTarget.js.map +1 -1
- package/build/core/inspector.d.ts.map +1 -1
- package/build/core/inspector.js +7 -2
- package/build/core/inspector.js.map +1 -1
- package/build/core/network.d.ts +1 -0
- package/build/core/network.d.ts.map +1 -1
- package/build/core/network.js +4 -1
- package/build/core/network.js.map +1 -1
- package/build/core/networkIdle.d.ts +21 -0
- package/build/core/networkIdle.d.ts.map +1 -0
- package/build/core/networkIdle.js +41 -0
- package/build/core/networkIdle.js.map +1 -0
- package/build/core/networkNotable.d.ts +3 -0
- package/build/core/networkNotable.d.ts.map +1 -0
- package/build/core/networkNotable.js +111 -0
- package/build/core/networkNotable.js.map +1 -0
- package/build/core/pressables.d.ts.map +1 -1
- package/build/core/pressables.js +7 -5
- package/build/core/pressables.js.map +1 -1
- package/build/core/register.d.ts.map +1 -1
- package/build/core/register.js +2 -0
- package/build/core/register.js.map +1 -1
- package/build/core/routeHistory.d.ts +3 -2
- package/build/core/routeHistory.d.ts.map +1 -1
- package/build/core/routeHistory.js +6 -6
- package/build/core/routeHistory.js.map +1 -1
- package/build/core/screenState.d.ts +5 -1
- package/build/core/screenState.d.ts.map +1 -1
- package/build/core/screenState.js +98 -19
- package/build/core/screenState.js.map +1 -1
- package/build/core/sessionOnce.d.ts +3 -0
- package/build/core/sessionOnce.d.ts.map +1 -0
- package/build/core/sessionOnce.js +11 -0
- package/build/core/sessionOnce.js.map +1 -0
- package/build/core/state.d.ts +4 -0
- package/build/core/state.d.ts.map +1 -1
- package/build/core/state.js +11 -0
- package/build/core/state.js.map +1 -1
- package/build/core/swipeDiagnosis.d.ts.map +1 -1
- package/build/core/swipeDiagnosis.js +25 -11
- package/build/core/swipeDiagnosis.js.map +1 -1
- package/build/core/textSnapshot.d.ts +6 -0
- package/build/core/textSnapshot.d.ts.map +1 -0
- package/build/core/textSnapshot.js +85 -0
- package/build/core/textSnapshot.js.map +1 -0
- package/build/core/timeline.d.ts +71 -0
- package/build/core/timeline.d.ts.map +1 -0
- package/build/core/timeline.js +156 -0
- package/build/core/timeline.js.map +1 -0
- package/build/core/timelineSources.d.ts +30 -0
- package/build/core/timelineSources.d.ts.map +1 -0
- package/build/core/timelineSources.js +179 -0
- package/build/core/timelineSources.js.map +1 -0
- package/build/core/toolHelpers.d.ts +1 -0
- package/build/core/toolHelpers.d.ts.map +1 -1
- package/build/core/toolHelpers.js +1 -1
- package/build/core/toolHelpers.js.map +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -0
- package/build/index.js.map +1 -1
- package/build/pro/actionRender.d.ts +40 -0
- package/build/pro/actionRender.d.ts.map +1 -0
- package/build/pro/actionRender.js +139 -0
- package/build/pro/actionRender.js.map +1 -0
- package/build/pro/tap.d.ts.map +1 -1
- package/build/pro/tap.js +2 -0
- package/build/pro/tap.js.map +1 -1
- package/build/tools/componentTools.d.ts.map +1 -1
- package/build/tools/componentTools.js +4 -3
- package/build/tools/componentTools.js.map +1 -1
- package/build/tools/deviceTools.d.ts +1 -0
- package/build/tools/deviceTools.d.ts.map +1 -1
- package/build/tools/deviceTools.js +18 -3
- package/build/tools/deviceTools.js.map +1 -1
- package/build/tools/interactionTools.d.ts.map +1 -1
- package/build/tools/interactionTools.js +53 -20
- package/build/tools/interactionTools.js.map +1 -1
- package/build/tools/metaTools.d.ts.map +1 -1
- package/build/tools/metaTools.js +15 -1
- package/build/tools/metaTools.js.map +1 -1
- package/build/tools/networkTools.d.ts.map +1 -1
- package/build/tools/networkTools.js +5 -1
- package/build/tools/networkTools.js.map +1 -1
- package/build/tools/screenshotTools.d.ts.map +1 -1
- package/build/tools/screenshotTools.js +58 -32
- package/build/tools/screenshotTools.js.map +1 -1
- package/build/tools/timelineTools.d.ts +3 -0
- package/build/tools/timelineTools.d.ts.map +1 -0
- package/build/tools/timelineTools.js +48 -0
- package/build/tools/timelineTools.js.map +1 -0
- package/package.json +1 -1
- package/tools.json +13 -2
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "@jest/globals";
|
|
2
|
+
import WebSocket from "ws";
|
|
3
|
+
import { collectTimeline, timelineDevices } from "../../core/timelineSources.js";
|
|
4
|
+
import { recordAction, resetActionLog } from "../../core/actionLog.js";
|
|
5
|
+
import { logBuffers, networkBuffers, connectedApps, getLogBuffer, getNetworkBuffer, bumpEpoch, resetEpochs } from "../../core/state.js";
|
|
6
|
+
import { recordChromiumNavigation, resetChromiumNavigations } from "../../core/chromiumNavigation.js";
|
|
7
|
+
const NOW = Date.now();
|
|
8
|
+
const window = { start: NOW - 10_000, end: NOW + 1000, label: "-10s", fallback: false };
|
|
9
|
+
const ALL = ["actions", "routes", "network", "logs", "restarts", "refresh"];
|
|
10
|
+
const noDeps = {
|
|
11
|
+
readRoutes: async () => { throw new Error("should not be called"); },
|
|
12
|
+
readRefresh: async () => { throw new Error("should not be called"); },
|
|
13
|
+
probeDeviceNow: async () => { throw new Error("should not be called"); },
|
|
14
|
+
};
|
|
15
|
+
function connect(deviceName, platform, extra = {}) {
|
|
16
|
+
connectedApps.set(`8081-${deviceName}`, {
|
|
17
|
+
ws: { readyState: WebSocket.OPEN },
|
|
18
|
+
deviceInfo: { id: deviceName, title: deviceName, description: "", appId: "", type: "node", webSocketDebuggerUrl: "ws://x", deviceName },
|
|
19
|
+
port: 8081, platform, ...extra,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
resetActionLog();
|
|
24
|
+
resetEpochs();
|
|
25
|
+
resetChromiumNavigations();
|
|
26
|
+
logBuffers.clear();
|
|
27
|
+
networkBuffers.clear();
|
|
28
|
+
connectedApps.clear();
|
|
29
|
+
});
|
|
30
|
+
afterEach(() => connectedApps.clear());
|
|
31
|
+
describe("collectTimeline from buffers", () => {
|
|
32
|
+
it("merges actions, logs, requests and restarts in the window, and never reads the app when disconnected", async () => {
|
|
33
|
+
recordAction({ tool: "tap", args: { testID: "add" }, startedAt: NOW - 5000, endedAt: NOW - 4000, ok: true });
|
|
34
|
+
recordAction({ tool: "tap", args: { testID: "old" }, startedAt: NOW - 60_000, endedAt: NOW - 59_000, ok: true });
|
|
35
|
+
getLogBuffer("iPhone").add({ level: "error", message: "boom", timestamp: new Date(NOW - 3000) });
|
|
36
|
+
getNetworkBuffer("iPhone").set("7", { requestId: "7", timestamp: new Date(NOW - 4500), method: "GET", url: "https://a.com/x", headers: {}, completed: true, status: 200, epoch: 1 });
|
|
37
|
+
bumpEpoch("iPhone");
|
|
38
|
+
const r = await collectTimeline({ sources: [...ALL], window }, noDeps);
|
|
39
|
+
expect(r.devices).toEqual(["iPhone"]);
|
|
40
|
+
expect(r.events.map((e) => e.kind).sort()).toEqual(["action", "log", "request", "restart"]);
|
|
41
|
+
expect(r.events.find((e) => e.kind === "action")?.text).toContain("testID=add");
|
|
42
|
+
expect(r.notes.join("\n")).toMatch(/routes.*not connected/);
|
|
43
|
+
});
|
|
44
|
+
it("treats the reserved perf source as quiet: no events, no note, not unavailable", async () => {
|
|
45
|
+
getLogBuffer("iPhone");
|
|
46
|
+
const r = await collectTimeline({ sources: ["perf"], window }, noDeps);
|
|
47
|
+
expect(r.events).toEqual([]);
|
|
48
|
+
expect(r.notes).toEqual([]);
|
|
49
|
+
expect(r.unavailable).toEqual([]);
|
|
50
|
+
});
|
|
51
|
+
it("always includes restarts, even when only logs were asked for", async () => {
|
|
52
|
+
getLogBuffer("iPhone").add({ level: "log", message: "x", timestamp: new Date(NOW - 1000) });
|
|
53
|
+
bumpEpoch("iPhone");
|
|
54
|
+
const r = await collectTimeline({ sources: ["logs"], window }, noDeps);
|
|
55
|
+
expect(r.events.map((e) => e.kind).sort()).toEqual(["log", "restart"]);
|
|
56
|
+
});
|
|
57
|
+
it("tags an action with no device when several devices are merged", async () => {
|
|
58
|
+
getLogBuffer("iPhone");
|
|
59
|
+
getLogBuffer("Pixel");
|
|
60
|
+
recordAction({ tool: "tap", args: { testID: "a" }, startedAt: NOW - 1000, endedAt: NOW, ok: true });
|
|
61
|
+
recordAction({ tool: "tap", args: { testID: "b", device: "pixel" }, startedAt: NOW - 900, endedAt: NOW, ok: true });
|
|
62
|
+
const r = await collectTimeline({ sources: ["actions"], window }, noDeps);
|
|
63
|
+
expect(r.events.map((e) => e.device)).toEqual(["default", "Pixel"]);
|
|
64
|
+
});
|
|
65
|
+
it("filters to one device by substring", async () => {
|
|
66
|
+
getLogBuffer("iPhone 17 Pro").add({ level: "log", message: "ios", timestamp: new Date(NOW - 1000) });
|
|
67
|
+
getLogBuffer("Pixel 9").add({ level: "log", message: "android", timestamp: new Date(NOW - 1000) });
|
|
68
|
+
recordAction({ tool: "tap", args: { testID: "p", device: "pixel" }, startedAt: NOW - 1000, endedAt: NOW, ok: true });
|
|
69
|
+
const r = await collectTimeline({ device: "iphone", sources: ["logs", "actions"], window }, noDeps);
|
|
70
|
+
expect(r.devices).toEqual(["iPhone 17 Pro"]);
|
|
71
|
+
expect(r.events.map((e) => e.text).join("\n")).toContain("ios");
|
|
72
|
+
expect(r.events.map((e) => e.text).join("\n")).not.toContain("android");
|
|
73
|
+
expect(r.events.some((e) => e.kind === "action")).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it("shows hosts only when the window holds more than one", async () => {
|
|
76
|
+
const nb = getNetworkBuffer("iPhone");
|
|
77
|
+
nb.set("1", { requestId: "1", timestamp: new Date(NOW - 2000), method: "GET", url: "https://a.com/x", headers: {}, completed: true, status: 200, epoch: 1 });
|
|
78
|
+
nb.set("2", { requestId: "2", timestamp: new Date(NOW - 1000), method: "GET", url: "https://b.com/y", headers: {}, completed: true, status: 200, epoch: 1 });
|
|
79
|
+
const r = await collectTimeline({ sources: ["network"], window }, noDeps);
|
|
80
|
+
expect(r.events.map((e) => e.text).join("\n")).toContain("a.com/x");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("collectTimeline in-app sources", () => {
|
|
84
|
+
it("reads routes and refresh from a connected RN app, shifted by the clock offset", async () => {
|
|
85
|
+
connect("Pixel 9", "android");
|
|
86
|
+
getLogBuffer("Pixel 9");
|
|
87
|
+
const deps = {
|
|
88
|
+
probeDeviceNow: async () => Date.now() + 2000,
|
|
89
|
+
readRoutes: async () => [{ route: "Cart", from: "Home", enteredAt: NOW - 1000 + 2000 }],
|
|
90
|
+
readRefresh: async () => [{ at: NOW - 500 + 2000, modulePath: "/src/Cart.tsx" }],
|
|
91
|
+
};
|
|
92
|
+
const r = await collectTimeline({ sources: ["routes", "refresh"], window }, deps);
|
|
93
|
+
const route = r.events.find((e) => e.kind === "route");
|
|
94
|
+
expect(Math.abs(route.at - (NOW - 1000))).toBeLessThan(200);
|
|
95
|
+
expect(r.events.find((e) => e.kind === "refresh")?.text).toBe("↻ edit applied: Cart.tsx");
|
|
96
|
+
expect(r.notes.join("\n")).toMatch(/clock/i);
|
|
97
|
+
expect(r.notes.join("\n")).toMatch(/Network and log rows .* not corrected/);
|
|
98
|
+
});
|
|
99
|
+
it("skips the clock probe on the iOS simulator", async () => {
|
|
100
|
+
connect("iPhone", "ios", { simulatorUdid: "ABC" });
|
|
101
|
+
const deps = { ...noDeps, readRoutes: async () => [], readRefresh: async () => [] };
|
|
102
|
+
const r = await collectTimeline({ sources: ["routes", "refresh"], window }, deps);
|
|
103
|
+
expect(r.unavailable).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
it("names a failed in-app source and keeps the rest", async () => {
|
|
106
|
+
connect("iPhone", "ios", { simulatorUdid: "ABC" });
|
|
107
|
+
getLogBuffer("iPhone").add({ level: "log", message: "kept", timestamp: new Date(NOW - 1000) });
|
|
108
|
+
const deps = { ...noDeps, readRoutes: async () => { throw new Error("eval timed out"); }, readRefresh: async () => [] };
|
|
109
|
+
const r = await collectTimeline({ sources: ["routes", "logs", "refresh"], window }, deps);
|
|
110
|
+
expect(r.unavailable).toEqual(["routes"]);
|
|
111
|
+
expect(r.notes.join("\n")).toContain("routes: unavailable (eval timed out)");
|
|
112
|
+
expect(r.events.some((e) => e.text.includes("kept"))).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
it("reads chromium routes from the navigation trail without evaluating in the page", async () => {
|
|
115
|
+
connect("FluentTalk", "chromium");
|
|
116
|
+
recordChromiumNavigation("FluentTalk", "http://x/home", 1, NOW - 3000);
|
|
117
|
+
recordChromiumNavigation("FluentTalk", "http://x/settings", 1, NOW - 2000);
|
|
118
|
+
const r = await collectTimeline({ sources: ["routes", "refresh"], window }, noDeps);
|
|
119
|
+
expect(r.events.map((e) => e.text)).toEqual(["➜ route /home", "➜ route /settings (from /home)"]);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe("timelineDevices", () => {
|
|
123
|
+
it("lists buffered and connected devices, or the one matching", () => {
|
|
124
|
+
getLogBuffer("iPhone");
|
|
125
|
+
connect("Pixel", "android");
|
|
126
|
+
expect(timelineDevices().sort()).toEqual(["Pixel", "iPhone"]);
|
|
127
|
+
expect(timelineDevices("pix")).toEqual(["Pixel"]);
|
|
128
|
+
});
|
|
129
|
+
it("prefers an exact name over a longer one that contains it", () => {
|
|
130
|
+
getLogBuffer("iPhone 17 Pro Max");
|
|
131
|
+
getLogBuffer("iPhone 17 Pro");
|
|
132
|
+
expect(timelineDevices("iPhone 17 Pro")).toEqual(["iPhone 17 Pro"]);
|
|
133
|
+
});
|
|
134
|
+
it("refuses a device it cannot find instead of answering with an empty window", () => {
|
|
135
|
+
getLogBuffer("iPhone");
|
|
136
|
+
expect(() => timelineDevices("emulator-5554")).toThrow(/emulator-5554/);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=timelineSources.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineSources.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineSources.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineTool.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineTool.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
process.env.EXECBRO_TEST_MODE = "1";
|
|
2
|
+
import { describe, it, expect, beforeEach } from "@jest/globals";
|
|
3
|
+
const { toolRegistry } = await import("../../core/register.js");
|
|
4
|
+
const { registerTimelineTools } = await import("../../tools/timelineTools.js");
|
|
5
|
+
registerTimelineTools({ registerTool: () => undefined });
|
|
6
|
+
const { recordAction, resetActionLog } = await import("../../core/actionLog.js");
|
|
7
|
+
const { logBuffers, networkBuffers, connectedApps, getLogBuffer, resetEpochs } = await import("../../core/state.js");
|
|
8
|
+
const { CHROMIUM_TOOLS } = await import("../../core/chromiumCapabilities.js");
|
|
9
|
+
const call = (args) => toolRegistry.get("get_timeline").handler(args);
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
resetActionLog();
|
|
12
|
+
resetEpochs();
|
|
13
|
+
logBuffers.clear();
|
|
14
|
+
networkBuffers.clear();
|
|
15
|
+
connectedApps.clear();
|
|
16
|
+
});
|
|
17
|
+
describe("get_timeline", () => {
|
|
18
|
+
it("is registered and allowed on chromium", () => {
|
|
19
|
+
expect(toolRegistry.has("get_timeline")).toBe(true);
|
|
20
|
+
expect(CHROMIUM_TOOLS.has("get_timeline")).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it("starts at the last action by default", async () => {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
recordAction({ tool: "tap", args: { testID: "add-to-cart" }, startedAt: now - 2000, endedAt: now - 1500, ok: true, meaningful: true });
|
|
25
|
+
getLogBuffer("iPhone").add({ level: "log", message: "before", timestamp: new Date(now - 5000) });
|
|
26
|
+
getLogBuffer("iPhone").add({ level: "log", message: "cart updated", timestamp: new Date(now - 1000) });
|
|
27
|
+
const r = await call({ sources: ["actions", "logs"] });
|
|
28
|
+
const text = r.content[0].text;
|
|
29
|
+
expect(text).toMatch(/^Timeline \(iPhone\) since ▶ tap testID=add-to-cart/);
|
|
30
|
+
expect(text).toContain("cart updated");
|
|
31
|
+
expect(text).not.toContain("before");
|
|
32
|
+
expect(r._emptyResult).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
it("says so when it falls back to the last 60s", async () => {
|
|
35
|
+
const r = await call({ sources: ["logs"] });
|
|
36
|
+
expect(r.content[0].text).toContain("No action recorded yet");
|
|
37
|
+
expect(r._emptyResult).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
it("applies the default limit even when zod defaults are skipped", async () => {
|
|
40
|
+
const now = Date.now();
|
|
41
|
+
for (let i = 0; i < 150; i++)
|
|
42
|
+
getLogBuffer("iPhone").add({ level: "log", message: `m${i}`, timestamp: new Date(now - 10_000 + i) });
|
|
43
|
+
const r = await call({ since: "-30s", sources: ["logs"] });
|
|
44
|
+
expect(r.content[0].text).toContain("Over the limit, omitted: logs 50.");
|
|
45
|
+
});
|
|
46
|
+
it("rejects a bad window with the accepted formats", async () => {
|
|
47
|
+
await expect(call({ since: "yesterday" })).rejects.toThrow(/-30s/);
|
|
48
|
+
});
|
|
49
|
+
it("errors only when every requested source failed", async () => {
|
|
50
|
+
const r = await call({ since: "-30s", sources: ["refresh"] });
|
|
51
|
+
expect(r.isError).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it("answers a perf-only read with a plain empty window", async () => {
|
|
54
|
+
getLogBuffer("iPhone");
|
|
55
|
+
const r = await call({ since: "-30s", sources: ["perf"] });
|
|
56
|
+
expect(r.isError).toBeUndefined();
|
|
57
|
+
expect(r.content[0].text).toBe("Nothing happened in the 30.0s since -30s on iPhone.");
|
|
58
|
+
});
|
|
59
|
+
it("never names perf in the checked list", async () => {
|
|
60
|
+
getLogBuffer("iPhone");
|
|
61
|
+
const r = await call({ since: "-30s", sources: ["logs", "perf"] });
|
|
62
|
+
expect(r.content[0].text).toContain("(checked: logs)");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=timelineTool.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineTool.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineTool.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
process.env.RN_AI_DEVTOOLS_TEST_MODE = "1";
|
|
2
|
-
import { describe, it, expect, beforeEach } from "@jest/globals";
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { jest, describe, it, expect, beforeEach } from "@jest/globals";
|
|
3
|
+
jest.unstable_mockModule("../../core/license.js", () => ({
|
|
4
|
+
ensureLicense: jest.fn(async () => ({ tier: "free" })),
|
|
5
|
+
getUsageInfo: jest.fn(() => null),
|
|
6
|
+
getPricingInfo: jest.fn(() => null),
|
|
7
|
+
getDashboardUrl: jest.fn(() => ""),
|
|
8
|
+
GRACE_WINDOW_MS: 0,
|
|
9
|
+
computeOfflineUsage: jest.fn(),
|
|
10
|
+
formatPlanPrice: jest.fn(),
|
|
11
|
+
getLicenseStatus: jest.fn(),
|
|
12
|
+
incrementLocalUsage: jest.fn(),
|
|
13
|
+
refreshLicense: jest.fn(),
|
|
14
|
+
requestLinkToken: jest.fn(),
|
|
15
|
+
resetLicense: jest.fn(),
|
|
16
|
+
}));
|
|
17
|
+
const { toolRegistry } = await import("../../index.js");
|
|
18
|
+
const { vaultAdd, resetVaultForTests } = await import("../../core/vault.js");
|
|
5
19
|
describe("Phase 2 tool surface", () => {
|
|
6
20
|
beforeEach(resetVaultForTests);
|
|
7
21
|
it("registers all three tools", () => {
|
|
@@ -36,13 +50,13 @@ describe("Phase 2 tool surface", () => {
|
|
|
36
50
|
describe("list_secrets marks which credential an origin sends", () => {
|
|
37
51
|
beforeEach(resetVaultForTests);
|
|
38
52
|
it("flags the slot holder when one origin has two credentials", async () => {
|
|
39
|
-
vaultAdd("bearer-token-aaaaaaaaaaaaa", "auth", "https://
|
|
40
|
-
vaultAdd("redux-secret-bbbbbbbbbbbbb", "auth", "https://
|
|
53
|
+
vaultAdd("bearer-token-aaaaaaaaaaaaa", "auth", "https://appa.test/a");
|
|
54
|
+
vaultAdd("redux-secret-bbbbbbbbbbbbb", "auth", "https://appa.test/b");
|
|
41
55
|
const out = await toolRegistry.get("list_secrets").handler({});
|
|
42
56
|
const text = out.content[0].text;
|
|
43
57
|
const marked = text.split("\n").filter((l) => l.includes("<- sent for"));
|
|
44
58
|
expect(marked).toHaveLength(1);
|
|
45
|
-
expect(marked[0]).toContain("
|
|
59
|
+
expect(marked[0]).toContain("auth_appa.test#2");
|
|
46
60
|
expect(text).toContain("or a handle to pin one exact value");
|
|
47
61
|
});
|
|
48
62
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vaultTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/vaultTools.test.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"vaultTools.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/vaultTools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ActionEntry {
|
|
2
|
+
tool: string;
|
|
3
|
+
device: string | null;
|
|
4
|
+
startedAt: number;
|
|
5
|
+
endedAt: number;
|
|
6
|
+
ok: boolean;
|
|
7
|
+
summary: string;
|
|
8
|
+
outcome?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ActionInput {
|
|
11
|
+
tool: string;
|
|
12
|
+
args: unknown;
|
|
13
|
+
startedAt: number;
|
|
14
|
+
endedAt: number;
|
|
15
|
+
ok: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
meaningful?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare const ACTION_TOOLS: ReadonlySet<string>;
|
|
20
|
+
export declare function summarizeArgs(tool: string, args: unknown): string;
|
|
21
|
+
export declare function recordAction(input: ActionInput): void;
|
|
22
|
+
export declare function getActions(): ActionEntry[];
|
|
23
|
+
export declare function deviceMatches(entryDevice: string | null, key: string): boolean;
|
|
24
|
+
export declare function lastAction(device?: string): ActionEntry | null;
|
|
25
|
+
export declare function actionLabel(a: ActionEntry): string;
|
|
26
|
+
export declare function resetActionLog(): void;
|
|
27
|
+
//# sourceMappingURL=actionLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionLog.d.ts","sourceRoot":"","sources":["../../src/core/actionLog.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAK3C,CAAC;AA6BH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CA+DjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAsBrD;AAED,wBAAgB,UAAU,IAAI,WAAW,EAAE,CAE1C;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAI9E;AAOD,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQ9D;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { redactSecrets, redactionEnabled } from "./redact.js";
|
|
2
|
+
export const ACTION_TOOLS = new Set([
|
|
3
|
+
"tap", "swipe", "pinch", "input_text", "press_key", "navigate", "dismiss_keyboard",
|
|
4
|
+
"handle_dialog", "ios_button", "android_key_event", "android_long_press", "ios_open_url",
|
|
5
|
+
"reload_app", "ios_launch_app", "android_launch_app", "electron_launch_app", "ios_terminate_app",
|
|
6
|
+
"network_mock", "network_condition", "redux_dispatch", "execute_in_app", "app_request", "network_replay",
|
|
7
|
+
]);
|
|
8
|
+
const CAP = 200;
|
|
9
|
+
let entries = [];
|
|
10
|
+
function str(v) {
|
|
11
|
+
return typeof v === "string" && v.length > 0 ? v : undefined;
|
|
12
|
+
}
|
|
13
|
+
function num(v) {
|
|
14
|
+
return typeof v === "number" && Number.isFinite(v) ? v : undefined;
|
|
15
|
+
}
|
|
16
|
+
function cut(s, max) {
|
|
17
|
+
const one = (redactionEnabled() ? redactSecrets(s) : s).replace(/\s+/g, " ").trim();
|
|
18
|
+
return one.length > max ? `${one.slice(0, max)}…` : one;
|
|
19
|
+
}
|
|
20
|
+
function pathOf(url) {
|
|
21
|
+
try {
|
|
22
|
+
const u = new URL(url);
|
|
23
|
+
return u.pathname + u.search;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return url;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function summarizeArgs(tool, args) {
|
|
30
|
+
const a = (args && typeof args === "object" ? args : {});
|
|
31
|
+
switch (tool) {
|
|
32
|
+
case "tap": {
|
|
33
|
+
const x = num(a.x), y = num(a.y);
|
|
34
|
+
const target = str(a.testID) ? `testID=${a.testID}`
|
|
35
|
+
: str(a.text) ? `text=${JSON.stringify(cut(a.text, 40))}`
|
|
36
|
+
: str(a.component) ? `component=${a.component}`
|
|
37
|
+
: x !== undefined && y !== undefined ? `(${x},${y})` : "";
|
|
38
|
+
const hold = num(a.duration) ? ` hold ${a.duration}ms` : "";
|
|
39
|
+
return `${target}${hold}`;
|
|
40
|
+
}
|
|
41
|
+
case "swipe":
|
|
42
|
+
return str(a.direction) ?? `(${a.startX},${a.startY})→(${a.endX},${a.endY})`;
|
|
43
|
+
case "pinch":
|
|
44
|
+
return [str(a.direction), num(a.scale) !== undefined ? `scale ${a.scale}` : undefined].filter(Boolean).join(" ");
|
|
45
|
+
case "input_text": {
|
|
46
|
+
const target = str(a.testID) ? `testID=${a.testID}`
|
|
47
|
+
: str(a.component) ? `component=${a.component}`
|
|
48
|
+
: str(a.textMatch) ? `field ${JSON.stringify(cut(a.textMatch, 40))}`
|
|
49
|
+
: "focused field";
|
|
50
|
+
const n = typeof a.text === "string" ? a.text.length : 0;
|
|
51
|
+
return `${target} ${n} chars${a.replace === true ? " replace" : ""}`;
|
|
52
|
+
}
|
|
53
|
+
case "press_key":
|
|
54
|
+
return `${str(a.key) ?? ""}${num(a.repeat) && a.repeat > 1 ? ` ×${a.repeat}` : ""}`;
|
|
55
|
+
case "navigate":
|
|
56
|
+
return str(a.to) ?? str(a.screen) ?? "";
|
|
57
|
+
case "execute_in_app":
|
|
58
|
+
return cut(str(a.expression) ?? str(a.code) ?? str(a.script) ?? str(a.collect) ?? "", 60);
|
|
59
|
+
case "network_mock":
|
|
60
|
+
return [str(a.action), str(a.url) ?? str(a.id)].filter(Boolean).join(" ");
|
|
61
|
+
case "network_condition":
|
|
62
|
+
return str(a.mode) ?? "";
|
|
63
|
+
case "redux_dispatch": {
|
|
64
|
+
const list = Array.isArray(a.action) ? a.action : [a.action];
|
|
65
|
+
return list.map((x) => (x && typeof x === "object" ? str(x.type) : undefined))
|
|
66
|
+
.filter(Boolean).join(", ");
|
|
67
|
+
}
|
|
68
|
+
case "app_request":
|
|
69
|
+
return `${str(a.method) ?? "GET"} ${str(a.url) ? pathOf(a.url) : ""}`.trim();
|
|
70
|
+
case "network_replay":
|
|
71
|
+
return str(a.requestId) ? `request ${a.requestId}` : "";
|
|
72
|
+
case "ios_open_url":
|
|
73
|
+
return str(a.url) ? cut(a.url, 60) : "";
|
|
74
|
+
case "ios_button":
|
|
75
|
+
return str(a.button) ?? "";
|
|
76
|
+
case "android_key_event":
|
|
77
|
+
return str(a.key) ?? "";
|
|
78
|
+
case "android_long_press":
|
|
79
|
+
return `(${a.x},${a.y})`;
|
|
80
|
+
case "handle_dialog":
|
|
81
|
+
return str(a.action) ?? "";
|
|
82
|
+
case "ios_launch_app":
|
|
83
|
+
case "ios_terminate_app":
|
|
84
|
+
return str(a.bundleId) ?? "";
|
|
85
|
+
case "android_launch_app":
|
|
86
|
+
return str(a.packageName) ?? "";
|
|
87
|
+
case "electron_launch_app":
|
|
88
|
+
return str(a.projectPath)?.split("/").filter(Boolean).pop() ?? "";
|
|
89
|
+
default:
|
|
90
|
+
return "";
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function recordAction(input) {
|
|
94
|
+
try {
|
|
95
|
+
if (!ACTION_TOOLS.has(input.tool))
|
|
96
|
+
return;
|
|
97
|
+
const args = (input.args && typeof input.args === "object" ? input.args : {});
|
|
98
|
+
const outcome = !input.ok
|
|
99
|
+
? cut(input.error ?? "error", 80).replace(/…$/, "")
|
|
100
|
+
: input.meaningful === true ? "screen changed"
|
|
101
|
+
: input.meaningful === false ? "no visible change"
|
|
102
|
+
: undefined;
|
|
103
|
+
entries.push({
|
|
104
|
+
tool: input.tool,
|
|
105
|
+
device: str(args.device) ?? null,
|
|
106
|
+
startedAt: input.startedAt,
|
|
107
|
+
endedAt: input.endedAt,
|
|
108
|
+
ok: input.ok,
|
|
109
|
+
summary: summarizeArgs(input.tool, args),
|
|
110
|
+
outcome,
|
|
111
|
+
});
|
|
112
|
+
if (entries.length > CAP)
|
|
113
|
+
entries.shift();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function getActions() {
|
|
119
|
+
return [...entries];
|
|
120
|
+
}
|
|
121
|
+
export function deviceMatches(entryDevice, key) {
|
|
122
|
+
if (!entryDevice)
|
|
123
|
+
return true;
|
|
124
|
+
const a = entryDevice.toLowerCase(), b = key.toLowerCase();
|
|
125
|
+
return a.includes(b) || b.includes(a);
|
|
126
|
+
}
|
|
127
|
+
export function lastAction(device) {
|
|
128
|
+
let fallback = null;
|
|
129
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
130
|
+
if (device && !deviceMatches(entries[i].device, device))
|
|
131
|
+
continue;
|
|
132
|
+
if (entries[i].tool !== "execute_in_app")
|
|
133
|
+
return entries[i];
|
|
134
|
+
fallback ??= entries[i];
|
|
135
|
+
}
|
|
136
|
+
return fallback;
|
|
137
|
+
}
|
|
138
|
+
export function actionLabel(a) {
|
|
139
|
+
return a.summary ? `${a.tool} ${a.summary}` : a.tool;
|
|
140
|
+
}
|
|
141
|
+
export function resetActionLog() {
|
|
142
|
+
entries = [];
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=actionLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionLog.js","sourceRoot":"","sources":["../../src/core/actionLog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ScreenState } from "./screenState.js";
|
|
2
|
+
import { type TimelineEvent } from "./timeline.js";
|
|
3
|
+
export interface SnapshotItem {
|
|
4
|
+
text: string;
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
}
|
|
8
|
+
export interface OutcomeSnapshot {
|
|
9
|
+
route: string | null;
|
|
10
|
+
items: SnapshotItem[];
|
|
11
|
+
}
|
|
12
|
+
export interface ActionOutcome {
|
|
13
|
+
route?: string;
|
|
14
|
+
text?: string[];
|
|
15
|
+
network?: string[];
|
|
16
|
+
console?: string[];
|
|
17
|
+
restart?: string;
|
|
18
|
+
scroll?: string;
|
|
19
|
+
pending?: string;
|
|
20
|
+
unavailable?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare const TEXT_DIFF_CAP = 10;
|
|
23
|
+
export declare function snapshotFromScreenState(ss: ScreenState): OutcomeSnapshot;
|
|
24
|
+
export declare const ORDER_STEP = 5;
|
|
25
|
+
export declare function snapshotFromLines(route: string | null, lines: string[]): OutcomeSnapshot;
|
|
26
|
+
export declare function diffSnapshots(before: OutcomeSnapshot, after: OutcomeSnapshot, cap?: number): string[];
|
|
27
|
+
export declare function buildOutcome(input: {
|
|
28
|
+
before: OutcomeSnapshot | null;
|
|
29
|
+
after: OutcomeSnapshot | null;
|
|
30
|
+
events: TimelineEvent[];
|
|
31
|
+
pending: number;
|
|
32
|
+
capped: boolean;
|
|
33
|
+
unavailable: string[];
|
|
34
|
+
}): ActionOutcome;
|
|
35
|
+
//# sourceMappingURL=actionOutcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionOutcome.d.ts","sourceRoot":"","sources":["../../src/core/actionOutcome.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa,KAAK,CAAC;AAsBhC,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,WAAW,GAAG,eAAe,CAWxE;AAGD,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,CAExF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,EAAE,CAoFpH;AAkBD,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB,GAAG,aAAa,CA+BhB"}
|