@midscene/test 1.12.6-beta-20260910093036.0 → 1.12.6

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 (44) hide show
  1. package/dist/es/1~891.mjs +19 -39
  2. package/dist/es/1~891.mjs.map +1 -1
  3. package/dist/es/cli/index.mjs +26 -44
  4. package/dist/es/cli/index.mjs.map +1 -1
  5. package/dist/es/index.mjs +0 -3
  6. package/dist/es/index.mjs.map +1 -1
  7. package/dist/es/midscene/index.mjs +43 -32
  8. package/dist/es/midscene/index.mjs.map +1 -1
  9. package/dist/es/test-cli.mjs +37 -49
  10. package/dist/es/test-cli.mjs.map +1 -1
  11. package/dist/lib/0~458.js +19 -39
  12. package/dist/lib/0~458.js.map +1 -1
  13. package/dist/lib/cli/index.js +26 -44
  14. package/dist/lib/cli/index.js.map +1 -1
  15. package/dist/lib/index.js +0 -3
  16. package/dist/lib/index.js.map +1 -1
  17. package/dist/lib/midscene/index.js +253 -262
  18. package/dist/lib/midscene/index.js.map +1 -1
  19. package/dist/lib/test-cli.js +37 -49
  20. package/dist/lib/test-cli.js.map +1 -1
  21. package/dist/types/cli/index.d.ts +12 -13
  22. package/dist/types/index.d.ts +1 -7
  23. package/dist/types/midscene/index.d.ts +21 -21
  24. package/package.json +8 -48
  25. package/dist/es/android/index.mjs +0 -182
  26. package/dist/es/android/index.mjs.map +0 -1
  27. package/dist/es/harmony/index.mjs +0 -182
  28. package/dist/es/harmony/index.mjs.map +0 -1
  29. package/dist/es/ios/index.mjs +0 -182
  30. package/dist/es/ios/index.mjs.map +0 -1
  31. package/dist/es/playwright/index.mjs +0 -366
  32. package/dist/es/playwright/index.mjs.map +0 -1
  33. package/dist/lib/android/index.js +0 -255
  34. package/dist/lib/android/index.js.map +0 -1
  35. package/dist/lib/harmony/index.js +0 -252
  36. package/dist/lib/harmony/index.js.map +0 -1
  37. package/dist/lib/ios/index.js +0 -255
  38. package/dist/lib/ios/index.js.map +0 -1
  39. package/dist/lib/playwright/index.js +0 -412
  40. package/dist/lib/playwright/index.js.map +0 -1
  41. package/dist/types/android/index.d.ts +0 -140
  42. package/dist/types/harmony/index.d.ts +0 -137
  43. package/dist/types/ios/index.d.ts +0 -143
  44. package/dist/types/playwright/index.d.ts +0 -229
