9remote 3.0.34 → 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.
- package/dist/cli.cjs +163 -161
- package/dist/extension/background.js +137 -88
- package/dist/extension/manifest.json +6 -5
- package/dist/extension/runner.js +606 -0
- package/dist/ptyDaemon.cjs +2 -2
- package/dist/server.cjs +725 -517
- package/dist/ui/assets/index-D_C1NTm1.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 +17 -17
- package/dist/web/__next._head.txt +4 -4
- package/dist/web/__next._index.txt +10 -10
- package/dist/web/__next._tree.txt +3 -3
- 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/2488.87361126358794fd.js +1 -0
- 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/329-15d3e36af1b2827f.js +1 -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/3443.8d771dadb470603c.js +1 -0
- package/dist/web/_next/static/chunks/3704.bf80aa0d55f950d0.js +1 -0
- 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/4129.a93c19870036f647.js +1 -0
- 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/5714.122f8cb7296bc9e1.js +1 -0
- package/dist/web/_next/static/chunks/5757.2c157c0924cea1c2.js +1 -0
- 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/6485.6ae2f3966cc25c9e.js +1 -0
- 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/7646.1c26e96ee36bc317.js +1 -0
- package/dist/web/_next/static/chunks/7712.cd8c3dc2d794d714.js +1 -0
- package/dist/web/_next/static/chunks/7812.aabc856212c93434.js +1 -0
- package/dist/web/_next/static/chunks/804.38f05d79313a8dcc.js +104 -0
- package/dist/web/_next/static/chunks/8126-0279fc9e17c08aff.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-3d281debd0f3e659.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/dev/question/page-bafce0c9fd4e8488.js +1 -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-1e67d8a5f3775276.js +22 -0
- 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-d8bb677fa1caa5a7.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/1c2cca827fa36d54.css +1 -0
- package/dist/web/_not-found/__next._full.txt +15 -15
- 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 +15 -15
- package/dist/web/admin/__next._full.txt +17 -17
- package/dist/web/admin/__next._head.txt +4 -4
- package/dist/web/admin/__next._index.txt +10 -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 +17 -17
- package/dist/web/admin/access/__next._head.txt +4 -4
- package/dist/web/admin/access/__next._index.txt +10 -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 +17 -17
- package/dist/web/admin/login/__next._full.txt +17 -17
- package/dist/web/admin/login/__next._head.txt +4 -4
- package/dist/web/admin/login/__next._index.txt +10 -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 +17 -17
- package/dist/web/admin/ota/__next._full.txt +17 -17
- package/dist/web/admin/ota/__next._head.txt +4 -4
- package/dist/web/admin/ota/__next._index.txt +10 -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 +17 -17
- package/dist/web/admin/turn/__next._full.txt +17 -17
- package/dist/web/admin/turn/__next._head.txt +4 -4
- package/dist/web/admin/turn/__next._index.txt +10 -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 +17 -17
- package/dist/web/admin.html +1 -1
- package/dist/web/admin.txt +17 -17
- package/dist/web/dev/question/__next._full.txt +17 -17
- package/dist/web/dev/question/__next._head.txt +4 -4
- package/dist/web/dev/question/__next._index.txt +10 -10
- package/dist/web/dev/question/__next._tree.txt +3 -3
- package/dist/web/dev/question/__next.dev.question.__PAGE__.txt +4 -4
- package/dist/web/dev/question/__next.dev.question.txt +3 -3
- package/dist/web/dev/question/__next.dev.txt +3 -3
- package/dist/web/dev/question.html +1 -1
- package/dist/web/dev/question.txt +17 -17
- package/dist/web/download/__next._full.txt +16 -16
- package/dist/web/download/__next._head.txt +4 -4
- package/dist/web/download/__next._index.txt +10 -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 +16 -16
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +17 -17
- package/dist/web/login/__next._full.txt +17 -17
- package/dist/web/login/__next._head.txt +4 -4
- package/dist/web/login/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/__next._full.txt +17 -17
- package/dist/web/workspace/__next._head.txt +4 -4
- package/dist/web/workspace/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/browse/__next._head.txt +4 -4
- package/dist/web/workspace/browse/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/editor/__next._full.txt +17 -17
- package/dist/web/workspace/editor/__next._head.txt +4 -4
- package/dist/web/workspace/editor/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/files/__next._full.txt +17 -17
- package/dist/web/workspace/files/__next._head.txt +4 -4
- package/dist/web/workspace/files/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/git/__next._full.txt +17 -17
- package/dist/web/workspace/git/__next._head.txt +4 -4
- package/dist/web/workspace/git/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/mobile/__next._full.txt +17 -17
- package/dist/web/workspace/mobile/__next._head.txt +4 -4
- package/dist/web/workspace/mobile/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/pair/__next._full.txt +17 -17
- package/dist/web/workspace/pair/__next._head.txt +4 -4
- package/dist/web/workspace/pair/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/remote/__next._full.txt +17 -17
- package/dist/web/workspace/remote/__next._head.txt +4 -4
- package/dist/web/workspace/remote/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/terminal/default/__next._full.txt +26 -25
- package/dist/web/workspace/terminal/default/__next._head.txt +4 -4
- package/dist/web/workspace/terminal/default/__next._index.txt +10 -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 +26 -25
- package/dist/web/workspace/welcome/__next._full.txt +17 -17
- package/dist/web/workspace/welcome/__next._head.txt +4 -4
- package/dist/web/workspace/welcome/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace/workspaces/__next._full.txt +17 -17
- package/dist/web/workspace/workspaces/__next._head.txt +4 -4
- package/dist/web/workspace/workspaces/__next._index.txt +10 -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 +17 -17
- package/dist/web/workspace.html +1 -1
- package/dist/web/workspace.txt +17 -17
- package/package.json +1 -1
- package/dist/ui/assets/index-DbuftNJF.js +0 -8
- package/dist/web/_next/static/chunks/1050-b9af41e8856b58c0.js +0 -1
- package/dist/web/_next/static/chunks/1222.a2ce7d7f04241e2a.js +0 -1
- package/dist/web/_next/static/chunks/1228.046ad5fd038f5192.js +0 -1
- package/dist/web/_next/static/chunks/1243.1d11020940b8a88b.js +0 -1
- package/dist/web/_next/static/chunks/132.1ed2fce3a4b6f7ee.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.09ca4eade7a6e5d3.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/2038.b7c72b442a1b2d92.js +0 -1
- 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.f07a816120a320ba.js +0 -1
- package/dist/web/_next/static/chunks/2179.3f55be0b79e3cca7.js +0 -1
- package/dist/web/_next/static/chunks/2180.23585bd3f3308f3a.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.360e2c64521fa795.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/3429.98d7e79ff6d2a6ce.js +0 -1
- package/dist/web/_next/static/chunks/3514.9079bf49bb3e05c9.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-7d6c9b3328075562.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.ddf3ea3a760e73a5.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-d4b8dc2ab68396b6.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.99aa173d83f20370.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.97a7237f011fb986.js +0 -1
- package/dist/web/_next/static/chunks/6742.bc3783b9784ead96.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/7507.28a3807b5d02a5c1.js +0 -1
- 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.026e07028dd25edb.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.290e9bde34b58e7c.js +0 -1
- package/dist/web/_next/static/chunks/8495.d6cea1be03635fa8.js +0 -148
- package/dist/web/_next/static/chunks/8638.237712645dcdcb8a.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-cb470d05070f5ead.js +0 -1
- package/dist/web/_next/static/chunks/8839.1ad64faf06fb4a33.js +0 -1
- package/dist/web/_next/static/chunks/8922-8660f73e9cd42406.js +0 -1
- package/dist/web/_next/static/chunks/910.43be9c3be85c7fa0.js +0 -21
- package/dist/web/_next/static/chunks/925.fe600c6039a3201d.js +0 -1
- package/dist/web/_next/static/chunks/9259.c450f561db04037d.js +0 -1
- package/dist/web/_next/static/chunks/9299.83236781dfa74eb0.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-bdedfcfce7a3c516.js +0 -1
- package/dist/web/_next/static/chunks/app/layout-a0e78c8427f97e4f.js +0 -1
- package/dist/web/_next/static/chunks/app/login/page-edc7457ddecf9262.js +0 -1
- package/dist/web/_next/static/chunks/app/page-b76772608a876c23.js +0 -22
- 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-0fd9ea03182e9c89.js +0 -15
- 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-f3500fd1fae71c88.js +0 -1
- package/dist/web/_next/static/css/1b307dedbb687210.css +0 -1
- package/dist/web/proxy.html +0 -179
- package/dist/web/sw-site.js +0 -283
- package/dist/web/swBridgeClaim.js +0 -57
- /package/dist/web/_next/static/{DdbafQkcX_ZaKRMjMeNKp → 55Oo1FQxj9HIxB7QE1XWG}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{DdbafQkcX_ZaKRMjMeNKp → 55Oo1FQxj9HIxB7QE1XWG}/_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,84 @@
|
|
|
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
|
-
//
|
|
5
|
-
// Deliberately NOT an ES module (no import): the host bakes the relay
|
|
6
|
-
// this placeholder at install time, so no "type": "module" /
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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(() => {});
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
45
|
+
}
|
|
46
|
+
|
|
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,19 +95,18 @@ function snapBackFocus(tid) {
|
|
|
44
95
|
setTimeout(focusBack, 250);
|
|
45
96
|
}
|
|
46
97
|
|
|
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.
|
|
98
|
+
// Browser-level verbs the engine speaks over the wire, routed to chrome.tabs.
|
|
50
99
|
const SHIM = {
|
|
51
100
|
"Target.getTargets": async () => {
|
|
52
|
-
const
|
|
53
|
-
return { targetInfos:
|
|
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 })) };
|
|
54
103
|
},
|
|
55
104
|
"Target.createTarget": async ({ url }) => {
|
|
56
105
|
// Always background: agent tabs never steal the user's focus (focus
|
|
57
106
|
// emulation on the page keeps them rendering anyway).
|
|
58
107
|
const tab = await chrome.tabs.create({ url: url || "about:blank", active: false });
|
|
59
108
|
agentTabs.add(String(tab.id));
|
|
109
|
+
groupAgentTab(tab);
|
|
60
110
|
return { targetId: String(tab.id) };
|
|
61
111
|
},
|
|
62
112
|
"Target.closeTarget": async ({ targetId }) => {
|
|
@@ -64,26 +114,21 @@ const SHIM = {
|
|
|
64
114
|
return {};
|
|
65
115
|
},
|
|
66
116
|
"Target.attachToTarget": async ({ targetId }) => {
|
|
67
|
-
//
|
|
68
|
-
// translate at each boundary and keep strings everywhere inside.
|
|
117
|
+
// No debugger session exists — the session id IS the tab id.
|
|
69
118
|
const tid = String(targetId);
|
|
70
|
-
|
|
71
|
-
// One attached page at a time — mirrors engine usage, avoids stacked infobars.
|
|
72
|
-
for (const prev of [...attached]) if (prev !== tid) detachQuiet(prev);
|
|
73
|
-
await chrome.debugger.attach({ targetId: tid }, "1.3");
|
|
74
|
-
attached.add(tid);
|
|
119
|
+
agentTabs.add(tid);
|
|
75
120
|
// A popup our click spawned takes the focus Chrome gives it — hand it back
|
|
76
121
|
// to the tab the user was actually reading. The agent drives in background.
|
|
77
|
-
agentTabs.add(tid);
|
|
78
122
|
snapBackFocus(tid);
|
|
79
123
|
return { sessionId: tid };
|
|
80
124
|
},
|
|
81
|
-
"Target.detachFromTarget": async (
|
|
82
|
-
|
|
83
|
-
|
|
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 } };
|
|
84
129
|
},
|
|
85
|
-
// OOPIF child sessions are not reachable
|
|
86
|
-
//
|
|
130
|
+
// OOPIF child sessions are not reachable — accept and ignore so the
|
|
131
|
+
// engine's setup() does not fail (frames just stay unobserved).
|
|
87
132
|
"Target.setAutoAttach": async () => ({}),
|
|
88
133
|
// Browser-level discovery is synthesized from tabs.onCreated below.
|
|
89
134
|
"Target.setDiscoverTargets": async () => ({}),
|
|
@@ -95,38 +140,50 @@ const SHIM = {
|
|
|
95
140
|
let inputAt = 0; // last Input.* dispatch — gates popup adoption below
|
|
96
141
|
|
|
97
142
|
async function dispatch(method, params, targetId) {
|
|
98
|
-
if (
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
: e;
|
|
114
|
-
}
|
|
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 } };
|
|
149
|
+
}
|
|
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 }] });
|
|
115
158
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
// A detached/closed target must look dead to the host's DEAD_SESSION heal.
|
|
120
|
-
if (!attached.has(tid)) throw new Error(`No target with given id: ${targetId}`);
|
|
121
|
-
throw e;
|
|
159
|
+
if (method === "Input.insertText") {
|
|
160
|
+
inputAt = Date.now();
|
|
161
|
+
return evalInTab(String(targetId), { op: "insertText", args: [params.text] });
|
|
122
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 };
|
|
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 */ }
|
|
123
183
|
}
|
|
124
184
|
|
|
125
|
-
chrome.debugger.onEvent.addListener((source, method, params) => {
|
|
126
|
-
send({ t: "event", method, params, sessionId: String(source.targetId) });
|
|
127
|
-
});
|
|
128
185
|
// Synthesize Target.targetCreated the engine's popup adoption listens for —
|
|
129
|
-
// chrome.
|
|
186
|
+
// chrome.tabs never surfaces browser-level target events.
|
|
130
187
|
const POPUP_WINDOW_MS = 1500; // born within this after our Input dispatch = the agent's click
|
|
131
188
|
chrome.tabs.onCreated.addListener((tab) => {
|
|
132
189
|
// Only a tab born right after an agent click counts as the agent's popup —
|
|
@@ -141,42 +198,35 @@ chrome.tabs.onCreated.addListener((tab) => {
|
|
|
141
198
|
...((tab.openerTabId != null && agentPopup) ? { openerId: String(tab.openerTabId) } : {})
|
|
142
199
|
} } });
|
|
143
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
|
+
});
|
|
144
213
|
// Pure tracking: which tab Chrome shows, and which one came before it. The
|
|
145
214
|
// user clicking ANY tab (agent tabs included, to watch it work) just updates
|
|
146
215
|
// the trackers — focus is only ever restored at the adoption moment above.
|
|
147
216
|
chrome.tabs.onActivated.addListener(({ tabId }) => {
|
|
148
217
|
if (activeTabId !== tabId) { prevActiveTabId = activeTabId; activeTabId = tabId; }
|
|
149
218
|
});
|
|
150
|
-
// A closed tab is gone for good — never
|
|
219
|
+
// A closed tab is gone for good — never adopt onto its id again.
|
|
151
220
|
chrome.tabs.onRemoved.addListener((tabId) => {
|
|
152
|
-
|
|
153
|
-
idleDetached.delete(String(tabId));
|
|
154
|
-
});
|
|
155
|
-
// The idle sweep behind the soft-detach (see idleDetached above).
|
|
156
|
-
setInterval(() => {
|
|
157
|
-
if (!attached.size || Date.now() - lastCallAt < IDLE_DETACH_MS) return;
|
|
158
|
-
for (const tid of [...attached]) {
|
|
159
|
-
idleDetached.add(tid);
|
|
160
|
-
detachQuiet(tid, true);
|
|
161
|
-
}
|
|
162
|
-
}, IDLE_SWEEP_MS);
|
|
163
|
-
// "Cancel" on the debug infobar, DevTools open, or tab close — surface it the
|
|
164
|
-
// way CDP would so the engine drops and rebuilds the session instead of wedging.
|
|
165
|
-
chrome.debugger.onDetach.addListener((source) => {
|
|
166
|
-
attached.delete(source.targetId);
|
|
167
|
-
idleDetached.delete(String(source.targetId)); // user cancelled — stay detached
|
|
168
|
-
send({ t: "event", method: "Target.detachedFromTarget", params: {
|
|
169
|
-
sessionId: String(source.targetId), targetId: String(source.targetId)
|
|
170
|
-
} });
|
|
221
|
+
runnerTabs.delete(tabId);
|
|
171
222
|
});
|
|
172
223
|
|
|
173
|
-
// The user's kill switch: pause = drop
|
|
224
|
+
// The user's kill switch: pause = drop the relay, hard. Nothing rides
|
|
174
225
|
// through; the host simply sees the extension go offline.
|
|
175
226
|
async function setPaused(next) {
|
|
176
227
|
paused = next;
|
|
177
228
|
try { await chrome.storage.local.set({ paused: next }); } catch { /* non-fatal */ }
|
|
178
229
|
if (next) {
|
|
179
|
-
for (const tid of [...attached]) detachQuiet(tid);
|
|
180
230
|
try { ws?.close(); } catch { /* already closed */ }
|
|
181
231
|
ws = null;
|
|
182
232
|
} else if (!ws) {
|
|
@@ -204,13 +254,12 @@ chrome.runtime.onMessage.addListener((msg, _sender, sendResponse) => {
|
|
|
204
254
|
function connect() {
|
|
205
255
|
if (paused) return; // never dial out while the kill switch is on
|
|
206
256
|
ws = new WebSocket(RELAY_URL);
|
|
207
|
-
ws.onopen = () => send({ t: "hello", proto:
|
|
257
|
+
ws.onopen = () => send({ t: "hello", proto: 2 });
|
|
208
258
|
ws.onmessage = async (ev) => {
|
|
209
259
|
let m;
|
|
210
260
|
try { m = JSON.parse(ev.data); } catch { return; }
|
|
211
261
|
if (m.t === "ping") return send({ t: "pong" });
|
|
212
262
|
if (m.t !== "call") return;
|
|
213
|
-
lastCallAt = Date.now();
|
|
214
263
|
try { send({ t: "result", id: m.id, result: await dispatch(m.method, m.params, m.targetId) }); }
|
|
215
264
|
catch (e) { send({ t: "result", id: m.id, error: e?.message || String(e) }); }
|
|
216
265
|
};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
|
-
"name": "9remote
|
|
4
|
-
"version": "1.
|
|
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.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": "
|
|
11
|
+
"minimum_chrome_version": "135"
|
|
11
12
|
}
|