paseo-plugin-zcode-provider 0.0.0-stage → 0.2.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 (141) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +29 -0
  3. package/README.md +112 -2
  4. package/client/account.tsx +827 -0
  5. package/client/diagnostics.tsx +379 -0
  6. package/client/runtime.tsx +296 -0
  7. package/client/settings.tsx +84 -0
  8. package/client/value.tsx +20 -0
  9. package/icon.svg +1 -0
  10. package/index.client.tsx +22 -0
  11. package/index.server.ts +39 -0
  12. package/package.json +77 -4
  13. package/paseo-plugin.json +6 -0
  14. package/server/account.ts +781 -0
  15. package/server/attachments.ts +150 -0
  16. package/server/build-info.ts +2 -0
  17. package/server/conversation.ts +319 -0
  18. package/server/diagnostics.ts +252 -0
  19. package/server/discovery/discover.ts +225 -0
  20. package/server/discovery/manifest.ts +36 -0
  21. package/server/discovery/types.ts +30 -0
  22. package/server/errors.ts +36 -0
  23. package/server/host/bridge.ts +490 -0
  24. package/server/host/schemas.ts +119 -0
  25. package/server/logger.ts +19 -0
  26. package/server/mapping.ts +270 -0
  27. package/server/models.ts +68 -0
  28. package/server/persistence.ts +146 -0
  29. package/server/presentation.ts +470 -0
  30. package/server/provider-status.ts +81 -0
  31. package/server/provider.ts +838 -0
  32. package/server/runtime/managed.ts +501 -0
  33. package/server/runtime/pins.ts +72 -0
  34. package/server/runtime-setup.ts +77 -0
  35. package/server/session-types.ts +49 -0
  36. package/server/session.ts +866 -0
  37. package/server/status.ts +89 -0
  38. package/server/timeline.ts +18 -0
  39. package/server/usage.ts +362 -0
  40. package/server/vendor/zcode/LICENSE +202 -0
  41. package/server/vendor/zcode/NOTICE.md +70 -0
  42. package/server/vendor/zcode/THIRD-PARTY-NOTICES.md +37 -0
  43. package/server/vendor/zcode/packages/model-option-map/src/compiler.ts +92 -0
  44. package/server/vendor/zcode/packages/model-option-map/src/evaluator.ts +214 -0
  45. package/server/vendor/zcode/packages/model-option-map/src/index.ts +5 -0
  46. package/server/vendor/zcode/packages/model-option-map/src/merge-patch.ts +97 -0
  47. package/server/vendor/zcode/packages/model-option-map/src/option-maps.ts +42 -0
  48. package/server/vendor/zcode/packages/model-option-map/src/parser.ts +240 -0
  49. package/server/vendor/zcode/packages/model-option-map/src/tokenizer.ts +141 -0
  50. package/server/vendor/zcode/packages/model-option-map/src/types.ts +36 -0
  51. package/server/vendor/zcode/packages/rpc/src/buffer.ts +88 -0
  52. package/server/vendor/zcode/packages/rpc/src/channelClient.ts +275 -0
  53. package/server/vendor/zcode/packages/rpc/src/channelServer.ts +283 -0
  54. package/server/vendor/zcode/packages/rpc/src/channels.shared.ts +66 -0
  55. package/server/vendor/zcode/packages/rpc/src/channels.ts +4 -0
  56. package/server/vendor/zcode/packages/rpc/src/delayedChannel.ts +17 -0
  57. package/server/vendor/zcode/packages/rpc/src/foundation.ts +260 -0
  58. package/server/vendor/zcode/packages/rpc/src/protocol.ts +397 -0
  59. package/server/vendor/zcode/packages/rpc/src/proxy-channel.ts +213 -0
  60. package/server/vendor/zcode/packages/rpc/src/serialization.ts +291 -0
  61. package/server/vendor/zcode/packages/shared/src/account-provider-state.ts +13 -0
  62. package/server/vendor/zcode/packages/shared/src/background-bash-output.ts +24 -0
  63. package/server/vendor/zcode/packages/shared/src/background-task-controls.ts +404 -0
  64. package/server/vendor/zcode/packages/shared/src/bash-output-display.ts +11 -0
  65. package/server/vendor/zcode/packages/shared/src/bots.ts +558 -0
  66. package/server/vendor/zcode/packages/shared/src/browser-use/backend.ts +80 -0
  67. package/server/vendor/zcode/packages/shared/src/browser-use/command-metadata.ts +170 -0
  68. package/server/vendor/zcode/packages/shared/src/browser-use/commands.ts +588 -0
  69. package/server/vendor/zcode/packages/shared/src/browser-use/result.ts +130 -0
  70. package/server/vendor/zcode/packages/shared/src/browser-use/snapshot.ts +77 -0
  71. package/server/vendor/zcode/packages/shared/src/command-types.ts +96 -0
  72. package/server/vendor/zcode/packages/shared/src/config-schema.ts +8 -0
  73. package/server/vendor/zcode/packages/shared/src/cuaAccessibilitySettings.ts +41 -0
  74. package/server/vendor/zcode/packages/shared/src/database-startup.ts +178 -0
  75. package/server/vendor/zcode/packages/shared/src/env.ts +63 -0
  76. package/server/vendor/zcode/packages/shared/src/execution-output-preview.ts +14 -0
  77. package/server/vendor/zcode/packages/shared/src/localTtft.ts +192 -0
  78. package/server/vendor/zcode/packages/shared/src/model-config.ts +123 -0
  79. package/server/vendor/zcode/packages/shared/src/model-execution.ts +23 -0
  80. package/server/vendor/zcode/packages/shared/src/model-provider-family.ts +171 -0
  81. package/server/vendor/zcode/packages/shared/src/model-provider-types.ts +81 -0
  82. package/server/vendor/zcode/packages/shared/src/model-selection.ts +60 -0
  83. package/server/vendor/zcode/packages/shared/src/oauth.ts +203 -0
  84. package/server/vendor/zcode/packages/shared/src/official-mcp-auth.ts +272 -0
  85. package/server/vendor/zcode/packages/shared/src/official-mcp-tool-error.ts +68 -0
  86. package/server/vendor/zcode/packages/shared/src/process-diagnostic.ts +42 -0
  87. package/server/vendor/zcode/packages/shared/src/protocol.ts +369 -0
  88. package/server/vendor/zcode/packages/shared/src/provider-family-connection-selection.ts +32 -0
  89. package/server/vendor/zcode/packages/shared/src/remoteAssetInstallMode.ts +11 -0
  90. package/server/vendor/zcode/packages/shared/src/remoteResourcePackages.ts +91 -0
  91. package/server/vendor/zcode/packages/shared/src/runtimeEnv.ts +315 -0
  92. package/server/vendor/zcode/packages/shared/src/settings-source.ts +10 -0
  93. package/server/vendor/zcode/packages/shared/src/usage-quota.ts +74 -0
  94. package/server/vendor/zcode/packages/shared/src/usage-stats.ts +462 -0
  95. package/server/vendor/zcode/packages/shared/src/validationAppSettings.ts +562 -0
  96. package/server/vendor/zcode/packages/shared/src/workspacePurpose.ts +2 -0
  97. package/server/vendor/zcode/packages/shared/src/wslUserValidation.ts +33 -0
  98. package/server/vendor/zcode/packages/shared/src/zcode-agent-policy.ts +25 -0
  99. package/server/vendor/zcode/packages/shared/src/zcode-media-policy.ts +10 -0
  100. package/server/vendor/zcode/packages/shared/src/zcode-protocol/index.ts +3720 -0
  101. package/server/vendor/zcode/packages/shared/src/zcode-protocol-legacy-types.ts +529 -0
  102. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/apply.ts +218 -0
  103. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/attachment-ref.ts +14 -0
  104. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/command.ts +482 -0
  105. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/core.ts +100 -0
  106. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/create-workflow-display.ts +156 -0
  107. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/cuaPermission.ts +41 -0
  108. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/delta.ts +147 -0
  109. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/input-intent.ts +69 -0
  110. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/rows.ts +432 -0
  111. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/session-config.ts +43 -0
  112. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index-workflow-activity.ts +195 -0
  113. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/sessions-index.ts +85 -0
  114. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-import.ts +38 -0
  115. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/shared-context-ref.ts +10 -0
  116. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/snapshot.ts +509 -0
  117. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/submission.ts +5 -0
  118. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/toolDisplay.ts +264 -0
  119. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/transport.ts +1152 -0
  120. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-assembler.ts +574 -0
  121. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-binary.ts +65 -0
  122. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-codec.ts +240 -0
  123. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire-fault.ts +39 -0
  124. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/wire.ts +159 -0
  125. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-artifacts.ts +291 -0
  126. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-observation-display.ts +281 -0
  127. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-row-meta.ts +163 -0
  128. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-run-settings-command.ts +62 -0
  129. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs-delta.ts +517 -0
  130. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workflow-runs.ts +512 -0
  131. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-config.ts +81 -0
  132. package/server/vendor/zcode/packages/shared/src/zcode-protocol-v4/workspace-hook-review.ts +210 -0
  133. package/server/vendor/zcode/packages/shared/src/zcode-task-mode-schema.ts +6 -0
  134. package/server/vendor/zcode/packages/shared/src/zcode-task-types-core.ts +1187 -0
  135. package/server/vendor/zcode/packages/shared/src/zcodeEndpoint.ts +296 -0
  136. package/server/vendor/zcode/provenance.json +405 -0
  137. package/shared/account.ts +201 -0
  138. package/shared/diagnostics.ts +52 -0
  139. package/shared/runtime-setup.ts +73 -0
  140. package/vendor/acp-registry/LICENSE +176 -0
  141. package/vendor/paseo/LICENSE +211 -0
