execbro 1.11.1 → 2.1.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 +4 -4
- package/build/__tests__/unit/appContext.test.d.ts +2 -0
- package/build/__tests__/unit/appContext.test.d.ts.map +1 -0
- package/build/__tests__/unit/appContext.test.js +70 -0
- package/build/__tests__/unit/appContext.test.js.map +1 -0
- package/build/__tests__/unit/appRequest.test.d.ts +2 -0
- package/build/__tests__/unit/appRequest.test.d.ts.map +1 -0
- package/build/__tests__/unit/appRequest.test.js +179 -0
- package/build/__tests__/unit/appRequest.test.js.map +1 -0
- package/build/__tests__/unit/contextWiring.test.d.ts +2 -0
- package/build/__tests__/unit/contextWiring.test.d.ts.map +1 -0
- package/build/__tests__/unit/contextWiring.test.js +28 -0
- package/build/__tests__/unit/contextWiring.test.js.map +1 -0
- package/build/__tests__/unit/coordinateMiss.test.d.ts +2 -0
- package/build/__tests__/unit/coordinateMiss.test.d.ts.map +1 -0
- package/build/__tests__/unit/coordinateMiss.test.js +111 -0
- package/build/__tests__/unit/coordinateMiss.test.js.map +1 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.d.ts +2 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.d.ts.map +1 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.js +69 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.js.map +1 -0
- package/build/__tests__/unit/epochRender.test.d.ts +2 -0
- package/build/__tests__/unit/epochRender.test.d.ts.map +1 -0
- package/build/__tests__/unit/epochRender.test.js +60 -0
- package/build/__tests__/unit/epochRender.test.js.map +1 -0
- package/build/__tests__/unit/executeBudget.test.d.ts +2 -0
- package/build/__tests__/unit/executeBudget.test.d.ts.map +1 -0
- package/build/__tests__/unit/executeBudget.test.js +27 -0
- package/build/__tests__/unit/executeBudget.test.js.map +1 -0
- package/build/__tests__/unit/executor.test.js +48 -6
- package/build/__tests__/unit/executor.test.js.map +1 -1
- package/build/__tests__/unit/findElementTreeReuse.test.d.ts +2 -0
- package/build/__tests__/unit/findElementTreeReuse.test.d.ts.map +1 -0
- package/build/__tests__/unit/findElementTreeReuse.test.js +77 -0
- package/build/__tests__/unit/findElementTreeReuse.test.js.map +1 -0
- package/build/__tests__/unit/getLogsEmptyContract.test.js +4 -3
- package/build/__tests__/unit/getLogsEmptyContract.test.js.map +1 -1
- package/build/__tests__/unit/getLogsNativeSource.test.js +7 -8
- package/build/__tests__/unit/getLogsNativeSource.test.js.map +1 -1
- package/build/__tests__/unit/inspectorHarvest.test.js +1 -21
- package/build/__tests__/unit/inspectorHarvest.test.js.map +1 -1
- package/build/__tests__/unit/inspectorSource.test.js +1 -38
- package/build/__tests__/unit/inspectorSource.test.js.map +1 -1
- package/build/__tests__/unit/jsLogEvents.test.js +1 -0
- package/build/__tests__/unit/jsLogEvents.test.js.map +1 -1
- package/build/__tests__/unit/logBufferEpoch.test.d.ts +2 -0
- package/build/__tests__/unit/logBufferEpoch.test.d.ts.map +1 -0
- package/build/__tests__/unit/logBufferEpoch.test.js +63 -0
- package/build/__tests__/unit/logBufferEpoch.test.js.map +1 -0
- package/build/__tests__/unit/metro.test.js +18 -1
- package/build/__tests__/unit/metro.test.js.map +1 -1
- package/build/__tests__/unit/moduleRegistry.test.d.ts +2 -0
- package/build/__tests__/unit/moduleRegistry.test.d.ts.map +1 -0
- package/build/__tests__/unit/moduleRegistry.test.js +62 -0
- package/build/__tests__/unit/moduleRegistry.test.js.map +1 -0
- package/build/__tests__/unit/navigateVerify.test.d.ts +2 -0
- package/build/__tests__/unit/navigateVerify.test.d.ts.map +1 -0
- package/build/__tests__/unit/navigateVerify.test.js +30 -0
- package/build/__tests__/unit/navigateVerify.test.js.map +1 -0
- package/build/__tests__/unit/navigation.test.d.ts +2 -0
- package/build/__tests__/unit/navigation.test.d.ts.map +1 -0
- package/build/__tests__/unit/navigation.test.js +254 -0
- package/build/__tests__/unit/navigation.test.js.map +1 -0
- package/build/__tests__/unit/network.test.js +1 -0
- package/build/__tests__/unit/network.test.js.map +1 -1
- package/build/__tests__/unit/networkBufferEpoch.test.d.ts +2 -0
- package/build/__tests__/unit/networkBufferEpoch.test.d.ts.map +1 -0
- package/build/__tests__/unit/networkBufferEpoch.test.js +52 -0
- package/build/__tests__/unit/networkBufferEpoch.test.js.map +1 -0
- package/build/__tests__/unit/networkInterceptor.test.js +7 -7
- package/build/__tests__/unit/networkInterceptor.test.js.map +1 -1
- package/build/__tests__/unit/promiseHandles.test.d.ts +2 -0
- package/build/__tests__/unit/promiseHandles.test.d.ts.map +1 -0
- package/build/__tests__/unit/promiseHandles.test.js +61 -0
- package/build/__tests__/unit/promiseHandles.test.js.map +1 -0
- package/build/__tests__/unit/resolveBufferOffline.test.d.ts +2 -0
- package/build/__tests__/unit/resolveBufferOffline.test.d.ts.map +1 -0
- package/build/__tests__/unit/resolveBufferOffline.test.js +25 -0
- package/build/__tests__/unit/resolveBufferOffline.test.js.map +1 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.d.ts +2 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.d.ts.map +1 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.js +118 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.js.map +1 -0
- package/build/__tests__/unit/sessionEpoch.test.d.ts +2 -0
- package/build/__tests__/unit/sessionEpoch.test.d.ts.map +1 -0
- package/build/__tests__/unit/sessionEpoch.test.js +41 -0
- package/build/__tests__/unit/sessionEpoch.test.js.map +1 -0
- package/build/__tests__/unit/settleAndDiff.test.d.ts +2 -0
- package/build/__tests__/unit/settleAndDiff.test.d.ts.map +1 -0
- package/build/__tests__/unit/settleAndDiff.test.js +110 -0
- package/build/__tests__/unit/settleAndDiff.test.js.map +1 -0
- package/build/__tests__/unit/truncate.test.d.ts +2 -0
- package/build/__tests__/unit/truncate.test.d.ts.map +1 -0
- package/build/__tests__/unit/truncate.test.js +58 -0
- package/build/__tests__/unit/truncate.test.js.map +1 -0
- package/build/__tests__/unit/verifyAction.test.js +2 -1
- package/build/__tests__/unit/verifyAction.test.js.map +1 -1
- package/build/__tests__/unit/waitForMeasurements.test.d.ts +2 -0
- package/build/__tests__/unit/waitForMeasurements.test.d.ts.map +1 -0
- package/build/__tests__/unit/waitForMeasurements.test.js +69 -0
- package/build/__tests__/unit/waitForMeasurements.test.js.map +1 -0
- package/build/core/android.d.ts +3 -1
- package/build/core/android.d.ts.map +1 -1
- package/build/core/android.js +5 -5
- package/build/core/android.js.map +1 -1
- package/build/core/appContext.d.ts +53 -0
- package/build/core/appContext.d.ts.map +1 -0
- package/build/core/appContext.js +172 -0
- package/build/core/appContext.js.map +1 -0
- package/build/core/appRequest.d.ts +21 -0
- package/build/core/appRequest.d.ts.map +1 -0
- package/build/core/appRequest.js +95 -0
- package/build/core/appRequest.js.map +1 -0
- package/build/core/bufferConfig.d.ts +5 -0
- package/build/core/bufferConfig.d.ts.map +1 -0
- package/build/core/bufferConfig.js +20 -0
- package/build/core/bufferConfig.js.map +1 -0
- package/build/core/connection.d.ts.map +1 -1
- package/build/core/connection.js +29 -9
- package/build/core/connection.js.map +1 -1
- package/build/core/debugGlobals.d.ts.map +1 -1
- package/build/core/debugGlobals.js +13 -0
- package/build/core/debugGlobals.js.map +1 -1
- package/build/core/deviceDiscovery.d.ts +5 -1
- package/build/core/deviceDiscovery.d.ts.map +1 -1
- package/build/core/deviceDiscovery.js +13 -2
- package/build/core/deviceDiscovery.js.map +1 -1
- package/build/core/deviceResolver.d.ts.map +1 -1
- package/build/core/deviceResolver.js +17 -2
- package/build/core/deviceResolver.js.map +1 -1
- package/build/core/epochRender.d.ts +19 -0
- package/build/core/epochRender.d.ts.map +1 -0
- package/build/core/epochRender.js +38 -0
- package/build/core/epochRender.js.map +1 -0
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +36 -91
- package/build/core/guides.js.map +1 -1
- package/build/core/index.d.ts +2 -3
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +4 -4
- package/build/core/index.js.map +1 -1
- package/build/core/inspector.d.ts +0 -39
- package/build/core/inspector.d.ts.map +1 -1
- package/build/core/inspector.js +1 -358
- package/build/core/inspector.js.map +1 -1
- package/build/core/ios.d.ts +14 -3
- package/build/core/ios.d.ts.map +1 -1
- package/build/core/ios.js +41 -17
- package/build/core/ios.js.map +1 -1
- package/build/core/jsExecute.d.ts +15 -0
- package/build/core/jsExecute.d.ts.map +1 -1
- package/build/core/jsExecute.js +136 -29
- package/build/core/jsExecute.js.map +1 -1
- package/build/core/logs.d.ts +12 -3
- package/build/core/logs.d.ts.map +1 -1
- package/build/core/logs.js +28 -5
- package/build/core/logs.js.map +1 -1
- package/build/core/metro.d.ts +2 -0
- package/build/core/metro.d.ts.map +1 -1
- package/build/core/metro.js +16 -8
- package/build/core/metro.js.map +1 -1
- package/build/core/moduleRegistry.d.ts +19 -0
- package/build/core/moduleRegistry.d.ts.map +1 -0
- package/build/core/moduleRegistry.js +67 -0
- package/build/core/moduleRegistry.js.map +1 -0
- package/build/core/nativeOnlyHints.d.ts.map +1 -1
- package/build/core/nativeOnlyHints.js +0 -2
- package/build/core/nativeOnlyHints.js.map +1 -1
- package/build/core/navigate.d.ts +46 -0
- package/build/core/navigate.d.ts.map +1 -0
- package/build/core/navigate.js +119 -0
- package/build/core/navigate.js.map +1 -0
- package/build/core/navigation.d.ts +66 -0
- package/build/core/navigation.d.ts.map +1 -0
- package/build/core/navigation.js +269 -0
- package/build/core/navigation.js.map +1 -0
- package/build/core/network.d.ts +12 -2
- package/build/core/network.d.ts.map +1 -1
- package/build/core/network.js +52 -12
- package/build/core/network.js.map +1 -1
- package/build/core/networkInterceptor.d.ts +1 -1
- package/build/core/networkInterceptor.d.ts.map +1 -1
- package/build/core/networkInterceptor.js +3 -2
- package/build/core/networkInterceptor.js.map +1 -1
- package/build/core/pressables.d.ts +33 -0
- package/build/core/pressables.d.ts.map +1 -1
- package/build/core/pressables.js +73 -4
- package/build/core/pressables.js.map +1 -1
- package/build/core/promiseHandles.d.ts +19 -0
- package/build/core/promiseHandles.d.ts.map +1 -0
- package/build/core/promiseHandles.js +58 -0
- package/build/core/promiseHandles.js.map +1 -0
- package/build/core/register.d.ts.map +1 -1
- package/build/core/register.js +1 -4
- package/build/core/register.js.map +1 -1
- package/build/core/sdkMirrorPoller.d.ts +31 -0
- package/build/core/sdkMirrorPoller.d.ts.map +1 -0
- package/build/core/sdkMirrorPoller.js +210 -0
- package/build/core/sdkMirrorPoller.js.map +1 -0
- package/build/core/state.d.ts +14 -0
- package/build/core/state.d.ts.map +1 -1
- package/build/core/state.js +48 -2
- package/build/core/state.js.map +1 -1
- package/build/core/toolHelpers.d.ts.map +1 -1
- package/build/core/toolHelpers.js +42 -10
- package/build/core/toolHelpers.js.map +1 -1
- package/build/core/truncate.d.ts +42 -0
- package/build/core/truncate.d.ts.map +1 -0
- package/build/core/truncate.js +169 -0
- package/build/core/truncate.js.map +1 -0
- package/build/core/types.d.ts +3 -0
- package/build/core/types.d.ts.map +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -2
- package/build/index.js.map +1 -1
- package/build/pro/coordinateMiss.d.ts +55 -0
- package/build/pro/coordinateMiss.d.ts.map +1 -0
- package/build/pro/coordinateMiss.js +122 -0
- package/build/pro/coordinateMiss.js.map +1 -0
- package/build/pro/tap.d.ts +8 -0
- package/build/pro/tap.d.ts.map +1 -1
- package/build/pro/tap.js +99 -11
- package/build/pro/tap.js.map +1 -1
- package/build/pro/verifyAction.d.ts +43 -2
- package/build/pro/verifyAction.d.ts.map +1 -1
- package/build/pro/verifyAction.js +95 -36
- package/build/pro/verifyAction.js.map +1 -1
- package/build/tools/_deviceArg.d.ts +17 -1
- package/build/tools/_deviceArg.d.ts.map +1 -1
- package/build/tools/_deviceArg.js +17 -1
- package/build/tools/_deviceArg.js.map +1 -1
- package/build/tools/bundleTools.d.ts.map +1 -1
- package/build/tools/bundleTools.js +20 -33
- package/build/tools/bundleTools.js.map +1 -1
- package/build/tools/componentTools.d.ts.map +1 -1
- package/build/tools/componentTools.js +41 -219
- package/build/tools/componentTools.js.map +1 -1
- package/build/tools/connectionTools.d.ts.map +1 -1
- package/build/tools/connectionTools.js +17 -22
- package/build/tools/connectionTools.js.map +1 -1
- package/build/tools/deviceTools.d.ts.map +1 -1
- package/build/tools/deviceTools.js +13 -167
- package/build/tools/deviceTools.js.map +1 -1
- package/build/tools/executionTools.d.ts.map +1 -1
- package/build/tools/executionTools.js +63 -18
- package/build/tools/executionTools.js.map +1 -1
- package/build/tools/interactionTools.d.ts +6 -0
- package/build/tools/interactionTools.d.ts.map +1 -1
- package/build/tools/interactionTools.js +41 -56
- package/build/tools/interactionTools.js.map +1 -1
- package/build/tools/logTools.d.ts.map +1 -1
- package/build/tools/logTools.js +61 -80
- package/build/tools/logTools.js.map +1 -1
- package/build/tools/metaTools.js +1 -1
- package/build/tools/metaTools.js.map +1 -1
- package/build/tools/navigationTools.d.ts +3 -0
- package/build/tools/navigationTools.d.ts.map +1 -0
- package/build/tools/navigationTools.js +60 -0
- package/build/tools/navigationTools.js.map +1 -0
- package/build/tools/networkTools.d.ts.map +1 -1
- package/build/tools/networkTools.js +44 -202
- package/build/tools/networkTools.js.map +1 -1
- package/build/tools/reduxTools.d.ts.map +1 -1
- package/build/tools/reduxTools.js +3 -2
- package/build/tools/reduxTools.js.map +1 -1
- package/build/tools/requestTools.d.ts +3 -0
- package/build/tools/requestTools.d.ts.map +1 -0
- package/build/tools/requestTools.js +79 -0
- package/build/tools/requestTools.js.map +1 -0
- package/build/tools/screenshotTools.d.ts.map +1 -1
- package/build/tools/screenshotTools.js +42 -25
- package/build/tools/screenshotTools.js.map +1 -1
- package/package.json +1 -1
- package/tools.json +22 -78
- package/build/__tests__/unit/flowpoints.test.d.ts +0 -2
- package/build/__tests__/unit/flowpoints.test.d.ts.map +0 -1
- package/build/__tests__/unit/flowpoints.test.js +0 -126
- package/build/__tests__/unit/flowpoints.test.js.map +0 -1
- package/build/__tests__/unit/flowpointsQuery.test.d.ts +0 -2
- package/build/__tests__/unit/flowpointsQuery.test.d.ts.map +0 -1
- package/build/__tests__/unit/flowpointsQuery.test.js +0 -91
- package/build/__tests__/unit/flowpointsQuery.test.js.map +0 -1
- package/build/__tests__/unit/selectionPoller.test.d.ts +0 -2
- package/build/__tests__/unit/selectionPoller.test.d.ts.map +0 -1
- package/build/__tests__/unit/selectionPoller.test.js +0 -109
- package/build/__tests__/unit/selectionPoller.test.js.map +0 -1
- package/build/__tests__/unit/verifyFlow.test.d.ts +0 -2
- package/build/__tests__/unit/verifyFlow.test.d.ts.map +0 -1
- package/build/__tests__/unit/verifyFlow.test.js +0 -45
- package/build/__tests__/unit/verifyFlow.test.js.map +0 -1
- package/build/core/selectionPoller.d.ts +0 -13
- package/build/core/selectionPoller.d.ts.map +0 -1
- package/build/core/selectionPoller.js +0 -102
- package/build/core/selectionPoller.js.map +0 -1
- package/build/pro/flowpointTools.d.ts +0 -4
- package/build/pro/flowpointTools.d.ts.map +0 -1
- package/build/pro/flowpointTools.js +0 -266
- package/build/pro/flowpointTools.js.map +0 -1
- package/build/pro/flowpoints.d.ts +0 -86
- package/build/pro/flowpoints.d.ts.map +0 -1
- package/build/pro/flowpoints.js +0 -283
- package/build/pro/flowpoints.js.map +0 -1
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "@jest/globals";
|
|
2
|
-
import { verifyFlow } from "../../pro/flowpoints.js";
|
|
3
|
-
function e(seq, step, overrides = {}) {
|
|
4
|
-
return { seq, t: 1000 + seq * 10, name: "add-to-cart", step, run: "r1", level: "info", ...overrides };
|
|
5
|
-
}
|
|
6
|
-
const happy = [e(1, "start"), e(2, "cleared"), e(3, "item-added"), e(4, "done")];
|
|
7
|
-
describe("verifyFlow", () => {
|
|
8
|
-
it("passes when expected steps appear in order (subsequence: extras allowed)", () => {
|
|
9
|
-
const result = verifyFlow("add-to-cart", "r1", happy, ["start", "item-added", "done"], false);
|
|
10
|
-
expect(result.pass).toBe(true);
|
|
11
|
-
expect(result.text).toContain('PASS — flow "add-to-cart" run r1:');
|
|
12
|
-
expect(result.text).toContain("✓ start (+0ms)");
|
|
13
|
-
expect(result.text).toContain("✓ done (+30ms)");
|
|
14
|
-
});
|
|
15
|
-
it("fails and diffs a missing step", () => {
|
|
16
|
-
const result = verifyFlow("add-to-cart", "r1", [e(1, "start"), e(2, "cleared")], ["start", "item-added"], false);
|
|
17
|
-
expect(result.pass).toBe(false);
|
|
18
|
-
expect(result.text).toContain("✗ item-added — not seen");
|
|
19
|
-
});
|
|
20
|
-
it("fails on out-of-order steps", () => {
|
|
21
|
-
const result = verifyFlow("add-to-cart", "r1", happy, ["done", "start"], false);
|
|
22
|
-
expect(result.pass).toBe(false);
|
|
23
|
-
});
|
|
24
|
-
it("fails on an unexpected error point, with a ! line", () => {
|
|
25
|
-
const entries = [e(1, "start"), e(2, "failed", { level: "error", meta: { reason: "timeout" } })];
|
|
26
|
-
const result = verifyFlow("add-to-cart", "r1", entries, ["start"], false);
|
|
27
|
-
expect(result.pass).toBe(false);
|
|
28
|
-
expect(result.text).toContain('! failed [error] (+10ms) {"reason":"timeout"} — unexpected error point');
|
|
29
|
-
});
|
|
30
|
-
it("allowErrors tolerates unexpected error points", () => {
|
|
31
|
-
const entries = [e(1, "start"), e(2, "failed", { level: "error" })];
|
|
32
|
-
expect(verifyFlow("add-to-cart", "r1", entries, ["start"], true).pass).toBe(true);
|
|
33
|
-
});
|
|
34
|
-
it("an explicitly expected error step passes", () => {
|
|
35
|
-
const entries = [e(1, "start"), e(2, "failed", { level: "error" })];
|
|
36
|
-
const result = verifyFlow("add-to-cart", "r1", entries, ["start", { step: "failed", level: "error" }], false);
|
|
37
|
-
expect(result.pass).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
it("object matchers can constrain meta", () => {
|
|
40
|
-
const entries = [e(1, "done", { meta: { count: 5 } })];
|
|
41
|
-
expect(verifyFlow("f", "r1", entries, [{ step: "done", metaIncludes: '"count":5' }], false).pass).toBe(true);
|
|
42
|
-
expect(verifyFlow("f", "r1", entries, [{ step: "done", metaIncludes: 'count":9' }], false).pass).toBe(false);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
//# sourceMappingURL=verifyFlow.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifyFlow.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/verifyFlow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,102 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectionPoller.js","sourceRoot":"","sources":["../../src/core/selectionPoller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flowpointTools.d.ts","sourceRoot":"","sources":["../../src/pro/flowpointTools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BzE,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAS/D;AAOD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkR9D"}
|
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { registerToolWithTelemetry } from "../core/register.js";
|
|
3
|
-
import { getConnectedAppByDevice, getFirstConnectedApp, executeInApp } from "../core/index.js";
|
|
4
|
-
import { UserInputError } from "../core/errors.js";
|
|
5
|
-
import { allStoredFlowpoints, clearFlowpointStores, drainFlowpoints, filterFlowpoints, formatFlowpoints, formatMeta, getFlowpointStore, matchesPoint, buildClearExpression, verifyFlow, resolveLastRuns, } from "./flowpoints.js";
|
|
6
|
-
const NO_FLOWPOINTS_HINT = "No flowpoints captured. Instrument the flow under test (execbro-sdk required):\n\n" +
|
|
7
|
-
" import { flowpoint } from 'execbro-sdk'\n" +
|
|
8
|
-
" flowpoint({ name: 'my-flow', step: 'start', begin: true })\n" +
|
|
9
|
-
" flowpoint({ name: 'my-flow', step: 'done', meta: { anything: true } })\n\n" +
|
|
10
|
-
"Then reload the app, drive the flow, and query again. " +
|
|
11
|
-
'See get_usage_guide(topic="flowpoints").';
|
|
12
|
-
export function resolveTargetDeviceName(device) {
|
|
13
|
-
if (device) {
|
|
14
|
-
const app = getConnectedAppByDevice(device);
|
|
15
|
-
if (!app)
|
|
16
|
-
throw new UserInputError(`No connected device matches "${device}"`);
|
|
17
|
-
return app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
|
|
18
|
-
}
|
|
19
|
-
const first = getFirstConnectedApp();
|
|
20
|
-
if (!first)
|
|
21
|
-
throw new UserInputError("No connected app. Run scan_metro first.");
|
|
22
|
-
return first.deviceInfo.deviceName || first.deviceInfo.title || "unknown";
|
|
23
|
-
}
|
|
24
|
-
const deviceParam = z
|
|
25
|
-
.string()
|
|
26
|
-
.optional()
|
|
27
|
-
.describe("Target device name (substring match). Omit for all devices. Run get_apps to see connected devices.");
|
|
28
|
-
export function registerFlowpointTools(server) {
|
|
29
|
-
registerToolWithTelemetry(server, "get_flowpoints", {
|
|
30
|
-
description: "Read flowpoint breadcrumbs — structured, timestamped points emitted by flowpoint() calls " +
|
|
31
|
-
"(execbro-sdk) — grouped by flow and run, with inter-point timing deltas.\n" +
|
|
32
|
-
"PURPOSE: verify what actually happened inside a flow (steps, order, timing, failures) " +
|
|
33
|
-
"instead of inferring it from console logs.\n" +
|
|
34
|
-
"WHEN TO USE: after driving an instrumented flow; or with level: 'error' to ask " +
|
|
35
|
-
'"did any flow fail?" across all flows at once.\n' +
|
|
36
|
-
"WORKFLOW: instrument with flowpoint() -> reload -> drive the flow -> " +
|
|
37
|
-
"wait_for_flowpoint (sync) -> verify_flow (assert) -> get_flowpoints (inspect details).\n" +
|
|
38
|
-
"LIMITATIONS: requires execbro-sdk init() and flowpoint() instrumentation in app code.\n" +
|
|
39
|
-
"GOOD: get_flowpoints({ name: 'add-to-cart', run: 'last' }) after a retry.\n" +
|
|
40
|
-
"BAD: polling get_flowpoints in a loop — use wait_for_flowpoint instead.\n" +
|
|
41
|
-
'SEE ALSO: call get_usage_guide(topic="flowpoints") for the full playbook.',
|
|
42
|
-
inputSchema: {
|
|
43
|
-
name: z.string().optional().describe("Filter to one flow name. Omit for all flows."),
|
|
44
|
-
step: z.string().optional().describe("Filter to one step label (exact match)."),
|
|
45
|
-
run: z
|
|
46
|
-
.string()
|
|
47
|
-
.optional()
|
|
48
|
-
.describe("Filter to one run id, or 'last' for the most recent run per flow."),
|
|
49
|
-
level: z.enum(["info", "warn", "error"]).optional().describe("Filter by severity."),
|
|
50
|
-
metaIncludes: z
|
|
51
|
-
.string()
|
|
52
|
-
.optional()
|
|
53
|
-
.describe("Case-insensitive substring match against the stringified meta payload."),
|
|
54
|
-
since: z.number().optional().describe("Epoch-ms lower bound on the point timestamp (exclusive)."),
|
|
55
|
-
limit: z.number().optional().default(200).describe("Max points returned, newest kept (default 200)."),
|
|
56
|
-
device: deviceParam,
|
|
57
|
-
},
|
|
58
|
-
}, async ({ name, step, run, level, metaIncludes, since, limit, device }) => {
|
|
59
|
-
const deviceName = resolveTargetDeviceName(device);
|
|
60
|
-
const drained = await drainFlowpoints(deviceName, device);
|
|
61
|
-
if (!drained.ok) {
|
|
62
|
-
return { isError: true, content: [{ type: "text", text: drained.error }] };
|
|
63
|
-
}
|
|
64
|
-
const sourceEntries = device ? getFlowpointStore(deviceName).entries : allStoredFlowpoints();
|
|
65
|
-
const entries = filterFlowpoints(sourceEntries, {
|
|
66
|
-
name,
|
|
67
|
-
step,
|
|
68
|
-
run,
|
|
69
|
-
level,
|
|
70
|
-
metaIncludes,
|
|
71
|
-
since,
|
|
72
|
-
limit,
|
|
73
|
-
});
|
|
74
|
-
if (entries.length === 0) {
|
|
75
|
-
if (sourceEntries.length === 0) {
|
|
76
|
-
return { content: [{ type: "text", text: NO_FLOWPOINTS_HINT }] };
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
content: [
|
|
80
|
-
{
|
|
81
|
-
type: "text",
|
|
82
|
-
text: `${sourceEntries.length} flowpoints stored, but 0 matched your filters. ` +
|
|
83
|
-
"Loosen or drop filters (name/step/run/level/metaIncludes/since) to see them.",
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
const flows = new Set(entries.map((e) => e.name)).size;
|
|
89
|
-
return {
|
|
90
|
-
content: [
|
|
91
|
-
{
|
|
92
|
-
type: "text",
|
|
93
|
-
text: `Flowpoints (${entries.length} points, ${flows} flow${flows === 1 ? "" : "s"}):\n\n${formatFlowpoints(entries)}`,
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
};
|
|
97
|
-
}, (result) => !!result?.content?.[0]?.text?.startsWith("No flowpoints captured"));
|
|
98
|
-
registerToolWithTelemetry(server, "clear_flowpoints", {
|
|
99
|
-
description: "Clear stored flowpoints.\n" +
|
|
100
|
-
"PURPOSE: reset flowpoint history between test sessions.\n" +
|
|
101
|
-
"WHEN TO USE: rarely — prefer begin: true + run: 'last' filtering between attempts. " +
|
|
102
|
-
"With name: clears one flow from the server store only (cleared entries never re-drain). " +
|
|
103
|
-
"Without name: clears everything server-side AND the in-app buffer.",
|
|
104
|
-
inputSchema: {
|
|
105
|
-
name: z.string().optional().describe("Clear only this flow (server-side). Omit to clear all."),
|
|
106
|
-
device: z
|
|
107
|
-
.string()
|
|
108
|
-
.optional()
|
|
109
|
-
.describe("Target device (substring match). Scopes both the server-store clear and the in-app " +
|
|
110
|
-
"buffer clear. Omit for all devices."),
|
|
111
|
-
},
|
|
112
|
-
}, async ({ name, device }) => {
|
|
113
|
-
const deviceName = device ? resolveTargetDeviceName(device) : undefined;
|
|
114
|
-
let cleared = clearFlowpointStores(name, deviceName);
|
|
115
|
-
let caveat = "";
|
|
116
|
-
if (!name) {
|
|
117
|
-
const result = await executeInApp(buildClearExpression(), false, { timeoutMs: 3000, originatingToolName: "clear_flowpoints" }, device);
|
|
118
|
-
if (result.success) {
|
|
119
|
-
const inApp = parseInt(result.result || "0", 10);
|
|
120
|
-
if (!isNaN(inApp))
|
|
121
|
-
cleared = Math.max(cleared, inApp);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
caveat = " (in-app buffer clear failed — still-buffered points may re-drain after the next app event)";
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
const scope = name ? ` for flow "${name}"` : "";
|
|
128
|
-
return { content: [{ type: "text", text: `Cleared ${cleared} flowpoints${scope}.${caveat}` }] };
|
|
129
|
-
});
|
|
130
|
-
registerToolWithTelemetry(server, "wait_for_flowpoint", {
|
|
131
|
-
description: "Block until a flowpoint matching the criteria arrives, or timeout.\n" +
|
|
132
|
-
"PURPOSE: deterministic synchronization for drive-then-verify — act first, then block on the flow's " +
|
|
133
|
-
"terminal step instead of sleeping and re-polling.\n" +
|
|
134
|
-
"WHEN TO USE: after tapping/driving an instrumented flow, with the flow's terminal step.\n" +
|
|
135
|
-
"Points emitted after your action but before this call still match (only points already " +
|
|
136
|
-
"seen by a previous flowpoint tool call are excluded).\n" +
|
|
137
|
-
"On timeout, returns whatever points DID arrive for the flow — that partial trail is the " +
|
|
138
|
-
"diagnostic for what stalled.\n" +
|
|
139
|
-
'SEE ALSO: get_usage_guide(topic="flowpoints").',
|
|
140
|
-
inputSchema: {
|
|
141
|
-
name: z.string().describe("Flow name to watch."),
|
|
142
|
-
step: z.string().optional().describe("Step label to wait for (exact match). Omit to match any step."),
|
|
143
|
-
level: z.enum(["info", "warn", "error"]).optional().describe("Only match this severity."),
|
|
144
|
-
metaIncludes: z
|
|
145
|
-
.string()
|
|
146
|
-
.optional()
|
|
147
|
-
.describe("Case-insensitive substring the stringified meta must contain."),
|
|
148
|
-
timeoutMs: z.number().optional().default(5000).describe("Max wait in ms (default 5000, cap 30000)."),
|
|
149
|
-
device: deviceParam,
|
|
150
|
-
},
|
|
151
|
-
}, async ({ name, step, level, metaIncludes, timeoutMs, device }) => {
|
|
152
|
-
const effectiveTimeout = Math.min(timeoutMs, 30000);
|
|
153
|
-
const deviceName = resolveTargetDeviceName(device);
|
|
154
|
-
const store = getFlowpointStore(deviceName);
|
|
155
|
-
const baselineEntry = store.entries.length > 0 ? store.entries[store.entries.length - 1] : null;
|
|
156
|
-
const start = Date.now();
|
|
157
|
-
const deadline = start + effectiveTimeout;
|
|
158
|
-
const freshEntries = () => {
|
|
159
|
-
const startIdx = baselineEntry ? store.entries.indexOf(baselineEntry) + 1 : 0;
|
|
160
|
-
return store.entries.slice(startIdx).filter((e) => e.name === name);
|
|
161
|
-
};
|
|
162
|
-
for (;;) {
|
|
163
|
-
const remaining = deadline - Date.now();
|
|
164
|
-
if (remaining > 0) {
|
|
165
|
-
const drained = await Promise.race([
|
|
166
|
-
drainFlowpoints(deviceName, device),
|
|
167
|
-
new Promise((resolve) => setTimeout(() => resolve(null), remaining)),
|
|
168
|
-
]);
|
|
169
|
-
if (drained && !drained.ok) {
|
|
170
|
-
return { isError: true, content: [{ type: "text", text: drained.error }] };
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
const fresh = freshEntries();
|
|
174
|
-
const match = fresh.find((e) => matchesPoint(e, { step, level, metaIncludes }));
|
|
175
|
-
if (match) {
|
|
176
|
-
const meta = match.meta !== undefined ? `\nmeta: ${formatMeta(match.meta)}` : "";
|
|
177
|
-
return {
|
|
178
|
-
content: [
|
|
179
|
-
{
|
|
180
|
-
type: "text",
|
|
181
|
-
text: `Matched after ${Date.now() - start}ms: flow "${match.name}" ` +
|
|
182
|
-
`run ${match.run} step "${match.step}" [${match.level}]${meta}`,
|
|
183
|
-
},
|
|
184
|
-
],
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
if (Date.now() >= deadline) {
|
|
188
|
-
const trail = fresh.length
|
|
189
|
-
? `Points that DID arrive for "${name}" during the wait:\n\n${formatFlowpoints(fresh)}`
|
|
190
|
-
: `No new points arrived for flow "${name}" during the wait.`;
|
|
191
|
-
return {
|
|
192
|
-
content: [
|
|
193
|
-
{
|
|
194
|
-
type: "text",
|
|
195
|
-
text: `Timeout after ${effectiveTimeout}ms waiting for flow "${name}"${step ? ` step "${step}"` : ""}.\n${trail}`,
|
|
196
|
-
},
|
|
197
|
-
],
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
await new Promise((resolve) => setTimeout(resolve, Math.min(250, Math.max(1, deadline - Date.now()))));
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
registerToolWithTelemetry(server, "verify_flow", {
|
|
204
|
-
description: "Assert a flow behaved as expected: compare the actual flowpoint trail of one run " +
|
|
205
|
-
"against an expected step sequence and get a factual PASS/FAIL diff.\n" +
|
|
206
|
-
"PURPOSE: factual PASS/FAIL assertion of a flow run against an expected step sequence.\n" +
|
|
207
|
-
"WHEN TO USE: after wait_for_flowpoint confirms the flow finished; or write the expectation first " +
|
|
208
|
-
"(runtime TDD) and iterate until PASS.\n" +
|
|
209
|
-
"Matching is subsequence: expected steps must appear in order; extra points in between " +
|
|
210
|
-
"are fine. Any unexpected error-level point fails the run unless allowErrors is true or " +
|
|
211
|
-
"that step is explicitly expected.\n" +
|
|
212
|
-
"WORKFLOW: write the expected sequence (even before implementing — runtime TDD), drive " +
|
|
213
|
-
"the flow, wait_for_flowpoint on the terminal step, then verify_flow.\n" +
|
|
214
|
-
'SEE ALSO: get_usage_guide(topic="flowpoints").',
|
|
215
|
-
inputSchema: {
|
|
216
|
-
name: z.string().describe("Flow name to verify."),
|
|
217
|
-
expect: z
|
|
218
|
-
.array(z.union([
|
|
219
|
-
z.string(),
|
|
220
|
-
z.object({
|
|
221
|
-
step: z.string(),
|
|
222
|
-
level: z.enum(["info", "warn", "error"]).optional(),
|
|
223
|
-
metaIncludes: z.string().optional(),
|
|
224
|
-
}),
|
|
225
|
-
]))
|
|
226
|
-
.describe("Expected step sequence, in order. Strings are shorthand for { step }."),
|
|
227
|
-
run: z.string().optional().default("last").describe("Run id to check, or 'last' (default)."),
|
|
228
|
-
allowErrors: z
|
|
229
|
-
.boolean()
|
|
230
|
-
.optional()
|
|
231
|
-
.default(false)
|
|
232
|
-
.describe("Tolerate unexpected error-level points (default false)."),
|
|
233
|
-
device: deviceParam,
|
|
234
|
-
},
|
|
235
|
-
}, async ({ name, expect: expected, run, allowErrors, device }) => {
|
|
236
|
-
const deviceName = resolveTargetDeviceName(device);
|
|
237
|
-
const drained = await drainFlowpoints(deviceName, device);
|
|
238
|
-
if (!drained.ok) {
|
|
239
|
-
return { isError: true, content: [{ type: "text", text: drained.error }] };
|
|
240
|
-
}
|
|
241
|
-
const sourceEntries = device ? getFlowpointStore(deviceName).entries : allStoredFlowpoints();
|
|
242
|
-
const flowEntries = sourceEntries.filter((e) => e.name === name);
|
|
243
|
-
if (flowEntries.length === 0) {
|
|
244
|
-
return {
|
|
245
|
-
content: [
|
|
246
|
-
{
|
|
247
|
-
type: "text",
|
|
248
|
-
text: `No flowpoints recorded for flow "${name}".\n\n${NO_FLOWPOINTS_HINT}`,
|
|
249
|
-
},
|
|
250
|
-
],
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
const runId = run === "last" || run === undefined ? resolveLastRuns(flowEntries).get(name) : run;
|
|
254
|
-
const runEntries = flowEntries.filter((e) => e.run === runId);
|
|
255
|
-
if (runEntries.length === 0) {
|
|
256
|
-
return {
|
|
257
|
-
isError: true,
|
|
258
|
-
content: [{ type: "text", text: `No entries for flow "${name}" run "${runId}".` }],
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
const result = verifyFlow(name, runId, runEntries, expected, allowErrors ?? false);
|
|
262
|
-
// A FAIL verdict is a successful verification, not a tool error — never set isError for it.
|
|
263
|
-
return { content: [{ type: "text", text: result.text }] };
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
//# sourceMappingURL=flowpointTools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flowpointTools.js","sourceRoot":"","sources":["../../src/pro/flowpointTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
export type FlowpointLevel = "info" | "warn" | "error";
|
|
2
|
-
export interface FlowpointEntry {
|
|
3
|
-
seq: number;
|
|
4
|
-
t: number;
|
|
5
|
-
name: string;
|
|
6
|
-
step: string;
|
|
7
|
-
run: string;
|
|
8
|
-
level: FlowpointLevel;
|
|
9
|
-
meta?: unknown;
|
|
10
|
-
}
|
|
11
|
-
export interface FlowpointSnapshot {
|
|
12
|
-
contextId: string;
|
|
13
|
-
entries: FlowpointEntry[];
|
|
14
|
-
}
|
|
15
|
-
export declare const FLOWPOINT_STORE_CAP = 2000;
|
|
16
|
-
export interface FlowpointStoreState {
|
|
17
|
-
entries: FlowpointEntry[];
|
|
18
|
-
cursor: number;
|
|
19
|
-
contextId: string | null;
|
|
20
|
-
}
|
|
21
|
-
export declare function createFlowpointStore(): FlowpointStoreState;
|
|
22
|
-
/** Pure drain reducer: diff a full in-app snapshot against the store. Returns entries appended. */
|
|
23
|
-
export declare function applyDrain(store: FlowpointStoreState, snapshot: FlowpointSnapshot): number;
|
|
24
|
-
export declare function buildDrainExpression(): string;
|
|
25
|
-
export declare function buildClearExpression(): string;
|
|
26
|
-
export type FlowpointMissingReason = "uninitialized" | "outdated";
|
|
27
|
-
export declare function parseDrainResult(raw: string): FlowpointSnapshot | {
|
|
28
|
-
missing: true;
|
|
29
|
-
reason: FlowpointMissingReason;
|
|
30
|
-
} | null;
|
|
31
|
-
export interface FlowpointFilters {
|
|
32
|
-
name?: string;
|
|
33
|
-
step?: string;
|
|
34
|
-
run?: string;
|
|
35
|
-
level?: FlowpointLevel;
|
|
36
|
-
metaIncludes?: string;
|
|
37
|
-
since?: number;
|
|
38
|
-
limit?: number;
|
|
39
|
-
}
|
|
40
|
-
export declare function formatMeta(meta: unknown): string;
|
|
41
|
-
export interface PointMatch {
|
|
42
|
-
step?: string;
|
|
43
|
-
level?: FlowpointLevel;
|
|
44
|
-
metaIncludes?: string;
|
|
45
|
-
}
|
|
46
|
-
export declare function matchesPoint(entry: FlowpointEntry, match: PointMatch): boolean;
|
|
47
|
-
/** Per flow name, the run id of the chronologically last entry. Assumes entries sorted by t. */
|
|
48
|
-
export declare function resolveLastRuns(entries: FlowpointEntry[]): Map<string, string>;
|
|
49
|
-
export declare function filterFlowpoints(entries: FlowpointEntry[], filters: FlowpointFilters): FlowpointEntry[];
|
|
50
|
-
/** Compact grouped text: flow → run → points with inter-point deltas. Assumes entries sorted by t. */
|
|
51
|
-
export declare function formatFlowpoints(entries: FlowpointEntry[]): string;
|
|
52
|
-
export declare function getFlowpointStore(deviceName: string): FlowpointStoreState;
|
|
53
|
-
/** All stored entries across devices, sorted chronologically. */
|
|
54
|
-
export declare function allStoredFlowpoints(): FlowpointEntry[];
|
|
55
|
-
/**
|
|
56
|
-
* Remove entries from the server stores. Cursors/contextIds are kept so cleared
|
|
57
|
-
* entries never re-drain. When deviceName is given, only that device's store is
|
|
58
|
-
* touched; otherwise all stores are.
|
|
59
|
-
*/
|
|
60
|
-
export declare function clearFlowpointStores(name?: string, deviceName?: string): number;
|
|
61
|
-
export declare const SDK_FLOWPOINTS_MISSING: string;
|
|
62
|
-
export declare const SDK_FLOWPOINTS_OUTDATED: string;
|
|
63
|
-
export type DrainOutcome = {
|
|
64
|
-
ok: true;
|
|
65
|
-
} | {
|
|
66
|
-
ok: false;
|
|
67
|
-
error: string;
|
|
68
|
-
sdkMissing?: boolean;
|
|
69
|
-
};
|
|
70
|
-
export declare function drainFlowpoints(deviceName: string, device?: string): Promise<DrainOutcome>;
|
|
71
|
-
export type ExpectStep = string | {
|
|
72
|
-
step: string;
|
|
73
|
-
level?: FlowpointLevel;
|
|
74
|
-
metaIncludes?: string;
|
|
75
|
-
};
|
|
76
|
-
export interface VerifyOutcome {
|
|
77
|
-
pass: boolean;
|
|
78
|
-
text: string;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Subsequence assertion: expected steps must appear in order within the run; extra
|
|
82
|
-
* points in between are allowed. Unexpected error-level points fail the verification
|
|
83
|
-
* unless allowErrors is true or the error point matched an expected step.
|
|
84
|
-
*/
|
|
85
|
-
export declare function verifyFlow(name: string, runId: string, runEntries: FlowpointEntry[], expect: ExpectStep[], allowErrors: boolean): VerifyOutcome;
|
|
86
|
-
//# sourceMappingURL=flowpoints.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flowpoints.d.ts","sourceRoot":"","sources":["../../src/pro/flowpoints.ts"],"names":[],"mappings":"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"}
|