dev3000 0.0.185 → 0.0.187

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 (237) hide show
  1. package/README.md +102 -13
  2. package/bin/dev3000 +1 -2
  3. package/dist/cdp-monitor.d.ts +7 -12
  4. package/dist/cdp-monitor.d.ts.map +1 -1
  5. package/dist/cdp-monitor.js +86 -170
  6. package/dist/cdp-monitor.js.map +1 -1
  7. package/dist/cli.d.ts +1 -2
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +1 -1369
  10. package/dist/cli.js.map +1 -1
  11. package/dist/index.d.ts +1 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +0 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/portless.d.ts +10 -0
  16. package/dist/portless.d.ts.map +1 -1
  17. package/dist/portless.js +44 -1
  18. package/dist/portless.js.map +1 -1
  19. package/dist/runtime/bridge.d.ts +26 -0
  20. package/dist/runtime/bridge.d.ts.map +1 -0
  21. package/dist/runtime/bridge.js +340 -0
  22. package/dist/runtime/bridge.js.map +1 -0
  23. package/dist/runtime/chrome-isolation.d.ts +16 -0
  24. package/dist/runtime/chrome-isolation.d.ts.map +1 -0
  25. package/dist/runtime/chrome-isolation.js +97 -0
  26. package/dist/runtime/chrome-isolation.js.map +1 -0
  27. package/dist/runtime/cli.js +116 -26
  28. package/dist/runtime/cli.js.map +1 -1
  29. package/dist/runtime/event-views.d.ts +21 -0
  30. package/dist/runtime/event-views.d.ts.map +1 -0
  31. package/dist/runtime/event-views.js +53 -0
  32. package/dist/runtime/event-views.js.map +1 -0
  33. package/dist/runtime/harness.d.ts +16 -0
  34. package/dist/runtime/harness.d.ts.map +1 -0
  35. package/dist/runtime/harness.js +68 -0
  36. package/dist/runtime/harness.js.map +1 -0
  37. package/dist/runtime/local-proxy.d.ts +12 -0
  38. package/dist/runtime/local-proxy.d.ts.map +1 -0
  39. package/dist/runtime/local-proxy.js +114 -0
  40. package/dist/runtime/local-proxy.js.map +1 -0
  41. package/dist/runtime/runtime.d.ts +14 -0
  42. package/dist/runtime/runtime.d.ts.map +1 -1
  43. package/dist/runtime/runtime.js +82 -21
  44. package/dist/runtime/runtime.js.map +1 -1
  45. package/dist/runtime/sandbox-agent.d.ts +6 -0
  46. package/dist/runtime/sandbox-agent.d.ts.map +1 -0
  47. package/dist/runtime/sandbox-agent.js +35 -0
  48. package/dist/runtime/sandbox-agent.js.map +1 -0
  49. package/dist/runtime/sandbox-command.d.ts +9 -0
  50. package/dist/runtime/sandbox-command.d.ts.map +1 -0
  51. package/dist/runtime/sandbox-command.js +101 -0
  52. package/dist/runtime/sandbox-command.js.map +1 -0
  53. package/dist/runtime/sandbox-proxy.d.ts +11 -0
  54. package/dist/runtime/sandbox-proxy.d.ts.map +1 -0
  55. package/dist/runtime/sandbox-proxy.js +123 -0
  56. package/dist/runtime/sandbox-proxy.js.map +1 -0
  57. package/dist/runtime/sandbox-sessions.d.ts +31 -0
  58. package/dist/runtime/sandbox-sessions.d.ts.map +1 -0
  59. package/dist/runtime/sandbox-sessions.js +102 -0
  60. package/dist/runtime/sandbox-sessions.js.map +1 -0
  61. package/dist/runtime/sandbox.d.ts +21 -0
  62. package/dist/runtime/sandbox.d.ts.map +1 -0
  63. package/dist/runtime/sandbox.js +481 -0
  64. package/dist/runtime/sandbox.js.map +1 -0
  65. package/dist/utils/agent-browser.d.ts +2 -120
  66. package/dist/utils/agent-browser.d.ts.map +1 -1
  67. package/dist/utils/agent-browser.js +13 -376
  68. package/dist/utils/agent-browser.js.map +1 -1
  69. package/dist/utils/project-name.d.ts +11 -1
  70. package/dist/utils/project-name.d.ts.map +1 -1
  71. package/dist/utils/project-name.js +14 -1
  72. package/dist/utils/project-name.js.map +1 -1
  73. package/package.json +13 -22
  74. package/skills/d3k/SKILL.md +23 -1
  75. package/dist/commands/crawl.d.ts +0 -12
  76. package/dist/commands/crawl.d.ts.map +0 -1
  77. package/dist/commands/crawl.js +0 -101
  78. package/dist/commands/crawl.js.map +0 -1
  79. package/dist/commands/errors.d.ts +0 -14
  80. package/dist/commands/errors.d.ts.map +0 -1
  81. package/dist/commands/errors.js +0 -246
  82. package/dist/commands/errors.js.map +0 -1
  83. package/dist/commands/fix.d.ts +0 -13
  84. package/dist/commands/fix.d.ts.map +0 -1
  85. package/dist/commands/fix.js +0 -219
  86. package/dist/commands/fix.js.map +0 -1
  87. package/dist/commands/logs.d.ts +0 -13
  88. package/dist/commands/logs.d.ts.map +0 -1
  89. package/dist/commands/logs.js +0 -146
  90. package/dist/commands/logs.js.map +0 -1
  91. package/dist/commands/resume.d.ts +0 -11
  92. package/dist/commands/resume.d.ts.map +0 -1
  93. package/dist/commands/resume.js +0 -75
  94. package/dist/commands/resume.js.map +0 -1
  95. package/dist/commands/status.d.ts +0 -21
  96. package/dist/commands/status.d.ts.map +0 -1
  97. package/dist/commands/status.js +0 -44
  98. package/dist/commands/status.js.map +0 -1
  99. package/dist/components/AgentSelector.d.ts +0 -12
  100. package/dist/components/AgentSelector.d.ts.map +0 -1
  101. package/dist/components/AgentSelector.js +0 -99
  102. package/dist/components/AgentSelector.js.map +0 -1
  103. package/dist/components/PackageSelector.d.ts +0 -13
  104. package/dist/components/PackageSelector.d.ts.map +0 -1
  105. package/dist/components/PackageSelector.js +0 -79
  106. package/dist/components/PackageSelector.js.map +0 -1
  107. package/dist/constants/log-colors.d.ts +0 -43
  108. package/dist/constants/log-colors.d.ts.map +0 -1
  109. package/dist/constants/log-colors.js +0 -59
  110. package/dist/constants/log-colors.js.map +0 -1
  111. package/dist/dev-environment.d.ts +0 -187
  112. package/dist/dev-environment.d.ts.map +0 -1
  113. package/dist/dev-environment.js +0 -2248
  114. package/dist/dev-environment.js.map +0 -1
  115. package/dist/screencast-manager.d.ts +0 -78
  116. package/dist/screencast-manager.d.ts.map +0 -1
  117. package/dist/screencast-manager.js +0 -529
  118. package/dist/screencast-manager.js.map +0 -1
  119. package/dist/services/parsers/error-detectors/base.d.ts +0 -24
  120. package/dist/services/parsers/error-detectors/base.d.ts.map +0 -1
  121. package/dist/services/parsers/error-detectors/base.js +0 -44
  122. package/dist/services/parsers/error-detectors/base.js.map +0 -1
  123. package/dist/services/parsers/error-detectors/index.d.ts +0 -6
  124. package/dist/services/parsers/error-detectors/index.d.ts.map +0 -1
  125. package/dist/services/parsers/error-detectors/index.js +0 -6
  126. package/dist/services/parsers/error-detectors/index.js.map +0 -1
  127. package/dist/services/parsers/error-detectors/nextjs.d.ts +0 -9
  128. package/dist/services/parsers/error-detectors/nextjs.d.ts.map +0 -1
  129. package/dist/services/parsers/error-detectors/nextjs.js +0 -52
  130. package/dist/services/parsers/error-detectors/nextjs.js.map +0 -1
  131. package/dist/services/parsers/index.d.ts +0 -9
  132. package/dist/services/parsers/index.d.ts.map +0 -1
  133. package/dist/services/parsers/index.js +0 -10
  134. package/dist/services/parsers/index.js.map +0 -1
  135. package/dist/services/parsers/log-parsers/base.d.ts +0 -26
  136. package/dist/services/parsers/log-parsers/base.d.ts.map +0 -1
  137. package/dist/services/parsers/log-parsers/base.js +0 -6
  138. package/dist/services/parsers/log-parsers/base.js.map +0 -1
  139. package/dist/services/parsers/log-parsers/index.d.ts +0 -6
  140. package/dist/services/parsers/log-parsers/index.d.ts.map +0 -1
  141. package/dist/services/parsers/log-parsers/index.js +0 -5
  142. package/dist/services/parsers/log-parsers/index.js.map +0 -1
  143. package/dist/services/parsers/log-parsers/standard.d.ts +0 -9
  144. package/dist/services/parsers/log-parsers/standard.d.ts.map +0 -1
  145. package/dist/services/parsers/log-parsers/standard.js +0 -17
  146. package/dist/services/parsers/log-parsers/standard.js.map +0 -1
  147. package/dist/services/parsers/output-processor.d.ts +0 -39
  148. package/dist/services/parsers/output-processor.d.ts.map +0 -1
  149. package/dist/services/parsers/output-processor.js +0 -54
  150. package/dist/services/parsers/output-processor.js.map +0 -1
  151. package/dist/skills/d3k/internal-skill.md +0 -32
  152. package/dist/skills/index.d.ts +0 -54
  153. package/dist/skills/index.d.ts.map +0 -1
  154. package/dist/skills/index.js +0 -214
  155. package/dist/skills/index.js.map +0 -1
  156. package/dist/src/tui-interface-impl.tsx +0 -644
  157. package/dist/tui-interface-impl.d.ts +0 -30
  158. package/dist/tui-interface-impl.d.ts.map +0 -1
  159. package/dist/tui-interface-impl.js +0 -403
  160. package/dist/tui-interface-impl.js.map +0 -1
  161. package/dist/tui-interface-opentui.d.ts +0 -33
  162. package/dist/tui-interface-opentui.d.ts.map +0 -1
  163. package/dist/tui-interface-opentui.js +0 -1128
  164. package/dist/tui-interface-opentui.js.map +0 -1
  165. package/dist/tui-interface.d.ts +0 -38
  166. package/dist/tui-interface.d.ts.map +0 -1
  167. package/dist/tui-interface.js +0 -84
  168. package/dist/tui-interface.js.map +0 -1
  169. package/dist/utils/agent-detection.d.ts +0 -17
  170. package/dist/utils/agent-detection.d.ts.map +0 -1
  171. package/dist/utils/agent-detection.js +0 -81
  172. package/dist/utils/agent-detection.js.map +0 -1
  173. package/dist/utils/agent-selection.d.ts +0 -25
  174. package/dist/utils/agent-selection.d.ts.map +0 -1
  175. package/dist/utils/agent-selection.js +0 -73
  176. package/dist/utils/agent-selection.js.map +0 -1
  177. package/dist/utils/browser-command-argv.d.ts +0 -19
  178. package/dist/utils/browser-command-argv.d.ts.map +0 -1
  179. package/dist/utils/browser-command-argv.js +0 -149
  180. package/dist/utils/browser-command-argv.js.map +0 -1
  181. package/dist/utils/build-version.d.ts +0 -2
  182. package/dist/utils/build-version.d.ts.map +0 -1
  183. package/dist/utils/build-version.js +0 -8
  184. package/dist/utils/build-version.js.map +0 -1
  185. package/dist/utils/cli-options.d.ts +0 -5
  186. package/dist/utils/cli-options.d.ts.map +0 -1
  187. package/dist/utils/cli-options.js +0 -36
  188. package/dist/utils/cli-options.js.map +0 -1
  189. package/dist/utils/d3k-dir.d.ts +0 -3
  190. package/dist/utils/d3k-dir.d.ts.map +0 -1
  191. package/dist/utils/d3k-dir.js +0 -12
  192. package/dist/utils/d3k-dir.js.map +0 -1
  193. package/dist/utils/d3k-skill-installer.d.ts +0 -4
  194. package/dist/utils/d3k-skill-installer.d.ts.map +0 -1
  195. package/dist/utils/d3k-skill-installer.js +0 -30
  196. package/dist/utils/d3k-skill-installer.js.map +0 -1
  197. package/dist/utils/log-filename.d.ts +0 -30
  198. package/dist/utils/log-filename.d.ts.map +0 -1
  199. package/dist/utils/log-filename.js +0 -60
  200. package/dist/utils/log-filename.js.map +0 -1
  201. package/dist/utils/project-detector.d.ts +0 -25
  202. package/dist/utils/project-detector.d.ts.map +0 -1
  203. package/dist/utils/project-detector.js +0 -153
  204. package/dist/utils/project-detector.js.map +0 -1
  205. package/dist/utils/project-metadata.d.ts +0 -4
  206. package/dist/utils/project-metadata.d.ts.map +0 -1
  207. package/dist/utils/project-metadata.js +0 -48
  208. package/dist/utils/project-metadata.js.map +0 -1
  209. package/dist/utils/repo-validate.d.ts +0 -2
  210. package/dist/utils/repo-validate.d.ts.map +0 -1
  211. package/dist/utils/repo-validate.js +0 -10
  212. package/dist/utils/repo-validate.js.map +0 -1
  213. package/dist/utils/session.d.ts +0 -19
  214. package/dist/utils/session.d.ts.map +0 -1
  215. package/dist/utils/session.js +0 -65
  216. package/dist/utils/session.js.map +0 -1
  217. package/dist/utils/skill-installer.d.ts +0 -65
  218. package/dist/utils/skill-installer.d.ts.map +0 -1
  219. package/dist/utils/skill-installer.js +0 -265
  220. package/dist/utils/skill-installer.js.map +0 -1
  221. package/dist/utils/timestamp.d.ts +0 -20
  222. package/dist/utils/timestamp.d.ts.map +0 -1
  223. package/dist/utils/timestamp.js +0 -57
  224. package/dist/utils/timestamp.js.map +0 -1
  225. package/dist/utils/tmux-helpers.d.ts +0 -36
  226. package/dist/utils/tmux-helpers.d.ts.map +0 -1
  227. package/dist/utils/tmux-helpers.js +0 -118
  228. package/dist/utils/tmux-helpers.js.map +0 -1
  229. package/dist/utils/user-config.d.ts +0 -12
  230. package/dist/utils/user-config.d.ts.map +0 -1
  231. package/dist/utils/user-config.js +0 -46
  232. package/dist/utils/user-config.js.map +0 -1
  233. package/dist/utils/version-check.d.ts +0 -52
  234. package/dist/utils/version-check.d.ts.map +0 -1
  235. package/dist/utils/version-check.js +0 -304
  236. package/dist/utils/version-check.js.map +0 -1
  237. package/src/tui-interface-impl.tsx +0 -644
