@monoes/monobrowse 1.0.5 → 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 (250) 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 +2 -0
  11. package/dist/src/__tests__/box-model.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/box-model.test.js +36 -0
  13. package/dist/src/__tests__/box-model.test.js.map +1 -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 +11 -0
  175. package/dist/src/browser/snapshot.d.ts.map +1 -1
  176. package/dist/src/browser/snapshot.js +11 -0
  177. package/dist/src/browser/snapshot.js.map +1 -1
  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 +21 -0
  207. package/dist/src/cli/commands.d.ts.map +1 -1
  208. package/dist/src/cli/commands.js +123 -7
  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__/box-model.test.ts +39 -0
  234. package/src/__tests__/cdp-client.test.ts +375 -0
  235. package/src/__tests__/close-browser.test.ts +141 -0
  236. package/src/__tests__/console-log.test.ts +250 -0
  237. package/src/__tests__/find.test.ts +354 -0
  238. package/src/__tests__/frame-command.test.ts +98 -0
  239. package/src/__tests__/ref-cache.test.ts +47 -2
  240. package/src/__tests__/session-state.test.ts +251 -0
  241. package/src/__tests__/snapshot.test.ts +331 -0
  242. package/src/__tests__/storage-eval.test.ts +171 -0
  243. package/src/__tests__/tabs.test.ts +183 -0
  244. package/src/browser/browser.ts +59 -7
  245. package/src/browser/cdp.ts +52 -15
  246. package/src/browser/ref-cache.ts +29 -6
  247. package/src/browser/snapshot.ts +11 -0
  248. package/src/browser/tabs.ts +12 -4
  249. package/src/browser/types.ts +4 -0
  250. package/src/cli/commands.ts +119 -7
@@ -30,12 +30,13 @@ export async function switchToFrame(client, sessionId, frameSelector) {
30
30
  const { frameTree } = await client.send('Page.getFrameTree', {}, sessionId);
31
31
  const match = frameTree.childFrames?.find((cf) => cf.frame.url === frameSrc || cf.frame.id === frameSelector);
32
32
  if (!match)
33
- return frameSrc;
33
+ return { url: frameSrc, sessionId: null };
34
34
  const targets = await client.send('Target.getTargets', {});
35
35
  const oopif = targets.targetInfos.find((t) => t.type === 'iframe' && t.url === match.frame.url);
36
36
  if (oopif) {
37
- await client.send('Target.attachToTarget', { targetId: oopif.targetId, flatten: true });
37
+ const attached = await client.send('Target.attachToTarget', { targetId: oopif.targetId, flatten: true });
38
+ return { url: frameSrc, sessionId: attached.sessionId };
38
39
  }
39
- return frameSrc;
40
+ return { url: frameSrc, sessionId: null };
40
41
  }
41
42
  //# sourceMappingURL=tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/browser/tabs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,GAAG,GAAG,aAAa;IAC5D,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAiB,EAAE,UAAkB,EAAE,QAAgB;IACpF,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB,EAAE,YAAoB,EAAE,QAAgB;IACzF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAwB,uBAAuB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9G,OAAO,MAAM,CAAC,SAAS,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAiB,EACjB,SAAiB,EACjB,aAAqB;IAErB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAClC,kBAAkB,EAClB;QACE,UAAU,EAAE;4CAC0B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;;;WAG9D;QACL,aAAa,EAAE,IAAI;KACpB,EACD,SAAS,CACV,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;IAE/C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAEpC,mBAAmB,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,CACvC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,aAAa,CACnE,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAC/B,mBAAmB,EAAE,EAAE,CACxB,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CACxD,CAAC;IACF,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../src/browser/tabs.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes
