obsidian-integration-testing 12.0.0 → 12.1.1

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 (212) 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/adb.cjs +61 -0
  4. package/dist/lib/cjs/adb.d.cts +61 -0
  5. package/dist/lib/cjs/android-sdk.cjs +52 -0
  6. package/dist/lib/cjs/android-sdk.d.cts +29 -0
  7. package/dist/lib/cjs/app-startup-progress.cjs +87 -0
  8. package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
  9. package/dist/lib/cjs/appium-server-marker.cjs +29 -32
  10. package/dist/lib/cjs/appium-server-marker.d.cts +22 -0
  11. package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
  12. package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
  13. package/dist/lib/cjs/community-plugin-registry.cjs +1 -1
  14. package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
  15. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  16. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  17. package/dist/lib/cjs/config-directory.cjs +46 -0
  18. package/dist/lib/cjs/config-directory.d.cts +45 -0
  19. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  20. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  21. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  22. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
  23. package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
  24. package/dist/lib/cjs/device-readiness.cjs +38 -3
  25. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  26. package/dist/lib/cjs/device-screenshot.cjs +42 -0
  27. package/dist/lib/cjs/device-screenshot.d.cts +36 -0
  28. package/dist/lib/cjs/device-setting-restore.cjs +45 -0
  29. package/dist/lib/cjs/device-setting-restore.d.cts +60 -0
  30. package/dist/lib/cjs/device-settings-command.cjs +49 -0
  31. package/dist/lib/cjs/device-settings-command.d.cts +76 -0
  32. package/dist/lib/cjs/device-settings.cjs +88 -0
  33. package/dist/lib/cjs/device-settings.d.cts +94 -0
  34. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  35. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  36. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  37. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  38. package/dist/lib/cjs/emulator-device-id.cjs +32 -0
  39. package/dist/lib/cjs/emulator-device-id.d.cts +49 -0
  40. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  41. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  42. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  43. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  44. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  45. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  46. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  47. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  48. package/dist/lib/cjs/index.cjs +67 -3
  49. package/dist/lib/cjs/index.d.cts +24 -1
  50. package/dist/lib/cjs/library.cjs +1 -1
  51. package/dist/lib/cjs/mobile-input.cjs +14 -2
  52. package/dist/lib/cjs/mobile-input.d.cts +5 -9
  53. package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
  54. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  55. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  56. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  57. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  58. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  59. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  60. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  61. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  62. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  63. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  64. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  65. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  66. package/dist/lib/cjs/port-owner.cjs +61 -0
  67. package/dist/lib/cjs/port-owner.d.cts +47 -0
  68. package/dist/lib/cjs/process-capture.cjs +62 -0
  69. package/dist/lib/cjs/process-capture.d.cts +83 -0
  70. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  71. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  72. package/dist/lib/cjs/process-liveness.cjs +51 -0
  73. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  74. package/dist/lib/cjs/resolve-emulator-device-id.cjs +54 -0
  75. package/dist/lib/cjs/resolve-emulator-device-id.d.cts +28 -0
  76. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  77. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  78. package/dist/lib/cjs/soft-keyboard-geometry.cjs +75 -0
  79. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +156 -0
  80. package/dist/lib/cjs/soft-keyboard.cjs +118 -0
  81. package/dist/lib/cjs/soft-keyboard.d.cts +82 -0
  82. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  83. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  84. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  85. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  86. package/dist/lib/cjs/transport-appium.cjs +102 -17
  87. package/dist/lib/cjs/transport-appium.d.cts +53 -3
  88. package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
  89. package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
  90. package/dist/lib/cjs/transport-factory.cjs +951 -133
  91. package/dist/lib/cjs/transport-options.cjs +11 -3
  92. package/dist/lib/cjs/transport-options.d.cts +131 -12
  93. package/dist/lib/cjs/transport.cjs +1 -1
  94. package/dist/lib/cjs/transport.d.cts +7 -1
  95. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  96. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  97. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  98. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  99. package/dist/lib/cjs/version-matrix.cjs +1 -1
  100. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  101. package/dist/lib/cjs/webview-cdp.cjs +6 -7
  102. package/dist/lib/cjs/webview-cdp.d.cts +5 -1
  103. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  104. package/dist/lib/esm/adb-device-list.mjs +28 -0
  105. package/dist/lib/esm/adb.d.mts +61 -0
  106. package/dist/lib/esm/adb.mjs +35 -0
  107. package/dist/lib/esm/android-sdk.d.mts +29 -0
  108. package/dist/lib/esm/android-sdk.mjs +18 -0
  109. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  110. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  111. package/dist/lib/esm/appium-server-marker.d.mts +22 -0
  112. package/dist/lib/esm/appium-server-marker.mjs +28 -22
  113. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  114. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  115. package/dist/lib/esm/community-plugin-registry.d.mts +1 -1
  116. package/dist/lib/esm/community-plugin-registry.mjs +1 -1
  117. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  118. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  119. package/dist/lib/esm/config-directory.d.mts +45 -0
  120. package/dist/lib/esm/config-directory.mjs +21 -0
  121. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  122. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  123. package/dist/lib/esm/demo-vault-bootstrap.d.mts +3 -2
  124. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  125. package/dist/lib/esm/demo-vault-populate.mjs +3 -2
  126. package/dist/lib/esm/device-readiness.d.mts +83 -9
  127. package/dist/lib/esm/device-readiness.mjs +34 -2
  128. package/dist/lib/esm/device-screenshot.d.mts +36 -0
  129. package/dist/lib/esm/device-screenshot.mjs +18 -0
  130. package/dist/lib/esm/device-setting-restore.d.mts +60 -0
  131. package/dist/lib/esm/device-setting-restore.mjs +20 -0
  132. package/dist/lib/esm/device-settings-command.d.mts +76 -0
  133. package/dist/lib/esm/device-settings-command.mjs +23 -0
  134. package/dist/lib/esm/device-settings.d.mts +94 -0
  135. package/dist/lib/esm/device-settings.mjs +67 -0
  136. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  137. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  138. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  139. package/dist/lib/esm/emulator-backend.mjs +45 -0
  140. package/dist/lib/esm/emulator-device-id.d.mts +49 -0
  141. package/dist/lib/esm/emulator-device-id.mjs +8 -0
  142. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  143. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  144. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  145. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  146. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  147. package/dist/lib/esm/global-setup-core.mjs +34 -35
  148. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  149. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  150. package/dist/lib/esm/index.d.mts +24 -1
  151. package/dist/lib/esm/index.mjs +68 -2
  152. package/dist/lib/esm/library.mjs +1 -1
  153. package/dist/lib/esm/mobile-input.d.mts +5 -9
  154. package/dist/lib/esm/mobile-input.mjs +14 -2
  155. package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
  156. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  157. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  158. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  159. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  160. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  161. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  162. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  163. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  164. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  165. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  166. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  167. package/dist/lib/esm/parent-liveness.mjs +42 -5
  168. package/dist/lib/esm/port-owner.d.mts +47 -0
  169. package/dist/lib/esm/port-owner.mjs +36 -0
  170. package/dist/lib/esm/process-capture.d.mts +83 -0
  171. package/dist/lib/esm/process-capture.mjs +38 -0
  172. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  173. package/dist/lib/esm/process-exit-message.mjs +13 -8
  174. package/dist/lib/esm/process-liveness.d.mts +18 -0
  175. package/dist/lib/esm/process-liveness.mjs +17 -0
  176. package/dist/lib/esm/resolve-emulator-device-id.d.mts +28 -0
  177. package/dist/lib/esm/resolve-emulator-device-id.mjs +33 -0
  178. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  179. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  180. package/dist/lib/esm/soft-keyboard-geometry.d.mts +156 -0
  181. package/dist/lib/esm/soft-keyboard-geometry.mjs +47 -0
  182. package/dist/lib/esm/soft-keyboard.d.mts +82 -0
  183. package/dist/lib/esm/soft-keyboard.mjs +91 -0
  184. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  185. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  186. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  187. package/dist/lib/esm/temporary-vault.mjs +43 -8
  188. package/dist/lib/esm/transport-appium.d.mts +53 -3
  189. package/dist/lib/esm/transport-appium.mjs +108 -17
  190. package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
  191. package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
  192. package/dist/lib/esm/transport-factory.mjs +995 -138
  193. package/dist/lib/esm/transport-options.d.mts +131 -12
  194. package/dist/lib/esm/transport-options.mjs +9 -2
  195. package/dist/lib/esm/transport.d.mts +7 -1
  196. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  197. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  198. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  199. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  200. package/dist/lib/esm/version-matrix.d.mts +2 -2
  201. package/dist/lib/esm/version-matrix.mjs +1 -1
  202. package/dist/lib/esm/webview-cdp.d.mts +5 -1
  203. package/dist/lib/esm/webview-cdp.mjs +6 -7
  204. package/package.json +26 -24
  205. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  206. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  207. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  208. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  209. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  210. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  211. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  212. 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,57 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var emulator_snapshot_exports = {};
