obsidian-integration-testing 12.0.0 → 12.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.
Files changed (176) hide show
  1. package/dist/lib/cjs/adb-device-list.cjs +54 -0
  2. package/dist/lib/cjs/adb-device-list.d.cts +72 -0
  3. package/dist/lib/cjs/android-sdk.cjs +52 -0
  4. package/dist/lib/cjs/android-sdk.d.cts +29 -0
  5. package/dist/lib/cjs/app-startup-progress.cjs +87 -0
  6. package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
  7. package/dist/lib/cjs/appium-server-marker.cjs +29 -32
  8. package/dist/lib/cjs/appium-server-marker.d.cts +22 -0
  9. package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
  10. package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
  11. package/dist/lib/cjs/community-plugin-registry.cjs +1 -1
  12. package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
  13. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  14. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  15. package/dist/lib/cjs/config-directory.cjs +46 -0
  16. package/dist/lib/cjs/config-directory.d.cts +45 -0
  17. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  18. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  19. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  20. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
  21. package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
  22. package/dist/lib/cjs/device-readiness.cjs +38 -3
  23. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  24. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  25. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  26. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  27. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  28. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  29. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  30. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  31. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  32. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  33. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  34. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  35. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  36. package/dist/lib/cjs/index.cjs +12 -1
  37. package/dist/lib/cjs/index.d.cts +6 -1
  38. package/dist/lib/cjs/library.cjs +1 -1
  39. package/dist/lib/cjs/mobile-input.cjs +14 -2
  40. package/dist/lib/cjs/mobile-input.d.cts +5 -9
  41. package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
  42. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  43. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  44. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  45. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  46. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  47. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  48. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  49. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  50. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  51. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  52. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  53. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  54. package/dist/lib/cjs/port-owner.cjs +61 -0
  55. package/dist/lib/cjs/port-owner.d.cts +47 -0
  56. package/dist/lib/cjs/process-capture.cjs +62 -0
  57. package/dist/lib/cjs/process-capture.d.cts +83 -0
  58. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  59. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  60. package/dist/lib/cjs/process-liveness.cjs +51 -0
  61. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  62. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  63. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  64. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  65. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  66. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  67. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  68. package/dist/lib/cjs/transport-appium.cjs +102 -17
  69. package/dist/lib/cjs/transport-appium.d.cts +53 -3
  70. package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
  71. package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
  72. package/dist/lib/cjs/transport-factory.cjs +951 -133
  73. package/dist/lib/cjs/transport-options.cjs +11 -3
  74. package/dist/lib/cjs/transport-options.d.cts +131 -12
  75. package/dist/lib/cjs/transport.cjs +1 -1
  76. package/dist/lib/cjs/transport.d.cts +7 -1
  77. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  78. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  79. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  80. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  81. package/dist/lib/cjs/version-matrix.cjs +1 -1
  82. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  83. package/dist/lib/cjs/webview-cdp.cjs +6 -7
  84. package/dist/lib/cjs/webview-cdp.d.cts +5 -1
  85. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  86. package/dist/lib/esm/adb-device-list.mjs +28 -0
  87. package/dist/lib/esm/android-sdk.d.mts +29 -0
  88. package/dist/lib/esm/android-sdk.mjs +18 -0
  89. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  90. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  91. package/dist/lib/esm/appium-server-marker.d.mts +22 -0
  92. package/dist/lib/esm/appium-server-marker.mjs +28 -22
  93. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  94. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  95. package/dist/lib/esm/community-plugin-registry.d.mts +1 -1
  96. package/dist/lib/esm/community-plugin-registry.mjs +1 -1
  97. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  98. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  99. package/dist/lib/esm/config-directory.d.mts +45 -0
  100. package/dist/lib/esm/config-directory.mjs +21 -0
  101. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  102. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  103. package/dist/lib/esm/demo-vault-bootstrap.d.mts +3 -2
  104. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  105. package/dist/lib/esm/demo-vault-populate.mjs +3 -2
  106. package/dist/lib/esm/device-readiness.d.mts +83 -9
  107. package/dist/lib/esm/device-readiness.mjs +34 -2
  108. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  109. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  110. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  111. package/dist/lib/esm/emulator-backend.mjs +45 -0
  112. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  113. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  114. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  115. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  116. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  117. package/dist/lib/esm/global-setup-core.mjs +34 -35
  118. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  119. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  120. package/dist/lib/esm/index.d.mts +6 -1
  121. package/dist/lib/esm/index.mjs +11 -1
  122. package/dist/lib/esm/library.mjs +1 -1
  123. package/dist/lib/esm/mobile-input.d.mts +5 -9
  124. package/dist/lib/esm/mobile-input.mjs +14 -2
  125. package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
  126. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  127. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  128. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  129. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  130. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  131. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  132. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  133. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  134. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  135. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  136. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  137. package/dist/lib/esm/parent-liveness.mjs +42 -5
  138. package/dist/lib/esm/port-owner.d.mts +47 -0
  139. package/dist/lib/esm/port-owner.mjs +36 -0
  140. package/dist/lib/esm/process-capture.d.mts +83 -0
  141. package/dist/lib/esm/process-capture.mjs +38 -0
  142. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  143. package/dist/lib/esm/process-exit-message.mjs +13 -8
  144. package/dist/lib/esm/process-liveness.d.mts +18 -0
  145. package/dist/lib/esm/process-liveness.mjs +17 -0
  146. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  147. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  148. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  149. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  150. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  151. package/dist/lib/esm/temporary-vault.mjs +43 -8
  152. package/dist/lib/esm/transport-appium.d.mts +53 -3
  153. package/dist/lib/esm/transport-appium.mjs +108 -17
  154. package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
  155. package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
  156. package/dist/lib/esm/transport-factory.mjs +995 -138
  157. package/dist/lib/esm/transport-options.d.mts +131 -12
  158. package/dist/lib/esm/transport-options.mjs +9 -2
  159. package/dist/lib/esm/transport.d.mts +7 -1
  160. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  161. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  162. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  163. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  164. package/dist/lib/esm/version-matrix.d.mts +2 -2
  165. package/dist/lib/esm/version-matrix.mjs +1 -1
  166. package/dist/lib/esm/webview-cdp.d.mts +5 -1
  167. package/dist/lib/esm/webview-cdp.mjs +6 -7
  168. package/package.json +24 -23
  169. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  170. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  171. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  172. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  173. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  174. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  175. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  176. package/dist/lib/esm/obsidian-namespace.mjs +0 -1
