9remote 3.0.34 → 3.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/cli.cjs +144 -142
  2. package/dist/extension/background.js +55 -19
  3. package/dist/extension/manifest.json +1 -1
  4. package/dist/ptyDaemon.cjs +2 -2
  5. package/dist/server.cjs +729 -517
  6. package/dist/ui/assets/index-BKC13tXO.js +8 -0
  7. package/dist/ui/index.html +1 -1
  8. package/dist/web/404.html +1 -1
  9. package/dist/web/__next.__PAGE__.txt +2 -2
  10. package/dist/web/__next._full.txt +8 -8
  11. package/dist/web/__next._head.txt +1 -1
  12. package/dist/web/__next._index.txt +7 -7
  13. package/dist/web/__next._tree.txt +2 -2
  14. package/dist/web/_next/static/chunks/1222.16edfbb0beb9081f.js +1 -0
  15. package/dist/web/_next/static/chunks/1228.c4aa83586b3730b6.js +1 -0
  16. package/dist/web/_next/static/chunks/1243.3f23d89283c156ea.js +1 -0
  17. package/dist/web/_next/static/chunks/132.71f657e5a607b7d3.js +1 -0
  18. package/dist/web/_next/static/chunks/1750.ea89a41e86ac2790.js +1 -0
  19. package/dist/web/_next/static/chunks/2038.b77e2c3d38385a76.js +1 -0
  20. package/dist/web/_next/static/chunks/213.ae43f03862ad9cc1.js +1 -0
  21. package/dist/web/_next/static/chunks/2180.edcf5dc3d77ceee8.js +1 -0
  22. package/dist/web/_next/static/chunks/2849.d810c3fdb2054b14.js +1 -0
  23. package/dist/web/_next/static/chunks/3429.e69c6bd48e1207a9.js +1 -0
  24. package/dist/web/_next/static/chunks/3514.20bd03c8194dec25.js +1 -0
  25. package/dist/web/_next/static/chunks/{4300-7d6c9b3328075562.js → 4300-a66b52c9e1a27db3.js} +1 -1
  26. package/dist/web/_next/static/chunks/4643.1e356e007756e19d.js +1 -0
  27. package/dist/web/_next/static/chunks/5788-f0c87f9c14fa0ff9.js +1 -0
  28. package/dist/web/_next/static/chunks/6419.34fdd4aa97c5cc5d.js +1 -0
  29. package/dist/web/_next/static/chunks/674.b2f5d5fc3fb84c4a.js +1 -0
  30. package/dist/web/_next/static/chunks/6742.88fddf128fbeb43d.js +1 -0
  31. package/dist/web/_next/static/chunks/7507.77d9ac9eb03518f7.js +1 -0
  32. package/dist/web/_next/static/chunks/7960.2754ce9111bef59e.js +1 -0
  33. package/dist/web/_next/static/chunks/8467.c2c0273ac5e97e34.js +1 -0
  34. package/dist/web/_next/static/chunks/8638.f44546e4532d76e8.js +1 -0
  35. package/dist/web/_next/static/chunks/{8762-cb470d05070f5ead.js → 8762-e88a7f91d20d82bd.js} +1 -1
  36. package/dist/web/_next/static/chunks/8922-4c589850b01d2e12.js +1 -0
  37. package/dist/web/_next/static/chunks/925.7cfb725e605559a0.js +1 -0
  38. package/dist/web/_next/static/chunks/9259.97e2f3306fc149c7.js +1 -0
  39. package/dist/web/_next/static/chunks/9299.e37149b455be7e9d.js +1 -0
  40. package/dist/web/_next/static/chunks/app/dev/question/page-c7128ddf798789f1.js +1 -0
  41. package/dist/web/_next/static/chunks/app/login/{page-edc7457ddecf9262.js → page-2a046d10af50c87a.js} +1 -1
  42. package/dist/web/_next/static/chunks/app/{page-b76772608a876c23.js → page-8387dba850541259.js} +2 -2
  43. package/dist/web/_next/static/chunks/app/workspace/layout-9b28454945238595.js +20 -0
  44. package/dist/web/_next/static/chunks/webpack-beef15eb580fc66b.js +1 -0
  45. package/dist/web/_next/static/css/c48f9629be2a67b4.css +1 -0
  46. package/dist/web/_not-found/__next._full.txt +7 -7
  47. package/dist/web/_not-found/__next._head.txt +1 -1
  48. package/dist/web/_not-found/__next._index.txt +7 -7
  49. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +1 -1
  50. package/dist/web/_not-found/__next._not-found.txt +1 -1
  51. package/dist/web/_not-found/__next._tree.txt +2 -2
  52. package/dist/web/_not-found.html +1 -1
  53. package/dist/web/_not-found.txt +7 -7
  54. package/dist/web/admin/__next._full.txt +8 -8
  55. package/dist/web/admin/__next._head.txt +1 -1
  56. package/dist/web/admin/__next._index.txt +7 -7
  57. package/dist/web/admin/__next._tree.txt +2 -2
  58. package/dist/web/admin/__next.admin.__PAGE__.txt +2 -2
  59. package/dist/web/admin/__next.admin.txt +1 -1
  60. package/dist/web/admin/access/__next._full.txt +8 -8
  61. package/dist/web/admin/access/__next._head.txt +1 -1
  62. package/dist/web/admin/access/__next._index.txt +7 -7
  63. package/dist/web/admin/access/__next._tree.txt +2 -2
  64. package/dist/web/admin/access/__next.admin.access.__PAGE__.txt +2 -2
  65. package/dist/web/admin/access/__next.admin.access.txt +1 -1
  66. package/dist/web/admin/access/__next.admin.txt +1 -1
  67. package/dist/web/admin/access.html +1 -1
  68. package/dist/web/admin/access.txt +8 -8
  69. package/dist/web/admin/login/__next._full.txt +8 -8
  70. package/dist/web/admin/login/__next._head.txt +1 -1
  71. package/dist/web/admin/login/__next._index.txt +7 -7
  72. package/dist/web/admin/login/__next._tree.txt +2 -2
  73. package/dist/web/admin/login/__next.admin.login.__PAGE__.txt +2 -2
  74. package/dist/web/admin/login/__next.admin.login.txt +1 -1
  75. package/dist/web/admin/login/__next.admin.txt +1 -1
  76. package/dist/web/admin/login.html +1 -1
  77. package/dist/web/admin/login.txt +8 -8
  78. package/dist/web/admin/ota/__next._full.txt +8 -8
  79. package/dist/web/admin/ota/__next._head.txt +1 -1
  80. package/dist/web/admin/ota/__next._index.txt +7 -7
  81. package/dist/web/admin/ota/__next._tree.txt +2 -2
  82. package/dist/web/admin/ota/__next.admin.ota.__PAGE__.txt +2 -2
  83. package/dist/web/admin/ota/__next.admin.ota.txt +1 -1
  84. package/dist/web/admin/ota/__next.admin.txt +1 -1
  85. package/dist/web/admin/ota.html +1 -1
  86. package/dist/web/admin/ota.txt +8 -8
  87. package/dist/web/admin/turn/__next._full.txt +8 -8
  88. package/dist/web/admin/turn/__next._head.txt +1 -1
  89. package/dist/web/admin/turn/__next._index.txt +7 -7
  90. package/dist/web/admin/turn/__next._tree.txt +2 -2
  91. package/dist/web/admin/turn/__next.admin.turn.__PAGE__.txt +2 -2
  92. package/dist/web/admin/turn/__next.admin.turn.txt +1 -1
  93. package/dist/web/admin/turn/__next.admin.txt +1 -1
  94. package/dist/web/admin/turn.html +1 -1
  95. package/dist/web/admin/turn.txt +8 -8
  96. package/dist/web/admin.html +1 -1
  97. package/dist/web/admin.txt +8 -8
  98. package/dist/web/dev/question/__next._full.txt +8 -8
  99. package/dist/web/dev/question/__next._head.txt +1 -1
  100. package/dist/web/dev/question/__next._index.txt +7 -7
  101. package/dist/web/dev/question/__next._tree.txt +2 -2
  102. package/dist/web/dev/question/__next.dev.question.__PAGE__.txt +2 -2
  103. package/dist/web/dev/question/__next.dev.question.txt +1 -1
  104. package/dist/web/dev/question/__next.dev.txt +1 -1
  105. package/dist/web/dev/question.html +1 -1
  106. package/dist/web/dev/question.txt +8 -8
  107. package/dist/web/download/__next._full.txt +8 -8
  108. package/dist/web/download/__next._head.txt +1 -1
  109. package/dist/web/download/__next._index.txt +7 -7
  110. package/dist/web/download/__next._tree.txt +2 -2
  111. package/dist/web/download/__next.download.__PAGE__.txt +2 -2
  112. package/dist/web/download/__next.download.txt +1 -1
  113. package/dist/web/download.html +1 -1
  114. package/dist/web/download.txt +8 -8
  115. package/dist/web/index.html +1 -1
  116. package/dist/web/index.txt +8 -8
  117. package/dist/web/login/__next._full.txt +8 -8
  118. package/dist/web/login/__next._head.txt +1 -1
  119. package/dist/web/login/__next._index.txt +7 -7
  120. package/dist/web/login/__next._tree.txt +2 -2
  121. package/dist/web/login/__next.login.__PAGE__.txt +2 -2
  122. package/dist/web/login/__next.login.txt +1 -1
  123. package/dist/web/login.html +1 -1
  124. package/dist/web/login.txt +8 -8
  125. package/dist/web/workspace/__next._full.txt +8 -8
  126. package/dist/web/workspace/__next._head.txt +1 -1
  127. package/dist/web/workspace/__next._index.txt +7 -7
  128. package/dist/web/workspace/__next._tree.txt +2 -2
  129. package/dist/web/workspace/__next.workspace.__PAGE__.txt +1 -1
  130. package/dist/web/workspace/__next.workspace.txt +2 -2
  131. package/dist/web/workspace/browse/__next._full.txt +8 -8
  132. package/dist/web/workspace/browse/__next._head.txt +1 -1
  133. package/dist/web/workspace/browse/__next._index.txt +7 -7
  134. package/dist/web/workspace/browse/__next._tree.txt +2 -2
  135. package/dist/web/workspace/browse/__next.workspace.browse.__PAGE__.txt +1 -1
  136. package/dist/web/workspace/browse/__next.workspace.browse.txt +1 -1
  137. package/dist/web/workspace/browse/__next.workspace.txt +2 -2
  138. package/dist/web/workspace/browse.html +1 -1
  139. package/dist/web/workspace/browse.txt +8 -8
  140. package/dist/web/workspace/editor/__next._full.txt +8 -8
  141. package/dist/web/workspace/editor/__next._head.txt +1 -1
  142. package/dist/web/workspace/editor/__next._index.txt +7 -7
  143. package/dist/web/workspace/editor/__next._tree.txt +2 -2
  144. package/dist/web/workspace/editor/__next.workspace.editor.__PAGE__.txt +1 -1
  145. package/dist/web/workspace/editor/__next.workspace.editor.txt +1 -1
  146. package/dist/web/workspace/editor/__next.workspace.txt +2 -2
  147. package/dist/web/workspace/editor.html +1 -1
  148. package/dist/web/workspace/editor.txt +8 -8
  149. package/dist/web/workspace/files/__next._full.txt +8 -8
  150. package/dist/web/workspace/files/__next._head.txt +1 -1
  151. package/dist/web/workspace/files/__next._index.txt +7 -7
  152. package/dist/web/workspace/files/__next._tree.txt +2 -2
  153. package/dist/web/workspace/files/__next.workspace.files.__PAGE__.txt +1 -1
  154. package/dist/web/workspace/files/__next.workspace.files.txt +1 -1
  155. package/dist/web/workspace/files/__next.workspace.txt +2 -2
  156. package/dist/web/workspace/files.html +1 -1
  157. package/dist/web/workspace/files.txt +8 -8
  158. package/dist/web/workspace/git/__next._full.txt +8 -8
  159. package/dist/web/workspace/git/__next._head.txt +1 -1
  160. package/dist/web/workspace/git/__next._index.txt +7 -7
  161. package/dist/web/workspace/git/__next._tree.txt +2 -2
  162. package/dist/web/workspace/git/__next.workspace.git.__PAGE__.txt +1 -1
  163. package/dist/web/workspace/git/__next.workspace.git.txt +1 -1
  164. package/dist/web/workspace/git/__next.workspace.txt +2 -2
  165. package/dist/web/workspace/git.html +1 -1
  166. package/dist/web/workspace/git.txt +8 -8
  167. package/dist/web/workspace/mobile/__next._full.txt +8 -8
  168. package/dist/web/workspace/mobile/__next._head.txt +1 -1
  169. package/dist/web/workspace/mobile/__next._index.txt +7 -7
  170. package/dist/web/workspace/mobile/__next._tree.txt +2 -2
  171. package/dist/web/workspace/mobile/__next.workspace.mobile.__PAGE__.txt +1 -1
  172. package/dist/web/workspace/mobile/__next.workspace.mobile.txt +1 -1
  173. package/dist/web/workspace/mobile/__next.workspace.txt +2 -2
  174. package/dist/web/workspace/mobile.html +1 -1
  175. package/dist/web/workspace/mobile.txt +8 -8
  176. package/dist/web/workspace/pair/__next._full.txt +8 -8
  177. package/dist/web/workspace/pair/__next._head.txt +1 -1
  178. package/dist/web/workspace/pair/__next._index.txt +7 -7
  179. package/dist/web/workspace/pair/__next._tree.txt +2 -2
  180. package/dist/web/workspace/pair/__next.workspace.pair.__PAGE__.txt +1 -1
  181. package/dist/web/workspace/pair/__next.workspace.pair.txt +1 -1
  182. package/dist/web/workspace/pair/__next.workspace.txt +2 -2
  183. package/dist/web/workspace/pair.html +1 -1
  184. package/dist/web/workspace/pair.txt +8 -8
  185. package/dist/web/workspace/remote/__next._full.txt +8 -8
  186. package/dist/web/workspace/remote/__next._head.txt +1 -1
  187. package/dist/web/workspace/remote/__next._index.txt +7 -7
  188. package/dist/web/workspace/remote/__next._tree.txt +2 -2
  189. package/dist/web/workspace/remote/__next.workspace.remote.__PAGE__.txt +1 -1
  190. package/dist/web/workspace/remote/__next.workspace.remote.txt +1 -1
  191. package/dist/web/workspace/remote/__next.workspace.txt +2 -2
  192. package/dist/web/workspace/remote.html +1 -1
  193. package/dist/web/workspace/remote.txt +8 -8
  194. package/dist/web/workspace/terminal/default/__next._full.txt +22 -21
  195. package/dist/web/workspace/terminal/default/__next._head.txt +1 -1
  196. package/dist/web/workspace/terminal/default/__next._index.txt +7 -7
  197. package/dist/web/workspace/terminal/default/__next._tree.txt +2 -2
  198. package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.__PAGE__.txt +1 -1
  199. package/dist/web/workspace/terminal/default/__next.workspace.terminal.$d$sessionId.txt +1 -1
  200. package/dist/web/workspace/terminal/default/__next.workspace.terminal.txt +1 -1
  201. package/dist/web/workspace/terminal/default/__next.workspace.txt +2 -2
  202. package/dist/web/workspace/terminal/default.html +1 -1
  203. package/dist/web/workspace/terminal/default.txt +22 -21
  204. package/dist/web/workspace/welcome/__next._full.txt +8 -8
  205. package/dist/web/workspace/welcome/__next._head.txt +1 -1
  206. package/dist/web/workspace/welcome/__next._index.txt +7 -7
  207. package/dist/web/workspace/welcome/__next._tree.txt +2 -2
  208. package/dist/web/workspace/welcome/__next.workspace.txt +2 -2
  209. package/dist/web/workspace/welcome/__next.workspace.welcome.__PAGE__.txt +1 -1
  210. package/dist/web/workspace/welcome/__next.workspace.welcome.txt +1 -1
  211. package/dist/web/workspace/welcome.html +1 -1
  212. package/dist/web/workspace/welcome.txt +8 -8
  213. package/dist/web/workspace/workspaces/__next._full.txt +8 -8
  214. package/dist/web/workspace/workspaces/__next._head.txt +1 -1
  215. package/dist/web/workspace/workspaces/__next._index.txt +7 -7
  216. package/dist/web/workspace/workspaces/__next._tree.txt +2 -2
  217. package/dist/web/workspace/workspaces/__next.workspace.txt +2 -2
  218. package/dist/web/workspace/workspaces/__next.workspace.workspaces.__PAGE__.txt +1 -1
  219. package/dist/web/workspace/workspaces/__next.workspace.workspaces.txt +1 -1
  220. package/dist/web/workspace/workspaces.html +1 -1
  221. package/dist/web/workspace/workspaces.txt +8 -8
  222. package/dist/web/workspace.html +1 -1
  223. package/dist/web/workspace.txt +8 -8
  224. package/package.json +1 -1
  225. package/dist/ui/assets/index-DbuftNJF.js +0 -8
  226. package/dist/web/_next/static/chunks/1222.a2ce7d7f04241e2a.js +0 -1
  227. package/dist/web/_next/static/chunks/1228.046ad5fd038f5192.js +0 -1
  228. package/dist/web/_next/static/chunks/1243.1d11020940b8a88b.js +0 -1
  229. package/dist/web/_next/static/chunks/132.1ed2fce3a4b6f7ee.js +0 -1
  230. package/dist/web/_next/static/chunks/1750.09ca4eade7a6e5d3.js +0 -1
  231. package/dist/web/_next/static/chunks/2038.b7c72b442a1b2d92.js +0 -1
  232. package/dist/web/_next/static/chunks/213.f07a816120a320ba.js +0 -1
  233. package/dist/web/_next/static/chunks/2180.23585bd3f3308f3a.js +0 -1
  234. package/dist/web/_next/static/chunks/2849.360e2c64521fa795.js +0 -1
  235. package/dist/web/_next/static/chunks/3429.98d7e79ff6d2a6ce.js +0 -1
  236. package/dist/web/_next/static/chunks/3514.9079bf49bb3e05c9.js +0 -1
  237. package/dist/web/_next/static/chunks/4643.ddf3ea3a760e73a5.js +0 -1
  238. package/dist/web/_next/static/chunks/5788-d4b8dc2ab68396b6.js +0 -1
  239. package/dist/web/_next/static/chunks/6419.99aa173d83f20370.js +0 -1
  240. package/dist/web/_next/static/chunks/674.97a7237f011fb986.js +0 -1
  241. package/dist/web/_next/static/chunks/6742.bc3783b9784ead96.js +0 -1
  242. package/dist/web/_next/static/chunks/7507.28a3807b5d02a5c1.js +0 -1
  243. package/dist/web/_next/static/chunks/7960.026e07028dd25edb.js +0 -1
  244. package/dist/web/_next/static/chunks/8467.290e9bde34b58e7c.js +0 -1
  245. package/dist/web/_next/static/chunks/8638.237712645dcdcb8a.js +0 -1
  246. package/dist/web/_next/static/chunks/8922-8660f73e9cd42406.js +0 -1
  247. package/dist/web/_next/static/chunks/925.fe600c6039a3201d.js +0 -1
  248. package/dist/web/_next/static/chunks/9259.c450f561db04037d.js +0 -1
  249. package/dist/web/_next/static/chunks/9299.83236781dfa74eb0.js +0 -1
  250. package/dist/web/_next/static/chunks/app/dev/question/page-bdedfcfce7a3c516.js +0 -1
  251. package/dist/web/_next/static/chunks/app/workspace/layout-0fd9ea03182e9c89.js +0 -15
  252. package/dist/web/_next/static/chunks/webpack-f3500fd1fae71c88.js +0 -1
  253. package/dist/web/_next/static/css/1b307dedbb687210.css +0 -1
  254. package/dist/web/proxy.html +0 -179
  255. package/dist/web/sw-site.js +0 -283
  256. package/dist/web/swBridgeClaim.js +0 -57
  257. /package/dist/web/_next/static/{DdbafQkcX_ZaKRMjMeNKp → hFRLMLaLieW6POo9cLvLQ}/_buildManifest.js +0 -0
  258. /package/dist/web/_next/static/{DdbafQkcX_ZaKRMjMeNKp → hFRLMLaLieW6POo9cLvLQ}/_ssgManifest.js +0 -0
