From 9180227c39e02c84356acdb37958a5606d2e2cb2 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 31 May 2026 10:56:27 -0400 Subject: [PATCH 1/7] unit test --- .../trailblaze/host/AppTargetDiscoveryTest.kt | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/trailblaze-host/src/test/java/xyz/block/trailblaze/host/AppTargetDiscoveryTest.kt b/trailblaze-host/src/test/java/xyz/block/trailblaze/host/AppTargetDiscoveryTest.kt index 7de062c96..84b82974d 100644 --- a/trailblaze-host/src/test/java/xyz/block/trailblaze/host/AppTargetDiscoveryTest.kt +++ b/trailblaze-host/src/test/java/xyz/block/trailblaze/host/AppTargetDiscoveryTest.kt @@ -177,6 +177,112 @@ class AppTargetDiscoveryTest { ) } + @Test + fun `env config dir wins over a cwd workspace that owns a colliding trailmap id`() { + // Regression: mirrors the OSS CI hang reproduction. CWD is a workspace that itself + // owns a `wikipedia` trailmap (here: android-only). TRAILBLAZE_CONFIG_DIR points at + // a DIFFERENT workspace (here: an `examples/wikipedia/`-shaped tree) whose `wikipedia` + // trailmap registers a web-only YAML tool. The env-pointed workspace must win at every + // layer — discovered target, registered workspace YAML tools — so the env-pointed + // trail's tools register and dispatch doesn't hang. Without `TRAILBLAZE_CONFIG_DIR` + // suppressing cwd walk-up, the daemon would load the cwd workspace's tools instead + // (`cwd_android_tool` here, the equivalent of `calendar_android_*` / `contacts_ios_*` + // in the CI symptom) and the trail's `env_web_tool` reference would never resolve. + val cwdWorkspace = tempFolder.newFolder("cwd-workspace") + val cwdTrailmapDir = File(cwdWorkspace, "trails/config/trailmaps/wikipedia").apply { mkdirs() } + File(cwdTrailmapDir, "tools").mkdirs() + File(cwdTrailmapDir, "tools/cwd_android_tool.tool.yaml").writeText( + """ + id: cwd_android_tool + description: Repo-root trailmap's android-only tool — must NOT register when env wins. + parameters: [] + tools: + - maestro: + commands: + - back: {} + """.trimIndent(), + ) + File(cwdTrailmapDir, "trailmap.yaml").writeText( + """ + id: wikipedia + target: + display_name: CWD Android Wikipedia + platforms: + android: + app_ids: + - org.wikipedia + """.trimIndent(), + ) + File(cwdWorkspace, "trails/config/trailblaze.yaml").apply { + parentFile.mkdirs() + writeText( + """ + targets: + - wikipedia + """.trimIndent(), + ) + } + + val envWorkspace = tempFolder.newFolder("env-workspace") + val envTrailmapDir = File(envWorkspace, "trails/config/trailmaps/wikipedia").apply { mkdirs() } + File(envTrailmapDir, "tools").mkdirs() + File(envTrailmapDir, "tools/env_web_tool.tool.yaml").writeText( + """ + id: env_web_tool + description: Env-pointed example workspace's web tool — must register and win. + parameters: [] + tools: + - maestro: + commands: + - back: {} + """.trimIndent(), + ) + File(envTrailmapDir, "trailmap.yaml").writeText( + """ + id: wikipedia + target: + display_name: Env Web Wikipedia + platforms: + web: {} + """.trimIndent(), + ) + val envConfigDir = File(envWorkspace, "trails/config").apply { mkdirs() } + File(envConfigDir, "trailblaze.yaml").writeText( + """ + targets: + - wikipedia + """.trimIndent(), + ) + + val discovered = AppTargetDiscovery.discover( + workspaceConfigProvider = { + TrailblazeWorkspaceConfigResolver.resolve( + fromPath = cwdWorkspace.toPath(), + envReader = { envConfigDir.absolutePath }, + ) + }, + ) + + // Target reflects env-workspace, not the cwd one with the colliding id. + val target = discovered.firstOrNull { it.id == "wikipedia" } + assertNotNull(target) + assertEquals("Env Web Wikipedia", target.displayName) + + // Workspace YAML tool registration reflects env-workspace, not the cwd one. + val registeredNames = TrailblazeSerializationInitializer.buildYamlDefinedTools() + .keys + .map { it.toolName } + .toSet() + assertTrue( + "env_web_tool" in registeredNames, + "env-pointed workspace's `env_web_tool` must register; got: $registeredNames", + ) + assertTrue( + "cwd_android_tool" !in registeredNames, + "cwd workspace's `cwd_android_tool` must NOT register when env wins; got: $registeredNames", + ) + } + @Test fun `malformed workspace trailblaze_yaml does not suppress sibling target discovery`() { val workspace = tempFolder.newFolder("workspace") From 16c8981283b2eaaebc9ba9b19368e1b7cc02b69a Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 31 May 2026 13:03:42 -0400 Subject: [PATCH 2/7] Playwright deadlock fix. --- .../capture/video/PlaywrightVideoRecordDir.kt | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt b/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt index dd81b2784..92593948d 100644 --- a/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt +++ b/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt @@ -2,6 +2,10 @@ package xyz.block.trailblaze.capture.video import java.io.File import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException +import xyz.block.trailblaze.util.Console /** * Bridge between [PlaywrightVideoCapture] (in this module) and the Playwright browser @@ -58,13 +62,61 @@ object PlaywrightVideoRecordDir { entries[deviceId]?.finalizer = null } - /** Runs the finalizer for [deviceId] if one is registered. Swallows callback exceptions. */ + /** + * Runs the finalizer for [deviceId] if one is registered, bounded by + * [FINALIZER_TIMEOUT_MS]. Swallows callback exceptions and timeouts. + * + * The finalizer typically dispatches `BrowserContext.close()` onto a Playwright- + * affinity dispatcher via `runBlocking(playwrightDispatcher) { ... }` (see + * `PlaywrightBrowserManager.setFinalizer`). If that dispatcher is wedged (the + * known thread-affinity deadlock pattern flagged in `PlaywrightThreadBridge.kt`'s + * kdoc — "wedged a 1800s timeout on a 30-second test"), the `runBlocking` will + * never return. Caller-side coroutine cancellation (`withTimeoutOrNull`) does not + * help here because the blocking `runBlocking(dispatcher)` is not cooperatively + * cancellable — only a separate-thread bound + abandon does. + * + * On timeout we log + drop the in-flight flush and let the capture stream fall + * back to whatever was already written to disk. The Playwright `.webm` is + * append-only as the page runs, so the on-disk file is typically close to + * complete even when the close-and-finalize step fails. The thread is left to + * unwind on its own (the executor's daemon flag prevents JVM-shutdown hang); + * `future.cancel(true)` interrupts it best-effort. + */ fun runFinalizer(deviceId: String) { val finalizer = entries[deviceId]?.finalizer ?: return + val executor = Executors.newSingleThreadExecutor { r -> + Thread(r, "playwright-video-finalizer-$deviceId").apply { isDaemon = true } + } + val future = executor.submit { + try { + finalizer() + } catch (_: Throwable) { + // Best-effort flush — capture stream will fall through to whatever is on disk. + } + } try { - finalizer() + future.get(FINALIZER_TIMEOUT_MS, TimeUnit.MILLISECONDS) + } catch (_: TimeoutException) { + Console.log( + "[PlaywrightVideoRecordDir] finalizer for deviceId=$deviceId timed out after " + + "${FINALIZER_TIMEOUT_MS}ms — falling back to on-disk artifact", + ) + future.cancel(true) } catch (_: Throwable) { - // Best-effort flush — capture stream will fall through to whatever is on disk. + // Other Future-side errors (InterruptedException, ExecutionException) — swallowed, + // preserving the existing "best-effort flush" contract. + } finally { + // Drop the executor reference; the daemon thread (if still running after a + // timeout) will not block JVM shutdown. + executor.shutdownNow() } } + + /** + * Upper bound on a finalizer invocation. The legitimate path is fast (a few hundred + * ms for `BrowserContext.close()` + recreate); 30 s is generous enough to absorb a + * slow CI runner without letting a deadlock wedge the daemon's run-status pipeline + * the way the historical 1800s symptom did. + */ + private const val FINALIZER_TIMEOUT_MS = 30_000L } From 98e2ecbee1a77051c511d9340b0385c282ed03fd Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 31 May 2026 14:02:32 -0400 Subject: [PATCH 3/7] Playwright deadlock fix and optimize report generation with prebuilt uber jar --- .github/pr_generate_report_assets.sh | 22 ++++++-------- .github/pr_generate_trailblaze_report.sh | 29 ++++++++++++------- .../xyz/block/trailblaze/cli/DaemonClient.kt | 12 ++++++-- .../cli/DaemonClientPollResilienceTest.kt | 4 +-- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/.github/pr_generate_report_assets.sh b/.github/pr_generate_report_assets.sh index 5909263b6..2b14c8f71 100755 --- a/.github/pr_generate_report_assets.sh +++ b/.github/pr_generate_report_assets.sh @@ -5,9 +5,9 @@ # build to embed on https://block.github.io/trailblaze/reports/. # # This is SEPARATE from pr_generate_trailblaze_report.sh (which builds the CI -# `trailblaze_report.html` index via `:trailblaze-report:run`). Here we drive the -# `trailblaze report` CLI subcommand, which is the only entry point wired to the -# `--storyboard` / `--webp` exporters. +# `trailblaze_report.html` index). Both scripts drive the `trailblaze report` CLI +# subcommand off the prebuilt uber JAR; this one passes `--storyboard` / `--webp`, +# which are wired only on that subcommand. # # Intentionally NOT `set -e`: a missing encoder or a flaky capture must never red the # trail job. We emit clear diagnostics and exit 0 so the workflow's upload step still @@ -38,15 +38,11 @@ else echo "WARNING: ffmpeg with libwebp_anim not found — the animated timeline.webp will be skipped." fi -# The report HTML (and therefore the storyboard/webp, which screenshot it via headless -# Playwright) renders from the WASM report template. In CI `./trailblaze` runs via Gradle -# WITHOUT -Ptrailblaze.wasm=true, so we must materialize the template to the build-output -# path that ReportTemplateResolver checks (trailblaze-report/build/report-template/). -echo "Building WASM report template..." -./gradlew :trailblaze-report:generateReportTemplate -Ptrailblaze.wasm=true || { - echo "ERROR: failed to build WASM report template — reports would render blank. Aborting asset gen." - exit 0 -} +# The WASM report template ships embedded in the prebuilt uber JAR (the +# `build-uber-jar` workflow job invokes Gradle with -Ptrailblaze.wasm=true, +# which makes `packageUberJarForCurrentOS` depend on `bundleReportTemplate`). +# `trailblaze report` resolves it from the JAR's classpath, so no separate +# template build step is needed here. # Resolve the single session this trail produced. Session logs are per-session dirs under # $LOGS_DIR; skip the sibling `reports/` output dir. Newest wins if there's more than one. @@ -61,7 +57,7 @@ echo "Using session: $SESSION_ID" # --max-size caps the animated WebP so it stays light on the docs page and well under # any inline limits; the HTML report itself is not size-capped (it's a download/link-out). echo "Exporting storyboard + animated WebP + interactive report..." -./trailblaze report --id "$SESSION_ID" --output-dir "$OUT_DIR" \ +trailblaze report --id "$SESSION_ID" --output-dir "$OUT_DIR" \ --storyboard --webp --no-gif --max-size=8MB echo "=========================================" diff --git a/.github/pr_generate_trailblaze_report.sh b/.github/pr_generate_trailblaze_report.sh index 52784a097..7f8ff98c8 100755 --- a/.github/pr_generate_trailblaze_report.sh +++ b/.github/pr_generate_trailblaze_report.sh @@ -1,26 +1,35 @@ #!/usr/bin/env bash +# Generate the CI `trailblaze_report.html` index for the trail run. +# +# Runs entirely off the prebuilt Trailblaze CLI installed on $PATH by the +# upstream `build-uber-jar` job's `install-trailblaze-from-artifact.sh` step. +# The WASM report template is bundled into the uber JAR's classpath (the +# build-uber-jar job invokes Gradle with -Ptrailblaze.wasm=true), so there's +# no separate `:trailblaze-ui:wasmJsBrowserProductionWebpack` / +# `:trailblaze-report:run` Gradle dance — just one `trailblaze report` call. set -e TRAILBLAZE_LOGS_DIR="$(pwd)/trailblaze-logs" echo "=========================================" -# Check if logs directory exists and has content before attempting report generation if [ ! -d "$TRAILBLAZE_LOGS_DIR" ] || [ -z "$(ls -A "$TRAILBLAZE_LOGS_DIR" 2>/dev/null)" ]; then echo "WARNING: No logs found in $TRAILBLAZE_LOGS_DIR - skipping report generation" echo "=========================================" exit 0 fi -echo "Building Compose Web/WASM UI..." -./gradlew :trailblaze-ui:wasmJsBrowserProductionWebpack -Ptrailblaze.wasm=true -UI_EXIT_CODE=$? -echo "UI build exit code: $UI_EXIT_CODE" - echo "Generating Trailblaze report..." -./gradlew :trailblaze-report:run --args="$TRAILBLAZE_LOGS_DIR" -Ptrailblaze.wasm=true -REPORT_EXIT_CODE=$? -echo "Report generation exit code: $REPORT_EXIT_CODE" +trailblaze report --output-dir "$TRAILBLAZE_LOGS_DIR" + +# `trailblaze report --output-dir` writes `report.html` under the canonical name; the +# downstream artifact step (.github/pr_create_artifacts.sh) and the workflow upload +# paths still expect the legacy `trailblaze_report.html` name. Rename in place to +# avoid cascading the change into four workflow files. Best-effort: a missing input +# means the CLI emitted nothing (already logged above) and we just skip silently. +if [ -f "$TRAILBLAZE_LOGS_DIR/report.html" ]; then + mv -f "$TRAILBLAZE_LOGS_DIR/report.html" "$TRAILBLAZE_LOGS_DIR/trailblaze_report.html" +fi echo "Checking for generated report..." if [ -f "$TRAILBLAZE_LOGS_DIR/trailblaze_report.html" ]; then @@ -29,6 +38,6 @@ if [ -f "$TRAILBLAZE_LOGS_DIR/trailblaze_report.html" ]; then else echo "✗ Report NOT found at expected location" echo "Searching for report files..." - find "$(pwd)" -name "trailblaze_report.html" -o -name "*report*.html" 2>/dev/null || echo "No report files found" + find "$(pwd)" -name "trailblaze_report.html" -o -name "report.html" -o -name "*report*.html" 2>/dev/null || echo "No report files found" fi echo "=========================================" diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt index 16f492f93..01c101ea9 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt @@ -490,8 +490,16 @@ class DaemonClient( /** Poll interval when waiting for daemon */ const val POLL_INTERVAL_MS = 500L - /** Overall timeout for polling a run to completion (30 minutes) */ - const val RUN_POLL_TIMEOUT_MS = 30 * 60 * 1000L + /** + * Overall timeout for polling a run to completion (10 minutes). + * + * Lowered from 30 min to 10 min so a wedged daemon fails fast and the next CI cycle + * starts sooner. The honest happy-path runtime for a single-trail CI session is well + * under 10 minutes (a Wikipedia trail completes in seconds; a long Cash flow in a + * couple of minutes), so 10 min gives a 3-5× headroom over the typical case while + * still cutting the failure-mode wait by 20 minutes vs. the historical 30 min. + */ + const val RUN_POLL_TIMEOUT_MS = 10 * 60 * 1000L /** * Max consecutive poll errors before falling back to a /ping health check. diff --git a/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/DaemonClientPollResilienceTest.kt b/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/DaemonClientPollResilienceTest.kt index dfe4e4efc..cc23637d2 100644 --- a/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/DaemonClientPollResilienceTest.kt +++ b/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/DaemonClientPollResilienceTest.kt @@ -117,8 +117,8 @@ class DaemonClientPollResilienceTest { /** * 4xx is terminal — the new behavior must NOT retry + ping-reset on a 404, * because 404 means "unknown runId" (e.g. the daemon restarted and lost run - * state) and is unrecoverable. Pre-fix behavior would wait the full 30-min - * RUN_POLL_TIMEOUT_MS. + * state) and is unrecoverable. Pre-fix behavior would wait the full + * RUN_POLL_TIMEOUT_MS window. */ @Test fun runAsync_returns404BodyImmediatelyWithoutRetryingOrPinging() { From d712708c64a40a84410172f2d23a043034368e61 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Sun, 31 May 2026 14:04:22 -0400 Subject: [PATCH 4/7] CLI quality of life improvements --- README.md | 9 +- docs/CLI.md | 38 +- docs/getting_started.md | 73 +++- docs/index.md | 8 +- docs/mcp/index.md | 2 +- scripts/trailblaze | 47 ++ .../xyz/block/trailblaze/cli/AskCommand.kt | 2 +- .../block/trailblaze/cli/CliCallerContext.kt | 22 +- .../block/trailblaze/cli/CliInfrastructure.kt | 345 ++++++++++++++- .../xyz/block/trailblaze/cli/DeviceCommand.kt | 227 ++++++---- .../xyz/block/trailblaze/cli/McpCommand.kt | 3 +- .../block/trailblaze/cli/SessionCommand.kt | 11 +- .../trailblaze/cli/ShellDevicePinStore.kt | 346 +++++++++++++++ .../block/trailblaze/cli/SnapshotCommand.kt | 2 +- .../xyz/block/trailblaze/cli/StepCommand.kt | 2 +- .../xyz/block/trailblaze/cli/ToolCommand.kt | 2 +- .../block/trailblaze/cli/ToolboxCommand.kt | 2 +- .../xyz/block/trailblaze/cli/TrailCommand.kt | 24 +- .../xyz/block/trailblaze/cli/VerifyCommand.kt | 2 +- .../trailblaze/cli/ShellDevicePinStoreTest.kt | 406 ++++++++++++++++++ .../help-trailblaze-ask.txt | 6 +- .../help-trailblaze-device-connect.txt | 13 +- .../help-trailblaze-device-disconnect.txt | 8 +- .../help-trailblaze-device-rebind.txt | 4 +- .../help-trailblaze-device.txt | 7 +- .../help-trailblaze-mcp.txt | 4 +- .../help-trailblaze-run.txt | 9 +- .../help-trailblaze-session-end.txt | 6 +- .../help-trailblaze-session-start.txt | 17 +- .../help-trailblaze-session-stop.txt | 6 +- .../help-trailblaze-snapshot.txt | 6 +- .../help-trailblaze-step.txt | 20 +- .../help-trailblaze-tool.txt | 17 +- .../help-trailblaze-toolbox.txt | 7 +- .../help-trailblaze-verify.txt | 6 +- 35 files changed, 1504 insertions(+), 205 deletions(-) create mode 100644 trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt create mode 100644 trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt diff --git a/README.md b/README.md index 29b5f5383..61b44ca25 100644 --- a/README.md +++ b/README.md @@ -129,8 +129,9 @@ curl -fsSL https://raw.githubusercontent.com/block/trailblaze/main/install.sh | # List connected devices (Android emulator, iOS simulator, or web browser) trailblaze device list -# Pin this shell to a device + target so subsequent calls inherit both from the env -eval $(trailblaze device connect android --target default) +# Pin this terminal to a device + target so subsequent calls inherit both. +# Trailblaze remembers per-terminal — other terminals stay independent. +trailblaze device connect android --target default # Read the screen — returns a view hierarchy with refs (e.g. ab42) the agent can target trailblaze snapshot @@ -139,8 +140,8 @@ trailblaze snapshot # platform-specific selector strategy. Every action takes a --step for self-heal. trailblaze tool tap ref=ab42 -s "Tap sign in" -# Done — release the device + clear TRAILBLAZE_DEVICE from this shell -eval $(trailblaze device disconnect) +# Done — release the device and clear this terminal's pin +trailblaze device disconnect ``` Paste those into Claude Code, Codex, Cursor, Goose, or anything that can run bash and diff --git a/docs/CLI.md b/docs/CLI.md index acd475390..2c70cd4f4 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -110,10 +110,10 @@ trailblaze step [OPTIONS] [<>] | Option | Description | Default | |--------|-------------|---------| | `--verify` | Verify an assertion instead of taking an action (exit code 1 if assertion fails) | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id (e.g., android/emulator-5554). Required for interactive step/verify execution. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `--context` | Context from previous steps for situational awareness | - | | `-v`, `--verbose` | Enable verbose output (show daemon logs, MCP calls) | - | -| `--target` | Target app ID for this command's bound device. Scoped to the device as a daemon-process override (dies on daemon restart or device release). Defaults to `$TRAILBLAZE_TARGET` — typically set via `eval $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | +| `--target` | Target app ID for this command's bound device. Defaults to `$TRAILBLAZE_TARGET` if set, otherwise the target you passed to `trailblaze device connect --target X` for this terminal (persists in this terminal's pin; cleared by `device disconnect`, replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | | `--no-screenshots`, `--text-only` | Skip screenshots — the LLM only sees the textual view hierarchy, no vision tokens, and disk logging of screenshots is skipped too. Faster and cheaper for short objectives where the visual layout doesn't matter; some tasks need vision and will degrade without it. | - | | `--snapshot-details` | Comma-separated snapshot detail levels passed through to the daemon's step tool: BOUNDS, OFFSCREEN, OCCLUDED, ALL_ELEMENTS. Useful for waypoint capture: ALL_ELEMENTS bypasses the on-device accessibility-importance filter so RecyclerView children land in the captured trailblazeNodeTree. OCCLUDED is web-only and surfaces elements hidden under popups/modals so the captured tree includes what's actually behind the overlay. | - | | `--save` | Save current session as a trail file. Shows steps if --setup not specified. | - | @@ -145,7 +145,7 @@ trailblaze ask [OPTIONS] <> | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `-v`, `--verbose` | Enable verbose output (show daemon logs, MCP calls) | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -173,7 +173,7 @@ trailblaze verify [OPTIONS] <> | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `-v`, `--verbose` | Enable verbose output | - | | `--no-screenshots`, `--text-only` | Skip screenshots — the LLM only sees the textual view hierarchy, no vision tokens, and disk logging of screenshots is skipped too. Faster and cheaper for short objectives where the visual layout doesn't matter; some tasks need vision and will degrade without it. | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | @@ -196,7 +196,7 @@ trailblaze snapshot [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `-v`, `--verbose` | Enable verbose output | - | | `--bounds` | Include bounding box {x,y,w,h} for each element | - | | `--offscreen` | Include offscreen elements marked (offscreen) | - | @@ -231,10 +231,10 @@ trailblaze tool [OPTIONS] [<>] [<>] |--------|-------------|---------| | `-s`, `--step`, `--objective`, `-o` | Natural language step — describe what, not how. If the UI changes, Trailblaze uses this to retry the step with AI. 'Navigate to Settings' survives a redesign; 'tap button at 200,400' does not. Optional by default; required when `trailblaze config require-steps true` is set. (`--objective` / `-o` are deprecated aliases of `--step` / `-s`.) | - | | `--yaml` | Raw YAML tool sequence (multiple tools in one call) | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `-v`, `--verbose` | Enable verbose output | - | | `--no-screenshots`, `--text-only` | Skip screenshots — the LLM only sees the textual view hierarchy, no vision tokens, and disk logging of screenshots is skipped too. Faster and cheaper for short objectives where the visual layout doesn't matter; some tasks need vision and will degrade without it. | - | -| `--target` | Target app ID for this command's bound device. Scoped to the device as a daemon-process override (dies on daemon restart or device release). Defaults to `$TRAILBLAZE_TARGET` — typically set via `eval $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | +| `--target` | Target app ID for this command's bound device. Defaults to `$TRAILBLAZE_TARGET` if set, otherwise the target you passed to `trailblaze device connect --target X` for this terminal (persists in this terminal's pin; cleared by `device disconnect`, replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -264,7 +264,7 @@ trailblaze toolbox [OPTIONS] [] | `--name`, `-n` | Show details for a single tool by name | - | | `--target`, `-t` | Target app to show tools for. Optional — defaults to $TRAILBLAZE_TARGET (per-shell pin), then the workspace `trailblaze config target`, falling back to the built-in 'default'. | - | | `--search`, `-s` | Substring search on tool name and description. | - | -| `-d`, `--device` | Target device (e.g. android, android/emulator-5554). | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `--detail` | Show full parameter descriptions for all tools | - | | `-v`, `--verbose` | Enable verbose output | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -293,7 +293,7 @@ trailblaze run [OPTIONS] [<>] | Option | Description | Default | |--------|-------------|---------| | `--tags` | Only run trails whose `config.tags:` list contains at least one of the given names. Repeatable (`--tags smoke --tags login`) or comma-separated (`--tags smoke,login`). Match is OR across tags. Untagged trails are excluded when --tags is specified. | - | -| `-d`, `--device` | Device: platform (android, ios, web), platform/instance-id, or instance ID | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `-a`, `--agent` | Agent: TRAILBLAZE_RUNNER, MULTI_AGENT_V3. Default: TRAILBLAZE_RUNNER | - | | `--use-recorded-steps` | Three-way switch for replay vs. AI-driven execution: --use-recorded-steps Force replay mode (use the trail's `recording:` tools verbatim). --no-use-recorded-steps Force AI mode (ignore any recordings; LLM drives each step from `step:` NL). (unset, default) Auto-detect: AI mode if no `recording:` blocks present, replay if they are. Use --no-use-recorded-steps to re-run a trail with stale selectors and let the agent re-pick selectors from current page state. | - | | `--self-heal` | When a recorded step fails, let AI take over and continue. Overrides the persisted 'trailblaze config self-heal' setting for this run. Omit to inherit the saved setting (opt-in, off by default). | - | @@ -364,9 +364,9 @@ trailblaze session start [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `--target` | Target app ID for this session's bound device. Scoped to the device as a daemon-process override (dies on daemon restart or device release). Defaults to `$TRAILBLAZE_TARGET` — typically set via `eval $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override. To set a persistent default, use `trailblaze config target`. | - | +| `--target` | Target app ID for this session's bound device. Defaults to `$TRAILBLAZE_TARGET` if set, otherwise the target you passed to `trailblaze device connect --target X` for this terminal (persists in this terminal's pin; cleared by `device disconnect`, replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override. To set a persistent default, use `trailblaze config target`. | - | | `--mode` | Working mode: trail or blaze. Saved to config for future commands. | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `--title` | Title for the session (used as trail name when saving) | - | | `--no-video` | Disable video capture | - | | `--no-logs` | Disable device log capture | - | @@ -391,7 +391,7 @@ trailblaze session stop [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `--save` | Save session as a trail before stopping | - | | `--title`, `-t` | Trail title when saving (overrides session title) | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -559,7 +559,7 @@ trailblaze session end [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | | `--name`, `-n` | Save the recording as a trail before ending | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -1250,7 +1250,7 @@ trailblaze device list [OPTIONS] ### `trailblaze device connect` -Connect a device + target to your session (use `eval $(...)` to pin TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell) +Connect a device + target and pin them for this terminal so subsequent commands inherit the binding **Synopsis:** @@ -1268,7 +1268,7 @@ trailblaze device connect [OPTIONS] <> | Option | Description | Default | |--------|-------------|---------| -| `--target`, `-t` | Target app to bind to this device's session (e.g. `default`, `sampleapp`). Optional. When set, `eval $(trailblaze device connect ... --target X)` also exports $TRAILBLAZE_TARGET so subsequent CLI calls in this shell re-apply the binding automatically. | - | +| `--target`, `-t` | Target app to bind to this device's session (e.g. `default`, `sampleapp`). Optional. When set, the target is recorded alongside the device in this terminal's pin so subsequent CLI calls re-apply the binding automatically until you `device disconnect` or pin a different target. | - | | `--mcp-session` | Explicit MCP session id to pin to this device (advanced). Default: pin the most-recently-active unbound MCP client (Claude Desktop, Cursor, Goose, …). No-op when no MCP clients are connected. | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -1290,7 +1290,7 @@ trailblaze device rebind [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device to rebind. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device to rebind. Defaults to `$TRAILBLAZE_DEVICE` if set manually, otherwise this terminal's pin (set by `trailblaze device connect`). | - | | `--target`, `-t` | New target app for the bound device (e.g. `default`, `sampleapp`). | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -1299,7 +1299,7 @@ trailblaze device rebind [OPTIONS] ### `trailblaze device disconnect` -Disconnect a device (use `eval $(...)` to also clear TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET) +Disconnect a device and clear this terminal's pin **Synopsis:** @@ -1311,7 +1311,7 @@ trailblaze device disconnect [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device to disconnect. Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Device to disconnect. Defaults to `$TRAILBLAZE_DEVICE` if set manually, otherwise this terminal's pin (set by `trailblaze device connect`). | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -1419,7 +1419,7 @@ trailblaze mcp [OPTIONS] | `--http` | Use Streamable HTTP transport instead of STDIO. Starts a standalone HTTP MCP server. | - | | `--direct`, `--no-daemon` | Run as an in-process MCP server over STDIO instead of the default proxy mode. Bypasses the Trailblaze daemon and runs everything in a single process. Use this for environments where the HTTP daemon cannot run. | - | | `--tool-profile` | Tool profile: FULL or MINIMAL (only device/blaze/verify/ask/trail). Defaults to MINIMAL for STDIO, FULL for HTTP. | - | -| `-d`, `--device` | Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). Defaults to $TRAILBLAZE_DEVICE. | - | +| `-d`, `--device` | Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). Defaults to whatever the launching terminal pinned via `trailblaze device connect`, or `$TRAILBLAZE_DEVICE` if set. | - | | `-t`, `--target` | Pin this MCP session to a target app on startup (e.g. default, sampleapp). Only meaningful with --device or $TRAILBLAZE_DEVICE. Defaults to $TRAILBLAZE_TARGET. | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | diff --git a/docs/getting_started.md b/docs/getting_started.md index 1f5505143..811b2718c 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -66,32 +66,75 @@ cd trailblaze ## Connect a Device -List what's connected, then pin this shell to one of them: +List what's connected, then pin this terminal to one of them: ```bash trailblaze device list -# Pin: exports TRAILBLAZE_DEVICE into the current shell so every follow-up call -# inherits the device + target without repeating the flags. -eval $(trailblaze device connect android --target default) +# Pin: remembers this terminal's device + target so every follow-up call +# inherits them without repeating the flags. Other terminals stay independent. +trailblaze device connect android --target default ``` +The short form `android` works when only one Android device is connected; with +two or more, use the fully-qualified `android/` form shown by `device list` +(same for `ios/`). `web` is always unambiguous. + You'll see Android emulators (`android/emulator-5554`), iOS simulators (`ios/`), and any web targets. After the pin, device-acting CLI calls that take a `-d/--device` flag (`snapshot`, `tool`, `blaze`, `ask`, `verify`, -`session start`, `session stop`, `run`) read `TRAILBLAZE_DEVICE` from the env — no +`session start`, `session stop`, `run`) inherit the pinned device automatically — no `-d ` flag needed. `session save` is implicit (saves the current session) and doesn't take `-d`. For CI / scripts that prefer determinism, pass `-d ` (or `-d /`) on each call as an override; explicit flags win over the -env. `mcp` accepts `--device` / `--target` at startup to pre-bind the MCP session +pin. `mcp` accepts `--device` / `--target` at startup to pre-bind the MCP session (so the agent's first tool call already has a device); workspace and setup commands -(`config`, `app`, `device list`) don't take `-d`. `run` reads `TRAILBLAZE_DEVICE` -just like the action commands, but each replay spawns a fresh session rather than -reattaching to the pinned interactive one. +(`config`, `app`, `device list`) don't take `-d`. `run` inherits the pin just like +the action commands, but each replay spawns a fresh session rather than reattaching +to the pinned interactive one. + +How the pin works under the hood: `trailblaze device connect` records this terminal's +shell PID alongside the bound device in `~/.trailblaze/shell-device-pins-.json`. +Subsequent CLI calls from the same terminal look up that entry and use it as the +default. The pin survives daemon restarts. Open a second terminal and it gets its +own slot — pinning device A in one terminal doesn't leak into another. For scripts +and CI where each call is a fresh shell, pass `--device ` on every command +instead — the pin file is per-shell-PID and won't carry. (`TRAILBLAZE_DEVICE` is +also honored as a manual override, but `--device` is the recommended form.) + +If your pinned device goes away (emulator killed, simulator shut down, USB cable +unplugged), the next CLI call notices and clears the pin: + +``` +Pinned device android/emulator-5554 is no longer connected; pin cleared. +Reconnect it and re-run `trailblaze device connect android/emulator-5554`, +or pick a different one from `trailblaze device list`. +``` + +The call then falls through to autodetect — if exactly one device is connected, +it'll be used silently; if zero or multiple, you get the appropriate error. +Eviction is deliberate: it nudges you through an explicit choice rather than +silently retrying a stale binding. Autodetect (the single-device convenience) +doesn't write a pin either: it just uses the one connected device for that one +call. Pinning is always an explicit `device connect` action. + +### Precedence between TRAILBLAZE_DEVICE and the file-pin + +Resolution order, highest priority first: + +1. Explicit `--device ` flag on the command. +2. `TRAILBLAZE_DEVICE` environment variable (manual override; mostly relevant + for CI scripts that explicitly export it). +3. This terminal's file-pin (written by `trailblaze device connect`). +4. Autodetect when exactly one device is connected. + +So `export TRAILBLAZE_DEVICE=ios/` in your shell shadows the file-pin — +useful if you want a per-shell override without disturbing the pinned device for +the rest of your work. Unset the env var to fall back to the pin. To swap target without disconnecting, use `trailblaze device rebind --target `. To -release, `eval $(trailblaze device disconnect)` — the leading `eval $(...)` also unsets -`TRAILBLAZE_DEVICE` in the parent shell so the next session starts clean. +release, `trailblaze device disconnect` — clears this terminal's pin so the next +session starts clean. ## Drive the Device @@ -131,16 +174,16 @@ this into the agent's session: ``` You have access to the `trailblaze` CLI. Use it to drive the connected device. First -pin the shell to a device + target so subsequent calls don't have to repeat the flags: - - `eval $(trailblaze device connect --target )` — pin once at start +pin this terminal to a device + target so subsequent calls don't have to repeat the flags: + - `trailblaze device connect --target ` — pin once at start - `trailblaze session start --title ""` — start a tracked session (captures video/logs, groups the steps for later save) - `trailblaze snapshot` — see what's on screen (UI tree with refs) - `trailblaze tool -s ""` — take an action - - `trailblaze toolbox -d ` — list available tools (toolbox still wants -d) + - `trailblaze toolbox` — list available tools (uses the pinned device automatically) - When done, `trailblaze session save` to write the recording out as a `.trail.yaml`, then `trailblaze session stop` to end the session. Optionally - `eval $(trailblaze device disconnect)` to release the device. + `trailblaze device disconnect` to release the device. ``` If your agent can run a shell command, it can drive a device. No SDK to install, no diff --git a/docs/index.md b/docs/index.md index 6d0ade66b..fc3d30f61 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,11 +31,15 @@ this repo — no mockup. Click through for the full interactive report, or brows ## Quickstart +Install Trailblaze first ([Getting Started](getting_started.md) walks through it), +then: + ```bash trailblaze device list -# Pin this shell to a device + target so subsequent calls inherit both from the env -eval $(trailblaze device connect android --target default) +# Pin this terminal to a device — subsequent calls inherit it. +# Trailblaze remembers per-terminal, so other terminals stay independent. +trailblaze device connect android # Read the screen — returns a UI tree with refs (e.g. ab42) your agent can target trailblaze snapshot diff --git a/docs/mcp/index.md b/docs/mcp/index.md index 30ac9313c..99b541b8e 100644 --- a/docs/mcp/index.md +++ b/docs/mcp/index.md @@ -227,7 +227,7 @@ When you want the MCP session to land on a specific device + target without the } ``` -Alternatively, drop the flags and inherit `TRAILBLAZE_DEVICE` from the shell that launches the MCP server (helpful when a CLI session pinned via `eval $(trailblaze device connect …)` is already in scope). Explicit `--device` / `--target` win over the env var. +Alternatively, drop the flags and inherit the device pin from the terminal that launches the MCP server (helpful when you've already run `trailblaze device connect …` in that terminal). Explicit `--device` / `--target` win over the pin. `TRAILBLAZE_DEVICE` is also honored as a manual override — useful for CI agents that set the env var explicitly. ### Connecting from Cursor diff --git a/scripts/trailblaze b/scripts/trailblaze index ac7be50e9..8e39b08e0 100755 --- a/scripts/trailblaze +++ b/scripts/trailblaze @@ -27,6 +27,47 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# Capture the parent shell PID so the CLI can resolve "what device is pinned +# for this terminal?" from a file in ~/.trailblaze instead of requiring the +# user to wrap `trailblaze device connect` in `eval $(...)` to set +# TRAILBLAZE_DEVICE in their shell. `$PPID` is the wrapper's parent — for +# every interactive invocation that's the shell the user typed into; for +# tmux/screen panes it's the per-pane shell; for CI scripts it's whatever +# spawned this wrapper. Respect any pre-set value so nested invocations +# (one Trailblaze command spawning another via a script) inherit the +# outermost shell's identity rather than overwriting it. +# +# Consumed by `CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")` and the +# resolver tier in `CliInfrastructure.resolveDeviceWithAutodetect`. The +# associated file is `~/.trailblaze/shell-device-pins-.json` written +# by `ShellDevicePinStore`. +export TRAILBLAZE_SHELL_PID="${TRAILBLAZE_SHELL_PID:-$PPID}" + +# Detect whether this invocation comes from an interactive terminal. `[ -t 0 ]` +# checks if stdin is a tty — true for a human typing commands, false for: +# - AI agent harnesses (Claude Code Bash tool, Cursor shell, Codex) — each +# command spawns a fresh shell that doesn't inherit a tty +# - CI scripts and pipelines (stdin redirected from /dev/null or a file) +# - Anything with stdin piped from another command +# +# Consumed by the JVM-side `device connect` to decide whether to warn the +# caller that the file-pin won't carry across separate command invocations +# (which it can't if each call is a fresh shell with a different PID). When +# true, no warning — the human is in a real terminal where the pin works. +# When false, the warning fires and steers the caller toward `--device` flags. +# +# Default of `0` (assume non-interactive) is the safer fallback: a missed +# warning to a real human is mild noise; a missed warning to an agent is a +# loop. Respects any pre-set value so a future tool that wants to override +# the detection can. +if [ -z "${TRAILBLAZE_INTERACTIVE:-}" ]; then + if [ -t 0 ]; then + export TRAILBLAZE_INTERACTIVE=1 + else + export TRAILBLAZE_INTERACTIVE=0 + fi +fi + # --------------------------------------------------------------------------- # JDK version check # --------------------------------------------------------------------------- @@ -292,6 +333,12 @@ ipc_try_forward() { if [ -n "${TRAILBLAZE_TARGET:-}" ]; then env_json=$(jq --arg v "$TRAILBLAZE_TARGET" '. + {TRAILBLAZE_TARGET: $v}' <<<"$env_json") || return 1 fi + if [ -n "${TRAILBLAZE_SHELL_PID:-}" ]; then + env_json=$(jq --arg v "$TRAILBLAZE_SHELL_PID" '. + {TRAILBLAZE_SHELL_PID: $v}' <<<"$env_json") || return 1 + fi + if [ -n "${TRAILBLAZE_INTERACTIVE:-}" ]; then + env_json=$(jq --arg v "$TRAILBLAZE_INTERACTIVE" '. + {TRAILBLAZE_INTERACTIVE: $v}' <<<"$env_json") || return 1 + fi # Send the user's interactive cwd alongside argv so commands that walk relative # paths (e.g. `waypoint --target` resolving the workspace anchor) anchor at the # user's shell directory rather than the daemon's launch directory. Older daemons diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt index 68bb56010..d011b4193 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt @@ -36,7 +36,7 @@ class AskCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."] + description = [DEVICE_OPTION_DESCRIPTION] ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt index 25073b608..150a5aa34 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt @@ -55,10 +55,26 @@ internal object CliCallerContext { * sync with the `env_json` allowlist in `scripts/trailblaze`): * * - `TRAILBLAZE_DEVICE` — consumed by `resolveCliDevice` in - * `CliInfrastructure.kt`. Set via `eval $(trailblaze device connect )`. + * `CliInfrastructure.kt`. Manual override / CI usage; the file-pin + * written by `device connect` is the primary mechanism now. * - `TRAILBLAZE_TARGET` — consumed by `envTrailblazeTarget` in - * `CliInfrastructure.kt`. Set via `eval $(trailblaze device connect - * --target )`. + * `CliInfrastructure.kt`. Manual override; pair with [TRAILBLAZE_DEVICE] + * for shell-scoped target pinning when the file-pin doesn't suffice. + * - `TRAILBLAZE_SHELL_PID` — the user's interactive shell PID (captured + * by the bash wrapper as `$PPID`). Consumed by [ShellDevicePinStore] + * via `resolveDeviceWithAutodetect` in `CliInfrastructure.kt` to look + * up the device pinned for this terminal in + * `~/.trailblaze/shell-device-pins-.json`. Without this var the + * file-pin tier is skipped silently — older wrappers that don't set + * it degrade to the env-var-or-autodetect behavior they always had. + * - `TRAILBLAZE_INTERACTIVE` — `"1"` when the wrapper detected a tty on + * stdin (human-in-a-terminal), `"0"` otherwise (AI agent harness, CI, + * piped invocation, anything not a tty). Read by `device connect` to + * decide whether to print a warning that the file-pin won't carry + * across separate command invocations — irrelevant for humans (one + * shell, one PID, pin works), critical for agents (each Bash-tool + * call is a fresh shell with a different PID, pin invisible to + * follow-ups). See [isInteractiveCaller] in `CliInfrastructure.kt`. * * Adding a new key requires three coordinated edits: this kdoc, the bash * shim's allowlist, and a `resolveCli*`/`env*` consumer in diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt index db0c16052..06b047c77 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt @@ -121,14 +121,53 @@ internal fun discoverTargetSummaries(): List> { * different "list available targets" closer) so it keeps its own const — * see [TARGET_OPTION_DESCRIPTION_SESSION]. */ +/** + * Single source of truth for the `-d` / `--device` option description on every + * device-acting command (`snapshot`, `tool`, `ask`, `verify`, `session start/stop/end`, + * `step`, `toolbox`). + * + * Per-command variants live alongside their command class (e.g. [McpCommand]'s + * `--device` is about pre-binding the MCP session at startup; [TrailCommand] + * `--device` is the dispatched-replay form). Use this constant on action + * commands where the semantics are "act on this device, defaulting to the + * terminal's pin." + * + * The wording deliberately puts the per-terminal file-pin first (the primary + * mechanism now), names `TRAILBLAZE_DEVICE` as a manual escape hatch, and + * spells out the agent-harness advice on the same line so an agent running + * `trailblaze tool --help` doesn't have to read three doc pages to discover + * "use `--device` on every call." The phrase "fresh-shell harness" is the + * lexicon the SKILL.md and the multi-device error envelope already use. + * + * Single line because picocli wraps for help rendering and the docs generator + * joins continuation lines with a space; embedded line breaks would land in + * the generated `docs/CLI.md` as literal newlines mid-cell. + */ +internal const val DEVICE_OPTION_DESCRIPTION: String = + "Device: platform (android, ios, web) or platform/id. " + + "Defaults to `\$TRAILBLAZE_DEVICE` if set (manual override; rare), " + + "otherwise this terminal's pin (set by `trailblaze device connect`). " + + "In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass " + + "--device on every call." + +/** + * Single source of truth for the `[ShellDevicePinStore]` log-line prefix used + * across the file-pin lifecycle (`writeShellDevicePinIfPossible`, + * `clearShellDevicePinIfPossible`, `clearShellDevicePinTargetIfPossible`, and + * the stale-pin eviction site in `resolveDeviceWithAutodetect`). A const + * keeps the prefix consistent — operators grepping by it find every event. + */ +private const val SHELL_PIN_LOG_PREFIX = "[ShellDevicePinStore]" + internal const val TARGET_OPTION_DESCRIPTION: String = - "Target app ID for this command's bound device. Scoped to the device " + - "as a daemon-process override (dies on daemon restart or device " + - "release). Defaults to `\$TRAILBLAZE_TARGET` — typically set via " + - "`eval \$(trailblaze device connect ... --target X)`. Pass " + - "`--target=clear` to remove a previously-set override for this " + - "device. To set a persistent default, use `trailblaze config " + - "target`. List available targets with `trailblaze toolbox` (no args)." + "Target app ID for this command's bound device. Defaults to " + + "`\$TRAILBLAZE_TARGET` if set, otherwise the target you passed to " + + "`trailblaze device connect --target X` for this terminal (persists in " + + "this terminal's pin; cleared by `device disconnect`, replaced by " + + "`device rebind --target Y`). Pass `--target=clear` to remove a " + + "previously-set override for this device. To set a persistent " + + "default, use `trailblaze config target`. List available targets " + + "with `trailblaze toolbox` (no args)." /** * Variant of [TARGET_OPTION_DESCRIPTION] for `session start` — same env-tier @@ -137,12 +176,13 @@ internal const val TARGET_OPTION_DESCRIPTION: String = * "list available targets with toolbox" pointer. */ internal const val TARGET_OPTION_DESCRIPTION_SESSION: String = - "Target app ID for this session's bound device. Scoped to the device " + - "as a daemon-process override (dies on daemon restart or device " + - "release). Defaults to `\$TRAILBLAZE_TARGET` — typically set via " + - "`eval \$(trailblaze device connect ... --target X)`. Pass " + - "`--target=clear` to remove a previously-set override. To set a " + - "persistent default, use `trailblaze config target`." + "Target app ID for this session's bound device. Defaults to " + + "`\$TRAILBLAZE_TARGET` if set, otherwise the target you passed to " + + "`trailblaze device connect --target X` for this terminal (persists in " + + "this terminal's pin; cleared by `device disconnect`, replaced by " + + "`device rebind --target Y`). Pass `--target=clear` to remove a " + + "previously-set override. To set a persistent default, use " + + "`trailblaze config target`." /** * How the effective `--target` value was chosen for one CLI invocation. @@ -269,11 +309,20 @@ internal fun resolveCliTarget(flag: String?): ResolvedCliTarget { internal fun resolveCliTargetPin(flag: String?): String? { val normalized = normalizeTargetId(flag) // `--target=clear` is the explicit "remove the per-device override" signal. - // Returning null here (rather than falling through to the env tier) is what - // keeps the clear deterministic regardless of what `$TRAILBLAZE_TARGET` holds. + // Returning null here (rather than falling through to the env / pin tiers) + // is what keeps the clear deterministic — without this short-circuit a + // file-pinned target would silently re-establish the very binding the user + // is trying to clear. if (normalized == "clear") return null if (normalized != null) return normalized - return envTrailblazeTarget() + envTrailblazeTarget()?.let { return it } + // File-pin target tier: when the user passed `--target X` to a previous + // `device connect`, that X was persisted alongside the device id in the + // pin file. Re-applying it here ensures the per-device daemon override is + // re-established on every action command, surviving daemon restarts. The + // tier is silently skipped when the wrapper didn't forward + // TRAILBLAZE_SHELL_PID, or when the user pinned a device without --target. + return readShellPinTarget(CliConfigHelper.resolveEffectiveHttpPort()) } /** @@ -400,6 +449,191 @@ internal fun resolveCliDevice(flag: String?): String? = flag?.takeIf { it.isNotBlank() } ?: CliCallerContext.callerEnv("TRAILBLAZE_DEVICE")?.takeIf { it.isNotBlank() } +/** + * True when the caller's wrapper detected a tty on stdin — typical of a + * human typing into a real terminal. False for AI agent harnesses (Claude + * Code / Cursor / Codex Bash tools), CI scripts, and piped invocations, + * where each command typically runs in a fresh shell with no parent-tty. + * + * Read by `device connect` to decide whether to warn that the file-pin + * won't carry across separate command invocations. We deliberately default + * to `false` on missing/blank env (older wrapper, direct-JVM use): missing + * the warning for a real human is mild noise ("Note: this terminal isn't + * interactive..." is technically wrong but harmless); missing it for an + * agent is a loop where the agent keeps re-pinning and failing. + */ +internal fun isInteractiveCaller(): Boolean = + CliCallerContext.callerEnv("TRAILBLAZE_INTERACTIVE")?.trim() == "1" + +/** + * Persist the [deviceId] (and optional [targetId]) as the pin for the caller's + * terminal, identified by the `TRAILBLAZE_SHELL_PID` env var forwarded by the + * bash wrapper. + * + * Persisting the target alongside the device is what makes + * `device connect --target X` survive a daemon restart — without it, the + * target lives only in the daemon's in-memory `SessionTargetRegistry` and + * silently degrades to workspace config on next `app --stop && app start`. + * + * Silently skips when: + * - The wrapper didn't forward the PID (older wrapper, direct-JVM use, a + * tool invoking the CLI outside `./trailblaze`). + * - The pin file write throws (e.g. read-only home directory). The + * daemon-side device bind still happened, so the user can still drive + * the device for this one call via the resolver's existing flag/env + * tiers — they just won't get persistence. + * + * Diagnostic message goes to `Console.log` (file log) on write failure so a + * read-only-home-directory bug surfaces without spamming the user's terminal. + */ +internal fun writeShellDevicePinIfPossible(deviceId: String, targetId: String? = null) { + val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } + ?: return + val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return + try { + val port = CliConfigHelper.resolveEffectiveHttpPort() + ShellDevicePinStore.setPin( + file = ShellDevicePinStore.pinFileFor(port), + shellPid = pid, + device = deviceId, + target = targetId, + ) + } catch (e: IllegalStateException) { + // `mutate()` throws IllegalStateException for filesystem-state problems + // it can't recover from automatically (e.g., the `.lock` path is a + // directory, or a symlink to one). The user-visible "Pinned $device for + // this terminal." line was already printed at this point — promote the + // failure to stderr so the user knows their pin DIDN'T land and they'll + // need `--device` on follow-up calls until they clean up the bad path. + // Debug log retained for the operator log trail. + Console.error( + "Warning: this terminal's device pin couldn't be written (${e.message}). " + + "The daemon-side bind succeeded, but subsequent commands in this terminal " + + "won't inherit the pin — pass `--device $deviceId` on each call until you fix " + + "the underlying filesystem state.", + ) + Console.log("$SHELL_PIN_LOG_PREFIX failed to write pin for pid=$pid: ${e.message}") + } catch (e: Exception) { + Console.log("$SHELL_PIN_LOG_PREFIX failed to write pin for pid=$pid: ${e.message}") + } +} + +/** + * Read the target from this terminal's file-pin. Returns null when there's no + * pin, when the pin doesn't include a target (user pinned bare with no + * `--target`), or when the wrapper didn't forward the shell PID. Used as a + * resolver tier in [resolveCliTargetPin] between the env var and null so a + * `device connect --target X` re-applies that X on every subsequent action + * command, surviving daemon restarts. + */ +private fun readShellPinTarget(port: Int): String? { + val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } + ?: return null + val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return null + val lookup = ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), pid) + return (lookup as? ShellDevicePinStore.PinLookup.Found)?.target +} + +/** + * Clear ONLY the target field on this terminal's pin, preserving the device + * binding. Called when the user passes `--target=clear` so the next action + * command doesn't re-read a stale target from the pin and silently undo the + * clear. Without this, the eviction-half of `--target=clear` only ran on the + * daemon side (via `setSessionTargetForBoundDevice("")`); the file-pin kept + * the original target and `resolveCliTargetPin` re-established it on the next + * call. See PR #3611 lead-dev-review finding #1. + * + * Silently skips when no pin exists for this PID (nothing to clear), when the + * PID isn't forwarded (same as the other shell-pin helpers), or when the + * write fails (logged at debug level). Symmetric with the other helpers: + * never throws, never blocks the action that triggered the clear. + */ +internal fun clearShellDevicePinTargetIfPossible() { + val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } + ?: return + val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return + try { + val port = CliConfigHelper.resolveEffectiveHttpPort() + // Atomic clear: one `mutate()` lock window does read-then-write so a + // concurrent same-PID writer can't slip in between. No-ops when the + // entry is missing or already has target=null (saves a lock cycle in + // the common-after-first-clear case). + ShellDevicePinStore.clearPinTarget( + file = ShellDevicePinStore.pinFileFor(port), + shellPid = pid, + ) + // Success path is observable too — paired with the failure log below + // so an operator triaging "user says --target=clear didn't stick" can + // verify the helper ran. Debug-level (Console.log → file) so it + // doesn't add interactive-user noise. + Console.log("$SHELL_PIN_LOG_PREFIX cleared target for pid=$pid") + } catch (e: Exception) { + Console.log("$SHELL_PIN_LOG_PREFIX failed to clear pin target for pid=$pid: ${e.message}") + } +} + +/** + * Clear the pin entry for the caller's terminal (if any). Symmetric with + * [writeShellDevicePinIfPossible]; same silent-skip semantics on missing + * PID or write failure. + */ +internal fun clearShellDevicePinIfPossible() { + val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } + ?: return + val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return + try { + val port = CliConfigHelper.resolveEffectiveHttpPort() + ShellDevicePinStore.clearPin( + file = ShellDevicePinStore.pinFileFor(port), + shellPid = pid, + ) + } catch (e: Exception) { + Console.log("$SHELL_PIN_LOG_PREFIX failed to clear pin for pid=$pid: ${e.message}") + } +} + +/** + * Reads the per-terminal device pin written by `device connect`. Returns the + * pinned device spec when all of the following hold: + * - The wrapper forwarded `TRAILBLAZE_SHELL_PID` (older wrappers skip this + * tier silently, preserving the env-var-or-autodetect behavior they had); + * - The PID is a valid positive integer; + * - The pin file has an entry for this PID; + * - The PID is still bound to a live OS process (the shell hasn't exited). + * + * Any other case returns null so the resolver falls through. The path is + * scoped to the daemon [port] so a custom-port daemon (`TRAILBLAZE_PORT=…`) + * gets its own pin map and doesn't see a default-port daemon's bindings + * pointing at device IDs it doesn't own. + * + * Note: this returns the pin *as recorded*. The caller is responsible for + * validating that the pinned device is actually connected before honoring + * it — see [resolveDeviceWithAutodetect] for the validation flow. + */ +internal fun readShellPinDevice(port: Int): String? { + val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } + ?: return null + val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return null + val lookup = ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), pid) + return (lookup as? ShellDevicePinStore.PinLookup.Found)?.device +} + +/** + * Flatten a [DeviceAutodetectResult] into the set of currently-connected + * device specs the resolver can consider valid. Used to validate the + * shell-pin against the live list without paying for a second daemon LIST. + * + * Daemon-unreachable yields an empty set: we can't validate, the pin + * validation in [resolveDeviceWithAutodetect] short-circuits, and the + * downstream `when` branches surface the right error envelope. + */ +private fun liveDeviceSpecs(r: DeviceAutodetectResult): Set = when (r) { + is DeviceAutodetectResult.Resolved -> setOf(r.deviceSpec) + is DeviceAutodetectResult.Multiple -> r.specs.toSet() + is DeviceAutodetectResult.NoDevices -> emptySet() + is DeviceAutodetectResult.DaemonUnreachable -> emptySet() +} + /** * Outcome of a connected-device autodetect probe — the tier consulted after * [resolveCliDevice] returns null. Sealed so callers can branch deterministically @@ -545,7 +779,61 @@ internal suspend fun resolveDeviceWithAutodetect( verb: String = "Command", ): DeviceResolution { resolveCliDevice(flag)?.let { return DeviceResolution.Resolved(it) } - return when (val r = autodetectSingleConnectedDevice(port)) { + + // Read the per-terminal pin file written by `device connect` (cheap file + // I/O; no daemon round-trip). We validate it against the live device list + // below before honoring it — a pin pointing at a no-longer-connected + // device should fall through gracefully rather than fail the call with a + // generic "device not found" deep in the daemon. + val pinned = readShellPinDevice(port) + + // Daemon LIST — single round-trip whose result drives BOTH pin validation + // and the autodetect fallback below. We don't pay for it twice. + val autodetect = autodetectSingleConnectedDevice(port) + + // Validate the pin against the live list before honoring it. When the + // pinned device IS in the list, return it — the user's intent stands + // (especially in the multi-device case, where the pin is exactly how + // they disambiguated). When it ISN'T, clear the pin and fall through to + // autodetect. + // + // Why evict rather than keep the pin: if we keep it, the user sees the + // "no longer connected" notice on every subsequent call until they + // explicitly `disconnect` — that's just noise. Worse, when a different + // device shows up later the resolver still won't honor it (the pin is + // pointing at the wrong thing). Clearing the pin once forces the user + // back through `device connect` to make an explicit choice, which is + // exactly the right time to make it. If they re-pin the same device, + // that's a two-second command. The daemon-unreachable branch is + // special-cased — we don't have evidence the device is gone, we just + // couldn't ask, so we leave the pin in place. + if (pinned != null) { + when (autodetect) { + is DeviceAutodetectResult.DaemonUnreachable -> { + // Can't validate. Leave the pin alone; the daemon-unreachable + // error envelope below tells the user what's wrong. + } + else -> { + val live = liveDeviceSpecs(autodetect) + if (pinned in live) { + return DeviceResolution.Resolved(pinned) + } + Console.error( + "Pinned device $pinned is no longer connected; pin cleared. " + + "Reconnect it and re-run `trailblaze device connect $pinned`, " + + "or pick a different one from `trailblaze device list`.", + ) + // Also log the eviction at file-log level so operators investigating + // "the user said their pin disappeared" can correlate against a + // timeline. The user-visible Console.error above is the OOBE signal; + // this is the audit trail. + Console.log("$SHELL_PIN_LOG_PREFIX evicted pin: device=$pinned not in live list") + clearShellDevicePinIfPossible() + } + } + } + + return when (val r = autodetect) { is DeviceAutodetectResult.Resolved -> { reportAutodetectedDevice(r.deviceSpec) DeviceResolution.Resolved(r.deviceSpec) @@ -554,19 +842,21 @@ internal suspend fun resolveDeviceWithAutodetect( reportCliError( verb = verb, reason = "no devices connected", - hint = "connect a device first (Android: USB or emulator; iOS: simulator " + - "via Xcode; web: always available), or run " + - "`eval \$(trailblaze device connect )`", + hint = "start an Android emulator (Android Studio AVD) or iOS simulator (Xcode), " + + "or run `trailblaze device connect web` to launch a browser", ) DeviceResolution.Misuse } is DeviceAutodetectResult.Multiple -> { reportCliError( verb = verb, - reason = "multiple devices connected — --device is required to pick one", - hint = "available: ${r.specs.joinToString(", ")}. Pass `--device ` or " + - "run `eval \$(trailblaze device connect )` once to pin this shell", + reason = "multiple devices connected — pick one", + hint = "in an interactive terminal, pin one (subsequent commands inherit it):", ) + r.specs.forEach { spec -> Console.error(" trailblaze device connect $spec") } + Console.error("") + Console.error(" Or, for scripts and AI agents like Claude Code (each command runs in a fresh shell), append to your command:") + r.specs.forEach { spec -> Console.error(" --device $spec") } DeviceResolution.Misuse } is DeviceAutodetectResult.DaemonUnreachable -> { @@ -933,6 +1223,15 @@ fun cliReusableWithDevice( // follow-up"). No-op when neither tier supplies a pin (we leave the // existing daemon-wide default in place). if (daemonCall.payload != null) { + // For `--target=clear`: clear the file-pin FIRST so that if the file + // write fails, the daemon-side override stays as the user's source + // of truth (preserving consistency rather than silently diverging). + // For a set (non-clear) target: the file-pin already reflects the + // pinned value via `device connect`'s write path, so we only need + // the daemon-side re-apply on each action call. + if (daemonCall.isClearRequest) { + clearShellDevicePinTargetIfPossible() + } val setError = client.setSessionTargetForBoundDevice(daemonCall.payload) if (setError != null) { // When the pin came from $TRAILBLAZE_TARGET (no explicit flag), the diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt index 164f3c911..b8a9cf687 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt @@ -135,7 +135,12 @@ class DeviceListCommand : Callable { Console.info("") val byPlatform = devices.groupBy { it.platform } - Console.info("${devices.size} device(s) available. Pass --device on each device command:") + Console.info( + "${devices.size} device(s) available. " + + "In an interactive terminal, pin one with `trailblaze device connect ` " + + "and subsequent commands inherit it. " + + "In a fresh-shell harness (Claude Code, CI), pass `--device ` per call:", + ) Console.info("") // Warm the classifier cache for all devices in parallel before formatting. The // synchronous per-device formatDeviceType calls below then hit the cache instantly @@ -235,7 +240,7 @@ class DeviceListCommand : Callable { @Command( name = "connect", mixinStandardHelpOptions = true, - description = ["Connect a device + target to your session (use `eval $(...)` to pin TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell)"], + description = ["Connect a device + target and pin them for this terminal so subsequent commands inherit the binding"], ) class DeviceConnectCommand : Callable { @@ -252,9 +257,9 @@ class DeviceConnectCommand : Callable { names = ["--target", "-t"], description = [ "Target app to bind to this device's session (e.g. `default`, `sampleapp`). " + - "Optional. When set, `eval \$(trailblaze device connect ... --target X)` also " + - "exports \$TRAILBLAZE_TARGET so subsequent CLI calls in this shell re-apply " + - "the binding automatically.", + "Optional. When set, the target is recorded alongside the device in this " + + "terminal's pin so subsequent CLI calls re-apply the binding automatically " + + "until you `device disconnect` or pin a different target.", ], ) var target: String? = null @@ -369,12 +374,41 @@ class DeviceConnectCommand : Callable { Console.log("[device connect] MCP session pin threw: ${e.message}") } - // 5. Status messages → stderr so `eval $(trailblaze device connect ...)` doesn't - // try to evaluate them as shell commands. Visible to interactive users either - // way (stderr renders to the terminal even when stdout is being captured). + // 5. Pin the device for this terminal so subsequent commands default to + // it without flags or env vars. The pin survives daemon restart + // (it's a file under ~/.trailblaze keyed by the shell PID forwarded + // by the `./trailblaze` wrapper as TRAILBLAZE_SHELL_PID). Older + // wrappers that don't forward the PID skip this silently — the + // daemon-side bind still happened in step 1, so a follow-up call + // in the same shell still works via the `--device` flag or the + // TRAILBLAZE_DEVICE env tier. + // Pass the resolved target through to the pin so a `device connect + // --target X` survives a daemon restart — the per-device override + // lives only in the daemon's in-memory SessionTargetRegistry, and + // without persisting the target alongside the device id every action + // command after a restart would degrade to workspace config. + writeShellDevicePinIfPossible(deviceIdString, resolvedTarget) + + // 6. Status messages → stderr. Plain confirmation of what's now active + // for this terminal. The historical `Pin to this shell: eval $(...)` + // line is gone — the file-pin written in step 5 already does the + // pinning, so directing the user at eval is misleading. val targetSuffix = resolvedTarget?.let { " (target=$it)" }.orEmpty() - Console.error("Connected $deviceIdString$targetSuffix.") - Console.error("Pin to this shell: eval \$(trailblaze device connect $deviceIdString${resolvedTarget?.let { " --target $it" }.orEmpty()})") + Console.error("Pinned $deviceIdString$targetSuffix for this terminal. Other terminals are independent.") + // Catch the agent-harness case: the wrapper passed TRAILBLAZE_INTERACTIVE=0 + // because stdin isn't a tty. Claude Code's Bash tool, Cursor's shell, Codex, + // and CI all qualify. In those environments each subsequent CLI invocation + // is a fresh shell with a different PID, so the pin we just wrote is + // invisible to the next call — directing the agent at `--device` per call + // avoids the "I pinned it but it's not working" loop. Real humans in a + // real terminal have a tty and never see this notice. + if (!isInteractiveCaller()) { + Console.error( + "Note: this terminal looks non-interactive (AI agent, CI, or piped). " + + "The pin won't survive into fresh shells — pass " + + "`--device $deviceIdString` on each command instead.", + ) + } // First-time OOBE discovery hint. Surface the `-s` / require-steps trade-off // exactly once per connect so authors learn the durable-step contract self- // heal needs, without nagging on every tool call (which is the "paperwork" @@ -391,19 +425,12 @@ class DeviceConnectCommand : Callable { ) } - // 6. Shell-evaluable lines → stdout via the shared helper. This is what - // `eval $(...)` captures and runs in the parent shell to set - // TRAILBLAZE_DEVICE (and, when a target was passed, TRAILBLAZE_TARGET) - // for every subsequent CLI call in this terminal. The target export - // is the cross-invocation cousin of the daemon-side per-device - // override set in step 2: the daemon-side entry is wiped whenever a - // fresh MCP session re-claims the device (PR #3463 follow-up), but - // the env-pin survives because each new CLI invocation re-applies it - // via [resolveCliTargetPin] inside [cliReusableWithDevice]. - printShellExport("TRAILBLAZE_DEVICE", deviceIdString) - if (resolvedTarget != null) { - printShellExport("TRAILBLAZE_TARGET", resolvedTarget) - } + // Stdout is intentionally empty for this command now that the file-pin + // carries the binding. We used to print `export TRAILBLAZE_DEVICE=…` + // here so `eval $(...)` could lift it into the parent shell — that + // mechanism is obsolete with terminal-scoped pinning. Anyone who still + // wants the env var as a manual override can `export TRAILBLAZE_DEVICE=…` + // themselves; the resolver tier that reads it is unchanged. TrailblazeExitCode.SUCCESS.code } @@ -411,33 +438,26 @@ class DeviceConnectCommand : Callable { } /** - * Disconnect the current device and release its session. + * Disconnect the current device and clear this terminal's pin. * - * Pair with `device connect`: `eval $(trailblaze device disconnect)` prints - * `unset TRAILBLAZE_DEVICE` so the shell stops routing to a device the daemon - * no longer holds open. Without the `eval` wrapper, the daemon still releases - * the session but the shell's env var is left dangling (harmless — subsequent - * commands will fail at the daemon with "no active session" or auto-rebind - * once that path lands). + * Pair with `device connect`. After this runs, the resolver falls through to + * autodetect on subsequent CLI calls until a new `device connect` is issued. * - * Symmetric clear: `device disconnect` ALWAYS emits both `unset TRAILBLAZE_DEVICE` - * and `unset TRAILBLAZE_TARGET`, even when the prior `device connect` was bare - * (no `--target`, so `TRAILBLAZE_TARGET` was not exported by that connect). - * The contract is "the env-var lifecycle is owned by the connect/disconnect - * pair as a unit" — leaving a stale TRAILBLAZE_TARGET behind after a - * disconnect would silently contaminate the next `device connect` via - * [resolveCliTargetPin]'s env-tier read. Users who manage `TRAILBLAZE_TARGET` - * independently in their shell rc should set it AFTER any `device disconnect` - * runs (or not use `eval $(...)` to consume the disconnect output). + * **Backwards-compat: legacy env-var unset on stdout.** For users still wiring + * `eval $(trailblaze device disconnect)` in their shell rc, this command also + * emits `unset TRAILBLAZE_DEVICE` and `unset TRAILBLAZE_TARGET` on stdout so + * the eval-pattern keeps working. The lines are vestigial — the file-pin write + * to `~/.trailblaze/shell-device-pins-.json` is what the rest of the + * CLI consults — but harmless to keep for users mid-migration. * * Examples: - * eval $(trailblaze device disconnect) - Release the bound device + clear env vars - * trailblaze device disconnect - Release the bound device (env vars untouched) + * trailblaze device disconnect - Release the device + clear this terminal's pin + * trailblaze device disconnect --device android/... - Release a specific bound device by id */ @Command( name = "disconnect", mixinStandardHelpOptions = true, - description = ["Disconnect a device (use `eval $(...)` to also clear TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET)"], + description = ["Disconnect a device and clear this terminal's pin"], ) class DeviceDisconnectCommand : Callable { @@ -446,7 +466,11 @@ class DeviceDisconnectCommand : Callable { @CommandLine.Option( names = ["-d", "--device"], - description = ["Device to disconnect. Defaults to \$TRAILBLAZE_DEVICE."], + description = [ + "Device to disconnect. Defaults to `\$TRAILBLAZE_DEVICE` if set " + + "manually, otherwise this terminal's pin (set by " + + "`trailblaze device connect`).", + ], ) var device: String? = null @@ -456,31 +480,49 @@ class DeviceDisconnectCommand : Callable { // daemon's currently-bound session, a bare `device disconnect` from a fresh // shell that never connected anything would happily terminate work belonging // to another shell. Force the caller to name the device they're disconnecting. + // Resolve the device the caller wants to release. `resolveCliDevice` only + // covers --device and TRAILBLAZE_DEVICE; the file-pin written by + // `device connect` is the primary mechanism now, so we also consult it + // here. Without this, a user who connected via the file-pin and then + // typed `trailblaze device disconnect` (no flag, no env) would get the + // "needs a device" error instead of the obvious release. + val port = CliConfigHelper.resolveEffectiveHttpPort() val expectedDevice = resolveCliDevice(device) + ?: run { + val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } + val pid = pidStr?.toLongOrNull()?.takeIf { it > 0 } + pid?.let { + (ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), it) + as? ShellDevicePinStore.PinLookup.Found)?.device + } + } if (expectedDevice.isNullOrBlank()) { Console.error( - "device disconnect needs a device to act on. Pass `--device ` " + - "or set TRAILBLAZE_DEVICE first (typically via `eval \$(trailblaze " + - "device connect )`). This prevents accidentally stopping " + - "another shell's session in the multi-terminal case.", + "device disconnect needs a device to act on. This terminal has no pin " + + "(each terminal has its own — pinning in one doesn't show up in " + + "another). Pass `--device /` to name a specific device " + + "to release, or run `trailblaze device list` to see what's currently " + + "bound and try `trailblaze device disconnect --device `.", ) return TrailblazeExitCode.MISUSE.code } return cliWithDaemon(verbose = false) { client -> - val port = CliConfigHelper.resolveEffectiveHttpPort() when (val outcome = stopBoundSessionIfMatches(client, expectedDevice)) { is StopBoundSessionResult.NoActiveSession -> { Console.error( - "No device currently bound on the daemon. Clearing TRAILBLAZE_DEVICE " + - "and TRAILBLAZE_TARGET in case they're stale.", + "No device currently bound on the daemon. Clearing this terminal's pin " + + "and any stale TRAILBLAZE_DEVICE / TRAILBLAZE_TARGET env vars.", ) CliMcpClient.clearSession(port) - // Symmetric with TRAILBLAZE_DEVICE: when `device connect --target X` - // sets both env vars, `device disconnect` clears both. Leaving - // TRAILBLAZE_TARGET set while TRAILBLAZE_DEVICE is unset would let - // a stale target pin contaminate the next `device connect` in this - // shell via `cliReusableWithDevice`'s [resolveCliTargetPin] read. + // Clear the per-terminal file pin so the resolver doesn't keep + // returning a now-stale entry on subsequent calls. + clearShellDevicePinIfPossible() + // Symmetric env-var unsets are still emitted on stdout so legacy + // `eval $(trailblaze device disconnect)` workflows keep functioning + // for users who still wire that pattern in their shells. The + // env-var-via-stdout pathway is no longer required (file-pin + // handles it), but it's harmless and backwards-compatible. printShellUnset("TRAILBLAZE_DEVICE") printShellUnset("TRAILBLAZE_TARGET") TrailblazeExitCode.SUCCESS.code @@ -489,10 +531,9 @@ class DeviceDisconnectCommand : Callable { Console.error( "Won't disconnect: you asked to release '$expectedDevice' but the " + "daemon's current session is bound to ${outcome.boundDevice.toFullyQualifiedDeviceId()}. " + - "Either another shell connected after you did, or TRAILBLAZE_DEVICE is stale. " + - "To release the other binding anyway: `trailblaze device disconnect " + - "--device ${outcome.boundDevice.toFullyQualifiedDeviceId()}`. " + - "To clear this shell's env vars only: `unset TRAILBLAZE_DEVICE TRAILBLAZE_TARGET`.", + "Either another terminal connected after you did, or this terminal's " + + "pin is stale. To release the other binding anyway: `trailblaze device " + + "disconnect --device ${outcome.boundDevice.toFullyQualifiedDeviceId()}`.", ) TrailblazeExitCode.INFRA_FAILED.code } @@ -505,7 +546,12 @@ class DeviceDisconnectCommand : Callable { // this shell would try to reattach to the now-closed session and fail // before auto-creating a new one. Mirrors `session stop`. CliMcpClient.clearSession(port) + // Clear the per-terminal file pin so subsequent commands fall back + // to autodetect (or a different terminal's pin) instead of trying + // to use this just-disconnected device. + clearShellDevicePinIfPossible() Console.error("Disconnected $expectedDevice.") + // See note above on legacy env-var unset. printShellUnset("TRAILBLAZE_DEVICE") printShellUnset("TRAILBLAZE_TARGET") TrailblazeExitCode.SUCCESS.code @@ -525,9 +571,8 @@ class DeviceDisconnectCommand : Callable { * sets the new target. The daemon lazily starts a fresh session bound to the * new target on the next action command (`tool`, `step`, `snapshot`, etc.). * - * TRAILBLAZE_DEVICE is unchanged: the device binding itself isn't moving, so - * the shell env var that points at this device stays valid. No `eval $(...)` - * wrapper is needed. + * The per-terminal pin's *device* doesn't move — only the bound target does + * — so rebind doesn't touch `~/.trailblaze/shell-device-pins-.json`. * * Examples: * trailblaze device rebind --target sampleapp @@ -545,7 +590,11 @@ class DeviceRebindCommand : Callable { @CommandLine.Option( names = ["-d", "--device"], - description = ["Device to rebind. Defaults to \$TRAILBLAZE_DEVICE."], + description = [ + "Device to rebind. Defaults to `\$TRAILBLAZE_DEVICE` if set " + + "manually, otherwise this terminal's pin (set by " + + "`trailblaze device connect`).", + ], ) var device: String? = null @@ -558,16 +607,24 @@ class DeviceRebindCommand : Callable { override fun call(): Int { // Same multi-terminal safety pin as `device disconnect`: refuse to operate - // without an explicit device identifier (flag or env var), so a bare - // `rebind` from a fresh shell can't accidentally tear down another - // shell's session on the way to swapping its target. + // without an explicit device identifier (flag or env var OR file-pin), so a + // bare `rebind` from a fresh shell with no pin can't accidentally tear down + // another shell's session on the way to swapping its target. + val port = CliConfigHelper.resolveEffectiveHttpPort() val expectedDevice = resolveCliDevice(device) + ?: run { + val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } + val pid = pidStr?.toLongOrNull()?.takeIf { it > 0 } + pid?.let { + (ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), it) + as? ShellDevicePinStore.PinLookup.Found)?.device + } + } if (expectedDevice.isNullOrBlank()) { Console.error( "device rebind needs a device to act on. Pass `--device ` " + - "or set TRAILBLAZE_DEVICE first (typically via `eval \$(trailblaze " + - "device connect )`). This prevents accidentally rebinding " + - "another shell's session in the multi-terminal case.", + "or `trailblaze device connect ` first so this terminal " + + "knows what to rebind.", ) return TrailblazeExitCode.MISUSE.code } @@ -597,10 +654,9 @@ class DeviceRebindCommand : Callable { Console.error( "Won't rebind: you asked to rebind '$expectedDevice' but the " + "daemon's current session is bound to ${boundId.toFullyQualifiedDeviceId()}. " + - "Either another shell connected after you did, or TRAILBLAZE_DEVICE is stale. " + - "To rebind the other binding anyway: `trailblaze device rebind " + - "--device ${boundId.toFullyQualifiedDeviceId()} --target $newTarget`. " + - "To clear this shell's env var only: `unset TRAILBLAZE_DEVICE`.", + "Either another terminal connected after you did, or this terminal's " + + "pin is stale. To rebind the other binding anyway: `trailblaze device " + + "rebind --device ${boundId.toFullyQualifiedDeviceId()} --target $newTarget`.", ) return@cliWithDaemon TrailblazeExitCode.INFRA_FAILED.code } @@ -659,17 +715,24 @@ class DeviceRebindCommand : Callable { return@cliWithDaemon TrailblazeExitCode.INFRA_FAILED.code } - // Status to stderr — the device binding itself hasn't moved, so - // TRAILBLAZE_DEVICE is unchanged. The TARGET pin, however, has: emit a - // shell-evaluable `export TRAILBLAZE_TARGET=` on stdout so - // `eval $(trailblaze device rebind --target X)` keeps the shell pin in - // sync with the daemon-side override we just set. Without this, the - // env var still says the OLD target and the next action command would - // re-apply it via [resolveCliTargetPin], silently undoing the rebind. + // Plain stderr confirmation. The device-side binding hasn't moved, so + // this terminal's pin (which keys on device, not target) stays valid; + // the new target is recorded daemon-side as a per-session override + // that the resolver re-applies on every subsequent CLI call. Legacy + // `eval $(trailblaze device rebind ...)` callers who relied on the + // stdout `export TRAILBLAZE_TARGET=…` line will need to update — the + // file-pin makes that mechanism redundant for the typical flow, and + // anyone who wants the env var as a manual override can `export` it. val deviceIdString = boundId.toFullyQualifiedDeviceId() + // Update the pin's target field. Without this, the next CLI call in + // this terminal would read the pin's OLD target (or null), call + // `setSessionTargetForBoundDevice` with the stale value, and silently + // undo the rebind. Note: this also writes a fresh pin for terminals + // that didn't have one (rebind via explicit --device from a shell + // that never ran connect) — which matches user intent: they just + // expressed a (device, target) binding for this shell. + writeShellDevicePinIfPossible(deviceIdString, newTarget) Console.error("Rebound $deviceIdString to target=$newTarget.") - Console.error("Pin to this shell: eval \$(trailblaze device rebind --device $deviceIdString --target $newTarget)") - printShellExport("TRAILBLAZE_TARGET", newTarget) TrailblazeExitCode.SUCCESS.code } } diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt index 89337dc5a..5aabc7486 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt @@ -70,7 +70,8 @@ class McpCommand : Callable { names = ["-d", "--device"], description = [ "Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). " + - "Defaults to \$TRAILBLAZE_DEVICE.", + "Defaults to whatever the launching terminal pinned via " + + "`trailblaze device connect`, or `\$TRAILBLAZE_DEVICE` if set.", ], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt index 1d49387fa..2aee69184 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt @@ -100,7 +100,7 @@ class SessionStartCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], + description = [DEVICE_OPTION_DESCRIPTION], ) var device: String? = null @@ -200,6 +200,11 @@ class SessionStartCommand : Callable { // supplies a value. `--target=clear` (flag-only) sends an empty // string to clear the override. if (daemonCall.payload != null) { + // Same ordering as cliReusableWithDevice: file-pin clear FIRST so a + // file write failure doesn't leave the daemon and file diverged. + if (daemonCall.isClearRequest) { + clearShellDevicePinTargetIfPossible() + } val setError = it.setSessionTargetForBoundDevice(daemonCall.payload) if (setError != null) { Console.error(setError) @@ -258,7 +263,7 @@ class SessionStopCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], + description = [DEVICE_OPTION_DESCRIPTION], ) var device: String? = null @@ -619,7 +624,7 @@ class SessionEndCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], + description = [DEVICE_OPTION_DESCRIPTION], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt new file mode 100644 index 000000000..53fbc8ad6 --- /dev/null +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt @@ -0,0 +1,346 @@ +package xyz.block.trailblaze.cli + +import java.io.File +import java.io.RandomAccessFile +import java.nio.file.Files +import java.nio.file.StandardCopyOption +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import xyz.block.trailblaze.ui.TrailblazeDesktopUtil + +/** + * Per-terminal device-pin storage. + * + * **What this is.** A small JSON file mapping `(shellPid → boundDevice)` so the + * CLI resolver can answer "what device should this terminal default to?" + * without making the user export a shell env var. The file is read on every + * device-resolving command and consulted as a resolver tier between the + * `TRAILBLAZE_DEVICE` env var and connected-device autodetect — see + * [resolveDeviceWithAutodetect]. + * + * **Why a file and not the daemon.** The pin must survive `trailblaze app --stop + * && trailblaze app start` so a user who restarts their daemon doesn't lose + * their terminal binding. Keeping it in a file gives us that for free; the + * daemon stays stateless on this axis. The cost is concurrency control on the + * file, addressed below. + * + * **PID reuse.** Shell PIDs are eventually recycled by the OS. The window for + * a stale pin to bite is "user closes terminal A AND opens terminal B that + * gets terminal A's recycled PID AND never runs `device connect` themselves + * AND runs a device command in the same project," and the worst-case impact + * is "terminal B inherits an unexpected device default." That's a one-in-a- + * million sequence, the recovery is `trailblaze device connect `, + * and detecting it requires a start-instant comparison on every read — the + * cost of the prevention outweighs the cost of the bug. So we don't try. + * Liveness checking (PID exists at all) IS done — that's what cleans out + * dead shells; it just doesn't fingerprint the live process. + * + * **Garbage collection.** Lazy. Every mutation drops entries whose PID is no + * longer alive. No background sweep — at worst the file accumulates dead + * entries until something writes it, at which point they're evicted in + * O(N). At typical scale (handful of shells) this is negligible. + * + * **Concurrency.** Two terminals can call `trailblaze device connect` in the + * same instant. We use kernel-level advisory file locking + * ([java.nio.channels.FileChannel.lock]) for read-modify-write: acquire + * exclusive lock → read → mutate → write to tempfile → fsync → rename → + * release. Locks are kept short (single-digit-KB file) so contention is + * effectively zero in practice. An in-JVM monitor on top of the file lock + * guards thread-level concurrency within a single daemon (Java's + * `FileChannel.lock` is process-scoped, not thread-scoped). + * + * **Multi-daemon isolation.** The file path is port-scoped + * ([pinFileFor]) — a user running `TRAILBLAZE_PORT=52527 trailblaze app start` + * for an isolated test daemon gets its own pin map. Different daemons + * typically have different device lists, so cross-daemon pin sharing would + * point at non-existent device ids. + * + * **Test hooks.** Every method takes the file path explicitly, and the + * liveness check is injectable via [LivenessProbe]. Production calls + * default to [ProcessHandle.of]; tests pass a deterministic lambda so the + * store's eviction logic can be unit-tested without spawning real processes. + */ +internal object ShellDevicePinStore { + + /** Lookup result for "what's pinned for shell pid X?". */ + sealed class PinLookup { + /** + * Entry present and live; safe to use. Carries the full [Entry] so callers + * can pull either [Entry.device] or [Entry.target] without a second file + * read. The device-only callers ([resolveDeviceWithAutodetect], + * [DeviceDisconnectCommand]) read `.entry.device`; the target tier in + * [resolveCliTargetPin] reads `.entry.target`. + */ + data class Found(val entry: Entry) : PinLookup() { + val device: String get() = entry.device + val target: String? get() = entry.target + } + /** Entry absent or PID dead (shell exited). */ + data object NotFound : PinLookup() + } + + /** + * Predicate: is this PID currently bound to a running process? + * + * Production is [::isPidAlive] (delegates to [ProcessHandle.of]). Tests + * pass a deterministic lambda so the store's eviction logic can be + * unit-tested without spawning real processes. + */ + fun interface LivenessProbe { + operator fun invoke(pid: Long): Boolean + } + + /** + * One terminal's pin. [device] is the bound device id (e.g. `android/emulator-5554`). + * [target] is the bound target app (e.g. `default`, `sampleapp`) when the user passed + * `--target X` to `device connect` or `device rebind`, otherwise null. Nullable + * because some users `device connect` bare and let workspace config / built-in + * default supply the target on each action call. + * + * Persisting [target] alongside [device] is what makes the connect-time target + * survive a daemon restart: every subsequent CLI invocation reads this entry, + * re-applies the target as a per-device override on the daemon, and the user's + * connect-time intent stays in force even after `trailblaze app --stop && + * trailblaze app start`. Without this field, the target would live only in the + * daemon's in-memory `SessionTargetRegistry` and quietly degrade to workspace + * config on daemon restart — see PR #3611 review feedback. + */ + @Serializable + internal data class Entry(val device: String, val target: String? = null) + + @Serializable + internal data class PinFile(val shells: Map = emptyMap()) + + private val json = Json { + prettyPrint = true + prettyPrintIndent = " " + encodeDefaults = true + ignoreUnknownKeys = true + } + + /** + * Per-file in-JVM lock — `FileChannel.lock()` is **process-scoped** in Java + * (overlapping locks on the same channel throw [java.nio.channels.OverlappingFileLockException]), + * so without an in-JVM monitor two threads in the same daemon racing on + * `mutate` would either lose a write or crash. The file lock still guards + * cross-JVM concurrency (two `./trailblaze` processes writing simultaneously); + * this monitor guards thread-level concurrency within a single JVM. + * + * Keyed by canonical path so different files are independent and tests + * using TemporaryFolder don't contend on a global lock. + */ + private val jvmLocks: MutableMap = java.util.concurrent.ConcurrentHashMap() + + private fun jvmLockFor(file: File): Any = + jvmLocks.computeIfAbsent(file.canonicalPath) { Any() } + + /** + * Default location for the pin file, scoped to the daemon port so isolated + * daemons don't collide. Falls under `~/.trailblaze/` alongside the rest of + * the per-user state. + */ + fun pinFileFor(port: Int): File = + File(TrailblazeDesktopUtil.getDefaultAppDataDirectory(), "shell-device-pins-$port.json") + + /** + * Look up the device pinned for [shellPid], evicting the entry inline if + * the PID is no longer alive. Idempotent — repeat calls return the same + * answer without writing the file unless eviction was triggered. + * + * Safe to call when [file] doesn't exist (returns [PinLookup.NotFound] + * without creating it) — that's the cold-start case for a user who's + * never run `device connect`. + */ + fun resolvePin( + file: File, + shellPid: Long, + probe: LivenessProbe = LivenessProbe(::isPidAlive), + ): PinLookup { + if (!file.exists()) return PinLookup.NotFound + val map = readMapOrEmpty(file) + val entry = map.shells[shellPid.toString()] ?: return PinLookup.NotFound + return if (probe(shellPid)) { + PinLookup.Found(entry) + } else { + // PID dead — evict and report not-found. The eviction write is + // best-effort; a failure here doesn't affect correctness (the next + // read will retry the eviction). + runCatching { mutate(file, probe) { it - shellPid.toString() } } + PinLookup.NotFound + } + } + + /** + * Set [shellPid] → ([device], [target]) in the pin file. Replaces any prior + * entry for the same PID (a user re-running `device connect` to switch + * devices, or `device rebind --target` to swap the bound target). + * + * [target] is null when the user pinned a device without `--target`; null is + * preserved on read so action commands fall through to env / workspace + * config / built-in default rather than re-applying a stale value. + * + * Also opportunistically evicts dead entries from the file as part of the + * same read-modify-write — no separate GC pass needed. + */ + fun setPin( + file: File, + shellPid: Long, + device: String, + target: String? = null, + probe: LivenessProbe = LivenessProbe(::isPidAlive), + ) { + mutate(file, probe) { current -> + current + (shellPid.toString() to Entry(device = device, target = target)) + } + } + + /** + * Remove the entry for [shellPid] if present. No-op when absent. Also + * sweeps dead entries during the same read-modify-write. + */ + fun clearPin( + file: File, + shellPid: Long, + probe: LivenessProbe = LivenessProbe(::isPidAlive), + ) { + mutate(file, probe) { current -> current - shellPid.toString() } + } + + /** + * Atomically null out the `target` field on this terminal's pin while + * leaving the device binding alone. Used by `--target=clear` to wipe the + * connect-time target without disconnecting. + * + * Single `mutate()` call — read AND write happen inside one lock window, + * so a concurrent writer to the same PID can't slip a write in between a + * naïve "resolvePin then setPin" sequence. (Same-PID concurrency is rare + * — requires backgrounded `./trailblaze &` invocations from one shell — + * but the atomic variant costs the same as the split version and removes + * the race outright.) + * + * No-op when there's no existing entry for [shellPid], when the entry's + * target is already null, or when the entry's PID is dead (in which case + * the entry is also evicted as part of the standard mutate-time GC). + */ + fun clearPinTarget( + file: File, + shellPid: Long, + probe: LivenessProbe = LivenessProbe(::isPidAlive), + ) { + mutate(file, probe) { current -> + val existing = current[shellPid.toString()] ?: return@mutate current + if (existing.target == null) return@mutate current + current + (shellPid.toString() to existing.copy(target = null)) + } + } + + /** + * Read-only snapshot of the file's entries. Does NOT evict dead entries + * (read-only). Used by diagnostics / `trailblaze device list-pins` kind of + * surfaces; the resolver uses [resolvePin] instead so it stays self- + * cleaning. + */ + fun readAll(file: File): Map { + if (!file.exists()) return emptyMap() + val map = readMapOrEmpty(file) + return map.shells.mapNotNull { (k, v) -> k.toLongOrNull()?.let { it to v } }.toMap() + } + + // ---------------- internals ---------------- + + /** + * Read-modify-write under exclusive file lock, with opportunistic eviction + * of dead entries. [transform] receives the current map and returns the + * post-transform map. Dead-entry pruning is applied to the result so any + * mutation also cleans up. + * + * The lock is held only across read + write of the JSON body (microseconds + * for KB-scale files). On JVM exit mid-write, the OS releases the lock and + * the rename below ensures readers never see a partial file (worst case + * they see the pre-write contents). + */ + private fun mutate( + file: File, + probe: LivenessProbe, + transform: (Map) -> Map, + ) { + file.parentFile?.mkdirs() + // Two-layer lock: synchronize in-JVM threads on `jvmLockFor(file)` so + // racing threads serialize their RMW; inside the monitor, also take the + // OS-level file lock so racing JVMs (two `trailblaze` invocations) don't + // step on each other. Single-layer file-lock is insufficient because + // `FileChannel.lock()` is process-scoped — two threads in the same JVM + // either get an OverlappingFileLockException or silently bypass the + // lock. See [jvmLocks] for the keyed-monitor rationale. + // The cross-process lock lives on a SIBLING `.lock` file, never on the + // data file itself. The atomic-rename below replaces the data-file + // inode, so if we locked the data file directly, a second JVM that + // opened the path between our acquire and our rename would block on + // the now-orphaned inode, then read stale contents from its + // still-open handle and overwrite our update. Locking a stable lock + // path that nothing renames keeps both writers serialized on the same + // inode for the duration of their RMW. The lock file is touched once + // and never moved or rewritten — opening it for "rw" just creates it + // if missing. + val lockFile = File(file.parentFile, "${file.name}.lock") + // Defensive check: if the lock path exists but isn't a regular file (e.g. + // a user `mkdir`d it by accident, or filesystem weirdness left a directory + // at the path), `RandomAccessFile` will throw a `FileNotFoundException` + // with a misleading message ("Is a directory"). Surface a clear error + // instead so the user knows what to fix. + if (lockFile.exists() && !lockFile.isFile) { + throw IllegalStateException( + "Pin lock path $lockFile is not a regular file (got: ${if (lockFile.isDirectory) "directory" else "other"}). " + + "Remove it and retry.", + ) + } + synchronized(jvmLockFor(file)) { + RandomAccessFile(lockFile, "rw").use { lockRaf -> + lockRaf.channel.lock().use { + val current = if (file.exists() && file.length() > 0) { + runCatching { + json.decodeFromString(PinFile.serializer(), file.readText()).shells + }.getOrDefault(emptyMap()) + } else { + emptyMap() + } + val transformed = transform(current) + // Keep entries whose PID is still alive. Entries with non-numeric + // keys (corrupted file from a manual edit) are dropped — they + // can't refer to a real OS process anyway. + val gced = transformed.filter { (pidStr, _) -> + val pid = pidStr.toLongOrNull() ?: return@filter false + probe(pid) + } + val payload = json.encodeToString(PinFile.serializer(), PinFile(shells = gced)) + // Write to a temp sibling and atomically rename into place. The + // sibling is created next to the data file so the rename is on + // the same filesystem (a cross-device rename would fall back to + // copy+delete, losing atomicity). + val tmp = File(file.parentFile, "${file.name}.tmp") + tmp.writeText(payload) + Files.move( + tmp.toPath(), + file.toPath(), + StandardCopyOption.REPLACE_EXISTING, + StandardCopyOption.ATOMIC_MOVE, + ) + } + } + } + } + + private fun readMapOrEmpty(file: File): PinFile = + runCatching { json.decodeFromString(PinFile.serializer(), file.readText()) } + .getOrDefault(PinFile()) + + /** + * Default production liveness check. Returns `true` when [pid] is bound to + * a currently-running process. `ProcessHandle.of` returns + * `Optional.empty()` for non-existent PIDs on Unix; the additional + * `isAlive` check covers zombie/exiting states where the PID still + * resolves but the process is gone. + */ + private fun isPidAlive(pid: Long): Boolean = + ProcessHandle.of(pid).map { it.isAlive }.orElse(false) +} diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt index c66b98926..7910e8cbd 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt @@ -22,7 +22,7 @@ class SnapshotCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], + description = [DEVICE_OPTION_DESCRIPTION], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt index 4ae00691c..80e64f7d8 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt @@ -68,7 +68,7 @@ class StepCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id (e.g., android/emulator-5554). Required for interactive step/verify execution."] + description = [DEVICE_OPTION_DESCRIPTION] ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt index ae146ae98..f1b66a9d6 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt @@ -63,7 +63,7 @@ class ToolCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], + description = [DEVICE_OPTION_DESCRIPTION], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt index 5540fccd2..9a967b5e7 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt @@ -85,7 +85,7 @@ class ToolboxCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Target device (e.g. android, android/emulator-5554)."], + description = [DEVICE_OPTION_DESCRIPTION], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt index 765a23331..75057219d 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt @@ -128,7 +128,7 @@ open class TrailCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web), platform/instance-id, or instance ID"] + description = [DEVICE_OPTION_DESCRIPTION] ) var device: String? = null @@ -481,15 +481,26 @@ open class TrailCommand : Callable { // fire for the multi-device / no-device cases (its message lists available devices in // the trail-runner-specific shape, which is more useful than the standard one here). // + // The inlined tier order mirrors `resolveDeviceWithAutodetect`: + // 1. `--device` flag (already handled above when non-blank) + // 2. `TRAILBLAZE_DEVICE` env var + // 3. This terminal's file-pin (added so `trailblaze device connect X` followed + // by `trailblaze run …` inherits the device — pre-fix, the resolver skipped + // straight from env to autodetect and a pinned multi-device shell hit the + // multi-device error) + // 4. Autodetect (exactly one connected device) + // 5. Workspace config's `cliDevicePlatform` (trail-runner-specific) + // // Guard on `isNullOrBlank()` (not `== null`) so a stray `--device ""` / - // `--device " "` falls through to env/autodetect/config rather than being + // `--device " "` falls through to env/pin/autodetect/config rather than being // forwarded to the runner verbatim — letting a blank string slip through // would surface as a cryptic "Device '' not found" mid-pipeline. Same // treatment `resolveCliDevice` applies to the env var. + val port = parent.getEffectivePort() if (device.isNullOrBlank()) { device = resolveCliDevice(null) + ?: readShellPinDevice(port) ?: run { - val port = parent.getEffectivePort() val autodetected = runBlocking { autodetectSingleConnectedDevice(port) } if (autodetected is DeviceAutodetectResult.Resolved) { reportAutodetectedDevice(autodetected.deviceSpec) @@ -1154,6 +1165,13 @@ open class TrailCommand : Callable { // Resolve target app: prefer trail config's `target` field, fall back to settings selection. // This ensures custom tools (e.g., myApp_launchSignedIn) are registered for the // correct app even when the desktop UI has a different app selected. + // + // Deliberately does NOT consult the per-terminal target pin (`resolveCliTargetPin`). + // Trails are reusable artifacts that travel between users and CI — if a trail needs + // a target, it declares one in its config. Inheriting the caller's terminal pin would + // make the same trail behave differently between developers, which defeats the + // determinism contract. The device pin IS consulted (above, in the resolver chain) + // because the device a trail runs on is operator-scoped, not trail-scoped. val targetTestApp = trailConfig?.target?.let { config.availableAppTargets.findById(it) } ?: app.deviceManager.getCurrentSelectedTargetApp() if (verbose) { diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt index b1c4cb819..64a3a5661 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt @@ -30,7 +30,7 @@ class VerifyCommand : Callable { @Option( names = ["-d", "--device"], - description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], + description = [DEVICE_OPTION_DESCRIPTION], ) var device: String? = null diff --git a/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt b/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt new file mode 100644 index 000000000..b4c4702f8 --- /dev/null +++ b/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt @@ -0,0 +1,406 @@ +package xyz.block.trailblaze.cli + +import java.io.File +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue +import org.junit.Rule +import org.junit.rules.TemporaryFolder + +/** + * Tests for [ShellDevicePinStore]. + * + * Coverage focuses on the contract that the CLI resolver depends on: + * + * - Cold-start (file missing) returns NotFound without creating the file. + * - Round-trip set → resolve returns the pinned device. + * - Dead PID (probe returns false) → NotFound + eviction. + * - Concurrent terminals (different PIDs) coexist; clearing one preserves the other. + * - Garbage collection runs opportunistically on every mutation so a long-lived + * file doesn't accumulate dead entries forever. + * - Concurrent writers under file locking don't lose updates. + * - Port scoping: two daemons get independent files. + * - Corrupted file content is treated as empty rather than throwing. + * - Non-numeric keys (corrupted file) get dropped on the next mutation. + * + * The liveness probe is injected as a deterministic lambda so tests don't depend + * on real PIDs. Production wires it to `ProcessHandle.of(pid).map { it.isAlive }`. + */ +class ShellDevicePinStoreTest { + + @Rule + @JvmField + val tmp = TemporaryFolder() + + private fun newFile(): File = File(tmp.root, "shell-device-pins-52525.json") + + /** Probe that reports every PID as alive. */ + private val allAlive = ShellDevicePinStore.LivenessProbe { _ -> true } + + /** Probe that reports every PID as dead. */ + private val allDead = ShellDevicePinStore.LivenessProbe { _ -> false } + + @Test + fun `resolvePin returns NotFound when file does not exist`() { + val file = newFile() + assertFalse(file.exists(), "precondition: file should not exist") + val result = ShellDevicePinStore.resolvePin(file, shellPid = 12345L, probe = allAlive) + assertEquals(ShellDevicePinStore.PinLookup.NotFound, result) + assertFalse(file.exists(), "resolvePin must not create the file on a cold read") + } + + @Test + fun `setPin then resolvePin round-trips the device`() { + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + assertEquals(ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), result) + } + + @Test + fun `setPin with target round-trips both fields`() { + // Persisting the target is what makes `device connect --target X` survive + // a daemon restart — see PR #3611 review feedback. Round-trip via resolve + // to confirm the target field is JSON-encoded and decoded correctly, and + // accessible via the convenience getter on PinLookup.Found. + val file = newFile() + ShellDevicePinStore.setPin( + file, + 12345L, + device = "android/emulator-5554", + target = "sampleapp", + probe = allAlive, + ) + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + val found = result as? ShellDevicePinStore.PinLookup.Found + assertEquals("android/emulator-5554", found?.device) + assertEquals("sampleapp", found?.target) + } + + @Test + fun `setPin without target preserves null target on read`() { + // Users who pin a bare `device connect` (no --target) should land on a + // null target so the resolver falls through to env / workspace config / + // built-in default rather than re-applying a stale value. + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + val found = result as? ShellDevicePinStore.PinLookup.Found + assertEquals("android/emulator-5554", found?.device) + assertEquals(null, found?.target) + } + + @Test + fun `mutate throws IllegalStateException when lock path exists as a directory`() { + // A corrupted ~/.trailblaze/ state (user mkdir'd the lock path, filesystem + // weirdness, etc.) should surface a clear error naming the path — not the + // misleading "Is a directory" FileNotFoundException that RandomAccessFile + // would otherwise throw mid-lock. See lead-dev-review finding from + // PR #3611 — the defensive check fires early to keep the failure + // self-diagnostic. + val file = newFile() + file.parentFile.mkdirs() + val lockPath = java.io.File(file.parentFile, "${file.name}.lock") + lockPath.mkdirs() + assertTrue(lockPath.isDirectory, "precondition: lock path must be a directory") + + val ex = kotlin.runCatching { + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + }.exceptionOrNull() + assertTrue(ex is IllegalStateException, "expected IllegalStateException, got: $ex") + assertTrue( + ex.message?.contains(lockPath.name) == true, + "exception message should name the bad lock path: got: ${ex.message}", + ) + } + + @Test + fun `clearPinTarget atomically nulls the target while preserving the device`() { + // The atomic variant (single mutate() lock window) used by --target=clear. + // Replaces the resolvePin-then-setPin sequence that had a same-PID race + // window in the rare case of concurrent ./trailblaze invocations from + // one backgrounded shell. + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "sampleapp", probe = allAlive) + + ShellDevicePinStore.clearPinTarget(file, 12345L, probe = allAlive) + + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + val found = result as? ShellDevicePinStore.PinLookup.Found + assertEquals("android/emulator-5554", found?.device, "device must survive a target-only clear") + assertEquals(null, found?.target, "target must be null after clearPinTarget") + } + + @Test + fun `clearPinTarget is a no-op when entry is absent`() { + // Cold-file case: no entry for this PID at all → nothing to clear → the + // function must not create a phantom entry. (Some non-target-clear + // workflow could rely on this — defensive coverage.) + val file = newFile() + ShellDevicePinStore.clearPinTarget(file, 12345L, probe = allAlive) + assertEquals( + ShellDevicePinStore.PinLookup.NotFound, + ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), + ) + } + + @Test + fun `clearPinTarget on an already-null target leaves the entry intact`() { + // After the first clear, subsequent clears should leave the entry's + // device intact and the target null. (mutate() does still rewrite the + // file even when the transform is a no-op — that's an accepted cost + // for the simpler implementation; the property we care about is that + // the entry's value is unchanged.) + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = null, probe = allAlive) + ShellDevicePinStore.clearPinTarget(file, 12345L, probe = allAlive) + + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + val found = result as? ShellDevicePinStore.PinLookup.Found + assertEquals("android/emulator-5554", found?.device, "device must remain intact") + assertEquals(null, found?.target, "target stays null") + } + + @Test + fun `setPin with target=null clears only the target, preserving the device`() { + // Models the `--target=clear` flow: clear the target field on the pin + // without disconnecting the device. The user's terminal stays bound to + // its device; the next action call falls through to env / workspace + // config for the target instead of re-applying the cleared one. + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "sampleapp", probe = allAlive) + // Surgery: same PID, same device, null target. + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = null, probe = allAlive) + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + val found = result as? ShellDevicePinStore.PinLookup.Found + assertEquals("android/emulator-5554", found?.device, "device pin must survive a target clear") + assertEquals(null, found?.target, "target must be null after the clear") + } + + @Test + fun `setPin overwrites prior target when called again`() { + // `device rebind --target Y` re-writes the pin with the new target. + // Confirm the second write replaces, not merges, the prior target. + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "sampleapp", probe = allAlive) + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "square", probe = allAlive) + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + assertEquals("square", (result as? ShellDevicePinStore.PinLookup.Found)?.target) + } + + @Test + fun `pin file written by older code without target field still deserializes`() { + // Backwards compat: existing pin files from before this PR's target field + // have entries shaped like {"device": "android/..."}. The new Entry's + // `target: String? = null` default needs to handle that gracefully on + // read so a user who upgrades doesn't lose their device pin. + val file = newFile() + file.parentFile.mkdirs() + file.writeText( + """ + { + "shells": { + "12345": { "device": "android/emulator-5554" } + } + } + """.trimIndent(), + ) + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + val found = result as? ShellDevicePinStore.PinLookup.Found + assertEquals("android/emulator-5554", found?.device) + assertEquals(null, found?.target) + } + + @Test + fun `resolvePin returns NotFound and evicts when the PID is no longer alive`() { + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allDead) + assertEquals(ShellDevicePinStore.PinLookup.NotFound, result) + + val after = ShellDevicePinStore.readAll(file) + assertFalse(after.containsKey(12345L), "dead-PID entry must be evicted") + } + + @Test + fun `pins for different shells coexist`() { + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + ShellDevicePinStore.setPin(file, 67890L, "ios/iPhone-15", probe = allAlive) + + assertEquals( + ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), + ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), + ) + assertEquals( + ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("ios/iPhone-15")), + ShellDevicePinStore.resolvePin(file, 67890L, probe = allAlive), + ) + } + + @Test + fun `setting the same PID twice replaces the prior device`() { + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5556", probe = allAlive) + + assertEquals( + ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5556")), + ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), + ) + } + + @Test + fun `clearPin removes the entry but preserves other terminals' pins`() { + val file = newFile() + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + ShellDevicePinStore.setPin(file, 67890L, "ios/iPhone-15", probe = allAlive) + + ShellDevicePinStore.clearPin(file, 12345L, probe = allAlive) + + assertEquals( + ShellDevicePinStore.PinLookup.NotFound, + ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), + ) + assertEquals( + ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("ios/iPhone-15")), + ShellDevicePinStore.resolvePin(file, 67890L, probe = allAlive), + ) + } + + @Test + fun `clearPin is a no-op when no entry exists`() { + val file = newFile() + // Cold file. Should not throw, should not create the file with an empty map + // either (the file gets created by `mutate` to acquire its lock, then ends + // up holding an empty `shells` map — both states are fine, just want no + // exception). + ShellDevicePinStore.clearPin(file, 12345L, probe = allAlive) + assertEquals( + ShellDevicePinStore.PinLookup.NotFound, + ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), + ) + } + + @Test + fun `mutate opportunistically garbage-collects dead entries`() { + val file = newFile() + ShellDevicePinStore.setPin(file, 11111L, "android/emulator-5554", probe = allAlive) + ShellDevicePinStore.setPin(file, 22222L, "android/emulator-5556", probe = allAlive) + ShellDevicePinStore.setPin(file, 33333L, "ios/iPhone-15", probe = allAlive) + + // Probe now reports only PID 22222 as alive. + val partialProbe = ShellDevicePinStore.LivenessProbe { pid -> pid == 22222L } + + // Any mutation should sweep dead entries — use a no-op set on the live PID. + ShellDevicePinStore.setPin(file, 22222L, "android/emulator-5556", probe = partialProbe) + + val after = ShellDevicePinStore.readAll(file) + assertEquals(setOf(22222L), after.keys, "GC must drop dead-PID entries on mutation") + } + + @Test + fun `readAll without eviction returns raw file contents`() { + val file = newFile() + ShellDevicePinStore.setPin(file, 11111L, "android/emulator-5554", probe = allAlive) + ShellDevicePinStore.setPin(file, 22222L, "android/emulator-5556", probe = allAlive) + + val all = ShellDevicePinStore.readAll(file) + assertEquals(2, all.size) + assertEquals("android/emulator-5554", all[11111L]?.device) + assertEquals("android/emulator-5556", all[22222L]?.device) + } + + @Test + fun `pinFileFor scopes file path by port`() { + val a = ShellDevicePinStore.pinFileFor(52525) + val b = ShellDevicePinStore.pinFileFor(52527) + assertTrue(a.path != b.path, "different ports must yield different file paths") + assertTrue(a.name.contains("52525"), "filename should carry the port: ${a.name}") + assertTrue(b.name.contains("52527"), "filename should carry the port: ${b.name}") + } + + @Test + fun `concurrent writers do not lose updates under file lock`() { + // Spawn N threads each writing a distinct PID's pin. After all join, every + // pin must be present — the file lock + in-JVM monitor serialize the RMW, + // so no thread's write is overwritten by another's stale read. + val file = newFile() + val threadCount = 16 + val threads = (1..threadCount).map { i -> + Thread { + val pid = i.toLong() * 1000 + ShellDevicePinStore.setPin(file, pid, "device-$i", probe = allAlive) + } + } + threads.forEach { it.start() } + threads.forEach { it.join() } + + val all = ShellDevicePinStore.readAll(file) + assertEquals(threadCount, all.size, "every concurrent write must be present") + for (i in 1..threadCount) { + val pid = i.toLong() * 1000 + assertEquals("device-$i", all[pid]?.device, "lost write for PID $pid") + } + } + + @Test + fun `corrupted file is treated as empty, not as an error`() { + val file = newFile() + file.parentFile.mkdirs() + file.writeText("{not valid json at all") + + // Read should treat this as empty, not throw. + val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) + assertEquals(ShellDevicePinStore.PinLookup.NotFound, result) + + // Write should overwrite the corruption cleanly. + ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) + assertEquals( + ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), + ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), + ) + } + + @Test + fun `entries with non-numeric keys are dropped on mutation`() { + val file = newFile() + file.parentFile.mkdirs() + // Hand-craft a file with a non-numeric key (someone edited it; or it came + // from a future version with a different key format). + file.writeText( + """ + { + "shells": { + "abc": { "device": "android/foo" }, + "12345": { "device": "android/emulator-5554" } + } + } + """.trimIndent(), + ) + + // Triggering any mutation should drop the non-numeric key while preserving + // the valid one. + ShellDevicePinStore.setPin(file, 67890L, "ios/iPhone-15", probe = allAlive) + + val all = ShellDevicePinStore.readAll(file) + assertEquals(setOf(12345L, 67890L), all.keys, "non-numeric keys must not survive a mutation") + } + + @Test + fun `setPin creates the parent directory if missing`() { + // Use a path under a not-yet-existing subdirectory to assert mkdirs() runs. + val nested = File(tmp.root, "deeply/nested/dir/shell-device-pins-52525.json") + assertFalse(nested.parentFile.exists(), "precondition: parent dir should not exist") + + ShellDevicePinStore.setPin(nested, 12345L, "android/emulator-5554", probe = allAlive) + + assertTrue(nested.exists(), "file should be created") + assertEquals( + ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), + ShellDevicePinStore.resolvePin(nested, 12345L, probe = allAlive), + ) + } +} diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt index bc87a6d07..8dbd6c47b 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt @@ -11,7 +11,11 @@ Ask a question about what's on screen (uses AI vision, no actions taken) ... Question about the screen (e.g., 'What's the current balance?') -d, --device= Device: platform (android, ios, web) or platform/id. - Defaults to $TRAILBLAZE_DEVICE. + Defaults to `$TRAILBLAZE_DEVICE` if set (manual + override; rare), otherwise this terminal's pin + (set by `trailblaze device connect`). In a + fresh-shell harness (Claude Code, Cursor, Codex, + CI), pass --device on every call. -h, --help Show this help message and exit. --headless= For --device web/...: launch the Playwright browser diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt index d6e134c34..ba9489649 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt @@ -8,8 +8,8 @@ Usage: trailblaze device connect [-hV] [--headless=] [--mcp-session=] [-t=] -Connect a device + target to your session (use `eval $(...)` to pin -TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell) +Connect a device + target and pin them for this terminal so subsequent commands +inherit the binding Device platform: ANDROID, IOS, or WEB (optionally with instance: android/emulator-5554) -h, --help Show this help message and exit. @@ -29,8 +29,9 @@ TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell) unbound MCP client (Claude Desktop, Cursor, Goose, …). No-op when no MCP clients are connected. -t, --target= Target app to bind to this device's session (e.g. - `default`, `sampleapp`). Optional. When set, `eval - $(trailblaze device connect ... --target X)` also - exports $TRAILBLAZE_TARGET so subsequent CLI calls - in this shell re-apply the binding automatically. + `default`, `sampleapp`). Optional. When set, the + target is recorded alongside the device in this + terminal's pin so subsequent CLI calls re-apply the + binding automatically until you `device disconnect` + or pin a different target. -V, --version Print version information and exit. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt index ced8a8dcd..91c2f000f 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt @@ -6,8 +6,10 @@ # small wording / spacing changes can be intentional or accidental. # ---------------------------------------------------------------------- Usage: trailblaze device disconnect [-hV] [-d=] -Disconnect a device (use `eval $(...)` to also clear TRAILBLAZE_DEVICE + -TRAILBLAZE_TARGET) - -d, --device= Device to disconnect. Defaults to $TRAILBLAZE_DEVICE. +Disconnect a device and clear this terminal's pin + -d, --device= Device to disconnect. Defaults to + `$TRAILBLAZE_DEVICE` if set manually, otherwise + this terminal's pin (set by `trailblaze device + connect`). -h, --help Show this help message and exit. -V, --version Print version information and exit. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt index a4a5440a5..ea910a574 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt @@ -7,7 +7,9 @@ # ---------------------------------------------------------------------- Usage: trailblaze device rebind [-hV] [-d=] -t= Change the target app for the currently-bound device - -d, --device= Device to rebind. Defaults to $TRAILBLAZE_DEVICE. + -d, --device= Device to rebind. Defaults to `$TRAILBLAZE_DEVICE` if + set manually, otherwise this terminal's pin (set by + `trailblaze device connect`). -h, --help Show this help message and exit. -t, --target= New target app for the bound device (e.g. `default`, `sampleapp`). diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt index 4944cf3a8..06f33ff97 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt @@ -11,10 +11,9 @@ List and connect devices (Android, iOS, Web) -V, --version Print version information and exit. Commands: list List available devices - connect Connect a device + target to your session (use `eval $(...)` to - pin TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell) + connect Connect a device + target and pin them for this terminal so + subsequent commands inherit the binding rebind Change the target app for the currently-bound device - disconnect Disconnect a device (use `eval $(...)` to also clear - TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET) + disconnect Disconnect a device and clear this terminal's pin create Provision a device with a configured profile (web today; iOS / Android future). diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt index 4eea9f484..06891eef4 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt @@ -18,7 +18,9 @@ Quick setup: Windsurf: Add to MCP config with command 'trailblaze mcp' -d, --device= Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). Defaults to - $TRAILBLAZE_DEVICE. + whatever the launching terminal pinned via + `trailblaze device connect`, or + `$TRAILBLAZE_DEVICE` if set. --direct, --no-daemon Run as an in-process MCP server over STDIO instead of the default proxy mode. Bypasses the Trailblaze diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt index d36c12a25..7c9048325 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt @@ -56,8 +56,13 @@ removed in a future release. --compose-port= RPC port for Compose driver connections (default: 52600) - -d, --device= Device: platform (android, ios, web), - platform/instance-id, or instance ID + -d, --device= Device: platform (android, ios, web) or + platform/id. Defaults to `$TRAILBLAZE_DEVICE` if + set (manual override; rare), otherwise this + terminal's pin (set by `trailblaze device + connect`). In a fresh-shell harness (Claude + Code, Cursor, Codex, CI), pass --device on every + call. --driver= Driver type to use (e.g., PLAYWRIGHT_NATIVE, ANDROID_ONDEVICE_INSTRUMENTATION). Overrides driver from trail config. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt index 5a74608bc..d95fb79bd 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt @@ -8,7 +8,11 @@ Usage: trailblaze session end [-hV] [-d=] [-n=] End the CLI session and release the device (deprecated: use 'stop' instead) -d, --device= Device: platform (android, ios, web) or platform/id. - Defaults to $TRAILBLAZE_DEVICE. + Defaults to `$TRAILBLAZE_DEVICE` if set (manual + override; rare), otherwise this terminal's pin (set + by `trailblaze device connect`). In a fresh-shell + harness (Claude Code, Cursor, Codex, CI), pass + --device on every call. -h, --help Show this help message and exit. -n, --name= Save the recording as a trail before ending -V, --version Print version information and exit. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt index d8d3fa4a1..7c49c3159 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt @@ -10,7 +10,11 @@ Usage: trailblaze session start [-hvV] [--no-logs] [--no-video] [-d=] [--target=] [--title=] Start a new session with automatic video and log capture -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to $TRAILBLAZE_DEVICE. + Defaults to `$TRAILBLAZE_DEVICE` if set (manual + override; rare), otherwise this terminal's pin (set + by `trailblaze device connect`). In a fresh-shell + harness (Claude Code, Cursor, Codex, CI), pass + --device on every call. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser @@ -26,11 +30,12 @@ Start a new session with automatic video and log capture future commands. --no-logs Disable device log capture --no-video Disable video capture - --target=<target> Target app ID for this session's bound device. Scoped - to the device as a daemon-process override (dies on - daemon restart or device release). Defaults to - `$TRAILBLAZE_TARGET` — typically set via `eval - $(trailblaze device connect ... --target X)`. Pass + --target=<target> Target app ID for this session's bound device. + Defaults to `$TRAILBLAZE_TARGET` if set, otherwise + the target you passed to `trailblaze device connect + --target X` for this terminal (persists in this + terminal's pin; cleared by `device disconnect`, + replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override. To set a persistent default, use `trailblaze config target`. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt index 78610d549..6b2db465d 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt @@ -8,7 +8,11 @@ Usage: trailblaze session stop [-hV] [--save] [-d=<device>] [-t=<title>] Stop the current session and finalize captures -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to $TRAILBLAZE_DEVICE. + Defaults to `$TRAILBLAZE_DEVICE` if set (manual + override; rare), otherwise this terminal's pin (set + by `trailblaze device connect`). In a fresh-shell + harness (Claude Code, Cursor, Codex, CI), pass + --device on every call. -h, --help Show this help message and exit. --save Save session as a trail before stopping -t, --title=<title> Trail title when saving (overrides session title) diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt index 25319c3ef..526f61592 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt @@ -12,7 +12,11 @@ Capture the current screen's UI tree (fast, no AI, no actions) filtered as non-interactive --bounds Include bounding box {x,y,w,h} for each element -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to $TRAILBLAZE_DEVICE. + Defaults to `$TRAILBLAZE_DEVICE` if set (manual + override; rare), otherwise this terminal's pin (set + by `trailblaze device connect`). In a fresh-shell + harness (Claude Code, Cursor, Codex, CI), pass + --device on every call. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt index 5c2136d55..f40626086 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt @@ -17,9 +17,12 @@ Requires an LLM provider configured (`trailblaze config llm`). visible') --context=<context> Context from previous steps for situational awareness - -d, --device=<device> Device: platform (android, ios, web) or platform/id - (e.g., android/emulator-5554). Required for - interactive step/verify execution. + -d, --device=<device> Device: platform (android, ios, web) or + platform/id. Defaults to `$TRAILBLAZE_DEVICE` if + set (manual override; rare), otherwise this + terminal's pin (set by `trailblaze device + connect`). In a fresh-shell harness (Claude Code, + Cursor, Codex, CI), pass --device on every call. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on @@ -47,11 +50,12 @@ Requires an LLM provider configured (`trailblaze config llm`). the captured tree includes what's actually behind the overlay. --target=<target> Target app ID for this command's bound device. - Scoped to the device as a daemon-process override - (dies on daemon restart or device release). - Defaults to `$TRAILBLAZE_TARGET` — typically set - via `eval $(trailblaze device connect ... - --target X)`. Pass `--target=clear` to remove a + Defaults to `$TRAILBLAZE_TARGET` if set, + otherwise the target you passed to `trailblaze + device connect --target X` for this terminal + (persists in this terminal's pin; cleared by + `device disconnect`, replaced by `device rebind + --target Y`). Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt index 055017754..4ac3bbc55 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt @@ -13,7 +13,11 @@ Run a Trailblaze tool by name (e.g., tap, inputText) [<argPairs>...] Tool arguments as key=value pairs (e.g., ref="Sign In") -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to $TRAILBLAZE_DEVICE. + Defaults to `$TRAILBLAZE_DEVICE` if set (manual + override; rare), otherwise this terminal's pin (set + by `trailblaze device connect`). In a fresh-shell + harness (Claude Code, Cursor, Codex, CI), pass + --device on every call. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser @@ -35,11 +39,12 @@ Run a Trailblaze tool by name (e.g., tap, inputText) require-steps true` is set. (`--objective` / `-o` are deprecated aliases of `--step` / `-s`.) - --target=<target> Target app ID for this command's bound device. Scoped - to the device as a daemon-process override (dies on - daemon restart or device release). Defaults to - `$TRAILBLAZE_TARGET` — typically set via `eval - $(trailblaze device connect ... --target X)`. Pass + --target=<target> Target app ID for this command's bound device. + Defaults to `$TRAILBLAZE_TARGET` if set, otherwise + the target you passed to `trailblaze device connect + --target X` for this terminal (persists in this + terminal's pin; cleared by `device disconnect`, + replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt index 70e600e78..30d81c5e8 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt @@ -19,7 +19,12 @@ Browse available tools by target app and platform Omit to show everything; trailheads and shortcuts will be called out as headline sections above the toolset listing. - -d, --device=<device> Target device (e.g. android, android/emulator-5554). + -d, --device=<device> Device: platform (android, ios, web) or platform/id. + Defaults to `$TRAILBLAZE_DEVICE` if set (manual + override; rare), otherwise this terminal's pin (set + by `trailblaze device connect`). In a fresh-shell + harness (Claude Code, Cursor, Codex, CI), pass + --device on every call. --detail Show full parameter descriptions for all tools -h, --help Show this help message and exit. -n, --name=<name> Show details for a single tool by name diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt index d939b1ad7..3ec707742 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt @@ -11,7 +11,11 @@ Check a condition on screen and pass/fail (exit code 0/1, ideal for CI) <assertionWords>... Assertion to verify (e.g., 'The Sign In button is visible') -d, --device=<device> Device: platform (android, ios, web) or - platform/id. Defaults to $TRAILBLAZE_DEVICE. + platform/id. Defaults to `$TRAILBLAZE_DEVICE` if + set (manual override; rare), otherwise this + terminal's pin (set by `trailblaze device + connect`). In a fresh-shell harness (Claude Code, + Cursor, Codex, CI), pass --device on every call. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on From 3db1b5f5f14f3edae71dec18aad89a6bce5fea27 Mon Sep 17 00:00:00 2001 From: Sam Edwards <samedwards@squareup.com> Date: Sun, 31 May 2026 14:53:14 -0400 Subject: [PATCH 5/7] Get playwright artifacts after weird deadlock issue --- .github/workflows/github-pages.yml | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 8d5b38320..37f64d0e6 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -37,12 +37,22 @@ jobs: - name: Fetch latest report-gallery assets # Pull the report assets (storyboard.webp / timeline.webp / report.html) from the - # most recent SUCCESSFUL trail run on main and overwrite the committed placeholders - # in the build workspace. Because this workflow and the trail workflows both run on - # the same push, we intentionally use the previous green run — a one-commit lag. + # most recent trail run on main and overwrite the committed placeholders in the + # build workspace. Because this workflow and the trail workflows both run on the + # same push, we intentionally use the previous run — a one-commit lag. # - # Best-effort: any miss (no successful run yet, expired artifact, fork without the - # token) leaves the committed placeholders in place so `mkdocs build --strict` still + # We deliberately do NOT filter on `--status success`. The trail workflows + # (`wikipedia-trails.yml` etc.) gate their own success/failure on a terminal + # "Fail if trails failed" step that fires AFTER artifact upload, so a job marked + # `failure` can still carry usable assets. Falling back to the previous green run + # would let a single transient trail-side error stale-pin the docs gallery for + # days; instead we trust the artifact presence and let `gh run download` below + # decide. If the latest run truly produced nothing (genuine breakage upstream of + # the export), `gh run download` silently no-ops and the committed placeholders + # survive — same graceful fallback as a missing artifact. + # + # Best-effort: any miss (no run yet, expired artifact, fork without the token) + # leaves the committed placeholders in place so `mkdocs build --strict` still # succeeds. Never fail the deploy over a missing showcase asset. continue-on-error: true env: @@ -52,7 +62,7 @@ jobs: fetch_assets() { local workflow="$1" dest="$2" local run_id - run_id="$(gh run list --workflow="$workflow" --branch main --status success \ + run_id="$(gh run list --workflow="$workflow" --branch main \ --limit 1 --json databaseId --jq '.[0].databaseId')" if [ -z "$run_id" ] || [ "$run_id" = "null" ]; then echo " no successful $workflow run found — keeping committed placeholders" From 1989c17bdd3a3837ef5831c6a31f17ff65ed67bf Mon Sep 17 00:00:00 2001 From: Sam Edwards <samedwards@squareup.com> Date: Sun, 31 May 2026 20:24:19 -0400 Subject: [PATCH 6/7] Updates --- README.md | 9 +- docs/CLI.md | 38 +- docs/getting_started.md | 73 +--- docs/index.md | 8 +- docs/mcp/index.md | 2 +- scripts/trailblaze | 47 -- .../capture/video/PlaywrightVideoRecordDir.kt | 14 +- .../video/PlaywrightVideoRecordDirTest.kt | 34 ++ .../xyz/block/trailblaze/cli/AskCommand.kt | 2 +- .../block/trailblaze/cli/CliCallerContext.kt | 22 +- .../block/trailblaze/cli/CliInfrastructure.kt | 345 +-------------- .../xyz/block/trailblaze/cli/DaemonClient.kt | 2 +- .../xyz/block/trailblaze/cli/DeviceCommand.kt | 227 ++++------ .../xyz/block/trailblaze/cli/McpCommand.kt | 3 +- .../block/trailblaze/cli/SessionCommand.kt | 11 +- .../trailblaze/cli/ShellDevicePinStore.kt | 346 --------------- .../block/trailblaze/cli/SnapshotCommand.kt | 2 +- .../xyz/block/trailblaze/cli/StepCommand.kt | 2 +- .../xyz/block/trailblaze/cli/ToolCommand.kt | 2 +- .../block/trailblaze/cli/ToolboxCommand.kt | 2 +- .../xyz/block/trailblaze/cli/TrailCommand.kt | 24 +- .../xyz/block/trailblaze/cli/VerifyCommand.kt | 2 +- .../trailblaze/cli/ShellDevicePinStoreTest.kt | 406 ------------------ .../help-trailblaze-ask.txt | 6 +- .../help-trailblaze-device-connect.txt | 13 +- .../help-trailblaze-device-disconnect.txt | 8 +- .../help-trailblaze-device-rebind.txt | 4 +- .../help-trailblaze-device.txt | 7 +- .../help-trailblaze-mcp.txt | 4 +- .../help-trailblaze-run.txt | 9 +- .../help-trailblaze-session-end.txt | 6 +- .../help-trailblaze-session-start.txt | 17 +- .../help-trailblaze-session-stop.txt | 6 +- .../help-trailblaze-snapshot.txt | 6 +- .../help-trailblaze-step.txt | 20 +- .../help-trailblaze-tool.txt | 17 +- .../help-trailblaze-toolbox.txt | 7 +- .../help-trailblaze-verify.txt | 6 +- 38 files changed, 252 insertions(+), 1507 deletions(-) delete mode 100644 trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt delete mode 100644 trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt diff --git a/README.md b/README.md index 61b44ca25..29b5f5383 100644 --- a/README.md +++ b/README.md @@ -129,9 +129,8 @@ curl -fsSL https://raw.githubusercontent.com/block/trailblaze/main/install.sh | # List connected devices (Android emulator, iOS simulator, or web browser) trailblaze device list -# Pin this terminal to a device + target so subsequent calls inherit both. -# Trailblaze remembers per-terminal — other terminals stay independent. -trailblaze device connect android --target default +# Pin this shell to a device + target so subsequent calls inherit both from the env +eval $(trailblaze device connect android --target default) # Read the screen — returns a view hierarchy with refs (e.g. ab42) the agent can target trailblaze snapshot @@ -140,8 +139,8 @@ trailblaze snapshot # platform-specific selector strategy. Every action takes a --step for self-heal. trailblaze tool tap ref=ab42 -s "Tap sign in" -# Done — release the device and clear this terminal's pin -trailblaze device disconnect +# Done — release the device + clear TRAILBLAZE_DEVICE from this shell +eval $(trailblaze device disconnect) ``` Paste those into Claude Code, Codex, Cursor, Goose, or anything that can run bash and diff --git a/docs/CLI.md b/docs/CLI.md index 2c70cd4f4..acd475390 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -110,10 +110,10 @@ trailblaze step [OPTIONS] [<<stepWords>>] | Option | Description | Default | |--------|-------------|---------| | `--verify` | Verify an assertion instead of taking an action (exit code 1 if assertion fails) | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id (e.g., android/emulator-5554). Required for interactive step/verify execution. | - | | `--context` | Context from previous steps for situational awareness | - | | `-v`, `--verbose` | Enable verbose output (show daemon logs, MCP calls) | - | -| `--target` | Target app ID for this command's bound device. Defaults to `$TRAILBLAZE_TARGET` if set, otherwise the target you passed to `trailblaze device connect --target X` for this terminal (persists in this terminal's pin; cleared by `device disconnect`, replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | +| `--target` | Target app ID for this command's bound device. Scoped to the device as a daemon-process override (dies on daemon restart or device release). Defaults to `$TRAILBLAZE_TARGET` — typically set via `eval $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | | `--no-screenshots`, `--text-only` | Skip screenshots — the LLM only sees the textual view hierarchy, no vision tokens, and disk logging of screenshots is skipped too. Faster and cheaper for short objectives where the visual layout doesn't matter; some tasks need vision and will degrade without it. | - | | `--snapshot-details` | Comma-separated snapshot detail levels passed through to the daemon's step tool: BOUNDS, OFFSCREEN, OCCLUDED, ALL_ELEMENTS. Useful for waypoint capture: ALL_ELEMENTS bypasses the on-device accessibility-importance filter so RecyclerView children land in the captured trailblazeNodeTree. OCCLUDED is web-only and surfaces elements hidden under popups/modals so the captured tree includes what's actually behind the overlay. | - | | `--save` | Save current session as a trail file. Shows steps if --setup not specified. | - | @@ -145,7 +145,7 @@ trailblaze ask [OPTIONS] <<questionWords>> | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | | `-v`, `--verbose` | Enable verbose output (show daemon logs, MCP calls) | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -173,7 +173,7 @@ trailblaze verify [OPTIONS] <<assertionWords>> | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | | `-v`, `--verbose` | Enable verbose output | - | | `--no-screenshots`, `--text-only` | Skip screenshots — the LLM only sees the textual view hierarchy, no vision tokens, and disk logging of screenshots is skipped too. Faster and cheaper for short objectives where the visual layout doesn't matter; some tasks need vision and will degrade without it. | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | @@ -196,7 +196,7 @@ trailblaze snapshot [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | | `-v`, `--verbose` | Enable verbose output | - | | `--bounds` | Include bounding box {x,y,w,h} for each element | - | | `--offscreen` | Include offscreen elements marked (offscreen) | - | @@ -231,10 +231,10 @@ trailblaze tool [OPTIONS] [<<toolName>>] [<<argPairs>>] |--------|-------------|---------| | `-s`, `--step`, `--objective`, `-o` | Natural language step — describe what, not how. If the UI changes, Trailblaze uses this to retry the step with AI. 'Navigate to Settings' survives a redesign; 'tap button at 200,400' does not. Optional by default; required when `trailblaze config require-steps true` is set. (`--objective` / `-o` are deprecated aliases of `--step` / `-s`.) | - | | `--yaml` | Raw YAML tool sequence (multiple tools in one call) | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | | `-v`, `--verbose` | Enable verbose output | - | | `--no-screenshots`, `--text-only` | Skip screenshots — the LLM only sees the textual view hierarchy, no vision tokens, and disk logging of screenshots is skipped too. Faster and cheaper for short objectives where the visual layout doesn't matter; some tasks need vision and will degrade without it. | - | -| `--target` | Target app ID for this command's bound device. Defaults to `$TRAILBLAZE_TARGET` if set, otherwise the target you passed to `trailblaze device connect --target X` for this terminal (persists in this terminal's pin; cleared by `device disconnect`, replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | +| `--target` | Target app ID for this command's bound device. Scoped to the device as a daemon-process override (dies on daemon restart or device release). Defaults to `$TRAILBLAZE_TARGET` — typically set via `eval $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze toolbox` (no args). | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -264,7 +264,7 @@ trailblaze toolbox [OPTIONS] [<ROLE>] | `--name`, `-n` | Show details for a single tool by name | - | | `--target`, `-t` | Target app to show tools for. Optional — defaults to $TRAILBLAZE_TARGET (per-shell pin), then the workspace `trailblaze config target`, falling back to the built-in 'default'. | - | | `--search`, `-s` | Substring search on tool name and description. | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Target device (e.g. android, android/emulator-5554). | - | | `--detail` | Show full parameter descriptions for all tools | - | | `-v`, `--verbose` | Enable verbose output | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -293,7 +293,7 @@ trailblaze run [OPTIONS] [<<trailFile>>] | Option | Description | Default | |--------|-------------|---------| | `--tags` | Only run trails whose `config.tags:` list contains at least one of the given names. Repeatable (`--tags smoke --tags login`) or comma-separated (`--tags smoke,login`). Match is OR across tags. Untagged trails are excluded when --tags is specified. | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web), platform/instance-id, or instance ID | - | | `-a`, `--agent` | Agent: TRAILBLAZE_RUNNER, MULTI_AGENT_V3. Default: TRAILBLAZE_RUNNER | - | | `--use-recorded-steps` | Three-way switch for replay vs. AI-driven execution: --use-recorded-steps Force replay mode (use the trail's `recording:` tools verbatim). --no-use-recorded-steps Force AI mode (ignore any recordings; LLM drives each step from `step:` NL). (unset, default) Auto-detect: AI mode if no `recording:` blocks present, replay if they are. Use --no-use-recorded-steps to re-run a trail with stale selectors and let the agent re-pick selectors from current page state. | - | | `--self-heal` | When a recorded step fails, let AI take over and continue. Overrides the persisted 'trailblaze config self-heal' setting for this run. Omit to inherit the saved setting (opt-in, off by default). | - | @@ -364,9 +364,9 @@ trailblaze session start [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `--target` | Target app ID for this session's bound device. Defaults to `$TRAILBLAZE_TARGET` if set, otherwise the target you passed to `trailblaze device connect --target X` for this terminal (persists in this terminal's pin; cleared by `device disconnect`, replaced by `device rebind --target Y`). Pass `--target=clear` to remove a previously-set override. To set a persistent default, use `trailblaze config target`. | - | +| `--target` | Target app ID for this session's bound device. Scoped to the device as a daemon-process override (dies on daemon restart or device release). Defaults to `$TRAILBLAZE_TARGET` — typically set via `eval $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override. To set a persistent default, use `trailblaze config target`. | - | | `--mode` | Working mode: trail or blaze. Saved to config for future commands. | - | -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | | `--title` | Title for the session (used as trail name when saving) | - | | `--no-video` | Disable video capture | - | | `--no-logs` | Disable device log capture | - | @@ -391,7 +391,7 @@ trailblaze session stop [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | | `--save` | Save session as a trail before stopping | - | | `--title`, `-t` | Trail title when saving (overrides session title) | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -559,7 +559,7 @@ trailblaze session end [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to `$TRAILBLAZE_DEVICE` if set (manual override; rare), otherwise this terminal's pin (set by `trailblaze device connect`). In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass --device on every call. | - | +| `-d`, `--device` | Device: platform (android, ios, web) or platform/id. Defaults to $TRAILBLAZE_DEVICE. | - | | `--name`, `-n` | Save the recording as a trail before ending | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -1250,7 +1250,7 @@ trailblaze device list [OPTIONS] ### `trailblaze device connect` -Connect a device + target and pin them for this terminal so subsequent commands inherit the binding +Connect a device + target to your session (use `eval $(...)` to pin TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell) **Synopsis:** @@ -1268,7 +1268,7 @@ trailblaze device connect [OPTIONS] <<platform>> | Option | Description | Default | |--------|-------------|---------| -| `--target`, `-t` | Target app to bind to this device's session (e.g. `default`, `sampleapp`). Optional. When set, the target is recorded alongside the device in this terminal's pin so subsequent CLI calls re-apply the binding automatically until you `device disconnect` or pin a different target. | - | +| `--target`, `-t` | Target app to bind to this device's session (e.g. `default`, `sampleapp`). Optional. When set, `eval $(trailblaze device connect ... --target X)` also exports $TRAILBLAZE_TARGET so subsequent CLI calls in this shell re-apply the binding automatically. | - | | `--mcp-session` | Explicit MCP session id to pin to this device (advanced). Default: pin the most-recently-active unbound MCP client (Claude Desktop, Cursor, Goose, …). No-op when no MCP clients are connected. | - | | `--headless` | For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on machines with no display (remote workstations, CI), headed otherwise. Falls back to the persisted `web-headless` config when a display is present (see `trailblaze config web-headless`). Pass --headless=false to force a visible browser, --headless=true to force headless. Ignored for non-web devices. | - | | `-h`, `--help` | Show this help message and exit. | - | @@ -1290,7 +1290,7 @@ trailblaze device rebind [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device to rebind. Defaults to `$TRAILBLAZE_DEVICE` if set manually, otherwise this terminal's pin (set by `trailblaze device connect`). | - | +| `-d`, `--device` | Device to rebind. Defaults to $TRAILBLAZE_DEVICE. | - | | `--target`, `-t` | New target app for the bound device (e.g. `default`, `sampleapp`). | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -1299,7 +1299,7 @@ trailblaze device rebind [OPTIONS] ### `trailblaze device disconnect` -Disconnect a device and clear this terminal's pin +Disconnect a device (use `eval $(...)` to also clear TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET) **Synopsis:** @@ -1311,7 +1311,7 @@ trailblaze device disconnect [OPTIONS] | Option | Description | Default | |--------|-------------|---------| -| `-d`, `--device` | Device to disconnect. Defaults to `$TRAILBLAZE_DEVICE` if set manually, otherwise this terminal's pin (set by `trailblaze device connect`). | - | +| `-d`, `--device` | Device to disconnect. Defaults to $TRAILBLAZE_DEVICE. | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | @@ -1419,7 +1419,7 @@ trailblaze mcp [OPTIONS] | `--http` | Use Streamable HTTP transport instead of STDIO. Starts a standalone HTTP MCP server. | - | | `--direct`, `--no-daemon` | Run as an in-process MCP server over STDIO instead of the default proxy mode. Bypasses the Trailblaze daemon and runs everything in a single process. Use this for environments where the HTTP daemon cannot run. | - | | `--tool-profile` | Tool profile: FULL or MINIMAL (only device/blaze/verify/ask/trail). Defaults to MINIMAL for STDIO, FULL for HTTP. | - | -| `-d`, `--device` | Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). Defaults to whatever the launching terminal pinned via `trailblaze device connect`, or `$TRAILBLAZE_DEVICE` if set. | - | +| `-d`, `--device` | Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). Defaults to $TRAILBLAZE_DEVICE. | - | | `-t`, `--target` | Pin this MCP session to a target app on startup (e.g. default, sampleapp). Only meaningful with --device or $TRAILBLAZE_DEVICE. Defaults to $TRAILBLAZE_TARGET. | - | | `-h`, `--help` | Show this help message and exit. | - | | `-V`, `--version` | Print version information and exit. | - | diff --git a/docs/getting_started.md b/docs/getting_started.md index 811b2718c..1f5505143 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -66,75 +66,32 @@ cd trailblaze ## Connect a Device -List what's connected, then pin this terminal to one of them: +List what's connected, then pin this shell to one of them: ```bash trailblaze device list -# Pin: remembers this terminal's device + target so every follow-up call -# inherits them without repeating the flags. Other terminals stay independent. -trailblaze device connect android --target default +# Pin: exports TRAILBLAZE_DEVICE into the current shell so every follow-up call +# inherits the device + target without repeating the flags. +eval $(trailblaze device connect android --target default) ``` -The short form `android` works when only one Android device is connected; with -two or more, use the fully-qualified `android/<id>` form shown by `device list` -(same for `ios/<udid>`). `web` is always unambiguous. - You'll see Android emulators (`android/emulator-5554`), iOS simulators (`ios/<simulator-id>`), and any web targets. After the pin, device-acting CLI calls that take a `-d/--device` flag (`snapshot`, `tool`, `blaze`, `ask`, `verify`, -`session start`, `session stop`, `run`) inherit the pinned device automatically — no +`session start`, `session stop`, `run`) read `TRAILBLAZE_DEVICE` from the env — no `-d <device>` flag needed. `session save` is implicit (saves the current session) and doesn't take `-d`. For CI / scripts that prefer determinism, pass `-d <platform>` (or `-d <platform>/<id>`) on each call as an override; explicit flags win over the -pin. `mcp` accepts `--device` / `--target` at startup to pre-bind the MCP session +env. `mcp` accepts `--device` / `--target` at startup to pre-bind the MCP session (so the agent's first tool call already has a device); workspace and setup commands -(`config`, `app`, `device list`) don't take `-d`. `run` inherits the pin just like -the action commands, but each replay spawns a fresh session rather than reattaching -to the pinned interactive one. - -How the pin works under the hood: `trailblaze device connect` records this terminal's -shell PID alongside the bound device in `~/.trailblaze/shell-device-pins-<port>.json`. -Subsequent CLI calls from the same terminal look up that entry and use it as the -default. The pin survives daemon restarts. Open a second terminal and it gets its -own slot — pinning device A in one terminal doesn't leak into another. For scripts -and CI where each call is a fresh shell, pass `--device <id>` on every command -instead — the pin file is per-shell-PID and won't carry. (`TRAILBLAZE_DEVICE` is -also honored as a manual override, but `--device` is the recommended form.) - -If your pinned device goes away (emulator killed, simulator shut down, USB cable -unplugged), the next CLI call notices and clears the pin: - -``` -Pinned device android/emulator-5554 is no longer connected; pin cleared. -Reconnect it and re-run `trailblaze device connect android/emulator-5554`, -or pick a different one from `trailblaze device list`. -``` - -The call then falls through to autodetect — if exactly one device is connected, -it'll be used silently; if zero or multiple, you get the appropriate error. -Eviction is deliberate: it nudges you through an explicit choice rather than -silently retrying a stale binding. Autodetect (the single-device convenience) -doesn't write a pin either: it just uses the one connected device for that one -call. Pinning is always an explicit `device connect` action. - -### Precedence between TRAILBLAZE_DEVICE and the file-pin - -Resolution order, highest priority first: - -1. Explicit `--device <id>` flag on the command. -2. `TRAILBLAZE_DEVICE` environment variable (manual override; mostly relevant - for CI scripts that explicitly export it). -3. This terminal's file-pin (written by `trailblaze device connect`). -4. Autodetect when exactly one device is connected. - -So `export TRAILBLAZE_DEVICE=ios/<udid>` in your shell shadows the file-pin — -useful if you want a per-shell override without disturbing the pinned device for -the rest of your work. Unset the env var to fall back to the pin. +(`config`, `app`, `device list`) don't take `-d`. `run` reads `TRAILBLAZE_DEVICE` +just like the action commands, but each replay spawns a fresh session rather than +reattaching to the pinned interactive one. To swap target without disconnecting, use `trailblaze device rebind --target <new>`. To -release, `trailblaze device disconnect` — clears this terminal's pin so the next -session starts clean. +release, `eval $(trailblaze device disconnect)` — the leading `eval $(...)` also unsets +`TRAILBLAZE_DEVICE` in the parent shell so the next session starts clean. ## Drive the Device @@ -174,16 +131,16 @@ this into the agent's session: ``` You have access to the `trailblaze` CLI. Use it to drive the connected device. First -pin this terminal to a device + target so subsequent calls don't have to repeat the flags: - - `trailblaze device connect <platform> --target <app>` — pin once at start +pin the shell to a device + target so subsequent calls don't have to repeat the flags: + - `eval $(trailblaze device connect <platform> --target <app>)` — pin once at start - `trailblaze session start --title "<short_name>"` — start a tracked session (captures video/logs, groups the steps for later save) - `trailblaze snapshot` — see what's on screen (UI tree with refs) - `trailblaze tool <name> <args> -s "<why>"` — take an action - - `trailblaze toolbox` — list available tools (uses the pinned device automatically) + - `trailblaze toolbox -d <platform>` — list available tools (toolbox still wants -d) - When done, `trailblaze session save` to write the recording out as a `.trail.yaml`, then `trailblaze session stop` to end the session. Optionally - `trailblaze device disconnect` to release the device. + `eval $(trailblaze device disconnect)` to release the device. ``` If your agent can run a shell command, it can drive a device. No SDK to install, no diff --git a/docs/index.md b/docs/index.md index fc3d30f61..6d0ade66b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,15 +31,11 @@ this repo — no mockup. Click through for the full interactive report, or brows ## Quickstart -Install Trailblaze first ([Getting Started](getting_started.md) walks through it), -then: - ```bash trailblaze device list -# Pin this terminal to a device — subsequent calls inherit it. -# Trailblaze remembers per-terminal, so other terminals stay independent. -trailblaze device connect android +# Pin this shell to a device + target so subsequent calls inherit both from the env +eval $(trailblaze device connect android --target default) # Read the screen — returns a UI tree with refs (e.g. ab42) your agent can target trailblaze snapshot diff --git a/docs/mcp/index.md b/docs/mcp/index.md index 99b541b8e..30ac9313c 100644 --- a/docs/mcp/index.md +++ b/docs/mcp/index.md @@ -227,7 +227,7 @@ When you want the MCP session to land on a specific device + target without the } ``` -Alternatively, drop the flags and inherit the device pin from the terminal that launches the MCP server (helpful when you've already run `trailblaze device connect …` in that terminal). Explicit `--device` / `--target` win over the pin. `TRAILBLAZE_DEVICE` is also honored as a manual override — useful for CI agents that set the env var explicitly. +Alternatively, drop the flags and inherit `TRAILBLAZE_DEVICE` from the shell that launches the MCP server (helpful when a CLI session pinned via `eval $(trailblaze device connect …)` is already in scope). Explicit `--device` / `--target` win over the env var. ### Connecting from Cursor diff --git a/scripts/trailblaze b/scripts/trailblaze index 8e39b08e0..ac7be50e9 100755 --- a/scripts/trailblaze +++ b/scripts/trailblaze @@ -27,47 +27,6 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -# Capture the parent shell PID so the CLI can resolve "what device is pinned -# for this terminal?" from a file in ~/.trailblaze instead of requiring the -# user to wrap `trailblaze device connect` in `eval $(...)` to set -# TRAILBLAZE_DEVICE in their shell. `$PPID` is the wrapper's parent — for -# every interactive invocation that's the shell the user typed into; for -# tmux/screen panes it's the per-pane shell; for CI scripts it's whatever -# spawned this wrapper. Respect any pre-set value so nested invocations -# (one Trailblaze command spawning another via a script) inherit the -# outermost shell's identity rather than overwriting it. -# -# Consumed by `CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")` and the -# resolver tier in `CliInfrastructure.resolveDeviceWithAutodetect`. The -# associated file is `~/.trailblaze/shell-device-pins-<port>.json` written -# by `ShellDevicePinStore`. -export TRAILBLAZE_SHELL_PID="${TRAILBLAZE_SHELL_PID:-$PPID}" - -# Detect whether this invocation comes from an interactive terminal. `[ -t 0 ]` -# checks if stdin is a tty — true for a human typing commands, false for: -# - AI agent harnesses (Claude Code Bash tool, Cursor shell, Codex) — each -# command spawns a fresh shell that doesn't inherit a tty -# - CI scripts and pipelines (stdin redirected from /dev/null or a file) -# - Anything with stdin piped from another command -# -# Consumed by the JVM-side `device connect` to decide whether to warn the -# caller that the file-pin won't carry across separate command invocations -# (which it can't if each call is a fresh shell with a different PID). When -# true, no warning — the human is in a real terminal where the pin works. -# When false, the warning fires and steers the caller toward `--device` flags. -# -# Default of `0` (assume non-interactive) is the safer fallback: a missed -# warning to a real human is mild noise; a missed warning to an agent is a -# loop. Respects any pre-set value so a future tool that wants to override -# the detection can. -if [ -z "${TRAILBLAZE_INTERACTIVE:-}" ]; then - if [ -t 0 ]; then - export TRAILBLAZE_INTERACTIVE=1 - else - export TRAILBLAZE_INTERACTIVE=0 - fi -fi - # --------------------------------------------------------------------------- # JDK version check # --------------------------------------------------------------------------- @@ -333,12 +292,6 @@ ipc_try_forward() { if [ -n "${TRAILBLAZE_TARGET:-}" ]; then env_json=$(jq --arg v "$TRAILBLAZE_TARGET" '. + {TRAILBLAZE_TARGET: $v}' <<<"$env_json") || return 1 fi - if [ -n "${TRAILBLAZE_SHELL_PID:-}" ]; then - env_json=$(jq --arg v "$TRAILBLAZE_SHELL_PID" '. + {TRAILBLAZE_SHELL_PID: $v}' <<<"$env_json") || return 1 - fi - if [ -n "${TRAILBLAZE_INTERACTIVE:-}" ]; then - env_json=$(jq --arg v "$TRAILBLAZE_INTERACTIVE" '. + {TRAILBLAZE_INTERACTIVE: $v}' <<<"$env_json") || return 1 - fi # Send the user's interactive cwd alongside argv so commands that walk relative # paths (e.g. `waypoint --target` resolving the workspace anchor) anchor at the # user's shell directory rather than the daemon's launch directory. Older daemons diff --git a/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt b/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt index 92593948d..8db2ae2e3 100644 --- a/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt +++ b/trailblaze-capture/src/main/java/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDir.kt @@ -83,6 +83,16 @@ object PlaywrightVideoRecordDir { * `future.cancel(true)` interrupts it best-effort. */ fun runFinalizer(deviceId: String) { + runFinalizer(deviceId, FINALIZER_TIMEOUT_MS) + } + + /** + * Timeout-injectable variant of [runFinalizer]. Visible for testing so the bounded-return + * guarantee (a wedged finalizer must not hang the caller) can be exercised without waiting + * the full production [FINALIZER_TIMEOUT_MS]. Production callers use the no-argument overload + * above; [timeoutMs] is only varied from tests. + */ + internal fun runFinalizer(deviceId: String, timeoutMs: Long) { val finalizer = entries[deviceId]?.finalizer ?: return val executor = Executors.newSingleThreadExecutor { r -> Thread(r, "playwright-video-finalizer-$deviceId").apply { isDaemon = true } @@ -95,11 +105,11 @@ object PlaywrightVideoRecordDir { } } try { - future.get(FINALIZER_TIMEOUT_MS, TimeUnit.MILLISECONDS) + future.get(timeoutMs, TimeUnit.MILLISECONDS) } catch (_: TimeoutException) { Console.log( "[PlaywrightVideoRecordDir] finalizer for deviceId=$deviceId timed out after " + - "${FINALIZER_TIMEOUT_MS}ms — falling back to on-disk artifact", + "${timeoutMs}ms — falling back to on-disk artifact", ) future.cancel(true) } catch (_: Throwable) { diff --git a/trailblaze-capture/src/test/kotlin/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDirTest.kt b/trailblaze-capture/src/test/kotlin/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDirTest.kt index 4cf3298e4..a1eb10558 100644 --- a/trailblaze-capture/src/test/kotlin/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDirTest.kt +++ b/trailblaze-capture/src/test/kotlin/xyz/block/trailblaze/capture/video/PlaywrightVideoRecordDirTest.kt @@ -2,11 +2,15 @@ package xyz.block.trailblaze.capture.video import java.io.File import java.nio.file.Files +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger +import kotlin.system.measureTimeMillis import kotlin.test.AfterTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNull +import kotlin.test.assertTrue class PlaywrightVideoRecordDirTest { @@ -97,4 +101,34 @@ class PlaywrightVideoRecordDirTest { PlaywrightVideoRecordDir.runFinalizer(device1) assertEquals(0, calls.get()) } + + @Test + fun `runFinalizer returns within the timeout bound when the callback wedges`() { + // Regression guard for the deadlock fix: a finalizer whose BrowserContext.close() never + // returns (the Playwright thread-affinity deadlock) must NOT hang the caller. runFinalizer + // bounds the wait and abandons the wedged daemon thread instead of blocking indefinitely. + val started = CountDownLatch(1) + val release = CountDownLatch(1) + PlaywrightVideoRecordDir.setRecordDir(device1, tmp()) + PlaywrightVideoRecordDir.setFinalizer(device1) { + started.countDown() + // Block far longer than the (test-shortened) timeout. Without the bound, runFinalizer + // would sit here for the full 30s; with it, the await is interrupted by cancel(true). + release.await(30, TimeUnit.SECONDS) + } + + val elapsedMs = measureTimeMillis { + PlaywrightVideoRecordDir.runFinalizer(device1, timeoutMs = 100L) + } + + assertTrue( + started.await(5, TimeUnit.SECONDS), + "finalizer callback should have started", + ) + assertTrue( + elapsedMs < 5_000, + "runFinalizer should return shortly after the 100ms bound, but took ${elapsedMs}ms", + ) + release.countDown() // belt-and-suspenders: let the daemon thread unwind if not interrupted + } } diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt index d011b4193..68bb56010 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/AskCommand.kt @@ -36,7 +36,7 @@ class AskCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION] + description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."] ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt index 150a5aa34..25073b608 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliCallerContext.kt @@ -55,26 +55,10 @@ internal object CliCallerContext { * sync with the `env_json` allowlist in `scripts/trailblaze`): * * - `TRAILBLAZE_DEVICE` — consumed by `resolveCliDevice` in - * `CliInfrastructure.kt`. Manual override / CI usage; the file-pin - * written by `device connect` is the primary mechanism now. + * `CliInfrastructure.kt`. Set via `eval $(trailblaze device connect <id>)`. * - `TRAILBLAZE_TARGET` — consumed by `envTrailblazeTarget` in - * `CliInfrastructure.kt`. Manual override; pair with [TRAILBLAZE_DEVICE] - * for shell-scoped target pinning when the file-pin doesn't suffice. - * - `TRAILBLAZE_SHELL_PID` — the user's interactive shell PID (captured - * by the bash wrapper as `$PPID`). Consumed by [ShellDevicePinStore] - * via `resolveDeviceWithAutodetect` in `CliInfrastructure.kt` to look - * up the device pinned for this terminal in - * `~/.trailblaze/shell-device-pins-<port>.json`. Without this var the - * file-pin tier is skipped silently — older wrappers that don't set - * it degrade to the env-var-or-autodetect behavior they always had. - * - `TRAILBLAZE_INTERACTIVE` — `"1"` when the wrapper detected a tty on - * stdin (human-in-a-terminal), `"0"` otherwise (AI agent harness, CI, - * piped invocation, anything not a tty). Read by `device connect` to - * decide whether to print a warning that the file-pin won't carry - * across separate command invocations — irrelevant for humans (one - * shell, one PID, pin works), critical for agents (each Bash-tool - * call is a fresh shell with a different PID, pin invisible to - * follow-ups). See [isInteractiveCaller] in `CliInfrastructure.kt`. + * `CliInfrastructure.kt`. Set via `eval $(trailblaze device connect <id> + * --target <name>)`. * * Adding a new key requires three coordinated edits: this kdoc, the bash * shim's allowlist, and a `resolveCli*`/`env*` consumer in diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt index 06b047c77..db0c16052 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/CliInfrastructure.kt @@ -121,53 +121,14 @@ internal fun discoverTargetSummaries(): List<Pair<String, String>> { * different "list available targets" closer) so it keeps its own const — * see [TARGET_OPTION_DESCRIPTION_SESSION]. */ -/** - * Single source of truth for the `-d` / `--device` option description on every - * device-acting command (`snapshot`, `tool`, `ask`, `verify`, `session start/stop/end`, - * `step`, `toolbox`). - * - * Per-command variants live alongside their command class (e.g. [McpCommand]'s - * `--device` is about pre-binding the MCP session at startup; [TrailCommand] - * `--device` is the dispatched-replay form). Use this constant on action - * commands where the semantics are "act on this device, defaulting to the - * terminal's pin." - * - * The wording deliberately puts the per-terminal file-pin first (the primary - * mechanism now), names `TRAILBLAZE_DEVICE` as a manual escape hatch, and - * spells out the agent-harness advice on the same line so an agent running - * `trailblaze tool --help` doesn't have to read three doc pages to discover - * "use `--device` on every call." The phrase "fresh-shell harness" is the - * lexicon the SKILL.md and the multi-device error envelope already use. - * - * Single line because picocli wraps for help rendering and the docs generator - * joins continuation lines with a space; embedded line breaks would land in - * the generated `docs/CLI.md` as literal newlines mid-cell. - */ -internal const val DEVICE_OPTION_DESCRIPTION: String = - "Device: platform (android, ios, web) or platform/id. " + - "Defaults to `\$TRAILBLAZE_DEVICE` if set (manual override; rare), " + - "otherwise this terminal's pin (set by `trailblaze device connect`). " + - "In a fresh-shell harness (Claude Code, Cursor, Codex, CI), pass " + - "--device on every call." - -/** - * Single source of truth for the `[ShellDevicePinStore]` log-line prefix used - * across the file-pin lifecycle (`writeShellDevicePinIfPossible`, - * `clearShellDevicePinIfPossible`, `clearShellDevicePinTargetIfPossible`, and - * the stale-pin eviction site in `resolveDeviceWithAutodetect`). A const - * keeps the prefix consistent — operators grepping by it find every event. - */ -private const val SHELL_PIN_LOG_PREFIX = "[ShellDevicePinStore]" - internal const val TARGET_OPTION_DESCRIPTION: String = - "Target app ID for this command's bound device. Defaults to " + - "`\$TRAILBLAZE_TARGET` if set, otherwise the target you passed to " + - "`trailblaze device connect --target X` for this terminal (persists in " + - "this terminal's pin; cleared by `device disconnect`, replaced by " + - "`device rebind --target Y`). Pass `--target=clear` to remove a " + - "previously-set override for this device. To set a persistent " + - "default, use `trailblaze config target`. List available targets " + - "with `trailblaze toolbox` (no args)." + "Target app ID for this command's bound device. Scoped to the device " + + "as a daemon-process override (dies on daemon restart or device " + + "release). Defaults to `\$TRAILBLAZE_TARGET` — typically set via " + + "`eval \$(trailblaze device connect ... --target X)`. Pass " + + "`--target=clear` to remove a previously-set override for this " + + "device. To set a persistent default, use `trailblaze config " + + "target`. List available targets with `trailblaze toolbox` (no args)." /** * Variant of [TARGET_OPTION_DESCRIPTION] for `session start` — same env-tier @@ -176,13 +137,12 @@ internal const val TARGET_OPTION_DESCRIPTION: String = * "list available targets with toolbox" pointer. */ internal const val TARGET_OPTION_DESCRIPTION_SESSION: String = - "Target app ID for this session's bound device. Defaults to " + - "`\$TRAILBLAZE_TARGET` if set, otherwise the target you passed to " + - "`trailblaze device connect --target X` for this terminal (persists in " + - "this terminal's pin; cleared by `device disconnect`, replaced by " + - "`device rebind --target Y`). Pass `--target=clear` to remove a " + - "previously-set override. To set a persistent default, use " + - "`trailblaze config target`." + "Target app ID for this session's bound device. Scoped to the device " + + "as a daemon-process override (dies on daemon restart or device " + + "release). Defaults to `\$TRAILBLAZE_TARGET` — typically set via " + + "`eval \$(trailblaze device connect ... --target X)`. Pass " + + "`--target=clear` to remove a previously-set override. To set a " + + "persistent default, use `trailblaze config target`." /** * How the effective `--target` value was chosen for one CLI invocation. @@ -309,20 +269,11 @@ internal fun resolveCliTarget(flag: String?): ResolvedCliTarget { internal fun resolveCliTargetPin(flag: String?): String? { val normalized = normalizeTargetId(flag) // `--target=clear` is the explicit "remove the per-device override" signal. - // Returning null here (rather than falling through to the env / pin tiers) - // is what keeps the clear deterministic — without this short-circuit a - // file-pinned target would silently re-establish the very binding the user - // is trying to clear. + // Returning null here (rather than falling through to the env tier) is what + // keeps the clear deterministic regardless of what `$TRAILBLAZE_TARGET` holds. if (normalized == "clear") return null if (normalized != null) return normalized - envTrailblazeTarget()?.let { return it } - // File-pin target tier: when the user passed `--target X` to a previous - // `device connect`, that X was persisted alongside the device id in the - // pin file. Re-applying it here ensures the per-device daemon override is - // re-established on every action command, surviving daemon restarts. The - // tier is silently skipped when the wrapper didn't forward - // TRAILBLAZE_SHELL_PID, or when the user pinned a device without --target. - return readShellPinTarget(CliConfigHelper.resolveEffectiveHttpPort()) + return envTrailblazeTarget() } /** @@ -449,191 +400,6 @@ internal fun resolveCliDevice(flag: String?): String? = flag?.takeIf { it.isNotBlank() } ?: CliCallerContext.callerEnv("TRAILBLAZE_DEVICE")?.takeIf { it.isNotBlank() } -/** - * True when the caller's wrapper detected a tty on stdin — typical of a - * human typing into a real terminal. False for AI agent harnesses (Claude - * Code / Cursor / Codex Bash tools), CI scripts, and piped invocations, - * where each command typically runs in a fresh shell with no parent-tty. - * - * Read by `device connect` to decide whether to warn that the file-pin - * won't carry across separate command invocations. We deliberately default - * to `false` on missing/blank env (older wrapper, direct-JVM use): missing - * the warning for a real human is mild noise ("Note: this terminal isn't - * interactive..." is technically wrong but harmless); missing it for an - * agent is a loop where the agent keeps re-pinning and failing. - */ -internal fun isInteractiveCaller(): Boolean = - CliCallerContext.callerEnv("TRAILBLAZE_INTERACTIVE")?.trim() == "1" - -/** - * Persist the [deviceId] (and optional [targetId]) as the pin for the caller's - * terminal, identified by the `TRAILBLAZE_SHELL_PID` env var forwarded by the - * bash wrapper. - * - * Persisting the target alongside the device is what makes - * `device connect --target X` survive a daemon restart — without it, the - * target lives only in the daemon's in-memory `SessionTargetRegistry` and - * silently degrades to workspace config on next `app --stop && app start`. - * - * Silently skips when: - * - The wrapper didn't forward the PID (older wrapper, direct-JVM use, a - * tool invoking the CLI outside `./trailblaze`). - * - The pin file write throws (e.g. read-only home directory). The - * daemon-side device bind still happened, so the user can still drive - * the device for this one call via the resolver's existing flag/env - * tiers — they just won't get persistence. - * - * Diagnostic message goes to `Console.log` (file log) on write failure so a - * read-only-home-directory bug surfaces without spamming the user's terminal. - */ -internal fun writeShellDevicePinIfPossible(deviceId: String, targetId: String? = null) { - val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } - ?: return - val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return - try { - val port = CliConfigHelper.resolveEffectiveHttpPort() - ShellDevicePinStore.setPin( - file = ShellDevicePinStore.pinFileFor(port), - shellPid = pid, - device = deviceId, - target = targetId, - ) - } catch (e: IllegalStateException) { - // `mutate()` throws IllegalStateException for filesystem-state problems - // it can't recover from automatically (e.g., the `.lock` path is a - // directory, or a symlink to one). The user-visible "Pinned $device for - // this terminal." line was already printed at this point — promote the - // failure to stderr so the user knows their pin DIDN'T land and they'll - // need `--device` on follow-up calls until they clean up the bad path. - // Debug log retained for the operator log trail. - Console.error( - "Warning: this terminal's device pin couldn't be written (${e.message}). " + - "The daemon-side bind succeeded, but subsequent commands in this terminal " + - "won't inherit the pin — pass `--device $deviceId` on each call until you fix " + - "the underlying filesystem state.", - ) - Console.log("$SHELL_PIN_LOG_PREFIX failed to write pin for pid=$pid: ${e.message}") - } catch (e: Exception) { - Console.log("$SHELL_PIN_LOG_PREFIX failed to write pin for pid=$pid: ${e.message}") - } -} - -/** - * Read the target from this terminal's file-pin. Returns null when there's no - * pin, when the pin doesn't include a target (user pinned bare with no - * `--target`), or when the wrapper didn't forward the shell PID. Used as a - * resolver tier in [resolveCliTargetPin] between the env var and null so a - * `device connect --target X` re-applies that X on every subsequent action - * command, surviving daemon restarts. - */ -private fun readShellPinTarget(port: Int): String? { - val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } - ?: return null - val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return null - val lookup = ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), pid) - return (lookup as? ShellDevicePinStore.PinLookup.Found)?.target -} - -/** - * Clear ONLY the target field on this terminal's pin, preserving the device - * binding. Called when the user passes `--target=clear` so the next action - * command doesn't re-read a stale target from the pin and silently undo the - * clear. Without this, the eviction-half of `--target=clear` only ran on the - * daemon side (via `setSessionTargetForBoundDevice("")`); the file-pin kept - * the original target and `resolveCliTargetPin` re-established it on the next - * call. See PR #3611 lead-dev-review finding #1. - * - * Silently skips when no pin exists for this PID (nothing to clear), when the - * PID isn't forwarded (same as the other shell-pin helpers), or when the - * write fails (logged at debug level). Symmetric with the other helpers: - * never throws, never blocks the action that triggered the clear. - */ -internal fun clearShellDevicePinTargetIfPossible() { - val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } - ?: return - val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return - try { - val port = CliConfigHelper.resolveEffectiveHttpPort() - // Atomic clear: one `mutate()` lock window does read-then-write so a - // concurrent same-PID writer can't slip in between. No-ops when the - // entry is missing or already has target=null (saves a lock cycle in - // the common-after-first-clear case). - ShellDevicePinStore.clearPinTarget( - file = ShellDevicePinStore.pinFileFor(port), - shellPid = pid, - ) - // Success path is observable too — paired with the failure log below - // so an operator triaging "user says --target=clear didn't stick" can - // verify the helper ran. Debug-level (Console.log → file) so it - // doesn't add interactive-user noise. - Console.log("$SHELL_PIN_LOG_PREFIX cleared target for pid=$pid") - } catch (e: Exception) { - Console.log("$SHELL_PIN_LOG_PREFIX failed to clear pin target for pid=$pid: ${e.message}") - } -} - -/** - * Clear the pin entry for the caller's terminal (if any). Symmetric with - * [writeShellDevicePinIfPossible]; same silent-skip semantics on missing - * PID or write failure. - */ -internal fun clearShellDevicePinIfPossible() { - val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } - ?: return - val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return - try { - val port = CliConfigHelper.resolveEffectiveHttpPort() - ShellDevicePinStore.clearPin( - file = ShellDevicePinStore.pinFileFor(port), - shellPid = pid, - ) - } catch (e: Exception) { - Console.log("$SHELL_PIN_LOG_PREFIX failed to clear pin for pid=$pid: ${e.message}") - } -} - -/** - * Reads the per-terminal device pin written by `device connect`. Returns the - * pinned device spec when all of the following hold: - * - The wrapper forwarded `TRAILBLAZE_SHELL_PID` (older wrappers skip this - * tier silently, preserving the env-var-or-autodetect behavior they had); - * - The PID is a valid positive integer; - * - The pin file has an entry for this PID; - * - The PID is still bound to a live OS process (the shell hasn't exited). - * - * Any other case returns null so the resolver falls through. The path is - * scoped to the daemon [port] so a custom-port daemon (`TRAILBLAZE_PORT=…`) - * gets its own pin map and doesn't see a default-port daemon's bindings - * pointing at device IDs it doesn't own. - * - * Note: this returns the pin *as recorded*. The caller is responsible for - * validating that the pinned device is actually connected before honoring - * it — see [resolveDeviceWithAutodetect] for the validation flow. - */ -internal fun readShellPinDevice(port: Int): String? { - val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } - ?: return null - val pid = pidStr.toLongOrNull()?.takeIf { it > 0 } ?: return null - val lookup = ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), pid) - return (lookup as? ShellDevicePinStore.PinLookup.Found)?.device -} - -/** - * Flatten a [DeviceAutodetectResult] into the set of currently-connected - * device specs the resolver can consider valid. Used to validate the - * shell-pin against the live list without paying for a second daemon LIST. - * - * Daemon-unreachable yields an empty set: we can't validate, the pin - * validation in [resolveDeviceWithAutodetect] short-circuits, and the - * downstream `when` branches surface the right error envelope. - */ -private fun liveDeviceSpecs(r: DeviceAutodetectResult): Set<String> = when (r) { - is DeviceAutodetectResult.Resolved -> setOf(r.deviceSpec) - is DeviceAutodetectResult.Multiple -> r.specs.toSet() - is DeviceAutodetectResult.NoDevices -> emptySet() - is DeviceAutodetectResult.DaemonUnreachable -> emptySet() -} - /** * Outcome of a connected-device autodetect probe — the tier consulted after * [resolveCliDevice] returns null. Sealed so callers can branch deterministically @@ -779,61 +545,7 @@ internal suspend fun resolveDeviceWithAutodetect( verb: String = "Command", ): DeviceResolution { resolveCliDevice(flag)?.let { return DeviceResolution.Resolved(it) } - - // Read the per-terminal pin file written by `device connect` (cheap file - // I/O; no daemon round-trip). We validate it against the live device list - // below before honoring it — a pin pointing at a no-longer-connected - // device should fall through gracefully rather than fail the call with a - // generic "device not found" deep in the daemon. - val pinned = readShellPinDevice(port) - - // Daemon LIST — single round-trip whose result drives BOTH pin validation - // and the autodetect fallback below. We don't pay for it twice. - val autodetect = autodetectSingleConnectedDevice(port) - - // Validate the pin against the live list before honoring it. When the - // pinned device IS in the list, return it — the user's intent stands - // (especially in the multi-device case, where the pin is exactly how - // they disambiguated). When it ISN'T, clear the pin and fall through to - // autodetect. - // - // Why evict rather than keep the pin: if we keep it, the user sees the - // "no longer connected" notice on every subsequent call until they - // explicitly `disconnect` — that's just noise. Worse, when a different - // device shows up later the resolver still won't honor it (the pin is - // pointing at the wrong thing). Clearing the pin once forces the user - // back through `device connect` to make an explicit choice, which is - // exactly the right time to make it. If they re-pin the same device, - // that's a two-second command. The daemon-unreachable branch is - // special-cased — we don't have evidence the device is gone, we just - // couldn't ask, so we leave the pin in place. - if (pinned != null) { - when (autodetect) { - is DeviceAutodetectResult.DaemonUnreachable -> { - // Can't validate. Leave the pin alone; the daemon-unreachable - // error envelope below tells the user what's wrong. - } - else -> { - val live = liveDeviceSpecs(autodetect) - if (pinned in live) { - return DeviceResolution.Resolved(pinned) - } - Console.error( - "Pinned device $pinned is no longer connected; pin cleared. " + - "Reconnect it and re-run `trailblaze device connect $pinned`, " + - "or pick a different one from `trailblaze device list`.", - ) - // Also log the eviction at file-log level so operators investigating - // "the user said their pin disappeared" can correlate against a - // timeline. The user-visible Console.error above is the OOBE signal; - // this is the audit trail. - Console.log("$SHELL_PIN_LOG_PREFIX evicted pin: device=$pinned not in live list") - clearShellDevicePinIfPossible() - } - } - } - - return when (val r = autodetect) { + return when (val r = autodetectSingleConnectedDevice(port)) { is DeviceAutodetectResult.Resolved -> { reportAutodetectedDevice(r.deviceSpec) DeviceResolution.Resolved(r.deviceSpec) @@ -842,21 +554,19 @@ internal suspend fun resolveDeviceWithAutodetect( reportCliError( verb = verb, reason = "no devices connected", - hint = "start an Android emulator (Android Studio AVD) or iOS simulator (Xcode), " + - "or run `trailblaze device connect web` to launch a browser", + hint = "connect a device first (Android: USB or emulator; iOS: simulator " + + "via Xcode; web: always available), or run " + + "`eval \$(trailblaze device connect <platform>)`", ) DeviceResolution.Misuse } is DeviceAutodetectResult.Multiple -> { reportCliError( verb = verb, - reason = "multiple devices connected — pick one", - hint = "in an interactive terminal, pin one (subsequent commands inherit it):", + reason = "multiple devices connected — --device is required to pick one", + hint = "available: ${r.specs.joinToString(", ")}. Pass `--device <id>` or " + + "run `eval \$(trailblaze device connect <id>)` once to pin this shell", ) - r.specs.forEach { spec -> Console.error(" trailblaze device connect $spec") } - Console.error("") - Console.error(" Or, for scripts and AI agents like Claude Code (each command runs in a fresh shell), append to your command:") - r.specs.forEach { spec -> Console.error(" --device $spec") } DeviceResolution.Misuse } is DeviceAutodetectResult.DaemonUnreachable -> { @@ -1223,15 +933,6 @@ fun cliReusableWithDevice( // follow-up"). No-op when neither tier supplies a pin (we leave the // existing daemon-wide default in place). if (daemonCall.payload != null) { - // For `--target=clear`: clear the file-pin FIRST so that if the file - // write fails, the daemon-side override stays as the user's source - // of truth (preserving consistency rather than silently diverging). - // For a set (non-clear) target: the file-pin already reflects the - // pinned value via `device connect`'s write path, so we only need - // the daemon-side re-apply on each action call. - if (daemonCall.isClearRequest) { - clearShellDevicePinTargetIfPossible() - } val setError = client.setSessionTargetForBoundDevice(daemonCall.payload) if (setError != null) { // When the pin came from $TRAILBLAZE_TARGET (no explicit flag), the diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt index 01c101ea9..ec876cbe3 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DaemonClient.kt @@ -495,7 +495,7 @@ class DaemonClient( * * Lowered from 30 min to 10 min so a wedged daemon fails fast and the next CI cycle * starts sooner. The honest happy-path runtime for a single-trail CI session is well - * under 10 minutes (a Wikipedia trail completes in seconds; a long Cash flow in a + * under 10 minutes (a Wikipedia trail completes in seconds; a long multi-screen flow in a * couple of minutes), so 10 min gives a 3-5× headroom over the typical case while * still cutting the failure-mode wait by 20 minutes vs. the historical 30 min. */ diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt index b8a9cf687..164f3c911 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/DeviceCommand.kt @@ -135,12 +135,7 @@ class DeviceListCommand : Callable<Int> { Console.info("") val byPlatform = devices.groupBy { it.platform } - Console.info( - "${devices.size} device(s) available. " + - "In an interactive terminal, pin one with `trailblaze device connect <spec>` " + - "and subsequent commands inherit it. " + - "In a fresh-shell harness (Claude Code, CI), pass `--device <spec>` per call:", - ) + Console.info("${devices.size} device(s) available. Pass --device on each device command:") Console.info("") // Warm the classifier cache for all devices in parallel before formatting. The // synchronous per-device formatDeviceType calls below then hit the cache instantly @@ -240,7 +235,7 @@ class DeviceListCommand : Callable<Int> { @Command( name = "connect", mixinStandardHelpOptions = true, - description = ["Connect a device + target and pin them for this terminal so subsequent commands inherit the binding"], + description = ["Connect a device + target to your session (use `eval $(...)` to pin TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell)"], ) class DeviceConnectCommand : Callable<Int> { @@ -257,9 +252,9 @@ class DeviceConnectCommand : Callable<Int> { names = ["--target", "-t"], description = [ "Target app to bind to this device's session (e.g. `default`, `sampleapp`). " + - "Optional. When set, the target is recorded alongside the device in this " + - "terminal's pin so subsequent CLI calls re-apply the binding automatically " + - "until you `device disconnect` or pin a different target.", + "Optional. When set, `eval \$(trailblaze device connect ... --target X)` also " + + "exports \$TRAILBLAZE_TARGET so subsequent CLI calls in this shell re-apply " + + "the binding automatically.", ], ) var target: String? = null @@ -374,41 +369,12 @@ class DeviceConnectCommand : Callable<Int> { Console.log("[device connect] MCP session pin threw: ${e.message}") } - // 5. Pin the device for this terminal so subsequent commands default to - // it without flags or env vars. The pin survives daemon restart - // (it's a file under ~/.trailblaze keyed by the shell PID forwarded - // by the `./trailblaze` wrapper as TRAILBLAZE_SHELL_PID). Older - // wrappers that don't forward the PID skip this silently — the - // daemon-side bind still happened in step 1, so a follow-up call - // in the same shell still works via the `--device` flag or the - // TRAILBLAZE_DEVICE env tier. - // Pass the resolved target through to the pin so a `device connect - // --target X` survives a daemon restart — the per-device override - // lives only in the daemon's in-memory SessionTargetRegistry, and - // without persisting the target alongside the device id every action - // command after a restart would degrade to workspace config. - writeShellDevicePinIfPossible(deviceIdString, resolvedTarget) - - // 6. Status messages → stderr. Plain confirmation of what's now active - // for this terminal. The historical `Pin to this shell: eval $(...)` - // line is gone — the file-pin written in step 5 already does the - // pinning, so directing the user at eval is misleading. + // 5. Status messages → stderr so `eval $(trailblaze device connect ...)` doesn't + // try to evaluate them as shell commands. Visible to interactive users either + // way (stderr renders to the terminal even when stdout is being captured). val targetSuffix = resolvedTarget?.let { " (target=$it)" }.orEmpty() - Console.error("Pinned $deviceIdString$targetSuffix for this terminal. Other terminals are independent.") - // Catch the agent-harness case: the wrapper passed TRAILBLAZE_INTERACTIVE=0 - // because stdin isn't a tty. Claude Code's Bash tool, Cursor's shell, Codex, - // and CI all qualify. In those environments each subsequent CLI invocation - // is a fresh shell with a different PID, so the pin we just wrote is - // invisible to the next call — directing the agent at `--device` per call - // avoids the "I pinned it but it's not working" loop. Real humans in a - // real terminal have a tty and never see this notice. - if (!isInteractiveCaller()) { - Console.error( - "Note: this terminal looks non-interactive (AI agent, CI, or piped). " + - "The pin won't survive into fresh shells — pass " + - "`--device $deviceIdString` on each command instead.", - ) - } + Console.error("Connected $deviceIdString$targetSuffix.") + Console.error("Pin to this shell: eval \$(trailblaze device connect $deviceIdString${resolvedTarget?.let { " --target $it" }.orEmpty()})") // First-time OOBE discovery hint. Surface the `-s` / require-steps trade-off // exactly once per connect so authors learn the durable-step contract self- // heal needs, without nagging on every tool call (which is the "paperwork" @@ -425,12 +391,19 @@ class DeviceConnectCommand : Callable<Int> { ) } - // Stdout is intentionally empty for this command now that the file-pin - // carries the binding. We used to print `export TRAILBLAZE_DEVICE=…` - // here so `eval $(...)` could lift it into the parent shell — that - // mechanism is obsolete with terminal-scoped pinning. Anyone who still - // wants the env var as a manual override can `export TRAILBLAZE_DEVICE=…` - // themselves; the resolver tier that reads it is unchanged. + // 6. Shell-evaluable lines → stdout via the shared helper. This is what + // `eval $(...)` captures and runs in the parent shell to set + // TRAILBLAZE_DEVICE (and, when a target was passed, TRAILBLAZE_TARGET) + // for every subsequent CLI call in this terminal. The target export + // is the cross-invocation cousin of the daemon-side per-device + // override set in step 2: the daemon-side entry is wiped whenever a + // fresh MCP session re-claims the device (PR #3463 follow-up), but + // the env-pin survives because each new CLI invocation re-applies it + // via [resolveCliTargetPin] inside [cliReusableWithDevice]. + printShellExport("TRAILBLAZE_DEVICE", deviceIdString) + if (resolvedTarget != null) { + printShellExport("TRAILBLAZE_TARGET", resolvedTarget) + } TrailblazeExitCode.SUCCESS.code } @@ -438,26 +411,33 @@ class DeviceConnectCommand : Callable<Int> { } /** - * Disconnect the current device and clear this terminal's pin. + * Disconnect the current device and release its session. * - * Pair with `device connect`. After this runs, the resolver falls through to - * autodetect on subsequent CLI calls until a new `device connect` is issued. + * Pair with `device connect`: `eval $(trailblaze device disconnect)` prints + * `unset TRAILBLAZE_DEVICE` so the shell stops routing to a device the daemon + * no longer holds open. Without the `eval` wrapper, the daemon still releases + * the session but the shell's env var is left dangling (harmless — subsequent + * commands will fail at the daemon with "no active session" or auto-rebind + * once that path lands). * - * **Backwards-compat: legacy env-var unset on stdout.** For users still wiring - * `eval $(trailblaze device disconnect)` in their shell rc, this command also - * emits `unset TRAILBLAZE_DEVICE` and `unset TRAILBLAZE_TARGET` on stdout so - * the eval-pattern keeps working. The lines are vestigial — the file-pin write - * to `~/.trailblaze/shell-device-pins-<port>.json` is what the rest of the - * CLI consults — but harmless to keep for users mid-migration. + * Symmetric clear: `device disconnect` ALWAYS emits both `unset TRAILBLAZE_DEVICE` + * and `unset TRAILBLAZE_TARGET`, even when the prior `device connect` was bare + * (no `--target`, so `TRAILBLAZE_TARGET` was not exported by that connect). + * The contract is "the env-var lifecycle is owned by the connect/disconnect + * pair as a unit" — leaving a stale TRAILBLAZE_TARGET behind after a + * disconnect would silently contaminate the next `device connect` via + * [resolveCliTargetPin]'s env-tier read. Users who manage `TRAILBLAZE_TARGET` + * independently in their shell rc should set it AFTER any `device disconnect` + * runs (or not use `eval $(...)` to consume the disconnect output). * * Examples: - * trailblaze device disconnect - Release the device + clear this terminal's pin - * trailblaze device disconnect --device android/... - Release a specific bound device by id + * eval $(trailblaze device disconnect) - Release the bound device + clear env vars + * trailblaze device disconnect - Release the bound device (env vars untouched) */ @Command( name = "disconnect", mixinStandardHelpOptions = true, - description = ["Disconnect a device and clear this terminal's pin"], + description = ["Disconnect a device (use `eval $(...)` to also clear TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET)"], ) class DeviceDisconnectCommand : Callable<Int> { @@ -466,11 +446,7 @@ class DeviceDisconnectCommand : Callable<Int> { @CommandLine.Option( names = ["-d", "--device"], - description = [ - "Device to disconnect. Defaults to `\$TRAILBLAZE_DEVICE` if set " + - "manually, otherwise this terminal's pin (set by " + - "`trailblaze device connect`).", - ], + description = ["Device to disconnect. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null @@ -480,49 +456,31 @@ class DeviceDisconnectCommand : Callable<Int> { // daemon's currently-bound session, a bare `device disconnect` from a fresh // shell that never connected anything would happily terminate work belonging // to another shell. Force the caller to name the device they're disconnecting. - // Resolve the device the caller wants to release. `resolveCliDevice` only - // covers --device and TRAILBLAZE_DEVICE; the file-pin written by - // `device connect` is the primary mechanism now, so we also consult it - // here. Without this, a user who connected via the file-pin and then - // typed `trailblaze device disconnect` (no flag, no env) would get the - // "needs a device" error instead of the obvious release. - val port = CliConfigHelper.resolveEffectiveHttpPort() val expectedDevice = resolveCliDevice(device) - ?: run { - val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } - val pid = pidStr?.toLongOrNull()?.takeIf { it > 0 } - pid?.let { - (ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), it) - as? ShellDevicePinStore.PinLookup.Found)?.device - } - } if (expectedDevice.isNullOrBlank()) { Console.error( - "device disconnect needs a device to act on. This terminal has no pin " + - "(each terminal has its own — pinning in one doesn't show up in " + - "another). Pass `--device <platform>/<id>` to name a specific device " + - "to release, or run `trailblaze device list` to see what's currently " + - "bound and try `trailblaze device disconnect --device <id>`.", + "device disconnect needs a device to act on. Pass `--device <platform>` " + + "or set TRAILBLAZE_DEVICE first (typically via `eval \$(trailblaze " + + "device connect <platform>)`). This prevents accidentally stopping " + + "another shell's session in the multi-terminal case.", ) return TrailblazeExitCode.MISUSE.code } return cliWithDaemon(verbose = false) { client -> + val port = CliConfigHelper.resolveEffectiveHttpPort() when (val outcome = stopBoundSessionIfMatches(client, expectedDevice)) { is StopBoundSessionResult.NoActiveSession -> { Console.error( - "No device currently bound on the daemon. Clearing this terminal's pin " + - "and any stale TRAILBLAZE_DEVICE / TRAILBLAZE_TARGET env vars.", + "No device currently bound on the daemon. Clearing TRAILBLAZE_DEVICE " + + "and TRAILBLAZE_TARGET in case they're stale.", ) CliMcpClient.clearSession(port) - // Clear the per-terminal file pin so the resolver doesn't keep - // returning a now-stale entry on subsequent calls. - clearShellDevicePinIfPossible() - // Symmetric env-var unsets are still emitted on stdout so legacy - // `eval $(trailblaze device disconnect)` workflows keep functioning - // for users who still wire that pattern in their shells. The - // env-var-via-stdout pathway is no longer required (file-pin - // handles it), but it's harmless and backwards-compatible. + // Symmetric with TRAILBLAZE_DEVICE: when `device connect --target X` + // sets both env vars, `device disconnect` clears both. Leaving + // TRAILBLAZE_TARGET set while TRAILBLAZE_DEVICE is unset would let + // a stale target pin contaminate the next `device connect` in this + // shell via `cliReusableWithDevice`'s [resolveCliTargetPin] read. printShellUnset("TRAILBLAZE_DEVICE") printShellUnset("TRAILBLAZE_TARGET") TrailblazeExitCode.SUCCESS.code @@ -531,9 +489,10 @@ class DeviceDisconnectCommand : Callable<Int> { Console.error( "Won't disconnect: you asked to release '$expectedDevice' but the " + "daemon's current session is bound to ${outcome.boundDevice.toFullyQualifiedDeviceId()}. " + - "Either another terminal connected after you did, or this terminal's " + - "pin is stale. To release the other binding anyway: `trailblaze device " + - "disconnect --device ${outcome.boundDevice.toFullyQualifiedDeviceId()}`.", + "Either another shell connected after you did, or TRAILBLAZE_DEVICE is stale. " + + "To release the other binding anyway: `trailblaze device disconnect " + + "--device ${outcome.boundDevice.toFullyQualifiedDeviceId()}`. " + + "To clear this shell's env vars only: `unset TRAILBLAZE_DEVICE TRAILBLAZE_TARGET`.", ) TrailblazeExitCode.INFRA_FAILED.code } @@ -546,12 +505,7 @@ class DeviceDisconnectCommand : Callable<Int> { // this shell would try to reattach to the now-closed session and fail // before auto-creating a new one. Mirrors `session stop`. CliMcpClient.clearSession(port) - // Clear the per-terminal file pin so subsequent commands fall back - // to autodetect (or a different terminal's pin) instead of trying - // to use this just-disconnected device. - clearShellDevicePinIfPossible() Console.error("Disconnected $expectedDevice.") - // See note above on legacy env-var unset. printShellUnset("TRAILBLAZE_DEVICE") printShellUnset("TRAILBLAZE_TARGET") TrailblazeExitCode.SUCCESS.code @@ -571,8 +525,9 @@ class DeviceDisconnectCommand : Callable<Int> { * sets the new target. The daemon lazily starts a fresh session bound to the * new target on the next action command (`tool`, `step`, `snapshot`, etc.). * - * The per-terminal pin's *device* doesn't move — only the bound target does - * — so rebind doesn't touch `~/.trailblaze/shell-device-pins-<port>.json`. + * TRAILBLAZE_DEVICE is unchanged: the device binding itself isn't moving, so + * the shell env var that points at this device stays valid. No `eval $(...)` + * wrapper is needed. * * Examples: * trailblaze device rebind --target sampleapp @@ -590,11 +545,7 @@ class DeviceRebindCommand : Callable<Int> { @CommandLine.Option( names = ["-d", "--device"], - description = [ - "Device to rebind. Defaults to `\$TRAILBLAZE_DEVICE` if set " + - "manually, otherwise this terminal's pin (set by " + - "`trailblaze device connect`).", - ], + description = ["Device to rebind. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null @@ -607,24 +558,16 @@ class DeviceRebindCommand : Callable<Int> { override fun call(): Int { // Same multi-terminal safety pin as `device disconnect`: refuse to operate - // without an explicit device identifier (flag or env var OR file-pin), so a - // bare `rebind` from a fresh shell with no pin can't accidentally tear down - // another shell's session on the way to swapping its target. - val port = CliConfigHelper.resolveEffectiveHttpPort() + // without an explicit device identifier (flag or env var), so a bare + // `rebind` from a fresh shell can't accidentally tear down another + // shell's session on the way to swapping its target. val expectedDevice = resolveCliDevice(device) - ?: run { - val pidStr = CliCallerContext.callerEnv("TRAILBLAZE_SHELL_PID")?.takeIf { it.isNotBlank() } - val pid = pidStr?.toLongOrNull()?.takeIf { it > 0 } - pid?.let { - (ShellDevicePinStore.resolvePin(ShellDevicePinStore.pinFileFor(port), it) - as? ShellDevicePinStore.PinLookup.Found)?.device - } - } if (expectedDevice.isNullOrBlank()) { Console.error( "device rebind needs a device to act on. Pass `--device <platform>` " + - "or `trailblaze device connect <platform>` first so this terminal " + - "knows what to rebind.", + "or set TRAILBLAZE_DEVICE first (typically via `eval \$(trailblaze " + + "device connect <platform>)`). This prevents accidentally rebinding " + + "another shell's session in the multi-terminal case.", ) return TrailblazeExitCode.MISUSE.code } @@ -654,9 +597,10 @@ class DeviceRebindCommand : Callable<Int> { Console.error( "Won't rebind: you asked to rebind '$expectedDevice' but the " + "daemon's current session is bound to ${boundId.toFullyQualifiedDeviceId()}. " + - "Either another terminal connected after you did, or this terminal's " + - "pin is stale. To rebind the other binding anyway: `trailblaze device " + - "rebind --device ${boundId.toFullyQualifiedDeviceId()} --target $newTarget`.", + "Either another shell connected after you did, or TRAILBLAZE_DEVICE is stale. " + + "To rebind the other binding anyway: `trailblaze device rebind " + + "--device ${boundId.toFullyQualifiedDeviceId()} --target $newTarget`. " + + "To clear this shell's env var only: `unset TRAILBLAZE_DEVICE`.", ) return@cliWithDaemon TrailblazeExitCode.INFRA_FAILED.code } @@ -715,24 +659,17 @@ class DeviceRebindCommand : Callable<Int> { return@cliWithDaemon TrailblazeExitCode.INFRA_FAILED.code } - // Plain stderr confirmation. The device-side binding hasn't moved, so - // this terminal's pin (which keys on device, not target) stays valid; - // the new target is recorded daemon-side as a per-session override - // that the resolver re-applies on every subsequent CLI call. Legacy - // `eval $(trailblaze device rebind ...)` callers who relied on the - // stdout `export TRAILBLAZE_TARGET=…` line will need to update — the - // file-pin makes that mechanism redundant for the typical flow, and - // anyone who wants the env var as a manual override can `export` it. + // Status to stderr — the device binding itself hasn't moved, so + // TRAILBLAZE_DEVICE is unchanged. The TARGET pin, however, has: emit a + // shell-evaluable `export TRAILBLAZE_TARGET=<new>` on stdout so + // `eval $(trailblaze device rebind --target X)` keeps the shell pin in + // sync with the daemon-side override we just set. Without this, the + // env var still says the OLD target and the next action command would + // re-apply it via [resolveCliTargetPin], silently undoing the rebind. val deviceIdString = boundId.toFullyQualifiedDeviceId() - // Update the pin's target field. Without this, the next CLI call in - // this terminal would read the pin's OLD target (or null), call - // `setSessionTargetForBoundDevice` with the stale value, and silently - // undo the rebind. Note: this also writes a fresh pin for terminals - // that didn't have one (rebind via explicit --device from a shell - // that never ran connect) — which matches user intent: they just - // expressed a (device, target) binding for this shell. - writeShellDevicePinIfPossible(deviceIdString, newTarget) Console.error("Rebound $deviceIdString to target=$newTarget.") + Console.error("Pin to this shell: eval \$(trailblaze device rebind --device $deviceIdString --target $newTarget)") + printShellExport("TRAILBLAZE_TARGET", newTarget) TrailblazeExitCode.SUCCESS.code } } diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt index 5aabc7486..89337dc5a 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/McpCommand.kt @@ -70,8 +70,7 @@ class McpCommand : Callable<Int> { names = ["-d", "--device"], description = [ "Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). " + - "Defaults to whatever the launching terminal pinned via " + - "`trailblaze device connect`, or `\$TRAILBLAZE_DEVICE` if set.", + "Defaults to \$TRAILBLAZE_DEVICE.", ], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt index 2aee69184..1d49387fa 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SessionCommand.kt @@ -100,7 +100,7 @@ class SessionStartCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION], + description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null @@ -200,11 +200,6 @@ class SessionStartCommand : Callable<Int> { // supplies a value. `--target=clear` (flag-only) sends an empty // string to clear the override. if (daemonCall.payload != null) { - // Same ordering as cliReusableWithDevice: file-pin clear FIRST so a - // file write failure doesn't leave the daemon and file diverged. - if (daemonCall.isClearRequest) { - clearShellDevicePinTargetIfPossible() - } val setError = it.setSessionTargetForBoundDevice(daemonCall.payload) if (setError != null) { Console.error(setError) @@ -263,7 +258,7 @@ class SessionStopCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION], + description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null @@ -624,7 +619,7 @@ class SessionEndCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION], + description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt deleted file mode 100644 index 53fbc8ad6..000000000 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ShellDevicePinStore.kt +++ /dev/null @@ -1,346 +0,0 @@ -package xyz.block.trailblaze.cli - -import java.io.File -import java.io.RandomAccessFile -import java.nio.file.Files -import java.nio.file.StandardCopyOption -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json -import xyz.block.trailblaze.ui.TrailblazeDesktopUtil - -/** - * Per-terminal device-pin storage. - * - * **What this is.** A small JSON file mapping `(shellPid → boundDevice)` so the - * CLI resolver can answer "what device should this terminal default to?" - * without making the user export a shell env var. The file is read on every - * device-resolving command and consulted as a resolver tier between the - * `TRAILBLAZE_DEVICE` env var and connected-device autodetect — see - * [resolveDeviceWithAutodetect]. - * - * **Why a file and not the daemon.** The pin must survive `trailblaze app --stop - * && trailblaze app start` so a user who restarts their daemon doesn't lose - * their terminal binding. Keeping it in a file gives us that for free; the - * daemon stays stateless on this axis. The cost is concurrency control on the - * file, addressed below. - * - * **PID reuse.** Shell PIDs are eventually recycled by the OS. The window for - * a stale pin to bite is "user closes terminal A AND opens terminal B that - * gets terminal A's recycled PID AND never runs `device connect` themselves - * AND runs a device command in the same project," and the worst-case impact - * is "terminal B inherits an unexpected device default." That's a one-in-a- - * million sequence, the recovery is `trailblaze device connect <whatever>`, - * and detecting it requires a start-instant comparison on every read — the - * cost of the prevention outweighs the cost of the bug. So we don't try. - * Liveness checking (PID exists at all) IS done — that's what cleans out - * dead shells; it just doesn't fingerprint the live process. - * - * **Garbage collection.** Lazy. Every mutation drops entries whose PID is no - * longer alive. No background sweep — at worst the file accumulates dead - * entries until something writes it, at which point they're evicted in - * O(N). At typical scale (handful of shells) this is negligible. - * - * **Concurrency.** Two terminals can call `trailblaze device connect` in the - * same instant. We use kernel-level advisory file locking - * ([java.nio.channels.FileChannel.lock]) for read-modify-write: acquire - * exclusive lock → read → mutate → write to tempfile → fsync → rename → - * release. Locks are kept short (single-digit-KB file) so contention is - * effectively zero in practice. An in-JVM monitor on top of the file lock - * guards thread-level concurrency within a single daemon (Java's - * `FileChannel.lock` is process-scoped, not thread-scoped). - * - * **Multi-daemon isolation.** The file path is port-scoped - * ([pinFileFor]) — a user running `TRAILBLAZE_PORT=52527 trailblaze app start` - * for an isolated test daemon gets its own pin map. Different daemons - * typically have different device lists, so cross-daemon pin sharing would - * point at non-existent device ids. - * - * **Test hooks.** Every method takes the file path explicitly, and the - * liveness check is injectable via [LivenessProbe]. Production calls - * default to [ProcessHandle.of]; tests pass a deterministic lambda so the - * store's eviction logic can be unit-tested without spawning real processes. - */ -internal object ShellDevicePinStore { - - /** Lookup result for "what's pinned for shell pid X?". */ - sealed class PinLookup { - /** - * Entry present and live; safe to use. Carries the full [Entry] so callers - * can pull either [Entry.device] or [Entry.target] without a second file - * read. The device-only callers ([resolveDeviceWithAutodetect], - * [DeviceDisconnectCommand]) read `.entry.device`; the target tier in - * [resolveCliTargetPin] reads `.entry.target`. - */ - data class Found(val entry: Entry) : PinLookup() { - val device: String get() = entry.device - val target: String? get() = entry.target - } - /** Entry absent or PID dead (shell exited). */ - data object NotFound : PinLookup() - } - - /** - * Predicate: is this PID currently bound to a running process? - * - * Production is [::isPidAlive] (delegates to [ProcessHandle.of]). Tests - * pass a deterministic lambda so the store's eviction logic can be - * unit-tested without spawning real processes. - */ - fun interface LivenessProbe { - operator fun invoke(pid: Long): Boolean - } - - /** - * One terminal's pin. [device] is the bound device id (e.g. `android/emulator-5554`). - * [target] is the bound target app (e.g. `default`, `sampleapp`) when the user passed - * `--target X` to `device connect` or `device rebind`, otherwise null. Nullable - * because some users `device connect` bare and let workspace config / built-in - * default supply the target on each action call. - * - * Persisting [target] alongside [device] is what makes the connect-time target - * survive a daemon restart: every subsequent CLI invocation reads this entry, - * re-applies the target as a per-device override on the daemon, and the user's - * connect-time intent stays in force even after `trailblaze app --stop && - * trailblaze app start`. Without this field, the target would live only in the - * daemon's in-memory `SessionTargetRegistry` and quietly degrade to workspace - * config on daemon restart — see PR #3611 review feedback. - */ - @Serializable - internal data class Entry(val device: String, val target: String? = null) - - @Serializable - internal data class PinFile(val shells: Map<String, Entry> = emptyMap()) - - private val json = Json { - prettyPrint = true - prettyPrintIndent = " " - encodeDefaults = true - ignoreUnknownKeys = true - } - - /** - * Per-file in-JVM lock — `FileChannel.lock()` is **process-scoped** in Java - * (overlapping locks on the same channel throw [java.nio.channels.OverlappingFileLockException]), - * so without an in-JVM monitor two threads in the same daemon racing on - * `mutate` would either lose a write or crash. The file lock still guards - * cross-JVM concurrency (two `./trailblaze` processes writing simultaneously); - * this monitor guards thread-level concurrency within a single JVM. - * - * Keyed by canonical path so different files are independent and tests - * using TemporaryFolder don't contend on a global lock. - */ - private val jvmLocks: MutableMap<String, Any> = java.util.concurrent.ConcurrentHashMap() - - private fun jvmLockFor(file: File): Any = - jvmLocks.computeIfAbsent(file.canonicalPath) { Any() } - - /** - * Default location for the pin file, scoped to the daemon port so isolated - * daemons don't collide. Falls under `~/.trailblaze/` alongside the rest of - * the per-user state. - */ - fun pinFileFor(port: Int): File = - File(TrailblazeDesktopUtil.getDefaultAppDataDirectory(), "shell-device-pins-$port.json") - - /** - * Look up the device pinned for [shellPid], evicting the entry inline if - * the PID is no longer alive. Idempotent — repeat calls return the same - * answer without writing the file unless eviction was triggered. - * - * Safe to call when [file] doesn't exist (returns [PinLookup.NotFound] - * without creating it) — that's the cold-start case for a user who's - * never run `device connect`. - */ - fun resolvePin( - file: File, - shellPid: Long, - probe: LivenessProbe = LivenessProbe(::isPidAlive), - ): PinLookup { - if (!file.exists()) return PinLookup.NotFound - val map = readMapOrEmpty(file) - val entry = map.shells[shellPid.toString()] ?: return PinLookup.NotFound - return if (probe(shellPid)) { - PinLookup.Found(entry) - } else { - // PID dead — evict and report not-found. The eviction write is - // best-effort; a failure here doesn't affect correctness (the next - // read will retry the eviction). - runCatching { mutate(file, probe) { it - shellPid.toString() } } - PinLookup.NotFound - } - } - - /** - * Set [shellPid] → ([device], [target]) in the pin file. Replaces any prior - * entry for the same PID (a user re-running `device connect` to switch - * devices, or `device rebind --target` to swap the bound target). - * - * [target] is null when the user pinned a device without `--target`; null is - * preserved on read so action commands fall through to env / workspace - * config / built-in default rather than re-applying a stale value. - * - * Also opportunistically evicts dead entries from the file as part of the - * same read-modify-write — no separate GC pass needed. - */ - fun setPin( - file: File, - shellPid: Long, - device: String, - target: String? = null, - probe: LivenessProbe = LivenessProbe(::isPidAlive), - ) { - mutate(file, probe) { current -> - current + (shellPid.toString() to Entry(device = device, target = target)) - } - } - - /** - * Remove the entry for [shellPid] if present. No-op when absent. Also - * sweeps dead entries during the same read-modify-write. - */ - fun clearPin( - file: File, - shellPid: Long, - probe: LivenessProbe = LivenessProbe(::isPidAlive), - ) { - mutate(file, probe) { current -> current - shellPid.toString() } - } - - /** - * Atomically null out the `target` field on this terminal's pin while - * leaving the device binding alone. Used by `--target=clear` to wipe the - * connect-time target without disconnecting. - * - * Single `mutate()` call — read AND write happen inside one lock window, - * so a concurrent writer to the same PID can't slip a write in between a - * naïve "resolvePin then setPin" sequence. (Same-PID concurrency is rare - * — requires backgrounded `./trailblaze &` invocations from one shell — - * but the atomic variant costs the same as the split version and removes - * the race outright.) - * - * No-op when there's no existing entry for [shellPid], when the entry's - * target is already null, or when the entry's PID is dead (in which case - * the entry is also evicted as part of the standard mutate-time GC). - */ - fun clearPinTarget( - file: File, - shellPid: Long, - probe: LivenessProbe = LivenessProbe(::isPidAlive), - ) { - mutate(file, probe) { current -> - val existing = current[shellPid.toString()] ?: return@mutate current - if (existing.target == null) return@mutate current - current + (shellPid.toString() to existing.copy(target = null)) - } - } - - /** - * Read-only snapshot of the file's entries. Does NOT evict dead entries - * (read-only). Used by diagnostics / `trailblaze device list-pins` kind of - * surfaces; the resolver uses [resolvePin] instead so it stays self- - * cleaning. - */ - fun readAll(file: File): Map<Long, Entry> { - if (!file.exists()) return emptyMap() - val map = readMapOrEmpty(file) - return map.shells.mapNotNull { (k, v) -> k.toLongOrNull()?.let { it to v } }.toMap() - } - - // ---------------- internals ---------------- - - /** - * Read-modify-write under exclusive file lock, with opportunistic eviction - * of dead entries. [transform] receives the current map and returns the - * post-transform map. Dead-entry pruning is applied to the result so any - * mutation also cleans up. - * - * The lock is held only across read + write of the JSON body (microseconds - * for KB-scale files). On JVM exit mid-write, the OS releases the lock and - * the rename below ensures readers never see a partial file (worst case - * they see the pre-write contents). - */ - private fun mutate( - file: File, - probe: LivenessProbe, - transform: (Map<String, Entry>) -> Map<String, Entry>, - ) { - file.parentFile?.mkdirs() - // Two-layer lock: synchronize in-JVM threads on `jvmLockFor(file)` so - // racing threads serialize their RMW; inside the monitor, also take the - // OS-level file lock so racing JVMs (two `trailblaze` invocations) don't - // step on each other. Single-layer file-lock is insufficient because - // `FileChannel.lock()` is process-scoped — two threads in the same JVM - // either get an OverlappingFileLockException or silently bypass the - // lock. See [jvmLocks] for the keyed-monitor rationale. - // The cross-process lock lives on a SIBLING `.lock` file, never on the - // data file itself. The atomic-rename below replaces the data-file - // inode, so if we locked the data file directly, a second JVM that - // opened the path between our acquire and our rename would block on - // the now-orphaned inode, then read stale contents from its - // still-open handle and overwrite our update. Locking a stable lock - // path that nothing renames keeps both writers serialized on the same - // inode for the duration of their RMW. The lock file is touched once - // and never moved or rewritten — opening it for "rw" just creates it - // if missing. - val lockFile = File(file.parentFile, "${file.name}.lock") - // Defensive check: if the lock path exists but isn't a regular file (e.g. - // a user `mkdir`d it by accident, or filesystem weirdness left a directory - // at the path), `RandomAccessFile` will throw a `FileNotFoundException` - // with a misleading message ("Is a directory"). Surface a clear error - // instead so the user knows what to fix. - if (lockFile.exists() && !lockFile.isFile) { - throw IllegalStateException( - "Pin lock path $lockFile is not a regular file (got: ${if (lockFile.isDirectory) "directory" else "other"}). " + - "Remove it and retry.", - ) - } - synchronized(jvmLockFor(file)) { - RandomAccessFile(lockFile, "rw").use { lockRaf -> - lockRaf.channel.lock().use { - val current = if (file.exists() && file.length() > 0) { - runCatching { - json.decodeFromString(PinFile.serializer(), file.readText()).shells - }.getOrDefault(emptyMap()) - } else { - emptyMap() - } - val transformed = transform(current) - // Keep entries whose PID is still alive. Entries with non-numeric - // keys (corrupted file from a manual edit) are dropped — they - // can't refer to a real OS process anyway. - val gced = transformed.filter { (pidStr, _) -> - val pid = pidStr.toLongOrNull() ?: return@filter false - probe(pid) - } - val payload = json.encodeToString(PinFile.serializer(), PinFile(shells = gced)) - // Write to a temp sibling and atomically rename into place. The - // sibling is created next to the data file so the rename is on - // the same filesystem (a cross-device rename would fall back to - // copy+delete, losing atomicity). - val tmp = File(file.parentFile, "${file.name}.tmp") - tmp.writeText(payload) - Files.move( - tmp.toPath(), - file.toPath(), - StandardCopyOption.REPLACE_EXISTING, - StandardCopyOption.ATOMIC_MOVE, - ) - } - } - } - } - - private fun readMapOrEmpty(file: File): PinFile = - runCatching { json.decodeFromString(PinFile.serializer(), file.readText()) } - .getOrDefault(PinFile()) - - /** - * Default production liveness check. Returns `true` when [pid] is bound to - * a currently-running process. `ProcessHandle.of` returns - * `Optional.empty()` for non-existent PIDs on Unix; the additional - * `isAlive` check covers zombie/exiting states where the PID still - * resolves but the process is gone. - */ - private fun isPidAlive(pid: Long): Boolean = - ProcessHandle.of(pid).map { it.isAlive }.orElse(false) -} diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt index 7910e8cbd..c66b98926 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/SnapshotCommand.kt @@ -22,7 +22,7 @@ class SnapshotCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION], + description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt index 80e64f7d8..4ae00691c 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/StepCommand.kt @@ -68,7 +68,7 @@ class StepCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION] + description = ["Device: platform (android, ios, web) or platform/id (e.g., android/emulator-5554). Required for interactive step/verify execution."] ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt index f1b66a9d6..ae146ae98 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolCommand.kt @@ -63,7 +63,7 @@ class ToolCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION], + description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt index 9a967b5e7..5540fccd2 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/ToolboxCommand.kt @@ -85,7 +85,7 @@ class ToolboxCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION], + description = ["Target device (e.g. android, android/emulator-5554)."], ) var device: String? = null diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt index 75057219d..765a23331 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/TrailCommand.kt @@ -128,7 +128,7 @@ open class TrailCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION] + description = ["Device: platform (android, ios, web), platform/instance-id, or instance ID"] ) var device: String? = null @@ -481,26 +481,15 @@ open class TrailCommand : Callable<Int> { // fire for the multi-device / no-device cases (its message lists available devices in // the trail-runner-specific shape, which is more useful than the standard one here). // - // The inlined tier order mirrors `resolveDeviceWithAutodetect`: - // 1. `--device` flag (already handled above when non-blank) - // 2. `TRAILBLAZE_DEVICE` env var - // 3. This terminal's file-pin (added so `trailblaze device connect X` followed - // by `trailblaze run …` inherits the device — pre-fix, the resolver skipped - // straight from env to autodetect and a pinned multi-device shell hit the - // multi-device error) - // 4. Autodetect (exactly one connected device) - // 5. Workspace config's `cliDevicePlatform` (trail-runner-specific) - // // Guard on `isNullOrBlank()` (not `== null`) so a stray `--device ""` / - // `--device " "` falls through to env/pin/autodetect/config rather than being + // `--device " "` falls through to env/autodetect/config rather than being // forwarded to the runner verbatim — letting a blank string slip through // would surface as a cryptic "Device '' not found" mid-pipeline. Same // treatment `resolveCliDevice` applies to the env var. - val port = parent.getEffectivePort() if (device.isNullOrBlank()) { device = resolveCliDevice(null) - ?: readShellPinDevice(port) ?: run { + val port = parent.getEffectivePort() val autodetected = runBlocking { autodetectSingleConnectedDevice(port) } if (autodetected is DeviceAutodetectResult.Resolved) { reportAutodetectedDevice(autodetected.deviceSpec) @@ -1165,13 +1154,6 @@ open class TrailCommand : Callable<Int> { // Resolve target app: prefer trail config's `target` field, fall back to settings selection. // This ensures custom tools (e.g., myApp_launchSignedIn) are registered for the // correct app even when the desktop UI has a different app selected. - // - // Deliberately does NOT consult the per-terminal target pin (`resolveCliTargetPin`). - // Trails are reusable artifacts that travel between users and CI — if a trail needs - // a target, it declares one in its config. Inheriting the caller's terminal pin would - // make the same trail behave differently between developers, which defeats the - // determinism contract. The device pin IS consulted (above, in the resolver chain) - // because the device a trail runs on is operator-scoped, not trail-scoped. val targetTestApp = trailConfig?.target?.let { config.availableAppTargets.findById(it) } ?: app.deviceManager.getCurrentSelectedTargetApp() if (verbose) { diff --git a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt index 64a3a5661..b1c4cb819 100644 --- a/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt +++ b/trailblaze-host/src/main/java/xyz/block/trailblaze/cli/VerifyCommand.kt @@ -30,7 +30,7 @@ class VerifyCommand : Callable<Int> { @Option( names = ["-d", "--device"], - description = [DEVICE_OPTION_DESCRIPTION], + description = ["Device: platform (android, ios, web) or platform/id. Defaults to \$TRAILBLAZE_DEVICE."], ) var device: String? = null diff --git a/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt b/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt deleted file mode 100644 index b4c4702f8..000000000 --- a/trailblaze-host/src/test/java/xyz/block/trailblaze/cli/ShellDevicePinStoreTest.kt +++ /dev/null @@ -1,406 +0,0 @@ -package xyz.block.trailblaze.cli - -import java.io.File -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue -import org.junit.Rule -import org.junit.rules.TemporaryFolder - -/** - * Tests for [ShellDevicePinStore]. - * - * Coverage focuses on the contract that the CLI resolver depends on: - * - * - Cold-start (file missing) returns NotFound without creating the file. - * - Round-trip set → resolve returns the pinned device. - * - Dead PID (probe returns false) → NotFound + eviction. - * - Concurrent terminals (different PIDs) coexist; clearing one preserves the other. - * - Garbage collection runs opportunistically on every mutation so a long-lived - * file doesn't accumulate dead entries forever. - * - Concurrent writers under file locking don't lose updates. - * - Port scoping: two daemons get independent files. - * - Corrupted file content is treated as empty rather than throwing. - * - Non-numeric keys (corrupted file) get dropped on the next mutation. - * - * The liveness probe is injected as a deterministic lambda so tests don't depend - * on real PIDs. Production wires it to `ProcessHandle.of(pid).map { it.isAlive }`. - */ -class ShellDevicePinStoreTest { - - @Rule - @JvmField - val tmp = TemporaryFolder() - - private fun newFile(): File = File(tmp.root, "shell-device-pins-52525.json") - - /** Probe that reports every PID as alive. */ - private val allAlive = ShellDevicePinStore.LivenessProbe { _ -> true } - - /** Probe that reports every PID as dead. */ - private val allDead = ShellDevicePinStore.LivenessProbe { _ -> false } - - @Test - fun `resolvePin returns NotFound when file does not exist`() { - val file = newFile() - assertFalse(file.exists(), "precondition: file should not exist") - val result = ShellDevicePinStore.resolvePin(file, shellPid = 12345L, probe = allAlive) - assertEquals(ShellDevicePinStore.PinLookup.NotFound, result) - assertFalse(file.exists(), "resolvePin must not create the file on a cold read") - } - - @Test - fun `setPin then resolvePin round-trips the device`() { - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - assertEquals(ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), result) - } - - @Test - fun `setPin with target round-trips both fields`() { - // Persisting the target is what makes `device connect --target X` survive - // a daemon restart — see PR #3611 review feedback. Round-trip via resolve - // to confirm the target field is JSON-encoded and decoded correctly, and - // accessible via the convenience getter on PinLookup.Found. - val file = newFile() - ShellDevicePinStore.setPin( - file, - 12345L, - device = "android/emulator-5554", - target = "sampleapp", - probe = allAlive, - ) - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - val found = result as? ShellDevicePinStore.PinLookup.Found - assertEquals("android/emulator-5554", found?.device) - assertEquals("sampleapp", found?.target) - } - - @Test - fun `setPin without target preserves null target on read`() { - // Users who pin a bare `device connect` (no --target) should land on a - // null target so the resolver falls through to env / workspace config / - // built-in default rather than re-applying a stale value. - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - val found = result as? ShellDevicePinStore.PinLookup.Found - assertEquals("android/emulator-5554", found?.device) - assertEquals(null, found?.target) - } - - @Test - fun `mutate throws IllegalStateException when lock path exists as a directory`() { - // A corrupted ~/.trailblaze/ state (user mkdir'd the lock path, filesystem - // weirdness, etc.) should surface a clear error naming the path — not the - // misleading "Is a directory" FileNotFoundException that RandomAccessFile - // would otherwise throw mid-lock. See lead-dev-review finding from - // PR #3611 — the defensive check fires early to keep the failure - // self-diagnostic. - val file = newFile() - file.parentFile.mkdirs() - val lockPath = java.io.File(file.parentFile, "${file.name}.lock") - lockPath.mkdirs() - assertTrue(lockPath.isDirectory, "precondition: lock path must be a directory") - - val ex = kotlin.runCatching { - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - }.exceptionOrNull() - assertTrue(ex is IllegalStateException, "expected IllegalStateException, got: $ex") - assertTrue( - ex.message?.contains(lockPath.name) == true, - "exception message should name the bad lock path: got: ${ex.message}", - ) - } - - @Test - fun `clearPinTarget atomically nulls the target while preserving the device`() { - // The atomic variant (single mutate() lock window) used by --target=clear. - // Replaces the resolvePin-then-setPin sequence that had a same-PID race - // window in the rare case of concurrent ./trailblaze invocations from - // one backgrounded shell. - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "sampleapp", probe = allAlive) - - ShellDevicePinStore.clearPinTarget(file, 12345L, probe = allAlive) - - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - val found = result as? ShellDevicePinStore.PinLookup.Found - assertEquals("android/emulator-5554", found?.device, "device must survive a target-only clear") - assertEquals(null, found?.target, "target must be null after clearPinTarget") - } - - @Test - fun `clearPinTarget is a no-op when entry is absent`() { - // Cold-file case: no entry for this PID at all → nothing to clear → the - // function must not create a phantom entry. (Some non-target-clear - // workflow could rely on this — defensive coverage.) - val file = newFile() - ShellDevicePinStore.clearPinTarget(file, 12345L, probe = allAlive) - assertEquals( - ShellDevicePinStore.PinLookup.NotFound, - ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), - ) - } - - @Test - fun `clearPinTarget on an already-null target leaves the entry intact`() { - // After the first clear, subsequent clears should leave the entry's - // device intact and the target null. (mutate() does still rewrite the - // file even when the transform is a no-op — that's an accepted cost - // for the simpler implementation; the property we care about is that - // the entry's value is unchanged.) - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = null, probe = allAlive) - ShellDevicePinStore.clearPinTarget(file, 12345L, probe = allAlive) - - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - val found = result as? ShellDevicePinStore.PinLookup.Found - assertEquals("android/emulator-5554", found?.device, "device must remain intact") - assertEquals(null, found?.target, "target stays null") - } - - @Test - fun `setPin with target=null clears only the target, preserving the device`() { - // Models the `--target=clear` flow: clear the target field on the pin - // without disconnecting the device. The user's terminal stays bound to - // its device; the next action call falls through to env / workspace - // config for the target instead of re-applying the cleared one. - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "sampleapp", probe = allAlive) - // Surgery: same PID, same device, null target. - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = null, probe = allAlive) - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - val found = result as? ShellDevicePinStore.PinLookup.Found - assertEquals("android/emulator-5554", found?.device, "device pin must survive a target clear") - assertEquals(null, found?.target, "target must be null after the clear") - } - - @Test - fun `setPin overwrites prior target when called again`() { - // `device rebind --target Y` re-writes the pin with the new target. - // Confirm the second write replaces, not merges, the prior target. - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "sampleapp", probe = allAlive) - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", target = "square", probe = allAlive) - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - assertEquals("square", (result as? ShellDevicePinStore.PinLookup.Found)?.target) - } - - @Test - fun `pin file written by older code without target field still deserializes`() { - // Backwards compat: existing pin files from before this PR's target field - // have entries shaped like {"device": "android/..."}. The new Entry's - // `target: String? = null` default needs to handle that gracefully on - // read so a user who upgrades doesn't lose their device pin. - val file = newFile() - file.parentFile.mkdirs() - file.writeText( - """ - { - "shells": { - "12345": { "device": "android/emulator-5554" } - } - } - """.trimIndent(), - ) - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - val found = result as? ShellDevicePinStore.PinLookup.Found - assertEquals("android/emulator-5554", found?.device) - assertEquals(null, found?.target) - } - - @Test - fun `resolvePin returns NotFound and evicts when the PID is no longer alive`() { - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allDead) - assertEquals(ShellDevicePinStore.PinLookup.NotFound, result) - - val after = ShellDevicePinStore.readAll(file) - assertFalse(after.containsKey(12345L), "dead-PID entry must be evicted") - } - - @Test - fun `pins for different shells coexist`() { - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - ShellDevicePinStore.setPin(file, 67890L, "ios/iPhone-15", probe = allAlive) - - assertEquals( - ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), - ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), - ) - assertEquals( - ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("ios/iPhone-15")), - ShellDevicePinStore.resolvePin(file, 67890L, probe = allAlive), - ) - } - - @Test - fun `setting the same PID twice replaces the prior device`() { - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5556", probe = allAlive) - - assertEquals( - ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5556")), - ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), - ) - } - - @Test - fun `clearPin removes the entry but preserves other terminals' pins`() { - val file = newFile() - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - ShellDevicePinStore.setPin(file, 67890L, "ios/iPhone-15", probe = allAlive) - - ShellDevicePinStore.clearPin(file, 12345L, probe = allAlive) - - assertEquals( - ShellDevicePinStore.PinLookup.NotFound, - ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), - ) - assertEquals( - ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("ios/iPhone-15")), - ShellDevicePinStore.resolvePin(file, 67890L, probe = allAlive), - ) - } - - @Test - fun `clearPin is a no-op when no entry exists`() { - val file = newFile() - // Cold file. Should not throw, should not create the file with an empty map - // either (the file gets created by `mutate` to acquire its lock, then ends - // up holding an empty `shells` map — both states are fine, just want no - // exception). - ShellDevicePinStore.clearPin(file, 12345L, probe = allAlive) - assertEquals( - ShellDevicePinStore.PinLookup.NotFound, - ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), - ) - } - - @Test - fun `mutate opportunistically garbage-collects dead entries`() { - val file = newFile() - ShellDevicePinStore.setPin(file, 11111L, "android/emulator-5554", probe = allAlive) - ShellDevicePinStore.setPin(file, 22222L, "android/emulator-5556", probe = allAlive) - ShellDevicePinStore.setPin(file, 33333L, "ios/iPhone-15", probe = allAlive) - - // Probe now reports only PID 22222 as alive. - val partialProbe = ShellDevicePinStore.LivenessProbe { pid -> pid == 22222L } - - // Any mutation should sweep dead entries — use a no-op set on the live PID. - ShellDevicePinStore.setPin(file, 22222L, "android/emulator-5556", probe = partialProbe) - - val after = ShellDevicePinStore.readAll(file) - assertEquals(setOf(22222L), after.keys, "GC must drop dead-PID entries on mutation") - } - - @Test - fun `readAll without eviction returns raw file contents`() { - val file = newFile() - ShellDevicePinStore.setPin(file, 11111L, "android/emulator-5554", probe = allAlive) - ShellDevicePinStore.setPin(file, 22222L, "android/emulator-5556", probe = allAlive) - - val all = ShellDevicePinStore.readAll(file) - assertEquals(2, all.size) - assertEquals("android/emulator-5554", all[11111L]?.device) - assertEquals("android/emulator-5556", all[22222L]?.device) - } - - @Test - fun `pinFileFor scopes file path by port`() { - val a = ShellDevicePinStore.pinFileFor(52525) - val b = ShellDevicePinStore.pinFileFor(52527) - assertTrue(a.path != b.path, "different ports must yield different file paths") - assertTrue(a.name.contains("52525"), "filename should carry the port: ${a.name}") - assertTrue(b.name.contains("52527"), "filename should carry the port: ${b.name}") - } - - @Test - fun `concurrent writers do not lose updates under file lock`() { - // Spawn N threads each writing a distinct PID's pin. After all join, every - // pin must be present — the file lock + in-JVM monitor serialize the RMW, - // so no thread's write is overwritten by another's stale read. - val file = newFile() - val threadCount = 16 - val threads = (1..threadCount).map { i -> - Thread { - val pid = i.toLong() * 1000 - ShellDevicePinStore.setPin(file, pid, "device-$i", probe = allAlive) - } - } - threads.forEach { it.start() } - threads.forEach { it.join() } - - val all = ShellDevicePinStore.readAll(file) - assertEquals(threadCount, all.size, "every concurrent write must be present") - for (i in 1..threadCount) { - val pid = i.toLong() * 1000 - assertEquals("device-$i", all[pid]?.device, "lost write for PID $pid") - } - } - - @Test - fun `corrupted file is treated as empty, not as an error`() { - val file = newFile() - file.parentFile.mkdirs() - file.writeText("{not valid json at all") - - // Read should treat this as empty, not throw. - val result = ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive) - assertEquals(ShellDevicePinStore.PinLookup.NotFound, result) - - // Write should overwrite the corruption cleanly. - ShellDevicePinStore.setPin(file, 12345L, "android/emulator-5554", probe = allAlive) - assertEquals( - ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), - ShellDevicePinStore.resolvePin(file, 12345L, probe = allAlive), - ) - } - - @Test - fun `entries with non-numeric keys are dropped on mutation`() { - val file = newFile() - file.parentFile.mkdirs() - // Hand-craft a file with a non-numeric key (someone edited it; or it came - // from a future version with a different key format). - file.writeText( - """ - { - "shells": { - "abc": { "device": "android/foo" }, - "12345": { "device": "android/emulator-5554" } - } - } - """.trimIndent(), - ) - - // Triggering any mutation should drop the non-numeric key while preserving - // the valid one. - ShellDevicePinStore.setPin(file, 67890L, "ios/iPhone-15", probe = allAlive) - - val all = ShellDevicePinStore.readAll(file) - assertEquals(setOf(12345L, 67890L), all.keys, "non-numeric keys must not survive a mutation") - } - - @Test - fun `setPin creates the parent directory if missing`() { - // Use a path under a not-yet-existing subdirectory to assert mkdirs() runs. - val nested = File(tmp.root, "deeply/nested/dir/shell-device-pins-52525.json") - assertFalse(nested.parentFile.exists(), "precondition: parent dir should not exist") - - ShellDevicePinStore.setPin(nested, 12345L, "android/emulator-5554", probe = allAlive) - - assertTrue(nested.exists(), "file should be created") - assertEquals( - ShellDevicePinStore.PinLookup.Found(ShellDevicePinStore.Entry("android/emulator-5554")), - ShellDevicePinStore.resolvePin(nested, 12345L, probe = allAlive), - ) - } -} diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt index 8dbd6c47b..bc87a6d07 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-ask.txt @@ -11,11 +11,7 @@ Ask a question about what's on screen (uses AI vision, no actions taken) <questionWords>... Question about the screen (e.g., 'What's the current balance?') -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to `$TRAILBLAZE_DEVICE` if set (manual - override; rare), otherwise this terminal's pin - (set by `trailblaze device connect`). In a - fresh-shell harness (Claude Code, Cursor, Codex, - CI), pass --device on every call. + Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt index ba9489649..d6e134c34 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-connect.txt @@ -8,8 +8,8 @@ Usage: trailblaze device connect [-hV] [--headless=<headless>] [--mcp-session=<mcpSessionOverride>] [-t=<target>] <platform> -Connect a device + target and pin them for this terminal so subsequent commands -inherit the binding +Connect a device + target to your session (use `eval $(...)` to pin +TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell) <platform> Device platform: ANDROID, IOS, or WEB (optionally with instance: android/emulator-5554) -h, --help Show this help message and exit. @@ -29,9 +29,8 @@ inherit the binding unbound MCP client (Claude Desktop, Cursor, Goose, …). No-op when no MCP clients are connected. -t, --target=<target> Target app to bind to this device's session (e.g. - `default`, `sampleapp`). Optional. When set, the - target is recorded alongside the device in this - terminal's pin so subsequent CLI calls re-apply the - binding automatically until you `device disconnect` - or pin a different target. + `default`, `sampleapp`). Optional. When set, `eval + $(trailblaze device connect ... --target X)` also + exports $TRAILBLAZE_TARGET so subsequent CLI calls + in this shell re-apply the binding automatically. -V, --version Print version information and exit. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt index 91c2f000f..ced8a8dcd 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-disconnect.txt @@ -6,10 +6,8 @@ # small wording / spacing changes can be intentional or accidental. # ---------------------------------------------------------------------- Usage: trailblaze device disconnect [-hV] [-d=<device>] -Disconnect a device and clear this terminal's pin - -d, --device=<device> Device to disconnect. Defaults to - `$TRAILBLAZE_DEVICE` if set manually, otherwise - this terminal's pin (set by `trailblaze device - connect`). +Disconnect a device (use `eval $(...)` to also clear TRAILBLAZE_DEVICE + +TRAILBLAZE_TARGET) + -d, --device=<device> Device to disconnect. Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. -V, --version Print version information and exit. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt index ea910a574..a4a5440a5 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device-rebind.txt @@ -7,9 +7,7 @@ # ---------------------------------------------------------------------- Usage: trailblaze device rebind [-hV] [-d=<device>] -t=<target> Change the target app for the currently-bound device - -d, --device=<device> Device to rebind. Defaults to `$TRAILBLAZE_DEVICE` if - set manually, otherwise this terminal's pin (set by - `trailblaze device connect`). + -d, --device=<device> Device to rebind. Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. -t, --target=<target> New target app for the bound device (e.g. `default`, `sampleapp`). diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt index 06f33ff97..4944cf3a8 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-device.txt @@ -11,9 +11,10 @@ List and connect devices (Android, iOS, Web) -V, --version Print version information and exit. Commands: list List available devices - connect Connect a device + target and pin them for this terminal so - subsequent commands inherit the binding + connect Connect a device + target to your session (use `eval $(...)` to + pin TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET to this shell) rebind Change the target app for the currently-bound device - disconnect Disconnect a device and clear this terminal's pin + disconnect Disconnect a device (use `eval $(...)` to also clear + TRAILBLAZE_DEVICE + TRAILBLAZE_TARGET) create Provision a device with a configured profile (web today; iOS / Android future). diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt index 06891eef4..4eea9f484 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-mcp.txt @@ -18,9 +18,7 @@ Quick setup: Windsurf: Add to MCP config with command 'trailblaze mcp' -d, --device=<device> Pin this MCP session to a device on startup (e.g. android, android/emulator-5554). Defaults to - whatever the launching terminal pinned via - `trailblaze device connect`, or - `$TRAILBLAZE_DEVICE` if set. + $TRAILBLAZE_DEVICE. --direct, --no-daemon Run as an in-process MCP server over STDIO instead of the default proxy mode. Bypasses the Trailblaze diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt index 7c9048325..d36c12a25 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-run.txt @@ -56,13 +56,8 @@ removed in a future release. --compose-port=<composePort> RPC port for Compose driver connections (default: 52600) - -d, --device=<device> Device: platform (android, ios, web) or - platform/id. Defaults to `$TRAILBLAZE_DEVICE` if - set (manual override; rare), otherwise this - terminal's pin (set by `trailblaze device - connect`). In a fresh-shell harness (Claude - Code, Cursor, Codex, CI), pass --device on every - call. + -d, --device=<device> Device: platform (android, ios, web), + platform/instance-id, or instance ID --driver=<driverType> Driver type to use (e.g., PLAYWRIGHT_NATIVE, ANDROID_ONDEVICE_INSTRUMENTATION). Overrides driver from trail config. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt index d95fb79bd..5a74608bc 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-end.txt @@ -8,11 +8,7 @@ Usage: trailblaze session end [-hV] [-d=<device>] [-n=<name>] End the CLI session and release the device (deprecated: use 'stop' instead) -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to `$TRAILBLAZE_DEVICE` if set (manual - override; rare), otherwise this terminal's pin (set - by `trailblaze device connect`). In a fresh-shell - harness (Claude Code, Cursor, Codex, CI), pass - --device on every call. + Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. -n, --name=<name> Save the recording as a trail before ending -V, --version Print version information and exit. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt index 7c49c3159..d8d3fa4a1 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-start.txt @@ -10,11 +10,7 @@ Usage: trailblaze session start [-hvV] [--no-logs] [--no-video] [-d=<device>] [--target=<target>] [--title=<title>] Start a new session with automatic video and log capture -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to `$TRAILBLAZE_DEVICE` if set (manual - override; rare), otherwise this terminal's pin (set - by `trailblaze device connect`). In a fresh-shell - harness (Claude Code, Cursor, Codex, CI), pass - --device on every call. + Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser @@ -30,12 +26,11 @@ Start a new session with automatic video and log capture future commands. --no-logs Disable device log capture --no-video Disable video capture - --target=<target> Target app ID for this session's bound device. - Defaults to `$TRAILBLAZE_TARGET` if set, otherwise - the target you passed to `trailblaze device connect - --target X` for this terminal (persists in this - terminal's pin; cleared by `device disconnect`, - replaced by `device rebind --target Y`). Pass + --target=<target> Target app ID for this session's bound device. Scoped + to the device as a daemon-process override (dies on + daemon restart or device release). Defaults to + `$TRAILBLAZE_TARGET` — typically set via `eval + $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override. To set a persistent default, use `trailblaze config target`. diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt index 6b2db465d..78610d549 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-session-stop.txt @@ -8,11 +8,7 @@ Usage: trailblaze session stop [-hV] [--save] [-d=<device>] [-t=<title>] Stop the current session and finalize captures -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to `$TRAILBLAZE_DEVICE` if set (manual - override; rare), otherwise this terminal's pin (set - by `trailblaze device connect`). In a fresh-shell - harness (Claude Code, Cursor, Codex, CI), pass - --device on every call. + Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. --save Save session as a trail before stopping -t, --title=<title> Trail title when saving (overrides session title) diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt index 526f61592..25319c3ef 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-snapshot.txt @@ -12,11 +12,7 @@ Capture the current screen's UI tree (fast, no AI, no actions) filtered as non-interactive --bounds Include bounding box {x,y,w,h} for each element -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to `$TRAILBLAZE_DEVICE` if set (manual - override; rare), otherwise this terminal's pin (set - by `trailblaze device connect`). In a fresh-shell - harness (Claude Code, Cursor, Codex, CI), pass - --device on every call. + Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt index f40626086..5c2136d55 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-step.txt @@ -17,12 +17,9 @@ Requires an LLM provider configured (`trailblaze config llm`). visible') --context=<context> Context from previous steps for situational awareness - -d, --device=<device> Device: platform (android, ios, web) or - platform/id. Defaults to `$TRAILBLAZE_DEVICE` if - set (manual override; rare), otherwise this - terminal's pin (set by `trailblaze device - connect`). In a fresh-shell harness (Claude Code, - Cursor, Codex, CI), pass --device on every call. + -d, --device=<device> Device: platform (android, ios, web) or platform/id + (e.g., android/emulator-5554). Required for + interactive step/verify execution. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on @@ -50,12 +47,11 @@ Requires an LLM provider configured (`trailblaze config llm`). the captured tree includes what's actually behind the overlay. --target=<target> Target app ID for this command's bound device. - Defaults to `$TRAILBLAZE_TARGET` if set, - otherwise the target you passed to `trailblaze - device connect --target X` for this terminal - (persists in this terminal's pin; cleared by - `device disconnect`, replaced by `device rebind - --target Y`). Pass `--target=clear` to remove a + Scoped to the device as a daemon-process override + (dies on daemon restart or device release). + Defaults to `$TRAILBLAZE_TARGET` — typically set + via `eval $(trailblaze device connect ... + --target X)`. Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List available targets with `trailblaze diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt index 4ac3bbc55..055017754 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-tool.txt @@ -13,11 +13,7 @@ Run a Trailblaze tool by name (e.g., tap, inputText) [<argPairs>...] Tool arguments as key=value pairs (e.g., ref="Sign In") -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to `$TRAILBLAZE_DEVICE` if set (manual - override; rare), otherwise this terminal's pin (set - by `trailblaze device connect`). In a fresh-shell - harness (Claude Code, Cursor, Codex, CI), pass - --device on every call. + Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser @@ -39,12 +35,11 @@ Run a Trailblaze tool by name (e.g., tap, inputText) require-steps true` is set. (`--objective` / `-o` are deprecated aliases of `--step` / `-s`.) - --target=<target> Target app ID for this command's bound device. - Defaults to `$TRAILBLAZE_TARGET` if set, otherwise - the target you passed to `trailblaze device connect - --target X` for this terminal (persists in this - terminal's pin; cleared by `device disconnect`, - replaced by `device rebind --target Y`). Pass + --target=<target> Target app ID for this command's bound device. Scoped + to the device as a daemon-process override (dies on + daemon restart or device release). Defaults to + `$TRAILBLAZE_TARGET` — typically set via `eval + $(trailblaze device connect ... --target X)`. Pass `--target=clear` to remove a previously-set override for this device. To set a persistent default, use `trailblaze config target`. List diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt index 30d81c5e8..70e600e78 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-toolbox.txt @@ -19,12 +19,7 @@ Browse available tools by target app and platform Omit to show everything; trailheads and shortcuts will be called out as headline sections above the toolset listing. - -d, --device=<device> Device: platform (android, ios, web) or platform/id. - Defaults to `$TRAILBLAZE_DEVICE` if set (manual - override; rare), otherwise this terminal's pin (set - by `trailblaze device connect`). In a fresh-shell - harness (Claude Code, Cursor, Codex, CI), pass - --device on every call. + -d, --device=<device> Target device (e.g. android, android/emulator-5554). --detail Show full parameter descriptions for all tools -h, --help Show this help message and exit. -n, --name=<name> Show details for a single tool by name diff --git a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt index 3ec707742..d939b1ad7 100644 --- a/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt +++ b/trailblaze-host/src/test/resources/cli-output-baselines/help-trailblaze-verify.txt @@ -11,11 +11,7 @@ Check a condition on screen and pass/fail (exit code 0/1, ideal for CI) <assertionWords>... Assertion to verify (e.g., 'The Sign In button is visible') -d, --device=<device> Device: platform (android, ios, web) or - platform/id. Defaults to `$TRAILBLAZE_DEVICE` if - set (manual override; rare), otherwise this - terminal's pin (set by `trailblaze device - connect`). In a fresh-shell harness (Claude Code, - Cursor, Codex, CI), pass --device on every call. + platform/id. Defaults to $TRAILBLAZE_DEVICE. -h, --help Show this help message and exit. --headless=<headless> For --device web/...: launch the Playwright browser headless. When omitted, auto-detects: headless on From 29dc9666631e1895aa34539188dd6d87d167c72c Mon Sep 17 00:00:00 2001 From: Sam Edwards <samedwards@squareup.com> Date: Sun, 31 May 2026 20:24:46 -0400 Subject: [PATCH 7/7] Fix --- .../trails/.trailblaze/sdk/dist/index.d.ts | 6408 ++++ .../trails/.trailblaze/sdk/dist/index.js | 31848 ++++++++++++++++ .../trails/.trailblaze/sdk/dist/testing.d.ts | 730 + .../trails/.trailblaze/sdk/dist/testing.js | 206 + .../wikipedia/trails/config/dist/.bundle.hash | 1 + .../wikipedia/trails/config/dist/.bundle.lock | 0 .../trails/config/dist/targets/wikipedia.yaml | 303 + .../wikipedia/tools/trailblaze-client.d.ts | 30 + .../playwright/PlaywrightScreenState.kt | 55 +- 9 files changed, 39578 insertions(+), 3 deletions(-) create mode 100644 examples/wikipedia/trails/.trailblaze/sdk/dist/index.d.ts create mode 100644 examples/wikipedia/trails/.trailblaze/sdk/dist/index.js create mode 100644 examples/wikipedia/trails/.trailblaze/sdk/dist/testing.d.ts create mode 100644 examples/wikipedia/trails/.trailblaze/sdk/dist/testing.js create mode 100644 examples/wikipedia/trails/config/dist/.bundle.hash create mode 100644 examples/wikipedia/trails/config/dist/.bundle.lock create mode 100644 examples/wikipedia/trails/config/dist/targets/wikipedia.yaml diff --git a/examples/wikipedia/trails/.trailblaze/sdk/dist/index.d.ts b/examples/wikipedia/trails/.trailblaze/sdk/dist/index.d.ts new file mode 100644 index 000000000..96afbe2c5 --- /dev/null +++ b/examples/wikipedia/trails/.trailblaze/sdk/dist/index.d.ts @@ -0,0 +1,6408 @@ +// Generated by dts-bundle-generator v9.5.1 + +export interface RunOptions { + /** + * Server implementation name advertised on `initialize`. Defaults to a stable string so the + * host can recognize SDK-authored subprocesses in server-side logs. Override when you want + * your toolset identifiable in multi-subprocess sessions. + */ + name?: string; + /** Advertised version. Author-owned — doesn't have to track Trailblaze's version. */ + version?: string; +} +/** + * Connects the MCP server and registers every tool declared via [tool]. On host, binds + * stdio; on-device, binds the pre-installed in-process transport. Resolves when the + * handshake has completed; the runtime then handles requests until stdin closes (host) or + * the QuickJS session ends (on-device). + */ +export declare function run(options?: RunOptions): Promise<void>; +export type Primitive = string | number | symbol | bigint | boolean | null | undefined; +declare namespace util { + type AssertEqual<T, U> = (<V>() => V extends T ? 1 : 2) extends <V>() => V extends U ? 1 : 2 ? true : false; + export type isAny<T> = 0 extends 1 & T ? true : false; + export const assertEqual: <A, B>(_: AssertEqual<A, B>) => void; + export function assertIs<T>(_arg: T): void; + export function assertNever(_x: never): never; + export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; + export type OmitKeys<T, K extends string> = Pick<T, Exclude<keyof T, K>>; + export type MakePartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>; + export type Exactly<T, X> = T & Record<Exclude<keyof X, keyof T>, never>; + export type InexactPartial<T> = { + [k in keyof T]?: T[k] | undefined; + }; + export const arrayToEnum: <T extends string, U extends [ + T, + ...T[] + ]>(items: U) => { + [k in U[number]]: k; + }; + export const getValidEnumValues: (obj: any) => any[]; + export const objectValues: (obj: any) => any[]; + export const objectKeys: ObjectConstructor["keys"]; + export const find: <T>(arr: T[], checker: (arg: T) => any) => T | undefined; + export type identity<T> = objectUtil.identity<T>; + export type flatten<T> = objectUtil.flatten<T>; + export type noUndefined<T> = T extends undefined ? never : T; + export const isInteger: NumberConstructor["isInteger"]; + export function joinValues<T extends any[]>(array: T, separator?: string): string; + export const jsonStringifyReplacer: (_: string, value: any) => any; + export {}; +} +declare namespace objectUtil { + export type MergeShapes<U, V> = keyof U & keyof V extends never ? U & V : { + [k in Exclude<keyof U, keyof V>]: U[k]; + } & V; + type optionalKeys<T extends object> = { + [k in keyof T]: undefined extends T[k] ? k : never; + }[keyof T]; + type requiredKeys<T extends object> = { + [k in keyof T]: undefined extends T[k] ? never : k; + }[keyof T]; + export type addQuestionMarks<T extends object, _O = any> = { + [K in requiredKeys<T>]: T[K]; + } & { + [K in optionalKeys<T>]?: T[K]; + } & { + [k in keyof T]?: unknown; + }; + export type identity<T> = T; + export type flatten<T> = identity<{ + [k in keyof T]: T[k]; + }>; + export type noNeverKeys<T> = { + [k in keyof T]: [ + T[k] + ] extends [ + never + ] ? never : k; + }[keyof T]; + export type noNever<T> = identity<{ + [k in noNeverKeys<T>]: k extends keyof T ? T[k] : never; + }>; + export const mergeShapes: <U, T>(first: U, second: T) => T & U; + export type extendShape<A extends object, B extends object> = keyof A & keyof B extends never ? A & B : { + [K in keyof A as K extends keyof B ? never : K]: A[K]; + } & { + [K in keyof B]: B[K]; + }; + export {}; +} +declare const ZodParsedType: { + string: "string"; + nan: "nan"; + number: "number"; + integer: "integer"; + float: "float"; + boolean: "boolean"; + date: "date"; + bigint: "bigint"; + symbol: "symbol"; + function: "function"; + undefined: "undefined"; + null: "null"; + array: "array"; + object: "object"; + unknown: "unknown"; + promise: "promise"; + void: "void"; + never: "never"; + map: "map"; + set: "set"; +}; +export type ZodParsedType = keyof typeof ZodParsedType; +export type allKeys<T> = T extends any ? keyof T : never; +export type typeToFlattenedError<T, U = string> = { + formErrors: U[]; + fieldErrors: { + [P in allKeys<T>]?: U[]; + }; +}; +declare const ZodIssueCode: { + custom: "custom"; + invalid_type: "invalid_type"; + too_big: "too_big"; + too_small: "too_small"; + not_multiple_of: "not_multiple_of"; + unrecognized_keys: "unrecognized_keys"; + invalid_union: "invalid_union"; + invalid_literal: "invalid_literal"; + invalid_union_discriminator: "invalid_union_discriminator"; + invalid_enum_value: "invalid_enum_value"; + invalid_arguments: "invalid_arguments"; + invalid_return_type: "invalid_return_type"; + invalid_date: "invalid_date"; + invalid_string: "invalid_string"; + invalid_intersection_types: "invalid_intersection_types"; + not_finite: "not_finite"; +}; +export type ZodIssueCode = keyof typeof ZodIssueCode; +export type ZodIssueBase = { + path: (string | number)[]; + message?: string | undefined; +}; +export interface ZodInvalidTypeIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_type; + expected: ZodParsedType; + received: ZodParsedType; +} +export interface ZodInvalidLiteralIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_literal; + expected: unknown; + received: unknown; +} +export interface ZodUnrecognizedKeysIssue extends ZodIssueBase { + code: typeof ZodIssueCode.unrecognized_keys; + keys: string[]; +} +export interface ZodInvalidUnionIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_union; + unionErrors: ZodError[]; +} +export interface ZodInvalidUnionDiscriminatorIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_union_discriminator; + options: Primitive[]; +} +export interface ZodInvalidEnumValueIssue extends ZodIssueBase { + received: string | number; + code: typeof ZodIssueCode.invalid_enum_value; + options: (string | number)[]; +} +export interface ZodInvalidArgumentsIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_arguments; + argumentsError: ZodError; +} +export interface ZodInvalidReturnTypeIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_return_type; + returnTypeError: ZodError; +} +export interface ZodInvalidDateIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_date; +} +export type StringValidation = "email" | "url" | "emoji" | "uuid" | "nanoid" | "regex" | "cuid" | "cuid2" | "ulid" | "datetime" | "date" | "time" | "duration" | "ip" | "cidr" | "base64" | "jwt" | "base64url" | { + includes: string; + position?: number | undefined; +} | { + startsWith: string; +} | { + endsWith: string; +}; +export interface ZodInvalidStringIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_string; + validation: StringValidation; +} +export interface ZodTooSmallIssue extends ZodIssueBase { + code: typeof ZodIssueCode.too_small; + minimum: number | bigint; + inclusive: boolean; + exact?: boolean; + type: "array" | "string" | "number" | "set" | "date" | "bigint"; +} +export interface ZodTooBigIssue extends ZodIssueBase { + code: typeof ZodIssueCode.too_big; + maximum: number | bigint; + inclusive: boolean; + exact?: boolean; + type: "array" | "string" | "number" | "set" | "date" | "bigint"; +} +export interface ZodInvalidIntersectionTypesIssue extends ZodIssueBase { + code: typeof ZodIssueCode.invalid_intersection_types; +} +export interface ZodNotMultipleOfIssue extends ZodIssueBase { + code: typeof ZodIssueCode.not_multiple_of; + multipleOf: number | bigint; +} +export interface ZodNotFiniteIssue extends ZodIssueBase { + code: typeof ZodIssueCode.not_finite; +} +export interface ZodCustomIssue extends ZodIssueBase { + code: typeof ZodIssueCode.custom; + params?: { + [k: string]: any; + }; +} +export type ZodIssueOptionalMessage = ZodInvalidTypeIssue | ZodInvalidLiteralIssue | ZodUnrecognizedKeysIssue | ZodInvalidUnionIssue | ZodInvalidUnionDiscriminatorIssue | ZodInvalidEnumValueIssue | ZodInvalidArgumentsIssue | ZodInvalidReturnTypeIssue | ZodInvalidDateIssue | ZodInvalidStringIssue | ZodTooSmallIssue | ZodTooBigIssue | ZodInvalidIntersectionTypesIssue | ZodNotMultipleOfIssue | ZodNotFiniteIssue | ZodCustomIssue; +export type ZodIssue = ZodIssueOptionalMessage & { + fatal?: boolean | undefined; + message: string; +}; +export type recursiveZodFormattedError<T> = T extends [ + any, + ...any[] +] ? { + [K in keyof T]?: ZodFormattedError<T[K]>; +} : T extends any[] ? { + [k: number]: ZodFormattedError<T[number]>; +} : T extends object ? { + [K in keyof T]?: ZodFormattedError<T[K]>; +} : unknown; +export type ZodFormattedError<T, U = string> = { + _errors: U[]; +} & recursiveZodFormattedError<NonNullable<T>>; +declare class ZodError<T = any> extends Error { + issues: ZodIssue[]; + get errors(): ZodIssue[]; + constructor(issues: ZodIssue[]); + format(): ZodFormattedError<T>; + format<U>(mapper: (issue: ZodIssue) => U): ZodFormattedError<T, U>; + static create: (issues: ZodIssue[]) => ZodError<any>; + static assert(value: unknown): asserts value is ZodError; + toString(): string; + get message(): string; + get isEmpty(): boolean; + addIssue: (sub: ZodIssue) => void; + addIssues: (subs?: ZodIssue[]) => void; + flatten(): typeToFlattenedError<T>; + flatten<U>(mapper?: (issue: ZodIssue) => U): typeToFlattenedError<T, U>; + get formErrors(): typeToFlattenedError<T, string>; +} +export type stripPath<T extends object> = T extends any ? util.OmitKeys<T, "path"> : never; +export type IssueData = stripPath<ZodIssueOptionalMessage> & { + path?: (string | number)[]; + fatal?: boolean | undefined; +}; +export type ErrorMapCtx = { + defaultError: string; + data: any; +}; +export type ZodErrorMap = (issue: ZodIssueOptionalMessage, _ctx: ErrorMapCtx) => { + message: string; +}; +export type ParseParams = { + path: (string | number)[]; + errorMap: ZodErrorMap; + async: boolean; +}; +export type ParsePathComponent = string | number; +export type ParsePath = ParsePathComponent[]; +export interface ParseContext { + readonly common: { + readonly issues: ZodIssue[]; + readonly contextualErrorMap?: ZodErrorMap | undefined; + readonly async: boolean; + }; + readonly path: ParsePath; + readonly schemaErrorMap?: ZodErrorMap | undefined; + readonly parent: ParseContext | null; + readonly data: any; + readonly parsedType: ZodParsedType; +} +export type ParseInput = { + data: any; + path: (string | number)[]; + parent: ParseContext; +}; +declare class ParseStatus { + value: "aborted" | "dirty" | "valid"; + dirty(): void; + abort(): void; + static mergeArray(status: ParseStatus, results: SyncParseReturnType<any>[]): SyncParseReturnType; + static mergeObjectAsync(status: ParseStatus, pairs: { + key: ParseReturnType<any>; + value: ParseReturnType<any>; + }[]): Promise<SyncParseReturnType<any>>; + static mergeObjectSync(status: ParseStatus, pairs: { + key: SyncParseReturnType<any>; + value: SyncParseReturnType<any>; + alwaysSet?: boolean; + }[]): SyncParseReturnType; +} +export type INVALID = { + status: "aborted"; +}; +declare const INVALID: INVALID; +export type DIRTY<T> = { + status: "dirty"; + value: T; +}; +declare const DIRTY: <T>(value: T) => DIRTY<T>; +export type OK<T> = { + status: "valid"; + value: T; +}; +declare const OK: <T>(value: T) => OK<T>; +export type SyncParseReturnType<T = any> = OK<T> | DIRTY<T> | INVALID; +export type AsyncParseReturnType<T> = Promise<SyncParseReturnType<T>>; +export type ParseReturnType<T> = SyncParseReturnType<T> | AsyncParseReturnType<T>; +declare namespace errorUtil { + type ErrMessage = string | { + message?: string | undefined; + }; + const errToObj: (message?: ErrMessage) => { + message?: string | undefined; + }; + const toString: (message?: ErrMessage) => string | undefined; +} +/** + * The Standard Schema interface. + */ +export type StandardSchemaV1<Input = unknown, Output = Input> = { + /** + * The Standard Schema properties. + */ + readonly "~standard": StandardSchemaV1.Props<Input, Output>; +}; +declare namespace StandardSchemaV1 { + /** + * The Standard Schema properties interface. + */ + export interface Props<Input = unknown, Output = Input> { + /** + * The version number of the standard. + */ + readonly version: 1; + /** + * The vendor name of the schema library. + */ + readonly vendor: string; + /** + * Validates unknown input values. + */ + readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>; + /** + * Inferred types associated with the schema. + */ + readonly types?: Types<Input, Output> | undefined; + } + /** + * The result interface of the validate function. + */ + export type Result<Output> = SuccessResult<Output> | FailureResult; + /** + * The result interface if validation succeeds. + */ + export interface SuccessResult<Output> { + /** + * The typed output value. + */ + readonly value: Output; + /** + * The non-existent issues. + */ + readonly issues?: undefined; + } + /** + * The result interface if validation fails. + */ + export interface FailureResult { + /** + * The issues of failed validation. + */ + readonly issues: ReadonlyArray<Issue>; + } + /** + * The issue interface of the failure output. + */ + export interface Issue { + /** + * The error message of the issue. + */ + readonly message: string; + /** + * The path of the issue, if any. + */ + readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined; + } + /** + * The path segment interface of the issue. + */ + export interface PathSegment { + /** + * The key representing a path segment. + */ + readonly key: PropertyKey; + } + /** + * The Standard Schema types interface. + */ + export interface Types<Input = unknown, Output = Input> { + /** + * The input type of the schema. + */ + readonly input: Input; + /** + * The output type of the schema. + */ + readonly output: Output; + } + /** + * Infers the input type of a Standard Schema. + */ + export type InferInput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["input"]; + /** + * Infers the output type of a Standard Schema. + */ + export type InferOutput<Schema extends StandardSchemaV1> = NonNullable<Schema["~standard"]["types"]>["output"]; + export {}; +} +export interface RefinementCtx { + addIssue: (arg: IssueData) => void; + path: (string | number)[]; +} +export type ZodTypeAny = ZodType<any, any, any>; +export type input<T extends ZodType<any, any, any>> = T["_input"]; +export type output<T extends ZodType<any, any, any>> = T["_output"]; +export type CustomErrorParams = Partial<util.Omit<ZodCustomIssue, "code">>; +export interface ZodTypeDef { + errorMap?: ZodErrorMap | undefined; + description?: string | undefined; +} +export type RawCreateParams = { + errorMap?: ZodErrorMap | undefined; + invalid_type_error?: string | undefined; + required_error?: string | undefined; + message?: string | undefined; + description?: string | undefined; +} | undefined; +export type SafeParseSuccess<Output> = { + success: true; + data: Output; + error?: never; +}; +export type SafeParseError<Input> = { + success: false; + error: ZodError<Input>; + data?: never; +}; +export type SafeParseReturnType<Input, Output> = SafeParseSuccess<Output> | SafeParseError<Input>; +declare abstract class ZodType<Output = any, Def extends ZodTypeDef = ZodTypeDef, Input = Output> { + readonly _type: Output; + readonly _output: Output; + readonly _input: Input; + readonly _def: Def; + get description(): string | undefined; + "~standard": StandardSchemaV1.Props<Input, Output>; + abstract _parse(input: ParseInput): ParseReturnType<Output>; + _getType(input: ParseInput): string; + _getOrReturnCtx(input: ParseInput, ctx?: ParseContext | undefined): ParseContext; + _processInputParams(input: ParseInput): { + status: ParseStatus; + ctx: ParseContext; + }; + _parseSync(input: ParseInput): SyncParseReturnType<Output>; + _parseAsync(input: ParseInput): AsyncParseReturnType<Output>; + parse(data: unknown, params?: util.InexactPartial<ParseParams>): Output; + safeParse(data: unknown, params?: util.InexactPartial<ParseParams>): SafeParseReturnType<Input, Output>; + "~validate"(data: unknown): StandardSchemaV1.Result<Output> | Promise<StandardSchemaV1.Result<Output>>; + parseAsync(data: unknown, params?: util.InexactPartial<ParseParams>): Promise<Output>; + safeParseAsync(data: unknown, params?: util.InexactPartial<ParseParams>): Promise<SafeParseReturnType<Input, Output>>; + /** Alias of safeParseAsync */ + spa: (data: unknown, params?: util.InexactPartial<ParseParams>) => Promise<SafeParseReturnType<Input, Output>>; + refine<RefinedOutput extends Output>(check: (arg: Output) => arg is RefinedOutput, message?: string | CustomErrorParams | ((arg: Output) => CustomErrorParams)): ZodEffects<this, RefinedOutput, Input>; + refine(check: (arg: Output) => unknown | Promise<unknown>, message?: string | CustomErrorParams | ((arg: Output) => CustomErrorParams)): ZodEffects<this, Output, Input>; + refinement<RefinedOutput extends Output>(check: (arg: Output) => arg is RefinedOutput, refinementData: IssueData | ((arg: Output, ctx: RefinementCtx) => IssueData)): ZodEffects<this, RefinedOutput, Input>; + refinement(check: (arg: Output) => boolean, refinementData: IssueData | ((arg: Output, ctx: RefinementCtx) => IssueData)): ZodEffects<this, Output, Input>; + _refinement(refinement: RefinementEffect<Output>["refinement"]): ZodEffects<this, Output, Input>; + superRefine<RefinedOutput extends Output>(refinement: (arg: Output, ctx: RefinementCtx) => arg is RefinedOutput): ZodEffects<this, RefinedOutput, Input>; + superRefine(refinement: (arg: Output, ctx: RefinementCtx) => void): ZodEffects<this, Output, Input>; + superRefine(refinement: (arg: Output, ctx: RefinementCtx) => Promise<void>): ZodEffects<this, Output, Input>; + constructor(def: Def); + optional(): ZodOptional<this>; + nullable(): ZodNullable<this>; + nullish(): ZodOptional<ZodNullable<this>>; + array(): ZodArray<this>; + promise(): ZodPromise<this>; + or<T extends ZodTypeAny>(option: T): ZodUnion<[ + this, + T + ]>; + and<T extends ZodTypeAny>(incoming: T): ZodIntersection<this, T>; + transform<NewOut>(transform: (arg: Output, ctx: RefinementCtx) => NewOut | Promise<NewOut>): ZodEffects<this, NewOut>; + default(def: util.noUndefined<Input>): ZodDefault<this>; + default(def: () => util.noUndefined<Input>): ZodDefault<this>; + brand<B extends string | number | symbol>(brand?: B): ZodBranded<this, B>; + catch(def: Output): ZodCatch<this>; + catch(def: (ctx: { + error: ZodError; + input: Input; + }) => Output): ZodCatch<this>; + describe(description: string): this; + pipe<T extends ZodTypeAny>(target: T): ZodPipeline<this, T>; + readonly(): ZodReadonly<this>; + isOptional(): boolean; + isNullable(): boolean; +} +export interface ZodArrayDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + type: T; + typeName: ZodFirstPartyTypeKind.ZodArray; + exactLength: { + value: number; + message?: string | undefined; + } | null; + minLength: { + value: number; + message?: string | undefined; + } | null; + maxLength: { + value: number; + message?: string | undefined; + } | null; +} +export type ArrayCardinality = "many" | "atleastone"; +export type arrayOutputType<T extends ZodTypeAny, Cardinality extends ArrayCardinality = "many"> = Cardinality extends "atleastone" ? [ + T["_output"], + ...T["_output"][] +] : T["_output"][]; +declare class ZodArray<T extends ZodTypeAny, Cardinality extends ArrayCardinality = "many"> extends ZodType<arrayOutputType<T, Cardinality>, ZodArrayDef<T>, Cardinality extends "atleastone" ? [ + T["_input"], + ...T["_input"][] +] : T["_input"][]> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + get element(): T; + min(minLength: number, message?: errorUtil.ErrMessage): this; + max(maxLength: number, message?: errorUtil.ErrMessage): this; + length(len: number, message?: errorUtil.ErrMessage): this; + nonempty(message?: errorUtil.ErrMessage): ZodArray<T, "atleastone">; + static create: <El extends ZodTypeAny>(schema: El, params?: RawCreateParams) => ZodArray<El>; +} +export type ZodUnionOptions = Readonly<[ + ZodTypeAny, + ...ZodTypeAny[] +]>; +export interface ZodUnionDef<T extends ZodUnionOptions = Readonly<[ + ZodTypeAny, + ZodTypeAny, + ...ZodTypeAny[] +]>> extends ZodTypeDef { + options: T; + typeName: ZodFirstPartyTypeKind.ZodUnion; +} +declare class ZodUnion<T extends ZodUnionOptions> extends ZodType<T[number]["_output"], ZodUnionDef<T>, T[number]["_input"]> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + get options(): T; + static create: <Options extends Readonly<[ + ZodTypeAny, + ZodTypeAny, + ...ZodTypeAny[] + ]>>(types: Options, params?: RawCreateParams) => ZodUnion<Options>; +} +export interface ZodIntersectionDef<T extends ZodTypeAny = ZodTypeAny, U extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + left: T; + right: U; + typeName: ZodFirstPartyTypeKind.ZodIntersection; +} +declare class ZodIntersection<T extends ZodTypeAny, U extends ZodTypeAny> extends ZodType<T["_output"] & U["_output"], ZodIntersectionDef<T, U>, T["_input"] & U["_input"]> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + static create: <TSchema extends ZodTypeAny, USchema extends ZodTypeAny>(left: TSchema, right: USchema, params?: RawCreateParams) => ZodIntersection<TSchema, USchema>; +} +export interface ZodPromiseDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + type: T; + typeName: ZodFirstPartyTypeKind.ZodPromise; +} +declare class ZodPromise<T extends ZodTypeAny> extends ZodType<Promise<T["_output"]>, ZodPromiseDef<T>, Promise<T["_input"]>> { + unwrap(): T; + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + static create: <Inner extends ZodTypeAny>(schema: Inner, params?: RawCreateParams) => ZodPromise<Inner>; +} +export type RefinementEffect<T> = { + type: "refinement"; + refinement: (arg: T, ctx: RefinementCtx) => any; +}; +export type TransformEffect<T> = { + type: "transform"; + transform: (arg: T, ctx: RefinementCtx) => any; +}; +export type PreprocessEffect<T> = { + type: "preprocess"; + transform: (arg: T, ctx: RefinementCtx) => any; +}; +export type Effect<T> = RefinementEffect<T> | TransformEffect<T> | PreprocessEffect<T>; +export interface ZodEffectsDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + schema: T; + typeName: ZodFirstPartyTypeKind.ZodEffects; + effect: Effect<any>; +} +declare class ZodEffects<T extends ZodTypeAny, Output = output<T>, Input = input<T>> extends ZodType<Output, ZodEffectsDef<T>, Input> { + innerType(): T; + sourceType(): T; + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + static create: <I extends ZodTypeAny>(schema: I, effect: Effect<I["_output"]>, params?: RawCreateParams) => ZodEffects<I, I["_output"]>; + static createWithPreprocess: <I extends ZodTypeAny>(preprocess: (arg: unknown, ctx: RefinementCtx) => unknown, schema: I, params?: RawCreateParams) => ZodEffects<I, I["_output"], unknown>; +} +export interface ZodOptionalDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + innerType: T; + typeName: ZodFirstPartyTypeKind.ZodOptional; +} +declare class ZodOptional<T extends ZodTypeAny> extends ZodType<T["_output"] | undefined, ZodOptionalDef<T>, T["_input"] | undefined> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + unwrap(): T; + static create: <Inner extends ZodTypeAny>(type: Inner, params?: RawCreateParams) => ZodOptional<Inner>; +} +export interface ZodNullableDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + innerType: T; + typeName: ZodFirstPartyTypeKind.ZodNullable; +} +declare class ZodNullable<T extends ZodTypeAny> extends ZodType<T["_output"] | null, ZodNullableDef<T>, T["_input"] | null> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + unwrap(): T; + static create: <Inner extends ZodTypeAny>(type: Inner, params?: RawCreateParams) => ZodNullable<Inner>; +} +export interface ZodDefaultDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + innerType: T; + defaultValue: () => util.noUndefined<T["_input"]>; + typeName: ZodFirstPartyTypeKind.ZodDefault; +} +declare class ZodDefault<T extends ZodTypeAny> extends ZodType<util.noUndefined<T["_output"]>, ZodDefaultDef<T>, T["_input"] | undefined> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + removeDefault(): T; + static create: <Inner extends ZodTypeAny>(type: Inner, params: RawCreateParams & { + default: Inner["_input"] | (() => util.noUndefined<Inner["_input"]>); + }) => ZodDefault<Inner>; +} +export interface ZodCatchDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + innerType: T; + catchValue: (ctx: { + error: ZodError; + input: unknown; + }) => T["_input"]; + typeName: ZodFirstPartyTypeKind.ZodCatch; +} +declare class ZodCatch<T extends ZodTypeAny> extends ZodType<T["_output"], ZodCatchDef<T>, unknown> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + removeCatch(): T; + static create: <Inner extends ZodTypeAny>(type: Inner, params: RawCreateParams & { + catch: Inner["_output"] | (() => Inner["_output"]); + }) => ZodCatch<Inner>; +} +export interface ZodBrandedDef<T extends ZodTypeAny> extends ZodTypeDef { + type: T; + typeName: ZodFirstPartyTypeKind.ZodBranded; +} +declare const BRAND: unique symbol; +export type BRAND<T extends string | number | symbol> = { + [BRAND]: { + [k in T]: true; + }; +}; +declare class ZodBranded<T extends ZodTypeAny, B extends string | number | symbol> extends ZodType<T["_output"] & BRAND<B>, ZodBrandedDef<T>, T["_input"]> { + _parse(input: ParseInput): ParseReturnType<any>; + unwrap(): T; +} +export interface ZodPipelineDef<A extends ZodTypeAny, B extends ZodTypeAny> extends ZodTypeDef { + in: A; + out: B; + typeName: ZodFirstPartyTypeKind.ZodPipeline; +} +declare class ZodPipeline<A extends ZodTypeAny, B extends ZodTypeAny> extends ZodType<B["_output"], ZodPipelineDef<A, B>, A["_input"]> { + _parse(input: ParseInput): ParseReturnType<any>; + static create<ASchema extends ZodTypeAny, BSchema extends ZodTypeAny>(a: ASchema, b: BSchema): ZodPipeline<ASchema, BSchema>; +} +export type BuiltIn = (((...args: any[]) => any) | (new (...args: any[]) => any)) | { + readonly [Symbol.toStringTag]: string; +} | Date | Error | Generator | Promise<unknown> | RegExp; +export type MakeReadonly<T> = T extends Map<infer K, infer V> ? ReadonlyMap<K, V> : T extends Set<infer V> ? ReadonlySet<V> : T extends [ + infer Head, + ...infer Tail +] ? readonly [ + Head, + ...Tail +] : T extends Array<infer V> ? ReadonlyArray<V> : T extends BuiltIn ? T : Readonly<T>; +export interface ZodReadonlyDef<T extends ZodTypeAny = ZodTypeAny> extends ZodTypeDef { + innerType: T; + typeName: ZodFirstPartyTypeKind.ZodReadonly; +} +declare class ZodReadonly<T extends ZodTypeAny> extends ZodType<MakeReadonly<T["_output"]>, ZodReadonlyDef<T>, MakeReadonly<T["_input"]>> { + _parse(input: ParseInput): ParseReturnType<this["_output"]>; + static create: <Inner extends ZodTypeAny>(type: Inner, params?: RawCreateParams) => ZodReadonly<Inner>; + unwrap(): T; +} +declare enum ZodFirstPartyTypeKind { + ZodString = "ZodString", + ZodNumber = "ZodNumber", + ZodNaN = "ZodNaN", + ZodBigInt = "ZodBigInt", + ZodBoolean = "ZodBoolean", + ZodDate = "ZodDate", + ZodSymbol = "ZodSymbol", + ZodUndefined = "ZodUndefined", + ZodNull = "ZodNull", + ZodAny = "ZodAny", + ZodUnknown = "ZodUnknown", + ZodNever = "ZodNever", + ZodVoid = "ZodVoid", + ZodArray = "ZodArray", + ZodObject = "ZodObject", + ZodUnion = "ZodUnion", + ZodDiscriminatedUnion = "ZodDiscriminatedUnion", + ZodIntersection = "ZodIntersection", + ZodTuple = "ZodTuple", + ZodRecord = "ZodRecord", + ZodMap = "ZodMap", + ZodSet = "ZodSet", + ZodFunction = "ZodFunction", + ZodLazy = "ZodLazy", + ZodLiteral = "ZodLiteral", + ZodEnum = "ZodEnum", + ZodEffects = "ZodEffects", + ZodNativeEnum = "ZodNativeEnum", + ZodOptional = "ZodOptional", + ZodNullable = "ZodNullable", + ZodDefault = "ZodDefault", + ZodCatch = "ZodCatch", + ZodPromise = "ZodPromise", + ZodBranded = "ZodBranded", + ZodPipeline = "ZodPipeline", + ZodReadonly = "ZodReadonly" +} +export type Schema = ObjectSchema | ArraySchema | StringSchema | NumberSchema | IntegerSchema | BooleanSchema | NullSchema; +export type _JSONSchema = boolean | JSONSchema; +export type JSONSchema = { + [k: string]: unknown; + $schema?: "https://json-schema.org/draft/2020-12/schema" | "http://json-schema.org/draft-07/schema#" | "http://json-schema.org/draft-04/schema#"; + $id?: string; + $anchor?: string; + $ref?: string; + $dynamicRef?: string; + $dynamicAnchor?: string; + $vocabulary?: Record<string, boolean>; + $comment?: string; + $defs?: Record<string, JSONSchema>; + type?: "object" | "array" | "string" | "number" | "boolean" | "null" | "integer"; + additionalItems?: _JSONSchema; + unevaluatedItems?: _JSONSchema; + prefixItems?: _JSONSchema[]; + items?: _JSONSchema | _JSONSchema[]; + contains?: _JSONSchema; + additionalProperties?: _JSONSchema; + unevaluatedProperties?: _JSONSchema; + properties?: Record<string, _JSONSchema>; + patternProperties?: Record<string, _JSONSchema>; + dependentSchemas?: Record<string, _JSONSchema>; + propertyNames?: _JSONSchema; + if?: _JSONSchema; + then?: _JSONSchema; + else?: _JSONSchema; + allOf?: JSONSchema[]; + anyOf?: JSONSchema[]; + oneOf?: JSONSchema[]; + not?: _JSONSchema; + multipleOf?: number; + maximum?: number; + exclusiveMaximum?: number | boolean; + minimum?: number; + exclusiveMinimum?: number | boolean; + maxLength?: number; + minLength?: number; + pattern?: string; + maxItems?: number; + minItems?: number; + uniqueItems?: boolean; + maxContains?: number; + minContains?: number; + maxProperties?: number; + minProperties?: number; + required?: string[]; + dependentRequired?: Record<string, string[]>; + enum?: Array<string | number | boolean | null>; + const?: string | number | boolean | null; + id?: string; + title?: string; + description?: string; + default?: unknown; + deprecated?: boolean; + readOnly?: boolean; + writeOnly?: boolean; + nullable?: boolean; + examples?: unknown[]; + format?: string; + contentMediaType?: string; + contentEncoding?: string; + contentSchema?: JSONSchema; + _prefault?: unknown; +}; +export type BaseSchema = JSONSchema; +export interface ObjectSchema extends JSONSchema { + type: "object"; +} +export interface ArraySchema extends JSONSchema { + type: "array"; +} +export interface StringSchema extends JSONSchema { + type: "string"; +} +export interface NumberSchema extends JSONSchema { + type: "number"; +} +export interface IntegerSchema extends JSONSchema { + type: "integer"; +} +export interface BooleanSchema extends JSONSchema { + type: "boolean"; +} +export interface NullSchema extends JSONSchema { + type: "null"; +} +/** The Standard interface. */ +export interface StandardTypedV1<Input = unknown, Output = Input> { + /** The Standard properties. */ + readonly "~standard": StandardTypedV1.Props<Input, Output>; +} +declare namespace StandardTypedV1 { + /** The Standard properties interface. */ + interface Props<Input = unknown, Output = Input> { + /** The version number of the standard. */ + readonly version: 1; + /** The vendor name of the schema library. */ + readonly vendor: string; + /** Inferred types associated with the schema. */ + readonly types?: Types<Input, Output> | undefined; + } + /** The Standard types interface. */ + interface Types<Input = unknown, Output = Input> { + /** The input type of the schema. */ + readonly input: Input; + /** The output type of the schema. */ + readonly output: Output; + } + /** Infers the input type of a Standard. */ + type InferInput<Schema extends StandardTypedV1> = NonNullable<Schema["~standard"]["types"]>["input"]; + /** Infers the output type of a Standard. */ + type InferOutput<Schema extends StandardTypedV1> = NonNullable<Schema["~standard"]["types"]>["output"]; +} +interface StandardSchemaV1$1<Input = unknown, Output = Input> { + /** The Standard Schema properties. */ + readonly "~standard": StandardSchemaV1$1.Props<Input, Output>; +} +declare namespace StandardSchemaV1$1 { + /** The Standard Schema properties interface. */ + interface Props<Input = unknown, Output = Input> extends StandardTypedV1.Props<Input, Output> { + /** Validates unknown input values. */ + readonly validate: (value: unknown, options?: StandardSchemaV1$1.Options | undefined) => Result<Output> | Promise<Result<Output>>; + } + /** The result interface of the validate function. */ + type Result<Output> = SuccessResult<Output> | FailureResult; + /** The result interface if validation succeeds. */ + interface SuccessResult<Output> { + /** The typed output value. */ + readonly value: Output; + /** The absence of issues indicates success. */ + readonly issues?: undefined; + } + interface Options { + /** Implicit support for additional vendor-specific parameters, if needed. */ + readonly libraryOptions?: Record<string, unknown> | undefined; + } + /** The result interface if validation fails. */ + interface FailureResult { + /** The issues of failed validation. */ + readonly issues: ReadonlyArray<Issue>; + } + /** The issue interface of the failure output. */ + interface Issue { + /** The error message of the issue. */ + readonly message: string; + /** The path of the issue, if any. */ + readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined; + } + /** The path segment interface of the issue. */ + interface PathSegment { + /** The key representing a path segment. */ + readonly key: PropertyKey; + } + /** The Standard types interface. */ + interface Types<Input = unknown, Output = Input> extends StandardTypedV1.Types<Input, Output> { + } + /** Infers the input type of a Standard. */ + type InferInput<Schema extends StandardTypedV1> = StandardTypedV1.InferInput<Schema>; + /** Infers the output type of a Standard. */ + type InferOutput<Schema extends StandardTypedV1> = StandardTypedV1.InferOutput<Schema>; +} +/** The Standard JSON Schema interface. */ +export interface StandardJSONSchemaV1<Input = unknown, Output = Input> { + /** The Standard JSON Schema properties. */ + readonly "~standard": StandardJSONSchemaV1.Props<Input, Output>; +} +declare namespace StandardJSONSchemaV1 { + /** The Standard JSON Schema properties interface. */ + interface Props<Input = unknown, Output = Input> extends StandardTypedV1.Props<Input, Output> { + /** Methods for generating the input/output JSON Schema. */ + readonly jsonSchema: Converter; + } + /** The Standard JSON Schema converter interface. */ + interface Converter { + /** Converts the input type to JSON Schema. May throw if conversion is not supported. */ + readonly input: (options: StandardJSONSchemaV1.Options) => Record<string, unknown>; + /** Converts the output type to JSON Schema. May throw if conversion is not supported. */ + readonly output: (options: StandardJSONSchemaV1.Options) => Record<string, unknown>; + } + /** The target version of the generated JSON Schema. + * + * It is *strongly recommended* that implementers support `"draft-2020-12"` and `"draft-07"`, as they are both in wide use. + * + * The `"openapi-3.0"` target is intended as a standardized specifier for OpenAPI 3.0 which is a superset of JSON Schema `"draft-04"`. + * + * All other targets can be implemented on a best-effort basis. Libraries should throw if they don't support a specified target. + */ + type Target = "draft-2020-12" | "draft-07" | "openapi-3.0" | ({} & string); + /** The options for the input/output methods. */ + interface Options { + /** Specifies the target version of the generated JSON Schema. Support for all versions is on a best-effort basis. If a given version is not supported, the library should throw. */ + readonly target: Target; + /** Implicit support for additional vendor-specific parameters, if needed. */ + readonly libraryOptions?: Record<string, unknown> | undefined; + } + /** The Standard types interface. */ + interface Types<Input = unknown, Output = Input> extends StandardTypedV1.Types<Input, Output> { + } + /** Infers the input type of a Standard. */ + type InferInput<Schema extends StandardTypedV1> = StandardTypedV1.InferInput<Schema>; + /** Infers the output type of a Standard. */ + type InferOutput<Schema extends StandardTypedV1> = StandardTypedV1.InferOutput<Schema>; +} +export interface StandardSchemaWithJSONProps<Input = unknown, Output = Input> extends StandardSchemaV1$1.Props<Input, Output>, StandardJSONSchemaV1.Props<Input, Output> { +} +declare const $output: unique symbol; +export type $output = typeof $output; +declare const $input: unique symbol; +export type $input = typeof $input; +export type $replace<Meta, S extends $ZodType> = Meta extends $output ? output$1<S> : Meta extends $input ? input$1<S> : Meta extends (infer M)[] ? $replace<M, S>[] : Meta extends (...args: infer P) => infer R ? (...args: { + [K in keyof P]: $replace<P[K], S>; +}) => $replace<R, S> : Meta extends object ? { + [K in keyof Meta]: $replace<Meta[K], S>; +} : Meta; +export type MetadataType = object | undefined; +declare class $ZodRegistry<Meta extends MetadataType = MetadataType, Schema extends $ZodType = $ZodType> { + _meta: Meta; + _schema: Schema; + _map: WeakMap<Schema, $replace<Meta, Schema>>; + _idmap: Map<string, Schema>; + add<S extends Schema>(schema: S, ..._meta: undefined extends Meta ? [ + $replace<Meta, S>? + ] : [ + $replace<Meta, S> + ]): this; + clear(): this; + remove(schema: Schema): this; + get<S extends Schema>(schema: S): $replace<Meta, S> | undefined; + has(schema: Schema): boolean; +} +export interface JSONSchemaMeta { + id?: string | undefined; + title?: string | undefined; + description?: string | undefined; + deprecated?: boolean | undefined; + [k: string]: unknown; +} +export interface GlobalMeta extends JSONSchemaMeta { +} +declare function registry<T extends MetadataType = MetadataType, S extends $ZodType = $ZodType>(): $ZodRegistry<T, S>; +declare const globalRegistry: $ZodRegistry<GlobalMeta>; +export type Processor<T extends schemas.$ZodType = schemas.$ZodType> = (schema: T, ctx: ToJSONSchemaContext, json: JSONSchema$1.BaseSchema, params: ProcessParams) => void; +export interface JSONSchemaGeneratorParams { + processors: Record<string, Processor>; + /** A registry used to look up metadata for each schema. Any schema with an `id` property will be extracted as a $def. + * @default globalRegistry */ + metadata?: $ZodRegistry<Record<string, any>>; + /** The JSON Schema version to target. + * - `"draft-2020-12"` — Default. JSON Schema Draft 2020-12 + * - `"draft-07"` — JSON Schema Draft 7 + * - `"draft-04"` — JSON Schema Draft 4 + * - `"openapi-3.0"` — OpenAPI 3.0 Schema Object */ + target?: "draft-04" | "draft-07" | "draft-2020-12" | "openapi-3.0" | ({} & string) | undefined; + /** How to handle unrepresentable types. + * - `"throw"` — Default. Unrepresentable types throw an error + * - `"any"` — Unrepresentable types become `{}` */ + unrepresentable?: "throw" | "any"; + /** Arbitrary custom logic that can be used to modify the generated JSON Schema. */ + override?: (ctx: { + zodSchema: schemas.$ZodTypes; + jsonSchema: JSONSchema$1.BaseSchema; + path: (string | number)[]; + }) => void; + /** Whether to extract the `"input"` or `"output"` type. Relevant to transforms, defaults, coerced primitives, etc. + * - `"output"` — Default. Convert the output schema. + * - `"input"` — Convert the input schema. */ + io?: "input" | "output"; + cycles?: "ref" | "throw"; + reused?: "ref" | "inline"; + external?: { + registry: $ZodRegistry<{ + id?: string | undefined; + }>; + uri?: ((id: string) => string) | undefined; + defs: Record<string, JSONSchema$1.BaseSchema>; + } | undefined; +} +/** + * Parameters for the toJSONSchema function. + */ +export type ToJSONSchemaParams = Omit<JSONSchemaGeneratorParams, "processors" | "external">; +/** + * Parameters for the toJSONSchema function when passing a registry. + */ +export interface RegistryToJSONSchemaParams extends ToJSONSchemaParams { + uri?: (id: string) => string; +} +export interface ProcessParams { + schemaPath: schemas.$ZodType[]; + path: (string | number)[]; +} +export interface Seen { + /** JSON Schema result for this Zod schema */ + schema: JSONSchema$1.BaseSchema; + /** A cached version of the schema that doesn't get overwritten during ref resolution */ + def?: JSONSchema$1.BaseSchema; + defId?: string | undefined; + /** Number of times this schema was encountered during traversal */ + count: number; + /** Cycle path */ + cycle?: (string | number)[] | undefined; + isParent?: boolean | undefined; + /** Schema to inherit JSON Schema properties from (set by processor for wrappers) */ + ref?: schemas.$ZodType | null; + /** JSON Schema property path for this schema */ + path?: (string | number)[] | undefined; +} +export interface ToJSONSchemaContext { + processors: Record<string, Processor>; + metadataRegistry: $ZodRegistry<Record<string, any>>; + target: "draft-04" | "draft-07" | "draft-2020-12" | "openapi-3.0" | ({} & string); + unrepresentable: "throw" | "any"; + override: (ctx: { + zodSchema: schemas.$ZodType; + jsonSchema: JSONSchema$1.BaseSchema; + path: (string | number)[]; + }) => void; + io: "input" | "output"; + counter: number; + seen: Map<schemas.$ZodType, Seen>; + cycles: "ref" | "throw"; + reused: "ref" | "inline"; + external?: { + registry: $ZodRegistry<{ + id?: string | undefined; + }>; + uri?: ((id: string) => string) | undefined; + defs: Record<string, JSONSchema$1.BaseSchema>; + } | undefined; +} +declare function initializeContext(params: JSONSchemaGeneratorParams): ToJSONSchemaContext; +declare function process<T extends schemas.$ZodType>(schema: T, ctx: ToJSONSchemaContext, _params?: ProcessParams): JSONSchema$1.BaseSchema; +declare function extractDefs<T extends schemas.$ZodType>(ctx: ToJSONSchemaContext, schema: T): void; +declare function finalize<T extends schemas.$ZodType>(ctx: ToJSONSchemaContext, schema: T): ZodStandardJSONSchemaPayload<T>; +export type ZodStandardSchemaWithJSON<T> = StandardSchemaWithJSONProps<core.input<T>, core.output<T>>; +export interface ZodStandardJSONSchemaPayload<T> extends JSONSchema$1.BaseSchema { + "~standard": ZodStandardSchemaWithJSON<T>; +} +declare const createToJSONSchemaMethod: <T extends schemas.$ZodType>(schema: T, processors?: Record<string, Processor>) => (params?: ToJSONSchemaParams) => ZodStandardJSONSchemaPayload<T>; +/** + * Creates a toJSONSchema method for a schema instance. + * This encapsulates the logic of initializing context, processing, extracting defs, and finalizing. + */ +export type StandardJSONSchemaMethodParams = Parameters<StandardJSONSchemaV1["~standard"]["jsonSchema"]["input"]>[0]; +declare const createStandardJSONSchemaMethod: <T extends schemas.$ZodType>(schema: T, io: "input" | "output", processors?: Record<string, Processor>) => (params?: StandardJSONSchemaMethodParams) => JSONSchema$1.BaseSchema; +export type JSONType = string | number | boolean | null | JSONType[] | { + [key: string]: JSONType; +}; +export type JWTAlgorithm = "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | (string & {}); +export type HashAlgorithm = "md5" | "sha1" | "sha256" | "sha384" | "sha512"; +export type HashEncoding = "hex" | "base64" | "base64url"; +export type HashFormat = `${HashAlgorithm}_${HashEncoding}`; +export type IPVersion = "v4" | "v6"; +export type MimeTypes = "application/json" | "application/xml" | "application/x-www-form-urlencoded" | "application/javascript" | "application/pdf" | "application/zip" | "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | "application/msword" | "application/vnd.openxmlformats-officedocument.wordprocessingml.document" | "application/vnd.ms-powerpoint" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "application/octet-stream" | "application/graphql" | "text/html" | "text/plain" | "text/css" | "text/javascript" | "text/csv" | "image/png" | "image/jpeg" | "image/gif" | "image/svg+xml" | "image/webp" | "audio/mpeg" | "audio/ogg" | "audio/wav" | "audio/webm" | "video/mp4" | "video/webm" | "video/ogg" | "font/woff" | "font/woff2" | "font/ttf" | "font/otf" | "multipart/form-data" | (string & {}); +export type ParsedTypes = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" | "file" | "date" | "array" | "map" | "set" | "nan" | "null" | "promise"; +export type AssertEqual<T, U> = (<V>() => V extends T ? 1 : 2) extends <V>() => V extends U ? 1 : 2 ? true : false; +export type AssertNotEqual<T, U> = (<V>() => V extends T ? 1 : 2) extends <V>() => V extends U ? 1 : 2 ? false : true; +export type AssertExtends<T, U> = T extends U ? T : never; +export type IsAny<T> = 0 extends 1 & T ? true : false; +type Omit$1<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; +export type OmitKeys<T, K extends string> = Pick<T, Exclude<keyof T, K>>; +export type MakePartial<T, K extends keyof T> = Omit$1<T, K> & InexactPartial<Pick<T, K>>; +export type MakeRequired<T, K extends keyof T> = Omit$1<T, K> & Required<Pick<T, K>>; +export type Exactly<T, X> = T & Record<Exclude<keyof X, keyof T>, never>; +export type NoUndefined<T> = T extends undefined ? never : T; +export type Whatever = {} | undefined | null; +export type LoosePartial<T extends object> = InexactPartial<T> & { + [k: string]: unknown; +}; +export type Mask<Keys extends PropertyKey> = { + [K in Keys]?: true; +}; +export type Writeable<T> = { + -readonly [P in keyof T]: T[P]; +} & {}; +export type InexactPartial<T> = { + [P in keyof T]?: T[P] | undefined; +}; +export type EmptyObject = Record<string, never>; +type BuiltIn$1 = (((...args: any[]) => any) | (new (...args: any[]) => any)) | { + readonly [Symbol.toStringTag]: string; +} | Date | Error | Generator | Promise<unknown> | RegExp; +type MakeReadonly$1<T> = T extends Map<infer K, infer V> ? ReadonlyMap<K, V> : T extends Set<infer V> ? ReadonlySet<V> : T extends [ + infer Head, + ...infer Tail +] ? readonly [ + Head, + ...Tail +] : T extends Array<infer V> ? ReadonlyArray<V> : T extends BuiltIn$1 ? T : Readonly<T>; +export type SomeObject = Record<PropertyKey, any>; +export type Identity<T> = T; +export type Flatten<T> = Identity<{ + [k in keyof T]: T[k]; +}>; +export type Mapped<T> = { + [k in keyof T]: T[k]; +}; +export type Prettify<T> = { + [K in keyof T]: T[K]; +} & {}; +export type NoNeverKeys<T> = { + [k in keyof T]: [ + T[k] + ] extends [ + never + ] ? never : k; +}[keyof T]; +export type NoNever<T> = Identity<{ + [k in NoNeverKeys<T>]: k extends keyof T ? T[k] : never; +}>; +export type Extend<A extends SomeObject, B extends SomeObject> = Flatten<keyof A & keyof B extends never ? A & B : { + [K in keyof A as K extends keyof B ? never : K]: A[K]; +} & { + [K in keyof B]: B[K]; +}>; +export type TupleItems = ReadonlyArray<schemas.SomeType>; +export type AnyFunc = (...args: any[]) => any; +export type IsProp<T, K extends keyof T> = T[K] extends AnyFunc ? never : K; +export type MaybeAsync<T> = T | Promise<T>; +export type KeyOf<T> = keyof OmitIndexSignature<T>; +export type OmitIndexSignature<T> = { + [K in keyof T as string extends K ? never : K extends string ? K : never]: T[K]; +}; +export type ExtractIndexSignature<T> = { + [K in keyof T as string extends K ? K : K extends string ? never : K]: T[K]; +}; +export type Keys<T extends object> = keyof OmitIndexSignature<T>; +export type SchemaClass<T extends schemas.SomeType> = { + new (def: T["_zod"]["def"]): T; +}; +export type EnumValue = string | number; +export type EnumLike = Readonly<Record<string, EnumValue>>; +export type ToEnum<T extends EnumValue> = Flatten<{ + [k in T]: k; +}>; +export type KeysEnum<T extends object> = ToEnum<Exclude<keyof T, symbol>>; +export type KeysArray<T extends object> = Flatten<(keyof T & string)[]>; +export type Literal = string | number | bigint | boolean | null | undefined; +export type LiteralArray = Array<Literal>; +type Primitive$1 = string | number | symbol | bigint | boolean | null | undefined; +export type PrimitiveArray = Array<Primitive$1>; +export type HasSize = { + size: number; +}; +export type HasLength = { + length: number; +}; +export type Numeric = number | bigint | Date; +export type SafeParseResult<T> = SafeParseSuccess$1<T> | SafeParseError$1<T>; +type SafeParseSuccess$1<T> = { + success: true; + data: T; + error?: never; +}; +type SafeParseError$1<T> = { + success: false; + data?: never; + error: $ZodError<T>; +}; +export type PropValues = Record<string, Set<Primitive$1>>; +export type PrimitiveSet = Set<Primitive$1>; +declare function assertEqual<A, B>(val: AssertEqual<A, B>): AssertEqual<A, B>; +declare function assertNotEqual<A, B>(val: AssertNotEqual<A, B>): AssertNotEqual<A, B>; +declare function assertIs<T>(_arg: T): void; +declare function assertNever(_x: never): never; +declare function assert<T>(_: any): asserts _ is T; +declare function getEnumValues(entries: EnumLike): EnumValue[]; +declare function joinValues<T extends Primitive$1[]>(array: T, separator?: string): string; +declare function jsonStringifyReplacer(_: string, value: any): any; +declare function cached<T>(getter: () => T): { + value: T; +}; +declare function nullish(input: any): boolean; +declare function cleanRegex(source: string): string; +declare function floatSafeRemainder(val: number, step: number): number; +declare function defineLazy<T, K extends keyof T>(object: T, key: K, getter: () => T[K]): void; +declare function objectClone(obj: object): any; +declare function assignProp<T extends object, K extends PropertyKey>(target: T, prop: K, value: K extends keyof T ? T[K] : any): void; +declare function mergeDefs(...defs: Record<string, any>[]): any; +declare function cloneDef(schema: schemas.$ZodType): any; +declare function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any; +declare function promiseAllObject<T extends object>(promisesObj: T): Promise<{ + [k in keyof T]: Awaited<T[k]>; +}>; +declare function randomString(length?: number): string; +declare function esc(str: string): string; +declare function slugify(input: string): string; +declare const captureStackTrace: (targetObject: object, constructorOpt?: Function) => void; +declare function isObject(data: any): data is Record<PropertyKey, unknown>; +declare const allowsEval: { + value: boolean; +}; +declare function isPlainObject(o: any): o is Record<PropertyKey, unknown>; +declare function shallowClone(o: any): any; +declare function numKeys(data: any): number; +declare const getParsedType: (data: any) => ParsedTypes; +declare const propertyKeyTypes: Set<string>; +declare const primitiveTypes: Set<string>; +declare function escapeRegex(str: string): string; +declare function clone<T extends schemas.$ZodType>(inst: T, def?: T["_zod"]["def"], params?: { + parent: boolean; +}): T; +export type EmptyToNever<T> = keyof T extends never ? never : T; +export type Normalize<T> = T extends undefined ? never : T extends Record<any, any> ? Flatten<{ + [k in keyof Omit$1<T, "error" | "message">]: T[k]; +} & ("error" extends keyof T ? { + error?: Exclude<T["error"], string>; +} : unknown)> : never; +declare function normalizeParams<T>(_params: T): Normalize<T>; +declare function createTransparentProxy<T extends object>(getter: () => T): T; +declare function stringifyPrimitive(value: any): string; +declare function optionalKeys(shape: schemas.$ZodShape): string[]; +export type CleanKey<T extends PropertyKey> = T extends `?${infer K}` ? K : T extends `${infer K}?` ? K : T; +export type ToCleanMap<T extends schemas.$ZodLooseShape> = { + [k in keyof T]: k extends `?${infer K}` ? K : k extends `${infer K}?` ? K : k; +}; +export type FromCleanMap<T extends schemas.$ZodLooseShape> = { + [k in keyof T as k extends `?${infer K}` ? K : k extends `${infer K}?` ? K : k]: k; +}; +declare const NUMBER_FORMAT_RANGES: Record<$ZodNumberFormats, [ + number, + number +]>; +declare const BIGINT_FORMAT_RANGES: Record<$ZodBigIntFormats, [ + bigint, + bigint +]>; +declare function pick(schema: schemas.$ZodObject, mask: Record<string, unknown>): any; +declare function omit(schema: schemas.$ZodObject, mask: object): any; +declare function extend(schema: schemas.$ZodObject, shape: schemas.$ZodShape): any; +declare function safeExtend(schema: schemas.$ZodObject, shape: schemas.$ZodShape): any; +declare function merge(a: schemas.$ZodObject, b: schemas.$ZodObject): any; +declare function partial(Class: SchemaClass<schemas.$ZodOptional> | null, schema: schemas.$ZodObject, mask: object | undefined): any; +declare function required(Class: SchemaClass<schemas.$ZodNonOptional>, schema: schemas.$ZodObject, mask: object | undefined): any; +export type Constructor<T, Def extends any[] = any[]> = new (...args: Def) => T; +declare function aborted(x: schemas.ParsePayload, startIndex?: number): boolean; +declare function prefixIssues(path: PropertyKey, issues: $ZodRawIssue[]): $ZodRawIssue[]; +declare function unwrapMessage(message: string | { + message: string; +} | undefined | null): string | undefined; +declare function finalizeIssue(iss: $ZodRawIssue, ctx: schemas.ParseContextInternal | undefined, config: $ZodConfig): $ZodIssue; +declare function getSizableOrigin(input: any): "set" | "map" | "file" | "unknown"; +declare function getLengthableOrigin(input: any): "array" | "string" | "unknown"; +declare function parsedType(data: unknown): $ZodInvalidTypeExpected; +declare function issue(_iss: string, input: any, inst: any): $ZodRawIssue; +declare function issue(_iss: $ZodRawIssue): $ZodRawIssue; +declare function cleanEnum(obj: Record<string, EnumValue>): EnumValue[]; +declare function base64ToUint8Array(base64: string): InstanceType<typeof Uint8Array>; +declare function uint8ArrayToBase64(bytes: Uint8Array): string; +declare function base64urlToUint8Array(base64url: string): InstanceType<typeof Uint8Array>; +declare function uint8ArrayToBase64url(bytes: Uint8Array): string; +declare function hexToUint8Array(hex: string): InstanceType<typeof Uint8Array>; +declare function uint8ArrayToHex(bytes: Uint8Array): string; +declare abstract class Class { + constructor(..._args: any[]); +} +declare const version: { + readonly major: 4; + readonly minor: 3; + readonly patch: number; +}; +interface ParseContext$1<T extends $ZodIssueBase = never> { + /** Customize error messages. */ + readonly error?: $ZodErrorMap<T>; + /** Include the `input` field in issue objects. Default `false`. */ + readonly reportInput?: boolean; + /** Skip eval-based fast path. Default `false`. */ + readonly jitless?: boolean; +} +/** @internal */ +export interface ParseContextInternal<T extends $ZodIssueBase = never> extends ParseContext$1<T> { + readonly async?: boolean | undefined; + readonly direction?: "forward" | "backward"; + readonly skipChecks?: boolean; +} +export interface ParsePayload<T = unknown> { + value: T; + issues: $ZodRawIssue[]; + /** A may to mark a whole payload as aborted. Used in codecs/pipes. */ + aborted?: boolean; +} +export type CheckFn<T> = (input: ParsePayload<T>) => util$1.MaybeAsync<void>; +export interface $ZodTypeDef { + type: "string" | "number" | "int" | "boolean" | "bigint" | "symbol" | "null" | "undefined" | "void" | "never" | "any" | "unknown" | "date" | "object" | "record" | "file" | "array" | "tuple" | "union" | "intersection" | "map" | "set" | "enum" | "literal" | "nullable" | "optional" | "nonoptional" | "success" | "transform" | "default" | "prefault" | "catch" | "nan" | "pipe" | "readonly" | "template_literal" | "promise" | "lazy" | "function" | "custom"; + error?: $ZodErrorMap<never> | undefined; + checks?: $ZodCheck<never>[]; +} +export interface _$ZodTypeInternals { + /** The `@zod/core` version of this schema */ + version: typeof version; + /** Schema definition. */ + def: $ZodTypeDef; + /** @internal Randomly generated ID for this schema. */ + /** @internal List of deferred initializers. */ + deferred: util$1.AnyFunc[] | undefined; + /** @internal Parses input and runs all checks (refinements). */ + run(payload: ParsePayload<any>, ctx: ParseContextInternal): util$1.MaybeAsync<ParsePayload>; + /** @internal Parses input, doesn't run checks. */ + parse(payload: ParsePayload<any>, ctx: ParseContextInternal): util$1.MaybeAsync<ParsePayload>; + /** @internal Stores identifiers for the set of traits implemented by this schema. */ + traits: Set<string>; + /** @internal Indicates that a schema output type should be considered optional inside objects. + * @default Required + */ + /** @internal */ + optin?: "optional" | undefined; + /** @internal */ + optout?: "optional" | undefined; + /** @internal The set of literal values that will pass validation. Must be an exhaustive set. Used to determine optionality in z.record(). + * + * Defined on: enum, const, literal, null, undefined + * Passthrough: optional, nullable, branded, default, catch, pipe + * Todo: unions? + */ + values?: util$1.PrimitiveSet | undefined; + /** Default value bubbled up from */ + /** @internal A set of literal discriminators used for the fast path in discriminated unions. */ + propValues?: util$1.PropValues | undefined; + /** @internal This flag indicates that a schema validation can be represented with a regular expression. Used to determine allowable schemas in z.templateLiteral(). */ + pattern: RegExp | undefined; + /** @internal The constructor function of this schema. */ + constr: new (def: any) => $ZodType; + /** @internal A catchall object for bag metadata related to this schema. Commonly modified by checks using `onattach`. */ + bag: Record<string, unknown>; + /** @internal The set of issues this schema might throw during type checking. */ + isst: $ZodIssueBase; + /** @internal Subject to change, not a public API. */ + processJSONSchema?: ((ctx: ToJSONSchemaContext, json: JSONSchema$1.BaseSchema, params: ProcessParams) => void) | undefined; + /** An optional method used to override `toJSONSchema` logic. */ + toJSONSchema?: () => unknown; + /** @internal The parent of this schema. Only set during certain clone operations. */ + parent?: $ZodType | undefined; +} +/** @internal */ +export interface $ZodTypeInternals<out O = unknown, out I = unknown> extends _$ZodTypeInternals { + /** @internal The inferred output type */ + output: O; + /** @internal The inferred input type */ + input: I; +} +export type $ZodStandardSchema<T> = StandardSchemaV1$1.Props<input$1<T>, output$1<T>>; +export type SomeType = { + _zod: _$ZodTypeInternals; +}; +export interface $ZodType<O = unknown, I = unknown, Internals extends $ZodTypeInternals<O, I> = $ZodTypeInternals<O, I>> { + _zod: Internals; + "~standard": $ZodStandardSchema<this>; +} +export interface _$ZodType<T extends $ZodTypeInternals = $ZodTypeInternals> extends $ZodType<T["output"], T["input"], T> { +} +declare const $ZodType: $constructor<$ZodType>; +export interface $ZodStringDef extends $ZodTypeDef { + type: "string"; + coerce?: boolean; + checks?: $ZodCheck<string>[]; +} +export interface $ZodStringInternals<Input> extends $ZodTypeInternals<string, Input> { + def: $ZodStringDef; + /** @deprecated Internal API, use with caution (not deprecated) */ + pattern: RegExp; + /** @deprecated Internal API, use with caution (not deprecated) */ + isst: $ZodIssueInvalidType; + bag: util$1.LoosePartial<{ + minimum: number; + maximum: number; + patterns: Set<RegExp>; + format: string; + contentEncoding: string; + }>; +} +export interface $ZodString<Input = unknown> extends _$ZodType<$ZodStringInternals<Input>> { +} +declare const $ZodString: $constructor<$ZodString>; +export interface $ZodStringFormatDef<Format extends string = string> extends $ZodStringDef, $ZodCheckStringFormatDef<Format> { +} +export interface $ZodStringFormatInternals<Format extends string = string> extends $ZodStringInternals<string>, $ZodCheckStringFormatInternals { + def: $ZodStringFormatDef<Format>; +} +export interface $ZodStringFormat<Format extends string = string> extends $ZodType { + _zod: $ZodStringFormatInternals<Format>; +} +declare const $ZodStringFormat: $constructor<$ZodStringFormat>; +export interface $ZodGUIDDef extends $ZodStringFormatDef<"guid"> { +} +export interface $ZodGUIDInternals extends $ZodStringFormatInternals<"guid"> { +} +export interface $ZodGUID extends $ZodType { + _zod: $ZodGUIDInternals; +} +declare const $ZodGUID: $constructor<$ZodGUID>; +export interface $ZodUUIDDef extends $ZodStringFormatDef<"uuid"> { + version?: "v1" | "v2" | "v3" | "v4" | "v5" | "v6" | "v7" | "v8"; +} +export interface $ZodUUIDInternals extends $ZodStringFormatInternals<"uuid"> { + def: $ZodUUIDDef; +} +export interface $ZodUUID extends $ZodType { + _zod: $ZodUUIDInternals; +} +declare const $ZodUUID: $constructor<$ZodUUID>; +export interface $ZodEmailDef extends $ZodStringFormatDef<"email"> { +} +export interface $ZodEmailInternals extends $ZodStringFormatInternals<"email"> { +} +export interface $ZodEmail extends $ZodType { + _zod: $ZodEmailInternals; +} +declare const $ZodEmail: $constructor<$ZodEmail>; +export interface $ZodURLDef extends $ZodStringFormatDef<"url"> { + hostname?: RegExp | undefined; + protocol?: RegExp | undefined; + normalize?: boolean | undefined; +} +export interface $ZodURLInternals extends $ZodStringFormatInternals<"url"> { + def: $ZodURLDef; +} +export interface $ZodURL extends $ZodType { + _zod: $ZodURLInternals; +} +declare const $ZodURL: $constructor<$ZodURL>; +export interface $ZodEmojiDef extends $ZodStringFormatDef<"emoji"> { +} +export interface $ZodEmojiInternals extends $ZodStringFormatInternals<"emoji"> { +} +export interface $ZodEmoji extends $ZodType { + _zod: $ZodEmojiInternals; +} +declare const $ZodEmoji: $constructor<$ZodEmoji>; +export interface $ZodNanoIDDef extends $ZodStringFormatDef<"nanoid"> { +} +export interface $ZodNanoIDInternals extends $ZodStringFormatInternals<"nanoid"> { +} +export interface $ZodNanoID extends $ZodType { + _zod: $ZodNanoIDInternals; +} +declare const $ZodNanoID: $constructor<$ZodNanoID>; +export interface $ZodCUIDDef extends $ZodStringFormatDef<"cuid"> { +} +export interface $ZodCUIDInternals extends $ZodStringFormatInternals<"cuid"> { +} +export interface $ZodCUID extends $ZodType { + _zod: $ZodCUIDInternals; +} +declare const $ZodCUID: $constructor<$ZodCUID>; +export interface $ZodCUID2Def extends $ZodStringFormatDef<"cuid2"> { +} +export interface $ZodCUID2Internals extends $ZodStringFormatInternals<"cuid2"> { +} +export interface $ZodCUID2 extends $ZodType { + _zod: $ZodCUID2Internals; +} +declare const $ZodCUID2: $constructor<$ZodCUID2>; +export interface $ZodULIDDef extends $ZodStringFormatDef<"ulid"> { +} +export interface $ZodULIDInternals extends $ZodStringFormatInternals<"ulid"> { +} +export interface $ZodULID extends $ZodType { + _zod: $ZodULIDInternals; +} +declare const $ZodULID: $constructor<$ZodULID>; +export interface $ZodXIDDef extends $ZodStringFormatDef<"xid"> { +} +export interface $ZodXIDInternals extends $ZodStringFormatInternals<"xid"> { +} +export interface $ZodXID extends $ZodType { + _zod: $ZodXIDInternals; +} +declare const $ZodXID: $constructor<$ZodXID>; +export interface $ZodKSUIDDef extends $ZodStringFormatDef<"ksuid"> { +} +export interface $ZodKSUIDInternals extends $ZodStringFormatInternals<"ksuid"> { +} +export interface $ZodKSUID extends $ZodType { + _zod: $ZodKSUIDInternals; +} +declare const $ZodKSUID: $constructor<$ZodKSUID>; +export interface $ZodISODateTimeDef extends $ZodStringFormatDef<"datetime"> { + precision: number | null; + offset: boolean; + local: boolean; +} +export interface $ZodISODateTimeInternals extends $ZodStringFormatInternals { + def: $ZodISODateTimeDef; +} +export interface $ZodISODateTime extends $ZodType { + _zod: $ZodISODateTimeInternals; +} +declare const $ZodISODateTime: $constructor<$ZodISODateTime>; +export interface $ZodISODateDef extends $ZodStringFormatDef<"date"> { +} +export interface $ZodISODateInternals extends $ZodStringFormatInternals<"date"> { +} +export interface $ZodISODate extends $ZodType { + _zod: $ZodISODateInternals; +} +declare const $ZodISODate: $constructor<$ZodISODate>; +export interface $ZodISOTimeDef extends $ZodStringFormatDef<"time"> { + precision?: number | null; +} +export interface $ZodISOTimeInternals extends $ZodStringFormatInternals<"time"> { + def: $ZodISOTimeDef; +} +export interface $ZodISOTime extends $ZodType { + _zod: $ZodISOTimeInternals; +} +declare const $ZodISOTime: $constructor<$ZodISOTime>; +export interface $ZodISODurationDef extends $ZodStringFormatDef<"duration"> { +} +export interface $ZodISODurationInternals extends $ZodStringFormatInternals<"duration"> { +} +export interface $ZodISODuration extends $ZodType { + _zod: $ZodISODurationInternals; +} +declare const $ZodISODuration: $constructor<$ZodISODuration>; +export interface $ZodIPv4Def extends $ZodStringFormatDef<"ipv4"> { + version?: "v4"; +} +export interface $ZodIPv4Internals extends $ZodStringFormatInternals<"ipv4"> { + def: $ZodIPv4Def; +} +export interface $ZodIPv4 extends $ZodType { + _zod: $ZodIPv4Internals; +} +declare const $ZodIPv4: $constructor<$ZodIPv4>; +export interface $ZodIPv6Def extends $ZodStringFormatDef<"ipv6"> { + version?: "v6"; +} +export interface $ZodIPv6Internals extends $ZodStringFormatInternals<"ipv6"> { + def: $ZodIPv6Def; +} +export interface $ZodIPv6 extends $ZodType { + _zod: $ZodIPv6Internals; +} +declare const $ZodIPv6: $constructor<$ZodIPv6>; +export interface $ZodMACDef extends $ZodStringFormatDef<"mac"> { + delimiter?: string; +} +export interface $ZodMACInternals extends $ZodStringFormatInternals<"mac"> { + def: $ZodMACDef; +} +export interface $ZodMAC extends $ZodType { + _zod: $ZodMACInternals; +} +declare const $ZodMAC: $constructor<$ZodMAC>; +export interface $ZodCIDRv4Def extends $ZodStringFormatDef<"cidrv4"> { + version?: "v4"; +} +export interface $ZodCIDRv4Internals extends $ZodStringFormatInternals<"cidrv4"> { + def: $ZodCIDRv4Def; +} +export interface $ZodCIDRv4 extends $ZodType { + _zod: $ZodCIDRv4Internals; +} +declare const $ZodCIDRv4: $constructor<$ZodCIDRv4>; +export interface $ZodCIDRv6Def extends $ZodStringFormatDef<"cidrv6"> { + version?: "v6"; +} +export interface $ZodCIDRv6Internals extends $ZodStringFormatInternals<"cidrv6"> { + def: $ZodCIDRv6Def; +} +export interface $ZodCIDRv6 extends $ZodType { + _zod: $ZodCIDRv6Internals; +} +declare const $ZodCIDRv6: $constructor<$ZodCIDRv6>; +declare function isValidBase64(data: string): boolean; +export interface $ZodBase64Def extends $ZodStringFormatDef<"base64"> { +} +export interface $ZodBase64Internals extends $ZodStringFormatInternals<"base64"> { +} +export interface $ZodBase64 extends $ZodType { + _zod: $ZodBase64Internals; +} +declare const $ZodBase64: $constructor<$ZodBase64>; +declare function isValidBase64URL(data: string): boolean; +export interface $ZodBase64URLDef extends $ZodStringFormatDef<"base64url"> { +} +export interface $ZodBase64URLInternals extends $ZodStringFormatInternals<"base64url"> { +} +export interface $ZodBase64URL extends $ZodType { + _zod: $ZodBase64URLInternals; +} +declare const $ZodBase64URL: $constructor<$ZodBase64URL>; +export interface $ZodE164Def extends $ZodStringFormatDef<"e164"> { +} +export interface $ZodE164Internals extends $ZodStringFormatInternals<"e164"> { +} +export interface $ZodE164 extends $ZodType { + _zod: $ZodE164Internals; +} +declare const $ZodE164: $constructor<$ZodE164>; +declare function isValidJWT(token: string, algorithm?: util$1.JWTAlgorithm | null): boolean; +export interface $ZodJWTDef extends $ZodStringFormatDef<"jwt"> { + alg?: util$1.JWTAlgorithm | undefined; +} +export interface $ZodJWTInternals extends $ZodStringFormatInternals<"jwt"> { + def: $ZodJWTDef; +} +export interface $ZodJWT extends $ZodType { + _zod: $ZodJWTInternals; +} +declare const $ZodJWT: $constructor<$ZodJWT>; +export interface $ZodCustomStringFormatDef<Format extends string = string> extends $ZodStringFormatDef<Format> { + fn: (val: string) => unknown; +} +export interface $ZodCustomStringFormatInternals<Format extends string = string> extends $ZodStringFormatInternals<Format> { + def: $ZodCustomStringFormatDef<Format>; +} +export interface $ZodCustomStringFormat<Format extends string = string> extends $ZodStringFormat<Format> { + _zod: $ZodCustomStringFormatInternals<Format>; +} +declare const $ZodCustomStringFormat: $constructor<$ZodCustomStringFormat>; +export interface $ZodNumberDef extends $ZodTypeDef { + type: "number"; + coerce?: boolean; +} +export interface $ZodNumberInternals<Input = unknown> extends $ZodTypeInternals<number, Input> { + def: $ZodNumberDef; + /** @deprecated Internal API, use with caution (not deprecated) */ + pattern: RegExp; + /** @deprecated Internal API, use with caution (not deprecated) */ + isst: $ZodIssueInvalidType; + bag: util$1.LoosePartial<{ + minimum: number; + maximum: number; + exclusiveMinimum: number; + exclusiveMaximum: number; + format: string; + pattern: RegExp; + }>; +} +export interface $ZodNumber<Input = unknown> extends $ZodType { + _zod: $ZodNumberInternals<Input>; +} +declare const $ZodNumber: $constructor<$ZodNumber>; +export interface $ZodNumberFormatDef extends $ZodNumberDef, $ZodCheckNumberFormatDef { +} +export interface $ZodNumberFormatInternals extends $ZodNumberInternals<number>, $ZodCheckNumberFormatInternals { + def: $ZodNumberFormatDef; + isst: $ZodIssueInvalidType; +} +export interface $ZodNumberFormat extends $ZodType { + _zod: $ZodNumberFormatInternals; +} +declare const $ZodNumberFormat: $constructor<$ZodNumberFormat>; +export interface $ZodBooleanDef extends $ZodTypeDef { + type: "boolean"; + coerce?: boolean; + checks?: $ZodCheck<boolean>[]; +} +export interface $ZodBooleanInternals<T = unknown> extends $ZodTypeInternals<boolean, T> { + pattern: RegExp; + def: $ZodBooleanDef; + isst: $ZodIssueInvalidType; +} +export interface $ZodBoolean<T = unknown> extends $ZodType { + _zod: $ZodBooleanInternals<T>; +} +declare const $ZodBoolean: $constructor<$ZodBoolean>; +export interface $ZodBigIntDef extends $ZodTypeDef { + type: "bigint"; + coerce?: boolean; +} +export interface $ZodBigIntInternals<T = unknown> extends $ZodTypeInternals<bigint, T> { + pattern: RegExp; + /** @internal Internal API, use with caution */ + def: $ZodBigIntDef; + isst: $ZodIssueInvalidType; + bag: util$1.LoosePartial<{ + minimum: bigint; + maximum: bigint; + format: string; + }>; +} +export interface $ZodBigInt<T = unknown> extends $ZodType { + _zod: $ZodBigIntInternals<T>; +} +declare const $ZodBigInt: $constructor<$ZodBigInt>; +export interface $ZodBigIntFormatDef extends $ZodBigIntDef, $ZodCheckBigIntFormatDef { + check: "bigint_format"; +} +export interface $ZodBigIntFormatInternals extends $ZodBigIntInternals<bigint>, $ZodCheckBigIntFormatInternals { + def: $ZodBigIntFormatDef; +} +export interface $ZodBigIntFormat extends $ZodType { + _zod: $ZodBigIntFormatInternals; +} +declare const $ZodBigIntFormat: $constructor<$ZodBigIntFormat>; +export interface $ZodSymbolDef extends $ZodTypeDef { + type: "symbol"; +} +export interface $ZodSymbolInternals extends $ZodTypeInternals<symbol, symbol> { + def: $ZodSymbolDef; + isst: $ZodIssueInvalidType; +} +export interface $ZodSymbol extends $ZodType { + _zod: $ZodSymbolInternals; +} +declare const $ZodSymbol: $constructor<$ZodSymbol>; +export interface $ZodUndefinedDef extends $ZodTypeDef { + type: "undefined"; +} +export interface $ZodUndefinedInternals extends $ZodTypeInternals<undefined, undefined> { + pattern: RegExp; + def: $ZodUndefinedDef; + values: util$1.PrimitiveSet; + isst: $ZodIssueInvalidType; +} +export interface $ZodUndefined extends $ZodType { + _zod: $ZodUndefinedInternals; +} +declare const $ZodUndefined: $constructor<$ZodUndefined>; +export interface $ZodNullDef extends $ZodTypeDef { + type: "null"; +} +export interface $ZodNullInternals extends $ZodTypeInternals<null, null> { + pattern: RegExp; + def: $ZodNullDef; + values: util$1.PrimitiveSet; + isst: $ZodIssueInvalidType; +} +export interface $ZodNull extends $ZodType { + _zod: $ZodNullInternals; +} +declare const $ZodNull: $constructor<$ZodNull>; +export interface $ZodAnyDef extends $ZodTypeDef { + type: "any"; +} +export interface $ZodAnyInternals extends $ZodTypeInternals<any, any> { + def: $ZodAnyDef; + isst: never; +} +export interface $ZodAny extends $ZodType { + _zod: $ZodAnyInternals; +} +declare const $ZodAny: $constructor<$ZodAny>; +export interface $ZodUnknownDef extends $ZodTypeDef { + type: "unknown"; +} +export interface $ZodUnknownInternals extends $ZodTypeInternals<unknown, unknown> { + def: $ZodUnknownDef; + isst: never; +} +export interface $ZodUnknown extends $ZodType { + _zod: $ZodUnknownInternals; +} +declare const $ZodUnknown: $constructor<$ZodUnknown>; +export interface $ZodNeverDef extends $ZodTypeDef { + type: "never"; +} +export interface $ZodNeverInternals extends $ZodTypeInternals<never, never> { + def: $ZodNeverDef; + isst: $ZodIssueInvalidType; +} +export interface $ZodNever extends $ZodType { + _zod: $ZodNeverInternals; +} +declare const $ZodNever: $constructor<$ZodNever>; +export interface $ZodVoidDef extends $ZodTypeDef { + type: "void"; +} +export interface $ZodVoidInternals extends $ZodTypeInternals<void, void> { + def: $ZodVoidDef; + isst: $ZodIssueInvalidType; +} +export interface $ZodVoid extends $ZodType { + _zod: $ZodVoidInternals; +} +declare const $ZodVoid: $constructor<$ZodVoid>; +export interface $ZodDateDef extends $ZodTypeDef { + type: "date"; + coerce?: boolean; +} +export interface $ZodDateInternals<T = unknown> extends $ZodTypeInternals<Date, T> { + def: $ZodDateDef; + isst: $ZodIssueInvalidType; + bag: util$1.LoosePartial<{ + minimum: Date; + maximum: Date; + format: string; + }>; +} +export interface $ZodDate<T = unknown> extends $ZodType { + _zod: $ZodDateInternals<T>; +} +declare const $ZodDate: $constructor<$ZodDate>; +export interface $ZodArrayDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "array"; + element: T; +} +export interface $ZodArrayInternals<T extends SomeType = $ZodType> extends _$ZodTypeInternals { + def: $ZodArrayDef<T>; + isst: $ZodIssueInvalidType; + output: output$1<T>[]; + input: input$1<T>[]; +} +export interface $ZodArray<T extends SomeType = $ZodType> extends $ZodType<any, any, $ZodArrayInternals<T>> { +} +declare const $ZodArray: $constructor<$ZodArray>; +export type OptionalOutSchema = { + _zod: { + optout: "optional"; + }; +}; +export type OptionalInSchema = { + _zod: { + optin: "optional"; + }; +}; +export type $InferObjectOutput<T extends $ZodLooseShape, Extra extends Record<string, unknown>> = string extends keyof T ? util$1.IsAny<T[keyof T]> extends true ? Record<string, unknown> : Record<string, output$1<T[keyof T]>> : keyof (T & Extra) extends never ? Record<string, never> : util$1.Prettify<{ + -readonly [k in keyof T as T[k] extends OptionalOutSchema ? never : k]: T[k]["_zod"]["output"]; +} & { + -readonly [k in keyof T as T[k] extends OptionalOutSchema ? k : never]?: T[k]["_zod"]["output"]; +} & Extra>; +export type $InferObjectInput<T extends $ZodLooseShape, Extra extends Record<string, unknown>> = string extends keyof T ? util$1.IsAny<T[keyof T]> extends true ? Record<string, unknown> : Record<string, input$1<T[keyof T]>> : keyof (T & Extra) extends never ? Record<string, never> : util$1.Prettify<{ + -readonly [k in keyof T as T[k] extends OptionalInSchema ? never : k]: T[k]["_zod"]["input"]; +} & { + -readonly [k in keyof T as T[k] extends OptionalInSchema ? k : never]?: T[k]["_zod"]["input"]; +} & Extra>; +export type $ZodObjectConfig = { + out: Record<string, unknown>; + in: Record<string, unknown>; +}; +export type $loose = { + out: Record<string, unknown>; + in: Record<string, unknown>; +}; +export type $strict = { + out: {}; + in: {}; +}; +export type $strip = { + out: {}; + in: {}; +}; +export type $catchall<T extends SomeType> = { + out: { + [k: string]: output$1<T>; + }; + in: { + [k: string]: input$1<T>; + }; +}; +export type $ZodShape = Readonly<{ + [k: string]: $ZodType; +}>; +export interface $ZodObjectDef<Shape extends $ZodShape = $ZodShape> extends $ZodTypeDef { + type: "object"; + shape: Shape; + catchall?: $ZodType | undefined; +} +export interface $ZodObjectInternals< +/** @ts-ignore Cast variance */ +out Shape extends $ZodShape = $ZodShape, out Config extends $ZodObjectConfig = $ZodObjectConfig> extends _$ZodTypeInternals { + def: $ZodObjectDef<Shape>; + config: Config; + isst: $ZodIssueInvalidType | $ZodIssueUnrecognizedKeys; + propValues: util$1.PropValues; + output: $InferObjectOutput<Shape, Config["out"]>; + input: $InferObjectInput<Shape, Config["in"]>; + optin?: "optional" | undefined; + optout?: "optional" | undefined; +} +export type $ZodLooseShape = Record<string, any>; +export interface $ZodObject< +/** @ts-ignore Cast variance */ +out Shape extends Readonly<$ZodShape> = Readonly<$ZodShape>, out Params extends $ZodObjectConfig = $ZodObjectConfig> extends $ZodType<any, any, $ZodObjectInternals<Shape, Params>> { +} +declare const $ZodObject: $constructor<$ZodObject>; +declare const $ZodObjectJIT: $constructor<$ZodObject>; +export type $InferUnionOutput<T extends SomeType> = T extends any ? output$1<T> : never; +export type $InferUnionInput<T extends SomeType> = T extends any ? input$1<T> : never; +export interface $ZodUnionDef<Options extends readonly SomeType[] = readonly $ZodType[]> extends $ZodTypeDef { + type: "union"; + options: Options; + inclusive?: boolean; +} +export type IsOptionalIn<T extends SomeType> = T extends OptionalInSchema ? true : false; +export type IsOptionalOut<T extends SomeType> = T extends OptionalOutSchema ? true : false; +export interface $ZodUnionInternals<T extends readonly SomeType[] = readonly $ZodType[]> extends _$ZodTypeInternals { + def: $ZodUnionDef<T>; + isst: $ZodIssueInvalidUnion; + pattern: T[number]["_zod"]["pattern"]; + values: T[number]["_zod"]["values"]; + output: $InferUnionOutput<T[number]>; + input: $InferUnionInput<T[number]>; + optin: IsOptionalIn<T[number]> extends false ? "optional" | undefined : "optional"; + optout: IsOptionalOut<T[number]> extends false ? "optional" | undefined : "optional"; +} +export interface $ZodUnion<T extends readonly SomeType[] = readonly $ZodType[]> extends $ZodType<any, any, $ZodUnionInternals<T>> { + _zod: $ZodUnionInternals<T>; +} +declare const $ZodUnion: $constructor<$ZodUnion>; +export interface $ZodXorInternals<T extends readonly SomeType[] = readonly $ZodType[]> extends $ZodUnionInternals<T> { +} +export interface $ZodXor<T extends readonly SomeType[] = readonly $ZodType[]> extends $ZodType<any, any, $ZodXorInternals<T>> { + _zod: $ZodXorInternals<T>; +} +declare const $ZodXor: $constructor<$ZodXor>; +export interface $ZodDiscriminatedUnionDef<Options extends readonly SomeType[] = readonly $ZodType[], Disc extends string = string> extends $ZodUnionDef<Options> { + discriminator: Disc; + unionFallback?: boolean; +} +export interface $ZodDiscriminatedUnionInternals<Options extends readonly SomeType[] = readonly $ZodType[], Disc extends string = string> extends $ZodUnionInternals<Options> { + def: $ZodDiscriminatedUnionDef<Options, Disc>; + propValues: util$1.PropValues; +} +export interface $ZodDiscriminatedUnion<Options extends readonly SomeType[] = readonly $ZodType[], Disc extends string = string> extends $ZodType { + _zod: $ZodDiscriminatedUnionInternals<Options, Disc>; +} +declare const $ZodDiscriminatedUnion: $constructor<$ZodDiscriminatedUnion>; +export interface $ZodIntersectionDef<Left extends SomeType = $ZodType, Right extends SomeType = $ZodType> extends $ZodTypeDef { + type: "intersection"; + left: Left; + right: Right; +} +export interface $ZodIntersectionInternals<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends _$ZodTypeInternals { + def: $ZodIntersectionDef<A, B>; + isst: never; + optin: A["_zod"]["optin"] | B["_zod"]["optin"]; + optout: A["_zod"]["optout"] | B["_zod"]["optout"]; + output: output$1<A> & output$1<B>; + input: input$1<A> & input$1<B>; +} +export interface $ZodIntersection<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodIntersectionInternals<A, B>; +} +declare const $ZodIntersection: $constructor<$ZodIntersection>; +export interface $ZodTupleDef<T extends util$1.TupleItems = readonly $ZodType[], Rest extends SomeType | null = $ZodType | null> extends $ZodTypeDef { + type: "tuple"; + items: T; + rest: Rest; +} +export type $InferTupleInputType<T extends util$1.TupleItems, Rest extends SomeType | null> = [ + ...TupleInputTypeWithOptionals<T>, + ...(Rest extends SomeType ? input$1<Rest>[] : [ + ]) +]; +export type TupleInputTypeNoOptionals<T extends util$1.TupleItems> = { + [k in keyof T]: input$1<T[k]>; +}; +export type TupleInputTypeWithOptionals<T extends util$1.TupleItems> = T extends readonly [ + ...infer Prefix extends SomeType[], + infer Tail extends SomeType +] ? Tail["_zod"]["optin"] extends "optional" ? [ + ...TupleInputTypeWithOptionals<Prefix>, + input$1<Tail>? +] : TupleInputTypeNoOptionals<T> : [ +]; +export type $InferTupleOutputType<T extends util$1.TupleItems, Rest extends SomeType | null> = [ + ...TupleOutputTypeWithOptionals<T>, + ...(Rest extends SomeType ? output$1<Rest>[] : [ + ]) +]; +export type TupleOutputTypeNoOptionals<T extends util$1.TupleItems> = { + [k in keyof T]: output$1<T[k]>; +}; +export type TupleOutputTypeWithOptionals<T extends util$1.TupleItems> = T extends readonly [ + ...infer Prefix extends SomeType[], + infer Tail extends SomeType +] ? Tail["_zod"]["optout"] extends "optional" ? [ + ...TupleOutputTypeWithOptionals<Prefix>, + output$1<Tail>? +] : TupleOutputTypeNoOptionals<T> : [ +]; +export interface $ZodTupleInternals<T extends util$1.TupleItems = readonly $ZodType[], Rest extends SomeType | null = $ZodType | null> extends _$ZodTypeInternals { + def: $ZodTupleDef<T, Rest>; + isst: $ZodIssueInvalidType | $ZodIssueTooBig<unknown[]> | $ZodIssueTooSmall<unknown[]>; + output: $InferTupleOutputType<T, Rest>; + input: $InferTupleInputType<T, Rest>; +} +export interface $ZodTuple<T extends util$1.TupleItems = readonly $ZodType[], Rest extends SomeType | null = $ZodType | null> extends $ZodType { + _zod: $ZodTupleInternals<T, Rest>; +} +declare const $ZodTuple: $constructor<$ZodTuple>; +export type $ZodRecordKey = $ZodType<string | number | symbol, unknown>; +export interface $ZodRecordDef<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> extends $ZodTypeDef { + type: "record"; + keyType: Key; + valueType: Value; + /** @default "strict" - errors on keys not matching keyType. "loose" passes through non-matching keys unchanged. */ + mode?: "strict" | "loose"; +} +export type $InferZodRecordOutput<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> = Key extends $partial ? Partial<Record<output$1<Key>, output$1<Value>>> : Record<output$1<Key>, output$1<Value>>; +export type $InferZodRecordInput<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> = Key extends $partial ? Partial<Record<input$1<Key> & PropertyKey, input$1<Value>>> : Record<input$1<Key> & PropertyKey, input$1<Value>>; +export interface $ZodRecordInternals<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> extends $ZodTypeInternals<$InferZodRecordOutput<Key, Value>, $InferZodRecordInput<Key, Value>> { + def: $ZodRecordDef<Key, Value>; + isst: $ZodIssueInvalidType | $ZodIssueInvalidKey<Record<PropertyKey, unknown>>; + optin?: "optional" | undefined; + optout?: "optional" | undefined; +} +export type $partial = { + "~~partial": true; +}; +export interface $ZodRecord<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodRecordInternals<Key, Value>; +} +declare const $ZodRecord: $constructor<$ZodRecord>; +export interface $ZodMapDef<Key extends SomeType = $ZodType, Value extends SomeType = $ZodType> extends $ZodTypeDef { + type: "map"; + keyType: Key; + valueType: Value; +} +export interface $ZodMapInternals<Key extends SomeType = $ZodType, Value extends SomeType = $ZodType> extends $ZodTypeInternals<Map<output$1<Key>, output$1<Value>>, Map<input$1<Key>, input$1<Value>>> { + def: $ZodMapDef<Key, Value>; + isst: $ZodIssueInvalidType | $ZodIssueInvalidKey | $ZodIssueInvalidElement<unknown>; + optin?: "optional" | undefined; + optout?: "optional" | undefined; +} +export interface $ZodMap<Key extends SomeType = $ZodType, Value extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodMapInternals<Key, Value>; +} +declare const $ZodMap: $constructor<$ZodMap>; +export interface $ZodSetDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "set"; + valueType: T; +} +export interface $ZodSetInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<Set<output$1<T>>, Set<input$1<T>>> { + def: $ZodSetDef<T>; + isst: $ZodIssueInvalidType; + optin?: "optional" | undefined; + optout?: "optional" | undefined; +} +export interface $ZodSet<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodSetInternals<T>; +} +declare const $ZodSet: $constructor<$ZodSet>; +export type $InferEnumOutput<T extends util$1.EnumLike> = T[keyof T] & {}; +export type $InferEnumInput<T extends util$1.EnumLike> = T[keyof T] & {}; +export interface $ZodEnumDef<T extends util$1.EnumLike = util$1.EnumLike> extends $ZodTypeDef { + type: "enum"; + entries: T; +} +export interface $ZodEnumInternals< +/** @ts-ignore Cast variance */ +out T extends util$1.EnumLike = util$1.EnumLike> extends $ZodTypeInternals<$InferEnumOutput<T>, $InferEnumInput<T>> { + def: $ZodEnumDef<T>; + /** @deprecated Internal API, use with caution (not deprecated) */ + values: util$1.PrimitiveSet; + /** @deprecated Internal API, use with caution (not deprecated) */ + pattern: RegExp; + isst: $ZodIssueInvalidValue; +} +export interface $ZodEnum<T extends util$1.EnumLike = util$1.EnumLike> extends $ZodType { + _zod: $ZodEnumInternals<T>; +} +declare const $ZodEnum: $constructor<$ZodEnum>; +export interface $ZodLiteralDef<T extends util$1.Literal> extends $ZodTypeDef { + type: "literal"; + values: T[]; +} +export interface $ZodLiteralInternals<T extends util$1.Literal = util$1.Literal> extends $ZodTypeInternals<T, T> { + def: $ZodLiteralDef<T>; + values: Set<T>; + pattern: RegExp; + isst: $ZodIssueInvalidValue; +} +export interface $ZodLiteral<T extends util$1.Literal = util$1.Literal> extends $ZodType { + _zod: $ZodLiteralInternals<T>; +} +declare const $ZodLiteral: $constructor<$ZodLiteral>; +export type _File = typeof globalThis extends { + File: infer F extends new (...args: any[]) => any; +} ? InstanceType<F> : {}; +interface File$1 extends _File { + readonly type: string; + readonly size: number; +} +export interface $ZodFileDef extends $ZodTypeDef { + type: "file"; +} +export interface $ZodFileInternals extends $ZodTypeInternals<File$1, File$1> { + def: $ZodFileDef; + isst: $ZodIssueInvalidType; + bag: util$1.LoosePartial<{ + minimum: number; + maximum: number; + mime: util$1.MimeTypes[]; + }>; +} +export interface $ZodFile extends $ZodType { + _zod: $ZodFileInternals; +} +declare const $ZodFile: $constructor<$ZodFile>; +export interface $ZodTransformDef extends $ZodTypeDef { + type: "transform"; + transform: (input: unknown, payload: ParsePayload<unknown>) => util$1.MaybeAsync<unknown>; +} +export interface $ZodTransformInternals<O = unknown, I = unknown> extends $ZodTypeInternals<O, I> { + def: $ZodTransformDef; + isst: never; +} +export interface $ZodTransform<O = unknown, I = unknown> extends $ZodType { + _zod: $ZodTransformInternals<O, I>; +} +declare const $ZodTransform: $constructor<$ZodTransform>; +export interface $ZodOptionalDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "optional"; + innerType: T; +} +export interface $ZodOptionalInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<output$1<T> | undefined, input$1<T> | undefined> { + def: $ZodOptionalDef<T>; + optin: "optional"; + optout: "optional"; + isst: never; + values: T["_zod"]["values"]; + pattern: T["_zod"]["pattern"]; +} +export interface $ZodOptional<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodOptionalInternals<T>; +} +declare const $ZodOptional: $constructor<$ZodOptional>; +export interface $ZodExactOptionalDef<T extends SomeType = $ZodType> extends $ZodOptionalDef<T> { +} +export interface $ZodExactOptionalInternals<T extends SomeType = $ZodType> extends $ZodOptionalInternals<T> { + def: $ZodExactOptionalDef<T>; + output: output$1<T>; + input: input$1<T>; +} +export interface $ZodExactOptional<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodExactOptionalInternals<T>; +} +declare const $ZodExactOptional: $constructor<$ZodExactOptional>; +export interface $ZodNullableDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "nullable"; + innerType: T; +} +export interface $ZodNullableInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<output$1<T> | null, input$1<T> | null> { + def: $ZodNullableDef<T>; + optin: T["_zod"]["optin"]; + optout: T["_zod"]["optout"]; + isst: never; + values: T["_zod"]["values"]; + pattern: T["_zod"]["pattern"]; +} +export interface $ZodNullable<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodNullableInternals<T>; +} +declare const $ZodNullable: $constructor<$ZodNullable>; +export interface $ZodDefaultDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "default"; + innerType: T; + /** The default value. May be a getter. */ + defaultValue: util$1.NoUndefined<output$1<T>>; +} +export interface $ZodDefaultInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<util$1.NoUndefined<output$1<T>>, input$1<T> | undefined> { + def: $ZodDefaultDef<T>; + optin: "optional"; + optout?: "optional" | undefined; + isst: never; + values: T["_zod"]["values"]; +} +export interface $ZodDefault<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodDefaultInternals<T>; +} +declare const $ZodDefault: $constructor<$ZodDefault>; +export interface $ZodPrefaultDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "prefault"; + innerType: T; + /** The default value. May be a getter. */ + defaultValue: input$1<T>; +} +export interface $ZodPrefaultInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<util$1.NoUndefined<output$1<T>>, input$1<T> | undefined> { + def: $ZodPrefaultDef<T>; + optin: "optional"; + optout?: "optional" | undefined; + isst: never; + values: T["_zod"]["values"]; +} +export interface $ZodPrefault<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodPrefaultInternals<T>; +} +declare const $ZodPrefault: $constructor<$ZodPrefault>; +export interface $ZodNonOptionalDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "nonoptional"; + innerType: T; +} +export interface $ZodNonOptionalInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<util$1.NoUndefined<output$1<T>>, util$1.NoUndefined<input$1<T>>> { + def: $ZodNonOptionalDef<T>; + isst: $ZodIssueInvalidType; + values: T["_zod"]["values"]; + optin: "optional" | undefined; + optout: "optional" | undefined; +} +export interface $ZodNonOptional<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodNonOptionalInternals<T>; +} +declare const $ZodNonOptional: $constructor<$ZodNonOptional>; +export interface $ZodSuccessDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "success"; + innerType: T; +} +export interface $ZodSuccessInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<boolean, input$1<T>> { + def: $ZodSuccessDef<T>; + isst: never; + optin: T["_zod"]["optin"]; + optout: "optional" | undefined; +} +export interface $ZodSuccess<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodSuccessInternals<T>; +} +declare const $ZodSuccess: $constructor<$ZodSuccess>; +export interface $ZodCatchCtx extends ParsePayload { + /** @deprecated Use `ctx.issues` */ + error: { + issues: $ZodIssue[]; + }; + /** @deprecated Use `ctx.value` */ + input: unknown; +} +export interface $ZodCatchDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "catch"; + innerType: T; + catchValue: (ctx: $ZodCatchCtx) => unknown; +} +export interface $ZodCatchInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<output$1<T>, input$1<T>> { + def: $ZodCatchDef<T>; + optin: T["_zod"]["optin"]; + optout: T["_zod"]["optout"]; + isst: never; + values: T["_zod"]["values"]; +} +export interface $ZodCatch<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodCatchInternals<T>; +} +declare const $ZodCatch: $constructor<$ZodCatch>; +export interface $ZodNaNDef extends $ZodTypeDef { + type: "nan"; +} +export interface $ZodNaNInternals extends $ZodTypeInternals<number, number> { + def: $ZodNaNDef; + isst: $ZodIssueInvalidType; +} +export interface $ZodNaN extends $ZodType { + _zod: $ZodNaNInternals; +} +declare const $ZodNaN: $constructor<$ZodNaN>; +export interface $ZodPipeDef<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends $ZodTypeDef { + type: "pipe"; + in: A; + out: B; + /** Only defined inside $ZodCodec instances. */ + transform?: (value: output$1<A>, payload: ParsePayload<output$1<A>>) => util$1.MaybeAsync<input$1<B>>; + /** Only defined inside $ZodCodec instances. */ + reverseTransform?: (value: input$1<B>, payload: ParsePayload<input$1<B>>) => util$1.MaybeAsync<output$1<A>>; +} +export interface $ZodPipeInternals<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends $ZodTypeInternals<output$1<B>, input$1<A>> { + def: $ZodPipeDef<A, B>; + isst: never; + values: A["_zod"]["values"]; + optin: A["_zod"]["optin"]; + optout: B["_zod"]["optout"]; + propValues: A["_zod"]["propValues"]; +} +export interface $ZodPipe<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodPipeInternals<A, B>; +} +declare const $ZodPipe: $constructor<$ZodPipe>; +export interface $ZodCodecDef<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends $ZodPipeDef<A, B> { + transform: (value: output$1<A>, payload: ParsePayload<output$1<A>>) => util$1.MaybeAsync<input$1<B>>; + reverseTransform: (value: input$1<B>, payload: ParsePayload<input$1<B>>) => util$1.MaybeAsync<output$1<A>>; +} +export interface $ZodCodecInternals<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends $ZodTypeInternals<output$1<B>, input$1<A>> { + def: $ZodCodecDef<A, B>; + isst: never; + values: A["_zod"]["values"]; + optin: A["_zod"]["optin"]; + optout: B["_zod"]["optout"]; + propValues: A["_zod"]["propValues"]; +} +export interface $ZodCodec<A extends SomeType = $ZodType, B extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodCodecInternals<A, B>; +} +declare const $ZodCodec: $constructor<$ZodCodec>; +export interface $ZodReadonlyDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "readonly"; + innerType: T; +} +export interface $ZodReadonlyInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<util$1.MakeReadonly<output$1<T>>, util$1.MakeReadonly<input$1<T>>> { + def: $ZodReadonlyDef<T>; + optin: T["_zod"]["optin"]; + optout: T["_zod"]["optout"]; + isst: never; + propValues: T["_zod"]["propValues"]; + values: T["_zod"]["values"]; +} +export interface $ZodReadonly<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodReadonlyInternals<T>; +} +declare const $ZodReadonly: $constructor<$ZodReadonly>; +export interface $ZodTemplateLiteralDef extends $ZodTypeDef { + type: "template_literal"; + parts: $ZodTemplateLiteralPart[]; + format?: string | undefined; +} +export interface $ZodTemplateLiteralInternals<Template extends string = string> extends $ZodTypeInternals<Template, Template> { + pattern: RegExp; + def: $ZodTemplateLiteralDef; + isst: $ZodIssueInvalidType; +} +export interface $ZodTemplateLiteral<Template extends string = string> extends $ZodType { + _zod: $ZodTemplateLiteralInternals<Template>; +} +export type LiteralPart = Exclude<util$1.Literal, symbol>; +export interface SchemaPartInternals extends $ZodTypeInternals<LiteralPart, LiteralPart> { + pattern: RegExp; +} +export interface SchemaPart extends $ZodType { + _zod: SchemaPartInternals; +} +export type $ZodTemplateLiteralPart = LiteralPart | SchemaPart; +export type UndefinedToEmptyString<T> = T extends undefined ? "" : T; +export type AppendToTemplateLiteral<Template extends string, Suffix extends LiteralPart | $ZodType> = Suffix extends LiteralPart ? `${Template}${UndefinedToEmptyString<Suffix>}` : Suffix extends $ZodType ? `${Template}${output$1<Suffix> extends infer T extends LiteralPart ? UndefinedToEmptyString<T> : never}` : never; +export type ConcatenateTupleOfStrings<T extends string[]> = T extends [ + infer First extends string, + ...infer Rest extends string[] +] ? Rest extends string[] ? First extends "" ? ConcatenateTupleOfStrings<Rest> : `${First}${ConcatenateTupleOfStrings<Rest>}` : never : ""; +export type ConvertPartsToStringTuple<Parts extends $ZodTemplateLiteralPart[]> = { + [K in keyof Parts]: Parts[K] extends LiteralPart ? `${UndefinedToEmptyString<Parts[K]>}` : Parts[K] extends $ZodType ? `${output$1<Parts[K]> extends infer T extends LiteralPart ? UndefinedToEmptyString<T> : never}` : never; +}; +export type ToTemplateLiteral<Parts extends $ZodTemplateLiteralPart[]> = ConcatenateTupleOfStrings<ConvertPartsToStringTuple<Parts>>; +export type $PartsToTemplateLiteral<Parts extends $ZodTemplateLiteralPart[]> = [ +] extends Parts ? `` : Parts extends [ + ...infer Rest, + infer Last extends $ZodTemplateLiteralPart +] ? Rest extends $ZodTemplateLiteralPart[] ? AppendToTemplateLiteral<$PartsToTemplateLiteral<Rest>, Last> : never : never; +declare const $ZodTemplateLiteral: $constructor<$ZodTemplateLiteral>; +export type $ZodFunctionArgs = $ZodType<unknown[], unknown[]>; +export type $ZodFunctionIn = $ZodFunctionArgs; +export type $ZodFunctionOut = $ZodType; +export type $InferInnerFunctionType<Args extends $ZodFunctionIn, Returns extends $ZodFunctionOut> = (...args: $ZodFunctionIn extends Args ? never[] : output$1<Args>) => input$1<Returns>; +export type $InferInnerFunctionTypeAsync<Args extends $ZodFunctionIn, Returns extends $ZodFunctionOut> = (...args: $ZodFunctionIn extends Args ? never[] : output$1<Args>) => util$1.MaybeAsync<input$1<Returns>>; +export type $InferOuterFunctionType<Args extends $ZodFunctionIn, Returns extends $ZodFunctionOut> = (...args: $ZodFunctionIn extends Args ? never[] : input$1<Args>) => output$1<Returns>; +export type $InferOuterFunctionTypeAsync<Args extends $ZodFunctionIn, Returns extends $ZodFunctionOut> = (...args: $ZodFunctionIn extends Args ? never[] : input$1<Args>) => Promise<output$1<Returns>>; +export interface $ZodFunctionDef<In extends $ZodFunctionIn = $ZodFunctionIn, Out extends $ZodFunctionOut = $ZodFunctionOut> extends $ZodTypeDef { + type: "function"; + input: In; + output: Out; +} +export interface $ZodFunctionInternals<Args extends $ZodFunctionIn, Returns extends $ZodFunctionOut> extends $ZodTypeInternals<$InferOuterFunctionType<Args, Returns>, $InferInnerFunctionType<Args, Returns>> { + def: $ZodFunctionDef<Args, Returns>; + isst: $ZodIssueInvalidType; +} +export interface $ZodFunction<Args extends $ZodFunctionIn = $ZodFunctionIn, Returns extends $ZodFunctionOut = $ZodFunctionOut> extends $ZodType<any, any, $ZodFunctionInternals<Args, Returns>> { + /** @deprecated */ + _def: $ZodFunctionDef<Args, Returns>; + _input: $InferInnerFunctionType<Args, Returns>; + _output: $InferOuterFunctionType<Args, Returns>; + implement<F extends $InferInnerFunctionType<Args, Returns>>(func: F): (...args: Parameters<this["_output"]>) => ReturnType<F> extends ReturnType<this["_output"]> ? ReturnType<F> : ReturnType<this["_output"]>; + implementAsync<F extends $InferInnerFunctionTypeAsync<Args, Returns>>(func: F): F extends $InferOuterFunctionTypeAsync<Args, Returns> ? F : $InferOuterFunctionTypeAsync<Args, Returns>; + input<const Items extends util$1.TupleItems, const Rest extends $ZodFunctionOut = $ZodFunctionOut>(args: Items, rest?: Rest): $ZodFunction<$ZodTuple<Items, Rest>, Returns>; + input<NewArgs extends $ZodFunctionIn>(args: NewArgs): $ZodFunction<NewArgs, Returns>; + input(...args: any[]): $ZodFunction<any, Returns>; + output<NewReturns extends $ZodType>(output: NewReturns): $ZodFunction<Args, NewReturns>; +} +export interface $ZodFunctionParams<I extends $ZodFunctionIn, O extends $ZodType> { + input?: I; + output?: O; +} +declare const $ZodFunction: $constructor<$ZodFunction>; +export interface $ZodPromiseDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "promise"; + innerType: T; +} +export interface $ZodPromiseInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<Promise<output$1<T>>, util$1.MaybeAsync<input$1<T>>> { + def: $ZodPromiseDef<T>; + isst: never; +} +export interface $ZodPromise<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodPromiseInternals<T>; +} +declare const $ZodPromise: $constructor<$ZodPromise>; +export interface $ZodLazyDef<T extends SomeType = $ZodType> extends $ZodTypeDef { + type: "lazy"; + getter: () => T; +} +export interface $ZodLazyInternals<T extends SomeType = $ZodType> extends $ZodTypeInternals<output$1<T>, input$1<T>> { + def: $ZodLazyDef<T>; + isst: never; + /** Auto-cached way to retrieve the inner schema */ + innerType: T; + pattern: T["_zod"]["pattern"]; + propValues: T["_zod"]["propValues"]; + optin: T["_zod"]["optin"]; + optout: T["_zod"]["optout"]; +} +export interface $ZodLazy<T extends SomeType = $ZodType> extends $ZodType { + _zod: $ZodLazyInternals<T>; +} +declare const $ZodLazy: $constructor<$ZodLazy>; +export interface $ZodCustomDef<O = unknown> extends $ZodTypeDef, $ZodCheckDef { + type: "custom"; + check: "custom"; + path?: PropertyKey[] | undefined; + error?: $ZodErrorMap | undefined; + params?: Record<string, any> | undefined; + fn: (arg: O) => unknown; +} +export interface $ZodCustomInternals<O = unknown, I = unknown> extends $ZodTypeInternals<O, I>, $ZodCheckInternals<O> { + def: $ZodCustomDef; + issc: $ZodIssue; + isst: never; + bag: util$1.LoosePartial<{ + Class: typeof util$1.Class; + }>; +} +export interface $ZodCustom<O = unknown, I = unknown> extends $ZodType { + _zod: $ZodCustomInternals<O, I>; +} +declare const $ZodCustom: $constructor<$ZodCustom>; +export type $ZodTypes = $ZodString | $ZodNumber | $ZodBigInt | $ZodBoolean | $ZodDate | $ZodSymbol | $ZodUndefined | $ZodNullable | $ZodNull | $ZodAny | $ZodUnknown | $ZodNever | $ZodVoid | $ZodArray | $ZodObject | $ZodUnion | $ZodIntersection | $ZodTuple | $ZodRecord | $ZodMap | $ZodSet | $ZodLiteral | $ZodEnum | $ZodFunction | $ZodPromise | $ZodLazy | $ZodOptional | $ZodDefault | $ZodPrefault | $ZodTemplateLiteral | $ZodCustom | $ZodTransform | $ZodNonOptional | $ZodReadonly | $ZodNaN | $ZodPipe | $ZodSuccess | $ZodCatch | $ZodFile; +export type $ZodStringFormatTypes = $ZodGUID | $ZodUUID | $ZodEmail | $ZodURL | $ZodEmoji | $ZodNanoID | $ZodCUID | $ZodCUID2 | $ZodULID | $ZodXID | $ZodKSUID | $ZodISODateTime | $ZodISODate | $ZodISOTime | $ZodISODuration | $ZodIPv4 | $ZodIPv6 | $ZodMAC | $ZodCIDRv4 | $ZodCIDRv6 | $ZodBase64 | $ZodBase64URL | $ZodE164 | $ZodJWT | $ZodCustomStringFormat<"hex"> | $ZodCustomStringFormat<util$1.HashFormat> | $ZodCustomStringFormat<"hostname">; +export interface $ZodCheckDef { + check: string; + error?: $ZodErrorMap<never> | undefined; + /** If true, no later checks will be executed if this check fails. Default `false`. */ + abort?: boolean | undefined; + /** If provided, this check will only be executed if the function returns `true`. Defaults to `payload => z.util.isAborted(payload)`. */ + when?: ((payload: schemas.ParsePayload) => boolean) | undefined; +} +export interface $ZodCheckInternals<T> { + def: $ZodCheckDef; + /** The set of issues this check might throw. */ + issc?: $ZodIssueBase; + check(payload: schemas.ParsePayload<T>): util$1.MaybeAsync<void>; + onattach: ((schema: schemas.$ZodType) => void)[]; +} +export interface $ZodCheck<in T = never> { + _zod: $ZodCheckInternals<T>; +} +declare const $ZodCheck: $constructor<$ZodCheck<any>>; +export interface $ZodCheckLessThanDef extends $ZodCheckDef { + check: "less_than"; + value: util$1.Numeric; + inclusive: boolean; +} +export interface $ZodCheckLessThanInternals<T extends util$1.Numeric = util$1.Numeric> extends $ZodCheckInternals<T> { + def: $ZodCheckLessThanDef; + issc: $ZodIssueTooBig<T>; +} +export interface $ZodCheckLessThan<T extends util$1.Numeric = util$1.Numeric> extends $ZodCheck<T> { + _zod: $ZodCheckLessThanInternals<T>; +} +declare const $ZodCheckLessThan: $constructor<$ZodCheckLessThan>; +export interface $ZodCheckGreaterThanDef extends $ZodCheckDef { + check: "greater_than"; + value: util$1.Numeric; + inclusive: boolean; +} +export interface $ZodCheckGreaterThanInternals<T extends util$1.Numeric = util$1.Numeric> extends $ZodCheckInternals<T> { + def: $ZodCheckGreaterThanDef; + issc: $ZodIssueTooSmall<T>; +} +export interface $ZodCheckGreaterThan<T extends util$1.Numeric = util$1.Numeric> extends $ZodCheck<T> { + _zod: $ZodCheckGreaterThanInternals<T>; +} +declare const $ZodCheckGreaterThan: $constructor<$ZodCheckGreaterThan>; +export interface $ZodCheckMultipleOfDef<T extends number | bigint = number | bigint> extends $ZodCheckDef { + check: "multiple_of"; + value: T; +} +export interface $ZodCheckMultipleOfInternals<T extends number | bigint = number | bigint> extends $ZodCheckInternals<T> { + def: $ZodCheckMultipleOfDef<T>; + issc: $ZodIssueNotMultipleOf; +} +export interface $ZodCheckMultipleOf<T extends number | bigint = number | bigint> extends $ZodCheck<T> { + _zod: $ZodCheckMultipleOfInternals<T>; +} +declare const $ZodCheckMultipleOf: $constructor<$ZodCheckMultipleOf<number | bigint>>; +export type $ZodNumberFormats = "int32" | "uint32" | "float32" | "float64" | "safeint"; +export interface $ZodCheckNumberFormatDef extends $ZodCheckDef { + check: "number_format"; + format: $ZodNumberFormats; +} +export interface $ZodCheckNumberFormatInternals extends $ZodCheckInternals<number> { + def: $ZodCheckNumberFormatDef; + issc: $ZodIssueInvalidType | $ZodIssueTooBig<"number"> | $ZodIssueTooSmall<"number">; +} +export interface $ZodCheckNumberFormat extends $ZodCheck<number> { + _zod: $ZodCheckNumberFormatInternals; +} +declare const $ZodCheckNumberFormat: $constructor<$ZodCheckNumberFormat>; +export type $ZodBigIntFormats = "int64" | "uint64"; +export interface $ZodCheckBigIntFormatDef extends $ZodCheckDef { + check: "bigint_format"; + format: $ZodBigIntFormats | undefined; +} +export interface $ZodCheckBigIntFormatInternals extends $ZodCheckInternals<bigint> { + def: $ZodCheckBigIntFormatDef; + issc: $ZodIssueTooBig<"bigint"> | $ZodIssueTooSmall<"bigint">; +} +export interface $ZodCheckBigIntFormat extends $ZodCheck<bigint> { + _zod: $ZodCheckBigIntFormatInternals; +} +declare const $ZodCheckBigIntFormat: $constructor<$ZodCheckBigIntFormat>; +export interface $ZodCheckMaxSizeDef extends $ZodCheckDef { + check: "max_size"; + maximum: number; +} +export interface $ZodCheckMaxSizeInternals<T extends util$1.HasSize = util$1.HasSize> extends $ZodCheckInternals<T> { + def: $ZodCheckMaxSizeDef; + issc: $ZodIssueTooBig<T>; +} +export interface $ZodCheckMaxSize<T extends util$1.HasSize = util$1.HasSize> extends $ZodCheck<T> { + _zod: $ZodCheckMaxSizeInternals<T>; +} +declare const $ZodCheckMaxSize: $constructor<$ZodCheckMaxSize>; +export interface $ZodCheckMinSizeDef extends $ZodCheckDef { + check: "min_size"; + minimum: number; +} +export interface $ZodCheckMinSizeInternals<T extends util$1.HasSize = util$1.HasSize> extends $ZodCheckInternals<T> { + def: $ZodCheckMinSizeDef; + issc: $ZodIssueTooSmall<T>; +} +export interface $ZodCheckMinSize<T extends util$1.HasSize = util$1.HasSize> extends $ZodCheck<T> { + _zod: $ZodCheckMinSizeInternals<T>; +} +declare const $ZodCheckMinSize: $constructor<$ZodCheckMinSize>; +export interface $ZodCheckSizeEqualsDef extends $ZodCheckDef { + check: "size_equals"; + size: number; +} +export interface $ZodCheckSizeEqualsInternals<T extends util$1.HasSize = util$1.HasSize> extends $ZodCheckInternals<T> { + def: $ZodCheckSizeEqualsDef; + issc: $ZodIssueTooBig<T> | $ZodIssueTooSmall<T>; +} +export interface $ZodCheckSizeEquals<T extends util$1.HasSize = util$1.HasSize> extends $ZodCheck<T> { + _zod: $ZodCheckSizeEqualsInternals<T>; +} +declare const $ZodCheckSizeEquals: $constructor<$ZodCheckSizeEquals>; +export interface $ZodCheckMaxLengthDef extends $ZodCheckDef { + check: "max_length"; + maximum: number; +} +export interface $ZodCheckMaxLengthInternals<T extends util$1.HasLength = util$1.HasLength> extends $ZodCheckInternals<T> { + def: $ZodCheckMaxLengthDef; + issc: $ZodIssueTooBig<T>; +} +export interface $ZodCheckMaxLength<T extends util$1.HasLength = util$1.HasLength> extends $ZodCheck<T> { + _zod: $ZodCheckMaxLengthInternals<T>; +} +declare const $ZodCheckMaxLength: $constructor<$ZodCheckMaxLength>; +export interface $ZodCheckMinLengthDef extends $ZodCheckDef { + check: "min_length"; + minimum: number; +} +export interface $ZodCheckMinLengthInternals<T extends util$1.HasLength = util$1.HasLength> extends $ZodCheckInternals<T> { + def: $ZodCheckMinLengthDef; + issc: $ZodIssueTooSmall<T>; +} +export interface $ZodCheckMinLength<T extends util$1.HasLength = util$1.HasLength> extends $ZodCheck<T> { + _zod: $ZodCheckMinLengthInternals<T>; +} +declare const $ZodCheckMinLength: $constructor<$ZodCheckMinLength>; +export interface $ZodCheckLengthEqualsDef extends $ZodCheckDef { + check: "length_equals"; + length: number; +} +export interface $ZodCheckLengthEqualsInternals<T extends util$1.HasLength = util$1.HasLength> extends $ZodCheckInternals<T> { + def: $ZodCheckLengthEqualsDef; + issc: $ZodIssueTooBig<T> | $ZodIssueTooSmall<T>; +} +export interface $ZodCheckLengthEquals<T extends util$1.HasLength = util$1.HasLength> extends $ZodCheck<T> { + _zod: $ZodCheckLengthEqualsInternals<T>; +} +declare const $ZodCheckLengthEquals: $constructor<$ZodCheckLengthEquals>; +export type $ZodStringFormats = "email" | "url" | "emoji" | "uuid" | "guid" | "nanoid" | "cuid" | "cuid2" | "ulid" | "xid" | "ksuid" | "datetime" | "date" | "time" | "duration" | "ipv4" | "ipv6" | "cidrv4" | "cidrv6" | "base64" | "base64url" | "json_string" | "e164" | "lowercase" | "uppercase" | "regex" | "jwt" | "starts_with" | "ends_with" | "includes"; +export interface $ZodCheckStringFormatDef<Format extends string = string> extends $ZodCheckDef { + check: "string_format"; + format: Format; + pattern?: RegExp | undefined; +} +export interface $ZodCheckStringFormatInternals extends $ZodCheckInternals<string> { + def: $ZodCheckStringFormatDef; + issc: $ZodIssueInvalidStringFormat; +} +export interface $ZodCheckStringFormat extends $ZodCheck<string> { + _zod: $ZodCheckStringFormatInternals; +} +declare const $ZodCheckStringFormat: $constructor<$ZodCheckStringFormat>; +export interface $ZodCheckRegexDef extends $ZodCheckStringFormatDef { + format: "regex"; + pattern: RegExp; +} +export interface $ZodCheckRegexInternals extends $ZodCheckInternals<string> { + def: $ZodCheckRegexDef; + issc: $ZodIssueInvalidStringFormat; +} +export interface $ZodCheckRegex extends $ZodCheck<string> { + _zod: $ZodCheckRegexInternals; +} +declare const $ZodCheckRegex: $constructor<$ZodCheckRegex>; +export interface $ZodCheckLowerCaseDef extends $ZodCheckStringFormatDef<"lowercase"> { +} +export interface $ZodCheckLowerCaseInternals extends $ZodCheckInternals<string> { + def: $ZodCheckLowerCaseDef; + issc: $ZodIssueInvalidStringFormat; +} +export interface $ZodCheckLowerCase extends $ZodCheck<string> { + _zod: $ZodCheckLowerCaseInternals; +} +declare const $ZodCheckLowerCase: $constructor<$ZodCheckLowerCase>; +export interface $ZodCheckUpperCaseDef extends $ZodCheckStringFormatDef<"uppercase"> { +} +export interface $ZodCheckUpperCaseInternals extends $ZodCheckInternals<string> { + def: $ZodCheckUpperCaseDef; + issc: $ZodIssueInvalidStringFormat; +} +export interface $ZodCheckUpperCase extends $ZodCheck<string> { + _zod: $ZodCheckUpperCaseInternals; +} +declare const $ZodCheckUpperCase: $constructor<$ZodCheckUpperCase>; +export interface $ZodCheckIncludesDef extends $ZodCheckStringFormatDef<"includes"> { + includes: string; + position?: number | undefined; +} +export interface $ZodCheckIncludesInternals extends $ZodCheckInternals<string> { + def: $ZodCheckIncludesDef; + issc: $ZodIssueInvalidStringFormat; +} +export interface $ZodCheckIncludes extends $ZodCheck<string> { + _zod: $ZodCheckIncludesInternals; +} +declare const $ZodCheckIncludes: $constructor<$ZodCheckIncludes>; +export interface $ZodCheckStartsWithDef extends $ZodCheckStringFormatDef<"starts_with"> { + prefix: string; +} +export interface $ZodCheckStartsWithInternals extends $ZodCheckInternals<string> { + def: $ZodCheckStartsWithDef; + issc: $ZodIssueInvalidStringFormat; +} +export interface $ZodCheckStartsWith extends $ZodCheck<string> { + _zod: $ZodCheckStartsWithInternals; +} +declare const $ZodCheckStartsWith: $constructor<$ZodCheckStartsWith>; +export interface $ZodCheckEndsWithDef extends $ZodCheckStringFormatDef<"ends_with"> { + suffix: string; +} +export interface $ZodCheckEndsWithInternals extends $ZodCheckInternals<string> { + def: $ZodCheckEndsWithDef; + issc: $ZodIssueInvalidStringFormat; +} +export interface $ZodCheckEndsWith extends $ZodCheckInternals<string> { + _zod: $ZodCheckEndsWithInternals; +} +declare const $ZodCheckEndsWith: $constructor<$ZodCheckEndsWith>; +export interface $ZodCheckPropertyDef extends $ZodCheckDef { + check: "property"; + property: string; + schema: schemas.$ZodType; +} +export interface $ZodCheckPropertyInternals<T extends object = object> extends $ZodCheckInternals<T> { + def: $ZodCheckPropertyDef; + issc: $ZodIssue; +} +export interface $ZodCheckProperty<T extends object = object> extends $ZodCheck<T> { + _zod: $ZodCheckPropertyInternals<T>; +} +declare const $ZodCheckProperty: $constructor<$ZodCheckProperty>; +export interface $ZodCheckMimeTypeDef extends $ZodCheckDef { + check: "mime_type"; + mime: util$1.MimeTypes[]; +} +export interface $ZodCheckMimeTypeInternals<T extends schemas.File = schemas.File> extends $ZodCheckInternals<T> { + def: $ZodCheckMimeTypeDef; + issc: $ZodIssueInvalidValue; +} +export interface $ZodCheckMimeType<T extends schemas.File = schemas.File> extends $ZodCheck<T> { + _zod: $ZodCheckMimeTypeInternals<T>; +} +declare const $ZodCheckMimeType: $constructor<$ZodCheckMimeType>; +export interface $ZodCheckOverwriteDef<T = unknown> extends $ZodCheckDef { + check: "overwrite"; + tx(value: T): T; +} +export interface $ZodCheckOverwriteInternals<T = unknown> extends $ZodCheckInternals<T> { + def: $ZodCheckOverwriteDef<T>; + issc: never; +} +export interface $ZodCheckOverwrite<T = unknown> extends $ZodCheck<T> { + _zod: $ZodCheckOverwriteInternals<T>; +} +declare const $ZodCheckOverwrite: $constructor<$ZodCheckOverwrite>; +export type $ZodChecks = $ZodCheckLessThan | $ZodCheckGreaterThan | $ZodCheckMultipleOf | $ZodCheckNumberFormat | $ZodCheckBigIntFormat | $ZodCheckMaxSize | $ZodCheckMinSize | $ZodCheckSizeEquals | $ZodCheckMaxLength | $ZodCheckMinLength | $ZodCheckLengthEquals | $ZodCheckStringFormat | $ZodCheckProperty | $ZodCheckMimeType | $ZodCheckOverwrite; +export type $ZodStringFormatChecks = $ZodCheckRegex | $ZodCheckLowerCase | $ZodCheckUpperCase | $ZodCheckIncludes | $ZodCheckStartsWith | $ZodCheckEndsWith | schemas.$ZodStringFormatTypes; +export interface $ZodIssueBase { + readonly code?: string; + readonly input?: unknown; + readonly path: PropertyKey[]; + readonly message: string; +} +export type $ZodInvalidTypeExpected = "string" | "number" | "int" | "boolean" | "bigint" | "symbol" | "undefined" | "null" | "never" | "void" | "date" | "array" | "object" | "tuple" | "record" | "map" | "set" | "file" | "nonoptional" | "nan" | "function" | (string & {}); +export interface $ZodIssueInvalidType<Input = unknown> extends $ZodIssueBase { + readonly code: "invalid_type"; + readonly expected: $ZodInvalidTypeExpected; + readonly input?: Input; +} +export interface $ZodIssueTooBig<Input = unknown> extends $ZodIssueBase { + readonly code: "too_big"; + readonly origin: "number" | "int" | "bigint" | "date" | "string" | "array" | "set" | "file" | (string & {}); + readonly maximum: number | bigint; + readonly inclusive?: boolean; + readonly exact?: boolean; + readonly input?: Input; +} +export interface $ZodIssueTooSmall<Input = unknown> extends $ZodIssueBase { + readonly code: "too_small"; + readonly origin: "number" | "int" | "bigint" | "date" | "string" | "array" | "set" | "file" | (string & {}); + readonly minimum: number | bigint; + /** True if the allowable range includes the minimum */ + readonly inclusive?: boolean; + /** True if the allowed value is fixed (e.g.` z.length(5)`), not a range (`z.minLength(5)`) */ + readonly exact?: boolean; + readonly input?: Input; +} +export interface $ZodIssueInvalidStringFormat extends $ZodIssueBase { + readonly code: "invalid_format"; + readonly format: $ZodStringFormats | (string & {}); + readonly pattern?: string; + readonly input?: string; +} +export interface $ZodIssueNotMultipleOf<Input extends number | bigint = number | bigint> extends $ZodIssueBase { + readonly code: "not_multiple_of"; + readonly divisor: number; + readonly input?: Input; +} +export interface $ZodIssueUnrecognizedKeys extends $ZodIssueBase { + readonly code: "unrecognized_keys"; + readonly keys: string[]; + readonly input?: Record<string, unknown>; +} +export interface $ZodIssueInvalidUnionNoMatch extends $ZodIssueBase { + readonly code: "invalid_union"; + readonly errors: $ZodIssue[][]; + readonly input?: unknown; + readonly discriminator?: string | undefined; + readonly inclusive?: true; +} +export interface $ZodIssueInvalidUnionMultipleMatch extends $ZodIssueBase { + readonly code: "invalid_union"; + readonly errors: [ + ]; + readonly input?: unknown; + readonly discriminator?: string | undefined; + readonly inclusive: false; +} +export type $ZodIssueInvalidUnion = $ZodIssueInvalidUnionNoMatch | $ZodIssueInvalidUnionMultipleMatch; +export interface $ZodIssueInvalidKey<Input = unknown> extends $ZodIssueBase { + readonly code: "invalid_key"; + readonly origin: "map" | "record"; + readonly issues: $ZodIssue[]; + readonly input?: Input; +} +export interface $ZodIssueInvalidElement<Input = unknown> extends $ZodIssueBase { + readonly code: "invalid_element"; + readonly origin: "map" | "set"; + readonly key: unknown; + readonly issues: $ZodIssue[]; + readonly input?: Input; +} +export interface $ZodIssueInvalidValue<Input = unknown> extends $ZodIssueBase { + readonly code: "invalid_value"; + readonly values: util$1.Primitive[]; + readonly input?: Input; +} +export interface $ZodIssueCustom extends $ZodIssueBase { + readonly code: "custom"; + readonly params?: Record<string, any> | undefined; + readonly input?: unknown; +} +export interface $ZodIssueStringCommonFormats extends $ZodIssueInvalidStringFormat { + format: Exclude<$ZodStringFormats, "regex" | "jwt" | "starts_with" | "ends_with" | "includes">; +} +export interface $ZodIssueStringInvalidRegex extends $ZodIssueInvalidStringFormat { + format: "regex"; + pattern: string; +} +export interface $ZodIssueStringInvalidJWT extends $ZodIssueInvalidStringFormat { + format: "jwt"; + algorithm?: string; +} +export interface $ZodIssueStringStartsWith extends $ZodIssueInvalidStringFormat { + format: "starts_with"; + prefix: string; +} +export interface $ZodIssueStringEndsWith extends $ZodIssueInvalidStringFormat { + format: "ends_with"; + suffix: string; +} +export interface $ZodIssueStringIncludes extends $ZodIssueInvalidStringFormat { + format: "includes"; + includes: string; +} +export type $ZodStringFormatIssues = $ZodIssueStringCommonFormats | $ZodIssueStringInvalidRegex | $ZodIssueStringInvalidJWT | $ZodIssueStringStartsWith | $ZodIssueStringEndsWith | $ZodIssueStringIncludes; +export type $ZodIssue = $ZodIssueInvalidType | $ZodIssueTooBig | $ZodIssueTooSmall | $ZodIssueInvalidStringFormat | $ZodIssueNotMultipleOf | $ZodIssueUnrecognizedKeys | $ZodIssueInvalidUnion | $ZodIssueInvalidKey | $ZodIssueInvalidElement | $ZodIssueInvalidValue | $ZodIssueCustom; +export type $ZodIssueCode = $ZodIssue["code"]; +export type $ZodInternalIssue<T extends $ZodIssueBase = $ZodIssue> = T extends any ? RawIssue<T> : never; +export type RawIssue<T extends $ZodIssueBase> = T extends any ? util$1.Flatten<util$1.MakePartial<T, "message" | "path"> & { + /** The input data */ + readonly input: unknown; + /** The schema or check that originated this issue. */ + readonly inst?: $ZodType | $ZodCheck; + /** If `true`, Zod will continue executing checks/refinements after this issue. */ + readonly continue?: boolean | undefined; +} & Record<string, unknown>> : never; +export type $ZodRawIssue<T extends $ZodIssueBase = $ZodIssue> = $ZodInternalIssue<T>; +export interface $ZodErrorMap<T extends $ZodIssueBase = $ZodIssue> { + (issue: $ZodRawIssue<T>): { + message: string; + } | string | undefined | null; +} +export interface $ZodError<T = unknown> extends Error { + type: T; + issues: $ZodIssue[]; + _zod: { + output: T; + def: $ZodIssue[]; + }; + stack?: string; + name: string; +} +declare const $ZodError: $constructor<$ZodError>; +export interface $ZodRealError<T = any> extends $ZodError<T> { +} +declare const $ZodRealError$1: $constructor<$ZodRealError>; +export type $ZodFlattenedError<T, U = string> = _FlattenedError<T, U>; +export type _FlattenedError<T, U = string> = { + formErrors: U[]; + fieldErrors: { + [P in keyof T]?: U[]; + }; +}; +declare function flattenError<T>(error: $ZodError<T>): _FlattenedError<T>; +declare function flattenError<T, U>(error: $ZodError<T>, mapper?: (issue: $ZodIssue) => U): _FlattenedError<T, U>; +export type _ZodFormattedError<T, U = string> = T extends [ + any, + ...any[] +] ? { + [K in keyof T]?: $ZodFormattedError<T[K], U>; +} : T extends any[] ? { + [k: number]: $ZodFormattedError<T[number], U>; +} : T extends object ? util$1.Flatten<{ + [K in keyof T]?: $ZodFormattedError<T[K], U>; +}> : any; +export type $ZodFormattedError<T, U = string> = { + _errors: U[]; +} & util$1.Flatten<_ZodFormattedError<T, U>>; +declare function formatError<T>(error: $ZodError<T>): $ZodFormattedError<T>; +declare function formatError<T, U>(error: $ZodError<T>, mapper?: (issue: $ZodIssue) => U): $ZodFormattedError<T, U>; +export type $ZodErrorTree<T, U = string> = T extends util$1.Primitive ? { + errors: U[]; +} : T extends [ + any, + ...any[] +] ? { + errors: U[]; + items?: { + [K in keyof T]?: $ZodErrorTree<T[K], U>; + }; +} : T extends any[] ? { + errors: U[]; + items?: Array<$ZodErrorTree<T[number], U>>; +} : T extends object ? { + errors: U[]; + properties?: { + [K in keyof T]?: $ZodErrorTree<T[K], U>; + }; +} : { + errors: U[]; +}; +declare function treeifyError<T>(error: $ZodError<T>): $ZodErrorTree<T>; +declare function treeifyError<T, U>(error: $ZodError<T>, mapper?: (issue: $ZodIssue) => U): $ZodErrorTree<T, U>; +declare function toDotPath(_path: readonly (string | number | symbol | StandardSchemaV1$1.PathSegment)[]): string; +declare function prettifyError(error: StandardSchemaV1$1.FailureResult): string; +export type ZodTrait = { + _zod: { + def: any; + [k: string]: any; + }; +}; +export interface $constructor<T extends ZodTrait, D = T["_zod"]["def"]> { + new (def: D): T; + init(inst: T, def: D): asserts inst is T; +} +declare const NEVER: never; +declare function $constructor<T extends ZodTrait, D = T["_zod"]["def"]>(name: string, initializer: (inst: T, def: D) => void, params?: { + Parent?: typeof Class; +}): $constructor<T, D>; +declare const $brand: unique symbol; +export type $brand<T extends string | number | symbol = string | number | symbol> = { + [$brand]: { + [k in T]: true; + }; +}; +export type $ZodBranded<T extends schemas.SomeType, Brand extends string | number | symbol, Dir extends "in" | "out" | "inout" = "out"> = T & (Dir extends "inout" ? { + _zod: { + input: input$1<T> & $brand<Brand>; + output: output$1<T> & $brand<Brand>; + }; +} : Dir extends "in" ? { + _zod: { + input: input$1<T> & $brand<Brand>; + }; +} : { + _zod: { + output: output$1<T> & $brand<Brand>; + }; +}); +export type $ZodNarrow<T extends schemas.SomeType, Out> = T & { + _zod: { + output: Out; + }; +}; +declare class $ZodAsyncError extends Error { + constructor(); +} +declare class $ZodEncodeError extends Error { + constructor(name: string); +} +type input$1<T> = T extends { + _zod: { + input: any; + }; +} ? T["_zod"]["input"] : unknown; +type output$1<T> = T extends { + _zod: { + output: any; + }; +} ? T["_zod"]["output"] : unknown; +export interface $ZodConfig { + /** Custom error map. Overrides `config().localeError`. */ + customError?: $ZodErrorMap | undefined; + /** Localized error map. Lowest priority. */ + localeError?: $ZodErrorMap | undefined; + /** Disable JIT schema compilation. Useful in environments that disallow `eval`. */ + jitless?: boolean | undefined; +} +declare const globalConfig: $ZodConfig; +declare function config(newConfig?: Partial<$ZodConfig>): $ZodConfig; +export type $ZodErrorClass = { + new (issues: $ZodIssue[]): $ZodError; +}; +export type $Parse = <T extends schemas.$ZodType>(schema: T, value: unknown, _ctx?: schemas.ParseContext<$ZodIssue>, _params?: { + callee?: util$1.AnyFunc; + Err?: $ZodErrorClass; +}) => output$1<T>; +declare const _parse: (_Err: $ZodErrorClass) => $Parse; +declare const parse: $Parse; +export type $ParseAsync = <T extends schemas.$ZodType>(schema: T, value: unknown, _ctx?: schemas.ParseContext<$ZodIssue>, _params?: { + callee?: util$1.AnyFunc; + Err?: $ZodErrorClass; +}) => Promise<output$1<T>>; +declare const _parseAsync: (_Err: $ZodErrorClass) => $ParseAsync; +declare const parseAsync: $ParseAsync; +export type $SafeParse = <T extends schemas.$ZodType>(schema: T, value: unknown, _ctx?: schemas.ParseContext<$ZodIssue>) => util$1.SafeParseResult<output$1<T>>; +declare const _safeParse: (_Err: $ZodErrorClass) => $SafeParse; +declare const safeParse: $SafeParse; +export type $SafeParseAsync = <T extends schemas.$ZodType>(schema: T, value: unknown, _ctx?: schemas.ParseContext<$ZodIssue>) => Promise<util$1.SafeParseResult<output$1<T>>>; +declare const _safeParseAsync: (_Err: $ZodErrorClass) => $SafeParseAsync; +declare const safeParseAsync: $SafeParseAsync; +export type $Encode = <T extends schemas.$ZodType>(schema: T, value: output$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => input$1<T>; +declare const _encode: (_Err: $ZodErrorClass) => $Encode; +declare const encode: $Encode; +export type $Decode = <T extends schemas.$ZodType>(schema: T, value: input$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => output$1<T>; +declare const _decode: (_Err: $ZodErrorClass) => $Decode; +declare const decode: $Decode; +export type $EncodeAsync = <T extends schemas.$ZodType>(schema: T, value: output$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => Promise<input$1<T>>; +declare const _encodeAsync: (_Err: $ZodErrorClass) => $EncodeAsync; +declare const encodeAsync: $EncodeAsync; +export type $DecodeAsync = <T extends schemas.$ZodType>(schema: T, value: input$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => Promise<output$1<T>>; +declare const _decodeAsync: (_Err: $ZodErrorClass) => $DecodeAsync; +declare const decodeAsync: $DecodeAsync; +export type $SafeEncode = <T extends schemas.$ZodType>(schema: T, value: output$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => util$1.SafeParseResult<input$1<T>>; +declare const _safeEncode: (_Err: $ZodErrorClass) => $SafeEncode; +declare const safeEncode: $SafeEncode; +export type $SafeDecode = <T extends schemas.$ZodType>(schema: T, value: input$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => util$1.SafeParseResult<output$1<T>>; +declare const _safeDecode: (_Err: $ZodErrorClass) => $SafeDecode; +declare const safeDecode: $SafeDecode; +export type $SafeEncodeAsync = <T extends schemas.$ZodType>(schema: T, value: output$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => Promise<util$1.SafeParseResult<input$1<T>>>; +declare const _safeEncodeAsync: (_Err: $ZodErrorClass) => $SafeEncodeAsync; +declare const safeEncodeAsync: $SafeEncodeAsync; +export type $SafeDecodeAsync = <T extends schemas.$ZodType>(schema: T, value: input$1<T>, _ctx?: schemas.ParseContext<$ZodIssue>) => Promise<util$1.SafeParseResult<output$1<T>>>; +declare const _safeDecodeAsync: (_Err: $ZodErrorClass) => $SafeDecodeAsync; +declare const safeDecodeAsync: $SafeDecodeAsync; +declare const cuid: RegExp; +declare const cuid2: RegExp; +declare const ulid: RegExp; +declare const xid: RegExp; +declare const ksuid: RegExp; +declare const nanoid: RegExp; +declare const duration: RegExp; +declare const extendedDuration: RegExp; +declare const guid: RegExp; +declare const uuid: (version?: number | undefined) => RegExp; +declare const uuid4: RegExp; +declare const uuid6: RegExp; +declare const uuid7: RegExp; +declare const email: RegExp; +declare const html5Email: RegExp; +declare const rfc5322Email: RegExp; +declare const unicodeEmail: RegExp; +declare const idnEmail: RegExp; +declare const browserEmail: RegExp; +declare function emoji(): RegExp; +declare const ipv4: RegExp; +declare const ipv6: RegExp; +declare const mac: (delimiter?: string) => RegExp; +declare const cidrv4: RegExp; +declare const cidrv6: RegExp; +declare const base64: RegExp; +declare const base64url: RegExp; +declare const hostname: RegExp; +declare const domain: RegExp; +declare const e164: RegExp; +declare const date: RegExp; +declare function time(args: { + precision?: number | null; +}): RegExp; +declare function datetime(args: { + precision?: number | null; + offset?: boolean; + local?: boolean; +}): RegExp; +declare const string: (params?: { + minimum?: number | undefined; + maximum?: number | undefined; +}) => RegExp; +declare const bigint: RegExp; +declare const integer: RegExp; +declare const number: RegExp; +declare const boolean: RegExp; +declare const _null: RegExp; +declare const _undefined: RegExp; +declare const lowercase: RegExp; +declare const uppercase: RegExp; +declare const hex: RegExp; +declare const md5_hex: RegExp; +declare const md5_base64: RegExp; +declare const md5_base64url: RegExp; +declare const sha1_hex: RegExp; +declare const sha1_base64: RegExp; +declare const sha1_base64url: RegExp; +declare const sha256_hex: RegExp; +declare const sha256_base64: RegExp; +declare const sha256_base64url: RegExp; +declare const sha384_hex: RegExp; +declare const sha384_base64: RegExp; +declare const sha384_base64url: RegExp; +declare const sha512_hex: RegExp; +declare const sha512_base64: RegExp; +declare const sha512_base64url: RegExp; +declare function _default(): { + localeError: $ZodErrorMap; +}; +declare function _default$1(): { + localeError: $ZodErrorMap; +}; +declare function _default$2(): { + localeError: $ZodErrorMap; +}; +declare function _default$3(): { + localeError: $ZodErrorMap; +}; +declare function _default$4(): { + localeError: $ZodErrorMap; +}; +declare function _default$5(): { + localeError: $ZodErrorMap; +}; +declare function _default$6(): { + localeError: $ZodErrorMap; +}; +declare function _default$7(): { + localeError: $ZodErrorMap; +}; +declare function _default$8(): { + localeError: $ZodErrorMap; +}; +declare function _default$9(): { + localeError: $ZodErrorMap; +}; +declare function _default$10(): { + localeError: $ZodErrorMap; +}; +declare function _default$11(): { + localeError: $ZodErrorMap; +}; +declare function _default$12(): { + localeError: $ZodErrorMap; +}; +declare function _default$13(): { + localeError: $ZodErrorMap; +}; +declare function _default$14(): { + localeError: $ZodErrorMap; +}; +declare function _default$15(): { + localeError: $ZodErrorMap; +}; +declare function _default$16(): { + localeError: $ZodErrorMap; +}; +declare function _default$17(): { + localeError: $ZodErrorMap; +}; +declare function _default$18(): { + localeError: $ZodErrorMap; +}; +declare function _default$19(): { + localeError: $ZodErrorMap; +}; +declare function _default$20(): { + localeError: $ZodErrorMap; +}; +declare function _default$21(): { + localeError: $ZodErrorMap; +}; +declare function _default$22(): { + localeError: $ZodErrorMap; +}; +declare function _default$23(): { + localeError: $ZodErrorMap; +}; +declare function _default$24(): { + localeError: $ZodErrorMap; +}; +declare function _default$25(): { + localeError: $ZodErrorMap; +}; +declare function _default$26(): { + localeError: $ZodErrorMap; +}; +declare function _default$27(): { + localeError: $ZodErrorMap; +}; +declare function _default$28(): { + localeError: $ZodErrorMap; +}; +declare function _default$29(): { + localeError: $ZodErrorMap; +}; +declare function _default$30(): { + localeError: $ZodErrorMap; +}; +declare function _default$31(): { + localeError: $ZodErrorMap; +}; +declare function _default$32(): { + localeError: $ZodErrorMap; +}; +declare function _default$33(): { + localeError: $ZodErrorMap; +}; +declare function _default$34(): { + localeError: $ZodErrorMap; +}; +declare function _default$35(): { + localeError: $ZodErrorMap; +}; +declare function _default$36(): { + localeError: $ZodErrorMap; +}; +declare function _default$37(): { + localeError: $ZodErrorMap; +}; +declare function _default$38(): { + localeError: $ZodErrorMap; +}; +declare function _default$39(): { + localeError: $ZodErrorMap; +}; +declare function _default$40(): { + localeError: $ZodErrorMap; +}; +declare function _default$41(): { + localeError: $ZodErrorMap; +}; +declare function _default$42(): { + localeError: $ZodErrorMap; +}; +declare function _default$43(): { + localeError: $ZodErrorMap; +}; +declare function _default$44(): { + localeError: $ZodErrorMap; +}; +declare function _default$45(): { + localeError: $ZodErrorMap; +}; +declare function _default$46(): { + localeError: $ZodErrorMap; +}; +declare function _default$47(): { + localeError: $ZodErrorMap; +}; +declare function _default$48(): { + localeError: $ZodErrorMap; +}; +export type ModeWriter = (doc: Doc, modes: { + execution: "sync" | "async"; +}) => void; +declare class Doc { + args: string[]; + content: string[]; + indent: number; + constructor(args?: string[]); + indented(fn: (doc: Doc) => void): void; + write(fn: ModeWriter): void; + write(line: string): void; + compile(): any; +} +export type Params<T extends schemas.$ZodType | $ZodCheck, IssueTypes extends $ZodIssueBase, OmitKeys extends keyof T["_zod"]["def"] = never> = util$1.Flatten<Partial<util$1.EmptyToNever<Omit<T["_zod"]["def"], OmitKeys> & ([ + IssueTypes +] extends [ + never +] ? {} : { + error?: string | $ZodErrorMap<IssueTypes> | undefined; + /** @deprecated This parameter is deprecated. Use `error` instead. */ + message?: string | undefined; +})>>>; +export type TypeParams<T extends schemas.$ZodType = schemas.$ZodType & { + _isst: never; +}, AlsoOmit extends Exclude<keyof T["_zod"]["def"], "type" | "checks" | "error"> = never> = Params<T, NonNullable<T["_zod"]["isst"]>, "type" | "checks" | "error" | AlsoOmit>; +export type CheckParams<T extends $ZodCheck = $ZodCheck, // & { _issc: never }, +AlsoOmit extends Exclude<keyof T["_zod"]["def"], "check" | "error"> = never> = Params<T, NonNullable<T["_zod"]["issc"]>, "check" | "error" | AlsoOmit>; +export type StringFormatParams<T extends schemas.$ZodStringFormat = schemas.$ZodStringFormat, AlsoOmit extends Exclude<keyof T["_zod"]["def"], "type" | "coerce" | "checks" | "error" | "check" | "format"> = never> = Params<T, NonNullable<T["_zod"]["isst"] | T["_zod"]["issc"]>, "type" | "coerce" | "checks" | "error" | "check" | "format" | AlsoOmit>; +export type CheckStringFormatParams<T extends schemas.$ZodStringFormat = schemas.$ZodStringFormat, AlsoOmit extends Exclude<keyof T["_zod"]["def"], "type" | "coerce" | "checks" | "error" | "check" | "format"> = never> = Params<T, NonNullable<T["_zod"]["issc"]>, "type" | "coerce" | "checks" | "error" | "check" | "format" | AlsoOmit>; +export type CheckTypeParams<T extends schemas.$ZodType & $ZodCheck = schemas.$ZodType & $ZodCheck, AlsoOmit extends Exclude<keyof T["_zod"]["def"], "type" | "checks" | "error" | "check"> = never> = Params<T, NonNullable<T["_zod"]["isst"] | T["_zod"]["issc"]>, "type" | "checks" | "error" | "check" | AlsoOmit>; +export type $ZodStringParams = TypeParams<schemas.$ZodString<string>, "coerce">; +declare function _string<T extends schemas.$ZodString>(Class: util$1.SchemaClass<T>, params?: string | $ZodStringParams): T; +declare function _coercedString<T extends schemas.$ZodString>(Class: util$1.SchemaClass<T>, params?: string | $ZodStringParams): T; +export type $ZodStringFormatParams = CheckTypeParams<schemas.$ZodStringFormat, "format" | "coerce" | "when" | "pattern">; +export type $ZodCheckStringFormatParams = CheckParams<$ZodCheckStringFormat, "format">; +export type $ZodEmailParams = StringFormatParams<schemas.$ZodEmail, "when">; +export type $ZodCheckEmailParams = CheckStringFormatParams<schemas.$ZodEmail, "when">; +declare function _email<T extends schemas.$ZodEmail>(Class: util$1.SchemaClass<T>, params?: string | $ZodEmailParams | $ZodCheckEmailParams): T; +export type $ZodGUIDParams = StringFormatParams<schemas.$ZodGUID, "pattern" | "when">; +export type $ZodCheckGUIDParams = CheckStringFormatParams<schemas.$ZodGUID, "pattern" | "when">; +declare function _guid<T extends schemas.$ZodGUID>(Class: util$1.SchemaClass<T>, params?: string | $ZodGUIDParams | $ZodCheckGUIDParams): T; +export type $ZodUUIDParams = StringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +export type $ZodCheckUUIDParams = CheckStringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +declare function _uuid<T extends schemas.$ZodUUID>(Class: util$1.SchemaClass<T>, params?: string | $ZodUUIDParams | $ZodCheckUUIDParams): T; +export type $ZodUUIDv4Params = StringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +export type $ZodCheckUUIDv4Params = CheckStringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +declare function _uuidv4<T extends schemas.$ZodUUID>(Class: util$1.SchemaClass<T>, params?: string | $ZodUUIDv4Params | $ZodCheckUUIDv4Params): T; +export type $ZodUUIDv6Params = StringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +export type $ZodCheckUUIDv6Params = CheckStringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +declare function _uuidv6<T extends schemas.$ZodUUID>(Class: util$1.SchemaClass<T>, params?: string | $ZodUUIDv6Params | $ZodCheckUUIDv6Params): T; +export type $ZodUUIDv7Params = StringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +export type $ZodCheckUUIDv7Params = CheckStringFormatParams<schemas.$ZodUUID, "pattern" | "when">; +declare function _uuidv7<T extends schemas.$ZodUUID>(Class: util$1.SchemaClass<T>, params?: string | $ZodUUIDv7Params | $ZodCheckUUIDv7Params): T; +export type $ZodURLParams = StringFormatParams<schemas.$ZodURL, "when">; +export type $ZodCheckURLParams = CheckStringFormatParams<schemas.$ZodURL, "when">; +declare function _url<T extends schemas.$ZodURL>(Class: util$1.SchemaClass<T>, params?: string | $ZodURLParams | $ZodCheckURLParams): T; +export type $ZodEmojiParams = StringFormatParams<schemas.$ZodEmoji, "when">; +export type $ZodCheckEmojiParams = CheckStringFormatParams<schemas.$ZodEmoji, "when">; +declare function _emoji<T extends schemas.$ZodEmoji>(Class: util$1.SchemaClass<T>, params?: string | $ZodEmojiParams | $ZodCheckEmojiParams): T; +export type $ZodNanoIDParams = StringFormatParams<schemas.$ZodNanoID, "when">; +export type $ZodCheckNanoIDParams = CheckStringFormatParams<schemas.$ZodNanoID, "when">; +declare function _nanoid<T extends schemas.$ZodNanoID>(Class: util$1.SchemaClass<T>, params?: string | $ZodNanoIDParams | $ZodCheckNanoIDParams): T; +export type $ZodCUIDParams = StringFormatParams<schemas.$ZodCUID, "when">; +export type $ZodCheckCUIDParams = CheckStringFormatParams<schemas.$ZodCUID, "when">; +declare function _cuid<T extends schemas.$ZodCUID>(Class: util$1.SchemaClass<T>, params?: string | $ZodCUIDParams | $ZodCheckCUIDParams): T; +export type $ZodCUID2Params = StringFormatParams<schemas.$ZodCUID2, "when">; +export type $ZodCheckCUID2Params = CheckStringFormatParams<schemas.$ZodCUID2, "when">; +declare function _cuid2<T extends schemas.$ZodCUID2>(Class: util$1.SchemaClass<T>, params?: string | $ZodCUID2Params | $ZodCheckCUID2Params): T; +export type $ZodULIDParams = StringFormatParams<schemas.$ZodULID, "when">; +export type $ZodCheckULIDParams = CheckStringFormatParams<schemas.$ZodULID, "when">; +declare function _ulid<T extends schemas.$ZodULID>(Class: util$1.SchemaClass<T>, params?: string | $ZodULIDParams | $ZodCheckULIDParams): T; +export type $ZodXIDParams = StringFormatParams<schemas.$ZodXID, "when">; +export type $ZodCheckXIDParams = CheckStringFormatParams<schemas.$ZodXID, "when">; +declare function _xid<T extends schemas.$ZodXID>(Class: util$1.SchemaClass<T>, params?: string | $ZodXIDParams | $ZodCheckXIDParams): T; +export type $ZodKSUIDParams = StringFormatParams<schemas.$ZodKSUID, "when">; +export type $ZodCheckKSUIDParams = CheckStringFormatParams<schemas.$ZodKSUID, "when">; +declare function _ksuid<T extends schemas.$ZodKSUID>(Class: util$1.SchemaClass<T>, params?: string | $ZodKSUIDParams | $ZodCheckKSUIDParams): T; +export type $ZodIPv4Params = StringFormatParams<schemas.$ZodIPv4, "pattern" | "when" | "version">; +export type $ZodCheckIPv4Params = CheckStringFormatParams<schemas.$ZodIPv4, "pattern" | "when" | "version">; +declare function _ipv4<T extends schemas.$ZodIPv4>(Class: util$1.SchemaClass<T>, params?: string | $ZodIPv4Params | $ZodCheckIPv4Params): T; +export type $ZodIPv6Params = StringFormatParams<schemas.$ZodIPv6, "pattern" | "when" | "version">; +export type $ZodCheckIPv6Params = CheckStringFormatParams<schemas.$ZodIPv6, "pattern" | "when" | "version">; +declare function _ipv6<T extends schemas.$ZodIPv6>(Class: util$1.SchemaClass<T>, params?: string | $ZodIPv6Params | $ZodCheckIPv6Params): T; +export type $ZodMACParams = StringFormatParams<schemas.$ZodMAC, "pattern" | "when">; +export type $ZodCheckMACParams = CheckStringFormatParams<schemas.$ZodMAC, "pattern" | "when">; +declare function _mac<T extends schemas.$ZodMAC>(Class: util$1.SchemaClass<T>, params?: string | $ZodMACParams | $ZodCheckMACParams): T; +export type $ZodCIDRv4Params = StringFormatParams<schemas.$ZodCIDRv4, "pattern" | "when">; +export type $ZodCheckCIDRv4Params = CheckStringFormatParams<schemas.$ZodCIDRv4, "pattern" | "when">; +declare function _cidrv4<T extends schemas.$ZodCIDRv4>(Class: util$1.SchemaClass<T>, params?: string | $ZodCIDRv4Params | $ZodCheckCIDRv4Params): T; +export type $ZodCIDRv6Params = StringFormatParams<schemas.$ZodCIDRv6, "pattern" | "when">; +export type $ZodCheckCIDRv6Params = CheckStringFormatParams<schemas.$ZodCIDRv6, "pattern" | "when">; +declare function _cidrv6<T extends schemas.$ZodCIDRv6>(Class: util$1.SchemaClass<T>, params?: string | $ZodCIDRv6Params | $ZodCheckCIDRv6Params): T; +export type $ZodBase64Params = StringFormatParams<schemas.$ZodBase64, "pattern" | "when">; +export type $ZodCheckBase64Params = CheckStringFormatParams<schemas.$ZodBase64, "pattern" | "when">; +declare function _base64<T extends schemas.$ZodBase64>(Class: util$1.SchemaClass<T>, params?: string | $ZodBase64Params | $ZodCheckBase64Params): T; +export type $ZodBase64URLParams = StringFormatParams<schemas.$ZodBase64URL, "pattern" | "when">; +export type $ZodCheckBase64URLParams = CheckStringFormatParams<schemas.$ZodBase64URL, "pattern" | "when">; +declare function _base64url<T extends schemas.$ZodBase64URL>(Class: util$1.SchemaClass<T>, params?: string | $ZodBase64URLParams | $ZodCheckBase64URLParams): T; +export type $ZodE164Params = StringFormatParams<schemas.$ZodE164, "when">; +export type $ZodCheckE164Params = CheckStringFormatParams<schemas.$ZodE164, "when">; +declare function _e164<T extends schemas.$ZodE164>(Class: util$1.SchemaClass<T>, params?: string | $ZodE164Params | $ZodCheckE164Params): T; +export type $ZodJWTParams = StringFormatParams<schemas.$ZodJWT, "pattern" | "when">; +export type $ZodCheckJWTParams = CheckStringFormatParams<schemas.$ZodJWT, "pattern" | "when">; +declare function _jwt<T extends schemas.$ZodJWT>(Class: util$1.SchemaClass<T>, params?: string | $ZodJWTParams | $ZodCheckJWTParams): T; +declare const TimePrecision: { + readonly Any: null; + readonly Minute: -1; + readonly Second: 0; + readonly Millisecond: 3; + readonly Microsecond: 6; +}; +export type $ZodISODateTimeParams = StringFormatParams<schemas.$ZodISODateTime, "pattern" | "when">; +export type $ZodCheckISODateTimeParams = CheckStringFormatParams<schemas.$ZodISODateTime, "pattern" | "when">; +declare function _isoDateTime<T extends schemas.$ZodISODateTime>(Class: util$1.SchemaClass<T>, params?: string | $ZodISODateTimeParams | $ZodCheckISODateTimeParams): T; +export type $ZodISODateParams = StringFormatParams<schemas.$ZodISODate, "pattern" | "when">; +export type $ZodCheckISODateParams = CheckStringFormatParams<schemas.$ZodISODate, "pattern" | "when">; +declare function _isoDate<T extends schemas.$ZodISODate>(Class: util$1.SchemaClass<T>, params?: string | $ZodISODateParams | $ZodCheckISODateParams): T; +export type $ZodISOTimeParams = StringFormatParams<schemas.$ZodISOTime, "pattern" | "when">; +export type $ZodCheckISOTimeParams = CheckStringFormatParams<schemas.$ZodISOTime, "pattern" | "when">; +declare function _isoTime<T extends schemas.$ZodISOTime>(Class: util$1.SchemaClass<T>, params?: string | $ZodISOTimeParams | $ZodCheckISOTimeParams): T; +export type $ZodISODurationParams = StringFormatParams<schemas.$ZodISODuration, "when">; +export type $ZodCheckISODurationParams = CheckStringFormatParams<schemas.$ZodISODuration, "when">; +declare function _isoDuration<T extends schemas.$ZodISODuration>(Class: util$1.SchemaClass<T>, params?: string | $ZodISODurationParams | $ZodCheckISODurationParams): T; +export type $ZodNumberParams = TypeParams<schemas.$ZodNumber<number>, "coerce">; +export type $ZodNumberFormatParams = CheckTypeParams<schemas.$ZodNumberFormat, "format" | "coerce">; +export type $ZodCheckNumberFormatParams = CheckParams<$ZodCheckNumberFormat, "format" | "when">; +declare function _number<T extends schemas.$ZodNumber>(Class: util$1.SchemaClass<T>, params?: string | $ZodNumberParams): T; +declare function _coercedNumber<T extends schemas.$ZodNumber>(Class: util$1.SchemaClass<T>, params?: string | $ZodNumberParams): T; +declare function _int<T extends schemas.$ZodNumberFormat>(Class: util$1.SchemaClass<T>, params?: string | $ZodCheckNumberFormatParams): T; +declare function _float32<T extends schemas.$ZodNumberFormat>(Class: util$1.SchemaClass<T>, params?: string | $ZodCheckNumberFormatParams): T; +declare function _float64<T extends schemas.$ZodNumberFormat>(Class: util$1.SchemaClass<T>, params?: string | $ZodCheckNumberFormatParams): T; +declare function _int32<T extends schemas.$ZodNumberFormat>(Class: util$1.SchemaClass<T>, params?: string | $ZodCheckNumberFormatParams): T; +declare function _uint32<T extends schemas.$ZodNumberFormat>(Class: util$1.SchemaClass<T>, params?: string | $ZodCheckNumberFormatParams): T; +export type $ZodBooleanParams = TypeParams<schemas.$ZodBoolean<boolean>, "coerce">; +declare function _boolean<T extends schemas.$ZodBoolean>(Class: util$1.SchemaClass<T>, params?: string | $ZodBooleanParams): T; +declare function _coercedBoolean<T extends schemas.$ZodBoolean>(Class: util$1.SchemaClass<T>, params?: string | $ZodBooleanParams): T; +export type $ZodBigIntParams = TypeParams<schemas.$ZodBigInt<bigint>>; +export type $ZodBigIntFormatParams = CheckTypeParams<schemas.$ZodBigIntFormat, "format" | "coerce">; +export type $ZodCheckBigIntFormatParams = CheckParams<$ZodCheckBigIntFormat, "format" | "when">; +declare function _bigint<T extends schemas.$ZodBigInt>(Class: util$1.SchemaClass<T>, params?: string | $ZodBigIntParams): T; +declare function _coercedBigint<T extends schemas.$ZodBigInt>(Class: util$1.SchemaClass<T>, params?: string | $ZodBigIntParams): T; +declare function _int64<T extends schemas.$ZodBigIntFormat>(Class: util$1.SchemaClass<T>, params?: string | $ZodBigIntFormatParams): T; +declare function _uint64<T extends schemas.$ZodBigIntFormat>(Class: util$1.SchemaClass<T>, params?: string | $ZodBigIntFormatParams): T; +export type $ZodSymbolParams = TypeParams<schemas.$ZodSymbol>; +declare function _symbol<T extends schemas.$ZodSymbol>(Class: util$1.SchemaClass<T>, params?: string | $ZodSymbolParams): T; +export type $ZodUndefinedParams = TypeParams<schemas.$ZodUndefined>; +declare function _undefined$1<T extends schemas.$ZodUndefined>(Class: util$1.SchemaClass<T>, params?: string | $ZodUndefinedParams): T; +export type $ZodNullParams = TypeParams<schemas.$ZodNull>; +declare function _null$1<T extends schemas.$ZodNull>(Class: util$1.SchemaClass<T>, params?: string | $ZodNullParams): T; +export type $ZodAnyParams = TypeParams<schemas.$ZodAny>; +declare function _any<T extends schemas.$ZodAny>(Class: util$1.SchemaClass<T>): T; +export type $ZodUnknownParams = TypeParams<schemas.$ZodUnknown>; +declare function _unknown<T extends schemas.$ZodUnknown>(Class: util$1.SchemaClass<T>): T; +export type $ZodNeverParams = TypeParams<schemas.$ZodNever>; +declare function _never<T extends schemas.$ZodNever>(Class: util$1.SchemaClass<T>, params?: string | $ZodNeverParams): T; +export type $ZodVoidParams = TypeParams<schemas.$ZodVoid>; +declare function _void<T extends schemas.$ZodVoid>(Class: util$1.SchemaClass<T>, params?: string | $ZodVoidParams): T; +export type $ZodDateParams = TypeParams<schemas.$ZodDate, "coerce">; +declare function _date<T extends schemas.$ZodDate>(Class: util$1.SchemaClass<T>, params?: string | $ZodDateParams): T; +declare function _coercedDate<T extends schemas.$ZodDate>(Class: util$1.SchemaClass<T>, params?: string | $ZodDateParams): T; +export type $ZodNaNParams = TypeParams<schemas.$ZodNaN>; +declare function _nan<T extends schemas.$ZodNaN>(Class: util$1.SchemaClass<T>, params?: string | $ZodNaNParams): T; +export type $ZodCheckLessThanParams = CheckParams<$ZodCheckLessThan, "inclusive" | "value" | "when">; +declare function _lt(value: util$1.Numeric, params?: string | $ZodCheckLessThanParams): $ZodCheckLessThan<util$1.Numeric>; +declare function _lte(value: util$1.Numeric, params?: string | $ZodCheckLessThanParams): $ZodCheckLessThan<util$1.Numeric>; +export type $ZodCheckGreaterThanParams = CheckParams<$ZodCheckGreaterThan, "inclusive" | "value" | "when">; +declare function _gt(value: util$1.Numeric, params?: string | $ZodCheckGreaterThanParams): $ZodCheckGreaterThan; +declare function _gte(value: util$1.Numeric, params?: string | $ZodCheckGreaterThanParams): $ZodCheckGreaterThan; +declare function _positive(params?: string | $ZodCheckGreaterThanParams): $ZodCheckGreaterThan; +declare function _negative(params?: string | $ZodCheckLessThanParams): $ZodCheckLessThan; +declare function _nonpositive(params?: string | $ZodCheckLessThanParams): $ZodCheckLessThan; +declare function _nonnegative(params?: string | $ZodCheckGreaterThanParams): $ZodCheckGreaterThan; +export type $ZodCheckMultipleOfParams = CheckParams<$ZodCheckMultipleOf, "value" | "when">; +declare function _multipleOf(value: number | bigint, params?: string | $ZodCheckMultipleOfParams): $ZodCheckMultipleOf; +export type $ZodCheckMaxSizeParams = CheckParams<$ZodCheckMaxSize, "maximum" | "when">; +declare function _maxSize(maximum: number, params?: string | $ZodCheckMaxSizeParams): $ZodCheckMaxSize<util$1.HasSize>; +export type $ZodCheckMinSizeParams = CheckParams<$ZodCheckMinSize, "minimum" | "when">; +declare function _minSize(minimum: number, params?: string | $ZodCheckMinSizeParams): $ZodCheckMinSize<util$1.HasSize>; +export type $ZodCheckSizeEqualsParams = CheckParams<$ZodCheckSizeEquals, "size" | "when">; +declare function _size(size: number, params?: string | $ZodCheckSizeEqualsParams): $ZodCheckSizeEquals<util$1.HasSize>; +export type $ZodCheckMaxLengthParams = CheckParams<$ZodCheckMaxLength, "maximum" | "when">; +declare function _maxLength(maximum: number, params?: string | $ZodCheckMaxLengthParams): $ZodCheckMaxLength<util$1.HasLength>; +export type $ZodCheckMinLengthParams = CheckParams<$ZodCheckMinLength, "minimum" | "when">; +declare function _minLength(minimum: number, params?: string | $ZodCheckMinLengthParams): $ZodCheckMinLength<util$1.HasLength>; +export type $ZodCheckLengthEqualsParams = CheckParams<$ZodCheckLengthEquals, "length" | "when">; +declare function _length(length: number, params?: string | $ZodCheckLengthEqualsParams): $ZodCheckLengthEquals<util$1.HasLength>; +export type $ZodCheckRegexParams = CheckParams<$ZodCheckRegex, "format" | "pattern" | "when">; +declare function _regex(pattern: RegExp, params?: string | $ZodCheckRegexParams): $ZodCheckRegex; +export type $ZodCheckLowerCaseParams = CheckParams<$ZodCheckLowerCase, "format" | "when">; +declare function _lowercase(params?: string | $ZodCheckLowerCaseParams): $ZodCheckLowerCase; +export type $ZodCheckUpperCaseParams = CheckParams<$ZodCheckUpperCase, "format" | "when">; +declare function _uppercase(params?: string | $ZodCheckUpperCaseParams): $ZodCheckUpperCase; +export type $ZodCheckIncludesParams = CheckParams<$ZodCheckIncludes, "includes" | "format" | "when" | "pattern">; +declare function _includes(includes: string, params?: string | $ZodCheckIncludesParams): $ZodCheckIncludes; +export type $ZodCheckStartsWithParams = CheckParams<$ZodCheckStartsWith, "prefix" | "format" | "when" | "pattern">; +declare function _startsWith(prefix: string, params?: string | $ZodCheckStartsWithParams): $ZodCheckStartsWith; +export type $ZodCheckEndsWithParams = CheckParams<$ZodCheckEndsWith, "suffix" | "format" | "pattern" | "when">; +declare function _endsWith(suffix: string, params?: string | $ZodCheckEndsWithParams): $ZodCheckEndsWith; +export type $ZodCheckPropertyParams = CheckParams<$ZodCheckProperty, "property" | "schema" | "when">; +declare function _property<K extends string, T extends schemas.$ZodType>(property: K, schema: T, params?: string | $ZodCheckPropertyParams): $ZodCheckProperty<{ + [k in K]: output$1<T>; +}>; +export type $ZodCheckMimeTypeParams = CheckParams<$ZodCheckMimeType, "mime" | "when">; +declare function _mime(types: util$1.MimeTypes[], params?: string | $ZodCheckMimeTypeParams): $ZodCheckMimeType; +declare function _overwrite<T>(tx: (input: T) => T): $ZodCheckOverwrite<T>; +declare function _normalize(form?: "NFC" | "NFD" | "NFKC" | "NFKD" | (string & {})): $ZodCheckOverwrite<string>; +declare function _trim(): $ZodCheckOverwrite<string>; +declare function _toLowerCase(): $ZodCheckOverwrite<string>; +declare function _toUpperCase(): $ZodCheckOverwrite<string>; +declare function _slugify(): $ZodCheckOverwrite<string>; +export type $ZodArrayParams = TypeParams<schemas.$ZodArray, "element">; +declare function _array<T extends schemas.$ZodType>(Class: util$1.SchemaClass<schemas.$ZodArray>, element: T, params?: string | $ZodArrayParams): schemas.$ZodArray<T>; +export type $ZodObjectParams = TypeParams<schemas.$ZodObject, "shape" | "catchall">; +export type $ZodUnionParams = TypeParams<schemas.$ZodUnion, "options">; +declare function _union<const T extends readonly schemas.$ZodObject[]>(Class: util$1.SchemaClass<schemas.$ZodUnion>, options: T, params?: string | $ZodUnionParams): schemas.$ZodUnion<T>; +export type $ZodXorParams = TypeParams<schemas.$ZodXor, "options">; +declare function _xor<const T extends readonly schemas.$ZodObject[]>(Class: util$1.SchemaClass<schemas.$ZodXor>, options: T, params?: string | $ZodXorParams): schemas.$ZodXor<T>; +export interface $ZodTypeDiscriminableInternals extends schemas.$ZodTypeInternals { + propValues: util$1.PropValues; +} +export interface $ZodTypeDiscriminable extends schemas.$ZodType { + _zod: $ZodTypeDiscriminableInternals; +} +export type $ZodDiscriminatedUnionParams = TypeParams<schemas.$ZodDiscriminatedUnion, "options" | "discriminator">; +declare function _discriminatedUnion<Types extends [ + $ZodTypeDiscriminable, + ...$ZodTypeDiscriminable[] +], Disc extends string>(Class: util$1.SchemaClass<schemas.$ZodDiscriminatedUnion>, discriminator: Disc, options: Types, params?: string | $ZodDiscriminatedUnionParams): schemas.$ZodDiscriminatedUnion<Types, Disc>; +export type $ZodIntersectionParams = TypeParams<schemas.$ZodIntersection, "left" | "right">; +declare function _intersection<T extends schemas.$ZodObject, U extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodIntersection>, left: T, right: U): schemas.$ZodIntersection<T, U>; +export type $ZodTupleParams = TypeParams<schemas.$ZodTuple, "items" | "rest">; +declare function _tuple<T extends readonly [ + schemas.$ZodType, + ...schemas.$ZodType[] +]>(Class: util$1.SchemaClass<schemas.$ZodTuple>, items: T, params?: string | $ZodTupleParams): schemas.$ZodTuple<T, null>; +declare function _tuple<T extends readonly [ + schemas.$ZodType, + ...schemas.$ZodType[] +], Rest extends schemas.$ZodType>(Class: util$1.SchemaClass<schemas.$ZodTuple>, items: T, rest: Rest, params?: string | $ZodTupleParams): schemas.$ZodTuple<T, Rest>; +export type $ZodRecordParams = TypeParams<schemas.$ZodRecord, "keyType" | "valueType">; +declare function _record<Key extends schemas.$ZodRecordKey, Value extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodRecord>, keyType: Key, valueType: Value, params?: string | $ZodRecordParams): schemas.$ZodRecord<Key, Value>; +export type $ZodMapParams = TypeParams<schemas.$ZodMap, "keyType" | "valueType">; +declare function _map<Key extends schemas.$ZodObject, Value extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodMap>, keyType: Key, valueType: Value, params?: string | $ZodMapParams): schemas.$ZodMap<Key, Value>; +export type $ZodSetParams = TypeParams<schemas.$ZodSet, "valueType">; +declare function _set<Value extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodSet>, valueType: Value, params?: string | $ZodSetParams): schemas.$ZodSet<Value>; +export type $ZodEnumParams = TypeParams<schemas.$ZodEnum, "entries">; +declare function _enum<const T extends string[]>(Class: util$1.SchemaClass<schemas.$ZodEnum>, values: T, params?: string | $ZodEnumParams): schemas.$ZodEnum<util$1.ToEnum<T[number]>>; +declare function _enum<T extends util$1.EnumLike>(Class: util$1.SchemaClass<schemas.$ZodEnum>, entries: T, params?: string | $ZodEnumParams): schemas.$ZodEnum<T>; +declare function _nativeEnum<T extends util$1.EnumLike>(Class: util$1.SchemaClass<schemas.$ZodEnum>, entries: T, params?: string | $ZodEnumParams): schemas.$ZodEnum<T>; +export type $ZodLiteralParams = TypeParams<schemas.$ZodLiteral, "values">; +declare function _literal<const T extends Array<util$1.Literal>>(Class: util$1.SchemaClass<schemas.$ZodLiteral>, value: T, params?: string | $ZodLiteralParams): schemas.$ZodLiteral<T[number]>; +declare function _literal<const T extends util$1.Literal>(Class: util$1.SchemaClass<schemas.$ZodLiteral>, value: T, params?: string | $ZodLiteralParams): schemas.$ZodLiteral<T>; +export type $ZodFileParams = TypeParams<schemas.$ZodFile>; +declare function _file(Class: util$1.SchemaClass<schemas.$ZodFile>, params?: string | $ZodFileParams): schemas.$ZodFile; +export type $ZodTransformParams = TypeParams<schemas.$ZodTransform, "transform">; +declare function _transform<I = unknown, O = I>(Class: util$1.SchemaClass<schemas.$ZodTransform>, fn: (input: I, ctx?: schemas.ParsePayload) => O): schemas.$ZodTransform<Awaited<O>, I>; +export type $ZodOptionalParams = TypeParams<schemas.$ZodOptional, "innerType">; +declare function _optional<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodOptional>, innerType: T): schemas.$ZodOptional<T>; +export type $ZodNullableParams = TypeParams<schemas.$ZodNullable, "innerType">; +declare function _nullable<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodNullable>, innerType: T): schemas.$ZodNullable<T>; +export type $ZodDefaultParams = TypeParams<schemas.$ZodDefault, "innerType" | "defaultValue">; +declare function _default$49<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodDefault>, innerType: T, defaultValue: util$1.NoUndefined<output$1<T>> | (() => util$1.NoUndefined<output$1<T>>)): schemas.$ZodDefault<T>; +export type $ZodNonOptionalParams = TypeParams<schemas.$ZodNonOptional, "innerType">; +declare function _nonoptional<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodNonOptional>, innerType: T, params?: string | $ZodNonOptionalParams): schemas.$ZodNonOptional<T>; +export type $ZodSuccessParams = TypeParams<schemas.$ZodSuccess, "innerType">; +declare function _success<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodSuccess>, innerType: T): schemas.$ZodSuccess<T>; +export type $ZodCatchParams = TypeParams<schemas.$ZodCatch, "innerType" | "catchValue">; +declare function _catch<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodCatch>, innerType: T, catchValue: output$1<T> | ((ctx: schemas.$ZodCatchCtx) => output$1<T>)): schemas.$ZodCatch<T>; +export type $ZodPipeParams = TypeParams<schemas.$ZodPipe, "in" | "out">; +declare function _pipe<const A extends schemas.$ZodType, B extends schemas.$ZodType<unknown, output$1<A>> = schemas.$ZodType<unknown, output$1<A>>>(Class: util$1.SchemaClass<schemas.$ZodPipe>, in_: A, out: B | schemas.$ZodType<unknown, output$1<A>>): schemas.$ZodPipe<A, B>; +export type $ZodReadonlyParams = TypeParams<schemas.$ZodReadonly, "innerType">; +declare function _readonly<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodReadonly>, innerType: T): schemas.$ZodReadonly<T>; +export type $ZodTemplateLiteralParams = TypeParams<schemas.$ZodTemplateLiteral, "parts">; +declare function _templateLiteral<const Parts extends schemas.$ZodTemplateLiteralPart[]>(Class: util$1.SchemaClass<schemas.$ZodTemplateLiteral>, parts: Parts, params?: string | $ZodTemplateLiteralParams): schemas.$ZodTemplateLiteral<schemas.$PartsToTemplateLiteral<Parts>>; +export type $ZodLazyParams = TypeParams<schemas.$ZodLazy, "getter">; +declare function _lazy<T extends schemas.$ZodType>(Class: util$1.SchemaClass<schemas.$ZodLazy>, getter: () => T): schemas.$ZodLazy<T>; +export type $ZodPromiseParams = TypeParams<schemas.$ZodPromise, "innerType">; +declare function _promise<T extends schemas.$ZodObject>(Class: util$1.SchemaClass<schemas.$ZodPromise>, innerType: T): schemas.$ZodPromise<T>; +export type $ZodCustomParams = CheckTypeParams<schemas.$ZodCustom, "fn">; +declare function _custom<O = unknown, I = O>(Class: util$1.SchemaClass<schemas.$ZodCustom>, fn: (data: O) => unknown, _params: string | $ZodCustomParams | undefined): schemas.$ZodCustom<O, I>; +declare function _refine<O = unknown, I = O>(Class: util$1.SchemaClass<schemas.$ZodCustom>, fn: (data: O) => unknown, _params: string | $ZodCustomParams | undefined): schemas.$ZodCustom<O, I>; +export type $ZodSuperRefineIssue<T extends $ZodIssueBase = $ZodIssue> = T extends any ? RawIssue$1<T> : never; +type RawIssue$1<T extends $ZodIssueBase> = T extends any ? util$1.Flatten<util$1.MakePartial<T, "message" | "path"> & { + /** The schema or check that originated this issue. */ + readonly inst?: schemas.$ZodType | $ZodCheck; + /** If `true`, Zod will execute subsequent checks/refinements instead of immediately aborting */ + readonly continue?: boolean | undefined; +} & Record<string, unknown>> : never; +export interface $RefinementCtx<T = unknown> extends schemas.ParsePayload<T> { + addIssue(arg: string | $ZodSuperRefineIssue): void; +} +declare function _superRefine<T>(fn: (arg: T, payload: $RefinementCtx<T>) => void | Promise<void>): $ZodCheck<T>; +declare function _check<O = unknown>(fn: schemas.CheckFn<O>, params?: string | $ZodCustomParams): $ZodCheck<O>; +declare function describe<T>(description: string): $ZodCheck<T>; +declare function meta<T>(metadata: GlobalMeta): $ZodCheck<T>; +export interface $ZodStringBoolParams extends TypeParams { + truthy?: string[]; + falsy?: string[]; + /** + * Options: `"sensitive"`, `"insensitive"` + * + * @default `"insensitive"` + */ + case?: "sensitive" | "insensitive" | undefined; +} +declare function _stringbool(Classes: { + Codec?: typeof schemas.$ZodCodec; + Boolean?: typeof schemas.$ZodBoolean; + String?: typeof schemas.$ZodString; +}, _params?: string | $ZodStringBoolParams): schemas.$ZodCodec<schemas.$ZodString, schemas.$ZodBoolean>; +declare function _stringFormat<Format extends string>(Class: typeof schemas.$ZodCustomStringFormat, format: Format, fnOrRegex: ((arg: string) => util$1.MaybeAsync<unknown>) | RegExp, _params?: string | $ZodStringFormatParams): schemas.$ZodCustomStringFormat<Format>; +declare function toJSONSchema<T extends schemas.$ZodType>(schema: T, params?: ToJSONSchemaParams): ZodStandardJSONSchemaPayload<T>; +declare function toJSONSchema(registry: $ZodRegistry<{ + id?: string | undefined; +}>, params?: RegistryToJSONSchemaParams): { + schemas: Record<string, ZodStandardJSONSchemaPayload<schemas.$ZodType>>; +}; +/** + * Parameters for the emit method of JSONSchemaGenerator. + * @deprecated Use toJSONSchema function instead + */ +export type EmitParams = Pick<JSONSchemaGeneratorParams, "cycles" | "reused" | "external">; +/** + * Parameters for JSONSchemaGenerator constructor. + * @deprecated Use toJSONSchema function instead + */ +export type JSONSchemaGeneratorConstructorParams = Pick<JSONSchemaGeneratorParams, "metadata" | "target" | "unrepresentable" | "override" | "io">; +declare class JSONSchemaGenerator { + private ctx; + /** @deprecated Access via ctx instead */ + get metadataRegistry(): $ZodRegistry<Record<string, any>>; + /** @deprecated Access via ctx instead */ + get target(): ({} & string) | "draft-2020-12" | "draft-07" | "openapi-3.0" | "draft-04"; + /** @deprecated Access via ctx instead */ + get unrepresentable(): "any" | "throw"; + /** @deprecated Access via ctx instead */ + get override(): (ctx: { + zodSchema: schemas.$ZodType; + jsonSchema: JSONSchema$1.BaseSchema; + path: (string | number)[]; + }) => void; + /** @deprecated Access via ctx instead */ + get io(): "input" | "output"; + /** @deprecated Access via ctx instead */ + get counter(): number; + set counter(value: number); + /** @deprecated Access via ctx instead */ + get seen(): Map<schemas.$ZodType, Seen>; + constructor(params?: JSONSchemaGeneratorConstructorParams); + /** + * Process a schema to prepare it for JSON Schema generation. + * This must be called before emit(). + */ + process(schema: schemas.$ZodType, _params?: ProcessParams): JSONSchema$1.BaseSchema; + /** + * Emit the final JSON Schema after processing. + * Must call process() first. + */ + emit(schema: schemas.$ZodType, _params?: EmitParams): JSONSchema$1.BaseSchema; +} +export type AnySchema = ZodTypeAny | core.$ZodType; +export type ZodRawShapeCompat = Record<string, AnySchema>; +type ZodIssue$1 = core.$ZodIssue; +interface ZodError$1<T = unknown> extends $ZodError<T> { + /** @deprecated Use the `z.treeifyError(err)` function instead. */ + format(): core.$ZodFormattedError<T>; + format<U>(mapper: (issue: core.$ZodIssue) => U): core.$ZodFormattedError<T, U>; + /** @deprecated Use the `z.treeifyError(err)` function instead. */ + flatten(): core.$ZodFlattenedError<T>; + flatten<U>(mapper: (issue: core.$ZodIssue) => U): core.$ZodFlattenedError<T, U>; + /** @deprecated Push directly to `.issues` instead. */ + addIssue(issue: core.$ZodIssue): void; + /** @deprecated Push directly to `.issues` instead. */ + addIssues(issues: core.$ZodIssue[]): void; + /** @deprecated Check `err.issues.length === 0` instead. */ + isEmpty: boolean; +} +declare const ZodError$1: core.$constructor<ZodError$1>; +declare const ZodRealError: core.$constructor<ZodError$1>; +type IssueData$1 = core.$ZodRawIssue; +export type ZodSafeParseResult<T> = ZodSafeParseSuccess<T> | ZodSafeParseError<T>; +export type ZodSafeParseSuccess<T> = { + success: true; + data: T; + error?: never; +}; +export type ZodSafeParseError<T> = { + success: false; + data?: never; + error: ZodError$1<T>; +}; +declare const parse$1: <T extends core.$ZodType>(schema: T, value: unknown, _ctx?: core.ParseContext<core.$ZodIssue>, _params?: { + callee?: core.util.AnyFunc; + Err?: core.$ZodErrorClass; +}) => core.output<T>; +declare const parseAsync$1: <T extends core.$ZodType>(schema: T, value: unknown, _ctx?: core.ParseContext<core.$ZodIssue>, _params?: { + callee?: core.util.AnyFunc; + Err?: core.$ZodErrorClass; +}) => Promise<core.output<T>>; +declare const safeParse$1: <T extends core.$ZodType>(schema: T, value: unknown, _ctx?: core.ParseContext<core.$ZodIssue>) => ZodSafeParseResult<core.output<T>>; +declare const safeParseAsync$1: <T extends core.$ZodType>(schema: T, value: unknown, _ctx?: core.ParseContext<core.$ZodIssue>) => Promise<ZodSafeParseResult<core.output<T>>>; +declare const encode$1: <T extends core.$ZodType>(schema: T, value: core.output<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => core.input<T>; +declare const decode$1: <T extends core.$ZodType>(schema: T, value: core.input<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => core.output<T>; +declare const encodeAsync$1: <T extends core.$ZodType>(schema: T, value: core.output<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => Promise<core.input<T>>; +declare const decodeAsync$1: <T extends core.$ZodType>(schema: T, value: core.input<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => Promise<core.output<T>>; +declare const safeEncode$1: <T extends core.$ZodType>(schema: T, value: core.output<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => ZodSafeParseResult<core.input<T>>; +declare const safeDecode$1: <T extends core.$ZodType>(schema: T, value: core.input<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => ZodSafeParseResult<core.output<T>>; +declare const safeEncodeAsync$1: <T extends core.$ZodType>(schema: T, value: core.output<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => Promise<ZodSafeParseResult<core.input<T>>>; +declare const safeDecodeAsync$1: <T extends core.$ZodType>(schema: T, value: core.input<T>, _ctx?: core.ParseContext<core.$ZodIssue>) => Promise<ZodSafeParseResult<core.output<T>>>; +type ZodStandardSchemaWithJSON$1<T> = StandardSchemaWithJSONProps<core.input<T>, core.output<T>>; +interface ZodType$1<out Output = unknown, out Input = unknown, out Internals extends core.$ZodTypeInternals<Output, Input> = core.$ZodTypeInternals<Output, Input>> extends core.$ZodType<Output, Input, Internals> { + def: Internals["def"]; + type: Internals["def"]["type"]; + /** @deprecated Use `.def` instead. */ + _def: Internals["def"]; + /** @deprecated Use `z.output<typeof schema>` instead. */ + _output: Internals["output"]; + /** @deprecated Use `z.input<typeof schema>` instead. */ + _input: Internals["input"]; + "~standard": ZodStandardSchemaWithJSON$1<this>; + /** Converts this schema to a JSON Schema representation. */ + toJSONSchema(params?: core.ToJSONSchemaParams): core.ZodStandardJSONSchemaPayload<this>; + check(...checks: (core.CheckFn<core.output<this>> | core.$ZodCheck<core.output<this>>)[]): this; + with(...checks: (core.CheckFn<core.output<this>> | core.$ZodCheck<core.output<this>>)[]): this; + clone(def?: Internals["def"], params?: { + parent: boolean; + }): this; + register<R extends core.$ZodRegistry>(registry: R, ...meta: this extends R["_schema"] ? undefined extends R["_meta"] ? [ + core.$replace<R["_meta"], this>? + ] : [ + core.$replace<R["_meta"], this> + ] : [ + "Incompatible schema" + ]): this; + brand<T extends PropertyKey = PropertyKey, Dir extends "in" | "out" | "inout" = "out">(value?: T): PropertyKey extends T ? this : core.$ZodBranded<this, T, Dir>; + parse(data: unknown, params?: core.ParseContext<core.$ZodIssue>): core.output<this>; + safeParse(data: unknown, params?: core.ParseContext<core.$ZodIssue>): ZodSafeParseResult<core.output<this>>; + parseAsync(data: unknown, params?: core.ParseContext<core.$ZodIssue>): Promise<core.output<this>>; + safeParseAsync(data: unknown, params?: core.ParseContext<core.$ZodIssue>): Promise<ZodSafeParseResult<core.output<this>>>; + spa: (data: unknown, params?: core.ParseContext<core.$ZodIssue>) => Promise<ZodSafeParseResult<core.output<this>>>; + encode(data: core.output<this>, params?: core.ParseContext<core.$ZodIssue>): core.input<this>; + decode(data: core.input<this>, params?: core.ParseContext<core.$ZodIssue>): core.output<this>; + encodeAsync(data: core.output<this>, params?: core.ParseContext<core.$ZodIssue>): Promise<core.input<this>>; + decodeAsync(data: core.input<this>, params?: core.ParseContext<core.$ZodIssue>): Promise<core.output<this>>; + safeEncode(data: core.output<this>, params?: core.ParseContext<core.$ZodIssue>): ZodSafeParseResult<core.input<this>>; + safeDecode(data: core.input<this>, params?: core.ParseContext<core.$ZodIssue>): ZodSafeParseResult<core.output<this>>; + safeEncodeAsync(data: core.output<this>, params?: core.ParseContext<core.$ZodIssue>): Promise<ZodSafeParseResult<core.input<this>>>; + safeDecodeAsync(data: core.input<this>, params?: core.ParseContext<core.$ZodIssue>): Promise<ZodSafeParseResult<core.output<this>>>; + refine<Ch extends (arg: core.output<this>) => unknown | Promise<unknown>>(check: Ch, params?: string | core.$ZodCustomParams): Ch extends (arg: any) => arg is infer R ? this & ZodType$1<R, core.input<this>> : this; + superRefine(refinement: (arg: core.output<this>, ctx: core.$RefinementCtx<core.output<this>>) => void | Promise<void>): this; + overwrite(fn: (x: core.output<this>) => core.output<this>): this; + optional(): ZodOptional$1<this>; + exactOptional(): ZodExactOptional<this>; + nonoptional(params?: string | core.$ZodNonOptionalParams): ZodNonOptional<this>; + nullable(): ZodNullable$1<this>; + nullish(): ZodOptional$1<ZodNullable$1<this>>; + default(def: util$1.NoUndefined<core.output<this>>): ZodDefault$1<this>; + default(def: () => util$1.NoUndefined<core.output<this>>): ZodDefault$1<this>; + prefault(def: () => core.input<this>): ZodPrefault<this>; + prefault(def: core.input<this>): ZodPrefault<this>; + array(): ZodArray$1<this>; + or<T extends core.SomeType>(option: T): ZodUnion$1<[ + this, + T + ]>; + and<T extends core.SomeType>(incoming: T): ZodIntersection$1<this, T>; + transform<NewOut>(transform: (arg: core.output<this>, ctx: core.$RefinementCtx<core.output<this>>) => NewOut | Promise<NewOut>): ZodPipe<this, ZodTransform<Awaited<NewOut>, core.output<this>>>; + catch(def: core.output<this>): ZodCatch$1<this>; + catch(def: (ctx: core.$ZodCatchCtx) => core.output<this>): ZodCatch$1<this>; + pipe<T extends core.$ZodType<any, core.output<this>>>(target: T | core.$ZodType<any, core.output<this>>): ZodPipe<this, T>; + readonly(): ZodReadonly$1<this>; + /** Returns a new instance that has been registered in `z.globalRegistry` with the specified description */ + describe(description: string): this; + description?: string; + /** Returns the metadata associated with this instance in `z.globalRegistry` */ + meta(): core.$replace<core.GlobalMeta, this> | undefined; + /** Returns a new instance that has been registered in `z.globalRegistry` with the specified metadata */ + meta(data: core.$replace<core.GlobalMeta, this>): this; + /** @deprecated Try safe-parsing `undefined` (this is what `isOptional` does internally): + * + * ```ts + * const schema = z.string().optional(); + * const isOptional = schema.safeParse(undefined).success; // true + * ``` + */ + isOptional(): boolean; + /** + * @deprecated Try safe-parsing `null` (this is what `isNullable` does internally): + * + * ```ts + * const schema = z.string().nullable(); + * const isNullable = schema.safeParse(null).success; // true + * ``` + */ + isNullable(): boolean; + apply<T>(fn: (schema: this) => T): T; +} +export interface _ZodType<out Internals extends core.$ZodTypeInternals = core.$ZodTypeInternals> extends ZodType$1<any, any, Internals> { +} +declare const ZodType$1: core.$constructor<ZodType$1>; +export interface _ZodString<T extends core.$ZodStringInternals<unknown> = core.$ZodStringInternals<unknown>> extends _ZodType<T> { + format: string | null; + minLength: number | null; + maxLength: number | null; + regex(regex: RegExp, params?: string | core.$ZodCheckRegexParams): this; + includes(value: string, params?: string | core.$ZodCheckIncludesParams): this; + startsWith(value: string, params?: string | core.$ZodCheckStartsWithParams): this; + endsWith(value: string, params?: string | core.$ZodCheckEndsWithParams): this; + min(minLength: number, params?: string | core.$ZodCheckMinLengthParams): this; + max(maxLength: number, params?: string | core.$ZodCheckMaxLengthParams): this; + length(len: number, params?: string | core.$ZodCheckLengthEqualsParams): this; + nonempty(params?: string | core.$ZodCheckMinLengthParams): this; + lowercase(params?: string | core.$ZodCheckLowerCaseParams): this; + uppercase(params?: string | core.$ZodCheckUpperCaseParams): this; + trim(): this; + normalize(form?: "NFC" | "NFD" | "NFKC" | "NFKD" | (string & {})): this; + toLowerCase(): this; + toUpperCase(): this; + slugify(): this; +} +declare const _ZodString: core.$constructor<_ZodString>; +export interface ZodString extends _ZodString<core.$ZodStringInternals<string>> { + /** @deprecated Use `z.email()` instead. */ + email(params?: string | core.$ZodCheckEmailParams): this; + /** @deprecated Use `z.url()` instead. */ + url(params?: string | core.$ZodCheckURLParams): this; + /** @deprecated Use `z.jwt()` instead. */ + jwt(params?: string | core.$ZodCheckJWTParams): this; + /** @deprecated Use `z.emoji()` instead. */ + emoji(params?: string | core.$ZodCheckEmojiParams): this; + /** @deprecated Use `z.guid()` instead. */ + guid(params?: string | core.$ZodCheckGUIDParams): this; + /** @deprecated Use `z.uuid()` instead. */ + uuid(params?: string | core.$ZodCheckUUIDParams): this; + /** @deprecated Use `z.uuid()` instead. */ + uuidv4(params?: string | core.$ZodCheckUUIDParams): this; + /** @deprecated Use `z.uuid()` instead. */ + uuidv6(params?: string | core.$ZodCheckUUIDParams): this; + /** @deprecated Use `z.uuid()` instead. */ + uuidv7(params?: string | core.$ZodCheckUUIDParams): this; + /** @deprecated Use `z.nanoid()` instead. */ + nanoid(params?: string | core.$ZodCheckNanoIDParams): this; + /** @deprecated Use `z.guid()` instead. */ + guid(params?: string | core.$ZodCheckGUIDParams): this; + /** @deprecated Use `z.cuid()` instead. */ + cuid(params?: string | core.$ZodCheckCUIDParams): this; + /** @deprecated Use `z.cuid2()` instead. */ + cuid2(params?: string | core.$ZodCheckCUID2Params): this; + /** @deprecated Use `z.ulid()` instead. */ + ulid(params?: string | core.$ZodCheckULIDParams): this; + /** @deprecated Use `z.base64()` instead. */ + base64(params?: string | core.$ZodCheckBase64Params): this; + /** @deprecated Use `z.base64url()` instead. */ + base64url(params?: string | core.$ZodCheckBase64URLParams): this; + /** @deprecated Use `z.xid()` instead. */ + xid(params?: string | core.$ZodCheckXIDParams): this; + /** @deprecated Use `z.ksuid()` instead. */ + ksuid(params?: string | core.$ZodCheckKSUIDParams): this; + /** @deprecated Use `z.ipv4()` instead. */ + ipv4(params?: string | core.$ZodCheckIPv4Params): this; + /** @deprecated Use `z.ipv6()` instead. */ + ipv6(params?: string | core.$ZodCheckIPv6Params): this; + /** @deprecated Use `z.cidrv4()` instead. */ + cidrv4(params?: string | core.$ZodCheckCIDRv4Params): this; + /** @deprecated Use `z.cidrv6()` instead. */ + cidrv6(params?: string | core.$ZodCheckCIDRv6Params): this; + /** @deprecated Use `z.e164()` instead. */ + e164(params?: string | core.$ZodCheckE164Params): this; + /** @deprecated Use `z.iso.datetime()` instead. */ + datetime(params?: string | core.$ZodCheckISODateTimeParams): this; + /** @deprecated Use `z.iso.date()` instead. */ + date(params?: string | core.$ZodCheckISODateParams): this; + /** @deprecated Use `z.iso.time()` instead. */ + time(params?: string | core.$ZodCheckISOTimeParams): this; + /** @deprecated Use `z.iso.duration()` instead. */ + duration(params?: string | core.$ZodCheckISODurationParams): this; +} +declare const ZodString: core.$constructor<ZodString>; +declare function string$1(params?: string | core.$ZodStringParams): ZodString; +declare function string$1<T extends string>(params?: string | core.$ZodStringParams): core.$ZodType<T, T>; +export interface ZodStringFormat<Format extends string = string> extends _ZodString<core.$ZodStringFormatInternals<Format>> { +} +declare const ZodStringFormat: core.$constructor<ZodStringFormat>; +export interface ZodEmail extends ZodStringFormat<"email"> { + _zod: core.$ZodEmailInternals; +} +declare const ZodEmail: core.$constructor<ZodEmail>; +declare function email$1(params?: string | core.$ZodEmailParams): ZodEmail; +export interface ZodGUID extends ZodStringFormat<"guid"> { + _zod: core.$ZodGUIDInternals; +} +declare const ZodGUID: core.$constructor<ZodGUID>; +declare function guid$1(params?: string | core.$ZodGUIDParams): ZodGUID; +export interface ZodUUID extends ZodStringFormat<"uuid"> { + _zod: core.$ZodUUIDInternals; +} +declare const ZodUUID: core.$constructor<ZodUUID>; +declare function uuid$1(params?: string | core.$ZodUUIDParams): ZodUUID; +declare function uuidv4(params?: string | core.$ZodUUIDv4Params): ZodUUID; +declare function uuidv6(params?: string | core.$ZodUUIDv6Params): ZodUUID; +declare function uuidv7(params?: string | core.$ZodUUIDv7Params): ZodUUID; +export interface ZodURL extends ZodStringFormat<"url"> { + _zod: core.$ZodURLInternals; +} +declare const ZodURL: core.$constructor<ZodURL>; +declare function url(params?: string | core.$ZodURLParams): ZodURL; +declare function httpUrl(params?: string | Omit<core.$ZodURLParams, "protocol" | "hostname">): ZodURL; +export interface ZodEmoji extends ZodStringFormat<"emoji"> { + _zod: core.$ZodEmojiInternals; +} +declare const ZodEmoji: core.$constructor<ZodEmoji>; +declare function emoji$1(params?: string | core.$ZodEmojiParams): ZodEmoji; +export interface ZodNanoID extends ZodStringFormat<"nanoid"> { + _zod: core.$ZodNanoIDInternals; +} +declare const ZodNanoID: core.$constructor<ZodNanoID>; +declare function nanoid$1(params?: string | core.$ZodNanoIDParams): ZodNanoID; +export interface ZodCUID extends ZodStringFormat<"cuid"> { + _zod: core.$ZodCUIDInternals; +} +declare const ZodCUID: core.$constructor<ZodCUID>; +declare function cuid$1(params?: string | core.$ZodCUIDParams): ZodCUID; +export interface ZodCUID2 extends ZodStringFormat<"cuid2"> { + _zod: core.$ZodCUID2Internals; +} +declare const ZodCUID2: core.$constructor<ZodCUID2>; +declare function cuid2$1(params?: string | core.$ZodCUID2Params): ZodCUID2; +export interface ZodULID extends ZodStringFormat<"ulid"> { + _zod: core.$ZodULIDInternals; +} +declare const ZodULID: core.$constructor<ZodULID>; +declare function ulid$1(params?: string | core.$ZodULIDParams): ZodULID; +export interface ZodXID extends ZodStringFormat<"xid"> { + _zod: core.$ZodXIDInternals; +} +declare const ZodXID: core.$constructor<ZodXID>; +declare function xid$1(params?: string | core.$ZodXIDParams): ZodXID; +export interface ZodKSUID extends ZodStringFormat<"ksuid"> { + _zod: core.$ZodKSUIDInternals; +} +declare const ZodKSUID: core.$constructor<ZodKSUID>; +declare function ksuid$1(params?: string | core.$ZodKSUIDParams): ZodKSUID; +export interface ZodIPv4 extends ZodStringFormat<"ipv4"> { + _zod: core.$ZodIPv4Internals; +} +declare const ZodIPv4: core.$constructor<ZodIPv4>; +declare function ipv4$1(params?: string | core.$ZodIPv4Params): ZodIPv4; +export interface ZodMAC extends ZodStringFormat<"mac"> { + _zod: core.$ZodMACInternals; +} +declare const ZodMAC: core.$constructor<ZodMAC>; +declare function mac$1(params?: string | core.$ZodMACParams): ZodMAC; +export interface ZodIPv6 extends ZodStringFormat<"ipv6"> { + _zod: core.$ZodIPv6Internals; +} +declare const ZodIPv6: core.$constructor<ZodIPv6>; +declare function ipv6$1(params?: string | core.$ZodIPv6Params): ZodIPv6; +export interface ZodCIDRv4 extends ZodStringFormat<"cidrv4"> { + _zod: core.$ZodCIDRv4Internals; +} +declare const ZodCIDRv4: core.$constructor<ZodCIDRv4>; +declare function cidrv4$1(params?: string | core.$ZodCIDRv4Params): ZodCIDRv4; +export interface ZodCIDRv6 extends ZodStringFormat<"cidrv6"> { + _zod: core.$ZodCIDRv6Internals; +} +declare const ZodCIDRv6: core.$constructor<ZodCIDRv6>; +declare function cidrv6$1(params?: string | core.$ZodCIDRv6Params): ZodCIDRv6; +export interface ZodBase64 extends ZodStringFormat<"base64"> { + _zod: core.$ZodBase64Internals; +} +declare const ZodBase64: core.$constructor<ZodBase64>; +declare function base64$1(params?: string | core.$ZodBase64Params): ZodBase64; +export interface ZodBase64URL extends ZodStringFormat<"base64url"> { + _zod: core.$ZodBase64URLInternals; +} +declare const ZodBase64URL: core.$constructor<ZodBase64URL>; +declare function base64url$1(params?: string | core.$ZodBase64URLParams): ZodBase64URL; +export interface ZodE164 extends ZodStringFormat<"e164"> { + _zod: core.$ZodE164Internals; +} +declare const ZodE164: core.$constructor<ZodE164>; +declare function e164$1(params?: string | core.$ZodE164Params): ZodE164; +export interface ZodJWT extends ZodStringFormat<"jwt"> { + _zod: core.$ZodJWTInternals; +} +declare const ZodJWT: core.$constructor<ZodJWT>; +declare function jwt(params?: string | core.$ZodJWTParams): ZodJWT; +export interface ZodCustomStringFormat<Format extends string = string> extends ZodStringFormat<Format>, core.$ZodCustomStringFormat<Format> { + _zod: core.$ZodCustomStringFormatInternals<Format>; + "~standard": ZodStandardSchemaWithJSON$1<this>; +} +declare const ZodCustomStringFormat: core.$constructor<ZodCustomStringFormat>; +declare function stringFormat<Format extends string>(format: Format, fnOrRegex: ((arg: string) => util$1.MaybeAsync<unknown>) | RegExp, _params?: string | core.$ZodStringFormatParams): ZodCustomStringFormat<Format>; +declare function hostname$1(_params?: string | core.$ZodStringFormatParams): ZodCustomStringFormat<"hostname">; +declare function hex$1(_params?: string | core.$ZodStringFormatParams): ZodCustomStringFormat<"hex">; +declare function hash<Alg extends util$1.HashAlgorithm, Enc extends util$1.HashEncoding = "hex">(alg: Alg, params?: { + enc?: Enc; +} & core.$ZodStringFormatParams): ZodCustomStringFormat<`${Alg}_${Enc}`>; +export interface _ZodNumber<Internals extends core.$ZodNumberInternals = core.$ZodNumberInternals> extends _ZodType<Internals> { + gt(value: number, params?: string | core.$ZodCheckGreaterThanParams): this; + /** Identical to .min() */ + gte(value: number, params?: string | core.$ZodCheckGreaterThanParams): this; + min(value: number, params?: string | core.$ZodCheckGreaterThanParams): this; + lt(value: number, params?: string | core.$ZodCheckLessThanParams): this; + /** Identical to .max() */ + lte(value: number, params?: string | core.$ZodCheckLessThanParams): this; + max(value: number, params?: string | core.$ZodCheckLessThanParams): this; + /** Consider `z.int()` instead. This API is considered *legacy*; it will never be removed but a better alternative exists. */ + int(params?: string | core.$ZodCheckNumberFormatParams): this; + /** @deprecated This is now identical to `.int()`. Only numbers in the safe integer range are accepted. */ + safe(params?: string | core.$ZodCheckNumberFormatParams): this; + positive(params?: string | core.$ZodCheckGreaterThanParams): this; + nonnegative(params?: string | core.$ZodCheckGreaterThanParams): this; + negative(params?: string | core.$ZodCheckLessThanParams): this; + nonpositive(params?: string | core.$ZodCheckLessThanParams): this; + multipleOf(value: number, params?: string | core.$ZodCheckMultipleOfParams): this; + /** @deprecated Use `.multipleOf()` instead. */ + step(value: number, params?: string | core.$ZodCheckMultipleOfParams): this; + /** @deprecated In v4 and later, z.number() does not allow infinite values by default. This is a no-op. */ + finite(params?: unknown): this; + minValue: number | null; + maxValue: number | null; + /** @deprecated Check the `format` property instead. */ + isInt: boolean; + /** @deprecated Number schemas no longer accept infinite values, so this always returns `true`. */ + isFinite: boolean; + format: string | null; +} +export interface ZodNumber extends _ZodNumber<core.$ZodNumberInternals<number>> { +} +declare const ZodNumber: core.$constructor<ZodNumber>; +declare function number$1(params?: string | core.$ZodNumberParams): ZodNumber; +export interface ZodNumberFormat extends ZodNumber { + _zod: core.$ZodNumberFormatInternals; +} +declare const ZodNumberFormat: core.$constructor<ZodNumberFormat>; +export interface ZodInt extends ZodNumberFormat { +} +declare function int(params?: string | core.$ZodCheckNumberFormatParams): ZodInt; +export interface ZodFloat32 extends ZodNumberFormat { +} +declare function float32(params?: string | core.$ZodCheckNumberFormatParams): ZodFloat32; +export interface ZodFloat64 extends ZodNumberFormat { +} +declare function float64(params?: string | core.$ZodCheckNumberFormatParams): ZodFloat64; +export interface ZodInt32 extends ZodNumberFormat { +} +declare function int32(params?: string | core.$ZodCheckNumberFormatParams): ZodInt32; +export interface ZodUInt32 extends ZodNumberFormat { +} +declare function uint32(params?: string | core.$ZodCheckNumberFormatParams): ZodUInt32; +export interface _ZodBoolean<T extends core.$ZodBooleanInternals = core.$ZodBooleanInternals> extends _ZodType<T> { +} +export interface ZodBoolean extends _ZodBoolean<core.$ZodBooleanInternals<boolean>> { +} +declare const ZodBoolean: core.$constructor<ZodBoolean>; +declare function boolean$1(params?: string | core.$ZodBooleanParams): ZodBoolean; +export interface _ZodBigInt<T extends core.$ZodBigIntInternals = core.$ZodBigIntInternals> extends _ZodType<T> { + gte(value: bigint, params?: string | core.$ZodCheckGreaterThanParams): this; + /** Alias of `.gte()` */ + min(value: bigint, params?: string | core.$ZodCheckGreaterThanParams): this; + gt(value: bigint, params?: string | core.$ZodCheckGreaterThanParams): this; + /** Alias of `.lte()` */ + lte(value: bigint, params?: string | core.$ZodCheckLessThanParams): this; + max(value: bigint, params?: string | core.$ZodCheckLessThanParams): this; + lt(value: bigint, params?: string | core.$ZodCheckLessThanParams): this; + positive(params?: string | core.$ZodCheckGreaterThanParams): this; + negative(params?: string | core.$ZodCheckLessThanParams): this; + nonpositive(params?: string | core.$ZodCheckLessThanParams): this; + nonnegative(params?: string | core.$ZodCheckGreaterThanParams): this; + multipleOf(value: bigint, params?: string | core.$ZodCheckMultipleOfParams): this; + minValue: bigint | null; + maxValue: bigint | null; + format: string | null; +} +export interface ZodBigInt extends _ZodBigInt<core.$ZodBigIntInternals<bigint>> { +} +declare const ZodBigInt: core.$constructor<ZodBigInt>; +declare function bigint$1(params?: string | core.$ZodBigIntParams): ZodBigInt; +export interface ZodBigIntFormat extends ZodBigInt { + _zod: core.$ZodBigIntFormatInternals; +} +declare const ZodBigIntFormat: core.$constructor<ZodBigIntFormat>; +declare function int64(params?: string | core.$ZodBigIntFormatParams): ZodBigIntFormat; +declare function uint64(params?: string | core.$ZodBigIntFormatParams): ZodBigIntFormat; +export interface ZodSymbol extends _ZodType<core.$ZodSymbolInternals> { +} +declare const ZodSymbol: core.$constructor<ZodSymbol>; +declare function symbol(params?: string | core.$ZodSymbolParams): ZodSymbol; +export interface ZodUndefined extends _ZodType<core.$ZodUndefinedInternals> { +} +declare const ZodUndefined: core.$constructor<ZodUndefined>; +declare function _undefined$2(params?: string | core.$ZodUndefinedParams): ZodUndefined; +export interface ZodNull extends _ZodType<core.$ZodNullInternals> { +} +declare const ZodNull: core.$constructor<ZodNull>; +declare function _null$2(params?: string | core.$ZodNullParams): ZodNull; +export interface ZodAny extends _ZodType<core.$ZodAnyInternals> { +} +declare const ZodAny: core.$constructor<ZodAny>; +declare function any(): ZodAny; +export interface ZodUnknown extends _ZodType<core.$ZodUnknownInternals> { +} +declare const ZodUnknown: core.$constructor<ZodUnknown>; +declare function unknown(): ZodUnknown; +export interface ZodNever extends _ZodType<core.$ZodNeverInternals> { +} +declare const ZodNever: core.$constructor<ZodNever>; +declare function never(params?: string | core.$ZodNeverParams): ZodNever; +export interface ZodVoid extends _ZodType<core.$ZodVoidInternals> { +} +declare const ZodVoid: core.$constructor<ZodVoid>; +declare function _void$1(params?: string | core.$ZodVoidParams): ZodVoid; +export interface _ZodDate<T extends core.$ZodDateInternals = core.$ZodDateInternals> extends _ZodType<T> { + min(value: number | Date, params?: string | core.$ZodCheckGreaterThanParams): this; + max(value: number | Date, params?: string | core.$ZodCheckLessThanParams): this; + /** @deprecated Not recommended. */ + minDate: Date | null; + /** @deprecated Not recommended. */ + maxDate: Date | null; +} +export interface ZodDate extends _ZodDate<core.$ZodDateInternals<Date>> { +} +declare const ZodDate: core.$constructor<ZodDate>; +declare function date$1(params?: string | core.$ZodDateParams): ZodDate; +interface ZodArray$1<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodArrayInternals<T>>, core.$ZodArray<T> { + element: T; + min(minLength: number, params?: string | core.$ZodCheckMinLengthParams): this; + nonempty(params?: string | core.$ZodCheckMinLengthParams): this; + max(maxLength: number, params?: string | core.$ZodCheckMaxLengthParams): this; + length(len: number, params?: string | core.$ZodCheckLengthEqualsParams): this; + unwrap(): T; + "~standard": ZodStandardSchemaWithJSON$1<this>; +} +declare const ZodArray$1: core.$constructor<ZodArray$1>; +declare function array<T extends core.SomeType>(element: T, params?: string | core.$ZodArrayParams): ZodArray$1<T>; +declare function keyof<T extends ZodObject>(schema: T): ZodEnum<util$1.KeysEnum<T["_zod"]["output"]>>; +export type SafeExtendShape<Base extends core.$ZodShape, Ext extends core.$ZodLooseShape> = { + [K in keyof Ext]: K extends keyof Base ? core.output<Ext[K]> extends core.output<Base[K]> ? core.input<Ext[K]> extends core.input<Base[K]> ? Ext[K] : never : never : Ext[K]; +}; +export interface ZodObject< +/** @ts-ignore Cast variance */ +out Shape extends core.$ZodShape = core.$ZodLooseShape, out Config extends core.$ZodObjectConfig = core.$strip> extends _ZodType<core.$ZodObjectInternals<Shape, Config>>, core.$ZodObject<Shape, Config> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + shape: Shape; + keyof(): ZodEnum<util$1.ToEnum<keyof Shape & string>>; + /** Define a schema to validate all unrecognized keys. This overrides the existing strict/loose behavior. */ + catchall<T extends core.SomeType>(schema: T): ZodObject<Shape, core.$catchall<T>>; + /** @deprecated Use `z.looseObject()` or `.loose()` instead. */ + passthrough(): ZodObject<Shape, core.$loose>; + /** Consider `z.looseObject(A.shape)` instead */ + loose(): ZodObject<Shape, core.$loose>; + /** Consider `z.strictObject(A.shape)` instead */ + strict(): ZodObject<Shape, core.$strict>; + /** This is the default behavior. This method call is likely unnecessary. */ + strip(): ZodObject<Shape, core.$strip>; + extend<U extends core.$ZodLooseShape>(shape: U): ZodObject<util$1.Extend<Shape, U>, Config>; + safeExtend<U extends core.$ZodLooseShape>(shape: SafeExtendShape<Shape, U> & Partial<Record<keyof Shape, core.SomeType>>): ZodObject<util$1.Extend<Shape, U>, Config>; + /** + * @deprecated Use [`A.extend(B.shape)`](https://zod.dev/api?id=extend) instead. + */ + merge<U extends ZodObject>(other: U): ZodObject<util$1.Extend<Shape, U["shape"]>, U["_zod"]["config"]>; + pick<M extends util$1.Mask<keyof Shape>>(mask: M & Record<Exclude<keyof M, keyof Shape>, never>): ZodObject<util$1.Flatten<Pick<Shape, Extract<keyof Shape, keyof M>>>, Config>; + omit<M extends util$1.Mask<keyof Shape>>(mask: M & Record<Exclude<keyof M, keyof Shape>, never>): ZodObject<util$1.Flatten<Omit<Shape, Extract<keyof Shape, keyof M>>>, Config>; + partial(): ZodObject<{ + [k in keyof Shape]: ZodOptional$1<Shape[k]>; + }, Config>; + partial<M extends util$1.Mask<keyof Shape>>(mask: M & Record<Exclude<keyof M, keyof Shape>, never>): ZodObject<{ + [k in keyof Shape]: k extends keyof M ? ZodOptional$1<Shape[k]> : Shape[k]; + }, Config>; + required(): ZodObject<{ + [k in keyof Shape]: ZodNonOptional<Shape[k]>; + }, Config>; + required<M extends util$1.Mask<keyof Shape>>(mask: M & Record<Exclude<keyof M, keyof Shape>, never>): ZodObject<{ + [k in keyof Shape]: k extends keyof M ? ZodNonOptional<Shape[k]> : Shape[k]; + }, Config>; +} +declare const ZodObject: core.$constructor<ZodObject>; +declare function object<T extends core.$ZodLooseShape = Partial<Record<never, core.SomeType>>>(shape?: T, params?: string | core.$ZodObjectParams): ZodObject<util$1.Writeable<T>, core.$strip>; +declare function strictObject<T extends core.$ZodLooseShape>(shape: T, params?: string | core.$ZodObjectParams): ZodObject<T, core.$strict>; +declare function looseObject<T extends core.$ZodLooseShape>(shape: T, params?: string | core.$ZodObjectParams): ZodObject<T, core.$loose>; +interface ZodUnion$1<T extends readonly core.SomeType[] = readonly core.$ZodType[]> extends _ZodType<core.$ZodUnionInternals<T>>, core.$ZodUnion<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + options: T; +} +declare const ZodUnion$1: core.$constructor<ZodUnion$1>; +declare function union<const T extends readonly core.SomeType[]>(options: T, params?: string | core.$ZodUnionParams): ZodUnion$1<T>; +export interface ZodXor<T extends readonly core.SomeType[] = readonly core.$ZodType[]> extends _ZodType<core.$ZodXorInternals<T>>, core.$ZodXor<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + options: T; +} +declare const ZodXor: core.$constructor<ZodXor>; +declare function xor<const T extends readonly core.SomeType[]>(options: T, params?: string | core.$ZodXorParams): ZodXor<T>; +export interface ZodDiscriminatedUnion<Options extends readonly core.SomeType[] = readonly core.$ZodType[], Disc extends string = string> extends ZodUnion$1<Options>, core.$ZodDiscriminatedUnion<Options, Disc> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + _zod: core.$ZodDiscriminatedUnionInternals<Options, Disc>; + def: core.$ZodDiscriminatedUnionDef<Options, Disc>; +} +declare const ZodDiscriminatedUnion: core.$constructor<ZodDiscriminatedUnion>; +declare function discriminatedUnion<Types extends readonly [ + core.$ZodTypeDiscriminable, + ...core.$ZodTypeDiscriminable[] +], Disc extends string>(discriminator: Disc, options: Types, params?: string | core.$ZodDiscriminatedUnionParams): ZodDiscriminatedUnion<Types, Disc>; +interface ZodIntersection$1<A extends core.SomeType = core.$ZodType, B extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodIntersectionInternals<A, B>>, core.$ZodIntersection<A, B> { + "~standard": ZodStandardSchemaWithJSON$1<this>; +} +declare const ZodIntersection$1: core.$constructor<ZodIntersection$1>; +declare function intersection<T extends core.SomeType, U extends core.SomeType>(left: T, right: U): ZodIntersection$1<T, U>; +export interface ZodTuple<T extends util$1.TupleItems = readonly core.$ZodType[], Rest extends core.SomeType | null = core.$ZodType | null> extends _ZodType<core.$ZodTupleInternals<T, Rest>>, core.$ZodTuple<T, Rest> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + rest<Rest extends core.SomeType = core.$ZodType>(rest: Rest): ZodTuple<T, Rest>; +} +declare const ZodTuple: core.$constructor<ZodTuple>; +declare function tuple<T extends readonly [ + core.SomeType, + ...core.SomeType[] +]>(items: T, params?: string | core.$ZodTupleParams): ZodTuple<T, null>; +declare function tuple<T extends readonly [ + core.SomeType, + ...core.SomeType[] +], Rest extends core.SomeType>(items: T, rest: Rest, params?: string | core.$ZodTupleParams): ZodTuple<T, Rest>; +declare function tuple(items: [ +], params?: string | core.$ZodTupleParams): ZodTuple<[ +], null>; +export interface ZodRecord<Key extends core.$ZodRecordKey = core.$ZodRecordKey, Value extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodRecordInternals<Key, Value>>, core.$ZodRecord<Key, Value> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + keyType: Key; + valueType: Value; +} +declare const ZodRecord: core.$constructor<ZodRecord>; +declare function record<Key extends core.$ZodRecordKey, Value extends core.SomeType>(keyType: Key, valueType: Value, params?: string | core.$ZodRecordParams): ZodRecord<Key, Value>; +declare function partialRecord<Key extends core.$ZodRecordKey, Value extends core.SomeType>(keyType: Key, valueType: Value, params?: string | core.$ZodRecordParams): ZodRecord<Key & core.$partial, Value>; +declare function looseRecord<Key extends core.$ZodRecordKey, Value extends core.SomeType>(keyType: Key, valueType: Value, params?: string | core.$ZodRecordParams): ZodRecord<Key, Value>; +export interface ZodMap<Key extends core.SomeType = core.$ZodType, Value extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodMapInternals<Key, Value>>, core.$ZodMap<Key, Value> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + keyType: Key; + valueType: Value; + min(minSize: number, params?: string | core.$ZodCheckMinSizeParams): this; + nonempty(params?: string | core.$ZodCheckMinSizeParams): this; + max(maxSize: number, params?: string | core.$ZodCheckMaxSizeParams): this; + size(size: number, params?: string | core.$ZodCheckSizeEqualsParams): this; +} +declare const ZodMap: core.$constructor<ZodMap>; +declare function map<Key extends core.SomeType, Value extends core.SomeType>(keyType: Key, valueType: Value, params?: string | core.$ZodMapParams): ZodMap<Key, Value>; +export interface ZodSet<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodSetInternals<T>>, core.$ZodSet<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + min(minSize: number, params?: string | core.$ZodCheckMinSizeParams): this; + nonempty(params?: string | core.$ZodCheckMinSizeParams): this; + max(maxSize: number, params?: string | core.$ZodCheckMaxSizeParams): this; + size(size: number, params?: string | core.$ZodCheckSizeEqualsParams): this; +} +declare const ZodSet: core.$constructor<ZodSet>; +declare function set<Value extends core.SomeType>(valueType: Value, params?: string | core.$ZodSetParams): ZodSet<Value>; +export interface ZodEnum< +/** @ts-ignore Cast variance */ +out T extends util$1.EnumLike = util$1.EnumLike> extends _ZodType<core.$ZodEnumInternals<T>>, core.$ZodEnum<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + enum: T; + options: Array<T[keyof T]>; + extract<const U extends readonly (keyof T)[]>(values: U, params?: string | core.$ZodEnumParams): ZodEnum<util$1.Flatten<Pick<T, U[number]>>>; + exclude<const U extends readonly (keyof T)[]>(values: U, params?: string | core.$ZodEnumParams): ZodEnum<util$1.Flatten<Omit<T, U[number]>>>; +} +declare const ZodEnum: core.$constructor<ZodEnum>; +declare function _enum$1<const T extends readonly string[]>(values: T, params?: string | core.$ZodEnumParams): ZodEnum<util$1.ToEnum<T[number]>>; +declare function _enum$1<const T extends util$1.EnumLike>(entries: T, params?: string | core.$ZodEnumParams): ZodEnum<T>; +declare function nativeEnum<T extends util$1.EnumLike>(entries: T, params?: string | core.$ZodEnumParams): ZodEnum<T>; +export interface ZodLiteral<T extends util$1.Literal = util$1.Literal> extends _ZodType<core.$ZodLiteralInternals<T>>, core.$ZodLiteral<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + values: Set<T>; + /** @legacy Use `.values` instead. Accessing this property will throw an error if the literal accepts multiple values. */ + value: T; +} +declare const ZodLiteral: core.$constructor<ZodLiteral>; +declare function literal<const T extends ReadonlyArray<util$1.Literal>>(value: T, params?: string | core.$ZodLiteralParams): ZodLiteral<T[number]>; +declare function literal<const T extends util$1.Literal>(value: T, params?: string | core.$ZodLiteralParams): ZodLiteral<T>; +export interface ZodFile extends _ZodType<core.$ZodFileInternals>, core.$ZodFile { + "~standard": ZodStandardSchemaWithJSON$1<this>; + min(size: number, params?: string | core.$ZodCheckMinSizeParams): this; + max(size: number, params?: string | core.$ZodCheckMaxSizeParams): this; + mime(types: util$1.MimeTypes | Array<util$1.MimeTypes>, params?: string | core.$ZodCheckMimeTypeParams): this; +} +declare const ZodFile: core.$constructor<ZodFile>; +declare function file(params?: string | core.$ZodFileParams): ZodFile; +export interface ZodTransform<O = unknown, I = unknown> extends _ZodType<core.$ZodTransformInternals<O, I>>, core.$ZodTransform<O, I> { + "~standard": ZodStandardSchemaWithJSON$1<this>; +} +declare const ZodTransform: core.$constructor<ZodTransform>; +declare function transform<I = unknown, O = I>(fn: (input: I, ctx: core.ParsePayload) => O): ZodTransform<Awaited<O>, I>; +interface ZodOptional$1<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodOptionalInternals<T>>, core.$ZodOptional<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodOptional$1: core.$constructor<ZodOptional$1>; +declare function optional<T extends core.SomeType>(innerType: T): ZodOptional$1<T>; +export interface ZodExactOptional<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodExactOptionalInternals<T>>, core.$ZodExactOptional<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodExactOptional: core.$constructor<ZodExactOptional>; +declare function exactOptional<T extends core.SomeType>(innerType: T): ZodExactOptional<T>; +interface ZodNullable$1<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodNullableInternals<T>>, core.$ZodNullable<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodNullable$1: core.$constructor<ZodNullable$1>; +declare function nullable<T extends core.SomeType>(innerType: T): ZodNullable$1<T>; +declare function nullish$1<T extends core.SomeType>(innerType: T): ZodOptional$1<ZodNullable$1<T>>; +interface ZodDefault$1<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodDefaultInternals<T>>, core.$ZodDefault<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; + /** @deprecated Use `.unwrap()` instead. */ + removeDefault(): T; +} +declare const ZodDefault$1: core.$constructor<ZodDefault$1>; +declare function _default$50<T extends core.SomeType>(innerType: T, defaultValue: util$1.NoUndefined<core.output<T>> | (() => util$1.NoUndefined<core.output<T>>)): ZodDefault$1<T>; +export interface ZodPrefault<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodPrefaultInternals<T>>, core.$ZodPrefault<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodPrefault: core.$constructor<ZodPrefault>; +declare function prefault<T extends core.SomeType>(innerType: T, defaultValue: core.input<T> | (() => core.input<T>)): ZodPrefault<T>; +export interface ZodNonOptional<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodNonOptionalInternals<T>>, core.$ZodNonOptional<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodNonOptional: core.$constructor<ZodNonOptional>; +declare function nonoptional<T extends core.SomeType>(innerType: T, params?: string | core.$ZodNonOptionalParams): ZodNonOptional<T>; +export interface ZodSuccess<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodSuccessInternals<T>>, core.$ZodSuccess<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodSuccess: core.$constructor<ZodSuccess>; +declare function success<T extends core.SomeType>(innerType: T): ZodSuccess<T>; +interface ZodCatch$1<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodCatchInternals<T>>, core.$ZodCatch<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; + /** @deprecated Use `.unwrap()` instead. */ + removeCatch(): T; +} +declare const ZodCatch$1: core.$constructor<ZodCatch$1>; +declare function _catch$1<T extends core.SomeType>(innerType: T, catchValue: core.output<T> | ((ctx: core.$ZodCatchCtx) => core.output<T>)): ZodCatch$1<T>; +export interface ZodNaN extends _ZodType<core.$ZodNaNInternals>, core.$ZodNaN { + "~standard": ZodStandardSchemaWithJSON$1<this>; +} +declare const ZodNaN: core.$constructor<ZodNaN>; +declare function nan(params?: string | core.$ZodNaNParams): ZodNaN; +export interface ZodPipe<A extends core.SomeType = core.$ZodType, B extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodPipeInternals<A, B>>, core.$ZodPipe<A, B> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + in: A; + out: B; +} +declare const ZodPipe: core.$constructor<ZodPipe>; +declare function pipe<const A extends core.SomeType, B extends core.$ZodType<unknown, core.output<A>> = core.$ZodType<unknown, core.output<A>>>(in_: A, out: B | core.$ZodType<unknown, core.output<A>>): ZodPipe<A, B>; +export interface ZodCodec<A extends core.SomeType = core.$ZodType, B extends core.SomeType = core.$ZodType> extends ZodPipe<A, B>, core.$ZodCodec<A, B> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + _zod: core.$ZodCodecInternals<A, B>; + def: core.$ZodCodecDef<A, B>; +} +declare const ZodCodec: core.$constructor<ZodCodec>; +declare function codec<const A extends core.SomeType, B extends core.SomeType = core.$ZodType>(in_: A, out: B, params: { + decode: (value: core.output<A>, payload: core.ParsePayload<core.output<A>>) => core.util.MaybeAsync<core.input<B>>; + encode: (value: core.input<B>, payload: core.ParsePayload<core.input<B>>) => core.util.MaybeAsync<core.output<A>>; +}): ZodCodec<A, B>; +interface ZodReadonly$1<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodReadonlyInternals<T>>, core.$ZodReadonly<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodReadonly$1: core.$constructor<ZodReadonly$1>; +declare function readonly<T extends core.SomeType>(innerType: T): ZodReadonly$1<T>; +export interface ZodTemplateLiteral<Template extends string = string> extends _ZodType<core.$ZodTemplateLiteralInternals<Template>>, core.$ZodTemplateLiteral<Template> { + "~standard": ZodStandardSchemaWithJSON$1<this>; +} +declare const ZodTemplateLiteral: core.$constructor<ZodTemplateLiteral>; +declare function templateLiteral<const Parts extends core.$ZodTemplateLiteralPart[]>(parts: Parts, params?: string | core.$ZodTemplateLiteralParams): ZodTemplateLiteral<core.$PartsToTemplateLiteral<Parts>>; +export interface ZodLazy<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodLazyInternals<T>>, core.$ZodLazy<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodLazy: core.$constructor<ZodLazy>; +declare function lazy<T extends core.SomeType>(getter: () => T): ZodLazy<T>; +interface ZodPromise$1<T extends core.SomeType = core.$ZodType> extends _ZodType<core.$ZodPromiseInternals<T>>, core.$ZodPromise<T> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + unwrap(): T; +} +declare const ZodPromise$1: core.$constructor<ZodPromise$1>; +declare function promise<T extends core.SomeType>(innerType: T): ZodPromise$1<T>; +export interface ZodFunction<Args extends core.$ZodFunctionIn = core.$ZodFunctionIn, Returns extends core.$ZodFunctionOut = core.$ZodFunctionOut> extends _ZodType<core.$ZodFunctionInternals<Args, Returns>>, core.$ZodFunction<Args, Returns> { + "~standard": ZodStandardSchemaWithJSON$1<this>; + _def: core.$ZodFunctionDef<Args, Returns>; + _input: core.$InferInnerFunctionType<Args, Returns>; + _output: core.$InferOuterFunctionType<Args, Returns>; + input<const Items extends util$1.TupleItems, const Rest extends core.$ZodFunctionOut = core.$ZodFunctionOut>(args: Items, rest?: Rest): ZodFunction<core.$ZodTuple<Items, Rest>, Returns>; + input<NewArgs extends core.$ZodFunctionIn>(args: NewArgs): ZodFunction<NewArgs, Returns>; + input(...args: any[]): ZodFunction<any, Returns>; + output<NewReturns extends core.$ZodType>(output: NewReturns): ZodFunction<Args, NewReturns>; +} +declare const ZodFunction: core.$constructor<ZodFunction>; +declare function _function(): ZodFunction; +declare function _function<const In extends ReadonlyArray<core.$ZodType>>(params: { + input: In; +}): ZodFunction<ZodTuple<In, null>, core.$ZodFunctionOut>; +declare function _function<const In extends ReadonlyArray<core.$ZodType>, const Out extends core.$ZodFunctionOut = core.$ZodFunctionOut>(params: { + input: In; + output: Out; +}): ZodFunction<ZodTuple<In, null>, Out>; +declare function _function<const In extends core.$ZodFunctionIn = core.$ZodFunctionIn>(params: { + input: In; +}): ZodFunction<In, core.$ZodFunctionOut>; +declare function _function<const Out extends core.$ZodFunctionOut = core.$ZodFunctionOut>(params: { + output: Out; +}): ZodFunction<core.$ZodFunctionIn, Out>; +declare function _function<In extends core.$ZodFunctionIn = core.$ZodFunctionIn, Out extends core.$ZodType = core.$ZodType>(params?: { + input: In; + output: Out; +}): ZodFunction<In, Out>; +export interface ZodCustom<O = unknown, I = unknown> extends _ZodType<core.$ZodCustomInternals<O, I>>, core.$ZodCustom<O, I> { + "~standard": ZodStandardSchemaWithJSON$1<this>; +} +declare const ZodCustom: core.$constructor<ZodCustom>; +declare function check<O = unknown>(fn: core.CheckFn<O>): core.$ZodCheck<O>; +declare function custom<O>(fn?: (data: unknown) => unknown, _params?: string | core.$ZodCustomParams | undefined): ZodCustom<O, O>; +declare function refine<T>(fn: (arg: NoInfer<T>) => util$1.MaybeAsync<unknown>, _params?: string | core.$ZodCustomParams): core.$ZodCheck<T>; +declare function superRefine<T>(fn: (arg: T, payload: core.$RefinementCtx<T>) => void | Promise<void>): core.$ZodCheck<T>; +declare const describe$1: typeof core.describe; +declare const meta$1: typeof core.meta; +export type ZodInstanceOfParams = core.Params<ZodCustom, core.$ZodIssueCustom, "type" | "check" | "checks" | "fn" | "abort" | "error" | "params" | "path">; +declare function _instanceof<T extends typeof util$1.Class>(cls: T, params?: ZodInstanceOfParams): ZodCustom<InstanceType<T>, InstanceType<T>>; +declare const stringbool: (_params?: string | core.$ZodStringBoolParams) => ZodCodec<ZodString, ZodBoolean>; +export type _ZodJSONSchema = ZodUnion$1<[ + ZodString, + ZodNumber, + ZodBoolean, + ZodNull, + ZodArray$1<ZodJSONSchema>, + ZodRecord<ZodString, ZodJSONSchema> +]>; +export type _ZodJSONSchemaInternals = _ZodJSONSchema["_zod"]; +export interface ZodJSONSchemaInternals extends _ZodJSONSchemaInternals { + output: util$1.JSONType; + input: util$1.JSONType; +} +export interface ZodJSONSchema extends _ZodJSONSchema { + _zod: ZodJSONSchemaInternals; +} +declare function json(params?: string | core.$ZodCustomParams): ZodJSONSchema; +declare function preprocess<A, U extends core.SomeType, B = unknown>(fn: (arg: B, ctx: core.$RefinementCtx) => A, schema: U): ZodPipe<ZodTransform<A, B>, U>; +declare const ZodIssueCode$1: { + readonly invalid_type: "invalid_type"; + readonly too_big: "too_big"; + readonly too_small: "too_small"; + readonly invalid_format: "invalid_format"; + readonly not_multiple_of: "not_multiple_of"; + readonly unrecognized_keys: "unrecognized_keys"; + readonly invalid_union: "invalid_union"; + readonly invalid_key: "invalid_key"; + readonly invalid_element: "invalid_element"; + readonly invalid_value: "invalid_value"; + readonly custom: "custom"; +}; +/** @deprecated Use `z.$ZodFlattenedError` */ +export type inferFlattenedErrors<T extends core.$ZodType, U = string> = core.$ZodFlattenedError<core.output<T>, U>; +/** @deprecated Use `z.$ZodFormattedError` */ +export type inferFormattedError<T extends core.$ZodType<any, any>, U = string> = core.$ZodFormattedError<core.output<T>, U>; +type BRAND$1<T extends string | number | symbol = string | number | symbol> = { + [core.$brand]: { + [k in T]: true; + }; +}; +declare function setErrorMap(map: core.$ZodErrorMap): void; +declare function getErrorMap(): core.$ZodErrorMap<core.$ZodIssue> | undefined; +/** Included for Zod 3 compatibility */ +export type ZodRawShape = core.$ZodShape; +declare enum ZodFirstPartyTypeKind$1 { +} +export type JSONSchemaVersion = "draft-2020-12" | "draft-7" | "draft-4" | "openapi-3.0"; +export interface FromJSONSchemaParams { + defaultTarget?: JSONSchemaVersion; + registry?: $ZodRegistry<any>; +} +declare function fromJSONSchema(schema: JSONSchema$1.JSONSchema | boolean, params?: FromJSONSchemaParams): ZodType$1; +export interface ZodISODateTime extends schemas$1.ZodStringFormat { + _zod: core.$ZodISODateTimeInternals; +} +declare const ZodISODateTime: core.$constructor<ZodISODateTime>; +declare function datetime$1(params?: string | core.$ZodISODateTimeParams): ZodISODateTime; +export interface ZodISODate extends schemas$1.ZodStringFormat { + _zod: core.$ZodISODateInternals; +} +declare const ZodISODate: core.$constructor<ZodISODate>; +declare function date$2(params?: string | core.$ZodISODateParams): ZodISODate; +export interface ZodISOTime extends schemas$1.ZodStringFormat { + _zod: core.$ZodISOTimeInternals; +} +declare const ZodISOTime: core.$constructor<ZodISOTime>; +declare function time$1(params?: string | core.$ZodISOTimeParams): ZodISOTime; +export interface ZodISODuration extends schemas$1.ZodStringFormat { + _zod: core.$ZodISODurationInternals; +} +declare const ZodISODuration: core.$constructor<ZodISODuration>; +declare function duration$1(params?: string | core.$ZodISODurationParams): ZodISODuration; +export interface ZodCoercedString<T = unknown> extends schemas$1._ZodString<core.$ZodStringInternals<T>> { +} +declare function string$2<T = unknown>(params?: string | core.$ZodStringParams): ZodCoercedString<T>; +export interface ZodCoercedNumber<T = unknown> extends schemas$1._ZodNumber<core.$ZodNumberInternals<T>> { +} +declare function number$2<T = unknown>(params?: string | core.$ZodNumberParams): ZodCoercedNumber<T>; +export interface ZodCoercedBoolean<T = unknown> extends schemas$1._ZodBoolean<core.$ZodBooleanInternals<T>> { +} +declare function boolean$2<T = unknown>(params?: string | core.$ZodBooleanParams): ZodCoercedBoolean<T>; +export interface ZodCoercedBigInt<T = unknown> extends schemas$1._ZodBigInt<core.$ZodBigIntInternals<T>> { +} +declare function bigint$2<T = unknown>(params?: string | core.$ZodBigIntParams): ZodCoercedBigInt<T>; +export interface ZodCoercedDate<T = unknown> extends schemas$1._ZodDate<core.$ZodDateInternals<T>> { +} +declare function date$3<T = unknown>(params?: string | core.$ZodDateParams): ZodCoercedDate<T>; +/** + * Severity levels surfaced to authors. Maps onto MCP's `LoggingMessageNotification` `level` + * field — we collapse `notice`/`critical`/`alert`/`emergency` from the protocol because + * scripted tools rarely need finer-grained severity than these four. + */ +export type TrailblazeLogLevel = "debug" | "info" | "warn" | "error"; +/** + * Author-facing logger handed to scripted tools as `ctx.logger`. Methods are fire-and-forget; + * a failure to deliver the structured notification never throws into the calling tool. + * + * The optional `fields` argument is serialized into the MCP notification's `data.fields` and + * appended to the stderr line as JSON — gives authors a path to structured logging when the + * host wires it up, without forcing a different API shape today. + * + * @example + * ctx.logger.info("cache hit", { path: cachePath }); + * ctx.logger.warn("session stale, invalidating", { reason }); + * ctx.logger.error("merchant lookup failed", { key: resolvedKey }); + */ +export interface TrailblazeLogger { + debug(message: string, fields?: Record<string, unknown>): void; + info(message: string, fields?: Record<string, unknown>): void; + warn(message: string, fields?: Record<string, unknown>): void; + error(message: string, fields?: Record<string, unknown>): void; +} +/** + * The scripted-tool memory primitive. Authors read/write through the 8 methods; the SDK + * tracks the diff against an immutable inbound snapshot and flushes the buffered changes + * as `memoryDelta` / `memoryDeletions` on the tool result envelope when the handler + * returns successfully. + * + * **Read-your-own-writes.** `get`/`has`/`keys` reflect changes made earlier in the same + * handler invocation. A `set("k", "v")` immediately followed by `get("k")` returns + * `"v"`, even though the value hasn't been flushed back to the host yet. + * + * **Transactional.** Writes are committed to the host only when the handler returns a + * non-error result. Both failure shapes — a thrown exception AND an explicit + * `isError: true` result envelope — leave the host's memory exactly as it was before + * the call. The host-side guard sits at the dispatch boundary + * (`SubprocessTrailblazeTool.execute`), so the symmetric rollback is enforced + * regardless of which failure mode the handler picks. + */ +export interface TrailblazeMemory { + /** Returns the string value for [key], or undefined if absent. */ + get(key: string): string | undefined; + /** Sets [key] to [value]. Overwrites any prior value. */ + set(key: string, value: string): void; + /** Returns true if [key] is set (including by a prior `.set()` in this invocation). */ + has(key: string): boolean; + /** Snapshot of every currently-visible key. Order is not guaranteed. */ + keys(): readonly string[]; + /** Removes [key]. No-op if absent. */ + delete(key: string): void; + /** + * Replaces `{{var}}` and `${var}` tokens in [template] with their current values. + * Mirrors the Kotlin `AgentMemory.interpolateVariables` semantics: single-pass per + * pattern, unknown tokens resolve to empty string, the resolved string is NOT + * re-scanned for tokens that interpolate. + */ + interpolate(template: string): string; + /** + * Convenience for storing a typed JSON value. Serializes with `JSON.stringify` and + * stores the resulting string under [key]. The type parameter [T] is editor-time only; + * the runtime accepts any value `JSON.stringify` accepts. + * + * **Non-serializable values route through [delete].** `JSON.stringify` returns the + * runtime `undefined` for top-level `undefined`, functions, and symbols — writing + * that into the string-only buffer would silently desync `has` / `get` / wire. For + * those values [setJson] calls [delete] instead, so the host sees an explicit + * deletion rather than a phantom write. `null` is distinct: `JSON.stringify(null)` + * is the string `"null"`, which is stored verbatim. + */ + setJson<T>(key: string, value: T): void; + /** + * Convenience for retrieving a typed JSON value. Reads the string at [key] and runs + * `JSON.parse` on it. Returns undefined when the key is absent OR when the string + * isn't valid JSON — gracefully degrading rather than throwing keeps tools that fall + * back to a default value (`getJson<UserInfo>("user") ?? defaultUser`) terse. + * + * The type parameter [T] is editor-time only; no runtime schema validation. + */ + getJson<T = unknown>(key: string): T | undefined; +} +export interface TrailblazeDevice { + /** + * Coarse platform; useful for branching in cross-platform tools. Lowercase by convention on + * the envelope wire (`"ios" | "android" | "web"`) — distinct from the uppercase + * `TRAILBLAZE_DEVICE_PLATFORM` env var and the uppercase `trailblaze/supportedPlatforms` + * filter values, which are separate contracts. + */ + platform: "ios" | "android" | "web"; + widthPixels: number; + heightPixels: number; + /** The session's driver (`TrailblazeDriverType.yamlKey` on the Kotlin side). */ + driverType: string; +} +/** + * The session's resolved target — the trailmap manifest's `target.platforms.<platform>` + * data after the framework has consulted the connected device for which candidate + * to actually use. + * + * Populated on both the in-process QuickJS scripting path (`:trailblaze-scripting-bundle`, + * via `QuickJsToolEnvelopes`) and the MCP-subprocess path (via `TrailblazeContextEnvelope`'s + * `target` block). Absent only when the host session has no target (web-only sessions, + * scratch tools, unit-test fixtures) or when the daemon predates the `target` field — + * optional-chain (`ctx.target?.resolveAppId(...)`) so the same scripted tool body works + * either way. + * + * `resolveAppId` and `resolveBaseUrl` are **methods**, not data — injected onto the + * deserialized ctx object by `QuickJsToolHost` after JSON deserialization (since + * methods can't survive JSON round-trips). They consult the target's data fields + * (`appId` / `appIds` / `resolvedBaseUrl` / `baseUrls`) and apply a fixed + * priority order — see each method's kdoc. + */ +export interface TrailblazeTarget { + /** Trailmap-defined target id (e.g. `"clock"`, `"wikipedia"`, `"square"`). */ + id: string; + /** Human-readable display name from the trailmap manifest's `target.display_name`. */ + displayName?: string; + /** + * All Android/iOS app id candidates declared in the manifest's + * `target.platforms.<android|ios>.app_ids:` for this session's platform. Order is + * preserved from the manifest so `appIds[0]` is the canonical "first declared". + * Empty array when the target's current-platform section has no `app_ids:`. + */ + appIds: string[]; + /** + * Framework-resolved app id — picked at session start by intersecting [appIds] + * against the set of apps actually installed on the connected device. Undefined + * when no candidate was installed at session start (or when [appIds] is empty). + * Most well-configured trailmaps running on a populated device will have this set + * and authors should usually consume via [resolveAppId]. + */ + appId?: string; + /** + * Future: all web base URL candidates declared in the manifest's + * `target.platforms.web.base_urls:` (mirrors `app_ids:` for android/ios). + * + * Currently empty / undefined — the manifest schema field hasn't landed yet. + * The method [resolveBaseUrl] is wired and will start picking up real values + * once the framework starts emitting this data. Authors writing web tools + * today can call `resolveBaseUrl({ defaultBaseUrl: "..." })` and rely on the + * caller-default for now; future framework upgrades will transparently take + * over without source changes. + */ + baseUrls?: string[]; + /** + * Future: framework-resolved base URL — picked at session start. See [baseUrls] + * for the rollout status. + */ + resolvedBaseUrl?: string; + /** + * Resolves the Android/iOS app id to use, applying the priority: + * + * 1. `this.appId` (framework-resolved) — what callers will hit ~always + * in well-configured trailmaps running on a device with one of the candidates + * installed. + * 2. `this.appIds[0]` (first declared candidate) — fallback when the framework + * couldn't resolve anyone (e.g. session started before any candidate was + * installed). Lets the launch attempt at least try the canonical id. + * 3. `options.defaultAppId` (caller-supplied) — final fallback for non-target- + * aware contexts or targets with empty `app_ids:`. + * + * Returns `undefined` if all three layers miss. Authors typically check the + * return value and throw a tool-specific error so the failure mode is visible + * in trail logs. + * + * @example + * const appId = ctx.target?.resolveAppId({ defaultAppId: "com.example.app" }); + * if (!appId) throw new Error("Could not resolve app id from ctx.target."); + */ + resolveAppId(options?: { + defaultAppId?: string; + }): string | undefined; + /** + * Resolves the web base URL to use, applying the same priority shape as + * [resolveAppId] but reading from `this.resolvedBaseUrl` and `this.baseUrls`. + * + * Note: until the framework wires `target.platforms.web.base_urls:` into the + * trailmap manifest schema, the data layers are empty and this method falls + * through to `options.defaultBaseUrl` every time. Authors writing web tools + * today can rely on the caller-default; future framework upgrades will + * transparently start populating from the manifest without source changes. + * + * @example + * const baseUrl = ctx.target?.resolveBaseUrl({ defaultBaseUrl: "https://en.wikipedia.org" }); + * if (!baseUrl) throw new Error("Could not resolve base URL from ctx.target."); + */ + resolveBaseUrl(options?: { + defaultBaseUrl?: string; + }): string | undefined; +} +export interface TrailblazeContext { + /** + * Daemon HTTP base URL (e.g. `http://localhost:52525`). `client.callTool()` dispatches to + * `${baseUrl}/scripting/callback` on the host-subprocess path. Absent on the on-device + * bundle path — there's no HTTP server in the Android instrumentation process, and the + * SDK switches to the in-process binding instead (see [runtime]). + */ + baseUrl?: string; + /** + * Execution runtime tag. Present as `"ondevice"` when the tool is running inside the + * Android QuickJS bundle runtime (`:trailblaze-scripting-bundle` on the Kotlin side); + * absent on the subprocess / daemon path (where [baseUrl] carries the dispatch target). + * + * The SDK reads this to decide how `client.callTool(…)` dispatches: `"ondevice"` → + * in-process binding via `globalThis.__trailblazeCallback`; otherwise → HTTP fetch + * against [baseUrl]. Authors should rarely need to branch on this directly — the + * transport choice is the SDK's responsibility. + */ + runtime?: "ondevice"; + /** Opaque session id — use for log correlation only, never for security. */ + sessionId: string; + /** + * Per-tool-call identifier. Forward this verbatim on any subsequent callback request so the + * daemon can resolve the callback back to this invocation's live tool repo + execution + * context. Regenerated per call; do not cache across calls. + */ + invocationId: string; + device: TrailblazeDevice; + /** + * Resolved-target descriptor. Populated whenever the host session has a target + * configured (the trailmap manifest's `target:` block resolved against the connected + * device's installed apps) — both the MCP-subprocess path and the in-process + * QuickJS scripting path emit it. Absent for sessions with no target (web-only + * scratch tools, unit-test fixtures) and for envelopes from older daemons that + * predate the field. + * + * Optional-chain (`ctx.target?.resolveAppId(...)`) — authors writing scripted + * tools that should also work outside a target-aware session need to handle + * the undefined case. See [TrailblazeTarget] for the shape and the resolver + * methods. + */ + target?: TrailblazeTarget; + /** + * Per-tool-call agent memory surface. Reads consult the host's snapshot captured at + * envelope build time, plus any writes made earlier in this handler invocation + * (read-your-own-writes). Writes are buffered locally and flushed back to the host on + * a successful tool return via `_meta.trailblaze.memoryDelta`; a handler that throws + * produces no delta and the host's memory is left unchanged. See [TrailblazeMemory] + * for the full surface and [memory.ts] for the wire-shape rationale. + */ + memory: TrailblazeMemory; + /** + * Author-facing logger. Always present on the surface so scripted tools can write + * `ctx.logger.info("...")` without null-checking — `fromMeta` defaults to a no-op logger + * for paths that don't have a live MCP server (on-device QuickJS, unit tests). The + * subprocess tool-invocation handler in `registerPendingTools` replaces this with a + * server-backed logger that emits MCP `notifications/message` (routed by the host into + * `Console` — see `McpSubprocessSession.connect`) and mirrors to stderr as a fallback. + */ + logger: TrailblazeLogger; +} +/** + * Extracts [TrailblazeContext] from an MCP `tools/call` request's `_meta` object. Returns + * undefined when the envelope isn't present or is structurally invalid — the tool handler + * should then branch (refuse to run, degrade, or log) rather than run against a silently + * fabricated default context. + * + * **Strictness rationale.** An earlier revision defaulted missing fields (platform → + * `"android"`, ids → `""`) so the handler always received a context. That silently masked + * envelope drift: an iOS tool author would see `"android"` on a corrupt envelope and branch + * wrong. Returning undefined surfaces the problem immediately and matches the "envelope + * missing" case — which is already a branch the caller must handle. + * + * The TS MCP SDK surfaces `_meta` as `request.params._meta`; pass that value in. + * + * The optional [logger] is attached as `ctx.logger`. Callers in a live tool-invocation + * handler should pass a server-backed logger (see `createLogger` in `./logger.js`); other + * callers (on-device QuickJS bridge, unit tests) can omit it and accept the no-op default. + */ +export declare function fromMeta(meta: unknown, logger?: TrailblazeLogger): TrailblazeContext | undefined; +/** + * Public author-facing result of a successful `callTool`. The author reads `textContent` and + * parses it however the target tool produces output. Named differently from the wire type + * ([CallToolResult]) so the wire's snake-case doesn't leak into the author's TS. + * + * `success` is redundant here — the client throws on any non-success response, so a value + * returned from `callTool(...)` is always `success: true`. Keeping the field exposed anyway so + * an author who reaches into the typed shape isn't surprised that it disappeared; costs nothing. + * + * `structuredContent` carries the tool's typed JSON return value when the producer populated + * one. Most authors never read this field directly — the public `client.tools.<name>(args)` + * proxy already unwraps it into the typed `result` declared in [TrailblazeToolMap]. It's + * exposed here for the rare consumer that drops down to the low-level `callTool` escape hatch + * (e.g. an SDK-internal site that needs both `textContent` and structured payload from the + * same response). + */ +export interface TrailblazeCallToolResult { + success: true; + textContent: string; + errorMessage: string; + structuredContent?: unknown; +} +/** + * Open type map of `tool name → { args; result }`. Empty by default; augmented by: + * + * - The vendored `built-in-tools.d.ts` shipped with this SDK (well-known framework tools + * like `tapOnElementWithText`, `inputText`). + * - Per-trailmap `.d.ts` files emitted by the framework's `WorkspaceClientDtsGenerator` + * (one entry per scripted tool declared in the trailmap's resolved target manifest). + * + * Augmentation pattern (declaration merging): + * + * ```ts + * declare module "@trailblaze/scripting" { + * interface TrailblazeToolMap { + * myScriptedTool: { args: { foo: string; bar?: number }; result: string }; + * } + * } + * ``` + * + * **`args` vs `result`.** `args` is the runtime-validated input shape (JSON-Schema-shaped + * properties — typed against the matchers the daemon dispatcher actually checks). + * `result` is the static-only typed return value — see the kdoc on + * [TrailblazeToolMethods] for the type lie this currently carries. + * + * A tool listed here lights up `client.tools.<name>(args)` with autocomplete on the name + * and type-checked args. Tools NOT listed are not reachable through the public client + * surface — the lower-level `callTool` dispatch primitive is hidden from the exported + * [TrailblazeClient] type so an author can't reintroduce an untyped escape hatch + * (`client.callTool("anything", {...})` no longer compiles). + * + * **Single authoring surface.** `client.tools.<name>(args)` is the only call style + * available to a `.ts` author. The runtime still dispatches everything through the + * internal `callTool` method that the `tools` Proxy delegates to, but the type isn't + * exposed publicly — every tool a trailmap can call must be declared in `TrailblazeToolMap`. + * + * **Multi-trailmap collision risk.** Within a single trailmap the codegen fails the build + * if two scripted tools share a name. Across trailmaps (a TS consumer that imports two trailmap + * roots' generated `.d.ts` files), TypeScript declaration merging will silently pick one + * shape for the colliding key — the static type passes, the runtime mismatches. Tool names + * MUST be globally unique across every trailmap a single consumer installs. There is no + * automated cross-trailmap enforcement today; conventions and code review carry the load until + * a multi-trailmap consumer demands one. + */ +export interface TrailblazeToolMap { +} +/** + * Per-entry shape of [TrailblazeToolMap]. Authoring tools (vendored or per-trailmap) write + * `{ args: <ArgsShape>; result: <ResultShape> }`; the `client.tools.<name>(args)` namespace + * derives method signatures from these entries. + * + * Use `result: void` for tools that meaningfully return nothing (e.g. `hideKeyboard`), + * `result: string` for tools whose result is a plain text payload (most current tools), + * or a structured interface for tools that return JSON-shaped data. + * + * **Why this is exported.** The type isn't usually named at user-augmentation sites + * (authors write the literal `{ args; result }` inline). It exists as a public hook for + * upcoming codegen consumers — the static analyzer pass that walks + * `trailblaze.tool<I, O>(handler)` declarations will assemble emitter output against + * this type so emitter and runtime stay in lockstep when the entry shape evolves. Hide + * with caution. + */ +export type TrailblazeToolEntry = { + args: unknown; + result: unknown; +}; +/** + * Method-style namespace derived from [TrailblazeToolMap]. Each augmented entry surfaces as + * a typed method — given + * `interface TrailblazeToolMap { inputText: { args: { text: string }; result: void } }`, + * the namespace exposes `inputText(args: { text: string }): Promise<void>`. + * + * This is the sole authoring surface a `.ts` tool file has to compose other Trailblaze + * tools: the IDE shows every available tool when you type `client.tools.`, hover gives + * JSDoc on both the name and the args, and a wrong-keyed/missing-field args object errors + * at compile time without any string-literal fiddling. + * + * **The `result` type matches the runtime value.** When the producer tool populates the + * wire's `structured_content` field (TS scripted tool whose handler returns a typed + * non-string value), the proxy unwraps that JSON value and returns it as `T[K]['result']`. + * When the producer doesn't (Kotlin tools that return text, legacy tools), the proxy + * returns `text_content` cast as `T[K]['result']` — correct when the declared `result` is + * `string` (the per-trailmap codegen default), and accepted-as-is when the declared `result` is + * `void` (the caller discards the return anyway). A producer that doesn't populate + * `structured_content` while the consumer's `TrailblazeToolMap` declares a non-string + * `result` is a static/runtime mismatch — surfaced as a typed string the consumer didn't + * expect, traceable to either a missing producer migration or a stale per-trailmap `.d.ts`. + * + * Tools not represented in the map (dynamically-registered, trailmaps without generated + * bindings) are unreachable from a typed `.ts` author — every tool a trailmap can call must be + * declared in `TrailblazeToolMap` via the SDK's vendored built-ins or per-trailmap codegen. + */ +export type TrailblazeToolMethods = { + [K in keyof TrailblazeToolMap]: K extends "web_evaluate" ? WebEvaluateMethod : (args: TrailblazeToolMap[K] extends { + args: infer A; + } ? A : never) => Promise<TrailblazeToolMap[K] extends { + result: infer R; + } ? R : never>; +}; +/** + * Function-overload shape for `client.tools.web_evaluate(...)`. Borrowed from Playwright + * Java's `Page.evaluate(pageFunction, args)` ergonomic — lets a Trailblaze trailmap author + * write a JS expression as a TypeScript arrow function (with type-checked args!) instead + * of hand-stringifying it into the `{ script: "..." }` wire shape the Kotlin tool actually + * consumes. + * + * Three call styles, all dispatch to the same `web_evaluate` Kotlin tool: + * + * 1. `web_evaluate(fn, ...args)` — the ergonomic shape. The Proxy calls + * `Function.prototype.toString()` on the arrow, JSON-serializes the args array, and + * emits `(<fnSrc>).apply(null, <argsJson>)` as the script payload. The function + * evaluates in the PAGE context (not the host runtime) with the deserialized args + * bound positionally. + * 2. `web_evaluate(script)` — bare string expression. Compatibility surface for authors + * who want full control over the script (e.g. multi-statement IIFE). + * 3. `web_evaluate({ script })` — the literal args-object shape that matches the Kotlin + * tool's wire contract directly. Useful when the script is computed dynamically and + * the caller already has it as a string field on a config object. + * + * **Closure caveat.** Functions cross the host→page boundary via `Function.prototype.toString()`, + * so closure variables from the calling scope DON'T survive serialization — pass them + * positionally via `...args` so they're JSON-encoded into the wire script. The function + * body must be self-contained (no Node-side imports, no references to outer-scope names). + * + * **Return type — type lie warning.** The function form preserves the inferred `TResult` + * at the typed surface, but the runtime always returns a string. Today's Kotlin + * `web_evaluate` populates `textContent` with the `toString()` of the JS result — + * primitives serialize as text (`"42"`, `"hi"`, `"true"`), objects collapse to + * `[object Object]`, arrays serialize as comma-joined elements. The Proxy returns that + * raw text verbatim; no JSON.parse heuristic is applied (a previous revision tried, but + * the heuristic corrupted legitimate string returns whose textual form happened to look + * like JSON literals — e.g. `"42"` would round-trip as the number `42`, breaking the + * declared string contract). Authors that need a typed value should `Number(...)` / + * `JSON.parse(...)` the result themselves, or wait for the structured-content path that + * populates `structured_content` from the Kotlin side. Until then, return shapes more + * complex than primitives need `JSON.stringify` on the page side and `JSON.parse` on + * the host. + */ +export type WebEvaluateMethod = { + <TArgs extends readonly unknown[], TResult>(fn: (...args: TArgs) => TResult | Promise<TResult>, ...args: TArgs): Promise<TResult>; + (script: string): Promise<string>; + (args: { + script: string; + }): Promise<string>; +}; +/** + * Internal client surface — includes the low-level `callTool(name, args)` dispatch + * primitive that the `tools` Proxy delegates to. File-local (no `export`) and not + * re-exported from `index.ts` so a downstream author can't name this interface and + * bypass the lockdown by typing a variable as `TrailblazeClientImpl`. The public + * [TrailblazeClient] type uses `Omit<..., "callTool">` against this interface in the + * same file; that's the only consumer that needs to see it. + */ +export interface TrailblazeClientImpl { + /** + * Dispatches Trailblaze tool [name] with [args] against the live Trailblaze session and + * returns the result. Internal — see [TrailblazeClient] for the public surface. + * + * **Typed args via [TrailblazeToolMap].** `name` is constrained to `keyof TrailblazeToolMap` + * (vendored built-ins + per-trailmap-generated entries); `args` must match the entry's `args` + * half (`TrailblazeToolMap[name]["args"]`). Wrong keys / missing required fields error at + * compile time. The return type stays `TrailblazeCallToolResult` here — `callTool` is the + * internal envelope-returning primitive that keeps `textContent` + `structuredContent` + * separate. The public [tools] namespace is where the typed `result` half is exposed — + * the Proxy unwraps the envelope internally (see [TrailblazeToolMethods] for the unwrap + * semantics). + * + * **Transports.** Picked automatically from the envelope — callers never branch on this: + * + * - **Host** (tool runs as a daemon-spawned subprocess): HTTP POST to + * `${ctx.baseUrl}/scripting/callback`. + * - **On-device** (tool runs inside the Android QuickJS bundle — `ctx.runtime === "ondevice"`): + * in-process `globalThis.__trailblazeCallback` binding. No HTTP server is involved. + * + * The request/response shape is identical across transports; only the framing differs. + * Error messages surface the transport source (HTTP URL or `__trailblazeCallback`) so you + * can tell at a glance which path failed. + * + * **Throws** on any non-success outcome: + * + * - **No envelope:** the outer tool invocation didn't carry `_meta.trailblaze`, so there's + * no session/invocation to attach the callback to. Typical cause: unit-testing the tool + * without a live Trailblaze session. Throw message includes a hint. + * - **No transport:** envelope present but neither `baseUrl` (HTTP) nor `runtime="ondevice"` + * + installed binding (in-process) is available. Rare — usually a host setup bug. + * - **HTTP non-2xx** (host only): protocol-level framing error (malformed request etc.). + * Throws with the daemon's body text for diagnosis. + * - **`JsScriptingCallbackResult.Error`:** invocation-unknown, session mismatch, version unsupported. + * Throws with the dispatcher's `message`. + * - **`JsScriptingCallbackResult.CallToolResult(success: false, ...)`:** tool ran but failed (tool + * threw, deserialization failed, dispatch timed out, reentrance cap hit). Throws with + * `errorMessage`. Authors who want to handle a tool's boolean "did it work" branching + * can wrap the call in `try/catch`; that's the one lowest-common-denominator surface + * that works identically for Python / QuickJS consumers later. + * + * **Shared state warning.** The dispatched inner tool runs against the same Trailblaze + * execution context as the outer tool — including the same AgentMemory, driver handle, and + * cached screen state. Authors MUST avoid read-then-write patterns across a tool-call + * boundary: + * + * ```ts + * // RACE — inner tool can mutate memory between the read and the write + * const prev = memory.get("x"); + * await client.tools.setFoo({...}); + * memory.put("x", updated(prev)); + * ``` + * + * The inner tool sees and can mutate any shared state (AgentMemory in particular is not + * concurrent-safe today). Serialize the access locally or avoid composed mutations when + * correctness matters. + */ + callTool<K extends keyof TrailblazeToolMap>(name: K, args: TrailblazeToolMap[K] extends { + args: infer A; + } ? A : never): Promise<TrailblazeCallToolResult>; + /** + * Method-style namespace — `client.tools.inputText({ text: "hi" })`. Each property is a + * typed method derived from a [TrailblazeToolMap] augmentation. `client.tools.<TAB>` in + * an IDE lists every known tool; mistype an arg key or miss a required field and `tsc` + * errors at compile time. See [TrailblazeToolMethods] for the type derivation. + * + * The runtime is a `Proxy` — any property access becomes a `callTool(propertyName, args)` + * dispatch. That means a tool not in the map (e.g. typed against an old SDK, or augmented + * by a bindings file the consumer hasn't pulled in yet) still dispatches at runtime; the + * static type just won't show it. + */ + tools: TrailblazeToolMethods; +} +/** + * Third handler argument on the imperative `trailblaze.tool(name, spec, handler)` signature + * (and reachable via `ctx.tools` on the typed `trailblaze.tool<I, O>(handler)` surface + * via [ToolContext]). Exposes the callback channel so tools can compose other Trailblaze + * tools. Always provided (never `undefined`) — when the envelope is missing, the client's + * preflight check still runs and throws a clear error instead of silently no-op'ing. + * + * **Surface narrowing.** `callTool` is hidden from the public type via `Omit` — `.ts` + * authors can only compose tools through `client.tools.<name>(args)`, which forces every + * call through a typed entry in [TrailblazeToolMap]. The runtime keeps `callTool` as the + * internal dispatch primitive the `tools` Proxy delegates to. + * + * **Type-only lockdown.** The narrowing is a compile-time guarantee, not a runtime one. + * At runtime, the object still carries `callTool` and the `tools` Proxy accepts any string + * property — `(client as unknown as Record<string, unknown>).callTool("anything", {...})` + * or `(client.tools as Record<string, unknown>)["anything"]` still dispatch. The lockdown + * exists to catch honest mistakes at `tsc` time, not to prevent a determined caller from + * bypassing it. Authorization / tool-availability boundaries live at the daemon (allowlist, + * selector validation, envelope checks), not at the SDK type layer. + */ +export type TrailblazeClient = Omit<TrailblazeClientImpl, "callTool">; +/** + * Spec for a Trailblaze-authored tool authored via the **imperative** + * `trailblaze.tool(name, spec, handler)` overload — a shallow wrapper over the raw + * MCP SDK's `registerTool` spec shape. Carries `description` / `inputSchema` / + * `outputSchema` / raw `_meta` because the imperative path doesn't have access to + * `<I, O>` generics or TSDoc, so every piece of registration metadata is authored + * by hand. + * + * **For the typed declarative overload — `trailblaze.tool<I, O>(spec, handler)` — + * use [TrailblazeTypedToolSpec] instead.** The typed spec carries structured + * registration-gate fields (`supportedPlatforms`, `requiresContext`, + * `requiresHost`, `supportedDrivers`) but **no `description`** — descriptions + * for typed tools live in the TSDoc above the `export const`, where the analyzer + * reads them. + * + * The surface is intentionally narrow. Fields that aren't wired here can be added as authors + * ask for them — nothing about `registerPendingTools` prevents forwarding additional keys. + */ +export interface TrailblazeToolSpec { + /** Human-readable description surfaced to the LLM. */ + description?: string; + /** + * MCP input schema — a zod raw shape (`{ text: z.string() }`), a zod schema instance + * (`z.object({...})`), or an empty raw shape (`{}`) for no-args tools. + * + * Typed against the MCP SDK's own [ZodRawShapeCompat] / [AnySchema] union — the same + * surface `server.registerTool` accepts. The Trailblaze wrapper in + * [withPassthroughInputSchema] narrows raw shapes to `z.object(shape).passthrough()` + * before handing off, so unknown keys from the wire survive validation. + */ + inputSchema?: ZodRawShapeCompat | AnySchema; + /** + * Output schema, if your tool returns structured data. Same surface rules as + * [inputSchema] — zod raw shape, zod schema instance, or undefined. + */ + outputSchema?: ZodRawShapeCompat | AnySchema; + /** + * `_meta` for the tool advertisement — this is where `_meta["trailblaze/*"]` keys go (e.g. + * `"trailblaze/supportedDrivers": ["android-ondevice-accessibility"]`). The conventions + * devlog (`2026-04-20-scripted-tools-mcp-conventions.md § 1`) is canonical. + */ + _meta?: Record<string, unknown>; +} +/** + * Author-facing handler signature. + * + * - [args] — tool arguments as the LLM / caller sent them. + * - [ctx] — Trailblaze envelope extracted from `_meta.trailblaze`. Present on every in-session + * invocation; undefined when the tool was invoked outside a Trailblaze session (ad-hoc MCP + * client, unit test). + * - [client] — always provided, even when [ctx] is undefined. Exposes the typed + * `client.tools.<name>(args)` namespace for composing other Trailblaze tools via the + * daemon's `/scripting/callback` endpoint. When [ctx] is undefined the client throws on + * any tool dispatch with a clear preflight error — handlers that never call back simply + * ignore the argument. + * + * **Backwards compatibility.** Pre-existing 2-arg handlers (`async (args) => ...` or + * `async (args, ctx) => ...`) remain compatible — TypeScript accepts them when assigned to this + * 3-arg signature because structural typing tolerates handlers that ignore trailing parameters. + * Extra parameters are only consumed when the handler explicitly declares them, so tool files + * written against older SDK versions keep compiling without changes. + * + * The return value matches the raw MCP SDK's tool-result shape; nothing special to learn. + */ +export type TrailblazeToolHandler = (args: Record<string, unknown>, ctx: TrailblazeContext | undefined, client: TrailblazeClient) => Promise<TrailblazeToolResult> | TrailblazeToolResult; +/** + * MCP tool result — mirrors `@modelcontextprotocol/sdk`'s public shape but re-declared here so + * the SDK doesn't impose its import graph on every tool file. Authors can return literal + * objects matching this shape or re-import from the MCP SDK for typed variants they want. + */ +export interface TrailblazeToolResult { + content: Array<{ + type: "text"; + text: string; + } | Record<string, unknown>>; + isError?: boolean; + structuredContent?: unknown; +} +/** + * Minimal handler context for the typed `trailblaze.tool<I, O>(handler)` authoring + * surface. Exposes the cross-tool primitives a typed handler can reach today: + * [tools], [memory], and [target]. + * + * Deliberately narrower than [TrailblazeClient] / [TrailblazeContext]. Per-need fields + * (device, logger) can still be added later when a concrete typed-authored tool needs + * them; the goal is to grow the surface in lockstep with real demand rather than + * blanket-mirroring every field a Kotlin handler sees. + * + * ## Inclusion policy + * + * The bar for adding a field here is intentionally higher than "it's on `TrailblazeContext`." + * A field gets added when (a) **multiple** typed tools in the repo have demonstrated demand + * (one-off needs are usually a sign the tool wants the imperative `tool(name, spec, handler)` + * form, not a permanent SDK expansion), and (b) the field's lifecycle matches the existing + * set — injected per-call by `defineTypedTool`, originated from the host envelope. + * + * Concrete deliberate exclusion: **`device`** (platform / driver / screen dimensions). It's + * on `TrailblazeContext` and the next obvious extension, but no typed tool in the repo today + * needs it (the few that branch on platform do so via the spec's `supportedPlatforms` gate + * instead). Open a PR-level discussion before adding it so the bar above is satisfied. + * + * **Memory on the bundle path.** When a typed tool runs in the on-device QuickJS bundle + * runtime, the host ctx envelope doesn't yet carry a memory snapshot — `ctx.memory` + * on that path is a no-op surface whose writes never flush back to the host. Subprocess + * sessions get a fully-wired memory; bundle-path support lands in a follow-up. + * + * **Target on the bundle path.** Same caveat: `ctx.target` is populated whenever the + * host envelope carries a resolved-target descriptor (both subprocess and on-device + * paths emit it via their respective envelope builders), but it can still be + * `undefined` for sessions with no target (web-only scratch tools, unit-test + * fixtures). Typed handlers should optional-chain (`ctx.target?.resolveAppId()`) + * when the surrounding tool ought to work outside a target-aware session. + */ +export interface ToolContext { + /** Compose other Trailblaze tools through the typed `tools.<name>(args)` namespace. */ + tools: TrailblazeToolMethods; + /** + * Per-invocation memory surface mirroring [TrailblazeContext.memory]. Reads see the + * host snapshot + this invocation's writes (read-your-own-writes); writes are flushed + * back to the host on a successful return via the result envelope's + * `_meta.trailblaze.memoryDelta`. + */ + memory: TrailblazeMemory; + /** + * Resolved-target descriptor — the trailmap manifest's `target.platforms.<platform>` + * data after the framework has consulted the connected device for which app id to + * actually use. Provides [TrailblazeTarget.resolveAppId] (Android/iOS) and + * [TrailblazeTarget.resolveBaseUrl] (web) for tools that need to compose + * platform-specific package / URL references without hard-coding them. + * + * `undefined` when the session has no target configured (web-only scratch tools, + * unit-test fixtures, envelopes from older daemons that predate the field). + * Optional-chain when the tool should still degrade gracefully — typed handlers + * that strictly require a target should throw a clear "no target" error on the + * undefined branch rather than silently no-op. + */ + target?: TrailblazeTarget; +} +/** + * Structured-config spec for the typed `trailblaze.tool<I, O>(spec, handler)` overload. + * + * Carries the namespaced framework hints that, in the YAML-descriptor world, were authored + * under `_meta: { trailblaze/... }`. With the typed authoring surface, authors set them + * directly as typed object fields and the build-time analyzer + * (`ScriptedToolDefinitionAnalyzer`) extracts them from each `trailblaze.tool(...)` call + * site — the runtime `_meta` JSON is synthesized downstream, never hand-authored. + * + * **No `description` field.** Tool descriptions live in the TSDoc block above each + * `export const X = trailblaze.tool(...)` binding. The analyzer reads it via the + * TypeScript compiler's `getJSDocCommentsAndTags()`. Forcing prose into TSDoc keeps the + * IDE-hover text and the LLM-facing description as the same single source of truth and + * eliminates the dual-source-of-truth question by construction — the compiler refuses to + * accept a `description` field here, so there's no place else to put prose. + * + * Every field is optional; omitted means "use the framework default" (`false` for + * booleans, empty list for the platform/driver gates which the runtime treats as + * "unrestricted"). + * + * ## Field roles — "registration gate" vs. "metadata hint" + * + * Fields on this spec fall into two categories. The categorization matters when + * adding a new field — picking the wrong path means the runtime either silently + * ignores the value or routes it through the wrong layer: + * + * - **Registration gates** decide whether the tool is even registered for a + * given session. The runtime consults these BEFORE the tool reaches the + * LLM's tool list — a tool that fails its gate is invisible. Examples: + * [supportedPlatforms], [requiresHost], [supportedDrivers]. The on-device + * dispatch path reads `requiresHost` *before* `_meta` is loaded, so it's + * additionally promoted to the typed `InlineScriptToolConfig.requiresHost` + * slot at enrichment time. + * - **Metadata hints** are informational — they flow into the runtime `_meta` + * JSON and are surfaced in tool catalogs, agent warnings, and downstream + * consumers, but they do NOT gate registration. Example: [requiresContext]. + * The runtime registers the tool either way; the hint just helps explain + * *why* the tool needs a live session. + * + * Adding a new field: decide which bucket it belongs in first. Gates need + * coverage in `TrailblazeToolMeta.shouldRegister` and (when the gate is read + * before `_meta`) a typed `InlineScriptToolConfig` slot. Hints just need the + * namespaced `_meta` projection in `AnalyzerScriptedToolEnrichment`. + * + * @see TrailblazeToolSpec for the imperative `tool(name, spec, handler)` form's spec — + * distinct shape because the imperative path doesn't have access to TSDoc or `<I, O>` + * generics, so it carries `description` / `inputSchema` / `outputSchema` / raw `_meta` + * directly. + */ +export interface TrailblazeTypedToolSpec { + /** + * Platforms this tool may register on. Empty / omitted = all platforms. Lowercase + * platform names — the runtime (`TrailblazeToolMeta.fromJsonObject`) normalizes to + * uppercase before comparison against `TrailblazeDevicePlatform.name`. + */ + supportedPlatforms?: ReadonlyArray<"web" | "android" | "ios" | "desktop">; + /** + * UX hint: this tool depends on a live driver context (a running target/session). The + * agent surfaces this in tool catalogs and warnings. **Not a registration filter** — + * the runtime registers the tool either way; the field is purely informational. See + * `TrailblazeToolMeta.shouldRegister` for the filter set (drivers, platforms, host). + */ + requiresContext?: boolean; + /** + * Host-only — skip registration on-device. Use for tools that need Node/Bun APIs + * (`node:fs`, `node:child_process`, file locks) or otherwise can't run inside the + * on-device QuickJS bundle. The on-device launcher passes `preferHostAgent=false` so a + * `requiresHost: true` tool skips at registration without any extra branching. + */ + requiresHost?: boolean; + /** + * Drivers this tool may register on. Empty / omitted = all drivers. Driver identifiers + * as the runtime emits them — e.g. `"playwright-native"`, `"playwright-electron"`, + * `"android-ondevice-accessibility"`. Finer-grained than [supportedPlatforms]; use this + * when a tool depends on driver-specific capabilities that other drivers on the same + * platform don't have. + */ + supportedDrivers?: readonly string[]; + /** + * Optional JSON Schema for the typed tool's input. When present, the runtime adapter + * compiles it via ajv and validates the incoming `args` BEFORE invoking the handler; + * a validation failure short-circuits dispatch by throwing a + * `TypedToolValidationError` (`name = "ValidationError"`). The synthesized + * host-side wrapper (`DaemonScriptedToolBundler.synthesizeWrapper` → + * `QuickJsToolHost.callTool`) catches the throw and maps it onto the same + * `isError: true` envelope shape any handler-thrown error rides through — so a + * session-log reader sees one consistent error format regardless of failure + * mode. (Direct callers of the returned `TypedToolDefinition` see the throw + * unwrapped, useful for unit tests that pin the validation behavior — see the + * tests in `tool.test.ts` that `await expect(...).rejects.toMatchObject(...)`.) + * The envelope text content names the offending fields, so the LLM can + * self-correct without crashing inside the handler. + * + * **Source of truth.** The canonical input type for a typed tool is the `<TInput>` + * generic on the call (`trailblaze.tool<MyInput>(...)`), extracted at build time by + * `ScriptedToolDefinitionAnalyzer`. The analyzer-derived schema is what populates + * the runtime tool descriptor + MCP `_meta` advertisement, and it is what the LLM + * sees. Setting `inputSchema:` here is an opt-in escape hatch for authors who want + * the same schema reachable at the JS dispatch boundary — useful for catching the + * "LLM sent malformed args" failure mode in environments where the static-analysis + * pipeline hasn't injected the schema yet, OR for authors who want a narrower + * runtime contract than the TS interface expresses. + * + * **Shape.** A JSON Schema object — e.g. `{ type: "object", properties: { q: { type: + * "string" } }, required: ["q"] }`. Plain literal, not a zod schema; the typed + * authoring surface intentionally does not depend on zod at the dispatch boundary + * (zod's value lives in interface authoring, which the analyzer reads statically). + * + * **When to omit.** Bare-handler `trailblaze.tool<I, O>(handler)` form. No spec, no + * runtime validation — relies on the analyzer + MCP advertisement to keep the LLM + * honest. + * + * **NOT a SISTER-IMPL-TAG field.** Every other field on this spec + * (`supportedPlatforms`, `requiresContext`, `requiresHost`, `supportedDrivers`) + * is extracted by the analyzer's `RECOGNIZED_SPEC_FIELDS` set and projected + * into namespaced `_meta` keys by the Kotlin side's `projectAnalyzerSpec`. This + * field is deliberately the exception: the analyzer's job is to extract the + * `<TInput>` interface into a JSON Schema for MCP advertisement, so flowing + * `inputSchema:` *also* through the analyzer would either duplicate the + * `<TInput>` schema (if both are present) or override it (if the author + * intentionally narrowed). Today the field is consumed at the TS dispatch + * boundary directly; the analyzer ignores it intentionally. If a future change + * wants to surface this field in `_meta`, decide the precedence-vs-interface + * rule first, then update `RECOGNIZED_SPEC_FIELDS` and `projectAnalyzerSpec` in + * lockstep — see the SISTER-IMPL-TAG comment in + * `sdks/typescript/tools/extract-tool-defs.mjs:RECOGNIZED_SPEC_FIELDS`. + * + * **Long-term plan.** Once the analyzer-injected sidecar lands (its schema + * flows to the JS runtime via the synthesized QuickJS wrapper), this field + * becomes redundant for typical tools — authors will get validation from the + * `<TInput>` interface alone. The field will stick around as the narrower- + * runtime-contract escape hatch but stops being the recommended way to wire + * runtime validation. + */ + inputSchema?: Record<string, unknown>; +} +/** + * Public marker for "this tool takes no input." TypeScript generic defaults are + * positional, so an author who wants a typed result with NO input can't skip the + * first type argument; they have to spell it. `EmptyInput` is the readable form of + * that ceremony: + * + * trailblaze.tool(async () => "ok") // 0 args + * trailblaze.tool<MyInput>(async (i, ctx) => "ok") // typed input + string + * trailblaze.tool<EmptyInput, MyResult>(async (_, ctx) => ({...})) // typed result + no input + * trailblaze.tool<MyInput, MyResult>(async (i, ctx) => ({...})) // fully typed + * + * Declared as an `interface` (not `type = Record<string, never>`) so the analyzer's + * `ts-json-schema-generator` walks it as a named object type and emits the expected + * `{"type":"object", "additionalProperties": false}` schema. Authoring-time, it's + * structurally equivalent to `Record<string, never>` for the no-properties case; the + * runtime handler receives an empty object on every call. + */ +export interface EmptyInput { +} +/** + * Carrier returned by the typed authoring surface. Today it's a 3-arg adapter shaped + * `(args, ctx, client) => Promise<TResult>` — the same call shape the existing scripted-tool + * wrapper synthesizer (`DaemonScriptedToolBundler.synthesizeWrapper`) invokes against every + * registered tool. The adapter unpacks `client.tools` into the typed [ToolContext] before + * forwarding to the author's `(input, ctx)` handler, so a `.ts` author can write the typed + * shape WITHOUT the runtime dispatcher having to learn about the alternative arity. + * + * The `<I, O>` type parameters remain the load-bearing part of the contract for codegen + * — `ScriptedToolDefinitionAnalyzer` walks each `trailblaze.tool<I, O>(handler)` call site + * via the TypeScript AST to derive [TrailblazeToolMap] entries. The runtime shape chosen + * here is decoupled from extraction; this 3-arg adapter just ensures the synthesized + * wrapper's `__userHandler(args, ctx, __client)` call site reaches the author's typed + * handler with the right arguments. If a future change wants a richer descriptor returned + * here (e.g. carrying metadata that the analyzer can't recover from the AST alone), update + * both sides in lockstep. + */ +export type TypedToolDefinition<TInput = Record<string, never>, TResult = string> = (args: TInput, ctx: TrailblazeContext | undefined, client: TrailblazeClient) => Promise<TResult>; +/** + * Declare a Trailblaze tool. + * + * Three call styles share this name: + * + * - **Imperative (MCP-registered).** `tool(name, spec, handler): void` — buffers a + * registration until [run] connects the MCP server. Returns `void`. Used by tools + * that go through the host-subprocess path (MCP-over-stdio transport). The `spec` + * here is the legacy MCP-registration shape [TrailblazeToolSpec] (description, + * inputSchema, outputSchema, raw `_meta`). + * - **Typed declarative — bare handler.** `tool<I, O>(handler)` — returns the + * handler as a [TypedToolDefinition], carrying `<I, O>` type information that + * the analyzer extracts into JSON-Schema and [TrailblazeToolMap] entries. Both + * type parameters have defaults so authors pick the lightest shape that fits: + * + * trailblaze.tool(async (_, ctx) => "done") // <{}, string> + * trailblaze.tool<MyInput>(async (i, ctx) => `hi ${i.name}`) // <MyInput, string> + * trailblaze.tool<MyInput, MyOutput>(async (i, ctx) => ({ ... })) // fully typed + * + * - **Typed declarative — with spec.** `tool<I, O>(spec, handler)` — same as the + * bare-handler form, but the first positional arg is a [TrailblazeTypedToolSpec] + * carrying structured config (`supportedPlatforms`, `requiresContext`, + * `requiresHost`, `supportedDrivers`). The spec is captured by the build-time + * analyzer for synthesizing `_meta` on the MCP tool advertisement; at runtime it's + * discarded (the spec is a compile-time signal, not a runtime value). Use this + * overload when a tool needs gating or driver/platform restriction; reach for the + * bare-handler form when no metadata is needed. + * + * trailblaze.tool<I, O>( + * { supportedPlatforms: ["web"], requiresContext: true }, + * async (input, ctx) => { ... }, + * ) + * + * Tool descriptions live in TSDoc on the `export const X = trailblaze.tool(...)` + * binding — there is intentionally no `description` field on [TrailblazeTypedToolSpec]. + * The analyzer reads the binding's TSDoc and the input/output interface field TSDoc to + * synthesize the runtime tool description and per-property `description` keys. + * + * Dispatch is by first-arg type: + * - function → typed bare-handler + * - plain object + function second-arg → typed with-spec + * - string → imperative + * - anything else → falls through to imperative push (registration-side error) + */ +export declare function tool<TInput = Record<string, never>, TResult = string>(handler: (input: TInput, ctx: ToolContext) => Promise<TResult>): TypedToolDefinition<TInput, TResult>; +export declare function tool<TInput = Record<string, never>, TResult = string>(spec: TrailblazeTypedToolSpec, handler: (input: TInput, ctx: ToolContext) => Promise<TResult>): TypedToolDefinition<TInput, TResult>; +export declare function tool(name: string, spec: TrailblazeToolSpec, handler: TrailblazeToolHandler): void; +/** + * Matches against [DriverNodeDetail.AndroidAccessibility] nodes. + * + * Only properties from [DriverNodeDetail.AndroidAccessibility.MATCHABLE_PROPERTIES] + * should be set here. All fields are optional — only non-null fields act as predicates. + * String fields support regex patterns. + */ +export interface DriverNodeMatchAndroidAccessibility { + classNameRegex?: string | null; + resourceIdRegex?: string | null; + uniqueId?: string | null; + composeTestTagRegex?: string | null; + textRegex?: string | null; + contentDescriptionRegex?: string | null; + hintTextRegex?: string | null; + labeledByTextRegex?: string | null; + stateDescriptionRegex?: string | null; + paneTitleRegex?: string | null; + roleDescriptionRegex?: string | null; + isEnabled?: boolean | null; + isClickable?: boolean | null; + isCheckable?: boolean | null; + isChecked?: boolean | null; + isSelected?: boolean | null; + isFocused?: boolean | null; + isEditable?: boolean | null; + isScrollable?: boolean | null; + isPassword?: boolean | null; + isHeading?: boolean | null; + isMultiLine?: boolean | null; + inputType?: number | null; + collectionItemRowIndex?: number | null; + collectionItemColumnIndex?: number | null; +} +/** + * Matches against [DriverNodeDetail.AndroidMaestro] nodes. + * + * This mirrors [TrailblazeElementSelector]'s matching capabilities but operates + * on [TrailblazeNode] trees rather than [ViewHierarchyTreeNode]. + */ +export interface DriverNodeMatchAndroidMaestro { + textRegex?: string | null; + resourceIdRegex?: string | null; + accessibilityTextRegex?: string | null; + classNameRegex?: string | null; + hintTextRegex?: string | null; + clickable?: boolean | null; + enabled?: boolean | null; + focused?: boolean | null; + checked?: boolean | null; + selected?: boolean | null; +} +/** + * Matches against [DriverNodeDetail.Web] nodes. + */ +export interface DriverNodeMatchWeb { + ariaRole?: string | null; + ariaNameRegex?: string | null; + ariaDescriptorRegex?: string | null; + headingLevel?: number | null; + cssSelector?: string | null; + dataTestId?: string | null; + nthIndex?: number | null; +} +/** + * Matches against [DriverNodeDetail.Compose] nodes. + */ +export interface DriverNodeMatchCompose { + testTag?: string | null; + role?: string | null; + textRegex?: string | null; + editableTextRegex?: string | null; + contentDescriptionRegex?: string | null; + toggleableState?: string | null; + isEnabled?: boolean | null; + isFocused?: boolean | null; + isSelected?: boolean | null; + isPassword?: boolean | null; +} +/** + * Matches against [DriverNodeDetail.IosMaestro] nodes. + * Only includes properties that iOS natively provides. Excludes clickable, enabled, + * and checked which Maestro infers/defaults rather than reading from UIKit. + */ +export interface DriverNodeMatchIosMaestro { + textRegex?: string | null; + resourceIdRegex?: string | null; + accessibilityTextRegex?: string | null; + classNameRegex?: string | null; + hintTextRegex?: string | null; + focused?: boolean | null; + selected?: boolean | null; +} +/** + * Matches against [DriverNodeDetail.IosAxe] nodes using Apple-native AX vocabulary + * — `role` (AXButton/AXStaticText/…), `subrole`, `customActions`, etc. — rather than + * the Maestro-inferred shape in [IosMaestro]. + * + * String fields support regex patterns (with literal case-insensitive fallback when + * the pattern is not valid regex, so selectors like `$0.00` still work). `uniqueId` + * is exact-match because app-assigned accessibility identifiers are identity, not text. + * + * Only properties in [DriverNodeDetail.IosAxe.MATCHABLE_PROPERTIES] are exposed here. + */ +export interface DriverNodeMatchIosAxe { + /** **Matchable.** Apple AX role (e.g. `AXButton`, `AXStaticText`, `AXApplication`). */ + roleRegex?: string | null; + /** **Matchable.** Apple AX subrole (e.g. `AXSecureTextField`). Often null. */ + subroleRegex?: string | null; + /** **Matchable.** AXLabel — primary accessibility label. */ + labelRegex?: string | null; + /** **Matchable.** AXValue — current value/state string. */ + valueRegex?: string | null; + /** **Matchable.** Exact match on `accessibilityIdentifier` set by the app. */ + uniqueId?: string | null; + /** **Matchable.** Short element type (e.g. `Button`, `StaticText`). */ + typeRegex?: string | null; + /** **Matchable.** AXTitle — section/window title. */ + titleRegex?: string | null; + /** **Matchable.** The node's `custom_actions` list must contain this string. */ + customAction?: string | null; + /** **Matchable.** Whether the element is enabled (from `AXEnabled`). */ + enabled?: boolean | null; +} +/** + * Rich element selector for [TrailblazeNode] trees. + * + * This is the successor to [TrailblazeElementSelector] for non-Maestro drivers. + * Where [TrailblazeElementSelector] can only match on the limited properties that + * Maestro's Orchestra supports (text, id, enabled, selected, checked, focused), + * this selector can match on the full surface of each driver's native properties. + * + * ## Structure + * - **[driverMatch]**: Driver-specific property matching (className, inputType, etc.) + * - **Spatial relationships**: [above], [below], [leftOf], [rightOf] + * - **Hierarchy**: [childOf], [containsChild], [containsDescendants] + * - **Positioning**: [index] (last resort, applied after spatial sort) + * + * ## Recording flow + * 1. User taps on screen → coordinates identify the target [TrailblazeNode] + * 2. Selector generator examines the target and its context in the tree + * 3. Generator produces a [TrailblazeNodeSelector] using driver-specific properties + * 4. Selector is stored in the recording alongside fallback coordinates + * + * ## Playback flow + * 1. Resolver matches the [TrailblazeNodeSelector] against the live [TrailblazeNode] tree + * 2. If exactly one match → tap its center + * 3. If no match → fall back to recorded coordinates + * + * ## Compatibility + * [TrailblazeElementSelector] remains unchanged for Maestro-based paths. + * This selector is used only by drivers that produce [TrailblazeNode] trees. + * + * @see TrailblazeElementSelector for the legacy Maestro-compatible selector + */ +export interface TrailblazeNodeSelector { + /** + * Android Accessibility driver matcher. Set this when matching against + * [DriverNodeDetail.AndroidAccessibility] nodes. + */ + androidAccessibility?: DriverNodeMatchAndroidAccessibility | null; + /** Android Maestro driver matcher. */ + androidMaestro?: DriverNodeMatchAndroidMaestro | null; + /** Web (Playwright) driver matcher. */ + web?: DriverNodeMatchWeb | null; + /** Compose driver matcher. */ + compose?: DriverNodeMatchCompose | null; + /** iOS Maestro accessibility hierarchy matcher. */ + iosMaestro?: DriverNodeMatchIosMaestro | null; + /** iOS AXe (Apple Accessibility API) matcher — used when the tree is [DriverNodeDetail.IosAxe]. */ + iosAxe?: DriverNodeMatchIosAxe | null; + /** Target must be below (lower Y) an element matching this selector. */ + below?: TrailblazeNodeSelector | null; + /** Target must be above (higher Y) an element matching this selector. */ + above?: TrailblazeNodeSelector | null; + /** Target must be left of an element matching this selector. */ + leftOf?: TrailblazeNodeSelector | null; + /** Target must be right of an element matching this selector. */ + rightOf?: TrailblazeNodeSelector | null; + /** Target must be a descendant of an element matching this selector. */ + childOf?: TrailblazeNodeSelector | null; + /** Target must have a direct child matching this selector. */ + containsChild?: TrailblazeNodeSelector | null; + /** Target must have descendants matching ALL of these selectors. */ + containsDescendants?: TrailblazeNodeSelector[] | null; + /** + * 0-based index among all matches, sorted top-to-bottom then left-to-right. + * Applied after all other predicates. Last resort for disambiguation. + */ + index?: number | null; +} +/** Screen-coordinate bounding rectangle. */ +export interface Bounds { + left: number; + top: number; + right: number; + bottom: number; +} +/** + * Lightweight identity + position record describing one match returned by the + * `findMatches` tool. + * + * Designed for scripted-tool authors who want to ask "is this element visible?", + * "is the selector unambiguous?", and "where is the match on screen?" without + * pulling the entire view subtree across the wire. The descriptor intentionally + * omits any reference to the matched node's children — carrying the subtree + * would defeat the snapshot-caching ROI, and opaque node handles would leak + * driver implementation details into the typed authoring surface. + * + * ## Bounds reuse + * + * Reuses [TrailblazeNode.Bounds] (`left` / `top` / `right` / `bottom` with + * computed `width` / `height` / `centerX` / `centerY`) rather than introducing + * a separate `Rect` type — every selector resolution path already speaks this + * shape, and the resolver hands back `TrailblazeNode` instances whose `bounds` + * field is the same type. + * + * ## Cross-driver field semantics + * + * - [matchedText] is the matched node's best-available text — per-driver + * `resolveText()` for Android/iOS/Compose, `ariaName` for Web. Null when the + * driver detail carried no text-shaped property. + * - [accessibilityId] is the accessibility-label / content-description / aria- + * descriptor on the matched node, when the driver exposes one. + * - [resourceId] is the Android `resourceId` (or its iOS / Compose / Web + * analogue: `accessibilityIdentifier`, Compose `testTag`, web `data-testid`) + * when the driver exposes one. + * + * Drivers that don't expose a given property leave the corresponding field + * null — scripted authors should not assume any field is populated. + */ +export interface MatchDescriptor { + /** + * Child-index path from the hierarchy root to this match. + * + * `[]` is the root, `[0, 2, 1, 4]` means "child 0 of root → child 2 → child 1 + * → child 4." Lets a caller re-identify a specific match against **the same + * captured tree** without re-running the selector. + * + * ## Lifetime — frame-scoped, not durable + * + * The path is positional, so it is only stable for the lifetime of one + * captured view-hierarchy snapshot. Any change to the tree shape between + * capture and use — siblings added or removed, a RecyclerView item recycled, + * a parent node re-mounting after a state change — invalidates the path: + * the same physical pixels are now reached by a different index sequence. + * + * Treat descriptors as "immediate hand-offs to act on in this tool body" + * rather than long-lived references. Re-querying via [findMatches] is the + * right pattern after any device-mutating action, even if the matched + * element is logically the same. For longer-lived identity, prefer + * [accessibilityId] / [resourceId] when the driver populates them. + */ + indexPath: number[]; + /** + * Bounding rectangle of the matched node, in device pixels. `null` when the + * driver couldn't compute bounds for the node (some Playwright nodes from + * the parsed ARIA tree lack DOM-bounds enrichment; some Compose nodes + * before first layout, etc.). Callers must treat `null` as "no coordinates + * available" rather than tapping the origin — defaulting an unknown bounds + * to `(0, 0, 0, 0)` would let a scripted tool accidentally tap the + * top-left corner of the screen. + */ + bounds?: Bounds | null; + /** + * Best-available text on the matched node, when the driver exposes one. + * Per-driver: `text ?: hintText ?: contentDescription` on Android, + * `text ?: hintText ?: accessibilityText` on iOS Maestro, `ariaName` on Web, + * etc. Null when the matched node carried no text-shaped property. + */ + matchedText?: string | null; + /** + * Accessibility label / content description on the matched node, when the + * driver exposes one. Maps to `contentDescription` on Android accessibility, + * `accessibilityText` on Android/iOS Maestro, `uniqueId` on iOS AXe, + * `contentDescription` on Compose, `ariaDescriptor` on Web. Null otherwise. + */ + accessibilityId?: string | null; + /** + * Stable identifier on the matched node, when the driver exposes one. Maps + * to `resourceId` on Android, `accessibilityIdentifier` on iOS, `testTag` on + * Compose, `data-testid` on Web. Null otherwise. + */ + resourceId?: string | null; +} +/** + * Ergonomic constructors for [TrailblazeNodeSelector] with scoped IDE autocomplete on + * each driver's match-field surface. Both forms below produce identical values: + * + * ```ts + * // Factory form — IDE narrows to the chosen driver's fields + * const a: TrailblazeNodeSelector = selectors.androidAccessibility({ textRegex: "Submit" }); + * + * // Literal form — copy-paste compatible with the YAML serialization + * const b: TrailblazeNodeSelector = { androidAccessibility: { textRegex: "Submit" } }; + * ``` + * + * The factory is pure sugar — its implementation is `(args) => ({ <driverKey>: args })` + * — but it lets authors write a selector without remembering the exact wire-discriminator + * key, and scopes autocomplete to one driver at a time. Adding a new driver is a single + * Kotlin sealed-class branch + codegen regen; no parallel TypeScript edits to remember. + */ +export declare const selectors: { + androidAccessibility: (args: DriverNodeMatchAndroidAccessibility) => TrailblazeNodeSelector; + androidMaestro: (args: DriverNodeMatchAndroidMaestro) => TrailblazeNodeSelector; + web: (args: DriverNodeMatchWeb) => TrailblazeNodeSelector; + compose: (args: DriverNodeMatchCompose) => TrailblazeNodeSelector; + iosMaestro: (args: DriverNodeMatchIosMaestro) => TrailblazeNodeSelector; + iosAxe: (args: DriverNodeMatchIosAxe) => TrailblazeNodeSelector; +}; +/** + * Sync, locally-evaluated view of a captured device snapshot. Predicate helpers + * query resolved matches without further round-trips so a synchronous predicate + * (e.g. a [ConditionalAction]'s `condition` / `postcondition`) can run inside a + * `.filter(...)` callback. + * + * **Shared with waypoint detection.** Per the #3455 "Convergence with + * waypoint detection" note, waypoint resolution is the same problem shape (N + * detector predicates against one snapshot). Whichever subsystem ships first + * defines the predicate surface; the other consumes it. Adding a method here is + * a cross-subsystem decision — if a new helper makes sense for both ConditionalAction + * and waypoint authors, add it; if it's specific to one, prefer a subsystem-local + * utility that takes a [ViewHierarchy] argument. + * + * **Backed by pre-resolved selectors in Phase 2.** [captureViewHierarchy] builds + * an instance from a declared list of selectors; queries for selectors not in + * that list throw. When the host-side full-tree snapshot tool ships (Phase 3+), + * the snapshot can be backed by the captured tree directly and arbitrary + * selectors will resolve without pre-declaration — the interface won't change, + * just the implementation. + * + * Naming note: TypeScript-side `ViewHierarchy` is a sync data carrier with + * predicate helpers. The Kotlin side's `ViewHierarchyTreeNode` is the actual + * captured tree. The shared word "ViewHierarchy" is intentional (both represent + * the same captured state); the shape differs because the consumer needs differ. + */ +export interface ViewHierarchy { + /** Returns `true` if at least one node in the snapshot matches `selector`. */ + visible(selector: TrailblazeNodeSelector): boolean; + /** Returns the first matching node, or `null` if none match. */ + find(selector: TrailblazeNodeSelector): MatchDescriptor | null; + /** Returns every matching node — empty array if none. */ + findAll(selector: TrailblazeNodeSelector): MatchDescriptor[]; +} +/** + * Pre-resolve a declared list of selectors against the live device and return a + * sync [ViewHierarchy] whose `visible` / `find` / `findAll` queries serve from + * in-memory results. + * + * Each selector is dispatched via `client.tools.findMatches({ selector })` in + * parallel. **Each callback re-captures the view hierarchy** (see this file's + * header) — Phase 2 has no single-frame multi-selector capture path. Parallel + * dispatch keeps the wall-clock window small, but the result is not strictly + * atomic; predicates should tolerate small inter-frame drift. Calling + * `snap.visible(selectorNotInList)` throws — the snapshot only knows about + * selectors it pre-resolved. + * + * **Selector identity.** The lookup key is the JSON serialization of the + * selector object — `{ androidAccessibility: { textRegex: "Submit" } }` and a + * separately-constructed `selectors.androidAccessibility({ textRegex: "Submit" })` + * resolve to the same key because the factory produces an identical literal + * shape. Field order matters to `JSON.stringify`; if two selectors differ only + * in key order they'll be treated as distinct (a no-op in practice — TS object + * literals serialize in insertion order and authors rarely construct the same + * selector twice with shuffled keys, but worth noting). + * + * **Immutability.** The returned [ViewHierarchy] takes ownership of an + * internal selector list (copied from the caller-provided array) and its + * resolved [MatchDescriptor] arrays (copied per-selector by `findAll`). Mutating + * the caller's `selectors` array after this call doesn't affect the snapshot, + * and mutating the array returned by `findAll(...)` doesn't affect later + * `findAll(...)` calls or the post-action verify refresh. + * + * Returns a [ViewHierarchy] with the internal [SELECTOR_REGISTRY] marker + * attached so consumers can refresh against the same selector set via + * [reCaptureViewHierarchy]. + * + * @throws `Error` if any underlying `findMatches` call fails. Surfaces the + * daemon's error message verbatim with the failing selector for diagnosis. + */ +export declare function captureViewHierarchy(client: TrailblazeClient, selectors: readonly TrailblazeNodeSelector[]): Promise<ViewHierarchy>; +/** + * One entry in a ConditionalAction catalog. Each entry is a self-contained + * "if [condition] then [action] [verify postcondition]" rule. + * + * - [id] — stable identifier; surfaces in [ConditionalActionFailedError] and in the + * [runConditionalActions] return value's `handled` list. Authors pick the shape + * (kebab-case, snake-case, whatever the catalog convention is). + * **Uniqueness is a catalog-author obligation, NOT enforced by the framework.** + * `runConditionalActions` does not deduplicate or validate ids; if two entries + * share an id and both match, the returned `handled` array contains the id + * twice and any failure throws with that id ambiguously pointing at either + * entry. Author validation (a static analyzer, a startup-time assertion in the + * adopting team's tool) is the right layer for the check. + * - [description] — human-readable purpose; surfaces in LLM tool schemas when + * an adopting team wraps the catalog into a Trailblaze tool. + * - [condition] — pure synchronous predicate evaluated against a captured + * [ViewHierarchy]. Returning `true` means this entry should run. Coerced to + * boolean via `Boolean(...)` at the call site so accidental truthy-but-not- + * boolean returns (`1`, `"x"`, etc.) behave per the declared `boolean` type. + * A throw from this predicate is caught and re-raised as a + * [ConditionalActionFailedError] carrying the entry's [id]. + * - [action] — async work that mutates device state, typically composing other + * Trailblaze tools via the surrounding tool's `client.tools.<name>(...)` / + * `ctx.tools.<name>(...)`. **Closure pattern:** the action receives no + * arguments; the author closes over their `client` / `ctx` from the + * surrounding tool body. This is intentional — the condition runs during + * the bulk-filter phase against the captured snapshot, but the action runs + * later (per entry, after applicable filtering) and the closure makes it + * explicit which scope the side effects fire in. A throw or rejection from + * the action is caught and re-raised as a [ConditionalActionFailedError] carrying + * the entry's [id]. + * - [postcondition] — optional pure predicate that does **double duty**: + * 1. **Before [action]:** if already satisfied, skip the entry entirely + * (fast-path short-circuit — covers "popup already dismissed"). + * 2. **After [action]:** if not satisfied, raise + * [ConditionalActionFailedError] with the entry's [id]. Surfaces catalog + * drift / wrong-screen detection. + * Coerced to boolean via `Boolean(...)` at each call site. A throw from + * this predicate is caught and re-raised as a [ConditionalActionFailedError]. + */ +export interface ConditionalAction { + readonly id: string; + readonly description: string; + readonly condition: (snap: ViewHierarchy) => boolean; + readonly action: () => Promise<void>; + readonly postcondition?: (snap: ViewHierarchy) => boolean; +} +/** + * Thrown when a [ConditionalAction] entry's execution fails. Three causes — all carry + * the offending entry's [conditionalActionId] so a catch-site can point at the + * specific catalog entry: + * + * - **`postcondition` returned false after `action` ran** — the original + * failure mode the primitive's design centers on. Surfaces catalog drift, + * wrong-screen detection, or a race with an un-cataloged modal. + * - **`action` threw / rejected** — wrapping the action's failure with the + * entry id is more useful than a bare propagation; catch-sites that want + * to handle action failures specifically can read [conditionalActionId]. + * - **`condition` or `postcondition` threw** — predicates are nominally pure + * functions returning booleans, but TypeScript can't enforce that at + * runtime. A predicate that throws is treated as a catalog-authoring bug; + * the throw is wrapped with the entry id so the offending catalog entry is + * immediately identifiable. + * + * The [cause] property carries the original error (per ES2022 `Error.cause` + * conventions) when the failure was an underlying throw — `null` when the + * failure was a `postcondition` returning false (no underlying error). + */ +export declare class ConditionalActionFailedError extends Error { + readonly conditionalActionId: string; + readonly cause: unknown; + constructor(conditionalActionId: string, message: string, cause?: unknown); +} +/** + * Walk `conditionalActions` against a captured snapshot and execute the entries that apply. + * + * 1. **Acquire the snapshot.** Use `presnapshot` if provided; otherwise throw + * — Phase 2 has no auto-acquire path (see file header for the host-side + * tool dependency). + * 2. **Bulk filter.** For each entry: skip if `postcondition` is already + * satisfied (fast-path short-circuit), otherwise include if `condition` + * matches. Pure local computation regardless of catalog size. + * 3. **Execute applicable entries in order.** For each: run `action`, then if + * a `postcondition` was declared, refresh the snapshot and verify. Any + * failure (predicate throw, action throw, postcondition returning false) + * raises [ConditionalActionFailedError] carrying the offending entry's id. + * + * **Cost in the no-match case:** zero extra round-trips when `presnapshot` is + * passed (the common case — the caller has already built one via + * `captureViewHierarchy`). N predicate evaluations are pure local computation + * regardless of catalog size. Phase 2 has no built-in auto-acquire path, so + * "otherwise" the call throws — the cost of acquisition lives entirely in + * `captureViewHierarchy`, which pays one `findMatches` callback per declared + * selector (see this file's header for the acquisition-path caveat). + * + * **Cost in the all-match case:** one round-trip per applicable entry's + * `action`, plus M `findMatches` callbacks per declared `postcondition` for + * the post-action verify (where M is the size of the original presnapshot's + * selector set — the verify refreshes the full set via `reCaptureViewHierarchy`, + * since the implementation can't introspect which selectors a given + * `postcondition` will probe). + * + * **Verification snapshot** — for entries with a `postcondition`, the verify + * snapshot is captured against the same set of selectors as `presnapshot` (via + * `reCaptureViewHierarchy`). The implementation can't statically know which + * selectors a future `postcondition` will reference, so it reuses the + * pre-existing list — same coverage as the initial check. + * + * @throws [ConditionalActionFailedError] when an entry's `condition` / + * `postcondition` predicate throws, `action` throws, or `postcondition` + * returns false after action. + * @throws `Error` when `presnapshot` is undefined (Phase 2 limitation — see + * file header). + */ +export declare function runConditionalActions(client: TrailblazeClient, conditionalActions: readonly ConditionalAction[], presnapshot?: ViewHierarchy): Promise<{ + handled: string[]; +}>; +export interface TrailblazeToolMap { + /** + * Tap or long-press at absolute device coordinates. The runtime upgrades the *recorded* + * step to a selector-based `tapOn` when the coordinates resolve to a unique element — + * the live tap still fires at the raw `(x, y)`. + * + * Source: `TapOnPointTrailblazeTool.kt`. + */ + tapOnPoint: { + args: { + /** The center X coordinate for the clickable element. */ + x: number; + /** The center Y coordinate for the clickable element. */ + y: number; + /** Default `false` (standard tap). Pass `true` for a long press. */ + longPress?: boolean; + /** Optional rationale logged alongside the tool call. */ + reasoning?: string; + }; + result: string; + }; + /** + * Tap on an element by visible text (substring match). DEPRECATED upstream in favor of + * `tapOn`/`TapOnByElementSelector` — included here because tutorials still reference it. + * + * Source: `TapOnElementWithTextTrailblazeTool.kt`. + */ + tapOnElementWithText: { + args: { + /** Required. Text contained in the target element. */ + text: string; + /** 0-based index of the view to select among matches. */ + index?: number; + /** Regex for selecting by id when multiple elements share the text. */ + id?: string; + enabled?: boolean; + selected?: boolean; + }; + result: string; + }; + /** + * Tap an Android accessibility node identified by its content description (plus optional + * className and resourceId tiebreakers). Use for canvas widgets whose interactive regions + * are virtual views of an `ExploreByTouchHelper` — PIN pads, drawing-app palettes, + * custom map markers, etc. — where the buttons have a `contentDescription` but no `text`, + * so `tapOnElementWithText` can't reach them. + * + * Routes through the same selector-resolved dispatch path the LLM `tap` tool uses, so + * the per-tap `ACTION_CLICK` routing (see `AccessibilityDeviceManager.kt`) applies. + * + * Source: `TapOnAccessibilityNodeTrailblazeTool.kt`. + */ + tapOnAccessibilityNode: { + args: { + /** Required. Regex matched against the node's content description. */ + contentDescriptionRegex: string; + /** Optional regex matched against the node's className. */ + classNameRegex?: string; + /** Optional regex matched against the node's resourceId. */ + resourceIdRegex?: string; + /** Set to true for a long press instead of a tap. */ + longPress?: boolean; + }; + result: string; + }; + /** + * Type characters into the currently-focused text field. The runtime auto-hides the + * keyboard after typing on iOS so a follow-up screenshot isn't obscured. + * + * Source: `InputTextTrailblazeTool.kt`. + */ + inputText: { + args: { + /** Required. Text to type into the focused field. */ + text: string; + /** Optional rationale logged alongside the tool call. */ + reasoning?: string; + }; + result: string; + }; + /** + * Dismiss the on-screen keyboard. No args (singleton tool object on the Kotlin side). + * + * Source: `HideKeyboardTrailblazeTool.kt`. + */ + hideKeyboard: { + args: Record<string, never>; + result: string; + }; + /** + * Press a hardware/system key. + * + * Source: `PressKeyTrailblazeTool.kt`. + */ + pressKey: { + args: { + /** Required. One of the supported `PressKeyCode` values. */ + keyCode: "BACK" | "ENTER" | "HOME"; + }; + result: string; + }; + /** + * Swipe in a cardinal direction. Direction is the *finger* direction — to scroll the + * page DOWN (see content below), the finger swipes UP. + * + * Source: `SwipeTrailblazeTool.kt`. + */ + swipe: { + args: { + /** Default `DOWN`. Direction of the finger gesture, not the scroll direction. */ + direction?: "UP" | "DOWN" | "LEFT" | "RIGHT"; + /** Element text to anchor the swipe on. Omit to swipe at screen center. */ + swipeOnElementText?: string; + /** Optional rationale logged alongside the tool call. */ + reasoning?: string; + }; + result: string; + }; + /** + * Launch an app by id, with control over whether state is cleared and whether a running + * instance is forcibly stopped first. + * + * Source: `LaunchAppTrailblazeTool.kt`. + */ + launchApp: { + args: { + /** Required. Package id (Android) or bundle id (iOS). */ + appId: string; + /** + * Default `REINSTALL` (clean state). `RESUME` picks up an in-memory app; `FORCE_RESTART` + * stops then relaunches without clearing state. The runtime silently upgrades + * `REINSTALL` → `FORCE_RESTART` for iOS system apps (`com.apple.*`). + */ + launchMode?: "REINSTALL" | "RESUME" | "FORCE_RESTART"; + reasoning?: string; + }; + result: string; + }; + /** + * Resolve a [TrailblazeNodeSelector] against the current view hierarchy and return + * every match as a [MatchDescriptor] list. Read-only — never mutates the device. + * + * Use the result length as a visibility / uniqueness gate: + * + * ```ts + * const matches = await client.tools.findMatches({ + * selector: { androidAccessibility: { textRegex: "Submit" } }, + * }); + * // matches.length === 0 -> not visible + * // matches.length === 1 -> unique match, safe to act on + * // matches.length > 1 -> ambiguous, narrow the selector + * ``` + * + * Each match carries enough identity + position info (indexPath, bounds, text, + * accessibilityId, resourceId) to act on without re-querying. + * + * Snapshot reuse: calling `findMatches` multiple times within one tool invocation + * shares the captured view hierarchy via the host-side snapshot cache — the + * multi-second hierarchy fetch is paid at most once per invocation. An action + * tool dispatched in the same batch (tap, swipe, inputText, …) invalidates the + * cache so a follow-up `findMatches` reads the post-action tree. + * + * Source: `FindMatchesTrailblazeTool.kt`. + */ + findMatches: { + args: { + /** Selector to match against the current view hierarchy. */ + selector: TrailblazeNodeSelector; + }; + result: MatchDescriptor[]; + }; + /** + * Assert an element with the given accessibility text is visible. DEPRECATED upstream + * in favor of the unified `assertVisible` selector path — kept here because the + * recorded-trail format still emits this name. + * + * Source: `AssertVisibleWithAccessibilityTextTrailblazeTool.kt`. + */ + assertVisibleWithAccessibilityText: { + args: { + /** Required. Accessibility text to assert is visible. */ + accessibilityText: string; + /** Regex selector for disambiguating duplicates. */ + id?: string; + /** 0-based index of the view to select among matches. */ + index?: number; + enabled?: boolean; + selected?: boolean; + }; + result: string; + }; +} +/** + * Namespace bundle authors import as `trailblaze`. Flat entry points (`tool`, `run`) also + * export individually for anyone who prefers named imports over the namespace. + * + * Test-only helpers (e.g., `_clearPendingTools` in `./tool.js`) are deliberately NOT + * re-exported here. The SDK's public surface is `tool`, `run`, `fromMeta`, and the type + * exports above; tests that need internals import from the module's relative path directly. + */ +export declare const trailblaze: { + tool: typeof tool; + run: typeof run; +}; + +declare namespace JSONSchema$1 { + export { ArraySchema, BaseSchema, BooleanSchema, IntegerSchema, JSONSchema, NullSchema, NumberSchema, ObjectSchema, Schema, StringSchema, _JSONSchema }; +} +declare namespace util$1 { + export { AnyFunc, AssertEqual, AssertExtends, AssertNotEqual, BIGINT_FORMAT_RANGES, BuiltIn$1 as BuiltIn, Class, CleanKey, Constructor, EmptyObject, EmptyToNever, EnumLike, EnumValue, Exactly, Extend, ExtractIndexSignature, Flatten, FromCleanMap, HasLength, HasSize, HashAlgorithm, HashEncoding, HashFormat, IPVersion, Identity, InexactPartial, IsAny, IsProp, JSONType, JWTAlgorithm, KeyOf, Keys, KeysArray, KeysEnum, Literal, LiteralArray, LoosePartial, MakePartial, MakeReadonly$1 as MakeReadonly, MakeRequired, Mapped, Mask, MaybeAsync, MimeTypes, NUMBER_FORMAT_RANGES, NoNever, NoNeverKeys, NoUndefined, Normalize, Numeric, Omit$1 as Omit, OmitIndexSignature, OmitKeys, ParsedTypes, Prettify, Primitive$1 as Primitive, PrimitiveArray, PrimitiveSet, PropValues, SafeParseError$1 as SafeParseError, SafeParseResult, SafeParseSuccess$1 as SafeParseSuccess, SchemaClass, SomeObject, ToCleanMap, ToEnum, TupleItems, Whatever, Writeable, aborted, allowsEval, assert, assertEqual, assertIs, assertNever, assertNotEqual, assignProp, base64ToUint8Array, base64urlToUint8Array, cached, captureStackTrace, cleanEnum, cleanRegex, clone, cloneDef, createTransparentProxy, defineLazy, esc, escapeRegex, extend, finalizeIssue, floatSafeRemainder, getElementAtPath, getEnumValues, getLengthableOrigin, getParsedType, getSizableOrigin, hexToUint8Array, isObject, isPlainObject, issue, joinValues, jsonStringifyReplacer, merge, mergeDefs, normalizeParams, nullish, numKeys, objectClone, omit, optionalKeys, parsedType, partial, pick, prefixIssues, primitiveTypes, promiseAllObject, propertyKeyTypes, randomString, required, safeExtend, shallowClone, slugify, stringifyPrimitive, uint8ArrayToBase64, uint8ArrayToBase64url, uint8ArrayToHex, unwrapMessage }; +} +declare namespace coerce { + export { ZodCoercedBigInt, ZodCoercedBoolean, ZodCoercedDate, ZodCoercedNumber, ZodCoercedString, bigint$2 as bigint, boolean$2 as boolean, date$3 as date, number$2 as number, string$2 as string }; +} +declare namespace schemas { + export { $InferEnumInput, $InferEnumOutput, $InferInnerFunctionType, $InferInnerFunctionTypeAsync, $InferObjectInput, $InferObjectOutput, $InferOuterFunctionType, $InferOuterFunctionTypeAsync, $InferTupleInputType, $InferTupleOutputType, $InferUnionInput, $InferUnionOutput, $InferZodRecordInput, $InferZodRecordOutput, $PartsToTemplateLiteral, $ZodAny, $ZodAnyDef, $ZodAnyInternals, $ZodArray, $ZodArrayDef, $ZodArrayInternals, $ZodBase64, $ZodBase64Def, $ZodBase64Internals, $ZodBase64URL, $ZodBase64URLDef, $ZodBase64URLInternals, $ZodBigInt, $ZodBigIntDef, $ZodBigIntFormat, $ZodBigIntFormatDef, $ZodBigIntFormatInternals, $ZodBigIntInternals, $ZodBoolean, $ZodBooleanDef, $ZodBooleanInternals, $ZodCIDRv4, $ZodCIDRv4Def, $ZodCIDRv4Internals, $ZodCIDRv6, $ZodCIDRv6Def, $ZodCIDRv6Internals, $ZodCUID, $ZodCUID2, $ZodCUID2Def, $ZodCUID2Internals, $ZodCUIDDef, $ZodCUIDInternals, $ZodCatch, $ZodCatchCtx, $ZodCatchDef, $ZodCatchInternals, $ZodCodec, $ZodCodecDef, $ZodCodecInternals, $ZodCustom, $ZodCustomDef, $ZodCustomInternals, $ZodCustomStringFormat, $ZodCustomStringFormatDef, $ZodCustomStringFormatInternals, $ZodDate, $ZodDateDef, $ZodDateInternals, $ZodDefault, $ZodDefaultDef, $ZodDefaultInternals, $ZodDiscriminatedUnion, $ZodDiscriminatedUnionDef, $ZodDiscriminatedUnionInternals, $ZodE164, $ZodE164Def, $ZodE164Internals, $ZodEmail, $ZodEmailDef, $ZodEmailInternals, $ZodEmoji, $ZodEmojiDef, $ZodEmojiInternals, $ZodEnum, $ZodEnumDef, $ZodEnumInternals, $ZodExactOptional, $ZodExactOptionalDef, $ZodExactOptionalInternals, $ZodFile, $ZodFileDef, $ZodFileInternals, $ZodFunction, $ZodFunctionArgs, $ZodFunctionDef, $ZodFunctionIn, $ZodFunctionInternals, $ZodFunctionOut, $ZodFunctionParams, $ZodGUID, $ZodGUIDDef, $ZodGUIDInternals, $ZodIPv4, $ZodIPv4Def, $ZodIPv4Internals, $ZodIPv6, $ZodIPv6Def, $ZodIPv6Internals, $ZodISODate, $ZodISODateDef, $ZodISODateInternals, $ZodISODateTime, $ZodISODateTimeDef, $ZodISODateTimeInternals, $ZodISODuration, $ZodISODurationDef, $ZodISODurationInternals, $ZodISOTime, $ZodISOTimeDef, $ZodISOTimeInternals, $ZodIntersection, $ZodIntersectionDef, $ZodIntersectionInternals, $ZodJWT, $ZodJWTDef, $ZodJWTInternals, $ZodKSUID, $ZodKSUIDDef, $ZodKSUIDInternals, $ZodLazy, $ZodLazyDef, $ZodLazyInternals, $ZodLiteral, $ZodLiteralDef, $ZodLiteralInternals, $ZodLooseShape, $ZodMAC, $ZodMACDef, $ZodMACInternals, $ZodMap, $ZodMapDef, $ZodMapInternals, $ZodNaN, $ZodNaNDef, $ZodNaNInternals, $ZodNanoID, $ZodNanoIDDef, $ZodNanoIDInternals, $ZodNever, $ZodNeverDef, $ZodNeverInternals, $ZodNonOptional, $ZodNonOptionalDef, $ZodNonOptionalInternals, $ZodNull, $ZodNullDef, $ZodNullInternals, $ZodNullable, $ZodNullableDef, $ZodNullableInternals, $ZodNumber, $ZodNumberDef, $ZodNumberFormat, $ZodNumberFormatDef, $ZodNumberFormatInternals, $ZodNumberInternals, $ZodObject, $ZodObjectConfig, $ZodObjectDef, $ZodObjectInternals, $ZodObjectJIT, $ZodOptional, $ZodOptionalDef, $ZodOptionalInternals, $ZodPipe, $ZodPipeDef, $ZodPipeInternals, $ZodPrefault, $ZodPrefaultDef, $ZodPrefaultInternals, $ZodPromise, $ZodPromiseDef, $ZodPromiseInternals, $ZodReadonly, $ZodReadonlyDef, $ZodReadonlyInternals, $ZodRecord, $ZodRecordDef, $ZodRecordInternals, $ZodRecordKey, $ZodSet, $ZodSetDef, $ZodSetInternals, $ZodShape, $ZodStandardSchema, $ZodString, $ZodStringDef, $ZodStringFormat, $ZodStringFormatDef, $ZodStringFormatInternals, $ZodStringFormatTypes, $ZodStringInternals, $ZodSuccess, $ZodSuccessDef, $ZodSuccessInternals, $ZodSymbol, $ZodSymbolDef, $ZodSymbolInternals, $ZodTemplateLiteral, $ZodTemplateLiteralDef, $ZodTemplateLiteralInternals, $ZodTemplateLiteralPart, $ZodTransform, $ZodTransformDef, $ZodTransformInternals, $ZodTuple, $ZodTupleDef, $ZodTupleInternals, $ZodType, $ZodTypeDef, $ZodTypeInternals, $ZodTypes, $ZodULID, $ZodULIDDef, $ZodULIDInternals, $ZodURL, $ZodURLDef, $ZodURLInternals, $ZodUUID, $ZodUUIDDef, $ZodUUIDInternals, $ZodUndefined, $ZodUndefinedDef, $ZodUndefinedInternals, $ZodUnion, $ZodUnionDef, $ZodUnionInternals, $ZodUnknown, $ZodUnknownDef, $ZodUnknownInternals, $ZodVoid, $ZodVoidDef, $ZodVoidInternals, $ZodXID, $ZodXIDDef, $ZodXIDInternals, $ZodXor, $ZodXorInternals, $catchall, $loose, $partial, $strict, $strip, CheckFn, ConcatenateTupleOfStrings, ConvertPartsToStringTuple, File$1 as File, ParseContext$1 as ParseContext, ParseContextInternal, ParsePayload, SomeType, ToTemplateLiteral, _$ZodType, _$ZodTypeInternals, clone, isValidBase64, isValidBase64URL, isValidJWT }; +} +declare namespace regexes { + export { _null as null, _undefined as undefined, base64, base64url, bigint, boolean, browserEmail, cidrv4, cidrv6, cuid, cuid2, date, datetime, domain, duration, e164, email, emoji, extendedDuration, guid, hex, hostname, html5Email, idnEmail, integer, ipv4, ipv6, ksuid, lowercase, mac, md5_base64, md5_base64url, md5_hex, nanoid, number, rfc5322Email, sha1_base64, sha1_base64url, sha1_hex, sha256_base64, sha256_base64url, sha256_hex, sha384_base64, sha384_base64url, sha384_hex, sha512_base64, sha512_base64url, sha512_hex, string, time, ulid, unicodeEmail, uppercase, uuid, uuid4, uuid6, uuid7, xid }; +} +declare namespace locales { + export { _default as ar, _default$1 as az, _default$10 as es, _default$11 as fa, _default$12 as fi, _default$13 as fr, _default$14 as frCA, _default$15 as he, _default$16 as hu, _default$17 as hy, _default$18 as id, _default$19 as is, _default$2 as be, _default$20 as it, _default$21 as ja, _default$22 as ka, _default$23 as kh, _default$24 as km, _default$25 as ko, _default$26 as lt, _default$27 as mk, _default$28 as ms, _default$29 as nl, _default$3 as bg, _default$30 as no, _default$31 as ota, _default$32 as ps, _default$33 as pl, _default$34 as pt, _default$35 as ru, _default$36 as sl, _default$37 as sv, _default$38 as ta, _default$39 as th, _default$4 as ca, _default$40 as tr, _default$41 as ua, _default$42 as uk, _default$43 as ur, _default$44 as uz, _default$45 as vi, _default$46 as zhCN, _default$47 as zhTW, _default$48 as yo, _default$5 as cs, _default$6 as da, _default$7 as de, _default$8 as en, _default$9 as eo }; +} +declare namespace schemas$1 { + export { SafeExtendShape, ZodAny, ZodArray$1 as ZodArray, ZodBase64, ZodBase64URL, ZodBigInt, ZodBigIntFormat, ZodBoolean, ZodCIDRv4, ZodCIDRv6, ZodCUID, ZodCUID2, ZodCatch$1 as ZodCatch, ZodCodec, ZodCustom, ZodCustomStringFormat, ZodDate, ZodDefault$1 as ZodDefault, ZodDiscriminatedUnion, ZodE164, ZodEmail, ZodEmoji, ZodEnum, ZodExactOptional, ZodFile, ZodFloat32, ZodFloat64, ZodFunction, ZodGUID, ZodIPv4, ZodIPv6, ZodInt, ZodInt32, ZodIntersection$1 as ZodIntersection, ZodJSONSchema, ZodJSONSchemaInternals, ZodJWT, ZodKSUID, ZodLazy, ZodLiteral, ZodMAC, ZodMap, ZodNaN, ZodNanoID, ZodNever, ZodNonOptional, ZodNull, ZodNullable$1 as ZodNullable, ZodNumber, ZodNumberFormat, ZodObject, ZodOptional$1 as ZodOptional, ZodPipe, ZodPrefault, ZodPromise$1 as ZodPromise, ZodReadonly$1 as ZodReadonly, ZodRecord, ZodSet, ZodStandardSchemaWithJSON$1 as ZodStandardSchemaWithJSON, ZodString, ZodStringFormat, ZodSuccess, ZodSymbol, ZodTemplateLiteral, ZodTransform, ZodTuple, ZodType$1 as ZodType, ZodUInt32, ZodULID, ZodURL, ZodUUID, ZodUndefined, ZodUnion$1 as ZodUnion, ZodUnknown, ZodVoid, ZodXID, ZodXor, _ZodBigInt, _ZodBoolean, _ZodDate, _ZodNumber, _ZodString, _ZodType, _catch$1 as catch, _default$50 as _default, _enum$1 as enum, _function, _function as function, _instanceof as instanceof, _null$2 as null, _undefined$2 as undefined, _void$1 as void, any, array, base64$1 as base64, base64url$1 as base64url, bigint$1 as bigint, boolean$1 as boolean, check, cidrv4$1 as cidrv4, cidrv6$1 as cidrv6, codec, cuid$1 as cuid, cuid2$1 as cuid2, custom, date$1 as date, describe$1 as describe, discriminatedUnion, e164$1 as e164, email$1 as email, emoji$1 as emoji, exactOptional, file, float32, float64, guid$1 as guid, hash, hex$1 as hex, hostname$1 as hostname, httpUrl, int, int32, int64, intersection, ipv4$1 as ipv4, ipv6$1 as ipv6, json, jwt, keyof, ksuid$1 as ksuid, lazy, literal, looseObject, looseRecord, mac$1 as mac, map, meta$1 as meta, nan, nanoid$1 as nanoid, nativeEnum, never, nonoptional, nullable, nullish$1 as nullish, number$1 as number, object, optional, partialRecord, pipe, prefault, preprocess, promise, readonly, record, refine, set, strictObject, string$1 as string, stringFormat, stringbool, success, superRefine, symbol, templateLiteral, transform, tuple, uint32, uint64, ulid$1 as ulid, union, unknown, url, uuid$1 as uuid, uuidv4, uuidv6, uuidv7, xid$1 as xid, xor }; +} +declare namespace core { + export { $Decode, $DecodeAsync, $Encode, $EncodeAsync, $InferEnumInput, $InferEnumOutput, $InferInnerFunctionType, $InferInnerFunctionTypeAsync, $InferObjectInput, $InferObjectOutput, $InferOuterFunctionType, $InferOuterFunctionTypeAsync, $InferTupleInputType, $InferTupleOutputType, $InferUnionInput, $InferUnionOutput, $InferZodRecordInput, $InferZodRecordOutput, $Parse, $ParseAsync, $PartsToTemplateLiteral, $RefinementCtx, $SafeDecode, $SafeDecodeAsync, $SafeEncode, $SafeEncodeAsync, $SafeParse, $SafeParseAsync, $ZodAny, $ZodAnyDef, $ZodAnyInternals, $ZodAnyParams, $ZodArray, $ZodArrayDef, $ZodArrayInternals, $ZodArrayParams, $ZodAsyncError, $ZodBase64, $ZodBase64Def, $ZodBase64Internals, $ZodBase64Params, $ZodBase64URL, $ZodBase64URLDef, $ZodBase64URLInternals, $ZodBase64URLParams, $ZodBigInt, $ZodBigIntDef, $ZodBigIntFormat, $ZodBigIntFormatDef, $ZodBigIntFormatInternals, $ZodBigIntFormatParams, $ZodBigIntFormats, $ZodBigIntInternals, $ZodBigIntParams, $ZodBoolean, $ZodBooleanDef, $ZodBooleanInternals, $ZodBooleanParams, $ZodBranded, $ZodCIDRv4, $ZodCIDRv4Def, $ZodCIDRv4Internals, $ZodCIDRv4Params, $ZodCIDRv6, $ZodCIDRv6Def, $ZodCIDRv6Internals, $ZodCIDRv6Params, $ZodCUID, $ZodCUID2, $ZodCUID2Def, $ZodCUID2Internals, $ZodCUID2Params, $ZodCUIDDef, $ZodCUIDInternals, $ZodCUIDParams, $ZodCatch, $ZodCatchCtx, $ZodCatchDef, $ZodCatchInternals, $ZodCatchParams, $ZodCheck, $ZodCheckBase64Params, $ZodCheckBase64URLParams, $ZodCheckBigIntFormat, $ZodCheckBigIntFormatDef, $ZodCheckBigIntFormatInternals, $ZodCheckBigIntFormatParams, $ZodCheckCIDRv4Params, $ZodCheckCIDRv6Params, $ZodCheckCUID2Params, $ZodCheckCUIDParams, $ZodCheckDef, $ZodCheckE164Params, $ZodCheckEmailParams, $ZodCheckEmojiParams, $ZodCheckEndsWith, $ZodCheckEndsWithDef, $ZodCheckEndsWithInternals, $ZodCheckEndsWithParams, $ZodCheckGUIDParams, $ZodCheckGreaterThan, $ZodCheckGreaterThanDef, $ZodCheckGreaterThanInternals, $ZodCheckGreaterThanParams, $ZodCheckIPv4Params, $ZodCheckIPv6Params, $ZodCheckISODateParams, $ZodCheckISODateTimeParams, $ZodCheckISODurationParams, $ZodCheckISOTimeParams, $ZodCheckIncludes, $ZodCheckIncludesDef, $ZodCheckIncludesInternals, $ZodCheckIncludesParams, $ZodCheckInternals, $ZodCheckJWTParams, $ZodCheckKSUIDParams, $ZodCheckLengthEquals, $ZodCheckLengthEqualsDef, $ZodCheckLengthEqualsInternals, $ZodCheckLengthEqualsParams, $ZodCheckLessThan, $ZodCheckLessThanDef, $ZodCheckLessThanInternals, $ZodCheckLessThanParams, $ZodCheckLowerCase, $ZodCheckLowerCaseDef, $ZodCheckLowerCaseInternals, $ZodCheckLowerCaseParams, $ZodCheckMACParams, $ZodCheckMaxLength, $ZodCheckMaxLengthDef, $ZodCheckMaxLengthInternals, $ZodCheckMaxLengthParams, $ZodCheckMaxSize, $ZodCheckMaxSizeDef, $ZodCheckMaxSizeInternals, $ZodCheckMaxSizeParams, $ZodCheckMimeType, $ZodCheckMimeTypeDef, $ZodCheckMimeTypeInternals, $ZodCheckMimeTypeParams, $ZodCheckMinLength, $ZodCheckMinLengthDef, $ZodCheckMinLengthInternals, $ZodCheckMinLengthParams, $ZodCheckMinSize, $ZodCheckMinSizeDef, $ZodCheckMinSizeInternals, $ZodCheckMinSizeParams, $ZodCheckMultipleOf, $ZodCheckMultipleOfDef, $ZodCheckMultipleOfInternals, $ZodCheckMultipleOfParams, $ZodCheckNanoIDParams, $ZodCheckNumberFormat, $ZodCheckNumberFormatDef, $ZodCheckNumberFormatInternals, $ZodCheckNumberFormatParams, $ZodCheckOverwrite, $ZodCheckOverwriteDef, $ZodCheckOverwriteInternals, $ZodCheckProperty, $ZodCheckPropertyDef, $ZodCheckPropertyInternals, $ZodCheckPropertyParams, $ZodCheckRegex, $ZodCheckRegexDef, $ZodCheckRegexInternals, $ZodCheckRegexParams, $ZodCheckSizeEquals, $ZodCheckSizeEqualsDef, $ZodCheckSizeEqualsInternals, $ZodCheckSizeEqualsParams, $ZodCheckStartsWith, $ZodCheckStartsWithDef, $ZodCheckStartsWithInternals, $ZodCheckStartsWithParams, $ZodCheckStringFormat, $ZodCheckStringFormatDef, $ZodCheckStringFormatInternals, $ZodCheckStringFormatParams, $ZodCheckULIDParams, $ZodCheckURLParams, $ZodCheckUUIDParams, $ZodCheckUUIDv4Params, $ZodCheckUUIDv6Params, $ZodCheckUUIDv7Params, $ZodCheckUpperCase, $ZodCheckUpperCaseDef, $ZodCheckUpperCaseInternals, $ZodCheckUpperCaseParams, $ZodCheckXIDParams, $ZodChecks, $ZodCodec, $ZodCodecDef, $ZodCodecInternals, $ZodConfig, $ZodCustom, $ZodCustomDef, $ZodCustomInternals, $ZodCustomParams, $ZodCustomStringFormat, $ZodCustomStringFormatDef, $ZodCustomStringFormatInternals, $ZodDate, $ZodDateDef, $ZodDateInternals, $ZodDateParams, $ZodDefault, $ZodDefaultDef, $ZodDefaultInternals, $ZodDefaultParams, $ZodDiscriminatedUnion, $ZodDiscriminatedUnionDef, $ZodDiscriminatedUnionInternals, $ZodDiscriminatedUnionParams, $ZodE164, $ZodE164Def, $ZodE164Internals, $ZodE164Params, $ZodEmail, $ZodEmailDef, $ZodEmailInternals, $ZodEmailParams, $ZodEmoji, $ZodEmojiDef, $ZodEmojiInternals, $ZodEmojiParams, $ZodEncodeError, $ZodEnum, $ZodEnumDef, $ZodEnumInternals, $ZodEnumParams, $ZodError, $ZodErrorClass, $ZodErrorMap, $ZodErrorTree, $ZodExactOptional, $ZodExactOptionalDef, $ZodExactOptionalInternals, $ZodFile, $ZodFileDef, $ZodFileInternals, $ZodFileParams, $ZodFlattenedError, $ZodFormattedError, $ZodFunction, $ZodFunctionArgs, $ZodFunctionDef, $ZodFunctionIn, $ZodFunctionInternals, $ZodFunctionOut, $ZodFunctionParams, $ZodGUID, $ZodGUIDDef, $ZodGUIDInternals, $ZodGUIDParams, $ZodIPv4, $ZodIPv4Def, $ZodIPv4Internals, $ZodIPv4Params, $ZodIPv6, $ZodIPv6Def, $ZodIPv6Internals, $ZodIPv6Params, $ZodISODate, $ZodISODateDef, $ZodISODateInternals, $ZodISODateParams, $ZodISODateTime, $ZodISODateTimeDef, $ZodISODateTimeInternals, $ZodISODateTimeParams, $ZodISODuration, $ZodISODurationDef, $ZodISODurationInternals, $ZodISODurationParams, $ZodISOTime, $ZodISOTimeDef, $ZodISOTimeInternals, $ZodISOTimeParams, $ZodInternalIssue, $ZodIntersection, $ZodIntersectionDef, $ZodIntersectionInternals, $ZodIntersectionParams, $ZodInvalidTypeExpected, $ZodIssue, $ZodIssueBase, $ZodIssueCode, $ZodIssueCustom, $ZodIssueInvalidElement, $ZodIssueInvalidKey, $ZodIssueInvalidStringFormat, $ZodIssueInvalidType, $ZodIssueInvalidUnion, $ZodIssueInvalidValue, $ZodIssueNotMultipleOf, $ZodIssueStringCommonFormats, $ZodIssueStringEndsWith, $ZodIssueStringIncludes, $ZodIssueStringInvalidJWT, $ZodIssueStringInvalidRegex, $ZodIssueStringStartsWith, $ZodIssueTooBig, $ZodIssueTooSmall, $ZodIssueUnrecognizedKeys, $ZodJWT, $ZodJWTDef, $ZodJWTInternals, $ZodJWTParams, $ZodKSUID, $ZodKSUIDDef, $ZodKSUIDInternals, $ZodKSUIDParams, $ZodLazy, $ZodLazyDef, $ZodLazyInternals, $ZodLazyParams, $ZodLiteral, $ZodLiteralDef, $ZodLiteralInternals, $ZodLiteralParams, $ZodLooseShape, $ZodMAC, $ZodMACDef, $ZodMACInternals, $ZodMACParams, $ZodMap, $ZodMapDef, $ZodMapInternals, $ZodMapParams, $ZodNaN, $ZodNaNDef, $ZodNaNInternals, $ZodNaNParams, $ZodNanoID, $ZodNanoIDDef, $ZodNanoIDInternals, $ZodNanoIDParams, $ZodNarrow, $ZodNever, $ZodNeverDef, $ZodNeverInternals, $ZodNeverParams, $ZodNonOptional, $ZodNonOptionalDef, $ZodNonOptionalInternals, $ZodNonOptionalParams, $ZodNull, $ZodNullDef, $ZodNullInternals, $ZodNullParams, $ZodNullable, $ZodNullableDef, $ZodNullableInternals, $ZodNullableParams, $ZodNumber, $ZodNumberDef, $ZodNumberFormat, $ZodNumberFormatDef, $ZodNumberFormatInternals, $ZodNumberFormatParams, $ZodNumberFormats, $ZodNumberInternals, $ZodNumberParams, $ZodObject, $ZodObjectConfig, $ZodObjectDef, $ZodObjectInternals, $ZodObjectJIT, $ZodObjectParams, $ZodOptional, $ZodOptionalDef, $ZodOptionalInternals, $ZodOptionalParams, $ZodPipe, $ZodPipeDef, $ZodPipeInternals, $ZodPipeParams, $ZodPrefault, $ZodPrefaultDef, $ZodPrefaultInternals, $ZodPromise, $ZodPromiseDef, $ZodPromiseInternals, $ZodPromiseParams, $ZodRawIssue, $ZodReadonly, $ZodReadonlyDef, $ZodReadonlyInternals, $ZodReadonlyParams, $ZodRealError$1 as $ZodRealError, $ZodRecord, $ZodRecordDef, $ZodRecordInternals, $ZodRecordKey, $ZodRecordParams, $ZodRegistry, $ZodSet, $ZodSetDef, $ZodSetInternals, $ZodSetParams, $ZodShape, $ZodStandardSchema, $ZodString, $ZodStringBoolParams, $ZodStringDef, $ZodStringFormat, $ZodStringFormatChecks, $ZodStringFormatDef, $ZodStringFormatInternals, $ZodStringFormatIssues, $ZodStringFormatParams, $ZodStringFormatTypes, $ZodStringFormats, $ZodStringInternals, $ZodStringParams, $ZodSuccess, $ZodSuccessDef, $ZodSuccessInternals, $ZodSuccessParams, $ZodSuperRefineIssue, $ZodSymbol, $ZodSymbolDef, $ZodSymbolInternals, $ZodSymbolParams, $ZodTemplateLiteral, $ZodTemplateLiteralDef, $ZodTemplateLiteralInternals, $ZodTemplateLiteralParams, $ZodTemplateLiteralPart, $ZodTransform, $ZodTransformDef, $ZodTransformInternals, $ZodTransformParams, $ZodTuple, $ZodTupleDef, $ZodTupleInternals, $ZodTupleParams, $ZodType, $ZodTypeDef, $ZodTypeDiscriminable, $ZodTypeDiscriminableInternals, $ZodTypeInternals, $ZodTypes, $ZodULID, $ZodULIDDef, $ZodULIDInternals, $ZodULIDParams, $ZodURL, $ZodURLDef, $ZodURLInternals, $ZodURLParams, $ZodUUID, $ZodUUIDDef, $ZodUUIDInternals, $ZodUUIDParams, $ZodUUIDv4Params, $ZodUUIDv6Params, $ZodUUIDv7Params, $ZodUndefined, $ZodUndefinedDef, $ZodUndefinedInternals, $ZodUndefinedParams, $ZodUnion, $ZodUnionDef, $ZodUnionInternals, $ZodUnionParams, $ZodUnknown, $ZodUnknownDef, $ZodUnknownInternals, $ZodUnknownParams, $ZodVoid, $ZodVoidDef, $ZodVoidInternals, $ZodVoidParams, $ZodXID, $ZodXIDDef, $ZodXIDInternals, $ZodXIDParams, $ZodXor, $ZodXorInternals, $ZodXorParams, $brand, $catchall, $constructor, $input, $loose, $output, $partial, $replace, $strict, $strip, CheckFn, CheckParams, CheckStringFormatParams, CheckTypeParams, ConcatenateTupleOfStrings, ConvertPartsToStringTuple, Doc, File$1 as File, GlobalMeta, JSONSchema$1 as JSONSchema, JSONSchemaGenerator, JSONSchemaGeneratorParams, JSONSchemaMeta, NEVER, Params, ParseContext$1 as ParseContext, ParseContextInternal, ParsePayload, ProcessParams, Processor, RegistryToJSONSchemaParams, Seen, SomeType, StringFormatParams, TimePrecision, ToJSONSchemaContext, ToJSONSchemaParams, ToTemplateLiteral, TypeParams, ZodStandardJSONSchemaPayload, ZodStandardSchemaWithJSON, _$ZodType, _$ZodTypeInternals, _any, _array, _base64, _base64url, _bigint, _boolean, _catch, _check, _cidrv4, _cidrv6, _coercedBigint, _coercedBoolean, _coercedDate, _coercedNumber, _coercedString, _cuid, _cuid2, _custom, _date, _decode, _decodeAsync, _default$49 as _default, _discriminatedUnion, _e164, _email, _emoji, _encode, _encodeAsync, _endsWith, _enum, _file, _float32, _float64, _gt, _gte, _gte as _min, _guid, _includes, _int, _int32, _int64, _intersection, _ipv4, _ipv6, _isoDate, _isoDateTime, _isoDuration, _isoTime, _jwt, _ksuid, _lazy, _length, _literal, _lowercase, _lt, _lte, _lte as _max, _mac, _map, _maxLength, _maxSize, _mime, _minLength, _minSize, _multipleOf, _nan, _nanoid, _nativeEnum, _negative, _never, _nonnegative, _nonoptional, _nonpositive, _normalize, _null$1 as _null, _nullable, _number, _optional, _overwrite, _parse, _parseAsync, _pipe, _positive, _promise, _property, _readonly, _record, _refine, _regex, _safeDecode, _safeDecodeAsync, _safeEncode, _safeEncodeAsync, _safeParse, _safeParseAsync, _set, _size, _slugify, _startsWith, _string, _stringFormat, _stringbool, _success, _superRefine, _symbol, _templateLiteral, _toLowerCase, _toUpperCase, _transform, _trim, _tuple, _uint32, _uint64, _ulid, _undefined$1 as _undefined, _union, _unknown, _uppercase, _url, _uuid, _uuidv4, _uuidv6, _uuidv7, _void, _xid, _xor, clone, config, createStandardJSONSchemaMethod, createToJSONSchemaMethod, decode, decodeAsync, describe, encode, encodeAsync, extractDefs, finalize, flattenError, formatError, globalConfig, globalRegistry, initializeContext, input$1 as input, isValidBase64, isValidBase64URL, isValidJWT, locales, meta, output$1 as infer, output$1 as output, parse, parseAsync, prettifyError, process, regexes, registry, safeDecode, safeDecodeAsync, safeEncode, safeEncodeAsync, safeParse, safeParseAsync, toDotPath, toJSONSchema, treeifyError, util$1 as util, version }; +} +declare namespace iso { + export { ZodISODate, ZodISODateTime, ZodISODuration, ZodISOTime, date$2 as date, datetime$1 as datetime, duration$1 as duration, time$1 as time }; +} +declare namespace z { + export { $RefinementCtx as RefinementCtx, $ZodErrorMap as ZodErrorMap, $ZodFlattenedError as ZodFlattenedError, $ZodFormattedError as ZodFormattedError, $ZodTypes as ZodFirstPartySchemaTypes, $brand, $input, $output, BRAND$1 as BRAND, GlobalMeta, IssueData$1 as IssueData, NEVER, SafeExtendShape, TimePrecision, ZodAny, ZodArray$1 as ZodArray, ZodBase64, ZodBase64URL, ZodBigInt, ZodBigIntFormat, ZodBoolean, ZodCIDRv4, ZodCIDRv6, ZodCUID, ZodCUID2, ZodCatch$1 as ZodCatch, ZodCodec, ZodCoercedBigInt, ZodCoercedBoolean, ZodCoercedDate, ZodCoercedNumber, ZodCoercedString, ZodCustom, ZodCustomStringFormat, ZodDate, ZodDefault$1 as ZodDefault, ZodDiscriminatedUnion, ZodE164, ZodEmail, ZodEmoji, ZodEnum, ZodError$1 as ZodError, ZodExactOptional, ZodFile, ZodFirstPartyTypeKind$1 as ZodFirstPartyTypeKind, ZodFloat32, ZodFloat64, ZodFunction, ZodGUID, ZodIPv4, ZodIPv6, ZodISODate, ZodISODateTime, ZodISODuration, ZodISOTime, ZodInt, ZodInt32, ZodIntersection$1 as ZodIntersection, ZodIssue$1 as ZodIssue, ZodIssueCode$1 as ZodIssueCode, ZodJSONSchema, ZodJSONSchemaInternals, ZodJWT, ZodKSUID, ZodLazy, ZodLiteral, ZodMAC, ZodMap, ZodNaN, ZodNanoID, ZodNever, ZodNonOptional, ZodNull, ZodNullable$1 as ZodNullable, ZodNumber, ZodNumberFormat, ZodObject, ZodOptional$1 as ZodOptional, ZodPipe, ZodPrefault, ZodPromise$1 as ZodPromise, ZodRawShape, ZodReadonly$1 as ZodReadonly, ZodRealError, ZodRecord, ZodSafeParseError, ZodSafeParseResult, ZodSafeParseSuccess, ZodSet, ZodStandardSchemaWithJSON$1 as ZodStandardSchemaWithJSON, ZodString, ZodStringFormat, ZodSuccess, ZodSymbol, ZodTemplateLiteral, ZodTransform, ZodTuple, ZodType$1 as Schema, ZodType$1 as ZodSchema, ZodType$1 as ZodType, ZodType$1 as ZodTypeAny, ZodUInt32, ZodULID, ZodURL, ZodUUID, ZodUndefined, ZodUnion$1 as ZodUnion, ZodUnknown, ZodVoid, ZodXID, ZodXor, _ZodBigInt, _ZodBoolean, _ZodDate, _ZodNumber, _ZodString, _ZodType, _catch$1 as catch, _default$50 as _default, _endsWith as endsWith, _enum$1 as enum, _function, _function as function, _gt as gt, _gte as gte, _includes as includes, _instanceof as instanceof, _length as length, _lowercase as lowercase, _lt as lt, _lte as lte, _maxLength as maxLength, _maxSize as maxSize, _mime as mime, _minLength as minLength, _minSize as minSize, _multipleOf as multipleOf, _negative as negative, _nonnegative as nonnegative, _nonpositive as nonpositive, _normalize as normalize, _null$2 as null, _overwrite as overwrite, _positive as positive, _property as property, _regex as regex, _size as size, _slugify as slugify, _startsWith as startsWith, _toLowerCase as toLowerCase, _toUpperCase as toUpperCase, _trim as trim, _undefined$2 as undefined, _uppercase as uppercase, _void$1 as void, any, array, base64$1 as base64, base64url$1 as base64url, bigint$1 as bigint, boolean$1 as boolean, check, cidrv4$1 as cidrv4, cidrv6$1 as cidrv6, clone, codec, coerce, config, core, cuid$1 as cuid, cuid2$1 as cuid2, custom, date$1 as date, decode$1 as decode, decodeAsync$1 as decodeAsync, describe$1 as describe, discriminatedUnion, e164$1 as e164, email$1 as email, emoji$1 as emoji, encode$1 as encode, encodeAsync$1 as encodeAsync, exactOptional, file, flattenError, float32, float64, formatError, fromJSONSchema, getErrorMap, globalRegistry, guid$1 as guid, hash, hex$1 as hex, hostname$1 as hostname, httpUrl, inferFlattenedErrors, inferFormattedError, input$1 as input, int, int32, int64, intersection, ipv4$1 as ipv4, ipv6$1 as ipv6, iso, json, jwt, keyof, ksuid$1 as ksuid, lazy, literal, locales, looseObject, looseRecord, mac$1 as mac, map, meta$1 as meta, nan, nanoid$1 as nanoid, nativeEnum, never, nonoptional, nullable, nullish$1 as nullish, number$1 as number, object, optional, output$1 as Infer, output$1 as TypeOf, output$1 as infer, output$1 as output, parse$1 as parse, parseAsync$1 as parseAsync, partialRecord, pipe, prefault, preprocess, prettifyError, promise, readonly, record, refine, regexes, registry, safeDecode$1 as safeDecode, safeDecodeAsync$1 as safeDecodeAsync, safeEncode$1 as safeEncode, safeEncodeAsync$1 as safeEncodeAsync, safeParse$1 as safeParse, safeParseAsync$1 as safeParseAsync, set, setErrorMap, strictObject, string$1 as string, stringFormat, stringbool, success, superRefine, symbol, templateLiteral, toJSONSchema, transform, treeifyError, tuple, uint32, uint64, ulid$1 as ulid, union, unknown, url, util$1 as util, uuid$1 as uuid, uuidv4, uuidv6, uuidv7, xid$1 as xid, xor }; +} + +export { + z, +}; + +export {}; + +// Curated ambient declarations for runtime globals an author can reference from a +// `.ts` tool file without a per-trailmap `globals.d.ts` shim. Appended to +// `dist/index.d.ts` by `bundleTrailblazeSdkDts` — see [TrailblazeSdkDtsBundlePlugin]. +// +// Scope. Authors target two runtimes through the same `.ts` source: the host-side +// subprocess (bun / Node) and the on-device QuickJS bundle. The host has everything +// declared here natively; on-device gets a smaller, framework-installed subset +// (`console.*` and `AbortController` are real shims in +// `trailblaze-bundle-prelude.js`; `URL`, `setTimeout`, `fetch` are NOT — using them +// from an on-device-eligible tool will fail at runtime). The type system declares +// the union — the framework's Phase-D host-only marker (and the `.js`-on-device +// hard error) handles routing. +// +// What's deliberately NOT declared: `document`, `window`, `navigator`, +// `localStorage`, and the rest of the DOM lib. Declaring them would tempt authors +// into code that fails on every runtime we actually ship. +// +// The list mirrors what the bundled MCP SDK uses internally plus the most common +// author requests (URL hostname parsing per CodeQL, basic fetch, timer-based +// retries). Expand carefully — every entry here is a future ABI promise. + +declare global { + // ---- URL / URLSearchParams ---- + + interface URLSearchParams { + append(name: string, value: string): void; + delete(name: string): void; + get(name: string): string | null; + getAll(name: string): string[]; + has(name: string): boolean; + set(name: string, value: string): void; + sort(): void; + toString(): string; + forEach( + callback: (value: string, key: string, parent: URLSearchParams) => void, + ): void; + keys(): IterableIterator<string>; + values(): IterableIterator<string>; + entries(): IterableIterator<[string, string]>; + [Symbol.iterator](): IterableIterator<[string, string]>; + } + var URLSearchParams: { + prototype: URLSearchParams; + new ( + init?: string | Record<string, string> | string[][] | URLSearchParams, + ): URLSearchParams; + }; + + interface URL { + hash: string; + host: string; + hostname: string; + href: string; + readonly origin: string; + password: string; + pathname: string; + port: string; + protocol: string; + search: string; + readonly searchParams: URLSearchParams; + username: string; + toString(): string; + toJSON(): string; + } + var URL: { + prototype: URL; + new (input: string | URL, base?: string | URL): URL; + canParse(input: string | URL, base?: string | URL): boolean; + }; + + // ---- AbortController / AbortSignal ---- + // + // Real on-device today (shimmed by `trailblaze-bundle-prelude.js`). The shim covers + // the constructor, `.signal.aborted`, `.signal.reason`, `addEventListener("abort", + // …)`, `removeEventListener`, `dispatchEvent`, `throwIfAborted`; it does NOT cover + // the static `AbortSignal.timeout` / `AbortSignal.any` / `AbortSignal.abort`. The + // typed surface declares them for host-side parity — host bun / Node has them. + + interface Event { + readonly type: string; + readonly target: unknown; + readonly currentTarget: unknown; + } + type AbortSignalEventMap = { abort: Event }; + interface AbortSignal { + readonly aborted: boolean; + readonly reason: unknown; + throwIfAborted(): void; + onabort: ((this: AbortSignal, ev: Event) => unknown) | null; + addEventListener<K extends keyof AbortSignalEventMap>( + type: K, + listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => unknown, + ): void; + removeEventListener<K extends keyof AbortSignalEventMap>( + type: K, + listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => unknown, + ): void; + dispatchEvent(event: Event): boolean; + } + // No `new (): AbortSignal` overload — `AbortSignal` is NOT constructible at runtime + // in bun / Node (it throws an "Illegal constructor" TypeError). Authors who need a + // standalone signal should use the static `AbortSignal.abort()` / `.timeout()` / + // `.any()` factories or read `signal` off an `AbortController`. Declaring `new ()` + // here would let `.ts` code type-check and then explode on first execution. + var AbortSignal: { + prototype: AbortSignal; + abort(reason?: unknown): AbortSignal; + timeout(milliseconds: number): AbortSignal; + any(signals: AbortSignal[]): AbortSignal; + }; + interface AbortController { + readonly signal: AbortSignal; + abort(reason?: unknown): void; + } + var AbortController: { + prototype: AbortController; + new (): AbortController; + }; + + // ---- console ---- + // + // Real on-device (the prelude routes each method through Kotlin → logcat). On + // host, bun's / Node's built-in `console`. The declared surface is the lowest + // common denominator — five level methods, all variadic. + + interface Console { + log(...args: unknown[]): void; + info(...args: unknown[]): void; + warn(...args: unknown[]): void; + error(...args: unknown[]): void; + debug(...args: unknown[]): void; + } + var console: Console; + + // ---- Timers ---- + // + // Host-only at runtime — QuickJS has no `setTimeout`. The on-device hard-error for + // `.js` tools combined with Phase-D host-only routing keeps this from biting; the + // type declaration is for authors writing host-side retry / debounce code. + // + // **Why `TimeoutHandle` instead of `number`.** Browsers and bun return `number`; + // Node returns a `Timeout` object. Declaring the return as `number` (or as + // `Timeout`) over-promises one runtime and breaks the other — author code that + // does `if (handle > 0) …` would type-check against `number` but crash on Node, + // and author code that touches `.unref()` would type-check against `Timeout` but + // crash on bun. The opaque interface here is the lowest common denominator: it + // accepts both runtime values, and the only thing TypeScript will let an author + // do with one is pass it back to `clearTimeout` — which is the only thing both + // runtimes actually guarantee. + + // Nominal-brand opaque interface. The `?: never` property defeats structural + // assignability from the runtime values (`number` on bun, `Timeout` on Node, + // neither carries this property), so an honest author can't accidentally + // narrow `TimeoutHandle` to a usable shape. An adversarial author who writes + // `const fake: TimeoutHandle = { __trailblazeTimeoutHandleBrand: undefined }` + // CAN bypass it — the point isn't sandboxing, it's preventing the accidental + // `if (handle > 0)` foot-gun. + interface TimeoutHandle { + readonly __trailblazeTimeoutHandleBrand?: never; + } + + function setTimeout( + handler: (...args: unknown[]) => unknown, + timeout?: number, + ...args: unknown[] + ): TimeoutHandle; + function clearTimeout(handle: TimeoutHandle | undefined): void; + + // ---- DOMException ---- + // + // Used by AbortController-flavored failures and a handful of fetch error paths. + // Both host (bun / Node) and the on-device shim throw real Error subclasses, so + // authors mostly read `.name` / `.message`; the declared shape is intentionally + // minimal. + + interface DOMException extends Error { + readonly name: string; + readonly message: string; + readonly code: number; + } + var DOMException: { + prototype: DOMException; + new (message?: string, name?: string): DOMException; + }; + + // ---- fetch / Request / Response / Headers ---- + // + // Host-only at runtime; on-device `client.callTool` takes the + // `__trailblazeCallback` binding instead of `fetch`. The shapes below cover the + // subset of WHATWG fetch most tool authors need: GET / POST with a JSON body, + // headers, an `AbortSignal`, and `.text()` / `.json()` / `.arrayBuffer()` on the + // response. The streaming surface (`body`, `ReadableStream`) is declared loosely + // so authors who reach for it get autocomplete without us pulling in the full + // DOM lib. + // + // **Why hand-authored instead of pulled from `@types/node`.** `@types/node` is a + // devDependency of `@trailblaze/scripting` itself but is NOT visible to trailmap + // authors — the per-trailmap `tsconfig.json` has `lib: ["ES2022"]` only, with the + // SDK declaration bundle as the `paths`-mapped source of `@trailblaze/scripting`. + // Pulling fetch types from `@types/node` would either force every trailmap to install + // it (bloating the trailmap-typing setup) or require the bundle to inline them via + // dts-bundle-generator's `--external-inlines` (which works but conflates host-only + // runtime types with the bundle's main mission of MCP-SDK + zod inlines). The + // hand-authored declarations are a curated subset deliberately kept narrower than + // upstream; if WHATWG fetch drifts in a way that breaks an author's code, the fix + // is to update this file rather than chase the upstream type churn. + + type HeadersInit = Headers | string[][] | Record<string, string>; + type BodyInit = + | string + | ArrayBuffer + | ArrayBufferView + | URLSearchParams + | ReadableStream<Uint8Array>; + + interface Headers { + append(name: string, value: string): void; + delete(name: string): void; + get(name: string): string | null; + has(name: string): boolean; + set(name: string, value: string): void; + forEach( + callback: (value: string, key: string, parent: Headers) => void, + ): void; + keys(): IterableIterator<string>; + values(): IterableIterator<string>; + entries(): IterableIterator<[string, string]>; + [Symbol.iterator](): IterableIterator<[string, string]>; + } + var Headers: { + prototype: Headers; + new (init?: HeadersInit): Headers; + }; + + interface ReadableStream<R = unknown> { + getReader(): unknown; + cancel(reason?: unknown): Promise<void>; + [Symbol.asyncIterator](): AsyncIterableIterator<R>; + } + + interface RequestInit { + method?: string; + headers?: HeadersInit; + body?: BodyInit | null; + // WHATWG fetch normalizes a missing signal to a never-aborted signal; the + // resulting `Request.signal` is always non-null. Declaring `signal: AbortSignal + // | null` here would falsely encourage author code like `req.signal === null`, + // which type-checks but never matches at runtime. + signal?: AbortSignal; + redirect?: "follow" | "error" | "manual"; + credentials?: "omit" | "same-origin" | "include"; + cache?: string; + referrer?: string; + integrity?: string; + keepalive?: boolean; + mode?: string; + } + interface Request { + readonly method: string; + readonly url: string; + readonly headers: Headers; + readonly body: ReadableStream<Uint8Array> | null; + readonly bodyUsed: boolean; + readonly signal: AbortSignal; + clone(): Request; + text(): Promise<string>; + json(): Promise<unknown>; + arrayBuffer(): Promise<ArrayBuffer>; + } + var Request: { + prototype: Request; + new (input: string | URL | Request, init?: RequestInit): Request; + }; + + interface ResponseInit { + status?: number; + statusText?: string; + headers?: HeadersInit; + } + interface Response { + readonly status: number; + readonly statusText: string; + readonly ok: boolean; + readonly headers: Headers; + readonly url: string; + readonly redirected: boolean; + readonly type: string; + readonly body: ReadableStream<Uint8Array> | null; + readonly bodyUsed: boolean; + clone(): Response; + text(): Promise<string>; + json(): Promise<unknown>; + arrayBuffer(): Promise<ArrayBuffer>; + } + var Response: { + prototype: Response; + new (body?: BodyInit | null, init?: ResponseInit): Response; + error(): Response; + json(data: unknown, init?: ResponseInit): Response; + redirect(url: string | URL, status?: number): Response; + }; + + function fetch( + input: string | URL | Request, + init?: RequestInit, + ): Promise<Response>; +} + +export {}; diff --git a/examples/wikipedia/trails/.trailblaze/sdk/dist/index.js b/examples/wikipedia/trails/.trailblaze/sdk/dist/index.js new file mode 100644 index 000000000..168306c21 --- /dev/null +++ b/examples/wikipedia/trails/.trailblaze/sdk/dist/index.js @@ -0,0 +1,31848 @@ +/* GENERATED FILE — do not hand-edit. Source: sdks/typescript/src/. Regenerate with ./gradlew :trailblaze-models:bundleTrailblazeSdkDts */ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/ajv/dist/compile/codegen/code.js +var require_code = __commonJS({ + "node_modules/ajv/dist/compile/codegen/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.regexpCode = exports.getEsmExportName = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; + var _CodeOrName = class { + }; + exports._CodeOrName = _CodeOrName; + exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; + var Name = class extends _CodeOrName { + constructor(s) { + super(); + if (!exports.IDENTIFIER.test(s)) + throw new Error("CodeGen: name must be a valid identifier"); + this.str = s; + } + toString() { + return this.str; + } + emptyStr() { + return false; + } + get names() { + return { [this.str]: 1 }; + } + }; + exports.Name = Name; + var _Code = class extends _CodeOrName { + constructor(code) { + super(); + this._items = typeof code === "string" ? [code] : code; + } + toString() { + return this.str; + } + emptyStr() { + if (this._items.length > 1) + return false; + const item = this._items[0]; + return item === "" || item === '""'; + } + get str() { + var _a2; + return (_a2 = this._str) !== null && _a2 !== void 0 ? _a2 : this._str = this._items.reduce((s, c) => `${s}${c}`, ""); + } + get names() { + var _a2; + return (_a2 = this._names) !== null && _a2 !== void 0 ? _a2 : this._names = this._items.reduce((names, c) => { + if (c instanceof Name) + names[c.str] = (names[c.str] || 0) + 1; + return names; + }, {}); + } + }; + exports._Code = _Code; + exports.nil = new _Code(""); + function _(strs, ...args) { + const code = [strs[0]]; + let i = 0; + while (i < args.length) { + addCodeArg(code, args[i]); + code.push(strs[++i]); + } + return new _Code(code); + } + exports._ = _; + var plus = new _Code("+"); + function str(strs, ...args) { + const expr = [safeStringify2(strs[0])]; + let i = 0; + while (i < args.length) { + expr.push(plus); + addCodeArg(expr, args[i]); + expr.push(plus, safeStringify2(strs[++i])); + } + optimize(expr); + return new _Code(expr); + } + exports.str = str; + function addCodeArg(code, arg) { + if (arg instanceof _Code) + code.push(...arg._items); + else if (arg instanceof Name) + code.push(arg); + else + code.push(interpolate(arg)); + } + exports.addCodeArg = addCodeArg; + function optimize(expr) { + let i = 1; + while (i < expr.length - 1) { + if (expr[i] === plus) { + const res = mergeExprItems(expr[i - 1], expr[i + 1]); + if (res !== void 0) { + expr.splice(i - 1, 3, res); + continue; + } + expr[i++] = "+"; + } + i++; + } + } + function mergeExprItems(a, b) { + if (b === '""') + return a; + if (a === '""') + return b; + if (typeof a == "string") { + if (b instanceof Name || a[a.length - 1] !== '"') + return; + if (typeof b != "string") + return `${a.slice(0, -1)}${b}"`; + if (b[0] === '"') + return a.slice(0, -1) + b.slice(1); + return; + } + if (typeof b == "string" && b[0] === '"' && !(a instanceof Name)) + return `"${a}${b.slice(1)}`; + return; + } + function strConcat(c1, c2) { + return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`; + } + exports.strConcat = strConcat; + function interpolate(x) { + return typeof x == "number" || typeof x == "boolean" || x === null ? x : safeStringify2(Array.isArray(x) ? x.join(",") : x); + } + function stringify(x) { + return new _Code(safeStringify2(x)); + } + exports.stringify = stringify; + function safeStringify2(x) { + return JSON.stringify(x).replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029"); + } + exports.safeStringify = safeStringify2; + function getProperty(key) { + return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _`[${key}]`; + } + exports.getProperty = getProperty; + function getEsmExportName(key) { + if (typeof key == "string" && exports.IDENTIFIER.test(key)) { + return new _Code(`${key}`); + } + throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`); + } + exports.getEsmExportName = getEsmExportName; + function regexpCode(rx) { + return new _Code(rx.toString()); + } + exports.regexpCode = regexpCode; + } +}); + +// node_modules/ajv/dist/compile/codegen/scope.js +var require_scope = __commonJS({ + "node_modules/ajv/dist/compile/codegen/scope.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; + var code_1 = require_code(); + var ValueError = class extends Error { + constructor(name) { + super(`CodeGen: "code" for ${name} not defined`); + this.value = name.value; + } + }; + var UsedValueState; + (function(UsedValueState2) { + UsedValueState2[UsedValueState2["Started"] = 0] = "Started"; + UsedValueState2[UsedValueState2["Completed"] = 1] = "Completed"; + })(UsedValueState || (exports.UsedValueState = UsedValueState = {})); + exports.varKinds = { + const: new code_1.Name("const"), + let: new code_1.Name("let"), + var: new code_1.Name("var") + }; + var Scope = class { + constructor({ prefixes, parent } = {}) { + this._names = {}; + this._prefixes = prefixes; + this._parent = parent; + } + toName(nameOrPrefix) { + return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); + } + name(prefix) { + return new code_1.Name(this._newName(prefix)); + } + _newName(prefix) { + const ng = this._names[prefix] || this._nameGroup(prefix); + return `${prefix}${ng.index++}`; + } + _nameGroup(prefix) { + var _a2, _b; + if (((_b = (_a2 = this._parent) === null || _a2 === void 0 ? void 0 : _a2._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || this._prefixes && !this._prefixes.has(prefix)) { + throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); + } + return this._names[prefix] = { prefix, index: 0 }; + } + }; + exports.Scope = Scope; + var ValueScopeName = class extends code_1.Name { + constructor(prefix, nameStr) { + super(nameStr); + this.prefix = prefix; + } + setValue(value, { property, itemIndex }) { + this.value = value; + this.scopePath = (0, code_1._)`.${new code_1.Name(property)}[${itemIndex}]`; + } + }; + exports.ValueScopeName = ValueScopeName; + var line = (0, code_1._)`\n`; + var ValueScope = class extends Scope { + constructor(opts) { + super(opts); + this._values = {}; + this._scope = opts.scope; + this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; + } + get() { + return this._scope; + } + name(prefix) { + return new ValueScopeName(prefix, this._newName(prefix)); + } + value(nameOrPrefix, value) { + var _a2; + if (value.ref === void 0) + throw new Error("CodeGen: ref must be passed in value"); + const name = this.toName(nameOrPrefix); + const { prefix } = name; + const valueKey = (_a2 = value.key) !== null && _a2 !== void 0 ? _a2 : value.ref; + let vs = this._values[prefix]; + if (vs) { + const _name = vs.get(valueKey); + if (_name) + return _name; + } else { + vs = this._values[prefix] = /* @__PURE__ */ new Map(); + } + vs.set(valueKey, name); + const s = this._scope[prefix] || (this._scope[prefix] = []); + const itemIndex = s.length; + s[itemIndex] = value.ref; + name.setValue(value, { property: prefix, itemIndex }); + return name; + } + getValue(prefix, keyOrRef) { + const vs = this._values[prefix]; + if (!vs) + return; + return vs.get(keyOrRef); + } + scopeRefs(scopeName, values = this._values) { + return this._reduceValues(values, (name) => { + if (name.scopePath === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return (0, code_1._)`${scopeName}${name.scopePath}`; + }); + } + scopeCode(values = this._values, usedValues, getCode) { + return this._reduceValues(values, (name) => { + if (name.value === void 0) + throw new Error(`CodeGen: name "${name}" has no value`); + return name.value.code; + }, usedValues, getCode); + } + _reduceValues(values, valueCode, usedValues = {}, getCode) { + let code = code_1.nil; + for (const prefix in values) { + const vs = values[prefix]; + if (!vs) + continue; + const nameSet = usedValues[prefix] = usedValues[prefix] || /* @__PURE__ */ new Map(); + vs.forEach((name) => { + if (nameSet.has(name)) + return; + nameSet.set(name, UsedValueState.Started); + let c = valueCode(name); + if (c) { + const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; + code = (0, code_1._)`${code}${def} ${name} = ${c};${this.opts._n}`; + } else if (c = getCode === null || getCode === void 0 ? void 0 : getCode(name)) { + code = (0, code_1._)`${code}${c}${this.opts._n}`; + } else { + throw new ValueError(name); + } + nameSet.set(name, UsedValueState.Completed); + }); + } + return code; + } + }; + exports.ValueScope = ValueScope; + } +}); + +// node_modules/ajv/dist/compile/codegen/index.js +var require_codegen = __commonJS({ + "node_modules/ajv/dist/compile/codegen/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; + var code_1 = require_code(); + var scope_1 = require_scope(); + var code_2 = require_code(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return code_2._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return code_2.str; + } }); + Object.defineProperty(exports, "strConcat", { enumerable: true, get: function() { + return code_2.strConcat; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return code_2.nil; + } }); + Object.defineProperty(exports, "getProperty", { enumerable: true, get: function() { + return code_2.getProperty; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return code_2.stringify; + } }); + Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function() { + return code_2.regexpCode; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return code_2.Name; + } }); + var scope_2 = require_scope(); + Object.defineProperty(exports, "Scope", { enumerable: true, get: function() { + return scope_2.Scope; + } }); + Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function() { + return scope_2.ValueScope; + } }); + Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function() { + return scope_2.ValueScopeName; + } }); + Object.defineProperty(exports, "varKinds", { enumerable: true, get: function() { + return scope_2.varKinds; + } }); + exports.operators = { + GT: new code_1._Code(">"), + GTE: new code_1._Code(">="), + LT: new code_1._Code("<"), + LTE: new code_1._Code("<="), + EQ: new code_1._Code("==="), + NEQ: new code_1._Code("!=="), + NOT: new code_1._Code("!"), + OR: new code_1._Code("||"), + AND: new code_1._Code("&&"), + ADD: new code_1._Code("+") + }; + var Node = class { + optimizeNodes() { + return this; + } + optimizeNames(_names, _constants) { + return this; + } + }; + var Def = class extends Node { + constructor(varKind, name, rhs) { + super(); + this.varKind = varKind; + this.name = name; + this.rhs = rhs; + } + render({ es5, _n }) { + const varKind = es5 ? scope_1.varKinds.var : this.varKind; + const rhs = this.rhs === void 0 ? "" : ` = ${this.rhs}`; + return `${varKind} ${this.name}${rhs};` + _n; + } + optimizeNames(names, constants) { + if (!names[this.name.str]) + return; + if (this.rhs) + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; + } + }; + var Assign = class extends Node { + constructor(lhs, rhs, sideEffects) { + super(); + this.lhs = lhs; + this.rhs = rhs; + this.sideEffects = sideEffects; + } + render({ _n }) { + return `${this.lhs} = ${this.rhs};` + _n; + } + optimizeNames(names, constants) { + if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) + return; + this.rhs = optimizeExpr(this.rhs, names, constants); + return this; + } + get names() { + const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; + return addExprNames(names, this.rhs); + } + }; + var AssignOp = class extends Assign { + constructor(lhs, op, rhs, sideEffects) { + super(lhs, rhs, sideEffects); + this.op = op; + } + render({ _n }) { + return `${this.lhs} ${this.op}= ${this.rhs};` + _n; + } + }; + var Label = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + return `${this.label}:` + _n; + } + }; + var Break = class extends Node { + constructor(label) { + super(); + this.label = label; + this.names = {}; + } + render({ _n }) { + const label = this.label ? ` ${this.label}` : ""; + return `break${label};` + _n; + } + }; + var Throw = class extends Node { + constructor(error48) { + super(); + this.error = error48; + } + render({ _n }) { + return `throw ${this.error};` + _n; + } + get names() { + return this.error.names; + } + }; + var AnyCode = class extends Node { + constructor(code) { + super(); + this.code = code; + } + render({ _n }) { + return `${this.code};` + _n; + } + optimizeNodes() { + return `${this.code}` ? this : void 0; + } + optimizeNames(names, constants) { + this.code = optimizeExpr(this.code, names, constants); + return this; + } + get names() { + return this.code instanceof code_1._CodeOrName ? this.code.names : {}; + } + }; + var ParentNode = class extends Node { + constructor(nodes = []) { + super(); + this.nodes = nodes; + } + render(opts) { + return this.nodes.reduce((code, n) => code + n.render(opts), ""); + } + optimizeNodes() { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i].optimizeNodes(); + if (Array.isArray(n)) + nodes.splice(i, 1, ...n); + else if (n) + nodes[i] = n; + else + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + optimizeNames(names, constants) { + const { nodes } = this; + let i = nodes.length; + while (i--) { + const n = nodes[i]; + if (n.optimizeNames(names, constants)) + continue; + subtractNames(names, n.names); + nodes.splice(i, 1); + } + return nodes.length > 0 ? this : void 0; + } + get names() { + return this.nodes.reduce((names, n) => addNames(names, n.names), {}); + } + }; + var BlockNode = class extends ParentNode { + render(opts) { + return "{" + opts._n + super.render(opts) + "}" + opts._n; + } + }; + var Root = class extends ParentNode { + }; + var Else = class extends BlockNode { + }; + Else.kind = "else"; + var If = class _If extends BlockNode { + constructor(condition, nodes) { + super(nodes); + this.condition = condition; + } + render(opts) { + let code = `if(${this.condition})` + super.render(opts); + if (this.else) + code += "else " + this.else.render(opts); + return code; + } + optimizeNodes() { + super.optimizeNodes(); + const cond = this.condition; + if (cond === true) + return this.nodes; + let e = this.else; + if (e) { + const ns = e.optimizeNodes(); + e = this.else = Array.isArray(ns) ? new Else(ns) : ns; + } + if (e) { + if (cond === false) + return e instanceof _If ? e : e.nodes; + if (this.nodes.length) + return this; + return new _If(not(cond), e instanceof _If ? [e] : e.nodes); + } + if (cond === false || !this.nodes.length) + return void 0; + return this; + } + optimizeNames(names, constants) { + var _a2; + this.else = (_a2 = this.else) === null || _a2 === void 0 ? void 0 : _a2.optimizeNames(names, constants); + if (!(super.optimizeNames(names, constants) || this.else)) + return; + this.condition = optimizeExpr(this.condition, names, constants); + return this; + } + get names() { + const names = super.names; + addExprNames(names, this.condition); + if (this.else) + addNames(names, this.else.names); + return names; + } + }; + If.kind = "if"; + var For = class extends BlockNode { + }; + For.kind = "for"; + var ForLoop = class extends For { + constructor(iteration) { + super(); + this.iteration = iteration; + } + render(opts) { + return `for(${this.iteration})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iteration = optimizeExpr(this.iteration, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iteration.names); + } + }; + var ForRange = class extends For { + constructor(varKind, name, from, to) { + super(); + this.varKind = varKind; + this.name = name; + this.from = from; + this.to = to; + } + render(opts) { + const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; + const { name, from, to } = this; + return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); + } + get names() { + const names = addExprNames(super.names, this.from); + return addExprNames(names, this.to); + } + }; + var ForIter = class extends For { + constructor(loop, varKind, name, iterable) { + super(); + this.loop = loop; + this.varKind = varKind; + this.name = name; + this.iterable = iterable; + } + render(opts) { + return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); + } + optimizeNames(names, constants) { + if (!super.optimizeNames(names, constants)) + return; + this.iterable = optimizeExpr(this.iterable, names, constants); + return this; + } + get names() { + return addNames(super.names, this.iterable.names); + } + }; + var Func = class extends BlockNode { + constructor(name, args, async) { + super(); + this.name = name; + this.args = args; + this.async = async; + } + render(opts) { + const _async = this.async ? "async " : ""; + return `${_async}function ${this.name}(${this.args})` + super.render(opts); + } + }; + Func.kind = "func"; + var Return = class extends ParentNode { + render(opts) { + return "return " + super.render(opts); + } + }; + Return.kind = "return"; + var Try = class extends BlockNode { + render(opts) { + let code = "try" + super.render(opts); + if (this.catch) + code += this.catch.render(opts); + if (this.finally) + code += this.finally.render(opts); + return code; + } + optimizeNodes() { + var _a2, _b; + super.optimizeNodes(); + (_a2 = this.catch) === null || _a2 === void 0 ? void 0 : _a2.optimizeNodes(); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); + return this; + } + optimizeNames(names, constants) { + var _a2, _b; + super.optimizeNames(names, constants); + (_a2 = this.catch) === null || _a2 === void 0 ? void 0 : _a2.optimizeNames(names, constants); + (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); + return this; + } + get names() { + const names = super.names; + if (this.catch) + addNames(names, this.catch.names); + if (this.finally) + addNames(names, this.finally.names); + return names; + } + }; + var Catch = class extends BlockNode { + constructor(error48) { + super(); + this.error = error48; + } + render(opts) { + return `catch(${this.error})` + super.render(opts); + } + }; + Catch.kind = "catch"; + var Finally = class extends BlockNode { + render(opts) { + return "finally" + super.render(opts); + } + }; + Finally.kind = "finally"; + var CodeGen = class { + constructor(extScope, opts = {}) { + this._values = {}; + this._blockStarts = []; + this._constants = {}; + this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; + this._extScope = extScope; + this._scope = new scope_1.Scope({ parent: extScope }); + this._nodes = [new Root()]; + } + toString() { + return this._root.render(this.opts); + } + // returns unique name in the internal scope + name(prefix) { + return this._scope.name(prefix); + } + // reserves unique name in the external scope + scopeName(prefix) { + return this._extScope.name(prefix); + } + // reserves unique name in the external scope and assigns value to it + scopeValue(prefixOrName, value) { + const name = this._extScope.value(prefixOrName, value); + const vs = this._values[name.prefix] || (this._values[name.prefix] = /* @__PURE__ */ new Set()); + vs.add(name); + return name; + } + getScopeValue(prefix, keyOrRef) { + return this._extScope.getValue(prefix, keyOrRef); + } + // return code that assigns values in the external scope to the names that are used internally + // (same names that were returned by gen.scopeName or gen.scopeValue) + scopeRefs(scopeName) { + return this._extScope.scopeRefs(scopeName, this._values); + } + scopeCode() { + return this._extScope.scopeCode(this._values); + } + _def(varKind, nameOrPrefix, rhs, constant) { + const name = this._scope.toName(nameOrPrefix); + if (rhs !== void 0 && constant) + this._constants[name.str] = rhs; + this._leafNode(new Def(varKind, name, rhs)); + return name; + } + // `const` declaration (`var` in es5 mode) + const(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); + } + // `let` declaration with optional assignment (`var` in es5 mode) + let(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); + } + // `var` declaration with optional assignment + var(nameOrPrefix, rhs, _constant) { + return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); + } + // assignment code + assign(lhs, rhs, sideEffects) { + return this._leafNode(new Assign(lhs, rhs, sideEffects)); + } + // `+=` code + add(lhs, rhs) { + return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); + } + // appends passed SafeExpr to code or executes Block + code(c) { + if (typeof c == "function") + c(); + else if (c !== code_1.nil) + this._leafNode(new AnyCode(c)); + return this; + } + // returns code for object literal for the passed argument list of key-value pairs + object(...keyValues) { + const code = ["{"]; + for (const [key, value] of keyValues) { + if (code.length > 1) + code.push(","); + code.push(key); + if (key !== value || this.opts.es5) { + code.push(":"); + (0, code_1.addCodeArg)(code, value); + } + } + code.push("}"); + return new code_1._Code(code); + } + // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) + if(condition, thenBody, elseBody) { + this._blockNode(new If(condition)); + if (thenBody && elseBody) { + this.code(thenBody).else().code(elseBody).endIf(); + } else if (thenBody) { + this.code(thenBody).endIf(); + } else if (elseBody) { + throw new Error('CodeGen: "else" body without "then" body'); + } + return this; + } + // `else if` clause - invalid without `if` or after `else` clauses + elseIf(condition) { + return this._elseNode(new If(condition)); + } + // `else` clause - only valid after `if` or `else if` clauses + else() { + return this._elseNode(new Else()); + } + // end `if` statement (needed if gen.if was used only with condition) + endIf() { + return this._endBlockNode(If, Else); + } + _for(node, forBody) { + this._blockNode(node); + if (forBody) + this.code(forBody).endFor(); + return this; + } + // a generic `for` clause (or statement if `forBody` is passed) + for(iteration, forBody) { + return this._for(new ForLoop(iteration), forBody); + } + // `for` statement for a range of values + forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); + } + // `for-of` statement (in es5 mode replace with a normal for loop) + forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { + const name = this._scope.toName(nameOrPrefix); + if (this.opts.es5) { + const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); + return this.forRange("_i", 0, (0, code_1._)`${arr}.length`, (i) => { + this.var(name, (0, code_1._)`${arr}[${i}]`); + forBody(name); + }); + } + return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); + } + // `for-in` statement. + // With option `ownProperties` replaced with a `for-of` loop for object keys + forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { + if (this.opts.ownProperties) { + return this.forOf(nameOrPrefix, (0, code_1._)`Object.keys(${obj})`, forBody); + } + const name = this._scope.toName(nameOrPrefix); + return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); + } + // end `for` loop + endFor() { + return this._endBlockNode(For); + } + // `label` statement + label(label) { + return this._leafNode(new Label(label)); + } + // `break` statement + break(label) { + return this._leafNode(new Break(label)); + } + // `return` statement + return(value) { + const node = new Return(); + this._blockNode(node); + this.code(value); + if (node.nodes.length !== 1) + throw new Error('CodeGen: "return" should have one node'); + return this._endBlockNode(Return); + } + // `try` statement + try(tryBody, catchCode, finallyCode) { + if (!catchCode && !finallyCode) + throw new Error('CodeGen: "try" without "catch" and "finally"'); + const node = new Try(); + this._blockNode(node); + this.code(tryBody); + if (catchCode) { + const error48 = this.name("e"); + this._currNode = node.catch = new Catch(error48); + catchCode(error48); + } + if (finallyCode) { + this._currNode = node.finally = new Finally(); + this.code(finallyCode); + } + return this._endBlockNode(Catch, Finally); + } + // `throw` statement + throw(error48) { + return this._leafNode(new Throw(error48)); + } + // start self-balancing block + block(body, nodeCount) { + this._blockStarts.push(this._nodes.length); + if (body) + this.code(body).endBlock(nodeCount); + return this; + } + // end the current self-balancing block + endBlock(nodeCount) { + const len = this._blockStarts.pop(); + if (len === void 0) + throw new Error("CodeGen: not in self-balancing block"); + const toClose = this._nodes.length - len; + if (toClose < 0 || nodeCount !== void 0 && toClose !== nodeCount) { + throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); + } + this._nodes.length = len; + return this; + } + // `function` heading (or definition if funcBody is passed) + func(name, args = code_1.nil, async, funcBody) { + this._blockNode(new Func(name, args, async)); + if (funcBody) + this.code(funcBody).endFunc(); + return this; + } + // end function definition + endFunc() { + return this._endBlockNode(Func); + } + optimize(n = 1) { + while (n-- > 0) { + this._root.optimizeNodes(); + this._root.optimizeNames(this._root.names, this._constants); + } + } + _leafNode(node) { + this._currNode.nodes.push(node); + return this; + } + _blockNode(node) { + this._currNode.nodes.push(node); + this._nodes.push(node); + } + _endBlockNode(N1, N2) { + const n = this._currNode; + if (n instanceof N1 || N2 && n instanceof N2) { + this._nodes.pop(); + return this; + } + throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); + } + _elseNode(node) { + const n = this._currNode; + if (!(n instanceof If)) { + throw new Error('CodeGen: "else" without "if"'); + } + this._currNode = n.else = node; + return this; + } + get _root() { + return this._nodes[0]; + } + get _currNode() { + const ns = this._nodes; + return ns[ns.length - 1]; + } + set _currNode(node) { + const ns = this._nodes; + ns[ns.length - 1] = node; + } + }; + exports.CodeGen = CodeGen; + function addNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) + (from[n] || 0); + return names; + } + function addExprNames(names, from) { + return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; + } + function optimizeExpr(expr, names, constants) { + if (expr instanceof code_1.Name) + return replaceName(expr); + if (!canOptimize(expr)) + return expr; + return new code_1._Code(expr._items.reduce((items, c) => { + if (c instanceof code_1.Name) + c = replaceName(c); + if (c instanceof code_1._Code) + items.push(...c._items); + else + items.push(c); + return items; + }, [])); + function replaceName(n) { + const c = constants[n.str]; + if (c === void 0 || names[n.str] !== 1) + return n; + delete names[n.str]; + return c; + } + function canOptimize(e) { + return e instanceof code_1._Code && e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== void 0); + } + } + function subtractNames(names, from) { + for (const n in from) + names[n] = (names[n] || 0) - (from[n] || 0); + } + function not(x) { + return typeof x == "boolean" || typeof x == "number" || x === null ? !x : (0, code_1._)`!${par(x)}`; + } + exports.not = not; + var andCode = mappend(exports.operators.AND); + function and(...args) { + return args.reduce(andCode); + } + exports.and = and; + var orCode = mappend(exports.operators.OR); + function or(...args) { + return args.reduce(orCode); + } + exports.or = or; + function mappend(op) { + return (x, y) => x === code_1.nil ? y : y === code_1.nil ? x : (0, code_1._)`${par(x)} ${op} ${par(y)}`; + } + function par(x) { + return x instanceof code_1.Name ? x : (0, code_1._)`(${x})`; + } + } +}); + +// node_modules/ajv/dist/compile/util.js +var require_util = __commonJS({ + "node_modules/ajv/dist/compile/util.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; + var codegen_1 = require_codegen(); + var code_1 = require_code(); + function toHash(arr) { + const hash2 = {}; + for (const item of arr) + hash2[item] = true; + return hash2; + } + exports.toHash = toHash; + function alwaysValidSchema(it, schema) { + if (typeof schema == "boolean") + return schema; + if (Object.keys(schema).length === 0) + return true; + checkUnknownRules(it, schema); + return !schemaHasRules(schema, it.self.RULES.all); + } + exports.alwaysValidSchema = alwaysValidSchema; + function checkUnknownRules(it, schema = it.schema) { + const { opts, self } = it; + if (!opts.strictSchema) + return; + if (typeof schema === "boolean") + return; + const rules = self.RULES.keywords; + for (const key in schema) { + if (!rules[key]) + checkStrictMode(it, `unknown keyword: "${key}"`); + } + } + exports.checkUnknownRules = checkUnknownRules; + function schemaHasRules(schema, rules) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (rules[key]) + return true; + return false; + } + exports.schemaHasRules = schemaHasRules; + function schemaHasRulesButRef(schema, RULES) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (key !== "$ref" && RULES.all[key]) + return true; + return false; + } + exports.schemaHasRulesButRef = schemaHasRulesButRef; + function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { + if (!$data) { + if (typeof schema == "number" || typeof schema == "boolean") + return schema; + if (typeof schema == "string") + return (0, codegen_1._)`${schema}`; + } + return (0, codegen_1._)`${topSchemaRef}${schemaPath}${(0, codegen_1.getProperty)(keyword)}`; + } + exports.schemaRefOrVal = schemaRefOrVal; + function unescapeFragment(str) { + return unescapeJsonPointer(decodeURIComponent(str)); + } + exports.unescapeFragment = unescapeFragment; + function escapeFragment(str) { + return encodeURIComponent(escapeJsonPointer(str)); + } + exports.escapeFragment = escapeFragment; + function escapeJsonPointer(str) { + if (typeof str == "number") + return `${str}`; + return str.replace(/~/g, "~0").replace(/\//g, "~1"); + } + exports.escapeJsonPointer = escapeJsonPointer; + function unescapeJsonPointer(str) { + return str.replace(/~1/g, "/").replace(/~0/g, "~"); + } + exports.unescapeJsonPointer = unescapeJsonPointer; + function eachItem(xs, f) { + if (Array.isArray(xs)) { + for (const x of xs) + f(x); + } else { + f(xs); + } + } + exports.eachItem = eachItem; + function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues: mergeValues3, resultToName }) { + return (gen, from, to, toName) => { + const res = to === void 0 ? from : to instanceof codegen_1.Name ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) : from instanceof codegen_1.Name ? (mergeToName(gen, to, from), from) : mergeValues3(from, to); + return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; + }; + } + exports.mergeEvaluated = { + props: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => { + gen.if((0, codegen_1._)`${from} === true`, () => gen.assign(to, true), () => gen.assign(to, (0, codegen_1._)`${to} || {}`).code((0, codegen_1._)`Object.assign(${to}, ${from})`)); + }), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => { + if (from === true) { + gen.assign(to, true); + } else { + gen.assign(to, (0, codegen_1._)`${to} || {}`); + setEvaluated(gen, to, from); + } + }), + mergeValues: (from, to) => from === true ? true : { ...from, ...to }, + resultToName: evaluatedPropsToName + }), + items: makeMergeEvaluated({ + mergeNames: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true && ${from} !== undefined`, () => gen.assign(to, (0, codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), + mergeToName: (gen, from, to) => gen.if((0, codegen_1._)`${to} !== true`, () => gen.assign(to, from === true ? true : (0, codegen_1._)`${to} > ${from} ? ${to} : ${from}`)), + mergeValues: (from, to) => from === true ? true : Math.max(from, to), + resultToName: (gen, items) => gen.var("items", items) + }) + }; + function evaluatedPropsToName(gen, ps) { + if (ps === true) + return gen.var("props", true); + const props = gen.var("props", (0, codegen_1._)`{}`); + if (ps !== void 0) + setEvaluated(gen, props, ps); + return props; + } + exports.evaluatedPropsToName = evaluatedPropsToName; + function setEvaluated(gen, props, ps) { + Object.keys(ps).forEach((p) => gen.assign((0, codegen_1._)`${props}${(0, codegen_1.getProperty)(p)}`, true)); + } + exports.setEvaluated = setEvaluated; + var snippets = {}; + function useFunc(gen, f) { + return gen.scopeValue("func", { + ref: f, + code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)) + }); + } + exports.useFunc = useFunc; + var Type; + (function(Type2) { + Type2[Type2["Num"] = 0] = "Num"; + Type2[Type2["Str"] = 1] = "Str"; + })(Type || (exports.Type = Type = {})); + function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { + if (dataProp instanceof codegen_1.Name) { + const isNumber = dataPropType === Type.Num; + return jsPropertySyntax ? isNumber ? (0, codegen_1._)`"[" + ${dataProp} + "]"` : (0, codegen_1._)`"['" + ${dataProp} + "']"` : isNumber ? (0, codegen_1._)`"/" + ${dataProp}` : (0, codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; + } + return jsPropertySyntax ? (0, codegen_1.getProperty)(dataProp).toString() : "/" + escapeJsonPointer(dataProp); + } + exports.getErrorPath = getErrorPath; + function checkStrictMode(it, msg, mode = it.opts.strictSchema) { + if (!mode) + return; + msg = `strict mode: ${msg}`; + if (mode === true) + throw new Error(msg); + it.self.logger.warn(msg); + } + exports.checkStrictMode = checkStrictMode; + } +}); + +// node_modules/ajv/dist/compile/names.js +var require_names = __commonJS({ + "node_modules/ajv/dist/compile/names.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var names = { + // validation function arguments + data: new codegen_1.Name("data"), + // data passed to validation function + // args passed from referencing schema + valCxt: new codegen_1.Name("valCxt"), + // validation/data context - should not be used directly, it is destructured to the names below + instancePath: new codegen_1.Name("instancePath"), + parentData: new codegen_1.Name("parentData"), + parentDataProperty: new codegen_1.Name("parentDataProperty"), + rootData: new codegen_1.Name("rootData"), + // root data - same as the data passed to the first/top validation function + dynamicAnchors: new codegen_1.Name("dynamicAnchors"), + // used to support recursiveRef and dynamicRef + // function scoped variables + vErrors: new codegen_1.Name("vErrors"), + // null or array of validation errors + errors: new codegen_1.Name("errors"), + // counter of validation errors + this: new codegen_1.Name("this"), + // "globals" + self: new codegen_1.Name("self"), + scope: new codegen_1.Name("scope"), + // JTD serialize/parse name for JSON string and position + json: new codegen_1.Name("json"), + jsonPos: new codegen_1.Name("jsonPos"), + jsonLen: new codegen_1.Name("jsonLen"), + jsonPart: new codegen_1.Name("jsonPart") + }; + exports.default = names; + } +}); + +// node_modules/ajv/dist/compile/errors.js +var require_errors = __commonJS({ + "node_modules/ajv/dist/compile/errors.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendErrors = exports.resetErrorsCount = exports.reportExtraError = exports.reportError = exports.keyword$DataError = exports.keywordError = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var names_1 = require_names(); + exports.keywordError = { + message: ({ keyword }) => (0, codegen_1.str)`must pass "${keyword}" keyword validation` + }; + exports.keyword$DataError = { + message: ({ keyword, schemaType }) => schemaType ? (0, codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)` : (0, codegen_1.str)`"${keyword}" keyword is invalid ($data)` + }; + function reportError(cxt, error48 = exports.keywordError, errorPaths, overrideAllErrors) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error48, errorPaths); + if (overrideAllErrors !== null && overrideAllErrors !== void 0 ? overrideAllErrors : compositeRule || allErrors) { + addError(gen, errObj); + } else { + returnErrors(it, (0, codegen_1._)`[${errObj}]`); + } + } + exports.reportError = reportError; + function reportExtraError(cxt, error48 = exports.keywordError, errorPaths) { + const { it } = cxt; + const { gen, compositeRule, allErrors } = it; + const errObj = errorObjectCode(cxt, error48, errorPaths); + addError(gen, errObj); + if (!(compositeRule || allErrors)) { + returnErrors(it, names_1.default.vErrors); + } + } + exports.reportExtraError = reportExtraError; + function resetErrorsCount(gen, errsCount) { + gen.assign(names_1.default.errors, errsCount); + gen.if((0, codegen_1._)`${names_1.default.vErrors} !== null`, () => gen.if(errsCount, () => gen.assign((0, codegen_1._)`${names_1.default.vErrors}.length`, errsCount), () => gen.assign(names_1.default.vErrors, null))); + } + exports.resetErrorsCount = resetErrorsCount; + function extendErrors({ gen, keyword, schemaValue, data, errsCount, it }) { + if (errsCount === void 0) + throw new Error("ajv implementation error"); + const err = gen.name("err"); + gen.forRange("i", errsCount, names_1.default.errors, (i) => { + gen.const(err, (0, codegen_1._)`${names_1.default.vErrors}[${i}]`); + gen.if((0, codegen_1._)`${err}.instancePath === undefined`, () => gen.assign((0, codegen_1._)`${err}.instancePath`, (0, codegen_1.strConcat)(names_1.default.instancePath, it.errorPath))); + gen.assign((0, codegen_1._)`${err}.schemaPath`, (0, codegen_1.str)`${it.errSchemaPath}/${keyword}`); + if (it.opts.verbose) { + gen.assign((0, codegen_1._)`${err}.schema`, schemaValue); + gen.assign((0, codegen_1._)`${err}.data`, data); + } + }); + } + exports.extendErrors = extendErrors; + function addError(gen, errObj) { + const err = gen.const("err", errObj); + gen.if((0, codegen_1._)`${names_1.default.vErrors} === null`, () => gen.assign(names_1.default.vErrors, (0, codegen_1._)`[${err}]`), (0, codegen_1._)`${names_1.default.vErrors}.push(${err})`); + gen.code((0, codegen_1._)`${names_1.default.errors}++`); + } + function returnErrors(it, errs) { + const { gen, validateName, schemaEnv } = it; + if (schemaEnv.$async) { + gen.throw((0, codegen_1._)`new ${it.ValidationError}(${errs})`); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, errs); + gen.return(false); + } + } + var E = { + keyword: new codegen_1.Name("keyword"), + schemaPath: new codegen_1.Name("schemaPath"), + // also used in JTD errors + params: new codegen_1.Name("params"), + propertyName: new codegen_1.Name("propertyName"), + message: new codegen_1.Name("message"), + schema: new codegen_1.Name("schema"), + parentSchema: new codegen_1.Name("parentSchema") + }; + function errorObjectCode(cxt, error48, errorPaths) { + const { createErrors } = cxt.it; + if (createErrors === false) + return (0, codegen_1._)`{}`; + return errorObject(cxt, error48, errorPaths); + } + function errorObject(cxt, error48, errorPaths = {}) { + const { gen, it } = cxt; + const keyValues = [ + errorInstancePath(it, errorPaths), + errorSchemaPath(cxt, errorPaths) + ]; + extraErrorProps(cxt, error48, keyValues); + return gen.object(...keyValues); + } + function errorInstancePath({ errorPath }, { instancePath }) { + const instPath = instancePath ? (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(instancePath, util_1.Type.Str)}` : errorPath; + return [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, instPath)]; + } + function errorSchemaPath({ keyword, it: { errSchemaPath } }, { schemaPath, parentSchema }) { + let schPath = parentSchema ? errSchemaPath : (0, codegen_1.str)`${errSchemaPath}/${keyword}`; + if (schemaPath) { + schPath = (0, codegen_1.str)`${schPath}${(0, util_1.getErrorPath)(schemaPath, util_1.Type.Str)}`; + } + return [E.schemaPath, schPath]; + } + function extraErrorProps(cxt, { params, message }, keyValues) { + const { keyword, data, schemaValue, it } = cxt; + const { opts, propertyName, topSchemaRef, schemaPath } = it; + keyValues.push([E.keyword, keyword], [E.params, typeof params == "function" ? params(cxt) : params || (0, codegen_1._)`{}`]); + if (opts.messages) { + keyValues.push([E.message, typeof message == "function" ? message(cxt) : message]); + } + if (opts.verbose) { + keyValues.push([E.schema, schemaValue], [E.parentSchema, (0, codegen_1._)`${topSchemaRef}${schemaPath}`], [names_1.default.data, data]); + } + if (propertyName) + keyValues.push([E.propertyName, propertyName]); + } + } +}); + +// node_modules/ajv/dist/compile/validate/boolSchema.js +var require_boolSchema = __commonJS({ + "node_modules/ajv/dist/compile/validate/boolSchema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.boolOrEmptySchema = exports.topBoolOrEmptySchema = void 0; + var errors_1 = require_errors(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var boolError = { + message: "boolean schema is false" + }; + function topBoolOrEmptySchema(it) { + const { gen, schema, validateName } = it; + if (schema === false) { + falseSchemaError(it, false); + } else if (typeof schema == "object" && schema.$async === true) { + gen.return(names_1.default.data); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, null); + gen.return(true); + } + } + exports.topBoolOrEmptySchema = topBoolOrEmptySchema; + function boolOrEmptySchema(it, valid) { + const { gen, schema } = it; + if (schema === false) { + gen.var(valid, false); + falseSchemaError(it); + } else { + gen.var(valid, true); + } + } + exports.boolOrEmptySchema = boolOrEmptySchema; + function falseSchemaError(it, overrideAllErrors) { + const { gen, data } = it; + const cxt = { + gen, + keyword: "false schema", + data, + schema: false, + schemaCode: false, + schemaValue: false, + params: {}, + it + }; + (0, errors_1.reportError)(cxt, boolError, void 0, overrideAllErrors); + } + } +}); + +// node_modules/ajv/dist/compile/rules.js +var require_rules = __commonJS({ + "node_modules/ajv/dist/compile/rules.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getRules = exports.isJSONType = void 0; + var _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; + var jsonTypes = new Set(_jsonTypes); + function isJSONType(x) { + return typeof x == "string" && jsonTypes.has(x); + } + exports.isJSONType = isJSONType; + function getRules() { + const groups = { + number: { type: "number", rules: [] }, + string: { type: "string", rules: [] }, + array: { type: "array", rules: [] }, + object: { type: "object", rules: [] } + }; + return { + types: { ...groups, integer: true, boolean: true, null: true }, + rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], + post: { rules: [] }, + all: {}, + keywords: {} + }; + } + exports.getRules = getRules; + } +}); + +// node_modules/ajv/dist/compile/validate/applicability.js +var require_applicability = __commonJS({ + "node_modules/ajv/dist/compile/validate/applicability.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.shouldUseRule = exports.shouldUseGroup = exports.schemaHasRulesForType = void 0; + function schemaHasRulesForType({ schema, self }, type) { + const group = self.RULES.types[type]; + return group && group !== true && shouldUseGroup(schema, group); + } + exports.schemaHasRulesForType = schemaHasRulesForType; + function shouldUseGroup(schema, group) { + return group.rules.some((rule) => shouldUseRule(schema, rule)); + } + exports.shouldUseGroup = shouldUseGroup; + function shouldUseRule(schema, rule) { + var _a2; + return schema[rule.keyword] !== void 0 || ((_a2 = rule.definition.implements) === null || _a2 === void 0 ? void 0 : _a2.some((kwd) => schema[kwd] !== void 0)); + } + exports.shouldUseRule = shouldUseRule; + } +}); + +// node_modules/ajv/dist/compile/validate/dataType.js +var require_dataType = __commonJS({ + "node_modules/ajv/dist/compile/validate/dataType.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; + var rules_1 = require_rules(); + var applicability_1 = require_applicability(); + var errors_1 = require_errors(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var DataType; + (function(DataType2) { + DataType2[DataType2["Correct"] = 0] = "Correct"; + DataType2[DataType2["Wrong"] = 1] = "Wrong"; + })(DataType || (exports.DataType = DataType = {})); + function getSchemaTypes(schema) { + const types = getJSONTypes(schema.type); + const hasNull = types.includes("null"); + if (hasNull) { + if (schema.nullable === false) + throw new Error("type: null contradicts nullable: false"); + } else { + if (!types.length && schema.nullable !== void 0) { + throw new Error('"nullable" cannot be used without "type"'); + } + if (schema.nullable === true) + types.push("null"); + } + return types; + } + exports.getSchemaTypes = getSchemaTypes; + function getJSONTypes(ts) { + const types = Array.isArray(ts) ? ts : ts ? [ts] : []; + if (types.every(rules_1.isJSONType)) + return types; + throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); + } + exports.getJSONTypes = getJSONTypes; + function coerceAndCheckDataType(it, types) { + const { gen, data, opts } = it; + const coerceTo = coerceToTypes(types, opts.coerceTypes); + const checkTypes = types.length > 0 && !(coerceTo.length === 0 && types.length === 1 && (0, applicability_1.schemaHasRulesForType)(it, types[0])); + if (checkTypes) { + const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); + gen.if(wrongType, () => { + if (coerceTo.length) + coerceData(it, types, coerceTo); + else + reportTypeError(it); + }); + } + return checkTypes; + } + exports.coerceAndCheckDataType = coerceAndCheckDataType; + var COERCIBLE = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean", "null"]); + function coerceToTypes(types, coerceTypes) { + return coerceTypes ? types.filter((t) => COERCIBLE.has(t) || coerceTypes === "array" && t === "array") : []; + } + function coerceData(it, types, coerceTo) { + const { gen, data, opts } = it; + const dataType = gen.let("dataType", (0, codegen_1._)`typeof ${data}`); + const coerced = gen.let("coerced", (0, codegen_1._)`undefined`); + if (opts.coerceTypes === "array") { + gen.if((0, codegen_1._)`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen.assign(data, (0, codegen_1._)`${data}[0]`).assign(dataType, (0, codegen_1._)`typeof ${data}`).if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); + } + gen.if((0, codegen_1._)`${coerced} !== undefined`); + for (const t of coerceTo) { + if (COERCIBLE.has(t) || t === "array" && opts.coerceTypes === "array") { + coerceSpecificType(t); + } + } + gen.else(); + reportTypeError(it); + gen.endIf(); + gen.if((0, codegen_1._)`${coerced} !== undefined`, () => { + gen.assign(data, coerced); + assignParentData(it, coerced); + }); + function coerceSpecificType(t) { + switch (t) { + case "string": + gen.elseIf((0, codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced, (0, codegen_1._)`"" + ${data}`).elseIf((0, codegen_1._)`${data} === null`).assign(coerced, (0, codegen_1._)`""`); + return; + case "number": + gen.elseIf((0, codegen_1._)`${dataType} == "boolean" || ${data} === null + || (${dataType} == "string" && ${data} && ${data} == +${data})`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "integer": + gen.elseIf((0, codegen_1._)`${dataType} === "boolean" || ${data} === null + || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`).assign(coerced, (0, codegen_1._)`+${data}`); + return; + case "boolean": + gen.elseIf((0, codegen_1._)`${data} === "false" || ${data} === 0 || ${data} === null`).assign(coerced, false).elseIf((0, codegen_1._)`${data} === "true" || ${data} === 1`).assign(coerced, true); + return; + case "null": + gen.elseIf((0, codegen_1._)`${data} === "" || ${data} === 0 || ${data} === false`); + gen.assign(coerced, null); + return; + case "array": + gen.elseIf((0, codegen_1._)`${dataType} === "string" || ${dataType} === "number" + || ${dataType} === "boolean" || ${data} === null`).assign(coerced, (0, codegen_1._)`[${data}]`); + } + } + } + function assignParentData({ gen, parentData, parentDataProperty }, expr) { + gen.if((0, codegen_1._)`${parentData} !== undefined`, () => gen.assign((0, codegen_1._)`${parentData}[${parentDataProperty}]`, expr)); + } + function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { + const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; + let cond; + switch (dataType) { + case "null": + return (0, codegen_1._)`${data} ${EQ} null`; + case "array": + cond = (0, codegen_1._)`Array.isArray(${data})`; + break; + case "object": + cond = (0, codegen_1._)`${data} && typeof ${data} == "object" && !Array.isArray(${data})`; + break; + case "integer": + cond = numCond((0, codegen_1._)`!(${data} % 1) && !isNaN(${data})`); + break; + case "number": + cond = numCond(); + break; + default: + return (0, codegen_1._)`typeof ${data} ${EQ} ${dataType}`; + } + return correct === DataType.Correct ? cond : (0, codegen_1.not)(cond); + function numCond(_cond = codegen_1.nil) { + return (0, codegen_1.and)((0, codegen_1._)`typeof ${data} == "number"`, _cond, strictNums ? (0, codegen_1._)`isFinite(${data})` : codegen_1.nil); + } + } + exports.checkDataType = checkDataType; + function checkDataTypes(dataTypes, data, strictNums, correct) { + if (dataTypes.length === 1) { + return checkDataType(dataTypes[0], data, strictNums, correct); + } + let cond; + const types = (0, util_1.toHash)(dataTypes); + if (types.array && types.object) { + const notObj = (0, codegen_1._)`typeof ${data} != "object"`; + cond = types.null ? notObj : (0, codegen_1._)`!${data} || ${notObj}`; + delete types.null; + delete types.array; + delete types.object; + } else { + cond = codegen_1.nil; + } + if (types.number) + delete types.integer; + for (const t in types) + cond = (0, codegen_1.and)(cond, checkDataType(t, data, strictNums, correct)); + return cond; + } + exports.checkDataTypes = checkDataTypes; + var typeError = { + message: ({ schema }) => `must be ${schema}`, + params: ({ schema, schemaValue }) => typeof schema == "string" ? (0, codegen_1._)`{type: ${schema}}` : (0, codegen_1._)`{type: ${schemaValue}}` + }; + function reportTypeError(it) { + const cxt = getTypeErrorContext(it); + (0, errors_1.reportError)(cxt, typeError); + } + exports.reportTypeError = reportTypeError; + function getTypeErrorContext(it) { + const { gen, data, schema } = it; + const schemaCode = (0, util_1.schemaRefOrVal)(it, schema, "type"); + return { + gen, + keyword: "type", + data, + schema: schema.type, + schemaCode, + schemaValue: schemaCode, + parentSchema: schema, + params: {}, + it + }; + } + } +}); + +// node_modules/ajv/dist/compile/validate/defaults.js +var require_defaults = __commonJS({ + "node_modules/ajv/dist/compile/validate/defaults.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.assignDefaults = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + function assignDefaults(it, ty) { + const { properties, items } = it.schema; + if (ty === "object" && properties) { + for (const key in properties) { + assignDefault(it, key, properties[key].default); + } + } else if (ty === "array" && Array.isArray(items)) { + items.forEach((sch, i) => assignDefault(it, i, sch.default)); + } + } + exports.assignDefaults = assignDefaults; + function assignDefault(it, prop, defaultValue) { + const { gen, compositeRule, data, opts } = it; + if (defaultValue === void 0) + return; + const childData = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(prop)}`; + if (compositeRule) { + (0, util_1.checkStrictMode)(it, `default is ignored for: ${childData}`); + return; + } + let condition = (0, codegen_1._)`${childData} === undefined`; + if (opts.useDefaults === "empty") { + condition = (0, codegen_1._)`${condition} || ${childData} === null || ${childData} === ""`; + } + gen.if(condition, (0, codegen_1._)`${childData} = ${(0, codegen_1.stringify)(defaultValue)}`); + } + } +}); + +// node_modules/ajv/dist/vocabularies/code.js +var require_code2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/code.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var names_1 = require_names(); + var util_2 = require_util(); + function checkReportMissingProp(cxt, prop) { + const { gen, data, it } = cxt; + gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { + cxt.setParams({ missingProperty: (0, codegen_1._)`${prop}` }, true); + cxt.error(); + }); + } + exports.checkReportMissingProp = checkReportMissingProp; + function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { + return (0, codegen_1.or)(...properties.map((prop) => (0, codegen_1.and)(noPropertyInData(gen, data, prop, opts.ownProperties), (0, codegen_1._)`${missing} = ${prop}`))); + } + exports.checkMissingProp = checkMissingProp; + function reportMissingProp(cxt, missing) { + cxt.setParams({ missingProperty: missing }, true); + cxt.error(); + } + exports.reportMissingProp = reportMissingProp; + function hasPropFunc(gen) { + return gen.scopeValue("func", { + // eslint-disable-next-line @typescript-eslint/unbound-method + ref: Object.prototype.hasOwnProperty, + code: (0, codegen_1._)`Object.prototype.hasOwnProperty` + }); + } + exports.hasPropFunc = hasPropFunc; + function isOwnProperty(gen, data, property) { + return (0, codegen_1._)`${hasPropFunc(gen)}.call(${data}, ${property})`; + } + exports.isOwnProperty = isOwnProperty; + function propertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} !== undefined`; + return ownProperties ? (0, codegen_1._)`${cond} && ${isOwnProperty(gen, data, property)}` : cond; + } + exports.propertyInData = propertyInData; + function noPropertyInData(gen, data, property, ownProperties) { + const cond = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(property)} === undefined`; + return ownProperties ? (0, codegen_1.or)(cond, (0, codegen_1.not)(isOwnProperty(gen, data, property))) : cond; + } + exports.noPropertyInData = noPropertyInData; + function allSchemaProperties(schemaMap) { + return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; + } + exports.allSchemaProperties = allSchemaProperties; + function schemaProperties(it, schemaMap) { + return allSchemaProperties(schemaMap).filter((p) => !(0, util_1.alwaysValidSchema)(it, schemaMap[p])); + } + exports.schemaProperties = schemaProperties; + function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { + const dataAndSchema = passSchema ? (0, codegen_1._)`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; + const valCxt = [ + [names_1.default.instancePath, (0, codegen_1.strConcat)(names_1.default.instancePath, errorPath)], + [names_1.default.parentData, it.parentData], + [names_1.default.parentDataProperty, it.parentDataProperty], + [names_1.default.rootData, names_1.default.rootData] + ]; + if (it.opts.dynamicRef) + valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); + const args = (0, codegen_1._)`${dataAndSchema}, ${gen.object(...valCxt)}`; + return context !== codegen_1.nil ? (0, codegen_1._)`${func}.call(${context}, ${args})` : (0, codegen_1._)`${func}(${args})`; + } + exports.callValidateCode = callValidateCode; + var newRegExp = (0, codegen_1._)`new RegExp`; + function usePattern({ gen, it: { opts } }, pattern) { + const u = opts.unicodeRegExp ? "u" : ""; + const { regExp } = opts.code; + const rx = regExp(pattern, u); + return gen.scopeValue("pattern", { + key: rx.toString(), + ref: rx, + code: (0, codegen_1._)`${regExp.code === "new RegExp" ? newRegExp : (0, util_2.useFunc)(gen, regExp)}(${pattern}, ${u})` + }); + } + exports.usePattern = usePattern; + function validateArray(cxt) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + if (it.allErrors) { + const validArr = gen.let("valid", true); + validateItems(() => gen.assign(validArr, false)); + return validArr; + } + gen.var(valid, true); + validateItems(() => gen.break()); + return valid; + function validateItems(notValid) { + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword, + dataProp: i, + dataPropType: util_1.Type.Num + }, valid); + gen.if((0, codegen_1.not)(valid), notValid); + }); + } + } + exports.validateArray = validateArray; + function validateUnion(cxt) { + const { gen, schema, keyword, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const alwaysValid = schema.some((sch) => (0, util_1.alwaysValidSchema)(it, sch)); + if (alwaysValid && !it.opts.unevaluated) + return; + const valid = gen.let("valid", false); + const schValid = gen.name("_valid"); + gen.block(() => schema.forEach((_sch, i) => { + const schCxt = cxt.subschema({ + keyword, + schemaProp: i, + compositeRule: true + }, schValid); + gen.assign(valid, (0, codegen_1._)`${valid} || ${schValid}`); + const merged = cxt.mergeValidEvaluated(schCxt, schValid); + if (!merged) + gen.if((0, codegen_1.not)(valid)); + })); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + } + exports.validateUnion = validateUnion; + } +}); + +// node_modules/ajv/dist/compile/validate/keyword.js +var require_keyword = __commonJS({ + "node_modules/ajv/dist/compile/validate/keyword.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateKeywordUsage = exports.validSchemaType = exports.funcKeywordCode = exports.macroKeywordCode = void 0; + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var code_1 = require_code2(); + var errors_1 = require_errors(); + function macroKeywordCode(cxt, def) { + const { gen, keyword, schema, parentSchema, it } = cxt; + const macroSchema = def.macro.call(it.self, schema, parentSchema, it); + const schemaRef = useKeyword(gen, keyword, macroSchema); + if (it.opts.validateSchema !== false) + it.self.validateSchema(macroSchema, true); + const valid = gen.name("valid"); + cxt.subschema({ + schema: macroSchema, + schemaPath: codegen_1.nil, + errSchemaPath: `${it.errSchemaPath}/${keyword}`, + topSchemaRef: schemaRef, + compositeRule: true + }, valid); + cxt.pass(valid, () => cxt.error(true)); + } + exports.macroKeywordCode = macroKeywordCode; + function funcKeywordCode(cxt, def) { + var _a2; + const { gen, keyword, schema, parentSchema, $data, it } = cxt; + checkAsyncKeyword(it, def); + const validate = !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate; + const validateRef = useKeyword(gen, keyword, validate); + const valid = gen.let("valid"); + cxt.block$data(valid, validateKeyword); + cxt.ok((_a2 = def.valid) !== null && _a2 !== void 0 ? _a2 : valid); + function validateKeyword() { + if (def.errors === false) { + assignValid(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => cxt.error()); + } else { + const ruleErrs = def.async ? validateAsync() : validateSync(); + if (def.modifying) + modifyData(cxt); + reportErrs(() => addErrs(cxt, ruleErrs)); + } + } + function validateAsync() { + const ruleErrs = gen.let("ruleErrs", null); + gen.try(() => assignValid((0, codegen_1._)`await `), (e) => gen.assign(valid, false).if((0, codegen_1._)`${e} instanceof ${it.ValidationError}`, () => gen.assign(ruleErrs, (0, codegen_1._)`${e}.errors`), () => gen.throw(e))); + return ruleErrs; + } + function validateSync() { + const validateErrs = (0, codegen_1._)`${validateRef}.errors`; + gen.assign(validateErrs, null); + assignValid(codegen_1.nil); + return validateErrs; + } + function assignValid(_await = def.async ? (0, codegen_1._)`await ` : codegen_1.nil) { + const passCxt = it.opts.passContext ? names_1.default.this : names_1.default.self; + const passSchema = !("compile" in def && !$data || def.schema === false); + gen.assign(valid, (0, codegen_1._)`${_await}${(0, code_1.callValidateCode)(cxt, validateRef, passCxt, passSchema)}`, def.modifying); + } + function reportErrs(errors) { + var _a3; + gen.if((0, codegen_1.not)((_a3 = def.valid) !== null && _a3 !== void 0 ? _a3 : valid), errors); + } + } + exports.funcKeywordCode = funcKeywordCode; + function modifyData(cxt) { + const { gen, data, it } = cxt; + gen.if(it.parentData, () => gen.assign(data, (0, codegen_1._)`${it.parentData}[${it.parentDataProperty}]`)); + } + function addErrs(cxt, errs) { + const { gen } = cxt; + gen.if((0, codegen_1._)`Array.isArray(${errs})`, () => { + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`).assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + (0, errors_1.extendErrors)(cxt); + }, () => cxt.error()); + } + function checkAsyncKeyword({ schemaEnv }, def) { + if (def.async && !schemaEnv.$async) + throw new Error("async keyword in sync schema"); + } + function useKeyword(gen, keyword, result) { + if (result === void 0) + throw new Error(`keyword "${keyword}" failed to compile`); + return gen.scopeValue("keyword", typeof result == "function" ? { ref: result } : { ref: result, code: (0, codegen_1.stringify)(result) }); + } + function validSchemaType(schema, schemaType, allowUndefined = false) { + return !schemaType.length || schemaType.some((st) => st === "array" ? Array.isArray(schema) : st === "object" ? schema && typeof schema == "object" && !Array.isArray(schema) : typeof schema == st || allowUndefined && typeof schema == "undefined"); + } + exports.validSchemaType = validSchemaType; + function validateKeywordUsage({ schema, opts, self, errSchemaPath }, def, keyword) { + if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) { + throw new Error("ajv implementation error"); + } + const deps = def.dependencies; + if (deps === null || deps === void 0 ? void 0 : deps.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) { + throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(",")}`); + } + if (def.validateSchema) { + const valid = def.validateSchema(schema[keyword]); + if (!valid) { + const msg = `keyword "${keyword}" value is invalid at path "${errSchemaPath}": ` + self.errorsText(def.validateSchema.errors); + if (opts.validateSchema === "log") + self.logger.error(msg); + else + throw new Error(msg); + } + } + } + exports.validateKeywordUsage = validateKeywordUsage; + } +}); + +// node_modules/ajv/dist/compile/validate/subschema.js +var require_subschema = __commonJS({ + "node_modules/ajv/dist/compile/validate/subschema.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.extendSubschemaMode = exports.extendSubschemaData = exports.getSubschema = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + function getSubschema(it, { keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef }) { + if (keyword !== void 0 && schema !== void 0) { + throw new Error('both "keyword" and "schema" passed, only one allowed'); + } + if (keyword !== void 0) { + const sch = it.schema[keyword]; + return schemaProp === void 0 ? { + schema: sch, + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}` + } : { + schema: sch[schemaProp], + schemaPath: (0, codegen_1._)`${it.schemaPath}${(0, codegen_1.getProperty)(keyword)}${(0, codegen_1.getProperty)(schemaProp)}`, + errSchemaPath: `${it.errSchemaPath}/${keyword}/${(0, util_1.escapeFragment)(schemaProp)}` + }; + } + if (schema !== void 0) { + if (schemaPath === void 0 || errSchemaPath === void 0 || topSchemaRef === void 0) { + throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"'); + } + return { + schema, + schemaPath, + topSchemaRef, + errSchemaPath + }; + } + throw new Error('either "keyword" or "schema" must be passed'); + } + exports.getSubschema = getSubschema; + function extendSubschemaData(subschema, it, { dataProp, dataPropType: dpType, data, dataTypes, propertyName }) { + if (data !== void 0 && dataProp !== void 0) { + throw new Error('both "data" and "dataProp" passed, only one allowed'); + } + const { gen } = it; + if (dataProp !== void 0) { + const { errorPath, dataPathArr, opts } = it; + const nextData = gen.let("data", (0, codegen_1._)`${it.data}${(0, codegen_1.getProperty)(dataProp)}`, true); + dataContextProps(nextData); + subschema.errorPath = (0, codegen_1.str)`${errorPath}${(0, util_1.getErrorPath)(dataProp, dpType, opts.jsPropertySyntax)}`; + subschema.parentDataProperty = (0, codegen_1._)`${dataProp}`; + subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]; + } + if (data !== void 0) { + const nextData = data instanceof codegen_1.Name ? data : gen.let("data", data, true); + dataContextProps(nextData); + if (propertyName !== void 0) + subschema.propertyName = propertyName; + } + if (dataTypes) + subschema.dataTypes = dataTypes; + function dataContextProps(_nextData) { + subschema.data = _nextData; + subschema.dataLevel = it.dataLevel + 1; + subschema.dataTypes = []; + it.definedProperties = /* @__PURE__ */ new Set(); + subschema.parentData = it.data; + subschema.dataNames = [...it.dataNames, _nextData]; + } + } + exports.extendSubschemaData = extendSubschemaData; + function extendSubschemaMode(subschema, { jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors }) { + if (compositeRule !== void 0) + subschema.compositeRule = compositeRule; + if (createErrors !== void 0) + subschema.createErrors = createErrors; + if (allErrors !== void 0) + subschema.allErrors = allErrors; + subschema.jtdDiscriminator = jtdDiscriminator; + subschema.jtdMetadata = jtdMetadata; + } + exports.extendSubschemaMode = extendSubschemaMode; + } +}); + +// node_modules/fast-deep-equal/index.js +var require_fast_deep_equal = __commonJS({ + "node_modules/fast-deep-equal/index.js"(exports, module) { + "use strict"; + module.exports = function equal(a, b) { + if (a === b) return true; + if (a && b && typeof a == "object" && typeof b == "object") { + if (a.constructor !== b.constructor) return false; + var length, i, keys; + if (Array.isArray(a)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0; ) + if (!equal(a[i], b[i])) return false; + return true; + } + if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; + if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); + if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); + keys = Object.keys(a); + length = keys.length; + if (length !== Object.keys(b).length) return false; + for (i = length; i-- !== 0; ) + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; + for (i = length; i-- !== 0; ) { + var key = keys[i]; + if (!equal(a[key], b[key])) return false; + } + return true; + } + return a !== a && b !== b; + }; + } +}); + +// node_modules/json-schema-traverse/index.js +var require_json_schema_traverse = __commonJS({ + "node_modules/json-schema-traverse/index.js"(exports, module) { + "use strict"; + var traverse = module.exports = function(schema, opts, cb) { + if (typeof opts == "function") { + cb = opts; + opts = {}; + } + cb = opts.cb || cb; + var pre = typeof cb == "function" ? cb : cb.pre || function() { + }; + var post = cb.post || function() { + }; + _traverse(opts, pre, post, schema, "", schema); + }; + traverse.keywords = { + additionalItems: true, + items: true, + contains: true, + additionalProperties: true, + propertyNames: true, + not: true, + if: true, + then: true, + else: true + }; + traverse.arrayKeywords = { + items: true, + allOf: true, + anyOf: true, + oneOf: true + }; + traverse.propsKeywords = { + $defs: true, + definitions: true, + properties: true, + patternProperties: true, + dependencies: true + }; + traverse.skipKeywords = { + default: true, + enum: true, + const: true, + required: true, + maximum: true, + minimum: true, + exclusiveMaximum: true, + exclusiveMinimum: true, + multipleOf: true, + maxLength: true, + minLength: true, + pattern: true, + format: true, + maxItems: true, + minItems: true, + uniqueItems: true, + maxProperties: true, + minProperties: true + }; + function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { + if (schema && typeof schema == "object" && !Array.isArray(schema)) { + pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); + for (var key in schema) { + var sch = schema[key]; + if (Array.isArray(sch)) { + if (key in traverse.arrayKeywords) { + for (var i = 0; i < sch.length; i++) + _traverse(opts, pre, post, sch[i], jsonPtr + "/" + key + "/" + i, rootSchema, jsonPtr, key, schema, i); + } + } else if (key in traverse.propsKeywords) { + if (sch && typeof sch == "object") { + for (var prop in sch) + _traverse(opts, pre, post, sch[prop], jsonPtr + "/" + key + "/" + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop); + } + } else if (key in traverse.keywords || opts.allKeys && !(key in traverse.skipKeywords)) { + _traverse(opts, pre, post, sch, jsonPtr + "/" + key, rootSchema, jsonPtr, key, schema); + } + } + post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); + } + } + function escapeJsonPtr(str) { + return str.replace(/~/g, "~0").replace(/\//g, "~1"); + } + } +}); + +// node_modules/ajv/dist/compile/resolve.js +var require_resolve = __commonJS({ + "node_modules/ajv/dist/compile/resolve.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getSchemaRefs = exports.resolveUrl = exports.normalizeId = exports._getFullPath = exports.getFullPath = exports.inlineRef = void 0; + var util_1 = require_util(); + var equal = require_fast_deep_equal(); + var traverse = require_json_schema_traverse(); + var SIMPLE_INLINED = /* @__PURE__ */ new Set([ + "type", + "format", + "pattern", + "maxLength", + "minLength", + "maxProperties", + "minProperties", + "maxItems", + "minItems", + "maximum", + "minimum", + "uniqueItems", + "multipleOf", + "required", + "enum", + "const" + ]); + function inlineRef(schema, limit = true) { + if (typeof schema == "boolean") + return true; + if (limit === true) + return !hasRef(schema); + if (!limit) + return false; + return countKeys(schema) <= limit; + } + exports.inlineRef = inlineRef; + var REF_KEYWORDS = /* @__PURE__ */ new Set([ + "$ref", + "$recursiveRef", + "$recursiveAnchor", + "$dynamicRef", + "$dynamicAnchor" + ]); + function hasRef(schema) { + for (const key in schema) { + if (REF_KEYWORDS.has(key)) + return true; + const sch = schema[key]; + if (Array.isArray(sch) && sch.some(hasRef)) + return true; + if (typeof sch == "object" && hasRef(sch)) + return true; + } + return false; + } + function countKeys(schema) { + let count = 0; + for (const key in schema) { + if (key === "$ref") + return Infinity; + count++; + if (SIMPLE_INLINED.has(key)) + continue; + if (typeof schema[key] == "object") { + (0, util_1.eachItem)(schema[key], (sch) => count += countKeys(sch)); + } + if (count === Infinity) + return Infinity; + } + return count; + } + function getFullPath(resolver, id = "", normalize) { + if (normalize !== false) + id = normalizeId(id); + const p = resolver.parse(id); + return _getFullPath(resolver, p); + } + exports.getFullPath = getFullPath; + function _getFullPath(resolver, p) { + const serialized = resolver.serialize(p); + return serialized.split("#")[0] + "#"; + } + exports._getFullPath = _getFullPath; + var TRAILING_SLASH_HASH = /#\/?$/; + function normalizeId(id) { + return id ? id.replace(TRAILING_SLASH_HASH, "") : ""; + } + exports.normalizeId = normalizeId; + function resolveUrl(resolver, baseId, id) { + id = normalizeId(id); + return resolver.resolve(baseId, id); + } + exports.resolveUrl = resolveUrl; + var ANCHOR = /^[a-z_][-a-z0-9._]*$/i; + function getSchemaRefs(schema, baseId) { + if (typeof schema == "boolean") + return {}; + const { schemaId, uriResolver } = this.opts; + const schId = normalizeId(schema[schemaId] || baseId); + const baseIds = { "": schId }; + const pathPrefix = getFullPath(uriResolver, schId, false); + const localRefs = {}; + const schemaRefs = /* @__PURE__ */ new Set(); + traverse(schema, { allKeys: true }, (sch, jsonPtr, _, parentJsonPtr) => { + if (parentJsonPtr === void 0) + return; + const fullPath = pathPrefix + jsonPtr; + let innerBaseId = baseIds[parentJsonPtr]; + if (typeof sch[schemaId] == "string") + innerBaseId = addRef.call(this, sch[schemaId]); + addAnchor.call(this, sch.$anchor); + addAnchor.call(this, sch.$dynamicAnchor); + baseIds[jsonPtr] = innerBaseId; + function addRef(ref) { + const _resolve = this.opts.uriResolver.resolve; + ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref); + if (schemaRefs.has(ref)) + throw ambiguos(ref); + schemaRefs.add(ref); + let schOrRef = this.refs[ref]; + if (typeof schOrRef == "string") + schOrRef = this.refs[schOrRef]; + if (typeof schOrRef == "object") { + checkAmbiguosRef(sch, schOrRef.schema, ref); + } else if (ref !== normalizeId(fullPath)) { + if (ref[0] === "#") { + checkAmbiguosRef(sch, localRefs[ref], ref); + localRefs[ref] = sch; + } else { + this.refs[ref] = fullPath; + } + } + return ref; + } + function addAnchor(anchor) { + if (typeof anchor == "string") { + if (!ANCHOR.test(anchor)) + throw new Error(`invalid anchor "${anchor}"`); + addRef.call(this, `#${anchor}`); + } + } + }); + return localRefs; + function checkAmbiguosRef(sch1, sch2, ref) { + if (sch2 !== void 0 && !equal(sch1, sch2)) + throw ambiguos(ref); + } + function ambiguos(ref) { + return new Error(`reference "${ref}" resolves to more than one schema`); + } + } + exports.getSchemaRefs = getSchemaRefs; + } +}); + +// node_modules/ajv/dist/compile/validate/index.js +var require_validate = __commonJS({ + "node_modules/ajv/dist/compile/validate/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0; + var boolSchema_1 = require_boolSchema(); + var dataType_1 = require_dataType(); + var applicability_1 = require_applicability(); + var dataType_2 = require_dataType(); + var defaults_1 = require_defaults(); + var keyword_1 = require_keyword(); + var subschema_1 = require_subschema(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var resolve_1 = require_resolve(); + var util_1 = require_util(); + var errors_1 = require_errors(); + function validateFunctionCode(it) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + topSchemaObjCode(it); + return; + } + } + validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it)); + } + exports.validateFunctionCode = validateFunctionCode; + function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) { + if (opts.code.es5) { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => { + gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`); + destructureValCxtES5(gen, opts); + gen.code(body); + }); + } else { + gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body)); + } + } + function destructureValCxt(opts) { + return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`; + } + function destructureValCxtES5(gen, opts) { + gen.if(names_1.default.valCxt, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`); + gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`); + gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`); + }, () => { + gen.var(names_1.default.instancePath, (0, codegen_1._)`""`); + gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`); + gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`); + gen.var(names_1.default.rootData, names_1.default.data); + if (opts.dynamicRef) + gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`); + }); + } + function topSchemaObjCode(it) { + const { schema, opts, gen } = it; + validateFunction(it, () => { + if (opts.$comment && schema.$comment) + commentKeyword(it); + checkNoDefault(it); + gen.let(names_1.default.vErrors, null); + gen.let(names_1.default.errors, 0); + if (opts.unevaluated) + resetEvaluated(it); + typeAndKeywords(it); + returnResults(it); + }); + return; + } + function resetEvaluated(it) { + const { gen, validateName } = it; + it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`)); + gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`)); + } + function funcSourceUrl(schema, opts) { + const schId = typeof schema == "object" && schema[opts.schemaId]; + return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil; + } + function subschemaCode(it, valid) { + if (isSchemaObj(it)) { + checkKeywords(it); + if (schemaCxtHasRules(it)) { + subSchemaObjCode(it, valid); + return; + } + } + (0, boolSchema_1.boolOrEmptySchema)(it, valid); + } + function schemaCxtHasRules({ schema, self }) { + if (typeof schema == "boolean") + return !schema; + for (const key in schema) + if (self.RULES.all[key]) + return true; + return false; + } + function isSchemaObj(it) { + return typeof it.schema != "boolean"; + } + function subSchemaObjCode(it, valid) { + const { schema, gen, opts } = it; + if (opts.$comment && schema.$comment) + commentKeyword(it); + updateContext(it); + checkAsyncSchema(it); + const errsCount = gen.const("_errs", names_1.default.errors); + typeAndKeywords(it, errsCount); + gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + } + function checkKeywords(it) { + (0, util_1.checkUnknownRules)(it); + checkRefsAndKeywords(it); + } + function typeAndKeywords(it, errsCount) { + if (it.opts.jtd) + return schemaKeywords(it, [], false, errsCount); + const types = (0, dataType_1.getSchemaTypes)(it.schema); + const checkedTypes = (0, dataType_1.coerceAndCheckDataType)(it, types); + schemaKeywords(it, types, !checkedTypes, errsCount); + } + function checkRefsAndKeywords(it) { + const { schema, errSchemaPath, opts, self } = it; + if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) { + self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`); + } + } + function checkNoDefault(it) { + const { schema, opts } = it; + if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) { + (0, util_1.checkStrictMode)(it, "default is ignored in the schema root"); + } + } + function updateContext(it) { + const schId = it.schema[it.opts.schemaId]; + if (schId) + it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId); + } + function checkAsyncSchema(it) { + if (it.schema.$async && !it.schemaEnv.$async) + throw new Error("async schema in sync schema"); + } + function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) { + const msg = schema.$comment; + if (opts.$comment === true) { + gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`); + } else if (typeof opts.$comment == "function") { + const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`; + const rootName = gen.scopeValue("root", { ref: schemaEnv.root }); + gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`); + } + } + function returnResults(it) { + const { gen, schemaEnv, validateName, ValidationError, opts } = it; + if (schemaEnv.$async) { + gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`)); + } else { + gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors); + if (opts.unevaluated) + assignEvaluated(it); + gen.return((0, codegen_1._)`${names_1.default.errors} === 0`); + } + } + function assignEvaluated({ gen, evaluated, props, items }) { + if (props instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.props`, props); + if (items instanceof codegen_1.Name) + gen.assign((0, codegen_1._)`${evaluated}.items`, items); + } + function schemaKeywords(it, types, typeErrors, errsCount) { + const { gen, schema, data, allErrors, opts, self } = it; + const { RULES } = self; + if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) { + gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition)); + return; + } + if (!opts.jtd) + checkStrictTypes(it, types); + gen.block(() => { + for (const group of RULES.rules) + groupKeywords(group); + groupKeywords(RULES.post); + }); + function groupKeywords(group) { + if (!(0, applicability_1.shouldUseGroup)(schema, group)) + return; + if (group.type) { + gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers)); + iterateKeywords(it, group); + if (types.length === 1 && types[0] === group.type && typeErrors) { + gen.else(); + (0, dataType_2.reportTypeError)(it); + } + gen.endIf(); + } else { + iterateKeywords(it, group); + } + if (!allErrors) + gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`); + } + } + function iterateKeywords(it, group) { + const { gen, schema, opts: { useDefaults } } = it; + if (useDefaults) + (0, defaults_1.assignDefaults)(it, group.type); + gen.block(() => { + for (const rule of group.rules) { + if ((0, applicability_1.shouldUseRule)(schema, rule)) { + keywordCode(it, rule.keyword, rule.definition, group.type); + } + } + }); + } + function checkStrictTypes(it, types) { + if (it.schemaEnv.meta || !it.opts.strictTypes) + return; + checkContextTypes(it, types); + if (!it.opts.allowUnionTypes) + checkMultipleTypes(it, types); + checkKeywordTypes(it, it.dataTypes); + } + function checkContextTypes(it, types) { + if (!types.length) + return; + if (!it.dataTypes.length) { + it.dataTypes = types; + return; + } + types.forEach((t) => { + if (!includesType(it.dataTypes, t)) { + strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`); + } + }); + narrowSchemaTypes(it, types); + } + function checkMultipleTypes(it, ts) { + if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) { + strictTypesError(it, "use allowUnionTypes to allow union type keyword"); + } + } + function checkKeywordTypes(it, ts) { + const rules = it.self.RULES.all; + for (const keyword in rules) { + const rule = rules[keyword]; + if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) { + const { type } = rule.definition; + if (type.length && !type.some((t) => hasApplicableType(ts, t))) { + strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`); + } + } + } + } + function hasApplicableType(schTs, kwdT) { + return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer"); + } + function includesType(ts, t) { + return ts.includes(t) || t === "integer" && ts.includes("number"); + } + function narrowSchemaTypes(it, withTypes) { + const ts = []; + for (const t of it.dataTypes) { + if (includesType(withTypes, t)) + ts.push(t); + else if (withTypes.includes("integer") && t === "number") + ts.push("integer"); + } + it.dataTypes = ts; + } + function strictTypesError(it, msg) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + msg += ` at "${schemaPath}" (strictTypes)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes); + } + var KeywordCxt = class { + constructor(it, def, keyword) { + (0, keyword_1.validateKeywordUsage)(it, def, keyword); + this.gen = it.gen; + this.allErrors = it.allErrors; + this.keyword = keyword; + this.data = it.data; + this.schema = it.schema[keyword]; + this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data; + this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data); + this.schemaType = def.schemaType; + this.parentSchema = it.schema; + this.params = {}; + this.it = it; + this.def = def; + if (this.$data) { + this.schemaCode = it.gen.const("vSchema", getData(this.$data, it)); + } else { + this.schemaCode = this.schemaValue; + if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) { + throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`); + } + } + if ("code" in def ? def.trackErrors : def.errors !== false) { + this.errsCount = it.gen.const("_errs", names_1.default.errors); + } + } + result(condition, successAction, failAction) { + this.failResult((0, codegen_1.not)(condition), successAction, failAction); + } + failResult(condition, successAction, failAction) { + this.gen.if(condition); + if (failAction) + failAction(); + else + this.error(); + if (successAction) { + this.gen.else(); + successAction(); + if (this.allErrors) + this.gen.endIf(); + } else { + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + } + pass(condition, failAction) { + this.failResult((0, codegen_1.not)(condition), void 0, failAction); + } + fail(condition) { + if (condition === void 0) { + this.error(); + if (!this.allErrors) + this.gen.if(false); + return; + } + this.gen.if(condition); + this.error(); + if (this.allErrors) + this.gen.endIf(); + else + this.gen.else(); + } + fail$data(condition) { + if (!this.$data) + return this.fail(condition); + const { schemaCode } = this; + this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`); + } + error(append, errorParams, errorPaths) { + if (errorParams) { + this.setParams(errorParams); + this._error(append, errorPaths); + this.setParams({}); + return; + } + this._error(append, errorPaths); + } + _error(append, errorPaths) { + ; + (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths); + } + $dataError() { + (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError); + } + reset() { + if (this.errsCount === void 0) + throw new Error('add "trackErrors" to keyword definition'); + (0, errors_1.resetErrorsCount)(this.gen, this.errsCount); + } + ok(cond) { + if (!this.allErrors) + this.gen.if(cond); + } + setParams(obj, assign) { + if (assign) + Object.assign(this.params, obj); + else + this.params = obj; + } + block$data(valid, codeBlock, $dataValid = codegen_1.nil) { + this.gen.block(() => { + this.check$data(valid, $dataValid); + codeBlock(); + }); + } + check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) { + if (!this.$data) + return; + const { gen, schemaCode, schemaType, def } = this; + gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid)); + if (valid !== codegen_1.nil) + gen.assign(valid, true); + if (schemaType.length || def.validateSchema) { + gen.elseIf(this.invalid$data()); + this.$dataError(); + if (valid !== codegen_1.nil) + gen.assign(valid, false); + } + gen.else(); + } + invalid$data() { + const { gen, schemaCode, schemaType, def, it } = this; + return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema()); + function wrong$DataType() { + if (schemaType.length) { + if (!(schemaCode instanceof codegen_1.Name)) + throw new Error("ajv implementation error"); + const st = Array.isArray(schemaType) ? schemaType : [schemaType]; + return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`; + } + return codegen_1.nil; + } + function invalid$DataSchema() { + if (def.validateSchema) { + const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema }); + return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`; + } + return codegen_1.nil; + } + } + subschema(appl, valid) { + const subschema = (0, subschema_1.getSubschema)(this.it, appl); + (0, subschema_1.extendSubschemaData)(subschema, this.it, appl); + (0, subschema_1.extendSubschemaMode)(subschema, appl); + const nextContext = { ...this.it, ...subschema, items: void 0, props: void 0 }; + subschemaCode(nextContext, valid); + return nextContext; + } + mergeEvaluated(schemaCxt, toName) { + const { it, gen } = this; + if (!it.opts.unevaluated) + return; + if (it.props !== true && schemaCxt.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName); + } + if (it.items !== true && schemaCxt.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName); + } + } + mergeValidEvaluated(schemaCxt, valid) { + const { it, gen } = this; + if (it.opts.unevaluated && (it.props !== true || it.items !== true)) { + gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name)); + return true; + } + } + }; + exports.KeywordCxt = KeywordCxt; + function keywordCode(it, keyword, def, ruleType) { + const cxt = new KeywordCxt(it, def, keyword); + if ("code" in def) { + def.code(cxt, ruleType); + } else if (cxt.$data && def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } else if ("macro" in def) { + (0, keyword_1.macroKeywordCode)(cxt, def); + } else if (def.compile || def.validate) { + (0, keyword_1.funcKeywordCode)(cxt, def); + } + } + var JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/; + var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/; + function getData($data, { dataLevel, dataNames, dataPathArr }) { + let jsonPointer; + let data; + if ($data === "") + return names_1.default.rootData; + if ($data[0] === "/") { + if (!JSON_POINTER.test($data)) + throw new Error(`Invalid JSON-pointer: ${$data}`); + jsonPointer = $data; + data = names_1.default.rootData; + } else { + const matches = RELATIVE_JSON_POINTER.exec($data); + if (!matches) + throw new Error(`Invalid JSON-pointer: ${$data}`); + const up = +matches[1]; + jsonPointer = matches[2]; + if (jsonPointer === "#") { + if (up >= dataLevel) + throw new Error(errorMsg("property/index", up)); + return dataPathArr[dataLevel - up]; + } + if (up > dataLevel) + throw new Error(errorMsg("data", up)); + data = dataNames[dataLevel - up]; + if (!jsonPointer) + return data; + } + let expr = data; + const segments = jsonPointer.split("/"); + for (const segment of segments) { + if (segment) { + data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`; + expr = (0, codegen_1._)`${expr} && ${data}`; + } + } + return expr; + function errorMsg(pointerType, up) { + return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`; + } + } + exports.getData = getData; + } +}); + +// node_modules/ajv/dist/runtime/validation_error.js +var require_validation_error = __commonJS({ + "node_modules/ajv/dist/runtime/validation_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var ValidationError = class extends Error { + constructor(errors) { + super("validation failed"); + this.errors = errors; + this.ajv = this.validation = true; + } + }; + exports.default = ValidationError; + } +}); + +// node_modules/ajv/dist/compile/ref_error.js +var require_ref_error = __commonJS({ + "node_modules/ajv/dist/compile/ref_error.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var resolve_1 = require_resolve(); + var MissingRefError = class extends Error { + constructor(resolver, baseId, ref, msg) { + super(msg || `can't resolve reference ${ref} from id ${baseId}`); + this.missingRef = (0, resolve_1.resolveUrl)(resolver, baseId, ref); + this.missingSchema = (0, resolve_1.normalizeId)((0, resolve_1.getFullPath)(resolver, this.missingRef)); + } + }; + exports.default = MissingRefError; + } +}); + +// node_modules/ajv/dist/compile/index.js +var require_compile = __commonJS({ + "node_modules/ajv/dist/compile/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.resolveSchema = exports.getCompilingSchema = exports.resolveRef = exports.compileSchema = exports.SchemaEnv = void 0; + var codegen_1 = require_codegen(); + var validation_error_1 = require_validation_error(); + var names_1 = require_names(); + var resolve_1 = require_resolve(); + var util_1 = require_util(); + var validate_1 = require_validate(); + var SchemaEnv = class { + constructor(env) { + var _a2; + this.refs = {}; + this.dynamicAnchors = {}; + let schema; + if (typeof env.schema == "object") + schema = env.schema; + this.schema = env.schema; + this.schemaId = env.schemaId; + this.root = env.root || this; + this.baseId = (_a2 = env.baseId) !== null && _a2 !== void 0 ? _a2 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]); + this.schemaPath = env.schemaPath; + this.localRefs = env.localRefs; + this.meta = env.meta; + this.$async = schema === null || schema === void 0 ? void 0 : schema.$async; + this.refs = {}; + } + }; + exports.SchemaEnv = SchemaEnv; + function compileSchema(sch) { + const _sch = getCompilingSchema.call(this, sch); + if (_sch) + return _sch; + const rootId = (0, resolve_1.getFullPath)(this.opts.uriResolver, sch.root.baseId); + const { es5, lines } = this.opts.code; + const { ownProperties } = this.opts; + const gen = new codegen_1.CodeGen(this.scope, { es5, lines, ownProperties }); + let _ValidationError; + if (sch.$async) { + _ValidationError = gen.scopeValue("Error", { + ref: validation_error_1.default, + code: (0, codegen_1._)`require("ajv/dist/runtime/validation_error").default` + }); + } + const validateName = gen.scopeName("validate"); + sch.validateName = validateName; + const schemaCxt = { + gen, + allErrors: this.opts.allErrors, + data: names_1.default.data, + parentData: names_1.default.parentData, + parentDataProperty: names_1.default.parentDataProperty, + dataNames: [names_1.default.data], + dataPathArr: [codegen_1.nil], + // TODO can its length be used as dataLevel if nil is removed? + dataLevel: 0, + dataTypes: [], + definedProperties: /* @__PURE__ */ new Set(), + topSchemaRef: gen.scopeValue("schema", this.opts.code.source === true ? { ref: sch.schema, code: (0, codegen_1.stringify)(sch.schema) } : { ref: sch.schema }), + validateName, + ValidationError: _ValidationError, + schema: sch.schema, + schemaEnv: sch, + rootId, + baseId: sch.baseId || rootId, + schemaPath: codegen_1.nil, + errSchemaPath: sch.schemaPath || (this.opts.jtd ? "" : "#"), + errorPath: (0, codegen_1._)`""`, + opts: this.opts, + self: this + }; + let sourceCode; + try { + this._compilations.add(sch); + (0, validate_1.validateFunctionCode)(schemaCxt); + gen.optimize(this.opts.code.optimize); + const validateCode = gen.toString(); + sourceCode = `${gen.scopeRefs(names_1.default.scope)}return ${validateCode}`; + if (this.opts.code.process) + sourceCode = this.opts.code.process(sourceCode, sch); + const makeValidate = new Function(`${names_1.default.self}`, `${names_1.default.scope}`, sourceCode); + const validate = makeValidate(this, this.scope.get()); + this.scope.value(validateName, { ref: validate }); + validate.errors = null; + validate.schema = sch.schema; + validate.schemaEnv = sch; + if (sch.$async) + validate.$async = true; + if (this.opts.code.source === true) { + validate.source = { validateName, validateCode, scopeValues: gen._values }; + } + if (this.opts.unevaluated) { + const { props, items } = schemaCxt; + validate.evaluated = { + props: props instanceof codegen_1.Name ? void 0 : props, + items: items instanceof codegen_1.Name ? void 0 : items, + dynamicProps: props instanceof codegen_1.Name, + dynamicItems: items instanceof codegen_1.Name + }; + if (validate.source) + validate.source.evaluated = (0, codegen_1.stringify)(validate.evaluated); + } + sch.validate = validate; + return sch; + } catch (e) { + delete sch.validate; + delete sch.validateName; + if (sourceCode) + this.logger.error("Error compiling schema, function code:", sourceCode); + throw e; + } finally { + this._compilations.delete(sch); + } + } + exports.compileSchema = compileSchema; + function resolveRef2(root, baseId, ref) { + var _a2; + ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref); + const schOrFunc = root.refs[ref]; + if (schOrFunc) + return schOrFunc; + let _sch = resolve.call(this, root, ref); + if (_sch === void 0) { + const schema = (_a2 = root.localRefs) === null || _a2 === void 0 ? void 0 : _a2[ref]; + const { schemaId } = this.opts; + if (schema) + _sch = new SchemaEnv({ schema, schemaId, root, baseId }); + } + if (_sch === void 0) + return; + return root.refs[ref] = inlineOrCompile.call(this, _sch); + } + exports.resolveRef = resolveRef2; + function inlineOrCompile(sch) { + if ((0, resolve_1.inlineRef)(sch.schema, this.opts.inlineRefs)) + return sch.schema; + return sch.validate ? sch : compileSchema.call(this, sch); + } + function getCompilingSchema(schEnv) { + for (const sch of this._compilations) { + if (sameSchemaEnv(sch, schEnv)) + return sch; + } + } + exports.getCompilingSchema = getCompilingSchema; + function sameSchemaEnv(s1, s2) { + return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId; + } + function resolve(root, ref) { + let sch; + while (typeof (sch = this.refs[ref]) == "string") + ref = sch; + return sch || this.schemas[ref] || resolveSchema.call(this, root, ref); + } + function resolveSchema(root, ref) { + const p = this.opts.uriResolver.parse(ref); + const refPath = (0, resolve_1._getFullPath)(this.opts.uriResolver, p); + let baseId = (0, resolve_1.getFullPath)(this.opts.uriResolver, root.baseId, void 0); + if (Object.keys(root.schema).length > 0 && refPath === baseId) { + return getJsonPointer.call(this, p, root); + } + const id = (0, resolve_1.normalizeId)(refPath); + const schOrRef = this.refs[id] || this.schemas[id]; + if (typeof schOrRef == "string") { + const sch = resolveSchema.call(this, root, schOrRef); + if (typeof (sch === null || sch === void 0 ? void 0 : sch.schema) !== "object") + return; + return getJsonPointer.call(this, p, sch); + } + if (typeof (schOrRef === null || schOrRef === void 0 ? void 0 : schOrRef.schema) !== "object") + return; + if (!schOrRef.validate) + compileSchema.call(this, schOrRef); + if (id === (0, resolve_1.normalizeId)(ref)) { + const { schema } = schOrRef; + const { schemaId } = this.opts; + const schId = schema[schemaId]; + if (schId) + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + return new SchemaEnv({ schema, schemaId, root, baseId }); + } + return getJsonPointer.call(this, p, schOrRef); + } + exports.resolveSchema = resolveSchema; + var PREVENT_SCOPE_CHANGE = /* @__PURE__ */ new Set([ + "properties", + "patternProperties", + "enum", + "dependencies", + "definitions" + ]); + function getJsonPointer(parsedRef, { baseId, schema, root }) { + var _a2; + if (((_a2 = parsedRef.fragment) === null || _a2 === void 0 ? void 0 : _a2[0]) !== "/") + return; + for (const part of parsedRef.fragment.slice(1).split("/")) { + if (typeof schema === "boolean") + return; + const partSchema = schema[(0, util_1.unescapeFragment)(part)]; + if (partSchema === void 0) + return; + schema = partSchema; + const schId = typeof schema === "object" && schema[this.opts.schemaId]; + if (!PREVENT_SCOPE_CHANGE.has(part) && schId) { + baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId); + } + } + let env; + if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) { + const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref); + env = resolveSchema.call(this, root, $ref); + } + const { schemaId } = this.opts; + env = env || new SchemaEnv({ schema, schemaId, root, baseId }); + if (env.schema !== env.root.schema) + return env; + return void 0; + } + } +}); + +// node_modules/ajv/dist/refs/data.json +var require_data = __commonJS({ + "node_modules/ajv/dist/refs/data.json"(exports, module) { + module.exports = { + $id: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", + description: "Meta-schema for $data reference (JSON AnySchema extension proposal)", + type: "object", + required: ["$data"], + properties: { + $data: { + type: "string", + anyOf: [{ format: "relative-json-pointer" }, { format: "json-pointer" }] + } + }, + additionalProperties: false + }; + } +}); + +// node_modules/fast-uri/lib/utils.js +var require_utils = __commonJS({ + "node_modules/fast-uri/lib/utils.js"(exports, module) { + "use strict"; + var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu); + var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u); + var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu); + var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu); + var isPathCharacter = RegExp.prototype.test.bind(/^[\da-z\-._~!$&'()*+,;=:@/]$/iu); + function stringArrayToHexStripped(input) { + let acc = ""; + let code = 0; + let i = 0; + for (i = 0; i < input.length; i++) { + code = input[i].charCodeAt(0); + if (code === 48) { + continue; + } + if (!(code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102)) { + return ""; + } + acc += input[i]; + break; + } + for (i += 1; i < input.length; i++) { + code = input[i].charCodeAt(0); + if (!(code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102)) { + return ""; + } + acc += input[i]; + } + return acc; + } + var nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u); + function consumeIsZone(buffer) { + buffer.length = 0; + return true; + } + function consumeHextets(buffer, address, output) { + if (buffer.length) { + const hex3 = stringArrayToHexStripped(buffer); + if (hex3 !== "") { + address.push(hex3); + } else { + output.error = true; + return false; + } + buffer.length = 0; + } + return true; + } + function getIPV6(input) { + let tokenCount = 0; + const output = { error: false, address: "", zone: "" }; + const address = []; + const buffer = []; + let endipv6Encountered = false; + let endIpv6 = false; + let consume = consumeHextets; + for (let i = 0; i < input.length; i++) { + const cursor = input[i]; + if (cursor === "[" || cursor === "]") { + continue; + } + if (cursor === ":") { + if (endipv6Encountered === true) { + endIpv6 = true; + } + if (!consume(buffer, address, output)) { + break; + } + if (++tokenCount > 7) { + output.error = true; + break; + } + if (i > 0 && input[i - 1] === ":") { + endipv6Encountered = true; + } + address.push(":"); + continue; + } else if (cursor === "%") { + if (!consume(buffer, address, output)) { + break; + } + consume = consumeIsZone; + } else { + buffer.push(cursor); + continue; + } + } + if (buffer.length) { + if (consume === consumeIsZone) { + output.zone = buffer.join(""); + } else if (endIpv6) { + address.push(buffer.join("")); + } else { + address.push(stringArrayToHexStripped(buffer)); + } + } + output.address = address.join(""); + return output; + } + function normalizeIPv6(host) { + if (findToken(host, ":") < 2) { + return { host, isIPV6: false }; + } + const ipv63 = getIPV6(host); + if (!ipv63.error) { + let newHost = ipv63.address; + let escapedHost = ipv63.address; + if (ipv63.zone) { + newHost += "%" + ipv63.zone; + escapedHost += "%25" + ipv63.zone; + } + return { host: newHost, isIPV6: true, escapedHost }; + } else { + return { host, isIPV6: false }; + } + } + function findToken(str, token) { + let ind = 0; + for (let i = 0; i < str.length; i++) { + if (str[i] === token) ind++; + } + return ind; + } + function removeDotSegments(path) { + let input = path; + const output = []; + let nextSlash = -1; + let len = 0; + while (len = input.length) { + if (len === 1) { + if (input === ".") { + break; + } else if (input === "/") { + output.push("/"); + break; + } else { + output.push(input); + break; + } + } else if (len === 2) { + if (input[0] === ".") { + if (input[1] === ".") { + break; + } else if (input[1] === "/") { + input = input.slice(2); + continue; + } + } else if (input[0] === "/") { + if (input[1] === "." || input[1] === "/") { + output.push("/"); + break; + } + } + } else if (len === 3) { + if (input === "/..") { + if (output.length !== 0) { + output.pop(); + } + output.push("/"); + break; + } + } + if (input[0] === ".") { + if (input[1] === ".") { + if (input[2] === "/") { + input = input.slice(3); + continue; + } + } else if (input[1] === "/") { + input = input.slice(2); + continue; + } + } else if (input[0] === "/") { + if (input[1] === ".") { + if (input[2] === "/") { + input = input.slice(2); + continue; + } else if (input[2] === ".") { + if (input[3] === "/") { + input = input.slice(3); + if (output.length !== 0) { + output.pop(); + } + continue; + } + } + } + } + if ((nextSlash = input.indexOf("/", 1)) === -1) { + output.push(input); + break; + } else { + output.push(input.slice(0, nextSlash)); + input = input.slice(nextSlash); + } + } + return output.join(""); + } + var HOST_DELIMS = { "@": "%40", "/": "%2F", "?": "%3F", "#": "%23", ":": "%3A" }; + var HOST_DELIM_RE = /[@/?#:]/g; + var HOST_DELIM_NO_COLON_RE = /[@/?#]/g; + function reescapeHostDelimiters(host, isIP) { + const re = isIP ? HOST_DELIM_NO_COLON_RE : HOST_DELIM_RE; + re.lastIndex = 0; + return host.replace(re, (ch) => HOST_DELIMS[ch]); + } + function normalizePercentEncoding(input, decodeUnreserved = false) { + if (input.indexOf("%") === -1) { + return input; + } + let output = ""; + for (let i = 0; i < input.length; i++) { + if (input[i] === "%" && i + 2 < input.length) { + const hex3 = input.slice(i + 1, i + 3); + if (isHexPair(hex3)) { + const normalizedHex = hex3.toUpperCase(); + const decoded = String.fromCharCode(parseInt(normalizedHex, 16)); + if (decodeUnreserved && isUnreserved(decoded)) { + output += decoded; + } else { + output += "%" + normalizedHex; + } + i += 2; + continue; + } + } + output += input[i]; + } + return output; + } + function normalizePathEncoding(input) { + let output = ""; + for (let i = 0; i < input.length; i++) { + if (input[i] === "%" && i + 2 < input.length) { + const hex3 = input.slice(i + 1, i + 3); + if (isHexPair(hex3)) { + const normalizedHex = hex3.toUpperCase(); + const decoded = String.fromCharCode(parseInt(normalizedHex, 16)); + if (decoded !== "." && isUnreserved(decoded)) { + output += decoded; + } else { + output += "%" + normalizedHex; + } + i += 2; + continue; + } + } + if (isPathCharacter(input[i])) { + output += input[i]; + } else { + output += escape(input[i]); + } + } + return output; + } + function escapePreservingEscapes(input) { + let output = ""; + for (let i = 0; i < input.length; i++) { + if (input[i] === "%" && i + 2 < input.length) { + const hex3 = input.slice(i + 1, i + 3); + if (isHexPair(hex3)) { + output += "%" + hex3.toUpperCase(); + i += 2; + continue; + } + } + output += escape(input[i]); + } + return output; + } + function recomposeAuthority(component) { + const uriTokens = []; + if (component.userinfo !== void 0) { + uriTokens.push(component.userinfo); + uriTokens.push("@"); + } + if (component.host !== void 0) { + let host = unescape(component.host); + if (!isIPv4(host)) { + const ipV6res = normalizeIPv6(host); + if (ipV6res.isIPV6 === true) { + host = `[${ipV6res.escapedHost}]`; + } else { + host = reescapeHostDelimiters(host, false); + } + } + uriTokens.push(host); + } + if (typeof component.port === "number" || typeof component.port === "string") { + uriTokens.push(":"); + uriTokens.push(String(component.port)); + } + return uriTokens.length ? uriTokens.join("") : void 0; + } + module.exports = { + nonSimpleDomain, + recomposeAuthority, + reescapeHostDelimiters, + normalizePercentEncoding, + normalizePathEncoding, + escapePreservingEscapes, + removeDotSegments, + isIPv4, + isUUID, + normalizeIPv6, + stringArrayToHexStripped + }; + } +}); + +// node_modules/fast-uri/lib/schemes.js +var require_schemes = __commonJS({ + "node_modules/fast-uri/lib/schemes.js"(exports, module) { + "use strict"; + var { isUUID } = require_utils(); + var URN_REG = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu; + var supportedSchemeNames = ( + /** @type {const} */ + [ + "http", + "https", + "ws", + "wss", + "urn", + "urn:uuid" + ] + ); + function isValidSchemeName(name) { + return supportedSchemeNames.indexOf( + /** @type {*} */ + name + ) !== -1; + } + function wsIsSecure(wsComponent) { + if (wsComponent.secure === true) { + return true; + } else if (wsComponent.secure === false) { + return false; + } else if (wsComponent.scheme) { + return wsComponent.scheme.length === 3 && (wsComponent.scheme[0] === "w" || wsComponent.scheme[0] === "W") && (wsComponent.scheme[1] === "s" || wsComponent.scheme[1] === "S") && (wsComponent.scheme[2] === "s" || wsComponent.scheme[2] === "S"); + } else { + return false; + } + } + function httpParse(component) { + if (!component.host) { + component.error = component.error || "HTTP URIs must have a host."; + } + return component; + } + function httpSerialize(component) { + const secure = String(component.scheme).toLowerCase() === "https"; + if (component.port === (secure ? 443 : 80) || component.port === "") { + component.port = void 0; + } + if (!component.path) { + component.path = "/"; + } + return component; + } + function wsParse(wsComponent) { + wsComponent.secure = wsIsSecure(wsComponent); + wsComponent.resourceName = (wsComponent.path || "/") + (wsComponent.query ? "?" + wsComponent.query : ""); + wsComponent.path = void 0; + wsComponent.query = void 0; + return wsComponent; + } + function wsSerialize(wsComponent) { + if (wsComponent.port === (wsIsSecure(wsComponent) ? 443 : 80) || wsComponent.port === "") { + wsComponent.port = void 0; + } + if (typeof wsComponent.secure === "boolean") { + wsComponent.scheme = wsComponent.secure ? "wss" : "ws"; + wsComponent.secure = void 0; + } + if (wsComponent.resourceName) { + const [path, query] = wsComponent.resourceName.split("?"); + wsComponent.path = path && path !== "/" ? path : void 0; + wsComponent.query = query; + wsComponent.resourceName = void 0; + } + wsComponent.fragment = void 0; + return wsComponent; + } + function urnParse(urnComponent, options) { + if (!urnComponent.path) { + urnComponent.error = "URN can not be parsed"; + return urnComponent; + } + const matches = urnComponent.path.match(URN_REG); + if (matches) { + const scheme = options.scheme || urnComponent.scheme || "urn"; + urnComponent.nid = matches[1].toLowerCase(); + urnComponent.nss = matches[2]; + const urnScheme = `${scheme}:${options.nid || urnComponent.nid}`; + const schemeHandler = getSchemeHandler(urnScheme); + urnComponent.path = void 0; + if (schemeHandler) { + urnComponent = schemeHandler.parse(urnComponent, options); + } + } else { + urnComponent.error = urnComponent.error || "URN can not be parsed."; + } + return urnComponent; + } + function urnSerialize(urnComponent, options) { + if (urnComponent.nid === void 0) { + throw new Error("URN without nid cannot be serialized"); + } + const scheme = options.scheme || urnComponent.scheme || "urn"; + const nid = urnComponent.nid.toLowerCase(); + const urnScheme = `${scheme}:${options.nid || nid}`; + const schemeHandler = getSchemeHandler(urnScheme); + if (schemeHandler) { + urnComponent = schemeHandler.serialize(urnComponent, options); + } + const uriComponent = urnComponent; + const nss = urnComponent.nss; + uriComponent.path = `${nid || options.nid}:${nss}`; + options.skipEscape = true; + return uriComponent; + } + function urnuuidParse(urnComponent, options) { + const uuidComponent = urnComponent; + uuidComponent.uuid = uuidComponent.nss; + uuidComponent.nss = void 0; + if (!options.tolerant && (!uuidComponent.uuid || !isUUID(uuidComponent.uuid))) { + uuidComponent.error = uuidComponent.error || "UUID is not valid."; + } + return uuidComponent; + } + function urnuuidSerialize(uuidComponent) { + const urnComponent = uuidComponent; + urnComponent.nss = (uuidComponent.uuid || "").toLowerCase(); + return urnComponent; + } + var http = ( + /** @type {SchemeHandler} */ + { + scheme: "http", + domainHost: true, + parse: httpParse, + serialize: httpSerialize + } + ); + var https = ( + /** @type {SchemeHandler} */ + { + scheme: "https", + domainHost: http.domainHost, + parse: httpParse, + serialize: httpSerialize + } + ); + var ws = ( + /** @type {SchemeHandler} */ + { + scheme: "ws", + domainHost: true, + parse: wsParse, + serialize: wsSerialize + } + ); + var wss = ( + /** @type {SchemeHandler} */ + { + scheme: "wss", + domainHost: ws.domainHost, + parse: ws.parse, + serialize: ws.serialize + } + ); + var urn = ( + /** @type {SchemeHandler} */ + { + scheme: "urn", + parse: urnParse, + serialize: urnSerialize, + skipNormalize: true + } + ); + var urnuuid = ( + /** @type {SchemeHandler} */ + { + scheme: "urn:uuid", + parse: urnuuidParse, + serialize: urnuuidSerialize, + skipNormalize: true + } + ); + var SCHEMES = ( + /** @type {Record<SchemeName, SchemeHandler>} */ + { + http, + https, + ws, + wss, + urn, + "urn:uuid": urnuuid + } + ); + Object.setPrototypeOf(SCHEMES, null); + function getSchemeHandler(scheme) { + return scheme && (SCHEMES[ + /** @type {SchemeName} */ + scheme + ] || SCHEMES[ + /** @type {SchemeName} */ + scheme.toLowerCase() + ]) || void 0; + } + module.exports = { + wsIsSecure, + SCHEMES, + isValidSchemeName, + getSchemeHandler + }; + } +}); + +// node_modules/fast-uri/index.js +var require_fast_uri = __commonJS({ + "node_modules/fast-uri/index.js"(exports, module) { + "use strict"; + var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils(); + var { SCHEMES, getSchemeHandler } = require_schemes(); + function normalize(uri, options) { + if (typeof uri === "string") { + uri = /** @type {T} */ + normalizeString(uri, options); + } else if (typeof uri === "object") { + uri = /** @type {T} */ + parse3(serialize(uri, options), options); + } + return uri; + } + function resolve(baseURI, relativeURI, options) { + const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" }; + const resolved = resolveComponent(parse3(baseURI, schemelessOptions), parse3(relativeURI, schemelessOptions), schemelessOptions, true); + schemelessOptions.skipEscape = true; + return serialize(resolved, schemelessOptions); + } + function resolveComponent(base, relative, options, skipNormalization) { + const target = {}; + if (!skipNormalization) { + base = parse3(serialize(base, options), options); + relative = parse3(serialize(relative, options), options); + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== void 0 || relative.host !== void 0 || relative.port !== void 0) { + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== void 0) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path[0] === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; + } + function equal(uriA, uriB, options) { + const normalizedA = normalizeComparableURI(uriA, options); + const normalizedB = normalizeComparableURI(uriB, options); + return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA.toLowerCase() === normalizedB.toLowerCase(); + } + function serialize(cmpts, opts) { + const component = { + host: cmpts.host, + scheme: cmpts.scheme, + userinfo: cmpts.userinfo, + port: cmpts.port, + path: cmpts.path, + query: cmpts.query, + nid: cmpts.nid, + nss: cmpts.nss, + uuid: cmpts.uuid, + fragment: cmpts.fragment, + reference: cmpts.reference, + resourceName: cmpts.resourceName, + secure: cmpts.secure, + error: "" + }; + const options = Object.assign({}, opts); + const uriTokens = []; + const schemeHandler = getSchemeHandler(options.scheme || component.scheme); + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options); + if (component.path !== void 0) { + if (!options.skipEscape) { + component.path = escapePreservingEscapes(component.path); + if (component.scheme !== void 0) { + component.path = component.path.split("%3A").join(":"); + } + } else { + component.path = normalizePercentEncoding(component.path); + } + } + if (options.reference !== "suffix" && component.scheme) { + uriTokens.push(component.scheme, ":"); + } + const authority = recomposeAuthority(component); + if (authority !== void 0) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (component.path && component.path[0] !== "/") { + uriTokens.push("/"); + } + } + if (component.path !== void 0) { + let s = component.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === void 0 && s[0] === "/" && s[1] === "/") { + s = "/%2F" + s.slice(2); + } + uriTokens.push(s); + } + if (component.query !== void 0) { + uriTokens.push("?", component.query); + } + if (component.fragment !== void 0) { + uriTokens.push("#", component.fragment); + } + return uriTokens.join(""); + } + var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u; + function getParseError(parsed, matches) { + if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") { + return 'URI path must start with "/" when authority is present.'; + } + if (typeof parsed.port === "number" && (parsed.port < 0 || parsed.port > 65535)) { + return "URI port is malformed."; + } + return void 0; + } + function parseWithStatus(uri, opts) { + const options = Object.assign({}, opts); + const parsed = { + scheme: void 0, + userinfo: void 0, + host: "", + port: void 0, + path: "", + query: void 0, + fragment: void 0 + }; + let malformedAuthorityOrPort = false; + let isIP = false; + if (options.reference === "suffix") { + if (options.scheme) { + uri = options.scheme + ":" + uri; + } else { + uri = "//" + uri; + } + } + const matches = uri.match(URI_PARSE); + if (matches) { + parsed.scheme = matches[1]; + parsed.userinfo = matches[3]; + parsed.host = matches[4]; + parsed.port = parseInt(matches[5], 10); + parsed.path = matches[6] || ""; + parsed.query = matches[7]; + parsed.fragment = matches[8]; + if (isNaN(parsed.port)) { + parsed.port = matches[5]; + } + const parseError = getParseError(parsed, matches); + if (parseError !== void 0) { + parsed.error = parsed.error || parseError; + malformedAuthorityOrPort = true; + } + if (parsed.host) { + const ipv4result = isIPv4(parsed.host); + if (ipv4result === false) { + const ipv6result = normalizeIPv6(parsed.host); + parsed.host = ipv6result.host.toLowerCase(); + isIP = ipv6result.isIPV6; + } else { + isIP = true; + } + } + if (parsed.scheme === void 0 && parsed.userinfo === void 0 && parsed.host === void 0 && parsed.port === void 0 && parsed.query === void 0 && !parsed.path) { + parsed.reference = "same-document"; + } else if (parsed.scheme === void 0) { + parsed.reference = "relative"; + } else if (parsed.fragment === void 0) { + parsed.reference = "absolute"; + } else { + parsed.reference = "uri"; + } + if (options.reference && options.reference !== "suffix" && options.reference !== parsed.reference) { + parsed.error = parsed.error || "URI is not a " + options.reference + " reference."; + } + const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme); + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + if (parsed.host && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) { + try { + parsed.host = URL.domainToASCII(parsed.host.toLowerCase()); + } catch (e) { + parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e; + } + } + } + if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) { + if (uri.indexOf("%") !== -1) { + if (parsed.scheme !== void 0) { + parsed.scheme = unescape(parsed.scheme); + } + if (parsed.host !== void 0) { + parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP); + } + } + if (parsed.path) { + parsed.path = normalizePathEncoding(parsed.path); + } + if (parsed.fragment) { + try { + parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment)); + } catch { + parsed.error = parsed.error || "URI malformed"; + } + } + } + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(parsed, options); + } + } else { + parsed.error = parsed.error || "URI can not be parsed."; + } + return { parsed, malformedAuthorityOrPort }; + } + function parse3(uri, opts) { + return parseWithStatus(uri, opts).parsed; + } + function normalizeString(uri, opts) { + return normalizeStringWithStatus(uri, opts).normalized; + } + function normalizeStringWithStatus(uri, opts) { + const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts); + return { + normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts), + malformedAuthorityOrPort + }; + } + function normalizeComparableURI(uri, opts) { + if (typeof uri === "string") { + const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts); + return malformedAuthorityOrPort ? void 0 : normalized; + } + if (typeof uri === "object") { + return serialize(uri, opts); + } + } + var fastUri = { + SCHEMES, + normalize, + resolve, + resolveComponent, + equal, + serialize, + parse: parse3 + }; + module.exports = fastUri; + module.exports.default = fastUri; + module.exports.fastUri = fastUri; + } +}); + +// node_modules/ajv/dist/runtime/uri.js +var require_uri = __commonJS({ + "node_modules/ajv/dist/runtime/uri.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var uri = require_fast_uri(); + uri.code = 'require("ajv/dist/runtime/uri").default'; + exports.default = uri; + } +}); + +// node_modules/ajv/dist/core.js +var require_core = __commonJS({ + "node_modules/ajv/dist/core.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0; + var validate_1 = require_validate(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error(); + var ref_error_1 = require_ref_error(); + var rules_1 = require_rules(); + var compile_1 = require_compile(); + var codegen_2 = require_codegen(); + var resolve_1 = require_resolve(); + var dataType_1 = require_dataType(); + var util_1 = require_util(); + var $dataRefSchema = require_data(); + var uri_1 = require_uri(); + var defaultRegExp = (str, flags) => new RegExp(str, flags); + defaultRegExp.code = "new RegExp"; + var META_IGNORE_OPTIONS = ["removeAdditional", "useDefaults", "coerceTypes"]; + var EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([ + "validate", + "serialize", + "parse", + "wrapper", + "root", + "schema", + "keyword", + "pattern", + "formats", + "validate$data", + "func", + "obj", + "Error" + ]); + var removedOptions = { + errorDataPath: "", + format: "`validateFormats: false` can be used instead.", + nullable: '"nullable" keyword is supported by default.', + jsonPointers: "Deprecated jsPropertySyntax can be used instead.", + extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.", + missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.", + processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`", + sourceCode: "Use option `code: {source: true}`", + strictDefaults: "It is default now, see option `strict`.", + strictKeywords: "It is default now, see option `strict`.", + uniqueItems: '"uniqueItems" keyword is always validated.', + unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).", + cache: "Map is used as cache, schema object as key.", + serialize: "Map is used as cache, schema object as key.", + ajvErrors: "It is default now." + }; + var deprecatedOptions = { + ignoreKeywordsWithRef: "", + jsPropertySyntax: "", + unicode: '"minLength"/"maxLength" account for unicode characters by default.' + }; + var MAX_EXPRESSION = 200; + function requiredOptions(o) { + var _a2, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; + const s = o.strict; + const _optz = (_a2 = o.code) === null || _a2 === void 0 ? void 0 : _a2.optimize; + const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0; + const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp; + const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default; + return { + strictSchema: (_f = (_e = o.strictSchema) !== null && _e !== void 0 ? _e : s) !== null && _f !== void 0 ? _f : true, + strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true, + strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log", + strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log", + strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false, + code: o.code ? { ...o.code, optimize, regExp } : { optimize, regExp }, + loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION, + loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION, + meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true, + messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true, + inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true, + schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id", + addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true, + validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true, + validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true, + unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true, + int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true, + uriResolver + }; + } + var Ajv2 = class { + constructor(opts = {}) { + this.schemas = {}; + this.refs = {}; + this.formats = /* @__PURE__ */ Object.create(null); + this._compilations = /* @__PURE__ */ new Set(); + this._loading = {}; + this._cache = /* @__PURE__ */ new Map(); + opts = this.opts = { ...opts, ...requiredOptions(opts) }; + const { es5, lines } = this.opts.code; + this.scope = new codegen_2.ValueScope({ scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines }); + this.logger = getLogger(opts.logger); + const formatOpt = opts.validateFormats; + opts.validateFormats = false; + this.RULES = (0, rules_1.getRules)(); + checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED"); + checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn"); + this._metaOpts = getMetaSchemaOptions.call(this); + if (opts.formats) + addInitialFormats.call(this); + this._addVocabularies(); + this._addDefaultMetaSchema(); + if (opts.keywords) + addInitialKeywords.call(this, opts.keywords); + if (typeof opts.meta == "object") + this.addMetaSchema(opts.meta); + addInitialSchemas.call(this); + opts.validateFormats = formatOpt; + } + _addVocabularies() { + this.addKeyword("$async"); + } + _addDefaultMetaSchema() { + const { $data, meta: meta3, schemaId } = this.opts; + let _dataRefSchema = $dataRefSchema; + if (schemaId === "id") { + _dataRefSchema = { ...$dataRefSchema }; + _dataRefSchema.id = _dataRefSchema.$id; + delete _dataRefSchema.$id; + } + if (meta3 && $data) + this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false); + } + defaultMeta() { + const { meta: meta3, schemaId } = this.opts; + return this.opts.defaultMeta = typeof meta3 == "object" ? meta3[schemaId] || meta3 : void 0; + } + validate(schemaKeyRef, data) { + let v; + if (typeof schemaKeyRef == "string") { + v = this.getSchema(schemaKeyRef); + if (!v) + throw new Error(`no schema with key or ref "${schemaKeyRef}"`); + } else { + v = this.compile(schemaKeyRef); + } + const valid = v(data); + if (!("$async" in v)) + this.errors = v.errors; + return valid; + } + compile(schema, _meta) { + const sch = this._addSchema(schema, _meta); + return sch.validate || this._compileSchemaEnv(sch); + } + compileAsync(schema, meta3) { + if (typeof this.opts.loadSchema != "function") { + throw new Error("options.loadSchema should be a function"); + } + const { loadSchema } = this.opts; + return runCompileAsync.call(this, schema, meta3); + async function runCompileAsync(_schema, _meta) { + await loadMetaSchema.call(this, _schema.$schema); + const sch = this._addSchema(_schema, _meta); + return sch.validate || _compileAsync.call(this, sch); + } + async function loadMetaSchema($ref) { + if ($ref && !this.getSchema($ref)) { + await runCompileAsync.call(this, { $ref }, true); + } + } + async function _compileAsync(sch) { + try { + return this._compileSchemaEnv(sch); + } catch (e) { + if (!(e instanceof ref_error_1.default)) + throw e; + checkLoaded.call(this, e); + await loadMissingSchema.call(this, e.missingSchema); + return _compileAsync.call(this, sch); + } + } + function checkLoaded({ missingSchema: ref, missingRef }) { + if (this.refs[ref]) { + throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`); + } + } + async function loadMissingSchema(ref) { + const _schema = await _loadSchema.call(this, ref); + if (!this.refs[ref]) + await loadMetaSchema.call(this, _schema.$schema); + if (!this.refs[ref]) + this.addSchema(_schema, ref, meta3); + } + async function _loadSchema(ref) { + const p = this._loading[ref]; + if (p) + return p; + try { + return await (this._loading[ref] = loadSchema(ref)); + } finally { + delete this._loading[ref]; + } + } + } + // Adds schema to the instance + addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) { + if (Array.isArray(schema)) { + for (const sch of schema) + this.addSchema(sch, void 0, _meta, _validateSchema); + return this; + } + let id; + if (typeof schema === "object") { + const { schemaId } = this.opts; + id = schema[schemaId]; + if (id !== void 0 && typeof id != "string") { + throw new Error(`schema ${schemaId} must be string`); + } + } + key = (0, resolve_1.normalizeId)(key || id); + this._checkUnique(key); + this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true); + return this; + } + // Add schema that will be used to validate other schemas + // options in META_IGNORE_OPTIONS are alway set to false + addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) { + this.addSchema(schema, key, true, _validateSchema); + return this; + } + // Validate schema against its meta-schema + validateSchema(schema, throwOrLogError) { + if (typeof schema == "boolean") + return true; + let $schema; + $schema = schema.$schema; + if ($schema !== void 0 && typeof $schema != "string") { + throw new Error("$schema must be a string"); + } + $schema = $schema || this.opts.defaultMeta || this.defaultMeta(); + if (!$schema) { + this.logger.warn("meta-schema not available"); + this.errors = null; + return true; + } + const valid = this.validate($schema, schema); + if (!valid && throwOrLogError) { + const message = "schema is invalid: " + this.errorsText(); + if (this.opts.validateSchema === "log") + this.logger.error(message); + else + throw new Error(message); + } + return valid; + } + // Get compiled schema by `key` or `ref`. + // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id) + getSchema(keyRef) { + let sch; + while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") + keyRef = sch; + if (sch === void 0) { + const { schemaId } = this.opts; + const root = new compile_1.SchemaEnv({ schema: {}, schemaId }); + sch = compile_1.resolveSchema.call(this, root, keyRef); + if (!sch) + return; + this.refs[keyRef] = sch; + } + return sch.validate || this._compileSchemaEnv(sch); + } + // Remove cached schema(s). + // If no parameter is passed all schemas but meta-schemas are removed. + // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + // Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + removeSchema(schemaKeyRef) { + if (schemaKeyRef instanceof RegExp) { + this._removeAllSchemas(this.schemas, schemaKeyRef); + this._removeAllSchemas(this.refs, schemaKeyRef); + return this; + } + switch (typeof schemaKeyRef) { + case "undefined": + this._removeAllSchemas(this.schemas); + this._removeAllSchemas(this.refs); + this._cache.clear(); + return this; + case "string": { + const sch = getSchEnv.call(this, schemaKeyRef); + if (typeof sch == "object") + this._cache.delete(sch.schema); + delete this.schemas[schemaKeyRef]; + delete this.refs[schemaKeyRef]; + return this; + } + case "object": { + const cacheKey = schemaKeyRef; + this._cache.delete(cacheKey); + let id = schemaKeyRef[this.opts.schemaId]; + if (id) { + id = (0, resolve_1.normalizeId)(id); + delete this.schemas[id]; + delete this.refs[id]; + } + return this; + } + default: + throw new Error("ajv.removeSchema: invalid parameter"); + } + } + // add "vocabulary" - a collection of keywords + addVocabulary(definitions) { + for (const def of definitions) + this.addKeyword(def); + return this; + } + addKeyword(kwdOrDef, def) { + let keyword; + if (typeof kwdOrDef == "string") { + keyword = kwdOrDef; + if (typeof def == "object") { + this.logger.warn("these parameters are deprecated, see docs for addKeyword"); + def.keyword = keyword; + } + } else if (typeof kwdOrDef == "object" && def === void 0) { + def = kwdOrDef; + keyword = def.keyword; + if (Array.isArray(keyword) && !keyword.length) { + throw new Error("addKeywords: keyword must be string or non-empty array"); + } + } else { + throw new Error("invalid addKeywords parameters"); + } + checkKeyword.call(this, keyword, def); + if (!def) { + (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd)); + return this; + } + keywordMetaschema.call(this, def); + const definition = { + ...def, + type: (0, dataType_1.getJSONTypes)(def.type), + schemaType: (0, dataType_1.getJSONTypes)(def.schemaType) + }; + (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k) => addRule.call(this, k, definition) : (k) => definition.type.forEach((t) => addRule.call(this, k, definition, t))); + return this; + } + getKeyword(keyword) { + const rule = this.RULES.all[keyword]; + return typeof rule == "object" ? rule.definition : !!rule; + } + // Remove keyword + removeKeyword(keyword) { + const { RULES } = this; + delete RULES.keywords[keyword]; + delete RULES.all[keyword]; + for (const group of RULES.rules) { + const i = group.rules.findIndex((rule) => rule.keyword === keyword); + if (i >= 0) + group.rules.splice(i, 1); + } + return this; + } + // Add format + addFormat(name, format) { + if (typeof format == "string") + format = new RegExp(format); + this.formats[name] = format; + return this; + } + errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) { + if (!errors || errors.length === 0) + return "No errors"; + return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg); + } + $dataMetaSchema(metaSchema, keywordsJsonPointers) { + const rules = this.RULES.all; + metaSchema = JSON.parse(JSON.stringify(metaSchema)); + for (const jsonPointer of keywordsJsonPointers) { + const segments = jsonPointer.split("/").slice(1); + let keywords = metaSchema; + for (const seg of segments) + keywords = keywords[seg]; + for (const key in rules) { + const rule = rules[key]; + if (typeof rule != "object") + continue; + const { $data } = rule.definition; + const schema = keywords[key]; + if ($data && schema) + keywords[key] = schemaOrData(schema); + } + } + return metaSchema; + } + _removeAllSchemas(schemas, regex) { + for (const keyRef in schemas) { + const sch = schemas[keyRef]; + if (!regex || regex.test(keyRef)) { + if (typeof sch == "string") { + delete schemas[keyRef]; + } else if (sch && !sch.meta) { + this._cache.delete(sch.schema); + delete schemas[keyRef]; + } + } + } + } + _addSchema(schema, meta3, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) { + let id; + const { schemaId } = this.opts; + if (typeof schema == "object") { + id = schema[schemaId]; + } else { + if (this.opts.jtd) + throw new Error("schema must be object"); + else if (typeof schema != "boolean") + throw new Error("schema must be object or boolean"); + } + let sch = this._cache.get(schema); + if (sch !== void 0) + return sch; + baseId = (0, resolve_1.normalizeId)(id || baseId); + const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId); + sch = new compile_1.SchemaEnv({ schema, schemaId, meta: meta3, baseId, localRefs }); + this._cache.set(sch.schema, sch); + if (addSchema && !baseId.startsWith("#")) { + if (baseId) + this._checkUnique(baseId); + this.refs[baseId] = sch; + } + if (validateSchema) + this.validateSchema(schema, true); + return sch; + } + _checkUnique(id) { + if (this.schemas[id] || this.refs[id]) { + throw new Error(`schema with key or id "${id}" already exists`); + } + } + _compileSchemaEnv(sch) { + if (sch.meta) + this._compileMetaSchema(sch); + else + compile_1.compileSchema.call(this, sch); + if (!sch.validate) + throw new Error("ajv implementation error"); + return sch.validate; + } + _compileMetaSchema(sch) { + const currentOpts = this.opts; + this.opts = this._metaOpts; + try { + compile_1.compileSchema.call(this, sch); + } finally { + this.opts = currentOpts; + } + } + }; + Ajv2.ValidationError = validation_error_1.default; + Ajv2.MissingRefError = ref_error_1.default; + exports.default = Ajv2; + function checkOptions(checkOpts, options, msg, log = "error") { + for (const key in checkOpts) { + const opt = key; + if (opt in options) + this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`); + } + } + function getSchEnv(keyRef) { + keyRef = (0, resolve_1.normalizeId)(keyRef); + return this.schemas[keyRef] || this.refs[keyRef]; + } + function addInitialSchemas() { + const optsSchemas = this.opts.schemas; + if (!optsSchemas) + return; + if (Array.isArray(optsSchemas)) + this.addSchema(optsSchemas); + else + for (const key in optsSchemas) + this.addSchema(optsSchemas[key], key); + } + function addInitialFormats() { + for (const name in this.opts.formats) { + const format = this.opts.formats[name]; + if (format) + this.addFormat(name, format); + } + } + function addInitialKeywords(defs) { + if (Array.isArray(defs)) { + this.addVocabulary(defs); + return; + } + this.logger.warn("keywords option as map is deprecated, pass array"); + for (const keyword in defs) { + const def = defs[keyword]; + if (!def.keyword) + def.keyword = keyword; + this.addKeyword(def); + } + } + function getMetaSchemaOptions() { + const metaOpts = { ...this.opts }; + for (const opt of META_IGNORE_OPTIONS) + delete metaOpts[opt]; + return metaOpts; + } + var noLogs = { log() { + }, warn() { + }, error() { + } }; + function getLogger(logger) { + if (logger === false) + return noLogs; + if (logger === void 0) + return console; + if (logger.log && logger.warn && logger.error) + return logger; + throw new Error("logger must implement log, warn and error methods"); + } + var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i; + function checkKeyword(keyword, def) { + const { RULES } = this; + (0, util_1.eachItem)(keyword, (kwd) => { + if (RULES.keywords[kwd]) + throw new Error(`Keyword ${kwd} is already defined`); + if (!KEYWORD_NAME.test(kwd)) + throw new Error(`Keyword ${kwd} has invalid name`); + }); + if (!def) + return; + if (def.$data && !("code" in def || "validate" in def)) { + throw new Error('$data keyword must have "code" or "validate" function'); + } + } + function addRule(keyword, definition, dataType) { + var _a2; + const post = definition === null || definition === void 0 ? void 0 : definition.post; + if (dataType && post) + throw new Error('keyword with "post" flag cannot have "type"'); + const { RULES } = this; + let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType); + if (!ruleGroup) { + ruleGroup = { type: dataType, rules: [] }; + RULES.rules.push(ruleGroup); + } + RULES.keywords[keyword] = true; + if (!definition) + return; + const rule = { + keyword, + definition: { + ...definition, + type: (0, dataType_1.getJSONTypes)(definition.type), + schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType) + } + }; + if (definition.before) + addBeforeRule.call(this, ruleGroup, rule, definition.before); + else + ruleGroup.rules.push(rule); + RULES.all[keyword] = rule; + (_a2 = definition.implements) === null || _a2 === void 0 ? void 0 : _a2.forEach((kwd) => this.addKeyword(kwd)); + } + function addBeforeRule(ruleGroup, rule, before) { + const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before); + if (i >= 0) { + ruleGroup.rules.splice(i, 0, rule); + } else { + ruleGroup.rules.push(rule); + this.logger.warn(`rule ${before} is not defined`); + } + } + function keywordMetaschema(def) { + let { metaSchema } = def; + if (metaSchema === void 0) + return; + if (def.$data && this.opts.$data) + metaSchema = schemaOrData(metaSchema); + def.validateSchema = this.compile(metaSchema, true); + } + var $dataRef = { + $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" + }; + function schemaOrData(schema) { + return { anyOf: [schema, $dataRef] }; + } + } +}); + +// node_modules/ajv/dist/vocabularies/core/id.js +var require_id = __commonJS({ + "node_modules/ajv/dist/vocabularies/core/id.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var def = { + keyword: "id", + code() { + throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID'); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/core/ref.js +var require_ref = __commonJS({ + "node_modules/ajv/dist/vocabularies/core/ref.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.callRef = exports.getValidate = void 0; + var ref_error_1 = require_ref_error(); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var compile_1 = require_compile(); + var util_1 = require_util(); + var def = { + keyword: "$ref", + schemaType: "string", + code(cxt) { + const { gen, schema: $ref, it } = cxt; + const { baseId, schemaEnv: env, validateName, opts, self } = it; + const { root } = env; + if (($ref === "#" || $ref === "#/") && baseId === root.baseId) + return callRootRef(); + const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); + if (schOrEnv === void 0) + throw new ref_error_1.default(it.opts.uriResolver, baseId, $ref); + if (schOrEnv instanceof compile_1.SchemaEnv) + return callValidate(schOrEnv); + return inlineRefSchema(schOrEnv); + function callRootRef() { + if (env === root) + return callRef(cxt, validateName, env, env.$async); + const rootName = gen.scopeValue("root", { ref: root }); + return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async); + } + function callValidate(sch) { + const v = getValidate(cxt, sch); + callRef(cxt, v, sch, sch.$async); + } + function inlineRefSchema(sch) { + const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: (0, codegen_1.stringify)(sch) } : { ref: sch }); + const valid = gen.name("valid"); + const schCxt = cxt.subschema({ + schema: sch, + dataTypes: [], + schemaPath: codegen_1.nil, + topSchemaRef: schName, + errSchemaPath: $ref + }, valid); + cxt.mergeEvaluated(schCxt); + cxt.ok(valid); + } + } + }; + function getValidate(cxt, sch) { + const { gen } = cxt; + return sch.validate ? gen.scopeValue("validate", { ref: sch.validate }) : (0, codegen_1._)`${gen.scopeValue("wrapper", { ref: sch })}.validate`; + } + exports.getValidate = getValidate; + function callRef(cxt, v, sch, $async) { + const { gen, it } = cxt; + const { allErrors, schemaEnv: env, opts } = it; + const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; + if ($async) + callAsyncRef(); + else + callSyncRef(); + function callAsyncRef() { + if (!env.$async) + throw new Error("async schema referenced by sync schema"); + const valid = gen.let("valid"); + gen.try(() => { + gen.code((0, codegen_1._)`await ${(0, code_1.callValidateCode)(cxt, v, passCxt)}`); + addEvaluatedFrom(v); + if (!allErrors) + gen.assign(valid, true); + }, (e) => { + gen.if((0, codegen_1._)`!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); + addErrorsFrom(e); + if (!allErrors) + gen.assign(valid, false); + }); + cxt.ok(valid); + } + function callSyncRef() { + cxt.result((0, code_1.callValidateCode)(cxt, v, passCxt), () => addEvaluatedFrom(v), () => addErrorsFrom(v)); + } + function addErrorsFrom(source) { + const errs = (0, codegen_1._)`${source}.errors`; + gen.assign(names_1.default.vErrors, (0, codegen_1._)`${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); + gen.assign(names_1.default.errors, (0, codegen_1._)`${names_1.default.vErrors}.length`); + } + function addEvaluatedFrom(source) { + var _a2; + if (!it.opts.unevaluated) + return; + const schEvaluated = (_a2 = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a2 === void 0 ? void 0 : _a2.evaluated; + if (it.props !== true) { + if (schEvaluated && !schEvaluated.dynamicProps) { + if (schEvaluated.props !== void 0) { + it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); + } + } else { + const props = gen.var("props", (0, codegen_1._)`${source}.evaluated.props`); + it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); + } + } + if (it.items !== true) { + if (schEvaluated && !schEvaluated.dynamicItems) { + if (schEvaluated.items !== void 0) { + it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); + } + } else { + const items = gen.var("items", (0, codegen_1._)`${source}.evaluated.items`); + it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); + } + } + } + } + exports.callRef = callRef; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/core/index.js +var require_core2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/core/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var id_1 = require_id(); + var ref_1 = require_ref(); + var core = [ + "$schema", + "$id", + "$defs", + "$vocabulary", + { keyword: "$comment" }, + "definitions", + id_1.default, + ref_1.default + ]; + exports.default = core; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitNumber.js +var require_limitNumber = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitNumber.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var ops = codegen_1.operators; + var KWDs = { + maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, + minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, + exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, + exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } + }; + var error48 = { + message: ({ keyword, schemaCode }) => (0, codegen_1.str)`must be ${KWDs[keyword].okStr} ${schemaCode}`, + params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` + }; + var def = { + keyword: Object.keys(KWDs), + type: "number", + schemaType: "number", + $data: true, + error: error48, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + cxt.fail$data((0, codegen_1._)`${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/multipleOf.js +var require_multipleOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/multipleOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error48 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must be multiple of ${schemaCode}`, + params: ({ schemaCode }) => (0, codegen_1._)`{multipleOf: ${schemaCode}}` + }; + var def = { + keyword: "multipleOf", + type: "number", + schemaType: "number", + $data: true, + error: error48, + code(cxt) { + const { gen, data, schemaCode, it } = cxt; + const prec = it.opts.multipleOfPrecision; + const res = gen.let("res"); + const invalid = prec ? (0, codegen_1._)`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}` : (0, codegen_1._)`${res} !== parseInt(${res})`; + cxt.fail$data((0, codegen_1._)`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/runtime/ucs2length.js +var require_ucs2length = __commonJS({ + "node_modules/ajv/dist/runtime/ucs2length.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function ucs2length(str) { + const len = str.length; + let length = 0; + let pos = 0; + let value; + while (pos < len) { + length++; + value = str.charCodeAt(pos++); + if (value >= 55296 && value <= 56319 && pos < len) { + value = str.charCodeAt(pos); + if ((value & 64512) === 56320) + pos++; + } + } + return length; + } + exports.default = ucs2length; + ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitLength.js +var require_limitLength = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitLength.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var ucs2length_1 = require_ucs2length(); + var error48 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxLength" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} characters`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxLength", "minLength"], + type: "string", + schemaType: "number", + $data: true, + error: error48, + code(cxt) { + const { keyword, data, schemaCode, it } = cxt; + const op = keyword === "maxLength" ? codegen_1.operators.GT : codegen_1.operators.LT; + const len = it.opts.unicode === false ? (0, codegen_1._)`${data}.length` : (0, codegen_1._)`${(0, util_1.useFunc)(cxt.gen, ucs2length_1.default)}(${data})`; + cxt.fail$data((0, codegen_1._)`${len} ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/pattern.js +var require_pattern = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/pattern.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var util_1 = require_util(); + var codegen_1 = require_codegen(); + var error48 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match pattern "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{pattern: ${schemaCode}}` + }; + var def = { + keyword: "pattern", + type: "string", + schemaType: "string", + $data: true, + error: error48, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const u = it.opts.unicodeRegExp ? "u" : ""; + if ($data) { + const { regExp } = it.opts.code; + const regExpCode = regExp.code === "new RegExp" ? (0, codegen_1._)`new RegExp` : (0, util_1.useFunc)(gen, regExp); + const valid = gen.let("valid"); + gen.try(() => gen.assign(valid, (0, codegen_1._)`${regExpCode}(${schemaCode}, ${u}).test(${data})`), () => gen.assign(valid, false)); + cxt.fail$data((0, codegen_1._)`!${valid}`); + } else { + const regExp = (0, code_1.usePattern)(cxt, schema); + cxt.fail$data((0, codegen_1._)`!${regExp}.test(${data})`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitProperties.js +var require_limitProperties = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error48 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxProperties" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} properties`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxProperties", "minProperties"], + type: "object", + schemaType: "number", + $data: true, + error: error48, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`Object.keys(${data}).length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/required.js +var require_required = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/required.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error48 = { + message: ({ params: { missingProperty } }) => (0, codegen_1.str)`must have required property '${missingProperty}'`, + params: ({ params: { missingProperty } }) => (0, codegen_1._)`{missingProperty: ${missingProperty}}` + }; + var def = { + keyword: "required", + type: "object", + schemaType: "array", + $data: true, + error: error48, + code(cxt) { + const { gen, schema, schemaCode, data, $data, it } = cxt; + const { opts } = it; + if (!$data && schema.length === 0) + return; + const useLoop = schema.length >= opts.loopRequired; + if (it.allErrors) + allErrorsMode(); + else + exitOnErrorMode(); + if (opts.strictRequired) { + const props = cxt.parentSchema.properties; + const { definedProperties } = cxt.it; + for (const requiredKey of schema) { + if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === void 0 && !definedProperties.has(requiredKey)) { + const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; + const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; + (0, util_1.checkStrictMode)(it, msg, it.opts.strictRequired); + } + } + } + function allErrorsMode() { + if (useLoop || $data) { + cxt.block$data(codegen_1.nil, loopAllRequired); + } else { + for (const prop of schema) { + (0, code_1.checkReportMissingProp)(cxt, prop); + } + } + } + function exitOnErrorMode() { + const missing = gen.let("missing"); + if (useLoop || $data) { + const valid = gen.let("valid", true); + cxt.block$data(valid, () => loopUntilMissing(missing, valid)); + cxt.ok(valid); + } else { + gen.if((0, code_1.checkMissingProp)(cxt, schema, missing)); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + function loopAllRequired() { + gen.forOf("prop", schemaCode, (prop) => { + cxt.setParams({ missingProperty: prop }); + gen.if((0, code_1.noPropertyInData)(gen, data, prop, opts.ownProperties), () => cxt.error()); + }); + } + function loopUntilMissing(missing, valid) { + cxt.setParams({ missingProperty: missing }); + gen.forOf(missing, schemaCode, () => { + gen.assign(valid, (0, code_1.propertyInData)(gen, data, missing, opts.ownProperties)); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(); + gen.break(); + }); + }, codegen_1.nil); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitItems.js +var require_limitItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error48 = { + message({ keyword, schemaCode }) { + const comp = keyword === "maxItems" ? "more" : "fewer"; + return (0, codegen_1.str)`must NOT have ${comp} than ${schemaCode} items`; + }, + params: ({ schemaCode }) => (0, codegen_1._)`{limit: ${schemaCode}}` + }; + var def = { + keyword: ["maxItems", "minItems"], + type: "array", + schemaType: "number", + $data: true, + error: error48, + code(cxt) { + const { keyword, data, schemaCode } = cxt; + const op = keyword === "maxItems" ? codegen_1.operators.GT : codegen_1.operators.LT; + cxt.fail$data((0, codegen_1._)`${data}.length ${op} ${schemaCode}`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/runtime/equal.js +var require_equal = __commonJS({ + "node_modules/ajv/dist/runtime/equal.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var equal = require_fast_deep_equal(); + equal.code = 'require("ajv/dist/runtime/equal").default'; + exports.default = equal; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +var require_uniqueItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dataType_1 = require_dataType(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var equal_1 = require_equal(); + var error48 = { + message: ({ params: { i, j } }) => (0, codegen_1.str)`must NOT have duplicate items (items ## ${j} and ${i} are identical)`, + params: ({ params: { i, j } }) => (0, codegen_1._)`{i: ${i}, j: ${j}}` + }; + var def = { + keyword: "uniqueItems", + type: "array", + schemaType: "boolean", + $data: true, + error: error48, + code(cxt) { + const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; + if (!$data && !schema) + return; + const valid = gen.let("valid"); + const itemTypes = parentSchema.items ? (0, dataType_1.getSchemaTypes)(parentSchema.items) : []; + cxt.block$data(valid, validateUniqueItems, (0, codegen_1._)`${schemaCode} === false`); + cxt.ok(valid); + function validateUniqueItems() { + const i = gen.let("i", (0, codegen_1._)`${data}.length`); + const j = gen.let("j"); + cxt.setParams({ i, j }); + gen.assign(valid, true); + gen.if((0, codegen_1._)`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j)); + } + function canOptimize() { + return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); + } + function loopN(i, j) { + const item = gen.name("item"); + const wrongType = (0, dataType_1.checkDataTypes)(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); + const indices = gen.const("indices", (0, codegen_1._)`{}`); + gen.for((0, codegen_1._)`;${i}--;`, () => { + gen.let(item, (0, codegen_1._)`${data}[${i}]`); + gen.if(wrongType, (0, codegen_1._)`continue`); + if (itemTypes.length > 1) + gen.if((0, codegen_1._)`typeof ${item} == "string"`, (0, codegen_1._)`${item} += "_"`); + gen.if((0, codegen_1._)`typeof ${indices}[${item}] == "number"`, () => { + gen.assign(j, (0, codegen_1._)`${indices}[${item}]`); + cxt.error(); + gen.assign(valid, false).break(); + }).code((0, codegen_1._)`${indices}[${item}] = ${i}`); + }); + } + function loopN2(i, j) { + const eql = (0, util_1.useFunc)(gen, equal_1.default); + const outer = gen.name("outer"); + gen.label(outer).for((0, codegen_1._)`;${i}--;`, () => gen.for((0, codegen_1._)`${j} = ${i}; ${j}--;`, () => gen.if((0, codegen_1._)`${eql}(${data}[${i}], ${data}[${j}])`, () => { + cxt.error(); + gen.assign(valid, false).break(outer); + }))); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/const.js +var require_const = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/const.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var equal_1 = require_equal(); + var error48 = { + message: "must be equal to constant", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValue: ${schemaCode}}` + }; + var def = { + keyword: "const", + $data: true, + error: error48, + code(cxt) { + const { gen, data, $data, schemaCode, schema } = cxt; + if ($data || schema && typeof schema == "object") { + cxt.fail$data((0, codegen_1._)`!${(0, util_1.useFunc)(gen, equal_1.default)}(${data}, ${schemaCode})`); + } else { + cxt.fail((0, codegen_1._)`${schema} !== ${data}`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/enum.js +var require_enum = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/enum.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var equal_1 = require_equal(); + var error48 = { + message: "must be equal to one of the allowed values", + params: ({ schemaCode }) => (0, codegen_1._)`{allowedValues: ${schemaCode}}` + }; + var def = { + keyword: "enum", + schemaType: "array", + $data: true, + error: error48, + code(cxt) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + if (!$data && schema.length === 0) + throw new Error("enum must have non-empty array"); + const useLoop = schema.length >= it.opts.loopEnum; + let eql; + const getEql = () => eql !== null && eql !== void 0 ? eql : eql = (0, util_1.useFunc)(gen, equal_1.default); + let valid; + if (useLoop || $data) { + valid = gen.let("valid"); + cxt.block$data(valid, loopEnum); + } else { + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const vSchema = gen.const("vSchema", schemaCode); + valid = (0, codegen_1.or)(...schema.map((_x, i) => equalCode(vSchema, i))); + } + cxt.pass(valid); + function loopEnum() { + gen.assign(valid, false); + gen.forOf("v", schemaCode, (v) => gen.if((0, codegen_1._)`${getEql()}(${data}, ${v})`, () => gen.assign(valid, true).break())); + } + function equalCode(vSchema, i) { + const sch = schema[i]; + return typeof sch === "object" && sch !== null ? (0, codegen_1._)`${getEql()}(${data}, ${vSchema}[${i}])` : (0, codegen_1._)`${data} === ${sch}`; + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/index.js +var require_validation = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var limitNumber_1 = require_limitNumber(); + var multipleOf_1 = require_multipleOf(); + var limitLength_1 = require_limitLength(); + var pattern_1 = require_pattern(); + var limitProperties_1 = require_limitProperties(); + var required_1 = require_required(); + var limitItems_1 = require_limitItems(); + var uniqueItems_1 = require_uniqueItems(); + var const_1 = require_const(); + var enum_1 = require_enum(); + var validation = [ + // number + limitNumber_1.default, + multipleOf_1.default, + // string + limitLength_1.default, + pattern_1.default, + // object + limitProperties_1.default, + required_1.default, + // array + limitItems_1.default, + uniqueItems_1.default, + // any + { keyword: "type", schemaType: ["string", "array"] }, + { keyword: "nullable", schemaType: "boolean" }, + const_1.default, + enum_1.default + ]; + exports.default = validation; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +var require_additionalItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateAdditionalItems = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error48 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "additionalItems", + type: "array", + schemaType: ["boolean", "object"], + before: "uniqueItems", + error: error48, + code(cxt) { + const { parentSchema, it } = cxt; + const { items } = parentSchema; + if (!Array.isArray(items)) { + (0, util_1.checkStrictMode)(it, '"additionalItems" is ignored when "items" is not an array of schemas'); + return; + } + validateAdditionalItems(cxt, items); + } + }; + function validateAdditionalItems(cxt, items) { + const { gen, schema, data, keyword, it } = cxt; + it.items = true; + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + if (schema === false) { + cxt.setParams({ len: items.length }); + cxt.pass((0, codegen_1._)`${len} <= ${items.length}`); + } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items.length}`); + gen.if((0, codegen_1.not)(valid), () => validateItems(valid)); + cxt.ok(valid); + } + function validateItems(valid) { + gen.forRange("i", items.length, len, (i) => { + cxt.subschema({ keyword, dataProp: i, dataPropType: util_1.Type.Num }, valid); + if (!it.allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + }); + } + } + exports.validateAdditionalItems = validateAdditionalItems; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/items.js +var require_items = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/items.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateTuple = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var code_1 = require_code2(); + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "array", "boolean"], + before: "uniqueItems", + code(cxt) { + const { schema, it } = cxt; + if (Array.isArray(schema)) + return validateTuple(cxt, "additionalItems", schema); + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + function validateTuple(cxt, extraItems, schArr = cxt.schema) { + const { gen, parentSchema, data, keyword, it } = cxt; + checkStrictTuple(parentSchema); + if (it.opts.unevaluated && schArr.length && it.items !== true) { + it.items = util_1.mergeEvaluated.items(gen, schArr.length, it.items); + } + const valid = gen.name("valid"); + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + schArr.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + gen.if((0, codegen_1._)`${len} > ${i}`, () => cxt.subschema({ + keyword, + schemaProp: i, + dataProp: i + }, valid)); + cxt.ok(valid); + }); + function checkStrictTuple(sch) { + const { opts, errSchemaPath } = it; + const l = schArr.length; + const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false); + if (opts.strictTuples && !fullTuple) { + const msg = `"${keyword}" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path "${errSchemaPath}"`; + (0, util_1.checkStrictMode)(it, msg, opts.strictTuples); + } + } + } + exports.validateTuple = validateTuple; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +var require_prefixItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var items_1 = require_items(); + var def = { + keyword: "prefixItems", + type: "array", + schemaType: ["array"], + before: "uniqueItems", + code: (cxt) => (0, items_1.validateTuple)(cxt, "items") + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/items2020.js +var require_items2020 = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/items2020.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var code_1 = require_code2(); + var additionalItems_1 = require_additionalItems(); + var error48 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "items", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + error: error48, + code(cxt) { + const { schema, parentSchema, it } = cxt; + const { prefixItems } = parentSchema; + it.items = true; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + if (prefixItems) + (0, additionalItems_1.validateAdditionalItems)(cxt, prefixItems); + else + cxt.ok((0, code_1.validateArray)(cxt)); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/contains.js +var require_contains = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/contains.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error48 = { + message: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1.str)`must contain at least ${min} valid item(s)` : (0, codegen_1.str)`must contain at least ${min} and no more than ${max} valid item(s)`, + params: ({ params: { min, max } }) => max === void 0 ? (0, codegen_1._)`{minContains: ${min}}` : (0, codegen_1._)`{minContains: ${min}, maxContains: ${max}}` + }; + var def = { + keyword: "contains", + type: "array", + schemaType: ["object", "boolean"], + before: "uniqueItems", + trackErrors: true, + error: error48, + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + let min; + let max; + const { minContains, maxContains } = parentSchema; + if (it.opts.next) { + min = minContains === void 0 ? 1 : minContains; + max = maxContains; + } else { + min = 1; + } + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + cxt.setParams({ min, max }); + if (max === void 0 && min === 0) { + (0, util_1.checkStrictMode)(it, `"minContains" == 0 without "maxContains": "contains" keyword ignored`); + return; + } + if (max !== void 0 && min > max) { + (0, util_1.checkStrictMode)(it, `"minContains" > "maxContains" is always invalid`); + cxt.fail(); + return; + } + if ((0, util_1.alwaysValidSchema)(it, schema)) { + let cond = (0, codegen_1._)`${len} >= ${min}`; + if (max !== void 0) + cond = (0, codegen_1._)`${cond} && ${len} <= ${max}`; + cxt.pass(cond); + return; + } + it.items = true; + const valid = gen.name("valid"); + if (max === void 0 && min === 1) { + validateItems(valid, () => gen.if(valid, () => gen.break())); + } else if (min === 0) { + gen.let(valid, true); + if (max !== void 0) + gen.if((0, codegen_1._)`${data}.length > 0`, validateItemsWithCount); + } else { + gen.let(valid, false); + validateItemsWithCount(); + } + cxt.result(valid, () => cxt.reset()); + function validateItemsWithCount() { + const schValid = gen.name("_valid"); + const count = gen.let("count", 0); + validateItems(schValid, () => gen.if(schValid, () => checkLimits(count))); + } + function validateItems(_valid, block) { + gen.forRange("i", 0, len, (i) => { + cxt.subschema({ + keyword: "contains", + dataProp: i, + dataPropType: util_1.Type.Num, + compositeRule: true + }, _valid); + block(); + }); + } + function checkLimits(count) { + gen.code((0, codegen_1._)`${count}++`); + if (max === void 0) { + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true).break()); + } else { + gen.if((0, codegen_1._)`${count} > ${max}`, () => gen.assign(valid, false).break()); + if (min === 1) + gen.assign(valid, true); + else + gen.if((0, codegen_1._)`${count} >= ${min}`, () => gen.assign(valid, true)); + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/dependencies.js +var require_dependencies = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/dependencies.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.validateSchemaDeps = exports.validatePropertyDeps = exports.error = void 0; + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var code_1 = require_code2(); + exports.error = { + message: ({ params: { property, depsCount, deps } }) => { + const property_ies = depsCount === 1 ? "property" : "properties"; + return (0, codegen_1.str)`must have ${property_ies} ${deps} when property ${property} is present`; + }, + params: ({ params: { property, depsCount, deps, missingProperty } }) => (0, codegen_1._)`{property: ${property}, + missingProperty: ${missingProperty}, + depsCount: ${depsCount}, + deps: ${deps}}` + // TODO change to reference + }; + var def = { + keyword: "dependencies", + type: "object", + schemaType: "object", + error: exports.error, + code(cxt) { + const [propDeps, schDeps] = splitDependencies(cxt); + validatePropertyDeps(cxt, propDeps); + validateSchemaDeps(cxt, schDeps); + } + }; + function splitDependencies({ schema }) { + const propertyDeps = {}; + const schemaDeps = {}; + for (const key in schema) { + if (key === "__proto__") + continue; + const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps; + deps[key] = schema[key]; + } + return [propertyDeps, schemaDeps]; + } + function validatePropertyDeps(cxt, propertyDeps = cxt.schema) { + const { gen, data, it } = cxt; + if (Object.keys(propertyDeps).length === 0) + return; + const missing = gen.let("missing"); + for (const prop in propertyDeps) { + const deps = propertyDeps[prop]; + if (deps.length === 0) + continue; + const hasProperty = (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties); + cxt.setParams({ + property: prop, + depsCount: deps.length, + deps: deps.join(", ") + }); + if (it.allErrors) { + gen.if(hasProperty, () => { + for (const depProp of deps) { + (0, code_1.checkReportMissingProp)(cxt, depProp); + } + }); + } else { + gen.if((0, codegen_1._)`${hasProperty} && (${(0, code_1.checkMissingProp)(cxt, deps, missing)})`); + (0, code_1.reportMissingProp)(cxt, missing); + gen.else(); + } + } + } + exports.validatePropertyDeps = validatePropertyDeps; + function validateSchemaDeps(cxt, schemaDeps = cxt.schema) { + const { gen, data, keyword, it } = cxt; + const valid = gen.name("valid"); + for (const prop in schemaDeps) { + if ((0, util_1.alwaysValidSchema)(it, schemaDeps[prop])) + continue; + gen.if( + (0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties), + () => { + const schCxt = cxt.subschema({ keyword, schemaProp: prop }, valid); + cxt.mergeValidEvaluated(schCxt, valid); + }, + () => gen.var(valid, true) + // TODO var + ); + cxt.ok(valid); + } + } + exports.validateSchemaDeps = validateSchemaDeps; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +var require_propertyNames = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error48 = { + message: "property name must be valid", + params: ({ params }) => (0, codegen_1._)`{propertyName: ${params.propertyName}}` + }; + var def = { + keyword: "propertyNames", + type: "object", + schemaType: ["object", "boolean"], + error: error48, + code(cxt) { + const { gen, schema, data, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) + return; + const valid = gen.name("valid"); + gen.forIn("key", data, (key) => { + cxt.setParams({ propertyName: key }); + cxt.subschema({ + keyword: "propertyNames", + data: key, + dataTypes: ["string"], + propertyName: key, + compositeRule: true + }, valid); + gen.if((0, codegen_1.not)(valid), () => { + cxt.error(true); + if (!it.allErrors) + gen.break(); + }); + }); + cxt.ok(valid); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +var require_additionalProperties = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var util_1 = require_util(); + var error48 = { + message: "must NOT have additional properties", + params: ({ params }) => (0, codegen_1._)`{additionalProperty: ${params.additionalProperty}}` + }; + var def = { + keyword: "additionalProperties", + type: ["object"], + schemaType: ["boolean", "object"], + allowUndefined: true, + trackErrors: true, + error: error48, + code(cxt) { + const { gen, schema, parentSchema, data, errsCount, it } = cxt; + if (!errsCount) + throw new Error("ajv implementation error"); + const { allErrors, opts } = it; + it.props = true; + if (opts.removeAdditional !== "all" && (0, util_1.alwaysValidSchema)(it, schema)) + return; + const props = (0, code_1.allSchemaProperties)(parentSchema.properties); + const patProps = (0, code_1.allSchemaProperties)(parentSchema.patternProperties); + checkAdditionalProperties(); + cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + function checkAdditionalProperties() { + gen.forIn("key", data, (key) => { + if (!props.length && !patProps.length) + additionalPropertyCode(key); + else + gen.if(isAdditional(key), () => additionalPropertyCode(key)); + }); + } + function isAdditional(key) { + let definedProp; + if (props.length > 8) { + const propsSchema = (0, util_1.schemaRefOrVal)(it, parentSchema.properties, "properties"); + definedProp = (0, code_1.isOwnProperty)(gen, propsSchema, key); + } else if (props.length) { + definedProp = (0, codegen_1.or)(...props.map((p) => (0, codegen_1._)`${key} === ${p}`)); + } else { + definedProp = codegen_1.nil; + } + if (patProps.length) { + definedProp = (0, codegen_1.or)(definedProp, ...patProps.map((p) => (0, codegen_1._)`${(0, code_1.usePattern)(cxt, p)}.test(${key})`)); + } + return (0, codegen_1.not)(definedProp); + } + function deleteAdditional(key) { + gen.code((0, codegen_1._)`delete ${data}[${key}]`); + } + function additionalPropertyCode(key) { + if (opts.removeAdditional === "all" || opts.removeAdditional && schema === false) { + deleteAdditional(key); + return; + } + if (schema === false) { + cxt.setParams({ additionalProperty: key }); + cxt.error(); + if (!allErrors) + gen.break(); + return; + } + if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.name("valid"); + if (opts.removeAdditional === "failing") { + applyAdditionalSchema(key, valid, false); + gen.if((0, codegen_1.not)(valid), () => { + cxt.reset(); + deleteAdditional(key); + }); + } else { + applyAdditionalSchema(key, valid); + if (!allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + } + } + function applyAdditionalSchema(key, valid, errors) { + const subschema = { + keyword: "additionalProperties", + dataProp: key, + dataPropType: util_1.Type.Str + }; + if (errors === false) { + Object.assign(subschema, { + compositeRule: true, + createErrors: false, + allErrors: false + }); + } + cxt.subschema(subschema, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/properties.js +var require_properties = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/properties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var validate_1 = require_validate(); + var code_1 = require_code2(); + var util_1 = require_util(); + var additionalProperties_1 = require_additionalProperties(); + var def = { + keyword: "properties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, parentSchema, data, it } = cxt; + if (it.opts.removeAdditional === "all" && parentSchema.additionalProperties === void 0) { + additionalProperties_1.default.code(new validate_1.KeywordCxt(it, additionalProperties_1.default, "additionalProperties")); + } + const allProps = (0, code_1.allSchemaProperties)(schema); + for (const prop of allProps) { + it.definedProperties.add(prop); + } + if (it.opts.unevaluated && allProps.length && it.props !== true) { + it.props = util_1.mergeEvaluated.props(gen, (0, util_1.toHash)(allProps), it.props); + } + const properties = allProps.filter((p) => !(0, util_1.alwaysValidSchema)(it, schema[p])); + if (properties.length === 0) + return; + const valid = gen.name("valid"); + for (const prop of properties) { + if (hasDefault(prop)) { + applyPropertySchema(prop); + } else { + gen.if((0, code_1.propertyInData)(gen, data, prop, it.opts.ownProperties)); + applyPropertySchema(prop); + if (!it.allErrors) + gen.else().var(valid, true); + gen.endIf(); + } + cxt.it.definedProperties.add(prop); + cxt.ok(valid); + } + function hasDefault(prop) { + return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== void 0; + } + function applyPropertySchema(prop) { + cxt.subschema({ + keyword: "properties", + schemaProp: prop, + dataProp: prop + }, valid); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +var require_patternProperties = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var util_2 = require_util(); + var def = { + keyword: "patternProperties", + type: "object", + schemaType: "object", + code(cxt) { + const { gen, schema, data, parentSchema, it } = cxt; + const { opts } = it; + const patterns = (0, code_1.allSchemaProperties)(schema); + const alwaysValidPatterns = patterns.filter((p) => (0, util_1.alwaysValidSchema)(it, schema[p])); + if (patterns.length === 0 || alwaysValidPatterns.length === patterns.length && (!it.opts.unevaluated || it.props === true)) { + return; + } + const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; + const valid = gen.name("valid"); + if (it.props !== true && !(it.props instanceof codegen_1.Name)) { + it.props = (0, util_2.evaluatedPropsToName)(gen, it.props); + } + const { props } = it; + validatePatternProperties(); + function validatePatternProperties() { + for (const pat of patterns) { + if (checkProperties) + checkMatchingProperties(pat); + if (it.allErrors) { + validateProperties(pat); + } else { + gen.var(valid, true); + validateProperties(pat); + gen.if(valid); + } + } + } + function checkMatchingProperties(pat) { + for (const prop in checkProperties) { + if (new RegExp(pat).test(prop)) { + (0, util_1.checkStrictMode)(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); + } + } + } + function validateProperties(pat) { + gen.forIn("key", data, (key) => { + gen.if((0, codegen_1._)`${(0, code_1.usePattern)(cxt, pat)}.test(${key})`, () => { + const alwaysValid = alwaysValidPatterns.includes(pat); + if (!alwaysValid) { + cxt.subschema({ + keyword: "patternProperties", + schemaProp: pat, + dataProp: key, + dataPropType: util_2.Type.Str + }, valid); + } + if (it.opts.unevaluated && props !== true) { + gen.assign((0, codegen_1._)`${props}[${key}]`, true); + } else if (!alwaysValid && !it.allErrors) { + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/not.js +var require_not = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/not.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util(); + var def = { + keyword: "not", + schemaType: ["object", "boolean"], + trackErrors: true, + code(cxt) { + const { gen, schema, it } = cxt; + if ((0, util_1.alwaysValidSchema)(it, schema)) { + cxt.fail(); + return; + } + const valid = gen.name("valid"); + cxt.subschema({ + keyword: "not", + compositeRule: true, + createErrors: false, + allErrors: false + }, valid); + cxt.failResult(valid, () => cxt.reset(), () => cxt.error()); + }, + error: { message: "must NOT be valid" } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/anyOf.js +var require_anyOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/anyOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var code_1 = require_code2(); + var def = { + keyword: "anyOf", + schemaType: "array", + trackErrors: true, + code: code_1.validateUnion, + error: { message: "must match a schema in anyOf" } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/oneOf.js +var require_oneOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/oneOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error48 = { + message: "must match exactly one schema in oneOf", + params: ({ params }) => (0, codegen_1._)`{passingSchemas: ${params.passing}}` + }; + var def = { + keyword: "oneOf", + schemaType: "array", + trackErrors: true, + error: error48, + code(cxt) { + const { gen, schema, parentSchema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + if (it.opts.discriminator && parentSchema.discriminator) + return; + const schArr = schema; + const valid = gen.let("valid", false); + const passing = gen.let("passing", null); + const schValid = gen.name("_valid"); + cxt.setParams({ passing }); + gen.block(validateOneOf); + cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); + function validateOneOf() { + schArr.forEach((sch, i) => { + let schCxt; + if ((0, util_1.alwaysValidSchema)(it, sch)) { + gen.var(schValid, true); + } else { + schCxt = cxt.subschema({ + keyword: "oneOf", + schemaProp: i, + compositeRule: true + }, schValid); + } + if (i > 0) { + gen.if((0, codegen_1._)`${schValid} && ${valid}`).assign(valid, false).assign(passing, (0, codegen_1._)`[${passing}, ${i}]`).else(); + } + gen.if(schValid, () => { + gen.assign(valid, true); + gen.assign(passing, i); + if (schCxt) + cxt.mergeEvaluated(schCxt, codegen_1.Name); + }); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/allOf.js +var require_allOf = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/allOf.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util(); + var def = { + keyword: "allOf", + schemaType: "array", + code(cxt) { + const { gen, schema, it } = cxt; + if (!Array.isArray(schema)) + throw new Error("ajv implementation error"); + const valid = gen.name("valid"); + schema.forEach((sch, i) => { + if ((0, util_1.alwaysValidSchema)(it, sch)) + return; + const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); + cxt.ok(valid); + cxt.mergeEvaluated(schCxt); + }); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/if.js +var require_if = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/if.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error48 = { + message: ({ params }) => (0, codegen_1.str)`must match "${params.ifClause}" schema`, + params: ({ params }) => (0, codegen_1._)`{failingKeyword: ${params.ifClause}}` + }; + var def = { + keyword: "if", + schemaType: ["object", "boolean"], + trackErrors: true, + error: error48, + code(cxt) { + const { gen, parentSchema, it } = cxt; + if (parentSchema.then === void 0 && parentSchema.else === void 0) { + (0, util_1.checkStrictMode)(it, '"if" without "then" and "else" is ignored'); + } + const hasThen = hasSchema(it, "then"); + const hasElse = hasSchema(it, "else"); + if (!hasThen && !hasElse) + return; + const valid = gen.let("valid", true); + const schValid = gen.name("_valid"); + validateIf(); + cxt.reset(); + if (hasThen && hasElse) { + const ifClause = gen.let("ifClause"); + cxt.setParams({ ifClause }); + gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); + } else if (hasThen) { + gen.if(schValid, validateClause("then")); + } else { + gen.if((0, codegen_1.not)(schValid), validateClause("else")); + } + cxt.pass(valid, () => cxt.error(true)); + function validateIf() { + const schCxt = cxt.subschema({ + keyword: "if", + compositeRule: true, + createErrors: false, + allErrors: false + }, schValid); + cxt.mergeEvaluated(schCxt); + } + function validateClause(keyword, ifClause) { + return () => { + const schCxt = cxt.subschema({ keyword }, schValid); + gen.assign(valid, schValid); + cxt.mergeValidEvaluated(schCxt, valid); + if (ifClause) + gen.assign(ifClause, (0, codegen_1._)`${keyword}`); + else + cxt.setParams({ ifClause: keyword }); + }; + } + } + }; + function hasSchema(it, keyword) { + const schema = it.schema[keyword]; + return schema !== void 0 && !(0, util_1.alwaysValidSchema)(it, schema); + } + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/thenElse.js +var require_thenElse = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/thenElse.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util(); + var def = { + keyword: ["then", "else"], + schemaType: ["object", "boolean"], + code({ keyword, parentSchema, it }) { + if (parentSchema.if === void 0) + (0, util_1.checkStrictMode)(it, `"${keyword}" without "if" is ignored`); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/index.js +var require_applicator = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var additionalItems_1 = require_additionalItems(); + var prefixItems_1 = require_prefixItems(); + var items_1 = require_items(); + var items2020_1 = require_items2020(); + var contains_1 = require_contains(); + var dependencies_1 = require_dependencies(); + var propertyNames_1 = require_propertyNames(); + var additionalProperties_1 = require_additionalProperties(); + var properties_1 = require_properties(); + var patternProperties_1 = require_patternProperties(); + var not_1 = require_not(); + var anyOf_1 = require_anyOf(); + var oneOf_1 = require_oneOf(); + var allOf_1 = require_allOf(); + var if_1 = require_if(); + var thenElse_1 = require_thenElse(); + function getApplicator(draft2020 = false) { + const applicator = [ + // any + not_1.default, + anyOf_1.default, + oneOf_1.default, + allOf_1.default, + if_1.default, + thenElse_1.default, + // object + propertyNames_1.default, + additionalProperties_1.default, + dependencies_1.default, + properties_1.default, + patternProperties_1.default + ]; + if (draft2020) + applicator.push(prefixItems_1.default, items2020_1.default); + else + applicator.push(additionalItems_1.default, items_1.default); + applicator.push(contains_1.default); + return applicator; + } + exports.default = getApplicator; + } +}); + +// node_modules/ajv/dist/vocabularies/format/format.js +var require_format = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/format.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var error48 = { + message: ({ schemaCode }) => (0, codegen_1.str)`must match format "${schemaCode}"`, + params: ({ schemaCode }) => (0, codegen_1._)`{format: ${schemaCode}}` + }; + var def = { + keyword: "format", + type: ["number", "string"], + schemaType: "string", + $data: true, + error: error48, + code(cxt, ruleType) { + const { gen, data, $data, schema, schemaCode, it } = cxt; + const { opts, errSchemaPath, schemaEnv, self } = it; + if (!opts.validateFormats) + return; + if ($data) + validate$DataFormat(); + else + validateFormat(); + function validate$DataFormat() { + const fmts = gen.scopeValue("formats", { + ref: self.formats, + code: opts.code.formats + }); + const fDef = gen.const("fDef", (0, codegen_1._)`${fmts}[${schemaCode}]`); + const fType = gen.let("fType"); + const format = gen.let("format"); + gen.if((0, codegen_1._)`typeof ${fDef} == "object" && !(${fDef} instanceof RegExp)`, () => gen.assign(fType, (0, codegen_1._)`${fDef}.type || "string"`).assign(format, (0, codegen_1._)`${fDef}.validate`), () => gen.assign(fType, (0, codegen_1._)`"string"`).assign(format, fDef)); + cxt.fail$data((0, codegen_1.or)(unknownFmt(), invalidFmt())); + function unknownFmt() { + if (opts.strictSchema === false) + return codegen_1.nil; + return (0, codegen_1._)`${schemaCode} && !${format}`; + } + function invalidFmt() { + const callFormat = schemaEnv.$async ? (0, codegen_1._)`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))` : (0, codegen_1._)`${format}(${data})`; + const validData = (0, codegen_1._)`(typeof ${format} == "function" ? ${callFormat} : ${format}.test(${data}))`; + return (0, codegen_1._)`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`; + } + } + function validateFormat() { + const formatDef = self.formats[schema]; + if (!formatDef) { + unknownFormat(); + return; + } + if (formatDef === true) + return; + const [fmtType, format, fmtRef] = getFormat(formatDef); + if (fmtType === ruleType) + cxt.pass(validCondition()); + function unknownFormat() { + if (opts.strictSchema === false) { + self.logger.warn(unknownMsg()); + return; + } + throw new Error(unknownMsg()); + function unknownMsg() { + return `unknown format "${schema}" ignored in schema at path "${errSchemaPath}"`; + } + } + function getFormat(fmtDef) { + const code = fmtDef instanceof RegExp ? (0, codegen_1.regexpCode)(fmtDef) : opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(schema)}` : void 0; + const fmt = gen.scopeValue("formats", { key: schema, ref: fmtDef, code }); + if (typeof fmtDef == "object" && !(fmtDef instanceof RegExp)) { + return [fmtDef.type || "string", fmtDef.validate, (0, codegen_1._)`${fmt}.validate`]; + } + return ["string", fmtDef, fmt]; + } + function validCondition() { + if (typeof formatDef == "object" && !(formatDef instanceof RegExp) && formatDef.async) { + if (!schemaEnv.$async) + throw new Error("async format in sync schema"); + return (0, codegen_1._)`await ${fmtRef}(${data})`; + } + return typeof format == "function" ? (0, codegen_1._)`${fmtRef}(${data})` : (0, codegen_1._)`${fmtRef}.test(${data})`; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/format/index.js +var require_format2 = __commonJS({ + "node_modules/ajv/dist/vocabularies/format/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var format_1 = require_format(); + var format = [format_1.default]; + exports.default = format; + } +}); + +// node_modules/ajv/dist/vocabularies/metadata.js +var require_metadata = __commonJS({ + "node_modules/ajv/dist/vocabularies/metadata.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.contentVocabulary = exports.metadataVocabulary = void 0; + exports.metadataVocabulary = [ + "title", + "description", + "default", + "deprecated", + "readOnly", + "writeOnly", + "examples" + ]; + exports.contentVocabulary = [ + "contentMediaType", + "contentEncoding", + "contentSchema" + ]; + } +}); + +// node_modules/ajv/dist/vocabularies/draft7.js +var require_draft7 = __commonJS({ + "node_modules/ajv/dist/vocabularies/draft7.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var core_1 = require_core2(); + var validation_1 = require_validation(); + var applicator_1 = require_applicator(); + var format_1 = require_format2(); + var metadata_1 = require_metadata(); + var draft7Vocabularies = [ + core_1.default, + validation_1.default, + (0, applicator_1.default)(), + format_1.default, + metadata_1.metadataVocabulary, + metadata_1.contentVocabulary + ]; + exports.default = draft7Vocabularies; + } +}); + +// node_modules/ajv/dist/vocabularies/discriminator/types.js +var require_types = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/types.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.DiscrError = void 0; + var DiscrError; + (function(DiscrError2) { + DiscrError2["Tag"] = "tag"; + DiscrError2["Mapping"] = "mapping"; + })(DiscrError || (exports.DiscrError = DiscrError = {})); + } +}); + +// node_modules/ajv/dist/vocabularies/discriminator/index.js +var require_discriminator = __commonJS({ + "node_modules/ajv/dist/vocabularies/discriminator/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var types_1 = require_types(); + var compile_1 = require_compile(); + var ref_error_1 = require_ref_error(); + var util_1 = require_util(); + var error48 = { + message: ({ params: { discrError, tagName } }) => discrError === types_1.DiscrError.Tag ? `tag "${tagName}" must be string` : `value of tag "${tagName}" must be in oneOf`, + params: ({ params: { discrError, tag, tagName } }) => (0, codegen_1._)`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}` + }; + var def = { + keyword: "discriminator", + type: "object", + schemaType: "object", + error: error48, + code(cxt) { + const { gen, data, schema, parentSchema, it } = cxt; + const { oneOf } = parentSchema; + if (!it.opts.discriminator) { + throw new Error("discriminator: requires discriminator option"); + } + const tagName = schema.propertyName; + if (typeof tagName != "string") + throw new Error("discriminator: requires propertyName"); + if (schema.mapping) + throw new Error("discriminator: mapping is not supported"); + if (!oneOf) + throw new Error("discriminator: requires oneOf keyword"); + const valid = gen.let("valid", false); + const tag = gen.const("tag", (0, codegen_1._)`${data}${(0, codegen_1.getProperty)(tagName)}`); + gen.if((0, codegen_1._)`typeof ${tag} == "string"`, () => validateMapping(), () => cxt.error(false, { discrError: types_1.DiscrError.Tag, tag, tagName })); + cxt.ok(valid); + function validateMapping() { + const mapping = getMapping(); + gen.if(false); + for (const tagValue in mapping) { + gen.elseIf((0, codegen_1._)`${tag} === ${tagValue}`); + gen.assign(valid, applyTagSchema(mapping[tagValue])); + } + gen.else(); + cxt.error(false, { discrError: types_1.DiscrError.Mapping, tag, tagName }); + gen.endIf(); + } + function applyTagSchema(schemaProp) { + const _valid = gen.name("valid"); + const schCxt = cxt.subschema({ keyword: "oneOf", schemaProp }, _valid); + cxt.mergeEvaluated(schCxt, codegen_1.Name); + return _valid; + } + function getMapping() { + var _a2; + const oneOfMapping = {}; + const topRequired = hasRequired(parentSchema); + let tagRequired = true; + for (let i = 0; i < oneOf.length; i++) { + let sch = oneOf[i]; + if ((sch === null || sch === void 0 ? void 0 : sch.$ref) && !(0, util_1.schemaHasRulesButRef)(sch, it.self.RULES)) { + const ref = sch.$ref; + sch = compile_1.resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref); + if (sch instanceof compile_1.SchemaEnv) + sch = sch.schema; + if (sch === void 0) + throw new ref_error_1.default(it.opts.uriResolver, it.baseId, ref); + } + const propSch = (_a2 = sch === null || sch === void 0 ? void 0 : sch.properties) === null || _a2 === void 0 ? void 0 : _a2[tagName]; + if (typeof propSch != "object") { + throw new Error(`discriminator: oneOf subschemas (or referenced schemas) must have "properties/${tagName}"`); + } + tagRequired = tagRequired && (topRequired || hasRequired(sch)); + addMappings(propSch, i); + } + if (!tagRequired) + throw new Error(`discriminator: "${tagName}" must be required`); + return oneOfMapping; + function hasRequired({ required: required2 }) { + return Array.isArray(required2) && required2.includes(tagName); + } + function addMappings(sch, i) { + if (sch.const) { + addMapping(sch.const, i); + } else if (sch.enum) { + for (const tagValue of sch.enum) { + addMapping(tagValue, i); + } + } else { + throw new Error(`discriminator: "properties/${tagName}" must have "const" or "enum"`); + } + } + function addMapping(tagValue, i) { + if (typeof tagValue != "string" || tagValue in oneOfMapping) { + throw new Error(`discriminator: "${tagName}" values must be unique strings`); + } + oneOfMapping[tagValue] = i; + } + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/refs/json-schema-draft-07.json +var require_json_schema_draft_07 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-draft-07.json"(exports, module) { + module.exports = { + $schema: "http://json-schema.org/draft-07/schema#", + $id: "http://json-schema.org/draft-07/schema#", + title: "Core schema meta-schema", + definitions: { + schemaArray: { + type: "array", + minItems: 1, + items: { $ref: "#" } + }, + nonNegativeInteger: { + type: "integer", + minimum: 0 + }, + nonNegativeIntegerDefault0: { + allOf: [{ $ref: "#/definitions/nonNegativeInteger" }, { default: 0 }] + }, + simpleTypes: { + enum: ["array", "boolean", "integer", "null", "number", "object", "string"] + }, + stringArray: { + type: "array", + items: { type: "string" }, + uniqueItems: true, + default: [] + } + }, + type: ["object", "boolean"], + properties: { + $id: { + type: "string", + format: "uri-reference" + }, + $schema: { + type: "string", + format: "uri" + }, + $ref: { + type: "string", + format: "uri-reference" + }, + $comment: { + type: "string" + }, + title: { + type: "string" + }, + description: { + type: "string" + }, + default: true, + readOnly: { + type: "boolean", + default: false + }, + examples: { + type: "array", + items: true + }, + multipleOf: { + type: "number", + exclusiveMinimum: 0 + }, + maximum: { + type: "number" + }, + exclusiveMaximum: { + type: "number" + }, + minimum: { + type: "number" + }, + exclusiveMinimum: { + type: "number" + }, + maxLength: { $ref: "#/definitions/nonNegativeInteger" }, + minLength: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + pattern: { + type: "string", + format: "regex" + }, + additionalItems: { $ref: "#" }, + items: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/schemaArray" }], + default: true + }, + maxItems: { $ref: "#/definitions/nonNegativeInteger" }, + minItems: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + uniqueItems: { + type: "boolean", + default: false + }, + contains: { $ref: "#" }, + maxProperties: { $ref: "#/definitions/nonNegativeInteger" }, + minProperties: { $ref: "#/definitions/nonNegativeIntegerDefault0" }, + required: { $ref: "#/definitions/stringArray" }, + additionalProperties: { $ref: "#" }, + definitions: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + properties: { + type: "object", + additionalProperties: { $ref: "#" }, + default: {} + }, + patternProperties: { + type: "object", + additionalProperties: { $ref: "#" }, + propertyNames: { format: "regex" }, + default: {} + }, + dependencies: { + type: "object", + additionalProperties: { + anyOf: [{ $ref: "#" }, { $ref: "#/definitions/stringArray" }] + } + }, + propertyNames: { $ref: "#" }, + const: true, + enum: { + type: "array", + items: true, + minItems: 1, + uniqueItems: true + }, + type: { + anyOf: [ + { $ref: "#/definitions/simpleTypes" }, + { + type: "array", + items: { $ref: "#/definitions/simpleTypes" }, + minItems: 1, + uniqueItems: true + } + ] + }, + format: { type: "string" }, + contentMediaType: { type: "string" }, + contentEncoding: { type: "string" }, + if: { $ref: "#" }, + then: { $ref: "#" }, + else: { $ref: "#" }, + allOf: { $ref: "#/definitions/schemaArray" }, + anyOf: { $ref: "#/definitions/schemaArray" }, + oneOf: { $ref: "#/definitions/schemaArray" }, + not: { $ref: "#" } + }, + default: true + }; + } +}); + +// node_modules/ajv/dist/ajv.js +var require_ajv = __commonJS({ + "node_modules/ajv/dist/ajv.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv = void 0; + var core_1 = require_core(); + var draft7_1 = require_draft7(); + var discriminator_1 = require_discriminator(); + var draft7MetaSchema = require_json_schema_draft_07(); + var META_SUPPORT_DATA = ["/properties"]; + var META_SCHEMA_ID = "http://json-schema.org/draft-07/schema"; + var Ajv2 = class extends core_1.default { + _addVocabularies() { + super._addVocabularies(); + draft7_1.default.forEach((v) => this.addVocabulary(v)); + if (this.opts.discriminator) + this.addKeyword(discriminator_1.default); + } + _addDefaultMetaSchema() { + super._addDefaultMetaSchema(); + if (!this.opts.meta) + return; + const metaSchema = this.opts.$data ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA) : draft7MetaSchema; + this.addMetaSchema(metaSchema, META_SCHEMA_ID, false); + this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; + } + defaultMeta() { + return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); + } + }; + exports.Ajv = Ajv2; + module.exports = exports = Ajv2; + module.exports.Ajv = Ajv2; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Ajv2; + var validate_1 = require_validate(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error(); + Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { + return validation_error_1.default; + } }); + var ref_error_1 = require_ref_error(); + Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { + return ref_error_1.default; + } }); + } +}); + +// node_modules/ajv-formats/dist/formats.js +var require_formats = __commonJS({ + "node_modules/ajv-formats/dist/formats.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; + function fmtDef(validate, compare) { + return { validate, compare }; + } + exports.fullFormats = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: fmtDef(date5, compareDate), + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: fmtDef(getTime(true), compareTime), + "date-time": fmtDef(getDateTime(true), compareDateTime), + "iso-time": fmtDef(getTime(), compareIsoTime), + "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime), + // duration: https://tools.ietf.org/html/rfc3339#appendix-A + duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, + uri, + "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, + // uri-template: https://tools.ietf.org/html/rfc6570 + "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, + // For the source: https://gist.github.com/dperini/729294 + // For test cases: https://mathiasbynens.be/demo/url-regex + url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/, + ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, + regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, + "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, + // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types + // byte: https://github.com/miguelmota/is-base64 + byte, + // signed 32 bit integer + int32: { type: "number", validate: validateInt32 }, + // signed 64 bit integer + int64: { type: "number", validate: validateInt64 }, + // C-type float + float: { type: "number", validate: validateNumber }, + // C-type double + double: { type: "number", validate: validateNumber }, + // hint to the UI to hide input strings + password: true, + // unchecked string payload + binary: true + }; + exports.fastFormats = { + ...exports.fullFormats, + date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), + time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime), + "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), + "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime), + "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime), + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i + }; + exports.formatNames = Object.keys(exports.fullFormats); + function isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); + } + var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; + var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function date5(str) { + const matches = DATE.exec(str); + if (!matches) + return false; + const year = +matches[1]; + const month = +matches[2]; + const day = +matches[3]; + return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]); + } + function compareDate(d1, d2) { + if (!(d1 && d2)) + return void 0; + if (d1 > d2) + return 1; + if (d1 < d2) + return -1; + return 0; + } + var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i; + function getTime(strictTimeZone) { + return function time3(str) { + const matches = TIME.exec(str); + if (!matches) + return false; + const hr = +matches[1]; + const min = +matches[2]; + const sec = +matches[3]; + const tz = matches[4]; + const tzSign = matches[5] === "-" ? -1 : 1; + const tzH = +(matches[6] || 0); + const tzM = +(matches[7] || 0); + if (tzH > 23 || tzM > 59 || strictTimeZone && !tz) + return false; + if (hr <= 23 && min <= 59 && sec < 60) + return true; + const utcMin = min - tzM * tzSign; + const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0); + return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61; + }; + } + function compareTime(s1, s2) { + if (!(s1 && s2)) + return void 0; + const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf(); + const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf(); + if (!(t1 && t2)) + return void 0; + return t1 - t2; + } + function compareIsoTime(t1, t2) { + if (!(t1 && t2)) + return void 0; + const a1 = TIME.exec(t1); + const a2 = TIME.exec(t2); + if (!(a1 && a2)) + return void 0; + t1 = a1[1] + a1[2] + a1[3]; + t2 = a2[1] + a2[2] + a2[3]; + if (t1 > t2) + return 1; + if (t1 < t2) + return -1; + return 0; + } + var DATE_TIME_SEPARATOR = /t|\s/i; + function getDateTime(strictTimeZone) { + const time3 = getTime(strictTimeZone); + return function date_time(str) { + const dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]); + }; + } + function compareDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const d1 = new Date(dt1).valueOf(); + const d2 = new Date(dt2).valueOf(); + if (!(d1 && d2)) + return void 0; + return d1 - d2; + } + function compareIsoDateTime(dt1, dt2) { + if (!(dt1 && dt2)) + return void 0; + const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); + const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); + const res = compareDate(d1, d2); + if (res === void 0) + return void 0; + return res || compareTime(t1, t2); + } + var NOT_URI_FRAGMENT = /\/|:/; + var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; + function uri(str) { + return NOT_URI_FRAGMENT.test(str) && URI.test(str); + } + var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm; + function byte(str) { + BYTE.lastIndex = 0; + return BYTE.test(str); + } + var MIN_INT32 = -(2 ** 31); + var MAX_INT32 = 2 ** 31 - 1; + function validateInt32(value) { + return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; + } + function validateInt64(value) { + return Number.isInteger(value); + } + function validateNumber() { + return true; + } + var Z_ANCHOR = /[^\\]\\Z/; + function regex(str) { + if (Z_ANCHOR.test(str)) + return false; + try { + new RegExp(str); + return true; + } catch (e) { + return false; + } + } + } +}); + +// node_modules/ajv-formats/dist/limit.js +var require_limit = __commonJS({ + "node_modules/ajv-formats/dist/limit.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.formatLimitDefinition = void 0; + var ajv_1 = require_ajv(); + var codegen_1 = require_codegen(); + var ops = codegen_1.operators; + var KWDs = { + formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, + formatMinimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, + formatExclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, + formatExclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE } + }; + var error48 = { + message: ({ keyword, schemaCode }) => (0, codegen_1.str)`should be ${KWDs[keyword].okStr} ${schemaCode}`, + params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}` + }; + exports.formatLimitDefinition = { + keyword: Object.keys(KWDs), + type: "string", + schemaType: "string", + $data: true, + error: error48, + code(cxt) { + const { gen, data, schemaCode, keyword, it } = cxt; + const { opts, self } = it; + if (!opts.validateFormats) + return; + const fCxt = new ajv_1.KeywordCxt(it, self.RULES.all.format.definition, "format"); + if (fCxt.$data) + validate$DataFormat(); + else + validateFormat(); + function validate$DataFormat() { + const fmts = gen.scopeValue("formats", { + ref: self.formats, + code: opts.code.formats + }); + const fmt = gen.const("fmt", (0, codegen_1._)`${fmts}[${fCxt.schemaCode}]`); + cxt.fail$data((0, codegen_1.or)((0, codegen_1._)`typeof ${fmt} != "object"`, (0, codegen_1._)`${fmt} instanceof RegExp`, (0, codegen_1._)`typeof ${fmt}.compare != "function"`, compareCode(fmt))); + } + function validateFormat() { + const format = fCxt.schema; + const fmtDef = self.formats[format]; + if (!fmtDef || fmtDef === true) + return; + if (typeof fmtDef != "object" || fmtDef instanceof RegExp || typeof fmtDef.compare != "function") { + throw new Error(`"${keyword}": format "${format}" does not define "compare" function`); + } + const fmt = gen.scopeValue("formats", { + key: format, + ref: fmtDef, + code: opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(format)}` : void 0 + }); + cxt.fail$data(compareCode(fmt)); + } + function compareCode(fmt) { + return (0, codegen_1._)`${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`; + } + }, + dependencies: ["format"] + }; + var formatLimitPlugin = (ajv2) => { + ajv2.addKeyword(exports.formatLimitDefinition); + return ajv2; + }; + exports.default = formatLimitPlugin; + } +}); + +// node_modules/ajv-formats/dist/index.js +var require_dist = __commonJS({ + "node_modules/ajv-formats/dist/index.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var formats_1 = require_formats(); + var limit_1 = require_limit(); + var codegen_1 = require_codegen(); + var fullName = new codegen_1.Name("fullFormats"); + var fastName = new codegen_1.Name("fastFormats"); + var formatsPlugin = (ajv2, opts = { keywords: true }) => { + if (Array.isArray(opts)) { + addFormats(ajv2, opts, formats_1.fullFormats, fullName); + return ajv2; + } + const [formats, exportName] = opts.mode === "fast" ? [formats_1.fastFormats, fastName] : [formats_1.fullFormats, fullName]; + const list = opts.formats || formats_1.formatNames; + addFormats(ajv2, list, formats, exportName); + if (opts.keywords) + (0, limit_1.default)(ajv2); + return ajv2; + }; + formatsPlugin.get = (name, mode = "full") => { + const formats = mode === "fast" ? formats_1.fastFormats : formats_1.fullFormats; + const f = formats[name]; + if (!f) + throw new Error(`Unknown format "${name}"`); + return f; + }; + function addFormats(ajv2, list, fs, exportName) { + var _a2; + var _b; + (_a2 = (_b = ajv2.opts.code).formats) !== null && _a2 !== void 0 ? _a2 : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`; + for (const f of list) + ajv2.addFormat(f, fs[f]); + } + module.exports = exports = formatsPlugin; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = formatsPlugin; + } +}); + +// node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +var require_dynamicAnchor = __commonJS({ + "node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.dynamicAnchor = void 0; + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var compile_1 = require_compile(); + var ref_1 = require_ref(); + var def = { + keyword: "$dynamicAnchor", + schemaType: "string", + code: (cxt) => dynamicAnchor(cxt, cxt.schema) + }; + function dynamicAnchor(cxt, anchor) { + const { gen, it } = cxt; + it.schemaEnv.root.dynamicAnchors[anchor] = true; + const v = (0, codegen_1._)`${names_1.default.dynamicAnchors}${(0, codegen_1.getProperty)(anchor)}`; + const validate = it.errSchemaPath === "#" ? it.validateName : _getValidate(cxt); + gen.if((0, codegen_1._)`!${v}`, () => gen.assign(v, validate)); + } + exports.dynamicAnchor = dynamicAnchor; + function _getValidate(cxt) { + const { schemaEnv, schema, self } = cxt.it; + const { root, baseId, localRefs, meta: meta3 } = schemaEnv.root; + const { schemaId } = self.opts; + const sch = new compile_1.SchemaEnv({ schema, schemaId, root, baseId, localRefs, meta: meta3 }); + compile_1.compileSchema.call(self, sch); + return (0, ref_1.getValidate)(cxt, sch); + } + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +var require_dynamicRef = __commonJS({ + "node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.dynamicRef = void 0; + var codegen_1 = require_codegen(); + var names_1 = require_names(); + var ref_1 = require_ref(); + var def = { + keyword: "$dynamicRef", + schemaType: "string", + code: (cxt) => dynamicRef(cxt, cxt.schema) + }; + function dynamicRef(cxt, ref) { + const { gen, keyword, it } = cxt; + if (ref[0] !== "#") + throw new Error(`"${keyword}" only supports hash fragment reference`); + const anchor = ref.slice(1); + if (it.allErrors) { + _dynamicRef(); + } else { + const valid = gen.let("valid", false); + _dynamicRef(valid); + cxt.ok(valid); + } + function _dynamicRef(valid) { + if (it.schemaEnv.root.dynamicAnchors[anchor]) { + const v = gen.let("_v", (0, codegen_1._)`${names_1.default.dynamicAnchors}${(0, codegen_1.getProperty)(anchor)}`); + gen.if(v, _callRef(v, valid), _callRef(it.validateName, valid)); + } else { + _callRef(it.validateName, valid)(); + } + } + function _callRef(validate, valid) { + return valid ? () => gen.block(() => { + (0, ref_1.callRef)(cxt, validate); + gen.let(valid, true); + }) : () => (0, ref_1.callRef)(cxt, validate); + } + } + exports.dynamicRef = dynamicRef; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +var require_recursiveAnchor = __commonJS({ + "node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dynamicAnchor_1 = require_dynamicAnchor(); + var util_1 = require_util(); + var def = { + keyword: "$recursiveAnchor", + schemaType: "boolean", + code(cxt) { + if (cxt.schema) + (0, dynamicAnchor_1.dynamicAnchor)(cxt, ""); + else + (0, util_1.checkStrictMode)(cxt.it, "$recursiveAnchor: false is ignored"); + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +var require_recursiveRef = __commonJS({ + "node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dynamicRef_1 = require_dynamicRef(); + var def = { + keyword: "$recursiveRef", + schemaType: "string", + code: (cxt) => (0, dynamicRef_1.dynamicRef)(cxt, cxt.schema) + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/dynamic/index.js +var require_dynamic = __commonJS({ + "node_modules/ajv/dist/vocabularies/dynamic/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dynamicAnchor_1 = require_dynamicAnchor(); + var dynamicRef_1 = require_dynamicRef(); + var recursiveAnchor_1 = require_recursiveAnchor(); + var recursiveRef_1 = require_recursiveRef(); + var dynamic = [dynamicAnchor_1.default, dynamicRef_1.default, recursiveAnchor_1.default, recursiveRef_1.default]; + exports.default = dynamic; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +var require_dependentRequired = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/dependentRequired.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dependencies_1 = require_dependencies(); + var def = { + keyword: "dependentRequired", + type: "object", + schemaType: "object", + error: dependencies_1.error, + code: (cxt) => (0, dependencies_1.validatePropertyDeps)(cxt) + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +var require_dependentSchemas = __commonJS({ + "node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dependencies_1 = require_dependencies(); + var def = { + keyword: "dependentSchemas", + type: "object", + schemaType: "object", + code: (cxt) => (0, dependencies_1.validateSchemaDeps)(cxt) + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/validation/limitContains.js +var require_limitContains = __commonJS({ + "node_modules/ajv/dist/vocabularies/validation/limitContains.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var util_1 = require_util(); + var def = { + keyword: ["maxContains", "minContains"], + type: "array", + schemaType: "number", + code({ keyword, parentSchema, it }) { + if (parentSchema.contains === void 0) { + (0, util_1.checkStrictMode)(it, `"${keyword}" without "contains" is ignored`); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/next.js +var require_next = __commonJS({ + "node_modules/ajv/dist/vocabularies/next.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var dependentRequired_1 = require_dependentRequired(); + var dependentSchemas_1 = require_dependentSchemas(); + var limitContains_1 = require_limitContains(); + var next = [dependentRequired_1.default, dependentSchemas_1.default, limitContains_1.default]; + exports.default = next; + } +}); + +// node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +var require_unevaluatedProperties = __commonJS({ + "node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var names_1 = require_names(); + var error48 = { + message: "must NOT have unevaluated properties", + params: ({ params }) => (0, codegen_1._)`{unevaluatedProperty: ${params.unevaluatedProperty}}` + }; + var def = { + keyword: "unevaluatedProperties", + type: "object", + schemaType: ["boolean", "object"], + trackErrors: true, + error: error48, + code(cxt) { + const { gen, schema, data, errsCount, it } = cxt; + if (!errsCount) + throw new Error("ajv implementation error"); + const { allErrors, props } = it; + if (props instanceof codegen_1.Name) { + gen.if((0, codegen_1._)`${props} !== true`, () => gen.forIn("key", data, (key) => gen.if(unevaluatedDynamic(props, key), () => unevaluatedPropCode(key)))); + } else if (props !== true) { + gen.forIn("key", data, (key) => props === void 0 ? unevaluatedPropCode(key) : gen.if(unevaluatedStatic(props, key), () => unevaluatedPropCode(key))); + } + it.props = true; + cxt.ok((0, codegen_1._)`${errsCount} === ${names_1.default.errors}`); + function unevaluatedPropCode(key) { + if (schema === false) { + cxt.setParams({ unevaluatedProperty: key }); + cxt.error(); + if (!allErrors) + gen.break(); + return; + } + if (!(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.name("valid"); + cxt.subschema({ + keyword: "unevaluatedProperties", + dataProp: key, + dataPropType: util_1.Type.Str + }, valid); + if (!allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + } + } + function unevaluatedDynamic(evaluatedProps, key) { + return (0, codegen_1._)`!${evaluatedProps} || !${evaluatedProps}[${key}]`; + } + function unevaluatedStatic(evaluatedProps, key) { + const ps = []; + for (const p in evaluatedProps) { + if (evaluatedProps[p] === true) + ps.push((0, codegen_1._)`${key} !== ${p}`); + } + return (0, codegen_1.and)(...ps); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +var require_unevaluatedItems = __commonJS({ + "node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var codegen_1 = require_codegen(); + var util_1 = require_util(); + var error48 = { + message: ({ params: { len } }) => (0, codegen_1.str)`must NOT have more than ${len} items`, + params: ({ params: { len } }) => (0, codegen_1._)`{limit: ${len}}` + }; + var def = { + keyword: "unevaluatedItems", + type: "array", + schemaType: ["boolean", "object"], + error: error48, + code(cxt) { + const { gen, schema, data, it } = cxt; + const items = it.items || 0; + if (items === true) + return; + const len = gen.const("len", (0, codegen_1._)`${data}.length`); + if (schema === false) { + cxt.setParams({ len: items }); + cxt.fail((0, codegen_1._)`${len} > ${items}`); + } else if (typeof schema == "object" && !(0, util_1.alwaysValidSchema)(it, schema)) { + const valid = gen.var("valid", (0, codegen_1._)`${len} <= ${items}`); + gen.if((0, codegen_1.not)(valid), () => validateItems(valid, items)); + cxt.ok(valid); + } + it.items = true; + function validateItems(valid, from) { + gen.forRange("i", from, len, (i) => { + cxt.subschema({ keyword: "unevaluatedItems", dataProp: i, dataPropType: util_1.Type.Num }, valid); + if (!it.allErrors) + gen.if((0, codegen_1.not)(valid), () => gen.break()); + }); + } + } + }; + exports.default = def; + } +}); + +// node_modules/ajv/dist/vocabularies/unevaluated/index.js +var require_unevaluated = __commonJS({ + "node_modules/ajv/dist/vocabularies/unevaluated/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var unevaluatedProperties_1 = require_unevaluatedProperties(); + var unevaluatedItems_1 = require_unevaluatedItems(); + var unevaluated = [unevaluatedProperties_1.default, unevaluatedItems_1.default]; + exports.default = unevaluated; + } +}); + +// node_modules/ajv/dist/vocabularies/draft2020.js +var require_draft2020 = __commonJS({ + "node_modules/ajv/dist/vocabularies/draft2020.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var core_1 = require_core2(); + var validation_1 = require_validation(); + var applicator_1 = require_applicator(); + var dynamic_1 = require_dynamic(); + var next_1 = require_next(); + var unevaluated_1 = require_unevaluated(); + var format_1 = require_format2(); + var metadata_1 = require_metadata(); + var draft2020Vocabularies = [ + dynamic_1.default, + core_1.default, + validation_1.default, + (0, applicator_1.default)(true), + format_1.default, + metadata_1.metadataVocabulary, + metadata_1.contentVocabulary, + next_1.default, + unevaluated_1.default + ]; + exports.default = draft2020Vocabularies; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/schema.json +var require_schema = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/schema.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/schema", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/core": true, + "https://json-schema.org/draft/2020-12/vocab/applicator": true, + "https://json-schema.org/draft/2020-12/vocab/unevaluated": true, + "https://json-schema.org/draft/2020-12/vocab/validation": true, + "https://json-schema.org/draft/2020-12/vocab/meta-data": true, + "https://json-schema.org/draft/2020-12/vocab/format-annotation": true, + "https://json-schema.org/draft/2020-12/vocab/content": true + }, + $dynamicAnchor: "meta", + title: "Core and Validation specifications meta-schema", + allOf: [ + { $ref: "meta/core" }, + { $ref: "meta/applicator" }, + { $ref: "meta/unevaluated" }, + { $ref: "meta/validation" }, + { $ref: "meta/meta-data" }, + { $ref: "meta/format-annotation" }, + { $ref: "meta/content" } + ], + type: ["object", "boolean"], + $comment: "This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.", + properties: { + definitions: { + $comment: '"definitions" has been replaced by "$defs".', + type: "object", + additionalProperties: { $dynamicRef: "#meta" }, + deprecated: true, + default: {} + }, + dependencies: { + $comment: '"dependencies" has been split and replaced by "dependentSchemas" and "dependentRequired" in order to serve their differing semantics.', + type: "object", + additionalProperties: { + anyOf: [{ $dynamicRef: "#meta" }, { $ref: "meta/validation#/$defs/stringArray" }] + }, + deprecated: true, + default: {} + }, + $recursiveAnchor: { + $comment: '"$recursiveAnchor" has been replaced by "$dynamicAnchor".', + $ref: "meta/core#/$defs/anchorString", + deprecated: true + }, + $recursiveRef: { + $comment: '"$recursiveRef" has been replaced by "$dynamicRef".', + $ref: "meta/core#/$defs/uriReferenceString", + deprecated: true + } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.json +var require_applicator2 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/meta/applicator", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/applicator": true + }, + $dynamicAnchor: "meta", + title: "Applicator vocabulary meta-schema", + type: ["object", "boolean"], + properties: { + prefixItems: { $ref: "#/$defs/schemaArray" }, + items: { $dynamicRef: "#meta" }, + contains: { $dynamicRef: "#meta" }, + additionalProperties: { $dynamicRef: "#meta" }, + properties: { + type: "object", + additionalProperties: { $dynamicRef: "#meta" }, + default: {} + }, + patternProperties: { + type: "object", + additionalProperties: { $dynamicRef: "#meta" }, + propertyNames: { format: "regex" }, + default: {} + }, + dependentSchemas: { + type: "object", + additionalProperties: { $dynamicRef: "#meta" }, + default: {} + }, + propertyNames: { $dynamicRef: "#meta" }, + if: { $dynamicRef: "#meta" }, + then: { $dynamicRef: "#meta" }, + else: { $dynamicRef: "#meta" }, + allOf: { $ref: "#/$defs/schemaArray" }, + anyOf: { $ref: "#/$defs/schemaArray" }, + oneOf: { $ref: "#/$defs/schemaArray" }, + not: { $dynamicRef: "#meta" } + }, + $defs: { + schemaArray: { + type: "array", + minItems: 1, + items: { $dynamicRef: "#meta" } + } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.json +var require_unevaluated2 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/meta/unevaluated", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/unevaluated": true + }, + $dynamicAnchor: "meta", + title: "Unevaluated applicator vocabulary meta-schema", + type: ["object", "boolean"], + properties: { + unevaluatedItems: { $dynamicRef: "#meta" }, + unevaluatedProperties: { $dynamicRef: "#meta" } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.json +var require_content = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/meta/content", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/content": true + }, + $dynamicAnchor: "meta", + title: "Content vocabulary meta-schema", + type: ["object", "boolean"], + properties: { + contentEncoding: { type: "string" }, + contentMediaType: { type: "string" }, + contentSchema: { $dynamicRef: "#meta" } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.json +var require_core3 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/meta/core", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/core": true + }, + $dynamicAnchor: "meta", + title: "Core vocabulary meta-schema", + type: ["object", "boolean"], + properties: { + $id: { + $ref: "#/$defs/uriReferenceString", + $comment: "Non-empty fragments not allowed.", + pattern: "^[^#]*#?$" + }, + $schema: { $ref: "#/$defs/uriString" }, + $ref: { $ref: "#/$defs/uriReferenceString" }, + $anchor: { $ref: "#/$defs/anchorString" }, + $dynamicRef: { $ref: "#/$defs/uriReferenceString" }, + $dynamicAnchor: { $ref: "#/$defs/anchorString" }, + $vocabulary: { + type: "object", + propertyNames: { $ref: "#/$defs/uriString" }, + additionalProperties: { + type: "boolean" + } + }, + $comment: { + type: "string" + }, + $defs: { + type: "object", + additionalProperties: { $dynamicRef: "#meta" } + } + }, + $defs: { + anchorString: { + type: "string", + pattern: "^[A-Za-z_][-A-Za-z0-9._]*$" + }, + uriString: { + type: "string", + format: "uri" + }, + uriReferenceString: { + type: "string", + format: "uri-reference" + } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.json +var require_format_annotation = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/meta/format-annotation", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/format-annotation": true + }, + $dynamicAnchor: "meta", + title: "Format vocabulary meta-schema for annotation results", + type: ["object", "boolean"], + properties: { + format: { type: "string" } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.json +var require_meta_data = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/meta/meta-data", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/meta-data": true + }, + $dynamicAnchor: "meta", + title: "Meta-data vocabulary meta-schema", + type: ["object", "boolean"], + properties: { + title: { + type: "string" + }, + description: { + type: "string" + }, + default: true, + deprecated: { + type: "boolean", + default: false + }, + readOnly: { + type: "boolean", + default: false + }, + writeOnly: { + type: "boolean", + default: false + }, + examples: { + type: "array", + items: true + } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.json +var require_validation2 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.json"(exports, module) { + module.exports = { + $schema: "https://json-schema.org/draft/2020-12/schema", + $id: "https://json-schema.org/draft/2020-12/meta/validation", + $vocabulary: { + "https://json-schema.org/draft/2020-12/vocab/validation": true + }, + $dynamicAnchor: "meta", + title: "Validation vocabulary meta-schema", + type: ["object", "boolean"], + properties: { + type: { + anyOf: [ + { $ref: "#/$defs/simpleTypes" }, + { + type: "array", + items: { $ref: "#/$defs/simpleTypes" }, + minItems: 1, + uniqueItems: true + } + ] + }, + const: true, + enum: { + type: "array", + items: true + }, + multipleOf: { + type: "number", + exclusiveMinimum: 0 + }, + maximum: { + type: "number" + }, + exclusiveMaximum: { + type: "number" + }, + minimum: { + type: "number" + }, + exclusiveMinimum: { + type: "number" + }, + maxLength: { $ref: "#/$defs/nonNegativeInteger" }, + minLength: { $ref: "#/$defs/nonNegativeIntegerDefault0" }, + pattern: { + type: "string", + format: "regex" + }, + maxItems: { $ref: "#/$defs/nonNegativeInteger" }, + minItems: { $ref: "#/$defs/nonNegativeIntegerDefault0" }, + uniqueItems: { + type: "boolean", + default: false + }, + maxContains: { $ref: "#/$defs/nonNegativeInteger" }, + minContains: { + $ref: "#/$defs/nonNegativeInteger", + default: 1 + }, + maxProperties: { $ref: "#/$defs/nonNegativeInteger" }, + minProperties: { $ref: "#/$defs/nonNegativeIntegerDefault0" }, + required: { $ref: "#/$defs/stringArray" }, + dependentRequired: { + type: "object", + additionalProperties: { + $ref: "#/$defs/stringArray" + } + } + }, + $defs: { + nonNegativeInteger: { + type: "integer", + minimum: 0 + }, + nonNegativeIntegerDefault0: { + $ref: "#/$defs/nonNegativeInteger", + default: 0 + }, + simpleTypes: { + enum: ["array", "boolean", "integer", "null", "number", "object", "string"] + }, + stringArray: { + type: "array", + items: { type: "string" }, + uniqueItems: true, + default: [] + } + } + }; + } +}); + +// node_modules/ajv/dist/refs/json-schema-2020-12/index.js +var require_json_schema_2020_12 = __commonJS({ + "node_modules/ajv/dist/refs/json-schema-2020-12/index.js"(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var metaSchema = require_schema(); + var applicator = require_applicator2(); + var unevaluated = require_unevaluated2(); + var content = require_content(); + var core = require_core3(); + var format = require_format_annotation(); + var metadata = require_meta_data(); + var validation = require_validation2(); + var META_SUPPORT_DATA = ["/properties"]; + function addMetaSchema2020($data) { + ; + [ + metaSchema, + applicator, + unevaluated, + content, + core, + with$data(this, format), + metadata, + with$data(this, validation) + ].forEach((sch) => this.addMetaSchema(sch, void 0, false)); + return this; + function with$data(ajv2, sch) { + return $data ? ajv2.$dataMetaSchema(sch, META_SUPPORT_DATA) : sch; + } + } + exports.default = addMetaSchema2020; + } +}); + +// node_modules/ajv/dist/2020.js +var require__ = __commonJS({ + "node_modules/ajv/dist/2020.js"(exports, module) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.MissingRefError = exports.ValidationError = exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = exports.Ajv2020 = void 0; + var core_1 = require_core(); + var draft2020_1 = require_draft2020(); + var discriminator_1 = require_discriminator(); + var json_schema_2020_12_1 = require_json_schema_2020_12(); + var META_SCHEMA_ID = "https://json-schema.org/draft/2020-12/schema"; + var Ajv20202 = class extends core_1.default { + constructor(opts = {}) { + super({ + ...opts, + dynamicRef: true, + next: true, + unevaluated: true + }); + } + _addVocabularies() { + super._addVocabularies(); + draft2020_1.default.forEach((v) => this.addVocabulary(v)); + if (this.opts.discriminator) + this.addKeyword(discriminator_1.default); + } + _addDefaultMetaSchema() { + super._addDefaultMetaSchema(); + const { $data, meta: meta3 } = this.opts; + if (!meta3) + return; + json_schema_2020_12_1.default.call(this, $data); + this.refs["http://json-schema.org/schema"] = META_SCHEMA_ID; + } + defaultMeta() { + return this.opts.defaultMeta = super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : void 0); + } + }; + exports.Ajv2020 = Ajv20202; + module.exports = exports = Ajv20202; + module.exports.Ajv2020 = Ajv20202; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = Ajv20202; + var validate_1 = require_validate(); + Object.defineProperty(exports, "KeywordCxt", { enumerable: true, get: function() { + return validate_1.KeywordCxt; + } }); + var codegen_1 = require_codegen(); + Object.defineProperty(exports, "_", { enumerable: true, get: function() { + return codegen_1._; + } }); + Object.defineProperty(exports, "str", { enumerable: true, get: function() { + return codegen_1.str; + } }); + Object.defineProperty(exports, "stringify", { enumerable: true, get: function() { + return codegen_1.stringify; + } }); + Object.defineProperty(exports, "nil", { enumerable: true, get: function() { + return codegen_1.nil; + } }); + Object.defineProperty(exports, "Name", { enumerable: true, get: function() { + return codegen_1.Name; + } }); + Object.defineProperty(exports, "CodeGen", { enumerable: true, get: function() { + return codegen_1.CodeGen; + } }); + var validation_error_1 = require_validation_error(); + Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function() { + return validation_error_1.default; + } }); + var ref_error_1 = require_ref_error(); + Object.defineProperty(exports, "MissingRefError", { enumerable: true, get: function() { + return ref_error_1.default; + } }); + } +}); + +// node_modules/zod/v3/helpers/util.js +var util; +(function(util2) { + util2.assertEqual = (_) => { + }; + function assertIs2(_arg) { + } + util2.assertIs = assertIs2; + function assertNever2(_x) { + throw new Error(); + } + util2.assertNever = assertNever2; + util2.arrayToEnum = (items) => { + const obj = {}; + for (const item of items) { + obj[item] = item; + } + return obj; + }; + util2.getValidEnumValues = (obj) => { + const validKeys = util2.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== "number"); + const filtered = {}; + for (const k of validKeys) { + filtered[k] = obj[k]; + } + return util2.objectValues(filtered); + }; + util2.objectValues = (obj) => { + return util2.objectKeys(obj).map(function(e) { + return obj[e]; + }); + }; + util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object3) => { + const keys = []; + for (const key in object3) { + if (Object.prototype.hasOwnProperty.call(object3, key)) { + keys.push(key); + } + } + return keys; + }; + util2.find = (arr, checker) => { + for (const item of arr) { + if (checker(item)) + return item; + } + return void 0; + }; + util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (val) => typeof val === "number" && Number.isFinite(val) && Math.floor(val) === val; + function joinValues2(array2, separator = " | ") { + return array2.map((val) => typeof val === "string" ? `'${val}'` : val).join(separator); + } + util2.joinValues = joinValues2; + util2.jsonStringifyReplacer = (_, value) => { + if (typeof value === "bigint") { + return value.toString(); + } + return value; + }; +})(util || (util = {})); +var objectUtil; +(function(objectUtil2) { + objectUtil2.mergeShapes = (first, second) => { + return { + ...first, + ...second + // second overwrites first + }; + }; +})(objectUtil || (objectUtil = {})); +var ZodParsedType = util.arrayToEnum([ + "string", + "nan", + "number", + "integer", + "float", + "boolean", + "date", + "bigint", + "symbol", + "function", + "undefined", + "null", + "array", + "object", + "unknown", + "promise", + "void", + "never", + "map", + "set" +]); +var getParsedType = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return ZodParsedType.undefined; + case "string": + return ZodParsedType.string; + case "number": + return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number; + case "boolean": + return ZodParsedType.boolean; + case "function": + return ZodParsedType.function; + case "bigint": + return ZodParsedType.bigint; + case "symbol": + return ZodParsedType.symbol; + case "object": + if (Array.isArray(data)) { + return ZodParsedType.array; + } + if (data === null) { + return ZodParsedType.null; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return ZodParsedType.promise; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return ZodParsedType.map; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return ZodParsedType.set; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return ZodParsedType.date; + } + return ZodParsedType.object; + default: + return ZodParsedType.unknown; + } +}; + +// node_modules/zod/v3/ZodError.js +var ZodIssueCode = util.arrayToEnum([ + "invalid_type", + "invalid_literal", + "custom", + "invalid_union", + "invalid_union_discriminator", + "invalid_enum_value", + "unrecognized_keys", + "invalid_arguments", + "invalid_return_type", + "invalid_date", + "invalid_string", + "too_small", + "too_big", + "invalid_intersection_types", + "not_multiple_of", + "not_finite" +]); +var ZodError = class _ZodError extends Error { + get errors() { + return this.issues; + } + constructor(issues) { + super(); + this.issues = []; + this.addIssue = (sub) => { + this.issues = [...this.issues, sub]; + }; + this.addIssues = (subs = []) => { + this.issues = [...this.issues, ...subs]; + }; + const actualProto = new.target.prototype; + if (Object.setPrototypeOf) { + Object.setPrototypeOf(this, actualProto); + } else { + this.__proto__ = actualProto; + } + this.name = "ZodError"; + this.issues = issues; + } + format(_mapper) { + const mapper = _mapper || function(issue2) { + return issue2.message; + }; + const fieldErrors = { _errors: [] }; + const processError = (error48) => { + for (const issue2 of error48.issues) { + if (issue2.code === "invalid_union") { + issue2.unionErrors.map(processError); + } else if (issue2.code === "invalid_return_type") { + processError(issue2.returnTypeError); + } else if (issue2.code === "invalid_arguments") { + processError(issue2.argumentsError); + } else if (issue2.path.length === 0) { + fieldErrors._errors.push(mapper(issue2)); + } else { + let curr = fieldErrors; + let i = 0; + while (i < issue2.path.length) { + const el = issue2.path[i]; + const terminal = i === issue2.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue2)); + } + curr = curr[el]; + i++; + } + } + } + }; + processError(this); + return fieldErrors; + } + static assert(value) { + if (!(value instanceof _ZodError)) { + throw new Error(`Not a ZodError: ${value}`); + } + } + toString() { + return this.message; + } + get message() { + return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2); + } + get isEmpty() { + return this.issues.length === 0; + } + flatten(mapper = (issue2) => issue2.message) { + const fieldErrors = /* @__PURE__ */ Object.create(null); + const formErrors = []; + for (const sub of this.issues) { + if (sub.path.length > 0) { + const firstEl = sub.path[0]; + fieldErrors[firstEl] = fieldErrors[firstEl] || []; + fieldErrors[firstEl].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; + } + get formErrors() { + return this.flatten(); + } +}; +ZodError.create = (issues) => { + const error48 = new ZodError(issues); + return error48; +}; + +// node_modules/zod/v3/locales/en.js +var errorMap = (issue2, _ctx) => { + let message; + switch (issue2.code) { + case ZodIssueCode.invalid_type: + if (issue2.received === ZodParsedType.undefined) { + message = "Required"; + } else { + message = `Expected ${issue2.expected}, received ${issue2.received}`; + } + break; + case ZodIssueCode.invalid_literal: + message = `Invalid literal value, expected ${JSON.stringify(issue2.expected, util.jsonStringifyReplacer)}`; + break; + case ZodIssueCode.unrecognized_keys: + message = `Unrecognized key(s) in object: ${util.joinValues(issue2.keys, ", ")}`; + break; + case ZodIssueCode.invalid_union: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_union_discriminator: + message = `Invalid discriminator value. Expected ${util.joinValues(issue2.options)}`; + break; + case ZodIssueCode.invalid_enum_value: + message = `Invalid enum value. Expected ${util.joinValues(issue2.options)}, received '${issue2.received}'`; + break; + case ZodIssueCode.invalid_arguments: + message = `Invalid function arguments`; + break; + case ZodIssueCode.invalid_return_type: + message = `Invalid function return type`; + break; + case ZodIssueCode.invalid_date: + message = `Invalid date`; + break; + case ZodIssueCode.invalid_string: + if (typeof issue2.validation === "object") { + if ("includes" in issue2.validation) { + message = `Invalid input: must include "${issue2.validation.includes}"`; + if (typeof issue2.validation.position === "number") { + message = `${message} at one or more positions greater than or equal to ${issue2.validation.position}`; + } + } else if ("startsWith" in issue2.validation) { + message = `Invalid input: must start with "${issue2.validation.startsWith}"`; + } else if ("endsWith" in issue2.validation) { + message = `Invalid input: must end with "${issue2.validation.endsWith}"`; + } else { + util.assertNever(issue2.validation); + } + } else if (issue2.validation !== "regex") { + message = `Invalid ${issue2.validation}`; + } else { + message = "Invalid"; + } + break; + case ZodIssueCode.too_small: + if (issue2.type === "array") + message = `Array must contain ${issue2.exact ? "exactly" : issue2.inclusive ? `at least` : `more than`} ${issue2.minimum} element(s)`; + else if (issue2.type === "string") + message = `String must contain ${issue2.exact ? "exactly" : issue2.inclusive ? `at least` : `over`} ${issue2.minimum} character(s)`; + else if (issue2.type === "number") + message = `Number must be ${issue2.exact ? `exactly equal to ` : issue2.inclusive ? `greater than or equal to ` : `greater than `}${issue2.minimum}`; + else if (issue2.type === "bigint") + message = `Number must be ${issue2.exact ? `exactly equal to ` : issue2.inclusive ? `greater than or equal to ` : `greater than `}${issue2.minimum}`; + else if (issue2.type === "date") + message = `Date must be ${issue2.exact ? `exactly equal to ` : issue2.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue2.minimum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.too_big: + if (issue2.type === "array") + message = `Array must contain ${issue2.exact ? `exactly` : issue2.inclusive ? `at most` : `less than`} ${issue2.maximum} element(s)`; + else if (issue2.type === "string") + message = `String must contain ${issue2.exact ? `exactly` : issue2.inclusive ? `at most` : `under`} ${issue2.maximum} character(s)`; + else if (issue2.type === "number") + message = `Number must be ${issue2.exact ? `exactly` : issue2.inclusive ? `less than or equal to` : `less than`} ${issue2.maximum}`; + else if (issue2.type === "bigint") + message = `BigInt must be ${issue2.exact ? `exactly` : issue2.inclusive ? `less than or equal to` : `less than`} ${issue2.maximum}`; + else if (issue2.type === "date") + message = `Date must be ${issue2.exact ? `exactly` : issue2.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue2.maximum))}`; + else + message = "Invalid input"; + break; + case ZodIssueCode.custom: + message = `Invalid input`; + break; + case ZodIssueCode.invalid_intersection_types: + message = `Intersection results could not be merged`; + break; + case ZodIssueCode.not_multiple_of: + message = `Number must be a multiple of ${issue2.multipleOf}`; + break; + case ZodIssueCode.not_finite: + message = "Number must be finite"; + break; + default: + message = _ctx.defaultError; + util.assertNever(issue2); + } + return { message }; +}; +var en_default = errorMap; + +// node_modules/zod/v3/errors.js +var overrideErrorMap = en_default; +function getErrorMap() { + return overrideErrorMap; +} + +// node_modules/zod/v3/helpers/parseUtil.js +var makeIssue = (params) => { + const { data, path, errorMaps, issueData } = params; + const fullPath = [...path, ...issueData.path || []]; + const fullIssue = { + ...issueData, + path: fullPath + }; + if (issueData.message !== void 0) { + return { + ...issueData, + path: fullPath, + message: issueData.message + }; + } + let errorMessage = ""; + const maps = errorMaps.filter((m) => !!m).slice().reverse(); + for (const map2 of maps) { + errorMessage = map2(fullIssue, { data, defaultError: errorMessage }).message; + } + return { + ...issueData, + path: fullPath, + message: errorMessage + }; +}; +function addIssueToContext(ctx, issueData) { + const overrideMap = getErrorMap(); + const issue2 = makeIssue({ + issueData, + data: ctx.data, + path: ctx.path, + errorMaps: [ + ctx.common.contextualErrorMap, + // contextual error map is first priority + ctx.schemaErrorMap, + // then schema-bound map if available + overrideMap, + // then global override map + overrideMap === en_default ? void 0 : en_default + // then global default map + ].filter((x) => !!x) + }); + ctx.common.issues.push(issue2); +} +var ParseStatus = class _ParseStatus { + constructor() { + this.value = "valid"; + } + dirty() { + if (this.value === "valid") + this.value = "dirty"; + } + abort() { + if (this.value !== "aborted") + this.value = "aborted"; + } + static mergeArray(status, results) { + const arrayValue = []; + for (const s of results) { + if (s.status === "aborted") + return INVALID; + if (s.status === "dirty") + status.dirty(); + arrayValue.push(s.value); + } + return { status: status.value, value: arrayValue }; + } + static async mergeObjectAsync(status, pairs) { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value + }); + } + return _ParseStatus.mergeObjectSync(status, syncPairs); + } + static mergeObjectSync(status, pairs) { + const finalObject = {}; + for (const pair of pairs) { + const { key, value } = pair; + if (key.status === "aborted") + return INVALID; + if (value.status === "aborted") + return INVALID; + if (key.status === "dirty") + status.dirty(); + if (value.status === "dirty") + status.dirty(); + if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) { + finalObject[key.value] = value.value; + } + } + return { status: status.value, value: finalObject }; + } +}; +var INVALID = Object.freeze({ + status: "aborted" +}); +var DIRTY = (value) => ({ status: "dirty", value }); +var OK = (value) => ({ status: "valid", value }); +var isAborted = (x) => x.status === "aborted"; +var isDirty = (x) => x.status === "dirty"; +var isValid = (x) => x.status === "valid"; +var isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; + +// node_modules/zod/v3/helpers/errorUtil.js +var errorUtil; +(function(errorUtil2) { + errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {}; + errorUtil2.toString = (message) => typeof message === "string" ? message : message?.message; +})(errorUtil || (errorUtil = {})); + +// node_modules/zod/v3/types.js +var ParseInputLazyPath = class { + constructor(parent, value, path, key) { + this._cachedPath = []; + this.parent = parent; + this.data = value; + this._path = path; + this._key = key; + } + get path() { + if (!this._cachedPath.length) { + if (Array.isArray(this._key)) { + this._cachedPath.push(...this._path, ...this._key); + } else { + this._cachedPath.push(...this._path, this._key); + } + } + return this._cachedPath; + } +}; +var handleResult = (ctx, result) => { + if (isValid(result)) { + return { success: true, data: result.value }; + } else { + if (!ctx.common.issues.length) { + throw new Error("Validation failed but no issues detected."); + } + return { + success: false, + get error() { + if (this._error) + return this._error; + const error48 = new ZodError(ctx.common.issues); + this._error = error48; + return this._error; + } + }; + } +}; +function processCreateParams(params) { + if (!params) + return {}; + const { errorMap: errorMap2, invalid_type_error, required_error, description } = params; + if (errorMap2 && (invalid_type_error || required_error)) { + throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`); + } + if (errorMap2) + return { errorMap: errorMap2, description }; + const customMap = (iss, ctx) => { + const { message } = params; + if (iss.code === "invalid_enum_value") { + return { message: message ?? ctx.defaultError }; + } + if (typeof ctx.data === "undefined") { + return { message: message ?? required_error ?? ctx.defaultError }; + } + if (iss.code !== "invalid_type") + return { message: ctx.defaultError }; + return { message: message ?? invalid_type_error ?? ctx.defaultError }; + }; + return { errorMap: customMap, description }; +} +var ZodType = class { + get description() { + return this._def.description; + } + _getType(input) { + return getParsedType(input.data); + } + _getOrReturnCtx(input, ctx) { + return ctx || { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + }; + } + _processInputParams(input) { + return { + status: new ParseStatus(), + ctx: { + common: input.parent.common, + data: input.data, + parsedType: getParsedType(input.data), + schemaErrorMap: this._def.errorMap, + path: input.path, + parent: input.parent + } + }; + } + _parseSync(input) { + const result = this._parse(input); + if (isAsync(result)) { + throw new Error("Synchronous parse encountered promise."); + } + return result; + } + _parseAsync(input) { + const result = this._parse(input); + return Promise.resolve(result); + } + parse(data, params) { + const result = this.safeParse(data, params); + if (result.success) + return result.data; + throw result.error; + } + safeParse(data, params) { + const ctx = { + common: { + issues: [], + async: params?.async ?? false, + contextualErrorMap: params?.errorMap + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const result = this._parseSync({ data, path: ctx.path, parent: ctx }); + return handleResult(ctx, result); + } + "~validate"(data) { + const ctx = { + common: { + issues: [], + async: !!this["~standard"].async + }, + path: [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + if (!this["~standard"].async) { + try { + const result = this._parseSync({ data, path: [], parent: ctx }); + return isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }; + } catch (err) { + if (err?.message?.toLowerCase()?.includes("encountered")) { + this["~standard"].async = true; + } + ctx.common = { + issues: [], + async: true + }; + } + } + return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) ? { + value: result.value + } : { + issues: ctx.common.issues + }); + } + async parseAsync(data, params) { + const result = await this.safeParseAsync(data, params); + if (result.success) + return result.data; + throw result.error; + } + async safeParseAsync(data, params) { + const ctx = { + common: { + issues: [], + contextualErrorMap: params?.errorMap, + async: true + }, + path: params?.path || [], + schemaErrorMap: this._def.errorMap, + parent: null, + data, + parsedType: getParsedType(data) + }; + const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx }); + const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)); + return handleResult(ctx, result); + } + refine(check2, message) { + const getIssueProperties = (val) => { + if (typeof message === "string" || typeof message === "undefined") { + return { message }; + } else if (typeof message === "function") { + return message(val); + } else { + return message; + } + }; + return this._refinement((val, ctx) => { + const result = check2(val); + const setError = () => ctx.addIssue({ + code: ZodIssueCode.custom, + ...getIssueProperties(val) + }); + if (typeof Promise !== "undefined" && result instanceof Promise) { + return result.then((data) => { + if (!data) { + setError(); + return false; + } else { + return true; + } + }); + } + if (!result) { + setError(); + return false; + } else { + return true; + } + }); + } + refinement(check2, refinementData) { + return this._refinement((val, ctx) => { + if (!check2(val)) { + ctx.addIssue(typeof refinementData === "function" ? refinementData(val, ctx) : refinementData); + return false; + } else { + return true; + } + }); + } + _refinement(refinement) { + return new ZodEffects({ + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "refinement", refinement } + }); + } + superRefine(refinement) { + return this._refinement(refinement); + } + constructor(def) { + this.spa = this.safeParseAsync; + this._def = def; + this.parse = this.parse.bind(this); + this.safeParse = this.safeParse.bind(this); + this.parseAsync = this.parseAsync.bind(this); + this.safeParseAsync = this.safeParseAsync.bind(this); + this.spa = this.spa.bind(this); + this.refine = this.refine.bind(this); + this.refinement = this.refinement.bind(this); + this.superRefine = this.superRefine.bind(this); + this.optional = this.optional.bind(this); + this.nullable = this.nullable.bind(this); + this.nullish = this.nullish.bind(this); + this.array = this.array.bind(this); + this.promise = this.promise.bind(this); + this.or = this.or.bind(this); + this.and = this.and.bind(this); + this.transform = this.transform.bind(this); + this.brand = this.brand.bind(this); + this.default = this.default.bind(this); + this.catch = this.catch.bind(this); + this.describe = this.describe.bind(this); + this.pipe = this.pipe.bind(this); + this.readonly = this.readonly.bind(this); + this.isNullable = this.isNullable.bind(this); + this.isOptional = this.isOptional.bind(this); + this["~standard"] = { + version: 1, + vendor: "zod", + validate: (data) => this["~validate"](data) + }; + } + optional() { + return ZodOptional.create(this, this._def); + } + nullable() { + return ZodNullable.create(this, this._def); + } + nullish() { + return this.nullable().optional(); + } + array() { + return ZodArray.create(this); + } + promise() { + return ZodPromise.create(this, this._def); + } + or(option) { + return ZodUnion.create([this, option], this._def); + } + and(incoming) { + return ZodIntersection.create(this, incoming, this._def); + } + transform(transform2) { + return new ZodEffects({ + ...processCreateParams(this._def), + schema: this, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect: { type: "transform", transform: transform2 } + }); + } + default(def) { + const defaultValueFunc = typeof def === "function" ? def : () => def; + return new ZodDefault({ + ...processCreateParams(this._def), + innerType: this, + defaultValue: defaultValueFunc, + typeName: ZodFirstPartyTypeKind.ZodDefault + }); + } + brand() { + return new ZodBranded({ + typeName: ZodFirstPartyTypeKind.ZodBranded, + type: this, + ...processCreateParams(this._def) + }); + } + catch(def) { + const catchValueFunc = typeof def === "function" ? def : () => def; + return new ZodCatch({ + ...processCreateParams(this._def), + innerType: this, + catchValue: catchValueFunc, + typeName: ZodFirstPartyTypeKind.ZodCatch + }); + } + describe(description) { + const This = this.constructor; + return new This({ + ...this._def, + description + }); + } + pipe(target) { + return ZodPipeline.create(this, target); + } + readonly() { + return ZodReadonly.create(this); + } + isOptional() { + return this.safeParse(void 0).success; + } + isNullable() { + return this.safeParse(null).success; + } +}; +var cuidRegex = /^c[^\s-]{8,}$/i; +var cuid2Regex = /^[0-9a-z]+$/; +var ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i; +var uuidRegex = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i; +var nanoidRegex = /^[a-z0-9_-]{21}$/i; +var jwtRegex = /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/; +var durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; +var emailRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i; +var _emojiRegex = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; +var emojiRegex; +var ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; +var ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/; +var ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; +var ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; +var base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/; +var base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/; +var dateRegexSource = `((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))`; +var dateRegex = new RegExp(`^${dateRegexSource}$`); +function timeRegexSource(args) { + let secondsRegexSource = `[0-5]\\d`; + if (args.precision) { + secondsRegexSource = `${secondsRegexSource}\\.\\d{${args.precision}}`; + } else if (args.precision == null) { + secondsRegexSource = `${secondsRegexSource}(\\.\\d+)?`; + } + const secondsQuantifier = args.precision ? "+" : "?"; + return `([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`; +} +function timeRegex(args) { + return new RegExp(`^${timeRegexSource(args)}$`); +} +function datetimeRegex(args) { + let regex = `${dateRegexSource}T${timeRegexSource(args)}`; + const opts = []; + opts.push(args.local ? `Z?` : `Z`); + if (args.offset) + opts.push(`([+-]\\d{2}:?\\d{2})`); + regex = `${regex}(${opts.join("|")})`; + return new RegExp(`^${regex}$`); +} +function isValidIP(ip, version2) { + if ((version2 === "v4" || !version2) && ipv4Regex.test(ip)) { + return true; + } + if ((version2 === "v6" || !version2) && ipv6Regex.test(ip)) { + return true; + } + return false; +} +function isValidJWT(jwt2, alg) { + if (!jwtRegex.test(jwt2)) + return false; + try { + const [header] = jwt2.split("."); + if (!header) + return false; + const base643 = header.replace(/-/g, "+").replace(/_/g, "/").padEnd(header.length + (4 - header.length % 4) % 4, "="); + const decoded = JSON.parse(atob(base643)); + if (typeof decoded !== "object" || decoded === null) + return false; + if ("typ" in decoded && decoded?.typ !== "JWT") + return false; + if (!decoded.alg) + return false; + if (alg && decoded.alg !== alg) + return false; + return true; + } catch { + return false; + } +} +function isValidCidr(ip, version2) { + if ((version2 === "v4" || !version2) && ipv4CidrRegex.test(ip)) { + return true; + } + if ((version2 === "v6" || !version2) && ipv6CidrRegex.test(ip)) { + return true; + } + return false; +} +var ZodString = class _ZodString2 extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = String(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.string) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.string, + received: ctx2.parsedType + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check2 of this._def.checks) { + if (check2.kind === "min") { + if (input.data.length < check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check2.value, + type: "string", + inclusive: true, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "max") { + if (input.data.length > check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check2.value, + type: "string", + inclusive: true, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "length") { + const tooBig = input.data.length > check2.value; + const tooSmall = input.data.length < check2.value; + if (tooBig || tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + if (tooBig) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check2.value, + type: "string", + inclusive: true, + exact: true, + message: check2.message + }); + } else if (tooSmall) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check2.value, + type: "string", + inclusive: true, + exact: true, + message: check2.message + }); + } + status.dirty(); + } + } else if (check2.kind === "email") { + if (!emailRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "email", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "emoji") { + if (!emojiRegex) { + emojiRegex = new RegExp(_emojiRegex, "u"); + } + if (!emojiRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "emoji", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "uuid") { + if (!uuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "uuid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "nanoid") { + if (!nanoidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "nanoid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "cuid") { + if (!cuidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "cuid2") { + if (!cuid2Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cuid2", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "ulid") { + if (!ulidRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ulid", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "url") { + try { + new URL(input.data); + } catch { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "url", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "regex") { + check2.regex.lastIndex = 0; + const testResult = check2.regex.test(input.data); + if (!testResult) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "regex", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "trim") { + input.data = input.data.trim(); + } else if (check2.kind === "includes") { + if (!input.data.includes(check2.value, check2.position)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { includes: check2.value, position: check2.position }, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "toLowerCase") { + input.data = input.data.toLowerCase(); + } else if (check2.kind === "toUpperCase") { + input.data = input.data.toUpperCase(); + } else if (check2.kind === "startsWith") { + if (!input.data.startsWith(check2.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { startsWith: check2.value }, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "endsWith") { + if (!input.data.endsWith(check2.value)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: { endsWith: check2.value }, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "datetime") { + const regex = datetimeRegex(check2); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "datetime", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "date") { + const regex = dateRegex; + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "date", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "time") { + const regex = timeRegex(check2); + if (!regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_string, + validation: "time", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "duration") { + if (!durationRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "duration", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "ip") { + if (!isValidIP(input.data, check2.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "ip", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "jwt") { + if (!isValidJWT(input.data, check2.alg)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "jwt", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "cidr") { + if (!isValidCidr(input.data, check2.version)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "cidr", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "base64") { + if (!base64Regex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "base64", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "base64url") { + if (!base64urlRegex.test(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + validation: "base64url", + code: ZodIssueCode.invalid_string, + message: check2.message + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { status: status.value, value: input.data }; + } + _regex(regex, validation, message) { + return this.refinement((data) => regex.test(data), { + validation, + code: ZodIssueCode.invalid_string, + ...errorUtil.errToObj(message) + }); + } + _addCheck(check2) { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + email(message) { + return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) }); + } + url(message) { + return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) }); + } + emoji(message) { + return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) }); + } + uuid(message) { + return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) }); + } + nanoid(message) { + return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) }); + } + cuid(message) { + return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) }); + } + cuid2(message) { + return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) }); + } + ulid(message) { + return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) }); + } + base64(message) { + return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) }); + } + base64url(message) { + return this._addCheck({ + kind: "base64url", + ...errorUtil.errToObj(message) + }); + } + jwt(options) { + return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) }); + } + ip(options) { + return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) }); + } + cidr(options) { + return this._addCheck({ kind: "cidr", ...errorUtil.errToObj(options) }); + } + datetime(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "datetime", + precision: null, + offset: false, + local: false, + message: options + }); + } + return this._addCheck({ + kind: "datetime", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + offset: options?.offset ?? false, + local: options?.local ?? false, + ...errorUtil.errToObj(options?.message) + }); + } + date(message) { + return this._addCheck({ kind: "date", message }); + } + time(options) { + if (typeof options === "string") { + return this._addCheck({ + kind: "time", + precision: null, + message: options + }); + } + return this._addCheck({ + kind: "time", + precision: typeof options?.precision === "undefined" ? null : options?.precision, + ...errorUtil.errToObj(options?.message) + }); + } + duration(message) { + return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) }); + } + regex(regex, message) { + return this._addCheck({ + kind: "regex", + regex, + ...errorUtil.errToObj(message) + }); + } + includes(value, options) { + return this._addCheck({ + kind: "includes", + value, + position: options?.position, + ...errorUtil.errToObj(options?.message) + }); + } + startsWith(value, message) { + return this._addCheck({ + kind: "startsWith", + value, + ...errorUtil.errToObj(message) + }); + } + endsWith(value, message) { + return this._addCheck({ + kind: "endsWith", + value, + ...errorUtil.errToObj(message) + }); + } + min(minLength, message) { + return this._addCheck({ + kind: "min", + value: minLength, + ...errorUtil.errToObj(message) + }); + } + max(maxLength, message) { + return this._addCheck({ + kind: "max", + value: maxLength, + ...errorUtil.errToObj(message) + }); + } + length(len, message) { + return this._addCheck({ + kind: "length", + value: len, + ...errorUtil.errToObj(message) + }); + } + /** + * Equivalent to `.min(1)` + */ + nonempty(message) { + return this.min(1, errorUtil.errToObj(message)); + } + trim() { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, { kind: "trim" }] + }); + } + toLowerCase() { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, { kind: "toLowerCase" }] + }); + } + toUpperCase() { + return new _ZodString2({ + ...this._def, + checks: [...this._def.checks, { kind: "toUpperCase" }] + }); + } + get isDatetime() { + return !!this._def.checks.find((ch) => ch.kind === "datetime"); + } + get isDate() { + return !!this._def.checks.find((ch) => ch.kind === "date"); + } + get isTime() { + return !!this._def.checks.find((ch) => ch.kind === "time"); + } + get isDuration() { + return !!this._def.checks.find((ch) => ch.kind === "duration"); + } + get isEmail() { + return !!this._def.checks.find((ch) => ch.kind === "email"); + } + get isURL() { + return !!this._def.checks.find((ch) => ch.kind === "url"); + } + get isEmoji() { + return !!this._def.checks.find((ch) => ch.kind === "emoji"); + } + get isUUID() { + return !!this._def.checks.find((ch) => ch.kind === "uuid"); + } + get isNANOID() { + return !!this._def.checks.find((ch) => ch.kind === "nanoid"); + } + get isCUID() { + return !!this._def.checks.find((ch) => ch.kind === "cuid"); + } + get isCUID2() { + return !!this._def.checks.find((ch) => ch.kind === "cuid2"); + } + get isULID() { + return !!this._def.checks.find((ch) => ch.kind === "ulid"); + } + get isIP() { + return !!this._def.checks.find((ch) => ch.kind === "ip"); + } + get isCIDR() { + return !!this._def.checks.find((ch) => ch.kind === "cidr"); + } + get isBase64() { + return !!this._def.checks.find((ch) => ch.kind === "base64"); + } + get isBase64url() { + return !!this._def.checks.find((ch) => ch.kind === "base64url"); + } + get minLength() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxLength() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodString.create = (params) => { + return new ZodString({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodString, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +function floatSafeRemainder(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepDecCount = (step.toString().split(".")[1] || "").length; + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = Number.parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / 10 ** decCount; +} +var ZodNumber = class _ZodNumber extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + this.step = this.multipleOf; + } + _parse(input) { + if (this._def.coerce) { + input.data = Number(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.number) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.number, + received: ctx2.parsedType + }); + return INVALID; + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check2 of this._def.checks) { + if (check2.kind === "int") { + if (!util.isInteger(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: "integer", + received: "float", + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "min") { + const tooSmall = check2.inclusive ? input.data < check2.value : input.data <= check2.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: check2.value, + type: "number", + inclusive: check2.inclusive, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "max") { + const tooBig = check2.inclusive ? input.data > check2.value : input.data >= check2.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: check2.value, + type: "number", + inclusive: check2.inclusive, + exact: false, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "multipleOf") { + if (floatSafeRemainder(input.data, check2.value) !== 0) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check2.value, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "finite") { + if (!Number.isFinite(input.data)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_finite, + message: check2.message + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { status: status.value, value: input.data }; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodNumber({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check2) { + return new _ZodNumber({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + int(message) { + return this._addCheck({ + kind: "int", + message: errorUtil.toString(message) + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: 0, + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + finite(message) { + return this._addCheck({ + kind: "finite", + message: errorUtil.toString(message) + }); + } + safe(message) { + return this._addCheck({ + kind: "min", + inclusive: true, + value: Number.MIN_SAFE_INTEGER, + message: errorUtil.toString(message) + })._addCheck({ + kind: "max", + inclusive: true, + value: Number.MAX_SAFE_INTEGER, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } + get isInt() { + return !!this._def.checks.find((ch) => ch.kind === "int" || ch.kind === "multipleOf" && util.isInteger(ch.value)); + } + get isFinite() { + let max = null; + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "finite" || ch.kind === "int" || ch.kind === "multipleOf") { + return true; + } else if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } else if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return Number.isFinite(min) && Number.isFinite(max); + } +}; +ZodNumber.create = (params) => { + return new ZodNumber({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodNumber, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodBigInt = class _ZodBigInt extends ZodType { + constructor() { + super(...arguments); + this.min = this.gte; + this.max = this.lte; + } + _parse(input) { + if (this._def.coerce) { + try { + input.data = BigInt(input.data); + } catch { + return this._getInvalidInput(input); + } + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.bigint) { + return this._getInvalidInput(input); + } + let ctx = void 0; + const status = new ParseStatus(); + for (const check2 of this._def.checks) { + if (check2.kind === "min") { + const tooSmall = check2.inclusive ? input.data < check2.value : input.data <= check2.value; + if (tooSmall) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + type: "bigint", + minimum: check2.value, + inclusive: check2.inclusive, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "max") { + const tooBig = check2.inclusive ? input.data > check2.value : input.data >= check2.value; + if (tooBig) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + type: "bigint", + maximum: check2.value, + inclusive: check2.inclusive, + message: check2.message + }); + status.dirty(); + } + } else if (check2.kind === "multipleOf") { + if (input.data % check2.value !== BigInt(0)) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.not_multiple_of, + multipleOf: check2.value, + message: check2.message + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { status: status.value, value: input.data }; + } + _getInvalidInput(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.bigint, + received: ctx.parsedType + }); + return INVALID; + } + gte(value, message) { + return this.setLimit("min", value, true, errorUtil.toString(message)); + } + gt(value, message) { + return this.setLimit("min", value, false, errorUtil.toString(message)); + } + lte(value, message) { + return this.setLimit("max", value, true, errorUtil.toString(message)); + } + lt(value, message) { + return this.setLimit("max", value, false, errorUtil.toString(message)); + } + setLimit(kind, value, inclusive, message) { + return new _ZodBigInt({ + ...this._def, + checks: [ + ...this._def.checks, + { + kind, + value, + inclusive, + message: errorUtil.toString(message) + } + ] + }); + } + _addCheck(check2) { + return new _ZodBigInt({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + positive(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + negative(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: false, + message: errorUtil.toString(message) + }); + } + nonpositive(message) { + return this._addCheck({ + kind: "max", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + nonnegative(message) { + return this._addCheck({ + kind: "min", + value: BigInt(0), + inclusive: true, + message: errorUtil.toString(message) + }); + } + multipleOf(value, message) { + return this._addCheck({ + kind: "multipleOf", + value, + message: errorUtil.toString(message) + }); + } + get minValue() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min; + } + get maxValue() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max; + } +}; +ZodBigInt.create = (params) => { + return new ZodBigInt({ + checks: [], + typeName: ZodFirstPartyTypeKind.ZodBigInt, + coerce: params?.coerce ?? false, + ...processCreateParams(params) + }); +}; +var ZodBoolean = class extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = Boolean(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.boolean) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.boolean, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodBoolean.create = (params) => { + return new ZodBoolean({ + typeName: ZodFirstPartyTypeKind.ZodBoolean, + coerce: params?.coerce || false, + ...processCreateParams(params) + }); +}; +var ZodDate = class _ZodDate extends ZodType { + _parse(input) { + if (this._def.coerce) { + input.data = new Date(input.data); + } + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.date) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.date, + received: ctx2.parsedType + }); + return INVALID; + } + if (Number.isNaN(input.data.getTime())) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_date + }); + return INVALID; + } + const status = new ParseStatus(); + let ctx = void 0; + for (const check2 of this._def.checks) { + if (check2.kind === "min") { + if (input.data.getTime() < check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + message: check2.message, + inclusive: true, + exact: false, + minimum: check2.value, + type: "date" + }); + status.dirty(); + } + } else if (check2.kind === "max") { + if (input.data.getTime() > check2.value) { + ctx = this._getOrReturnCtx(input, ctx); + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + message: check2.message, + inclusive: true, + exact: false, + maximum: check2.value, + type: "date" + }); + status.dirty(); + } + } else { + util.assertNever(check2); + } + } + return { + status: status.value, + value: new Date(input.data.getTime()) + }; + } + _addCheck(check2) { + return new _ZodDate({ + ...this._def, + checks: [...this._def.checks, check2] + }); + } + min(minDate, message) { + return this._addCheck({ + kind: "min", + value: minDate.getTime(), + message: errorUtil.toString(message) + }); + } + max(maxDate, message) { + return this._addCheck({ + kind: "max", + value: maxDate.getTime(), + message: errorUtil.toString(message) + }); + } + get minDate() { + let min = null; + for (const ch of this._def.checks) { + if (ch.kind === "min") { + if (min === null || ch.value > min) + min = ch.value; + } + } + return min != null ? new Date(min) : null; + } + get maxDate() { + let max = null; + for (const ch of this._def.checks) { + if (ch.kind === "max") { + if (max === null || ch.value < max) + max = ch.value; + } + } + return max != null ? new Date(max) : null; + } +}; +ZodDate.create = (params) => { + return new ZodDate({ + checks: [], + coerce: params?.coerce || false, + typeName: ZodFirstPartyTypeKind.ZodDate, + ...processCreateParams(params) + }); +}; +var ZodSymbol = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.symbol) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.symbol, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodSymbol.create = (params) => { + return new ZodSymbol({ + typeName: ZodFirstPartyTypeKind.ZodSymbol, + ...processCreateParams(params) + }); +}; +var ZodUndefined = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.undefined, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodUndefined.create = (params) => { + return new ZodUndefined({ + typeName: ZodFirstPartyTypeKind.ZodUndefined, + ...processCreateParams(params) + }); +}; +var ZodNull = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.null) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.null, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodNull.create = (params) => { + return new ZodNull({ + typeName: ZodFirstPartyTypeKind.ZodNull, + ...processCreateParams(params) + }); +}; +var ZodAny = class extends ZodType { + constructor() { + super(...arguments); + this._any = true; + } + _parse(input) { + return OK(input.data); + } +}; +ZodAny.create = (params) => { + return new ZodAny({ + typeName: ZodFirstPartyTypeKind.ZodAny, + ...processCreateParams(params) + }); +}; +var ZodUnknown = class extends ZodType { + constructor() { + super(...arguments); + this._unknown = true; + } + _parse(input) { + return OK(input.data); + } +}; +ZodUnknown.create = (params) => { + return new ZodUnknown({ + typeName: ZodFirstPartyTypeKind.ZodUnknown, + ...processCreateParams(params) + }); +}; +var ZodNever = class extends ZodType { + _parse(input) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.never, + received: ctx.parsedType + }); + return INVALID; + } +}; +ZodNever.create = (params) => { + return new ZodNever({ + typeName: ZodFirstPartyTypeKind.ZodNever, + ...processCreateParams(params) + }); +}; +var ZodVoid = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.undefined) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.void, + received: ctx.parsedType + }); + return INVALID; + } + return OK(input.data); + } +}; +ZodVoid.create = (params) => { + return new ZodVoid({ + typeName: ZodFirstPartyTypeKind.ZodVoid, + ...processCreateParams(params) + }); +}; +var ZodArray = class _ZodArray extends ZodType { + _parse(input) { + const { ctx, status } = this._processInputParams(input); + const def = this._def; + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (def.exactLength !== null) { + const tooBig = ctx.data.length > def.exactLength.value; + const tooSmall = ctx.data.length < def.exactLength.value; + if (tooBig || tooSmall) { + addIssueToContext(ctx, { + code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small, + minimum: tooSmall ? def.exactLength.value : void 0, + maximum: tooBig ? def.exactLength.value : void 0, + type: "array", + inclusive: true, + exact: true, + message: def.exactLength.message + }); + status.dirty(); + } + } + if (def.minLength !== null) { + if (ctx.data.length < def.minLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.minLength.message + }); + status.dirty(); + } + } + if (def.maxLength !== null) { + if (ctx.data.length > def.maxLength.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxLength.value, + type: "array", + inclusive: true, + exact: false, + message: def.maxLength.message + }); + status.dirty(); + } + } + if (ctx.common.async) { + return Promise.all([...ctx.data].map((item, i) => { + return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + })).then((result2) => { + return ParseStatus.mergeArray(status, result2); + }); + } + const result = [...ctx.data].map((item, i) => { + return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); + }); + return ParseStatus.mergeArray(status, result); + } + get element() { + return this._def.type; + } + min(minLength, message) { + return new _ZodArray({ + ...this._def, + minLength: { value: minLength, message: errorUtil.toString(message) } + }); + } + max(maxLength, message) { + return new _ZodArray({ + ...this._def, + maxLength: { value: maxLength, message: errorUtil.toString(message) } + }); + } + length(len, message) { + return new _ZodArray({ + ...this._def, + exactLength: { value: len, message: errorUtil.toString(message) } + }); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodArray.create = (schema, params) => { + return new ZodArray({ + type: schema, + minLength: null, + maxLength: null, + exactLength: null, + typeName: ZodFirstPartyTypeKind.ZodArray, + ...processCreateParams(params) + }); +}; +function deepPartialify(schema) { + if (schema instanceof ZodObject) { + const newShape = {}; + for (const key in schema.shape) { + const fieldSchema = schema.shape[key]; + newShape[key] = ZodOptional.create(deepPartialify(fieldSchema)); + } + return new ZodObject({ + ...schema._def, + shape: () => newShape + }); + } else if (schema instanceof ZodArray) { + return new ZodArray({ + ...schema._def, + type: deepPartialify(schema.element) + }); + } else if (schema instanceof ZodOptional) { + return ZodOptional.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodNullable) { + return ZodNullable.create(deepPartialify(schema.unwrap())); + } else if (schema instanceof ZodTuple) { + return ZodTuple.create(schema.items.map((item) => deepPartialify(item))); + } else { + return schema; + } +} +var ZodObject = class _ZodObject extends ZodType { + constructor() { + super(...arguments); + this._cached = null; + this.nonstrict = this.passthrough; + this.augment = this.extend; + } + _getCached() { + if (this._cached !== null) + return this._cached; + const shape = this._def.shape(); + const keys = util.objectKeys(shape); + this._cached = { shape, keys }; + return this._cached; + } + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.object) { + const ctx2 = this._getOrReturnCtx(input); + addIssueToContext(ctx2, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx2.parsedType + }); + return INVALID; + } + const { status, ctx } = this._processInputParams(input); + const { shape, keys: shapeKeys } = this._getCached(); + const extraKeys = []; + if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === "strip")) { + for (const key in ctx.data) { + if (!shapeKeys.includes(key)) { + extraKeys.push(key); + } + } + } + const pairs = []; + for (const key of shapeKeys) { + const keyValidator = shape[key]; + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (this._def.catchall instanceof ZodNever) { + const unknownKeys = this._def.unknownKeys; + if (unknownKeys === "passthrough") { + for (const key of extraKeys) { + pairs.push({ + key: { status: "valid", value: key }, + value: { status: "valid", value: ctx.data[key] } + }); + } + } else if (unknownKeys === "strict") { + if (extraKeys.length > 0) { + addIssueToContext(ctx, { + code: ZodIssueCode.unrecognized_keys, + keys: extraKeys + }); + status.dirty(); + } + } else if (unknownKeys === "strip") { + } else { + throw new Error(`Internal ZodObject error: invalid unknownKeys value.`); + } + } else { + const catchall = this._def.catchall; + for (const key of extraKeys) { + const value = ctx.data[key]; + pairs.push({ + key: { status: "valid", value: key }, + value: catchall._parse( + new ParseInputLazyPath(ctx, value, ctx.path, key) + //, ctx.child(key), value, getParsedType(value) + ), + alwaysSet: key in ctx.data + }); + } + } + if (ctx.common.async) { + return Promise.resolve().then(async () => { + const syncPairs = []; + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + syncPairs.push({ + key, + value, + alwaysSet: pair.alwaysSet + }); + } + return syncPairs; + }).then((syncPairs) => { + return ParseStatus.mergeObjectSync(status, syncPairs); + }); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get shape() { + return this._def.shape(); + } + strict(message) { + errorUtil.errToObj; + return new _ZodObject({ + ...this._def, + unknownKeys: "strict", + ...message !== void 0 ? { + errorMap: (issue2, ctx) => { + const defaultError = this._def.errorMap?.(issue2, ctx).message ?? ctx.defaultError; + if (issue2.code === "unrecognized_keys") + return { + message: errorUtil.errToObj(message).message ?? defaultError + }; + return { + message: defaultError + }; + } + } : {} + }); + } + strip() { + return new _ZodObject({ + ...this._def, + unknownKeys: "strip" + }); + } + passthrough() { + return new _ZodObject({ + ...this._def, + unknownKeys: "passthrough" + }); + } + // const AugmentFactory = + // <Def extends ZodObjectDef>(def: Def) => + // <Augmentation extends ZodRawShape>( + // augmentation: Augmentation + // ): ZodObject< + // extendShape<ReturnType<Def["shape"]>, Augmentation>, + // Def["unknownKeys"], + // Def["catchall"] + // > => { + // return new ZodObject({ + // ...def, + // shape: () => ({ + // ...def.shape(), + // ...augmentation, + // }), + // }) as any; + // }; + extend(augmentation) { + return new _ZodObject({ + ...this._def, + shape: () => ({ + ...this._def.shape(), + ...augmentation + }) + }); + } + /** + * Prior to zod@1.0.12 there was a bug in the + * inferred type of merged objects. Please + * upgrade if you are experiencing issues. + */ + merge(merging) { + const merged = new _ZodObject({ + unknownKeys: merging._def.unknownKeys, + catchall: merging._def.catchall, + shape: () => ({ + ...this._def.shape(), + ...merging._def.shape() + }), + typeName: ZodFirstPartyTypeKind.ZodObject + }); + return merged; + } + // merge< + // Incoming extends AnyZodObject, + // Augmentation extends Incoming["shape"], + // NewOutput extends { + // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation + // ? Augmentation[k]["_output"] + // : k extends keyof Output + // ? Output[k] + // : never; + // }, + // NewInput extends { + // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation + // ? Augmentation[k]["_input"] + // : k extends keyof Input + // ? Input[k] + // : never; + // } + // >( + // merging: Incoming + // ): ZodObject< + // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"], + // NewOutput, + // NewInput + // > { + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + setKey(key, schema) { + return this.augment({ [key]: schema }); + } + // merge<Incoming extends AnyZodObject>( + // merging: Incoming + // ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => { + // ZodObject< + // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>, + // Incoming["_def"]["unknownKeys"], + // Incoming["_def"]["catchall"] + // > { + // // const mergedShape = objectUtil.mergeShapes( + // // this._def.shape(), + // // merging._def.shape() + // // ); + // const merged: any = new ZodObject({ + // unknownKeys: merging._def.unknownKeys, + // catchall: merging._def.catchall, + // shape: () => + // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()), + // typeName: ZodFirstPartyTypeKind.ZodObject, + // }) as any; + // return merged; + // } + catchall(index) { + return new _ZodObject({ + ...this._def, + catchall: index + }); + } + pick(mask) { + const shape = {}; + for (const key of util.objectKeys(mask)) { + if (mask[key] && this.shape[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + omit(mask) { + const shape = {}; + for (const key of util.objectKeys(this.shape)) { + if (!mask[key]) { + shape[key] = this.shape[key]; + } + } + return new _ZodObject({ + ...this._def, + shape: () => shape + }); + } + /** + * @deprecated + */ + deepPartial() { + return deepPartialify(this); + } + partial(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + const fieldSchema = this.shape[key]; + if (mask && !mask[key]) { + newShape[key] = fieldSchema; + } else { + newShape[key] = fieldSchema.optional(); + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + required(mask) { + const newShape = {}; + for (const key of util.objectKeys(this.shape)) { + if (mask && !mask[key]) { + newShape[key] = this.shape[key]; + } else { + const fieldSchema = this.shape[key]; + let newField = fieldSchema; + while (newField instanceof ZodOptional) { + newField = newField._def.innerType; + } + newShape[key] = newField; + } + } + return new _ZodObject({ + ...this._def, + shape: () => newShape + }); + } + keyof() { + return createZodEnum(util.objectKeys(this.shape)); + } +}; +ZodObject.create = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.strictCreate = (shape, params) => { + return new ZodObject({ + shape: () => shape, + unknownKeys: "strict", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +ZodObject.lazycreate = (shape, params) => { + return new ZodObject({ + shape, + unknownKeys: "strip", + catchall: ZodNever.create(), + typeName: ZodFirstPartyTypeKind.ZodObject, + ...processCreateParams(params) + }); +}; +var ZodUnion = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const options = this._def.options; + function handleResults(results) { + for (const result of results) { + if (result.result.status === "valid") { + return result.result; + } + } + for (const result of results) { + if (result.result.status === "dirty") { + ctx.common.issues.push(...result.ctx.common.issues); + return result.result; + } + } + const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + if (ctx.common.async) { + return Promise.all(options.map(async (option) => { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + return { + result: await option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }), + ctx: childCtx + }; + })).then(handleResults); + } else { + let dirty = void 0; + const issues = []; + for (const option of options) { + const childCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + }, + parent: null + }; + const result = option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: childCtx + }); + if (result.status === "valid") { + return result; + } else if (result.status === "dirty" && !dirty) { + dirty = { result, ctx: childCtx }; + } + if (childCtx.common.issues.length) { + issues.push(childCtx.common.issues); + } + } + if (dirty) { + ctx.common.issues.push(...dirty.ctx.common.issues); + return dirty.result; + } + const unionErrors = issues.map((issues2) => new ZodError(issues2)); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union, + unionErrors + }); + return INVALID; + } + } + get options() { + return this._def.options; + } +}; +ZodUnion.create = (types, params) => { + return new ZodUnion({ + options: types, + typeName: ZodFirstPartyTypeKind.ZodUnion, + ...processCreateParams(params) + }); +}; +var getDiscriminator = (type) => { + if (type instanceof ZodLazy) { + return getDiscriminator(type.schema); + } else if (type instanceof ZodEffects) { + return getDiscriminator(type.innerType()); + } else if (type instanceof ZodLiteral) { + return [type.value]; + } else if (type instanceof ZodEnum) { + return type.options; + } else if (type instanceof ZodNativeEnum) { + return util.objectValues(type.enum); + } else if (type instanceof ZodDefault) { + return getDiscriminator(type._def.innerType); + } else if (type instanceof ZodUndefined) { + return [void 0]; + } else if (type instanceof ZodNull) { + return [null]; + } else if (type instanceof ZodOptional) { + return [void 0, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodNullable) { + return [null, ...getDiscriminator(type.unwrap())]; + } else if (type instanceof ZodBranded) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodReadonly) { + return getDiscriminator(type.unwrap()); + } else if (type instanceof ZodCatch) { + return getDiscriminator(type._def.innerType); + } else { + return []; + } +}; +var ZodDiscriminatedUnion = class _ZodDiscriminatedUnion extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const discriminator = this.discriminator; + const discriminatorValue = ctx.data[discriminator]; + const option = this.optionsMap.get(discriminatorValue); + if (!option) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_union_discriminator, + options: Array.from(this.optionsMap.keys()), + path: [discriminator] + }); + return INVALID; + } + if (ctx.common.async) { + return option._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } else { + return option._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + } + } + get discriminator() { + return this._def.discriminator; + } + get options() { + return this._def.options; + } + get optionsMap() { + return this._def.optionsMap; + } + /** + * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor. + * However, it only allows a union of objects, all of which need to share a discriminator property. This property must + * have a different value for each object in the union. + * @param discriminator the name of the discriminator property + * @param types an array of object schemas + * @param params + */ + static create(discriminator, options, params) { + const optionsMap = /* @__PURE__ */ new Map(); + for (const type of options) { + const discriminatorValues = getDiscriminator(type.shape[discriminator]); + if (!discriminatorValues.length) { + throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`); + } + for (const value of discriminatorValues) { + if (optionsMap.has(value)) { + throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`); + } + optionsMap.set(value, type); + } + } + return new _ZodDiscriminatedUnion({ + typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion, + discriminator, + options, + optionsMap, + ...processCreateParams(params) + }); + } +}; +function mergeValues(a, b) { + const aType = getParsedType(a); + const bType = getParsedType(b); + if (a === b) { + return { valid: true, data: a }; + } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) { + const bKeys = util.objectKeys(b); + const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues(a[key], b[key]); + if (!sharedValue.valid) { + return { valid: false }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) { + if (a.length !== b.length) { + return { valid: false }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues(itemA, itemB); + if (!sharedValue.valid) { + return { valid: false }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) { + return { valid: true, data: a }; + } else { + return { valid: false }; + } +} +var ZodIntersection = class extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const handleParsed = (parsedLeft, parsedRight) => { + if (isAborted(parsedLeft) || isAborted(parsedRight)) { + return INVALID; + } + const merged = mergeValues(parsedLeft.value, parsedRight.value); + if (!merged.valid) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_intersection_types + }); + return INVALID; + } + if (isDirty(parsedLeft) || isDirty(parsedRight)) { + status.dirty(); + } + return { status: status.value, value: merged.data }; + }; + if (ctx.common.async) { + return Promise.all([ + this._def.left._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), + this._def.right._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }) + ]).then(([left, right]) => handleParsed(left, right)); + } else { + return handleParsed(this._def.left._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }), this._def.right._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + })); + } + } +}; +ZodIntersection.create = (left, right, params) => { + return new ZodIntersection({ + left, + right, + typeName: ZodFirstPartyTypeKind.ZodIntersection, + ...processCreateParams(params) + }); +}; +var ZodTuple = class _ZodTuple extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.array) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.array, + received: ctx.parsedType + }); + return INVALID; + } + if (ctx.data.length < this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + return INVALID; + } + const rest = this._def.rest; + if (!rest && ctx.data.length > this._def.items.length) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: this._def.items.length, + inclusive: true, + exact: false, + type: "array" + }); + status.dirty(); + } + const items = [...ctx.data].map((item, itemIndex) => { + const schema = this._def.items[itemIndex] || this._def.rest; + if (!schema) + return null; + return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex)); + }).filter((x) => !!x); + if (ctx.common.async) { + return Promise.all(items).then((results) => { + return ParseStatus.mergeArray(status, results); + }); + } else { + return ParseStatus.mergeArray(status, items); + } + } + get items() { + return this._def.items; + } + rest(rest) { + return new _ZodTuple({ + ...this._def, + rest + }); + } +}; +ZodTuple.create = (schemas, params) => { + if (!Array.isArray(schemas)) { + throw new Error("You must pass an array of schemas to z.tuple([ ... ])"); + } + return new ZodTuple({ + items: schemas, + typeName: ZodFirstPartyTypeKind.ZodTuple, + rest: null, + ...processCreateParams(params) + }); +}; +var ZodRecord = class _ZodRecord extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.object) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.object, + received: ctx.parsedType + }); + return INVALID; + } + const pairs = []; + const keyType = this._def.keyType; + const valueType = this._def.valueType; + for (const key in ctx.data) { + pairs.push({ + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)), + value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)), + alwaysSet: key in ctx.data + }); + } + if (ctx.common.async) { + return ParseStatus.mergeObjectAsync(status, pairs); + } else { + return ParseStatus.mergeObjectSync(status, pairs); + } + } + get element() { + return this._def.valueType; + } + static create(first, second, third) { + if (second instanceof ZodType) { + return new _ZodRecord({ + keyType: first, + valueType: second, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(third) + }); + } + return new _ZodRecord({ + keyType: ZodString.create(), + valueType: first, + typeName: ZodFirstPartyTypeKind.ZodRecord, + ...processCreateParams(second) + }); + } +}; +var ZodMap = class extends ZodType { + get keySchema() { + return this._def.keyType; + } + get valueSchema() { + return this._def.valueType; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.map) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.map, + received: ctx.parsedType + }); + return INVALID; + } + const keyType = this._def.keyType; + const valueType = this._def.valueType; + const pairs = [...ctx.data.entries()].map(([key, value], index) => { + return { + key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])), + value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"])) + }; + }); + if (ctx.common.async) { + const finalMap = /* @__PURE__ */ new Map(); + return Promise.resolve().then(async () => { + for (const pair of pairs) { + const key = await pair.key; + const value = await pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + }); + } else { + const finalMap = /* @__PURE__ */ new Map(); + for (const pair of pairs) { + const key = pair.key; + const value = pair.value; + if (key.status === "aborted" || value.status === "aborted") { + return INVALID; + } + if (key.status === "dirty" || value.status === "dirty") { + status.dirty(); + } + finalMap.set(key.value, value.value); + } + return { status: status.value, value: finalMap }; + } + } +}; +ZodMap.create = (keyType, valueType, params) => { + return new ZodMap({ + valueType, + keyType, + typeName: ZodFirstPartyTypeKind.ZodMap, + ...processCreateParams(params) + }); +}; +var ZodSet = class _ZodSet extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.set) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.set, + received: ctx.parsedType + }); + return INVALID; + } + const def = this._def; + if (def.minSize !== null) { + if (ctx.data.size < def.minSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_small, + minimum: def.minSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.minSize.message + }); + status.dirty(); + } + } + if (def.maxSize !== null) { + if (ctx.data.size > def.maxSize.value) { + addIssueToContext(ctx, { + code: ZodIssueCode.too_big, + maximum: def.maxSize.value, + type: "set", + inclusive: true, + exact: false, + message: def.maxSize.message + }); + status.dirty(); + } + } + const valueType = this._def.valueType; + function finalizeSet(elements2) { + const parsedSet = /* @__PURE__ */ new Set(); + for (const element of elements2) { + if (element.status === "aborted") + return INVALID; + if (element.status === "dirty") + status.dirty(); + parsedSet.add(element.value); + } + return { status: status.value, value: parsedSet }; + } + const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i))); + if (ctx.common.async) { + return Promise.all(elements).then((elements2) => finalizeSet(elements2)); + } else { + return finalizeSet(elements); + } + } + min(minSize, message) { + return new _ZodSet({ + ...this._def, + minSize: { value: minSize, message: errorUtil.toString(message) } + }); + } + max(maxSize, message) { + return new _ZodSet({ + ...this._def, + maxSize: { value: maxSize, message: errorUtil.toString(message) } + }); + } + size(size, message) { + return this.min(size, message).max(size, message); + } + nonempty(message) { + return this.min(1, message); + } +}; +ZodSet.create = (valueType, params) => { + return new ZodSet({ + valueType, + minSize: null, + maxSize: null, + typeName: ZodFirstPartyTypeKind.ZodSet, + ...processCreateParams(params) + }); +}; +var ZodFunction = class _ZodFunction extends ZodType { + constructor() { + super(...arguments); + this.validate = this.implement; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.function) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.function, + received: ctx.parsedType + }); + return INVALID; + } + function makeArgsIssue(args, error48) { + return makeIssue({ + data: args, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_arguments, + argumentsError: error48 + } + }); + } + function makeReturnsIssue(returns, error48) { + return makeIssue({ + data: returns, + path: ctx.path, + errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), en_default].filter((x) => !!x), + issueData: { + code: ZodIssueCode.invalid_return_type, + returnTypeError: error48 + } + }); + } + const params = { errorMap: ctx.common.contextualErrorMap }; + const fn = ctx.data; + if (this._def.returns instanceof ZodPromise) { + const me = this; + return OK(async function(...args) { + const error48 = new ZodError([]); + const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => { + error48.addIssue(makeArgsIssue(args, e)); + throw error48; + }); + const result = await Reflect.apply(fn, this, parsedArgs); + const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e) => { + error48.addIssue(makeReturnsIssue(result, e)); + throw error48; + }); + return parsedReturns; + }); + } else { + const me = this; + return OK(function(...args) { + const parsedArgs = me._def.args.safeParse(args, params); + if (!parsedArgs.success) { + throw new ZodError([makeArgsIssue(args, parsedArgs.error)]); + } + const result = Reflect.apply(fn, this, parsedArgs.data); + const parsedReturns = me._def.returns.safeParse(result, params); + if (!parsedReturns.success) { + throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]); + } + return parsedReturns.data; + }); + } + } + parameters() { + return this._def.args; + } + returnType() { + return this._def.returns; + } + args(...items) { + return new _ZodFunction({ + ...this._def, + args: ZodTuple.create(items).rest(ZodUnknown.create()) + }); + } + returns(returnType) { + return new _ZodFunction({ + ...this._def, + returns: returnType + }); + } + implement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + strictImplement(func) { + const validatedFunc = this.parse(func); + return validatedFunc; + } + static create(args, returns, params) { + return new _ZodFunction({ + args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()), + returns: returns || ZodUnknown.create(), + typeName: ZodFirstPartyTypeKind.ZodFunction, + ...processCreateParams(params) + }); + } +}; +var ZodLazy = class extends ZodType { + get schema() { + return this._def.getter(); + } + _parse(input) { + const { ctx } = this._processInputParams(input); + const lazySchema = this._def.getter(); + return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx }); + } +}; +ZodLazy.create = (getter, params) => { + return new ZodLazy({ + getter, + typeName: ZodFirstPartyTypeKind.ZodLazy, + ...processCreateParams(params) + }); +}; +var ZodLiteral = class extends ZodType { + _parse(input) { + if (input.data !== this._def.value) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_literal, + expected: this._def.value + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } + get value() { + return this._def.value; + } +}; +ZodLiteral.create = (value, params) => { + return new ZodLiteral({ + value, + typeName: ZodFirstPartyTypeKind.ZodLiteral, + ...processCreateParams(params) + }); +}; +function createZodEnum(values, params) { + return new ZodEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodEnum, + ...processCreateParams(params) + }); +} +var ZodEnum = class _ZodEnum extends ZodType { + _parse(input) { + if (typeof input.data !== "string") { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(this._def.values); + } + if (!this._cache.has(input.data)) { + const ctx = this._getOrReturnCtx(input); + const expectedValues = this._def.values; + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get options() { + return this._def.values; + } + get enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Values() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + get Enum() { + const enumValues = {}; + for (const val of this._def.values) { + enumValues[val] = val; + } + return enumValues; + } + extract(values, newDef = this._def) { + return _ZodEnum.create(values, { + ...this._def, + ...newDef + }); + } + exclude(values, newDef = this._def) { + return _ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), { + ...this._def, + ...newDef + }); + } +}; +ZodEnum.create = createZodEnum; +var ZodNativeEnum = class extends ZodType { + _parse(input) { + const nativeEnumValues = util.getValidEnumValues(this._def.values); + const ctx = this._getOrReturnCtx(input); + if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + expected: util.joinValues(expectedValues), + received: ctx.parsedType, + code: ZodIssueCode.invalid_type + }); + return INVALID; + } + if (!this._cache) { + this._cache = new Set(util.getValidEnumValues(this._def.values)); + } + if (!this._cache.has(input.data)) { + const expectedValues = util.objectValues(nativeEnumValues); + addIssueToContext(ctx, { + received: ctx.data, + code: ZodIssueCode.invalid_enum_value, + options: expectedValues + }); + return INVALID; + } + return OK(input.data); + } + get enum() { + return this._def.values; + } +}; +ZodNativeEnum.create = (values, params) => { + return new ZodNativeEnum({ + values, + typeName: ZodFirstPartyTypeKind.ZodNativeEnum, + ...processCreateParams(params) + }); +}; +var ZodPromise = class extends ZodType { + unwrap() { + return this._def.type; + } + _parse(input) { + const { ctx } = this._processInputParams(input); + if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) { + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.promise, + received: ctx.parsedType + }); + return INVALID; + } + const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data); + return OK(promisified.then((data) => { + return this._def.type.parseAsync(data, { + path: ctx.path, + errorMap: ctx.common.contextualErrorMap + }); + })); + } +}; +ZodPromise.create = (schema, params) => { + return new ZodPromise({ + type: schema, + typeName: ZodFirstPartyTypeKind.ZodPromise, + ...processCreateParams(params) + }); +}; +var ZodEffects = class extends ZodType { + innerType() { + return this._def.schema; + } + sourceType() { + return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema; + } + _parse(input) { + const { status, ctx } = this._processInputParams(input); + const effect = this._def.effect || null; + const checkCtx = { + addIssue: (arg) => { + addIssueToContext(ctx, arg); + if (arg.fatal) { + status.abort(); + } else { + status.dirty(); + } + }, + get path() { + return ctx.path; + } + }; + checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx); + if (effect.type === "preprocess") { + const processed = effect.transform(ctx.data, checkCtx); + if (ctx.common.async) { + return Promise.resolve(processed).then(async (processed2) => { + if (status.value === "aborted") + return INVALID; + const result = await this._def.schema._parseAsync({ + data: processed2, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + }); + } else { + if (status.value === "aborted") + return INVALID; + const result = this._def.schema._parseSync({ + data: processed, + path: ctx.path, + parent: ctx + }); + if (result.status === "aborted") + return INVALID; + if (result.status === "dirty") + return DIRTY(result.value); + if (status.value === "dirty") + return DIRTY(result.value); + return result; + } + } + if (effect.type === "refinement") { + const executeRefinement = (acc) => { + const result = effect.refinement(acc, checkCtx); + if (ctx.common.async) { + return Promise.resolve(result); + } + if (result instanceof Promise) { + throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead."); + } + return acc; + }; + if (ctx.common.async === false) { + const inner = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + executeRefinement(inner.value); + return { status: status.value, value: inner.value }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => { + if (inner.status === "aborted") + return INVALID; + if (inner.status === "dirty") + status.dirty(); + return executeRefinement(inner.value).then(() => { + return { status: status.value, value: inner.value }; + }); + }); + } + } + if (effect.type === "transform") { + if (ctx.common.async === false) { + const base = this._def.schema._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (!isValid(base)) + return INVALID; + const result = effect.transform(base.value, checkCtx); + if (result instanceof Promise) { + throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`); + } + return { status: status.value, value: result }; + } else { + return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => { + if (!isValid(base)) + return INVALID; + return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({ + status: status.value, + value: result + })); + }); + } + } + util.assertNever(effect); + } +}; +ZodEffects.create = (schema, effect, params) => { + return new ZodEffects({ + schema, + typeName: ZodFirstPartyTypeKind.ZodEffects, + effect, + ...processCreateParams(params) + }); +}; +ZodEffects.createWithPreprocess = (preprocess2, schema, params) => { + return new ZodEffects({ + schema, + effect: { type: "preprocess", transform: preprocess2 }, + typeName: ZodFirstPartyTypeKind.ZodEffects, + ...processCreateParams(params) + }); +}; +var ZodOptional = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 === ZodParsedType.undefined) { + return OK(void 0); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +}; +ZodOptional.create = (type, params) => { + return new ZodOptional({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodOptional, + ...processCreateParams(params) + }); +}; +var ZodNullable = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 === ZodParsedType.null) { + return OK(null); + } + return this._def.innerType._parse(input); + } + unwrap() { + return this._def.innerType; + } +}; +ZodNullable.create = (type, params) => { + return new ZodNullable({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodNullable, + ...processCreateParams(params) + }); +}; +var ZodDefault = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + let data = ctx.data; + if (ctx.parsedType === ZodParsedType.undefined) { + data = this._def.defaultValue(); + } + return this._def.innerType._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + removeDefault() { + return this._def.innerType; + } +}; +ZodDefault.create = (type, params) => { + return new ZodDefault({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodDefault, + defaultValue: typeof params.default === "function" ? params.default : () => params.default, + ...processCreateParams(params) + }); +}; +var ZodCatch = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const newCtx = { + ...ctx, + common: { + ...ctx.common, + issues: [] + } + }; + const result = this._def.innerType._parse({ + data: newCtx.data, + path: newCtx.path, + parent: { + ...newCtx + } + }); + if (isAsync(result)) { + return result.then((result2) => { + return { + status: "valid", + value: result2.status === "valid" ? result2.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + }); + } else { + return { + status: "valid", + value: result.status === "valid" ? result.value : this._def.catchValue({ + get error() { + return new ZodError(newCtx.common.issues); + }, + input: newCtx.data + }) + }; + } + } + removeCatch() { + return this._def.innerType; + } +}; +ZodCatch.create = (type, params) => { + return new ZodCatch({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodCatch, + catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, + ...processCreateParams(params) + }); +}; +var ZodNaN = class extends ZodType { + _parse(input) { + const parsedType2 = this._getType(input); + if (parsedType2 !== ZodParsedType.nan) { + const ctx = this._getOrReturnCtx(input); + addIssueToContext(ctx, { + code: ZodIssueCode.invalid_type, + expected: ZodParsedType.nan, + received: ctx.parsedType + }); + return INVALID; + } + return { status: "valid", value: input.data }; + } +}; +ZodNaN.create = (params) => { + return new ZodNaN({ + typeName: ZodFirstPartyTypeKind.ZodNaN, + ...processCreateParams(params) + }); +}; +var ZodBranded = class extends ZodType { + _parse(input) { + const { ctx } = this._processInputParams(input); + const data = ctx.data; + return this._def.type._parse({ + data, + path: ctx.path, + parent: ctx + }); + } + unwrap() { + return this._def.type; + } +}; +var ZodPipeline = class _ZodPipeline extends ZodType { + _parse(input) { + const { status, ctx } = this._processInputParams(input); + if (ctx.common.async) { + const handleAsync = async () => { + const inResult = await this._def.in._parseAsync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return DIRTY(inResult.value); + } else { + return this._def.out._parseAsync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + }; + return handleAsync(); + } else { + const inResult = this._def.in._parseSync({ + data: ctx.data, + path: ctx.path, + parent: ctx + }); + if (inResult.status === "aborted") + return INVALID; + if (inResult.status === "dirty") { + status.dirty(); + return { + status: "dirty", + value: inResult.value + }; + } else { + return this._def.out._parseSync({ + data: inResult.value, + path: ctx.path, + parent: ctx + }); + } + } + } + static create(a, b) { + return new _ZodPipeline({ + in: a, + out: b, + typeName: ZodFirstPartyTypeKind.ZodPipeline + }); + } +}; +var ZodReadonly = class extends ZodType { + _parse(input) { + const result = this._def.innerType._parse(input); + const freeze = (data) => { + if (isValid(data)) { + data.value = Object.freeze(data.value); + } + return data; + }; + return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result); + } + unwrap() { + return this._def.innerType; + } +}; +ZodReadonly.create = (type, params) => { + return new ZodReadonly({ + innerType: type, + typeName: ZodFirstPartyTypeKind.ZodReadonly, + ...processCreateParams(params) + }); +}; +var late = { + object: ZodObject.lazycreate +}; +var ZodFirstPartyTypeKind; +(function(ZodFirstPartyTypeKind3) { + ZodFirstPartyTypeKind3["ZodString"] = "ZodString"; + ZodFirstPartyTypeKind3["ZodNumber"] = "ZodNumber"; + ZodFirstPartyTypeKind3["ZodNaN"] = "ZodNaN"; + ZodFirstPartyTypeKind3["ZodBigInt"] = "ZodBigInt"; + ZodFirstPartyTypeKind3["ZodBoolean"] = "ZodBoolean"; + ZodFirstPartyTypeKind3["ZodDate"] = "ZodDate"; + ZodFirstPartyTypeKind3["ZodSymbol"] = "ZodSymbol"; + ZodFirstPartyTypeKind3["ZodUndefined"] = "ZodUndefined"; + ZodFirstPartyTypeKind3["ZodNull"] = "ZodNull"; + ZodFirstPartyTypeKind3["ZodAny"] = "ZodAny"; + ZodFirstPartyTypeKind3["ZodUnknown"] = "ZodUnknown"; + ZodFirstPartyTypeKind3["ZodNever"] = "ZodNever"; + ZodFirstPartyTypeKind3["ZodVoid"] = "ZodVoid"; + ZodFirstPartyTypeKind3["ZodArray"] = "ZodArray"; + ZodFirstPartyTypeKind3["ZodObject"] = "ZodObject"; + ZodFirstPartyTypeKind3["ZodUnion"] = "ZodUnion"; + ZodFirstPartyTypeKind3["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion"; + ZodFirstPartyTypeKind3["ZodIntersection"] = "ZodIntersection"; + ZodFirstPartyTypeKind3["ZodTuple"] = "ZodTuple"; + ZodFirstPartyTypeKind3["ZodRecord"] = "ZodRecord"; + ZodFirstPartyTypeKind3["ZodMap"] = "ZodMap"; + ZodFirstPartyTypeKind3["ZodSet"] = "ZodSet"; + ZodFirstPartyTypeKind3["ZodFunction"] = "ZodFunction"; + ZodFirstPartyTypeKind3["ZodLazy"] = "ZodLazy"; + ZodFirstPartyTypeKind3["ZodLiteral"] = "ZodLiteral"; + ZodFirstPartyTypeKind3["ZodEnum"] = "ZodEnum"; + ZodFirstPartyTypeKind3["ZodEffects"] = "ZodEffects"; + ZodFirstPartyTypeKind3["ZodNativeEnum"] = "ZodNativeEnum"; + ZodFirstPartyTypeKind3["ZodOptional"] = "ZodOptional"; + ZodFirstPartyTypeKind3["ZodNullable"] = "ZodNullable"; + ZodFirstPartyTypeKind3["ZodDefault"] = "ZodDefault"; + ZodFirstPartyTypeKind3["ZodCatch"] = "ZodCatch"; + ZodFirstPartyTypeKind3["ZodPromise"] = "ZodPromise"; + ZodFirstPartyTypeKind3["ZodBranded"] = "ZodBranded"; + ZodFirstPartyTypeKind3["ZodPipeline"] = "ZodPipeline"; + ZodFirstPartyTypeKind3["ZodReadonly"] = "ZodReadonly"; +})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {})); +var stringType = ZodString.create; +var numberType = ZodNumber.create; +var nanType = ZodNaN.create; +var bigIntType = ZodBigInt.create; +var booleanType = ZodBoolean.create; +var dateType = ZodDate.create; +var symbolType = ZodSymbol.create; +var undefinedType = ZodUndefined.create; +var nullType = ZodNull.create; +var anyType = ZodAny.create; +var unknownType = ZodUnknown.create; +var neverType = ZodNever.create; +var voidType = ZodVoid.create; +var arrayType = ZodArray.create; +var objectType = ZodObject.create; +var strictObjectType = ZodObject.strictCreate; +var unionType = ZodUnion.create; +var discriminatedUnionType = ZodDiscriminatedUnion.create; +var intersectionType = ZodIntersection.create; +var tupleType = ZodTuple.create; +var recordType = ZodRecord.create; +var mapType = ZodMap.create; +var setType = ZodSet.create; +var functionType = ZodFunction.create; +var lazyType = ZodLazy.create; +var literalType = ZodLiteral.create; +var enumType = ZodEnum.create; +var nativeEnumType = ZodNativeEnum.create; +var promiseType = ZodPromise.create; +var effectsType = ZodEffects.create; +var optionalType = ZodOptional.create; +var nullableType = ZodNullable.create; +var preprocessType = ZodEffects.createWithPreprocess; +var pipelineType = ZodPipeline.create; + +// node_modules/zod/v4/core/index.js +var core_exports2 = {}; +__export(core_exports2, { + $ZodAny: () => $ZodAny, + $ZodArray: () => $ZodArray, + $ZodAsyncError: () => $ZodAsyncError, + $ZodBase64: () => $ZodBase64, + $ZodBase64URL: () => $ZodBase64URL, + $ZodBigInt: () => $ZodBigInt, + $ZodBigIntFormat: () => $ZodBigIntFormat, + $ZodBoolean: () => $ZodBoolean, + $ZodCIDRv4: () => $ZodCIDRv4, + $ZodCIDRv6: () => $ZodCIDRv6, + $ZodCUID: () => $ZodCUID, + $ZodCUID2: () => $ZodCUID2, + $ZodCatch: () => $ZodCatch, + $ZodCheck: () => $ZodCheck, + $ZodCheckBigIntFormat: () => $ZodCheckBigIntFormat, + $ZodCheckEndsWith: () => $ZodCheckEndsWith, + $ZodCheckGreaterThan: () => $ZodCheckGreaterThan, + $ZodCheckIncludes: () => $ZodCheckIncludes, + $ZodCheckLengthEquals: () => $ZodCheckLengthEquals, + $ZodCheckLessThan: () => $ZodCheckLessThan, + $ZodCheckLowerCase: () => $ZodCheckLowerCase, + $ZodCheckMaxLength: () => $ZodCheckMaxLength, + $ZodCheckMaxSize: () => $ZodCheckMaxSize, + $ZodCheckMimeType: () => $ZodCheckMimeType, + $ZodCheckMinLength: () => $ZodCheckMinLength, + $ZodCheckMinSize: () => $ZodCheckMinSize, + $ZodCheckMultipleOf: () => $ZodCheckMultipleOf, + $ZodCheckNumberFormat: () => $ZodCheckNumberFormat, + $ZodCheckOverwrite: () => $ZodCheckOverwrite, + $ZodCheckProperty: () => $ZodCheckProperty, + $ZodCheckRegex: () => $ZodCheckRegex, + $ZodCheckSizeEquals: () => $ZodCheckSizeEquals, + $ZodCheckStartsWith: () => $ZodCheckStartsWith, + $ZodCheckStringFormat: () => $ZodCheckStringFormat, + $ZodCheckUpperCase: () => $ZodCheckUpperCase, + $ZodCodec: () => $ZodCodec, + $ZodCustom: () => $ZodCustom, + $ZodCustomStringFormat: () => $ZodCustomStringFormat, + $ZodDate: () => $ZodDate, + $ZodDefault: () => $ZodDefault, + $ZodDiscriminatedUnion: () => $ZodDiscriminatedUnion, + $ZodE164: () => $ZodE164, + $ZodEmail: () => $ZodEmail, + $ZodEmoji: () => $ZodEmoji, + $ZodEncodeError: () => $ZodEncodeError, + $ZodEnum: () => $ZodEnum, + $ZodError: () => $ZodError, + $ZodExactOptional: () => $ZodExactOptional, + $ZodFile: () => $ZodFile, + $ZodFunction: () => $ZodFunction, + $ZodGUID: () => $ZodGUID, + $ZodIPv4: () => $ZodIPv4, + $ZodIPv6: () => $ZodIPv6, + $ZodISODate: () => $ZodISODate, + $ZodISODateTime: () => $ZodISODateTime, + $ZodISODuration: () => $ZodISODuration, + $ZodISOTime: () => $ZodISOTime, + $ZodIntersection: () => $ZodIntersection, + $ZodJWT: () => $ZodJWT, + $ZodKSUID: () => $ZodKSUID, + $ZodLazy: () => $ZodLazy, + $ZodLiteral: () => $ZodLiteral, + $ZodMAC: () => $ZodMAC, + $ZodMap: () => $ZodMap, + $ZodNaN: () => $ZodNaN, + $ZodNanoID: () => $ZodNanoID, + $ZodNever: () => $ZodNever, + $ZodNonOptional: () => $ZodNonOptional, + $ZodNull: () => $ZodNull, + $ZodNullable: () => $ZodNullable, + $ZodNumber: () => $ZodNumber, + $ZodNumberFormat: () => $ZodNumberFormat, + $ZodObject: () => $ZodObject, + $ZodObjectJIT: () => $ZodObjectJIT, + $ZodOptional: () => $ZodOptional, + $ZodPipe: () => $ZodPipe, + $ZodPrefault: () => $ZodPrefault, + $ZodPromise: () => $ZodPromise, + $ZodReadonly: () => $ZodReadonly, + $ZodRealError: () => $ZodRealError, + $ZodRecord: () => $ZodRecord, + $ZodRegistry: () => $ZodRegistry, + $ZodSet: () => $ZodSet, + $ZodString: () => $ZodString, + $ZodStringFormat: () => $ZodStringFormat, + $ZodSuccess: () => $ZodSuccess, + $ZodSymbol: () => $ZodSymbol, + $ZodTemplateLiteral: () => $ZodTemplateLiteral, + $ZodTransform: () => $ZodTransform, + $ZodTuple: () => $ZodTuple, + $ZodType: () => $ZodType, + $ZodULID: () => $ZodULID, + $ZodURL: () => $ZodURL, + $ZodUUID: () => $ZodUUID, + $ZodUndefined: () => $ZodUndefined, + $ZodUnion: () => $ZodUnion, + $ZodUnknown: () => $ZodUnknown, + $ZodVoid: () => $ZodVoid, + $ZodXID: () => $ZodXID, + $ZodXor: () => $ZodXor, + $brand: () => $brand, + $constructor: () => $constructor, + $input: () => $input, + $output: () => $output, + Doc: () => Doc, + JSONSchema: () => json_schema_exports, + JSONSchemaGenerator: () => JSONSchemaGenerator, + NEVER: () => NEVER, + TimePrecision: () => TimePrecision, + _any: () => _any, + _array: () => _array, + _base64: () => _base64, + _base64url: () => _base64url, + _bigint: () => _bigint, + _boolean: () => _boolean, + _catch: () => _catch, + _check: () => _check, + _cidrv4: () => _cidrv4, + _cidrv6: () => _cidrv6, + _coercedBigint: () => _coercedBigint, + _coercedBoolean: () => _coercedBoolean, + _coercedDate: () => _coercedDate, + _coercedNumber: () => _coercedNumber, + _coercedString: () => _coercedString, + _cuid: () => _cuid, + _cuid2: () => _cuid2, + _custom: () => _custom, + _date: () => _date, + _decode: () => _decode, + _decodeAsync: () => _decodeAsync, + _default: () => _default, + _discriminatedUnion: () => _discriminatedUnion, + _e164: () => _e164, + _email: () => _email, + _emoji: () => _emoji2, + _encode: () => _encode, + _encodeAsync: () => _encodeAsync, + _endsWith: () => _endsWith, + _enum: () => _enum, + _file: () => _file, + _float32: () => _float32, + _float64: () => _float64, + _gt: () => _gt, + _gte: () => _gte, + _guid: () => _guid, + _includes: () => _includes, + _int: () => _int, + _int32: () => _int32, + _int64: () => _int64, + _intersection: () => _intersection, + _ipv4: () => _ipv4, + _ipv6: () => _ipv6, + _isoDate: () => _isoDate, + _isoDateTime: () => _isoDateTime, + _isoDuration: () => _isoDuration, + _isoTime: () => _isoTime, + _jwt: () => _jwt, + _ksuid: () => _ksuid, + _lazy: () => _lazy, + _length: () => _length, + _literal: () => _literal, + _lowercase: () => _lowercase, + _lt: () => _lt, + _lte: () => _lte, + _mac: () => _mac, + _map: () => _map, + _max: () => _lte, + _maxLength: () => _maxLength, + _maxSize: () => _maxSize, + _mime: () => _mime, + _min: () => _gte, + _minLength: () => _minLength, + _minSize: () => _minSize, + _multipleOf: () => _multipleOf, + _nan: () => _nan, + _nanoid: () => _nanoid, + _nativeEnum: () => _nativeEnum, + _negative: () => _negative, + _never: () => _never, + _nonnegative: () => _nonnegative, + _nonoptional: () => _nonoptional, + _nonpositive: () => _nonpositive, + _normalize: () => _normalize, + _null: () => _null2, + _nullable: () => _nullable, + _number: () => _number, + _optional: () => _optional, + _overwrite: () => _overwrite, + _parse: () => _parse, + _parseAsync: () => _parseAsync, + _pipe: () => _pipe, + _positive: () => _positive, + _promise: () => _promise, + _property: () => _property, + _readonly: () => _readonly, + _record: () => _record, + _refine: () => _refine, + _regex: () => _regex, + _safeDecode: () => _safeDecode, + _safeDecodeAsync: () => _safeDecodeAsync, + _safeEncode: () => _safeEncode, + _safeEncodeAsync: () => _safeEncodeAsync, + _safeParse: () => _safeParse, + _safeParseAsync: () => _safeParseAsync, + _set: () => _set, + _size: () => _size, + _slugify: () => _slugify, + _startsWith: () => _startsWith, + _string: () => _string, + _stringFormat: () => _stringFormat, + _stringbool: () => _stringbool, + _success: () => _success, + _superRefine: () => _superRefine, + _symbol: () => _symbol, + _templateLiteral: () => _templateLiteral, + _toLowerCase: () => _toLowerCase, + _toUpperCase: () => _toUpperCase, + _transform: () => _transform, + _trim: () => _trim, + _tuple: () => _tuple, + _uint32: () => _uint32, + _uint64: () => _uint64, + _ulid: () => _ulid, + _undefined: () => _undefined2, + _union: () => _union, + _unknown: () => _unknown, + _uppercase: () => _uppercase, + _url: () => _url, + _uuid: () => _uuid, + _uuidv4: () => _uuidv4, + _uuidv6: () => _uuidv6, + _uuidv7: () => _uuidv7, + _void: () => _void, + _xid: () => _xid, + _xor: () => _xor, + clone: () => clone, + config: () => config, + createStandardJSONSchemaMethod: () => createStandardJSONSchemaMethod, + createToJSONSchemaMethod: () => createToJSONSchemaMethod, + decode: () => decode, + decodeAsync: () => decodeAsync, + describe: () => describe, + encode: () => encode, + encodeAsync: () => encodeAsync, + extractDefs: () => extractDefs, + finalize: () => finalize, + flattenError: () => flattenError, + formatError: () => formatError, + globalConfig: () => globalConfig, + globalRegistry: () => globalRegistry, + initializeContext: () => initializeContext, + isValidBase64: () => isValidBase64, + isValidBase64URL: () => isValidBase64URL, + isValidJWT: () => isValidJWT2, + locales: () => locales_exports, + meta: () => meta, + parse: () => parse, + parseAsync: () => parseAsync, + prettifyError: () => prettifyError, + process: () => process, + regexes: () => regexes_exports, + registry: () => registry, + safeDecode: () => safeDecode, + safeDecodeAsync: () => safeDecodeAsync, + safeEncode: () => safeEncode, + safeEncodeAsync: () => safeEncodeAsync, + safeParse: () => safeParse, + safeParseAsync: () => safeParseAsync, + toDotPath: () => toDotPath, + toJSONSchema: () => toJSONSchema, + treeifyError: () => treeifyError, + util: () => util_exports, + version: () => version +}); + +// node_modules/zod/v4/core/core.js +var NEVER = Object.freeze({ + status: "aborted" +}); +// @__NO_SIDE_EFFECTS__ +function $constructor(name, initializer3, params) { + function init(inst, def) { + if (!inst._zod) { + Object.defineProperty(inst, "_zod", { + value: { + def, + constr: _, + traits: /* @__PURE__ */ new Set() + }, + enumerable: false + }); + } + if (inst._zod.traits.has(name)) { + return; + } + inst._zod.traits.add(name); + initializer3(inst, def); + const proto = _.prototype; + const keys = Object.keys(proto); + for (let i = 0; i < keys.length; i++) { + const k = keys[i]; + if (!(k in inst)) { + inst[k] = proto[k].bind(inst); + } + } + } + const Parent = params?.Parent ?? Object; + class Definition extends Parent { + } + Object.defineProperty(Definition, "name", { value: name }); + function _(def) { + var _a2; + const inst = params?.Parent ? new Definition() : this; + init(inst, def); + (_a2 = inst._zod).deferred ?? (_a2.deferred = []); + for (const fn of inst._zod.deferred) { + fn(); + } + return inst; + } + Object.defineProperty(_, "init", { value: init }); + Object.defineProperty(_, Symbol.hasInstance, { + value: (inst) => { + if (params?.Parent && inst instanceof params.Parent) + return true; + return inst?._zod?.traits?.has(name); + } + }); + Object.defineProperty(_, "name", { value: name }); + return _; +} +var $brand = /* @__PURE__ */ Symbol("zod_brand"); +var $ZodAsyncError = class extends Error { + constructor() { + super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`); + } +}; +var $ZodEncodeError = class extends Error { + constructor(name) { + super(`Encountered unidirectional transform during encode: ${name}`); + this.name = "ZodEncodeError"; + } +}; +var globalConfig = {}; +function config(newConfig) { + if (newConfig) + Object.assign(globalConfig, newConfig); + return globalConfig; +} + +// node_modules/zod/v4/core/util.js +var util_exports = {}; +__export(util_exports, { + BIGINT_FORMAT_RANGES: () => BIGINT_FORMAT_RANGES, + Class: () => Class, + NUMBER_FORMAT_RANGES: () => NUMBER_FORMAT_RANGES, + aborted: () => aborted, + allowsEval: () => allowsEval, + assert: () => assert, + assertEqual: () => assertEqual, + assertIs: () => assertIs, + assertNever: () => assertNever, + assertNotEqual: () => assertNotEqual, + assignProp: () => assignProp, + base64ToUint8Array: () => base64ToUint8Array, + base64urlToUint8Array: () => base64urlToUint8Array, + cached: () => cached, + captureStackTrace: () => captureStackTrace, + cleanEnum: () => cleanEnum, + cleanRegex: () => cleanRegex, + clone: () => clone, + cloneDef: () => cloneDef, + createTransparentProxy: () => createTransparentProxy, + defineLazy: () => defineLazy, + esc: () => esc, + escapeRegex: () => escapeRegex, + extend: () => extend, + finalizeIssue: () => finalizeIssue, + floatSafeRemainder: () => floatSafeRemainder2, + getElementAtPath: () => getElementAtPath, + getEnumValues: () => getEnumValues, + getLengthableOrigin: () => getLengthableOrigin, + getParsedType: () => getParsedType2, + getSizableOrigin: () => getSizableOrigin, + hexToUint8Array: () => hexToUint8Array, + isObject: () => isObject, + isPlainObject: () => isPlainObject, + issue: () => issue, + joinValues: () => joinValues, + jsonStringifyReplacer: () => jsonStringifyReplacer, + merge: () => merge, + mergeDefs: () => mergeDefs, + normalizeParams: () => normalizeParams, + nullish: () => nullish, + numKeys: () => numKeys, + objectClone: () => objectClone, + omit: () => omit, + optionalKeys: () => optionalKeys, + parsedType: () => parsedType, + partial: () => partial, + pick: () => pick, + prefixIssues: () => prefixIssues, + primitiveTypes: () => primitiveTypes, + promiseAllObject: () => promiseAllObject, + propertyKeyTypes: () => propertyKeyTypes, + randomString: () => randomString, + required: () => required, + safeExtend: () => safeExtend, + shallowClone: () => shallowClone, + slugify: () => slugify, + stringifyPrimitive: () => stringifyPrimitive, + uint8ArrayToBase64: () => uint8ArrayToBase64, + uint8ArrayToBase64url: () => uint8ArrayToBase64url, + uint8ArrayToHex: () => uint8ArrayToHex, + unwrapMessage: () => unwrapMessage +}); +function assertEqual(val) { + return val; +} +function assertNotEqual(val) { + return val; +} +function assertIs(_arg) { +} +function assertNever(_x) { + throw new Error("Unexpected value in exhaustive check"); +} +function assert(_) { +} +function getEnumValues(entries) { + const numericValues = Object.values(entries).filter((v) => typeof v === "number"); + const values = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v); + return values; +} +function joinValues(array2, separator = "|") { + return array2.map((val) => stringifyPrimitive(val)).join(separator); +} +function jsonStringifyReplacer(_, value) { + if (typeof value === "bigint") + return value.toString(); + return value; +} +function cached(getter) { + const set2 = false; + return { + get value() { + if (!set2) { + const value = getter(); + Object.defineProperty(this, "value", { value }); + return value; + } + throw new Error("cached value already set"); + } + }; +} +function nullish(input) { + return input === null || input === void 0; +} +function cleanRegex(source) { + const start = source.startsWith("^") ? 1 : 0; + const end = source.endsWith("$") ? source.length - 1 : source.length; + return source.slice(start, end); +} +function floatSafeRemainder2(val, step) { + const valDecCount = (val.toString().split(".")[1] || "").length; + const stepString = step.toString(); + let stepDecCount = (stepString.split(".")[1] || "").length; + if (stepDecCount === 0 && /\d?e-\d?/.test(stepString)) { + const match = stepString.match(/\d?e-(\d?)/); + if (match?.[1]) { + stepDecCount = Number.parseInt(match[1]); + } + } + const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount; + const valInt = Number.parseInt(val.toFixed(decCount).replace(".", "")); + const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", "")); + return valInt % stepInt / 10 ** decCount; +} +var EVALUATING = /* @__PURE__ */ Symbol("evaluating"); +function defineLazy(object3, key, getter) { + let value = void 0; + Object.defineProperty(object3, key, { + get() { + if (value === EVALUATING) { + return void 0; + } + if (value === void 0) { + value = EVALUATING; + value = getter(); + } + return value; + }, + set(v) { + Object.defineProperty(object3, key, { + value: v + // configurable: true, + }); + }, + configurable: true + }); +} +function objectClone(obj) { + return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj)); +} +function assignProp(target, prop, value) { + Object.defineProperty(target, prop, { + value, + writable: true, + enumerable: true, + configurable: true + }); +} +function mergeDefs(...defs) { + const mergedDescriptors = {}; + for (const def of defs) { + const descriptors = Object.getOwnPropertyDescriptors(def); + Object.assign(mergedDescriptors, descriptors); + } + return Object.defineProperties({}, mergedDescriptors); +} +function cloneDef(schema) { + return mergeDefs(schema._zod.def); +} +function getElementAtPath(obj, path) { + if (!path) + return obj; + return path.reduce((acc, key) => acc?.[key], obj); +} +function promiseAllObject(promisesObj) { + const keys = Object.keys(promisesObj); + const promises = keys.map((key) => promisesObj[key]); + return Promise.all(promises).then((results) => { + const resolvedObj = {}; + for (let i = 0; i < keys.length; i++) { + resolvedObj[keys[i]] = results[i]; + } + return resolvedObj; + }); +} +function randomString(length = 10) { + const chars = "abcdefghijklmnopqrstuvwxyz"; + let str = ""; + for (let i = 0; i < length; i++) { + str += chars[Math.floor(Math.random() * chars.length)]; + } + return str; +} +function esc(str) { + return JSON.stringify(str); +} +function slugify(input) { + return input.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, ""); +} +var captureStackTrace = "captureStackTrace" in Error ? Error.captureStackTrace : (..._args) => { +}; +function isObject(data) { + return typeof data === "object" && data !== null && !Array.isArray(data); +} +var allowsEval = cached(() => { + if (typeof navigator !== "undefined" && navigator?.userAgent?.includes("Cloudflare")) { + return false; + } + try { + const F = Function; + new F(""); + return true; + } catch (_) { + return false; + } +}); +function isPlainObject(o) { + if (isObject(o) === false) + return false; + const ctor = o.constructor; + if (ctor === void 0) + return true; + if (typeof ctor !== "function") + return true; + const prot = ctor.prototype; + if (isObject(prot) === false) + return false; + if (Object.prototype.hasOwnProperty.call(prot, "isPrototypeOf") === false) { + return false; + } + return true; +} +function shallowClone(o) { + if (isPlainObject(o)) + return { ...o }; + if (Array.isArray(o)) + return [...o]; + return o; +} +function numKeys(data) { + let keyCount = 0; + for (const key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + keyCount++; + } + } + return keyCount; +} +var getParsedType2 = (data) => { + const t = typeof data; + switch (t) { + case "undefined": + return "undefined"; + case "string": + return "string"; + case "number": + return Number.isNaN(data) ? "nan" : "number"; + case "boolean": + return "boolean"; + case "function": + return "function"; + case "bigint": + return "bigint"; + case "symbol": + return "symbol"; + case "object": + if (Array.isArray(data)) { + return "array"; + } + if (data === null) { + return "null"; + } + if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") { + return "promise"; + } + if (typeof Map !== "undefined" && data instanceof Map) { + return "map"; + } + if (typeof Set !== "undefined" && data instanceof Set) { + return "set"; + } + if (typeof Date !== "undefined" && data instanceof Date) { + return "date"; + } + if (typeof File !== "undefined" && data instanceof File) { + return "file"; + } + return "object"; + default: + throw new Error(`Unknown data type: ${t}`); + } +}; +var propertyKeyTypes = /* @__PURE__ */ new Set(["string", "number", "symbol"]); +var primitiveTypes = /* @__PURE__ */ new Set(["string", "number", "bigint", "boolean", "symbol", "undefined"]); +function escapeRegex(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} +function clone(inst, def, params) { + const cl = new inst._zod.constr(def ?? inst._zod.def); + if (!def || params?.parent) + cl._zod.parent = inst; + return cl; +} +function normalizeParams(_params) { + const params = _params; + if (!params) + return {}; + if (typeof params === "string") + return { error: () => params }; + if (params?.message !== void 0) { + if (params?.error !== void 0) + throw new Error("Cannot specify both `message` and `error` params"); + params.error = params.message; + } + delete params.message; + if (typeof params.error === "string") + return { ...params, error: () => params.error }; + return params; +} +function createTransparentProxy(getter) { + let target; + return new Proxy({}, { + get(_, prop, receiver) { + target ?? (target = getter()); + return Reflect.get(target, prop, receiver); + }, + set(_, prop, value, receiver) { + target ?? (target = getter()); + return Reflect.set(target, prop, value, receiver); + }, + has(_, prop) { + target ?? (target = getter()); + return Reflect.has(target, prop); + }, + deleteProperty(_, prop) { + target ?? (target = getter()); + return Reflect.deleteProperty(target, prop); + }, + ownKeys(_) { + target ?? (target = getter()); + return Reflect.ownKeys(target); + }, + getOwnPropertyDescriptor(_, prop) { + target ?? (target = getter()); + return Reflect.getOwnPropertyDescriptor(target, prop); + }, + defineProperty(_, prop, descriptor) { + target ?? (target = getter()); + return Reflect.defineProperty(target, prop, descriptor); + } + }); +} +function stringifyPrimitive(value) { + if (typeof value === "bigint") + return value.toString() + "n"; + if (typeof value === "string") + return `"${value}"`; + return `${value}`; +} +function optionalKeys(shape) { + return Object.keys(shape).filter((k) => { + return shape[k]._zod.optin === "optional" && shape[k]._zod.optout === "optional"; + }); +} +var NUMBER_FORMAT_RANGES = { + safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER], + int32: [-2147483648, 2147483647], + uint32: [0, 4294967295], + float32: [-34028234663852886e22, 34028234663852886e22], + float64: [-Number.MAX_VALUE, Number.MAX_VALUE] +}; +var BIGINT_FORMAT_RANGES = { + int64: [/* @__PURE__ */ BigInt("-9223372036854775808"), /* @__PURE__ */ BigInt("9223372036854775807")], + uint64: [/* @__PURE__ */ BigInt(0), /* @__PURE__ */ BigInt("18446744073709551615")] +}; +function pick(schema, mask) { + const currDef = schema._zod.def; + const checks = currDef.checks; + const hasChecks = checks && checks.length > 0; + if (hasChecks) { + throw new Error(".pick() cannot be used on object schemas containing refinements"); + } + const def = mergeDefs(schema._zod.def, { + get shape() { + const newShape = {}; + for (const key in mask) { + if (!(key in currDef.shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + newShape[key] = currDef.shape[key]; + } + assignProp(this, "shape", newShape); + return newShape; + }, + checks: [] + }); + return clone(schema, def); +} +function omit(schema, mask) { + const currDef = schema._zod.def; + const checks = currDef.checks; + const hasChecks = checks && checks.length > 0; + if (hasChecks) { + throw new Error(".omit() cannot be used on object schemas containing refinements"); + } + const def = mergeDefs(schema._zod.def, { + get shape() { + const newShape = { ...schema._zod.def.shape }; + for (const key in mask) { + if (!(key in currDef.shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + delete newShape[key]; + } + assignProp(this, "shape", newShape); + return newShape; + }, + checks: [] + }); + return clone(schema, def); +} +function extend(schema, shape) { + if (!isPlainObject(shape)) { + throw new Error("Invalid input to extend: expected a plain object"); + } + const checks = schema._zod.def.checks; + const hasChecks = checks && checks.length > 0; + if (hasChecks) { + const existingShape = schema._zod.def.shape; + for (const key in shape) { + if (Object.getOwnPropertyDescriptor(existingShape, key) !== void 0) { + throw new Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead."); + } + } + } + const def = mergeDefs(schema._zod.def, { + get shape() { + const _shape = { ...schema._zod.def.shape, ...shape }; + assignProp(this, "shape", _shape); + return _shape; + } + }); + return clone(schema, def); +} +function safeExtend(schema, shape) { + if (!isPlainObject(shape)) { + throw new Error("Invalid input to safeExtend: expected a plain object"); + } + const def = mergeDefs(schema._zod.def, { + get shape() { + const _shape = { ...schema._zod.def.shape, ...shape }; + assignProp(this, "shape", _shape); + return _shape; + } + }); + return clone(schema, def); +} +function merge(a, b) { + const def = mergeDefs(a._zod.def, { + get shape() { + const _shape = { ...a._zod.def.shape, ...b._zod.def.shape }; + assignProp(this, "shape", _shape); + return _shape; + }, + get catchall() { + return b._zod.def.catchall; + }, + checks: [] + // delete existing checks + }); + return clone(a, def); +} +function partial(Class2, schema, mask) { + const currDef = schema._zod.def; + const checks = currDef.checks; + const hasChecks = checks && checks.length > 0; + if (hasChecks) { + throw new Error(".partial() cannot be used on object schemas containing refinements"); + } + const def = mergeDefs(schema._zod.def, { + get shape() { + const oldShape = schema._zod.def.shape; + const shape = { ...oldShape }; + if (mask) { + for (const key in mask) { + if (!(key in oldShape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + shape[key] = Class2 ? new Class2({ + type: "optional", + innerType: oldShape[key] + }) : oldShape[key]; + } + } else { + for (const key in oldShape) { + shape[key] = Class2 ? new Class2({ + type: "optional", + innerType: oldShape[key] + }) : oldShape[key]; + } + } + assignProp(this, "shape", shape); + return shape; + }, + checks: [] + }); + return clone(schema, def); +} +function required(Class2, schema, mask) { + const def = mergeDefs(schema._zod.def, { + get shape() { + const oldShape = schema._zod.def.shape; + const shape = { ...oldShape }; + if (mask) { + for (const key in mask) { + if (!(key in shape)) { + throw new Error(`Unrecognized key: "${key}"`); + } + if (!mask[key]) + continue; + shape[key] = new Class2({ + type: "nonoptional", + innerType: oldShape[key] + }); + } + } else { + for (const key in oldShape) { + shape[key] = new Class2({ + type: "nonoptional", + innerType: oldShape[key] + }); + } + } + assignProp(this, "shape", shape); + return shape; + } + }); + return clone(schema, def); +} +function aborted(x, startIndex = 0) { + if (x.aborted === true) + return true; + for (let i = startIndex; i < x.issues.length; i++) { + if (x.issues[i]?.continue !== true) { + return true; + } + } + return false; +} +function prefixIssues(path, issues) { + return issues.map((iss) => { + var _a2; + (_a2 = iss).path ?? (_a2.path = []); + iss.path.unshift(path); + return iss; + }); +} +function unwrapMessage(message) { + return typeof message === "string" ? message : message?.message; +} +function finalizeIssue(iss, ctx, config2) { + const full = { ...iss, path: iss.path ?? [] }; + if (!iss.message) { + const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config2.customError?.(iss)) ?? unwrapMessage(config2.localeError?.(iss)) ?? "Invalid input"; + full.message = message; + } + delete full.inst; + delete full.continue; + if (!ctx?.reportInput) { + delete full.input; + } + return full; +} +function getSizableOrigin(input) { + if (input instanceof Set) + return "set"; + if (input instanceof Map) + return "map"; + if (input instanceof File) + return "file"; + return "unknown"; +} +function getLengthableOrigin(input) { + if (Array.isArray(input)) + return "array"; + if (typeof input === "string") + return "string"; + return "unknown"; +} +function parsedType(data) { + const t = typeof data; + switch (t) { + case "number": { + return Number.isNaN(data) ? "nan" : "number"; + } + case "object": { + if (data === null) { + return "null"; + } + if (Array.isArray(data)) { + return "array"; + } + const obj = data; + if (obj && Object.getPrototypeOf(obj) !== Object.prototype && "constructor" in obj && obj.constructor) { + return obj.constructor.name; + } + } + } + return t; +} +function issue(...args) { + const [iss, input, inst] = args; + if (typeof iss === "string") { + return { + message: iss, + code: "custom", + input, + inst + }; + } + return { ...iss }; +} +function cleanEnum(obj) { + return Object.entries(obj).filter(([k, _]) => { + return Number.isNaN(Number.parseInt(k, 10)); + }).map((el) => el[1]); +} +function base64ToUint8Array(base643) { + const binaryString = atob(base643); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes; +} +function uint8ArrayToBase64(bytes) { + let binaryString = ""; + for (let i = 0; i < bytes.length; i++) { + binaryString += String.fromCharCode(bytes[i]); + } + return btoa(binaryString); +} +function base64urlToUint8Array(base64url3) { + const base643 = base64url3.replace(/-/g, "+").replace(/_/g, "/"); + const padding = "=".repeat((4 - base643.length % 4) % 4); + return base64ToUint8Array(base643 + padding); +} +function uint8ArrayToBase64url(bytes) { + return uint8ArrayToBase64(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, ""); +} +function hexToUint8Array(hex3) { + const cleanHex = hex3.replace(/^0x/, ""); + if (cleanHex.length % 2 !== 0) { + throw new Error("Invalid hex string length"); + } + const bytes = new Uint8Array(cleanHex.length / 2); + for (let i = 0; i < cleanHex.length; i += 2) { + bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16); + } + return bytes; +} +function uint8ArrayToHex(bytes) { + return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join(""); +} +var Class = class { + constructor(..._args) { + } +}; + +// node_modules/zod/v4/core/errors.js +var initializer = (inst, def) => { + inst.name = "$ZodError"; + Object.defineProperty(inst, "_zod", { + value: inst._zod, + enumerable: false + }); + Object.defineProperty(inst, "issues", { + value: def, + enumerable: false + }); + inst.message = JSON.stringify(def, jsonStringifyReplacer, 2); + Object.defineProperty(inst, "toString", { + value: () => inst.message, + enumerable: false + }); +}; +var $ZodError = $constructor("$ZodError", initializer); +var $ZodRealError = $constructor("$ZodError", initializer, { Parent: Error }); +function flattenError(error48, mapper = (issue2) => issue2.message) { + const fieldErrors = {}; + const formErrors = []; + for (const sub of error48.issues) { + if (sub.path.length > 0) { + fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || []; + fieldErrors[sub.path[0]].push(mapper(sub)); + } else { + formErrors.push(mapper(sub)); + } + } + return { formErrors, fieldErrors }; +} +function formatError(error48, mapper = (issue2) => issue2.message) { + const fieldErrors = { _errors: [] }; + const processError = (error49) => { + for (const issue2 of error49.issues) { + if (issue2.code === "invalid_union" && issue2.errors.length) { + issue2.errors.map((issues) => processError({ issues })); + } else if (issue2.code === "invalid_key") { + processError({ issues: issue2.issues }); + } else if (issue2.code === "invalid_element") { + processError({ issues: issue2.issues }); + } else if (issue2.path.length === 0) { + fieldErrors._errors.push(mapper(issue2)); + } else { + let curr = fieldErrors; + let i = 0; + while (i < issue2.path.length) { + const el = issue2.path[i]; + const terminal = i === issue2.path.length - 1; + if (!terminal) { + curr[el] = curr[el] || { _errors: [] }; + } else { + curr[el] = curr[el] || { _errors: [] }; + curr[el]._errors.push(mapper(issue2)); + } + curr = curr[el]; + i++; + } + } + } + }; + processError(error48); + return fieldErrors; +} +function treeifyError(error48, mapper = (issue2) => issue2.message) { + const result = { errors: [] }; + const processError = (error49, path = []) => { + var _a2, _b; + for (const issue2 of error49.issues) { + if (issue2.code === "invalid_union" && issue2.errors.length) { + issue2.errors.map((issues) => processError({ issues }, issue2.path)); + } else if (issue2.code === "invalid_key") { + processError({ issues: issue2.issues }, issue2.path); + } else if (issue2.code === "invalid_element") { + processError({ issues: issue2.issues }, issue2.path); + } else { + const fullpath = [...path, ...issue2.path]; + if (fullpath.length === 0) { + result.errors.push(mapper(issue2)); + continue; + } + let curr = result; + let i = 0; + while (i < fullpath.length) { + const el = fullpath[i]; + const terminal = i === fullpath.length - 1; + if (typeof el === "string") { + curr.properties ?? (curr.properties = {}); + (_a2 = curr.properties)[el] ?? (_a2[el] = { errors: [] }); + curr = curr.properties[el]; + } else { + curr.items ?? (curr.items = []); + (_b = curr.items)[el] ?? (_b[el] = { errors: [] }); + curr = curr.items[el]; + } + if (terminal) { + curr.errors.push(mapper(issue2)); + } + i++; + } + } + } + }; + processError(error48); + return result; +} +function toDotPath(_path) { + const segs = []; + const path = _path.map((seg) => typeof seg === "object" ? seg.key : seg); + for (const seg of path) { + if (typeof seg === "number") + segs.push(`[${seg}]`); + else if (typeof seg === "symbol") + segs.push(`[${JSON.stringify(String(seg))}]`); + else if (/[^\w$]/.test(seg)) + segs.push(`[${JSON.stringify(seg)}]`); + else { + if (segs.length) + segs.push("."); + segs.push(seg); + } + } + return segs.join(""); +} +function prettifyError(error48) { + const lines = []; + const issues = [...error48.issues].sort((a, b) => (a.path ?? []).length - (b.path ?? []).length); + for (const issue2 of issues) { + lines.push(`\u2716 ${issue2.message}`); + if (issue2.path?.length) + lines.push(` \u2192 at ${toDotPath(issue2.path)}`); + } + return lines.join("\n"); +} + +// node_modules/zod/v4/core/parse.js +var _parse = (_Err) => (schema, value, _ctx, _params) => { + const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false }; + const result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) { + throw new $ZodAsyncError(); + } + if (result.issues.length) { + const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); + captureStackTrace(e, _params?.callee); + throw e; + } + return result.value; +}; +var parse = /* @__PURE__ */ _parse($ZodRealError); +var _parseAsync = (_Err) => async (schema, value, _ctx, params) => { + const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; + let result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) + result = await result; + if (result.issues.length) { + const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); + captureStackTrace(e, params?.callee); + throw e; + } + return result.value; +}; +var parseAsync = /* @__PURE__ */ _parseAsync($ZodRealError); +var _safeParse = (_Err) => (schema, value, _ctx) => { + const ctx = _ctx ? { ..._ctx, async: false } : { async: false }; + const result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) { + throw new $ZodAsyncError(); + } + return result.issues.length ? { + success: false, + error: new (_Err ?? $ZodError)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + } : { success: true, data: result.value }; +}; +var safeParse = /* @__PURE__ */ _safeParse($ZodRealError); +var _safeParseAsync = (_Err) => async (schema, value, _ctx) => { + const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; + let result = schema._zod.run({ value, issues: [] }, ctx); + if (result instanceof Promise) + result = await result; + return result.issues.length ? { + success: false, + error: new _Err(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + } : { success: true, data: result.value }; +}; +var safeParseAsync = /* @__PURE__ */ _safeParseAsync($ZodRealError); +var _encode = (_Err) => (schema, value, _ctx) => { + const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; + return _parse(_Err)(schema, value, ctx); +}; +var encode = /* @__PURE__ */ _encode($ZodRealError); +var _decode = (_Err) => (schema, value, _ctx) => { + return _parse(_Err)(schema, value, _ctx); +}; +var decode = /* @__PURE__ */ _decode($ZodRealError); +var _encodeAsync = (_Err) => async (schema, value, _ctx) => { + const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; + return _parseAsync(_Err)(schema, value, ctx); +}; +var encodeAsync = /* @__PURE__ */ _encodeAsync($ZodRealError); +var _decodeAsync = (_Err) => async (schema, value, _ctx) => { + return _parseAsync(_Err)(schema, value, _ctx); +}; +var decodeAsync = /* @__PURE__ */ _decodeAsync($ZodRealError); +var _safeEncode = (_Err) => (schema, value, _ctx) => { + const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; + return _safeParse(_Err)(schema, value, ctx); +}; +var safeEncode = /* @__PURE__ */ _safeEncode($ZodRealError); +var _safeDecode = (_Err) => (schema, value, _ctx) => { + return _safeParse(_Err)(schema, value, _ctx); +}; +var safeDecode = /* @__PURE__ */ _safeDecode($ZodRealError); +var _safeEncodeAsync = (_Err) => async (schema, value, _ctx) => { + const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; + return _safeParseAsync(_Err)(schema, value, ctx); +}; +var safeEncodeAsync = /* @__PURE__ */ _safeEncodeAsync($ZodRealError); +var _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => { + return _safeParseAsync(_Err)(schema, value, _ctx); +}; +var safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync($ZodRealError); + +// node_modules/zod/v4/core/regexes.js +var regexes_exports = {}; +__export(regexes_exports, { + base64: () => base64, + base64url: () => base64url, + bigint: () => bigint, + boolean: () => boolean, + browserEmail: () => browserEmail, + cidrv4: () => cidrv4, + cidrv6: () => cidrv6, + cuid: () => cuid, + cuid2: () => cuid2, + date: () => date, + datetime: () => datetime, + domain: () => domain, + duration: () => duration, + e164: () => e164, + email: () => email, + emoji: () => emoji, + extendedDuration: () => extendedDuration, + guid: () => guid, + hex: () => hex, + hostname: () => hostname, + html5Email: () => html5Email, + idnEmail: () => idnEmail, + integer: () => integer, + ipv4: () => ipv4, + ipv6: () => ipv6, + ksuid: () => ksuid, + lowercase: () => lowercase, + mac: () => mac, + md5_base64: () => md5_base64, + md5_base64url: () => md5_base64url, + md5_hex: () => md5_hex, + nanoid: () => nanoid, + null: () => _null, + number: () => number, + rfc5322Email: () => rfc5322Email, + sha1_base64: () => sha1_base64, + sha1_base64url: () => sha1_base64url, + sha1_hex: () => sha1_hex, + sha256_base64: () => sha256_base64, + sha256_base64url: () => sha256_base64url, + sha256_hex: () => sha256_hex, + sha384_base64: () => sha384_base64, + sha384_base64url: () => sha384_base64url, + sha384_hex: () => sha384_hex, + sha512_base64: () => sha512_base64, + sha512_base64url: () => sha512_base64url, + sha512_hex: () => sha512_hex, + string: () => string, + time: () => time, + ulid: () => ulid, + undefined: () => _undefined, + unicodeEmail: () => unicodeEmail, + uppercase: () => uppercase, + uuid: () => uuid, + uuid4: () => uuid4, + uuid6: () => uuid6, + uuid7: () => uuid7, + xid: () => xid +}); +var cuid = /^[cC][^\s-]{8,}$/; +var cuid2 = /^[0-9a-z]+$/; +var ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/; +var xid = /^[0-9a-vA-V]{20}$/; +var ksuid = /^[A-Za-z0-9]{27}$/; +var nanoid = /^[a-zA-Z0-9_-]{21}$/; +var duration = /^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/; +var extendedDuration = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/; +var guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/; +var uuid = (version2) => { + if (!version2) + return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/; + return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version2}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`); +}; +var uuid4 = /* @__PURE__ */ uuid(4); +var uuid6 = /* @__PURE__ */ uuid(6); +var uuid7 = /* @__PURE__ */ uuid(7); +var email = /^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/; +var html5Email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; +var rfc5322Email = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; +var unicodeEmail = /^[^\s@"]{1,64}@[^\s@]{1,255}$/u; +var idnEmail = unicodeEmail; +var browserEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; +var _emoji = `^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`; +function emoji() { + return new RegExp(_emoji, "u"); +} +var ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/; +var ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/; +var mac = (delimiter) => { + const escapedDelim = escapeRegex(delimiter ?? ":"); + return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`); +}; +var cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/; +var cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/; +var base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/; +var base64url = /^[A-Za-z0-9_-]*$/; +var hostname = /^(?=.{1,253}\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\.?$/; +var domain = /^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/; +var e164 = /^\+[1-9]\d{6,14}$/; +var dateSource = `(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`; +var date = /* @__PURE__ */ new RegExp(`^${dateSource}$`); +function timeSource(args) { + const hhmm = `(?:[01]\\d|2[0-3]):[0-5]\\d`; + const regex = typeof args.precision === "number" ? args.precision === -1 ? `${hhmm}` : args.precision === 0 ? `${hhmm}:[0-5]\\d` : `${hhmm}:[0-5]\\d\\.\\d{${args.precision}}` : `${hhmm}(?::[0-5]\\d(?:\\.\\d+)?)?`; + return regex; +} +function time(args) { + return new RegExp(`^${timeSource(args)}$`); +} +function datetime(args) { + const time3 = timeSource({ precision: args.precision }); + const opts = ["Z"]; + if (args.local) + opts.push(""); + if (args.offset) + opts.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`); + const timeRegex2 = `${time3}(?:${opts.join("|")})`; + return new RegExp(`^${dateSource}T(?:${timeRegex2})$`); +} +var string = (params) => { + const regex = params ? `[\\s\\S]{${params?.minimum ?? 0},${params?.maximum ?? ""}}` : `[\\s\\S]*`; + return new RegExp(`^${regex}$`); +}; +var bigint = /^-?\d+n?$/; +var integer = /^-?\d+$/; +var number = /^-?\d+(?:\.\d+)?$/; +var boolean = /^(?:true|false)$/i; +var _null = /^null$/i; +var _undefined = /^undefined$/i; +var lowercase = /^[^A-Z]*$/; +var uppercase = /^[^a-z]*$/; +var hex = /^[0-9a-fA-F]*$/; +function fixedBase64(bodyLength, padding) { + return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`); +} +function fixedBase64url(length) { + return new RegExp(`^[A-Za-z0-9_-]{${length}}$`); +} +var md5_hex = /^[0-9a-fA-F]{32}$/; +var md5_base64 = /* @__PURE__ */ fixedBase64(22, "=="); +var md5_base64url = /* @__PURE__ */ fixedBase64url(22); +var sha1_hex = /^[0-9a-fA-F]{40}$/; +var sha1_base64 = /* @__PURE__ */ fixedBase64(27, "="); +var sha1_base64url = /* @__PURE__ */ fixedBase64url(27); +var sha256_hex = /^[0-9a-fA-F]{64}$/; +var sha256_base64 = /* @__PURE__ */ fixedBase64(43, "="); +var sha256_base64url = /* @__PURE__ */ fixedBase64url(43); +var sha384_hex = /^[0-9a-fA-F]{96}$/; +var sha384_base64 = /* @__PURE__ */ fixedBase64(64, ""); +var sha384_base64url = /* @__PURE__ */ fixedBase64url(64); +var sha512_hex = /^[0-9a-fA-F]{128}$/; +var sha512_base64 = /* @__PURE__ */ fixedBase64(86, "=="); +var sha512_base64url = /* @__PURE__ */ fixedBase64url(86); + +// node_modules/zod/v4/core/checks.js +var $ZodCheck = /* @__PURE__ */ $constructor("$ZodCheck", (inst, def) => { + var _a2; + inst._zod ?? (inst._zod = {}); + inst._zod.def = def; + (_a2 = inst._zod).onattach ?? (_a2.onattach = []); +}); +var numericOriginMap = { + number: "number", + bigint: "bigint", + object: "date" +}; +var $ZodCheckLessThan = /* @__PURE__ */ $constructor("$ZodCheckLessThan", (inst, def) => { + $ZodCheck.init(inst, def); + const origin = numericOriginMap[typeof def.value]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY; + if (def.value < curr) { + if (def.inclusive) + bag.maximum = def.value; + else + bag.exclusiveMaximum = def.value; + } + }); + inst._zod.check = (payload) => { + if (def.inclusive ? payload.value <= def.value : payload.value < def.value) { + return; + } + payload.issues.push({ + origin, + code: "too_big", + maximum: typeof def.value === "object" ? def.value.getTime() : def.value, + input: payload.value, + inclusive: def.inclusive, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckGreaterThan = /* @__PURE__ */ $constructor("$ZodCheckGreaterThan", (inst, def) => { + $ZodCheck.init(inst, def); + const origin = numericOriginMap[typeof def.value]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY; + if (def.value > curr) { + if (def.inclusive) + bag.minimum = def.value; + else + bag.exclusiveMinimum = def.value; + } + }); + inst._zod.check = (payload) => { + if (def.inclusive ? payload.value >= def.value : payload.value > def.value) { + return; + } + payload.issues.push({ + origin, + code: "too_small", + minimum: typeof def.value === "object" ? def.value.getTime() : def.value, + input: payload.value, + inclusive: def.inclusive, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckMultipleOf = /* @__PURE__ */ $constructor("$ZodCheckMultipleOf", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.onattach.push((inst2) => { + var _a2; + (_a2 = inst2._zod.bag).multipleOf ?? (_a2.multipleOf = def.value); + }); + inst._zod.check = (payload) => { + if (typeof payload.value !== typeof def.value) + throw new Error("Cannot mix number and bigint in multiple_of check."); + const isMultiple = typeof payload.value === "bigint" ? payload.value % def.value === BigInt(0) : floatSafeRemainder2(payload.value, def.value) === 0; + if (isMultiple) + return; + payload.issues.push({ + origin: typeof payload.value, + code: "not_multiple_of", + divisor: def.value, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckNumberFormat = /* @__PURE__ */ $constructor("$ZodCheckNumberFormat", (inst, def) => { + $ZodCheck.init(inst, def); + def.format = def.format || "float64"; + const isInt = def.format?.includes("int"); + const origin = isInt ? "int" : "number"; + const [minimum, maximum] = NUMBER_FORMAT_RANGES[def.format]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + bag.minimum = minimum; + bag.maximum = maximum; + if (isInt) + bag.pattern = integer; + }); + inst._zod.check = (payload) => { + const input = payload.value; + if (isInt) { + if (!Number.isInteger(input)) { + payload.issues.push({ + expected: origin, + format: def.format, + code: "invalid_type", + continue: false, + input, + inst + }); + return; + } + if (!Number.isSafeInteger(input)) { + if (input > 0) { + payload.issues.push({ + input, + code: "too_big", + maximum: Number.MAX_SAFE_INTEGER, + note: "Integers must be within the safe integer range.", + inst, + origin, + inclusive: true, + continue: !def.abort + }); + } else { + payload.issues.push({ + input, + code: "too_small", + minimum: Number.MIN_SAFE_INTEGER, + note: "Integers must be within the safe integer range.", + inst, + origin, + inclusive: true, + continue: !def.abort + }); + } + return; + } + } + if (input < minimum) { + payload.issues.push({ + origin: "number", + input, + code: "too_small", + minimum, + inclusive: true, + inst, + continue: !def.abort + }); + } + if (input > maximum) { + payload.issues.push({ + origin: "number", + input, + code: "too_big", + maximum, + inclusive: true, + inst, + continue: !def.abort + }); + } + }; +}); +var $ZodCheckBigIntFormat = /* @__PURE__ */ $constructor("$ZodCheckBigIntFormat", (inst, def) => { + $ZodCheck.init(inst, def); + const [minimum, maximum] = BIGINT_FORMAT_RANGES[def.format]; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + bag.minimum = minimum; + bag.maximum = maximum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + if (input < minimum) { + payload.issues.push({ + origin: "bigint", + input, + code: "too_small", + minimum, + inclusive: true, + inst, + continue: !def.abort + }); + } + if (input > maximum) { + payload.issues.push({ + origin: "bigint", + input, + code: "too_big", + maximum, + inclusive: true, + inst, + continue: !def.abort + }); + } + }; +}); +var $ZodCheckMaxSize = /* @__PURE__ */ $constructor("$ZodCheckMaxSize", (inst, def) => { + var _a2; + $ZodCheck.init(inst, def); + (_a2 = inst._zod.def).when ?? (_a2.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.size !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.maximum ?? Number.POSITIVE_INFINITY; + if (def.maximum < curr) + inst2._zod.bag.maximum = def.maximum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const size = input.size; + if (size <= def.maximum) + return; + payload.issues.push({ + origin: getSizableOrigin(input), + code: "too_big", + maximum: def.maximum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckMinSize = /* @__PURE__ */ $constructor("$ZodCheckMinSize", (inst, def) => { + var _a2; + $ZodCheck.init(inst, def); + (_a2 = inst._zod.def).when ?? (_a2.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.size !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.minimum ?? Number.NEGATIVE_INFINITY; + if (def.minimum > curr) + inst2._zod.bag.minimum = def.minimum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const size = input.size; + if (size >= def.minimum) + return; + payload.issues.push({ + origin: getSizableOrigin(input), + code: "too_small", + minimum: def.minimum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckSizeEquals = /* @__PURE__ */ $constructor("$ZodCheckSizeEquals", (inst, def) => { + var _a2; + $ZodCheck.init(inst, def); + (_a2 = inst._zod.def).when ?? (_a2.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.size !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.minimum = def.size; + bag.maximum = def.size; + bag.size = def.size; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const size = input.size; + if (size === def.size) + return; + const tooBig = size > def.size; + payload.issues.push({ + origin: getSizableOrigin(input), + ...tooBig ? { code: "too_big", maximum: def.size } : { code: "too_small", minimum: def.size }, + inclusive: true, + exact: true, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckMaxLength = /* @__PURE__ */ $constructor("$ZodCheckMaxLength", (inst, def) => { + var _a2; + $ZodCheck.init(inst, def); + (_a2 = inst._zod.def).when ?? (_a2.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.maximum ?? Number.POSITIVE_INFINITY; + if (def.maximum < curr) + inst2._zod.bag.maximum = def.maximum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length <= def.maximum) + return; + const origin = getLengthableOrigin(input); + payload.issues.push({ + origin, + code: "too_big", + maximum: def.maximum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckMinLength = /* @__PURE__ */ $constructor("$ZodCheckMinLength", (inst, def) => { + var _a2; + $ZodCheck.init(inst, def); + (_a2 = inst._zod.def).when ?? (_a2.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const curr = inst2._zod.bag.minimum ?? Number.NEGATIVE_INFINITY; + if (def.minimum > curr) + inst2._zod.bag.minimum = def.minimum; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length >= def.minimum) + return; + const origin = getLengthableOrigin(input); + payload.issues.push({ + origin, + code: "too_small", + minimum: def.minimum, + inclusive: true, + input, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckLengthEquals = /* @__PURE__ */ $constructor("$ZodCheckLengthEquals", (inst, def) => { + var _a2; + $ZodCheck.init(inst, def); + (_a2 = inst._zod.def).when ?? (_a2.when = (payload) => { + const val = payload.value; + return !nullish(val) && val.length !== void 0; + }); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.minimum = def.length; + bag.maximum = def.length; + bag.length = def.length; + }); + inst._zod.check = (payload) => { + const input = payload.value; + const length = input.length; + if (length === def.length) + return; + const origin = getLengthableOrigin(input); + const tooBig = length > def.length; + payload.issues.push({ + origin, + ...tooBig ? { code: "too_big", maximum: def.length } : { code: "too_small", minimum: def.length }, + inclusive: true, + exact: true, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckStringFormat = /* @__PURE__ */ $constructor("$ZodCheckStringFormat", (inst, def) => { + var _a2, _b; + $ZodCheck.init(inst, def); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.format = def.format; + if (def.pattern) { + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(def.pattern); + } + }); + if (def.pattern) + (_a2 = inst._zod).check ?? (_a2.check = (payload) => { + def.pattern.lastIndex = 0; + if (def.pattern.test(payload.value)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: def.format, + input: payload.value, + ...def.pattern ? { pattern: def.pattern.toString() } : {}, + inst, + continue: !def.abort + }); + }); + else + (_b = inst._zod).check ?? (_b.check = () => { + }); +}); +var $ZodCheckRegex = /* @__PURE__ */ $constructor("$ZodCheckRegex", (inst, def) => { + $ZodCheckStringFormat.init(inst, def); + inst._zod.check = (payload) => { + def.pattern.lastIndex = 0; + if (def.pattern.test(payload.value)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "regex", + input: payload.value, + pattern: def.pattern.toString(), + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckLowerCase = /* @__PURE__ */ $constructor("$ZodCheckLowerCase", (inst, def) => { + def.pattern ?? (def.pattern = lowercase); + $ZodCheckStringFormat.init(inst, def); +}); +var $ZodCheckUpperCase = /* @__PURE__ */ $constructor("$ZodCheckUpperCase", (inst, def) => { + def.pattern ?? (def.pattern = uppercase); + $ZodCheckStringFormat.init(inst, def); +}); +var $ZodCheckIncludes = /* @__PURE__ */ $constructor("$ZodCheckIncludes", (inst, def) => { + $ZodCheck.init(inst, def); + const escapedRegex = escapeRegex(def.includes); + const pattern = new RegExp(typeof def.position === "number" ? `^.{${def.position}}${escapedRegex}` : escapedRegex); + def.pattern = pattern; + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.includes(def.includes, def.position)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "includes", + includes: def.includes, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckStartsWith = /* @__PURE__ */ $constructor("$ZodCheckStartsWith", (inst, def) => { + $ZodCheck.init(inst, def); + const pattern = new RegExp(`^${escapeRegex(def.prefix)}.*`); + def.pattern ?? (def.pattern = pattern); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.startsWith(def.prefix)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "starts_with", + prefix: def.prefix, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckEndsWith = /* @__PURE__ */ $constructor("$ZodCheckEndsWith", (inst, def) => { + $ZodCheck.init(inst, def); + const pattern = new RegExp(`.*${escapeRegex(def.suffix)}$`); + def.pattern ?? (def.pattern = pattern); + inst._zod.onattach.push((inst2) => { + const bag = inst2._zod.bag; + bag.patterns ?? (bag.patterns = /* @__PURE__ */ new Set()); + bag.patterns.add(pattern); + }); + inst._zod.check = (payload) => { + if (payload.value.endsWith(def.suffix)) + return; + payload.issues.push({ + origin: "string", + code: "invalid_format", + format: "ends_with", + suffix: def.suffix, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +function handleCheckPropertyResult(result, payload, property) { + if (result.issues.length) { + payload.issues.push(...prefixIssues(property, result.issues)); + } +} +var $ZodCheckProperty = /* @__PURE__ */ $constructor("$ZodCheckProperty", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.check = (payload) => { + const result = def.schema._zod.run({ + value: payload.value[def.property], + issues: [] + }, {}); + if (result instanceof Promise) { + return result.then((result2) => handleCheckPropertyResult(result2, payload, def.property)); + } + handleCheckPropertyResult(result, payload, def.property); + return; + }; +}); +var $ZodCheckMimeType = /* @__PURE__ */ $constructor("$ZodCheckMimeType", (inst, def) => { + $ZodCheck.init(inst, def); + const mimeSet = new Set(def.mime); + inst._zod.onattach.push((inst2) => { + inst2._zod.bag.mime = def.mime; + }); + inst._zod.check = (payload) => { + if (mimeSet.has(payload.value.type)) + return; + payload.issues.push({ + code: "invalid_value", + values: def.mime, + input: payload.value.type, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCheckOverwrite = /* @__PURE__ */ $constructor("$ZodCheckOverwrite", (inst, def) => { + $ZodCheck.init(inst, def); + inst._zod.check = (payload) => { + payload.value = def.tx(payload.value); + }; +}); + +// node_modules/zod/v4/core/doc.js +var Doc = class { + constructor(args = []) { + this.content = []; + this.indent = 0; + if (this) + this.args = args; + } + indented(fn) { + this.indent += 1; + fn(this); + this.indent -= 1; + } + write(arg) { + if (typeof arg === "function") { + arg(this, { execution: "sync" }); + arg(this, { execution: "async" }); + return; + } + const content = arg; + const lines = content.split("\n").filter((x) => x); + const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length)); + const dedented = lines.map((x) => x.slice(minIndent)).map((x) => " ".repeat(this.indent * 2) + x); + for (const line of dedented) { + this.content.push(line); + } + } + compile() { + const F = Function; + const args = this?.args; + const content = this?.content ?? [``]; + const lines = [...content.map((x) => ` ${x}`)]; + return new F(...args, lines.join("\n")); + } +}; + +// node_modules/zod/v4/core/versions.js +var version = { + major: 4, + minor: 3, + patch: 6 +}; + +// node_modules/zod/v4/core/schemas.js +var $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => { + var _a2; + inst ?? (inst = {}); + inst._zod.def = def; + inst._zod.bag = inst._zod.bag || {}; + inst._zod.version = version; + const checks = [...inst._zod.def.checks ?? []]; + if (inst._zod.traits.has("$ZodCheck")) { + checks.unshift(inst); + } + for (const ch of checks) { + for (const fn of ch._zod.onattach) { + fn(inst); + } + } + if (checks.length === 0) { + (_a2 = inst._zod).deferred ?? (_a2.deferred = []); + inst._zod.deferred?.push(() => { + inst._zod.run = inst._zod.parse; + }); + } else { + const runChecks = (payload, checks2, ctx) => { + let isAborted2 = aborted(payload); + let asyncResult; + for (const ch of checks2) { + if (ch._zod.def.when) { + const shouldRun = ch._zod.def.when(payload); + if (!shouldRun) + continue; + } else if (isAborted2) { + continue; + } + const currLen = payload.issues.length; + const _ = ch._zod.check(payload); + if (_ instanceof Promise && ctx?.async === false) { + throw new $ZodAsyncError(); + } + if (asyncResult || _ instanceof Promise) { + asyncResult = (asyncResult ?? Promise.resolve()).then(async () => { + await _; + const nextLen = payload.issues.length; + if (nextLen === currLen) + return; + if (!isAborted2) + isAborted2 = aborted(payload, currLen); + }); + } else { + const nextLen = payload.issues.length; + if (nextLen === currLen) + continue; + if (!isAborted2) + isAborted2 = aborted(payload, currLen); + } + } + if (asyncResult) { + return asyncResult.then(() => { + return payload; + }); + } + return payload; + }; + const handleCanaryResult = (canary, payload, ctx) => { + if (aborted(canary)) { + canary.aborted = true; + return canary; + } + const checkResult = runChecks(payload, checks, ctx); + if (checkResult instanceof Promise) { + if (ctx.async === false) + throw new $ZodAsyncError(); + return checkResult.then((checkResult2) => inst._zod.parse(checkResult2, ctx)); + } + return inst._zod.parse(checkResult, ctx); + }; + inst._zod.run = (payload, ctx) => { + if (ctx.skipChecks) { + return inst._zod.parse(payload, ctx); + } + if (ctx.direction === "backward") { + const canary = inst._zod.parse({ value: payload.value, issues: [] }, { ...ctx, skipChecks: true }); + if (canary instanceof Promise) { + return canary.then((canary2) => { + return handleCanaryResult(canary2, payload, ctx); + }); + } + return handleCanaryResult(canary, payload, ctx); + } + const result = inst._zod.parse(payload, ctx); + if (result instanceof Promise) { + if (ctx.async === false) + throw new $ZodAsyncError(); + return result.then((result2) => runChecks(result2, checks, ctx)); + } + return runChecks(result, checks, ctx); + }; + } + defineLazy(inst, "~standard", () => ({ + validate: (value) => { + try { + const r = safeParse(inst, value); + return r.success ? { value: r.data } : { issues: r.error?.issues }; + } catch (_) { + return safeParseAsync(inst, value).then((r) => r.success ? { value: r.data } : { issues: r.error?.issues }); + } + }, + vendor: "zod", + version: 1 + })); +}); +var $ZodString = /* @__PURE__ */ $constructor("$ZodString", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = [...inst?._zod.bag?.patterns ?? []].pop() ?? string(inst._zod.bag); + inst._zod.parse = (payload, _) => { + if (def.coerce) + try { + payload.value = String(payload.value); + } catch (_2) { + } + if (typeof payload.value === "string") + return payload; + payload.issues.push({ + expected: "string", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; +}); +var $ZodStringFormat = /* @__PURE__ */ $constructor("$ZodStringFormat", (inst, def) => { + $ZodCheckStringFormat.init(inst, def); + $ZodString.init(inst, def); +}); +var $ZodGUID = /* @__PURE__ */ $constructor("$ZodGUID", (inst, def) => { + def.pattern ?? (def.pattern = guid); + $ZodStringFormat.init(inst, def); +}); +var $ZodUUID = /* @__PURE__ */ $constructor("$ZodUUID", (inst, def) => { + if (def.version) { + const versionMap = { + v1: 1, + v2: 2, + v3: 3, + v4: 4, + v5: 5, + v6: 6, + v7: 7, + v8: 8 + }; + const v = versionMap[def.version]; + if (v === void 0) + throw new Error(`Invalid UUID version: "${def.version}"`); + def.pattern ?? (def.pattern = uuid(v)); + } else + def.pattern ?? (def.pattern = uuid()); + $ZodStringFormat.init(inst, def); +}); +var $ZodEmail = /* @__PURE__ */ $constructor("$ZodEmail", (inst, def) => { + def.pattern ?? (def.pattern = email); + $ZodStringFormat.init(inst, def); +}); +var $ZodURL = /* @__PURE__ */ $constructor("$ZodURL", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + try { + const trimmed = payload.value.trim(); + const url2 = new URL(trimmed); + if (def.hostname) { + def.hostname.lastIndex = 0; + if (!def.hostname.test(url2.hostname)) { + payload.issues.push({ + code: "invalid_format", + format: "url", + note: "Invalid hostname", + pattern: def.hostname.source, + input: payload.value, + inst, + continue: !def.abort + }); + } + } + if (def.protocol) { + def.protocol.lastIndex = 0; + if (!def.protocol.test(url2.protocol.endsWith(":") ? url2.protocol.slice(0, -1) : url2.protocol)) { + payload.issues.push({ + code: "invalid_format", + format: "url", + note: "Invalid protocol", + pattern: def.protocol.source, + input: payload.value, + inst, + continue: !def.abort + }); + } + } + if (def.normalize) { + payload.value = url2.href; + } else { + payload.value = trimmed; + } + return; + } catch (_) { + payload.issues.push({ + code: "invalid_format", + format: "url", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; +}); +var $ZodEmoji = /* @__PURE__ */ $constructor("$ZodEmoji", (inst, def) => { + def.pattern ?? (def.pattern = emoji()); + $ZodStringFormat.init(inst, def); +}); +var $ZodNanoID = /* @__PURE__ */ $constructor("$ZodNanoID", (inst, def) => { + def.pattern ?? (def.pattern = nanoid); + $ZodStringFormat.init(inst, def); +}); +var $ZodCUID = /* @__PURE__ */ $constructor("$ZodCUID", (inst, def) => { + def.pattern ?? (def.pattern = cuid); + $ZodStringFormat.init(inst, def); +}); +var $ZodCUID2 = /* @__PURE__ */ $constructor("$ZodCUID2", (inst, def) => { + def.pattern ?? (def.pattern = cuid2); + $ZodStringFormat.init(inst, def); +}); +var $ZodULID = /* @__PURE__ */ $constructor("$ZodULID", (inst, def) => { + def.pattern ?? (def.pattern = ulid); + $ZodStringFormat.init(inst, def); +}); +var $ZodXID = /* @__PURE__ */ $constructor("$ZodXID", (inst, def) => { + def.pattern ?? (def.pattern = xid); + $ZodStringFormat.init(inst, def); +}); +var $ZodKSUID = /* @__PURE__ */ $constructor("$ZodKSUID", (inst, def) => { + def.pattern ?? (def.pattern = ksuid); + $ZodStringFormat.init(inst, def); +}); +var $ZodISODateTime = /* @__PURE__ */ $constructor("$ZodISODateTime", (inst, def) => { + def.pattern ?? (def.pattern = datetime(def)); + $ZodStringFormat.init(inst, def); +}); +var $ZodISODate = /* @__PURE__ */ $constructor("$ZodISODate", (inst, def) => { + def.pattern ?? (def.pattern = date); + $ZodStringFormat.init(inst, def); +}); +var $ZodISOTime = /* @__PURE__ */ $constructor("$ZodISOTime", (inst, def) => { + def.pattern ?? (def.pattern = time(def)); + $ZodStringFormat.init(inst, def); +}); +var $ZodISODuration = /* @__PURE__ */ $constructor("$ZodISODuration", (inst, def) => { + def.pattern ?? (def.pattern = duration); + $ZodStringFormat.init(inst, def); +}); +var $ZodIPv4 = /* @__PURE__ */ $constructor("$ZodIPv4", (inst, def) => { + def.pattern ?? (def.pattern = ipv4); + $ZodStringFormat.init(inst, def); + inst._zod.bag.format = `ipv4`; +}); +var $ZodIPv6 = /* @__PURE__ */ $constructor("$ZodIPv6", (inst, def) => { + def.pattern ?? (def.pattern = ipv6); + $ZodStringFormat.init(inst, def); + inst._zod.bag.format = `ipv6`; + inst._zod.check = (payload) => { + try { + new URL(`http://[${payload.value}]`); + } catch { + payload.issues.push({ + code: "invalid_format", + format: "ipv6", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; +}); +var $ZodMAC = /* @__PURE__ */ $constructor("$ZodMAC", (inst, def) => { + def.pattern ?? (def.pattern = mac(def.delimiter)); + $ZodStringFormat.init(inst, def); + inst._zod.bag.format = `mac`; +}); +var $ZodCIDRv4 = /* @__PURE__ */ $constructor("$ZodCIDRv4", (inst, def) => { + def.pattern ?? (def.pattern = cidrv4); + $ZodStringFormat.init(inst, def); +}); +var $ZodCIDRv6 = /* @__PURE__ */ $constructor("$ZodCIDRv6", (inst, def) => { + def.pattern ?? (def.pattern = cidrv6); + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + const parts = payload.value.split("/"); + try { + if (parts.length !== 2) + throw new Error(); + const [address, prefix] = parts; + if (!prefix) + throw new Error(); + const prefixNum = Number(prefix); + if (`${prefixNum}` !== prefix) + throw new Error(); + if (prefixNum < 0 || prefixNum > 128) + throw new Error(); + new URL(`http://[${address}]`); + } catch { + payload.issues.push({ + code: "invalid_format", + format: "cidrv6", + input: payload.value, + inst, + continue: !def.abort + }); + } + }; +}); +function isValidBase64(data) { + if (data === "") + return true; + if (data.length % 4 !== 0) + return false; + try { + atob(data); + return true; + } catch { + return false; + } +} +var $ZodBase64 = /* @__PURE__ */ $constructor("$ZodBase64", (inst, def) => { + def.pattern ?? (def.pattern = base64); + $ZodStringFormat.init(inst, def); + inst._zod.bag.contentEncoding = "base64"; + inst._zod.check = (payload) => { + if (isValidBase64(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: "base64", + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +function isValidBase64URL(data) { + if (!base64url.test(data)) + return false; + const base643 = data.replace(/[-_]/g, (c) => c === "-" ? "+" : "/"); + const padded = base643.padEnd(Math.ceil(base643.length / 4) * 4, "="); + return isValidBase64(padded); +} +var $ZodBase64URL = /* @__PURE__ */ $constructor("$ZodBase64URL", (inst, def) => { + def.pattern ?? (def.pattern = base64url); + $ZodStringFormat.init(inst, def); + inst._zod.bag.contentEncoding = "base64url"; + inst._zod.check = (payload) => { + if (isValidBase64URL(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: "base64url", + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodE164 = /* @__PURE__ */ $constructor("$ZodE164", (inst, def) => { + def.pattern ?? (def.pattern = e164); + $ZodStringFormat.init(inst, def); +}); +function isValidJWT2(token, algorithm = null) { + try { + const tokensParts = token.split("."); + if (tokensParts.length !== 3) + return false; + const [header] = tokensParts; + if (!header) + return false; + const parsedHeader = JSON.parse(atob(header)); + if ("typ" in parsedHeader && parsedHeader?.typ !== "JWT") + return false; + if (!parsedHeader.alg) + return false; + if (algorithm && (!("alg" in parsedHeader) || parsedHeader.alg !== algorithm)) + return false; + return true; + } catch { + return false; + } +} +var $ZodJWT = /* @__PURE__ */ $constructor("$ZodJWT", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + if (isValidJWT2(payload.value, def.alg)) + return; + payload.issues.push({ + code: "invalid_format", + format: "jwt", + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodCustomStringFormat = /* @__PURE__ */ $constructor("$ZodCustomStringFormat", (inst, def) => { + $ZodStringFormat.init(inst, def); + inst._zod.check = (payload) => { + if (def.fn(payload.value)) + return; + payload.issues.push({ + code: "invalid_format", + format: def.format, + input: payload.value, + inst, + continue: !def.abort + }); + }; +}); +var $ZodNumber = /* @__PURE__ */ $constructor("$ZodNumber", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = inst._zod.bag.pattern ?? number; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = Number(payload.value); + } catch (_) { + } + const input = payload.value; + if (typeof input === "number" && !Number.isNaN(input) && Number.isFinite(input)) { + return payload; + } + const received = typeof input === "number" ? Number.isNaN(input) ? "NaN" : !Number.isFinite(input) ? "Infinity" : void 0 : void 0; + payload.issues.push({ + expected: "number", + code: "invalid_type", + input, + inst, + ...received ? { received } : {} + }); + return payload; + }; +}); +var $ZodNumberFormat = /* @__PURE__ */ $constructor("$ZodNumberFormat", (inst, def) => { + $ZodCheckNumberFormat.init(inst, def); + $ZodNumber.init(inst, def); +}); +var $ZodBoolean = /* @__PURE__ */ $constructor("$ZodBoolean", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = boolean; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = Boolean(payload.value); + } catch (_) { + } + const input = payload.value; + if (typeof input === "boolean") + return payload; + payload.issues.push({ + expected: "boolean", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodBigInt = /* @__PURE__ */ $constructor("$ZodBigInt", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = bigint; + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) + try { + payload.value = BigInt(payload.value); + } catch (_) { + } + if (typeof payload.value === "bigint") + return payload; + payload.issues.push({ + expected: "bigint", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; +}); +var $ZodBigIntFormat = /* @__PURE__ */ $constructor("$ZodBigIntFormat", (inst, def) => { + $ZodCheckBigIntFormat.init(inst, def); + $ZodBigInt.init(inst, def); +}); +var $ZodSymbol = /* @__PURE__ */ $constructor("$ZodSymbol", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (typeof input === "symbol") + return payload; + payload.issues.push({ + expected: "symbol", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodUndefined = /* @__PURE__ */ $constructor("$ZodUndefined", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = _undefined; + inst._zod.values = /* @__PURE__ */ new Set([void 0]); + inst._zod.optin = "optional"; + inst._zod.optout = "optional"; + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (typeof input === "undefined") + return payload; + payload.issues.push({ + expected: "undefined", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodNull = /* @__PURE__ */ $constructor("$ZodNull", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.pattern = _null; + inst._zod.values = /* @__PURE__ */ new Set([null]); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (input === null) + return payload; + payload.issues.push({ + expected: "null", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodAny = /* @__PURE__ */ $constructor("$ZodAny", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload) => payload; +}); +var $ZodUnknown = /* @__PURE__ */ $constructor("$ZodUnknown", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload) => payload; +}); +var $ZodNever = /* @__PURE__ */ $constructor("$ZodNever", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + payload.issues.push({ + expected: "never", + code: "invalid_type", + input: payload.value, + inst + }); + return payload; + }; +}); +var $ZodVoid = /* @__PURE__ */ $constructor("$ZodVoid", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (typeof input === "undefined") + return payload; + payload.issues.push({ + expected: "void", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodDate = /* @__PURE__ */ $constructor("$ZodDate", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + if (def.coerce) { + try { + payload.value = new Date(payload.value); + } catch (_err) { + } + } + const input = payload.value; + const isDate = input instanceof Date; + const isValidDate = isDate && !Number.isNaN(input.getTime()); + if (isValidDate) + return payload; + payload.issues.push({ + expected: "date", + code: "invalid_type", + input, + ...isDate ? { received: "Invalid Date" } : {}, + inst + }); + return payload; + }; +}); +function handleArrayResult(result, final, index) { + if (result.issues.length) { + final.issues.push(...prefixIssues(index, result.issues)); + } + final.value[index] = result.value; +} +var $ZodArray = /* @__PURE__ */ $constructor("$ZodArray", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!Array.isArray(input)) { + payload.issues.push({ + expected: "array", + code: "invalid_type", + input, + inst + }); + return payload; + } + payload.value = Array(input.length); + const proms = []; + for (let i = 0; i < input.length; i++) { + const item = input[i]; + const result = def.element._zod.run({ + value: item, + issues: [] + }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleArrayResult(result2, payload, i))); + } else { + handleArrayResult(result, payload, i); + } + } + if (proms.length) { + return Promise.all(proms).then(() => payload); + } + return payload; + }; +}); +function handlePropertyResult(result, final, key, input, isOptionalOut) { + if (result.issues.length) { + if (isOptionalOut && !(key in input)) { + return; + } + final.issues.push(...prefixIssues(key, result.issues)); + } + if (result.value === void 0) { + if (key in input) { + final.value[key] = void 0; + } + } else { + final.value[key] = result.value; + } +} +function normalizeDef(def) { + const keys = Object.keys(def.shape); + for (const k of keys) { + if (!def.shape?.[k]?._zod?.traits?.has("$ZodType")) { + throw new Error(`Invalid element at key "${k}": expected a Zod schema`); + } + } + const okeys = optionalKeys(def.shape); + return { + ...def, + keys, + keySet: new Set(keys), + numKeys: keys.length, + optionalKeys: new Set(okeys) + }; +} +function handleCatchall(proms, input, payload, ctx, def, inst) { + const unrecognized = []; + const keySet = def.keySet; + const _catchall = def.catchall._zod; + const t = _catchall.def.type; + const isOptionalOut = _catchall.optout === "optional"; + for (const key in input) { + if (keySet.has(key)) + continue; + if (t === "never") { + unrecognized.push(key); + continue; + } + const r = _catchall.run({ value: input[key], issues: [] }, ctx); + if (r instanceof Promise) { + proms.push(r.then((r2) => handlePropertyResult(r2, payload, key, input, isOptionalOut))); + } else { + handlePropertyResult(r, payload, key, input, isOptionalOut); + } + } + if (unrecognized.length) { + payload.issues.push({ + code: "unrecognized_keys", + keys: unrecognized, + input, + inst + }); + } + if (!proms.length) + return payload; + return Promise.all(proms).then(() => { + return payload; + }); +} +var $ZodObject = /* @__PURE__ */ $constructor("$ZodObject", (inst, def) => { + $ZodType.init(inst, def); + const desc = Object.getOwnPropertyDescriptor(def, "shape"); + if (!desc?.get) { + const sh = def.shape; + Object.defineProperty(def, "shape", { + get: () => { + const newSh = { ...sh }; + Object.defineProperty(def, "shape", { + value: newSh + }); + return newSh; + } + }); + } + const _normalized = cached(() => normalizeDef(def)); + defineLazy(inst._zod, "propValues", () => { + const shape = def.shape; + const propValues = {}; + for (const key in shape) { + const field = shape[key]._zod; + if (field.values) { + propValues[key] ?? (propValues[key] = /* @__PURE__ */ new Set()); + for (const v of field.values) + propValues[key].add(v); + } + } + return propValues; + }); + const isObject2 = isObject; + const catchall = def.catchall; + let value; + inst._zod.parse = (payload, ctx) => { + value ?? (value = _normalized.value); + const input = payload.value; + if (!isObject2(input)) { + payload.issues.push({ + expected: "object", + code: "invalid_type", + input, + inst + }); + return payload; + } + payload.value = {}; + const proms = []; + const shape = value.shape; + for (const key of value.keys) { + const el = shape[key]; + const isOptionalOut = el._zod.optout === "optional"; + const r = el._zod.run({ value: input[key], issues: [] }, ctx); + if (r instanceof Promise) { + proms.push(r.then((r2) => handlePropertyResult(r2, payload, key, input, isOptionalOut))); + } else { + handlePropertyResult(r, payload, key, input, isOptionalOut); + } + } + if (!catchall) { + return proms.length ? Promise.all(proms).then(() => payload) : payload; + } + return handleCatchall(proms, input, payload, ctx, _normalized.value, inst); + }; +}); +var $ZodObjectJIT = /* @__PURE__ */ $constructor("$ZodObjectJIT", (inst, def) => { + $ZodObject.init(inst, def); + const superParse = inst._zod.parse; + const _normalized = cached(() => normalizeDef(def)); + const generateFastpass = (shape) => { + const doc = new Doc(["shape", "payload", "ctx"]); + const normalized = _normalized.value; + const parseStr = (key) => { + const k = esc(key); + return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`; + }; + doc.write(`const input = payload.value;`); + const ids = /* @__PURE__ */ Object.create(null); + let counter = 0; + for (const key of normalized.keys) { + ids[key] = `key_${counter++}`; + } + doc.write(`const newResult = {};`); + for (const key of normalized.keys) { + const id = ids[key]; + const k = esc(key); + const schema = shape[key]; + const isOptionalOut = schema?._zod?.optout === "optional"; + doc.write(`const ${id} = ${parseStr(key)};`); + if (isOptionalOut) { + doc.write(` + if (${id}.issues.length) { + if (${k} in input) { + payload.issues = payload.issues.concat(${id}.issues.map(iss => ({ + ...iss, + path: iss.path ? [${k}, ...iss.path] : [${k}] + }))); + } + } + + if (${id}.value === undefined) { + if (${k} in input) { + newResult[${k}] = undefined; + } + } else { + newResult[${k}] = ${id}.value; + } + + `); + } else { + doc.write(` + if (${id}.issues.length) { + payload.issues = payload.issues.concat(${id}.issues.map(iss => ({ + ...iss, + path: iss.path ? [${k}, ...iss.path] : [${k}] + }))); + } + + if (${id}.value === undefined) { + if (${k} in input) { + newResult[${k}] = undefined; + } + } else { + newResult[${k}] = ${id}.value; + } + + `); + } + } + doc.write(`payload.value = newResult;`); + doc.write(`return payload;`); + const fn = doc.compile(); + return (payload, ctx) => fn(shape, payload, ctx); + }; + let fastpass; + const isObject2 = isObject; + const jit = !globalConfig.jitless; + const allowsEval2 = allowsEval; + const fastEnabled = jit && allowsEval2.value; + const catchall = def.catchall; + let value; + inst._zod.parse = (payload, ctx) => { + value ?? (value = _normalized.value); + const input = payload.value; + if (!isObject2(input)) { + payload.issues.push({ + expected: "object", + code: "invalid_type", + input, + inst + }); + return payload; + } + if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) { + if (!fastpass) + fastpass = generateFastpass(def.shape); + payload = fastpass(payload, ctx); + if (!catchall) + return payload; + return handleCatchall([], input, payload, ctx, value, inst); + } + return superParse(payload, ctx); + }; +}); +function handleUnionResults(results, final, inst, ctx) { + for (const result of results) { + if (result.issues.length === 0) { + final.value = result.value; + return final; + } + } + const nonaborted = results.filter((r) => !aborted(r)); + if (nonaborted.length === 1) { + final.value = nonaborted[0].value; + return nonaborted[0]; + } + final.issues.push({ + code: "invalid_union", + input: final.value, + inst, + errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + }); + return final; +} +var $ZodUnion = /* @__PURE__ */ $constructor("$ZodUnion", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "optin", () => def.options.some((o) => o._zod.optin === "optional") ? "optional" : void 0); + defineLazy(inst._zod, "optout", () => def.options.some((o) => o._zod.optout === "optional") ? "optional" : void 0); + defineLazy(inst._zod, "values", () => { + if (def.options.every((o) => o._zod.values)) { + return new Set(def.options.flatMap((option) => Array.from(option._zod.values))); + } + return void 0; + }); + defineLazy(inst._zod, "pattern", () => { + if (def.options.every((o) => o._zod.pattern)) { + const patterns = def.options.map((o) => o._zod.pattern); + return new RegExp(`^(${patterns.map((p) => cleanRegex(p.source)).join("|")})$`); + } + return void 0; + }); + const single = def.options.length === 1; + const first = def.options[0]._zod.run; + inst._zod.parse = (payload, ctx) => { + if (single) { + return first(payload, ctx); + } + let async = false; + const results = []; + for (const option of def.options) { + const result = option._zod.run({ + value: payload.value, + issues: [] + }, ctx); + if (result instanceof Promise) { + results.push(result); + async = true; + } else { + if (result.issues.length === 0) + return result; + results.push(result); + } + } + if (!async) + return handleUnionResults(results, payload, inst, ctx); + return Promise.all(results).then((results2) => { + return handleUnionResults(results2, payload, inst, ctx); + }); + }; +}); +function handleExclusiveUnionResults(results, final, inst, ctx) { + const successes = results.filter((r) => r.issues.length === 0); + if (successes.length === 1) { + final.value = successes[0].value; + return final; + } + if (successes.length === 0) { + final.issues.push({ + code: "invalid_union", + input: final.value, + inst, + errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) + }); + } else { + final.issues.push({ + code: "invalid_union", + input: final.value, + inst, + errors: [], + inclusive: false + }); + } + return final; +} +var $ZodXor = /* @__PURE__ */ $constructor("$ZodXor", (inst, def) => { + $ZodUnion.init(inst, def); + def.inclusive = false; + const single = def.options.length === 1; + const first = def.options[0]._zod.run; + inst._zod.parse = (payload, ctx) => { + if (single) { + return first(payload, ctx); + } + let async = false; + const results = []; + for (const option of def.options) { + const result = option._zod.run({ + value: payload.value, + issues: [] + }, ctx); + if (result instanceof Promise) { + results.push(result); + async = true; + } else { + results.push(result); + } + } + if (!async) + return handleExclusiveUnionResults(results, payload, inst, ctx); + return Promise.all(results).then((results2) => { + return handleExclusiveUnionResults(results2, payload, inst, ctx); + }); + }; +}); +var $ZodDiscriminatedUnion = /* @__PURE__ */ $constructor("$ZodDiscriminatedUnion", (inst, def) => { + def.inclusive = false; + $ZodUnion.init(inst, def); + const _super = inst._zod.parse; + defineLazy(inst._zod, "propValues", () => { + const propValues = {}; + for (const option of def.options) { + const pv = option._zod.propValues; + if (!pv || Object.keys(pv).length === 0) + throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(option)}"`); + for (const [k, v] of Object.entries(pv)) { + if (!propValues[k]) + propValues[k] = /* @__PURE__ */ new Set(); + for (const val of v) { + propValues[k].add(val); + } + } + } + return propValues; + }); + const disc = cached(() => { + const opts = def.options; + const map2 = /* @__PURE__ */ new Map(); + for (const o of opts) { + const values = o._zod.propValues?.[def.discriminator]; + if (!values || values.size === 0) + throw new Error(`Invalid discriminated union option at index "${def.options.indexOf(o)}"`); + for (const v of values) { + if (map2.has(v)) { + throw new Error(`Duplicate discriminator value "${String(v)}"`); + } + map2.set(v, o); + } + } + return map2; + }); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!isObject(input)) { + payload.issues.push({ + code: "invalid_type", + expected: "object", + input, + inst + }); + return payload; + } + const opt = disc.value.get(input?.[def.discriminator]); + if (opt) { + return opt._zod.run(payload, ctx); + } + if (def.unionFallback) { + return _super(payload, ctx); + } + payload.issues.push({ + code: "invalid_union", + errors: [], + note: "No matching discriminator", + discriminator: def.discriminator, + input, + path: [def.discriminator], + inst + }); + return payload; + }; +}); +var $ZodIntersection = /* @__PURE__ */ $constructor("$ZodIntersection", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + const left = def.left._zod.run({ value: input, issues: [] }, ctx); + const right = def.right._zod.run({ value: input, issues: [] }, ctx); + const async = left instanceof Promise || right instanceof Promise; + if (async) { + return Promise.all([left, right]).then(([left2, right2]) => { + return handleIntersectionResults(payload, left2, right2); + }); + } + return handleIntersectionResults(payload, left, right); + }; +}); +function mergeValues2(a, b) { + if (a === b) { + return { valid: true, data: a }; + } + if (a instanceof Date && b instanceof Date && +a === +b) { + return { valid: true, data: a }; + } + if (isPlainObject(a) && isPlainObject(b)) { + const bKeys = Object.keys(b); + const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1); + const newObj = { ...a, ...b }; + for (const key of sharedKeys) { + const sharedValue = mergeValues2(a[key], b[key]); + if (!sharedValue.valid) { + return { + valid: false, + mergeErrorPath: [key, ...sharedValue.mergeErrorPath] + }; + } + newObj[key] = sharedValue.data; + } + return { valid: true, data: newObj }; + } + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) { + return { valid: false, mergeErrorPath: [] }; + } + const newArray = []; + for (let index = 0; index < a.length; index++) { + const itemA = a[index]; + const itemB = b[index]; + const sharedValue = mergeValues2(itemA, itemB); + if (!sharedValue.valid) { + return { + valid: false, + mergeErrorPath: [index, ...sharedValue.mergeErrorPath] + }; + } + newArray.push(sharedValue.data); + } + return { valid: true, data: newArray }; + } + return { valid: false, mergeErrorPath: [] }; +} +function handleIntersectionResults(result, left, right) { + const unrecKeys = /* @__PURE__ */ new Map(); + let unrecIssue; + for (const iss of left.issues) { + if (iss.code === "unrecognized_keys") { + unrecIssue ?? (unrecIssue = iss); + for (const k of iss.keys) { + if (!unrecKeys.has(k)) + unrecKeys.set(k, {}); + unrecKeys.get(k).l = true; + } + } else { + result.issues.push(iss); + } + } + for (const iss of right.issues) { + if (iss.code === "unrecognized_keys") { + for (const k of iss.keys) { + if (!unrecKeys.has(k)) + unrecKeys.set(k, {}); + unrecKeys.get(k).r = true; + } + } else { + result.issues.push(iss); + } + } + const bothKeys = [...unrecKeys].filter(([, f]) => f.l && f.r).map(([k]) => k); + if (bothKeys.length && unrecIssue) { + result.issues.push({ ...unrecIssue, keys: bothKeys }); + } + if (aborted(result)) + return result; + const merged = mergeValues2(left.value, right.value); + if (!merged.valid) { + throw new Error(`Unmergable intersection. Error path: ${JSON.stringify(merged.mergeErrorPath)}`); + } + result.value = merged.data; + return result; +} +var $ZodTuple = /* @__PURE__ */ $constructor("$ZodTuple", (inst, def) => { + $ZodType.init(inst, def); + const items = def.items; + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!Array.isArray(input)) { + payload.issues.push({ + input, + inst, + expected: "tuple", + code: "invalid_type" + }); + return payload; + } + payload.value = []; + const proms = []; + const reversedIndex = [...items].reverse().findIndex((item) => item._zod.optin !== "optional"); + const optStart = reversedIndex === -1 ? 0 : items.length - reversedIndex; + if (!def.rest) { + const tooBig = input.length > items.length; + const tooSmall = input.length < optStart - 1; + if (tooBig || tooSmall) { + payload.issues.push({ + ...tooBig ? { code: "too_big", maximum: items.length, inclusive: true } : { code: "too_small", minimum: items.length }, + input, + inst, + origin: "array" + }); + return payload; + } + } + let i = -1; + for (const item of items) { + i++; + if (i >= input.length) { + if (i >= optStart) + continue; + } + const result = item._zod.run({ + value: input[i], + issues: [] + }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleTupleResult(result2, payload, i))); + } else { + handleTupleResult(result, payload, i); + } + } + if (def.rest) { + const rest = input.slice(items.length); + for (const el of rest) { + i++; + const result = def.rest._zod.run({ + value: el, + issues: [] + }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleTupleResult(result2, payload, i))); + } else { + handleTupleResult(result, payload, i); + } + } + } + if (proms.length) + return Promise.all(proms).then(() => payload); + return payload; + }; +}); +function handleTupleResult(result, final, index) { + if (result.issues.length) { + final.issues.push(...prefixIssues(index, result.issues)); + } + final.value[index] = result.value; +} +var $ZodRecord = /* @__PURE__ */ $constructor("$ZodRecord", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!isPlainObject(input)) { + payload.issues.push({ + expected: "record", + code: "invalid_type", + input, + inst + }); + return payload; + } + const proms = []; + const values = def.keyType._zod.values; + if (values) { + payload.value = {}; + const recordKeys = /* @__PURE__ */ new Set(); + for (const key of values) { + if (typeof key === "string" || typeof key === "number" || typeof key === "symbol") { + recordKeys.add(typeof key === "number" ? key.toString() : key); + const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => { + if (result2.issues.length) { + payload.issues.push(...prefixIssues(key, result2.issues)); + } + payload.value[key] = result2.value; + })); + } else { + if (result.issues.length) { + payload.issues.push(...prefixIssues(key, result.issues)); + } + payload.value[key] = result.value; + } + } + } + let unrecognized; + for (const key in input) { + if (!recordKeys.has(key)) { + unrecognized = unrecognized ?? []; + unrecognized.push(key); + } + } + if (unrecognized && unrecognized.length > 0) { + payload.issues.push({ + code: "unrecognized_keys", + input, + inst, + keys: unrecognized + }); + } + } else { + payload.value = {}; + for (const key of Reflect.ownKeys(input)) { + if (key === "__proto__") + continue; + let keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx); + if (keyResult instanceof Promise) { + throw new Error("Async schemas not supported in object keys currently"); + } + const checkNumericKey = typeof key === "string" && number.test(key) && keyResult.issues.length; + if (checkNumericKey) { + const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx); + if (retryResult instanceof Promise) { + throw new Error("Async schemas not supported in object keys currently"); + } + if (retryResult.issues.length === 0) { + keyResult = retryResult; + } + } + if (keyResult.issues.length) { + if (def.mode === "loose") { + payload.value[key] = input[key]; + } else { + payload.issues.push({ + code: "invalid_key", + origin: "record", + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())), + input: key, + path: [key], + inst + }); + } + continue; + } + const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => { + if (result2.issues.length) { + payload.issues.push(...prefixIssues(key, result2.issues)); + } + payload.value[keyResult.value] = result2.value; + })); + } else { + if (result.issues.length) { + payload.issues.push(...prefixIssues(key, result.issues)); + } + payload.value[keyResult.value] = result.value; + } + } + } + if (proms.length) { + return Promise.all(proms).then(() => payload); + } + return payload; + }; +}); +var $ZodMap = /* @__PURE__ */ $constructor("$ZodMap", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!(input instanceof Map)) { + payload.issues.push({ + expected: "map", + code: "invalid_type", + input, + inst + }); + return payload; + } + const proms = []; + payload.value = /* @__PURE__ */ new Map(); + for (const [key, value] of input) { + const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx); + const valueResult = def.valueType._zod.run({ value, issues: [] }, ctx); + if (keyResult instanceof Promise || valueResult instanceof Promise) { + proms.push(Promise.all([keyResult, valueResult]).then(([keyResult2, valueResult2]) => { + handleMapResult(keyResult2, valueResult2, payload, key, input, inst, ctx); + })); + } else { + handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx); + } + } + if (proms.length) + return Promise.all(proms).then(() => payload); + return payload; + }; +}); +function handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) { + if (keyResult.issues.length) { + if (propertyKeyTypes.has(typeof key)) { + final.issues.push(...prefixIssues(key, keyResult.issues)); + } else { + final.issues.push({ + code: "invalid_key", + origin: "map", + input, + inst, + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }); + } + } + if (valueResult.issues.length) { + if (propertyKeyTypes.has(typeof key)) { + final.issues.push(...prefixIssues(key, valueResult.issues)); + } else { + final.issues.push({ + origin: "map", + code: "invalid_element", + input, + inst, + key, + issues: valueResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }); + } + } + final.value.set(keyResult.value, valueResult.value); +} +var $ZodSet = /* @__PURE__ */ $constructor("$ZodSet", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + const input = payload.value; + if (!(input instanceof Set)) { + payload.issues.push({ + input, + inst, + expected: "set", + code: "invalid_type" + }); + return payload; + } + const proms = []; + payload.value = /* @__PURE__ */ new Set(); + for (const item of input) { + const result = def.valueType._zod.run({ value: item, issues: [] }, ctx); + if (result instanceof Promise) { + proms.push(result.then((result2) => handleSetResult(result2, payload))); + } else + handleSetResult(result, payload); + } + if (proms.length) + return Promise.all(proms).then(() => payload); + return payload; + }; +}); +function handleSetResult(result, final) { + if (result.issues.length) { + final.issues.push(...result.issues); + } + final.value.add(result.value); +} +var $ZodEnum = /* @__PURE__ */ $constructor("$ZodEnum", (inst, def) => { + $ZodType.init(inst, def); + const values = getEnumValues(def.entries); + const valuesSet = new Set(values); + inst._zod.values = valuesSet; + inst._zod.pattern = new RegExp(`^(${values.filter((k) => propertyKeyTypes.has(typeof k)).map((o) => typeof o === "string" ? escapeRegex(o) : o.toString()).join("|")})$`); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (valuesSet.has(input)) { + return payload; + } + payload.issues.push({ + code: "invalid_value", + values, + input, + inst + }); + return payload; + }; +}); +var $ZodLiteral = /* @__PURE__ */ $constructor("$ZodLiteral", (inst, def) => { + $ZodType.init(inst, def); + if (def.values.length === 0) { + throw new Error("Cannot create literal schema with no valid values"); + } + const values = new Set(def.values); + inst._zod.values = values; + inst._zod.pattern = new RegExp(`^(${def.values.map((o) => typeof o === "string" ? escapeRegex(o) : o ? escapeRegex(o.toString()) : String(o)).join("|")})$`); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (values.has(input)) { + return payload; + } + payload.issues.push({ + code: "invalid_value", + values: def.values, + input, + inst + }); + return payload; + }; +}); +var $ZodFile = /* @__PURE__ */ $constructor("$ZodFile", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + const input = payload.value; + if (input instanceof File) + return payload; + payload.issues.push({ + expected: "file", + code: "invalid_type", + input, + inst + }); + return payload; + }; +}); +var $ZodTransform = /* @__PURE__ */ $constructor("$ZodTransform", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + if (ctx.direction === "backward") { + throw new $ZodEncodeError(inst.constructor.name); + } + const _out = def.transform(payload.value, payload); + if (ctx.async) { + const output = _out instanceof Promise ? _out : Promise.resolve(_out); + return output.then((output2) => { + payload.value = output2; + return payload; + }); + } + if (_out instanceof Promise) { + throw new $ZodAsyncError(); + } + payload.value = _out; + return payload; + }; +}); +function handleOptionalResult(result, input) { + if (result.issues.length && input === void 0) { + return { issues: [], value: void 0 }; + } + return result; +} +var $ZodOptional = /* @__PURE__ */ $constructor("$ZodOptional", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + inst._zod.optout = "optional"; + defineLazy(inst._zod, "values", () => { + return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, void 0]) : void 0; + }); + defineLazy(inst._zod, "pattern", () => { + const pattern = def.innerType._zod.pattern; + return pattern ? new RegExp(`^(${cleanRegex(pattern.source)})?$`) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + if (def.innerType._zod.optin === "optional") { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) + return result.then((r) => handleOptionalResult(r, payload.value)); + return handleOptionalResult(result, payload.value); + } + if (payload.value === void 0) { + return payload; + } + return def.innerType._zod.run(payload, ctx); + }; +}); +var $ZodExactOptional = /* @__PURE__ */ $constructor("$ZodExactOptional", (inst, def) => { + $ZodOptional.init(inst, def); + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + defineLazy(inst._zod, "pattern", () => def.innerType._zod.pattern); + inst._zod.parse = (payload, ctx) => { + return def.innerType._zod.run(payload, ctx); + }; +}); +var $ZodNullable = /* @__PURE__ */ $constructor("$ZodNullable", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "optin", () => def.innerType._zod.optin); + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + defineLazy(inst._zod, "pattern", () => { + const pattern = def.innerType._zod.pattern; + return pattern ? new RegExp(`^(${cleanRegex(pattern.source)}|null)$`) : void 0; + }); + defineLazy(inst._zod, "values", () => { + return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, null]) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + if (payload.value === null) + return payload; + return def.innerType._zod.run(payload, ctx); + }; +}); +var $ZodDefault = /* @__PURE__ */ $constructor("$ZodDefault", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + if (ctx.direction === "backward") { + return def.innerType._zod.run(payload, ctx); + } + if (payload.value === void 0) { + payload.value = def.defaultValue; + return payload; + } + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => handleDefaultResult(result2, def)); + } + return handleDefaultResult(result, def); + }; +}); +function handleDefaultResult(payload, def) { + if (payload.value === void 0) { + payload.value = def.defaultValue; + } + return payload; +} +var $ZodPrefault = /* @__PURE__ */ $constructor("$ZodPrefault", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.optin = "optional"; + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + if (ctx.direction === "backward") { + return def.innerType._zod.run(payload, ctx); + } + if (payload.value === void 0) { + payload.value = def.defaultValue; + } + return def.innerType._zod.run(payload, ctx); + }; +}); +var $ZodNonOptional = /* @__PURE__ */ $constructor("$ZodNonOptional", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "values", () => { + const v = def.innerType._zod.values; + return v ? new Set([...v].filter((x) => x !== void 0)) : void 0; + }); + inst._zod.parse = (payload, ctx) => { + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => handleNonOptionalResult(result2, inst)); + } + return handleNonOptionalResult(result, inst); + }; +}); +function handleNonOptionalResult(payload, inst) { + if (!payload.issues.length && payload.value === void 0) { + payload.issues.push({ + code: "invalid_type", + expected: "nonoptional", + input: payload.value, + inst + }); + } + return payload; +} +var $ZodSuccess = /* @__PURE__ */ $constructor("$ZodSuccess", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + if (ctx.direction === "backward") { + throw new $ZodEncodeError("ZodSuccess"); + } + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => { + payload.value = result2.issues.length === 0; + return payload; + }); + } + payload.value = result.issues.length === 0; + return payload; + }; +}); +var $ZodCatch = /* @__PURE__ */ $constructor("$ZodCatch", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "optin", () => def.innerType._zod.optin); + defineLazy(inst._zod, "optout", () => def.innerType._zod.optout); + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + inst._zod.parse = (payload, ctx) => { + if (ctx.direction === "backward") { + return def.innerType._zod.run(payload, ctx); + } + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then((result2) => { + payload.value = result2.value; + if (result2.issues.length) { + payload.value = def.catchValue({ + ...payload, + error: { + issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }, + input: payload.value + }); + payload.issues = []; + } + return payload; + }); + } + payload.value = result.value; + if (result.issues.length) { + payload.value = def.catchValue({ + ...payload, + error: { + issues: result.issues.map((iss) => finalizeIssue(iss, ctx, config())) + }, + input: payload.value + }); + payload.issues = []; + } + return payload; + }; +}); +var $ZodNaN = /* @__PURE__ */ $constructor("$ZodNaN", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, _ctx) => { + if (typeof payload.value !== "number" || !Number.isNaN(payload.value)) { + payload.issues.push({ + input: payload.value, + inst, + expected: "nan", + code: "invalid_type" + }); + return payload; + } + return payload; + }; +}); +var $ZodPipe = /* @__PURE__ */ $constructor("$ZodPipe", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "values", () => def.in._zod.values); + defineLazy(inst._zod, "optin", () => def.in._zod.optin); + defineLazy(inst._zod, "optout", () => def.out._zod.optout); + defineLazy(inst._zod, "propValues", () => def.in._zod.propValues); + inst._zod.parse = (payload, ctx) => { + if (ctx.direction === "backward") { + const right = def.out._zod.run(payload, ctx); + if (right instanceof Promise) { + return right.then((right2) => handlePipeResult(right2, def.in, ctx)); + } + return handlePipeResult(right, def.in, ctx); + } + const left = def.in._zod.run(payload, ctx); + if (left instanceof Promise) { + return left.then((left2) => handlePipeResult(left2, def.out, ctx)); + } + return handlePipeResult(left, def.out, ctx); + }; +}); +function handlePipeResult(left, next, ctx) { + if (left.issues.length) { + left.aborted = true; + return left; + } + return next._zod.run({ value: left.value, issues: left.issues }, ctx); +} +var $ZodCodec = /* @__PURE__ */ $constructor("$ZodCodec", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "values", () => def.in._zod.values); + defineLazy(inst._zod, "optin", () => def.in._zod.optin); + defineLazy(inst._zod, "optout", () => def.out._zod.optout); + defineLazy(inst._zod, "propValues", () => def.in._zod.propValues); + inst._zod.parse = (payload, ctx) => { + const direction = ctx.direction || "forward"; + if (direction === "forward") { + const left = def.in._zod.run(payload, ctx); + if (left instanceof Promise) { + return left.then((left2) => handleCodecAResult(left2, def, ctx)); + } + return handleCodecAResult(left, def, ctx); + } else { + const right = def.out._zod.run(payload, ctx); + if (right instanceof Promise) { + return right.then((right2) => handleCodecAResult(right2, def, ctx)); + } + return handleCodecAResult(right, def, ctx); + } + }; +}); +function handleCodecAResult(result, def, ctx) { + if (result.issues.length) { + result.aborted = true; + return result; + } + const direction = ctx.direction || "forward"; + if (direction === "forward") { + const transformed = def.transform(result.value, result); + if (transformed instanceof Promise) { + return transformed.then((value) => handleCodecTxResult(result, value, def.out, ctx)); + } + return handleCodecTxResult(result, transformed, def.out, ctx); + } else { + const transformed = def.reverseTransform(result.value, result); + if (transformed instanceof Promise) { + return transformed.then((value) => handleCodecTxResult(result, value, def.in, ctx)); + } + return handleCodecTxResult(result, transformed, def.in, ctx); + } +} +function handleCodecTxResult(left, value, nextSchema, ctx) { + if (left.issues.length) { + left.aborted = true; + return left; + } + return nextSchema._zod.run({ value, issues: left.issues }, ctx); +} +var $ZodReadonly = /* @__PURE__ */ $constructor("$ZodReadonly", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "propValues", () => def.innerType._zod.propValues); + defineLazy(inst._zod, "values", () => def.innerType._zod.values); + defineLazy(inst._zod, "optin", () => def.innerType?._zod?.optin); + defineLazy(inst._zod, "optout", () => def.innerType?._zod?.optout); + inst._zod.parse = (payload, ctx) => { + if (ctx.direction === "backward") { + return def.innerType._zod.run(payload, ctx); + } + const result = def.innerType._zod.run(payload, ctx); + if (result instanceof Promise) { + return result.then(handleReadonlyResult); + } + return handleReadonlyResult(result); + }; +}); +function handleReadonlyResult(payload) { + payload.value = Object.freeze(payload.value); + return payload; +} +var $ZodTemplateLiteral = /* @__PURE__ */ $constructor("$ZodTemplateLiteral", (inst, def) => { + $ZodType.init(inst, def); + const regexParts = []; + for (const part of def.parts) { + if (typeof part === "object" && part !== null) { + if (!part._zod.pattern) { + throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`); + } + const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern; + if (!source) + throw new Error(`Invalid template literal part: ${part._zod.traits}`); + const start = source.startsWith("^") ? 1 : 0; + const end = source.endsWith("$") ? source.length - 1 : source.length; + regexParts.push(source.slice(start, end)); + } else if (part === null || primitiveTypes.has(typeof part)) { + regexParts.push(escapeRegex(`${part}`)); + } else { + throw new Error(`Invalid template literal part: ${part}`); + } + } + inst._zod.pattern = new RegExp(`^${regexParts.join("")}$`); + inst._zod.parse = (payload, _ctx) => { + if (typeof payload.value !== "string") { + payload.issues.push({ + input: payload.value, + inst, + expected: "string", + code: "invalid_type" + }); + return payload; + } + inst._zod.pattern.lastIndex = 0; + if (!inst._zod.pattern.test(payload.value)) { + payload.issues.push({ + input: payload.value, + inst, + code: "invalid_format", + format: def.format ?? "template_literal", + pattern: inst._zod.pattern.source + }); + return payload; + } + return payload; + }; +}); +var $ZodFunction = /* @__PURE__ */ $constructor("$ZodFunction", (inst, def) => { + $ZodType.init(inst, def); + inst._def = def; + inst._zod.def = def; + inst.implement = (func) => { + if (typeof func !== "function") { + throw new Error("implement() must be called with a function"); + } + return function(...args) { + const parsedArgs = inst._def.input ? parse(inst._def.input, args) : args; + const result = Reflect.apply(func, this, parsedArgs); + if (inst._def.output) { + return parse(inst._def.output, result); + } + return result; + }; + }; + inst.implementAsync = (func) => { + if (typeof func !== "function") { + throw new Error("implementAsync() must be called with a function"); + } + return async function(...args) { + const parsedArgs = inst._def.input ? await parseAsync(inst._def.input, args) : args; + const result = await Reflect.apply(func, this, parsedArgs); + if (inst._def.output) { + return await parseAsync(inst._def.output, result); + } + return result; + }; + }; + inst._zod.parse = (payload, _ctx) => { + if (typeof payload.value !== "function") { + payload.issues.push({ + code: "invalid_type", + expected: "function", + input: payload.value, + inst + }); + return payload; + } + const hasPromiseOutput = inst._def.output && inst._def.output._zod.def.type === "promise"; + if (hasPromiseOutput) { + payload.value = inst.implementAsync(payload.value); + } else { + payload.value = inst.implement(payload.value); + } + return payload; + }; + inst.input = (...args) => { + const F = inst.constructor; + if (Array.isArray(args[0])) { + return new F({ + type: "function", + input: new $ZodTuple({ + type: "tuple", + items: args[0], + rest: args[1] + }), + output: inst._def.output + }); + } + return new F({ + type: "function", + input: args[0], + output: inst._def.output + }); + }; + inst.output = (output) => { + const F = inst.constructor; + return new F({ + type: "function", + input: inst._def.input, + output + }); + }; + return inst; +}); +var $ZodPromise = /* @__PURE__ */ $constructor("$ZodPromise", (inst, def) => { + $ZodType.init(inst, def); + inst._zod.parse = (payload, ctx) => { + return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx)); + }; +}); +var $ZodLazy = /* @__PURE__ */ $constructor("$ZodLazy", (inst, def) => { + $ZodType.init(inst, def); + defineLazy(inst._zod, "innerType", () => def.getter()); + defineLazy(inst._zod, "pattern", () => inst._zod.innerType?._zod?.pattern); + defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod?.propValues); + defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod?.optin ?? void 0); + defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod?.optout ?? void 0); + inst._zod.parse = (payload, ctx) => { + const inner = inst._zod.innerType; + return inner._zod.run(payload, ctx); + }; +}); +var $ZodCustom = /* @__PURE__ */ $constructor("$ZodCustom", (inst, def) => { + $ZodCheck.init(inst, def); + $ZodType.init(inst, def); + inst._zod.parse = (payload, _) => { + return payload; + }; + inst._zod.check = (payload) => { + const input = payload.value; + const r = def.fn(input); + if (r instanceof Promise) { + return r.then((r2) => handleRefineResult(r2, payload, input, inst)); + } + handleRefineResult(r, payload, input, inst); + return; + }; +}); +function handleRefineResult(result, payload, input, inst) { + if (!result) { + const _iss = { + code: "custom", + input, + inst, + // incorporates params.error into issue reporting + path: [...inst._zod.def.path ?? []], + // incorporates params.error into issue reporting + continue: !inst._zod.def.abort + // params: inst._zod.def.params, + }; + if (inst._zod.def.params) + _iss.params = inst._zod.def.params; + payload.issues.push(issue(_iss)); + } +} + +// node_modules/zod/v4/locales/index.js +var locales_exports = {}; +__export(locales_exports, { + ar: () => ar_default, + az: () => az_default, + be: () => be_default, + bg: () => bg_default, + ca: () => ca_default, + cs: () => cs_default, + da: () => da_default, + de: () => de_default, + en: () => en_default2, + eo: () => eo_default, + es: () => es_default, + fa: () => fa_default, + fi: () => fi_default, + fr: () => fr_default, + frCA: () => fr_CA_default, + he: () => he_default, + hu: () => hu_default, + hy: () => hy_default, + id: () => id_default, + is: () => is_default, + it: () => it_default, + ja: () => ja_default, + ka: () => ka_default, + kh: () => kh_default, + km: () => km_default, + ko: () => ko_default, + lt: () => lt_default, + mk: () => mk_default, + ms: () => ms_default, + nl: () => nl_default, + no: () => no_default, + ota: () => ota_default, + pl: () => pl_default, + ps: () => ps_default, + pt: () => pt_default, + ru: () => ru_default, + sl: () => sl_default, + sv: () => sv_default, + ta: () => ta_default, + th: () => th_default, + tr: () => tr_default, + ua: () => ua_default, + uk: () => uk_default, + ur: () => ur_default, + uz: () => uz_default, + vi: () => vi_default, + yo: () => yo_default, + zhCN: () => zh_CN_default, + zhTW: () => zh_TW_default +}); + +// node_modules/zod/v4/locales/ar.js +var error = () => { + const Sizable = { + string: { unit: "\u062D\u0631\u0641", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" }, + file: { unit: "\u0628\u0627\u064A\u062A", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" }, + array: { unit: "\u0639\u0646\u0635\u0631", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" }, + set: { unit: "\u0639\u0646\u0635\u0631", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0645\u062F\u062E\u0644", + email: "\u0628\u0631\u064A\u062F \u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A", + url: "\u0631\u0627\u0628\u0637", + emoji: "\u0625\u064A\u0645\u0648\u062C\u064A", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u062A\u0627\u0631\u064A\u062E \u0648\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + date: "\u062A\u0627\u0631\u064A\u062E \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + time: "\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + duration: "\u0645\u062F\u0629 \u0628\u0645\u0639\u064A\u0627\u0631 ISO", + ipv4: "\u0639\u0646\u0648\u0627\u0646 IPv4", + ipv6: "\u0639\u0646\u0648\u0627\u0646 IPv6", + cidrv4: "\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv4", + cidrv6: "\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv6", + base64: "\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64-encoded", + base64url: "\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64url-encoded", + json_string: "\u0646\u064E\u0635 \u0639\u0644\u0649 \u0647\u064A\u0626\u0629 JSON", + e164: "\u0631\u0642\u0645 \u0647\u0627\u062A\u0641 \u0628\u0645\u0639\u064A\u0627\u0631 E.164", + jwt: "JWT", + template_literal: "\u0645\u062F\u062E\u0644" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 instanceof ${issue2.expected}\u060C \u0648\u0644\u0643\u0646 \u062A\u0645 \u0625\u062F\u062E\u0627\u0644 ${received}`; + } + return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${expected}\u060C \u0648\u0644\u0643\u0646 \u062A\u0645 \u0625\u062F\u062E\u0627\u0644 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${stringifyPrimitive(issue2.values[0])}`; + return `\u0627\u062E\u062A\u064A\u0627\u0631 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062A\u0648\u0642\u0639 \u0627\u0646\u062A\u0642\u0627\u0621 \u0623\u062D\u062F \u0647\u0630\u0647 \u0627\u0644\u062E\u064A\u0627\u0631\u0627\u062A: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return ` \u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue2.origin ?? "\u0627\u0644\u0642\u064A\u0645\u0629"} ${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0635\u0631"}`; + return `\u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue2.origin ?? "\u0627\u0644\u0642\u064A\u0645\u0629"} ${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue2.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue2.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0628\u062F\u0623 \u0628\u0640 "${issue2.prefix}"`; + if (_issue.format === "ends_with") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0646\u062A\u0647\u064A \u0628\u0640 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u062A\u0636\u0645\u0651\u064E\u0646 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0637\u0627\u0628\u0642 \u0627\u0644\u0646\u0645\u0637 ${_issue.pattern}`; + return `${FormatDictionary[_issue.format] ?? issue2.format} \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644`; + } + case "not_multiple_of": + return `\u0631\u0642\u0645 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0645\u0646 \u0645\u0636\u0627\u0639\u0641\u0627\u062A ${issue2.divisor}`; + case "unrecognized_keys": + return `\u0645\u0639\u0631\u0641${issue2.keys.length > 1 ? "\u0627\u062A" : ""} \u063A\u0631\u064A\u0628${issue2.keys.length > 1 ? "\u0629" : ""}: ${joinValues(issue2.keys, "\u060C ")}`; + case "invalid_key": + return `\u0645\u0639\u0631\u0641 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue2.origin}`; + case "invalid_union": + return "\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644"; + case "invalid_element": + return `\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue2.origin}`; + default: + return "\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644"; + } + }; +}; +function ar_default() { + return { + localeError: error() + }; +} + +// node_modules/zod/v4/locales/az.js +var error2 = () => { + const Sizable = { + string: { unit: "simvol", verb: "olmal\u0131d\u0131r" }, + file: { unit: "bayt", verb: "olmal\u0131d\u0131r" }, + array: { unit: "element", verb: "olmal\u0131d\u0131r" }, + set: { unit: "element", verb: "olmal\u0131d\u0131r" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "input", + email: "email address", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datetime", + date: "ISO date", + time: "ISO time", + duration: "ISO duration", + ipv4: "IPv4 address", + ipv6: "IPv6 address", + cidrv4: "IPv4 range", + cidrv6: "IPv6 range", + base64: "base64-encoded string", + base64url: "base64url-encoded string", + json_string: "JSON string", + e164: "E.164 number", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Yanl\u0131\u015F d\u0259y\u0259r: g\xF6zl\u0259nil\u0259n instanceof ${issue2.expected}, daxil olan ${received}`; + } + return `Yanl\u0131\u015F d\u0259y\u0259r: g\xF6zl\u0259nil\u0259n ${expected}, daxil olan ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Yanl\u0131\u015F d\u0259y\u0259r: g\xF6zl\u0259nil\u0259n ${stringifyPrimitive(issue2.values[0])}`; + return `Yanl\u0131\u015F se\xE7im: a\u015Fa\u011F\u0131dak\u0131lardan biri olmal\u0131d\u0131r: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ox b\xF6y\xFCk: g\xF6zl\u0259nil\u0259n ${issue2.origin ?? "d\u0259y\u0259r"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "element"}`; + return `\xC7ox b\xF6y\xFCk: g\xF6zl\u0259nil\u0259n ${issue2.origin ?? "d\u0259y\u0259r"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ox ki\xE7ik: g\xF6zl\u0259nil\u0259n ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + return `\xC7ox ki\xE7ik: g\xF6zl\u0259nil\u0259n ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Yanl\u0131\u015F m\u0259tn: "${_issue.prefix}" il\u0259 ba\u015Flamal\u0131d\u0131r`; + if (_issue.format === "ends_with") + return `Yanl\u0131\u015F m\u0259tn: "${_issue.suffix}" il\u0259 bitm\u0259lidir`; + if (_issue.format === "includes") + return `Yanl\u0131\u015F m\u0259tn: "${_issue.includes}" daxil olmal\u0131d\u0131r`; + if (_issue.format === "regex") + return `Yanl\u0131\u015F m\u0259tn: ${_issue.pattern} \u015Fablonuna uy\u011Fun olmal\u0131d\u0131r`; + return `Yanl\u0131\u015F ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Yanl\u0131\u015F \u0259d\u0259d: ${issue2.divisor} il\u0259 b\xF6l\xFCn\u0259 bil\u0259n olmal\u0131d\u0131r`; + case "unrecognized_keys": + return `Tan\u0131nmayan a\xE7ar${issue2.keys.length > 1 ? "lar" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} daxilind\u0259 yanl\u0131\u015F a\xE7ar`; + case "invalid_union": + return "Yanl\u0131\u015F d\u0259y\u0259r"; + case "invalid_element": + return `${issue2.origin} daxilind\u0259 yanl\u0131\u015F d\u0259y\u0259r`; + default: + return `Yanl\u0131\u015F d\u0259y\u0259r`; + } + }; +}; +function az_default() { + return { + localeError: error2() + }; +} + +// node_modules/zod/v4/locales/be.js +function getBelarusianPlural(count, one, few, many) { + const absCount = Math.abs(count); + const lastDigit = absCount % 10; + const lastTwoDigits = absCount % 100; + if (lastTwoDigits >= 11 && lastTwoDigits <= 19) { + return many; + } + if (lastDigit === 1) { + return one; + } + if (lastDigit >= 2 && lastDigit <= 4) { + return few; + } + return many; +} +var error3 = () => { + const Sizable = { + string: { + unit: { + one: "\u0441\u0456\u043C\u0432\u0430\u043B", + few: "\u0441\u0456\u043C\u0432\u0430\u043B\u044B", + many: "\u0441\u0456\u043C\u0432\u0430\u043B\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + }, + array: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + }, + set: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + }, + file: { + unit: { + one: "\u0431\u0430\u0439\u0442", + few: "\u0431\u0430\u0439\u0442\u044B", + many: "\u0431\u0430\u0439\u0442\u0430\u045E" + }, + verb: "\u043C\u0435\u0446\u044C" + } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0443\u0432\u043E\u0434", + email: "email \u0430\u0434\u0440\u0430\u0441", + url: "URL", + emoji: "\u044D\u043C\u043E\u0434\u0437\u0456", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0434\u0430\u0442\u0430 \u0456 \u0447\u0430\u0441", + date: "ISO \u0434\u0430\u0442\u0430", + time: "ISO \u0447\u0430\u0441", + duration: "ISO \u043F\u0440\u0430\u0446\u044F\u0433\u043B\u0430\u0441\u0446\u044C", + ipv4: "IPv4 \u0430\u0434\u0440\u0430\u0441", + ipv6: "IPv6 \u0430\u0434\u0440\u0430\u0441", + cidrv4: "IPv4 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D", + cidrv6: "IPv6 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D", + base64: "\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64", + base64url: "\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64url", + json_string: "JSON \u0440\u0430\u0434\u043E\u043A", + e164: "\u043D\u0443\u043C\u0430\u0440 E.164", + jwt: "JWT", + template_literal: "\u0443\u0432\u043E\u0434" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u043B\u0456\u043A", + array: "\u043C\u0430\u0441\u0456\u045E" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u045E\u0441\u044F instanceof ${issue2.expected}, \u0430\u0442\u0440\u044B\u043C\u0430\u043D\u0430 ${received}`; + } + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u045E\u0441\u044F ${expected}, \u0430\u0442\u0440\u044B\u043C\u0430\u043D\u0430 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F ${stringifyPrimitive(issue2.values[0])}`; + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0432\u0430\u0440\u044B\u044F\u043D\u0442: \u0447\u0430\u043A\u0430\u045E\u0441\u044F \u0430\u0434\u0437\u0456\u043D \u0437 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const maxValue = Number(issue2.maximum); + const unit = getBelarusianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue2.maximum.toString()} ${unit}`; + } + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const minValue = Number(issue2.minimum); + const unit = getBelarusianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue2.minimum.toString()} ${unit}`; + } + return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue2.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u043F\u0430\u0447\u044B\u043D\u0430\u0446\u0446\u0430 \u0437 "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u0430\u043A\u0430\u043D\u0447\u0432\u0430\u0446\u0446\u0430 \u043D\u0430 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u043C\u044F\u0448\u0447\u0430\u0446\u044C "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0430\u0434\u043F\u0430\u0432\u044F\u0434\u0430\u0446\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`; + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043B\u0456\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0431\u044B\u0446\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue2.divisor}`; + case "unrecognized_keys": + return `\u041D\u0435\u0440\u0430\u0441\u043F\u0430\u0437\u043D\u0430\u043D\u044B ${issue2.keys.length > 1 ? "\u043A\u043B\u044E\u0447\u044B" : "\u043A\u043B\u044E\u0447"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043A\u043B\u044E\u0447 \u0443 ${issue2.origin}`; + case "invalid_union": + return "\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434"; + case "invalid_element": + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u0430\u0435 \u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435 \u045E ${issue2.origin}`; + default: + return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434`; + } + }; +}; +function be_default() { + return { + localeError: error3() + }; +} + +// node_modules/zod/v4/locales/bg.js +var error4 = () => { + const Sizable = { + string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0430", verb: "\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430" }, + file: { unit: "\u0431\u0430\u0439\u0442\u0430", verb: "\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430" }, + array: { unit: "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430", verb: "\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430" }, + set: { unit: "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430", verb: "\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0432\u0445\u043E\u0434", + email: "\u0438\u043C\u0435\u0439\u043B \u0430\u0434\u0440\u0435\u0441", + url: "URL", + emoji: "\u0435\u043C\u043E\u0434\u0436\u0438", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0432\u0440\u0435\u043C\u0435", + date: "ISO \u0434\u0430\u0442\u0430", + time: "ISO \u0432\u0440\u0435\u043C\u0435", + duration: "ISO \u043F\u0440\u043E\u0434\u044A\u043B\u0436\u0438\u0442\u0435\u043B\u043D\u043E\u0441\u0442", + ipv4: "IPv4 \u0430\u0434\u0440\u0435\u0441", + ipv6: "IPv6 \u0430\u0434\u0440\u0435\u0441", + cidrv4: "IPv4 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D", + cidrv6: "IPv6 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D", + base64: "base64-\u043A\u043E\u0434\u0438\u0440\u0430\u043D \u043D\u0438\u0437", + base64url: "base64url-\u043A\u043E\u0434\u0438\u0440\u0430\u043D \u043D\u0438\u0437", + json_string: "JSON \u043D\u0438\u0437", + e164: "E.164 \u043D\u043E\u043C\u0435\u0440", + jwt: "JWT", + template_literal: "\u0432\u0445\u043E\u0434" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0447\u0438\u0441\u043B\u043E", + array: "\u043C\u0430\u0441\u0438\u0432" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D instanceof ${issue2.expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D ${received}`; + } + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D ${expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D ${stringifyPrimitive(issue2.values[0])}`; + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430 \u043E\u043F\u0446\u0438\u044F: \u043E\u0447\u0430\u043A\u0432\u0430\u043D\u043E \u0435\u0434\u043D\u043E \u043E\u0442 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u0422\u0432\u044A\u0440\u0434\u0435 \u0433\u043E\u043B\u044F\u043C\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue2.origin ?? "\u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442"} \u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430 ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430"}`; + return `\u0422\u0432\u044A\u0440\u0434\u0435 \u0433\u043E\u043B\u044F\u043C\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue2.origin ?? "\u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442"} \u0434\u0430 \u0431\u044A\u0434\u0435 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0422\u0432\u044A\u0440\u0434\u0435 \u043C\u0430\u043B\u043A\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue2.origin} \u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430 ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u0422\u0432\u044A\u0440\u0434\u0435 \u043C\u0430\u043B\u043A\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue2.origin} \u0434\u0430 \u0431\u044A\u0434\u0435 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u043F\u043E\u0447\u0432\u0430 \u0441 "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u0432\u044A\u0440\u0448\u0432\u0430 \u0441 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0432\u0430 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0441\u044A\u0432\u043F\u0430\u0434\u0430 \u0441 ${_issue.pattern}`; + let invalid_adj = "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D"; + if (_issue.format === "emoji") + invalid_adj = "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E"; + if (_issue.format === "datetime") + invalid_adj = "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E"; + if (_issue.format === "date") + invalid_adj = "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430"; + if (_issue.format === "time") + invalid_adj = "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E"; + if (_issue.format === "duration") + invalid_adj = "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430"; + return `${invalid_adj} ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E \u0447\u0438\u0441\u043B\u043E: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0431\u044A\u0434\u0435 \u043A\u0440\u0430\u0442\u043D\u043E \u043D\u0430 ${issue2.divisor}`; + case "unrecognized_keys": + return `\u041D\u0435\u0440\u0430\u0437\u043F\u043E\u0437\u043D\u0430\u0442${issue2.keys.length > 1 ? "\u0438" : ""} \u043A\u043B\u044E\u0447${issue2.keys.length > 1 ? "\u043E\u0432\u0435" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043A\u043B\u044E\u0447 \u0432 ${issue2.origin}`; + case "invalid_union": + return "\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434"; + case "invalid_element": + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430 \u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442 \u0432 ${issue2.origin}`; + default: + return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434`; + } + }; +}; +function bg_default() { + return { + localeError: error4() + }; +} + +// node_modules/zod/v4/locales/ca.js +var error5 = () => { + const Sizable = { + string: { unit: "car\xE0cters", verb: "contenir" }, + file: { unit: "bytes", verb: "contenir" }, + array: { unit: "elements", verb: "contenir" }, + set: { unit: "elements", verb: "contenir" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "entrada", + email: "adre\xE7a electr\xF2nica", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data i hora ISO", + date: "data ISO", + time: "hora ISO", + duration: "durada ISO", + ipv4: "adre\xE7a IPv4", + ipv6: "adre\xE7a IPv6", + cidrv4: "rang IPv4", + cidrv6: "rang IPv6", + base64: "cadena codificada en base64", + base64url: "cadena codificada en base64url", + json_string: "cadena JSON", + e164: "n\xFAmero E.164", + jwt: "JWT", + template_literal: "entrada" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Tipus inv\xE0lid: s'esperava instanceof ${issue2.expected}, s'ha rebut ${received}`; + } + return `Tipus inv\xE0lid: s'esperava ${expected}, s'ha rebut ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Valor inv\xE0lid: s'esperava ${stringifyPrimitive(issue2.values[0])}`; + return `Opci\xF3 inv\xE0lida: s'esperava una de ${joinValues(issue2.values, " o ")}`; + case "too_big": { + const adj = issue2.inclusive ? "com a m\xE0xim" : "menys de"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Massa gran: s'esperava que ${issue2.origin ?? "el valor"} contingu\xE9s ${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "elements"}`; + return `Massa gran: s'esperava que ${issue2.origin ?? "el valor"} fos ${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? "com a m\xEDnim" : "m\xE9s de"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Massa petit: s'esperava que ${issue2.origin} contingu\xE9s ${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Massa petit: s'esperava que ${issue2.origin} fos ${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Format inv\xE0lid: ha de comen\xE7ar amb "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Format inv\xE0lid: ha d'acabar amb "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Format inv\xE0lid: ha d'incloure "${_issue.includes}"`; + if (_issue.format === "regex") + return `Format inv\xE0lid: ha de coincidir amb el patr\xF3 ${_issue.pattern}`; + return `Format inv\xE0lid per a ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `N\xFAmero inv\xE0lid: ha de ser m\xFAltiple de ${issue2.divisor}`; + case "unrecognized_keys": + return `Clau${issue2.keys.length > 1 ? "s" : ""} no reconeguda${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Clau inv\xE0lida a ${issue2.origin}`; + case "invalid_union": + return "Entrada inv\xE0lida"; + // Could also be "Tipus d'unió invàlid" but "Entrada invàlida" is more general + case "invalid_element": + return `Element inv\xE0lid a ${issue2.origin}`; + default: + return `Entrada inv\xE0lida`; + } + }; +}; +function ca_default() { + return { + localeError: error5() + }; +} + +// node_modules/zod/v4/locales/cs.js +var error6 = () => { + const Sizable = { + string: { unit: "znak\u016F", verb: "m\xEDt" }, + file: { unit: "bajt\u016F", verb: "m\xEDt" }, + array: { unit: "prvk\u016F", verb: "m\xEDt" }, + set: { unit: "prvk\u016F", verb: "m\xEDt" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "regul\xE1rn\xED v\xFDraz", + email: "e-mailov\xE1 adresa", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "datum a \u010Das ve form\xE1tu ISO", + date: "datum ve form\xE1tu ISO", + time: "\u010Das ve form\xE1tu ISO", + duration: "doba trv\xE1n\xED ISO", + ipv4: "IPv4 adresa", + ipv6: "IPv6 adresa", + cidrv4: "rozsah IPv4", + cidrv6: "rozsah IPv6", + base64: "\u0159et\u011Bzec zak\xF3dovan\xFD ve form\xE1tu base64", + base64url: "\u0159et\u011Bzec zak\xF3dovan\xFD ve form\xE1tu base64url", + json_string: "\u0159et\u011Bzec ve form\xE1tu JSON", + e164: "\u010D\xEDslo E.164", + jwt: "JWT", + template_literal: "vstup" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u010D\xEDslo", + string: "\u0159et\u011Bzec", + function: "funkce", + array: "pole" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Neplatn\xFD vstup: o\u010Dek\xE1v\xE1no instanceof ${issue2.expected}, obdr\u017Eeno ${received}`; + } + return `Neplatn\xFD vstup: o\u010Dek\xE1v\xE1no ${expected}, obdr\u017Eeno ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Neplatn\xFD vstup: o\u010Dek\xE1v\xE1no ${stringifyPrimitive(issue2.values[0])}`; + return `Neplatn\xE1 mo\u017Enost: o\u010Dek\xE1v\xE1na jedna z hodnot ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Hodnota je p\u0159\xEDli\u0161 velk\xE1: ${issue2.origin ?? "hodnota"} mus\xED m\xEDt ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "prvk\u016F"}`; + } + return `Hodnota je p\u0159\xEDli\u0161 velk\xE1: ${issue2.origin ?? "hodnota"} mus\xED b\xFDt ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Hodnota je p\u0159\xEDli\u0161 mal\xE1: ${issue2.origin ?? "hodnota"} mus\xED m\xEDt ${adj}${issue2.minimum.toString()} ${sizing.unit ?? "prvk\u016F"}`; + } + return `Hodnota je p\u0159\xEDli\u0161 mal\xE1: ${issue2.origin ?? "hodnota"} mus\xED b\xFDt ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED za\u010D\xEDnat na "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED kon\u010Dit na "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED obsahovat "${_issue.includes}"`; + if (_issue.format === "regex") + return `Neplatn\xFD \u0159et\u011Bzec: mus\xED odpov\xEDdat vzoru ${_issue.pattern}`; + return `Neplatn\xFD form\xE1t ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Neplatn\xE9 \u010D\xEDslo: mus\xED b\xFDt n\xE1sobkem ${issue2.divisor}`; + case "unrecognized_keys": + return `Nezn\xE1m\xE9 kl\xED\u010De: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Neplatn\xFD kl\xED\u010D v ${issue2.origin}`; + case "invalid_union": + return "Neplatn\xFD vstup"; + case "invalid_element": + return `Neplatn\xE1 hodnota v ${issue2.origin}`; + default: + return `Neplatn\xFD vstup`; + } + }; +}; +function cs_default() { + return { + localeError: error6() + }; +} + +// node_modules/zod/v4/locales/da.js +var error7 = () => { + const Sizable = { + string: { unit: "tegn", verb: "havde" }, + file: { unit: "bytes", verb: "havde" }, + array: { unit: "elementer", verb: "indeholdt" }, + set: { unit: "elementer", verb: "indeholdt" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "input", + email: "e-mailadresse", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO dato- og klokkesl\xE6t", + date: "ISO-dato", + time: "ISO-klokkesl\xE6t", + duration: "ISO-varighed", + ipv4: "IPv4-omr\xE5de", + ipv6: "IPv6-omr\xE5de", + cidrv4: "IPv4-spektrum", + cidrv6: "IPv6-spektrum", + base64: "base64-kodet streng", + base64url: "base64url-kodet streng", + json_string: "JSON-streng", + e164: "E.164-nummer", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + nan: "NaN", + string: "streng", + number: "tal", + boolean: "boolean", + array: "liste", + object: "objekt", + set: "s\xE6t", + file: "fil" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Ugyldigt input: forventede instanceof ${issue2.expected}, fik ${received}`; + } + return `Ugyldigt input: forventede ${expected}, fik ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Ugyldig v\xE6rdi: forventede ${stringifyPrimitive(issue2.values[0])}`; + return `Ugyldigt valg: forventede en af f\xF8lgende ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + const origin = TypeDictionary[issue2.origin] ?? issue2.origin; + if (sizing) + return `For stor: forventede ${origin ?? "value"} ${sizing.verb} ${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "elementer"}`; + return `For stor: forventede ${origin ?? "value"} havde ${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + const origin = TypeDictionary[issue2.origin] ?? issue2.origin; + if (sizing) { + return `For lille: forventede ${origin} ${sizing.verb} ${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `For lille: forventede ${origin} havde ${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Ugyldig streng: skal starte med "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Ugyldig streng: skal ende med "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Ugyldig streng: skal indeholde "${_issue.includes}"`; + if (_issue.format === "regex") + return `Ugyldig streng: skal matche m\xF8nsteret ${_issue.pattern}`; + return `Ugyldig ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ugyldigt tal: skal v\xE6re deleligt med ${issue2.divisor}`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Ukendte n\xF8gler" : "Ukendt n\xF8gle"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ugyldig n\xF8gle i ${issue2.origin}`; + case "invalid_union": + return "Ugyldigt input: matcher ingen af de tilladte typer"; + case "invalid_element": + return `Ugyldig v\xE6rdi i ${issue2.origin}`; + default: + return `Ugyldigt input`; + } + }; +}; +function da_default() { + return { + localeError: error7() + }; +} + +// node_modules/zod/v4/locales/de.js +var error8 = () => { + const Sizable = { + string: { unit: "Zeichen", verb: "zu haben" }, + file: { unit: "Bytes", verb: "zu haben" }, + array: { unit: "Elemente", verb: "zu haben" }, + set: { unit: "Elemente", verb: "zu haben" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "Eingabe", + email: "E-Mail-Adresse", + url: "URL", + emoji: "Emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-Datum und -Uhrzeit", + date: "ISO-Datum", + time: "ISO-Uhrzeit", + duration: "ISO-Dauer", + ipv4: "IPv4-Adresse", + ipv6: "IPv6-Adresse", + cidrv4: "IPv4-Bereich", + cidrv6: "IPv6-Bereich", + base64: "Base64-codierter String", + base64url: "Base64-URL-codierter String", + json_string: "JSON-String", + e164: "E.164-Nummer", + jwt: "JWT", + template_literal: "Eingabe" + }; + const TypeDictionary = { + nan: "NaN", + number: "Zahl", + array: "Array" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Ung\xFCltige Eingabe: erwartet instanceof ${issue2.expected}, erhalten ${received}`; + } + return `Ung\xFCltige Eingabe: erwartet ${expected}, erhalten ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Ung\xFCltige Eingabe: erwartet ${stringifyPrimitive(issue2.values[0])}`; + return `Ung\xFCltige Option: erwartet eine von ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Zu gro\xDF: erwartet, dass ${issue2.origin ?? "Wert"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "Elemente"} hat`; + return `Zu gro\xDF: erwartet, dass ${issue2.origin ?? "Wert"} ${adj}${issue2.maximum.toString()} ist`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Zu klein: erwartet, dass ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit} hat`; + } + return `Zu klein: erwartet, dass ${issue2.origin} ${adj}${issue2.minimum.toString()} ist`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Ung\xFCltiger String: muss mit "${_issue.prefix}" beginnen`; + if (_issue.format === "ends_with") + return `Ung\xFCltiger String: muss mit "${_issue.suffix}" enden`; + if (_issue.format === "includes") + return `Ung\xFCltiger String: muss "${_issue.includes}" enthalten`; + if (_issue.format === "regex") + return `Ung\xFCltiger String: muss dem Muster ${_issue.pattern} entsprechen`; + return `Ung\xFCltig: ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ung\xFCltige Zahl: muss ein Vielfaches von ${issue2.divisor} sein`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Unbekannte Schl\xFCssel" : "Unbekannter Schl\xFCssel"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ung\xFCltiger Schl\xFCssel in ${issue2.origin}`; + case "invalid_union": + return "Ung\xFCltige Eingabe"; + case "invalid_element": + return `Ung\xFCltiger Wert in ${issue2.origin}`; + default: + return `Ung\xFCltige Eingabe`; + } + }; +}; +function de_default() { + return { + localeError: error8() + }; +} + +// node_modules/zod/v4/locales/en.js +var error9 = () => { + const Sizable = { + string: { unit: "characters", verb: "to have" }, + file: { unit: "bytes", verb: "to have" }, + array: { unit: "items", verb: "to have" }, + set: { unit: "items", verb: "to have" }, + map: { unit: "entries", verb: "to have" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "input", + email: "email address", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datetime", + date: "ISO date", + time: "ISO time", + duration: "ISO duration", + ipv4: "IPv4 address", + ipv6: "IPv6 address", + mac: "MAC address", + cidrv4: "IPv4 range", + cidrv6: "IPv6 range", + base64: "base64-encoded string", + base64url: "base64url-encoded string", + json_string: "JSON string", + e164: "E.164 number", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + // Compatibility: "nan" -> "NaN" for display + nan: "NaN" + // All other type names omitted - they fall back to raw values via ?? operator + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + return `Invalid input: expected ${expected}, received ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Invalid input: expected ${stringifyPrimitive(issue2.values[0])}`; + return `Invalid option: expected one of ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Too big: expected ${issue2.origin ?? "value"} to have ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elements"}`; + return `Too big: expected ${issue2.origin ?? "value"} to be ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Too small: expected ${issue2.origin} to have ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Too small: expected ${issue2.origin} to be ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Invalid string: must start with "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Invalid string: must end with "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Invalid string: must include "${_issue.includes}"`; + if (_issue.format === "regex") + return `Invalid string: must match pattern ${_issue.pattern}`; + return `Invalid ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Invalid number: must be a multiple of ${issue2.divisor}`; + case "unrecognized_keys": + return `Unrecognized key${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Invalid key in ${issue2.origin}`; + case "invalid_union": + return "Invalid input"; + case "invalid_element": + return `Invalid value in ${issue2.origin}`; + default: + return `Invalid input`; + } + }; +}; +function en_default2() { + return { + localeError: error9() + }; +} + +// node_modules/zod/v4/locales/eo.js +var error10 = () => { + const Sizable = { + string: { unit: "karaktrojn", verb: "havi" }, + file: { unit: "bajtojn", verb: "havi" }, + array: { unit: "elementojn", verb: "havi" }, + set: { unit: "elementojn", verb: "havi" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "enigo", + email: "retadreso", + url: "URL", + emoji: "emo\u011Dio", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-datotempo", + date: "ISO-dato", + time: "ISO-tempo", + duration: "ISO-da\u016Dro", + ipv4: "IPv4-adreso", + ipv6: "IPv6-adreso", + cidrv4: "IPv4-rango", + cidrv6: "IPv6-rango", + base64: "64-ume kodita karaktraro", + base64url: "URL-64-ume kodita karaktraro", + json_string: "JSON-karaktraro", + e164: "E.164-nombro", + jwt: "JWT", + template_literal: "enigo" + }; + const TypeDictionary = { + nan: "NaN", + number: "nombro", + array: "tabelo", + null: "senvalora" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Nevalida enigo: atendi\u011Dis instanceof ${issue2.expected}, ricevi\u011Dis ${received}`; + } + return `Nevalida enigo: atendi\u011Dis ${expected}, ricevi\u011Dis ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Nevalida enigo: atendi\u011Dis ${stringifyPrimitive(issue2.values[0])}`; + return `Nevalida opcio: atendi\u011Dis unu el ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Tro granda: atendi\u011Dis ke ${issue2.origin ?? "valoro"} havu ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementojn"}`; + return `Tro granda: atendi\u011Dis ke ${issue2.origin ?? "valoro"} havu ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Tro malgranda: atendi\u011Dis ke ${issue2.origin} havu ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Tro malgranda: atendi\u011Dis ke ${issue2.origin} estu ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Nevalida karaktraro: devas komenci\u011Di per "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Nevalida karaktraro: devas fini\u011Di per "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Nevalida karaktraro: devas inkluzivi "${_issue.includes}"`; + if (_issue.format === "regex") + return `Nevalida karaktraro: devas kongrui kun la modelo ${_issue.pattern}`; + return `Nevalida ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Nevalida nombro: devas esti oblo de ${issue2.divisor}`; + case "unrecognized_keys": + return `Nekonata${issue2.keys.length > 1 ? "j" : ""} \u015Dlosilo${issue2.keys.length > 1 ? "j" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Nevalida \u015Dlosilo en ${issue2.origin}`; + case "invalid_union": + return "Nevalida enigo"; + case "invalid_element": + return `Nevalida valoro en ${issue2.origin}`; + default: + return `Nevalida enigo`; + } + }; +}; +function eo_default() { + return { + localeError: error10() + }; +} + +// node_modules/zod/v4/locales/es.js +var error11 = () => { + const Sizable = { + string: { unit: "caracteres", verb: "tener" }, + file: { unit: "bytes", verb: "tener" }, + array: { unit: "elementos", verb: "tener" }, + set: { unit: "elementos", verb: "tener" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "entrada", + email: "direcci\xF3n de correo electr\xF3nico", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "fecha y hora ISO", + date: "fecha ISO", + time: "hora ISO", + duration: "duraci\xF3n ISO", + ipv4: "direcci\xF3n IPv4", + ipv6: "direcci\xF3n IPv6", + cidrv4: "rango IPv4", + cidrv6: "rango IPv6", + base64: "cadena codificada en base64", + base64url: "URL codificada en base64", + json_string: "cadena JSON", + e164: "n\xFAmero E.164", + jwt: "JWT", + template_literal: "entrada" + }; + const TypeDictionary = { + nan: "NaN", + string: "texto", + number: "n\xFAmero", + boolean: "booleano", + array: "arreglo", + object: "objeto", + set: "conjunto", + file: "archivo", + date: "fecha", + bigint: "n\xFAmero grande", + symbol: "s\xEDmbolo", + undefined: "indefinido", + null: "nulo", + function: "funci\xF3n", + map: "mapa", + record: "registro", + tuple: "tupla", + enum: "enumeraci\xF3n", + union: "uni\xF3n", + literal: "literal", + promise: "promesa", + void: "vac\xEDo", + never: "nunca", + unknown: "desconocido", + any: "cualquiera" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Entrada inv\xE1lida: se esperaba instanceof ${issue2.expected}, recibido ${received}`; + } + return `Entrada inv\xE1lida: se esperaba ${expected}, recibido ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Entrada inv\xE1lida: se esperaba ${stringifyPrimitive(issue2.values[0])}`; + return `Opci\xF3n inv\xE1lida: se esperaba una de ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + const origin = TypeDictionary[issue2.origin] ?? issue2.origin; + if (sizing) + return `Demasiado grande: se esperaba que ${origin ?? "valor"} tuviera ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementos"}`; + return `Demasiado grande: se esperaba que ${origin ?? "valor"} fuera ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + const origin = TypeDictionary[issue2.origin] ?? issue2.origin; + if (sizing) { + return `Demasiado peque\xF1o: se esperaba que ${origin} tuviera ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Demasiado peque\xF1o: se esperaba que ${origin} fuera ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Cadena inv\xE1lida: debe comenzar con "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Cadena inv\xE1lida: debe terminar en "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Cadena inv\xE1lida: debe incluir "${_issue.includes}"`; + if (_issue.format === "regex") + return `Cadena inv\xE1lida: debe coincidir con el patr\xF3n ${_issue.pattern}`; + return `Inv\xE1lido ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `N\xFAmero inv\xE1lido: debe ser m\xFAltiplo de ${issue2.divisor}`; + case "unrecognized_keys": + return `Llave${issue2.keys.length > 1 ? "s" : ""} desconocida${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Llave inv\xE1lida en ${TypeDictionary[issue2.origin] ?? issue2.origin}`; + case "invalid_union": + return "Entrada inv\xE1lida"; + case "invalid_element": + return `Valor inv\xE1lido en ${TypeDictionary[issue2.origin] ?? issue2.origin}`; + default: + return `Entrada inv\xE1lida`; + } + }; +}; +function es_default() { + return { + localeError: error11() + }; +} + +// node_modules/zod/v4/locales/fa.js +var error12 = () => { + const Sizable = { + string: { unit: "\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" }, + file: { unit: "\u0628\u0627\u06CC\u062A", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" }, + array: { unit: "\u0622\u06CC\u062A\u0645", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" }, + set: { unit: "\u0622\u06CC\u062A\u0645", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0648\u0631\u0648\u062F\u06CC", + email: "\u0622\u062F\u0631\u0633 \u0627\u06CC\u0645\u06CC\u0644", + url: "URL", + emoji: "\u0627\u06CC\u0645\u0648\u062C\u06CC", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u062A\u0627\u0631\u06CC\u062E \u0648 \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648", + date: "\u062A\u0627\u0631\u06CC\u062E \u0627\u06CC\u0632\u0648", + time: "\u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648", + duration: "\u0645\u062F\u062A \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648", + ipv4: "IPv4 \u0622\u062F\u0631\u0633", + ipv6: "IPv6 \u0622\u062F\u0631\u0633", + cidrv4: "IPv4 \u062F\u0627\u0645\u0646\u0647", + cidrv6: "IPv6 \u062F\u0627\u0645\u0646\u0647", + base64: "base64-encoded \u0631\u0634\u062A\u0647", + base64url: "base64url-encoded \u0631\u0634\u062A\u0647", + json_string: "JSON \u0631\u0634\u062A\u0647", + e164: "E.164 \u0639\u062F\u062F", + jwt: "JWT", + template_literal: "\u0648\u0631\u0648\u062F\u06CC" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0639\u062F\u062F", + array: "\u0622\u0631\u0627\u06CC\u0647" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A instanceof ${issue2.expected} \u0645\u06CC\u200C\u0628\u0648\u062F\u060C ${received} \u062F\u0631\u06CC\u0627\u0641\u062A \u0634\u062F`; + } + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${expected} \u0645\u06CC\u200C\u0628\u0648\u062F\u060C ${received} \u062F\u0631\u06CC\u0627\u0641\u062A \u0634\u062F`; + } + case "invalid_value": + if (issue2.values.length === 1) { + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${stringifyPrimitive(issue2.values[0])} \u0645\u06CC\u200C\u0628\u0648\u062F`; + } + return `\u06AF\u0632\u06CC\u0646\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A \u06CC\u06A9\u06CC \u0627\u0632 ${joinValues(issue2.values, "|")} \u0645\u06CC\u200C\u0628\u0648\u062F`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue2.origin ?? "\u0645\u0642\u062F\u0627\u0631"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0635\u0631"} \u0628\u0627\u0634\u062F`; + } + return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue2.origin ?? "\u0645\u0642\u062F\u0627\u0631"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} \u0628\u0627\u0634\u062F`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} ${sizing.unit} \u0628\u0627\u0634\u062F`; + } + return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} \u0628\u0627\u0634\u062F`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 "${_issue.prefix}" \u0634\u0631\u0648\u0639 \u0634\u0648\u062F`; + } + if (_issue.format === "ends_with") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 "${_issue.suffix}" \u062A\u0645\u0627\u0645 \u0634\u0648\u062F`; + } + if (_issue.format === "includes") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0634\u0627\u0645\u0644 "${_issue.includes}" \u0628\u0627\u0634\u062F`; + } + if (_issue.format === "regex") { + return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \u0627\u0644\u06AF\u0648\u06CC ${_issue.pattern} \u0645\u0637\u0627\u0628\u0642\u062A \u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F`; + } + return `${FormatDictionary[_issue.format] ?? issue2.format} \u0646\u0627\u0645\u0639\u062A\u0628\u0631`; + } + case "not_multiple_of": + return `\u0639\u062F\u062F \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0645\u0636\u0631\u0628 ${issue2.divisor} \u0628\u0627\u0634\u062F`; + case "unrecognized_keys": + return `\u06A9\u0644\u06CC\u062F${issue2.keys.length > 1 ? "\u0647\u0627\u06CC" : ""} \u0646\u0627\u0634\u0646\u0627\u0633: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u06A9\u0644\u06CC\u062F \u0646\u0627\u0634\u0646\u0627\u0633 \u062F\u0631 ${issue2.origin}`; + case "invalid_union": + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`; + case "invalid_element": + return `\u0645\u0642\u062F\u0627\u0631 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u062F\u0631 ${issue2.origin}`; + default: + return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`; + } + }; +}; +function fa_default() { + return { + localeError: error12() + }; +} + +// node_modules/zod/v4/locales/fi.js +var error13 = () => { + const Sizable = { + string: { unit: "merkki\xE4", subject: "merkkijonon" }, + file: { unit: "tavua", subject: "tiedoston" }, + array: { unit: "alkiota", subject: "listan" }, + set: { unit: "alkiota", subject: "joukon" }, + number: { unit: "", subject: "luvun" }, + bigint: { unit: "", subject: "suuren kokonaisluvun" }, + int: { unit: "", subject: "kokonaisluvun" }, + date: { unit: "", subject: "p\xE4iv\xE4m\xE4\xE4r\xE4n" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "s\xE4\xE4nn\xF6llinen lauseke", + email: "s\xE4hk\xF6postiosoite", + url: "URL-osoite", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-aikaleima", + date: "ISO-p\xE4iv\xE4m\xE4\xE4r\xE4", + time: "ISO-aika", + duration: "ISO-kesto", + ipv4: "IPv4-osoite", + ipv6: "IPv6-osoite", + cidrv4: "IPv4-alue", + cidrv6: "IPv6-alue", + base64: "base64-koodattu merkkijono", + base64url: "base64url-koodattu merkkijono", + json_string: "JSON-merkkijono", + e164: "E.164-luku", + jwt: "JWT", + template_literal: "templaattimerkkijono" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Virheellinen tyyppi: odotettiin instanceof ${issue2.expected}, oli ${received}`; + } + return `Virheellinen tyyppi: odotettiin ${expected}, oli ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Virheellinen sy\xF6te: t\xE4ytyy olla ${stringifyPrimitive(issue2.values[0])}`; + return `Virheellinen valinta: t\xE4ytyy olla yksi seuraavista: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Liian suuri: ${sizing.subject} t\xE4ytyy olla ${adj}${issue2.maximum.toString()} ${sizing.unit}`.trim(); + } + return `Liian suuri: arvon t\xE4ytyy olla ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Liian pieni: ${sizing.subject} t\xE4ytyy olla ${adj}${issue2.minimum.toString()} ${sizing.unit}`.trim(); + } + return `Liian pieni: arvon t\xE4ytyy olla ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Virheellinen sy\xF6te: t\xE4ytyy alkaa "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Virheellinen sy\xF6te: t\xE4ytyy loppua "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Virheellinen sy\xF6te: t\xE4ytyy sis\xE4lt\xE4\xE4 "${_issue.includes}"`; + if (_issue.format === "regex") { + return `Virheellinen sy\xF6te: t\xE4ytyy vastata s\xE4\xE4nn\xF6llist\xE4 lauseketta ${_issue.pattern}`; + } + return `Virheellinen ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Virheellinen luku: t\xE4ytyy olla luvun ${issue2.divisor} monikerta`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Tuntemattomat avaimet" : "Tuntematon avain"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return "Virheellinen avain tietueessa"; + case "invalid_union": + return "Virheellinen unioni"; + case "invalid_element": + return "Virheellinen arvo joukossa"; + default: + return `Virheellinen sy\xF6te`; + } + }; +}; +function fi_default() { + return { + localeError: error13() + }; +} + +// node_modules/zod/v4/locales/fr.js +var error14 = () => { + const Sizable = { + string: { unit: "caract\xE8res", verb: "avoir" }, + file: { unit: "octets", verb: "avoir" }, + array: { unit: "\xE9l\xE9ments", verb: "avoir" }, + set: { unit: "\xE9l\xE9ments", verb: "avoir" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "entr\xE9e", + email: "adresse e-mail", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "date et heure ISO", + date: "date ISO", + time: "heure ISO", + duration: "dur\xE9e ISO", + ipv4: "adresse IPv4", + ipv6: "adresse IPv6", + cidrv4: "plage IPv4", + cidrv6: "plage IPv6", + base64: "cha\xEEne encod\xE9e en base64", + base64url: "cha\xEEne encod\xE9e en base64url", + json_string: "cha\xEEne JSON", + e164: "num\xE9ro E.164", + jwt: "JWT", + template_literal: "entr\xE9e" + }; + const TypeDictionary = { + nan: "NaN", + number: "nombre", + array: "tableau" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Entr\xE9e invalide : instanceof ${issue2.expected} attendu, ${received} re\xE7u`; + } + return `Entr\xE9e invalide : ${expected} attendu, ${received} re\xE7u`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Entr\xE9e invalide : ${stringifyPrimitive(issue2.values[0])} attendu`; + return `Option invalide : une valeur parmi ${joinValues(issue2.values, "|")} attendue`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Trop grand : ${issue2.origin ?? "valeur"} doit ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\xE9l\xE9ment(s)"}`; + return `Trop grand : ${issue2.origin ?? "valeur"} doit \xEAtre ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Trop petit : ${issue2.origin} doit ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Trop petit : ${issue2.origin} doit \xEAtre ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Cha\xEEne invalide : doit commencer par "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Cha\xEEne invalide : doit se terminer par "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Cha\xEEne invalide : doit inclure "${_issue.includes}"`; + if (_issue.format === "regex") + return `Cha\xEEne invalide : doit correspondre au mod\xE8le ${_issue.pattern}`; + return `${FormatDictionary[_issue.format] ?? issue2.format} invalide`; + } + case "not_multiple_of": + return `Nombre invalide : doit \xEAtre un multiple de ${issue2.divisor}`; + case "unrecognized_keys": + return `Cl\xE9${issue2.keys.length > 1 ? "s" : ""} non reconnue${issue2.keys.length > 1 ? "s" : ""} : ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Cl\xE9 invalide dans ${issue2.origin}`; + case "invalid_union": + return "Entr\xE9e invalide"; + case "invalid_element": + return `Valeur invalide dans ${issue2.origin}`; + default: + return `Entr\xE9e invalide`; + } + }; +}; +function fr_default() { + return { + localeError: error14() + }; +} + +// node_modules/zod/v4/locales/fr-CA.js +var error15 = () => { + const Sizable = { + string: { unit: "caract\xE8res", verb: "avoir" }, + file: { unit: "octets", verb: "avoir" }, + array: { unit: "\xE9l\xE9ments", verb: "avoir" }, + set: { unit: "\xE9l\xE9ments", verb: "avoir" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "entr\xE9e", + email: "adresse courriel", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "date-heure ISO", + date: "date ISO", + time: "heure ISO", + duration: "dur\xE9e ISO", + ipv4: "adresse IPv4", + ipv6: "adresse IPv6", + cidrv4: "plage IPv4", + cidrv6: "plage IPv6", + base64: "cha\xEEne encod\xE9e en base64", + base64url: "cha\xEEne encod\xE9e en base64url", + json_string: "cha\xEEne JSON", + e164: "num\xE9ro E.164", + jwt: "JWT", + template_literal: "entr\xE9e" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Entr\xE9e invalide : attendu instanceof ${issue2.expected}, re\xE7u ${received}`; + } + return `Entr\xE9e invalide : attendu ${expected}, re\xE7u ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Entr\xE9e invalide : attendu ${stringifyPrimitive(issue2.values[0])}`; + return `Option invalide : attendu l'une des valeurs suivantes ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "\u2264" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Trop grand : attendu que ${issue2.origin ?? "la valeur"} ait ${adj}${issue2.maximum.toString()} ${sizing.unit}`; + return `Trop grand : attendu que ${issue2.origin ?? "la valeur"} soit ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? "\u2265" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Trop petit : attendu que ${issue2.origin} ait ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Trop petit : attendu que ${issue2.origin} soit ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Cha\xEEne invalide : doit commencer par "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Cha\xEEne invalide : doit se terminer par "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Cha\xEEne invalide : doit inclure "${_issue.includes}"`; + if (_issue.format === "regex") + return `Cha\xEEne invalide : doit correspondre au motif ${_issue.pattern}`; + return `${FormatDictionary[_issue.format] ?? issue2.format} invalide`; + } + case "not_multiple_of": + return `Nombre invalide : doit \xEAtre un multiple de ${issue2.divisor}`; + case "unrecognized_keys": + return `Cl\xE9${issue2.keys.length > 1 ? "s" : ""} non reconnue${issue2.keys.length > 1 ? "s" : ""} : ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Cl\xE9 invalide dans ${issue2.origin}`; + case "invalid_union": + return "Entr\xE9e invalide"; + case "invalid_element": + return `Valeur invalide dans ${issue2.origin}`; + default: + return `Entr\xE9e invalide`; + } + }; +}; +function fr_CA_default() { + return { + localeError: error15() + }; +} + +// node_modules/zod/v4/locales/he.js +var error16 = () => { + const TypeNames = { + string: { label: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA", gender: "f" }, + number: { label: "\u05DE\u05E1\u05E4\u05E8", gender: "m" }, + boolean: { label: "\u05E2\u05E8\u05DA \u05D1\u05D5\u05DC\u05D9\u05D0\u05E0\u05D9", gender: "m" }, + bigint: { label: "BigInt", gender: "m" }, + date: { label: "\u05EA\u05D0\u05E8\u05D9\u05DA", gender: "m" }, + array: { label: "\u05DE\u05E2\u05E8\u05DA", gender: "m" }, + object: { label: "\u05D0\u05D5\u05D1\u05D9\u05D9\u05E7\u05D8", gender: "m" }, + null: { label: "\u05E2\u05E8\u05DA \u05E8\u05D9\u05E7 (null)", gender: "m" }, + undefined: { label: "\u05E2\u05E8\u05DA \u05DC\u05D0 \u05DE\u05D5\u05D2\u05D3\u05E8 (undefined)", gender: "m" }, + symbol: { label: "\u05E1\u05D9\u05DE\u05D1\u05D5\u05DC (Symbol)", gender: "m" }, + function: { label: "\u05E4\u05D5\u05E0\u05E7\u05E6\u05D9\u05D4", gender: "f" }, + map: { label: "\u05DE\u05E4\u05D4 (Map)", gender: "f" }, + set: { label: "\u05E7\u05D1\u05D5\u05E6\u05D4 (Set)", gender: "f" }, + file: { label: "\u05E7\u05D5\u05D1\u05E5", gender: "m" }, + promise: { label: "Promise", gender: "m" }, + NaN: { label: "NaN", gender: "m" }, + unknown: { label: "\u05E2\u05E8\u05DA \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2", gender: "m" }, + value: { label: "\u05E2\u05E8\u05DA", gender: "m" } + }; + const Sizable = { + string: { unit: "\u05EA\u05D5\u05D5\u05D9\u05DD", shortLabel: "\u05E7\u05E6\u05E8", longLabel: "\u05D0\u05E8\u05D5\u05DA" }, + file: { unit: "\u05D1\u05D9\u05D9\u05D8\u05D9\u05DD", shortLabel: "\u05E7\u05D8\u05DF", longLabel: "\u05D2\u05D3\u05D5\u05DC" }, + array: { unit: "\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD", shortLabel: "\u05E7\u05D8\u05DF", longLabel: "\u05D2\u05D3\u05D5\u05DC" }, + set: { unit: "\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD", shortLabel: "\u05E7\u05D8\u05DF", longLabel: "\u05D2\u05D3\u05D5\u05DC" }, + number: { unit: "", shortLabel: "\u05E7\u05D8\u05DF", longLabel: "\u05D2\u05D3\u05D5\u05DC" } + // no unit + }; + const typeEntry = (t) => t ? TypeNames[t] : void 0; + const typeLabel = (t) => { + const e = typeEntry(t); + if (e) + return e.label; + return t ?? TypeNames.unknown.label; + }; + const withDefinite = (t) => `\u05D4${typeLabel(t)}`; + const verbFor = (t) => { + const e = typeEntry(t); + const gender = e?.gender ?? "m"; + return gender === "f" ? "\u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05D9\u05D5\u05EA" : "\u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA"; + }; + const getSizing = (origin) => { + if (!origin) + return null; + return Sizable[origin] ?? null; + }; + const FormatDictionary = { + regex: { label: "\u05E7\u05DC\u05D8", gender: "m" }, + email: { label: "\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D9\u05DE\u05D9\u05D9\u05DC", gender: "f" }, + url: { label: "\u05DB\u05EA\u05D5\u05D1\u05EA \u05E8\u05E9\u05EA", gender: "f" }, + emoji: { label: "\u05D0\u05D9\u05DE\u05D5\u05D2'\u05D9", gender: "m" }, + uuid: { label: "UUID", gender: "m" }, + nanoid: { label: "nanoid", gender: "m" }, + guid: { label: "GUID", gender: "m" }, + cuid: { label: "cuid", gender: "m" }, + cuid2: { label: "cuid2", gender: "m" }, + ulid: { label: "ULID", gender: "m" }, + xid: { label: "XID", gender: "m" }, + ksuid: { label: "KSUID", gender: "m" }, + datetime: { label: "\u05EA\u05D0\u05E8\u05D9\u05DA \u05D5\u05D6\u05DE\u05DF ISO", gender: "m" }, + date: { label: "\u05EA\u05D0\u05E8\u05D9\u05DA ISO", gender: "m" }, + time: { label: "\u05D6\u05DE\u05DF ISO", gender: "m" }, + duration: { label: "\u05DE\u05E9\u05DA \u05D6\u05DE\u05DF ISO", gender: "m" }, + ipv4: { label: "\u05DB\u05EA\u05D5\u05D1\u05EA IPv4", gender: "f" }, + ipv6: { label: "\u05DB\u05EA\u05D5\u05D1\u05EA IPv6", gender: "f" }, + cidrv4: { label: "\u05D8\u05D5\u05D5\u05D7 IPv4", gender: "m" }, + cidrv6: { label: "\u05D8\u05D5\u05D5\u05D7 IPv6", gender: "m" }, + base64: { label: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64", gender: "f" }, + base64url: { label: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64 \u05DC\u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05E8\u05E9\u05EA", gender: "f" }, + json_string: { label: "\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA JSON", gender: "f" }, + e164: { label: "\u05DE\u05E1\u05E4\u05E8 E.164", gender: "m" }, + jwt: { label: "JWT", gender: "m" }, + ends_with: { label: "\u05E7\u05DC\u05D8", gender: "m" }, + includes: { label: "\u05E7\u05DC\u05D8", gender: "m" }, + lowercase: { label: "\u05E7\u05DC\u05D8", gender: "m" }, + starts_with: { label: "\u05E7\u05DC\u05D8", gender: "m" }, + uppercase: { label: "\u05E7\u05DC\u05D8", gender: "m" } + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expectedKey = issue2.expected; + const expected = TypeDictionary[expectedKey ?? ""] ?? typeLabel(expectedKey); + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? TypeNames[receivedType]?.label ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA instanceof ${issue2.expected}, \u05D4\u05EA\u05E7\u05D1\u05DC ${received}`; + } + return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${expected}, \u05D4\u05EA\u05E7\u05D1\u05DC ${received}`; + } + case "invalid_value": { + if (issue2.values.length === 1) { + return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05E2\u05E8\u05DA \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA ${stringifyPrimitive(issue2.values[0])}`; + } + const stringified = issue2.values.map((v) => stringifyPrimitive(v)); + if (issue2.values.length === 2) { + return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DF ${stringified[0]} \u05D0\u05D5 ${stringified[1]}`; + } + const lastValue = stringified[stringified.length - 1]; + const restValues = stringified.slice(0, -1).join(", "); + return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DF ${restValues} \u05D0\u05D5 ${lastValue}`; + } + case "too_big": { + const sizing = getSizing(issue2.origin); + const subject = withDefinite(issue2.origin ?? "value"); + if (issue2.origin === "string") { + return `${sizing?.longLabel ?? "\u05D0\u05E8\u05D5\u05DA"} \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05DB\u05D9\u05DC ${issue2.maximum.toString()} ${sizing?.unit ?? ""} ${issue2.inclusive ? "\u05D0\u05D5 \u05E4\u05D7\u05D5\u05EA" : "\u05DC\u05DB\u05DC \u05D4\u05D9\u05D5\u05EA\u05E8"}`.trim(); + } + if (issue2.origin === "number") { + const comparison = issue2.inclusive ? `\u05E7\u05D8\u05DF \u05D0\u05D5 \u05E9\u05D5\u05D5\u05D4 \u05DC-${issue2.maximum}` : `\u05E7\u05D8\u05DF \u05DE-${issue2.maximum}`; + return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${comparison}`; + } + if (issue2.origin === "array" || issue2.origin === "set") { + const verb = issue2.origin === "set" ? "\u05E6\u05E8\u05D9\u05DB\u05D4" : "\u05E6\u05E8\u05D9\u05DA"; + const comparison = issue2.inclusive ? `${issue2.maximum} ${sizing?.unit ?? ""} \u05D0\u05D5 \u05E4\u05D7\u05D5\u05EA` : `\u05E4\u05D7\u05D5\u05EA \u05DE-${issue2.maximum} ${sizing?.unit ?? ""}`; + return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${comparison}`.trim(); + } + const adj = issue2.inclusive ? "<=" : "<"; + const be = verbFor(issue2.origin ?? "value"); + if (sizing?.unit) { + return `${sizing.longLabel} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue2.maximum.toString()} ${sizing.unit}`; + } + return `${sizing?.longLabel ?? "\u05D2\u05D3\u05D5\u05DC"} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const sizing = getSizing(issue2.origin); + const subject = withDefinite(issue2.origin ?? "value"); + if (issue2.origin === "string") { + return `${sizing?.shortLabel ?? "\u05E7\u05E6\u05E8"} \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05DB\u05D9\u05DC ${issue2.minimum.toString()} ${sizing?.unit ?? ""} ${issue2.inclusive ? "\u05D0\u05D5 \u05D9\u05D5\u05EA\u05E8" : "\u05DC\u05E4\u05D7\u05D5\u05EA"}`.trim(); + } + if (issue2.origin === "number") { + const comparison = issue2.inclusive ? `\u05D2\u05D3\u05D5\u05DC \u05D0\u05D5 \u05E9\u05D5\u05D5\u05D4 \u05DC-${issue2.minimum}` : `\u05D2\u05D3\u05D5\u05DC \u05DE-${issue2.minimum}`; + return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${comparison}`; + } + if (issue2.origin === "array" || issue2.origin === "set") { + const verb = issue2.origin === "set" ? "\u05E6\u05E8\u05D9\u05DB\u05D4" : "\u05E6\u05E8\u05D9\u05DA"; + if (issue2.minimum === 1 && issue2.inclusive) { + const singularPhrase = issue2.origin === "set" ? "\u05DC\u05E4\u05D7\u05D5\u05EA \u05E4\u05E8\u05D9\u05D8 \u05D0\u05D7\u05D3" : "\u05DC\u05E4\u05D7\u05D5\u05EA \u05E4\u05E8\u05D9\u05D8 \u05D0\u05D7\u05D3"; + return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${singularPhrase}`; + } + const comparison = issue2.inclusive ? `${issue2.minimum} ${sizing?.unit ?? ""} \u05D0\u05D5 \u05D9\u05D5\u05EA\u05E8` : `\u05D9\u05D5\u05EA\u05E8 \u05DE-${issue2.minimum} ${sizing?.unit ?? ""}`; + return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${comparison}`.trim(); + } + const adj = issue2.inclusive ? ">=" : ">"; + const be = verbFor(issue2.origin ?? "value"); + if (sizing?.unit) { + return `${sizing.shortLabel} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `${sizing?.shortLabel ?? "\u05E7\u05D8\u05DF"} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D1 "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05E1\u05EA\u05D9\u05D9\u05DD \u05D1 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05DB\u05DC\u05D5\u05DC "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D0\u05D9\u05DD \u05DC\u05EA\u05D1\u05E0\u05D9\u05EA ${_issue.pattern}`; + const nounEntry = FormatDictionary[_issue.format]; + const noun = nounEntry?.label ?? _issue.format; + const gender = nounEntry?.gender ?? "m"; + const adjective = gender === "f" ? "\u05EA\u05E7\u05D9\u05E0\u05D4" : "\u05EA\u05E7\u05D9\u05DF"; + return `${noun} \u05DC\u05D0 ${adjective}`; + } + case "not_multiple_of": + return `\u05DE\u05E1\u05E4\u05E8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05DB\u05E4\u05DC\u05D4 \u05E9\u05DC ${issue2.divisor}`; + case "unrecognized_keys": + return `\u05DE\u05E4\u05EA\u05D7${issue2.keys.length > 1 ? "\u05D5\u05EA" : ""} \u05DC\u05D0 \u05DE\u05D6\u05D5\u05D4${issue2.keys.length > 1 ? "\u05D9\u05DD" : "\u05D4"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": { + return `\u05E9\u05D3\u05D4 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1\u05D0\u05D5\u05D1\u05D9\u05D9\u05E7\u05D8`; + } + case "invalid_union": + return "\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF"; + case "invalid_element": { + const place = withDefinite(issue2.origin ?? "array"); + return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1${place}`; + } + default: + return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF`; + } + }; +}; +function he_default() { + return { + localeError: error16() + }; +} + +// node_modules/zod/v4/locales/hu.js +var error17 = () => { + const Sizable = { + string: { unit: "karakter", verb: "legyen" }, + file: { unit: "byte", verb: "legyen" }, + array: { unit: "elem", verb: "legyen" }, + set: { unit: "elem", verb: "legyen" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "bemenet", + email: "email c\xEDm", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO id\u0151b\xE9lyeg", + date: "ISO d\xE1tum", + time: "ISO id\u0151", + duration: "ISO id\u0151intervallum", + ipv4: "IPv4 c\xEDm", + ipv6: "IPv6 c\xEDm", + cidrv4: "IPv4 tartom\xE1ny", + cidrv6: "IPv6 tartom\xE1ny", + base64: "base64-k\xF3dolt string", + base64url: "base64url-k\xF3dolt string", + json_string: "JSON string", + e164: "E.164 sz\xE1m", + jwt: "JWT", + template_literal: "bemenet" + }; + const TypeDictionary = { + nan: "NaN", + number: "sz\xE1m", + array: "t\xF6mb" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\xC9rv\xE9nytelen bemenet: a v\xE1rt \xE9rt\xE9k instanceof ${issue2.expected}, a kapott \xE9rt\xE9k ${received}`; + } + return `\xC9rv\xE9nytelen bemenet: a v\xE1rt \xE9rt\xE9k ${expected}, a kapott \xE9rt\xE9k ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\xC9rv\xE9nytelen bemenet: a v\xE1rt \xE9rt\xE9k ${stringifyPrimitive(issue2.values[0])}`; + return `\xC9rv\xE9nytelen opci\xF3: valamelyik \xE9rt\xE9k v\xE1rt ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `T\xFAl nagy: ${issue2.origin ?? "\xE9rt\xE9k"} m\xE9rete t\xFAl nagy ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elem"}`; + return `T\xFAl nagy: a bemeneti \xE9rt\xE9k ${issue2.origin ?? "\xE9rt\xE9k"} t\xFAl nagy: ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `T\xFAl kicsi: a bemeneti \xE9rt\xE9k ${issue2.origin} m\xE9rete t\xFAl kicsi ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `T\xFAl kicsi: a bemeneti \xE9rt\xE9k ${issue2.origin} t\xFAl kicsi ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\xC9rv\xE9nytelen string: "${_issue.prefix}" \xE9rt\xE9kkel kell kezd\u0151dnie`; + if (_issue.format === "ends_with") + return `\xC9rv\xE9nytelen string: "${_issue.suffix}" \xE9rt\xE9kkel kell v\xE9gz\u0151dnie`; + if (_issue.format === "includes") + return `\xC9rv\xE9nytelen string: "${_issue.includes}" \xE9rt\xE9ket kell tartalmaznia`; + if (_issue.format === "regex") + return `\xC9rv\xE9nytelen string: ${_issue.pattern} mint\xE1nak kell megfelelnie`; + return `\xC9rv\xE9nytelen ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\xC9rv\xE9nytelen sz\xE1m: ${issue2.divisor} t\xF6bbsz\xF6r\xF6s\xE9nek kell lennie`; + case "unrecognized_keys": + return `Ismeretlen kulcs${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\xC9rv\xE9nytelen kulcs ${issue2.origin}`; + case "invalid_union": + return "\xC9rv\xE9nytelen bemenet"; + case "invalid_element": + return `\xC9rv\xE9nytelen \xE9rt\xE9k: ${issue2.origin}`; + default: + return `\xC9rv\xE9nytelen bemenet`; + } + }; +}; +function hu_default() { + return { + localeError: error17() + }; +} + +// node_modules/zod/v4/locales/hy.js +function getArmenianPlural(count, one, many) { + return Math.abs(count) === 1 ? one : many; +} +function withDefiniteArticle(word) { + if (!word) + return ""; + const vowels = ["\u0561", "\u0565", "\u0568", "\u056B", "\u0578", "\u0578\u0582", "\u0585"]; + const lastChar = word[word.length - 1]; + return word + (vowels.includes(lastChar) ? "\u0576" : "\u0568"); +} +var error18 = () => { + const Sizable = { + string: { + unit: { + one: "\u0576\u0577\u0561\u0576", + many: "\u0576\u0577\u0561\u0576\u0576\u0565\u0580" + }, + verb: "\u0578\u0582\u0576\u0565\u0576\u0561\u056C" + }, + file: { + unit: { + one: "\u0562\u0561\u0575\u0569", + many: "\u0562\u0561\u0575\u0569\u0565\u0580" + }, + verb: "\u0578\u0582\u0576\u0565\u0576\u0561\u056C" + }, + array: { + unit: { + one: "\u057F\u0561\u0580\u0580", + many: "\u057F\u0561\u0580\u0580\u0565\u0580" + }, + verb: "\u0578\u0582\u0576\u0565\u0576\u0561\u056C" + }, + set: { + unit: { + one: "\u057F\u0561\u0580\u0580", + many: "\u057F\u0561\u0580\u0580\u0565\u0580" + }, + verb: "\u0578\u0582\u0576\u0565\u0576\u0561\u056C" + } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0574\u0578\u0582\u057F\u0584", + email: "\u0567\u056C. \u0570\u0561\u057D\u0581\u0565", + url: "URL", + emoji: "\u0567\u0574\u0578\u057B\u056B", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0561\u0574\u057D\u0561\u0569\u056B\u057E \u0587 \u056A\u0561\u0574", + date: "ISO \u0561\u0574\u057D\u0561\u0569\u056B\u057E", + time: "ISO \u056A\u0561\u0574", + duration: "ISO \u057F\u0587\u0578\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576", + ipv4: "IPv4 \u0570\u0561\u057D\u0581\u0565", + ipv6: "IPv6 \u0570\u0561\u057D\u0581\u0565", + cidrv4: "IPv4 \u0574\u056B\u057B\u0561\u056F\u0561\u0575\u0584", + cidrv6: "IPv6 \u0574\u056B\u057B\u0561\u056F\u0561\u0575\u0584", + base64: "base64 \u0571\u0587\u0561\u0579\u0561\u0583\u0578\u057E \u057F\u0578\u0572", + base64url: "base64url \u0571\u0587\u0561\u0579\u0561\u0583\u0578\u057E \u057F\u0578\u0572", + json_string: "JSON \u057F\u0578\u0572", + e164: "E.164 \u0570\u0561\u0574\u0561\u0580", + jwt: "JWT", + template_literal: "\u0574\u0578\u0582\u057F\u0584" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0569\u056B\u057E", + array: "\u0566\u0561\u0576\u0563\u057E\u0561\u056E" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 instanceof ${issue2.expected}, \u057D\u057F\u0561\u0581\u057E\u0565\u056C \u0567 ${received}`; + } + return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 ${expected}, \u057D\u057F\u0561\u0581\u057E\u0565\u056C \u0567 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 ${stringifyPrimitive(issue2.values[1])}`; + return `\u054D\u056D\u0561\u056C \u057F\u0561\u0580\u0562\u0565\u0580\u0561\u056F\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 \u0570\u0565\u057F\u0587\u0575\u0561\u056C\u0576\u0565\u0580\u056B\u0581 \u0574\u0565\u056F\u0568\u055D ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const maxValue = Number(issue2.maximum); + const unit = getArmenianPlural(maxValue, sizing.unit.one, sizing.unit.many); + return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0574\u0565\u056E \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue2.origin ?? "\u0561\u0580\u056A\u0565\u0584")} \u056F\u0578\u0582\u0576\u0565\u0576\u0561 ${adj}${issue2.maximum.toString()} ${unit}`; + } + return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0574\u0565\u056E \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue2.origin ?? "\u0561\u0580\u056A\u0565\u0584")} \u056C\u056B\u0576\u056B ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const minValue = Number(issue2.minimum); + const unit = getArmenianPlural(minValue, sizing.unit.one, sizing.unit.many); + return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0583\u0578\u0584\u0580 \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue2.origin)} \u056F\u0578\u0582\u0576\u0565\u0576\u0561 ${adj}${issue2.minimum.toString()} ${unit}`; + } + return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0583\u0578\u0584\u0580 \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue2.origin)} \u056C\u056B\u0576\u056B ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u057D\u056F\u057D\u057E\u056B "${_issue.prefix}"-\u0578\u057E`; + if (_issue.format === "ends_with") + return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0561\u057E\u0561\u0580\u057F\u057E\u056B "${_issue.suffix}"-\u0578\u057E`; + if (_issue.format === "includes") + return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u057A\u0561\u0580\u0578\u0582\u0576\u0561\u056F\u056B "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0570\u0561\u0574\u0561\u057A\u0561\u057F\u0561\u057D\u056D\u0561\u0576\u056B ${_issue.pattern} \u0571\u0587\u0561\u0579\u0561\u0583\u056B\u0576`; + return `\u054D\u056D\u0561\u056C ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u054D\u056D\u0561\u056C \u0569\u056B\u057E\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0562\u0561\u0566\u0574\u0561\u057A\u0561\u057F\u056B\u056F \u056C\u056B\u0576\u056B ${issue2.divisor}-\u056B`; + case "unrecognized_keys": + return `\u0549\u0573\u0561\u0576\u0561\u0579\u057E\u0561\u056E \u0562\u0561\u0576\u0561\u056C\u056B${issue2.keys.length > 1 ? "\u0576\u0565\u0580" : ""}. ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u054D\u056D\u0561\u056C \u0562\u0561\u0576\u0561\u056C\u056B ${withDefiniteArticle(issue2.origin)}-\u0578\u0582\u0574`; + case "invalid_union": + return "\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574"; + case "invalid_element": + return `\u054D\u056D\u0561\u056C \u0561\u0580\u056A\u0565\u0584 ${withDefiniteArticle(issue2.origin)}-\u0578\u0582\u0574`; + default: + return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574`; + } + }; +}; +function hy_default() { + return { + localeError: error18() + }; +} + +// node_modules/zod/v4/locales/id.js +var error19 = () => { + const Sizable = { + string: { unit: "karakter", verb: "memiliki" }, + file: { unit: "byte", verb: "memiliki" }, + array: { unit: "item", verb: "memiliki" }, + set: { unit: "item", verb: "memiliki" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "input", + email: "alamat email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "tanggal dan waktu format ISO", + date: "tanggal format ISO", + time: "jam format ISO", + duration: "durasi format ISO", + ipv4: "alamat IPv4", + ipv6: "alamat IPv6", + cidrv4: "rentang alamat IPv4", + cidrv6: "rentang alamat IPv6", + base64: "string dengan enkode base64", + base64url: "string dengan enkode base64url", + json_string: "string JSON", + e164: "angka E.164", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Input tidak valid: diharapkan instanceof ${issue2.expected}, diterima ${received}`; + } + return `Input tidak valid: diharapkan ${expected}, diterima ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Input tidak valid: diharapkan ${stringifyPrimitive(issue2.values[0])}`; + return `Pilihan tidak valid: diharapkan salah satu dari ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Terlalu besar: diharapkan ${issue2.origin ?? "value"} memiliki ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elemen"}`; + return `Terlalu besar: diharapkan ${issue2.origin ?? "value"} menjadi ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Terlalu kecil: diharapkan ${issue2.origin} memiliki ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Terlalu kecil: diharapkan ${issue2.origin} menjadi ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `String tidak valid: harus dimulai dengan "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `String tidak valid: harus berakhir dengan "${_issue.suffix}"`; + if (_issue.format === "includes") + return `String tidak valid: harus menyertakan "${_issue.includes}"`; + if (_issue.format === "regex") + return `String tidak valid: harus sesuai pola ${_issue.pattern}`; + return `${FormatDictionary[_issue.format] ?? issue2.format} tidak valid`; + } + case "not_multiple_of": + return `Angka tidak valid: harus kelipatan dari ${issue2.divisor}`; + case "unrecognized_keys": + return `Kunci tidak dikenali ${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Kunci tidak valid di ${issue2.origin}`; + case "invalid_union": + return "Input tidak valid"; + case "invalid_element": + return `Nilai tidak valid di ${issue2.origin}`; + default: + return `Input tidak valid`; + } + }; +}; +function id_default() { + return { + localeError: error19() + }; +} + +// node_modules/zod/v4/locales/is.js +var error20 = () => { + const Sizable = { + string: { unit: "stafi", verb: "a\xF0 hafa" }, + file: { unit: "b\xE6ti", verb: "a\xF0 hafa" }, + array: { unit: "hluti", verb: "a\xF0 hafa" }, + set: { unit: "hluti", verb: "a\xF0 hafa" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "gildi", + email: "netfang", + url: "vefsl\xF3\xF0", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO dagsetning og t\xEDmi", + date: "ISO dagsetning", + time: "ISO t\xEDmi", + duration: "ISO t\xEDmalengd", + ipv4: "IPv4 address", + ipv6: "IPv6 address", + cidrv4: "IPv4 range", + cidrv6: "IPv6 range", + base64: "base64-encoded strengur", + base64url: "base64url-encoded strengur", + json_string: "JSON strengur", + e164: "E.164 t\xF6lugildi", + jwt: "JWT", + template_literal: "gildi" + }; + const TypeDictionary = { + nan: "NaN", + number: "n\xFAmer", + array: "fylki" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Rangt gildi: \xDE\xFA sl\xF3st inn ${received} \xFEar sem \xE1 a\xF0 vera instanceof ${issue2.expected}`; + } + return `Rangt gildi: \xDE\xFA sl\xF3st inn ${received} \xFEar sem \xE1 a\xF0 vera ${expected}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Rangt gildi: gert r\xE1\xF0 fyrir ${stringifyPrimitive(issue2.values[0])}`; + return `\xD3gilt val: m\xE1 vera eitt af eftirfarandi ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Of st\xF3rt: gert er r\xE1\xF0 fyrir a\xF0 ${issue2.origin ?? "gildi"} hafi ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "hluti"}`; + return `Of st\xF3rt: gert er r\xE1\xF0 fyrir a\xF0 ${issue2.origin ?? "gildi"} s\xE9 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Of l\xEDti\xF0: gert er r\xE1\xF0 fyrir a\xF0 ${issue2.origin} hafi ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Of l\xEDti\xF0: gert er r\xE1\xF0 fyrir a\xF0 ${issue2.origin} s\xE9 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\xD3gildur strengur: ver\xF0ur a\xF0 byrja \xE1 "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\xD3gildur strengur: ver\xF0ur a\xF0 enda \xE1 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\xD3gildur strengur: ver\xF0ur a\xF0 innihalda "${_issue.includes}"`; + if (_issue.format === "regex") + return `\xD3gildur strengur: ver\xF0ur a\xF0 fylgja mynstri ${_issue.pattern}`; + return `Rangt ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `R\xF6ng tala: ver\xF0ur a\xF0 vera margfeldi af ${issue2.divisor}`; + case "unrecognized_keys": + return `\xD3\xFEekkt ${issue2.keys.length > 1 ? "ir lyklar" : "ur lykill"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Rangur lykill \xED ${issue2.origin}`; + case "invalid_union": + return "Rangt gildi"; + case "invalid_element": + return `Rangt gildi \xED ${issue2.origin}`; + default: + return `Rangt gildi`; + } + }; +}; +function is_default() { + return { + localeError: error20() + }; +} + +// node_modules/zod/v4/locales/it.js +var error21 = () => { + const Sizable = { + string: { unit: "caratteri", verb: "avere" }, + file: { unit: "byte", verb: "avere" }, + array: { unit: "elementi", verb: "avere" }, + set: { unit: "elementi", verb: "avere" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "input", + email: "indirizzo email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data e ora ISO", + date: "data ISO", + time: "ora ISO", + duration: "durata ISO", + ipv4: "indirizzo IPv4", + ipv6: "indirizzo IPv6", + cidrv4: "intervallo IPv4", + cidrv6: "intervallo IPv6", + base64: "stringa codificata in base64", + base64url: "URL codificata in base64", + json_string: "stringa JSON", + e164: "numero E.164", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + nan: "NaN", + number: "numero", + array: "vettore" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Input non valido: atteso instanceof ${issue2.expected}, ricevuto ${received}`; + } + return `Input non valido: atteso ${expected}, ricevuto ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Input non valido: atteso ${stringifyPrimitive(issue2.values[0])}`; + return `Opzione non valida: atteso uno tra ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Troppo grande: ${issue2.origin ?? "valore"} deve avere ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementi"}`; + return `Troppo grande: ${issue2.origin ?? "valore"} deve essere ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Troppo piccolo: ${issue2.origin} deve avere ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Troppo piccolo: ${issue2.origin} deve essere ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Stringa non valida: deve iniziare con "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Stringa non valida: deve terminare con "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Stringa non valida: deve includere "${_issue.includes}"`; + if (_issue.format === "regex") + return `Stringa non valida: deve corrispondere al pattern ${_issue.pattern}`; + return `Invalid ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Numero non valido: deve essere un multiplo di ${issue2.divisor}`; + case "unrecognized_keys": + return `Chiav${issue2.keys.length > 1 ? "i" : "e"} non riconosciut${issue2.keys.length > 1 ? "e" : "a"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Chiave non valida in ${issue2.origin}`; + case "invalid_union": + return "Input non valido"; + case "invalid_element": + return `Valore non valido in ${issue2.origin}`; + default: + return `Input non valido`; + } + }; +}; +function it_default() { + return { + localeError: error21() + }; +} + +// node_modules/zod/v4/locales/ja.js +var error22 = () => { + const Sizable = { + string: { unit: "\u6587\u5B57", verb: "\u3067\u3042\u308B" }, + file: { unit: "\u30D0\u30A4\u30C8", verb: "\u3067\u3042\u308B" }, + array: { unit: "\u8981\u7D20", verb: "\u3067\u3042\u308B" }, + set: { unit: "\u8981\u7D20", verb: "\u3067\u3042\u308B" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u5165\u529B\u5024", + email: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9", + url: "URL", + emoji: "\u7D75\u6587\u5B57", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO\u65E5\u6642", + date: "ISO\u65E5\u4ED8", + time: "ISO\u6642\u523B", + duration: "ISO\u671F\u9593", + ipv4: "IPv4\u30A2\u30C9\u30EC\u30B9", + ipv6: "IPv6\u30A2\u30C9\u30EC\u30B9", + cidrv4: "IPv4\u7BC4\u56F2", + cidrv6: "IPv6\u7BC4\u56F2", + base64: "base64\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217", + base64url: "base64url\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217", + json_string: "JSON\u6587\u5B57\u5217", + e164: "E.164\u756A\u53F7", + jwt: "JWT", + template_literal: "\u5165\u529B\u5024" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u6570\u5024", + array: "\u914D\u5217" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u7121\u52B9\u306A\u5165\u529B: instanceof ${issue2.expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${received}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`; + } + return `\u7121\u52B9\u306A\u5165\u529B: ${expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${received}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u7121\u52B9\u306A\u5165\u529B: ${stringifyPrimitive(issue2.values[0])}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F`; + return `\u7121\u52B9\u306A\u9078\u629E: ${joinValues(issue2.values, "\u3001")}\u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + case "too_big": { + const adj = issue2.inclusive ? "\u4EE5\u4E0B\u3067\u3042\u308B" : "\u3088\u308A\u5C0F\u3055\u3044"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue2.origin ?? "\u5024"}\u306F${issue2.maximum.toString()}${sizing.unit ?? "\u8981\u7D20"}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue2.origin ?? "\u5024"}\u306F${issue2.maximum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + } + case "too_small": { + const adj = issue2.inclusive ? "\u4EE5\u4E0A\u3067\u3042\u308B" : "\u3088\u308A\u5927\u304D\u3044"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue2.origin}\u306F${issue2.minimum.toString()}${sizing.unit}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue2.origin}\u306F${issue2.minimum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.prefix}"\u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + if (_issue.format === "ends_with") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.suffix}"\u3067\u7D42\u308F\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + if (_issue.format === "includes") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: "${_issue.includes}"\u3092\u542B\u3080\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + if (_issue.format === "regex") + return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \u30D1\u30BF\u30FC\u30F3${_issue.pattern}\u306B\u4E00\u81F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + return `\u7121\u52B9\u306A${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u7121\u52B9\u306A\u6570\u5024: ${issue2.divisor}\u306E\u500D\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`; + case "unrecognized_keys": + return `\u8A8D\u8B58\u3055\u308C\u3066\u3044\u306A\u3044\u30AD\u30FC${issue2.keys.length > 1 ? "\u7FA4" : ""}: ${joinValues(issue2.keys, "\u3001")}`; + case "invalid_key": + return `${issue2.origin}\u5185\u306E\u7121\u52B9\u306A\u30AD\u30FC`; + case "invalid_union": + return "\u7121\u52B9\u306A\u5165\u529B"; + case "invalid_element": + return `${issue2.origin}\u5185\u306E\u7121\u52B9\u306A\u5024`; + default: + return `\u7121\u52B9\u306A\u5165\u529B`; + } + }; +}; +function ja_default() { + return { + localeError: error22() + }; +} + +// node_modules/zod/v4/locales/ka.js +var error23 = () => { + const Sizable = { + string: { unit: "\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD", verb: "\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1" }, + file: { unit: "\u10D1\u10D0\u10D8\u10E2\u10D8", verb: "\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1" }, + array: { unit: "\u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8", verb: "\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1" }, + set: { unit: "\u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8", verb: "\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0", + email: "\u10D4\u10DA-\u10E4\u10DD\u10E1\u10E2\u10D8\u10E1 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8", + url: "URL", + emoji: "\u10D4\u10DB\u10DD\u10EF\u10D8", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u10D7\u10D0\u10E0\u10D8\u10E6\u10D8-\u10D3\u10E0\u10DD", + date: "\u10D7\u10D0\u10E0\u10D8\u10E6\u10D8", + time: "\u10D3\u10E0\u10DD", + duration: "\u10EE\u10D0\u10DC\u10D2\u10E0\u10EB\u10DA\u10D8\u10D5\u10DD\u10D1\u10D0", + ipv4: "IPv4 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8", + ipv6: "IPv6 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8", + cidrv4: "IPv4 \u10D3\u10D8\u10D0\u10DE\u10D0\u10D6\u10DD\u10DC\u10D8", + cidrv6: "IPv6 \u10D3\u10D8\u10D0\u10DE\u10D0\u10D6\u10DD\u10DC\u10D8", + base64: "base64-\u10D9\u10DD\u10D3\u10D8\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8", + base64url: "base64url-\u10D9\u10DD\u10D3\u10D8\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8", + json_string: "JSON \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8", + e164: "E.164 \u10DC\u10DD\u10DB\u10D4\u10E0\u10D8", + jwt: "JWT", + template_literal: "\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u10E0\u10D8\u10EA\u10EE\u10D5\u10D8", + string: "\u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8", + boolean: "\u10D1\u10E3\u10DA\u10D4\u10D0\u10DC\u10D8", + function: "\u10E4\u10E3\u10DC\u10E5\u10EA\u10D8\u10D0", + array: "\u10DB\u10D0\u10E1\u10D8\u10D5\u10D8" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 instanceof ${issue2.expected}, \u10DB\u10D8\u10E6\u10D4\u10D1\u10E3\u10DA\u10D8 ${received}`; + } + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${expected}, \u10DB\u10D8\u10E6\u10D4\u10D1\u10E3\u10DA\u10D8 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${stringifyPrimitive(issue2.values[0])}`; + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D5\u10D0\u10E0\u10D8\u10D0\u10DC\u10E2\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8\u10D0 \u10D4\u10E0\u10D7-\u10D4\u10E0\u10D7\u10D8 ${joinValues(issue2.values, "|")}-\u10D3\u10D0\u10DC`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10D3\u10D8\u10D3\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue2.origin ?? "\u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0"} ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit}`; + return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10D3\u10D8\u10D3\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue2.origin ?? "\u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0"} \u10D8\u10E7\u10DD\u10E1 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10DE\u10D0\u10E2\u10D0\u10E0\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10DE\u10D0\u10E2\u10D0\u10E0\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue2.origin} \u10D8\u10E7\u10DD\u10E1 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10D8\u10EC\u10E7\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 "${_issue.prefix}"-\u10D8\u10D7`; + } + if (_issue.format === "ends_with") + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10DB\u10D7\u10D0\u10D5\u10E0\u10D3\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 "${_issue.suffix}"-\u10D8\u10D7`; + if (_issue.format === "includes") + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1 "${_issue.includes}"-\u10E1`; + if (_issue.format === "regex") + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D4\u10E1\u10D0\u10D1\u10D0\u10DB\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 \u10E8\u10D0\u10D1\u10DA\u10DD\u10DC\u10E1 ${_issue.pattern}`; + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E0\u10D8\u10EA\u10EE\u10D5\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10D8\u10E7\u10DD\u10E1 ${issue2.divisor}-\u10D8\u10E1 \u10EF\u10D4\u10E0\u10D0\u10D3\u10D8`; + case "unrecognized_keys": + return `\u10E3\u10EA\u10DC\u10DD\u10D1\u10D8 \u10D2\u10D0\u10E1\u10D0\u10E6\u10D4\u10D1${issue2.keys.length > 1 ? "\u10D4\u10D1\u10D8" : "\u10D8"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D2\u10D0\u10E1\u10D0\u10E6\u10D4\u10D1\u10D8 ${issue2.origin}-\u10E8\u10D8`; + case "invalid_union": + return "\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0"; + case "invalid_element": + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0 ${issue2.origin}-\u10E8\u10D8`; + default: + return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0`; + } + }; +}; +function ka_default() { + return { + localeError: error23() + }; +} + +// node_modules/zod/v4/locales/km.js +var error24 = () => { + const Sizable = { + string: { unit: "\u178F\u17BD\u17A2\u1780\u17D2\u179F\u179A", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" }, + file: { unit: "\u1794\u17C3", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" }, + array: { unit: "\u1792\u17B6\u178F\u17BB", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" }, + set: { unit: "\u1792\u17B6\u178F\u17BB", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B", + email: "\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793\u17A2\u17CA\u17B8\u1798\u17C2\u179B", + url: "URL", + emoji: "\u179F\u1789\u17D2\u1789\u17B6\u17A2\u17B6\u179A\u1798\u17D2\u1798\u178E\u17CD", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 \u1793\u17B7\u1784\u1798\u17C9\u17C4\u1784 ISO", + date: "\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 ISO", + time: "\u1798\u17C9\u17C4\u1784 ISO", + duration: "\u179A\u1799\u17C8\u1796\u17C1\u179B ISO", + ipv4: "\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4", + ipv6: "\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6", + cidrv4: "\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4", + cidrv6: "\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6", + base64: "\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64", + base64url: "\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64url", + json_string: "\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A JSON", + e164: "\u179B\u17C1\u1781 E.164", + jwt: "JWT", + template_literal: "\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u179B\u17C1\u1781", + array: "\u17A2\u17B6\u179A\u17C1 (Array)", + null: "\u1782\u17D2\u1798\u17B6\u1793\u178F\u1798\u17D2\u179B\u17C3 (null)" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A instanceof ${issue2.expected} \u1794\u17C9\u17BB\u1793\u17D2\u178F\u17C2\u1791\u1791\u17BD\u179B\u1794\u17B6\u1793 ${received}`; + } + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${expected} \u1794\u17C9\u17BB\u1793\u17D2\u178F\u17C2\u1791\u1791\u17BD\u179B\u1794\u17B6\u1793 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${stringifyPrimitive(issue2.values[0])}`; + return `\u1787\u1798\u17D2\u179A\u17BE\u179F\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1787\u17B6\u1798\u17BD\u1799\u1780\u17D2\u1793\u17BB\u1784\u1785\u17C6\u178E\u17C4\u1798 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin ?? "\u178F\u1798\u17D2\u179B\u17C3"} ${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "\u1792\u17B6\u178F\u17BB"}`; + return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin ?? "\u178F\u1798\u17D2\u179B\u17C3"} ${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin} ${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue2.origin} ${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1785\u17B6\u1794\u17CB\u1795\u17D2\u178F\u17BE\u1798\u178A\u17C4\u1799 "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1794\u1789\u17D2\u1785\u1794\u17CB\u178A\u17C4\u1799 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1798\u17B6\u1793 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1795\u17D2\u1782\u17BC\u1795\u17D2\u1782\u1784\u1793\u17B9\u1784\u1791\u1798\u17D2\u179A\u1784\u17CB\u178A\u17C2\u179B\u1794\u17B6\u1793\u1780\u17C6\u178E\u178F\u17CB ${_issue.pattern}`; + return `\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u179B\u17C1\u1781\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1787\u17B6\u1796\u17A0\u17BB\u1782\u17BB\u178E\u1793\u17C3 ${issue2.divisor}`; + case "unrecognized_keys": + return `\u179A\u1780\u1783\u17BE\u1789\u179F\u17C4\u1798\u17B7\u1793\u179F\u17D2\u1782\u17B6\u179B\u17CB\u17D6 ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u179F\u17C4\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue2.origin}`; + case "invalid_union": + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`; + case "invalid_element": + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue2.origin}`; + default: + return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`; + } + }; +}; +function km_default() { + return { + localeError: error24() + }; +} + +// node_modules/zod/v4/locales/kh.js +function kh_default() { + return km_default(); +} + +// node_modules/zod/v4/locales/ko.js +var error25 = () => { + const Sizable = { + string: { unit: "\uBB38\uC790", verb: "to have" }, + file: { unit: "\uBC14\uC774\uD2B8", verb: "to have" }, + array: { unit: "\uAC1C", verb: "to have" }, + set: { unit: "\uAC1C", verb: "to have" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\uC785\uB825", + email: "\uC774\uBA54\uC77C \uC8FC\uC18C", + url: "URL", + emoji: "\uC774\uBAA8\uC9C0", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \uB0A0\uC9DC\uC2DC\uAC04", + date: "ISO \uB0A0\uC9DC", + time: "ISO \uC2DC\uAC04", + duration: "ISO \uAE30\uAC04", + ipv4: "IPv4 \uC8FC\uC18C", + ipv6: "IPv6 \uC8FC\uC18C", + cidrv4: "IPv4 \uBC94\uC704", + cidrv6: "IPv6 \uBC94\uC704", + base64: "base64 \uC778\uCF54\uB529 \uBB38\uC790\uC5F4", + base64url: "base64url \uC778\uCF54\uB529 \uBB38\uC790\uC5F4", + json_string: "JSON \uBB38\uC790\uC5F4", + e164: "E.164 \uBC88\uD638", + jwt: "JWT", + template_literal: "\uC785\uB825" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\uC798\uBABB\uB41C \uC785\uB825: \uC608\uC0C1 \uD0C0\uC785\uC740 instanceof ${issue2.expected}, \uBC1B\uC740 \uD0C0\uC785\uC740 ${received}\uC785\uB2C8\uB2E4`; + } + return `\uC798\uBABB\uB41C \uC785\uB825: \uC608\uC0C1 \uD0C0\uC785\uC740 ${expected}, \uBC1B\uC740 \uD0C0\uC785\uC740 ${received}\uC785\uB2C8\uB2E4`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\uC798\uBABB\uB41C \uC785\uB825: \uAC12\uC740 ${stringifyPrimitive(issue2.values[0])} \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`; + return `\uC798\uBABB\uB41C \uC635\uC158: ${joinValues(issue2.values, "\uB610\uB294 ")} \uC911 \uD558\uB098\uC5EC\uC57C \uD569\uB2C8\uB2E4`; + case "too_big": { + const adj = issue2.inclusive ? "\uC774\uD558" : "\uBBF8\uB9CC"; + const suffix = adj === "\uBBF8\uB9CC" ? "\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4" : "\uC5EC\uC57C \uD569\uB2C8\uB2E4"; + const sizing = getSizing(issue2.origin); + const unit = sizing?.unit ?? "\uC694\uC18C"; + if (sizing) + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue2.maximum.toString()}${unit} ${adj}${suffix}`; + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue2.maximum.toString()} ${adj}${suffix}`; + } + case "too_small": { + const adj = issue2.inclusive ? "\uC774\uC0C1" : "\uCD08\uACFC"; + const suffix = adj === "\uC774\uC0C1" ? "\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4" : "\uC5EC\uC57C \uD569\uB2C8\uB2E4"; + const sizing = getSizing(issue2.origin); + const unit = sizing?.unit ?? "\uC694\uC18C"; + if (sizing) { + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue2.minimum.toString()}${unit} ${adj}${suffix}`; + } + return `${issue2.origin ?? "\uAC12"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue2.minimum.toString()} ${adj}${suffix}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: "${_issue.prefix}"(\uC73C)\uB85C \uC2DC\uC791\uD574\uC57C \uD569\uB2C8\uB2E4`; + } + if (_issue.format === "ends_with") + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: "${_issue.suffix}"(\uC73C)\uB85C \uB05D\uB098\uC57C \uD569\uB2C8\uB2E4`; + if (_issue.format === "includes") + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: "${_issue.includes}"\uC744(\uB97C) \uD3EC\uD568\uD574\uC57C \uD569\uB2C8\uB2E4`; + if (_issue.format === "regex") + return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \uC815\uADDC\uC2DD ${_issue.pattern} \uD328\uD134\uACFC \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4`; + return `\uC798\uBABB\uB41C ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\uC798\uBABB\uB41C \uC22B\uC790: ${issue2.divisor}\uC758 \uBC30\uC218\uC5EC\uC57C \uD569\uB2C8\uB2E4`; + case "unrecognized_keys": + return `\uC778\uC2DD\uD560 \uC218 \uC5C6\uB294 \uD0A4: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\uC798\uBABB\uB41C \uD0A4: ${issue2.origin}`; + case "invalid_union": + return `\uC798\uBABB\uB41C \uC785\uB825`; + case "invalid_element": + return `\uC798\uBABB\uB41C \uAC12: ${issue2.origin}`; + default: + return `\uC798\uBABB\uB41C \uC785\uB825`; + } + }; +}; +function ko_default() { + return { + localeError: error25() + }; +} + +// node_modules/zod/v4/locales/lt.js +var capitalizeFirstCharacter = (text) => { + return text.charAt(0).toUpperCase() + text.slice(1); +}; +function getUnitTypeFromNumber(number4) { + const abs = Math.abs(number4); + const last = abs % 10; + const last2 = abs % 100; + if (last2 >= 11 && last2 <= 19 || last === 0) + return "many"; + if (last === 1) + return "one"; + return "few"; +} +var error26 = () => { + const Sizable = { + string: { + unit: { + one: "simbolis", + few: "simboliai", + many: "simboli\u0173" + }, + verb: { + smaller: { + inclusive: "turi b\u016Bti ne ilgesn\u0117 kaip", + notInclusive: "turi b\u016Bti trumpesn\u0117 kaip" + }, + bigger: { + inclusive: "turi b\u016Bti ne trumpesn\u0117 kaip", + notInclusive: "turi b\u016Bti ilgesn\u0117 kaip" + } + } + }, + file: { + unit: { + one: "baitas", + few: "baitai", + many: "bait\u0173" + }, + verb: { + smaller: { + inclusive: "turi b\u016Bti ne didesnis kaip", + notInclusive: "turi b\u016Bti ma\u017Eesnis kaip" + }, + bigger: { + inclusive: "turi b\u016Bti ne ma\u017Eesnis kaip", + notInclusive: "turi b\u016Bti didesnis kaip" + } + } + }, + array: { + unit: { + one: "element\u0105", + few: "elementus", + many: "element\u0173" + }, + verb: { + smaller: { + inclusive: "turi tur\u0117ti ne daugiau kaip", + notInclusive: "turi tur\u0117ti ma\u017Eiau kaip" + }, + bigger: { + inclusive: "turi tur\u0117ti ne ma\u017Eiau kaip", + notInclusive: "turi tur\u0117ti daugiau kaip" + } + } + }, + set: { + unit: { + one: "element\u0105", + few: "elementus", + many: "element\u0173" + }, + verb: { + smaller: { + inclusive: "turi tur\u0117ti ne daugiau kaip", + notInclusive: "turi tur\u0117ti ma\u017Eiau kaip" + }, + bigger: { + inclusive: "turi tur\u0117ti ne ma\u017Eiau kaip", + notInclusive: "turi tur\u0117ti daugiau kaip" + } + } + } + }; + function getSizing(origin, unitType, inclusive, targetShouldBe) { + const result = Sizable[origin] ?? null; + if (result === null) + return result; + return { + unit: result.unit[unitType], + verb: result.verb[targetShouldBe][inclusive ? "inclusive" : "notInclusive"] + }; + } + const FormatDictionary = { + regex: "\u012Fvestis", + email: "el. pa\u0161to adresas", + url: "URL", + emoji: "jaustukas", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO data ir laikas", + date: "ISO data", + time: "ISO laikas", + duration: "ISO trukm\u0117", + ipv4: "IPv4 adresas", + ipv6: "IPv6 adresas", + cidrv4: "IPv4 tinklo prefiksas (CIDR)", + cidrv6: "IPv6 tinklo prefiksas (CIDR)", + base64: "base64 u\u017Ekoduota eilut\u0117", + base64url: "base64url u\u017Ekoduota eilut\u0117", + json_string: "JSON eilut\u0117", + e164: "E.164 numeris", + jwt: "JWT", + template_literal: "\u012Fvestis" + }; + const TypeDictionary = { + nan: "NaN", + number: "skai\u010Dius", + bigint: "sveikasis skai\u010Dius", + string: "eilut\u0117", + boolean: "login\u0117 reik\u0161m\u0117", + undefined: "neapibr\u0117\u017Eta reik\u0161m\u0117", + function: "funkcija", + symbol: "simbolis", + array: "masyvas", + object: "objektas", + null: "nulin\u0117 reik\u0161m\u0117" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Gautas tipas ${received}, o tik\u0117tasi - instanceof ${issue2.expected}`; + } + return `Gautas tipas ${received}, o tik\u0117tasi - ${expected}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Privalo b\u016Bti ${stringifyPrimitive(issue2.values[0])}`; + return `Privalo b\u016Bti vienas i\u0161 ${joinValues(issue2.values, "|")} pasirinkim\u0173`; + case "too_big": { + const origin = TypeDictionary[issue2.origin] ?? issue2.origin; + const sizing = getSizing(issue2.origin, getUnitTypeFromNumber(Number(issue2.maximum)), issue2.inclusive ?? false, "smaller"); + if (sizing?.verb) + return `${capitalizeFirstCharacter(origin ?? issue2.origin ?? "reik\u0161m\u0117")} ${sizing.verb} ${issue2.maximum.toString()} ${sizing.unit ?? "element\u0173"}`; + const adj = issue2.inclusive ? "ne didesnis kaip" : "ma\u017Eesnis kaip"; + return `${capitalizeFirstCharacter(origin ?? issue2.origin ?? "reik\u0161m\u0117")} turi b\u016Bti ${adj} ${issue2.maximum.toString()} ${sizing?.unit}`; + } + case "too_small": { + const origin = TypeDictionary[issue2.origin] ?? issue2.origin; + const sizing = getSizing(issue2.origin, getUnitTypeFromNumber(Number(issue2.minimum)), issue2.inclusive ?? false, "bigger"); + if (sizing?.verb) + return `${capitalizeFirstCharacter(origin ?? issue2.origin ?? "reik\u0161m\u0117")} ${sizing.verb} ${issue2.minimum.toString()} ${sizing.unit ?? "element\u0173"}`; + const adj = issue2.inclusive ? "ne ma\u017Eesnis kaip" : "didesnis kaip"; + return `${capitalizeFirstCharacter(origin ?? issue2.origin ?? "reik\u0161m\u0117")} turi b\u016Bti ${adj} ${issue2.minimum.toString()} ${sizing?.unit}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Eilut\u0117 privalo prasid\u0117ti "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Eilut\u0117 privalo pasibaigti "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Eilut\u0117 privalo \u012Ftraukti "${_issue.includes}"`; + if (_issue.format === "regex") + return `Eilut\u0117 privalo atitikti ${_issue.pattern}`; + return `Neteisingas ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Skai\u010Dius privalo b\u016Bti ${issue2.divisor} kartotinis.`; + case "unrecognized_keys": + return `Neatpa\u017Eint${issue2.keys.length > 1 ? "i" : "as"} rakt${issue2.keys.length > 1 ? "ai" : "as"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return "Rastas klaidingas raktas"; + case "invalid_union": + return "Klaidinga \u012Fvestis"; + case "invalid_element": { + const origin = TypeDictionary[issue2.origin] ?? issue2.origin; + return `${capitalizeFirstCharacter(origin ?? issue2.origin ?? "reik\u0161m\u0117")} turi klaiding\u0105 \u012Fvest\u012F`; + } + default: + return "Klaidinga \u012Fvestis"; + } + }; +}; +function lt_default() { + return { + localeError: error26() + }; +} + +// node_modules/zod/v4/locales/mk.js +var error27 = () => { + const Sizable = { + string: { unit: "\u0437\u043D\u0430\u0446\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" }, + file: { unit: "\u0431\u0430\u0458\u0442\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" }, + array: { unit: "\u0441\u0442\u0430\u0432\u043A\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" }, + set: { unit: "\u0441\u0442\u0430\u0432\u043A\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0432\u043D\u0435\u0441", + email: "\u0430\u0434\u0440\u0435\u0441\u0430 \u043D\u0430 \u0435-\u043F\u043E\u0448\u0442\u0430", + url: "URL", + emoji: "\u0435\u043C\u043E\u045F\u0438", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0434\u0430\u0442\u0443\u043C \u0438 \u0432\u0440\u0435\u043C\u0435", + date: "ISO \u0434\u0430\u0442\u0443\u043C", + time: "ISO \u0432\u0440\u0435\u043C\u0435", + duration: "ISO \u0432\u0440\u0435\u043C\u0435\u0442\u0440\u0430\u0435\u045A\u0435", + ipv4: "IPv4 \u0430\u0434\u0440\u0435\u0441\u0430", + ipv6: "IPv6 \u0430\u0434\u0440\u0435\u0441\u0430", + cidrv4: "IPv4 \u043E\u043F\u0441\u0435\u0433", + cidrv6: "IPv6 \u043E\u043F\u0441\u0435\u0433", + base64: "base64-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430", + base64url: "base64url-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430", + json_string: "JSON \u043D\u0438\u0437\u0430", + e164: "E.164 \u0431\u0440\u043E\u0458", + jwt: "JWT", + template_literal: "\u0432\u043D\u0435\u0441" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0431\u0440\u043E\u0458", + array: "\u043D\u0438\u0437\u0430" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 instanceof ${issue2.expected}, \u043F\u0440\u0438\u043C\u0435\u043D\u043E ${received}`; + } + return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${expected}, \u043F\u0440\u0438\u043C\u0435\u043D\u043E ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Invalid input: expected ${stringifyPrimitive(issue2.values[0])}`; + return `\u0413\u0440\u0435\u0448\u0430\u043D\u0430 \u043E\u043F\u0446\u0438\u0458\u0430: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 \u0435\u0434\u043D\u0430 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin ?? "\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430"} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0438"}`; + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin ?? "\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430"} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue2.origin} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u043F\u043E\u0447\u043D\u0443\u0432\u0430 \u0441\u043E "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u0432\u0440\u0448\u0443\u0432\u0430 \u0441\u043E "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0432\u043A\u043B\u0443\u0447\u0443\u0432\u0430 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u043E\u0434\u0433\u043E\u0430\u0440\u0430 \u043D\u0430 \u043F\u0430\u0442\u0435\u0440\u043D\u043E\u0442 ${_issue.pattern}`; + return `Invalid ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u0413\u0440\u0435\u0448\u0435\u043D \u0431\u0440\u043E\u0458: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0431\u0438\u0434\u0435 \u0434\u0435\u043B\u0438\u0432 \u0441\u043E ${issue2.divisor}`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D\u0438 \u043A\u043B\u0443\u0447\u0435\u0432\u0438" : "\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D \u043A\u043B\u0443\u0447"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u0413\u0440\u0435\u0448\u0435\u043D \u043A\u043B\u0443\u0447 \u0432\u043E ${issue2.origin}`; + case "invalid_union": + return "\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441"; + case "invalid_element": + return `\u0413\u0440\u0435\u0448\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0432\u043E ${issue2.origin}`; + default: + return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441`; + } + }; +}; +function mk_default() { + return { + localeError: error27() + }; +} + +// node_modules/zod/v4/locales/ms.js +var error28 = () => { + const Sizable = { + string: { unit: "aksara", verb: "mempunyai" }, + file: { unit: "bait", verb: "mempunyai" }, + array: { unit: "elemen", verb: "mempunyai" }, + set: { unit: "elemen", verb: "mempunyai" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "input", + email: "alamat e-mel", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "tarikh masa ISO", + date: "tarikh ISO", + time: "masa ISO", + duration: "tempoh ISO", + ipv4: "alamat IPv4", + ipv6: "alamat IPv6", + cidrv4: "julat IPv4", + cidrv6: "julat IPv6", + base64: "string dikodkan base64", + base64url: "string dikodkan base64url", + json_string: "string JSON", + e164: "nombor E.164", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + nan: "NaN", + number: "nombor" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Input tidak sah: dijangka instanceof ${issue2.expected}, diterima ${received}`; + } + return `Input tidak sah: dijangka ${expected}, diterima ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Input tidak sah: dijangka ${stringifyPrimitive(issue2.values[0])}`; + return `Pilihan tidak sah: dijangka salah satu daripada ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Terlalu besar: dijangka ${issue2.origin ?? "nilai"} ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elemen"}`; + return `Terlalu besar: dijangka ${issue2.origin ?? "nilai"} adalah ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Terlalu kecil: dijangka ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Terlalu kecil: dijangka ${issue2.origin} adalah ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `String tidak sah: mesti bermula dengan "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `String tidak sah: mesti berakhir dengan "${_issue.suffix}"`; + if (_issue.format === "includes") + return `String tidak sah: mesti mengandungi "${_issue.includes}"`; + if (_issue.format === "regex") + return `String tidak sah: mesti sepadan dengan corak ${_issue.pattern}`; + return `${FormatDictionary[_issue.format] ?? issue2.format} tidak sah`; + } + case "not_multiple_of": + return `Nombor tidak sah: perlu gandaan ${issue2.divisor}`; + case "unrecognized_keys": + return `Kunci tidak dikenali: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Kunci tidak sah dalam ${issue2.origin}`; + case "invalid_union": + return "Input tidak sah"; + case "invalid_element": + return `Nilai tidak sah dalam ${issue2.origin}`; + default: + return `Input tidak sah`; + } + }; +}; +function ms_default() { + return { + localeError: error28() + }; +} + +// node_modules/zod/v4/locales/nl.js +var error29 = () => { + const Sizable = { + string: { unit: "tekens", verb: "heeft" }, + file: { unit: "bytes", verb: "heeft" }, + array: { unit: "elementen", verb: "heeft" }, + set: { unit: "elementen", verb: "heeft" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "invoer", + email: "emailadres", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datum en tijd", + date: "ISO datum", + time: "ISO tijd", + duration: "ISO duur", + ipv4: "IPv4-adres", + ipv6: "IPv6-adres", + cidrv4: "IPv4-bereik", + cidrv6: "IPv6-bereik", + base64: "base64-gecodeerde tekst", + base64url: "base64 URL-gecodeerde tekst", + json_string: "JSON string", + e164: "E.164-nummer", + jwt: "JWT", + template_literal: "invoer" + }; + const TypeDictionary = { + nan: "NaN", + number: "getal" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Ongeldige invoer: verwacht instanceof ${issue2.expected}, ontving ${received}`; + } + return `Ongeldige invoer: verwacht ${expected}, ontving ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Ongeldige invoer: verwacht ${stringifyPrimitive(issue2.values[0])}`; + return `Ongeldige optie: verwacht \xE9\xE9n van ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + const longName = issue2.origin === "date" ? "laat" : issue2.origin === "string" ? "lang" : "groot"; + if (sizing) + return `Te ${longName}: verwacht dat ${issue2.origin ?? "waarde"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementen"} ${sizing.verb}`; + return `Te ${longName}: verwacht dat ${issue2.origin ?? "waarde"} ${adj}${issue2.maximum.toString()} is`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + const shortName = issue2.origin === "date" ? "vroeg" : issue2.origin === "string" ? "kort" : "klein"; + if (sizing) { + return `Te ${shortName}: verwacht dat ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit} ${sizing.verb}`; + } + return `Te ${shortName}: verwacht dat ${issue2.origin} ${adj}${issue2.minimum.toString()} is`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Ongeldige tekst: moet met "${_issue.prefix}" beginnen`; + } + if (_issue.format === "ends_with") + return `Ongeldige tekst: moet op "${_issue.suffix}" eindigen`; + if (_issue.format === "includes") + return `Ongeldige tekst: moet "${_issue.includes}" bevatten`; + if (_issue.format === "regex") + return `Ongeldige tekst: moet overeenkomen met patroon ${_issue.pattern}`; + return `Ongeldig: ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ongeldig getal: moet een veelvoud van ${issue2.divisor} zijn`; + case "unrecognized_keys": + return `Onbekende key${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ongeldige key in ${issue2.origin}`; + case "invalid_union": + return "Ongeldige invoer"; + case "invalid_element": + return `Ongeldige waarde in ${issue2.origin}`; + default: + return `Ongeldige invoer`; + } + }; +}; +function nl_default() { + return { + localeError: error29() + }; +} + +// node_modules/zod/v4/locales/no.js +var error30 = () => { + const Sizable = { + string: { unit: "tegn", verb: "\xE5 ha" }, + file: { unit: "bytes", verb: "\xE5 ha" }, + array: { unit: "elementer", verb: "\xE5 inneholde" }, + set: { unit: "elementer", verb: "\xE5 inneholde" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "input", + email: "e-postadresse", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO dato- og klokkeslett", + date: "ISO-dato", + time: "ISO-klokkeslett", + duration: "ISO-varighet", + ipv4: "IPv4-omr\xE5de", + ipv6: "IPv6-omr\xE5de", + cidrv4: "IPv4-spekter", + cidrv6: "IPv6-spekter", + base64: "base64-enkodet streng", + base64url: "base64url-enkodet streng", + json_string: "JSON-streng", + e164: "E.164-nummer", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + nan: "NaN", + number: "tall", + array: "liste" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Ugyldig input: forventet instanceof ${issue2.expected}, fikk ${received}`; + } + return `Ugyldig input: forventet ${expected}, fikk ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Ugyldig verdi: forventet ${stringifyPrimitive(issue2.values[0])}`; + return `Ugyldig valg: forventet en av ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `For stor(t): forventet ${issue2.origin ?? "value"} til \xE5 ha ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementer"}`; + return `For stor(t): forventet ${issue2.origin ?? "value"} til \xE5 ha ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `For lite(n): forventet ${issue2.origin} til \xE5 ha ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `For lite(n): forventet ${issue2.origin} til \xE5 ha ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Ugyldig streng: m\xE5 starte med "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Ugyldig streng: m\xE5 ende med "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Ugyldig streng: m\xE5 inneholde "${_issue.includes}"`; + if (_issue.format === "regex") + return `Ugyldig streng: m\xE5 matche m\xF8nsteret ${_issue.pattern}`; + return `Ugyldig ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ugyldig tall: m\xE5 v\xE6re et multiplum av ${issue2.divisor}`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Ukjente n\xF8kler" : "Ukjent n\xF8kkel"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ugyldig n\xF8kkel i ${issue2.origin}`; + case "invalid_union": + return "Ugyldig input"; + case "invalid_element": + return `Ugyldig verdi i ${issue2.origin}`; + default: + return `Ugyldig input`; + } + }; +}; +function no_default() { + return { + localeError: error30() + }; +} + +// node_modules/zod/v4/locales/ota.js +var error31 = () => { + const Sizable = { + string: { unit: "harf", verb: "olmal\u0131d\u0131r" }, + file: { unit: "bayt", verb: "olmal\u0131d\u0131r" }, + array: { unit: "unsur", verb: "olmal\u0131d\u0131r" }, + set: { unit: "unsur", verb: "olmal\u0131d\u0131r" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "giren", + email: "epostag\xE2h", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO heng\xE2m\u0131", + date: "ISO tarihi", + time: "ISO zaman\u0131", + duration: "ISO m\xFCddeti", + ipv4: "IPv4 ni\u015F\xE2n\u0131", + ipv6: "IPv6 ni\u015F\xE2n\u0131", + cidrv4: "IPv4 menzili", + cidrv6: "IPv6 menzili", + base64: "base64-\u015Fifreli metin", + base64url: "base64url-\u015Fifreli metin", + json_string: "JSON metin", + e164: "E.164 say\u0131s\u0131", + jwt: "JWT", + template_literal: "giren" + }; + const TypeDictionary = { + nan: "NaN", + number: "numara", + array: "saf", + null: "gayb" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `F\xE2sit giren: umulan instanceof ${issue2.expected}, al\u0131nan ${received}`; + } + return `F\xE2sit giren: umulan ${expected}, al\u0131nan ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `F\xE2sit giren: umulan ${stringifyPrimitive(issue2.values[0])}`; + return `F\xE2sit tercih: m\xFBteberler ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Fazla b\xFCy\xFCk: ${issue2.origin ?? "value"}, ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elements"} sahip olmal\u0131yd\u0131.`; + return `Fazla b\xFCy\xFCk: ${issue2.origin ?? "value"}, ${adj}${issue2.maximum.toString()} olmal\u0131yd\u0131.`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Fazla k\xFC\xE7\xFCk: ${issue2.origin}, ${adj}${issue2.minimum.toString()} ${sizing.unit} sahip olmal\u0131yd\u0131.`; + } + return `Fazla k\xFC\xE7\xFCk: ${issue2.origin}, ${adj}${issue2.minimum.toString()} olmal\u0131yd\u0131.`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `F\xE2sit metin: "${_issue.prefix}" ile ba\u015Flamal\u0131.`; + if (_issue.format === "ends_with") + return `F\xE2sit metin: "${_issue.suffix}" ile bitmeli.`; + if (_issue.format === "includes") + return `F\xE2sit metin: "${_issue.includes}" ihtiv\xE2 etmeli.`; + if (_issue.format === "regex") + return `F\xE2sit metin: ${_issue.pattern} nak\u015F\u0131na uymal\u0131.`; + return `F\xE2sit ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `F\xE2sit say\u0131: ${issue2.divisor} kat\u0131 olmal\u0131yd\u0131.`; + case "unrecognized_keys": + return `Tan\u0131nmayan anahtar ${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} i\xE7in tan\u0131nmayan anahtar var.`; + case "invalid_union": + return "Giren tan\u0131namad\u0131."; + case "invalid_element": + return `${issue2.origin} i\xE7in tan\u0131nmayan k\u0131ymet var.`; + default: + return `K\u0131ymet tan\u0131namad\u0131.`; + } + }; +}; +function ota_default() { + return { + localeError: error31() + }; +} + +// node_modules/zod/v4/locales/ps.js +var error32 = () => { + const Sizable = { + string: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" }, + file: { unit: "\u0628\u0627\u06CC\u067C\u0633", verb: "\u0648\u0644\u0631\u064A" }, + array: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" }, + set: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0648\u0631\u0648\u062F\u064A", + email: "\u0628\u0631\u06CC\u069A\u0646\u0627\u0644\u06CC\u06A9", + url: "\u06CC\u0648 \u0622\u0631 \u0627\u0644", + emoji: "\u0627\u06CC\u0645\u0648\u062C\u064A", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u0646\u06CC\u067C\u0647 \u0627\u0648 \u0648\u062E\u062A", + date: "\u0646\u06D0\u067C\u0647", + time: "\u0648\u062E\u062A", + duration: "\u0645\u0648\u062F\u0647", + ipv4: "\u062F IPv4 \u067E\u062A\u0647", + ipv6: "\u062F IPv6 \u067E\u062A\u0647", + cidrv4: "\u062F IPv4 \u0633\u0627\u062D\u0647", + cidrv6: "\u062F IPv6 \u0633\u0627\u062D\u0647", + base64: "base64-encoded \u0645\u062A\u0646", + base64url: "base64url-encoded \u0645\u062A\u0646", + json_string: "JSON \u0645\u062A\u0646", + e164: "\u062F E.164 \u0634\u0645\u06D0\u0631\u0647", + jwt: "JWT", + template_literal: "\u0648\u0631\u0648\u062F\u064A" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0639\u062F\u062F", + array: "\u0627\u0631\u06D0" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F instanceof ${issue2.expected} \u0648\u0627\u06CC, \u0645\u06AB\u0631 ${received} \u062A\u0631\u0644\u0627\u0633\u0647 \u0634\u0648`; + } + return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${expected} \u0648\u0627\u06CC, \u0645\u06AB\u0631 ${received} \u062A\u0631\u0644\u0627\u0633\u0647 \u0634\u0648`; + } + case "invalid_value": + if (issue2.values.length === 1) { + return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${stringifyPrimitive(issue2.values[0])} \u0648\u0627\u06CC`; + } + return `\u0646\u0627\u0633\u0645 \u0627\u0646\u062A\u062E\u0627\u0628: \u0628\u0627\u06CC\u062F \u06CC\u0648 \u0644\u0647 ${joinValues(issue2.values, "|")} \u0685\u062E\u0647 \u0648\u0627\u06CC`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue2.origin ?? "\u0627\u0631\u0632\u069A\u062A"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0635\u0631\u0648\u0646\u0647"} \u0648\u0644\u0631\u064A`; + } + return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue2.origin ?? "\u0627\u0631\u0632\u069A\u062A"} \u0628\u0627\u06CC\u062F ${adj}${issue2.maximum.toString()} \u0648\u064A`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} ${sizing.unit} \u0648\u0644\u0631\u064A`; + } + return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue2.origin} \u0628\u0627\u06CC\u062F ${adj}${issue2.minimum.toString()} \u0648\u064A`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F "${_issue.prefix}" \u0633\u0631\u0647 \u067E\u06CC\u0644 \u0634\u064A`; + } + if (_issue.format === "ends_with") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F "${_issue.suffix}" \u0633\u0631\u0647 \u067E\u0627\u06CC \u062A\u0647 \u0648\u0631\u0633\u064A\u0696\u064A`; + } + if (_issue.format === "includes") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F "${_issue.includes}" \u0648\u0644\u0631\u064A`; + } + if (_issue.format === "regex") { + return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F ${_issue.pattern} \u0633\u0631\u0647 \u0645\u0637\u0627\u0628\u0642\u062A \u0648\u0644\u0631\u064A`; + } + return `${FormatDictionary[_issue.format] ?? issue2.format} \u0646\u0627\u0633\u0645 \u062F\u06CC`; + } + case "not_multiple_of": + return `\u0646\u0627\u0633\u0645 \u0639\u062F\u062F: \u0628\u0627\u06CC\u062F \u062F ${issue2.divisor} \u0645\u0636\u0631\u0628 \u0648\u064A`; + case "unrecognized_keys": + return `\u0646\u0627\u0633\u0645 ${issue2.keys.length > 1 ? "\u06A9\u0644\u06CC\u0689\u0648\u0646\u0647" : "\u06A9\u0644\u06CC\u0689"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u0646\u0627\u0633\u0645 \u06A9\u0644\u06CC\u0689 \u067E\u0647 ${issue2.origin} \u06A9\u06D0`; + case "invalid_union": + return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`; + case "invalid_element": + return `\u0646\u0627\u0633\u0645 \u0639\u0646\u0635\u0631 \u067E\u0647 ${issue2.origin} \u06A9\u06D0`; + default: + return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`; + } + }; +}; +function ps_default() { + return { + localeError: error32() + }; +} + +// node_modules/zod/v4/locales/pl.js +var error33 = () => { + const Sizable = { + string: { unit: "znak\xF3w", verb: "mie\u0107" }, + file: { unit: "bajt\xF3w", verb: "mie\u0107" }, + array: { unit: "element\xF3w", verb: "mie\u0107" }, + set: { unit: "element\xF3w", verb: "mie\u0107" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "wyra\u017Cenie", + email: "adres email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data i godzina w formacie ISO", + date: "data w formacie ISO", + time: "godzina w formacie ISO", + duration: "czas trwania ISO", + ipv4: "adres IPv4", + ipv6: "adres IPv6", + cidrv4: "zakres IPv4", + cidrv6: "zakres IPv6", + base64: "ci\u0105g znak\xF3w zakodowany w formacie base64", + base64url: "ci\u0105g znak\xF3w zakodowany w formacie base64url", + json_string: "ci\u0105g znak\xF3w w formacie JSON", + e164: "liczba E.164", + jwt: "JWT", + template_literal: "wej\u015Bcie" + }; + const TypeDictionary = { + nan: "NaN", + number: "liczba", + array: "tablica" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano instanceof ${issue2.expected}, otrzymano ${received}`; + } + return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${expected}, otrzymano ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${stringifyPrimitive(issue2.values[0])}`; + return `Nieprawid\u0142owa opcja: oczekiwano jednej z warto\u015Bci ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Za du\u017Ca warto\u015B\u0107: oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie mie\u0107 ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "element\xF3w"}`; + } + return `Zbyt du\u017C(y/a/e): oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie wynosi\u0107 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Za ma\u0142a warto\u015B\u0107: oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie mie\u0107 ${adj}${issue2.minimum.toString()} ${sizing.unit ?? "element\xF3w"}`; + } + return `Zbyt ma\u0142(y/a/e): oczekiwano, \u017Ce ${issue2.origin ?? "warto\u015B\u0107"} b\u0119dzie wynosi\u0107 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi zaczyna\u0107 si\u0119 od "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi ko\u0144czy\u0107 si\u0119 na "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi zawiera\u0107 "${_issue.includes}"`; + if (_issue.format === "regex") + return `Nieprawid\u0142owy ci\u0105g znak\xF3w: musi odpowiada\u0107 wzorcowi ${_issue.pattern}`; + return `Nieprawid\u0142ow(y/a/e) ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Nieprawid\u0142owa liczba: musi by\u0107 wielokrotno\u015Bci\u0105 ${issue2.divisor}`; + case "unrecognized_keys": + return `Nierozpoznane klucze${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Nieprawid\u0142owy klucz w ${issue2.origin}`; + case "invalid_union": + return "Nieprawid\u0142owe dane wej\u015Bciowe"; + case "invalid_element": + return `Nieprawid\u0142owa warto\u015B\u0107 w ${issue2.origin}`; + default: + return `Nieprawid\u0142owe dane wej\u015Bciowe`; + } + }; +}; +function pl_default() { + return { + localeError: error33() + }; +} + +// node_modules/zod/v4/locales/pt.js +var error34 = () => { + const Sizable = { + string: { unit: "caracteres", verb: "ter" }, + file: { unit: "bytes", verb: "ter" }, + array: { unit: "itens", verb: "ter" }, + set: { unit: "itens", verb: "ter" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "padr\xE3o", + email: "endere\xE7o de e-mail", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "data e hora ISO", + date: "data ISO", + time: "hora ISO", + duration: "dura\xE7\xE3o ISO", + ipv4: "endere\xE7o IPv4", + ipv6: "endere\xE7o IPv6", + cidrv4: "faixa de IPv4", + cidrv6: "faixa de IPv6", + base64: "texto codificado em base64", + base64url: "URL codificada em base64", + json_string: "texto JSON", + e164: "n\xFAmero E.164", + jwt: "JWT", + template_literal: "entrada" + }; + const TypeDictionary = { + nan: "NaN", + number: "n\xFAmero", + null: "nulo" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Tipo inv\xE1lido: esperado instanceof ${issue2.expected}, recebido ${received}`; + } + return `Tipo inv\xE1lido: esperado ${expected}, recebido ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Entrada inv\xE1lida: esperado ${stringifyPrimitive(issue2.values[0])}`; + return `Op\xE7\xE3o inv\xE1lida: esperada uma das ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Muito grande: esperado que ${issue2.origin ?? "valor"} tivesse ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementos"}`; + return `Muito grande: esperado que ${issue2.origin ?? "valor"} fosse ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Muito pequeno: esperado que ${issue2.origin} tivesse ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Muito pequeno: esperado que ${issue2.origin} fosse ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Texto inv\xE1lido: deve come\xE7ar com "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Texto inv\xE1lido: deve terminar com "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Texto inv\xE1lido: deve incluir "${_issue.includes}"`; + if (_issue.format === "regex") + return `Texto inv\xE1lido: deve corresponder ao padr\xE3o ${_issue.pattern}`; + return `${FormatDictionary[_issue.format] ?? issue2.format} inv\xE1lido`; + } + case "not_multiple_of": + return `N\xFAmero inv\xE1lido: deve ser m\xFAltiplo de ${issue2.divisor}`; + case "unrecognized_keys": + return `Chave${issue2.keys.length > 1 ? "s" : ""} desconhecida${issue2.keys.length > 1 ? "s" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Chave inv\xE1lida em ${issue2.origin}`; + case "invalid_union": + return "Entrada inv\xE1lida"; + case "invalid_element": + return `Valor inv\xE1lido em ${issue2.origin}`; + default: + return `Campo inv\xE1lido`; + } + }; +}; +function pt_default() { + return { + localeError: error34() + }; +} + +// node_modules/zod/v4/locales/ru.js +function getRussianPlural(count, one, few, many) { + const absCount = Math.abs(count); + const lastDigit = absCount % 10; + const lastTwoDigits = absCount % 100; + if (lastTwoDigits >= 11 && lastTwoDigits <= 19) { + return many; + } + if (lastDigit === 1) { + return one; + } + if (lastDigit >= 2 && lastDigit <= 4) { + return few; + } + return many; +} +var error35 = () => { + const Sizable = { + string: { + unit: { + one: "\u0441\u0438\u043C\u0432\u043E\u043B", + few: "\u0441\u0438\u043C\u0432\u043E\u043B\u0430", + many: "\u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + }, + file: { + unit: { + one: "\u0431\u0430\u0439\u0442", + few: "\u0431\u0430\u0439\u0442\u0430", + many: "\u0431\u0430\u0439\u0442" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + }, + array: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + }, + set: { + unit: { + one: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442", + few: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430", + many: "\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432" + }, + verb: "\u0438\u043C\u0435\u0442\u044C" + } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0432\u0432\u043E\u0434", + email: "email \u0430\u0434\u0440\u0435\u0441", + url: "URL", + emoji: "\u044D\u043C\u043E\u0434\u0437\u0438", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043C\u044F", + date: "ISO \u0434\u0430\u0442\u0430", + time: "ISO \u0432\u0440\u0435\u043C\u044F", + duration: "ISO \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C", + ipv4: "IPv4 \u0430\u0434\u0440\u0435\u0441", + ipv6: "IPv6 \u0430\u0434\u0440\u0435\u0441", + cidrv4: "IPv4 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D", + cidrv6: "IPv6 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D", + base64: "\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64", + base64url: "\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64url", + json_string: "JSON \u0441\u0442\u0440\u043E\u043A\u0430", + e164: "\u043D\u043E\u043C\u0435\u0440 E.164", + jwt: "JWT", + template_literal: "\u0432\u0432\u043E\u0434" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0447\u0438\u0441\u043B\u043E", + array: "\u043C\u0430\u0441\u0441\u0438\u0432" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C instanceof ${issue2.expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E ${received}`; + } + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${stringifyPrimitive(issue2.values[0])}`; + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0434\u043D\u043E \u0438\u0437 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const maxValue = Number(issue2.maximum); + const unit = getRussianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435"} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue2.maximum.toString()} ${unit}`; + } + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435"} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + const minValue = Number(issue2.minimum); + const unit = getRussianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many); + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue2.minimum.toString()} ${unit}`; + } + return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue2.origin} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`; + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E: \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue2.divisor}`; + case "unrecognized_keys": + return `\u041D\u0435\u0440\u0430\u0441\u043F\u043E\u0437\u043D\u0430\u043D\u043D${issue2.keys.length > 1 ? "\u044B\u0435" : "\u044B\u0439"} \u043A\u043B\u044E\u0447${issue2.keys.length > 1 ? "\u0438" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u0432 ${issue2.origin}`; + case "invalid_union": + return "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435"; + case "invalid_element": + return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0432 ${issue2.origin}`; + default: + return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435`; + } + }; +}; +function ru_default() { + return { + localeError: error35() + }; +} + +// node_modules/zod/v4/locales/sl.js +var error36 = () => { + const Sizable = { + string: { unit: "znakov", verb: "imeti" }, + file: { unit: "bajtov", verb: "imeti" }, + array: { unit: "elementov", verb: "imeti" }, + set: { unit: "elementov", verb: "imeti" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "vnos", + email: "e-po\u0161tni naslov", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO datum in \u010Das", + date: "ISO datum", + time: "ISO \u010Das", + duration: "ISO trajanje", + ipv4: "IPv4 naslov", + ipv6: "IPv6 naslov", + cidrv4: "obseg IPv4", + cidrv6: "obseg IPv6", + base64: "base64 kodiran niz", + base64url: "base64url kodiran niz", + json_string: "JSON niz", + e164: "E.164 \u0161tevilka", + jwt: "JWT", + template_literal: "vnos" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0161tevilo", + array: "tabela" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Neveljaven vnos: pri\u010Dakovano instanceof ${issue2.expected}, prejeto ${received}`; + } + return `Neveljaven vnos: pri\u010Dakovano ${expected}, prejeto ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Neveljaven vnos: pri\u010Dakovano ${stringifyPrimitive(issue2.values[0])}`; + return `Neveljavna mo\u017Enost: pri\u010Dakovano eno izmed ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Preveliko: pri\u010Dakovano, da bo ${issue2.origin ?? "vrednost"} imelo ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "elementov"}`; + return `Preveliko: pri\u010Dakovano, da bo ${issue2.origin ?? "vrednost"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Premajhno: pri\u010Dakovano, da bo ${issue2.origin} imelo ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Premajhno: pri\u010Dakovano, da bo ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Neveljaven niz: mora se za\u010Deti z "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Neveljaven niz: mora se kon\u010Dati z "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Neveljaven niz: mora vsebovati "${_issue.includes}"`; + if (_issue.format === "regex") + return `Neveljaven niz: mora ustrezati vzorcu ${_issue.pattern}`; + return `Neveljaven ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Neveljavno \u0161tevilo: mora biti ve\u010Dkratnik ${issue2.divisor}`; + case "unrecognized_keys": + return `Neprepoznan${issue2.keys.length > 1 ? "i klju\u010Di" : " klju\u010D"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Neveljaven klju\u010D v ${issue2.origin}`; + case "invalid_union": + return "Neveljaven vnos"; + case "invalid_element": + return `Neveljavna vrednost v ${issue2.origin}`; + default: + return "Neveljaven vnos"; + } + }; +}; +function sl_default() { + return { + localeError: error36() + }; +} + +// node_modules/zod/v4/locales/sv.js +var error37 = () => { + const Sizable = { + string: { unit: "tecken", verb: "att ha" }, + file: { unit: "bytes", verb: "att ha" }, + array: { unit: "objekt", verb: "att inneh\xE5lla" }, + set: { unit: "objekt", verb: "att inneh\xE5lla" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "regulj\xE4rt uttryck", + email: "e-postadress", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO-datum och tid", + date: "ISO-datum", + time: "ISO-tid", + duration: "ISO-varaktighet", + ipv4: "IPv4-intervall", + ipv6: "IPv6-intervall", + cidrv4: "IPv4-spektrum", + cidrv6: "IPv6-spektrum", + base64: "base64-kodad str\xE4ng", + base64url: "base64url-kodad str\xE4ng", + json_string: "JSON-str\xE4ng", + e164: "E.164-nummer", + jwt: "JWT", + template_literal: "mall-literal" + }; + const TypeDictionary = { + nan: "NaN", + number: "antal", + array: "lista" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Ogiltig inmatning: f\xF6rv\xE4ntat instanceof ${issue2.expected}, fick ${received}`; + } + return `Ogiltig inmatning: f\xF6rv\xE4ntat ${expected}, fick ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Ogiltig inmatning: f\xF6rv\xE4ntat ${stringifyPrimitive(issue2.values[0])}`; + return `Ogiltigt val: f\xF6rv\xE4ntade en av ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `F\xF6r stor(t): f\xF6rv\xE4ntade ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "element"}`; + } + return `F\xF6r stor(t): f\xF6rv\xE4ntat ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `F\xF6r lite(t): f\xF6rv\xE4ntade ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `F\xF6r lite(t): f\xF6rv\xE4ntade ${issue2.origin ?? "v\xE4rdet"} att ha ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `Ogiltig str\xE4ng: m\xE5ste b\xF6rja med "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `Ogiltig str\xE4ng: m\xE5ste sluta med "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Ogiltig str\xE4ng: m\xE5ste inneh\xE5lla "${_issue.includes}"`; + if (_issue.format === "regex") + return `Ogiltig str\xE4ng: m\xE5ste matcha m\xF6nstret "${_issue.pattern}"`; + return `Ogiltig(t) ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ogiltigt tal: m\xE5ste vara en multipel av ${issue2.divisor}`; + case "unrecognized_keys": + return `${issue2.keys.length > 1 ? "Ok\xE4nda nycklar" : "Ok\xE4nd nyckel"}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Ogiltig nyckel i ${issue2.origin ?? "v\xE4rdet"}`; + case "invalid_union": + return "Ogiltig input"; + case "invalid_element": + return `Ogiltigt v\xE4rde i ${issue2.origin ?? "v\xE4rdet"}`; + default: + return `Ogiltig input`; + } + }; +}; +function sv_default() { + return { + localeError: error37() + }; +} + +// node_modules/zod/v4/locales/ta.js +var error38 = () => { + const Sizable = { + string: { unit: "\u0B8E\u0BB4\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BCD\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" }, + file: { unit: "\u0BAA\u0BC8\u0B9F\u0BCD\u0B9F\u0BC1\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" }, + array: { unit: "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" }, + set: { unit: "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1", + email: "\u0BAE\u0BBF\u0BA9\u0BCD\u0BA9\u0B9E\u0BCD\u0B9A\u0BB2\u0BCD \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u0BA4\u0BC7\u0BA4\u0BBF \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD", + date: "ISO \u0BA4\u0BC7\u0BA4\u0BBF", + time: "ISO \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD", + duration: "ISO \u0B95\u0BBE\u0BB2 \u0B85\u0BB3\u0BB5\u0BC1", + ipv4: "IPv4 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF", + ipv6: "IPv6 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF", + cidrv4: "IPv4 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1", + cidrv6: "IPv6 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1", + base64: "base64-encoded \u0B9A\u0BB0\u0BAE\u0BCD", + base64url: "base64url-encoded \u0B9A\u0BB0\u0BAE\u0BCD", + json_string: "JSON \u0B9A\u0BB0\u0BAE\u0BCD", + e164: "E.164 \u0B8E\u0BA3\u0BCD", + jwt: "JWT", + template_literal: "input" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0B8E\u0BA3\u0BCD", + array: "\u0B85\u0BA3\u0BBF", + null: "\u0BB5\u0BC6\u0BB1\u0BC1\u0BAE\u0BC8" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 instanceof ${issue2.expected}, \u0BAA\u0BC6\u0BB1\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${received}`; + } + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${expected}, \u0BAA\u0BC6\u0BB1\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${stringifyPrimitive(issue2.values[0])}`; + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0BAE\u0BCD: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${joinValues(issue2.values, "|")} \u0B87\u0BB2\u0BCD \u0B92\u0BA9\u0BCD\u0BB1\u0BC1`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin ?? "\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD"} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin ?? "\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1"} ${adj}${issue2.maximum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue2.origin} ${adj}${issue2.minimum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: "${_issue.prefix}" \u0B87\u0BB2\u0BCD \u0BA4\u0BCA\u0B9F\u0B99\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + if (_issue.format === "ends_with") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: "${_issue.suffix}" \u0B87\u0BB2\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0B9F\u0BC8\u0BAF \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + if (_issue.format === "includes") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: "${_issue.includes}" \u0B90 \u0B89\u0BB3\u0BCD\u0BB3\u0B9F\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + if (_issue.format === "regex") + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: ${_issue.pattern} \u0BAE\u0BC1\u0BB1\u0BC8\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B9F\u0BA9\u0BCD \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B8E\u0BA3\u0BCD: ${issue2.divisor} \u0B87\u0BA9\u0BCD \u0BAA\u0BB2\u0BAE\u0BBE\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; + case "unrecognized_keys": + return `\u0B85\u0B9F\u0BC8\u0BAF\u0BBE\u0BB3\u0BAE\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF\u0BBE\u0BA4 \u0BB5\u0BBF\u0B9A\u0BC8${issue2.keys.length > 1 ? "\u0B95\u0BB3\u0BCD" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0B9A\u0BC8`; + case "invalid_union": + return "\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1"; + case "invalid_element": + return `${issue2.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1`; + default: + return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1`; + } + }; +}; +function ta_default() { + return { + localeError: error38() + }; +} + +// node_modules/zod/v4/locales/th.js +var error39 = () => { + const Sizable = { + string: { unit: "\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" }, + file: { unit: "\u0E44\u0E1A\u0E15\u0E4C", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" }, + array: { unit: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" }, + set: { unit: "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19", + email: "\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E2D\u0E35\u0E40\u0E21\u0E25", + url: "URL", + emoji: "\u0E2D\u0E34\u0E42\u0E21\u0E08\u0E34", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO", + date: "\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E41\u0E1A\u0E1A ISO", + time: "\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO", + duration: "\u0E0A\u0E48\u0E27\u0E07\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO", + ipv4: "\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv4", + ipv6: "\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv6", + cidrv4: "\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv4", + cidrv6: "\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv6", + base64: "\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64", + base64url: "\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64 \u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A URL", + json_string: "\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A JSON", + e164: "\u0E40\u0E1A\u0E2D\u0E23\u0E4C\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E23\u0E30\u0E2B\u0E27\u0E48\u0E32\u0E07\u0E1B\u0E23\u0E30\u0E40\u0E17\u0E28 (E.164)", + jwt: "\u0E42\u0E17\u0E40\u0E04\u0E19 JWT", + template_literal: "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02", + array: "\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E23\u0E22\u0E4C (Array)", + null: "\u0E44\u0E21\u0E48\u0E21\u0E35\u0E04\u0E48\u0E32 (null)" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 instanceof ${issue2.expected} \u0E41\u0E15\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A ${received}`; + } + return `\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${expected} \u0E41\u0E15\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u0E04\u0E48\u0E32\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${stringifyPrimitive(issue2.values[0])}`; + return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19\u0E2B\u0E19\u0E36\u0E48\u0E07\u0E43\u0E19 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19" : "\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin ?? "\u0E04\u0E48\u0E32"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.maximum.toString()} ${sizing.unit ?? "\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23"}`; + return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin ?? "\u0E04\u0E48\u0E32"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? "\u0E2D\u0E22\u0E48\u0E32\u0E07\u0E19\u0E49\u0E2D\u0E22" : "\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue2.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E02\u0E36\u0E49\u0E19\u0E15\u0E49\u0E19\u0E14\u0E49\u0E27\u0E22 "${_issue.prefix}"`; + } + if (_issue.format === "ends_with") + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E25\u0E07\u0E17\u0E49\u0E32\u0E22\u0E14\u0E49\u0E27\u0E22 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E21\u0E35 "${_issue.includes}" \u0E2D\u0E22\u0E39\u0E48\u0E43\u0E19\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21`; + if (_issue.format === "regex") + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14 ${_issue.pattern}`; + return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E40\u0E1B\u0E47\u0E19\u0E08\u0E33\u0E19\u0E27\u0E19\u0E17\u0E35\u0E48\u0E2B\u0E32\u0E23\u0E14\u0E49\u0E27\u0E22 ${issue2.divisor} \u0E44\u0E14\u0E49\u0E25\u0E07\u0E15\u0E31\u0E27`; + case "unrecognized_keys": + return `\u0E1E\u0E1A\u0E04\u0E35\u0E22\u0E4C\u0E17\u0E35\u0E48\u0E44\u0E21\u0E48\u0E23\u0E39\u0E49\u0E08\u0E31\u0E01: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u0E04\u0E35\u0E22\u0E4C\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue2.origin}`; + case "invalid_union": + return "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E44\u0E21\u0E48\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E22\u0E39\u0E40\u0E19\u0E35\u0E22\u0E19\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E44\u0E27\u0E49"; + case "invalid_element": + return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue2.origin}`; + default: + return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07`; + } + }; +}; +function th_default() { + return { + localeError: error39() + }; +} + +// node_modules/zod/v4/locales/tr.js +var error40 = () => { + const Sizable = { + string: { unit: "karakter", verb: "olmal\u0131" }, + file: { unit: "bayt", verb: "olmal\u0131" }, + array: { unit: "\xF6\u011Fe", verb: "olmal\u0131" }, + set: { unit: "\xF6\u011Fe", verb: "olmal\u0131" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "girdi", + email: "e-posta adresi", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO tarih ve saat", + date: "ISO tarih", + time: "ISO saat", + duration: "ISO s\xFCre", + ipv4: "IPv4 adresi", + ipv6: "IPv6 adresi", + cidrv4: "IPv4 aral\u0131\u011F\u0131", + cidrv6: "IPv6 aral\u0131\u011F\u0131", + base64: "base64 ile \u015Fifrelenmi\u015F metin", + base64url: "base64url ile \u015Fifrelenmi\u015F metin", + json_string: "JSON dizesi", + e164: "E.164 say\u0131s\u0131", + jwt: "JWT", + template_literal: "\u015Eablon dizesi" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Ge\xE7ersiz de\u011Fer: beklenen instanceof ${issue2.expected}, al\u0131nan ${received}`; + } + return `Ge\xE7ersiz de\u011Fer: beklenen ${expected}, al\u0131nan ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Ge\xE7ersiz de\u011Fer: beklenen ${stringifyPrimitive(issue2.values[0])}`; + return `Ge\xE7ersiz se\xE7enek: a\u015Fa\u011F\u0131dakilerden biri olmal\u0131: ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ok b\xFCy\xFCk: beklenen ${issue2.origin ?? "de\u011Fer"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\xF6\u011Fe"}`; + return `\xC7ok b\xFCy\xFCk: beklenen ${issue2.origin ?? "de\u011Fer"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\xC7ok k\xFC\xE7\xFCk: beklenen ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + return `\xC7ok k\xFC\xE7\xFCk: beklenen ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Ge\xE7ersiz metin: "${_issue.prefix}" ile ba\u015Flamal\u0131`; + if (_issue.format === "ends_with") + return `Ge\xE7ersiz metin: "${_issue.suffix}" ile bitmeli`; + if (_issue.format === "includes") + return `Ge\xE7ersiz metin: "${_issue.includes}" i\xE7ermeli`; + if (_issue.format === "regex") + return `Ge\xE7ersiz metin: ${_issue.pattern} desenine uymal\u0131`; + return `Ge\xE7ersiz ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Ge\xE7ersiz say\u0131: ${issue2.divisor} ile tam b\xF6l\xFCnebilmeli`; + case "unrecognized_keys": + return `Tan\u0131nmayan anahtar${issue2.keys.length > 1 ? "lar" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} i\xE7inde ge\xE7ersiz anahtar`; + case "invalid_union": + return "Ge\xE7ersiz de\u011Fer"; + case "invalid_element": + return `${issue2.origin} i\xE7inde ge\xE7ersiz de\u011Fer`; + default: + return `Ge\xE7ersiz de\u011Fer`; + } + }; +}; +function tr_default() { + return { + localeError: error40() + }; +} + +// node_modules/zod/v4/locales/uk.js +var error41 = () => { + const Sizable = { + string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" }, + file: { unit: "\u0431\u0430\u0439\u0442\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" }, + array: { unit: "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" }, + set: { unit: "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456", + email: "\u0430\u0434\u0440\u0435\u0441\u0430 \u0435\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0457 \u043F\u043E\u0448\u0442\u0438", + url: "URL", + emoji: "\u0435\u043C\u043E\u0434\u0437\u0456", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\u0434\u0430\u0442\u0430 \u0442\u0430 \u0447\u0430\u0441 ISO", + date: "\u0434\u0430\u0442\u0430 ISO", + time: "\u0447\u0430\u0441 ISO", + duration: "\u0442\u0440\u0438\u0432\u0430\u043B\u0456\u0441\u0442\u044C ISO", + ipv4: "\u0430\u0434\u0440\u0435\u0441\u0430 IPv4", + ipv6: "\u0430\u0434\u0440\u0435\u0441\u0430 IPv6", + cidrv4: "\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv4", + cidrv6: "\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv6", + base64: "\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64", + base64url: "\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64url", + json_string: "\u0440\u044F\u0434\u043E\u043A JSON", + e164: "\u043D\u043E\u043C\u0435\u0440 E.164", + jwt: "JWT", + template_literal: "\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0447\u0438\u0441\u043B\u043E", + array: "\u043C\u0430\u0441\u0438\u0432" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F instanceof ${issue2.expected}, \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E ${received}`; + } + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${expected}, \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${stringifyPrimitive(issue2.values[0])}`; + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0430 \u043E\u043F\u0446\u0456\u044F: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F \u043E\u0434\u043D\u0435 \u0437 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F"} ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432"}`; + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin ?? "\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F"} \u0431\u0443\u0434\u0435 ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue2.origin} \u0431\u0443\u0434\u0435 ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043F\u043E\u0447\u0438\u043D\u0430\u0442\u0438\u0441\u044F \u0437 "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0437\u0430\u043A\u0456\u043D\u0447\u0443\u0432\u0430\u0442\u0438\u0441\u044F \u043D\u0430 "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043C\u0456\u0441\u0442\u0438\u0442\u0438 "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0442\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`; + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0447\u0438\u0441\u043B\u043E: \u043F\u043E\u0432\u0438\u043D\u043D\u043E \u0431\u0443\u0442\u0438 \u043A\u0440\u0430\u0442\u043D\u0438\u043C ${issue2.divisor}`; + case "unrecognized_keys": + return `\u041D\u0435\u0440\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u043D\u0438\u0439 \u043A\u043B\u044E\u0447${issue2.keys.length > 1 ? "\u0456" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u0443 ${issue2.origin}`; + case "invalid_union": + return "\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456"; + case "invalid_element": + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0443 ${issue2.origin}`; + default: + return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456`; + } + }; +}; +function uk_default() { + return { + localeError: error41() + }; +} + +// node_modules/zod/v4/locales/ua.js +function ua_default() { + return uk_default(); +} + +// node_modules/zod/v4/locales/ur.js +var error42 = () => { + const Sizable = { + string: { unit: "\u062D\u0631\u0648\u0641", verb: "\u06C1\u0648\u0646\u0627" }, + file: { unit: "\u0628\u0627\u0626\u0679\u0633", verb: "\u06C1\u0648\u0646\u0627" }, + array: { unit: "\u0622\u0626\u0679\u0645\u0632", verb: "\u06C1\u0648\u0646\u0627" }, + set: { unit: "\u0622\u0626\u0679\u0645\u0632", verb: "\u06C1\u0648\u0646\u0627" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0627\u0646 \u067E\u0679", + email: "\u0627\u06CC \u0645\u06CC\u0644 \u0627\u06CC\u0688\u0631\u06CC\u0633", + url: "\u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644", + emoji: "\u0627\u06CC\u0645\u0648\u062C\u06CC", + uuid: "\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + uuidv4: "\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 4", + uuidv6: "\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 6", + nanoid: "\u0646\u06CC\u0646\u0648 \u0622\u0626\u06CC \u0688\u06CC", + guid: "\u062C\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + cuid: "\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + cuid2: "\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC 2", + ulid: "\u06CC\u0648 \u0627\u06CC\u0644 \u0622\u0626\u06CC \u0688\u06CC", + xid: "\u0627\u06CC\u06A9\u0633 \u0622\u0626\u06CC \u0688\u06CC", + ksuid: "\u06A9\u06D2 \u0627\u06CC\u0633 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC", + datetime: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0688\u06CC\u0679 \u0679\u0627\u0626\u0645", + date: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u062A\u0627\u0631\u06CC\u062E", + time: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0648\u0642\u062A", + duration: "\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0645\u062F\u062A", + ipv4: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0627\u06CC\u0688\u0631\u06CC\u0633", + ipv6: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0627\u06CC\u0688\u0631\u06CC\u0633", + cidrv4: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0631\u06CC\u0646\u062C", + cidrv6: "\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0631\u06CC\u0646\u062C", + base64: "\u0628\u06CC\u0633 64 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF", + base64url: "\u0628\u06CC\u0633 64 \u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF", + json_string: "\u062C\u06D2 \u0627\u06CC\u0633 \u0627\u0648 \u0627\u06CC\u0646 \u0633\u0679\u0631\u0646\u06AF", + e164: "\u0627\u06CC 164 \u0646\u0645\u0628\u0631", + jwt: "\u062C\u06D2 \u0688\u0628\u0644\u06CC\u0648 \u0679\u06CC", + template_literal: "\u0627\u0646 \u067E\u0679" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u0646\u0645\u0628\u0631", + array: "\u0622\u0631\u06D2", + null: "\u0646\u0644" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: instanceof ${issue2.expected} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627\u060C ${received} \u0645\u0648\u0635\u0648\u0644 \u06C1\u0648\u0627`; + } + return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${expected} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627\u060C ${received} \u0645\u0648\u0635\u0648\u0644 \u06C1\u0648\u0627`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${stringifyPrimitive(issue2.values[0])} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + return `\u063A\u0644\u0637 \u0622\u067E\u0634\u0646: ${joinValues(issue2.values, "|")} \u0645\u06CC\u06BA \u0633\u06D2 \u0627\u06CC\u06A9 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue2.origin ?? "\u0648\u06CC\u0644\u06CC\u0648"} \u06A9\u06D2 ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u0639\u0646\u0627\u0635\u0631"} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`; + return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue2.origin ?? "\u0648\u06CC\u0644\u06CC\u0648"} \u06A9\u0627 ${adj}${issue2.maximum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue2.origin} \u06A9\u06D2 ${adj}${issue2.minimum.toString()} ${sizing.unit} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`; + } + return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue2.origin} \u06A9\u0627 ${adj}${issue2.minimum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: "${_issue.prefix}" \u0633\u06D2 \u0634\u0631\u0648\u0639 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + } + if (_issue.format === "ends_with") + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: "${_issue.suffix}" \u067E\u0631 \u062E\u062A\u0645 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + if (_issue.format === "includes") + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: "${_issue.includes}" \u0634\u0627\u0645\u0644 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + if (_issue.format === "regex") + return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \u067E\u06CC\u0679\u0631\u0646 ${_issue.pattern} \u0633\u06D2 \u0645\u06CC\u0686 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + return `\u063A\u0644\u0637 ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u063A\u0644\u0637 \u0646\u0645\u0628\u0631: ${issue2.divisor} \u06A9\u0627 \u0645\u0636\u0627\u0639\u0641 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`; + case "unrecognized_keys": + return `\u063A\u06CC\u0631 \u062A\u0633\u0644\u06CC\u0645 \u0634\u062F\u06C1 \u06A9\u06CC${issue2.keys.length > 1 ? "\u0632" : ""}: ${joinValues(issue2.keys, "\u060C ")}`; + case "invalid_key": + return `${issue2.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u06A9\u06CC`; + case "invalid_union": + return "\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679"; + case "invalid_element": + return `${issue2.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u0648\u06CC\u0644\u06CC\u0648`; + default: + return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679`; + } + }; +}; +function ur_default() { + return { + localeError: error42() + }; +} + +// node_modules/zod/v4/locales/uz.js +var error43 = () => { + const Sizable = { + string: { unit: "belgi", verb: "bo\u2018lishi kerak" }, + file: { unit: "bayt", verb: "bo\u2018lishi kerak" }, + array: { unit: "element", verb: "bo\u2018lishi kerak" }, + set: { unit: "element", verb: "bo\u2018lishi kerak" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "kirish", + email: "elektron pochta manzili", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO sana va vaqti", + date: "ISO sana", + time: "ISO vaqt", + duration: "ISO davomiylik", + ipv4: "IPv4 manzil", + ipv6: "IPv6 manzil", + mac: "MAC manzil", + cidrv4: "IPv4 diapazon", + cidrv6: "IPv6 diapazon", + base64: "base64 kodlangan satr", + base64url: "base64url kodlangan satr", + json_string: "JSON satr", + e164: "E.164 raqam", + jwt: "JWT", + template_literal: "kirish" + }; + const TypeDictionary = { + nan: "NaN", + number: "raqam", + array: "massiv" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `Noto\u2018g\u2018ri kirish: kutilgan instanceof ${issue2.expected}, qabul qilingan ${received}`; + } + return `Noto\u2018g\u2018ri kirish: kutilgan ${expected}, qabul qilingan ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `Noto\u2018g\u2018ri kirish: kutilgan ${stringifyPrimitive(issue2.values[0])}`; + return `Noto\u2018g\u2018ri variant: quyidagilardan biri kutilgan ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Juda katta: kutilgan ${issue2.origin ?? "qiymat"} ${adj}${issue2.maximum.toString()} ${sizing.unit} ${sizing.verb}`; + return `Juda katta: kutilgan ${issue2.origin ?? "qiymat"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Juda kichik: kutilgan ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit} ${sizing.verb}`; + } + return `Juda kichik: kutilgan ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Noto\u2018g\u2018ri satr: "${_issue.prefix}" bilan boshlanishi kerak`; + if (_issue.format === "ends_with") + return `Noto\u2018g\u2018ri satr: "${_issue.suffix}" bilan tugashi kerak`; + if (_issue.format === "includes") + return `Noto\u2018g\u2018ri satr: "${_issue.includes}" ni o\u2018z ichiga olishi kerak`; + if (_issue.format === "regex") + return `Noto\u2018g\u2018ri satr: ${_issue.pattern} shabloniga mos kelishi kerak`; + return `Noto\u2018g\u2018ri ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `Noto\u2018g\u2018ri raqam: ${issue2.divisor} ning karralisi bo\u2018lishi kerak`; + case "unrecognized_keys": + return `Noma\u2019lum kalit${issue2.keys.length > 1 ? "lar" : ""}: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} dagi kalit noto\u2018g\u2018ri`; + case "invalid_union": + return "Noto\u2018g\u2018ri kirish"; + case "invalid_element": + return `${issue2.origin} da noto\u2018g\u2018ri qiymat`; + default: + return `Noto\u2018g\u2018ri kirish`; + } + }; +}; +function uz_default() { + return { + localeError: error43() + }; +} + +// node_modules/zod/v4/locales/vi.js +var error44 = () => { + const Sizable = { + string: { unit: "k\xFD t\u1EF1", verb: "c\xF3" }, + file: { unit: "byte", verb: "c\xF3" }, + array: { unit: "ph\u1EA7n t\u1EED", verb: "c\xF3" }, + set: { unit: "ph\u1EA7n t\u1EED", verb: "c\xF3" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u0111\u1EA7u v\xE0o", + email: "\u0111\u1ECBa ch\u1EC9 email", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ng\xE0y gi\u1EDD ISO", + date: "ng\xE0y ISO", + time: "gi\u1EDD ISO", + duration: "kho\u1EA3ng th\u1EDDi gian ISO", + ipv4: "\u0111\u1ECBa ch\u1EC9 IPv4", + ipv6: "\u0111\u1ECBa ch\u1EC9 IPv6", + cidrv4: "d\u1EA3i IPv4", + cidrv6: "d\u1EA3i IPv6", + base64: "chu\u1ED7i m\xE3 h\xF3a base64", + base64url: "chu\u1ED7i m\xE3 h\xF3a base64url", + json_string: "chu\u1ED7i JSON", + e164: "s\u1ED1 E.164", + jwt: "JWT", + template_literal: "\u0111\u1EA7u v\xE0o" + }; + const TypeDictionary = { + nan: "NaN", + number: "s\u1ED1", + array: "m\u1EA3ng" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i instanceof ${issue2.expected}, nh\u1EADn \u0111\u01B0\u1EE3c ${received}`; + } + return `\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${expected}, nh\u1EADn \u0111\u01B0\u1EE3c ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${stringifyPrimitive(issue2.values[0])}`; + return `T\xF9y ch\u1ECDn kh\xF4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i m\u1ED9t trong c\xE1c gi\xE1 tr\u1ECB ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `Qu\xE1 l\u1EDBn: mong \u0111\u1EE3i ${issue2.origin ?? "gi\xE1 tr\u1ECB"} ${sizing.verb} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "ph\u1EA7n t\u1EED"}`; + return `Qu\xE1 l\u1EDBn: mong \u0111\u1EE3i ${issue2.origin ?? "gi\xE1 tr\u1ECB"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `Qu\xE1 nh\u1ECF: mong \u0111\u1EE3i ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `Qu\xE1 nh\u1ECF: mong \u0111\u1EE3i ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i k\u1EBFt th\xFAc b\u1EB1ng "${_issue.suffix}"`; + if (_issue.format === "includes") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i bao g\u1ED3m "${_issue.includes}"`; + if (_issue.format === "regex") + return `Chu\u1ED7i kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i kh\u1EDBp v\u1EDBi m\u1EABu ${_issue.pattern}`; + return `${FormatDictionary[_issue.format] ?? issue2.format} kh\xF4ng h\u1EE3p l\u1EC7`; + } + case "not_multiple_of": + return `S\u1ED1 kh\xF4ng h\u1EE3p l\u1EC7: ph\u1EA3i l\xE0 b\u1ED9i s\u1ED1 c\u1EE7a ${issue2.divisor}`; + case "unrecognized_keys": + return `Kh\xF3a kh\xF4ng \u0111\u01B0\u1EE3c nh\u1EADn d\u1EA1ng: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `Kh\xF3a kh\xF4ng h\u1EE3p l\u1EC7 trong ${issue2.origin}`; + case "invalid_union": + return "\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7"; + case "invalid_element": + return `Gi\xE1 tr\u1ECB kh\xF4ng h\u1EE3p l\u1EC7 trong ${issue2.origin}`; + default: + return `\u0110\u1EA7u v\xE0o kh\xF4ng h\u1EE3p l\u1EC7`; + } + }; +}; +function vi_default() { + return { + localeError: error44() + }; +} + +// node_modules/zod/v4/locales/zh-CN.js +var error45 = () => { + const Sizable = { + string: { unit: "\u5B57\u7B26", verb: "\u5305\u542B" }, + file: { unit: "\u5B57\u8282", verb: "\u5305\u542B" }, + array: { unit: "\u9879", verb: "\u5305\u542B" }, + set: { unit: "\u9879", verb: "\u5305\u542B" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u8F93\u5165", + email: "\u7535\u5B50\u90AE\u4EF6", + url: "URL", + emoji: "\u8868\u60C5\u7B26\u53F7", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO\u65E5\u671F\u65F6\u95F4", + date: "ISO\u65E5\u671F", + time: "ISO\u65F6\u95F4", + duration: "ISO\u65F6\u957F", + ipv4: "IPv4\u5730\u5740", + ipv6: "IPv6\u5730\u5740", + cidrv4: "IPv4\u7F51\u6BB5", + cidrv6: "IPv6\u7F51\u6BB5", + base64: "base64\u7F16\u7801\u5B57\u7B26\u4E32", + base64url: "base64url\u7F16\u7801\u5B57\u7B26\u4E32", + json_string: "JSON\u5B57\u7B26\u4E32", + e164: "E.164\u53F7\u7801", + jwt: "JWT", + template_literal: "\u8F93\u5165" + }; + const TypeDictionary = { + nan: "NaN", + number: "\u6570\u5B57", + array: "\u6570\u7EC4", + null: "\u7A7A\u503C(null)" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B instanceof ${issue2.expected}\uFF0C\u5B9E\u9645\u63A5\u6536 ${received}`; + } + return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${expected}\uFF0C\u5B9E\u9645\u63A5\u6536 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${stringifyPrimitive(issue2.values[0])}`; + return `\u65E0\u6548\u9009\u9879\uFF1A\u671F\u671B\u4EE5\u4E0B\u4E4B\u4E00 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue2.origin ?? "\u503C"} ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u4E2A\u5143\u7D20"}`; + return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue2.origin ?? "\u503C"} ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue2.origin} ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue2.origin} ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 "${_issue.prefix}" \u5F00\u5934`; + if (_issue.format === "ends_with") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 "${_issue.suffix}" \u7ED3\u5C3E`; + if (_issue.format === "includes") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u5305\u542B "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u6EE1\u8DB3\u6B63\u5219\u8868\u8FBE\u5F0F ${_issue.pattern}`; + return `\u65E0\u6548${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u65E0\u6548\u6570\u5B57\uFF1A\u5FC5\u987B\u662F ${issue2.divisor} \u7684\u500D\u6570`; + case "unrecognized_keys": + return `\u51FA\u73B0\u672A\u77E5\u7684\u952E(key): ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `${issue2.origin} \u4E2D\u7684\u952E(key)\u65E0\u6548`; + case "invalid_union": + return "\u65E0\u6548\u8F93\u5165"; + case "invalid_element": + return `${issue2.origin} \u4E2D\u5305\u542B\u65E0\u6548\u503C(value)`; + default: + return `\u65E0\u6548\u8F93\u5165`; + } + }; +}; +function zh_CN_default() { + return { + localeError: error45() + }; +} + +// node_modules/zod/v4/locales/zh-TW.js +var error46 = () => { + const Sizable = { + string: { unit: "\u5B57\u5143", verb: "\u64C1\u6709" }, + file: { unit: "\u4F4D\u5143\u7D44", verb: "\u64C1\u6709" }, + array: { unit: "\u9805\u76EE", verb: "\u64C1\u6709" }, + set: { unit: "\u9805\u76EE", verb: "\u64C1\u6709" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u8F38\u5165", + email: "\u90F5\u4EF6\u5730\u5740", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "ISO \u65E5\u671F\u6642\u9593", + date: "ISO \u65E5\u671F", + time: "ISO \u6642\u9593", + duration: "ISO \u671F\u9593", + ipv4: "IPv4 \u4F4D\u5740", + ipv6: "IPv6 \u4F4D\u5740", + cidrv4: "IPv4 \u7BC4\u570D", + cidrv6: "IPv6 \u7BC4\u570D", + base64: "base64 \u7DE8\u78BC\u5B57\u4E32", + base64url: "base64url \u7DE8\u78BC\u5B57\u4E32", + json_string: "JSON \u5B57\u4E32", + e164: "E.164 \u6578\u503C", + jwt: "JWT", + template_literal: "\u8F38\u5165" + }; + const TypeDictionary = { + nan: "NaN" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA instanceof ${issue2.expected}\uFF0C\u4F46\u6536\u5230 ${received}`; + } + return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${expected}\uFF0C\u4F46\u6536\u5230 ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${stringifyPrimitive(issue2.values[0])}`; + return `\u7121\u6548\u7684\u9078\u9805\uFF1A\u9810\u671F\u70BA\u4EE5\u4E0B\u5176\u4E2D\u4E4B\u4E00 ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue2.origin ?? "\u503C"} \u61C9\u70BA ${adj}${issue2.maximum.toString()} ${sizing.unit ?? "\u500B\u5143\u7D20"}`; + return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue2.origin ?? "\u503C"} \u61C9\u70BA ${adj}${issue2.maximum.toString()}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) { + return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue2.origin} \u61C9\u70BA ${adj}${issue2.minimum.toString()} ${sizing.unit}`; + } + return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue2.origin} \u61C9\u70BA ${adj}${issue2.minimum.toString()}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") { + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 "${_issue.prefix}" \u958B\u982D`; + } + if (_issue.format === "ends_with") + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 "${_issue.suffix}" \u7D50\u5C3E`; + if (_issue.format === "includes") + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u5305\u542B "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u7B26\u5408\u683C\u5F0F ${_issue.pattern}`; + return `\u7121\u6548\u7684 ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `\u7121\u6548\u7684\u6578\u5B57\uFF1A\u5FC5\u9808\u70BA ${issue2.divisor} \u7684\u500D\u6578`; + case "unrecognized_keys": + return `\u7121\u6CD5\u8B58\u5225\u7684\u9375\u503C${issue2.keys.length > 1 ? "\u5011" : ""}\uFF1A${joinValues(issue2.keys, "\u3001")}`; + case "invalid_key": + return `${issue2.origin} \u4E2D\u6709\u7121\u6548\u7684\u9375\u503C`; + case "invalid_union": + return "\u7121\u6548\u7684\u8F38\u5165\u503C"; + case "invalid_element": + return `${issue2.origin} \u4E2D\u6709\u7121\u6548\u7684\u503C`; + default: + return `\u7121\u6548\u7684\u8F38\u5165\u503C`; + } + }; +}; +function zh_TW_default() { + return { + localeError: error46() + }; +} + +// node_modules/zod/v4/locales/yo.js +var error47 = () => { + const Sizable = { + string: { unit: "\xE0mi", verb: "n\xED" }, + file: { unit: "bytes", verb: "n\xED" }, + array: { unit: "nkan", verb: "n\xED" }, + set: { unit: "nkan", verb: "n\xED" } + }; + function getSizing(origin) { + return Sizable[origin] ?? null; + } + const FormatDictionary = { + regex: "\u1EB9\u0300r\u1ECD \xECb\xE1w\u1ECDl\xE9", + email: "\xE0d\xEDr\u1EB9\u0301s\xEC \xECm\u1EB9\u0301l\xEC", + url: "URL", + emoji: "emoji", + uuid: "UUID", + uuidv4: "UUIDv4", + uuidv6: "UUIDv6", + nanoid: "nanoid", + guid: "GUID", + cuid: "cuid", + cuid2: "cuid2", + ulid: "ULID", + xid: "XID", + ksuid: "KSUID", + datetime: "\xE0k\xF3k\xF2 ISO", + date: "\u1ECDj\u1ECD\u0301 ISO", + time: "\xE0k\xF3k\xF2 ISO", + duration: "\xE0k\xF3k\xF2 t\xF3 p\xE9 ISO", + ipv4: "\xE0d\xEDr\u1EB9\u0301s\xEC IPv4", + ipv6: "\xE0d\xEDr\u1EB9\u0301s\xEC IPv6", + cidrv4: "\xE0gb\xE8gb\xE8 IPv4", + cidrv6: "\xE0gb\xE8gb\xE8 IPv6", + base64: "\u1ECD\u0300r\u1ECD\u0300 t\xED a k\u1ECD\u0301 n\xED base64", + base64url: "\u1ECD\u0300r\u1ECD\u0300 base64url", + json_string: "\u1ECD\u0300r\u1ECD\u0300 JSON", + e164: "n\u1ECD\u0301mb\xE0 E.164", + jwt: "JWT", + template_literal: "\u1EB9\u0300r\u1ECD \xECb\xE1w\u1ECDl\xE9" + }; + const TypeDictionary = { + nan: "NaN", + number: "n\u1ECD\u0301mb\xE0", + array: "akop\u1ECD" + }; + return (issue2) => { + switch (issue2.code) { + case "invalid_type": { + const expected = TypeDictionary[issue2.expected] ?? issue2.expected; + const receivedType = parsedType(issue2.input); + const received = TypeDictionary[receivedType] ?? receivedType; + if (/^[A-Z]/.test(issue2.expected)) { + return `\xCCb\xE1w\u1ECDl\xE9 a\u1E63\xEC\u1E63e: a n\xED l\xE1ti fi instanceof ${issue2.expected}, \xE0m\u1ECD\u0300 a r\xED ${received}`; + } + return `\xCCb\xE1w\u1ECDl\xE9 a\u1E63\xEC\u1E63e: a n\xED l\xE1ti fi ${expected}, \xE0m\u1ECD\u0300 a r\xED ${received}`; + } + case "invalid_value": + if (issue2.values.length === 1) + return `\xCCb\xE1w\u1ECDl\xE9 a\u1E63\xEC\u1E63e: a n\xED l\xE1ti fi ${stringifyPrimitive(issue2.values[0])}`; + return `\xC0\u1E63\xE0y\xE0n a\u1E63\xEC\u1E63e: yan \u1ECD\u0300kan l\xE1ra ${joinValues(issue2.values, "|")}`; + case "too_big": { + const adj = issue2.inclusive ? "<=" : "<"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `T\xF3 p\u1ECD\u0300 j\xF9: a n\xED l\xE1ti j\u1EB9\u0301 p\xE9 ${issue2.origin ?? "iye"} ${sizing.verb} ${adj}${issue2.maximum} ${sizing.unit}`; + return `T\xF3 p\u1ECD\u0300 j\xF9: a n\xED l\xE1ti j\u1EB9\u0301 ${adj}${issue2.maximum}`; + } + case "too_small": { + const adj = issue2.inclusive ? ">=" : ">"; + const sizing = getSizing(issue2.origin); + if (sizing) + return `K\xE9r\xE9 ju: a n\xED l\xE1ti j\u1EB9\u0301 p\xE9 ${issue2.origin} ${sizing.verb} ${adj}${issue2.minimum} ${sizing.unit}`; + return `K\xE9r\xE9 ju: a n\xED l\xE1ti j\u1EB9\u0301 ${adj}${issue2.minimum}`; + } + case "invalid_format": { + const _issue = issue2; + if (_issue.format === "starts_with") + return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\xEC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 b\u1EB9\u0300r\u1EB9\u0300 p\u1EB9\u0300l\xFA "${_issue.prefix}"`; + if (_issue.format === "ends_with") + return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\xEC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 par\xED p\u1EB9\u0300l\xFA "${_issue.suffix}"`; + if (_issue.format === "includes") + return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\xEC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 n\xED "${_issue.includes}"`; + if (_issue.format === "regex") + return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\xEC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 b\xE1 \xE0p\u1EB9\u1EB9r\u1EB9 mu ${_issue.pattern}`; + return `A\u1E63\xEC\u1E63e: ${FormatDictionary[_issue.format] ?? issue2.format}`; + } + case "not_multiple_of": + return `N\u1ECD\u0301mb\xE0 a\u1E63\xEC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 j\u1EB9\u0301 \xE8y\xE0 p\xEDp\xEDn ti ${issue2.divisor}`; + case "unrecognized_keys": + return `B\u1ECDt\xECn\xEC \xE0\xECm\u1ECD\u0300: ${joinValues(issue2.keys, ", ")}`; + case "invalid_key": + return `B\u1ECDt\xECn\xEC a\u1E63\xEC\u1E63e n\xEDn\xFA ${issue2.origin}`; + case "invalid_union": + return "\xCCb\xE1w\u1ECDl\xE9 a\u1E63\xEC\u1E63e"; + case "invalid_element": + return `Iye a\u1E63\xEC\u1E63e n\xEDn\xFA ${issue2.origin}`; + default: + return "\xCCb\xE1w\u1ECDl\xE9 a\u1E63\xEC\u1E63e"; + } + }; +}; +function yo_default() { + return { + localeError: error47() + }; +} + +// node_modules/zod/v4/core/registries.js +var _a; +var $output = /* @__PURE__ */ Symbol("ZodOutput"); +var $input = /* @__PURE__ */ Symbol("ZodInput"); +var $ZodRegistry = class { + constructor() { + this._map = /* @__PURE__ */ new WeakMap(); + this._idmap = /* @__PURE__ */ new Map(); + } + add(schema, ..._meta) { + const meta3 = _meta[0]; + this._map.set(schema, meta3); + if (meta3 && typeof meta3 === "object" && "id" in meta3) { + this._idmap.set(meta3.id, schema); + } + return this; + } + clear() { + this._map = /* @__PURE__ */ new WeakMap(); + this._idmap = /* @__PURE__ */ new Map(); + return this; + } + remove(schema) { + const meta3 = this._map.get(schema); + if (meta3 && typeof meta3 === "object" && "id" in meta3) { + this._idmap.delete(meta3.id); + } + this._map.delete(schema); + return this; + } + get(schema) { + const p = schema._zod.parent; + if (p) { + const pm = { ...this.get(p) ?? {} }; + delete pm.id; + const f = { ...pm, ...this._map.get(schema) }; + return Object.keys(f).length ? f : void 0; + } + return this._map.get(schema); + } + has(schema) { + return this._map.has(schema); + } +}; +function registry() { + return new $ZodRegistry(); +} +(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry()); +var globalRegistry = globalThis.__zod_globalRegistry; + +// node_modules/zod/v4/core/api.js +// @__NO_SIDE_EFFECTS__ +function _string(Class2, params) { + return new Class2({ + type: "string", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _coercedString(Class2, params) { + return new Class2({ + type: "string", + coerce: true, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _email(Class2, params) { + return new Class2({ + type: "string", + format: "email", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _guid(Class2, params) { + return new Class2({ + type: "string", + format: "guid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _uuid(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _uuidv4(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v4", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _uuidv6(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v6", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _uuidv7(Class2, params) { + return new Class2({ + type: "string", + format: "uuid", + check: "string_format", + abort: false, + version: "v7", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _url(Class2, params) { + return new Class2({ + type: "string", + format: "url", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _emoji2(Class2, params) { + return new Class2({ + type: "string", + format: "emoji", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _nanoid(Class2, params) { + return new Class2({ + type: "string", + format: "nanoid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _cuid(Class2, params) { + return new Class2({ + type: "string", + format: "cuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _cuid2(Class2, params) { + return new Class2({ + type: "string", + format: "cuid2", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _ulid(Class2, params) { + return new Class2({ + type: "string", + format: "ulid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _xid(Class2, params) { + return new Class2({ + type: "string", + format: "xid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _ksuid(Class2, params) { + return new Class2({ + type: "string", + format: "ksuid", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _ipv4(Class2, params) { + return new Class2({ + type: "string", + format: "ipv4", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _ipv6(Class2, params) { + return new Class2({ + type: "string", + format: "ipv6", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _mac(Class2, params) { + return new Class2({ + type: "string", + format: "mac", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _cidrv4(Class2, params) { + return new Class2({ + type: "string", + format: "cidrv4", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _cidrv6(Class2, params) { + return new Class2({ + type: "string", + format: "cidrv6", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _base64(Class2, params) { + return new Class2({ + type: "string", + format: "base64", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _base64url(Class2, params) { + return new Class2({ + type: "string", + format: "base64url", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _e164(Class2, params) { + return new Class2({ + type: "string", + format: "e164", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _jwt(Class2, params) { + return new Class2({ + type: "string", + format: "jwt", + check: "string_format", + abort: false, + ...normalizeParams(params) + }); +} +var TimePrecision = { + Any: null, + Minute: -1, + Second: 0, + Millisecond: 3, + Microsecond: 6 +}; +// @__NO_SIDE_EFFECTS__ +function _isoDateTime(Class2, params) { + return new Class2({ + type: "string", + format: "datetime", + check: "string_format", + offset: false, + local: false, + precision: null, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _isoDate(Class2, params) { + return new Class2({ + type: "string", + format: "date", + check: "string_format", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _isoTime(Class2, params) { + return new Class2({ + type: "string", + format: "time", + check: "string_format", + precision: null, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _isoDuration(Class2, params) { + return new Class2({ + type: "string", + format: "duration", + check: "string_format", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _number(Class2, params) { + return new Class2({ + type: "number", + checks: [], + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _coercedNumber(Class2, params) { + return new Class2({ + type: "number", + coerce: true, + checks: [], + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _int(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "safeint", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _float32(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "float32", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _float64(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "float64", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _int32(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "int32", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _uint32(Class2, params) { + return new Class2({ + type: "number", + check: "number_format", + abort: false, + format: "uint32", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _boolean(Class2, params) { + return new Class2({ + type: "boolean", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _coercedBoolean(Class2, params) { + return new Class2({ + type: "boolean", + coerce: true, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _bigint(Class2, params) { + return new Class2({ + type: "bigint", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _coercedBigint(Class2, params) { + return new Class2({ + type: "bigint", + coerce: true, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _int64(Class2, params) { + return new Class2({ + type: "bigint", + check: "bigint_format", + abort: false, + format: "int64", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _uint64(Class2, params) { + return new Class2({ + type: "bigint", + check: "bigint_format", + abort: false, + format: "uint64", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _symbol(Class2, params) { + return new Class2({ + type: "symbol", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _undefined2(Class2, params) { + return new Class2({ + type: "undefined", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _null2(Class2, params) { + return new Class2({ + type: "null", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _any(Class2) { + return new Class2({ + type: "any" + }); +} +// @__NO_SIDE_EFFECTS__ +function _unknown(Class2) { + return new Class2({ + type: "unknown" + }); +} +// @__NO_SIDE_EFFECTS__ +function _never(Class2, params) { + return new Class2({ + type: "never", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _void(Class2, params) { + return new Class2({ + type: "void", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _date(Class2, params) { + return new Class2({ + type: "date", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _coercedDate(Class2, params) { + return new Class2({ + type: "date", + coerce: true, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _nan(Class2, params) { + return new Class2({ + type: "nan", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _lt(value, params) { + return new $ZodCheckLessThan({ + check: "less_than", + ...normalizeParams(params), + value, + inclusive: false + }); +} +// @__NO_SIDE_EFFECTS__ +function _lte(value, params) { + return new $ZodCheckLessThan({ + check: "less_than", + ...normalizeParams(params), + value, + inclusive: true + }); +} +// @__NO_SIDE_EFFECTS__ +function _gt(value, params) { + return new $ZodCheckGreaterThan({ + check: "greater_than", + ...normalizeParams(params), + value, + inclusive: false + }); +} +// @__NO_SIDE_EFFECTS__ +function _gte(value, params) { + return new $ZodCheckGreaterThan({ + check: "greater_than", + ...normalizeParams(params), + value, + inclusive: true + }); +} +// @__NO_SIDE_EFFECTS__ +function _positive(params) { + return /* @__PURE__ */ _gt(0, params); +} +// @__NO_SIDE_EFFECTS__ +function _negative(params) { + return /* @__PURE__ */ _lt(0, params); +} +// @__NO_SIDE_EFFECTS__ +function _nonpositive(params) { + return /* @__PURE__ */ _lte(0, params); +} +// @__NO_SIDE_EFFECTS__ +function _nonnegative(params) { + return /* @__PURE__ */ _gte(0, params); +} +// @__NO_SIDE_EFFECTS__ +function _multipleOf(value, params) { + return new $ZodCheckMultipleOf({ + check: "multiple_of", + ...normalizeParams(params), + value + }); +} +// @__NO_SIDE_EFFECTS__ +function _maxSize(maximum, params) { + return new $ZodCheckMaxSize({ + check: "max_size", + ...normalizeParams(params), + maximum + }); +} +// @__NO_SIDE_EFFECTS__ +function _minSize(minimum, params) { + return new $ZodCheckMinSize({ + check: "min_size", + ...normalizeParams(params), + minimum + }); +} +// @__NO_SIDE_EFFECTS__ +function _size(size, params) { + return new $ZodCheckSizeEquals({ + check: "size_equals", + ...normalizeParams(params), + size + }); +} +// @__NO_SIDE_EFFECTS__ +function _maxLength(maximum, params) { + const ch = new $ZodCheckMaxLength({ + check: "max_length", + ...normalizeParams(params), + maximum + }); + return ch; +} +// @__NO_SIDE_EFFECTS__ +function _minLength(minimum, params) { + return new $ZodCheckMinLength({ + check: "min_length", + ...normalizeParams(params), + minimum + }); +} +// @__NO_SIDE_EFFECTS__ +function _length(length, params) { + return new $ZodCheckLengthEquals({ + check: "length_equals", + ...normalizeParams(params), + length + }); +} +// @__NO_SIDE_EFFECTS__ +function _regex(pattern, params) { + return new $ZodCheckRegex({ + check: "string_format", + format: "regex", + ...normalizeParams(params), + pattern + }); +} +// @__NO_SIDE_EFFECTS__ +function _lowercase(params) { + return new $ZodCheckLowerCase({ + check: "string_format", + format: "lowercase", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _uppercase(params) { + return new $ZodCheckUpperCase({ + check: "string_format", + format: "uppercase", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _includes(includes, params) { + return new $ZodCheckIncludes({ + check: "string_format", + format: "includes", + ...normalizeParams(params), + includes + }); +} +// @__NO_SIDE_EFFECTS__ +function _startsWith(prefix, params) { + return new $ZodCheckStartsWith({ + check: "string_format", + format: "starts_with", + ...normalizeParams(params), + prefix + }); +} +// @__NO_SIDE_EFFECTS__ +function _endsWith(suffix, params) { + return new $ZodCheckEndsWith({ + check: "string_format", + format: "ends_with", + ...normalizeParams(params), + suffix + }); +} +// @__NO_SIDE_EFFECTS__ +function _property(property, schema, params) { + return new $ZodCheckProperty({ + check: "property", + property, + schema, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _mime(types, params) { + return new $ZodCheckMimeType({ + check: "mime_type", + mime: types, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _overwrite(tx) { + return new $ZodCheckOverwrite({ + check: "overwrite", + tx + }); +} +// @__NO_SIDE_EFFECTS__ +function _normalize(form) { + return /* @__PURE__ */ _overwrite((input) => input.normalize(form)); +} +// @__NO_SIDE_EFFECTS__ +function _trim() { + return /* @__PURE__ */ _overwrite((input) => input.trim()); +} +// @__NO_SIDE_EFFECTS__ +function _toLowerCase() { + return /* @__PURE__ */ _overwrite((input) => input.toLowerCase()); +} +// @__NO_SIDE_EFFECTS__ +function _toUpperCase() { + return /* @__PURE__ */ _overwrite((input) => input.toUpperCase()); +} +// @__NO_SIDE_EFFECTS__ +function _slugify() { + return /* @__PURE__ */ _overwrite((input) => slugify(input)); +} +// @__NO_SIDE_EFFECTS__ +function _array(Class2, element, params) { + return new Class2({ + type: "array", + element, + // get element() { + // return element; + // }, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _union(Class2, options, params) { + return new Class2({ + type: "union", + options, + ...normalizeParams(params) + }); +} +function _xor(Class2, options, params) { + return new Class2({ + type: "union", + options, + inclusive: false, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _discriminatedUnion(Class2, discriminator, options, params) { + return new Class2({ + type: "union", + options, + discriminator, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _intersection(Class2, left, right) { + return new Class2({ + type: "intersection", + left, + right + }); +} +// @__NO_SIDE_EFFECTS__ +function _tuple(Class2, items, _paramsOrRest, _params) { + const hasRest = _paramsOrRest instanceof $ZodType; + const params = hasRest ? _params : _paramsOrRest; + const rest = hasRest ? _paramsOrRest : null; + return new Class2({ + type: "tuple", + items, + rest, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _record(Class2, keyType, valueType, params) { + return new Class2({ + type: "record", + keyType, + valueType, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _map(Class2, keyType, valueType, params) { + return new Class2({ + type: "map", + keyType, + valueType, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _set(Class2, valueType, params) { + return new Class2({ + type: "set", + valueType, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _enum(Class2, values, params) { + const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values; + return new Class2({ + type: "enum", + entries, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _nativeEnum(Class2, entries, params) { + return new Class2({ + type: "enum", + entries, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _literal(Class2, value, params) { + return new Class2({ + type: "literal", + values: Array.isArray(value) ? value : [value], + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _file(Class2, params) { + return new Class2({ + type: "file", + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _transform(Class2, fn) { + return new Class2({ + type: "transform", + transform: fn + }); +} +// @__NO_SIDE_EFFECTS__ +function _optional(Class2, innerType) { + return new Class2({ + type: "optional", + innerType + }); +} +// @__NO_SIDE_EFFECTS__ +function _nullable(Class2, innerType) { + return new Class2({ + type: "nullable", + innerType + }); +} +// @__NO_SIDE_EFFECTS__ +function _default(Class2, innerType, defaultValue) { + return new Class2({ + type: "default", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : shallowClone(defaultValue); + } + }); +} +// @__NO_SIDE_EFFECTS__ +function _nonoptional(Class2, innerType, params) { + return new Class2({ + type: "nonoptional", + innerType, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _success(Class2, innerType) { + return new Class2({ + type: "success", + innerType + }); +} +// @__NO_SIDE_EFFECTS__ +function _catch(Class2, innerType, catchValue) { + return new Class2({ + type: "catch", + innerType, + catchValue: typeof catchValue === "function" ? catchValue : () => catchValue + }); +} +// @__NO_SIDE_EFFECTS__ +function _pipe(Class2, in_, out) { + return new Class2({ + type: "pipe", + in: in_, + out + }); +} +// @__NO_SIDE_EFFECTS__ +function _readonly(Class2, innerType) { + return new Class2({ + type: "readonly", + innerType + }); +} +// @__NO_SIDE_EFFECTS__ +function _templateLiteral(Class2, parts, params) { + return new Class2({ + type: "template_literal", + parts, + ...normalizeParams(params) + }); +} +// @__NO_SIDE_EFFECTS__ +function _lazy(Class2, getter) { + return new Class2({ + type: "lazy", + getter + }); +} +// @__NO_SIDE_EFFECTS__ +function _promise(Class2, innerType) { + return new Class2({ + type: "promise", + innerType + }); +} +// @__NO_SIDE_EFFECTS__ +function _custom(Class2, fn, _params) { + const norm = normalizeParams(_params); + norm.abort ?? (norm.abort = true); + const schema = new Class2({ + type: "custom", + check: "custom", + fn, + ...norm + }); + return schema; +} +// @__NO_SIDE_EFFECTS__ +function _refine(Class2, fn, _params) { + const schema = new Class2({ + type: "custom", + check: "custom", + fn, + ...normalizeParams(_params) + }); + return schema; +} +// @__NO_SIDE_EFFECTS__ +function _superRefine(fn) { + const ch = /* @__PURE__ */ _check((payload) => { + payload.addIssue = (issue2) => { + if (typeof issue2 === "string") { + payload.issues.push(issue(issue2, payload.value, ch._zod.def)); + } else { + const _issue = issue2; + if (_issue.fatal) + _issue.continue = false; + _issue.code ?? (_issue.code = "custom"); + _issue.input ?? (_issue.input = payload.value); + _issue.inst ?? (_issue.inst = ch); + _issue.continue ?? (_issue.continue = !ch._zod.def.abort); + payload.issues.push(issue(_issue)); + } + }; + return fn(payload.value, payload); + }); + return ch; +} +// @__NO_SIDE_EFFECTS__ +function _check(fn, params) { + const ch = new $ZodCheck({ + check: "custom", + ...normalizeParams(params) + }); + ch._zod.check = fn; + return ch; +} +// @__NO_SIDE_EFFECTS__ +function describe(description) { + const ch = new $ZodCheck({ check: "describe" }); + ch._zod.onattach = [ + (inst) => { + const existing = globalRegistry.get(inst) ?? {}; + globalRegistry.add(inst, { ...existing, description }); + } + ]; + ch._zod.check = () => { + }; + return ch; +} +// @__NO_SIDE_EFFECTS__ +function meta(metadata) { + const ch = new $ZodCheck({ check: "meta" }); + ch._zod.onattach = [ + (inst) => { + const existing = globalRegistry.get(inst) ?? {}; + globalRegistry.add(inst, { ...existing, ...metadata }); + } + ]; + ch._zod.check = () => { + }; + return ch; +} +// @__NO_SIDE_EFFECTS__ +function _stringbool(Classes, _params) { + const params = normalizeParams(_params); + let truthyArray = params.truthy ?? ["true", "1", "yes", "on", "y", "enabled"]; + let falsyArray = params.falsy ?? ["false", "0", "no", "off", "n", "disabled"]; + if (params.case !== "sensitive") { + truthyArray = truthyArray.map((v) => typeof v === "string" ? v.toLowerCase() : v); + falsyArray = falsyArray.map((v) => typeof v === "string" ? v.toLowerCase() : v); + } + const truthySet = new Set(truthyArray); + const falsySet = new Set(falsyArray); + const _Codec = Classes.Codec ?? $ZodCodec; + const _Boolean = Classes.Boolean ?? $ZodBoolean; + const _String = Classes.String ?? $ZodString; + const stringSchema = new _String({ type: "string", error: params.error }); + const booleanSchema = new _Boolean({ type: "boolean", error: params.error }); + const codec2 = new _Codec({ + type: "pipe", + in: stringSchema, + out: booleanSchema, + transform: ((input, payload) => { + let data = input; + if (params.case !== "sensitive") + data = data.toLowerCase(); + if (truthySet.has(data)) { + return true; + } else if (falsySet.has(data)) { + return false; + } else { + payload.issues.push({ + code: "invalid_value", + expected: "stringbool", + values: [...truthySet, ...falsySet], + input: payload.value, + inst: codec2, + continue: false + }); + return {}; + } + }), + reverseTransform: ((input, _payload) => { + if (input === true) { + return truthyArray[0] || "true"; + } else { + return falsyArray[0] || "false"; + } + }), + error: params.error + }); + return codec2; +} +// @__NO_SIDE_EFFECTS__ +function _stringFormat(Class2, format, fnOrRegex, _params = {}) { + const params = normalizeParams(_params); + const def = { + ...normalizeParams(_params), + check: "string_format", + type: "string", + format, + fn: typeof fnOrRegex === "function" ? fnOrRegex : (val) => fnOrRegex.test(val), + ...params + }; + if (fnOrRegex instanceof RegExp) { + def.pattern = fnOrRegex; + } + const inst = new Class2(def); + return inst; +} + +// node_modules/zod/v4/core/to-json-schema.js +function initializeContext(params) { + let target = params?.target ?? "draft-2020-12"; + if (target === "draft-4") + target = "draft-04"; + if (target === "draft-7") + target = "draft-07"; + return { + processors: params.processors ?? {}, + metadataRegistry: params?.metadata ?? globalRegistry, + target, + unrepresentable: params?.unrepresentable ?? "throw", + override: params?.override ?? (() => { + }), + io: params?.io ?? "output", + counter: 0, + seen: /* @__PURE__ */ new Map(), + cycles: params?.cycles ?? "ref", + reused: params?.reused ?? "inline", + external: params?.external ?? void 0 + }; +} +function process(schema, ctx, _params = { path: [], schemaPath: [] }) { + var _a2; + const def = schema._zod.def; + const seen = ctx.seen.get(schema); + if (seen) { + seen.count++; + const isCycle = _params.schemaPath.includes(schema); + if (isCycle) { + seen.cycle = _params.path; + } + return seen.schema; + } + const result = { schema: {}, count: 1, cycle: void 0, path: _params.path }; + ctx.seen.set(schema, result); + const overrideSchema = schema._zod.toJSONSchema?.(); + if (overrideSchema) { + result.schema = overrideSchema; + } else { + const params = { + ..._params, + schemaPath: [..._params.schemaPath, schema], + path: _params.path + }; + if (schema._zod.processJSONSchema) { + schema._zod.processJSONSchema(ctx, result.schema, params); + } else { + const _json = result.schema; + const processor = ctx.processors[def.type]; + if (!processor) { + throw new Error(`[toJSONSchema]: Non-representable type encountered: ${def.type}`); + } + processor(schema, ctx, _json, params); + } + const parent = schema._zod.parent; + if (parent) { + if (!result.ref) + result.ref = parent; + process(parent, ctx, params); + ctx.seen.get(parent).isParent = true; + } + } + const meta3 = ctx.metadataRegistry.get(schema); + if (meta3) + Object.assign(result.schema, meta3); + if (ctx.io === "input" && isTransforming(schema)) { + delete result.schema.examples; + delete result.schema.default; + } + if (ctx.io === "input" && result.schema._prefault) + (_a2 = result.schema).default ?? (_a2.default = result.schema._prefault); + delete result.schema._prefault; + const _result = ctx.seen.get(schema); + return _result.schema; +} +function extractDefs(ctx, schema) { + const root = ctx.seen.get(schema); + if (!root) + throw new Error("Unprocessed schema. This is a bug in Zod."); + const idToSchema = /* @__PURE__ */ new Map(); + for (const entry of ctx.seen.entries()) { + const id = ctx.metadataRegistry.get(entry[0])?.id; + if (id) { + const existing = idToSchema.get(id); + if (existing && existing !== entry[0]) { + throw new Error(`Duplicate schema id "${id}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`); + } + idToSchema.set(id, entry[0]); + } + } + const makeURI = (entry) => { + const defsSegment = ctx.target === "draft-2020-12" ? "$defs" : "definitions"; + if (ctx.external) { + const externalId = ctx.external.registry.get(entry[0])?.id; + const uriGenerator = ctx.external.uri ?? ((id2) => id2); + if (externalId) { + return { ref: uriGenerator(externalId) }; + } + const id = entry[1].defId ?? entry[1].schema.id ?? `schema${ctx.counter++}`; + entry[1].defId = id; + return { defId: id, ref: `${uriGenerator("__shared")}#/${defsSegment}/${id}` }; + } + if (entry[1] === root) { + return { ref: "#" }; + } + const uriPrefix = `#`; + const defUriPrefix = `${uriPrefix}/${defsSegment}/`; + const defId = entry[1].schema.id ?? `__schema${ctx.counter++}`; + return { defId, ref: defUriPrefix + defId }; + }; + const extractToDef = (entry) => { + if (entry[1].schema.$ref) { + return; + } + const seen = entry[1]; + const { ref, defId } = makeURI(entry); + seen.def = { ...seen.schema }; + if (defId) + seen.defId = defId; + const schema2 = seen.schema; + for (const key in schema2) { + delete schema2[key]; + } + schema2.$ref = ref; + }; + if (ctx.cycles === "throw") { + for (const entry of ctx.seen.entries()) { + const seen = entry[1]; + if (seen.cycle) { + throw new Error(`Cycle detected: #/${seen.cycle?.join("/")}/<root> + +Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`); + } + } + } + for (const entry of ctx.seen.entries()) { + const seen = entry[1]; + if (schema === entry[0]) { + extractToDef(entry); + continue; + } + if (ctx.external) { + const ext = ctx.external.registry.get(entry[0])?.id; + if (schema !== entry[0] && ext) { + extractToDef(entry); + continue; + } + } + const id = ctx.metadataRegistry.get(entry[0])?.id; + if (id) { + extractToDef(entry); + continue; + } + if (seen.cycle) { + extractToDef(entry); + continue; + } + if (seen.count > 1) { + if (ctx.reused === "ref") { + extractToDef(entry); + continue; + } + } + } +} +function finalize(ctx, schema) { + const root = ctx.seen.get(schema); + if (!root) + throw new Error("Unprocessed schema. This is a bug in Zod."); + const flattenRef = (zodSchema) => { + const seen = ctx.seen.get(zodSchema); + if (seen.ref === null) + return; + const schema2 = seen.def ?? seen.schema; + const _cached = { ...schema2 }; + const ref = seen.ref; + seen.ref = null; + if (ref) { + flattenRef(ref); + const refSeen = ctx.seen.get(ref); + const refSchema = refSeen.schema; + if (refSchema.$ref && (ctx.target === "draft-07" || ctx.target === "draft-04" || ctx.target === "openapi-3.0")) { + schema2.allOf = schema2.allOf ?? []; + schema2.allOf.push(refSchema); + } else { + Object.assign(schema2, refSchema); + } + Object.assign(schema2, _cached); + const isParentRef = zodSchema._zod.parent === ref; + if (isParentRef) { + for (const key in schema2) { + if (key === "$ref" || key === "allOf") + continue; + if (!(key in _cached)) { + delete schema2[key]; + } + } + } + if (refSchema.$ref && refSeen.def) { + for (const key in schema2) { + if (key === "$ref" || key === "allOf") + continue; + if (key in refSeen.def && JSON.stringify(schema2[key]) === JSON.stringify(refSeen.def[key])) { + delete schema2[key]; + } + } + } + } + const parent = zodSchema._zod.parent; + if (parent && parent !== ref) { + flattenRef(parent); + const parentSeen = ctx.seen.get(parent); + if (parentSeen?.schema.$ref) { + schema2.$ref = parentSeen.schema.$ref; + if (parentSeen.def) { + for (const key in schema2) { + if (key === "$ref" || key === "allOf") + continue; + if (key in parentSeen.def && JSON.stringify(schema2[key]) === JSON.stringify(parentSeen.def[key])) { + delete schema2[key]; + } + } + } + } + } + ctx.override({ + zodSchema, + jsonSchema: schema2, + path: seen.path ?? [] + }); + }; + for (const entry of [...ctx.seen.entries()].reverse()) { + flattenRef(entry[0]); + } + const result = {}; + if (ctx.target === "draft-2020-12") { + result.$schema = "https://json-schema.org/draft/2020-12/schema"; + } else if (ctx.target === "draft-07") { + result.$schema = "http://json-schema.org/draft-07/schema#"; + } else if (ctx.target === "draft-04") { + result.$schema = "http://json-schema.org/draft-04/schema#"; + } else if (ctx.target === "openapi-3.0") { + } else { + } + if (ctx.external?.uri) { + const id = ctx.external.registry.get(schema)?.id; + if (!id) + throw new Error("Schema is missing an `id` property"); + result.$id = ctx.external.uri(id); + } + Object.assign(result, root.def ?? root.schema); + const defs = ctx.external?.defs ?? {}; + for (const entry of ctx.seen.entries()) { + const seen = entry[1]; + if (seen.def && seen.defId) { + defs[seen.defId] = seen.def; + } + } + if (ctx.external) { + } else { + if (Object.keys(defs).length > 0) { + if (ctx.target === "draft-2020-12") { + result.$defs = defs; + } else { + result.definitions = defs; + } + } + } + try { + const finalized = JSON.parse(JSON.stringify(result)); + Object.defineProperty(finalized, "~standard", { + value: { + ...schema["~standard"], + jsonSchema: { + input: createStandardJSONSchemaMethod(schema, "input", ctx.processors), + output: createStandardJSONSchemaMethod(schema, "output", ctx.processors) + } + }, + enumerable: false, + writable: false + }); + return finalized; + } catch (_err) { + throw new Error("Error converting schema to JSON."); + } +} +function isTransforming(_schema, _ctx) { + const ctx = _ctx ?? { seen: /* @__PURE__ */ new Set() }; + if (ctx.seen.has(_schema)) + return false; + ctx.seen.add(_schema); + const def = _schema._zod.def; + if (def.type === "transform") + return true; + if (def.type === "array") + return isTransforming(def.element, ctx); + if (def.type === "set") + return isTransforming(def.valueType, ctx); + if (def.type === "lazy") + return isTransforming(def.getter(), ctx); + if (def.type === "promise" || def.type === "optional" || def.type === "nonoptional" || def.type === "nullable" || def.type === "readonly" || def.type === "default" || def.type === "prefault") { + return isTransforming(def.innerType, ctx); + } + if (def.type === "intersection") { + return isTransforming(def.left, ctx) || isTransforming(def.right, ctx); + } + if (def.type === "record" || def.type === "map") { + return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx); + } + if (def.type === "pipe") { + return isTransforming(def.in, ctx) || isTransforming(def.out, ctx); + } + if (def.type === "object") { + for (const key in def.shape) { + if (isTransforming(def.shape[key], ctx)) + return true; + } + return false; + } + if (def.type === "union") { + for (const option of def.options) { + if (isTransforming(option, ctx)) + return true; + } + return false; + } + if (def.type === "tuple") { + for (const item of def.items) { + if (isTransforming(item, ctx)) + return true; + } + if (def.rest && isTransforming(def.rest, ctx)) + return true; + return false; + } + return false; +} +var createToJSONSchemaMethod = (schema, processors = {}) => (params) => { + const ctx = initializeContext({ ...params, processors }); + process(schema, ctx); + extractDefs(ctx, schema); + return finalize(ctx, schema); +}; +var createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) => { + const { libraryOptions, target } = params ?? {}; + const ctx = initializeContext({ ...libraryOptions ?? {}, target, io, processors }); + process(schema, ctx); + extractDefs(ctx, schema); + return finalize(ctx, schema); +}; + +// node_modules/zod/v4/core/json-schema-processors.js +var formatMap = { + guid: "uuid", + url: "uri", + datetime: "date-time", + json_string: "json-string", + regex: "" + // do not set +}; +var stringProcessor = (schema, ctx, _json, _params) => { + const json2 = _json; + json2.type = "string"; + const { minimum, maximum, format, patterns, contentEncoding } = schema._zod.bag; + if (typeof minimum === "number") + json2.minLength = minimum; + if (typeof maximum === "number") + json2.maxLength = maximum; + if (format) { + json2.format = formatMap[format] ?? format; + if (json2.format === "") + delete json2.format; + if (format === "time") { + delete json2.format; + } + } + if (contentEncoding) + json2.contentEncoding = contentEncoding; + if (patterns && patterns.size > 0) { + const regexes = [...patterns]; + if (regexes.length === 1) + json2.pattern = regexes[0].source; + else if (regexes.length > 1) { + json2.allOf = [ + ...regexes.map((regex) => ({ + ...ctx.target === "draft-07" || ctx.target === "draft-04" || ctx.target === "openapi-3.0" ? { type: "string" } : {}, + pattern: regex.source + })) + ]; + } + } +}; +var numberProcessor = (schema, ctx, _json, _params) => { + const json2 = _json; + const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag; + if (typeof format === "string" && format.includes("int")) + json2.type = "integer"; + else + json2.type = "number"; + if (typeof exclusiveMinimum === "number") { + if (ctx.target === "draft-04" || ctx.target === "openapi-3.0") { + json2.minimum = exclusiveMinimum; + json2.exclusiveMinimum = true; + } else { + json2.exclusiveMinimum = exclusiveMinimum; + } + } + if (typeof minimum === "number") { + json2.minimum = minimum; + if (typeof exclusiveMinimum === "number" && ctx.target !== "draft-04") { + if (exclusiveMinimum >= minimum) + delete json2.minimum; + else + delete json2.exclusiveMinimum; + } + } + if (typeof exclusiveMaximum === "number") { + if (ctx.target === "draft-04" || ctx.target === "openapi-3.0") { + json2.maximum = exclusiveMaximum; + json2.exclusiveMaximum = true; + } else { + json2.exclusiveMaximum = exclusiveMaximum; + } + } + if (typeof maximum === "number") { + json2.maximum = maximum; + if (typeof exclusiveMaximum === "number" && ctx.target !== "draft-04") { + if (exclusiveMaximum <= maximum) + delete json2.maximum; + else + delete json2.exclusiveMaximum; + } + } + if (typeof multipleOf === "number") + json2.multipleOf = multipleOf; +}; +var booleanProcessor = (_schema, _ctx, json2, _params) => { + json2.type = "boolean"; +}; +var bigintProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("BigInt cannot be represented in JSON Schema"); + } +}; +var symbolProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Symbols cannot be represented in JSON Schema"); + } +}; +var nullProcessor = (_schema, ctx, json2, _params) => { + if (ctx.target === "openapi-3.0") { + json2.type = "string"; + json2.nullable = true; + json2.enum = [null]; + } else { + json2.type = "null"; + } +}; +var undefinedProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Undefined cannot be represented in JSON Schema"); + } +}; +var voidProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Void cannot be represented in JSON Schema"); + } +}; +var neverProcessor = (_schema, _ctx, json2, _params) => { + json2.not = {}; +}; +var anyProcessor = (_schema, _ctx, _json, _params) => { +}; +var unknownProcessor = (_schema, _ctx, _json, _params) => { +}; +var dateProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Date cannot be represented in JSON Schema"); + } +}; +var enumProcessor = (schema, _ctx, json2, _params) => { + const def = schema._zod.def; + const values = getEnumValues(def.entries); + if (values.every((v) => typeof v === "number")) + json2.type = "number"; + if (values.every((v) => typeof v === "string")) + json2.type = "string"; + json2.enum = values; +}; +var literalProcessor = (schema, ctx, json2, _params) => { + const def = schema._zod.def; + const vals = []; + for (const val of def.values) { + if (val === void 0) { + if (ctx.unrepresentable === "throw") { + throw new Error("Literal `undefined` cannot be represented in JSON Schema"); + } else { + } + } else if (typeof val === "bigint") { + if (ctx.unrepresentable === "throw") { + throw new Error("BigInt literals cannot be represented in JSON Schema"); + } else { + vals.push(Number(val)); + } + } else { + vals.push(val); + } + } + if (vals.length === 0) { + } else if (vals.length === 1) { + const val = vals[0]; + json2.type = val === null ? "null" : typeof val; + if (ctx.target === "draft-04" || ctx.target === "openapi-3.0") { + json2.enum = [val]; + } else { + json2.const = val; + } + } else { + if (vals.every((v) => typeof v === "number")) + json2.type = "number"; + if (vals.every((v) => typeof v === "string")) + json2.type = "string"; + if (vals.every((v) => typeof v === "boolean")) + json2.type = "boolean"; + if (vals.every((v) => v === null)) + json2.type = "null"; + json2.enum = vals; + } +}; +var nanProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("NaN cannot be represented in JSON Schema"); + } +}; +var templateLiteralProcessor = (schema, _ctx, json2, _params) => { + const _json = json2; + const pattern = schema._zod.pattern; + if (!pattern) + throw new Error("Pattern not found in template literal"); + _json.type = "string"; + _json.pattern = pattern.source; +}; +var fileProcessor = (schema, _ctx, json2, _params) => { + const _json = json2; + const file2 = { + type: "string", + format: "binary", + contentEncoding: "binary" + }; + const { minimum, maximum, mime } = schema._zod.bag; + if (minimum !== void 0) + file2.minLength = minimum; + if (maximum !== void 0) + file2.maxLength = maximum; + if (mime) { + if (mime.length === 1) { + file2.contentMediaType = mime[0]; + Object.assign(_json, file2); + } else { + Object.assign(_json, file2); + _json.anyOf = mime.map((m) => ({ contentMediaType: m })); + } + } else { + Object.assign(_json, file2); + } +}; +var successProcessor = (_schema, _ctx, json2, _params) => { + json2.type = "boolean"; +}; +var customProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Custom types cannot be represented in JSON Schema"); + } +}; +var functionProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Function types cannot be represented in JSON Schema"); + } +}; +var transformProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Transforms cannot be represented in JSON Schema"); + } +}; +var mapProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Map cannot be represented in JSON Schema"); + } +}; +var setProcessor = (_schema, ctx, _json, _params) => { + if (ctx.unrepresentable === "throw") { + throw new Error("Set cannot be represented in JSON Schema"); + } +}; +var arrayProcessor = (schema, ctx, _json, params) => { + const json2 = _json; + const def = schema._zod.def; + const { minimum, maximum } = schema._zod.bag; + if (typeof minimum === "number") + json2.minItems = minimum; + if (typeof maximum === "number") + json2.maxItems = maximum; + json2.type = "array"; + json2.items = process(def.element, ctx, { ...params, path: [...params.path, "items"] }); +}; +var objectProcessor = (schema, ctx, _json, params) => { + const json2 = _json; + const def = schema._zod.def; + json2.type = "object"; + json2.properties = {}; + const shape = def.shape; + for (const key in shape) { + json2.properties[key] = process(shape[key], ctx, { + ...params, + path: [...params.path, "properties", key] + }); + } + const allKeys = new Set(Object.keys(shape)); + const requiredKeys = new Set([...allKeys].filter((key) => { + const v = def.shape[key]._zod; + if (ctx.io === "input") { + return v.optin === void 0; + } else { + return v.optout === void 0; + } + })); + if (requiredKeys.size > 0) { + json2.required = Array.from(requiredKeys); + } + if (def.catchall?._zod.def.type === "never") { + json2.additionalProperties = false; + } else if (!def.catchall) { + if (ctx.io === "output") + json2.additionalProperties = false; + } else if (def.catchall) { + json2.additionalProperties = process(def.catchall, ctx, { + ...params, + path: [...params.path, "additionalProperties"] + }); + } +}; +var unionProcessor = (schema, ctx, json2, params) => { + const def = schema._zod.def; + const isExclusive = def.inclusive === false; + const options = def.options.map((x, i) => process(x, ctx, { + ...params, + path: [...params.path, isExclusive ? "oneOf" : "anyOf", i] + })); + if (isExclusive) { + json2.oneOf = options; + } else { + json2.anyOf = options; + } +}; +var intersectionProcessor = (schema, ctx, json2, params) => { + const def = schema._zod.def; + const a = process(def.left, ctx, { + ...params, + path: [...params.path, "allOf", 0] + }); + const b = process(def.right, ctx, { + ...params, + path: [...params.path, "allOf", 1] + }); + const isSimpleIntersection = (val) => "allOf" in val && Object.keys(val).length === 1; + const allOf = [ + ...isSimpleIntersection(a) ? a.allOf : [a], + ...isSimpleIntersection(b) ? b.allOf : [b] + ]; + json2.allOf = allOf; +}; +var tupleProcessor = (schema, ctx, _json, params) => { + const json2 = _json; + const def = schema._zod.def; + json2.type = "array"; + const prefixPath = ctx.target === "draft-2020-12" ? "prefixItems" : "items"; + const restPath = ctx.target === "draft-2020-12" ? "items" : ctx.target === "openapi-3.0" ? "items" : "additionalItems"; + const prefixItems = def.items.map((x, i) => process(x, ctx, { + ...params, + path: [...params.path, prefixPath, i] + })); + const rest = def.rest ? process(def.rest, ctx, { + ...params, + path: [...params.path, restPath, ...ctx.target === "openapi-3.0" ? [def.items.length] : []] + }) : null; + if (ctx.target === "draft-2020-12") { + json2.prefixItems = prefixItems; + if (rest) { + json2.items = rest; + } + } else if (ctx.target === "openapi-3.0") { + json2.items = { + anyOf: prefixItems + }; + if (rest) { + json2.items.anyOf.push(rest); + } + json2.minItems = prefixItems.length; + if (!rest) { + json2.maxItems = prefixItems.length; + } + } else { + json2.items = prefixItems; + if (rest) { + json2.additionalItems = rest; + } + } + const { minimum, maximum } = schema._zod.bag; + if (typeof minimum === "number") + json2.minItems = minimum; + if (typeof maximum === "number") + json2.maxItems = maximum; +}; +var recordProcessor = (schema, ctx, _json, params) => { + const json2 = _json; + const def = schema._zod.def; + json2.type = "object"; + const keyType = def.keyType; + const keyBag = keyType._zod.bag; + const patterns = keyBag?.patterns; + if (def.mode === "loose" && patterns && patterns.size > 0) { + const valueSchema = process(def.valueType, ctx, { + ...params, + path: [...params.path, "patternProperties", "*"] + }); + json2.patternProperties = {}; + for (const pattern of patterns) { + json2.patternProperties[pattern.source] = valueSchema; + } + } else { + if (ctx.target === "draft-07" || ctx.target === "draft-2020-12") { + json2.propertyNames = process(def.keyType, ctx, { + ...params, + path: [...params.path, "propertyNames"] + }); + } + json2.additionalProperties = process(def.valueType, ctx, { + ...params, + path: [...params.path, "additionalProperties"] + }); + } + const keyValues = keyType._zod.values; + if (keyValues) { + const validKeyValues = [...keyValues].filter((v) => typeof v === "string" || typeof v === "number"); + if (validKeyValues.length > 0) { + json2.required = validKeyValues; + } + } +}; +var nullableProcessor = (schema, ctx, json2, params) => { + const def = schema._zod.def; + const inner = process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + if (ctx.target === "openapi-3.0") { + seen.ref = def.innerType; + json2.nullable = true; + } else { + json2.anyOf = [inner, { type: "null" }]; + } +}; +var nonoptionalProcessor = (schema, ctx, _json, params) => { + const def = schema._zod.def; + process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = def.innerType; +}; +var defaultProcessor = (schema, ctx, json2, params) => { + const def = schema._zod.def; + process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = def.innerType; + json2.default = JSON.parse(JSON.stringify(def.defaultValue)); +}; +var prefaultProcessor = (schema, ctx, json2, params) => { + const def = schema._zod.def; + process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = def.innerType; + if (ctx.io === "input") + json2._prefault = JSON.parse(JSON.stringify(def.defaultValue)); +}; +var catchProcessor = (schema, ctx, json2, params) => { + const def = schema._zod.def; + process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = def.innerType; + let catchValue; + try { + catchValue = def.catchValue(void 0); + } catch { + throw new Error("Dynamic catch values are not supported in JSON Schema"); + } + json2.default = catchValue; +}; +var pipeProcessor = (schema, ctx, _json, params) => { + const def = schema._zod.def; + const innerType = ctx.io === "input" ? def.in._zod.def.type === "transform" ? def.out : def.in : def.out; + process(innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = innerType; +}; +var readonlyProcessor = (schema, ctx, json2, params) => { + const def = schema._zod.def; + process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = def.innerType; + json2.readOnly = true; +}; +var promiseProcessor = (schema, ctx, _json, params) => { + const def = schema._zod.def; + process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = def.innerType; +}; +var optionalProcessor = (schema, ctx, _json, params) => { + const def = schema._zod.def; + process(def.innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = def.innerType; +}; +var lazyProcessor = (schema, ctx, _json, params) => { + const innerType = schema._zod.innerType; + process(innerType, ctx, params); + const seen = ctx.seen.get(schema); + seen.ref = innerType; +}; +var allProcessors = { + string: stringProcessor, + number: numberProcessor, + boolean: booleanProcessor, + bigint: bigintProcessor, + symbol: symbolProcessor, + null: nullProcessor, + undefined: undefinedProcessor, + void: voidProcessor, + never: neverProcessor, + any: anyProcessor, + unknown: unknownProcessor, + date: dateProcessor, + enum: enumProcessor, + literal: literalProcessor, + nan: nanProcessor, + template_literal: templateLiteralProcessor, + file: fileProcessor, + success: successProcessor, + custom: customProcessor, + function: functionProcessor, + transform: transformProcessor, + map: mapProcessor, + set: setProcessor, + array: arrayProcessor, + object: objectProcessor, + union: unionProcessor, + intersection: intersectionProcessor, + tuple: tupleProcessor, + record: recordProcessor, + nullable: nullableProcessor, + nonoptional: nonoptionalProcessor, + default: defaultProcessor, + prefault: prefaultProcessor, + catch: catchProcessor, + pipe: pipeProcessor, + readonly: readonlyProcessor, + promise: promiseProcessor, + optional: optionalProcessor, + lazy: lazyProcessor +}; +function toJSONSchema(input, params) { + if ("_idmap" in input) { + const registry2 = input; + const ctx2 = initializeContext({ ...params, processors: allProcessors }); + const defs = {}; + for (const entry of registry2._idmap.entries()) { + const [_, schema] = entry; + process(schema, ctx2); + } + const schemas = {}; + const external = { + registry: registry2, + uri: params?.uri, + defs + }; + ctx2.external = external; + for (const entry of registry2._idmap.entries()) { + const [key, schema] = entry; + extractDefs(ctx2, schema); + schemas[key] = finalize(ctx2, schema); + } + if (Object.keys(defs).length > 0) { + const defsSegment = ctx2.target === "draft-2020-12" ? "$defs" : "definitions"; + schemas.__shared = { + [defsSegment]: defs + }; + } + return { schemas }; + } + const ctx = initializeContext({ ...params, processors: allProcessors }); + process(input, ctx); + extractDefs(ctx, input); + return finalize(ctx, input); +} + +// node_modules/zod/v4/core/json-schema-generator.js +var JSONSchemaGenerator = class { + /** @deprecated Access via ctx instead */ + get metadataRegistry() { + return this.ctx.metadataRegistry; + } + /** @deprecated Access via ctx instead */ + get target() { + return this.ctx.target; + } + /** @deprecated Access via ctx instead */ + get unrepresentable() { + return this.ctx.unrepresentable; + } + /** @deprecated Access via ctx instead */ + get override() { + return this.ctx.override; + } + /** @deprecated Access via ctx instead */ + get io() { + return this.ctx.io; + } + /** @deprecated Access via ctx instead */ + get counter() { + return this.ctx.counter; + } + set counter(value) { + this.ctx.counter = value; + } + /** @deprecated Access via ctx instead */ + get seen() { + return this.ctx.seen; + } + constructor(params) { + let normalizedTarget = params?.target ?? "draft-2020-12"; + if (normalizedTarget === "draft-4") + normalizedTarget = "draft-04"; + if (normalizedTarget === "draft-7") + normalizedTarget = "draft-07"; + this.ctx = initializeContext({ + processors: allProcessors, + target: normalizedTarget, + ...params?.metadata && { metadata: params.metadata }, + ...params?.unrepresentable && { unrepresentable: params.unrepresentable }, + ...params?.override && { override: params.override }, + ...params?.io && { io: params.io } + }); + } + /** + * Process a schema to prepare it for JSON Schema generation. + * This must be called before emit(). + */ + process(schema, _params = { path: [], schemaPath: [] }) { + return process(schema, this.ctx, _params); + } + /** + * Emit the final JSON Schema after processing. + * Must call process() first. + */ + emit(schema, _params) { + if (_params) { + if (_params.cycles) + this.ctx.cycles = _params.cycles; + if (_params.reused) + this.ctx.reused = _params.reused; + if (_params.external) + this.ctx.external = _params.external; + } + extractDefs(this.ctx, schema); + const result = finalize(this.ctx, schema); + const { "~standard": _, ...plainResult } = result; + return plainResult; + } +}; + +// node_modules/zod/v4/core/json-schema.js +var json_schema_exports = {}; + +// node_modules/zod/v4/mini/schemas.js +var ZodMiniType = /* @__PURE__ */ $constructor("ZodMiniType", (inst, def) => { + if (!inst._zod) + throw new Error("Uninitialized schema in ZodMiniType."); + $ZodType.init(inst, def); + inst.def = def; + inst.type = def.type; + inst.parse = (data, params) => parse(inst, data, params, { callee: inst.parse }); + inst.safeParse = (data, params) => safeParse(inst, data, params); + inst.parseAsync = async (data, params) => parseAsync(inst, data, params, { callee: inst.parseAsync }); + inst.safeParseAsync = async (data, params) => safeParseAsync(inst, data, params); + inst.check = (...checks) => { + return inst.clone({ + ...def, + checks: [ + ...def.checks ?? [], + ...checks.map((ch) => typeof ch === "function" ? { _zod: { check: ch, def: { check: "custom" }, onattach: [] } } : ch) + ] + }, { parent: true }); + }; + inst.with = inst.check; + inst.clone = (_def, params) => clone(inst, _def, params); + inst.brand = () => inst; + inst.register = ((reg, meta3) => { + reg.add(inst, meta3); + return inst; + }); + inst.apply = (fn) => fn(inst); +}); +var ZodMiniObject = /* @__PURE__ */ $constructor("ZodMiniObject", (inst, def) => { + $ZodObject.init(inst, def); + ZodMiniType.init(inst, def); + defineLazy(inst, "shape", () => def.shape); +}); +// @__NO_SIDE_EFFECTS__ +function object(shape, params) { + const def = { + type: "object", + shape: shape ?? {}, + ...normalizeParams(params) + }; + return new ZodMiniObject(def); +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js +function isZ4Schema(s) { + const schema = s; + return !!schema._zod; +} +function objectFromShape(shape) { + const values = Object.values(shape); + if (values.length === 0) + return object({}); + const allV4 = values.every(isZ4Schema); + const allV3 = values.every((s) => !isZ4Schema(s)); + if (allV4) + return object(shape); + if (allV3) + return objectType(shape); + throw new Error("Mixed Zod versions detected in object shape."); +} +function safeParse2(schema, data) { + if (isZ4Schema(schema)) { + const result2 = safeParse(schema, data); + return result2; + } + const v3Schema = schema; + const result = v3Schema.safeParse(data); + return result; +} +async function safeParseAsync2(schema, data) { + if (isZ4Schema(schema)) { + const result2 = await safeParseAsync(schema, data); + return result2; + } + const v3Schema = schema; + const result = await v3Schema.safeParseAsync(data); + return result; +} +function getObjectShape(schema) { + if (!schema) + return void 0; + let rawShape; + if (isZ4Schema(schema)) { + const v4Schema = schema; + rawShape = v4Schema._zod?.def?.shape; + } else { + const v3Schema = schema; + rawShape = v3Schema.shape; + } + if (!rawShape) + return void 0; + if (typeof rawShape === "function") { + try { + return rawShape(); + } catch { + return void 0; + } + } + return rawShape; +} +function normalizeObjectSchema(schema) { + if (!schema) + return void 0; + if (typeof schema === "object") { + const asV3 = schema; + const asV4 = schema; + if (!asV3._def && !asV4._zod) { + const values = Object.values(schema); + if (values.length > 0 && values.every((v) => typeof v === "object" && v !== null && (v._def !== void 0 || v._zod !== void 0 || typeof v.parse === "function"))) { + return objectFromShape(schema); + } + } + } + if (isZ4Schema(schema)) { + const v4Schema = schema; + const def = v4Schema._zod?.def; + if (def && (def.type === "object" || def.shape !== void 0)) { + return schema; + } + } else { + const v3Schema = schema; + if (v3Schema.shape !== void 0) { + return schema; + } + } + return void 0; +} +function getParseErrorMessage(error48) { + if (error48 && typeof error48 === "object") { + if ("message" in error48 && typeof error48.message === "string") { + return error48.message; + } + if ("issues" in error48 && Array.isArray(error48.issues) && error48.issues.length > 0) { + const firstIssue = error48.issues[0]; + if (firstIssue && typeof firstIssue === "object" && "message" in firstIssue) { + return String(firstIssue.message); + } + } + try { + return JSON.stringify(error48); + } catch { + return String(error48); + } + } + return String(error48); +} +function getSchemaDescription(schema) { + return schema.description; +} +function isSchemaOptional(schema) { + if (isZ4Schema(schema)) { + const v4Schema = schema; + return v4Schema._zod?.def?.type === "optional"; + } + const v3Schema = schema; + if (typeof schema.isOptional === "function") { + return schema.isOptional(); + } + return v3Schema._def?.typeName === "ZodOptional"; +} +function getLiteralValue(schema) { + if (isZ4Schema(schema)) { + const v4Schema = schema; + const def2 = v4Schema._zod?.def; + if (def2) { + if (def2.value !== void 0) + return def2.value; + if (Array.isArray(def2.values) && def2.values.length > 0) { + return def2.values[0]; + } + } + } + const v3Schema = schema; + const def = v3Schema._def; + if (def) { + if (def.value !== void 0) + return def.value; + if (Array.isArray(def.values) && def.values.length > 0) { + return def.values[0]; + } + } + const directValue = schema.value; + if (directValue !== void 0) + return directValue; + return void 0; +} + +// node_modules/zod/v4/classic/external.js +var external_exports3 = {}; +__export(external_exports3, { + $brand: () => $brand, + $input: () => $input, + $output: () => $output, + NEVER: () => NEVER, + TimePrecision: () => TimePrecision, + ZodAny: () => ZodAny2, + ZodArray: () => ZodArray2, + ZodBase64: () => ZodBase64, + ZodBase64URL: () => ZodBase64URL, + ZodBigInt: () => ZodBigInt2, + ZodBigIntFormat: () => ZodBigIntFormat, + ZodBoolean: () => ZodBoolean2, + ZodCIDRv4: () => ZodCIDRv4, + ZodCIDRv6: () => ZodCIDRv6, + ZodCUID: () => ZodCUID, + ZodCUID2: () => ZodCUID2, + ZodCatch: () => ZodCatch2, + ZodCodec: () => ZodCodec, + ZodCustom: () => ZodCustom, + ZodCustomStringFormat: () => ZodCustomStringFormat, + ZodDate: () => ZodDate2, + ZodDefault: () => ZodDefault2, + ZodDiscriminatedUnion: () => ZodDiscriminatedUnion2, + ZodE164: () => ZodE164, + ZodEmail: () => ZodEmail, + ZodEmoji: () => ZodEmoji, + ZodEnum: () => ZodEnum2, + ZodError: () => ZodError2, + ZodExactOptional: () => ZodExactOptional, + ZodFile: () => ZodFile, + ZodFirstPartyTypeKind: () => ZodFirstPartyTypeKind2, + ZodFunction: () => ZodFunction2, + ZodGUID: () => ZodGUID, + ZodIPv4: () => ZodIPv4, + ZodIPv6: () => ZodIPv6, + ZodISODate: () => ZodISODate, + ZodISODateTime: () => ZodISODateTime, + ZodISODuration: () => ZodISODuration, + ZodISOTime: () => ZodISOTime, + ZodIntersection: () => ZodIntersection2, + ZodIssueCode: () => ZodIssueCode2, + ZodJWT: () => ZodJWT, + ZodKSUID: () => ZodKSUID, + ZodLazy: () => ZodLazy2, + ZodLiteral: () => ZodLiteral2, + ZodMAC: () => ZodMAC, + ZodMap: () => ZodMap2, + ZodNaN: () => ZodNaN2, + ZodNanoID: () => ZodNanoID, + ZodNever: () => ZodNever2, + ZodNonOptional: () => ZodNonOptional, + ZodNull: () => ZodNull2, + ZodNullable: () => ZodNullable2, + ZodNumber: () => ZodNumber2, + ZodNumberFormat: () => ZodNumberFormat, + ZodObject: () => ZodObject2, + ZodOptional: () => ZodOptional2, + ZodPipe: () => ZodPipe, + ZodPrefault: () => ZodPrefault, + ZodPromise: () => ZodPromise2, + ZodReadonly: () => ZodReadonly2, + ZodRealError: () => ZodRealError, + ZodRecord: () => ZodRecord2, + ZodSet: () => ZodSet2, + ZodString: () => ZodString2, + ZodStringFormat: () => ZodStringFormat, + ZodSuccess: () => ZodSuccess, + ZodSymbol: () => ZodSymbol2, + ZodTemplateLiteral: () => ZodTemplateLiteral, + ZodTransform: () => ZodTransform, + ZodTuple: () => ZodTuple2, + ZodType: () => ZodType2, + ZodULID: () => ZodULID, + ZodURL: () => ZodURL, + ZodUUID: () => ZodUUID, + ZodUndefined: () => ZodUndefined2, + ZodUnion: () => ZodUnion2, + ZodUnknown: () => ZodUnknown2, + ZodVoid: () => ZodVoid2, + ZodXID: () => ZodXID, + ZodXor: () => ZodXor, + _ZodString: () => _ZodString, + _default: () => _default2, + _function: () => _function, + any: () => any, + array: () => array, + base64: () => base642, + base64url: () => base64url2, + bigint: () => bigint2, + boolean: () => boolean2, + catch: () => _catch2, + check: () => check, + cidrv4: () => cidrv42, + cidrv6: () => cidrv62, + clone: () => clone, + codec: () => codec, + coerce: () => coerce_exports2, + config: () => config, + core: () => core_exports2, + cuid: () => cuid3, + cuid2: () => cuid22, + custom: () => custom, + date: () => date3, + decode: () => decode2, + decodeAsync: () => decodeAsync2, + describe: () => describe2, + discriminatedUnion: () => discriminatedUnion, + e164: () => e1642, + email: () => email2, + emoji: () => emoji2, + encode: () => encode2, + encodeAsync: () => encodeAsync2, + endsWith: () => _endsWith, + enum: () => _enum2, + exactOptional: () => exactOptional, + file: () => file, + flattenError: () => flattenError, + float32: () => float32, + float64: () => float64, + formatError: () => formatError, + fromJSONSchema: () => fromJSONSchema, + function: () => _function, + getErrorMap: () => getErrorMap2, + globalRegistry: () => globalRegistry, + gt: () => _gt, + gte: () => _gte, + guid: () => guid2, + hash: () => hash, + hex: () => hex2, + hostname: () => hostname2, + httpUrl: () => httpUrl, + includes: () => _includes, + instanceof: () => _instanceof, + int: () => int, + int32: () => int32, + int64: () => int64, + intersection: () => intersection, + ipv4: () => ipv42, + ipv6: () => ipv62, + iso: () => iso_exports2, + json: () => json, + jwt: () => jwt, + keyof: () => keyof, + ksuid: () => ksuid2, + lazy: () => lazy, + length: () => _length, + literal: () => literal, + locales: () => locales_exports, + looseObject: () => looseObject, + looseRecord: () => looseRecord, + lowercase: () => _lowercase, + lt: () => _lt, + lte: () => _lte, + mac: () => mac2, + map: () => map, + maxLength: () => _maxLength, + maxSize: () => _maxSize, + meta: () => meta2, + mime: () => _mime, + minLength: () => _minLength, + minSize: () => _minSize, + multipleOf: () => _multipleOf, + nan: () => nan, + nanoid: () => nanoid2, + nativeEnum: () => nativeEnum, + negative: () => _negative, + never: () => never, + nonnegative: () => _nonnegative, + nonoptional: () => nonoptional, + nonpositive: () => _nonpositive, + normalize: () => _normalize, + null: () => _null3, + nullable: () => nullable, + nullish: () => nullish2, + number: () => number2, + object: () => object2, + optional: () => optional, + overwrite: () => _overwrite, + parse: () => parse2, + parseAsync: () => parseAsync2, + partialRecord: () => partialRecord, + pipe: () => pipe, + positive: () => _positive, + prefault: () => prefault, + preprocess: () => preprocess, + prettifyError: () => prettifyError, + promise: () => promise, + property: () => _property, + readonly: () => readonly, + record: () => record, + refine: () => refine, + regex: () => _regex, + regexes: () => regexes_exports, + registry: () => registry, + safeDecode: () => safeDecode2, + safeDecodeAsync: () => safeDecodeAsync2, + safeEncode: () => safeEncode2, + safeEncodeAsync: () => safeEncodeAsync2, + safeParse: () => safeParse3, + safeParseAsync: () => safeParseAsync3, + set: () => set, + setErrorMap: () => setErrorMap, + size: () => _size, + slugify: () => _slugify, + startsWith: () => _startsWith, + strictObject: () => strictObject, + string: () => string2, + stringFormat: () => stringFormat, + stringbool: () => stringbool, + success: () => success, + superRefine: () => superRefine, + symbol: () => symbol, + templateLiteral: () => templateLiteral, + toJSONSchema: () => toJSONSchema, + toLowerCase: () => _toLowerCase, + toUpperCase: () => _toUpperCase, + transform: () => transform, + treeifyError: () => treeifyError, + trim: () => _trim, + tuple: () => tuple, + uint32: () => uint32, + uint64: () => uint64, + ulid: () => ulid2, + undefined: () => _undefined3, + union: () => union, + unknown: () => unknown, + uppercase: () => _uppercase, + url: () => url, + util: () => util_exports, + uuid: () => uuid2, + uuidv4: () => uuidv4, + uuidv6: () => uuidv6, + uuidv7: () => uuidv7, + void: () => _void2, + xid: () => xid2, + xor: () => xor +}); + +// node_modules/zod/v4/classic/schemas.js +var schemas_exports3 = {}; +__export(schemas_exports3, { + ZodAny: () => ZodAny2, + ZodArray: () => ZodArray2, + ZodBase64: () => ZodBase64, + ZodBase64URL: () => ZodBase64URL, + ZodBigInt: () => ZodBigInt2, + ZodBigIntFormat: () => ZodBigIntFormat, + ZodBoolean: () => ZodBoolean2, + ZodCIDRv4: () => ZodCIDRv4, + ZodCIDRv6: () => ZodCIDRv6, + ZodCUID: () => ZodCUID, + ZodCUID2: () => ZodCUID2, + ZodCatch: () => ZodCatch2, + ZodCodec: () => ZodCodec, + ZodCustom: () => ZodCustom, + ZodCustomStringFormat: () => ZodCustomStringFormat, + ZodDate: () => ZodDate2, + ZodDefault: () => ZodDefault2, + ZodDiscriminatedUnion: () => ZodDiscriminatedUnion2, + ZodE164: () => ZodE164, + ZodEmail: () => ZodEmail, + ZodEmoji: () => ZodEmoji, + ZodEnum: () => ZodEnum2, + ZodExactOptional: () => ZodExactOptional, + ZodFile: () => ZodFile, + ZodFunction: () => ZodFunction2, + ZodGUID: () => ZodGUID, + ZodIPv4: () => ZodIPv4, + ZodIPv6: () => ZodIPv6, + ZodIntersection: () => ZodIntersection2, + ZodJWT: () => ZodJWT, + ZodKSUID: () => ZodKSUID, + ZodLazy: () => ZodLazy2, + ZodLiteral: () => ZodLiteral2, + ZodMAC: () => ZodMAC, + ZodMap: () => ZodMap2, + ZodNaN: () => ZodNaN2, + ZodNanoID: () => ZodNanoID, + ZodNever: () => ZodNever2, + ZodNonOptional: () => ZodNonOptional, + ZodNull: () => ZodNull2, + ZodNullable: () => ZodNullable2, + ZodNumber: () => ZodNumber2, + ZodNumberFormat: () => ZodNumberFormat, + ZodObject: () => ZodObject2, + ZodOptional: () => ZodOptional2, + ZodPipe: () => ZodPipe, + ZodPrefault: () => ZodPrefault, + ZodPromise: () => ZodPromise2, + ZodReadonly: () => ZodReadonly2, + ZodRecord: () => ZodRecord2, + ZodSet: () => ZodSet2, + ZodString: () => ZodString2, + ZodStringFormat: () => ZodStringFormat, + ZodSuccess: () => ZodSuccess, + ZodSymbol: () => ZodSymbol2, + ZodTemplateLiteral: () => ZodTemplateLiteral, + ZodTransform: () => ZodTransform, + ZodTuple: () => ZodTuple2, + ZodType: () => ZodType2, + ZodULID: () => ZodULID, + ZodURL: () => ZodURL, + ZodUUID: () => ZodUUID, + ZodUndefined: () => ZodUndefined2, + ZodUnion: () => ZodUnion2, + ZodUnknown: () => ZodUnknown2, + ZodVoid: () => ZodVoid2, + ZodXID: () => ZodXID, + ZodXor: () => ZodXor, + _ZodString: () => _ZodString, + _default: () => _default2, + _function: () => _function, + any: () => any, + array: () => array, + base64: () => base642, + base64url: () => base64url2, + bigint: () => bigint2, + boolean: () => boolean2, + catch: () => _catch2, + check: () => check, + cidrv4: () => cidrv42, + cidrv6: () => cidrv62, + codec: () => codec, + cuid: () => cuid3, + cuid2: () => cuid22, + custom: () => custom, + date: () => date3, + describe: () => describe2, + discriminatedUnion: () => discriminatedUnion, + e164: () => e1642, + email: () => email2, + emoji: () => emoji2, + enum: () => _enum2, + exactOptional: () => exactOptional, + file: () => file, + float32: () => float32, + float64: () => float64, + function: () => _function, + guid: () => guid2, + hash: () => hash, + hex: () => hex2, + hostname: () => hostname2, + httpUrl: () => httpUrl, + instanceof: () => _instanceof, + int: () => int, + int32: () => int32, + int64: () => int64, + intersection: () => intersection, + ipv4: () => ipv42, + ipv6: () => ipv62, + json: () => json, + jwt: () => jwt, + keyof: () => keyof, + ksuid: () => ksuid2, + lazy: () => lazy, + literal: () => literal, + looseObject: () => looseObject, + looseRecord: () => looseRecord, + mac: () => mac2, + map: () => map, + meta: () => meta2, + nan: () => nan, + nanoid: () => nanoid2, + nativeEnum: () => nativeEnum, + never: () => never, + nonoptional: () => nonoptional, + null: () => _null3, + nullable: () => nullable, + nullish: () => nullish2, + number: () => number2, + object: () => object2, + optional: () => optional, + partialRecord: () => partialRecord, + pipe: () => pipe, + prefault: () => prefault, + preprocess: () => preprocess, + promise: () => promise, + readonly: () => readonly, + record: () => record, + refine: () => refine, + set: () => set, + strictObject: () => strictObject, + string: () => string2, + stringFormat: () => stringFormat, + stringbool: () => stringbool, + success: () => success, + superRefine: () => superRefine, + symbol: () => symbol, + templateLiteral: () => templateLiteral, + transform: () => transform, + tuple: () => tuple, + uint32: () => uint32, + uint64: () => uint64, + ulid: () => ulid2, + undefined: () => _undefined3, + union: () => union, + unknown: () => unknown, + url: () => url, + uuid: () => uuid2, + uuidv4: () => uuidv4, + uuidv6: () => uuidv6, + uuidv7: () => uuidv7, + void: () => _void2, + xid: () => xid2, + xor: () => xor +}); + +// node_modules/zod/v4/classic/checks.js +var checks_exports2 = {}; +__export(checks_exports2, { + endsWith: () => _endsWith, + gt: () => _gt, + gte: () => _gte, + includes: () => _includes, + length: () => _length, + lowercase: () => _lowercase, + lt: () => _lt, + lte: () => _lte, + maxLength: () => _maxLength, + maxSize: () => _maxSize, + mime: () => _mime, + minLength: () => _minLength, + minSize: () => _minSize, + multipleOf: () => _multipleOf, + negative: () => _negative, + nonnegative: () => _nonnegative, + nonpositive: () => _nonpositive, + normalize: () => _normalize, + overwrite: () => _overwrite, + positive: () => _positive, + property: () => _property, + regex: () => _regex, + size: () => _size, + slugify: () => _slugify, + startsWith: () => _startsWith, + toLowerCase: () => _toLowerCase, + toUpperCase: () => _toUpperCase, + trim: () => _trim, + uppercase: () => _uppercase +}); + +// node_modules/zod/v4/classic/iso.js +var iso_exports2 = {}; +__export(iso_exports2, { + ZodISODate: () => ZodISODate, + ZodISODateTime: () => ZodISODateTime, + ZodISODuration: () => ZodISODuration, + ZodISOTime: () => ZodISOTime, + date: () => date2, + datetime: () => datetime2, + duration: () => duration2, + time: () => time2 +}); +var ZodISODateTime = /* @__PURE__ */ $constructor("ZodISODateTime", (inst, def) => { + $ZodISODateTime.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function datetime2(params) { + return _isoDateTime(ZodISODateTime, params); +} +var ZodISODate = /* @__PURE__ */ $constructor("ZodISODate", (inst, def) => { + $ZodISODate.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function date2(params) { + return _isoDate(ZodISODate, params); +} +var ZodISOTime = /* @__PURE__ */ $constructor("ZodISOTime", (inst, def) => { + $ZodISOTime.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function time2(params) { + return _isoTime(ZodISOTime, params); +} +var ZodISODuration = /* @__PURE__ */ $constructor("ZodISODuration", (inst, def) => { + $ZodISODuration.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function duration2(params) { + return _isoDuration(ZodISODuration, params); +} + +// node_modules/zod/v4/classic/errors.js +var initializer2 = (inst, issues) => { + $ZodError.init(inst, issues); + inst.name = "ZodError"; + Object.defineProperties(inst, { + format: { + value: (mapper) => formatError(inst, mapper) + // enumerable: false, + }, + flatten: { + value: (mapper) => flattenError(inst, mapper) + // enumerable: false, + }, + addIssue: { + value: (issue2) => { + inst.issues.push(issue2); + inst.message = JSON.stringify(inst.issues, jsonStringifyReplacer, 2); + } + // enumerable: false, + }, + addIssues: { + value: (issues2) => { + inst.issues.push(...issues2); + inst.message = JSON.stringify(inst.issues, jsonStringifyReplacer, 2); + } + // enumerable: false, + }, + isEmpty: { + get() { + return inst.issues.length === 0; + } + // enumerable: false, + } + }); +}; +var ZodError2 = $constructor("ZodError", initializer2); +var ZodRealError = $constructor("ZodError", initializer2, { + Parent: Error +}); + +// node_modules/zod/v4/classic/parse.js +var parse2 = /* @__PURE__ */ _parse(ZodRealError); +var parseAsync2 = /* @__PURE__ */ _parseAsync(ZodRealError); +var safeParse3 = /* @__PURE__ */ _safeParse(ZodRealError); +var safeParseAsync3 = /* @__PURE__ */ _safeParseAsync(ZodRealError); +var encode2 = /* @__PURE__ */ _encode(ZodRealError); +var decode2 = /* @__PURE__ */ _decode(ZodRealError); +var encodeAsync2 = /* @__PURE__ */ _encodeAsync(ZodRealError); +var decodeAsync2 = /* @__PURE__ */ _decodeAsync(ZodRealError); +var safeEncode2 = /* @__PURE__ */ _safeEncode(ZodRealError); +var safeDecode2 = /* @__PURE__ */ _safeDecode(ZodRealError); +var safeEncodeAsync2 = /* @__PURE__ */ _safeEncodeAsync(ZodRealError); +var safeDecodeAsync2 = /* @__PURE__ */ _safeDecodeAsync(ZodRealError); + +// node_modules/zod/v4/classic/schemas.js +var ZodType2 = /* @__PURE__ */ $constructor("ZodType", (inst, def) => { + $ZodType.init(inst, def); + Object.assign(inst["~standard"], { + jsonSchema: { + input: createStandardJSONSchemaMethod(inst, "input"), + output: createStandardJSONSchemaMethod(inst, "output") + } + }); + inst.toJSONSchema = createToJSONSchemaMethod(inst, {}); + inst.def = def; + inst.type = def.type; + Object.defineProperty(inst, "_def", { value: def }); + inst.check = (...checks) => { + return inst.clone(util_exports.mergeDefs(def, { + checks: [ + ...def.checks ?? [], + ...checks.map((ch) => typeof ch === "function" ? { _zod: { check: ch, def: { check: "custom" }, onattach: [] } } : ch) + ] + }), { + parent: true + }); + }; + inst.with = inst.check; + inst.clone = (def2, params) => clone(inst, def2, params); + inst.brand = () => inst; + inst.register = ((reg, meta3) => { + reg.add(inst, meta3); + return inst; + }); + inst.parse = (data, params) => parse2(inst, data, params, { callee: inst.parse }); + inst.safeParse = (data, params) => safeParse3(inst, data, params); + inst.parseAsync = async (data, params) => parseAsync2(inst, data, params, { callee: inst.parseAsync }); + inst.safeParseAsync = async (data, params) => safeParseAsync3(inst, data, params); + inst.spa = inst.safeParseAsync; + inst.encode = (data, params) => encode2(inst, data, params); + inst.decode = (data, params) => decode2(inst, data, params); + inst.encodeAsync = async (data, params) => encodeAsync2(inst, data, params); + inst.decodeAsync = async (data, params) => decodeAsync2(inst, data, params); + inst.safeEncode = (data, params) => safeEncode2(inst, data, params); + inst.safeDecode = (data, params) => safeDecode2(inst, data, params); + inst.safeEncodeAsync = async (data, params) => safeEncodeAsync2(inst, data, params); + inst.safeDecodeAsync = async (data, params) => safeDecodeAsync2(inst, data, params); + inst.refine = (check2, params) => inst.check(refine(check2, params)); + inst.superRefine = (refinement) => inst.check(superRefine(refinement)); + inst.overwrite = (fn) => inst.check(_overwrite(fn)); + inst.optional = () => optional(inst); + inst.exactOptional = () => exactOptional(inst); + inst.nullable = () => nullable(inst); + inst.nullish = () => optional(nullable(inst)); + inst.nonoptional = (params) => nonoptional(inst, params); + inst.array = () => array(inst); + inst.or = (arg) => union([inst, arg]); + inst.and = (arg) => intersection(inst, arg); + inst.transform = (tx) => pipe(inst, transform(tx)); + inst.default = (def2) => _default2(inst, def2); + inst.prefault = (def2) => prefault(inst, def2); + inst.catch = (params) => _catch2(inst, params); + inst.pipe = (target) => pipe(inst, target); + inst.readonly = () => readonly(inst); + inst.describe = (description) => { + const cl = inst.clone(); + globalRegistry.add(cl, { description }); + return cl; + }; + Object.defineProperty(inst, "description", { + get() { + return globalRegistry.get(inst)?.description; + }, + configurable: true + }); + inst.meta = (...args) => { + if (args.length === 0) { + return globalRegistry.get(inst); + } + const cl = inst.clone(); + globalRegistry.add(cl, args[0]); + return cl; + }; + inst.isOptional = () => inst.safeParse(void 0).success; + inst.isNullable = () => inst.safeParse(null).success; + inst.apply = (fn) => fn(inst); + return inst; +}); +var _ZodString = /* @__PURE__ */ $constructor("_ZodString", (inst, def) => { + $ZodString.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => stringProcessor(inst, ctx, json2, params); + const bag = inst._zod.bag; + inst.format = bag.format ?? null; + inst.minLength = bag.minimum ?? null; + inst.maxLength = bag.maximum ?? null; + inst.regex = (...args) => inst.check(_regex(...args)); + inst.includes = (...args) => inst.check(_includes(...args)); + inst.startsWith = (...args) => inst.check(_startsWith(...args)); + inst.endsWith = (...args) => inst.check(_endsWith(...args)); + inst.min = (...args) => inst.check(_minLength(...args)); + inst.max = (...args) => inst.check(_maxLength(...args)); + inst.length = (...args) => inst.check(_length(...args)); + inst.nonempty = (...args) => inst.check(_minLength(1, ...args)); + inst.lowercase = (params) => inst.check(_lowercase(params)); + inst.uppercase = (params) => inst.check(_uppercase(params)); + inst.trim = () => inst.check(_trim()); + inst.normalize = (...args) => inst.check(_normalize(...args)); + inst.toLowerCase = () => inst.check(_toLowerCase()); + inst.toUpperCase = () => inst.check(_toUpperCase()); + inst.slugify = () => inst.check(_slugify()); +}); +var ZodString2 = /* @__PURE__ */ $constructor("ZodString", (inst, def) => { + $ZodString.init(inst, def); + _ZodString.init(inst, def); + inst.email = (params) => inst.check(_email(ZodEmail, params)); + inst.url = (params) => inst.check(_url(ZodURL, params)); + inst.jwt = (params) => inst.check(_jwt(ZodJWT, params)); + inst.emoji = (params) => inst.check(_emoji2(ZodEmoji, params)); + inst.guid = (params) => inst.check(_guid(ZodGUID, params)); + inst.uuid = (params) => inst.check(_uuid(ZodUUID, params)); + inst.uuidv4 = (params) => inst.check(_uuidv4(ZodUUID, params)); + inst.uuidv6 = (params) => inst.check(_uuidv6(ZodUUID, params)); + inst.uuidv7 = (params) => inst.check(_uuidv7(ZodUUID, params)); + inst.nanoid = (params) => inst.check(_nanoid(ZodNanoID, params)); + inst.guid = (params) => inst.check(_guid(ZodGUID, params)); + inst.cuid = (params) => inst.check(_cuid(ZodCUID, params)); + inst.cuid2 = (params) => inst.check(_cuid2(ZodCUID2, params)); + inst.ulid = (params) => inst.check(_ulid(ZodULID, params)); + inst.base64 = (params) => inst.check(_base64(ZodBase64, params)); + inst.base64url = (params) => inst.check(_base64url(ZodBase64URL, params)); + inst.xid = (params) => inst.check(_xid(ZodXID, params)); + inst.ksuid = (params) => inst.check(_ksuid(ZodKSUID, params)); + inst.ipv4 = (params) => inst.check(_ipv4(ZodIPv4, params)); + inst.ipv6 = (params) => inst.check(_ipv6(ZodIPv6, params)); + inst.cidrv4 = (params) => inst.check(_cidrv4(ZodCIDRv4, params)); + inst.cidrv6 = (params) => inst.check(_cidrv6(ZodCIDRv6, params)); + inst.e164 = (params) => inst.check(_e164(ZodE164, params)); + inst.datetime = (params) => inst.check(datetime2(params)); + inst.date = (params) => inst.check(date2(params)); + inst.time = (params) => inst.check(time2(params)); + inst.duration = (params) => inst.check(duration2(params)); +}); +function string2(params) { + return _string(ZodString2, params); +} +var ZodStringFormat = /* @__PURE__ */ $constructor("ZodStringFormat", (inst, def) => { + $ZodStringFormat.init(inst, def); + _ZodString.init(inst, def); +}); +var ZodEmail = /* @__PURE__ */ $constructor("ZodEmail", (inst, def) => { + $ZodEmail.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function email2(params) { + return _email(ZodEmail, params); +} +var ZodGUID = /* @__PURE__ */ $constructor("ZodGUID", (inst, def) => { + $ZodGUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function guid2(params) { + return _guid(ZodGUID, params); +} +var ZodUUID = /* @__PURE__ */ $constructor("ZodUUID", (inst, def) => { + $ZodUUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function uuid2(params) { + return _uuid(ZodUUID, params); +} +function uuidv4(params) { + return _uuidv4(ZodUUID, params); +} +function uuidv6(params) { + return _uuidv6(ZodUUID, params); +} +function uuidv7(params) { + return _uuidv7(ZodUUID, params); +} +var ZodURL = /* @__PURE__ */ $constructor("ZodURL", (inst, def) => { + $ZodURL.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function url(params) { + return _url(ZodURL, params); +} +function httpUrl(params) { + return _url(ZodURL, { + protocol: /^https?$/, + hostname: regexes_exports.domain, + ...util_exports.normalizeParams(params) + }); +} +var ZodEmoji = /* @__PURE__ */ $constructor("ZodEmoji", (inst, def) => { + $ZodEmoji.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function emoji2(params) { + return _emoji2(ZodEmoji, params); +} +var ZodNanoID = /* @__PURE__ */ $constructor("ZodNanoID", (inst, def) => { + $ZodNanoID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function nanoid2(params) { + return _nanoid(ZodNanoID, params); +} +var ZodCUID = /* @__PURE__ */ $constructor("ZodCUID", (inst, def) => { + $ZodCUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function cuid3(params) { + return _cuid(ZodCUID, params); +} +var ZodCUID2 = /* @__PURE__ */ $constructor("ZodCUID2", (inst, def) => { + $ZodCUID2.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function cuid22(params) { + return _cuid2(ZodCUID2, params); +} +var ZodULID = /* @__PURE__ */ $constructor("ZodULID", (inst, def) => { + $ZodULID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function ulid2(params) { + return _ulid(ZodULID, params); +} +var ZodXID = /* @__PURE__ */ $constructor("ZodXID", (inst, def) => { + $ZodXID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function xid2(params) { + return _xid(ZodXID, params); +} +var ZodKSUID = /* @__PURE__ */ $constructor("ZodKSUID", (inst, def) => { + $ZodKSUID.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function ksuid2(params) { + return _ksuid(ZodKSUID, params); +} +var ZodIPv4 = /* @__PURE__ */ $constructor("ZodIPv4", (inst, def) => { + $ZodIPv4.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function ipv42(params) { + return _ipv4(ZodIPv4, params); +} +var ZodMAC = /* @__PURE__ */ $constructor("ZodMAC", (inst, def) => { + $ZodMAC.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function mac2(params) { + return _mac(ZodMAC, params); +} +var ZodIPv6 = /* @__PURE__ */ $constructor("ZodIPv6", (inst, def) => { + $ZodIPv6.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function ipv62(params) { + return _ipv6(ZodIPv6, params); +} +var ZodCIDRv4 = /* @__PURE__ */ $constructor("ZodCIDRv4", (inst, def) => { + $ZodCIDRv4.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function cidrv42(params) { + return _cidrv4(ZodCIDRv4, params); +} +var ZodCIDRv6 = /* @__PURE__ */ $constructor("ZodCIDRv6", (inst, def) => { + $ZodCIDRv6.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function cidrv62(params) { + return _cidrv6(ZodCIDRv6, params); +} +var ZodBase64 = /* @__PURE__ */ $constructor("ZodBase64", (inst, def) => { + $ZodBase64.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function base642(params) { + return _base64(ZodBase64, params); +} +var ZodBase64URL = /* @__PURE__ */ $constructor("ZodBase64URL", (inst, def) => { + $ZodBase64URL.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function base64url2(params) { + return _base64url(ZodBase64URL, params); +} +var ZodE164 = /* @__PURE__ */ $constructor("ZodE164", (inst, def) => { + $ZodE164.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function e1642(params) { + return _e164(ZodE164, params); +} +var ZodJWT = /* @__PURE__ */ $constructor("ZodJWT", (inst, def) => { + $ZodJWT.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function jwt(params) { + return _jwt(ZodJWT, params); +} +var ZodCustomStringFormat = /* @__PURE__ */ $constructor("ZodCustomStringFormat", (inst, def) => { + $ZodCustomStringFormat.init(inst, def); + ZodStringFormat.init(inst, def); +}); +function stringFormat(format, fnOrRegex, _params = {}) { + return _stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params); +} +function hostname2(_params) { + return _stringFormat(ZodCustomStringFormat, "hostname", regexes_exports.hostname, _params); +} +function hex2(_params) { + return _stringFormat(ZodCustomStringFormat, "hex", regexes_exports.hex, _params); +} +function hash(alg, params) { + const enc = params?.enc ?? "hex"; + const format = `${alg}_${enc}`; + const regex = regexes_exports[format]; + if (!regex) + throw new Error(`Unrecognized hash format: ${format}`); + return _stringFormat(ZodCustomStringFormat, format, regex, params); +} +var ZodNumber2 = /* @__PURE__ */ $constructor("ZodNumber", (inst, def) => { + $ZodNumber.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => numberProcessor(inst, ctx, json2, params); + inst.gt = (value, params) => inst.check(_gt(value, params)); + inst.gte = (value, params) => inst.check(_gte(value, params)); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.lt = (value, params) => inst.check(_lt(value, params)); + inst.lte = (value, params) => inst.check(_lte(value, params)); + inst.max = (value, params) => inst.check(_lte(value, params)); + inst.int = (params) => inst.check(int(params)); + inst.safe = (params) => inst.check(int(params)); + inst.positive = (params) => inst.check(_gt(0, params)); + inst.nonnegative = (params) => inst.check(_gte(0, params)); + inst.negative = (params) => inst.check(_lt(0, params)); + inst.nonpositive = (params) => inst.check(_lte(0, params)); + inst.multipleOf = (value, params) => inst.check(_multipleOf(value, params)); + inst.step = (value, params) => inst.check(_multipleOf(value, params)); + inst.finite = () => inst; + const bag = inst._zod.bag; + inst.minValue = Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null; + inst.maxValue = Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null; + inst.isInt = (bag.format ?? "").includes("int") || Number.isSafeInteger(bag.multipleOf ?? 0.5); + inst.isFinite = true; + inst.format = bag.format ?? null; +}); +function number2(params) { + return _number(ZodNumber2, params); +} +var ZodNumberFormat = /* @__PURE__ */ $constructor("ZodNumberFormat", (inst, def) => { + $ZodNumberFormat.init(inst, def); + ZodNumber2.init(inst, def); +}); +function int(params) { + return _int(ZodNumberFormat, params); +} +function float32(params) { + return _float32(ZodNumberFormat, params); +} +function float64(params) { + return _float64(ZodNumberFormat, params); +} +function int32(params) { + return _int32(ZodNumberFormat, params); +} +function uint32(params) { + return _uint32(ZodNumberFormat, params); +} +var ZodBoolean2 = /* @__PURE__ */ $constructor("ZodBoolean", (inst, def) => { + $ZodBoolean.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => booleanProcessor(inst, ctx, json2, params); +}); +function boolean2(params) { + return _boolean(ZodBoolean2, params); +} +var ZodBigInt2 = /* @__PURE__ */ $constructor("ZodBigInt", (inst, def) => { + $ZodBigInt.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => bigintProcessor(inst, ctx, json2, params); + inst.gte = (value, params) => inst.check(_gte(value, params)); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.gt = (value, params) => inst.check(_gt(value, params)); + inst.gte = (value, params) => inst.check(_gte(value, params)); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.lt = (value, params) => inst.check(_lt(value, params)); + inst.lte = (value, params) => inst.check(_lte(value, params)); + inst.max = (value, params) => inst.check(_lte(value, params)); + inst.positive = (params) => inst.check(_gt(BigInt(0), params)); + inst.negative = (params) => inst.check(_lt(BigInt(0), params)); + inst.nonpositive = (params) => inst.check(_lte(BigInt(0), params)); + inst.nonnegative = (params) => inst.check(_gte(BigInt(0), params)); + inst.multipleOf = (value, params) => inst.check(_multipleOf(value, params)); + const bag = inst._zod.bag; + inst.minValue = bag.minimum ?? null; + inst.maxValue = bag.maximum ?? null; + inst.format = bag.format ?? null; +}); +function bigint2(params) { + return _bigint(ZodBigInt2, params); +} +var ZodBigIntFormat = /* @__PURE__ */ $constructor("ZodBigIntFormat", (inst, def) => { + $ZodBigIntFormat.init(inst, def); + ZodBigInt2.init(inst, def); +}); +function int64(params) { + return _int64(ZodBigIntFormat, params); +} +function uint64(params) { + return _uint64(ZodBigIntFormat, params); +} +var ZodSymbol2 = /* @__PURE__ */ $constructor("ZodSymbol", (inst, def) => { + $ZodSymbol.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => symbolProcessor(inst, ctx, json2, params); +}); +function symbol(params) { + return _symbol(ZodSymbol2, params); +} +var ZodUndefined2 = /* @__PURE__ */ $constructor("ZodUndefined", (inst, def) => { + $ZodUndefined.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => undefinedProcessor(inst, ctx, json2, params); +}); +function _undefined3(params) { + return _undefined2(ZodUndefined2, params); +} +var ZodNull2 = /* @__PURE__ */ $constructor("ZodNull", (inst, def) => { + $ZodNull.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => nullProcessor(inst, ctx, json2, params); +}); +function _null3(params) { + return _null2(ZodNull2, params); +} +var ZodAny2 = /* @__PURE__ */ $constructor("ZodAny", (inst, def) => { + $ZodAny.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => anyProcessor(inst, ctx, json2, params); +}); +function any() { + return _any(ZodAny2); +} +var ZodUnknown2 = /* @__PURE__ */ $constructor("ZodUnknown", (inst, def) => { + $ZodUnknown.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => unknownProcessor(inst, ctx, json2, params); +}); +function unknown() { + return _unknown(ZodUnknown2); +} +var ZodNever2 = /* @__PURE__ */ $constructor("ZodNever", (inst, def) => { + $ZodNever.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => neverProcessor(inst, ctx, json2, params); +}); +function never(params) { + return _never(ZodNever2, params); +} +var ZodVoid2 = /* @__PURE__ */ $constructor("ZodVoid", (inst, def) => { + $ZodVoid.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => voidProcessor(inst, ctx, json2, params); +}); +function _void2(params) { + return _void(ZodVoid2, params); +} +var ZodDate2 = /* @__PURE__ */ $constructor("ZodDate", (inst, def) => { + $ZodDate.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => dateProcessor(inst, ctx, json2, params); + inst.min = (value, params) => inst.check(_gte(value, params)); + inst.max = (value, params) => inst.check(_lte(value, params)); + const c = inst._zod.bag; + inst.minDate = c.minimum ? new Date(c.minimum) : null; + inst.maxDate = c.maximum ? new Date(c.maximum) : null; +}); +function date3(params) { + return _date(ZodDate2, params); +} +var ZodArray2 = /* @__PURE__ */ $constructor("ZodArray", (inst, def) => { + $ZodArray.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => arrayProcessor(inst, ctx, json2, params); + inst.element = def.element; + inst.min = (minLength, params) => inst.check(_minLength(minLength, params)); + inst.nonempty = (params) => inst.check(_minLength(1, params)); + inst.max = (maxLength, params) => inst.check(_maxLength(maxLength, params)); + inst.length = (len, params) => inst.check(_length(len, params)); + inst.unwrap = () => inst.element; +}); +function array(element, params) { + return _array(ZodArray2, element, params); +} +function keyof(schema) { + const shape = schema._zod.def.shape; + return _enum2(Object.keys(shape)); +} +var ZodObject2 = /* @__PURE__ */ $constructor("ZodObject", (inst, def) => { + $ZodObjectJIT.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => objectProcessor(inst, ctx, json2, params); + util_exports.defineLazy(inst, "shape", () => { + return def.shape; + }); + inst.keyof = () => _enum2(Object.keys(inst._zod.def.shape)); + inst.catchall = (catchall) => inst.clone({ ...inst._zod.def, catchall }); + inst.passthrough = () => inst.clone({ ...inst._zod.def, catchall: unknown() }); + inst.loose = () => inst.clone({ ...inst._zod.def, catchall: unknown() }); + inst.strict = () => inst.clone({ ...inst._zod.def, catchall: never() }); + inst.strip = () => inst.clone({ ...inst._zod.def, catchall: void 0 }); + inst.extend = (incoming) => { + return util_exports.extend(inst, incoming); + }; + inst.safeExtend = (incoming) => { + return util_exports.safeExtend(inst, incoming); + }; + inst.merge = (other) => util_exports.merge(inst, other); + inst.pick = (mask) => util_exports.pick(inst, mask); + inst.omit = (mask) => util_exports.omit(inst, mask); + inst.partial = (...args) => util_exports.partial(ZodOptional2, inst, args[0]); + inst.required = (...args) => util_exports.required(ZodNonOptional, inst, args[0]); +}); +function object2(shape, params) { + const def = { + type: "object", + shape: shape ?? {}, + ...util_exports.normalizeParams(params) + }; + return new ZodObject2(def); +} +function strictObject(shape, params) { + return new ZodObject2({ + type: "object", + shape, + catchall: never(), + ...util_exports.normalizeParams(params) + }); +} +function looseObject(shape, params) { + return new ZodObject2({ + type: "object", + shape, + catchall: unknown(), + ...util_exports.normalizeParams(params) + }); +} +var ZodUnion2 = /* @__PURE__ */ $constructor("ZodUnion", (inst, def) => { + $ZodUnion.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => unionProcessor(inst, ctx, json2, params); + inst.options = def.options; +}); +function union(options, params) { + return new ZodUnion2({ + type: "union", + options, + ...util_exports.normalizeParams(params) + }); +} +var ZodXor = /* @__PURE__ */ $constructor("ZodXor", (inst, def) => { + ZodUnion2.init(inst, def); + $ZodXor.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => unionProcessor(inst, ctx, json2, params); + inst.options = def.options; +}); +function xor(options, params) { + return new ZodXor({ + type: "union", + options, + inclusive: false, + ...util_exports.normalizeParams(params) + }); +} +var ZodDiscriminatedUnion2 = /* @__PURE__ */ $constructor("ZodDiscriminatedUnion", (inst, def) => { + ZodUnion2.init(inst, def); + $ZodDiscriminatedUnion.init(inst, def); +}); +function discriminatedUnion(discriminator, options, params) { + return new ZodDiscriminatedUnion2({ + type: "union", + options, + discriminator, + ...util_exports.normalizeParams(params) + }); +} +var ZodIntersection2 = /* @__PURE__ */ $constructor("ZodIntersection", (inst, def) => { + $ZodIntersection.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => intersectionProcessor(inst, ctx, json2, params); +}); +function intersection(left, right) { + return new ZodIntersection2({ + type: "intersection", + left, + right + }); +} +var ZodTuple2 = /* @__PURE__ */ $constructor("ZodTuple", (inst, def) => { + $ZodTuple.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => tupleProcessor(inst, ctx, json2, params); + inst.rest = (rest) => inst.clone({ + ...inst._zod.def, + rest + }); +}); +function tuple(items, _paramsOrRest, _params) { + const hasRest = _paramsOrRest instanceof $ZodType; + const params = hasRest ? _params : _paramsOrRest; + const rest = hasRest ? _paramsOrRest : null; + return new ZodTuple2({ + type: "tuple", + items, + rest, + ...util_exports.normalizeParams(params) + }); +} +var ZodRecord2 = /* @__PURE__ */ $constructor("ZodRecord", (inst, def) => { + $ZodRecord.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => recordProcessor(inst, ctx, json2, params); + inst.keyType = def.keyType; + inst.valueType = def.valueType; +}); +function record(keyType, valueType, params) { + return new ZodRecord2({ + type: "record", + keyType, + valueType, + ...util_exports.normalizeParams(params) + }); +} +function partialRecord(keyType, valueType, params) { + const k = clone(keyType); + k._zod.values = void 0; + return new ZodRecord2({ + type: "record", + keyType: k, + valueType, + ...util_exports.normalizeParams(params) + }); +} +function looseRecord(keyType, valueType, params) { + return new ZodRecord2({ + type: "record", + keyType, + valueType, + mode: "loose", + ...util_exports.normalizeParams(params) + }); +} +var ZodMap2 = /* @__PURE__ */ $constructor("ZodMap", (inst, def) => { + $ZodMap.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => mapProcessor(inst, ctx, json2, params); + inst.keyType = def.keyType; + inst.valueType = def.valueType; + inst.min = (...args) => inst.check(_minSize(...args)); + inst.nonempty = (params) => inst.check(_minSize(1, params)); + inst.max = (...args) => inst.check(_maxSize(...args)); + inst.size = (...args) => inst.check(_size(...args)); +}); +function map(keyType, valueType, params) { + return new ZodMap2({ + type: "map", + keyType, + valueType, + ...util_exports.normalizeParams(params) + }); +} +var ZodSet2 = /* @__PURE__ */ $constructor("ZodSet", (inst, def) => { + $ZodSet.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => setProcessor(inst, ctx, json2, params); + inst.min = (...args) => inst.check(_minSize(...args)); + inst.nonempty = (params) => inst.check(_minSize(1, params)); + inst.max = (...args) => inst.check(_maxSize(...args)); + inst.size = (...args) => inst.check(_size(...args)); +}); +function set(valueType, params) { + return new ZodSet2({ + type: "set", + valueType, + ...util_exports.normalizeParams(params) + }); +} +var ZodEnum2 = /* @__PURE__ */ $constructor("ZodEnum", (inst, def) => { + $ZodEnum.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => enumProcessor(inst, ctx, json2, params); + inst.enum = def.entries; + inst.options = Object.values(def.entries); + const keys = new Set(Object.keys(def.entries)); + inst.extract = (values, params) => { + const newEntries = {}; + for (const value of values) { + if (keys.has(value)) { + newEntries[value] = def.entries[value]; + } else + throw new Error(`Key ${value} not found in enum`); + } + return new ZodEnum2({ + ...def, + checks: [], + ...util_exports.normalizeParams(params), + entries: newEntries + }); + }; + inst.exclude = (values, params) => { + const newEntries = { ...def.entries }; + for (const value of values) { + if (keys.has(value)) { + delete newEntries[value]; + } else + throw new Error(`Key ${value} not found in enum`); + } + return new ZodEnum2({ + ...def, + checks: [], + ...util_exports.normalizeParams(params), + entries: newEntries + }); + }; +}); +function _enum2(values, params) { + const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values; + return new ZodEnum2({ + type: "enum", + entries, + ...util_exports.normalizeParams(params) + }); +} +function nativeEnum(entries, params) { + return new ZodEnum2({ + type: "enum", + entries, + ...util_exports.normalizeParams(params) + }); +} +var ZodLiteral2 = /* @__PURE__ */ $constructor("ZodLiteral", (inst, def) => { + $ZodLiteral.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => literalProcessor(inst, ctx, json2, params); + inst.values = new Set(def.values); + Object.defineProperty(inst, "value", { + get() { + if (def.values.length > 1) { + throw new Error("This schema contains multiple valid literal values. Use `.values` instead."); + } + return def.values[0]; + } + }); +}); +function literal(value, params) { + return new ZodLiteral2({ + type: "literal", + values: Array.isArray(value) ? value : [value], + ...util_exports.normalizeParams(params) + }); +} +var ZodFile = /* @__PURE__ */ $constructor("ZodFile", (inst, def) => { + $ZodFile.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => fileProcessor(inst, ctx, json2, params); + inst.min = (size, params) => inst.check(_minSize(size, params)); + inst.max = (size, params) => inst.check(_maxSize(size, params)); + inst.mime = (types, params) => inst.check(_mime(Array.isArray(types) ? types : [types], params)); +}); +function file(params) { + return _file(ZodFile, params); +} +var ZodTransform = /* @__PURE__ */ $constructor("ZodTransform", (inst, def) => { + $ZodTransform.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => transformProcessor(inst, ctx, json2, params); + inst._zod.parse = (payload, _ctx) => { + if (_ctx.direction === "backward") { + throw new $ZodEncodeError(inst.constructor.name); + } + payload.addIssue = (issue2) => { + if (typeof issue2 === "string") { + payload.issues.push(util_exports.issue(issue2, payload.value, def)); + } else { + const _issue = issue2; + if (_issue.fatal) + _issue.continue = false; + _issue.code ?? (_issue.code = "custom"); + _issue.input ?? (_issue.input = payload.value); + _issue.inst ?? (_issue.inst = inst); + payload.issues.push(util_exports.issue(_issue)); + } + }; + const output = def.transform(payload.value, payload); + if (output instanceof Promise) { + return output.then((output2) => { + payload.value = output2; + return payload; + }); + } + payload.value = output; + return payload; + }; +}); +function transform(fn) { + return new ZodTransform({ + type: "transform", + transform: fn + }); +} +var ZodOptional2 = /* @__PURE__ */ $constructor("ZodOptional", (inst, def) => { + $ZodOptional.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => optionalProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function optional(innerType) { + return new ZodOptional2({ + type: "optional", + innerType + }); +} +var ZodExactOptional = /* @__PURE__ */ $constructor("ZodExactOptional", (inst, def) => { + $ZodExactOptional.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => optionalProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function exactOptional(innerType) { + return new ZodExactOptional({ + type: "optional", + innerType + }); +} +var ZodNullable2 = /* @__PURE__ */ $constructor("ZodNullable", (inst, def) => { + $ZodNullable.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => nullableProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function nullable(innerType) { + return new ZodNullable2({ + type: "nullable", + innerType + }); +} +function nullish2(innerType) { + return optional(nullable(innerType)); +} +var ZodDefault2 = /* @__PURE__ */ $constructor("ZodDefault", (inst, def) => { + $ZodDefault.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => defaultProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; + inst.removeDefault = inst.unwrap; +}); +function _default2(innerType, defaultValue) { + return new ZodDefault2({ + type: "default", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : util_exports.shallowClone(defaultValue); + } + }); +} +var ZodPrefault = /* @__PURE__ */ $constructor("ZodPrefault", (inst, def) => { + $ZodPrefault.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => prefaultProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function prefault(innerType, defaultValue) { + return new ZodPrefault({ + type: "prefault", + innerType, + get defaultValue() { + return typeof defaultValue === "function" ? defaultValue() : util_exports.shallowClone(defaultValue); + } + }); +} +var ZodNonOptional = /* @__PURE__ */ $constructor("ZodNonOptional", (inst, def) => { + $ZodNonOptional.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => nonoptionalProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function nonoptional(innerType, params) { + return new ZodNonOptional({ + type: "nonoptional", + innerType, + ...util_exports.normalizeParams(params) + }); +} +var ZodSuccess = /* @__PURE__ */ $constructor("ZodSuccess", (inst, def) => { + $ZodSuccess.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => successProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function success(innerType) { + return new ZodSuccess({ + type: "success", + innerType + }); +} +var ZodCatch2 = /* @__PURE__ */ $constructor("ZodCatch", (inst, def) => { + $ZodCatch.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => catchProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; + inst.removeCatch = inst.unwrap; +}); +function _catch2(innerType, catchValue) { + return new ZodCatch2({ + type: "catch", + innerType, + catchValue: typeof catchValue === "function" ? catchValue : () => catchValue + }); +} +var ZodNaN2 = /* @__PURE__ */ $constructor("ZodNaN", (inst, def) => { + $ZodNaN.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => nanProcessor(inst, ctx, json2, params); +}); +function nan(params) { + return _nan(ZodNaN2, params); +} +var ZodPipe = /* @__PURE__ */ $constructor("ZodPipe", (inst, def) => { + $ZodPipe.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => pipeProcessor(inst, ctx, json2, params); + inst.in = def.in; + inst.out = def.out; +}); +function pipe(in_, out) { + return new ZodPipe({ + type: "pipe", + in: in_, + out + // ...util.normalizeParams(params), + }); +} +var ZodCodec = /* @__PURE__ */ $constructor("ZodCodec", (inst, def) => { + ZodPipe.init(inst, def); + $ZodCodec.init(inst, def); +}); +function codec(in_, out, params) { + return new ZodCodec({ + type: "pipe", + in: in_, + out, + transform: params.decode, + reverseTransform: params.encode + }); +} +var ZodReadonly2 = /* @__PURE__ */ $constructor("ZodReadonly", (inst, def) => { + $ZodReadonly.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => readonlyProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function readonly(innerType) { + return new ZodReadonly2({ + type: "readonly", + innerType + }); +} +var ZodTemplateLiteral = /* @__PURE__ */ $constructor("ZodTemplateLiteral", (inst, def) => { + $ZodTemplateLiteral.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => templateLiteralProcessor(inst, ctx, json2, params); +}); +function templateLiteral(parts, params) { + return new ZodTemplateLiteral({ + type: "template_literal", + parts, + ...util_exports.normalizeParams(params) + }); +} +var ZodLazy2 = /* @__PURE__ */ $constructor("ZodLazy", (inst, def) => { + $ZodLazy.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => lazyProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.getter(); +}); +function lazy(getter) { + return new ZodLazy2({ + type: "lazy", + getter + }); +} +var ZodPromise2 = /* @__PURE__ */ $constructor("ZodPromise", (inst, def) => { + $ZodPromise.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => promiseProcessor(inst, ctx, json2, params); + inst.unwrap = () => inst._zod.def.innerType; +}); +function promise(innerType) { + return new ZodPromise2({ + type: "promise", + innerType + }); +} +var ZodFunction2 = /* @__PURE__ */ $constructor("ZodFunction", (inst, def) => { + $ZodFunction.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => functionProcessor(inst, ctx, json2, params); +}); +function _function(params) { + return new ZodFunction2({ + type: "function", + input: Array.isArray(params?.input) ? tuple(params?.input) : params?.input ?? array(unknown()), + output: params?.output ?? unknown() + }); +} +var ZodCustom = /* @__PURE__ */ $constructor("ZodCustom", (inst, def) => { + $ZodCustom.init(inst, def); + ZodType2.init(inst, def); + inst._zod.processJSONSchema = (ctx, json2, params) => customProcessor(inst, ctx, json2, params); +}); +function check(fn) { + const ch = new $ZodCheck({ + check: "custom" + // ...util.normalizeParams(params), + }); + ch._zod.check = fn; + return ch; +} +function custom(fn, _params) { + return _custom(ZodCustom, fn ?? (() => true), _params); +} +function refine(fn, _params = {}) { + return _refine(ZodCustom, fn, _params); +} +function superRefine(fn) { + return _superRefine(fn); +} +var describe2 = describe; +var meta2 = meta; +function _instanceof(cls, params = {}) { + const inst = new ZodCustom({ + type: "custom", + check: "custom", + fn: (data) => data instanceof cls, + abort: true, + ...util_exports.normalizeParams(params) + }); + inst._zod.bag.Class = cls; + inst._zod.check = (payload) => { + if (!(payload.value instanceof cls)) { + payload.issues.push({ + code: "invalid_type", + expected: cls.name, + input: payload.value, + inst, + path: [...inst._zod.def.path ?? []] + }); + } + }; + return inst; +} +var stringbool = (...args) => _stringbool({ + Codec: ZodCodec, + Boolean: ZodBoolean2, + String: ZodString2 +}, ...args); +function json(params) { + const jsonSchema = lazy(() => { + return union([string2(params), number2(), boolean2(), _null3(), array(jsonSchema), record(string2(), jsonSchema)]); + }); + return jsonSchema; +} +function preprocess(fn, schema) { + return pipe(transform(fn), schema); +} + +// node_modules/zod/v4/classic/compat.js +var ZodIssueCode2 = { + invalid_type: "invalid_type", + too_big: "too_big", + too_small: "too_small", + invalid_format: "invalid_format", + not_multiple_of: "not_multiple_of", + unrecognized_keys: "unrecognized_keys", + invalid_union: "invalid_union", + invalid_key: "invalid_key", + invalid_element: "invalid_element", + invalid_value: "invalid_value", + custom: "custom" +}; +function setErrorMap(map2) { + config({ + customError: map2 + }); +} +function getErrorMap2() { + return config().customError; +} +var ZodFirstPartyTypeKind2; +/* @__PURE__ */ (function(ZodFirstPartyTypeKind3) { +})(ZodFirstPartyTypeKind2 || (ZodFirstPartyTypeKind2 = {})); + +// node_modules/zod/v4/classic/from-json-schema.js +var z = { + ...schemas_exports3, + ...checks_exports2, + iso: iso_exports2 +}; +var RECOGNIZED_KEYS = /* @__PURE__ */ new Set([ + // Schema identification + "$schema", + "$ref", + "$defs", + "definitions", + // Core schema keywords + "$id", + "id", + "$comment", + "$anchor", + "$vocabulary", + "$dynamicRef", + "$dynamicAnchor", + // Type + "type", + "enum", + "const", + // Composition + "anyOf", + "oneOf", + "allOf", + "not", + // Object + "properties", + "required", + "additionalProperties", + "patternProperties", + "propertyNames", + "minProperties", + "maxProperties", + // Array + "items", + "prefixItems", + "additionalItems", + "minItems", + "maxItems", + "uniqueItems", + "contains", + "minContains", + "maxContains", + // String + "minLength", + "maxLength", + "pattern", + "format", + // Number + "minimum", + "maximum", + "exclusiveMinimum", + "exclusiveMaximum", + "multipleOf", + // Already handled metadata + "description", + "default", + // Content + "contentEncoding", + "contentMediaType", + "contentSchema", + // Unsupported (error-throwing) + "unevaluatedItems", + "unevaluatedProperties", + "if", + "then", + "else", + "dependentSchemas", + "dependentRequired", + // OpenAPI + "nullable", + "readOnly" +]); +function detectVersion(schema, defaultTarget) { + const $schema = schema.$schema; + if ($schema === "https://json-schema.org/draft/2020-12/schema") { + return "draft-2020-12"; + } + if ($schema === "http://json-schema.org/draft-07/schema#") { + return "draft-7"; + } + if ($schema === "http://json-schema.org/draft-04/schema#") { + return "draft-4"; + } + return defaultTarget ?? "draft-2020-12"; +} +function resolveRef(ref, ctx) { + if (!ref.startsWith("#")) { + throw new Error("External $ref is not supported, only local refs (#/...) are allowed"); + } + const path = ref.slice(1).split("/").filter(Boolean); + if (path.length === 0) { + return ctx.rootSchema; + } + const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions"; + if (path[0] === defsKey) { + const key = path[1]; + if (!key || !ctx.defs[key]) { + throw new Error(`Reference not found: ${ref}`); + } + return ctx.defs[key]; + } + throw new Error(`Reference not found: ${ref}`); +} +function convertBaseSchema(schema, ctx) { + if (schema.not !== void 0) { + if (typeof schema.not === "object" && Object.keys(schema.not).length === 0) { + return z.never(); + } + throw new Error("not is not supported in Zod (except { not: {} } for never)"); + } + if (schema.unevaluatedItems !== void 0) { + throw new Error("unevaluatedItems is not supported"); + } + if (schema.unevaluatedProperties !== void 0) { + throw new Error("unevaluatedProperties is not supported"); + } + if (schema.if !== void 0 || schema.then !== void 0 || schema.else !== void 0) { + throw new Error("Conditional schemas (if/then/else) are not supported"); + } + if (schema.dependentSchemas !== void 0 || schema.dependentRequired !== void 0) { + throw new Error("dependentSchemas and dependentRequired are not supported"); + } + if (schema.$ref) { + const refPath = schema.$ref; + if (ctx.refs.has(refPath)) { + return ctx.refs.get(refPath); + } + if (ctx.processing.has(refPath)) { + return z.lazy(() => { + if (!ctx.refs.has(refPath)) { + throw new Error(`Circular reference not resolved: ${refPath}`); + } + return ctx.refs.get(refPath); + }); + } + ctx.processing.add(refPath); + const resolved = resolveRef(refPath, ctx); + const zodSchema2 = convertSchema(resolved, ctx); + ctx.refs.set(refPath, zodSchema2); + ctx.processing.delete(refPath); + return zodSchema2; + } + if (schema.enum !== void 0) { + const enumValues = schema.enum; + if (ctx.version === "openapi-3.0" && schema.nullable === true && enumValues.length === 1 && enumValues[0] === null) { + return z.null(); + } + if (enumValues.length === 0) { + return z.never(); + } + if (enumValues.length === 1) { + return z.literal(enumValues[0]); + } + if (enumValues.every((v) => typeof v === "string")) { + return z.enum(enumValues); + } + const literalSchemas = enumValues.map((v) => z.literal(v)); + if (literalSchemas.length < 2) { + return literalSchemas[0]; + } + return z.union([literalSchemas[0], literalSchemas[1], ...literalSchemas.slice(2)]); + } + if (schema.const !== void 0) { + return z.literal(schema.const); + } + const type = schema.type; + if (Array.isArray(type)) { + const typeSchemas = type.map((t) => { + const typeSchema = { ...schema, type: t }; + return convertBaseSchema(typeSchema, ctx); + }); + if (typeSchemas.length === 0) { + return z.never(); + } + if (typeSchemas.length === 1) { + return typeSchemas[0]; + } + return z.union(typeSchemas); + } + if (!type) { + return z.any(); + } + let zodSchema; + switch (type) { + case "string": { + let stringSchema = z.string(); + if (schema.format) { + const format = schema.format; + if (format === "email") { + stringSchema = stringSchema.check(z.email()); + } else if (format === "uri" || format === "uri-reference") { + stringSchema = stringSchema.check(z.url()); + } else if (format === "uuid" || format === "guid") { + stringSchema = stringSchema.check(z.uuid()); + } else if (format === "date-time") { + stringSchema = stringSchema.check(z.iso.datetime()); + } else if (format === "date") { + stringSchema = stringSchema.check(z.iso.date()); + } else if (format === "time") { + stringSchema = stringSchema.check(z.iso.time()); + } else if (format === "duration") { + stringSchema = stringSchema.check(z.iso.duration()); + } else if (format === "ipv4") { + stringSchema = stringSchema.check(z.ipv4()); + } else if (format === "ipv6") { + stringSchema = stringSchema.check(z.ipv6()); + } else if (format === "mac") { + stringSchema = stringSchema.check(z.mac()); + } else if (format === "cidr") { + stringSchema = stringSchema.check(z.cidrv4()); + } else if (format === "cidr-v6") { + stringSchema = stringSchema.check(z.cidrv6()); + } else if (format === "base64") { + stringSchema = stringSchema.check(z.base64()); + } else if (format === "base64url") { + stringSchema = stringSchema.check(z.base64url()); + } else if (format === "e164") { + stringSchema = stringSchema.check(z.e164()); + } else if (format === "jwt") { + stringSchema = stringSchema.check(z.jwt()); + } else if (format === "emoji") { + stringSchema = stringSchema.check(z.emoji()); + } else if (format === "nanoid") { + stringSchema = stringSchema.check(z.nanoid()); + } else if (format === "cuid") { + stringSchema = stringSchema.check(z.cuid()); + } else if (format === "cuid2") { + stringSchema = stringSchema.check(z.cuid2()); + } else if (format === "ulid") { + stringSchema = stringSchema.check(z.ulid()); + } else if (format === "xid") { + stringSchema = stringSchema.check(z.xid()); + } else if (format === "ksuid") { + stringSchema = stringSchema.check(z.ksuid()); + } + } + if (typeof schema.minLength === "number") { + stringSchema = stringSchema.min(schema.minLength); + } + if (typeof schema.maxLength === "number") { + stringSchema = stringSchema.max(schema.maxLength); + } + if (schema.pattern) { + stringSchema = stringSchema.regex(new RegExp(schema.pattern)); + } + zodSchema = stringSchema; + break; + } + case "number": + case "integer": { + let numberSchema = type === "integer" ? z.number().int() : z.number(); + if (typeof schema.minimum === "number") { + numberSchema = numberSchema.min(schema.minimum); + } + if (typeof schema.maximum === "number") { + numberSchema = numberSchema.max(schema.maximum); + } + if (typeof schema.exclusiveMinimum === "number") { + numberSchema = numberSchema.gt(schema.exclusiveMinimum); + } else if (schema.exclusiveMinimum === true && typeof schema.minimum === "number") { + numberSchema = numberSchema.gt(schema.minimum); + } + if (typeof schema.exclusiveMaximum === "number") { + numberSchema = numberSchema.lt(schema.exclusiveMaximum); + } else if (schema.exclusiveMaximum === true && typeof schema.maximum === "number") { + numberSchema = numberSchema.lt(schema.maximum); + } + if (typeof schema.multipleOf === "number") { + numberSchema = numberSchema.multipleOf(schema.multipleOf); + } + zodSchema = numberSchema; + break; + } + case "boolean": { + zodSchema = z.boolean(); + break; + } + case "null": { + zodSchema = z.null(); + break; + } + case "object": { + const shape = {}; + const properties = schema.properties || {}; + const requiredSet = new Set(schema.required || []); + for (const [key, propSchema] of Object.entries(properties)) { + const propZodSchema = convertSchema(propSchema, ctx); + shape[key] = requiredSet.has(key) ? propZodSchema : propZodSchema.optional(); + } + if (schema.propertyNames) { + const keySchema = convertSchema(schema.propertyNames, ctx); + const valueSchema = schema.additionalProperties && typeof schema.additionalProperties === "object" ? convertSchema(schema.additionalProperties, ctx) : z.any(); + if (Object.keys(shape).length === 0) { + zodSchema = z.record(keySchema, valueSchema); + break; + } + const objectSchema2 = z.object(shape).passthrough(); + const recordSchema = z.looseRecord(keySchema, valueSchema); + zodSchema = z.intersection(objectSchema2, recordSchema); + break; + } + if (schema.patternProperties) { + const patternProps = schema.patternProperties; + const patternKeys = Object.keys(patternProps); + const looseRecords = []; + for (const pattern of patternKeys) { + const patternValue = convertSchema(patternProps[pattern], ctx); + const keySchema = z.string().regex(new RegExp(pattern)); + looseRecords.push(z.looseRecord(keySchema, patternValue)); + } + const schemasToIntersect = []; + if (Object.keys(shape).length > 0) { + schemasToIntersect.push(z.object(shape).passthrough()); + } + schemasToIntersect.push(...looseRecords); + if (schemasToIntersect.length === 0) { + zodSchema = z.object({}).passthrough(); + } else if (schemasToIntersect.length === 1) { + zodSchema = schemasToIntersect[0]; + } else { + let result = z.intersection(schemasToIntersect[0], schemasToIntersect[1]); + for (let i = 2; i < schemasToIntersect.length; i++) { + result = z.intersection(result, schemasToIntersect[i]); + } + zodSchema = result; + } + break; + } + const objectSchema = z.object(shape); + if (schema.additionalProperties === false) { + zodSchema = objectSchema.strict(); + } else if (typeof schema.additionalProperties === "object") { + zodSchema = objectSchema.catchall(convertSchema(schema.additionalProperties, ctx)); + } else { + zodSchema = objectSchema.passthrough(); + } + break; + } + case "array": { + const prefixItems = schema.prefixItems; + const items = schema.items; + if (prefixItems && Array.isArray(prefixItems)) { + const tupleItems = prefixItems.map((item) => convertSchema(item, ctx)); + const rest = items && typeof items === "object" && !Array.isArray(items) ? convertSchema(items, ctx) : void 0; + if (rest) { + zodSchema = z.tuple(tupleItems).rest(rest); + } else { + zodSchema = z.tuple(tupleItems); + } + if (typeof schema.minItems === "number") { + zodSchema = zodSchema.check(z.minLength(schema.minItems)); + } + if (typeof schema.maxItems === "number") { + zodSchema = zodSchema.check(z.maxLength(schema.maxItems)); + } + } else if (Array.isArray(items)) { + const tupleItems = items.map((item) => convertSchema(item, ctx)); + const rest = schema.additionalItems && typeof schema.additionalItems === "object" ? convertSchema(schema.additionalItems, ctx) : void 0; + if (rest) { + zodSchema = z.tuple(tupleItems).rest(rest); + } else { + zodSchema = z.tuple(tupleItems); + } + if (typeof schema.minItems === "number") { + zodSchema = zodSchema.check(z.minLength(schema.minItems)); + } + if (typeof schema.maxItems === "number") { + zodSchema = zodSchema.check(z.maxLength(schema.maxItems)); + } + } else if (items !== void 0) { + const element = convertSchema(items, ctx); + let arraySchema = z.array(element); + if (typeof schema.minItems === "number") { + arraySchema = arraySchema.min(schema.minItems); + } + if (typeof schema.maxItems === "number") { + arraySchema = arraySchema.max(schema.maxItems); + } + zodSchema = arraySchema; + } else { + zodSchema = z.array(z.any()); + } + break; + } + default: + throw new Error(`Unsupported type: ${type}`); + } + if (schema.description) { + zodSchema = zodSchema.describe(schema.description); + } + if (schema.default !== void 0) { + zodSchema = zodSchema.default(schema.default); + } + return zodSchema; +} +function convertSchema(schema, ctx) { + if (typeof schema === "boolean") { + return schema ? z.any() : z.never(); + } + let baseSchema = convertBaseSchema(schema, ctx); + const hasExplicitType = schema.type || schema.enum !== void 0 || schema.const !== void 0; + if (schema.anyOf && Array.isArray(schema.anyOf)) { + const options = schema.anyOf.map((s) => convertSchema(s, ctx)); + const anyOfUnion = z.union(options); + baseSchema = hasExplicitType ? z.intersection(baseSchema, anyOfUnion) : anyOfUnion; + } + if (schema.oneOf && Array.isArray(schema.oneOf)) { + const options = schema.oneOf.map((s) => convertSchema(s, ctx)); + const oneOfUnion = z.xor(options); + baseSchema = hasExplicitType ? z.intersection(baseSchema, oneOfUnion) : oneOfUnion; + } + if (schema.allOf && Array.isArray(schema.allOf)) { + if (schema.allOf.length === 0) { + baseSchema = hasExplicitType ? baseSchema : z.any(); + } else { + let result = hasExplicitType ? baseSchema : convertSchema(schema.allOf[0], ctx); + const startIdx = hasExplicitType ? 0 : 1; + for (let i = startIdx; i < schema.allOf.length; i++) { + result = z.intersection(result, convertSchema(schema.allOf[i], ctx)); + } + baseSchema = result; + } + } + if (schema.nullable === true && ctx.version === "openapi-3.0") { + baseSchema = z.nullable(baseSchema); + } + if (schema.readOnly === true) { + baseSchema = z.readonly(baseSchema); + } + const extraMeta = {}; + const coreMetadataKeys = ["$id", "id", "$comment", "$anchor", "$vocabulary", "$dynamicRef", "$dynamicAnchor"]; + for (const key of coreMetadataKeys) { + if (key in schema) { + extraMeta[key] = schema[key]; + } + } + const contentMetadataKeys = ["contentEncoding", "contentMediaType", "contentSchema"]; + for (const key of contentMetadataKeys) { + if (key in schema) { + extraMeta[key] = schema[key]; + } + } + for (const key of Object.keys(schema)) { + if (!RECOGNIZED_KEYS.has(key)) { + extraMeta[key] = schema[key]; + } + } + if (Object.keys(extraMeta).length > 0) { + ctx.registry.add(baseSchema, extraMeta); + } + return baseSchema; +} +function fromJSONSchema(schema, params) { + if (typeof schema === "boolean") { + return schema ? z.any() : z.never(); + } + const version2 = detectVersion(schema, params?.defaultTarget); + const defs = schema.$defs || schema.definitions || {}; + const ctx = { + version: version2, + defs, + refs: /* @__PURE__ */ new Map(), + processing: /* @__PURE__ */ new Set(), + rootSchema: schema, + registry: params?.registry ?? globalRegistry + }; + return convertSchema(schema, ctx); +} + +// node_modules/zod/v4/classic/coerce.js +var coerce_exports2 = {}; +__export(coerce_exports2, { + bigint: () => bigint3, + boolean: () => boolean3, + date: () => date4, + number: () => number3, + string: () => string3 +}); +function string3(params) { + return _coercedString(ZodString2, params); +} +function number3(params) { + return _coercedNumber(ZodNumber2, params); +} +function boolean3(params) { + return _coercedBoolean(ZodBoolean2, params); +} +function bigint3(params) { + return _coercedBigint(ZodBigInt2, params); +} +function date4(params) { + return _coercedDate(ZodDate2, params); +} + +// node_modules/zod/v4/classic/external.js +config(en_default2()); + +// node_modules/@modelcontextprotocol/sdk/dist/esm/types.js +var LATEST_PROTOCOL_VERSION = "2025-11-25"; +var SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, "2025-06-18", "2025-03-26", "2024-11-05", "2024-10-07"]; +var RELATED_TASK_META_KEY = "io.modelcontextprotocol/related-task"; +var JSONRPC_VERSION = "2.0"; +var AssertObjectSchema = custom((v) => v !== null && (typeof v === "object" || typeof v === "function")); +var ProgressTokenSchema = union([string2(), number2().int()]); +var CursorSchema = string2(); +var TaskCreationParamsSchema = looseObject({ + /** + * Requested duration in milliseconds to retain task from creation. + */ + ttl: number2().optional(), + /** + * Time in milliseconds to wait between task status requests. + */ + pollInterval: number2().optional() +}); +var TaskMetadataSchema = object2({ + ttl: number2().optional() +}); +var RelatedTaskMetadataSchema = object2({ + taskId: string2() +}); +var RequestMetaSchema = looseObject({ + /** + * If specified, the caller is requesting out-of-band progress notifications for this request (as represented by notifications/progress). The value of this parameter is an opaque token that will be attached to any subsequent notifications. The receiver is not obligated to provide these notifications. + */ + progressToken: ProgressTokenSchema.optional(), + /** + * If specified, this request is related to the provided task. + */ + [RELATED_TASK_META_KEY]: RelatedTaskMetadataSchema.optional() +}); +var BaseRequestParamsSchema = object2({ + /** + * See [General fields: `_meta`](/specification/draft/basic/index#meta) for notes on `_meta` usage. + */ + _meta: RequestMetaSchema.optional() +}); +var TaskAugmentedRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * If specified, the caller is requesting task-augmented execution for this request. + * The request will return a CreateTaskResult immediately, and the actual result can be + * retrieved later via tasks/result. + * + * Task augmentation is subject to capability negotiation - receivers MUST declare support + * for task augmentation of specific request types in their capabilities. + */ + task: TaskMetadataSchema.optional() +}); +var isTaskAugmentedRequestParams = (value) => TaskAugmentedRequestParamsSchema.safeParse(value).success; +var RequestSchema = object2({ + method: string2(), + params: BaseRequestParamsSchema.loose().optional() +}); +var NotificationsParamsSchema = object2({ + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: RequestMetaSchema.optional() +}); +var NotificationSchema = object2({ + method: string2(), + params: NotificationsParamsSchema.loose().optional() +}); +var ResultSchema = looseObject({ + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: RequestMetaSchema.optional() +}); +var RequestIdSchema = union([string2(), number2().int()]); +var JSONRPCRequestSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema, + ...RequestSchema.shape +}).strict(); +var isJSONRPCRequest = (value) => JSONRPCRequestSchema.safeParse(value).success; +var JSONRPCNotificationSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + ...NotificationSchema.shape +}).strict(); +var isJSONRPCNotification = (value) => JSONRPCNotificationSchema.safeParse(value).success; +var JSONRPCResultResponseSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema, + result: ResultSchema +}).strict(); +var isJSONRPCResultResponse = (value) => JSONRPCResultResponseSchema.safeParse(value).success; +var ErrorCode; +(function(ErrorCode2) { + ErrorCode2[ErrorCode2["ConnectionClosed"] = -32e3] = "ConnectionClosed"; + ErrorCode2[ErrorCode2["RequestTimeout"] = -32001] = "RequestTimeout"; + ErrorCode2[ErrorCode2["ParseError"] = -32700] = "ParseError"; + ErrorCode2[ErrorCode2["InvalidRequest"] = -32600] = "InvalidRequest"; + ErrorCode2[ErrorCode2["MethodNotFound"] = -32601] = "MethodNotFound"; + ErrorCode2[ErrorCode2["InvalidParams"] = -32602] = "InvalidParams"; + ErrorCode2[ErrorCode2["InternalError"] = -32603] = "InternalError"; + ErrorCode2[ErrorCode2["UrlElicitationRequired"] = -32042] = "UrlElicitationRequired"; +})(ErrorCode || (ErrorCode = {})); +var JSONRPCErrorResponseSchema = object2({ + jsonrpc: literal(JSONRPC_VERSION), + id: RequestIdSchema.optional(), + error: object2({ + /** + * The error type that occurred. + */ + code: number2().int(), + /** + * A short description of the error. The message SHOULD be limited to a concise single sentence. + */ + message: string2(), + /** + * Additional information about the error. The value of this member is defined by the sender (e.g. detailed error information, nested errors etc.). + */ + data: unknown().optional() + }) +}).strict(); +var isJSONRPCErrorResponse = (value) => JSONRPCErrorResponseSchema.safeParse(value).success; +var JSONRPCMessageSchema = union([ + JSONRPCRequestSchema, + JSONRPCNotificationSchema, + JSONRPCResultResponseSchema, + JSONRPCErrorResponseSchema +]); +var JSONRPCResponseSchema = union([JSONRPCResultResponseSchema, JSONRPCErrorResponseSchema]); +var EmptyResultSchema = ResultSchema.strict(); +var CancelledNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The ID of the request to cancel. + * + * This MUST correspond to the ID of a request previously issued in the same direction. + */ + requestId: RequestIdSchema.optional(), + /** + * An optional string describing the reason for the cancellation. This MAY be logged or presented to the user. + */ + reason: string2().optional() +}); +var CancelledNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/cancelled"), + params: CancelledNotificationParamsSchema +}); +var IconSchema = object2({ + /** + * URL or data URI for the icon. + */ + src: string2(), + /** + * Optional MIME type for the icon. + */ + mimeType: string2().optional(), + /** + * Optional array of strings that specify sizes at which the icon can be used. + * Each string should be in WxH format (e.g., `"48x48"`, `"96x96"`) or `"any"` for scalable formats like SVG. + * + * If not provided, the client should assume that the icon can be used at any size. + */ + sizes: array(string2()).optional(), + /** + * Optional specifier for the theme this icon is designed for. `light` indicates + * the icon is designed to be used with a light background, and `dark` indicates + * the icon is designed to be used with a dark background. + * + * If not provided, the client should assume the icon can be used with any theme. + */ + theme: _enum2(["light", "dark"]).optional() +}); +var IconsSchema = object2({ + /** + * Optional set of sized icons that the client can display in a user interface. + * + * Clients that support rendering icons MUST support at least the following MIME types: + * - `image/png` - PNG images (safe, universal compatibility) + * - `image/jpeg` (and `image/jpg`) - JPEG images (safe, universal compatibility) + * + * Clients that support rendering icons SHOULD also support: + * - `image/svg+xml` - SVG images (scalable but requires security precautions) + * - `image/webp` - WebP images (modern, efficient format) + */ + icons: array(IconSchema).optional() +}); +var BaseMetadataSchema = object2({ + /** Intended for programmatic or logical use, but used as a display name in past specs or fallback */ + name: string2(), + /** + * Intended for UI and end-user contexts — optimized to be human-readable and easily understood, + * even by those unfamiliar with domain-specific terminology. + * + * If not provided, the name should be used for display (except for Tool, + * where `annotations.title` should be given precedence over using `name`, + * if present). + */ + title: string2().optional() +}); +var ImplementationSchema = BaseMetadataSchema.extend({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + version: string2(), + /** + * An optional URL of the website for this implementation. + */ + websiteUrl: string2().optional(), + /** + * An optional human-readable description of what this implementation does. + * + * This can be used by clients or servers to provide context about their purpose + * and capabilities. For example, a server might describe the types of resources + * or tools it provides, while a client might describe its intended use case. + */ + description: string2().optional() +}); +var FormElicitationCapabilitySchema = intersection(object2({ + applyDefaults: boolean2().optional() +}), record(string2(), unknown())); +var ElicitationCapabilitySchema = preprocess((value) => { + if (value && typeof value === "object" && !Array.isArray(value)) { + if (Object.keys(value).length === 0) { + return { form: {} }; + } + } + return value; +}, intersection(object2({ + form: FormElicitationCapabilitySchema.optional(), + url: AssertObjectSchema.optional() +}), record(string2(), unknown()).optional())); +var ClientTasksCapabilitySchema = looseObject({ + /** + * Present if the client supports listing tasks. + */ + list: AssertObjectSchema.optional(), + /** + * Present if the client supports cancelling tasks. + */ + cancel: AssertObjectSchema.optional(), + /** + * Capabilities for task creation on specific request types. + */ + requests: looseObject({ + /** + * Task support for sampling requests. + */ + sampling: looseObject({ + createMessage: AssertObjectSchema.optional() + }).optional(), + /** + * Task support for elicitation requests. + */ + elicitation: looseObject({ + create: AssertObjectSchema.optional() + }).optional() + }).optional() +}); +var ServerTasksCapabilitySchema = looseObject({ + /** + * Present if the server supports listing tasks. + */ + list: AssertObjectSchema.optional(), + /** + * Present if the server supports cancelling tasks. + */ + cancel: AssertObjectSchema.optional(), + /** + * Capabilities for task creation on specific request types. + */ + requests: looseObject({ + /** + * Task support for tool requests. + */ + tools: looseObject({ + call: AssertObjectSchema.optional() + }).optional() + }).optional() +}); +var ClientCapabilitiesSchema = object2({ + /** + * Experimental, non-standard capabilities that the client supports. + */ + experimental: record(string2(), AssertObjectSchema).optional(), + /** + * Present if the client supports sampling from an LLM. + */ + sampling: object2({ + /** + * Present if the client supports context inclusion via includeContext parameter. + * If not declared, servers SHOULD only use `includeContext: "none"` (or omit it). + */ + context: AssertObjectSchema.optional(), + /** + * Present if the client supports tool use via tools and toolChoice parameters. + */ + tools: AssertObjectSchema.optional() + }).optional(), + /** + * Present if the client supports eliciting user input. + */ + elicitation: ElicitationCapabilitySchema.optional(), + /** + * Present if the client supports listing roots. + */ + roots: object2({ + /** + * Whether the client supports issuing notifications for changes to the roots list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the client supports task creation. + */ + tasks: ClientTasksCapabilitySchema.optional(), + /** + * Extensions that the client supports. Keys are extension identifiers (vendor-prefix/extension-name). + */ + extensions: record(string2(), AssertObjectSchema).optional() +}); +var InitializeRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The latest version of the Model Context Protocol that the client supports. The client MAY decide to support older versions as well. + */ + protocolVersion: string2(), + capabilities: ClientCapabilitiesSchema, + clientInfo: ImplementationSchema +}); +var InitializeRequestSchema = RequestSchema.extend({ + method: literal("initialize"), + params: InitializeRequestParamsSchema +}); +var ServerCapabilitiesSchema = object2({ + /** + * Experimental, non-standard capabilities that the server supports. + */ + experimental: record(string2(), AssertObjectSchema).optional(), + /** + * Present if the server supports sending log messages to the client. + */ + logging: AssertObjectSchema.optional(), + /** + * Present if the server supports sending completions to the client. + */ + completions: AssertObjectSchema.optional(), + /** + * Present if the server offers any prompt templates. + */ + prompts: object2({ + /** + * Whether this server supports issuing notifications for changes to the prompt list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server offers any resources to read. + */ + resources: object2({ + /** + * Whether this server supports clients subscribing to resource updates. + */ + subscribe: boolean2().optional(), + /** + * Whether this server supports issuing notifications for changes to the resource list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server offers any tools to call. + */ + tools: object2({ + /** + * Whether this server supports issuing notifications for changes to the tool list. + */ + listChanged: boolean2().optional() + }).optional(), + /** + * Present if the server supports task creation. + */ + tasks: ServerTasksCapabilitySchema.optional(), + /** + * Extensions that the server supports. Keys are extension identifiers (vendor-prefix/extension-name). + */ + extensions: record(string2(), AssertObjectSchema).optional() +}); +var InitializeResultSchema = ResultSchema.extend({ + /** + * The version of the Model Context Protocol that the server wants to use. This may not match the version that the client requested. If the client cannot support this version, it MUST disconnect. + */ + protocolVersion: string2(), + capabilities: ServerCapabilitiesSchema, + serverInfo: ImplementationSchema, + /** + * Instructions describing how to use the server and its features. + * + * This can be used by clients to improve the LLM's understanding of available tools, resources, etc. It can be thought of like a "hint" to the model. For example, this information MAY be added to the system prompt. + */ + instructions: string2().optional() +}); +var InitializedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/initialized"), + params: NotificationsParamsSchema.optional() +}); +var PingRequestSchema = RequestSchema.extend({ + method: literal("ping"), + params: BaseRequestParamsSchema.optional() +}); +var ProgressSchema = object2({ + /** + * The progress thus far. This should increase every time progress is made, even if the total is unknown. + */ + progress: number2(), + /** + * Total number of items to process (or total progress required), if known. + */ + total: optional(number2()), + /** + * An optional message describing the current progress. + */ + message: optional(string2()) +}); +var ProgressNotificationParamsSchema = object2({ + ...NotificationsParamsSchema.shape, + ...ProgressSchema.shape, + /** + * The progress token which was given in the initial request, used to associate this notification with the request that is proceeding. + */ + progressToken: ProgressTokenSchema +}); +var ProgressNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/progress"), + params: ProgressNotificationParamsSchema +}); +var PaginatedRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * An opaque token representing the current pagination position. + * If provided, the server should return results starting after this cursor. + */ + cursor: CursorSchema.optional() +}); +var PaginatedRequestSchema = RequestSchema.extend({ + params: PaginatedRequestParamsSchema.optional() +}); +var PaginatedResultSchema = ResultSchema.extend({ + /** + * An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. + */ + nextCursor: CursorSchema.optional() +}); +var TaskStatusSchema = _enum2(["working", "input_required", "completed", "failed", "cancelled"]); +var TaskSchema = object2({ + taskId: string2(), + status: TaskStatusSchema, + /** + * Time in milliseconds to keep task results available after completion. + * If null, the task has unlimited lifetime until manually cleaned up. + */ + ttl: union([number2(), _null3()]), + /** + * ISO 8601 timestamp when the task was created. + */ + createdAt: string2(), + /** + * ISO 8601 timestamp when the task was last updated. + */ + lastUpdatedAt: string2(), + pollInterval: optional(number2()), + /** + * Optional diagnostic message for failed tasks or other status information. + */ + statusMessage: optional(string2()) +}); +var CreateTaskResultSchema = ResultSchema.extend({ + task: TaskSchema +}); +var TaskStatusNotificationParamsSchema = NotificationsParamsSchema.merge(TaskSchema); +var TaskStatusNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/tasks/status"), + params: TaskStatusNotificationParamsSchema +}); +var GetTaskRequestSchema = RequestSchema.extend({ + method: literal("tasks/get"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) +}); +var GetTaskResultSchema = ResultSchema.merge(TaskSchema); +var GetTaskPayloadRequestSchema = RequestSchema.extend({ + method: literal("tasks/result"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) +}); +var GetTaskPayloadResultSchema = ResultSchema.loose(); +var ListTasksRequestSchema = PaginatedRequestSchema.extend({ + method: literal("tasks/list") +}); +var ListTasksResultSchema = PaginatedResultSchema.extend({ + tasks: array(TaskSchema) +}); +var CancelTaskRequestSchema = RequestSchema.extend({ + method: literal("tasks/cancel"), + params: BaseRequestParamsSchema.extend({ + taskId: string2() + }) +}); +var CancelTaskResultSchema = ResultSchema.merge(TaskSchema); +var ResourceContentsSchema = object2({ + /** + * The URI of this resource. + */ + uri: string2(), + /** + * The MIME type of this resource, if known. + */ + mimeType: optional(string2()), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var TextResourceContentsSchema = ResourceContentsSchema.extend({ + /** + * The text of the item. This must only be set if the item can actually be represented as text (not binary data). + */ + text: string2() +}); +var Base64Schema = string2().refine((val) => { + try { + atob(val); + return true; + } catch { + return false; + } +}, { message: "Invalid Base64 string" }); +var BlobResourceContentsSchema = ResourceContentsSchema.extend({ + /** + * A base64-encoded string representing the binary data of the item. + */ + blob: Base64Schema +}); +var RoleSchema = _enum2(["user", "assistant"]); +var AnnotationsSchema = object2({ + /** + * Intended audience(s) for the resource. + */ + audience: array(RoleSchema).optional(), + /** + * Importance hint for the resource, from 0 (least) to 1 (most). + */ + priority: number2().min(0).max(1).optional(), + /** + * ISO 8601 timestamp for the most recent modification. + */ + lastModified: iso_exports2.datetime({ offset: true }).optional() +}); +var ResourceSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * The URI of this resource. + */ + uri: string2(), + /** + * A description of what this resource represents. + * + * This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model. + */ + description: optional(string2()), + /** + * The MIME type of this resource, if known. + */ + mimeType: optional(string2()), + /** + * The size of the raw resource content, in bytes (i.e., before base64 encoding or any tokenization), if known. + * + * This can be used by Hosts to display file sizes and estimate context window usage. + */ + size: optional(number2()), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) +}); +var ResourceTemplateSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * A URI template (according to RFC 6570) that can be used to construct resource URIs. + */ + uriTemplate: string2(), + /** + * A description of what this template is for. + * + * This can be used by clients to improve the LLM's understanding of available resources. It can be thought of like a "hint" to the model. + */ + description: optional(string2()), + /** + * The MIME type for all resources that match this template. This should only be included if all resources matching this template have the same type. + */ + mimeType: optional(string2()), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) +}); +var ListResourcesRequestSchema = PaginatedRequestSchema.extend({ + method: literal("resources/list") +}); +var ListResourcesResultSchema = PaginatedResultSchema.extend({ + resources: array(ResourceSchema) +}); +var ListResourceTemplatesRequestSchema = PaginatedRequestSchema.extend({ + method: literal("resources/templates/list") +}); +var ListResourceTemplatesResultSchema = PaginatedResultSchema.extend({ + resourceTemplates: array(ResourceTemplateSchema) +}); +var ResourceRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The URI of the resource to read. The URI can use any protocol; it is up to the server how to interpret it. + * + * @format uri + */ + uri: string2() +}); +var ReadResourceRequestParamsSchema = ResourceRequestParamsSchema; +var ReadResourceRequestSchema = RequestSchema.extend({ + method: literal("resources/read"), + params: ReadResourceRequestParamsSchema +}); +var ReadResourceResultSchema = ResultSchema.extend({ + contents: array(union([TextResourceContentsSchema, BlobResourceContentsSchema])) +}); +var ResourceListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/resources/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var SubscribeRequestParamsSchema = ResourceRequestParamsSchema; +var SubscribeRequestSchema = RequestSchema.extend({ + method: literal("resources/subscribe"), + params: SubscribeRequestParamsSchema +}); +var UnsubscribeRequestParamsSchema = ResourceRequestParamsSchema; +var UnsubscribeRequestSchema = RequestSchema.extend({ + method: literal("resources/unsubscribe"), + params: UnsubscribeRequestParamsSchema +}); +var ResourceUpdatedNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The URI of the resource that has been updated. This might be a sub-resource of the one that the client actually subscribed to. + */ + uri: string2() +}); +var ResourceUpdatedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/resources/updated"), + params: ResourceUpdatedNotificationParamsSchema +}); +var PromptArgumentSchema = object2({ + /** + * The name of the argument. + */ + name: string2(), + /** + * A human-readable description of the argument. + */ + description: optional(string2()), + /** + * Whether this argument must be provided. + */ + required: optional(boolean2()) +}); +var PromptSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * An optional description of what this prompt provides + */ + description: optional(string2()), + /** + * A list of arguments to use for templating the prompt. + */ + arguments: optional(array(PromptArgumentSchema)), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: optional(looseObject({})) +}); +var ListPromptsRequestSchema = PaginatedRequestSchema.extend({ + method: literal("prompts/list") +}); +var ListPromptsResultSchema = PaginatedResultSchema.extend({ + prompts: array(PromptSchema) +}); +var GetPromptRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The name of the prompt or prompt template. + */ + name: string2(), + /** + * Arguments to use for templating the prompt. + */ + arguments: record(string2(), string2()).optional() +}); +var GetPromptRequestSchema = RequestSchema.extend({ + method: literal("prompts/get"), + params: GetPromptRequestParamsSchema +}); +var TextContentSchema = object2({ + type: literal("text"), + /** + * The text content of the message. + */ + text: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ImageContentSchema = object2({ + type: literal("image"), + /** + * The base64-encoded image data. + */ + data: Base64Schema, + /** + * The MIME type of the image. Different providers may support different image types. + */ + mimeType: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var AudioContentSchema = object2({ + type: literal("audio"), + /** + * The base64-encoded audio data. + */ + data: Base64Schema, + /** + * The MIME type of the audio. Different providers may support different audio types. + */ + mimeType: string2(), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ToolUseContentSchema = object2({ + type: literal("tool_use"), + /** + * The name of the tool to invoke. + * Must match a tool name from the request's tools array. + */ + name: string2(), + /** + * Unique identifier for this tool call. + * Used to correlate with ToolResultContent in subsequent messages. + */ + id: string2(), + /** + * Arguments to pass to the tool. + * Must conform to the tool's inputSchema. + */ + input: record(string2(), unknown()), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var EmbeddedResourceSchema = object2({ + type: literal("resource"), + resource: union([TextResourceContentsSchema, BlobResourceContentsSchema]), + /** + * Optional annotations for the client. + */ + annotations: AnnotationsSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ResourceLinkSchema = ResourceSchema.extend({ + type: literal("resource_link") +}); +var ContentBlockSchema = union([ + TextContentSchema, + ImageContentSchema, + AudioContentSchema, + ResourceLinkSchema, + EmbeddedResourceSchema +]); +var PromptMessageSchema = object2({ + role: RoleSchema, + content: ContentBlockSchema +}); +var GetPromptResultSchema = ResultSchema.extend({ + /** + * An optional description for the prompt. + */ + description: string2().optional(), + messages: array(PromptMessageSchema) +}); +var PromptListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/prompts/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var ToolAnnotationsSchema = object2({ + /** + * A human-readable title for the tool. + */ + title: string2().optional(), + /** + * If true, the tool does not modify its environment. + * + * Default: false + */ + readOnlyHint: boolean2().optional(), + /** + * If true, the tool may perform destructive updates to its environment. + * If false, the tool performs only additive updates. + * + * (This property is meaningful only when `readOnlyHint == false`) + * + * Default: true + */ + destructiveHint: boolean2().optional(), + /** + * If true, calling the tool repeatedly with the same arguments + * will have no additional effect on the its environment. + * + * (This property is meaningful only when `readOnlyHint == false`) + * + * Default: false + */ + idempotentHint: boolean2().optional(), + /** + * If true, this tool may interact with an "open world" of external + * entities. If false, the tool's domain of interaction is closed. + * For example, the world of a web search tool is open, whereas that + * of a memory tool is not. + * + * Default: true + */ + openWorldHint: boolean2().optional() +}); +var ToolExecutionSchema = object2({ + /** + * Indicates the tool's preference for task-augmented execution. + * - "required": Clients MUST invoke the tool as a task + * - "optional": Clients MAY invoke the tool as a task or normal request + * - "forbidden": Clients MUST NOT attempt to invoke the tool as a task + * + * If not present, defaults to "forbidden". + */ + taskSupport: _enum2(["required", "optional", "forbidden"]).optional() +}); +var ToolSchema = object2({ + ...BaseMetadataSchema.shape, + ...IconsSchema.shape, + /** + * A human-readable description of the tool. + */ + description: string2().optional(), + /** + * A JSON Schema 2020-12 object defining the expected parameters for the tool. + * Must have type: 'object' at the root level per MCP spec. + */ + inputSchema: object2({ + type: literal("object"), + properties: record(string2(), AssertObjectSchema).optional(), + required: array(string2()).optional() + }).catchall(unknown()), + /** + * An optional JSON Schema 2020-12 object defining the structure of the tool's output + * returned in the structuredContent field of a CallToolResult. + * Must have type: 'object' at the root level per MCP spec. + */ + outputSchema: object2({ + type: literal("object"), + properties: record(string2(), AssertObjectSchema).optional(), + required: array(string2()).optional() + }).catchall(unknown()).optional(), + /** + * Optional additional tool information. + */ + annotations: ToolAnnotationsSchema.optional(), + /** + * Execution-related properties for this tool. + */ + execution: ToolExecutionSchema.optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ListToolsRequestSchema = PaginatedRequestSchema.extend({ + method: literal("tools/list") +}); +var ListToolsResultSchema = PaginatedResultSchema.extend({ + tools: array(ToolSchema) +}); +var CallToolResultSchema = ResultSchema.extend({ + /** + * A list of content objects that represent the result of the tool call. + * + * If the Tool does not define an outputSchema, this field MUST be present in the result. + * For backwards compatibility, this field is always present, but it may be empty. + */ + content: array(ContentBlockSchema).default([]), + /** + * An object containing structured tool output. + * + * If the Tool defines an outputSchema, this field MUST be present in the result, and contain a JSON object that matches the schema. + */ + structuredContent: record(string2(), unknown()).optional(), + /** + * Whether the tool call ended in an error. + * + * If not set, this is assumed to be false (the call was successful). + * + * Any errors that originate from the tool SHOULD be reported inside the result + * object, with `isError` set to true, _not_ as an MCP protocol-level error + * response. Otherwise, the LLM would not be able to see that an error occurred + * and self-correct. + * + * However, any errors in _finding_ the tool, an error indicating that the + * server does not support tool calls, or any other exceptional conditions, + * should be reported as an MCP error response. + */ + isError: boolean2().optional() +}); +var CompatibilityCallToolResultSchema = CallToolResultSchema.or(ResultSchema.extend({ + toolResult: unknown() +})); +var CallToolRequestParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The name of the tool to call. + */ + name: string2(), + /** + * Arguments to pass to the tool. + */ + arguments: record(string2(), unknown()).optional() +}); +var CallToolRequestSchema = RequestSchema.extend({ + method: literal("tools/call"), + params: CallToolRequestParamsSchema +}); +var ToolListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/tools/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var ListChangedOptionsBaseSchema = object2({ + /** + * If true, the list will be refreshed automatically when a list changed notification is received. + * The callback will be called with the updated list. + * + * If false, the callback will be called with null items, allowing manual refresh. + * + * @default true + */ + autoRefresh: boolean2().default(true), + /** + * Debounce time in milliseconds for list changed notification processing. + * + * Multiple notifications received within this timeframe will only trigger one refresh. + * Set to 0 to disable debouncing. + * + * @default 300 + */ + debounceMs: number2().int().nonnegative().default(300) +}); +var LoggingLevelSchema = _enum2(["debug", "info", "notice", "warning", "error", "critical", "alert", "emergency"]); +var SetLevelRequestParamsSchema = BaseRequestParamsSchema.extend({ + /** + * The level of logging that the client wants to receive from the server. The server should send all logs at this level and higher (i.e., more severe) to the client as notifications/logging/message. + */ + level: LoggingLevelSchema +}); +var SetLevelRequestSchema = RequestSchema.extend({ + method: literal("logging/setLevel"), + params: SetLevelRequestParamsSchema +}); +var LoggingMessageNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The severity of this log message. + */ + level: LoggingLevelSchema, + /** + * An optional name of the logger issuing this message. + */ + logger: string2().optional(), + /** + * The data to be logged, such as a string message or an object. Any JSON serializable type is allowed here. + */ + data: unknown() +}); +var LoggingMessageNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/message"), + params: LoggingMessageNotificationParamsSchema +}); +var ModelHintSchema = object2({ + /** + * A hint for a model name. + */ + name: string2().optional() +}); +var ModelPreferencesSchema = object2({ + /** + * Optional hints to use for model selection. + */ + hints: array(ModelHintSchema).optional(), + /** + * How much to prioritize cost when selecting a model. + */ + costPriority: number2().min(0).max(1).optional(), + /** + * How much to prioritize sampling speed (latency) when selecting a model. + */ + speedPriority: number2().min(0).max(1).optional(), + /** + * How much to prioritize intelligence and capabilities when selecting a model. + */ + intelligencePriority: number2().min(0).max(1).optional() +}); +var ToolChoiceSchema = object2({ + /** + * Controls when tools are used: + * - "auto": Model decides whether to use tools (default) + * - "required": Model MUST use at least one tool before completing + * - "none": Model MUST NOT use any tools + */ + mode: _enum2(["auto", "required", "none"]).optional() +}); +var ToolResultContentSchema = object2({ + type: literal("tool_result"), + toolUseId: string2().describe("The unique identifier for the corresponding tool call."), + content: array(ContentBlockSchema).default([]), + structuredContent: object2({}).loose().optional(), + isError: boolean2().optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var SamplingContentSchema = discriminatedUnion("type", [TextContentSchema, ImageContentSchema, AudioContentSchema]); +var SamplingMessageContentBlockSchema = discriminatedUnion("type", [ + TextContentSchema, + ImageContentSchema, + AudioContentSchema, + ToolUseContentSchema, + ToolResultContentSchema +]); +var SamplingMessageSchema = object2({ + role: RoleSchema, + content: union([SamplingMessageContentBlockSchema, array(SamplingMessageContentBlockSchema)]), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var CreateMessageRequestParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + messages: array(SamplingMessageSchema), + /** + * The server's preferences for which model to select. The client MAY modify or omit this request. + */ + modelPreferences: ModelPreferencesSchema.optional(), + /** + * An optional system prompt the server wants to use for sampling. The client MAY modify or omit this prompt. + */ + systemPrompt: string2().optional(), + /** + * A request to include context from one or more MCP servers (including the caller), to be attached to the prompt. + * The client MAY ignore this request. + * + * Default is "none". Values "thisServer" and "allServers" are soft-deprecated. Servers SHOULD only use these values if the client + * declares ClientCapabilities.sampling.context. These values may be removed in future spec releases. + */ + includeContext: _enum2(["none", "thisServer", "allServers"]).optional(), + temperature: number2().optional(), + /** + * The requested maximum number of tokens to sample (to prevent runaway completions). + * + * The client MAY choose to sample fewer tokens than the requested maximum. + */ + maxTokens: number2().int(), + stopSequences: array(string2()).optional(), + /** + * Optional metadata to pass through to the LLM provider. The format of this metadata is provider-specific. + */ + metadata: AssertObjectSchema.optional(), + /** + * Tools that the model may use during generation. + * The client MUST return an error if this field is provided but ClientCapabilities.sampling.tools is not declared. + */ + tools: array(ToolSchema).optional(), + /** + * Controls how the model uses tools. + * The client MUST return an error if this field is provided but ClientCapabilities.sampling.tools is not declared. + * Default is `{ mode: "auto" }`. + */ + toolChoice: ToolChoiceSchema.optional() +}); +var CreateMessageRequestSchema = RequestSchema.extend({ + method: literal("sampling/createMessage"), + params: CreateMessageRequestParamsSchema +}); +var CreateMessageResultSchema = ResultSchema.extend({ + /** + * The name of the model that generated the message. + */ + model: string2(), + /** + * The reason why sampling stopped, if known. + * + * Standard values: + * - "endTurn": Natural end of the assistant's turn + * - "stopSequence": A stop sequence was encountered + * - "maxTokens": Maximum token limit was reached + * + * This field is an open string to allow for provider-specific stop reasons. + */ + stopReason: optional(_enum2(["endTurn", "stopSequence", "maxTokens"]).or(string2())), + role: RoleSchema, + /** + * Response content. Single content block (text, image, or audio). + */ + content: SamplingContentSchema +}); +var CreateMessageResultWithToolsSchema = ResultSchema.extend({ + /** + * The name of the model that generated the message. + */ + model: string2(), + /** + * The reason why sampling stopped, if known. + * + * Standard values: + * - "endTurn": Natural end of the assistant's turn + * - "stopSequence": A stop sequence was encountered + * - "maxTokens": Maximum token limit was reached + * - "toolUse": The model wants to use one or more tools + * + * This field is an open string to allow for provider-specific stop reasons. + */ + stopReason: optional(_enum2(["endTurn", "stopSequence", "maxTokens", "toolUse"]).or(string2())), + role: RoleSchema, + /** + * Response content. May be a single block or array. May include ToolUseContent if stopReason is "toolUse". + */ + content: union([SamplingMessageContentBlockSchema, array(SamplingMessageContentBlockSchema)]) +}); +var BooleanSchemaSchema = object2({ + type: literal("boolean"), + title: string2().optional(), + description: string2().optional(), + default: boolean2().optional() +}); +var StringSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + minLength: number2().optional(), + maxLength: number2().optional(), + format: _enum2(["email", "uri", "date", "date-time"]).optional(), + default: string2().optional() +}); +var NumberSchemaSchema = object2({ + type: _enum2(["number", "integer"]), + title: string2().optional(), + description: string2().optional(), + minimum: number2().optional(), + maximum: number2().optional(), + default: number2().optional() +}); +var UntitledSingleSelectEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + enum: array(string2()), + default: string2().optional() +}); +var TitledSingleSelectEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + oneOf: array(object2({ + const: string2(), + title: string2() + })), + default: string2().optional() +}); +var LegacyTitledEnumSchemaSchema = object2({ + type: literal("string"), + title: string2().optional(), + description: string2().optional(), + enum: array(string2()), + enumNames: array(string2()).optional(), + default: string2().optional() +}); +var SingleSelectEnumSchemaSchema = union([UntitledSingleSelectEnumSchemaSchema, TitledSingleSelectEnumSchemaSchema]); +var UntitledMultiSelectEnumSchemaSchema = object2({ + type: literal("array"), + title: string2().optional(), + description: string2().optional(), + minItems: number2().optional(), + maxItems: number2().optional(), + items: object2({ + type: literal("string"), + enum: array(string2()) + }), + default: array(string2()).optional() +}); +var TitledMultiSelectEnumSchemaSchema = object2({ + type: literal("array"), + title: string2().optional(), + description: string2().optional(), + minItems: number2().optional(), + maxItems: number2().optional(), + items: object2({ + anyOf: array(object2({ + const: string2(), + title: string2() + })) + }), + default: array(string2()).optional() +}); +var MultiSelectEnumSchemaSchema = union([UntitledMultiSelectEnumSchemaSchema, TitledMultiSelectEnumSchemaSchema]); +var EnumSchemaSchema = union([LegacyTitledEnumSchemaSchema, SingleSelectEnumSchemaSchema, MultiSelectEnumSchemaSchema]); +var PrimitiveSchemaDefinitionSchema = union([EnumSchemaSchema, BooleanSchemaSchema, StringSchemaSchema, NumberSchemaSchema]); +var ElicitRequestFormParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The elicitation mode. + * + * Optional for backward compatibility. Clients MUST treat missing mode as "form". + */ + mode: literal("form").optional(), + /** + * The message to present to the user describing what information is being requested. + */ + message: string2(), + /** + * A restricted subset of JSON Schema. + * Only top-level properties are allowed, without nesting. + */ + requestedSchema: object2({ + type: literal("object"), + properties: record(string2(), PrimitiveSchemaDefinitionSchema), + required: array(string2()).optional() + }) +}); +var ElicitRequestURLParamsSchema = TaskAugmentedRequestParamsSchema.extend({ + /** + * The elicitation mode. + */ + mode: literal("url"), + /** + * The message to present to the user explaining why the interaction is needed. + */ + message: string2(), + /** + * The ID of the elicitation, which must be unique within the context of the server. + * The client MUST treat this ID as an opaque value. + */ + elicitationId: string2(), + /** + * The URL that the user should navigate to. + */ + url: string2().url() +}); +var ElicitRequestParamsSchema = union([ElicitRequestFormParamsSchema, ElicitRequestURLParamsSchema]); +var ElicitRequestSchema = RequestSchema.extend({ + method: literal("elicitation/create"), + params: ElicitRequestParamsSchema +}); +var ElicitationCompleteNotificationParamsSchema = NotificationsParamsSchema.extend({ + /** + * The ID of the elicitation that completed. + */ + elicitationId: string2() +}); +var ElicitationCompleteNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/elicitation/complete"), + params: ElicitationCompleteNotificationParamsSchema +}); +var ElicitResultSchema = ResultSchema.extend({ + /** + * The user action in response to the elicitation. + * - "accept": User submitted the form/confirmed the action + * - "decline": User explicitly decline the action + * - "cancel": User dismissed without making an explicit choice + */ + action: _enum2(["accept", "decline", "cancel"]), + /** + * The submitted form data, only present when action is "accept". + * Contains values matching the requested schema. + * Per MCP spec, content is "typically omitted" for decline/cancel actions. + * We normalize null to undefined for leniency while maintaining type compatibility. + */ + content: preprocess((val) => val === null ? void 0 : val, record(string2(), union([string2(), number2(), boolean2(), array(string2())])).optional()) +}); +var ResourceTemplateReferenceSchema = object2({ + type: literal("ref/resource"), + /** + * The URI or URI template of the resource. + */ + uri: string2() +}); +var PromptReferenceSchema = object2({ + type: literal("ref/prompt"), + /** + * The name of the prompt or prompt template + */ + name: string2() +}); +var CompleteRequestParamsSchema = BaseRequestParamsSchema.extend({ + ref: union([PromptReferenceSchema, ResourceTemplateReferenceSchema]), + /** + * The argument's information + */ + argument: object2({ + /** + * The name of the argument + */ + name: string2(), + /** + * The value of the argument to use for completion matching. + */ + value: string2() + }), + context: object2({ + /** + * Previously-resolved variables in a URI template or prompt. + */ + arguments: record(string2(), string2()).optional() + }).optional() +}); +var CompleteRequestSchema = RequestSchema.extend({ + method: literal("completion/complete"), + params: CompleteRequestParamsSchema +}); +function assertCompleteRequestPrompt(request) { + if (request.params.ref.type !== "ref/prompt") { + throw new TypeError(`Expected CompleteRequestPrompt, but got ${request.params.ref.type}`); + } + void request; +} +function assertCompleteRequestResourceTemplate(request) { + if (request.params.ref.type !== "ref/resource") { + throw new TypeError(`Expected CompleteRequestResourceTemplate, but got ${request.params.ref.type}`); + } + void request; +} +var CompleteResultSchema = ResultSchema.extend({ + completion: looseObject({ + /** + * An array of completion values. Must not exceed 100 items. + */ + values: array(string2()).max(100), + /** + * The total number of completion options available. This can exceed the number of values actually sent in the response. + */ + total: optional(number2().int()), + /** + * Indicates whether there are additional completion options beyond those provided in the current response, even if the exact total is unknown. + */ + hasMore: optional(boolean2()) + }) +}); +var RootSchema = object2({ + /** + * The URI identifying the root. This *must* start with file:// for now. + */ + uri: string2().startsWith("file://"), + /** + * An optional name for the root. + */ + name: string2().optional(), + /** + * See [MCP specification](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/47339c03c143bb4ec01a26e721a1b8fe66634ebe/docs/specification/draft/basic/index.mdx#general-fields) + * for notes on _meta usage. + */ + _meta: record(string2(), unknown()).optional() +}); +var ListRootsRequestSchema = RequestSchema.extend({ + method: literal("roots/list"), + params: BaseRequestParamsSchema.optional() +}); +var ListRootsResultSchema = ResultSchema.extend({ + roots: array(RootSchema) +}); +var RootsListChangedNotificationSchema = NotificationSchema.extend({ + method: literal("notifications/roots/list_changed"), + params: NotificationsParamsSchema.optional() +}); +var ClientRequestSchema = union([ + PingRequestSchema, + InitializeRequestSchema, + CompleteRequestSchema, + SetLevelRequestSchema, + GetPromptRequestSchema, + ListPromptsRequestSchema, + ListResourcesRequestSchema, + ListResourceTemplatesRequestSchema, + ReadResourceRequestSchema, + SubscribeRequestSchema, + UnsubscribeRequestSchema, + CallToolRequestSchema, + ListToolsRequestSchema, + GetTaskRequestSchema, + GetTaskPayloadRequestSchema, + ListTasksRequestSchema, + CancelTaskRequestSchema +]); +var ClientNotificationSchema = union([ + CancelledNotificationSchema, + ProgressNotificationSchema, + InitializedNotificationSchema, + RootsListChangedNotificationSchema, + TaskStatusNotificationSchema +]); +var ClientResultSchema = union([ + EmptyResultSchema, + CreateMessageResultSchema, + CreateMessageResultWithToolsSchema, + ElicitResultSchema, + ListRootsResultSchema, + GetTaskResultSchema, + ListTasksResultSchema, + CreateTaskResultSchema +]); +var ServerRequestSchema = union([ + PingRequestSchema, + CreateMessageRequestSchema, + ElicitRequestSchema, + ListRootsRequestSchema, + GetTaskRequestSchema, + GetTaskPayloadRequestSchema, + ListTasksRequestSchema, + CancelTaskRequestSchema +]); +var ServerNotificationSchema = union([ + CancelledNotificationSchema, + ProgressNotificationSchema, + LoggingMessageNotificationSchema, + ResourceUpdatedNotificationSchema, + ResourceListChangedNotificationSchema, + ToolListChangedNotificationSchema, + PromptListChangedNotificationSchema, + TaskStatusNotificationSchema, + ElicitationCompleteNotificationSchema +]); +var ServerResultSchema = union([ + EmptyResultSchema, + InitializeResultSchema, + CompleteResultSchema, + GetPromptResultSchema, + ListPromptsResultSchema, + ListResourcesResultSchema, + ListResourceTemplatesResultSchema, + ReadResourceResultSchema, + CallToolResultSchema, + ListToolsResultSchema, + GetTaskResultSchema, + ListTasksResultSchema, + CreateTaskResultSchema +]); +var McpError = class _McpError extends Error { + constructor(code, message, data) { + super(`MCP error ${code}: ${message}`); + this.code = code; + this.data = data; + this.name = "McpError"; + } + /** + * Factory method to create the appropriate error type based on the error code and data + */ + static fromError(code, message, data) { + if (code === ErrorCode.UrlElicitationRequired && data) { + const errorData = data; + if (errorData.elicitations) { + return new UrlElicitationRequiredError(errorData.elicitations, message); + } + } + return new _McpError(code, message, data); + } +}; +var UrlElicitationRequiredError = class extends McpError { + constructor(elicitations, message = `URL elicitation${elicitations.length > 1 ? "s" : ""} required`) { + super(ErrorCode.UrlElicitationRequired, message, { + elicitations + }); + } + get elicitations() { + return this.data?.elicitations ?? []; + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js +function isTerminal(status) { + return status === "completed" || status === "failed" || status === "cancelled"; +} + +// node_modules/zod-to-json-schema/dist/esm/Options.js +var ignoreOverride = /* @__PURE__ */ Symbol("Let zodToJsonSchema decide on which parser to use"); +var defaultOptions = { + name: void 0, + $refStrategy: "root", + basePath: ["#"], + effectStrategy: "input", + pipeStrategy: "all", + dateStrategy: "format:date-time", + mapStrategy: "entries", + removeAdditionalStrategy: "passthrough", + allowedAdditionalProperties: true, + rejectedAdditionalProperties: false, + definitionPath: "definitions", + target: "jsonSchema7", + strictUnions: false, + definitions: {}, + errorMessages: false, + markdownDescription: false, + patternStrategy: "escape", + applyRegexFlags: false, + emailStrategy: "format:email", + base64Strategy: "contentEncoding:base64", + nameStrategy: "ref", + openAiAnyTypeName: "OpenAiAnyType" +}; +var getDefaultOptions = (options) => typeof options === "string" ? { + ...defaultOptions, + name: options +} : { + ...defaultOptions, + ...options +}; + +// node_modules/zod-to-json-schema/dist/esm/Refs.js +var getRefs = (options) => { + const _options = getDefaultOptions(options); + const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath; + return { + ..._options, + flags: { hasReferencedOpenAiAnyType: false }, + currentPath, + propertyPath: void 0, + seen: new Map(Object.entries(_options.definitions).map(([name, def]) => [ + def._def, + { + def: def._def, + path: [..._options.basePath, _options.definitionPath, name], + // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now. + jsonSchema: void 0 + } + ])) + }; +}; + +// node_modules/zod-to-json-schema/dist/esm/errorMessages.js +function addErrorMessage(res, key, errorMessage, refs) { + if (!refs?.errorMessages) + return; + if (errorMessage) { + res.errorMessage = { + ...res.errorMessage, + [key]: errorMessage + }; + } +} +function setResponseValueAndErrors(res, key, value, errorMessage, refs) { + res[key] = value; + addErrorMessage(res, key, errorMessage, refs); +} + +// node_modules/zod-to-json-schema/dist/esm/getRelativePath.js +var getRelativePath = (pathA, pathB) => { + let i = 0; + for (; i < pathA.length && i < pathB.length; i++) { + if (pathA[i] !== pathB[i]) + break; + } + return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/"); +}; + +// node_modules/zod-to-json-schema/dist/esm/parsers/any.js +function parseAnyDef(refs) { + if (refs.target !== "openAi") { + return {}; + } + const anyDefinitionPath = [ + ...refs.basePath, + refs.definitionPath, + refs.openAiAnyTypeName + ]; + refs.flags.hasReferencedOpenAiAnyType = true; + return { + $ref: refs.$refStrategy === "relative" ? getRelativePath(anyDefinitionPath, refs.currentPath) : anyDefinitionPath.join("/") + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/array.js +function parseArrayDef(def, refs) { + const res = { + type: "array" + }; + if (def.type?._def && def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny) { + res.items = parseDef(def.type._def, { + ...refs, + currentPath: [...refs.currentPath, "items"] + }); + } + if (def.minLength) { + setResponseValueAndErrors(res, "minItems", def.minLength.value, def.minLength.message, refs); + } + if (def.maxLength) { + setResponseValueAndErrors(res, "maxItems", def.maxLength.value, def.maxLength.message, refs); + } + if (def.exactLength) { + setResponseValueAndErrors(res, "minItems", def.exactLength.value, def.exactLength.message, refs); + setResponseValueAndErrors(res, "maxItems", def.exactLength.value, def.exactLength.message, refs); + } + return res; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js +function parseBigintDef(def, refs) { + const res = { + type: "integer", + format: "int64" + }; + if (!def.checks) + return res; + for (const check2 of def.checks) { + switch (check2.kind) { + case "min": + if (refs.target === "jsonSchema7") { + if (check2.inclusive) { + setResponseValueAndErrors(res, "minimum", check2.value, check2.message, refs); + } else { + setResponseValueAndErrors(res, "exclusiveMinimum", check2.value, check2.message, refs); + } + } else { + if (!check2.inclusive) { + res.exclusiveMinimum = true; + } + setResponseValueAndErrors(res, "minimum", check2.value, check2.message, refs); + } + break; + case "max": + if (refs.target === "jsonSchema7") { + if (check2.inclusive) { + setResponseValueAndErrors(res, "maximum", check2.value, check2.message, refs); + } else { + setResponseValueAndErrors(res, "exclusiveMaximum", check2.value, check2.message, refs); + } + } else { + if (!check2.inclusive) { + res.exclusiveMaximum = true; + } + setResponseValueAndErrors(res, "maximum", check2.value, check2.message, refs); + } + break; + case "multipleOf": + setResponseValueAndErrors(res, "multipleOf", check2.value, check2.message, refs); + break; + } + } + return res; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js +function parseBooleanDef() { + return { + type: "boolean" + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/branded.js +function parseBrandedDef(_def, refs) { + return parseDef(_def.type._def, refs); +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/catch.js +var parseCatchDef = (def, refs) => { + return parseDef(def.innerType._def, refs); +}; + +// node_modules/zod-to-json-schema/dist/esm/parsers/date.js +function parseDateDef(def, refs, overrideDateStrategy) { + const strategy = overrideDateStrategy ?? refs.dateStrategy; + if (Array.isArray(strategy)) { + return { + anyOf: strategy.map((item, i) => parseDateDef(def, refs, item)) + }; + } + switch (strategy) { + case "string": + case "format:date-time": + return { + type: "string", + format: "date-time" + }; + case "format:date": + return { + type: "string", + format: "date" + }; + case "integer": + return integerDateParser(def, refs); + } +} +var integerDateParser = (def, refs) => { + const res = { + type: "integer", + format: "unix-time" + }; + if (refs.target === "openApi3") { + return res; + } + for (const check2 of def.checks) { + switch (check2.kind) { + case "min": + setResponseValueAndErrors( + res, + "minimum", + check2.value, + // This is in milliseconds + check2.message, + refs + ); + break; + case "max": + setResponseValueAndErrors( + res, + "maximum", + check2.value, + // This is in milliseconds + check2.message, + refs + ); + break; + } + } + return res; +}; + +// node_modules/zod-to-json-schema/dist/esm/parsers/default.js +function parseDefaultDef(_def, refs) { + return { + ...parseDef(_def.innerType._def, refs), + default: _def.defaultValue() + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/effects.js +function parseEffectsDef(_def, refs) { + return refs.effectStrategy === "input" ? parseDef(_def.schema._def, refs) : parseAnyDef(refs); +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/enum.js +function parseEnumDef(def) { + return { + type: "string", + enum: Array.from(def.values) + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js +var isJsonSchema7AllOfType = (type) => { + if ("type" in type && type.type === "string") + return false; + return "allOf" in type; +}; +function parseIntersectionDef(def, refs) { + const allOf = [ + parseDef(def.left._def, { + ...refs, + currentPath: [...refs.currentPath, "allOf", "0"] + }), + parseDef(def.right._def, { + ...refs, + currentPath: [...refs.currentPath, "allOf", "1"] + }) + ].filter((x) => !!x); + let unevaluatedProperties = refs.target === "jsonSchema2019-09" ? { unevaluatedProperties: false } : void 0; + const mergedAllOf = []; + allOf.forEach((schema) => { + if (isJsonSchema7AllOfType(schema)) { + mergedAllOf.push(...schema.allOf); + if (schema.unevaluatedProperties === void 0) { + unevaluatedProperties = void 0; + } + } else { + let nestedSchema = schema; + if ("additionalProperties" in schema && schema.additionalProperties === false) { + const { additionalProperties, ...rest } = schema; + nestedSchema = rest; + } else { + unevaluatedProperties = void 0; + } + mergedAllOf.push(nestedSchema); + } + }); + return mergedAllOf.length ? { + allOf: mergedAllOf, + ...unevaluatedProperties + } : void 0; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/literal.js +function parseLiteralDef(def, refs) { + const parsedType2 = typeof def.value; + if (parsedType2 !== "bigint" && parsedType2 !== "number" && parsedType2 !== "boolean" && parsedType2 !== "string") { + return { + type: Array.isArray(def.value) ? "array" : "object" + }; + } + if (refs.target === "openApi3") { + return { + type: parsedType2 === "bigint" ? "integer" : parsedType2, + enum: [def.value] + }; + } + return { + type: parsedType2 === "bigint" ? "integer" : parsedType2, + const: def.value + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/string.js +var emojiRegex2 = void 0; +var zodPatterns = { + /** + * `c` was changed to `[cC]` to replicate /i flag + */ + cuid: /^[cC][^\s-]{8,}$/, + cuid2: /^[0-9a-z]+$/, + ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/, + /** + * `a-z` was added to replicate /i flag + */ + email: /^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/, + /** + * Constructed a valid Unicode RegExp + * + * Lazily instantiate since this type of regex isn't supported + * in all envs (e.g. React Native). + * + * See: + * https://github.com/colinhacks/zod/issues/2433 + * Fix in Zod: + * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b + */ + emoji: () => { + if (emojiRegex2 === void 0) { + emojiRegex2 = RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$", "u"); + } + return emojiRegex2; + }, + /** + * Unused + */ + uuid: /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/, + /** + * Unused + */ + ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/, + ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/, + /** + * Unused + */ + ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, + ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/, + base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/, + base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/, + nanoid: /^[a-zA-Z0-9_-]{21}$/, + jwt: /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/ +}; +function parseStringDef(def, refs) { + const res = { + type: "string" + }; + if (def.checks) { + for (const check2 of def.checks) { + switch (check2.kind) { + case "min": + setResponseValueAndErrors(res, "minLength", typeof res.minLength === "number" ? Math.max(res.minLength, check2.value) : check2.value, check2.message, refs); + break; + case "max": + setResponseValueAndErrors(res, "maxLength", typeof res.maxLength === "number" ? Math.min(res.maxLength, check2.value) : check2.value, check2.message, refs); + break; + case "email": + switch (refs.emailStrategy) { + case "format:email": + addFormat(res, "email", check2.message, refs); + break; + case "format:idn-email": + addFormat(res, "idn-email", check2.message, refs); + break; + case "pattern:zod": + addPattern(res, zodPatterns.email, check2.message, refs); + break; + } + break; + case "url": + addFormat(res, "uri", check2.message, refs); + break; + case "uuid": + addFormat(res, "uuid", check2.message, refs); + break; + case "regex": + addPattern(res, check2.regex, check2.message, refs); + break; + case "cuid": + addPattern(res, zodPatterns.cuid, check2.message, refs); + break; + case "cuid2": + addPattern(res, zodPatterns.cuid2, check2.message, refs); + break; + case "startsWith": + addPattern(res, RegExp(`^${escapeLiteralCheckValue(check2.value, refs)}`), check2.message, refs); + break; + case "endsWith": + addPattern(res, RegExp(`${escapeLiteralCheckValue(check2.value, refs)}$`), check2.message, refs); + break; + case "datetime": + addFormat(res, "date-time", check2.message, refs); + break; + case "date": + addFormat(res, "date", check2.message, refs); + break; + case "time": + addFormat(res, "time", check2.message, refs); + break; + case "duration": + addFormat(res, "duration", check2.message, refs); + break; + case "length": + setResponseValueAndErrors(res, "minLength", typeof res.minLength === "number" ? Math.max(res.minLength, check2.value) : check2.value, check2.message, refs); + setResponseValueAndErrors(res, "maxLength", typeof res.maxLength === "number" ? Math.min(res.maxLength, check2.value) : check2.value, check2.message, refs); + break; + case "includes": { + addPattern(res, RegExp(escapeLiteralCheckValue(check2.value, refs)), check2.message, refs); + break; + } + case "ip": { + if (check2.version !== "v6") { + addFormat(res, "ipv4", check2.message, refs); + } + if (check2.version !== "v4") { + addFormat(res, "ipv6", check2.message, refs); + } + break; + } + case "base64url": + addPattern(res, zodPatterns.base64url, check2.message, refs); + break; + case "jwt": + addPattern(res, zodPatterns.jwt, check2.message, refs); + break; + case "cidr": { + if (check2.version !== "v6") { + addPattern(res, zodPatterns.ipv4Cidr, check2.message, refs); + } + if (check2.version !== "v4") { + addPattern(res, zodPatterns.ipv6Cidr, check2.message, refs); + } + break; + } + case "emoji": + addPattern(res, zodPatterns.emoji(), check2.message, refs); + break; + case "ulid": { + addPattern(res, zodPatterns.ulid, check2.message, refs); + break; + } + case "base64": { + switch (refs.base64Strategy) { + case "format:binary": { + addFormat(res, "binary", check2.message, refs); + break; + } + case "contentEncoding:base64": { + setResponseValueAndErrors(res, "contentEncoding", "base64", check2.message, refs); + break; + } + case "pattern:zod": { + addPattern(res, zodPatterns.base64, check2.message, refs); + break; + } + } + break; + } + case "nanoid": { + addPattern(res, zodPatterns.nanoid, check2.message, refs); + } + case "toLowerCase": + case "toUpperCase": + case "trim": + break; + default: + /* @__PURE__ */ ((_) => { + })(check2); + } + } + } + return res; +} +function escapeLiteralCheckValue(literal2, refs) { + return refs.patternStrategy === "escape" ? escapeNonAlphaNumeric(literal2) : literal2; +} +var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789"); +function escapeNonAlphaNumeric(source) { + let result = ""; + for (let i = 0; i < source.length; i++) { + if (!ALPHA_NUMERIC.has(source[i])) { + result += "\\"; + } + result += source[i]; + } + return result; +} +function addFormat(schema, value, message, refs) { + if (schema.format || schema.anyOf?.some((x) => x.format)) { + if (!schema.anyOf) { + schema.anyOf = []; + } + if (schema.format) { + schema.anyOf.push({ + format: schema.format, + ...schema.errorMessage && refs.errorMessages && { + errorMessage: { format: schema.errorMessage.format } + } + }); + delete schema.format; + if (schema.errorMessage) { + delete schema.errorMessage.format; + if (Object.keys(schema.errorMessage).length === 0) { + delete schema.errorMessage; + } + } + } + schema.anyOf.push({ + format: value, + ...message && refs.errorMessages && { errorMessage: { format: message } } + }); + } else { + setResponseValueAndErrors(schema, "format", value, message, refs); + } +} +function addPattern(schema, regex, message, refs) { + if (schema.pattern || schema.allOf?.some((x) => x.pattern)) { + if (!schema.allOf) { + schema.allOf = []; + } + if (schema.pattern) { + schema.allOf.push({ + pattern: schema.pattern, + ...schema.errorMessage && refs.errorMessages && { + errorMessage: { pattern: schema.errorMessage.pattern } + } + }); + delete schema.pattern; + if (schema.errorMessage) { + delete schema.errorMessage.pattern; + if (Object.keys(schema.errorMessage).length === 0) { + delete schema.errorMessage; + } + } + } + schema.allOf.push({ + pattern: stringifyRegExpWithFlags(regex, refs), + ...message && refs.errorMessages && { errorMessage: { pattern: message } } + }); + } else { + setResponseValueAndErrors(schema, "pattern", stringifyRegExpWithFlags(regex, refs), message, refs); + } +} +function stringifyRegExpWithFlags(regex, refs) { + if (!refs.applyRegexFlags || !regex.flags) { + return regex.source; + } + const flags = { + i: regex.flags.includes("i"), + m: regex.flags.includes("m"), + s: regex.flags.includes("s") + // `.` matches newlines + }; + const source = flags.i ? regex.source.toLowerCase() : regex.source; + let pattern = ""; + let isEscaped = false; + let inCharGroup = false; + let inCharRange = false; + for (let i = 0; i < source.length; i++) { + if (isEscaped) { + pattern += source[i]; + isEscaped = false; + continue; + } + if (flags.i) { + if (inCharGroup) { + if (source[i].match(/[a-z]/)) { + if (inCharRange) { + pattern += source[i]; + pattern += `${source[i - 2]}-${source[i]}`.toUpperCase(); + inCharRange = false; + } else if (source[i + 1] === "-" && source[i + 2]?.match(/[a-z]/)) { + pattern += source[i]; + inCharRange = true; + } else { + pattern += `${source[i]}${source[i].toUpperCase()}`; + } + continue; + } + } else if (source[i].match(/[a-z]/)) { + pattern += `[${source[i]}${source[i].toUpperCase()}]`; + continue; + } + } + if (flags.m) { + if (source[i] === "^") { + pattern += `(^|(?<=[\r +]))`; + continue; + } else if (source[i] === "$") { + pattern += `($|(?=[\r +]))`; + continue; + } + } + if (flags.s && source[i] === ".") { + pattern += inCharGroup ? `${source[i]}\r +` : `[${source[i]}\r +]`; + continue; + } + pattern += source[i]; + if (source[i] === "\\") { + isEscaped = true; + } else if (inCharGroup && source[i] === "]") { + inCharGroup = false; + } else if (!inCharGroup && source[i] === "[") { + inCharGroup = true; + } + } + try { + new RegExp(pattern); + } catch { + console.warn(`Could not convert regex pattern at ${refs.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`); + return regex.source; + } + return pattern; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/record.js +function parseRecordDef(def, refs) { + if (refs.target === "openAi") { + console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."); + } + if (refs.target === "openApi3" && def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) { + return { + type: "object", + required: def.keyType._def.values, + properties: def.keyType._def.values.reduce((acc, key) => ({ + ...acc, + [key]: parseDef(def.valueType._def, { + ...refs, + currentPath: [...refs.currentPath, "properties", key] + }) ?? parseAnyDef(refs) + }), {}), + additionalProperties: refs.rejectedAdditionalProperties + }; + } + const schema = { + type: "object", + additionalProperties: parseDef(def.valueType._def, { + ...refs, + currentPath: [...refs.currentPath, "additionalProperties"] + }) ?? refs.allowedAdditionalProperties + }; + if (refs.target === "openApi3") { + return schema; + } + if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodString && def.keyType._def.checks?.length) { + const { type, ...keyType } = parseStringDef(def.keyType._def, refs); + return { + ...schema, + propertyNames: keyType + }; + } else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) { + return { + ...schema, + propertyNames: { + enum: def.keyType._def.values + } + }; + } else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodBranded && def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind.ZodString && def.keyType._def.type._def.checks?.length) { + const { type, ...keyType } = parseBrandedDef(def.keyType._def, refs); + return { + ...schema, + propertyNames: keyType + }; + } + return schema; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/map.js +function parseMapDef(def, refs) { + if (refs.mapStrategy === "record") { + return parseRecordDef(def, refs); + } + const keys = parseDef(def.keyType._def, { + ...refs, + currentPath: [...refs.currentPath, "items", "items", "0"] + }) || parseAnyDef(refs); + const values = parseDef(def.valueType._def, { + ...refs, + currentPath: [...refs.currentPath, "items", "items", "1"] + }) || parseAnyDef(refs); + return { + type: "array", + maxItems: 125, + items: { + type: "array", + items: [keys, values], + minItems: 2, + maxItems: 2 + } + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js +function parseNativeEnumDef(def) { + const object3 = def.values; + const actualKeys = Object.keys(def.values).filter((key) => { + return typeof object3[object3[key]] !== "number"; + }); + const actualValues = actualKeys.map((key) => object3[key]); + const parsedTypes = Array.from(new Set(actualValues.map((values) => typeof values))); + return { + type: parsedTypes.length === 1 ? parsedTypes[0] === "string" ? "string" : "number" : ["string", "number"], + enum: actualValues + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/never.js +function parseNeverDef(refs) { + return refs.target === "openAi" ? void 0 : { + not: parseAnyDef({ + ...refs, + currentPath: [...refs.currentPath, "not"] + }) + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/null.js +function parseNullDef(refs) { + return refs.target === "openApi3" ? { + enum: ["null"], + nullable: true + } : { + type: "null" + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/union.js +var primitiveMappings = { + ZodString: "string", + ZodNumber: "number", + ZodBigInt: "integer", + ZodBoolean: "boolean", + ZodNull: "null" +}; +function parseUnionDef(def, refs) { + if (refs.target === "openApi3") + return asAnyOf(def, refs); + const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options; + if (options.every((x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length))) { + const types = options.reduce((types2, x) => { + const type = primitiveMappings[x._def.typeName]; + return type && !types2.includes(type) ? [...types2, type] : types2; + }, []); + return { + type: types.length > 1 ? types : types[0] + }; + } else if (options.every((x) => x._def.typeName === "ZodLiteral" && !x.description)) { + const types = options.reduce((acc, x) => { + const type = typeof x._def.value; + switch (type) { + case "string": + case "number": + case "boolean": + return [...acc, type]; + case "bigint": + return [...acc, "integer"]; + case "object": + if (x._def.value === null) + return [...acc, "null"]; + case "symbol": + case "undefined": + case "function": + default: + return acc; + } + }, []); + if (types.length === options.length) { + const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i); + return { + type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0], + enum: options.reduce((acc, x) => { + return acc.includes(x._def.value) ? acc : [...acc, x._def.value]; + }, []) + }; + } + } else if (options.every((x) => x._def.typeName === "ZodEnum")) { + return { + type: "string", + enum: options.reduce((acc, x) => [ + ...acc, + ...x._def.values.filter((x2) => !acc.includes(x2)) + ], []) + }; + } + return asAnyOf(def, refs); +} +var asAnyOf = (def, refs) => { + const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map((x, i) => parseDef(x._def, { + ...refs, + currentPath: [...refs.currentPath, "anyOf", `${i}`] + })).filter((x) => !!x && (!refs.strictUnions || typeof x === "object" && Object.keys(x).length > 0)); + return anyOf.length ? { anyOf } : void 0; +}; + +// node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js +function parseNullableDef(def, refs) { + if (["ZodString", "ZodNumber", "ZodBigInt", "ZodBoolean", "ZodNull"].includes(def.innerType._def.typeName) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) { + if (refs.target === "openApi3") { + return { + type: primitiveMappings[def.innerType._def.typeName], + nullable: true + }; + } + return { + type: [ + primitiveMappings[def.innerType._def.typeName], + "null" + ] + }; + } + if (refs.target === "openApi3") { + const base2 = parseDef(def.innerType._def, { + ...refs, + currentPath: [...refs.currentPath] + }); + if (base2 && "$ref" in base2) + return { allOf: [base2], nullable: true }; + return base2 && { ...base2, nullable: true }; + } + const base = parseDef(def.innerType._def, { + ...refs, + currentPath: [...refs.currentPath, "anyOf", "0"] + }); + return base && { anyOf: [base, { type: "null" }] }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/number.js +function parseNumberDef(def, refs) { + const res = { + type: "number" + }; + if (!def.checks) + return res; + for (const check2 of def.checks) { + switch (check2.kind) { + case "int": + res.type = "integer"; + addErrorMessage(res, "type", check2.message, refs); + break; + case "min": + if (refs.target === "jsonSchema7") { + if (check2.inclusive) { + setResponseValueAndErrors(res, "minimum", check2.value, check2.message, refs); + } else { + setResponseValueAndErrors(res, "exclusiveMinimum", check2.value, check2.message, refs); + } + } else { + if (!check2.inclusive) { + res.exclusiveMinimum = true; + } + setResponseValueAndErrors(res, "minimum", check2.value, check2.message, refs); + } + break; + case "max": + if (refs.target === "jsonSchema7") { + if (check2.inclusive) { + setResponseValueAndErrors(res, "maximum", check2.value, check2.message, refs); + } else { + setResponseValueAndErrors(res, "exclusiveMaximum", check2.value, check2.message, refs); + } + } else { + if (!check2.inclusive) { + res.exclusiveMaximum = true; + } + setResponseValueAndErrors(res, "maximum", check2.value, check2.message, refs); + } + break; + case "multipleOf": + setResponseValueAndErrors(res, "multipleOf", check2.value, check2.message, refs); + break; + } + } + return res; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/object.js +function parseObjectDef(def, refs) { + const forceOptionalIntoNullable = refs.target === "openAi"; + const result = { + type: "object", + properties: {} + }; + const required2 = []; + const shape = def.shape(); + for (const propName in shape) { + let propDef = shape[propName]; + if (propDef === void 0 || propDef._def === void 0) { + continue; + } + let propOptional = safeIsOptional(propDef); + if (propOptional && forceOptionalIntoNullable) { + if (propDef._def.typeName === "ZodOptional") { + propDef = propDef._def.innerType; + } + if (!propDef.isNullable()) { + propDef = propDef.nullable(); + } + propOptional = false; + } + const parsedDef = parseDef(propDef._def, { + ...refs, + currentPath: [...refs.currentPath, "properties", propName], + propertyPath: [...refs.currentPath, "properties", propName] + }); + if (parsedDef === void 0) { + continue; + } + result.properties[propName] = parsedDef; + if (!propOptional) { + required2.push(propName); + } + } + if (required2.length) { + result.required = required2; + } + const additionalProperties = decideAdditionalProperties(def, refs); + if (additionalProperties !== void 0) { + result.additionalProperties = additionalProperties; + } + return result; +} +function decideAdditionalProperties(def, refs) { + if (def.catchall._def.typeName !== "ZodNever") { + return parseDef(def.catchall._def, { + ...refs, + currentPath: [...refs.currentPath, "additionalProperties"] + }); + } + switch (def.unknownKeys) { + case "passthrough": + return refs.allowedAdditionalProperties; + case "strict": + return refs.rejectedAdditionalProperties; + case "strip": + return refs.removeAdditionalStrategy === "strict" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties; + } +} +function safeIsOptional(schema) { + try { + return schema.isOptional(); + } catch { + return true; + } +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/optional.js +var parseOptionalDef = (def, refs) => { + if (refs.currentPath.toString() === refs.propertyPath?.toString()) { + return parseDef(def.innerType._def, refs); + } + const innerSchema = parseDef(def.innerType._def, { + ...refs, + currentPath: [...refs.currentPath, "anyOf", "1"] + }); + return innerSchema ? { + anyOf: [ + { + not: parseAnyDef(refs) + }, + innerSchema + ] + } : parseAnyDef(refs); +}; + +// node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js +var parsePipelineDef = (def, refs) => { + if (refs.pipeStrategy === "input") { + return parseDef(def.in._def, refs); + } else if (refs.pipeStrategy === "output") { + return parseDef(def.out._def, refs); + } + const a = parseDef(def.in._def, { + ...refs, + currentPath: [...refs.currentPath, "allOf", "0"] + }); + const b = parseDef(def.out._def, { + ...refs, + currentPath: [...refs.currentPath, "allOf", a ? "1" : "0"] + }); + return { + allOf: [a, b].filter((x) => x !== void 0) + }; +}; + +// node_modules/zod-to-json-schema/dist/esm/parsers/promise.js +function parsePromiseDef(def, refs) { + return parseDef(def.type._def, refs); +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/set.js +function parseSetDef(def, refs) { + const items = parseDef(def.valueType._def, { + ...refs, + currentPath: [...refs.currentPath, "items"] + }); + const schema = { + type: "array", + uniqueItems: true, + items + }; + if (def.minSize) { + setResponseValueAndErrors(schema, "minItems", def.minSize.value, def.minSize.message, refs); + } + if (def.maxSize) { + setResponseValueAndErrors(schema, "maxItems", def.maxSize.value, def.maxSize.message, refs); + } + return schema; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js +function parseTupleDef(def, refs) { + if (def.rest) { + return { + type: "array", + minItems: def.items.length, + items: def.items.map((x, i) => parseDef(x._def, { + ...refs, + currentPath: [...refs.currentPath, "items", `${i}`] + })).reduce((acc, x) => x === void 0 ? acc : [...acc, x], []), + additionalItems: parseDef(def.rest._def, { + ...refs, + currentPath: [...refs.currentPath, "additionalItems"] + }) + }; + } else { + return { + type: "array", + minItems: def.items.length, + maxItems: def.items.length, + items: def.items.map((x, i) => parseDef(x._def, { + ...refs, + currentPath: [...refs.currentPath, "items", `${i}`] + })).reduce((acc, x) => x === void 0 ? acc : [...acc, x], []) + }; + } +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js +function parseUndefinedDef(refs) { + return { + not: parseAnyDef(refs) + }; +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js +function parseUnknownDef(refs) { + return parseAnyDef(refs); +} + +// node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js +var parseReadonlyDef = (def, refs) => { + return parseDef(def.innerType._def, refs); +}; + +// node_modules/zod-to-json-schema/dist/esm/selectParser.js +var selectParser = (def, typeName, refs) => { + switch (typeName) { + case ZodFirstPartyTypeKind.ZodString: + return parseStringDef(def, refs); + case ZodFirstPartyTypeKind.ZodNumber: + return parseNumberDef(def, refs); + case ZodFirstPartyTypeKind.ZodObject: + return parseObjectDef(def, refs); + case ZodFirstPartyTypeKind.ZodBigInt: + return parseBigintDef(def, refs); + case ZodFirstPartyTypeKind.ZodBoolean: + return parseBooleanDef(); + case ZodFirstPartyTypeKind.ZodDate: + return parseDateDef(def, refs); + case ZodFirstPartyTypeKind.ZodUndefined: + return parseUndefinedDef(refs); + case ZodFirstPartyTypeKind.ZodNull: + return parseNullDef(refs); + case ZodFirstPartyTypeKind.ZodArray: + return parseArrayDef(def, refs); + case ZodFirstPartyTypeKind.ZodUnion: + case ZodFirstPartyTypeKind.ZodDiscriminatedUnion: + return parseUnionDef(def, refs); + case ZodFirstPartyTypeKind.ZodIntersection: + return parseIntersectionDef(def, refs); + case ZodFirstPartyTypeKind.ZodTuple: + return parseTupleDef(def, refs); + case ZodFirstPartyTypeKind.ZodRecord: + return parseRecordDef(def, refs); + case ZodFirstPartyTypeKind.ZodLiteral: + return parseLiteralDef(def, refs); + case ZodFirstPartyTypeKind.ZodEnum: + return parseEnumDef(def); + case ZodFirstPartyTypeKind.ZodNativeEnum: + return parseNativeEnumDef(def); + case ZodFirstPartyTypeKind.ZodNullable: + return parseNullableDef(def, refs); + case ZodFirstPartyTypeKind.ZodOptional: + return parseOptionalDef(def, refs); + case ZodFirstPartyTypeKind.ZodMap: + return parseMapDef(def, refs); + case ZodFirstPartyTypeKind.ZodSet: + return parseSetDef(def, refs); + case ZodFirstPartyTypeKind.ZodLazy: + return () => def.getter()._def; + case ZodFirstPartyTypeKind.ZodPromise: + return parsePromiseDef(def, refs); + case ZodFirstPartyTypeKind.ZodNaN: + case ZodFirstPartyTypeKind.ZodNever: + return parseNeverDef(refs); + case ZodFirstPartyTypeKind.ZodEffects: + return parseEffectsDef(def, refs); + case ZodFirstPartyTypeKind.ZodAny: + return parseAnyDef(refs); + case ZodFirstPartyTypeKind.ZodUnknown: + return parseUnknownDef(refs); + case ZodFirstPartyTypeKind.ZodDefault: + return parseDefaultDef(def, refs); + case ZodFirstPartyTypeKind.ZodBranded: + return parseBrandedDef(def, refs); + case ZodFirstPartyTypeKind.ZodReadonly: + return parseReadonlyDef(def, refs); + case ZodFirstPartyTypeKind.ZodCatch: + return parseCatchDef(def, refs); + case ZodFirstPartyTypeKind.ZodPipeline: + return parsePipelineDef(def, refs); + case ZodFirstPartyTypeKind.ZodFunction: + case ZodFirstPartyTypeKind.ZodVoid: + case ZodFirstPartyTypeKind.ZodSymbol: + return void 0; + default: + return /* @__PURE__ */ ((_) => void 0)(typeName); + } +}; + +// node_modules/zod-to-json-schema/dist/esm/parseDef.js +function parseDef(def, refs, forceResolution = false) { + const seenItem = refs.seen.get(def); + if (refs.override) { + const overrideResult = refs.override?.(def, refs, seenItem, forceResolution); + if (overrideResult !== ignoreOverride) { + return overrideResult; + } + } + if (seenItem && !forceResolution) { + const seenSchema = get$ref(seenItem, refs); + if (seenSchema !== void 0) { + return seenSchema; + } + } + const newItem = { def, path: refs.currentPath, jsonSchema: void 0 }; + refs.seen.set(def, newItem); + const jsonSchemaOrGetter = selectParser(def, def.typeName, refs); + const jsonSchema = typeof jsonSchemaOrGetter === "function" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter; + if (jsonSchema) { + addMeta(def, refs, jsonSchema); + } + if (refs.postProcess) { + const postProcessResult = refs.postProcess(jsonSchema, def, refs); + newItem.jsonSchema = jsonSchema; + return postProcessResult; + } + newItem.jsonSchema = jsonSchema; + return jsonSchema; +} +var get$ref = (item, refs) => { + switch (refs.$refStrategy) { + case "root": + return { $ref: item.path.join("/") }; + case "relative": + return { $ref: getRelativePath(refs.currentPath, item.path) }; + case "none": + case "seen": { + if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) { + console.warn(`Recursive reference detected at ${refs.currentPath.join("/")}! Defaulting to any`); + return parseAnyDef(refs); + } + return refs.$refStrategy === "seen" ? parseAnyDef(refs) : void 0; + } + } +}; +var addMeta = (def, refs, jsonSchema) => { + if (def.description) { + jsonSchema.description = def.description; + if (refs.markdownDescription) { + jsonSchema.markdownDescription = def.description; + } + } + return jsonSchema; +}; + +// node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js +var zodToJsonSchema = (schema, options) => { + const refs = getRefs(options); + let definitions = typeof options === "object" && options.definitions ? Object.entries(options.definitions).reduce((acc, [name2, schema2]) => ({ + ...acc, + [name2]: parseDef(schema2._def, { + ...refs, + currentPath: [...refs.basePath, refs.definitionPath, name2] + }, true) ?? parseAnyDef(refs) + }), {}) : void 0; + const name = typeof options === "string" ? options : options?.nameStrategy === "title" ? void 0 : options?.name; + const main = parseDef(schema._def, name === void 0 ? refs : { + ...refs, + currentPath: [...refs.basePath, refs.definitionPath, name] + }, false) ?? parseAnyDef(refs); + const title = typeof options === "object" && options.name !== void 0 && options.nameStrategy === "title" ? options.name : void 0; + if (title !== void 0) { + main.title = title; + } + if (refs.flags.hasReferencedOpenAiAnyType) { + if (!definitions) { + definitions = {}; + } + if (!definitions[refs.openAiAnyTypeName]) { + definitions[refs.openAiAnyTypeName] = { + // Skipping "object" as no properties can be defined and additionalProperties must be "false" + type: ["string", "number", "integer", "boolean", "array", "null"], + items: { + $ref: refs.$refStrategy === "relative" ? "1" : [ + ...refs.basePath, + refs.definitionPath, + refs.openAiAnyTypeName + ].join("/") + } + }; + } + } + const combined = name === void 0 ? definitions ? { + ...main, + [refs.definitionPath]: definitions + } : main : { + $ref: [ + ...refs.$refStrategy === "relative" ? [] : refs.basePath, + refs.definitionPath, + name + ].join("/"), + [refs.definitionPath]: { + ...definitions, + [name]: main + } + }; + if (refs.target === "jsonSchema7") { + combined.$schema = "http://json-schema.org/draft-07/schema#"; + } else if (refs.target === "jsonSchema2019-09" || refs.target === "openAi") { + combined.$schema = "https://json-schema.org/draft/2019-09/schema#"; + } + if (refs.target === "openAi" && ("anyOf" in combined || "oneOf" in combined || "allOf" in combined || "type" in combined && Array.isArray(combined.type))) { + console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."); + } + return combined; +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js +function mapMiniTarget(t) { + if (!t) + return "draft-7"; + if (t === "jsonSchema7" || t === "draft-7") + return "draft-7"; + if (t === "jsonSchema2019-09" || t === "draft-2020-12") + return "draft-2020-12"; + return "draft-7"; +} +function toJsonSchemaCompat(schema, opts) { + if (isZ4Schema(schema)) { + return toJSONSchema(schema, { + target: mapMiniTarget(opts?.target), + io: opts?.pipeStrategy ?? "input" + }); + } + return zodToJsonSchema(schema, { + strictUnions: opts?.strictUnions ?? true, + pipeStrategy: opts?.pipeStrategy ?? "input" + }); +} +function getMethodLiteral(schema) { + const shape = getObjectShape(schema); + const methodSchema = shape?.method; + if (!methodSchema) { + throw new Error("Schema is missing a method literal"); + } + const value = getLiteralValue(methodSchema); + if (typeof value !== "string") { + throw new Error("Schema method literal must be a string"); + } + return value; +} +function parseWithCompat(schema, data) { + const result = safeParse2(schema, data); + if (!result.success) { + throw result.error; + } + return result.data; +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js +var DEFAULT_REQUEST_TIMEOUT_MSEC = 6e4; +var Protocol = class { + constructor(_options) { + this._options = _options; + this._requestMessageId = 0; + this._requestHandlers = /* @__PURE__ */ new Map(); + this._requestHandlerAbortControllers = /* @__PURE__ */ new Map(); + this._notificationHandlers = /* @__PURE__ */ new Map(); + this._responseHandlers = /* @__PURE__ */ new Map(); + this._progressHandlers = /* @__PURE__ */ new Map(); + this._timeoutInfo = /* @__PURE__ */ new Map(); + this._pendingDebouncedNotifications = /* @__PURE__ */ new Set(); + this._taskProgressTokens = /* @__PURE__ */ new Map(); + this._requestResolvers = /* @__PURE__ */ new Map(); + this.setNotificationHandler(CancelledNotificationSchema, (notification) => { + this._oncancel(notification); + }); + this.setNotificationHandler(ProgressNotificationSchema, (notification) => { + this._onprogress(notification); + }); + this.setRequestHandler( + PingRequestSchema, + // Automatic pong by default. + (_request) => ({}) + ); + this._taskStore = _options?.taskStore; + this._taskMessageQueue = _options?.taskMessageQueue; + if (this._taskStore) { + this.setRequestHandler(GetTaskRequestSchema, async (request, extra) => { + const task = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, "Failed to retrieve task: Task not found"); + } + return { + ...task + }; + }); + this.setRequestHandler(GetTaskPayloadRequestSchema, async (request, extra) => { + const handleTaskResult = async () => { + const taskId = request.params.taskId; + if (this._taskMessageQueue) { + let queuedMessage; + while (queuedMessage = await this._taskMessageQueue.dequeue(taskId, extra.sessionId)) { + if (queuedMessage.type === "response" || queuedMessage.type === "error") { + const message = queuedMessage.message; + const requestId = message.id; + const resolver = this._requestResolvers.get(requestId); + if (resolver) { + this._requestResolvers.delete(requestId); + if (queuedMessage.type === "response") { + resolver(message); + } else { + const errorMessage = message; + const error48 = new McpError(errorMessage.error.code, errorMessage.error.message, errorMessage.error.data); + resolver(error48); + } + } else { + const messageType = queuedMessage.type === "response" ? "Response" : "Error"; + this._onerror(new Error(`${messageType} handler missing for request ${requestId}`)); + } + continue; + } + await this._transport?.send(queuedMessage.message, { relatedRequestId: extra.requestId }); + } + } + const task = await this._taskStore.getTask(taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`); + } + if (!isTerminal(task.status)) { + await this._waitForTaskUpdate(taskId, extra.signal); + return await handleTaskResult(); + } + if (isTerminal(task.status)) { + const result = await this._taskStore.getTaskResult(taskId, extra.sessionId); + this._clearTaskQueue(taskId); + return { + ...result, + _meta: { + ...result._meta, + [RELATED_TASK_META_KEY]: { + taskId + } + } + }; + } + return await handleTaskResult(); + }; + return await handleTaskResult(); + }); + this.setRequestHandler(ListTasksRequestSchema, async (request, extra) => { + try { + const { tasks, nextCursor } = await this._taskStore.listTasks(request.params?.cursor, extra.sessionId); + return { + tasks, + nextCursor, + _meta: {} + }; + } catch (error48) { + throw new McpError(ErrorCode.InvalidParams, `Failed to list tasks: ${error48 instanceof Error ? error48.message : String(error48)}`); + } + }); + this.setRequestHandler(CancelTaskRequestSchema, async (request, extra) => { + try { + const task = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task not found: ${request.params.taskId}`); + } + if (isTerminal(task.status)) { + throw new McpError(ErrorCode.InvalidParams, `Cannot cancel task in terminal status: ${task.status}`); + } + await this._taskStore.updateTaskStatus(request.params.taskId, "cancelled", "Client cancelled task execution.", extra.sessionId); + this._clearTaskQueue(request.params.taskId); + const cancelledTask = await this._taskStore.getTask(request.params.taskId, extra.sessionId); + if (!cancelledTask) { + throw new McpError(ErrorCode.InvalidParams, `Task not found after cancellation: ${request.params.taskId}`); + } + return { + _meta: {}, + ...cancelledTask + }; + } catch (error48) { + if (error48 instanceof McpError) { + throw error48; + } + throw new McpError(ErrorCode.InvalidRequest, `Failed to cancel task: ${error48 instanceof Error ? error48.message : String(error48)}`); + } + }); + } + } + async _oncancel(notification) { + if (!notification.params.requestId) { + return; + } + const controller = this._requestHandlerAbortControllers.get(notification.params.requestId); + controller?.abort(notification.params.reason); + } + _setupTimeout(messageId, timeout, maxTotalTimeout, onTimeout, resetTimeoutOnProgress = false) { + this._timeoutInfo.set(messageId, { + timeoutId: setTimeout(onTimeout, timeout), + startTime: Date.now(), + timeout, + maxTotalTimeout, + resetTimeoutOnProgress, + onTimeout + }); + } + _resetTimeout(messageId) { + const info = this._timeoutInfo.get(messageId); + if (!info) + return false; + const totalElapsed = Date.now() - info.startTime; + if (info.maxTotalTimeout && totalElapsed >= info.maxTotalTimeout) { + this._timeoutInfo.delete(messageId); + throw McpError.fromError(ErrorCode.RequestTimeout, "Maximum total timeout exceeded", { + maxTotalTimeout: info.maxTotalTimeout, + totalElapsed + }); + } + clearTimeout(info.timeoutId); + info.timeoutId = setTimeout(info.onTimeout, info.timeout); + return true; + } + _cleanupTimeout(messageId) { + const info = this._timeoutInfo.get(messageId); + if (info) { + clearTimeout(info.timeoutId); + this._timeoutInfo.delete(messageId); + } + } + /** + * Attaches to the given transport, starts it, and starts listening for messages. + * + * The Protocol object assumes ownership of the Transport, replacing any callbacks that have already been set, and expects that it is the only user of the Transport instance going forward. + */ + async connect(transport) { + if (this._transport) { + throw new Error("Already connected to a transport. Call close() before connecting to a new transport, or use a separate Protocol instance per connection."); + } + this._transport = transport; + const _onclose = this.transport?.onclose; + this._transport.onclose = () => { + _onclose?.(); + this._onclose(); + }; + const _onerror = this.transport?.onerror; + this._transport.onerror = (error48) => { + _onerror?.(error48); + this._onerror(error48); + }; + const _onmessage = this._transport?.onmessage; + this._transport.onmessage = (message, extra) => { + _onmessage?.(message, extra); + if (isJSONRPCResultResponse(message) || isJSONRPCErrorResponse(message)) { + this._onresponse(message); + } else if (isJSONRPCRequest(message)) { + this._onrequest(message, extra); + } else if (isJSONRPCNotification(message)) { + this._onnotification(message); + } else { + this._onerror(new Error(`Unknown message type: ${JSON.stringify(message)}`)); + } + }; + await this._transport.start(); + } + _onclose() { + const responseHandlers = this._responseHandlers; + this._responseHandlers = /* @__PURE__ */ new Map(); + this._progressHandlers.clear(); + this._taskProgressTokens.clear(); + this._pendingDebouncedNotifications.clear(); + for (const info of this._timeoutInfo.values()) { + clearTimeout(info.timeoutId); + } + this._timeoutInfo.clear(); + for (const controller of this._requestHandlerAbortControllers.values()) { + controller.abort(); + } + this._requestHandlerAbortControllers.clear(); + const error48 = McpError.fromError(ErrorCode.ConnectionClosed, "Connection closed"); + this._transport = void 0; + this.onclose?.(); + for (const handler of responseHandlers.values()) { + handler(error48); + } + } + _onerror(error48) { + this.onerror?.(error48); + } + _onnotification(notification) { + const handler = this._notificationHandlers.get(notification.method) ?? this.fallbackNotificationHandler; + if (handler === void 0) { + return; + } + Promise.resolve().then(() => handler(notification)).catch((error48) => this._onerror(new Error(`Uncaught error in notification handler: ${error48}`))); + } + _onrequest(request, extra) { + const handler = this._requestHandlers.get(request.method) ?? this.fallbackRequestHandler; + const capturedTransport = this._transport; + const relatedTaskId = request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId; + if (handler === void 0) { + const errorResponse = { + jsonrpc: "2.0", + id: request.id, + error: { + code: ErrorCode.MethodNotFound, + message: "Method not found" + } + }; + if (relatedTaskId && this._taskMessageQueue) { + this._enqueueTaskMessage(relatedTaskId, { + type: "error", + message: errorResponse, + timestamp: Date.now() + }, capturedTransport?.sessionId).catch((error48) => this._onerror(new Error(`Failed to enqueue error response: ${error48}`))); + } else { + capturedTransport?.send(errorResponse).catch((error48) => this._onerror(new Error(`Failed to send an error response: ${error48}`))); + } + return; + } + const abortController = new AbortController(); + this._requestHandlerAbortControllers.set(request.id, abortController); + const taskCreationParams = isTaskAugmentedRequestParams(request.params) ? request.params.task : void 0; + const taskStore = this._taskStore ? this.requestTaskStore(request, capturedTransport?.sessionId) : void 0; + const fullExtra = { + signal: abortController.signal, + sessionId: capturedTransport?.sessionId, + _meta: request.params?._meta, + sendNotification: async (notification) => { + if (abortController.signal.aborted) + return; + const notificationOptions = { relatedRequestId: request.id }; + if (relatedTaskId) { + notificationOptions.relatedTask = { taskId: relatedTaskId }; + } + await this.notification(notification, notificationOptions); + }, + sendRequest: async (r, resultSchema, options) => { + if (abortController.signal.aborted) { + throw new McpError(ErrorCode.ConnectionClosed, "Request was cancelled"); + } + const requestOptions = { ...options, relatedRequestId: request.id }; + if (relatedTaskId && !requestOptions.relatedTask) { + requestOptions.relatedTask = { taskId: relatedTaskId }; + } + const effectiveTaskId = requestOptions.relatedTask?.taskId ?? relatedTaskId; + if (effectiveTaskId && taskStore) { + await taskStore.updateTaskStatus(effectiveTaskId, "input_required"); + } + return await this.request(r, resultSchema, requestOptions); + }, + authInfo: extra?.authInfo, + requestId: request.id, + requestInfo: extra?.requestInfo, + taskId: relatedTaskId, + taskStore, + taskRequestedTtl: taskCreationParams?.ttl, + closeSSEStream: extra?.closeSSEStream, + closeStandaloneSSEStream: extra?.closeStandaloneSSEStream + }; + Promise.resolve().then(() => { + if (taskCreationParams) { + this.assertTaskHandlerCapability(request.method); + } + }).then(() => handler(request, fullExtra)).then(async (result) => { + if (abortController.signal.aborted) { + return; + } + const response = { + result, + jsonrpc: "2.0", + id: request.id + }; + if (relatedTaskId && this._taskMessageQueue) { + await this._enqueueTaskMessage(relatedTaskId, { + type: "response", + message: response, + timestamp: Date.now() + }, capturedTransport?.sessionId); + } else { + await capturedTransport?.send(response); + } + }, async (error48) => { + if (abortController.signal.aborted) { + return; + } + const errorResponse = { + jsonrpc: "2.0", + id: request.id, + error: { + code: Number.isSafeInteger(error48["code"]) ? error48["code"] : ErrorCode.InternalError, + message: error48.message ?? "Internal error", + ...error48["data"] !== void 0 && { data: error48["data"] } + } + }; + if (relatedTaskId && this._taskMessageQueue) { + await this._enqueueTaskMessage(relatedTaskId, { + type: "error", + message: errorResponse, + timestamp: Date.now() + }, capturedTransport?.sessionId); + } else { + await capturedTransport?.send(errorResponse); + } + }).catch((error48) => this._onerror(new Error(`Failed to send response: ${error48}`))).finally(() => { + if (this._requestHandlerAbortControllers.get(request.id) === abortController) { + this._requestHandlerAbortControllers.delete(request.id); + } + }); + } + _onprogress(notification) { + const { progressToken, ...params } = notification.params; + const messageId = Number(progressToken); + const handler = this._progressHandlers.get(messageId); + if (!handler) { + this._onerror(new Error(`Received a progress notification for an unknown token: ${JSON.stringify(notification)}`)); + return; + } + const responseHandler = this._responseHandlers.get(messageId); + const timeoutInfo = this._timeoutInfo.get(messageId); + if (timeoutInfo && responseHandler && timeoutInfo.resetTimeoutOnProgress) { + try { + this._resetTimeout(messageId); + } catch (error48) { + this._responseHandlers.delete(messageId); + this._progressHandlers.delete(messageId); + this._cleanupTimeout(messageId); + responseHandler(error48); + return; + } + } + handler(params); + } + _onresponse(response) { + const messageId = Number(response.id); + const resolver = this._requestResolvers.get(messageId); + if (resolver) { + this._requestResolvers.delete(messageId); + if (isJSONRPCResultResponse(response)) { + resolver(response); + } else { + const error48 = new McpError(response.error.code, response.error.message, response.error.data); + resolver(error48); + } + return; + } + const handler = this._responseHandlers.get(messageId); + if (handler === void 0) { + this._onerror(new Error(`Received a response for an unknown message ID: ${JSON.stringify(response)}`)); + return; + } + this._responseHandlers.delete(messageId); + this._cleanupTimeout(messageId); + let isTaskResponse = false; + if (isJSONRPCResultResponse(response) && response.result && typeof response.result === "object") { + const result = response.result; + if (result.task && typeof result.task === "object") { + const task = result.task; + if (typeof task.taskId === "string") { + isTaskResponse = true; + this._taskProgressTokens.set(task.taskId, messageId); + } + } + } + if (!isTaskResponse) { + this._progressHandlers.delete(messageId); + } + if (isJSONRPCResultResponse(response)) { + handler(response); + } else { + const error48 = McpError.fromError(response.error.code, response.error.message, response.error.data); + handler(error48); + } + } + get transport() { + return this._transport; + } + /** + * Closes the connection. + */ + async close() { + await this._transport?.close(); + } + /** + * Sends a request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * @example + * ```typescript + * const stream = protocol.requestStream(request, resultSchema, options); + * for await (const message of stream) { + * switch (message.type) { + * case 'taskCreated': + * console.log('Task created:', message.task.taskId); + * break; + * case 'taskStatus': + * console.log('Task status:', message.task.status); + * break; + * case 'result': + * console.log('Final result:', message.result); + * break; + * case 'error': + * console.error('Error:', message.error); + * break; + * } + * } + * ``` + * + * @experimental Use `client.experimental.tasks.requestStream()` to access this method. + */ + async *requestStream(request, resultSchema, options) { + const { task } = options ?? {}; + if (!task) { + try { + const result = await this.request(request, resultSchema, options); + yield { type: "result", result }; + } catch (error48) { + yield { + type: "error", + error: error48 instanceof McpError ? error48 : new McpError(ErrorCode.InternalError, String(error48)) + }; + } + return; + } + let taskId; + try { + const createResult = await this.request(request, CreateTaskResultSchema, options); + if (createResult.task) { + taskId = createResult.task.taskId; + yield { type: "taskCreated", task: createResult.task }; + } else { + throw new McpError(ErrorCode.InternalError, "Task creation did not return a task"); + } + while (true) { + const task2 = await this.getTask({ taskId }, options); + yield { type: "taskStatus", task: task2 }; + if (isTerminal(task2.status)) { + if (task2.status === "completed") { + const result = await this.getTaskResult({ taskId }, resultSchema, options); + yield { type: "result", result }; + } else if (task2.status === "failed") { + yield { + type: "error", + error: new McpError(ErrorCode.InternalError, `Task ${taskId} failed`) + }; + } else if (task2.status === "cancelled") { + yield { + type: "error", + error: new McpError(ErrorCode.InternalError, `Task ${taskId} was cancelled`) + }; + } + return; + } + if (task2.status === "input_required") { + const result = await this.getTaskResult({ taskId }, resultSchema, options); + yield { type: "result", result }; + return; + } + const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1e3; + await new Promise((resolve) => setTimeout(resolve, pollInterval)); + options?.signal?.throwIfAborted(); + } + } catch (error48) { + yield { + type: "error", + error: error48 instanceof McpError ? error48 : new McpError(ErrorCode.InternalError, String(error48)) + }; + } + } + /** + * Sends a request and waits for a response. + * + * Do not use this method to emit notifications! Use notification() instead. + */ + request(request, resultSchema, options) { + const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {}; + return new Promise((resolve, reject) => { + const earlyReject = (error48) => { + reject(error48); + }; + if (!this._transport) { + earlyReject(new Error("Not connected")); + return; + } + if (this._options?.enforceStrictCapabilities === true) { + try { + this.assertCapabilityForMethod(request.method); + if (task) { + this.assertTaskCapability(request.method); + } + } catch (e) { + earlyReject(e); + return; + } + } + options?.signal?.throwIfAborted(); + const messageId = this._requestMessageId++; + const jsonrpcRequest = { + ...request, + jsonrpc: "2.0", + id: messageId + }; + if (options?.onprogress) { + this._progressHandlers.set(messageId, options.onprogress); + jsonrpcRequest.params = { + ...request.params, + _meta: { + ...request.params?._meta || {}, + progressToken: messageId + } + }; + } + if (task) { + jsonrpcRequest.params = { + ...jsonrpcRequest.params, + task + }; + } + if (relatedTask) { + jsonrpcRequest.params = { + ...jsonrpcRequest.params, + _meta: { + ...jsonrpcRequest.params?._meta || {}, + [RELATED_TASK_META_KEY]: relatedTask + } + }; + } + const cancel = (reason) => { + this._responseHandlers.delete(messageId); + this._progressHandlers.delete(messageId); + this._cleanupTimeout(messageId); + this._transport?.send({ + jsonrpc: "2.0", + method: "notifications/cancelled", + params: { + requestId: messageId, + reason: String(reason) + } + }, { relatedRequestId, resumptionToken, onresumptiontoken }).catch((error49) => this._onerror(new Error(`Failed to send cancellation: ${error49}`))); + const error48 = reason instanceof McpError ? reason : new McpError(ErrorCode.RequestTimeout, String(reason)); + reject(error48); + }; + this._responseHandlers.set(messageId, (response) => { + if (options?.signal?.aborted) { + return; + } + if (response instanceof Error) { + return reject(response); + } + try { + const parseResult = safeParse2(resultSchema, response.result); + if (!parseResult.success) { + reject(parseResult.error); + } else { + resolve(parseResult.data); + } + } catch (error48) { + reject(error48); + } + }); + options?.signal?.addEventListener("abort", () => { + cancel(options?.signal?.reason); + }); + const timeout = options?.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC; + const timeoutHandler = () => cancel(McpError.fromError(ErrorCode.RequestTimeout, "Request timed out", { timeout })); + this._setupTimeout(messageId, timeout, options?.maxTotalTimeout, timeoutHandler, options?.resetTimeoutOnProgress ?? false); + const relatedTaskId = relatedTask?.taskId; + if (relatedTaskId) { + const responseResolver = (response) => { + const handler = this._responseHandlers.get(messageId); + if (handler) { + handler(response); + } else { + this._onerror(new Error(`Response handler missing for side-channeled request ${messageId}`)); + } + }; + this._requestResolvers.set(messageId, responseResolver); + this._enqueueTaskMessage(relatedTaskId, { + type: "request", + message: jsonrpcRequest, + timestamp: Date.now() + }).catch((error48) => { + this._cleanupTimeout(messageId); + reject(error48); + }); + } else { + this._transport.send(jsonrpcRequest, { relatedRequestId, resumptionToken, onresumptiontoken }).catch((error48) => { + this._cleanupTimeout(messageId); + reject(error48); + }); + } + }); + } + /** + * Gets the current status of a task. + * + * @experimental Use `client.experimental.tasks.getTask()` to access this method. + */ + async getTask(params, options) { + return this.request({ method: "tasks/get", params }, GetTaskResultSchema, options); + } + /** + * Retrieves the result of a completed task. + * + * @experimental Use `client.experimental.tasks.getTaskResult()` to access this method. + */ + async getTaskResult(params, resultSchema, options) { + return this.request({ method: "tasks/result", params }, resultSchema, options); + } + /** + * Lists tasks, optionally starting from a pagination cursor. + * + * @experimental Use `client.experimental.tasks.listTasks()` to access this method. + */ + async listTasks(params, options) { + return this.request({ method: "tasks/list", params }, ListTasksResultSchema, options); + } + /** + * Cancels a specific task. + * + * @experimental Use `client.experimental.tasks.cancelTask()` to access this method. + */ + async cancelTask(params, options) { + return this.request({ method: "tasks/cancel", params }, CancelTaskResultSchema, options); + } + /** + * Emits a notification, which is a one-way message that does not expect a response. + */ + async notification(notification, options) { + if (!this._transport) { + throw new Error("Not connected"); + } + this.assertNotificationCapability(notification.method); + const relatedTaskId = options?.relatedTask?.taskId; + if (relatedTaskId) { + const jsonrpcNotification2 = { + ...notification, + jsonrpc: "2.0", + params: { + ...notification.params, + _meta: { + ...notification.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + await this._enqueueTaskMessage(relatedTaskId, { + type: "notification", + message: jsonrpcNotification2, + timestamp: Date.now() + }); + return; + } + const debouncedMethods = this._options?.debouncedNotificationMethods ?? []; + const canDebounce = debouncedMethods.includes(notification.method) && !notification.params && !options?.relatedRequestId && !options?.relatedTask; + if (canDebounce) { + if (this._pendingDebouncedNotifications.has(notification.method)) { + return; + } + this._pendingDebouncedNotifications.add(notification.method); + Promise.resolve().then(() => { + this._pendingDebouncedNotifications.delete(notification.method); + if (!this._transport) { + return; + } + let jsonrpcNotification2 = { + ...notification, + jsonrpc: "2.0" + }; + if (options?.relatedTask) { + jsonrpcNotification2 = { + ...jsonrpcNotification2, + params: { + ...jsonrpcNotification2.params, + _meta: { + ...jsonrpcNotification2.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + } + this._transport?.send(jsonrpcNotification2, options).catch((error48) => this._onerror(error48)); + }); + return; + } + let jsonrpcNotification = { + ...notification, + jsonrpc: "2.0" + }; + if (options?.relatedTask) { + jsonrpcNotification = { + ...jsonrpcNotification, + params: { + ...jsonrpcNotification.params, + _meta: { + ...jsonrpcNotification.params?._meta || {}, + [RELATED_TASK_META_KEY]: options.relatedTask + } + } + }; + } + await this._transport.send(jsonrpcNotification, options); + } + /** + * Registers a handler to invoke when this protocol object receives a request with the given method. + * + * Note that this will replace any previous request handler for the same method. + */ + setRequestHandler(requestSchema, handler) { + const method = getMethodLiteral(requestSchema); + this.assertRequestHandlerCapability(method); + this._requestHandlers.set(method, (request, extra) => { + const parsed = parseWithCompat(requestSchema, request); + return Promise.resolve(handler(parsed, extra)); + }); + } + /** + * Removes the request handler for the given method. + */ + removeRequestHandler(method) { + this._requestHandlers.delete(method); + } + /** + * Asserts that a request handler has not already been set for the given method, in preparation for a new one being automatically installed. + */ + assertCanSetRequestHandler(method) { + if (this._requestHandlers.has(method)) { + throw new Error(`A request handler for ${method} already exists, which would be overridden`); + } + } + /** + * Registers a handler to invoke when this protocol object receives a notification with the given method. + * + * Note that this will replace any previous notification handler for the same method. + */ + setNotificationHandler(notificationSchema, handler) { + const method = getMethodLiteral(notificationSchema); + this._notificationHandlers.set(method, (notification) => { + const parsed = parseWithCompat(notificationSchema, notification); + return Promise.resolve(handler(parsed)); + }); + } + /** + * Removes the notification handler for the given method. + */ + removeNotificationHandler(method) { + this._notificationHandlers.delete(method); + } + /** + * Cleans up the progress handler associated with a task. + * This should be called when a task reaches a terminal status. + */ + _cleanupTaskProgressHandler(taskId) { + const progressToken = this._taskProgressTokens.get(taskId); + if (progressToken !== void 0) { + this._progressHandlers.delete(progressToken); + this._taskProgressTokens.delete(taskId); + } + } + /** + * Enqueues a task-related message for side-channel delivery via tasks/result. + * @param taskId The task ID to associate the message with + * @param message The message to enqueue + * @param sessionId Optional session ID for binding the operation to a specific session + * @throws Error if taskStore is not configured or if enqueue fails (e.g., queue overflow) + * + * Note: If enqueue fails, it's the TaskMessageQueue implementation's responsibility to handle + * the error appropriately (e.g., by failing the task, logging, etc.). The Protocol layer + * simply propagates the error. + */ + async _enqueueTaskMessage(taskId, message, sessionId) { + if (!this._taskStore || !this._taskMessageQueue) { + throw new Error("Cannot enqueue task message: taskStore and taskMessageQueue are not configured"); + } + const maxQueueSize = this._options?.maxTaskQueueSize; + await this._taskMessageQueue.enqueue(taskId, message, sessionId, maxQueueSize); + } + /** + * Clears the message queue for a task and rejects any pending request resolvers. + * @param taskId The task ID whose queue should be cleared + * @param sessionId Optional session ID for binding the operation to a specific session + */ + async _clearTaskQueue(taskId, sessionId) { + if (this._taskMessageQueue) { + const messages = await this._taskMessageQueue.dequeueAll(taskId, sessionId); + for (const message of messages) { + if (message.type === "request" && isJSONRPCRequest(message.message)) { + const requestId = message.message.id; + const resolver = this._requestResolvers.get(requestId); + if (resolver) { + resolver(new McpError(ErrorCode.InternalError, "Task cancelled or completed")); + this._requestResolvers.delete(requestId); + } else { + this._onerror(new Error(`Resolver missing for request ${requestId} during task ${taskId} cleanup`)); + } + } + } + } + } + /** + * Waits for a task update (new messages or status change) with abort signal support. + * Uses polling to check for updates at the task's configured poll interval. + * @param taskId The task ID to wait for + * @param signal Abort signal to cancel the wait + * @returns Promise that resolves when an update occurs or rejects if aborted + */ + async _waitForTaskUpdate(taskId, signal) { + let interval = this._options?.defaultTaskPollInterval ?? 1e3; + try { + const task = await this._taskStore?.getTask(taskId); + if (task?.pollInterval) { + interval = task.pollInterval; + } + } catch { + } + return new Promise((resolve, reject) => { + if (signal.aborted) { + reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled")); + return; + } + const timeoutId = setTimeout(resolve, interval); + signal.addEventListener("abort", () => { + clearTimeout(timeoutId); + reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled")); + }, { once: true }); + }); + } + requestTaskStore(request, sessionId) { + const taskStore = this._taskStore; + if (!taskStore) { + throw new Error("No task store configured"); + } + return { + createTask: async (taskParams) => { + if (!request) { + throw new Error("No request provided"); + } + return await taskStore.createTask(taskParams, request.id, { + method: request.method, + params: request.params + }, sessionId); + }, + getTask: async (taskId) => { + const task = await taskStore.getTask(taskId, sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, "Failed to retrieve task: Task not found"); + } + return task; + }, + storeTaskResult: async (taskId, status, result) => { + await taskStore.storeTaskResult(taskId, status, result, sessionId); + const task = await taskStore.getTask(taskId, sessionId); + if (task) { + const notification = TaskStatusNotificationSchema.parse({ + method: "notifications/tasks/status", + params: task + }); + await this.notification(notification); + if (isTerminal(task.status)) { + this._cleanupTaskProgressHandler(taskId); + } + } + }, + getTaskResult: (taskId) => { + return taskStore.getTaskResult(taskId, sessionId); + }, + updateTaskStatus: async (taskId, status, statusMessage) => { + const task = await taskStore.getTask(taskId, sessionId); + if (!task) { + throw new McpError(ErrorCode.InvalidParams, `Task "${taskId}" not found - it may have been cleaned up`); + } + if (isTerminal(task.status)) { + throw new McpError(ErrorCode.InvalidParams, `Cannot update task "${taskId}" from terminal status "${task.status}" to "${status}". Terminal states (completed, failed, cancelled) cannot transition to other states.`); + } + await taskStore.updateTaskStatus(taskId, status, statusMessage, sessionId); + const updatedTask = await taskStore.getTask(taskId, sessionId); + if (updatedTask) { + const notification = TaskStatusNotificationSchema.parse({ + method: "notifications/tasks/status", + params: updatedTask + }); + await this.notification(notification); + if (isTerminal(updatedTask.status)) { + this._cleanupTaskProgressHandler(taskId); + } + } + }, + listTasks: (cursor) => { + return taskStore.listTasks(cursor, sessionId); + } + }; + } +}; +function isPlainObject2(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); +} +function mergeCapabilities(base, additional) { + const result = { ...base }; + for (const key in additional) { + const k = key; + const addValue = additional[k]; + if (addValue === void 0) + continue; + const baseValue = result[k]; + if (isPlainObject2(baseValue) && isPlainObject2(addValue)) { + result[k] = { ...baseValue, ...addValue }; + } else { + result[k] = addValue; + } + } + return result; +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js +var import_ajv = __toESM(require_ajv(), 1); +var import_ajv_formats = __toESM(require_dist(), 1); +function createDefaultAjvInstance() { + const ajv2 = new import_ajv.default({ + strict: false, + validateFormats: true, + validateSchema: false, + allErrors: true + }); + const addFormats = import_ajv_formats.default; + addFormats(ajv2); + return ajv2; +} +var AjvJsonSchemaValidator = class { + /** + * Create an AJV validator + * + * @param ajv - Optional pre-configured AJV instance. If not provided, a default instance will be created. + * + * @example + * ```typescript + * // Use default configuration (recommended for most cases) + * import { AjvJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/ajv'; + * const validator = new AjvJsonSchemaValidator(); + * + * // Or provide custom AJV instance for advanced configuration + * import { Ajv } from 'ajv'; + * import addFormats from 'ajv-formats'; + * + * const ajv = new Ajv({ validateFormats: true }); + * addFormats(ajv); + * const validator = new AjvJsonSchemaValidator(ajv); + * ``` + */ + constructor(ajv2) { + this._ajv = ajv2 ?? createDefaultAjvInstance(); + } + /** + * Create a validator for the given JSON Schema + * + * The validator is compiled once and can be reused multiple times. + * If the schema has an $id, it will be cached by AJV automatically. + * + * @param schema - Standard JSON Schema object + * @returns A validator function that validates input data + */ + getValidator(schema) { + const ajvValidator = "$id" in schema && typeof schema.$id === "string" ? this._ajv.getSchema(schema.$id) ?? this._ajv.compile(schema) : this._ajv.compile(schema); + return (input) => { + const valid = ajvValidator(input); + if (valid) { + return { + valid: true, + data: input, + errorMessage: void 0 + }; + } else { + return { + valid: false, + data: void 0, + errorMessage: this._ajv.errorsText(ajvValidator.errors) + }; + } + }; + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js +var ExperimentalServerTasks = class { + constructor(_server) { + this._server = _server; + } + /** + * Sends a request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * This method provides streaming access to request processing, allowing you to + * observe intermediate task status updates for task-augmented requests. + * + * @param request - The request to send + * @param resultSchema - Zod schema for validating the result + * @param options - Optional request options (timeout, signal, task creation params, etc.) + * @returns AsyncGenerator that yields ResponseMessage objects + * + * @experimental + */ + requestStream(request, resultSchema, options) { + return this._server.requestStream(request, resultSchema, options); + } + /** + * Sends a sampling request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * For task-augmented requests, yields 'taskCreated' and 'taskStatus' messages + * before the final result. + * + * @example + * ```typescript + * const stream = server.experimental.tasks.createMessageStream({ + * messages: [{ role: 'user', content: { type: 'text', text: 'Hello' } }], + * maxTokens: 100 + * }, { + * onprogress: (progress) => { + * // Handle streaming tokens via progress notifications + * console.log('Progress:', progress.message); + * } + * }); + * + * for await (const message of stream) { + * switch (message.type) { + * case 'taskCreated': + * console.log('Task created:', message.task.taskId); + * break; + * case 'taskStatus': + * console.log('Task status:', message.task.status); + * break; + * case 'result': + * console.log('Final result:', message.result); + * break; + * case 'error': + * console.error('Error:', message.error); + * break; + * } + * } + * ``` + * + * @param params - The sampling request parameters + * @param options - Optional request options (timeout, signal, task creation params, onprogress, etc.) + * @returns AsyncGenerator that yields ResponseMessage objects + * + * @experimental + */ + createMessageStream(params, options) { + const clientCapabilities = this._server.getClientCapabilities(); + if ((params.tools || params.toolChoice) && !clientCapabilities?.sampling?.tools) { + throw new Error("Client does not support sampling tools capability."); + } + if (params.messages.length > 0) { + const lastMessage = params.messages[params.messages.length - 1]; + const lastContent = Array.isArray(lastMessage.content) ? lastMessage.content : [lastMessage.content]; + const hasToolResults = lastContent.some((c) => c.type === "tool_result"); + const previousMessage = params.messages.length > 1 ? params.messages[params.messages.length - 2] : void 0; + const previousContent = previousMessage ? Array.isArray(previousMessage.content) ? previousMessage.content : [previousMessage.content] : []; + const hasPreviousToolUse = previousContent.some((c) => c.type === "tool_use"); + if (hasToolResults) { + if (lastContent.some((c) => c.type !== "tool_result")) { + throw new Error("The last message must contain only tool_result content if any is present"); + } + if (!hasPreviousToolUse) { + throw new Error("tool_result blocks are not matching any tool_use from the previous message"); + } + } + if (hasPreviousToolUse) { + const toolUseIds = new Set(previousContent.filter((c) => c.type === "tool_use").map((c) => c.id)); + const toolResultIds = new Set(lastContent.filter((c) => c.type === "tool_result").map((c) => c.toolUseId)); + if (toolUseIds.size !== toolResultIds.size || ![...toolUseIds].every((id) => toolResultIds.has(id))) { + throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match"); + } + } + } + return this.requestStream({ + method: "sampling/createMessage", + params + }, CreateMessageResultSchema, options); + } + /** + * Sends an elicitation request and returns an AsyncGenerator that yields response messages. + * The generator is guaranteed to end with either a 'result' or 'error' message. + * + * For task-augmented requests (especially URL-based elicitation), yields 'taskCreated' + * and 'taskStatus' messages before the final result. + * + * @example + * ```typescript + * const stream = server.experimental.tasks.elicitInputStream({ + * mode: 'url', + * message: 'Please authenticate', + * elicitationId: 'auth-123', + * url: 'https://example.com/auth' + * }, { + * task: { ttl: 300000 } // Task-augmented for long-running auth flow + * }); + * + * for await (const message of stream) { + * switch (message.type) { + * case 'taskCreated': + * console.log('Task created:', message.task.taskId); + * break; + * case 'taskStatus': + * console.log('Task status:', message.task.status); + * break; + * case 'result': + * console.log('User action:', message.result.action); + * break; + * case 'error': + * console.error('Error:', message.error); + * break; + * } + * } + * ``` + * + * @param params - The elicitation request parameters + * @param options - Optional request options (timeout, signal, task creation params, etc.) + * @returns AsyncGenerator that yields ResponseMessage objects + * + * @experimental + */ + elicitInputStream(params, options) { + const clientCapabilities = this._server.getClientCapabilities(); + const mode = params.mode ?? "form"; + switch (mode) { + case "url": { + if (!clientCapabilities?.elicitation?.url) { + throw new Error("Client does not support url elicitation."); + } + break; + } + case "form": { + if (!clientCapabilities?.elicitation?.form) { + throw new Error("Client does not support form elicitation."); + } + break; + } + } + const normalizedParams = mode === "form" && params.mode === void 0 ? { ...params, mode: "form" } : params; + return this.requestStream({ + method: "elicitation/create", + params: normalizedParams + }, ElicitResultSchema, options); + } + /** + * Gets the current status of a task. + * + * @param taskId - The task identifier + * @param options - Optional request options + * @returns The task status + * + * @experimental + */ + async getTask(taskId, options) { + return this._server.getTask({ taskId }, options); + } + /** + * Retrieves the result of a completed task. + * + * @param taskId - The task identifier + * @param resultSchema - Zod schema for validating the result + * @param options - Optional request options + * @returns The task result + * + * @experimental + */ + async getTaskResult(taskId, resultSchema, options) { + return this._server.getTaskResult({ taskId }, resultSchema, options); + } + /** + * Lists tasks with optional pagination. + * + * @param cursor - Optional pagination cursor + * @param options - Optional request options + * @returns List of tasks with optional next cursor + * + * @experimental + */ + async listTasks(cursor, options) { + return this._server.listTasks(cursor ? { cursor } : void 0, options); + } + /** + * Cancels a running task. + * + * @param taskId - The task identifier + * @param options - Optional request options + * + * @experimental + */ + async cancelTask(taskId, options) { + return this._server.cancelTask({ taskId }, options); + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js +function assertToolsCallTaskCapability(requests, method, entityName) { + if (!requests) { + throw new Error(`${entityName} does not support task creation (required for ${method})`); + } + switch (method) { + case "tools/call": + if (!requests.tools?.call) { + throw new Error(`${entityName} does not support task creation for tools/call (required for ${method})`); + } + break; + default: + break; + } +} +function assertClientRequestTaskCapability(requests, method, entityName) { + if (!requests) { + throw new Error(`${entityName} does not support task creation (required for ${method})`); + } + switch (method) { + case "sampling/createMessage": + if (!requests.sampling?.createMessage) { + throw new Error(`${entityName} does not support task creation for sampling/createMessage (required for ${method})`); + } + break; + case "elicitation/create": + if (!requests.elicitation?.create) { + throw new Error(`${entityName} does not support task creation for elicitation/create (required for ${method})`); + } + break; + default: + break; + } +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +var Server = class extends Protocol { + /** + * Initializes this server with the given name and version information. + */ + constructor(_serverInfo, options) { + super(options); + this._serverInfo = _serverInfo; + this._loggingLevels = /* @__PURE__ */ new Map(); + this.LOG_LEVEL_SEVERITY = new Map(LoggingLevelSchema.options.map((level, index) => [level, index])); + this.isMessageIgnored = (level, sessionId) => { + const currentLevel = this._loggingLevels.get(sessionId); + return currentLevel ? this.LOG_LEVEL_SEVERITY.get(level) < this.LOG_LEVEL_SEVERITY.get(currentLevel) : false; + }; + this._capabilities = options?.capabilities ?? {}; + this._instructions = options?.instructions; + this._jsonSchemaValidator = options?.jsonSchemaValidator ?? new AjvJsonSchemaValidator(); + this.setRequestHandler(InitializeRequestSchema, (request) => this._oninitialize(request)); + this.setNotificationHandler(InitializedNotificationSchema, () => this.oninitialized?.()); + if (this._capabilities.logging) { + this.setRequestHandler(SetLevelRequestSchema, async (request, extra) => { + const transportSessionId = extra.sessionId || extra.requestInfo?.headers["mcp-session-id"] || void 0; + const { level } = request.params; + const parseResult = LoggingLevelSchema.safeParse(level); + if (parseResult.success) { + this._loggingLevels.set(transportSessionId, parseResult.data); + } + return {}; + }); + } + } + /** + * Access experimental features. + * + * WARNING: These APIs are experimental and may change without notice. + * + * @experimental + */ + get experimental() { + if (!this._experimental) { + this._experimental = { + tasks: new ExperimentalServerTasks(this) + }; + } + return this._experimental; + } + /** + * Registers new capabilities. This can only be called before connecting to a transport. + * + * The new capabilities will be merged with any existing capabilities previously given (e.g., at initialization). + */ + registerCapabilities(capabilities) { + if (this.transport) { + throw new Error("Cannot register capabilities after connecting to transport"); + } + this._capabilities = mergeCapabilities(this._capabilities, capabilities); + } + /** + * Override request handler registration to enforce server-side validation for tools/call. + */ + setRequestHandler(requestSchema, handler) { + const shape = getObjectShape(requestSchema); + const methodSchema = shape?.method; + if (!methodSchema) { + throw new Error("Schema is missing a method literal"); + } + let methodValue; + if (isZ4Schema(methodSchema)) { + const v4Schema = methodSchema; + const v4Def = v4Schema._zod?.def; + methodValue = v4Def?.value ?? v4Schema.value; + } else { + const v3Schema = methodSchema; + const legacyDef = v3Schema._def; + methodValue = legacyDef?.value ?? v3Schema.value; + } + if (typeof methodValue !== "string") { + throw new Error("Schema method literal must be a string"); + } + const method = methodValue; + if (method === "tools/call") { + const wrappedHandler = async (request, extra) => { + const validatedRequest = safeParse2(CallToolRequestSchema, request); + if (!validatedRequest.success) { + const errorMessage = validatedRequest.error instanceof Error ? validatedRequest.error.message : String(validatedRequest.error); + throw new McpError(ErrorCode.InvalidParams, `Invalid tools/call request: ${errorMessage}`); + } + const { params } = validatedRequest.data; + const result = await Promise.resolve(handler(request, extra)); + if (params.task) { + const taskValidationResult = safeParse2(CreateTaskResultSchema, result); + if (!taskValidationResult.success) { + const errorMessage = taskValidationResult.error instanceof Error ? taskValidationResult.error.message : String(taskValidationResult.error); + throw new McpError(ErrorCode.InvalidParams, `Invalid task creation result: ${errorMessage}`); + } + return taskValidationResult.data; + } + const validationResult = safeParse2(CallToolResultSchema, result); + if (!validationResult.success) { + const errorMessage = validationResult.error instanceof Error ? validationResult.error.message : String(validationResult.error); + throw new McpError(ErrorCode.InvalidParams, `Invalid tools/call result: ${errorMessage}`); + } + return validationResult.data; + }; + return super.setRequestHandler(requestSchema, wrappedHandler); + } + return super.setRequestHandler(requestSchema, handler); + } + assertCapabilityForMethod(method) { + switch (method) { + case "sampling/createMessage": + if (!this._clientCapabilities?.sampling) { + throw new Error(`Client does not support sampling (required for ${method})`); + } + break; + case "elicitation/create": + if (!this._clientCapabilities?.elicitation) { + throw new Error(`Client does not support elicitation (required for ${method})`); + } + break; + case "roots/list": + if (!this._clientCapabilities?.roots) { + throw new Error(`Client does not support listing roots (required for ${method})`); + } + break; + case "ping": + break; + } + } + assertNotificationCapability(method) { + switch (method) { + case "notifications/message": + if (!this._capabilities.logging) { + throw new Error(`Server does not support logging (required for ${method})`); + } + break; + case "notifications/resources/updated": + case "notifications/resources/list_changed": + if (!this._capabilities.resources) { + throw new Error(`Server does not support notifying about resources (required for ${method})`); + } + break; + case "notifications/tools/list_changed": + if (!this._capabilities.tools) { + throw new Error(`Server does not support notifying of tool list changes (required for ${method})`); + } + break; + case "notifications/prompts/list_changed": + if (!this._capabilities.prompts) { + throw new Error(`Server does not support notifying of prompt list changes (required for ${method})`); + } + break; + case "notifications/elicitation/complete": + if (!this._clientCapabilities?.elicitation?.url) { + throw new Error(`Client does not support URL elicitation (required for ${method})`); + } + break; + case "notifications/cancelled": + break; + case "notifications/progress": + break; + } + } + assertRequestHandlerCapability(method) { + if (!this._capabilities) { + return; + } + switch (method) { + case "completion/complete": + if (!this._capabilities.completions) { + throw new Error(`Server does not support completions (required for ${method})`); + } + break; + case "logging/setLevel": + if (!this._capabilities.logging) { + throw new Error(`Server does not support logging (required for ${method})`); + } + break; + case "prompts/get": + case "prompts/list": + if (!this._capabilities.prompts) { + throw new Error(`Server does not support prompts (required for ${method})`); + } + break; + case "resources/list": + case "resources/templates/list": + case "resources/read": + if (!this._capabilities.resources) { + throw new Error(`Server does not support resources (required for ${method})`); + } + break; + case "tools/call": + case "tools/list": + if (!this._capabilities.tools) { + throw new Error(`Server does not support tools (required for ${method})`); + } + break; + case "tasks/get": + case "tasks/list": + case "tasks/result": + case "tasks/cancel": + if (!this._capabilities.tasks) { + throw new Error(`Server does not support tasks capability (required for ${method})`); + } + break; + case "ping": + case "initialize": + break; + } + } + assertTaskCapability(method) { + assertClientRequestTaskCapability(this._clientCapabilities?.tasks?.requests, method, "Client"); + } + assertTaskHandlerCapability(method) { + if (!this._capabilities) { + return; + } + assertToolsCallTaskCapability(this._capabilities.tasks?.requests, method, "Server"); + } + async _oninitialize(request) { + const requestedVersion = request.params.protocolVersion; + this._clientCapabilities = request.params.capabilities; + this._clientVersion = request.params.clientInfo; + const protocolVersion = SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion) ? requestedVersion : LATEST_PROTOCOL_VERSION; + return { + protocolVersion, + capabilities: this.getCapabilities(), + serverInfo: this._serverInfo, + ...this._instructions && { instructions: this._instructions } + }; + } + /** + * After initialization has completed, this will be populated with the client's reported capabilities. + */ + getClientCapabilities() { + return this._clientCapabilities; + } + /** + * After initialization has completed, this will be populated with information about the client's name and version. + */ + getClientVersion() { + return this._clientVersion; + } + getCapabilities() { + return this._capabilities; + } + async ping() { + return this.request({ method: "ping" }, EmptyResultSchema); + } + // Implementation + async createMessage(params, options) { + if (params.tools || params.toolChoice) { + if (!this._clientCapabilities?.sampling?.tools) { + throw new Error("Client does not support sampling tools capability."); + } + } + if (params.messages.length > 0) { + const lastMessage = params.messages[params.messages.length - 1]; + const lastContent = Array.isArray(lastMessage.content) ? lastMessage.content : [lastMessage.content]; + const hasToolResults = lastContent.some((c) => c.type === "tool_result"); + const previousMessage = params.messages.length > 1 ? params.messages[params.messages.length - 2] : void 0; + const previousContent = previousMessage ? Array.isArray(previousMessage.content) ? previousMessage.content : [previousMessage.content] : []; + const hasPreviousToolUse = previousContent.some((c) => c.type === "tool_use"); + if (hasToolResults) { + if (lastContent.some((c) => c.type !== "tool_result")) { + throw new Error("The last message must contain only tool_result content if any is present"); + } + if (!hasPreviousToolUse) { + throw new Error("tool_result blocks are not matching any tool_use from the previous message"); + } + } + if (hasPreviousToolUse) { + const toolUseIds = new Set(previousContent.filter((c) => c.type === "tool_use").map((c) => c.id)); + const toolResultIds = new Set(lastContent.filter((c) => c.type === "tool_result").map((c) => c.toolUseId)); + if (toolUseIds.size !== toolResultIds.size || ![...toolUseIds].every((id) => toolResultIds.has(id))) { + throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match"); + } + } + } + if (params.tools) { + return this.request({ method: "sampling/createMessage", params }, CreateMessageResultWithToolsSchema, options); + } + return this.request({ method: "sampling/createMessage", params }, CreateMessageResultSchema, options); + } + /** + * Creates an elicitation request for the given parameters. + * For backwards compatibility, `mode` may be omitted for form requests and will default to `'form'`. + * @param params The parameters for the elicitation request. + * @param options Optional request options. + * @returns The result of the elicitation request. + */ + async elicitInput(params, options) { + const mode = params.mode ?? "form"; + switch (mode) { + case "url": { + if (!this._clientCapabilities?.elicitation?.url) { + throw new Error("Client does not support url elicitation."); + } + const urlParams = params; + return this.request({ method: "elicitation/create", params: urlParams }, ElicitResultSchema, options); + } + case "form": { + if (!this._clientCapabilities?.elicitation?.form) { + throw new Error("Client does not support form elicitation."); + } + const formParams = params.mode === "form" ? params : { ...params, mode: "form" }; + const result = await this.request({ method: "elicitation/create", params: formParams }, ElicitResultSchema, options); + if (result.action === "accept" && result.content && formParams.requestedSchema) { + try { + const validator = this._jsonSchemaValidator.getValidator(formParams.requestedSchema); + const validationResult = validator(result.content); + if (!validationResult.valid) { + throw new McpError(ErrorCode.InvalidParams, `Elicitation response content does not match requested schema: ${validationResult.errorMessage}`); + } + } catch (error48) { + if (error48 instanceof McpError) { + throw error48; + } + throw new McpError(ErrorCode.InternalError, `Error validating elicitation response: ${error48 instanceof Error ? error48.message : String(error48)}`); + } + } + return result; + } + } + } + /** + * Creates a reusable callback that, when invoked, will send a `notifications/elicitation/complete` + * notification for the specified elicitation ID. + * + * @param elicitationId The ID of the elicitation to mark as complete. + * @param options Optional notification options. Useful when the completion notification should be related to a prior request. + * @returns A function that emits the completion notification when awaited. + */ + createElicitationCompletionNotifier(elicitationId, options) { + if (!this._clientCapabilities?.elicitation?.url) { + throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)"); + } + return () => this.notification({ + method: "notifications/elicitation/complete", + params: { + elicitationId + } + }, options); + } + async listRoots(params, options) { + return this.request({ method: "roots/list", params }, ListRootsResultSchema, options); + } + /** + * Sends a logging message to the client, if connected. + * Note: You only need to send the parameters object, not the entire JSON RPC message + * @see LoggingMessageNotification + * @param params + * @param sessionId optional for stateless and backward compatibility + */ + async sendLoggingMessage(params, sessionId) { + if (this._capabilities.logging) { + if (!this.isMessageIgnored(params.level, sessionId)) { + return this.notification({ method: "notifications/message", params }); + } + } + } + async sendResourceUpdated(params) { + return this.notification({ + method: "notifications/resources/updated", + params + }); + } + async sendResourceListChanged() { + return this.notification({ + method: "notifications/resources/list_changed" + }); + } + async sendToolListChanged() { + return this.notification({ method: "notifications/tools/list_changed" }); + } + async sendPromptListChanged() { + return this.notification({ method: "notifications/prompts/list_changed" }); + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/completable.js +var COMPLETABLE_SYMBOL = /* @__PURE__ */ Symbol.for("mcp.completable"); +function isCompletable(schema) { + return !!schema && typeof schema === "object" && COMPLETABLE_SYMBOL in schema; +} +function getCompleter(schema) { + const meta3 = schema[COMPLETABLE_SYMBOL]; + return meta3?.complete; +} +var McpZodTypeKind; +(function(McpZodTypeKind2) { + McpZodTypeKind2["Completable"] = "McpCompletable"; +})(McpZodTypeKind || (McpZodTypeKind = {})); + +// node_modules/@modelcontextprotocol/sdk/dist/esm/shared/toolNameValidation.js +var TOOL_NAME_REGEX = /^[A-Za-z0-9._-]{1,128}$/; +function validateToolName(name) { + const warnings = []; + if (name.length === 0) { + return { + isValid: false, + warnings: ["Tool name cannot be empty"] + }; + } + if (name.length > 128) { + return { + isValid: false, + warnings: [`Tool name exceeds maximum length of 128 characters (current: ${name.length})`] + }; + } + if (name.includes(" ")) { + warnings.push("Tool name contains spaces, which may cause parsing issues"); + } + if (name.includes(",")) { + warnings.push("Tool name contains commas, which may cause parsing issues"); + } + if (name.startsWith("-") || name.endsWith("-")) { + warnings.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"); + } + if (name.startsWith(".") || name.endsWith(".")) { + warnings.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"); + } + if (!TOOL_NAME_REGEX.test(name)) { + const invalidChars = name.split("").filter((char) => !/[A-Za-z0-9._-]/.test(char)).filter((char, index, arr) => arr.indexOf(char) === index); + warnings.push(`Tool name contains invalid characters: ${invalidChars.map((c) => `"${c}"`).join(", ")}`, "Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"); + return { + isValid: false, + warnings + }; + } + return { + isValid: true, + warnings + }; +} +function issueToolNameWarning(name, warnings) { + if (warnings.length > 0) { + console.warn(`Tool name validation warning for "${name}":`); + for (const warning of warnings) { + console.warn(` - ${warning}`); + } + console.warn("Tool registration will proceed, but this may cause compatibility issues."); + console.warn("Consider updating the tool name to conform to the MCP tool naming standard."); + console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details."); + } +} +function validateAndWarnToolName(name) { + const result = validateToolName(name); + issueToolNameWarning(name, result.warnings); + return result.isValid; +} + +// node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/mcp-server.js +var ExperimentalMcpServerTasks = class { + constructor(_mcpServer) { + this._mcpServer = _mcpServer; + } + registerToolTask(name, config2, handler) { + const execution = { taskSupport: "required", ...config2.execution }; + if (execution.taskSupport === "forbidden") { + throw new Error(`Cannot register task-based tool '${name}' with taskSupport 'forbidden'. Use registerTool() instead.`); + } + const mcpServerInternal = this._mcpServer; + return mcpServerInternal._createRegisteredTool(name, config2.title, config2.description, config2.inputSchema, config2.outputSchema, config2.annotations, execution, config2._meta, handler); + } +}; + +// node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js +var McpServer = class { + constructor(serverInfo, options) { + this._registeredResources = {}; + this._registeredResourceTemplates = {}; + this._registeredTools = {}; + this._registeredPrompts = {}; + this._toolHandlersInitialized = false; + this._completionHandlerInitialized = false; + this._resourceHandlersInitialized = false; + this._promptHandlersInitialized = false; + this.server = new Server(serverInfo, options); + } + /** + * Access experimental features. + * + * WARNING: These APIs are experimental and may change without notice. + * + * @experimental + */ + get experimental() { + if (!this._experimental) { + this._experimental = { + tasks: new ExperimentalMcpServerTasks(this) + }; + } + return this._experimental; + } + /** + * Attaches to the given transport, starts it, and starts listening for messages. + * + * The `server` object assumes ownership of the Transport, replacing any callbacks that have already been set, and expects that it is the only user of the Transport instance going forward. + */ + async connect(transport) { + return await this.server.connect(transport); + } + /** + * Closes the connection. + */ + async close() { + await this.server.close(); + } + setToolRequestHandlers() { + if (this._toolHandlersInitialized) { + return; + } + this.server.assertCanSetRequestHandler(getMethodValue(ListToolsRequestSchema)); + this.server.assertCanSetRequestHandler(getMethodValue(CallToolRequestSchema)); + this.server.registerCapabilities({ + tools: { + listChanged: true + } + }); + this.server.setRequestHandler(ListToolsRequestSchema, () => ({ + tools: Object.entries(this._registeredTools).filter(([, tool2]) => tool2.enabled).map(([name, tool2]) => { + const toolDefinition = { + name, + title: tool2.title, + description: tool2.description, + inputSchema: (() => { + const obj = normalizeObjectSchema(tool2.inputSchema); + return obj ? toJsonSchemaCompat(obj, { + strictUnions: true, + pipeStrategy: "input" + }) : EMPTY_OBJECT_JSON_SCHEMA; + })(), + annotations: tool2.annotations, + execution: tool2.execution, + _meta: tool2._meta + }; + if (tool2.outputSchema) { + const obj = normalizeObjectSchema(tool2.outputSchema); + if (obj) { + toolDefinition.outputSchema = toJsonSchemaCompat(obj, { + strictUnions: true, + pipeStrategy: "output" + }); + } + } + return toolDefinition; + }) + })); + this.server.setRequestHandler(CallToolRequestSchema, async (request, extra) => { + try { + const tool2 = this._registeredTools[request.params.name]; + if (!tool2) { + throw new McpError(ErrorCode.InvalidParams, `Tool ${request.params.name} not found`); + } + if (!tool2.enabled) { + throw new McpError(ErrorCode.InvalidParams, `Tool ${request.params.name} disabled`); + } + const isTaskRequest = !!request.params.task; + const taskSupport = tool2.execution?.taskSupport; + const isTaskHandler = "createTask" in tool2.handler; + if ((taskSupport === "required" || taskSupport === "optional") && !isTaskHandler) { + throw new McpError(ErrorCode.InternalError, `Tool ${request.params.name} has taskSupport '${taskSupport}' but was not registered with registerToolTask`); + } + if (taskSupport === "required" && !isTaskRequest) { + throw new McpError(ErrorCode.MethodNotFound, `Tool ${request.params.name} requires task augmentation (taskSupport: 'required')`); + } + if (taskSupport === "optional" && !isTaskRequest && isTaskHandler) { + return await this.handleAutomaticTaskPolling(tool2, request, extra); + } + const args = await this.validateToolInput(tool2, request.params.arguments, request.params.name); + const result = await this.executeToolHandler(tool2, args, extra); + if (isTaskRequest) { + return result; + } + await this.validateToolOutput(tool2, result, request.params.name); + return result; + } catch (error48) { + if (error48 instanceof McpError) { + if (error48.code === ErrorCode.UrlElicitationRequired) { + throw error48; + } + } + return this.createToolError(error48 instanceof Error ? error48.message : String(error48)); + } + }); + this._toolHandlersInitialized = true; + } + /** + * Creates a tool error result. + * + * @param errorMessage - The error message. + * @returns The tool error result. + */ + createToolError(errorMessage) { + return { + content: [ + { + type: "text", + text: errorMessage + } + ], + isError: true + }; + } + /** + * Validates tool input arguments against the tool's input schema. + */ + async validateToolInput(tool2, args, toolName) { + if (!tool2.inputSchema) { + return void 0; + } + const inputObj = normalizeObjectSchema(tool2.inputSchema); + const schemaToParse = inputObj ?? tool2.inputSchema; + const parseResult = await safeParseAsync2(schemaToParse, args); + if (!parseResult.success) { + const error48 = "error" in parseResult ? parseResult.error : "Unknown error"; + const errorMessage = getParseErrorMessage(error48); + throw new McpError(ErrorCode.InvalidParams, `Input validation error: Invalid arguments for tool ${toolName}: ${errorMessage}`); + } + return parseResult.data; + } + /** + * Validates tool output against the tool's output schema. + */ + async validateToolOutput(tool2, result, toolName) { + if (!tool2.outputSchema) { + return; + } + if (!("content" in result)) { + return; + } + if (result.isError) { + return; + } + if (!result.structuredContent) { + throw new McpError(ErrorCode.InvalidParams, `Output validation error: Tool ${toolName} has an output schema but no structured content was provided`); + } + const outputObj = normalizeObjectSchema(tool2.outputSchema); + const parseResult = await safeParseAsync2(outputObj, result.structuredContent); + if (!parseResult.success) { + const error48 = "error" in parseResult ? parseResult.error : "Unknown error"; + const errorMessage = getParseErrorMessage(error48); + throw new McpError(ErrorCode.InvalidParams, `Output validation error: Invalid structured content for tool ${toolName}: ${errorMessage}`); + } + } + /** + * Executes a tool handler (either regular or task-based). + */ + async executeToolHandler(tool2, args, extra) { + const handler = tool2.handler; + const isTaskHandler = "createTask" in handler; + if (isTaskHandler) { + if (!extra.taskStore) { + throw new Error("No task store provided."); + } + const taskExtra = { ...extra, taskStore: extra.taskStore }; + if (tool2.inputSchema) { + const typedHandler = handler; + return await Promise.resolve(typedHandler.createTask(args, taskExtra)); + } else { + const typedHandler = handler; + return await Promise.resolve(typedHandler.createTask(taskExtra)); + } + } + if (tool2.inputSchema) { + const typedHandler = handler; + return await Promise.resolve(typedHandler(args, extra)); + } else { + const typedHandler = handler; + return await Promise.resolve(typedHandler(extra)); + } + } + /** + * Handles automatic task polling for tools with taskSupport 'optional'. + */ + async handleAutomaticTaskPolling(tool2, request, extra) { + if (!extra.taskStore) { + throw new Error("No task store provided for task-capable tool."); + } + const args = await this.validateToolInput(tool2, request.params.arguments, request.params.name); + const handler = tool2.handler; + const taskExtra = { ...extra, taskStore: extra.taskStore }; + const createTaskResult = args ? await Promise.resolve(handler.createTask(args, taskExtra)) : ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + await Promise.resolve(handler.createTask(taskExtra)) + ); + const taskId = createTaskResult.task.taskId; + let task = createTaskResult.task; + const pollInterval = task.pollInterval ?? 5e3; + while (task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled") { + await new Promise((resolve) => setTimeout(resolve, pollInterval)); + const updatedTask = await extra.taskStore.getTask(taskId); + if (!updatedTask) { + throw new McpError(ErrorCode.InternalError, `Task ${taskId} not found during polling`); + } + task = updatedTask; + } + return await extra.taskStore.getTaskResult(taskId); + } + setCompletionRequestHandler() { + if (this._completionHandlerInitialized) { + return; + } + this.server.assertCanSetRequestHandler(getMethodValue(CompleteRequestSchema)); + this.server.registerCapabilities({ + completions: {} + }); + this.server.setRequestHandler(CompleteRequestSchema, async (request) => { + switch (request.params.ref.type) { + case "ref/prompt": + assertCompleteRequestPrompt(request); + return this.handlePromptCompletion(request, request.params.ref); + case "ref/resource": + assertCompleteRequestResourceTemplate(request); + return this.handleResourceCompletion(request, request.params.ref); + default: + throw new McpError(ErrorCode.InvalidParams, `Invalid completion reference: ${request.params.ref}`); + } + }); + this._completionHandlerInitialized = true; + } + async handlePromptCompletion(request, ref) { + const prompt = this._registeredPrompts[ref.name]; + if (!prompt) { + throw new McpError(ErrorCode.InvalidParams, `Prompt ${ref.name} not found`); + } + if (!prompt.enabled) { + throw new McpError(ErrorCode.InvalidParams, `Prompt ${ref.name} disabled`); + } + if (!prompt.argsSchema) { + return EMPTY_COMPLETION_RESULT; + } + const promptShape = getObjectShape(prompt.argsSchema); + const field = promptShape?.[request.params.argument.name]; + if (!isCompletable(field)) { + return EMPTY_COMPLETION_RESULT; + } + const completer = getCompleter(field); + if (!completer) { + return EMPTY_COMPLETION_RESULT; + } + const suggestions = await completer(request.params.argument.value, request.params.context); + return createCompletionResult(suggestions); + } + async handleResourceCompletion(request, ref) { + const template = Object.values(this._registeredResourceTemplates).find((t) => t.resourceTemplate.uriTemplate.toString() === ref.uri); + if (!template) { + if (this._registeredResources[ref.uri]) { + return EMPTY_COMPLETION_RESULT; + } + throw new McpError(ErrorCode.InvalidParams, `Resource template ${request.params.ref.uri} not found`); + } + const completer = template.resourceTemplate.completeCallback(request.params.argument.name); + if (!completer) { + return EMPTY_COMPLETION_RESULT; + } + const suggestions = await completer(request.params.argument.value, request.params.context); + return createCompletionResult(suggestions); + } + setResourceRequestHandlers() { + if (this._resourceHandlersInitialized) { + return; + } + this.server.assertCanSetRequestHandler(getMethodValue(ListResourcesRequestSchema)); + this.server.assertCanSetRequestHandler(getMethodValue(ListResourceTemplatesRequestSchema)); + this.server.assertCanSetRequestHandler(getMethodValue(ReadResourceRequestSchema)); + this.server.registerCapabilities({ + resources: { + listChanged: true + } + }); + this.server.setRequestHandler(ListResourcesRequestSchema, async (request, extra) => { + const resources = Object.entries(this._registeredResources).filter(([_, resource]) => resource.enabled).map(([uri, resource]) => ({ + uri, + name: resource.name, + ...resource.metadata + })); + const templateResources = []; + for (const template of Object.values(this._registeredResourceTemplates)) { + if (!template.resourceTemplate.listCallback) { + continue; + } + const result = await template.resourceTemplate.listCallback(extra); + for (const resource of result.resources) { + templateResources.push({ + ...template.metadata, + // the defined resource metadata should override the template metadata if present + ...resource + }); + } + } + return { resources: [...resources, ...templateResources] }; + }); + this.server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => { + const resourceTemplates = Object.entries(this._registeredResourceTemplates).map(([name, template]) => ({ + name, + uriTemplate: template.resourceTemplate.uriTemplate.toString(), + ...template.metadata + })); + return { resourceTemplates }; + }); + this.server.setRequestHandler(ReadResourceRequestSchema, async (request, extra) => { + const uri = new URL(request.params.uri); + const resource = this._registeredResources[uri.toString()]; + if (resource) { + if (!resource.enabled) { + throw new McpError(ErrorCode.InvalidParams, `Resource ${uri} disabled`); + } + return resource.readCallback(uri, extra); + } + for (const template of Object.values(this._registeredResourceTemplates)) { + const variables = template.resourceTemplate.uriTemplate.match(uri.toString()); + if (variables) { + return template.readCallback(uri, variables, extra); + } + } + throw new McpError(ErrorCode.InvalidParams, `Resource ${uri} not found`); + }); + this._resourceHandlersInitialized = true; + } + setPromptRequestHandlers() { + if (this._promptHandlersInitialized) { + return; + } + this.server.assertCanSetRequestHandler(getMethodValue(ListPromptsRequestSchema)); + this.server.assertCanSetRequestHandler(getMethodValue(GetPromptRequestSchema)); + this.server.registerCapabilities({ + prompts: { + listChanged: true + } + }); + this.server.setRequestHandler(ListPromptsRequestSchema, () => ({ + prompts: Object.entries(this._registeredPrompts).filter(([, prompt]) => prompt.enabled).map(([name, prompt]) => { + return { + name, + title: prompt.title, + description: prompt.description, + arguments: prompt.argsSchema ? promptArgumentsFromSchema(prompt.argsSchema) : void 0 + }; + }) + })); + this.server.setRequestHandler(GetPromptRequestSchema, async (request, extra) => { + const prompt = this._registeredPrompts[request.params.name]; + if (!prompt) { + throw new McpError(ErrorCode.InvalidParams, `Prompt ${request.params.name} not found`); + } + if (!prompt.enabled) { + throw new McpError(ErrorCode.InvalidParams, `Prompt ${request.params.name} disabled`); + } + if (prompt.argsSchema) { + const argsObj = normalizeObjectSchema(prompt.argsSchema); + const parseResult = await safeParseAsync2(argsObj, request.params.arguments); + if (!parseResult.success) { + const error48 = "error" in parseResult ? parseResult.error : "Unknown error"; + const errorMessage = getParseErrorMessage(error48); + throw new McpError(ErrorCode.InvalidParams, `Invalid arguments for prompt ${request.params.name}: ${errorMessage}`); + } + const args = parseResult.data; + const cb = prompt.callback; + return await Promise.resolve(cb(args, extra)); + } else { + const cb = prompt.callback; + return await Promise.resolve(cb(extra)); + } + }); + this._promptHandlersInitialized = true; + } + resource(name, uriOrTemplate, ...rest) { + let metadata; + if (typeof rest[0] === "object") { + metadata = rest.shift(); + } + const readCallback = rest[0]; + if (typeof uriOrTemplate === "string") { + if (this._registeredResources[uriOrTemplate]) { + throw new Error(`Resource ${uriOrTemplate} is already registered`); + } + const registeredResource = this._createRegisteredResource(name, void 0, uriOrTemplate, metadata, readCallback); + this.setResourceRequestHandlers(); + this.sendResourceListChanged(); + return registeredResource; + } else { + if (this._registeredResourceTemplates[name]) { + throw new Error(`Resource template ${name} is already registered`); + } + const registeredResourceTemplate = this._createRegisteredResourceTemplate(name, void 0, uriOrTemplate, metadata, readCallback); + this.setResourceRequestHandlers(); + this.sendResourceListChanged(); + return registeredResourceTemplate; + } + } + registerResource(name, uriOrTemplate, config2, readCallback) { + if (typeof uriOrTemplate === "string") { + if (this._registeredResources[uriOrTemplate]) { + throw new Error(`Resource ${uriOrTemplate} is already registered`); + } + const registeredResource = this._createRegisteredResource(name, config2.title, uriOrTemplate, config2, readCallback); + this.setResourceRequestHandlers(); + this.sendResourceListChanged(); + return registeredResource; + } else { + if (this._registeredResourceTemplates[name]) { + throw new Error(`Resource template ${name} is already registered`); + } + const registeredResourceTemplate = this._createRegisteredResourceTemplate(name, config2.title, uriOrTemplate, config2, readCallback); + this.setResourceRequestHandlers(); + this.sendResourceListChanged(); + return registeredResourceTemplate; + } + } + _createRegisteredResource(name, title, uri, metadata, readCallback) { + const registeredResource = { + name, + title, + metadata, + readCallback, + enabled: true, + disable: () => registeredResource.update({ enabled: false }), + enable: () => registeredResource.update({ enabled: true }), + remove: () => registeredResource.update({ uri: null }), + update: (updates) => { + if (typeof updates.uri !== "undefined" && updates.uri !== uri) { + delete this._registeredResources[uri]; + if (updates.uri) + this._registeredResources[updates.uri] = registeredResource; + } + if (typeof updates.name !== "undefined") + registeredResource.name = updates.name; + if (typeof updates.title !== "undefined") + registeredResource.title = updates.title; + if (typeof updates.metadata !== "undefined") + registeredResource.metadata = updates.metadata; + if (typeof updates.callback !== "undefined") + registeredResource.readCallback = updates.callback; + if (typeof updates.enabled !== "undefined") + registeredResource.enabled = updates.enabled; + this.sendResourceListChanged(); + } + }; + this._registeredResources[uri] = registeredResource; + return registeredResource; + } + _createRegisteredResourceTemplate(name, title, template, metadata, readCallback) { + const registeredResourceTemplate = { + resourceTemplate: template, + title, + metadata, + readCallback, + enabled: true, + disable: () => registeredResourceTemplate.update({ enabled: false }), + enable: () => registeredResourceTemplate.update({ enabled: true }), + remove: () => registeredResourceTemplate.update({ name: null }), + update: (updates) => { + if (typeof updates.name !== "undefined" && updates.name !== name) { + delete this._registeredResourceTemplates[name]; + if (updates.name) + this._registeredResourceTemplates[updates.name] = registeredResourceTemplate; + } + if (typeof updates.title !== "undefined") + registeredResourceTemplate.title = updates.title; + if (typeof updates.template !== "undefined") + registeredResourceTemplate.resourceTemplate = updates.template; + if (typeof updates.metadata !== "undefined") + registeredResourceTemplate.metadata = updates.metadata; + if (typeof updates.callback !== "undefined") + registeredResourceTemplate.readCallback = updates.callback; + if (typeof updates.enabled !== "undefined") + registeredResourceTemplate.enabled = updates.enabled; + this.sendResourceListChanged(); + } + }; + this._registeredResourceTemplates[name] = registeredResourceTemplate; + const variableNames = template.uriTemplate.variableNames; + const hasCompleter = Array.isArray(variableNames) && variableNames.some((v) => !!template.completeCallback(v)); + if (hasCompleter) { + this.setCompletionRequestHandler(); + } + return registeredResourceTemplate; + } + _createRegisteredPrompt(name, title, description, argsSchema, callback) { + const registeredPrompt = { + title, + description, + argsSchema: argsSchema === void 0 ? void 0 : objectFromShape(argsSchema), + callback, + enabled: true, + disable: () => registeredPrompt.update({ enabled: false }), + enable: () => registeredPrompt.update({ enabled: true }), + remove: () => registeredPrompt.update({ name: null }), + update: (updates) => { + if (typeof updates.name !== "undefined" && updates.name !== name) { + delete this._registeredPrompts[name]; + if (updates.name) + this._registeredPrompts[updates.name] = registeredPrompt; + } + if (typeof updates.title !== "undefined") + registeredPrompt.title = updates.title; + if (typeof updates.description !== "undefined") + registeredPrompt.description = updates.description; + if (typeof updates.argsSchema !== "undefined") + registeredPrompt.argsSchema = objectFromShape(updates.argsSchema); + if (typeof updates.callback !== "undefined") + registeredPrompt.callback = updates.callback; + if (typeof updates.enabled !== "undefined") + registeredPrompt.enabled = updates.enabled; + this.sendPromptListChanged(); + } + }; + this._registeredPrompts[name] = registeredPrompt; + if (argsSchema) { + const hasCompletable = Object.values(argsSchema).some((field) => { + const inner = field instanceof ZodOptional2 ? field._def?.innerType : field; + return isCompletable(inner); + }); + if (hasCompletable) { + this.setCompletionRequestHandler(); + } + } + return registeredPrompt; + } + _createRegisteredTool(name, title, description, inputSchema, outputSchema, annotations, execution, _meta, handler) { + validateAndWarnToolName(name); + const registeredTool = { + title, + description, + inputSchema: getZodSchemaObject(inputSchema), + outputSchema: getZodSchemaObject(outputSchema), + annotations, + execution, + _meta, + handler, + enabled: true, + disable: () => registeredTool.update({ enabled: false }), + enable: () => registeredTool.update({ enabled: true }), + remove: () => registeredTool.update({ name: null }), + update: (updates) => { + if (typeof updates.name !== "undefined" && updates.name !== name) { + if (typeof updates.name === "string") { + validateAndWarnToolName(updates.name); + } + delete this._registeredTools[name]; + if (updates.name) + this._registeredTools[updates.name] = registeredTool; + } + if (typeof updates.title !== "undefined") + registeredTool.title = updates.title; + if (typeof updates.description !== "undefined") + registeredTool.description = updates.description; + if (typeof updates.paramsSchema !== "undefined") + registeredTool.inputSchema = objectFromShape(updates.paramsSchema); + if (typeof updates.outputSchema !== "undefined") + registeredTool.outputSchema = objectFromShape(updates.outputSchema); + if (typeof updates.callback !== "undefined") + registeredTool.handler = updates.callback; + if (typeof updates.annotations !== "undefined") + registeredTool.annotations = updates.annotations; + if (typeof updates._meta !== "undefined") + registeredTool._meta = updates._meta; + if (typeof updates.enabled !== "undefined") + registeredTool.enabled = updates.enabled; + this.sendToolListChanged(); + } + }; + this._registeredTools[name] = registeredTool; + this.setToolRequestHandlers(); + this.sendToolListChanged(); + return registeredTool; + } + /** + * tool() implementation. Parses arguments passed to overrides defined above. + */ + tool(name, ...rest) { + if (this._registeredTools[name]) { + throw new Error(`Tool ${name} is already registered`); + } + let description; + let inputSchema; + let outputSchema; + let annotations; + if (typeof rest[0] === "string") { + description = rest.shift(); + } + if (rest.length > 1) { + const firstArg = rest[0]; + if (isZodRawShapeCompat(firstArg)) { + inputSchema = rest.shift(); + if (rest.length > 1 && typeof rest[0] === "object" && rest[0] !== null && !isZodRawShapeCompat(rest[0])) { + annotations = rest.shift(); + } + } else if (typeof firstArg === "object" && firstArg !== null) { + if (Object.values(firstArg).some((v) => typeof v === "object" && v !== null)) { + throw new Error(`Tool ${name} expected a Zod schema or ToolAnnotations, but received an unrecognized object`); + } + annotations = rest.shift(); + } + } + const callback = rest[0]; + return this._createRegisteredTool(name, void 0, description, inputSchema, outputSchema, annotations, { taskSupport: "forbidden" }, void 0, callback); + } + /** + * Registers a tool with a config object and callback. + */ + registerTool(name, config2, cb) { + if (this._registeredTools[name]) { + throw new Error(`Tool ${name} is already registered`); + } + const { title, description, inputSchema, outputSchema, annotations, _meta } = config2; + return this._createRegisteredTool(name, title, description, inputSchema, outputSchema, annotations, { taskSupport: "forbidden" }, _meta, cb); + } + prompt(name, ...rest) { + if (this._registeredPrompts[name]) { + throw new Error(`Prompt ${name} is already registered`); + } + let description; + if (typeof rest[0] === "string") { + description = rest.shift(); + } + let argsSchema; + if (rest.length > 1) { + argsSchema = rest.shift(); + } + const cb = rest[0]; + const registeredPrompt = this._createRegisteredPrompt(name, void 0, description, argsSchema, cb); + this.setPromptRequestHandlers(); + this.sendPromptListChanged(); + return registeredPrompt; + } + /** + * Registers a prompt with a config object and callback. + */ + registerPrompt(name, config2, cb) { + if (this._registeredPrompts[name]) { + throw new Error(`Prompt ${name} is already registered`); + } + const { title, description, argsSchema } = config2; + const registeredPrompt = this._createRegisteredPrompt(name, title, description, argsSchema, cb); + this.setPromptRequestHandlers(); + this.sendPromptListChanged(); + return registeredPrompt; + } + /** + * Checks if the server is connected to a transport. + * @returns True if the server is connected + */ + isConnected() { + return this.server.transport !== void 0; + } + /** + * Sends a logging message to the client, if connected. + * Note: You only need to send the parameters object, not the entire JSON RPC message + * @see LoggingMessageNotification + * @param params + * @param sessionId optional for stateless and backward compatibility + */ + async sendLoggingMessage(params, sessionId) { + return this.server.sendLoggingMessage(params, sessionId); + } + /** + * Sends a resource list changed event to the client, if connected. + */ + sendResourceListChanged() { + if (this.isConnected()) { + this.server.sendResourceListChanged(); + } + } + /** + * Sends a tool list changed event to the client, if connected. + */ + sendToolListChanged() { + if (this.isConnected()) { + this.server.sendToolListChanged(); + } + } + /** + * Sends a prompt list changed event to the client, if connected. + */ + sendPromptListChanged() { + if (this.isConnected()) { + this.server.sendPromptListChanged(); + } + } +}; +var EMPTY_OBJECT_JSON_SCHEMA = { + type: "object", + properties: {} +}; +function isZodTypeLike(value) { + return value !== null && typeof value === "object" && "parse" in value && typeof value.parse === "function" && "safeParse" in value && typeof value.safeParse === "function"; +} +function isZodSchemaInstance(obj) { + return "_def" in obj || "_zod" in obj || isZodTypeLike(obj); +} +function isZodRawShapeCompat(obj) { + if (typeof obj !== "object" || obj === null) { + return false; + } + if (isZodSchemaInstance(obj)) { + return false; + } + if (Object.keys(obj).length === 0) { + return true; + } + return Object.values(obj).some(isZodTypeLike); +} +function getZodSchemaObject(schema) { + if (!schema) { + return void 0; + } + if (isZodRawShapeCompat(schema)) { + return objectFromShape(schema); + } + if (!isZodSchemaInstance(schema)) { + throw new Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object"); + } + return schema; +} +function promptArgumentsFromSchema(schema) { + const shape = getObjectShape(schema); + if (!shape) + return []; + return Object.entries(shape).map(([name, field]) => { + const description = getSchemaDescription(field); + const isOptional = isSchemaOptional(field); + return { + name, + description, + required: !isOptional + }; + }); +} +function getMethodValue(schema) { + const shape = getObjectShape(schema); + const methodSchema = shape?.method; + if (!methodSchema) { + throw new Error("Schema is missing a method literal"); + } + const value = getLiteralValue(methodSchema); + if (typeof value === "string") { + return value; + } + throw new Error("Schema method literal must be a string"); +} +function createCompletionResult(suggestions) { + return { + completion: { + values: suggestions.slice(0, 100), + total: suggestions.length, + hasMore: suggestions.length > 100 + } + }; +} +var EMPTY_COMPLETION_RESULT = { + completion: { + values: [], + hasMore: false + } +}; + +// src/tool.ts +var import__ = __toESM(require__(), 1); + +// src/client.ts +var DEFAULT_CLIENT_FETCH_TIMEOUT_MS = 32e3; +var CLIENT_FETCH_TIMEOUT_MS_ENV = "TRAILBLAZE_CLIENT_FETCH_TIMEOUT_MS"; +function resolveClientFetchTimeoutMs() { + const rawValue = globalThis.process?.env?.[CLIENT_FETCH_TIMEOUT_MS_ENV]; + if (rawValue == null || rawValue.trim() === "") { + return DEFAULT_CLIENT_FETCH_TIMEOUT_MS; + } + const parsed = Number.parseInt(rawValue, 10); + if (!Number.isFinite(parsed) || parsed <= 0) { + return DEFAULT_CLIENT_FETCH_TIMEOUT_MS; + } + return parsed; +} +var CLIENT_FETCH_TIMEOUT_MS = resolveClientFetchTimeoutMs(); +function createClient(ctx) { + const dispatch = (name, args) => callTool(ctx, name, args); + const impl = { + callTool: dispatch, + tools: createToolsProxy(dispatch) + }; + return impl; +} +var SCRIPT_OVERLOAD_TOOLS = /* @__PURE__ */ new Set(["web_evaluate"]); +function buildScriptOverloadArgs(toolName, firstArg, rest) { + if (typeof firstArg === "function") { + const fnSrc = firstArg.toString(); + const argsJson = JSON.stringify(rest); + return { script: `(${fnSrc}).apply(null, ${argsJson})` }; + } + if (typeof firstArg === "string") { + return { script: firstArg }; + } + if (firstArg !== null && typeof firstArg === "object") { + return firstArg; + } + throw new Error( + `client.tools.${toolName}: expected a function, script string, or { script } object as the first argument; got ${firstArg === null ? "null" : typeof firstArg}.` + ); +} +var TOOLS_PROXY_RESERVED_PROPS = /* @__PURE__ */ new Set([ + // Thenable detection — the critical one. Without this, `await client.tools` (or any + // value-coercion path) reads `.then`, gets back a fn, calls it, and dispatches a + // `callTool("then", { ... })` to the daemon. Has bitten Proxy-as-namespace patterns in + // multiple SDKs. + "then", + "catch", + "finally", + // Object-protocol introspection — `client.tools.constructor.name`, `String(client.tools)`, + // `+client.tools`, `JSON.stringify(client.tools)`, `Object.getPrototypeOf(...)`, etc. All + // would otherwise resolve to a tool dispatcher. + "constructor", + "prototype", + "__proto__", + "toString", + "valueOf", + "toJSON" +]); +function createToolsProxy(callToolImpl) { + return new Proxy({}, { + get(_target, prop, _receiver) { + if (typeof prop !== "string") return void 0; + if (TOOLS_PROXY_RESERVED_PROPS.has(prop)) return void 0; + if (prop.trim() === "") { + throw new Error( + `client.tools[${JSON.stringify(prop)}]: tool name must not be empty or whitespace-only.` + ); + } + if (SCRIPT_OVERLOAD_TOOLS.has(prop)) { + const toolName = prop; + return async (firstArg, ...rest) => { + const args = buildScriptOverloadArgs(toolName, firstArg, rest); + const envelope = await callToolImpl(toolName, args); + return _unwrapToolResult(envelope); + }; + } + return async (args) => { + const envelope = await callToolImpl(prop, args ?? {}); + return _unwrapToolResult(envelope); + }; + } + }); +} +function _unwrapToolResult(envelope) { + if (envelope.structuredContent !== void 0 && envelope.structuredContent !== null) { + return envelope.structuredContent; + } + return envelope.textContent; +} +async function callTool(ctx, name, args) { + if (ctx === void 0) { + throw new Error( + `trailblaze.client.callTool("${name}") requires a TrailblazeContext envelope, but the tool was invoked without one. This usually means the tool is being called outside a live Trailblaze session (ad-hoc MCP client, unit test). Check that the invoking environment injects \`_meta.trailblaze\` on \`tools/call\`.` + ); + } + const request = { + version: 1, + session_id: ctx.sessionId, + invocation_id: ctx.invocationId, + action: { + type: "call_tool", + tool_name: name, + // Per the wire contract — `arguments_json` is a JSON STRING (not a nested object). Keeps + // tool schemas Kotlin-authoritative and avoids round-trip drift when args have non-trivial + // structure (numbers vs. strings etc.). + arguments_json: JSON.stringify(args) + } + }; + if (ctx.runtime === "ondevice" && hasInProcessBinding()) { + return dispatchViaInProcessBinding(request, name); + } + if (!ctx.baseUrl) { + throw new Error( + `trailblaze.client.callTool("${name}") requires a ctx.baseUrl (HTTP path) or ctx.runtime="ondevice" + globalThis.__trailblazeCallback (in-process path), but neither was available. Check that the Trailblaze runtime populated the envelope correctly \u2014 in tests, inject a valid \`_meta.trailblaze\`.` + ); + } + return dispatchViaHttp(request, name, ctx.baseUrl); +} +function hasInProcessBinding() { + return typeof globalThis.__trailblazeCallback === "function"; +} +async function dispatchViaInProcessBinding(request, toolName) { + const binding = globalThis.__trailblazeCallback; + if (typeof binding !== "function") { + throw new Error( + `trailblaze.client.callTool("${toolName}") picked the in-process transport but globalThis.__trailblazeCallback isn't installed. This should never happen in a real bundle runtime \u2014 report as a Trailblaze bug.` + ); + } + let responseJson; + try { + responseJson = await binding(JSON.stringify(request)); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + throw new Error( + `trailblaze.client.callTool("${toolName}") in-process binding threw: ${message}` + ); + } + let envelope; + try { + envelope = JSON.parse(responseJson); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + throw new Error( + `trailblaze.client.callTool("${toolName}") failed to parse in-process binding response as JSON: ${message}` + ); + } + return unwrapCallbackResponse(envelope, toolName, "__trailblazeCallback"); +} +async function dispatchViaHttp(request, toolName, baseUrl) { + let url2; + try { + url2 = new URL("/scripting/callback", baseUrl).toString(); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + throw new Error( + `trailblaze.client.callTool("${toolName}") failed to build request URL from baseUrl "${baseUrl}": ${message}` + ); + } + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), CLIENT_FETCH_TIMEOUT_MS); + let response; + try { + response = await fetch(url2, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(request), + signal: controller.signal + }); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + if (e instanceof DOMException && e.name === "AbortError") { + throw new Error( + `trailblaze.client.callTool("${toolName}") aborted after ${CLIENT_FETCH_TIMEOUT_MS}ms waiting for ${url2}` + ); + } + throw new Error(`trailblaze.client.callTool("${toolName}") fetch failed: ${message}`); + } finally { + clearTimeout(timer); + } + if (!response.ok) { + const body = await safeReadText(response); + throw new Error( + `trailblaze.client.callTool("${toolName}") HTTP ${response.status} from ${url2}: ${body}` + ); + } + let envelope; + try { + envelope = await response.json(); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + throw new Error( + `trailblaze.client.callTool("${toolName}") failed to parse response body as JSON: ${message}` + ); + } + return unwrapCallbackResponse(envelope, toolName, url2); +} +function unwrapCallbackResponse(envelope, toolName, source) { + const result = envelope?.result; + if (result == null) { + throw new Error( + `trailblaze.client.callTool("${toolName}") response from ${source} is missing the "result" field \u2014 expected a JsScriptingCallbackResponse, got: ${JSON.stringify(envelope)}` + ); + } + if (typeof result !== "object") { + throw new Error( + `trailblaze.client.callTool("${toolName}") response from ${source} has a non-object "result" (got ${typeof result}) \u2014 expected a JsScriptingCallbackResult variant: ${JSON.stringify(envelope)}` + ); + } + if (result.type === "error") { + throw new Error( + `trailblaze.client.callTool("${toolName}") callback error from ${source}: ${result.message}` + ); + } + if (!result.success) { + throw new Error( + `trailblaze.client.callTool("${toolName}") tool failed: ${result.error_message || "(no message)"}` + ); + } + return { + success: true, + textContent: result.text_content, + errorMessage: result.error_message, + structuredContent: result.structured_content + }; +} +async function safeReadText(response) { + try { + return await response.text(); + } catch { + return "(could not read response body)"; + } +} + +// src/logger.ts +function createLogger(server, toolName) { + const emit = (level, message, fields) => { + const mcpLevel = level === "warn" ? "warning" : level; + const data = fields ? { message, fields } : message; + void server.sendLoggingMessage({ level: mcpLevel, data, logger: toolName }).catch(() => { + }); + const prefix = `[${toolName}] [${level}] ${message}`; + const suffix = fields ? " " + safeStringify(fields) : ""; + console.error(prefix + suffix); + }; + return { + debug: (message, fields) => emit("debug", message, fields), + info: (message, fields) => emit("info", message, fields), + warn: (message, fields) => emit("warn", message, fields), + error: (message, fields) => emit("error", message, fields) + }; +} +var noopLogger = { + debug: () => { + }, + info: () => { + }, + warn: () => { + }, + error: () => { + } +}; +function safeStringify(value) { + try { + return JSON.stringify(value); + } catch { + return String(value); + } +} + +// src/memory.ts +var DRAIN_DELTA = /* @__PURE__ */ Symbol.for("trailblaze.memory.drainDelta"); +var META_KEY_TRAILBLAZE = "trailblaze"; +var META_KEY_MEMORY = "memory"; +var META_KEY_MEMORY_DELTA = "memoryDelta"; +var META_KEY_MEMORY_DELETIONS = "memoryDeletions"; +var INTERPOLATE_PATTERNS = [ + /\$\{([^}]+)\}/g, + /\{\{([^}]+)\}\}/g +]; +function createMemory(snapshot) { + const frozenSnapshot = new Map( + snapshot ? Object.entries(snapshot).filter( + // Defensive — the snapshot is supposed to be `Record<string, string>` from the + // Kotlin side, but `fromMeta` receives raw JSON. Skip non-string values rather + // than coercing so a producer-side bug surfaces as a missing key instead of a + // silently corrupted value. + ([, v]) => typeof v === "string" + ) : [] + ); + const DELETED = /* @__PURE__ */ Symbol("deleted"); + const buffer = /* @__PURE__ */ new Map(); + const get = (key) => { + if (buffer.has(key)) { + const v = buffer.get(key); + return v === DELETED ? void 0 : v; + } + return frozenSnapshot.get(key); + }; + const has = (key) => { + if (buffer.has(key)) return buffer.get(key) !== DELETED; + return frozenSnapshot.has(key); + }; + const set2 = (key, value) => { + buffer.set(key, value); + }; + const del = (key) => { + buffer.set(key, DELETED); + }; + const keys = () => { + const visible = new Set(frozenSnapshot.keys()); + buffer.forEach((v, k) => { + if (v === DELETED) visible.delete(k); + else visible.add(k); + }); + return [...visible]; + }; + const interpolate = (template) => { + let result = template; + for (const pattern of INTERPOLATE_PATTERNS) { + const re = new RegExp(pattern.source, "g"); + result = result.replace(re, (_match, name) => get(name) ?? ""); + } + return result; + }; + const setJson = (key, value) => { + const serialized = JSON.stringify(value); + if (serialized === void 0) { + del(key); + return; + } + set2(key, serialized); + }; + const getJson = (key) => { + const raw = get(key); + if (raw === void 0) return void 0; + try { + return JSON.parse(raw); + } catch { + return void 0; + } + }; + const drainDelta = () => { + const sets = /* @__PURE__ */ Object.create(null); + const deletions = []; + buffer.forEach((v, k) => { + if (v === DELETED) { + if (frozenSnapshot.has(k)) deletions.push(k); + } else if (frozenSnapshot.get(k) !== v) { + sets[k] = v; + } + }); + return { sets, deletions }; + }; + const toJSON = () => { + const out = {}; + frozenSnapshot.forEach((v, k) => { + out[k] = v; + }); + buffer.forEach((v, k) => { + if (v === DELETED) delete out[k]; + else out[k] = v; + }); + return out; + }; + const memory = { + get, + set: set2, + has, + keys, + delete: del, + interpolate, + setJson, + getJson, + [DRAIN_DELTA]: drainDelta, + toJSON + }; + return memory; +} + +// src/context.ts +var VALID_PLATFORMS = /* @__PURE__ */ new Set(["ios", "android", "web"]); +function fromMeta(meta3, logger) { + if (typeof meta3 !== "object" || meta3 === null) return void 0; + const bag = meta3; + const envelope = bag[META_KEY_TRAILBLAZE]; + if (typeof envelope !== "object" || envelope === null) return void 0; + const tb = envelope; + const sessionId = tb["sessionId"]; + const invocationId = tb["invocationId"]; + if (typeof sessionId !== "string" || typeof invocationId !== "string") return void 0; + const baseUrl = typeof tb["baseUrl"] === "string" ? tb["baseUrl"] : void 0; + const runtimeRaw = tb["runtime"]; + const runtime = runtimeRaw === "ondevice" ? "ondevice" : void 0; + const deviceBag = tb["device"]; + if (typeof deviceBag !== "object" || deviceBag === null) return void 0; + const deviceRecord = deviceBag; + const platformRaw = deviceRecord["platform"]; + if (typeof platformRaw !== "string" || !VALID_PLATFORMS.has(platformRaw)) { + return void 0; + } + const widthPixels = deviceRecord["widthPixels"]; + const heightPixels = deviceRecord["heightPixels"]; + const driverType = deviceRecord["driverType"]; + if (typeof widthPixels !== "number" || typeof heightPixels !== "number" || typeof driverType !== "string") { + return void 0; + } + const memoryBag = tb[META_KEY_MEMORY]; + const memorySnapshot = typeof memoryBag === "object" && memoryBag !== null ? memoryBag : void 0; + const memory = createMemory(memorySnapshot); + const target = parseTarget(tb["target"]); + return { + baseUrl, + runtime, + sessionId, + invocationId, + device: { + platform: platformRaw, + widthPixels, + heightPixels, + driverType + }, + target, + memory, + logger: logger ?? noopLogger + }; +} +function parseTarget(raw) { + if (typeof raw !== "object" || raw === null) return void 0; + const bag = raw; + const id = bag["id"]; + const appIdsRaw = bag["appIds"]; + if (typeof id !== "string" || !Array.isArray(appIdsRaw)) return void 0; + if (!appIdsRaw.every((entry) => typeof entry === "string")) return void 0; + const appIds = appIdsRaw; + const displayName = typeof bag["displayName"] === "string" ? bag["displayName"] : void 0; + const appId = typeof bag["appId"] === "string" ? bag["appId"] : void 0; + const resolvedBaseUrl = typeof bag["resolvedBaseUrl"] === "string" ? bag["resolvedBaseUrl"] : void 0; + const baseUrlsRaw = bag["baseUrls"]; + const baseUrls = Array.isArray(baseUrlsRaw) && baseUrlsRaw.every((entry) => typeof entry === "string") ? baseUrlsRaw : void 0; + const resolveAppId = (options) => { + const fromTarget = appId || appIds[0]; + if (typeof fromTarget === "string" && fromTarget.length > 0) return fromTarget; + const fallback = options?.defaultAppId?.trim(); + return fallback && fallback.length > 0 ? fallback : void 0; + }; + const resolveBaseUrl = (options) => { + const fromTarget = resolvedBaseUrl || baseUrls && baseUrls[0]; + if (typeof fromTarget === "string" && fromTarget.length > 0) return fromTarget; + const fallback = options?.defaultBaseUrl?.trim(); + return fallback && fallback.length > 0 ? fallback : void 0; + }; + const target = { + id, + displayName, + appIds, + appId, + baseUrls, + resolvedBaseUrl, + resolveAppId, + resolveBaseUrl + }; + return target; +} + +// src/tool.ts +var pendingTools = []; +function defineTypedTool(handler, inputSchema) { + if (typeof handler !== "function") { + throw new TypeError( + "trailblaze.tool<I, O>(handler): argument must be a function. Got: " + (handler == null ? String(handler) : typeof handler) + "." + ); + } + let validator = null; + if (inputSchema != null) { + try { + validator = ajv.compile(inputSchema); + } catch (e) { + const reason = e instanceof Error ? e.message : String(e); + console.warn( + `[trailblaze.tool] typed tool: ajv schema compile failed (${reason}). The tool will dispatch without input validation. Fix the inputSchema in the spec and re-run.` + ); + } + } + return async (args, legacyCtx, client) => { + const validatedArgs = args != null && typeof args === "object" && !Array.isArray(args) ? args : {}; + if (validator != null && !validator(validatedArgs)) { + throw new TypedToolValidationError(validator.errors ?? []); + } + const memory = legacyCtx?.memory ?? createMemory(void 0); + const toolContext = { tools: client.tools, memory, target: legacyCtx?.target }; + return handler(validatedArgs, toolContext); + }; +} +var TypedToolValidationError = class extends Error { + constructor(ajvErrors) { + super(`Invalid arguments: ${formatAjvErrors(ajvErrors)}`); + this.ajvErrors = ajvErrors; + this.name = "ValidationError"; + } +}; +var MAX_STACK_LENGTH = 16384; +var ajv = new import__.Ajv2020({ + allErrors: true, + strict: false, + useDefaults: true, + coerceTypes: false +}); +function formatAjvErrors(errors) { + return errors.map((e) => { + const path = e.instancePath.length > 0 ? e.instancePath : "(root)"; + return `${path}: ${e.message ?? "validation failed"}`; + }).join("; "); +} +function buildValidationErrorEnvelope(toolName, errors) { + return { + isError: true, + content: [ + { + type: "text", + text: `ValidationError: tool '${toolName}' received invalid arguments \u2014 ${formatAjvErrors(errors)}` + } + ] + }; +} +function specToJsonSchema(toolName, spec) { + const schema = spec.inputSchema; + if (schema == null) return null; + if (typeof schema.safeParse !== "function") return null; + try { + return external_exports3.toJSONSchema(schema); + } catch (e) { + const reason = e instanceof Error ? e.message : String(e); + console.warn( + `[trailblaze.tool] tool '${toolName}': skipping ajv validation \u2014 zod schema could not be lowered to JSON Schema (${reason}). The tool will dispatch without input validation. To enable validation, replace the inputSchema with a shape zod's toJSONSchema can serialize.` + ); + return null; + } +} +function tool(arg0, arg1, arg2) { + if (typeof arg0 === "function") { + return defineTypedTool( + arg0 + ); + } + if (typeof arg0 === "object" && arg0 !== null && !Array.isArray(arg0) && typeof arg1 === "function" && arg2 === void 0) { + const specObj = arg0; + const inlineSchema = specObj.inputSchema && typeof specObj.inputSchema === "object" && !Array.isArray(specObj.inputSchema) ? specObj.inputSchema : void 0; + return defineTypedTool( + arg1, + inlineSchema + ); + } + pendingTools.push({ + name: arg0, + spec: arg1, + handler: arg2 + }); +} +function registerPendingTools(server) { + while (pendingTools.length > 0) { + const pending = pendingTools.shift(); + const preparedSpec = withPassthroughInputSchema(pending.spec); + const jsonSchema = specToJsonSchema(pending.name, preparedSpec); + let validator = null; + if (jsonSchema != null) { + try { + validator = ajv.compile(jsonSchema); + } catch (e) { + const reason = e instanceof Error ? e.message : String(e); + console.warn( + `[trailblaze.tool] tool '${pending.name}': ajv schema compile failed (${reason}). The tool will dispatch without input validation. Fix the schema and restart the daemon to re-enable validation.` + ); + } + } + server.registerTool( + pending.name, + preparedSpec, + (async (args, extra) => { + const logger = createLogger(server, pending.name); + try { + const validatedArgs = args != null && typeof args === "object" && !Array.isArray(args) ? args : {}; + if (validator != null && !validator(validatedArgs)) { + const errs = validator.errors ?? []; + logger.warn( + `input validation failed: ${formatAjvErrors(errs)}` + ); + return buildValidationErrorEnvelope(pending.name, errs); + } + const meta3 = extractMeta(extra); + const ctx = fromMeta(meta3, logger); + const client = createClient(ctx); + const result = await Promise.resolve(pending.handler(validatedArgs, ctx, client)); + return attachMemoryDelta(result, ctx); + } catch (e) { + const isErrorObj = e instanceof Error; + let errName = "Error"; + if (isErrorObj) { + try { + const n = e.name; + if (typeof n === "string" && n.length > 0) errName = n; + } catch { + } + } + let errMessage; + try { + errMessage = isErrorObj ? e.message : String(e); + } catch { + errMessage = "<unstringifiable thrown value>"; + } + if (errMessage === void 0 || errMessage === null) { + errMessage = String(errMessage); + } + let envelopeText = `${errName}: ${errMessage}`; + if (isErrorObj) { + try { + const stack = e.stack; + if (typeof stack === "string" && stack.length > 0) { + const headerWithMessage = `${errName}: ${errMessage}`; + const headerBareName = errName; + let framesOnly = stack; + if (stack.startsWith(headerWithMessage)) { + framesOnly = stack.slice(headerWithMessage.length).replace(/^\r?\n/, ""); + } else if (errMessage.length === 0 && stack.startsWith(headerBareName + "\n")) { + framesOnly = stack.slice(headerBareName.length).replace(/^\r?\n/, ""); + } + const combined = framesOnly.length > 0 ? `${envelopeText} +${framesOnly}` : envelopeText; + envelopeText = combined.length > MAX_STACK_LENGTH ? `${combined.slice(0, MAX_STACK_LENGTH)} +...[stack truncated]` : combined; + } + } catch { + } + } + return { + isError: true, + content: [{ type: "text", text: envelopeText }] + }; + } + }) + ); + } +} +function attachMemoryDelta(result, ctx) { + if (ctx === void 0) return result; + const drainable = ctx.memory; + if (typeof drainable[DRAIN_DELTA] !== "function") return result; + const delta = drainable[DRAIN_DELTA](); + const setKeys = Object.keys(delta.sets); + if (setKeys.length === 0 && delta.deletions.length === 0) return result; + const trailblaze2 = {}; + if (setKeys.length > 0) trailblaze2[META_KEY_MEMORY_DELTA] = delta.sets; + if (delta.deletions.length > 0) trailblaze2[META_KEY_MEMORY_DELETIONS] = delta.deletions; + if (typeof result !== "object" || result === null) { + const wrapped = { + content: result === void 0 || result === null ? [] : [{ type: "text", text: typeof result === "string" ? result : JSON.stringify(result) }], + _meta: { [META_KEY_TRAILBLAZE]: trailblaze2 } + }; + return wrapped; + } + const resultRecord = result; + const existingMeta = typeof resultRecord["_meta"] === "object" && resultRecord["_meta"] !== null ? resultRecord["_meta"] : {}; + const existingTrailblaze = typeof existingMeta[META_KEY_TRAILBLAZE] === "object" && existingMeta[META_KEY_TRAILBLAZE] !== null ? existingMeta[META_KEY_TRAILBLAZE] : {}; + const merged = { ...existingTrailblaze, ...trailblaze2 }; + return { + ...resultRecord, + _meta: { ...existingMeta, [META_KEY_TRAILBLAZE]: merged } + }; +} +function extractMeta(extra) { + if (typeof extra !== "object" || extra === null) return void 0; + const bag = extra; + const request = bag["request"]; + if (typeof request === "object" && request !== null) { + const params = request["params"]; + if (typeof params === "object" && params !== null) { + return params["_meta"]; + } + } + return bag["_meta"]; +} +function withPassthroughInputSchema(spec) { + const schema = spec.inputSchema; + if (!isRawShape(schema)) return spec; + return { ...spec, inputSchema: external_exports3.object(schema).passthrough() }; +} +function isRawShape(schema) { + if (typeof schema !== "object" || schema === null || Array.isArray(schema)) return false; + if (schema.safeParse != null) return false; + for (const key of Object.keys(schema)) { + const value = schema[key]; + if (value === void 0) continue; + if (typeof value !== "object" || value === null || value.safeParse == null) { + return false; + } + } + return true; +} + +// src/run.ts +function installConsoleLogStdoutGuard() { + const onDeviceBundleRuntime = typeof globalThis.__trailblazeCallback === "function"; + if (onDeviceBundleRuntime) return; + const maybeErr = globalThis.console?.error; + if (typeof maybeErr !== "function") return; + const err = maybeErr.bind(console); + console.log = (...args) => { + err(...args); + }; +} +var IN_PROCESS_TRANSPORT_GLOBAL = "__trailblazeInProcessTransport"; +async function pickTransport() { + const inProcess = globalThis[IN_PROCESS_TRANSPORT_GLOBAL]; + if (inProcess != null) { + const t = inProcess; + if (typeof t.start === "function" && typeof t.send === "function" && typeof t.close === "function") { + return t; + } + throw new Error( + `globalThis.${IN_PROCESS_TRANSPORT_GLOBAL} is present but doesn't match the MCP Transport interface (start/send/close required). This usually means a Trailblaze/MCP SDK version mismatch \u2014 report as a bug.` + ); + } + const { StdioServerTransport } = await import("@modelcontextprotocol/sdk/server/stdio.js"); + return new StdioServerTransport(); +} +async function run(options = {}) { + installConsoleLogStdoutGuard(); + const server = new McpServer( + { name: options.name ?? "trailblaze-scripting-sdk", version: options.version ?? "0.1.0" }, + { capabilities: { tools: {} } } + ); + registerPendingTools(server); + await server.connect(await pickTransport()); +} + +// src/view-hierarchy.ts +var SELECTOR_REGISTRY = /* @__PURE__ */ Symbol("trailblaze.viewHierarchy.selectorRegistry"); +async function captureViewHierarchy(client, selectors2) { + const ownedSelectors = selectors2.slice(); + const resolved = await resolveSelectors(client, ownedSelectors); + return buildSnapshot(resolved, ownedSelectors); +} +async function reCaptureViewHierarchy(client, base) { + const tagged = base; + const selectors2 = tagged[SELECTOR_REGISTRY]; + if (!selectors2) { + throw new Error( + "reCaptureViewHierarchy: cannot refresh this snapshot \u2014 it wasn't built via captureViewHierarchy(). The refresh path is only used by callers that need a verify snapshot AFTER a state-mutating action (e.g. runConditionalActions's postcondition check). Either build the snapshot via captureViewHierarchy(client, [...selectors]) so the framework can refresh it, or skip postcondition-style verification." + ); + } + return captureViewHierarchy(client, selectors2); +} +async function resolveSelectors(client, selectors2) { + const entries = await Promise.all( + selectors2.map(async (selector) => { + const key = selectorKey(selector); + const matches = await client.tools.findMatches({ selector }); + return [key, matches]; + }) + ); + const map2 = /* @__PURE__ */ new Map(); + for (const [key, matches] of entries) { + map2.set(key, matches); + } + return map2; +} +function buildSnapshot(resolved, selectors2) { + const matchesFor = (selector) => { + const key = selectorKey(selector); + const matches = resolved.get(key); + if (matches === void 0) { + throw new Error( + `ViewHierarchy: selector ${JSON.stringify(selector)} was not pre-resolved. Add it to the selectors list passed to captureViewHierarchy(client, [...]).` + ); + } + return matches; + }; + const snap = { + visible(selector) { + return matchesFor(selector).length > 0; + }, + find(selector) { + const matches = matchesFor(selector); + return matches.length > 0 ? matches[0] : null; + }, + findAll(selector) { + return matchesFor(selector).slice(); + }, + [SELECTOR_REGISTRY]: selectors2 + }; + return snap; +} +function selectorKey(selector) { + return JSON.stringify(selector); +} + +// src/conditional-action.ts +var ConditionalActionFailedError = class _ConditionalActionFailedError extends Error { + constructor(conditionalActionId, message, cause = null) { + super(message); + this.name = "ConditionalActionFailedError"; + this.conditionalActionId = conditionalActionId; + this.cause = cause; + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, _ConditionalActionFailedError); + } + } +}; +async function runConditionalActions(client, conditionalActions, presnapshot) { + if (conditionalActions.length === 0) { + return { handled: [] }; + } + const snap = presnapshot ?? throwNoSnapshot(); + const applicable = conditionalActions.filter( + (c) => !evalPostcondition(c, snap) && evalCondition(c, snap) + ); + if (applicable.length === 0) { + return { handled: [] }; + } + const handled = []; + for (const c of applicable) { + await runAction(c); + if (c.postcondition) { + const verifySnap = await reCaptureViewHierarchy(client, snap); + if (!evalPostcondition(c, verifySnap)) { + throw new ConditionalActionFailedError( + c.id, + `postcondition not satisfied after action for ${describe3(c)}` + ); + } + } + handled.push(c.id); + } + return { handled }; +} +function describe3(c) { + if (c.description && c.description.length > 0) { + return `conditional "${c.id}" (${c.description})`; + } + return `conditional "${c.id}"`; +} +function evalCondition(c, snap) { + try { + return Boolean(c.condition(snap)); + } catch (e) { + throw new ConditionalActionFailedError( + c.id, + `condition predicate threw for ${describe3(c)}: ${formatError2(e)}`, + e + ); + } +} +function evalPostcondition(c, snap) { + if (!c.postcondition) return false; + try { + return Boolean(c.postcondition(snap)); + } catch (e) { + throw new ConditionalActionFailedError( + c.id, + `postcondition predicate threw for ${describe3(c)}: ${formatError2(e)}`, + e + ); + } +} +async function runAction(c) { + try { + await c.action(); + } catch (e) { + if (e instanceof ConditionalActionFailedError) throw e; + throw new ConditionalActionFailedError( + c.id, + `action threw for ${describe3(c)}: ${formatError2(e)}`, + e + ); + } +} +function formatError2(e) { + if (e instanceof Error) return e.message; + return String(e); +} +function throwNoSnapshot() { + throw new Error( + "runConditionalActions: presnapshot is required in Phase 2. Build one via `await captureViewHierarchy(client, [...selectors])` and pass it in, where the selectors are the ones your condition / postcondition predicates probe. See the `wikipedia_conditional_action_demo` example tool in the wikipedia trailmap for an end-to-end usage. The auto-acquire fallback lands when the host-side full-tree snapshot tool ships." + ); +} + +// src/generated/selectors.ts +var selectors = { + androidAccessibility: (args) => ({ androidAccessibility: args }), + androidMaestro: (args) => ({ androidMaestro: args }), + web: (args) => ({ web: args }), + compose: (args) => ({ compose: args }), + iosMaestro: (args) => ({ iosMaestro: args }), + iosAxe: (args) => ({ iosAxe: args }) +}; + +// src/index.ts +var trailblaze = { + tool, + run +}; +export { + ConditionalActionFailedError, + captureViewHierarchy, + fromMeta, + run, + runConditionalActions, + selectors, + tool, + trailblaze, + external_exports3 as z +}; diff --git a/examples/wikipedia/trails/.trailblaze/sdk/dist/testing.d.ts b/examples/wikipedia/trails/.trailblaze/sdk/dist/testing.d.ts new file mode 100644 index 000000000..786376d5b --- /dev/null +++ b/examples/wikipedia/trails/.trailblaze/sdk/dist/testing.d.ts @@ -0,0 +1,730 @@ +// Generated by dts-bundle-generator v9.5.1 + +/** + * Author-facing logger handed to scripted tools as `ctx.logger`. Methods are fire-and-forget; + * a failure to deliver the structured notification never throws into the calling tool. + * + * The optional `fields` argument is serialized into the MCP notification's `data.fields` and + * appended to the stderr line as JSON — gives authors a path to structured logging when the + * host wires it up, without forcing a different API shape today. + * + * @example + * ctx.logger.info("cache hit", { path: cachePath }); + * ctx.logger.warn("session stale, invalidating", { reason }); + * ctx.logger.error("merchant lookup failed", { key: resolvedKey }); + */ +export interface TrailblazeLogger { + debug(message: string, fields?: Record<string, unknown>): void; + info(message: string, fields?: Record<string, unknown>): void; + warn(message: string, fields?: Record<string, unknown>): void; + error(message: string, fields?: Record<string, unknown>): void; +} +/** + * The scripted-tool memory primitive. Authors read/write through the 8 methods; the SDK + * tracks the diff against an immutable inbound snapshot and flushes the buffered changes + * as `memoryDelta` / `memoryDeletions` on the tool result envelope when the handler + * returns successfully. + * + * **Read-your-own-writes.** `get`/`has`/`keys` reflect changes made earlier in the same + * handler invocation. A `set("k", "v")` immediately followed by `get("k")` returns + * `"v"`, even though the value hasn't been flushed back to the host yet. + * + * **Transactional.** Writes are committed to the host only when the handler returns a + * non-error result. Both failure shapes — a thrown exception AND an explicit + * `isError: true` result envelope — leave the host's memory exactly as it was before + * the call. The host-side guard sits at the dispatch boundary + * (`SubprocessTrailblazeTool.execute`), so the symmetric rollback is enforced + * regardless of which failure mode the handler picks. + */ +export interface TrailblazeMemory { + /** Returns the string value for [key], or undefined if absent. */ + get(key: string): string | undefined; + /** Sets [key] to [value]. Overwrites any prior value. */ + set(key: string, value: string): void; + /** Returns true if [key] is set (including by a prior `.set()` in this invocation). */ + has(key: string): boolean; + /** Snapshot of every currently-visible key. Order is not guaranteed. */ + keys(): readonly string[]; + /** Removes [key]. No-op if absent. */ + delete(key: string): void; + /** + * Replaces `{{var}}` and `${var}` tokens in [template] with their current values. + * Mirrors the Kotlin `AgentMemory.interpolateVariables` semantics: single-pass per + * pattern, unknown tokens resolve to empty string, the resolved string is NOT + * re-scanned for tokens that interpolate. + */ + interpolate(template: string): string; + /** + * Convenience for storing a typed JSON value. Serializes with `JSON.stringify` and + * stores the resulting string under [key]. The type parameter [T] is editor-time only; + * the runtime accepts any value `JSON.stringify` accepts. + * + * **Non-serializable values route through [delete].** `JSON.stringify` returns the + * runtime `undefined` for top-level `undefined`, functions, and symbols — writing + * that into the string-only buffer would silently desync `has` / `get` / wire. For + * those values [setJson] calls [delete] instead, so the host sees an explicit + * deletion rather than a phantom write. `null` is distinct: `JSON.stringify(null)` + * is the string `"null"`, which is stored verbatim. + */ + setJson<T>(key: string, value: T): void; + /** + * Convenience for retrieving a typed JSON value. Reads the string at [key] and runs + * `JSON.parse` on it. Returns undefined when the key is absent OR when the string + * isn't valid JSON — gracefully degrading rather than throwing keeps tools that fall + * back to a default value (`getJson<UserInfo>("user") ?? defaultUser`) terse. + * + * The type parameter [T] is editor-time only; no runtime schema validation. + */ + getJson<T = unknown>(key: string): T | undefined; +} +export interface TrailblazeDevice { + /** + * Coarse platform; useful for branching in cross-platform tools. Lowercase by convention on + * the envelope wire (`"ios" | "android" | "web"`) — distinct from the uppercase + * `TRAILBLAZE_DEVICE_PLATFORM` env var and the uppercase `trailblaze/supportedPlatforms` + * filter values, which are separate contracts. + */ + platform: "ios" | "android" | "web"; + widthPixels: number; + heightPixels: number; + /** The session's driver (`TrailblazeDriverType.yamlKey` on the Kotlin side). */ + driverType: string; +} +/** + * The session's resolved target — the trailmap manifest's `target.platforms.<platform>` + * data after the framework has consulted the connected device for which candidate + * to actually use. + * + * Populated on both the in-process QuickJS scripting path (`:trailblaze-scripting-bundle`, + * via `QuickJsToolEnvelopes`) and the MCP-subprocess path (via `TrailblazeContextEnvelope`'s + * `target` block). Absent only when the host session has no target (web-only sessions, + * scratch tools, unit-test fixtures) or when the daemon predates the `target` field — + * optional-chain (`ctx.target?.resolveAppId(...)`) so the same scripted tool body works + * either way. + * + * `resolveAppId` and `resolveBaseUrl` are **methods**, not data — injected onto the + * deserialized ctx object by `QuickJsToolHost` after JSON deserialization (since + * methods can't survive JSON round-trips). They consult the target's data fields + * (`appId` / `appIds` / `resolvedBaseUrl` / `baseUrls`) and apply a fixed + * priority order — see each method's kdoc. + */ +export interface TrailblazeTarget { + /** Trailmap-defined target id (e.g. `"clock"`, `"wikipedia"`, `"square"`). */ + id: string; + /** Human-readable display name from the trailmap manifest's `target.display_name`. */ + displayName?: string; + /** + * All Android/iOS app id candidates declared in the manifest's + * `target.platforms.<android|ios>.app_ids:` for this session's platform. Order is + * preserved from the manifest so `appIds[0]` is the canonical "first declared". + * Empty array when the target's current-platform section has no `app_ids:`. + */ + appIds: string[]; + /** + * Framework-resolved app id — picked at session start by intersecting [appIds] + * against the set of apps actually installed on the connected device. Undefined + * when no candidate was installed at session start (or when [appIds] is empty). + * Most well-configured trailmaps running on a populated device will have this set + * and authors should usually consume via [resolveAppId]. + */ + appId?: string; + /** + * Future: all web base URL candidates declared in the manifest's + * `target.platforms.web.base_urls:` (mirrors `app_ids:` for android/ios). + * + * Currently empty / undefined — the manifest schema field hasn't landed yet. + * The method [resolveBaseUrl] is wired and will start picking up real values + * once the framework starts emitting this data. Authors writing web tools + * today can call `resolveBaseUrl({ defaultBaseUrl: "..." })` and rely on the + * caller-default for now; future framework upgrades will transparently take + * over without source changes. + */ + baseUrls?: string[]; + /** + * Future: framework-resolved base URL — picked at session start. See [baseUrls] + * for the rollout status. + */ + resolvedBaseUrl?: string; + /** + * Resolves the Android/iOS app id to use, applying the priority: + * + * 1. `this.appId` (framework-resolved) — what callers will hit ~always + * in well-configured trailmaps running on a device with one of the candidates + * installed. + * 2. `this.appIds[0]` (first declared candidate) — fallback when the framework + * couldn't resolve anyone (e.g. session started before any candidate was + * installed). Lets the launch attempt at least try the canonical id. + * 3. `options.defaultAppId` (caller-supplied) — final fallback for non-target- + * aware contexts or targets with empty `app_ids:`. + * + * Returns `undefined` if all three layers miss. Authors typically check the + * return value and throw a tool-specific error so the failure mode is visible + * in trail logs. + * + * @example + * const appId = ctx.target?.resolveAppId({ defaultAppId: "com.example.app" }); + * if (!appId) throw new Error("Could not resolve app id from ctx.target."); + */ + resolveAppId(options?: { + defaultAppId?: string; + }): string | undefined; + /** + * Resolves the web base URL to use, applying the same priority shape as + * [resolveAppId] but reading from `this.resolvedBaseUrl` and `this.baseUrls`. + * + * Note: until the framework wires `target.platforms.web.base_urls:` into the + * trailmap manifest schema, the data layers are empty and this method falls + * through to `options.defaultBaseUrl` every time. Authors writing web tools + * today can rely on the caller-default; future framework upgrades will + * transparently start populating from the manifest without source changes. + * + * @example + * const baseUrl = ctx.target?.resolveBaseUrl({ defaultBaseUrl: "https://en.wikipedia.org" }); + * if (!baseUrl) throw new Error("Could not resolve base URL from ctx.target."); + */ + resolveBaseUrl(options?: { + defaultBaseUrl?: string; + }): string | undefined; +} +export interface TrailblazeContext { + /** + * Daemon HTTP base URL (e.g. `http://localhost:52525`). `client.callTool()` dispatches to + * `${baseUrl}/scripting/callback` on the host-subprocess path. Absent on the on-device + * bundle path — there's no HTTP server in the Android instrumentation process, and the + * SDK switches to the in-process binding instead (see [runtime]). + */ + baseUrl?: string; + /** + * Execution runtime tag. Present as `"ondevice"` when the tool is running inside the + * Android QuickJS bundle runtime (`:trailblaze-scripting-bundle` on the Kotlin side); + * absent on the subprocess / daemon path (where [baseUrl] carries the dispatch target). + * + * The SDK reads this to decide how `client.callTool(…)` dispatches: `"ondevice"` → + * in-process binding via `globalThis.__trailblazeCallback`; otherwise → HTTP fetch + * against [baseUrl]. Authors should rarely need to branch on this directly — the + * transport choice is the SDK's responsibility. + */ + runtime?: "ondevice"; + /** Opaque session id — use for log correlation only, never for security. */ + sessionId: string; + /** + * Per-tool-call identifier. Forward this verbatim on any subsequent callback request so the + * daemon can resolve the callback back to this invocation's live tool repo + execution + * context. Regenerated per call; do not cache across calls. + */ + invocationId: string; + device: TrailblazeDevice; + /** + * Resolved-target descriptor. Populated whenever the host session has a target + * configured (the trailmap manifest's `target:` block resolved against the connected + * device's installed apps) — both the MCP-subprocess path and the in-process + * QuickJS scripting path emit it. Absent for sessions with no target (web-only + * scratch tools, unit-test fixtures) and for envelopes from older daemons that + * predate the field. + * + * Optional-chain (`ctx.target?.resolveAppId(...)`) — authors writing scripted + * tools that should also work outside a target-aware session need to handle + * the undefined case. See [TrailblazeTarget] for the shape and the resolver + * methods. + */ + target?: TrailblazeTarget; + /** + * Per-tool-call agent memory surface. Reads consult the host's snapshot captured at + * envelope build time, plus any writes made earlier in this handler invocation + * (read-your-own-writes). Writes are buffered locally and flushed back to the host on + * a successful tool return via `_meta.trailblaze.memoryDelta`; a handler that throws + * produces no delta and the host's memory is left unchanged. See [TrailblazeMemory] + * for the full surface and [memory.ts] for the wire-shape rationale. + */ + memory: TrailblazeMemory; + /** + * Author-facing logger. Always present on the surface so scripted tools can write + * `ctx.logger.info("...")` without null-checking — `fromMeta` defaults to a no-op logger + * for paths that don't have a live MCP server (on-device QuickJS, unit tests). The + * subprocess tool-invocation handler in `registerPendingTools` replaces this with a + * server-backed logger that emits MCP `notifications/message` (routed by the host into + * `Console` — see `McpSubprocessSession.connect`) and mirrors to stderr as a fallback. + */ + logger: TrailblazeLogger; +} +/** + * Public author-facing result of a successful `callTool`. The author reads `textContent` and + * parses it however the target tool produces output. Named differently from the wire type + * ([CallToolResult]) so the wire's snake-case doesn't leak into the author's TS. + * + * `success` is redundant here — the client throws on any non-success response, so a value + * returned from `callTool(...)` is always `success: true`. Keeping the field exposed anyway so + * an author who reaches into the typed shape isn't surprised that it disappeared; costs nothing. + * + * `structuredContent` carries the tool's typed JSON return value when the producer populated + * one. Most authors never read this field directly — the public `client.tools.<name>(args)` + * proxy already unwraps it into the typed `result` declared in [TrailblazeToolMap]. It's + * exposed here for the rare consumer that drops down to the low-level `callTool` escape hatch + * (e.g. an SDK-internal site that needs both `textContent` and structured payload from the + * same response). + */ +export interface TrailblazeCallToolResult { + success: true; + textContent: string; + errorMessage: string; + structuredContent?: unknown; +} +/** + * Open type map of `tool name → { args; result }`. Empty by default; augmented by: + * + * - The vendored `built-in-tools.d.ts` shipped with this SDK (well-known framework tools + * like `tapOnElementWithText`, `inputText`). + * - Per-trailmap `.d.ts` files emitted by the framework's `WorkspaceClientDtsGenerator` + * (one entry per scripted tool declared in the trailmap's resolved target manifest). + * + * Augmentation pattern (declaration merging): + * + * ```ts + * declare module "@trailblaze/scripting" { + * interface TrailblazeToolMap { + * myScriptedTool: { args: { foo: string; bar?: number }; result: string }; + * } + * } + * ``` + * + * **`args` vs `result`.** `args` is the runtime-validated input shape (JSON-Schema-shaped + * properties — typed against the matchers the daemon dispatcher actually checks). + * `result` is the static-only typed return value — see the kdoc on + * [TrailblazeToolMethods] for the type lie this currently carries. + * + * A tool listed here lights up `client.tools.<name>(args)` with autocomplete on the name + * and type-checked args. Tools NOT listed are not reachable through the public client + * surface — the lower-level `callTool` dispatch primitive is hidden from the exported + * [TrailblazeClient] type so an author can't reintroduce an untyped escape hatch + * (`client.callTool("anything", {...})` no longer compiles). + * + * **Single authoring surface.** `client.tools.<name>(args)` is the only call style + * available to a `.ts` author. The runtime still dispatches everything through the + * internal `callTool` method that the `tools` Proxy delegates to, but the type isn't + * exposed publicly — every tool a trailmap can call must be declared in `TrailblazeToolMap`. + * + * **Multi-trailmap collision risk.** Within a single trailmap the codegen fails the build + * if two scripted tools share a name. Across trailmaps (a TS consumer that imports two trailmap + * roots' generated `.d.ts` files), TypeScript declaration merging will silently pick one + * shape for the colliding key — the static type passes, the runtime mismatches. Tool names + * MUST be globally unique across every trailmap a single consumer installs. There is no + * automated cross-trailmap enforcement today; conventions and code review carry the load until + * a multi-trailmap consumer demands one. + */ +export interface TrailblazeToolMap { +} +/** + * Method-style namespace derived from [TrailblazeToolMap]. Each augmented entry surfaces as + * a typed method — given + * `interface TrailblazeToolMap { inputText: { args: { text: string }; result: void } }`, + * the namespace exposes `inputText(args: { text: string }): Promise<void>`. + * + * This is the sole authoring surface a `.ts` tool file has to compose other Trailblaze + * tools: the IDE shows every available tool when you type `client.tools.`, hover gives + * JSDoc on both the name and the args, and a wrong-keyed/missing-field args object errors + * at compile time without any string-literal fiddling. + * + * **The `result` type matches the runtime value.** When the producer tool populates the + * wire's `structured_content` field (TS scripted tool whose handler returns a typed + * non-string value), the proxy unwraps that JSON value and returns it as `T[K]['result']`. + * When the producer doesn't (Kotlin tools that return text, legacy tools), the proxy + * returns `text_content` cast as `T[K]['result']` — correct when the declared `result` is + * `string` (the per-trailmap codegen default), and accepted-as-is when the declared `result` is + * `void` (the caller discards the return anyway). A producer that doesn't populate + * `structured_content` while the consumer's `TrailblazeToolMap` declares a non-string + * `result` is a static/runtime mismatch — surfaced as a typed string the consumer didn't + * expect, traceable to either a missing producer migration or a stale per-trailmap `.d.ts`. + * + * Tools not represented in the map (dynamically-registered, trailmaps without generated + * bindings) are unreachable from a typed `.ts` author — every tool a trailmap can call must be + * declared in `TrailblazeToolMap` via the SDK's vendored built-ins or per-trailmap codegen. + */ +export type TrailblazeToolMethods = { + [K in keyof TrailblazeToolMap]: K extends "web_evaluate" ? WebEvaluateMethod : (args: TrailblazeToolMap[K] extends { + args: infer A; + } ? A : never) => Promise<TrailblazeToolMap[K] extends { + result: infer R; + } ? R : never>; +}; +/** + * Function-overload shape for `client.tools.web_evaluate(...)`. Borrowed from Playwright + * Java's `Page.evaluate(pageFunction, args)` ergonomic — lets a Trailblaze trailmap author + * write a JS expression as a TypeScript arrow function (with type-checked args!) instead + * of hand-stringifying it into the `{ script: "..." }` wire shape the Kotlin tool actually + * consumes. + * + * Three call styles, all dispatch to the same `web_evaluate` Kotlin tool: + * + * 1. `web_evaluate(fn, ...args)` — the ergonomic shape. The Proxy calls + * `Function.prototype.toString()` on the arrow, JSON-serializes the args array, and + * emits `(<fnSrc>).apply(null, <argsJson>)` as the script payload. The function + * evaluates in the PAGE context (not the host runtime) with the deserialized args + * bound positionally. + * 2. `web_evaluate(script)` — bare string expression. Compatibility surface for authors + * who want full control over the script (e.g. multi-statement IIFE). + * 3. `web_evaluate({ script })` — the literal args-object shape that matches the Kotlin + * tool's wire contract directly. Useful when the script is computed dynamically and + * the caller already has it as a string field on a config object. + * + * **Closure caveat.** Functions cross the host→page boundary via `Function.prototype.toString()`, + * so closure variables from the calling scope DON'T survive serialization — pass them + * positionally via `...args` so they're JSON-encoded into the wire script. The function + * body must be self-contained (no Node-side imports, no references to outer-scope names). + * + * **Return type — type lie warning.** The function form preserves the inferred `TResult` + * at the typed surface, but the runtime always returns a string. Today's Kotlin + * `web_evaluate` populates `textContent` with the `toString()` of the JS result — + * primitives serialize as text (`"42"`, `"hi"`, `"true"`), objects collapse to + * `[object Object]`, arrays serialize as comma-joined elements. The Proxy returns that + * raw text verbatim; no JSON.parse heuristic is applied (a previous revision tried, but + * the heuristic corrupted legitimate string returns whose textual form happened to look + * like JSON literals — e.g. `"42"` would round-trip as the number `42`, breaking the + * declared string contract). Authors that need a typed value should `Number(...)` / + * `JSON.parse(...)` the result themselves, or wait for the structured-content path that + * populates `structured_content` from the Kotlin side. Until then, return shapes more + * complex than primitives need `JSON.stringify` on the page side and `JSON.parse` on + * the host. + */ +export type WebEvaluateMethod = { + <TArgs extends readonly unknown[], TResult>(fn: (...args: TArgs) => TResult | Promise<TResult>, ...args: TArgs): Promise<TResult>; + (script: string): Promise<string>; + (args: { + script: string; + }): Promise<string>; +}; +/** + * Internal client surface — includes the low-level `callTool(name, args)` dispatch + * primitive that the `tools` Proxy delegates to. File-local (no `export`) and not + * re-exported from `index.ts` so a downstream author can't name this interface and + * bypass the lockdown by typing a variable as `TrailblazeClientImpl`. The public + * [TrailblazeClient] type uses `Omit<..., "callTool">` against this interface in the + * same file; that's the only consumer that needs to see it. + */ +export interface TrailblazeClientImpl { + /** + * Dispatches Trailblaze tool [name] with [args] against the live Trailblaze session and + * returns the result. Internal — see [TrailblazeClient] for the public surface. + * + * **Typed args via [TrailblazeToolMap].** `name` is constrained to `keyof TrailblazeToolMap` + * (vendored built-ins + per-trailmap-generated entries); `args` must match the entry's `args` + * half (`TrailblazeToolMap[name]["args"]`). Wrong keys / missing required fields error at + * compile time. The return type stays `TrailblazeCallToolResult` here — `callTool` is the + * internal envelope-returning primitive that keeps `textContent` + `structuredContent` + * separate. The public [tools] namespace is where the typed `result` half is exposed — + * the Proxy unwraps the envelope internally (see [TrailblazeToolMethods] for the unwrap + * semantics). + * + * **Transports.** Picked automatically from the envelope — callers never branch on this: + * + * - **Host** (tool runs as a daemon-spawned subprocess): HTTP POST to + * `${ctx.baseUrl}/scripting/callback`. + * - **On-device** (tool runs inside the Android QuickJS bundle — `ctx.runtime === "ondevice"`): + * in-process `globalThis.__trailblazeCallback` binding. No HTTP server is involved. + * + * The request/response shape is identical across transports; only the framing differs. + * Error messages surface the transport source (HTTP URL or `__trailblazeCallback`) so you + * can tell at a glance which path failed. + * + * **Throws** on any non-success outcome: + * + * - **No envelope:** the outer tool invocation didn't carry `_meta.trailblaze`, so there's + * no session/invocation to attach the callback to. Typical cause: unit-testing the tool + * without a live Trailblaze session. Throw message includes a hint. + * - **No transport:** envelope present but neither `baseUrl` (HTTP) nor `runtime="ondevice"` + * + installed binding (in-process) is available. Rare — usually a host setup bug. + * - **HTTP non-2xx** (host only): protocol-level framing error (malformed request etc.). + * Throws with the daemon's body text for diagnosis. + * - **`JsScriptingCallbackResult.Error`:** invocation-unknown, session mismatch, version unsupported. + * Throws with the dispatcher's `message`. + * - **`JsScriptingCallbackResult.CallToolResult(success: false, ...)`:** tool ran but failed (tool + * threw, deserialization failed, dispatch timed out, reentrance cap hit). Throws with + * `errorMessage`. Authors who want to handle a tool's boolean "did it work" branching + * can wrap the call in `try/catch`; that's the one lowest-common-denominator surface + * that works identically for Python / QuickJS consumers later. + * + * **Shared state warning.** The dispatched inner tool runs against the same Trailblaze + * execution context as the outer tool — including the same AgentMemory, driver handle, and + * cached screen state. Authors MUST avoid read-then-write patterns across a tool-call + * boundary: + * + * ```ts + * // RACE — inner tool can mutate memory between the read and the write + * const prev = memory.get("x"); + * await client.tools.setFoo({...}); + * memory.put("x", updated(prev)); + * ``` + * + * The inner tool sees and can mutate any shared state (AgentMemory in particular is not + * concurrent-safe today). Serialize the access locally or avoid composed mutations when + * correctness matters. + */ + callTool<K extends keyof TrailblazeToolMap>(name: K, args: TrailblazeToolMap[K] extends { + args: infer A; + } ? A : never): Promise<TrailblazeCallToolResult>; + /** + * Method-style namespace — `client.tools.inputText({ text: "hi" })`. Each property is a + * typed method derived from a [TrailblazeToolMap] augmentation. `client.tools.<TAB>` in + * an IDE lists every known tool; mistype an arg key or miss a required field and `tsc` + * errors at compile time. See [TrailblazeToolMethods] for the type derivation. + * + * The runtime is a `Proxy` — any property access becomes a `callTool(propertyName, args)` + * dispatch. That means a tool not in the map (e.g. typed against an old SDK, or augmented + * by a bindings file the consumer hasn't pulled in yet) still dispatches at runtime; the + * static type just won't show it. + */ + tools: TrailblazeToolMethods; +} +/** + * Third handler argument on the imperative `trailblaze.tool(name, spec, handler)` signature + * (and reachable via `ctx.tools` on the typed `trailblaze.tool<I, O>(handler)` surface + * via [ToolContext]). Exposes the callback channel so tools can compose other Trailblaze + * tools. Always provided (never `undefined`) — when the envelope is missing, the client's + * preflight check still runs and throws a clear error instead of silently no-op'ing. + * + * **Surface narrowing.** `callTool` is hidden from the public type via `Omit` — `.ts` + * authors can only compose tools through `client.tools.<name>(args)`, which forces every + * call through a typed entry in [TrailblazeToolMap]. The runtime keeps `callTool` as the + * internal dispatch primitive the `tools` Proxy delegates to. + * + * **Type-only lockdown.** The narrowing is a compile-time guarantee, not a runtime one. + * At runtime, the object still carries `callTool` and the `tools` Proxy accepts any string + * property — `(client as unknown as Record<string, unknown>).callTool("anything", {...})` + * or `(client.tools as Record<string, unknown>)["anything"]` still dispatch. The lockdown + * exists to catch honest mistakes at `tsc` time, not to prevent a determined caller from + * bypassing it. Authorization / tool-availability boundaries live at the daemon (allowlist, + * selector validation, envelope checks), not at the SDK type layer. + */ +export type TrailblazeClient = Omit<TrailblazeClientImpl, "callTool">; +/** Screen-coordinate bounding rectangle. */ +export interface Bounds { + left: number; + top: number; + right: number; + bottom: number; +} +/** + * Lightweight identity + position record describing one match returned by the + * `findMatches` tool. + * + * Designed for scripted-tool authors who want to ask "is this element visible?", + * "is the selector unambiguous?", and "where is the match on screen?" without + * pulling the entire view subtree across the wire. The descriptor intentionally + * omits any reference to the matched node's children — carrying the subtree + * would defeat the snapshot-caching ROI, and opaque node handles would leak + * driver implementation details into the typed authoring surface. + * + * ## Bounds reuse + * + * Reuses [TrailblazeNode.Bounds] (`left` / `top` / `right` / `bottom` with + * computed `width` / `height` / `centerX` / `centerY`) rather than introducing + * a separate `Rect` type — every selector resolution path already speaks this + * shape, and the resolver hands back `TrailblazeNode` instances whose `bounds` + * field is the same type. + * + * ## Cross-driver field semantics + * + * - [matchedText] is the matched node's best-available text — per-driver + * `resolveText()` for Android/iOS/Compose, `ariaName` for Web. Null when the + * driver detail carried no text-shaped property. + * - [accessibilityId] is the accessibility-label / content-description / aria- + * descriptor on the matched node, when the driver exposes one. + * - [resourceId] is the Android `resourceId` (or its iOS / Compose / Web + * analogue: `accessibilityIdentifier`, Compose `testTag`, web `data-testid`) + * when the driver exposes one. + * + * Drivers that don't expose a given property leave the corresponding field + * null — scripted authors should not assume any field is populated. + */ +export interface MatchDescriptor { + /** + * Child-index path from the hierarchy root to this match. + * + * `[]` is the root, `[0, 2, 1, 4]` means "child 0 of root → child 2 → child 1 + * → child 4." Lets a caller re-identify a specific match against **the same + * captured tree** without re-running the selector. + * + * ## Lifetime — frame-scoped, not durable + * + * The path is positional, so it is only stable for the lifetime of one + * captured view-hierarchy snapshot. Any change to the tree shape between + * capture and use — siblings added or removed, a RecyclerView item recycled, + * a parent node re-mounting after a state change — invalidates the path: + * the same physical pixels are now reached by a different index sequence. + * + * Treat descriptors as "immediate hand-offs to act on in this tool body" + * rather than long-lived references. Re-querying via [findMatches] is the + * right pattern after any device-mutating action, even if the matched + * element is logically the same. For longer-lived identity, prefer + * [accessibilityId] / [resourceId] when the driver populates them. + */ + indexPath: number[]; + /** + * Bounding rectangle of the matched node, in device pixels. `null` when the + * driver couldn't compute bounds for the node (some Playwright nodes from + * the parsed ARIA tree lack DOM-bounds enrichment; some Compose nodes + * before first layout, etc.). Callers must treat `null` as "no coordinates + * available" rather than tapping the origin — defaulting an unknown bounds + * to `(0, 0, 0, 0)` would let a scripted tool accidentally tap the + * top-left corner of the screen. + */ + bounds?: Bounds | null; + /** + * Best-available text on the matched node, when the driver exposes one. + * Per-driver: `text ?: hintText ?: contentDescription` on Android, + * `text ?: hintText ?: accessibilityText` on iOS Maestro, `ariaName` on Web, + * etc. Null when the matched node carried no text-shaped property. + */ + matchedText?: string | null; + /** + * Accessibility label / content description on the matched node, when the + * driver exposes one. Maps to `contentDescription` on Android accessibility, + * `accessibilityText` on Android/iOS Maestro, `uniqueId` on iOS AXe, + * `contentDescription` on Compose, `ariaDescriptor` on Web. Null otherwise. + */ + accessibilityId?: string | null; + /** + * Stable identifier on the matched node, when the driver exposes one. Maps + * to `resourceId` on Android, `accessibilityIdentifier` on iOS, `testTag` on + * Compose, `data-testid` on Web. Null otherwise. + */ + resourceId?: string | null; +} +/** + * One recorded call from a [MockTrailblazeClient]. The runtime sees raw `string` / + * `Record<string, unknown>` for `tool`/`args` because the Proxy can't know which key in + * [TrailblazeToolMap] (if any) the property access was meant to resolve to — tests assert + * via name equality (`expect(client.calls[0].tool).toBe("web_navigate")`) rather than + * keyof-narrowing, so the loose runtime type is intentional. + */ +export interface MockCall { + tool: string; + args: Record<string, unknown>; +} +/** + * Canned response a test can register for a specific tool name. `errorMessage` mirrors the + * production [TrailblazeCallToolResult]'s field — supplying a non-empty value causes the + * mock to throw with the production client's `"tool failed: <message>"` wording so a tool + * under test that wraps its `client.tools.X(...)` call in `try/catch` exercises the same + * code path against the mock as against a live daemon. + * + * `structuredContent` carries the typed JSON payload a producer would set for a non-string + * `result` (TS scripted tool with `trailblaze.tool<I, O>(handler)`). When non-null, the + * mock client's `tools.<name>(args)` unwrap returns it verbatim as the typed `result` — + * matching the production [createClient]'s behavior so a test that asserts on the unwrapped + * value sees the same shape against the mock as it would against a live daemon. Leave + * undefined for tools whose declared `result` is `string` (the per-trailmap codegen default). + * + * **Three equivalent ways to say "no structured payload."** Omitting the field entirely, + * setting it to `undefined`, and setting it explicitly to `null` all collapse to the same + * "fall back to `textContent`" branch in the unwrap. The mock cannot distinguish them — + * matching production's `_unwrapToolResult`, which treats `undefined` and `null` identically + * via `!== undefined && !== null`. If a test wants to model an explicit wire-null vs an + * omitted-key for some future test scenario, it would need a different fixture (e.g., a raw + * envelope passed to `_unwrapToolResult`) rather than the stub API. + */ +export interface MockStubResponse { + textContent: string; + errorMessage?: string; + structuredContent?: unknown; +} +/** + * Mock client surface. Extends the public [TrailblazeClient] (so a tool's typed handler + * signature accepts it without a cast) and adds the test-only inspection / setup methods. + * + * `calls` is mutable so tests can splice / clear ad-hoc; `stub` and `reset` are the + * conventional entry points. + */ +export type MockTrailblazeClient = TrailblazeClient & { + /** + * Recorded calls in invocation order. A tool that fires `web_navigate` then + * `web_verifyTextVisible` ends up with two entries whose `tool` fields equal those + * names and whose `args` mirror what the tool passed in. + */ + calls: MockCall[]; + /** + * Register a canned response for [toolName]. Subsequent `client.tools[toolName](...)` + * calls return the stubbed shape (or throw with `errorMessage` when set, matching the + * production client's behavior on a `success: false` result). Stubs persist until + * [reset] is called. + */ + stub(toolName: string, response: MockStubResponse): void; + /** Clear both recorded calls and registered stubs. */ + reset(): void; +}; +/** + * Build a mock [TrailblazeClient] that records every `client.tools.<name>(args)` invocation + * into `calls` and returns either the default success response or a per-tool stub registered + * via [MockTrailblazeClient.stub]. + * + * The default response is `{ success: true, textContent: "", errorMessage: "" }` — matches + * what the daemon returns when a tool completes without a body, the most common case authors + * hit in `await`-and-discard composition. + */ +export declare function createMockClient(): MockTrailblazeClient; +/** + * Options accepted by [createMockContext]. Every field has a sensible default so a test + * that only cares about platform can write `createMockContext({ platform: "web" })`. + * + * `runtime: "host"` resolves to `undefined` on the produced context (matching the + * production envelope's convention — `runtime` is only emitted on the on-device path). + * `runtime: "ondevice"` passes through verbatim. + */ +export interface CreateMockContextOptions { + platform: TrailblazeDevice["platform"]; + sessionId?: string; + invocationId?: string; + baseUrl?: string; + runtime?: "host" | "ondevice"; + device?: { + widthPixels?: number; + heightPixels?: number; + driverType?: string; + }; + target?: TrailblazeTarget; + memory?: Record<string, unknown>; +} +/** + * Build a [TrailblazeContext] with test-friendly defaults. Use as the second argument when + * invoking a scripted tool handler from a unit test. + * + * Defaults pick values that won't accidentally collide with anything a tool reads — IDs + * are deterministic strings, device dimensions are a non-zero placeholder, driver type is + * a clearly-marked test sentinel. + */ +/** + * Test client surface for scenarios that need sequenced, per-call responses from + * `findMatches` — different from [createMockClient]'s single-static-stub-per-tool model. + * + * Built for `ConditionalAction` + `captureViewHierarchy` tests, where a flow typically + * needs distinct match sets across the initial snapshot and the post-action verify + * snapshot (or per-selector). The same primitive is useful for future waypoint detection + * tests that need to model a moving UI across multiple `findMatches` callbacks. + * + * `calls` records every dispatched tool name + args in insertion order (mirrors + * [createMockClient]). `queueFindMatches(responses)` appends to the queue; each + * `findMatches` callback dequeues the next response. Non-`findMatches` tools resolve to + * `""` (mirrors the production `textContent: ""` happy-path default). + * + * Queue exhaustion is loud — if `findMatches` is called more times than the test queued + * responses, the dispatcher throws with the offending args so the test failure points at + * the unexpected dispatch. + */ +export interface QueuedFindMatchesClient extends TrailblazeClient { + calls: Array<{ + tool: string; + args: Record<string, unknown>; + }>; + queueFindMatches(responses: Array<MatchDescriptor[]>): void; +} +/** + * Build a [QueuedFindMatchesClient]. The minimal `TrailblazeClient` surface plus a queue + * for `findMatches` responses — see [QueuedFindMatchesClient] for the semantics. + * + * Use for any test that exercises multi-call `findMatches` flows (catalog-driven + * conditional actions, multi-snapshot verify refreshes, waypoint detection iterations). + * The [createMockClient] mock is simpler when each tool is called at most once per test. + */ +export declare function createQueuedFindMatchesClient(): QueuedFindMatchesClient; +export declare function createMockContext(opts: CreateMockContextOptions): TrailblazeContext; + +export {}; diff --git a/examples/wikipedia/trails/.trailblaze/sdk/dist/testing.js b/examples/wikipedia/trails/.trailblaze/sdk/dist/testing.js new file mode 100644 index 000000000..b52c2832d --- /dev/null +++ b/examples/wikipedia/trails/.trailblaze/sdk/dist/testing.js @@ -0,0 +1,206 @@ +const mockNoopLogger = { + debug: () => { + }, + info: () => { + }, + warn: () => { + }, + error: () => { + } +}; +function createMockMemory(snapshot) { + const map = /* @__PURE__ */ new Map(); + if (snapshot) { + for (const [k, v] of Object.entries(snapshot)) { + if (typeof v === "string") map.set(k, v); + } + } + const get = (key) => map.get(key); + const memory = { + get, + set(key, value) { + map.set(key, value); + }, + has(key) { + return map.has(key); + }, + keys() { + return [...map.keys()]; + }, + delete(key) { + map.delete(key); + }, + interpolate(template) { + let result = template; + for (const re of [/\$\{([^}]+)\}/g, /\{\{([^}]+)\}\}/g]) { + result = result.replace(re, (_match, name) => get(name) ?? ""); + } + return result; + }, + setJson(key, value) { + map.set(key, JSON.stringify(value)); + }, + getJson(key) { + const raw = map.get(key); + if (raw === void 0) return void 0; + try { + return JSON.parse(raw); + } catch { + return void 0; + } + }, + toJSON() { + return Object.fromEntries(map); + } + }; + return memory; +} +function createMockClient() { + const calls = []; + const stubs = /* @__PURE__ */ new Map(); + const dispatch = async (name, args) => { + calls.push({ tool: name, args }); + const stub = stubs.get(name); + if (stub && stub.errorMessage && stub.errorMessage.length > 0) { + throw new Error( + `trailblaze.client.callTool("${name}") tool failed: ${stub.errorMessage}` + ); + } + return { + success: true, + textContent: stub?.textContent ?? "", + errorMessage: "", + structuredContent: stub?.structuredContent + }; + }; + const tools = createMockToolsProxy(dispatch); + const mock = { + tools, + calls, + stub(toolName, response) { + if (toolName.trim() === "") { + throw new Error( + "createMockClient: stub() tool name must not be empty or whitespace-only." + ); + } + stubs.set(toolName, response); + }, + reset() { + calls.length = 0; + stubs.clear(); + } + }; + return mock; +} +const MOCK_TOOLS_PROXY_RESERVED_PROPS = /* @__PURE__ */ new Set([ + "then", + "catch", + "finally", + "constructor", + "prototype", + "__proto__", + "toString", + "valueOf", + "toJSON" +]); +const MOCK_SCRIPT_OVERLOAD_TOOLS = /* @__PURE__ */ new Set(["web_evaluate"]); +function mockBuildScriptOverloadArgs(toolName, firstArg, rest) { + if (typeof firstArg === "function") { + const fnSrc = firstArg.toString(); + const argsJson = JSON.stringify(rest); + return { script: `(${fnSrc}).apply(null, ${argsJson})` }; + } + if (typeof firstArg === "string") { + return { script: firstArg }; + } + if (firstArg !== null && typeof firstArg === "object") { + return firstArg; + } + throw new Error( + `mockClient.tools.${toolName}: expected a function, script string, or { script } object as the first argument; got ${firstArg === null ? "null" : typeof firstArg}.` + ); +} +function createMockToolsProxy(dispatch) { + return new Proxy({}, { + get(_target, prop, _receiver) { + if (typeof prop !== "string") return void 0; + if (MOCK_TOOLS_PROXY_RESERVED_PROPS.has(prop)) return void 0; + if (prop.trim() === "") { + throw new Error( + `mockClient.tools[${JSON.stringify(prop)}]: tool name must not be empty or whitespace-only.` + ); + } + if (MOCK_SCRIPT_OVERLOAD_TOOLS.has(prop)) { + const toolName = prop; + return async (firstArg, ...rest) => { + const args = mockBuildScriptOverloadArgs(toolName, firstArg, rest); + const envelope = await dispatch(toolName, args); + return mockUnwrapToolResult(envelope); + }; + } + return async (args) => { + const envelope = await dispatch(prop, args ?? {}); + return mockUnwrapToolResult(envelope); + }; + } + }); +} +function mockUnwrapToolResult(envelope) { + if (envelope.structuredContent !== void 0 && envelope.structuredContent !== null) { + return envelope.structuredContent; + } + return envelope.textContent; +} +function createQueuedFindMatchesClient() { + const calls = []; + const findMatchesQueue = []; + const dispatch = (name, args) => { + calls.push({ tool: name, args }); + if (name === "findMatches") { + if (findMatchesQueue.length === 0) { + throw new Error( + `createQueuedFindMatchesClient: no more findMatches responses queued; received call with args=${JSON.stringify(args)}. Did the test forget a queueFindMatches?` + ); + } + return findMatchesQueue.shift(); + } + return ""; + }; + const tools = new Proxy({}, { + get(_target, prop, _receiver) { + if (typeof prop !== "string") return void 0; + if (prop === "then" || prop === "catch" || prop === "finally") return void 0; + return async (args) => dispatch(prop, args ?? {}); + } + }); + return { + tools, + calls, + queueFindMatches(responses) { + findMatchesQueue.push(...responses); + } + }; +} +function createMockContext(opts) { + const device = { + platform: opts.platform, + widthPixels: opts.device?.widthPixels ?? 1080, + heightPixels: opts.device?.heightPixels ?? 2400, + driverType: opts.device?.driverType ?? "mock-driver" + }; + return { + baseUrl: opts.baseUrl, + runtime: opts.runtime === "ondevice" ? "ondevice" : void 0, + sessionId: opts.sessionId ?? "mock-session", + invocationId: opts.invocationId ?? "mock-invocation", + device, + target: opts.target, + memory: createMockMemory(opts.memory), + logger: mockNoopLogger + }; +} +export { + createMockClient, + createMockContext, + createQueuedFindMatchesClient +}; diff --git a/examples/wikipedia/trails/config/dist/.bundle.hash b/examples/wikipedia/trails/config/dist/.bundle.hash new file mode 100644 index 000000000..7b5c2b21c --- /dev/null +++ b/examples/wikipedia/trails/config/dist/.bundle.hash @@ -0,0 +1 @@ +8ece57da1ed9ffdfbe4eafb36852a81d6b93e4c5a6f95dcf42bf140c04184b8e \ No newline at end of file diff --git a/examples/wikipedia/trails/config/dist/.bundle.lock b/examples/wikipedia/trails/config/dist/.bundle.lock new file mode 100644 index 000000000..e69de29bb diff --git a/examples/wikipedia/trails/config/dist/targets/wikipedia.yaml b/examples/wikipedia/trails/config/dist/targets/wikipedia.yaml new file mode 100644 index 000000000..dfdbae769 --- /dev/null +++ b/examples/wikipedia/trails/config/dist/targets/wikipedia.yaml @@ -0,0 +1,303 @@ +# GENERATED BY trailblaze check. DO NOT EDIT. +# Source trailmap: trailmaps/wikipedia/trailmap.yaml +# Regenerate with: trailblaze check + +id: "wikipedia" +display_name: "Wikipedia (en)" +platforms: + "web": + tool_sets: + - "web_core" + - "web_verification" + - "memory" + drivers: + - "playwright-native" + - "playwright-electron" +system_prompt: "# Wikipedia target system prompt\n\n**You are controlling a Playwright-driven\ + \ web browser on\n{{device_description}}, driving live `en.wikipedia.org`.**\n\n\ + You'll be given the current screen state — a text representation of the\nDOM hierarchy\ + \ plus a screenshot of the rendered viewport. Screenshots may\nbe marked with colored\ + \ boxes containing `ref` ids for interactive elements.\n\n## UI interaction hints\n\ + \n- Wikipedia's main page regenerates daily. Section *wrappers* (`#mp-tfa`,\n `#mp-itn`,\ + \ `#mp-dyk`, `#mp-otd`) are stable; section *headings* drift\n copy day-to-day.\ + \ Prefer the wrapper anchors over visible heading text.\n- The header search box\ + \ has `name=\"search\"` on its input element. Both\n Vector-2022 and the legacy\ + \ skin keep this attribute, so a CSS selector\n on `input[name='search']` is more\ + \ reliable than ARIA-role matching.\n- Article first heading is `#firstHeading`.\ + \ Body wrapper is\n `#mw-content-text`. Use these structural anchors when verifying\n\ + \ article-shaped pages.\n- A fundraising banner may or may not be present on any\ + \ given visit; do\n **not** assume its presence. Use the `wikipedia_web_dismissBannerIfPresent`\n\ + \ tool, which no-ops cleanly when nothing is shown.\n\n## Special tools — always\ + \ prefer these for the listed tasks\n\nThis target ships scripted helpers that encode\ + \ Wikipedia-specific\nselector knowledge and conditional UI handling. Pick them\ + \ over generic\n`web_*` builtins for the following task families:\n\n- **\"Open\ + \ Wikipedia\" / \"go to Wikipedia main page\" / \"start from\n Wikipedia\"** →\ + \ `wikipedia_web_openMainPage`.\n Loads `Main_Page`, verifies render, dismisses\ + \ any fundraising banner.\n- **\"Open the X article\" / \"read the Y page on Wikipedia\"\ + \ / \"navigate\n to the Z Wikipedia article\"** → `wikipedia_web_openArticle` with\ + \ the\n article title (`title: \"Albert Einstein\"`).\n Handles URL encoding +\ + \ verifies `#firstHeading`.\n- **\"Search Wikipedia for X\" / \"look up Y on Wikipedia\"\ + \ / \"find articles\n about Z\"** → `wikipedia_web_searchAndOpenFirstResult` with\ + \ the query.\n Types into header search, submits, asserts the destination article.\n\ + - **\"Open a random Wikipedia article\" / \"jump to a random page\" /\n \"click\ + \ Random article\"** → `wikipedia_web_openRandomArticle`.\n Asserts a new article-shaped\ + \ page loaded (#firstHeading visible).\n- **\"Verify the [Did you know / In the\ + \ news / Today's featured article /\n On this day] section is visible\"** → `wikipedia_web_openMainPageSection`\n\ + \ with the short code (`section: dyk` / `itn` / `tfa` / `otd`).\n Anchors on `#mp-<id>`\ + \ so daily copy drift can't break the test.\n- **\"Switch to Spanish / view in another\ + \ language / read the German\n version\"** → `wikipedia_web_switchArticleLanguage`\ + \ with the title +\n `languageCode` (`es` / `fr` / `de` / …).\n Jumps to the matching\ + \ subdomain directly, bypassing the per-skin\n language picker.\n- **\"Verify the\ + \ article is well-formed\" / \"confirm an article rendered\"\n / \"make sure the\ + \ page has body content and References\"** →\n `wikipedia_web_verifyArticleStructure`.\n\ + \ Asserts heading + body + (optional) References scroll.\n- **\"Search for X and\ + \ verify the article\" / \"look up Y and confirm it\n rendered correctly\"** →\ + \ `wikipedia_web_searchAndVerify` with the query\n (and `requireReferences: true`\ + \ if the task explicitly asks for a\n References-section check). Composes `searchAndOpenFirstResult`\ + \ +\n `verifyArticleStructure` into a single call so the agent doesn't have\n \ + \ to chain them itself.\n- **\"Close the banner\" / \"dismiss the donate prompt\"\ + \ / \"clear the\n fundraiser popup\"** → `wikipedia_web_dismissBannerIfPresent`.\n\ + \ No-op when no banner is showing; safe to call unconditionally.\n\nFor everything\ + \ else — clicking a link in an article, scrolling, filling\na non-search form field,\ + \ asserting visible text by snippet — use the\nbuilt-in `web_*` tools (`web_click`,\ + \ `web_scroll`, `web_type`,\n`web_verifyTextVisible`, etc.). The scripted tools\ + \ above are the\n**only** ones you should reach for when the task matches one of\ + \ those\npatterns; they encode behavior the LLM would otherwise have to\nre-derive\ + \ from snapshot + heuristics on every run.\n\n## Pass scripted-tool arguments explicitly\n\ + \n`inputSchema` fields are marked `required: false` where the tool has a\nuseful\ + \ default, but the MCP runtime currently enforces a present-key\ncontract on every\ + \ property. Pass every argument explicitly when calling\na scripted tool — e.g.\ + \ include `dismissBanner: true`, `ensureOnMainPage:\ntrue`, `requireReferences:\ + \ true` on the defaults rather than omitting\nthem.\n\n## Verification preferences\n\ + \n- When verifying a Wikipedia article, anchor on `#firstHeading` (via\n `web_verifyElementVisible`)\ + \ **before** any text-content checks. The\n text checks can otherwise false-positive\ + \ on search-results snippets\n or sidebar entries that happen to repeat the title.\n\ + - When verifying a main-page section, anchor on `#mp-<id>` (via the\n scripted\ + \ `wikipedia_web_openMainPageSection` tool). The heading text\n is unreliable across\ + \ daily content refreshes.\n" +tools: +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_openMainPage.ts" + name: "wikipedia_web_openMainPage" + description: "Open Wikipedia's Main_Page. Use this when the task asks to navigate\ + \ to\nWikipedia, open Wikipedia, go to the Wikipedia home page, or start from\n\ + the main Wikipedia page. Loads en.wikipedia.org/wiki/Main_Page and waits\nfor\ + \ it to render. Optionally dismisses any fundraising banner that's\ncurrently\ + \ showing so subsequent steps don't have to reason about it." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "dismissBanner": + "type": "boolean" + "description": "When true (default), tries to close any visible fundraising\ + \ banner." + "additionalProperties": false + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_openArticle.ts" + name: "wikipedia_web_openArticle" + description: "Open a specific Wikipedia article by its title. Use this whenever\ + \ the task\nis to read, open, navigate to, or view a particular Wikipedia article\ + \ —\ne.g. \"open the Albert Einstein article\", \"go to the Python (programming\n\ + language) page\", \"navigate to the Shakespeare article\". Spaces in the\ntitle\ + \ are normalized to underscores (Wikipedia's URL convention) so you\ncan pass\ + \ the title verbatim. Verifies the article rendered by checking\nthe #firstHeading\ + \ element is visible." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "title": + "type": "string" + "description": "Article title to open (spaces → underscores in URL)." + "expectedHeading": + "type": "string" + "description": "Visible heading text to assert. Defaults to `title`." + "dismissBanner": + "type": "boolean" + "description": "When true (default), tries to close any visible fundraising\ + \ banner." + "additionalProperties": false + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_dismissBannerIfPresent.ts" + name: "wikipedia_web_dismissBannerIfPresent" + description: "Dismiss any visible Wikipedia fundraising / fundraiser banner. Use\ + \ this\nwhenever the task is to close a banner, dismiss a popup, or clear out\n\ + Wikipedia's donate prompt. If no banner is currently visible the tool is\na no-op\ + \ that returns successfully, so it's safe to call unconditionally\nat the start\ + \ of a flow. Probes with a sub-second visibility check before\nattempting the\ + \ click so the no-banner path is near-instant." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "additionalProperties": false + "description": "Input args for `wikipedia_web_dismissBannerIfPresent` — empty,\ + \ the tool takes no parameters." + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_searchAndOpenFirstResult.ts" + name: "wikipedia_web_searchAndOpenFirstResult" + description: "Search Wikipedia from the header search box. Use this whenever the\ + \ task\nis to search Wikipedia for something — e.g. \"search for Albert Einstein\"\ + ,\n\"look up Python on Wikipedia\", \"find articles about Mount Everest\". Types\n\ + the query into the header search input, submits the form, and verifies\nthe resulting\ + \ article's first heading. Pass `openFirstResult=false` to\nonly type the query\ + \ without submitting (useful for autocomplete-suggestion\ntests)." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "query": + "type": "string" + "description": "Query to type into the search box." + "expectedHeading": + "type": "string" + "description": "Heading text to assert on the opened article. Defaults to\ + \ `query`." + "openFirstResult": + "type": "boolean" + "description": "Submit the search form (default true)." + "additionalProperties": false + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_openRandomArticle.ts" + name: "wikipedia_web_openRandomArticle" + description: "Open a random Wikipedia article via the sidebar's \"Random article\"\ + \ link.\nUse this whenever the task is to navigate to a random article, click\n\ + Random article, jump to a random page, or surf to an unpredictable\narticle. Verifies\ + \ that a new article page rendered (its #firstHeading\nis visible) — the resulting\ + \ title is non-deterministic so don't try to\nassert specific heading text afterwards." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "ensureOnWikipedia": + "type": "boolean" + "description": "Open the main page first if not on Wikipedia." + "additionalProperties": false + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_verifyArticleStructure.ts" + name: "wikipedia_web_verifyArticleStructure" + description: "Verify the currently loaded page is a well-formed Wikipedia article.\ + \ Use\nthis whenever the task is to verify an article's structure or layout —\n\ + confirm a Wikipedia article rendered, check that an article has body\ncontent,\ + \ confirm it has a References section, or sanity-check that\nnavigation actually\ + \ landed on an article (not a search-results or\ndisambiguation page). Asserts\ + \ #firstHeading is visible, the body wrapper\nis visible, and optionally scrolls\ + \ to confirm the \"References\" section\nis present." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "expectedHeading": + "type": "string" + "description": "Visible text to assert in #firstHeading." + "requireReferences": + "type": "boolean" + "description": "Scroll-to-bottom + assert References heading (default true)." + "additionalProperties": false + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_openMainPageSection.ts" + name: "wikipedia_web_openMainPageSection" + description: "Verify one of Wikipedia's four Main_Page sections is present and visible.\n\ + Use this whenever the task is to verify a main-page section: \"Did you\nknow\"\ + , \"In the news\", \"On this day\", or \"From today's featured article\"\n(also\ + \ known as DYK, ITN, OTD, TFA). Pass the section short code to pick\nwhich one.\ + \ The tool anchors verification on the section's stable wrapper\nelement id (`#mp-dyk`\ + \ etc.) — which survives Wikipedia's day-to-day copy\ndrift — rather than the\ + \ visible heading text (which rotates daily)." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "section": + "type": "string" + "description": "Section short code: tfa | itn | dyk | otd." + "ensureOnMainPage": + "type": "boolean" + "description": "Open Main_Page first if not there (default true)." + "additionalProperties": false + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_switchArticleLanguage.ts" + name: "wikipedia_web_switchArticleLanguage" + description: "Open the same Wikipedia article in a different language. Use this\n\ + whenever the task is to switch language, view in another language, or\nread the\ + \ Spanish/French/German/Japanese/etc. version of a Wikipedia\narticle. Routes\ + \ directly to the matching language subdomain\n(`es.wikipedia.org`, `fr.wikipedia.org`,\ + \ …) rather than driving through\nthe in-page language picker (which varies a\ + \ lot across skins). Verifies\nthe destination article's first heading is visible." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "title": + "type": "string" + "description": "English article title." + "languageCode": + "type": "string" + "description": "Wikipedia language code (`es`, `fr`, `zh-min-nan`, …)." + "expectedHeading": + "type": "string" + "description": "Visible heading text in the localized article." + "additionalProperties": false + "definitions": {} +- script: "/Users/samedwards/Development/trailblaze/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/wikipedia_web_searchAndVerify.ts" + name: "wikipedia_web_searchAndVerify" + description: "Search Wikipedia for a topic AND verify the resulting article is\n\ + well-formed — heading + body, optionally References — in a single tool\ncall.\ + \ Use this whenever the task combines \"search for X\" with \"verify\nthe article\ + \ rendered correctly\", e.g. \"search Wikipedia for Python and\nconfirm the article\ + \ loaded with a body and References section\". Composes\nthe existing `wikipedia_web_searchAndOpenFirstResult`\ + \ and\n`wikipedia_web_verifyArticleStructure` tools so callers get both behaviors\n\ + with one round-trip." + _meta: + "trailblaze/supportedPlatforms": + - "web" + "trailblaze/requiresContext": true + inputSchema: + "$schema": "http://json-schema.org/draft-07/schema#" + "type": "object" + "properties": + "query": + "type": "string" + "description": "Query to type into the header search box." + "expectedHeading": + "type": "string" + "description": "Heading text to assert on the opened article. Defaults to\ + \ `query`, which works for exact-match articles like \"Python (programming\ + \ language)\"." + "requireReferences": + "type": "boolean" + "description": "Whether to also scroll-and-assert the References section is\ + \ present. Defaults to false because not every article has one." + "additionalProperties": false + "definitions": {} diff --git a/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/trailblaze-client.d.ts b/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/trailblaze-client.d.ts index 6123fec27..b8b83cfcd 100644 --- a/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/trailblaze-client.d.ts +++ b/examples/wikipedia/trails/config/trailmaps/wikipedia/tools/trailblaze-client.d.ts @@ -18,6 +18,36 @@ declare module "@trailblaze/scripting" { result: string; }; + /** + * Grants an Android AppOps permission to the specified app via `appops set <appId> <op> allow`. Use for the privileged-operation class — MANAGE_EXTERNAL_STORAGE, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, WRITE_SETTINGS, ACCESS_NOTIFICATIONS, PICTURE_IN_PICTURE. For standard `dangerous` runtime permissions (CAMERA, BLUETOOTH_CONNECT, etc.) use `android_grantPermission` instead — the two mechanisms aren't interchangeable. + * + * @trailblazeHiddenFromLlm + */ + android_grantAppOpsPermission: { + args: { + /** The Android package id of the target app (e.g. `com.example.app`). */ + appId: string; + /** The AppOps operation name to grant (e.g. `MANAGE_EXTERNAL_STORAGE`, `SYSTEM_ALERT_WINDOW`, `REQUEST_INSTALL_PACKAGES`). The op is the bare AppOps name, NOT the `android.permission.*` form — `appops set` rejects the prefixed form. See `android.app.AppOpsManager` for the full op enumeration. */ + permission: string; + }; + result: string; + }; + + /** + * Grants a standard Android runtime (dangerous) permission to the specified app via `pm grant`. Use BEFORE launching the app to suppress the OS permission dialog. For AppOps-class permissions (MANAGE_EXTERNAL_STORAGE, SYSTEM_ALERT_WINDOW, etc.) use `android_grantAppOpsPermission` instead. + * + * @trailblazeHiddenFromLlm + */ + android_grantPermission: { + args: { + /** The Android package id of the target app (e.g. `com.example.app`). */ + appId: string; + /** The fully-qualified Android permission to grant (e.g. `android.permission.CAMERA`, `android.permission.BLUETOOTH_CONNECT`). Must be a `protectionLevel="dangerous"` runtime permission declared in the target's manifest — otherwise `pm grant` no-ops and the tool still returns success (matches the executor's permissive-superset contract). */ + permission: string; + }; + result: string; + }; + /** * Sends a broadcast intent to the connected Android device. * diff --git a/trailblaze-playwright/src/main/java/xyz/block/trailblaze/playwright/PlaywrightScreenState.kt b/trailblaze-playwright/src/main/java/xyz/block/trailblaze/playwright/PlaywrightScreenState.kt index 5450469ed..011a529f0 100644 --- a/trailblaze-playwright/src/main/java/xyz/block/trailblaze/playwright/PlaywrightScreenState.kt +++ b/trailblaze-playwright/src/main/java/xyz/block/trailblaze/playwright/PlaywrightScreenState.kt @@ -1057,18 +1057,46 @@ class PlaywrightScreenState( * Populates [ViewHierarchyTreeNode.centerPoint] and [ViewHierarchyTreeNode.dimensions] so * the UI Inspector's hover overlay can highlight elements on the screenshot. */ + /** + * Tracks whether we've already logged the budget-exceeded warning for THIS screen-state + * instance. Per-instance (not companion-level) so each state capture gets one warning; + * a session that traverses several Wikipedia-class pages logs once per page rather than + * once globally. + */ + private var enrichmentBudgetExceededLogged = false + private fun enrichViewHierarchyWithBounds( tree: ViewHierarchyTreeNode, ): ViewHierarchyTreeNode { // Build ARIA descriptor occurrence counts to disambiguate duplicate elements val descriptorOccurrences = mutableMapOf<String, Int>() - return enrichNodeWithLocatorBounds(tree, descriptorOccurrences) + val deadlineMs = System.currentTimeMillis() + ENRICHMENT_BUDGET_MS + return enrichNodeWithLocatorBounds(tree, descriptorOccurrences, deadlineMs) } private fun enrichNodeWithLocatorBounds( node: ViewHierarchyTreeNode, descriptorOccurrences: MutableMap<String, Int>, + deadlineMs: Long, ): ViewHierarchyTreeNode { + // Bail out of every Playwright RPC once we've blown the wall-clock budget. Returning + // the unenriched subtree preserves the structural shape for the timeline-viewer + // inspector overlay — bounds may be missing for some nodes, but `boundingBox != null` + // is already a tolerated state at the consumer side (see line 1098 below). The + // alternative — letting the recursion run to completion — locks the next tool's + // pre-action log path for many minutes on content-heavy pages. Log once per affected + // screen-state so future "missing bounds" investigations have a greppable anchor. + if (System.currentTimeMillis() > deadlineMs) { + if (!enrichmentBudgetExceededLogged) { + Console.log( + "[PlaywrightScreenState] viewHierarchy enrichment budget (${ENRICHMENT_BUDGET_MS}ms) " + + "exceeded — returning partial bounds for remaining nodes." + ) + enrichmentBudgetExceededLogged = true + } + return node + } + val role = node.className ?: "generic" val name = node.text @@ -1106,9 +1134,10 @@ class PlaywrightScreenState( // Resolution failed — leave without bounds } - // Enrich children recursively + // Enrich children recursively, threading the same deadline so the whole tree's + // enrichment shares one wall-clock budget (not a per-node budget). val enrichedChildren = node.children.map { child -> - enrichNodeWithLocatorBounds(child, descriptorOccurrences) + enrichNodeWithLocatorBounds(child, descriptorOccurrences, deadlineMs) } return if (bLeft != null && bTop != null && bRight != null && bBottom != null) { @@ -1193,6 +1222,26 @@ class PlaywrightScreenState( /** Maximum number of hidden CSS-targetable elements to surface to the LLM. */ private const val MAX_HIDDEN_CSS_ELEMENTS = 50 + /** + * Wall-clock cap on per-screen-state `viewHierarchy` enrichment. + * + * `enrichViewHierarchyWithBounds` issues one synchronous Playwright `Locator.count()` + + * `boundingBox()` RPC per node in the ARIA tree. On a typical app page (a few hundred + * nodes at ~100 ms/RPC) that finishes in a few seconds; on a content-heavy page + * (Wikipedia article, ~thousands of nodes) the serial RPC traffic stretches into many + * minutes and wedges the next tool's pre-action diagnostic log path. + * + * 5 s comfortably covers the normal case; pages that blow the budget bail out and + * ship partial bounds rather than locking the agent loop. Downstream consumers + * already tolerate `bounds == null` (see `boundingBox != null` check around line + * 1098), so the contract is preserved. + * + * Caught in the field by a Wikipedia trail hanging for 10+ minutes on every CI run — + * thread dump pinned the wedge inside `LocatorImpl.count()` called from + * `enrichNodeWithLocatorBounds` in tight recursion across a ~thousand-node tree. + */ + private const val ENRICHMENT_BUDGET_MS = 5_000L + /** Pattern matching element ID references like [e42] in compact element list text. */ private val ELEMENT_ID_PATTERN = Regex("""\[e(\d+)]""")