@flrande/browserctl 0.5.0-dev.22.1 → 0.6.0

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 (136) hide show
  1. package/dist/client.d.ts +34 -0
  2. package/dist/client.js +138 -0
  3. package/dist/commandRegistry.d.ts +16 -0
  4. package/dist/commandRegistry.js +21 -0
  5. package/dist/help.d.ts +4 -0
  6. package/dist/help.js +24 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.js +23 -0
  9. package/dist/runCli.d.ts +5 -0
  10. package/dist/runCli.js +170 -0
  11. package/package.json +32 -59
  12. package/INSTALL-CN.md +0 -92
  13. package/INSTALL.md +0 -92
  14. package/LICENSE +0 -21
  15. package/README-CN.md +0 -69
  16. package/README.md +0 -69
  17. package/apps/browserctl/src/commands/a11y-snapshot.ts +0 -20
  18. package/apps/browserctl/src/commands/act.test.ts +0 -71
  19. package/apps/browserctl/src/commands/act.ts +0 -64
  20. package/apps/browserctl/src/commands/command-wrappers.test.ts +0 -688
  21. package/apps/browserctl/src/commands/common.test.ts +0 -87
  22. package/apps/browserctl/src/commands/common.ts +0 -191
  23. package/apps/browserctl/src/commands/console-list.test.ts +0 -102
  24. package/apps/browserctl/src/commands/console-list.ts +0 -108
  25. package/apps/browserctl/src/commands/cookie-clear.ts +0 -18
  26. package/apps/browserctl/src/commands/cookie-get.ts +0 -18
  27. package/apps/browserctl/src/commands/cookie-set.ts +0 -22
  28. package/apps/browserctl/src/commands/dialog-arm.ts +0 -20
  29. package/apps/browserctl/src/commands/dom-query-all.ts +0 -18
  30. package/apps/browserctl/src/commands/dom-query.ts +0 -18
  31. package/apps/browserctl/src/commands/download-trigger.ts +0 -22
  32. package/apps/browserctl/src/commands/download-wait.test.ts +0 -67
  33. package/apps/browserctl/src/commands/download-wait.ts +0 -27
  34. package/apps/browserctl/src/commands/element-screenshot.ts +0 -20
  35. package/apps/browserctl/src/commands/frame-list.ts +0 -16
  36. package/apps/browserctl/src/commands/frame-snapshot.ts +0 -18
  37. package/apps/browserctl/src/commands/har-export.test.ts +0 -112
  38. package/apps/browserctl/src/commands/har-export.ts +0 -120
  39. package/apps/browserctl/src/commands/memory-delete.ts +0 -20
  40. package/apps/browserctl/src/commands/memory-inspect.ts +0 -20
  41. package/apps/browserctl/src/commands/memory-list.ts +0 -90
  42. package/apps/browserctl/src/commands/memory-mode-set.ts +0 -29
  43. package/apps/browserctl/src/commands/memory-purge.ts +0 -16
  44. package/apps/browserctl/src/commands/memory-resolve.ts +0 -56
  45. package/apps/browserctl/src/commands/memory-status.ts +0 -16
  46. package/apps/browserctl/src/commands/memory-ttl-set.ts +0 -28
  47. package/apps/browserctl/src/commands/memory-upsert.ts +0 -142
  48. package/apps/browserctl/src/commands/network-list.test.ts +0 -110
  49. package/apps/browserctl/src/commands/network-list.ts +0 -112
  50. package/apps/browserctl/src/commands/network-wait-for.test.ts +0 -90
  51. package/apps/browserctl/src/commands/network-wait-for.ts +0 -100
  52. package/apps/browserctl/src/commands/profile-list.ts +0 -16
  53. package/apps/browserctl/src/commands/profile-use.ts +0 -18
  54. package/apps/browserctl/src/commands/response-body.ts +0 -24
  55. package/apps/browserctl/src/commands/screenshot.ts +0 -16
  56. package/apps/browserctl/src/commands/session-drop.test.ts +0 -36
  57. package/apps/browserctl/src/commands/session-drop.ts +0 -16
  58. package/apps/browserctl/src/commands/session-list.test.ts +0 -81
  59. package/apps/browserctl/src/commands/session-list.ts +0 -70
  60. package/apps/browserctl/src/commands/snapshot.ts +0 -16
  61. package/apps/browserctl/src/commands/status.ts +0 -10
  62. package/apps/browserctl/src/commands/storage-get.ts +0 -20
  63. package/apps/browserctl/src/commands/storage-set.ts +0 -22
  64. package/apps/browserctl/src/commands/tab-close.ts +0 -20
  65. package/apps/browserctl/src/commands/tab-focus.ts +0 -20
  66. package/apps/browserctl/src/commands/tab-open.ts +0 -19
  67. package/apps/browserctl/src/commands/tabs.ts +0 -13
  68. package/apps/browserctl/src/commands/trace-get.test.ts +0 -61
  69. package/apps/browserctl/src/commands/trace-get.ts +0 -62
  70. package/apps/browserctl/src/commands/upload-arm.ts +0 -26
  71. package/apps/browserctl/src/commands/wait-element.test.ts +0 -80
  72. package/apps/browserctl/src/commands/wait-element.ts +0 -76
  73. package/apps/browserctl/src/commands/wait-text.test.ts +0 -110
  74. package/apps/browserctl/src/commands/wait-text.ts +0 -93
  75. package/apps/browserctl/src/commands/wait-url.test.ts +0 -80
  76. package/apps/browserctl/src/commands/wait-url.ts +0 -76
  77. package/apps/browserctl/src/daemon-client.test.ts +0 -512
  78. package/apps/browserctl/src/daemon-client.ts +0 -632
  79. package/apps/browserctl/src/e2e.test.ts +0 -103
  80. package/apps/browserctl/src/main.dispatch.test.ts +0 -461
  81. package/apps/browserctl/src/main.test.ts +0 -334
  82. package/apps/browserctl/src/main.ts +0 -957
  83. package/apps/browserctl/src/smoke.e2e.test.ts +0 -97
  84. package/apps/browserctl/src/test-port.ts +0 -26
  85. package/apps/browserd/src/bootstrap.ts +0 -432
  86. package/apps/browserd/src/chrome-relay-extension-bridge.test.ts +0 -250
  87. package/apps/browserd/src/chrome-relay-extension-bridge.ts +0 -506
  88. package/apps/browserd/src/container.ts +0 -3088
  89. package/apps/browserd/src/main.test.ts +0 -1522
  90. package/apps/browserd/src/main.ts +0 -7
  91. package/apps/browserd/src/test-port.ts +0 -26
  92. package/apps/browserd/src/tool-matrix.test.ts +0 -887
  93. package/bin/browserctl.cjs +0 -21
  94. package/bin/browserd.cjs +0 -21
  95. package/extensions/chrome-relay/README-CN.md +0 -39
  96. package/extensions/chrome-relay/README.md +0 -39
  97. package/extensions/chrome-relay/background.js +0 -1687
  98. package/extensions/chrome-relay/manifest.json +0 -15
  99. package/extensions/chrome-relay/popup.html +0 -369
  100. package/extensions/chrome-relay/popup.js +0 -972
  101. package/packages/core/src/bootstrap.test.ts +0 -10
  102. package/packages/core/src/driver-registry.test.ts +0 -45
  103. package/packages/core/src/driver-registry.ts +0 -22
  104. package/packages/core/src/driver.ts +0 -47
  105. package/packages/core/src/index.ts +0 -6
  106. package/packages/core/src/navigation-memory.test.ts +0 -259
  107. package/packages/core/src/navigation-memory.ts +0 -360
  108. package/packages/core/src/ref-cache.test.ts +0 -61
  109. package/packages/core/src/ref-cache.ts +0 -28
  110. package/packages/core/src/session-store.test.ts +0 -82
  111. package/packages/core/src/session-store.ts +0 -138
  112. package/packages/core/src/types.ts +0 -9
  113. package/packages/driver-chrome-relay/src/chrome-relay-driver.test.ts +0 -744
  114. package/packages/driver-chrome-relay/src/chrome-relay-driver.ts +0 -2429
  115. package/packages/driver-chrome-relay/src/chrome-relay-extension-runtime.test.ts +0 -264
  116. package/packages/driver-chrome-relay/src/chrome-relay-extension-runtime.ts +0 -521
  117. package/packages/driver-chrome-relay/src/index.ts +0 -26
  118. package/packages/driver-managed/src/index.ts +0 -22
  119. package/packages/driver-managed/src/managed-driver.test.ts +0 -183
  120. package/packages/driver-managed/src/managed-driver.ts +0 -341
  121. package/packages/driver-managed/src/managed-local-driver.test.ts +0 -608
  122. package/packages/driver-managed/src/managed-local-driver.ts +0 -2243
  123. package/packages/driver-remote-cdp/src/index.ts +0 -19
  124. package/packages/driver-remote-cdp/src/remote-cdp-driver.test.ts +0 -727
  125. package/packages/driver-remote-cdp/src/remote-cdp-driver.ts +0 -2264
  126. package/packages/protocol/src/envelope.test.ts +0 -25
  127. package/packages/protocol/src/envelope.ts +0 -31
  128. package/packages/protocol/src/errors.test.ts +0 -17
  129. package/packages/protocol/src/errors.ts +0 -11
  130. package/packages/protocol/src/index.ts +0 -3
  131. package/packages/protocol/src/tools.ts +0 -3
  132. package/packages/transport-mcp-stdio/src/index.ts +0 -3
  133. package/packages/transport-mcp-stdio/src/sdk-server.ts +0 -139
  134. package/packages/transport-mcp-stdio/src/server.test.ts +0 -281
  135. package/packages/transport-mcp-stdio/src/server.ts +0 -183
  136. package/packages/transport-mcp-stdio/src/tool-map.ts +0 -84
