@unotest/protocol 0.9.0 → 0.9.1

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/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  All notable changes to `@unotest/protocol` are documented in this file.
4
4
 
5
+ ## [0.9.1] - 2026-06-14
6
+
7
+ ### Added
8
+
9
+ - **Probe protocol.** `DbgCommandProbe` + `ProbeResult` / `ProbeResultEvent` —
10
+ evaluate a DSL locator string against the live page and report what it matches
11
+ (count, the N a trailing `.first()`/`.last()`/`.nth()` collapsed, per-match
12
+ identity). Shared shape so the agent's `check_locator` and the viewer's human
13
+ probe report identically.
14
+ - **Agent tool-call events.** `ToolCallEvent` / `ToolResultEvent` — an attached
15
+ MCP server surfaces each tool call + result into the run's event stream so the
16
+ viewer's System console shows what the agent called and how it ended.
17
+ - **`RuntimeStateFile.breakpoints`.** The run's active breakpoints (`"line:col"`
18
+ keys — `.debugger.json` seed + any `--breakpoints` override), so the viewer can
19
+ paint gutter dots for breakpoints that aren't persisted.
20
+ - **App-server protocol.** `AppServerEvent` + `parseAppServerEvent` and the
21
+ `IRunnerAdapter` / launch-spec contracts for the project dev app-server
22
+ integration.
23
+ - **Env editing helpers** (`env-edit`) and additional path constants/helpers
24
+ (`paths`).
25
+
5
26
  ## [0.9.0] - 2026-06-11
6
27
 
7
28
  ### Added
package/dist/index.d.ts CHANGED
@@ -1,5 +1,31 @@
1
1
  import { Readable } from 'node:stream';
2
2
 
3
+ type AppServerEvent =
4
+ /** The app under test is ready. Web holders carry the dev-server
5
+ * `url`; device holders (mobile) carry a human `detail` line instead
6
+ * («A: UnoTest-A booted, UnoPeak.app installed»). At least one of
7
+ * the two is expected; the panel renders whichever is present. */
8
+ {
9
+ kind: "app-server:ready";
10
+ url?: string;
11
+ detail?: string;
12
+ }
13
+ /** Already provided by someone else — nothing spawned; the holder
14
+ * exits 0 (web: URL already serving). */
15
+ | {
16
+ kind: "app-server:reused";
17
+ url?: string;
18
+ detail?: string;
19
+ }
20
+ /** Configuration / spawn / readiness failure. The holder exits 1. */
21
+ | {
22
+ kind: "app-server:error";
23
+ message: string;
24
+ };
25
+ /** Parse one stdout line into an `AppServerEvent`, or null when the line
26
+ * is ordinary dev-server output. */
27
+ declare function parseAppServerEvent(line: string): AppServerEvent | null;
28
+
3
29
  /** User-facing project directory containing scenarios + helpers + collections. */
4
30
  declare const UNOTEST_DIR = "unotest";
5
31
  /** Subdir under `unotest/` for `.test.js` scenarios. */
@@ -12,6 +38,19 @@ declare const COLLECTIONS_SUBDIR = "_collections";
12
38
  * Dot-prefix so a single `.gitignore` line covers all runtime debris
13
39
  * without touching user code in `unotest/e2e/`. */
14
40
  declare const RUNS_SUBDIR = ".runs";
41
+ /** Scenario tree under `unotest/`: `e2e` / `e2e-mobile`. */
42
+ declare function testDirFor(suffix: string): string;
43
+ /** Run-artifact root under `unotest/`: `.runs` / `.runs-mobile`. */
44
+ declare function runsDirFor(suffix: string): string;
45
+ /** `UNOTEST_DEBUG` artifact root under `unotest/`: `.debug` /
46
+ * `.debug-mobile`. */
47
+ declare function debugDirFor(suffix: string): string;
48
+ /** Per-target shared breakpoint store, relative to project root:
49
+ * `unotest/.debugger.json` / `unotest/.debugger-mobile.json`. Breakpoint
50
+ * keys are scenario names RELATIVE to the target's testDir, so each
51
+ * target needs its own file (same key ≠ same scenario across targets).
52
+ * Schema: `BreakpointsFile` in `protocol/breakpoints-file.ts`. */
53
+ declare function debuggerFileFor(suffix: string): string;
15
54
  /** Lockfile path *relative to* `unotest/`. Project-local (multiple viewers
16
55
  * for different projects coexist). */
17
56
  declare const LOCK_FILE = ".viewer.lock";
@@ -45,23 +84,31 @@ declare const RUNTIME_FILE = "runtime.json";
45
84
  * Snapshot inspector tab fetches it via the run-dir asset endpoint to show
46
85
  * "what the picker sees" for diagnosing ref/coverage gaps. */
47
86
  declare const PICKER_SNAPSHOT_FILE = "picker-snapshot.txt";
48
- /** Per-project shared breakpoint store. Path is relative to project root
49
- * (NOT under `unotest/.runs/`). Schema: `BreakpointsFile` in
50
- * `protocol/breakpoints-file.ts`. */
51
- declare const DEBUGGER_FILE = "unotest/.debugger.json";
52
87
  /** Project env file edited by the viewer's env-variable editor. Relative
53
88
  * to project root. Surfaced as `EnvFile` (`protocol/env-file.ts`). */
54
89
  declare const ENV_FILE = "unotest/.env";
55
90
  /** Secret scenario variables, beside `.env` under `unotest/`. Same KEY=VALUE
56
91
  * format; secrecy is a property of THIS file (not a name heuristic). */
57
92
  declare const SECRETS_FILE = "unotest/.secrets";
58
- /** Per-environment overlay file for `.env` / `.secrets`. `unotest/.env`
59
- * (+ `.secrets`) hold shared defaults; `unotest/.env.<name>` overrides them
60
- * for a named environment (`staging`, `production`, …), selected at run time
61
- * via `UNOTEST_ENV` / `--env`. Overlay wins over base; ambient process.env
62
- * still wins over both. No env name → base file only. */
63
- declare function envFileFor(envName?: string): string;
64
- declare function secretsFileFor(envName?: string): string;
93
+ /** Env/secrets file naming spans TWO axes (M-11):
94
+ *
95
+ * - TARGET (dash, M-10): `.env` is the shared base AND web's file (bare
96
+ * suffix); `.env-mobile` overrides it for the mobile runner.
97
+ * - ENVIRONMENT (dot): `.env.<name>` overrides for a named environment
98
+ * (`staging`, `production`, …), selected at run time via
99
+ * `UNOTEST_ENV` / `--env`.
100
+ *
101
+ * They compose: `unotest/.env-mobile.staging`. Precedence (low→high):
102
+ * base → target → env-overlay → target+env-overlay — an explicit
103
+ * `--env` is a runtime intent and beats a static target default.
104
+ * Ambient process.env still wins over every file. */
105
+ declare function envFileFor(suffix: string, envName?: string): string;
106
+ declare function secretsFileFor(suffix: string, envName?: string): string;
107
+ /** Ordered (low→high precedence) layer list for a target's env files.
108
+ * Bare suffix / unset env collapse to fewer layers — web with no named
109
+ * environment reads just `[unotest/.env]`. */
110
+ declare function envLayerFilesFor(suffix: string, envName?: string): string[];
111
+ declare function secretsLayerFilesFor(suffix: string, envName?: string): string[];
65
112
  /** Read an environment name from a process-env-like record (`UNOTEST_ENV`),
66
113
  * normalising empty/blank to `undefined` (= base only). */
67
114
  declare function activeEnvName(env: Record<string, string | undefined>): string | undefined;