@@ -0,0 +1,340 @@
1
+ import { randomUUID, timingSafeEqual } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { WebSocket, WebSocketServer } from "ws";
4
+ const MAX_BYTES = 16 * 1024 * 1024;
5
+ const MAX_CHANNELS = 32;
6
+ const TIMEOUT = 15000;
7
+ function send(socket, frame) {
8
+ if (!socket || socket.readyState !== WebSocket.OPEN)
9
+ return false;
10
+ if (socket.bufferedAmount > MAX_BYTES) {
11
+ socket.terminate();
12
+ return false;
13
+ }
14
+ socket.send(JSON.stringify(frame));
15
+ return true;
16
+ }
17
+ export function isDiscoveryPath(path, method) {
18
+ return method === "GET" && ["/json", "/json/list", "/json/version"].includes(path);
19
+ }
20
+ export function isDevtoolsPath(path) {
21
+ return /^\/devtools\/(page|browser)\/[a-zA-Z0-9-]+$/.test(path);
22
+ }
23
+ export function rewriteDiscovery(body, base) {
24
+ return JSON.stringify(JSON.parse(body), (key, value) => {
25
+ if (key !== "webSocketDebuggerUrl" || typeof value !== "string")
26
+ return value;
27
+ const path = new URL(value).pathname;
28
+ if (!isDevtoolsPath(path))
29
+ throw new Error("Invalid Chrome debugger path");
30
+ return `${base.replace(/^http/, "ws")}${path}`;
31
+ });
32
+ }
33
+ async function listen(server, host, port) {
34
+ await new Promise((resolve, reject) => {
35
+ server.once("error", reject);
36
+ server.listen(port, host, resolve);
37
+ });
38
+ const address = server.address();
39
+ if (!address || typeof address === "string")
40
+ throw new Error("Bridge did not bind a TCP port");
41
+ return address.port;
42
+ }
43
+ /** Public ingress accepts only the paired companion. CDP discovery/control is loopback-only. */
44
+ export async function startBridge(options) {
45
+ if (!/^[a-f0-9]{64}$/.test(options.token))
46
+ throw new Error("Bridge token must be 32 random bytes in hex");
47
+ let companion;
48
+ const channels = new Map();
49
+ const pending = new Map();
50
+ const ingress = createServer((_request, response) => {
51
+ response.writeHead(404).end();
52
+ });
53
+ const upgrades = new WebSocketServer({ noServer: true, maxPayload: MAX_BYTES, perMessageDeflate: false });
54
+ const cdpUpgrades = new WebSocketServer({ noServer: true, maxPayload: MAX_BYTES, perMessageDeflate: false });
55
+ let base = "";
56
+ const reset = () => {
57
+ companion = undefined;
58
+ for (const socket of channels.values())
59
+ socket.terminate();
60
+ channels.clear();
61
+ for (const { response, timer } of pending.values()) {
62
+ clearTimeout(timer);
63
+ response.writeHead(503).end("Browser disconnected");
64
+ }
65
+ pending.clear();
66
+ options.onState?.(false);
67
+ };
68
+ ingress.on("upgrade", (request, socket, head) => {
69
+ const supplied = Buffer.from(request.headers.authorization || "");
70
+ const expected = Buffer.from(`Bearer ${options.token}`);
71
+ if (request.url !== "/bridge" ||
72
+ request.headers.origin ||
73
+ supplied.length !== expected.length ||
74
+ !timingSafeEqual(supplied, expected) ||
75
+ companion) {
76
+ socket.end("HTTP/1.1 403 Forbidden\r\nConnection: close\r\n\r\n");
77
+ return;
78
+ }
79
+ upgrades.handleUpgrade(request, socket, head, (ws) => {
80
+ companion = ws;
81
+ let alive = true;
82
+ const heartbeat = setInterval(() => {
83
+ if (!alive) {
84
+ ws.terminate();
85
+ return;
86
+ }
87
+ alive = false;
88
+ send(ws, { id: "heartbeat", type: "heartbeat" });
89
+ ws.ping();
90
+ }, 20000);
91
+ ws.on("error", () => ws.terminate());
92
+ ws.on("close", () => {
93
+ clearInterval(heartbeat);
94
+ reset();
95
+ });
96
+ ws.on("message", (data) => {
97
+ try {
98
+ const frame = JSON.parse(data.toString());
99
+ if (typeof frame.id !== "string")
100
+ throw new Error("Invalid bridge frame");
101
+ if (frame.type === "heartbeat-ack") {
102
+ alive = true;
103
+ }
104
+ else if (frame.type === "response") {
105
+ const item = pending.get(frame.id);
106
+ if (!item)
107
+ return;
108
+ let body = frame.body || "";
109
+ if (frame.status === 200)
110
+ body = rewriteDiscovery(body, base);
111
+ clearTimeout(item.timer);
112
+ pending.delete(frame.id);
113
+ item.response
114
+ .writeHead(frame.status === 200 ? 200 : 502, {
115
+ "content-type": "application/json",
116
+ "cache-control": "no-store"
117
+ })
118
+ .end(body);
119
+ }
120
+ else {
121
+ const channel = channels.get(frame.id);
122
+ if (frame.type === "data" && typeof frame.body === "string" && channel?.readyState === WebSocket.OPEN) {
123
+ if (channel.bufferedAmount > MAX_BYTES) {
124
+ channel.terminate();
125
+ return;
126
+ }
127
+ channel.send(frame.body);
128
+ }
129
+ else if (frame.type === "close")
130
+ channel?.terminate();
131
+ }
132
+ }
133
+ catch {
134
+ ws.terminate();
135
+ }
136
+ });
137
+ options.onState?.(true);
138
+ });
139
+ });
140
+ const cdp = createServer((request, response) => {
141
+ if (request.headers.origin ||
142
+ !isDiscoveryPath(request.url || "", request.method || "") ||
143
+ !companion ||
144
+ pending.size >= MAX_CHANNELS) {
145
+ response.writeHead(503).end("Browser unavailable or unsupported CDP request");
146
+ return;
147
+ }
148
+ const id = randomUUID();
149
+ const timer = setTimeout(() => {
150
+ pending.delete(id);
151
+ response.writeHead(504).end();
152
+ }, TIMEOUT);
153
+ pending.set(id, { response, timer });
154
+ response.on("close", () => {
155
+ clearTimeout(timer);
156
+ pending.delete(id);
157
+ });
158
+ send(companion, { id, type: "request", path: request.url, method: request.method });
159
+ });
160
+ cdp.on("upgrade", (request, socket, head) => {
161
+ if (request.headers.origin || !isDevtoolsPath(request.url || "") || !companion || channels.size >= MAX_CHANNELS) {
162
+ socket.end("HTTP/1.1 403 Forbidden\r\nConnection: close\r\n\r\n");
163
+ return;
164
+ }
165
+ cdpUpgrades.handleUpgrade(request, socket, head, (ws) => {
166
+ const id = randomUUID();
167
+ channels.set(id, ws);
168
+ send(companion, { id, type: "open", path: request.url });
169
+ // Hold commands until the companion's Chrome WebSocket has opened.
170
+ ws.on("message", (data) => send(companion, { id, type: "data", body: data.toString() }));
171
+ ws.on("error", () => ws.terminate());
172
+ ws.on("close", () => {
173
+ channels.delete(id);
174
+ send(companion, { id, type: "close" });
175
+ });
176
+ });
177
+ });
178
+ try {
179
+ const cdpPort = await listen(cdp, "127.0.0.1", 0);
180
+ base = `http://127.0.0.1:${cdpPort}`;
181
+ const port = await listen(ingress, options.host || "0.0.0.0", options.port);
182
+ return {
183
+ cdpBase: base,
184
+ port,
185
+ connected: () => companion?.readyState === WebSocket.OPEN,
186
+ close: async () => {
187
+ companion?.terminate();
188
+ reset();
189
+ upgrades.close();
190
+ cdpUpgrades.close();
191
+ await Promise.all([ingress, cdp].map((server) => new Promise((resolve) => server.close(() => resolve()))));
192
+ }
193
+ };
194
+ }
195
+ catch (error) {
196
+ ingress.close();
197
+ cdp.close();
198
+ throw error;
199
+ }
200
+ }
201
+ /** Only talks to our dedicated loopback Chrome. Never accepts a remote hostname or arbitrary HTTP path. */
202
+ export function connectCompanion(options) {
203
+ const url = new URL(options.url);
204
+ if (url.protocol !== "wss:" && !(options.allowLoopback && url.protocol === "ws:" && url.hostname === "127.0.0.1")) {
205
+ throw new Error("Companion requires a secure WebSocket URL");
206
+ }
207
+ if (!/^[a-f0-9]{64}$/.test(options.token) ||
208
+ !Number.isInteger(options.chromePort) ||
209
+ options.chromePort < 1 ||
210
+ options.chromePort > 65535)
211
+ throw new Error("Invalid companion configuration");
212
+ let stopped = false;
213
+ let socket;
214
+ let retry;
215
+ let attempt = 0;
216
+ const connect = () => {
217
+ if (stopped)
218
+ return;
219
+ const channels = new Map();
220
+ const requests = new Set();
221
+ const ws = new WebSocket(url, {
222
+ headers: { authorization: `Bearer ${options.token}` },
223
+ maxPayload: MAX_BYTES,
224
+ perMessageDeflate: false,
225
+ handshakeTimeout: TIMEOUT
226
+ });
227
+ socket = ws;
228
+ let lastActivity = Date.now();
229
+ let lastTick = Date.now();
230
+ const heartbeat = setInterval(() => {
231
+ const now = Date.now();
232
+ // After laptop sleep, queued frames can look fresh while the edge tunnel is already stale.
233
+ if (now - lastTick > 60000 || now - lastActivity > 60000)
234
+ ws.terminate();
235
+ lastTick = now;
236
+ }, 20000);
237
+ ws.on("open", () => {
238
+ attempt = 0;
239
+ options.onState?.(true);
240
+ });
241
+ ws.on("error", () => ws.terminate());
242
+ ws.on("close", () => {
243
+ clearInterval(heartbeat);
244
+ for (const { ws: chrome } of channels.values())
245
+ chrome.terminate();
246
+ for (const controller of requests)
247
+ controller.abort();
248
+ options.onState?.(false);
249
+ if (!stopped)
250
+ retry = setTimeout(connect, Math.min(10000, 500 * 2 ** attempt++));
251
+ });
252
+ ws.on("message", (data) => {
253
+ lastActivity = Date.now();
254
+ try {
255
+ const frame = JSON.parse(data.toString());
256
+ if (typeof frame.id !== "string" || frame.id.length > 100)
257
+ throw new Error("Invalid frame");
258
+ if (frame.type === "heartbeat") {
259
+ send(ws, { id: frame.id, type: "heartbeat-ack" });
260
+ }
261
+ else if (frame.type === "request") {
262
+ if (!isDiscoveryPath(frame.path || "", frame.method || "") || requests.size >= MAX_CHANNELS)
263
+ throw new Error("Invalid discovery request");
264
+ const controller = new AbortController();
265
+ requests.add(controller);
266
+ const timeout = setTimeout(() => controller.abort(), TIMEOUT);
267
+ void fetch(`http://127.0.0.1:${options.chromePort}${frame.path}`, {
268
+ method: frame.method,
269
+ signal: controller.signal,
270
+ redirect: "error"
271
+ })
272
+ .then(async (response) => {
273
+ const body = await response.text();
274
+ if (Buffer.byteLength(body) > MAX_BYTES / 2)
275
+ throw new Error("Discovery response too large");
276
+ send(ws, { id: frame.id, type: "response", status: response.status, body });
277
+ })
278
+ .catch(() => send(ws, { id: frame.id, type: "response", status: 502 }))
279
+ .finally(() => {
280
+ clearTimeout(timeout);
281
+ requests.delete(controller);
282
+ });
283
+ }
284
+ else if (frame.type === "open") {
285
+ if (!isDevtoolsPath(frame.path || "") || channels.has(frame.id) || channels.size >= MAX_CHANNELS)
286
+ throw new Error("Invalid CDP channel");
287
+ const chrome = new WebSocket(`ws://127.0.0.1:${options.chromePort}${frame.path}`, {
288
+ maxPayload: MAX_BYTES,
289
+ perMessageDeflate: false,
290
+ handshakeTimeout: TIMEOUT
291
+ });
292
+ const channel = { ws: chrome, queued: [], bytes: 0 };
293
+ channels.set(frame.id, channel);
294
+ chrome.on("open", () => {
295
+ for (const body of channel.queued)
296
+ chrome.send(body);
297
+ channel.queued = [];
298
+ channel.bytes = 0;
299
+ });
300
+ chrome.on("message", (data) => send(ws, { id: frame.id, type: "data", body: data.toString() }));
301
+ chrome.on("error", () => chrome.terminate());
302
+ chrome.on("close", () => {
303
+ channels.delete(frame.id);
304
+ send(ws, { id: frame.id, type: "close" });
305
+ });
306
+ }
307
+ else {
308
+ const channel = channels.get(frame.id);
309
+ if (frame.type === "close")
310
+ channel?.ws.terminate();
311
+ else if (frame.type === "data" && channel && typeof frame.body === "string") {
312
+ if (channel.ws.readyState === WebSocket.OPEN) {
313
+ if (channel.ws.bufferedAmount > MAX_BYTES)
314
+ throw new Error("Slow Chrome consumer");
315
+ channel.ws.send(frame.body);
316
+ }
317
+ else if (channel.ws.readyState === WebSocket.CONNECTING) {
318
+ channel.bytes += Buffer.byteLength(frame.body);
319
+ if (channel.bytes > MAX_BYTES)
320
+ throw new Error("CDP startup queue full");
321
+ channel.queued.push(frame.body);
322
+ }
323
+ }
324
+ }
325
+ }
326
+ catch {
327
+ ws.terminate();
328
+ }
329
+ });
330
+ };
331
+ connect();
332
+ return {
333
+ close: () => {
334
+ stopped = true;
335
+ clearTimeout(retry);
336
+ socket?.terminate();
337
+ }
338
+ };
339
+ }
340
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/runtime/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** Filesystem confinement applies to Chrome's browser process and every child, including CDP file operations. */
2
+ export declare function isolatedChromeInvocation(binary: string, args: string[], profile: string, certificatePin?: string): {
3
+ binary: string;
4
+ args: string[];
5
+ env: {
6
+ PATH: string;
7
+ LANG: string;
8
+ HOME: string;
9
+ TMPDIR: string;
10
+ };
11
+ };
12
+ /** Use the separately installed automation browser, never a managed everyday profile. */
13
+ export declare function sandboxChromePath(): string;
14
+ /** Trust exactly the certificate served by canonical Portless, without reading the user's keychain. */
15
+ export declare function portlessCertificatePin(appUrl: string): Promise<string>;
16
+ //# sourceMappingURL=chrome-isolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-isolation.d.ts","sourceRoot":"","sources":["../../src/runtime/chrome-isolation.ts"],"names":[],"mappings":"AAMA,iHAAiH;AACjH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IAmD7G,MAAM;IACN,IAAI;IACJ,GAAG;QAAI,IAAI;QAAmC,IAAI;QAAiB,IAAI;QAAa,MAAM;;EAE7F;AAED,yFAAyF;AACzF,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C;AAED,uGAAuG;AACvG,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB5E"}
@@ -0,0 +1,97 @@
1
+ import { createHash, X509Certificate } from "node:crypto";
2
+ import { existsSync, mkdirSync, readdirSync, realpathSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join, resolve } from "node:path";
5
+ import { connect } from "node:tls";
6
+ /** Filesystem confinement applies to Chrome's browser process and every child, including CDP file operations. */
7
+ export function isolatedChromeInvocation(binary, args, profile, certificatePin) {
8
+ if (process.platform !== "darwin" || !existsSync("/usr/bin/sandbox-exec"))
9
+ throw new Error("Sandbox mode requires macOS Chrome filesystem isolation; this platform is not supported yet");
10
+ const executable = realpathSync(binary);
11
+ const marker = executable.indexOf(".app/");
12
+ if (marker < 0)
13
+ throw new Error("Sandbox mode requires Chrome installed in an application bundle");
14
+ mkdirSync(profile, { recursive: true, mode: 0o700 });
15
+ const directory = realpathSync(resolve(profile));
16
+ const temporary = join(directory, "d3k-temp");
17
+ mkdirSync(temporary, { recursive: true, mode: 0o700 });
18
+ const readable = [
19
+ executable.slice(0, marker + 4),
20
+ "/System/Library",
21
+ "/System/Cryptexes",
22
+ "/usr/lib",
23
+ "/usr/share",
24
+ "/usr/bin",
25
+ "/bin",
26
+ "/sbin",
27
+ "/Library/Fonts",
28
+ "/Library/Apple",
29
+ "/private/preboot",
30
+ "/private/var/db/dyld",
31
+ "/private/etc",
32
+ "/private/var/run",
33
+ "/Library/Preferences/SystemConfiguration",
34
+ "/dev",
35
+ directory
36
+ ];
37
+ // Chrome's singleton socket ignores TMPDIR on macOS. Allow only its generated socket directories.
38
+ const socket = '(regex #"^/private/var/folders/[^/]+/[^/]+/T/com\\.google\\.Chrome[^/]*(/.*)?$")';
39
+ const except = (paths) => `(require-all (require-not (literal "/")) ${paths.map((path) => `(require-not (subpath ${JSON.stringify(path)}))`).join(" ")} (require-not ${socket}))`;
40
+ const policy = `(version 1)
41
+ (allow default)
42
+ (deny file-read-data ${except(readable)})
43
+ (deny file-write* ${except([directory, "/dev"])})
44
+ (deny appleevent-send)
45
+ (deny mach-lookup (global-name "com.apple.pasteboard.1") (global-name "com.apple.pasteboard") (global-name "com.apple.pbs"))`;
46
+ // Seatbelt cannot be nested. The outer policy confines all Chrome processes, rather than renderers alone.
47
+ const chromeArgs = args.filter((arg) => arg !== "--no-sandbox" && arg !== "--disable-setuid-sandbox");
48
+ chromeArgs.push("--no-sandbox", "--disable-breakpad", "--password-store=basic", "--use-mock-keychain", "--disable-features=ChromeBrowserCloudManagement", `--crash-dumps-dir=${join(temporary, "crashes")}`);
49
+ if (certificatePin)
50
+ chromeArgs.push(`--ignore-certificate-errors-spki-list=${certificatePin}`);
51
+ return {
52
+ binary: "/usr/bin/sandbox-exec",
53
+ args: ["-p", policy, executable, ...chromeArgs],
54
+ env: { PATH: "/usr/bin:/bin:/usr/sbin:/sbin", LANG: "en_US.UTF-8", HOME: directory, TMPDIR: temporary }
55
+ };
56
+ }
57
+ /** Use the separately installed automation browser, never a managed everyday profile. */
58
+ export function sandboxChromePath() {
59
+ if (process.platform !== "darwin")
60
+ throw new Error("Sandbox mode currently requires macOS filesystem confinement");
61
+ const root = join(homedir(), ".agent-browser", "browsers");
62
+ const installed = existsSync(root) ? readdirSync(root).filter((name) => /^chrome-[0-9.]+$/.test(name)) : [];
63
+ installed.sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
64
+ for (const name of installed) {
65
+ const binary = join(root, name, "Google Chrome for Testing.app", "Contents", "MacOS", "Google Chrome for Testing");
66
+ if (existsSync(binary))
67
+ return binary;
68
+ }
69
+ throw new Error("Sandbox mode requires Chrome for Testing. Run bunx agent-browser install, then retry");
70
+ }
71
+ /** Trust exactly the certificate served by canonical Portless, without reading the user's keychain. */
72
+ export async function portlessCertificatePin(appUrl) {
73
+ return new Promise((accept, reject) => {
74
+ const socket = connect({
75
+ host: "127.0.0.1",
76
+ port: 443,
77
+ servername: new URL(appUrl).hostname,
78
+ rejectUnauthorized: false
79
+ });
80
+ socket.setTimeout(5000, () => socket.destroy(new Error("Portless TLS certificate unavailable")));
81
+ socket.once("error", reject);
82
+ socket.once("secureConnect", () => {
83
+ try {
84
+ const certificate = new X509Certificate(socket.getPeerCertificate().raw);
85
+ const publicKey = certificate.publicKey.export({ type: "spki", format: "der" });
86
+ accept(createHash("sha256").update(publicKey).digest("base64"));
87
+ }
88
+ catch (error) {
89
+ reject(error);
90
+ }
91
+ finally {
92
+ socket.destroy();
93
+ }
94
+ });
95
+ });
96
+ }
97
+ //# sourceMappingURL=chrome-isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-isolation.js","sourceRoot":"","sources":["../../src/runtime/chrome-isolation.ts"],"names":[],"mappings":"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"}