20
+ __export(emulator_snapshot_exports, {
21
+ buildAvdSnapshotDirectoryCandidates: () => buildAvdSnapshotDirectoryCandidates,
22
+ buildSnapshotAgeMessage: () => buildSnapshotAgeMessage
23
+ });
24
+ module.exports = __toCommonJS(emulator_snapshot_exports);
25
+ const DEFAULT_SNAPSHOT_NAME = "default_boot";
26
+ const AVD_HOME_SEGMENTS = [".android", "avd"];
27
+ const TRAILING_SEPARATOR_PATTERN = /[/\\]+$/;
28
+ function buildAvdSnapshotDirectoryCandidates(params) {
29
+ const { avdName, environment, homeDirectory } = params;
30
+ const avdHomes = [
31
+ environment["ANDROID_AVD_HOME"],
32
+ resolveAvdHomeUnder(environment["ANDROID_SDK_HOME"]),
33
+ resolveAvdHomeUnder(homeDirectory)
34
+ ];
35
+ return avdHomes.filter((avdHome) => avdHome !== void 0 && avdHome.length > 0).map((avdHome) => joinPath(avdHome, `${avdName}.avd`, "snapshots", DEFAULT_SNAPSHOT_NAME));
36
+ }
37
+ function buildSnapshotAgeMessage(params) {
38
+ if (params.savedAt === void 0) {
39
+ 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.`;
40
+ }
41
+ return `Snapshot reuse is enabled for AVD "${params.avdName}": resuming \`${DEFAULT_SNAPSHOT_NAME}\` saved ${params.savedAt.toISOString()}.`;
42
+ }
43
+ function joinPath(base, ...segments) {
44
+ return [base.replace(TRAILING_SEPARATOR_PATTERN, ""), ...segments].join("/");
45
+ }
46
+ function resolveAvdHomeUnder(base) {
47
+ if (base === void 0 || base.length === 0) {
48
+ return void 0;
49
+ }
50
+ return joinPath(base, ...AVD_HOME_SEGMENTS);
51
+ }
52
+ // Annotate the CommonJS export names for ESM import in node:
53
+ 0 && (module.exports = {
54
+ buildAvdSnapshotDirectoryCandidates,
55
+ buildSnapshotAgeMessage
56
+ });
57
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLXNuYXBzaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBoZWxwZXJzIGZvciBsb2NhdGluZyBhbmQgZGVzY3JpYmluZyBhbiBBVkQncyBzYXZlZCBib290IHNuYXBzaG90LlxuICpcbiAqIE9ubHkgdGhlIG9wdC1pbiBgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90YCBwYXRoIHJlc3VtZXMgb25lLCBhbmQgZXZlbiB0aGVuXG4gKiBpdHMgYWdlIGlzIHdvcnRoIGEgbG9nIGxpbmU6IGEgc25hcHNob3QgaXMgdGhlIG9uZSBpbnB1dCB0byBhIHJ1biB0aGF0IG5vIGdhdGVcbiAqIGluc3BlY3RzLCBhbmQgdGhlIGZhaWx1cmUgYSByb3R0ZW4gb25lIHByb2R1Y2VzIFx1MjAxNCBhIGd1ZXN0IHRoYXQgc2VydmVzIGFkYixcbiAqIGFjY2VwdHMgYSB1aWF1dG9tYXRvcjIgc2Vzc2lvbiBhbmQgdGhlbiBkcm9wcyBgb2ZmbGluZWAgYWJvdXQgaGFsZiBhIG1pbnV0ZVxuICogbGF0ZXIgXHUyMDE0IHJlYWRzIGFzIGEgY29kZSByZWdyZXNzaW9uIHJhdGhlciB0aGFuIGFzIHN0YWxlIHN0YXRlLiBgZW11bGF0b3JcbiAqIC1hdmQgXHUyMDI2IC1uby1zbmFwc2hvdC1sb2FkYCAodGhlIGRlZmF1bHQpIG1ha2VzIHRoZSBxdWVzdGlvbiBtb290OyB3aGVuIHRoZVxuICogY2FsbGVyIGhhcyBkZWxpYmVyYXRlbHkgdHJhZGVkIHRoYXQgYXdheSwgKlwicmVzdW1pbmcgc25hcHNob3Qgc2F2ZWQgPGRhdGU+XCIqXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSB0cmFkZSB2aXNpYmxlIGluIHRoZSB0cmFuc2NyaXB0LlxuICpcbiAqIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXRoXG4gKiBkZXJpdmF0aW9uIGFuZCB0aGUgd29yZGluZyBzdGF5IHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZiBkb2VzIHRoZVxuICogYHN0YXRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkQXZkU25hcHNob3REaXJlY3RvcnlDYW5kaWRhdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEF2ZFNuYXBzaG90RGlyZWN0b3J5Q2FuZGlkYXRlc1BhcmFtcyB7XG4gIC8qKlxuICBUaGUgQW5kcm9pZCBWaXJ0dWFsIERldmljZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvY2VzcyBlbnZpcm9ubWVudCwgcmVhZCBmb3IgdGhlIEFuZHJvaWQgU0RLJ3MgQVZELWhvbWUgb3ZlcnJpZGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuXG4gIC8qKlxuICBUaGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCB0aGUgYmFzZSBvZiB0aGUgZGVmYXVsdCBBVkQgaG9tZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvbWVEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU25hcHNob3RBZ2VNZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoZW4gdGhlIHNuYXBzaG90IHdhcyBsYXN0IHdyaXR0ZW4sIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9uZSB3YXMgZm91bmQuXG4gICAqL1xuICByZWFkb25seSBzYXZlZEF0PzogRGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgc25hcHNob3QgdGhlIGVtdWxhdG9yIGxvYWRzIGFuZCBzYXZlcyBieSBkZWZhdWx0LlxuICovXG5jb25zdCBERUZBVUxUX1NOQVBTSE9UX05BTUUgPSAnZGVmYXVsdF9ib290JztcblxuLyoqXG4gKiBUaGUgZGlyZWN0b3J5IHRoZSBBbmRyb2lkIFNESyBrZWVwcyBBVkRzIGluLCB1bmRlciB3aGljaGV2ZXIgaG9tZSBhcHBsaWVzLlxuICovXG5jb25zdCBBVkRfSE9NRV9TRUdNRU5UUyA9IFsnLmFuZHJvaWQnLCAnYXZkJ107XG5jb25zdCBUUkFJTElOR19TRVBBUkFUT1JfUEFUVEVSTiA9IC9bL1xcXFxdKyQvO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZGlyZWN0b3JpZXMgdGhlIEFWRCdzIGJvb3Qgc25hcHNob3QgY291bGQgbGl2ZSBpbiwgbW9zdCBzcGVjaWZpY1xuICogZmlyc3QuXG4gKlxuICogVGhlIGxvb2t1cCBtaXJyb3JzIHRoZSBlbXVsYXRvcidzIG93bjogYEFORFJPSURfQVZEX0hPTUVgIHdpbnMgb3V0cmlnaHQsIHRoZW5cbiAqIGAuYW5kcm9pZC9hdmRgIHVuZGVyIGBBTkRST0lEX1NES19IT01FYCwgdGhlbiB1bmRlciB0aGUgdXNlcidzIGhvbWUuIFJldHVybmluZ1xuICogY2FuZGlkYXRlcyByYXRoZXIgdGhhbiBvbmUgcGF0aCBrZWVwcyB0aGUgYHN0YXRgIFx1MjAxNCBhbmQgdGhlIGRlY2lzaW9uIHRoYXQgYVxuICogbWlzcyBpcyBub3QgYW4gZXJyb3IgXHUyMDE0IGluIHRoZSBjYWxsZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQgbmFtZSwgdGhlIGVudmlyb25tZW50LCBhbmQgdGhlIGhvbWUgZGlyZWN0b3J5LlxuICogQHJldHVybnMgVGhlIGNhbmRpZGF0ZSBzbmFwc2hvdCBkaXJlY3RvcmllcywgbW9zdCBzcGVjaWZpYyBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXZkU25hcHNob3REaXJlY3RvcnlDYW5kaWRhdGVzKHBhcmFtczogQnVpbGRBdmRTbmFwc2hvdERpcmVjdG9yeUNhbmRpZGF0ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZW52aXJvbm1lbnQsIGhvbWVEaXJlY3RvcnkgfSA9IHBhcmFtcztcblxuICBjb25zdCBhdmRIb21lcyA9IFtcbiAgICBlbnZpcm9ubWVudFsnQU5EUk9JRF9BVkRfSE9NRSddLFxuICAgIHJlc29sdmVBdmRIb21lVW5kZXIoZW52aXJvbm1lbnRbJ0FORFJPSURfU0RLX0hPTUUnXSksXG4gICAgcmVzb2x2ZUF2ZEhvbWVVbmRlcihob21lRGlyZWN0b3J5KVxuICBdO1xuXG4gIHJldHVybiBhdmRIb21lc1xuICAgIC5maWx0ZXIoKGF2ZEhvbWUpOiBhdmRIb21lIGlzIHN0cmluZyA9PiBhdmRIb21lICE9PSB1bmRlZmluZWQgJiYgYXZkSG9tZS5sZW5ndGggPiAwKVxuICAgIC5tYXAoKGF2ZEhvbWUpID0+IGpvaW5QYXRoKGF2ZEhvbWUsIGAke2F2ZE5hbWV9LmF2ZGAsICdzbmFwc2hvdHMnLCBERUZBVUxUX1NOQVBTSE9UX05BTUUpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGxpbmUgbG9nZ2VkIHdoZW4gYSBydW4gaGFzIG9wdGVkIGludG8gcmVzdW1pbmcgYSBzbmFwc2hvdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIEFWRCBuYW1lIGFuZCB0aGUgc25hcHNob3QncyBzYXZlIHRpbWUsIGlmIGl0IHdhcyBmb3VuZC5cbiAqIEByZXR1cm5zIFRoZSBsb2cgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU25hcHNob3RBZ2VNZXNzYWdlKHBhcmFtczogQnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGFyYW1zLnNhdmVkQXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgU25hcHNob3QgcmV1c2UgaXMgZW5hYmxlZCBmb3IgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIiwgYnV0IG5vIFxcYCR7REVGQVVMVF9TTkFQU0hPVF9OQU1FfVxcYCBzbmFwc2hvdCB3YXMgZm91bmQgXHUyMDE0IHRoaXMgcnVuIGNvbGQtYm9vdHMgYW5kIHNhdmVzIG9uZSBmb3IgdGhlIG5leHQuYDtcbiAgfVxuXG4gIHJldHVybiBgU25hcHNob3QgcmV1c2UgaXMgZW5hYmxlZCBmb3IgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIjogcmVzdW1pbmcgXFxgJHtERUZBVUxUX1NOQVBTSE9UX05BTUV9XFxgIHNhdmVkICR7cGFyYW1zLnNhdmVkQXQudG9JU09TdHJpbmcoKX0uYDtcbn1cblxuLyoqXG4gKiBKb2lucyBwYXRoIHNlZ21lbnRzIHdpdGggYC9gLCB3aGljaCBldmVyeSBwbGF0Zm9ybSdzIHBhdGggQVBJcyBhY2NlcHQuXG4gKlxuICogQHBhcmFtIGJhc2UgLSBUaGUgbGVhZGluZyBzZWdtZW50LCB3aG9zZSB0cmFpbGluZyBzZXBhcmF0b3JzIGFyZSBkcm9wcGVkLlxuICogQHBhcmFtIHNlZ21lbnRzIC0gVGhlIHNlZ21lbnRzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIFRoZSBqb2luZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gam9pblBhdGgoYmFzZTogc3RyaW5nLCAuLi5zZWdtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gW2Jhc2UucmVwbGFjZShUUkFJTElOR19TRVBBUkFUT1JfUEFUVEVSTiwgJycpLCAuLi5zZWdtZW50c10uam9pbignLycpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBBVkQgaG9tZSB1bmRlciBhIGJhc2UgZGlyZWN0b3J5LCB3aGVuIHRoZXJlIGlzIG9uZS5cbiAqXG4gKiBAcGFyYW0gYmFzZSAtIGBBTkRST0lEX1NES19IT01FYCBvciB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LlxuICogQHJldHVybnMgVGhlIEFWRCBob21lLCBvciBgdW5kZWZpbmVkYCB3aGVuIGBiYXNlYCBpcyB1bnNldC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF2ZEhvbWVVbmRlcihiYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoYmFzZSA9PT0gdW5kZWZpbmVkIHx8IGJhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBqb2luUGF0aChiYXNlLCAuLi5BVkRfSE9NRV9TRUdNRU5UUyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5REEsTUFBTSx3QkFBd0I7QUFLOUIsTUFBTSxvQkFBb0IsQ0FBQyxZQUFZLEtBQUs7QUFDNUMsTUFBTSw2QkFBNkI7QUFjNUIsU0FBUyxvQ0FBb0MsUUFBNkQ7QUFDL0csUUFBTSxFQUFFLFNBQVMsYUFBYSxjQUFjLElBQUk7QUFFaEQsUUFBTSxXQUFXO0FBQUEsSUFDZixZQUFZLGtCQUFrQjtBQUFBLElBQzlCLG9CQUFvQixZQUFZLGtCQUFrQixDQUFDO0FBQUEsSUFDbkQsb0JBQW9CLGFBQWE7QUFBQSxFQUNuQztBQUVBLFNBQU8sU0FDSixPQUFPLENBQUMsWUFBK0IsWUFBWSxVQUFhLFFBQVEsU0FBUyxDQUFDLEVBQ2xGLElBQUksQ0FBQyxZQUFZLFNBQVMsU0FBUyxHQUFHLE9BQU8sUUFBUSxhQUFhLHFCQUFxQixDQUFDO0FBQzdGO0FBUU8sU0FBUyx3QkFBd0IsUUFBK0M7QUFDckYsTUFBSSxPQUFPLFlBQVksUUFBVztBQUNoQyxXQUFPLHNDQUFzQyxPQUFPLE9BQU8sZUFBZSxxQkFBcUI7QUFBQSxFQUNqRztBQUVBLFNBQU8sc0NBQXNDLE9BQU8sT0FBTyxpQkFBaUIscUJBQXFCLFlBQVksT0FBTyxRQUFRLFlBQVksQ0FBQztBQUMzSTtBQVNBLFNBQVMsU0FBUyxTQUFpQixVQUE0QjtBQUM3RCxTQUFPLENBQUMsS0FBSyxRQUFRLDRCQUE0QixFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsS0FBSyxHQUFHO0FBQzdFO0FBUUEsU0FBUyxvQkFBb0IsTUFBOEM7QUFDekUsTUFBSSxTQUFTLFVBQWEsS0FBSyxXQUFXLEdBQUc7QUFDM0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLFNBQVMsTUFBTSxHQUFHLGlCQUFpQjtBQUM1QzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -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;