@@ -220,6 +267,21 @@ interface IRunnerAdapter {
220
267
  * (e.g. `"@unotest/web"`). NOT used for control flow — viewer
221
268
  * must not branch on this. */
222
269
  readonly name: string;
270
+ /** Per-target artifact suffix — the single axis that scopes EVERY
271
+ * per-target filesystem name (M-10): `""` for web (the first target
272
+ * keeps the bare names), `"-mobile"` for mobile, `"-unity"` for a
273
+ * future unity runner. Derived names (via `paths.ts` helpers):
274
+ * scenario tree `e2e<suffix>`, run artifacts `.runs<suffix>`, debug
275
+ * logs `.debug<suffix>`, breakpoints `.debugger<suffix>.json`, env
276
+ * overlays `.env<suffix>`. The viewer scopes discovery/runs/
277
+ * breakpoints by the active target's suffix so no folder name is
278
+ * ever hardcoded in viewer source (OCP: a new target just declares
279
+ * its suffix). */
280
+ readonly suffix: string;
281
+ /** Debug-toolbar capabilities the viewer gates its controls on (OCP — a
282
+ * new target just declares what it supports; viewer never branches on the
283
+ * runner name). See `DebugCapabilities`. */
284
+ readonly debug: DebugCapabilities;
223
285
  /** Which `RunRequest.kind` values this adapter can handle. Viewer
224
286
  * rejects unsupported kinds with `UnsupportedRunKindError` before
225
287
  * building argv. */
@@ -238,6 +300,106 @@ interface IRunnerAdapter {
238
300
  * (`UNOTEST_WORKER_INDEX/COUNT`) is NOT the adapter's
239
301
  * responsibility — see `D-C4` in the collections plan. */
240
302
  buildEnv(req: RunRequest): NodeJS.ProcessEnv;
303
+ /** Argv (after the bin path) that starts this runner's LONG-LIVED
304
+ * app-under-test holder (M-12/M-16) — the process that prepares the
305
+ * app (web: spawns the dev server; mobile: boots devices + installs
306
+ * the build), emits `AppServerEvent` JSON lines on stdout, and tears
307
+ * down what it owns when terminated. Absent → the runner has no
308
+ * app-launch capability and the viewer hides the feature for this
309
+ * target. Example: `["app-server"]`. */
310
+ appServerArgs?(): string[];
311
+ /** Path inputs the App panel renders for this target (M-17) — each
312
+ * spec becomes an input + file-picker button whose value is saved
313
+ * into the target's env file (`envKey`). The viewer stays
314
+ * platform-blind: extensions/labels are vocab the adapter owns
315
+ * (mobile iOS: `.app`; a future Android entry adds `.apk`). */
316
+ appServerPickers?(): readonly AppPathPickerSpec[];
317
+ /** Host-OS requirement for THIS runner. The viewer resolves it against
318
+ * the server's real `process.platform` and gates the switcher: an
319
+ * unsupported host shows `reason` and blocks activation (e.g. mobile is
320
+ * macOS-only — iOS Simulator is Apple-licensed). Absent → runs on any
321
+ * host (web). OCP: a new platform-bound runner just declares this; the
322
+ * viewer never hardcodes which target needs which OS. */
323
+ readonly host?: HostRequirement;
324
+ /** Structured environment preflight ("doctor") — what must be installed/
325
+ * configured for this runner to actually run here (mobile: Xcode +
326
+ * simulators; web: Node + a system browser). Pure-ish but MAY shell out
327
+ * to probe the host, hence async; the viewer invokes it on demand (a
328
+ * "Check" button), never on every switch. Absent → nothing to verify
329
+ * beyond the package being installed. The viewer renders the returned
330
+ * list verbatim (severity + message + fix `detail`) — it owns no runner
331
+ * vocab. */
332
+ doctor?(ctx: DoctorContext): Promise<DoctorCheck[]>;
333
+ }
334
+ /** Severity of a single {@link DoctorCheck}. `error` = the runner cannot
335
+ * run until fixed; `warning` = may work, review; `ok` = satisfied. */
336
+ type CheckSeverity = "ok" | "warning" | "error";
337
+ /** One environment-preflight result. The single shape both `@unotest/web`
338
+ * and `@unotest/mobile` already produce from their `runEnvironmentChecks`
339
+ * — lifted here so the viewer (and any future surface) consumes one type,
340
+ * not a per-runner copy. */
341
+ interface DoctorCheck {
342
+ /** Short check id, e.g. `"xcode-cli"`, `"Node.js version"`. */
343
+ name: string;
344
+ severity: CheckSeverity;
345
+ /** One-line outcome, e.g. `"Xcode CLI tools at /Applications/…"`. */
346
+ message: string;
347
+ /** Human-readable remediation when not `ok` — a command or concrete
348
+ * next step. Surfaced under the message in the UI. */
349
+ detail?: string;
350
+ }
351
+ /** What an adapter's {@link IRunnerAdapter.doctor} receives. Kept as an
352
+ * object so new context (e.g. a target's env file) can be added without
353
+ * touching every implementor's signature. */
354
+ interface DoctorContext {
355
+ /** Absolute path to the project root (the dir containing `unotest/`) —
356
+ * for project-aware checks (mobile reads `package.json` to hint RN/Expo). */
357
+ projectRoot: string;
358
+ }
359
+ /** A runner's host-OS requirement. The viewer compares `platforms` against
360
+ * `process.platform`; a mismatch shows `reason` and blocks the switch. */
361
+ interface HostRequirement {
362
+ /** `process.platform` values this runner can execute on, e.g. `["darwin"]`
363
+ * for iOS. */
364
+ platforms: ReadonlyArray<NodeJS.Platform>;
365
+ /** Shown when the current host isn't in `platforms` — one sentence the
366
+ * user reads in the switcher / setup panel. */
367
+ reason: string;
368
+ }
369
+ /** What a runner's debug session supports — drives which debug-toolbar
370
+ * controls the viewer shows. A target that lacks a capability gets the
371
+ * control hidden (no dead buttons). */
372
+ interface DebugCapabilities {
373
+ /** In-page locator picker / recorder — click an element in the SHARED,
374
+ * inspectable page to insert its locator/assertion (web). Runners that
375
+ * drive an opaque device without a clickable DOM (mobile via WDA) set this
376
+ * false → the viewer hides the picker cluster (Capture/Execute +
377
+ * target/A/eye). NOTE: distinct from `attach` — the wheel + agent join
378
+ * apply to mobile too. */
379
+ picker: boolean;
380
+ /** Collaborative attach: a second client (the MCP agent) can join the live
381
+ * debug session and co-drive it, coordinated by the control wheel. True for
382
+ * web (shared browser) AND mobile (shared device via WDA). The viewer shows
383
+ * the wheel / "who's driving" badge when set. */
384
+ attach: boolean;
385
+ /** A failure-pause is resumable as a RETRY of the failed step (mobile D-17:
386
+ * the user fixes the device/app state, Continue re-executes the same
387
+ * statement). When false (web: resume past a failure means "skip & pretend
388
+ * it passed"), the viewer hides Continue/Step on a failure-pause so the
389
+ * only action is Stop. */
390
+ resumeFromFailure: boolean;
391
+ }
392
+ /** One path-input row in the viewer's App panel (M-17). */
393
+ interface AppPathPickerSpec {
394
+ /** Env var the picked path is saved to (e.g. `"APP_PATH"`). Routed to
395
+ * the target's env file by the viewer's variables API (M-11). */
396
+ envKey: string;
397
+ /** Selectable leaf extensions (lowercase, with dot). macOS `.app`
398
+ * bundles are directories — the file browser treats a matching dir
399
+ * as a selectable leaf. */
400
+ extensions: readonly string[];
401
+ /** Human label rendered above the input (e.g. `"iOS app bundle"`). */
402
+ label: string;
241
403
  }
242
404
  /** Thrown by the viewer when a `RunRequest.kind` isn't in the
243
405
  * adapter's `supportedKinds`. The exception filter maps to HTTP 400
@@ -384,6 +546,13 @@ declare function categorizeVariable(v: {
384
546
  * above instead. Convention only — no value inspection. */
385
547
  declare function isExternalVarName(name: string): boolean;
386
548
 
549
+ /** Parse `KEY=VALUE` env-file CONTENT into a plain record. Pure — the
550
+ * caller does the fs read. Blank lines and `#` comments are skipped;
551
+ * balanced surrounding single/double quotes are stripped; keys not
552
+ * matching `[A-Za-z_][A-Za-z0-9_]*` are ignored. Shared by the web and
553
+ * mobile runners' layered env loaders (M-11) so both parse `.env` files
554
+ * identically. */
555
+ declare function parseEnvContent(raw: string): Record<string, string>;
387
556
  /** Quote on write only when the value would otherwise be ambiguous (spaces,
388
557
  * `#`, quotes, `=`, backslash, leading backtick, or newlines). Plain tokens
389
558
  * stay unquoted. Mirrors the viewer env-dotenv serializer. */
@@ -690,9 +859,60 @@ interface DbgCommandWheel {
690
859
  cmd: "wheel";
691
860
  owner: "agent" | "human";
692
861
  }
693
- type DbgCommand = DbgCommandStep | DbgCommandContinue | DbgCommandPause | DbgCommandSetBp | DbgCommandClearBp | DbgCommandAbort | DbgCommandPickerStart | DbgCommandPickerStop | DbgCommandSnapshot | DbgCommandRecord | DbgCommandWheel;
862
+ /** Evaluate a DSL locator STRING against the live (paused or running) page and
863
+ * report what it matches — count, the N a trailing .first()/.last()/.nth()
864
+ * collapses, and per-match identity — via a `probe:result` event. The runner
865
+ * parses `locator` with the SAME DSL parser the agent's `check_locator` uses,
866
+ * so agent and human probe identically. READ-ONLY (never acts on the page),
867
+ * so it is intentionally NOT wheel-gated: any client may probe at any time. */
868
+ interface DbgCommandProbe {
869
+ id: string;
870
+ cmd: "probe";
871
+ /** Locator exactly as written in a test, e.g.
872
+ * getByRole('row').filter({hasText: 'Uma Quinn'}).first(). */
873
+ locator: string;
874
+ /** Cap on the number of match details returned (default 20). */
875
+ limit?: number;
876
+ }
877
+ type DbgCommand = DbgCommandStep | DbgCommandContinue | DbgCommandPause | DbgCommandSetBp | DbgCommandClearBp | DbgCommandAbort | DbgCommandPickerStart | DbgCommandPickerStop | DbgCommandSnapshot | DbgCommandRecord | DbgCommandWheel | DbgCommandProbe;
694
878
  type DbgCommandKind = DbgCommand["cmd"];
695
879
 
880
+ interface ProbeMatch {
881
+ /** 0-based position among the locator's matches. */
882
+ index: number;
883
+ role?: string;
884
+ name?: string;
885
+ /** Trimmed/clipped textContent of the element. */
886
+ text?: string;
887
+ testId?: string;
888
+ href?: string;
889
+ /** Currently visible? Non-waiting check (a match can exist but be off-screen). */
890
+ visible: boolean;
891
+ }
892
+ interface ProbePinned {
893
+ /** The terminal index op that collapsed a multi-match to a single element. */
894
+ op: "first" | "last" | "nth";
895
+ /** How many elements the chain matched BEFORE the terminal op — i.e. how many
896
+ * the .first()/.last()/.nth() silently picked from. `ofCount > 1` flags an
897
+ * index op hiding ambiguity. */
898
+ ofCount: number;
899
+ }
900
+ interface ProbeResult {
901
+ /** Human-readable chain echo. NOT a selector. */
902
+ chain: string;
903
+ /** Elements the full chain matches. */
904
+ count: number;
905
+ /** Present only when the chain ends in first/last/nth. */
906
+ pinned?: ProbePinned;
907
+ /** Details of up to the requested limit of matches. */
908
+ matches: ProbeMatch[];
909
+ /** True count before truncation (equal to `count`). */
910
+ totalCount: number;
911
+ truncated: boolean;
912
+ /** Actionable hints: nothing matched, hidden ambiguity, truncation, stale ref. */
913
+ warnings: string[];
914
+ }
915
+
696
916
  /** Terminal outcome reported by the runner via `run:finished`. */
697
917
  type RunOutcome = "completed" | "failed" | "aborted" | "interrupted";
698
918
  /** Scenario-level run-id. Format opaque to consumers; treat as string. */
@@ -829,8 +1049,49 @@ interface WheelChangedEvent extends RunArtifactBase {
829
1049
  kind: "wheel:changed";
830
1050
  owner: "agent" | "human";
831
1051
  }
1052
+ /** Emitted in response to a `probe` debug command: the result of evaluating a
1053
+ * locator string against the live page. `id` echoes the command's id so the
1054
+ * client that issued the probe can correlate the reply. READ-ONLY — producing
1055
+ * it never changed the page. */
1056
+ interface ProbeResultEvent extends RunArtifactBase {
1057
+ kind: "probe:result";
1058
+ /** Correlates with the issuing `DbgCommandProbe.id`. */
1059
+ id: string;
1060
+ result: ProbeResult;
1061
+ }
1062
+ /** A single MCP tool invocation by the agent, surfaced into the session's
1063
+ * event stream so the human sees — in the viewer's System console — what the
1064
+ * agent called and how it ended. Emitted ONLY while the MCP server is attached
1065
+ * to this run (own-browser calls have no session to attach to). Paired:
1066
+ * `tool:call` at invocation, `tool:result` at completion, correlated by
1067
+ * `callId`. Read-only telemetry — emitting it never touches the page. */
1068
+ interface ToolCallEvent extends RunArtifactBase {
1069
+ kind: "tool:call";
1070
+ /** Correlates with the matching `tool:result` (one MCP call). */
1071
+ callId: string;
1072
+ /** MCP tool name, e.g. "check_locator", "explore_step". */
1073
+ tool: string;
1074
+ /** Arguments as a secret-redacted, length-capped JSON string — NOT the raw
1075
+ * object. Capped upstream so the line stays a single atomic append. */
1076
+ args: string;
1077
+ }
1078
+ interface ToolResultEvent extends RunArtifactBase {
1079
+ kind: "tool:result";
1080
+ /** Correlates with the issuing `ToolCallEvent.callId`. */
1081
+ callId: string;
1082
+ tool: string;
1083
+ ok: boolean;
1084
+ durationMs: number;
1085
+ /** Secret-redacted, length-capped preview of the result text. */
1086
+ preview: string;
1087
+ /** Present only when `ok` is false. */
1088
+ error?: {
1089
+ class: string;
1090
+ message: string;
1091
+ };
1092
+ }
832
1093
  /** Discriminated union of every JSONL event the scenario runner emits. */
833
- type RunArtifact = RunStartedEvent | StepStartedEvent | StepOkEvent | StepFailEvent | ScreenshotEvent | FailureBundleWrittenEvent | PausedEvent | ResumedEvent | LocatorPickedEvent | WheelChangedEvent | RunFinishedEvent;
1094
+ type RunArtifact = RunStartedEvent | StepStartedEvent | StepOkEvent | StepFailEvent | ScreenshotEvent | FailureBundleWrittenEvent | PausedEvent | ResumedEvent | LocatorPickedEvent | WheelChangedEvent | ProbeResultEvent | ToolCallEvent | ToolResultEvent | RunFinishedEvent;
834
1095
  interface CollectionRunStartedEvent extends RunArtifactBase {
835
1096
  kind: "collection-run:started";
836
1097
  runId: RunId;
@@ -1010,6 +1271,15 @@ interface EnvUpdate {
1010
1271
  }
1011
1272
 
1012
1273
  type RuntimeState = "starting" | "running" | "paused-step" | "paused-failure" | "paused-breakpoint" | "completed" | "failed" | "aborted";
1274
+ /** The terminal run states — a runtime in any of these has FINISHED and is no
1275
+ * longer live / attachable. */
1276
+ declare const TERMINAL_RUNTIME_STATES: readonly ["completed", "failed", "aborted"];
1277
+ /** True when `state` is terminal (completed / failed / aborted): the run ended.
1278
+ * The single source of truth — every consumer (attach discovery, list_runtimes,
1279
+ * current-location, terminal handling) calls this instead of re-spelling the
1280
+ * literal set. Accepts a plain string so both `RuntimeState` and the runner's
1281
+ * own exec-state union pass without coupling. */
1282
+ declare function isTerminalRuntimeState(state: string): boolean;
1013
1283
  interface RuntimeStateFile {
1014
1284
  runId: string;
1015
1285
  scenario: string;
@@ -1044,6 +1314,20 @@ interface RuntimeStateFile {
1044
1314
  * server / agent) attach to the SAME live browser the human is debugging.
1045
1315
  * Absent for non-shared (normal) runs. Localhost only. */
1046
1316
  wsEndpoint?: string;
1317
+ /** Active device slot of a mobile debug run (`--debug`) — the collaborative
1318
+ * attach handle for runners that drive a shared DEVICE instead of a browser
1319
+ * (the device's WDA is reachable by any client in the project). A second
1320
+ * client (the mobile MCP / agent) joins by targeting this slot + the run's
1321
+ * `commands.jsonl` wheel. Absent for non-debug runs and for browser runners
1322
+ * (which advertise `wsEndpoint` instead). */
1323
+ deviceSlot?: string;
1324
+ /** The run's ACTIVE breakpoints as `"line:col"` keys (0-based col) — the
1325
+ * union of `.debugger.json` for this scenario AND any ephemeral `--debug
1326
+ * --breakpoints` override the runner was started with. Published so the
1327
+ * viewer can paint glyph dots for breakpoints that aren't persisted in
1328
+ * `.debugger.json` (e.g. an agent's `run_test {breakpoints}` override).
1329
+ * Absent ⇒ none / not a debug run. */
1330
+ breakpoints?: string[];
1047
1331
  lastFailure: {
1048
1332
  line: number;
1049
1333
  col: number;
@@ -1057,4 +1341,4 @@ interface RuntimeStateFile {
1057
1341
  updatedAt: number;
1058
1342
  }
1059
1343
 
1060
- export { type AddVariablePlan, type AddVariablePlanInput, type AuthoringRunRequest, type BreakpointEntry, type BreakpointsFile, COLLECTIONS_SUBDIR, COLLECTION_NAME_FORBIDDEN_RE, COMMANDS_FILE, type CollectionMeta, type CollectionRunArtifact, type CollectionRunFinishedEvent, type CollectionRunRequest, type CollectionRunStartedEvent, type CollectionRunTab, type CollectionScenarioFinishedEvent, type CollectionScenarioStartedEvent, type CollectionTab, DEBUGGER_FILE, type DbgCommand, type DbgCommandAbort, type DbgCommandClearBp, type DbgCommandContinue, type DbgCommandKind, type DbgCommandPause, type DbgCommandPickerStart, type DbgCommandPickerStop, type DbgCommandRecord, type DbgCommandSetBp, type DbgCommandSnapshot, type DbgCommandStep, type DbgCommandWheel, type DslDiagnostic, type DslValidateContext, type DslVocabArg, type DslVocabCategory, type DslVocabEntry, E2E_SUBDIR, ENV_FILE, type EnvFile, type EnvUpdate, type EnvVar, type ErrorMessage, type FailureBundleWrittenEvent, type FsBreakpointsChangedMessage, type FsCollectionRunStepMessage, type FsCollectionsChangedMessage, type FsHelpersChangedMessage, type FsRunFinishedMessage, type FsRunStartedMessage, type FsRunStepMessage, type FsScenariosChangedMessage, HEARTBEAT_FILE, HELPERS_SUBDIR, type HelperMeta, type HelperTab, type IDslLanguageService, type ILaunchedProcess, type IProcessLauncher, type IRunnerAdapter, LOCK_FILE, LOG_FILE, type LaunchSpec, type LocatorPickedEvent, type LockFile, type LogLineMessage, type Matcher, PICKER_SNAPSHOT_FILE, type PausedEvent, type PickerMode, RUNNER_CONFIG_KEYS, RUNS_SUBDIR, RUNTIME_FILE, RUN_MANIFEST_FILE, RUN_SOURCES_FILE, type RecordedActionKind, type RegexLiteral, type ResumedEvent, type RunArtifact, type RunFinishedEvent, type RunId, type RunKind, type RunManifest, type RunMeta, type RunOutcome, type RunRequest, type RunSources, type RunStartedEvent, type RunStatus, RunnerAdapterNotFoundError, RunnerNotConfiguredError, type RuntimeState, type RuntimeStateFile, SECRETS_FILE, SEGMENT_NAME_FORBIDDEN_RE, STDERR_FILE, STDOUT_FILE, STEPS_FILE, type ScenarioMeta, type ScenarioRunRequest, type ScenarioRunTab, type ScenarioTab, type ScenariosPayload, type ScreenshotEvent, type StepFailEvent, type StepOkEvent, type StepStartedEvent, TERMINAL_WS_EVENT, type TabKind, type TabKindName, type TerminalClientMessage, type TerminalCloseMessage, type TerminalDataMessage, type TerminalErrorMessage, type TerminalExitMessage, type TerminalKind, type TerminalOutputMessage, type TerminalResizeMessage, type TerminalServerMessage, type TerminalSpawnMessage, UNOTEST_DIR, UnsupportedRunKindError, type VariableCategory, type VariableKind, type VariablePlanError, type WheelChangedEvent, type WsMessage, type WsMessageKind, activeEnvName, categorizeVariable, deleteShadowWarning, envFileFor, envKeys, insertEnvVar, isExternalVarName, isRegexLiteral, isRunnerConfigKey, makeRunId, planAddVariable, regexLiteral, removeEnvVar, sanitizeRunIdSegment, secretsFileFor, serializeEnvValue, validateCollectionName, validateSegmentName };
1344
+ export { type AddVariablePlan, type AddVariablePlanInput, type AppPathPickerSpec, type AppServerEvent, type AuthoringRunRequest, type BreakpointEntry, type BreakpointsFile, COLLECTIONS_SUBDIR, COLLECTION_NAME_FORBIDDEN_RE, COMMANDS_FILE, type CheckSeverity, type CollectionMeta, type CollectionRunArtifact, type CollectionRunFinishedEvent, type CollectionRunRequest, type CollectionRunStartedEvent, type CollectionRunTab, type CollectionScenarioFinishedEvent, type CollectionScenarioStartedEvent, type CollectionTab, type DbgCommand, type DbgCommandAbort, type DbgCommandClearBp, type DbgCommandContinue, type DbgCommandKind, type DbgCommandPause, type DbgCommandPickerStart, type DbgCommandPickerStop, type DbgCommandProbe, type DbgCommandRecord, type DbgCommandSetBp, type DbgCommandSnapshot, type DbgCommandStep, type DbgCommandWheel, type DebugCapabilities, type DoctorCheck, type DoctorContext, type DslDiagnostic, type DslValidateContext, type DslVocabArg, type DslVocabCategory, type DslVocabEntry, E2E_SUBDIR, ENV_FILE, type EnvFile, type EnvUpdate, type EnvVar, type ErrorMessage, type FailureBundleWrittenEvent, type FsBreakpointsChangedMessage, type FsCollectionRunStepMessage, type FsCollectionsChangedMessage, type FsHelpersChangedMessage, type FsRunFinishedMessage, type FsRunStartedMessage, type FsRunStepMessage, type FsScenariosChangedMessage, HEARTBEAT_FILE, HELPERS_SUBDIR, type HelperMeta, type HelperTab, type HostRequirement, type IDslLanguageService, type ILaunchedProcess, type IProcessLauncher, type IRunnerAdapter, LOCK_FILE, LOG_FILE, type LaunchSpec, type LocatorPickedEvent, type LockFile, type LogLineMessage, type Matcher, PICKER_SNAPSHOT_FILE, type PausedEvent, type PickerMode, type ProbeMatch, type ProbePinned, type ProbeResult, type ProbeResultEvent, RUNNER_CONFIG_KEYS, RUNS_SUBDIR, RUNTIME_FILE, RUN_MANIFEST_FILE, RUN_SOURCES_FILE, type RecordedActionKind, type RegexLiteral, type ResumedEvent, type RunArtifact, type RunFinishedEvent, type RunId, type RunKind, type RunManifest, type RunMeta, type RunOutcome, type RunRequest, type RunSources, type RunStartedEvent, type RunStatus, RunnerAdapterNotFoundError, RunnerNotConfiguredError, type RuntimeState, type RuntimeStateFile, SECRETS_FILE, SEGMENT_NAME_FORBIDDEN_RE, STDERR_FILE, STDOUT_FILE, STEPS_FILE, type ScenarioMeta, type ScenarioRunRequest, type ScenarioRunTab, type ScenarioTab, type ScenariosPayload, type ScreenshotEvent, type StepFailEvent, type StepOkEvent, type StepStartedEvent, TERMINAL_RUNTIME_STATES, TERMINAL_WS_EVENT, type TabKind, type TabKindName, type TerminalClientMessage, type TerminalCloseMessage, type TerminalDataMessage, type TerminalErrorMessage, type TerminalExitMessage, type TerminalKind, type TerminalOutputMessage, type TerminalResizeMessage, type TerminalServerMessage, type TerminalSpawnMessage, type ToolCallEvent, type ToolResultEvent, UNOTEST_DIR, UnsupportedRunKindError, type VariableCategory, type VariableKind, type VariablePlanError, type WheelChangedEvent, type WsMessage, type WsMessageKind, activeEnvName, categorizeVariable, debugDirFor, debuggerFileFor, deleteShadowWarning, envFileFor, envKeys, envLayerFilesFor, insertEnvVar, isExternalVarName, isRegexLiteral, isRunnerConfigKey, isTerminalRuntimeState, makeRunId, parseAppServerEvent, parseEnvContent, planAddVariable, regexLiteral, removeEnvVar, runsDirFor, sanitizeRunIdSegment, secretsFileFor, secretsLayerFilesFor, serializeEnvValue, testDirFor, validateCollectionName, validateSegmentName };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- const _0x1f0e61=_0x33f9;(function(_0x38cb05,_0x1ead2a){const _0x13d8d8={_0x4a53ac:0x25d,_0x17e566:0x234,_0x10c109:0x24b,_0x39c227:0x20d,_0x385608:0x200,_0x232f49:0x201},_0x39243a=_0x33f9,_0xc8ec76=_0x38cb05();while(!![]){try{const _0x36e89c=parseInt(_0x39243a(_0x13d8d8._0x4a53ac))/0x1*(-parseInt(_0x39243a(_0x13d8d8._0x17e566))/0x2)+-parseInt(_0x39243a(_0x13d8d8._0x10c109))/0x3+parseInt(_0x39243a(_0x13d8d8._0x39c227))/0x4*(-parseInt(_0x39243a(0x252))/0x5)+parseInt(_0x39243a(_0x13d8d8._0x385608))/0x6+parseInt(_0x39243a(0x205))/0x7+parseInt(_0x39243a(0x224))/0x8+-parseInt(_0x39243a(0x207))/0x9*(-parseInt(_0x39243a(_0x13d8d8._0x232f49))/0xa);if(_0x36e89c===_0x1ead2a)break;else _0xc8ec76['push'](_0xc8ec76['shift']());}catch(_0x21d4af){_0xc8ec76['push'](_0xc8ec76['shift']());}}}(_0x51ae,0x69c7c));var __defProp=Object['defineProperty'],__name=(_0x55616a,_0x2ea849)=>__defProp(_0x55616a,_0x1f0e61(0x211),{'value':_0x2ea849,'configurable':!![]}),UNOTEST_DIR=_0x1f0e61(0x1ee),E2E_SUBDIR=_0x1f0e61(0x258),HELPERS_SUBDIR=_0x1f0e61(0x22c),COLLECTIONS_SUBDIR='_collections',RUNS_SUBDIR=_0x1f0e61(0x21b),LOCK_FILE=_0x1f0e61(0x259),LOG_FILE=_0x1f0e61(0x22e),STEPS_FILE=_0x1f0e61(0x21c),HEARTBEAT_FILE='heartbeat',STDOUT_FILE=_0x1f0e61(0x254),STDERR_FILE=_0x1f0e61(0x220),COMMANDS_FILE=_0x1f0e61(0x1ed),RUNTIME_FILE=_0x1f0e61(0x250),PICKER_SNAPSHOT_FILE=_0x1f0e61(0x1ff),DEBUGGER_FILE=_0x1f0e61(0x20f),ENV_FILE=_0x1f0e61(0x221),SECRETS_FILE='unotest/.secrets';function _0x51ae(){const _0x2131f0=['AxnfEhrLCM5HBfzHCK5HBwu','iIbKB2vZig5VDcbZDxbWB3j0ihj1BIbRAw5Kici','vu5pvevtvf9ftLy','vw5ZDxbWB3j0zwrsDw5lAw5KrxjYB3i','vu5pvevtvf9mt0nbteu','vu5pvevtvf9dt05tt0Xf','zw52s2v5CW','A2LUza','C2vJCMv0','y2fUBM90igXVywqGCNvUBMvYigfKyxb0zxiGiG','CgLJA2vYlxnUyxbZAg90lNr4Da','ndi5nZy0ngPpvwDxCG','ody5otbMse50DgS','CMvNzxHmAxrLCMfS','C291CMnL','C3bSAxrmAw5LCW','mJeWodyXn3rywgPuvG','vu5pvevtvf9erujvr19ive1mx01bwf9cwvrfuW','ntq5re9iueDY','uNvUBMvYqwrHChrLCK5VDezVDw5KrxjYB3i','BxvZDcbUB3qGC3rHCNqGD2L0AcaNlIC','Aw52ywXPzc1Uyw1L','refuqujbu0vFvvjm','vu5pvevtvf9erujvr19lruvqx0nbteXt','mZmWotK2s3bYvKn3','vu5pvevtvf9erujvrW','Dw5VDgvZDc8UzgvIDwDNzxiUANnVBG','Dg9mB3DLCKnHC2u','BMfTzq','igLZigfSC28GC2v0igLUihvUB3rLC3qVlMvUDIdIGjqGDgHLihnLy3jLDcb2ywX1zsbUB3CGC2HHzg93CYbPDc4','Dw5VDgvZDc8UC2vJCMv0CW','C3rYAw5N','CNvU','vu5pvevtvf9erujvr19esvi','vu5pvevtvf9dqunirv9esvi','CgfKu3rHCNq','BxvZDcbUB3qGy29UDgfPBIbCic8GoIaQid8GiIa8id4GFcbVCIbJB250CM9SignOyxjHy3rLCNm','AgfZ','lNj1BNm','C3rLChmUANnVBMW','zw5KC1DPDgG','BgvUz3rO','AxnszwDLEeXPDgvYywW','C3rKzxjYlMXVzW','Dw5VDgvZDc8Uzw52','Dw5RBM93BI1YDw5UzxiTA2v5','vu5pvevtvf9mt0DFtevwruW','otu1nZzmu1HisMy','vu5pvevtvf9orvrxt1jl','C3rHCNrZv2L0Aa','ywrK','B2jQzwn0','DhjPBq','igLZigfSC28GC2v0igLUihvUB3rLC3qVlNnLy3jLDhmG4OcuihrOzsbZzwnYzxqGDMfSDwuGC2HHzg93CYb0AgLZig9Uzs4','vu5pvevtvf9qt1bvuf9huKfdrv9nuW','x2HLBhbLCNm','zw52q29UDgvUDa','lNzPzxDLCI5SB2C','CMvWBgfJzq','iI4G','C2XPy2u','C2fUAxrPEMvsDw5jzfnLz21LBNq','CMvNzxG','mtrMAhPIDMu','zhvWBgLJyxrL','Dg9tDhjPBMC','Aw5KzxHpzG','yxbW','AxnbC3nPz25Tzw50t2y','Aw5Zzxj0rw52vMfY','C2vJCMv0C0zPBgvgB3i','AM9PBG','uNvUBMvYtM90q29UzMLNDxjLzevYCM9Y','C291CMnLCY5QC29U','y3j5ChrV','DgvZDa','vu5pvevtvf9eruzbvuXux1rjtuvpvvrFtvm','C2vJCMv0CW','ChvZAa','zMLUzeLUzgv4','zgvSzxrLu2HHzg93v2fYBMLUzW','igLZig5VDcbHigTUB3DUihj1BM5LCIbZzxr0Aw5NiokaLcbJAg9VC2uGB25LigzYB20GDgHLihj1BM5LCI1JB25MAwCGBgLZDc4','BxvZDcbUB3qGC3rHCNqGD2L0AcaNxYCGkhjLC2vYDMvKkq','Axntzwn0Aw9UrgL2AwrLCG','ig11C3qGyMuGvvbqrvjFu05bs0uGkguUzY4Gqvbqx0jbu0vFvvjmksbZBYbHihnJzw5HCMLVignHBIbYzwzLCMvUy2uGAxqGyNKGBMfTzs4','y2f0zwDVCML6zvzHCMLHyMXL','mZq2odK5B01ouhby','iokaLcbWAwnRigeGzgLMzMvYzw50ig5HBwuGB3iGzwrPDcb0AguGzxHPC3rPBMCGDMfSDwuU','C2vYAwfSAxPLrw52vMfSDwu','iYaTls0G','BxvZDcbUB3qGyMuGzw1WDhK','CNvUDgLTzs5QC29U','igfSCMvHzhKGzxHPC3rZigLUia','ndvArK55CfK','zw52','C3rKB3v0lMXVzW','CMvTB3zLrw52vMfY','CNvUBMvY','vu5pvevtvf9cuK9xu0vs','ztjL','lNzPzxDLCI5SB2nR','vu5pvevtvf9erujvr19quKvwsuvxx0jzvevt','zMLSDgvY','C2vJCMv0C0nVBNrLBNq','mZGWnJnfCgf1D2C','C3bSAxq','qxbW','y29TBwfUzhmUANnVBMW','Dw5VDgvZDa','CgXHBKfKzfzHCMLHyMXL','vu5pvevtvf9iruferuq','DMfSAwrHDgvtzwDTzw50tMfTzq','C3bSAwnL','BxvZDcbUB3qGyMuGiI4Iig9YiciUlIi','BwfUAwzLC3qUANnVBG'];_0x51ae=function(){return _0x2131f0;};return _0x51ae();}function envFileFor(_0xc63703){return _0xc63703?ENV_FILE+'.'+_0xc63703:ENV_FILE;}__name(envFileFor,'envFileFor');function secretsFileFor(_0x45ac5d){return _0x45ac5d?SECRETS_FILE+'.'+_0x45ac5d:SECRETS_FILE;}__name(secretsFileFor,_0x1f0e61(0x23b));function activeEnvName(_0x27e8e9){const _0x268161=_0x1f0e61,_0x250b3b=_0x27e8e9[_0x268161(0x1f7)]?.['trim']();return _0x250b3b?_0x250b3b:void 0x0;}function _0x33f9(_0x2e96f1,_0x5b0908){_0x2e96f1=_0x2e96f1-0x1ec;const _0x51aebd=_0x51ae();let _0x33f91d=_0x51aebd[_0x2e96f1];if(_0x33f9['mirZHF']===undefined){var _0x56bae3=function(_0x51aad6){const _0x11a841='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x55616a='',_0x2ea849='';for(let _0xc63703=0x0,_0x45ac5d,_0x27e8e9,_0x250b3b=0x0;_0x27e8e9=_0x51aad6['charAt'](_0x250b3b++);~_0x27e8e9&&(_0x45ac5d=_0xc63703%0x4?_0x45ac5d*0x40+_0x27e8e9:_0x27e8e9,_0xc63703++%0x4)?_0x55616a+=String['fromCharCode'](0xff&_0x45ac5d>>(-0x2*_0xc63703&0x6)):0x0){_0x27e8e9=_0x11a841['indexOf'](_0x27e8e9);}for(let _0x53a502=0x0,_0x2a672f=_0x55616a['length'];_0x53a502<_0x2a672f;_0x53a502++){_0x2ea849+='%'+('00'+_0x55616a['charCodeAt'](_0x53a502)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2ea849);};_0x33f9['KPQEhF']=_0x56bae3,_0x33f9['FSigyn']={},_0x33f9['mirZHF']=!![];}const _0x273467=_0x51aebd[0x0],_0x5a525f=_0x2e96f1+_0x273467,_0x551b20=_0x33f9['FSigyn'][_0x5a525f];return!_0x551b20?(_0x33f91d=_0x33f9['KPQEhF'](_0x33f91d),_0x33f9['FSigyn'][_0x5a525f]=_0x33f91d):_0x33f91d=_0x551b20,_0x33f91d;}__name(activeEnvName,'activeEnvName');function isRegexLiteral(_0x53a502){const _0x9e11bf={_0x359d3b:0x228},_0x3b88e3=_0x1f0e61;return typeof _0x53a502===_0x3b88e3(_0x9e11bf._0x359d3b)&&_0x53a502!==null&&_0x53a502[_0x3b88e3(0x1fc)]==='regex'&&typeof _0x53a502[_0x3b88e3(0x203)]===_0x3b88e3(0x214)&&typeof _0x53a502['flags']==='string';}__name(isRegexLiteral,_0x1f0e61(0x21f));function regexLiteral(_0x2a672f,_0x50f6e0=''){const _0x35d2d4={_0x3b5303:0x233},_0x741b72=_0x1f0e61;return{'kind':_0x741b72(_0x35d2d4._0x3b5303),'source':_0x2a672f,'flags':_0x50f6e0};}__name(regexLiteral,_0x1f0e61(0x202));var RAND_BYTES=0x3;function makeRunId(_0x36f805){const _0x947e41={_0x58b3cc:0x236,_0x562653:0x23f},_0x2ad894=_0x1f0e61,_0x3d2060=sanitizeRunIdSegment(_0x36f805),_0x5160e2=Date['now']()[_0x2ad894(_0x947e41._0x58b3cc)](0x24),_0x2b69d4=new Uint8Array(RAND_BYTES);globalThis[_0x2ad894(_0x947e41._0x562653)]['getRandomValues'](_0x2b69d4);let _0x57fdcc='';for(let _0x4083cc=0x0;_0x4083cc<_0x2b69d4[_0x2ad894(0x21e)];_0x4083cc++){_0x57fdcc+=_0x2b69d4[_0x4083cc][_0x2ad894(_0x947e41._0x58b3cc)](0x10)[_0x2ad894(0x218)](0x2,'0');}return _0x3d2060+'-'+_0x5160e2+'-'+_0x57fdcc;}__name(makeRunId,'makeRunId');function sanitizeRunIdSegment(_0xe3bd1d){const _0x467364={_0x24e5be:0x21e},_0x4a8dee=_0x1f0e61,_0xe79735=_0xe3bd1d[_0x4a8dee(0x22f)](/[^a-zA-Z0-9_-]+/g,'-')['replace'](/-+/g,'-')[_0x4a8dee(0x22f)](/^-|-$/g,'');return _0xe79735[_0x4a8dee(_0x467364._0x24e5be)]>0x0?_0xe79735:_0x4a8dee(0x215);}__name(sanitizeRunIdSegment,_0x1f0e61(0x232));var COLLECTION_NAME_FORBIDDEN_RE=/[\\/:*?"<>|\x00-\x1f]/;function validateCollectionName(_0xbc4dce){const _0x479df4={_0x5351f5:0x229,_0x39eee9:0x21e,_0x5ab7b3:0x24f,_0x45ef4f:0x226,_0x4e9515:0x240,_0x3887ad:0x219},_0x268c8b=_0x1f0e61;if(typeof _0xbc4dce!=='string')return'must\x20be\x20a\x20string';const _0x3550bc=_0xbc4dce[_0x268c8b(_0x479df4._0x5351f5)]();if(_0x3550bc[_0x268c8b(_0x479df4._0x39eee9)]===0x0)return _0x268c8b(_0x479df4._0x5ab7b3);if(_0x3550bc==='.'||_0x3550bc==='..')return _0x268c8b(0x1f3);if(_0x3550bc[_0x268c8b(_0x479df4._0x45ef4f)]('.'))return _0x268c8b(0x209);if(COLLECTION_NAME_FORBIDDEN_RE[_0x268c8b(_0x479df4._0x4e9515)](_0x3550bc))return _0x268c8b(_0x479df4._0x3887ad);return null;}__name(validateCollectionName,'validateCollectionName');var RUN_MANIFEST_FILE=_0x1f0e61(0x1f4),RUN_SOURCES_FILE=_0x1f0e61(0x23e),UnsupportedRunKindError=class extends Error{static{__name(this,_0x1f0e61(0x1f8));}constructor(_0x9ee938,_0x2b19b5){const _0x1bf2d3=_0x1f0e61;super('runner\x20\x22'+_0x2b19b5+_0x1bf2d3(0x1f6)+_0x9ee938+'\x22'),this['name']=_0x1bf2d3(0x1f8);}},RunnerAdapterNotFoundError=class extends Error{static{__name(this,_0x1f0e61(0x208));}constructor(_0xcb36ad,_0x5d07d3){const _0x2818de={_0x529a02:0x1fe,_0x2cbf13:0x208},_0x2ecb25=_0x1f0e61;super(_0x2ecb25(_0x2818de._0x529a02)+_0xcb36ad+_0x2ecb25(0x230)+_0x5d07d3),this['name']=_0x2ecb25(_0x2818de._0x2cbf13);}},RunnerNotConfiguredError=class extends Error{static{__name(this,'RunnerNotConfiguredError');}constructor(_0x4570c2){const _0x59a39c={_0x3825bb:0x211},_0x3da234=_0x1f0e61;super(_0x4570c2),this[_0x3da234(_0x59a39c._0x3825bb)]=_0x3da234(0x23d);}},SEGMENT_NAME_FORBIDDEN_RE=/[\\/:*?"<>|\x00-\x1f]/;function validateSegmentName(_0x5c3b0e){const _0x5a3c1e={_0xa8ba3e:0x24f,_0x12b4c2:0x1f3,_0x5b4a98:0x226,_0x2bb7db:0x247,_0x30c8cd:0x240},_0x45da77=_0x1f0e61;if(typeof _0x5c3b0e!=='string')return'must\x20be\x20a\x20string';const _0xa31cd7=_0x5c3b0e['trim']();if(_0xa31cd7[_0x45da77(0x21e)]===0x0)return _0x45da77(_0x5a3c1e._0xa8ba3e);if(_0xa31cd7==='.'||_0xa31cd7==='..')return _0x45da77(_0x5a3c1e._0x12b4c2);if(_0xa31cd7[_0x45da77(_0x5a3c1e._0x5b4a98)]('.'))return _0x45da77(0x209);if(_0xa31cd7[_0x45da77(_0x5a3c1e._0x5b4a98)]('_'))return _0x45da77(_0x5a3c1e._0x2bb7db);if(SEGMENT_NAME_FORBIDDEN_RE[_0x45da77(_0x5a3c1e._0x30c8cd)](_0xa31cd7))return'must\x20not\x20contain\x20\x5c\x20/\x20:\x20*\x20?\x20\x22\x20<\x20>\x20|\x20or\x20control\x20characters';return null;}__name(validateSegmentName,_0x1f0e61(0x1f1));var TERMINAL_WS_EVENT='terminal',RUNNER_CONFIG_KEYS=new Set([_0x1f0e61(0x257),_0x1f0e61(0x1f0),'UNOTEST_SLOW_MO',_0x1f0e61(0x241),'UNOTEST_DEFAULT_NAVIGATION_TIMEOUT_MS',_0x1f0e61(0x22b),_0x1f0e61(0x1f9),'UNOTEST_TIMEZONE',_0x1f0e61(0x223),_0x1f0e61(0x20e),_0x1f0e61(0x216),'UNOTEST_DEBUG_MAX_BYTES',_0x1f0e61(0x25a),_0x1f0e61(0x206),_0x1f0e61(0x20c),_0x1f0e61(0x225),_0x1f0e61(0x1fa),_0x1f0e61(0x217),'NO_COLOR','FORCE_COLOR',_0x1f0e61(0x20b)]);function isRunnerConfigKey(_0x38536f){const _0x3a6264=_0x1f0e61;return RUNNER_CONFIG_KEYS[_0x3a6264(0x21a)](_0x38536f);}__name(isRunnerConfigKey,'isRunnerConfigKey');function categorizeVariable(_0x2b874){const _0x4c935b={_0x168734:0x203,_0x350445:0x242,_0x55f45b:0x1fd},_0x368e97=_0x1f0e61;if(_0x2b874[_0x368e97(_0x4c935b._0x168734)]===_0x368e97(_0x4c935b._0x350445))return _0x368e97(_0x4c935b._0x55f45b);return isRunnerConfigKey(_0x2b874['name'])?_0x368e97(0x256):_0x368e97(0x238);}__name(categorizeVariable,_0x1f0e61(0x24a));function isExternalVarName(_0xac84a0){const _0x4cc968={_0x3bbd51:0x240},_0x5b803e=_0x1f0e61;return/^[A-Z][A-Z0-9_]*$/[_0x5b803e(_0x4cc968._0x3bbd51)](_0xac84a0);}__name(isExternalVarName,_0x1f0e61(0x1f5));function serializeEnvValue(_0x58f93f){const _0xa7ee4f={_0x1e58da:0x240,_0x1e72ab:0x22f},_0x479ca7=_0x1f0e61;if(_0x58f93f==='')return'';if(/[\s#"'=\\]|^[`]/['test'](_0x58f93f)||/[\n\r]/[_0x479ca7(_0xa7ee4f._0x1e58da)](_0x58f93f)){const _0x397997=_0x58f93f[_0x479ca7(_0xa7ee4f._0x1e72ab)](/\\/g,'\x5c\x5c')[_0x479ca7(0x22f)](/"/g,'\x5c\x22')[_0x479ca7(_0xa7ee4f._0x1e72ab)](/\n/g,'\x5cn')[_0x479ca7(_0xa7ee4f._0x1e72ab)](/\r/g,'\x5cr');return'\x22'+_0x397997+'\x22';}return _0x58f93f;}__name(serializeEnvValue,_0x1f0e61(0x24d));function envKeys(_0x534855){const _0x25e112={_0x37da95:0x25e,_0x4b476b:0x229,_0x51891e:0x240,_0x24be55:0x227},_0x56be10=_0x1f0e61,_0x23cfac=new Set();for(const _0x2ba23f of _0x534855[_0x56be10(_0x25e112._0x37da95)](/\r?\n/)){const _0x6e3c9=_0x2ba23f[_0x56be10(_0x25e112._0x4b476b)]();if(_0x6e3c9===''||_0x6e3c9[_0x56be10(0x226)]('#'))continue;const _0x111485=_0x6e3c9['indexOf']('=');if(_0x111485<=0x0)continue;const _0x36d4cc=_0x6e3c9['slice'](0x0,_0x111485)[_0x56be10(0x229)]();if(/^[A-Za-z_][A-Za-z0-9_]*$/[_0x56be10(_0x25e112._0x51891e)](_0x36d4cc))_0x23cfac[_0x56be10(_0x25e112._0x24be55)](_0x36d4cc);}return _0x23cfac;}__name(envKeys,_0x1f0e61(0x1fb));function isSectionDivider(_0x59aa3b){const _0x4c6a02={_0x41c6a4:0x226},_0x46402d=_0x1f0e61,_0x537627=_0x59aa3b[_0x46402d(0x229)]();return _0x537627[_0x46402d(_0x4c6a02._0x41c6a4)]('#')&&/---/[_0x46402d(0x240)](_0x537627);}__name(isSectionDivider,_0x1f0e61(0x248));function isAssignmentLine(_0x8ece7d){const _0x1a0f81={_0x1d0949:0x237,_0x527170:0x231},_0x2814aa=_0x1f0e61,_0x25dd6b=_0x8ece7d[_0x2814aa(0x229)]();if(_0x25dd6b===''||_0x25dd6b[_0x2814aa(0x226)]('#'))return![];const _0x318078=_0x25dd6b[_0x2814aa(_0x1a0f81._0x1d0949)]('=');return _0x318078>0x0&&/^[A-Za-z_][A-Za-z0-9_]*$/[_0x2814aa(0x240)](_0x25dd6b[_0x2814aa(_0x1a0f81._0x527170)](0x0,_0x318078)[_0x2814aa(0x229)]());}__name(isAssignmentLine,'isAssignmentLine');function isAssignmentOf(_0x2d8764,_0x3b91d7){const _0x1b74e2=_0x1f0e61,_0x24bfb6=_0x2d8764[_0x1b74e2(0x229)]();if(_0x24bfb6===''||_0x24bfb6[_0x1b74e2(0x226)]('#'))return![];const _0xa82690=_0x24bfb6['indexOf']('=');if(_0xa82690<=0x0)return![];return _0x24bfb6[_0x1b74e2(0x231)](0x0,_0xa82690)[_0x1b74e2(0x229)]()===_0x3b91d7;}__name(isAssignmentOf,_0x1f0e61(0x239));function splitLines(_0x20d72d){const _0x45a3eb={_0x2de1f2:0x21d,_0xe1cf45:0x231,_0x281fc2:0x25e},_0x5c4cb8=_0x1f0e61,_0x2c281a=_0x20d72d[_0x5c4cb8(_0x45a3eb._0x2de1f2)]('\x0a'),_0x3355ad=_0x2c281a?_0x20d72d[_0x5c4cb8(_0x45a3eb._0xe1cf45)](0x0,-0x1):_0x20d72d;return{'lines':_0x3355ad===''?[]:_0x3355ad[_0x5c4cb8(_0x45a3eb._0x281fc2)]('\x0a'),'trailingNewline':_0x2c281a};}__name(splitLines,_0x1f0e61(0x204));function joinLines(_0x50f552,_0x14d8b8){const _0x2117fc=_0x1f0e61,_0x93be1b=_0x50f552[_0x2117fc(0x23c)]('\x0a');return _0x14d8b8||_0x93be1b===''?_0x93be1b+'\x0a':_0x93be1b;}__name(joinLines,'joinLines');function insertEnvVar(_0x188c04,_0x3e47bc,_0x2940c5,_0xed420d){const _0x2b7248={_0xd59b30:0x210,_0x288b8b:0x229,_0x5eab7d:0x243},_0x4859a1=_0x1f0e61,_0x37c865=_0x3e47bc+'='+serializeEnvValue(_0x2940c5),{lines:_0x5d31ae,trailingNewline:_0x134cb9}=splitLines(_0x188c04);if(_0xed420d){const _0x4bf986=new RegExp('\x5cb'+_0xed420d[_0x4859a1(_0x2b7248._0xd59b30)]()+'\x5cb'),_0x374d59=_0x5d31ae[_0x4859a1(0x244)](_0x3bc857=>isSectionDivider(_0x3bc857)&&_0x4bf986[_0x4859a1(0x240)](_0x3bc857[_0x4859a1(0x210)]()));if(_0x374d59!==-0x1){let _0x5f0b95=_0x5d31ae['length'];for(let _0x1466cf=_0x374d59+0x1;_0x1466cf<_0x5d31ae[_0x4859a1(0x21e)];_0x1466cf++){if(isSectionDivider(_0x5d31ae[_0x1466cf])){_0x5f0b95=_0x1466cf;break;}}let _0x49654c=-0x1,_0x1879bb=-0x1;for(let _0x55e7d2=_0x374d59+0x1;_0x55e7d2<_0x5f0b95;_0x55e7d2++){if(_0x5d31ae[_0x55e7d2][_0x4859a1(_0x2b7248._0x288b8b)]()!=='')_0x1879bb=_0x55e7d2;if(isAssignmentLine(_0x5d31ae[_0x55e7d2]))_0x49654c=_0x55e7d2;}const _0x3333f6=_0x49654c>=0x0?_0x49654c:_0x1879bb,_0x322b38=_0x3333f6>=0x0?_0x3333f6+0x1:_0x374d59+0x1;return _0x5d31ae[_0x4859a1(0x1f2)](_0x322b38,0x0,_0x37c865),joinLines(_0x5d31ae,_0x134cb9||_0x5d31ae['length']>0x0);}if(_0x5d31ae['length']>0x0)_0x5d31ae['push']('');return _0x5d31ae[_0x4859a1(_0x2b7248._0x5eab7d)](_0x4859a1(0x24e)+_0xed420d+'\x20---',_0x37c865),joinLines(_0x5d31ae,!![]);}return _0x5d31ae[_0x4859a1(0x243)](_0x37c865),joinLines(_0x5d31ae,!![]);}__name(insertEnvVar,_0x1f0e61(0x23a));function removeEnvVar(_0x52edbb,_0x248430){const _0x2d1812={_0x2bc4bc:0x25b},_0x202974=_0x1f0e61,{lines:_0x206f2b,trailingNewline:_0x45a27c}=splitLines(_0x52edbb),_0x4f6dfe=_0x206f2b[_0x202974(_0x2d1812._0x2bc4bc)](_0x42693d=>!isAssignmentOf(_0x42693d,_0x248430)),_0x23c17d=_0x4f6dfe[_0x202974(0x21e)]!==_0x206f2b[_0x202974(0x21e)];return{'content':joinLines(_0x4f6dfe,_0x45a27c),'removed':_0x23c17d};}__name(removeEnvVar,_0x1f0e61(0x255));var SECTION_BY_KIND={'app':_0x1f0e61(0x1ec),'runner':'Runner','secret':void 0x0};function planAddVariable(_0x1699f1){const _0x39dd5f={_0x4ec17c:0x222,_0x3dee5e:0x25c,_0x5f393b:0x21a,_0x71ccda:0x1fd,_0x3bc962:0x242,_0x5bf886:0x213,_0x1c05ff:0x221,_0xa68ea5:0x235,_0x5da33b:0x251,_0x1f2001:0x24c},_0x1156a9=_0x1f0e61,{name:_0x10c3e7,kind:_0x4f2b4f}=_0x1699f1;if(_0x4f2b4f===_0x1156a9(0x256)){if(!isRunnerConfigKey(_0x10c3e7))return{'ok':![],'code':_0x1156a9(_0x39dd5f._0x4ec17c),'message':_0x10c3e7+_0x1156a9(0x246)};}else{if(!isExternalVarName(_0x10c3e7))return{'ok':![],'code':_0x1156a9(0x20a),'message':_0x10c3e7+_0x1156a9(0x249)};}const _0x3bc757=envKeys(_0x1699f1[_0x1156a9(0x22d)])['has'](_0x10c3e7),_0xcd7eb7=envKeys(_0x1699f1[_0x1156a9(_0x39dd5f._0x3dee5e)])[_0x1156a9(_0x39dd5f._0x5f393b)](_0x10c3e7),_0x58d91e=_0x4f2b4f===_0x1156a9(_0x39dd5f._0x71ccda)?_0x1156a9(_0x39dd5f._0x3bc962):_0x1156a9(0x253),_0x579a83=_0x58d91e==='secrets'?_0xcd7eb7:_0x3bc757,_0xf67b1e=_0x58d91e==='secrets'?_0x1156a9(_0x39dd5f._0x5bf886):_0x1156a9(_0x39dd5f._0x1c05ff);if(_0x579a83)return{'ok':![],'code':_0x1156a9(_0x39dd5f._0xa68ea5),'message':_0x10c3e7+_0x1156a9(_0x39dd5f._0x5da33b)+_0xf67b1e+_0x1156a9(_0x39dd5f._0x1f2001)};const _0x849263=[];return _0x4f2b4f===_0x1156a9(_0x39dd5f._0x71ccda)&&_0x3bc757&&_0x849263[_0x1156a9(0x243)](_0x10c3e7+_0x1156a9(0x212)),_0x4f2b4f!==_0x1156a9(0x1fd)&&_0xcd7eb7&&_0x849263['push'](_0x10c3e7+_0x1156a9(0x22a)),{'ok':!![],'target':_0x58d91e,'sectionLabel':SECTION_BY_KIND[_0x4f2b4f],'warnings':_0x849263};}__name(planAddVariable,_0x1f0e61(0x1ef));function deleteShadowWarning(_0xf8edb1,_0x4962ce,_0x4e53ce){if(_0x4e53ce!==void 0x0&&_0x4e53ce!==_0x4962ce)return[_0xf8edb1+'\x20is\x20also\x20set\x20in\x20your\x20shell\x20environment\x20—\x20it\x20will\x20keep\x20resolving\x20from\x20there\x20(the\x20environment\x20wins\x20over\x20the\x20file).'];return[];}__name(deleteShadowWarning,_0x1f0e61(0x245));export{COLLECTIONS_SUBDIR,COLLECTION_NAME_FORBIDDEN_RE,COMMANDS_FILE,DEBUGGER_FILE,E2E_SUBDIR,ENV_FILE,HEARTBEAT_FILE,HELPERS_SUBDIR,LOCK_FILE,LOG_FILE,PICKER_SNAPSHOT_FILE,RUNNER_CONFIG_KEYS,RUNS_SUBDIR,RUNTIME_FILE,RUN_MANIFEST_FILE,RUN_SOURCES_FILE,RunnerAdapterNotFoundError,RunnerNotConfiguredError,SECRETS_FILE,SEGMENT_NAME_FORBIDDEN_RE,STDERR_FILE,STDOUT_FILE,STEPS_FILE,TERMINAL_WS_EVENT,UNOTEST_DIR,UnsupportedRunKindError,activeEnvName,categorizeVariable,deleteShadowWarning,envFileFor,envKeys,insertEnvVar,isExternalVarName,isRegexLiteral,isRunnerConfigKey,makeRunId,planAddVariable,regexLiteral,removeEnvVar,sanitizeRunIdSegment,secretsFileFor,serializeEnvValue,validateCollectionName,validateSegmentName};
1
+ const _0x28d146=_0x4e2f;(function(_0xc46330,_0x4286ef){const _0x5df0fc={_0x234001:0x207,_0x4c4d4b:0x1d2,_0x2d6868:0x213,_0x2854f9:0x239,_0x3b467b:0x243},_0x3b0098=_0x4e2f,_0x5af7f9=_0xc46330();while(!![]){try{const _0x34528f=parseInt(_0x3b0098(_0x5df0fc._0x234001))/0x1+-parseInt(_0x3b0098(_0x5df0fc._0x4c4d4b))/0x2+-parseInt(_0x3b0098(_0x5df0fc._0x2d6868))/0x3*(parseInt(_0x3b0098(_0x5df0fc._0x2854f9))/0x4)+parseInt(_0x3b0098(0x22a))/0x5*(-parseInt(_0x3b0098(_0x5df0fc._0x3b467b))/0x6)+parseInt(_0x3b0098(0x1f8))/0x7+parseInt(_0x3b0098(0x219))/0x8*(parseInt(_0x3b0098(0x1ca))/0x9)+parseInt(_0x3b0098(0x1cf))/0xa*(parseInt(_0x3b0098(0x1f6))/0xb);if(_0x34528f===_0x4286ef)break;else _0x5af7f9['push'](_0x5af7f9['shift']());}catch(_0x526f3c){_0x5af7f9['push'](_0x5af7f9['shift']());}}}(_0x21b2,0x7abb4));var __defProp=Object['defineProperty'],__name=(_0x35127a,_0x403ef7)=>__defProp(_0x35127a,_0x28d146(0x1fd),{'value':_0x403ef7,'configurable':!![]});function parseAppServerEvent(_0x1f4ef1){const _0x23a96e={_0x305ae3:0x224,_0x1e3609:0x218,_0x5501e9:0x1cd,_0x26d303:0x22b},_0x1cfb0d=_0x28d146,_0x444b4d=_0x1f4ef1[_0x1cfb0d(_0x23a96e._0x305ae3)]();if(!_0x444b4d[_0x1cfb0d(0x1f5)]('{'))return null;try{const _0x27b771=JSON[_0x1cfb0d(0x1fc)](_0x444b4d);if(_0x27b771['kind']===_0x1cfb0d(_0x23a96e._0x1e3609)||_0x27b771[_0x1cfb0d(0x22b)]===_0x1cfb0d(_0x23a96e._0x5501e9)||_0x27b771[_0x1cfb0d(_0x23a96e._0x26d303)]==='app-server:error')return _0x27b771;return null;}catch{return null;}}__name(parseAppServerEvent,_0x28d146(0x21d));var UNOTEST_DIR='unotest',E2E_SUBDIR=_0x28d146(0x244),HELPERS_SUBDIR=_0x28d146(0x214),COLLECTIONS_SUBDIR=_0x28d146(0x1fa),RUNS_SUBDIR=_0x28d146(0x1d9);function testDirFor(_0x33cb3e){return''+E2E_SUBDIR+_0x33cb3e;}__name(testDirFor,_0x28d146(0x231));function runsDirFor(_0x24f868){return''+RUNS_SUBDIR+_0x24f868;}__name(runsDirFor,_0x28d146(0x1e2));function debugDirFor(_0x502f51){return'.debug'+_0x502f51;}__name(debugDirFor,_0x28d146(0x216));function debuggerFileFor(_0xa05769){return UNOTEST_DIR+'/.debugger'+_0xa05769+'.json';}__name(debuggerFileFor,_0x28d146(0x20a));var LOCK_FILE=_0x28d146(0x235),LOG_FILE=_0x28d146(0x22e),STEPS_FILE=_0x28d146(0x238),HEARTBEAT_FILE=_0x28d146(0x228),STDOUT_FILE='stdout.log',STDERR_FILE='stderr.log',COMMANDS_FILE=_0x28d146(0x1f3),RUNTIME_FILE='runtime.json',PICKER_SNAPSHOT_FILE=_0x28d146(0x20c),ENV_FILE=_0x28d146(0x1ea),SECRETS_FILE=_0x28d146(0x23b);function envFileFor(_0x1d6d12,_0x58e25a){return''+ENV_FILE+_0x1d6d12+(_0x58e25a?'.'+_0x58e25a:'');}__name(envFileFor,_0x28d146(0x1f7));function secretsFileFor(_0x15c0ad,_0x216aef){return''+SECRETS_FILE+_0x15c0ad+(_0x216aef?'.'+_0x216aef:'');}__name(secretsFileFor,'secretsFileFor');function envLayerFilesFor(_0x3b2b67,_0x56cd4d){return layersFor(ENV_FILE,_0x3b2b67,_0x56cd4d);}__name(envLayerFilesFor,_0x28d146(0x23a));function secretsLayerFilesFor(_0x2d225f,_0x3625ae){return layersFor(SECRETS_FILE,_0x2d225f,_0x3625ae);}__name(secretsLayerFilesFor,'secretsLayerFilesFor');function layersFor(_0x274b4f,_0x907ee3,_0xe73cb7){const _0x171b76={_0x2551b1:0x1eb,_0x38c3d3:0x1eb},_0x5992f0=_0x28d146,_0x29b210=[_0x274b4f];if(_0x907ee3)_0x29b210[_0x5992f0(_0x171b76._0x2551b1)](''+_0x274b4f+_0x907ee3);if(_0xe73cb7){_0x29b210[_0x5992f0(_0x171b76._0x38c3d3)](_0x274b4f+'.'+_0xe73cb7);if(_0x907ee3)_0x29b210['push'](''+_0x274b4f+_0x907ee3+'.'+_0xe73cb7);}return _0x29b210;}__name(layersFor,_0x28d146(0x229));function activeEnvName(_0x831153){const _0x268400=_0x28d146,_0x5ece43=_0x831153[_0x268400(0x200)]?.['trim']();return _0x5ece43?_0x5ece43:void 0x0;}__name(activeEnvName,_0x28d146(0x1df));function isRegexLiteral(_0x3c9b0e){const _0x3acd05={_0x1d4a56:0x22b,_0x3d5dcf:0x1f9},_0x43c974=_0x28d146;return typeof _0x3c9b0e==='object'&&_0x3c9b0e!==null&&_0x3c9b0e[_0x43c974(_0x3acd05._0x1d4a56)]===_0x43c974(_0x3acd05._0x3d5dcf)&&typeof _0x3c9b0e[_0x43c974(0x246)]===_0x43c974(0x21c)&&typeof _0x3c9b0e['flags']==='string';}__name(isRegexLiteral,_0x28d146(0x223));function regexLiteral(_0x180b7a,_0x1ba283=''){const _0x40d837=_0x28d146;return{'kind':_0x40d837(0x1f9),'source':_0x180b7a,'flags':_0x1ba283};}__name(regexLiteral,_0x28d146(0x241));var RAND_BYTES=0x3;function makeRunId(_0x1c08d8){const _0x32e198={_0x437e0a:0x23d,_0x5ad211:0x249,_0x57c034:0x242,_0x15b2f0:0x1e9},_0x3e0cbe=_0x28d146,_0x140159=sanitizeRunIdSegment(_0x1c08d8),_0x6c47b7=Date['now']()['toString'](0x24),_0x3fcf79=new Uint8Array(RAND_BYTES);globalThis[_0x3e0cbe(_0x32e198._0x437e0a)][_0x3e0cbe(0x245)](_0x3fcf79);let _0x104af8='';for(let _0x5002ec=0x0;_0x5002ec<_0x3fcf79[_0x3e0cbe(_0x32e198._0x5ad211)];_0x5002ec++){_0x104af8+=_0x3fcf79[_0x5002ec][_0x3e0cbe(_0x32e198._0x57c034)](0x10)[_0x3e0cbe(_0x32e198._0x15b2f0)](0x2,'0');}return _0x140159+'-'+_0x6c47b7+'-'+_0x104af8;}__name(makeRunId,_0x28d146(0x1d3));function sanitizeRunIdSegment(_0x14c01f){const _0xeec5cc={_0x649591:0x217,_0x50c4f9:0x217},_0x30ba74=_0x28d146,_0x4c35e6=_0x14c01f[_0x30ba74(_0xeec5cc._0x649591)](/[^a-zA-Z0-9_-]+/g,'-')[_0x30ba74(0x217)](/-+/g,'-')[_0x30ba74(_0xeec5cc._0x50c4f9)](/^-|-$/g,'');return _0x4c35e6['length']>0x0?_0x4c35e6:'run';}__name(sanitizeRunIdSegment,_0x28d146(0x1e1));var COLLECTION_NAME_FORBIDDEN_RE=/[\\/:*?"<>|\x00-\x1f]/;function validateCollectionName(_0x2e2c35){const _0x66ddc5={_0x1d52c2:0x201,_0x1ad331:0x1d1,_0x3f59f1:0x1f5,_0x41fdbe:0x24a},_0x23d0da=_0x28d146;if(typeof _0x2e2c35!==_0x23d0da(0x21c))return'must\x20be\x20a\x20string';const _0x56967b=_0x2e2c35[_0x23d0da(0x224)]();if(_0x56967b[_0x23d0da(0x249)]===0x0)return _0x23d0da(_0x66ddc5._0x1d52c2);if(_0x56967b==='.'||_0x56967b==='..')return _0x23d0da(_0x66ddc5._0x1ad331);if(_0x56967b[_0x23d0da(_0x66ddc5._0x3f59f1)]('.'))return _0x23d0da(0x220);if(COLLECTION_NAME_FORBIDDEN_RE[_0x23d0da(_0x66ddc5._0x41fdbe)](_0x56967b))return _0x23d0da(0x210);return null;}__name(validateCollectionName,_0x28d146(0x1ee));var RUN_MANIFEST_FILE=_0x28d146(0x1f0),RUN_SOURCES_FILE=_0x28d146(0x227),UnsupportedRunKindError=class extends Error{static{__name(this,_0x28d146(0x1de));}constructor(_0x4b44dd,_0x3c0adf){const _0x28222d={_0x2e7dec:0x1fe,_0x4da540:0x1de},_0x5c4c81=_0x28d146;super(_0x5c4c81(0x1d5)+_0x3c0adf+_0x5c4c81(_0x28222d._0x2e7dec)+_0x4b44dd+'\x22'),this['name']=_0x5c4c81(_0x28222d._0x4da540);}},RunnerAdapterNotFoundError=class extends Error{static{__name(this,'RunnerAdapterNotFoundError');}constructor(_0x2634db,_0x3327ff){const _0xaa3cd9={_0x461e76:0x1da},_0x1d195f=_0x28d146;super(_0x1d195f(0x1e8)+_0x2634db+_0x1d195f(0x222)+_0x3327ff),this['name']=_0x1d195f(_0xaa3cd9._0x461e76);}},RunnerNotConfiguredError=class extends Error{static{__name(this,'RunnerNotConfiguredError');}constructor(_0x6b5c62){const _0x412223={_0x4220ee:0x1d7},_0x3a61e5=_0x28d146;super(_0x6b5c62),this[_0x3a61e5(0x1fd)]=_0x3a61e5(_0x412223._0x4220ee);}},SEGMENT_NAME_FORBIDDEN_RE=/[\\/:*?"<>|\x00-\x1f]/;function validateSegmentName(_0x33d05b){const _0x1886fe={_0x18ada4:0x201,_0x4df6b0:0x1f5,_0xcd131d:0x1f5,_0x1e3b5d:0x215,_0x48fdaf:0x210},_0x5e49fe=_0x28d146;if(typeof _0x33d05b!==_0x5e49fe(0x21c))return _0x5e49fe(0x20f);const _0x3da06b=_0x33d05b['trim']();if(_0x3da06b[_0x5e49fe(0x249)]===0x0)return _0x5e49fe(_0x1886fe._0x18ada4);if(_0x3da06b==='.'||_0x3da06b==='..')return'must\x20not\x20be\x20\x22.\x22\x20or\x20\x22..\x22';if(_0x3da06b[_0x5e49fe(_0x1886fe._0x4df6b0)]('.'))return'must\x20not\x20start\x20with\x20\x27.\x27';if(_0x3da06b[_0x5e49fe(_0x1886fe._0xcd131d)]('_'))return _0x5e49fe(_0x1886fe._0x1e3b5d);if(SEGMENT_NAME_FORBIDDEN_RE['test'](_0x3da06b))return _0x5e49fe(_0x1886fe._0x48fdaf);return null;}__name(validateSegmentName,'validateSegmentName');var TERMINAL_WS_EVENT=_0x28d146(0x1e7),RUNNER_CONFIG_KEYS=new Set([_0x28d146(0x1fb),'UNOTEST_HEADED',_0x28d146(0x205),_0x28d146(0x236),_0x28d146(0x1ed),_0x28d146(0x1db),_0x28d146(0x233),_0x28d146(0x206),'UNOTEST_LOG_LEVEL',_0x28d146(0x247),_0x28d146(0x1e3),'UNOTEST_DEBUG_MAX_BYTES',_0x28d146(0x21b),_0x28d146(0x1dd),_0x28d146(0x1dc),'UNOTEST_NETWORK',_0x28d146(0x20d),_0x28d146(0x203),_0x28d146(0x20e),_0x28d146(0x1ce),_0x28d146(0x226)]);function isRunnerConfigKey(_0x21673b){const _0x481ce5={_0x40b7f6:0x225},_0x5f120d=_0x28d146;return RUNNER_CONFIG_KEYS[_0x5f120d(_0x481ce5._0x40b7f6)](_0x21673b);}__name(isRunnerConfigKey,_0x28d146(0x208));function categorizeVariable(_0x34db5a){const _0x46f944={_0x316c76:0x248},_0x535a58=_0x28d146;if(_0x34db5a[_0x535a58(0x246)]==='secrets')return _0x535a58(0x240);return isRunnerConfigKey(_0x34db5a[_0x535a58(0x1fd)])?_0x535a58(_0x46f944._0x316c76):'app';}__name(categorizeVariable,_0x28d146(0x1ec));function isExternalVarName(_0x448962){const _0x558d34={_0x1cd59a:0x24a},_0x1700fa=_0x28d146;return/^[A-Z][A-Z0-9_]*$/[_0x1700fa(_0x558d34._0x1cd59a)](_0x448962);}__name(isExternalVarName,_0x28d146(0x1e4));function parseEnvContent(_0x1fed3e){const _0x486972={_0x13541d:0x202,_0x2448b0:0x224,_0x8b0a2f:0x24a,_0x4ee773:0x249},_0x4cf0d0=_0x28d146,_0x150d4d={};for(const _0x2407d3 of _0x1fed3e[_0x4cf0d0(0x1e5)](/\r?\n/)){const _0x31382e=_0x2407d3[_0x4cf0d0(0x224)]();if(_0x31382e===''||_0x31382e[_0x4cf0d0(0x1f5)]('#'))continue;const _0x3e2a14=_0x31382e[_0x4cf0d0(0x1f4)]('=');if(_0x3e2a14<=0x0)continue;const _0x51b339=_0x31382e[_0x4cf0d0(_0x486972._0x13541d)](0x0,_0x3e2a14)[_0x4cf0d0(_0x486972._0x2448b0)]();if(!/^[A-Za-z_][A-Za-z0-9_]*$/[_0x4cf0d0(_0x486972._0x8b0a2f)](_0x51b339))continue;let _0x119fec=_0x31382e[_0x4cf0d0(0x202)](_0x3e2a14+0x1)[_0x4cf0d0(_0x486972._0x2448b0)]();if(_0x119fec[_0x4cf0d0(0x249)]>=0x2){const _0x4652aa=_0x119fec[0x0],_0x5dc471=_0x119fec[_0x119fec[_0x4cf0d0(_0x486972._0x4ee773)]-0x1];(_0x4652aa==='\x22'||_0x4652aa==='\x27')&&_0x4652aa===_0x5dc471&&(_0x119fec=_0x119fec[_0x4cf0d0(_0x486972._0x13541d)](0x1,-0x1));}_0x150d4d[_0x51b339]=_0x119fec;}return _0x150d4d;}__name(parseEnvContent,'parseEnvContent');function serializeEnvValue(_0x4b64ec){const _0x56cb9e={_0x3e5bb7:0x217},_0x1f6c5e=_0x28d146;if(_0x4b64ec==='')return'';if(/[\s#"'=\\]|^[`]/[_0x1f6c5e(0x24a)](_0x4b64ec)||/[\n\r]/[_0x1f6c5e(0x24a)](_0x4b64ec)){const _0x314d9b=_0x4b64ec[_0x1f6c5e(_0x56cb9e._0x3e5bb7)](/\\/g,'\x5c\x5c')[_0x1f6c5e(0x217)](/"/g,'\x5c\x22')[_0x1f6c5e(0x217)](/\n/g,'\x5cn')['replace'](/\r/g,'\x5cr');return'\x22'+_0x314d9b+'\x22';}return _0x4b64ec;}__name(serializeEnvValue,_0x28d146(0x1d4));function envKeys(_0x6c6ea8){const _0x178057={_0x21ba39:0x1e5,_0x4c7f40:0x1f5,_0x5f3f05:0x1f4,_0x55720b:0x202},_0x26b538=_0x28d146,_0x43bfee=new Set();for(const _0x56ffa5 of _0x6c6ea8[_0x26b538(_0x178057._0x21ba39)](/\r?\n/)){const _0x26fa46=_0x56ffa5['trim']();if(_0x26fa46===''||_0x26fa46[_0x26b538(_0x178057._0x4c7f40)]('#'))continue;const _0x14b0f2=_0x26fa46[_0x26b538(_0x178057._0x5f3f05)]('=');if(_0x14b0f2<=0x0)continue;const _0x42bb09=_0x26fa46[_0x26b538(_0x178057._0x55720b)](0x0,_0x14b0f2)[_0x26b538(0x224)]();if(/^[A-Za-z_][A-Za-z0-9_]*$/[_0x26b538(0x24a)](_0x42bb09))_0x43bfee[_0x26b538(0x23c)](_0x42bb09);}return _0x43bfee;}__name(envKeys,_0x28d146(0x211));function isSectionDivider(_0x1ef431){const _0xc56479={_0x5d992e:0x1f5},_0x2f1862=_0x28d146,_0x340cd5=_0x1ef431['trim']();return _0x340cd5[_0x2f1862(_0xc56479._0x5d992e)]('#')&&/---/[_0x2f1862(0x24a)](_0x340cd5);}__name(isSectionDivider,_0x28d146(0x23f));function isAssignmentLine(_0x236ff6){const _0x55c1aa={_0x24912f:0x1f4,_0x43b1eb:0x224},_0x2ae097=_0x28d146,_0x536d39=_0x236ff6['trim']();if(_0x536d39===''||_0x536d39[_0x2ae097(0x1f5)]('#'))return![];const _0x56d163=_0x536d39[_0x2ae097(_0x55c1aa._0x24912f)]('=');return _0x56d163>0x0&&/^[A-Za-z_][A-Za-z0-9_]*$/[_0x2ae097(0x24a)](_0x536d39['slice'](0x0,_0x56d163)[_0x2ae097(_0x55c1aa._0x43b1eb)]());}__name(isAssignmentLine,_0x28d146(0x1d8));function isAssignmentOf(_0xe9c4c9,_0x2316d5){const _0x584e07={_0x338708:0x224,_0x4e2dc:0x1f4,_0x156643:0x202},_0x54dd4d=_0x28d146,_0x118202=_0xe9c4c9[_0x54dd4d(_0x584e07._0x338708)]();if(_0x118202===''||_0x118202[_0x54dd4d(0x1f5)]('#'))return![];const _0x4948c9=_0x118202[_0x54dd4d(_0x584e07._0x4e2dc)]('=');if(_0x4948c9<=0x0)return![];return _0x118202[_0x54dd4d(_0x584e07._0x156643)](0x0,_0x4948c9)[_0x54dd4d(0x224)]()===_0x2316d5;}__name(isAssignmentOf,_0x28d146(0x21e));function splitLines(_0x49335b){const _0x2d3419={_0x110574:0x232,_0x21b616:0x1e5},_0x25e9ba=_0x28d146,_0x5a77e5=_0x49335b[_0x25e9ba(_0x2d3419._0x110574)]('\x0a'),_0x55ae79=_0x5a77e5?_0x49335b[_0x25e9ba(0x202)](0x0,-0x1):_0x49335b;return{'lines':_0x55ae79===''?[]:_0x55ae79[_0x25e9ba(_0x2d3419._0x21b616)]('\x0a'),'trailingNewline':_0x5a77e5};}__name(splitLines,_0x28d146(0x237));function joinLines(_0x19b5bb,_0x3b71cc){const _0x2ce829={_0x153d77:0x22c},_0x4f450d=_0x28d146,_0x47e96a=_0x19b5bb[_0x4f450d(_0x2ce829._0x153d77)]('\x0a');return _0x3b71cc||_0x47e96a===''?_0x47e96a+'\x0a':_0x47e96a;}__name(joinLines,_0x28d146(0x1cb));function _0x21b2(){const _0x2b74c9=['Aw52ywXPzc1Uyw1L','uNvUBMvYtM90q29UzMLNDxjLzevYCM9Y','AxnbC3nPz25Tzw50tgLUzq','lNj1BNm','uNvUBMvYqwrHChrLCK5VDezVDw5KrxjYB3i','vu5pvevtvf9qt1bvuf9huKfdrv9nuW','vu5pvevtvf9erujvr19lruvqx0nbteXt','vu5pvevtvf9erujvr19ive1mx01bwf9cwvrfuW','vw5ZDxbWB3j0zwrsDw5lAw5KrxjYB3i','ywn0AxzLrw52tMfTzq','zw52q29UDgvUDa','C2fUAxrPEMvsDw5jzfnLz21LBNq','CNvUC0rPCKzVCG','vu5pvevtvf9erujvr19esvi','AxnfEhrLCM5HBfzHCK5HBwu','C3bSAxq','AxnuzxjTAw5HBfj1BNrPBwvtDgf0zq','DgvYBwLUywW','y2fUBM90igXVywqGCNvUBMvYigfKyxb0zxiGiG','CgfKu3rHCNq','Dw5VDgvZDc8Uzw52','ChvZAa','y2f0zwDVCML6zvzHCMLHyMXL','vu5pvevtvf9eruzbvuXux05bvKLhqvrjt05FveLnru9vvf9nuW','DMfSAwrHDgvdB2XSzwn0Aw9UtMfTzq','igLZigfSC28GC2v0igLUihLVDxiGC2HLBgWGzw52AxjVBM1LBNqG4OcuigL0ihDPBgWGA2vLCcbYzxnVBhzPBMCGzNjVBsb0AgvYzsaODgHLigvUDMLYB25Tzw50ihDPBNmGB3zLCIb0AguGzMLSzsKU','BwfUAwzLC3qUANnVBG','zMLUzeLUzgv4','ic0Tlq','y29TBwfUzhmUANnVBMW','Aw5KzxHpzG','C3rHCNrZv2L0Aa','mJuYntaXn096Bg9jCq','zw52rMLSzuzVCG','mtK3odC2vgrfyMn5','CMvNzxG','x2nVBgXLy3rPB25Z','vu5pvevtvf9cuK9xu0vs','CgfYC2u','BMfTzq','iIbKB2vZig5VDcbZDxbWB3j0ihj1BIbRAw5Kici','zgvSzxrLu2HHzg93v2fYBMLUzW','vu5pvevtvf9ftLy','BxvZDcbUB3qGyMuGzw1WDhK','C2XPy2u','vu5pvevtvf9dqunirv9esvi','iYaTls0G','vu5pvevtvf9tte9xx01p','vu5pvevtvf9usu1fwK9orq','nZG5odfpAg1YBg8','AxnsDw5UzxjdB25MAwDlzxK','Dw5RBM93BI1YDw5UzxiTA2v5','zgvIDwDNzxjgAwXLrM9Y','qxbW','CgLJA2vYlxnUyxbZAg90lNr4Da','vu5pvevtvf9dt05tt0Xf','tK9Fq09mt1i','BxvZDcbIzsbHihn0CMLUzW','BxvZDcbUB3qGy29UDgfPBIbCic8GoIaQid8GiIa8id4GFcbVCIbJB250CM9SignOyxjHy3rLCNm','zw52s2v5CW','Aw5JBhvKzxm','oteWmKfrwMndCW','x2HLBhbLCNm','BxvZDcbUB3qGC3rHCNqGD2L0AcaNxYCGkhjLC2vYDMvKkq','zgvIDwDeAxjgB3i','CMvWBgfJzq','yxbWlxnLCNzLCJPYzwfKEq','mZjJzMDhseG','igLZig5VDcbHigTUB3DUihj1BM5LCIbZzxr0Aw5NiokaLcbJAg9VC2uGB25LigzYB20GDgHLihj1BM5LCI1JB25MAwCGBgLZDc4','vu5pvevtvf9erujvr19quKvwsuvxx0jzvevt','C3rYAw5N','CgfYC2vbChbtzxj2zxjfDMvUDa','AxnbC3nPz25Tzw50t2y','igfSCMvHzhKGzxHPC3rZigLUia','BxvZDcbUB3qGC3rHCNqGD2L0AcaNlIC','C2vJCMv0C0nVBNrLBNq','iI4G','AxnszwDLEeXPDgvYywW','DhjPBq','AgfZ','refuqujbu0vFvvjm','C291CMnLCY5QC29U','AgvHCNrIzwf0','Bgf5zxjZrM9Y','mtvMCg1MDfy','A2LUza','AM9PBG','CgXHBKfKzfzHCMLHyMXL','lNzPzxDLCI5SB2C','C2vJCMv0CW','Dg9mB3DLCKnHC2u','DgvZDerPCKzVCG','zw5KC1DPDgG','vu5pvevtvf9mt0nbteu','C3bSAwnL','lNzPzxDLCI5SB2nR','vu5pvevtvf9eruzbvuXux1rjtuvpvvrFtvm','C3bSAxrmAw5LCW','C3rLChmUANnVBMW','mti4mhDdsKjSuW','zw52tgf5zxjgAwXLC0zVCG','Dw5VDgvZDc8UC2vJCMv0CW','ywrK','y3j5ChrV','ig11C3qGyMuGvvbqrvjFu05bs0uGkguUzY4Gqvbqx0jbu0vFvvjmksbZBYbHihnJzw5HCMLVignHBIbYzwzLCMvUy2uGAxqGyNKGBMfTzs4','Axntzwn0Aw9UrgL2AwrLCG','C2vJCMv0','CMvNzxHmAxrLCMfS','Dg9tDhjPBMC','odu5mJzhANnjChu','ztjL','z2v0uMfUzg9TvMfSDwvZ','C291CMnL','vu5pvevtvf9erujvrW','CNvUBMvY','BgvUz3rO','DgvZDa','ntm4odC1zvjRsen6','AM9PBKXPBMvZ','zw52','yxbWlxnLCNzLCJPYzxvZzwq','rK9sq0vFq09mt1i','odbYBKT2sfq','igLZigfSC28GC2v0igLUihvUB3rLC3qVlMvUDIdIGjqGDgHLihnLy3jLDcb2ywX1zsbUB3CGC2HHzg93CYbPDc4','BxvZDcbUB3qGyMuGiI4Iig9YiciUlIi','mtmZmZe0ohv3BMrrBq','BwfRzvj1BKLK','C2vYAwfSAxPLrw52vMfSDwu','CNvUBMvYici'];_0x21b2=function(){return _0x2b74c9;};return _0x21b2();}function insertEnvVar(_0x35b95c,_0x20c470,_0x50addd,_0x4e039d){const _0x1a97f4={_0x286054:0x249,_0x54e080:0x1eb,_0x4b8a14:0x204,_0x130b6a:0x1f2},_0x50110c=_0x28d146,_0x268ec1=_0x20c470+'='+serializeEnvValue(_0x50addd),{lines:_0x3dcbc1,trailingNewline:_0x179740}=splitLines(_0x35b95c);if(_0x4e039d){const _0x5125fe=new RegExp('\x5cb'+_0x4e039d['toLowerCase']()+'\x5cb'),_0x3285c4=_0x3dcbc1[_0x50110c(0x1f1)](_0x411ce0=>isSectionDivider(_0x411ce0)&&_0x5125fe[_0x50110c(0x24a)](_0x411ce0[_0x50110c(0x230)]()));if(_0x3285c4!==-0x1){let _0x50af67=_0x3dcbc1[_0x50110c(0x249)];for(let _0x2c028d=_0x3285c4+0x1;_0x2c028d<_0x3dcbc1[_0x50110c(_0x1a97f4._0x286054)];_0x2c028d++){if(isSectionDivider(_0x3dcbc1[_0x2c028d])){_0x50af67=_0x2c028d;break;}}let _0x383a38=-0x1,_0x18007e=-0x1;for(let _0x5520db=_0x3285c4+0x1;_0x5520db<_0x50af67;_0x5520db++){if(_0x3dcbc1[_0x5520db][_0x50110c(0x224)]()!=='')_0x18007e=_0x5520db;if(isAssignmentLine(_0x3dcbc1[_0x5520db]))_0x383a38=_0x5520db;}const _0x1c5015=_0x383a38>=0x0?_0x383a38:_0x18007e,_0x3372ee=_0x1c5015>=0x0?_0x1c5015+0x1:_0x3285c4+0x1;return _0x3dcbc1[_0x50110c(0x234)](_0x3372ee,0x0,_0x268ec1),joinLines(_0x3dcbc1,_0x179740||_0x3dcbc1[_0x50110c(0x249)]>0x0);}if(_0x3dcbc1[_0x50110c(_0x1a97f4._0x286054)]>0x0)_0x3dcbc1[_0x50110c(0x1eb)]('');return _0x3dcbc1[_0x50110c(_0x1a97f4._0x54e080)](_0x50110c(_0x1a97f4._0x4b8a14)+_0x4e039d+_0x50110c(_0x1a97f4._0x130b6a),_0x268ec1),joinLines(_0x3dcbc1,!![]);}return _0x3dcbc1[_0x50110c(_0x1a97f4._0x54e080)](_0x268ec1),joinLines(_0x3dcbc1,!![]);}__name(insertEnvVar,'insertEnvVar');function removeEnvVar(_0x129b9a,_0x2b8fab){const _0x591d6f={_0x456f84:0x249,_0x2dfa9e:0x249},_0x5d4657=_0x28d146,{lines:_0xf15658,trailingNewline:_0x200842}=splitLines(_0x129b9a),_0x4f17fb=_0xf15658['filter'](_0x575e60=>!isAssignmentOf(_0x575e60,_0x2b8fab)),_0xdfdd4=_0x4f17fb[_0x5d4657(_0x591d6f._0x456f84)]!==_0xf15658[_0x5d4657(_0x591d6f._0x2dfa9e)];return{'content':joinLines(_0x4f17fb,_0x200842),'removed':_0xdfdd4};}__name(removeEnvVar,'removeEnvVar');var SECTION_BY_KIND={'app':_0x28d146(0x20b),'runner':'Runner','secret':void 0x0};function _0x4e2f(_0x3107fe,_0x28af49){_0x3107fe=_0x3107fe-0x1ca;const _0x21b21d=_0x21b2();let _0x4e2fde=_0x21b21d[_0x3107fe];if(_0x4e2f['SvKyTu']===undefined){var _0x6588c8=function(_0xe4f152){const _0x4356ec='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x35127a='',_0x403ef7='';for(let _0x1f4ef1=0x0,_0x444b4d,_0x27b771,_0x33cb3e=0x0;_0x27b771=_0xe4f152['charAt'](_0x33cb3e++);~_0x27b771&&(_0x444b4d=_0x1f4ef1%0x4?_0x444b4d*0x40+_0x27b771:_0x27b771,_0x1f4ef1++%0x4)?_0x35127a+=String['fromCharCode'](0xff&_0x444b4d>>(-0x2*_0x1f4ef1&0x6)):0x0){_0x27b771=_0x4356ec['indexOf'](_0x27b771);}for(let _0x24f868=0x0,_0x502f51=_0x35127a['length'];_0x24f868<_0x502f51;_0x24f868++){_0x403ef7+='%'+('00'+_0x35127a['charCodeAt'](_0x24f868)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x403ef7);};_0x4e2f['naIKhl']=_0x6588c8,_0x4e2f['WBgoRJ']={},_0x4e2f['SvKyTu']=!![];}const _0x49822c=_0x21b21d[0x0],_0xf4e4b2=_0x3107fe+_0x49822c,_0x1d0f3d=_0x4e2f['WBgoRJ'][_0xf4e4b2];return!_0x1d0f3d?(_0x4e2fde=_0x4e2f['naIKhl'](_0x4e2fde),_0x4e2f['WBgoRJ'][_0xf4e4b2]=_0x4e2fde):_0x4e2fde=_0x1d0f3d,_0x4e2fde;}function planAddVariable(_0x58c3d4){const _0xb5c7a2={_0x5f80e1:0x248,_0xb7e1e3:0x209,_0x3f2324:0x1d6,_0x32254d:0x225,_0x2b7367:0x240,_0x2b743a:0x22f,_0x1fd043:0x23b,_0x27148d:0x1ea,_0x5566fb:0x1eb,_0x3c4ef9:0x1d0,_0x94eebc:0x1eb},_0x39d2d5=_0x28d146,{name:_0x5f14c6,kind:_0xa31f0d}=_0x58c3d4;if(_0xa31f0d===_0x39d2d5(_0xb5c7a2._0x5f80e1)){if(!isRunnerConfigKey(_0x5f14c6))return{'ok':![],'code':_0x39d2d5(_0xb5c7a2._0xb7e1e3),'message':_0x5f14c6+_0x39d2d5(0x21a)};}else{if(!isExternalVarName(_0x5f14c6))return{'ok':![],'code':_0x39d2d5(_0xb5c7a2._0x3f2324),'message':_0x5f14c6+_0x39d2d5(0x23e)};}const _0x2ab94b=envKeys(_0x58c3d4[_0x39d2d5(0x1e0)])[_0x39d2d5(_0xb5c7a2._0x32254d)](_0x5f14c6),_0x148291=envKeys(_0x58c3d4[_0x39d2d5(0x221)])[_0x39d2d5(0x225)](_0x5f14c6),_0x24d2c4=_0xa31f0d===_0x39d2d5(_0xb5c7a2._0x2b7367)?_0x39d2d5(_0xb5c7a2._0x2b743a):_0x39d2d5(0x1cc),_0x42e762=_0x24d2c4===_0x39d2d5(0x22f)?_0x148291:_0x2ab94b,_0x67dd63=_0x24d2c4===_0x39d2d5(0x22f)?_0x39d2d5(_0xb5c7a2._0x1fd043):_0x39d2d5(_0xb5c7a2._0x27148d);if(_0x42e762)return{'ok':![],'code':'duplicate','message':_0x5f14c6+_0x39d2d5(0x21f)+_0x67dd63+'\x20—\x20pick\x20a\x20different\x20name\x20or\x20edit\x20the\x20existing\x20value.'};const _0x4eeb88=[];return _0xa31f0d===_0x39d2d5(_0xb5c7a2._0x2b7367)&&_0x2ab94b&&_0x4eeb88[_0x39d2d5(_0xb5c7a2._0x5566fb)](_0x5f14c6+_0x39d2d5(_0xb5c7a2._0x3c4ef9)),_0xa31f0d!=='secret'&&_0x148291&&_0x4eeb88[_0x39d2d5(_0xb5c7a2._0x94eebc)](_0x5f14c6+'\x20is\x20also\x20set\x20in\x20unotest/.secrets\x20—\x20the\x20secret\x20value\x20shadows\x20this\x20one.'),{'ok':!![],'target':_0x24d2c4,'sectionLabel':SECTION_BY_KIND[_0xa31f0d],'warnings':_0x4eeb88};}__name(planAddVariable,_0x28d146(0x22d));function deleteShadowWarning(_0x3944e3,_0x1c8648,_0x429d0a){const _0x4f9c17=_0x28d146;if(_0x429d0a!==void 0x0&&_0x429d0a!==_0x1c8648)return[_0x3944e3+_0x4f9c17(0x1ef)];return[];}__name(deleteShadowWarning,_0x28d146(0x1ff));var TERMINAL_RUNTIME_STATES=['completed','failed','aborted'];function isTerminalRuntimeState(_0x5b32ea){const _0x3e38d7={_0x2c0e69:0x212},_0x1d4443=_0x28d146;return TERMINAL_RUNTIME_STATES[_0x1d4443(_0x3e38d7._0x2c0e69)](_0x5b32ea);}__name(isTerminalRuntimeState,_0x28d146(0x1e6));export{COLLECTIONS_SUBDIR,COLLECTION_NAME_FORBIDDEN_RE,COMMANDS_FILE,E2E_SUBDIR,ENV_FILE,HEARTBEAT_FILE,HELPERS_SUBDIR,LOCK_FILE,LOG_FILE,PICKER_SNAPSHOT_FILE,RUNNER_CONFIG_KEYS,RUNS_SUBDIR,RUNTIME_FILE,RUN_MANIFEST_FILE,RUN_SOURCES_FILE,RunnerAdapterNotFoundError,RunnerNotConfiguredError,SECRETS_FILE,SEGMENT_NAME_FORBIDDEN_RE,STDERR_FILE,STDOUT_FILE,STEPS_FILE,TERMINAL_RUNTIME_STATES,TERMINAL_WS_EVENT,UNOTEST_DIR,UnsupportedRunKindError,activeEnvName,categorizeVariable,debugDirFor,debuggerFileFor,deleteShadowWarning,envFileFor,envKeys,envLayerFilesFor,insertEnvVar,isExternalVarName,isRegexLiteral,isRunnerConfigKey,isTerminalRuntimeState,makeRunId,parseAppServerEvent,parseEnvContent,planAddVariable,regexLiteral,removeEnvVar,runsDirFor,sanitizeRunIdSegment,secretsFileFor,secretsLayerFilesFor,serializeEnvValue,testDirFor,validateCollectionName,validateSegmentName};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unotest/protocol",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "Cross-runner protocol for the @unotest ecosystem: shared TypeScript types, path constants, the IRunnerAdapter contract that lets @unotest/viewer drive @unotest/web, @unotest/mobile (and future runners) through the same surface. Pure types + pure functions only — zero runtime deps, browser-safe.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {