@everywheredev/cli 0.0.5 → 0.0.7

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 (307) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +274 -59
  3. package/package.json +3 -2
  4. package/scripts/build.mjs +68 -0
  5. package/dist/agent/agent-loop.d.ts +0 -40
  6. package/dist/agent/agent-loop.d.ts.map +0 -1
  7. package/dist/agent/agent-loop.js +0 -162
  8. package/dist/agent/agent-loop.js.map +0 -1
  9. package/dist/agent/approval.d.ts +0 -38
  10. package/dist/agent/approval.d.ts.map +0 -1
  11. package/dist/agent/approval.js +0 -55
  12. package/dist/agent/approval.js.map +0 -1
  13. package/dist/agent/run-tracker.d.ts +0 -26
  14. package/dist/agent/run-tracker.d.ts.map +0 -1
  15. package/dist/agent/run-tracker.js +0 -43
  16. package/dist/agent/run-tracker.js.map +0 -1
  17. package/dist/auth/device-flow.d.ts +0 -61
  18. package/dist/auth/device-flow.d.ts.map +0 -1
  19. package/dist/auth/device-flow.js +0 -141
  20. package/dist/auth/device-flow.js.map +0 -1
  21. package/dist/auth/hydra-oauth-auth-provider.d.ts +0 -35
  22. package/dist/auth/hydra-oauth-auth-provider.d.ts.map +0 -1
  23. package/dist/auth/hydra-oauth-auth-provider.js +0 -153
  24. package/dist/auth/hydra-oauth-auth-provider.js.map +0 -1
  25. package/dist/auth/keychain.d.ts +0 -42
  26. package/dist/auth/keychain.d.ts.map +0 -1
  27. package/dist/auth/keychain.js +0 -138
  28. package/dist/auth/keychain.js.map +0 -1
  29. package/dist/auth/pkce.d.ts +0 -20
  30. package/dist/auth/pkce.d.ts.map +0 -1
  31. package/dist/auth/pkce.js +0 -44
  32. package/dist/auth/pkce.js.map +0 -1
  33. package/dist/auth/ports.d.ts +0 -25
  34. package/dist/auth/ports.d.ts.map +0 -1
  35. package/dist/auth/ports.js +0 -8
  36. package/dist/auth/ports.js.map +0 -1
  37. package/dist/commands/activity.d.ts +0 -17
  38. package/dist/commands/activity.d.ts.map +0 -1
  39. package/dist/commands/activity.js +0 -54
  40. package/dist/commands/activity.js.map +0 -1
  41. package/dist/commands/agent.d.ts +0 -25
  42. package/dist/commands/agent.d.ts.map +0 -1
  43. package/dist/commands/agent.js +0 -80
  44. package/dist/commands/agent.js.map +0 -1
  45. package/dist/commands/agents.d.ts +0 -9
  46. package/dist/commands/agents.d.ts.map +0 -1
  47. package/dist/commands/agents.js +0 -28
  48. package/dist/commands/agents.js.map +0 -1
  49. package/dist/commands/commits.d.ts +0 -16
  50. package/dist/commands/commits.d.ts.map +0 -1
  51. package/dist/commands/commits.js +0 -39
  52. package/dist/commands/commits.js.map +0 -1
  53. package/dist/commands/diff.d.ts +0 -15
  54. package/dist/commands/diff.d.ts.map +0 -1
  55. package/dist/commands/diff.js +0 -27
  56. package/dist/commands/diff.js.map +0 -1
  57. package/dist/commands/expose.d.ts +0 -15
  58. package/dist/commands/expose.d.ts.map +0 -1
  59. package/dist/commands/expose.js +0 -39
  60. package/dist/commands/expose.js.map +0 -1
  61. package/dist/commands/index.d.ts +0 -7
  62. package/dist/commands/index.d.ts.map +0 -1
  63. package/dist/commands/index.js +0 -12
  64. package/dist/commands/index.js.map +0 -1
  65. package/dist/commands/login.d.ts +0 -9
  66. package/dist/commands/login.d.ts.map +0 -1
  67. package/dist/commands/login.js +0 -27
  68. package/dist/commands/login.js.map +0 -1
  69. package/dist/commands/logout.d.ts +0 -9
  70. package/dist/commands/logout.d.ts.map +0 -1
  71. package/dist/commands/logout.js +0 -24
  72. package/dist/commands/logout.js.map +0 -1
  73. package/dist/commands/me.d.ts +0 -10
  74. package/dist/commands/me.d.ts.map +0 -1
  75. package/dist/commands/me.js +0 -25
  76. package/dist/commands/me.js.map +0 -1
  77. package/dist/commands/open.d.ts +0 -16
  78. package/dist/commands/open.d.ts.map +0 -1
  79. package/dist/commands/open.js +0 -34
  80. package/dist/commands/open.js.map +0 -1
  81. package/dist/commands/ports.d.ts +0 -75
  82. package/dist/commands/ports.d.ts.map +0 -1
  83. package/dist/commands/ports.js +0 -78
  84. package/dist/commands/ports.js.map +0 -1
  85. package/dist/commands/profile.d.ts +0 -21
  86. package/dist/commands/profile.d.ts.map +0 -1
  87. package/dist/commands/profile.js +0 -93
  88. package/dist/commands/profile.js.map +0 -1
  89. package/dist/commands/push.d.ts +0 -18
  90. package/dist/commands/push.d.ts.map +0 -1
  91. package/dist/commands/push.js +0 -116
  92. package/dist/commands/push.js.map +0 -1
  93. package/dist/commands/registry.d.ts +0 -15
  94. package/dist/commands/registry.d.ts.map +0 -1
  95. package/dist/commands/registry.js +0 -45
  96. package/dist/commands/registry.js.map +0 -1
  97. package/dist/commands/request.d.ts +0 -25
  98. package/dist/commands/request.d.ts.map +0 -1
  99. package/dist/commands/request.js +0 -58
  100. package/dist/commands/request.js.map +0 -1
  101. package/dist/commands/resume.d.ts +0 -22
  102. package/dist/commands/resume.d.ts.map +0 -1
  103. package/dist/commands/resume.js +0 -69
  104. package/dist/commands/resume.js.map +0 -1
  105. package/dist/commands/save.d.ts +0 -34
  106. package/dist/commands/save.d.ts.map +0 -1
  107. package/dist/commands/save.js +0 -141
  108. package/dist/commands/save.js.map +0 -1
  109. package/dist/commands/session.d.ts +0 -9
  110. package/dist/commands/session.d.ts.map +0 -1
  111. package/dist/commands/session.js +0 -282
  112. package/dist/commands/session.js.map +0 -1
  113. package/dist/commands/skills/markdown-loader.d.ts +0 -19
  114. package/dist/commands/skills/markdown-loader.d.ts.map +0 -1
  115. package/dist/commands/skills/markdown-loader.js +0 -108
  116. package/dist/commands/skills/markdown-loader.js.map +0 -1
  117. package/dist/commands/skills/registry.d.ts +0 -23
  118. package/dist/commands/skills/registry.d.ts.map +0 -1
  119. package/dist/commands/skills/registry.js +0 -45
  120. package/dist/commands/skills/registry.js.map +0 -1
  121. package/dist/commands/terminal.d.ts +0 -19
  122. package/dist/commands/terminal.d.ts.map +0 -1
  123. package/dist/commands/terminal.js +0 -39
  124. package/dist/commands/terminal.js.map +0 -1
  125. package/dist/commands/tree.d.ts +0 -16
  126. package/dist/commands/tree.d.ts.map +0 -1
  127. package/dist/commands/tree.js +0 -44
  128. package/dist/commands/tree.js.map +0 -1
  129. package/dist/commands/undo.d.ts +0 -18
  130. package/dist/commands/undo.d.ts.map +0 -1
  131. package/dist/commands/undo.js +0 -46
  132. package/dist/commands/undo.js.map +0 -1
  133. package/dist/config/config-store.d.ts +0 -19
  134. package/dist/config/config-store.d.ts.map +0 -1
  135. package/dist/config/config-store.js +0 -199
  136. package/dist/config/config-store.js.map +0 -1
  137. package/dist/config/defaults.d.ts +0 -22
  138. package/dist/config/defaults.d.ts.map +0 -1
  139. package/dist/config/defaults.js +0 -38
  140. package/dist/config/defaults.js.map +0 -1
  141. package/dist/config/ports.d.ts +0 -60
  142. package/dist/config/ports.d.ts.map +0 -1
  143. package/dist/config/ports.js +0 -8
  144. package/dist/config/ports.js.map +0 -1
  145. package/dist/config/profile-constants.d.ts +0 -4
  146. package/dist/config/profile-constants.d.ts.map +0 -1
  147. package/dist/config/profile-constants.js +0 -10
  148. package/dist/config/profile-constants.js.map +0 -1
  149. package/dist/config/profile.d.ts +0 -84
  150. package/dist/config/profile.d.ts.map +0 -1
  151. package/dist/config/profile.js +0 -66
  152. package/dist/config/profile.js.map +0 -1
  153. package/dist/contract/index.d.ts +0 -193
  154. package/dist/contract/index.d.ts.map +0 -1
  155. package/dist/contract/index.js +0 -14
  156. package/dist/contract/index.js.map +0 -1
  157. package/dist/core/app.d.ts +0 -35
  158. package/dist/core/app.d.ts.map +0 -1
  159. package/dist/core/app.js +0 -86
  160. package/dist/core/app.js.map +0 -1
  161. package/dist/core/command-router.d.ts +0 -29
  162. package/dist/core/command-router.d.ts.map +0 -1
  163. package/dist/core/command-router.js +0 -61
  164. package/dist/core/command-router.js.map +0 -1
  165. package/dist/core/errors.d.ts +0 -39
  166. package/dist/core/errors.d.ts.map +0 -1
  167. package/dist/core/errors.js +0 -106
  168. package/dist/core/errors.js.map +0 -1
  169. package/dist/core/preflight.d.ts +0 -16
  170. package/dist/core/preflight.d.ts.map +0 -1
  171. package/dist/core/preflight.js +0 -38
  172. package/dist/core/preflight.js.map +0 -1
  173. package/dist/core/repl.d.ts +0 -18
  174. package/dist/core/repl.d.ts.map +0 -1
  175. package/dist/core/repl.js +0 -128
  176. package/dist/core/repl.js.map +0 -1
  177. package/dist/di/container.d.ts +0 -13
  178. package/dist/di/container.d.ts.map +0 -1
  179. package/dist/di/container.js +0 -160
  180. package/dist/di/container.js.map +0 -1
  181. package/dist/di/tokens.d.ts +0 -20
  182. package/dist/di/tokens.d.ts.map +0 -1
  183. package/dist/di/tokens.js +0 -22
  184. package/dist/di/tokens.js.map +0 -1
  185. package/dist/index.d.ts +0 -9
  186. package/dist/index.d.ts.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/render/ink-renderer.d.ts +0 -28
  189. package/dist/render/ink-renderer.d.ts.map +0 -1
  190. package/dist/render/ink-renderer.js +0 -174
  191. package/dist/render/ink-renderer.js.map +0 -1
  192. package/dist/render/plain-renderer.d.ts +0 -16
  193. package/dist/render/plain-renderer.d.ts.map +0 -1
  194. package/dist/render/plain-renderer.js +0 -38
  195. package/dist/render/plain-renderer.js.map +0 -1
  196. package/dist/render/ports.d.ts +0 -12
  197. package/dist/render/ports.d.ts.map +0 -1
  198. package/dist/render/ports.js +0 -10
  199. package/dist/render/ports.js.map +0 -1
  200. package/dist/render/raw-renderer.d.ts +0 -11
  201. package/dist/render/raw-renderer.d.ts.map +0 -1
  202. package/dist/render/raw-renderer.js +0 -68
  203. package/dist/render/raw-renderer.js.map +0 -1
  204. package/dist/render/repl-input.d.ts +0 -15
  205. package/dist/render/repl-input.d.ts.map +0 -1
  206. package/dist/render/repl-input.js +0 -102
  207. package/dist/render/repl-input.js.map +0 -1
  208. package/dist/session/file-session-store.d.ts +0 -26
  209. package/dist/session/file-session-store.d.ts.map +0 -1
  210. package/dist/session/file-session-store.js +0 -174
  211. package/dist/session/file-session-store.js.map +0 -1
  212. package/dist/session/ports.d.ts +0 -50
  213. package/dist/session/ports.d.ts.map +0 -1
  214. package/dist/session/ports.js +0 -6
  215. package/dist/session/ports.js.map +0 -1
  216. package/dist/sync/git-sync.d.ts +0 -16
  217. package/dist/sync/git-sync.d.ts.map +0 -1
  218. package/dist/sync/git-sync.js +0 -28
  219. package/dist/sync/git-sync.js.map +0 -1
  220. package/dist/sync/git.d.ts +0 -12
  221. package/dist/sync/git.d.ts.map +0 -1
  222. package/dist/sync/git.js +0 -100
  223. package/dist/sync/git.js.map +0 -1
  224. package/dist/sync/reconciler.d.ts +0 -36
  225. package/dist/sync/reconciler.d.ts.map +0 -1
  226. package/dist/sync/reconciler.js +0 -143
  227. package/dist/sync/reconciler.js.map +0 -1
  228. package/dist/sync/walk.d.ts +0 -23
  229. package/dist/sync/walk.d.ts.map +0 -1
  230. package/dist/sync/walk.js +0 -81
  231. package/dist/sync/walk.js.map +0 -1
  232. package/dist/sync/watch.d.ts +0 -13
  233. package/dist/sync/watch.d.ts.map +0 -1
  234. package/dist/sync/watch.js +0 -75
  235. package/dist/sync/watch.js.map +0 -1
  236. package/dist/tools/git-diff.d.ts +0 -16
  237. package/dist/tools/git-diff.d.ts.map +0 -1
  238. package/dist/tools/git-diff.js +0 -25
  239. package/dist/tools/git-diff.js.map +0 -1
  240. package/dist/tools/http-request.d.ts +0 -25
  241. package/dist/tools/http-request.d.ts.map +0 -1
  242. package/dist/tools/http-request.js +0 -41
  243. package/dist/tools/http-request.js.map +0 -1
  244. package/dist/tools/index.d.ts +0 -7
  245. package/dist/tools/index.d.ts.map +0 -1
  246. package/dist/tools/index.js +0 -22
  247. package/dist/tools/index.js.map +0 -1
  248. package/dist/tools/ports.d.ts +0 -58
  249. package/dist/tools/ports.d.ts.map +0 -1
  250. package/dist/tools/ports.js +0 -17
  251. package/dist/tools/ports.js.map +0 -1
  252. package/dist/tools/read-file.d.ts +0 -16
  253. package/dist/tools/read-file.d.ts.map +0 -1
  254. package/dist/tools/read-file.js +0 -24
  255. package/dist/tools/read-file.js.map +0 -1
  256. package/dist/tools/registry.d.ts +0 -10
  257. package/dist/tools/registry.d.ts.map +0 -1
  258. package/dist/tools/registry.js +0 -28
  259. package/dist/tools/registry.js.map +0 -1
  260. package/dist/tools/run-command.d.ts +0 -20
  261. package/dist/tools/run-command.d.ts.map +0 -1
  262. package/dist/tools/run-command.js +0 -65
  263. package/dist/tools/run-command.js.map +0 -1
  264. package/dist/tools/write-file.d.ts +0 -24
  265. package/dist/tools/write-file.d.ts.map +0 -1
  266. package/dist/tools/write-file.js +0 -60
  267. package/dist/tools/write-file.js.map +0 -1
  268. package/dist/transport/composite-transport.d.ts +0 -30
  269. package/dist/transport/composite-transport.d.ts.map +0 -1
  270. package/dist/transport/composite-transport.js +0 -71
  271. package/dist/transport/composite-transport.js.map +0 -1
  272. package/dist/transport/device-browser.d.ts +0 -19
  273. package/dist/transport/device-browser.d.ts.map +0 -1
  274. package/dist/transport/device-browser.js +0 -243
  275. package/dist/transport/device-browser.js.map +0 -1
  276. package/dist/transport/device-git.d.ts +0 -14
  277. package/dist/transport/device-git.d.ts.map +0 -1
  278. package/dist/transport/device-git.js +0 -107
  279. package/dist/transport/device-git.js.map +0 -1
  280. package/dist/transport/device-http.d.ts +0 -10
  281. package/dist/transport/device-http.d.ts.map +0 -1
  282. package/dist/transport/device-http.js +0 -96
  283. package/dist/transport/device-http.js.map +0 -1
  284. package/dist/transport/device-terminal.d.ts +0 -44
  285. package/dist/transport/device-terminal.d.ts.map +0 -1
  286. package/dist/transport/device-terminal.js +0 -140
  287. package/dist/transport/device-terminal.js.map +0 -1
  288. package/dist/transport/http-transport.d.ts +0 -26
  289. package/dist/transport/http-transport.d.ts.map +0 -1
  290. package/dist/transport/http-transport.js +0 -125
  291. package/dist/transport/http-transport.js.map +0 -1
  292. package/dist/transport/ports.d.ts +0 -67
  293. package/dist/transport/ports.d.ts.map +0 -1
  294. package/dist/transport/ports.js +0 -11
  295. package/dist/transport/ports.js.map +0 -1
  296. package/dist/transport/reconnect.d.ts +0 -44
  297. package/dist/transport/reconnect.d.ts.map +0 -1
  298. package/dist/transport/reconnect.js +0 -69
  299. package/dist/transport/reconnect.js.map +0 -1
  300. package/dist/transport/terminal-transport.d.ts +0 -28
  301. package/dist/transport/terminal-transport.d.ts.map +0 -1
  302. package/dist/transport/terminal-transport.js +0 -63
  303. package/dist/transport/terminal-transport.js.map +0 -1
  304. package/dist/transport/ws-stream-transport.d.ts +0 -66
  305. package/dist/transport/ws-stream-transport.d.ts.map +0 -1
  306. package/dist/transport/ws-stream-transport.js +0 -246
  307. package/dist/transport/ws-stream-transport.js.map +0 -1