@@ -0,0 +1,158 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure classification of whether the device a run is about to drive is still
5
+ * **there** — and, when it is not, which of the two very different things went
6
+ * wrong: the guest froze, or the emulator process itself did.
7
+ *
8
+ * The readiness gates in `device-readiness.ts` answer *"is the guest ready
9
+ * yet?"*, and both are deliberately best-effort: they warn and proceed. Nothing
10
+ * asked *"is it still answering?"* at the moment the session is created, so a
11
+ * guest that stopped answering between the last gate and `remote()` was handed
12
+ * to Appium anyway. What the operator then saw was Appium's own report:
13
+ *
14
+ * ```text
15
+ * WebDriverError: Device emulator-5554 was not in the list of connected devices
16
+ * when running "http://localhost:4723/session" with method "POST"
17
+ * ```
18
+ *
19
+ * — measured on this host 2026-09-05, after 515s. That names the device, and
20
+ * `adb devices` then lists the device happily, so it sends the reader to the one
21
+ * diagnostic that cannot help. The same trap `wedged-appium-server.ts` exists to
22
+ * escape, one layer further down.
23
+ *
24
+ * ## The console is what tells the two apart
25
+ *
26
+ * `adb -s <device> emu <command>` is served by the **emulator's own console**,
27
+ * not by the guest's `adbd`. So the two probes answer different questions, and
28
+ * the pair is a diagnosis where either alone is a guess:
29
+ *
30
+ * | `adb shell` | `adb emu` | What it means |
31
+ * | --- | --- | --- |
32
+ * | succeeds | — | Alive. Proceed. |
33
+ * | fails | succeeds | The **guest** is frozen or too busy to schedule `adbd`. |
34
+ * | fails | fails | The **emulator process** is unreachable. Nothing will recover it. |
35
+ *
36
+ * Only a *successful* console probe clears the emulator — see
37
+ * {@link EmulatorLivenessProbeOutcome} for why a failed one cannot be read as
38
+ * the emulator answering.
39
+ *
40
+ * Measured 2026-09-05 across six hand-boots on this host — two AVDs and five
41
+ * argument sets — every one of which reached the bottom row 64–92s after boot:
42
+ *
43
+ * ```text
44
+ * 80s emulator console (QEMU, not the guest): HUNG
45
+ * 80s qemu-system-x86_64-headless (pid 10004): cpu=0% rss=5.82GB
46
+ * ```
47
+ *
48
+ * **0% CPU** — blocked, not spinning — and a console that cannot answer. That is
49
+ * the QEMU main loop, below anything the guest, the GPU stack, the network
50
+ * simulator or the AVD's size can explain (each was eliminated by measurement,
51
+ * not by argument). It also explains the two downstream symptoms that had always
52
+ * looked like separate faults: `adb devices` keeps reporting `device` because
53
+ * nothing is left running to update that state, and the teardown's
54
+ * `adb emu kill` hangs for its full budget because it is asking the wedged
55
+ * console to shut itself down.
56
+ *
57
+ * The harness already *observed* the second half of this — teardown logs
58
+ * `Emulator console shutdown for emulator-5554 did not answer` — but only after
59
+ * the run had already failed with an error blaming the device. This module moves
60
+ * that observation to where it changes the verdict instead of annotating it.
61
+ *
62
+ * Kept separate from the integration-only `transport-factory` (excluded from
63
+ * unit tests) so the classification and the message stay unit-testable — the
64
+ * factory itself shells out to `adb`.
65
+ */
66
+ /**
67
+ * Parameters for {@link buildEmulatorLivenessMessage}.
68
+ */
69
+ export interface BuildEmulatorLivenessMessageParams {
70
+ /**
71
+ The device the run was about to drive.
72
+ */
73
+ readonly deviceId: string;
74
+ /**
75
+ The emulator's captured stdout+stderr tail, when this run started it (empty when none).
76
+ */
77
+ readonly emulatorOutput: string;
78
+ /**
79
+ The per-probe budget, so the message states what "did not answer" was measured against.
80
+ */
81
+ readonly probeTimeoutInMilliseconds: number;
82
+ /**
83
+ Which failure this is. `'alive'` is not a failure and has no message.
84
+ */
85
+ readonly verdict: Exclude<EmulatorLivenessVerdict, 'alive'>;
86
+ }
87
+ /**
88
+ * Whether a probe got an answer from the thing it was asking.
89
+ *
90
+ * Two-valued on purpose. An earlier draft split failures into "errored" and
91
+ * "timed out" and read an errored console as *the emulator speaking, with a
92
+ * refusal* — which is wrong, and wrong in the exact way this module exists to
93
+ * avoid. `adb -s <device> emu <command>` is routed by the **adb server**: when
94
+ * the device is `offline` adb refuses on the spot and never reaches the console,
95
+ * so the error is adb's, not the emulator's. Measured 2026-09-05, where that
96
+ * draft logged `shell=errored, console=errored -> guest-unresponsive` for a
97
+ * device whose emulator then had to be killed by PID because `adb emu kill`
98
+ * could not reach it either. Only a **successful** probe is an answer.
99
+ */
100
+ export type EmulatorLivenessProbeOutcome = 'answered' | 'no-answer';
101
+ /**
102
+ * Whether the device is still usable, and if not, which layer failed.
103
+ *
104
+ * - `'alive'` — the guest answered. Proceed.
105
+ * - `'device-gone'` — the host's adb no longer lists it at all.
106
+ * - `'emulator-wedged'` — neither the guest nor the emulator's own console
107
+ * answers. The emulator process is stuck; retrying anything against this
108
+ * device cannot succeed.
109
+ * - `'guest-unresponsive'` — the console answers but the guest does not, so the
110
+ * emulator is alive and the guest is frozen or starved.
111
+ */
112
+ export type EmulatorLivenessVerdict = 'alive' | 'device-gone' | 'emulator-wedged' | 'guest-unresponsive';
113
+ /**
114
+ * Parameters for {@link resolveEmulatorLivenessVerdict}.
115
+ */
116
+ export interface ResolveEmulatorLivenessVerdictParams {
117
+ /**
118
+ * Whether `adb -s <device> emu avd status` succeeded — reaching the
119
+ * **emulator console**, served by the emulator process rather than by the
120
+ * guest.
121
+ *
122
+ * Meaningful only for an `emulator-<port>` device: the console fails against a
123
+ * physical handset however healthy it is, which is why a non-emulator is never
124
+ * convicted on it (the trap `avd-probe-verdict.ts` documents).
125
+ */
126
+ readonly consoleProbe: EmulatorLivenessProbeOutcome;
127
+ /**
128
+ The device the run is about to drive.
129
+ */
130
+ readonly deviceId: string;
131
+ /**
132
+ Whether the host's `adb devices` still lists the device in any state.
133
+ */
134
+ readonly isListedByAdb: boolean;
135
+ /**
136
+ What `adb -s <device> shell true` answered — the **guest**, via `adbd`.
137
+ */
138
+ readonly shellProbe: EmulatorLivenessProbeOutcome;
139
+ }
140
+ /**
141
+ * Builds the message for a device that stopped answering, naming the layer that
142
+ * failed and the evidence for it.
143
+ *
144
+ * @param params - The verdict, the device, the probe budget and the emulator's output.
145
+ * @returns The message.
146
+ */
147
+ export declare function buildEmulatorLivenessMessage(params: BuildEmulatorLivenessMessageParams): string;
148
+ /**
149
+ * Decides whether the device is still usable, and which layer failed when it is
150
+ * not.
151
+ *
152
+ * A guest that answers settles it on its own — a console probe is only consulted
153
+ * when the guest has already gone quiet, so a healthy run never pays for it.
154
+ *
155
+ * @param params - What each probe answered, and whether adb still lists the device.
156
+ * @returns The verdict.
157
+ */
158
+ export declare function resolveEmulatorLivenessVerdict(params: ResolveEmulatorLivenessVerdictParams): EmulatorLivenessVerdict;
@@ -0,0 +1,47 @@
1
+ import { checkIsEmulatorDeviceId } from "./avd-probe-verdict.mjs";
2
+ import { appendProcessOutputTail } from "./process-exit-message.mjs";
3
+ function buildEmulatorLivenessMessage(params) {
4
+ const budget = `${String(params.probeTimeoutInMilliseconds)}ms`;
5
+ const diagnosis = {
6
+ "device-gone": [
7
+ "The host's `adb devices` no longer lists it, so it is no longer serving adb at all.",
8
+ "Either the emulator exited, or it wedged badly enough to drop off adb \u2014 the emulator output below is the best evidence for which.",
9
+ "An emulator this run started is replaced automatically once, so seeing this means the replacement did not survive either. Check that nothing else on this host stops emulators, and that the emulator build and system image are sound."
10
+ ],
11
+ "emulator-wedged": [
12
+ `Neither the guest (\`adb -s ${params.deviceId} shell\`) nor the emulator's own console (\`adb -s ${params.deviceId} emu avd status\`) answered within ${budget}.`,
13
+ "The console is served by the emulator process, not by the guest, so its silence means the EMULATOR is wedged \u2014 not the guest, not the Appium server, and not the device being absent.",
14
+ "`adb devices` will still list this device and will mislead you: nothing is left running to update that state.",
15
+ "A wedged emulator does not come back, so retrying the session against it cannot succeed. One this run started is replaced with a fresh boot automatically, which means seeing this message is the replacement failing too.",
16
+ "If it recurs at the same point in every run, the fault is below the harness \u2014 and the first thing to check is what filters this host's sockets. Endpoint-security, content-blocking and VPN products install socket filter drivers in the path of every socket call the emulator makes, the console's localhost connection included; stopping that service has fixed exactly this signature. After that, the emulator build, the system image and the host hypervisor."
17
+ ],
18
+ "guest-unresponsive": [
19
+ `The guest (\`adb -s ${params.deviceId} shell\`) did not answer within ${budget}, but the emulator's own console did.`,
20
+ "So the emulator process is healthy and the guest is frozen or too starved to schedule `adbd`.",
21
+ "A contended host is the usual cause; `deviceIdleTimeoutInMilliseconds` is the budget that governs waiting one out.",
22
+ "But if it recurs at the same point in every run, no timeout will fix it, and the host is not merely busy. Check what filters this host's sockets first \u2014 a content-blocking, endpoint-security or VPN socket filter driver produces this verdict as readily as it produces a fully wedged emulator \u2014 then the emulator build, the system image and the host hypervisor."
23
+ ]
24
+ };
25
+ const lines = [
26
+ `Device ${params.deviceId} stopped answering before the Appium session could be established.`,
27
+ ...diagnosis[params.verdict]
28
+ ];
29
+ return appendProcessOutputTail(lines.join("\n"), { output: params.emulatorOutput, outputLabel: "Emulator output" });
30
+ }
31
+ function resolveEmulatorLivenessVerdict(params) {
32
+ if (params.shellProbe === "answered") {
33
+ return "alive";
34
+ }
35
+ if (!params.isListedByAdb) {
36
+ return "device-gone";
37
+ }
38
+ if (!checkIsEmulatorDeviceId(params.deviceId)) {
39
+ return "guest-unresponsive";
40
+ }
41
+ return params.consoleProbe === "answered" ? "guest-unresponsive" : "emulator-wedged";
42
+ }
43
+ export {
44
+ buildEmulatorLivenessMessage,
45
+ resolveEmulatorLivenessVerdict
46
+ };
47
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWxpdmVuZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBjbGFzc2lmaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBkZXZpY2UgYSBydW4gaXMgYWJvdXQgdG8gZHJpdmUgaXMgc3RpbGxcbiAqICoqdGhlcmUqKiBcdTIwMTQgYW5kLCB3aGVuIGl0IGlzIG5vdCwgd2hpY2ggb2YgdGhlIHR3byB2ZXJ5IGRpZmZlcmVudCB0aGluZ3Mgd2VudFxuICogd3Jvbmc6IHRoZSBndWVzdCBmcm96ZSwgb3IgdGhlIGVtdWxhdG9yIHByb2Nlc3MgaXRzZWxmIGRpZC5cbiAqXG4gKiBUaGUgcmVhZGluZXNzIGdhdGVzIGluIGBkZXZpY2UtcmVhZGluZXNzLnRzYCBhbnN3ZXIgKlwiaXMgdGhlIGd1ZXN0IHJlYWR5XG4gKiB5ZXQ/XCIqLCBhbmQgYm90aCBhcmUgZGVsaWJlcmF0ZWx5IGJlc3QtZWZmb3J0OiB0aGV5IHdhcm4gYW5kIHByb2NlZWQuIE5vdGhpbmdcbiAqIGFza2VkICpcImlzIGl0IHN0aWxsIGFuc3dlcmluZz9cIiogYXQgdGhlIG1vbWVudCB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLCBzbyBhXG4gKiBndWVzdCB0aGF0IHN0b3BwZWQgYW5zd2VyaW5nIGJldHdlZW4gdGhlIGxhc3QgZ2F0ZSBhbmQgYHJlbW90ZSgpYCB3YXMgaGFuZGVkXG4gKiB0byBBcHBpdW0gYW55d2F5LiBXaGF0IHRoZSBvcGVyYXRvciB0aGVuIHNhdyB3YXMgQXBwaXVtJ3Mgb3duIHJlcG9ydDpcbiAqXG4gKiBgYGB0ZXh0XG4gKiBXZWJEcml2ZXJFcnJvcjogRGV2aWNlIGVtdWxhdG9yLTU1NTQgd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlc1xuICogICB3aGVuIHJ1bm5pbmcgXCJodHRwOi8vbG9jYWxob3N0OjQ3MjMvc2Vzc2lvblwiIHdpdGggbWV0aG9kIFwiUE9TVFwiXG4gKiBgYGBcbiAqXG4gKiBcdTIwMTQgbWVhc3VyZWQgb24gdGhpcyBob3N0IDIwMjYtMDktMDUsIGFmdGVyIDUxNXMuIFRoYXQgbmFtZXMgdGhlIGRldmljZSwgYW5kXG4gKiBgYWRiIGRldmljZXNgIHRoZW4gbGlzdHMgdGhlIGRldmljZSBoYXBwaWx5LCBzbyBpdCBzZW5kcyB0aGUgcmVhZGVyIHRvIHRoZSBvbmVcbiAqIGRpYWdub3N0aWMgdGhhdCBjYW5ub3QgaGVscC4gVGhlIHNhbWUgdHJhcCBgd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIudHNgIGV4aXN0cyB0b1xuICogZXNjYXBlLCBvbmUgbGF5ZXIgZnVydGhlciBkb3duLlxuICpcbiAqICMjIFRoZSBjb25zb2xlIGlzIHdoYXQgdGVsbHMgdGhlIHR3byBhcGFydFxuICpcbiAqIGBhZGIgLXMgPGRldmljZT4gZW11IDxjb21tYW5kPmAgaXMgc2VydmVkIGJ5IHRoZSAqKmVtdWxhdG9yJ3Mgb3duIGNvbnNvbGUqKixcbiAqIG5vdCBieSB0aGUgZ3Vlc3QncyBgYWRiZGAuIFNvIHRoZSB0d28gcHJvYmVzIGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLCBhbmRcbiAqIHRoZSBwYWlyIGlzIGEgZGlhZ25vc2lzIHdoZXJlIGVpdGhlciBhbG9uZSBpcyBhIGd1ZXNzOlxuICpcbiAqIHwgYGFkYiBzaGVsbGAgfCBgYWRiIGVtdWAgfCBXaGF0IGl0IG1lYW5zIHxcbiAqIHwgLS0tIHwgLS0tIHwgLS0tIHxcbiAqIHwgc3VjY2VlZHMgfCBcdTIwMTQgfCBBbGl2ZS4gUHJvY2VlZC4gfFxuICogfCBmYWlscyB8IHN1Y2NlZWRzIHwgVGhlICoqZ3Vlc3QqKiBpcyBmcm96ZW4gb3IgdG9vIGJ1c3kgdG8gc2NoZWR1bGUgYGFkYmRgLiB8XG4gKiB8IGZhaWxzIHwgZmFpbHMgfCBUaGUgKiplbXVsYXRvciBwcm9jZXNzKiogaXMgdW5yZWFjaGFibGUuIE5vdGhpbmcgd2lsbCByZWNvdmVyIGl0LiB8XG4gKlxuICogT25seSBhICpzdWNjZXNzZnVsKiBjb25zb2xlIHByb2JlIGNsZWFycyB0aGUgZW11bGF0b3IgXHUyMDE0IHNlZVxuICoge0BsaW5rIEVtdWxhdG9yTGl2ZW5lc3NQcm9iZU91dGNvbWV9IGZvciB3aHkgYSBmYWlsZWQgb25lIGNhbm5vdCBiZSByZWFkIGFzXG4gKiB0aGUgZW11bGF0b3IgYW5zd2VyaW5nLlxuICpcbiAqIE1lYXN1cmVkIDIwMjYtMDktMDUgYWNyb3NzIHNpeCBoYW5kLWJvb3RzIG9uIHRoaXMgaG9zdCBcdTIwMTQgdHdvIEFWRHMgYW5kIGZpdmVcbiAqIGFyZ3VtZW50IHNldHMgXHUyMDE0IGV2ZXJ5IG9uZSBvZiB3aGljaCByZWFjaGVkIHRoZSBib3R0b20gcm93IDY0XHUyMDEzOTJzIGFmdGVyIGJvb3Q6XG4gKlxuICogYGBgdGV4dFxuICogODBzICBlbXVsYXRvciBjb25zb2xlIChRRU1VLCBub3QgdGhlIGd1ZXN0KTogSFVOR1xuICogODBzICBxZW11LXN5c3RlbS14ODZfNjQtaGVhZGxlc3MgKHBpZCAxMDAwNCk6IGNwdT0wJSByc3M9NS44MkdCXG4gKiBgYGBcbiAqXG4gKiAqKjAlIENQVSoqIFx1MjAxNCBibG9ja2VkLCBub3Qgc3Bpbm5pbmcgXHUyMDE0IGFuZCBhIGNvbnNvbGUgdGhhdCBjYW5ub3QgYW5zd2VyLiBUaGF0IGlzXG4gKiB0aGUgUUVNVSBtYWluIGxvb3AsIGJlbG93IGFueXRoaW5nIHRoZSBndWVzdCwgdGhlIEdQVSBzdGFjaywgdGhlIG5ldHdvcmtcbiAqIHNpbXVsYXRvciBvciB0aGUgQVZEJ3Mgc2l6ZSBjYW4gZXhwbGFpbiAoZWFjaCB3YXMgZWxpbWluYXRlZCBieSBtZWFzdXJlbWVudCxcbiAqIG5vdCBieSBhcmd1bWVudCkuIEl0IGFsc28gZXhwbGFpbnMgdGhlIHR3byBkb3duc3RyZWFtIHN5bXB0b21zIHRoYXQgaGFkIGFsd2F5c1xuICogbG9va2VkIGxpa2Ugc2VwYXJhdGUgZmF1bHRzOiBgYWRiIGRldmljZXNgIGtlZXBzIHJlcG9ydGluZyBgZGV2aWNlYCBiZWNhdXNlXG4gKiBub3RoaW5nIGlzIGxlZnQgcnVubmluZyB0byB1cGRhdGUgdGhhdCBzdGF0ZSwgYW5kIHRoZSB0ZWFyZG93bidzXG4gKiBgYWRiIGVtdSBraWxsYCBoYW5ncyBmb3IgaXRzIGZ1bGwgYnVkZ2V0IGJlY2F1c2UgaXQgaXMgYXNraW5nIHRoZSB3ZWRnZWRcbiAqIGNvbnNvbGUgdG8gc2h1dCBpdHNlbGYgZG93bi5cbiAqXG4gKiBUaGUgaGFybmVzcyBhbHJlYWR5ICpvYnNlcnZlZCogdGhlIHNlY29uZCBoYWxmIG9mIHRoaXMgXHUyMDE0IHRlYXJkb3duIGxvZ3NcbiAqIGBFbXVsYXRvciBjb25zb2xlIHNodXRkb3duIGZvciBlbXVsYXRvci01NTU0IGRpZCBub3QgYW5zd2VyYCBcdTIwMTQgYnV0IG9ubHkgYWZ0ZXJcbiAqIHRoZSBydW4gaGFkIGFscmVhZHkgZmFpbGVkIHdpdGggYW4gZXJyb3IgYmxhbWluZyB0aGUgZGV2aWNlLiBUaGlzIG1vZHVsZSBtb3Zlc1xuICogdGhhdCBvYnNlcnZhdGlvbiB0byB3aGVyZSBpdCBjaGFuZ2VzIHRoZSB2ZXJkaWN0IGluc3RlYWQgb2YgYW5ub3RhdGluZyBpdC5cbiAqXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCAoZXhjbHVkZWQgZnJvbVxuICogdW5pdCB0ZXN0cykgc28gdGhlIGNsYXNzaWZpY2F0aW9uIGFuZCB0aGUgbWVzc2FnZSBzdGF5IHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZVxuICogZmFjdG9yeSBpdHNlbGYgc2hlbGxzIG91dCB0byBgYWRiYC5cbiAqL1xuXG5pbXBvcnQgeyBjaGVja0lzRW11bGF0b3JEZXZpY2VJZCB9IGZyb20gJy4vYXZkLXByb2JlLXZlcmRpY3QubWpzJztcbmltcG9ydCB7IGFwcGVuZFByb2Nlc3NPdXRwdXRUYWlsIH0gZnJvbSAnLi9wcm9jZXNzLWV4aXQtbWVzc2FnZS5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZEVtdWxhdG9yTGl2ZW5lc3NNZXNzYWdlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEVtdWxhdG9yTGl2ZW5lc3NNZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgdGhlIHJ1biB3YXMgYWJvdXQgdG8gZHJpdmUuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IncyBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwsIHdoZW4gdGhpcyBydW4gc3RhcnRlZCBpdCAoZW1wdHkgd2hlbiBub25lKS5cbiAgICovXG4gIHJlYWRvbmx5IGVtdWxhdG9yT3V0cHV0OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwZXItcHJvYmUgYnVkZ2V0LCBzbyB0aGUgbWVzc2FnZSBzdGF0ZXMgd2hhdCBcImRpZCBub3QgYW5zd2VyXCIgd2FzIG1lYXN1cmVkIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBwcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBXaGljaCBmYWlsdXJlIHRoaXMgaXMuIGAnYWxpdmUnYCBpcyBub3QgYSBmYWlsdXJlIGFuZCBoYXMgbm8gbWVzc2FnZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6IEV4Y2x1ZGU8RW11bGF0b3JMaXZlbmVzc1ZlcmRpY3QsICdhbGl2ZSc+O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBwcm9iZSBnb3QgYW4gYW5zd2VyIGZyb20gdGhlIHRoaW5nIGl0IHdhcyBhc2tpbmcuXG4gKlxuICogVHdvLXZhbHVlZCBvbiBwdXJwb3NlLiBBbiBlYXJsaWVyIGRyYWZ0IHNwbGl0IGZhaWx1cmVzIGludG8gXCJlcnJvcmVkXCIgYW5kXG4gKiBcInRpbWVkIG91dFwiIGFuZCByZWFkIGFuIGVycm9yZWQgY29uc29sZSBhcyAqdGhlIGVtdWxhdG9yIHNwZWFraW5nLCB3aXRoIGFcbiAqIHJlZnVzYWwqIFx1MjAxNCB3aGljaCBpcyB3cm9uZywgYW5kIHdyb25nIGluIHRoZSBleGFjdCB3YXkgdGhpcyBtb2R1bGUgZXhpc3RzIHRvXG4gKiBhdm9pZC4gYGFkYiAtcyA8ZGV2aWNlPiBlbXUgPGNvbW1hbmQ+YCBpcyByb3V0ZWQgYnkgdGhlICoqYWRiIHNlcnZlcioqOiB3aGVuXG4gKiB0aGUgZGV2aWNlIGlzIGBvZmZsaW5lYCBhZGIgcmVmdXNlcyBvbiB0aGUgc3BvdCBhbmQgbmV2ZXIgcmVhY2hlcyB0aGUgY29uc29sZSxcbiAqIHNvIHRoZSBlcnJvciBpcyBhZGIncywgbm90IHRoZSBlbXVsYXRvcidzLiBNZWFzdXJlZCAyMDI2LTA5LTA1LCB3aGVyZSB0aGF0XG4gKiBkcmFmdCBsb2dnZWQgYHNoZWxsPWVycm9yZWQsIGNvbnNvbGU9ZXJyb3JlZCAtPiBndWVzdC11bnJlc3BvbnNpdmVgIGZvciBhXG4gKiBkZXZpY2Ugd2hvc2UgZW11bGF0b3IgdGhlbiBoYWQgdG8gYmUga2lsbGVkIGJ5IFBJRCBiZWNhdXNlIGBhZGIgZW11IGtpbGxgXG4gKiBjb3VsZCBub3QgcmVhY2ggaXQgZWl0aGVyLiBPbmx5IGEgKipzdWNjZXNzZnVsKiogcHJvYmUgaXMgYW4gYW5zd2VyLlxuICovXG5leHBvcnQgdHlwZSBFbXVsYXRvckxpdmVuZXNzUHJvYmVPdXRjb21lID0gJ2Fuc3dlcmVkJyB8ICduby1hbnN3ZXInO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBzdGlsbCB1c2FibGUsIGFuZCBpZiBub3QsIHdoaWNoIGxheWVyIGZhaWxlZC5cbiAqXG4gKiAtIGAnYWxpdmUnYCBcdTIwMTQgdGhlIGd1ZXN0IGFuc3dlcmVkLiBQcm9jZWVkLlxuICogLSBgJ2RldmljZS1nb25lJ2AgXHUyMDE0IHRoZSBob3N0J3MgYWRiIG5vIGxvbmdlciBsaXN0cyBpdCBhdCBhbGwuXG4gKiAtIGAnZW11bGF0b3Itd2VkZ2VkJ2AgXHUyMDE0IG5laXRoZXIgdGhlIGd1ZXN0IG5vciB0aGUgZW11bGF0b3IncyBvd24gY29uc29sZVxuICogICBhbnN3ZXJzLiBUaGUgZW11bGF0b3IgcHJvY2VzcyBpcyBzdHVjazsgcmV0cnlpbmcgYW55dGhpbmcgYWdhaW5zdCB0aGlzXG4gKiAgIGRldmljZSBjYW5ub3Qgc3VjY2VlZC5cbiAqIC0gYCdndWVzdC11bnJlc3BvbnNpdmUnYCBcdTIwMTQgdGhlIGNvbnNvbGUgYW5zd2VycyBidXQgdGhlIGd1ZXN0IGRvZXMgbm90LCBzbyB0aGVcbiAqICAgZW11bGF0b3IgaXMgYWxpdmUgYW5kIHRoZSBndWVzdCBpcyBmcm96ZW4gb3Igc3RhcnZlZC5cbiAqL1xuZXhwb3J0IHR5cGUgRW11bGF0b3JMaXZlbmVzc1ZlcmRpY3QgPSAnYWxpdmUnIHwgJ2RldmljZS1nb25lJyB8ICdlbXVsYXRvci13ZWRnZWQnIHwgJ2d1ZXN0LXVucmVzcG9uc2l2ZSc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYGFkYiAtcyA8ZGV2aWNlPiBlbXUgYXZkIHN0YXR1c2Agc3VjY2VlZGVkIFx1MjAxNCByZWFjaGluZyB0aGVcbiAgICogKiplbXVsYXRvciBjb25zb2xlKiosIHNlcnZlZCBieSB0aGUgZW11bGF0b3IgcHJvY2VzcyByYXRoZXIgdGhhbiBieSB0aGVcbiAgICogZ3Vlc3QuXG4gICAqXG4gICAqIE1lYW5pbmdmdWwgb25seSBmb3IgYW4gYGVtdWxhdG9yLTxwb3J0PmAgZGV2aWNlOiB0aGUgY29uc29sZSBmYWlscyBhZ2FpbnN0IGFcbiAgICogcGh5c2ljYWwgaGFuZHNldCBob3dldmVyIGhlYWx0aHkgaXQgaXMsIHdoaWNoIGlzIHdoeSBhIG5vbi1lbXVsYXRvciBpcyBuZXZlclxuICAgKiBjb252aWN0ZWQgb24gaXQgKHRoZSB0cmFwIGBhdmQtcHJvYmUtdmVyZGljdC50c2AgZG9jdW1lbnRzKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnNvbGVQcm9iZTogRW11bGF0b3JMaXZlbmVzc1Byb2JlT3V0Y29tZTtcblxuICAvKipcbiAgVGhlIGRldmljZSB0aGUgcnVuIGlzIGFib3V0IHRvIGRyaXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgV2hldGhlciB0aGUgaG9zdCdzIGBhZGIgZGV2aWNlc2Agc3RpbGwgbGlzdHMgdGhlIGRldmljZSBpbiBhbnkgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBpc0xpc3RlZEJ5QWRiOiBib29sZWFuO1xuXG4gIC8qKlxuICBXaGF0IGBhZGIgLXMgPGRldmljZT4gc2hlbGwgdHJ1ZWAgYW5zd2VyZWQgXHUyMDE0IHRoZSAqKmd1ZXN0KiosIHZpYSBgYWRiZGAuXG4gICAqL1xuICByZWFkb25seSBzaGVsbFByb2JlOiBFbXVsYXRvckxpdmVuZXNzUHJvYmVPdXRjb21lO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBmb3IgYSBkZXZpY2UgdGhhdCBzdG9wcGVkIGFuc3dlcmluZywgbmFtaW5nIHRoZSBsYXllciB0aGF0XG4gKiBmYWlsZWQgYW5kIHRoZSBldmlkZW5jZSBmb3IgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2ZXJkaWN0LCB0aGUgZGV2aWNlLCB0aGUgcHJvYmUgYnVkZ2V0IGFuZCB0aGUgZW11bGF0b3IncyBvdXRwdXQuXG4gKiBAcmV0dXJucyBUaGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JMaXZlbmVzc01lc3NhZ2UocGFyYW1zOiBCdWlsZEVtdWxhdG9yTGl2ZW5lc3NNZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgYnVkZ2V0ID0gYCR7U3RyaW5nKHBhcmFtcy5wcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXNgO1xuXG4gIC8qXG4gICAqIEEgYFJlY29yZGAga2V5ZWQgYnkgdGhlIHZlcmRpY3QgcmF0aGVyIHRoYW4gYSBgc3dpdGNoYDogZXhoYXVzdGl2ZW5lc3MgY29tZXNcbiAgICogZnJvbSB0aGUgdHlwZSwgd2l0aCBubyB1bnJlYWNoYWJsZSBgZGVmYXVsdGAgYXJtIHRvIGV4cGxhaW4gb3IgdG8gY292ZXIuXG4gICAqIFNhbWUgc2hhcGUgYXMgYHJlc29sdmVSZW1lZHlBZHZpY2VgIGluIGB3ZWRnZWQtYXBwaXVtLXNlcnZlci50c2AuXG4gICAqL1xuICBjb25zdCBkaWFnbm9zaXM6IFJlY29yZDxFeGNsdWRlPEVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0LCAnYWxpdmUnPiwgc3RyaW5nW10+ID0ge1xuICAgICdkZXZpY2UtZ29uZSc6IFtcbiAgICAgICdUaGUgaG9zdFxcJ3MgYGFkYiBkZXZpY2VzYCBubyBsb25nZXIgbGlzdHMgaXQsIHNvIGl0IGlzIG5vIGxvbmdlciBzZXJ2aW5nIGFkYiBhdCBhbGwuJyxcbiAgICAgICdFaXRoZXIgdGhlIGVtdWxhdG9yIGV4aXRlZCwgb3IgaXQgd2VkZ2VkIGJhZGx5IGVub3VnaCB0byBkcm9wIG9mZiBhZGIgXHUyMDE0IHRoZSBlbXVsYXRvciBvdXRwdXQgYmVsb3cgaXMgdGhlIGJlc3QgZXZpZGVuY2UgZm9yIHdoaWNoLicsXG4gICAgICAnQW4gZW11bGF0b3IgdGhpcyBydW4gc3RhcnRlZCBpcyByZXBsYWNlZCBhdXRvbWF0aWNhbGx5IG9uY2UsIHNvIHNlZWluZyB0aGlzIG1lYW5zIHRoZSByZXBsYWNlbWVudCBkaWQgbm90IHN1cnZpdmUgZWl0aGVyLiBDaGVjayB0aGF0IG5vdGhpbmcgZWxzZSBvbiB0aGlzIGhvc3Qgc3RvcHMgZW11bGF0b3JzLCBhbmQgdGhhdCB0aGUgZW11bGF0b3IgYnVpbGQgYW5kIHN5c3RlbSBpbWFnZSBhcmUgc291bmQuJ1xuICAgIF0sXG4gICAgJ2VtdWxhdG9yLXdlZGdlZCc6IFtcbiAgICAgIGBOZWl0aGVyIHRoZSBndWVzdCAoXFxgYWRiIC1zICR7cGFyYW1zLmRldmljZUlkfSBzaGVsbFxcYCkgbm9yIHRoZSBlbXVsYXRvcidzIG93biBjb25zb2xlIChcXGBhZGIgLXMgJHtwYXJhbXMuZGV2aWNlSWR9IGVtdSBhdmQgc3RhdHVzXFxgKSBhbnN3ZXJlZCB3aXRoaW4gJHtidWRnZXR9LmAsXG4gICAgICAnVGhlIGNvbnNvbGUgaXMgc2VydmVkIGJ5IHRoZSBlbXVsYXRvciBwcm9jZXNzLCBub3QgYnkgdGhlIGd1ZXN0LCBzbyBpdHMgc2lsZW5jZSBtZWFucyB0aGUgRU1VTEFUT1IgaXMgd2VkZ2VkIFx1MjAxNCBub3QgdGhlIGd1ZXN0LCBub3QgdGhlIEFwcGl1bSBzZXJ2ZXIsIGFuZCBub3QgdGhlIGRldmljZSBiZWluZyBhYnNlbnQuJyxcbiAgICAgICdgYWRiIGRldmljZXNgIHdpbGwgc3RpbGwgbGlzdCB0aGlzIGRldmljZSBhbmQgd2lsbCBtaXNsZWFkIHlvdTogbm90aGluZyBpcyBsZWZ0IHJ1bm5pbmcgdG8gdXBkYXRlIHRoYXQgc3RhdGUuJyxcbiAgICAgICdBIHdlZGdlZCBlbXVsYXRvciBkb2VzIG5vdCBjb21lIGJhY2ssIHNvIHJldHJ5aW5nIHRoZSBzZXNzaW9uIGFnYWluc3QgaXQgY2Fubm90IHN1Y2NlZWQuIE9uZSB0aGlzIHJ1biBzdGFydGVkIGlzIHJlcGxhY2VkIHdpdGggYSBmcmVzaCBib290IGF1dG9tYXRpY2FsbHksIHdoaWNoIG1lYW5zIHNlZWluZyB0aGlzIG1lc3NhZ2UgaXMgdGhlIHJlcGxhY2VtZW50IGZhaWxpbmcgdG9vLicsXG4gICAgICAnSWYgaXQgcmVjdXJzIGF0IHRoZSBzYW1lIHBvaW50IGluIGV2ZXJ5IHJ1biwgdGhlIGZhdWx0IGlzIGJlbG93IHRoZSBoYXJuZXNzIFx1MjAxNCBhbmQgdGhlIGZpcnN0IHRoaW5nIHRvIGNoZWNrIGlzIHdoYXQgZmlsdGVycyB0aGlzIGhvc3RcXCdzIHNvY2tldHMuIEVuZHBvaW50LXNlY3VyaXR5LCBjb250ZW50LWJsb2NraW5nIGFuZCBWUE4gcHJvZHVjdHMgaW5zdGFsbCBzb2NrZXQgZmlsdGVyIGRyaXZlcnMgaW4gdGhlIHBhdGggb2YgZXZlcnkgc29ja2V0IGNhbGwgdGhlIGVtdWxhdG9yIG1ha2VzLCB0aGUgY29uc29sZVxcJ3MgbG9jYWxob3N0IGNvbm5lY3Rpb24gaW5jbHVkZWQ7IHN0b3BwaW5nIHRoYXQgc2VydmljZSBoYXMgZml4ZWQgZXhhY3RseSB0aGlzIHNpZ25hdHVyZS4gQWZ0ZXIgdGhhdCwgdGhlIGVtdWxhdG9yIGJ1aWxkLCB0aGUgc3lzdGVtIGltYWdlIGFuZCB0aGUgaG9zdCBoeXBlcnZpc29yLidcbiAgICBdLFxuICAgICdndWVzdC11bnJlc3BvbnNpdmUnOiBbXG4gICAgICBgVGhlIGd1ZXN0IChcXGBhZGIgLXMgJHtwYXJhbXMuZGV2aWNlSWR9IHNoZWxsXFxgKSBkaWQgbm90IGFuc3dlciB3aXRoaW4gJHtidWRnZXR9LCBidXQgdGhlIGVtdWxhdG9yJ3Mgb3duIGNvbnNvbGUgZGlkLmAsXG4gICAgICAnU28gdGhlIGVtdWxhdG9yIHByb2Nlc3MgaXMgaGVhbHRoeSBhbmQgdGhlIGd1ZXN0IGlzIGZyb3plbiBvciB0b28gc3RhcnZlZCB0byBzY2hlZHVsZSBgYWRiZGAuJyxcbiAgICAgICdBIGNvbnRlbmRlZCBob3N0IGlzIHRoZSB1c3VhbCBjYXVzZTsgYGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNgIGlzIHRoZSBidWRnZXQgdGhhdCBnb3Zlcm5zIHdhaXRpbmcgb25lIG91dC4nLFxuICAgICAgJ0J1dCBpZiBpdCByZWN1cnMgYXQgdGhlIHNhbWUgcG9pbnQgaW4gZXZlcnkgcnVuLCBubyB0aW1lb3V0IHdpbGwgZml4IGl0LCBhbmQgdGhlIGhvc3QgaXMgbm90IG1lcmVseSBidXN5LiBDaGVjayB3aGF0IGZpbHRlcnMgdGhpcyBob3N0XFwncyBzb2NrZXRzIGZpcnN0IFx1MjAxNCBhIGNvbnRlbnQtYmxvY2tpbmcsIGVuZHBvaW50LXNlY3VyaXR5IG9yIFZQTiBzb2NrZXQgZmlsdGVyIGRyaXZlciBwcm9kdWNlcyB0aGlzIHZlcmRpY3QgYXMgcmVhZGlseSBhcyBpdCBwcm9kdWNlcyBhIGZ1bGx5IHdlZGdlZCBlbXVsYXRvciBcdTIwMTQgdGhlbiB0aGUgZW11bGF0b3IgYnVpbGQsIHRoZSBzeXN0ZW0gaW1hZ2UgYW5kIHRoZSBob3N0IGh5cGVydmlzb3IuJ1xuICAgIF1cbiAgfTtcblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgRGV2aWNlICR7cGFyYW1zLmRldmljZUlkfSBzdG9wcGVkIGFuc3dlcmluZyBiZWZvcmUgdGhlIEFwcGl1bSBzZXNzaW9uIGNvdWxkIGJlIGVzdGFibGlzaGVkLmAsXG4gICAgLi4uZGlhZ25vc2lzW3BhcmFtcy52ZXJkaWN0XVxuICBdO1xuXG4gIHJldHVybiBhcHBlbmRQcm9jZXNzT3V0cHV0VGFpbChsaW5lcy5qb2luKCdcXG4nKSwgeyBvdXRwdXQ6IHBhcmFtcy5lbXVsYXRvck91dHB1dCwgb3V0cHV0TGFiZWw6ICdFbXVsYXRvciBvdXRwdXQnIH0pO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciB0aGUgZGV2aWNlIGlzIHN0aWxsIHVzYWJsZSwgYW5kIHdoaWNoIGxheWVyIGZhaWxlZCB3aGVuIGl0IGlzXG4gKiBub3QuXG4gKlxuICogQSBndWVzdCB0aGF0IGFuc3dlcnMgc2V0dGxlcyBpdCBvbiBpdHMgb3duIFx1MjAxNCBhIGNvbnNvbGUgcHJvYmUgaXMgb25seSBjb25zdWx0ZWRcbiAqIHdoZW4gdGhlIGd1ZXN0IGhhcyBhbHJlYWR5IGdvbmUgcXVpZXQsIHNvIGEgaGVhbHRoeSBydW4gbmV2ZXIgcGF5cyBmb3IgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFdoYXQgZWFjaCBwcm9iZSBhbnN3ZXJlZCwgYW5kIHdoZXRoZXIgYWRiIHN0aWxsIGxpc3RzIHRoZSBkZXZpY2UuXG4gKiBAcmV0dXJucyBUaGUgdmVyZGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdChwYXJhbXM6IFJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdFBhcmFtcyk6IEVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0IHtcbiAgaWYgKHBhcmFtcy5zaGVsbFByb2JlID09PSAnYW5zd2VyZWQnKSB7XG4gICAgcmV0dXJuICdhbGl2ZSc7XG4gIH1cblxuICBpZiAoIXBhcmFtcy5pc0xpc3RlZEJ5QWRiKSB7XG4gICAgcmV0dXJuICdkZXZpY2UtZ29uZSc7XG4gIH1cblxuICAvKlxuICAgKiBgYWRiIFx1MjAyNiBlbXVgIGVycm9ycyBhZ2FpbnN0IGEgcGh5c2ljYWwgaGFuZHNldCBob3dldmVyIGhlYWx0aHkgaXQgaXMsIHNvIGl0c1xuICAgKiBzaWxlbmNlIGlzIG5vdCBldmlkZW5jZSB0aGVyZS4gT25seSBhbiBgZW11bGF0b3ItPHBvcnQ+YCBkZXZpY2UgaGFzIGFcbiAgICogY29uc29sZSB3aG9zZSBzaWxlbmNlIGNhbiBjb252aWN0IGl0IFx1MjAxNCB0aGUgc2FtZSByZXN0cmFpbnQgYGNsYXNzaWZ5QXZkUHJvYmVgXG4gICAqIHNob3dzIGluIG5ldmVyIHByb2JpbmcgYSBub24tZW11bGF0b3IgYXQgYWxsLlxuICAgKi9cbiAgaWYgKCFjaGVja0lzRW11bGF0b3JEZXZpY2VJZChwYXJhbXMuZGV2aWNlSWQpKSB7XG4gICAgcmV0dXJuICdndWVzdC11bnJlc3BvbnNpdmUnO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5jb25zb2xlUHJvYmUgPT09ICdhbnN3ZXJlZCcgPyAnZ3Vlc3QtdW5yZXNwb25zaXZlJyA6ICdlbXVsYXRvci13ZWRnZWQnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBa0VBLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsK0JBQStCO0FBNkZqQyxTQUFTLDZCQUE2QixRQUFvRDtBQUMvRixRQUFNLFNBQVMsR0FBRyxPQUFPLE9BQU8sMEJBQTBCLENBQUM7QUFPM0QsUUFBTSxZQUF5RTtBQUFBLElBQzdFLGVBQWU7QUFBQSxNQUNiO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFDQSxtQkFBbUI7QUFBQSxNQUNqQiwrQkFBK0IsT0FBTyxRQUFRLHNEQUFzRCxPQUFPLFFBQVEsc0NBQXNDLE1BQU07QUFBQSxNQUMvSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLHNCQUFzQjtBQUFBLE1BQ3BCLHVCQUF1QixPQUFPLFFBQVEsbUNBQW1DLE1BQU07QUFBQSxNQUMvRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQVE7QUFBQSxJQUNaLFVBQVUsT0FBTyxRQUFRO0FBQUEsSUFDekIsR0FBRyxVQUFVLE9BQU8sT0FBTztBQUFBLEVBQzdCO0FBRUEsU0FBTyx3QkFBd0IsTUFBTSxLQUFLLElBQUksR0FBRyxFQUFFLFFBQVEsT0FBTyxnQkFBZ0IsYUFBYSxrQkFBa0IsQ0FBQztBQUNwSDtBQVlPLFNBQVMsK0JBQStCLFFBQXVFO0FBQ3BILE1BQUksT0FBTyxlQUFlLFlBQVk7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLENBQUMsT0FBTyxlQUFlO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBUUEsTUFBSSxDQUFDLHdCQUF3QixPQUFPLFFBQVEsR0FBRztBQUM3QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sT0FBTyxpQkFBaUIsYUFBYSx1QkFBdUI7QUFDckU7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure helpers for locating and describing an AVD's saved boot snapshot.
5
+ *
6
+ * Only the opt-in `shouldReuseEmulatorSnapshot` path resumes one, and even then
7
+ * its age is worth a log line: a snapshot is the one input to a run that no gate
8
+ * inspects, and the failure a rotten one produces — a guest that serves adb,
9
+ * accepts a uiautomator2 session and then drops `offline` about half a minute
10
+ * later — reads as a code regression rather than as stale state. `emulator
11
+ * -avd … -no-snapshot-load` (the default) makes the question moot; when the
12
+ * caller has deliberately traded that away, *"resuming snapshot saved <date>"*
13
+ * is what keeps the trade visible in the transcript.
14
+ *
15
+ * Kept separate from the integration-only `transport-factory` so the path
16
+ * derivation and the wording stay unit-testable — the factory itself does the
17
+ * `stat`.
18
+ */
19
+ /**
20
+ * Parameters for {@link buildAvdSnapshotDirectoryCandidates}.
21
+ */
22
+ export interface BuildAvdSnapshotDirectoryCandidatesParams {
23
+ /**
24
+ The Android Virtual Device name.
25
+ */
26
+ readonly avdName: string;
27
+ /**
28
+ The process environment, read for the Android SDK's AVD-home overrides.
29
+ */
30
+ readonly environment: Readonly<Record<string, string | undefined>>;
31
+ /**
32
+ The user's home directory, the base of the default AVD home.
33
+ */
34
+ readonly homeDirectory: string;
35
+ }
36
+ /**
37
+ * Parameters for {@link buildSnapshotAgeMessage}.
38
+ */
39
+ export interface BuildSnapshotAgeMessageParams {
40
+ /**
41
+ The Android Virtual Device name.
42
+ */
43
+ readonly avdName: string;
44
+ /**
45
+ When the snapshot was last written, or `undefined` when none was found.
46
+ */
47
+ readonly savedAt?: Date | undefined;
48
+ }
49
+ /**
50
+ * Builds the directories the AVD's boot snapshot could live in, most specific
51
+ * first.
52
+ *
53
+ * The lookup mirrors the emulator's own: `ANDROID_AVD_HOME` wins outright, then
54
+ * `.android/avd` under `ANDROID_SDK_HOME`, then under the user's home. Returning
55
+ * candidates rather than one path keeps the `stat` — and the decision that a
56
+ * miss is not an error — in the caller.
57
+ *
58
+ * @param params - The AVD name, the environment, and the home directory.
59
+ * @returns The candidate snapshot directories, most specific first.
60
+ */
61
+ export declare function buildAvdSnapshotDirectoryCandidates(params: BuildAvdSnapshotDirectoryCandidatesParams): string[];
62
+ /**
63
+ * Builds the line logged when a run has opted into resuming a snapshot.
64
+ *
65
+ * @param params - The AVD name and the snapshot's save time, if it was found.
66
+ * @returns The log line.
67
+ */
68
+ export declare function buildSnapshotAgeMessage(params: BuildSnapshotAgeMessageParams): string;
@@ -0,0 +1,32 @@
1
+ const DEFAULT_SNAPSHOT_NAME = "default_boot";
2
+ const AVD_HOME_SEGMENTS = [".android", "avd"];
3
+ const TRAILING_SEPARATOR_PATTERN = /[/\\]+$/;
4
+ function buildAvdSnapshotDirectoryCandidates(params) {
5
+ const { avdName, environment, homeDirectory } = params;
6
+ const avdHomes = [
7
+ environment["ANDROID_AVD_HOME"],
8
+ resolveAvdHomeUnder(environment["ANDROID_SDK_HOME"]),
9
+ resolveAvdHomeUnder(homeDirectory)
10
+ ];
11
+ return avdHomes.filter((avdHome) => avdHome !== void 0 && avdHome.length > 0).map((avdHome) => joinPath(avdHome, `${avdName}.avd`, "snapshots", DEFAULT_SNAPSHOT_NAME));
12
+ }
13
+ function buildSnapshotAgeMessage(params) {
14
+ if (params.savedAt === void 0) {
15
+ return `Snapshot reuse is enabled for AVD "${params.avdName}", but no \`${DEFAULT_SNAPSHOT_NAME}\` snapshot was found \u2014 this run cold-boots and saves one for the next.`;
16
+ }
17
+ return `Snapshot reuse is enabled for AVD "${params.avdName}": resuming \`${DEFAULT_SNAPSHOT_NAME}\` saved ${params.savedAt.toISOString()}.`;
18
+ }
19
+ function joinPath(base, ...segments) {
20
+ return [base.replace(TRAILING_SEPARATOR_PATTERN, ""), ...segments].join("/");
21
+ }
22
+ function resolveAvdHomeUnder(base) {
23
+ if (base === void 0 || base.length === 0) {
24
+ return void 0;
25
+ }
26
+ return joinPath(base, ...AVD_HOME_SEGMENTS);
27
+ }
28
+ export {
29
+ buildAvdSnapshotDirectoryCandidates,
30
+ buildSnapshotAgeMessage
31
+ };
32
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLXNuYXBzaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBoZWxwZXJzIGZvciBsb2NhdGluZyBhbmQgZGVzY3JpYmluZyBhbiBBVkQncyBzYXZlZCBib290IHNuYXBzaG90LlxuICpcbiAqIE9ubHkgdGhlIG9wdC1pbiBgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90YCBwYXRoIHJlc3VtZXMgb25lLCBhbmQgZXZlbiB0aGVuXG4gKiBpdHMgYWdlIGlzIHdvcnRoIGEgbG9nIGxpbmU6IGEgc25hcHNob3QgaXMgdGhlIG9uZSBpbnB1dCB0byBhIHJ1biB0aGF0IG5vIGdhdGVcbiAqIGluc3BlY3RzLCBhbmQgdGhlIGZhaWx1cmUgYSByb3R0ZW4gb25lIHByb2R1Y2VzIFx1MjAxNCBhIGd1ZXN0IHRoYXQgc2VydmVzIGFkYixcbiAqIGFjY2VwdHMgYSB1aWF1dG9tYXRvcjIgc2Vzc2lvbiBhbmQgdGhlbiBkcm9wcyBgb2ZmbGluZWAgYWJvdXQgaGFsZiBhIG1pbnV0ZVxuICogbGF0ZXIgXHUyMDE0IHJlYWRzIGFzIGEgY29kZSByZWdyZXNzaW9uIHJhdGhlciB0aGFuIGFzIHN0YWxlIHN0YXRlLiBgZW11bGF0b3JcbiAqIC1hdmQgXHUyMDI2IC1uby1zbmFwc2hvdC1sb2FkYCAodGhlIGRlZmF1bHQpIG1ha2VzIHRoZSBxdWVzdGlvbiBtb290OyB3aGVuIHRoZVxuICogY2FsbGVyIGhhcyBkZWxpYmVyYXRlbHkgdHJhZGVkIHRoYXQgYXdheSwgKlwicmVzdW1pbmcgc25hcHNob3Qgc2F2ZWQgPGRhdGU+XCIqXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSB0cmFkZSB2aXNpYmxlIGluIHRoZSB0cmFuc2NyaXB0LlxuICpcbiAqIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXRoXG4gKiBkZXJpdmF0aW9uIGFuZCB0aGUgd29yZGluZyBzdGF5IHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZiBkb2VzIHRoZVxuICogYHN0YXRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkQXZkU25hcHNob3REaXJlY3RvcnlDYW5kaWRhdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEF2ZFNuYXBzaG90RGlyZWN0b3J5Q2FuZGlkYXRlc1BhcmFtcyB7XG4gIC8qKlxuICBUaGUgQW5kcm9pZCBWaXJ0dWFsIERldmljZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvY2VzcyBlbnZpcm9ubWVudCwgcmVhZCBmb3IgdGhlIEFuZHJvaWQgU0RLJ3MgQVZELWhvbWUgb3ZlcnJpZGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuXG4gIC8qKlxuICBUaGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCB0aGUgYmFzZSBvZiB0aGUgZGVmYXVsdCBBVkQgaG9tZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvbWVEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU25hcHNob3RBZ2VNZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoZW4gdGhlIHNuYXBzaG90IHdhcyBsYXN0IHdyaXR0ZW4sIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9uZSB3YXMgZm91bmQuXG4gICAqL1xuICByZWFkb25seSBzYXZlZEF0PzogRGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgc25hcHNob3QgdGhlIGVtdWxhdG9yIGxvYWRzIGFuZCBzYXZlcyBieSBkZWZhdWx0LlxuICovXG5jb25zdCBERUZBVUxUX1NOQVBTSE9UX05BTUUgPSAnZGVmYXVsdF9ib290JztcblxuLyoqXG4gKiBUaGUgZGlyZWN0b3J5IHRoZSBBbmRyb2lkIFNESyBrZWVwcyBBVkRzIGluLCB1bmRlciB3aGljaGV2ZXIgaG9tZSBhcHBsaWVzLlxuICovXG5jb25zdCBBVkRfSE9NRV9TRUdNRU5UUyA9IFsnLmFuZHJvaWQnLCAnYXZkJ107XG5jb25zdCBUUkFJTElOR19TRVBBUkFUT1JfUEFUVEVSTiA9IC9bL1xcXFxdKyQvO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZGlyZWN0b3JpZXMgdGhlIEFWRCdzIGJvb3Qgc25hcHNob3QgY291bGQgbGl2ZSBpbiwgbW9zdCBzcGVjaWZpY1xuICogZmlyc3QuXG4gKlxuICogVGhlIGxvb2t1cCBtaXJyb3JzIHRoZSBlbXVsYXRvcidzIG93bjogYEFORFJPSURfQVZEX0hPTUVgIHdpbnMgb3V0cmlnaHQsIHRoZW5cbiAqIGAuYW5kcm9pZC9hdmRgIHVuZGVyIGBBTkRST0lEX1NES19IT01FYCwgdGhlbiB1bmRlciB0aGUgdXNlcidzIGhvbWUuIFJldHVybmluZ1xuICogY2FuZGlkYXRlcyByYXRoZXIgdGhhbiBvbmUgcGF0aCBrZWVwcyB0aGUgYHN0YXRgIFx1MjAxNCBhbmQgdGhlIGRlY2lzaW9uIHRoYXQgYVxuICogbWlzcyBpcyBub3QgYW4gZXJyb3IgXHUyMDE0IGluIHRoZSBjYWxsZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQgbmFtZSwgdGhlIGVudmlyb25tZW50LCBhbmQgdGhlIGhvbWUgZGlyZWN0b3J5LlxuICogQHJldHVybnMgVGhlIGNhbmRpZGF0ZSBzbmFwc2hvdCBkaXJlY3RvcmllcywgbW9zdCBzcGVjaWZpYyBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXZkU25hcHNob3REaXJlY3RvcnlDYW5kaWRhdGVzKHBhcmFtczogQnVpbGRBdmRTbmFwc2hvdERpcmVjdG9yeUNhbmRpZGF0ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZW52aXJvbm1lbnQsIGhvbWVEaXJlY3RvcnkgfSA9IHBhcmFtcztcblxuICBjb25zdCBhdmRIb21lcyA9IFtcbiAgICBlbnZpcm9ubWVudFsnQU5EUk9JRF9BVkRfSE9NRSddLFxuICAgIHJlc29sdmVBdmRIb21lVW5kZXIoZW52aXJvbm1lbnRbJ0FORFJPSURfU0RLX0hPTUUnXSksXG4gICAgcmVzb2x2ZUF2ZEhvbWVVbmRlcihob21lRGlyZWN0b3J5KVxuICBdO1xuXG4gIHJldHVybiBhdmRIb21lc1xuICAgIC5maWx0ZXIoKGF2ZEhvbWUpOiBhdmRIb21lIGlzIHN0cmluZyA9PiBhdmRIb21lICE9PSB1bmRlZmluZWQgJiYgYXZkSG9tZS5sZW5ndGggPiAwKVxuICAgIC5tYXAoKGF2ZEhvbWUpID0+IGpvaW5QYXRoKGF2ZEhvbWUsIGAke2F2ZE5hbWV9LmF2ZGAsICdzbmFwc2hvdHMnLCBERUZBVUxUX1NOQVBTSE9UX05BTUUpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGxpbmUgbG9nZ2VkIHdoZW4gYSBydW4gaGFzIG9wdGVkIGludG8gcmVzdW1pbmcgYSBzbmFwc2hvdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIEFWRCBuYW1lIGFuZCB0aGUgc25hcHNob3QncyBzYXZlIHRpbWUsIGlmIGl0IHdhcyBmb3VuZC5cbiAqIEByZXR1cm5zIFRoZSBsb2cgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU25hcHNob3RBZ2VNZXNzYWdlKHBhcmFtczogQnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGFyYW1zLnNhdmVkQXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgU25hcHNob3QgcmV1c2UgaXMgZW5hYmxlZCBmb3IgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIiwgYnV0IG5vIFxcYCR7REVGQVVMVF9TTkFQU0hPVF9OQU1FfVxcYCBzbmFwc2hvdCB3YXMgZm91bmQgXHUyMDE0IHRoaXMgcnVuIGNvbGQtYm9vdHMgYW5kIHNhdmVzIG9uZSBmb3IgdGhlIG5leHQuYDtcbiAgfVxuXG4gIHJldHVybiBgU25hcHNob3QgcmV1c2UgaXMgZW5hYmxlZCBmb3IgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIjogcmVzdW1pbmcgXFxgJHtERUZBVUxUX1NOQVBTSE9UX05BTUV9XFxgIHNhdmVkICR7cGFyYW1zLnNhdmVkQXQudG9JU09TdHJpbmcoKX0uYDtcbn1cblxuLyoqXG4gKiBKb2lucyBwYXRoIHNlZ21lbnRzIHdpdGggYC9gLCB3aGljaCBldmVyeSBwbGF0Zm9ybSdzIHBhdGggQVBJcyBhY2NlcHQuXG4gKlxuICogQHBhcmFtIGJhc2UgLSBUaGUgbGVhZGluZyBzZWdtZW50LCB3aG9zZSB0cmFpbGluZyBzZXBhcmF0b3JzIGFyZSBkcm9wcGVkLlxuICogQHBhcmFtIHNlZ21lbnRzIC0gVGhlIHNlZ21lbnRzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIFRoZSBqb2luZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gam9pblBhdGgoYmFzZTogc3RyaW5nLCAuLi5zZWdtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gW2Jhc2UucmVwbGFjZShUUkFJTElOR19TRVBBUkFUT1JfUEFUVEVSTiwgJycpLCAuLi5zZWdtZW50c10uam9pbignLycpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBBVkQgaG9tZSB1bmRlciBhIGJhc2UgZGlyZWN0b3J5LCB3aGVuIHRoZXJlIGlzIG9uZS5cbiAqXG4gKiBAcGFyYW0gYmFzZSAtIGBBTkRST0lEX1NES19IT01FYCBvciB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LlxuICogQHJldHVybnMgVGhlIEFWRCBob21lLCBvciBgdW5kZWZpbmVkYCB3aGVuIGBiYXNlYCBpcyB1bnNldC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF2ZEhvbWVVbmRlcihiYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoYmFzZSA9PT0gdW5kZWZpbmVkIHx8IGJhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBqb2luUGF0aChiYXNlLCAuLi5BVkRfSE9NRV9TRUdNRU5UUyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUF5REEsTUFBTSx3QkFBd0I7QUFLOUIsTUFBTSxvQkFBb0IsQ0FBQyxZQUFZLEtBQUs7QUFDNUMsTUFBTSw2QkFBNkI7QUFjNUIsU0FBUyxvQ0FBb0MsUUFBNkQ7QUFDL0csUUFBTSxFQUFFLFNBQVMsYUFBYSxjQUFjLElBQUk7QUFFaEQsUUFBTSxXQUFXO0FBQUEsSUFDZixZQUFZLGtCQUFrQjtBQUFBLElBQzlCLG9CQUFvQixZQUFZLGtCQUFrQixDQUFDO0FBQUEsSUFDbkQsb0JBQW9CLGFBQWE7QUFBQSxFQUNuQztBQUVBLFNBQU8sU0FDSixPQUFPLENBQUMsWUFBK0IsWUFBWSxVQUFhLFFBQVEsU0FBUyxDQUFDLEVBQ2xGLElBQUksQ0FBQyxZQUFZLFNBQVMsU0FBUyxHQUFHLE9BQU8sUUFBUSxhQUFhLHFCQUFxQixDQUFDO0FBQzdGO0FBUU8sU0FBUyx3QkFBd0IsUUFBK0M7QUFDckYsTUFBSSxPQUFPLFlBQVksUUFBVztBQUNoQyxXQUFPLHNDQUFzQyxPQUFPLE9BQU8sZUFBZSxxQkFBcUI7QUFBQSxFQUNqRztBQUVBLFNBQU8sc0NBQXNDLE9BQU8sT0FBTyxpQkFBaUIscUJBQXFCLFlBQVksT0FBTyxRQUFRLFlBQVksQ0FBQztBQUMzSTtBQVNBLFNBQVMsU0FBUyxTQUFpQixVQUE0QjtBQUM3RCxTQUFPLENBQUMsS0FBSyxRQUFRLDRCQUE0QixFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsS0FBSyxHQUFHO0FBQzdFO0FBUUEsU0FBUyxvQkFBb0IsTUFBOEM7QUFDekUsTUFBSSxTQUFTLFVBQWEsS0FBSyxXQUFXLEdBQUc7QUFDM0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLFNBQVMsTUFBTSxHQUFHLGlCQUFpQjtBQUM1QzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -26,8 +26,8 @@ export interface CoreSetupParams {
26
26
  * Whether to install and enable the built plugin in the temp vault. Defaults
27
27
  * to `true`. Set to `false` for a **non-plugin** consumer (e.g. a typings
28
28
  * crawler) that only needs a registered, empty vault to `evalInObsidian`
29
- * against: the plugin `dist`/`manifest.json` read, the copy into
30
- * `.obsidian/plugins`, the `community-plugins.json` write, and the enable step
29
+ * against: the plugin `dist`/`manifest.json` read, the copy into the config
30
+ * folder's `plugins/`, the `community-plugins.json` write, and the enable step
31
31
  * are all skipped, while the transport, temp vault, registration, and
32
32
  * worker-facing endpoint provisioning still run unchanged.
33
33
  */
@@ -37,6 +37,11 @@ export interface CoreSetupParams {
37
37
  * its startup scan indexes them in one pass (see {@link TemporaryVault.populate}).
38
38
  * Use this for large fixtures — writing thousands of notes after open and
39
39
  * forcing a re-scan is far slower and less reliable.
40
+ *
41
+ * Keys naming the config folder are written as `.obsidian/…`; under a
42
+ * `configDirectory` override {@link remapConfigDirectoryKeys} redirects them to
43
+ * the folder the vault will actually read, so a map does not have to carry a
44
+ * second copy of the override.
40
45
  */
41
46
  readonly populate?: PopulateFilesParams | undefined;
42
47
  /**
@@ -87,6 +92,26 @@ export declare function coreSetup(params?: CoreSetupParams): Promise<CoreSetupRe
87
92
  * @param result - The result from {@link coreSetup}. When `undefined`, does nothing.
88
93
  */
89
94
  export declare function coreTeardown(result?: CoreSetupResult): Promise<void>;
95
+ /**
96
+ * Redirects a populate map's config-folder entries to the folder the vault will actually read.
97
+ *
98
+ * A populate map names its destinations vault-relative, and everything that builds one — including
99
+ * `buildDemoVaultPopulate`, which seeds `.obsidian/*` config files and injected community plugins'
100
+ * binaries — writes them under a literal `.obsidian/`, because that is the folder Obsidian uses when nothing
101
+ * overrides it. Under a `configDirectory` override those entries land in a folder the vault never opens, and
102
+ * the plugins seeded that way come back as the generic "enabled but not loaded" with nothing naming a config
103
+ * folder. Rewriting the key here fixes every consumer at once — a hand-written map as much as a demo vault's
104
+ * — and needs no second copy of the override for a caller to keep in sync with their transport options.
105
+ *
106
+ * Safe rather than magic: the vault is one the harness made for this run and has exactly one config folder,
107
+ * so under an override a `.obsidian/` entry is dead weight nothing reads. Only a leading `.obsidian` path
108
+ * SEGMENT moves; a note whose name merely contains the string does not.
109
+ *
110
+ * @param populate - The consumer's populate map.
111
+ * @param configDirectory - The resolved override, or `undefined` for Obsidian's default (a no-op).
112
+ * @returns The map with its config-folder keys redirected, or the original map when there is nothing to move.
113
+ */
114
+ export declare function remapConfigDirectoryKeys(populate: PopulateFilesParams, configDirectory: string | undefined): PopulateFilesParams;
90
115
  /**
91
116
  * Resolves transport options for an integration run.
92
117
  *