9remote 3.0.39 → 3.0.40

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 (464) hide show
  1. package/dist/cli.cjs +86 -86
  2. package/dist/extension/background.js +136 -123
  3. package/dist/extension/manifest.json +6 -5
  4. package/dist/extension/runner.js +606 -0
  5. package/dist/server.cjs +239 -243
  6. package/dist/ui/assets/index-D_C1NTm1.js +8 -0
  7. package/dist/ui/index.html +1 -1
  8. package/dist/web/404.html +1 -1
  9. package/dist/web/__next.__PAGE__.txt +4 -4
  10. package/dist/web/__next._full.txt +17 -17
  11. package/dist/web/__next._head.txt +4 -4
  12. package/dist/web/__next._index.txt +10 -10
  13. package/dist/web/__next._tree.txt +3 -3
  14. package/dist/web/_next/static/chunks/{0fb7b532.2e7a08a3edb2d789.js → 025762a4.c49f8207624e1667.js} +1 -1
  15. package/dist/web/_next/static/chunks/101.bfb3898573e4245d.js +1 -0
  16. package/dist/web/_next/static/chunks/1342.3d5707800ea67dcb.js +1 -0
  17. package/dist/web/_next/static/chunks/153.d7a869e0874f32e0.js +1 -0
  18. package/dist/web/_next/static/chunks/1561.8d395206716b3967.js +1 -0
  19. package/dist/web/_next/static/chunks/{4314.6bbd89507909cad1.js → 1599.ed9aa4b461112c1a.js} +1 -1
  20. package/dist/web/_next/static/chunks/1694.7c4e72f21d4ce34c.js +1 -0
  21. package/dist/web/_next/static/chunks/1772-ef73c166e83f5eff.js +1 -0
  22. package/dist/web/_next/static/chunks/1878.724a4af779f951aa.js +138 -0
  23. package/dist/web/_next/static/chunks/1879.0252e2bd9153348f.js +1 -0
  24. package/dist/web/_next/static/chunks/1920-5ead25286846df83.js +1 -0
  25. package/dist/web/_next/static/chunks/1968-4d2969f0b7112e0b.js +32 -0
  26. package/dist/web/_next/static/chunks/2004.f975891d8a569296.js +24 -0
  27. package/dist/web/_next/static/chunks/2094.05efbc3414828946.js +1 -0
  28. package/dist/web/_next/static/chunks/2209.2ee6023fed2ac7a5.js +1 -0
  29. package/dist/web/_next/static/chunks/236.88ef102773dd3a91.js +1 -0
  30. package/dist/web/_next/static/chunks/2369.22023f63f0eaf8db.js +1 -0
  31. package/dist/web/_next/static/chunks/{6420.bfa7bc86d03dcefc.js → 2401.73a0315a75c7b051.js} +1 -1
  32. package/dist/web/_next/static/chunks/2427.3a468cdfabd25124.js +1 -0
  33. package/dist/web/_next/static/chunks/2436.da0ef064f744b8af.js +115 -0
  34. package/dist/web/_next/static/chunks/{1222.16edfbb0beb9081f.js → 2488.87361126358794fd.js} +1 -1
  35. package/dist/web/_next/static/chunks/2561.6c8eb8cf71429d5d.js +36 -0
  36. package/dist/web/_next/static/chunks/2581.d09a7f19c64e4b97.js +1 -0
  37. package/dist/web/_next/static/chunks/{8044.5f87392585c9f3e4.js → 2615.86c58079ec7c597c.js} +1 -1
  38. package/dist/web/_next/static/chunks/2934.0caeb8b2d8b67139.js +1 -0
  39. package/dist/web/_next/static/chunks/{6274.a3795ca6dacb3d62.js → 3011.fc80a2aad3ef8778.js} +2 -2
  40. package/dist/web/_next/static/chunks/3255.3c96f02d5eb06783.js +23 -0
  41. package/dist/web/_next/static/chunks/3284.e56b0102fb9a3920.js +62 -0
  42. package/dist/web/_next/static/chunks/329-15d3e36af1b2827f.js +1 -0
  43. package/dist/web/_next/static/chunks/3301.1f7e2bd5ccb55064.js +1 -0
  44. package/dist/web/_next/static/chunks/3314.b5b5b3cca99d832e.js +1 -0
  45. package/dist/web/_next/static/chunks/{20154aaa.868648f838e03bf1.js → 33d0405b.71576a1f83124ecd.js} +1 -1
  46. package/dist/web/_next/static/chunks/3428.8818e0ef88c0e743.js +1 -0
  47. package/dist/web/_next/static/chunks/{3429.e69c6bd48e1207a9.js → 3443.8d771dadb470603c.js} +1 -1
  48. package/dist/web/_next/static/chunks/{6742.88fddf128fbeb43d.js → 3704.bf80aa0d55f950d0.js} +1 -1
  49. package/dist/web/_next/static/chunks/3916.141fb720bd1eee40.js +148 -0
  50. package/dist/web/_next/static/chunks/3973.e5c2013e2abeefd3.js +93 -0
  51. package/dist/web/_next/static/chunks/4065.7616cbd8f37a68e6.js +1 -0
  52. package/dist/web/_next/static/chunks/{9299.e37149b455be7e9d.js → 4129.a93c19870036f647.js} +1 -1
  53. package/dist/web/_next/static/chunks/{6730.88fc6f2ccc49496c.js → 4171.b0e5c6dc86bc8a5f.js} +1 -1
  54. package/dist/web/_next/static/chunks/4330.a8740b63075e6886.js +1 -0
  55. package/dist/web/_next/static/chunks/4378.a0629cfcbc20c406.js +1 -0
  56. package/dist/web/_next/static/chunks/4553.cad71717d538a2e5.js +1 -0
  57. package/dist/web/_next/static/chunks/4589.9bd287581ccd378b.js +1 -0
  58. package/dist/web/_next/static/chunks/4594.53636acacf285911.js +34 -0
  59. package/dist/web/_next/static/chunks/466.908e4592c2b93997.js +77 -0
  60. package/dist/web/_next/static/chunks/468.2e48222bf3517040.js +1 -0
  61. package/dist/web/_next/static/chunks/4712.b7062faa67f544b5.js +1 -0
  62. package/dist/web/_next/static/chunks/{9675.be4a175f92aa2f26.js → 4724.e0dffedb6972b738.js} +1 -1
  63. package/dist/web/_next/static/chunks/482.a0b5af31d7354a82.js +1 -0
  64. package/dist/web/_next/static/chunks/4929.fce0c23972476c66.js +1 -0
  65. package/dist/web/_next/static/chunks/4964.5a41b2d776aee556.js +1 -0
  66. package/dist/web/_next/static/chunks/499.cf81a39b9e6ce4a4.js +94 -0
  67. package/dist/web/_next/static/chunks/{0a7753a9.4cb02a98e2e453b9.js → 4ff7191e.d68cdd8504937de5.js} +1 -1
  68. package/dist/web/_next/static/chunks/5035.f7175d1037807b62.js +90 -0
  69. package/dist/web/_next/static/chunks/5198.b8e3a08cb60bc349.js +1 -0
  70. package/dist/web/_next/static/chunks/5421.430fa3a5488e15a9.js +21 -0
  71. package/dist/web/_next/static/chunks/{9871-c277aedb0437cb82.js → 556-a8f04c41c5663ee8.js} +1 -1
  72. package/dist/web/_next/static/chunks/5587-fc5af8c76df14222.js +1 -0
  73. package/dist/web/_next/static/chunks/5710.b055a101d6b51ff3.js +27 -0
  74. package/dist/web/_next/static/chunks/{2180.edcf5dc3d77ceee8.js → 5714.122f8cb7296bc9e1.js} +1 -1
  75. package/dist/web/_next/static/chunks/{1243.3f23d89283c156ea.js → 5757.2c157c0924cea1c2.js} +1 -1
  76. package/dist/web/_next/static/chunks/{3346-23aafd4add63869a.js → 5957-3d5d92b58dcc7d4e.js} +1 -1
  77. package/dist/web/_next/static/chunks/{565f33a6-fd3410bd29f39fdf.js → 5b8e7b36-a2678128cd5bdf5e.js} +1 -1
  78. package/dist/web/_next/static/chunks/6141-132d206408947c60.js +1 -0
  79. package/dist/web/_next/static/chunks/{7424.c8c9f85c8ea65885.js → 6181.6bdde6f59e3f2cea.js} +1 -1
  80. package/dist/web/_next/static/chunks/6221-cf883148bf8a4c1e.js +11 -0
  81. package/dist/web/_next/static/chunks/{3552.8dd9a3d2c3bcef65.js → 6372.51e578b15d566c0e.js} +2 -2
  82. package/dist/web/_next/static/chunks/6405.39e8b42a56b88bb5.js +1 -0
  83. package/dist/web/_next/static/chunks/641.7b1b12ccc56b3b3c.js +1 -0
  84. package/dist/web/_next/static/chunks/{6647.740ec32a32201eab.js → 6418.a86ca6012f0867ff.js} +1 -1
  85. package/dist/web/_next/static/chunks/{4924.3f5c77a103ac69a9.js → 6435.6aef0f9f1cc65be6.js} +1 -1
  86. package/dist/web/_next/static/chunks/6439.f02105d3687113e7.js +1 -0
  87. package/dist/web/_next/static/chunks/647.527b9a09373aab91.js +1 -0
  88. package/dist/web/_next/static/chunks/{8115.68d46fb961c724e0.js → 6470.7057ef6894a7f625.js} +16 -16
  89. package/dist/web/_next/static/chunks/{7507.77d9ac9eb03518f7.js → 6485.6ae2f3966cc25c9e.js} +1 -1
  90. package/dist/web/_next/static/chunks/{6987.743a63813c6288ce.js → 6512.cc81f46437639a0e.js} +2 -2
  91. package/dist/web/_next/static/chunks/6520.73f10855f9d4b5a8.js +1 -0
  92. package/dist/web/_next/static/chunks/668.1ddcf2e38071ae57.js +24 -0
  93. package/dist/web/_next/static/chunks/6815.8126ae5481c3bfd8.js +1 -0
  94. package/dist/web/_next/static/chunks/6925-af784cffb03dd330.js +1 -0
  95. package/dist/web/_next/static/chunks/6e6d0562.6ebb8f7db67bd943.js +122 -0
  96. package/dist/web/_next/static/chunks/7058.affbacca3457f5a7.js +41 -0
  97. package/dist/web/_next/static/chunks/7207.72d8a01e77112af2.js +1 -0
  98. package/dist/web/_next/static/chunks/{4090.441fa61655da9b38.js → 7359.b09680f38f75e105.js} +1 -1
  99. package/dist/web/_next/static/chunks/7369.a824cc623274cf63.js +1 -0
  100. package/dist/web/_next/static/chunks/7489.24938d89538cd03e.js +1 -0
  101. package/dist/web/_next/static/chunks/{9641.f6f2982fc4b4735f.js → 7576.273c3d0faf5c3d02.js} +1 -1
  102. package/dist/web/_next/static/chunks/7620.5c5935fd937c0e84.js +1 -0
  103. package/dist/web/_next/static/chunks/{1228.c4aa83586b3730b6.js → 7646.1c26e96ee36bc317.js} +1 -1
  104. package/dist/web/_next/static/chunks/7712.cd8c3dc2d794d714.js +1 -0
  105. package/dist/web/_next/static/chunks/{2038.b77e2c3d38385a76.js → 7812.aabc856212c93434.js} +1 -1
  106. package/dist/web/_next/static/chunks/804.38f05d79313a8dcc.js +104 -0
  107. package/dist/web/_next/static/chunks/8126-0279fc9e17c08aff.js +1 -0
  108. package/dist/web/_next/static/chunks/820-99036fb63c5462c8.js +1 -0
  109. package/dist/web/_next/static/chunks/8304.936a74abe6f0a288.js +1 -0
  110. package/dist/web/_next/static/chunks/8314.7ff9d72cd8613f75.js +226 -0
  111. package/dist/web/_next/static/chunks/8390.5eda620e73ea6c5c.js +74 -0
  112. package/dist/web/_next/static/chunks/860.f7885efc630bcfd7.js +1 -0
  113. package/dist/web/_next/static/chunks/87c73c54-e11922cda838f8cc.js +1 -0
  114. package/dist/web/_next/static/chunks/887.15090f9a6a142a10.js +1 -0
  115. package/dist/web/_next/static/chunks/8977.1ab6ed8e2c098cf0.js +1 -0
  116. package/dist/web/_next/static/chunks/9121-3d281debd0f3e659.js +1 -0
  117. package/dist/web/_next/static/chunks/9491-6dc334192080d071.js +86 -0
  118. package/dist/web/_next/static/chunks/951ed0e8.98070dce91103a63.js +1 -0
  119. package/dist/web/_next/static/chunks/9651.d199fbbbc3de43b8.js +215 -0
  120. package/dist/web/_next/static/chunks/9692.dd07a90166f5e6ff.js +1 -0
  121. package/dist/web/_next/static/chunks/{6075.a6b8434732056526.js → 9700.c47024f592537718.js} +1 -1
  122. package/dist/web/_next/static/chunks/9711.cf7aaa7fa6ec7dd7.js +287 -0
  123. package/dist/web/_next/static/chunks/9736.63b4a559c8a23186.js +1 -0
  124. package/dist/web/_next/static/chunks/{bbfbfb6c.069db3c4cc981ed3.js → 98f82933.0c4f9e5e83926351.js} +1 -1
  125. package/dist/web/_next/static/chunks/{da9a53d6.df25e193f1f5bcae.js → a36ae3fc.d666935373d1f579.js} +4 -4
  126. package/dist/web/_next/static/chunks/{adcd17ec-9a2791632136b67b.js → ab6c8a12-9dac45de556d8a8d.js} +1 -1
  127. package/dist/web/_next/static/chunks/app/_global-error/page-2ece09c883187d82.js +1 -0
  128. package/dist/web/_next/static/chunks/app/_not-found/page-9f829d2c4beb1840.js +1 -0
  129. package/dist/web/_next/static/chunks/app/admin/access/page-45f45ad529e5b691.js +5 -0
  130. package/dist/web/_next/static/chunks/app/admin/login/page-382072b5b43d3c29.js +1 -0
  131. package/dist/web/_next/static/chunks/app/admin/ota/page-293c0743bd60f454.js +5 -0
  132. package/dist/web/_next/static/chunks/app/admin/page-fc676dae451dd646.js +5 -0
  133. package/dist/web/_next/static/chunks/app/admin/turn/page-2ab33033fc7f0919.js +5 -0
  134. package/dist/web/_next/static/chunks/app/dev/question/page-bafce0c9fd4e8488.js +1 -0
  135. package/dist/web/_next/static/chunks/app/download/{page-2811ea822a1e586a.js → page-a65d1c7fcf6397af.js} +1 -1
  136. package/dist/web/_next/static/chunks/app/layout-f1429d22e935695f.js +1 -0
  137. package/dist/web/_next/static/chunks/app/login/page-a5dd37d1cbbb394e.js +1 -0
  138. package/dist/web/_next/static/chunks/app/{page-8387dba850541259.js → page-1e67d8a5f3775276.js} +3 -3
  139. package/dist/web/_next/static/chunks/app/workspace/browse/page-2ece09c883187d82.js +1 -0
  140. package/dist/web/_next/static/chunks/app/workspace/editor/page-2ece09c883187d82.js +1 -0
  141. package/dist/web/_next/static/chunks/app/workspace/files/page-2ece09c883187d82.js +1 -0
  142. package/dist/web/_next/static/chunks/app/workspace/git/page-2ece09c883187d82.js +1 -0
  143. package/dist/web/_next/static/chunks/app/workspace/layout-d8bb677fa1caa5a7.js +20 -0
  144. package/dist/web/_next/static/chunks/app/workspace/mobile/page-2ece09c883187d82.js +1 -0
  145. package/dist/web/_next/static/chunks/app/workspace/page-2ece09c883187d82.js +1 -0
  146. package/dist/web/_next/static/chunks/app/workspace/pair/page-2ece09c883187d82.js +1 -0
  147. package/dist/web/_next/static/chunks/app/workspace/remote/page-2ece09c883187d82.js +1 -0
  148. package/dist/web/_next/static/chunks/app/workspace/terminal/[sessionId]/page-2ece09c883187d82.js +1 -0
  149. package/dist/web/_next/static/chunks/app/workspace/welcome/page-2ece09c883187d82.js +1 -0
  150. package/dist/web/_next/static/chunks/app/workspace/workspaces/page-2ece09c883187d82.js +1 -0
  151. package/dist/web/_next/static/chunks/b2b4fb58.d2a067fe7df4a0d0.js +1 -0
  152. package/dist/web/_next/static/chunks/baeaa4ff-8eac34d2e07d1bb3.js +1 -0
  153. package/dist/web/_next/static/chunks/{7c89255b.f727562586fa21cc.js → c2d9a0c9.b4e0bb73c2ed317c.js} +1 -1
  154. package/dist/web/_next/static/chunks/{a012e9f0.7dbb2fe05ec0b816.js → ccfb6294.add4177b76c37868.js} +11 -11
  155. package/dist/web/_next/static/chunks/{c7ea4e13.6153499d4c2fb1f2.js → db261188.134a04dd616706a4.js} +1 -1
  156. package/dist/web/_next/static/chunks/framework-59d2d1720fc2b396.js +1 -0
  157. package/dist/web/_next/static/chunks/main-app-72391b47e9393c1b.js +1 -0
  158. package/dist/web/_next/static/chunks/main-e10b0dbebb4de0a8.js +5 -0
  159. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/app-error-2ece09c883187d82.js +1 -0
  160. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/forbidden-2ece09c883187d82.js +1 -0
  161. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/global-error-48f06b4c48a1eef3.js +1 -0
  162. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/not-found-2ece09c883187d82.js +1 -0
  163. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/unauthorized-2ece09c883187d82.js +1 -0
  164. package/dist/web/_next/static/chunks/webpack-dd1f7a5ae02e5d84.js +1 -0
  165. package/dist/web/_next/static/css/{b496025c9cd768cc.css → 15730e9f7c5c55ef.css} +1 -1
  166. package/dist/web/_next/static/css/1c2cca827fa36d54.css +1 -0
  167. package/dist/web/_not-found/__next._full.txt +15 -15
  168. package/dist/web/_not-found/__next._head.txt +4 -4
  169. package/dist/web/_not-found/__next._index.txt +10 -10
  170. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +2 -2
  171. package/dist/web/_not-found/__next._not-found.txt +3 -3
  172. package/dist/web/_not-found/__next._tree.txt +3 -3
  173. package/dist/web/_not-found.html +1 -1
  174. package/dist/web/_not-found.txt +15 -15
  175. package/dist/web/admin/__next._full.txt +17 -17
  176. package/dist/web/admin/__next._head.txt +4 -4
  177. package/dist/web/admin/__next._index.txt +10 -10
  178. package/dist/web/admin/__next._tree.txt +3 -3
  179. package/dist/web/admin/__next.admin.__PAGE__.txt +4 -4
  180. package/dist/web/admin/__next.admin.txt +3 -3
  181. package/dist/web/admin/access/__next._full.txt +17 -17
  182. package/dist/web/admin/access/__next._head.txt +4 -4
  183. package/dist/web/admin/access/__next._index.txt +10 -10
  184. package/dist/web/admin/access/__next._tree.txt +3 -3
  185. package/dist/web/admin/access/__next.admin.access.__PAGE__.txt +4 -4
  186. package/dist/web/admin/access/__next.admin.access.txt +3 -3
  187. package/dist/web/admin/access/__next.admin.txt +3 -3
  188. package/dist/web/admin/access.html +1 -1
  189. package/dist/web/admin/access.txt +17 -17
  190. package/dist/web/admin/login/__next._full.txt +17 -17
  191. package/dist/web/admin/login/__next._head.txt +4 -4
  192. package/dist/web/admin/login/__next._index.txt +10 -10
  193. package/dist/web/admin/login/__next._tree.txt +3 -3
  194. package/dist/web/admin/login/__next.admin.login.__PAGE__.txt +4 -4
  195. package/dist/web/admin/login/__next.admin.login.txt +3 -3
  196. package/dist/web/admin/login/__next.admin.txt +3 -3
  197. package/dist/web/admin/login.html +1 -1
  198. package/dist/web/admin/login.txt +17 -17
  199. package/dist/web/admin/ota/__next._full.txt +17 -17
  200. package/dist/web/admin/ota/__next._head.txt +4 -4
  201. package/dist/web/admin/ota/__next._index.txt +10 -10
  202. package/dist/web/admin/ota/__next._tree.txt +3 -3
  203. package/dist/web/admin/ota/__next.admin.ota.__PAGE__.txt +4 -4
  204. package/dist/web/admin/ota/__next.admin.ota.txt +3 -3
  205. package/dist/web/admin/ota/__next.admin.txt +3 -3
  206. package/dist/web/admin/ota.html +1 -1
  207. package/dist/web/admin/ota.txt +17 -17
  208. package/dist/web/admin/turn/__next._full.txt +17 -17
  209. package/dist/web/admin/turn/__next._head.txt +4 -4
  210. package/dist/web/admin/turn/__next._index.txt +10 -10
  211. package/dist/web/admin/turn/__next._tree.txt +3 -3
  212. package/dist/web/admin/turn/__next.admin.turn.__PAGE__.txt +4 -4
  213. package/dist/web/admin/turn/__next.admin.turn.txt +3 -3
  214. package/dist/web/admin/turn/__next.admin.txt +3 -3
  215. package/dist/web/admin/turn.html +1 -1
  216. package/dist/web/admin/turn.txt +17 -17
  217. package/dist/web/admin.html +1 -1
  218. package/dist/web/admin.txt +17 -17
  219. package/dist/web/dev/question/__next._full.txt +17 -17
  220. package/dist/web/dev/question/__next._head.txt +4 -4
  221. package/dist/web/dev/question/__next._index.txt +10 -10
  222. package/dist/web/dev/question/__next._tree.txt +3 -3
  223. package/dist/web/dev/question/__next.dev.question.__PAGE__.txt +4 -4
  224. package/dist/web/dev/question/__next.dev.question.txt +3 -3
  225. package/dist/web/dev/question/__next.dev.txt +3 -3
  226. package/dist/web/dev/question.html +1 -1
  227. package/dist/web/dev/question.txt +17 -17
  228. package/dist/web/download/__next._full.txt +16 -16
  229. package/dist/web/download/__next._head.txt +4 -4
  230. package/dist/web/download/__next._index.txt +10 -10
  231. package/dist/web/download/__next._tree.txt +3 -3
  232. package/dist/web/download/__next.download.__PAGE__.txt +3 -3
  233. package/dist/web/download/__next.download.txt +3 -3
  234. package/dist/web/download.html +1 -1
  235. package/dist/web/download.txt +16 -16
  236. package/dist/web/index.html +1 -1
  237. package/dist/web/index.txt +17 -17
  238. package/dist/web/login/__next._full.txt +17 -17
  239. package/dist/web/login/__next._head.txt +4 -4
  240. package/dist/web/login/__next._index.txt +10 -10
  241. package/dist/web/login/__next._tree.txt +3 -3
  242. package/dist/web/login/__next.login.__PAGE__.txt +4 -4
  243. package/dist/web/login/__next.login.txt +3 -3
  244. package/dist/web/login.html +1 -1
  245. package/dist/web/login.txt +17 -17
  246. package/dist/web/workspace/__next._full.txt +17 -17
  247. package/dist/web/workspace/__next._head.txt +4 -4
  248. package/dist/web/workspace/__next._index.txt +10 -10
  249. package/dist/web/workspace/__next._tree.txt +3 -3
  250. package/dist/web/workspace/__next.workspace.__PAGE__.txt +2 -2
  251. package/dist/web/workspace/__next.workspace.txt +5 -5
  252. package/dist/web/workspace/browse/__next._full.txt +17 -17
  253. package/dist/web/workspace/browse/__next._head.txt +4 -4
  254. package/dist/web/workspace/browse/__next._index.txt +10 -10
  255. package/dist/web/workspace/browse/__next._tree.txt +3 -3
  256. package/dist/web/workspace/browse/__next.workspace.browse.__PAGE__.txt +2 -2
  257. package/dist/web/workspace/browse/__next.workspace.browse.txt +3 -3
  258. package/dist/web/workspace/browse/__next.workspace.txt +5 -5
  259. package/dist/web/workspace/browse.html +1 -1
  260. package/dist/web/workspace/browse.txt +17 -17
  261. package/dist/web/workspace/editor/__next._full.txt +17 -17
  262. package/dist/web/workspace/editor/__next._head.txt +4 -4
  263. package/dist/web/workspace/editor/__next._index.txt +10 -10
  264. package/dist/web/workspace/editor/__next._tree.txt +3 -3
  265. package/dist/web/workspace/editor/__next.workspace.editor.__PAGE__.txt +2 -2
  266. package/dist/web/workspace/editor/__next.workspace.editor.txt +3 -3
  267. package/dist/web/workspace/editor/__next.workspace.txt +5 -5
  268. package/dist/web/workspace/editor.html +1 -1
  269. package/dist/web/workspace/editor.txt +17 -17
  270. package/dist/web/workspace/files/__next._full.txt +17 -17
  271. package/dist/web/workspace/files/__next._head.txt +4 -4
  272. package/dist/web/workspace/files/__next._index.txt +10 -10
  273. package/dist/web/workspace/files/__next._tree.txt +3 -3
  274. package/dist/web/workspace/files/__next.workspace.files.__PAGE__.txt +2 -2
  275. package/dist/web/workspace/files/__next.workspace.files.txt +3 -3
  276. package/dist/web/workspace/files/__next.workspace.txt +5 -5
  277. package/dist/web/workspace/files.html +1 -1
  278. package/dist/web/workspace/files.txt +17 -17
  279. package/dist/web/workspace/git/__next._full.txt +17 -17
  280. package/dist/web/workspace/git/__next._head.txt +4 -4
  281. package/dist/web/workspace/git/__next._index.txt +10 -10
  282. package/dist/web/workspace/git/__next._tree.txt +3 -3
  283. package/dist/web/workspace/git/__next.workspace.git.__PAGE__.txt +2 -2
  284. package/dist/web/workspace/git/__next.workspace.git.txt +3 -3
  285. package/dist/web/workspace/git/__next.workspace.txt +5 -5
  286. package/dist/web/workspace/git.html +1 -1
  287. package/dist/web/workspace/git.txt +17 -17
  288. package/dist/web/workspace/mobile/__next._full.txt +17 -17
  289. package/dist/web/workspace/mobile/__next._head.txt +4 -4
  290. package/dist/web/workspace/mobile/__next._index.txt +10 -10
  291. package/dist/web/workspace/mobile/__next._tree.txt +3 -3
  292. package/dist/web/workspace/mobile/__next.workspace.mobile.__PAGE__.txt +2 -2
  293. package/dist/web/workspace/mobile/__next.workspace.mobile.txt +3 -3
  294. package/dist/web/workspace/mobile/__next.workspace.txt +5 -5
  295. package/dist/web/workspace/mobile.html +1 -1
  296. package/dist/web/workspace/mobile.txt +17 -17
  297. package/dist/web/workspace/pair/__next._full.txt +17 -17
  298. package/dist/web/workspace/pair/__next._head.txt +4 -4
  299. package/dist/web/workspace/pair/__next._index.txt +10 -10
  300. package/dist/web/workspace/pair/__next._tree.txt +3 -3
  301. package/dist/web/workspace/pair/__next.workspace.pair.__PAGE__.txt +2 -2
  302. package/dist/web/workspace/pair/__next.workspace.pair.txt +3 -3
  303. package/dist/web/workspace/pair/__next.workspace.txt +5 -5
  304. package/dist/web/workspace/pair.html +1 -1
  305. package/dist/web/workspace/pair.txt +17 -17
  306. package/dist/web/workspace/remote/__next._full.txt +17 -17
  307. package/dist/web/workspace/remote/__next._head.txt +4 -4
  308. package/dist/web/workspace/remote/__next._index.txt +10 -10
  309. package/dist/web/workspace/remote/__next._tree.txt +3 -3
  310. package/dist/web/workspace/remote/__next.workspace.remote.__PAGE__.txt +2 -2
  311. package/dist/web/workspace/remote/__next.workspace.remote.txt +3 -3
  312. package/dist/web/workspace/remote/__next.workspace.txt +5 -5
  313. package/dist/web/workspace/remote.html +1 -1
  314. package/dist/web/workspace/remote.txt +17 -17
  315. package/dist/web/workspace/terminal/default/__next._full.txt +17 -17
  316. package/dist/web/workspace/terminal/default/__next._head.txt +4 -4
  317. package/dist/web/workspace/terminal/default/__next._index.txt +10 -10
  318. package/dist/web/workspace/terminal/default/__next._tree.txt +3 -3
  319. package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.__PAGE__.txt +2 -2
  320. package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.txt +3 -3
  321. package/dist/web/workspace/terminal/default/__next.workspace.terminal.txt +3 -3
  322. package/dist/web/workspace/terminal/default/__next.workspace.txt +5 -5
  323. package/dist/web/workspace/terminal/default.html +1 -1
  324. package/dist/web/workspace/terminal/default.txt +17 -17
  325. package/dist/web/workspace/welcome/__next._full.txt +17 -17
  326. package/dist/web/workspace/welcome/__next._head.txt +4 -4
  327. package/dist/web/workspace/welcome/__next._index.txt +10 -10
  328. package/dist/web/workspace/welcome/__next._tree.txt +3 -3
  329. package/dist/web/workspace/welcome/__next.workspace.txt +5 -5
  330. package/dist/web/workspace/welcome/__next.workspace.welcome.__PAGE__.txt +2 -2
  331. package/dist/web/workspace/welcome/__next.workspace.welcome.txt +3 -3
  332. package/dist/web/workspace/welcome.html +1 -1
  333. package/dist/web/workspace/welcome.txt +17 -17
  334. package/dist/web/workspace/workspaces/__next._full.txt +17 -17
  335. package/dist/web/workspace/workspaces/__next._head.txt +4 -4
  336. package/dist/web/workspace/workspaces/__next._index.txt +10 -10
  337. package/dist/web/workspace/workspaces/__next._tree.txt +3 -3
  338. package/dist/web/workspace/workspaces/__next.workspace.txt +5 -5
  339. package/dist/web/workspace/workspaces/__next.workspace.workspaces.__PAGE__.txt +2 -2
  340. package/dist/web/workspace/workspaces/__next.workspace.workspaces.txt +3 -3
  341. package/dist/web/workspace/workspaces.html +1 -1
  342. package/dist/web/workspace/workspaces.txt +17 -17
  343. package/dist/web/workspace.html +1 -1
  344. package/dist/web/workspace.txt +17 -17
  345. package/package.json +1 -1
  346. package/dist/ui/assets/index-BKC13tXO.js +0 -8
  347. package/dist/web/_next/static/chunks/1050-b9af41e8856b58c0.js +0 -1
  348. package/dist/web/_next/static/chunks/132.71f657e5a607b7d3.js +0 -1
  349. package/dist/web/_next/static/chunks/133.1106654a28b5afda.js +0 -1
  350. package/dist/web/_next/static/chunks/1385.086b560acb0d7a68.js +0 -115
  351. package/dist/web/_next/static/chunks/1642.cac26d30ac331cb4.js +0 -1
  352. package/dist/web/_next/static/chunks/1733.f06c240b3ef8a428.js +0 -77
  353. package/dist/web/_next/static/chunks/1750.ea89a41e86ac2790.js +0 -1
  354. package/dist/web/_next/static/chunks/1763.28beedca593b5e19.js +0 -138
  355. package/dist/web/_next/static/chunks/179.b9e8f385bd414d1c.js +0 -62
  356. package/dist/web/_next/static/chunks/1838.7c8990f903e3524a.js +0 -215
  357. package/dist/web/_next/static/chunks/2112.d72eefbdf81659b3.js +0 -23
  358. package/dist/web/_next/static/chunks/2125.61c6e4a3541e30ad.js +0 -1
  359. package/dist/web/_next/static/chunks/2129.61afb2f4ff59e46a.js +0 -24
  360. package/dist/web/_next/static/chunks/213.ae43f03862ad9cc1.js +0 -1
  361. package/dist/web/_next/static/chunks/2179.3f55be0b79e3cca7.js +0 -1
  362. package/dist/web/_next/static/chunks/2264.0fc1474d26067a01.js +0 -1
  363. package/dist/web/_next/static/chunks/2376.ed6302a91a9de1ae.js +0 -36
  364. package/dist/web/_next/static/chunks/2545.3ff192a933baf11e.js +0 -1
  365. package/dist/web/_next/static/chunks/2620.d17f4fac0eec88a5.js +0 -1
  366. package/dist/web/_next/static/chunks/2847.d3124853ca727b78.js +0 -1
  367. package/dist/web/_next/static/chunks/2849.d810c3fdb2054b14.js +0 -1
  368. package/dist/web/_next/static/chunks/3189.64c6546d621eec0b.js +0 -1
  369. package/dist/web/_next/static/chunks/3348-9ef29f9cedf6c0df.js +0 -1
  370. package/dist/web/_next/static/chunks/3514.20bd03c8194dec25.js +0 -1
  371. package/dist/web/_next/static/chunks/3606.b59e695fd05b4eb3.js +0 -74
  372. package/dist/web/_next/static/chunks/3736.4a5662ceeecc6acb.js +0 -94
  373. package/dist/web/_next/static/chunks/392.842b338137824bb8.js +0 -1
  374. package/dist/web/_next/static/chunks/4136-d7c1ff2da0833b42.js +0 -86
  375. package/dist/web/_next/static/chunks/4300-a66b52c9e1a27db3.js +0 -1
  376. package/dist/web/_next/static/chunks/4303.54c4aa0b89834fc6.js +0 -1
  377. package/dist/web/_next/static/chunks/4551.d0d6723cacfb90b9.js +0 -226
  378. package/dist/web/_next/static/chunks/4566.d8e009823b8647d1.js +0 -90
  379. package/dist/web/_next/static/chunks/4643.1e356e007756e19d.js +0 -1
  380. package/dist/web/_next/static/chunks/4930.42e564644c94a93b.js +0 -1
  381. package/dist/web/_next/static/chunks/5155.d7e8db52ab4c95e0.js +0 -27
  382. package/dist/web/_next/static/chunks/5158-267908d069475cdc.js +0 -32
  383. package/dist/web/_next/static/chunks/543.5636e97aa68eb9c8.js +0 -41
  384. package/dist/web/_next/static/chunks/5506.98304a1821200439.js +0 -1
  385. package/dist/web/_next/static/chunks/5622.5ead5e748ecedbd1.js +0 -1
  386. package/dist/web/_next/static/chunks/5708.22b4531ceebf3eca.js +0 -1
  387. package/dist/web/_next/static/chunks/5788-f0c87f9c14fa0ff9.js +0 -1
  388. package/dist/web/_next/static/chunks/5804.ff72a927135eb74c.js +0 -93
  389. package/dist/web/_next/static/chunks/588.78e2528ff24df85c.js +0 -287
  390. package/dist/web/_next/static/chunks/6001.e5bcb28bb9ce6571.js +0 -1
  391. package/dist/web/_next/static/chunks/6180.82fa683aa16f21df.js +0 -1
  392. package/dist/web/_next/static/chunks/6276.aa48f74970f7ef3d.js +0 -1
  393. package/dist/web/_next/static/chunks/6419.34fdd4aa97c5cc5d.js +0 -1
  394. package/dist/web/_next/static/chunks/6552-cebe84e4399a184f.js +0 -1
  395. package/dist/web/_next/static/chunks/6739.22a05398bfd34922.js +0 -1
  396. package/dist/web/_next/static/chunks/674.b2f5d5fc3fb84c4a.js +0 -1
  397. package/dist/web/_next/static/chunks/7202.dad90ce4a1d78f67.js +0 -1
  398. package/dist/web/_next/static/chunks/7233.0f252f6c1cce8058.js +0 -1
  399. package/dist/web/_next/static/chunks/7248.d89bf328a0dc1b4c.js +0 -1
  400. package/dist/web/_next/static/chunks/7263.6f224c3924155294.js +0 -1
  401. package/dist/web/_next/static/chunks/7341.6958eac888a96823.js +0 -34
  402. package/dist/web/_next/static/chunks/7811.19082afa63eb73ba.js +0 -1
  403. package/dist/web/_next/static/chunks/7853.d01982fa0afc1ee2.js +0 -24
  404. package/dist/web/_next/static/chunks/7908.432ab9feeb9ae756.js +0 -1
  405. package/dist/web/_next/static/chunks/7960.2754ce9111bef59e.js +0 -1
  406. package/dist/web/_next/static/chunks/7967.6c62be01fad1603c.js +0 -1
  407. package/dist/web/_next/static/chunks/8054.feeb01b8acdb31d4.js +0 -1
  408. package/dist/web/_next/static/chunks/817.cd0f4d221eca4c8b.js +0 -104
  409. package/dist/web/_next/static/chunks/8207-45554e2570bc59e6.js +0 -1
  410. package/dist/web/_next/static/chunks/8467.c2c0273ac5e97e34.js +0 -1
  411. package/dist/web/_next/static/chunks/8495.d6cea1be03635fa8.js +0 -148
  412. package/dist/web/_next/static/chunks/8638.f44546e4532d76e8.js +0 -1
  413. package/dist/web/_next/static/chunks/8669-8d1fb8dce08c886d.js +0 -11
  414. package/dist/web/_next/static/chunks/8716.1ad6febb58e8560e.js +0 -1
  415. package/dist/web/_next/static/chunks/8762-e88a7f91d20d82bd.js +0 -1
  416. package/dist/web/_next/static/chunks/8839.1ad64faf06fb4a33.js +0 -1
  417. package/dist/web/_next/static/chunks/8922-4c589850b01d2e12.js +0 -1
  418. package/dist/web/_next/static/chunks/910.43be9c3be85c7fa0.js +0 -21
  419. package/dist/web/_next/static/chunks/925.7cfb725e605559a0.js +0 -1
  420. package/dist/web/_next/static/chunks/9259.97e2f3306fc149c7.js +0 -1
  421. package/dist/web/_next/static/chunks/9387.96263a2d1602a078.js +0 -1
  422. package/dist/web/_next/static/chunks/9568-0bfadca4fcb105aa.js +0 -1
  423. package/dist/web/_next/static/chunks/9860.05fa134ae44699e0.js +0 -1
  424. package/dist/web/_next/static/chunks/9b87412a.d2cfae4121762dec.js +0 -122
  425. package/dist/web/_next/static/chunks/a096f98a-5a93977f5f5de413.js +0 -1
  426. package/dist/web/_next/static/chunks/ab1da478.d051e56375dab6d8.js +0 -1
  427. package/dist/web/_next/static/chunks/app/_global-error/page-e656bb9bc0f3fd3d.js +0 -1
  428. package/dist/web/_next/static/chunks/app/_not-found/page-877523282abd5a7c.js +0 -1
  429. package/dist/web/_next/static/chunks/app/admin/access/page-65febd13b3d1fc91.js +0 -5
  430. package/dist/web/_next/static/chunks/app/admin/login/page-8ff8150184b7ccaa.js +0 -1
  431. package/dist/web/_next/static/chunks/app/admin/ota/page-d8766baa3680522d.js +0 -5
  432. package/dist/web/_next/static/chunks/app/admin/page-6237b1487c05f33e.js +0 -5
  433. package/dist/web/_next/static/chunks/app/admin/turn/page-6a6b695b67d59451.js +0 -5
  434. package/dist/web/_next/static/chunks/app/dev/question/page-c7128ddf798789f1.js +0 -1
  435. package/dist/web/_next/static/chunks/app/layout-a0e78c8427f97e4f.js +0 -1
  436. package/dist/web/_next/static/chunks/app/login/page-2a046d10af50c87a.js +0 -1
  437. package/dist/web/_next/static/chunks/app/workspace/browse/page-e656bb9bc0f3fd3d.js +0 -1
  438. package/dist/web/_next/static/chunks/app/workspace/editor/page-e656bb9bc0f3fd3d.js +0 -1
  439. package/dist/web/_next/static/chunks/app/workspace/files/page-e656bb9bc0f3fd3d.js +0 -1
  440. package/dist/web/_next/static/chunks/app/workspace/git/page-e656bb9bc0f3fd3d.js +0 -1
  441. package/dist/web/_next/static/chunks/app/workspace/layout-9b28454945238595.js +0 -20
  442. package/dist/web/_next/static/chunks/app/workspace/mobile/page-e656bb9bc0f3fd3d.js +0 -1
  443. package/dist/web/_next/static/chunks/app/workspace/page-e656bb9bc0f3fd3d.js +0 -1
  444. package/dist/web/_next/static/chunks/app/workspace/pair/page-e656bb9bc0f3fd3d.js +0 -1
  445. package/dist/web/_next/static/chunks/app/workspace/remote/page-e656bb9bc0f3fd3d.js +0 -1
  446. package/dist/web/_next/static/chunks/app/workspace/terminal/[sessionId]/page-e656bb9bc0f3fd3d.js +0 -1
  447. package/dist/web/_next/static/chunks/app/workspace/welcome/page-e656bb9bc0f3fd3d.js +0 -1
  448. package/dist/web/_next/static/chunks/app/workspace/workspaces/page-e656bb9bc0f3fd3d.js +0 -1
  449. package/dist/web/_next/static/chunks/c7879cf7-0d16fce1674078f9.js +0 -1
  450. package/dist/web/_next/static/chunks/cdcce140.7a440644c3dd52b8.js +0 -1
  451. package/dist/web/_next/static/chunks/framework-42053c69543a55f9.js +0 -1
  452. package/dist/web/_next/static/chunks/main-255c95c36766ce86.js +0 -5
  453. package/dist/web/_next/static/chunks/main-app-1831d4f902c3fcb9.js +0 -1
  454. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/app-error-e656bb9bc0f3fd3d.js +0 -1
  455. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/forbidden-e656bb9bc0f3fd3d.js +0 -1
  456. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/global-error-76800531999827bd.js +0 -1
  457. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/not-found-e656bb9bc0f3fd3d.js +0 -1
  458. package/dist/web/_next/static/chunks/next/dist/client/components/builtin/unauthorized-e656bb9bc0f3fd3d.js +0 -1
  459. package/dist/web/_next/static/chunks/webpack-beef15eb580fc66b.js +0 -1
  460. package/dist/web/_next/static/css/c48f9629be2a67b4.css +0 -1
  461. /package/dist/web/_next/static/{hFRLMLaLieW6POo9cLvLQ → 55Oo1FQxj9HIxB7QE1XWG}/_buildManifest.js +0 -0
  462. /package/dist/web/_next/static/{hFRLMLaLieW6POo9cLvLQ → 55Oo1FQxj9HIxB7QE1XWG}/_ssgManifest.js +0 -0
  463. /package/dist/web/_next/static/chunks/{1311.8c6b8930e22ceea0.js → 6153.8c6b8930e22ceea0.js} +0 -0
  464. /package/dist/web/_next/static/chunks/{3692.8c6b8930e22ceea0.js → 8534.8c6b8930e22ceea0.js} +0 -0
