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