@monoes/monobrowse 1.0.6 → 1.0.7

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 (248) hide show
  1. package/README.md +68 -0
  2. package/dist/src/__tests__/adapters.test.d.ts +2 -0
  3. package/dist/src/__tests__/adapters.test.d.ts.map +1 -0
  4. package/dist/src/__tests__/adapters.test.js +104 -0
  5. package/dist/src/__tests__/adapters.test.js.map +1 -0
  6. package/dist/src/__tests__/batch-eval-parsing.test.d.ts +0 -0
  7. package/dist/src/__tests__/batch-eval-parsing.test.d.ts.map +0 -0
  8. package/dist/src/__tests__/batch-eval-parsing.test.js +0 -0
  9. package/dist/src/__tests__/batch-eval-parsing.test.js.map +0 -0
  10. package/dist/src/__tests__/box-model.test.d.ts +0 -0
  11. package/dist/src/__tests__/box-model.test.d.ts.map +0 -0
  12. package/dist/src/__tests__/box-model.test.js +0 -0
  13. package/dist/src/__tests__/box-model.test.js.map +0 -0
  14. package/dist/src/__tests__/browser-launch.test.d.ts +0 -0
  15. package/dist/src/__tests__/browser-launch.test.d.ts.map +0 -0
  16. package/dist/src/__tests__/browser-launch.test.js +0 -0
  17. package/dist/src/__tests__/browser-launch.test.js.map +0 -0
  18. package/dist/src/__tests__/cdp-client.test.d.ts +2 -0
  19. package/dist/src/__tests__/cdp-client.test.d.ts.map +1 -0
  20. package/dist/src/__tests__/cdp-client.test.js +326 -0
  21. package/dist/src/__tests__/cdp-client.test.js.map +1 -0
  22. package/dist/src/__tests__/close-browser.test.d.ts +2 -0
  23. package/dist/src/__tests__/close-browser.test.d.ts.map +1 -0
  24. package/dist/src/__tests__/close-browser.test.js +128 -0
  25. package/dist/src/__tests__/close-browser.test.js.map +1 -0
  26. package/dist/src/__tests__/console-log.test.d.ts +2 -0
  27. package/dist/src/__tests__/console-log.test.d.ts.map +1 -0
  28. package/dist/src/__tests__/console-log.test.js +195 -0
  29. package/dist/src/__tests__/console-log.test.js.map +1 -0
  30. package/dist/src/__tests__/find.test.d.ts +2 -0
  31. package/dist/src/__tests__/find.test.d.ts.map +1 -0
  32. package/dist/src/__tests__/find.test.js +299 -0
  33. package/dist/src/__tests__/find.test.js.map +1 -0
  34. package/dist/src/__tests__/frame-command.test.d.ts +2 -0
  35. package/dist/src/__tests__/frame-command.test.d.ts.map +1 -0
  36. package/dist/src/__tests__/frame-command.test.js +85 -0
  37. package/dist/src/__tests__/frame-command.test.js.map +1 -0
  38. package/dist/src/__tests__/output.test.d.ts +0 -0
  39. package/dist/src/__tests__/output.test.d.ts.map +0 -0
  40. package/dist/src/__tests__/output.test.js +0 -0
  41. package/dist/src/__tests__/output.test.js.map +0 -0
  42. package/dist/src/__tests__/ref-cache.test.d.ts +0 -0
  43. package/dist/src/__tests__/ref-cache.test.d.ts.map +0 -0
  44. package/dist/src/__tests__/ref-cache.test.js +43 -2
  45. package/dist/src/__tests__/ref-cache.test.js.map +1 -1
  46. package/dist/src/__tests__/session-state.test.d.ts +2 -0
  47. package/dist/src/__tests__/session-state.test.d.ts.map +1 -0
  48. package/dist/src/__tests__/session-state.test.js +203 -0
  49. package/dist/src/__tests__/session-state.test.js.map +1 -0
  50. package/dist/src/__tests__/snapshot.test.d.ts +2 -0
  51. package/dist/src/__tests__/snapshot.test.d.ts.map +1 -0
  52. package/dist/src/__tests__/snapshot.test.js +262 -0
  53. package/dist/src/__tests__/snapshot.test.js.map +1 -0
  54. package/dist/src/__tests__/storage-eval.test.d.ts +2 -0
  55. package/dist/src/__tests__/storage-eval.test.d.ts.map +1 -0
  56. package/dist/src/__tests__/storage-eval.test.js +133 -0
  57. package/dist/src/__tests__/storage-eval.test.js.map +1 -0
  58. package/dist/src/__tests__/tabs.test.d.ts +2 -0
  59. package/dist/src/__tests__/tabs.test.d.ts.map +1 -0
  60. package/dist/src/__tests__/tabs.test.js +161 -0
  61. package/dist/src/__tests__/tabs.test.js.map +1 -0
  62. package/dist/src/browser/action-builder/analyzer.d.ts +0 -0
  63. package/dist/src/browser/action-builder/analyzer.d.ts.map +0 -0
  64. package/dist/src/browser/action-builder/analyzer.js +0 -0
  65. package/dist/src/browser/action-builder/analyzer.js.map +0 -0
  66. package/dist/src/browser/action-builder/types.d.ts +0 -0
  67. package/dist/src/browser/action-builder/types.d.ts.map +0 -0
  68. package/dist/src/browser/action-builder/types.js +0 -0
  69. package/dist/src/browser/action-builder/types.js.map +0 -0
  70. package/dist/src/browser/actions.d.ts +0 -0
  71. package/dist/src/browser/actions.d.ts.map +0 -0
  72. package/dist/src/browser/actions.js +0 -0
  73. package/dist/src/browser/actions.js.map +0 -0
  74. package/dist/src/browser/adapters/gemini.d.ts +0 -0
  75. package/dist/src/browser/adapters/gemini.d.ts.map +0 -0
  76. package/dist/src/browser/adapters/gemini.js +0 -0
  77. package/dist/src/browser/adapters/gemini.js.map +0 -0
  78. package/dist/src/browser/adapters/google.d.ts +0 -0
  79. package/dist/src/browser/adapters/google.d.ts.map +0 -0
  80. package/dist/src/browser/adapters/google.js +0 -0
  81. package/dist/src/browser/adapters/google.js.map +0 -0
  82. package/dist/src/browser/adapters/index.d.ts +0 -0
  83. package/dist/src/browser/adapters/index.d.ts.map +0 -0
  84. package/dist/src/browser/adapters/index.js +0 -0
  85. package/dist/src/browser/adapters/index.js.map +0 -0
  86. package/dist/src/browser/adapters/instagram.d.ts +0 -0
  87. package/dist/src/browser/adapters/instagram.d.ts.map +0 -0
  88. package/dist/src/browser/adapters/instagram.js +0 -0
  89. package/dist/src/browser/adapters/instagram.js.map +0 -0
  90. package/dist/src/browser/adapters/linkedin.d.ts +0 -0
  91. package/dist/src/browser/adapters/linkedin.d.ts.map +0 -0
  92. package/dist/src/browser/adapters/linkedin.js +0 -0
  93. package/dist/src/browser/adapters/linkedin.js.map +0 -0
  94. package/dist/src/browser/adapters/microsoft.d.ts +0 -0
  95. package/dist/src/browser/adapters/microsoft.d.ts.map +0 -0
  96. package/dist/src/browser/adapters/microsoft.js +0 -0
  97. package/dist/src/browser/adapters/microsoft.js.map +0 -0
  98. package/dist/src/browser/adapters/x.d.ts +0 -0
  99. package/dist/src/browser/adapters/x.d.ts.map +0 -0
  100. package/dist/src/browser/adapters/x.js +0 -0
  101. package/dist/src/browser/adapters/x.js.map +0 -0
  102. package/dist/src/browser/batch.d.ts +0 -0
  103. package/dist/src/browser/batch.d.ts.map +0 -0
  104. package/dist/src/browser/batch.js +0 -0
  105. package/dist/src/browser/batch.js.map +0 -0
  106. package/dist/src/browser/browser.d.ts +4 -0
  107. package/dist/src/browser/browser.d.ts.map +1 -1
  108. package/dist/src/browser/browser.js +55 -7
  109. package/dist/src/browser/browser.js.map +1 -1
  110. package/dist/src/browser/cdp.d.ts +4 -1
  111. package/dist/src/browser/cdp.d.ts.map +1 -1
  112. package/dist/src/browser/cdp.js +45 -16
  113. package/dist/src/browser/cdp.js.map +1 -1
  114. package/dist/src/browser/console-log.d.ts +0 -0
  115. package/dist/src/browser/console-log.d.ts.map +0 -0
  116. package/dist/src/browser/console-log.js +0 -0
  117. package/dist/src/browser/console-log.js.map +0 -0
  118. package/dist/src/browser/dashboard/api-types.d.ts +0 -0
  119. package/dist/src/browser/dashboard/api-types.d.ts.map +0 -0
  120. package/dist/src/browser/dashboard/api-types.js +0 -0
  121. package/dist/src/browser/dashboard/api-types.js.map +0 -0
  122. package/dist/src/browser/dashboard/server.d.ts +0 -0
  123. package/dist/src/browser/dashboard/server.d.ts.map +0 -0
  124. package/dist/src/browser/dashboard/server.js +0 -0
  125. package/dist/src/browser/dashboard/server.js.map +0 -0
  126. package/dist/src/browser/dialog.d.ts +0 -0
  127. package/dist/src/browser/dialog.d.ts.map +0 -0
  128. package/dist/src/browser/dialog.js +0 -0
  129. package/dist/src/browser/dialog.js.map +0 -0
  130. package/dist/src/browser/emulation.d.ts +0 -0
  131. package/dist/src/browser/emulation.d.ts.map +0 -0
  132. package/dist/src/browser/emulation.js +0 -0
  133. package/dist/src/browser/emulation.js.map +0 -0
  134. package/dist/src/browser/find.d.ts +0 -0
  135. package/dist/src/browser/find.d.ts.map +0 -0
  136. package/dist/src/browser/find.js +0 -0
  137. package/dist/src/browser/find.js.map +0 -0
  138. package/dist/src/browser/har.d.ts +0 -0
  139. package/dist/src/browser/har.d.ts.map +0 -0
  140. package/dist/src/browser/har.js +0 -0
  141. package/dist/src/browser/har.js.map +0 -0
  142. package/dist/src/browser/index.d.ts +0 -0
  143. package/dist/src/browser/index.d.ts.map +0 -0
  144. package/dist/src/browser/index.js +0 -0
  145. package/dist/src/browser/index.js.map +0 -0
  146. package/dist/src/browser/network.d.ts +0 -0
  147. package/dist/src/browser/network.d.ts.map +0 -0
  148. package/dist/src/browser/network.js +0 -0
  149. package/dist/src/browser/network.js.map +0 -0
  150. package/dist/src/browser/pdf.d.ts +0 -0
  151. package/dist/src/browser/pdf.d.ts.map +0 -0
  152. package/dist/src/browser/pdf.js +0 -0
  153. package/dist/src/browser/pdf.js.map +0 -0
  154. package/dist/src/browser/profiler.d.ts +0 -0
  155. package/dist/src/browser/profiler.d.ts.map +0 -0
  156. package/dist/src/browser/profiler.js +0 -0
  157. package/dist/src/browser/profiler.js.map +0 -0
  158. package/dist/src/browser/record.d.ts +0 -0
  159. package/dist/src/browser/record.d.ts.map +0 -0
  160. package/dist/src/browser/record.js +0 -0
  161. package/dist/src/browser/record.js.map +0 -0
  162. package/dist/src/browser/ref-cache.d.ts +6 -1
  163. package/dist/src/browser/ref-cache.d.ts.map +1 -1
  164. package/dist/src/browser/ref-cache.js +21 -3
  165. package/dist/src/browser/ref-cache.js.map +1 -1
  166. package/dist/src/browser/screenshot.d.ts +0 -0
  167. package/dist/src/browser/screenshot.d.ts.map +0 -0
  168. package/dist/src/browser/screenshot.js +0 -0
  169. package/dist/src/browser/screenshot.js.map +0 -0
  170. package/dist/src/browser/session.d.ts +0 -0
  171. package/dist/src/browser/session.d.ts.map +0 -0
  172. package/dist/src/browser/session.js +0 -0
  173. package/dist/src/browser/session.js.map +0 -0
  174. package/dist/src/browser/snapshot.d.ts +0 -0
  175. package/dist/src/browser/snapshot.d.ts.map +0 -0
  176. package/dist/src/browser/snapshot.js +0 -0
  177. package/dist/src/browser/snapshot.js.map +0 -0
  178. package/dist/src/browser/storage.d.ts +0 -0
  179. package/dist/src/browser/storage.d.ts.map +0 -0
  180. package/dist/src/browser/storage.js +0 -0
  181. package/dist/src/browser/storage.js.map +0 -0
  182. package/dist/src/browser/tabs.d.ts +5 -1
  183. package/dist/src/browser/tabs.d.ts.map +1 -1
  184. package/dist/src/browser/tabs.js +4 -3
  185. package/dist/src/browser/tabs.js.map +1 -1
  186. package/dist/src/browser/trace.d.ts +0 -0
  187. package/dist/src/browser/trace.d.ts.map +0 -0
  188. package/dist/src/browser/trace.js +0 -0
  189. package/dist/src/browser/trace.js.map +0 -0
  190. package/dist/src/browser/types.d.ts +4 -0
  191. package/dist/src/browser/types.d.ts.map +1 -1
  192. package/dist/src/browser/types.js +0 -0
  193. package/dist/src/browser/types.js.map +1 -1
  194. package/dist/src/browser/vitals.d.ts +0 -0
  195. package/dist/src/browser/vitals.d.ts.map +0 -0
  196. package/dist/src/browser/vitals.js +0 -0
  197. package/dist/src/browser/vitals.js.map +0 -0
  198. package/dist/src/browser/wait.d.ts +0 -0
  199. package/dist/src/browser/wait.d.ts.map +0 -0
  200. package/dist/src/browser/wait.js +0 -0
  201. package/dist/src/browser/wait.js.map +0 -0
  202. package/dist/src/cli/action.d.ts +0 -0
  203. package/dist/src/cli/action.d.ts.map +0 -0
  204. package/dist/src/cli/action.js +0 -0
  205. package/dist/src/cli/action.js.map +0 -0
  206. package/dist/src/cli/commands.d.ts +0 -0
  207. package/dist/src/cli/commands.d.ts.map +1 -1
  208. package/dist/src/cli/commands.js +96 -4
  209. package/dist/src/cli/commands.js.map +1 -1
  210. package/dist/src/cli/output.d.ts +0 -0
  211. package/dist/src/cli/output.d.ts.map +0 -0
  212. package/dist/src/cli/output.js +0 -0
  213. package/dist/src/cli/output.js.map +0 -0
  214. package/dist/src/cli/platform.d.ts +0 -0
  215. package/dist/src/cli/platform.d.ts.map +0 -0
  216. package/dist/src/cli/platform.js +0 -0
  217. package/dist/src/cli/platform.js.map +0 -0
  218. package/dist/src/cli/types.d.ts +0 -0
  219. package/dist/src/cli/types.d.ts.map +0 -0
  220. package/dist/src/cli/types.js +0 -0
  221. package/dist/src/cli/types.js.map +0 -0
  222. package/dist/src/cli.d.ts +0 -0
  223. package/dist/src/cli.d.ts.map +0 -0
  224. package/dist/src/cli.js +0 -0
  225. package/dist/src/cli.js.map +0 -0
  226. package/dist/src/index.d.ts +0 -0
  227. package/dist/src/index.d.ts.map +0 -0
  228. package/dist/src/index.js +0 -0
  229. package/dist/src/index.js.map +0 -0
  230. package/dist/tsconfig.tsbuildinfo +1 -1
  231. package/package.json +9 -5
  232. package/src/__tests__/adapters.test.ts +125 -0
  233. package/src/__tests__/cdp-client.test.ts +375 -0
  234. package/src/__tests__/close-browser.test.ts +141 -0
  235. package/src/__tests__/console-log.test.ts +250 -0
  236. package/src/__tests__/find.test.ts +354 -0
  237. package/src/__tests__/frame-command.test.ts +98 -0
  238. package/src/__tests__/ref-cache.test.ts +47 -2
  239. package/src/__tests__/session-state.test.ts +251 -0
  240. package/src/__tests__/snapshot.test.ts +331 -0
  241. package/src/__tests__/storage-eval.test.ts +171 -0
  242. package/src/__tests__/tabs.test.ts +183 -0
  243. package/src/browser/browser.ts +59 -7
  244. package/src/browser/cdp.ts +52 -15
  245. package/src/browser/ref-cache.ts +29 -6
  246. package/src/browser/tabs.ts +12 -4
  247. package/src/browser/types.ts +4 -0
  248. package/src/cli/commands.ts +90 -4
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,YAAY,CAAC;AAm7EzE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACrE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUlG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CA6B5H;AAwcD,QAAA,MAAM,aAAa,EAAE,OAmJpB,CAAC;eAEa,aAAa"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,YAAY,CAAC;AAwgFzE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACrE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUlG;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CA6B5H;AAycD,QAAA,MAAM,aAAa,EAAE,OAmJpB,CAAC;eAEa,aAAa"}
@@ -12,9 +12,55 @@ let _sessionId = '';
12
12
  let _targetId = '';