@@ -1,65 +0,0 @@
1
- // src/tools/run-command.ts — `run_command` tool (exec host-side via a PTY)
2
- //
3
- // Side effect: "exec" → gated by the ApprovalGate. The CLI never spawns a process itself
4
- // (it owns no shell): it asks the host to run the command in a PTY over the WS contract
5
- // (terminal:create → terminal:input → terminal:data* → terminal:exit) and collects the
6
- // output. The host enforces Casbin/sandboxing; this tool is a thin, non-interactive driver.
7
- import { z } from "zod";
8
- import { ToolResults } from "./ports.js";
9
- const schema = z.object({
10
- command: z.string().min(1),
11
- /** Hard cap so a runaway command cannot hang the agent loop. */
12
- timeoutMs: z.coerce.number().int().positive().max(600_000).default(120_000),
13
- });
14
- export class RunCommandTool {
15
- name = "run_command";
16
- summary = "Run a shell command on the host in a PTY (WS terminal:*)";
17
- schema = schema;
18
- sideEffect = "exec";
19
- async execute(ctx) {
20
- const input = schema.parse(ctx.input);
21
- const allowed = await ctx.approval.guard({ name: this.name, sideEffect: this.sideEffect });
22
- if (!allowed)
23
- return ToolResults.fail(`command "${input.command}" was denied by the approval gate`);
24
- await ctx.stream.connect();
25
- await ctx.terminal.create({ cols: 120, rows: 40 });
26
- return new Promise((resolve) => {
27
- let buffer = "";
28
- let settled = false;
29
- const offData = ctx.terminal.onData((chunk) => {
30
- buffer += chunk;
31
- });
32
- const offExit = ctx.terminal.onExit((code) => settle(code));
33
- const timer = setTimeout(() => settle(-1, "timed out"), input.timeoutMs);
34
- const onAbort = () => settle(-1, "aborted");
35
- ctx.signal.addEventListener("abort", onAbort, { once: true });
36
- const settle = (code, reason) => {
37
- if (settled)
38
- return;
39
- settled = true;
40
- clearTimeout(timer);
41
- offData();
42
- offExit();
43
- ctx.signal.removeEventListener("abort", onAbort);
44
- const output = stripExitMarker(buffer);
45
- if (reason) {
46
- resolve(ToolResults.fail(`run_command ${reason} (exit ${code})`, output));
47
- }
48
- else if (code === 0) {
49
- resolve(ToolResults.ok(output, { exitCode: code }));
50
- }
51
- else {
52
- resolve(ToolResults.fail(`command exited with code ${code}`, output));
53
- }
54
- };
55
- // Send the command; a trailing `exit` ensures the PTY terminates so we get terminal:exit.
56
- ctx.terminal.input(`${input.command}\n`);
57
- ctx.terminal.input("exit\n");
58
- });
59
- }
60
- }
61
- /** Drop the trailing shell `exit` echo and prompt noise from the captured buffer. */
62
- function stripExitMarker(buf) {
63
- return buf.replace(/(^|\n)exit\r?\n?$/i, "").trimEnd();
64
- }
65
- //# sourceMappingURL=run-command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- import { z } from "zod";
2
- import type { Tool, ToolContext, ToolResult } from "./ports.js";
3
- export declare class WriteFileTool implements Tool {
4
- readonly name = "write_file";
5
- readonly summary = "Write a file to the project (PUT /api/file, mtime-guarded)";
6
- readonly schema: z.ZodObject<{
7
- path: z.ZodString;
8
- content: z.ZodString;
9
- /** Force-overwrite without a precondition mtime (skip the concurrency check). */
10
- overwrite: z.ZodDefault<z.ZodBoolean>;
11
- }, "strip", z.ZodTypeAny, {
12
- path: string;
13
- content: string;
14
- overwrite: boolean;
15
- }, {
16
- path: string;
17
- content: string;
18
- overwrite?: boolean | undefined;
19
- }>;
20
- readonly sideEffect: "write";
21
- execute(ctx: ToolContext): Promise<ToolResult>;
22
- private currentMtime;
23
- }
24
- //# sourceMappingURL=write-file.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAUhE,qBAAa,aAAc,YAAW,IAAI;IACxC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,OAAO,gEAAgE;IAChF,QAAQ,CAAC,MAAM;;;QAPf,iFAAiF;;;;;;;;;;OAOxD;IACzB,QAAQ,CAAC,UAAU,EAAG,OAAO,CAAU;IAEjC,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YAgCtC,YAAY;CAS3B"}
@@ -1,60 +0,0 @@
1
- // src/tools/write-file.ts — `write_file` tool → PUT /api/file
2
- //
3
- // Side effect: "write" → the ApprovalGate must pass before we apply. Uses mtime optimistic
4
- // concurrency: it reads the current mtime first so a concurrent edit produces a 409 the agent
5
- // loop can surface rather than silently clobbering (cli.md §14). The host re-checks Casbin.
6
- import { z } from "zod";
7
- import { CliError } from "../core/errors.js";
8
- import { ToolResults } from "./ports.js";
9
- const schema = z.object({
10
- path: z.string().min(1),
11
- content: z.string(),
12
- /** Force-overwrite without a precondition mtime (skip the concurrency check). */
13
- overwrite: z.boolean().default(false),
14
- });
15
- export class WriteFileTool {
16
- name = "write_file";
17
- summary = "Write a file to the project (PUT /api/file, mtime-guarded)";
18
- schema = schema;
19
- sideEffect = "write";
20
- async execute(ctx) {
21
- const input = schema.parse(ctx.input);
22
- // UX gate (the host independently authorizes via Casbin).
23
- const allowed = await ctx.approval.guard({ name: this.name, sideEffect: this.sideEffect, path: input.path });
24
- if (!allowed)
25
- return ToolResults.fail(`write to ${input.path} was denied by the approval gate`);
26
- let mtime;
27
- if (!input.overwrite) {
28
- mtime = await this.currentMtime(ctx, input.path);
29
- }
30
- try {
31
- const written = await ctx.http.put("/api/file", {
32
- path: input.path,
33
- content: input.content,
34
- mtime,
35
- });
36
- return ToolResults.ok(`wrote ${written.path} (${input.content.length} bytes)`, {
37
- path: written.path,
38
- mtime: written.mtime,
39
- });
40
- }
41
- catch (err) {
42
- if (err instanceof CliError && err.kind === "conflict") {
43
- return ToolResults.fail(`conflict: ${input.path} changed on the host since last read — reload or pass overwrite=true`);
44
- }
45
- throw err;
46
- }
47
- }
48
- async currentMtime(ctx, path) {
49
- try {
50
- const current = await ctx.http.get("/api/file", { path });
51
- return current.mtime;
52
- }
53
- catch (err) {
54
- if (err instanceof CliError && err.kind === "not_found")
55
- return undefined; // new file
56
- throw err;
57
- }
58
- }
59
- }
60
- //# sourceMappingURL=write-file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/tools/write-file.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,2FAA2F;AAC3F,8FAA8F;AAC9F,4FAA4F;AAE5F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,iFAAiF;IACjF,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,YAAY,CAAC;IACpB,OAAO,GAAG,4DAA4D,CAAC;IACvE,MAAM,GAAG,MAAM,CAAC;IAChB,UAAU,GAAG,OAAgB,CAAC;IAEvC,KAAK,CAAC,OAAO,CAAC,GAAgB;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEtC,0DAA0D;QAC1D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7G,IAAI,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,kCAAkC,CAAC,CAAC;QAEhG,IAAI,KAAyB,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAc,WAAW,EAAE;gBAC3D,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK;aACN,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,EAAE,CAAC,SAAS,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,SAAS,EAAE;gBAC7E,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACvD,OAAO,WAAW,CAAC,IAAI,CACrB,aAAa,KAAK,CAAC,IAAI,sEAAsE,CAC9F,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAgB,EAAE,IAAY;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAc,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,OAAO,OAAO,CAAC,KAAK,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,SAAS,CAAC,CAAC,WAAW;YACtF,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -1,30 +0,0 @@
1
- import type { ClientEvent, ClientEventMap, ServerEvent, ServerEventMap } from "../contract/index.js";
2
- import type { HttpPort, ResumeState, StreamPort, TerminalPort, Transport, Unsubscribe } from "./ports.js";
3
- export declare class CompositeTransport implements Transport {
4
- private readonly http;
5
- private readonly stream;
6
- private readonly terminal;
7
- constructor(http: HttpPort, stream: StreamPort, terminal: TerminalPort);
8
- get<T>(path: string, query?: Record<string, string | number | undefined>): Promise<T>;
9
- put<T>(path: string, body: unknown): Promise<T>;
10
- post<T>(path: string, body: unknown): Promise<T>;
11
- del<T>(path: string): Promise<T>;
12
- postRaw<T>(path: string, body: Uint8Array, headers?: Record<string, string>): Promise<T>;
13
- connect(): Promise<void>;
14
- on<E extends ServerEvent>(event: E, fn: (payload: ServerEventMap[E]) => void): Unsubscribe;
15
- send<E extends ClientEvent>(event: E, payload: ClientEventMap[E]): void;
16
- close(): Promise<void>;
17
- resume(state: ResumeState): Promise<void>;
18
- get connected(): boolean;
19
- create(opts: {
20
- cols?: number;
21
- rows?: number;
22
- }): Promise<{
23
- id: string;
24
- }>;
25
- input(data: string): void;
26
- resize(cols: number, rows: number): void;
27
- onData(fn: (chunk: string) => void): Unsubscribe;
28
- onExit(fn: (code: number) => void): Unsubscribe;
29
- }
30
- //# sourceMappingURL=composite-transport.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"composite-transport.d.ts","sourceRoot":"","sources":["../../src/transport/composite-transport.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,kBAAmB,YAAW,SAAS;IAEhD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFR,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,YAAY;IAIzC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAGrF,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAG/C,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAGhD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAGhC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKxF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAGxB,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW;IAG1F,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAGvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAGtB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAGzC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAGD,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAGvE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAGzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAGxC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;IAGhD,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW;CAGhD"}
@@ -1,71 +0,0 @@
1
- // CompositeTransport — the `Transport` façade.
2
- //
3
- // ISP in practice: most consumers depend on exactly one of HttpPort / StreamPort / TerminalPort. This
4
- // façade exists only for the few places (e.g. the AgentLoop host) that genuinely need all three at
5
- // once. It delegates every method to the corresponding injected port and adds no behavior — keeping
6
- // SRP intact (each underlying transport still owns its own concern).
7
- //
8
- // DIP: it is composed from the three port abstractions at the DI root, never constructing concretes
9
- // itself, so a test can build a CompositeTransport from fakes.
10
- export class CompositeTransport {
11
- http;
12
- stream;
13
- terminal;
14
- constructor(http, stream, terminal) {
15
- this.http = http;
16
- this.stream = stream;
17
- this.terminal = terminal;
18
- }
19
- // ── HttpPort ──────────────────────────────────────────────────────────────
20
- get(path, query) {
21
- return this.http.get(path, query);
22
- }
23
- put(path, body) {
24
- return this.http.put(path, body);
25
- }
26
- post(path, body) {
27
- return this.http.post(path, body);
28
- }
29
- del(path) {
30
- return this.http.del(path);
31
- }
32
- postRaw(path, body, headers) {
33
- return this.http.postRaw(path, body, headers);
34
- }
35
- // ── StreamPort ────────────────────────────────────────────────────────────
36
- connect() {
37
- return this.stream.connect();
38
- }
39
- on(event, fn) {
40
- return this.stream.on(event, fn);
41
- }
42
- send(event, payload) {
43
- this.stream.send(event, payload);
44
- }
45
- close() {
46
- return this.stream.close();
47
- }
48
- resume(state) {
49
- return this.stream.resume(state);
50
- }
51
- get connected() {
52
- return this.stream.connected;
53
- }
54
- // ── TerminalPort ──────────────────────────────────────────────────────────
55
- create(opts) {
56
- return this.terminal.create(opts);
57
- }
58
- input(data) {
59
- this.terminal.input(data);
60
- }
61
- resize(cols, rows) {
62
- this.terminal.resize(cols, rows);
63
- }
64
- onData(fn) {
65
- return this.terminal.onData(fn);
66
- }
67
- onExit(fn) {
68
- return this.terminal.onExit(fn);
69
- }
70
- }
71
- //# sourceMappingURL=composite-transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"composite-transport.js","sourceRoot":"","sources":["../../src/transport/composite-transport.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,sGAAsG;AACtG,mGAAmG;AACnG,oGAAoG;AACpG,qEAAqE;AACrE,EAAE;AACF,oGAAoG;AACpG,+DAA+D;AAiB/D,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IAHnB,YACmB,IAAc,EACd,MAAkB,EAClB,QAAsB;QAFtB,SAAI,GAAJ,IAAI,CAAU;QACd,WAAM,GAAN,MAAM,CAAY;QAClB,aAAQ,GAAR,QAAQ,CAAc;IACtC,CAAC;IAEJ,6EAA6E;IAC7E,GAAG,CAAI,IAAY,EAAE,KAAmD;QACtE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,GAAG,CAAI,IAAY,EAAE,IAAa;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAI,IAAY,EAAE,IAAa;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,GAAG,CAAI,IAAY;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAI,IAAY,EAAE,IAAgB,EAAE,OAAgC;QACzE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,6EAA6E;IAC7E,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IACD,EAAE,CAAwB,KAAQ,EAAE,EAAwC;QAC1E,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAwB,KAAQ,EAAE,OAA0B;QAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,MAAM,CAAC,KAAkB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,IAAsC;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,IAAY;QAChB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,CAAC,EAA2B;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,CAAC,EAA0B;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -1,19 +0,0 @@
1
- import type { WsStreamTransport } from "./ws-stream-transport.js";
2
- export declare class DeviceBrowserResponder {
3
- private readonly stream;
4
- private readonly executablePath;
5
- private readonly sessions;
6
- private readonly unsubs;
7
- constructor(stream: WsStreamTransport, executablePath: string);
8
- start(): void;
9
- stop(): void;
10
- private onOpen;
11
- private onInput;
12
- private onNavigate;
13
- private onResize;
14
- private onClose;
15
- private emitNav;
16
- }
17
- /** Resolve the device's INSTALLED browser executable (the "real browser on local"). Null if none found. */
18
- export declare function findChrome(): string | null;
19
- //# sourceMappingURL=device-browser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-browser.d.ts","sourceRoot":"","sources":["../../src/transport/device-browser.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAmFlE,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IALjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAG7B,MAAM,EAAE,iBAAiB,EACzB,cAAc,EAAE,MAAM;IAGzC,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;YAOE,MAAM;YAoDN,OAAO;YA4BP,UAAU;YAOV,QAAQ;YAqBR,OAAO;IAQrB,OAAO,CAAC,OAAO;CAMhB;AAiBD,2GAA2G;AAC3G,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAQ1C"}
@@ -1,243 +0,0 @@
1
- // DeviceBrowserResponder — runs a REAL headless browser on this machine and streams it to the dashboard.
2
- //
3
- // The dashboard can't embed the user's localhost app reliably (CSP/SPA/redirects/auth), so instead we run
4
- // the actual browser HERE (the device), render the page with a genuine engine, and stream JPEG frames to
5
- // the dashboard while injecting its mouse/keyboard back. Because it's a real browser, SPAs, redirects,
6
- // APIs, and HMR all just work. Frames come from CDP Page.startScreencast (ack-throttled → natural
7
- // backpressure); input goes through puppeteer's high-level mouse/keyboard.
8
- //
9
- // The device:browser:* events are OUTSIDE the frozen contract, so we ride onRaw/sendRaw (like terminal).
10
- import { createRequire } from "node:module";
11
- import { existsSync } from "node:fs";
12
- import * as os from "node:os";
13
- import { join } from "node:path";
14
- const MAX_DIM = 2560;
15
- const MAX_PHYS = 4096; // physical-pixel cap for the screencast (width*dpr), bounds frame size
16
- const QUALITY = 92; // high enough that JPEG doesn't soften text; still far smaller than PNG
17
- function clampDpr(raw) {
18
- if (!raw || !Number.isFinite(raw) || raw < 1)
19
- return 1;
20
- return Math.min(raw, 2);
21
- }
22
- // CDP screencast caps at PHYSICAL pixels so it captures the HiDPI surface at native resolution (else the
23
- // dashboard upscales a 1× frame → blur). Logical layout stays width×height; only the pixel buffer grows.
24
- function screencastParams(width, height, dpr) {
25
- return {
26
- format: "jpeg",
27
- quality: QUALITY,
28
- maxWidth: Math.min(MAX_PHYS, Math.round(width * dpr)),
29
- maxHeight: Math.min(MAX_PHYS, Math.round(height * dpr)),
30
- };
31
- }
32
- export class DeviceBrowserResponder {
33
- stream;
34
- executablePath;
35
- sessions = new Map();
36
- unsubs = [];
37
- constructor(stream, executablePath) {
38
- this.stream = stream;
39
- this.executablePath = executablePath;
40
- }
41
- start() {
42
- this.unsubs.push(this.stream.onRaw("device:browser:open", (p) => void this.onOpen(p).catch(() => { })));
43
- this.unsubs.push(this.stream.onRaw("device:browser:input", (p) => void this.onInput(p).catch(() => { })));
44
- this.unsubs.push(this.stream.onRaw("device:browser:navigate", (p) => void this.onNavigate(p).catch(() => { })));
45
- this.unsubs.push(this.stream.onRaw("device:browser:resize", (p) => void this.onResize(p).catch(() => { })));
46
- this.unsubs.push(this.stream.onRaw("device:browser:close", (p) => void this.onClose(p).catch(() => { })));
47
- }
48
- stop() {
49
- for (const u of this.unsubs)
50
- u();
51
- this.unsubs.length = 0;
52
- for (const [, s] of this.sessions)
53
- void s.browser.close().catch(() => undefined);
54
- this.sessions.clear();
55
- }
56
- async onOpen(payload) {
57
- const req = (payload ?? {});
58
- const sid = req.sessionId;
59
- if (!sid)
60
- return;
61
- const width = clampDim(req.width, 1280);
62
- const height = clampDim(req.height, 720);
63
- const dpr = clampDpr(req.dpr);
64
- const url = req.url || "http://localhost:3000";
65
- try {
66
- const pptr = loadPuppeteer();
67
- if (!pptr.module)
68
- throw new Error(pptr.error ?? "puppeteer-core unavailable");
69
- const browser = await pptr.module.launch({
70
- executablePath: this.executablePath,
71
- headless: true,
72
- defaultViewport: { width, height },
73
- args: ["--no-sandbox", "--disable-gpu", "--disable-dev-shm-usage", "--hide-scrollbars"],
74
- });
75
- const page = await browser.newPage();
76
- await page.setViewport({ width, height, deviceScaleFactor: dpr });
77
- const cdp = await page.createCDPSession();
78
- const session = { browser, page, cdp, lastUrl: url, dpr };
79
- this.sessions.set(sid, session);
80
- // Browser exited on its own (crash / manual close) → tell the dashboard.
81
- browser.on("disconnected", () => {
82
- if (this.sessions.delete(sid))
83
- this.stream.sendRaw("device:browser:closed", { sessionId: sid });
84
- });
85
- cdp.on("Page.screencastFrame", (frame) => {
86
- this.stream.sendRaw("device:browser:frame", { sessionId: sid, data: frame.data });
87
- // Ack AFTER forwarding — CDP withholds the next frame until we ack, throttling to the relay's rate.
88
- void cdp.send("Page.screencastFrameAck", { sessionId: frame.sessionId }).catch(() => undefined);
89
- });
90
- page.on("framenavigated", () => this.emitNav(sid, session));
91
- // Navigate (don't fail the session on a load error — a real browser just shows its error page).
92
- await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30_000 }).catch(() => undefined);
93
- await cdp.send("Page.startScreencast", screencastParams(width, height, dpr));
94
- this.stream.sendRaw("device:browser:ready", { sessionId: sid });
95
- this.emitNav(sid, session);
96
- }
97
- catch (err) {
98
- this.sessions.delete(sid);
99
- this.stream.sendRaw("device:browser:error", {
100
- sessionId: sid,
101
- error: err instanceof Error ? err.message : String(err),
102
- });
103
- }
104
- }
105
- async onInput(payload) {
106
- const req = (payload ?? {});
107
- const s = req.sessionId ? this.sessions.get(req.sessionId) : undefined;
108
- if (!s)
109
- return;
110
- try {
111
- if (req.type === "mouse") {
112
- const x = req.x ?? 0;
113
- const y = req.y ?? 0;
114
- if (req.action === "move")
115
- await s.page.mouse.move(x, y);
116
- else if (req.action === "down")
117
- await s.page.mouse.down({ button: req.button ?? "left" });
118
- else if (req.action === "up")
119
- await s.page.mouse.up({ button: req.button ?? "left" });
120
- }
121
- else if (req.type === "scroll") {
122
- await s.page.mouse.wheel({ deltaX: req.dx ?? 0, deltaY: req.dy ?? 0 });
123
- }
124
- else if (req.type === "key" && req.key) {
125
- // Printable single chars → sendCharacter (reliable insert); named keys (Enter/Backspace/arrows) →
126
- // down/up. Modifier combos are out of scope for v1.
127
- if (req.action === "down") {
128
- if (req.key.length === 1)
129
- await s.page.keyboard.sendCharacter(req.key);
130
- else
131
- await s.page.keyboard.down(req.key);
132
- }
133
- else if (req.action === "up" && req.key.length > 1) {
134
- await s.page.keyboard.up(req.key);
135
- }
136
- }
137
- }
138
- catch {
139
- /* input on a closing page — ignore */
140
- }
141
- }
142
- async onNavigate(payload) {
143
- const { sessionId, url } = (payload ?? {});
144
- const s = sessionId ? this.sessions.get(sessionId) : undefined;
145
- if (!s || !url)
146
- return;
147
- await s.page.goto(url, { waitUntil: "domcontentloaded", timeout: 30_000 }).catch(() => undefined);
148
- }
149
- async onResize(payload) {
150
- const { sessionId, width, height, dpr } = (payload ?? {});
151
- const s = sessionId ? this.sessions.get(sessionId) : undefined;
152
- if (!s)
153
- return;
154
- const w = clampDim(width, 1280);
155
- const h = clampDim(height, 720);
156
- if (dpr !== undefined)
157
- s.dpr = clampDpr(dpr);
158
- try {
159
- await s.page.setViewport({ width: w, height: h, deviceScaleFactor: s.dpr });
160
- await s.cdp.send("Page.stopScreencast").catch(() => undefined);
161
- await s.cdp.send("Page.startScreencast", screencastParams(w, h, s.dpr));
162
- }
163
- catch {
164
- /* resizing a closing page — ignore */
165
- }
166
- }
167
- async onClose(payload) {
168
- const { sessionId } = (payload ?? {});
169
- const s = sessionId ? this.sessions.get(sessionId) : undefined;
170
- if (!s || !sessionId)
171
- return;
172
- this.sessions.delete(sessionId);
173
- await s.browser.close().catch(() => undefined);
174
- }
175
- emitNav(sid, s) {
176
- const url = s.page.url();
177
- if (url === s.lastUrl)
178
- return;
179
- s.lastUrl = url;
180
- this.stream.sendRaw("device:browser:nav", { sessionId: sid, url });
181
- }
182
- }
183
- function clampDim(raw, fallback) {
184
- if (!raw || !Number.isFinite(raw) || raw <= 0)
185
- return fallback;
186
- return Math.min(Math.round(raw), MAX_DIM);
187
- }
188
- /** Load puppeteer-core at runtime so a missing/broken install degrades gracefully (like node-pty). */
189
- function loadPuppeteer() {
190
- try {
191
- const require = createRequire(import.meta.url);
192
- return { module: require("puppeteer-core") };
193
- }
194
- catch (err) {
195
- return { error: err instanceof Error ? err.message : String(err) };
196
- }
197
- }
198
- /** Resolve the device's INSTALLED browser executable (the "real browser on local"). Null if none found. */
199
- export function findChrome() {
200
- for (const env of ["PUPPETEER_EXECUTABLE_PATH", "CHROME_PATH"]) {
201
- const p = process.env[env];
202
- if (p && existsSync(p))
203
- return p;
204
- }
205
- const candidates = chromeCandidates();
206
- for (const c of candidates)
207
- if (existsSync(c))
208
- return c;
209
- return null;
210
- }
211
- function chromeCandidates() {
212
- switch (os.platform()) {
213
- case "darwin":
214
- return [
215
- "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
216
- "/Applications/Chromium.app/Contents/MacOS/Chromium",
217
- "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
218
- "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
219
- "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
220
- ];
221
- case "win32": {
222
- const pf = process.env["PROGRAMFILES"] ?? "C:\\Program Files";
223
- const pf86 = process.env["PROGRAMFILES(X86)"] ?? "C:\\Program Files (x86)";
224
- const local = process.env["LOCALAPPDATA"] ?? join(os.homedir(), "AppData", "Local");
225
- return [
226
- join(pf, "Google\\Chrome\\Application\\chrome.exe"),
227
- join(pf86, "Google\\Chrome\\Application\\chrome.exe"),
228
- join(local, "Google\\Chrome\\Application\\chrome.exe"),
229
- join(pf86, "Microsoft\\Edge\\Application\\msedge.exe"),
230
- ];
231
- }
232
- default:
233
- return [
234
- "/usr/bin/google-chrome",
235
- "/usr/bin/google-chrome-stable",
236
- "/usr/bin/chromium",
237
- "/usr/bin/chromium-browser",
238
- "/snap/bin/chromium",
239
- "/usr/bin/microsoft-edge",
240
- ];
241
- }
242
- }
243
- //# sourceMappingURL=device-browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-browser.js","sourceRoot":"","sources":["../../src/transport/device-browser.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { WsStreamTransport } from "./ws-stream-transport.js";
2
- export declare class DeviceGitResponder {
3
- private readonly stream;
4
- private readonly cwd;
5
- private readonly onAfterCheckout?;
6
- private readonly unsubs;
7
- constructor(stream: WsStreamTransport, cwd?: string, onAfterCheckout?: (() => Promise<void> | void) | undefined);
8
- start(): void;
9
- stop(): void;
10
- private onRequest;
11
- private listBranches;
12
- private unstage;
13
- }
14
- //# sourceMappingURL=device-git.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-git.d.ts","sourceRoot":"","sources":["../../src/transport/device-git.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAUlE,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAGpB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAPnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAG7B,MAAM,EAAE,iBAAiB,EACzB,GAAG,GAAE,MAAsB,EAG3B,eAAe,CAAC,GAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,aAAA;IAG/D,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;YAKE,SAAS;YA2CT,YAAY;YAQZ,OAAO;CAQtB"}