@@ -0,0 +1,588 @@
1
+ /* eslint-disable max-lines -- BrowserCommand 的 Zod discriminated union 必须保持单一运行时事实源,拆分会让协议方法与 schema 漂移。 */
2
+ import { z } from "zod";
3
+ import { browserViewportInputSchema } from "./command-metadata.js";
4
+
5
+ export {
6
+ browserClientModeSchema,
7
+ browserCommandContextSchema,
8
+ browserCommandMethodSchema,
9
+ browserErrorCodeSchema,
10
+ browserPageStateSchema,
11
+ } from "./command-metadata.js";
12
+ export type {
13
+ BrowserClientMode,
14
+ BrowserCommandContext,
15
+ BrowserCommandMethod,
16
+ BrowserErrorCode,
17
+ BrowserPageState,
18
+ } from "./command-metadata.js";
19
+
20
+ export const browserMouseButtonSchema = z.enum(["left", "right", "middle"]);
21
+ export type BrowserMouseButton = z.infer<typeof browserMouseButtonSchema>;
22
+
23
+ /** 键盘修饰键;CDP dispatchMouse/KeyEvent 的 modifiers 位掩码由 executor 映射。 */
24
+ export const browserKeyModifierSchema = z.enum([
25
+ "Alt",
26
+ "Control",
27
+ "ControlOrMeta",
28
+ "Meta",
29
+ "Shift",
30
+ ]);
31
+ export type BrowserKeyModifier = z.infer<typeof browserKeyModifierSchema>;
32
+
33
+ /** 视口坐标点(cua 坐标路 / elementInfo / drag 用;与 CDP Input 同坐标系)。 */
34
+ export const browserPointSchema = z.object({ x: z.number(), y: z.number() }).strict();
35
+ export type BrowserPoint = z.infer<typeof browserPointSchema>;
36
+
37
+ const browserRecordingDurationSchema = z.number().int().nonnegative().max(90_000);
38
+ const browserRecordingSelectorSchema = z.string().trim().min(1).max(2_000);
39
+
40
+ /** 内置 WebView 录制只接受受限动作 DSL;不能借录制入口执行任意页面脚本。 */
41
+ export const browserRecordingActionSchema = z.discriminatedUnion("type", [
42
+ z.object({ type: z.literal("wait"), durationMs: browserRecordingDurationSchema }).strict(),
43
+ z
44
+ .object({
45
+ type: z.literal("click"),
46
+ selector: browserRecordingSelectorSchema.optional(),
47
+ x: z.number().optional(),
48
+ y: z.number().optional(),
49
+ button: browserMouseButtonSchema.optional(),
50
+ doubleClick: z.boolean().optional(),
51
+ delayAfterMs: browserRecordingDurationSchema.optional(),
52
+ })
53
+ .strict(),
54
+ z
55
+ .object({
56
+ type: z.literal("type"),
57
+ selector: browserRecordingSelectorSchema,
58
+ text: z.string().max(100_000),
59
+ delayAfterMs: browserRecordingDurationSchema.optional(),
60
+ })
61
+ .strict(),
62
+ z
63
+ .object({
64
+ type: z.literal("hover"),
65
+ selector: browserRecordingSelectorSchema.optional(),
66
+ x: z.number().optional(),
67
+ y: z.number().optional(),
68
+ durationMs: browserRecordingDurationSchema.optional(),
69
+ delayAfterMs: browserRecordingDurationSchema.optional(),
70
+ })
71
+ .strict(),
72
+ z
73
+ .object({
74
+ type: z.literal("move"),
75
+ x: z.number(),
76
+ y: z.number(),
77
+ durationMs: browserRecordingDurationSchema.optional(),
78
+ delayAfterMs: browserRecordingDurationSchema.optional(),
79
+ })
80
+ .strict(),
81
+ z
82
+ .object({
83
+ type: z.literal("scroll"),
84
+ deltaX: z.number().optional(),
85
+ deltaY: z.number(),
86
+ durationMs: browserRecordingDurationSchema.optional(),
87
+ delayAfterMs: browserRecordingDurationSchema.optional(),
88
+ })
89
+ .strict(),
90
+ z
91
+ .object({
92
+ type: z.literal("scrollTo"),
93
+ selector: browserRecordingSelectorSchema.optional(),
94
+ x: z.number().optional(),
95
+ y: z.number().optional(),
96
+ durationMs: browserRecordingDurationSchema.optional(),
97
+ delayAfterMs: browserRecordingDurationSchema.optional(),
98
+ })
99
+ .strict(),
100
+ z
101
+ .object({
102
+ type: z.literal("wheel"),
103
+ deltaX: z.number().optional(),
104
+ deltaY: z.number(),
105
+ times: z.number().int().min(1).max(100).optional(),
106
+ intervalMs: browserRecordingDurationSchema.optional(),
107
+ delayAfterMs: browserRecordingDurationSchema.optional(),
108
+ })
109
+ .strict(),
110
+ z
111
+ .object({
112
+ type: z.literal("drag"),
113
+ path: z.array(browserPointSchema).min(2).max(200),
114
+ durationMs: browserRecordingDurationSchema.optional(),
115
+ delayAfterMs: browserRecordingDurationSchema.optional(),
116
+ })
117
+ .strict(),
118
+ z
119
+ .object({
120
+ type: z.literal("waitFor"),
121
+ selector: browserRecordingSelectorSchema,
122
+ state: z.enum(["attached", "detached", "visible", "hidden"]).optional(),
123
+ timeoutMs: z.number().int().positive().max(30_000).optional(),
124
+ delayAfterMs: browserRecordingDurationSchema.optional(),
125
+ })
126
+ .strict(),
127
+ ]);
128
+ export type BrowserRecordingAction = z.infer<typeof browserRecordingActionSchema>;
129
+
130
+ export const browserRecordingOptionsSchema = z
131
+ .object({
132
+ viewport: browserViewportInputSchema.optional(),
133
+ fps: z.number().int().min(1).max(60).optional(),
134
+ jpegQuality: z.number().int().min(1).max(100).optional(),
135
+ maxDurationMs: z.number().int().min(1_000).max(90_000).optional(),
136
+ settleMs: browserRecordingDurationSchema.optional(),
137
+ showCursor: z.boolean().optional(),
138
+ actions: z.array(browserRecordingActionSchema).max(500).optional(),
139
+ })
140
+ .strict();
141
+ export type BrowserRecordingOptions = z.infer<typeof browserRecordingOptionsSchema>;
142
+
143
+ const browserRecordingOutputPathSchema = z
144
+ .string()
145
+ .trim()
146
+ .min(1)
147
+ .max(2_000)
148
+ .refine((value) => !/^[/\\]/u.test(value) && !/^[A-Za-z]:[/\\]/u.test(value), {
149
+ message: "recording outputPath must be relative to the workspace",
150
+ })
151
+ .refine(
152
+ (value) =>
153
+ !value
154
+ .split(/[\\/]+/u)
155
+ .some((segment) => segment === ".." || segment === "." || segment.length === 0),
156
+ { message: "recording outputPath cannot escape the workspace" },
157
+ )
158
+ .refine((value) => value.toLowerCase().endsWith(".webm"), {
159
+ message: "recording outputPath must end with .webm",
160
+ });
161
+
162
+ /** Playwright locator 的可跨进程终结操作。builder 本身只在 agent 内组合 selector。 */
163
+ export const browserPlaywrightLocatorOperationSchema = z.enum([
164
+ "allTextContents",
165
+ "click",
166
+ "count",
167
+ "dblclick",
168
+ "downloadMedia",
169
+ "evaluate",
170
+ "fill",
171
+ "getAttribute",
172
+ "innerText",
173
+ "isEnabled",
174
+ "isVisible",
175
+ "press",
176
+ "selectOption",
177
+ "setChecked",
178
+ "textContent",
179
+ "waitFor",
180
+ ]);
181
+ export type BrowserPlaywrightLocatorOperation = z.infer<
182
+ typeof browserPlaywrightLocatorOperationSchema
183
+ >;
184
+
185
+ export const browserPlaywrightModifierSchema = z.enum([
186
+ "Alt",
187
+ "Control",
188
+ "ControlOrMeta",
189
+ "Meta",
190
+ "Shift",
191
+ ]);
192
+ export type BrowserPlaywrightModifier = z.infer<typeof browserPlaywrightModifierSchema>;
193
+
194
+ const browserPlaywrightTimeoutSchema = z.number().int().positive().optional();
195
+ const browserPlaywrightSelectOptionSchema = z
196
+ .object({
197
+ value: z.string().optional(),
198
+ label: z.string().optional(),
199
+ index: z.number().int().nonnegative().optional(),
200
+ })
201
+ .strict()
202
+ .refine(
203
+ (selection) =>
204
+ selection.value !== undefined ||
205
+ selection.label !== undefined ||
206
+ selection.index !== undefined,
207
+ "Select option requires value, label, or index",
208
+ );
209
+
210
+ /**
211
+ * Playwright 公共操作使用与 backend 无关的消息结构,以 `name` 和 `operation` 区分动作,
212
+ * 便于 extension/CDP adapter 复用同一契约。
213
+ */
214
+ export const browserPlaywrightActionSchema = z.discriminatedUnion("name", [
215
+ z.object({ name: z.literal("domSnapshot") }).strict(),
216
+ z
217
+ .object({
218
+ name: z.literal("elementInfo"),
219
+ x: z.number(),
220
+ y: z.number(),
221
+ includeNonInteractable: z.boolean().optional(),
222
+ })
223
+ .strict(),
224
+ z
225
+ .object({
226
+ name: z.literal("elementScreenshot"),
227
+ x: z.number(),
228
+ y: z.number(),
229
+ includeNonInteractable: z.boolean().optional(),
230
+ })
231
+ .strict(),
232
+ z
233
+ .object({
234
+ name: z.literal("evaluate"),
235
+ expression: z.string().min(1),
236
+ expressionKind: z.enum(["string", "function"]),
237
+ arg: z.unknown().optional(),
238
+ timeoutMs: browserPlaywrightTimeoutSchema,
239
+ })
240
+ .strict(),
241
+ z
242
+ .object({
243
+ name: z.literal("waitForLoadState"),
244
+ state: z.enum(["load", "domcontentloaded", "networkidle"]).optional(),
245
+ timeoutMs: browserPlaywrightTimeoutSchema,
246
+ })
247
+ .strict(),
248
+ z
249
+ .object({
250
+ name: z.literal("waitForURL"),
251
+ url: z.string().min(1),
252
+ waitUntil: z.enum(["load", "domcontentloaded", "networkidle", "commit"]).optional(),
253
+ timeoutMs: browserPlaywrightTimeoutSchema,
254
+ })
255
+ .strict(),
256
+ z
257
+ .object({
258
+ name: z.literal("waitForEvent"),
259
+ event: z.enum(["download", "filechooser"]),
260
+ timeoutMs: browserPlaywrightTimeoutSchema,
261
+ })
262
+ .strict(),
263
+ z
264
+ .object({
265
+ name: z.literal("downloadPath"),
266
+ downloadId: z.string().min(1),
267
+ timeoutMs: browserPlaywrightTimeoutSchema,
268
+ })
269
+ .strict(),
270
+ z
271
+ .object({
272
+ name: z.literal("fileChooserSetFiles"),
273
+ fileChooserId: z.string().min(1),
274
+ files: z.array(z.string()).min(1),
275
+ timeoutMs: browserPlaywrightTimeoutSchema,
276
+ })
277
+ .strict(),
278
+ z
279
+ .object({
280
+ name: z.literal("locator"),
281
+ selector: z.string().min(1),
282
+ operation: browserPlaywrightLocatorOperationSchema,
283
+ value: z.unknown().optional(),
284
+ arg: z.unknown().optional(),
285
+ expression: z.string().min(1).optional(),
286
+ expressionKind: z.enum(["string", "function"]).optional(),
287
+ attribute: z.string().min(1).optional(),
288
+ checked: z.boolean().optional(),
289
+ replace: z.boolean().optional(),
290
+ force: z.boolean().optional(),
291
+ button: browserMouseButtonSchema.optional(),
292
+ modifiers: z.array(browserPlaywrightModifierSchema).optional(),
293
+ state: z.enum(["attached", "detached", "visible", "hidden"]).optional(),
294
+ selections: z.array(browserPlaywrightSelectOptionSchema).min(1).optional(),
295
+ timeoutMs: browserPlaywrightTimeoutSchema,
296
+ })
297
+ .strict(),
298
+ ]);
299
+ export type BrowserPlaywrightAction = z.infer<typeof browserPlaywrightActionSchema>;
300
+
301
+ /**
302
+ * 统一命令面:后端只认这一个判别联合类型。
303
+ *
304
+ * tabId(可选):agent 对象模型用于寻址指定受控 tab(含 human 开的 tab)。缺省表示作用于
305
+ * 该会话默认 view。manager 侧以 `command.tabId ?? key` 解析为受控 view 的 key。
306
+ */
307
+ export const browserCommandSchema = z.discriminatedUnion("method", [
308
+ z
309
+ .object({
310
+ method: z.literal("navigate"),
311
+ url: z.string().min(1),
312
+ tabId: z.string().optional(),
313
+ })
314
+ .strict(),
315
+ z.object({ method: z.literal("back"), tabId: z.string().optional() }).strict(),
316
+ z.object({ method: z.literal("forward"), tabId: z.string().optional() }).strict(),
317
+ z.object({ method: z.literal("reload"), tabId: z.string().optional() }).strict(),
318
+ z
319
+ .object({
320
+ method: z.literal("snapshot"),
321
+ maxElements: z.number().int().positive().optional(),
322
+ includeHidden: z.boolean().optional(),
323
+ tabId: z.string().optional(),
324
+ })
325
+ .strict(),
326
+ z
327
+ .object({
328
+ method: z.literal("click"),
329
+ // ref(快照句柄)与坐标 (x,y) 二选一:ref 走 dom_cua 式定位,(x,y) 走 cua 视觉坐标定位。
330
+ ref: z.string().min(1).optional(),
331
+ x: z.number().optional(),
332
+ y: z.number().optional(),
333
+ button: browserMouseButtonSchema.optional(),
334
+ doubleClick: z.boolean().optional(),
335
+ modifiers: z.array(browserKeyModifierSchema).optional(),
336
+ tabId: z.string().optional(),
337
+ })
338
+ .strict(),
339
+ z
340
+ .object({
341
+ method: z.literal("fill"),
342
+ ref: z.string().min(1),
343
+ value: z.string(),
344
+ tabId: z.string().optional(),
345
+ })
346
+ .strict(),
347
+ z
348
+ .object({
349
+ method: z.literal("type"),
350
+ ref: z.string().min(1).optional(),
351
+ text: z.string(),
352
+ tabId: z.string().optional(),
353
+ })
354
+ .strict(),
355
+ z
356
+ .object({
357
+ method: z.literal("press"),
358
+ key: z.string().min(1),
359
+ ref: z.string().min(1).optional(),
360
+ modifiers: z.array(browserKeyModifierSchema).optional(),
361
+ tabId: z.string().optional(),
362
+ })
363
+ .strict(),
364
+ // CUA 组合键输入:keys 是一个组合键,必须保留逐键 down/up 顺序,不能压成末键 + bitmask。
365
+ z
366
+ .object({
367
+ method: z.literal("cuaKeypress"),
368
+ keys: z.array(z.string().min(1)).min(1),
369
+ tabId: z.string().optional(),
370
+ })
371
+ .strict(),
372
+ z
373
+ .object({
374
+ method: z.literal("scroll"),
375
+ ref: z.string().min(1).optional(),
376
+ x: z.number().optional(),
377
+ y: z.number().optional(),
378
+ tabId: z.string().optional(),
379
+ })
380
+ .strict(),
381
+ // CUA 滚动输入:视口锚点与滚动 delta 是两组不同坐标,且可携带 modifier。
382
+ z
383
+ .object({
384
+ method: z.literal("cuaScroll"),
385
+ x: z.number(),
386
+ y: z.number(),
387
+ scrollX: z.number(),
388
+ scrollY: z.number(),
389
+ modifiers: z.array(browserKeyModifierSchema).optional(),
390
+ tabId: z.string().optional(),
391
+ })
392
+ .strict(),
393
+ // DOM CUA 滚动输入:nodeId 缺省时从视口中心滚动;存在时从该节点中心滚动。
394
+ z
395
+ .object({
396
+ method: z.literal("domCuaScroll"),
397
+ nodeId: z.string().min(1).optional(),
398
+ scrollX: z.number(),
399
+ scrollY: z.number(),
400
+ tabId: z.string().optional(),
401
+ })
402
+ .strict(),
403
+ z
404
+ .object({
405
+ method: z.literal("screenshot"),
406
+ ref: z.string().min(1).optional(),
407
+ fullPage: z.boolean().optional(),
408
+ // 区域截图:CDP Page.captureScreenshot 的 clip(视口 CSS px)。与 fullPage 互斥。
409
+ clip: z
410
+ .object({
411
+ x: z.number(),
412
+ y: z.number(),
413
+ width: z.number().positive(),
414
+ height: z.number().positive(),
415
+ })
416
+ .strict()
417
+ .optional(),
418
+ tabId: z.string().optional(),
419
+ })
420
+ .strict(),
421
+ z.object({ method: z.literal("getState"), tabId: z.string().optional() }).strict(),
422
+ // hover:移动鼠标到元素(ref)或坐标(x,y),触发 hover 态(cua move / dom_cua 定位后 move)。
423
+ z
424
+ .object({
425
+ method: z.literal("hover"),
426
+ ref: z.string().min(1).optional(),
427
+ x: z.number().optional(),
428
+ y: z.number().optional(),
429
+ modifiers: z.array(browserKeyModifierSchema).optional(),
430
+ tabId: z.string().optional(),
431
+ })
432
+ .strict(),
433
+ // select:对 <select> 选择一个或多个 option(按 value 或可见文本匹配)。
434
+ z
435
+ .object({
436
+ method: z.literal("select"),
437
+ ref: z.string().min(1),
438
+ values: z.array(z.string()).min(1),
439
+ tabId: z.string().optional(),
440
+ })
441
+ .strict(),
442
+ // check:设置 checkbox/radio 勾选态(checked 缺省为 true)。
443
+ z
444
+ .object({
445
+ method: z.literal("check"),
446
+ ref: z.string().min(1),
447
+ checked: z.boolean().optional(),
448
+ tabId: z.string().optional(),
449
+ })
450
+ .strict(),
451
+ // drag:从 起点(fromRef 或 from{x,y}) 拖到 终点(toRef 或 to{x,y}),走 CDP Input 合成鼠标拖拽。
452
+ z
453
+ .object({
454
+ method: z.literal("drag"),
455
+ fromRef: z.string().min(1).optional(),
456
+ toRef: z.string().min(1).optional(),
457
+ from: browserPointSchema.optional(),
458
+ to: browserPointSchema.optional(),
459
+ modifiers: z.array(browserKeyModifierSchema).optional(),
460
+ tabId: z.string().optional(),
461
+ })
462
+ .strict(),
463
+ // CUA drag 输入:完整 path 是公共合同,backend 必须逐点发送而不是只取首尾。
464
+ z
465
+ .object({
466
+ method: z.literal("cuaDrag"),
467
+ path: z.array(browserPointSchema).min(1),
468
+ modifiers: z.array(browserKeyModifierSchema).optional(),
469
+ tabId: z.string().optional(),
470
+ })
471
+ .strict(),
472
+ // elementInfo:给视口坐标 (x,y),反查该点命中元素的信息(role/name/rect/selector),打通视觉↔结构。
473
+ z
474
+ .object({
475
+ method: z.literal("elementInfo"),
476
+ x: z.number(),
477
+ y: z.number(),
478
+ tabId: z.string().optional(),
479
+ })
480
+ .strict(),
481
+ // evaluate:在页面作用域执行 JS 表达式,返回可 JSON 序列化的结果。
482
+ z
483
+ .object({
484
+ method: z.literal("evaluate"),
485
+ expression: z.string().min(1),
486
+ tabId: z.string().optional(),
487
+ })
488
+ .strict(),
489
+ // getDialog:读取当前 JS 弹窗(alert/confirm/prompt/beforeunload)信息,无则返回 dialog=null。
490
+ z.object({ method: z.literal("getDialog"), tabId: z.string().optional() }).strict(),
491
+ // handleDialog:接受/取消当前 JS 弹窗;prompt 可带 promptText。
492
+ z
493
+ .object({
494
+ method: z.literal("handleDialog"),
495
+ accept: z.boolean(),
496
+ promptText: z.string().optional(),
497
+ tabId: z.string().optional(),
498
+ })
499
+ .strict(),
500
+ z
501
+ .object({
502
+ method: z.literal("waitFor"),
503
+ selector: z.string().min(1).optional(),
504
+ text: z.string().min(1).optional(),
505
+ textGone: z.string().min(1).optional(),
506
+ timeoutMs: z.number().int().positive().optional(),
507
+ tabId: z.string().optional(),
508
+ })
509
+ .strict(),
510
+ // PlaywrightAPI.waitForTimeout:固定等待只接受非负整数,0 表示让出一次 timer tick。
511
+ z
512
+ .object({
513
+ method: z.literal("playwrightWaitForTimeout"),
514
+ timeoutMs: z.number().int().nonnegative(),
515
+ tabId: z.string().optional(),
516
+ })
517
+ .strict(),
518
+ z
519
+ .object({
520
+ method: z.literal("playwright"),
521
+ action: browserPlaywrightActionSchema,
522
+ tabId: z.string().optional(),
523
+ })
524
+ .strict(),
525
+ z.object({ method: z.literal("capabilities"), tabId: z.string().optional() }).strict(),
526
+ z.object({ method: z.literal("browserVisibilityGet") }).strict(),
527
+ z.object({ method: z.literal("browserVisibilitySet"), visible: z.boolean() }).strict(),
528
+ browserViewportInputSchema
529
+ .extend({
530
+ method: z.literal("browserViewportSet"),
531
+ tabId: z.string().optional(),
532
+ })
533
+ .strict(),
534
+ z.object({ method: z.literal("browserViewportReset"), tabId: z.string().optional() }).strict(),
535
+ z
536
+ .object({
537
+ method: z.literal("recordingStart"),
538
+ options: browserRecordingOptionsSchema.optional(),
539
+ tabId: z.string().optional(),
540
+ })
541
+ .strict(),
542
+ z
543
+ .object({
544
+ method: z.literal("recordingStatus"),
545
+ recordingId: z.string().trim().min(1),
546
+ outputPath: browserRecordingOutputPathSchema.optional(),
547
+ tabId: z.string().optional(),
548
+ })
549
+ .strict(),
550
+ z
551
+ .object({
552
+ method: z.literal("recordingCancel"),
553
+ recordingId: z.string().trim().min(1),
554
+ tabId: z.string().optional(),
555
+ })
556
+ .strict(),
557
+ // tabs.get(id) 的 backend 激活步骤:校验并更新该 scope selected tab;renderer 决定前台展示或后台记录。
558
+ z.object({ method: z.literal("activateTab"), tabId: z.string().min(1) }).strict(),
559
+ z.object({ method: z.literal("newTab") }).strict(),
560
+ z.object({ method: z.literal("listUserTabs") }).strict(),
561
+ z.object({ method: z.literal("claimTab"), tabId: z.string().min(1) }).strict(),
562
+ z
563
+ .object({
564
+ method: z.literal("finalizeTabs"),
565
+ keep: z.array(
566
+ z.object({ tabId: z.string().min(1), status: z.enum(["handoff", "deliverable"]) }).strict(),
567
+ ),
568
+ })
569
+ .strict(),
570
+ z.object({ method: z.literal("markDeliverable"), tabId: z.string().min(1) }).strict(),
571
+ z.object({ method: z.literal("markHandoff"), tabId: z.string().min(1) }).strict(),
572
+ z.object({ method: z.literal("nameSession"), name: z.string().trim().min(1) }).strict(),
573
+ z
574
+ .object({
575
+ method: z.literal("finalize"),
576
+ tabId: z.string().optional(),
577
+ deliverable: z.boolean().optional(),
578
+ })
579
+ .strict(),
580
+ z.object({ method: z.literal("turnEnded"), turnId: z.string().min(1).optional() }).strict(),
581
+ z.object({ method: z.literal("closeSession") }).strict(),
582
+ z.object({ method: z.literal("cancelRequest"), requestId: z.string().min(1) }).strict(),
583
+ // close:关闭指定受控 tab(tabId 缺省=当前 tab)。manager 层处理:detach + 通知 renderer 卸载 webview。
584
+ z.object({ method: z.literal("close"), tabId: z.string().optional() }).strict(),
585
+ // list:枚举当前会话窗口下所有受控 tab 摘要。manager 层拦截处理,返回 result.tabs。
586
+ z.object({ method: z.literal("list") }).strict(),
587
+ ]);
588
+ export type BrowserCommand = z.infer<typeof browserCommandSchema>;