@@ -1,366 +0,0 @@
1
- import { z } from "zod/v4";
2
- import { readFile } from "node:fs/promises";
3
- import { resolve } from "node:path";
4
- function _define_property(obj, key, value) {
5
- if (key in obj) Object.defineProperty(obj, key, {
6
- value: value,
7
- enumerable: true,
8
- configurable: true,
9
- writable: true
10
- });
11
- else obj[key] = value;
12
- return obj;
13
- }
14
- class WorkflowError extends Error {
15
- toJSON() {
16
- return {
17
- name: this.name,
18
- message: this.message,
19
- code: this.code,
20
- ...void 0 === this.details ? {} : {
21
- details: this.details
22
- }
23
- };
24
- }
25
- constructor(message, options = {}){
26
- super(message, {
27
- cause: options.cause
28
- }), _define_property(this, "code", void 0), _define_property(this, "details", void 0);
29
- this.name = new.target.name;
30
- this.code = options.code ?? 'WORKFLOW_ERROR';
31
- this.details = options.details;
32
- }
33
- }
34
- class NodeDefinitionError extends WorkflowError {
35
- constructor(message, details){
36
- super(message, {
37
- code: 'NODE_DEFINITION_ERROR',
38
- details
39
- });
40
- }
41
- }
42
- const validateOptionalText = (value, field, node)=>{
43
- if (void 0 !== value && ('string' != typeof value || 0 === value.trim().length)) throw new NodeDefinitionError(`Node "${node}" ${field} must be a non-empty string.`, {
44
- node,
45
- field
46
- });
47
- };
48
- const validateInputSchema = (schema, node)=>{
49
- if (void 0 === schema) return;
50
- if (!(schema instanceof z.ZodObject)) throw new NodeDefinitionError(`Node "${node}" inputSchema must be a Zod object schema.`, {
51
- node,
52
- field: 'inputSchema'
53
- });
54
- if ('$' in schema.shape) throw new NodeDefinitionError(`Node "${node}" inputSchema must not declare "$" as an input property.`, {
55
- node,
56
- field: 'inputSchema.$'
57
- });
58
- };
59
- const validateDefinition = (options)=>{
60
- if (!options || 'object' != typeof options) throw new NodeDefinitionError('Node definition must be an object.');
61
- if ('string' != typeof options.name || 0 === options.name.trim().length) throw new NodeDefinitionError('Node name must be a non-empty string.');
62
- validateOptionalText(options.title, 'title', options.name);
63
- validateOptionalText(options.description, "description", options.name);
64
- if (void 0 !== options.stringInputKey && false !== options.stringInputKey && ('string' != typeof options.stringInputKey || 0 === options.stringInputKey.trim().length)) throw new NodeDefinitionError(`Node "${options.name}" stringInputKey must be a non-empty string or false.`, {
65
- node: options.name,
66
- field: 'stringInputKey'
67
- });
68
- validateInputSchema(options.inputSchema, options.name);
69
- if ('string' == typeof options.stringInputKey && options.inputSchema instanceof z.ZodObject && !(options.stringInputKey in options.inputSchema.shape)) throw new NodeDefinitionError(`Node "${options.name}" stringInputKey must reference a field in inputSchema.`, {
70
- node: options.name,
71
- field: 'stringInputKey'
72
- });
73
- if ('function' != typeof options.execute) throw new NodeDefinitionError(`Node "${options.name}" must provide an execute function.`, {
74
- node: options.name
75
- });
76
- };
77
- function defineNode(options) {
78
- validateDefinition(options);
79
- return options;
80
- }
81
- const SUPPORTED_WEB_PROTOCOLS = new Set([
82
- 'http:',
83
- 'https:'
84
- ]);
85
- const throwIfAborted = (signal, operation)=>{
86
- if (signal.aborted) throw signal.reason ?? new Error(`${operation} aborted.`);
87
- };
88
- const resolveWebUrl = (target, baseUrl, label)=>{
89
- const trimmed = target.trim();
90
- if (!trimmed) throw new TypeError(`${label} must not be blank.`);
91
- let resolved;
92
- try {
93
- resolved = void 0 === baseUrl ? new URL(trimmed) : new URL(trimmed, baseUrl);
94
- } catch (error) {
95
- throw new TypeError(void 0 === baseUrl ? `${label} must be an absolute URL when getBaseUrl() is not configured.` : `${label} is not a valid URL.`, {
96
- cause: error
97
- });
98
- }
99
- if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) throw new TypeError(`${label} does not support the ${resolved.protocol} protocol.`);
100
- return resolved.toString();
101
- };
102
- const clearCookiesInputSchema = z.strictObject({
103
- name: z.string().regex(/\S/).optional().describe('Cookie name to clear.'),
104
- domain: z.string().regex(/\S/).optional().describe('Cookie domain to clear.'),
105
- path: z.string().regex(/\S/).optional().describe('Cookie path to clear.')
106
- });
107
- const createClearCookiesNode = (options)=>defineNode({
108
- name: 'clearCookies',
109
- title: 'Clear browser cookies',
110
- description: 'Clear all cookies from the current Playwright BrowserContext, or only cookies matching name, domain, or path.',
111
- stringInputKey: false,
112
- inputSchema: clearCookiesInputSchema,
113
- async execute (ctx) {
114
- throwIfAborted(ctx.signal, 'clearCookies');
115
- const page = await options.getPage(ctx);
116
- const filters = {
117
- ...void 0 === ctx.input.name ? {} : {
118
- name: ctx.input.name
119
- },
120
- ...void 0 === ctx.input.domain ? {} : {
121
- domain: ctx.input.domain
122
- },
123
- ...void 0 === ctx.input.path ? {} : {
124
- path: ctx.input.path
125
- }
126
- };
127
- await page.context().clearCookies(filters);
128
- const filterNames = Object.keys(filters);
129
- return {
130
- summary: 0 === filterNames.length ? 'Cleared all browser cookies' : `Cleared browser cookies matching ${filterNames.join(', ')}`,
131
- data: {
132
- filters
133
- }
134
- };
135
- }
136
- });
137
- const setCookiesInputSchema = z.strictObject({
138
- cookiesEnv: z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).optional().describe('The environment variable containing a Cookie header, cookie array JSON, or Playwright storage-state JSON.'),
139
- profile: z.string().regex(/\S/).optional().describe('A cookie profile resolved by getCookieProfile().'),
140
- storageStatePath: z.string().regex(/\S/).optional().describe('A path to a Playwright storage-state JSON file.'),
141
- url: z.string().url().optional().describe('The HTTP(S) URL used to scope Cookie-header values or cookies without domain/path.')
142
- }).superRefine((input, ctx)=>{
143
- const sourceCount = [
144
- input.cookiesEnv,
145
- input.profile,
146
- input.storageStatePath
147
- ].filter((value)=>void 0 !== value).length;
148
- if (1 !== sourceCount) ctx.addIssue({
149
- code: 'custom',
150
- message: 'exactly one of cookiesEnv, profile, and storageStatePath is required'
151
- });
152
- });
153
- const toCookieSourceReference = (input)=>{
154
- if (void 0 !== input.cookiesEnv) return {
155
- kind: 'env',
156
- name: input.cookiesEnv
157
- };
158
- if (void 0 !== input.profile) return {
159
- kind: 'profile',
160
- name: input.profile
161
- };
162
- if (void 0 !== input.storageStatePath) return {
163
- kind: 'storage-state',
164
- name: input.storageStatePath
165
- };
166
- throw new TypeError('setCookies requires one cookie source.');
167
- };
168
- const parseCookieHeader = (raw, url)=>{
169
- if (void 0 === url) throw new TypeError('setCookies.url is required when cookiesEnv contains a Cookie header.');
170
- const segments = raw.split(';').map((segment)=>segment.trim()).filter(Boolean);
171
- if (0 === segments.length) throw new TypeError('setCookies Cookie header contains no cookies.');
172
- return segments.map((segment)=>{
173
- const separator = segment.indexOf('=');
174
- if (separator <= 0) throw new TypeError('setCookies Cookie header contains an invalid name/value pair.');
175
- const name = segment.slice(0, separator).trim();
176
- const value = segment.slice(separator + 1).trim();
177
- if (!name) throw new TypeError('setCookies Cookie header contains an empty name.');
178
- return {
179
- name,
180
- value,
181
- url
182
- };
183
- });
184
- };
185
- const parseCookieJson = (raw)=>{
186
- try {
187
- return JSON.parse(raw);
188
- } catch {
189
- throw new TypeError('setCookies source must contain valid JSON or a Cookie header.');
190
- }
191
- };
192
- const resolveCookieSource = async (reference, defaultUrl, ctx, options)=>{
193
- switch(reference.kind){
194
- case 'env':
195
- {
196
- let env;
197
- try {
198
- env = await options.getEnv?.(ctx) ?? process.env;
199
- } catch {
200
- throw new Error(`Failed to resolve cookie environment ${reference.name}; the original error was redacted because it may contain cookie values.`);
201
- }
202
- const raw = env[reference.name];
203
- if (!raw?.trim()) throw new Error(`Environment variable ${reference.name} is missing or blank.`);
204
- const trimmed = raw.trim();
205
- return {
206
- reference,
207
- cookies: /^[\[{]/.test(trimmed) ? parseCookieJson(trimmed) : parseCookieHeader(trimmed, defaultUrl)
208
- };
209
- }
210
- case 'profile':
211
- if (!options.getCookieProfile) throw new Error('setCookies.profile requires createPlaywrightNodes({ getCookieProfile }).');
212
- try {
213
- return {
214
- reference,
215
- cookies: await options.getCookieProfile({
216
- profile: reference.name,
217
- context: ctx.context,
218
- signal: ctx.signal
219
- })
220
- };
221
- } catch {
222
- throw new Error(`Failed to resolve cookie profile ${reference.name}; the original error was redacted because it may contain cookie values.`);
223
- }
224
- case 'storage-state':
225
- {
226
- const path = options.resolveStorageStatePath ? await options.resolveStorageStatePath(reference.name, ctx) : resolve(process.cwd(), reference.name);
227
- return {
228
- reference,
229
- cookies: parseCookieJson(await readFile(path, 'utf8'))
230
- };
231
- }
232
- }
233
- };
234
- const normalizeCookie = (candidate, defaultUrl, index)=>{
235
- if (!candidate || 'object' != typeof candidate || Array.isArray(candidate)) throw new TypeError(`setCookies cookie at index ${index} must be an object.`);
236
- const cookie = candidate;
237
- if ('string' != typeof cookie.name || !cookie.name.trim()) throw new TypeError(`setCookies cookie at index ${index} requires a non-blank name.`);
238
- if ('string' != typeof cookie.value) throw new TypeError(`setCookies cookie at index ${index} requires a string value.`);
239
- const normalized = {
240
- ...cookie
241
- };
242
- const hasUrl = 'string' == typeof cookie.url && cookie.url.length > 0;
243
- const hasDomain = 'string' == typeof cookie.domain && cookie.domain.length > 0;
244
- if (!hasUrl && !hasDomain) {
245
- if (void 0 === defaultUrl) throw new TypeError(`setCookies cookie at index ${index} requires url or domain, or setCookies.url must be provided.`);
246
- normalized.url = defaultUrl;
247
- }
248
- if (hasDomain && 'string' != typeof cookie.path) normalized.path = '/';
249
- return normalized;
250
- };
251
- const normalizeCookies = (source, defaultUrl)=>{
252
- const candidates = Array.isArray(source) ? source : source && 'object' == typeof source && Array.isArray(source.cookies) ? source.cookies : void 0;
253
- if (!candidates) throw new TypeError('setCookies JSON must be a cookie array or an object with a cookies array.');
254
- if (0 === candidates.length) throw new TypeError('setCookies source contains no cookies.');
255
- return candidates.map((cookie, index)=>normalizeCookie(cookie, defaultUrl, index));
256
- };
257
- const createSetCookiesNode = (options)=>defineNode({
258
- name: 'setCookies',
259
- title: 'Set browser cookies',
260
- description: 'Load cookies from an environment variable, configured profile, or Playwright storage-state file without persisting cookie values in workflow input or output.',
261
- stringInputKey: false,
262
- inputSchema: setCookiesInputSchema,
263
- async execute (ctx) {
264
- throwIfAborted(ctx.signal, 'setCookies');
265
- const page = await options.getPage(ctx);
266
- const defaultUrl = void 0 === ctx.input.url ? void 0 : resolveWebUrl(ctx.input.url, void 0, 'setCookies.url');
267
- const reference = toCookieSourceReference(ctx.input);
268
- const resolved = await resolveCookieSource(reference, defaultUrl, ctx, options);
269
- const cookies = normalizeCookies(resolved.cookies, defaultUrl);
270
- throwIfAborted(ctx.signal, 'setCookies');
271
- try {
272
- await page.context().addCookies(cookies);
273
- } catch {
274
- throw new Error(`Failed to set ${cookies.length} browser cookie(s); the browser error was redacted because it may contain cookie values.`);
275
- }
276
- const result = {
277
- source: resolved.reference.kind,
278
- sourceName: resolved.reference.name,
279
- count: cookies.length
280
- };
281
- return {
282
- summary: `Set ${result.count} browser cookie(s) from ${result.source} source ${result.sourceName}`,
283
- data: result
284
- };
285
- }
286
- });
287
- const DEFAULT_NAVIGATION_TIMEOUT_MS = 60000;
288
- const DEFAULT_WAIT_UNTIL = 'domcontentloaded';
289
- const gotoUrlInputSchema = z.strictObject({
290
- url: z.string().min(1).describe('An absolute HTTP(S) URL or a path relative to baseUrl.'),
291
- waitUntil: z["enum"]([
292
- 'commit',
293
- 'domcontentloaded',
294
- 'load',
295
- 'networkidle'
296
- ]).default(DEFAULT_WAIT_UNTIL).describe('The Playwright navigation lifecycle event to wait for.'),
297
- timeoutMs: z.number().positive().default(DEFAULT_NAVIGATION_TIMEOUT_MS).describe('The navigation timeout in milliseconds.')
298
- });
299
- const createGotoUrlNode = (options)=>defineNode({
300
- name: 'gotoUrl',
301
- title: 'Open a Web URL',
302
- description: 'Navigate the current Playwright Page to an absolute HTTP(S) URL or a path relative to the configured baseUrl.',
303
- stringInputKey: 'url',
304
- inputSchema: gotoUrlInputSchema,
305
- async execute (ctx) {
306
- throwIfAborted(ctx.signal, 'gotoUrl');
307
- const page = await options.getPage(ctx);
308
- const baseUrl = await options.getBaseUrl?.(ctx);
309
- const url = resolveWebUrl(ctx.input.url, baseUrl, 'gotoUrl.url');
310
- const response = await page.goto(url, {
311
- waitUntil: ctx.input.waitUntil,
312
- timeout: ctx.input.timeoutMs
313
- });
314
- const status = response?.status() ?? null;
315
- const result = {
316
- url: page.url(),
317
- status,
318
- title: await page.title()
319
- };
320
- return {
321
- summary: `Navigated to ${result.url}`,
322
- data: result
323
- };
324
- }
325
- });
326
- const setViewportSizeInputSchema = z.strictObject({
327
- width: z.number().int().positive().describe('Viewport width in CSS pixels.'),
328
- height: z.number().int().positive().describe('Viewport height in CSS pixels.')
329
- });
330
- const createSetViewportSizeNode = (options)=>defineNode({
331
- name: 'setViewportSize',
332
- title: 'Set the browser viewport size',
333
- description: 'Set the current Playwright Page viewport size in CSS pixels and return the effective size.',
334
- stringInputKey: false,
335
- inputSchema: setViewportSizeInputSchema,
336
- async execute (ctx) {
337
- throwIfAborted(ctx.signal, 'setViewportSize');
338
- const page = await options.getPage(ctx);
339
- await page.setViewportSize({
340
- width: ctx.input.width,
341
- height: ctx.input.height
342
- });
343
- const viewport = page.viewportSize();
344
- if (!viewport) throw new Error('Playwright did not report an effective viewport size.');
345
- return {
346
- summary: `Set viewport to ${viewport.width}x${viewport.height}`,
347
- data: viewport
348
- };
349
- }
350
- });
351
- const requireOptions = (options)=>{
352
- if (!options || 'object' != typeof options) throw new NodeDefinitionError('createPlaywrightNodes() options must be an object.');
353
- if ('function' != typeof options.getPage) throw new NodeDefinitionError('createPlaywrightNodes() requires getPage().');
354
- };
355
- function createPlaywrightNodes(options) {
356
- requireOptions(options);
357
- return [
358
- createGotoUrlNode(options),
359
- createSetCookiesNode(options),
360
- createClearCookiesNode(options),
361
- createSetViewportSizeNode(options)
362
- ];
363
- }
364
- export { clearCookiesInputSchema, createPlaywrightNodes, gotoUrlInputSchema, setCookiesInputSchema, setViewportSizeInputSchema };
365
-
366
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"playwright/index.mjs","sources":["../../../src/errors.ts","../../../src/node/define-node.ts","../../../src/playwright/utils.ts","../../../src/playwright/clear-cookies.ts","../../../src/playwright/cookies.ts","../../../src/playwright/goto-url.ts","../../../src/playwright/viewport.ts","../../../src/playwright/index.ts"],"sourcesContent":["import type { z } from 'zod/v4';\n\nexport interface WorkflowErrorOptions {\n code?: string;\n details?: unknown;\n cause?: unknown;\n}\n\nexport class WorkflowError extends Error {\n readonly code: string;\n readonly details?: unknown;\n\n constructor(message: string, options: WorkflowErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = options.code ?? 'WORKFLOW_ERROR';\n this.details = options.details;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n ...(this.details === undefined ? {} : { details: this.details }),\n };\n }\n}\n\nexport class WorkflowParseError extends WorkflowError {\n constructor(message: string, details?: unknown, cause?: unknown) {\n super(message, { code: 'WORKFLOW_PARSE_ERROR', details, cause });\n }\n}\n\nexport class NodeDefinitionError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'NODE_DEFINITION_ERROR', details });\n }\n}\n\nexport class DuplicateNodeError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string) {\n super(`Node \"${node}\" is already registered.`, {\n code: 'DUPLICATE_NODE',\n details: { node },\n });\n this.node = node;\n }\n}\n\nexport class NodeNotFoundError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string) {\n super(`Node \"${node}\" is not registered.`, {\n code: 'NODE_NOT_FOUND',\n details: { node },\n });\n this.node = node;\n }\n}\n\nexport class NodeInputValidationError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'NODE_INPUT_VALIDATION_ERROR', details });\n }\n\n static fromZod(node: string, error: z.ZodError): NodeInputValidationError {\n const issues = error.issues.map((issue) => ({\n code: issue.code,\n path: issue.path.map(String).join('.'),\n message: issue.message,\n }));\n const firstIssue = issues[0];\n const path = firstIssue?.path || '<root>';\n const message = firstIssue?.message ?? 'invalid input';\n return new NodeInputValidationError(\n `Node \"${node}\" input validation failed at \"${path}\": ${message}`,\n { node, issues },\n );\n }\n}\n\nexport class StepTimeoutError extends WorkflowError {\n readonly timeoutMs: number;\n readonly node?: string;\n\n constructor(timeoutMs: number, node?: string) {\n super(\n node\n ? `Node \"${node}\" timed out after ${timeoutMs}ms.`\n : `Step timed out after ${timeoutMs}ms.`,\n {\n code: 'STEP_TIMEOUT',\n details: { timeoutMs, ...(node === undefined ? {} : { node }) },\n },\n );\n this.timeoutMs = timeoutMs;\n this.node = node;\n }\n}\n\nexport class NodeExecutionError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string, cause: unknown) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Node \"${node}\" failed: ${causeMessage}`, {\n code: 'NODE_EXECUTION_ERROR',\n details: { node },\n cause,\n });\n this.node = node;\n }\n}\n\nexport class WorkflowLifecycleError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'WORKFLOW_LIFECYCLE_ERROR', details });\n }\n}\n\nexport class ProjectSetupError extends WorkflowError {\n constructor(cause: unknown, details: { projectName: string }) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Project \"${details.projectName}\" setup failed: ${causeMessage}`, {\n code: 'PROJECT_SETUP_ERROR',\n details,\n cause,\n });\n }\n}\n\nexport class ProjectTeardownError extends WorkflowError {\n constructor(\n cause: unknown,\n details: { projectName: string; registrationIndex: number },\n ) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Project \"${details.projectName}\" teardown failed: ${causeMessage}`, {\n code: 'PROJECT_TEARDOWN_ERROR',\n details,\n cause,\n });\n }\n}\n\nexport class NodeScopeTeardownError extends WorkflowError {\n constructor(\n cause: unknown,\n details: {\n scope: 'case' | 'document';\n scopeId: string;\n node: string;\n registrationIndex: number;\n },\n ) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(\n `${details.scope === 'case' ? 'Case attempt' : 'Workflow document'} node teardown failed for \"${details.node}\": ${causeMessage}`,\n { code: 'NODE_SCOPE_TEARDOWN_ERROR', details, cause },\n );\n }\n}\n\nexport class FatalDeviceError extends WorkflowError {\n constructor(message: string, cause?: unknown) {\n super(message, { code: 'FATAL_DEVICE_ERROR', cause });\n }\n}\n\nexport const isFatalDeviceError = (error: unknown): boolean => {\n if (error instanceof FatalDeviceError) return true;\n if (error instanceof WorkflowError && error.code === 'FATAL_DEVICE_ERROR') {\n return true;\n }\n if (\n error instanceof Error &&\n /device offline|device not found|(?:adb|bdc|device) connection (?:was )?closed/i.test(\n error.message,\n )\n ) {\n return true;\n }\n return error instanceof Error && error.cause !== undefined\n ? isFatalDeviceError(error.cause)\n : false;\n};\n\nexport class CaseExecutionError extends WorkflowError {\n readonly result: import('./engine/types').CaseRunResult;\n\n constructor(result: import('./engine/types').CaseRunResult) {\n super(`Case \"${result.name}\" failed.`, {\n code: 'CASE_EXECUTION_FAILED',\n details: { caseId: result.caseId, runId: result.runId },\n });\n this.result = result;\n }\n}\n\nexport class WorkflowDocumentExecutionError extends WorkflowError {\n readonly result: import('./engine/types').WorkflowDocumentRunResult;\n\n constructor(result: import('./engine/types').WorkflowDocumentRunResult) {\n super(`Workflow document \"${result.sourcePath}\" failed.`, {\n code: 'WORKFLOW_DOCUMENT_EXECUTION_FAILED',\n details: {\n documentId: result.documentId,\n documentRunId: result.documentRunId,\n },\n });\n this.result = result;\n }\n}\n\nexport function normalizeNodeExecutionError(\n error: unknown,\n node: string,\n): WorkflowError {\n return error instanceof WorkflowError\n ? error\n : new NodeExecutionError(node, error);\n}\n","import { z } from 'zod/v4';\nimport { NodeDefinitionError } from '../errors';\nimport type {\n DefineNodeOptions,\n DefineNodeWithSchemaOptions,\n NodeDefinition,\n NodeDefinitionWithSchema,\n NodeInputSchema,\n} from './types';\n\nconst validateOptionalText = (\n value: unknown,\n field: 'title' | 'description',\n node: string,\n): void => {\n if (\n value !== undefined &&\n (typeof value !== 'string' || value.trim().length === 0)\n ) {\n throw new NodeDefinitionError(\n `Node \"${node}\" ${field} must be a non-empty string.`,\n { node, field },\n );\n }\n};\n\nconst validateInputSchema = (schema: unknown, node: string): void => {\n if (schema === undefined) return;\n if (!(schema instanceof z.ZodObject)) {\n throw new NodeDefinitionError(\n `Node \"${node}\" inputSchema must be a Zod object schema.`,\n { node, field: 'inputSchema' },\n );\n }\n if ('$' in schema.shape) {\n throw new NodeDefinitionError(\n `Node \"${node}\" inputSchema must not declare \"$\" as an input property.`,\n { node, field: 'inputSchema.$' },\n );\n }\n};\n\nconst validateDefinition = (options: {\n name: string;\n title?: unknown;\n description?: unknown;\n stringInputKey?: unknown;\n inputSchema?: unknown;\n execute: unknown;\n}): void => {\n if (!options || typeof options !== 'object') {\n throw new NodeDefinitionError('Node definition must be an object.');\n }\n\n if (typeof options.name !== 'string' || options.name.trim().length === 0) {\n throw new NodeDefinitionError('Node name must be a non-empty string.');\n }\n\n validateOptionalText(options.title, 'title', options.name);\n validateOptionalText(options.description, 'description', options.name);\n if (\n options.stringInputKey !== undefined &&\n options.stringInputKey !== false &&\n (typeof options.stringInputKey !== 'string' ||\n options.stringInputKey.trim().length === 0)\n ) {\n throw new NodeDefinitionError(\n `Node \"${options.name}\" stringInputKey must be a non-empty string or false.`,\n { node: options.name, field: 'stringInputKey' },\n );\n }\n validateInputSchema(options.inputSchema, options.name);\n\n if (\n typeof options.stringInputKey === 'string' &&\n options.inputSchema instanceof z.ZodObject &&\n !(options.stringInputKey in options.inputSchema.shape)\n ) {\n throw new NodeDefinitionError(\n `Node \"${options.name}\" stringInputKey must reference a field in inputSchema.`,\n { node: options.name, field: 'stringInputKey' },\n );\n }\n\n if (typeof options.execute !== 'function') {\n throw new NodeDefinitionError(\n `Node \"${options.name}\" must provide an execute function.`,\n { node: options.name },\n );\n }\n};\n\nexport function defineNode<\n TSchema extends NodeInputSchema,\n TData = unknown,\n TContext = unknown,\n>(\n options: DefineNodeWithSchemaOptions<TSchema, TData, TContext>,\n): NodeDefinitionWithSchema<TSchema, TData, TContext>;\n\nexport function defineNode<\n TInput = unknown,\n TData = unknown,\n TContext = unknown,\n>(\n options: DefineNodeOptions<TInput, TData, TContext>,\n): NodeDefinition<TInput, TData, TContext>;\n\nexport function defineNode(\n options: DefineNodeOptions<any, any, any>,\n): NodeDefinition<any, any, any> {\n validateDefinition(options);\n return options;\n}\n","const SUPPORTED_WEB_PROTOCOLS = new Set(['http:', 'https:']);\n\nexport const throwIfAborted = (signal: AbortSignal, operation: string) => {\n if (signal.aborted) {\n throw signal.reason ?? new Error(`${operation} aborted.`);\n }\n};\n\nexport const resolveWebUrl = (\n target: string,\n baseUrl: string | undefined,\n label: string,\n): string => {\n const trimmed = target.trim();\n if (!trimmed) throw new TypeError(`${label} must not be blank.`);\n\n let resolved: URL;\n try {\n resolved =\n baseUrl === undefined ? new URL(trimmed) : new URL(trimmed, baseUrl);\n } catch (error) {\n throw new TypeError(\n baseUrl === undefined\n ? `${label} must be an absolute URL when getBaseUrl() is not configured.`\n : `${label} is not a valid URL.`,\n { cause: error },\n );\n }\n if (!SUPPORTED_WEB_PROTOCOLS.has(resolved.protocol)) {\n throw new TypeError(\n `${label} does not support the ${resolved.protocol} protocol.`,\n );\n }\n return resolved.toString();\n};\n","import type { BrowserContext } from 'playwright';\nimport { z } from 'zod/v4';\nimport { defineNode } from '../node/define-node';\nimport type { NodeDefinition } from '../node/types';\nimport type { CreatePlaywrightNodesOptions } from './types';\nimport { throwIfAborted } from './utils';\n\ntype CookieClearOptions = NonNullable<\n Parameters<BrowserContext['clearCookies']>[0]\n>;\n\n/** Input schema for the Playwright clearCookies Node. */\nexport const clearCookiesInputSchema = z.strictObject({\n name: z.string().regex(/\\S/).optional().describe('Cookie name to clear.'),\n domain: z.string().regex(/\\S/).optional().describe('Cookie domain to clear.'),\n path: z.string().regex(/\\S/).optional().describe('Cookie path to clear.'),\n});\n\n/** Validated input accepted by the Playwright clearCookies Node. */\nexport type ClearCookiesNodeInput = z.infer<typeof clearCookiesInputSchema>;\n\nexport const createClearCookiesNode = <TContext>(\n options: CreatePlaywrightNodesOptions<TContext>,\n): NodeDefinition<any, any, TContext> =>\n defineNode<\n typeof clearCookiesInputSchema,\n { filters: CookieClearOptions },\n TContext\n >({\n name: 'clearCookies',\n title: 'Clear browser cookies',\n description:\n 'Clear all cookies from the current Playwright BrowserContext, or only cookies matching name, domain, or path.',\n stringInputKey: false,\n inputSchema: clearCookiesInputSchema,\n async execute(ctx) {\n throwIfAborted(ctx.signal, 'clearCookies');\n const page = await options.getPage(ctx);\n const filters: CookieClearOptions = {\n ...(ctx.input.name === undefined ? {} : { name: ctx.input.name }),\n ...(ctx.input.domain === undefined ? {} : { domain: ctx.input.domain }),\n ...(ctx.input.path === undefined ? {} : { path: ctx.input.path }),\n };\n await page.context().clearCookies(filters);\n const filterNames = Object.keys(filters);\n return {\n summary:\n filterNames.length === 0\n ? 'Cleared all browser cookies'\n : `Cleared browser cookies matching ${filterNames.join(', ')}`,\n data: { filters },\n };\n },\n });\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { z } from 'zod/v4';\nimport { defineNode } from '../node/define-node';\nimport type { NodeDefinition } from '../node/types';\nimport type {\n CreatePlaywrightNodesOptions,\n PlaywrightCookie,\n PlaywrightNodeContext,\n} from './types';\nimport { resolveWebUrl, throwIfAborted } from './utils';\n\ntype CookieSourceReference =\n | { kind: 'env'; name: string }\n | { kind: 'profile'; name: string }\n | { kind: 'storage-state'; name: string };\n\ninterface ResolvedCookieSource {\n reference: CookieSourceReference;\n cookies: unknown;\n}\n\n/** Input schema for the Playwright setCookies Node. */\nexport const setCookiesInputSchema = z\n .strictObject({\n cookiesEnv: z\n .string()\n .regex(/^[A-Za-z_][A-Za-z0-9_]*$/)\n .optional()\n .describe(\n 'The environment variable containing a Cookie header, cookie array JSON, or Playwright storage-state JSON.',\n ),\n profile: z\n .string()\n .regex(/\\S/)\n .optional()\n .describe('A cookie profile resolved by getCookieProfile().'),\n storageStatePath: z\n .string()\n .regex(/\\S/)\n .optional()\n .describe('A path to a Playwright storage-state JSON file.'),\n url: z\n .string()\n .url()\n .optional()\n .describe(\n 'The HTTP(S) URL used to scope Cookie-header values or cookies without domain/path.',\n ),\n })\n .superRefine((input, ctx) => {\n const sourceCount = [\n input.cookiesEnv,\n input.profile,\n input.storageStatePath,\n ].filter((value) => value !== undefined).length;\n if (sourceCount !== 1) {\n ctx.addIssue({\n code: 'custom',\n message:\n 'exactly one of cookiesEnv, profile, and storageStatePath is required',\n });\n }\n });\n\n/** Validated input accepted by the Playwright setCookies Node. */\nexport type SetCookiesNodeInput = z.infer<typeof setCookiesInputSchema>;\n\n/** Secret-free metadata returned by the Playwright setCookies Node. */\nexport interface SetCookiesNodeResult {\n /** Kind of configured reference used to resolve the cookies. */\n source: CookieSourceReference['kind'];\n /** Environment variable, profile, or storage-state reference name. */\n sourceName: string;\n /** Number of cookies passed to the BrowserContext. */\n count: number;\n}\n\nconst toCookieSourceReference = (\n input: SetCookiesNodeInput,\n): CookieSourceReference => {\n if (input.cookiesEnv !== undefined) {\n return { kind: 'env', name: input.cookiesEnv };\n }\n if (input.profile !== undefined) {\n return { kind: 'profile', name: input.profile };\n }\n if (input.storageStatePath !== undefined) {\n return { kind: 'storage-state', name: input.storageStatePath };\n }\n throw new TypeError('setCookies requires one cookie source.');\n};\n\nconst parseCookieHeader = (raw: string, url: string | undefined) => {\n if (url === undefined) {\n throw new TypeError(\n 'setCookies.url is required when cookiesEnv contains a Cookie header.',\n );\n }\n const segments = raw\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean);\n if (segments.length === 0) {\n throw new TypeError('setCookies Cookie header contains no cookies.');\n }\n return segments.map((segment) => {\n const separator = segment.indexOf('=');\n if (separator <= 0) {\n throw new TypeError(\n 'setCookies Cookie header contains an invalid name/value pair.',\n );\n }\n const name = segment.slice(0, separator).trim();\n const value = segment.slice(separator + 1).trim();\n if (!name) {\n throw new TypeError('setCookies Cookie header contains an empty name.');\n }\n return { name, value, url } satisfies PlaywrightCookie;\n });\n};\n\nconst parseCookieJson = (raw: string): unknown => {\n try {\n return JSON.parse(raw);\n } catch {\n throw new TypeError(\n 'setCookies source must contain valid JSON or a Cookie header.',\n );\n }\n};\n\nconst resolveCookieSource = async <TContext>(\n reference: CookieSourceReference,\n defaultUrl: string | undefined,\n ctx: PlaywrightNodeContext<TContext>,\n options: CreatePlaywrightNodesOptions<TContext>,\n): Promise<ResolvedCookieSource> => {\n switch (reference.kind) {\n case 'env': {\n let env: Readonly<Record<string, string | undefined>>;\n try {\n env = (await options.getEnv?.(ctx)) ?? process.env;\n } catch {\n throw new Error(\n `Failed to resolve cookie environment ${reference.name}; the original error was redacted because it may contain cookie values.`,\n );\n }\n const raw = env[reference.name];\n if (!raw?.trim()) {\n throw new Error(\n `Environment variable ${reference.name} is missing or blank.`,\n );\n }\n const trimmed = raw.trim();\n return {\n reference,\n cookies: /^[\\[{]/.test(trimmed)\n ? parseCookieJson(trimmed)\n : parseCookieHeader(trimmed, defaultUrl),\n };\n }\n case 'profile': {\n if (!options.getCookieProfile) {\n throw new Error(\n 'setCookies.profile requires createPlaywrightNodes({ getCookieProfile }).',\n );\n }\n try {\n return {\n reference,\n cookies: await options.getCookieProfile({\n profile: reference.name,\n context: ctx.context,\n signal: ctx.signal,\n }),\n };\n } catch {\n throw new Error(\n `Failed to resolve cookie profile ${reference.name}; the original error was redacted because it may contain cookie values.`,\n );\n }\n }\n case 'storage-state': {\n const path = options.resolveStorageStatePath\n ? await options.resolveStorageStatePath(reference.name, ctx)\n : resolve(process.cwd(), reference.name);\n return {\n reference,\n cookies: parseCookieJson(await readFile(path, 'utf8')),\n };\n }\n }\n};\n\nconst normalizeCookie = (\n candidate: unknown,\n defaultUrl: string | undefined,\n index: number,\n): PlaywrightCookie => {\n if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n throw new TypeError(\n `setCookies cookie at index ${index} must be an object.`,\n );\n }\n const cookie = candidate as Record<string, unknown>;\n if (typeof cookie.name !== 'string' || !cookie.name.trim()) {\n throw new TypeError(\n `setCookies cookie at index ${index} requires a non-blank name.`,\n );\n }\n if (typeof cookie.value !== 'string') {\n throw new TypeError(\n `setCookies cookie at index ${index} requires a string value.`,\n );\n }\n\n const normalized = { ...cookie } as unknown as PlaywrightCookie;\n const hasUrl = typeof cookie.url === 'string' && cookie.url.length > 0;\n const hasDomain =\n typeof cookie.domain === 'string' && cookie.domain.length > 0;\n if (!hasUrl && !hasDomain) {\n if (defaultUrl === undefined) {\n throw new TypeError(\n `setCookies cookie at index ${index} requires url or domain, or setCookies.url must be provided.`,\n );\n }\n normalized.url = defaultUrl;\n }\n if (hasDomain && typeof cookie.path !== 'string') {\n normalized.path = '/';\n }\n return normalized;\n};\n\nconst normalizeCookies = (\n source: unknown,\n defaultUrl: string | undefined,\n): PlaywrightCookie[] => {\n const candidates = Array.isArray(source)\n ? source\n : source &&\n typeof source === 'object' &&\n Array.isArray((source as { cookies?: unknown }).cookies)\n ? (source as { cookies: unknown[] }).cookies\n : undefined;\n if (!candidates) {\n throw new TypeError(\n 'setCookies JSON must be a cookie array or an object with a cookies array.',\n );\n }\n if (candidates.length === 0) {\n throw new TypeError('setCookies source contains no cookies.');\n }\n return candidates.map((cookie, index) =>\n normalizeCookie(cookie, defaultUrl, index),\n );\n};\n\nexport const createSetCookiesNode = <TContext>(\n options: CreatePlaywrightNodesOptions<TContext>,\n): NodeDefinition<any, any, TContext> =>\n defineNode<typeof setCookiesInputSchema, SetCookiesNodeResult, TContext>({\n name: 'setCookies',\n title: 'Set browser cookies',\n description:\n 'Load cookies from an environment variable, configured profile, or Playwright storage-state file without persisting cookie values in workflow input or output.',\n stringInputKey: false,\n inputSchema: setCookiesInputSchema,\n async execute(ctx) {\n throwIfAborted(ctx.signal, 'setCookies');\n const page = await options.getPage(ctx);\n const defaultUrl =\n ctx.input.url === undefined\n ? undefined\n : resolveWebUrl(ctx.input.url, undefined, 'setCookies.url');\n const reference = toCookieSourceReference(ctx.input);\n const resolved = await resolveCookieSource(\n reference,\n defaultUrl,\n ctx,\n options,\n );\n const cookies = normalizeCookies(resolved.cookies, defaultUrl);\n\n throwIfAborted(ctx.signal, 'setCookies');\n try {\n await page.context().addCookies(cookies);\n } catch {\n throw new Error(\n `Failed to set ${cookies.length} browser cookie(s); the browser error was redacted because it may contain cookie values.`,\n );\n }\n\n const result: SetCookiesNodeResult = {\n source: resolved.reference.kind,\n sourceName: resolved.reference.name,\n count: cookies.length,\n };\n return {\n summary: `Set ${result.count} browser cookie(s) from ${result.source} source ${result.sourceName}`,\n data: result,\n };\n },\n });\n","import { z } from 'zod/v4';\nimport { defineNode } from '../node/define-node';\nimport type { NodeDefinition } from '../node/types';\nimport type { CreatePlaywrightNodesOptions } from './types';\nimport { resolveWebUrl, throwIfAborted } from './utils';\n\nconst DEFAULT_NAVIGATION_TIMEOUT_MS = 60_000;\nconst DEFAULT_WAIT_UNTIL = 'domcontentloaded' as const;\n\n/** Input schema for the Playwright gotoUrl Node. */\nexport const gotoUrlInputSchema = z.strictObject({\n url: z\n .string()\n .min(1)\n .describe('An absolute HTTP(S) URL or a path relative to baseUrl.'),\n waitUntil: z\n .enum(['commit', 'domcontentloaded', 'load', 'networkidle'])\n .default(DEFAULT_WAIT_UNTIL)\n .describe('The Playwright navigation lifecycle event to wait for.'),\n timeoutMs: z\n .number()\n .positive()\n .default(DEFAULT_NAVIGATION_TIMEOUT_MS)\n .describe('The navigation timeout in milliseconds.'),\n});\n\n/** Validated input accepted by the Playwright gotoUrl Node. */\nexport type GotoUrlNodeInput = z.infer<typeof gotoUrlInputSchema>;\n\n/** Structured navigation details returned by the Playwright gotoUrl Node. */\nexport interface GotoUrlNodeResult {\n /** Final Page URL after navigation and redirects. */\n url: string;\n /** Main-resource HTTP status, or null when Playwright returns no response. */\n status: number | null;\n /** Document title after navigation completes. */\n title: string;\n}\n\nexport const createGotoUrlNode = <TContext>(\n options: CreatePlaywrightNodesOptions<TContext>,\n): NodeDefinition<any, any, TContext> =>\n defineNode<typeof gotoUrlInputSchema, GotoUrlNodeResult, TContext>({\n name: 'gotoUrl',\n title: 'Open a Web URL',\n description:\n 'Navigate the current Playwright Page to an absolute HTTP(S) URL or a path relative to the configured baseUrl.',\n stringInputKey: 'url',\n inputSchema: gotoUrlInputSchema,\n async execute(ctx) {\n throwIfAborted(ctx.signal, 'gotoUrl');\n const page = await options.getPage(ctx);\n const baseUrl = await options.getBaseUrl?.(ctx);\n const url = resolveWebUrl(ctx.input.url, baseUrl, 'gotoUrl.url');\n const response = await page.goto(url, {\n waitUntil: ctx.input.waitUntil,\n timeout: ctx.input.timeoutMs,\n });\n const status = response?.status() ?? null;\n const result = {\n url: page.url(),\n status,\n title: await page.title(),\n };\n return { summary: `Navigated to ${result.url}`, data: result };\n },\n });\n","import { z } from 'zod/v4';\nimport { defineNode } from '../node/define-node';\nimport type { NodeDefinition } from '../node/types';\nimport type { CreatePlaywrightNodesOptions } from './types';\nimport { throwIfAborted } from './utils';\n\n/** Input schema for the Playwright setViewportSize Node. */\nexport const setViewportSizeInputSchema = z.strictObject({\n width: z.number().int().positive().describe('Viewport width in CSS pixels.'),\n height: z\n .number()\n .int()\n .positive()\n .describe('Viewport height in CSS pixels.'),\n});\n\n/** Validated input accepted by the Playwright setViewportSize Node. */\nexport type SetViewportSizeNodeInput = z.infer<\n typeof setViewportSizeInputSchema\n>;\n\nexport const createSetViewportSizeNode = <TContext>(\n options: CreatePlaywrightNodesOptions<TContext>,\n): NodeDefinition<any, any, TContext> =>\n defineNode<\n typeof setViewportSizeInputSchema,\n { width: number; height: number },\n TContext\n >({\n name: 'setViewportSize',\n title: 'Set the browser viewport size',\n description:\n 'Set the current Playwright Page viewport size in CSS pixels and return the effective size.',\n stringInputKey: false,\n inputSchema: setViewportSizeInputSchema,\n async execute(ctx) {\n throwIfAborted(ctx.signal, 'setViewportSize');\n const page = await options.getPage(ctx);\n await page.setViewportSize({\n width: ctx.input.width,\n height: ctx.input.height,\n });\n const viewport = page.viewportSize();\n if (!viewport) {\n throw new Error(\n 'Playwright did not report an effective viewport size.',\n );\n }\n return {\n summary: `Set viewport to ${viewport.width}x${viewport.height}`,\n data: viewport,\n };\n },\n });\n","import { NodeDefinitionError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\nimport { createClearCookiesNode } from './clear-cookies';\nimport { createSetCookiesNode } from './cookies';\nimport { createGotoUrlNode } from './goto-url';\nimport type { CreatePlaywrightNodesOptions } from './types';\nimport { createSetViewportSizeNode } from './viewport';\n\nexport { clearCookiesInputSchema } from './clear-cookies';\nexport type { ClearCookiesNodeInput } from './clear-cookies';\nexport { setCookiesInputSchema } from './cookies';\nexport type {\n SetCookiesNodeInput,\n SetCookiesNodeResult,\n} from './cookies';\nexport { gotoUrlInputSchema } from './goto-url';\nexport type { GotoUrlNodeInput, GotoUrlNodeResult } from './goto-url';\nexport type {\n CreatePlaywrightNodesOptions,\n PlaywrightCookieProfileContext,\n} from './types';\nexport { setViewportSizeInputSchema } from './viewport';\nexport type { SetViewportSizeNodeInput } from './viewport';\n\nconst requireOptions = <TContext>(\n options: CreatePlaywrightNodesOptions<TContext>,\n) => {\n if (!options || typeof options !== 'object') {\n throw new NodeDefinitionError(\n 'createPlaywrightNodes() options must be an object.',\n );\n }\n if (typeof options.getPage !== 'function') {\n throw new NodeDefinitionError(\n 'createPlaywrightNodes() requires getPage().',\n );\n }\n};\n\n/**\n * Create the P0 Playwright preset Nodes without assuming Project Context field\n * names. Cookie values must be resolved through configured references and are\n * never accepted as inline Node input.\n */\nexport function createPlaywrightNodes<TContext>(\n options: CreatePlaywrightNodesOptions<TContext>,\n): readonly NodeDefinition<any, any, TContext>[] {\n requireOptions(options);\n return [\n createGotoUrlNode(options),\n createSetCookiesNode(options),\n createClearCookiesNode(options),\n createSetViewportSizeNode(options),\n ];\n}\n"],"names":["WorkflowError","Error","undefined","message","options","NodeDefinitionError","details","validateOptionalText","value","field","node","validateInputSchema","schema","z","validateDefinition","defineNode","SUPPORTED_WEB_PROTOCOLS","Set","throwIfAborted","signal","operation","resolveWebUrl","target","baseUrl","label","trimmed","TypeError","resolved","URL","error","clearCookiesInputSchema","createClearCookiesNode","ctx","page","filters","filterNames","Object","setCookiesInputSchema","input","sourceCount","toCookieSourceReference","parseCookieHeader","raw","url","segments","segment","Boolean","separator","name","parseCookieJson","JSON","resolveCookieSource","reference","defaultUrl","env","process","path","resolve","readFile","normalizeCookie","candidate","index","Array","cookie","normalized","hasUrl","hasDomain","normalizeCookies","source","candidates","createSetCookiesNode","cookies","result","DEFAULT_NAVIGATION_TIMEOUT_MS","DEFAULT_WAIT_UNTIL","gotoUrlInputSchema","createGotoUrlNode","response","status","setViewportSizeInputSchema","createSetViewportSizeNode","viewport","requireOptions","createPlaywrightNodes"],"mappings":";;;;;;;;;;;;;AAQO,MAAMA,sBAAsBC;IAWjC,SAAkC;QAChC,OAAO;YACL,MAAM,IAAI,CAAC,IAAI;YACf,SAAS,IAAI,CAAC,OAAO;YACrB,MAAM,IAAI,CAAC,IAAI;YACf,GAAI,AAAiBC,WAAjB,IAAI,CAAC,OAAO,GAAiB,CAAC,IAAI;gBAAE,SAAS,IAAI,CAAC,OAAO;YAAC,CAAC;QACjE;IACF;IAdA,YAAYC,OAAe,EAAEC,UAAgC,CAAC,CAAC,CAAE;QAC/D,KAAK,CAACD,SAAS;YAAE,OAAOC,QAAQ,KAAK;QAAC,IAJxC,uBAAS,QAAT,SACA,uBAAS,WAAT;QAIE,IAAI,CAAC,IAAI,GAAG,WAAW,IAAI;QAC3B,IAAI,CAAC,IAAI,GAAGA,QAAQ,IAAI,IAAI;QAC5B,IAAI,CAAC,OAAO,GAAGA,QAAQ,OAAO;IAChC;AAUF;AAQO,MAAMC,4BAA4BL;IACvC,YAAYG,OAAe,EAAEG,OAAiB,CAAE;QAC9C,KAAK,CAACH,SAAS;YAAE,MAAM;YAAyBG;QAAQ;IAC1D;AACF;AC7BA,MAAMC,uBAAuB,CAC3BC,OACAC,OACAC;IAEA,IACEF,AAAUN,WAAVM,SACC,CAAiB,YAAjB,OAAOA,SAAsBA,AAAwB,MAAxBA,MAAM,IAAI,GAAG,MAAM,AAAK,GAEtD,MAAM,IAAIH,oBACR,CAAC,MAAM,EAAEK,KAAK,EAAE,EAAED,MAAM,4BAA4B,CAAC,EACrD;QAAEC;QAAMD;IAAM;AAGpB;AAEA,MAAME,sBAAsB,CAACC,QAAiBF;IAC5C,IAAIE,AAAWV,WAAXU,QAAsB;IAC1B,IAAI,CAAEA,CAAAA,kBAAkBC,EAAE,SAAQ,GAChC,MAAM,IAAIR,oBACR,CAAC,MAAM,EAAEK,KAAK,0CAA0C,CAAC,EACzD;QAAEA;QAAM,OAAO;IAAc;IAGjC,IAAI,OAAOE,OAAO,KAAK,EACrB,MAAM,IAAIP,oBACR,CAAC,MAAM,EAAEK,KAAK,wDAAwD,CAAC,EACvE;QAAEA;QAAM,OAAO;IAAgB;AAGrC;AAEA,MAAMI,qBAAqB,CAACV;IAQ1B,IAAI,CAACA,WAAW,AAAmB,YAAnB,OAAOA,SACrB,MAAM,IAAIC,oBAAoB;IAGhC,IAAI,AAAwB,YAAxB,OAAOD,QAAQ,IAAI,IAAiBA,AAA+B,MAA/BA,QAAQ,IAAI,CAAC,IAAI,GAAG,MAAM,EAChE,MAAM,IAAIC,oBAAoB;IAGhCE,qBAAqBH,QAAQ,KAAK,EAAE,SAASA,QAAQ,IAAI;IACzDG,qBAAqBH,QAAQ,WAAW,EAAE,eAAeA,QAAQ,IAAI;IACrE,IACEA,AAA2BF,WAA3BE,QAAQ,cAAc,IACtBA,AAA2B,UAA3BA,QAAQ,cAAc,IACrB,CAAkC,YAAlC,OAAOA,QAAQ,cAAc,IAC5BA,AAAyC,MAAzCA,QAAQ,cAAc,CAAC,IAAI,GAAG,MAAM,AAAK,GAE3C,MAAM,IAAIC,oBACR,CAAC,MAAM,EAAED,QAAQ,IAAI,CAAC,qDAAqD,CAAC,EAC5E;QAAE,MAAMA,QAAQ,IAAI;QAAE,OAAO;IAAiB;IAGlDO,oBAAoBP,QAAQ,WAAW,EAAEA,QAAQ,IAAI;IAErD,IACE,AAAkC,YAAlC,OAAOA,QAAQ,cAAc,IAC7BA,QAAQ,WAAW,YAAYS,EAAE,SAAS,IAC1C,CAAET,CAAAA,QAAQ,cAAc,IAAIA,QAAQ,WAAW,CAAC,KAAI,GAEpD,MAAM,IAAIC,oBACR,CAAC,MAAM,EAAED,QAAQ,IAAI,CAAC,uDAAuD,CAAC,EAC9E;QAAE,MAAMA,QAAQ,IAAI;QAAE,OAAO;IAAiB;IAIlD,IAAI,AAA2B,cAA3B,OAAOA,QAAQ,OAAO,EACxB,MAAM,IAAIC,oBACR,CAAC,MAAM,EAAED,QAAQ,IAAI,CAAC,mCAAmC,CAAC,EAC1D;QAAE,MAAMA,QAAQ,IAAI;IAAC;AAG3B;AAkBO,SAASW,WACdX,OAAyC;IAEzCU,mBAAmBV;IACnB,OAAOA;AACT;ACjHA,MAAMY,0BAA0B,IAAIC,IAAI;IAAC;IAAS;CAAS;AAEpD,MAAMC,iBAAiB,CAACC,QAAqBC;IAClD,IAAID,OAAO,OAAO,EAChB,MAAMA,OAAO,MAAM,IAAI,IAAIlB,MAAM,GAAGmB,UAAU,SAAS,CAAC;AAE5D;AAEO,MAAMC,gBAAgB,CAC3BC,QACAC,SACAC;IAEA,MAAMC,UAAUH,OAAO,IAAI;IAC3B,IAAI,CAACG,SAAS,MAAM,IAAIC,UAAU,GAAGF,MAAM,mBAAmB,CAAC;IAE/D,IAAIG;IACJ,IAAI;QACFA,WACEJ,AAAYrB,WAAZqB,UAAwB,IAAIK,IAAIH,WAAW,IAAIG,IAAIH,SAASF;IAChE,EAAE,OAAOM,OAAO;QACd,MAAM,IAAIH,UACRH,AAAYrB,WAAZqB,UACI,GAAGC,MAAM,6DAA6D,CAAC,GACvE,GAAGA,MAAM,oBAAoB,CAAC,EAClC;YAAE,OAAOK;QAAM;IAEnB;IACA,IAAI,CAACb,wBAAwB,GAAG,CAACW,SAAS,QAAQ,GAChD,MAAM,IAAID,UACR,GAAGF,MAAM,sBAAsB,EAAEG,SAAS,QAAQ,CAAC,UAAU,CAAC;IAGlE,OAAOA,SAAS,QAAQ;AAC1B;ACtBO,MAAMG,0BAA0BjB,EAAE,YAAY,CAAC;IACpD,MAAMA,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;IACjD,QAAQA,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;IACnD,MAAMA,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;AACnD;AAKO,MAAMkB,yBAAyB,CACpC3B,UAEAW,WAIE;QACA,MAAM;QACN,OAAO;QACP,aACE;QACF,gBAAgB;QAChB,aAAae;QACb,MAAM,SAAQE,GAAG;YACfd,eAAec,IAAI,MAAM,EAAE;YAC3B,MAAMC,OAAO,MAAM7B,QAAQ,OAAO,CAAC4B;YACnC,MAAME,UAA8B;gBAClC,GAAIF,AAAmB9B,WAAnB8B,IAAI,KAAK,CAAC,IAAI,GAAiB,CAAC,IAAI;oBAAE,MAAMA,IAAI,KAAK,CAAC,IAAI;gBAAC,CAAC;gBAChE,GAAIA,AAAqB9B,WAArB8B,IAAI,KAAK,CAAC,MAAM,GAAiB,CAAC,IAAI;oBAAE,QAAQA,IAAI,KAAK,CAAC,MAAM;gBAAC,CAAC;gBACtE,GAAIA,AAAmB9B,WAAnB8B,IAAI,KAAK,CAAC,IAAI,GAAiB,CAAC,IAAI;oBAAE,MAAMA,IAAI,KAAK,CAAC,IAAI;gBAAC,CAAC;YAClE;YACA,MAAMC,KAAK,OAAO,GAAG,YAAY,CAACC;YAClC,MAAMC,cAAcC,OAAO,IAAI,CAACF;YAChC,OAAO;gBACL,SACEC,AAAuB,MAAvBA,YAAY,MAAM,GACd,gCACA,CAAC,iCAAiC,EAAEA,YAAY,IAAI,CAAC,OAAO;gBAClE,MAAM;oBAAED;gBAAQ;YAClB;QACF;IACF;AC9BK,MAAMG,wBAAwBxB,EAAAA,YACtB,CAAC;IACZ,YAAYA,EAAAA,MACH,GACN,KAAK,CAAC,4BACN,QAAQ,GACR,QAAQ,CACP;IAEJ,SAASA,EAAAA,MACA,GACN,KAAK,CAAC,MACN,QAAQ,GACR,QAAQ,CAAC;IACZ,kBAAkBA,EAAAA,MACT,GACN,KAAK,CAAC,MACN,QAAQ,GACR,QAAQ,CAAC;IACZ,KAAKA,EAAAA,MACI,GACN,GAAG,GACH,QAAQ,GACR,QAAQ,CACP;AAEN,GACC,WAAW,CAAC,CAACyB,OAAON;IACnB,MAAMO,cAAc;QAClBD,MAAM,UAAU;QAChBA,MAAM,OAAO;QACbA,MAAM,gBAAgB;KACvB,CAAC,MAAM,CAAC,CAAC9B,QAAUA,AAAUN,WAAVM,OAAqB,MAAM;IAC/C,IAAI+B,AAAgB,MAAhBA,aACFP,IAAI,QAAQ,CAAC;QACX,MAAM;QACN,SACE;IACJ;AAEJ;AAeF,MAAMQ,0BAA0B,CAC9BF;IAEA,IAAIA,AAAqBpC,WAArBoC,MAAM,UAAU,EAClB,OAAO;QAAE,MAAM;QAAO,MAAMA,MAAM,UAAU;IAAC;IAE/C,IAAIA,AAAkBpC,WAAlBoC,MAAM,OAAO,EACf,OAAO;QAAE,MAAM;QAAW,MAAMA,MAAM,OAAO;IAAC;IAEhD,IAAIA,AAA2BpC,WAA3BoC,MAAM,gBAAgB,EACxB,OAAO;QAAE,MAAM;QAAiB,MAAMA,MAAM,gBAAgB;IAAC;IAE/D,MAAM,IAAIZ,UAAU;AACtB;AAEA,MAAMe,oBAAoB,CAACC,KAAaC;IACtC,IAAIA,AAAQzC,WAARyC,KACF,MAAM,IAAIjB,UACR;IAGJ,MAAMkB,WAAWF,IACd,KAAK,CAAC,KACN,GAAG,CAAC,CAACG,UAAYA,QAAQ,IAAI,IAC7B,MAAM,CAACC;IACV,IAAIF,AAAoB,MAApBA,SAAS,MAAM,EACjB,MAAM,IAAIlB,UAAU;IAEtB,OAAOkB,SAAS,GAAG,CAAC,CAACC;QACnB,MAAME,YAAYF,QAAQ,OAAO,CAAC;QAClC,IAAIE,aAAa,GACf,MAAM,IAAIrB,UACR;QAGJ,MAAMsB,OAAOH,QAAQ,KAAK,CAAC,GAAGE,WAAW,IAAI;QAC7C,MAAMvC,QAAQqC,QAAQ,KAAK,CAACE,YAAY,GAAG,IAAI;QAC/C,IAAI,CAACC,MACH,MAAM,IAAItB,UAAU;QAEtB,OAAO;YAAEsB;YAAMxC;YAAOmC;QAAI;IAC5B;AACF;AAEA,MAAMM,kBAAkB,CAACP;IACvB,IAAI;QACF,OAAOQ,KAAK,KAAK,CAACR;IACpB,EAAE,OAAM;QACN,MAAM,IAAIhB,UACR;IAEJ;AACF;AAEA,MAAMyB,sBAAsB,OAC1BC,WACAC,YACArB,KACA5B;IAEA,OAAQgD,UAAU,IAAI;QACpB,KAAK;YAAO;gBACV,IAAIE;gBACJ,IAAI;oBACFA,MAAO,MAAMlD,QAAQ,MAAM,GAAG4B,QAASuB,QAAQ,GAAG;gBACpD,EAAE,OAAM;oBACN,MAAM,IAAItD,MACR,CAAC,qCAAqC,EAAEmD,UAAU,IAAI,CAAC,uEAAuE,CAAC;gBAEnI;gBACA,MAAMV,MAAMY,GAAG,CAACF,UAAU,IAAI,CAAC;gBAC/B,IAAI,CAACV,KAAK,QACR,MAAM,IAAIzC,MACR,CAAC,qBAAqB,EAAEmD,UAAU,IAAI,CAAC,qBAAqB,CAAC;gBAGjE,MAAM3B,UAAUiB,IAAI,IAAI;gBACxB,OAAO;oBACLU;oBACA,SAAS,SAAS,IAAI,CAAC3B,WACnBwB,gBAAgBxB,WAChBgB,kBAAkBhB,SAAS4B;gBACjC;YACF;QACA,KAAK;YACH,IAAI,CAACjD,QAAQ,gBAAgB,EAC3B,MAAM,IAAIH,MACR;YAGJ,IAAI;gBACF,OAAO;oBACLmD;oBACA,SAAS,MAAMhD,QAAQ,gBAAgB,CAAC;wBACtC,SAASgD,UAAU,IAAI;wBACvB,SAASpB,IAAI,OAAO;wBACpB,QAAQA,IAAI,MAAM;oBACpB;gBACF;YACF,EAAE,OAAM;gBACN,MAAM,IAAI/B,MACR,CAAC,iCAAiC,EAAEmD,UAAU,IAAI,CAAC,uEAAuE,CAAC;YAE/H;QAEF,KAAK;YAAiB;gBACpB,MAAMI,OAAOpD,QAAQ,uBAAuB,GACxC,MAAMA,QAAQ,uBAAuB,CAACgD,UAAU,IAAI,EAAEpB,OACtDyB,QAAQF,QAAQ,GAAG,IAAIH,UAAU,IAAI;gBACzC,OAAO;oBACLA;oBACA,SAASH,gBAAgB,MAAMS,SAASF,MAAM;gBAChD;YACF;IACF;AACF;AAEA,MAAMG,kBAAkB,CACtBC,WACAP,YACAQ;IAEA,IAAI,CAACD,aAAa,AAAqB,YAArB,OAAOA,aAA0BE,MAAM,OAAO,CAACF,YAC/D,MAAM,IAAIlC,UACR,CAAC,2BAA2B,EAAEmC,MAAM,mBAAmB,CAAC;IAG5D,MAAME,SAASH;IACf,IAAI,AAAuB,YAAvB,OAAOG,OAAO,IAAI,IAAiB,CAACA,OAAO,IAAI,CAAC,IAAI,IACtD,MAAM,IAAIrC,UACR,CAAC,2BAA2B,EAAEmC,MAAM,2BAA2B,CAAC;IAGpE,IAAI,AAAwB,YAAxB,OAAOE,OAAO,KAAK,EACrB,MAAM,IAAIrC,UACR,CAAC,2BAA2B,EAAEmC,MAAM,yBAAyB,CAAC;IAIlE,MAAMG,aAAa;QAAE,GAAGD,MAAM;IAAC;IAC/B,MAAME,SAAS,AAAsB,YAAtB,OAAOF,OAAO,GAAG,IAAiBA,OAAO,GAAG,CAAC,MAAM,GAAG;IACrE,MAAMG,YACJ,AAAyB,YAAzB,OAAOH,OAAO,MAAM,IAAiBA,OAAO,MAAM,CAAC,MAAM,GAAG;IAC9D,IAAI,CAACE,UAAU,CAACC,WAAW;QACzB,IAAIb,AAAenD,WAAfmD,YACF,MAAM,IAAI3B,UACR,CAAC,2BAA2B,EAAEmC,MAAM,4DAA4D,CAAC;QAGrGG,WAAW,GAAG,GAAGX;IACnB;IACA,IAAIa,aAAa,AAAuB,YAAvB,OAAOH,OAAO,IAAI,EACjCC,WAAW,IAAI,GAAG;IAEpB,OAAOA;AACT;AAEA,MAAMG,mBAAmB,CACvBC,QACAf;IAEA,MAAMgB,aAAaP,MAAM,OAAO,CAACM,UAC7BA,SACAA,UACE,AAAkB,YAAlB,OAAOA,UACPN,MAAM,OAAO,CAAEM,OAAiC,OAAO,IACtDA,OAAkC,OAAO,GAC1ClE;IACN,IAAI,CAACmE,YACH,MAAM,IAAI3C,UACR;IAGJ,IAAI2C,AAAsB,MAAtBA,WAAW,MAAM,EACnB,MAAM,IAAI3C,UAAU;IAEtB,OAAO2C,WAAW,GAAG,CAAC,CAACN,QAAQF,QAC7BF,gBAAgBI,QAAQV,YAAYQ;AAExC;AAEO,MAAMS,uBAAuB,CAClClE,UAEAW,WAAyE;QACvE,MAAM;QACN,OAAO;QACP,aACE;QACF,gBAAgB;QAChB,aAAasB;QACb,MAAM,SAAQL,GAAG;YACfd,eAAec,IAAI,MAAM,EAAE;YAC3B,MAAMC,OAAO,MAAM7B,QAAQ,OAAO,CAAC4B;YACnC,MAAMqB,aACJrB,AAAkB9B,WAAlB8B,IAAI,KAAK,CAAC,GAAG,GACT9B,SACAmB,cAAcW,IAAI,KAAK,CAAC,GAAG,EAAE9B,QAAW;YAC9C,MAAMkD,YAAYZ,wBAAwBR,IAAI,KAAK;YACnD,MAAML,WAAW,MAAMwB,oBACrBC,WACAC,YACArB,KACA5B;YAEF,MAAMmE,UAAUJ,iBAAiBxC,SAAS,OAAO,EAAE0B;YAEnDnC,eAAec,IAAI,MAAM,EAAE;YAC3B,IAAI;gBACF,MAAMC,KAAK,OAAO,GAAG,UAAU,CAACsC;YAClC,EAAE,OAAM;gBACN,MAAM,IAAItE,MACR,CAAC,cAAc,EAAEsE,QAAQ,MAAM,CAAC,wFAAwF,CAAC;YAE7H;YAEA,MAAMC,SAA+B;gBACnC,QAAQ7C,SAAS,SAAS,CAAC,IAAI;gBAC/B,YAAYA,SAAS,SAAS,CAAC,IAAI;gBACnC,OAAO4C,QAAQ,MAAM;YACvB;YACA,OAAO;gBACL,SAAS,CAAC,IAAI,EAAEC,OAAO,KAAK,CAAC,wBAAwB,EAAEA,OAAO,MAAM,CAAC,QAAQ,EAAEA,OAAO,UAAU,EAAE;gBAClG,MAAMA;YACR;QACF;IACF;AC1SF,MAAMC,gCAAgC;AACtC,MAAMC,qBAAqB;AAGpB,MAAMC,qBAAqB9D,EAAE,YAAY,CAAC;IAC/C,KAAKA,EAAAA,MACI,GACN,GAAG,CAAC,GACJ,QAAQ,CAAC;IACZ,WAAWA,CAAC,CAADA,OACJ,CAAC;QAAC;QAAU;QAAoB;QAAQ;KAAc,EAC1D,OAAO,CAAC6D,oBACR,QAAQ,CAAC;IACZ,WAAW7D,EAAAA,MACF,GACN,QAAQ,GACR,OAAO,CAAC4D,+BACR,QAAQ,CAAC;AACd;AAeO,MAAMG,oBAAoB,CAC/BxE,UAEAW,WAAmE;QACjE,MAAM;QACN,OAAO;QACP,aACE;QACF,gBAAgB;QAChB,aAAa4D;QACb,MAAM,SAAQ3C,GAAG;YACfd,eAAec,IAAI,MAAM,EAAE;YAC3B,MAAMC,OAAO,MAAM7B,QAAQ,OAAO,CAAC4B;YACnC,MAAMT,UAAU,MAAMnB,QAAQ,UAAU,GAAG4B;YAC3C,MAAMW,MAAMtB,cAAcW,IAAI,KAAK,CAAC,GAAG,EAAET,SAAS;YAClD,MAAMsD,WAAW,MAAM5C,KAAK,IAAI,CAACU,KAAK;gBACpC,WAAWX,IAAI,KAAK,CAAC,SAAS;gBAC9B,SAASA,IAAI,KAAK,CAAC,SAAS;YAC9B;YACA,MAAM8C,SAASD,UAAU,YAAY;YACrC,MAAML,SAAS;gBACb,KAAKvC,KAAK,GAAG;gBACb6C;gBACA,OAAO,MAAM7C,KAAK,KAAK;YACzB;YACA,OAAO;gBAAE,SAAS,CAAC,aAAa,EAAEuC,OAAO,GAAG,EAAE;gBAAE,MAAMA;YAAO;QAC/D;IACF;AC3DK,MAAMO,6BAA6BlE,EAAE,YAAY,CAAC;IACvD,OAAOA,EAAE,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,QAAQA,EAAAA,MACC,GACN,GAAG,GACH,QAAQ,GACR,QAAQ,CAAC;AACd;AAOO,MAAMmE,4BAA4B,CACvC5E,UAEAW,WAIE;QACA,MAAM;QACN,OAAO;QACP,aACE;QACF,gBAAgB;QAChB,aAAagE;QACb,MAAM,SAAQ/C,GAAG;YACfd,eAAec,IAAI,MAAM,EAAE;YAC3B,MAAMC,OAAO,MAAM7B,QAAQ,OAAO,CAAC4B;YACnC,MAAMC,KAAK,eAAe,CAAC;gBACzB,OAAOD,IAAI,KAAK,CAAC,KAAK;gBACtB,QAAQA,IAAI,KAAK,CAAC,MAAM;YAC1B;YACA,MAAMiD,WAAWhD,KAAK,YAAY;YAClC,IAAI,CAACgD,UACH,MAAM,IAAIhF,MACR;YAGJ,OAAO;gBACL,SAAS,CAAC,gBAAgB,EAAEgF,SAAS,KAAK,CAAC,CAAC,EAAEA,SAAS,MAAM,EAAE;gBAC/D,MAAMA;YACR;QACF;IACF;AC7BF,MAAMC,iBAAiB,CACrB9E;IAEA,IAAI,CAACA,WAAW,AAAmB,YAAnB,OAAOA,SACrB,MAAM,IAAIC,oBACR;IAGJ,IAAI,AAA2B,cAA3B,OAAOD,QAAQ,OAAO,EACxB,MAAM,IAAIC,oBACR;AAGN;AAOO,SAAS8E,sBACd/E,OAA+C;IAE/C8E,eAAe9E;IACf,OAAO;QACLwE,kBAAkBxE;QAClBkE,qBAAqBlE;QACrB2B,uBAAuB3B;QACvB4E,0BAA0B5E;KAC3B;AACH"}