@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,688 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from "vitest";
2
-
3
- const { callDaemonToolMock } = vi.hoisted(() => ({
4
- callDaemonToolMock: vi.fn()
5
- }));
6
-
7
- vi.mock("../daemon-client", () => ({
8
- callDaemonTool: callDaemonToolMock
9
- }));
10
-
11
- import { DAEMON_STARTUP_ARGUMENT } from "./common";
12
- import { runA11ySnapshotCommand } from "./a11y-snapshot";
13
- import { runActCommand } from "./act";
14
- import { runConsoleListCommand } from "./console-list";
15
- import { runCookieClearCommand } from "./cookie-clear";
16
- import { runCookieGetCommand } from "./cookie-get";
17
- import { runCookieSetCommand } from "./cookie-set";
18
- import { runDialogArmCommand } from "./dialog-arm";
19
- import { runDomQueryAllCommand } from "./dom-query-all";
20
- import { runDomQueryCommand } from "./dom-query";
21
- import { runDownloadTriggerCommand } from "./download-trigger";
22
- import { runDownloadWaitCommand } from "./download-wait";
23
- import { runElementScreenshotCommand } from "./element-screenshot";
24
- import { runFrameListCommand } from "./frame-list";
25
- import { runFrameSnapshotCommand } from "./frame-snapshot";
26
- import { runHarExportCommand } from "./har-export";
27
- import { runMemoryDeleteCommand } from "./memory-delete";
28
- import { runMemoryInspectCommand } from "./memory-inspect";
29
- import { runMemoryListCommand } from "./memory-list";
30
- import { runMemoryModeSetCommand } from "./memory-mode-set";
31
- import { runMemoryPurgeCommand } from "./memory-purge";
32
- import { runMemoryResolveCommand } from "./memory-resolve";
33
- import { runMemoryStatusCommand } from "./memory-status";
34
- import { runMemoryTtlSetCommand } from "./memory-ttl-set";
35
- import { runMemoryUpsertCommand } from "./memory-upsert";
36
- import { runNetworkListCommand } from "./network-list";
37
- import { runNetworkWaitForCommand } from "./network-wait-for";
38
- import { runProfileListCommand } from "./profile-list";
39
- import { runProfileUseCommand } from "./profile-use";
40
- import { runResponseBodyCommand } from "./response-body";
41
- import { runScreenshotCommand } from "./screenshot";
42
- import { runSessionDropCommand } from "./session-drop";
43
- import { runSessionListCommand } from "./session-list";
44
- import { runSnapshotCommand } from "./snapshot";
45
- import { runStatusCommand } from "./status";
46
- import { runStorageGetCommand } from "./storage-get";
47
- import { runStorageSetCommand } from "./storage-set";
48
- import { runTabCloseCommand } from "./tab-close";
49
- import { runTabFocusCommand } from "./tab-focus";
50
- import { runTabOpenCommand } from "./tab-open";
51
- import { runTabsCommand } from "./tabs";
52
- import { runTraceGetCommand } from "./trace-get";
53
- import { runUploadArmCommand } from "./upload-arm";
54
- import { runWaitElementCommand } from "./wait-element";
55
- import { runWaitTextCommand } from "./wait-text";
56
- import { runWaitUrlCommand } from "./wait-url";
57
-
58
- type WrapperCase = {
59
- name: string;
60
- run: () => Promise<unknown>;
61
- expectedTool: string;
62
- expectedArgs: Record<string, unknown>;
63
- };
64
-
65
- const BASE_ARGS = {
66
- sessionId: "cli:local"
67
- };
68
-
69
- const CASES: WrapperCase[] = [
70
- {
71
- name: "status",
72
- run: async () => await runStatusCommand(),
73
- expectedTool: "browser.status",
74
- expectedArgs: { ...BASE_ARGS }
75
- },
76
- {
77
- name: "tabs",
78
- run: async () => await runTabsCommand(),
79
- expectedTool: "browser.tab.list",
80
- expectedArgs: { ...BASE_ARGS }
81
- },
82
- {
83
- name: "profile-list",
84
- run: async () => await runProfileListCommand(),
85
- expectedTool: "browser.profile.list",
86
- expectedArgs: { ...BASE_ARGS }
87
- },
88
- {
89
- name: "profile-use",
90
- run: async () => await runProfileUseCommand(["managed"]),
91
- expectedTool: "browser.profile.use",
92
- expectedArgs: {
93
- ...BASE_ARGS,
94
- profile: "managed"
95
- }
96
- },
97
- {
98
- name: "tab-open",
99
- run: async () => await runTabOpenCommand(["https://example.com"]),
100
- expectedTool: "browser.tab.open",
101
- expectedArgs: {
102
- ...BASE_ARGS,
103
- url: "https://example.com"
104
- }
105
- },
106
- {
107
- name: "tab-focus",
108
- run: async () => await runTabFocusCommand(["target:1"]),
109
- expectedTool: "browser.tab.focus",
110
- expectedArgs: {
111
- ...BASE_ARGS,
112
- targetId: "target:1"
113
- }
114
- },
115
- {
116
- name: "tab-close",
117
- run: async () => await runTabCloseCommand(["target:1"]),
118
- expectedTool: "browser.tab.close",
119
- expectedArgs: {
120
- ...BASE_ARGS,
121
- targetId: "target:1"
122
- }
123
- },
124
- {
125
- name: "session-list",
126
- run: async () => await runSessionListCommand(["--tenant", "finance", "--limit", "5"]),
127
- expectedTool: "browser.session.list",
128
- expectedArgs: {
129
- ...BASE_ARGS,
130
- tenant: "finance",
131
- limit: 5
132
- }
133
- },
134
- {
135
- name: "session-drop",
136
- run: async () => await runSessionDropCommand(["tenant-a:job-1"]),
137
- expectedTool: "browser.session.drop",
138
- expectedArgs: {
139
- ...BASE_ARGS,
140
- sessionIdToDelete: "tenant-a:job-1"
141
- }
142
- },
143
- {
144
- name: "snapshot",
145
- run: async () => await runSnapshotCommand(["target:1"]),
146
- expectedTool: "browser.snapshot",
147
- expectedArgs: {
148
- ...BASE_ARGS,
149
- targetId: "target:1"
150
- }
151
- },
152
- {
153
- name: "screenshot",
154
- run: async () => await runScreenshotCommand(["target:1"]),
155
- expectedTool: "browser.screenshot",
156
- expectedArgs: {
157
- ...BASE_ARGS,
158
- targetId: "target:1"
159
- }
160
- },
161
- {
162
- name: "dom-query",
163
- run: async () => await runDomQueryCommand(["target:1", "#root"]),
164
- expectedTool: "browser.dom.query",
165
- expectedArgs: {
166
- ...BASE_ARGS,
167
- targetId: "target:1",
168
- selector: "#root"
169
- }
170
- },
171
- {
172
- name: "dom-query-all",
173
- run: async () => await runDomQueryAllCommand(["target:1", ".item"]),
174
- expectedTool: "browser.dom.queryAll",
175
- expectedArgs: {
176
- ...BASE_ARGS,
177
- targetId: "target:1",
178
- selector: ".item"
179
- }
180
- },
181
- {
182
- name: "element-screenshot",
183
- run: async () => await runElementScreenshotCommand(["target:1", "#hero"]),
184
- expectedTool: "browser.element.screenshot",
185
- expectedArgs: {
186
- ...BASE_ARGS,
187
- targetId: "target:1",
188
- selector: "#hero"
189
- }
190
- },
191
- {
192
- name: "a11y-snapshot",
193
- run: async () => await runA11ySnapshotCommand(["target:1", " #main "]),
194
- expectedTool: "browser.a11y.snapshot",
195
- expectedArgs: {
196
- ...BASE_ARGS,
197
- targetId: "target:1",
198
- selector: "#main"
199
- }
200
- },
201
- {
202
- name: "wait-element",
203
- run: async () => await runWaitElementCommand(["target:1", "#ready", "--timeout-ms", "1200", "--poll-ms", "20"]),
204
- expectedTool: "browser.wait.element",
205
- expectedArgs: {
206
- ...BASE_ARGS,
207
- targetId: "target:1",
208
- selector: "#ready",
209
- timeoutMs: 1200,
210
- pollMs: 20
211
- }
212
- },
213
- {
214
- name: "wait-text",
215
- run: async () => await runWaitTextCommand(["target:1", "done", "--selector", "#status", "--timeout-ms", "1500"]),
216
- expectedTool: "browser.wait.text",
217
- expectedArgs: {
218
- ...BASE_ARGS,
219
- targetId: "target:1",
220
- text: "done",
221
- selector: "#status",
222
- timeoutMs: 1500
223
- }
224
- },
225
- {
226
- name: "wait-url",
227
- run: async () => await runWaitUrlCommand(["target:1", "/dashboard", "1800"]),
228
- expectedTool: "browser.wait.url",
229
- expectedArgs: {
230
- ...BASE_ARGS,
231
- targetId: "target:1",
232
- urlPattern: "/dashboard",
233
- timeoutMs: 1800
234
- }
235
- },
236
- {
237
- name: "network-list",
238
- run: async () =>
239
- await runNetworkListCommand([
240
- "target:1",
241
- "--url-contains",
242
- "/api",
243
- "--method",
244
- "get",
245
- "--status",
246
- "200",
247
- "--since",
248
- "2026-01-01T00:00:00.000Z",
249
- "--limit",
250
- "15"
251
- ]),
252
- expectedTool: "browser.network.list",
253
- expectedArgs: {
254
- ...BASE_ARGS,
255
- targetId: "target:1",
256
- urlContains: "/api",
257
- method: "GET",
258
- status: 200,
259
- since: "2026-01-01T00:00:00.000Z",
260
- limit: 15
261
- }
262
- },
263
- {
264
- name: "har-export",
265
- run: async () =>
266
- await runHarExportCommand([
267
- "target:1",
268
- "--include-bodies",
269
- "--method",
270
- "post",
271
- "--status",
272
- "201",
273
- "--limit",
274
- "10"
275
- ]),
276
- expectedTool: "browser.network.harExport",
277
- expectedArgs: {
278
- ...BASE_ARGS,
279
- targetId: "target:1",
280
- includeBodies: true,
281
- method: "POST",
282
- status: 201,
283
- limit: 10
284
- }
285
- },
286
- {
287
- name: "network-wait-for",
288
- run: async () =>
289
- await runNetworkWaitForCommand([
290
- "target:1",
291
- "/api/items",
292
- "--method",
293
- "post",
294
- "--status",
295
- "201",
296
- "--timeout-ms",
297
- "3000",
298
- "--poll-ms",
299
- "50"
300
- ]),
301
- expectedTool: "browser.network.waitFor",
302
- expectedArgs: {
303
- ...BASE_ARGS,
304
- targetId: "target:1",
305
- urlPattern: "/api/items",
306
- method: "POST",
307
- status: 201,
308
- timeoutMs: 3000,
309
- pollMs: 50
310
- }
311
- },
312
- {
313
- name: "cookie-get",
314
- run: async () => await runCookieGetCommand(["target:1", " sid "]),
315
- expectedTool: "browser.cookie.get",
316
- expectedArgs: {
317
- ...BASE_ARGS,
318
- targetId: "target:1",
319
- name: "sid"
320
- }
321
- },
322
- {
323
- name: "cookie-set",
324
- run: async () => await runCookieSetCommand(["target:1", "sid", "abc", " https://example.com "]),
325
- expectedTool: "browser.cookie.set",
326
- expectedArgs: {
327
- ...BASE_ARGS,
328
- targetId: "target:1",
329
- name: "sid",
330
- value: "abc",
331
- url: "https://example.com"
332
- }
333
- },
334
- {
335
- name: "cookie-clear",
336
- run: async () => await runCookieClearCommand(["target:1", " sid "]),
337
- expectedTool: "browser.cookie.clear",
338
- expectedArgs: {
339
- ...BASE_ARGS,
340
- targetId: "target:1",
341
- name: "sid"
342
- }
343
- },
344
- {
345
- name: "storage-get",
346
- run: async () => await runStorageGetCommand(["target:1", "local", "theme"]),
347
- expectedTool: "browser.storage.get",
348
- expectedArgs: {
349
- ...BASE_ARGS,
350
- targetId: "target:1",
351
- scope: "local",
352
- key: "theme"
353
- }
354
- },
355
- {
356
- name: "storage-set",
357
- run: async () => await runStorageSetCommand(["target:1", "session", "token", "abc"]),
358
- expectedTool: "browser.storage.set",
359
- expectedArgs: {
360
- ...BASE_ARGS,
361
- targetId: "target:1",
362
- scope: "session",
363
- key: "token",
364
- value: "abc"
365
- }
366
- },
367
- {
368
- name: "frame-list",
369
- run: async () => await runFrameListCommand(["target:1"]),
370
- expectedTool: "browser.frame.list",
371
- expectedArgs: {
372
- ...BASE_ARGS,
373
- targetId: "target:1"
374
- }
375
- },
376
- {
377
- name: "frame-snapshot",
378
- run: async () => await runFrameSnapshotCommand(["target:1", "frame:0"]),
379
- expectedTool: "browser.frame.snapshot",
380
- expectedArgs: {
381
- ...BASE_ARGS,
382
- targetId: "target:1",
383
- frameId: "frame:0"
384
- }
385
- },
386
- {
387
- name: "act",
388
- run: async () => await runActCommand(["click", "target:1"]),
389
- expectedTool: "browser.act",
390
- expectedArgs: {
391
- ...BASE_ARGS,
392
- targetId: "target:1",
393
- action: {
394
- type: "click"
395
- }
396
- }
397
- },
398
- {
399
- name: "upload-arm",
400
- run: async () => await runUploadArmCommand(["target:1", "a.txt", "b.txt"]),
401
- expectedTool: "browser.upload.arm",
402
- expectedArgs: {
403
- ...BASE_ARGS,
404
- targetId: "target:1",
405
- files: ["a.txt", "b.txt"]
406
- }
407
- },
408
- {
409
- name: "dialog-arm",
410
- run: async () => await runDialogArmCommand(["target:1"]),
411
- expectedTool: "browser.dialog.arm",
412
- expectedArgs: {
413
- ...BASE_ARGS,
414
- targetId: "target:1"
415
- }
416
- },
417
- {
418
- name: "download-trigger",
419
- run: async () => await runDownloadTriggerCommand(["target:1"]),
420
- expectedTool: "browser.download.trigger",
421
- expectedArgs: {
422
- ...BASE_ARGS,
423
- targetId: "target:1"
424
- }
425
- },
426
- {
427
- name: "download-wait",
428
- run: async () => await runDownloadWaitCommand(["target:1", "downloads/file.bin"]),
429
- expectedTool: "browser.download.wait",
430
- expectedArgs: {
431
- ...BASE_ARGS,
432
- targetId: "target:1",
433
- path: "downloads/file.bin"
434
- }
435
- },
436
- {
437
- name: "console-list",
438
- run: async () => await runConsoleListCommand(["target:1"]),
439
- expectedTool: "browser.console.list",
440
- expectedArgs: {
441
- ...BASE_ARGS,
442
- targetId: "target:1"
443
- }
444
- },
445
- {
446
- name: "response-body",
447
- run: async () => await runResponseBodyCommand(["target:1", "request:1"]),
448
- expectedTool: "browser.network.responseBody",
449
- expectedArgs: {
450
- ...BASE_ARGS,
451
- targetId: "target:1",
452
- requestId: "request:1"
453
- }
454
- },
455
- {
456
- name: "memory-status",
457
- run: async () => await runMemoryStatusCommand([]),
458
- expectedTool: "browser.memory.status",
459
- expectedArgs: {
460
- ...BASE_ARGS
461
- }
462
- },
463
- {
464
- name: "memory-resolve",
465
- run: async () => await runMemoryResolveCommand(["forum.example", "open_profile"]),
466
- expectedTool: "browser.memory.resolve",
467
- expectedArgs: {
468
- ...BASE_ARGS,
469
- domain: "forum.example",
470
- profileId: "default",
471
- intentKey: "open_profile"
472
- }
473
- },
474
- {
475
- name: "memory-upsert",
476
- run: async () =>
477
- await runMemoryUpsertCommand([
478
- "forum.example",
479
- "open_profile",
480
- "--signals-json",
481
- "[{\"kind\":\"urlPattern\",\"value\":\"/profile\"}]",
482
- "--confidence",
483
- "0.9",
484
- "--confirmed"
485
- ]),
486
- expectedTool: "browser.memory.upsert",
487
- expectedArgs: {
488
- ...BASE_ARGS,
489
- domain: "forum.example",
490
- profileId: "default",
491
- intentKey: "open_profile",
492
- signals: [{ kind: "urlPattern", value: "/profile" }],
493
- confidence: 0.9,
494
- confirmed: true
495
- }
496
- },
497
- {
498
- name: "memory-list",
499
- run: async () =>
500
- await runMemoryListCommand([
501
- "--domain",
502
- "forum.example",
503
- "--profile-id",
504
- "managed",
505
- "--intent-key",
506
- "open_profile"
507
- ]),
508
- expectedTool: "browser.memory.list",
509
- expectedArgs: {
510
- ...BASE_ARGS,
511
- domain: "forum.example",
512
- profileId: "managed",
513
- intentKey: "open_profile"
514
- }
515
- },
516
- {
517
- name: "memory-inspect",
518
- run: async () => await runMemoryInspectCommand(["memory:1"]),
519
- expectedTool: "browser.memory.inspect",
520
- expectedArgs: {
521
- ...BASE_ARGS,
522
- id: "memory:1"
523
- }
524
- },
525
- {
526
- name: "memory-delete",
527
- run: async () => await runMemoryDeleteCommand(["memory:1"]),
528
- expectedTool: "browser.memory.delete",
529
- expectedArgs: {
530
- ...BASE_ARGS,
531
- id: "memory:1"
532
- }
533
- },
534
- {
535
- name: "memory-purge",
536
- run: async () => await runMemoryPurgeCommand([]),
537
- expectedTool: "browser.memory.purge",
538
- expectedArgs: {
539
- ...BASE_ARGS
540
- }
541
- },
542
- {
543
- name: "memory-mode-set",
544
- run: async () => await runMemoryModeSetCommand(["ask"]),
545
- expectedTool: "browser.memory.mode.set",
546
- expectedArgs: {
547
- ...BASE_ARGS,
548
- mode: "ask"
549
- }
550
- },
551
- {
552
- name: "memory-ttl-set",
553
- run: async () => await runMemoryTtlSetCommand(["7"]),
554
- expectedTool: "browser.memory.ttl.set",
555
- expectedArgs: {
556
- ...BASE_ARGS,
557
- ttlDays: 7
558
- }
559
- },
560
- {
561
- name: "trace-get",
562
- run: async () => await runTraceGetCommand(["--limit", "20"]),
563
- expectedTool: "browser.trace.get",
564
- expectedArgs: {
565
- ...BASE_ARGS,
566
- limit: 20
567
- }
568
- }
569
- ];
570
-
571
- afterEach(() => {
572
- callDaemonToolMock.mockReset();
573
- delete process.env.BROWSERCTL_AUTH_TOKEN;
574
- delete process.env.BROWSERCTL_BROWSER;
575
- });
576
-
577
- describe("command wrappers", () => {
578
- it.each(CASES)("forwards $name to daemon tool", async ({ run, expectedTool, expectedArgs }) => {
579
- callDaemonToolMock.mockResolvedValue({ ok: true });
580
-
581
- await run();
582
-
583
- expect(callDaemonToolMock).toHaveBeenCalledTimes(1);
584
- expect(callDaemonToolMock).toHaveBeenCalledWith(expectedTool, expectedArgs);
585
- });
586
-
587
- it("forwards session/profile/token/browser context switches", async () => {
588
- callDaemonToolMock.mockResolvedValue({ ok: true });
589
-
590
- await runStatusCommand([
591
- "--session",
592
- "session:matrix",
593
- "--profile",
594
- "chrome-relay",
595
- "--token",
596
- "cli-token",
597
- "--browser",
598
- "edge"
599
- ]);
600
-
601
- expect(callDaemonToolMock).toHaveBeenCalledTimes(1);
602
- expect(callDaemonToolMock).toHaveBeenCalledWith("browser.status", {
603
- sessionId: "session:matrix",
604
- profile: "chrome-relay",
605
- authToken: "cli-token",
606
- [DAEMON_STARTUP_ARGUMENT]: {
607
- managedLocal: {
608
- browserName: "chromium",
609
- channel: "msedge"
610
- }
611
- }
612
- });
613
- });
614
-
615
- it("throws for upload-arm when files are missing", async () => {
616
- await expect(runUploadArmCommand(["target:1"]))
617
- .rejects.toThrow("Missing required argument: files.");
618
-
619
- expect(callDaemonToolMock).not.toHaveBeenCalled();
620
- });
621
-
622
- it.each([
623
- {
624
- name: "memory-resolve --profile-id",
625
- run: async () => await runMemoryResolveCommand(["forum.example", "open_profile", "--profile-id", "--bad"]),
626
- expectedMessage: "Missing value for --profile-id."
627
- },
628
- {
629
- name: "memory-list --domain",
630
- run: async () => await runMemoryListCommand(["--domain", "--bad"]),
631
- expectedMessage: "Missing value for --domain."
632
- },
633
- {
634
- name: "memory-list --profile-id",
635
- run: async () => await runMemoryListCommand(["--profile-id", "--bad"]),
636
- expectedMessage: "Missing value for --profile-id."
637
- },
638
- {
639
- name: "memory-list --intent-key",
640
- run: async () => await runMemoryListCommand(["--intent-key", "--bad"]),
641
- expectedMessage: "Missing value for --intent-key."
642
- },
643
- {
644
- name: "memory-upsert --profile-id",
645
- run: async () =>
646
- await runMemoryUpsertCommand([
647
- "forum.example",
648
- "open_profile",
649
- "--signals-json",
650
- "[]",
651
- "--profile-id",
652
- "--bad"
653
- ]),
654
- expectedMessage: "Missing value for --profile-id."
655
- },
656
- {
657
- name: "memory-upsert --signals-json",
658
- run: async () =>
659
- await runMemoryUpsertCommand(["forum.example", "open_profile", "--signals-json", "--bad"]),
660
- expectedMessage: "Missing value for --signals-json."
661
- }
662
- ])("rejects flag token as option value for $name", async ({ run, expectedMessage }) => {
663
- await expect(run()).rejects.toThrow(expectedMessage);
664
- expect(callDaemonToolMock).not.toHaveBeenCalled();
665
- });
666
-
667
- it("accepts ttlDays value 0", async () => {
668
- callDaemonToolMock.mockResolvedValue({ ok: true });
669
-
670
- await runMemoryTtlSetCommand(["0"]);
671
-
672
- expect(callDaemonToolMock).toHaveBeenCalledTimes(1);
673
- expect(callDaemonToolMock).toHaveBeenCalledWith("browser.memory.ttl.set", {
674
- ...BASE_ARGS,
675
- ttlDays: 0
676
- });
677
- });
678
-
679
- it.each(["1.9", "7days", "-1"])(
680
- "rejects non-strict non-negative integer ttlDays value: %s",
681
- async (ttlValue) => {
682
- await expect(runMemoryTtlSetCommand([ttlValue]))
683
- .rejects.toThrow("ttlDays must be a non-negative integer string.");
684
-
685
- expect(callDaemonToolMock).not.toHaveBeenCalled();
686
- }
687
- );
688
- });