13
13
  let _port = DEFAULT_PORT;
14
14
  let _refs = new Map();
15
+ // Saved parent sessionId when inside an iframe — restored by `frame main`.
16
+ let _parentSessionId = '';
15
17
  async function getBrowser() {
16
18
  return import('../index.js');
17
19
  }
20
+ // Best-effort cleanup on Ctrl-C / kill so a launched Chrome doesn't linger as
21
+ // an orphan process when a command is interrupted mid-flight (e.g. during a
22
+ // long-running wait/eval that CdpClient.send()'s own timeout hasn't tripped
23
+ // yet).
24
+ //
25
+ // This module is imported for EVERY `monomind` CLI invocation (commands/
26
+ // index.ts statically imports browse.ts, which imports this file) — not just
27
+ // browse commands — so the handler is only *registered* once a browser
28
+ // session is actually launched here (see ensureSignalCleanupHandlers(),
29
+ // called from the `open` action below), not at module load. Registering
30
+ // unconditionally at import time would call process.exit() on Ctrl-C for
31
+ // every unrelated monomind command (e.g. a long-running `org run` daemon),
32
+ // pre-empting whatever other SIGINT/SIGTERM handling that process needs.
33
+ const SIGNAL_EXIT_CODES = { SIGINT: 130, SIGTERM: 143 };
34
+ let _signalHandlersRegistered = false;
35
+ function ensureSignalCleanupHandlers() {
36
+ if (_signalHandlersRegistered)
37
+ return;
38
+ _signalHandlersRegistered = true;
39
+ for (const sig of ['SIGINT', 'SIGTERM']) {
40
+ process.on(sig, () => {
41
+ void (async () => {
42
+ try {
43
+ const browser = await getBrowser();
44
+ if (_client) {
45
+ await browser.closeBrowser(_client, _port);
46
+ }
47
+ else {
48
+ const pid = browser.getLaunchedPid(_port);
49
+ if (pid !== undefined) {
50
+ try {
51
+ process.kill(pid, 'SIGKILL');
52
+ }
53
+ catch { /* already exited */ }
54
+ }
55
+ }
56
+ }
57
+ catch {
58
+ // best-effort — never block process exit on cleanup failure
59
+ }
60
+ })().finally(() => process.exit(SIGNAL_EXIT_CODES[sig]));
61
+ });
62
+ }
63
+ }
18
64
  // Each CLI invocation is a fresh process, so this module's `_port` variable