@@ -1,33 +1,84 @@
1
- // 9remote browser bridge — a dumb CDP pipe. All business logic (snapshot,
1
+ // 9remote browser bridge — a dumb pipe. All business logic (snapshot,
2
2
  // click gates, tab discipline, settle waits) lives in the host engine; this
3
- // worker only forwards CDP verbs to chrome.debugger and shims the browser-level
4
- // tab verbs the engine speaks over the wire. It should almost never change.
5
- // Deliberately NOT an ES module (no import): the host bakes the relay URL into
6
- // this placeholder at install time, so no "type": "module" / SW-cache class of bugs.
3
+ // worker drives pages with a static content-script runner + synthetic DOM
4
+ // events, so Chrome never shows a debugging banner. It should almost never
5
+ // change. Deliberately NOT an ES module (no import): the host bakes the relay
6
+ // URL into this placeholder at install time, so no "type": "module" /
7
+ // SW-cache class of bugs.
7
8
  const RELAY_URL = "__RELAY_URL__";
8
9
 
9
10
  let ws = null;
10
11
  let paused = false; // user's kill switch (popup) — survives Chrome restarts
11
- const attached = new Set(); // target ids (strings — chrome.debugger's form) with a live attach
12
12
  const agentTabs = new Set(); // tabs the bridge opened or drives — never "the user's focus"