@@ -1,334 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from "vitest";
2
-
3
- import * as actCommand from "./commands/act";
4
- import * as daemonClient from "./daemon-client";
5
- import * as screenshotCommand from "./commands/screenshot";
6
- import * as statusCommand from "./commands/status";
7
- import * as tabsCommand from "./commands/tabs";
8
- import { EXIT_CODES, parseArgs, runCli } from "./main";
9
-
10
- function createIoCapture() {
11
- const state = {
12
- stdout: "",
13
- stderr: ""
14
- };
15
-
16
- return {
17
- state,
18
- io: {
19
- stdout: {
20
- write(content: string) {
21
- state.stdout += content;
22
- }
23
- },
24
- stderr: {
25
- write(content: string) {
26
- state.stderr += content;
27
- }
28
- }
29
- }
30
- };
31
- }
32
-
33
- afterEach(() => {
34
- vi.restoreAllMocks();
35
- });
36
-
37
- describe("cli", () => {
38
- it("parses status command", () => {
39
- expect(parseArgs(["status"]).command).toBe("status");
40
- });
41
-
42
- it("treats removed template command as unknown", () => {
43
- expect(parseArgs(["template-run"]).error).toBe("Unknown command: template-run");
44
- });
45
-
46
- it("parses memory-status command", () => {
47
- expect(parseArgs(["memory-status"]).command).toBe("memory-status");
48
- });
49
-
50
- it("parses memory-mode-set command", () => {
51
- expect(parseArgs(["memory-mode-set", "ask"]).command).toBe("memory-mode-set");
52
- });
53
-
54
- it("parses memory-resolve command", () => {
55
- expect(parseArgs(["memory-resolve", "forum.example", "open_profile"]).command).toBe("memory-resolve");
56
- });
57
-
58
- it("preserves unknown flags and '--' separator as command args", () => {
59
- expect(parseArgs(["status", "--profile", "default", "--", "--raw"])).toEqual({
60
- command: "status",
61
- commandArgs: ["--profile", "default", "--", "--raw"],
62
- json: false
63
- });
64
- });
65
-
66
- it("consumes --json globally while preserving command args", () => {
67
- expect(parseArgs(["--json", "tabs", "--verbose"])).toEqual({
68
- command: "tabs",
69
- commandArgs: ["--verbose"],
70
- json: true
71
- });
72
- });
73
-
74
- it("parses --help as a global help request", () => {
75
- expect(parseArgs(["--help"])).toEqual({
76
- command: null,
77
- commandArgs: [],
78
- json: false,
79
- helpTopic: "all"
80
- });
81
- });
82
-
83
- it("parses -h as a global help request", () => {
84
- expect(parseArgs(["-h"])).toEqual({
85
- command: null,
86
- commandArgs: [],
87
- json: false,
88
- helpTopic: "all"
89
- });
90
- });
91
-
92
- it("parses command --help as command help request", () => {
93
- expect(parseArgs(["status", "--help"])).toEqual({
94
- command: null,
95
- commandArgs: [],
96
- json: false,
97
- helpTopic: "status"
98
- });
99
- });
100
-
101
- it("writes JSON output on successful run", async () => {
102
- vi.spyOn(statusCommand, "runStatusCommand").mockResolvedValue({
103
- kind: "browserd",
104
- ready: true
105
- });
106
- const { io, state } = createIoCapture();
107
-
108
- const exitCode = await runCli(["status", "--json"], io);
109
-
110
- expect(exitCode).toBe(EXIT_CODES.OK);
111
- expect(state.stderr).toBe("");
112
- expect(JSON.parse(state.stdout)).toEqual({
113
- ok: true,
114
- command: "status",
115
- data: {
116
- kind: "browserd",
117
- ready: true
118
- }
119
- });
120
- });
121
-
122
- it("returns INVALID_ARGS for unknown command", async () => {
123
- const { io, state } = createIoCapture();
124
-
125
- const exitCode = await runCli(["unknown"], io);
126
-
127
- expect(exitCode).toBe(EXIT_CODES.INVALID_ARGS);
128
- expect(state.stdout).toBe("");
129
- expect(state.stderr).toContain("Unknown command: unknown");
130
- });
131
-
132
- it("writes general help output for --help", async () => {
133
- const { io, state } = createIoCapture();
134
-
135
- const exitCode = await runCli(["--help"], io);
136
-
137
- expect(exitCode).toBe(EXIT_CODES.OK);
138
- expect(state.stderr).toBe("");
139
- expect(state.stdout).toContain("Usage:");
140
- expect(state.stdout).toContain("browserctl help [command]");
141
- expect(state.stdout).toContain("session-list [--tenant <tenant>] [--limit <n>]");
142
- expect(state.stdout).toContain("memory-status");
143
- expect(state.stdout).toContain("memory-mode-set <mode>");
144
- });
145
-
146
- it("writes JSON help output when --json is provided", async () => {
147
- const { io, state } = createIoCapture();
148
-
149
- const exitCode = await runCli(["--json", "--help"], io);
150
-
151
- expect(exitCode).toBe(EXIT_CODES.OK);
152
- expect(state.stderr).toBe("");
153
- expect(JSON.parse(state.stdout)).toEqual(
154
- expect.objectContaining({
155
- ok: true,
156
- command: "help",
157
- data: expect.objectContaining({
158
- topic: "all",
159
- text: expect.stringContaining("Usage:")
160
- })
161
- })
162
- );
163
- });
164
-
165
- it("writes command help output for help <command>", async () => {
166
- const { io, state } = createIoCapture();
167
-
168
- const exitCode = await runCli(["help", "status"], io);
169
-
170
- expect(exitCode).toBe(EXIT_CODES.OK);
171
- expect(state.stderr).toBe("");
172
- expect(state.stdout).toContain("Usage:");
173
- expect(state.stdout).toContain("browserctl status");
174
- });
175
-
176
- it("writes command help output for <command> --help", async () => {
177
- const { io, state } = createIoCapture();
178
-
179
- const exitCode = await runCli(["tab-open", "--help"], io);
180
-
181
- expect(exitCode).toBe(EXIT_CODES.OK);
182
- expect(state.stderr).toBe("");
183
- expect(state.stdout).toContain("Usage:");
184
- expect(state.stdout).toContain("browserctl tab-open <url>");
185
- });
186
-
187
- it("shows payload option in act command help", async () => {
188
- const { io, state } = createIoCapture();
189
-
190
- const exitCode = await runCli(["help", "act"], io);
191
-
192
- expect(exitCode).toBe(EXIT_CODES.OK);
193
- expect(state.stderr).toBe("");
194
- expect(state.stdout).toContain("browserctl act <actionType> <targetId> [--payload-json <json>]");
195
- expect(state.stdout).toContain("--payload-json <json>");
196
- });
197
-
198
- it("returns INVALID_ARGS for unknown help topic", async () => {
199
- const { io, state } = createIoCapture();
200
-
201
- const exitCode = await runCli(["help", "unknown"], io);
202
-
203
- expect(exitCode).toBe(EXIT_CODES.INVALID_ARGS);
204
- expect(state.stdout).toBe("");
205
- expect(state.stderr).toContain("Unknown help topic: unknown");
206
- });
207
-
208
- it("writes non-JSON output when --json is not provided", async () => {
209
- vi.spyOn(tabsCommand, "runTabsCommand").mockResolvedValue({
210
- driver: "managed",
211
- tabs: ["target:1"]
212
- });
213
- const { io, state } = createIoCapture();
214
-
215
- const exitCode = await runCli(["tabs"], io);
216
-
217
- expect(exitCode).toBe(EXIT_CODES.OK);
218
- expect(state.stderr).toBe("");
219
- expect(state.stdout).toMatch(/^tabs: /);
220
- });
221
-
222
- it("dispatches to act command handler with forwarded args", async () => {
223
- const actSpy = vi.spyOn(actCommand, "runActCommand").mockResolvedValue({
224
- ok: true
225
- });
226
- const { io } = createIoCapture();
227
-
228
- const exitCode = await runCli(["act", "click", "tab:42"], io);
229
-
230
- expect(exitCode).toBe(EXIT_CODES.OK);
231
- expect(actSpy).toHaveBeenCalledTimes(1);
232
- expect(actSpy).toHaveBeenCalledWith(["click", "tab:42"]);
233
- });
234
-
235
- it("dispatches to screenshot command handler with forwarded args", async () => {
236
- const screenshotSpy = vi.spyOn(screenshotCommand, "runScreenshotCommand").mockResolvedValue({
237
- ok: true
238
- });
239
- const { io } = createIoCapture();
240
-
241
- const exitCode = await runCli(["screenshot", "tab:42"], io);
242
-
243
- expect(exitCode).toBe(EXIT_CODES.OK);
244
- expect(screenshotSpy).toHaveBeenCalledTimes(1);
245
- expect(screenshotSpy).toHaveBeenCalledWith(["tab:42"]);
246
- });
247
-
248
- it("dispatches to status command handler", async () => {
249
- const statusSpy = vi.spyOn(statusCommand, "runStatusCommand").mockResolvedValue({
250
- kind: "browserd",
251
- ready: true
252
- });
253
- const { io } = createIoCapture();
254
-
255
- const exitCode = await runCli(["status", "--json"], io);
256
-
257
- expect(exitCode).toBe(EXIT_CODES.OK);
258
- expect(statusSpy).toHaveBeenCalledTimes(1);
259
- });
260
-
261
- it("dispatches daemon-status through daemon client", async () => {
262
- const daemonStatusSpy = vi.spyOn(daemonClient, "getDaemonStatus").mockResolvedValue({
263
- running: true,
264
- port: 41337,
265
- pid: 12345
266
- });
267
- const { io, state } = createIoCapture();
268
-
269
- const exitCode = await runCli(["daemon-status", "--json"], io);
270
-
271
- expect(exitCode).toBe(EXIT_CODES.OK);
272
- expect(daemonStatusSpy).toHaveBeenCalledTimes(1);
273
- expect(JSON.parse(state.stdout)).toEqual({
274
- ok: true,
275
- command: "daemon-status",
276
- data: {
277
- running: true,
278
- port: 41337,
279
- pid: 12345
280
- }
281
- });
282
- });
283
-
284
- it("forwards --browser preset to daemon-start", async () => {
285
- const daemonStartSpy = vi.spyOn(daemonClient, "ensureDaemonRunning").mockResolvedValue({
286
- running: true,
287
- port: 41337,
288
- pid: 12345
289
- });
290
- const { io } = createIoCapture();
291
-
292
- const exitCode = await runCli(["daemon-start", "--json", "--browser", "edge"], io);
293
-
294
- expect(exitCode).toBe(EXIT_CODES.OK);
295
- expect(daemonStartSpy).toHaveBeenCalledTimes(1);
296
- expect(daemonStartSpy).toHaveBeenCalledWith({
297
- authToken: undefined,
298
- startup: {
299
- managedLocal: {
300
- browserName: "chromium",
301
- channel: "msedge"
302
- }
303
- }
304
- });
305
- });
306
-
307
- it("adds relay setup guidance when chrome-relay connection fails", async () => {
308
- vi.spyOn(statusCommand, "runStatusCommand").mockRejectedValue(
309
- new Error("E_INTERNAL: connect ECONNREFUSED 127.0.0.1:9223")
310
- );
311
- const { io, state } = createIoCapture();
312
-
313
- const exitCode = await runCli(["status", "--profile", "chrome-relay"], io);
314
-
315
- expect(exitCode).toBe(EXIT_CODES.COMMAND_ERROR);
316
- expect(state.stderr).toContain("chrome-relay 连接失败");
317
- expect(state.stderr).toContain("扩展");
318
- expect(state.stderr).toContain("BROWSERD_CHROME_RELAY_URL");
319
- });
320
-
321
- it("adds relay setup guidance when extension relay is not connected", async () => {
322
- vi.spyOn(statusCommand, "runStatusCommand").mockRejectedValue(
323
- new Error("E_INTERNAL: Chrome relay extension is not connected.")
324
- );
325
- const { io, state } = createIoCapture();
326
-
327
- const exitCode = await runCli(["status", "--profile", "chrome-relay"], io);
328
-
329
- expect(exitCode).toBe(EXIT_CODES.COMMAND_ERROR);
330
- expect(state.stderr).toContain("chrome-relay 连接失败");
331
- expect(state.stderr).toContain("BROWSERD_CHROME_RELAY_MODE=extension");
332
- expect(state.stderr).toContain("extensions/chrome-relay");
333
- });
334
- });