File without changes
@@ -9,6 +9,10 @@ export interface BrowserConfig {
9
9
  executablePath?: string;
10
10
  userDataDir?: string;
11
11
  args?: string[];
12
+ /** Milliseconds to wait for the launched Chrome to open its CDP port
13
+ * before giving up. Default 10000 — raise this for environments where
14
+ * process spawn is consistently slower (e.g. constrained CI runners). */
15
+ launchTimeoutMs?: number;
12
16
  }
13
17
  export interface SessionState {
14
18
  targetId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;sEAGkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,kBAAkB,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,aAK5B,CAAC;AAEH,eAAO,MAAM,kBAAkB,UAmB9B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser/types.ts"],"names":[],"mappings":"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"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/browser/types.ts"],"names":[],"mappings":"AA4HA,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO;IACvE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ;IAC1E,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM;IAC1E,cAAc,EAAE,WAAW,EAAE,WAAW;CACzC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB;IACjB,8DAA8D;IAC9D,oDAAoD;IACpD,eAAe;IACf,gEAAgE;IAChE,iBAAiB;IACjB,wBAAwB;IACxB,2BAA2B;IAC3B,mBAAmB;IACnB,eAAe;IACf,yBAAyB;IACzB,gCAAgC;IAChC,mBAAmB;IACnB,4DAA4D;IAC5D,kEAAkE;IAClE,+DAA+D;IAC/D,mEAAmE;IACnE,6DAA6D;CAC9D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/browser/types.ts"],"names":[],"mappings":"AAgIA,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO;IACvE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ;IAC1E,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM;IAC1E,cAAc,EAAE,WAAW,EAAE,WAAW;CACzC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB;IACjB,8DAA8D;IAC9D,oDAAoD;IACpD,eAAe;IACf,gEAAgE;IAChE,iBAAiB;IACjB,wBAAwB;IACxB,2BAA2B;IAC3B,mBAAmB;IACnB,eAAe;IACf,yBAAyB;IACzB,gCAAgC;IAChC,mBAAmB;IACnB,4DAA4D;IAC5D,kEAAkE;IAClE,+DAA+D;IAC/D,mEAAmE;IACnE,6DAA6D;CAC9D,CAAC"}
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
@@ -18,8 +18,29 @@ import type { Command } from './types.js';
18
18
  * only its own known --flags are consumed from the front; everything after
19
19
  * them is taken verbatim as one argument, untouched by tokenization.
20
20
  *
21
+ /**
22
+ * `get box`'s output shape: browser.getElementBox() returns the element's
23
+ * CENTER point under x/y (correct for internal click-target callers), but
24
+ * `get box` is a bounding-box accessor where x/y conventionally means the
25
+ * top-left origin — a caller computing its own center as `box.x + width/2`
26
+ * would otherwise double-offset away from the element (issue #15). Expose
27
+ * both conventions, explicitly labeled, so neither is ambiguous.
28
+ *
21
29
  * Exported for direct unit testing — not part of the CLI's public API.
22
30
  */
31
+ export declare function deriveBoxOutput(center: {
32
+ x: number;
33
+ y: number;
34
+ width: number;
35
+ height: number;
36
+ } | null): {
37
+ x: number;
38
+ y: number;
39
+ width: number;
40
+ height: number;
41
+ centerX: number;
42
+ centerY: number;
43
+ } | null;
23
44
  export declare function parseBatchCommandLine(cmdStr: string): {
24
45
  subName: string;
25
46
  subArgs: string[];
@@ -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;AA+6EzE;;;;;;;;;;;;;;;;GAgBG;AACH,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;
@@ -774,7 +850,8 @@ const getCommand = {
774
850
  const ref = _refs.get(refKey);
775
851
  if (!ref)
776
852
  throw new Error(`Ref @${refKey} not found`);
777
- value = await browser.getElementBox(client, sessionId, ref);
853
+ const center = await browser.getElementBox(client, sessionId, ref);
854
+ value = deriveBoxOutput(center);
778
855
  break;
779
856
  }
780
857
  case 'styles': {
@@ -1311,6 +1388,7 @@ const closeCommand = {
1311
1388
  client.close();
1312
1389
  _client = null;
1313
1390
  _sessionId = '';
1391
+ _parentSessionId = '';
1314
1392
  _targetId = '';
1315
1393
  _refs = new Map();
1316
1394
  // Session is gone — forget the persisted port and stale refs so later
@@ -1648,8 +1726,11 @@ const tapCommand = {
1648
1726
  const box = await browser.getElementBox(client, sessionId, ref);
1649
1727
  if (!box)
1650
1728
  throw new Error(`Cannot get bounds for @${key}`);
1651
- x = Math.round(box.x + box.width / 2);
1652
- y = Math.round(box.y + box.height / 2);
1729
+ // box.x/box.y from getElementBox() ARE already the center point (see
1730
+ // its own doc comment) — adding width/2 here double-offset the tap
1731
+ // target away from the element (issue #15).
1732
+ x = Math.round(box.x);
1733
+ y = Math.round(box.y);
1653
1734
  }
1654
1735
  else {
1655
1736
  const posJson = await browser.evaluateJs(client, sessionId, `(function(){var el=document.querySelector(${JSON.stringify(arg)});if(!el)return null;var r=el.getBoundingClientRect();return JSON.stringify({x:r.left+r.width/2,y:r.top+r.height/2});})()`);
@@ -1965,11 +2046,24 @@ const frameCommand = {
1965
2046
  if (!target)
1966
2047
  throw new Error('Usage: monomind browse frame <selector>|main');
1967
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
+ }
1968
2055
  output.printSuccess('Switched to main frame');
1969
2056
  }
1970
2057
  else {
1971
- const frameSrc = await browser.switchToFrame(client, sessionId, target);
1972
- 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}`);
1973
2067
  }
1974
2068
  return { success: true };
1975
2069
  },
@@ -2030,6 +2124,7 @@ const tabCommand = {
2030
2124
  client.close();
2031
2125
  _client = null;
2032
2126
  _sessionId = '';
2127
+ _parentSessionId = '';
2033
2128
  _targetId = '';
2034
2129
  _refs = new Map();
2035
2130
  }
@@ -2603,8 +2698,28 @@ function tokenizeBatchCommand(input) {
2603
2698
  * only its own known --flags are consumed from the front; everything after
2604
2699
  * them is taken verbatim as one argument, untouched by tokenization.
2605
2700
  *
2701
+ /**
2702
+ * `get box`'s output shape: browser.getElementBox() returns the element's
2703
+ * CENTER point under x/y (correct for internal click-target callers), but
2704
+ * `get box` is a bounding-box accessor where x/y conventionally means the
2705
+ * top-left origin — a caller computing its own center as `box.x + width/2`
2706
+ * would otherwise double-offset away from the element (issue #15). Expose
2707
+ * both conventions, explicitly labeled, so neither is ambiguous.
2708
+ *
2606
2709
  * Exported for direct unit testing — not part of the CLI's public API.
2607
2710
  */
2711
+ export function deriveBoxOutput(center) {
2712
+ if (!center)
2713
+ return null;
2714
+ return {
2715
+ x: center.x - center.width / 2,
2716
+ y: center.y - center.height / 2,
2717
+ width: center.width,
2718
+ height: center.height,
2719
+ centerX: center.x,
2720
+ centerY: center.y,
2721
+ };
2722
+ }
2608
2723
  export function parseBatchCommandLine(cmdStr) {
2609
2724
  const trimmed = cmdStr.trim();
2610
2725
  const evalMatch = trimmed.match(/^eval\b\s*/);
@@ -2821,6 +2936,7 @@ const connectCommand = {
2821
2936
  prevClient.close();
2822
2937
  _client = null;
2823
2938
  _sessionId = '';
2939
+ _parentSessionId = '';
2824
2940
  _targetId = '';
2825
2941
  _refs = new Map();
2826
2942
  }