execbro 2.18.1 → 2.19.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/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/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/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 +17 -3
- 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/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/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 +2 -0
- 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/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/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/timeline.d.ts +59 -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/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/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 +9 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "@jest/globals";
|
|
2
|
+
import { bumpEpoch, epochStarts, resetEpochs } from "../../core/state.js";
|
|
3
|
+
describe("epochStarts", () => {
|
|
4
|
+
beforeEach(() => resetEpochs());
|
|
5
|
+
it("records when each new app run began, per device", () => {
|
|
6
|
+
const before = Date.now();
|
|
7
|
+
bumpEpoch("iPhone 17 Pro");
|
|
8
|
+
bumpEpoch("iPhone 17 Pro");
|
|
9
|
+
bumpEpoch("Pixel 9");
|
|
10
|
+
const after = Date.now();
|
|
11
|
+
const iphone = epochStarts("iPhone 17 Pro");
|
|
12
|
+
expect(iphone.map((e) => e.epoch)).toEqual([2, 3]);
|
|
13
|
+
for (const e of iphone) {
|
|
14
|
+
expect(e.at).toBeGreaterThanOrEqual(before);
|
|
15
|
+
expect(e.at).toBeLessThanOrEqual(after);
|
|
16
|
+
}
|
|
17
|
+
expect(epochStarts("Pixel 9").map((e) => e.epoch)).toEqual([2]);
|
|
18
|
+
});
|
|
19
|
+
it("is empty for a device that never restarted", () => {
|
|
20
|
+
expect(epochStarts("never")).toEqual([]);
|
|
21
|
+
});
|
|
22
|
+
it("keeps the last 50 starts", () => {
|
|
23
|
+
for (let i = 0; i < 60; i++)
|
|
24
|
+
bumpEpoch("d");
|
|
25
|
+
const starts = epochStarts("d");
|
|
26
|
+
expect(starts).toHaveLength(50);
|
|
27
|
+
expect(starts[starts.length - 1].epoch).toBe(61);
|
|
28
|
+
});
|
|
29
|
+
it("is cleared by resetEpochs", () => {
|
|
30
|
+
bumpEpoch("d");
|
|
31
|
+
resetEpochs();
|
|
32
|
+
expect(epochStarts("d")).toEqual([]);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=epochStarts.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epochStarts.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/epochStarts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE1E,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3B,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3B,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACjC,SAAS,CAAC,GAAG,CAAC,CAAC;QACf,WAAW,EAAE,CAAC;QACd,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timeline.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { resolveWindow, actionEvent, logEvent, requestEvent, routeEvent, restartEvent, refreshEvent, sortEvents, trimEvents, formatRelative, formatTimeline, FALLBACK_WINDOW_MS, } from "../../core/timeline.js";
|
|
3
|
+
const NOW = 1_800_000_000_000;
|
|
4
|
+
const tapAction = { tool: "tap", device: null, startedAt: NOW - 3400, endedAt: NOW - 2400, ok: true, summary: "testID=add-to-cart", outcome: "screen changed" };
|
|
5
|
+
function log(level, message, at, seq = 1) {
|
|
6
|
+
return { level, message, timestamp: new Date(at), seq, epoch: 1 };
|
|
7
|
+
}
|
|
8
|
+
function req(over) {
|
|
9
|
+
return { requestId: "42", timestamp: new Date(NOW - 3000), method: "GET", url: "https://api.shop.com/cart", headers: {}, completed: true, epoch: 1, ...over };
|
|
10
|
+
}
|
|
11
|
+
describe("resolveWindow", () => {
|
|
12
|
+
it("rejects an until earlier than the last action instead of an empty window", () => {
|
|
13
|
+
expect(() => resolveWindow({ until: NOW - 5000, now: NOW, lastAction: tapAction })).toThrow(/before the last action/);
|
|
14
|
+
});
|
|
15
|
+
it("defaults to the last action", () => {
|
|
16
|
+
const w = resolveWindow({ now: NOW, lastAction: tapAction });
|
|
17
|
+
expect(w).toEqual({ start: NOW - 3400, end: NOW, label: "▶ tap testID=add-to-cart", fallback: false });
|
|
18
|
+
});
|
|
19
|
+
it("falls back to the last 60s when nothing was done yet", () => {
|
|
20
|
+
const w = resolveWindow({ now: NOW, lastAction: null });
|
|
21
|
+
expect(w.start).toBe(NOW - FALLBACK_WINDOW_MS);
|
|
22
|
+
expect(w.fallback).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it("accepts relative strings", () => {
|
|
25
|
+
expect(resolveWindow({ since: "-30s", now: NOW, lastAction: null }).start).toBe(NOW - 30_000);
|
|
26
|
+
expect(resolveWindow({ since: "-5m", now: NOW, lastAction: null }).start).toBe(NOW - 300_000);
|
|
27
|
+
expect(resolveWindow({ since: "-1h", now: NOW, lastAction: null }).start).toBe(NOW - 3_600_000);
|
|
28
|
+
expect(resolveWindow({ since: "-250ms", now: NOW, lastAction: null }).start).toBe(NOW - 250);
|
|
29
|
+
});
|
|
30
|
+
it("accepts epoch ms as a number or a numeric string", () => {
|
|
31
|
+
expect(resolveWindow({ since: NOW - 10, now: NOW, lastAction: null }).start).toBe(NOW - 10);
|
|
32
|
+
expect(resolveWindow({ since: String(NOW - 10), now: NOW, lastAction: null }).start).toBe(NOW - 10);
|
|
33
|
+
});
|
|
34
|
+
it("rejects nonsense with a message naming the formats", () => {
|
|
35
|
+
expect(() => resolveWindow({ since: "yesterday", now: NOW, lastAction: null })).toThrow(/-30s/);
|
|
36
|
+
expect(() => resolveWindow({ until: "last_action", now: NOW, lastAction: tapAction })).toThrow(/until/);
|
|
37
|
+
expect(() => resolveWindow({ since: "-1s", until: "-5s", now: NOW, lastAction: null })).toThrow(/after/);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe("event builders", () => {
|
|
41
|
+
it("renders an action with its outcome, and a failure", () => {
|
|
42
|
+
expect(actionEvent(tapAction, "d").text).toBe("▶ tap testID=add-to-cart → ok, screen changed");
|
|
43
|
+
expect(actionEvent({ ...tapAction, ok: false, outcome: "no element" }, "d").text).toBe("▶ tap testID=add-to-cart → failed: no element");
|
|
44
|
+
});
|
|
45
|
+
it("marks log levels and keeps the j id", () => {
|
|
46
|
+
const e = logEvent(log("error", "Failed to load", NOW, 813), "d");
|
|
47
|
+
expect(e.text).toBe('✖ error "Failed to load" [j813]');
|
|
48
|
+
expect(e.tier).toBe(4);
|
|
49
|
+
expect(logEvent(log("warn", "slow", NOW), "d").tier).toBe(6);
|
|
50
|
+
expect(logEvent(log("log", "x".repeat(300), NOW), "d").text.length).toBeLessThan(150);
|
|
51
|
+
});
|
|
52
|
+
it("renders request outcomes: status, failure, pending, mock", () => {
|
|
53
|
+
expect(requestEvent(req({ status: 201, method: "POST", timing: { duration: 180 } }), "d", false).text)
|
|
54
|
+
.toBe("⇄ POST /cart 201 · 180ms [n42]");
|
|
55
|
+
const failed = requestEvent(req({ status: 500 }), "d", false);
|
|
56
|
+
expect(failed.tier).toBe(5);
|
|
57
|
+
expect(requestEvent(req({ completed: false, status: undefined }), "d", false).text).toContain(" pending ");
|
|
58
|
+
expect(requestEvent(req({ error: "Network request failed", completed: true }), "d", false).text).toContain("failed: Network request failed");
|
|
59
|
+
expect(requestEvent(req({ status: 200, mocked: true }), "d", false).text).toContain("[MOCK] GET");
|
|
60
|
+
expect(requestEvent(req({ status: 200 }), "d", true).text).toContain("api.shop.com/cart");
|
|
61
|
+
});
|
|
62
|
+
it("renders routes, restarts and refreshes", () => {
|
|
63
|
+
expect(routeEvent({ route: "Cart", from: "ProductDetails", at: NOW }, "d").text).toBe("➜ route Cart (from ProductDetails)");
|
|
64
|
+
expect(routeEvent({ route: "Cart", from: null, at: NOW }, "d").text).toBe("➜ route Cart");
|
|
65
|
+
expect(restartEvent(3, NOW, "d").text).toBe("⟳ app restarted (epoch 3)");
|
|
66
|
+
expect(refreshEvent({ at: NOW, modulePath: "/app/src/Cart.tsx" }, NOW, "d").text).toBe("↻ edit applied: Cart.tsx");
|
|
67
|
+
expect(refreshEvent({ at: NOW }, NOW, "d").text).toBe("↻ edit applied (Fast Refresh)");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe("sortEvents and trimEvents", () => {
|
|
71
|
+
it("orders same-millisecond events restart, action, route, request, log, refresh", () => {
|
|
72
|
+
const at = NOW;
|
|
73
|
+
const events = [
|
|
74
|
+
refreshEvent({ at }, at, "d"),
|
|
75
|
+
logEvent(log("log", "l", at), "d"),
|
|
76
|
+
requestEvent(req({ timestamp: new Date(at), status: 200 }), "d", false),
|
|
77
|
+
routeEvent({ route: "R", from: null, at }, "d"),
|
|
78
|
+
actionEvent({ ...tapAction, startedAt: at }, "d"),
|
|
79
|
+
restartEvent(2, at, "d"),
|
|
80
|
+
];
|
|
81
|
+
expect(sortEvents(events).map((e) => e.kind)).toEqual(["restart", "action", "route", "request", "log", "refresh"]);
|
|
82
|
+
});
|
|
83
|
+
const perf = (at) => ({ at, kind: "perf", source: "perf", device: "d", tier: 2, text: "◷ settled" });
|
|
84
|
+
it("sorts a same-millisecond perf event after the route", () => {
|
|
85
|
+
const events = [requestEvent(req({ timestamp: new Date(NOW), status: 200 }), "d", false), perf(NOW), routeEvent({ route: "R", from: null, at: NOW }, "d")];
|
|
86
|
+
expect(sortEvents(events).map((e) => e.kind)).toEqual(["route", "perf", "request"]);
|
|
87
|
+
});
|
|
88
|
+
it("keeps perf at the route tier, ahead of refresh and errors", () => {
|
|
89
|
+
const events = [logEvent(log("error", "e", NOW - 3000, 1), "d"), refreshEvent({ at: NOW - 2000 }, NOW - 2000, "d"), perf(NOW - 1000)];
|
|
90
|
+
expect(trimEvents(events, 1).kept.map((e) => e.kind)).toEqual(["perf"]);
|
|
91
|
+
});
|
|
92
|
+
it("keeps high tiers first, earliest within a tier, and counts what it dropped", () => {
|
|
93
|
+
const events = [
|
|
94
|
+
actionEvent(tapAction, "d"),
|
|
95
|
+
...Array.from({ length: 5 }, (_, i) => logEvent(log("log", `l${i}`, NOW - 3000 + i, i), "d")),
|
|
96
|
+
logEvent(log("error", "boom", NOW - 1000, 99), "d"),
|
|
97
|
+
requestEvent(req({ status: 200 }), "d", false),
|
|
98
|
+
];
|
|
99
|
+
const { kept, dropped } = trimEvents(events, 4);
|
|
100
|
+
expect(kept.map((e) => e.text)).toEqual([
|
|
101
|
+
"▶ tap testID=add-to-cart → ok, screen changed",
|
|
102
|
+
"⇄ GET /cart 200 [n42]",
|
|
103
|
+
'· log "l0" [j0]',
|
|
104
|
+
'✖ error "boom" [j99]',
|
|
105
|
+
]);
|
|
106
|
+
expect(dropped).toEqual({ logs: 4 });
|
|
107
|
+
});
|
|
108
|
+
it("returns everything sorted when under the limit", () => {
|
|
109
|
+
const { kept, dropped } = trimEvents([logEvent(log("log", "b", NOW), "d"), actionEvent(tapAction, "d")], 10);
|
|
110
|
+
expect(kept[0].kind).toBe("action");
|
|
111
|
+
expect(dropped).toEqual({});
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe("formatRelative", () => {
|
|
115
|
+
it("uses ms, then seconds, then minutes", () => {
|
|
116
|
+
expect(formatRelative(0)).toBe("+0ms");
|
|
117
|
+
expect(formatRelative(905)).toBe("+905ms");
|
|
118
|
+
expect(formatRelative(2100)).toBe("+2.1s");
|
|
119
|
+
expect(formatRelative(125_000)).toBe("+2m05s");
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe("formatTimeline", () => {
|
|
123
|
+
const window = { start: NOW - 3400, end: NOW, label: "▶ tap testID=add-to-cart", fallback: false };
|
|
124
|
+
it("renders header, lines, id hint and notes", () => {
|
|
125
|
+
const events = sortEvents([
|
|
126
|
+
actionEvent(tapAction, "iPhone"),
|
|
127
|
+
requestEvent(req({ timestamp: new Date(NOW - 3280), status: 201, method: "POST", timing: { duration: 180 } }), "iPhone", false),
|
|
128
|
+
logEvent(log("error", "Failed", NOW - 2495, 813), "iPhone"),
|
|
129
|
+
]);
|
|
130
|
+
const text = formatTimeline({ window, deviceLabel: "iPhone", events, tagDevices: false, dropped: {}, notes: ["a note"], checked: ["actions", "network", "logs"] });
|
|
131
|
+
const lines = text.split("\n");
|
|
132
|
+
expect(lines[0]).toBe("Timeline (iPhone) since ▶ tap testID=add-to-cart · 3.4s · 3 events");
|
|
133
|
+
expect(lines[1]).toBe("+0ms ▶ tap testID=add-to-cart → ok, screen changed");
|
|
134
|
+
expect(lines[2]).toBe("+120ms ⇄ POST /cart 201 · 180ms [n42]");
|
|
135
|
+
expect(lines[3]).toBe('+905ms ✖ error "Failed" [j813]');
|
|
136
|
+
expect(text).toContain('get_log_details({ id: "j813" })');
|
|
137
|
+
expect(text).toContain('get_request_details({ requestId: "42" })');
|
|
138
|
+
expect(text).toContain("a note");
|
|
139
|
+
});
|
|
140
|
+
it("tags devices when several are merged", () => {
|
|
141
|
+
const text = formatTimeline({ window, deviceLabel: "all devices", events: [actionEvent(tapAction, "Pixel")], tagDevices: true, dropped: {}, notes: [], checked: ["actions"] });
|
|
142
|
+
expect(text).toContain("[Pixel] ▶ tap");
|
|
143
|
+
});
|
|
144
|
+
it("names what was dropped over the limit", () => {
|
|
145
|
+
const text = formatTimeline({ window, deviceLabel: "iPhone", events: [actionEvent(tapAction, "d")], tagDevices: false, dropped: { logs: 40, network: 12 }, notes: [], checked: ["actions"] });
|
|
146
|
+
expect(text).toContain("Over the limit, omitted: logs 40, network 12.");
|
|
147
|
+
});
|
|
148
|
+
it("says plainly when nothing happened", () => {
|
|
149
|
+
const text = formatTimeline({ window, deviceLabel: "iPhone", events: [], tagDevices: false, dropped: {}, notes: [], checked: ["actions", "logs"] });
|
|
150
|
+
expect(text).toBe("Nothing happened in the 3.4s since ▶ tap testID=add-to-cart on iPhone (checked: actions, logs).\nLog capture is not re-verified by this read; if you expected output, get_logs checks the pipeline.");
|
|
151
|
+
});
|
|
152
|
+
it("drops the checked list when nothing was checked", () => {
|
|
153
|
+
const text = formatTimeline({ window, deviceLabel: "iPhone", events: [], tagDevices: false, dropped: {}, notes: [], checked: [] });
|
|
154
|
+
expect(text).toBe("Nothing happened in the 3.4s since ▶ tap testID=add-to-cart on iPhone.");
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=timeline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timeline.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineReadBounds.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineReadBounds.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { makeSourceDeps } from "../../core/timelineSources.js";
|
|
3
|
+
describe("timeline in-app reads", () => {
|
|
4
|
+
it("never retry, never reconnect, and give up within 3s", async () => {
|
|
5
|
+
const calls = [];
|
|
6
|
+
const deps = makeSourceDeps(async (_expr, _await, options) => {
|
|
7
|
+
calls.push(options);
|
|
8
|
+
return { success: true, result: "null" };
|
|
9
|
+
});
|
|
10
|
+
await deps.readRoutes("iPhone").catch(() => undefined);
|
|
11
|
+
await deps.readRefresh("iPhone").catch(() => undefined);
|
|
12
|
+
await deps.probeDeviceNow("iPhone").catch(() => undefined);
|
|
13
|
+
expect(calls.length).toBeGreaterThanOrEqual(3);
|
|
14
|
+
for (const o of calls) {
|
|
15
|
+
expect(o.maxRetries).toBe(0);
|
|
16
|
+
expect(o.autoReconnect).toBe(false);
|
|
17
|
+
expect(o.timeoutMs).toBeLessThanOrEqual(3000);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=timelineReadBounds.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineReadBounds.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineReadBounds.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAA8B,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACzD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelineSources.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/timelineSources.test.ts"],"names":[],"mappings":""}
|
|
@@ -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", () => {
|
|
@@ -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"}
|