@@ -27,7 +27,7 @@ function send(frame) {
27
27
  async function detachQuiet(tid, idle = false) {
28
28
  attached.delete(tid);
29
29
  if (!idle) idleDetached.delete(tid);
30
- try { await chrome.debugger.detach({ targetId: tid }); } catch { /* already gone */ }
30
+ try { await chrome.debugger.detach({ tabId: Number(tid) }); } catch { /* already gone */ }
31
31
  }
32
32
 
33
33
  // Restore what the user was watching when a popup stole the focus. Only called
@@ -48,9 +48,17 @@ function snapBackFocus(tid) {
48
48
  // routed to chrome.tabs / chrome.debugger equivalents. Everything else rides
49
49
  // sendCommand untouched, so engine changes never require an extension update.
50
50
  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
+ },
51
59
  "Target.getTargets": async () => {
52
60
  const targets = await chrome.debugger.getTargets();
53
- return { targetInfos: targets.map((t) => ({ targetId: String(t.id), type: t.type, title: t.title, url: t.url })) };
61
+ return { targetInfos: targets.map((t) => ({ targetId: String(t.tabId ?? t.id), type: t.type, title: t.title, url: t.url })) };
54
62
  },
55
63
  "Target.createTarget": async ({ url }) => {
56
64
  // Always background: agent tabs never steal the user's focus (focus
@@ -70,7 +78,7 @@ const SHIM = {
70
78
  if (attached.has(tid)) return { sessionId: tid }; // session heal re-attaches its own target
71
79
  // One attached page at a time — mirrors engine usage, avoids stacked infobars.
72
80
  for (const prev of [...attached]) if (prev !== tid) detachQuiet(prev);
73
- await chrome.debugger.attach({ targetId: tid }, "1.3");
81
+ await attachDebugger(tid);
74
82
  attached.add(tid);
75
83
  // A popup our click spawned takes the focus Chrome gives it — hand it back
76
84
  // to the tab the user was actually reading. The agent drives in background.
@@ -94,6 +102,30 @@ const SHIM = {
94
102
 
95
103
  let inputAt = 0; // last Input.* dispatch — gates popup adoption below
96
104
 
105
+
106
+ // The debugger target registers a beat after tabs.create — a cold attach can
107
+ // fail with "No target with given id" even though the tab exists. Retry while
108
+ // the tab is alive per chrome.tabs (source of truth), and surface the full
109
+ // picture when Chrome still refuses.
110
+ async function attachDebugger(tid) {
111
+ for (let i = 0; i < 10; i++) {
112
+ try {
113
+ await chrome.debugger.attach({ tabId: Number(tid) }, "1.3");
114
+ return;
115
+ } catch (e) {
116
+ const tabs = await chrome.tabs.query({}).catch(() => []);
117
+ const alive = tabs.some((t) => String(t.id) === tid);
118
+ if (!alive) {
119
+ throw new Error(`attach tid=${tid}: tab not in chrome.tabs (closed?) — ${e.message}`);
120
+ }
121
+ if (i === 9) {
122
+ throw new Error(`attach tid=${tid}: tab alive but Chrome refuses — ${e.message}`);
123
+ }
124
+ await new Promise((r) => setTimeout(r, 100));
125
+ }
126
+ }
127
+ }
128
+
97
129
  async function dispatch(method, params, targetId) {
98
130
  if (SHIM[method]) return SHIM[method](params || {});
99
131
  if (targetId == null) throw new Error(`${method} is not available via the extension`);
@@ -104,26 +136,30 @@ async function dispatch(method, params, targetId) {
104
136
  // other failures (e.g. DevTools open on the tab) must surface as themselves.
105
137
  if (!attached.has(tid)) {
106
138
  idleDetached.delete(tid);
107
- try {
108
- await chrome.debugger.attach({ targetId: tid }, "1.3");
109
- attached.add(tid);
110
- } catch (e) {
111
- throw /no target|not found|cannot access/i.test(e?.message || "")
112
- ? new Error(`No target with given id: ${targetId}`)
113
- : e;
114
- }
139
+ await attachDebugger(tid);
140
+ attached.add(tid);
115
141
  }
116
142
  try {
117
- return await chrome.debugger.sendCommand({ targetId: tid }, method, params || {});
143
+ return await chrome.debugger.sendCommand({ tabId: Number(tid) }, method, params || {});
118
144
  } catch (e) {
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}`);
145
+ if (/no target|closed|detached|not found/i.test(e?.message || "")) {
146
+ // The idle soft-detach timer can fire between our attach check and the
147
+ // send — re-attach ONCE and retry before declaring the target dead.
148
+ try {
149
+ await attachDebugger(tid);
150
+ attached.add(tid);
151
+ return await chrome.debugger.sendCommand({ tabId: Number(tid) }, method, params || {});
152
+ } catch {
153
+ detachQuiet(tid);
154
+ throw new Error(`No target with given id: ${targetId}`);
155
+ }
156
+ }
121
157
  throw e;
122
158
  }
123
159
  }
124
160
 
125
161
  chrome.debugger.onEvent.addListener((source, method, params) => {
126
- send({ t: "event", method, params, sessionId: String(source.targetId) });
162
+ send({ t: "event", method, params, sessionId: String(source.tabId ?? source.targetId) });
127
163
  });
128
164
  // Synthesize Target.targetCreated the engine's popup adoption listens for —
129
165
  // chrome.debugger never surfaces browser-level target events.
@@ -163,10 +199,10 @@ setInterval(() => {
163
199
  // "Cancel" on the debug infobar, DevTools open, or tab close — surface it the
164
200
  // way CDP would so the engine drops and rebuilds the session instead of wedging.
165
201
  chrome.debugger.onDetach.addListener((source) => {
166
- attached.delete(source.targetId);
167
- idleDetached.delete(String(source.targetId)); // user cancelled — stay detached
202
+ attached.delete(String(source.tabId ?? source.targetId));
203
+ idleDetached.delete(String(source.tabId ?? source.targetId)); // user cancelled — stay detached
168
204
  send({ t: "event", method: "Target.detachedFromTarget", params: {
169
- sessionId: String(source.targetId), targetId: String(source.targetId)
205
+ sessionId: String(source.tabId ?? source.targetId), targetId: String(source.tabId ?? source.targetId)
170
206
  } });
171
207
  });
172
208
 
@@ -204,7 +240,7 @@ chrome.runtime.onMessage.addListener((msg, _sender, sendResponse) => {
204
240
  function connect() {
205
241
  if (paused) return; // never dial out while the kill switch is on
206
242
  ws = new WebSocket(RELAY_URL);
207
- ws.onopen = () => send({ t: "hello", proto: 1 });
243
+ ws.onopen = () => send({ t: "hello", proto: 2 });
208
244
  ws.onmessage = async (ev) => {
209
245
  let m;
210
246
  try { m = JSON.parse(ev.data); } catch { return; }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "9remote Browser Bridge",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "description": "Lets the 9remote host drive this browser. All logic lives on the host — this is only a CDP pipe.",
6
6
  "permissions": ["debugger", "tabs", "storage"],
7
7
  "background": { "service_worker": "background.js" },
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  const __importMetaUrl = require('url').pathToFileURL(__filename).href;
3
- var pe=Object.create;var X=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var me=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of de(t))!Se.call(e,n)&&n!==r&&X(e,n,{get:()=>t[n],enumerable:!(s=fe(t,n))||s.enumerable});return e};var C=(e,t,r)=>(r=e!=null?pe(he(e)):{},me(t||!e||!e.__esModule?X(r,"default",{value:e,enumerable:!0}):r,e));var ce=C(require("net"),1),d=C(require("fs"),1),R=C(require("path"),1),N=C(require("os"),1),q=require("child_process"),ie=C(require("node-pty"),1);var B="73";function ge(){return`function prompt { $p = $PWD.Path -replace '\\\\','/'; "$([char]27)]7;file://$([System.Net.Dns]::GetHostName())$p$([char]27)\\PS $($PWD.Path)> " }`}function K(e){return e.id==="powershell"||e.id==="pwsh"?[...e.args,"-NoExit","-Command",ge()]:e.args}var Y={win32:[{id:"cmd",label:"Command Prompt",path:"cmd.exe",args:[]},{id:"powershell",label:"PowerShell",path:"powershell.exe",args:["-NoLogo"]},{id:"pwsh",label:"PowerShell Core",path:"pwsh.exe",args:["-NoLogo"]}],unix:[{id:"bash",label:"Bash",path:"/bin/bash",args:["-l"]},{id:"zsh",label:"Zsh",path:"/bin/zsh",args:["-l"]},{id:"sh",label:"Sh",path:"/bin/sh",args:["-l"]}]};function V(e){if(process.platform==="win32"){let s=e?Y.win32.find(o=>o.id===e):null;if(s)return s;let n=process.env.COMSPEC;return n?{id:"cmd",label:"Command Prompt",path:n,args:[]}:Y.win32[0]}let t=process.env.SHELL||"/bin/bash",r=t.split("/").pop();return{id:r,label:r,path:t,args:["-l"]}}var Xe=45*1024,Ye={CHUNK_BYTES:32*1024,HEAD_BYTES:512*1024,HEAD_LINES:60,TITLE_MAX:120,SCAN_FILE_CAP:200,SCAN_DEPTH:4,PER_AGENT_LIMIT:50,DEFAULT_LIMIT:100,CACHE_TTL_MS:30*1e3,SEARCH_MIN_CHARS:2,SEARCH_QUERY_MAX:200,SEARCH_LIMIT:50,SEARCH_SNIPPET_MAX:200,SEARCH_SNIPPET_PAD:120,SEARCH_TOTAL_BYTES:64*1024*1024,SEARCH_FILE_BYTES:32*1024*1024,SEARCH_TIME_BUDGET_MS:700};var k={"terminal.ping":{reply:"pong",coalesce:null},"terminal.listSessions":{reply:"sessionList",coalesce:null},"terminal.createSession":{reply:"createResult",coalesce:null},"terminal.joinSession":{reply:"joinResult",coalesce:null},"terminal.requestHistory":{reply:"historyResult",coalesce:null},"terminal.input":{reply:null,coalesce:null},"terminal.resize":{reply:null,coalesce:"resize"},"terminal.deleteSession":{reply:"deleteResult",coalesce:null},"terminal.getCwd":{reply:"cwdResult",coalesce:null},"proc.start":{reply:"procStartResult",coalesce:null},"proc.attach":{reply:"procAttachResult",coalesce:null},"proc.lines":{reply:"procLinesResult",coalesce:null},"proc.write":{reply:"procWriteResult",coalesce:null},"proc.endInput":{reply:"procEndInputResult",coalesce:null},"proc.signal":{reply:"procSignalResult",coalesce:null},"proc.stop":{reply:"procStopResult",coalesce:null},"proc.list":{reply:"procListResult",coalesce:null},"kv.set":{reply:"kvSetResult",coalesce:null},"kv.get":{reply:"kvGetResult",coalesce:null},"kv.del":{reply:"kvDelResult",coalesce:null}},ye={ping:"terminal.ping",listSessions:"terminal.listSessions",createSession:"terminal.createSession",joinSession:"terminal.joinSession",requestHistory:"terminal.requestHistory",input:"terminal.input",resize:"terminal.resize",deleteSession:"terminal.deleteSession",getCwd:"terminal.getCwd",procStart:"proc.start",procAttach:"proc.attach",procLines:"proc.lines",procWrite:"proc.write",procSignal:"proc.signal",procStop:"proc.stop",procList:"proc.list",kvSet:"kv.set",kvGet:"kv.get",kvDel:"kv.del"};function J(e){return k[e]?e:ye[e]||null}var Ee=5e3,Q=Symbol("handler-timeout");function ee({deps:e={},send:t}={}){let r=new Map,s=new Map,n=[],o=!1,c=new Map,a=new Map;function i(p,u){for(let[_,E]of Object.entries(u)){let I=`${p}.${_}`;r.set(I,E),s.set(I,k[I]||{reply:null,coalesce:null})}}function h(){let p=Object.keys(k).filter(u=>!r.has(u));if(p.length)throw new Error(`Routes without a handler: ${p.join(", ")}`)}let l=p=>p.sessionId||p.procId||"";function S({client:p,message:u}){let _=u?.type,E=J(_)||_;if(!E||!r.has(E)){t(p,{type:"error",error:`Unknown route: ${_}`,requestId:u?.requestId});return}let I=s.get(E)||{reply:null,coalesce:null},z=`${E}:${u.sessionId??""}`,b=l(u);if(b&&c.has(b)){t(p,{type:I.reply||"error",success:!1,error:"Previous request on this session is still running",requestId:u.requestId});return}if(I?.coalesce){let P=a.get(z);if(P){P.message=u;return}let $={client:p,message:u,key:E,spec:I};a.set(z,$),n.push($)}else n.push({client:p,message:u,key:E,spec:I});f()}async function f(){if(!o){o=!0,await Promise.resolve();try{for(;n.length;){let p=n.shift();p.spec?.coalesce&&a.delete(`${p.key}:${p.message.sessionId??""}`),await y(p)}}finally{o=!1,n.length&&f()}}}async function y({client:p,message:u,key:_,spec:E}){let I=r.get(_),z=`${_}:${u.sessionId??""}`,b=x=>{if(!p)return;let M=!!x?.error;!E?.reply&&!M||t(p,{type:E?.reply||"error",...x,requestId:u.requestId})},P,$=new Promise(x=>{P=setTimeout(()=>x(Q),u.timeout||Ee),P.unref?.()}),W=Promise.resolve().then(()=>I(u,e,{client:p,answer:b}));try{let x=await Promise.race([W,$]);if(x===Q){let M=l(u);M&&(c.set(M,!0),W.catch(()=>{}).then(()=>c.delete(M))),b({success:!1,error:"Handler timeout"});return}b(x||{})}catch(x){b({success:!1,error:x?.message||String(x)})}finally{clearTimeout(P)}}return{register:i,assertComplete:h,enqueue:S}}function te(e=500){let t=new Map;return{set(r,s){return typeof r!="string"||!r?!1:(t.delete(r),t.set(r,structuredClone(s??null)),t.size>e&&t.delete(t.keys().next().value),!0)},get(r){return t.has(r)?structuredClone(t.get(r)):null},del(r){return t.delete(r)},get size(){return t.size}}}var re={set:(e,t)=>({success:t.kv.set(e.key,e.value)}),get:(e,t)=>({success:!0,value:t.kv.get(e.key)}),del:(e,t)=>({success:t.kv.del(e.key)})};function A(e){return e?.length?e.reduce((t,r)=>t+r.length,0):0}function U(e,t){if(!e?.length||t<=0)return Buffer.alloc(0);let r=t,s=[];for(let o=e.length-1;o>=0&&r>0;o--){let c=e[o];c.length<=r?(s.push(c),r-=c.length):(s.push(c.subarray(c.length-r)),r=0)}s.reverse();let n=Buffer.concat(s);if(n.length>1&&n[0]!==27){let o=Math.min(n.length,512);for(let c=1;c<o;c++)if(n[c]===27)return n.subarray(c)}return n}function Ie(e,t,r=512){if(t<=0||!e?.length)return t;let s=0;for(let c of e)s+=c.length;let n=s,o=r;for(let c=e.length-1;c>=0&&o>0;c--){let a=e[c];if(a.length===0){n-=0;continue}let i=n-a.length;if(i>=t){n=i;continue}let h=Math.min(a.length,t-i);for(let l=h-1;l>=0&&o>0;l--){if(a[l]===27)return i+l;o--}n=i}return t}function se(e,t,r){if(!e?.length||r<=0)return{prefix:Buffer.alloc(0),trimmed:0,extra:0};let s=A(e),n=s-Math.max(0,Math.min(t,s)),o=n-r;if(o<0&&(r+=o,o=0),r<=0)return{prefix:Buffer.alloc(0),trimmed:0,extra:0};let c=0;if(o>0){let h=Ie(e,o);h<o&&(c=o-h,o=h,r+=c)}let a=0,i=[];for(let h=0;h<e.length&&r>0;h++){let l=e[h],S=a+l.length;if(S<=o){a=S;continue}if(a>=n)break;let f=Math.max(0,o-a),y=Math.min(r,l.length-f);i.push(l.subarray(f,f+y)),r-=y,a=S}return{prefix:Buffer.concat(i),trimmed:0,extra:c}}var D=process.env.NREMOTE_HOME||R.default.join(N.default.homedir(),".9remote"),v=process.platform==="win32"?"\\\\.\\pipe\\9remote-pty":R.default.join(D,"pty-daemon.sock"),F=R.default.join(D,"pids","ptyDaemon.pid"),g=new Map,H=new Set,ne=2*1024*1024,xe=256*1024,Re=256*1024,_e=5*1024*1024,Te=["1049","1047","1000","1002","1003","1006","1015","1005"],be=/\x1b\[\?([0-9;]+)([hl])/g;function we(e,t){typeof t!="string"&&(t=String(t));for(let r of t.matchAll(be)){let s=r[2]==="h";for(let n of r[1].split(";"))e[s?"add":"delete"](`?${n}`)}}function Pe(e){let t=Te.filter(r=>e.has(`?${r}`));return t.length?`\x1B[?${t.join(";")}h`:""}var j=R.default.join(D,"logs"),O=R.default.join(j,"daemon.log");try{d.default.existsSync(j)||d.default.mkdirSync(j,{recursive:!0})}catch{}function ve(){try{if(d.default.existsSync(O)&&d.default.statSync(O).size>_e){let r=d.default.readFileSync(O,"utf8").slice(-1024*1024);d.default.writeFileSync(O,r)}}catch{}}function w(e,t=null){ve();let s=`[${new Date().toISOString()}] ERROR: ${e}`;t&&(s+=` - ${t.message||t}`),s+=`
3
+ var pe=Object.create;var X=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var de=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var me=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of de(t))!Se.call(e,n)&&n!==r&&X(e,n,{get:()=>t[n],enumerable:!(s=fe(t,n))||s.enumerable});return e};var C=(e,t,r)=>(r=e!=null?pe(he(e)):{},me(t||!e||!e.__esModule?X(r,"default",{value:e,enumerable:!0}):r,e));var ce=C(require("net"),1),d=C(require("fs"),1),R=C(require("path"),1),N=C(require("os"),1),q=require("child_process"),ie=C(require("node-pty"),1);var B="74";function ge(){return`function prompt { $p = $PWD.Path -replace '\\\\','/'; "$([char]27)]7;file://$([System.Net.Dns]::GetHostName())$p$([char]27)\\PS $($PWD.Path)> " }`}function K(e){return e.id==="powershell"||e.id==="pwsh"?[...e.args,"-NoExit","-Command",ge()]:e.args}var Y={win32:[{id:"cmd",label:"Command Prompt",path:"cmd.exe",args:[]},{id:"powershell",label:"PowerShell",path:"powershell.exe",args:["-NoLogo"]},{id:"pwsh",label:"PowerShell Core",path:"pwsh.exe",args:["-NoLogo"]}],unix:[{id:"bash",label:"Bash",path:"/bin/bash",args:["-l"]},{id:"zsh",label:"Zsh",path:"/bin/zsh",args:["-l"]},{id:"sh",label:"Sh",path:"/bin/sh",args:["-l"]}]};function V(e){if(process.platform==="win32"){let s=e?Y.win32.find(o=>o.id===e):null;if(s)return s;let n=process.env.COMSPEC;return n?{id:"cmd",label:"Command Prompt",path:n,args:[]}:Y.win32[0]}let t=process.env.SHELL||"/bin/bash",r=t.split("/").pop();return{id:r,label:r,path:t,args:["-l"]}}var Xe=45*1024,Ye={CHUNK_BYTES:32*1024,HEAD_BYTES:512*1024,HEAD_LINES:60,TITLE_MAX:120,SCAN_FILE_CAP:200,SCAN_DEPTH:4,PER_AGENT_LIMIT:50,DEFAULT_LIMIT:100,CACHE_TTL_MS:30*1e3,SEARCH_MIN_CHARS:2,SEARCH_QUERY_MAX:200,SEARCH_LIMIT:50,SEARCH_SNIPPET_MAX:200,SEARCH_SNIPPET_PAD:120,SEARCH_TOTAL_BYTES:64*1024*1024,SEARCH_FILE_BYTES:32*1024*1024,SEARCH_TIME_BUDGET_MS:700};var k={"terminal.ping":{reply:"pong",coalesce:null},"terminal.listSessions":{reply:"sessionList",coalesce:null},"terminal.createSession":{reply:"createResult",coalesce:null},"terminal.joinSession":{reply:"joinResult",coalesce:null},"terminal.requestHistory":{reply:"historyResult",coalesce:null},"terminal.input":{reply:null,coalesce:null},"terminal.resize":{reply:null,coalesce:"resize"},"terminal.deleteSession":{reply:"deleteResult",coalesce:null},"terminal.getCwd":{reply:"cwdResult",coalesce:null},"proc.start":{reply:"procStartResult",coalesce:null},"proc.attach":{reply:"procAttachResult",coalesce:null},"proc.lines":{reply:"procLinesResult",coalesce:null},"proc.write":{reply:"procWriteResult",coalesce:null},"proc.endInput":{reply:"procEndInputResult",coalesce:null},"proc.signal":{reply:"procSignalResult",coalesce:null},"proc.stop":{reply:"procStopResult",coalesce:null},"proc.list":{reply:"procListResult",coalesce:null},"kv.set":{reply:"kvSetResult",coalesce:null},"kv.get":{reply:"kvGetResult",coalesce:null},"kv.del":{reply:"kvDelResult",coalesce:null}},ye={ping:"terminal.ping",listSessions:"terminal.listSessions",createSession:"terminal.createSession",joinSession:"terminal.joinSession",requestHistory:"terminal.requestHistory",input:"terminal.input",resize:"terminal.resize",deleteSession:"terminal.deleteSession",getCwd:"terminal.getCwd",procStart:"proc.start",procAttach:"proc.attach",procLines:"proc.lines",procWrite:"proc.write",procSignal:"proc.signal",procStop:"proc.stop",procList:"proc.list",kvSet:"kv.set",kvGet:"kv.get",kvDel:"kv.del"};function J(e){return k[e]?e:ye[e]||null}var Ee=5e3,Q=Symbol("handler-timeout");function ee({deps:e={},send:t}={}){let r=new Map,s=new Map,n=[],o=!1,c=new Map,a=new Map;function i(p,u){for(let[_,E]of Object.entries(u)){let I=`${p}.${_}`;r.set(I,E),s.set(I,k[I]||{reply:null,coalesce:null})}}function h(){let p=Object.keys(k).filter(u=>!r.has(u));if(p.length)throw new Error(`Routes without a handler: ${p.join(", ")}`)}let l=p=>p.sessionId||p.procId||"";function S({client:p,message:u}){let _=u?.type,E=J(_)||_;if(!E||!r.has(E)){t(p,{type:"error",error:`Unknown route: ${_}`,requestId:u?.requestId});return}let I=s.get(E)||{reply:null,coalesce:null},z=`${E}:${u.sessionId??""}`,b=l(u);if(b&&c.has(b)){t(p,{type:I.reply||"error",success:!1,error:"Previous request on this session is still running",requestId:u.requestId});return}if(I?.coalesce){let P=a.get(z);if(P){P.message=u;return}let $={client:p,message:u,key:E,spec:I};a.set(z,$),n.push($)}else n.push({client:p,message:u,key:E,spec:I});f()}async function f(){if(!o){o=!0,await Promise.resolve();try{for(;n.length;){let p=n.shift();p.spec?.coalesce&&a.delete(`${p.key}:${p.message.sessionId??""}`),await y(p)}}finally{o=!1,n.length&&f()}}}async function y({client:p,message:u,key:_,spec:E}){let I=r.get(_),z=`${_}:${u.sessionId??""}`,b=x=>{if(!p)return;let M=!!x?.error;!E?.reply&&!M||t(p,{type:E?.reply||"error",...x,requestId:u.requestId})},P,$=new Promise(x=>{P=setTimeout(()=>x(Q),u.timeout||Ee),P.unref?.()}),W=Promise.resolve().then(()=>I(u,e,{client:p,answer:b}));try{let x=await Promise.race([W,$]);if(x===Q){let M=l(u);M&&(c.set(M,!0),W.catch(()=>{}).then(()=>c.delete(M))),b({success:!1,error:"Handler timeout"});return}b(x||{})}catch(x){b({success:!1,error:x?.message||String(x)})}finally{clearTimeout(P)}}return{register:i,assertComplete:h,enqueue:S}}function te(e=500){let t=new Map;return{set(r,s){return typeof r!="string"||!r?!1:(t.delete(r),t.set(r,structuredClone(s??null)),t.size>e&&t.delete(t.keys().next().value),!0)},get(r){return t.has(r)?structuredClone(t.get(r)):null},del(r){return t.delete(r)},get size(){return t.size}}}var re={set:(e,t)=>({success:t.kv.set(e.key,e.value)}),get:(e,t)=>({success:!0,value:t.kv.get(e.key)}),del:(e,t)=>({success:t.kv.del(e.key)})};function A(e){return e?.length?e.reduce((t,r)=>t+r.length,0):0}function U(e,t){if(!e?.length||t<=0)return Buffer.alloc(0);let r=t,s=[];for(let o=e.length-1;o>=0&&r>0;o--){let c=e[o];c.length<=r?(s.push(c),r-=c.length):(s.push(c.subarray(c.length-r)),r=0)}s.reverse();let n=Buffer.concat(s);if(n.length>1&&n[0]!==27){let o=Math.min(n.length,512);for(let c=1;c<o;c++)if(n[c]===27)return n.subarray(c)}return n}function Ie(e,t,r=512){if(t<=0||!e?.length)return t;let s=0;for(let c of e)s+=c.length;let n=s,o=r;for(let c=e.length-1;c>=0&&o>0;c--){let a=e[c];if(a.length===0){n-=0;continue}let i=n-a.length;if(i>=t){n=i;continue}let h=Math.min(a.length,t-i);for(let l=h-1;l>=0&&o>0;l--){if(a[l]===27)return i+l;o--}n=i}return t}function se(e,t,r){if(!e?.length||r<=0)return{prefix:Buffer.alloc(0),trimmed:0,extra:0};let s=A(e),n=s-Math.max(0,Math.min(t,s)),o=n-r;if(o<0&&(r+=o,o=0),r<=0)return{prefix:Buffer.alloc(0),trimmed:0,extra:0};let c=0;if(o>0){let h=Ie(e,o);h<o&&(c=o-h,o=h,r+=c)}let a=0,i=[];for(let h=0;h<e.length&&r>0;h++){let l=e[h],S=a+l.length;if(S<=o){a=S;continue}if(a>=n)break;let f=Math.max(0,o-a),y=Math.min(r,l.length-f);i.push(l.subarray(f,f+y)),r-=y,a=S}return{prefix:Buffer.concat(i),trimmed:0,extra:c}}var D=process.env.NREMOTE_HOME||R.default.join(N.default.homedir(),".9remote"),v=process.platform==="win32"?"\\\\.\\pipe\\9remote-pty":R.default.join(D,"pty-daemon.sock"),F=R.default.join(D,"pids","ptyDaemon.pid"),g=new Map,H=new Set,ne=2*1024*1024,xe=256*1024,Re=256*1024,_e=5*1024*1024,Te=["1049","1047","1000","1002","1003","1006","1015","1005"],be=/\x1b\[\?([0-9;]+)([hl])/g;function we(e,t){typeof t!="string"&&(t=String(t));for(let r of t.matchAll(be)){let s=r[2]==="h";for(let n of r[1].split(";"))e[s?"add":"delete"](`?${n}`)}}function Pe(e){let t=Te.filter(r=>e.has(`?${r}`));return t.length?`\x1B[?${t.join(";")}h`:""}var j=R.default.join(D,"logs"),O=R.default.join(j,"daemon.log");try{d.default.existsSync(j)||d.default.mkdirSync(j,{recursive:!0})}catch{}function ve(){try{if(d.default.existsSync(O)&&d.default.statSync(O).size>_e){let r=d.default.readFileSync(O,"utf8").slice(-1024*1024);d.default.writeFileSync(O,r)}}catch{}}function w(e,t=null){ve();let s=`[${new Date().toISOString()}] ERROR: ${e}`;t&&(s+=` - ${t.message||t}`),s+=`
4
4
  `;try{d.default.appendFileSync(O,s)}catch{}console.error(s.trim())}function le(){return process.env.CODESPACES==="true"?process.env.CODESPACE_VSCODE_FOLDER||"/workspaces":process.env.HOME||process.env.USERPROFILE||N.default.homedir()}function Me(e){let t={...process.env,TERM:"xterm-256color",COLORTERM:"truecolor",LANG:process.env.LANG||"en_US.UTF-8"};delete t.PORT,delete t.NODE_ENV;let r=e.includes("zsh"),s=e.includes("bash"),n=null;if(r){n=d.default.mkdtempSync(R.default.join(N.default.tmpdir(),"9remote-zsh-"));let o=R.default.join(n,".zshrc"),c=t.HOME||N.default.homedir(),a="";a+=`[ -f "${c}/.zprofile" ] && source "${c}/.zprofile"
5
5
  `,a+=`[ -f "${c}/.zshrc" ] && source "${c}/.zshrc"
6
6
  `,a+=`[ -f "${c}/.zlogin" ] && source "${c}/.zlogin"
@@ -8,5 +8,5 @@ var pe=Object.create;var X=Object.defineProperty;var fe=Object.getOwnPropertyDes
8
8
  `,d.default.writeFileSync(o,a),t.ZDOTDIR=n}else if(s){let o=t.PROMPT_COMMAND||"";t.PROMPT_COMMAND=`printf "\\e]7;file://%s\\a" "\${HOSTNAME}\${PWD}"${o?`; ${o}`:""}`}return/cmd\.exe$/i.test(e)&&(t.PROMPT=`$E]7;file://${process.env.COMPUTERNAME||""}/$P$E\\$G$S`),{env:t,zdotDir:n}}function T(e){let t=JSON.stringify(e)+`
9
9
  `;for(let r of H)try{r.write(t)}catch{}}function oe(e,t){try{e.write(JSON.stringify(t)+`
10
10
  `)}catch{}}var m=new Map,Ce=0,Ae=512*1024,Oe=256*1024,Ne=3e3,De=3600*1e3;function ae(e,t=0){let r=typeof t=="object"&&t!==null?t.from??0:Number(t)||0,s=[];for(let n of e.lines)n.n>r&&s.push({n:n.n,enc:"b64",data:n.data.toString("base64")});return s}function Le(e,{bin:t,args:r=[],cwd:s,env:n,windowsVerbatimArguments:o}={}){if(!e)return{success:!1,error:"Missing procId"};if(!t)return{success:!1,error:"Missing bin"};let c=m.get(e);if(c&&!c.exited)return{success:!1,error:"Process already running"};let a=(0,q.spawn)(t,r,{cwd:s&&d.default.existsSync(s)?s:le(),stdio:["pipe","pipe","pipe"],env:{...process.env,...n||{}},detached:process.platform!=="win32",windowsVerbatimArguments:o===!0}),i={id:e,epoch:++Ce,child:a,cwd:s,lines:[],lineCount:0,bytes:0,exited:!1,exitCode:null,tail:""};m.set(e,i);let h=S=>{let f=Buffer.from(S,"utf8");for(i.lineCount++,i.lines.push({n:i.lineCount,data:f}),i.bytes+=f.length;i.bytes>Ae&&i.lines.length>1;)i.bytes-=i.lines[0].data.length,i.lines.shift();T({type:"procLine",procId:e,epoch:i.epoch,n:i.lineCount,enc:"b64",data:f.toString("base64")})},l=S=>{S.on("data",f=>{if(i.tail+=f.toString("utf8"),i.tail.length>Oe){h(i.tail),i.tail="";return}let y=i.tail.split(`
11
- `);i.tail=y.pop()||"";for(let p of y)h(p)})};return l(a.stdout),l(a.stderr),a.on("error",S=>{i.exited=!0,i.exitedAt=Date.now(),T({type:"procExit",procId:e,epoch:i.epoch,code:null,error:S.message})}),a.on("close",(S,f)=>{i.tail&&(h(i.tail),i.tail=""),i.exited=!0,i.exitedAt=Date.now(),i.exitCode=S,i.child=null,T({type:"procExit",procId:e,epoch:i.epoch,code:S,signal:f||null})}),{success:!0,procId:e,epoch:i.epoch,pid:a.pid}}function $e(e,t=0){typeof t=="object"&&t!==null&&(t=t.from??0),t=Number(t)||0;let r=m.get(e);return r?{success:!0,alive:!r.exited,epoch:r.epoch,lines:ae(r,t),total:r.lineCount,oldest:r.lines[0]?.n??r.lineCount+1,exitCode:r.exitCode}:{success:!1,error:"Process not found"}}function ke(e,t,r="b64"){let s=m.get(e);return s?.child?.stdin?.writable?(s.child.stdin.write(r==="b64"?Buffer.from(t,"base64"):t),{success:!0}):{success:!1,error:"Process not writable"}}function He(e){let t=m.get(e);if(!t?.child?.stdin?.writable)return{success:!1,error:"Process not writable"};try{t.child.stdin.end()}catch(r){return{success:!1,error:r.message}}return{success:!0}}function ze(e,t="SIGINT"){let r=m.get(e);if(!r?.child)return{success:!1,error:"Process not running"};try{r.child.kill(t)}catch(s){return{success:!1,error:s.message}}return{success:!0}}function G(e,t){if(e?.pid)try{process.platform==="win32"?(0,q.spawn)("taskkill",["/pid",String(e.pid),"/T","/F"]).on("error",()=>{}):process.kill(-e.pid,t)}catch{}}function Be(e){let t=m.get(e);if(!t)return{success:!1,error:"Process not found"};let r=t.child;return r&&(G(r,"SIGINT"),setTimeout(()=>G(r,"SIGKILL"),Ne).unref?.()),m.delete(e),{success:!0}}setInterval(()=>{let e=Date.now();for(let[t,r]of m)r.exited&&r.exitedAt&&e-r.exitedAt>=De&&m.delete(t)},600*1e3).unref?.();function Ue(e,t,r=80,s=24,n=null,o=null){if(g.has(e))return{success:!1,error:"Session already exists"};let c=V(n);(!o||!d.default.existsSync(o))&&(o=le());try{let{env:a,zdotDir:i}=Me(c.path);a.NINE_REMOTE_SESSION_ID=e;let h=ie.default.spawn(c.path,K(c),{name:"xterm-256color",cols:r,rows:s,cwd:o,env:a,useConpty:process.platform==="win32"}),l={pty:h,buffer:[],modes:new Set,name:t,createdAt:Date.now(),cwd:o,shellId:c.id,shellLabel:c.label,zdotDir:i,pending:null,flushScheduled:!1,procTimer:null,foregroundProcess:Z({pty:h})||c.id},S=()=>{l.flushScheduled=!1;let f=l.pending;f&&(l.pending=null,T({type:"output",sessionId:e,enc:"b64",data:Buffer.from(f).toString("base64")}))};return h.onData(f=>{l.buffer.push(Buffer.from(f,"utf-8")),we(l.modes,f);let y=f.match(/\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)/);if(y){let u;try{u=decodeURIComponent(y[1])}catch{u=y[1]}process.platform==="win32"&&/^\/[a-zA-Z]:[\\/]/.test(u)&&(u=u.slice(1)),u&&u!==l.cwd&&(l.cwd=u,T({type:"cwdChange",sessionId:e,cwd:u}))}A(l.buffer)>ne&&(l.buffer=[U(l.buffer,ne)]),l.pending=l.pending===null?f:l.pending+f,l.flushScheduled||(l.flushScheduled=!0,setImmediate(S)),l.procTimer&&clearTimeout(l.procTimer),l.procTimer=setTimeout(()=>{l.procTimer=null,ue(l,e)},250)}),h.onExit(()=>{l.procTimer&&clearTimeout(l.procTimer),g.delete(e),l.zdotDir&&d.default.rm(l.zdotDir,{recursive:!0,force:!0},()=>{}),T({type:"sessionClosed",sessionId:e})}),g.set(e,l),{success:!0,sessionId:e,cwd:o,shellId:c.id,shellLabel:c.label}}catch(a){return w("Failed to create session",a),{success:!1,error:a.message}}}function Z(e){if(!e?.pty)return null;try{let t=e.pty.process;return t?R.default.basename(t):null}catch{return null}}function ue(e,t){if(!e?.pty)return;let r=Z(e);if(r&&r!==e.foregroundProcess){let s=e.foregroundProcess;e.foregroundProcess=r,s!==null&&T({type:"processChange",sessionId:t,process:r,prevProcess:s})}}var Fe=te(500),L=ee({deps:{sessions:g,procs:m,send:oe,broadcast:T,DAEMON_VERSION:B,kv:Fe},send:oe}),je={ping:()=>({version:B}),listSessions:()=>({sessions:Array.from(g.entries()).map(([e,t])=>({id:e,name:t.name,createdAt:t.createdAt,shellId:t.shellId,shellLabel:t.shellLabel,cwd:t.cwd,foregroundProcess:t.foregroundProcess||Z(t)}))}),createSession:e=>Ue(e.sessionId||`session-${Date.now()}`,e.name,e.cols,e.rows,e.shellId,e.cwd),joinSession:(e,{send:t})=>{let r=g.get(e.sessionId);if(!r)return{success:!1,error:"Session not found"};let s=e.client,n=Pe(r.modes);n&&t(s,{type:"output",sessionId:e.sessionId,enc:"b64",replay:!0,data:Buffer.from(n).toString("base64")});let o=U(r.buffer,xe);return o&&o.length&&t(s,{type:"output",sessionId:e.sessionId,enc:"b64",replay:!0,data:o.toString("base64")}),{success:!0,name:r.name,cwd:r.cwd,shellId:r.shellId,shellLabel:r.shellLabel,total:A(r.buffer),replaySize:o?o.length:0}},requestHistory:e=>{let t=g.get(e.sessionId);if(!t)return{success:!1,error:"Session not found"};let r=A(t.buffer),s=Math.max(0,Math.min(e.have||0,r)),n=r-s,o=Math.min(Re,n),{prefix:c,extra:a=0}=o>0?se(t.buffer,s,o):{prefix:Buffer.alloc(0),extra:0};return{success:!0,sessionId:e.sessionId,enc:"b64",prefix:c&&c.length?c.toString("base64"):"",prefixLen:c?c.length:0,total:r,remaining:Math.max(0,n-o)}},input:e=>{let t=g.get(e.sessionId);return t?.pty?(t.pty.write(e.data),t.procTimer&&clearTimeout(t.procTimer),t.procTimer=setTimeout(()=>{t.procTimer=null,ue(t,e.sessionId)},300),{}):{}},resize:e=>{let t=g.get(e.sessionId);if(!t?.pty)return{};try{t.pty.resize(e.cols,e.rows)}catch{}return{}},deleteSession:(e,{broadcast:t})=>{let r=g.get(e.sessionId);return r?(r.pty&&r.pty.kill(),g.delete(e.sessionId),t({type:"sessionClosed",sessionId:e.sessionId}),{success:!0}):{success:!1,error:"Session not found"}},getCwd:e=>({cwd:g.get(e.sessionId)?.cwd||null})},Ge={start:e=>Le(e.procId,e),attach:e=>$e(e.procId,e.from),lines:e=>{let t=m.get(e.procId);return t?{success:!0,epoch:t.epoch,lines:ae(t,e.from||0),total:t.lineCount,oldest:t.lines[0]?.n??t.lineCount+1}:{success:!1,error:"Process not found"}},write:e=>ke(e.procId,e.data,e.enc),endInput:e=>He(e.procId),signal:e=>ze(e.procId,e.signal),stop:e=>Be(e.procId),list:()=>({success:!0,procs:Array.from(m.values()).map(e=>({procId:e.id,alive:!e.exited,total:e.lineCount,cwd:e.cwd}))})};L.register("terminal",je);L.register("proc",Ge);L.register("kv",re);L.assertComplete();function qe(e,t){L.enqueue({client:e,message:{...t,client:e}})}function Ze(){if(!d.default.existsSync(D))try{d.default.mkdirSync(D,{recursive:!0})}catch(r){w("Failed to create socket directory",r),process.exit(1)}if(process.platform!=="win32"&&d.default.existsSync(v))try{d.default.unlinkSync(v)}catch(r){w("Failed to remove stale socket",r),process.exit(1)}let e=ce.default.createServer(r=>{H.add(r);let s="";r.on("data",n=>{s+=n.toString();let o=s.split(`
11
+ `);i.tail=y.pop()||"";for(let p of y)h(p)})};return l(a.stdout),l(a.stderr),a.stdin.on("error",()=>{}),a.on("error",S=>{i.exited=!0,i.exitedAt=Date.now(),T({type:"procExit",procId:e,epoch:i.epoch,code:null,error:S.message})}),a.on("close",(S,f)=>{i.tail&&(h(i.tail),i.tail=""),i.exited=!0,i.exitedAt=Date.now(),i.exitCode=S,i.child=null,T({type:"procExit",procId:e,epoch:i.epoch,code:S,signal:f||null})}),{success:!0,procId:e,epoch:i.epoch,pid:a.pid}}function $e(e,t=0){typeof t=="object"&&t!==null&&(t=t.from??0),t=Number(t)||0;let r=m.get(e);return r?{success:!0,alive:!r.exited,epoch:r.epoch,lines:ae(r,t),total:r.lineCount,oldest:r.lines[0]?.n??r.lineCount+1,exitCode:r.exitCode}:{success:!1,error:"Process not found"}}function ke(e,t,r="b64"){let s=m.get(e);return s?.child?.stdin?.writable?(s.child.stdin.write(r==="b64"?Buffer.from(t,"base64"):t),{success:!0}):{success:!1,error:"Process not writable"}}function He(e){let t=m.get(e);if(!t?.child?.stdin?.writable)return{success:!1,error:"Process not writable"};try{t.child.stdin.end()}catch(r){return{success:!1,error:r.message}}return{success:!0}}function ze(e,t="SIGINT"){let r=m.get(e);if(!r?.child)return{success:!1,error:"Process not running"};try{r.child.kill(t)}catch(s){return{success:!1,error:s.message}}return{success:!0}}function G(e,t){if(e?.pid)try{process.platform==="win32"?(0,q.spawn)("taskkill",["/pid",String(e.pid),"/T","/F"]).on("error",()=>{}):process.kill(-e.pid,t)}catch{}}function Be(e){let t=m.get(e);if(!t)return{success:!1,error:"Process not found"};let r=t.child;return r&&(G(r,"SIGINT"),setTimeout(()=>G(r,"SIGKILL"),Ne).unref?.()),m.delete(e),{success:!0}}setInterval(()=>{let e=Date.now();for(let[t,r]of m)r.exited&&r.exitedAt&&e-r.exitedAt>=De&&m.delete(t)},600*1e3).unref?.();function Ue(e,t,r=80,s=24,n=null,o=null){if(g.has(e))return{success:!1,error:"Session already exists"};let c=V(n);(!o||!d.default.existsSync(o))&&(o=le());try{let{env:a,zdotDir:i}=Me(c.path);a.NINE_REMOTE_SESSION_ID=e;let h=ie.default.spawn(c.path,K(c),{name:"xterm-256color",cols:r,rows:s,cwd:o,env:a,useConpty:process.platform==="win32"}),l={pty:h,buffer:[],modes:new Set,name:t,createdAt:Date.now(),cwd:o,shellId:c.id,shellLabel:c.label,zdotDir:i,pending:null,flushScheduled:!1,procTimer:null,foregroundProcess:Z({pty:h})||c.id},S=()=>{l.flushScheduled=!1;let f=l.pending;f&&(l.pending=null,T({type:"output",sessionId:e,enc:"b64",data:Buffer.from(f).toString("base64")}))};return h.onData(f=>{l.buffer.push(Buffer.from(f,"utf-8")),we(l.modes,f);let y=f.match(/\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)/);if(y){let u;try{u=decodeURIComponent(y[1])}catch{u=y[1]}process.platform==="win32"&&/^\/[a-zA-Z]:[\\/]/.test(u)&&(u=u.slice(1)),u&&u!==l.cwd&&(l.cwd=u,T({type:"cwdChange",sessionId:e,cwd:u}))}A(l.buffer)>ne&&(l.buffer=[U(l.buffer,ne)]),l.pending=l.pending===null?f:l.pending+f,l.flushScheduled||(l.flushScheduled=!0,setImmediate(S)),l.procTimer&&clearTimeout(l.procTimer),l.procTimer=setTimeout(()=>{l.procTimer=null,ue(l,e)},250)}),h.onExit(()=>{l.procTimer&&clearTimeout(l.procTimer),g.delete(e),l.zdotDir&&d.default.rm(l.zdotDir,{recursive:!0,force:!0},()=>{}),T({type:"sessionClosed",sessionId:e})}),g.set(e,l),{success:!0,sessionId:e,cwd:o,shellId:c.id,shellLabel:c.label}}catch(a){return w("Failed to create session",a),{success:!1,error:a.message}}}function Z(e){if(!e?.pty)return null;try{let t=e.pty.process;return t?R.default.basename(t):null}catch{return null}}function ue(e,t){if(!e?.pty)return;let r=Z(e);if(r&&r!==e.foregroundProcess){let s=e.foregroundProcess;e.foregroundProcess=r,s!==null&&T({type:"processChange",sessionId:t,process:r,prevProcess:s})}}var Fe=te(500),L=ee({deps:{sessions:g,procs:m,send:oe,broadcast:T,DAEMON_VERSION:B,kv:Fe},send:oe}),je={ping:()=>({version:B}),listSessions:()=>({sessions:Array.from(g.entries()).map(([e,t])=>({id:e,name:t.name,createdAt:t.createdAt,shellId:t.shellId,shellLabel:t.shellLabel,cwd:t.cwd,foregroundProcess:t.foregroundProcess||Z(t)}))}),createSession:e=>Ue(e.sessionId||`session-${Date.now()}`,e.name,e.cols,e.rows,e.shellId,e.cwd),joinSession:(e,{send:t})=>{let r=g.get(e.sessionId);if(!r)return{success:!1,error:"Session not found"};let s=e.client,n=Pe(r.modes);n&&t(s,{type:"output",sessionId:e.sessionId,enc:"b64",replay:!0,data:Buffer.from(n).toString("base64")});let o=U(r.buffer,xe);return o&&o.length&&t(s,{type:"output",sessionId:e.sessionId,enc:"b64",replay:!0,data:o.toString("base64")}),{success:!0,name:r.name,cwd:r.cwd,shellId:r.shellId,shellLabel:r.shellLabel,total:A(r.buffer),replaySize:o?o.length:0}},requestHistory:e=>{let t=g.get(e.sessionId);if(!t)return{success:!1,error:"Session not found"};let r=A(t.buffer),s=Math.max(0,Math.min(e.have||0,r)),n=r-s,o=Math.min(Re,n),{prefix:c,extra:a=0}=o>0?se(t.buffer,s,o):{prefix:Buffer.alloc(0),extra:0};return{success:!0,sessionId:e.sessionId,enc:"b64",prefix:c&&c.length?c.toString("base64"):"",prefixLen:c?c.length:0,total:r,remaining:Math.max(0,n-o)}},input:e=>{let t=g.get(e.sessionId);return t?.pty?(t.pty.write(e.data),t.procTimer&&clearTimeout(t.procTimer),t.procTimer=setTimeout(()=>{t.procTimer=null,ue(t,e.sessionId)},300),{}):{}},resize:e=>{let t=g.get(e.sessionId);if(!t?.pty)return{};try{t.pty.resize(e.cols,e.rows)}catch{}return{}},deleteSession:(e,{broadcast:t})=>{let r=g.get(e.sessionId);return r?(r.pty&&r.pty.kill(),g.delete(e.sessionId),t({type:"sessionClosed",sessionId:e.sessionId}),{success:!0}):{success:!1,error:"Session not found"}},getCwd:e=>({cwd:g.get(e.sessionId)?.cwd||null})},Ge={start:e=>Le(e.procId,e),attach:e=>$e(e.procId,e.from),lines:e=>{let t=m.get(e.procId);return t?{success:!0,epoch:t.epoch,lines:ae(t,e.from||0),total:t.lineCount,oldest:t.lines[0]?.n??t.lineCount+1}:{success:!1,error:"Process not found"}},write:e=>ke(e.procId,e.data,e.enc),endInput:e=>He(e.procId),signal:e=>ze(e.procId,e.signal),stop:e=>Be(e.procId),list:()=>({success:!0,procs:Array.from(m.values()).map(e=>({procId:e.id,alive:!e.exited,total:e.lineCount,cwd:e.cwd}))})};L.register("terminal",je);L.register("proc",Ge);L.register("kv",re);L.assertComplete();function qe(e,t){L.enqueue({client:e,message:{...t,client:e}})}function Ze(){if(!d.default.existsSync(D))try{d.default.mkdirSync(D,{recursive:!0})}catch(r){w("Failed to create socket directory",r),process.exit(1)}if(process.platform!=="win32"&&d.default.existsSync(v))try{d.default.unlinkSync(v)}catch(r){w("Failed to remove stale socket",r),process.exit(1)}let e=ce.default.createServer(r=>{H.add(r);let s="";r.on("data",n=>{s+=n.toString();let o=s.split(`
12
12
  `);s=o.pop()||"";for(let c of o)if(c.trim())try{let a=JSON.parse(c);qe(r,a)}catch{w("Invalid message",c)}}),r.on("close",()=>{H.delete(r)}),r.on("error",n=>{w("Client error",n),H.delete(r)})});e.on("error",r=>{w("Server error",r),r.code==="EADDRINUSE"&&w("Socket already in use, exiting"),process.exit(1)}),e.listen(v,()=>{if(process.platform!=="win32")try{d.default.chmodSync(v,384)}catch{}});try{d.default.mkdirSync(R.default.dirname(F),{recursive:!0}),d.default.writeFileSync(F,String(process.pid),{mode:384})}catch{}let t=()=>{for(let[,r]of g)if(r.procTimer&&clearTimeout(r.procTimer),r.pty)try{r.pty.kill()}catch{}for(let[,r]of m)G(r.child,"SIGINT");try{e.close()}catch{}if(process.platform!=="win32"&&d.default.existsSync(v))try{d.default.unlinkSync(v)}catch{}try{d.default.unlinkSync(F)}catch{}process.exit(0)};process.on("SIGTERM",t),process.on("SIGINT",t)}Ze();