@unotest/web 0.41.0 → 0.43.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.
package/README.md CHANGED
@@ -34,6 +34,11 @@ self-installs on the first `lint` / `e2e` run after upgrading; refresh by
34
34
  hand with `npx @unotest/web types`. Details: the "Editor setup" section of
35
35
  `node_modules/@unotest/web/guides/dsl-reference.md`.
36
36
 
37
+ Testing a browser extension? `launch` in `unotest.config` starts the browser
38
+ with a profile (`userDataDir`) and extra arguments (`args`, e.g.
39
+ `--load-extension=./ext`; Chromium only). On a profile every scenario shares
40
+ one browser context — no isolation between them, and the run log says so.
41
+
37
42
  ## 2. Open the viewer
38
43
 
39
44
  ```sh
@@ -147,15 +152,47 @@ npx @unotest/web box create # rents a box named after the project, size S
147
152
  boxes — and keeps the key in `~/.config/unotest/credentials.json`
148
153
  (mode 0600). `box create` creates the box with the environments the
149
154
  suite already runs locally (each `unotest/.env.<name>` and its
150
- `APP_BASE_URL`), asks for a top-up when the balance is short (it prints
151
- the Checkout link and waits for the payment), waits for the box, writes
155
+ `APP_BASE_URL`), waits for the box, writes
152
156
  `UNOTEST_BOX_URL` to `unotest/.env` and the push and read tokens to
153
157
  `unotest/.secrets`, pushes the suite and prints the viewer's address.
154
158
  The tokens live thirty days; `bundle push` and `box …` re-mint them
155
159
  through the cloud when a box says they have expired, and `box access`
156
- does it on demand. `box status` and `box destroy` do what they say;
157
- `whoami` and `logout` complete the set. In CI, export
158
- `UNOTEST_CLOUD_TOKEN` instead of signing in.
160
+ does it on demand. `box list` shows every box on the account, `box status`
161
+ one of them, and `box logs` the end of a box's own log without logging in to
162
+ it; `box destroy` does what it says, and `whoami` and `logout` complete the
163
+ set. In CI, export `UNOTEST_CLOUD_TOKEN` instead of signing in.
164
+
165
+ Credit is added in the cabinet, by card, under "Add credit" on its home page
166
+ — never from the terminal. When the balance does not cover a new box's first
167
+ hour, `box create` says how much is missing (as far as the key may read the
168
+ balance) and where to add it, and exits 75 with nothing created and nothing
169
+ charged; run it again once the credit is there.
170
+
171
+ Anything that spends money or cannot be undone — creating a box, deleting
172
+ one, switching the Picker on — **waits for a person** unless the key is a CI
173
+ key. The CLI prints where to approve it and how long the request lives, waits
174
+ there, and then carries on exactly as if the call had gone straight through.
175
+ Nobody answers in ten minutes: exit code 75, nothing created and nothing
176
+ charged, run the command again. Somebody declines: exit code 2. `--yes` does
177
+ not change any of this — the flag says the terminal need not ask, not that
178
+ the account need not.
179
+ `approvals` lists what is waiting, and `approvals <id>` says what became of
180
+ one.
181
+
182
+ An agent does the same through the MCP server's `cloud_*` tools — listing,
183
+ renting, deleting, logs, the balance — with the same key and the same rules:
184
+ a rent or a delete comes back as a request to wait on, and
185
+ `cloud_approval_wait` waits for the person's answer.
186
+
187
+ A key carries **permissions**. `login` asks for enough to see the
188
+ account's boxes and work with them, never its money, and the approval
189
+ page in the browser is where you can narrow that further; `login` and
190
+ `whoami` print what the key ended up with. A key that may not read the
191
+ balance is still a working key — `whoami` says the balance is not
192
+ visible to it instead of failing — and a call it may not make comes
193
+ back as `insufficient-scope`, which no amount of signing in again will
194
+ change. Keys for an agent are issued in the cabinet, with the
195
+ permissions ticked there.
159
196
 
160
197
  The **Picker** — grounding intent locators on the box's grounder — comes
161
198
  with the box today: it lists at €0.05–€0.13 an hour depending on size,
@@ -182,6 +219,27 @@ Picker is on — which models the cloud grounds with: `Our GPU` or
182
219
  `UNOTEST_GROUNDER_MODE`; a cloud that has not heard from its grounder
183
220
  prints nothing rather than a guess.
184
221
 
222
+ **How a suite got installed is visible too.** `box envs` prints, under
223
+ each environment, how long the box took to install its bundle and where
224
+ the packages came from — `installed in 12.3s from this box's cache (252
225
+ of 252 from cache)`. `box run <id>` prints the same line for the bundle
226
+ that run came from, while the environment still serves it. The source is
227
+ the box's own measurement (what its npm cache already held of what the
228
+ lockfile names), not a reading of npm's output: on a fast registry a cold
229
+ install and a warm one take the same number of seconds, so the time alone
230
+ proves nothing. A box that says nothing about installs — one older than
231
+ this — prints nothing extra.
232
+
233
+ **A box never updates itself.** `box status` prints its version — what it
234
+ runs, and what its channel offers when the two differ. A new release is an
235
+ offer: the box keeps running what it is on until somebody presses **Update**
236
+ on its card in the cabinet, or an agent calls
237
+ `POST /api/v1/boxes/<name>/update` with the version it was offered (a
238
+ version that has since been overtaken is refused, with the one that is on
239
+ offer now). There is no `box update` command: the decision is a person's,
240
+ and the cabinet is where it is made. A cloud that reports no versions leaves
241
+ `box status` silent about them.
242
+
185
243
  **Without a box.** An account can have the Picker on with no box rented
186
244
  at all; the switch and the price for that live in the cabinet, and
187
245
  `picker on` connects THIS project to it — it fetches the project's own
@@ -336,7 +394,11 @@ and can be revoked. Either way it is read-only whatever your role on the
336
394
  box — it cannot start a run or change a value. `UNOTEST_BOX_TOKEN` is the
337
395
  project's push credential and cannot read runs. `box envs` lists the
338
396
  environments the box serves — an empty list means the box has none yet,
339
- not that the token is too weak to see them.
397
+ not that the token is too weak to see them. The commands that name one
398
+ (`box runs`, `box queue`, `box run`, …) say the same thing rather than
399
+ sending the name to a box that has nothing to match it against: a box
400
+ that names none has none configured, which is ours to put right. A run
401
+ you have just ordered may take a moment to appear.
340
402
 
341
403
  ## 5. Watch it run — the viewer
342
404
 
@@ -10,12 +10,19 @@ type Browser = z.infer<typeof BrowserSchema>;
10
10
  * Ignored for firefox / webkit browsers (Playwright has no system
11
11
  * channel for those). Chosen at init time via the browser prompt;
12
12
  * user can flip later in unotest.config.{mjs,js,ts}. */
13
- declare const BrowserChannelSchema: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<"chrome">, z.ZodLiteral<"msedge">, z.ZodLiteral<"chrome-beta">, z.ZodNull]>>;
13
+ declare const SYSTEM_BROWSER_CHANNELS: readonly ["chrome", "msedge", "chrome-beta", "chromium"];
14
+ /** Every word either input accepts, in one place: this schema and the
15
+ * reader of `UNOTEST_BROWSER_CHANNEL` (`runner-env.ts`) take the same
16
+ * list. They used to keep two — `bundled` was a word the variable knew
17
+ * and the config refused, while the `.env` template promised the
18
+ * variable merely "overrides channel" (#209). */
19
+ declare const BROWSER_CHANNEL_WORDS: readonly ["chrome", "msedge", "chrome-beta", "chromium", "bundled"];
20
+ declare const BrowserChannelSchema: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["chrome", "msedge", "chrome-beta", "chromium"]>, z.ZodEffects<z.ZodLiteral<"bundled">, null, "bundled">, z.ZodNull]>>;
14
21
  type BrowserChannel = z.infer<typeof BrowserChannelSchema>;
15
22
  declare const ViewportSchema: z.ZodObject<{
16
23
  width: z.ZodNumber;
17
24
  height: z.ZodNumber;
18
- }, "strip", z.ZodTypeAny, {
25
+ }, "strict", z.ZodTypeAny, {
19
26
  width: number;
20
27
  height: number;
21
28
  }, {
@@ -28,12 +35,12 @@ type RetryReason = z.infer<typeof RetryReasonSchema>;
28
35
  declare const RetryConfigSchema: z.ZodObject<{
29
36
  count: z.ZodNumber;
30
37
  on: z.ZodArray<z.ZodEnum<["transient", "network", "crash"]>, "many">;
31
- }, "strip", z.ZodTypeAny, {
38
+ }, "strict", z.ZodTypeAny, {
32
39
  count: number;
33
- on: ("network" | "transient" | "crash")[];
40
+ on: ("transient" | "network" | "crash")[];
34
41
  }, {
35
42
  count: number;
36
- on: ("network" | "transient" | "crash")[];
43
+ on: ("transient" | "network" | "crash")[];
37
44
  }>;
38
45
  type RetryConfig = z.infer<typeof RetryConfigSchema>;
39
46
  declare const FailureBundleConfigSchema: z.ZodObject<{
@@ -44,7 +51,7 @@ declare const FailureBundleConfigSchema: z.ZodObject<{
44
51
  tier3: z.ZodObject<{
45
52
  network: z.ZodBoolean;
46
53
  video: z.ZodBoolean;
47
- }, "strip", z.ZodTypeAny, {
54
+ }, "strict", z.ZodTypeAny, {
48
55
  network: boolean;
49
56
  video: boolean;
50
57
  }, {
@@ -54,7 +61,7 @@ declare const FailureBundleConfigSchema: z.ZodObject<{
54
61
  retention: z.ZodObject<{
55
62
  runs: z.ZodNumber;
56
63
  days: z.ZodNumber;
57
- }, "strip", z.ZodTypeAny, {
64
+ }, "strict", z.ZodTypeAny, {
58
65
  runs: number;
59
66
  days: number;
60
67
  }, {
@@ -62,7 +69,7 @@ declare const FailureBundleConfigSchema: z.ZodObject<{
62
69
  days: number;
63
70
  }>;
64
71
  storageDir: z.ZodString;
65
- }, "strip", z.ZodTypeAny, {
72
+ }, "strict", z.ZodTypeAny, {
66
73
  tier1: true;
67
74
  tier2: boolean;
68
75
  tier3: {
@@ -90,19 +97,19 @@ declare const FailureBundleConfigSchema: z.ZodObject<{
90
97
  type FailureBundleConfig = z.infer<typeof FailureBundleConfigSchema>;
91
98
  declare const DialogPolicySchema: z.ZodEnum<["accept", "dismiss", "manual"]>;
92
99
  type DialogPolicy = z.infer<typeof DialogPolicySchema>;
93
- declare const LinterRuleIdSchema: z.ZodEnum<["lint:deep-css", "lint:xpath", "lint:obfuscated-class", "lint:pause-explicit", "lint:disambig-by-index", "lint:evaluate-discouraged", "lint:scenario-in-root", "lint:mustache-in-dsl", "lint:goto-concat", "lint:regex-invalid", "lint:echo-assert", "lint:api-call-file-body", "lint:lint-ok-missing-reason", "lint:flow-returns-value", "lint:legacy-layout", "lint:external-variable-undeclared", "lint:one-test-per-file", "validator:unknown-function", "validator:arity", "validator:arg-kind", "validator:step-coverage", "validator:step-shape", "validator:meta-shape", "validator:function-shape", "validator:for-shape", "validator:if-shape", "validator:var-shape", "validator:unsupported-statement", "validator:unsupported-expression", "validator:string-concat", "validator:semantic-loss", "validator:list-arg", "validator:wrapped-format"]>;
100
+ declare const LinterRuleIdSchema: z.ZodEnum<["lint:deep-css", "lint:xpath", "lint:obfuscated-class", "lint:pause-explicit", "lint:disambig-by-index", "lint:evaluate-discouraged", "lint:scenario-in-root", "lint:mustache-in-dsl", "lint:goto-concat", "lint:regex-invalid", "lint:echo-assert", "lint:api-call-file-body", "lint:lint-ok-missing-reason", "lint:flow-returns-value", "lint:legacy-layout", "lint:external-variable-undeclared", "lint:env-host-from-base", "lint:one-test-per-file", "validator:unknown-function", "validator:arity", "validator:arg-kind", "validator:step-coverage", "validator:step-shape", "validator:meta-shape", "validator:function-shape", "validator:for-shape", "validator:if-shape", "validator:var-shape", "validator:unsupported-statement", "validator:unsupported-expression", "validator:string-concat", "validator:semantic-loss", "validator:list-arg", "validator:wrapped-format"]>;
94
101
  type LinterRuleId = z.infer<typeof LinterRuleIdSchema>;
95
102
  declare const LinterSeveritySchema: z.ZodEnum<["off", "warn", "error"]>;
96
103
  type LinterSeverity = z.infer<typeof LinterSeveritySchema>;
97
104
  declare const LinterConfigSchema: z.ZodObject<{
98
105
  enabled: z.ZodBoolean;
99
- rules: z.ZodRecord<z.ZodEnum<["lint:deep-css", "lint:xpath", "lint:obfuscated-class", "lint:pause-explicit", "lint:disambig-by-index", "lint:evaluate-discouraged", "lint:scenario-in-root", "lint:mustache-in-dsl", "lint:goto-concat", "lint:regex-invalid", "lint:echo-assert", "lint:api-call-file-body", "lint:lint-ok-missing-reason", "lint:flow-returns-value", "lint:legacy-layout", "lint:external-variable-undeclared", "lint:one-test-per-file", "validator:unknown-function", "validator:arity", "validator:arg-kind", "validator:step-coverage", "validator:step-shape", "validator:meta-shape", "validator:function-shape", "validator:for-shape", "validator:if-shape", "validator:var-shape", "validator:unsupported-statement", "validator:unsupported-expression", "validator:string-concat", "validator:semantic-loss", "validator:list-arg", "validator:wrapped-format"]>, z.ZodEnum<["off", "warn", "error"]>>;
100
- }, "strip", z.ZodTypeAny, {
106
+ rules: z.ZodRecord<z.ZodEnum<["lint:deep-css", "lint:xpath", "lint:obfuscated-class", "lint:pause-explicit", "lint:disambig-by-index", "lint:evaluate-discouraged", "lint:scenario-in-root", "lint:mustache-in-dsl", "lint:goto-concat", "lint:regex-invalid", "lint:echo-assert", "lint:api-call-file-body", "lint:lint-ok-missing-reason", "lint:flow-returns-value", "lint:legacy-layout", "lint:external-variable-undeclared", "lint:env-host-from-base", "lint:one-test-per-file", "validator:unknown-function", "validator:arity", "validator:arg-kind", "validator:step-coverage", "validator:step-shape", "validator:meta-shape", "validator:function-shape", "validator:for-shape", "validator:if-shape", "validator:var-shape", "validator:unsupported-statement", "validator:unsupported-expression", "validator:string-concat", "validator:semantic-loss", "validator:list-arg", "validator:wrapped-format"]>, z.ZodEnum<["off", "warn", "error"]>>;
107
+ }, "strict", z.ZodTypeAny, {
101
108
  enabled: boolean;
102
- rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
109
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
103
110
  }, {
104
111
  enabled: boolean;
105
- rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
112
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
106
113
  }>;
107
114
  type LinterConfig = z.infer<typeof LinterConfigSchema>;
108
115
  declare const QueueConfigSchema: z.ZodObject<{
@@ -112,7 +119,7 @@ declare const QueueConfigSchema: z.ZodObject<{
112
119
  /** How many runs may be in flight for one environment. 1 (the default)
113
120
  * is strict FIFO — the machine runs one thing at a time. */
114
121
  concurrency: z.ZodDefault<z.ZodNumber>;
115
- }, "strip", z.ZodTypeAny, {
122
+ }, "strict", z.ZodTypeAny, {
116
123
  enabled: boolean;
117
124
  concurrency: number;
118
125
  }, {
@@ -136,7 +143,7 @@ declare const ScheduleSchema: z.ZodObject<{
136
143
  * — seeding a database, resetting a fixture. Its failure is reported
137
144
  * as "the environment was not prepared", not as a red suite. */
138
145
  prepare: z.ZodOptional<z.ZodString>;
139
- }, "strip", z.ZodTypeAny, {
146
+ }, "strict", z.ZodTypeAny, {
140
147
  collection: string;
141
148
  cron: string;
142
149
  env?: string | undefined;
@@ -150,7 +157,7 @@ declare const ScheduleSchema: z.ZodObject<{
150
157
  type ScheduleConfig = z.infer<typeof ScheduleSchema>;
151
158
  declare const McpConfigSchema: z.ZodObject<{
152
159
  transport: z.ZodLiteral<"stdio">;
153
- }, "strip", z.ZodTypeAny, {
160
+ }, "strict", z.ZodTypeAny, {
154
161
  transport: "stdio";
155
162
  }, {
156
163
  transport: "stdio";
@@ -182,7 +189,7 @@ declare const SandboxConfigSchema: z.ZodObject<{
182
189
  * against it and may not escape it. Defaults to the project root
183
190
  * (the runner's cwd). */
184
191
  uploadDir: z.ZodOptional<z.ZodString>;
185
- }, "strip", z.ZodTypeAny, {
192
+ }, "strict", z.ZodTypeAny, {
186
193
  shellCwd?: string | undefined;
187
194
  shellTimeoutMs?: number | undefined;
188
195
  exportSecrets?: string[] | undefined;
@@ -214,18 +221,29 @@ declare const WebServerConfigSchema: z.ZodObject<{
214
221
  reuseExistingServer: z.ZodDefault<z.ZodBoolean>;
215
222
  /** How long to wait for the URL to come up after spawning. */
216
223
  timeoutMs: z.ZodDefault<z.ZodNumber>;
217
- }, "strip", z.ZodTypeAny, {
218
- url: string;
219
- timeoutMs: number;
224
+ }, "strict", z.ZodTypeAny, {
220
225
  command: string;
226
+ url: string;
221
227
  reuseExistingServer: boolean;
228
+ timeoutMs: number;
222
229
  }, {
223
- url: string;
224
230
  command: string;
225
- timeoutMs?: number | undefined;
231
+ url: string;
226
232
  reuseExistingServer?: boolean | undefined;
233
+ timeoutMs?: number | undefined;
227
234
  }>;
228
235
  type WebServerConfig = z.infer<typeof WebServerConfigSchema>;
236
+ declare const EnvConfigSchema: z.ZodObject<{
237
+ /** Variable names whose base `.env` value is deliberately shared by
238
+ * every environment. Only names that become a HOST are checked, so
239
+ * listing anything else has no effect. */
240
+ shared: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
241
+ }, "strict", z.ZodTypeAny, {
242
+ shared: string[];
243
+ }, {
244
+ shared?: string[] | undefined;
245
+ }>;
246
+ type EnvConfig = z.infer<typeof EnvConfigSchema>;
229
247
  declare const UnotestConfigSchema: z.ZodObject<{
230
248
  baseUrl: z.ZodOptional<z.ZodString>;
231
249
  /** Dev-server lifecycle for the app under test (M-12). Unset → the app
@@ -248,38 +266,51 @@ declare const UnotestConfigSchema: z.ZodObject<{
248
266
  reuseExistingServer: z.ZodDefault<z.ZodBoolean>;
249
267
  /** How long to wait for the URL to come up after spawning. */
250
268
  timeoutMs: z.ZodDefault<z.ZodNumber>;
251
- }, "strip", z.ZodTypeAny, {
252
- url: string;
253
- timeoutMs: number;
269
+ }, "strict", z.ZodTypeAny, {
254
270
  command: string;
271
+ url: string;
255
272
  reuseExistingServer: boolean;
273
+ timeoutMs: number;
256
274
  }, {
257
- url: string;
258
275
  command: string;
259
- timeoutMs?: number | undefined;
276
+ url: string;
260
277
  reuseExistingServer?: boolean | undefined;
278
+ timeoutMs?: number | undefined;
261
279
  }>>;
262
280
  browsers: z.ZodArray<z.ZodEnum<["chromium", "firefox", "webkit"]>, "many">;
263
- channel: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<"chrome">, z.ZodLiteral<"msedge">, z.ZodLiteral<"chrome-beta">, z.ZodNull]>>;
281
+ channel: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["chrome", "msedge", "chrome-beta", "chromium"]>, z.ZodEffects<z.ZodLiteral<"bundled">, null, "bundled">, z.ZodNull]>>;
264
282
  viewport: z.ZodObject<{
265
283
  width: z.ZodNumber;
266
284
  height: z.ZodNumber;
267
- }, "strip", z.ZodTypeAny, {
285
+ }, "strict", z.ZodTypeAny, {
268
286
  width: number;
269
287
  height: number;
270
288
  }, {
271
289
  width: number;
272
290
  height: number;
273
291
  }>;
292
+ /** How the browser is started: a profile and extra arguments
293
+ * (`config/launch.ts`). Unset → as before: a fresh browser, a fresh
294
+ * context per scenario. */
295
+ launch: z.ZodOptional<z.ZodObject<{
296
+ userDataDir: z.ZodOptional<z.ZodString>;
297
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
298
+ }, "strict", z.ZodTypeAny, {
299
+ userDataDir?: string | undefined;
300
+ args?: string[] | undefined;
301
+ }, {
302
+ userDataDir?: string | undefined;
303
+ args?: string[] | undefined;
304
+ }>>;
274
305
  retry: z.ZodObject<{
275
306
  count: z.ZodNumber;
276
307
  on: z.ZodArray<z.ZodEnum<["transient", "network", "crash"]>, "many">;
277
- }, "strip", z.ZodTypeAny, {
308
+ }, "strict", z.ZodTypeAny, {
278
309
  count: number;
279
- on: ("network" | "transient" | "crash")[];
310
+ on: ("transient" | "network" | "crash")[];
280
311
  }, {
281
312
  count: number;
282
- on: ("network" | "transient" | "crash")[];
313
+ on: ("transient" | "network" | "crash")[];
283
314
  }>;
284
315
  failureBundle: z.ZodObject<{
285
316
  /** Tier 1 is always on by D-16. Schema lock — not user-toggleable. */
@@ -289,7 +320,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
289
320
  tier3: z.ZodObject<{
290
321
  network: z.ZodBoolean;
291
322
  video: z.ZodBoolean;
292
- }, "strip", z.ZodTypeAny, {
323
+ }, "strict", z.ZodTypeAny, {
293
324
  network: boolean;
294
325
  video: boolean;
295
326
  }, {
@@ -299,7 +330,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
299
330
  retention: z.ZodObject<{
300
331
  runs: z.ZodNumber;
301
332
  days: z.ZodNumber;
302
- }, "strip", z.ZodTypeAny, {
333
+ }, "strict", z.ZodTypeAny, {
303
334
  runs: number;
304
335
  days: number;
305
336
  }, {
@@ -307,7 +338,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
307
338
  days: number;
308
339
  }>;
309
340
  storageDir: z.ZodString;
310
- }, "strip", z.ZodTypeAny, {
341
+ }, "strict", z.ZodTypeAny, {
311
342
  tier1: true;
312
343
  tier2: boolean;
313
344
  tier3: {
@@ -353,19 +384,30 @@ declare const UnotestConfigSchema: z.ZodObject<{
353
384
  * slow-but-correct navigation.
354
385
  * Override via `UNOTEST_DEFAULT_NAVIGATION_TIMEOUT_MS`. */
355
386
  defaultNavigationTimeoutMs: z.ZodNumber;
387
+ /** Cross-environment declarations (`.env.<name>` overlays). */
388
+ env: z.ZodObject<{
389
+ /** Variable names whose base `.env` value is deliberately shared by
390
+ * every environment. Only names that become a HOST are checked, so
391
+ * listing anything else has no effect. */
392
+ shared: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
393
+ }, "strict", z.ZodTypeAny, {
394
+ shared: string[];
395
+ }, {
396
+ shared?: string[] | undefined;
397
+ }>;
356
398
  linter: z.ZodObject<{
357
399
  enabled: z.ZodBoolean;
358
- rules: z.ZodRecord<z.ZodEnum<["lint:deep-css", "lint:xpath", "lint:obfuscated-class", "lint:pause-explicit", "lint:disambig-by-index", "lint:evaluate-discouraged", "lint:scenario-in-root", "lint:mustache-in-dsl", "lint:goto-concat", "lint:regex-invalid", "lint:echo-assert", "lint:api-call-file-body", "lint:lint-ok-missing-reason", "lint:flow-returns-value", "lint:legacy-layout", "lint:external-variable-undeclared", "lint:one-test-per-file", "validator:unknown-function", "validator:arity", "validator:arg-kind", "validator:step-coverage", "validator:step-shape", "validator:meta-shape", "validator:function-shape", "validator:for-shape", "validator:if-shape", "validator:var-shape", "validator:unsupported-statement", "validator:unsupported-expression", "validator:string-concat", "validator:semantic-loss", "validator:list-arg", "validator:wrapped-format"]>, z.ZodEnum<["off", "warn", "error"]>>;
359
- }, "strip", z.ZodTypeAny, {
400
+ rules: z.ZodRecord<z.ZodEnum<["lint:deep-css", "lint:xpath", "lint:obfuscated-class", "lint:pause-explicit", "lint:disambig-by-index", "lint:evaluate-discouraged", "lint:scenario-in-root", "lint:mustache-in-dsl", "lint:goto-concat", "lint:regex-invalid", "lint:echo-assert", "lint:api-call-file-body", "lint:lint-ok-missing-reason", "lint:flow-returns-value", "lint:legacy-layout", "lint:external-variable-undeclared", "lint:env-host-from-base", "lint:one-test-per-file", "validator:unknown-function", "validator:arity", "validator:arg-kind", "validator:step-coverage", "validator:step-shape", "validator:meta-shape", "validator:function-shape", "validator:for-shape", "validator:if-shape", "validator:var-shape", "validator:unsupported-statement", "validator:unsupported-expression", "validator:string-concat", "validator:semantic-loss", "validator:list-arg", "validator:wrapped-format"]>, z.ZodEnum<["off", "warn", "error"]>>;
401
+ }, "strict", z.ZodTypeAny, {
360
402
  enabled: boolean;
361
- rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
403
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
362
404
  }, {
363
405
  enabled: boolean;
364
- rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
406
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
365
407
  }>;
366
408
  mcp: z.ZodObject<{
367
409
  transport: z.ZodLiteral<"stdio">;
368
- }, "strip", z.ZodTypeAny, {
410
+ }, "strict", z.ZodTypeAny, {
369
411
  transport: "stdio";
370
412
  }, {
371
413
  transport: "stdio";
@@ -377,7 +419,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
377
419
  /** How many runs may be in flight for one environment. 1 (the default)
378
420
  * is strict FIFO — the machine runs one thing at a time. */
379
421
  concurrency: z.ZodDefault<z.ZodNumber>;
380
- }, "strip", z.ZodTypeAny, {
422
+ }, "strict", z.ZodTypeAny, {
381
423
  enabled: boolean;
382
424
  concurrency: number;
383
425
  }, {
@@ -401,7 +443,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
401
443
  * — seeding a database, resetting a fixture. Its failure is reported
402
444
  * as "the environment was not prepared", not as a red suite. */
403
445
  prepare: z.ZodOptional<z.ZodString>;
404
- }, "strip", z.ZodTypeAny, {
446
+ }, "strict", z.ZodTypeAny, {
405
447
  collection: string;
406
448
  cron: string;
407
449
  env?: string | undefined;
@@ -438,7 +480,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
438
480
  * against it and may not escape it. Defaults to the project root
439
481
  * (the runner's cwd). */
440
482
  uploadDir: z.ZodOptional<z.ZodString>;
441
- }, "strip", z.ZodTypeAny, {
483
+ }, "strict", z.ZodTypeAny, {
442
484
  shellCwd?: string | undefined;
443
485
  shellTimeoutMs?: number | undefined;
444
486
  exportSecrets?: string[] | undefined;
@@ -453,7 +495,10 @@ declare const UnotestConfigSchema: z.ZodObject<{
453
495
  apiBaseUrl?: string | undefined;
454
496
  uploadDir?: string | undefined;
455
497
  }>;
456
- }, "strip", z.ZodTypeAny, {
498
+ }, "strict", z.ZodTypeAny, {
499
+ env: {
500
+ shared: string[];
501
+ };
457
502
  browsers: ("chromium" | "firefox" | "webkit")[];
458
503
  viewport: {
459
504
  width: number;
@@ -461,7 +506,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
461
506
  };
462
507
  retry: {
463
508
  count: number;
464
- on: ("network" | "transient" | "crash")[];
509
+ on: ("transient" | "network" | "crash")[];
465
510
  };
466
511
  failureBundle: {
467
512
  tier1: true;
@@ -483,7 +528,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
483
528
  defaultNavigationTimeoutMs: number;
484
529
  linter: {
485
530
  enabled: boolean;
486
- rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
531
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
487
532
  };
488
533
  mcp: {
489
534
  transport: "stdio";
@@ -508,14 +553,21 @@ declare const UnotestConfigSchema: z.ZodObject<{
508
553
  };
509
554
  baseUrl?: string | undefined;
510
555
  webServer?: {
511
- url: string;
512
- timeoutMs: number;
513
556
  command: string;
557
+ url: string;
514
558
  reuseExistingServer: boolean;
559
+ timeoutMs: number;
560
+ } | undefined;
561
+ channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | null | undefined;
562
+ launch?: {
563
+ userDataDir?: string | undefined;
564
+ args?: string[] | undefined;
515
565
  } | undefined;
516
- channel?: "chrome" | "msedge" | "chrome-beta" | null | undefined;
517
566
  storageState?: string | undefined;
518
567
  }, {
568
+ env: {
569
+ shared?: string[] | undefined;
570
+ };
519
571
  browsers: ("chromium" | "firefox" | "webkit")[];
520
572
  viewport: {
521
573
  width: number;
@@ -523,7 +575,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
523
575
  };
524
576
  retry: {
525
577
  count: number;
526
- on: ("network" | "transient" | "crash")[];
578
+ on: ("transient" | "network" | "crash")[];
527
579
  };
528
580
  failureBundle: {
529
581
  tier2: boolean;
@@ -545,7 +597,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
545
597
  defaultNavigationTimeoutMs: number;
546
598
  linter: {
547
599
  enabled: boolean;
548
- rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
600
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
549
601
  };
550
602
  mcp: {
551
603
  transport: "stdio";
@@ -564,12 +616,16 @@ declare const UnotestConfigSchema: z.ZodObject<{
564
616
  };
565
617
  baseUrl?: string | undefined;
566
618
  webServer?: {
567
- url: string;
568
619
  command: string;
569
- timeoutMs?: number | undefined;
620
+ url: string;
570
621
  reuseExistingServer?: boolean | undefined;
622
+ timeoutMs?: number | undefined;
623
+ } | undefined;
624
+ channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | "bundled" | null | undefined;
625
+ launch?: {
626
+ userDataDir?: string | undefined;
627
+ args?: string[] | undefined;
571
628
  } | undefined;
572
- channel?: "chrome" | "msedge" | "chrome-beta" | null | undefined;
573
629
  storageState?: string | undefined;
574
630
  schedules?: {
575
631
  collection: string;
@@ -582,4 +638,4 @@ type UnotestConfig = z.infer<typeof UnotestConfigSchema>;
582
638
  type UnotestConfigInput = z.input<typeof UnotestConfigSchema>;
583
639
  declare const DEFAULT_CONFIG: UnotestConfig;
584
640
 
585
- export { type Browser, type BrowserChannel, BrowserChannelSchema, BrowserSchema, DEFAULT_CONFIG, type DialogPolicy, DialogPolicySchema, type FailureBundleConfig, FailureBundleConfigSchema, type LinterConfig, LinterConfigSchema, type LinterRuleId, LinterRuleIdSchema, type LinterSeverity, LinterSeveritySchema, type McpConfig, McpConfigSchema, type QueueConfig, QueueConfigSchema, type RetryConfig, RetryConfigSchema, type RetryReason, RetryReasonSchema, type SandboxConfig, SandboxConfigSchema, type ScheduleConfig, ScheduleSchema, type UnotestConfig, type UnotestConfigInput, UnotestConfigSchema, type Viewport, ViewportSchema, type WebServerConfig, WebServerConfigSchema };
641
+ export { BROWSER_CHANNEL_WORDS, type Browser, type BrowserChannel, BrowserChannelSchema, BrowserSchema, DEFAULT_CONFIG, type DialogPolicy, DialogPolicySchema, type EnvConfig, EnvConfigSchema, type FailureBundleConfig, FailureBundleConfigSchema, type LinterConfig, LinterConfigSchema, type LinterRuleId, LinterRuleIdSchema, type LinterSeverity, LinterSeveritySchema, type McpConfig, McpConfigSchema, type QueueConfig, QueueConfigSchema, type RetryConfig, RetryConfigSchema, type RetryReason, RetryReasonSchema, SYSTEM_BROWSER_CHANNELS, type SandboxConfig, SandboxConfigSchema, type ScheduleConfig, ScheduleSchema, type UnotestConfig, type UnotestConfigInput, UnotestConfigSchema, type Viewport, ViewportSchema, type WebServerConfig, WebServerConfigSchema };
@@ -1 +1 @@
1
- var _0x11147f=_0x3619;(function(_0x45534e,_0x5d9f5d){var _0x4e7a9c={_0x1edeea:0x147,_0x2da4f1:0x15b,_0x45797b:0x14c,_0x6aa242:0x163,_0x31fb5d:0x145,_0x49e31d:0x156,_0x286bde:0x177},_0xeb1bb2=_0x3619,_0x55ddb3=_0x45534e();while(!![]){try{var _0x25cd55=-parseInt(_0xeb1bb2(_0x4e7a9c._0x1edeea))/0x1+-parseInt(_0xeb1bb2(_0x4e7a9c._0x2da4f1))/0x2*(-parseInt(_0xeb1bb2(0x16c))/0x3)+-parseInt(_0xeb1bb2(_0x4e7a9c._0x45797b))/0x4+-parseInt(_0xeb1bb2(0x16f))/0x5*(-parseInt(_0xeb1bb2(0x155))/0x6)+-parseInt(_0xeb1bb2(0x154))/0x7+parseInt(_0xeb1bb2(_0x4e7a9c._0x6aa242))/0x8*(-parseInt(_0xeb1bb2(_0x4e7a9c._0x31fb5d))/0x9)+parseInt(_0xeb1bb2(_0x4e7a9c._0x49e31d))/0xa*(parseInt(_0xeb1bb2(_0x4e7a9c._0x286bde))/0xb);if(_0x25cd55===_0x5d9f5d)break;else _0x55ddb3['push'](_0x55ddb3['shift']());}catch(_0x27d78b){_0x55ddb3['push'](_0x55ddb3['shift']());}}}(_0x5ebe,0xda387));import{z}from'zod';var BrowserSchema=z['enum']([_0x11147f(0x159),_0x11147f(0x166),_0x11147f(0x167)]),BrowserChannelSchema=z[_0x11147f(0x15a)]([z[_0x11147f(0x14f)](_0x11147f(0x153)),z['literal'](_0x11147f(0x13d)),z[_0x11147f(0x14f)](_0x11147f(0x171)),z[_0x11147f(0x149)]()])[_0x11147f(0x161)](),ViewportSchema=z[_0x11147f(0x148)]({'width':z['number']()[_0x11147f(0x141)]()[_0x11147f(0x14b)](),'height':z[_0x11147f(0x16e)]()['int']()[_0x11147f(0x14b)]()}),RetryReasonSchema=z['enum']([_0x11147f(0x168),_0x11147f(0x16b),'crash']),RetryConfigSchema=z[_0x11147f(0x148)]({'count':z[_0x11147f(0x16e)]()['int']()[_0x11147f(0x15f)](0x0)['max'](0xa),'on':z[_0x11147f(0x176)](RetryReasonSchema)}),FailureBundleConfigSchema=z[_0x11147f(0x148)]({'tier1':z[_0x11147f(0x14f)](!![])[_0x11147f(0x13b)](!![]),'tier2':z['boolean'](),'tier3':z[_0x11147f(0x148)]({'network':z[_0x11147f(0x144)](),'video':z[_0x11147f(0x144)]()}),'retention':z[_0x11147f(0x148)]({'runs':z['number']()[_0x11147f(0x141)]()['positive'](),'days':z[_0x11147f(0x16e)]()[_0x11147f(0x141)]()[_0x11147f(0x14b)]()}),'storageDir':z['string']()[_0x11147f(0x15f)](0x1)}),DialogPolicySchema=z['enum'](['accept',_0x11147f(0x175),_0x11147f(0x165)]),LinterRuleIdSchema=z['enum'](['lint:deep-css',_0x11147f(0x13f),_0x11147f(0x14e),_0x11147f(0x14d),_0x11147f(0x13e),_0x11147f(0x143),'lint:scenario-in-root',_0x11147f(0x158),'lint:goto-concat',_0x11147f(0x15d),'lint:echo-assert',_0x11147f(0x179),'lint:lint-ok-missing-reason',_0x11147f(0x142),_0x11147f(0x170),_0x11147f(0x169),'lint:one-test-per-file',_0x11147f(0x174),_0x11147f(0x17a),_0x11147f(0x14a),'validator:step-coverage',_0x11147f(0x17b),_0x11147f(0x152),'validator:function-shape',_0x11147f(0x151),_0x11147f(0x16d),'validator:var-shape',_0x11147f(0x146),'validator:unsupported-expression',_0x11147f(0x160),_0x11147f(0x162),_0x11147f(0x15e),_0x11147f(0x164)]),LinterSeveritySchema=z['enum']([_0x11147f(0x172),'warn',_0x11147f(0x157)]),LinterConfigSchema=z[_0x11147f(0x148)]({'enabled':z[_0x11147f(0x144)](),'rules':z[_0x11147f(0x178)](LinterRuleIdSchema,LinterSeveritySchema)}),QueueConfigSchema=z[_0x11147f(0x148)]({'enabled':z[_0x11147f(0x144)]()[_0x11147f(0x13b)](!![]),'concurrency':z[_0x11147f(0x16e)]()['int']()[_0x11147f(0x14b)]()[_0x11147f(0x13b)](0x1)}),ScheduleSchema=z['object']({'collection':z[_0x11147f(0x15c)]()['min'](0x1),'cron':z[_0x11147f(0x15c)]()[_0x11147f(0x15f)](0x1),'env':z[_0x11147f(0x15c)]()[_0x11147f(0x15f)](0x1)[_0x11147f(0x161)](),'prepare':z['string']()['min'](0x1)[_0x11147f(0x161)]()}),McpConfigSchema=z[_0x11147f(0x148)]({'transport':z['literal'](_0x11147f(0x173))}),SandboxConfigSchema=z[_0x11147f(0x148)]({'shellCwd':z[_0x11147f(0x15c)]()['optional'](),'shellTimeoutMs':z[_0x11147f(0x16e)]()[_0x11147f(0x141)]()['positive']()[_0x11147f(0x161)](),'exportSecrets':z[_0x11147f(0x176)](z['string']())['optional'](),'database':z[_0x11147f(0x15c)]()[_0x11147f(0x161)](),'apiBaseUrl':z['string']()[_0x11147f(0x140)]()[_0x11147f(0x161)](),'uploadDir':z[_0x11147f(0x15c)]()[_0x11147f(0x161)]()}),WebServerConfigSchema=z[_0x11147f(0x148)]({'command':z[_0x11147f(0x15c)]()[_0x11147f(0x15f)](0x1),'url':z[_0x11147f(0x15c)]()['url'](),'reuseExistingServer':z[_0x11147f(0x144)]()['default'](!![]),'timeoutMs':z[_0x11147f(0x16e)]()[_0x11147f(0x141)]()[_0x11147f(0x14b)]()[_0x11147f(0x13b)](0xea60)}),UnotestConfigSchema=z[_0x11147f(0x148)]({'baseUrl':z['string']()[_0x11147f(0x140)]()[_0x11147f(0x161)](),'webServer':WebServerConfigSchema[_0x11147f(0x161)](),'browsers':z[_0x11147f(0x176)](BrowserSchema)[_0x11147f(0x15f)](0x1),'channel':BrowserChannelSchema,'viewport':ViewportSchema,'retry':RetryConfigSchema,'failureBundle':FailureBundleConfigSchema,'dialogPolicy':DialogPolicySchema,'storageState':z[_0x11147f(0x15c)]()[_0x11147f(0x161)](),'testDir':z[_0x11147f(0x15c)]()[_0x11147f(0x15f)](0x1),'helpersDir':z[_0x11147f(0x15c)]()[_0x11147f(0x15f)](0x1),'defaultTimeoutMs':z[_0x11147f(0x16e)]()[_0x11147f(0x141)]()[_0x11147f(0x14b)](),'defaultNavigationTimeoutMs':z[_0x11147f(0x16e)]()['int']()[_0x11147f(0x14b)](),'linter':LinterConfigSchema,'mcp':McpConfigSchema,'queue':QueueConfigSchema,'schedules':z['array'](ScheduleSchema)[_0x11147f(0x13b)]([]),'sandbox':SandboxConfigSchema}),DEFAULT_CONFIG={'browsers':[_0x11147f(0x159)],'viewport':{'width':0x500,'height':0x2d0},'retry':{'count':0x0,'on':['transient']},'failureBundle':{'tier1':!![],'tier2':!![],'tier3':{'network':![],'video':![]},'retention':{'runs':0x14,'days':0x7},'storageDir':'.unotest/failures'},'dialogPolicy':'accept','testDir':_0x11147f(0x13c),'helpersDir':_0x11147f(0x150),'defaultTimeoutMs':0xbb8,'defaultNavigationTimeoutMs':0x7530,'linter':{'enabled':!![],'rules':{'lint:deep-css':_0x11147f(0x16a),'lint:xpath':_0x11147f(0x16a),'lint:obfuscated-class':_0x11147f(0x16a),'lint:pause-explicit':_0x11147f(0x16a),'lint:disambig-by-index':_0x11147f(0x172),'lint:evaluate-discouraged':'warn','lint:scenario-in-root':'error','lint:mustache-in-dsl':_0x11147f(0x157),'lint:goto-concat':_0x11147f(0x16a),'lint:regex-invalid':_0x11147f(0x157),'lint:echo-assert':_0x11147f(0x16a),'lint:lint-ok-missing-reason':_0x11147f(0x16a),'lint:flow-returns-value':_0x11147f(0x16a),'lint:legacy-layout':_0x11147f(0x16a),'lint:external-variable-undeclared':_0x11147f(0x157),'lint:one-test-per-file':'warn','validator:unknown-function':_0x11147f(0x157)}},'mcp':{'transport':_0x11147f(0x173)},'queue':{'enabled':!![],'concurrency':0x1},'schedules':[],'sandbox':{}};function _0x5ebe(){var _0x544887=['Dw5PB24','mJeYzLn6vNfd','C3rYAw5N','BgLUDdPYzwDLEc1PBNzHBgLK','DMfSAwrHDg9YoMXPC3qTyxjN','BwLU','DMfSAwrHDg9YoNn0CMLUzY1JB25Jyxq','B3b0Aw9UywW','DMfSAwrHDg9YoNnLBwfUDgLJlwXVC3m','ntuYodHbD21Mq00','DMfSAwrHDg9YoNDYyxbWzwqTzM9YBwf0','BwfUDwfS','zMLYzwzVEa','D2vIA2L0','DhjHBNnPzw50','BgLUDdPLEhrLCM5HBc12yxjPywjSzs11BMrLy2XHCMvK','D2fYBG','BMv0D29YAW','ndC4odzzB0vOAfa','DMfSAwrHDg9YoMLMlxnOyxbL','BNvTyMvY','mty5mZiXmhjNteLUDq','BgLUDdPSzwDHy3KTBgf5B3v0','y2HYB21LlwjLDge','B2zM','C3rKAw8','DMfSAwrHDg9YoNvUA25VD24TzNvUy3rPB24','zgLZBwLZCW','yxjYyxK','mtC1nJmWmtHJuxbxwuC','CMvJB3jK','BgLUDdPHCgKTy2fSBc1MAwXLlwjVzhK','DMfSAwrHDg9YoMfYAxr5','DMfSAwrHDg9YoNn0zxaTC2HHCgu','zgvMyxvSDa','Dw5VDgvZDc9LmMu','BxnLzgDL','BgLUDdPKAxnHBwjPzY1IEs1PBMrLEa','BgLUDdP4Cgf0Aa','DxjS','Aw50','BgLUDdPMBg93lxjLDhvYBNmTDMfSDwu','BgLUDdPLDMfSDwf0zs1KAxnJB3vYywDLza','yM9VBgvHBG','mtmYm3LKBwPszG','DMfSAwrHDg9YoNvUC3vWCg9YDgvKlxn0yxrLBwvUDa','odi1nZy0AfbMBe9j','B2jQzwn0','BNvSBa','DMfSAwrHDg9YoMfYzY1RAw5K','Cg9ZAxrPDMu','mtKZnJqYmgjmsK5bsG','BgLUDdPWyxvZzs1LEhbSAwnPDa','BgLUDdPVyMz1C2nHDgvKlwnSyxnZ','BgL0zxjHBa','Dw5VDgvZDc9LmMuVx2HLBhbLCNm','DMfSAwrHDg9YoMzVCI1ZAgfWzq','DMfSAwrHDg9YoM1LDgeTC2HHCgu','y2HYB21L','mtiZmZu0mJfSCgLMDw4','mZbQr2zMyLi','mtbzwNneD1O','zxjYB3i','BgLUDdPTDxn0ywnOzs1PBI1KC2W','y2HYB21PDw0'];_0x5ebe=function(){return _0x544887;};return _0x5ebe();}function _0x3619(_0x5f06b7,_0x5e1052){_0x5f06b7=_0x5f06b7-0x13b;var _0x5ebe27=_0x5ebe();var _0x36198e=_0x5ebe27[_0x5f06b7];if(_0x3619['MsaDYg']===undefined){var _0x47f406=function(_0x209b55){var _0x5a1961='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x541e51='',_0x19aa18='';for(var _0x5cd0b5=0x0,_0x22c6e0,_0x5cd928,_0xb0454=0x0;_0x5cd928=_0x209b55['charAt'](_0xb0454++);~_0x5cd928&&(_0x22c6e0=_0x5cd0b5%0x4?_0x22c6e0*0x40+_0x5cd928:_0x5cd928,_0x5cd0b5++%0x4)?_0x541e51+=String['fromCharCode'](0xff&_0x22c6e0>>(-0x2*_0x5cd0b5&0x6)):0x0){_0x5cd928=_0x5a1961['indexOf'](_0x5cd928);}for(var _0x1497c4=0x0,_0x595653=_0x541e51['length'];_0x1497c4<_0x595653;_0x1497c4++){_0x19aa18+='%'+('00'+_0x541e51['charCodeAt'](_0x1497c4)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x19aa18);};_0x3619['QCOiuC']=_0x47f406,_0x3619['VkmBKP']={},_0x3619['MsaDYg']=!![];}var _0x3ca301=_0x5ebe27[0x0],_0xb0a50f=_0x5f06b7+_0x3ca301,_0x3ad402=_0x3619['VkmBKP'][_0xb0a50f];return!_0x3ad402?(_0x36198e=_0x3619['QCOiuC'](_0x36198e),_0x3619['VkmBKP'][_0xb0a50f]=_0x36198e):_0x36198e=_0x3ad402,_0x36198e;}export{BrowserChannelSchema,BrowserSchema,DEFAULT_CONFIG,DialogPolicySchema,FailureBundleConfigSchema,LinterConfigSchema,LinterRuleIdSchema,LinterSeveritySchema,McpConfigSchema,QueueConfigSchema,RetryConfigSchema,RetryReasonSchema,SandboxConfigSchema,ScheduleSchema,UnotestConfigSchema,ViewportSchema,WebServerConfigSchema};
1
+ var _0x35f08b=_0x7b5c;(function(_0x3900aa,_0x651d58){var _0x520f7d={_0x45de20:0xbf,_0x2347bd:0x96,_0x2f1497:0xc0,_0x442d3a:0x97,_0x54c77c:0xab,_0x5f9c1d:0xa8},_0x475de5=_0x7b5c,_0xb9069f=_0x3900aa();while(!![]){try{var _0x310fed=parseInt(_0x475de5(0xcb))/0x1*(-parseInt(_0x475de5(_0x520f7d._0x45de20))/0x2)+-parseInt(_0x475de5(_0x520f7d._0x2347bd))/0x3+-parseInt(_0x475de5(0x88))/0x4*(-parseInt(_0x475de5(_0x520f7d._0x2f1497))/0x5)+-parseInt(_0x475de5(0x87))/0x6+parseInt(_0x475de5(0xb3))/0x7+parseInt(_0x475de5(_0x520f7d._0x442d3a))/0x8*(-parseInt(_0x475de5(0xc8))/0x9)+parseInt(_0x475de5(_0x520f7d._0x54c77c))/0xa*(parseInt(_0x475de5(_0x520f7d._0x5f9c1d))/0xb);if(_0x310fed===_0x651d58)break;else _0xb9069f['push'](_0xb9069f['shift']());}catch(_0x4295da){_0xb9069f['push'](_0xb9069f['shift']());}}}(_0x2812,0x7d199));var __defProp=Object[_0x35f08b(0x95)],__name=(_0x30e000,_0x2700d4)=>__defProp(_0x30e000,_0x35f08b(0x8b),{'value':_0x2700d4,'configurable':!![]});function _0x7b5c(_0x3dece4,_0x17b132){_0x3dece4=_0x3dece4-0x86;var _0x281288=_0x2812();var _0x7b5ccb=_0x281288[_0x3dece4];if(_0x7b5c['kaiKbm']===undefined){var _0x3d5535=function(_0x2ddd68){var _0x390cca='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x5661df='',_0x44e8fb='';for(var _0x30e000=0x0,_0x2700d4,_0x15c8ac,_0x57d7dc=0x0;_0x15c8ac=_0x2ddd68['charAt'](_0x57d7dc++);~_0x15c8ac&&(_0x2700d4=_0x30e000%0x4?_0x2700d4*0x40+_0x15c8ac:_0x15c8ac,_0x30e000++%0x4)?_0x5661df+=String['fromCharCode'](0xff&_0x2700d4>>(-0x2*_0x30e000&0x6)):0x0){_0x15c8ac=_0x390cca['indexOf'](_0x15c8ac);}for(var _0x37c423=0x0,_0x2fe3da=_0x5661df['length'];_0x37c423<_0x2fe3da;_0x37c423++){_0x44e8fb+='%'+('00'+_0x5661df['charCodeAt'](_0x37c423)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x44e8fb);};_0x7b5c['PMKyob']=_0x3d5535,_0x7b5c['IyQLRU']={},_0x7b5c['kaiKbm']=!![];}var _0x8655f0=_0x281288[0x0],_0x57828f=_0x3dece4+_0x8655f0,_0x1862e9=_0x7b5c['IyQLRU'][_0x57828f];return!_0x1862e9?(_0x7b5ccb=_0x7b5c['PMKyob'](_0x7b5ccb),_0x7b5c['IyQLRU'][_0x57828f]=_0x7b5ccb):_0x7b5ccb=_0x1862e9,_0x7b5ccb;}import{z as _0x5661df}from'zod';import{z}from'zod';function _0x2812(){var _0x5e448c=['DMfSAwrHDg9YoNn0zxaTC2HHCgu','iIdIGjqGzgLKihLVDsbTzwfUici','y2HYB21PDw0','BgLUDdPNB3rVlwnVBMnHDa','Dg9mB3DLCKnHC2u','DMfSAwrHDg9YoNvUC3vWCg9YDgvKlxn0yxrLBwvUDa','BgLUDdPTDxn0ywnOzs1PBI1KC2W','D2fYBG','DMfSAwrHDg9YoNvUC3vWCg9YDgvKlwv4ChjLC3nPB24','BgLUDdPLEhrLCM5HBc12yxjPywjSzs11BMrLy2XHCMvK','C3rYAw5N','A2v5','DxjS','zw51Bq','Cg9ZAxrPDMu','mtyXmda5mdLYtKveyxC','BwfUDwfS','BNvTyMvY','mtbVs1fQrNC','yxjYyxK','BgLUDdPLBNyTAg9ZDc1MCM9TlwjHC2u','zgLZDgfUy2u','y2HYB21L','Dw5RBM93BKTLEu1LC3nHz2u','ywnJzxb0','C3rYAwn0','mZC3mZeYnKLcr1npwG','zMLYzwzVEa','CMvJB3jK','A2v5CW','BgL0zxjHBa','DhjHBNnMB3jT','DMfSAwrHDg9YoM1LDgeTC2HHCgu','DMfSAwrHDg9YoNzHCI1ZAgfWzq','B3b0Aw9UywW','Dw5VDgvZDc9LmMu','BMv0D29YAW','B2zM','nJC0v1DtCKzU','mtyZmtvQA0zmyKi','zxjYB3i','y3jHC2G','AM9PBG','BgLUDdPWyxvZzs1LEhbSAwnPDa','Dw5PB24','BgLUDdPHCgKTy2fSBc1MAwXLlwjVzhK','DMfSAwrHDg9YoMfYAxr5','ovb3CKrjuW','DMfSAwrHDg9YoMz1BMn0Aw9UlxnOyxbL','zgvMyxvSDa','mtG1ohL3C2TLDG','wM9KsxnZDwvdB2rL','C3rYAwn0t2jQzwn0','zgvMyxvSDevYCM9Y','DMfSAwrHDg9YoNn0CMLUzY1JB25Jyxq','BgLUDdPVyMz1C2nHDgvKlwnSyxnZ','Dw5RBM93BIbRzxKGiG','y2XVC2vZDeTLEq','BgLUDdPVBMuTDgvZDc1WzxiTzMLSzq','B2jQzwn0','BgLUDdP4Cgf0Aa','Aw50','DMfSAwrHDg9YoNn0zxaTy292zxjHz2u','DMfSAwrHDg9YoMLMlxnOyxbL','iIdIGjqGBM90igeGy29UzMLNigTLEtSGy2HLy2SGEw91CIbaDw5VDgvZDc93zwiGDMvYC2LVBIbPzIbPDcbJB21LCYbMCM9TigeGBMv3zxiGCMvSzwfZzq','DMfSAwrHDg9YoNDYyxbWzwqTzM9YBwf0','lNvUB3rLC3qVzMfPBhvYzxm','mtiWmdKXmNDrtg9nDG','otiWvKveDxjf','BgLUDdPSzwDHy3KTBgf5B3v0','y2HYB21LlwjLDge','BMfTzq','zgLZBwLZCW','BwLU','DMfSAwrHDg9YoMfYzY1RAw5K','C3rKAw8','DMfSAwrHDg9YoNnLBwfUDgLJlwXVC3m','BwfW','DMfSAwrHDg9YoNvUA25VD24TzNvUy3rPB24','yM9VBgvHBG','Dw5YzwnVz25PEMvKx2TLExm','zgvMAw5LuhjVCgvYDhK','mJq0mJm4n1rICwfzua','ndGWmZeYogTLBKzPAq','DhjHBNnPzw50'];_0x2812=function(){return _0x5e448c;};return _0x2812();}import{levenshteinDistance}from'@unotest/core';var MAX_EDITS=0x2;function closestKey(_0x15c8ac,_0x57d7dc){var _0x5262b6={_0x332b2b:0xae},_0x239085=_0x35f08b;let _0x37c423;for(const _0x2fe3da of _0x57d7dc){const _0x3252b9=levenshteinDistance(_0x15c8ac[_0x239085(0x9d)](),_0x2fe3da['toLowerCase']());if(_0x3252b9>MAX_EDITS)continue;if(_0x37c423===void 0x0||_0x3252b9<_0x37c423[_0x239085(_0x5262b6._0x332b2b)])_0x37c423={'key':_0x2fe3da,'distance':_0x3252b9};}return _0x37c423?.[_0x239085(0xa4)];}__name(closestKey,_0x35f08b(0xd2));function unknownKeyMessage(_0x31285d,_0x1d6e68){var _0x30a5cc={_0x229a78:0x91},_0x29f31f={_0x5dc2b9:0xd1,_0x5d6059:0xd9},_0x4f978a=_0x35f08b;return _0x31285d[_0x4f978a(_0x30a5cc._0x229a78)](_0x5e4c63=>{var _0x2aa1e6=_0x4f978a;const _0x52c28f=closestKey(_0x5e4c63,_0x1d6e68);return _0x52c28f===void 0x0?_0x2aa1e6(_0x29f31f._0x5dc2b9)+_0x5e4c63+_0x2aa1e6(_0x29f31f._0x5d6059):_0x2aa1e6(_0x29f31f._0x5dc2b9)+_0x5e4c63+_0x2aa1e6(0x9a)+_0x52c28f+'\x22?';})[_0x4f978a(0xc3)](';\x20');}__name(unknownKeyMessage,_0x35f08b(0xb0));function strictObject(_0x22229c){var _0x155f9a=_0x35f08b;const _0x1b9138=Object['keys'](_0x22229c);return z['object'](_0x22229c,{'errorMap':__name((_0x2204d5,_0x32e550)=>_0x2204d5['code']===z[_0x155f9a(0xcc)][_0x155f9a(0x94)]?{'message':unknownKeyMessage(_0x2204d5[_0x155f9a(0xb6)],_0x1b9138)}:{'message':_0x32e550[_0x155f9a(0xce)]},'errorMap')})[_0x155f9a(0xb2)]();}__name(strictObject,_0x35f08b(0xcd));import{BUNDLED_BROWSER_CHANNEL}from'@unotest/protocol';import{z as _0x44e8fb}from'zod';import{UnotestError}from'@unotest/core';var LaunchConfigSchema=_0x44e8fb[_0x35f08b(0xd4)]({'userDataDir':_0x44e8fb[_0x35f08b(0xa3)]()['min'](0x1)[_0x35f08b(0xbb)](),'args':_0x44e8fb['array'](_0x44e8fb[_0x35f08b(0xa3)]()[_0x35f08b(0x8d)](0x1))[_0x35f08b(0xbb)]()})['strict'](),BrowserSchema=_0x5661df[_0x35f08b(0xa6)]([_0x35f08b(0x9b),_0x35f08b(0xb4),'webkit']),SYSTEM_BROWSER_CHANNELS=[_0x35f08b(0xaf),'msedge',_0x35f08b(0x8a),_0x35f08b(0x9b)],BROWSER_CHANNEL_WORDS=[...SYSTEM_BROWSER_CHANNELS,BUNDLED_BROWSER_CHANNEL],BrowserChannelSchema=_0x5661df[_0x35f08b(0xc5)]([_0x5661df[_0x35f08b(0xa6)](SYSTEM_BROWSER_CHANNELS),_0x5661df['literal'](BUNDLED_BROWSER_CHANNEL)[_0x35f08b(0xb8)](()=>null),_0x5661df['null']()])['optional'](),ViewportSchema=strictObject({'width':_0x5661df[_0x35f08b(0xaa)]()[_0x35f08b(0xd6)]()['positive'](),'height':_0x5661df[_0x35f08b(0xaa)]()[_0x35f08b(0xd6)]()[_0x35f08b(0xa7)]()}),RetryReasonSchema=_0x5661df[_0x35f08b(0xa6)]([_0x35f08b(0x98),_0x35f08b(0xbd),_0x35f08b(0xc2)]),RetryConfigSchema=strictObject({'count':_0x5661df[_0x35f08b(0xaa)]()['int']()[_0x35f08b(0x8d)](0x0)['max'](0xa),'on':_0x5661df[_0x35f08b(0xac)](RetryReasonSchema)}),FailureBundleConfigSchema=strictObject({'tier1':_0x5661df[_0x35f08b(0xb7)](!![])['default'](!![]),'tier2':_0x5661df['boolean'](),'tier3':strictObject({'network':_0x5661df[_0x35f08b(0x93)](),'video':_0x5661df['boolean']()}),'retention':strictObject({'runs':_0x5661df['number']()[_0x35f08b(0xd6)]()[_0x35f08b(0xa7)](),'days':_0x5661df[_0x35f08b(0xaa)]()[_0x35f08b(0xd6)]()[_0x35f08b(0xa7)]()}),'storageDir':_0x5661df[_0x35f08b(0xa3)]()['min'](0x1)}),DialogPolicySchema=_0x5661df[_0x35f08b(0xa6)](['accept',_0x35f08b(0x8c),_0x35f08b(0xa9)]),LinterRuleIdSchema=_0x5661df[_0x35f08b(0xa6)](['lint:deep-css',_0x35f08b(0xd5),_0x35f08b(0xd0),_0x35f08b(0xc4),'lint:disambig-by-index','lint:evaluate-discouraged','lint:scenario-in-root',_0x35f08b(0x9f),_0x35f08b(0x9c),'lint:regex-invalid','lint:echo-assert',_0x35f08b(0xc6),'lint:lint-ok-missing-reason','lint:flow-returns-value',_0x35f08b(0x89),_0x35f08b(0xa2),_0x35f08b(0xad),_0x35f08b(0xd3),_0x35f08b(0x92),_0x35f08b(0xc7),_0x35f08b(0x8e),_0x35f08b(0xd7),_0x35f08b(0x99),_0x35f08b(0xb9),_0x35f08b(0xc9),'validator:for-shape',_0x35f08b(0xd8),_0x35f08b(0xba),_0x35f08b(0x9e),_0x35f08b(0xa1),_0x35f08b(0xcf),_0x35f08b(0x90),'validator:list-arg',_0x35f08b(0xda)]),LinterSeveritySchema=_0x5661df[_0x35f08b(0xa6)](['off',_0x35f08b(0xa0),_0x35f08b(0xc1)]),LinterConfigSchema=strictObject({'enabled':_0x5661df['boolean'](),'rules':_0x5661df[_0x35f08b(0xb5)](LinterRuleIdSchema,LinterSeveritySchema)}),QueueConfigSchema=strictObject({'enabled':_0x5661df[_0x35f08b(0x93)]()[_0x35f08b(0xca)](!![]),'concurrency':_0x5661df['number']()[_0x35f08b(0xd6)]()[_0x35f08b(0xa7)]()[_0x35f08b(0xca)](0x1)}),ScheduleSchema=strictObject({'collection':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0x8d)](0x1),'cron':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0x8d)](0x1),'env':_0x5661df['string']()[_0x35f08b(0x8d)](0x1)[_0x35f08b(0xbb)](),'prepare':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0x8d)](0x1)[_0x35f08b(0xbb)]()}),McpConfigSchema=strictObject({'transport':_0x5661df[_0x35f08b(0xb7)](_0x35f08b(0x8f))}),SandboxConfigSchema=strictObject({'shellCwd':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0xbb)](),'shellTimeoutMs':_0x5661df[_0x35f08b(0xaa)]()[_0x35f08b(0xd6)]()[_0x35f08b(0xa7)]()[_0x35f08b(0xbb)](),'exportSecrets':_0x5661df[_0x35f08b(0xac)](_0x5661df[_0x35f08b(0xa3)]())['optional'](),'database':_0x5661df[_0x35f08b(0xa3)]()['optional'](),'apiBaseUrl':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0xa5)]()['optional'](),'uploadDir':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0xbb)]()}),WebServerConfigSchema=strictObject({'command':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0x8d)](0x1),'url':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0xa5)](),'reuseExistingServer':_0x5661df[_0x35f08b(0x93)]()[_0x35f08b(0xca)](!![]),'timeoutMs':_0x5661df[_0x35f08b(0xaa)]()[_0x35f08b(0xd6)]()[_0x35f08b(0xa7)]()[_0x35f08b(0xca)](0xea60)}),EnvConfigSchema=strictObject({'shared':_0x5661df[_0x35f08b(0xac)](_0x5661df['string']())[_0x35f08b(0xca)]([])}),UnotestConfigSchema=strictObject({'baseUrl':_0x5661df[_0x35f08b(0xa3)]()[_0x35f08b(0xa5)]()[_0x35f08b(0xbb)](),'webServer':WebServerConfigSchema[_0x35f08b(0xbb)](),'browsers':_0x5661df['array'](BrowserSchema)[_0x35f08b(0x8d)](0x1),'channel':BrowserChannelSchema,'viewport':ViewportSchema,'launch':LaunchConfigSchema[_0x35f08b(0xbb)](),'retry':RetryConfigSchema,'failureBundle':FailureBundleConfigSchema,'dialogPolicy':DialogPolicySchema,'storageState':_0x5661df['string']()[_0x35f08b(0xbb)](),'testDir':_0x5661df['string']()[_0x35f08b(0x8d)](0x1),'helpersDir':_0x5661df[_0x35f08b(0xa3)]()['min'](0x1),'defaultTimeoutMs':_0x5661df[_0x35f08b(0xaa)]()[_0x35f08b(0xd6)]()['positive'](),'defaultNavigationTimeoutMs':_0x5661df[_0x35f08b(0xaa)]()[_0x35f08b(0xd6)]()[_0x35f08b(0xa7)](),'env':EnvConfigSchema,'linter':LinterConfigSchema,'mcp':McpConfigSchema,'queue':QueueConfigSchema,'schedules':_0x5661df[_0x35f08b(0xac)](ScheduleSchema)[_0x35f08b(0xca)]([]),'sandbox':SandboxConfigSchema}),DEFAULT_CONFIG={'browsers':['chromium'],'viewport':{'width':0x500,'height':0x2d0},'retry':{'count':0x0,'on':['transient']},'failureBundle':{'tier1':!![],'tier2':!![],'tier3':{'network':![],'video':![]},'retention':{'runs':0x14,'days':0x7},'storageDir':_0x35f08b(0x86)},'dialogPolicy':_0x35f08b(0xb1),'testDir':_0x35f08b(0xbc),'helpersDir':'unotest/e2e/_helpers','defaultTimeoutMs':0xbb8,'defaultNavigationTimeoutMs':0x7530,'linter':{'enabled':!![],'rules':{'lint:deep-css':_0x35f08b(0xa0),'lint:xpath':_0x35f08b(0xa0),'lint:obfuscated-class':_0x35f08b(0xa0),'lint:pause-explicit':'warn','lint:disambig-by-index':_0x35f08b(0xbe),'lint:evaluate-discouraged':_0x35f08b(0xa0),'lint:scenario-in-root':_0x35f08b(0xc1),'lint:mustache-in-dsl':'error','lint:goto-concat':_0x35f08b(0xa0),'lint:regex-invalid':_0x35f08b(0xc1),'lint:echo-assert':_0x35f08b(0xa0),'lint:lint-ok-missing-reason':_0x35f08b(0xa0),'lint:flow-returns-value':_0x35f08b(0xa0),'lint:legacy-layout':_0x35f08b(0xa0),'lint:external-variable-undeclared':'error','lint:env-host-from-base':_0x35f08b(0xc1),'lint:one-test-per-file':'warn','validator:unknown-function':'error'}},'env':{'shared':[]},'mcp':{'transport':'stdio'},'queue':{'enabled':!![],'concurrency':0x1},'schedules':[],'sandbox':{}};export{BROWSER_CHANNEL_WORDS,BrowserChannelSchema,BrowserSchema,DEFAULT_CONFIG,DialogPolicySchema,EnvConfigSchema,FailureBundleConfigSchema,LinterConfigSchema,LinterRuleIdSchema,LinterSeveritySchema,McpConfigSchema,QueueConfigSchema,RetryConfigSchema,RetryReasonSchema,SYSTEM_BROWSER_CHANNELS,SandboxConfigSchema,ScheduleSchema,UnotestConfigSchema,ViewportSchema,WebServerConfigSchema};
@@ -1,5 +1,5 @@
1
- import { E as ElementHint, S as ScreenshotOptions, N as NetworkEntry, W as WebDriver, L as LaunchOptions, C as ContextOptions, D as DriverContext, A as AttachOptions } from '../interfaces-B34N4rfI.js';
2
- export { a as ActionTimeout, b as CheckOptions, c as ClickOptions, d as CookieOptions, e as DriverPage, F as FillOptions, G as GotoOptions, H as HoverOptions, f as NavigationOptions, P as PressOptions, R as ReloadOptions, g as SelectOptions, V as Viewport, h as WaitOptions, i as WaitState } from '../interfaces-B34N4rfI.js';
1
+ import { E as ElementHint, S as ScreenshotOptions, N as NetworkEntry, W as WebDriver, L as LaunchOptions, C as ContextOptions, D as DriverContext, A as AttachOptions } from '../interfaces-7nMNCr2h.js';
2
+ export { a as ActionTimeout, b as CheckOptions, c as ClickOptions, d as CookieOptions, e as DriverPage, F as FillOptions, G as GotoOptions, H as HoverOptions, f as NavigationOptions, P as PressOptions, R as ReloadOptions, g as SelectOptions, V as Viewport, h as WaitOptions, i as WaitState } from '../interfaces-7nMNCr2h.js';
3
3
  import '@unotest/protocol';
4
4
  import '../config/schema.js';
5
5
  import 'zod';