19
65
  // is always freshly initialized to DEFAULT_PORT — a `--port 9333` passed to
20
66
  // an earlier `open` command has no effect on this process's own default.
@@ -57,6 +103,7 @@ async function ensureConnected(port, targetId) {
57
103
  _client = conn.client;
58
104
  _sessionId = conn.sessionId;
59
105
  _targetId = conn.target.id;
106
+ _parentSessionId = '';
60
107
  _refs = new Map();
61
108
  await hydrateRefsFromCache(browser, _targetId, conn.target.url);
62
109
  }
@@ -145,6 +192,7 @@ async function switchToHeaded(url, port) {
145
192
  _client.close();
146
193
  _client = null;
147
194
  _sessionId = '';
195
+ _parentSessionId = '';
148
196
  _targetId = '';
149
197
  }
150
198
  // Launch headed on a neighbouring port to avoid collision
@@ -190,6 +238,7 @@ async function switchToHeaded(url, port) {
190
238
  _client.close();
191
239
  _client = null;
192
240
  _sessionId = '';
241
+ _parentSessionId = '';
193
242
  _targetId = '';
194
243
  // Relaunch headless and restore session
195
244
  _port = await browser.launchBrowser({ port, headless: true });
@@ -272,13 +321,40 @@ const openCommand = {
272
321
  prevClient.close();
273
322
  _client = null;
274
323
  _sessionId = '';
324
+ _parentSessionId = '';
275
325
  _targetId = '';
276
326
  _refs = new Map();
277
327
  }
278
328
  _port = await browser.launchBrowser({ port, headless: !forceHeaded });
279
329
  // Persist the active port so subsequent CLI invocations (each a fresh
280
- // process) default to attaching here instead of hardcoded 9222.
281
- await browser.saveActivePort(_port);
330
+ // process) default to attaching here instead of hardcoded 9222. Also
331
+ // persist the launched PID/userDataDir so a later process's closeBrowser
332
+ // can still kill this Chrome even though launchedPids (browser.ts) is
333
+ // per-process and empty there.
334
+ //
335
+ // launchBrowser() can either LAUNCH a fresh Chrome or ATTACH to one
336
+ // already listening on the requested port (see its own "attach if
337
+ // already Chrome" comment) — it returns only a port number, with no
338
+ // signal telling this caller which happened. getLaunchedPid(_port) is
339
+ // undefined on the attach path (this process never spawned anything).
340
+ // Bug fixed here: unconditionally saving {pid: undefined, ...} on
341
+ // attach used to CLOBBER a real PID a previous `open` had already
342
+ // persisted for this exact port, destroying the only way a later
343
+ // process's closeBrowser() PID-kill fallback could ever find it.
344
+ const freshPid = browser.getLaunchedPid(_port);
345
+ const freshUserDataDir = browser.getLaunchedUserDataDir(_port);
346
+ if (freshPid !== undefined) {
347
+ await browser.saveActivePort(_port, { pid: freshPid, userDataDir: freshUserDataDir });
348
+ }
349
+ else {
350
+ // Attach path: preserve whatever PID/userDataDir was already on file
351
+ // for this port (most likely from the process that originally
352
+ // launched it) instead of overwriting with undefined.
353
+ const existing = await browser.loadActivePortInfo();
354
+ const preserved = existing && existing.port === _port ? existing : undefined;
355
+ await browser.saveActivePort(_port, { pid: preserved?.pid, userDataDir: preserved?.userDataDir });
356
+ }
357
+ ensureSignalCleanupHandlers();
282
358
  const conn = await browser.connectToTarget(_port);
283
359
  _client = conn.client;
284
360
  _sessionId = conn.sessionId;
@@ -1312,6 +1388,7 @@ const closeCommand = {
1312
1388
  client.close();
1313
1389
  _client = null;
1314
1390
  _sessionId = '';
1391
+ _parentSessionId = '';
1315
1392
  _targetId = '';
1316
1393
  _refs = new Map();
1317
1394
  // Session is gone — forget the persisted port and stale refs so later
@@ -1969,11 +2046,24 @@ const frameCommand = {
1969
2046
  if (!target)
1970
2047
  throw new Error('Usage: monomind browse frame <selector>|main');
1971
2048
  if (target === 'main') {
2049
+ if (_parentSessionId) {
2050
+ // Detach from the OOPIF session (best-effort — it may already be gone)
2051
+ await client.send('Target.detachFromTarget', { sessionId: _sessionId }).catch(() => { });
2052
+ _sessionId = _parentSessionId;
2053
+ _parentSessionId = '';
2054
+ }
1972
2055
  output.printSuccess('Switched to main frame');
1973
2056
  }
1974
2057
  else {
1975
- const frameSrc = await browser.switchToFrame(client, sessionId, target);
1976
- output.printSuccess(`Switched to frame: ${frameSrc ?? target}`);
2058
+ const frameResult = await browser.switchToFrame(client, sessionId, target);
2059
+ if (frameResult.sessionId) {
2060
+ // Save the parent session so `frame main` can restore it
2061
+ _parentSessionId = _sessionId;
2062
+ _sessionId = frameResult.sessionId;
2063
+ // Enable CDP domains on the iframe's session so subsequent commands work
2064
+ await browser.enableSessionDomains(client, _sessionId);
2065
+ }
2066
+ output.printSuccess(`Switched to frame: ${frameResult.url ?? target}`);
1977
2067
  }
1978
2068
  return { success: true };
1979
2069
  },
@@ -2034,6 +2124,7 @@ const tabCommand = {
2034
2124
  client.close();
2035
2125
  _client = null;
2036
2126
  _sessionId = '';
2127
+ _parentSessionId = '';
2037
2128
  _targetId = '';
2038
2129
  _refs = new Map();
2039
2130
  }
@@ -2845,6 +2936,7 @@ const connectCommand = {
2845
2936
  prevClient.close();
2846
2937
  _client = null;
2847
2938
  _sessionId = '';
2939
+ _parentSessionId = '';
2848
2940
  _targetId = '';
2849
2941
  _refs = new Map();
2850
2942
  }