13
13
  let activeTabId = null; // tab Chrome currently shows
14
14
  let prevActiveTabId = null; // tab shown before the current one — the focus restore target
15
- // Idle soft-detach: Chrome closes the "started debugging" banner ~5s after the
16
- // debugger detaches, so an idle agent gets out of the user's face. The next
17
- // command re-attaches transparently — the engine never notices.
18
- const idleDetached = new Set(); // tabs WE detached while idle
19
- let lastCallAt = 0;
20
- const IDLE_DETACH_MS = 10000;
21
- const IDLE_SWEEP_MS = 3000;
15
+ const GROUP_TITLE = "9remote"; // agent tabs share one named tab group
16
+ const GROUP_COLOR = "orange"; // matches the 9remote brand
22
17
 
23
- function send(frame) {
24
- try { ws?.send(JSON.stringify(frame)); } catch { /* relay down — close handler reconnects */ }
18
+ // Serializes grouping so two quick creates cannot each mint their own group.
19
+ let groupQueue = Promise.resolve();
20
+ // Cosmetic only: a grouping failure must never break the agent's command.
21
+ function groupAgentTab(tab) {
22
+ groupQueue = groupQueue.then(async () => {
23
+ const [group] = await chrome.tabGroups.query({ title: GROUP_TITLE, windowId: tab.windowId });
24
+ const groupId = await chrome.tabs.group(group ? { tabIds: tab.id, groupId: group.id } : { tabIds: tab.id });
25
+ if (!group) await chrome.tabGroups.update(groupId, { title: GROUP_TITLE, color: GROUP_COLOR });
26
+ }).catch(() => {});
27
+ }
28
+
29
+ // Setup verbs the runner path accepts and ignores — no debugger session exists.
30
+ const LIGHT_NOOP = new Set(["Page.enable", "DOM.enable", "Runtime.enable", "Log.enable",
31
+ "Target.setAutoAttach", "Target.setDiscoverTargets",
32
+ "Emulation.setDeviceMetricsOverride", "Emulation.setFocusEmulationEnabled"]);
33
+ const LIGHT_UNSUPPORTED = new Set(["Page.captureScreenshot", "DOM.getDocument",
34
+ "DOM.requestNode", "DOM.setFileInputFiles"]);
35
+
36
+ // Normalize chrome API errors into the CDP shapes the engine's DEAD_SESSION
37
+ // regex keys on, so a closed tab heals the session instead of wedging it.
38
+ function normErr(tid, e) {
39
+ const msg = e?.message || String(e);
40
+ if (/no tab|tab not found|cannot access|chrome:\/\/|chrome web store/i.test(msg)) return `No target with given id: ${tid}`;
41
+ if (/refused to evaluate|content security policy/i.test(msg)) {
42
+ return `page CSP blocks script injection — this site cannot be driven via the extension`;
43
+ }
44
+ return msg; // anything else reads as "document navigating" to the engine
25
45
  }
26
46
 
27
- async function detachQuiet(tid, idle = false) {
28
- attached.delete(tid);
29
- if (!idle) idleDetached.delete(tid);
30
- try { await chrome.debugger.detach({ tabId: Number(tid) }); } catch { /* already gone */ }
47
+ // The runner is injected once per tab (idempotent — see runner.js); navigation
48
+ // destroys it, and the first sendMessage after that re-injects (AutoAgent
49
+ // background pattern).
50
+ const runnerTabs = new Set();
51
+ async function ensureRunner(tabId) {
52
+ if (runnerTabs.has(tabId)) return;
53
+ await chrome.scripting.executeScript({ target: { tabId }, files: ["runner.js"] });
54
+ runnerTabs.add(tabId);
55
+ }
56
+
57
+ // Runtime.evaluate → a named op on the static runner (see runner.js — MV3 CSP
58
+ // forbids eval, so the host tags every expression with an op name instead).
59
+ // Promise-returning ops are awaited inside the runner before the reply.
60
+ // A committing navigation wipes the runner and the injection can race it —
61
+ // retry the inject+ask pair a bounded number of times before giving up.
62
+ const TRANSIENT_INJECT = /receiving end does not exist|could not establish|message channel|cannot access contents/i;
63
+ async function evalInTab(tid, params) {
64
+ if (!params.op) throw new Error("the runner needs op-tagged expressions (update the host)");
65
+ const tabId = Number(tid);
66
+ let lastErr = null;
67
+ for (let i = 0; i < 8; i++) {
68
+ try {
69
+ await ensureRunner(tabId);
70
+ const r = await chrome.tabs.sendMessage(tabId, { t: "op", op: params.op, args: params.args || [] });
71
+ if (!r) throw new Error(`No target with given id: ${tid}`);
72
+ if (!r.ok) throw normErr(tid, { message: r.err });
73
+ return r.v ?? null;
74
+ } catch (e) {
75
+ lastErr = e;
76
+ if (!TRANSIENT_INJECT.test(e?.message || "")) throw normErr(tid, e);
77
+ runnerTabs.delete(tabId); // document changed under us — inject fresh
78
+ await new Promise((r) => setTimeout(r, 250));
79
+ }
80
+ }
81
+ throw normErr(tid, lastErr);
31
82
  }
32
83
 
33
84
  // Restore what the user was watching when a popup stole the focus. Only called
@@ -44,27 +95,18 @@ function snapBackFocus(tid) {
44
95
  setTimeout(focusBack, 250);
45
96
  }
46
97
 
47
- // Browser-level verbs the engine needs but chrome.debugger does not expose —
48
- // routed to chrome.tabs / chrome.debugger equivalents. Everything else rides
49
- // sendCommand untouched, so engine changes never require an extension update.
98
+ // Browser-level verbs the engine speaks over the wire, routed to chrome.tabs.
50
99
  const SHIM = {
51
- // Drop chrome.debugger for a tab on demand (engine `undbg` op): Google GIS
52
- // hides its sign-in button while a debugger is attached — detaching lets the
53
- // page render clean; the next engine call re-attaches automatically.
54
- "SHIM.Debugger.detach": async ({ targetId }) => {
55
- const tid = String(targetId);
56
- await detachQuiet(tid);
57
- return { detached: true };
58
- },
59
100
  "Target.getTargets": async () => {
60
- const targets = await chrome.debugger.getTargets();
61
- return { targetInfos: targets.map((t) => ({ targetId: String(t.tabId ?? t.id), type: t.type, title: t.title, url: t.url })) };
101
+ const tabs = await chrome.tabs.query({});
102
+ return { targetInfos: tabs.map((t) => ({ targetId: String(t.id), type: "page", title: t.title, url: t.url })) };
62
103
  },
63
104
  "Target.createTarget": async ({ url }) => {
64
105
  // Always background: agent tabs never steal the user's focus (focus
65
106
  // emulation on the page keeps them rendering anyway).
66
107
  const tab = await chrome.tabs.create({ url: url || "about:blank", active: false });
67
108
  agentTabs.add(String(tab.id));
109
+ groupAgentTab(tab);
68
110
  return { targetId: String(tab.id) };
69
111
  },
70
112
  "Target.closeTarget": async ({ targetId }) => {
@@ -72,26 +114,21 @@ const SHIM = {
72
114
  return {};
73
115
  },
74
116
  "Target.attachToTarget": async ({ targetId }) => {
75
- // chrome.debugger debuggee ids are STRINGS; chrome.tabs takes numbers —
76
- // translate at each boundary and keep strings everywhere inside.
117
+ // No debugger session exists — the session id IS the tab id.
77
118
  const tid = String(targetId);
78
- if (attached.has(tid)) return { sessionId: tid }; // session heal re-attaches its own target
79
- // One attached page at a time — mirrors engine usage, avoids stacked infobars.
80
- for (const prev of [...attached]) if (prev !== tid) detachQuiet(prev);
81
- await attachDebugger(tid);
82
- attached.add(tid);
119
+ agentTabs.add(tid);
83
120
  // A popup our click spawned takes the focus Chrome gives it — hand it back
84
121
  // to the tab the user was actually reading. The agent drives in background.
85
- agentTabs.add(tid);
86
122
  snapBackFocus(tid);
87
123
  return { sessionId: tid };
88
124
  },
89
- "Target.detachFromTarget": async ({ sessionId }) => {
90
- await detachQuiet(String(sessionId));
91
- return {};
125
+ "Target.detachFromTarget": async () => ({}),
126
+ "Target.getTargetInfo": async ({ targetId }) => {
127
+ const t = await chrome.tabs.get(Number(targetId));
128
+ return { targetInfo: { targetId: String(t.id), type: "page", title: t.title, url: t.url } };
92
129
  },
93
- // OOPIF child sessions are not reachable via chrome.debugger — accept and
94
- // ignore so the engine's setup() does not fail (frames just stay unobserved).
130
+ // OOPIF child sessions are not reachable — accept and ignore so the
131
+ // engine's setup() does not fail (frames just stay unobserved).
95
132
  "Target.setAutoAttach": async () => ({}),
96
133
  // Browser-level discovery is synthesized from tabs.onCreated below.
97
134
  "Target.setDiscoverTargets": async () => ({}),
@@ -102,67 +139,51 @@ const SHIM = {
102
139
 
103
140
  let inputAt = 0; // last Input.* dispatch — gates popup adoption below
104
141
 
105
-
106
- // The debugger target registers a beat after tabs.create — a cold attach can
107
- // fail with "No target with given id" even though the tab exists. Retry while
108
- // the tab is alive per chrome.tabs (source of truth), and surface the full
109
- // picture when Chrome still refuses.
110
- async function attachDebugger(tid) {
111
- for (let i = 0; i < 10; i++) {
112
- try {
113
- await chrome.debugger.attach({ tabId: Number(tid) }, "1.3");
114
- return;
115
- } catch (e) {
116
- const tabs = await chrome.tabs.query({}).catch(() => []);
117
- const alive = tabs.some((t) => String(t.id) === tid);
118
- if (!alive) {
119
- throw new Error(`attach tid=${tid}: tab not in chrome.tabs (closed?) — ${e.message}`);
120
- }
121
- if (i === 9) {
122
- throw new Error(`attach tid=${tid}: tab alive but Chrome refuses — ${e.message}`);
123
- }
124
- await new Promise((r) => setTimeout(r, 100));
125
- }
126
- }
127
- }
128
-
129
142
  async function dispatch(method, params, targetId) {
130
- if (SHIM[method]) return SHIM[method](params || {});
131
- if (targetId == null) throw new Error(`${method} is not available via the extension`);
132
- if (method.startsWith("Input.")) inputAt = Date.now();
133
- const tid = String(targetId);
134
- // Not attached (idle soft-detach, or this worker restarted and lost its set):
135
- // try to (re)attach first. Only a missing tab masquerades as "No target";
136
- // other failures (e.g. DevTools open on the tab) must surface as themselves.
137
- if (!attached.has(tid)) {
138
- idleDetached.delete(tid);
139
- await attachDebugger(tid);
140
- attached.add(tid);
143
+ if (LIGHT_NOOP.has(method)) return {};
144
+ if (method === "Runtime.evaluate") {
145
+ if (targetId == null) throw new Error("Runtime.evaluate needs a target");
146
+ // CDP envelope shape: the host's evaluate() unwraps result.result.value.
147
+ const value = await evalInTab(String(targetId), params);
148
+ return { result: { value: value ?? null } };
141
149
  }
142
- try {
143
- return await chrome.debugger.sendCommand({ tabId: Number(tid) }, method, params || {});
144
- } catch (e) {
145
- if (/no target|closed|detached|not found/i.test(e?.message || "")) {
146
- // The idle soft-detach timer can fire between our attach check and the
147
- // send — re-attach ONCE and retry before declaring the target dead.
148
- try {
149
- await attachDebugger(tid);
150
- attached.add(tid);
151
- return await chrome.debugger.sendCommand({ tabId: Number(tid) }, method, params || {});
152
- } catch {
153
- detachQuiet(tid);
154
- throw new Error(`No target with given id: ${targetId}`);
155
- }
156
- }
157
- throw e;
150
+ if (method === "Input.dispatchMouseEvent") {
151
+ inputAt = Date.now();
152
+ return evalInTab(String(targetId), { op: "mouse", args: [params.type, params.x, params.y] });
153
+ }
154
+ if (method === "Input.dispatchKeyEvent") {
155
+ inputAt = Date.now();
156
+ return evalInTab(String(targetId), { op: "key", args: [{ type: params.type, key: params.key, code: params.code,
157
+ modifiers: params.modifiers || 0, vk: params.windowsVirtualKeyCode, commands: params.commands }] });
158
+ }
159
+ if (method === "Input.insertText") {
160
+ inputAt = Date.now();
161
+ return evalInTab(String(targetId), { op: "insertText", args: [params.text] });
162
+ }
163
+ if (method === "Page.navigate") {
164
+ await chrome.tabs.update(Number(targetId), { url: params.url || "about:blank" });
165
+ return { frameId: 0 };
166
+ }
167
+ if (method === "Page.reload") {
168
+ await chrome.tabs.reload(Number(targetId));
169
+ return {};
170
+ }
171
+ if (method === "Browser.getWindowForTarget") {
172
+ return { windowId: (await chrome.tabs.get(Number(targetId))).windowId };
158
173
  }
174
+ if (SHIM[method]) return SHIM[method](params, targetId);
175
+ if (LIGHT_UNSUPPORTED.has(method)) {
176
+ throw new Error(`${method} is not available via the extension`);
177
+ }
178
+ throw new Error(`${method} is not available via the extension`);
179
+ }
180
+
181
+ function send(frame) {
182
+ try { ws?.send(JSON.stringify(frame)); } catch { /* relay down — close handler reconnects */ }
159
183
  }
160
184
 
161
- chrome.debugger.onEvent.addListener((source, method, params) => {
162
- send({ t: "event", method, params, sessionId: String(source.tabId ?? source.targetId) });
163
- });
164
185
  // Synthesize Target.targetCreated the engine's popup adoption listens for —
165
- // chrome.debugger never surfaces browser-level target events.
186
+ // chrome.tabs never surfaces browser-level target events.
166
187
  const POPUP_WINDOW_MS = 1500; // born within this after our Input dispatch = the agent's click
167
188
  chrome.tabs.onCreated.addListener((tab) => {
168
189
  // Only a tab born right after an agent click counts as the agent's popup —
@@ -177,42 +198,35 @@ chrome.tabs.onCreated.addListener((tab) => {
177
198
  ...((tab.openerTabId != null && agentPopup) ? { openerId: String(tab.openerTabId) } : {})
178
199
  } } });
179
200
  });
201
+ // Synthesize the main-frame navigation events settle() keys its nav tail on
202
+ // (a debugger session would get them from CDP for free).
203
+ chrome.webNavigation.onBeforeNavigate.addListener((d) => {
204
+ if (d.frameId !== 0) return;
205
+ send({ t: "event", method: "Page.frameRequestedNavigation",
206
+ params: { frame: {}, disposition: "currentTab" }, sessionId: String(d.tabId) });
207
+ });
208
+ chrome.webNavigation.onCommitted.addListener((d) => {
209
+ if (d.frameId !== 0) return;
210
+ send({ t: "event", method: "Page.frameNavigated",
211
+ params: { frame: { id: "0", url: d.url } }, sessionId: String(d.tabId) });
212
+ });
180
213
  // Pure tracking: which tab Chrome shows, and which one came before it. The
181
214
  // user clicking ANY tab (agent tabs included, to watch it work) just updates
182
215
  // the trackers — focus is only ever restored at the adoption moment above.
183
216
  chrome.tabs.onActivated.addListener(({ tabId }) => {
184
217
  if (activeTabId !== tabId) { prevActiveTabId = activeTabId; activeTabId = tabId; }
185
218
  });
186
- // A closed tab is gone for good — never re-attach onto its id.
219
+ // A closed tab is gone for good — never adopt onto its id again.
187
220
  chrome.tabs.onRemoved.addListener((tabId) => {
188
- attached.delete(String(tabId));
189
- idleDetached.delete(String(tabId));
190
- });
191
- // The idle sweep behind the soft-detach (see idleDetached above).
192
- setInterval(() => {
193
- if (!attached.size || Date.now() - lastCallAt < IDLE_DETACH_MS) return;
194
- for (const tid of [...attached]) {
195
- idleDetached.add(tid);
196
- detachQuiet(tid, true);
197
- }
198
- }, IDLE_SWEEP_MS);
199
- // "Cancel" on the debug infobar, DevTools open, or tab close — surface it the
200
- // way CDP would so the engine drops and rebuilds the session instead of wedging.
201
- chrome.debugger.onDetach.addListener((source) => {
202
- attached.delete(String(source.tabId ?? source.targetId));
203
- idleDetached.delete(String(source.tabId ?? source.targetId)); // user cancelled — stay detached
204
- send({ t: "event", method: "Target.detachedFromTarget", params: {
205
- sessionId: String(source.tabId ?? source.targetId), targetId: String(source.tabId ?? source.targetId)
206
- } });
221
+ runnerTabs.delete(tabId);
207
222
  });
208
223
 
209
- // The user's kill switch: pause = drop debugger + relay, hard. Nothing rides
224
+ // The user's kill switch: pause = drop the relay, hard. Nothing rides
210
225
  // through; the host simply sees the extension go offline.
211
226
  async function setPaused(next) {
212
227
  paused = next;
213
228
  try { await chrome.storage.local.set({ paused: next }); } catch { /* non-fatal */ }
214
229
  if (next) {
215
- for (const tid of [...attached]) detachQuiet(tid);
216
230
  try { ws?.close(); } catch { /* already closed */ }
217
231
  ws = null;
218
232
  } else if (!ws) {
@@ -246,7 +260,6 @@ function connect() {
246
260
  try { m = JSON.parse(ev.data); } catch { return; }
247
261
  if (m.t === "ping") return send({ t: "pong" });
248
262
  if (m.t !== "call") return;
249
- lastCallAt = Date.now();
250
263
  try { send({ t: "result", id: m.id, result: await dispatch(m.method, m.params, m.targetId) }); }
251
264
  catch (e) { send({ t: "result", id: m.id, error: e?.message || String(e) }); }
252
265
  };
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "manifest_version": 3,
3
- "name": "9remote Browser Bridge",
4
- "version": "1.0.1",
5
- "description": "Lets the 9remote host drive this browser. All logic lives on the host — this is only a CDP pipe.",
6
- "permissions": ["debugger", "tabs", "storage"],
3
+ "name": "9remote Bridge",
4
+ "version": "1.2.0",
5
+ "description": "Lets the 9remote host drive this browser. All logic lives on the host — this is only a pipe.",
6
+ "permissions": ["tabs", "tabGroups", "storage", "webNavigation", "scripting"],
7
+ "host_permissions": ["<all_urls>"],
7
8
  "background": { "service_worker": "background.js" },
8
9
  "action": { "default_popup": "popup.html" },
9
10
  "icons": { "16": "icons/icon16.png", "48": "icons/icon48.png", "128": "icons/icon128.png" },
10
- "minimum_chrome_version": "116"
11
+ "minimum_chrome_version": "135"
11
12
  }